@tiangong-ai/cli 0.0.60 → 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.
Files changed (73) hide show
  1. package/AGENTS.md +2 -2
  2. package/README.md +167 -26
  3. package/dist/research/orchestration.js +108 -18
  4. package/dist/research/orchestration.js.map +1 -1
  5. package/dist/research/workspace/acquisition-routes.d.ts +1 -1
  6. package/dist/research/workspace/acquisition-routes.js +2 -11
  7. package/dist/research/workspace/acquisition-routes.js.map +1 -1
  8. package/dist/research/workspace/artifact-read-audit.d.ts +16 -0
  9. package/dist/research/workspace/artifact-read-audit.js +176 -0
  10. package/dist/research/workspace/artifact-read-audit.js.map +1 -0
  11. package/dist/research/workspace/artifact-trace.d.ts +12 -0
  12. package/dist/research/workspace/artifact-trace.js +109 -0
  13. package/dist/research/workspace/artifact-trace.js.map +1 -0
  14. package/dist/research/workspace/artifact-view-mcp.d.ts +75 -0
  15. package/dist/research/workspace/artifact-view-mcp.js +214 -0
  16. package/dist/research/workspace/artifact-view-mcp.js.map +1 -0
  17. package/dist/research/workspace/artifact-views.d.ts +100 -0
  18. package/dist/research/workspace/artifact-views.js +395 -0
  19. package/dist/research/workspace/artifact-views.js.map +1 -0
  20. package/dist/research/workspace/audit-bundle.d.ts +4 -0
  21. package/dist/research/workspace/audit-bundle.js +107 -8
  22. package/dist/research/workspace/audit-bundle.js.map +1 -1
  23. package/dist/research/workspace/executor.d.ts +5 -1
  24. package/dist/research/workspace/executor.js +106 -22
  25. package/dist/research/workspace/executor.js.map +1 -1
  26. package/dist/research/workspace/native-run.d.ts +77 -0
  27. package/dist/research/workspace/native-run.js +637 -0
  28. package/dist/research/workspace/native-run.js.map +1 -0
  29. package/dist/research/workspace/preflight.d.ts +8 -2
  30. package/dist/research/workspace/preflight.js +17 -14
  31. package/dist/research/workspace/preflight.js.map +1 -1
  32. package/dist/research/workspace/project-mutations.d.ts +1 -1
  33. package/dist/research/workspace/project-mutations.js +5 -3
  34. package/dist/research/workspace/project-mutations.js.map +1 -1
  35. package/dist/research/workspace/projects.js +1 -0
  36. package/dist/research/workspace/projects.js.map +1 -1
  37. package/dist/research/workspace/request-provenance.d.ts +67 -0
  38. package/dist/research/workspace/request-provenance.js +115 -0
  39. package/dist/research/workspace/request-provenance.js.map +1 -0
  40. package/dist/research/workspace/review-executor.js +22 -11
  41. package/dist/research/workspace/review-executor.js.map +1 -1
  42. package/dist/research/workspace/runtime.d.ts +52 -0
  43. package/dist/research/workspace/runtime.js +221 -98
  44. package/dist/research/workspace/runtime.js.map +1 -1
  45. package/dist/research/workspace/sanitization.js +1 -1
  46. package/dist/research/workspace/sanitization.js.map +1 -1
  47. package/dist/research/workspace/schema-compatibility.d.ts +5 -0
  48. package/dist/research/workspace/schema-compatibility.js +55 -0
  49. package/dist/research/workspace/schema-compatibility.js.map +1 -0
  50. package/dist/research/workspace/scientific-design.js +8 -17
  51. package/dist/research/workspace/scientific-design.js.map +1 -1
  52. package/dist/research/workspace/scientific-fulfillment-audit.d.ts +3 -0
  53. package/dist/research/workspace/scientific-fulfillment-audit.js +137 -0
  54. package/dist/research/workspace/scientific-fulfillment-audit.js.map +1 -0
  55. package/dist/research/workspace/scientific-fulfillment.d.ts +121 -0
  56. package/dist/research/workspace/scientific-fulfillment.js +539 -0
  57. package/dist/research/workspace/scientific-fulfillment.js.map +1 -0
  58. package/dist/research/workspace/scientific-review-execution.js +82 -61
  59. package/dist/research/workspace/scientific-review-execution.js.map +1 -1
  60. package/dist/research/workspace/scientific-review.d.ts +5 -1
  61. package/dist/research/workspace/scientific-review.js +197 -52
  62. package/dist/research/workspace/scientific-review.js.map +1 -1
  63. package/dist/research/workspace/setup-catalog.js +2 -2
  64. package/dist/research/workspace/task-acceptance.d.ts +10 -2
  65. package/dist/research/workspace/task-acceptance.js +72 -8
  66. package/dist/research/workspace/task-acceptance.js.map +1 -1
  67. package/dist/research/workspace/task-audit.js +52 -2
  68. package/dist/research/workspace/task-audit.js.map +1 -1
  69. package/dist/research/workspace/task-contract.d.ts +4 -1
  70. package/dist/research/workspace/task-contract.js +26 -5
  71. package/dist/research/workspace/task-contract.js.map +1 -1
  72. package/dist/research/workspace/types.d.ts +6 -3
  73. package/package.json +1 -1
