@tiangong-ai/cli 0.0.32 → 0.0.34
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/AGENTS.md +7 -2
- package/README.md +72 -19
- package/dist/research/commands.js +58 -1
- package/dist/research/commands.js.map +1 -1
- package/dist/research/orchestration.js +388 -31
- package/dist/research/orchestration.js.map +1 -1
- package/dist/research/workspace/acquisition.d.ts +71 -0
- package/dist/research/workspace/acquisition.js +593 -0
- package/dist/research/workspace/acquisition.js.map +1 -0
- package/dist/research/workspace/artifacts.d.ts +43 -0
- package/dist/research/workspace/artifacts.js +544 -0
- package/dist/research/workspace/artifacts.js.map +1 -0
- package/dist/research/workspace/broker.js +265 -56
- package/dist/research/workspace/broker.js.map +1 -1
- package/dist/research/workspace/constants.d.ts +1 -0
- package/dist/research/workspace/constants.js +4 -2
- package/dist/research/workspace/constants.js.map +1 -1
- package/dist/research/workspace/context.js +106 -11
- package/dist/research/workspace/context.js.map +1 -1
- package/dist/research/workspace/discovery-planning.d.ts +25 -0
- package/dist/research/workspace/discovery-planning.js +106 -0
- package/dist/research/workspace/discovery-planning.js.map +1 -0
- package/dist/research/workspace/discovery-status.d.ts +46 -0
- package/dist/research/workspace/discovery-status.js +183 -0
- package/dist/research/workspace/discovery-status.js.map +1 -0
- package/dist/research/workspace/discovery.d.ts +25 -0
- package/dist/research/workspace/discovery.js +268 -0
- package/dist/research/workspace/discovery.js.map +1 -0
- package/dist/research/workspace/downloads.d.ts +76 -0
- package/dist/research/workspace/downloads.js +274 -0
- package/dist/research/workspace/downloads.js.map +1 -0
- package/dist/research/workspace/evidence-ledger.d.ts +52 -0
- package/dist/research/workspace/evidence-ledger.js +487 -0
- package/dist/research/workspace/evidence-ledger.js.map +1 -0
- package/dist/research/workspace/evidence.d.ts +1 -0
- package/dist/research/workspace/evidence.js +2 -0
- package/dist/research/workspace/evidence.js.map +1 -1
- package/dist/research/workspace/input-plan.js +4 -0
- package/dist/research/workspace/input-plan.js.map +1 -1
- package/dist/research/workspace/native-activity.d.ts +65 -0
- package/dist/research/workspace/native-activity.js +153 -0
- package/dist/research/workspace/native-activity.js.map +1 -0
- package/dist/research/workspace/preflight.d.ts +5 -0
- package/dist/research/workspace/preflight.js +37 -17
- package/dist/research/workspace/preflight.js.map +1 -1
- package/dist/research/workspace/projects.d.ts +3 -1
- package/dist/research/workspace/projects.js +346 -5
- package/dist/research/workspace/projects.js.map +1 -1
- package/dist/research/workspace/runtime.d.ts +106 -4
- package/dist/research/workspace/runtime.js +947 -80
- package/dist/research/workspace/runtime.js.map +1 -1
- package/dist/research/workspace/sanitization.js +28 -6
- package/dist/research/workspace/sanitization.js.map +1 -1
- package/dist/research/workspace/schemas.d.ts +3 -0
- package/dist/research/workspace/schemas.js +206 -33
- package/dist/research/workspace/schemas.js.map +1 -1
- package/dist/research/workspace/setup-catalog.js +5 -5
- package/dist/research/workspace/setup-invocation.d.ts +11 -0
- package/dist/research/workspace/setup-invocation.js +34 -0
- package/dist/research/workspace/setup-invocation.js.map +1 -0
- package/dist/research/workspace/setup-wizard.js +10 -4
- package/dist/research/workspace/setup-wizard.js.map +1 -1
- package/dist/research/workspace/setup.d.ts +55 -7
- package/dist/research/workspace/setup.js +603 -32
- package/dist/research/workspace/setup.js.map +1 -1
- package/dist/research/workspace/types.d.ts +52 -3
- package/dist/research/workspace/workspace.js +45 -6
- package/dist/research/workspace/workspace.js.map +1 -1
- package/package.json +4 -2
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { chmod, lstat, readFile } from "node:fs/promises";
|
|
3
|
+
import { basename, join, relative, resolve, sep } from "node:path";
|
|
4
|
+
import { CliError } from "../../errors.js";
|
|
5
|
+
import { appendEvidenceLedgerEvent, evidenceLedgerPath, listEvidenceCandidates, } from "./evidence-ledger.js";
|
|
6
|
+
import { readJournal } from "./journal.js";
|
|
7
|
+
import { sanitizeResearchText, sanitizeResearchValue } from "./sanitization.js";
|
|
8
|
+
import { canonicalJson, isObject, pathExists, readJsonFile, resolveContained, sha256File, sha256Text, workspacePaths, writeJsonAtomic, } from "./storage.js";
|
|
9
|
+
import { loadWorkspaceConfig } from "./workspace.js";
|
|
10
|
+
const IDENTIFIER = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/;
|
|
11
|
+
const SENSITIVE_QUERY_KEY = /^(?:access[_-]?token|api[_-]?key|apikey|auth|authorization|awsaccesskeyid|code|cookie|credential|key|password|secret|session(?:[_-]?id)?|sig|signature|token|x[_-]amz[_-](?:credential|security[_-]?token|signature)|x[_-]goog[_-](?:credential|signature))$/i;
|
|
12
|
+
const TRACKING_QUERY_KEY = /^(?:utm_[a-z0-9_]+|fbclid|gclid|mc_cid|mc_eid|ref|source)$/i;
|
|
13
|
+
export const downloadBindingRecordSchema = {
|
|
14
|
+
$id: "https://schemas.tiangong.ai/research/download-binding-input-v1.json",
|
|
15
|
+
type: "object",
|
|
16
|
+
additionalProperties: false,
|
|
17
|
+
required: ["schemaVersion", "backend", "status", "downloadUrl"],
|
|
18
|
+
properties: {
|
|
19
|
+
schemaVersion: { type: "integer", const: 1 },
|
|
20
|
+
backend: {
|
|
21
|
+
type: "string",
|
|
22
|
+
enum: ["native-browser", "chrome", "cloakbrowser", "skill-adapter", "direct-http"],
|
|
23
|
+
},
|
|
24
|
+
status: { type: "string", enum: ["completed", "failed", "cancelled"] },
|
|
25
|
+
path: { type: "string" },
|
|
26
|
+
downloadUrl: { type: "string", format: "uri" },
|
|
27
|
+
suggestedFilename: { type: "string", maxLength: 500 },
|
|
28
|
+
downloadIdentifier: { type: "string", maxLength: 1_000 },
|
|
29
|
+
failureCode: { type: "string", pattern: "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$" },
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
export async function bindEvidenceDownload(input) {
|
|
33
|
+
const value = sanitizeResearchValue(input.value);
|
|
34
|
+
if (!isObject(value))
|
|
35
|
+
throw downloadError("Download binding input must be a JSON object.");
|
|
36
|
+
const allowed = new Set([
|
|
37
|
+
"schemaVersion",
|
|
38
|
+
"backend",
|
|
39
|
+
"status",
|
|
40
|
+
"path",
|
|
41
|
+
"downloadUrl",
|
|
42
|
+
"suggestedFilename",
|
|
43
|
+
"downloadIdentifier",
|
|
44
|
+
"failureCode",
|
|
45
|
+
]);
|
|
46
|
+
const unknown = Object.keys(value).filter((key) => !allowed.has(key));
|
|
47
|
+
const backends = [
|
|
48
|
+
"native-browser",
|
|
49
|
+
"chrome",
|
|
50
|
+
"cloakbrowser",
|
|
51
|
+
"skill-adapter",
|
|
52
|
+
"direct-http",
|
|
53
|
+
];
|
|
54
|
+
const statuses = ["completed", "failed", "cancelled"];
|
|
55
|
+
if (unknown.length ||
|
|
56
|
+
value.schemaVersion !== 1 ||
|
|
57
|
+
!backends.includes(value.backend) ||
|
|
58
|
+
!statuses.includes(value.status) ||
|
|
59
|
+
typeof value.downloadUrl !== "string" ||
|
|
60
|
+
(value.suggestedFilename !== undefined &&
|
|
61
|
+
(typeof value.suggestedFilename !== "string" || value.suggestedFilename.length > 500)) ||
|
|
62
|
+
(value.downloadIdentifier !== undefined &&
|
|
63
|
+
(typeof value.downloadIdentifier !== "string" || value.downloadIdentifier.length > 1_000)) ||
|
|
64
|
+
(value.failureCode !== undefined &&
|
|
65
|
+
(typeof value.failureCode !== "string" || !IDENTIFIER.test(value.failureCode)))) {
|
|
66
|
+
throw downloadError("Download binding input failed validation.");
|
|
67
|
+
}
|
|
68
|
+
const backend = value.backend;
|
|
69
|
+
const status = value.status;
|
|
70
|
+
const downloadUrl = safeDownloadUrl(value.downloadUrl);
|
|
71
|
+
await requireActiveAcquisition(input.root, input.projectId, input.candidateId);
|
|
72
|
+
if (status !== "completed") {
|
|
73
|
+
if (value.path !== undefined) {
|
|
74
|
+
throw downloadError("Failed or cancelled downloads must not claim a completed file path.");
|
|
75
|
+
}
|
|
76
|
+
const failureCode = typeof value.failureCode === "string" ? value.failureCode : `download-${status}`;
|
|
77
|
+
await appendEvidenceLedgerEvent(input.root, input.projectId, "download.failed", {
|
|
78
|
+
eventId: `download-event-${randomUUID()}`,
|
|
79
|
+
candidateId: input.candidateId,
|
|
80
|
+
backend,
|
|
81
|
+
status,
|
|
82
|
+
downloadUrl,
|
|
83
|
+
failureCode,
|
|
84
|
+
recordedAt: new Date().toISOString(),
|
|
85
|
+
});
|
|
86
|
+
return {
|
|
87
|
+
status,
|
|
88
|
+
binding: null,
|
|
89
|
+
nextAction: "Stop acquisition for this attempt, report the failure, and do not register an artifact or submit a successful acquisition decision.",
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
if (typeof value.path !== "string") {
|
|
93
|
+
throw downloadError("A completed download requires one explicit absolute file path.");
|
|
94
|
+
}
|
|
95
|
+
const sourcePath = requireExactExternalPath(input.root, value.path);
|
|
96
|
+
const [info, config] = await Promise.all([
|
|
97
|
+
lstat(sourcePath).catch(() => undefined),
|
|
98
|
+
loadWorkspaceConfig(input.root),
|
|
99
|
+
]);
|
|
100
|
+
if (!info?.isFile() || info.isSymbolicLink()) {
|
|
101
|
+
throw downloadError("Downloaded file must be one existing regular non-symlink file.");
|
|
102
|
+
}
|
|
103
|
+
if (info.size < 1 || info.size > config.budget.maxBytesPerPackage) {
|
|
104
|
+
throw downloadError(`Downloaded file size must be 1-${config.budget.maxBytesPerPackage} bytes.`);
|
|
105
|
+
}
|
|
106
|
+
const fileSha256 = await sha256File(sourcePath);
|
|
107
|
+
const core = {
|
|
108
|
+
schemaVersion: 1,
|
|
109
|
+
bindingId: `download-${sha256Text(canonicalJson({ candidateId: input.candidateId, backend, fileSha256 })).slice(0, 24)}`,
|
|
110
|
+
projectId: input.projectId,
|
|
111
|
+
candidateId: input.candidateId,
|
|
112
|
+
backend,
|
|
113
|
+
status: "completed",
|
|
114
|
+
fileSha256,
|
|
115
|
+
fileBytes: info.size,
|
|
116
|
+
filePathSha256: sha256Text(sourcePath),
|
|
117
|
+
downloadUrl,
|
|
118
|
+
suggestedFilename: typeof value.suggestedFilename === "string"
|
|
119
|
+
? safeFilename(value.suggestedFilename)
|
|
120
|
+
: safeFilename(basename(sourcePath)),
|
|
121
|
+
downloadIdentifierSha256: typeof value.downloadIdentifier === "string"
|
|
122
|
+
? sha256Text(sanitizeResearchText(value.downloadIdentifier))
|
|
123
|
+
: null,
|
|
124
|
+
boundAt: new Date().toISOString(),
|
|
125
|
+
};
|
|
126
|
+
const binding = {
|
|
127
|
+
...core,
|
|
128
|
+
bindingSha256: sha256Text(canonicalJson(core)),
|
|
129
|
+
};
|
|
130
|
+
const recordPath = downloadBindingPath(input.root, input.projectId, binding.bindingId);
|
|
131
|
+
if (await pathExists(recordPath)) {
|
|
132
|
+
const existing = parseEvidenceDownloadBinding(JSON.parse(await readFile(recordPath, "utf8")));
|
|
133
|
+
if (existing.fileSha256 !== binding.fileSha256 ||
|
|
134
|
+
existing.filePathSha256 !== binding.filePathSha256 ||
|
|
135
|
+
existing.candidateId !== binding.candidateId) {
|
|
136
|
+
throw downloadError("Download binding identity collides with different file provenance.");
|
|
137
|
+
}
|
|
138
|
+
await ensureBoundEvent(input.root, input.projectId, existing);
|
|
139
|
+
return { status: "completed", binding: existing };
|
|
140
|
+
}
|
|
141
|
+
await writeJsonAtomic(recordPath, binding, 0o444);
|
|
142
|
+
await chmod(recordPath, 0o444).catch(() => undefined);
|
|
143
|
+
await ensureBoundEvent(input.root, input.projectId, binding);
|
|
144
|
+
return { status: "completed", binding };
|
|
145
|
+
}
|
|
146
|
+
async function ensureBoundEvent(root, projectId, binding) {
|
|
147
|
+
const events = await readJournal(evidenceLedgerPath(root, projectId));
|
|
148
|
+
if (events.some((event) => event.type === "download.bound" &&
|
|
149
|
+
event.payload.bindingId === binding.bindingId &&
|
|
150
|
+
event.payload.bindingSha256 === binding.bindingSha256)) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
await appendEvidenceLedgerEvent(root, projectId, "download.bound", {
|
|
154
|
+
bindingId: binding.bindingId,
|
|
155
|
+
bindingSha256: binding.bindingSha256,
|
|
156
|
+
candidateId: binding.candidateId,
|
|
157
|
+
backend: binding.backend,
|
|
158
|
+
fileSha256: binding.fileSha256,
|
|
159
|
+
fileBytes: binding.fileBytes,
|
|
160
|
+
downloadUrl: binding.downloadUrl,
|
|
161
|
+
suggestedFilename: binding.suggestedFilename,
|
|
162
|
+
downloadIdentifierSha256: binding.downloadIdentifierSha256,
|
|
163
|
+
boundAt: binding.boundAt,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
export async function loadAndVerifyDownloadBinding(input) {
|
|
167
|
+
if (!/^download-[0-9a-f]{24}$/.test(input.bindingId)) {
|
|
168
|
+
throw downloadError("Download binding ID is invalid.");
|
|
169
|
+
}
|
|
170
|
+
const sourcePath = requireExactExternalPath(input.root, input.path);
|
|
171
|
+
const binding = parseEvidenceDownloadBinding(JSON.parse(await readFile(downloadBindingPath(input.root, input.projectId, input.bindingId), "utf8")));
|
|
172
|
+
const info = await lstat(sourcePath).catch(() => undefined);
|
|
173
|
+
if (binding.projectId !== input.projectId ||
|
|
174
|
+
binding.candidateId !== input.candidateId ||
|
|
175
|
+
binding.filePathSha256 !== sha256Text(sourcePath) ||
|
|
176
|
+
!info?.isFile() ||
|
|
177
|
+
info.isSymbolicLink() ||
|
|
178
|
+
info.size !== binding.fileBytes ||
|
|
179
|
+
(await sha256File(sourcePath)) !== binding.fileSha256) {
|
|
180
|
+
throw downloadError("Downloaded file no longer matches its exact event binding.");
|
|
181
|
+
}
|
|
182
|
+
return binding;
|
|
183
|
+
}
|
|
184
|
+
export function parseEvidenceDownloadBinding(value) {
|
|
185
|
+
if (!isObject(value) ||
|
|
186
|
+
value.schemaVersion !== 1 ||
|
|
187
|
+
typeof value.bindingId !== "string" ||
|
|
188
|
+
!/^download-[0-9a-f]{24}$/.test(value.bindingId) ||
|
|
189
|
+
typeof value.projectId !== "string" ||
|
|
190
|
+
typeof value.candidateId !== "string" ||
|
|
191
|
+
!["native-browser", "chrome", "cloakbrowser", "skill-adapter", "direct-http"].includes(String(value.backend)) ||
|
|
192
|
+
value.status !== "completed" ||
|
|
193
|
+
typeof value.fileSha256 !== "string" ||
|
|
194
|
+
!/^[0-9a-f]{64}$/.test(value.fileSha256) ||
|
|
195
|
+
!Number.isInteger(value.fileBytes) ||
|
|
196
|
+
typeof value.filePathSha256 !== "string" ||
|
|
197
|
+
!/^[0-9a-f]{64}$/.test(value.filePathSha256) ||
|
|
198
|
+
typeof value.downloadUrl !== "string" ||
|
|
199
|
+
(value.suggestedFilename !== null && typeof value.suggestedFilename !== "string") ||
|
|
200
|
+
(value.downloadIdentifierSha256 !== null &&
|
|
201
|
+
(typeof value.downloadIdentifierSha256 !== "string" ||
|
|
202
|
+
!/^[0-9a-f]{64}$/.test(value.downloadIdentifierSha256))) ||
|
|
203
|
+
typeof value.boundAt !== "string" ||
|
|
204
|
+
typeof value.bindingSha256 !== "string" ||
|
|
205
|
+
!/^[0-9a-f]{64}$/.test(value.bindingSha256)) {
|
|
206
|
+
throw downloadError("Download binding record is malformed.");
|
|
207
|
+
}
|
|
208
|
+
const { bindingSha256, ...core } = value;
|
|
209
|
+
if (sha256Text(canonicalJson(core)) !== bindingSha256) {
|
|
210
|
+
throw downloadError("Download binding record failed its hash binding.");
|
|
211
|
+
}
|
|
212
|
+
return value;
|
|
213
|
+
}
|
|
214
|
+
async function requireActiveAcquisition(root, projectId, candidateId) {
|
|
215
|
+
const [project, candidates] = await Promise.all([
|
|
216
|
+
readJsonFile(join(workspacePaths(root).projects, projectId, "project.json"), `Research project ${projectId}`),
|
|
217
|
+
listEvidenceCandidates(root, projectId),
|
|
218
|
+
]);
|
|
219
|
+
const packages = Array.isArray(project.packages) ? project.packages : [];
|
|
220
|
+
const acquire = packages.find((workPackage) => isObject(workPackage) &&
|
|
221
|
+
workPackage.stage === "acquire" &&
|
|
222
|
+
workPackage.status === "running" &&
|
|
223
|
+
workPackage.executor === "producer");
|
|
224
|
+
if (!acquire) {
|
|
225
|
+
throw downloadError("Download binding is allowed only during active native acquisition.");
|
|
226
|
+
}
|
|
227
|
+
if (!candidates.some((candidate) => candidate.id === candidateId)) {
|
|
228
|
+
throw downloadError(`Download binding refers to unknown candidate ${candidateId}.`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
function requireExactExternalPath(root, path) {
|
|
232
|
+
const selected = resolve(path);
|
|
233
|
+
if (selected !== path)
|
|
234
|
+
throw downloadError("Downloaded file path must be absolute and normalized.");
|
|
235
|
+
const controlRoot = resolve(workspacePaths(root).control);
|
|
236
|
+
if (!relative(controlRoot, selected).startsWith(`..${sep}`) && selected !== controlRoot) {
|
|
237
|
+
throw downloadError("Downloaded file must be an explicit staging file outside control state.");
|
|
238
|
+
}
|
|
239
|
+
return selected;
|
|
240
|
+
}
|
|
241
|
+
function safeDownloadUrl(value) {
|
|
242
|
+
let url;
|
|
243
|
+
try {
|
|
244
|
+
url = new URL(value);
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
throw downloadError("Download URL is invalid.");
|
|
248
|
+
}
|
|
249
|
+
if (url.protocol !== "https:")
|
|
250
|
+
throw downloadError("Download URL must use HTTPS.");
|
|
251
|
+
url.username = "";
|
|
252
|
+
url.password = "";
|
|
253
|
+
url.hash = "";
|
|
254
|
+
for (const key of [...url.searchParams.keys()]) {
|
|
255
|
+
if (SENSITIVE_QUERY_KEY.test(key) || TRACKING_QUERY_KEY.test(key)) {
|
|
256
|
+
url.searchParams.delete(key);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
url.searchParams.sort();
|
|
260
|
+
return url.toString();
|
|
261
|
+
}
|
|
262
|
+
function safeFilename(value) {
|
|
263
|
+
const filename = sanitizeResearchText(basename(value))
|
|
264
|
+
.replace(/[\r\n\0]/g, "")
|
|
265
|
+
.trim();
|
|
266
|
+
return filename ? filename.slice(0, 500) : null;
|
|
267
|
+
}
|
|
268
|
+
function downloadBindingPath(root, projectId, bindingId) {
|
|
269
|
+
return resolveContained(workspacePaths(root).projects, `${projectId}/evidence/downloads/${bindingId}.json`);
|
|
270
|
+
}
|
|
271
|
+
function downloadError(message) {
|
|
272
|
+
return new CliError(message, { code: "RESEARCH_DOWNLOAD_BINDING_INVALID", exitCode: 3 });
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=downloads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"downloads.js","sourceRoot":"","sources":["../../../src/research/workspace/downloads.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { BrokerEvidenceReceipt } from "./evidence.js";
|
|
2
|
+
import type { JournalEvent, ProjectInput } from "./types.js";
|
|
3
|
+
export type EvidenceLedgerEventType = "activity.recorded" | "candidate.discovered" | "candidate.duplicate" | "candidate.assessed" | "candidate.admitted" | "candidate.rejected" | "download.bound" | "download.failed" | "handoff.requested" | "handoff.resolved" | "artifact.registered" | "artifact.assessed" | "snapshot.frozen" | "claim.used" | "review.bound" | "addendum.created" | "project.superseded";
|
|
4
|
+
export interface EvidenceCandidateOrigin {
|
|
5
|
+
kind: "broker" | "input" | "native";
|
|
6
|
+
receiptId: string | null;
|
|
7
|
+
inputId: string | null;
|
|
8
|
+
capabilityId: string | null;
|
|
9
|
+
locator: string | null;
|
|
10
|
+
jsonPointer: string | null;
|
|
11
|
+
retrievedAt: string;
|
|
12
|
+
}
|
|
13
|
+
export interface EvidenceCandidate {
|
|
14
|
+
id: string;
|
|
15
|
+
canonicalKeySha256: string;
|
|
16
|
+
title: string;
|
|
17
|
+
url: string | null;
|
|
18
|
+
doi: string | null;
|
|
19
|
+
publicationDate: string | null;
|
|
20
|
+
excerpt: string | null;
|
|
21
|
+
discoveredAt: string;
|
|
22
|
+
origin: EvidenceCandidateOrigin;
|
|
23
|
+
occurrences: EvidenceCandidateOrigin[];
|
|
24
|
+
}
|
|
25
|
+
export declare function evidenceLedgerPath(root: string, projectId: string): string;
|
|
26
|
+
export declare function appendEvidenceLedgerEvent(root: string, projectId: string, type: EvidenceLedgerEventType, payload: Record<string, unknown>): Promise<JournalEvent>;
|
|
27
|
+
export declare function cloneEvidenceLedger(root: string, sourceProjectId: string, targetProjectId: string): Promise<number>;
|
|
28
|
+
export declare function verifyEvidenceLedger(root: string, projectId: string): Promise<{
|
|
29
|
+
events: number;
|
|
30
|
+
candidates: number;
|
|
31
|
+
head: string;
|
|
32
|
+
}>;
|
|
33
|
+
export declare function listEvidenceCandidates(root: string, projectId: string): Promise<EvidenceCandidate[]>;
|
|
34
|
+
export declare function registerBrokerCandidates(input: {
|
|
35
|
+
root: string;
|
|
36
|
+
projectId: string;
|
|
37
|
+
receipt: BrokerEvidenceReceipt;
|
|
38
|
+
contextBytes: Uint8Array;
|
|
39
|
+
selectedJsonPointer?: string | null;
|
|
40
|
+
itemOffset?: number;
|
|
41
|
+
}): Promise<EvidenceCandidate[]>;
|
|
42
|
+
export declare function registerProjectInputCandidates(root: string, projectId: string, inputs: ProjectInput[]): Promise<EvidenceCandidate[]>;
|
|
43
|
+
export declare function registerNativeDiscoveryCandidate(input: {
|
|
44
|
+
root: string;
|
|
45
|
+
projectId: string;
|
|
46
|
+
value: Record<string, unknown>;
|
|
47
|
+
}): Promise<{
|
|
48
|
+
candidate: EvidenceCandidate;
|
|
49
|
+
duplicate: boolean;
|
|
50
|
+
admissionStatus: "supplemental-not-admitted" | "formalized-not-admitted";
|
|
51
|
+
nextAction: string;
|
|
52
|
+
}>;
|