@tiangong-ai/cli 0.0.58 → 0.0.60
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 +8 -2
- package/CONTRIBUTING.md +79 -0
- package/README.md +136 -21
- package/dist/cli.js +5 -0
- package/dist/cli.js.map +1 -1
- package/dist/research/orchestration.js +101 -44
- package/dist/research/orchestration.js.map +1 -1
- package/dist/research/workspace/acquisition-forecast.d.ts +3 -0
- package/dist/research/workspace/acquisition-forecast.js +28 -3
- package/dist/research/workspace/acquisition-forecast.js.map +1 -1
- package/dist/research/workspace/acquisition-revision.d.ts +13 -0
- package/dist/research/workspace/acquisition-revision.js +142 -0
- package/dist/research/workspace/acquisition-revision.js.map +1 -0
- package/dist/research/workspace/acquisition.d.ts +3 -1
- package/dist/research/workspace/acquisition.js +67 -35
- package/dist/research/workspace/acquisition.js.map +1 -1
- package/dist/research/workspace/analysis-run.d.ts +2 -0
- package/dist/research/workspace/analysis-run.js +28 -0
- package/dist/research/workspace/analysis-run.js.map +1 -0
- package/dist/research/workspace/artifacts.d.ts +3 -0
- package/dist/research/workspace/artifacts.js +13 -0
- package/dist/research/workspace/artifacts.js.map +1 -1
- package/dist/research/workspace/audit-bundle.d.ts +5 -0
- package/dist/research/workspace/audit-bundle.js +17 -0
- package/dist/research/workspace/audit-bundle.js.map +1 -1
- package/dist/research/workspace/content-evidence.d.ts +3 -0
- package/dist/research/workspace/content-evidence.js +149 -22
- package/dist/research/workspace/content-evidence.js.map +1 -1
- package/dist/research/workspace/project-authority.d.ts +21 -0
- package/dist/research/workspace/project-authority.js +186 -0
- package/dist/research/workspace/project-authority.js.map +1 -0
- package/dist/research/workspace/project-mutations.d.ts +26 -0
- package/dist/research/workspace/project-mutations.js +330 -0
- package/dist/research/workspace/project-mutations.js.map +1 -0
- package/dist/research/workspace/projects.d.ts +2 -1
- package/dist/research/workspace/projects.js +132 -91
- package/dist/research/workspace/projects.js.map +1 -1
- package/dist/research/workspace/publication-workflow.d.ts +3 -0
- package/dist/research/workspace/publication-workflow.js +15 -3
- package/dist/research/workspace/publication-workflow.js.map +1 -1
- package/dist/research/workspace/runtime.d.ts +5 -0
- package/dist/research/workspace/runtime.js +83 -54
- package/dist/research/workspace/runtime.js.map +1 -1
- package/dist/research/workspace/schemas.d.ts +6 -0
- package/dist/research/workspace/schemas.js +13 -2
- package/dist/research/workspace/schemas.js.map +1 -1
- package/dist/research/workspace/scientific-review-execution.js +2 -0
- package/dist/research/workspace/scientific-review-execution.js.map +1 -1
- package/dist/research/workspace/scientific-review.d.ts +3 -1
- package/dist/research/workspace/scientific-review.js +9 -2
- package/dist/research/workspace/scientific-review.js.map +1 -1
- package/dist/research/workspace/setup-catalog.js +3 -3
- package/dist/research/workspace/task-acceptance.d.ts +126 -0
- package/dist/research/workspace/task-acceptance.js +480 -0
- package/dist/research/workspace/task-acceptance.js.map +1 -0
- package/dist/research/workspace/task-audit.d.ts +12 -0
- package/dist/research/workspace/task-audit.js +181 -0
- package/dist/research/workspace/task-audit.js.map +1 -0
- package/dist/research/workspace/task-contract.d.ts +139 -0
- package/dist/research/workspace/task-contract.js +485 -0
- package/dist/research/workspace/task-contract.js.map +1 -0
- package/dist/research/workspace/workspace.js +11 -8
- package/dist/research/workspace/workspace.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { CliError } from "../../errors.js";
|
|
4
|
+
import { compileTaskAcceptanceContext, taskRecordStatus, taskRequirementRows, validateTaskAcceptanceRecord, validateTaskReview, } from "./task-acceptance.js";
|
|
5
|
+
import { latestTaskBinding, loadTaskHistory, taskRequirementSha256, validateTaskObject, } from "./task-contract.js";
|
|
6
|
+
import { canonicalJson, isObject, resolveContained, sha256Text, writeJsonAtomic, } from "./storage.js";
|
|
7
|
+
const HASH = /^[a-f0-9]{64}$/;
|
|
8
|
+
/** Derived export view, not a second mutable task state. */
|
|
9
|
+
export async function writeTaskAuditContext(root, project, destination) {
|
|
10
|
+
const context = await compileTaskAcceptanceContext(root, project);
|
|
11
|
+
if (!context)
|
|
12
|
+
return undefined;
|
|
13
|
+
await writeJsonAtomic(join(destination, "state/task-acceptance.json"), context, 0o444);
|
|
14
|
+
return {
|
|
15
|
+
contractSha256: context.contractSha256,
|
|
16
|
+
originalContractSha256: context.originalContractSha256,
|
|
17
|
+
contextSha256: context.contextSha256,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/** Verify new task relationships using only the bundle's already indexed exact files. */
|
|
21
|
+
export async function verifyTaskAudit(bundle, projectId, binding, files) {
|
|
22
|
+
const indexed = new Map(files.map((file) => [file.path, file]));
|
|
23
|
+
const json = new Map();
|
|
24
|
+
const read = async (path) => {
|
|
25
|
+
if (!json.has(path)) {
|
|
26
|
+
const expected = indexed.get(path);
|
|
27
|
+
if (!expected || expected.bytes > 16 * 1024 * 1024)
|
|
28
|
+
throw invalid("Task audit reference is missing or oversized.");
|
|
29
|
+
const text = await readFile(resolveContained(bundle, path), "utf8");
|
|
30
|
+
if (Buffer.byteLength(text) !== expected.bytes || sha256Text(text) !== expected.sha256)
|
|
31
|
+
throw invalid("Task audit bytes changed during verification.");
|
|
32
|
+
try {
|
|
33
|
+
json.set(path, JSON.parse(text));
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
throw invalid("Task audit object is not valid JSON.");
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return json.get(path);
|
|
40
|
+
};
|
|
41
|
+
const proof = await read("state/journal-event-proofs.json");
|
|
42
|
+
if (!Array.isArray(proof.events))
|
|
43
|
+
throw invalid("Task audit requires its journal proof view.");
|
|
44
|
+
const events = proof.events.filter((event) => event.scope === projectId);
|
|
45
|
+
const currentBinding = latestTaskBinding(events, projectId);
|
|
46
|
+
if (!currentBinding) {
|
|
47
|
+
if (binding || indexed.has("state/task-acceptance.json"))
|
|
48
|
+
throw invalid("Task audit has no committed task authority.");
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
if (!binding || currentBinding.contractSha256 !== binding.contractSha256)
|
|
52
|
+
throw invalid("Audit task binding does not match its committed task.");
|
|
53
|
+
const objectReader = async (group, hash, hashField) => {
|
|
54
|
+
if (!["contracts", "proposals", "acceptance"].includes(group) || !HASH.test(hash))
|
|
55
|
+
throw invalid("Task audit object address is invalid.");
|
|
56
|
+
return validateTaskObject(await read(`project/task/${group}/${hash}.json`), hash, hashField);
|
|
57
|
+
};
|
|
58
|
+
const history = await loadTaskHistory(projectId, binding.contractSha256, objectReader);
|
|
59
|
+
if (history.original.contractSha256 !== binding.originalContractSha256)
|
|
60
|
+
throw invalid("Audit original requirement binding is inconsistent.");
|
|
61
|
+
const project = await read("state/project.json");
|
|
62
|
+
if (project.id !== projectId || history.current.questionSha256 !== sha256Text(project.question))
|
|
63
|
+
throw invalid("Audit task belongs to a different research question.");
|
|
64
|
+
const context = validateTaskObject(await read("state/task-acceptance.json"), binding.contextSha256, "contextSha256");
|
|
65
|
+
if (context.schemaVersion !== 1 ||
|
|
66
|
+
context.projectId !== projectId ||
|
|
67
|
+
context.contractSha256 !== binding.contractSha256 ||
|
|
68
|
+
context.originalContractSha256 !== binding.originalContractSha256 ||
|
|
69
|
+
context.originalRequest !== history.original.originalRequest ||
|
|
70
|
+
!Array.isArray(context.requirements) ||
|
|
71
|
+
!Array.isArray(context.results))
|
|
72
|
+
throw invalid("Audit task view has inconsistent identity.");
|
|
73
|
+
const contracts = new Map(history.contracts.map((contract) => [contract.contractSha256, contract]));
|
|
74
|
+
const latest = new Map();
|
|
75
|
+
let activeContract = null;
|
|
76
|
+
for (const event of events) {
|
|
77
|
+
const isTaskAuthority = latestTaskBinding([event], projectId);
|
|
78
|
+
if (event.type.startsWith("project.task.") || isTaskAuthority) {
|
|
79
|
+
if (event.sourcePayloadSha256 !== sha256Text(canonicalJson(event.payload)))
|
|
80
|
+
throw invalid("Task audit journal payload changed from its source proof.");
|
|
81
|
+
}
|
|
82
|
+
if (isTaskAuthority)
|
|
83
|
+
activeContract = String(isTaskAuthority.contractSha256);
|
|
84
|
+
if (event.type !== "project.task.acceptance.recorded")
|
|
85
|
+
continue;
|
|
86
|
+
const record = validateTaskAcceptanceRecord(await objectReader("acceptance", String(event.payload.recordSha256), "recordSha256"), projectId);
|
|
87
|
+
const contract = activeContract ? contracts.get(activeContract) : null;
|
|
88
|
+
const requirement = contract?.requirements.find((item) => taskRequirementSha256(item) === record.requirementSha256);
|
|
89
|
+
if (!requirement ||
|
|
90
|
+
requirement.id !== record.requirementId ||
|
|
91
|
+
requirement.checkKind !== record.checkKind ||
|
|
92
|
+
event.payload.requirementSha256 !== record.requirementSha256 ||
|
|
93
|
+
(latest.get(record.requirementSha256)?.recordSha256 ?? null) !== record.previousRecordSha256)
|
|
94
|
+
throw invalid("Audit check history is not bound to its active requirement or previous record.");
|
|
95
|
+
latest.set(record.requirementSha256, record);
|
|
96
|
+
for (const result of record.results) {
|
|
97
|
+
const file = indexed.get(`project/${result.path}`);
|
|
98
|
+
if (!file || file.sha256 !== result.sha256 || file.bytes !== result.bytes)
|
|
99
|
+
throw invalid("Audit native check result is missing or inconsistent.");
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const references = {
|
|
103
|
+
ready: project.packages.find((item) => item.stage === "acquire")?.status === "complete",
|
|
104
|
+
sources: new Map(),
|
|
105
|
+
atoms: new Map(),
|
|
106
|
+
findings: new Map(),
|
|
107
|
+
};
|
|
108
|
+
if (references.ready && latest.size) {
|
|
109
|
+
const acquisition = await read("project/outputs/evidence-snapshot.json");
|
|
110
|
+
validateTaskObject(acquisition, acquisition.snapshotSha256, "snapshotSha256");
|
|
111
|
+
const evidenceFile = indexed.get(`project/${acquisition.evidenceRecord.path}`);
|
|
112
|
+
if (evidenceFile?.sha256 !== acquisition.evidenceRecord.sha256)
|
|
113
|
+
throw invalid("Audit source metadata is not snapshot-bound.");
|
|
114
|
+
const evidence = await read(`project/${acquisition.evidenceRecord.path}`);
|
|
115
|
+
const included = new Set(acquisition.sources.map((source) => source.id));
|
|
116
|
+
for (const source of evidence.sources)
|
|
117
|
+
if (included.has(String(source.id)))
|
|
118
|
+
references.sources.set(String(source.id), sha256Text(canonicalJson(source)));
|
|
119
|
+
if (indexed.has("project/outputs/content-snapshot.json")) {
|
|
120
|
+
const content = await read("project/outputs/content-snapshot.json");
|
|
121
|
+
validateTaskObject(content, content.snapshotSha256, "snapshotSha256");
|
|
122
|
+
if (content.acquisitionSnapshotSha256 === acquisition.snapshotSha256) {
|
|
123
|
+
const artifacts = new Map(acquisition.artifacts.map((item) => [item.artifactId, item]));
|
|
124
|
+
const sourceArtifacts = new Map(acquisition.sources.map((item) => [item.id, new Set(item.artifactIds)]));
|
|
125
|
+
for (const atom of content.atoms) {
|
|
126
|
+
const artifact = artifacts.get(atom.artifactId);
|
|
127
|
+
if (!artifact ||
|
|
128
|
+
artifact.sha256 !== atom.artifactSha256 ||
|
|
129
|
+
artifact.candidateId !== atom.candidateId ||
|
|
130
|
+
!sourceArtifacts.get(atom.sourceId)?.has(atom.artifactId))
|
|
131
|
+
throw invalid("Audit atom no longer belongs to the selected source artifact.");
|
|
132
|
+
references.atoms.set(atom.atomId, atom.atomSha256);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (project.packages.find((item) => item.stage === "analyze")?.status === "complete") {
|
|
137
|
+
const graph = await read("project/outputs/claim-evidence-graph.json");
|
|
138
|
+
if (indexed.get("project/outputs/analysis.json")?.sha256 !== graph.analysisSha256)
|
|
139
|
+
throw invalid("Audit analysis is not graph-bound.");
|
|
140
|
+
const analysis = await read("project/outputs/analysis.json");
|
|
141
|
+
for (const finding of analysis.findings)
|
|
142
|
+
references.findings.set(String(finding.id), sha256Text(canonicalJson(finding)));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const expectedRows = taskRequirementRows(history);
|
|
146
|
+
const results = new Map();
|
|
147
|
+
for (const [hash, row] of expectedRows) {
|
|
148
|
+
const record = latest.get(hash);
|
|
149
|
+
if (!record)
|
|
150
|
+
continue;
|
|
151
|
+
row.record = record;
|
|
152
|
+
row.status = taskRecordStatus(record, references, project);
|
|
153
|
+
for (const result of record.results)
|
|
154
|
+
results.set(result.sha256, result);
|
|
155
|
+
}
|
|
156
|
+
if (canonicalJson([...expectedRows.values()]) !== canonicalJson(context.requirements) ||
|
|
157
|
+
canonicalJson([...results.values()].sort((a, b) => a.sha256.localeCompare(b.sha256))) !==
|
|
158
|
+
canonicalJson(context.results))
|
|
159
|
+
throw invalid("Audit task view disagrees with the verified requirements, check records or current dependencies.");
|
|
160
|
+
if (project.packages.find((item) => item.stage === "review")?.status === "complete") {
|
|
161
|
+
const review = await read("project/outputs/review.json");
|
|
162
|
+
const completed = events.findLast((event) => event.type === "package.completed" && event.payload.packageId === "review");
|
|
163
|
+
if (!Array.isArray(completed?.payload.outputs) ||
|
|
164
|
+
!completed.payload.outputs.some((item) => isObject(item) &&
|
|
165
|
+
item.path === "outputs/review.json" &&
|
|
166
|
+
item.sha256 === indexed.get("project/outputs/review.json")?.sha256))
|
|
167
|
+
throw invalid("Audit review has no matching promoted result.");
|
|
168
|
+
const hash = String(review.packetSha256);
|
|
169
|
+
if (!HASH.test(hash))
|
|
170
|
+
throw invalid("Audit review packet identity is invalid.");
|
|
171
|
+
const packet = validateTaskObject(await read(`project/review/packets/${hash}.json`), hash, "packetSha256");
|
|
172
|
+
if (packet.taskAcceptance?.contextSha256 !== context.contextSha256)
|
|
173
|
+
throw invalid("Audit review task context is stale.");
|
|
174
|
+
validateTaskReview(review, context);
|
|
175
|
+
}
|
|
176
|
+
return { ...binding, executionCertified: false };
|
|
177
|
+
}
|
|
178
|
+
function invalid(message) {
|
|
179
|
+
return new CliError(message, { code: "RESEARCH_AUDIT_BUNDLE_INVALID", exitCode: 3 });
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=task-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-audit.js","sourceRoot":"","sources":["../../../src/research/workspace/task-audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import type { JournalEvent, ProjectState } from "./types.js";
|
|
2
|
+
declare const inputSchemas: {
|
|
3
|
+
"task-contract": {
|
|
4
|
+
type: string;
|
|
5
|
+
additionalProperties: boolean;
|
|
6
|
+
required: string[];
|
|
7
|
+
properties: Record<string, unknown>;
|
|
8
|
+
};
|
|
9
|
+
"task-scope-change": {
|
|
10
|
+
type: string;
|
|
11
|
+
additionalProperties: boolean;
|
|
12
|
+
required: string[];
|
|
13
|
+
properties: Record<string, unknown>;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
type TaskSchemaName = keyof typeof inputSchemas;
|
|
17
|
+
export interface TaskRequirement {
|
|
18
|
+
id: string;
|
|
19
|
+
text: string;
|
|
20
|
+
acceptance: string;
|
|
21
|
+
checkKind: "evidence" | "computation" | "proof";
|
|
22
|
+
designClaimIds: string[];
|
|
23
|
+
coverageDimensionIds: string[];
|
|
24
|
+
}
|
|
25
|
+
export interface TaskContract {
|
|
26
|
+
schemaVersion: 1;
|
|
27
|
+
kind: "tiangong-research-task";
|
|
28
|
+
projectId: string;
|
|
29
|
+
version: number;
|
|
30
|
+
questionSha256: string;
|
|
31
|
+
originalRequest: string;
|
|
32
|
+
requirements: TaskRequirement[];
|
|
33
|
+
parentContractSha256: string | null;
|
|
34
|
+
originalContractSha256: string | null;
|
|
35
|
+
origin: {
|
|
36
|
+
projectId: string;
|
|
37
|
+
contractSha256: string;
|
|
38
|
+
} | null;
|
|
39
|
+
authorization: {
|
|
40
|
+
kind: "operator-confirmation";
|
|
41
|
+
proposalSha256: string;
|
|
42
|
+
} | null;
|
|
43
|
+
contractSha256: string;
|
|
44
|
+
}
|
|
45
|
+
export interface ProjectTaskView {
|
|
46
|
+
current: TaskContract;
|
|
47
|
+
original: TaskContract;
|
|
48
|
+
contracts: TaskContract[];
|
|
49
|
+
events: JournalEvent[];
|
|
50
|
+
}
|
|
51
|
+
export type TaskObjectReader = <T>(group: string, hash: string, hashField: string) => Promise<T>;
|
|
52
|
+
export declare function latestTaskBinding(events: Array<Pick<JournalEvent, "scope" | "type" | "payload">>, projectId: string): Record<string, unknown> | null;
|
|
53
|
+
export declare function isTaskSchemaName(value: string): value is TaskSchemaName;
|
|
54
|
+
export declare function taskInputSchema(name: TaskSchemaName): Record<string, unknown>;
|
|
55
|
+
export declare function taskRequirementSha256(item: TaskRequirement): string;
|
|
56
|
+
export declare function loadProjectTask(root: string, projectId: string, knownEvents?: JournalEvent[]): Promise<ProjectTaskView | null>;
|
|
57
|
+
/** Shared live/audit relationship validation over already hash-verified immutable objects. */
|
|
58
|
+
export declare function loadTaskHistory(projectId: string, currentHash: string, read: TaskObjectReader): Promise<{
|
|
59
|
+
current: TaskContract;
|
|
60
|
+
original: TaskContract;
|
|
61
|
+
contracts: TaskContract[];
|
|
62
|
+
}>;
|
|
63
|
+
export declare function defineProjectTask(root: string, projectId: string, value: Record<string, unknown>): Promise<{
|
|
64
|
+
contractSha256: string;
|
|
65
|
+
originalContractSha256: string;
|
|
66
|
+
version: number;
|
|
67
|
+
}>;
|
|
68
|
+
export declare function proposeProjectTaskScope(root: string, projectId: string, expectedContractSha256: string, value: Record<string, unknown>): Promise<{
|
|
69
|
+
status: string;
|
|
70
|
+
requiresApproval: boolean;
|
|
71
|
+
contractSha256: string;
|
|
72
|
+
changes: {
|
|
73
|
+
details: {
|
|
74
|
+
id: string;
|
|
75
|
+
before: TaskRequirement | null;
|
|
76
|
+
after: TaskRequirement | null;
|
|
77
|
+
}[];
|
|
78
|
+
addedRequirementIds: string[];
|
|
79
|
+
changedRequirementIds: string[];
|
|
80
|
+
withdrawnRequirementIds: string[];
|
|
81
|
+
};
|
|
82
|
+
proposalSha256?: never;
|
|
83
|
+
parentContractSha256?: never;
|
|
84
|
+
} | {
|
|
85
|
+
contractSha256?: never;
|
|
86
|
+
status: string;
|
|
87
|
+
requiresApproval: boolean;
|
|
88
|
+
proposalSha256: string;
|
|
89
|
+
parentContractSha256: string;
|
|
90
|
+
changes: {
|
|
91
|
+
details: {
|
|
92
|
+
id: string;
|
|
93
|
+
before: TaskRequirement | null;
|
|
94
|
+
after: TaskRequirement | null;
|
|
95
|
+
}[];
|
|
96
|
+
addedRequirementIds: string[];
|
|
97
|
+
changedRequirementIds: string[];
|
|
98
|
+
withdrawnRequirementIds: string[];
|
|
99
|
+
};
|
|
100
|
+
}>;
|
|
101
|
+
export declare function approveProjectTaskScope(root: string, projectId: string, proposalSha256: string, confirmation: string | undefined): Promise<{
|
|
102
|
+
replayed: boolean;
|
|
103
|
+
} | {
|
|
104
|
+
projectId: string;
|
|
105
|
+
proposalSha256: string;
|
|
106
|
+
authorizationKind: string;
|
|
107
|
+
replayed: boolean;
|
|
108
|
+
contractSha256: string;
|
|
109
|
+
originalContractSha256: string;
|
|
110
|
+
version: number;
|
|
111
|
+
}>;
|
|
112
|
+
/** Materialize before a fork/addendum's existing commit; never copy completion claims. */
|
|
113
|
+
export declare function inheritProjectTask(root: string, source: ProjectState, target: ProjectState): Promise<{
|
|
114
|
+
contractSha256: string;
|
|
115
|
+
originalContractSha256: string;
|
|
116
|
+
version: number;
|
|
117
|
+
} | null>;
|
|
118
|
+
export declare function taskContext(root: string, projectId: string, knownEvents?: JournalEvent[]): Promise<{
|
|
119
|
+
originalRequest: string;
|
|
120
|
+
requirements: TaskRequirement[];
|
|
121
|
+
originalRequirementRefs: {
|
|
122
|
+
id: string;
|
|
123
|
+
requirementSha256: string;
|
|
124
|
+
}[];
|
|
125
|
+
originalOnlyRequirements: TaskRequirement[];
|
|
126
|
+
origin: {
|
|
127
|
+
projectId: string;
|
|
128
|
+
contractSha256: string;
|
|
129
|
+
} | null;
|
|
130
|
+
executionCertified: boolean;
|
|
131
|
+
contractSha256: string;
|
|
132
|
+
originalContractSha256: string;
|
|
133
|
+
version: number;
|
|
134
|
+
} | null>;
|
|
135
|
+
export declare function writeTaskObject(root: string, projectId: string, group: string, hash: string, value: object): Promise<void>;
|
|
136
|
+
export declare function readTaskObject<T>(root: string, projectId: string, group: string, hash: string, hashField: string): Promise<T>;
|
|
137
|
+
export declare function validateTaskObject<T>(record: unknown, hash: string, hashField: string): T;
|
|
138
|
+
export declare function taskDirectory(root: string, projectId: string, group: string, create: boolean): Promise<string>;
|
|
139
|
+
export {};
|