@things-factory/figure-service 10.1.244 → 10.1.246
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 +19 -0
- package/dist-server/routers/figure-thumbnail-router.js +16 -1
- package/dist-server/routers/figure-thumbnail-router.js.map +1 -1
- package/dist-server/service/figure/figure-ai-scenarios-run.d.ts +44 -0
- package/dist-server/service/figure/figure-ai-scenarios-run.js +94 -0
- package/dist-server/service/figure/figure-ai-scenarios-run.js.map +1 -0
- package/dist-server/service/figure/figure-ai-scenarios.d.ts +68 -0
- package/dist-server/service/figure/figure-ai-scenarios.js +814 -0
- package/dist-server/service/figure/figure-ai-scenarios.js.map +1 -0
- package/dist-server/service/figure/figure-context.js +3 -0
- package/dist-server/service/figure/figure-context.js.map +1 -1
- package/dist-server/service/figure/figure-llm-provider.d.ts +10 -0
- package/dist-server/service/figure/figure-llm-provider.js +19 -0
- package/dist-server/service/figure/figure-llm-provider.js.map +1 -0
- package/dist-server/service/figure/figure-mutation.js +19 -23
- package/dist-server/service/figure/figure-mutation.js.map +1 -1
- package/dist-server/service/figure/figure-propose-steps.d.ts +5 -1
- package/dist-server/service/figure/figure-propose-steps.js +14 -2
- package/dist-server/service/figure/figure-propose-steps.js.map +1 -1
- package/dist-server/service/figure/figure-query.d.ts +10 -2
- package/dist-server/service/figure/figure-query.js +59 -11
- package/dist-server/service/figure/figure-query.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -8
- package/scripts/figure-ai-scenarios-agent.cjs +98 -0
- package/server/routers/figure-thumbnail-router.ts +18 -2
- package/server/service/figure/figure-ai-scenarios-run.ts +127 -0
- package/server/service/figure/figure-ai-scenarios.live.test.ts +59 -0
- package/server/service/figure/figure-ai-scenarios.test.ts +77 -0
- package/server/service/figure/figure-ai-scenarios.ts +792 -0
- package/server/service/figure/figure-context.ts +3 -0
- package/server/service/figure/figure-llm-provider.ts +20 -0
- package/server/service/figure/figure-llm-smoke.test.ts +5 -68
- package/server/service/figure/figure-mutation.ts +17 -23
- package/server/service/figure/figure-propose-steps.test.ts +55 -0
- package/server/service/figure/figure-propose-steps.ts +14 -3
- package/server/service/figure/figure-public-db.test.ts +108 -0
- package/server/service/figure/figure-query.ts +55 -10
- package/server/service/figure/figure-thumbnail-db.test.ts +16 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"figure-ai-scenarios.js","sourceRoot":"","sources":["../../../server/service/figure/figure-ai-scenarios.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * AI 모델링 시나리오 — what a person asks the figure AI for, and what the figure must then be (2026-11-03, 사용자 「여러가지\n * 모델링 시나리오를 구성해서 AI를 통한 모델링이 잘 구현되는지 지속적으로 점검할 수 있도록 하라」).\n *\n * Each scenario is a request in a person's words, the draft it is asked on (none for a new figure), and a check that\n * says what the figure that came back misses -- read from the figure by the kernel (its parts' shapes, fastenings,\n * motion, clips, data), never from the steps the model wrote, so any way of making it that the kernel takes passes.\n * Each also holds a reference answer the check must pass and a wrong one it must fail: the checks are themselves held to\n * known verdicts without a provider (figure-ai-scenarios.test.ts). The live run (figure-ai-scenarios.live.test.ts) asks a\n * real model for each and writes a report to compare runs by.\n *\n * The scenarios are spread over what the kernel can say (ADR-0100 shapes and §16's taper and pipe, ADR-0093 fastenings,\n * ADR-0159 joints, repeats, clips, the figure's size, data bindings, mirrored chains), new figures and revisions both.\n */\nimport {\n applyFigureProposal,\n compileFigureAsset,\n createFigureAsset,\n figureOccupiedBoxesOf,\n figureShapeBoundsOf,\n figureShapeDescriptionOf,\n figureSweepSectionAt,\n figureWritersOf,\n type FigureAsset\n} from '@hatiolab/figure-model'\n\ntype Dynamic = any\ntype Axis = 'x' | 'y' | 'z'\n\nexport interface FigureAIScenario {\n id: string\n /** What it checks, in a few words. */\n title: string\n /** The parts of the kernel it reaches: what a failure points at. */\n covers: string[]\n /** The request, as a person types it. */\n prompt: string\n /** The draft it is asked on; absent, a new figure named `name`. */\n base?: () => FigureAsset\n name?: string\n /** What the figure that came back misses; empty when it is what was asked. `before` is the draft, for a revision. */\n check: (after: FigureAsset, before?: FigureAsset) => string[]\n /** An answer the check must pass, and one the kernel takes that the check must fail. */\n reference: unknown[]\n wrong: unknown[]\n}\n\n/* ── What a figure is, read by the kernel ─────────────────────────────────────────────── */\n\nexport interface ScenarioPart {\n id: string\n /** The shape's kind, as figure-model describes it: rectangle, ellipse, taper, tapered, sweep … */\n kind: string\n /** Where it stands in the figure, at its default size and pose: its box's centre and extent. */\n centre: Record<Axis, number>\n extent: Record<Axis, number>\n colour: string\n /** What it is fastened to: a part, the plane, or nothing. */\n on?: string\n /** Its joint's axes' types, in order; none for a fastening. */\n motion: string[]\n /** Its joint's controls, by axis. */\n controls: string[]\n limits: Array<{ lower?: number; upper?: number }>\n /** How many copies its row makes; 1 for a part not in a row. */\n copies: number\n shape: Dynamic\n node: Dynamic\n}\n\n/** Every part of a figure, as the kernel evaluates it. */\nexport function scenarioPartsOf(asset: FigureAsset): ScenarioPart[] {\n const geometry = compileFigureAsset(asset).evaluate().geometry as Dynamic[]\n const boxes = figureOccupiedBoxesOf(geometry as never, figureWritersOf(asset))\n const nodes = (asset.document.model as Dynamic).nodes as Dynamic[]\n const joints = ((asset as Dynamic).joints ?? []) as Dynamic[]\n return asset.appearance.map((look: Dynamic) => {\n const id = look.target as string\n const node = nodes.find(n => n.id === `${id}.shape`)\n const joint = joints.find(j => j.body1?.part === id)\n const box = boxes.find(b => b.part === id)\n const body = geometry.find(g => g.id === id)\n const motion = (joint?.motion ?? []) as Dynamic[]\n return {\n id,\n kind: figureShapeDescriptionOf(node, asset.document.model as never)?.kind ?? String(node?.op ?? ''),\n centre: { x: box?.centre.x ?? 0, y: box?.centre.y ?? 0, z: box?.centre.z ?? 0 },\n extent: { x: box?.extent.x ?? 0, y: box?.extent.y ?? 0, z: box?.extent.z ?? 0 },\n colour: String((asset.palette as Dynamic)?.[look.material?.token] ?? look.material?.token ?? '').toLowerCase(),\n ...(joint ? { on: joint.body0?.part ?? 'mounting-plane' } : {}),\n motion: motion.map(m => m.type),\n controls: motion.map((m, i) => m.state?.id ?? m.id ?? (i ? `${joint.id}.${i}` : joint.id)),\n limits: motion.map(m => ({ lower: m.lowerLimit, upper: m.upperLimit })),\n /* The kernel's own reading of which part a body was placed by: a row's copies are named `[\"<part>.repeat\", i, …]`. */\n copies: boxes.filter(b => b.part === id).length || 1,\n shape: body?.shape,\n node\n }\n })\n}\n\nconst near = (a: number, b: number, tol = 0.5) => Math.abs(a - b) <= tol\nconst bottom = (p: ScenarioPart) => p.centre.y - p.extent.y / 2\nconst top = (p: ScenarioPart) => p.centre.y + p.extent.y / 2\n\n/** Every part fastened to something: the plane, or another part (each part fastened once, as the grammar teaches). */\nfunction loose(parts: ScenarioPart[]): string[] {\n return parts.filter(p => !p.on).map(p => `${p.id} is fastened to nothing`)\n}\n\n/** A clip that plays one of `controls`. */\nconst clipsPlaying = (asset: FigureAsset, controls: string[]) => ((asset as Dynamic).drivers ?? []).filter((d: Dynamic) => controls.includes(d.state))\n\nconst steps = (list: unknown[]) => list\n\n/* ── The drafts revisions are asked on ────────────────────────────────────────────────── */\n\n/** A mixer: a body standing on the floor, a port fastened to its front. */\nexport function mixerDraft(): FigureAsset {\n return applyFigureProposal(createFigureAsset('Mixer'), [\n { kind: 'add-part', part: { id: 'body', kind: 'cylinder', dimensions: { radius: 140, length: 320 } } },\n { kind: 'add-part', part: { id: 'port', kind: 'box', dimensions: { width: 80, height: 60, depth: 30 } } },\n { kind: 'attach', part: 'body', to: { plane: 'mounting-plane' } },\n /* The body's front is its curved side: a point on it, by the outward normal there (ADR-0140 3.9; push Y, +Z is 270°). */\n { kind: 'attach', part: 'port', to: { part: 'body', surface: { around: 270, along: 'centre' } } },\n { kind: 'set-placement', placement: 'floor' }\n ] as never)\n}\n\n/**\n * What \"make the port twice as wide and give it an accent colour\" asks of the mixer, said as what is missing: the port\n * twice as wide (X), its height and depth kept, a colour it did not have, and the body left as it was.\n */\nexport function portRevisionMisses(before: FigureAsset, after: FigureAsset): string[] {\n const was = Object.fromEntries(scenarioPartsOf(before).map(p => [p.id, p]))\n const now = Object.fromEntries(scenarioPartsOf(after).map(p => [p.id, p]))\n const misses: string[] = []\n if (!now.port) return ['the port is gone']\n const size = (p: ScenarioPart) => figureShapeBoundsOf(p.shape)\n const extentOf = (p: ScenarioPart, axis: Axis) => size(p)[axis].max - size(p)[axis].min\n if (!near(extentOf(now.port, 'x'), extentOf(was.port!, 'x') * 2)) misses.push(`port width ${extentOf(now.port, 'x')}, asked ${extentOf(was.port!, 'x') * 2}`)\n for (const axis of ['y', 'z'] as const) if (!near(extentOf(now.port, axis), extentOf(was.port!, axis))) misses.push(`port ${axis} changed to ${extentOf(now.port, axis)}`)\n if (now.port.colour === was.port!.colour) misses.push(`port colour still ${was.port!.colour}`)\n if (!now.body) misses.push('the body is gone')\n else for (const axis of ['x', 'y', 'z'] as const) if (!near(extentOf(now.body, axis), extentOf(was.body!, axis))) misses.push(`body ${axis} changed to ${extentOf(now.body, axis)}`)\n if (now.body && now.body.colour !== was.body!.colour) misses.push(`body colour changed to ${now.body.colour}`)\n return misses\n}\n\n/** An elbow: up from the floor, a quarter bend toward +X, along. */\nfunction elbowDraft(): FigureAsset {\n return applyFigureProposal(createFigureAsset('Elbow'), [\n { kind: 'add-part', part: { id: 'pipe', kind: 'pipe', dimensions: { radius: 40, wall: 4 }, path: [{ line: 500 }, { bend: { radius: 120, angle: 90, toward: 90 } }, { line: 400 }] } },\n { kind: 'attach', part: 'pipe', to: { plane: 'mounting-plane' } }\n ] as never)\n}\n\n/** A plain box standing on the floor. */\nfunction boxDraft(): FigureAsset {\n return applyFigureProposal(createFigureAsset('Bin'), [\n { kind: 'add-part', part: { id: 'bin', kind: 'box', dimensions: { width: 600, height: 300, depth: 400 } } },\n { kind: 'attach', part: 'bin', to: { plane: 'mounting-plane' } }\n ] as never)\n}\n\n/** A table: a top on four legs. */\nfunction tableDraft(): FigureAsset {\n return applyFigureProposal(createFigureAsset('Table'), [\n { kind: 'add-part', part: { id: 'top', kind: 'box', dimensions: { width: 1200, height: 40, depth: 700 } } },\n { kind: 'add-part', part: { id: 'leg', kind: 'box', dimensions: { width: 50, height: 700, depth: 50 } } },\n { kind: 'attach', part: 'leg', to: { plane: 'mounting-plane' } },\n { kind: 'attach', part: 'top', to: { part: 'leg', face: 'top' } }\n ] as never)\n}\n\n/** A cabinet with a lamp on its top. */\nfunction lampDraft(): FigureAsset {\n return applyFigureProposal(createFigureAsset('Cabinet'), [\n { kind: 'add-part', part: { id: 'cabinet', kind: 'box', dimensions: { width: 600, height: 1200, depth: 500 } } },\n { kind: 'add-part', part: { id: 'lamp', kind: 'cylinder', dimensions: { radius: 40, length: 80 } } },\n { kind: 'attach', part: 'cabinet', to: { plane: 'mounting-plane' } },\n { kind: 'attach', part: 'lamp', to: { part: 'cabinet', face: 'top' } }\n ] as never)\n}\n\n/* ── The scenarios ────────────────────────────────────────────────────────────────────── */\n\nconst accent = (target: string, colour: string, token = 'palette.accent') => ({ kind: 'set-material', target, material: { token }, palette: { [token]: colour } })\n\nexport const FIGURE_AI_SCENARIOS: FigureAIScenario[] = [\n {\n id: 'roll-press',\n title: '새 피규어: 프레임 안 두 롤러, 서로 다른 색',\n covers: ['add-part cylinder', 'attach', 'set-material'],\n prompt: 'two cylindrical rollers inside a simple rectangular press frame; make the rollers visually distinct',\n name: 'Roll press',\n /*\n Two rollers -- two parts, or one repeated in a row -- that stand out: a colour the frame does not have. Read so after\n a model's row of two was failed for being one part (2026-11-03, the first runs).\n */\n check: after => {\n const parts = scenarioPartsOf(after)\n const rollers = parts.filter(p => p.kind === 'ellipse')\n const frame = parts.filter(p => p.kind !== 'ellipse')\n const misses = [...loose(parts)]\n const drawn = rollers.reduce((sum, r) => sum + r.copies, 0)\n if (drawn < 2) misses.push(`${drawn} round bodies drawn, two rollers asked`)\n if (!frame.length) misses.push('no frame')\n else if (rollers.length && rollers.every(r => frame.some(f => f.colour === r.colour))) misses.push(`the rollers are the frame's colour, ${rollers[0]!.colour}`)\n return misses\n },\n reference: steps([\n { kind: 'add-part', part: { id: 'base', kind: 'box', dimensions: { width: 1000, height: 80, depth: 500 } } },\n { kind: 'add-part', part: { id: 'roller-a', kind: 'cylinder', dimensions: { radius: 80, length: 400 } } },\n { kind: 'add-part', part: { id: 'roller-b', kind: 'cylinder', dimensions: { radius: 80, length: 400 } } },\n { kind: 'attach', part: 'base', to: { plane: 'mounting-plane' } },\n { kind: 'attach', part: 'roller-a', to: { part: 'base', face: 'top' }, align: { x: { mm: -200 } } },\n { kind: 'attach', part: 'roller-b', to: { part: 'base', face: 'top' }, align: { x: { mm: 200 } } },\n accent('roller-b', '#d08a2c')\n ]),\n wrong: steps([\n { kind: 'add-part', part: { id: 'base', kind: 'box', dimensions: { width: 1000, height: 80, depth: 500 } } },\n { kind: 'add-part', part: { id: 'roller-a', kind: 'cylinder', dimensions: { radius: 80, length: 400 } } },\n { kind: 'add-part', part: { id: 'roller-b', kind: 'cylinder', dimensions: { radius: 80, length: 400 } } },\n { kind: 'attach', part: 'base', to: { plane: 'mounting-plane' } },\n { kind: 'attach', part: 'roller-a', to: { part: 'base', face: 'top' }, align: { x: { mm: -200 } } },\n { kind: 'attach', part: 'roller-b', to: { part: 'base', face: 'top' }, align: { x: { mm: 200 } } },\n /* Rollers drawn in the frame's own colour: nothing stands out. */\n accent('roller-a', '#477b9e', 'palette.primary'),\n accent('roller-b', '#477b9e', 'palette.primary'),\n accent('base', '#477b9e', 'palette.primary')\n ])\n },\n {\n id: 'lift-table',\n title: '새 피규어: 받침 · 기둥 · 상판을 쌓기',\n covers: ['attach part face', 'stacking'],\n prompt: '리프트 테이블: 바닥에 넓은 받침, 그 위에 원기둥 기둥, 기둥 위에 받침만 한 상판',\n name: 'Lift table',\n check: after => {\n const parts = scenarioPartsOf(after)\n const misses = [...loose(parts)]\n if (parts.length < 3) return [...misses, `${parts.length} parts, three asked`]\n const sorted = [...parts].sort((a, b) => top(b) - top(a))\n const [highest] = sorted\n const column = parts.find(p => p.kind === 'ellipse')\n if (!column) misses.push('no round column')\n else {\n if (!(highest!.extent.x * highest!.extent.z > column.extent.x * column.extent.z)) misses.push('the top is not wider than the column')\n if (!parts.some(p => p !== column && near(bottom(column), top(p), 1))) misses.push('the column does not stand on another part')\n if (!near(bottom(highest!), top(column), 1)) misses.push('the top does not sit on the column')\n }\n if (!parts.some(p => near(bottom(p), 0, 1))) misses.push('nothing stands on the floor')\n return misses\n },\n reference: steps([\n { kind: 'add-part', part: { id: 'base', kind: 'box', dimensions: { width: 1200, height: 80, depth: 800 } } },\n { kind: 'add-part', part: { id: 'column', kind: 'cylinder', dimensions: { radius: 90, length: 600 } } },\n { kind: 'add-part', part: { id: 'top', kind: 'box', dimensions: { width: 1200, height: 60, depth: 800 } } },\n { kind: 'attach', part: 'base', to: { plane: 'mounting-plane' } },\n { kind: 'attach', part: 'column', to: { part: 'base', face: 'top' } },\n { kind: 'attach', part: 'top', to: { part: 'column', face: 'top' } }\n ]),\n wrong: steps([\n { kind: 'add-part', part: { id: 'base', kind: 'box', dimensions: { width: 1200, height: 80, depth: 800 } } },\n { kind: 'add-part', part: { id: 'column', kind: 'cylinder', dimensions: { radius: 90, length: 600 } } },\n { kind: 'add-part', part: { id: 'top', kind: 'box', dimensions: { width: 1200, height: 60, depth: 800 } } },\n { kind: 'attach', part: 'base', to: { plane: 'mounting-plane' } },\n { kind: 'attach', part: 'column', to: { part: 'base', face: 'top' } },\n { kind: 'attach', part: 'top', to: { part: 'base', face: 'top' } }\n ])\n },\n {\n id: 'elbow-flange',\n title: '새 피규어: 엘보 배관과 끝의 플랜지 (ADR-0100 §16.2)',\n covers: ['add-part pipe', 'bend', 'attach to a pipe end'],\n prompt: '바닥에서 위로 올라가다 90도 꺾여 옆으로 가는 지름 80 배관, 배관 끝에 원판 플랜지',\n name: 'Elbow',\n check: after => {\n const parts = scenarioPartsOf(after)\n const misses = [...loose(parts)]\n const pipe = parts.find(p => p.kind === 'sweep')\n if (!pipe) return [...misses, 'no part along a path (a pipe)']\n if (!pipe.shape?.sweep?.path?.some((s: Dynamic) => s.kind === 'bend')) misses.push('the pipe has no bend')\n if (!parts.some(p => p.on === pipe.id)) misses.push('nothing is fastened to the pipe')\n return misses\n },\n reference: steps([\n { kind: 'add-part', part: { id: 'pipe', kind: 'pipe', dimensions: { radius: 40, wall: 4 }, path: [{ line: 500 }, { bend: { radius: 120, angle: 90, toward: 90 } }, { line: 400 }] } },\n { kind: 'attach', part: 'pipe', to: { plane: 'mounting-plane' } },\n { kind: 'add-part', part: { id: 'flange', kind: 'cylinder', dimensions: { radius: 70, length: 20 } } },\n { kind: 'attach', part: 'flange', to: { part: 'pipe', face: 'right' } }\n ]),\n wrong: steps([\n { kind: 'add-part', part: { id: 'pipe', kind: 'pipe', dimensions: { radius: 40, wall: 4 }, path: [{ line: 500 }, { bend: { radius: 120, angle: 90, toward: 90 } }, { line: 400 }] } },\n { kind: 'attach', part: 'pipe', to: { plane: 'mounting-plane' } },\n { kind: 'add-part', part: { id: 'flange', kind: 'cylinder', dimensions: { radius: 70, length: 20 } } },\n { kind: 'attach', part: 'flange', to: { plane: 'mounting-plane' } }\n ])\n },\n {\n id: 'conveyor',\n title: '새 피규어: 프레임 위 롤러를 반복으로',\n covers: ['make-repeat'],\n prompt: 'a roller conveyor: a 2 m long frame with rollers repeated along its length every 150 mm',\n name: 'Conveyor',\n check: after => {\n const parts = scenarioPartsOf(after)\n const misses = [...loose(parts)]\n const rows = ((after as Dynamic).joints ?? []).filter((j: Dynamic) => j.repeat)\n if (!rows.length) misses.push('no part repeated in a row')\n const geometry = compileFigureAsset(after).evaluate().geometry as Dynamic[]\n if (geometry.length < 8) misses.push(`${geometry.length} bodies drawn, a row of rollers asked`)\n const longest = Math.max(...parts.map(p => Math.max(p.extent.x, p.extent.z)))\n if (longest < 1500) misses.push(`the longest part is ${Math.round(longest)} mm, a 2 m frame asked`)\n return misses\n },\n reference: steps([\n { kind: 'add-part', part: { id: 'frame', kind: 'box', dimensions: { width: 2000, height: 100, depth: 500 } } },\n { kind: 'add-part', part: { id: 'roller', kind: 'cylinder', dimensions: { radius: 30, length: 480 } } },\n { kind: 'attach', part: 'frame', to: { plane: 'mounting-plane' } },\n { kind: 'attach', part: 'roller', to: { part: 'frame', face: 'top' } },\n { kind: 'make-repeat', part: 'roller', axis: 'x', pitch: 150 }\n ]),\n wrong: steps([\n { kind: 'add-part', part: { id: 'frame', kind: 'box', dimensions: { width: 2000, height: 100, depth: 500 } } },\n { kind: 'add-part', part: { id: 'roller', kind: 'cylinder', dimensions: { radius: 30, length: 480 } } },\n { kind: 'attach', part: 'frame', to: { plane: 'mounting-plane' } },\n { kind: 'attach', part: 'roller', to: { part: 'frame', face: 'top' } }\n ])\n },\n {\n id: 'two-joint-arm',\n title: '새 피규어: 두 관절로 도는 팔',\n covers: ['set-joint revolute', 'a joint on a moving part'],\n prompt: '바닥 받침 위에 아래팔과 위팔이 있고, 받침-아래팔, 아래팔-위팔이 각각 회전 관절인 로봇 팔',\n name: 'Arm',\n check: after => {\n const parts = scenarioPartsOf(after)\n const misses = [...loose(parts)]\n const turning = parts.filter(p => p.motion.includes('revolute'))\n if (turning.length < 2) misses.push(`${turning.length} turning joints, two asked`)\n else if (!turning.some(p => turning.some(q => q.id === p.on))) misses.push('no turning part hangs from another turning part')\n return misses\n },\n reference: steps([\n { kind: 'add-part', part: { id: 'base', kind: 'cylinder', dimensions: { radius: 150, length: 100 } } },\n { kind: 'add-part', part: { id: 'lower-arm', kind: 'box', dimensions: { width: 80, height: 500, depth: 80 } } },\n { kind: 'add-part', part: { id: 'upper-arm', kind: 'box', dimensions: { width: 60, height: 400, depth: 60 } } },\n { kind: 'attach', part: 'base', to: { plane: 'mounting-plane' } },\n { kind: 'set-joint', joint: { id: 'shoulder', body0: { part: 'base', face: 'top' }, body1: { part: 'lower-arm' }, motion: [{ type: 'revolute', axis: 'Z', lowerLimit: -90, upperLimit: 90 }] } },\n { kind: 'set-joint', joint: { id: 'elbow', body0: { part: 'lower-arm', face: 'top' }, body1: { part: 'upper-arm' }, motion: [{ type: 'revolute', axis: 'Z', lowerLimit: -120, upperLimit: 120 }] } }\n ]),\n wrong: steps([\n { kind: 'add-part', part: { id: 'base', kind: 'cylinder', dimensions: { radius: 150, length: 100 } } },\n { kind: 'add-part', part: { id: 'lower-arm', kind: 'box', dimensions: { width: 80, height: 500, depth: 80 } } },\n { kind: 'add-part', part: { id: 'upper-arm', kind: 'box', dimensions: { width: 60, height: 400, depth: 60 } } },\n { kind: 'attach', part: 'base', to: { plane: 'mounting-plane' } },\n { kind: 'set-joint', joint: { id: 'shoulder', body0: { part: 'base', face: 'top' }, body1: { part: 'lower-arm' }, motion: [{ type: 'revolute', axis: 'Z', lowerLimit: -90, upperLimit: 90 }] } },\n { kind: 'attach', part: 'upper-arm', to: { part: 'lower-arm', face: 'top' } }\n ])\n },\n {\n id: 'cabinet-door',\n title: '새 피규어: 경첩 문 0~90°와 여는 클립',\n covers: ['set-joint limits', 'set-driver clip'],\n prompt: 'a cabinet with one door on a hinge that opens from 0 to 90 degrees, and a clip that opens it in 2 seconds',\n name: 'Cabinet',\n check: after => {\n const parts = scenarioPartsOf(after)\n const misses = [...loose(parts)]\n const door = parts.find(p => p.motion.includes('revolute'))\n if (!door) return [...misses, 'no hinged part']\n const span = door.limits.map(l => (l.upper ?? Infinity) - (l.lower ?? -Infinity))[0]!\n if (!(span >= 80 && span <= 100)) misses.push(`the hinge turns ${span}°, 0 to 90 asked`)\n if (!clipsPlaying(after, door.controls).length) misses.push(\"no clip plays the door's hinge\")\n return misses\n },\n reference: steps([\n { kind: 'add-part', part: { id: 'cabinet', kind: 'box', dimensions: { width: 600, height: 1200, depth: 500 } } },\n { kind: 'add-part', part: { id: 'door', kind: 'box', dimensions: { width: 600, height: 1200, depth: 20 } } },\n { kind: 'attach', part: 'cabinet', to: { plane: 'mounting-plane' } },\n { kind: 'set-joint', joint: { id: 'hinge', body0: { part: 'cabinet', face: 'front' }, body1: { part: 'door' }, origin: { align: { x: 'min' } }, motion: [{ type: 'revolute', axis: 'Y', lowerLimit: 0, upperLimit: 90, state: { id: 'door-open' } }] } },\n { kind: 'set-driver', state: 'door-open', clip: 'open', duration: 2, keys: [{ seconds: 0, value: 0 }, { seconds: 2, value: 90 }], loop: 'hold' }\n ]),\n wrong: steps([\n { kind: 'add-part', part: { id: 'cabinet', kind: 'box', dimensions: { width: 600, height: 1200, depth: 500 } } },\n { kind: 'add-part', part: { id: 'door', kind: 'box', dimensions: { width: 600, height: 1200, depth: 20 } } },\n { kind: 'attach', part: 'cabinet', to: { plane: 'mounting-plane' } },\n { kind: 'set-joint', joint: { id: 'hinge', body0: { part: 'cabinet', face: 'front' }, body1: { part: 'door' }, origin: { align: { x: 'min' } }, motion: [{ type: 'revolute', axis: 'Y', lowerLimit: 0, upperLimit: 90, state: { id: 'door-open' } }] } }\n ])\n },\n {\n id: 'hopper',\n title: '새 피규어: 윗면이 넓은 사각 호퍼 (ADR-0100 §16.1)',\n covers: ['add-part tapered-box'],\n prompt: '아래가 좁고 위가 넓은 사각 호퍼: 아랫면 300×300, 윗면 800×800, 높이 600, 모서리는 둥글게',\n name: 'Hopper',\n check: after => {\n const parts = scenarioPartsOf(after)\n const misses = [...loose(parts)]\n const hopper = parts.find(p => p.kind === 'tapered')\n if (!hopper) return [...misses, 'no part whose top is another size than its bottom']\n const l = hopper.shape.loft\n const [from, to] = [l.section.size, l.to.size]\n if (!(to.x > from.x && to.z > from.z)) misses.push(`its top ${to.x}×${to.z} is not wider than its bottom ${from.x}×${from.z}`)\n return misses\n },\n reference: steps([\n { kind: 'add-part', part: { id: 'hopper', kind: 'tapered-box', dimensions: { width: 300, depth: 300, height: 600, topWidth: 800, topDepth: 800, round: 30, topRound: 60 } } },\n { kind: 'attach', part: 'hopper', to: { plane: 'mounting-plane' } }\n ]),\n wrong: steps([\n { kind: 'add-part', part: { id: 'hopper', kind: 'tapered-box', dimensions: { width: 800, depth: 800, height: 600, topWidth: 300, topDepth: 300, round: 60, topRound: 30 } } },\n { kind: 'attach', part: 'hopper', to: { plane: 'mounting-plane' } }\n ])\n },\n {\n id: 'quadruped-legs',\n title: '새 피규어: 몸통과 좌우 대칭인 다리 넷, 다리마다 무릎',\n covers: ['mirror-part chain', 'joints'],\n prompt: 'a four-legged robot body: a box body and four legs, each leg a thigh and a shin with a hip and a knee joint; the legs symmetric left and right',\n name: 'Quadruped',\n check: after => {\n const parts = scenarioPartsOf(after)\n const misses = [...loose(parts)]\n const moving = parts.filter(p => p.motion.length)\n if (moving.length < 8) misses.push(`${moving.length} moving parts, four legs of two joints asked`)\n /* Left and right: every moving part has its reflection across the body's middle along Z or X. */\n const mirrored = (p: ScenarioPart, axis: Axis) => moving.some(q => q !== p && near(q.centre[axis], -p.centre[axis], 1) && (['x', 'y', 'z'] as const).filter(x => x !== axis).every(x => near(q.centre[x], p.centre[x], 1)))\n const lonely = moving.filter(p => !mirrored(p, 'z') && !mirrored(p, 'x'))\n if (lonely.length) misses.push(`no mirror of ${lonely.map(p => p.id).join(', ')}`)\n return misses\n },\n reference: steps([\n { kind: 'add-part', part: { id: 'body', kind: 'box', dimensions: { width: 800, height: 200, depth: 300 } } },\n { kind: 'set-placement', placement: 'floor' },\n { kind: 'attach', part: 'body', to: { plane: 'mounting-plane' }, gap: 500 },\n { kind: 'add-part', part: { id: 'fl-thigh', kind: 'box', dimensions: { width: 60, height: 250, depth: 60 } } },\n { kind: 'add-part', part: { id: 'fl-shin', kind: 'box', dimensions: { width: 40, height: 250, depth: 40 } } },\n { kind: 'set-joint', joint: { id: 'fl-hip', body0: { part: 'body', face: 'bottom' }, body1: { part: 'fl-thigh' }, origin: { align: { x: 'max', z: 'max' } }, motion: [{ type: 'revolute', axis: 'Z', lowerLimit: -45, upperLimit: 45 }] } },\n { kind: 'set-joint', joint: { id: 'fl-knee', body0: { part: 'fl-thigh', face: 'bottom' }, body1: { part: 'fl-shin' }, motion: [{ type: 'revolute', axis: 'Z', lowerLimit: 0, upperLimit: 120 }] } },\n { kind: 'mirror-part', target: 'fl-thigh', axis: 'z', chain: true, prefix: { from: 'fl', to: 'fr' } },\n { kind: 'mirror-part', target: 'fl-thigh', axis: 'x', chain: true, prefix: { from: 'fl', to: 'bl' }, keepMotion: true },\n { kind: 'mirror-part', target: 'fr-thigh', axis: 'x', chain: true, prefix: { from: 'fr', to: 'br' }, keepMotion: true }\n ]),\n wrong: steps([\n { kind: 'add-part', part: { id: 'body', kind: 'box', dimensions: { width: 800, height: 200, depth: 300 } } },\n { kind: 'set-placement', placement: 'floor' },\n { kind: 'attach', part: 'body', to: { plane: 'mounting-plane' }, gap: 500 },\n { kind: 'add-part', part: { id: 'fl-thigh', kind: 'box', dimensions: { width: 60, height: 250, depth: 60 } } },\n { kind: 'add-part', part: { id: 'fl-shin', kind: 'box', dimensions: { width: 40, height: 250, depth: 40 } } },\n { kind: 'set-joint', joint: { id: 'fl-hip', body0: { part: 'body', face: 'bottom' }, body1: { part: 'fl-thigh' }, origin: { align: { x: 'max', z: 'max' } }, motion: [{ type: 'revolute', axis: 'Z', lowerLimit: -45, upperLimit: 45 }] } },\n { kind: 'set-joint', joint: { id: 'fl-knee', body0: { part: 'fl-thigh', face: 'bottom' }, body1: { part: 'fl-shin' }, motion: [{ type: 'revolute', axis: 'Z', lowerLimit: 0, upperLimit: 120 }] } }\n ])\n },\n {\n id: 'pipeline-run',\n title: '새 피규어: 굽힘 셋 이상인 곡선 배관과 끝 플랜지 (ADR-0100 §16.2)',\n covers: ['add-part pipe', 'several bends', 'attach to a pipe end'],\n prompt: '펌프에서 탱크로 가는 지름 100 배관: 바닥에서 1m 올라가 옆으로 꺾고, 다시 앞으로 꺾고, 마지막에 다시 옆으로 꺾여 탱크 옆면으로 들어가게. 배관 끝에는 플랜지',\n name: 'Pipeline',\n check: after => {\n const parts = scenarioPartsOf(after)\n const misses = [...loose(parts)]\n const pipes = parts.filter(p => p.kind === 'sweep')\n const bends = pipes.reduce((n, p) => n + (p.shape?.sweep?.path ?? []).filter((s: Dynamic) => s.kind === 'bend').length, 0)\n if (!pipes.length) return [...misses, 'no part along a path (a pipe)']\n if (bends < 3) misses.push(`${bends} bends, three asked`)\n /* A flange on the pipe's far end, up in the air: not on its start, on the floor. */\n if (!parts.some(p => pipes.some(q => q.id === p.on) && p.kind !== 'sweep' && bottom(p) > 100)) misses.push('no flange on the end of a pipe')\n return misses\n },\n /* Up Y; toward 90 is +X; heading +X, toward 0 is +Z; heading +Z, toward 180 is +X again -- its end the right face. */\n reference: steps([\n { kind: 'add-part', part: { id: 'line', kind: 'pipe', dimensions: { radius: 50, wall: 5 }, path: [{ line: 1000 }, { bend: { radius: 150, angle: 90, toward: 90 } }, { line: 800 }, { bend: { radius: 150, angle: 90, toward: 0 } }, { line: 600 }, { bend: { radius: 150, angle: 90, toward: 180 } }, { line: 400 }] } },\n { kind: 'attach', part: 'line', to: { plane: 'mounting-plane' } },\n { kind: 'add-part', part: { id: 'flange', kind: 'cylinder', dimensions: { radius: 90, length: 20 } } },\n { kind: 'attach', part: 'flange', to: { part: 'line', face: 'right' } }\n ]),\n wrong: steps([\n { kind: 'add-part', part: { id: 'line', kind: 'pipe', dimensions: { radius: 50, wall: 5 }, path: [{ line: 1000 }, { bend: { radius: 150, angle: 90, toward: 90 } }, { line: 800 }] } },\n { kind: 'attach', part: 'line', to: { plane: 'mounting-plane' } },\n { kind: 'add-part', part: { id: 'flange', kind: 'cylinder', dimensions: { radius: 90, length: 20 } } },\n { kind: 'attach', part: 'flange', to: { part: 'line', face: 'right' } }\n ])\n },\n {\n id: 'pipe-rack',\n title: '새 피규어: 나란히 가는 곡선 배관 두 줄',\n covers: ['several pipes', 'attach align'],\n prompt: 'two parallel pipes side by side, 300 mm apart, each rising 800 mm and bending 90 degrees to run 1 m sideways',\n name: 'Pipe rack',\n check: after => {\n const parts = scenarioPartsOf(after)\n const misses = [...loose(parts)]\n const bent = parts.filter(p => p.kind === 'sweep' && (p.shape?.sweep?.path ?? []).some((s: Dynamic) => s.kind === 'bend'))\n if (bent.length < 2) return [...misses, `${bent.length} bent pipes, two asked`]\n const [a, b] = bent\n const apart = Math.hypot(a!.centre.x - b!.centre.x, a!.centre.z - b!.centre.z)\n if (!(apart > 200 && apart < 400)) misses.push(`the pipes are ${Math.round(apart)} mm apart, 300 asked`)\n if (!near(a!.extent.y, b!.extent.y, 1)) misses.push('the pipes rise to different heights')\n return misses\n },\n reference: steps([\n { kind: 'add-part', part: { id: 'pipe-a', kind: 'pipe', dimensions: { radius: 40, wall: 4 }, path: [{ line: 800 }, { bend: { radius: 120, angle: 90, toward: 90 } }, { line: 1000 }] } },\n { kind: 'add-part', part: { id: 'pipe-b', kind: 'pipe', dimensions: { radius: 40, wall: 4 }, path: [{ line: 800 }, { bend: { radius: 120, angle: 90, toward: 90 } }, { line: 1000 }] } },\n { kind: 'attach', part: 'pipe-a', to: { plane: 'mounting-plane' }, align: { z: { mm: -150 } } },\n { kind: 'attach', part: 'pipe-b', to: { plane: 'mounting-plane' }, align: { z: { mm: 150 } } }\n ]),\n wrong: steps([\n { kind: 'add-part', part: { id: 'pipe-a', kind: 'pipe', dimensions: { radius: 40, wall: 4 }, path: [{ line: 800 }, { bend: { radius: 120, angle: 90, toward: 90 } }, { line: 1000 }] } },\n { kind: 'add-part', part: { id: 'pipe-b', kind: 'pipe', dimensions: { radius: 40, wall: 4 }, path: [{ line: 800 }] } },\n { kind: 'attach', part: 'pipe-a', to: { plane: 'mounting-plane' }, align: { z: { mm: -150 } } },\n { kind: 'attach', part: 'pipe-b', to: { plane: 'mounting-plane' }, align: { z: { mm: 150 } } }\n ])\n },\n {\n id: 'tapering-bent-bar',\n title: '새 피규어: 아래는 굵고 위로 갈수록 가는 휜 막대 (ADR-0100 §16.2.9)',\n /*\n One pipe narrowing along its length (endRadius), or pieces of different sizes fastened end to end: any such making\n passes. The check reads only what stands: something bends, and it is thicker at its lowest than at its highest.\n */\n covers: ['pipe endRadius', 'pipe wall 0', 'pieces of different sizes fastened end to end'],\n prompt: '바닥에서 올라가며 한 번 휘어지는 막대. 아래쪽은 지름 80으로 굵고, 위로 갈수록 가늘어져 끝은 지름 40',\n name: 'Bent bar',\n check: after => {\n const parts = scenarioPartsOf(after)\n const misses = [...loose(parts)]\n if (!parts.some(p => p.kind === 'sweep' && (p.shape?.sweep?.path ?? []).some((s: Dynamic) => s.kind === 'bend'))) misses.push('nothing bends')\n /* How thick each part is at each height: a pipe at its stations, its section there; anything else at its bottom and top. */\n const across = (section: Dynamic) => 2 * Math.max(...Object.values(section.radius ?? {}).map(Number), ...Object.values(section.size ?? {}).map(v => Number(v) / 2))\n const samples = parts.flatMap(p => {\n const w = p.shape?.sweep\n if (!w) return [{ y: bottom(p), thick: Math.min(p.extent.x, p.extent.z) }, { y: top(p), thick: Math.min(p.extent.x, p.extent.z) }]\n const pose = (compileFigureAsset(after).evaluate().geometry as Dynamic[]).find(g => g.id === p.id)?.pose\n const y = (q: number[]) => (pose ? pose.r[1][0] * q[0]! + pose.r[1][1] * q[1]! + pose.r[1][2] * q[2]! + pose.t[1] : q[1]!)\n return w.stations.map((st: Dynamic) => ({ y: y(st.p), thick: across(figureSweepSectionAt(w, st.t)) }))\n })\n const low = samples.reduce((a, b) => (b.y < a.y ? b : a))\n const high = samples.reduce((a, b) => (b.y > a.y ? b : a))\n if (!(low.thick > high.thick + 1)) misses.push(`${Math.round(low.thick)} thick at its lowest, ${Math.round(high.thick)} at its highest: thicker below asked`)\n if (parts.some(p => p.shape?.sweep?.wall !== undefined)) misses.push('a bar is hollow')\n return misses\n },\n reference: steps([\n { kind: 'add-part', part: { id: 'bar', kind: 'pipe', dimensions: { radius: 40, wall: 0, endRadius: 20 }, path: [{ line: 600 }, { bend: { radius: 200, angle: 60, toward: 90 } }, { line: 300 }] } },\n { kind: 'attach', part: 'bar', to: { plane: 'mounting-plane' } }\n ]),\n wrong: steps([\n { kind: 'add-part', part: { id: 'bar', kind: 'pipe', dimensions: { radius: 20, wall: 0, endRadius: 40 }, path: [{ line: 600 }, { bend: { radius: 200, angle: 60, toward: 90 } }, { line: 300 }] } },\n { kind: 'attach', part: 'bar', to: { plane: 'mounting-plane' } }\n ])\n },\n {\n id: 'pipe-down-into-tank',\n title: '새 피규어: 아래로 꺾여 내려가는 배관 끝에 플랜지 (ADR-0100 §16.2.7)',\n covers: ['pipe end heading down', 'attach to a pipe end'],\n prompt: '바닥에서 1m 올라가 옆으로 800mm 가다가 아래로 꺾여 500mm 내려가는 배관. 내려간 끝에 플랜지를 달아 줘',\n name: 'Drop pipe',\n check: after => {\n const parts = scenarioPartsOf(after)\n const misses = [...loose(parts)]\n const pipe = parts.find(p => p.kind === 'sweep' && (p.shape.sweep.stations.at(-1).n as number[])[1]! < -0.999)\n if (!pipe) return [...misses, 'no pipe ends heading down']\n const joints = ((after as Dynamic).joints ?? []) as Dynamic[]\n const onEnd = joints.find(j => j.body0?.part === pipe.id && pipe.shape.faces[j.body0.face]?.station === 'last')\n if (!onEnd) misses.push(\"nothing is fastened to the pipe's lower end\")\n return misses\n },\n /* Up; toward 90 is +X; heading +X, toward 90 turns it down. Its end, heading down, is its bottom face. */\n reference: steps([\n { kind: 'add-part', part: { id: 'drop', kind: 'pipe', dimensions: { radius: 50, wall: 5 }, path: [{ line: 1000 }, { bend: { radius: 150, angle: 90, toward: 90 } }, { line: 800 }, { bend: { radius: 150, angle: 90, toward: 90 } }, { line: 500 }] } },\n { kind: 'attach', part: 'drop', to: { plane: 'mounting-plane' } },\n { kind: 'add-part', part: { id: 'flange', kind: 'cylinder', dimensions: { radius: 90, length: 20 } } },\n { kind: 'attach', part: 'flange', to: { part: 'drop', face: 'bottom' } }\n ]),\n wrong: steps([\n { kind: 'add-part', part: { id: 'drop', kind: 'pipe', dimensions: { radius: 50, wall: 5 }, path: [{ line: 1000 }, { bend: { radius: 150, angle: 90, toward: 90 } }, { line: 800 }, { bend: { radius: 150, angle: 90, toward: 90 } }, { line: 500 }] } },\n { kind: 'attach', part: 'drop', to: { plane: 'mounting-plane' } },\n { kind: 'add-part', part: { id: 'flange', kind: 'cylinder', dimensions: { radius: 90, length: 20 } } },\n { kind: 'attach', part: 'flange', to: { plane: 'mounting-plane' } }\n ])\n },\n {\n id: 'mixer-port',\n title: '고치기: 포트 폭 두 배와 새 색, 몸통은 그대로',\n covers: ['set-section across', 'set-material', 'a revision changes only what is asked'],\n prompt: 'make the port twice as wide and give it an accent colour',\n base: mixerDraft,\n check: (after, before) => portRevisionMisses(before!, after),\n reference: steps([{ kind: 'set-section', part: 'port', across: { x: 160 } }, accent('port', '#d08a2c')]),\n wrong: steps([accent('port', '#d08a2c')])\n },\n {\n id: 'open-tote',\n title: '고치기: 상자를 위가 열린 통으로, 벽 10mm',\n covers: ['set-cavity'],\n prompt: '이 상자를 위가 열린 통으로 만들어 줘. 벽 두께 10mm, 바닥 두께 15mm',\n base: boxDraft,\n check: after => {\n const bin = scenarioPartsOf(after).find(p => p.id === 'bin')\n if (!bin) return ['the box is gone']\n const c = bin.shape?.cavity\n if (!c) return ['no inside']\n const misses: string[] = []\n if (c.end !== 'open') misses.push('its top is not open')\n if (c.start === 'open') misses.push('its bottom is open too')\n if (!Object.values(c.wall).every(w => near(w as number, 10))) misses.push(`walls ${Object.values(c.wall).join(', ')}, 10 asked`)\n return misses\n },\n reference: steps([{ kind: 'set-cavity', part: 'bin', cavity: { wall: 10, start: { closed: 15 }, end: 'open' } }]),\n wrong: steps([{ kind: 'set-cavity', part: 'bin', cavity: { wall: 10, start: 'open', end: 'open' } }])\n },\n {\n id: 'pipe-extend',\n title: '고치기: 관 끝에 아래로 꺾이는 굽힘과 직선 더하기 (ADR-0100 §16.2)',\n covers: ['set-pipe path', 'bend direction'],\n prompt: '이 관의 끝에서 아래쪽으로 90도 한 번 더 꺾고 300mm 더 뻗게 해 줘. 앞부분은 그대로',\n base: elbowDraft,\n check: (after, before) => {\n const was = scenarioPartsOf(before!).find(p => p.id === 'pipe')!\n const now = scenarioPartsOf(after).find(p => p.id === 'pipe')\n if (!now?.shape?.sweep) return ['the pipe is gone']\n const misses: string[] = []\n const [p0, p1] = [was.shape.sweep.path, now.shape.sweep.path]\n if (JSON.stringify(p1.slice(0, p0.length)) !== JSON.stringify(p0)) misses.push('the pipe as it was is changed')\n if (p1.length !== p0.length + 2) misses.push(`${p1.length - p0.length} pieces added, a bend and a run asked`)\n else {\n const [bend, run] = p1.slice(p0.length)\n if (!(bend.kind === 'bend' && near(bend.angle, 90))) misses.push(`it adds ${JSON.stringify(bend)}, a 90° bend asked`)\n if (!(run.kind === 'line' && near(run.length, 300))) misses.push(`it adds ${JSON.stringify(run)}, a 300 mm run asked`)\n }\n const heading = now.shape.sweep.stations.at(-1).n as number[]\n if (!(heading[1]! < -0.999)) misses.push(`it ends heading ${heading.map(v => Math.round(v * 100) / 100).join(', ')}, down asked`)\n return misses\n },\n /* Heading +X after the first bend, its section's first axis is still +Z and its second is now -Y: 90 turns it down. */\n reference: steps([{ kind: 'set-pipe', part: 'pipe', path: [{ line: 500 }, { bend: { radius: 120, angle: 90, toward: 90 } }, { line: 400 }, { bend: { radius: 120, angle: 90, toward: 90 } }, { line: 300 }] }]),\n wrong: steps([{ kind: 'set-pipe', part: 'pipe', path: [{ line: 500 }, { bend: { radius: 120, angle: 90, toward: 90 } }, { line: 400 }, { bend: { radius: 120, angle: 90, toward: 270 } }, { line: 300 }] }])\n },\n {\n id: 'pipe-to-duct',\n title: '고치기: 원형 관을 사각 덕트로, 경로는 그대로',\n covers: ['set-pipe section'],\n prompt: '이 관을 가로 120, 세로 80 의 사각 덕트로 바꿔 줘. 경로는 그대로',\n base: elbowDraft,\n check: (after, before) => {\n const was = scenarioPartsOf(before!).find(p => p.id === 'pipe')!\n const now = scenarioPartsOf(after).find(p => p.id === 'pipe')\n if (!now?.shape?.sweep) return ['the pipe is gone']\n const misses: string[] = []\n const s = now.shape.sweep.section\n if (s.kind !== 'rectangle') return [`its section is a ${s.kind}, a rectangle asked`]\n const sizes = [s.size.x, s.size.z].sort((a: number, b: number) => a - b)\n if (!(near(sizes[0], 80) && near(sizes[1], 120))) misses.push(`its section is ${s.size.x}×${s.size.z}, 120×80 asked`)\n if (JSON.stringify(now.shape.sweep.path) !== JSON.stringify(was.shape.sweep.path)) misses.push('its path changed')\n return misses\n },\n reference: steps([{ kind: 'set-pipe', part: 'pipe', width: 120, depth: 80, round: 0 }]),\n wrong: steps([{ kind: 'set-pipe', part: 'pipe', width: 120, depth: 80, round: 0, path: [{ line: 500 }, { bend: { radius: 120, angle: 90, toward: 90 } }, { line: 300 }] }])\n },\n {\n id: 'pipe-to-solid-bar',\n title: '고치기: 관을 굵은 속찬 막대로, 경로는 그대로',\n covers: ['set-pipe radius', 'wall 0'],\n prompt: '이 관을 지름 60 의 속이 찬 막대로 바꿔 줘',\n base: elbowDraft,\n check: (after, before) => {\n const was = scenarioPartsOf(before!).find(p => p.id === 'pipe')!\n const now = scenarioPartsOf(after).find(p => p.id === 'pipe')\n if (!now?.shape?.sweep) return ['the pipe is gone']\n const misses: string[] = []\n const s = now.shape.sweep.section\n if (s.kind !== 'ellipse' || !near(s.radius.x, 30)) misses.push(`its section is ${JSON.stringify(s)}, a 60 mm circle asked`)\n if (now.shape.sweep.wall !== undefined) misses.push('it is still hollow')\n if (JSON.stringify(now.shape.sweep.path) !== JSON.stringify(was.shape.sweep.path)) misses.push('its path changed')\n return misses\n },\n reference: steps([{ kind: 'set-pipe', part: 'pipe', radius: 30, wall: 0 }]),\n wrong: steps([{ kind: 'set-pipe', part: 'pipe', radius: 30 }])\n },\n {\n id: 'pipe-narrow',\n title: '고치기: 관이 끝으로 갈수록 가늘어지게 (ADR-0100 §16.2.9)',\n covers: ['set-pipe endRadius'],\n prompt: '이 관이 끝으로 갈수록 가늘어져서 끝에서는 지름 40 이 되게 해 줘. 시작 굵기와 경로는 그대로',\n base: elbowDraft,\n check: (after, before) => {\n const was = scenarioPartsOf(before!).find(p => p.id === 'pipe')!\n const now = scenarioPartsOf(after).find(p => p.id === 'pipe')\n if (!now?.shape?.sweep) return ['the pipe is gone']\n const w = now.shape.sweep\n const misses: string[] = []\n if (!w.to) misses.push(`it does not narrow: one section, ${JSON.stringify(w.section)}, end to end`)\n else if (!(w.to.kind === 'ellipse' && near(w.to.radius.x, 20))) misses.push(`its end is ${JSON.stringify(w.to)}, a 40 mm circle asked`)\n if (!near(w.section.radius?.x ?? 0, was.shape.sweep.section.radius.x)) misses.push('its start changed')\n if (JSON.stringify(w.path) !== JSON.stringify(was.shape.sweep.path)) misses.push('its path changed')\n return misses\n },\n reference: steps([{ kind: 'set-pipe', part: 'pipe', endRadius: 20 }]),\n wrong: steps([{ kind: 'set-pipe', part: 'pipe', radius: 20 }])\n },\n {\n id: 'pipe-turn-other-way',\n title: '고치기: 관이 반대쪽(-X)으로 꺾이게',\n covers: ['set-pipe bend toward'],\n prompt: '이 관이 오른쪽이 아니라 반대쪽(-X 방향)으로 꺾이게 해 줘. 길이와 굵기는 그대로',\n base: elbowDraft,\n check: after => {\n const now = scenarioPartsOf(after).find(p => p.id === 'pipe')\n if (!now?.shape?.sweep) return ['the pipe is gone']\n const misses: string[] = []\n const end = now.shape.sweep.stations.at(-1)\n if (!(end.n[0] < -0.999)) misses.push(`it ends heading ${end.n.map((v: number) => Math.round(v * 100) / 100).join(', ')}, -X asked`)\n const lengths = now.shape.sweep.path.map((p: Dynamic) => p.length ?? p.radius)\n if (JSON.stringify(lengths) !== JSON.stringify([500, 120, 400])) misses.push(`its runs and radius are ${lengths.join(', ')}, kept asked`)\n return misses\n },\n reference: steps([{ kind: 'set-pipe', part: 'pipe', path: [{ line: 500 }, { bend: { radius: 120, angle: 90, toward: 270 } }, { line: 400 }] }]),\n wrong: steps([{ kind: 'set-pipe', part: 'pipe', path: [{ line: 500 }, { bend: { radius: 120, angle: 90, toward: 0 } }, { line: 400 }] }])\n },\n {\n id: 'box-tapered-top',\n title: '고치기: 상자 윗면을 절반 크기로 (ADR-0100 §16.1)',\n covers: ['set-section top'],\n prompt: '이 상자의 윗면을 가로세로 절반 크기로 줄여서 위로 갈수록 좁아지게 해 줘. 아랫면은 그대로',\n base: boxDraft,\n check: (after, before) => {\n const was = scenarioPartsOf(before!).find(p => p.id === 'bin')!\n const now = scenarioPartsOf(after).find(p => p.id === 'bin')\n if (!now) return ['the box is gone']\n if (now.kind !== 'tapered') return [`it is a ${now.kind}, a tapered box asked`]\n const misses: string[] = []\n const [from, to] = [now.shape.loft.section.size, now.shape.loft.to.size]\n if (!(near(from.x, was.extent.x) && near(from.z, was.extent.z))) misses.push(`its bottom is ${from.x}×${from.z}, kept asked`)\n if (!(near(to.x, from.x / 2) && near(to.z, from.z / 2))) misses.push(`its top is ${to.x}×${to.z}, half asked`)\n return misses\n },\n reference: steps([{ kind: 'set-section', part: 'bin', top: { across: { x: 300, z: 200 } } }]),\n wrong: steps([{ kind: 'set-section', part: 'bin', across: { x: 300, z: 200 } }])\n },\n {\n id: 'table-follows-width',\n title: '고치기: 보드에서 폭을 바꾸면 상판이 따라가게',\n covers: ['declare-instance-size', 'follow-size'],\n prompt: '보드에서 이 테이블의 폭을 바꾸면 상판 폭이 따라 늘어나게 해 줘. 다리는 그대로',\n base: tableDraft,\n check: after => {\n const inputs = (after.document.model as Dynamic).inputs as Dynamic[]\n const width = inputs.find(i => i.id === 'size.x')\n if (!width) return [\"the figure's size is not declared\"]\n const at = (x: number) => scenarioPartsOf({ ...after, designInputs: { ...after.designInputs, 'size.x': x } } as FigureAsset)\n const was = Object.fromEntries(at(after.designInputs['size.x'] as number).map(p => [p.id, p]))\n const wider = Object.fromEntries(at((after.designInputs['size.x'] as number) * 1.5).map(p => [p.id, p]))\n const misses: string[] = []\n if (!(wider.top!.extent.x > was.top!.extent.x + 1)) misses.push('the top does not grow with the width')\n if (!near(wider.leg!.extent.x, was.leg!.extent.x)) misses.push('the leg grows with the width')\n return misses\n },\n reference: steps([{ kind: 'declare-instance-size' }, { kind: 'follow-size', part: 'top', axes: ['x'] }]),\n wrong: steps([{ kind: 'declare-instance-size' }])\n },\n {\n id: 'status-lamp',\n title: '고치기: 상태 값으로 램프 색 (데이터 바인딩)',\n covers: ['set-data-schema', 'set-data-binding table'],\n prompt: 'status 값이 ALARM 이면 램프를 빨간색으로 깜빡이고, NORMAL 이면 초록색으로 켜지게 해 줘',\n base: lampDraft,\n check: after => {\n const bindings = ((after as Dynamic).dataInterface?.bindings ?? []) as Dynamic[]\n const table = bindings.find(b => b.rule === 'table' && (b.targets?.parts ?? []).includes('lamp'))\n if (!table) return ['no table binding on the lamp']\n const misses: string[] = []\n const red = (c: string | undefined) => !!c && /^#([ef][0-9a-f]|d[89a-f])[0-4][0-9a-f][0-4][0-9a-f]$/i.test(c)\n const green = (c: string | undefined) => !!c && /^#[0-4][0-9a-f]([89a-f][0-9a-f])[0-6][0-9a-f]$/i.test(c)\n if (!red(table.table?.ALARM?.color)) misses.push(`ALARM is ${table.table?.ALARM?.color ?? 'not there'}, red asked`)\n if (table.table?.ALARM?.effect?.kind !== 'blink') misses.push('ALARM does not blink')\n if (!green(table.table?.NORMAL?.color)) misses.push(`NORMAL is ${table.table?.NORMAL?.color ?? 'not there'}, green asked`)\n return misses\n },\n reference: steps([\n { kind: 'set-data-schema', schema: [{ name: 'status', kind: 'text', values: ['NORMAL', 'ALARM'] }] },\n { kind: 'set-data-binding', binding: { id: 'lamp-status', accessor: 'status', rule: 'table', lookup: 'code', targets: { parts: ['lamp'] }, table: { ALARM: { color: '#ef4444', effect: { kind: 'blink' } }, NORMAL: { color: '#22c55e' } } } }\n ]),\n wrong: steps([\n { kind: 'set-data-schema', schema: [{ name: 'status', kind: 'text', values: ['NORMAL', 'ALARM'] }] },\n { kind: 'set-data-binding', binding: { id: 'lamp-status', accessor: 'status', rule: 'table', lookup: 'code', targets: { parts: ['lamp'] }, table: { ALARM: { color: '#ef4444' }, NORMAL: { color: '#22c55e' } } } }\n ])\n }\n]\n"]}
|
|
@@ -244,6 +244,7 @@ const SUBJECT = {
|
|
|
244
244
|
'set-section-corner': step => step.part,
|
|
245
245
|
'set-cavity': step => step.part,
|
|
246
246
|
'set-section': step => step.part,
|
|
247
|
+
'set-pipe': step => step.part,
|
|
247
248
|
attach: step => step.part,
|
|
248
249
|
'link-dimension': step => step.part,
|
|
249
250
|
'follow-size': step => step.part,
|
|
@@ -266,6 +267,7 @@ const SUBJECT = {
|
|
|
266
267
|
'set-visibility': step => step.target,
|
|
267
268
|
'remove-part': step => step.target,
|
|
268
269
|
'duplicate-part': step => step.target,
|
|
270
|
+
'mirror-part': step => step.target,
|
|
269
271
|
'move-part': step => step.target,
|
|
270
272
|
'set-placement': () => undefined,
|
|
271
273
|
'declare-instance-size': () => undefined,
|
|
@@ -290,6 +292,7 @@ const SUBJECT = {
|
|
|
290
292
|
'set-driver': () => undefined,
|
|
291
293
|
'remove-driver': () => undefined,
|
|
292
294
|
'set-clip': () => undefined,
|
|
295
|
+
'copy-clip': () => undefined,
|
|
293
296
|
'set-motion-group': () => undefined,
|
|
294
297
|
'remove-motion-group': () => undefined,
|
|
295
298
|
'set-data-schema': () => undefined,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"figure-context.js","sourceRoot":"","sources":["../../../server/service/figure/figure-context.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * What of a figure the model is shown (ADR-0061 2026-10-16 decision 4).\n *\n * The kernel keeps a figure up to 1 MiB (`FIGURE_JSON_MAX_BYTES`); that is whether the figure is valid. How much of it the\n * model reads at once is another question with its own number. A figure that fits is shown whole. One that does not is\n * shown as an outline -- its sections, and every part by name, shape and what it is fastened to -- and in full only the\n * parts and sections asked for, while they fit. A section too large for the outline is left out, named by its JSON\n * Pointer with the entries inside it, and read by pointer. The full source stays on the server: a proposal is applied\n * and judged on it, on the version the request was made on.\n *\n * A proposal on a figure shown in part changes only what it was shown: no part not read in full, and nothing inside a\n * section left out and not read. Read is what the server put before the writer, never what a model says it read.\n */\nimport type { FigureAsset, FigureProposalStep } from '@hatiolab/figure-model'\n\n/** The most of a figure, serialized, the model is shown in one read. Not a validity limit: that is the kernel's. */\nexport const FIGURE_CONTEXT_BUDGET = 100_000\n\n/** Of the budget, what the outline's sections may take; the rest is for the parts and sections read beside it. */\nconst OUTLINE_SHARE = FIGURE_CONTEXT_BUDGET / 2\n\n/** How many entries of a section left out, or pointers in a reason, are named: the largest first. */\nconst ENTRIES_NAMED = 20\n\ntype Dynamic = any\n\nexport interface FigureOutlinePart {\n id: string\n /** The operation that makes its shape (`box@1`, `extrude@1`, ...). */\n shape?: string\n /** What it is fastened to: `<part>.<face>`, `mounting-plane`, or nothing when unfastened. */\n on?: string\n /** Its joint, and how it moves: each axis's type in order (ADR-0159); no motion for a fastening. */\n joint?: { id: string; motion?: string[] }\n material?: string\n /** How long its part read is: what reading it costs. */\n chars: number\n}\n\nexport interface FigureOmittedSection {\n /** The JSON Pointer of the section left out. */\n section: string\n chars: number\n /** Its largest entries, by pointer: what to read when the whole does not fit. */\n entries?: { section: string; chars: number }[]\n}\n\nexport interface FigureOutline {\n /** The whole source's length, and the budget it does not fit. */\n chars: number\n budget: number\n parts: FigureOutlinePart[]\n /** Parts the outline had no room to list, past the ones listed. */\n partsNotListed?: number\n /** Sections left out because they would crowd the outline. */\n omitted?: FigureOmittedSection[]\n [section: string]: unknown\n}\n\nexport interface FigurePartRead {\n appearance: Dynamic\n /** The fastenings that name it: its own (body1) and its children's (body0). */\n joints: Dynamic[]\n /** The graph nodes and constants under its name: `<part>` and `<part>.*` (a part id has no dot). */\n nodes: Dynamic[]\n constants: Dynamic[]\n}\n\nexport interface FigureReadRequest {\n parts?: readonly string[]\n /** JSON Pointers (RFC 6901) into the source, such as `/document/capabilities/bindings/0`. */\n sections?: readonly string[]\n}\n\nexport interface FigureView {\n whole: boolean\n /** Whole: the source as it is. */\n source?: FigureAsset\n outline?: FigureOutline\n /** The parts shown in full, by id, in the order asked. */\n parts?: Record<string, FigurePartRead>\n shown?: string[]\n /** The sections read, by pointer. */\n sections?: Record<string, unknown>\n /** What was asked for and not shown, with why and what to read instead. */\n notRead?: ({ part: string; reason: string } | { section: string; reason: string })[]\n}\n\nconst length = (value: unknown) => JSON.stringify(value)?.length ?? 0\nconst under = (part: string) => (id: unknown) => id === part || (typeof id === 'string' && id.startsWith(`${part}.`))\n\n/* ── JSON Pointer (RFC 6901) ─────────────────────────────────────────────────────────── */\n\nconst escapeToken = (token: string) => token.replace(/~/g, '~0').replace(/\\//g, '~1')\nconst pointerOf = (tokens: readonly (string | number)[]) => tokens.map(t => `/${escapeToken(String(t))}`).join('')\nfunction tokensOf(pointer: string): string[] | undefined {\n if (typeof pointer !== 'string' || !pointer.startsWith('/')) return undefined\n return pointer.slice(1).split('/').map(t => t.replace(/~1/g, '/').replace(/~0/g, '~'))\n}\nfunction valueAt(root: unknown, tokens: readonly string[]): { found: boolean; value?: unknown } {\n let at: Dynamic = root\n for (const token of tokens) {\n if (at === null || typeof at !== 'object' || !Object.prototype.hasOwnProperty.call(at, token)) return { found: false }\n at = at[token]\n }\n return { found: true, value: at }\n}\n/** `inner` is `outer` or inside it. */\nconst within = (inner: string, outer: string) => inner === outer || inner.startsWith(`${outer}/`)\n\n/** A value's entries by pointer, largest first, the first ENTRIES_NAMED of them. */\nfunction entriesOf(pointer: string, value: unknown): { section: string; chars: number }[] {\n if (value === null || typeof value !== 'object') return []\n const tokens = tokensOf(pointer)!\n return Object.entries(value as object)\n .map(([key, entry]) => ({ section: pointerOf([...tokens, key]), chars: length(entry) }))\n .sort((a, b) => b.chars - a.chars)\n .slice(0, ENTRIES_NAMED)\n}\n\n/* ── Parts ───────────────────────────────────────────────────────────────────────────── */\n\nexport function figurePartReadOf(asset: FigureAsset, part: string): FigurePartRead | undefined {\n const appearance = asset.appearance.find(a => a.target === part)\n if (!appearance) return undefined\n const model = asset.document.model as Dynamic\n const own = under(part)\n return {\n appearance,\n joints: ((asset as Dynamic).joints ?? []).filter((j: Dynamic) => j?.body1?.part === part || j?.body0?.part === part),\n nodes: model.nodes.filter((n: Dynamic) => own(n.id)),\n constants: model.constants.filter((c: Dynamic) => own(c.id))\n }\n}\n\n/** Where a part's records are, by pointer: for a part too large to read as one. */\nfunction partPointers(asset: FigureAsset, part: string): string[] {\n const model = asset.document.model as Dynamic\n const own = under(part)\n return [\n ...asset.appearance.flatMap((a, i) => (a.target === part ? [pointerOf(['appearance', i])] : [])),\n ...((asset as Dynamic).joints ?? []).flatMap((j: Dynamic, i: number) => (j?.body1?.part === part || j?.body0?.part === part ? [pointerOf(['joints', i])] : [])),\n ...model.nodes.flatMap((n: Dynamic, i: number) => (own(n.id) ? [pointerOf(['document', 'model', 'nodes', i])] : [])),\n ...model.constants.flatMap((c: Dynamic, i: number) => (own(c.id) ? [pointerOf(['document', 'model', 'constants', i])] : []))\n ]\n}\n\n/* ── The outline ─────────────────────────────────────────────────────────────────────── */\n\n/*\n The sections of an outline: every top-level field but the parts' records, the document's fields but its model, and the\n model's fields but its graph. Each may be left out by its pointer.\n*/\nconst PART_RECORDS = ['/document', '/appearance', '/joints', '/document/model', '/document/model/nodes', '/document/model/constants']\nfunction sectionsOf(asset: FigureAsset): string[] {\n const out: string[] = []\n const walk = (tokens: string[]) => {\n const { value } = valueAt(asset, tokens)\n for (const key of Object.keys(value as object)) {\n const pointer = pointerOf([...tokens, key])\n if (pointer === '/document' || pointer === '/document/model') walk([...tokens, key])\n else if (!PART_RECORDS.includes(pointer)) out.push(pointer)\n }\n }\n walk([])\n return out\n}\n\nfunction outlinePartsOf(asset: FigureAsset): FigureOutlinePart[] {\n const nodes = (asset.document.model as Dynamic).nodes\n const joints = (asset as Dynamic).joints ?? []\n return asset.appearance.map((look: Dynamic) => {\n const id = look.target\n const joint = joints.find((j: Dynamic) => j?.body1?.part === id)\n const body0 = joint?.body0\n const on = !joint ? undefined : body0?.part ? `${body0.part}.${body0.face}` : (body0?.plane ?? 'mounting-plane')\n const shape = nodes.find((n: Dynamic) => n.id === `${id}.shape`)?.op\n return {\n id,\n ...(shape ? { shape } : {}),\n ...(on ? { on } : {}),\n /* How it moves: each axis of its joint in order (ADR-0159); none for a fastening. */\n ...(joint ? { joint: { id: joint.id, ...(joint.motion?.length ? { motion: joint.motion.map((m: Dynamic) => m.type) } : {}) } } : {}),\n ...(look.material?.token ? { material: look.material.token } : {}),\n chars: length(figurePartReadOf(asset, id))\n }\n })\n}\n\n/** Writes a section into the outline at its pointer, making the objects on the way. */\nfunction place(outline: Dynamic, tokens: readonly string[], value: unknown) {\n let at = outline\n tokens.slice(0, -1).forEach(token => (at = at[token] ??= {}))\n at[tokens[tokens.length - 1]!] = value\n}\n\n/**\n * What the view wraps the outline in, read or not: an outline that took the whole budget left the view over it by these\n * (53 characters, a figure of 3000 long-named parts, 2026-10-19).\n */\nconst VIEW_ENVELOPE = () => length({ whole: false, outline: {}, parts: {}, shown: [], sections: {}, notRead: [] }) - length({})\n\n/**\n * The outline: within OUTLINE_SHARE for its sections, the largest left out first; and, every field counted, within the\n * budget less what the view wraps it in -- a figure of very many parts lists them by id only, then as many as fit.\n */\nexport function figureOutlineOf(asset: FigureAsset, chars = length(asset)): FigureOutline {\n const limit = FIGURE_CONTEXT_BUDGET - VIEW_ENVELOPE()\n const model = asset.document.model as Dynamic\n const sections = sectionsOf(asset).map(pointer => ({ pointer, value: valueAt(asset, tokensOf(pointer)!).value }))\n const sized = sections.map(s => ({ ...s, chars: length(s.value) })).sort((a, b) => b.chars - a.chars)\n\n let total = sized.reduce((sum, s) => sum + s.chars, 0)\n const omitted: FigureOmittedSection[] = []\n const kept = new Set(sized.map(s => s.pointer))\n for (const s of sized) {\n if (total <= OUTLINE_SHARE) break\n kept.delete(s.pointer)\n total -= s.chars\n const entries = entriesOf(s.pointer, s.value)\n omitted.push({ section: s.pointer, chars: s.chars, ...(entries.length ? { entries } : {}) })\n }\n\n const outline: Dynamic = { chars, budget: FIGURE_CONTEXT_BUDGET }\n place(outline, ['document', 'model', 'nodes'], model.nodes.length)\n place(outline, ['document', 'model', 'constants'], model.constants.length)\n for (const s of sections) if (kept.has(s.pointer)) place(outline, tokensOf(s.pointer)!, s.value)\n if (omitted.length) outline.omitted = omitted\n\n let parts: Dynamic[] = outlinePartsOf(asset)\n outline.parts = parts\n if (length(outline) > limit) outline.parts = parts = parts.map(p => ({ id: p.id }))\n if (length(outline) > limit) {\n /* As many as fit, in part order, with how many more there are. */\n let room = limit - length({ ...outline, parts: [], partsNotListed: parts.length })\n const listed: Dynamic[] = []\n for (const p of parts) {\n room -= length(p) + 1\n if (room < 0) break\n listed.push(p)\n }\n outline.parts = listed\n outline.partsNotListed = parts.length - listed.length\n }\n return outline as FigureOutline\n}\n\n/* ── The view ────────────────────────────────────────────────────────────────────────── */\n\n/**\n * The view of a figure the model is shown: whole when it fits, else the outline and what was asked for -- parts, then\n * sections, each in the order asked -- while it fits beside it. Every field counted, the view is within the budget.\n */\nexport function figureViewOf(asset: FigureAsset, request: FigureReadRequest = {}): FigureView {\n const chars = length(asset)\n if (chars <= FIGURE_CONTEXT_BUDGET) return { whole: true, source: asset }\n\n const outline = figureOutlineOf(asset, chars)\n const view: FigureView = { whole: false, outline, parts: {}, shown: [], sections: {}, notRead: [] }\n const room = () => FIGURE_CONTEXT_BUDGET - length(view)\n const refuse = (one: { part: string; reason: string } | { section: string; reason: string }) => {\n if (length(one) + 1 <= room()) view.notRead!.push(one)\n }\n\n for (const part of [...new Set(request.parts ?? [])]) {\n const one = figurePartReadOf(asset, part)\n if (!one) {\n refuse({ part, reason: `${part} is not a part of this figure; the outline lists its parts` })\n continue\n }\n const cost = length(one) + length(part) + length(part) + 3\n view.parts![part] = one\n view.shown!.push(part)\n if (room() >= 0) continue\n delete view.parts![part]\n view.shown!.pop()\n if (cost <= FIGURE_CONTEXT_BUDGET - length(outline)) {\n refuse({ part, reason: `${part} (${cost} characters) does not fit beside what is already read; read it in another call with fewer parts or sections` })\n } else {\n const pointers = partPointers(asset, part)\n refuse({\n part,\n reason:\n `${part} (${cost} characters) is too large to show beside the outline; read its records as sections: ` +\n `${pointers.slice(0, ENTRIES_NAMED).join(', ')}${pointers.length > ENTRIES_NAMED ? ` and ${pointers.length - ENTRIES_NAMED} more` : ''}. ` +\n 'Parts read as sections are not counted as read in full: they cannot be changed'\n })\n }\n }\n\n for (const section of [...new Set(request.sections ?? [])]) {\n const tokens = tokensOf(section)\n const at = tokens && tokens.length ? valueAt(asset, tokens) : { found: false }\n if (!at.found) {\n refuse({ section, reason: `there is no section ${section}; a section is a JSON Pointer such as /document/capabilities/bindings/0` })\n continue\n }\n const cost = length(at.value) + length(section) + 2\n view.sections![section] = at.value\n if (room() >= 0) continue\n delete view.sections![section]\n const entries = entriesOf(section, at.value)\n refuse({\n section,\n reason: entries.length\n ? `${section} (${cost} characters) is too large to show at once here; read its entries: ${entries.map(e => `${e.section} (${e.chars})`).join(', ')}`\n : `${section} is one value of ${length(at.value)} characters, larger than can be shown here; it cannot be read or changed by a proposal`\n })\n }\n\n if (!view.notRead!.length) delete view.notRead\n return view\n}\n\n/* ── What a proposal may change ──────────────────────────────────────────────────────── */\n\ntype StepOf<K extends FigureProposalStep['kind']> = Extract<FigureProposalStep, { kind: K }>\ntype Subject = string | undefined\n\n/**\n * The part each kind of step changes, read from the field the kernel reads for that kind (audit D4-R1: a `part` beside a\n * `set-material`'s `target` is not read by the kernel, so it may not stand in for it). Every kind of the kernel's step\n * type is here, or this does not compile. A step that changes no one part says so with undefined: what it does to the\n * figure's sections is held by `unreadSectionEdits`.\n */\nconst SUBJECT: { [K in FigureProposalStep['kind']]: (step: StepOf<K>, base: FigureAsset) => Subject } = {\n 'add-part': () => undefined,\n 'set-section-corner': step => step.part,\n 'set-cavity': step => step.part,\n 'set-section': step => step.part,\n attach: step => step.part,\n 'link-dimension': step => step.part,\n 'follow-size': step => step.part,\n 'unlink-dimension': step => step.part,\n 'size-by-state': step => step.part,\n 'scale-position': step => step.part,\n 'fix-position': step => step.part,\n 'nudge-part': step => step.part,\n detach: step => step.part,\n 'make-repeat': step => step.part,\n 'set-repeat': step => step.part,\n 'remove-repeat': step => step.part,\n 'set-mounting-face': step => step.part,\n 'add-binding': step => step.part,\n 'set-joint': step => step.joint?.body1?.part,\n 'remove-joint': (step, base) => ((base as Dynamic).joints ?? []).find((j: Dynamic) => j?.id === step.id)?.body1?.part,\n 'set-material': step => step.target,\n 'set-segments': step => step.target,\n 'rename-part': step => step.target,\n 'set-visibility': step => step.target,\n 'remove-part': step => step.target,\n 'duplicate-part': step => step.target,\n 'move-part': step => step.target,\n 'set-placement': () => undefined,\n 'declare-instance-size': () => undefined,\n 'clear-mounting-face': () => undefined,\n 'scale-uniformly': () => undefined,\n 'follow-size-in-proportion': () => undefined,\n 'set-detail-level': () => undefined,\n 'set-item': () => undefined,\n 'add-design-input': () => undefined,\n 'set-input-range': () => undefined,\n 'publish-input': () => undefined,\n 'unpublish-input': () => undefined,\n 'remove-binding': () => undefined,\n 'set-slot-layout': () => undefined,\n 'remove-slot-layout': () => undefined,\n 'set-extension': () => undefined,\n rename: () => undefined,\n 'set-capabilities': () => undefined,\n 'set-capability-settings': () => undefined,\n 'set-state-input': () => undefined,\n 'set-state-defaults': () => undefined,\n 'set-driver': () => undefined,\n 'remove-driver': () => undefined,\n 'set-clip': () => undefined,\n 'set-motion-group': () => undefined,\n 'remove-motion-group': () => undefined,\n 'set-data-schema': () => undefined,\n 'rename-data-field': () => undefined,\n 'set-data-binding': () => undefined,\n 'remove-data-binding': () => undefined\n}\n\n/**\n * The steps that change a part of the base not shown in full, as reasons said back to the writer. A part may still be\n * named to fasten to or to follow -- the kernel works from it, nothing about it is guessed -- and a new part is the\n * steps' own. A kind this table does not know is refused: it is not let through unjudged.\n */\nexport function unreadPartEdits(base: FigureAsset, steps: readonly FigureProposalStep[], view: FigureView): string[] {\n const existing = new Set(base.appearance.map(a => a.target))\n const shown = new Set(view.shown ?? [])\n const allowed = [...shown].join(', ') || 'none'\n return steps.flatMap((step, i) => {\n const kind = (step as Dynamic)?.kind\n if (typeof kind !== 'string') return []\n const judge = (SUBJECT as Record<string, (step: Dynamic, base: FigureAsset) => Subject>)[kind]\n if (!Object.prototype.hasOwnProperty.call(SUBJECT, kind) || !judge)\n return [`UNKNOWN_STEP: steps[${i}] has the kind \"${kind}\", which is not one of the commands; use only the commands taught.`]\n const part = judge(step, base)\n if (typeof part !== 'string' || !existing.has(part) || shown.has(part)) return []\n return [\n `UNREAD_PART: steps[${i}] (${kind}) changes \"${part}\", which was not shown in full, so its source is not known here. ` +\n `Change only the parts shown in full (${allowed}) or parts the steps add. To change ${part}, read it with getFigureSource parts and pass it in parts to proposeFigureCandidate.`\n ]\n })\n}\n\n/** Entries of a value, keyed by `id` when every entry of a list has a distinct one, else by place. */\nfunction keyedEntries(value: unknown): Map<string, { token: string; value: unknown }> {\n const out = new Map<string, { token: string; value: unknown }>()\n if (Array.isArray(value)) {\n const ids = value.map(v => (v && typeof v === 'object' && typeof (v as Dynamic).id === 'string' ? (v as Dynamic).id : undefined))\n const byId = ids.every(Boolean) && new Set(ids).size === ids.length\n value.forEach((v, i) => out.set(byId ? `id:${ids[i]}` : `at:${i}`, { token: String(i), value: v }))\n } else if (value && typeof value === 'object') {\n for (const [key, v] of Object.entries(value)) out.set(`key:${key}`, { token: key, value: v })\n }\n return out\n}\n\n/**\n * What of the sections left out of the outline and not read the steps changed, as reasons said back to the writer. Judged\n * on what the steps made, not on what they say: nothing that was there may be changed or taken away. A new entry -- a\n * record in a list, a key in a map -- is the steps' own.\n */\nexport function unreadSectionEdits(base: FigureAsset, after: FigureAsset, view: FigureView): string[] {\n const read = Object.keys(view.sections ?? {})\n const reasons: string[] = []\n const say = (pointer: string, what: string) =>\n reasons.push(\n `UNREAD_SECTION: the steps ${what} ${pointer}, which was left out of the outline and not read, so it is not known here. ` +\n `Leave it as it is; to change it, read it with getFigureSource sections and pass it in sections to proposeFigureCandidate.`\n )\n const check = (pointer: string, before: unknown, now: unknown) => {\n if (reasons.length >= ENTRIES_NAMED || read.some(r => within(pointer, r))) return\n const records = (v: unknown) => v !== null && typeof v === 'object'\n if (!records(before) || !records(now) || Array.isArray(before) !== Array.isArray(now)) {\n if (JSON.stringify(before) !== JSON.stringify(now)) say(pointer, 'change')\n return\n }\n const later = keyedEntries(now)\n for (const [key, entry] of keyedEntries(before)) {\n const child = `${pointer}/${escapeToken(entry.token)}`\n const kept = later.get(key)\n if (kept) check(child, entry.value, kept.value)\n else if (!read.some(r => within(child, r))) say(child, 'remove')\n }\n }\n for (const omitted of view.outline?.omitted ?? []) {\n const tokens = tokensOf(omitted.section)!\n check(omitted.section, valueAt(base, tokens).value, valueAt(after, tokens).value)\n }\n return reasons\n}\n"]}
|
|
1
|
+
{"version":3,"file":"figure-context.js","sourceRoot":"","sources":["../../../server/service/figure/figure-context.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * What of a figure the model is shown (ADR-0061 2026-10-16 decision 4).\n *\n * The kernel keeps a figure up to 1 MiB (`FIGURE_JSON_MAX_BYTES`); that is whether the figure is valid. How much of it the\n * model reads at once is another question with its own number. A figure that fits is shown whole. One that does not is\n * shown as an outline -- its sections, and every part by name, shape and what it is fastened to -- and in full only the\n * parts and sections asked for, while they fit. A section too large for the outline is left out, named by its JSON\n * Pointer with the entries inside it, and read by pointer. The full source stays on the server: a proposal is applied\n * and judged on it, on the version the request was made on.\n *\n * A proposal on a figure shown in part changes only what it was shown: no part not read in full, and nothing inside a\n * section left out and not read. Read is what the server put before the writer, never what a model says it read.\n */\nimport type { FigureAsset, FigureProposalStep } from '@hatiolab/figure-model'\n\n/** The most of a figure, serialized, the model is shown in one read. Not a validity limit: that is the kernel's. */\nexport const FIGURE_CONTEXT_BUDGET = 100_000\n\n/** Of the budget, what the outline's sections may take; the rest is for the parts and sections read beside it. */\nconst OUTLINE_SHARE = FIGURE_CONTEXT_BUDGET / 2\n\n/** How many entries of a section left out, or pointers in a reason, are named: the largest first. */\nconst ENTRIES_NAMED = 20\n\ntype Dynamic = any\n\nexport interface FigureOutlinePart {\n id: string\n /** The operation that makes its shape (`box@1`, `extrude@1`, ...). */\n shape?: string\n /** What it is fastened to: `<part>.<face>`, `mounting-plane`, or nothing when unfastened. */\n on?: string\n /** Its joint, and how it moves: each axis's type in order (ADR-0159); no motion for a fastening. */\n joint?: { id: string; motion?: string[] }\n material?: string\n /** How long its part read is: what reading it costs. */\n chars: number\n}\n\nexport interface FigureOmittedSection {\n /** The JSON Pointer of the section left out. */\n section: string\n chars: number\n /** Its largest entries, by pointer: what to read when the whole does not fit. */\n entries?: { section: string; chars: number }[]\n}\n\nexport interface FigureOutline {\n /** The whole source's length, and the budget it does not fit. */\n chars: number\n budget: number\n parts: FigureOutlinePart[]\n /** Parts the outline had no room to list, past the ones listed. */\n partsNotListed?: number\n /** Sections left out because they would crowd the outline. */\n omitted?: FigureOmittedSection[]\n [section: string]: unknown\n}\n\nexport interface FigurePartRead {\n appearance: Dynamic\n /** The fastenings that name it: its own (body1) and its children's (body0). */\n joints: Dynamic[]\n /** The graph nodes and constants under its name: `<part>` and `<part>.*` (a part id has no dot). */\n nodes: Dynamic[]\n constants: Dynamic[]\n}\n\nexport interface FigureReadRequest {\n parts?: readonly string[]\n /** JSON Pointers (RFC 6901) into the source, such as `/document/capabilities/bindings/0`. */\n sections?: readonly string[]\n}\n\nexport interface FigureView {\n whole: boolean\n /** Whole: the source as it is. */\n source?: FigureAsset\n outline?: FigureOutline\n /** The parts shown in full, by id, in the order asked. */\n parts?: Record<string, FigurePartRead>\n shown?: string[]\n /** The sections read, by pointer. */\n sections?: Record<string, unknown>\n /** What was asked for and not shown, with why and what to read instead. */\n notRead?: ({ part: string; reason: string } | { section: string; reason: string })[]\n}\n\nconst length = (value: unknown) => JSON.stringify(value)?.length ?? 0\nconst under = (part: string) => (id: unknown) => id === part || (typeof id === 'string' && id.startsWith(`${part}.`))\n\n/* ── JSON Pointer (RFC 6901) ─────────────────────────────────────────────────────────── */\n\nconst escapeToken = (token: string) => token.replace(/~/g, '~0').replace(/\\//g, '~1')\nconst pointerOf = (tokens: readonly (string | number)[]) => tokens.map(t => `/${escapeToken(String(t))}`).join('')\nfunction tokensOf(pointer: string): string[] | undefined {\n if (typeof pointer !== 'string' || !pointer.startsWith('/')) return undefined\n return pointer.slice(1).split('/').map(t => t.replace(/~1/g, '/').replace(/~0/g, '~'))\n}\nfunction valueAt(root: unknown, tokens: readonly string[]): { found: boolean; value?: unknown } {\n let at: Dynamic = root\n for (const token of tokens) {\n if (at === null || typeof at !== 'object' || !Object.prototype.hasOwnProperty.call(at, token)) return { found: false }\n at = at[token]\n }\n return { found: true, value: at }\n}\n/** `inner` is `outer` or inside it. */\nconst within = (inner: string, outer: string) => inner === outer || inner.startsWith(`${outer}/`)\n\n/** A value's entries by pointer, largest first, the first ENTRIES_NAMED of them. */\nfunction entriesOf(pointer: string, value: unknown): { section: string; chars: number }[] {\n if (value === null || typeof value !== 'object') return []\n const tokens = tokensOf(pointer)!\n return Object.entries(value as object)\n .map(([key, entry]) => ({ section: pointerOf([...tokens, key]), chars: length(entry) }))\n .sort((a, b) => b.chars - a.chars)\n .slice(0, ENTRIES_NAMED)\n}\n\n/* ── Parts ───────────────────────────────────────────────────────────────────────────── */\n\nexport function figurePartReadOf(asset: FigureAsset, part: string): FigurePartRead | undefined {\n const appearance = asset.appearance.find(a => a.target === part)\n if (!appearance) return undefined\n const model = asset.document.model as Dynamic\n const own = under(part)\n return {\n appearance,\n joints: ((asset as Dynamic).joints ?? []).filter((j: Dynamic) => j?.body1?.part === part || j?.body0?.part === part),\n nodes: model.nodes.filter((n: Dynamic) => own(n.id)),\n constants: model.constants.filter((c: Dynamic) => own(c.id))\n }\n}\n\n/** Where a part's records are, by pointer: for a part too large to read as one. */\nfunction partPointers(asset: FigureAsset, part: string): string[] {\n const model = asset.document.model as Dynamic\n const own = under(part)\n return [\n ...asset.appearance.flatMap((a, i) => (a.target === part ? [pointerOf(['appearance', i])] : [])),\n ...((asset as Dynamic).joints ?? []).flatMap((j: Dynamic, i: number) => (j?.body1?.part === part || j?.body0?.part === part ? [pointerOf(['joints', i])] : [])),\n ...model.nodes.flatMap((n: Dynamic, i: number) => (own(n.id) ? [pointerOf(['document', 'model', 'nodes', i])] : [])),\n ...model.constants.flatMap((c: Dynamic, i: number) => (own(c.id) ? [pointerOf(['document', 'model', 'constants', i])] : []))\n ]\n}\n\n/* ── The outline ─────────────────────────────────────────────────────────────────────── */\n\n/*\n The sections of an outline: every top-level field but the parts' records, the document's fields but its model, and the\n model's fields but its graph. Each may be left out by its pointer.\n*/\nconst PART_RECORDS = ['/document', '/appearance', '/joints', '/document/model', '/document/model/nodes', '/document/model/constants']\nfunction sectionsOf(asset: FigureAsset): string[] {\n const out: string[] = []\n const walk = (tokens: string[]) => {\n const { value } = valueAt(asset, tokens)\n for (const key of Object.keys(value as object)) {\n const pointer = pointerOf([...tokens, key])\n if (pointer === '/document' || pointer === '/document/model') walk([...tokens, key])\n else if (!PART_RECORDS.includes(pointer)) out.push(pointer)\n }\n }\n walk([])\n return out\n}\n\nfunction outlinePartsOf(asset: FigureAsset): FigureOutlinePart[] {\n const nodes = (asset.document.model as Dynamic).nodes\n const joints = (asset as Dynamic).joints ?? []\n return asset.appearance.map((look: Dynamic) => {\n const id = look.target\n const joint = joints.find((j: Dynamic) => j?.body1?.part === id)\n const body0 = joint?.body0\n const on = !joint ? undefined : body0?.part ? `${body0.part}.${body0.face}` : (body0?.plane ?? 'mounting-plane')\n const shape = nodes.find((n: Dynamic) => n.id === `${id}.shape`)?.op\n return {\n id,\n ...(shape ? { shape } : {}),\n ...(on ? { on } : {}),\n /* How it moves: each axis of its joint in order (ADR-0159); none for a fastening. */\n ...(joint ? { joint: { id: joint.id, ...(joint.motion?.length ? { motion: joint.motion.map((m: Dynamic) => m.type) } : {}) } } : {}),\n ...(look.material?.token ? { material: look.material.token } : {}),\n chars: length(figurePartReadOf(asset, id))\n }\n })\n}\n\n/** Writes a section into the outline at its pointer, making the objects on the way. */\nfunction place(outline: Dynamic, tokens: readonly string[], value: unknown) {\n let at = outline\n tokens.slice(0, -1).forEach(token => (at = at[token] ??= {}))\n at[tokens[tokens.length - 1]!] = value\n}\n\n/**\n * What the view wraps the outline in, read or not: an outline that took the whole budget left the view over it by these\n * (53 characters, a figure of 3000 long-named parts, 2026-10-19).\n */\nconst VIEW_ENVELOPE = () => length({ whole: false, outline: {}, parts: {}, shown: [], sections: {}, notRead: [] }) - length({})\n\n/**\n * The outline: within OUTLINE_SHARE for its sections, the largest left out first; and, every field counted, within the\n * budget less what the view wraps it in -- a figure of very many parts lists them by id only, then as many as fit.\n */\nexport function figureOutlineOf(asset: FigureAsset, chars = length(asset)): FigureOutline {\n const limit = FIGURE_CONTEXT_BUDGET - VIEW_ENVELOPE()\n const model = asset.document.model as Dynamic\n const sections = sectionsOf(asset).map(pointer => ({ pointer, value: valueAt(asset, tokensOf(pointer)!).value }))\n const sized = sections.map(s => ({ ...s, chars: length(s.value) })).sort((a, b) => b.chars - a.chars)\n\n let total = sized.reduce((sum, s) => sum + s.chars, 0)\n const omitted: FigureOmittedSection[] = []\n const kept = new Set(sized.map(s => s.pointer))\n for (const s of sized) {\n if (total <= OUTLINE_SHARE) break\n kept.delete(s.pointer)\n total -= s.chars\n const entries = entriesOf(s.pointer, s.value)\n omitted.push({ section: s.pointer, chars: s.chars, ...(entries.length ? { entries } : {}) })\n }\n\n const outline: Dynamic = { chars, budget: FIGURE_CONTEXT_BUDGET }\n place(outline, ['document', 'model', 'nodes'], model.nodes.length)\n place(outline, ['document', 'model', 'constants'], model.constants.length)\n for (const s of sections) if (kept.has(s.pointer)) place(outline, tokensOf(s.pointer)!, s.value)\n if (omitted.length) outline.omitted = omitted\n\n let parts: Dynamic[] = outlinePartsOf(asset)\n outline.parts = parts\n if (length(outline) > limit) outline.parts = parts = parts.map(p => ({ id: p.id }))\n if (length(outline) > limit) {\n /* As many as fit, in part order, with how many more there are. */\n let room = limit - length({ ...outline, parts: [], partsNotListed: parts.length })\n const listed: Dynamic[] = []\n for (const p of parts) {\n room -= length(p) + 1\n if (room < 0) break\n listed.push(p)\n }\n outline.parts = listed\n outline.partsNotListed = parts.length - listed.length\n }\n return outline as FigureOutline\n}\n\n/* ── The view ────────────────────────────────────────────────────────────────────────── */\n\n/**\n * The view of a figure the model is shown: whole when it fits, else the outline and what was asked for -- parts, then\n * sections, each in the order asked -- while it fits beside it. Every field counted, the view is within the budget.\n */\nexport function figureViewOf(asset: FigureAsset, request: FigureReadRequest = {}): FigureView {\n const chars = length(asset)\n if (chars <= FIGURE_CONTEXT_BUDGET) return { whole: true, source: asset }\n\n const outline = figureOutlineOf(asset, chars)\n const view: FigureView = { whole: false, outline, parts: {}, shown: [], sections: {}, notRead: [] }\n const room = () => FIGURE_CONTEXT_BUDGET - length(view)\n const refuse = (one: { part: string; reason: string } | { section: string; reason: string }) => {\n if (length(one) + 1 <= room()) view.notRead!.push(one)\n }\n\n for (const part of [...new Set(request.parts ?? [])]) {\n const one = figurePartReadOf(asset, part)\n if (!one) {\n refuse({ part, reason: `${part} is not a part of this figure; the outline lists its parts` })\n continue\n }\n const cost = length(one) + length(part) + length(part) + 3\n view.parts![part] = one\n view.shown!.push(part)\n if (room() >= 0) continue\n delete view.parts![part]\n view.shown!.pop()\n if (cost <= FIGURE_CONTEXT_BUDGET - length(outline)) {\n refuse({ part, reason: `${part} (${cost} characters) does not fit beside what is already read; read it in another call with fewer parts or sections` })\n } else {\n const pointers = partPointers(asset, part)\n refuse({\n part,\n reason:\n `${part} (${cost} characters) is too large to show beside the outline; read its records as sections: ` +\n `${pointers.slice(0, ENTRIES_NAMED).join(', ')}${pointers.length > ENTRIES_NAMED ? ` and ${pointers.length - ENTRIES_NAMED} more` : ''}. ` +\n 'Parts read as sections are not counted as read in full: they cannot be changed'\n })\n }\n }\n\n for (const section of [...new Set(request.sections ?? [])]) {\n const tokens = tokensOf(section)\n const at = tokens && tokens.length ? valueAt(asset, tokens) : { found: false }\n if (!at.found) {\n refuse({ section, reason: `there is no section ${section}; a section is a JSON Pointer such as /document/capabilities/bindings/0` })\n continue\n }\n const cost = length(at.value) + length(section) + 2\n view.sections![section] = at.value\n if (room() >= 0) continue\n delete view.sections![section]\n const entries = entriesOf(section, at.value)\n refuse({\n section,\n reason: entries.length\n ? `${section} (${cost} characters) is too large to show at once here; read its entries: ${entries.map(e => `${e.section} (${e.chars})`).join(', ')}`\n : `${section} is one value of ${length(at.value)} characters, larger than can be shown here; it cannot be read or changed by a proposal`\n })\n }\n\n if (!view.notRead!.length) delete view.notRead\n return view\n}\n\n/* ── What a proposal may change ──────────────────────────────────────────────────────── */\n\ntype StepOf<K extends FigureProposalStep['kind']> = Extract<FigureProposalStep, { kind: K }>\ntype Subject = string | undefined\n\n/**\n * The part each kind of step changes, read from the field the kernel reads for that kind (audit D4-R1: a `part` beside a\n * `set-material`'s `target` is not read by the kernel, so it may not stand in for it). Every kind of the kernel's step\n * type is here, or this does not compile. A step that changes no one part says so with undefined: what it does to the\n * figure's sections is held by `unreadSectionEdits`.\n */\nconst SUBJECT: { [K in FigureProposalStep['kind']]: (step: StepOf<K>, base: FigureAsset) => Subject } = {\n 'add-part': () => undefined,\n 'set-section-corner': step => step.part,\n 'set-cavity': step => step.part,\n 'set-section': step => step.part,\n 'set-pipe': step => step.part,\n attach: step => step.part,\n 'link-dimension': step => step.part,\n 'follow-size': step => step.part,\n 'unlink-dimension': step => step.part,\n 'size-by-state': step => step.part,\n 'scale-position': step => step.part,\n 'fix-position': step => step.part,\n 'nudge-part': step => step.part,\n detach: step => step.part,\n 'make-repeat': step => step.part,\n 'set-repeat': step => step.part,\n 'remove-repeat': step => step.part,\n 'set-mounting-face': step => step.part,\n 'add-binding': step => step.part,\n 'set-joint': step => step.joint?.body1?.part,\n 'remove-joint': (step, base) => ((base as Dynamic).joints ?? []).find((j: Dynamic) => j?.id === step.id)?.body1?.part,\n 'set-material': step => step.target,\n 'set-segments': step => step.target,\n 'rename-part': step => step.target,\n 'set-visibility': step => step.target,\n 'remove-part': step => step.target,\n 'duplicate-part': step => step.target,\n 'mirror-part': step => step.target,\n 'move-part': step => step.target,\n 'set-placement': () => undefined,\n 'declare-instance-size': () => undefined,\n 'clear-mounting-face': () => undefined,\n 'scale-uniformly': () => undefined,\n 'follow-size-in-proportion': () => undefined,\n 'set-detail-level': () => undefined,\n 'set-item': () => undefined,\n 'add-design-input': () => undefined,\n 'set-input-range': () => undefined,\n 'publish-input': () => undefined,\n 'unpublish-input': () => undefined,\n 'remove-binding': () => undefined,\n 'set-slot-layout': () => undefined,\n 'remove-slot-layout': () => undefined,\n 'set-extension': () => undefined,\n rename: () => undefined,\n 'set-capabilities': () => undefined,\n 'set-capability-settings': () => undefined,\n 'set-state-input': () => undefined,\n 'set-state-defaults': () => undefined,\n 'set-driver': () => undefined,\n 'remove-driver': () => undefined,\n 'set-clip': () => undefined,\n 'copy-clip': () => undefined,\n 'set-motion-group': () => undefined,\n 'remove-motion-group': () => undefined,\n 'set-data-schema': () => undefined,\n 'rename-data-field': () => undefined,\n 'set-data-binding': () => undefined,\n 'remove-data-binding': () => undefined\n}\n\n/**\n * The steps that change a part of the base not shown in full, as reasons said back to the writer. A part may still be\n * named to fasten to or to follow -- the kernel works from it, nothing about it is guessed -- and a new part is the\n * steps' own. A kind this table does not know is refused: it is not let through unjudged.\n */\nexport function unreadPartEdits(base: FigureAsset, steps: readonly FigureProposalStep[], view: FigureView): string[] {\n const existing = new Set(base.appearance.map(a => a.target))\n const shown = new Set(view.shown ?? [])\n const allowed = [...shown].join(', ') || 'none'\n return steps.flatMap((step, i) => {\n const kind = (step as Dynamic)?.kind\n if (typeof kind !== 'string') return []\n const judge = (SUBJECT as Record<string, (step: Dynamic, base: FigureAsset) => Subject>)[kind]\n if (!Object.prototype.hasOwnProperty.call(SUBJECT, kind) || !judge)\n return [`UNKNOWN_STEP: steps[${i}] has the kind \"${kind}\", which is not one of the commands; use only the commands taught.`]\n const part = judge(step, base)\n if (typeof part !== 'string' || !existing.has(part) || shown.has(part)) return []\n return [\n `UNREAD_PART: steps[${i}] (${kind}) changes \"${part}\", which was not shown in full, so its source is not known here. ` +\n `Change only the parts shown in full (${allowed}) or parts the steps add. To change ${part}, read it with getFigureSource parts and pass it in parts to proposeFigureCandidate.`\n ]\n })\n}\n\n/** Entries of a value, keyed by `id` when every entry of a list has a distinct one, else by place. */\nfunction keyedEntries(value: unknown): Map<string, { token: string; value: unknown }> {\n const out = new Map<string, { token: string; value: unknown }>()\n if (Array.isArray(value)) {\n const ids = value.map(v => (v && typeof v === 'object' && typeof (v as Dynamic).id === 'string' ? (v as Dynamic).id : undefined))\n const byId = ids.every(Boolean) && new Set(ids).size === ids.length\n value.forEach((v, i) => out.set(byId ? `id:${ids[i]}` : `at:${i}`, { token: String(i), value: v }))\n } else if (value && typeof value === 'object') {\n for (const [key, v] of Object.entries(value)) out.set(`key:${key}`, { token: key, value: v })\n }\n return out\n}\n\n/**\n * What of the sections left out of the outline and not read the steps changed, as reasons said back to the writer. Judged\n * on what the steps made, not on what they say: nothing that was there may be changed or taken away. A new entry -- a\n * record in a list, a key in a map -- is the steps' own.\n */\nexport function unreadSectionEdits(base: FigureAsset, after: FigureAsset, view: FigureView): string[] {\n const read = Object.keys(view.sections ?? {})\n const reasons: string[] = []\n const say = (pointer: string, what: string) =>\n reasons.push(\n `UNREAD_SECTION: the steps ${what} ${pointer}, which was left out of the outline and not read, so it is not known here. ` +\n `Leave it as it is; to change it, read it with getFigureSource sections and pass it in sections to proposeFigureCandidate.`\n )\n const check = (pointer: string, before: unknown, now: unknown) => {\n if (reasons.length >= ENTRIES_NAMED || read.some(r => within(pointer, r))) return\n const records = (v: unknown) => v !== null && typeof v === 'object'\n if (!records(before) || !records(now) || Array.isArray(before) !== Array.isArray(now)) {\n if (JSON.stringify(before) !== JSON.stringify(now)) say(pointer, 'change')\n return\n }\n const later = keyedEntries(now)\n for (const [key, entry] of keyedEntries(before)) {\n const child = `${pointer}/${escapeToken(entry.token)}`\n const kept = later.get(key)\n if (kept) check(child, entry.value, kept.value)\n else if (!read.some(r => within(child, r))) say(child, 'remove')\n }\n }\n for (const omitted of view.outline?.omitted ?? []) {\n const tokens = tokensOf(omitted.section)!\n check(omitted.section, valueAt(base, tokens).value, valueAt(after, tokens).value)\n }\n return reasons\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which provider a live figure-AI run asks (the smoke test, the scenarios): the one `FIGURE_LLM_PROVIDER` names, or the
|
|
3
|
+
* first whose key is set. Its model is `FIGURE_LLM_MODEL`, or the adapter's default. Undefined: no key, nothing runs.
|
|
4
|
+
*/
|
|
5
|
+
export type FigureLLMProvider = 'anthropic' | 'gemini' | 'openai';
|
|
6
|
+
export declare function figureLLMProvider(env?: NodeJS.ProcessEnv): {
|
|
7
|
+
provider: FigureLLMProvider;
|
|
8
|
+
apiKey: string;
|
|
9
|
+
model?: string;
|
|
10
|
+
} | undefined;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.figureLLMProvider = figureLLMProvider;
|
|
4
|
+
function figureLLMProvider(env = process.env) {
|
|
5
|
+
const requested = env.FIGURE_LLM_PROVIDER;
|
|
6
|
+
const candidates = [
|
|
7
|
+
{ provider: 'anthropic', keys: ['ANTHROPIC_API_KEY'] },
|
|
8
|
+
{ provider: 'gemini', keys: ['GEMINI_API_KEY', 'GOOGLE_API_KEY'] },
|
|
9
|
+
{ provider: 'openai', keys: ['OPENAI_API_KEY'] }
|
|
10
|
+
];
|
|
11
|
+
const usable = requested ? candidates.filter(candidate => candidate.provider === requested) : candidates;
|
|
12
|
+
for (const candidate of usable) {
|
|
13
|
+
const apiKey = candidate.keys.map(key => env[key]).find(Boolean);
|
|
14
|
+
if (apiKey)
|
|
15
|
+
return { provider: candidate.provider, apiKey, ...(env.FIGURE_LLM_MODEL ? { model: env.FIGURE_LLM_MODEL } : {}) };
|
|
16
|
+
}
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=figure-llm-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"figure-llm-provider.js","sourceRoot":"","sources":["../../../server/service/figure/figure-llm-provider.ts"],"names":[],"mappings":";;AAMA,8CAaC;AAbD,SAAgB,iBAAiB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACpE,MAAM,SAAS,GAAG,GAAG,CAAC,mBAAoD,CAAA;IAC1E,MAAM,UAAU,GAA2D;QACzE,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,mBAAmB,CAAC,EAAE;QACtD,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,EAAE;QAClE,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,gBAAgB,CAAC,EAAE;KACjD,CAAA;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAA;IACxG,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAChE,IAAI,MAAM;YAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;IAC/H,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC","sourcesContent":["/**\n * Which provider a live figure-AI run asks (the smoke test, the scenarios): the one `FIGURE_LLM_PROVIDER` names, or the\n * first whose key is set. Its model is `FIGURE_LLM_MODEL`, or the adapter's default. Undefined: no key, nothing runs.\n */\nexport type FigureLLMProvider = 'anthropic' | 'gemini' | 'openai'\n\nexport function figureLLMProvider(env: NodeJS.ProcessEnv = process.env): { provider: FigureLLMProvider; apiKey: string; model?: string } | undefined {\n const requested = env.FIGURE_LLM_PROVIDER as FigureLLMProvider | undefined\n const candidates: Array<{ provider: FigureLLMProvider; keys: string[] }> = [\n { provider: 'anthropic', keys: ['ANTHROPIC_API_KEY'] },\n { provider: 'gemini', keys: ['GEMINI_API_KEY', 'GOOGLE_API_KEY'] },\n { provider: 'openai', keys: ['OPENAI_API_KEY'] }\n ]\n const usable = requested ? candidates.filter(candidate => candidate.provider === requested) : candidates\n for (const candidate of usable) {\n const apiKey = candidate.keys.map(key => env[key]).find(Boolean)\n if (apiKey) return { provider: candidate.provider, apiKey, ...(env.FIGURE_LLM_MODEL ? { model: env.FIGURE_LLM_MODEL } : {}) }\n }\n return undefined\n}\n"]}
|
|
@@ -231,34 +231,30 @@ let FigureMutation = class FigureMutation {
|
|
|
231
231
|
**버전 번호는 여기서 손대지 않는다.** 저장은 저작이고, 버전은 발행에서 생긴다(`releaseFigure`).
|
|
232
232
|
board 의 `updateBoard` 도 같다 — 저장 경로에는 version 이 없다.
|
|
233
233
|
*/
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
234
|
+
/*
|
|
235
|
+
**바뀐 칸만 쓴다** (2026-11-03 점검 2). 처음 읽은 행을 통째로 펼쳐 다시 쓰면, 그 사이 다른 편집이
|
|
236
|
+
`saveFigure` 로 저장한 정본이 읽어 둔 옛 정본으로 되돌아간다 — 설명 한 줄을 고쳤을 뿐인데. 정본을 쓰는
|
|
237
|
+
경우(정본 패치, 타입 바꾸기)는 `saveFigure` 와 같이 읽어 둔 정본이 그대로일 때만 쓴다.
|
|
238
|
+
|
|
239
|
+
**고치면 발행이 풀린다.** 발행은 「이 버전을 써도 된다」는 약속이고, 그 뒤에 바뀌면 약속한 것과
|
|
240
|
+
배포된 것이 달라진다. 그래서 저장은 언제나 초안으로 되돌린다. 버전 번호는 여기서 손대지 않는다 —
|
|
241
|
+
버전은 발행에서 생긴다(`releaseFigure`).
|
|
242
|
+
*/
|
|
243
|
+
const { type: _type, source: _source, ...fields } = patchRest;
|
|
244
|
+
const changes = {
|
|
245
|
+
...Object.fromEntries(Object.entries(fields).filter(([, value]) => value !== undefined)),
|
|
246
246
|
...(renamed !== undefined ? { type: renamed } : {}),
|
|
247
|
-
source,
|
|
248
|
-
/*
|
|
249
|
-
**고치면 발행이 풀린다.**
|
|
250
|
-
|
|
251
|
-
발행은 「이 버전을 써도 된다」는 약속이고, 그 뒤에 정본이 바뀌면 약속한 것과 배포된 것이
|
|
252
|
-
달라진다. 그래서 저장은 언제나 초안으로 되돌리고, 다시 내보내려면 발행을 한 번 더 한다
|
|
253
|
-
(버전 번호가 하나 오르고 버전이 하나 더 남는다). board 의 `updateBoard` 가 같은 한 줄을 쓴다.
|
|
254
|
-
*/
|
|
247
|
+
...(source !== figure.source ? { source } : {}),
|
|
255
248
|
state: 'draft',
|
|
256
249
|
...(derived ?? {}),
|
|
257
|
-
// 썸네일이 **썸네일로서** 바뀐 때만 시각을 갱신한다. 이름·설명 변경에는 안 건드린다.
|
|
258
|
-
thumbnail: figure.thumbnail ?? null,
|
|
259
250
|
...picture,
|
|
260
251
|
updater: user
|
|
261
|
-
}
|
|
252
|
+
};
|
|
253
|
+
if ('source' in changes)
|
|
254
|
+
await (0, figure_write_js_1.compareAndSwapFigure)(criteria => repository.update(criteria, changes), id, domain.id, figure.source);
|
|
255
|
+
else
|
|
256
|
+
await repository.update({ id, domain: { id: domain.id } }, changes);
|
|
257
|
+
const saved = await repository.findOneOrFail({ where: { id, domain: { id: domain.id } } });
|
|
262
258
|
return { figure: saved, violations };
|
|
263
259
|
}
|
|
264
260
|
/**
|