@tiangong-ai/cli 0.0.19 → 0.0.21

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 (58) hide show
  1. package/AGENTS.md +8 -2
  2. package/README.md +209 -4
  3. package/dist/cli.js +2 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/research/commands.js +6 -0
  6. package/dist/research/commands.js.map +1 -1
  7. package/dist/research/orchestration.d.ts +3 -0
  8. package/dist/research/orchestration.js +391 -0
  9. package/dist/research/orchestration.js.map +1 -0
  10. package/dist/research/workspace/broker.d.ts +5 -0
  11. package/dist/research/workspace/broker.js +729 -0
  12. package/dist/research/workspace/broker.js.map +1 -0
  13. package/dist/research/workspace/capabilities.d.ts +10 -0
  14. package/dist/research/workspace/capabilities.js +356 -0
  15. package/dist/research/workspace/capabilities.js.map +1 -0
  16. package/dist/research/workspace/constants.d.ts +8 -0
  17. package/dist/research/workspace/constants.js +41 -0
  18. package/dist/research/workspace/constants.js.map +1 -0
  19. package/dist/research/workspace/context.d.ts +3 -0
  20. package/dist/research/workspace/context.js +77 -0
  21. package/dist/research/workspace/context.js.map +1 -0
  22. package/dist/research/workspace/evidence.d.ts +32 -0
  23. package/dist/research/workspace/evidence.js +235 -0
  24. package/dist/research/workspace/evidence.js.map +1 -0
  25. package/dist/research/workspace/executor.d.ts +22 -0
  26. package/dist/research/workspace/executor.js +926 -0
  27. package/dist/research/workspace/executor.js.map +1 -0
  28. package/dist/research/workspace/input-plan.d.ts +5 -0
  29. package/dist/research/workspace/input-plan.js +319 -0
  30. package/dist/research/workspace/input-plan.js.map +1 -0
  31. package/dist/research/workspace/journal.d.ts +7 -0
  32. package/dist/research/workspace/journal.js +105 -0
  33. package/dist/research/workspace/journal.js.map +1 -0
  34. package/dist/research/workspace/preflight.d.ts +108 -0
  35. package/dist/research/workspace/preflight.js +261 -0
  36. package/dist/research/workspace/preflight.js.map +1 -0
  37. package/dist/research/workspace/projects.d.ts +12 -0
  38. package/dist/research/workspace/projects.js +514 -0
  39. package/dist/research/workspace/projects.js.map +1 -0
  40. package/dist/research/workspace/runtime.d.ts +31 -0
  41. package/dist/research/workspace/runtime.js +1637 -0
  42. package/dist/research/workspace/runtime.js.map +1 -0
  43. package/dist/research/workspace/sanitization.d.ts +5 -0
  44. package/dist/research/workspace/sanitization.js +72 -0
  45. package/dist/research/workspace/sanitization.js.map +1 -0
  46. package/dist/research/workspace/schemas.d.ts +17 -0
  47. package/dist/research/workspace/schemas.js +342 -0
  48. package/dist/research/workspace/schemas.js.map +1 -0
  49. package/dist/research/workspace/storage.d.ts +25 -0
  50. package/dist/research/workspace/storage.js +222 -0
  51. package/dist/research/workspace/storage.js.map +1 -0
  52. package/dist/research/workspace/types.d.ts +341 -0
  53. package/dist/research/workspace/types.js +2 -0
  54. package/dist/research/workspace/types.js.map +1 -0
  55. package/dist/research/workspace/workspace.d.ts +23 -0
  56. package/dist/research/workspace/workspace.js +702 -0
  57. package/dist/research/workspace/workspace.js.map +1 -0
  58. package/package.json +4 -2
