overleaf-codex 0.1.0-rc.1
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.
Potentially problematic release.
This version of overleaf-codex might be problematic. Click here for more details.
- package/LICENSE +21 -0
- package/NOTICE.md +25 -0
- package/README.md +217 -0
- package/assets/olcx-mark.svg +22 -0
- package/dist/auth/projectAuth.d.ts +19 -0
- package/dist/auth/projectAuth.js +163 -0
- package/dist/auth/projectAuth.js.map +1 -0
- package/dist/auth/redact.d.ts +3 -0
- package/dist/auth/redact.js +7 -0
- package/dist/auth/redact.js.map +1 -0
- package/dist/auth/types.d.ts +10 -0
- package/dist/auth/types.js +4 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/backend/index.d.ts +6 -0
- package/dist/backend/index.js +2 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/olcli/client.d.ts +329 -0
- package/dist/backend/olcli/client.js +1757 -0
- package/dist/backend/olcli/client.js.map +1 -0
- package/dist/backend/olcli/index.d.ts +2 -0
- package/dist/backend/olcli/index.js +2 -0
- package/dist/backend/olcli/index.js.map +1 -0
- package/dist/backend/overleafBackend.d.ts +41 -0
- package/dist/backend/overleafBackend.js +200 -0
- package/dist/backend/overleafBackend.js.map +1 -0
- package/dist/backend/types.d.ts +73 -0
- package/dist/backend/types.js +2 -0
- package/dist/backend/types.js.map +1 -0
- package/dist/cli-behavior.d.ts +14 -0
- package/dist/cli-behavior.js +59 -0
- package/dist/cli-behavior.js.map +1 -0
- package/dist/cli.d.ts +30 -0
- package/dist/cli.js +441 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/auth.d.ts +21 -0
- package/dist/commands/auth.js +104 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/compile.d.ts +7 -0
- package/dist/commands/compile.js +73 -0
- package/dist/commands/compile.js.map +1 -0
- package/dist/commands/doctor.d.ts +11 -0
- package/dist/commands/doctor.js +9 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/endpoint.d.ts +23 -0
- package/dist/commands/endpoint.js +69 -0
- package/dist/commands/endpoint.js.map +1 -0
- package/dist/commands/init.d.ts +14 -0
- package/dist/commands/init.js +48 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/status.d.ts +4 -0
- package/dist/commands/status.js +5 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync.d.ts +26 -0
- package/dist/commands/sync.js +139 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/watch.d.ts +28 -0
- package/dist/commands/watch.js +124 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/compile/compileFlow.d.ts +32 -0
- package/dist/compile/compileFlow.js +290 -0
- package/dist/compile/compileFlow.js.map +1 -0
- package/dist/compile/pdfOutput.d.ts +12 -0
- package/dist/compile/pdfOutput.js +64 -0
- package/dist/compile/pdfOutput.js.map +1 -0
- package/dist/config/ignoreRules.d.ts +5 -0
- package/dist/config/ignoreRules.js +53 -0
- package/dist/config/ignoreRules.js.map +1 -0
- package/dist/config/overleafProject.d.ts +9 -0
- package/dist/config/overleafProject.js +61 -0
- package/dist/config/overleafProject.js.map +1 -0
- package/dist/config/projectConfig.d.ts +6 -0
- package/dist/config/projectConfig.js +180 -0
- package/dist/config/projectConfig.js.map +1 -0
- package/dist/config/projectRoot.d.ts +1 -0
- package/dist/config/projectRoot.js +36 -0
- package/dist/config/projectRoot.js.map +1 -0
- package/dist/config/types.d.ts +50 -0
- package/dist/config/types.js +34 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/vscode.d.ts +10 -0
- package/dist/config/vscode.js +134 -0
- package/dist/config/vscode.js.map +1 -0
- package/dist/diagnostics/doctor.d.ts +8 -0
- package/dist/diagnostics/doctor.js +209 -0
- package/dist/diagnostics/doctor.js.map +1 -0
- package/dist/diagnostics/status.d.ts +6 -0
- package/dist/diagnostics/status.js +110 -0
- package/dist/diagnostics/status.js.map +1 -0
- package/dist/diagnostics/types.d.ts +33 -0
- package/dist/diagnostics/types.js +2 -0
- package/dist/diagnostics/types.js.map +1 -0
- package/dist/endpoint/overleafEndpoint.d.ts +36 -0
- package/dist/endpoint/overleafEndpoint.js +105 -0
- package/dist/endpoint/overleafEndpoint.js.map +1 -0
- package/dist/errors.d.ts +32 -0
- package/dist/errors.js +53 -0
- package/dist/errors.js.map +1 -0
- package/dist/sync/apply.d.ts +14 -0
- package/dist/sync/apply.js +92 -0
- package/dist/sync/apply.js.map +1 -0
- package/dist/sync/conflicts.d.ts +7 -0
- package/dist/sync/conflicts.js +59 -0
- package/dist/sync/conflicts.js.map +1 -0
- package/dist/sync/ignore.d.ts +5 -0
- package/dist/sync/ignore.js +74 -0
- package/dist/sync/ignore.js.map +1 -0
- package/dist/sync/plan.d.ts +3 -0
- package/dist/sync/plan.js +197 -0
- package/dist/sync/plan.js.map +1 -0
- package/dist/sync/snapshot.d.ts +13 -0
- package/dist/sync/snapshot.js +82 -0
- package/dist/sync/snapshot.js.map +1 -0
- package/dist/sync/state.d.ts +16 -0
- package/dist/sync/state.js +214 -0
- package/dist/sync/state.js.map +1 -0
- package/dist/sync/types.d.ts +113 -0
- package/dist/sync/types.js +4 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/testing/fakeBackend.d.ts +27 -0
- package/dist/testing/fakeBackend.js +213 -0
- package/dist/testing/fakeBackend.js.map +1 -0
- package/dist/watch/queue.d.ts +2 -0
- package/dist/watch/queue.js +91 -0
- package/dist/watch/queue.js.map +1 -0
- package/dist/watch/types.d.ts +52 -0
- package/dist/watch/types.js +2 -0
- package/dist/watch/types.js.map +1 -0
- package/dist/watch/watcher.d.ts +6 -0
- package/dist/watch/watcher.js +58 -0
- package/dist/watch/watcher.js.map +1 -0
- package/dist/watch/workflow.d.ts +30 -0
- package/dist/watch/workflow.js +62 -0
- package/dist/watch/workflow.js.map +1 -0
- package/docs/architecture.md +603 -0
- package/docs/auth.md +65 -0
- package/docs/cli-behavior.md +95 -0
- package/docs/compile.md +51 -0
- package/docs/design.md +82 -0
- package/docs/endpoint.md +84 -0
- package/docs/npm-packaging.md +148 -0
- package/docs/quickdev-queue-audit.md +193 -0
- package/docs/release-gates.md +119 -0
- package/docs/release-notes-v1.md +97 -0
- package/docs/security.md +61 -0
- package/docs/sync-state.md +305 -0
- package/docs/sync.md +50 -0
- package/docs/troubleshooting.md +124 -0
- package/docs/usage.md +184 -0
- package/examples/minimal-paper/.olcx/auth.local.example.json +7 -0
- package/examples/minimal-paper/.olcx/config.json +23 -0
- package/examples/minimal-paper/README.md +88 -0
- package/examples/minimal-paper/main.tex +23 -0
- package/package.json +66 -0
- package/src/backend/olcli/LICENSE +21 -0
- package/src/backend/olcli/README.md +26 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type BackendProjectInput, type CompileLogEntry, type CompileResult, type OverleafBackend, type OverleafBackendFactory } from "../backend/index.js";
|
|
2
|
+
import { type OlcxError } from "../errors.js";
|
|
3
|
+
export interface CompileFastFallbackOverrides {
|
|
4
|
+
enabled?: boolean;
|
|
5
|
+
attempts?: number;
|
|
6
|
+
timeoutMs?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface CompileProjectInput {
|
|
9
|
+
cwd: string;
|
|
10
|
+
pdfPath?: string;
|
|
11
|
+
backend?: OverleafBackend;
|
|
12
|
+
createBackend?: OverleafBackendFactory;
|
|
13
|
+
env?: Record<string, string | undefined>;
|
|
14
|
+
now?: () => Date;
|
|
15
|
+
fastFallback?: CompileFastFallbackOverrides;
|
|
16
|
+
}
|
|
17
|
+
export interface CompileProjectResult {
|
|
18
|
+
projectRoot: string;
|
|
19
|
+
pdfPath: string;
|
|
20
|
+
absolutePdfPath: string;
|
|
21
|
+
status: "success" | "fallback-success";
|
|
22
|
+
warnings: string[];
|
|
23
|
+
logs: CompileLogEntry[];
|
|
24
|
+
elapsedMs: number;
|
|
25
|
+
fallbackUsed: boolean;
|
|
26
|
+
bytesWritten: number;
|
|
27
|
+
}
|
|
28
|
+
export declare function compileProject(input: CompileProjectInput): Promise<CompileProjectResult>;
|
|
29
|
+
export declare function runCompileWithTimeout(run: () => Promise<CompileResult>, timeoutMs: number): Promise<CompileResult>;
|
|
30
|
+
export declare function createCompileFailure(compile: CompileResult): OlcxError;
|
|
31
|
+
export declare function downloadPdfAfterSuccessfulCompile(backend: OverleafBackend, input: BackendProjectInput, compile: CompileResult): Promise<Uint8Array>;
|
|
32
|
+
export declare function summarizeCompileLogs(logs: CompileLogEntry[], limit?: number): string[];
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import { resolveProjectAuth } from "../auth/projectAuth.js";
|
|
2
|
+
import { createOlcliOverleafBackend, } from "../backend/index.js";
|
|
3
|
+
import { readProjectConfig } from "../config/projectConfig.js";
|
|
4
|
+
import { findProjectRoot } from "../config/projectRoot.js";
|
|
5
|
+
import { MAX_FAST_FALLBACK_ATTEMPTS } from "../config/types.js";
|
|
6
|
+
import { createOlcxError, isOlcxError } from "../errors.js";
|
|
7
|
+
import { resolvePdfOutputTarget, writePdfOutput } from "./pdfOutput.js";
|
|
8
|
+
export async function compileProject(input) {
|
|
9
|
+
const projectRoot = await findProjectRoot(input.cwd);
|
|
10
|
+
const config = await readProjectConfig(projectRoot);
|
|
11
|
+
const auth = await resolveProjectAuth(projectRoot, {
|
|
12
|
+
env: input.env,
|
|
13
|
+
now: input.now,
|
|
14
|
+
});
|
|
15
|
+
const outputTarget = resolvePdfOutputTarget(projectRoot, input.pdfPath ?? config.pdfPath);
|
|
16
|
+
const backend = input.backend ??
|
|
17
|
+
(input.createBackend ?? createOlcliOverleafBackend)({ baseUrl: config.overleaf.baseUrl });
|
|
18
|
+
const fastFallback = resolveFastFallbackConfig(config.compile.fastFallback, input.fastFallback);
|
|
19
|
+
const compileInput = {
|
|
20
|
+
projectId: config.projectId,
|
|
21
|
+
auth,
|
|
22
|
+
timeoutMs: config.compile.timeoutMs,
|
|
23
|
+
rootDocument: config.rootDocument,
|
|
24
|
+
fastMode: undefined,
|
|
25
|
+
};
|
|
26
|
+
const normal = await runCompilePhase(backend, compileInput, config.compile.timeoutMs);
|
|
27
|
+
if (normal.ok) {
|
|
28
|
+
return writeSuccessfulCompile({ projectRoot, outputTarget, backend, compileInput, compile: normal.compile });
|
|
29
|
+
}
|
|
30
|
+
if (!isRecoverableCompileFailure(normal) || !fastFallback.enabled || fastFallback.attempts === 0) {
|
|
31
|
+
throw normal.error;
|
|
32
|
+
}
|
|
33
|
+
const fallback = await runFastFallback({
|
|
34
|
+
projectRoot,
|
|
35
|
+
outputTarget,
|
|
36
|
+
backend,
|
|
37
|
+
compileInput,
|
|
38
|
+
normal,
|
|
39
|
+
attempts: fastFallback.attempts,
|
|
40
|
+
timeoutMs: fastFallback.timeoutMs,
|
|
41
|
+
});
|
|
42
|
+
return fallback;
|
|
43
|
+
}
|
|
44
|
+
async function writeSuccessfulCompile(input) {
|
|
45
|
+
const { projectRoot, outputTarget, backend, compileInput, compile } = input;
|
|
46
|
+
const pdfBytes = compile.pdfBytes ?? (await downloadPdfAfterSuccessfulCompile(backend, compileInput, compile));
|
|
47
|
+
const written = await writePdfOutput(outputTarget, pdfBytes);
|
|
48
|
+
return {
|
|
49
|
+
projectRoot,
|
|
50
|
+
pdfPath: written.relativePath,
|
|
51
|
+
absolutePdfPath: written.absolutePath,
|
|
52
|
+
status: compile.status,
|
|
53
|
+
warnings: compile.warnings,
|
|
54
|
+
logs: compile.logs,
|
|
55
|
+
elapsedMs: compile.elapsedMs,
|
|
56
|
+
fallbackUsed: compile.fallbackUsed,
|
|
57
|
+
bytesWritten: written.bytesWritten,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
async function runFastFallback(input) {
|
|
61
|
+
let session;
|
|
62
|
+
let restoreStatus = "restore-not-started";
|
|
63
|
+
let restoreWarning;
|
|
64
|
+
let fallback;
|
|
65
|
+
try {
|
|
66
|
+
session = await beginFastCompileSession(input.backend, {
|
|
67
|
+
projectId: input.compileInput.projectId,
|
|
68
|
+
auth: input.compileInput.auth,
|
|
69
|
+
});
|
|
70
|
+
for (let attempt = 0; attempt < input.attempts; attempt += 1) {
|
|
71
|
+
const fallbackInput = {
|
|
72
|
+
...input.compileInput,
|
|
73
|
+
...session.compileOptions,
|
|
74
|
+
timeoutMs: input.timeoutMs,
|
|
75
|
+
};
|
|
76
|
+
fallback = await runCompilePhase(input.backend, fallbackInput, input.timeoutMs);
|
|
77
|
+
if (fallback.ok) {
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
if (!isOlcxError(error)) {
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
fallback = { ok: false, error };
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
if (session) {
|
|
90
|
+
try {
|
|
91
|
+
const restore = await session.restore();
|
|
92
|
+
restoreStatus = restore.status;
|
|
93
|
+
restoreWarning = restore.warning;
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
restoreStatus = "restore-failed";
|
|
97
|
+
restoreWarning = error instanceof Error ? error.message : String(error);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (fallback?.ok) {
|
|
102
|
+
const warnings = [...fallback.compile.warnings];
|
|
103
|
+
if (restoreWarning) {
|
|
104
|
+
warnings.push(`Fast/draft compile settings restore warning: ${restoreWarning}`);
|
|
105
|
+
}
|
|
106
|
+
return writeSuccessfulCompile({
|
|
107
|
+
projectRoot: input.projectRoot,
|
|
108
|
+
outputTarget: input.outputTarget,
|
|
109
|
+
backend: input.backend,
|
|
110
|
+
compileInput: input.compileInput,
|
|
111
|
+
compile: { ...fallback.compile, warnings },
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
throw createFallbackFailure({
|
|
115
|
+
normal: input.normal,
|
|
116
|
+
fallback,
|
|
117
|
+
restoreStatus,
|
|
118
|
+
restoreWarning,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
async function runCompilePhase(backend, input, timeoutMs) {
|
|
122
|
+
try {
|
|
123
|
+
const compile = await runCompileWithTimeout(() => backend.compile(input), timeoutMs);
|
|
124
|
+
if (isSuccessfulCompile(compile)) {
|
|
125
|
+
return { ok: true, compile };
|
|
126
|
+
}
|
|
127
|
+
return { ok: false, error: createCompileFailure(compile), compile };
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
if (isOlcxError(error)) {
|
|
131
|
+
return { ok: false, error };
|
|
132
|
+
}
|
|
133
|
+
throw error;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function isSuccessfulCompile(compile) {
|
|
137
|
+
return compile.status === "success" || compile.status === "fallback-success";
|
|
138
|
+
}
|
|
139
|
+
const RECOVERABLE_COMPILE_FAILURE_PATTERN = /timeout|timed out|compile timeout|time limit|upgrade required/i;
|
|
140
|
+
function isRecoverableCompileFailure(outcome) {
|
|
141
|
+
if (outcome.ok)
|
|
142
|
+
return false;
|
|
143
|
+
if (outcome.error.code === "COMPILE_TIMEOUT")
|
|
144
|
+
return true;
|
|
145
|
+
if (outcome.compile?.status === "timeout")
|
|
146
|
+
return true;
|
|
147
|
+
const haystack = [
|
|
148
|
+
outcome.error.message,
|
|
149
|
+
outcome.error.hint,
|
|
150
|
+
...summarizeCompileLogs(outcome.compile?.logs ?? []),
|
|
151
|
+
...Object.values(outcome.error.details ?? {}).map((value) => (typeof value === "string" ? value : "")),
|
|
152
|
+
].join("\n");
|
|
153
|
+
return RECOVERABLE_COMPILE_FAILURE_PATTERN.test(haystack);
|
|
154
|
+
}
|
|
155
|
+
function resolveFastFallbackConfig(config, overrides) {
|
|
156
|
+
const effective = {
|
|
157
|
+
enabled: overrides?.enabled ?? config.enabled,
|
|
158
|
+
attempts: overrides?.attempts ?? config.attempts,
|
|
159
|
+
timeoutMs: overrides?.timeoutMs ?? config.timeoutMs,
|
|
160
|
+
};
|
|
161
|
+
if (!Number.isInteger(effective.attempts) || effective.attempts < 0 || effective.attempts > MAX_FAST_FALLBACK_ATTEMPTS) {
|
|
162
|
+
throw createOlcxError({
|
|
163
|
+
code: "USER_INPUT_ERROR",
|
|
164
|
+
message: `Fast fallback attempts must be an integer from 0 to ${MAX_FAST_FALLBACK_ATTEMPTS}.`,
|
|
165
|
+
hint: "Use --fast-fallback-attempts with a value from 0 through 3.",
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
if (!Number.isInteger(effective.timeoutMs) || effective.timeoutMs <= 0) {
|
|
169
|
+
throw createOlcxError({
|
|
170
|
+
code: "USER_INPUT_ERROR",
|
|
171
|
+
message: "Fast fallback timeout must be a positive integer in milliseconds.",
|
|
172
|
+
hint: "Use --fast-fallback-timeout with a positive millisecond value.",
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
return effective;
|
|
176
|
+
}
|
|
177
|
+
function defaultFastCompileSession() {
|
|
178
|
+
return {
|
|
179
|
+
strategy: "request-draft",
|
|
180
|
+
compileOptions: { fastMode: true },
|
|
181
|
+
async restore() {
|
|
182
|
+
return { status: "restore-not-needed" };
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
async function beginFastCompileSession(backend, input) {
|
|
187
|
+
return backend.beginFastCompile ? backend.beginFastCompile(input) : defaultFastCompileSession();
|
|
188
|
+
}
|
|
189
|
+
function summarizeFailure(error, compile) {
|
|
190
|
+
return {
|
|
191
|
+
code: error.code,
|
|
192
|
+
message: error.message,
|
|
193
|
+
logSummary: summarizeCompileLogs(compile?.logs ?? []),
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
function createFallbackFailure(input) {
|
|
197
|
+
return createOlcxError({
|
|
198
|
+
code: "COMPILE_FAILED",
|
|
199
|
+
message: "Overleaf compile failed and fast/draft fallback also failed.",
|
|
200
|
+
hint: "Inspect the normal compile logs and fallback compile logs, then retry olcx compile.",
|
|
201
|
+
details: {
|
|
202
|
+
normalFailure: input.normal.ok ? undefined : summarizeFailure(input.normal.error, input.normal.compile),
|
|
203
|
+
fallbackFailure: input.fallback && !input.fallback.ok ? summarizeFailure(input.fallback.error, input.fallback.compile) : undefined,
|
|
204
|
+
restoreStatus: input.restoreStatus,
|
|
205
|
+
restoreWarning: input.restoreWarning,
|
|
206
|
+
logSummary: input.fallback && !input.fallback.ok ? summarizeCompileLogs(input.fallback.compile?.logs ?? []) : [],
|
|
207
|
+
},
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
export async function runCompileWithTimeout(run, timeoutMs) {
|
|
211
|
+
let timeout;
|
|
212
|
+
try {
|
|
213
|
+
return await Promise.race([
|
|
214
|
+
run(),
|
|
215
|
+
new Promise((_resolve, reject) => {
|
|
216
|
+
timeout = setTimeout(() => {
|
|
217
|
+
reject(createOlcxError({
|
|
218
|
+
code: "COMPILE_TIMEOUT",
|
|
219
|
+
message: `Overleaf compile timed out after ${timeoutMs}ms.`,
|
|
220
|
+
hint: "Increase compile.timeoutMs in .olcx/config.json or inspect the project on Overleaf.",
|
|
221
|
+
details: { timeoutMs },
|
|
222
|
+
}));
|
|
223
|
+
}, timeoutMs);
|
|
224
|
+
}),
|
|
225
|
+
]);
|
|
226
|
+
}
|
|
227
|
+
finally {
|
|
228
|
+
if (timeout !== undefined) {
|
|
229
|
+
clearTimeout(timeout);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
export function createCompileFailure(compile) {
|
|
234
|
+
const code = compile.status === "timeout" ? "COMPILE_TIMEOUT" : "COMPILE_FAILED";
|
|
235
|
+
const primaryLog = compile.logs.find((log) => log.level === "error") ?? compile.logs[0];
|
|
236
|
+
const fallbackMessage = compile.error?.message ?? (compile.status === "timeout" ? "Compile timed out." : "Compile failed.");
|
|
237
|
+
const primaryMessage = primaryLog?.message ?? fallbackMessage;
|
|
238
|
+
const message = compile.status === "timeout"
|
|
239
|
+
? `Overleaf compile timed out: ${primaryMessage}`
|
|
240
|
+
: `Overleaf compile failed: ${primaryMessage}`;
|
|
241
|
+
return createOlcxError({
|
|
242
|
+
code,
|
|
243
|
+
message,
|
|
244
|
+
hint: compile.status === "timeout"
|
|
245
|
+
? "Increase compile.timeoutMs in .olcx/config.json or inspect the project on Overleaf."
|
|
246
|
+
: "Inspect the Overleaf compile logs before retrying.",
|
|
247
|
+
details: {
|
|
248
|
+
status: compile.status,
|
|
249
|
+
logs: compile.logs,
|
|
250
|
+
warnings: compile.warnings,
|
|
251
|
+
elapsedMs: compile.elapsedMs,
|
|
252
|
+
fallbackUsed: compile.fallbackUsed,
|
|
253
|
+
logSummary: summarizeCompileLogs(compile.logs),
|
|
254
|
+
},
|
|
255
|
+
cause: compile.error,
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
export async function downloadPdfAfterSuccessfulCompile(backend, input, compile) {
|
|
259
|
+
try {
|
|
260
|
+
return await backend.downloadPdf({
|
|
261
|
+
projectId: input.projectId,
|
|
262
|
+
auth: input.auth,
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
if (isOlcxError(error)) {
|
|
267
|
+
throw error;
|
|
268
|
+
}
|
|
269
|
+
throw createOlcxError({
|
|
270
|
+
code: "COMPILE_FAILED",
|
|
271
|
+
message: "Compiled PDF could not be downloaded after a successful Overleaf compile.",
|
|
272
|
+
hint: "Retry olcx compile; if it repeats, inspect the Overleaf compile output in the browser.",
|
|
273
|
+
details: {
|
|
274
|
+
operation: "downloadPdf",
|
|
275
|
+
status: compile.status,
|
|
276
|
+
logs: compile.logs,
|
|
277
|
+
warnings: compile.warnings,
|
|
278
|
+
logSummary: summarizeCompileLogs(compile.logs),
|
|
279
|
+
causeCode: isOlcxError(error) ? error.code : "unknown",
|
|
280
|
+
},
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
export function summarizeCompileLogs(logs, limit = 8) {
|
|
285
|
+
return logs.slice(0, limit).map((log) => {
|
|
286
|
+
const location = [log.file, log.line].filter((entry) => entry !== undefined).join(":");
|
|
287
|
+
return [log.level, location, log.message].filter((entry) => entry !== undefined && entry !== "").join(" ");
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=compileFlow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compileFlow.js","sourceRoot":"","sources":["../../src/compile/compileFlow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface PdfOutputTarget {
|
|
2
|
+
projectRoot: string;
|
|
3
|
+
relativePath: string;
|
|
4
|
+
absolutePath: string;
|
|
5
|
+
}
|
|
6
|
+
export interface PdfOutputWriteResult {
|
|
7
|
+
relativePath: string;
|
|
8
|
+
absolutePath: string;
|
|
9
|
+
bytesWritten: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function resolvePdfOutputTarget(projectRoot: string, pdfPath: string): PdfOutputTarget;
|
|
12
|
+
export declare function writePdfOutput(target: PdfOutputTarget, bytes: Uint8Array): Promise<PdfOutputWriteResult>;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname, isAbsolute, relative, resolve, sep, win32 } from "node:path";
|
|
3
|
+
import { createOlcxError, isOlcxError } from "../errors.js";
|
|
4
|
+
export function resolvePdfOutputTarget(projectRoot, pdfPath) {
|
|
5
|
+
const normalized = normalizeSafeRelativePdfPath(pdfPath);
|
|
6
|
+
const resolvedRoot = resolve(projectRoot);
|
|
7
|
+
const absolutePath = resolve(resolvedRoot, ...normalized.split("/"));
|
|
8
|
+
const relativeToRoot = relative(resolvedRoot, absolutePath);
|
|
9
|
+
if (relativeToRoot === ".." || relativeToRoot.startsWith(`..${sep}`) || isAbsolute(relativeToRoot)) {
|
|
10
|
+
throw unsafePdfPathError(pdfPath);
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
projectRoot: resolvedRoot,
|
|
14
|
+
relativePath: normalized,
|
|
15
|
+
absolutePath,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export async function writePdfOutput(target, bytes) {
|
|
19
|
+
try {
|
|
20
|
+
await mkdir(dirname(target.absolutePath), { recursive: true });
|
|
21
|
+
await writeFile(target.absolutePath, bytes);
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
if (isOlcxError(error)) {
|
|
25
|
+
throw error;
|
|
26
|
+
}
|
|
27
|
+
throw createOlcxError({
|
|
28
|
+
code: "IO_ERROR",
|
|
29
|
+
message: `Failed to write compiled PDF to ${target.relativePath}.`,
|
|
30
|
+
hint: "Check directory permissions and retry olcx compile.",
|
|
31
|
+
details: { path: target.relativePath },
|
|
32
|
+
cause: error,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
relativePath: target.relativePath,
|
|
37
|
+
absolutePath: target.absolutePath,
|
|
38
|
+
bytesWritten: bytes.byteLength,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function normalizeSafeRelativePdfPath(pdfPath) {
|
|
42
|
+
if (typeof pdfPath !== "string" || pdfPath.trim().length === 0) {
|
|
43
|
+
throw unsafePdfPathError(pdfPath);
|
|
44
|
+
}
|
|
45
|
+
const trimmed = pdfPath.trim();
|
|
46
|
+
if (isAbsolute(trimmed) || win32.isAbsolute(trimmed)) {
|
|
47
|
+
throw unsafePdfPathError(pdfPath);
|
|
48
|
+
}
|
|
49
|
+
const normalized = trimmed.replace(/\\/g, "/");
|
|
50
|
+
const segments = normalized.split("/").filter((segment) => segment.length > 0 && segment !== ".");
|
|
51
|
+
if (segments.length === 0 || segments.some((segment) => segment === "..")) {
|
|
52
|
+
throw unsafePdfPathError(pdfPath);
|
|
53
|
+
}
|
|
54
|
+
return segments.join("/");
|
|
55
|
+
}
|
|
56
|
+
function unsafePdfPathError(pdfPath) {
|
|
57
|
+
return createOlcxError({
|
|
58
|
+
code: "USER_INPUT_ERROR",
|
|
59
|
+
message: "PDF output path must be a safe relative path inside the project root.",
|
|
60
|
+
hint: "Use a path like build/overleaf/main.pdf or pass --pdf with a project-relative path.",
|
|
61
|
+
details: { path: pdfPath },
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=pdfOutput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdfOutput.js","sourceRoot":"","sources":["../../src/compile/pdfOutput.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const REQUIRED_GITIGNORE_ENTRIES: readonly [".olcx/auth.local.json", ".olcx/*.local.json", ".olcx/*.secret.json", ".olcx/state/", "build/overleaf/", "*.aux", "*.log", "*.synctex.gz"];
|
|
2
|
+
export declare function ensureGitignoreEntries(projectRoot: string): Promise<{
|
|
3
|
+
changed: boolean;
|
|
4
|
+
added: string[];
|
|
5
|
+
}>;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
export const REQUIRED_GITIGNORE_ENTRIES = [
|
|
4
|
+
".olcx/auth.local.json",
|
|
5
|
+
".olcx/*.local.json",
|
|
6
|
+
".olcx/*.secret.json",
|
|
7
|
+
".olcx/state/",
|
|
8
|
+
"build/overleaf/",
|
|
9
|
+
"*.aux",
|
|
10
|
+
"*.log",
|
|
11
|
+
"*.synctex.gz",
|
|
12
|
+
];
|
|
13
|
+
const MARKER_COMMENT = "# Local paper-project state created by olcx.";
|
|
14
|
+
export async function ensureGitignoreEntries(projectRoot) {
|
|
15
|
+
const path = join(projectRoot, ".gitignore");
|
|
16
|
+
const existing = await readExistingGitignore(path);
|
|
17
|
+
const lines = existing.content.split(/\r?\n/);
|
|
18
|
+
const existingEntries = new Set(lines.map((line) => line.trim()).filter((line) => line.length > 0));
|
|
19
|
+
const added = REQUIRED_GITIGNORE_ENTRIES.filter((entry) => !existingEntries.has(entry));
|
|
20
|
+
if (added.length === 0) {
|
|
21
|
+
return { changed: false, added: [] };
|
|
22
|
+
}
|
|
23
|
+
const newline = existing.newline;
|
|
24
|
+
const blocks = [];
|
|
25
|
+
if (existing.content.length > 0) {
|
|
26
|
+
blocks.push(ensureEndsWithNewline(existing.content, newline));
|
|
27
|
+
if (!existing.content.endsWith("\n") && !existing.content.endsWith("\r\n")) {
|
|
28
|
+
blocks.push(newline);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (existing.content.length > 0 && !existing.content.endsWith(`${newline}${newline}`)) {
|
|
32
|
+
blocks.push(newline);
|
|
33
|
+
}
|
|
34
|
+
blocks.push([MARKER_COMMENT, ...added].join(newline), newline);
|
|
35
|
+
await writeFile(path, blocks.join(""), "utf8");
|
|
36
|
+
return { changed: true, added };
|
|
37
|
+
}
|
|
38
|
+
async function readExistingGitignore(path) {
|
|
39
|
+
try {
|
|
40
|
+
const content = await readFile(path, "utf8");
|
|
41
|
+
return { content, newline: content.includes("\r\n") ? "\r\n" : "\n" };
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
if (typeof error === "object" && error !== null && error.code === "ENOENT") {
|
|
45
|
+
return { content: "", newline: "\n" };
|
|
46
|
+
}
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function ensureEndsWithNewline(content, newline) {
|
|
51
|
+
return content.endsWith("\n") || content.endsWith("\r\n") ? content : `${content}${newline}`;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=ignoreRules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ignoreRules.js","sourceRoot":"","sources":["../../src/config/ignoreRules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,uBAAuB;IACvB,oBAAoB;IACpB,qBAAqB;IACrB,cAAc;IACd,iBAAiB;IACjB,OAAO;IACP,OAAO;IACP,cAAc;CACN,CAAC;AAEX,MAAM,cAAc,GAAG,8CAA8C,CAAC;AAEtE,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,WAAmB;IAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACpG,MAAM,KAAK,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAExF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACvC,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;IACjC,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC9D,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3E,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC;QACtF,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/D,MAAM,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAE/C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAClC,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,IAAY;IAC/C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtG,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACxC,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAe,EAAE,OAAsB;IACpE,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,OAAO,EAAE,CAAC;AAC/F,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type OverleafBaseUrl } from "./types.js";
|
|
2
|
+
export interface ParsedProjectReference {
|
|
3
|
+
projectId: string;
|
|
4
|
+
projectUrl?: string;
|
|
5
|
+
overleaf: {
|
|
6
|
+
baseUrl: OverleafBaseUrl;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export declare function parseProjectReference(value: string): ParsedProjectReference;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { createOlcxError } from "../errors.js";
|
|
2
|
+
import { DEFAULT_OVERLEAF_BASE_URL } from "./types.js";
|
|
3
|
+
const PROJECT_ID_PATTERN = /^[A-Za-z0-9_-]{6,128}$/;
|
|
4
|
+
export function parseProjectReference(value) {
|
|
5
|
+
const input = value.trim();
|
|
6
|
+
if (input.length === 0) {
|
|
7
|
+
throw invalidProjectReference("Overleaf project reference is required.");
|
|
8
|
+
}
|
|
9
|
+
if (looksLikeUrl(input)) {
|
|
10
|
+
return parseProjectUrl(input);
|
|
11
|
+
}
|
|
12
|
+
if (!PROJECT_ID_PATTERN.test(input)) {
|
|
13
|
+
throw invalidProjectReference("Overleaf project id is invalid.");
|
|
14
|
+
}
|
|
15
|
+
return { projectId: input, overleaf: { baseUrl: DEFAULT_OVERLEAF_BASE_URL } };
|
|
16
|
+
}
|
|
17
|
+
function parseProjectUrl(input) {
|
|
18
|
+
let url;
|
|
19
|
+
try {
|
|
20
|
+
url = new URL(input);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
throw invalidProjectReference("Overleaf project URL is invalid.");
|
|
24
|
+
}
|
|
25
|
+
const host = url.hostname.toLowerCase();
|
|
26
|
+
const baseUrl = baseUrlForProjectHost(host);
|
|
27
|
+
const segments = url.pathname.split("/").filter(Boolean);
|
|
28
|
+
const projectId = segments[1] ?? "";
|
|
29
|
+
if (url.protocol !== "https:" ||
|
|
30
|
+
url.username.length > 0 ||
|
|
31
|
+
url.password.length > 0 ||
|
|
32
|
+
baseUrl === undefined ||
|
|
33
|
+
segments.length !== 2 ||
|
|
34
|
+
segments[0] !== "project" ||
|
|
35
|
+
!PROJECT_ID_PATTERN.test(projectId)) {
|
|
36
|
+
throw invalidProjectReference("Overleaf project URL must look like https://www.overleaf.com/project/<id> or https://cn.overleaf.com/project/<id>.");
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
projectId,
|
|
40
|
+
projectUrl: `${baseUrl}/project/${projectId}`,
|
|
41
|
+
overleaf: { baseUrl },
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function baseUrlForProjectHost(host) {
|
|
45
|
+
if (host === "cn.overleaf.com")
|
|
46
|
+
return "https://cn.overleaf.com";
|
|
47
|
+
if (host === "www.overleaf.com" || host === "overleaf.com")
|
|
48
|
+
return "https://www.overleaf.com";
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
function looksLikeUrl(input) {
|
|
52
|
+
return /^[A-Za-z][A-Za-z0-9+.-]*:/.test(input);
|
|
53
|
+
}
|
|
54
|
+
function invalidProjectReference(message) {
|
|
55
|
+
return createOlcxError({
|
|
56
|
+
code: "USER_INPUT_ERROR",
|
|
57
|
+
message,
|
|
58
|
+
hint: "Pass --project with an Overleaf project id, https://www.overleaf.com/project/<id>, or https://cn.overleaf.com/project/<id> URL.",
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=overleafProject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overleafProject.js","sourceRoot":"","sources":["../../src/config/overleafProject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAwB,MAAM,YAAY,CAAC;AAU7E,MAAM,kBAAkB,GAAG,wBAAwB,CAAC;AAEpD,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAE3B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,uBAAuB,CAAC,yCAAyC,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,MAAM,uBAAuB,CAAC,iCAAiC,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,yBAAyB,EAAE,EAAE,CAAC;AAChF,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,IAAI,GAAQ,CAAC;IAEb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,uBAAuB,CAAC,kCAAkC,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEpC,IACE,GAAG,CAAC,QAAQ,KAAK,QAAQ;QACzB,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;QACvB,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;QACvB,OAAO,KAAK,SAAS;QACrB,QAAQ,CAAC,MAAM,KAAK,CAAC;QACrB,QAAQ,CAAC,CAAC,CAAC,KAAK,SAAS;QACzB,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,EACnC,CAAC;QACD,MAAM,uBAAuB,CAC3B,oHAAoH,CACrH,CAAC;IACJ,CAAC;IAED,OAAO;QACL,SAAS;QACT,UAAU,EAAE,GAAG,OAAO,YAAY,SAAS,EAAE;QAC7C,QAAQ,EAAE,EAAE,OAAO,EAAE;KACtB,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY;IACzC,IAAI,IAAI,KAAK,iBAAiB;QAAE,OAAO,yBAAyB,CAAC;IACjE,IAAI,IAAI,KAAK,kBAAkB,IAAI,IAAI,KAAK,cAAc;QAAE,OAAO,0BAA0B,CAAC;IAC9F,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,uBAAuB,CAAC,OAAe;IAC9C,OAAO,eAAe,CAAC;QACrB,IAAI,EAAE,kBAAkB;QACxB,OAAO;QACP,IAAI,EAAE,iIAAiI;KACxI,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type ProjectConfig } from "./types.js";
|
|
2
|
+
export declare function getProjectConfigPath(projectRoot: string): string;
|
|
3
|
+
export declare function readProjectConfig(projectRoot: string): Promise<ProjectConfig>;
|
|
4
|
+
export declare function writeProjectConfig(projectRoot: string, config: ProjectConfig): Promise<void>;
|
|
5
|
+
export declare function validateProjectConfig(value: unknown): ProjectConfig;
|
|
6
|
+
export declare function summarizeProjectConfig(config: ProjectConfig): Record<string, unknown>;
|