@xom11/whiteboard 0.24.1 → 0.24.2
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 +1 -1
- package/dist/ai.d.mts +616 -0
- package/dist/ai.d.ts +616 -0
- package/dist/ai.js +1036 -0
- package/dist/ai.js.map +1 -0
- package/dist/ai.mjs +999 -0
- package/dist/ai.mjs.map +1 -0
- package/dist/catalog.json +4 -4
- package/dist/{chunk-4D5CSIJO.mjs → chunk-2WF6KIGF.mjs} +4 -3
- package/dist/chunk-2WF6KIGF.mjs.map +1 -0
- package/dist/{chunk-WWMQ2VHZ.mjs → chunk-45CGKJ7S.mjs} +4 -4
- package/dist/{chunk-WWMQ2VHZ.mjs.map → chunk-45CGKJ7S.mjs.map} +1 -1
- package/dist/{chunk-CRAPWQKJ.mjs → chunk-4DS3MKID.mjs} +4 -4
- package/dist/{chunk-CRAPWQKJ.mjs.map → chunk-4DS3MKID.mjs.map} +1 -1
- package/dist/chunk-73Q7ADVL.mjs +35 -0
- package/dist/chunk-73Q7ADVL.mjs.map +1 -0
- package/dist/{chunk-YIPI3WUL.mjs → chunk-7WQXXEVR.mjs} +4 -4
- package/dist/{chunk-YIPI3WUL.mjs.map → chunk-7WQXXEVR.mjs.map} +1 -1
- package/dist/{chunk-CSCF3YFZ.mjs → chunk-BEZSQKPY.mjs} +4 -3
- package/dist/chunk-BEZSQKPY.mjs.map +1 -0
- package/dist/{chunk-MFOGFFIL.mjs → chunk-CGZZO4BX.mjs} +5 -4
- package/dist/chunk-CGZZO4BX.mjs.map +1 -0
- package/dist/{chunk-IBTRMWD6.mjs → chunk-KRC2XOIG.mjs} +3 -3
- package/dist/{chunk-IBTRMWD6.mjs.map → chunk-KRC2XOIG.mjs.map} +1 -1
- package/dist/{chunk-6V4SH4JJ.mjs → chunk-WM2VDYQA.mjs} +4 -34
- package/dist/chunk-WM2VDYQA.mjs.map +1 -0
- package/dist/geometry-2d.d.mts +2 -1
- package/dist/geometry-2d.d.ts +2 -1
- package/dist/geometry-2d.mjs +5 -4
- package/dist/geometry-3d.d.mts +2 -1
- package/dist/geometry-3d.d.ts +2 -1
- package/dist/geometry-3d.mjs +4 -3
- package/dist/graph-2d.d.mts +2 -1
- package/dist/graph-2d.d.ts +2 -1
- package/dist/graph-2d.mjs +4 -3
- package/dist/{host-DOAYVL35.mjs → host-EPZCNFLH.mjs} +8 -7
- package/dist/host-EPZCNFLH.mjs.map +1 -0
- package/dist/{host-GKNQBBUE.mjs → host-LKCMYEAV.mjs} +7 -6
- package/dist/host-LKCMYEAV.mjs.map +1 -0
- package/dist/{host-TLIXN4CF.mjs → host-ZIQ77W33.mjs} +6 -5
- package/dist/host-ZIQ77W33.mjs.map +1 -0
- package/dist/index.d.mts +4 -616
- package/dist/index.d.ts +4 -616
- package/dist/index.js +28 -1028
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +17 -1009
- package/dist/index.mjs.map +1 -1
- package/dist/latex.d.mts +2 -1
- package/dist/latex.d.ts +2 -1
- package/dist/serialize-JAVOU22E.mjs +7 -0
- package/dist/{serialize-3NZS6A6Q.mjs.map → serialize-JAVOU22E.mjs.map} +1 -1
- package/dist/{types-rA4slL08.d.mts → types-Crbefnfe.d.ts} +2 -49
- package/dist/types-DxlMPh-6.d.mts +49 -0
- package/dist/types-DxlMPh-6.d.ts +49 -0
- package/dist/{types-rA4slL08.d.ts → types-vtvyKGAA.d.mts} +2 -49
- package/package.json +6 -1
- package/dist/chunk-4D5CSIJO.mjs.map +0 -1
- package/dist/chunk-6V4SH4JJ.mjs.map +0 -1
- package/dist/chunk-CSCF3YFZ.mjs.map +0 -1
- package/dist/chunk-MFOGFFIL.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/serialize-3NZS6A6Q.mjs +0 -6
package/dist/ai.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../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/emitPoint.ts","../src/stamps/geometry-2d/dsl/transpile/emitShape.ts","../src/stamps/geometry-2d/dsl/transpile.ts","../src/stamps/geometry-2d/ai/provider.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/ai/prompt.ts","../src/stamps/geometry-2d/ai/tools.ts","../src/stamps/geometry-2d/ai/buildFigure.ts"],"names":["z","Anthropic","fixture","zodToJsonSchema"],"mappings":"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","file":"ai.js","sourcesContent":["// src/stamps/geometry-2d/dsl/schema.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\nexport const DslPoint = z.discriminatedUnion('kind', [\n z.object({ name: NameZ, kind: z.literal('free'),\n x: z.number().finite(), y: z.number().finite() }),\n z.object({ name: NameZ, kind: z.literal('midpoint'),\n p1: NameZ, p2: NameZ }),\n z.object({ name: NameZ, kind: z.literal('onSegment'),\n segmentId: NameZ, t: z.number().min(0).max(1) }),\n z.object({ name: NameZ, kind: z.literal('onLine'),\n lineId: NameZ, t: z.number().finite() }),\n z.object({ name: NameZ, kind: z.literal('onCircle'),\n circleId: NameZ, theta: z.number().finite() }),\n z.object({ name: NameZ, kind: z.literal('perpFoot'),\n from: NameZ, onLine: NameZ }),\n z.object({ name: NameZ, kind: z.literal('circumcenter'),\n vertices: z.tuple([NameZ, NameZ, NameZ]) }),\n z.object({ name: NameZ, kind: z.literal('incenter'),\n vertices: z.tuple([NameZ, NameZ, NameZ]) }),\n z.object({ name: NameZ, kind: z.literal('centroid'),\n vertices: z.tuple([NameZ, NameZ, NameZ]) }),\n z.object({ name: NameZ, kind: z.literal('orthocenter'),\n vertices: z.tuple([NameZ, NameZ, NameZ]) }),\n z.object({ name: NameZ, kind: z.literal('intersection'),\n ref1: NameZ, ref2: NameZ,\n branch: z.union([z.literal(0), z.literal(1)]).optional() }),\n]);\n\nexport const DslShape = z.discriminatedUnion('kind', [\n z.object({ name: NameZ, kind: z.literal('segment'),\n p1: NameZ, p2: NameZ }),\n z.object({ name: NameZ, kind: z.literal('line'),\n p1: NameZ, p2: NameZ }),\n z.object({ name: NameZ, kind: z.literal('ray'),\n origin: NameZ, through: NameZ }),\n z.object({ name: NameZ, kind: z.literal('polygon'),\n vertices: z.array(NameZ).min(3) }),\n // Line constructions\n z.object({ name: NameZ, kind: z.literal('perpendicular'),\n throughPoint: NameZ, toLine: NameZ }),\n z.object({ name: NameZ, kind: z.literal('parallel'),\n throughPoint: NameZ, toLine: NameZ }),\n z.object({ name: NameZ, kind: z.literal('perpBisector'),\n p1: NameZ, p2: NameZ }),\n z.object({ name: NameZ, kind: z.literal('angleBisector'),\n p1: NameZ, vertex: NameZ, p2: NameZ }),\n z.object({ name: NameZ, kind: z.literal('tangent'),\n throughPoint: NameZ, toCircle: NameZ,\n branch: z.union([z.literal(0), z.literal(1), z.literal('on')]).optional() }),\n // Circle constructions\n z.object({ name: NameZ, kind: z.literal('circleCP'),\n center: NameZ, surfacePoint: NameZ }),\n z.object({ name: NameZ, kind: z.literal('circle3'),\n p1: NameZ, p2: NameZ, p3: NameZ }),\n]);\n\nexport const DslInput = z.object({\n version: z.literal(1),\n points: z.array(DslPoint),\n shapes: z.array(DslShape).default([]),\n});\n\nexport type DslPointT = z.infer<typeof DslPoint>;\nexport type DslShapeT = z.infer<typeof DslShape>;\nexport type DslInputT = z.infer<typeof DslInput>;\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 type { Symbol } from './symbols';\nimport { mkError, type TranspileError } from './errors';\n\n// \"Point-like\" = DslPoint of any kind. State sẽ emit `kind: 'point'` hoặc\n// `kind: 'intersection'`; cả hai visualize as points.\nfunction isPointLike(sym: Symbol | undefined): boolean {\n return !!sym && sym.role === 'point';\n}\n\n// \"Line-like\" gồm: line / segment / ray + 5 line-constructions.\nconst LINE_LIKE_SHAPE_KINDS = new Set<DslShapeT['kind']>([\n 'line', 'segment', 'ray',\n 'perpendicular', 'parallel', 'perpBisector', 'angleBisector', 'tangent',\n]);\n\nconst CIRCLE_KINDS = new Set<DslShapeT['kind']>(['circleCP', 'circle3']);\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 if ('kind' in entity) {\n switch (entity.kind) {\n case 'free': return [];\n case 'midpoint': return [entity.p1, entity.p2];\n case 'onSegment': return [entity.segmentId];\n case 'onLine': return [entity.lineId];\n case 'onCircle': return [entity.circleId];\n case 'perpFoot': return [entity.from, entity.onLine];\n case 'circumcenter':\n case 'incenter':\n case 'centroid':\n case 'orthocenter': return [...entity.vertices];\n case 'intersection': return [entity.ref1, entity.ref2];\n case 'segment':\n case 'line': return [entity.p1, entity.p2];\n case 'ray': return [entity.origin, entity.through];\n case 'polygon': return [...entity.vertices];\n case 'perpendicular':\n case 'parallel': return [entity.throughPoint, entity.toLine];\n case 'perpBisector': return [entity.p1, entity.p2];\n case 'angleBisector':return [entity.p1, entity.vertex, entity.p2];\n case 'tangent': return [entity.throughPoint, entity.toCircle];\n case 'circleCP': return [entity.center, entity.surfacePoint];\n case 'circle3': return [entity.p1, entity.p2, entity.p3];\n }\n }\n return [];\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 { DslPointT, DslShapeT } from '../schema';\nimport type { Symbol } from './symbols';\n\ntype Prefix = 'p' | 'i' | 's' | 'l' | 'r' | 'poly' | 'c';\n\nfunction prefixFor(sym: Symbol): Prefix {\n if (sym.role === 'point') {\n const p = sym.entity as DslPointT;\n return p.kind === 'intersection' ? 'i' : 'p';\n }\n const s = sym.entity as DslShapeT;\n switch (s.kind) {\n case 'segment': return 's';\n case 'ray': return 'r';\n case 'polygon': return 'poly';\n case 'circleCP':\n case 'circle3': return 'c';\n // line + 5 line-constructions all share 'l'\n case 'line':\n case 'perpendicular':\n case 'parallel':\n case 'perpBisector':\n case 'angleBisector':\n case 'tangent': return 'l';\n }\n}\n\nexport function assignIds(symbols: Map<string, Symbol>): Map<string, string> {\n const counters: Record<Prefix, number> = { p: 0, i: 0, s: 0, l: 0, r: 0, poly: 0, c: 0 };\n const ids = new Map<string, string>();\n // Insertion order của Map khớp DSL order (points first, shapes after) — buildSymbols guarantee.\n for (const [name, sym] of symbols.entries()) {\n const prefix = prefixFor(sym);\n counters[prefix] += 1;\n ids.set(name, `${prefix}${counters[prefix]}`);\n }\n return ids;\n}\n","// src/stamps/geometry-2d/dsl/transpile/emitPoint.ts\nimport type { SceneObject } from '../../../../core/scene/types';\nimport type { DslPointT } from '../schema';\n\nexport type EntityKindHint =\n | 'point'\n | 'line' // DslShape 'line'\n | 'segment'\n | 'ray'\n | 'lineConstruction' // perpendicular/parallel/perpBisector/angleBisector/tangent\n | 'circle';\n\nfunction resolveId(ids: Map<string, string>, name: string): string {\n const id = ids.get(name);\n if (!id) throw new Error(`emitPoint: id not assigned for \"${name}\"`);\n return id;\n}\n\nexport function emitPoint(\n p: DslPointT,\n ids: Map<string, string>,\n kindHints: Map<string, EntityKindHint>,\n): SceneObject {\n const baseId = resolveId(ids, p.name);\n\n const baseFields = {\n label: p.name,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n };\n\n if (p.kind === 'intersection') {\n const r1Hint = kindHints.get(p.ref1);\n const r2Hint = kindHints.get(p.ref2);\n const r1IsCircle = r1Hint === 'circle';\n const r2IsCircle = r2Hint === '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: resolveId(ids, p.ref1),\n ref2: resolveId(ids, p.ref2),\n };\n if (intersectKind !== 'lineLine') {\n attrs.branch = p.branch ?? 0;\n }\n return {\n id: baseId,\n kind: 'intersection',\n ...baseFields,\n attrs,\n };\n }\n\n let constraint: Record<string, unknown>;\n switch (p.kind) {\n case 'free':\n constraint = { kind: 'free', x: p.x, y: p.y };\n break;\n case 'midpoint':\n constraint = { kind: 'midpoint', p1: resolveId(ids, p.p1), p2: resolveId(ids, p.p2) };\n break;\n case 'onSegment':\n constraint = { kind: 'onSegment', segmentId: resolveId(ids, p.segmentId), t: p.t };\n break;\n case 'onLine':\n constraint = { kind: 'onLine', lineId: resolveId(ids, p.lineId), t: p.t };\n break;\n case 'onCircle':\n constraint = { kind: 'onCircle', circleId: resolveId(ids, p.circleId), theta: p.theta };\n break;\n case 'perpFoot':\n constraint = { kind: 'perpFoot', from: resolveId(ids, p.from), onLine: resolveId(ids, p.onLine) };\n break;\n case 'circumcenter':\n case 'incenter':\n case 'centroid':\n case 'orthocenter':\n constraint = {\n kind: p.kind,\n vertices: [resolveId(ids, p.vertices[0]), resolveId(ids, p.vertices[1]), resolveId(ids, p.vertices[2])],\n };\n break;\n }\n\n return {\n id: baseId,\n kind: 'point',\n ...baseFields,\n attrs: { constraint },\n };\n}\n","// src/stamps/geometry-2d/dsl/transpile/emitShape.ts\nimport type { SceneObject } from '../../../../core/scene/types';\nimport type { DslShapeT } from '../schema';\n\nfunction r(ids: Map<string, string>, name: string): string {\n const id = ids.get(name);\n if (!id) throw new Error(`emitShape: id not assigned for \"${name}\"`);\n return id;\n}\n\nexport function emitShape(s: DslShapeT, ids: Map<string, string>): SceneObject {\n const id = r(ids, s.name);\n const base = {\n label: s.name,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n };\n\n switch (s.kind) {\n case 'segment':\n return { id, kind: 'segment', ...base, attrs: { p1: r(ids, s.p1), p2: r(ids, s.p2) } };\n\n case 'line':\n return { id, kind: 'line', ...base, attrs: { p1: r(ids, s.p1), p2: r(ids, s.p2) } };\n\n case 'ray':\n return { id, kind: 'ray', ...base, attrs: { origin: r(ids, s.origin), through: r(ids, s.through) } };\n\n case 'polygon':\n return { id, kind: 'polygon', ...base, attrs: { vertices: s.vertices.map((v) => r(ids, v)) } };\n\n case 'perpendicular':\n case 'parallel':\n return {\n id, kind: 'line', ...base,\n attrs: { construction: { kind: s.kind, throughPoint: r(ids, s.throughPoint), toLine: r(ids, s.toLine) } },\n };\n\n case 'perpBisector':\n return {\n id, kind: 'line', ...base,\n attrs: { construction: { kind: 'perpBisector', p1: r(ids, s.p1), p2: r(ids, s.p2) } },\n };\n\n case 'angleBisector':\n return {\n id, kind: 'line', ...base,\n attrs: { construction: { kind: 'angleBisector', p1: r(ids, s.p1), vertex: r(ids, s.vertex), p2: r(ids, s.p2) } },\n };\n\n case 'tangent': {\n const construction: Record<string, unknown> = {\n kind: 'tangent',\n throughPoint: r(ids, s.throughPoint),\n toCircle: r(ids, s.toCircle),\n };\n if (s.branch !== undefined) construction.branch = s.branch;\n return { id, kind: 'line', ...base, attrs: { construction } };\n }\n\n case 'circleCP':\n return {\n id, kind: 'circle', ...base,\n attrs: { center: r(ids, s.center), surfacePoint: r(ids, s.surfacePoint) },\n };\n\n case 'circle3':\n return {\n id, kind: 'circle', ...base,\n attrs: { construction: { kind: 'circumscribed', p1: r(ids, s.p1), p2: r(ids, s.p2), p3: r(ids, s.p3) } },\n };\n }\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 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 { emitPoint, type EntityKindHint } from './transpile/emitPoint';\nimport { emitShape } from './transpile/emitShape';\nimport { mkError, type TranspileError, type TranspileResult } from './transpile/errors';\n\nfunction hintOf(entity: DslPointT | DslShapeT): EntityKindHint {\n // points (including intersection) are point-like at scene level.\n if ('kind' in entity) {\n switch (entity.kind) {\n case 'free': case 'midpoint': case 'onSegment': case 'onLine':\n case 'onCircle': case 'perpFoot': case 'circumcenter':\n case 'incenter': case 'centroid': case 'orthocenter': case 'intersection':\n return 'point';\n case 'segment': return 'segment';\n case 'line': return 'line';\n case 'ray': return 'ray';\n case 'polygon': return 'point'; // not used as ref target in MVP\n case 'perpendicular': case 'parallel': case 'perpBisector':\n case 'angleBisector': case 'tangent':\n return 'lineConstruction';\n case 'circleCP': case 'circle3':\n return 'circle';\n }\n }\n return 'point';\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 const dsl = parsed.data;\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\n const objects: Record<string, SceneObject> = {};\n const order: string[] = [];\n\n for (const p of dsl.points) {\n const obj = emitPoint(p, ids, kindHints);\n objects[obj.id] = obj;\n order.push(obj.id);\n }\n for (const s of dsl.shapes) {\n const obj = emitShape(s, ids);\n objects[obj.id] = obj;\n order.push(obj.id);\n }\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/provider.ts\nimport Anthropic from '@anthropic-ai/sdk';\n\nexport interface ProviderSystemBlock {\n type: 'text';\n text: string;\n cache_control?: { type: 'ephemeral' };\n}\n\nexport interface ProviderToolDef {\n name: string;\n description: string;\n input_schema: unknown;\n}\n\nexport interface ProviderCallArgs {\n apiKey: string;\n model: string;\n maxTokens: number;\n system: ProviderSystemBlock[];\n tools: ProviderToolDef[];\n toolChoice: { type: 'any' } | { type: 'tool'; name: string };\n messages: Array<{ role: 'user' | 'assistant'; content: string }>;\n signal?: AbortSignal;\n}\n\nexport interface ProviderUsage {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n}\n\nexport type ProviderContentBlock =\n | { type: 'text'; text: string }\n | { type: 'tool_use'; id: string; name: string; input: unknown };\n\nexport interface ProviderResponse {\n content: ProviderContentBlock[];\n stop_reason: string;\n usage: ProviderUsage;\n}\n\nexport async function callProvider(args: ProviderCallArgs): Promise<ProviderResponse> {\n const client = new Anthropic({ apiKey: args.apiKey });\n const resp = await client.messages.create(\n {\n model: args.model,\n max_tokens: args.maxTokens,\n system: args.system,\n tools: args.tools as never,\n tool_choice: args.toolChoice,\n messages: args.messages,\n },\n args.signal ? { signal: args.signal } : undefined,\n );\n return resp as unknown as ProviderResponse;\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/ai/prompt.ts\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';\n\nconst FIXTURES = [eq, md, alt, ce, oc, cc, ic, par, two];\n\nexport function buildSystemPrompt(): string {\n const examples = FIXTURES.map((f, i) =>\n `### Ví dụ ${i + 1}\\n**Đề:** ${f.problem}\\n**DSL:**\\n\\`\\`\\`json\\n${JSON.stringify(f.dsl, null, 2)}\\n\\`\\`\\``,\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 DSL JSON mô tả hình. Hệ thống sẽ render hình từ DSL.\n\n## Quy tắc\n1. Dùng tool \\`build_figure\\` khi vẽ được. Dùng tool \\`refuse\\` khi không vẽ được hoặc đề ngoài phạm vi (3D, lượng giác, phép biến hình lớp 11+, đại số).\n2. Ưu tiên derived points (midpoint, perpFoot, circumcenter, ...) thay vì tự compute toạ độ.\n3. Anchor (free) chỉ dùng cho điểm gốc (thường A, B, C của tam giác). Đặt coord hợp lý quanh gốc (-5..5).\n4. Mọi điểm + hình phải có \\`name\\` (label \"A\", \"M\", \"O₁\", ...). Tham chiếu bằng name, không phải id.\n5. Tam giác: emit cả \\`polygon\\` (vẽ viền) + segment/đường phụ riêng nếu đề yêu cầu (đường cao, trung tuyến).\n6. Đường tròn (O; R) cho trước bán kính số: emit anchor helper trên đường tròn rồi dùng \\`circleCP\\` (DSL không hỗ trợ radius numeric trực tiếp).\n7. Nếu đề mơ hồ: chọn case phổ biến nhất, không hỏi lại.\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## 9 ví dụ\n${examples}\n\n## Khi không vẽ được\nGọi \\`refuse\\` với \\`reason\\` tiếng Việt giải thích cụ thể (vd: \"Đề thuộc lớp 11, ngoài phạm vi MVP\" hoặc \"Đề không rõ vị trí điểm M\").`;\n}\n","// src/stamps/geometry-2d/ai/tools.ts\nimport { z } from 'zod';\nimport { zodToJsonSchema } from 'zod-to-json-schema';\nimport { DslInput } from '../dsl';\n\nexport const BUILD_FIGURE_TOOL = {\n name: 'build_figure',\n description: 'Vẽ hình học 2D theo đề bài. Emit DSL JSON mô tả các điểm và hình.',\n input_schema: zodToJsonSchema(DslInput, {\n target: 'jsonSchema7',\n $refStrategy: 'none',\n }),\n} as const;\n\nconst RefuseInputZ = z.object({\n reason: z.string().min(1).describe('Lý do không vẽ được (tiếng Việt)'),\n});\n\nexport const REFUSE_TOOL = {\n name: 'refuse',\n description: 'Từ chối khi không vẽ được hoặc đề ngoài phạm vi (3D, lượng giác, lớp 11+).',\n input_schema: zodToJsonSchema(RefuseInputZ, { target: 'jsonSchema7' }),\n} as const;\n\nexport const TOOLS = [BUILD_FIGURE_TOOL, REFUSE_TOOL];\n","// src/stamps/geometry-2d/ai/buildFigure.ts\nimport type { State as SceneState } from '../../../core/scene/types';\nimport type { DslInputT, TranspileError } from '../dsl';\nimport { transpile } from '../dsl';\nimport { callProvider, type ProviderResponse } from './provider';\nimport { buildSystemPrompt } from './prompt';\nimport { TOOLS } from './tools';\n\nconst DEFAULT_MODEL = 'claude-opus-4-7';\nconst DEFAULT_MAX_TOKENS = 8192;\n\nexport interface GenerateOptions {\n apiKey: string;\n model?: string;\n maxTokens?: number;\n enableCaching?: boolean;\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 }\n | { ok: false; reason: 'refused'; message: string; usage?: TokenUsage }\n | { ok: false; reason: 'parse_error'; message: string; raw?: unknown; usage?: TokenUsage }\n | { ok: false; reason: 'transpile_error'; message: string; errors: TranspileError[]; dsl: unknown; usage?: TokenUsage }\n | { ok: false; reason: 'api_error'; message: string; status?: number };\n\nfunction toUsage(u: ProviderResponse['usage']): TokenUsage {\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\nexport async function generateFigure(\n problem: string,\n opts: GenerateOptions,\n): Promise<GenerateResult> {\n if (!opts.apiKey) {\n return { ok: false, reason: 'api_error', message: 'apiKey bắt buộc' };\n }\n if (!problem || !problem.trim()) {\n return { ok: false, reason: 'api_error', message: 'Đề bài rỗng' };\n }\n\n const systemText = buildSystemPrompt();\n const enableCaching = opts.enableCaching !== false;\n const systemBlock = enableCaching\n ? { type: 'text' as const, text: systemText, cache_control: { type: 'ephemeral' as const } }\n : { type: 'text' as const, text: systemText };\n\n let response: ProviderResponse;\n try {\n response = await callProvider({\n apiKey: opts.apiKey,\n model: opts.model ?? DEFAULT_MODEL,\n maxTokens: opts.maxTokens ?? DEFAULT_MAX_TOKENS,\n system: [systemBlock],\n tools: TOOLS as never,\n toolChoice: { type: 'any' },\n messages: [{ role: 'user', content: problem }],\n signal: opts.signal,\n });\n } catch (e) {\n const err = e as { message?: string; status?: number };\n return {\n ok: false,\n reason: 'api_error',\n message: err.message ?? 'Lỗi gọi Claude API',\n ...(err.status !== undefined ? { status: err.status } : {}),\n };\n }\n\n const usage = toUsage(response.usage);\n\n const toolUse = response.content.find((c) => c.type === 'tool_use');\n if (!toolUse || toolUse.type !== 'tool_use') {\n const text = response.content.find((c) => c.type === 'text');\n const textStr = text?.type === 'text' ? text.text : '(empty)';\n return {\n ok: false,\n reason: 'parse_error',\n message: 'AI không gọi tool nào. Response: ' + textStr,\n raw: response.content,\n usage,\n };\n }\n\n if (toolUse.name === 'refuse') {\n const input = toolUse.input as { reason?: string };\n return {\n ok: false,\n reason: 'refused',\n message: input.reason ?? 'AI từ chối không nêu lý do',\n usage,\n };\n }\n\n if (toolUse.name !== 'build_figure') {\n return {\n ok: false,\n reason: 'parse_error',\n message: `Tool không xác định: \"${toolUse.name}\"`,\n raw: toolUse,\n usage,\n };\n }\n\n const tResult = transpile(toolUse.input);\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: toolUse.input,\n usage,\n };\n }\n\n return {\n ok: true,\n state: tResult.state,\n dsl: toolUse.input as DslInputT,\n usage,\n };\n}\n"]}
|