@@ -0,0 +1,235 @@
1
+ import { constants as fsConstants } from "node:fs";
2
+ import { cp, lstat, open, readFile, readdir } from "node:fs/promises";
3
+ import { dirname, join } from "node:path";
4
+ import { CliError } from "../../errors.js";
5
+ import { ensureDirectory, pathExists, resolveContained, sha256Bytes, sha256File, workspacePaths, writeJsonAtomic, } from "./storage.js";
6
+ export async function persistBrokerEvidence(root, receipt, bytes, contextBytes = bytes) {
7
+ const digest = sha256Bytes(bytes);
8
+ const locator = `evidence/objects/${digest.slice(0, 2)}/${digest}`;
9
+ const contextDigest = sha256Bytes(contextBytes);
10
+ const contextLocator = `evidence/objects/${contextDigest.slice(0, 2)}/${contextDigest}`;
11
+ const paths = workspacePaths(root);
12
+ const objectPath = resolveContained(paths.control, locator);
13
+ await ensureDirectory(dirname(objectPath));
14
+ await writeImmutableObject(objectPath, bytes, digest);
15
+ if (contextDigest !== digest) {
16
+ const contextPath = resolveContained(paths.control, contextLocator);
17
+ await ensureDirectory(dirname(contextPath));
18
+ await writeImmutableObject(contextPath, contextBytes, contextDigest);
19
+ }
20
+ const value = {
21
+ schemaVersion: 1,
22
+ ...receipt,
23
+ bytes: bytes.byteLength,
24
+ sha256: digest,
25
+ locator,
26
+ contextLocator,
27
+ contextSha256: contextDigest,
28
+ contextBytes: contextBytes.byteLength,
29
+ contextEstimatedTokens: estimateBrokerContextTokens(contextBytes.byteLength),
30
+ servedAt: new Date().toISOString(),
31
+ };
32
+ const receiptPath = join(paths.projects, receipt.projectId, "evidence", "receipts", `${receipt.attemptId}.json`);
33
+ if (await pathExists(receiptPath)) {
34
+ const existing = JSON.parse(await readFile(receiptPath, "utf8"));
35
+ if (JSON.stringify(existing) !== JSON.stringify(value)) {
36
+ throw new CliError("Broker evidence receipt already exists with different content.", {
37
+ code: "RESEARCH_EVIDENCE_STORE_INVALID",
38
+ exitCode: 3,
39
+ });
40
+ }
41
+ }
42
+ else {
43
+ await writeJsonAtomic(receiptPath, value, 0o444);
44
+ }
45
+ return value;
46
+ }
47
+ export async function loadProjectEvidenceReceipts(root, projectId) {
48
+ const directory = join(workspacePaths(root).projects, projectId, "evidence", "receipts");
49
+ if (!(await pathExists(directory)))
50
+ return [];
51
+ const entries = await readdir(directory, { withFileTypes: true });
52
+ const receipts = [];
53
+ for (const entry of entries.sort((left, right) => left.name.localeCompare(right.name))) {
54
+ if (!entry.isFile() || entry.isSymbolicLink() || !entry.name.endsWith(".json"))
55
+ continue;
56
+ const value = JSON.parse(await readFile(join(directory, entry.name), "utf8"));
57
+ const receipt = parseReceipt(value);
58
+ if (receipt.projectId !== projectId || `${receipt.attemptId}.json` !== entry.name) {
59
+ throw evidenceStoreError("Broker evidence receipt identity does not match its path.");
60
+ }
61
+ await verifyEvidenceReceipt(root, receipt);
62
+ receipts.push(receipt);
63
+ }
64
+ return receipts;
65
+ }
66
+ export async function verifyEvidenceReceipt(root, receipt) {
67
+ const objectPath = resolveContained(workspacePaths(root).control, receipt.locator);
68
+ const info = await lstat(objectPath).catch(() => undefined);
69
+ if (!info?.isFile() || info.isSymbolicLink() || info.size !== receipt.bytes) {
70
+ throw evidenceStoreError(`Broker evidence object is missing or invalid: ${receipt.attemptId}`);
71
+ }
72
+ if ((await sha256File(objectPath)) !== receipt.sha256) {
73
+ throw evidenceStoreError(`Broker evidence object hash mismatch: ${receipt.attemptId}`);
74
+ }
75
+ const expectedLocator = `evidence/objects/${receipt.sha256.slice(0, 2)}/${receipt.sha256}`;
76
+ if (receipt.locator !== expectedLocator) {
77
+ throw evidenceStoreError(`Broker evidence locator is not content-addressed: ${receipt.attemptId}`);
78
+ }
79
+ const contextPath = resolveContained(workspacePaths(root).control, receipt.contextLocator);
80
+ const contextInfo = await lstat(contextPath).catch(() => undefined);
81
+ if (!contextInfo?.isFile() ||
82
+ contextInfo.isSymbolicLink() ||
83
+ contextInfo.size !== receipt.contextBytes ||
84
+ receipt.contextEstimatedTokens !== estimateBrokerContextTokens(receipt.contextBytes) ||
85
+ (await sha256File(contextPath)) !== receipt.contextSha256 ||
86
+ receipt.contextLocator !==
87
+ `evidence/objects/${receipt.contextSha256.slice(0, 2)}/${receipt.contextSha256}`) {
88
+ throw evidenceStoreError(`Broker evidence context object is invalid: ${receipt.attemptId}`);
89
+ }
90
+ return objectPath;
91
+ }
92
+ export async function stageProjectEvidence(root, projectId, capsuleProject) {
93
+ const receipts = await loadProjectEvidenceReceipts(root, projectId);
94
+ const copied = new Set();
95
+ for (const receipt of receipts) {
96
+ await verifyEvidenceReceipt(root, receipt);
97
+ for (const [digest, locator] of [
98
+ [receipt.sha256, receipt.locator],
99
+ [receipt.contextSha256, receipt.contextLocator],
100
+ ]) {
101
+ if (copied.has(digest))
102
+ continue;
103
+ const source = resolveContained(workspacePaths(root).control, locator);
104
+ const destination = resolveContained(capsuleProject, locator);
105
+ await ensureDirectory(dirname(destination));
106
+ await cp(source, destination, { errorOnExist: true, force: false });
107
+ copied.add(digest);
108
+ }
109
+ }
110
+ return receipts;
111
+ }
112
+ export async function cloneProjectEvidenceReceipts(root, sourceProjectId, targetProjectId) {
113
+ const receipts = await loadProjectEvidenceReceipts(root, sourceProjectId);
114
+ const destination = join(workspacePaths(root).projects, targetProjectId, "evidence", "receipts");
115
+ await ensureDirectory(destination);
116
+ const cloned = [];
117
+ for (const receipt of receipts) {
118
+ const value = { ...receipt, projectId: targetProjectId };
119
+ await writeJsonAtomic(join(destination, `${receipt.attemptId}.json`), value, 0o444);
120
+ cloned.push(value);
121
+ }
122
+ return cloned;
123
+ }
124
+ export async function loadBrokerEvidenceCache(root, cacheKeySha256) {
125
+ const path = brokerCachePath(root, cacheKeySha256);
126
+ if (!(await pathExists(path)))
127
+ return null;
128
+ const info = await lstat(path).catch(() => undefined);
129
+ if (!info?.isFile() || info.isSymbolicLink()) {
130
+ throw evidenceStoreError("Broker evidence cache entry is not a regular file.");
131
+ }
132
+ const value = JSON.parse(await readFile(path, "utf8"));
133
+ if (!value ||
134
+ typeof value !== "object" ||
135
+ Array.isArray(value) ||
136
+ value.cacheKeySha256 !== cacheKeySha256) {
137
+ throw evidenceStoreError("Broker evidence cache entry has an unsupported shape.");
138
+ }
139
+ const receipt = parseReceipt(value.receipt);
140
+ await verifyEvidenceReceipt(root, receipt);
141
+ return receipt;
142
+ }
143
+ export async function storeBrokerEvidenceCache(root, cacheKeySha256, receipt) {
144
+ if (!/^[0-9a-f]{64}$/.test(cacheKeySha256)) {
145
+ throw evidenceStoreError("Broker evidence cache key is invalid.");
146
+ }
147
+ await verifyEvidenceReceipt(root, receipt);
148
+ const path = brokerCachePath(root, cacheKeySha256);
149
+ if (await pathExists(path))
150
+ return;
151
+ await writeJsonAtomic(path, { schemaVersion: 1, cacheKeySha256, receipt }, 0o444);
152
+ }
153
+ function parseReceipt(value) {
154
+ if (!value ||
155
+ typeof value !== "object" ||
156
+ Array.isArray(value) ||
157
+ value.schemaVersion !== 1 ||
158
+ typeof value.attemptId !== "string" ||
159
+ typeof value.projectId !== "string" ||
160
+ typeof value.capabilityId !== "string" ||
161
+ !["string", "object"].includes(typeof value.credentialId) ||
162
+ typeof value.status !== "number" ||
163
+ typeof value.contentType !== "string" ||
164
+ !Number.isInteger(value.bytes) ||
165
+ typeof value.sha256 !== "string" ||
166
+ !/^[0-9a-f]{64}$/.test(value.sha256) ||
167
+ typeof value.sourceSha256 !== "string" ||
168
+ typeof value.locator !== "string" ||
169
+ typeof value.contextLocator !== "string" ||
170
+ typeof value.contextSha256 !== "string" ||
171
+ !/^[0-9a-f]{64}$/.test(value.contextSha256) ||
172
+ !Number.isInteger(value.contextBytes) ||
173
+ !Number.isInteger(value.contextEstimatedTokens) ||
174
+ value.contextEstimatedTokens < 0 ||
175
+ (value.contextItems !== null &&
176
+ !Number.isInteger(value.contextItems)) ||
177
+ (value.contextOffset !== undefined &&
178
+ (!Number.isInteger(value.contextOffset) ||
179
+ value.contextOffset < 0)) ||
180
+ (value.contextTotalItems !== undefined &&
181
+ value.contextTotalItems !== null &&
182
+ (!Number.isInteger(value.contextTotalItems) ||
183
+ value.contextTotalItems < 0)) ||
184
+ (value.contextNextOffset !== undefined &&
185
+ value.contextNextOffset !== null &&
186
+ (!Number.isInteger(value.contextNextOffset) ||
187
+ value.contextNextOffset < 0)) ||
188
+ typeof value.contextTruncated !== "boolean" ||
189
+ typeof value.retrievedAt !== "string" ||
190
+ typeof value.servedAt !== "string" ||
191
+ typeof value.cacheHit !== "boolean") {
192
+ throw evidenceStoreError("Broker evidence receipt has an unsupported shape.");
193
+ }
194
+ const receipt = value;
195
+ if (receipt.credentialId !== null && typeof receipt.credentialId !== "string") {
196
+ throw evidenceStoreError("Broker evidence credential identity is invalid.");
197
+ }
198
+ return receipt;
199
+ }
200
+ function brokerCachePath(root, cacheKeySha256) {
201
+ if (!/^[0-9a-f]{64}$/.test(cacheKeySha256)) {
202
+ throw evidenceStoreError("Broker evidence cache key is invalid.");
203
+ }
204
+ return join(workspacePaths(root).evidenceCache, cacheKeySha256.slice(0, 2), `${cacheKeySha256}.json`);
205
+ }
206
+ async function writeImmutableObject(path, bytes, expectedSha256) {
207
+ try {
208
+ const handle = await open(path, fsConstants.O_CREAT | fsConstants.O_EXCL | fsConstants.O_WRONLY | fsConstants.O_NOFOLLOW, 0o444);
209
+ try {
210
+ await handle.writeFile(bytes);
211
+ await handle.sync();
212
+ }
213
+ finally {
214
+ await handle.close();
215
+ }
216
+ }
217
+ catch (error) {
218
+ if (error.code !== "EEXIST")
219
+ throw error;
220
+ const info = await lstat(path).catch(() => undefined);
221
+ if (!info?.isFile() || info.isSymbolicLink() || (await sha256File(path)) !== expectedSha256) {
222
+ throw evidenceStoreError("Content-addressed evidence object failed its integrity check.");
223
+ }
224
+ }
225
+ }
226
+ function evidenceStoreError(message) {
227
+ return new CliError(message, {
228
+ code: "RESEARCH_EVIDENCE_STORE_INVALID",
229
+ exitCode: 3,
230
+ });
231
+ }
232
+ function estimateBrokerContextTokens(bytes) {
233
+ return Math.ceil(bytes / 3);
234
+ }
235
+ //# sourceMappingURL=evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../../src/research/workspace/evidence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { JsonSchema } from "./schemas.js";
2
+ import type { AgentRoute, AgentRuntimeFingerprint, ExecutionResult } from "./types.js";
3
+ export interface AgentExecutionRequest {
4
+ route: AgentRoute;
5
+ prompt: string;
6
+ outputSchema: JsonSchema;
7
+ requestId: string;
8
+ purpose: "primary" | "repair" | "doctor";
9
+ capsuleRoot: string;
10
+ projectRoot: string;
11
+ workspaceRoot: string;
12
+ timeoutSeconds: number;
13
+ maxTurns: number;
14
+ maxOutputTokens: number;
15
+ maxCostUsd: number;
16
+ expectedRuntime?: AgentRuntimeFingerprint | undefined;
17
+ toolPolicy?: "none" | "workspace-read";
18
+ environment: NodeJS.ProcessEnv;
19
+ brokerUrl: string | null;
20
+ }
21
+ export declare function executeAgent(request: AgentExecutionRequest): Promise<ExecutionResult>;
22
+ export declare function fingerprintAgentRoute(route: AgentRoute, environment: NodeJS.ProcessEnv): Promise<AgentRuntimeFingerprint>;