@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.
Files changed (69) hide show
  1. package/AGENTS.md +7 -2
  2. package/README.md +72 -19
  3. package/dist/research/commands.js +58 -1
  4. package/dist/research/commands.js.map +1 -1
  5. package/dist/research/orchestration.js +388 -31
  6. package/dist/research/orchestration.js.map +1 -1
  7. package/dist/research/workspace/acquisition.d.ts +71 -0
  8. package/dist/research/workspace/acquisition.js +593 -0
  9. package/dist/research/workspace/acquisition.js.map +1 -0
  10. package/dist/research/workspace/artifacts.d.ts +43 -0
  11. package/dist/research/workspace/artifacts.js +544 -0
  12. package/dist/research/workspace/artifacts.js.map +1 -0
  13. package/dist/research/workspace/broker.js +265 -56
  14. package/dist/research/workspace/broker.js.map +1 -1
  15. package/dist/research/workspace/constants.d.ts +1 -0
  16. package/dist/research/workspace/constants.js +4 -2
  17. package/dist/research/workspace/constants.js.map +1 -1
  18. package/dist/research/workspace/context.js +106 -11
  19. package/dist/research/workspace/context.js.map +1 -1
  20. package/dist/research/workspace/discovery-planning.d.ts +25 -0
  21. package/dist/research/workspace/discovery-planning.js +106 -0
  22. package/dist/research/workspace/discovery-planning.js.map +1 -0
  23. package/dist/research/workspace/discovery-status.d.ts +46 -0
  24. package/dist/research/workspace/discovery-status.js +183 -0
  25. package/dist/research/workspace/discovery-status.js.map +1 -0
  26. package/dist/research/workspace/discovery.d.ts +25 -0
  27. package/dist/research/workspace/discovery.js +268 -0
  28. package/dist/research/workspace/discovery.js.map +1 -0
  29. package/dist/research/workspace/downloads.d.ts +76 -0
  30. package/dist/research/workspace/downloads.js +274 -0
  31. package/dist/research/workspace/downloads.js.map +1 -0
  32. package/dist/research/workspace/evidence-ledger.d.ts +52 -0
  33. package/dist/research/workspace/evidence-ledger.js +487 -0
  34. package/dist/research/workspace/evidence-ledger.js.map +1 -0
  35. package/dist/research/workspace/evidence.d.ts +1 -0
  36. package/dist/research/workspace/evidence.js +2 -0
  37. package/dist/research/workspace/evidence.js.map +1 -1
  38. package/dist/research/workspace/input-plan.js +4 -0
  39. package/dist/research/workspace/input-plan.js.map +1 -1
  40. package/dist/research/workspace/native-activity.d.ts +65 -0
  41. package/dist/research/workspace/native-activity.js +153 -0
  42. package/dist/research/workspace/native-activity.js.map +1 -0
  43. package/dist/research/workspace/preflight.d.ts +5 -0
  44. package/dist/research/workspace/preflight.js +37 -17
  45. package/dist/research/workspace/preflight.js.map +1 -1
  46. package/dist/research/workspace/projects.d.ts +3 -1
  47. package/dist/research/workspace/projects.js +346 -5
  48. package/dist/research/workspace/projects.js.map +1 -1
  49. package/dist/research/workspace/runtime.d.ts +106 -4
  50. package/dist/research/workspace/runtime.js +947 -80
  51. package/dist/research/workspace/runtime.js.map +1 -1
  52. package/dist/research/workspace/sanitization.js +28 -6
  53. package/dist/research/workspace/sanitization.js.map +1 -1
  54. package/dist/research/workspace/schemas.d.ts +3 -0
  55. package/dist/research/workspace/schemas.js +206 -33
  56. package/dist/research/workspace/schemas.js.map +1 -1
  57. package/dist/research/workspace/setup-catalog.js +5 -5
  58. package/dist/research/workspace/setup-invocation.d.ts +11 -0
  59. package/dist/research/workspace/setup-invocation.js +34 -0
  60. package/dist/research/workspace/setup-invocation.js.map +1 -0
  61. package/dist/research/workspace/setup-wizard.js +10 -4
  62. package/dist/research/workspace/setup-wizard.js.map +1 -1
  63. package/dist/research/workspace/setup.d.ts +55 -7
  64. package/dist/research/workspace/setup.js +603 -32
  65. package/dist/research/workspace/setup.js.map +1 -1
  66. package/dist/research/workspace/types.d.ts +52 -3
  67. package/dist/research/workspace/workspace.js +45 -6
  68. package/dist/research/workspace/workspace.js.map +1 -1
  69. package/package.json +4 -2
