@things-factory/figure-service 10.1.64 → 10.1.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist-server/service/figure/figure-mutation.d.ts +4 -8
  2. package/dist-server/service/figure/figure-mutation.js +13 -27
  3. package/dist-server/service/figure/figure-mutation.js.map +1 -1
  4. package/dist-server/service/figure/figure-propose-type.d.ts +8 -59
  5. package/dist-server/service/figure/figure-propose-type.js +15 -150
  6. package/dist-server/service/figure/figure-propose-type.js.map +1 -1
  7. package/dist-server/service/figure/figure-propose-v3.d.ts +50 -0
  8. package/dist-server/service/figure/figure-propose-v3.js +141 -0
  9. package/dist-server/service/figure/figure-propose-v3.js.map +1 -0
  10. package/dist-server/service/figure/figure-tools.js +64 -90
  11. package/dist-server/service/figure/figure-tools.js.map +1 -1
  12. package/dist-server/tsconfig.tsbuildinfo +1 -1
  13. package/package.json +3 -3
  14. package/server/service/figure/figure-llm-smoke.test.ts +28 -32
  15. package/server/service/figure/figure-mutation.ts +14 -28
  16. package/server/service/figure/figure-propose-type.ts +16 -124
  17. package/server/service/figure/figure-propose-v3.test.ts +113 -0
  18. package/server/service/figure/figure-propose-v3.ts +172 -0
  19. package/server/service/figure/figure-tools.test.ts +86 -133
  20. package/server/service/figure/figure-tools.ts +60 -91
  21. package/dist-server/service/figure/figure-propose.d.ts +0 -91
  22. package/dist-server/service/figure/figure-propose.js +0 -439
  23. package/dist-server/service/figure/figure-propose.js.map +0 -1
  24. package/dist-server/service/figure/figure-quality.d.ts +0 -29
  25. package/dist-server/service/figure/figure-quality.js +0 -62
  26. package/dist-server/service/figure/figure-quality.js.map +0 -1
  27. package/server/service/figure/figure-ai-flow.test.ts +0 -93
  28. package/server/service/figure/figure-e2e-smoke.test.ts +0 -72
  29. package/server/service/figure/figure-propose.test.ts +0 -719
  30. package/server/service/figure/figure-propose.ts +0 -551
  31. package/server/service/figure/figure-quality.test.ts +0 -43
  32. package/server/service/figure/figure-quality.ts +0 -98
@@ -1,98 +0,0 @@
1
- import { sizingReport, topViewEvidence } from '@hatiolab/figure-model'
2
- import type { FigureBlueprint, FigureCost, FigureScore, FigureSource } from '@hatiolab/figure-model'
3
-
4
- /**
5
- * A deterministic design review for an AI candidate.
6
- *
7
- * This deliberately does not claim to recognise beauty from JSON. It reports
8
- * only what the Figure model can prove: stable part names, palette focus,
9
- * declared runtime budget, and whether the assembly survives resizing.
10
- */
11
- export type FigureQualityStatus = 'ready' | 'review'
12
- export type FigureQualityDimension = 'identity' | 'silhouette' | 'palette' | 'performance' | 'resilience'
13
-
14
- export interface FigureQualityFinding {
15
- dimension: FigureQualityDimension
16
- code: string
17
- message: string
18
- }
19
-
20
- export interface FigureQualityReview {
21
- /** Clear measurable checks, not an aesthetic certificate. */
22
- status: FigureQualityStatus
23
- summary: string
24
- findings: FigureQualityFinding[]
25
- /** Reproducible top-view evidence for a later render/vision critique loop. */
26
- visual: ReturnType<typeof topViewEvidence>
27
- }
28
-
29
- const PLACEHOLDER_PART_NAME = /^(?:part|item|shape|cube|box)[-_]?\d+$/
30
-
31
- /**
32
- * Reviews a valid, compiled source. It never rejects a candidate: a crate can
33
- * intentionally be a set of boxes, so the author retains the decision.
34
- */
35
- export function reviewFigureQuality(
36
- source: FigureSource,
37
- blueprint: FigureBlueprint,
38
- score: FigureScore,
39
- cost: FigureCost
40
- ): FigureQualityReview {
41
- const findings: FigureQualityFinding[] = []
42
- const visual = topViewEvidence(source)
43
- const placeholderNames = source.parts.filter(part => PLACEHOLDER_PART_NAME.test(part.name)).map(part => part.name)
44
-
45
- if (placeholderNames.length > 0) {
46
- findings.push({
47
- dimension: 'identity',
48
- code: 'generic-part-name',
49
- message: `Rename ${placeholderNames.join(', ')} for the real component; part names are stable binding identifiers.`
50
- })
51
- }
52
-
53
- const primitives = new Set(source.parts.map(part => part.primitive))
54
- if (source.parts.length >= 4 && [...primitives].every(primitive => primitive === 'cube' || primitive === 'wall' || primitive === 'rect')) {
55
- findings.push({
56
- dimension: 'silhouette',
57
- code: 'box-only-silhouette',
58
- message: 'This candidate is built only from rectangular primitives. Confirm that its top-view silhouette remains recognisable at board scale.'
59
- })
60
- }
61
-
62
- const tokens = new Set(source.parts.map(part => part.material.token))
63
- if (tokens.size > 3) {
64
- findings.push({
65
- dimension: 'palette',
66
- code: 'palette-too-broad',
67
- message: `The candidate uses ${tokens.size} material tokens. Confirm each colour carries meaning; low-poly figures usually read better with a focused palette.`
68
- })
69
- }
70
-
71
- if (score.grade === 'C' || score.grade === 'D') {
72
- findings.push({
73
- dimension: 'performance',
74
- code: 'budget-tight',
75
- message: `Runtime budget grade ${score.grade}: ${score.tightest.label} uses ${score.tightest.used}/${score.tightest.limit}. Simplify before broad placement if possible.`
76
- })
77
- }
78
-
79
- for (const finding of sizingReport(blueprint).findings) {
80
- findings.push({ dimension: 'resilience', code: finding.code, message: finding.message })
81
- }
82
-
83
- if (findings.length === 0) {
84
- return {
85
- status: 'ready',
86
- summary: `Model-grounded review is clear: grade ${score.grade}, ${cost.triangles} triangles, ${cost.drawCalls} draw calls per instance.`,
87
- findings,
88
- visual
89
- }
90
- }
91
-
92
- return {
93
- status: 'review',
94
- summary: `Needs author review: ${findings.length} measurable design consideration${findings.length === 1 ? '' : 's'} found.`,
95
- findings,
96
- visual
97
- }
98
- }