@tiangong-ai/cli 0.0.18 → 0.0.20

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 (47) hide show
  1. package/AGENTS.md +8 -2
  2. package/README.md +81 -12
  3. package/dist/cli.js +3 -1
  4. package/dist/cli.js.map +1 -1
  5. package/dist/research/commands.js +13 -5
  6. package/dist/research/commands.js.map +1 -1
  7. package/dist/research/config.d.ts +1 -0
  8. package/dist/research/config.js +18 -1
  9. package/dist/research/config.js.map +1 -1
  10. package/dist/research/orchestration.d.ts +3 -0
  11. package/dist/research/orchestration.js +236 -0
  12. package/dist/research/orchestration.js.map +1 -0
  13. package/dist/research/types.d.ts +1 -1
  14. package/dist/research/workspace/broker.d.ts +5 -0
  15. package/dist/research/workspace/broker.js +353 -0
  16. package/dist/research/workspace/broker.js.map +1 -0
  17. package/dist/research/workspace/capabilities.d.ts +10 -0
  18. package/dist/research/workspace/capabilities.js +291 -0
  19. package/dist/research/workspace/capabilities.js.map +1 -0
  20. package/dist/research/workspace/constants.d.ts +8 -0
  21. package/dist/research/workspace/constants.js +37 -0
  22. package/dist/research/workspace/constants.js.map +1 -0
  23. package/dist/research/workspace/context.d.ts +3 -0
  24. package/dist/research/workspace/context.js +77 -0
  25. package/dist/research/workspace/context.js.map +1 -0
  26. package/dist/research/workspace/executor.d.ts +12 -0
  27. package/dist/research/workspace/executor.js +353 -0
  28. package/dist/research/workspace/executor.js.map +1 -0
  29. package/dist/research/workspace/journal.d.ts +7 -0
  30. package/dist/research/workspace/journal.js +104 -0
  31. package/dist/research/workspace/journal.js.map +1 -0
  32. package/dist/research/workspace/projects.d.ts +9 -0
  33. package/dist/research/workspace/projects.js +230 -0
  34. package/dist/research/workspace/projects.js.map +1 -0
  35. package/dist/research/workspace/runtime.d.ts +27 -0
  36. package/dist/research/workspace/runtime.js +519 -0
  37. package/dist/research/workspace/runtime.js.map +1 -0
  38. package/dist/research/workspace/storage.d.ts +25 -0
  39. package/dist/research/workspace/storage.js +218 -0
  40. package/dist/research/workspace/storage.js.map +1 -0
  41. package/dist/research/workspace/types.d.ts +181 -0
  42. package/dist/research/workspace/types.js +2 -0
  43. package/dist/research/workspace/types.js.map +1 -0
  44. package/dist/research/workspace/workspace.d.ts +12 -0
  45. package/dist/research/workspace/workspace.js +340 -0
  46. package/dist/research/workspace/workspace.js.map +1 -0
  47. package/package.json +3 -2
