@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.
- package/dist-server/service/figure/figure-mutation.d.ts +4 -8
- package/dist-server/service/figure/figure-mutation.js +13 -27
- package/dist-server/service/figure/figure-mutation.js.map +1 -1
- package/dist-server/service/figure/figure-propose-type.d.ts +8 -59
- package/dist-server/service/figure/figure-propose-type.js +15 -150
- package/dist-server/service/figure/figure-propose-type.js.map +1 -1
- package/dist-server/service/figure/figure-propose-v3.d.ts +50 -0
- package/dist-server/service/figure/figure-propose-v3.js +141 -0
- package/dist-server/service/figure/figure-propose-v3.js.map +1 -0
- package/dist-server/service/figure/figure-tools.js +64 -90
- package/dist-server/service/figure/figure-tools.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/server/service/figure/figure-llm-smoke.test.ts +28 -32
- package/server/service/figure/figure-mutation.ts +14 -28
- package/server/service/figure/figure-propose-type.ts +16 -124
- package/server/service/figure/figure-propose-v3.test.ts +113 -0
- package/server/service/figure/figure-propose-v3.ts +172 -0
- package/server/service/figure/figure-tools.test.ts +86 -133
- package/server/service/figure/figure-tools.ts +60 -91
- package/dist-server/service/figure/figure-propose.d.ts +0 -91
- package/dist-server/service/figure/figure-propose.js +0 -439
- package/dist-server/service/figure/figure-propose.js.map +0 -1
- package/dist-server/service/figure/figure-quality.d.ts +0 -29
- package/dist-server/service/figure/figure-quality.js +0 -62
- package/dist-server/service/figure/figure-quality.js.map +0 -1
- package/server/service/figure/figure-ai-flow.test.ts +0 -93
- package/server/service/figure/figure-e2e-smoke.test.ts +0 -72
- package/server/service/figure/figure-propose.test.ts +0 -719
- package/server/service/figure/figure-propose.ts +0 -551
- package/server/service/figure/figure-quality.test.ts +0 -43
- 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
|
-
}
|