@xom11/whiteboard 0.24.1 → 0.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +85 -12
- package/dist/ai.d.mts +472 -0
- package/dist/ai.d.ts +472 -0
- package/dist/ai.js +2156 -0
- package/dist/ai.js.map +1 -0
- package/dist/ai.mjs +1495 -0
- package/dist/ai.mjs.map +1 -0
- package/dist/catalog.json +4 -4
- package/dist/chunk-73Q7ADVL.mjs +35 -0
- package/dist/chunk-73Q7ADVL.mjs.map +1 -0
- package/dist/{chunk-BKSXPNPQ.mjs → chunk-AYSFWUPK.mjs} +4 -3
- package/dist/chunk-AYSFWUPK.mjs.map +1 -0
- package/dist/chunk-B4NJJZFR.mjs +18 -0
- package/dist/chunk-B4NJJZFR.mjs.map +1 -0
- package/dist/{chunk-LVNCYP4J.mjs → chunk-CJBLJUWG.mjs} +5 -5
- package/dist/{chunk-LVNCYP4J.mjs.map → chunk-CJBLJUWG.mjs.map} +1 -1
- package/dist/{chunk-YIPI3WUL.mjs → chunk-ESVPQWHX.mjs} +5 -5
- package/dist/{chunk-YIPI3WUL.mjs.map → chunk-ESVPQWHX.mjs.map} +1 -1
- package/dist/{chunk-IBTRMWD6.mjs → chunk-I24QOHPU.mjs} +3 -3
- package/dist/{chunk-IBTRMWD6.mjs.map → chunk-I24QOHPU.mjs.map} +1 -1
- package/dist/{chunk-ZBJBQKJ2.mjs → chunk-IHUFOV7L.mjs} +4 -19
- package/dist/chunk-IHUFOV7L.mjs.map +1 -0
- package/dist/{chunk-AZIARTGX.mjs → chunk-M42TGYT6.mjs} +3 -3
- package/dist/{chunk-AZIARTGX.mjs.map → chunk-M42TGYT6.mjs.map} +1 -1
- package/dist/{chunk-WWMQ2VHZ.mjs → chunk-NDEZJKNY.mjs} +4 -4
- package/dist/{chunk-WWMQ2VHZ.mjs.map → chunk-NDEZJKNY.mjs.map} +1 -1
- package/dist/{chunk-CSCF3YFZ.mjs → chunk-ONBCUWVI.mjs} +6 -4
- package/dist/chunk-ONBCUWVI.mjs.map +1 -0
- package/dist/{chunk-6V4SH4JJ.mjs → chunk-REIJZDVZ.mjs} +6 -35
- package/dist/chunk-REIJZDVZ.mjs.map +1 -0
- package/dist/{chunk-4D5CSIJO.mjs → chunk-TB4CL25L.mjs} +10 -8
- package/dist/chunk-TB4CL25L.mjs.map +1 -0
- package/dist/chunk-VNCCIV6O.mjs +938 -0
- package/dist/chunk-VNCCIV6O.mjs.map +1 -0
- package/dist/{chunk-MFOGFFIL.mjs → chunk-VRHWDZ66.mjs} +6 -5
- package/dist/chunk-VRHWDZ66.mjs.map +1 -0
- package/dist/{chunk-CRAPWQKJ.mjs → chunk-YSJOVBCD.mjs} +4 -4
- package/dist/{chunk-CRAPWQKJ.mjs.map → chunk-YSJOVBCD.mjs.map} +1 -1
- package/dist/geometry-2d.d.mts +2 -1
- package/dist/geometry-2d.d.ts +2 -1
- package/dist/geometry-2d.js +1383 -23
- package/dist/geometry-2d.js.map +1 -1
- package/dist/geometry-2d.mjs +7 -5
- package/dist/geometry-3d.d.mts +2 -1
- package/dist/geometry-3d.d.ts +2 -1
- package/dist/geometry-3d.js +2 -2
- package/dist/geometry-3d.js.map +1 -1
- package/dist/geometry-3d.mjs +6 -4
- package/dist/graph-2d.d.mts +2 -1
- package/dist/graph-2d.d.ts +2 -1
- package/dist/graph-2d.js +2 -2
- package/dist/graph-2d.js.map +1 -1
- package/dist/graph-2d.mjs +9 -7
- package/dist/{host-TLIXN4CF.mjs → host-A64ITWVX.mjs} +8 -6
- package/dist/host-A64ITWVX.mjs.map +1 -0
- package/dist/{host-DOAYVL35.mjs → host-L7FMFZUW.mjs} +228 -30
- package/dist/host-L7FMFZUW.mjs.map +1 -0
- package/dist/{host-GKNQBBUE.mjs → host-QK53UYMD.mjs} +12 -10
- package/dist/host-QK53UYMD.mjs.map +1 -0
- package/dist/index.d.mts +4 -616
- package/dist/index.d.ts +4 -616
- package/dist/index.js +8889 -8529
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +21 -1012
- package/dist/index.mjs.map +1 -1
- package/dist/latex.d.mts +2 -1
- package/dist/latex.d.ts +2 -1
- package/dist/render-3WTY7NZB.mjs +9 -0
- package/dist/{render-SA4JTOW3.mjs.map → render-3WTY7NZB.mjs.map} +1 -1
- package/dist/serialize-SRJVKYUG.mjs +8 -0
- package/dist/{serialize-3NZS6A6Q.mjs.map → serialize-SRJVKYUG.mjs.map} +1 -1
- package/dist/{types-rA4slL08.d.ts → types-DWRyCa2m.d.mts} +139 -1
- package/dist/{types-rA4slL08.d.mts → types-DWRyCa2m.d.ts} +139 -1
- package/package.json +6 -1
- package/dist/chunk-4D5CSIJO.mjs.map +0 -1
- package/dist/chunk-6V4SH4JJ.mjs.map +0 -1
- package/dist/chunk-BKSXPNPQ.mjs.map +0 -1
- package/dist/chunk-CSCF3YFZ.mjs.map +0 -1
- package/dist/chunk-MFOGFFIL.mjs.map +0 -1
- package/dist/chunk-ZBJBQKJ2.mjs.map +0 -1
- package/dist/host-DOAYVL35.mjs.map +0 -1
- package/dist/host-GKNQBBUE.mjs.map +0 -1
- package/dist/host-TLIXN4CF.mjs.map +0 -1
- package/dist/render-SA4JTOW3.mjs +0 -8
- package/dist/serialize-3NZS6A6Q.mjs +0 -6
package/dist/ai.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/stamps/geometry-2d/dsl/names.ts","../src/stamps/geometry-2d/dsl/kinds/_types.ts","../src/stamps/geometry-2d/dsl/kinds/_shared.ts","../src/stamps/geometry-2d/dsl/kinds/points/free.ts","../src/stamps/geometry-2d/dsl/kinds/points/midpoint.ts","../src/stamps/geometry-2d/dsl/kinds/points/onSegment.ts","../src/stamps/geometry-2d/dsl/kinds/points/onLine.ts","../src/stamps/geometry-2d/dsl/kinds/points/onCircle.ts","../src/stamps/geometry-2d/dsl/kinds/points/perpFoot.ts","../src/stamps/geometry-2d/dsl/kinds/points/circumcenter.ts","../src/stamps/geometry-2d/dsl/kinds/points/incenter.ts","../src/stamps/geometry-2d/dsl/kinds/points/centroid.ts","../src/stamps/geometry-2d/dsl/kinds/points/orthocenter.ts","../src/stamps/geometry-2d/dsl/kinds/points/intersection.ts","../src/stamps/geometry-2d/dsl/kinds/lines/segment.ts","../src/stamps/geometry-2d/dsl/kinds/lines/line.ts","../src/stamps/geometry-2d/dsl/kinds/lines/ray.ts","../src/stamps/geometry-2d/dsl/kinds/lines/perpendicular.ts","../src/stamps/geometry-2d/dsl/kinds/lines/parallel.ts","../src/stamps/geometry-2d/dsl/kinds/lines/perpBisector.ts","../src/stamps/geometry-2d/dsl/kinds/lines/angleBisector.ts","../src/stamps/geometry-2d/dsl/kinds/lines/tangent.ts","../src/stamps/geometry-2d/dsl/kinds/polygons/polygon.ts","../src/stamps/geometry-2d/dsl/kinds/circles/circleCP.ts","../src/stamps/geometry-2d/dsl/kinds/circles/circle3.ts","../src/stamps/geometry-2d/dsl/registry.ts","../src/stamps/geometry-2d/dsl/schema.ts","../src/core/scene/types.ts","../src/stamps/geometry-2d/dsl/transpile/errors.ts","../src/stamps/geometry-2d/dsl/transpile/symbols.ts","../src/stamps/geometry-2d/dsl/transpile/refs.ts","../src/stamps/geometry-2d/dsl/transpile/cycles.ts","../src/stamps/geometry-2d/dsl/transpile/ids.ts","../src/stamps/geometry-2d/dsl/transpile.ts","../src/stamps/geometry-2d/ai/envelope.ts","../src/stamps/geometry-2d/dsl/fixtures/triangle-equilateral.ts","../src/stamps/geometry-2d/dsl/fixtures/triangle-median.ts","../src/stamps/geometry-2d/dsl/fixtures/triangle-altitude.ts","../src/stamps/geometry-2d/dsl/fixtures/triangle-centroid.ts","../src/stamps/geometry-2d/dsl/fixtures/triangle-orthocenter.ts","../src/stamps/geometry-2d/dsl/fixtures/triangle-circumcircle.ts","../src/stamps/geometry-2d/dsl/fixtures/triangle-incircle.ts","../src/stamps/geometry-2d/dsl/fixtures/parallelogram.ts","../src/stamps/geometry-2d/dsl/fixtures/two-circles-intersect.ts","../src/stamps/geometry-2d/dsl/fixtures/triangle-angle-bisector.ts","../src/stamps/geometry-2d/dsl/fixtures/triangle-median-altitude.ts","../src/stamps/geometry-2d/dsl/fixtures/trapezoid.ts","../src/stamps/geometry-2d/dsl/fixtures/rhombus.ts","../src/stamps/geometry-2d/dsl/fixtures/right-triangle-altitude.ts","../src/stamps/geometry-2d/dsl/fixtures/tangent-from-point.ts","../src/stamps/geometry-2d/dsl/fixtures/internal-external-bisector.ts","../src/stamps/geometry-2d/ai/prompt.ts","../src/stamps/geometry-2d/ai/providers/anthropic.ts","../src/stamps/geometry-2d/ai/providers/ollama.ts","../src/stamps/geometry-2d/ai/providers/index.ts","../src/stamps/geometry-2d/ai/buildFigure.ts","../src/stamps/geometry-2d/ai/handleGenerateFigure.ts","../src/stamps/geometry-2d/ai/refineEnvelope.ts","../src/stamps/geometry-2d/ai/refineFixtures.ts","../src/stamps/geometry-2d/ai/refinePrompt.ts","../src/stamps/geometry-2d/ai/buildFigureDelta.ts","../src/stamps/geometry-2d/ai/handleGenerateFigureDelta.ts"],"names":["z","zodToJsonSchema","fixture","Anthropic","toUsage","DEFAULT_MAX_TOKENS","tResult","DEFAULT_MAX_ATTEMPTS","clampAttempts","mapErrorToUi"],"mappings":"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","file":"ai.js","sourcesContent":["// src/stamps/geometry-2d/dsl/names.ts\nimport { z } from 'zod';\n\n// Label-style name: chữ cái Latin đầu, cho phép unicode prime (') + subscript ₀-₉.\n// Max length 12 ký tự. Phân biệt hoa/thường.\nexport const NameZ = z\n .string()\n .regex(/^[A-Za-z][A-Za-z0-9_'₀-₉]{0,11}$/);\n","// src/stamps/geometry-2d/dsl/kinds/_types.ts\nimport type { z } from 'zod';\nimport type { SceneObject } from '../../../../core/scene/types';\n\nexport type KindRole =\n | 'point'\n | 'segment'\n | 'line'\n | 'ray'\n | 'lineConstruction'\n | 'circle'\n | 'polygon';\n\nexport type KindCategory = 'points' | 'lines' | 'polygons' | 'circles' | 'compound';\n\nexport interface EmitContext {\n /** Look up the scene-object id assigned to a DSL symbol name. */\n resolveId(name: string): string;\n /** Hint lookup for intersection-style emit needing to know what a referenced symbol is. */\n hintOf(name: string): KindRole;\n /** Generate a unique auxiliary id for an internal entity (not addressable from DSL). */\n mintAuxId(parentName: string, suffix: string): string;\n}\n\nexport interface EmittedEntity {\n /** The first emitted entity per kind MUST have role 'primary'. */\n role: 'primary' | 'auxiliary';\n object: SceneObject;\n}\n\nexport interface DslKindModule<TKind extends string = string, TInput = unknown> {\n kind: TKind;\n role: KindRole;\n category: KindCategory;\n prefix: string;\n schema: z.ZodObject<any>;\n collectRefs: (entity: TInput) => string[];\n emit: (entity: TInput, ctx: EmitContext) => EmittedEntity[];\n}\n\n/**\n * Factory that widens a typed module into the registry's generic shape.\n * Each kind module exports its module via this factory so `ALL_MODULES`\n * in registry.ts can be typed as ReadonlyArray<DslKindModule> without a cast.\n */\nexport function defineModule<TKind extends string, TInput>(\n m: DslKindModule<TKind, TInput>,\n): DslKindModule {\n return m as DslKindModule;\n}\n","// src/stamps/geometry-2d/dsl/kinds/_shared.ts\nimport type { SceneObject } from '../../../../core/scene/types';\nimport type { EmitContext } from './_types';\n\nexport const POINT_BASE_FIELDS = {\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n} as const;\n\n/** Wrap a Constraint2D-style attrs into a primary 'point' SceneObject. */\nexport function emitPointObject(\n id: string,\n name: string,\n constraint: Record<string, unknown>,\n): SceneObject {\n return {\n id,\n kind: 'point',\n label: name,\n ...POINT_BASE_FIELDS,\n attrs: { constraint },\n };\n}\n\n/** Resolve a triangle's 3 vertex ids. */\nexport function resolveTriangleVertices(\n ctx: EmitContext,\n vertices: readonly [string, string, string],\n): [string, string, string] {\n return [ctx.resolveId(vertices[0]), ctx.resolveId(vertices[1]), ctx.resolveId(vertices[2])];\n}\n\nexport const SHAPE_BASE_FIELDS = {\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n} as const;\n","// src/stamps/geometry-2d/dsl/kinds/points/free.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'free' }>;\n\nexport const freeModule = defineModule<'free', Input>({\n kind: 'free',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('free'),\n x: z.number().finite(),\n y: z.number().finite(),\n }),\n collectRefs: () => [],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(ctx.resolveId(e.name), e.name, { kind: 'free', x: e.x, y: e.y }),\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/points/midpoint.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'midpoint' }>;\n\nexport const midpointModule = defineModule<'midpoint', Input>({\n kind: 'midpoint',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('midpoint'),\n p1: NameZ,\n p2: NameZ,\n }),\n collectRefs: (e) => [e.p1, e.p2],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(\n ctx.resolveId(e.name),\n e.name,\n { kind: 'midpoint', p1: ctx.resolveId(e.p1), p2: ctx.resolveId(e.p2) },\n ),\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/points/onSegment.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'onSegment' }>;\n\nexport const onSegmentModule = defineModule<'onSegment', Input>({\n kind: 'onSegment',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('onSegment'),\n segmentId: NameZ,\n t: z.number().min(0).max(1),\n }),\n collectRefs: (e) => [e.segmentId],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(\n ctx.resolveId(e.name),\n e.name,\n { kind: 'onSegment', segmentId: ctx.resolveId(e.segmentId), t: e.t },\n ),\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/points/onLine.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'onLine' }>;\n\nexport const onLineModule = defineModule<'onLine', Input>({\n kind: 'onLine',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('onLine'),\n lineId: NameZ,\n t: z.number().finite(),\n }),\n collectRefs: (e) => [e.lineId],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(\n ctx.resolveId(e.name),\n e.name,\n { kind: 'onLine', lineId: ctx.resolveId(e.lineId), t: e.t },\n ),\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/points/onCircle.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'onCircle' }>;\n\nexport const onCircleModule = defineModule<'onCircle', Input>({\n kind: 'onCircle',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('onCircle'),\n circleId: NameZ,\n theta: z.number().finite(),\n }),\n collectRefs: (e) => [e.circleId],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(\n ctx.resolveId(e.name),\n e.name,\n { kind: 'onCircle', circleId: ctx.resolveId(e.circleId), theta: e.theta },\n ),\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/points/perpFoot.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'perpFoot' }>;\n\nexport const perpFootModule = defineModule<'perpFoot', Input>({\n kind: 'perpFoot',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('perpFoot'),\n from: NameZ,\n onLine: NameZ,\n }),\n collectRefs: (e) => [e.from, e.onLine],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(\n ctx.resolveId(e.name),\n e.name,\n { kind: 'perpFoot', from: ctx.resolveId(e.from), onLine: ctx.resolveId(e.onLine) },\n ),\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/points/circumcenter.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject, resolveTriangleVertices } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'circumcenter' }>;\n\nexport const circumcenterModule = defineModule<'circumcenter', Input>({\n kind: 'circumcenter',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('circumcenter'),\n vertices: z.tuple([NameZ, NameZ, NameZ]),\n }),\n collectRefs: (e) => [...e.vertices],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(\n ctx.resolveId(e.name),\n e.name,\n { kind: 'circumcenter', vertices: resolveTriangleVertices(ctx, e.vertices) },\n ),\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/points/incenter.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject, resolveTriangleVertices } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'incenter' }>;\n\nexport const incenterModule = defineModule<'incenter', Input>({\n kind: 'incenter',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('incenter'),\n vertices: z.tuple([NameZ, NameZ, NameZ]),\n }),\n collectRefs: (e) => [...e.vertices],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(\n ctx.resolveId(e.name),\n e.name,\n { kind: 'incenter', vertices: resolveTriangleVertices(ctx, e.vertices) },\n ),\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/points/centroid.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject, resolveTriangleVertices } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'centroid' }>;\n\nexport const centroidModule = defineModule<'centroid', Input>({\n kind: 'centroid',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('centroid'),\n vertices: z.tuple([NameZ, NameZ, NameZ]),\n }),\n collectRefs: (e) => [...e.vertices],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(\n ctx.resolveId(e.name),\n e.name,\n { kind: 'centroid', vertices: resolveTriangleVertices(ctx, e.vertices) },\n ),\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/points/orthocenter.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject, resolveTriangleVertices } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'orthocenter' }>;\n\nexport const orthocenterModule = defineModule<'orthocenter', Input>({\n kind: 'orthocenter',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('orthocenter'),\n vertices: z.tuple([NameZ, NameZ, NameZ]),\n }),\n collectRefs: (e) => [...e.vertices],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(\n ctx.resolveId(e.name),\n e.name,\n { kind: 'orthocenter', vertices: resolveTriangleVertices(ctx, e.vertices) },\n ),\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/points/intersection.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { POINT_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'intersection' }>;\n\nexport const intersectionModule = defineModule<'intersection', Input>({\n kind: 'intersection',\n role: 'point',\n category: 'points',\n prefix: 'i',\n schema: z.object({\n name: NameZ,\n kind: z.literal('intersection'),\n ref1: NameZ,\n ref2: NameZ,\n branch: z.union([z.literal(0), z.literal(1)]).optional(),\n }),\n collectRefs: (e) => [e.ref1, e.ref2],\n emit: (e, ctx) => {\n const r1IsCircle = ctx.hintOf(e.ref1) === 'circle';\n const r2IsCircle = ctx.hintOf(e.ref2) === 'circle';\n let intersectKind: 'lineLine' | 'lineCircle' | 'circleCircle';\n if (r1IsCircle && r2IsCircle) intersectKind = 'circleCircle';\n else if (r1IsCircle || r2IsCircle) intersectKind = 'lineCircle';\n else intersectKind = 'lineLine';\n\n const attrs: Record<string, unknown> = {\n kind: intersectKind,\n ref1: ctx.resolveId(e.ref1),\n ref2: ctx.resolveId(e.ref2),\n };\n if (intersectKind !== 'lineLine') {\n attrs.branch = e.branch ?? 0;\n }\n return [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'intersection',\n label: e.name,\n ...POINT_BASE_FIELDS,\n attrs,\n },\n }];\n },\n});\n","// src/stamps/geometry-2d/dsl/kinds/lines/segment.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'segment' }>;\n\nexport const segmentModule = defineModule<'segment', Input>({\n kind: 'segment',\n role: 'segment',\n category: 'lines',\n prefix: 's',\n schema: z.object({\n name: NameZ,\n kind: z.literal('segment'),\n p1: NameZ,\n p2: NameZ,\n }),\n collectRefs: (e) => [e.p1, e.p2],\n emit: (e, ctx) => [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'segment',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n attrs: { p1: ctx.resolveId(e.p1), p2: ctx.resolveId(e.p2) },\n },\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/lines/line.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'line' }>;\n\nexport const lineModule = defineModule<'line', Input>({\n kind: 'line',\n role: 'line',\n category: 'lines',\n prefix: 'l',\n schema: z.object({\n name: NameZ,\n kind: z.literal('line'),\n p1: NameZ,\n p2: NameZ,\n }),\n collectRefs: (e) => [e.p1, e.p2],\n emit: (e, ctx) => [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'line',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n attrs: { p1: ctx.resolveId(e.p1), p2: ctx.resolveId(e.p2) },\n },\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/lines/ray.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'ray' }>;\n\nexport const rayModule = defineModule<'ray', Input>({\n kind: 'ray',\n role: 'ray',\n category: 'lines',\n prefix: 'r',\n schema: z.object({\n name: NameZ,\n kind: z.literal('ray'),\n origin: NameZ,\n through: NameZ,\n }),\n collectRefs: (e) => [e.origin, e.through],\n emit: (e, ctx) => [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'ray',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n attrs: { origin: ctx.resolveId(e.origin), through: ctx.resolveId(e.through) },\n },\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/lines/perpendicular.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'perpendicular' }>;\n\nexport const perpendicularModule = defineModule<'perpendicular', Input>({\n kind: 'perpendicular',\n role: 'lineConstruction',\n category: 'lines',\n prefix: 'l',\n schema: z.object({\n name: NameZ,\n kind: z.literal('perpendicular'),\n throughPoint: NameZ,\n toLine: NameZ,\n }),\n collectRefs: (e) => [e.throughPoint, e.toLine],\n emit: (e, ctx) => [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'line',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n attrs: {\n construction: {\n kind: 'perpendicular',\n throughPoint: ctx.resolveId(e.throughPoint),\n toLine: ctx.resolveId(e.toLine),\n },\n },\n },\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/lines/parallel.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'parallel' }>;\n\nexport const parallelModule = defineModule<'parallel', Input>({\n kind: 'parallel',\n role: 'lineConstruction',\n category: 'lines',\n prefix: 'l',\n schema: z.object({\n name: NameZ,\n kind: z.literal('parallel'),\n throughPoint: NameZ,\n toLine: NameZ,\n }),\n collectRefs: (e) => [e.throughPoint, e.toLine],\n emit: (e, ctx) => [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'line',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n attrs: {\n construction: {\n kind: 'parallel',\n throughPoint: ctx.resolveId(e.throughPoint),\n toLine: ctx.resolveId(e.toLine),\n },\n },\n },\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/lines/perpBisector.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'perpBisector' }>;\n\nexport const perpBisectorModule = defineModule<'perpBisector', Input>({\n kind: 'perpBisector',\n role: 'lineConstruction',\n category: 'lines',\n prefix: 'l',\n schema: z.object({\n name: NameZ,\n kind: z.literal('perpBisector'),\n p1: NameZ,\n p2: NameZ,\n }),\n collectRefs: (e) => [e.p1, e.p2],\n emit: (e, ctx) => [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'line',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n attrs: {\n construction: {\n kind: 'perpBisector',\n p1: ctx.resolveId(e.p1),\n p2: ctx.resolveId(e.p2),\n },\n },\n },\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/lines/angleBisector.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'angleBisector' }>;\n\nexport const angleBisectorModule = defineModule<'angleBisector', Input>({\n kind: 'angleBisector',\n role: 'lineConstruction',\n category: 'lines',\n prefix: 'l',\n schema: z.object({\n name: NameZ,\n kind: z.literal('angleBisector'),\n p1: NameZ,\n vertex: NameZ,\n p2: NameZ,\n }),\n collectRefs: (e) => [e.p1, e.vertex, e.p2],\n emit: (e, ctx) => [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'line',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n attrs: {\n construction: {\n kind: 'angleBisector',\n p1: ctx.resolveId(e.p1),\n vertex: ctx.resolveId(e.vertex),\n p2: ctx.resolveId(e.p2),\n },\n },\n },\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/lines/tangent.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'tangent' }>;\n\nexport const tangentModule = defineModule<'tangent', Input>({\n kind: 'tangent',\n role: 'lineConstruction',\n category: 'lines',\n prefix: 'l',\n schema: z.object({\n name: NameZ,\n kind: z.literal('tangent'),\n throughPoint: NameZ,\n toCircle: NameZ,\n branch: z.union([z.literal(0), z.literal(1), z.literal('on')]).optional(),\n }),\n collectRefs: (e) => [e.throughPoint, e.toCircle],\n emit: (e, ctx) => {\n const construction: Record<string, unknown> = {\n kind: 'tangent',\n throughPoint: ctx.resolveId(e.throughPoint),\n toCircle: ctx.resolveId(e.toCircle),\n };\n if (e.branch !== undefined) construction.branch = e.branch;\n return [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'line',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n attrs: { construction },\n },\n }];\n },\n});\n","// src/stamps/geometry-2d/dsl/kinds/polygons/polygon.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'polygon' }>;\n\nexport const polygonModule = defineModule<'polygon', Input>({\n kind: 'polygon',\n role: 'polygon',\n category: 'polygons',\n prefix: 'poly',\n schema: z.object({\n name: NameZ,\n kind: z.literal('polygon'),\n vertices: z.array(NameZ).min(3),\n }),\n collectRefs: (e) => [...e.vertices],\n emit: (e, ctx) => [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'polygon',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n attrs: { vertices: e.vertices.map((v) => ctx.resolveId(v)) },\n },\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/circles/circleCP.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'circleCP' }>;\n\nexport const circleCPModule = defineModule<'circleCP', Input>({\n kind: 'circleCP',\n role: 'circle',\n category: 'circles',\n prefix: 'c',\n schema: z.object({\n name: NameZ,\n kind: z.literal('circleCP'),\n center: NameZ,\n surfacePoint: NameZ,\n }),\n collectRefs: (e) => [e.center, e.surfacePoint],\n emit: (e, ctx) => [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'circle',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n attrs: { center: ctx.resolveId(e.center), surfacePoint: ctx.resolveId(e.surfacePoint) },\n },\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/circles/circle3.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'circle3' }>;\n\nexport const circle3Module = defineModule<'circle3', Input>({\n kind: 'circle3',\n role: 'circle',\n category: 'circles',\n prefix: 'c',\n schema: z.object({\n name: NameZ,\n kind: z.literal('circle3'),\n p1: NameZ,\n p2: NameZ,\n p3: NameZ,\n }),\n collectRefs: (e) => [e.p1, e.p2, e.p3],\n emit: (e, ctx) => [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'circle',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n attrs: {\n construction: {\n kind: 'circumscribed',\n p1: ctx.resolveId(e.p1),\n p2: ctx.resolveId(e.p2),\n p3: ctx.resolveId(e.p3),\n },\n },\n },\n }],\n});\n","// src/stamps/geometry-2d/dsl/registry.ts\nimport { z } from 'zod';\nimport type { DslKindModule } from './kinds/_types';\nimport { freeModule } from './kinds/points/free';\nimport { midpointModule } from './kinds/points/midpoint';\nimport { onSegmentModule } from './kinds/points/onSegment';\nimport { onLineModule } from './kinds/points/onLine';\nimport { onCircleModule } from './kinds/points/onCircle';\nimport { perpFootModule } from './kinds/points/perpFoot';\nimport { circumcenterModule } from './kinds/points/circumcenter';\nimport { incenterModule } from './kinds/points/incenter';\nimport { centroidModule } from './kinds/points/centroid';\nimport { orthocenterModule } from './kinds/points/orthocenter';\nimport { intersectionModule } from './kinds/points/intersection';\nimport { segmentModule } from './kinds/lines/segment';\nimport { lineModule } from './kinds/lines/line';\nimport { rayModule } from './kinds/lines/ray';\nimport { perpendicularModule } from './kinds/lines/perpendicular';\nimport { parallelModule } from './kinds/lines/parallel';\nimport { perpBisectorModule } from './kinds/lines/perpBisector';\nimport { angleBisectorModule } from './kinds/lines/angleBisector';\nimport { tangentModule } from './kinds/lines/tangent';\nimport { polygonModule } from './kinds/polygons/polygon';\nimport { circleCPModule } from './kinds/circles/circleCP';\nimport { circle3Module } from './kinds/circles/circle3';\n\nconst ALL_MODULES: ReadonlyArray<DslKindModule> = [\n freeModule, midpointModule, onSegmentModule, onLineModule, onCircleModule,\n perpFootModule, circumcenterModule, incenterModule, centroidModule,\n orthocenterModule, intersectionModule,\n segmentModule, lineModule, rayModule,\n perpendicularModule, parallelModule, perpBisectorModule,\n angleBisectorModule, tangentModule,\n polygonModule,\n circleCPModule, circle3Module,\n];\n\nexport const KIND_REGISTRY: ReadonlyMap<string, DslKindModule> =\n new Map(ALL_MODULES.map((m) => [m.kind, m]));\n\nexport const POINT_KINDS: ReadonlySet<string> = new Set(\n ALL_MODULES.filter((m) => m.role === 'point').map((m) => m.kind),\n);\n\nexport const LINE_LIKE_SHAPE_KINDS: ReadonlySet<string> = new Set(\n ALL_MODULES.filter(\n (m) =>\n m.role === 'segment' ||\n m.role === 'line' ||\n m.role === 'ray' ||\n m.role === 'lineConstruction',\n ).map((m) => m.kind),\n);\n\nexport const CIRCLE_KINDS: ReadonlySet<string> = new Set(\n ALL_MODULES.filter((m) => m.role === 'circle').map((m) => m.kind),\n);\n\n// Top-level entity discriminated union — used internally by schema.ts for building DslPoint/DslShape.\nexport const DslEntitySchema = z.discriminatedUnion(\n 'kind',\n ALL_MODULES.map((m) => m.schema) as unknown as [z.ZodObject<any>, z.ZodObject<any>, ...z.ZodObject<any>[]],\n);\n","// src/stamps/geometry-2d/dsl/schema.ts\nimport { z } from 'zod';\nimport { NameZ } from './names';\nimport { KIND_REGISTRY, POINT_KINDS } from './registry';\n\n// Re-export NameZ for backward compat with consumers.\nexport { NameZ } from './names';\n\nfunction asTuple(arr: z.ZodObject<any>[]): [z.ZodObject<any>, z.ZodObject<any>, ...z.ZodObject<any>[]] {\n if (arr.length < 2) throw new Error('schema: need at least 2 variants for discriminatedUnion');\n return arr as never;\n}\n\nconst pointSchemas = Array.from(KIND_REGISTRY.values())\n .filter((m) => POINT_KINDS.has(m.kind))\n .map((m) => m.schema);\n\nconst shapeSchemas = Array.from(KIND_REGISTRY.values())\n .filter((m) => !POINT_KINDS.has(m.kind))\n .map((m) => m.schema);\n\n// Runtime schemas assembled from the registry (Phase 6).\nexport const DslPoint = z.discriminatedUnion('kind', asTuple(pointSchemas));\nexport const DslShape = z.discriminatedUnion('kind', asTuple(shapeSchemas));\n\nexport const DslInput = z.object({\n version: z.literal(1),\n points: z.array(DslPoint),\n shapes: z.array(DslShape).default([]),\n});\n\n// -----------------------------------------------------------------------------\n// Static types\n//\n// We cannot derive these via `z.infer<typeof DslPoint>` because the kind\n// modules use `Extract<DslPointT, { kind: '...' }>` to type their `emit` /\n// `collectRefs` callbacks. That creates a type-graph cycle\n// (schema.ts -> registry.ts -> kinds/* -> schema.ts) which TypeScript collapses\n// to `any` (and `Extract<any, ...>` to `never`) because the registry stores\n// schemas as the erased `z.ZodObject<any>`.\n//\n// Keeping the discriminated union types listed explicitly here breaks the cycle\n// while still letting `DslPoint`/`DslShape` (runtime) be registry-assembled.\n// Adding a new kind = 1 new module file + 1 entry in registry.ts + 1 variant\n// listed below (a single object literal — much smaller than duplicating the\n// full Zod schema).\n// -----------------------------------------------------------------------------\n\ntype Name = z.infer<typeof NameZ>;\n\nexport type DslPointT =\n | { name: Name; kind: 'free'; x: number; y: number }\n | { name: Name; kind: 'midpoint'; p1: Name; p2: Name }\n | { name: Name; kind: 'onSegment'; segmentId: Name; t: number }\n | { name: Name; kind: 'onLine'; lineId: Name; t: number }\n | { name: Name; kind: 'onCircle'; circleId: Name; theta: number }\n | { name: Name; kind: 'perpFoot'; from: Name; onLine: Name }\n | { name: Name; kind: 'circumcenter'; vertices: [Name, Name, Name] }\n | { name: Name; kind: 'incenter'; vertices: [Name, Name, Name] }\n | { name: Name; kind: 'centroid'; vertices: [Name, Name, Name] }\n | { name: Name; kind: 'orthocenter'; vertices: [Name, Name, Name] }\n | { name: Name; kind: 'intersection'; ref1: Name; ref2: Name; branch?: 0 | 1 };\n\nexport type DslShapeT =\n | { name: Name; kind: 'segment'; p1: Name; p2: Name }\n | { name: Name; kind: 'line'; p1: Name; p2: Name }\n | { name: Name; kind: 'ray'; origin: Name; through: Name }\n | { name: Name; kind: 'polygon'; vertices: Name[] }\n | { name: Name; kind: 'perpendicular'; throughPoint: Name; toLine: Name }\n | { name: Name; kind: 'parallel'; throughPoint: Name; toLine: Name }\n | { name: Name; kind: 'perpBisector'; p1: Name; p2: Name }\n | { name: Name; kind: 'angleBisector'; p1: Name; vertex: Name; p2: Name }\n | { name: Name; kind: 'tangent'; throughPoint: Name; toCircle: Name; branch?: 0 | 1 | 'on' }\n | { name: Name; kind: 'circleCP'; center: Name; surfacePoint: Name }\n | { name: Name; kind: 'circle3'; p1: Name; p2: Name; p3: Name };\n\nexport type DslInputT = {\n version: 1;\n points: DslPointT[];\n shapes: DslShapeT[];\n};\n","// src/core/scene/types.ts\n\nexport type SceneObject<A = Record<string, unknown>> = {\n id: string;\n kind: string;\n label: string;\n visible: boolean;\n locked: boolean;\n layer: string;\n schemaVersion: number;\n attrs: A;\n};\n\n// View per domain — narrow theo `state.meta.domain`.\nexport type View2D = {\n readonly bbox: readonly [number, number, number, number]; // [xmin, ymax, xmax, ymin]\n readonly showAxis: boolean;\n readonly showGrid: boolean;\n};\n\nexport type View3D = {\n readonly bbox3D: readonly [number, number, number, number, number, number]; // [xmin, xmax, ymin, ymax, zmin, zmax]\n readonly azimuth: number;\n readonly elevation: number;\n};\n\nexport type ViewGraph2D = {\n readonly xMin: number;\n readonly xMax: number;\n readonly yMin: number;\n readonly yMax: number;\n readonly showAxis: boolean;\n readonly showGrid: boolean;\n};\n\n// Union of all view shapes — narrow qua state.meta.domain.\nexport type SceneView = View2D | View3D | ViewGraph2D;\n\n// Discriminated union: domain narrow → view shape narrow.\nexport type StateMeta =\n | { readonly domain: '2d'; readonly version: number; readonly view: View2D }\n | { readonly domain: '3d'; readonly version: number; readonly view: View3D }\n | { readonly domain: 'graph2d'; readonly version: number; readonly view: ViewGraph2D };\n\nexport type Domain = StateMeta['domain'];\n\n// Backward-compat alias: UPDATE_VIEW patch dùng graph-2d shape (chỉ graph-2d\n// dispatch action này hiện tại).\nexport type ViewSettings = ViewGraph2D;\n\nexport type State = {\n readonly objects: Readonly<Record<string, SceneObject>>;\n readonly order: readonly string[];\n readonly counter: number;\n readonly meta: StateMeta;\n};\n\nexport type Action =\n | { type: 'ADD'; payload: { obj: SceneObject } }\n | { type: 'UPDATE'; payload: { id: string; patch: Partial<Omit<SceneObject, 'id' | 'kind' | 'attrs'>> } }\n | { type: 'UPDATE_ATTRS'; payload: { id: string; patch: Record<string, unknown> } }\n | { type: 'DELETE'; payload: { id: string } }\n | { type: 'RESET' }\n | { type: 'LOAD'; payload: { state: State } }\n | { type: 'TRANSACTION'; payload: { actions: Action[] } }\n | { type: 'UPDATE_VIEW'; payload: { patch: Partial<ViewSettings> } };\n\nexport type RenderCtx = {\n jxg: unknown;\n resolveRef: (id: string) => unknown;\n defaults: Readonly<Record<string, unknown>>;\n /** Map tham số (parameter.label → parameter.value). Chỉ graph2d dùng. */\n paramMap?: Readonly<Record<string, number>>;\n};\n\nexport type KindDef<A = Record<string, unknown>> = {\n type: string;\n schemaVersion: number;\n migrate: Record<number, (prev: any) => any>;\n validate?: (attrs: A) => void;\n dependsOn: (attrs: A) => string[];\n describe: (obj: SceneObject<A>, state?: State) => string;\n measure?: (obj: SceneObject<A>, state: State) =>\n | { label: string; value: number }[]\n | null;\n render: (obj: SceneObject<A>, ctx: RenderCtx) => unknown;\n update?: (\n obj: SceneObject<A>,\n prev: SceneObject<A>,\n ctx: RenderCtx,\n existing: unknown,\n ) => void;\n};\n\nexport const DEFAULT_VIEW_2D: View2D = {\n bbox: [-10, 10, 10, -10],\n showAxis: false,\n showGrid: false,\n};\n\nexport const DEFAULT_VIEW_3D: View3D = {\n bbox3D: [-5, 5, -5, 5, -5, 5],\n azimuth: 60,\n elevation: 30,\n};\n\nexport const DEFAULT_VIEW_GRAPH2D: ViewGraph2D = {\n xMin: -10, xMax: 10, yMin: -10, yMax: 10,\n showAxis: true, showGrid: true,\n};\n\n// EMPTY_STATE giữ shape '3d' (legacy default). Dùng `createEmptyState(domain)`\n// khi cần state cụ thể cho domain — đảm bảo meta.view khớp domain.\nexport const EMPTY_STATE: State = {\n objects: {},\n order: [],\n counter: 0,\n meta: { domain: '3d', version: 1, view: DEFAULT_VIEW_3D },\n};\n\nexport function createEmptyState(domain: Domain): State {\n const base = { objects: {}, order: [], counter: 0 } as const;\n switch (domain) {\n case '2d':\n return { ...base, meta: { domain: '2d', version: 1, view: DEFAULT_VIEW_2D } };\n case '3d':\n return { ...base, meta: { domain: '3d', version: 1, view: DEFAULT_VIEW_3D } };\n case 'graph2d':\n return { ...base, meta: { domain: 'graph2d', version: 1, view: DEFAULT_VIEW_GRAPH2D } };\n }\n}\n","// src/stamps/geometry-2d/dsl/transpile/errors.ts\nimport type { State } from '../../../../core/scene/types';\n\nexport type TranspileErrorCode =\n | 'SCHEMA'\n | 'DUPLICATE_NAME'\n | 'UNKNOWN_REF'\n | 'KIND_MISMATCH'\n | 'CYCLE';\n\nexport interface TranspileError {\n code: TranspileErrorCode;\n message: string;\n path?: string[];\n hint?: string;\n}\n\nexport type TranspileResult =\n | { ok: true; state: State }\n | { ok: false; errors: TranspileError[] };\n\nexport function mkError(\n code: TranspileErrorCode,\n message: string,\n opts?: { path?: string[]; hint?: string },\n): TranspileError {\n return { code, message, path: opts?.path, hint: opts?.hint };\n}\n","// src/stamps/geometry-2d/dsl/transpile/symbols.ts\nimport type { DslInputT, DslPointT, DslShapeT } from '../schema';\nimport { mkError, type TranspileError } from './errors';\n\nexport type Role = 'point' | 'shape';\n\nexport interface Symbol {\n name: string;\n role: Role;\n entity: DslPointT | DslShapeT;\n index: number; // vị trí trong list nguyên thuỷ (cho deterministic id assign sau)\n}\n\nexport interface SymbolResult {\n symbols: Map<string, Symbol>;\n errors: TranspileError[];\n}\n\nexport function buildSymbols(dsl: DslInputT): SymbolResult {\n const symbols = new Map<string, Symbol>();\n const errors: TranspileError[] = [];\n let counter = 0;\n\n for (const p of dsl.points) {\n if (symbols.has(p.name)) {\n errors.push(mkError('DUPLICATE_NAME', `Tên trùng: \"${p.name}\"`, { path: [p.name] }));\n continue;\n }\n symbols.set(p.name, { name: p.name, role: 'point', entity: p, index: counter++ });\n }\n\n for (const s of dsl.shapes) {\n if (symbols.has(s.name)) {\n errors.push(mkError('DUPLICATE_NAME', `Tên trùng: \"${s.name}\"`, { path: [s.name] }));\n continue;\n }\n symbols.set(s.name, { name: s.name, role: 'shape', entity: s, index: counter++ });\n }\n\n return { symbols, errors };\n}\n","// src/stamps/geometry-2d/dsl/transpile/refs.ts\nimport type { DslInputT, DslPointT, DslShapeT } from '../schema';\nimport { KIND_REGISTRY, LINE_LIKE_SHAPE_KINDS, CIRCLE_KINDS } from '../registry';\nimport type { Symbol } from './symbols';\nimport { mkError, type TranspileError } from './errors';\n\nfunction isPointLike(sym: Symbol | undefined): boolean {\n return !!sym && sym.role === 'point';\n}\n\nfunction isLineLike(sym: Symbol | undefined): boolean {\n if (!sym || sym.role !== 'shape') return false;\n return LINE_LIKE_SHAPE_KINDS.has((sym.entity as DslShapeT).kind);\n}\n\nfunction isCircleLike(sym: Symbol | undefined): boolean {\n if (!sym || sym.role !== 'shape') return false;\n return CIRCLE_KINDS.has((sym.entity as DslShapeT).kind);\n}\n\nfunction isSegmentExact(sym: Symbol | undefined): boolean {\n return !!sym && sym.role === 'shape' && (sym.entity as DslShapeT).kind === 'segment';\n}\n\nexport interface RefsResult {\n errors: TranspileError[];\n}\n\nexport function validateRefs(dsl: DslInputT, symbols: Map<string, Symbol>): RefsResult {\n const errors: TranspileError[] = [];\n\n const check = (\n owner: string,\n field: string,\n refName: string,\n predicate: (s: Symbol | undefined) => boolean,\n expected: string,\n ) => {\n const sym = symbols.get(refName);\n if (!sym) {\n errors.push(mkError('UNKNOWN_REF',\n `${owner}.${field} tham chiếu \"${refName}\" không tồn tại`,\n { path: [owner, field] }));\n return;\n }\n if (!predicate(sym)) {\n errors.push(mkError('KIND_MISMATCH',\n `${owner}.${field}=\"${refName}\" sai kiểu (cần ${expected}, gặp ${sym.role === 'point' ? 'point' : (sym.entity as DslShapeT).kind})`,\n { path: [owner, field] }));\n }\n };\n\n for (const p of dsl.points) {\n switch (p.kind) {\n case 'free': break;\n case 'midpoint':\n check(p.name, 'p1', p.p1, isPointLike, 'point');\n check(p.name, 'p2', p.p2, isPointLike, 'point');\n break;\n case 'onSegment':\n check(p.name, 'segmentId', p.segmentId, isSegmentExact, 'segment');\n break;\n case 'onLine':\n check(p.name, 'lineId', p.lineId, isLineLike, 'line-like');\n break;\n case 'onCircle':\n check(p.name, 'circleId', p.circleId, isCircleLike, 'circle');\n break;\n case 'perpFoot':\n check(p.name, 'from', p.from, isPointLike, 'point');\n check(p.name, 'onLine', p.onLine, isLineLike, 'line-like');\n break;\n case 'circumcenter':\n case 'incenter':\n case 'centroid':\n case 'orthocenter':\n for (let i = 0; i < 3; i++) {\n check(p.name, `vertices[${i}]`, p.vertices[i], isPointLike, 'point');\n }\n break;\n case 'intersection': {\n const refPredicate = (s: Symbol | undefined) => isLineLike(s) || isCircleLike(s);\n check(p.name, 'ref1', p.ref1, refPredicate, 'line-like hoặc circle');\n check(p.name, 'ref2', p.ref2, refPredicate, 'line-like hoặc circle');\n break;\n }\n }\n }\n\n for (const s of dsl.shapes) {\n switch (s.kind) {\n case 'segment':\n case 'line':\n check(s.name, 'p1', s.p1, isPointLike, 'point');\n check(s.name, 'p2', s.p2, isPointLike, 'point');\n break;\n case 'ray':\n check(s.name, 'origin', s.origin, isPointLike, 'point');\n check(s.name, 'through', s.through, isPointLike, 'point');\n break;\n case 'polygon':\n s.vertices.forEach((v, i) =>\n check(s.name, `vertices[${i}]`, v, isPointLike, 'point'));\n break;\n case 'perpendicular':\n case 'parallel':\n check(s.name, 'throughPoint', s.throughPoint, isPointLike, 'point');\n check(s.name, 'toLine', s.toLine, isLineLike, 'line-like');\n break;\n case 'perpBisector':\n check(s.name, 'p1', s.p1, isPointLike, 'point');\n check(s.name, 'p2', s.p2, isPointLike, 'point');\n break;\n case 'angleBisector':\n check(s.name, 'p1', s.p1, isPointLike, 'point');\n check(s.name, 'vertex', s.vertex, isPointLike, 'point');\n check(s.name, 'p2', s.p2, isPointLike, 'point');\n break;\n case 'tangent':\n check(s.name, 'throughPoint', s.throughPoint, isPointLike, 'point');\n check(s.name, 'toCircle', s.toCircle, isCircleLike, 'circle');\n break;\n case 'circleCP':\n check(s.name, 'center', s.center, isPointLike, 'point');\n check(s.name, 'surfacePoint', s.surfacePoint, isPointLike, 'point');\n break;\n case 'circle3':\n check(s.name, 'p1', s.p1, isPointLike, 'point');\n check(s.name, 'p2', s.p2, isPointLike, 'point');\n check(s.name, 'p3', s.p3, isPointLike, 'point');\n break;\n }\n }\n\n return { errors };\n}\n\n// Helper export cho cycles.ts: collect refs cho mỗi entity (name) trả về list ref names.\nexport function collectRefs(entity: DslPointT | DslShapeT): string[] {\n const mod = KIND_REGISTRY.get(entity.kind);\n if (!mod) throw new Error(`collectRefs: no registry entry for kind \"${entity.kind}\"`);\n return mod.collectRefs(entity as never);\n}\n","// src/stamps/geometry-2d/dsl/transpile/cycles.ts\nimport type { Symbol } from './symbols';\nimport { collectRefs } from './refs';\nimport { mkError, type TranspileError } from './errors';\n\ntype Color = 'white' | 'gray' | 'black';\n\nexport interface CyclesResult {\n errors: TranspileError[];\n}\n\nexport function detectCycles(symbols: Map<string, Symbol>): CyclesResult {\n const color = new Map<string, Color>();\n const parent = new Map<string, string | null>();\n const errors: TranspileError[] = [];\n const reportedCycles = new Set<string>();\n\n for (const name of symbols.keys()) color.set(name, 'white');\n\n function reportCycle(start: string, hit: string) {\n // reconstruct chain hit ← ... ← start\n const chain: string[] = [start];\n let cur: string | null | undefined = parent.get(start);\n while (cur && cur !== hit && chain.length < symbols.size + 2) {\n chain.push(cur);\n cur = parent.get(cur);\n }\n chain.push(hit);\n // normalize cho dedupe (rotate min-first)\n const minIdx = chain.indexOf(chain.reduce((a, b) => (a < b ? a : b)));\n const rotated = [...chain.slice(minIdx), ...chain.slice(0, minIdx)];\n const key = rotated.join('→');\n if (reportedCycles.has(key)) return;\n reportedCycles.add(key);\n errors.push(mkError('CYCLE',\n `Phụ thuộc vòng: ${chain.reverse().join(' → ')}`,\n { path: [...chain], hint: 'Kiểm tra lại quan hệ midpoint/perpFoot/intersection.' }));\n }\n\n function dfs(name: string) {\n color.set(name, 'gray');\n const sym = symbols.get(name);\n if (sym) {\n for (const ref of collectRefs(sym.entity)) {\n if (!symbols.has(ref)) continue; // unknown — refs.ts handle\n const c = color.get(ref);\n if (c === 'gray') {\n reportCycle(name, ref);\n continue;\n }\n if (c === 'white') {\n parent.set(ref, name);\n dfs(ref);\n }\n }\n }\n color.set(name, 'black');\n }\n\n for (const name of symbols.keys()) {\n if (color.get(name) === 'white') {\n parent.set(name, null);\n dfs(name);\n }\n }\n\n return { errors };\n}\n","// src/stamps/geometry-2d/dsl/transpile/ids.ts\nimport type { Symbol } from './symbols';\nimport { KIND_REGISTRY } from '../registry';\n\nexport function assignIds(symbols: Map<string, Symbol>): Map<string, string> {\n const counters = new Map<string, number>();\n const ids = new Map<string, string>();\n for (const [name, sym] of symbols.entries()) {\n const mod = KIND_REGISTRY.get(sym.entity.kind);\n if (!mod) throw new Error(`assignIds: no registry entry for kind \"${sym.entity.kind}\"`);\n const prefix = mod.prefix;\n counters.set(prefix, (counters.get(prefix) ?? 0) + 1);\n ids.set(name, `${prefix}${counters.get(prefix)}`);\n }\n return ids;\n}\n","// src/stamps/geometry-2d/dsl/transpile.ts\nimport type { SceneObject, State } from '../../../core/scene/types';\nimport { createEmptyState } from '../../../core/scene/types';\nimport { DslInput, type DslInputT, type DslPointT, type DslShapeT } from './schema';\nimport { buildSymbols } from './transpile/symbols';\nimport { validateRefs } from './transpile/refs';\nimport { detectCycles } from './transpile/cycles';\nimport { assignIds } from './transpile/ids';\nimport { mkError, type TranspileError, type TranspileResult } from './transpile/errors';\nimport { KIND_REGISTRY } from './registry';\nimport type { EmitContext, EmittedEntity, KindRole } from './kinds/_types';\n\ntype EntityKindHint = 'point' | 'line' | 'segment' | 'ray' | 'lineConstruction' | 'circle';\n\nfunction hintOf(entity: DslPointT | DslShapeT): EntityKindHint {\n const mod = KIND_REGISTRY.get(entity.kind);\n if (!mod) throw new Error(`hintOf: no registry entry for kind \"${entity.kind}\"`);\n // 'polygon' role maps to 'point' for legacy MVP behavior (polygon never used as ref target).\n return mod.role === 'polygon' ? 'point' : (mod.role as EntityKindHint);\n}\n\nfunction buildEmitContext(\n ids: Map<string, string>,\n kindHints: Map<string, EntityKindHint>,\n): EmitContext {\n const auxCounters = new Map<string, number>();\n return {\n resolveId(name) {\n const id = ids.get(name);\n if (!id) throw new Error(`emit: id not assigned for \"${name}\"`);\n return id;\n },\n hintOf(name) {\n const hint = kindHints.get(name);\n if (!hint) throw new Error(`emit: hint not assigned for \"${name}\"`);\n // EntityKindHint and KindRole share these literals; safe to widen.\n return hint as KindRole;\n },\n mintAuxId(parentName, suffix) {\n const key = `${parentName}.${suffix}`;\n auxCounters.set(key, (auxCounters.get(key) ?? 0) + 1);\n const seq = auxCounters.get(key)!;\n return `aux_${parentName}_${suffix}${seq}`;\n },\n };\n}\n\nexport function transpile(dslRaw: unknown): TranspileResult {\n // Stage 1: schema parse\n const parsed = DslInput.safeParse(dslRaw);\n if (!parsed.success) {\n const errors: TranspileError[] = parsed.error.issues.map((iss) =>\n mkError('SCHEMA', iss.message, { path: iss.path.map(String) }),\n );\n return { ok: false, errors };\n }\n // Cast: parsed.data is statically `{[x: string]: any}[]` because the registry\n // stores schemas as the erased `z.ZodObject<any>`. Runtime parse already\n // validated the variant shape, so widening to DslInputT is safe.\n const dsl = parsed.data as DslInputT;\n\n // Stage 2-4: collect errors\n const { symbols, errors: dupErrors } = buildSymbols(dsl);\n const { errors: refErrors } = validateRefs(dsl, symbols);\n const { errors: cycleErrors } = detectCycles(symbols);\n\n const allErrors = [...dupErrors, ...refErrors, ...cycleErrors];\n if (allErrors.length > 0) return { ok: false, errors: allErrors };\n\n // Stage 5: id assignment\n const ids = assignIds(symbols);\n\n // Build kindHints (DSL name → EntityKindHint) cho intersection inference.\n const kindHints = new Map<string, EntityKindHint>();\n for (const [name, sym] of symbols.entries()) {\n kindHints.set(name, hintOf(sym.entity));\n }\n\n // Stage 6: emit via registry\n const objects: Record<string, SceneObject> = {};\n const order: string[] = [];\n const ctx = buildEmitContext(ids, kindHints);\n\n const emitEntity = (entity: DslPointT | DslShapeT) => {\n const mod = KIND_REGISTRY.get(entity.kind);\n if (!mod) throw new Error(`emit: no registry entry for kind \"${entity.kind}\"`);\n const emitted: EmittedEntity[] = mod.emit(entity as never, ctx);\n for (const ent of emitted) {\n objects[ent.object.id] = ent.object;\n order.push(ent.object.id);\n }\n };\n\n for (const p of dsl.points) emitEntity(p);\n for (const s of dsl.shapes) emitEntity(s);\n\n const empty = createEmptyState('2d');\n const state: State = {\n objects,\n order,\n counter: order.length,\n meta: empty.meta,\n };\n return { ok: true, state };\n}\n","// src/stamps/geometry-2d/ai/envelope.ts\n//\n// Envelope schema chung cho mọi AI provider. AI luôn emit:\n// { decision: 'build', figure: <DslInput> }\n// { decision: 'refuse', reason: '...' }\n//\n// Anthropic dùng tool_use với tool đơn ('emit_figure_envelope') input đúng\n// schema này. Ollama (Gemma) dùng `format: <schema>` constrained output.\n//\n// Ưu điểm: 1 schema, 1 prompt, parse + validate ở 1 chỗ. Provider chỉ chịu\n// trách nhiệm gửi/nhận; orchestrator (buildFigure) xử lý logic.\n\nimport { z } from 'zod';\nimport { zodToJsonSchema } from 'zod-to-json-schema';\nimport { DslInput, type DslInputT } from '../dsl';\n\nexport const FigureEnvelopeZ = z\n .object({\n decision: z.enum(['build', 'refuse']),\n // figure: DslInput khi build; bỏ qua khi refuse.\n figure: DslInput.optional(),\n // reason: lý do từ chối (Việt) khi refuse; bỏ qua khi build.\n reason: z.string().optional(),\n })\n .refine(\n (e) => (e.decision === 'build' ? e.figure != null : e.reason != null && e.reason.length > 0),\n {\n message:\n 'decision=build cần `figure`; decision=refuse cần `reason` không rỗng',\n },\n );\n\nexport type FigureEnvelopeT = z.infer<typeof FigureEnvelopeZ>;\n\n// JSON Schema bản phẳng — pass cho Anthropic tool input_schema + Ollama format.\n// Note: refine() chỉ run ở Zod runtime; JSON Schema không representable. Provider\n// constraint output ở \"any of decision/figure/reason\"; orchestrator parse +\n// validate qua FigureEnvelopeZ để bắt vi phạm refine.\nexport function envelopeJsonSchema(): Record<string, unknown> {\n return zodToJsonSchema(FigureEnvelopeZ, {\n target: 'jsonSchema7',\n $refStrategy: 'none',\n }) as Record<string, unknown>;\n}\n\n/** Helper: ép envelope build hợp lệ về DslInputT (sau khi đã validate). */\nexport function envelopeBuildDsl(env: FigureEnvelopeT): DslInputT {\n if (env.decision !== 'build' || env.figure == null) {\n throw new Error('envelopeBuildDsl: envelope không phải decision=build hoặc thiếu figure');\n }\n // Zod infer cho DslInput rộng `{[x: string]: any}[]` (discriminatedUnion từ\n // registry với schemas erased `ZodObject<any>`); runtime parse đã validate,\n // safe widen sang DslInputT (xem comment trong schema.ts).\n return env.figure as unknown as DslInputT;\n}\n","// src/stamps/geometry-2d/dsl/fixtures/triangle-equilateral.ts\nimport type { DslInputT } from '../schema';\n\nexport const fixture: { problem: string; dsl: DslInputT } = {\n problem: 'Cho tam giác đều ABC cạnh 4.',\n dsl: {\n version: 1,\n points: [\n { name: 'A', kind: 'free', x: 0, y: 0 },\n { name: 'B', kind: 'free', x: 4, y: 0 },\n { name: 'C', kind: 'free', x: 2, y: 3.464 },\n ],\n shapes: [\n { name: 'ABC', kind: 'polygon', vertices: ['A', 'B', 'C'] },\n ],\n },\n};\n","// src/stamps/geometry-2d/dsl/fixtures/triangle-median.ts\nimport type { DslInputT } from '../schema';\n\nexport const fixture: { problem: string; dsl: DslInputT } = {\n problem: 'Tam giác ABC, M là trung điểm BC. Vẽ AM.',\n dsl: {\n version: 1,\n points: [\n { name: 'A', kind: 'free', x: 0, y: 3 },\n { name: 'B', kind: 'free', x: -2, y: 0 },\n { name: 'C', kind: 'free', x: 3, y: 0 },\n { name: 'M', kind: 'midpoint', p1: 'B', p2: 'C' },\n ],\n shapes: [\n { name: 'ABC', kind: 'polygon', vertices: ['A', 'B', 'C'] },\n { name: 'AM', kind: 'segment', p1: 'A', p2: 'M' },\n ],\n },\n};\n","// src/stamps/geometry-2d/dsl/fixtures/triangle-altitude.ts\nimport type { DslInputT } from '../schema';\n\nexport const fixture: { problem: string; dsl: DslInputT } = {\n problem: 'Tam giác ABC, AH là đường cao xuống BC.',\n dsl: {\n version: 1,\n points: [\n { name: 'A', kind: 'free', x: 1, y: 3 },\n { name: 'B', kind: 'free', x: -2, y: 0 },\n { name: 'C', kind: 'free', x: 3, y: 0 },\n { name: 'H', kind: 'perpFoot', from: 'A', onLine: 'BC' },\n ],\n shapes: [\n { name: 'ABC', kind: 'polygon', vertices: ['A', 'B', 'C'] },\n { name: 'BC', kind: 'segment', p1: 'B', p2: 'C' },\n { name: 'AH', kind: 'segment', p1: 'A', p2: 'H' },\n ],\n },\n};\n","// src/stamps/geometry-2d/dsl/fixtures/triangle-centroid.ts\nimport type { DslInputT } from '../schema';\n\nexport const fixture: { problem: string; dsl: DslInputT } = {\n problem: 'Tam giác ABC, G là trọng tâm.',\n dsl: {\n version: 1,\n points: [\n { name: 'A', kind: 'free', x: 0, y: 3 },\n { name: 'B', kind: 'free', x: -2, y: 0 },\n { name: 'C', kind: 'free', x: 3, y: 0 },\n { name: 'G', kind: 'centroid', vertices: ['A', 'B', 'C'] },\n ],\n shapes: [\n { name: 'ABC', kind: 'polygon', vertices: ['A', 'B', 'C'] },\n ],\n },\n};\n","// src/stamps/geometry-2d/dsl/fixtures/triangle-orthocenter.ts\nimport type { DslInputT } from '../schema';\n\nexport const fixture: { problem: string; dsl: DslInputT } = {\n problem: 'Tam giác ABC, H là trực tâm.',\n dsl: {\n version: 1,\n points: [\n { name: 'A', kind: 'free', x: 0, y: 3 },\n { name: 'B', kind: 'free', x: -2, y: 0 },\n { name: 'C', kind: 'free', x: 3, y: 0 },\n { name: 'H', kind: 'orthocenter', vertices: ['A', 'B', 'C'] },\n ],\n shapes: [\n { name: 'ABC', kind: 'polygon', vertices: ['A', 'B', 'C'] },\n ],\n },\n};\n","// src/stamps/geometry-2d/dsl/fixtures/triangle-circumcircle.ts\nimport type { DslInputT } from '../schema';\n\nexport const fixture: { problem: string; dsl: DslInputT } = {\n problem: 'Tam giác ABC nội tiếp đường tròn tâm O.',\n dsl: {\n version: 1,\n points: [\n { name: 'A', kind: 'free', x: 0, y: 3 },\n { name: 'B', kind: 'free', x: -2, y: 0 },\n { name: 'C', kind: 'free', x: 3, y: 0 },\n { name: 'O', kind: 'circumcenter', vertices: ['A', 'B', 'C'] },\n ],\n shapes: [\n { name: 'ABC', kind: 'polygon', vertices: ['A', 'B', 'C'] },\n { name: 'k', kind: 'circle3', p1: 'A', p2: 'B', p3: 'C' },\n ],\n },\n};\n","// src/stamps/geometry-2d/dsl/fixtures/triangle-incircle.ts\nimport type { DslInputT } from '../schema';\n\nexport const fixture: { problem: string; dsl: DslInputT } = {\n problem: 'Tam giác ABC, I là tâm nội tiếp, đường tròn (I) tiếp xúc BC tại D.',\n dsl: {\n version: 1,\n points: [\n { name: 'A', kind: 'free', x: 0, y: 3 },\n { name: 'B', kind: 'free', x: -2, y: 0 },\n { name: 'C', kind: 'free', x: 3, y: 0 },\n { name: 'I', kind: 'incenter', vertices: ['A', 'B', 'C'] },\n { name: 'D', kind: 'perpFoot', from: 'I', onLine: 'BC' },\n ],\n shapes: [\n { name: 'ABC', kind: 'polygon', vertices: ['A', 'B', 'C'] },\n { name: 'BC', kind: 'segment', p1: 'B', p2: 'C' },\n { name: 'incircle', kind: 'circleCP', center: 'I', surfacePoint: 'D' },\n ],\n },\n};\n","// src/stamps/geometry-2d/dsl/fixtures/parallelogram.ts\nimport type { DslInputT } from '../schema';\n\nexport const fixture: { problem: string; dsl: DslInputT } = {\n problem: 'Hình bình hành ABCD, hai đường chéo AC, BD cắt nhau tại O.',\n dsl: {\n version: 1,\n points: [\n { name: 'A', kind: 'free', x: 0, y: 0 },\n { name: 'B', kind: 'free', x: 4, y: 0 },\n { name: 'C', kind: 'free', x: 5, y: 2 },\n { name: 'D', kind: 'free', x: 1, y: 2 },\n { name: 'O', kind: 'intersection', ref1: 'AC', ref2: 'BD' },\n ],\n shapes: [\n { name: 'ABCD', kind: 'polygon', vertices: ['A', 'B', 'C', 'D'] },\n { name: 'AC', kind: 'segment', p1: 'A', p2: 'C' },\n { name: 'BD', kind: 'segment', p1: 'B', p2: 'D' },\n ],\n },\n};\n","// src/stamps/geometry-2d/dsl/fixtures/two-circles-intersect.ts\nimport type { DslInputT } from '../schema';\n\nexport const fixture: { problem: string; dsl: DslInputT } = {\n problem: 'Hai đường tròn (O₁), (O₂) cắt nhau tại P, Q.',\n dsl: {\n version: 1,\n points: [\n { name: 'O1', kind: 'free', x: 0, y: 0 },\n { name: 'A1', kind: 'free', x: 2, y: 0 },\n { name: 'O2', kind: 'free', x: 3, y: 0 },\n { name: 'A2', kind: 'free', x: 5, y: 0 },\n { name: 'P', kind: 'intersection', ref1: 'k1', ref2: 'k2', branch: 0 },\n { name: 'Q', kind: 'intersection', ref1: 'k1', ref2: 'k2', branch: 1 },\n ],\n shapes: [\n { name: 'k1', kind: 'circleCP', center: 'O1', surfacePoint: 'A1' },\n { name: 'k2', kind: 'circleCP', center: 'O2', surfacePoint: 'A2' },\n ],\n },\n};\n","// src/stamps/geometry-2d/dsl/fixtures/triangle-angle-bisector.ts\nimport type { DslInputT } from '../schema';\n\nexport const fixture: { problem: string; dsl: DslInputT } = {\n problem: 'Tam giác ABC, AD là phân giác góc A (D thuộc BC).',\n dsl: {\n version: 1,\n points: [\n { name: 'A', kind: 'free', x: 0, y: 3 },\n { name: 'B', kind: 'free', x: -2, y: 0 },\n { name: 'C', kind: 'free', x: 3, y: 0 },\n // D = giao của đường phân giác góc A với BC. KHÔNG dùng segment AD\n // vì AD lại tham chiếu D → cycle.\n { name: 'D', kind: 'intersection', ref1: 'bisA', ref2: 'BC' },\n ],\n shapes: [\n { name: 'ABC', kind: 'polygon', vertices: ['A', 'B', 'C'] },\n { name: 'BC', kind: 'segment', p1: 'B', p2: 'C' },\n // Đường phân giác (line construction), chứ không phải segment.\n { name: 'bisA', kind: 'angleBisector', p1: 'B', vertex: 'A', p2: 'C' },\n // Sau khi đã có D, mới dựng được segment AD.\n { name: 'AD', kind: 'segment', p1: 'A', p2: 'D' },\n ],\n },\n};\n","// src/stamps/geometry-2d/dsl/fixtures/triangle-median-altitude.ts\n//\n// Compound fixture (2 yêu cầu trong cùng đề): trung điểm + đường cao trên cùng\n// cạnh BC. Mục đích dạy AI:\n// - M (midpoint) và H (perpFoot) là 2 điểm RIÊNG, không nhầm nhau.\n// - Có thể tham chiếu chung shape 'BC' (segment) cho cả derivation.\n// - Order points an toàn: A,B,C free → M midpoint → H perpFoot.\nimport type { DslInputT } from '../schema';\n\nexport const fixture: { problem: string; dsl: DslInputT } = {\n problem: 'Tam giác ABC, M là trung điểm BC và AH là đường cao xuống BC.',\n dsl: {\n version: 1,\n points: [\n { name: 'A', kind: 'free', x: 1, y: 3 },\n { name: 'B', kind: 'free', x: -2, y: 0 },\n { name: 'C', kind: 'free', x: 3, y: 0 },\n // M = trung điểm B và C. KHÔNG dùng perpFoot ở đây — đó là H.\n { name: 'M', kind: 'midpoint', p1: 'B', p2: 'C' },\n // H = chân đường vuông góc từ A xuống cạnh BC.\n { name: 'H', kind: 'perpFoot', from: 'A', onLine: 'BC' },\n ],\n shapes: [\n { name: 'ABC', kind: 'polygon', vertices: ['A', 'B', 'C'] },\n { name: 'BC', kind: 'segment', p1: 'B', p2: 'C' },\n { name: 'AM', kind: 'segment', p1: 'A', p2: 'M' },\n { name: 'AH', kind: 'segment', p1: 'A', p2: 'H' },\n ],\n },\n};\n","// src/stamps/geometry-2d/dsl/fixtures/trapezoid.ts\n//\n// Hình thang ABCD với AB // CD. Toạ độ chọn sao cho AB và CD song song\n// (cùng đi theo trục y = constant). AI học pattern \"polygon với 2 cạnh\n// song song bằng cách chọn coord trùng y\" — không cần emit `parallel` shape.\nimport type { DslInputT } from '../schema';\n\nexport const fixture: { problem: string; dsl: DslInputT } = {\n problem: 'Hình thang ABCD có AB song song CD.',\n dsl: {\n version: 1,\n points: [\n { name: 'A', kind: 'free', x: 0, y: 0 },\n { name: 'B', kind: 'free', x: 4, y: 0 },\n { name: 'C', kind: 'free', x: 5, y: 3 },\n { name: 'D', kind: 'free', x: -1, y: 3 },\n ],\n shapes: [\n { name: 'ABCD', kind: 'polygon', vertices: ['A', 'B', 'C', 'D'] },\n ],\n },\n};\n","// src/stamps/geometry-2d/dsl/fixtures/rhombus.ts\n//\n// Hình thoi ABCD: 4 cạnh bằng nhau, 2 đường chéo cắt nhau tại tâm O.\n// Coord chọn sao cho ABCD đối xứng qua O và độ dài 4 cạnh bằng nhau.\nimport type { DslInputT } from '../schema';\n\nexport const fixture: { problem: string; dsl: DslInputT } = {\n problem: 'Hình thoi ABCD, hai đường chéo AC, BD cắt nhau tại O.',\n dsl: {\n version: 1,\n points: [\n { name: 'A', kind: 'free', x: 0, y: 2 },\n { name: 'B', kind: 'free', x: 3, y: 0 },\n { name: 'C', kind: 'free', x: 0, y: -2 },\n { name: 'D', kind: 'free', x: -3, y: 0 },\n { name: 'O', kind: 'intersection', ref1: 'AC', ref2: 'BD' },\n ],\n shapes: [\n { name: 'ABCD', kind: 'polygon', vertices: ['A', 'B', 'C', 'D'] },\n { name: 'AC', kind: 'segment', p1: 'A', p2: 'C' },\n { name: 'BD', kind: 'segment', p1: 'B', p2: 'D' },\n ],\n },\n};\n","// src/stamps/geometry-2d/dsl/fixtures/right-triangle-altitude.ts\n//\n// Tam giác ABC vuông tại A, AH là đường cao xuống cạnh huyền BC.\n// Coord: A ở gốc, AB trục y, AC trục x → góc vuông tại A.\nimport type { DslInputT } from '../schema';\n\nexport const fixture: { problem: string; dsl: DslInputT } = {\n problem: 'Tam giác ABC vuông tại A, AH là đường cao xuống cạnh huyền BC.',\n dsl: {\n version: 1,\n points: [\n { name: 'A', kind: 'free', x: 0, y: 0 },\n { name: 'B', kind: 'free', x: 0, y: 3 },\n { name: 'C', kind: 'free', x: 4, y: 0 },\n { name: 'H', kind: 'perpFoot', from: 'A', onLine: 'BC' },\n ],\n shapes: [\n { name: 'ABC', kind: 'polygon', vertices: ['A', 'B', 'C'] },\n { name: 'BC', kind: 'segment', p1: 'B', p2: 'C' },\n { name: 'AH', kind: 'segment', p1: 'A', p2: 'H' },\n ],\n },\n};\n","// src/stamps/geometry-2d/dsl/fixtures/tangent-from-point.ts\n//\n// Từ điểm M ngoài đường tròn (O), kẻ 2 tiếp tuyến tới (O). Dùng\n// `tangent` shape với branch 0/1 để emit 2 đường tiếp tuyến đối xứng.\nimport type { DslInputT } from '../schema';\n\nexport const fixture: { problem: string; dsl: DslInputT } = {\n problem: 'Từ điểm M ngoài đường tròn (O), kẻ hai tiếp tuyến tới (O).',\n dsl: {\n version: 1,\n points: [\n { name: 'O', kind: 'free', x: 0, y: 0 },\n // P là điểm trên đường tròn dùng để định bán kính.\n { name: 'P', kind: 'free', x: 2, y: 0 },\n { name: 'M', kind: 'free', x: 5, y: 0 },\n ],\n shapes: [\n { name: 'k', kind: 'circleCP', center: 'O', surfacePoint: 'P' },\n { name: 't1', kind: 'tangent', throughPoint: 'M', toCircle: 'k', branch: 0 },\n { name: 't2', kind: 'tangent', throughPoint: 'M', toCircle: 'k', branch: 1 },\n ],\n },\n};\n","// src/stamps/geometry-2d/dsl/fixtures/internal-external-bisector.ts\n//\n// Tam giác ABC, tại đỉnh A có 2 tia phân giác: trong (angleBisector) và\n// ngoài (vuông góc với phân giác trong tại A). Dùng `perpendicular` shape\n// với throughPoint=A, toLine=bisIn.\nimport type { DslInputT } from '../schema';\n\nexport const fixture: { problem: string; dsl: DslInputT } = {\n problem: 'Tam giác ABC, vẽ tia phân giác trong và phân giác ngoài tại đỉnh A.',\n dsl: {\n version: 1,\n points: [\n { name: 'A', kind: 'free', x: 0, y: 3 },\n { name: 'B', kind: 'free', x: -2, y: 0 },\n { name: 'C', kind: 'free', x: 3, y: 0 },\n ],\n shapes: [\n { name: 'ABC', kind: 'polygon', vertices: ['A', 'B', 'C'] },\n { name: 'bisIn', kind: 'angleBisector', p1: 'B', vertex: 'A', p2: 'C' },\n // Phân giác ngoài = vuông góc với phân giác trong tại đỉnh A.\n { name: 'bisExt', kind: 'perpendicular', throughPoint: 'A', toLine: 'bisIn' },\n ],\n },\n};\n","// src/stamps/geometry-2d/ai/prompt.ts\n//\n// System prompt cho cả Anthropic + Ollama providers. AI luôn emit envelope\n// JSON: `{ decision: 'build', figure: <DslInput> }` hoặc\n// `{ decision: 'refuse', reason: '...' }`. Provider responsible cho việc\n// constrain schema (tool input_schema | Ollama format).\n\nimport { fixture as eq } from '../dsl/fixtures/triangle-equilateral';\nimport { fixture as md } from '../dsl/fixtures/triangle-median';\nimport { fixture as alt } from '../dsl/fixtures/triangle-altitude';\nimport { fixture as ce } from '../dsl/fixtures/triangle-centroid';\nimport { fixture as oc } from '../dsl/fixtures/triangle-orthocenter';\nimport { fixture as cc } from '../dsl/fixtures/triangle-circumcircle';\nimport { fixture as ic } from '../dsl/fixtures/triangle-incircle';\nimport { fixture as par } from '../dsl/fixtures/parallelogram';\nimport { fixture as two } from '../dsl/fixtures/two-circles-intersect';\nimport { fixture as bis } from '../dsl/fixtures/triangle-angle-bisector';\nimport { fixture as mdAlt } from '../dsl/fixtures/triangle-median-altitude';\nimport { fixture as trap } from '../dsl/fixtures/trapezoid';\nimport { fixture as rho } from '../dsl/fixtures/rhombus';\nimport { fixture as rta } from '../dsl/fixtures/right-triangle-altitude';\nimport { fixture as tan } from '../dsl/fixtures/tangent-from-point';\nimport { fixture as ieBis } from '../dsl/fixtures/internal-external-bisector';\n\nconst FIXTURES = [\n eq, md, alt, ce, oc, cc, ic, bis, mdAlt,\n rta, ieBis, tan, par, rho, trap, two,\n];\n\nexport function buildSystemPrompt(): string {\n const examples = FIXTURES.map((f, i) =>\n `### Ví dụ ${i + 1}\n**Đề:** ${f.problem}\n**Output:**\n${JSON.stringify({ decision: 'build', figure: f.dsl }, null, 2)}`,\n ).join('\\n\\n');\n\n return `Bạn là trợ lý vẽ hình học 2D cho học sinh THCS và lớp 10 Việt Nam.\n\n## Nhiệm vụ\nĐọc đề bài tiếng Việt → emit JSON envelope mô tả hình. Hệ thống sẽ render hình từ DSL.\n\n## Output format (CHỈ JSON, không markdown, không text khác)\n{ \"decision\": \"build\", \"figure\": { /* DSL */ } }\nhoặc\n{ \"decision\": \"refuse\", \"reason\": \"lý do tiếng Việt\" }\n\n## Quy tắc\n1. Vẽ được → decision=\"build\" + figure đầy đủ DSL.\n2. Đề ngoài phạm vi → decision=\"refuse\" + reason tiếng Việt cụ thể. Bao gồm:\n - Tính toán đại số / lượng giác / giải phương trình (không yêu cầu vẽ).\n - Hình 3D, lập thể, không gian.\n - Phép biến hình affine / tịnh tiến / vị tự / quay (lớp 11+).\n - Đề mô tả không đủ thông tin để dựng (vd \"điểm M bất kỳ trên mặt phẳng\").\n3. **Ưu tiên derived points** (midpoint, perpFoot, intersection, circumcenter, …) thay vì tự compute toạ độ. Chỉ dùng \\`free\\` cho điểm gốc tự do (A, B, C của tam giác — đặt coord -5..5).\n4. **Đường cao**: dùng \\`perpFoot\\` cho chân, KHÔNG free anchor.\n5. **Phân giác góc A đến BC**: emit line \\`angleBisector\\` (B, A, C) + segment BC + point D = \\`intersection\\` của 2 line đó. KHÔNG emit \\`onSegment\\` với segmentId chính là segment đang dựng (cycle).\n6. **Đường tròn ngoại tiếp**: dùng \\`circle3\\` (3 điểm), không phải \\`polygon\\`.\n7. **Đường tròn nội tiếp / tiếp xúc**: tâm bằng \\`incenter\\`, điểm tiếp xúc bằng \\`perpFoot\\` từ tâm xuống cạnh tương ứng, rồi \\`circleCP\\`.\n8. **Đường tròn (O; R) bán kính số**: emit free helper trên đường tròn rồi dùng \\`circleCP\\` (DSL không hỗ trợ radius numeric trực tiếp).\n9. **Đề ghép nhiều yêu cầu** (vd \"trung điểm M và đường cao AH\"): mỗi yêu cầu là 1 derived point riêng với kind đúng. KHÔNG đặt chung 1 point thoả nhiều ràng buộc. Vẽ thêm segment cho từng yêu cầu (AM, AH, ...) khi đề mô tả \"dựng\" hoặc \"vẽ\".\n\n## Anti-pattern (BẮT BUỘC tránh)\n- **Cycle / forward-ref**: KHÔNG được tham chiếu chéo. Nếu point D ∈ segment AD → cycle (AD cần D, D cần AD). Đúng pattern: D = intersection của line nào đó với BC, sau đó AD = segment(A, D).\n- **Mọi name bị reference phải được định nghĩa trước** (DSL topological sort: free → derived → shape).\n- **Đa giác polygon KHÔNG thay thế cho đường tròn**: nếu đề nói \"đường tròn qua 3 điểm\" mà bạn emit polygon thì sai.\n\n## Primitives sẵn có\n**Points:** free, midpoint, onSegment, onLine, onCircle, perpFoot, circumcenter, incenter, centroid, orthocenter, intersection\n**Shapes:** segment, line, ray, polygon, perpendicular, parallel, perpBisector, angleBisector, tangent, circleCP, circle3\n\n## ${FIXTURES.length} ví dụ\n${examples}\n\nTrả về CHỈ 1 JSON object đúng schema. Không có lời dẫn, không markdown fence.`;\n}\n","// src/stamps/geometry-2d/ai/providers/anthropic.ts\n//\n// AIProvider impl cho Anthropic Claude. Internal: dùng tool_use với single\n// tool \"emit_figure_envelope\" input_schema = envelope JSON Schema → ép Claude\n// emit JSON đúng shape. Map response → ProviderOutput envelope.\n//\n// Khác bản trước (provider.ts): bỏ dual-tool (build_figure + refuse) — Claude\n// hoàn toàn xử lý được decision/refuse trong cùng 1 envelope.\n\nimport Anthropic from '@anthropic-ai/sdk';\nimport type {\n AIProvider,\n ProviderOutput,\n ProviderRequest,\n ProviderTokenUsage,\n} from './types';\n\nconst TOOL_NAME = 'emit_figure_envelope';\n\nexport interface AnthropicProviderOptions {\n apiKey: string;\n /** Cache system prompt qua Anthropic prompt-caching (mặc định bật). */\n enableCaching?: boolean;\n}\n\nexport class AnthropicProvider implements AIProvider {\n readonly name = 'anthropic';\n readonly defaultModel = 'claude-opus-4-7';\n\n constructor(private readonly opts: AnthropicProviderOptions) {\n if (!opts.apiKey) throw new Error('AnthropicProvider: apiKey bắt buộc');\n }\n\n async call(req: ProviderRequest): Promise<ProviderOutput> {\n const enableCaching = this.opts.enableCaching !== false;\n const systemBlock = enableCaching\n ? { type: 'text' as const, text: req.systemPrompt, cache_control: { type: 'ephemeral' as const } }\n : { type: 'text' as const, text: req.systemPrompt };\n\n const tool = {\n name: TOOL_NAME,\n description:\n 'Emit envelope JSON cho phép vẽ hình hoặc từ chối. ' +\n 'decision=\"build\" kèm figure (DSL hình học); decision=\"refuse\" kèm reason.',\n input_schema: req.schema,\n };\n\n const client = new Anthropic({ apiKey: this.opts.apiKey });\n let resp: Anthropic.Messages.Message;\n try {\n resp = await client.messages.create(\n {\n model: req.model,\n max_tokens: req.maxTokens,\n system: [systemBlock],\n tools: [tool as never],\n tool_choice: { type: 'tool', name: TOOL_NAME },\n messages: [{ role: 'user', content: req.userPrompt }],\n },\n req.signal ? { signal: req.signal } : undefined,\n );\n } catch (e) {\n const err = e as { message?: string; status?: number };\n return {\n kind: 'error',\n message: err.message ?? 'Lỗi gọi Anthropic API',\n ...(err.status !== undefined ? { status: err.status } : {}),\n };\n }\n\n const usage = toUsage(resp.usage);\n const toolUse = resp.content.find((c) => c.type === 'tool_use');\n if (!toolUse || toolUse.type !== 'tool_use') {\n return {\n kind: 'error',\n message: 'Claude không gọi tool. stop_reason=' + resp.stop_reason,\n };\n }\n if (toolUse.name !== TOOL_NAME) {\n return {\n kind: 'error',\n message: `Tool không xác định: \"${toolUse.name}\"`,\n };\n }\n return { kind: 'json', data: toolUse.input, usage };\n }\n}\n\nfunction toUsage(u: Anthropic.Messages.Usage): ProviderTokenUsage {\n return {\n inputTokens: u.input_tokens,\n outputTokens: u.output_tokens,\n cacheReadTokens: u.cache_read_input_tokens ?? 0,\n cacheCreationTokens: u.cache_creation_input_tokens ?? 0,\n };\n}\n","// src/stamps/geometry-2d/ai/providers/ollama.ts\n//\n// AIProvider impl cho Ollama local. Dùng /api/chat với `format: <jsonSchema>`\n// (Ollama v0.5+ — structured outputs). Model emit JSON đúng schema, parse +\n// trả về envelope.\n//\n// Setup local:\n// $ ollama pull gemma3:4b # ~3.3GB Q4\n// $ ollama serve # mặc định port 11434\n//\n// Override base URL qua env `OLLAMA_BASE_URL` (test env / remote ollama).\n\nimport type {\n AIProvider,\n ProviderOutput,\n ProviderRequest,\n ProviderTokenUsage,\n} from './types';\n\nconst DEFAULT_BASE_URL = 'http://localhost:11434';\nconst DEFAULT_MODEL = 'gemma3:4b';\n\nexport interface OllamaProviderOptions {\n /** Endpoint base URL, default http://localhost:11434. */\n baseUrl?: string;\n /** Default model id nếu request không truyền. */\n defaultModel?: string;\n /** Custom fetch impl (dùng cho test mock). */\n fetchImpl?: typeof fetch;\n}\n\ninterface OllamaChatResponse {\n model: string;\n message: { role: 'assistant'; content: string };\n done: boolean;\n prompt_eval_count?: number;\n eval_count?: number;\n total_duration?: number;\n}\n\nexport class OllamaProvider implements AIProvider {\n readonly name = 'ollama';\n readonly defaultModel: string;\n private readonly baseUrl: string;\n private readonly fetchImpl: typeof fetch | null;\n\n constructor(opts: OllamaProviderOptions = {}) {\n this.baseUrl = (opts.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, '');\n this.defaultModel = opts.defaultModel ?? DEFAULT_MODEL;\n // Lazy resolve: jsdom test env không có global fetch; consumer chỉ cần\n // fetch ở runtime khi gọi .call(). Custom impl ưu tiên (test mock).\n this.fetchImpl = opts.fetchImpl ?? null;\n }\n\n private resolveFetch(): typeof fetch {\n if (this.fetchImpl) return this.fetchImpl;\n if (typeof fetch === 'undefined') {\n throw new Error(\n 'OllamaProvider: global `fetch` không khả dụng. Truyền `fetchImpl` qua constructor hoặc chạy ở Node 18+ / browser.',\n );\n }\n return fetch;\n }\n\n async call(req: ProviderRequest): Promise<ProviderOutput> {\n const body = {\n model: req.model,\n messages: [\n { role: 'system', content: req.systemPrompt },\n { role: 'user', content: req.userPrompt },\n ],\n // Ollama v0.5+ structured outputs: model bị constrain emit JSON đúng schema.\n format: req.schema,\n stream: false,\n options: {\n // num_predict ≈ max_tokens\n num_predict: req.maxTokens,\n // temperature thấp cho output deterministic hơn (DSL cần consistent).\n temperature: 0.2,\n },\n };\n\n let resp: Response;\n let doFetch: typeof fetch;\n try {\n doFetch = this.resolveFetch();\n } catch (e) {\n const err = e as { message?: string };\n return { kind: 'error', message: err.message ?? 'fetch không khả dụng' };\n }\n try {\n resp = await doFetch(`${this.baseUrl}/api/chat`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(body),\n signal: req.signal,\n });\n } catch (e) {\n const err = e as { message?: string };\n return {\n kind: 'error',\n message: err.message ?? `Không kết nối được Ollama ở ${this.baseUrl}`,\n };\n }\n\n if (!resp.ok) {\n let detail = '';\n try {\n detail = await resp.text();\n } catch {\n /* ignore */\n }\n return {\n kind: 'error',\n message: `Ollama HTTP ${resp.status}: ${detail || resp.statusText}`,\n status: resp.status,\n };\n }\n\n let json: OllamaChatResponse;\n try {\n json = (await resp.json()) as OllamaChatResponse;\n } catch (e) {\n const err = e as { message?: string };\n return { kind: 'error', message: 'Ollama response không phải JSON: ' + (err.message ?? '?') };\n }\n\n const content = json.message?.content?.trim();\n if (!content) {\n return { kind: 'error', message: 'Ollama trả message.content rỗng' };\n }\n\n let data: unknown;\n try {\n data = JSON.parse(content);\n } catch (e) {\n const err = e as { message?: string };\n return {\n kind: 'error',\n message: 'Ollama content không parse được JSON: ' + (err.message ?? '?'),\n };\n }\n\n const usage: ProviderTokenUsage = {\n inputTokens: json.prompt_eval_count ?? 0,\n outputTokens: json.eval_count ?? 0,\n cacheReadTokens: 0,\n cacheCreationTokens: 0,\n };\n return { kind: 'json', data, usage };\n }\n}\n","// src/stamps/geometry-2d/ai/providers/index.ts\n//\n// Public exports + selectProvider() factory dựa trên env hoặc explicit opts.\n//\n// Quy tắc chọn provider (high → low priority):\n// 1. opts.provider — instance đã build sẵn (test/custom)\n// 2. opts.apiKey — auto-route Anthropic (backward-compat caller cũ)\n// 3. env WHITEBOARD_AI_PROVIDER\n// - \"anthropic\": cần env ANTHROPIC_API_KEY\n// - \"ollama\" (default): không cần key, đọc OLLAMA_BASE_URL tùy chọn\n\nimport { AnthropicProvider } from './anthropic';\nimport { OllamaProvider } from './ollama';\nimport type { AIProvider } from './types';\n\nexport type { AIProvider, ProviderOutput, ProviderRequest, ProviderTokenUsage } from './types';\nexport { AnthropicProvider } from './anthropic';\nexport { OllamaProvider } from './ollama';\n\nexport interface SelectProviderOptions {\n /** Provider instance dùng trực tiếp (override mọi env). */\n provider?: AIProvider;\n /** Anthropic API key. Khi truyền → auto chọn AnthropicProvider. */\n apiKey?: string;\n /** Anthropic prompt-caching, default true (chỉ áp dụng provider Anthropic). */\n enableCaching?: boolean;\n /** Ollama endpoint override. */\n ollamaBaseUrl?: string;\n /** Ollama model override (vd \"gemma3:1b\"). */\n ollamaDefaultModel?: string;\n /** Test env: env vars getter (default process.env). */\n env?: Record<string, string | undefined>;\n}\n\nexport function selectProvider(opts: SelectProviderOptions = {}): AIProvider {\n if (opts.provider) return opts.provider;\n if (opts.apiKey) {\n return new AnthropicProvider({\n apiKey: opts.apiKey,\n enableCaching: opts.enableCaching,\n });\n }\n\n const env = opts.env ?? readEnv();\n const wanted = (env.WHITEBOARD_AI_PROVIDER ?? 'ollama').toLowerCase();\n\n if (wanted === 'anthropic') {\n const key = env.ANTHROPIC_API_KEY;\n if (!key) {\n throw new Error(\n 'selectProvider: WHITEBOARD_AI_PROVIDER=anthropic nhưng thiếu env ANTHROPIC_API_KEY',\n );\n }\n return new AnthropicProvider({ apiKey: key, enableCaching: opts.enableCaching });\n }\n\n if (wanted === 'ollama') {\n return new OllamaProvider({\n baseUrl: opts.ollamaBaseUrl ?? env.OLLAMA_BASE_URL,\n defaultModel: opts.ollamaDefaultModel ?? env.OLLAMA_DEFAULT_MODEL,\n });\n }\n\n throw new Error(`selectProvider: WHITEBOARD_AI_PROVIDER=\"${wanted}\" không hợp lệ (anthropic|ollama)`);\n}\n\nfunction readEnv(): Record<string, string | undefined> {\n // process.env không tồn tại ở pure browser; ở Node/Next.js server route thì OK.\n if (typeof process !== 'undefined' && process.env) {\n return process.env as Record<string, string | undefined>;\n }\n return {};\n}\n","// src/stamps/geometry-2d/ai/buildFigure.ts\n//\n// Orchestrator: chọn provider → gọi → parse envelope → transpile DSL → State.\n// Provider-agnostic; backward-compat với caller cũ truyền `apiKey`.\n\nimport type { State as SceneState } from '../../../core/scene/types';\nimport type { DslInputT, TranspileError } from '../dsl';\nimport { transpile } from '../dsl';\nimport {\n FigureEnvelopeZ,\n envelopeBuildDsl,\n envelopeJsonSchema,\n} from './envelope';\nimport { buildSystemPrompt } from './prompt';\nimport {\n selectProvider,\n type AIProvider,\n type ProviderTokenUsage,\n type SelectProviderOptions,\n} from './providers';\n\nconst DEFAULT_MAX_TOKENS = 8192;\n\nexport interface GenerateOptions extends SelectProviderOptions {\n /** Model id override (provider-specific). Mặc định: provider.defaultModel. */\n model?: string;\n maxTokens?: number;\n signal?: AbortSignal;\n}\n\nexport interface TokenUsage {\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheCreationTokens: number;\n}\n\nexport type GenerateResult =\n | { ok: true; state: SceneState; dsl: DslInputT; usage: TokenUsage; provider: string }\n | { ok: false; reason: 'refused'; message: string; usage?: TokenUsage; provider?: string }\n | { ok: false; reason: 'parse_error'; message: string; raw?: unknown; usage?: TokenUsage; provider?: string }\n | { ok: false; reason: 'transpile_error'; message: string; errors: TranspileError[]; dsl: unknown; usage?: TokenUsage; provider?: string }\n | { ok: false; reason: 'api_error'; message: string; status?: number; provider?: string };\n\nexport async function generateFigure(\n problem: string,\n opts: GenerateOptions = {},\n): Promise<GenerateResult> {\n if (!problem || !problem.trim()) {\n return { ok: false, reason: 'api_error', message: 'Đề bài rỗng' };\n }\n\n let provider: AIProvider;\n try {\n provider = selectProvider(opts);\n } catch (e) {\n const err = e as { message?: string };\n return { ok: false, reason: 'api_error', message: err.message ?? 'Không chọn được provider' };\n }\n\n const systemPrompt = buildSystemPrompt();\n const schema = envelopeJsonSchema();\n\n const out = await provider.call({\n systemPrompt,\n userPrompt: problem,\n schema,\n model: opts.model ?? provider.defaultModel,\n maxTokens: opts.maxTokens ?? DEFAULT_MAX_TOKENS,\n signal: opts.signal,\n });\n\n if (out.kind === 'error') {\n return {\n ok: false,\n reason: 'api_error',\n message: out.message,\n ...(out.status !== undefined ? { status: out.status } : {}),\n provider: provider.name,\n };\n }\n\n const usage = toUsage(out.usage);\n\n // Validate envelope schema (refine: build cần figure, refuse cần reason).\n const parsed = FigureEnvelopeZ.safeParse(out.data);\n if (!parsed.success) {\n return {\n ok: false,\n reason: 'parse_error',\n message: 'Envelope không khớp schema: ' + parsed.error.issues.map((i) => i.message).join('; '),\n raw: out.data,\n usage,\n provider: provider.name,\n };\n }\n\n const env = parsed.data;\n if (env.decision === 'refuse') {\n return {\n ok: false,\n reason: 'refused',\n message: env.reason ?? 'AI từ chối không nêu lý do',\n usage,\n provider: provider.name,\n };\n }\n\n // decision === 'build'\n const dsl = envelopeBuildDsl(env);\n const tResult = transpile(dsl);\n if (!tResult.ok) {\n return {\n ok: false,\n reason: 'transpile_error',\n message: 'DSL từ AI không hợp lệ',\n errors: tResult.errors,\n dsl,\n usage,\n provider: provider.name,\n };\n }\n\n return {\n ok: true,\n state: tResult.state,\n dsl,\n usage,\n provider: provider.name,\n };\n}\n\nfunction toUsage(u: ProviderTokenUsage | undefined): TokenUsage {\n return {\n inputTokens: u?.inputTokens ?? 0,\n outputTokens: u?.outputTokens ?? 0,\n cacheReadTokens: u?.cacheReadTokens ?? 0,\n cacheCreationTokens: u?.cacheCreationTokens ?? 0,\n };\n}\n","// Façade trên `generateFigure()` cho HTTP transport (Vite middleware,\n// Next.js route, Cloudflare Worker, ...). Gói luôn mapping\n// `GenerateResult` → `AiFigureUiResult` (shape client-safe) để mọi consumer\n// không phải lặp lại logic.\n\nimport type { AiFigureUiResult } from '../../shared/types';\nimport { generateFigure, type GenerateOptions, type GenerateResult } from './buildFigure';\n\nexport interface HandleGenerateFigureInput {\n /** Đề bài tiếng Việt từ teacher. */\n problem: string;\n}\n\nexport interface HandleGenerateFigureOptions extends GenerateOptions {\n /**\n * Optional telemetry hook. Gọi cho MỖI attempt với envelope nội bộ trước\n * khi map sang AiFigureUiResult — consumer dùng để log usage/cost/error.\n * Không throw từ logger — sẽ swallow để không vỡ response.\n *\n * @param result GenerateResult của attempt\n * @param attempt 1-indexed (1 = lần đầu, 2 = retry, ...)\n */\n onResult?: (result: GenerateResult, attempt: number) => void;\n /**\n * Số attempt tối đa khi nhận `transpile_error`. Default 2 (1 retry).\n * AI stochastic → lần 2 thường khá hơn. Min 1, max 5.\n */\n maxAttempts?: number;\n}\n\nconst DEFAULT_MAX_ATTEMPTS = 2;\n\n/**\n * Gọi AI orchestrator và trả về kết quả ở dạng `AiFigureUiResult` mà\n * `<Whiteboard generateGeometryFigure>` chấp nhận trực tiếp.\n *\n * Auto-retry: chỉ retry khi `transpile_error` (DSL không hợp lệ — model\n * stochastic có cơ hội emit khá hơn lần 2). KHÔNG retry `refused` (AI cố ý\n * từ chối), `parse_error` (envelope sai schema — chắc chắn sai mọi lần),\n * hay `api_error` (network / config — không liên quan model).\n *\n * Mapping:\n * - ok=true → { ok: true, state }\n * - refused → { ok: false, message: <message AI gửi> }\n * - parse_error → { ok: false, message: 'AI trả JSON không hợp lệ…' }\n * - transpile_error → { ok: false, message: 'AI tạo hình không hợp lệ…' }\n * - api_error → { ok: false, message: <message gốc> }\n *\n * Server-side caller giữ `GenerateResult` đầy đủ qua `onResult` callback cho\n * mục đích telemetry/logging.\n */\nexport async function handleGenerateFigure(\n input: HandleGenerateFigureInput,\n opts: HandleGenerateFigureOptions = {},\n): Promise<AiFigureUiResult> {\n const { onResult, maxAttempts: rawMax, ...generateOpts } = opts;\n const maxAttempts = clampAttempts(rawMax ?? DEFAULT_MAX_ATTEMPTS);\n\n let lastResult: GenerateResult | null = null;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const result = await generateFigure(input.problem, generateOpts);\n lastResult = result;\n\n if (onResult) {\n try {\n onResult(result, attempt);\n } catch {\n // Không cho lỗi telemetry vỡ HTTP response.\n }\n }\n\n // Thành công → return ngay\n if (result.ok) {\n return { ok: true, state: result.state };\n }\n\n // Retry chỉ với transpile_error\n if (result.reason === 'transpile_error' && attempt < maxAttempts) {\n continue;\n }\n\n // Không retry-able hoặc đã hết attempt\n break;\n }\n\n // lastResult chắc chắn không null sau loop\n return mapErrorToUi(lastResult!);\n}\n\nfunction clampAttempts(n: number): number {\n if (!Number.isFinite(n)) return DEFAULT_MAX_ATTEMPTS;\n return Math.max(1, Math.min(5, Math.floor(n)));\n}\n\nfunction mapErrorToUi(result: GenerateResult): AiFigureUiResult {\n if (result.ok) return { ok: true, state: result.state };\n\n switch (result.reason) {\n case 'refused':\n return { ok: false, message: result.message };\n case 'parse_error':\n return {\n ok: false,\n message: 'AI trả về dữ liệu không hợp lệ. Vui lòng thử lại hoặc diễn đạt lại đề bài.',\n };\n case 'transpile_error':\n return {\n ok: false,\n message:\n 'AI tạo hình không hợp lệ (đã thử lại). Vui lòng tách thành 1 yêu cầu/lần hoặc diễn đạt khác.',\n };\n case 'api_error':\n default:\n return { ok: false, message: result.message };\n }\n}\n","// src/stamps/geometry-2d/ai/refineEnvelope.ts\n//\n// Envelope schema cho multi-step refine. AI emit 1 trong 3:\n// { decision: 'add', figure: <DSL delta> }\n// { decision: 'replace', figure: <DSL full> }\n// { decision: 'refuse', reason: '...' }\n//\n// Tách hẳn khỏi FigureEnvelopeZ (build) — decision space khác (3 thay vì 2),\n// semantics khác (delta vs full), prompt khác.\n\nimport { z } from 'zod';\nimport { zodToJsonSchema } from 'zod-to-json-schema';\nimport { DslInput } from '../dsl';\n\nexport const FigureRefineEnvelopeZ = z\n .object({\n decision: z.enum(['add', 'replace', 'refuse']),\n figure: DslInput.optional(),\n reason: z.string().optional(),\n })\n .refine(\n (e) =>\n e.decision === 'refuse'\n ? e.reason != null && e.reason.length > 0\n : e.figure != null,\n {\n message:\n 'decision=add/replace cần `figure`; decision=refuse cần `reason` không rỗng',\n },\n );\n\nexport type FigureRefineEnvelopeT = z.infer<typeof FigureRefineEnvelopeZ>;\n\nexport function refineEnvelopeJsonSchema(): Record<string, unknown> {\n return zodToJsonSchema(FigureRefineEnvelopeZ, {\n target: 'jsonSchema7',\n $refStrategy: 'none',\n }) as Record<string, unknown>;\n}\n","// src/stamps/geometry-2d/ai/refineFixtures.ts\n//\n// Refine fixtures: { name, currentDsl, instruction, expectedEnvelope }\n// Dùng cho:\n// - 6-8 đầu: few-shot trong refinePrompt\n// - Tất cả 10: integration smoke test (gated)\n//\n// Pattern: currentDsl đại diện state đã có (sau build trước), instruction là\n// chỉ thị bổ sung. expectedEnvelope là ground truth AI nên emit.\n\nimport type { DslInputT } from '../dsl/schema';\nimport type { FigureRefineEnvelopeT } from './refineEnvelope';\n\nexport interface RefineFixture {\n name: string;\n currentDsl: DslInputT;\n instruction: string;\n expectedEnvelope: FigureRefineEnvelopeT;\n}\n\nconst triangleABC: DslInputT = {\n version: 1,\n points: [\n { name: 'A', kind: 'free', x: 0, y: 3 },\n { name: 'B', kind: 'free', x: -2, y: 0 },\n { name: 'C', kind: 'free', x: 3, y: 0 },\n ],\n shapes: [{ name: 'ABC', kind: 'polygon', vertices: ['A', 'B', 'C'] }],\n};\n\nconst rightTriangleAtA: DslInputT = {\n version: 1,\n points: [\n { name: 'A', kind: 'free', x: 0, y: 0 },\n { name: 'B', kind: 'free', x: 4, y: 0 },\n { name: 'C', kind: 'free', x: 0, y: 3 },\n ],\n shapes: [{ name: 'ABC', kind: 'polygon', vertices: ['A', 'B', 'C'] }],\n};\n\nconst parallelogramABCD: DslInputT = {\n version: 1,\n points: [\n { name: 'A', kind: 'free', x: -2, y: 0 },\n { name: 'B', kind: 'free', x: 3, y: 0 },\n { name: 'C', kind: 'free', x: 4, y: 2 },\n { name: 'D', kind: 'free', x: -1, y: 2 },\n ],\n shapes: [{ name: 'ABCD', kind: 'polygon', vertices: ['A', 'B', 'C', 'D'] }],\n};\n\nconst circleOnA: DslInputT = {\n version: 1,\n points: [\n { name: 'O', kind: 'free', x: 0, y: 0 },\n { name: 'A', kind: 'free', x: 3, y: 0 },\n ],\n shapes: [{ name: 'omega', kind: 'circleCP', center: 'O', surfacePoint: 'A' }],\n};\n\nexport const REFINE_FIXTURES: RefineFixture[] = [\n {\n name: 'triangle-add-midpoint',\n currentDsl: triangleABC,\n instruction: 'Thêm trung điểm M của BC',\n expectedEnvelope: {\n decision: 'add',\n figure: {\n version: 1,\n points: [{ name: 'M', kind: 'midpoint', p1: 'B', p2: 'C' }],\n shapes: [{ name: 'AM', kind: 'segment', p1: 'A', p2: 'M' }],\n },\n },\n },\n {\n name: 'triangle-add-altitude',\n currentDsl: triangleABC,\n instruction: 'Dựng đường cao AH xuống BC',\n expectedEnvelope: {\n decision: 'add',\n figure: {\n version: 1,\n points: [{ name: 'H', kind: 'perpFoot', from: 'A', onLine: 'BC_line' }],\n shapes: [\n { name: 'BC_line', kind: 'line', p1: 'B', p2: 'C' },\n { name: 'AH', kind: 'segment', p1: 'A', p2: 'H' },\n ],\n },\n },\n },\n {\n name: 'triangle-add-circumcircle',\n currentDsl: triangleABC,\n instruction: 'Vẽ đường tròn ngoại tiếp tam giác ABC',\n expectedEnvelope: {\n decision: 'add',\n figure: {\n version: 1,\n points: [{ name: 'O', kind: 'circumcenter', vertices: ['A', 'B', 'C'] }],\n shapes: [{ name: 'omega', kind: 'circle3', p1: 'A', p2: 'B', p3: 'C' }],\n },\n },\n },\n {\n name: 'right-triangle-add-centroid',\n currentDsl: rightTriangleAtA,\n instruction: 'Thêm trọng tâm G của tam giác',\n expectedEnvelope: {\n decision: 'add',\n figure: {\n version: 1,\n points: [{ name: 'G', kind: 'centroid', vertices: ['A', 'B', 'C'] }],\n shapes: [],\n },\n },\n },\n {\n name: 'parallelogram-add-diagonals',\n currentDsl: parallelogramABCD,\n instruction: 'Vẽ hai đường chéo AC, BD và giao điểm O',\n expectedEnvelope: {\n decision: 'add',\n figure: {\n version: 1,\n points: [{ name: 'O', kind: 'intersection', ref1: 'AC', ref2: 'BD' }],\n shapes: [\n { name: 'AC', kind: 'segment', p1: 'A', p2: 'C' },\n { name: 'BD', kind: 'segment', p1: 'B', p2: 'D' },\n ],\n },\n },\n },\n {\n name: 'circle-add-tangent',\n currentDsl: circleOnA,\n instruction: 'Kẻ tiếp tuyến tại A của đường tròn',\n expectedEnvelope: {\n decision: 'add',\n figure: {\n version: 1,\n points: [],\n shapes: [{ name: 't', kind: 'tangent', throughPoint: 'A', toCircle: 'omega' }],\n },\n },\n },\n {\n name: 'triangle-replace-equilateral',\n currentDsl: triangleABC,\n instruction: 'Bỏ tam giác này, vẽ tam giác đều ABC thay vào',\n expectedEnvelope: {\n decision: 'replace',\n figure: {\n version: 1,\n points: [\n { name: 'A', kind: 'free', x: 0, y: 2 },\n { name: 'B', kind: 'free', x: -1.732, y: -1 },\n { name: 'C', kind: 'free', x: 1.732, y: -1 },\n ],\n shapes: [{ name: 'ABC', kind: 'polygon', vertices: ['A', 'B', 'C'] }],\n },\n },\n },\n {\n name: 'triangle-replace-rhombus',\n currentDsl: triangleABC,\n instruction: 'Đổi sang hình thoi ABCD',\n expectedEnvelope: {\n decision: 'replace',\n figure: {\n version: 1,\n points: [\n { name: 'A', kind: 'free', x: -2, y: 0 },\n { name: 'B', kind: 'free', x: 0, y: 1.5 },\n { name: 'C', kind: 'free', x: 2, y: 0 },\n { name: 'D', kind: 'free', x: 0, y: -1.5 },\n ],\n shapes: [{ name: 'ABCD', kind: 'polygon', vertices: ['A', 'B', 'C', 'D'] }],\n },\n },\n },\n {\n name: 'refuse-calculation',\n currentDsl: triangleABC,\n instruction: 'Tính diện tích tam giác ABC',\n expectedEnvelope: {\n decision: 'refuse',\n reason: 'Yêu cầu tính toán, không phải vẽ hình.',\n },\n },\n {\n name: 'refuse-3d',\n currentDsl: triangleABC,\n instruction: 'Vẽ hình chóp SABC với S nằm trên tam giác',\n expectedEnvelope: {\n decision: 'refuse',\n reason: 'Hình 3D ngoài phạm vi geometry-2d.',\n },\n },\n];\n\n/** 8 fixture đầu dùng cho few-shot prompt (bỏ 2 refuse cuối để prompt không bias refuse). */\nexport const REFINE_PROMPT_FIXTURES = REFINE_FIXTURES.slice(0, 8);\n","// src/stamps/geometry-2d/ai/refinePrompt.ts\n//\n// System prompt cho refine mode. Inject currentDsl JSON + list tên đã dùng\n// để AI emit delta hợp lệ. Few-shot examples từ REFINE_PROMPT_FIXTURES.\n\nimport type { DslInputT } from '../dsl/schema';\nimport { REFINE_PROMPT_FIXTURES } from './refineFixtures';\n\nfunction namesOf(dsl: DslInputT): { points: string[]; shapes: string[] } {\n return {\n points: dsl.points.map((p) => p.name),\n shapes: dsl.shapes.map((s) => s.name),\n };\n}\n\nexport function buildRefineSystemPrompt(currentDsl: DslInputT): string {\n const names = namesOf(currentDsl);\n const examples = REFINE_PROMPT_FIXTURES.map((f, i) => {\n const env = f.expectedEnvelope;\n return `### Ví dụ ${i + 1}\n**Hình hiện tại:**\n${JSON.stringify(f.currentDsl, null, 2)}\n**Yêu cầu chỉnh sửa:** ${f.instruction}\n**Output:**\n${JSON.stringify(env, null, 2)}`;\n }).join('\\n\\n');\n\n return `Bạn là trợ lý vẽ hình học 2D. Học sinh đã có HÌNH HIỆN TẠI và muốn THÊM/SỬA.\n\n## Hình hiện tại (DSL JSON)\n${JSON.stringify(currentDsl, null, 2)}\n\n## Tên đã dùng (KHÔNG được redefine)\npoints: ${names.points.join(', ') || '(chưa có)'}\nshapes: ${names.shapes.join(', ') || '(chưa có)'}\n\n## Nhiệm vụ\nĐọc YÊU CẦU CHỈNH SỬA → emit JSON envelope đúng 1 trong 3 dạng:\n\n { \"decision\": \"add\", \"figure\": <DSL chỉ chứa entity MỚI> }\n { \"decision\": \"replace\", \"figure\": <DSL hoàn chỉnh thay thế hình cũ> }\n { \"decision\": \"refuse\", \"reason\": \"lý do tiếng Việt\" }\n\n## Khi nào dùng decision nào?\n- **\"add\"**: user muốn THÊM primitive vào hình hiện tại (vd: \"thêm trung điểm M của BC\", \"dựng đường cao AH\").\n → figure chỉ chứa point/shape MỚI. Ref tên cũ (A, B, C, …) là OK. KHÔNG redefine tên cũ.\n- **\"replace\"**: user muốn vẽ LẠI hoặc đổi sang hình khác hẳn (vd: \"vẽ tam giác đều thay vào\", \"bỏ tam giác, dựng hình thoi\").\n → figure đầy đủ như prompt mới (giống mode build).\n- **\"refuse\"**: yêu cầu ngoài phạm vi (3D, lượng giác, biến hình lớp 11+, tính toán đại số).\n\n## Quy tắc decision=add\n1. Mọi name MỚI KHÔNG được trùng với tên đã dùng ở trên. Trùng → đặt khác (M', M1, …).\n2. ƯU TIÊN derived points: midpoint, perpFoot, intersection, circumcenter, incenter, centroid, orthocenter.\n3. Ref tới tên cũ (A, B, C) là OK — AI biết các tên đó tồn tại.\n4. KHÔNG copy lại entity cũ vào figure delta (delta chỉ chứa cái MỚI).\n\n## Anti-pattern (BẮT BUỘC tránh)\n- KHÔNG redefine tên đã dùng (A, B, C đã có → KHÔNG đặt lại).\n- KHÔNG ref tới tên chưa có ngoài \"Tên đã dùng\" + tên vừa định nghĩa trong delta.\n- KHÔNG emit add với figure chứa cả entity cũ (đó là replace).\n\n## Primitives sẵn có\n**Points:** free, midpoint, onSegment, onLine, onCircle, perpFoot, circumcenter, incenter, centroid, orthocenter, intersection\n**Shapes:** segment, line, ray, polygon, perpendicular, parallel, perpBisector, angleBisector, tangent, circleCP, circle3\n\n## ${REFINE_PROMPT_FIXTURES.length} ví dụ\n\n${examples}\n\nTrả về CHỈ 1 JSON object đúng schema. Không có lời dẫn, không markdown fence.`;\n}\n","// src/stamps/geometry-2d/ai/buildFigureDelta.ts\n//\n// Orchestrator cho multi-step refine. Mirror buildFigure.ts với differences:\n// - Schema: FigureRefineEnvelopeZ (3 decision: add/replace/refuse)\n// - Prompt: buildRefineSystemPrompt(currentDsl)\n// - Merge: decision=add concat currentDsl + delta → transpile()\n// decision=replace transpile envelope.figure alone\n// - Errors: lift DUPLICATE_NAME → name_collision, UNKNOWN_REF → unresolved_ref\n\nimport type { State as SceneState } from '../../../core/scene/types';\nimport type { DslInputT, TranspileError } from '../dsl';\nimport { transpile } from '../dsl';\nimport {\n FigureRefineEnvelopeZ,\n refineEnvelopeJsonSchema,\n} from './refineEnvelope';\nimport { buildRefineSystemPrompt } from './refinePrompt';\nimport {\n selectProvider,\n type AIProvider,\n type ProviderTokenUsage,\n type SelectProviderOptions,\n} from './providers';\n\nconst DEFAULT_MAX_TOKENS = 8192;\n\nexport interface GenerateDeltaOptions extends SelectProviderOptions {\n model?: string;\n maxTokens?: number;\n signal?: AbortSignal;\n maxAttempts?: number;\n}\n\nexport interface TokenUsage {\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheCreationTokens: number;\n}\n\nexport type GenerateDeltaResult =\n | {\n ok: true;\n state: SceneState;\n mergedDsl: DslInputT;\n mode: 'add' | 'replace';\n usage: TokenUsage;\n provider: string;\n }\n | { ok: false; reason: 'refused'; message: string; usage?: TokenUsage; provider?: string }\n | { ok: false; reason: 'parse_error'; message: string; raw?: unknown; usage?: TokenUsage; provider?: string }\n | {\n ok: false;\n reason: 'transpile_error';\n message: string;\n errors: TranspileError[];\n dsl: unknown;\n usage?: TokenUsage;\n provider?: string;\n }\n | {\n ok: false;\n reason: 'name_collision';\n message: string;\n collisions: string[];\n errors: TranspileError[];\n dsl: unknown;\n usage?: TokenUsage;\n provider?: string;\n }\n | {\n ok: false;\n reason: 'unresolved_ref';\n message: string;\n refs: string[];\n errors: TranspileError[];\n dsl: unknown;\n usage?: TokenUsage;\n provider?: string;\n }\n | { ok: false; reason: 'api_error'; message: string; status?: number; provider?: string };\n\nexport interface GenerateFigureDeltaInput {\n problem: string;\n currentDsl: DslInputT;\n}\n\nexport async function generateFigureDelta(\n input: GenerateFigureDeltaInput,\n opts: GenerateDeltaOptions = {},\n): Promise<GenerateDeltaResult> {\n const { problem, currentDsl } = input;\n\n if (!problem || !problem.trim()) {\n return { ok: false, reason: 'api_error', message: 'Đề bài rỗng' };\n }\n\n let provider: AIProvider;\n try {\n provider = selectProvider(opts);\n } catch (e) {\n const err = e as { message?: string };\n return { ok: false, reason: 'api_error', message: err.message ?? 'Không chọn được provider' };\n }\n\n const systemPrompt = buildRefineSystemPrompt(currentDsl);\n const schema = refineEnvelopeJsonSchema();\n\n const out = await provider.call({\n systemPrompt,\n userPrompt: problem,\n schema,\n model: opts.model ?? provider.defaultModel,\n maxTokens: opts.maxTokens ?? DEFAULT_MAX_TOKENS,\n signal: opts.signal,\n });\n\n if (out.kind === 'error') {\n return {\n ok: false,\n reason: 'api_error',\n message: out.message,\n ...(out.status !== undefined ? { status: out.status } : {}),\n provider: provider.name,\n };\n }\n\n const usage = toUsage(out.usage);\n\n const parsed = FigureRefineEnvelopeZ.safeParse(out.data);\n if (!parsed.success) {\n return {\n ok: false,\n reason: 'parse_error',\n message: 'Envelope không khớp schema: ' + parsed.error.issues.map((i) => i.message).join('; '),\n raw: out.data,\n usage,\n provider: provider.name,\n };\n }\n\n const env = parsed.data;\n\n if (env.decision === 'refuse') {\n return {\n ok: false,\n reason: 'refused',\n message: env.reason ?? 'AI từ chối không nêu lý do',\n usage,\n provider: provider.name,\n };\n }\n\n if (env.decision === 'replace') {\n const figure = env.figure! as unknown as DslInputT;\n const tResult = transpile(figure);\n if (!tResult.ok) {\n return liftTranspileError(tResult.errors, figure, usage, provider.name);\n }\n return {\n ok: true,\n state: tResult.state,\n mergedDsl: figure,\n mode: 'replace',\n usage,\n provider: provider.name,\n };\n }\n\n // decision === 'add'\n const delta = env.figure! as unknown as DslInputT;\n const merged: DslInputT = {\n version: 1,\n points: [...currentDsl.points, ...delta.points],\n shapes: [...currentDsl.shapes, ...delta.shapes],\n };\n\n const tResult = transpile(merged);\n if (!tResult.ok) {\n return liftTranspileError(tResult.errors, merged, usage, provider.name);\n }\n\n return {\n ok: true,\n state: tResult.state,\n mergedDsl: merged,\n mode: 'add',\n usage,\n provider: provider.name,\n };\n}\n\nfunction liftTranspileError(\n errors: TranspileError[],\n dsl: DslInputT,\n usage: TokenUsage,\n providerName: string,\n): GenerateDeltaResult {\n const dupes = errors.filter((e) => e.code === 'DUPLICATE_NAME');\n if (dupes.length > 0) {\n const collisions = Array.from(new Set(dupes.flatMap((e) => e.path ?? []).filter(Boolean)));\n return {\n ok: false,\n reason: 'name_collision',\n message:\n 'AI tạo entity trùng tên với hình hiện tại: ' +\n (collisions.length > 0 ? collisions.join(', ') : 'không xác định'),\n collisions,\n errors,\n dsl,\n usage,\n provider: providerName,\n };\n }\n\n const unresolved = errors.filter((e) => e.code === 'UNKNOWN_REF');\n if (unresolved.length > 0) {\n const refs = Array.from(new Set(unresolved.flatMap((e) => e.path ?? []).filter(Boolean)));\n return {\n ok: false,\n reason: 'unresolved_ref',\n message:\n 'AI tham chiếu tên không có: ' +\n (refs.length > 0 ? refs.join(', ') : 'không xác định'),\n refs,\n errors,\n dsl,\n usage,\n provider: providerName,\n };\n }\n\n return {\n ok: false,\n reason: 'transpile_error',\n message: 'DSL từ AI không hợp lệ',\n errors,\n dsl,\n usage,\n provider: providerName,\n };\n}\n\nfunction toUsage(u: ProviderTokenUsage | undefined): TokenUsage {\n return {\n inputTokens: u?.inputTokens ?? 0,\n outputTokens: u?.outputTokens ?? 0,\n cacheReadTokens: u?.cacheReadTokens ?? 0,\n cacheCreationTokens: u?.cacheCreationTokens ?? 0,\n };\n}\n","// src/stamps/geometry-2d/ai/handleGenerateFigureDelta.ts\n//\n// Façade cho generateFigureDelta. Mirror handleGenerateFigure.ts với:\n// - Input thêm currentDsl\n// - Map name_collision + unresolved_ref → friendly Vietnamese message\n// - Retry chỉ với transpile_error (như handleGenerateFigure)\n\nimport type { AiFigureUiResult } from '../../shared/types';\nimport type { DslInputT } from '../dsl';\nimport {\n generateFigureDelta,\n type GenerateDeltaOptions,\n type GenerateDeltaResult,\n} from './buildFigureDelta';\n\nexport interface HandleGenerateFigureDeltaInput {\n problem: string;\n currentDsl: DslInputT;\n}\n\nexport interface HandleGenerateFigureDeltaOptions extends GenerateDeltaOptions {\n onResult?: (result: GenerateDeltaResult, attempt: number) => void;\n maxAttempts?: number;\n}\n\nconst DEFAULT_MAX_ATTEMPTS = 2;\n\nexport async function handleGenerateFigureDelta(\n input: HandleGenerateFigureDeltaInput,\n opts: HandleGenerateFigureDeltaOptions = {},\n): Promise<AiFigureUiResult> {\n const { onResult, maxAttempts: rawMax, ...generateOpts } = opts;\n const maxAttempts = clampAttempts(rawMax ?? DEFAULT_MAX_ATTEMPTS);\n\n let lastResult: GenerateDeltaResult | null = null;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const result = await generateFigureDelta(input, generateOpts);\n lastResult = result;\n\n if (onResult) {\n try {\n onResult(result, attempt);\n } catch {\n // Không cho lỗi telemetry vỡ HTTP response.\n }\n }\n\n if (result.ok) {\n return { ok: true, state: result.state };\n }\n\n if (result.reason === 'transpile_error' && attempt < maxAttempts) {\n continue;\n }\n\n break;\n }\n\n return mapErrorToUi(lastResult!);\n}\n\nfunction clampAttempts(n: number): number {\n if (!Number.isFinite(n)) return DEFAULT_MAX_ATTEMPTS;\n return Math.max(1, Math.min(5, Math.floor(n)));\n}\n\nfunction mapErrorToUi(result: GenerateDeltaResult): AiFigureUiResult {\n if (result.ok) return { ok: true, state: result.state };\n\n switch (result.reason) {\n case 'refused':\n return { ok: false, message: result.message };\n case 'parse_error':\n return {\n ok: false,\n message: 'AI trả về dữ liệu không hợp lệ. Vui lòng thử lại hoặc diễn đạt lại.',\n };\n case 'transpile_error':\n return {\n ok: false,\n message:\n 'AI tạo hình không hợp lệ (đã thử lại). Vui lòng tách thành 1 yêu cầu/lần hoặc diễn đạt khác.',\n };\n case 'name_collision':\n return {\n ok: false,\n message: `AI tạo điểm trùng tên với hình hiện tại (${result.collisions.join(', ')}). Vui lòng diễn đạt lại.`,\n };\n case 'unresolved_ref':\n return {\n ok: false,\n message: `AI tham chiếu sai tên đối tượng (${result.refs.join(', ')}). Vui lòng diễn đạt lại.`,\n };\n case 'api_error':\n default:\n return { ok: false, message: result.message };\n }\n}\n"]}
|