@specverse/engines 6.42.3 → 6.60.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.
- package/dist/ai/analyse-runner.d.ts.map +1 -1
- package/dist/ai/analyse-runner.js +53 -1
- package/dist/ai/analyse-runner.js.map +1 -1
- package/dist/ai/prompt-runner.d.ts +39 -1
- package/dist/ai/prompt-runner.d.ts.map +1 -1
- package/dist/ai/prompt-runner.js +44 -3
- package/dist/ai/prompt-runner.js.map +1 -1
- package/dist/ai/providers/claude-cli.d.ts.map +1 -1
- package/dist/ai/providers/claude-cli.js +8 -1
- package/dist/ai/providers/claude-cli.js.map +1 -1
- package/dist/ai/skill-loader.d.ts +50 -0
- package/dist/ai/skill-loader.d.ts.map +1 -0
- package/dist/ai/skill-loader.js +96 -0
- package/dist/ai/skill-loader.js.map +1 -0
- package/dist/analyse-prepass/adapters/index.d.ts +2 -0
- package/dist/analyse-prepass/adapters/index.d.ts.map +1 -1
- package/dist/analyse-prepass/adapters/index.js +2 -0
- package/dist/analyse-prepass/adapters/index.js.map +1 -1
- package/dist/analyse-prepass/adapters/module-functions.d.ts +95 -0
- package/dist/analyse-prepass/adapters/module-functions.d.ts.map +1 -0
- package/dist/analyse-prepass/adapters/module-functions.js +358 -0
- package/dist/analyse-prepass/adapters/module-functions.js.map +1 -0
- package/dist/analyse-prepass/adapters/naming-convention-fks.d.ts +90 -0
- package/dist/analyse-prepass/adapters/naming-convention-fks.d.ts.map +1 -0
- package/dist/analyse-prepass/adapters/naming-convention-fks.js +181 -0
- package/dist/analyse-prepass/adapters/naming-convention-fks.js.map +1 -0
- package/dist/analyse-prepass/index.d.ts +8 -0
- package/dist/analyse-prepass/index.d.ts.map +1 -1
- package/dist/analyse-prepass/index.js +130 -0
- package/dist/analyse-prepass/index.js.map +1 -1
- package/dist/libs/instance-factories/cli/templates/commander/cli-entry-generator.js +11 -12
- package/dist/libs/instance-factories/cli/templates/commander/command-generator.js +2 -2
- package/dist/libs/instance-factories/controllers/templates/fastify/routes-generator.js +29 -10
- package/dist/libs/instance-factories/services/templates/prisma/ai-behaviors-generator.js +10 -9
- package/dist/libs/instance-factories/services/templates/prisma/behavior-generator.js +24 -2
- package/dist/libs/instance-factories/services/templates/prisma/controller-generator.js +28 -20
- package/dist/normalise/index.d.ts +14 -0
- package/dist/normalise/index.d.ts.map +1 -0
- package/dist/normalise/index.js +14 -0
- package/dist/normalise/index.js.map +1 -0
- package/dist/normalise/load-overrides.d.ts +43 -0
- package/dist/normalise/load-overrides.d.ts.map +1 -0
- package/dist/normalise/load-overrides.js +121 -0
- package/dist/normalise/load-overrides.js.map +1 -0
- package/dist/normalise/normalise-rules.d.ts +181 -0
- package/dist/normalise/normalise-rules.d.ts.map +1 -0
- package/dist/normalise/normalise-rules.js +79 -0
- package/dist/normalise/normalise-rules.js.map +1 -0
- package/dist/normalise/rules/cluster-module-functions.d.ts +31 -0
- package/dist/normalise/rules/cluster-module-functions.d.ts.map +1 -0
- package/dist/normalise/rules/cluster-module-functions.js +238 -0
- package/dist/normalise/rules/cluster-module-functions.js.map +1 -0
- package/dist/normalise/rules/crud-into-curved.d.ts +117 -0
- package/dist/normalise/rules/crud-into-curved.d.ts.map +1 -0
- package/dist/normalise/rules/crud-into-curved.js +303 -0
- package/dist/normalise/rules/crud-into-curved.js.map +1 -0
- package/dist/normalise/rules/drop-trivial-passthrough.d.ts +92 -0
- package/dist/normalise/rules/drop-trivial-passthrough.d.ts.map +1 -0
- package/dist/normalise/rules/drop-trivial-passthrough.js +217 -0
- package/dist/normalise/rules/drop-trivial-passthrough.js.map +1 -0
- package/dist/normalise/runner.d.ts +58 -0
- package/dist/normalise/runner.d.ts.map +1 -0
- package/dist/normalise/runner.js +114 -0
- package/dist/normalise/runner.js.map +1 -0
- package/dist/parser/import-resolver/resolver.js +1 -1
- package/dist/parser/import-resolver/resolver.js.map +1 -1
- package/dist/realize/engines/typescript-engine.js +1 -1
- package/dist/realize/engines/typescript-engine.js.map +1 -1
- package/dist/realize/index.d.ts.map +1 -1
- package/dist/realize/index.js +221 -88
- package/dist/realize/index.js.map +1 -1
- package/dist/realize/library/library.js +1 -1
- package/dist/realize/library/library.js.map +1 -1
- package/dist/realize/library/resolver.d.ts.map +1 -1
- package/dist/realize/library/resolver.js +14 -1
- package/dist/realize/library/resolver.js.map +1 -1
- package/dist/realize/owner-emit-shared.d.ts +114 -0
- package/dist/realize/owner-emit-shared.d.ts.map +1 -0
- package/dist/realize/owner-emit-shared.js +227 -0
- package/dist/realize/owner-emit-shared.js.map +1 -0
- package/dist/realize/per-action-recovery.d.ts +74 -0
- package/dist/realize/per-action-recovery.d.ts.map +1 -0
- package/dist/realize/per-action-recovery.js +268 -0
- package/dist/realize/per-action-recovery.js.map +1 -0
- package/dist/realize/per-owner-emit.d.ts +7 -58
- package/dist/realize/per-owner-emit.d.ts.map +1 -1
- package/dist/realize/per-owner-emit.js +67 -215
- package/dist/realize/per-owner-emit.js.map +1 -1
- package/dist/realize/per-owner-runner.d.ts +24 -4
- package/dist/realize/per-owner-runner.d.ts.map +1 -1
- package/dist/realize/per-owner-runner.js +77 -19
- package/dist/realize/per-owner-runner.js.map +1 -1
- package/dist/realize/post-emit-verify/diagnostics.d.ts +107 -0
- package/dist/realize/post-emit-verify/diagnostics.d.ts.map +1 -0
- package/dist/realize/post-emit-verify/diagnostics.js +148 -0
- package/dist/realize/post-emit-verify/diagnostics.js.map +1 -0
- package/dist/realize/post-emit-verify/feedback-runner.d.ts +123 -0
- package/dist/realize/post-emit-verify/feedback-runner.d.ts.map +1 -0
- package/dist/realize/post-emit-verify/feedback-runner.js +232 -0
- package/dist/realize/post-emit-verify/feedback-runner.js.map +1 -0
- package/dist/realize/post-emit-verify/index.d.ts +19 -0
- package/dist/realize/post-emit-verify/index.d.ts.map +1 -0
- package/dist/realize/post-emit-verify/index.js +18 -0
- package/dist/realize/post-emit-verify/index.js.map +1 -0
- package/dist/realize/post-emit-verify/reemit.d.ts +82 -0
- package/dist/realize/post-emit-verify/reemit.d.ts.map +1 -0
- package/dist/realize/post-emit-verify/reemit.js +124 -0
- package/dist/realize/post-emit-verify/reemit.js.map +1 -0
- package/dist/realize/post-emit-verify/types.d.ts +187 -0
- package/dist/realize/post-emit-verify/types.d.ts.map +1 -0
- package/dist/realize/post-emit-verify/types.js +28 -0
- package/dist/realize/post-emit-verify/types.js.map +1 -0
- package/dist/realize/post-emit-verify/verifier-manifest.d.ts +29 -0
- package/dist/realize/post-emit-verify/verifier-manifest.d.ts.map +1 -0
- package/dist/realize/post-emit-verify/verifier-manifest.js +57 -0
- package/dist/realize/post-emit-verify/verifier-manifest.js.map +1 -0
- package/dist/realize/post-emit-verify/verifiers/stub-completeness.d.ts +85 -0
- package/dist/realize/post-emit-verify/verifiers/stub-completeness.d.ts.map +1 -0
- package/dist/realize/post-emit-verify/verifiers/stub-completeness.js +298 -0
- package/dist/realize/post-emit-verify/verifiers/stub-completeness.js.map +1 -0
- package/dist/realize/post-emit-verify/verifiers/tsc.d.ts +24 -0
- package/dist/realize/post-emit-verify/verifiers/tsc.d.ts.map +1 -0
- package/dist/realize/post-emit-verify/verifiers/tsc.js +148 -0
- package/dist/realize/post-emit-verify/verifiers/tsc.js.map +1 -0
- package/dist/realize/realize-context-snapshot.d.ts +70 -0
- package/dist/realize/realize-context-snapshot.d.ts.map +1 -0
- package/dist/realize/realize-context-snapshot.js +96 -0
- package/dist/realize/realize-context-snapshot.js.map +1 -0
- package/dist/realize/realize-rules.d.ts +113 -0
- package/dist/realize/realize-rules.d.ts.map +1 -0
- package/dist/realize/realize-rules.js +271 -0
- package/dist/realize/realize-rules.js.map +1 -0
- package/dist/realize/structural-validator.d.ts +36 -2
- package/dist/realize/structural-validator.d.ts.map +1 -1
- package/dist/realize/structural-validator.js +50 -7
- package/dist/realize/structural-validator.js.map +1 -1
- package/libs/instance-factories/cli/templates/commander/cli-entry-generator.ts +11 -12
- package/libs/instance-factories/cli/templates/commander/command-generator.ts +2 -2
- package/libs/instance-factories/controllers/templates/fastify/routes-generator.ts +49 -15
- package/libs/instance-factories/services/templates/prisma/ai-behaviors-generator.ts +19 -3
- package/libs/instance-factories/services/templates/prisma/behavior-generator.ts +62 -2
- package/libs/instance-factories/services/templates/prisma/controller-generator.ts +47 -20
- package/package.json +9 -1
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-action recovery tier — Phase 5a of
|
|
3
|
+
* `2026-05-14-PER-ACTION-RECOVERY-TIER.md`.
|
|
4
|
+
*
|
|
5
|
+
* The realize per-owner runner has three tiers:
|
|
6
|
+
*
|
|
7
|
+
* Tier 1 — whole-owner emit (`per-owner-emit.ts`). One LLM call emits
|
|
8
|
+
* the entire `<Owner>.ai.ts`. Works for the easy majority.
|
|
9
|
+
* Tier 2 — THIS MODULE. When Tier 1 fails (structural-preservation
|
|
10
|
+
* reject, parse failure, LLM decline), instead of dropping
|
|
11
|
+
* straight to a γ-stub file, retry the owner ACTION-BY-ACTION
|
|
12
|
+
* — but with the FULL owner context in every call.
|
|
13
|
+
* Tier 3 — γ-stub placeholder file (`renderFallbackPlaceholderFile`
|
|
14
|
+
* in `per-owner-runner.ts`). Only reached if Tier 2 produced
|
|
15
|
+
* ZERO real bodies.
|
|
16
|
+
*
|
|
17
|
+
* "Wide context, narrow output" — the distinction from the abandoned
|
|
18
|
+
* Realize L3 per-action emit: L3 gave the LLM NARROW context (one
|
|
19
|
+
* action's steps, no class shell, no capabilities) and it starved
|
|
20
|
+
* (29/94 actions came back as throw-stubs). This keeps the FULL owner
|
|
21
|
+
* context — every action's [PRE-BAKED] scaffolding, the target runtime,
|
|
22
|
+
* manifest capabilities, V2 clients, cross-service operation surface —
|
|
23
|
+
* in every per-action call, and only narrows the OUTPUT to one function
|
|
24
|
+
* body. The reasoning load per call drops (the model holds one function
|
|
25
|
+
* in its head, not all of them) without re-introducing context
|
|
26
|
+
* starvation.
|
|
27
|
+
*
|
|
28
|
+
* Motivation (Phase 3 trial, 2026-05-14): the quant-fidelity gap between
|
|
29
|
+
* Ollama (Q4 GGUF) and MarrBox (FP8) — SAME model, Qwen3-Coder-30B-A3B
|
|
30
|
+
* — localized to the single hardest owner (`ReactiveStateEngine`, 7
|
|
31
|
+
* interrelated functions). The Mac Mini's 24GB RAM structurally pins it
|
|
32
|
+
* at ~Q4 (Q6/Q8 don't fit), so "run a better quant" is closed. This
|
|
33
|
+
* makes the TASK easier instead.
|
|
34
|
+
*
|
|
35
|
+
* Phase 5a scope: declaration-order emission, full owner SCAFFOLDING
|
|
36
|
+
* context per call. Phase 5b adds dependency-ordered emission +
|
|
37
|
+
* already-emitted siblings shown as concrete code. Phase 5c adds the
|
|
38
|
+
* action-count cap telemetry.
|
|
39
|
+
*/
|
|
40
|
+
import { generateText } from 'ai';
|
|
41
|
+
import { assembleSystemWithSkills } from '../ai/prompt-runner.js';
|
|
42
|
+
import { resolveProviderId } from '../ai/model-resolver.js';
|
|
43
|
+
import { buildPerActionScaffolding, } from './per-owner-emit.js';
|
|
44
|
+
import { validateLlmOutputPreservesConventions, DEFAULT_STRUCTURAL_DROP_THRESHOLD, } from './structural-validator.js';
|
|
45
|
+
import { extractTypescriptBlock } from './owner-emit-shared.js';
|
|
46
|
+
/** Reserved words that can't appear as `export async function <name>`.
|
|
47
|
+
* Mirrors `per-owner-runner.ts`'s TS_RESERVED_WORDS — kept local to
|
|
48
|
+
* avoid a cross-module dependency for a 5a-scoped concern; a future
|
|
49
|
+
* cleanup could hoist both to `owner-emit-shared.ts`. */
|
|
50
|
+
const TS_RESERVED_WORDS = new Set([
|
|
51
|
+
'delete', 'class', 'function', 'return', 'void', 'typeof',
|
|
52
|
+
'instanceof', 'new', 'this', 'throw', 'try', 'catch', 'finally',
|
|
53
|
+
'if', 'else', 'for', 'while', 'do', 'switch', 'case', 'break',
|
|
54
|
+
'continue', 'default', 'var', 'let', 'const', 'in', 'of',
|
|
55
|
+
'async', 'await', 'yield', 'export', 'import', 'from',
|
|
56
|
+
'true', 'false', 'null', 'undefined', 'static', 'public',
|
|
57
|
+
'private', 'protected', 'interface', 'type', 'enum', 'extends',
|
|
58
|
+
'implements', 'super',
|
|
59
|
+
]);
|
|
60
|
+
/**
|
|
61
|
+
* Render a γ-stub for a single action whose per-action recovery emit
|
|
62
|
+
* failed. The error string says "per-action recovery fell back" — the
|
|
63
|
+
* stub-completeness verifier's GAMMA_FALLBACK_RE matches this (STUB001,
|
|
64
|
+
* auto-reemit-eligible), distinct from an LLM's own "not implemented"
|
|
65
|
+
* throw (STUB002, surface-spec-gap). Reserved-word action names get the
|
|
66
|
+
* re-export-rename treatment so the file still parses.
|
|
67
|
+
*/
|
|
68
|
+
function renderActionGammaStub(actionName) {
|
|
69
|
+
const body = ` throw new Error("${actionName}: not implemented (per-action recovery fell back)");`;
|
|
70
|
+
if (TS_RESERVED_WORDS.has(actionName)) {
|
|
71
|
+
const safe = `${actionName}_`;
|
|
72
|
+
return (`/** Placeholder — per-action recovery failed for ${actionName}. */\n` +
|
|
73
|
+
`async function ${safe}(_input: any): Promise<any> {\n${body}\n}\n` +
|
|
74
|
+
`export { ${safe} as ${actionName} };`);
|
|
75
|
+
}
|
|
76
|
+
return (`/** Placeholder — per-action recovery failed for ${actionName}. */\n` +
|
|
77
|
+
`export async function ${actionName}(_input: any): Promise<any> {\n${body}\n}`);
|
|
78
|
+
}
|
|
79
|
+
/** Collect the pre-baked snippets for ONE action (its matched steps). */
|
|
80
|
+
function prebakedForAction(action) {
|
|
81
|
+
const out = [];
|
|
82
|
+
action.perStepMatches.forEach((match, idx) => {
|
|
83
|
+
if (match?.matched && match.call) {
|
|
84
|
+
out.push({
|
|
85
|
+
stepNum: idx + 1,
|
|
86
|
+
stepText: action.spec.steps[idx] ?? '',
|
|
87
|
+
snippet: match.call,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
return out;
|
|
92
|
+
}
|
|
93
|
+
/** esbuild parse-check a single per-action emission as a TS module.
|
|
94
|
+
* Returns null on success, an error string on failure. */
|
|
95
|
+
async function parseCheckModule(code) {
|
|
96
|
+
try {
|
|
97
|
+
const esbuild = await import('esbuild');
|
|
98
|
+
await esbuild.transform(code, { loader: 'ts', format: 'esm', target: 'es2022' });
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
return err?.errors?.[0]?.text || err?.message || 'unknown parse error';
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/** Build the per-action recovery user prompt. Full owner context +
|
|
106
|
+
* "emit ONLY this one action". */
|
|
107
|
+
function buildActionPrompt(request, target) {
|
|
108
|
+
const allScaffolding = buildPerActionScaffolding(request.actions);
|
|
109
|
+
const targetScaffolding = buildPerActionScaffolding([target]);
|
|
110
|
+
const parts = [];
|
|
111
|
+
parts.push(`You are recovering ONE function for the \`${request.ownerName}\` ` +
|
|
112
|
+
`${request.ownerKind}. The whole-owner emit for it could not be ` +
|
|
113
|
+
`produced coherently, so each action is being emitted on its own — ` +
|
|
114
|
+
`but with the FULL owner context below. Emit ONLY the one action ` +
|
|
115
|
+
`named in EMIT TARGET.`);
|
|
116
|
+
parts.push('');
|
|
117
|
+
parts.push(`## TARGET RUNTIME`);
|
|
118
|
+
parts.push(request.targetRuntime ?? 'Node.js (backend)');
|
|
119
|
+
parts.push('');
|
|
120
|
+
parts.push(`## AVAILABLE CAPABILITIES`);
|
|
121
|
+
parts.push(request.availableCapabilities ?? '(none — only `input: any` is available)');
|
|
122
|
+
parts.push('');
|
|
123
|
+
parts.push(`## AVAILABLE CLIENTS`);
|
|
124
|
+
parts.push(request.availableClients ?? '(none)');
|
|
125
|
+
parts.push('');
|
|
126
|
+
parts.push(`## AVAILABLE SPEC SURFACE (other services / controllers — call these, don't reimplement)`);
|
|
127
|
+
parts.push(request.availableSpecSurface ?? '(no other services / controllers in this spec)');
|
|
128
|
+
parts.push('');
|
|
129
|
+
parts.push(`## ALL ACTIONS ON THIS OWNER (context — do NOT emit these)`);
|
|
130
|
+
parts.push(allScaffolding);
|
|
131
|
+
parts.push('');
|
|
132
|
+
parts.push(`## EMIT TARGET: ${target.actionName}`);
|
|
133
|
+
parts.push(targetScaffolding);
|
|
134
|
+
parts.push('');
|
|
135
|
+
parts.push(`Emit ONLY \`export async function ${target.actionName}(...)\` inside one ` +
|
|
136
|
+
'```typescript code block.');
|
|
137
|
+
parts.push(`- Put any imports the function needs on single lines ABOVE it.`);
|
|
138
|
+
parts.push(`- Honour every [PRE-BAKED] snippet verbatim — do not paraphrase.`);
|
|
139
|
+
parts.push(`- Do NOT emit the other actions; they are shown for context only.`);
|
|
140
|
+
return parts.join('\n');
|
|
141
|
+
}
|
|
142
|
+
/** Pull single-line \`import ...\` statements out of an emission. The
|
|
143
|
+
* realize-emit skill convention emits single-line imports; multi-line
|
|
144
|
+
* imports (rare) are left in place and ride the post-emit tsc verifier. */
|
|
145
|
+
function extractImports(code) {
|
|
146
|
+
const imports = [];
|
|
147
|
+
const restLines = [];
|
|
148
|
+
for (const line of code.split('\n')) {
|
|
149
|
+
if (/^\s*import\s.+;?\s*$/.test(line) && line.includes('from')) {
|
|
150
|
+
imports.push(line.trim());
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
restLines.push(line);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return { imports, rest: restLines.join('\n').trim() };
|
|
157
|
+
}
|
|
158
|
+
/** Assemble the final `<Owner>.ai.ts` from per-action results: hoisted
|
|
159
|
+
* + deduped imports, then each function (real emission or γ-stub). */
|
|
160
|
+
function assembleOwnerFile(ownerName, perAction) {
|
|
161
|
+
const allImports = new Set();
|
|
162
|
+
const bodies = [];
|
|
163
|
+
for (const entry of perAction) {
|
|
164
|
+
if (entry.real) {
|
|
165
|
+
const { imports, rest } = extractImports(entry.code);
|
|
166
|
+
for (const imp of imports)
|
|
167
|
+
allImports.add(imp);
|
|
168
|
+
bodies.push(rest);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
bodies.push(entry.code);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
const header = [
|
|
175
|
+
'/**',
|
|
176
|
+
` * ${ownerName} — Per-owner AI behaviors (per-action recovery)`,
|
|
177
|
+
' *',
|
|
178
|
+
' * The whole-owner emit failed; each action below was emitted on its',
|
|
179
|
+
' * own with full owner context (Tier 2). Actions that still could not',
|
|
180
|
+
' * be emitted carry a γ-stub — the post-emit feedback loop will retry',
|
|
181
|
+
' * those (they are STUB001, auto-reemit-eligible).',
|
|
182
|
+
' *',
|
|
183
|
+
` * Generated: ${new Date().toISOString().split('T')[0]}`,
|
|
184
|
+
' */',
|
|
185
|
+
].join('\n');
|
|
186
|
+
const importBlock = [...allImports].sort().join('\n');
|
|
187
|
+
return [header, '', importBlock, importBlock ? '' : null, bodies.join('\n\n'), '']
|
|
188
|
+
.filter((s) => s !== null)
|
|
189
|
+
.join('\n');
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Build a {@link PerActionRecoveryFn}. The returned function loops over
|
|
193
|
+
* the owner's actions, emits each with full owner context, validates
|
|
194
|
+
* (structural + parse), γ-stubs the ones that fail, and assembles the
|
|
195
|
+
* owner file. Returns null only when EVERY action γ-stubbed (caller
|
|
196
|
+
* then uses the Tier 3 placeholder, which is equivalent).
|
|
197
|
+
*/
|
|
198
|
+
export function createPerActionRecovery(opts = {}) {
|
|
199
|
+
const timeoutMs = opts.timeoutMs ?? 5 * 60_000;
|
|
200
|
+
const skills = opts.skills ?? ['realize-emit'];
|
|
201
|
+
const providerId = resolveProviderId();
|
|
202
|
+
const systemPrompt = assembleSystemWithSkills('', providerId, skills);
|
|
203
|
+
const envThreshold = process.env.SPECVERSE_REALIZE_STRUCTURAL_DROP_THRESHOLD;
|
|
204
|
+
const dropThreshold = opts.dropThreshold ??
|
|
205
|
+
(envThreshold !== undefined && !Number.isNaN(parseFloat(envThreshold))
|
|
206
|
+
? parseFloat(envThreshold)
|
|
207
|
+
: DEFAULT_STRUCTURAL_DROP_THRESHOLD);
|
|
208
|
+
const callLlm = opts.generateOverride ??
|
|
209
|
+
(async (system, user) => {
|
|
210
|
+
const result = await Promise.race([
|
|
211
|
+
generateText({
|
|
212
|
+
model: opts.model,
|
|
213
|
+
prompt: user,
|
|
214
|
+
...(system ? { system } : {}),
|
|
215
|
+
}),
|
|
216
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('per-action recovery timeout')), timeoutMs)),
|
|
217
|
+
]);
|
|
218
|
+
return result.text ?? '';
|
|
219
|
+
});
|
|
220
|
+
return async (request) => {
|
|
221
|
+
const perAction = [];
|
|
222
|
+
let realCount = 0;
|
|
223
|
+
for (const action of request.actions) {
|
|
224
|
+
const user = buildActionPrompt(request, action);
|
|
225
|
+
let emitted = null;
|
|
226
|
+
try {
|
|
227
|
+
const text = await callLlm(systemPrompt, user);
|
|
228
|
+
emitted = extractTypescriptBlock(text);
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
emitted = null;
|
|
232
|
+
}
|
|
233
|
+
if (!emitted || emitted.trim().length === 0) {
|
|
234
|
+
perAction.push({ actionName: action.actionName, code: renderActionGammaStub(action.actionName), real: false });
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
// Gate 1: parse check.
|
|
238
|
+
const parseError = await parseCheckModule(emitted);
|
|
239
|
+
if (parseError !== null) {
|
|
240
|
+
if (process.env.SPECVERSE_VERBOSE) {
|
|
241
|
+
console.error(` ✗ per-action recovery parse-failed for ${request.ownerName}.${action.actionName}: ${parseError.slice(0, 160)}`);
|
|
242
|
+
}
|
|
243
|
+
perAction.push({ actionName: action.actionName, code: renderActionGammaStub(action.actionName), real: false });
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
// Gate 2: structural preservation (this action's snippets only).
|
|
247
|
+
const structural = validateLlmOutputPreservesConventions(emitted, prebakedForAction(action), dropThreshold);
|
|
248
|
+
if (structural.ok === false) {
|
|
249
|
+
if (process.env.SPECVERSE_VERBOSE) {
|
|
250
|
+
console.error(` ✗ per-action recovery structural-failed for ${request.ownerName}.${action.actionName}`);
|
|
251
|
+
}
|
|
252
|
+
perAction.push({ actionName: action.actionName, code: renderActionGammaStub(action.actionName), real: false });
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
perAction.push({ actionName: action.actionName, code: emitted, real: true });
|
|
256
|
+
realCount++;
|
|
257
|
+
}
|
|
258
|
+
// Zero real bodies → no better than the Tier 3 placeholder. Return
|
|
259
|
+
// null so the caller uses its own (reserved-word-safe) placeholder.
|
|
260
|
+
if (realCount === 0)
|
|
261
|
+
return null;
|
|
262
|
+
if (process.env.SPECVERSE_VERBOSE) {
|
|
263
|
+
console.error(` ↻ per-action recovery for ${request.ownerName}: ${realCount}/${request.actions.length} action(s) recovered`);
|
|
264
|
+
}
|
|
265
|
+
return assembleOwnerFile(request.ownerName, perAction);
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=per-action-recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"per-action-recovery.js","sourceRoot":"","sources":["../../src/realize/per-action-recovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
* `specverse-self/assets/` is searched.
|
|
30
30
|
*/
|
|
31
31
|
import { runPrompt as runPromptFn, type PromptYaml } from '../ai/prompt-runner.js';
|
|
32
|
-
import type
|
|
32
|
+
import { type ActionSpec, type MatchResult } from './owner-emit-shared.js';
|
|
33
33
|
/** One action collected for the owner. Includes step-match results
|
|
34
34
|
* so the structural validator and the prompt's per-action scaffolding
|
|
35
35
|
* can both reference them. */
|
|
@@ -110,61 +110,10 @@ export declare function createRealizeOwnerLlmEmit(opts?: CreateRealizeOwnerLlmEm
|
|
|
110
110
|
* tier search: @specverse/assets package path, engine-bundled assets,
|
|
111
111
|
* worktree-sibling specverse-self/assets. */
|
|
112
112
|
export declare function loadRealizeOwnerPromptFromFallback(): PromptYaml | null;
|
|
113
|
-
/**
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
*
|
|
118
|
-
|
|
119
|
-
* Targets supported:
|
|
120
|
-
* - "Node.js (backend)" (default) — browser globals are forbidden
|
|
121
|
-
* - "Browser (DOM)" — Node builtins are forbidden
|
|
122
|
-
* - Unknown / unset — treat as Node.js backend (the realize default)
|
|
123
|
-
*
|
|
124
|
-
* Returning an empty array means "no runtime-API rejection" — the
|
|
125
|
-
* caller skips this check entirely (test fixtures use this).
|
|
126
|
-
*/
|
|
127
|
-
export declare function forbiddenApisForRuntime(targetRuntime?: string): string[];
|
|
128
|
-
/**
|
|
129
|
-
* Scan the LLM-emitted file contents for forbidden runtime symbols.
|
|
130
|
-
* Returns the list of distinct violations found (truncated to avoid
|
|
131
|
-
* runaway output). Empty array = no violations.
|
|
132
|
-
*
|
|
133
|
-
* The scan is intentionally simple: substring presence test. False
|
|
134
|
-
* positives are rare (these symbols don't legitimately appear in
|
|
135
|
-
* backend code or vice versa) and the consequence of a false positive
|
|
136
|
-
* is one surgical retry — cheap.
|
|
137
|
-
*/
|
|
138
|
-
export declare function checkForbiddenRuntimeApis(fileContents: string, targetRuntime?: string): string[];
|
|
139
|
-
/**
|
|
140
|
-
* Build the user-prefix string for the surgical-retry call after a
|
|
141
|
-
* runtime-API violation. Frames the violation concretely so the LLM
|
|
142
|
-
* understands exactly which symbols to remove.
|
|
143
|
-
*/
|
|
144
|
-
export declare function buildRuntimeViolationCorrectionMessage(violations: string[], targetRuntime?: string): string;
|
|
145
|
-
/**
|
|
146
|
-
* Detect sibling-.ai import violations in the LLM-emitted file.
|
|
147
|
-
* Each .ai.ts file is supposed to be self-contained; importing
|
|
148
|
-
* another `<Sibling>.ai` produces TS2307 because realize emits
|
|
149
|
-
* per-action exports only, not aggregate types. The prompt's rule
|
|
150
|
-
* 2 forbids this; this validator hard-enforces it the same way
|
|
151
|
-
* `checkForbiddenRuntimeApis` enforces rule 3.
|
|
152
|
-
*
|
|
153
|
-
* Returns the list of distinct violating import specifiers
|
|
154
|
-
* (e.g. `'./GameStateService.ai'`). Empty array = no violations.
|
|
155
|
-
*/
|
|
156
|
-
export declare function checkSiblingAiImports(fileContents: string): string[];
|
|
157
|
-
/**
|
|
158
|
-
* Detect relative imports that are missing a `.js` extension.
|
|
159
|
-
* NodeNext module resolution requires explicit extensions for relative
|
|
160
|
-
* specifiers (`./foo`, `../bar`). Bare-package imports (`@prisma/client`)
|
|
161
|
-
* don't need extensions; only relative paths.
|
|
162
|
-
*
|
|
163
|
-
* Returns the list of offending specifiers (e.g. `'../services/Auth'`).
|
|
164
|
-
*/
|
|
165
|
-
export declare function checkMissingJsExtensions(fileContents: string): string[];
|
|
166
|
-
/** Surgical-retry correction message for missing-.js violations. */
|
|
167
|
-
export declare function buildExtensionCorrectionMessage(violations: string[]): string;
|
|
168
|
-
/** Surgical-retry correction message for sibling-.ai violations. */
|
|
169
|
-
export declare function buildSiblingAiCorrectionMessage(violations: string[]): string;
|
|
113
|
+
/** Build the per-action scaffolding block. One section per action,
|
|
114
|
+
* listing its steps with [PRE-BAKED] / [WRITE] markers. Exported for
|
|
115
|
+
* reuse by the realize-context-snapshot module (Phase 3 of
|
|
116
|
+
* 2026-05-13-VERIFIER-DIAGNOSTIC-TREATMENT-SPLIT) — the reemit prompt
|
|
117
|
+
* embeds the same scaffolding the original per-owner prompt used. */
|
|
118
|
+
export declare function buildPerActionScaffolding(actions: CollectedOwnerAction[]): string;
|
|
170
119
|
//# sourceMappingURL=per-owner-emit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"per-owner-emit.d.ts","sourceRoot":"","sources":["../../src/realize/per-owner-emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAOH,OAAO,EAEL,SAAS,IAAI,WAAW,EAGxB,KAAK,UAAU,EAGhB,MAAM,wBAAwB,CAAC;AAMhC,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"per-owner-emit.d.ts","sourceRoot":"","sources":["../../src/realize/per-owner-emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAOH,OAAO,EAEL,SAAS,IAAI,WAAW,EAGxB,KAAK,UAAU,EAGhB,MAAM,wBAAwB,CAAC;AAMhC,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,WAAW,EACjB,MAAM,wBAAwB,CAAC;AAUhC;;+BAE+B;AAC/B,MAAM,WAAW,oBAAoB;IACnC,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,IAAI,EAAE,UAAU,CAAC;IACjB;wEACoE;IACpE,cAAc,EAAE,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;CAC3C;AAED,gEAAgE;AAChE,MAAM,WAAW,mBAAmB;IAClC,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC;IAC9C,kEAAkE;IAClE,SAAS,EAAE,GAAG,CAAC;IACf,iEAAiE;IACjE,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,iEAAiE;IACjE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;sEAEkE;IAClE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;iDAI6C;IAC7C,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;kEAI8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qEAAqE;IACrE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;oCAEoC;AACpC,MAAM,MAAM,cAAc,GAAG,CAC3B,OAAO,EAAE,mBAAmB,KACzB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAE5B,qDAAqD;AACrD,MAAM,WAAW,gCAAgC;IAC/C,sCAAsC;IACtC,iBAAiB,CAAC,EAAE,OAAO,WAAW,CAAC;IACvC,sEAAsE;IACtE,kBAAkB,CAAC,EAAE,MAAM,UAAU,CAAC;IACtC;2CACuC;IACvC,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9D,qDAAqD;IACrD,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,GAAE,gCAAqC,GAC1C,cAAc,CA+JhB;AAwBD;;;8CAG8C;AAC9C,wBAAgB,kCAAkC,IAAI,UAAU,GAAG,IAAI,CA8DtE;AA0FD;;;;sEAIsE;AACtE,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,MAAM,CA2BjF"}
|