@@ -0,0 +1,43 @@
1
+ import { type EvidenceDownloadBinding } from "./downloads.js";
2
+ export interface EvidenceArtifactRecord {
3
+ schemaVersion: 1;
4
+ artifactId: string;
5
+ projectId: string;
6
+ candidateId: string;
7
+ sha256: string;
8
+ bytes: number;
9
+ mediaType: string;
10
+ originalFilename: string;
11
+ sourceUrl: string | null;
12
+ license: string | null;
13
+ licenseUrl: string | null;
14
+ hostType: string | null;
15
+ articleVersion: string | null;
16
+ downloadBinding: EvidenceDownloadBinding | null;
17
+ derivedFromArtifactId: string | null;
18
+ locator: string;
19
+ registeredAt: string;
20
+ validation: {
21
+ kind: string;
22
+ checks: string[];
23
+ details: Record<string, string | number | boolean | string[]>;
24
+ };
25
+ }
26
+ export declare function registerEvidenceArtifact(input: {
27
+ root: string;
28
+ projectId: string;
29
+ candidateId: string;
30
+ path: string;
31
+ mediaType?: string;
32
+ sourceUrl?: string;
33
+ license?: string;
34
+ licenseUrl?: string;
35
+ hostType?: string;
36
+ articleVersion?: string;
37
+ downloadBindingId?: string;
38
+ derivedFromArtifactId?: string;
39
+ }): Promise<EvidenceArtifactRecord>;
40
+ export declare function loadEvidenceArtifactRecords(root: string, projectId: string): Promise<EvidenceArtifactRecord[]>;
41
+ export declare function verifyEvidenceArtifact(root: string, record: EvidenceArtifactRecord): Promise<void>;
42
+ export declare function stageEvidenceArtifacts(root: string, projectId: string, capsuleProject: string, selectedArtifactIds?: ReadonlySet<string>): Promise<EvidenceArtifactRecord[]>;
43
+ export declare function cloneProjectArtifactRecords(root: string, sourceProjectId: string, targetProjectId: string): Promise<EvidenceArtifactRecord[]>;
@@ -0,0 +1,544 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { chmod, cp, lstat, readFile, readdir, rename, rm, writeFile } from "node:fs/promises";
3
+ import { basename, dirname, extname, relative, resolve, sep } from "node:path";
4
+ import { inflateRawSync } from "node:zlib";
5
+ import { PDFDocument } from "pdf-lib";
6
+ import { CliError } from "../../errors.js";
7
+ import { loadAndVerifyDownloadBinding, parseEvidenceDownloadBinding, } from "./downloads.js";
8
+ import { appendEvidenceLedgerEvent, evidenceLedgerPath, listEvidenceCandidates, } from "./evidence-ledger.js";
9
+ import { readJournal } from "./journal.js";
10
+ import { sanitizeResearchText } from "./sanitization.js";
11
+ import { canonicalJson, ensureDirectory, isObject, pathExists, readJsonFile, resolveContained, sha256Bytes, sha256File, sha256Text, workspacePaths, writeJsonAtomic, } from "./storage.js";
12
+ import { loadWorkspaceConfig } from "./workspace.js";
13
+ const SENSITIVE_QUERY_KEY = /^(?:access[_-]?token|api[_-]?key|apikey|auth|authorization|code|cookie|credential|key|password|secret|session(?:[_-]?id)?|sig|signature|token|x[_-]amz[_-](?:credential|security[_-]?token|signature)|x[_-]goog[_-](?:credential|signature))$/i;
14
+ const TRACKING_QUERY_KEY = /^(?:utm_[a-z0-9_]+|fbclid|gclid|mc_cid|mc_eid|ref|source)$/i;
15
+ const MAX_ARCHIVE_UNCOMPRESSED_BYTES = 256 * 1024 * 1024;
16
+ export async function registerEvidenceArtifact(input) {
17
+ if (!/^[a-z0-9][a-z0-9-]{2,63}$/.test(input.projectId)) {
18
+ throw artifactError("Artifact project ID is invalid.", "RESEARCH_ARTIFACT_PATH_INVALID");
19
+ }
20
+ const sourcePath = requireExactAbsolutePath(input.path);
21
+ const controlRoot = resolve(workspacePaths(input.root).control);
22
+ if (!relative(controlRoot, sourcePath).startsWith(`..${sep}`) && sourcePath !== controlRoot) {
23
+ throw artifactError("Artifact input must be outside .tiangong-research; register the exact external download/staging file.", "RESEARCH_ARTIFACT_PATH_INVALID");
24
+ }
25
+ const info = await lstat(sourcePath).catch(() => undefined);
26
+ if (!info?.isFile() || info.isSymbolicLink()) {
27
+ throw artifactError("Artifact path must be one explicit regular file and cannot be a symbolic link.", "RESEARCH_ARTIFACT_PATH_INVALID");
28
+ }
29
+ const [project, config, candidates] = await Promise.all([
30
+ readJsonFile(resolveContained(workspacePaths(input.root).projects, `${input.projectId}/project.json`), `Research project ${input.projectId}`),
31
+ loadWorkspaceConfig(input.root),
32
+ listEvidenceCandidates(input.root, input.projectId),
33
+ ]);
34
+ const acquire = isObject(project) && Array.isArray(project.packages)
35
+ ? project.packages.find((workPackage) => isObject(workPackage) && workPackage.stage === "acquire")
36
+ : undefined;
37
+ if (!isObject(acquire) || acquire.status !== "running" || acquire.executor !== "producer") {
38
+ throw artifactError("Artifact registration is allowed only during the active native acquisition stage.", "RESEARCH_ACQUISITION_STAGE_REQUIRED");
39
+ }
40
+ if (!candidates.some((candidate) => candidate.id === input.candidateId)) {
41
+ throw artifactError(`Artifact refers to unknown candidate ${input.candidateId}.`, "RESEARCH_ARTIFACT_CANDIDATE_INVALID");
42
+ }
43
+ if (info.size < 1 || info.size > config.budget.maxBytesPerPackage) {
44
+ throw artifactError(`Artifact size must be 1-${config.budget.maxBytesPerPackage} bytes.`, "RESEARCH_ARTIFACT_SIZE_INVALID");
45
+ }
46
+ const downloadBinding = input.downloadBindingId
47
+ ? await loadAndVerifyDownloadBinding({
48
+ root: input.root,
49
+ projectId: input.projectId,
50
+ candidateId: input.candidateId,
51
+ bindingId: input.downloadBindingId,
52
+ path: sourcePath,
53
+ })
54
+ : null;
55
+ if (downloadBinding && input.derivedFromArtifactId) {
56
+ throw artifactError("An artifact cannot be both an exact download and a derived file.", "RESEARCH_ARTIFACT_BINDING_INVALID");
57
+ }
58
+ let derivedFromArtifactId = null;
59
+ let derivedFromArtifact = null;
60
+ if (input.derivedFromArtifactId) {
61
+ const registered = await loadEvidenceArtifactRecords(input.root, input.projectId);
62
+ const parent = registered.find((artifact) => artifact.artifactId === input.derivedFromArtifactId);
63
+ if (!parent || parent.candidateId !== input.candidateId) {
64
+ throw artifactError("Derived artifact parent is missing or bound to a different candidate.", "RESEARCH_ARTIFACT_BINDING_INVALID");
65
+ }
66
+ derivedFromArtifactId = parent.artifactId;
67
+ derivedFromArtifact = parent;
68
+ }
69
+ const declaredSourceUrl = canonicalSourceUrl(input.sourceUrl);
70
+ if (declaredSourceUrl && !downloadBinding && !derivedFromArtifact) {
71
+ throw artifactError("Network-derived artifacts require an exact completed download binding.", "RESEARCH_DOWNLOAD_BINDING_REQUIRED");
72
+ }
73
+ if (downloadBinding && declaredSourceUrl && declaredSourceUrl !== downloadBinding.downloadUrl) {
74
+ throw artifactError("Artifact source URL does not match its exact download binding.", "RESEARCH_DOWNLOAD_BINDING_INVALID");
75
+ }
76
+ if (derivedFromArtifact &&
77
+ declaredSourceUrl &&
78
+ declaredSourceUrl !== derivedFromArtifact.sourceUrl) {
79
+ throw artifactError("Derived artifact source URL does not match its registered parent artifact.", "RESEARCH_ARTIFACT_BINDING_INVALID");
80
+ }
81
+ const bytes = await readFile(sourcePath);
82
+ const mediaType = normalizeMediaType(input.mediaType ?? inferMediaType(sourcePath));
83
+ const validation = await validateArtifactBytes(bytes, mediaType);
84
+ const sha256 = sha256Bytes(bytes);
85
+ const artifactId = `artifact-${sha256Text(`${input.candidateId}:${sha256}`).slice(0, 24)}`;
86
+ const locator = `evidence/artifacts/${sha256.slice(0, 2)}/${sha256}`;
87
+ const destination = resolveContained(workspacePaths(input.root).control, locator);
88
+ await persistImmutableArtifact(destination, bytes, sha256);
89
+ const record = {
90
+ schemaVersion: 1,
91
+ artifactId,
92
+ projectId: input.projectId,
93
+ candidateId: input.candidateId,
94
+ sha256,
95
+ bytes: bytes.byteLength,
96
+ mediaType,
97
+ originalFilename: sanitizeFilename(basename(sourcePath)),
98
+ sourceUrl: downloadBinding?.downloadUrl ?? derivedFromArtifact?.sourceUrl ?? declaredSourceUrl,
99
+ license: boundedOptionalMetadata(input.license, "license"),
100
+ licenseUrl: canonicalSourceUrl(input.licenseUrl),
101
+ hostType: boundedOptionalMetadata(input.hostType, "host type"),
102
+ articleVersion: boundedOptionalMetadata(input.articleVersion, "article version"),
103
+ downloadBinding,
104
+ derivedFromArtifactId,
105
+ locator,
106
+ registeredAt: new Date().toISOString(),
107
+ validation,
108
+ };
109
+ const recordPath = artifactRecordPath(input.root, input.projectId, artifactId);
110
+ if (await pathExists(recordPath)) {
111
+ const existing = parseArtifactRecord(JSON.parse(await readFile(recordPath, "utf8")));
112
+ const stableExisting = { ...existing, registeredAt: record.registeredAt };
113
+ if (canonicalJson(stableExisting) !== canonicalJson(record)) {
114
+ throw artifactError("Artifact identity already exists with different metadata.", "RESEARCH_ARTIFACT_STORE_INVALID");
115
+ }
116
+ return existing;
117
+ }
118
+ await writeJsonAtomic(recordPath, record, 0o444);
119
+ await chmod(recordPath, 0o444).catch(() => undefined);
120
+ await appendEvidenceLedgerEvent(input.root, input.projectId, "artifact.registered", {
121
+ artifactId,
122
+ candidateId: input.candidateId,
123
+ sha256,
124
+ bytes: record.bytes,
125
+ mediaType,
126
+ locator,
127
+ sourceUrl: record.sourceUrl,
128
+ downloadBindingId: downloadBinding?.bindingId ?? null,
129
+ derivedFromArtifactId,
130
+ validation,
131
+ });
132
+ return record;
133
+ }
134
+ export async function loadEvidenceArtifactRecords(root, projectId) {
135
+ const directory = resolveContained(workspacePaths(root).projects, `${projectId}/evidence/artifacts`);
136
+ if (!(await pathExists(directory)))
137
+ return [];
138
+ const entries = await readdir(directory, { withFileTypes: true });
139
+ const records = [];
140
+ for (const entry of entries.sort((left, right) => left.name.localeCompare(right.name))) {
141
+ if (!entry.isFile() || entry.isSymbolicLink() || !entry.name.endsWith(".json"))
142
+ continue;
143
+ const record = parseArtifactRecord(JSON.parse(await readFile(resolve(directory, entry.name), "utf8")));
144
+ if (record.projectId !== projectId || entry.name !== `${record.artifactId}.json`) {
145
+ throw artifactError("Artifact record identity does not match its path.", "RESEARCH_ARTIFACT_STORE_INVALID");
146
+ }
147
+ await verifyEvidenceArtifact(root, record);
148
+ records.push(record);
149
+ }
150
+ return records;
151
+ }
152
+ export async function verifyEvidenceArtifact(root, record) {
153
+ const expectedLocator = `evidence/artifacts/${record.sha256.slice(0, 2)}/${record.sha256}`;
154
+ const path = resolveContained(workspacePaths(root).control, record.locator);
155
+ const info = await lstat(path).catch(() => undefined);
156
+ if (record.locator !== expectedLocator ||
157
+ !info?.isFile() ||
158
+ info.isSymbolicLink() ||
159
+ info.size !== record.bytes ||
160
+ (await sha256File(path)) !== record.sha256) {
161
+ throw artifactError(`Registered artifact is missing or drifted: ${record.artifactId}.`, "RESEARCH_ARTIFACT_DRIFT");
162
+ }
163
+ await validateArtifactBytes(await readFile(path), record.mediaType);
164
+ if (record.downloadBinding) {
165
+ const events = await readJournal(evidenceLedgerPath(root, record.projectId));
166
+ const bound = events.some((event) => event.type === "download.bound" &&
167
+ event.payload.bindingId === record.downloadBinding?.bindingId &&
168
+ event.payload.bindingSha256 === record.downloadBinding?.bindingSha256 &&
169
+ event.payload.fileSha256 === record.sha256 &&
170
+ event.payload.candidateId === record.candidateId);
171
+ if (!bound) {
172
+ throw artifactError(`Artifact download binding is absent from the evidence ledger: ${record.artifactId}.`, "RESEARCH_ARTIFACT_DRIFT");
173
+ }
174
+ }
175
+ }
176
+ export async function stageEvidenceArtifacts(root, projectId, capsuleProject, selectedArtifactIds) {
177
+ const registered = await loadEvidenceArtifactRecords(root, projectId);
178
+ const records = selectedArtifactIds
179
+ ? registered.filter((record) => selectedArtifactIds.has(record.artifactId))
180
+ : registered;
181
+ if (selectedArtifactIds && records.length !== selectedArtifactIds.size) {
182
+ const registeredIds = new Set(registered.map((record) => record.artifactId));
183
+ const missing = [...selectedArtifactIds].filter((artifactId) => !registeredIds.has(artifactId));
184
+ throw artifactError(`Frozen evidence snapshot refers to missing registered artifacts: ${missing.join(", ")}.`, "RESEARCH_ARTIFACT_DRIFT");
185
+ }
186
+ const copied = new Set();
187
+ for (const record of records) {
188
+ await verifyEvidenceArtifact(root, record);
189
+ if (copied.has(record.sha256))
190
+ continue;
191
+ const source = resolveContained(workspacePaths(root).control, record.locator);
192
+ const destination = resolveContained(capsuleProject, record.locator);
193
+ await ensureDirectory(dirname(destination));
194
+ await cp(source, destination, { errorOnExist: true, force: false });
195
+ copied.add(record.sha256);
196
+ }
197
+ return records;
198
+ }
199
+ export async function cloneProjectArtifactRecords(root, sourceProjectId, targetProjectId) {
200
+ const records = await loadEvidenceArtifactRecords(root, sourceProjectId);
201
+ const cloned = [];
202
+ for (const record of records) {
203
+ const value = { ...record, projectId: targetProjectId };
204
+ const destination = artifactRecordPath(root, targetProjectId, record.artifactId);
205
+ await writeJsonAtomic(destination, value, 0o444);
206
+ await chmod(destination, 0o444).catch(() => undefined);
207
+ cloned.push(value);
208
+ }
209
+ return cloned;
210
+ }
211
+ function artifactRecordPath(root, projectId, artifactId) {
212
+ return resolveContained(workspacePaths(root).projects, `${projectId}/evidence/artifacts/${artifactId}.json`);
213
+ }
214
+ async function persistImmutableArtifact(destination, bytes, expectedSha256) {
215
+ await ensureDirectory(dirname(destination));
216
+ if (await pathExists(destination)) {
217
+ if ((await sha256File(destination)) !== expectedSha256) {
218
+ throw artifactError("Content-addressed artifact collision or drift detected.", "RESEARCH_ARTIFACT_STORE_INVALID");
219
+ }
220
+ return;
221
+ }
222
+ const temporary = `${destination}.${process.pid}.${randomUUID()}.tmp`;
223
+ await writeFile(temporary, bytes, { mode: 0o444, flag: "wx" });
224
+ await chmod(temporary, 0o444).catch(() => undefined);
225
+ try {
226
+ await rename(temporary, destination);
227
+ }
228
+ catch (error) {
229
+ if (!(await pathExists(destination)) || (await sha256File(destination)) !== expectedSha256) {
230
+ await rm(temporary, { force: true }).catch(() => undefined);
231
+ throw error;
232
+ }
233
+ await rm(temporary, { force: true }).catch(() => undefined);
234
+ }
235
+ }
236
+ async function validateArtifactBytes(bytes, mediaType) {
237
+ const checks = ["non-empty"];
238
+ if (mediaType === "application/pdf") {
239
+ if (!bytes.subarray(0, 5).equals(Buffer.from("%PDF-"))) {
240
+ throw invalidFormat("PDF header is missing.");
241
+ }
242
+ if (!bytes.subarray(Math.max(0, bytes.length - 4096)).includes(Buffer.from("%%EOF"))) {
243
+ throw invalidFormat("PDF EOF marker is missing.");
244
+ }
245
+ let pageCount;
246
+ try {
247
+ const document = await PDFDocument.load(bytes, {
248
+ ignoreEncryption: false,
249
+ updateMetadata: false,
250
+ throwOnInvalidObject: true,
251
+ });
252
+ pageCount = document.getPageCount();
253
+ }
254
+ catch {
255
+ throw invalidFormat("PDF structure cannot be parsed.");
256
+ }
257
+ if (pageCount < 1)
258
+ throw invalidFormat("PDF contains no pages.");
259
+ checks.push("pdf-header", "pdf-eof", "pdf-parse", "pdf-page-count");
260
+ return { kind: "pdf", checks, details: { pageCount } };
261
+ }
262
+ if (mediaType === "application/json") {
263
+ try {
264
+ JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
265
+ }
266
+ catch {
267
+ throw invalidFormat("JSON artifact is not valid UTF-8 JSON.");
268
+ }
269
+ checks.push("utf8", "json-parse");
270
+ return { kind: "json", checks, details: {} };
271
+ }
272
+ if (["text/plain", "text/markdown", "text/csv", "text/html"].includes(mediaType)) {
273
+ let text;
274
+ try {
275
+ text = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
276
+ }
277
+ catch {
278
+ throw invalidFormat("Text artifact is not valid UTF-8.");
279
+ }
280
+ checks.push("utf8");
281
+ if (mediaType === "text/html") {
282
+ if (!/<(?:!doctype\s+html|html|head|body)\b/i.test(text)) {
283
+ throw invalidFormat("HTML artifact does not contain an HTML document marker.");
284
+ }
285
+ checks.push("html-document-marker");
286
+ }
287
+ return { kind: mediaType.slice(5), checks, details: {} };
288
+ }
289
+ const officeMarkers = {
290
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": [
291
+ "[Content_Types].xml",
292
+ "xl/workbook.xml",
293
+ ],
294
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document": [
295
+ "[Content_Types].xml",
296
+ "word/document.xml",
297
+ ],
298
+ "application/vnd.openxmlformats-officedocument.presentationml.presentation": [
299
+ "[Content_Types].xml",
300
+ "ppt/presentation.xml",
301
+ ],
302
+ "application/zip": [],
303
+ };
304
+ const markers = officeMarkers[mediaType];
305
+ if (markers) {
306
+ const entries = inspectZipEntries(bytes);
307
+ const names = new Set(entries.map((entry) => entry.name));
308
+ if (markers.some((marker) => !names.has(marker))) {
309
+ throw invalidFormat("Office archive is missing required package members.");
310
+ }
311
+ const details = {
312
+ entryCount: entries.length,
313
+ crcVerifiedEntries: entries.length,
314
+ };
315
+ if (mediaType === "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") {
316
+ const workbook = entries.find((entry) => entry.name === "xl/workbook.xml");
317
+ const workbookText = workbook?.data.toString("utf8") ?? "";
318
+ const sheetNames = [...workbookText.matchAll(/<sheet\b[^>]*\bname=["']([^"']+)["']/gi)]
319
+ .map((match) => sanitizeResearchText(match[1] ?? "").trim())
320
+ .filter(Boolean)
321
+ .slice(0, 1_000);
322
+ if (!sheetNames.length)
323
+ throw invalidFormat("XLSX workbook contains no declared worksheets.");
324
+ checks.push("xlsx-workbook", "xlsx-sheet-list");
325
+ details.sheetNames = sheetNames;
326
+ }
327
+ checks.push("zip-header", "zip-eocd", "zip-central-directory", "zip-crc", ...markers.map((marker) => `member:${marker}`));
328
+ return {
329
+ kind: mediaType === "application/zip" ? "zip" : "openxml",
330
+ checks,
331
+ details,
332
+ };
333
+ }
334
+ throw artifactError(`Unsupported evidence artifact media type: ${mediaType}.`, "RESEARCH_ARTIFACT_MEDIA_TYPE_UNSUPPORTED");
335
+ }
336
+ function parseArtifactRecord(value) {
337
+ if (!isObject(value) ||
338
+ value.schemaVersion !== 1 ||
339
+ typeof value.artifactId !== "string" ||
340
+ !/^artifact-[0-9a-f]{24}$/.test(value.artifactId) ||
341
+ typeof value.projectId !== "string" ||
342
+ typeof value.candidateId !== "string" ||
343
+ typeof value.sha256 !== "string" ||
344
+ !/^[0-9a-f]{64}$/.test(value.sha256) ||
345
+ !Number.isInteger(value.bytes) ||
346
+ typeof value.mediaType !== "string" ||
347
+ typeof value.originalFilename !== "string" ||
348
+ (value.sourceUrl !== null && typeof value.sourceUrl !== "string") ||
349
+ (value.license !== null && typeof value.license !== "string") ||
350
+ (value.licenseUrl !== null && typeof value.licenseUrl !== "string") ||
351
+ (value.hostType !== null && typeof value.hostType !== "string") ||
352
+ (value.articleVersion !== null && typeof value.articleVersion !== "string") ||
353
+ (value.downloadBinding !== null && !isObject(value.downloadBinding)) ||
354
+ (value.derivedFromArtifactId !== null &&
355
+ (typeof value.derivedFromArtifactId !== "string" ||
356
+ !/^artifact-[0-9a-f]{24}$/.test(value.derivedFromArtifactId))) ||
357
+ typeof value.locator !== "string" ||
358
+ typeof value.registeredAt !== "string" ||
359
+ !Number.isFinite(Date.parse(value.registeredAt)) ||
360
+ !isObject(value.validation) ||
361
+ typeof value.validation.kind !== "string" ||
362
+ !Array.isArray(value.validation.checks) ||
363
+ value.validation.checks.some((check) => typeof check !== "string") ||
364
+ !isObject(value.validation.details) ||
365
+ Object.values(value.validation.details).some((detail) => !["string", "number", "boolean"].includes(typeof detail) &&
366
+ !(Array.isArray(detail) && detail.every((item) => typeof item === "string")))) {
367
+ throw artifactError("Evidence artifact record is malformed.", "RESEARCH_ARTIFACT_STORE_INVALID");
368
+ }
369
+ if (value.downloadBinding !== null)
370
+ parseEvidenceDownloadBinding(value.downloadBinding);
371
+ return value;
372
+ }
373
+ function inspectZipEntries(bytes) {
374
+ if (!(bytes[0] === 0x50 && bytes[1] === 0x4b))
375
+ throw invalidFormat("ZIP header is missing.");
376
+ const eocd = findZipEocd(bytes);
377
+ const entryCount = bytes.readUInt16LE(eocd + 10);
378
+ const centralSize = bytes.readUInt32LE(eocd + 12);
379
+ const centralOffset = bytes.readUInt32LE(eocd + 16);
380
+ if (entryCount < 1 ||
381
+ centralOffset + centralSize > eocd ||
382
+ centralOffset < 0 ||
383
+ centralSize < 0) {
384
+ throw invalidFormat("ZIP central directory is invalid.");
385
+ }
386
+ const entries = [];
387
+ let cursor = centralOffset;
388
+ let totalUncompressed = 0;
389
+ for (let index = 0; index < entryCount; index += 1) {
390
+ if (cursor + 46 > bytes.length || bytes.readUInt32LE(cursor) !== 0x02014b50) {
391
+ throw invalidFormat("ZIP central directory entry is invalid.");
392
+ }
393
+ const flags = bytes.readUInt16LE(cursor + 8);
394
+ const compression = bytes.readUInt16LE(cursor + 10);
395
+ const expectedCrc = bytes.readUInt32LE(cursor + 16);
396
+ const compressedSize = bytes.readUInt32LE(cursor + 20);
397
+ const uncompressedSize = bytes.readUInt32LE(cursor + 24);
398
+ const nameLength = bytes.readUInt16LE(cursor + 28);
399
+ const extraLength = bytes.readUInt16LE(cursor + 30);
400
+ const commentLength = bytes.readUInt16LE(cursor + 32);
401
+ const localOffset = bytes.readUInt32LE(cursor + 42);
402
+ const next = cursor + 46 + nameLength + extraLength + commentLength;
403
+ if (next > bytes.length || flags & 0x1) {
404
+ throw invalidFormat("Encrypted or truncated ZIP entries are unsupported.");
405
+ }
406
+ const name = bytes.subarray(cursor + 46, cursor + 46 + nameLength).toString("utf8");
407
+ if (!name || name.includes("\0") || name.startsWith("/") || name.split("/").includes("..")) {
408
+ throw invalidFormat("ZIP entry path is unsafe.");
409
+ }
410
+ totalUncompressed += uncompressedSize;
411
+ if (totalUncompressed > MAX_ARCHIVE_UNCOMPRESSED_BYTES) {
412
+ throw invalidFormat("ZIP uncompressed size exceeds the validation limit.");
413
+ }
414
+ if (localOffset + 30 > bytes.length || bytes.readUInt32LE(localOffset) !== 0x04034b50) {
415
+ throw invalidFormat("ZIP local entry header is invalid.");
416
+ }
417
+ const localNameLength = bytes.readUInt16LE(localOffset + 26);
418
+ const localExtraLength = bytes.readUInt16LE(localOffset + 28);
419
+ const dataOffset = localOffset + 30 + localNameLength + localExtraLength;
420
+ if (dataOffset + compressedSize > bytes.length) {
421
+ throw invalidFormat("ZIP entry data is truncated.");
422
+ }
423
+ const compressed = bytes.subarray(dataOffset, dataOffset + compressedSize);
424
+ let data;
425
+ if (compression === 0)
426
+ data = Buffer.from(compressed);
427
+ else if (compression === 8) {
428
+ try {
429
+ data = inflateRawSync(compressed, {
430
+ maxOutputLength: Math.min(MAX_ARCHIVE_UNCOMPRESSED_BYTES, Math.max(1, uncompressedSize)),
431
+ });
432
+ }
433
+ catch {
434
+ throw invalidFormat("ZIP deflate stream is invalid.");
435
+ }
436
+ }
437
+ else {
438
+ throw invalidFormat(`Unsupported ZIP compression method: ${compression}.`);
439
+ }
440
+ if (data.length !== uncompressedSize || crc32(data) !== expectedCrc) {
441
+ throw invalidFormat("ZIP entry size or CRC check failed.");
442
+ }
443
+ entries.push({ name, data });
444
+ cursor = next;
445
+ }
446
+ if (cursor !== centralOffset + centralSize) {
447
+ throw invalidFormat("ZIP central directory size does not match its entries.");
448
+ }
449
+ return entries;
450
+ }
451
+ function findZipEocd(bytes) {
452
+ const minimum = Math.max(0, bytes.length - 65_557);
453
+ for (let cursor = bytes.length - 22; cursor >= minimum; cursor -= 1) {
454
+ if (bytes.readUInt32LE(cursor) === 0x06054b50)
455
+ return cursor;
456
+ }
457
+ throw invalidFormat("ZIP end-of-central-directory marker is missing.");
458
+ }
459
+ function crc32(input) {
460
+ let crc = 0xffffffff;
461
+ for (const byte of input) {
462
+ crc ^= byte;
463
+ for (let bit = 0; bit < 8; bit += 1) {
464
+ crc = (crc >>> 1) ^ (crc & 1 ? 0xedb88320 : 0);
465
+ }
466
+ }
467
+ return (crc ^ 0xffffffff) >>> 0;
468
+ }
469
+ function boundedOptionalMetadata(value, label) {
470
+ if (value === undefined)
471
+ return null;
472
+ const normalized = sanitizeResearchText(value).replace(/\s+/g, " ").trim();
473
+ if (!normalized || normalized.length > 500) {
474
+ throw artifactError(`Artifact ${label} must contain 1-500 safe characters when provided.`, "RESEARCH_ARTIFACT_METADATA_INVALID");
475
+ }
476
+ return normalized;
477
+ }
478
+ function canonicalSourceUrl(value) {
479
+ if (!value)
480
+ return null;
481
+ let url;
482
+ try {
483
+ url = new URL(value);
484
+ }
485
+ catch {
486
+ throw artifactError("Artifact source URL is invalid.", "RESEARCH_ARTIFACT_SOURCE_INVALID");
487
+ }
488
+ if (url.protocol !== "https:" || url.username || url.password) {
489
+ throw artifactError("Artifact source URL must be public HTTPS without embedded credentials.", "RESEARCH_ARTIFACT_SOURCE_INVALID");
490
+ }
491
+ url.hash = "";
492
+ for (const key of [...url.searchParams.keys()]) {
493
+ if (SENSITIVE_QUERY_KEY.test(key)) {
494
+ throw artifactError("Artifact source URL contains a sensitive query parameter.", "RESEARCH_ARTIFACT_SOURCE_INVALID");
495
+ }
496
+ if (TRACKING_QUERY_KEY.test(key))
497
+ url.searchParams.delete(key);
498
+ }
499
+ url.searchParams.sort();
500
+ return url.toString();
501
+ }
502
+ function inferMediaType(path) {
503
+ const extension = extname(path).toLowerCase();
504
+ const byExtension = {
505
+ ".pdf": "application/pdf",
506
+ ".json": "application/json",
507
+ ".txt": "text/plain",
508
+ ".md": "text/markdown",
509
+ ".csv": "text/csv",
510
+ ".html": "text/html",
511
+ ".htm": "text/html",
512
+ ".zip": "application/zip",
513
+ ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
514
+ ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
515
+ ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
516
+ };
517
+ const mediaType = byExtension[extension];
518
+ if (!mediaType) {
519
+ throw artifactError("Cannot infer artifact media type; provide --media-type using a supported format.", "RESEARCH_ARTIFACT_MEDIA_TYPE_UNSUPPORTED");
520
+ }
521
+ return mediaType;
522
+ }
523
+ function normalizeMediaType(value) {
524
+ return value.trim().toLowerCase().split(";", 1)[0] ?? "";
525
+ }
526
+ function sanitizeFilename(value) {
527
+ const safe = sanitizeResearchText(value)
528
+ .replace(/[\r\n/\\]/g, "_")
529
+ .trim();
530
+ return (safe || "artifact").slice(0, 255);
531
+ }
532
+ function requireExactAbsolutePath(value) {
533
+ if (!value || /[\0\r\n]/.test(value) || resolve(value) !== value) {
534
+ throw artifactError("Artifact path must be an explicit canonical absolute file path.", "RESEARCH_ARTIFACT_PATH_INVALID");
535
+ }
536
+ return value;
537
+ }
538
+ function invalidFormat(message) {
539
+ return artifactError(message, "RESEARCH_ARTIFACT_FORMAT_INVALID");
540
+ }
541
+ function artifactError(message, code) {
542
+ return new CliError(message, { code, exitCode: 3 });
543
+ }
544
+ //# sourceMappingURL=artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../../src/research/workspace/artifacts.ts"],"names":[],"mappings":"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"}