@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.
- package/AGENTS.md +8 -2
- package/README.md +209 -4
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/research/commands.js +6 -0
- package/dist/research/commands.js.map +1 -1
- package/dist/research/orchestration.d.ts +3 -0
- package/dist/research/orchestration.js +391 -0
- package/dist/research/orchestration.js.map +1 -0
- package/dist/research/workspace/broker.d.ts +5 -0
- package/dist/research/workspace/broker.js +729 -0
- package/dist/research/workspace/broker.js.map +1 -0
- package/dist/research/workspace/capabilities.d.ts +10 -0
- package/dist/research/workspace/capabilities.js +356 -0
- package/dist/research/workspace/capabilities.js.map +1 -0
- package/dist/research/workspace/constants.d.ts +8 -0
- package/dist/research/workspace/constants.js +41 -0
- package/dist/research/workspace/constants.js.map +1 -0
- package/dist/research/workspace/context.d.ts +3 -0
- package/dist/research/workspace/context.js +77 -0
- package/dist/research/workspace/context.js.map +1 -0
- package/dist/research/workspace/evidence.d.ts +32 -0
- package/dist/research/workspace/evidence.js +235 -0
- package/dist/research/workspace/evidence.js.map +1 -0
- package/dist/research/workspace/executor.d.ts +22 -0
- package/dist/research/workspace/executor.js +926 -0
- package/dist/research/workspace/executor.js.map +1 -0
- package/dist/research/workspace/input-plan.d.ts +5 -0
- package/dist/research/workspace/input-plan.js +319 -0
- package/dist/research/workspace/input-plan.js.map +1 -0
- package/dist/research/workspace/journal.d.ts +7 -0
- package/dist/research/workspace/journal.js +105 -0
- package/dist/research/workspace/journal.js.map +1 -0
- package/dist/research/workspace/preflight.d.ts +108 -0
- package/dist/research/workspace/preflight.js +261 -0
- package/dist/research/workspace/preflight.js.map +1 -0
- package/dist/research/workspace/projects.d.ts +12 -0
- package/dist/research/workspace/projects.js +514 -0
- package/dist/research/workspace/projects.js.map +1 -0
- package/dist/research/workspace/runtime.d.ts +31 -0
- package/dist/research/workspace/runtime.js +1637 -0
- package/dist/research/workspace/runtime.js.map +1 -0
- package/dist/research/workspace/sanitization.d.ts +5 -0
- package/dist/research/workspace/sanitization.js +72 -0
- package/dist/research/workspace/sanitization.js.map +1 -0
- package/dist/research/workspace/schemas.d.ts +17 -0
- package/dist/research/workspace/schemas.js +342 -0
- package/dist/research/workspace/schemas.js.map +1 -0
- package/dist/research/workspace/storage.d.ts +25 -0
- package/dist/research/workspace/storage.js +222 -0
- package/dist/research/workspace/storage.js.map +1 -0
- package/dist/research/workspace/types.d.ts +341 -0
- package/dist/research/workspace/types.js +2 -0
- package/dist/research/workspace/types.js.map +1 -0
- package/dist/research/workspace/workspace.d.ts +23 -0
- package/dist/research/workspace/workspace.js +702 -0
- package/dist/research/workspace/workspace.js.map +1 -0
- package/package.json +4 -2
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { WorkspacePaths } from "./types.js";
|
|
2
|
+
export declare function workspacePaths(root: string): WorkspacePaths;
|
|
3
|
+
export declare function ensureDirectory(path: string, mode?: number): Promise<void>;
|
|
4
|
+
export declare function readJsonFile<T>(path: string, label: string): Promise<T>;
|
|
5
|
+
export declare function writeJsonAtomic(path: string, value: unknown, mode?: number): Promise<void>;
|
|
6
|
+
export declare function writeTextAtomic(path: string, value: string, mode?: number): Promise<void>;
|
|
7
|
+
export declare function canonicalJson(value: unknown): string;
|
|
8
|
+
export declare function sha256Text(value: string): string;
|
|
9
|
+
export declare function sha256Bytes(value: Uint8Array): string;
|
|
10
|
+
export declare function sha256File(path: string): Promise<string>;
|
|
11
|
+
export declare function hashRegularTree(root: string): Promise<string>;
|
|
12
|
+
export declare function regularTreeFiles(root: string): Promise<string[]>;
|
|
13
|
+
export declare function fileRecord(path: string, logicalPath: string): Promise<{
|
|
14
|
+
path: string;
|
|
15
|
+
sha256: string;
|
|
16
|
+
bytes: number;
|
|
17
|
+
}>;
|
|
18
|
+
export declare function safeRelativePath(value: string, label: string): string;
|
|
19
|
+
export declare function resolveContained(root: string, logicalPath: string): string;
|
|
20
|
+
export declare function acquireFileLock(path: string, payload: unknown): Promise<() => Promise<void>>;
|
|
21
|
+
export declare function pathExists(path: string): Promise<boolean>;
|
|
22
|
+
export declare function fileSize(path: string): Promise<number>;
|
|
23
|
+
export declare function isObject(value: unknown): value is Record<string, unknown>;
|
|
24
|
+
export declare function requireAbsolutePath(value: string, label: string): string;
|
|
25
|
+
export declare function basenameWithoutExtension(path: string): string;
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { createReadStream, existsSync } from "node:fs";
|
|
3
|
+
import { chmod, lstat, mkdir, open, readFile, readdir, rename, rm, stat, writeFile, } from "node:fs/promises";
|
|
4
|
+
import { basename, dirname, join, relative, resolve, sep } from "node:path";
|
|
5
|
+
import { CliError } from "../../errors.js";
|
|
6
|
+
import { RESEARCH_CONTROL_DIRECTORY } from "./constants.js";
|
|
7
|
+
const IGNORED_TREE_NAMES = new Set([
|
|
8
|
+
".DS_Store",
|
|
9
|
+
".git",
|
|
10
|
+
".pytest_cache",
|
|
11
|
+
".ruff_cache",
|
|
12
|
+
"__pycache__",
|
|
13
|
+
"node_modules",
|
|
14
|
+
]);
|
|
15
|
+
export function workspacePaths(root) {
|
|
16
|
+
const canonicalRoot = resolve(root);
|
|
17
|
+
const control = join(canonicalRoot, RESEARCH_CONTROL_DIRECTORY);
|
|
18
|
+
return {
|
|
19
|
+
root: canonicalRoot,
|
|
20
|
+
control,
|
|
21
|
+
marker: join(control, "workspace.json"),
|
|
22
|
+
config: join(control, "config.json"),
|
|
23
|
+
runtimeLock: join(control, "runtime-lock.json"),
|
|
24
|
+
capabilityDeclarations: join(control, "capabilities.json"),
|
|
25
|
+
capabilityLock: join(control, "capabilities.lock.json"),
|
|
26
|
+
doctorAttestation: join(control, "doctor-attestation.json"),
|
|
27
|
+
env: join(control, ".env"),
|
|
28
|
+
envExample: join(control, ".env.example"),
|
|
29
|
+
journal: join(control, "journal.jsonl"),
|
|
30
|
+
evidence: join(control, "evidence"),
|
|
31
|
+
evidenceCache: join(control, "evidence", "cache"),
|
|
32
|
+
evidenceObjects: join(control, "evidence", "objects"),
|
|
33
|
+
projects: join(control, "projects"),
|
|
34
|
+
runtime: join(control, "runtime"),
|
|
35
|
+
locks: join(control, "locks"),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export async function ensureDirectory(path, mode = 0o700) {
|
|
39
|
+
await mkdir(path, { recursive: true, mode });
|
|
40
|
+
await chmod(path, mode).catch(() => undefined);
|
|
41
|
+
}
|
|
42
|
+
export async function readJsonFile(path, label) {
|
|
43
|
+
try {
|
|
44
|
+
return JSON.parse(await readFile(path, "utf8"));
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
throw new CliError(`${label} is missing or invalid: ${path}`, {
|
|
48
|
+
code: "RESEARCH_STATE_INVALID",
|
|
49
|
+
exitCode: 2,
|
|
50
|
+
details: { path, error: String(error) },
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export async function writeJsonAtomic(path, value, mode = 0o600) {
|
|
55
|
+
await ensureDirectory(dirname(path));
|
|
56
|
+
const temporary = `${path}.${process.pid}.${randomUUID()}.tmp`;
|
|
57
|
+
await writeFile(temporary, `${JSON.stringify(value, null, 2)}\n`, { encoding: "utf8", mode });
|
|
58
|
+
await chmod(temporary, mode).catch(() => undefined);
|
|
59
|
+
await rename(temporary, path);
|
|
60
|
+
}
|
|
61
|
+
export async function writeTextAtomic(path, value, mode = 0o600) {
|
|
62
|
+
await ensureDirectory(dirname(path));
|
|
63
|
+
const temporary = `${path}.${process.pid}.${randomUUID()}.tmp`;
|
|
64
|
+
await writeFile(temporary, value, { encoding: "utf8", mode });
|
|
65
|
+
await chmod(temporary, mode).catch(() => undefined);
|
|
66
|
+
await rename(temporary, path);
|
|
67
|
+
}
|
|
68
|
+
export function canonicalJson(value) {
|
|
69
|
+
return JSON.stringify(sortJson(value));
|
|
70
|
+
}
|
|
71
|
+
function sortJson(value) {
|
|
72
|
+
if (Array.isArray(value))
|
|
73
|
+
return value.map((item) => sortJson(item));
|
|
74
|
+
if (!isObject(value))
|
|
75
|
+
return value;
|
|
76
|
+
return Object.fromEntries(Object.keys(value)
|
|
77
|
+
.sort()
|
|
78
|
+
.map((key) => [key, sortJson(value[key])]));
|
|
79
|
+
}
|
|
80
|
+
export function sha256Text(value) {
|
|
81
|
+
return createHash("sha256").update(value, "utf8").digest("hex");
|
|
82
|
+
}
|
|
83
|
+
export function sha256Bytes(value) {
|
|
84
|
+
return createHash("sha256").update(value).digest("hex");
|
|
85
|
+
}
|
|
86
|
+
export async function sha256File(path) {
|
|
87
|
+
const hash = createHash("sha256");
|
|
88
|
+
await new Promise((resolvePromise, reject) => {
|
|
89
|
+
createReadStream(path)
|
|
90
|
+
.on("data", (chunk) => hash.update(chunk))
|
|
91
|
+
.on("error", reject)
|
|
92
|
+
.on("end", resolvePromise);
|
|
93
|
+
});
|
|
94
|
+
return hash.digest("hex");
|
|
95
|
+
}
|
|
96
|
+
export async function hashRegularTree(root) {
|
|
97
|
+
const rootInfo = await lstat(root).catch(() => undefined);
|
|
98
|
+
if (!rootInfo?.isDirectory() || rootInfo.isSymbolicLink()) {
|
|
99
|
+
throw new CliError(`Capability path must be a regular directory: ${root}`, {
|
|
100
|
+
code: "RESEARCH_CAPABILITY_INVALID",
|
|
101
|
+
exitCode: 2,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
const files = await regularTreeFiles(root);
|
|
105
|
+
const hash = createHash("sha256");
|
|
106
|
+
for (const path of files) {
|
|
107
|
+
const logicalPath = relative(root, path).split(sep).join("/");
|
|
108
|
+
const info = await lstat(path);
|
|
109
|
+
hash.update(`${logicalPath}\0${info.size}\0`, "utf8");
|
|
110
|
+
hash.update(await readFile(path));
|
|
111
|
+
hash.update("\0", "utf8");
|
|
112
|
+
}
|
|
113
|
+
return hash.digest("hex");
|
|
114
|
+
}
|
|
115
|
+
export async function regularTreeFiles(root) {
|
|
116
|
+
const files = [];
|
|
117
|
+
async function visit(directory) {
|
|
118
|
+
const entries = await readdir(directory, { withFileTypes: true });
|
|
119
|
+
entries.sort((left, right) => left.name.localeCompare(right.name));
|
|
120
|
+
for (const entry of entries) {
|
|
121
|
+
if (IGNORED_TREE_NAMES.has(entry.name))
|
|
122
|
+
continue;
|
|
123
|
+
const path = join(directory, entry.name);
|
|
124
|
+
const info = await lstat(path);
|
|
125
|
+
if (info.isSymbolicLink()) {
|
|
126
|
+
throw new CliError(`Symbolic links are not allowed in capability trees: ${path}`, {
|
|
127
|
+
code: "RESEARCH_CAPABILITY_INVALID",
|
|
128
|
+
exitCode: 2,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
if (info.isDirectory())
|
|
132
|
+
await visit(path);
|
|
133
|
+
else if (info.isFile())
|
|
134
|
+
files.push(path);
|
|
135
|
+
else {
|
|
136
|
+
throw new CliError(`Unsupported capability tree entry: ${path}`, {
|
|
137
|
+
code: "RESEARCH_CAPABILITY_INVALID",
|
|
138
|
+
exitCode: 2,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
await visit(root);
|
|
144
|
+
return files;
|
|
145
|
+
}
|
|
146
|
+
export async function fileRecord(path, logicalPath) {
|
|
147
|
+
const info = await lstat(path);
|
|
148
|
+
if (!info.isFile() || info.isSymbolicLink()) {
|
|
149
|
+
throw new CliError(`Expected a regular output file: ${path}`, {
|
|
150
|
+
code: "RESEARCH_OUTPUT_INVALID",
|
|
151
|
+
exitCode: 2,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
return { path: logicalPath, sha256: await sha256File(path), bytes: info.size };
|
|
155
|
+
}
|
|
156
|
+
export function safeRelativePath(value, label) {
|
|
157
|
+
const normalized = value.replaceAll("\\", "/");
|
|
158
|
+
if (!normalized ||
|
|
159
|
+
normalized.startsWith("/") ||
|
|
160
|
+
normalized.includes("\0") ||
|
|
161
|
+
normalized.split("/").some((part) => !part || part === "." || part === "..")) {
|
|
162
|
+
throw new CliError(`${label} must be a safe relative path.`, {
|
|
163
|
+
code: "RESEARCH_PATH_INVALID",
|
|
164
|
+
exitCode: 2,
|
|
165
|
+
details: { value },
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
return normalized;
|
|
169
|
+
}
|
|
170
|
+
export function resolveContained(root, logicalPath) {
|
|
171
|
+
const safe = safeRelativePath(logicalPath, "Output path");
|
|
172
|
+
const candidate = resolve(root, safe);
|
|
173
|
+
const prefix = `${resolve(root)}${sep}`;
|
|
174
|
+
if (!candidate.startsWith(prefix)) {
|
|
175
|
+
throw new CliError(`Path escapes its root: ${logicalPath}`, {
|
|
176
|
+
code: "RESEARCH_PATH_INVALID",
|
|
177
|
+
exitCode: 2,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
return candidate;
|
|
181
|
+
}
|
|
182
|
+
export async function acquireFileLock(path, payload) {
|
|
183
|
+
await ensureDirectory(dirname(path));
|
|
184
|
+
try {
|
|
185
|
+
const handle = await open(path, "wx", 0o600);
|
|
186
|
+
await handle.writeFile(`${JSON.stringify(payload)}\n`, "utf8");
|
|
187
|
+
await handle.close();
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
throw new CliError(`Research workspace is locked: ${path}`, {
|
|
191
|
+
code: "RESEARCH_WORKSPACE_LOCKED",
|
|
192
|
+
exitCode: 3,
|
|
193
|
+
details: { error: String(error) },
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
return async () => rm(path, { force: true });
|
|
197
|
+
}
|
|
198
|
+
export async function pathExists(path) {
|
|
199
|
+
return existsSync(path);
|
|
200
|
+
}
|
|
201
|
+
export async function fileSize(path) {
|
|
202
|
+
return (await stat(path)).size;
|
|
203
|
+
}
|
|
204
|
+
export function isObject(value) {
|
|
205
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
206
|
+
}
|
|
207
|
+
export function requireAbsolutePath(value, label) {
|
|
208
|
+
const canonical = resolve(value);
|
|
209
|
+
if (canonical !== value) {
|
|
210
|
+
throw new CliError(`${label} must be absolute: ${value}`, {
|
|
211
|
+
code: "RESEARCH_PATH_NOT_ABSOLUTE",
|
|
212
|
+
exitCode: 2,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
return canonical;
|
|
216
|
+
}
|
|
217
|
+
export function basenameWithoutExtension(path) {
|
|
218
|
+
const name = basename(path);
|
|
219
|
+
const dot = name.lastIndexOf(".");
|
|
220
|
+
return dot > 0 ? name.slice(0, dot) : name;
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/research/workspace/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
export type ContextRole = "workspace" | "unmanaged" | "invalid";
|
|
2
|
+
export type ProjectStatus = "ready" | "running" | "blocked" | "complete";
|
|
3
|
+
export type PackageStatus = "pending" | "ready" | "running" | "retry" | "failed" | "complete";
|
|
4
|
+
export type PackageKind = "agent" | "verify";
|
|
5
|
+
export type AgentKind = "codex" | "claude";
|
|
6
|
+
export type AgentReasoningEffort = "minimal" | "low" | "medium" | "high" | "xhigh" | "max";
|
|
7
|
+
export type AgentVerbosity = "low" | "medium" | "high";
|
|
8
|
+
export type ResearchMode = "smoke-test" | "production-research";
|
|
9
|
+
export type AgentPackageStage = "discover" | "analyze" | "synthesize" | "review";
|
|
10
|
+
export interface AgentPricing {
|
|
11
|
+
inputUsdPerMillionTokens: number;
|
|
12
|
+
cachedInputUsdPerMillionTokens: number;
|
|
13
|
+
outputUsdPerMillionTokens: number;
|
|
14
|
+
}
|
|
15
|
+
export interface AgentRoute {
|
|
16
|
+
agent: AgentKind;
|
|
17
|
+
binary: string;
|
|
18
|
+
wrapperTargetBinary?: string;
|
|
19
|
+
model: string | null;
|
|
20
|
+
effort?: AgentReasoningEffort;
|
|
21
|
+
verbosity?: AgentVerbosity;
|
|
22
|
+
pricing?: AgentPricing;
|
|
23
|
+
}
|
|
24
|
+
export interface ResearchBudget {
|
|
25
|
+
maxTokens: number;
|
|
26
|
+
maxCostUsd: number;
|
|
27
|
+
maxWallSeconds: number;
|
|
28
|
+
maxFilesPerPackage: number;
|
|
29
|
+
maxBytesPerPackage: number;
|
|
30
|
+
maxAttemptsPerPackage: number;
|
|
31
|
+
confirmationCostUsd: number;
|
|
32
|
+
packageMaxTokens: Record<AgentPackageStage, number>;
|
|
33
|
+
packageMaxWallSeconds: Record<AgentPackageStage, number>;
|
|
34
|
+
maxOutputTokens: number;
|
|
35
|
+
maxRepairTokens: number;
|
|
36
|
+
maxBrokerResponseBytes: number;
|
|
37
|
+
maxBrokerContextTokens: number;
|
|
38
|
+
maxBrokerItems: number;
|
|
39
|
+
maxInputContextTokens: number;
|
|
40
|
+
}
|
|
41
|
+
export interface WorkspaceMarker {
|
|
42
|
+
schemaVersion: 1;
|
|
43
|
+
kind: "tiangong-research-workspace";
|
|
44
|
+
workspaceId: string;
|
|
45
|
+
name: string;
|
|
46
|
+
createdAt: string;
|
|
47
|
+
}
|
|
48
|
+
export interface WorkspaceConfig {
|
|
49
|
+
schemaVersion: 1;
|
|
50
|
+
mode: ResearchMode;
|
|
51
|
+
producer: AgentRoute;
|
|
52
|
+
reviewer: AgentRoute;
|
|
53
|
+
budget: ResearchBudget;
|
|
54
|
+
}
|
|
55
|
+
export interface RuntimeLock {
|
|
56
|
+
schemaVersion: 1;
|
|
57
|
+
protocolVersion: 1;
|
|
58
|
+
packageName: "@tiangong-ai/cli";
|
|
59
|
+
packageVersion: string;
|
|
60
|
+
workspaceId: string;
|
|
61
|
+
}
|
|
62
|
+
export interface CapabilityCredentialDeclaration {
|
|
63
|
+
id: string;
|
|
64
|
+
allowedHosts: string[];
|
|
65
|
+
headerName: string;
|
|
66
|
+
prefix: string;
|
|
67
|
+
}
|
|
68
|
+
export interface CapabilityDeclaration {
|
|
69
|
+
id: string;
|
|
70
|
+
skillPath: string;
|
|
71
|
+
permissions: string[];
|
|
72
|
+
allowedHosts: string[];
|
|
73
|
+
http: {
|
|
74
|
+
accept: string;
|
|
75
|
+
allowedContentTypes: string[];
|
|
76
|
+
maxResponseBytes: number;
|
|
77
|
+
maxItems: number;
|
|
78
|
+
} | null;
|
|
79
|
+
coverage: {
|
|
80
|
+
dimensions: string[];
|
|
81
|
+
sourceTypes: string[];
|
|
82
|
+
fullText: boolean;
|
|
83
|
+
publicationDates: boolean;
|
|
84
|
+
} | null;
|
|
85
|
+
credentials: CapabilityCredentialDeclaration[];
|
|
86
|
+
}
|
|
87
|
+
export interface CapabilityDeclarations {
|
|
88
|
+
schemaVersion: 1;
|
|
89
|
+
capabilities: CapabilityDeclaration[];
|
|
90
|
+
}
|
|
91
|
+
export interface CapabilityLockRecord {
|
|
92
|
+
id: string;
|
|
93
|
+
skillName: string;
|
|
94
|
+
skillPath: string;
|
|
95
|
+
treeSha256: string;
|
|
96
|
+
policySha256: string;
|
|
97
|
+
permissions: string[];
|
|
98
|
+
credentialIds: string[];
|
|
99
|
+
}
|
|
100
|
+
export interface CapabilityLock {
|
|
101
|
+
schemaVersion: 1;
|
|
102
|
+
generatedAt: string;
|
|
103
|
+
capabilities: CapabilityLockRecord[];
|
|
104
|
+
}
|
|
105
|
+
export interface ProjectInput {
|
|
106
|
+
id: string;
|
|
107
|
+
role: "primary" | "reference" | "replication";
|
|
108
|
+
path: string;
|
|
109
|
+
sha256: string;
|
|
110
|
+
bytes: number;
|
|
111
|
+
contextPath?: string;
|
|
112
|
+
contextSha256?: string;
|
|
113
|
+
contextBytes?: number;
|
|
114
|
+
contextRanges?: ProjectInputLineRange[];
|
|
115
|
+
addedAt: string;
|
|
116
|
+
}
|
|
117
|
+
export interface ProjectInputLineRange {
|
|
118
|
+
startLine: number;
|
|
119
|
+
endLine: number;
|
|
120
|
+
}
|
|
121
|
+
export interface ProjectInputPlanEntry {
|
|
122
|
+
path: string;
|
|
123
|
+
contextPath?: string | null;
|
|
124
|
+
contextRanges?: ProjectInputLineRange[] | null;
|
|
125
|
+
role: ProjectInput["role"];
|
|
126
|
+
dimensions: string[];
|
|
127
|
+
sourceType: string;
|
|
128
|
+
fullText: boolean;
|
|
129
|
+
publicationDate: string | null;
|
|
130
|
+
}
|
|
131
|
+
export interface ProjectInputPlan {
|
|
132
|
+
schemaVersion: 1;
|
|
133
|
+
inputs: ProjectInputPlanEntry[];
|
|
134
|
+
}
|
|
135
|
+
export interface VerifiedProjectInputPlanEntry extends ProjectInputPlanEntry {
|
|
136
|
+
id: string;
|
|
137
|
+
sha256: string;
|
|
138
|
+
bytes: number;
|
|
139
|
+
contextSha256: string | null;
|
|
140
|
+
contextBytes: number | null;
|
|
141
|
+
}
|
|
142
|
+
export interface VerifiedProjectInputPlan {
|
|
143
|
+
schemaVersion: 1;
|
|
144
|
+
sha256: string;
|
|
145
|
+
inputs: VerifiedProjectInputPlanEntry[];
|
|
146
|
+
}
|
|
147
|
+
export interface ProjectEvidenceRequirements {
|
|
148
|
+
dimensions: string[];
|
|
149
|
+
sourceTypes: string[];
|
|
150
|
+
minSources: number;
|
|
151
|
+
minFullTextSources: number;
|
|
152
|
+
minDatedSources: number;
|
|
153
|
+
publicationDateFrom: string | null;
|
|
154
|
+
publicationDateTo: string | null;
|
|
155
|
+
}
|
|
156
|
+
export interface WorkPackage {
|
|
157
|
+
id: string;
|
|
158
|
+
stage: "discover" | "analyze" | "synthesize" | "review" | "close";
|
|
159
|
+
kind: PackageKind;
|
|
160
|
+
executor: "producer" | "reviewer" | "mechanical";
|
|
161
|
+
dependencies: string[];
|
|
162
|
+
expectedOutputs: string[];
|
|
163
|
+
status: PackageStatus;
|
|
164
|
+
attempts: number;
|
|
165
|
+
maxAttempts: number;
|
|
166
|
+
lastError: string | null;
|
|
167
|
+
lastFailureKind: FailureKind | null;
|
|
168
|
+
retryNotBefore: string | null;
|
|
169
|
+
startedAt: string | null;
|
|
170
|
+
completedAt: string | null;
|
|
171
|
+
}
|
|
172
|
+
export interface ProjectUsage {
|
|
173
|
+
tokens: number;
|
|
174
|
+
inputTokens: number;
|
|
175
|
+
cachedInputTokens: number;
|
|
176
|
+
outputTokens: number;
|
|
177
|
+
costUsd: number;
|
|
178
|
+
wallSeconds: number;
|
|
179
|
+
}
|
|
180
|
+
export interface ProjectState {
|
|
181
|
+
schemaVersion: 1;
|
|
182
|
+
id: string;
|
|
183
|
+
question: string;
|
|
184
|
+
status: ProjectStatus;
|
|
185
|
+
createdAt: string;
|
|
186
|
+
updatedAt: string;
|
|
187
|
+
budgetConfirmedAt: string | null;
|
|
188
|
+
inputs: ProjectInput[];
|
|
189
|
+
evidenceRequirements: ProjectEvidenceRequirements;
|
|
190
|
+
packages: WorkPackage[];
|
|
191
|
+
usage: ProjectUsage;
|
|
192
|
+
}
|
|
193
|
+
export interface OutputRecord {
|
|
194
|
+
path: string;
|
|
195
|
+
sha256: string;
|
|
196
|
+
bytes: number;
|
|
197
|
+
}
|
|
198
|
+
export interface ExecutionResult {
|
|
199
|
+
exitCode: number;
|
|
200
|
+
stdout: string;
|
|
201
|
+
stderr: string;
|
|
202
|
+
tokens: number;
|
|
203
|
+
inputTokens: number;
|
|
204
|
+
cachedInputTokens: number;
|
|
205
|
+
outputTokens: number;
|
|
206
|
+
costUsd: number;
|
|
207
|
+
wallSeconds: number;
|
|
208
|
+
model: string | null;
|
|
209
|
+
runtime: AgentRuntimeFingerprint | null;
|
|
210
|
+
telemetry?: AgentExecutionTelemetry | undefined;
|
|
211
|
+
}
|
|
212
|
+
export interface AgentExecutionTelemetry {
|
|
213
|
+
eventCounts: Record<string, number>;
|
|
214
|
+
itemCounts: Record<string, number>;
|
|
215
|
+
toolCalls: number;
|
|
216
|
+
providerTurns: number | null;
|
|
217
|
+
reasoningOutputTokens: number;
|
|
218
|
+
providerErrors: string[];
|
|
219
|
+
}
|
|
220
|
+
export interface AgentRuntimeFingerprint {
|
|
221
|
+
agent: AgentKind;
|
|
222
|
+
model: string | null;
|
|
223
|
+
effort?: AgentReasoningEffort;
|
|
224
|
+
verbosity?: AgentVerbosity | null;
|
|
225
|
+
binarySha256: string;
|
|
226
|
+
wrapperSha256: string;
|
|
227
|
+
adapterSha256: string;
|
|
228
|
+
binaryVersion: string;
|
|
229
|
+
platform: NodeJS.Platform;
|
|
230
|
+
architecture: string;
|
|
231
|
+
}
|
|
232
|
+
export type FailureKind = "configuration" | "authentication" | "rate-limit" | "server" | "structured-output" | "budget" | "transient" | "deterministic";
|
|
233
|
+
export interface RunRecord {
|
|
234
|
+
schemaVersion: 1;
|
|
235
|
+
runId: string;
|
|
236
|
+
projectId: string;
|
|
237
|
+
packageId: string;
|
|
238
|
+
executor: AgentKind | "mechanical";
|
|
239
|
+
startedAt: string;
|
|
240
|
+
completedAt: string;
|
|
241
|
+
exitCode: number;
|
|
242
|
+
tokens: number;
|
|
243
|
+
inputTokens: number;
|
|
244
|
+
cachedInputTokens: number;
|
|
245
|
+
outputTokens: number;
|
|
246
|
+
costUsd: number;
|
|
247
|
+
wallSeconds: number;
|
|
248
|
+
outputs: OutputRecord[];
|
|
249
|
+
stdoutSha256: string;
|
|
250
|
+
stderrSha256: string;
|
|
251
|
+
failureKind: FailureKind | null;
|
|
252
|
+
failureDetails?: Record<string, unknown> | null | undefined;
|
|
253
|
+
runtime: AgentRuntimeFingerprint | null;
|
|
254
|
+
telemetry?: AgentExecutionTelemetry | undefined;
|
|
255
|
+
}
|
|
256
|
+
export interface JournalEvent {
|
|
257
|
+
schemaVersion: 1;
|
|
258
|
+
sequence: number;
|
|
259
|
+
timestamp: string;
|
|
260
|
+
type: string;
|
|
261
|
+
scope: string;
|
|
262
|
+
payload: Record<string, unknown>;
|
|
263
|
+
previousHash: string;
|
|
264
|
+
hash: string;
|
|
265
|
+
}
|
|
266
|
+
export interface ContextInspection {
|
|
267
|
+
role: ContextRole;
|
|
268
|
+
selectedPath: string;
|
|
269
|
+
root: string | null;
|
|
270
|
+
allowedOperations: string[];
|
|
271
|
+
violations: Array<{
|
|
272
|
+
code: string;
|
|
273
|
+
message: string;
|
|
274
|
+
}>;
|
|
275
|
+
}
|
|
276
|
+
export interface DoctorCheck {
|
|
277
|
+
id: string;
|
|
278
|
+
status: "pass" | "fail" | "warn";
|
|
279
|
+
detail: string;
|
|
280
|
+
}
|
|
281
|
+
export interface WorkspaceDoctorResult {
|
|
282
|
+
workspace: string;
|
|
283
|
+
status: "ready" | "blocked";
|
|
284
|
+
checks: DoctorCheck[];
|
|
285
|
+
}
|
|
286
|
+
export interface WorkspaceDoctorAttestation {
|
|
287
|
+
schemaVersion: 1;
|
|
288
|
+
workspaceId: string;
|
|
289
|
+
checkedAt: string;
|
|
290
|
+
expiresAt: string;
|
|
291
|
+
configSha256: string;
|
|
292
|
+
runtimeLockSha256: string;
|
|
293
|
+
capabilityDeclarationsSha256: string;
|
|
294
|
+
capabilityLockSha256: string;
|
|
295
|
+
doctorSchemaSha256: string;
|
|
296
|
+
runtimes: AgentRuntimeFingerprint[];
|
|
297
|
+
smokeUsage: Array<{
|
|
298
|
+
agent: AgentKind;
|
|
299
|
+
tokens: number;
|
|
300
|
+
inputTokens: number;
|
|
301
|
+
cachedInputTokens: number;
|
|
302
|
+
outputTokens: number;
|
|
303
|
+
costUsd: number;
|
|
304
|
+
wallSeconds: number;
|
|
305
|
+
telemetry?: AgentExecutionTelemetry | undefined;
|
|
306
|
+
}>;
|
|
307
|
+
attestationSha256: string;
|
|
308
|
+
}
|
|
309
|
+
export interface WorkspacePaths {
|
|
310
|
+
root: string;
|
|
311
|
+
control: string;
|
|
312
|
+
marker: string;
|
|
313
|
+
config: string;
|
|
314
|
+
runtimeLock: string;
|
|
315
|
+
capabilityDeclarations: string;
|
|
316
|
+
capabilityLock: string;
|
|
317
|
+
doctorAttestation: string;
|
|
318
|
+
env: string;
|
|
319
|
+
envExample: string;
|
|
320
|
+
journal: string;
|
|
321
|
+
evidence: string;
|
|
322
|
+
evidenceCache: string;
|
|
323
|
+
evidenceObjects: string;
|
|
324
|
+
projects: string;
|
|
325
|
+
runtime: string;
|
|
326
|
+
locks: string;
|
|
327
|
+
}
|
|
328
|
+
export interface ResearchProgressEvent {
|
|
329
|
+
schemaVersion: 1;
|
|
330
|
+
type: "run.started" | "package.started" | "package.heartbeat" | "package.completed" | "package.failed" | "run.completed";
|
|
331
|
+
timestamp: string;
|
|
332
|
+
requestId: string;
|
|
333
|
+
projectId: string | null;
|
|
334
|
+
packageId: string | null;
|
|
335
|
+
remainingBudget: {
|
|
336
|
+
tokens: number;
|
|
337
|
+
costUsd: number;
|
|
338
|
+
wallSeconds: number;
|
|
339
|
+
} | null;
|
|
340
|
+
detail?: Record<string, unknown>;
|
|
341
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/research/workspace/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type AgentExecutionRequest } from "./executor.js";
|
|
2
|
+
import type { RuntimeLock, WorkspaceConfig, WorkspaceDoctorResult, WorkspaceMarker, ResearchMode, ExecutionResult, WorkspaceDoctorAttestation } from "./types.js";
|
|
3
|
+
export declare function initializeResearchWorkspace(targetPath: string, name: string | undefined, mode?: ResearchMode): Promise<{
|
|
4
|
+
workspace: string;
|
|
5
|
+
workspaceId: string;
|
|
6
|
+
created: string[];
|
|
7
|
+
}>;
|
|
8
|
+
export declare function requireResearchWorkspace(inputPath: string): Promise<string>;
|
|
9
|
+
export declare function loadWorkspaceMarker(root: string): Promise<WorkspaceMarker>;
|
|
10
|
+
export declare function loadWorkspaceConfig(root: string): Promise<WorkspaceConfig>;
|
|
11
|
+
export interface DoctorOptions {
|
|
12
|
+
agentSmoke?: boolean;
|
|
13
|
+
environment?: NodeJS.ProcessEnv;
|
|
14
|
+
executor?: (request: AgentExecutionRequest) => Promise<ExecutionResult>;
|
|
15
|
+
}
|
|
16
|
+
export declare function doctorResearchWorkspace(inputPath: string, options?: DoctorOptions): Promise<WorkspaceDoctorResult>;
|
|
17
|
+
export declare function verifyDoctorAttestation(root: string): Promise<{
|
|
18
|
+
status: "verified" | "missing" | "invalid" | "expired" | "drifted";
|
|
19
|
+
errors: string[];
|
|
20
|
+
attestation: WorkspaceDoctorAttestation | null;
|
|
21
|
+
}>;
|
|
22
|
+
export declare function withWorkspaceLock<T>(root: string, operation: string, callback: () => Promise<T>): Promise<T>;
|
|
23
|
+
export declare function requireCurrentRuntimeLock(root: string, knownMarker?: WorkspaceMarker): Promise<RuntimeLock>;
|