@hmbown/kytchen-reasoning 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.
Files changed (45) hide show
  1. package/dist/autocode.d.ts +89 -0
  2. package/dist/autocode.d.ts.map +1 -0
  3. package/dist/autocode.js +282 -0
  4. package/dist/autocode.js.map +1 -0
  5. package/dist/autocode.test.d.ts +2 -0
  6. package/dist/autocode.test.d.ts.map +1 -0
  7. package/dist/autocode.test.js +149 -0
  8. package/dist/autocode.test.js.map +1 -0
  9. package/dist/coherence.d.ts +123 -0
  10. package/dist/coherence.d.ts.map +1 -0
  11. package/dist/coherence.js +289 -0
  12. package/dist/coherence.js.map +1 -0
  13. package/dist/coherence.test.d.ts +2 -0
  14. package/dist/coherence.test.d.ts.map +1 -0
  15. package/dist/coherence.test.js +14 -0
  16. package/dist/coherence.test.js.map +1 -0
  17. package/dist/dialectic.d.ts +126 -0
  18. package/dist/dialectic.d.ts.map +1 -0
  19. package/dist/dialectic.js +317 -0
  20. package/dist/dialectic.js.map +1 -0
  21. package/dist/index.d.ts +6 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +6 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/recursive.d.ts +214 -0
  26. package/dist/recursive.d.ts.map +1 -0
  27. package/dist/recursive.js +570 -0
  28. package/dist/recursive.js.map +1 -0
  29. package/dist/recursive.test.d.ts +2 -0
  30. package/dist/recursive.test.d.ts.map +1 -0
  31. package/dist/recursive.test.js +94 -0
  32. package/dist/recursive.test.js.map +1 -0
  33. package/dist/router.d.ts +28 -0
  34. package/dist/router.d.ts.map +1 -0
  35. package/dist/router.golden.test.d.ts +2 -0
  36. package/dist/router.golden.test.d.ts.map +1 -0
  37. package/dist/router.golden.test.js +84 -0
  38. package/dist/router.golden.test.js.map +1 -0
  39. package/dist/router.js +272 -0
  40. package/dist/router.js.map +1 -0
  41. package/dist/router.test.d.ts +2 -0
  42. package/dist/router.test.d.ts.map +1 -0
  43. package/dist/router.test.js +86 -0
  44. package/dist/router.test.js.map +1 -0
  45. package/package.json +40 -0