@@ -0,0 +1,353 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { createServer } from "node:http";
3
+ import { readFile, writeFile } from "node:fs/promises";
4
+ import { join, relative } from "node:path";
5
+ import { CliError } from "../../errors.js";
6
+ import { loadCapabilityDeclarations, verifyCapabilities } from "./capabilities.js";
7
+ import { appendJournalEvent } from "./journal.js";
8
+ import { ensureDirectory, isObject, pathExists, sha256Bytes, sha256Text, workspacePaths, } from "./storage.js";
9
+ const MAX_REQUEST_BYTES = 1024 * 1024;
10
+ const MAX_RESPONSE_BYTES = 5 * 1024 * 1024;
11
+ export async function startCapabilityBroker(root, projectId, capsuleProject) {
12
+ const declarations = await loadCapabilityDeclarations(root);
13
+ const networkCapabilities = declarations.capabilities.filter((capability) => capability.permissions.includes("brokered-network"));
14
+ if (!networkCapabilities.length)
15
+ return undefined;
16
+ const verification = await verifyCapabilities(root);
17
+ if (verification.status !== "verified") {
18
+ throw new CliError("Capability broker requires verified capability locks.", {
19
+ code: "RESEARCH_CAPABILITY_DRIFT",
20
+ exitCode: 3,
21
+ details: verification,
22
+ });
23
+ }
24
+ const credentialMap = await loadCredentialMap(root, declarations.capabilities);
25
+ const routeToken = randomUUID().replaceAll("-", "");
26
+ const route = `/mcp/${routeToken}`;
27
+ const server = createServer((request, response) => {
28
+ void handleMcpRequest({
29
+ request,
30
+ response,
31
+ route,
32
+ root,
33
+ projectId,
34
+ capsuleProject,
35
+ capabilities: networkCapabilities,
36
+ credentialMap,
37
+ });
38
+ });
39
+ await new Promise((resolvePromise, reject) => {
40
+ server.once("error", reject);
41
+ server.listen(0, "127.0.0.1", () => resolvePromise());
42
+ });
43
+ const address = server.address();
44
+ if (!address || typeof address === "string") {
45
+ server.close();
46
+ throw new Error("Capability broker did not receive a TCP address.");
47
+ }
48
+ return {
49
+ url: `http://127.0.0.1:${address.port}${route}`,
50
+ stop: () => new Promise((resolvePromise, reject) => {
51
+ server.close((error) => (error ? reject(error) : resolvePromise()));
52
+ }),
53
+ };
54
+ }
55
+ async function handleMcpRequest(input) {
56
+ try {
57
+ if (input.request.method !== "POST" || input.request.url !== input.route) {
58
+ sendJson(input.response, 404, { error: "not_found" });
59
+ return;
60
+ }
61
+ const body = await readRequestJson(input.request);
62
+ if (!isObject(body) || body.jsonrpc !== "2.0" || typeof body.method !== "string") {
63
+ sendRpcError(input.response, body, -32600, "Invalid Request");
64
+ return;
65
+ }
66
+ if (body.method === "notifications/initialized") {
67
+ input.response.writeHead(202).end();
68
+ return;
69
+ }
70
+ if (body.method === "initialize") {
71
+ sendRpcResult(input.response, body, {
72
+ protocolVersion: "2025-03-26",
73
+ capabilities: { tools: {} },
74
+ serverInfo: { name: "tiangong-research-broker", version: "1" },
75
+ });
76
+ return;
77
+ }
78
+ if (body.method === "tools/list") {
79
+ sendRpcResult(input.response, body, {
80
+ tools: [
81
+ {
82
+ name: "fetch_candidate_source",
83
+ description: "Fetch one HTTPS candidate source through a locked capability and record a value-free receipt.",
84
+ inputSchema: {
85
+ type: "object",
86
+ additionalProperties: false,
87
+ required: ["capability_id", "url"],
88
+ properties: {
89
+ capability_id: { type: "string" },
90
+ credential_id: { type: "string" },
91
+ url: { type: "string" },
92
+ },
93
+ },
94
+ },
95
+ ],
96
+ });
97
+ return;
98
+ }
99
+ if (body.method === "tools/call") {
100
+ const params = body.params;
101
+ if (!isObject(params) ||
102
+ params.name !== "fetch_candidate_source" ||
103
+ !isObject(params.arguments)) {
104
+ sendToolError(input.response, body, "Unsupported tool call.");
105
+ return;
106
+ }
107
+ try {
108
+ const receipt = await fetchCandidateSource({
109
+ root: input.root,
110
+ projectId: input.projectId,
111
+ capsuleProject: input.capsuleProject,
112
+ capabilities: input.capabilities,
113
+ credentialMap: input.credentialMap,
114
+ arguments: params.arguments,
115
+ });
116
+ sendRpcResult(input.response, body, {
117
+ content: [{ type: "text", text: JSON.stringify(receipt) }],
118
+ });
119
+ }
120
+ catch (error) {
121
+ sendToolError(input.response, body, error instanceof Error ? error.message : String(error));
122
+ }
123
+ return;
124
+ }
125
+ sendRpcError(input.response, body, -32601, "Method not found");
126
+ }
127
+ catch (error) {
128
+ sendJson(input.response, 500, {
129
+ error: error instanceof Error ? error.message : String(error),
130
+ });
131
+ }
132
+ }
133
+ async function fetchCandidateSource(input) {
134
+ const capabilityId = input.arguments.capability_id;
135
+ const credentialId = input.arguments.credential_id;
136
+ const rawUrl = input.arguments.url;
137
+ if (typeof capabilityId !== "string" || typeof rawUrl !== "string") {
138
+ throw new Error("capability_id and url are required strings");
139
+ }
140
+ if (credentialId !== undefined && typeof credentialId !== "string") {
141
+ throw new Error("credential_id must be a string when provided");
142
+ }
143
+ const capability = input.capabilities.find((candidate) => candidate.id === capabilityId);
144
+ if (!capability)
145
+ throw new Error(`capability is not admitted for brokered network: ${capabilityId}`);
146
+ const target = validateHttpsUrl(rawUrl);
147
+ const credential = credentialId
148
+ ? capability.credentials.find((candidate) => candidate.id === credentialId)
149
+ : undefined;
150
+ if (credentialId && !credential) {
151
+ throw new Error(`credential is not declared by capability ${capabilityId}: ${credentialId}`);
152
+ }
153
+ assertAllowedHost(target, capability.allowedHosts, "capability");
154
+ if (credential)
155
+ assertAllowedHost(target, credential.allowedHosts, "credential");
156
+ const attemptId = randomUUID();
157
+ await appendJournalEvent(workspacePaths(input.root).journal, "capability.fetch.attempted", input.projectId, {
158
+ attemptId,
159
+ projectId: input.projectId,
160
+ capabilityId,
161
+ credentialId: credentialId ?? null,
162
+ targetSha256: sha256Text(target.toString()),
163
+ });
164
+ try {
165
+ const headers = new Headers({
166
+ Accept: "text/plain, application/json, text/html;q=0.9, */*;q=0.1",
167
+ });
168
+ if (credential) {
169
+ const value = input.credentialMap.get(credential.id);
170
+ if (!value)
171
+ throw new Error(`credential value is not configured: ${credential.id}`);
172
+ headers.set(credential.headerName, `${credential.prefix}${value}`);
173
+ }
174
+ const { response, finalUrl } = await fetchWithRedirectPolicy(target, headers, capability.allowedHosts, credential?.allowedHosts);
175
+ const announcedLength = Number(response.headers.get("content-length") ?? "0");
176
+ if (announcedLength > MAX_RESPONSE_BYTES)
177
+ throw new Error("response exceeds the broker size limit");
178
+ const bytes = await readBoundedResponseBody(response);
179
+ for (const secret of input.credentialMap.values()) {
180
+ if (bytes.includes(Buffer.from(secret, "utf8"))) {
181
+ throw new Error("response failed credential disclosure screening");
182
+ }
183
+ }
184
+ if (!response.ok)
185
+ throw new Error(`HTTPS source returned status ${response.status}`);
186
+ const contentType = response.headers.get("content-type")?.split(";", 1)[0]?.trim() ?? "application/octet-stream";
187
+ const extension = contentType.includes("json")
188
+ ? "json"
189
+ : contentType.startsWith("text/")
190
+ ? "txt"
191
+ : "bin";
192
+ const destination = join(input.capsuleProject, "inputs", "broker", `${attemptId}.${extension}`);
193
+ await ensureDirectory(join(input.capsuleProject, "inputs", "broker"));
194
+ await writeFile(destination, bytes, { mode: 0o600 });
195
+ const receipt = {
196
+ attemptId,
197
+ capabilityId,
198
+ credentialId: credentialId ?? null,
199
+ status: response.status,
200
+ contentType,
201
+ bytes: bytes.length,
202
+ sha256: sha256Bytes(bytes),
203
+ sourceSha256: sha256Text(finalUrl.toString()),
204
+ path: relative(input.capsuleProject, destination).replaceAll("\\", "/"),
205
+ };
206
+ await appendJournalEvent(workspacePaths(input.root).journal, "capability.fetch.completed", input.projectId, receipt);
207
+ return receipt;
208
+ }
209
+ catch (error) {
210
+ await appendJournalEvent(workspacePaths(input.root).journal, "capability.fetch.failed", input.projectId, {
211
+ attemptId,
212
+ capabilityId,
213
+ credentialId: credentialId ?? null,
214
+ error: bounded(error instanceof Error ? error.message : String(error), 500),
215
+ });
216
+ throw error;
217
+ }
218
+ }
219
+ async function loadCredentialMap(root, capabilities) {
220
+ const path = workspacePaths(root).env;
221
+ if (!(await pathExists(path)))
222
+ return new Map();
223
+ const content = await readFile(path, "utf8");
224
+ const configured = new Map();
225
+ let foundConfiguration = false;
226
+ const declared = new Set(capabilities.flatMap((capability) => capability.credentials.map((credential) => credential.id)));
227
+ for (const sourceLine of content.split(/\r?\n/)) {
228
+ const line = sourceLine.trim();
229
+ if (!line || line.startsWith("#"))
230
+ continue;
231
+ const equals = line.indexOf("=");
232
+ const key = equals > 0 ? line.slice(0, equals).trim() : "";
233
+ if (key !== "TIANGONG_RESEARCH_CAPABILITY_CREDENTIALS_JSON") {
234
+ throw new Error(`unsupported research environment key: ${key || "missing"}`);
235
+ }
236
+ if (foundConfiguration)
237
+ throw new Error("research credential configuration is duplicated");
238
+ foundConfiguration = true;
239
+ const value = JSON.parse(line.slice(equals + 1).trim() || "{}");
240
+ if (!isObject(value))
241
+ throw new Error("capability credentials must be a JSON object");
242
+ for (const [credentialId, credentialValue] of Object.entries(value)) {
243
+ if (!declared.has(credentialId))
244
+ throw new Error(`credential is not declared: ${credentialId}`);
245
+ if (typeof credentialValue !== "string" || Buffer.byteLength(credentialValue, "utf8") < 8) {
246
+ throw new Error(`credential value is invalid: ${credentialId}`);
247
+ }
248
+ configured.set(credentialId, credentialValue);
249
+ }
250
+ }
251
+ return configured;
252
+ }
253
+ async function fetchWithRedirectPolicy(initialUrl, headers, capabilityHosts, credentialHosts) {
254
+ let current = initialUrl;
255
+ for (let redirects = 0; redirects <= 5; redirects += 1) {
256
+ assertAllowedHost(current, capabilityHosts, "capability");
257
+ if (credentialHosts)
258
+ assertAllowedHost(current, credentialHosts, "credential");
259
+ const response = await fetch(current, {
260
+ method: "GET",
261
+ headers,
262
+ redirect: "manual",
263
+ signal: AbortSignal.timeout(120_000),
264
+ });
265
+ if (![301, 302, 303, 307, 308].includes(response.status)) {
266
+ return { response, finalUrl: current };
267
+ }
268
+ const location = response.headers.get("location");
269
+ await response.body?.cancel();
270
+ if (!location)
271
+ throw new Error("HTTPS source returned a redirect without a location");
272
+ if (redirects === 5)
273
+ throw new Error("HTTPS source exceeded the redirect limit");
274
+ current = validateHttpsUrl(new URL(location, current).toString());
275
+ }
276
+ throw new Error("HTTPS source exceeded the redirect limit");
277
+ }
278
+ function assertAllowedHost(url, allowedHosts, scope) {
279
+ if (!allowedHosts.includes(url.host)) {
280
+ throw new Error(`target host is outside ${scope} scope: ${url.host}`);
281
+ }
282
+ }
283
+ async function readBoundedResponseBody(response) {
284
+ if (!response.body)
285
+ return Buffer.alloc(0);
286
+ const reader = response.body.getReader();
287
+ const chunks = [];
288
+ let bytes = 0;
289
+ try {
290
+ while (true) {
291
+ const result = await reader.read();
292
+ if (result.done)
293
+ break;
294
+ const chunk = Buffer.from(result.value);
295
+ bytes += chunk.length;
296
+ if (bytes > MAX_RESPONSE_BYTES) {
297
+ await reader.cancel();
298
+ throw new Error("response exceeds the broker size limit");
299
+ }
300
+ chunks.push(chunk);
301
+ }
302
+ }
303
+ finally {
304
+ reader.releaseLock();
305
+ }
306
+ return Buffer.concat(chunks);
307
+ }
308
+ function validateHttpsUrl(value) {
309
+ const url = new URL(value);
310
+ if (url.protocol !== "https:" || url.username || url.password || !url.hostname) {
311
+ throw new Error("broker URL must be credential-free HTTPS");
312
+ }
313
+ return url;
314
+ }
315
+ async function readRequestJson(request) {
316
+ const chunks = [];
317
+ let bytes = 0;
318
+ for await (const chunk of request) {
319
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
320
+ bytes += buffer.length;
321
+ if (bytes > MAX_REQUEST_BYTES)
322
+ throw new Error("MCP request exceeds its size limit");
323
+ chunks.push(buffer);
324
+ }
325
+ return JSON.parse(Buffer.concat(chunks).toString("utf8"));
326
+ }
327
+ function sendRpcResult(response, request, result) {
328
+ sendJson(response, 200, { jsonrpc: "2.0", id: request.id ?? null, result });
329
+ }
330
+ function sendRpcError(response, request, code, message) {
331
+ const id = isObject(request) ? (request.id ?? null) : null;
332
+ sendJson(response, 200, { jsonrpc: "2.0", id, error: { code, message } });
333
+ }
334
+ function sendToolError(response, request, message) {
335
+ sendRpcResult(response, request, {
336
+ content: [{ type: "text", text: message }],
337
+ isError: true,
338
+ });
339
+ }
340
+ function sendJson(response, status, value) {
341
+ if (response.headersSent)
342
+ return;
343
+ const body = `${JSON.stringify(value)}\n`;
344
+ response.writeHead(status, {
345
+ "content-type": "application/json",
346
+ "content-length": Buffer.byteLength(body),
347
+ });
348
+ response.end(body);
349
+ }
350
+ function bounded(value, length) {
351
+ return value.length <= length ? value : `${value.slice(0, length)}…`;
352
+ }
353
+ //# sourceMappingURL=broker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broker.js","sourceRoot":"","sources":["../../../src/research/workspace/broker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { CapabilityDeclarations, CapabilityLock } from "./types.js";
2
+ export declare function loadCapabilityDeclarations(root: string): Promise<CapabilityDeclarations>;
3
+ export declare function lockCapabilities(root: string): Promise<CapabilityLock>;
4
+ export declare function verifyCapabilities(root: string): Promise<{
5
+ status: "verified" | "drifted";
6
+ checked: number;
7
+ errors: string[];
8
+ }>;
9
+ export declare function stageLockedCapabilities(root: string, destination: string): Promise<string[]>;
10
+ export declare function declaredCredentialIds(root: string): Promise<Set<string>>;