@ttfw/envoi 1.0.0
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/README.md +238 -0
- package/dist/commands/app.d.ts +2 -0
- package/dist/commands/app.d.ts.map +1 -0
- package/dist/commands/app.js +31 -0
- package/dist/commands/app.js.map +1 -0
- package/dist/commands/autonomy.d.ts +6 -0
- package/dist/commands/autonomy.d.ts.map +1 -0
- package/dist/commands/autonomy.js +89 -0
- package/dist/commands/autonomy.js.map +1 -0
- package/dist/commands/builder.d.ts +13 -0
- package/dist/commands/builder.d.ts.map +1 -0
- package/dist/commands/builder.js +142 -0
- package/dist/commands/builder.js.map +1 -0
- package/dist/commands/idea.d.ts +12 -0
- package/dist/commands/idea.d.ts.map +1 -0
- package/dist/commands/idea.js +79 -0
- package/dist/commands/idea.js.map +1 -0
- package/dist/commands/init.d.ts +18 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +423 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/mode.d.ts +13 -0
- package/dist/commands/mode.d.ts.map +1 -0
- package/dist/commands/mode.js +96 -0
- package/dist/commands/mode.js.map +1 -0
- package/dist/commands/onboard.d.ts +37 -0
- package/dist/commands/onboard.d.ts.map +1 -0
- package/dist/commands/onboard.js +743 -0
- package/dist/commands/onboard.js.map +1 -0
- package/dist/commands/pr-note.d.ts +8 -0
- package/dist/commands/pr-note.d.ts.map +1 -0
- package/dist/commands/pr-note.js +27 -0
- package/dist/commands/pr-note.js.map +1 -0
- package/dist/commands/undo.d.ts +7 -0
- package/dist/commands/undo.d.ts.map +1 -0
- package/dist/commands/undo.js +59 -0
- package/dist/commands/undo.js.map +1 -0
- package/dist/commands/update.d.ts +24 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +248 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/constants/report_codes.d.ts +29 -0
- package/dist/constants/report_codes.d.ts.map +1 -0
- package/dist/constants/report_codes.js +69 -0
- package/dist/constants/report_codes.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +675 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/autonomy.d.ts +16 -0
- package/dist/lib/autonomy.d.ts.map +1 -0
- package/dist/lib/autonomy.js +38 -0
- package/dist/lib/autonomy.js.map +1 -0
- package/dist/lib/blocked.d.ts +87 -0
- package/dist/lib/blocked.d.ts.map +1 -0
- package/dist/lib/blocked.js +134 -0
- package/dist/lib/blocked.js.map +1 -0
- package/dist/lib/branding.d.ts +13 -0
- package/dist/lib/branding.d.ts.map +1 -0
- package/dist/lib/branding.js +19 -0
- package/dist/lib/branding.js.map +1 -0
- package/dist/lib/claude.d.ts +42 -0
- package/dist/lib/claude.d.ts.map +1 -0
- package/dist/lib/claude.js +291 -0
- package/dist/lib/claude.js.map +1 -0
- package/dist/lib/config.d.ts +71 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +410 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/diff.d.ts +150 -0
- package/dist/lib/diff.d.ts.map +1 -0
- package/dist/lib/diff.js +257 -0
- package/dist/lib/diff.js.map +1 -0
- package/dist/lib/doctor.d.ts +67 -0
- package/dist/lib/doctor.d.ts.map +1 -0
- package/dist/lib/doctor.js +211 -0
- package/dist/lib/doctor.js.map +1 -0
- package/dist/lib/fingerprint.d.ts +27 -0
- package/dist/lib/fingerprint.d.ts.map +1 -0
- package/dist/lib/fingerprint.js +116 -0
- package/dist/lib/fingerprint.js.map +1 -0
- package/dist/lib/fs.d.ts +93 -0
- package/dist/lib/fs.d.ts.map +1 -0
- package/dist/lib/fs.js +179 -0
- package/dist/lib/fs.js.map +1 -0
- package/dist/lib/git.d.ts +177 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +355 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/git_branching.d.ts +84 -0
- package/dist/lib/git_branching.d.ts.map +1 -0
- package/dist/lib/git_branching.js +327 -0
- package/dist/lib/git_branching.js.map +1 -0
- package/dist/lib/gitignore.d.ts +26 -0
- package/dist/lib/gitignore.d.ts.map +1 -0
- package/dist/lib/gitignore.js +119 -0
- package/dist/lib/gitignore.js.map +1 -0
- package/dist/lib/guardrails.d.ts +232 -0
- package/dist/lib/guardrails.d.ts.map +1 -0
- package/dist/lib/guardrails.js +323 -0
- package/dist/lib/guardrails.js.map +1 -0
- package/dist/lib/history.d.ts +110 -0
- package/dist/lib/history.d.ts.map +1 -0
- package/dist/lib/history.js +236 -0
- package/dist/lib/history.js.map +1 -0
- package/dist/lib/index.d.ts +29 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +29 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/json-extract.d.ts +42 -0
- package/dist/lib/json-extract.d.ts.map +1 -0
- package/dist/lib/json-extract.js +201 -0
- package/dist/lib/json-extract.js.map +1 -0
- package/dist/lib/judge.d.ts +237 -0
- package/dist/lib/judge.d.ts.map +1 -0
- package/dist/lib/judge.js +501 -0
- package/dist/lib/judge.js.map +1 -0
- package/dist/lib/lock.d.ts +79 -0
- package/dist/lib/lock.d.ts.map +1 -0
- package/dist/lib/lock.js +254 -0
- package/dist/lib/lock.js.map +1 -0
- package/dist/lib/migration.d.ts +9 -0
- package/dist/lib/migration.d.ts.map +1 -0
- package/dist/lib/migration.js +74 -0
- package/dist/lib/migration.js.map +1 -0
- package/dist/lib/paths.d.ts +18 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +27 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/preflight.d.ts +33 -0
- package/dist/lib/preflight.d.ts.map +1 -0
- package/dist/lib/preflight.js +177 -0
- package/dist/lib/preflight.js.map +1 -0
- package/dist/lib/prompt_budget.d.ts +18 -0
- package/dist/lib/prompt_budget.d.ts.map +1 -0
- package/dist/lib/prompt_budget.js +36 -0
- package/dist/lib/prompt_budget.js.map +1 -0
- package/dist/lib/report.d.ts +102 -0
- package/dist/lib/report.d.ts.map +1 -0
- package/dist/lib/report.js +347 -0
- package/dist/lib/report.js.map +1 -0
- package/dist/lib/reviewer-flow.d.ts +80 -0
- package/dist/lib/reviewer-flow.d.ts.map +1 -0
- package/dist/lib/reviewer-flow.js +138 -0
- package/dist/lib/reviewer-flow.js.map +1 -0
- package/dist/lib/reviewer.d.ts +53 -0
- package/dist/lib/reviewer.d.ts.map +1 -0
- package/dist/lib/reviewer.js +199 -0
- package/dist/lib/reviewer.js.map +1 -0
- package/dist/lib/risk.d.ts +127 -0
- package/dist/lib/risk.d.ts.map +1 -0
- package/dist/lib/risk.js +192 -0
- package/dist/lib/risk.js.map +1 -0
- package/dist/lib/rollback.d.ts +143 -0
- package/dist/lib/rollback.d.ts.map +1 -0
- package/dist/lib/rollback.js +244 -0
- package/dist/lib/rollback.js.map +1 -0
- package/dist/lib/schema.d.ts +47 -0
- package/dist/lib/schema.d.ts.map +1 -0
- package/dist/lib/schema.js +91 -0
- package/dist/lib/schema.js.map +1 -0
- package/dist/lib/scope.d.ts +89 -0
- package/dist/lib/scope.d.ts.map +1 -0
- package/dist/lib/scope.js +135 -0
- package/dist/lib/scope.js.map +1 -0
- package/dist/lib/self_update.d.ts +13 -0
- package/dist/lib/self_update.d.ts.map +1 -0
- package/dist/lib/self_update.js +172 -0
- package/dist/lib/self_update.js.map +1 -0
- package/dist/lib/state.d.ts +143 -0
- package/dist/lib/state.d.ts.map +1 -0
- package/dist/lib/state.js +258 -0
- package/dist/lib/state.js.map +1 -0
- package/dist/lib/tick.d.ts +310 -0
- package/dist/lib/tick.d.ts.map +1 -0
- package/dist/lib/tick.js +424 -0
- package/dist/lib/tick.js.map +1 -0
- package/dist/lib/transport.d.ts +145 -0
- package/dist/lib/transport.d.ts.map +1 -0
- package/dist/lib/transport.js +237 -0
- package/dist/lib/transport.js.map +1 -0
- package/dist/lib/verdict_labels.d.ts +5 -0
- package/dist/lib/verdict_labels.d.ts.map +1 -0
- package/dist/lib/verdict_labels.js +25 -0
- package/dist/lib/verdict_labels.js.map +1 -0
- package/dist/lib/verify-safety.d.ts +63 -0
- package/dist/lib/verify-safety.d.ts.map +1 -0
- package/dist/lib/verify-safety.js +123 -0
- package/dist/lib/verify-safety.js.map +1 -0
- package/dist/lib/verify.d.ts +139 -0
- package/dist/lib/verify.d.ts.map +1 -0
- package/dist/lib/verify.js +311 -0
- package/dist/lib/verify.js.map +1 -0
- package/dist/lib/workspace_state.d.ts +79 -0
- package/dist/lib/workspace_state.d.ts.map +1 -0
- package/dist/lib/workspace_state.js +283 -0
- package/dist/lib/workspace_state.js.map +1 -0
- package/dist/runner/builder.d.ts +58 -0
- package/dist/runner/builder.d.ts.map +1 -0
- package/dist/runner/builder.js +775 -0
- package/dist/runner/builder.js.map +1 -0
- package/dist/runner/builder_parse.d.ts +37 -0
- package/dist/runner/builder_parse.d.ts.map +1 -0
- package/dist/runner/builder_parse.js +76 -0
- package/dist/runner/builder_parse.js.map +1 -0
- package/dist/runner/index.d.ts +9 -0
- package/dist/runner/index.d.ts.map +1 -0
- package/dist/runner/index.js +7 -0
- package/dist/runner/index.js.map +1 -0
- package/dist/runner/loop.d.ts +51 -0
- package/dist/runner/loop.d.ts.map +1 -0
- package/dist/runner/loop.js +221 -0
- package/dist/runner/loop.js.map +1 -0
- package/dist/runner/orchestrator.d.ts +67 -0
- package/dist/runner/orchestrator.d.ts.map +1 -0
- package/dist/runner/orchestrator.js +376 -0
- package/dist/runner/orchestrator.js.map +1 -0
- package/dist/runner/tick.d.ts +10 -0
- package/dist/runner/tick.d.ts.map +1 -0
- package/dist/runner/tick.js +1639 -0
- package/dist/runner/tick.js.map +1 -0
- package/dist/types/blocked.d.ts +52 -0
- package/dist/types/blocked.d.ts.map +1 -0
- package/dist/types/blocked.js +8 -0
- package/dist/types/blocked.js.map +1 -0
- package/dist/types/builder.d.ts +25 -0
- package/dist/types/builder.d.ts.map +1 -0
- package/dist/types/builder.js +7 -0
- package/dist/types/builder.js.map +1 -0
- package/dist/types/claude.d.ts +86 -0
- package/dist/types/claude.d.ts.map +1 -0
- package/dist/types/claude.js +48 -0
- package/dist/types/claude.js.map +1 -0
- package/dist/types/config.d.ts +384 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +7 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +18 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/lock.d.ts +21 -0
- package/dist/types/lock.d.ts.map +1 -0
- package/dist/types/lock.js +8 -0
- package/dist/types/lock.js.map +1 -0
- package/dist/types/preflight.d.ts +49 -0
- package/dist/types/preflight.d.ts.map +1 -0
- package/dist/types/preflight.js +8 -0
- package/dist/types/preflight.js.map +1 -0
- package/dist/types/report.d.ts +161 -0
- package/dist/types/report.d.ts.map +1 -0
- package/dist/types/report.js +8 -0
- package/dist/types/report.js.map +1 -0
- package/dist/types/reviewer.d.ts +66 -0
- package/dist/types/reviewer.d.ts.map +1 -0
- package/dist/types/reviewer.js +5 -0
- package/dist/types/reviewer.js.map +1 -0
- package/dist/types/state.d.ts +124 -0
- package/dist/types/state.d.ts.map +1 -0
- package/dist/types/state.js +20 -0
- package/dist/types/state.js.map +1 -0
- package/dist/types/task.d.ts +117 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +7 -0
- package/dist/types/task.js.map +1 -0
- package/dist/types/workspace_state.d.ts +125 -0
- package/dist/types/workspace_state.d.ts.map +1 -0
- package/dist/types/workspace_state.js +10 -0
- package/dist/types/workspace_state.js.map +1 -0
- package/envoi.config.json +191 -0
- package/package.json +52 -0
- package/relais/prompts/.gitkeep +0 -0
- package/relais/prompts/builder.system.txt +13 -0
- package/relais/prompts/builder.user.txt +15 -0
- package/relais/prompts/orchestrator.system.txt +37 -0
- package/relais/prompts/orchestrator.user.txt +34 -0
- package/relais/prompts/reviewer.system.txt +33 -0
- package/relais/prompts/reviewer.user.txt +35 -0
- package/relais/schemas/.gitkeep +0 -0
- package/relais/schemas/builder_result.schema.json +29 -0
- package/relais/schemas/report.schema.json +195 -0
- package/relais/schemas/reviewer_result.schema.json +70 -0
- package/relais/schemas/task.schema.json +155 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* History management utilities for preserving tick run artifacts.
|
|
3
|
+
*
|
|
4
|
+
* Each tick's artifacts (report.json, report.md, diff.patch, verify.log) are
|
|
5
|
+
* preserved in history/<run_id>/ to enable debugging and audit trails.
|
|
6
|
+
*/
|
|
7
|
+
import { mkdir, readdir, open, rename, unlink } from 'node:fs/promises';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { atomicWriteJson, AtomicFsError } from './fs.js';
|
|
10
|
+
import { resolveInWorkspace } from './paths.js';
|
|
11
|
+
/**
|
|
12
|
+
* Gets the full path to the history directory for a specific run.
|
|
13
|
+
*
|
|
14
|
+
* @param config - Envoi configuration
|
|
15
|
+
* @param runId - Run ID
|
|
16
|
+
* @returns Full path to the run's history directory
|
|
17
|
+
*/
|
|
18
|
+
function getHistoryRunPath(config, runId) {
|
|
19
|
+
const historyDir = resolveInWorkspace(config.workspace_dir, config.history.dir);
|
|
20
|
+
return join(historyDir, runId);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Atomically writes text content to a file.
|
|
24
|
+
*
|
|
25
|
+
* Uses the write-tmp-fsync-rename pattern to ensure crash-safe writes.
|
|
26
|
+
*
|
|
27
|
+
* @param filePath - Path to write the file
|
|
28
|
+
* @param content - Text content to write
|
|
29
|
+
* @throws {AtomicFsError} If the write operation fails
|
|
30
|
+
*/
|
|
31
|
+
async function atomicWriteText(filePath, content) {
|
|
32
|
+
const tmpPath = `${filePath}.tmp`;
|
|
33
|
+
let fileHandle = null;
|
|
34
|
+
try {
|
|
35
|
+
// Ensure content ends with newline
|
|
36
|
+
const normalizedContent = content.endsWith('\n') ? content : content + '\n';
|
|
37
|
+
// Open file for writing, create if doesn't exist, truncate if exists
|
|
38
|
+
fileHandle = await open(tmpPath, 'w');
|
|
39
|
+
// Write the content
|
|
40
|
+
await fileHandle.writeFile(normalizedContent, 'utf-8');
|
|
41
|
+
// fsync to ensure data is flushed to disk
|
|
42
|
+
await fileHandle.sync();
|
|
43
|
+
// Close before rename
|
|
44
|
+
await fileHandle.close();
|
|
45
|
+
fileHandle = null;
|
|
46
|
+
// Atomic rename (POSIX guarantees atomicity)
|
|
47
|
+
await rename(tmpPath, filePath);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
// Attempt to clean up the tmp file on error
|
|
51
|
+
if (fileHandle) {
|
|
52
|
+
try {
|
|
53
|
+
await fileHandle.close();
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// Ignore close errors during cleanup
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
await unlink(tmpPath);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Ignore unlink errors - file may not exist
|
|
64
|
+
}
|
|
65
|
+
throw new AtomicFsError(`Failed to atomically write text to ${filePath}: ${error instanceof Error ? error.message : String(error)}`, filePath, error instanceof Error ? error : undefined);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Creates the history snapshot directory for a run.
|
|
70
|
+
*
|
|
71
|
+
* @param runId - Run ID
|
|
72
|
+
* @param config - Envoi configuration
|
|
73
|
+
* @returns Promise that resolves when directory is created
|
|
74
|
+
* @throws {Error} If directory creation fails
|
|
75
|
+
*/
|
|
76
|
+
export async function createHistorySnapshot(runId, config) {
|
|
77
|
+
const runPath = getHistoryRunPath(config, runId);
|
|
78
|
+
await mkdir(runPath, { recursive: true });
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Writes an artifact file to the history directory for a run.
|
|
82
|
+
*
|
|
83
|
+
* @param runId - Run ID
|
|
84
|
+
* @param filename - Name of the artifact file (e.g., 'report.json', 'diff.patch')
|
|
85
|
+
* @param content - Content to write (string for text files, object for JSON)
|
|
86
|
+
* @param config - Envoi configuration
|
|
87
|
+
* @returns Promise that resolves when write completes
|
|
88
|
+
* @throws {Error} If the write operation fails
|
|
89
|
+
*/
|
|
90
|
+
export async function writeHistoryArtifact(runId, filename, content, config) {
|
|
91
|
+
const runPath = getHistoryRunPath(config, runId);
|
|
92
|
+
const filePath = join(runPath, filename);
|
|
93
|
+
if (typeof content === 'object') {
|
|
94
|
+
await atomicWriteJson(filePath, content);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
await atomicWriteText(filePath, content);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Creates a complete history snapshot for a tick run.
|
|
102
|
+
*
|
|
103
|
+
* Saves all artifacts (meta.json, report.json, report.md, and optionally
|
|
104
|
+
* diff.patch and verify.log) to history/<run_id>/.
|
|
105
|
+
*
|
|
106
|
+
* @param runId - Run ID
|
|
107
|
+
* @param report - Report data
|
|
108
|
+
* @param markdown - Markdown rendering of the report
|
|
109
|
+
* @param diffPatch - Optional diff patch content
|
|
110
|
+
* @param verifyLog - Optional verification log content
|
|
111
|
+
* @param config - Envoi configuration
|
|
112
|
+
* @returns Promise that resolves when all artifacts are saved
|
|
113
|
+
* @throws {Error} If any write operation fails
|
|
114
|
+
*/
|
|
115
|
+
export async function snapshotRun(runId, report, markdown, diffPatch, verifyLog, config) {
|
|
116
|
+
// Create the history directory
|
|
117
|
+
await createHistorySnapshot(runId, config);
|
|
118
|
+
// Create meta.json with run metadata
|
|
119
|
+
const meta = {
|
|
120
|
+
run_id: runId,
|
|
121
|
+
created_at: report.ended_at,
|
|
122
|
+
verdict: report.verdict,
|
|
123
|
+
code: report.code,
|
|
124
|
+
};
|
|
125
|
+
await writeHistoryArtifact(runId, 'meta.json', meta, config);
|
|
126
|
+
// Write report.json (full report data)
|
|
127
|
+
await writeHistoryArtifact(runId, 'report.json', report, config);
|
|
128
|
+
// Write report.md (markdown rendering)
|
|
129
|
+
await writeHistoryArtifact(runId, 'report.md', markdown, config);
|
|
130
|
+
// Write optional diff.patch if provided and enabled
|
|
131
|
+
if (diffPatch !== null && diffPatch !== undefined && config.history.include_diff_patch) {
|
|
132
|
+
await writeHistoryArtifact(runId, 'diff.patch', diffPatch, config);
|
|
133
|
+
}
|
|
134
|
+
// Write optional verify.log if provided and enabled
|
|
135
|
+
if (verifyLog !== null && verifyLog !== undefined && config.history.include_verify_log) {
|
|
136
|
+
await writeHistoryArtifact(runId, 'verify.log', verifyLog, config);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Persists builder failure artifacts to history for debugging.
|
|
141
|
+
*
|
|
142
|
+
* Writes raw stdout, stderr (if available), and error info to
|
|
143
|
+
* history/<run_id>/ for post-mortem analysis.
|
|
144
|
+
*
|
|
145
|
+
* @param runId - Run ID
|
|
146
|
+
* @param stdout - Raw stdout from builder invocation
|
|
147
|
+
* @param stderr - Raw stderr from builder invocation (may be null)
|
|
148
|
+
* @param errorInfo - Structured error information
|
|
149
|
+
* @param config - Envoi configuration
|
|
150
|
+
* @returns Promise that resolves when all artifacts are saved
|
|
151
|
+
* @throws {Error} If any write operation fails
|
|
152
|
+
*/
|
|
153
|
+
export async function persistBuilderFailure(runId, stdout, stderr, errorInfo, config) {
|
|
154
|
+
// Ensure history directory exists
|
|
155
|
+
await createHistorySnapshot(runId, config);
|
|
156
|
+
// Write raw stdout
|
|
157
|
+
await writeHistoryArtifact(runId, 'builder.stdout.raw.txt', stdout, config);
|
|
158
|
+
// Write raw stderr if available
|
|
159
|
+
if (stderr !== null && stderr.length > 0) {
|
|
160
|
+
await writeHistoryArtifact(runId, 'builder.stderr.raw.txt', stderr, config);
|
|
161
|
+
}
|
|
162
|
+
// Write structured error info
|
|
163
|
+
await writeHistoryArtifact(runId, 'builder.error.json', errorInfo, config);
|
|
164
|
+
}
|
|
165
|
+
/** Maximum size for stdout/stderr artifacts (200KB) */
|
|
166
|
+
const MAX_OUTPUT_SIZE = 200 * 1024;
|
|
167
|
+
/**
|
|
168
|
+
* Truncates content to max size with marker.
|
|
169
|
+
*/
|
|
170
|
+
function truncateWithMarker(content, maxSize) {
|
|
171
|
+
if (content.length <= maxSize) {
|
|
172
|
+
return content;
|
|
173
|
+
}
|
|
174
|
+
return content.slice(0, maxSize - 12) + '\n[truncated]';
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Persists orchestrator failure artifacts to history for debugging.
|
|
178
|
+
*
|
|
179
|
+
* Writes stdout, stderr, extracted JSON, schema errors, and meta to
|
|
180
|
+
* history/<run_id>/orchestrator/ for post-mortem analysis.
|
|
181
|
+
*
|
|
182
|
+
* @param runId - Run ID
|
|
183
|
+
* @param stdout - Raw stdout from orchestrator invocation
|
|
184
|
+
* @param stderr - Raw stderr from orchestrator invocation
|
|
185
|
+
* @param extractedJson - Extracted JSON candidate if extraction succeeded
|
|
186
|
+
* @param schemaErrors - Ajv errors array when validation fails
|
|
187
|
+
* @param meta - Invocation metadata
|
|
188
|
+
* @param config - Envoi configuration
|
|
189
|
+
* @returns Promise that resolves when all artifacts are saved
|
|
190
|
+
* @throws {Error} If any write operation fails
|
|
191
|
+
*/
|
|
192
|
+
export async function persistOrchestratorFailure(runId, stdout, stderr, extractedJson, schemaErrors, meta, config) {
|
|
193
|
+
// Create orchestrator subdirectory under run history
|
|
194
|
+
const orchestratorPath = join(config.workspace_dir, config.history.dir, runId, 'orchestrator');
|
|
195
|
+
await mkdir(orchestratorPath, { recursive: true });
|
|
196
|
+
// Helper to write to orchestrator subdir
|
|
197
|
+
const writeArtifact = async (filename, content) => {
|
|
198
|
+
const filePath = join(orchestratorPath, filename);
|
|
199
|
+
if (typeof content === 'object') {
|
|
200
|
+
await atomicWriteJson(filePath, content);
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
await atomicWriteText(filePath, content);
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
// Write stdout.txt (truncated to 200KB)
|
|
207
|
+
await writeArtifact('stdout.txt', truncateWithMarker(stdout, MAX_OUTPUT_SIZE));
|
|
208
|
+
// Write stderr.txt (truncated, create even if empty)
|
|
209
|
+
await writeArtifact('stderr.txt', truncateWithMarker(stderr || '', MAX_OUTPUT_SIZE));
|
|
210
|
+
// Write extracted.json if extraction succeeded
|
|
211
|
+
if (extractedJson !== null && extractedJson !== undefined) {
|
|
212
|
+
await writeArtifact('extracted.json', extractedJson);
|
|
213
|
+
}
|
|
214
|
+
// Write schema_error.json if validation failed
|
|
215
|
+
if (schemaErrors !== null && schemaErrors.length > 0) {
|
|
216
|
+
await writeArtifact('schema_error.json', schemaErrors);
|
|
217
|
+
}
|
|
218
|
+
// Write meta.json
|
|
219
|
+
await writeArtifact('meta.json', meta);
|
|
220
|
+
}
|
|
221
|
+
export async function getHistoryCount(config) {
|
|
222
|
+
const historyPath = resolveInWorkspace(config.workspace_dir, config.history.dir);
|
|
223
|
+
try {
|
|
224
|
+
const entries = await readdir(historyPath, { withFileTypes: true });
|
|
225
|
+
// Count only directories (each run_id is a directory)
|
|
226
|
+
return entries.filter((entry) => entry.isDirectory()).length;
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
// If directory doesn't exist, return 0
|
|
230
|
+
if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
|
|
231
|
+
return 0;
|
|
232
|
+
}
|
|
233
|
+
throw error;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/lib/history.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Envoi library utilities.
|
|
3
|
+
*
|
|
4
|
+
* This module exports all public utilities for the Envoi project.
|
|
5
|
+
*/
|
|
6
|
+
export { atomicWriteJson, atomicReadJson, cleanupTmpFiles, AtomicFsError, } from './fs.js';
|
|
7
|
+
export { loadConfig, findConfigFile, validateConfig, ConfigError, CONFIG_FILE_NAME, } from './config.js';
|
|
8
|
+
export { getBootId, isPidRunning, isLockStale, acquireLock, releaseLock, LockHeldError, } from './lock.js';
|
|
9
|
+
export { isGitRepo, isWorktreeClean, getHeadCommit, getDiffFiles, getUntrackedFiles, getCurrentBranch, stashPilotFiles, popPilotStash, } from './git.js';
|
|
10
|
+
export { runPreflight } from './preflight.js';
|
|
11
|
+
export { generateRunId, createInitialState, transitionPhase, addError, setTask, setBuilderResult, appendStopHistory, clearForcePatch, setForcePatch, updateTaskFingerprint, recordTaskFailure, resetFailureStreak, appendVerifyHistory, incrementRetryCount, recordTransportStall, resetRetryState, } from './state.js';
|
|
12
|
+
export { buildClaudeArgs, parseClaudeResponse, invokeClaudeCode, } from './claude.js';
|
|
13
|
+
export { loadSchema, validateWithSchema, type ValidationResult, } from './schema.js';
|
|
14
|
+
export { getTouchedTracked, getTouchedUntracked, getDiffStats, analyzeDiff, checkDiffLimits, formatBlastRadius, type DiffAnalysis, type DiffLimitCheckResult, } from './diff.js';
|
|
15
|
+
export { matchesGlob, checkScopeViolations, SCOPE_VIOLATION_FORBIDDEN, SCOPE_VIOLATION_OUTSIDE_ALLOWED, NEW_FILE_FORBIDDEN, LOCKFILE_CHANGE_FORBIDDEN, type ScopeCheckResult, type ScopeViolation, } from './scope.js';
|
|
16
|
+
export { interpolateArgs, executeVerification, runVerifications, validateParam, validateVerificationParams, type VerificationRun, type ParamValidationError, type ParamValidationResult, } from './verify.js';
|
|
17
|
+
export { rollbackTracked, removeUntrackedPaths, rollback, rollbackToCommit, verifyCleanWorktree, type RollbackResult, type RollbackResultNew, } from './rollback.js';
|
|
18
|
+
export { generateRunId as generateReportRunId, buildReport, writeReport, renderReportMarkdown, writeReportMarkdown, type TickReportData, } from './report.js';
|
|
19
|
+
export { createHistorySnapshot, writeHistoryArtifact, snapshotRun, getHistoryCount, } from './history.js';
|
|
20
|
+
export { buildBlockedData, writeBlocked, } from './blocked.js';
|
|
21
|
+
export { invokeReviewer, parseReviewerOutput, checkReviewerAuth, } from './reviewer.js';
|
|
22
|
+
export { checkHighRiskGlobs, checkDiffFraction, checkRepeatedStops, computeRiskFlags, shouldTriggerReviewer, type StopHistoryEntry, } from './risk.js';
|
|
23
|
+
export { runReviewerIfNeeded, handleReviewerDecision, type ReviewerFlowContext, type ReviewerFlowResult, } from './reviewer-flow.js';
|
|
24
|
+
export { checkCodexCli, type ReviewerDoctorResult, } from './doctor.js';
|
|
25
|
+
export { canonicalizeTask, computeFingerprint, } from './fingerprint.js';
|
|
26
|
+
export { checkBranchMatch, checkFingerprintMatch, checkWorktreeClean, runGuardrailPreflight, classifyVerifyResult, shouldEscalate, checkMergeEligibility, type GuardrailState, type PreflightResult as GuardrailPreflightResult, type VerifyResultType, type VerifyClassification, type EscalationDecision, type MergeEligibility, type MergeEligibilityReport, } from './guardrails.js';
|
|
27
|
+
export { isTransportStall, createTransportStallError, invokeWithStallDetection, normalizeTransportError, isTransportStallError, type StallDetectionResult, type InvokeResult, type NormalizedError, } from './transport.js';
|
|
28
|
+
export { handleTransportStall, checkAndHandleStall, formatStallResult, getRetryAction, computeRetryDecision, computeDegradedSettings, applyDegradedConfig, extractDegradationInputs, getDegradedConfigIfNeeded, canRetry, formatRetryDecision, getRecoveryPrompt, buildPromptWithRecovery, shouldResetRetryState, updateStateForOutcome, handleTickSuccess, handleTickStop, handleTickStall, MAX_RETRY_ATTEMPTS, RECOVERY_PROMPT, type StallHandlingResult, type StallHandlingOptions, type RetryAction, type DegradedSettings, type RetryDecision, type TickOutcome, } from './tick.js';
|
|
29
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Envoi library utilities.
|
|
3
|
+
*
|
|
4
|
+
* This module exports all public utilities for the Envoi project.
|
|
5
|
+
*/
|
|
6
|
+
export { atomicWriteJson, atomicReadJson, cleanupTmpFiles, AtomicFsError, } from './fs.js';
|
|
7
|
+
export { loadConfig, findConfigFile, validateConfig, ConfigError, CONFIG_FILE_NAME, } from './config.js';
|
|
8
|
+
export { getBootId, isPidRunning, isLockStale, acquireLock, releaseLock, LockHeldError, } from './lock.js';
|
|
9
|
+
export { isGitRepo, isWorktreeClean, getHeadCommit, getDiffFiles, getUntrackedFiles, getCurrentBranch, stashPilotFiles, popPilotStash, } from './git.js';
|
|
10
|
+
export { runPreflight } from './preflight.js';
|
|
11
|
+
export { generateRunId, createInitialState, transitionPhase, addError, setTask, setBuilderResult, appendStopHistory, clearForcePatch, setForcePatch, updateTaskFingerprint, recordTaskFailure, resetFailureStreak, appendVerifyHistory, incrementRetryCount, recordTransportStall, resetRetryState, } from './state.js';
|
|
12
|
+
export { buildClaudeArgs, parseClaudeResponse, invokeClaudeCode, } from './claude.js';
|
|
13
|
+
export { loadSchema, validateWithSchema, } from './schema.js';
|
|
14
|
+
export { getTouchedTracked, getTouchedUntracked, getDiffStats, analyzeDiff, checkDiffLimits, formatBlastRadius, } from './diff.js';
|
|
15
|
+
export { matchesGlob, checkScopeViolations, SCOPE_VIOLATION_FORBIDDEN, SCOPE_VIOLATION_OUTSIDE_ALLOWED, NEW_FILE_FORBIDDEN, LOCKFILE_CHANGE_FORBIDDEN, } from './scope.js';
|
|
16
|
+
export { interpolateArgs, executeVerification, runVerifications, validateParam, validateVerificationParams, } from './verify.js';
|
|
17
|
+
export { rollbackTracked, removeUntrackedPaths, rollback, rollbackToCommit, verifyCleanWorktree, } from './rollback.js';
|
|
18
|
+
export { generateRunId as generateReportRunId, buildReport, writeReport, renderReportMarkdown, writeReportMarkdown, } from './report.js';
|
|
19
|
+
export { createHistorySnapshot, writeHistoryArtifact, snapshotRun, getHistoryCount, } from './history.js';
|
|
20
|
+
export { buildBlockedData, writeBlocked, } from './blocked.js';
|
|
21
|
+
export { invokeReviewer, parseReviewerOutput, checkReviewerAuth, } from './reviewer.js';
|
|
22
|
+
export { checkHighRiskGlobs, checkDiffFraction, checkRepeatedStops, computeRiskFlags, shouldTriggerReviewer, } from './risk.js';
|
|
23
|
+
export { runReviewerIfNeeded, handleReviewerDecision, } from './reviewer-flow.js';
|
|
24
|
+
export { checkCodexCli, } from './doctor.js';
|
|
25
|
+
export { canonicalizeTask, computeFingerprint, } from './fingerprint.js';
|
|
26
|
+
export { checkBranchMatch, checkFingerprintMatch, checkWorktreeClean, runGuardrailPreflight, classifyVerifyResult, shouldEscalate, checkMergeEligibility, } from './guardrails.js';
|
|
27
|
+
export { isTransportStall, createTransportStallError, invokeWithStallDetection, normalizeTransportError, isTransportStallError, } from './transport.js';
|
|
28
|
+
export { handleTransportStall, checkAndHandleStall, formatStallResult, getRetryAction, computeRetryDecision, computeDegradedSettings, applyDegradedConfig, extractDegradationInputs, getDegradedConfigIfNeeded, canRetry, formatRetryDecision, getRecoveryPrompt, buildPromptWithRecovery, shouldResetRetryState, updateStateForOutcome, handleTickSuccess, handleTickStop, handleTickStall, MAX_RETRY_ATTEMPTS, RECOVERY_PROMPT, } from './tick.js';
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON extraction utilities for parsing LLM output.
|
|
3
|
+
*
|
|
4
|
+
* Handles common LLM output patterns:
|
|
5
|
+
* - Preamble text before JSON
|
|
6
|
+
* - Markdown code fences (```json ... ```)
|
|
7
|
+
* - Multiple JSON objects (takes first valid)
|
|
8
|
+
*
|
|
9
|
+
* @see F001, F002 in tests/lib/F001-json-extract.test.ts
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Result of JSON extraction attempt.
|
|
13
|
+
*/
|
|
14
|
+
export interface JsonExtractResult<T = unknown> {
|
|
15
|
+
/** Whether extraction succeeded */
|
|
16
|
+
success: boolean;
|
|
17
|
+
/** Parsed JSON data (null if failed) */
|
|
18
|
+
data: T | null;
|
|
19
|
+
/** Error message if failed */
|
|
20
|
+
error: string | null;
|
|
21
|
+
/** How the JSON was extracted: 'direct' | 'fence' | 'search' */
|
|
22
|
+
method: 'direct' | 'fence' | 'search' | null;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Attempts to extract JSON from text that may have preamble or code fences.
|
|
26
|
+
*
|
|
27
|
+
* Extraction strategies (in order):
|
|
28
|
+
* 1. Direct parse: Try JSON.parse on the entire string
|
|
29
|
+
* 2. Fence extraction: Look for ```json ... ``` blocks
|
|
30
|
+
* 3. Brace search: Find first { and matching } for object, or [ and ] for array
|
|
31
|
+
*
|
|
32
|
+
* @param text - Raw text that may contain JSON
|
|
33
|
+
* @returns Extraction result with parsed data or error
|
|
34
|
+
*/
|
|
35
|
+
export declare function extractJson<T = unknown>(text: string): JsonExtractResult<T>;
|
|
36
|
+
/**
|
|
37
|
+
* Strict JSON extraction - only accepts direct parse.
|
|
38
|
+
*
|
|
39
|
+
* For cases where we need exact JSON output with no preamble.
|
|
40
|
+
*/
|
|
41
|
+
export declare function extractJsonStrict<T = unknown>(text: string): JsonExtractResult<T>;
|
|
42
|
+
//# sourceMappingURL=json-extract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-extract.d.ts","sourceRoot":"","sources":["../../src/lib/json-extract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,OAAO;IAC5C,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,wCAAwC;IACxC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,8BAA8B;IAC9B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gEAAgE;IAChE,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,IAAI,CAAC;CAC9C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,CA6B3E;AA+ID;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAajF"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON extraction utilities for parsing LLM output.
|
|
3
|
+
*
|
|
4
|
+
* Handles common LLM output patterns:
|
|
5
|
+
* - Preamble text before JSON
|
|
6
|
+
* - Markdown code fences (```json ... ```)
|
|
7
|
+
* - Multiple JSON objects (takes first valid)
|
|
8
|
+
*
|
|
9
|
+
* @see F001, F002 in tests/lib/F001-json-extract.test.ts
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Attempts to extract JSON from text that may have preamble or code fences.
|
|
13
|
+
*
|
|
14
|
+
* Extraction strategies (in order):
|
|
15
|
+
* 1. Direct parse: Try JSON.parse on the entire string
|
|
16
|
+
* 2. Fence extraction: Look for ```json ... ``` blocks
|
|
17
|
+
* 3. Brace search: Find first { and matching } for object, or [ and ] for array
|
|
18
|
+
*
|
|
19
|
+
* @param text - Raw text that may contain JSON
|
|
20
|
+
* @returns Extraction result with parsed data or error
|
|
21
|
+
*/
|
|
22
|
+
export function extractJson(text) {
|
|
23
|
+
const trimmed = text.trim();
|
|
24
|
+
// Strategy 1: Direct parse
|
|
25
|
+
try {
|
|
26
|
+
const data = JSON.parse(trimmed);
|
|
27
|
+
return { success: true, data, error: null, method: 'direct' };
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Continue to next strategy
|
|
31
|
+
}
|
|
32
|
+
// Strategy 2: Extract from code fence
|
|
33
|
+
const fenceResult = extractFromFence(trimmed);
|
|
34
|
+
if (fenceResult.success) {
|
|
35
|
+
return fenceResult;
|
|
36
|
+
}
|
|
37
|
+
// Strategy 3: Search for JSON object or array
|
|
38
|
+
const searchResult = extractByBraceSearch(trimmed);
|
|
39
|
+
if (searchResult.success) {
|
|
40
|
+
return searchResult;
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
success: false,
|
|
44
|
+
data: null,
|
|
45
|
+
error: `Failed to extract JSON from text. Tried direct parse, fence extraction, and brace search.`,
|
|
46
|
+
method: null,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Extracts JSON from markdown code fences.
|
|
51
|
+
*
|
|
52
|
+
* Supports:
|
|
53
|
+
* - ```json ... ```
|
|
54
|
+
* - ``` ... ``` (no language specifier)
|
|
55
|
+
*
|
|
56
|
+
* Takes the first valid JSON found in any fence.
|
|
57
|
+
*/
|
|
58
|
+
function extractFromFence(text) {
|
|
59
|
+
// Match ```json ... ``` or ``` ... ```
|
|
60
|
+
// Using non-greedy match and handling nested backticks
|
|
61
|
+
const fenceRegex = /```(?:json)?\s*\n?([\s\S]*?)\n?```/g;
|
|
62
|
+
let match;
|
|
63
|
+
while ((match = fenceRegex.exec(text)) !== null) {
|
|
64
|
+
const content = match[1].trim();
|
|
65
|
+
if (!content)
|
|
66
|
+
continue;
|
|
67
|
+
try {
|
|
68
|
+
const data = JSON.parse(content);
|
|
69
|
+
return { success: true, data, error: null, method: 'fence' };
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Try next fence
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
success: false,
|
|
78
|
+
data: null,
|
|
79
|
+
error: 'No valid JSON found in code fences',
|
|
80
|
+
method: null,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Searches for JSON by finding balanced braces.
|
|
85
|
+
*
|
|
86
|
+
* Finds the first { or [ and its matching closing brace,
|
|
87
|
+
* respecting string escaping and nesting.
|
|
88
|
+
*/
|
|
89
|
+
function extractByBraceSearch(text) {
|
|
90
|
+
// Find first { or [
|
|
91
|
+
const objectStart = text.indexOf('{');
|
|
92
|
+
const arrayStart = text.indexOf('[');
|
|
93
|
+
let start;
|
|
94
|
+
let openChar;
|
|
95
|
+
let closeChar;
|
|
96
|
+
if (objectStart === -1 && arrayStart === -1) {
|
|
97
|
+
return {
|
|
98
|
+
success: false,
|
|
99
|
+
data: null,
|
|
100
|
+
error: 'No JSON object or array found',
|
|
101
|
+
method: null,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
if (objectStart === -1) {
|
|
105
|
+
start = arrayStart;
|
|
106
|
+
openChar = '[';
|
|
107
|
+
closeChar = ']';
|
|
108
|
+
}
|
|
109
|
+
else if (arrayStart === -1) {
|
|
110
|
+
start = objectStart;
|
|
111
|
+
openChar = '{';
|
|
112
|
+
closeChar = '}';
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
// Take whichever comes first
|
|
116
|
+
if (objectStart < arrayStart) {
|
|
117
|
+
start = objectStart;
|
|
118
|
+
openChar = '{';
|
|
119
|
+
closeChar = '}';
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
start = arrayStart;
|
|
123
|
+
openChar = '[';
|
|
124
|
+
closeChar = ']';
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Find matching close brace
|
|
128
|
+
let depth = 0;
|
|
129
|
+
let inString = false;
|
|
130
|
+
let escapeNext = false;
|
|
131
|
+
let end = -1;
|
|
132
|
+
for (let i = start; i < text.length; i++) {
|
|
133
|
+
const char = text[i];
|
|
134
|
+
if (escapeNext) {
|
|
135
|
+
escapeNext = false;
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (char === '\\' && inString) {
|
|
139
|
+
escapeNext = true;
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (char === '"') {
|
|
143
|
+
inString = !inString;
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (inString)
|
|
147
|
+
continue;
|
|
148
|
+
if (char === openChar) {
|
|
149
|
+
depth++;
|
|
150
|
+
}
|
|
151
|
+
else if (char === closeChar) {
|
|
152
|
+
depth--;
|
|
153
|
+
if (depth === 0) {
|
|
154
|
+
end = i;
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (end === -1) {
|
|
160
|
+
return {
|
|
161
|
+
success: false,
|
|
162
|
+
data: null,
|
|
163
|
+
error: 'Unbalanced braces in JSON',
|
|
164
|
+
method: null,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
const jsonStr = text.slice(start, end + 1);
|
|
168
|
+
try {
|
|
169
|
+
const data = JSON.parse(jsonStr);
|
|
170
|
+
return { success: true, data, error: null, method: 'search' };
|
|
171
|
+
}
|
|
172
|
+
catch (e) {
|
|
173
|
+
return {
|
|
174
|
+
success: false,
|
|
175
|
+
data: null,
|
|
176
|
+
error: `Found JSON-like structure but parse failed: ${e instanceof Error ? e.message : String(e)}`,
|
|
177
|
+
method: null,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Strict JSON extraction - only accepts direct parse.
|
|
183
|
+
*
|
|
184
|
+
* For cases where we need exact JSON output with no preamble.
|
|
185
|
+
*/
|
|
186
|
+
export function extractJsonStrict(text) {
|
|
187
|
+
const trimmed = text.trim();
|
|
188
|
+
try {
|
|
189
|
+
const data = JSON.parse(trimmed);
|
|
190
|
+
return { success: true, data, error: null, method: 'direct' };
|
|
191
|
+
}
|
|
192
|
+
catch (e) {
|
|
193
|
+
return {
|
|
194
|
+
success: false,
|
|
195
|
+
data: null,
|
|
196
|
+
error: `JSON parse failed: ${e instanceof Error ? e.message : String(e)}`,
|
|
197
|
+
method: null,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=json-extract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-extract.js","sourceRoot":"","sources":["../../src/lib/json-extract.ts"],"names":[],"mappings":"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"}
|