@ramplab/generator 0.1.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/LICENSE +21 -0
- package/README.md +23 -0
- package/dist/agentSdkRunner.d.ts +64 -0
- package/dist/agentSdkRunner.d.ts.map +1 -0
- package/dist/agentSdkRunner.js +158 -0
- package/dist/agentSdkRunner.js.map +1 -0
- package/dist/assembleStage.d.ts +41 -0
- package/dist/assembleStage.d.ts.map +1 -0
- package/dist/assembleStage.js +33 -0
- package/dist/assembleStage.js.map +1 -0
- package/dist/authorStage.d.ts +123 -0
- package/dist/authorStage.d.ts.map +1 -0
- package/dist/authorStage.js +284 -0
- package/dist/authorStage.js.map +1 -0
- package/dist/cloneRepo.d.ts +72 -0
- package/dist/cloneRepo.d.ts.map +1 -0
- package/dist/cloneRepo.js +104 -0
- package/dist/cloneRepo.js.map +1 -0
- package/dist/flagship.d.ts +62 -0
- package/dist/flagship.d.ts.map +1 -0
- package/dist/flagship.js +216 -0
- package/dist/flagship.js.map +1 -0
- package/dist/generateLab.d.ts +151 -0
- package/dist/generateLab.d.ts.map +1 -0
- package/dist/generateLab.js +291 -0
- package/dist/generateLab.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/intake.d.ts +31 -0
- package/dist/intake.d.ts.map +1 -0
- package/dist/intake.js +45 -0
- package/dist/intake.js.map +1 -0
- package/dist/live.d.ts +2 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +213 -0
- package/dist/live.js.map +1 -0
- package/dist/mapStage.d.ts +84 -0
- package/dist/mapStage.d.ts.map +1 -0
- package/dist/mapStage.js +241 -0
- package/dist/mapStage.js.map +1 -0
- package/dist/pass1.d.ts +85 -0
- package/dist/pass1.d.ts.map +1 -0
- package/dist/pass1.js +81 -0
- package/dist/pass1.js.map +1 -0
- package/dist/pipeline.d.ts +73 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +70 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/planStage.d.ts +141 -0
- package/dist/planStage.d.ts.map +1 -0
- package/dist/planStage.js +275 -0
- package/dist/planStage.js.map +1 -0
- package/dist/progress.d.ts +45 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +2 -0
- package/dist/progress.js.map +1 -0
- package/dist/repoCommit.d.ts +41 -0
- package/dist/repoCommit.d.ts.map +1 -0
- package/dist/repoCommit.js +84 -0
- package/dist/repoCommit.js.map +1 -0
- package/dist/repoSize.d.ts +23 -0
- package/dist/repoSize.d.ts.map +1 -0
- package/dist/repoSize.js +74 -0
- package/dist/repoSize.js.map +1 -0
- package/dist/resolveAnchors.d.ts +142 -0
- package/dist/resolveAnchors.d.ts.map +1 -0
- package/dist/resolveAnchors.js +242 -0
- package/dist/resolveAnchors.js.map +1 -0
- package/dist/verifyStage.d.ts +150 -0
- package/dist/verifyStage.d.ts.map +1 -0
- package/dist/verifyStage.js +461 -0
- package/dist/verifyStage.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pass1.d.ts","sourceRoot":"","sources":["../src/pass1.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAI7C,OAAO,EAAwB,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EAA6B,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrF,OAAO,EAAe,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAsB,KAAK,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAE7E,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,MAAM,MAAM,sBAAsB,GAAG,IAAI,CACvC,iBAAiB,EACjB,MAAM,GAAG,QAAQ,GAAG,aAAa,GAAG,WAAW,CAChD,CAAC;AAEF,2EAA2E;AAC3E,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,UAAU,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,wEAAwE;IACxE,IAAI,EAAE,OAAO,CAAC;IACd,gEAAgE;IAChE,UAAU,EAAE,gBAAgB,CAAC;IAC7B,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;IAC5C,yEAAyE;IACzE,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,kDAAkD;IAClD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,yEAAyE;IACzE,MAAM,EAAE,WAAW,CAAC;IACpB;;;OAGG;IACH,SAAS,EAAE,cAAc,CAAC;CAC3B;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,sBAA2B,GAClC,OAAO,CAAC,sBAAsB,CAAC,CA2FjC"}
|
package/dist/pass1.js
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { createAgentSdkRunner } from './agentSdkRunner.js';
|
|
2
|
+
import { assembleLab } from './assembleStage.js';
|
|
3
|
+
import { runAuthorStage } from './authorStage.js';
|
|
4
|
+
import { selectFlagshipModule } from './flagship.js';
|
|
5
|
+
import { assertDirectory, sumCosts } from './generateLab.js';
|
|
6
|
+
import { runMapStage } from './mapStage.js';
|
|
7
|
+
import { resolveStageModels } from './pipeline.js';
|
|
8
|
+
import { resolveAnchors } from './resolveAnchors.js';
|
|
9
|
+
export async function generateLabPass1(repoDir, config = {}) {
|
|
10
|
+
assertDirectory(repoDir);
|
|
11
|
+
const clock = config.clock ?? Date.now;
|
|
12
|
+
const startedAtMs = clock();
|
|
13
|
+
const models = resolveStageModels(config.models);
|
|
14
|
+
const runner = config.runner ?? createAgentSdkRunner();
|
|
15
|
+
const policy = config.resolutionPolicy ?? 'drop';
|
|
16
|
+
const emit = (event) => config.onProgress?.(event);
|
|
17
|
+
const stages = [];
|
|
18
|
+
emit({ type: 'stage-started', pass: 'pass1', stage: 'map' });
|
|
19
|
+
const mapStartedMs = clock();
|
|
20
|
+
const mapResult = await runMapStage(runner, repoDir, {
|
|
21
|
+
model: models.map,
|
|
22
|
+
...(config.labId !== undefined ? { labId: config.labId } : {}),
|
|
23
|
+
...(config.maxRetries !== undefined ? { maxRetries: config.maxRetries } : {}),
|
|
24
|
+
});
|
|
25
|
+
stages.push({
|
|
26
|
+
stage: 'map',
|
|
27
|
+
durationMs: clock() - mapStartedMs,
|
|
28
|
+
...(mapResult.costUsd !== undefined ? { costUsd: mapResult.costUsd } : {}),
|
|
29
|
+
});
|
|
30
|
+
emit({ type: 'stage-completed', pass: 'pass1', stage: 'map' });
|
|
31
|
+
// The map alone is already renderable: stream it out before authoring.
|
|
32
|
+
emit({
|
|
33
|
+
type: 'spec-updated',
|
|
34
|
+
pass: 'pass1',
|
|
35
|
+
spec: resolveAnchors(mapResult.spec, repoDir, { policy }).spec,
|
|
36
|
+
});
|
|
37
|
+
// Flagship choice is mechanical (trace candidates first, intake override
|
|
38
|
+
// respected, centrality fallback) — no model call, so it costs nothing and
|
|
39
|
+
// cannot hallucinate. See flagship.ts.
|
|
40
|
+
const flagship = selectFlagshipModule(mapResult.spec, config.intake, mapResult.traceCandidates);
|
|
41
|
+
emit({ type: 'stage-started', pass: 'pass1', stage: 'author' });
|
|
42
|
+
const authorStartedMs = clock();
|
|
43
|
+
const authorResult = await runAuthorStage(runner, repoDir, {
|
|
44
|
+
model: models.author,
|
|
45
|
+
plan: { modules: [flagship.plannedModule] },
|
|
46
|
+
concurrency: 1,
|
|
47
|
+
...(config.maxRetries !== undefined ? { maxRetries: config.maxRetries } : {}),
|
|
48
|
+
onModuleAuthored: (authored) => emit({
|
|
49
|
+
type: 'module-authored',
|
|
50
|
+
pass: 'pass1',
|
|
51
|
+
moduleId: authored.module.id,
|
|
52
|
+
attempts: authored.attempts,
|
|
53
|
+
}),
|
|
54
|
+
});
|
|
55
|
+
stages.push({
|
|
56
|
+
stage: 'author',
|
|
57
|
+
durationMs: clock() - authorStartedMs,
|
|
58
|
+
...(authorResult.costUsd !== undefined ? { costUsd: authorResult.costUsd } : {}),
|
|
59
|
+
});
|
|
60
|
+
emit({ type: 'stage-completed', pass: 'pass1', stage: 'author' });
|
|
61
|
+
// "Lightly verified": assembly revalidates the merged spec and resolves
|
|
62
|
+
// every anchor; the adversarial verifier agent is pass 2's job.
|
|
63
|
+
emit({ type: 'stage-started', pass: 'pass1', stage: 'assemble' });
|
|
64
|
+
const assembleStartedMs = clock();
|
|
65
|
+
const { spec, report } = assembleLab(mapResult.spec, authorResult.modules.map((m) => m.module), repoDir, { policy, leadModuleId: flagship.plannedModule.id });
|
|
66
|
+
stages.push({ stage: 'assemble', durationMs: clock() - assembleStartedMs });
|
|
67
|
+
emit({ type: 'stage-completed', pass: 'pass1', stage: 'assemble' });
|
|
68
|
+
emit({ type: 'spec-updated', pass: 'pass1', spec });
|
|
69
|
+
return {
|
|
70
|
+
spec,
|
|
71
|
+
resolution: report,
|
|
72
|
+
models,
|
|
73
|
+
costUsd: sumCosts(mapResult.costUsd, authorResult.costUsd),
|
|
74
|
+
attempts: mapResult.attempts,
|
|
75
|
+
flagship,
|
|
76
|
+
authorAttempts: Object.fromEntries(authorResult.modules.map((m) => [m.module.id, m.attempts])),
|
|
77
|
+
timing: { startedAtMs, durationMs: clock() - startedAtMs, stages },
|
|
78
|
+
mapResult,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=pass1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pass1.js","sourceRoot":"","sources":["../src/pass1.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAuB,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAA0B,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,QAAQ,EAA0B,MAAM,kBAAkB,CAAC;AACrF,OAAO,EAAE,WAAW,EAAuB,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAA4B,MAAM,eAAe,CAAC;AAE7E,OAAO,EAAE,cAAc,EAAyB,MAAM,qBAAqB,CAAC;AAuF5E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAe,EACf,SAAiC,EAAE;IAEnC,eAAe,CAAC,OAAO,CAAC,CAAC;IAEzB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC;IACvC,MAAM,WAAW,GAAG,KAAK,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,oBAAoB,EAAE,CAAC;IACvD,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC;IACjD,MAAM,IAAI,GAAG,CAAC,KAA8B,EAAQ,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC;IAElF,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,MAAM,YAAY,GAAG,KAAK,EAAE,CAAC;IAC7B,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE;QACnD,KAAK,EAAE,MAAM,CAAC,GAAG;QACjB,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9E,CAAC,CAAC;IACH,MAAM,CAAC,IAAI,CAAC;QACV,KAAK,EAAE,KAAK;QACZ,UAAU,EAAE,KAAK,EAAE,GAAG,YAAY;QAClC,GAAG,CAAC,SAAS,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3E,CAAC,CAAC;IACH,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAE/D,uEAAuE;IACvE,IAAI,CAAC;QACH,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,cAAc,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI;KAC/D,CAAC,CAAC;IAEH,yEAAyE;IACzE,2EAA2E;IAC3E,uCAAuC;IACvC,MAAM,QAAQ,GAAG,oBAAoB,CACnC,SAAS,CAAC,IAAI,EACd,MAAM,CAAC,MAAM,EACb,SAAS,CAAC,eAAe,CAC1B,CAAC;IAEF,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChE,MAAM,eAAe,GAAG,KAAK,EAAE,CAAC;IAChC,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE;QACzD,KAAK,EAAE,MAAM,CAAC,MAAM;QACpB,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;QAC3C,WAAW,EAAE,CAAC;QACd,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,gBAAgB,EAAE,CAAC,QAAwB,EAAE,EAAE,CAC7C,IAAI,CAAC;YACH,IAAI,EAAE,iBAAiB;YACvB,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE;YAC5B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;SAC5B,CAAC;KACL,CAAC,CAAC;IACH,MAAM,CAAC,IAAI,CAAC;QACV,KAAK,EAAE,QAAQ;QACf,UAAU,EAAE,KAAK,EAAE,GAAG,eAAe;QACrC,GAAG,CAAC,YAAY,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjF,CAAC,CAAC;IACH,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAElE,wEAAwE;IACxE,gEAAgE;IAChE,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;IAClE,MAAM,iBAAiB,GAAG,KAAK,EAAE,CAAC;IAClC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CAClC,SAAS,CAAC,IAAI,EACd,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EACzC,OAAO,EACP,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,EAAE,CACpD,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,iBAAiB,EAAE,CAAC,CAAC;IAC5E,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;IACpE,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpD,OAAO;QACL,IAAI;QACJ,UAAU,EAAE,MAAM;QAClB,MAAM;QACN,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC;QAC1D,QAAQ,EAAE,SAAS,CAAC,QAAQ;QAC5B,QAAQ;QACR,cAAc,EAAE,MAAM,CAAC,WAAW,CAChC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAC3D;QACD,MAAM,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE;QAClE,SAAS;KACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pipeline plumbing shared by every generation stage (PLAN.md §4).
|
|
3
|
+
*
|
|
4
|
+
* Two concerns live here, both deliberately tiny so later slices (plan,
|
|
5
|
+
* author, verify, assemble) reuse them unchanged:
|
|
6
|
+
*
|
|
7
|
+
* - **Per-stage model configuration.** Reasoning-heavy stages default to
|
|
8
|
+
* `claude-sonnet-5`; the **map** stage defaults to Haiku (structural
|
|
9
|
+
* exploration — an A/B measured it 2× faster / 4.4× cheaper with usable
|
|
10
|
+
* quality; see `evals/results/pass1-timing.md`). Callers override per stage
|
|
11
|
+
* so validation runs can A/B alternatives (PLAN.md §10).
|
|
12
|
+
* - **The `ModelRunner` boundary.** Stage logic never talks to the Claude
|
|
13
|
+
* Agent SDK directly — it hands a `StageRequest` to an injected runner and
|
|
14
|
+
* gets text back. CI tests inject a fake runner; the live path injects
|
|
15
|
+
* `createAgentSdkRunner()`. This is the seam that keeps model calls out of
|
|
16
|
+
* CI.
|
|
17
|
+
*/
|
|
18
|
+
/** The five pipeline stages, in execution order (PLAN.md §4). */
|
|
19
|
+
export declare const GENERATION_STAGES: readonly ["map", "plan", "author", "verify", "assemble"];
|
|
20
|
+
export type GenerationStageName = (typeof GENERATION_STAGES)[number];
|
|
21
|
+
/** Default for reasoning-heavy stages: plan, author, verify, assemble (PLAN.md §10). */
|
|
22
|
+
export declare const DEFAULT_STAGE_MODEL = "claude-sonnet-5";
|
|
23
|
+
/**
|
|
24
|
+
* The map stage's default. Mapping is structural exploration + summarization,
|
|
25
|
+
* not authoring — an A/B on localsend (2026-07-09) measured Haiku 2× faster
|
|
26
|
+
* and 4.4× cheaper here with usable quality, while authoring quality visibly
|
|
27
|
+
* dropped on Haiku (see `evals/results/pass1-timing.md`). The map also streams
|
|
28
|
+
* first, so this is the lever that pulls first-paint toward the 3–5 min target.
|
|
29
|
+
*/
|
|
30
|
+
export declare const MAP_STAGE_MODEL = "claude-haiku-4-5-20251001";
|
|
31
|
+
/** Per-stage model overrides; omitted stages fall back to the stage default. */
|
|
32
|
+
export type StageModelConfig = Partial<Record<GenerationStageName, string>>;
|
|
33
|
+
/**
|
|
34
|
+
* Expand a (possibly partial) per-stage model map into a complete one: every
|
|
35
|
+
* stage present, defaulting per {@link STAGE_DEFAULT_MODELS} (Haiku map,
|
|
36
|
+
* Sonnet elsewhere), with explicit overrides honored verbatim.
|
|
37
|
+
*/
|
|
38
|
+
export declare function resolveStageModels(overrides?: StageModelConfig): Record<GenerationStageName, string>;
|
|
39
|
+
/** One request across the model boundary: everything a runner needs. */
|
|
40
|
+
export interface StageRequest {
|
|
41
|
+
stage: GenerationStageName;
|
|
42
|
+
/** Model id for this stage, already resolved through the config map. */
|
|
43
|
+
model: string;
|
|
44
|
+
/** The repository being analyzed — a plain local directory. */
|
|
45
|
+
repoDir: string;
|
|
46
|
+
/** Full instructions for the agent, including the output contract. */
|
|
47
|
+
prompt: string;
|
|
48
|
+
/** 1-based attempt counter; > 1 means this is a retry after invalid output. */
|
|
49
|
+
attempt: number;
|
|
50
|
+
}
|
|
51
|
+
/** What comes back across the boundary. */
|
|
52
|
+
export interface StageResponse {
|
|
53
|
+
/** The agent's final text output (expected to contain JSON). */
|
|
54
|
+
output: string;
|
|
55
|
+
/** Cost of this call in USD, when the runner can report it. */
|
|
56
|
+
costUsd?: number;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* The injectable agent-invocation boundary. Implementations:
|
|
60
|
+
* - `createAgentSdkRunner()` — the real Claude Agent SDK (live runs),
|
|
61
|
+
* - fakes/recordings in tests (no API calls in CI).
|
|
62
|
+
*/
|
|
63
|
+
export interface ModelRunner {
|
|
64
|
+
runStage(request: StageRequest): Promise<StageResponse>;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Run `fn` over `items` with at most `limit` promises in flight: a fixed
|
|
68
|
+
* pool of workers pulls the next index until the list is exhausted, and
|
|
69
|
+
* `Promise.all` joins the pool. Results keep input order. Shared by every
|
|
70
|
+
* fan-out stage (author, verify).
|
|
71
|
+
*/
|
|
72
|
+
export declare function mapWithConcurrency<T, R>(items: readonly T[], limit: number, fn: (item: T) => Promise<R>): Promise<R[]>;
|
|
73
|
+
//# sourceMappingURL=pipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,iEAAiE;AACjE,eAAO,MAAM,iBAAiB,0DAA2D,CAAC;AAE1F,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAErE,wFAAwF;AACxF,eAAO,MAAM,mBAAmB,oBAAoB,CAAC;AAErD;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,8BAA8B,CAAC;AAW3D,gFAAgF;AAChF,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC;AAE5E;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,GAAE,gBAAqB,GAC/B,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAMrC;AAED,wEAAwE;AACxE,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,mBAAmB,CAAC;IAC3B,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,2CAA2C;AAC3C,MAAM,WAAW,aAAa;IAC5B,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACzD;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAC3C,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,CAAC,EAAE,CAAC,CAed"}
|
package/dist/pipeline.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pipeline plumbing shared by every generation stage (PLAN.md §4).
|
|
3
|
+
*
|
|
4
|
+
* Two concerns live here, both deliberately tiny so later slices (plan,
|
|
5
|
+
* author, verify, assemble) reuse them unchanged:
|
|
6
|
+
*
|
|
7
|
+
* - **Per-stage model configuration.** Reasoning-heavy stages default to
|
|
8
|
+
* `claude-sonnet-5`; the **map** stage defaults to Haiku (structural
|
|
9
|
+
* exploration — an A/B measured it 2× faster / 4.4× cheaper with usable
|
|
10
|
+
* quality; see `evals/results/pass1-timing.md`). Callers override per stage
|
|
11
|
+
* so validation runs can A/B alternatives (PLAN.md §10).
|
|
12
|
+
* - **The `ModelRunner` boundary.** Stage logic never talks to the Claude
|
|
13
|
+
* Agent SDK directly — it hands a `StageRequest` to an injected runner and
|
|
14
|
+
* gets text back. CI tests inject a fake runner; the live path injects
|
|
15
|
+
* `createAgentSdkRunner()`. This is the seam that keeps model calls out of
|
|
16
|
+
* CI.
|
|
17
|
+
*/
|
|
18
|
+
/** The five pipeline stages, in execution order (PLAN.md §4). */
|
|
19
|
+
export const GENERATION_STAGES = ['map', 'plan', 'author', 'verify', 'assemble'];
|
|
20
|
+
/** Default for reasoning-heavy stages: plan, author, verify, assemble (PLAN.md §10). */
|
|
21
|
+
export const DEFAULT_STAGE_MODEL = 'claude-sonnet-5';
|
|
22
|
+
/**
|
|
23
|
+
* The map stage's default. Mapping is structural exploration + summarization,
|
|
24
|
+
* not authoring — an A/B on localsend (2026-07-09) measured Haiku 2× faster
|
|
25
|
+
* and 4.4× cheaper here with usable quality, while authoring quality visibly
|
|
26
|
+
* dropped on Haiku (see `evals/results/pass1-timing.md`). The map also streams
|
|
27
|
+
* first, so this is the lever that pulls first-paint toward the 3–5 min target.
|
|
28
|
+
*/
|
|
29
|
+
export const MAP_STAGE_MODEL = 'claude-haiku-4-5-20251001';
|
|
30
|
+
/** Per-stage default models — Haiku for map, Sonnet everywhere else. */
|
|
31
|
+
const STAGE_DEFAULT_MODELS = {
|
|
32
|
+
map: MAP_STAGE_MODEL,
|
|
33
|
+
plan: DEFAULT_STAGE_MODEL,
|
|
34
|
+
author: DEFAULT_STAGE_MODEL,
|
|
35
|
+
verify: DEFAULT_STAGE_MODEL,
|
|
36
|
+
assemble: DEFAULT_STAGE_MODEL,
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Expand a (possibly partial) per-stage model map into a complete one: every
|
|
40
|
+
* stage present, defaulting per {@link STAGE_DEFAULT_MODELS} (Haiku map,
|
|
41
|
+
* Sonnet elsewhere), with explicit overrides honored verbatim.
|
|
42
|
+
*/
|
|
43
|
+
export function resolveStageModels(overrides = {}) {
|
|
44
|
+
const resolved = {};
|
|
45
|
+
for (const stage of GENERATION_STAGES) {
|
|
46
|
+
resolved[stage] = overrides[stage] ?? STAGE_DEFAULT_MODELS[stage];
|
|
47
|
+
}
|
|
48
|
+
return resolved;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Run `fn` over `items` with at most `limit` promises in flight: a fixed
|
|
52
|
+
* pool of workers pulls the next index until the list is exhausted, and
|
|
53
|
+
* `Promise.all` joins the pool. Results keep input order. Shared by every
|
|
54
|
+
* fan-out stage (author, verify).
|
|
55
|
+
*/
|
|
56
|
+
export async function mapWithConcurrency(items, limit, fn) {
|
|
57
|
+
const results = new Array(items.length);
|
|
58
|
+
let nextIndex = 0;
|
|
59
|
+
const workers = Array.from({ length: Math.min(limit, items.length) }, async () => {
|
|
60
|
+
while (true) {
|
|
61
|
+
const index = nextIndex++;
|
|
62
|
+
if (index >= items.length)
|
|
63
|
+
return;
|
|
64
|
+
results[index] = await fn(items[index]);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
await Promise.all(workers);
|
|
68
|
+
return results;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,iEAAiE;AACjE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAU,CAAC;AAI1F,wFAAwF;AACxF,MAAM,CAAC,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAErD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,2BAA2B,CAAC;AAE3D,wEAAwE;AACxE,MAAM,oBAAoB,GAAwC;IAChE,GAAG,EAAE,eAAe;IACpB,IAAI,EAAE,mBAAmB;IACzB,MAAM,EAAE,mBAAmB;IAC3B,MAAM,EAAE,mBAAmB;IAC3B,QAAQ,EAAE,mBAAmB;CAC9B,CAAC;AAKF;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,YAA8B,EAAE;IAEhC,MAAM,QAAQ,GAAG,EAAyC,CAAC;IAC3D,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE,CAAC;QACtC,QAAQ,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAgCD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAmB,EACnB,KAAa,EACb,EAA2B;IAE3B,MAAM,OAAO,GAAG,IAAI,KAAK,CAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CACxB,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EACzC,KAAK,IAAmB,EAAE;QACxB,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;YAC1B,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM;gBAAE,OAAO;YAClC,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAM,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CACF,CAAC;IACF,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3B,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { type LabSpec } from '@ramplab/spec';
|
|
3
|
+
import { type LeadIntake } from './intake.js';
|
|
4
|
+
import type { ModelRunner } from './pipeline.js';
|
|
5
|
+
/**
|
|
6
|
+
* The curriculum-plan stage (PLAN.md §4, pass 2): given the map-stage output
|
|
7
|
+
* (the system map is the model's index of the repo's subsystems), an agent
|
|
8
|
+
* plans the lab as a **journey, not a survey** (issue #18). The curriculum
|
|
9
|
+
* contract, enforced by the parse gate where it can be mechanical:
|
|
10
|
+
*
|
|
11
|
+
* - **Module 1 is an end-to-end trace** of one front-door user action. When
|
|
12
|
+
* the flagship trace was already selected (see `flagship.ts`), the plan's
|
|
13
|
+
* first module must carry its id, and its title/focus are canonicalized
|
|
14
|
+
* from the selection after parsing — pass 2's re-authoring of the pass-1
|
|
15
|
+
* preview stays canonical instead of re-negotiated per run.
|
|
16
|
+
* - **Dependency order, concrete to abstract**: each module relies only on
|
|
17
|
+
* what earlier modules taught.
|
|
18
|
+
* - **The learner-state ledger**: every planned module declares `assumes`
|
|
19
|
+
* (what the learner knows on arrival) and `teaches` (what it adds). The
|
|
20
|
+
* author stage hands each parallel author its slice, buying narrative
|
|
21
|
+
* continuity without serializing the fan-out.
|
|
22
|
+
* - **The final module is always "your first contribution"** (id
|
|
23
|
+
* `first-contribution`): starter areas, test conventions, CI gates, PR
|
|
24
|
+
* norms — thin if the repo's material is thin, never fabricated.
|
|
25
|
+
*
|
|
26
|
+
* The plan is **pipeline-internal state** — it never appears in a lab spec,
|
|
27
|
+
* so its schema lives here, not in `@ramplab/spec`. Downstream, the author
|
|
28
|
+
* stage fans out one agent per planned module and the assemble stage merges
|
|
29
|
+
* the authored modules in plan order.
|
|
30
|
+
*
|
|
31
|
+
* Budget semantics: the cap is a **config property, not a repo property**.
|
|
32
|
+
* The prompt asks for at most `budget.maxModules` modules; if the model
|
|
33
|
+
* over-delivers anyway, the plan is truncated to the cap after validation.
|
|
34
|
+
* Truncation drops modules from the end of the middle: the opening trace
|
|
35
|
+
* and the landing `first-contribution` module always survive, because they
|
|
36
|
+
* are curriculum invariants, not centrality picks.
|
|
37
|
+
*/
|
|
38
|
+
/** Default cap on planned modules when the config does not set one. */
|
|
39
|
+
export declare const DEFAULT_MAX_MODULES = 6;
|
|
40
|
+
/** The centrality budget: caps scope by config, never by repo size. */
|
|
41
|
+
export interface CurriculumBudget {
|
|
42
|
+
/**
|
|
43
|
+
* Hard cap on the number of authored modules (the map stage's overview
|
|
44
|
+
* module is not counted against it).
|
|
45
|
+
* @default 6
|
|
46
|
+
*/
|
|
47
|
+
maxModules?: number;
|
|
48
|
+
/**
|
|
49
|
+
* Free-form scope steering from the lead's intake ("focus on billing",
|
|
50
|
+
* "skip the legacy importer"). Injected into the plan prompt verbatim.
|
|
51
|
+
*/
|
|
52
|
+
scopeHints?: string[];
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* The mandated landing module (issue #18): every curriculum ends with "your
|
|
56
|
+
* first contribution" under this id, so its presence is a mechanical check.
|
|
57
|
+
*/
|
|
58
|
+
export declare const LANDING_MODULE_ID = "first-contribution";
|
|
59
|
+
/**
|
|
60
|
+
* Internal Zod schema for one planned module. Deliberately NOT part of
|
|
61
|
+
* `@ramplab/spec`: the plan (including the learner-state ledger) is an
|
|
62
|
+
* intermediate artifact between stages and never reaches the lab spec.
|
|
63
|
+
*/
|
|
64
|
+
export declare const plannedModuleSchema: z.ZodObject<{
|
|
65
|
+
id: z.ZodString;
|
|
66
|
+
title: z.ZodString;
|
|
67
|
+
focus: z.ZodString;
|
|
68
|
+
keyFiles: z.ZodArray<z.ZodString>;
|
|
69
|
+
assumes: z.ZodArray<z.ZodString>;
|
|
70
|
+
teaches: z.ZodArray<z.ZodString>;
|
|
71
|
+
}, z.core.$strip>;
|
|
72
|
+
export declare const curriculumPlanSchema: z.ZodObject<{
|
|
73
|
+
modules: z.ZodArray<z.ZodObject<{
|
|
74
|
+
id: z.ZodString;
|
|
75
|
+
title: z.ZodString;
|
|
76
|
+
focus: z.ZodString;
|
|
77
|
+
keyFiles: z.ZodArray<z.ZodString>;
|
|
78
|
+
assumes: z.ZodArray<z.ZodString>;
|
|
79
|
+
teaches: z.ZodArray<z.ZodString>;
|
|
80
|
+
}, z.core.$strip>>;
|
|
81
|
+
}, z.core.$strip>;
|
|
82
|
+
export type PlannedModule = z.infer<typeof plannedModuleSchema>;
|
|
83
|
+
export type CurriculumPlan = z.infer<typeof curriculumPlanSchema>;
|
|
84
|
+
export interface PlanStageOptions {
|
|
85
|
+
model: string;
|
|
86
|
+
/** The map-stage output — its system map seeds the centrality ranking. */
|
|
87
|
+
mapSpec: LabSpec;
|
|
88
|
+
budget?: CurriculumBudget;
|
|
89
|
+
/**
|
|
90
|
+
* The lead's intake answers (PLAN.md §4 curation loop). Rendered into the
|
|
91
|
+
* plan prompt so they steer module selection and ordering.
|
|
92
|
+
*/
|
|
93
|
+
intake?: LeadIntake;
|
|
94
|
+
/**
|
|
95
|
+
* The flagship trace module selected in `flagship.ts` (pass 1's preview
|
|
96
|
+
* module). When present, the plan's first module must carry this id (parse
|
|
97
|
+
* gate) and its title/focus are canonicalized from it after parsing, so
|
|
98
|
+
* pass 2 re-authors the same trace the learner previewed in pass 1. Absent
|
|
99
|
+
* when the map yielded no usable trace candidates — the prompt then asks
|
|
100
|
+
* the planner to pick its own front-door action for module 1.
|
|
101
|
+
*/
|
|
102
|
+
traceModule?: PlannedModule;
|
|
103
|
+
/**
|
|
104
|
+
* How many times to re-prompt after schema-invalid output.
|
|
105
|
+
* @default 1
|
|
106
|
+
*/
|
|
107
|
+
maxRetries?: number;
|
|
108
|
+
}
|
|
109
|
+
export interface PlanStageResult {
|
|
110
|
+
/** Validated plan, ordered most-central-first, capped at the budget. */
|
|
111
|
+
plan: CurriculumPlan;
|
|
112
|
+
/** Total attempts made (1 = no retry needed). */
|
|
113
|
+
attempts: number;
|
|
114
|
+
/** Summed cost across attempts, if the runner reports cost. */
|
|
115
|
+
costUsd: number | undefined;
|
|
116
|
+
}
|
|
117
|
+
/** Raised when the model's output stays schema-invalid after all retries. */
|
|
118
|
+
export declare class PlanStageError extends Error {
|
|
119
|
+
readonly attempts: number;
|
|
120
|
+
readonly lastFailure: string;
|
|
121
|
+
constructor(attempts: number, lastFailure: string);
|
|
122
|
+
}
|
|
123
|
+
export declare function runPlanStage(runner: ModelRunner, repoDir: string, options: PlanStageOptions): Promise<PlanStageResult>;
|
|
124
|
+
type ParseOutcome = {
|
|
125
|
+
ok: true;
|
|
126
|
+
plan: CurriculumPlan;
|
|
127
|
+
} | {
|
|
128
|
+
ok: false;
|
|
129
|
+
failure: string;
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* The parse gate: schema validation (ledger fields, landing module, ids)
|
|
133
|
+
* plus the flagship-trace contract when a trace module was pre-selected —
|
|
134
|
+
* the first module must carry the trace's id, and its title/focus are then
|
|
135
|
+
* overwritten with the canonical selection so the trace's identity is owned
|
|
136
|
+
* by flagship selection, not re-negotiated by the planner. The planner still
|
|
137
|
+
* owns the trace module's keyFiles (it explored the repo) and its ledger.
|
|
138
|
+
*/
|
|
139
|
+
export declare function parsePlan(output: string, traceModule?: PlannedModule): ParseOutcome;
|
|
140
|
+
export {};
|
|
141
|
+
//# sourceMappingURL=planStage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planStage.d.ts","sourceRoot":"","sources":["../src/planStage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAY,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAuB,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAEnE,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,eAAe,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,uEAAuE;AACvE,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,uEAAuE;AACvE,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAKD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,uBAAuB,CAAC;AAEtD;;;;GAIG;AACH,eAAO,MAAM,mBAAmB;;;;;;;iBAiB9B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;iBAiC7B,CAAC;AAEL,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B;;;OAGG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,wEAAwE;IACxE,IAAI,EAAE,cAAc,CAAC;IACrB,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AAED,6EAA6E;AAC7E,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAEjB,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;CASlD;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CAsC1B;AAeD,KAAK,YAAY,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,cAAc,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAExF;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,aAAa,GAAG,YAAY,CAuBnF"}
|