@tiangong-ai/cli 0.0.59 → 0.0.61
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 +2 -2
- package/README.md +287 -41
- package/dist/research/orchestration.js +209 -62
- 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-routes.d.ts +1 -1
- package/dist/research/workspace/acquisition-routes.js +2 -11
- package/dist/research/workspace/acquisition-routes.js.map +1 -1
- 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/artifact-read-audit.d.ts +16 -0
- package/dist/research/workspace/artifact-read-audit.js +176 -0
- package/dist/research/workspace/artifact-read-audit.js.map +1 -0
- package/dist/research/workspace/artifact-trace.d.ts +12 -0
- package/dist/research/workspace/artifact-trace.js +109 -0
- package/dist/research/workspace/artifact-trace.js.map +1 -0
- package/dist/research/workspace/artifact-view-mcp.d.ts +75 -0
- package/dist/research/workspace/artifact-view-mcp.js +214 -0
- package/dist/research/workspace/artifact-view-mcp.js.map +1 -0
- package/dist/research/workspace/artifact-views.d.ts +100 -0
- package/dist/research/workspace/artifact-views.js +395 -0
- package/dist/research/workspace/artifact-views.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 +9 -0
- package/dist/research/workspace/audit-bundle.js +124 -8
- 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/executor.d.ts +5 -1
- package/dist/research/workspace/executor.js +106 -22
- package/dist/research/workspace/executor.js.map +1 -1
- package/dist/research/workspace/native-run.d.ts +77 -0
- package/dist/research/workspace/native-run.js +637 -0
- package/dist/research/workspace/native-run.js.map +1 -0
- package/dist/research/workspace/preflight.d.ts +8 -2
- package/dist/research/workspace/preflight.js +17 -14
- package/dist/research/workspace/preflight.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 +332 -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 +133 -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/request-provenance.d.ts +67 -0
- package/dist/research/workspace/request-provenance.js +115 -0
- package/dist/research/workspace/request-provenance.js.map +1 -0
- package/dist/research/workspace/review-executor.js +22 -11
- package/dist/research/workspace/review-executor.js.map +1 -1
- package/dist/research/workspace/runtime.d.ts +57 -0
- package/dist/research/workspace/runtime.js +292 -140
- package/dist/research/workspace/runtime.js.map +1 -1
- package/dist/research/workspace/sanitization.js +1 -1
- package/dist/research/workspace/sanitization.js.map +1 -1
- package/dist/research/workspace/schema-compatibility.d.ts +5 -0
- package/dist/research/workspace/schema-compatibility.js +55 -0
- package/dist/research/workspace/schema-compatibility.js.map +1 -0
- 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-design.js +8 -17
- package/dist/research/workspace/scientific-design.js.map +1 -1
- package/dist/research/workspace/scientific-fulfillment-audit.d.ts +3 -0
- package/dist/research/workspace/scientific-fulfillment-audit.js +137 -0
- package/dist/research/workspace/scientific-fulfillment-audit.js.map +1 -0
- package/dist/research/workspace/scientific-fulfillment.d.ts +121 -0
- package/dist/research/workspace/scientific-fulfillment.js +539 -0
- package/dist/research/workspace/scientific-fulfillment.js.map +1 -0
- package/dist/research/workspace/scientific-review-execution.js +84 -61
- package/dist/research/workspace/scientific-review-execution.js.map +1 -1
- package/dist/research/workspace/scientific-review.d.ts +8 -2
- package/dist/research/workspace/scientific-review.js +205 -53
- package/dist/research/workspace/scientific-review.js.map +1 -1
- package/dist/research/workspace/setup-catalog.js +2 -2
- package/dist/research/workspace/task-acceptance.d.ts +134 -0
- package/dist/research/workspace/task-acceptance.js +544 -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 +231 -0
- package/dist/research/workspace/task-audit.js.map +1 -0
- package/dist/research/workspace/task-contract.d.ts +142 -0
- package/dist/research/workspace/task-contract.js +506 -0
- package/dist/research/workspace/task-contract.js.map +1 -0
- package/dist/research/workspace/types.d.ts +6 -3
- package/dist/research/workspace/workspace.js +11 -8
- package/dist/research/workspace/workspace.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,506 @@
|
|
|
1
|
+
import { Ajv2020 } from "ajv/dist/2020.js";
|
|
2
|
+
import { lstat, mkdir, readFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { CliError } from "../../errors.js";
|
|
5
|
+
import { loadBoundAcquisitionDesign } from "./acquisition-routes.js";
|
|
6
|
+
import { appendJournalEvent, readVerifiedJournal } from "./journal.js";
|
|
7
|
+
import { assertProjectAuthority, projectAuthorityIndex } from "./project-authority.js";
|
|
8
|
+
import { beginProjectMutation, prepareProjectMutation, projectMutationBinding, settleProjectMutation, } from "./project-mutations.js";
|
|
9
|
+
import { loadProject } from "./projects.js";
|
|
10
|
+
import { prepareRequestProvenance, requestProvenanceInputSchema, unrecordedRequestProvenance, verifyRequestProvenance, } from "./request-provenance.js";
|
|
11
|
+
import { configuredResearchSecrets, sanitizeResearchValue } from "./sanitization.js";
|
|
12
|
+
import { canonicalJson, isObject, pathExists, sha256Text, workspacePaths, writeJsonAtomic, } from "./storage.js";
|
|
13
|
+
import { withWorkspaceLock } from "./workspace.js";
|
|
14
|
+
const HASH = /^[a-f0-9]{64}$/;
|
|
15
|
+
const ID = "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$";
|
|
16
|
+
const MAX_BYTES = 4 * 1024 * 1024;
|
|
17
|
+
const object = (properties) => ({
|
|
18
|
+
type: "object",
|
|
19
|
+
additionalProperties: false,
|
|
20
|
+
required: Object.keys(properties),
|
|
21
|
+
properties,
|
|
22
|
+
});
|
|
23
|
+
const ids = {
|
|
24
|
+
type: "array",
|
|
25
|
+
maxItems: 256,
|
|
26
|
+
uniqueItems: true,
|
|
27
|
+
items: { type: "string", pattern: ID },
|
|
28
|
+
};
|
|
29
|
+
const requirement = object({
|
|
30
|
+
id: { type: "string", pattern: ID },
|
|
31
|
+
text: { type: "string", minLength: 8, maxLength: 2000 },
|
|
32
|
+
acceptance: { type: "string", minLength: 8, maxLength: 4000 },
|
|
33
|
+
checkKind: { enum: ["evidence", "computation", "proof"] },
|
|
34
|
+
designClaimIds: ids,
|
|
35
|
+
coverageDimensionIds: ids,
|
|
36
|
+
});
|
|
37
|
+
const requirements = { type: "array", minItems: 1, maxItems: 256, items: requirement };
|
|
38
|
+
const inputSchemas = {
|
|
39
|
+
"task-contract": {
|
|
40
|
+
...object({
|
|
41
|
+
schemaVersion: { const: 1 },
|
|
42
|
+
originalRequest: { type: "string", minLength: 8 },
|
|
43
|
+
requirements,
|
|
44
|
+
requestProvenance: requestProvenanceInputSchema,
|
|
45
|
+
}),
|
|
46
|
+
required: ["schemaVersion", "originalRequest", "requirements"],
|
|
47
|
+
},
|
|
48
|
+
"task-scope-change": object({
|
|
49
|
+
schemaVersion: { const: 1 },
|
|
50
|
+
reason: { type: "string", minLength: 8, maxLength: 4000 },
|
|
51
|
+
requirements,
|
|
52
|
+
}),
|
|
53
|
+
};
|
|
54
|
+
const ajv = new Ajv2020({ strict: false, allErrors: true });
|
|
55
|
+
const validators = new Map();
|
|
56
|
+
export function latestTaskBinding(events, projectId) {
|
|
57
|
+
const latest = events.findLast((event) => event.scope === projectId &&
|
|
58
|
+
(["project.task.defined", "project.task.scope.approved"].includes(event.type) ||
|
|
59
|
+
(["project.forked", "project.addendum.created"].includes(event.type) &&
|
|
60
|
+
isObject(event.payload.taskContract))));
|
|
61
|
+
return latest
|
|
62
|
+
? isObject(latest.payload.taskContract)
|
|
63
|
+
? latest.payload.taskContract
|
|
64
|
+
: latest.payload
|
|
65
|
+
: null;
|
|
66
|
+
}
|
|
67
|
+
export function isTaskSchemaName(value) {
|
|
68
|
+
return Object.hasOwn(inputSchemas, value);
|
|
69
|
+
}
|
|
70
|
+
export function taskInputSchema(name) {
|
|
71
|
+
return structuredClone({
|
|
72
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
73
|
+
$id: `urn:tiangong:research:${name}:v1`,
|
|
74
|
+
...inputSchemas[name],
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
function validateInput(name, value) {
|
|
78
|
+
const validate = validators.get(name) ?? ajv.compile(taskInputSchema(name));
|
|
79
|
+
validators.set(name, validate);
|
|
80
|
+
if (Buffer.byteLength(JSON.stringify(value) ?? "") > MAX_BYTES ||
|
|
81
|
+
!validate(value) ||
|
|
82
|
+
!isObject(value) ||
|
|
83
|
+
canonicalJson(sanitizeResearchValue(value, configuredResearchSecrets(process.env))) !==
|
|
84
|
+
canonicalJson(value)) {
|
|
85
|
+
throw invalid("Task input must match its closed schema and contain no credentials.");
|
|
86
|
+
}
|
|
87
|
+
const items = value.requirements;
|
|
88
|
+
if (new Set(items.map((item) => item.id)).size !== items.length ||
|
|
89
|
+
items.some((item) => item.text.trim().length < 8 || item.acceptance.trim().length < 8)) {
|
|
90
|
+
throw invalid("Task requirements need unique stable IDs and meaningful acceptance conditions.");
|
|
91
|
+
}
|
|
92
|
+
return value;
|
|
93
|
+
}
|
|
94
|
+
export function taskRequirementSha256(item) {
|
|
95
|
+
return sha256Text(canonicalJson(item));
|
|
96
|
+
}
|
|
97
|
+
export async function loadProjectTask(root, projectId, knownEvents) {
|
|
98
|
+
if (knownEvents === undefined &&
|
|
99
|
+
!(await pathExists(join(workspacePaths(root).projects, projectId, "task"))))
|
|
100
|
+
return null;
|
|
101
|
+
const events = (knownEvents ?? (await readVerifiedJournal(workspacePaths(root).journal))).filter((event) => event.scope === projectId);
|
|
102
|
+
const binding = latestTaskBinding(events, projectId);
|
|
103
|
+
if (!binding)
|
|
104
|
+
return null;
|
|
105
|
+
const history = await loadTaskHistory(projectId, String(binding.contractSha256), (group, hash, hashField) => readTaskObject(root, projectId, group, hash, hashField));
|
|
106
|
+
return { ...history, events };
|
|
107
|
+
}
|
|
108
|
+
/** Shared live/audit relationship validation over already hash-verified immutable objects. */
|
|
109
|
+
export async function loadTaskHistory(projectId, currentHash, read) {
|
|
110
|
+
const readContract = async (hash) => validateTaskContract(await read("contracts", hash, "contractSha256"));
|
|
111
|
+
const current = await readContract(currentHash);
|
|
112
|
+
if (current.projectId !== projectId)
|
|
113
|
+
throw invalid("Current task contract belongs to another project.");
|
|
114
|
+
const contracts = [current];
|
|
115
|
+
const seen = new Set([current.contractSha256]);
|
|
116
|
+
let cursor = current;
|
|
117
|
+
while (cursor.parentContractSha256) {
|
|
118
|
+
if (seen.has(cursor.parentContractSha256) || contracts.length >= 1000)
|
|
119
|
+
throw invalid("Task history is cyclic or exceeds its bound.");
|
|
120
|
+
const parent = await readContract(cursor.parentContractSha256);
|
|
121
|
+
if (cursor.version !== parent.version + 1 ||
|
|
122
|
+
cursor.originalRequest !== parent.originalRequest ||
|
|
123
|
+
canonicalJson(cursor.requestProvenance ?? unrecordedRequestProvenance()) !==
|
|
124
|
+
canonicalJson(parent.requestProvenance ?? unrecordedRequestProvenance()) ||
|
|
125
|
+
(cursor.projectId !== parent.projectId &&
|
|
126
|
+
(cursor.origin?.projectId !== parent.projectId ||
|
|
127
|
+
cursor.origin.contractSha256 !== parent.contractSha256))) {
|
|
128
|
+
throw invalid("Task history parent identity is inconsistent.");
|
|
129
|
+
}
|
|
130
|
+
contracts.push(parent);
|
|
131
|
+
seen.add(parent.contractSha256);
|
|
132
|
+
cursor = parent;
|
|
133
|
+
}
|
|
134
|
+
const original = contracts.at(-1);
|
|
135
|
+
await verifyRequestProvenance(original.originalRequest, original.requestProvenance, read);
|
|
136
|
+
if (current.originalContractSha256 !== null &&
|
|
137
|
+
current.originalContractSha256 !== original.contractSha256)
|
|
138
|
+
throw invalid("Task original requirement binding drifted.");
|
|
139
|
+
for (const contract of contracts) {
|
|
140
|
+
if (!contract.authorization)
|
|
141
|
+
continue;
|
|
142
|
+
const proposal = await read("proposals", contract.authorization.proposalSha256, "proposalSha256");
|
|
143
|
+
if (proposal.parentContractSha256 !== contract.parentContractSha256 ||
|
|
144
|
+
canonicalJson(proposal.requirements) !== canonicalJson(contract.requirements))
|
|
145
|
+
throw invalid("Task scope authorization does not bind this exact change.");
|
|
146
|
+
}
|
|
147
|
+
return { current, original, contracts };
|
|
148
|
+
}
|
|
149
|
+
export async function defineProjectTask(root, projectId, value) {
|
|
150
|
+
const input = validateInput("task-contract", value);
|
|
151
|
+
const provenance = prepareRequestProvenance(input.originalRequest, input.requestProvenance);
|
|
152
|
+
return withWorkspaceLock(root, "research.task.define", async () => {
|
|
153
|
+
const project = await loadProject(root, projectId);
|
|
154
|
+
const events = await readVerifiedJournal(workspacePaths(root).journal);
|
|
155
|
+
assertProjectAuthority(project, projectAuthorityIndex(events));
|
|
156
|
+
const existing = await loadProjectTask(root, projectId, events);
|
|
157
|
+
if (existing) {
|
|
158
|
+
if (existing.original.originalRequest !== input.originalRequest ||
|
|
159
|
+
canonicalJson(existing.original.requestProvenance ?? unrecordedRequestProvenance()) !==
|
|
160
|
+
canonicalJson(provenance.binding) ||
|
|
161
|
+
canonicalJson(existing.original.requirements) !== canonicalJson(input.requirements))
|
|
162
|
+
throw invalid("Original requirements cannot be overwritten; propose an explicit scope change.");
|
|
163
|
+
return taskBinding(existing.current, existing.original);
|
|
164
|
+
}
|
|
165
|
+
await assertTaskWindow(root, project, true);
|
|
166
|
+
await validateTaskBindings(root, project, input.requirements);
|
|
167
|
+
const contract = bindContract({
|
|
168
|
+
schemaVersion: 1,
|
|
169
|
+
kind: "tiangong-research-task",
|
|
170
|
+
projectId,
|
|
171
|
+
version: 1,
|
|
172
|
+
questionSha256: sha256Text(project.question),
|
|
173
|
+
originalRequest: input.originalRequest,
|
|
174
|
+
requestProvenance: provenance.binding,
|
|
175
|
+
requirements: input.requirements,
|
|
176
|
+
parentContractSha256: null,
|
|
177
|
+
originalContractSha256: null,
|
|
178
|
+
origin: null,
|
|
179
|
+
authorization: null,
|
|
180
|
+
});
|
|
181
|
+
if (provenance.sourceObject) {
|
|
182
|
+
await writeTaskObject(root, projectId, "request-sources", provenance.sourceObject.objectSha256, provenance.sourceObject);
|
|
183
|
+
}
|
|
184
|
+
await writeTaskObject(root, projectId, "contracts", contract.contractSha256, contract);
|
|
185
|
+
await appendJournalEvent(workspacePaths(root).journal, "project.task.defined", projectId, taskBinding(contract, contract));
|
|
186
|
+
return taskBinding(contract, contract);
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
export async function proposeProjectTaskScope(root, projectId, expectedContractSha256, value) {
|
|
190
|
+
const input = validateInput("task-scope-change", value);
|
|
191
|
+
return withWorkspaceLock(root, "research.task.scope.propose", async () => {
|
|
192
|
+
const project = await loadProject(root, projectId);
|
|
193
|
+
const events = await readVerifiedJournal(workspacePaths(root).journal);
|
|
194
|
+
assertProjectAuthority(project, projectAuthorityIndex(events));
|
|
195
|
+
await assertTaskWindow(root, project, false);
|
|
196
|
+
const view = await requireTask(root, projectId, events);
|
|
197
|
+
if (view.current.contractSha256 !== expectedContractSha256)
|
|
198
|
+
throw scopeConflict();
|
|
199
|
+
const nextRequirements = input.requirements;
|
|
200
|
+
await validateTaskBindings(root, project, nextRequirements);
|
|
201
|
+
const changes = scopeChanges(view.current.requirements, nextRequirements);
|
|
202
|
+
if (![
|
|
203
|
+
changes.addedRequirementIds,
|
|
204
|
+
changes.changedRequirementIds,
|
|
205
|
+
changes.withdrawnRequirementIds,
|
|
206
|
+
].some((items) => items.length)) {
|
|
207
|
+
return {
|
|
208
|
+
status: "unchanged",
|
|
209
|
+
requiresApproval: false,
|
|
210
|
+
contractSha256: view.current.contractSha256,
|
|
211
|
+
changes,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
const core = {
|
|
215
|
+
schemaVersion: 1,
|
|
216
|
+
projectId,
|
|
217
|
+
parentContractSha256: expectedContractSha256,
|
|
218
|
+
reason: input.reason,
|
|
219
|
+
requirements: nextRequirements,
|
|
220
|
+
};
|
|
221
|
+
const proposal = { ...core, proposalSha256: sha256Text(canonicalJson(core)) };
|
|
222
|
+
await writeTaskObject(root, projectId, "proposals", proposal.proposalSha256, proposal);
|
|
223
|
+
if (!events.some((event) => event.scope === projectId &&
|
|
224
|
+
event.type === "project.task.scope.proposed" &&
|
|
225
|
+
event.payload.proposalSha256 === proposal.proposalSha256)) {
|
|
226
|
+
await appendJournalEvent(workspacePaths(root).journal, "project.task.scope.proposed", projectId, { proposalSha256: proposal.proposalSha256, parentContractSha256: expectedContractSha256 });
|
|
227
|
+
}
|
|
228
|
+
return {
|
|
229
|
+
status: "proposed",
|
|
230
|
+
requiresApproval: true,
|
|
231
|
+
proposalSha256: proposal.proposalSha256,
|
|
232
|
+
parentContractSha256: expectedContractSha256,
|
|
233
|
+
changes,
|
|
234
|
+
};
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
export async function approveProjectTaskScope(root, projectId, proposalSha256, confirmation) {
|
|
238
|
+
if (!HASH.test(proposalSha256) || confirmation !== proposalSha256) {
|
|
239
|
+
throw new CliError("Explicit operator authorization must name the exact reviewed scope-change hash; a producer approval field or generic continue instruction is not sufficient.", { code: "RESEARCH_TASK_SCOPE_APPROVAL_REQUIRED", exitCode: 3 });
|
|
240
|
+
}
|
|
241
|
+
return withWorkspaceLock(root, "research.task.scope.approve", async () => {
|
|
242
|
+
const project = await loadProject(root, projectId);
|
|
243
|
+
const events = await readVerifiedJournal(workspacePaths(root).journal);
|
|
244
|
+
assertProjectAuthority(project, projectAuthorityIndex(events));
|
|
245
|
+
const replay = events.find((event) => event.scope === projectId &&
|
|
246
|
+
event.type === "project.task.scope.approved" &&
|
|
247
|
+
event.payload.proposalSha256 === proposalSha256);
|
|
248
|
+
if (replay)
|
|
249
|
+
return { ...replay.payload, replayed: true };
|
|
250
|
+
await assertTaskWindow(root, project, false);
|
|
251
|
+
const view = await requireTask(root, projectId, events);
|
|
252
|
+
const proposal = await readTaskObject(root, projectId, "proposals", proposalSha256, "proposalSha256");
|
|
253
|
+
if (proposal.projectId !== projectId ||
|
|
254
|
+
proposal.parentContractSha256 !== view.current.contractSha256 ||
|
|
255
|
+
!events.some((event) => event.scope === projectId &&
|
|
256
|
+
event.type === "project.task.scope.proposed" &&
|
|
257
|
+
event.payload.proposalSha256 === proposalSha256))
|
|
258
|
+
throw scopeConflict();
|
|
259
|
+
validateInput("task-scope-change", {
|
|
260
|
+
schemaVersion: 1,
|
|
261
|
+
reason: proposal.reason,
|
|
262
|
+
requirements: proposal.requirements,
|
|
263
|
+
});
|
|
264
|
+
await validateTaskBindings(root, project, proposal.requirements);
|
|
265
|
+
const contract = bindContract({
|
|
266
|
+
...view.current,
|
|
267
|
+
version: view.current.version + 1,
|
|
268
|
+
requirements: proposal.requirements,
|
|
269
|
+
parentContractSha256: view.current.contractSha256,
|
|
270
|
+
originalContractSha256: view.original.contractSha256,
|
|
271
|
+
authorization: { kind: "operator-confirmation", proposalSha256 },
|
|
272
|
+
});
|
|
273
|
+
await writeTaskObject(root, projectId, "contracts", contract.contractSha256, contract);
|
|
274
|
+
const binding = {
|
|
275
|
+
projectId,
|
|
276
|
+
...taskBinding(contract, view.original),
|
|
277
|
+
proposalSha256,
|
|
278
|
+
authorizationKind: "operator-confirmation",
|
|
279
|
+
};
|
|
280
|
+
if (project.scientificDesign) {
|
|
281
|
+
let mutation = await beginProjectMutation(root, "task-scope", project, proposalSha256);
|
|
282
|
+
try {
|
|
283
|
+
const invalidatedScientificReviews = Object.entries(project.scientificDesign.gates)
|
|
284
|
+
.filter(([, gate]) => gate.packetSha256 !== null)
|
|
285
|
+
.map(([role, gate]) => ({ role, packetSha256: gate.packetSha256 }));
|
|
286
|
+
for (const role of ["research-design", "evidence-construct", "pilot-methods"]) {
|
|
287
|
+
project.scientificDesign.gates[role] = {
|
|
288
|
+
status: "pending",
|
|
289
|
+
packetSha256: null,
|
|
290
|
+
assessmentSha256: null,
|
|
291
|
+
reviewSha256: null,
|
|
292
|
+
reviewerSessionSha256: null,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
project.updatedAt = new Date().toISOString();
|
|
296
|
+
mutation = await prepareProjectMutation(root, mutation, project);
|
|
297
|
+
await appendJournalEvent(workspacePaths(root).journal, "project.task.scope.approved", projectId, { ...binding, invalidatedScientificReviews, mutation: projectMutationBinding(mutation) });
|
|
298
|
+
await settleProjectMutation(root, mutation);
|
|
299
|
+
}
|
|
300
|
+
catch (error) {
|
|
301
|
+
if (!(await settleProjectMutation(root, mutation)))
|
|
302
|
+
throw error;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
await appendJournalEvent(workspacePaths(root).journal, "project.task.scope.approved", projectId, binding);
|
|
307
|
+
}
|
|
308
|
+
return { ...binding, replayed: false };
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
/** Materialize before a fork/addendum's existing commit; never copy completion claims. */
|
|
312
|
+
export async function inheritProjectTask(root, source, target) {
|
|
313
|
+
const view = await loadProjectTask(root, source.id);
|
|
314
|
+
if (!view)
|
|
315
|
+
return null;
|
|
316
|
+
const requestSource = view.original.requestProvenance?.source;
|
|
317
|
+
if (requestSource) {
|
|
318
|
+
const object = await readTaskObject(root, source.id, "request-sources", requestSource.objectSha256, "objectSha256");
|
|
319
|
+
await writeTaskObject(root, target.id, "request-sources", object.objectSha256, object);
|
|
320
|
+
}
|
|
321
|
+
for (const contract of view.contracts) {
|
|
322
|
+
await writeTaskObject(root, target.id, "contracts", contract.contractSha256, contract);
|
|
323
|
+
if (contract.authorization) {
|
|
324
|
+
const proposal = await readTaskObject(root, source.id, "proposals", contract.authorization.proposalSha256, "proposalSha256");
|
|
325
|
+
await writeTaskObject(root, target.id, "proposals", proposal.proposalSha256, proposal);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
const contract = bindContract({
|
|
329
|
+
...view.current,
|
|
330
|
+
projectId: target.id,
|
|
331
|
+
questionSha256: sha256Text(target.question),
|
|
332
|
+
version: view.current.version + 1,
|
|
333
|
+
parentContractSha256: view.current.contractSha256,
|
|
334
|
+
originalContractSha256: view.original.contractSha256,
|
|
335
|
+
origin: { projectId: source.id, contractSha256: view.current.contractSha256 },
|
|
336
|
+
authorization: null,
|
|
337
|
+
});
|
|
338
|
+
await writeTaskObject(root, target.id, "contracts", contract.contractSha256, contract);
|
|
339
|
+
return taskBinding(contract, view.original);
|
|
340
|
+
}
|
|
341
|
+
export async function taskContext(root, projectId, knownEvents) {
|
|
342
|
+
const view = await loadProjectTask(root, projectId, knownEvents);
|
|
343
|
+
const active = new Set(view?.current.requirements.map(taskRequirementSha256));
|
|
344
|
+
return view
|
|
345
|
+
? {
|
|
346
|
+
...taskBinding(view.current, view.original),
|
|
347
|
+
originalRequest: view.original.originalRequest,
|
|
348
|
+
requestProvenance: view.original.requestProvenance ?? unrecordedRequestProvenance(),
|
|
349
|
+
requirements: view.current.requirements,
|
|
350
|
+
originalRequirementRefs: view.original.requirements.map((item) => ({
|
|
351
|
+
id: item.id,
|
|
352
|
+
requirementSha256: taskRequirementSha256(item),
|
|
353
|
+
})),
|
|
354
|
+
originalOnlyRequirements: view.original.requirements.filter((item) => !active.has(taskRequirementSha256(item))),
|
|
355
|
+
origin: view.current.origin,
|
|
356
|
+
executionCertified: false,
|
|
357
|
+
}
|
|
358
|
+
: null;
|
|
359
|
+
}
|
|
360
|
+
function taskBinding(current, original) {
|
|
361
|
+
return {
|
|
362
|
+
contractSha256: current.contractSha256,
|
|
363
|
+
originalContractSha256: original.contractSha256,
|
|
364
|
+
version: current.version,
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
function bindContract(input) {
|
|
368
|
+
const { contractSha256: _old, ...core } = input;
|
|
369
|
+
return { ...core, contractSha256: sha256Text(canonicalJson(core)) };
|
|
370
|
+
}
|
|
371
|
+
function scopeChanges(previous, next) {
|
|
372
|
+
const prior = new Map(previous.map((item) => [item.id, item]));
|
|
373
|
+
const nextById = new Map(next.map((item) => [item.id, item]));
|
|
374
|
+
const nextIds = new Set(next.map((item) => item.id));
|
|
375
|
+
return {
|
|
376
|
+
details: [...new Set([...prior.keys(), ...nextById.keys()])]
|
|
377
|
+
.filter((id) => canonicalJson(prior.get(id) ?? null) !== canonicalJson(nextById.get(id) ?? null))
|
|
378
|
+
.map((id) => ({ id, before: prior.get(id) ?? null, after: nextById.get(id) ?? null })),
|
|
379
|
+
addedRequirementIds: next.filter((item) => !prior.has(item.id)).map((item) => item.id),
|
|
380
|
+
changedRequirementIds: next
|
|
381
|
+
.filter((item) => prior.has(item.id) && canonicalJson(prior.get(item.id)) !== canonicalJson(item))
|
|
382
|
+
.map((item) => item.id),
|
|
383
|
+
withdrawnRequirementIds: previous
|
|
384
|
+
.filter((item) => !nextIds.has(item.id))
|
|
385
|
+
.map((item) => item.id),
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
async function assertTaskWindow(root, project, initial) {
|
|
389
|
+
if (project.handoff.state !== "agent-actionable" ||
|
|
390
|
+
project.status === "complete" ||
|
|
391
|
+
(initial &&
|
|
392
|
+
project.scientificDesign &&
|
|
393
|
+
Object.values(project.scientificDesign.gates).some((gate) => gate.status !== "pending" || gate.packetSha256 !== null)) ||
|
|
394
|
+
(await pathExists(join(workspacePaths(root).projects, project.id, "native", "active.json"))) ||
|
|
395
|
+
project.packages.some((item) => (initial || ["analyze", "synthesize", "review", "close"].includes(item.stage)) &&
|
|
396
|
+
item.attempts > 0)) {
|
|
397
|
+
throw new CliError("Task definition/scope changes require an idle pre-analysis boundary. Original requirements must be recorded before execution or scientific review; use a new generation for later scientific changes.", { code: "RESEARCH_TASK_WINDOW_REQUIRED", exitCode: 3 });
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
async function validateTaskBindings(root, project, items) {
|
|
401
|
+
const dimensions = new Set(project.evidenceRequirements.dimensions);
|
|
402
|
+
if (items.some((item) => item.coverageDimensionIds.some((id) => !dimensions.has(id))))
|
|
403
|
+
throw invalid("Task coverage bindings must use the existing project dimensions; task scope approval cannot rewrite evidence requirements.");
|
|
404
|
+
if (!project.scientificDesign && items.some((item) => item.designClaimIds.length))
|
|
405
|
+
throw invalid("Task design claims require a declared scientific design.");
|
|
406
|
+
if (project.scientificDesign) {
|
|
407
|
+
const claims = new Set((await loadBoundAcquisitionDesign(root, project)).claims.map((claim) => claim.id));
|
|
408
|
+
if (items.some((item) => item.designClaimIds.some((id) => !claims.has(id))))
|
|
409
|
+
throw invalid("Task requirements must bind declared scientific claims; a scope change cannot invent a new design.");
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
async function requireTask(root, projectId, events) {
|
|
413
|
+
const view = await loadProjectTask(root, projectId, events);
|
|
414
|
+
if (!view)
|
|
415
|
+
throw invalid("Define the original task before proposing a scope change.");
|
|
416
|
+
return view;
|
|
417
|
+
}
|
|
418
|
+
function validateTaskContract(record) {
|
|
419
|
+
validateInput("task-contract", {
|
|
420
|
+
schemaVersion: record.schemaVersion,
|
|
421
|
+
originalRequest: record.originalRequest,
|
|
422
|
+
requirements: record.requirements,
|
|
423
|
+
});
|
|
424
|
+
if (record.kind !== "tiangong-research-task" ||
|
|
425
|
+
!Number.isInteger(record.version) ||
|
|
426
|
+
record.version < 1 ||
|
|
427
|
+
!HASH.test(record.questionSha256) ||
|
|
428
|
+
(record.parentContractSha256 !== null && !HASH.test(record.parentContractSha256)) ||
|
|
429
|
+
(record.originalContractSha256 !== null && !HASH.test(record.originalContractSha256)) ||
|
|
430
|
+
(record.authorization !== null &&
|
|
431
|
+
(record.authorization.kind !== "operator-confirmation" ||
|
|
432
|
+
!HASH.test(record.authorization.proposalSha256))))
|
|
433
|
+
throw invalid("Stored task contract identity is invalid.");
|
|
434
|
+
return record;
|
|
435
|
+
}
|
|
436
|
+
export async function writeTaskObject(root, projectId, group, hash, value) {
|
|
437
|
+
if (!HASH.test(hash) || !/^[a-z-]+$/.test(group))
|
|
438
|
+
throw invalid("Task object address is invalid.");
|
|
439
|
+
const directory = await taskDirectory(root, projectId, group, true);
|
|
440
|
+
const path = join(directory, `${hash}.json`);
|
|
441
|
+
if (await pathExists(path)) {
|
|
442
|
+
const existing = await readRegularJson(path);
|
|
443
|
+
if (canonicalJson(existing) !== canonicalJson(value))
|
|
444
|
+
throw invalid("Immutable task object changed; preserved bytes were not overwritten.");
|
|
445
|
+
}
|
|
446
|
+
else
|
|
447
|
+
await writeJsonAtomic(path, value, 0o444);
|
|
448
|
+
}
|
|
449
|
+
export async function readTaskObject(root, projectId, group, hash, hashField) {
|
|
450
|
+
if (!HASH.test(hash) || !/^[a-z-]+$/.test(group))
|
|
451
|
+
throw invalid("Task object address is invalid.");
|
|
452
|
+
const directory = await taskDirectory(root, projectId, group, false);
|
|
453
|
+
const record = await readRegularJson(join(directory, `${hash}.json`));
|
|
454
|
+
return validateTaskObject(record, hash, hashField);
|
|
455
|
+
}
|
|
456
|
+
export function validateTaskObject(record, hash, hashField) {
|
|
457
|
+
if (!isObject(record))
|
|
458
|
+
throw invalid("Stored task object must be an object.");
|
|
459
|
+
const { [hashField]: declared, ...core } = record;
|
|
460
|
+
if (declared !== hash || sha256Text(canonicalJson(core)) !== hash)
|
|
461
|
+
throw invalid("Stored task object failed its hash binding.");
|
|
462
|
+
return record;
|
|
463
|
+
}
|
|
464
|
+
export async function taskDirectory(root, projectId, group, create) {
|
|
465
|
+
if (!/^[a-z0-9][a-z0-9-]{2,63}$/.test(projectId))
|
|
466
|
+
throw invalid("Task project identity is invalid.");
|
|
467
|
+
const paths = workspacePaths(root);
|
|
468
|
+
const directories = [
|
|
469
|
+
paths.control,
|
|
470
|
+
paths.projects,
|
|
471
|
+
join(paths.projects, projectId),
|
|
472
|
+
join(paths.projects, projectId, "task"),
|
|
473
|
+
join(paths.projects, projectId, "task", group),
|
|
474
|
+
];
|
|
475
|
+
for (const directory of directories) {
|
|
476
|
+
let info = await lstat(directory).catch(() => undefined);
|
|
477
|
+
if (!info && create) {
|
|
478
|
+
await mkdir(directory, { mode: 0o700 });
|
|
479
|
+
info = await lstat(directory);
|
|
480
|
+
}
|
|
481
|
+
if (!info?.isDirectory() || info.isSymbolicLink())
|
|
482
|
+
throw invalid("Task storage must use existing regular directories without symlinks.");
|
|
483
|
+
}
|
|
484
|
+
return directories.at(-1);
|
|
485
|
+
}
|
|
486
|
+
async function readRegularJson(path) {
|
|
487
|
+
const info = await lstat(path).catch(() => undefined);
|
|
488
|
+
if (!info?.isFile() || info.isSymbolicLink() || info.size > MAX_BYTES)
|
|
489
|
+
throw invalid("Task record must be a bounded regular file.");
|
|
490
|
+
try {
|
|
491
|
+
return JSON.parse(await readFile(path, "utf8"));
|
|
492
|
+
}
|
|
493
|
+
catch {
|
|
494
|
+
throw invalid("Task record is not valid JSON.");
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
function invalid(message) {
|
|
498
|
+
return new CliError(message, { code: "RESEARCH_TASK_INVALID", exitCode: 3 });
|
|
499
|
+
}
|
|
500
|
+
function scopeConflict() {
|
|
501
|
+
return new CliError("Task scope proposal no longer matches the current committed contract.", {
|
|
502
|
+
code: "RESEARCH_TASK_SCOPE_CONFLICT",
|
|
503
|
+
exitCode: 3,
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
//# sourceMappingURL=task-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-contract.js","sourceRoot":"","sources":["../../../src/research/workspace/task-contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -259,6 +259,7 @@ export type ScientificGateStatus = "pending" | "prepared" | "passed" | "revision
|
|
|
259
259
|
export interface ScientificDesignBinding {
|
|
260
260
|
schemaVersion: 1;
|
|
261
261
|
designSha256: string;
|
|
262
|
+
fulfillmentSha256?: string | null;
|
|
262
263
|
objectLocator: string;
|
|
263
264
|
centralStudyKind: string;
|
|
264
265
|
producer: {
|
|
@@ -368,21 +369,22 @@ export interface ExecutionResult {
|
|
|
368
369
|
isolation?: ReviewIsolationFingerprint | undefined;
|
|
369
370
|
reviewAttestation?: ReviewExecutionAttestation | undefined;
|
|
370
371
|
telemetry?: AgentExecutionTelemetry | undefined;
|
|
372
|
+
artifactReads?: import("./artifact-views.js").ArtifactReadReceipt[];
|
|
371
373
|
}
|
|
372
374
|
export interface ReviewIsolationFingerprint {
|
|
373
375
|
provider: "sandbox-exec" | "bubblewrap";
|
|
374
376
|
policySha256: string;
|
|
375
377
|
readScopes: Array<"platform-runtime" | "agent-runtime" | "private-capsule">;
|
|
376
378
|
writeScopes: ["private-capsule"];
|
|
377
|
-
networkPolicy: "reviewer-provider-only";
|
|
378
|
-
toolPolicy: "none";
|
|
379
|
+
networkPolicy: "reviewer-provider-only" | "reviewer-provider-and-local-artifacts";
|
|
380
|
+
toolPolicy: "none" | "packet-read";
|
|
379
381
|
}
|
|
380
382
|
export interface ReviewExecutionAttestation {
|
|
381
383
|
schemaVersion: 1;
|
|
382
384
|
protocolVersion: 1;
|
|
383
385
|
transport: "sandbox-bridge";
|
|
384
386
|
isolationProvider: ReviewIsolationFingerprint["provider"];
|
|
385
|
-
toolPolicy: "none";
|
|
387
|
+
toolPolicy: "none" | "packet-read";
|
|
386
388
|
workspaceId: string;
|
|
387
389
|
requestId: string;
|
|
388
390
|
requestSha256: string;
|
|
@@ -399,6 +401,7 @@ export interface AgentExecutionTelemetry {
|
|
|
399
401
|
eventCounts: Record<string, number>;
|
|
400
402
|
itemCounts: Record<string, number>;
|
|
401
403
|
toolCalls: number;
|
|
404
|
+
packetReadViolations?: number;
|
|
402
405
|
providerTurns: number | null;
|
|
403
406
|
reasoningOutputTokens: number;
|
|
404
407
|
providerErrors: string[];
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
2
|
import { lstat, mkdir, readdir, rm, writeFile } from "node:fs/promises";
|
|
3
|
-
import { basename, isAbsolute, join } from "node:path";
|
|
3
|
+
import { basename, isAbsolute, join, resolve } from "node:path";
|
|
4
4
|
import { CliError } from "../../errors.js";
|
|
5
5
|
import { loadCapabilityDeclarations, verifyCapabilities } from "./capabilities.js";
|
|
6
6
|
import { packageVersion, RESEARCH_PACKAGE_NAME, RESEARCH_PROTOCOL_VERSION } from "./constants.js";
|
|
7
7
|
import { inspectResearchContext, isWorkspaceMarker } from "./context.js";
|
|
8
8
|
import { inspectCapabilityCredentialEnvironment } from "./credentials.js";
|
|
9
9
|
import { appendJournalEvent, verifyJournal } from "./journal.js";
|
|
10
|
+
import { readProjectAuthorityIndex, visibleProjectIds } from "./project-authority.js";
|
|
11
|
+
import { recoverProjectMutations } from "./project-mutations.js";
|
|
10
12
|
import { loadProjectEvidenceReceipts } from "./evidence.js";
|
|
11
13
|
import { executeAgent, fingerprintAgentRoute } from "./executor.js";
|
|
12
14
|
import { doctorExternalCapabilities, hasPublicInternetCapability } from "./external-skills.js";
|
|
@@ -868,6 +870,7 @@ export async function withWorkspaceLock(root, operation, callback) {
|
|
|
868
870
|
recoveryOperation: operation,
|
|
869
871
|
});
|
|
870
872
|
}
|
|
873
|
+
await recoverProjectMutations(root);
|
|
871
874
|
return await callback();
|
|
872
875
|
}
|
|
873
876
|
finally {
|
|
@@ -897,14 +900,14 @@ export async function requireCurrentRuntimeLock(root, knownMarker) {
|
|
|
897
900
|
return lock;
|
|
898
901
|
}
|
|
899
902
|
async function readProjectStates(projectsPath) {
|
|
900
|
-
const
|
|
903
|
+
const root = resolve(projectsPath, "..", "..");
|
|
904
|
+
const authority = await readProjectAuthorityIndex(root);
|
|
905
|
+
const ids = await visibleProjectIds(root, authority);
|
|
901
906
|
const states = [];
|
|
902
|
-
for (const
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
if (!isProjectStateShape(state) || state.id !== entry.name) {
|
|
907
|
-
throw new Error(`project ${entry.name} has an unsupported state shape`);
|
|
907
|
+
for (const id of ids) {
|
|
908
|
+
const state = await readJsonFile(join(projectsPath, id, "project.json"), "Project " + id);
|
|
909
|
+
if (!isProjectStateShape(state) || state.id !== id) {
|
|
910
|
+
throw new Error("project " + id + " has an unsupported state shape");
|
|
908
911
|
}
|
|
909
912
|
states.push(state);
|
|
910
913
|
}
|