@@ -0,0 +1,89 @@
1
+ import type { RunMode } from "@hmbown/kytchen-protocol";
2
+ import type { GenerateCallback } from "./dialectic.js";
3
+ export type AutocodeState = "idle" | "building" | "reviewing" | "refining" | "coaching" | "revising" | "done";
4
+ export interface AutocodeConfig {
5
+ maxIterations?: number;
6
+ acceptanceThreshold?: number;
7
+ /** Back-compat alias for `maxIterations`. */
8
+ maxRounds?: number;
9
+ /** Back-compat alias for `acceptanceThreshold`. */
10
+ qualityThreshold?: number;
11
+ generate?: GenerateCallback;
12
+ }
13
+ export interface AutocodeInput {
14
+ task?: string;
15
+ context?: string;
16
+ existingCode?: string;
17
+ constraints?: string[] | string;
18
+ maxIterations?: number;
19
+ /** Back-compat alias for `task`. */
20
+ goal?: string;
21
+ /** Back-compat alias for `maxIterations`. */
22
+ maxTurns?: number;
23
+ }
24
+ export interface CoachReview {
25
+ accept: boolean;
26
+ confidence: number;
27
+ issues: string[];
28
+ refinementNotes: string;
29
+ rationale: string;
30
+ score: number;
31
+ guidance: string;
32
+ }
33
+ export interface AutocodeIteration {
34
+ round: number;
35
+ playerProposal: string;
36
+ coachReview: CoachReview;
37
+ timestamp: string;
38
+ draft: string;
39
+ coachRaw: string;
40
+ review: CoachReview;
41
+ }
42
+ export type AutocodeRound = AutocodeIteration;
43
+ export interface AutocodeArtifact {
44
+ draft: string;
45
+ rounds: AutocodeIteration[];
46
+ confidence: number;
47
+ accepted: boolean;
48
+ }
49
+ export interface AutocodeSnapshot {
50
+ version: 1;
51
+ state: AutocodeState;
52
+ task: string;
53
+ context: string;
54
+ existingCode: string;
55
+ constraints: string[];
56
+ maxIterations: number;
57
+ iteration: number;
58
+ latestDraft: string | null;
59
+ latestGuidance: string | null;
60
+ latestConfidence: number;
61
+ accepted: boolean;
62
+ rounds: AutocodeIteration[];
63
+ timestamp: string;
64
+ }
65
+ export interface AutocodeResult {
66
+ proposal: string;
67
+ iterations: AutocodeIteration[];
68
+ accepted: boolean;
69
+ confidence: number;
70
+ mode: RunMode;
71
+ iterationCount: number;
72
+ /** Back-compat artifact shape consumed by current core engine. */
73
+ artifact: AutocodeArtifact;
74
+ snapshot: AutocodeSnapshot;
75
+ }
76
+ export declare function pauseAutocode(snapshot: AutocodeSnapshot): string;
77
+ export declare function resumeAutocode(serializedSnapshot: string): AutocodeSnapshot | null;
78
+ export declare class AutocodeEngine {
79
+ private readonly generate;
80
+ private readonly normalizedConfig;
81
+ constructor(config: AutocodeConfig);
82
+ isApplicable(mode: RunMode): boolean;
83
+ createSnapshot(input: AutocodeInput): AutocodeSnapshot;
84
+ pause(snapshotOrResult: AutocodeSnapshot | AutocodeResult): string;
85
+ resume(snapshotOrSerialized: AutocodeSnapshot | string): Promise<AutocodeResult>;
86
+ run(input: AutocodeInput): Promise<AutocodeResult>;
87
+ private runFromSnapshot;
88
+ }
89
+ //# sourceMappingURL=autocode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autocode.d.ts","sourceRoot":"","sources":["../src/autocode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,282 @@
1
+ function now() {
2
+ return new Date().toISOString();
3
+ }
4
+ function clamp(value, min, max) {
5
+ return Math.min(max, Math.max(min, value));
6
+ }
7
+ function toPositiveInteger(value) {
8
+ if (typeof value !== "number" || !Number.isFinite(value)) {
9
+ return undefined;
10
+ }
11
+ const rounded = Math.floor(value);
12
+ return rounded > 0 ? rounded : undefined;
13
+ }
14
+ function parseConstraints(value) {
15
+ if (!value)
16
+ return [];
17
+ if (Array.isArray(value)) {
18
+ return value.map((constraint) => String(constraint).trim()).filter((constraint) => constraint.length > 0);
19
+ }
20
+ const trimmed = value.trim();
21
+ return trimmed.length > 0 ? [trimmed] : [];
22
+ }
23
+ function normalizeConfig(config) {
24
+ const maxIterations = toPositiveInteger(config.maxIterations) ??
25
+ toPositiveInteger(config.maxRounds) ??
26
+ 3;
27
+ const thresholdRaw = typeof config.acceptanceThreshold === "number" && Number.isFinite(config.acceptanceThreshold)
28
+ ? config.acceptanceThreshold
29
+ : typeof config.qualityThreshold === "number" && Number.isFinite(config.qualityThreshold)
30
+ ? config.qualityThreshold
31
+ : 0.85;
32
+ return {
33
+ maxIterations,
34
+ acceptanceThreshold: clamp(thresholdRaw, 0, 1),
35
+ };
36
+ }
37
+ function reviewFallback(reason) {
38
+ const guidance = "Return strict JSON with fields: confidence, accept, issues, refinementNotes, rationale.";
39
+ return {
40
+ accept: false,
41
+ confidence: 0,
42
+ issues: [reason],
43
+ refinementNotes: guidance,
44
+ rationale: reason,
45
+ score: 0,
46
+ guidance,
47
+ };
48
+ }
49
+ function parseCoachReview(raw) {
50
+ const stripped = raw
51
+ .replace(/^```(?:json)?\s*/i, "")
52
+ .replace(/\s*```\s*$/, "")
53
+ .trim();
54
+ let parsed;
55
+ try {
56
+ parsed = JSON.parse(stripped);
57
+ }
58
+ catch {
59
+ return reviewFallback("Coach response was not parseable JSON.");
60
+ }
61
+ if (typeof parsed !== "object" || parsed === null) {
62
+ return reviewFallback("Coach response JSON was not an object.");
63
+ }
64
+ const record = parsed;
65
+ const confidenceValue = record["confidence"] ?? record["score"];
66
+ const acceptValue = record["accept"];
67
+ if (typeof confidenceValue !== "number" || !Number.isFinite(confidenceValue)) {
68
+ return reviewFallback("Coach response confidence must be a finite number.");
69
+ }
70
+ if (typeof acceptValue !== "boolean") {
71
+ return reviewFallback("Coach response accept must be a boolean.");
72
+ }
73
+ const issues = Array.isArray(record["issues"])
74
+ ? record["issues"]
75
+ .map((issue) => String(issue).trim())
76
+ .filter((issue) => issue.length > 0)
77
+ : [];
78
+ const refinementNotesRaw = record["refinementNotes"] ?? record["guidance"];
79
+ const rationaleRaw = record["rationale"] ?? record["guidance"];
80
+ const refinementNotes = typeof refinementNotesRaw === "string" && refinementNotesRaw.trim().length > 0
81
+ ? refinementNotesRaw.trim()
82
+ : "No refinement notes provided.";
83
+ const rationale = typeof rationaleRaw === "string" && rationaleRaw.trim().length > 0
84
+ ? rationaleRaw.trim()
85
+ : "No rationale provided.";
86
+ const normalizedConfidence = clamp(confidenceValue, 0, 1);
87
+ return {
88
+ accept: acceptValue,
89
+ confidence: normalizedConfidence,
90
+ issues,
91
+ refinementNotes,
92
+ rationale,
93
+ score: normalizedConfidence,
94
+ guidance: refinementNotes,
95
+ };
96
+ }
97
+ function playerPrompt(task, context, existingCode, constraints, previousDraft, guidance) {
98
+ const sections = [
99
+ `Task:\n${task}`,
100
+ `Context:\n${context || "(none)"}`,
101
+ ];
102
+ if (existingCode.trim().length > 0) {
103
+ sections.push(`Existing code:\n${existingCode}`);
104
+ }
105
+ if (constraints.length > 0) {
106
+ sections.push(`Constraints:\n- ${constraints.join("\n- ")}`);
107
+ }
108
+ if (previousDraft) {
109
+ sections.push(`Previous draft:\n${previousDraft}`);
110
+ }
111
+ if (guidance) {
112
+ sections.push(`Coach guidance:\n${guidance}`);
113
+ }
114
+ sections.push("Produce an improved implementation proposal. Be concrete and include code blocks when useful.");
115
+ return sections.join("\n\n");
116
+ }
117
+ function coachPrompt(task, draft) {
118
+ return [
119
+ "You are a strict code coach. Evaluate the draft against the task.",
120
+ "Return JSON only:",
121
+ '{"confidence": <0..1>, "accept": <boolean>, "issues": ["..."], "refinementNotes": "...", "rationale": "..."}',
122
+ "",
123
+ `Task:\n${task}`,
124
+ "",
125
+ `Draft:\n${draft}`,
126
+ "",
127
+ "Set accept=true only when implementation quality is production-acceptable.",
128
+ ].join("\n");
129
+ }
130
+ function playerSystemPrompt() {
131
+ return [
132
+ "You are the PLAYER in a builder-critic loop.",
133
+ "Produce implementation-oriented output that is directly actionable.",
134
+ "Address each coach issue explicitly when revising.",
135
+ ].join("\n");
136
+ }
137
+ function coachSystemPrompt() {
138
+ return [
139
+ "You are the COACH in a builder-critic loop.",
140
+ "Be strict and objective. Identify defects, missing tests, and unsafe assumptions.",
141
+ "Assess correctness, error handling, edge cases, security, and integration risk.",
142
+ "Return strict JSON only.",
143
+ ].join("\n");
144
+ }
145
+ function cloneSnapshot(snapshot) {
146
+ return JSON.parse(JSON.stringify(snapshot));
147
+ }
148
+ function isAutocodeSnapshot(value) {
149
+ if (typeof value !== "object" || value === null)
150
+ return false;
151
+ const snapshot = value;
152
+ return (snapshot["version"] === 1 &&
153
+ typeof snapshot["task"] === "string" &&
154
+ typeof snapshot["context"] === "string" &&
155
+ typeof snapshot["existingCode"] === "string" &&
156
+ Array.isArray(snapshot["constraints"]) &&
157
+ typeof snapshot["maxIterations"] === "number" &&
158
+ typeof snapshot["iteration"] === "number" &&
159
+ typeof snapshot["latestConfidence"] === "number" &&
160
+ typeof snapshot["accepted"] === "boolean" &&
161
+ Array.isArray(snapshot["rounds"]));
162
+ }
163
+ export function pauseAutocode(snapshot) {
164
+ return JSON.stringify(snapshot);
165
+ }
166
+ export function resumeAutocode(serializedSnapshot) {
167
+ try {
168
+ const parsed = JSON.parse(serializedSnapshot);
169
+ return isAutocodeSnapshot(parsed) ? parsed : null;
170
+ }
171
+ catch {
172
+ return null;
173
+ }
174
+ }
175
+ export class AutocodeEngine {
176
+ generate;
177
+ normalizedConfig;
178
+ constructor(config) {
179
+ this.normalizedConfig = normalizeConfig(config);
180
+ this.generate =
181
+ config.generate ??
182
+ (async (_system, user) => `[stub] Autocode response: ${user.slice(0, 140)}`);
183
+ }
184
+ isApplicable(mode) {
185
+ return mode === "autocode";
186
+ }
187
+ createSnapshot(input) {
188
+ const task = (input.task ?? input.goal ?? "").trim();
189
+ if (task.length === 0) {
190
+ throw new Error("AutocodeInput requires `task` (or legacy alias `goal`).");
191
+ }
192
+ const requestedIterations = toPositiveInteger(input.maxIterations) ??
193
+ toPositiveInteger(input.maxTurns) ??
194
+ this.normalizedConfig.maxIterations;
195
+ return {
196
+ version: 1,
197
+ state: "idle",
198
+ task,
199
+ context: input.context ?? "",
200
+ existingCode: input.existingCode ?? "",
201
+ constraints: parseConstraints(input.constraints),
202
+ maxIterations: Math.min(requestedIterations, this.normalizedConfig.maxIterations),
203
+ iteration: 0,
204
+ latestDraft: null,
205
+ latestGuidance: null,
206
+ latestConfidence: 0,
207
+ accepted: false,
208
+ rounds: [],
209
+ timestamp: now(),
210
+ };
211
+ }
212
+ pause(snapshotOrResult) {
213
+ const snapshot = "snapshot" in snapshotOrResult ? snapshotOrResult.snapshot : snapshotOrResult;
214
+ return pauseAutocode(snapshot);
215
+ }
216
+ async resume(snapshotOrSerialized) {
217
+ const snapshot = typeof snapshotOrSerialized === "string"
218
+ ? resumeAutocode(snapshotOrSerialized)
219
+ : snapshotOrSerialized;
220
+ if (!snapshot) {
221
+ throw new Error("Invalid autocode snapshot payload.");
222
+ }
223
+ return this.runFromSnapshot(snapshot);
224
+ }
225
+ async run(input) {
226
+ return this.runFromSnapshot(this.createSnapshot(input));
227
+ }
228
+ async runFromSnapshot(snapshot) {
229
+ const working = cloneSnapshot(snapshot);
230
+ working.timestamp = now();
231
+ while (working.iteration < working.maxIterations &&
232
+ !working.accepted) {
233
+ const round = working.iteration;
234
+ working.state = round === 0 ? "building" : "refining";
235
+ const draft = await this.generate(playerSystemPrompt(), playerPrompt(working.task, working.context, working.existingCode, working.constraints, working.latestDraft, working.latestGuidance));
236
+ working.latestDraft = draft;
237
+ working.state = "reviewing";
238
+ const coachRaw = await this.generate(coachSystemPrompt(), coachPrompt(working.task, draft));
239
+ const review = parseCoachReview(coachRaw);
240
+ working.latestGuidance = [
241
+ review.refinementNotes,
242
+ ...(review.issues.length > 0 ? [`Issues: ${review.issues.join("; ")}`] : []),
243
+ ].join("\n");
244
+ working.latestConfidence = review.confidence;
245
+ working.rounds.push({
246
+ round,
247
+ playerProposal: draft,
248
+ coachReview: review,
249
+ timestamp: now(),
250
+ // Back-compat aliases.
251
+ draft,
252
+ coachRaw,
253
+ review,
254
+ });
255
+ working.iteration += 1;
256
+ working.timestamp = now();
257
+ if (review.accept &&
258
+ review.confidence >= this.normalizedConfig.acceptanceThreshold) {
259
+ working.accepted = true;
260
+ }
261
+ }
262
+ working.state = "done";
263
+ const proposal = working.latestDraft ?? `No implementation draft produced for: ${working.task}`;
264
+ const artifact = {
265
+ draft: proposal,
266
+ rounds: working.rounds,
267
+ confidence: working.latestConfidence,
268
+ accepted: working.accepted,
269
+ };
270
+ return {
271
+ proposal,
272
+ iterations: working.rounds,
273
+ accepted: working.accepted,
274
+ confidence: working.latestConfidence,
275
+ mode: "autocode",
276
+ iterationCount: working.rounds.length,
277
+ artifact,
278
+ snapshot: working,
279
+ };
280
+ }
281
+ }
282
+ //# sourceMappingURL=autocode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autocode.js","sourceRoot":"","sources":["../src/autocode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=autocode.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autocode.test.d.ts","sourceRoot":"","sources":["../src/autocode.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,149 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { AutocodeEngine } from "./autocode.js";
4
+ test("autocode uses defensive fallback when coach response is not valid JSON", async () => {
5
+ const engine = new AutocodeEngine({
6
+ maxRounds: 1,
7
+ qualityThreshold: 0.8,
8
+ generate: async (systemPrompt) => {
9
+ if (systemPrompt.includes("COACH")) {
10
+ return "not-json";
11
+ }
12
+ return "function add(a, b) { return a + b; }";
13
+ },
14
+ });
15
+ const result = await engine.run({
16
+ goal: "Implement addition helper.",
17
+ context: "",
18
+ maxTurns: 1,
19
+ });
20
+ assert.equal(result.accepted, false);
21
+ assert.equal(result.iterations.length, 1);
22
+ assert.equal(result.artifact.accepted, false);
23
+ assert.equal(result.artifact.rounds.length, 1);
24
+ assert.equal(result.artifact.rounds[0]?.review.accept, false);
25
+ assert.equal(result.artifact.rounds[0]?.review.confidence, 0);
26
+ });
27
+ test("autocode rejects malformed coach JSON fields instead of coercing accept/score", async () => {
28
+ const engine = new AutocodeEngine({
29
+ maxIterations: 1,
30
+ acceptanceThreshold: 0.8,
31
+ generate: async (systemPrompt) => {
32
+ if (systemPrompt.includes("COACH")) {
33
+ return JSON.stringify({
34
+ confidence: "NaN",
35
+ accept: "true",
36
+ issues: [],
37
+ refinementNotes: "bad schema",
38
+ rationale: "bad schema",
39
+ });
40
+ }
41
+ return "export const value = 42;";
42
+ },
43
+ });
44
+ const result = await engine.run({
45
+ task: "Implement value export.",
46
+ maxIterations: 1,
47
+ });
48
+ assert.equal(result.accepted, false);
49
+ assert.equal(result.confidence, 0);
50
+ assert.equal(result.artifact.rounds[0]?.review.accept, false);
51
+ assert.equal(result.artifact.rounds[0]?.review.confidence, 0);
52
+ });
53
+ test("autocode accepts when modern config names meet acceptance threshold", async () => {
54
+ const engine = new AutocodeEngine({
55
+ maxIterations: 2,
56
+ acceptanceThreshold: 0.8,
57
+ generate: async (systemPrompt) => {
58
+ if (systemPrompt.includes("COACH")) {
59
+ return JSON.stringify({
60
+ confidence: 0.92,
61
+ accept: true,
62
+ issues: [],
63
+ refinementNotes: "Looks good.",
64
+ rationale: "Correct, safe, and complete.",
65
+ });
66
+ }
67
+ return "export function multiply(a: number, b: number) { return a * b; }";
68
+ },
69
+ });
70
+ const result = await engine.run({
71
+ task: "Implement a multiply helper.",
72
+ context: "TypeScript only.",
73
+ existingCode: "export const version = '1.0.0';",
74
+ constraints: ["Keep API stable", "No external dependencies"],
75
+ maxIterations: 2,
76
+ });
77
+ assert.equal(result.mode, "autocode");
78
+ assert.equal(result.accepted, true);
79
+ assert.equal(result.proposal.includes("multiply"), true);
80
+ assert.equal(result.confidence >= 0.8, true);
81
+ assert.equal(result.artifact.accepted, true);
82
+ });
83
+ test("autocode preserves legacy input aliases and artifact compatibility", async () => {
84
+ const engine = new AutocodeEngine({
85
+ maxRounds: 1,
86
+ qualityThreshold: 0.8,
87
+ generate: async (systemPrompt) => {
88
+ if (systemPrompt.includes("COACH")) {
89
+ return JSON.stringify({
90
+ confidence: 0.95,
91
+ accept: true,
92
+ issues: [],
93
+ refinementNotes: "ship it",
94
+ rationale: "Complete implementation.",
95
+ });
96
+ }
97
+ return "export function legacyPath() { return true; }";
98
+ },
99
+ });
100
+ const result = await engine.run({
101
+ goal: "Implement legacy path helper.",
102
+ context: "",
103
+ maxTurns: 1,
104
+ });
105
+ assert.equal(result.accepted, true);
106
+ assert.equal(result.artifact.draft.includes("legacyPath"), true);
107
+ assert.equal(result.iterations.length, 1);
108
+ });
109
+ test("autocode exposes pause/resume helpers via snapshots", async () => {
110
+ let coachRound = 0;
111
+ const engine = new AutocodeEngine({
112
+ maxIterations: 2,
113
+ acceptanceThreshold: 0.9,
114
+ generate: async (systemPrompt) => {
115
+ if (systemPrompt.includes("COACH")) {
116
+ coachRound += 1;
117
+ if (coachRound === 1) {
118
+ return JSON.stringify({
119
+ confidence: 0.6,
120
+ accept: false,
121
+ issues: ["Add tests"],
122
+ refinementNotes: "Improve validation coverage.",
123
+ rationale: "Coverage is insufficient for edge cases.",
124
+ });
125
+ }
126
+ return JSON.stringify({
127
+ confidence: 0.95,
128
+ accept: true,
129
+ issues: [],
130
+ refinementNotes: "Ready.",
131
+ rationale: "All criteria met.",
132
+ });
133
+ }
134
+ return coachRound === 0
135
+ ? "export function draftOne() { return 1; }"
136
+ : "export function draftTwo() { return 2; }";
137
+ },
138
+ });
139
+ const snapshot = engine.createSnapshot({
140
+ task: "Iterate until accepted.",
141
+ maxIterations: 2,
142
+ });
143
+ const paused = engine.pause(snapshot);
144
+ const resumed = await engine.resume(paused);
145
+ assert.equal(resumed.accepted, true);
146
+ assert.equal(resumed.iterations.length, 2);
147
+ assert.equal(resumed.snapshot.state, "done");
148
+ });
149
+ //# sourceMappingURL=autocode.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autocode.test.js","sourceRoot":"","sources":["../src/autocode.test.ts"],"names":[],"mappings":"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"}