human-to-code 0.1.13 → 0.1.16
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 +21 -43
- package/SECURITY.md +16 -1
- package/dist/agents/direct/application.d.ts +10 -0
- package/dist/agents/direct/application.d.ts.map +1 -0
- package/dist/agents/direct/application.js +51 -0
- package/dist/agents/direct/application.js.map +1 -0
- package/dist/agents/direct/candidate-validation.d.ts +8 -0
- package/dist/agents/direct/candidate-validation.d.ts.map +1 -0
- package/dist/agents/direct/candidate-validation.js +125 -0
- package/dist/agents/direct/candidate-validation.js.map +1 -0
- package/dist/agents/direct/declarations.d.ts +3 -0
- package/dist/agents/direct/declarations.d.ts.map +1 -0
- package/dist/agents/direct/declarations.js +36 -0
- package/dist/agents/direct/declarations.js.map +1 -0
- package/dist/agents/direct/discovery.d.ts +6 -0
- package/dist/agents/direct/discovery.d.ts.map +1 -0
- package/dist/agents/direct/discovery.js +144 -0
- package/dist/agents/direct/discovery.js.map +1 -0
- package/dist/agents/direct/file-memory.d.ts +20 -0
- package/dist/agents/direct/file-memory.d.ts.map +1 -0
- package/dist/agents/direct/file-memory.js +170 -0
- package/dist/agents/direct/file-memory.js.map +1 -0
- package/dist/agents/direct/generation-client.d.ts +4 -0
- package/dist/agents/direct/generation-client.d.ts.map +1 -0
- package/dist/agents/direct/generation-client.js +56 -0
- package/dist/agents/direct/generation-client.js.map +1 -0
- package/dist/agents/direct/index.d.ts +13 -0
- package/dist/agents/direct/index.d.ts.map +1 -0
- package/dist/agents/direct/index.js +13 -0
- package/dist/agents/direct/index.js.map +1 -0
- package/dist/agents/direct/languages.d.ts +5 -0
- package/dist/agents/direct/languages.d.ts.map +1 -0
- package/dist/agents/direct/languages.js +17 -0
- package/dist/agents/direct/languages.js.map +1 -0
- package/dist/agents/direct/marker-parser.d.ts +8 -0
- package/dist/agents/direct/marker-parser.d.ts.map +1 -0
- package/dist/agents/direct/marker-parser.js +83 -0
- package/dist/agents/direct/marker-parser.js.map +1 -0
- package/dist/agents/direct/presentation.d.ts +7 -0
- package/dist/agents/direct/presentation.d.ts.map +1 -0
- package/dist/agents/direct/presentation.js +42 -0
- package/dist/agents/direct/presentation.js.map +1 -0
- package/dist/agents/direct/replacement.d.ts +10 -0
- package/dist/agents/direct/replacement.d.ts.map +1 -0
- package/dist/agents/direct/replacement.js +19 -0
- package/dist/agents/direct/replacement.js.map +1 -0
- package/dist/agents/direct/types.d.ts +87 -0
- package/dist/agents/direct/types.d.ts.map +1 -0
- package/dist/agents/direct/types.js +2 -0
- package/dist/agents/direct/types.js.map +1 -0
- package/dist/agents/guided/api-grounding.d.ts +6 -0
- package/dist/agents/guided/api-grounding.d.ts.map +1 -0
- package/dist/agents/guided/api-grounding.js +158 -0
- package/dist/agents/guided/api-grounding.js.map +1 -0
- package/dist/agents/guided/index.d.ts +7 -0
- package/dist/agents/guided/index.d.ts.map +1 -0
- package/dist/agents/guided/index.js +7 -0
- package/dist/agents/guided/index.js.map +1 -0
- package/dist/agents/guided/patch-diff.d.ts +4 -0
- package/dist/agents/guided/patch-diff.d.ts.map +1 -0
- package/dist/agents/guided/patch-diff.js +31 -0
- package/dist/agents/guided/patch-diff.js.map +1 -0
- package/dist/agents/guided/types.d.ts +55 -0
- package/dist/agents/guided/types.d.ts.map +1 -0
- package/dist/agents/guided/types.js +2 -0
- package/dist/agents/guided/types.js.map +1 -0
- package/dist/agents/guided/workflow.d.ts +17 -0
- package/dist/agents/guided/workflow.d.ts.map +1 -0
- package/dist/agents/guided/workflow.js +1360 -0
- package/dist/agents/guided/workflow.js.map +1 -0
- package/dist/agents/guided/workspace-policy.d.ts +9 -0
- package/dist/agents/guided/workspace-policy.d.ts.map +1 -0
- package/dist/agents/guided/workspace-policy.js +83 -0
- package/dist/agents/guided/workspace-policy.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +22 -61
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/pipeline/file-memory.d.ts.map +1 -1
- package/dist/pipeline/file-memory.js +42 -1
- package/dist/pipeline/file-memory.js.map +1 -1
- package/dist/pipeline/simple.d.ts +3 -160
- package/dist/pipeline/simple.d.ts.map +1 -1
- package/dist/pipeline/simple.js +3 -502
- package/dist/pipeline/simple.js.map +1 -1
- package/dist/pipeline/workflow.d.ts +5 -66
- package/dist/pipeline/workflow.d.ts.map +1 -1
- package/dist/pipeline/workflow.js +5 -1642
- package/dist/pipeline/workflow.js.map +1 -1
- package/dist/prompts/direct-conversion.d.ts +13 -0
- package/dist/prompts/direct-conversion.d.ts.map +1 -0
- package/dist/prompts/direct-conversion.js +35 -0
- package/dist/prompts/direct-conversion.js.map +1 -0
- package/dist/prompts/guided-patch.d.ts +14 -0
- package/dist/prompts/guided-patch.d.ts.map +1 -0
- package/dist/prompts/guided-patch.js +41 -0
- package/dist/prompts/guided-patch.js.map +1 -0
- package/dist/prompts/guided-repair.d.ts +12 -0
- package/dist/prompts/guided-repair.d.ts.map +1 -0
- package/dist/prompts/guided-repair.js +30 -0
- package/dist/prompts/guided-repair.js.map +1 -0
- package/dist/prompts/index.d.ts +6 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +6 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/provider-output.d.ts +4 -0
- package/dist/prompts/provider-output.d.ts.map +1 -0
- package/dist/prompts/provider-output.js +12 -0
- package/dist/prompts/provider-output.js.map +1 -0
- package/dist/providers/providers.d.ts.map +1 -1
- package/dist/providers/providers.js +2 -10
- package/dist/providers/providers.js.map +1 -1
- package/docs/ARCHITECTURE.md +42 -35
- package/docs/MODULES.md +51 -11
- package/docs/SCALABILITY.md +11 -9
- package/docs/roadmap/README.md +3 -2
- package/docs/roadmap/ruby.md +3 -4
- package/package.json +5 -8
- package/dist/pipeline/agent-tools.d.ts +0 -348
- package/dist/pipeline/agent-tools.d.ts.map +0 -1
- package/dist/pipeline/agent-tools.js +0 -542
- package/dist/pipeline/agent-tools.js.map +0 -1
- package/dist/pipeline/agent-tui.d.ts +0 -15
- package/dist/pipeline/agent-tui.d.ts.map +0 -1
- package/dist/pipeline/agent-tui.js +0 -133
- package/dist/pipeline/agent-tui.js.map +0 -1
- package/dist/pipeline/deep-agent.d.ts +0 -61
- package/dist/pipeline/deep-agent.d.ts.map +0 -1
- package/dist/pipeline/deep-agent.js +0 -395
- package/dist/pipeline/deep-agent.js.map +0 -1
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { ContextSecurityError, scanSecrets } from "../../context/context.js";
|
|
3
|
+
import { extractStaticFileMemory } from "../../pipeline/file-memory.js";
|
|
4
|
+
import { declaredIdentifiers } from "./declarations.js";
|
|
5
|
+
import { formatInlineReplacement } from "./replacement.js";
|
|
6
|
+
export class FileMemoryConflictError extends Error {
|
|
7
|
+
constructor(message) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.name = "FileMemoryConflictError";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function stripMemorySeparator(value) {
|
|
13
|
+
let offset = 0;
|
|
14
|
+
for (;;) {
|
|
15
|
+
if (value.startsWith("\r\n", offset))
|
|
16
|
+
offset += 2;
|
|
17
|
+
else if (value.startsWith("\n", offset))
|
|
18
|
+
offset += 1;
|
|
19
|
+
else if (value.startsWith("\\r\\n", offset))
|
|
20
|
+
offset += 4;
|
|
21
|
+
else if (value.startsWith("\\n", offset))
|
|
22
|
+
offset += 2;
|
|
23
|
+
else if (value[offset] === " " || value[offset] === "\t")
|
|
24
|
+
offset += 1;
|
|
25
|
+
else
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
return offset > 0 ? value.slice(offset) : undefined;
|
|
29
|
+
}
|
|
30
|
+
/** Ephemeral declaration memory shared by markers in one source file. */
|
|
31
|
+
export class FileMemory {
|
|
32
|
+
sourcePath;
|
|
33
|
+
#generatedEntries = [];
|
|
34
|
+
#staticEntries;
|
|
35
|
+
#virtualText;
|
|
36
|
+
#characterDelta = 0;
|
|
37
|
+
constructor(sourcePath, sourceText) {
|
|
38
|
+
this.sourcePath = sourcePath;
|
|
39
|
+
this.#virtualText = sourceText;
|
|
40
|
+
this.#staticEntries = extractStaticFileMemory(sourcePath, sourceText);
|
|
41
|
+
}
|
|
42
|
+
get entries() {
|
|
43
|
+
const unique = new Map();
|
|
44
|
+
const staticEntries = this.#staticEntries.filter((entry) => !this.#generatedEntries.some((generated) => entry.startLine >= generated.startLine && entry.endLine <= generated.endLine));
|
|
45
|
+
for (const entry of [...staticEntries, ...this.#generatedEntries]) {
|
|
46
|
+
unique.set(`${entry.startLine}:${entry.endLine}:${entry.code}`, entry);
|
|
47
|
+
}
|
|
48
|
+
return [...unique.values()]
|
|
49
|
+
.sort((left, right) => left.startLine - right.startLine || left.endLine - right.endLine || left.code.localeCompare(right.code))
|
|
50
|
+
.map((entry) => ({ ...entry }));
|
|
51
|
+
}
|
|
52
|
+
rememberReplacement(range, code) {
|
|
53
|
+
const replacement = code.trim();
|
|
54
|
+
if (replacement.length === 0)
|
|
55
|
+
return;
|
|
56
|
+
const start = range.start + this.#characterDelta;
|
|
57
|
+
const end = range.end + this.#characterDelta;
|
|
58
|
+
if (start < 0 || end < start || end > this.#virtualText.length) {
|
|
59
|
+
throw new Error(`Cannot update FileMemory for ${this.sourcePath}: marker range is stale.`);
|
|
60
|
+
}
|
|
61
|
+
const marker = this.#virtualText.slice(start, end);
|
|
62
|
+
if (!marker.includes("@human")) {
|
|
63
|
+
throw new Error(`Cannot update FileMemory for ${this.sourcePath}: expected an @human marker.`);
|
|
64
|
+
}
|
|
65
|
+
const startLine = 1 + (this.#virtualText.slice(0, start).match(/\n/g)?.length ?? 0);
|
|
66
|
+
const endLine = startLine + (replacement.match(/\n/g)?.length ?? 0);
|
|
67
|
+
const formatted = formatInlineReplacement(this.#virtualText, { start, end }, replacement);
|
|
68
|
+
this.#virtualText = `${this.#virtualText.slice(0, start)}${formatted}${this.#virtualText.slice(end)}`;
|
|
69
|
+
this.#characterDelta += formatted.length - (range.end - range.start);
|
|
70
|
+
this.#generatedEntries.push({ startLine, endLine, code: replacement, fragment: false });
|
|
71
|
+
this.#staticEntries = extractStaticFileMemory(this.sourcePath, this.#virtualText);
|
|
72
|
+
}
|
|
73
|
+
render() {
|
|
74
|
+
const rendered = this.entries
|
|
75
|
+
.map((entry) => `line ${entry.startLine} to line ${entry.endLine}:\n${entry.code}`)
|
|
76
|
+
.join("\n\n");
|
|
77
|
+
if (scanSecrets(rendered).length > 0) {
|
|
78
|
+
throw new ContextSecurityError("SECRET_DETECTED", `FileMemory for ${this.sourcePath} contains credential-like declaration content.`, this.sourcePath);
|
|
79
|
+
}
|
|
80
|
+
return rendered;
|
|
81
|
+
}
|
|
82
|
+
normalizeReplacement(code) {
|
|
83
|
+
const original = code.trim();
|
|
84
|
+
let normalized = original;
|
|
85
|
+
let removedPrefix = false;
|
|
86
|
+
const entries = [...this.entries].sort((left, right) => right.code.length - left.code.length);
|
|
87
|
+
for (;;) {
|
|
88
|
+
const repeated = entries.find((entry) => !entry.fragment && normalized.startsWith(entry.code));
|
|
89
|
+
if (!repeated)
|
|
90
|
+
break;
|
|
91
|
+
const remainder = normalized.slice(repeated.code.length);
|
|
92
|
+
if (remainder.length === 0) {
|
|
93
|
+
normalized = "";
|
|
94
|
+
removedPrefix = true;
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
const withoutSeparator = stripMemorySeparator(remainder);
|
|
98
|
+
if (withoutSeparator === undefined)
|
|
99
|
+
break;
|
|
100
|
+
normalized = withoutSeparator.trimStart();
|
|
101
|
+
removedPrefix = true;
|
|
102
|
+
}
|
|
103
|
+
if (removedPrefix && normalized.length === 0) {
|
|
104
|
+
throw new FileMemoryConflictError(`The provider only repeated existing FileMemory for ${this.sourcePath}; the current marker was not implemented.`);
|
|
105
|
+
}
|
|
106
|
+
const remembered = new Set(this.#generatedEntries.flatMap((entry) => [...declaredIdentifiers(this.sourcePath, entry.code)]));
|
|
107
|
+
const conflicts = [...declaredIdentifiers(this.sourcePath, normalized)].filter((identifier) => remembered.has(identifier));
|
|
108
|
+
if (conflicts.length > 0) {
|
|
109
|
+
throw new FileMemoryConflictError(`The provider redeclared FileMemory identifier${conflicts.length === 1 ? "" : "s"} ${conflicts.join(", ")} in ${this.sourcePath}.`);
|
|
110
|
+
}
|
|
111
|
+
return normalized;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/** Generate each unit without mutating source files. */
|
|
115
|
+
export async function generateConversionUnits(units, generator, options = {}) {
|
|
116
|
+
const ordered = [...units].sort((left, right) => {
|
|
117
|
+
if (left.kind !== right.kind)
|
|
118
|
+
return left.kind === "file" ? -1 : 1;
|
|
119
|
+
const byPath = left.sourcePath.localeCompare(right.sourcePath);
|
|
120
|
+
if (byPath !== 0)
|
|
121
|
+
return byPath;
|
|
122
|
+
return (left.range?.start ?? 0) - (right.range?.start ?? 0);
|
|
123
|
+
});
|
|
124
|
+
const memories = new Map();
|
|
125
|
+
const generated = [];
|
|
126
|
+
const maxAttempts = 1 + Math.max(0, options.retries ?? 1);
|
|
127
|
+
for (const unit of ordered) {
|
|
128
|
+
let memory;
|
|
129
|
+
if (unit.kind === "inline") {
|
|
130
|
+
memory = memories.get(unit.absoluteSource);
|
|
131
|
+
if (!memory) {
|
|
132
|
+
memory = new FileMemory(unit.sourcePath, await readFile(unit.absoluteSource, "utf8"));
|
|
133
|
+
memories.set(unit.absoluteSource, memory);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
let code;
|
|
137
|
+
let failure;
|
|
138
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
|
|
139
|
+
options.onProgress?.({ kind: "start", unit, attempt });
|
|
140
|
+
try {
|
|
141
|
+
const renderedMemory = memory?.render();
|
|
142
|
+
const rawCode = await generator(unit, {
|
|
143
|
+
inline: unit.kind === "inline",
|
|
144
|
+
...(renderedMemory ? { fileMemory: renderedMemory } : {}),
|
|
145
|
+
});
|
|
146
|
+
code = memory && renderedMemory ? memory.normalizeReplacement(rawCode) : rawCode;
|
|
147
|
+
await options.validate?.(unit, code);
|
|
148
|
+
failure = undefined;
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
if (error instanceof ContextSecurityError)
|
|
153
|
+
throw error;
|
|
154
|
+
failure = error instanceof Error ? error.message : String(error);
|
|
155
|
+
code = undefined;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (failure !== undefined || code === undefined) {
|
|
159
|
+
generated.push({ unit, code: "", error: failure ?? "generation produced no code" });
|
|
160
|
+
options.onProgress?.({ kind: "skip", unit, reason: failure ?? "generation produced no code" });
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
generated.push({ unit, code });
|
|
164
|
+
if (memory && code.trim().length > 0)
|
|
165
|
+
memory.rememberReplacement(unit.range, code);
|
|
166
|
+
options.onProgress?.({ kind: "done", unit });
|
|
167
|
+
}
|
|
168
|
+
return generated;
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=file-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-memory.js","sourceRoot":"","sources":["../../../src/agents/direct/file-memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GenerateOptions } from "./types.ts";
|
|
2
|
+
/** Send one direct-conversion request to OpenAI-compatible chat or Ollama. */
|
|
3
|
+
export declare function generateCode(instruction: string, options: GenerateOptions): Promise<string>;
|
|
4
|
+
//# sourceMappingURL=generation-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generation-client.d.ts","sourceRoot":"","sources":["../../../src/agents/direct/generation-client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,8EAA8E;AAC9E,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAkDjG"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { buildDirectConversionPrompt } from "../../prompts/direct-conversion.js";
|
|
2
|
+
import { languageProfile } from "./languages.js";
|
|
3
|
+
import { stripCodeFence } from "./presentation.js";
|
|
4
|
+
/** Send one direct-conversion request to OpenAI-compatible chat or Ollama. */
|
|
5
|
+
export async function generateCode(instruction, options) {
|
|
6
|
+
const profile = languageProfile(options.language);
|
|
7
|
+
const prompt = buildDirectConversionPrompt({
|
|
8
|
+
languageLabel: profile.label,
|
|
9
|
+
instruction,
|
|
10
|
+
inline: options.inline ?? false,
|
|
11
|
+
...(options.fileMemory ? { fileMemory: options.fileMemory } : {}),
|
|
12
|
+
});
|
|
13
|
+
if (options.provider === "openai") {
|
|
14
|
+
const base = options.baseUrl ?? "https://api.openai.com/v1";
|
|
15
|
+
const response = await fetch(`${base}/chat/completions`, {
|
|
16
|
+
method: "POST",
|
|
17
|
+
headers: {
|
|
18
|
+
"content-type": "application/json",
|
|
19
|
+
...(options.apiKey ? { authorization: `Bearer ${options.apiKey}` } : {}),
|
|
20
|
+
},
|
|
21
|
+
body: JSON.stringify({
|
|
22
|
+
model: options.model,
|
|
23
|
+
messages: [
|
|
24
|
+
{ role: "system", content: prompt.system },
|
|
25
|
+
{ role: "user", content: prompt.user },
|
|
26
|
+
],
|
|
27
|
+
temperature: 0,
|
|
28
|
+
}),
|
|
29
|
+
signal: options.signal,
|
|
30
|
+
});
|
|
31
|
+
if (!response.ok)
|
|
32
|
+
throw new Error(`OpenAI request failed: ${response.status} ${await response.text()}`);
|
|
33
|
+
const data = (await response.json());
|
|
34
|
+
return stripCodeFence(data.choices?.[0]?.message?.content ?? "");
|
|
35
|
+
}
|
|
36
|
+
const base = options.baseUrl ?? "http://localhost:11434";
|
|
37
|
+
const response = await fetch(`${base.replace(/\/api\/?$/u, "")}/api/chat`, {
|
|
38
|
+
method: "POST",
|
|
39
|
+
headers: { "content-type": "application/json" },
|
|
40
|
+
body: JSON.stringify({
|
|
41
|
+
model: options.model,
|
|
42
|
+
stream: false,
|
|
43
|
+
options: { temperature: 0 },
|
|
44
|
+
messages: [
|
|
45
|
+
{ role: "system", content: prompt.system },
|
|
46
|
+
{ role: "user", content: prompt.user },
|
|
47
|
+
],
|
|
48
|
+
}),
|
|
49
|
+
signal: options.signal,
|
|
50
|
+
});
|
|
51
|
+
if (!response.ok)
|
|
52
|
+
throw new Error(`Ollama request failed: ${response.status} ${await response.text()}`);
|
|
53
|
+
const data = (await response.json());
|
|
54
|
+
return stripCodeFence(data.message?.content ?? "");
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=generation-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generation-client.js","sourceRoot":"","sources":["../../../src/agents/direct/generation-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Public surface of the small-model-friendly direct conversion agent. */
|
|
2
|
+
export * from "./types.ts";
|
|
3
|
+
export * from "./languages.ts";
|
|
4
|
+
export * from "./marker-parser.ts";
|
|
5
|
+
export * from "./file-memory.ts";
|
|
6
|
+
export * from "./discovery.ts";
|
|
7
|
+
export * from "./presentation.ts";
|
|
8
|
+
export * from "./generation-client.ts";
|
|
9
|
+
export * from "./application.ts";
|
|
10
|
+
export * from "./replacement.ts";
|
|
11
|
+
export * from "./declarations.ts";
|
|
12
|
+
export * from "./candidate-validation.ts";
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agents/direct/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Public surface of the small-model-friendly direct conversion agent. */
|
|
2
|
+
export * from "./types.js";
|
|
3
|
+
export * from "./languages.js";
|
|
4
|
+
export * from "./marker-parser.js";
|
|
5
|
+
export * from "./file-memory.js";
|
|
6
|
+
export * from "./discovery.js";
|
|
7
|
+
export * from "./presentation.js";
|
|
8
|
+
export * from "./generation-client.js";
|
|
9
|
+
export * from "./application.js";
|
|
10
|
+
export * from "./replacement.js";
|
|
11
|
+
export * from "./declarations.js";
|
|
12
|
+
export * from "./candidate-validation.js";
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agents/direct/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { LanguageProfile } from "./types.ts";
|
|
2
|
+
/** Operator-declared config language -> output extension and prompt label. */
|
|
3
|
+
export declare const LANGUAGE_PROFILES: Record<string, LanguageProfile>;
|
|
4
|
+
export declare function languageProfile(language: string): LanguageProfile;
|
|
5
|
+
//# sourceMappingURL=languages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"languages.d.ts","sourceRoot":"","sources":["../../../src/agents/direct/languages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,8EAA8E;AAC9E,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAW7D,CAAC;AAEF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,CAEjE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Operator-declared config language -> output extension and prompt label. */
|
|
2
|
+
export const LANGUAGE_PROFILES = {
|
|
3
|
+
typescript: { ext: "ts", label: "TypeScript" },
|
|
4
|
+
javascript: { ext: "js", label: "JavaScript" },
|
|
5
|
+
python: { ext: "py", label: "Python" },
|
|
6
|
+
rust: { ext: "rs", label: "Rust" },
|
|
7
|
+
go: { ext: "go", label: "Go" },
|
|
8
|
+
java: { ext: "java", label: "Java" },
|
|
9
|
+
ruby: { ext: "rb", label: "Ruby" },
|
|
10
|
+
csharp: { ext: "cs", label: "C#" },
|
|
11
|
+
cpp: { ext: "cpp", label: "C++" },
|
|
12
|
+
c: { ext: "c", label: "C" },
|
|
13
|
+
};
|
|
14
|
+
export function languageProfile(language) {
|
|
15
|
+
return LANGUAGE_PROFILES[language.trim().toLowerCase()] ?? { ext: "txt", label: language };
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=languages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"languages.js","sourceRoot":"","sources":["../../../src/agents/direct/languages.ts"],"names":[],"mappings":"AAEA,8EAA8E;AAC9E,MAAM,CAAC,MAAM,iBAAiB,GAAoC;IAChE,UAAU,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE;IAC9C,UAAU,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE;IAC9C,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE;IACtC,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;IAClC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;IAC9B,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;IACpC,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;IAClC,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;IAClC,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;IACjC,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;CAC5B,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,OAAO,iBAAiB,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC7F,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface InlineMarker {
|
|
2
|
+
prompt: string;
|
|
3
|
+
start: number;
|
|
4
|
+
end: number;
|
|
5
|
+
}
|
|
6
|
+
/** Find every lexical `@human` comment marker with its exact character range. */
|
|
7
|
+
export declare function extractInlineMarkers(text: string): InlineMarker[];
|
|
8
|
+
//# sourceMappingURL=marker-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marker-parser.d.ts","sourceRoot":"","sources":["../../../src/agents/direct/marker-parser.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AA0CD,iFAAiF;AACjF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CA6CjE"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/** Advance past a quoted region so comment-shaped text inside it stays inert. */
|
|
2
|
+
function endOfQuotedRegion(text, start) {
|
|
3
|
+
const quote = text[start];
|
|
4
|
+
const triple = quote !== "`" && text.startsWith(quote.repeat(3), start);
|
|
5
|
+
const delimiter = triple ? quote.repeat(3) : quote;
|
|
6
|
+
let offset = start + delimiter.length;
|
|
7
|
+
while (offset < text.length) {
|
|
8
|
+
if (text[offset] === "\\") {
|
|
9
|
+
offset = Math.min(offset + 2, text.length);
|
|
10
|
+
continue;
|
|
11
|
+
}
|
|
12
|
+
if (text.startsWith(delimiter, offset))
|
|
13
|
+
return offset + delimiter.length;
|
|
14
|
+
if (!triple && quote !== "`" && (text[offset] === "\n" || text[offset] === "\r"))
|
|
15
|
+
return offset;
|
|
16
|
+
offset += 1;
|
|
17
|
+
}
|
|
18
|
+
return text.length;
|
|
19
|
+
}
|
|
20
|
+
function lineEnd(text, start) {
|
|
21
|
+
const newline = text.indexOf("\n", start);
|
|
22
|
+
return newline === -1 ? text.length : newline;
|
|
23
|
+
}
|
|
24
|
+
function blockMarkerPrompt(content) {
|
|
25
|
+
const ordinary = /^\s*@human\b[ \t]*([\s\S]*)$/u.exec(content);
|
|
26
|
+
if (ordinary)
|
|
27
|
+
return (ordinary[1] ?? "").trim() || undefined;
|
|
28
|
+
// JSDoc content begins with the third opener star. Remove only conventional
|
|
29
|
+
// leading `*` decoration; prose before @human remains non-instruction text.
|
|
30
|
+
if (!content.startsWith("*"))
|
|
31
|
+
return undefined;
|
|
32
|
+
const normalized = content
|
|
33
|
+
.slice(1)
|
|
34
|
+
.split(/\r?\n/u)
|
|
35
|
+
.map((line) => line.replace(/^\s*\*?[ \t]?/u, ""))
|
|
36
|
+
.join("\n");
|
|
37
|
+
const jsdoc = /^\s*@human\b[ \t]*([\s\S]*)$/u.exec(normalized);
|
|
38
|
+
return (jsdoc?.[1] ?? "").trim() || undefined;
|
|
39
|
+
}
|
|
40
|
+
/** Find every lexical `@human` comment marker with its exact character range. */
|
|
41
|
+
export function extractInlineMarkers(text) {
|
|
42
|
+
const markers = [];
|
|
43
|
+
let offset = 0;
|
|
44
|
+
while (offset < text.length) {
|
|
45
|
+
const character = text[offset];
|
|
46
|
+
if (character === "'" || character === '"' || character === "`") {
|
|
47
|
+
offset = endOfQuotedRegion(text, offset);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
if (text.startsWith("//", offset)) {
|
|
51
|
+
const end = lineEnd(text, offset);
|
|
52
|
+
const match = /^[ \t]*@human\b[ \t]*([^\r]*)$/u.exec(text.slice(offset + 2, end));
|
|
53
|
+
const prompt = (match?.[1] ?? "").trim();
|
|
54
|
+
if (match && prompt.length > 0)
|
|
55
|
+
markers.push({ prompt, start: offset, end });
|
|
56
|
+
offset = end;
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (text.startsWith("/*", offset)) {
|
|
60
|
+
const close = text.indexOf("*/", offset + 2);
|
|
61
|
+
const end = close === -1 ? text.length : close + 2;
|
|
62
|
+
if (close !== -1) {
|
|
63
|
+
const prompt = blockMarkerPrompt(text.slice(offset + 2, close));
|
|
64
|
+
if (prompt)
|
|
65
|
+
markers.push({ prompt, start: offset, end });
|
|
66
|
+
}
|
|
67
|
+
offset = end;
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (character === "#") {
|
|
71
|
+
const end = lineEnd(text, offset);
|
|
72
|
+
const match = /^[ \t]*@human\b[ \t]*([^\r]*)$/u.exec(text.slice(offset + 1, end));
|
|
73
|
+
const prompt = (match?.[1] ?? "").trim();
|
|
74
|
+
if (match && prompt.length > 0)
|
|
75
|
+
markers.push({ prompt, start: offset, end });
|
|
76
|
+
offset = end;
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
offset += 1;
|
|
80
|
+
}
|
|
81
|
+
return markers;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=marker-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marker-parser.js","sourceRoot":"","sources":["../../../src/agents/direct/marker-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ConversionUnit } from "./types.ts";
|
|
2
|
+
export declare class ModelOutputError extends Error {
|
|
3
|
+
constructor(message: string);
|
|
4
|
+
}
|
|
5
|
+
export declare function renderReceipt(units: readonly ConversionUnit[], provider: string, model: string, language: string): string;
|
|
6
|
+
export declare function stripCodeFence(output: string): string;
|
|
7
|
+
//# sourceMappingURL=presentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation.d.ts","sourceRoot":"","sources":["../../../src/agents/direct/presentation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,cAAc,EAAE,EAChC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,MAAM,CAkBR;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAWrD"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { languageProfile } from "./languages.js";
|
|
2
|
+
export class ModelOutputError extends Error {
|
|
3
|
+
constructor(message) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = "ModelOutputError";
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export function renderReceipt(units, provider, model, language) {
|
|
9
|
+
const profile = languageProfile(language);
|
|
10
|
+
const lines = [
|
|
11
|
+
"human-to-code — conversion receipt",
|
|
12
|
+
"",
|
|
13
|
+
` Language : ${profile.label} (.${profile.ext})`,
|
|
14
|
+
` Provider : ${provider}`,
|
|
15
|
+
` Model : ${model}`,
|
|
16
|
+
` Engine : direct (one model request per prompt)`,
|
|
17
|
+
` Requests : ${units.length}`,
|
|
18
|
+
"",
|
|
19
|
+
];
|
|
20
|
+
if (units.length === 0)
|
|
21
|
+
lines.push(" No .human files or @human markers were found.");
|
|
22
|
+
else {
|
|
23
|
+
lines.push(" The following will be generated:");
|
|
24
|
+
for (const unit of units)
|
|
25
|
+
lines.push(` • ${unit.describe}`);
|
|
26
|
+
}
|
|
27
|
+
return `${lines.join("\n")}\n`;
|
|
28
|
+
}
|
|
29
|
+
export function stripCodeFence(output) {
|
|
30
|
+
const trimmed = output.trim();
|
|
31
|
+
const fences = [...trimmed.matchAll(/```(?:[\w.+-]+)?[ \t]*\r?\n([\s\S]*?)\r?\n?```/gu)];
|
|
32
|
+
if (fences.length > 1) {
|
|
33
|
+
throw new ModelOutputError("Model returned multiple fenced code blocks; refusing an ambiguous replacement.");
|
|
34
|
+
}
|
|
35
|
+
if (fences.length === 1)
|
|
36
|
+
return (fences[0]?.[1] ?? "").trim();
|
|
37
|
+
if (trimmed.includes("```")) {
|
|
38
|
+
throw new ModelOutputError("Model returned an unterminated code fence; refusing to write formatting as source.");
|
|
39
|
+
}
|
|
40
|
+
return trimmed;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=presentation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation.js","sourceRoot":"","sources":["../../../src/agents/direct/presentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,MAAM,UAAU,aAAa,CAC3B,KAAgC,EAChC,QAAgB,EAChB,KAAa,EACb,QAAgB;IAEhB,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG;QACZ,oCAAoC;QACpC,EAAE;QACF,gBAAgB,OAAO,CAAC,KAAK,MAAM,OAAO,CAAC,GAAG,GAAG;QACjD,gBAAgB,QAAQ,EAAE;QAC1B,gBAAgB,KAAK,EAAE;QACvB,oDAAoD;QACpD,gBAAgB,KAAK,CAAC,MAAM,EAAE;QAC9B,EAAE;KACH,CAAC;IACF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;SACjF,CAAC;QACJ,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACjD,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,kDAAkD,CAAC,CAAC,CAAC;IACzF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,gBAAgB,CAAC,gFAAgF,CAAC,CAAC;IAC/G,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9D,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,gBAAgB,CAAC,oFAAoF,CAAC,CAAC;IACnH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Stale-safe inline replacement formatting shared by validation, memory, and apply. */
|
|
2
|
+
export declare function formatInlineReplacement(source: string, range: {
|
|
3
|
+
start: number;
|
|
4
|
+
end: number;
|
|
5
|
+
}, code: string): string;
|
|
6
|
+
export declare function replaceInlineMarker(source: string, range: {
|
|
7
|
+
start: number;
|
|
8
|
+
end: number;
|
|
9
|
+
}, expectedMarker: string | undefined, code: string): string;
|
|
10
|
+
//# sourceMappingURL=replacement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replacement.d.ts","sourceRoot":"","sources":["../../../src/agents/direct/replacement.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EACrC,IAAI,EAAE,MAAM,GACX,MAAM,CAQR;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EACrC,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,IAAI,EAAE,MAAM,GACX,MAAM,CAMR"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Stale-safe inline replacement formatting shared by validation, memory, and apply. */
|
|
2
|
+
export function formatInlineReplacement(source, range, code) {
|
|
3
|
+
const normalized = code.trim();
|
|
4
|
+
if (normalized.length === 0)
|
|
5
|
+
return "";
|
|
6
|
+
const lineStart = source.lastIndexOf("\n", Math.max(0, range.start - 1)) + 1;
|
|
7
|
+
const prefix = source.slice(lineStart, range.start);
|
|
8
|
+
const indentation = /^[ \t]*$/u.test(prefix) ? prefix : "";
|
|
9
|
+
const newline = source.includes("\r\n") ? "\r\n" : "\n";
|
|
10
|
+
return normalized.split(/\r?\n/u).join(`${newline}${indentation}`);
|
|
11
|
+
}
|
|
12
|
+
export function replaceInlineMarker(source, range, expectedMarker, code) {
|
|
13
|
+
if (expectedMarker === undefined || source.slice(range.start, range.end) !== expectedMarker) {
|
|
14
|
+
throw new Error("Inline marker changed after discovery; re-run conversion on the current file.");
|
|
15
|
+
}
|
|
16
|
+
const replacement = formatInlineReplacement(source, range, code);
|
|
17
|
+
return `${source.slice(0, range.start)}${replacement}${source.slice(range.end)}`;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=replacement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replacement.js","sourceRoot":"","sources":["../../../src/agents/direct/replacement.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,MAAM,UAAU,uBAAuB,CACrC,MAAc,EACd,KAAqC,EACrC,IAAY;IAEZ,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACxD,OAAO,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,WAAW,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,MAAc,EACd,KAAqC,EACrC,cAAkC,EAClC,IAAY;IAEZ,IAAI,cAAc,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,cAAc,EAAE,CAAC;QAC5F,MAAM,IAAI,KAAK,CAAC,+EAA+E,CAAC,CAAC;IACnG,CAAC;IACD,MAAM,WAAW,GAAG,uBAAuB,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACjE,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AACnF,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { StaticFileMemoryEntry } from "../../pipeline/file-memory.ts";
|
|
2
|
+
export interface LanguageProfile {
|
|
3
|
+
/** Output file extension without a dot. */
|
|
4
|
+
ext: string;
|
|
5
|
+
/** Human label used in prompts. */
|
|
6
|
+
label: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ConversionUnit {
|
|
9
|
+
kind: "file" | "inline";
|
|
10
|
+
/** Project-relative source path. */
|
|
11
|
+
sourcePath: string;
|
|
12
|
+
/** Absolute source path. */
|
|
13
|
+
absoluteSource: string;
|
|
14
|
+
/** The extracted human-language instruction. */
|
|
15
|
+
prompt: string;
|
|
16
|
+
/** For `file` units, the project-relative output path to write. */
|
|
17
|
+
outputPath?: string;
|
|
18
|
+
/** For `inline` units, the character range of the marker to replace. */
|
|
19
|
+
range?: {
|
|
20
|
+
start: number;
|
|
21
|
+
end: number;
|
|
22
|
+
};
|
|
23
|
+
/** Exact marker bytes captured during discovery; required for stale-edit detection. */
|
|
24
|
+
expectedMarker?: string;
|
|
25
|
+
/** 1-based source line of the marker, for progress display. */
|
|
26
|
+
line?: number;
|
|
27
|
+
/** Short human-readable description for the receipt. */
|
|
28
|
+
describe: string;
|
|
29
|
+
}
|
|
30
|
+
export type FileMemoryEntry = StaticFileMemoryEntry;
|
|
31
|
+
export interface UnitGenerationContext {
|
|
32
|
+
inline: boolean;
|
|
33
|
+
/** Static declarations and earlier replacements in this unit's file. */
|
|
34
|
+
fileMemory?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface GeneratedConversionUnit {
|
|
37
|
+
unit: ConversionUnit;
|
|
38
|
+
code: string;
|
|
39
|
+
/** Set when this unit could not be generated; the others are unaffected. */
|
|
40
|
+
error?: string;
|
|
41
|
+
}
|
|
42
|
+
/** Live progress for one unit during a deterministic conversion run. */
|
|
43
|
+
export type ConversionProgress = {
|
|
44
|
+
kind: "start";
|
|
45
|
+
unit: ConversionUnit;
|
|
46
|
+
attempt: number;
|
|
47
|
+
} | {
|
|
48
|
+
kind: "done";
|
|
49
|
+
unit: ConversionUnit;
|
|
50
|
+
} | {
|
|
51
|
+
kind: "skip";
|
|
52
|
+
unit: ConversionUnit;
|
|
53
|
+
reason: string;
|
|
54
|
+
};
|
|
55
|
+
export interface GenerateUnitsOptions {
|
|
56
|
+
/** Extra generation attempts when a unit trips the FileMemory guard or the provider errors. */
|
|
57
|
+
retries?: number;
|
|
58
|
+
onProgress?: (event: ConversionProgress) => void;
|
|
59
|
+
/** Fail-closed candidate check run before a unit is remembered or applied. */
|
|
60
|
+
validate?: (unit: ConversionUnit, code: string) => Promise<void>;
|
|
61
|
+
}
|
|
62
|
+
export interface DirectDiscoveryNotice {
|
|
63
|
+
code: "TARGET_EXISTS" | "UNSUPPORTED_MARKER_FILE";
|
|
64
|
+
sourcePath: string;
|
|
65
|
+
message: string;
|
|
66
|
+
}
|
|
67
|
+
export interface DirectDiscoveryResult {
|
|
68
|
+
units: ConversionUnit[];
|
|
69
|
+
notices: DirectDiscoveryNotice[];
|
|
70
|
+
}
|
|
71
|
+
export interface GenerateOptions {
|
|
72
|
+
language: string;
|
|
73
|
+
provider: string;
|
|
74
|
+
model: string;
|
|
75
|
+
baseUrl?: string;
|
|
76
|
+
apiKey?: string;
|
|
77
|
+
/** Whether this request replaces one inline @human marker. */
|
|
78
|
+
inline?: boolean;
|
|
79
|
+
/** Deterministic earlier replacements from the same file. */
|
|
80
|
+
fileMemory?: string;
|
|
81
|
+
signal?: AbortSignal;
|
|
82
|
+
}
|
|
83
|
+
export interface AppliedUnit {
|
|
84
|
+
unit: ConversionUnit;
|
|
85
|
+
writtenPath: string;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/agents/direct/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAE3E,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;IACxB,oCAAoC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,uFAAuF;IACvF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,eAAe,GAAG,qBAAqB,CAAC;AAEpD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wEAAwE;AACxE,MAAM,MAAM,kBAAkB,GAC1B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,cAAc,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,MAAM,WAAW,oBAAoB;IACnC,+FAA+F;IAC/F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACjD,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,eAAe,GAAG,yBAAyB,CAAC;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,OAAO,EAAE,qBAAqB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,cAAc,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB"}
|