@@ -0,0 +1,137 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { CliError } from "../../errors.js";
3
+ import { parseScientificDesign } from "./scientific-design.js";
4
+ import { applyScientificFulfillmentRecord, validateScientificFulfillmentRecord, } from "./scientific-fulfillment.js";
5
+ import { canonicalJson, isObject, resolveContained, sha256Text } from "./storage.js";
6
+ /** A portable integrity check, not certification of authorship, scientific truth or execution. */
7
+ export async function verifyScientificFulfillmentAudit(bundle, projectId, files) {
8
+ const indexed = new Map(files.map((file) => [file.path, file]));
9
+ const cache = new Map();
10
+ const read = async (path) => {
11
+ if (!cache.has(path)) {
12
+ const expected = indexed.get(path);
13
+ if (!expected || expected.bytes > 16 * 1024 * 1024)
14
+ throw invalid();
15
+ const text = await readFile(resolveContained(bundle, path), "utf8");
16
+ if (sha256Text(text) !== expected.sha256 || Buffer.byteLength(text) !== expected.bytes)
17
+ throw invalid();
18
+ try {
19
+ cache.set(path, JSON.parse(text));
20
+ }
21
+ catch {
22
+ throw invalid();
23
+ }
24
+ }
25
+ return cache.get(path);
26
+ };
27
+ const project = await read("state/project.json");
28
+ const proof = await read("state/journal-event-proofs.json");
29
+ if (project.id !== projectId || !Array.isArray(proof.events))
30
+ throw invalid();
31
+ const events = proof.events.filter((event) => event.scope === projectId && event.type === "scientific.fulfillment.recorded");
32
+ const binding = project.scientificDesign;
33
+ if (!events.length) {
34
+ if (binding?.fulfillmentSha256)
35
+ throw invalid();
36
+ return;
37
+ }
38
+ if (!binding || binding.fulfillmentSha256 !== events.at(-1)?.payload.recordSha256)
39
+ throw invalid();
40
+ const basePath = `project/scientific/design/objects/${binding.designSha256}.json`;
41
+ if (indexed.get(basePath)?.sha256 !== binding.designSha256)
42
+ throw invalid();
43
+ const base = parseScientificDesign(await read(basePath));
44
+ if (base.projectId !== projectId)
45
+ throw invalid();
46
+ const effective = structuredClone(base);
47
+ let parent = null;
48
+ const seen = new Set();
49
+ for (const event of events) {
50
+ if (event.sourcePayloadSha256 !== sha256Text(canonicalJson(event.payload)))
51
+ throw invalid();
52
+ const hash = String(event.payload.recordSha256);
53
+ if (seen.has(hash) || !/^[a-f0-9]{64}$/.test(hash))
54
+ throw invalid();
55
+ seen.add(hash);
56
+ const record = validateScientificFulfillmentRecord(await read(`project/scientific/fulfillments/${hash}.json`), projectId, hash);
57
+ if (record.designSha256 !== binding.designSha256 ||
58
+ record.parentFulfillmentSha256 !== parent ||
59
+ event.payload.parentFulfillmentSha256 !== parent ||
60
+ record.requestSha256 !== event.payload.requestSha256)
61
+ throw invalid();
62
+ for (const [kind, items] of [
63
+ ["model-implementation", record.modelImplementations],
64
+ ["environment-lock", record.environmentLocks],
65
+ ]) {
66
+ for (const item of items) {
67
+ const locator = `lineage/objects/${item.sha256}/${kind}.json`;
68
+ const metadata = await read(`workspace-objects/${locator}`);
69
+ const { recordSha256, ...core } = metadata;
70
+ const bytes = indexed.get(`workspace-objects/${item.objectLocator}`);
71
+ if (metadata.kind !== "tiangong-scientific-object" ||
72
+ metadata.schemaVersion !== 1 ||
73
+ metadata.objectKind !== kind ||
74
+ metadata.sha256 !== item.sha256 ||
75
+ metadata.objectLocator !== item.objectLocator ||
76
+ metadata.recordLocator !== locator ||
77
+ metadata.hashBasis !== "raw-file-bytes" ||
78
+ recordSha256 !== item.recordSha256 ||
79
+ recordSha256 !== sha256Text(canonicalJson(core)) ||
80
+ bytes?.sha256 !== item.sha256 ||
81
+ bytes.bytes !== metadata.bytes)
82
+ throw invalid();
83
+ }
84
+ }
85
+ if (record.parameterStates.length) {
86
+ const content = await read("project/outputs/content-snapshot.json");
87
+ const { snapshotSha256, ...core } = content;
88
+ if (snapshotSha256 !== sha256Text(canonicalJson(core)) || !Array.isArray(content.atoms))
89
+ throw invalid();
90
+ const atoms = new Map(content.atoms.map((atom) => [String(atom.atomId), atom]));
91
+ for (const parameter of record.parameterStates) {
92
+ const declared = base.uncertaintyParameters.find((item) => item.id === parameter.parameterId);
93
+ for (const state of parameter.states)
94
+ for (const reference of state.atoms) {
95
+ const atom = atoms.get(reference.id);
96
+ if (!atom ||
97
+ atom.atomSha256 !== reference.sha256 ||
98
+ !Array.isArray(atom.evidenceRoleIds) ||
99
+ !atom.evidenceRoleIds.some((role) => declared?.sourceEvidenceRoleIds.includes(String(role))))
100
+ throw invalid();
101
+ const { atomSha256, ...atomCore } = atom;
102
+ if (atomSha256 !== sha256Text(canonicalJson(atomCore)))
103
+ throw invalid();
104
+ }
105
+ }
106
+ }
107
+ applyScientificFulfillmentRecord(effective, record);
108
+ parent = hash;
109
+ }
110
+ // Current prepared/passed gate packets must bind their deadline-specific view.
111
+ for (const role of ["research-design", "evidence-construct", "pilot-methods"]) {
112
+ const gate = binding.gates[role];
113
+ if (!gate.packetSha256)
114
+ continue;
115
+ const packet = await read(`project/scientific/review-packets/${role}/${gate.packetSha256}.json`);
116
+ const { packetSha256, ...packetCore } = packet;
117
+ if (packetSha256 !== gate.packetSha256 ||
118
+ sha256Text(canonicalJson(packetCore)) !== packetSha256 ||
119
+ !isObject(packet.design))
120
+ throw invalid();
121
+ const view = structuredClone(base);
122
+ for (const event of events)
123
+ applyScientificFulfillmentRecord(view, validateScientificFulfillmentRecord(await read(`project/scientific/fulfillments/${event.payload.recordSha256}.json`), projectId, String(event.payload.recordSha256)), role);
124
+ const packetView = packet.design.fulfillment;
125
+ if (isObject(packetView)) {
126
+ if (packetView.effectiveSha256 !== sha256Text(canonicalJson(view)) ||
127
+ (packetView.headSha256 !== null && !seen.has(String(packetView.headSha256))))
128
+ throw invalid();
129
+ }
130
+ else if (canonicalJson(view) !== canonicalJson(base))
131
+ throw invalid();
132
+ }
133
+ }
134
+ function invalid() {
135
+ return new CliError("Scientific fulfillment audit relationships or source objects are inconsistent.", { code: "RESEARCH_AUDIT_BUNDLE_INVALID", exitCode: 3 });
136
+ }
137
+ //# sourceMappingURL=scientific-fulfillment-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scientific-fulfillment-audit.js","sourceRoot":"","sources":["../../../src/research/workspace/scientific-fulfillment-audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ import { type ScientificDesignContract } from "./scientific-design.js";
2
+ import type { JournalEvent, ProjectState, ScientificReviewRole } from "./types.js";
3
+ type DeferredGate = "evidence-construct" | "pilot-methods";
4
+ type ObjectInput = {
5
+ modelId: string;
6
+ objectLocator: string;
7
+ sha256: string;
8
+ recordSha256: string;
9
+ };
10
+ type ImplementationInput = ObjectInput & {
11
+ entrypoint: string;
12
+ };
13
+ interface ParameterInput {
14
+ parameterId: string;
15
+ states: Array<{
16
+ stateId: string;
17
+ value: string;
18
+ evidenceAtomIds: string[];
19
+ }>;
20
+ }
21
+ interface FulfillmentInput {
22
+ schemaVersion: 1;
23
+ designSha256: string;
24
+ parentFulfillmentSha256: string | null;
25
+ reason: string;
26
+ modelImplementations: ImplementationInput[];
27
+ environmentLocks: ObjectInput[];
28
+ parameterStates: ParameterInput[];
29
+ }
30
+ export interface ScientificFulfillmentRecord extends Omit<FulfillmentInput, "parameterStates" | "modelImplementations" | "environmentLocks"> {
31
+ kind: "tiangong-scientific-fulfillment";
32
+ projectId: string;
33
+ requestSha256: string;
34
+ modelImplementations: Array<ImplementationInput & {
35
+ dueGate: DeferredGate;
36
+ }>;
37
+ environmentLocks: Array<ObjectInput & {
38
+ dueGate: DeferredGate;
39
+ }>;
40
+ parameterStates: Array<{
41
+ parameterId: string;
42
+ dueGate: DeferredGate;
43
+ states: Array<{
44
+ stateId: string;
45
+ value: string;
46
+ atoms: Array<{
47
+ id: string;
48
+ sha256: string;
49
+ }>;
50
+ }>;
51
+ }>;
52
+ recordSha256: string;
53
+ }
54
+ export interface ScientificFulfillmentView {
55
+ base: ScientificDesignContract;
56
+ contract: ScientificDesignContract;
57
+ headSha256: string | null;
58
+ effectiveSha256: string;
59
+ records: ScientificFulfillmentRecord[];
60
+ deferredObjectRuleIds: string[];
61
+ }
62
+ export declare function scientificFulfillmentSchema(): Record<string, unknown>;
63
+ export declare function scientificFulfillmentLocator(projectId: string, hash: string): string;
64
+ export declare function validateScientificFulfillmentRecord(value: unknown, projectId: string, hash: string): ScientificFulfillmentRecord;
65
+ /** The base bytes never change. The per-gate projection includes only slots due by that gate. */
66
+ export declare function loadScientificFulfillmentView(root: string, project: ProjectState, throughGate?: ScientificReviewRole, knownEvents?: JournalEvent[]): Promise<ScientificFulfillmentView>;
67
+ export declare function applyScientificFulfillmentRecord(design: ScientificDesignContract, record: ScientificFulfillmentRecord, throughGate?: ScientificReviewRole): void;
68
+ export declare function recordScientificFulfillment(root: string, projectId: string, value: unknown): Promise<ScientificFulfillmentRecord>;
69
+ export declare function inspectScientificFulfillment(root: string, projectId: string): Promise<{
70
+ projectId: string;
71
+ designSha256: string;
72
+ fulfillmentSha256: string | null;
73
+ effectiveDesignSha256: string;
74
+ records: {
75
+ recordSha256: string;
76
+ parentFulfillmentSha256: string | null;
77
+ }[];
78
+ pendingModels: {
79
+ id: string;
80
+ label: string;
81
+ family: string;
82
+ version: string;
83
+ equationSet: string;
84
+ coefficientSet: string;
85
+ implementationArtifactSha256: string | null;
86
+ implementationArtifactLocator: string | null;
87
+ implementationEntrypoint: string | null;
88
+ implementationStatus: "executable-frozen" | "pending-source-acquisition";
89
+ implementationFreezeBeforeGate: "research-design" | "evidence-construct" | "pilot-methods";
90
+ environmentLockSha256: string | null;
91
+ environmentLockLocator: string | null;
92
+ environmentLockStatus: "exact-frozen" | "pending-runtime-lock";
93
+ environmentLockFreezeBeforeGate: "research-design" | "evidence-construct" | "pilot-methods";
94
+ artifactHashBasis: "raw-file-bytes";
95
+ baselineRole: "candidate" | "reference" | "strongest-available";
96
+ baselineSelectionJustification: string;
97
+ sourceEvidenceRoleIds: string[];
98
+ }[];
99
+ pendingParameters: {
100
+ id: string;
101
+ label: string;
102
+ distributionOrRange: string;
103
+ states: Array<{
104
+ id: string;
105
+ label: string;
106
+ value: string;
107
+ unit: string;
108
+ }>;
109
+ stateValueType: "numeric" | "categorical";
110
+ stateValueStatus: "frozen" | "pending-source-acquisition";
111
+ freezeBeforeGate: "research-design" | "evidence-construct" | "pilot-methods";
112
+ factorIds: string[];
113
+ applicationPoint: string;
114
+ compositionRule: string;
115
+ preservesFactorLevelIdentity: boolean;
116
+ sourceEvidenceRoleIds: string[];
117
+ quantityIds: string[];
118
+ }[];
119
+ policyRulesAwaitingIndependentJudgement: string[];
120
+ }>;
121
+ export {};