@bitmagic/asset-core 0.2.20-dev.23 → 0.2.20-dev.3

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.
@@ -1,46 +1,31 @@
1
1
  import type { CoreLogger, ForgerClient } from '../types.js';
2
2
  /**
3
- * Search the Asset Forger's library of ready-made rigged characters.
3
+ * Search the Asset Forger's library of ready-made rigged voxel characters.
4
4
  *
5
5
  * Most prompts a creator types already have a good body in the library, and
6
6
  * using one is instant and free where forging costs minutes and a vendor call.
7
- * This module answers two questions and nothing else: "is there one close
8
- * enough?" ({@link findLibraryCharacter}) and "what are the options?"
9
- * ({@link searchLibraryCharacters}). The decision to use a result lives in
10
- * `character.ts`; the decision to show one to a creator lives in the CLI.
7
+ * This module answers "is there one close enough?" and nothing else — the
8
+ * decision to use it lives in `character.ts`.
11
9
  *
12
- * Both are ONE request to the same route — it has always returned a ranked list
13
- * and selection has always thrown all but one row away. The difference is only
14
- * whether the shelf's floor is applied (find) or merely reported (search), because
15
- * a creator choosing for themselves needs the bar as information, not as a filter.
16
- *
17
- * NEITHER throws or rejects. Every failure — no credentials, a network error, a
18
- * 500, an empty index, nothing above the floor — resolves to an empty result with
19
- * a `reason`. That property is what makes "fall back to forging" structural
20
- * instead of a `try/catch` somebody can forget.
21
- *
22
- * ## Two representations, one row
23
- *
24
- * The catalogue keys a character on `sid` and hangs BOTH representations off it:
25
- * a voxel body (`.vxl`) and a textured low-poly rig (a KTX2 GLB). They are
26
- * separate assets with separate vectors and separate publication state, and a
27
- * character may have either or both — so the caller says which one it wants and
28
- * an empty result NEVER falls back to the other medium. Feeding a voxel body to
29
- * a low-poly game would defeat the point of the art style, and vice versa.
30
- *
31
- * Measured in production: 2,261 voxel bodies against 197 low-poly ones, so a
32
- * low-poly miss is much likelier and the fallback-to-forge path matters more.
10
+ * `findLibraryCharacter` NEVER throws and never rejects. Every failure — no
11
+ * credentials, a network error, a 500, an empty index, nothing above the floor —
12
+ * resolves to `{ match: null, reason }`. That property is what makes "fall back
13
+ * to forging" structural instead of a `try/catch` somebody can forget, and it
14
+ * matters more than it looks: production's index is EMPTY today, so the empty
15
+ * case is the normal path at launch rather than an edge case.
33
16
  *
34
17
  * ## The upstream contract, as measured against the live service
35
18
  *
36
- * `GET /ai/v1/find-character`, Basic auth, query params: `prompt` (required;
37
- * blank is a 400), `representation` (**required**; anything but `voxel` or
38
- * `lowpoly` is a 400), `threshold` (0-1, **400** when malformed or out of
39
- * range), `limit` (**400** when malformed), and optional `species` / `hasTail`.
19
+ * `GET /ai/v1/find-voxel-character`, Basic auth, query params:
20
+ * `prompt` (required; blank is a 400), `threshold` (0-1, **400** when malformed
21
+ * or out of range), `limit` (**400** when malformed), and optional
22
+ * `species` / `hasTail`.
40
23
  *
41
- * - **`assetUrl` always belongs to the representation asked for**, and so does
42
- * the similarity: low-poly ranks on its own vector and never borrows the
43
- * voxel caption's.
24
+ * - **`limit >= 17` fails every time**, with a 500 and
25
+ * `"Failed to parse search result"` — the Python subprocess output is
26
+ * truncated before the route parses it. Verified across prompts and repeats,
27
+ * with the boundary between 16 and 17. {@link LIBRARY_CANDIDATE_LIMIT} stays
28
+ * far below it, and {@link MAX_SAFE_LIMIT} documents the cliff.
44
29
  * - **`assetUrl` is nullable.** The `/seed` bootstrap path indexes captions with
45
30
  * no files, so a row can be findable but not usable. Candidates without one
46
31
  * are skipped in favour of the next.
@@ -49,11 +34,6 @@ import type { CoreLogger, ForgerClient } from '../types.js';
49
34
  * derived guess would silently collapse the result set to zero and look
50
35
  * exactly like an empty index — so it is deliberately never sent, and neither
51
36
  * is `hasTail`. The prompt embedding already carries both.
52
- *
53
- * The `limit >= 17` cliff this module used to guard against is GONE: both search
54
- * routes now return through a result file rather than the Python subprocess's
55
- * stdout, which is what the 20,000-character truncation used to eat.
56
- * {@link MAX_SAFE_LIMIT} is kept as a cheap cap, no longer as a workaround.
57
37
  */
58
38
  /**
59
39
  * How the library participates in character generation.
@@ -78,16 +58,8 @@ export type LibraryMissReason =
78
58
  | 'no-asset-url'
79
59
  /** The response was not the shape the route documents. */
80
60
  | 'malformed';
81
- /**
82
- * Which body a search is for.
83
- *
84
- * Not a boolean, and not derived from `voxelize` inside this module: the caller
85
- * owns the art-style decision and this module owns the query. A mismatched
86
- * default here would silently serve cubes to a low-poly game.
87
- */
88
- export type LibraryRepresentation = 'voxel' | 'lowpoly';
89
61
  /** The subset of a library row this package consumes. */
90
- export interface LibraryCharacterMatch {
62
+ export interface VoxelCharacterMatch {
91
63
  /** Corpus id, e.g. `b0009` — the only field that makes a pick auditable. */
92
64
  sid: string;
93
65
  /** Non-null by construction: rows without one are filtered out before selection. */
@@ -98,61 +70,22 @@ export interface LibraryCharacterMatch {
98
70
  subject: string | null;
99
71
  similarity: number;
100
72
  }
101
- /** @deprecated Named for when the library held voxels only. Use {@link LibraryCharacterMatch}. */
102
- export type VoxelCharacterMatch = LibraryCharacterMatch;
103
73
  export interface LibrarySearchOutcome {
104
- match: LibraryCharacterMatch | null;
74
+ match: VoxelCharacterMatch | null;
105
75
  reason?: LibraryMissReason;
106
76
  /** Best similarity seen even when it lost — this is what `shadow` mode reports. */
107
77
  topSimilarity?: number;
108
78
  }
109
79
  /**
110
- * The usable-match floor for the voxel shelf.
111
- *
112
- * Was 0.45, from `game/scripts/vxl-v10-search-selftest.mjs`, which ranked the
113
- * corpus in memory and put realistic prompts at 0.62-0.80. Raised to 0.55 on
114
- * 2026-09-09 after measuring against the live index with CONTROLS as well as
115
- * matches — the half the original sweep did not have.
116
- *
117
- * At 0.45 two of eight non-humanoid controls substituted: "a red sports car"
118
- * fetched a race-car driver at 0.492, "a sailing boat on open sea" an elderly man
119
- * at 0.468. Both are noise, and 0.45 admitted them. 0.55 rejects both, rejects
120
- * the 0.522 pick this corpus was already known to get wrong, and costs nothing:
121
- * the weakest genuine match measured 0.624, so every real hit still clears it.
122
- *
123
- * What it does NOT fix, and no floor can: a humanoid prompt the corpus cannot
124
- * answer scores 0.552-0.698 here, inside the genuine range. See
125
- * {@link DEFAULT_LOWPOLY_LIBRARY_THRESHOLD} for the numbers and what that costs.
126
- */
127
- export declare const DEFAULT_LIBRARY_THRESHOLD = 0.55;
128
- /**
129
- * The low-poly floor, set higher than the voxel one on purpose.
130
- *
131
- * Measured 2026-09-09 against the live production index, scoring prompts that
132
- * should match against prompts that should not (the method that produced 0.45):
133
- *
134
- * | | voxel, 2,261 bodies | low-poly, 197 |
135
- * | --- | --- | --- |
136
- * | genuine matches | 0.624 - 0.831 | 0.613 - 0.801 |
137
- * | non-humanoid controls (a chair, a boat) | up to 0.492 | up to 0.435 |
138
- * | HUMANOID prompts the shelf cannot answer | 0.552 - 0.698 | 0.420 - 0.765 |
139
- *
140
- * That third row is the one that matters, and it is why no floor is a complete
141
- * answer: a wrong-but-plausible person scores as high as a right one, so
142
- * "beekeeper" fetching a humanoid bee (0.654) and "hazmat worker" fetching a boy
143
- * mechanic (0.648) are not separable from a real hit by similarity alone.
80
+ * The usable-match floor.
144
81
  *
145
- * A floor can only trade coverage against precision, and the right trade differs
146
- * by shelf SIZE. With 2,261 bodies a strong score is usually a real match; with
147
- * 197 it is more often the nearest of too few. So low-poly starts conservative:
148
- * at 0.65 only 2 of 10 unanswerable humanoid prompts substitute, against 9 of 10
149
- * at 0.45, while genuine matches at 0.673-0.801 still land. Forging is the
150
- * fallback, and forging is what happens today anyway — a missed hit costs money,
151
- * a wrong hit costs the creator their character.
152
- *
153
- * Lower it as the shelf grows, via `CHARACTER_LIBRARY_THRESHOLD_LOWPOLY`.
82
+ * 0.45 is not invented here: `game/scripts/vxl-v10-search-selftest.mjs` already
83
+ * treats it as the line between a usable match and a coincidence, having ranked
84
+ * the corpus in memory against known queries. Measured top-1 similarities for
85
+ * realistic prompts run 0.62-0.80, so it accepts with margin — and it is well
86
+ * above the route's own 0.3 default, which is looser than we want.
154
87
  */
155
- export declare const DEFAULT_LOWPOLY_LIBRARY_THRESHOLD = 0.65;
88
+ export declare const DEFAULT_LIBRARY_THRESHOLD = 0.45;
156
89
  /**
157
90
  * Ask for a handful, not one.
158
91
  *
@@ -161,14 +94,7 @@ export declare const DEFAULT_LOWPOLY_LIBRARY_THRESHOLD = 0.65;
161
94
  * no meaningful cost.
162
95
  */
163
96
  export declare const LIBRARY_CANDIDATE_LIMIT = 5;
164
- /**
165
- * A cap, no longer a workaround.
166
- *
167
- * This was the largest `limit` the route survived, back when results came out
168
- * through a truncated stdout buffer. They come back through a result file now,
169
- * and the API advertises 50 — but nothing here wants more than a handful, so the
170
- * cap stays as cheap insurance rather than being raised for its own sake.
171
- */
97
+ /** The largest `limit` the route survives; see the module doc. The API advertises 50. */
172
98
  export declare const MAX_SAFE_LIMIT = 16;
173
99
  /**
174
100
  * Read the mode per call rather than at module load, so a test or a CLI run can
@@ -176,12 +102,9 @@ export declare const MAX_SAFE_LIMIT = 16;
176
102
  * for `ANIMATION_MODEL`. Unrecognised values fail CLOSED: an env typo must not
177
103
  * be what turns library substitution on.
178
104
  */
179
- export declare function getCharacterLibraryMode(representation: LibraryRepresentation): CharacterLibraryMode;
105
+ export declare function getCharacterLibraryMode(): CharacterLibraryMode;
180
106
  /**
181
- * The floor for one shelf, overridable by `CHARACTER_LIBRARY_THRESHOLD` — or, for
182
- * the low-poly corpus alone, by `CHARACTER_LIBRARY_THRESHOLD_LOWPOLY`.
183
- *
184
- * The two shelves default differently; see {@link DEFAULT_LOWPOLY_LIBRARY_THRESHOLD}.
107
+ * The floor, overridable by `CHARACTER_LIBRARY_THRESHOLD`.
185
108
  *
186
109
  * An env var rather than a request field: it is an operations dial for tuning
187
110
  * against a growing corpus, not a creative choice, and an agent asked to pick a
@@ -191,68 +114,17 @@ export declare function getCharacterLibraryMode(representation: LibraryRepresent
191
114
  * 0-1 or one that will not parse, so an unclamped typo would turn every
192
115
  * character generation into a hard failure instead of a fallback.
193
116
  */
194
- export declare function getCharacterLibraryThreshold(representation: LibraryRepresentation): number;
117
+ export declare function getCharacterLibraryThreshold(): number;
195
118
  export interface FindLibraryCharacterDeps {
196
119
  forger: ForgerClient;
197
120
  logger: CoreLogger;
198
- /** Which body to search for. Required: there is no safe default across art styles. */
199
- representation: LibraryRepresentation;
200
- /**
201
- * Override the shelf's floor. Omit for the tuned default, which is what
202
- * automatic substitution wants; pass 0 for "give me the closest thing you
203
- * have", which is what an explicit library-only request means.
204
- */
205
- threshold?: number;
206
- }
207
- export interface SearchLibraryCharactersDeps {
208
- forger: ForgerClient;
209
- logger: CoreLogger;
210
- /** Which shelf to search. Required: there is no safe default across art styles. */
211
- representation: LibraryRepresentation;
212
- /** How many rows to ask for. Clamped to {@link MAX_SAFE_LIMIT}; default {@link LIBRARY_CANDIDATE_LIMIT}. */
213
- limit?: number;
214
121
  }
215
- export interface LibrarySearchResults {
216
- /** Every usable row, in the order the route ranked them. Empty on any failure. */
217
- candidates: LibraryCharacterMatch[];
218
- /**
219
- * The floor automatic substitution would have applied to this shelf.
220
- *
221
- * Returned rather than used, so a caller can SHOW which candidates clear the
222
- * bar instead of silently dropping the ones that do not. That distinction is
223
- * the whole point on this corpus: a humanoid prompt the shelf cannot answer
224
- * scores inside the genuine range, so the number is information for a person,
225
- * not a verdict (see {@link DEFAULT_LOWPOLY_LIBRARY_THRESHOLD}).
226
- */
227
- threshold: number;
228
- /** Why there are no candidates. Absent when there is at least one. */
229
- reason?: LibraryMissReason;
230
- /** Best similarity seen, INCLUDING rows dropped for having no file. */
231
- topSimilarity?: number;
232
- }
233
- /**
234
- * Every usable library character for a prompt, ranked, with the shelf's floor.
235
- *
236
- * The list form of {@link findLibraryCharacter}, and the same single request —
237
- * the route has always returned candidates and selection has always thrown all
238
- * but one away. Nothing here applies the floor: a caller that wants one body
239
- * automatically wants `findLibraryCharacter`, and a caller that wants to show a
240
- * creator their options wants every row plus the bar to mark them against.
241
- *
242
- * Never throws, for the same structural reason `findLibraryCharacter` does not:
243
- * every failure resolves to an empty `candidates` with a `reason`.
244
- */
245
- export declare function searchLibraryCharacters(prompt: string, deps: SearchLibraryCharactersDeps): Promise<LibrarySearchResults>;
246
122
  /**
247
123
  * Find the closest usable library character for a prompt.
248
124
  *
249
125
  * Selection is the highest-ranked row that has BOTH a usable `assetUrl` and a
250
126
  * similarity at or above the floor — walking the list rather than taking the
251
127
  * first, so an unpublished row costs a fallback instead of a forge.
252
- *
253
- * The floor is applied HERE rather than in the search, which is the only
254
- * difference between the two: `deps.threshold` overrides it (0 for "the best
255
- * available, whatever it scored"), and omitting it takes the shelf's own.
256
128
  */
257
129
  export declare function findLibraryCharacter(prompt: string, deps: FindLibraryCharacterDeps): Promise<LibrarySearchOutcome>;
258
130
  //# sourceMappingURL=character-library.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"character-library.d.ts","sourceRoot":"","sources":["../../src/generators/character-library.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"character-library.d.ts","sourceRoot":"","sources":["../../src/generators/character-library.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH;;;;;;;GAOG;AACH,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,QAAQ,GAAG,IAAI,CAAC;AAE3D,yFAAyF;AACzF,MAAM,MAAM,iBAAiB;AAC3B,kFAAkF;AAChF,UAAU;AACZ,4EAA4E;GAC1E,aAAa;AACf,oDAAoD;GAClD,OAAO;AACT,+CAA+C;GAC7C,iBAAiB;AACnB,qGAAqG;GACnG,cAAc;AAChB,0DAA0D;GACxD,WAAW,CAAC;AAEhB,yDAAyD;AACzD,MAAM,WAAW,mBAAmB;IAClC,4EAA4E;IAC5E,GAAG,EAAE,MAAM,CAAC;IACZ,oFAAoF;IACpF,QAAQ,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAClC,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,mFAAmF;IACnF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID;;;;;;;;GAQG;AACH,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC,yFAAyF;AACzF,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC;;;;;GAKG;AACH,wBAAgB,uBAAuB,IAAI,oBAAoB,CAG9D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,4BAA4B,IAAI,MAAM,CAIrD;AAiBD,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,UAAU,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,wBAAwB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CA+D/B"}
@@ -1,58 +1,14 @@
1
+ const ENDPOINT = '/ai/v1/find-voxel-character';
1
2
  /**
2
- * The representation-aware route, used for BOTH mediums.
3
+ * The usable-match floor.
3
4
  *
4
- * `find-voxel-character` still works and still answers with voxels, but it makes
5
- * the representation implicit — and an implicit default is exactly what must not
6
- * decide which medium a creator's game gets.
5
+ * 0.45 is not invented here: `game/scripts/vxl-v10-search-selftest.mjs` already
6
+ * treats it as the line between a usable match and a coincidence, having ranked
7
+ * the corpus in memory against known queries. Measured top-1 similarities for
8
+ * realistic prompts run 0.62-0.80, so it accepts with margin — and it is well
9
+ * above the route's own 0.3 default, which is looser than we want.
7
10
  */
8
- const ENDPOINT = '/ai/v1/find-character';
9
- /**
10
- * The usable-match floor for the voxel shelf.
11
- *
12
- * Was 0.45, from `game/scripts/vxl-v10-search-selftest.mjs`, which ranked the
13
- * corpus in memory and put realistic prompts at 0.62-0.80. Raised to 0.55 on
14
- * 2026-09-09 after measuring against the live index with CONTROLS as well as
15
- * matches — the half the original sweep did not have.
16
- *
17
- * At 0.45 two of eight non-humanoid controls substituted: "a red sports car"
18
- * fetched a race-car driver at 0.492, "a sailing boat on open sea" an elderly man
19
- * at 0.468. Both are noise, and 0.45 admitted them. 0.55 rejects both, rejects
20
- * the 0.522 pick this corpus was already known to get wrong, and costs nothing:
21
- * the weakest genuine match measured 0.624, so every real hit still clears it.
22
- *
23
- * What it does NOT fix, and no floor can: a humanoid prompt the corpus cannot
24
- * answer scores 0.552-0.698 here, inside the genuine range. See
25
- * {@link DEFAULT_LOWPOLY_LIBRARY_THRESHOLD} for the numbers and what that costs.
26
- */
27
- export const DEFAULT_LIBRARY_THRESHOLD = 0.55;
28
- /**
29
- * The low-poly floor, set higher than the voxel one on purpose.
30
- *
31
- * Measured 2026-09-09 against the live production index, scoring prompts that
32
- * should match against prompts that should not (the method that produced 0.45):
33
- *
34
- * | | voxel, 2,261 bodies | low-poly, 197 |
35
- * | --- | --- | --- |
36
- * | genuine matches | 0.624 - 0.831 | 0.613 - 0.801 |
37
- * | non-humanoid controls (a chair, a boat) | up to 0.492 | up to 0.435 |
38
- * | HUMANOID prompts the shelf cannot answer | 0.552 - 0.698 | 0.420 - 0.765 |
39
- *
40
- * That third row is the one that matters, and it is why no floor is a complete
41
- * answer: a wrong-but-plausible person scores as high as a right one, so
42
- * "beekeeper" fetching a humanoid bee (0.654) and "hazmat worker" fetching a boy
43
- * mechanic (0.648) are not separable from a real hit by similarity alone.
44
- *
45
- * A floor can only trade coverage against precision, and the right trade differs
46
- * by shelf SIZE. With 2,261 bodies a strong score is usually a real match; with
47
- * 197 it is more often the nearest of too few. So low-poly starts conservative:
48
- * at 0.65 only 2 of 10 unanswerable humanoid prompts substitute, against 9 of 10
49
- * at 0.45, while genuine matches at 0.673-0.801 still land. Forging is the
50
- * fallback, and forging is what happens today anyway — a missed hit costs money,
51
- * a wrong hit costs the creator their character.
52
- *
53
- * Lower it as the shelf grows, via `CHARACTER_LIBRARY_THRESHOLD_LOWPOLY`.
54
- */
55
- export const DEFAULT_LOWPOLY_LIBRARY_THRESHOLD = 0.65;
11
+ export const DEFAULT_LIBRARY_THRESHOLD = 0.45;
56
12
  /**
57
13
  * Ask for a handful, not one.
58
14
  *
@@ -61,14 +17,7 @@ export const DEFAULT_LOWPOLY_LIBRARY_THRESHOLD = 0.65;
61
17
  * no meaningful cost.
62
18
  */
63
19
  export const LIBRARY_CANDIDATE_LIMIT = 5;
64
- /**
65
- * A cap, no longer a workaround.
66
- *
67
- * This was the largest `limit` the route survived, back when results came out
68
- * through a truncated stdout buffer. They come back through a result file now,
69
- * and the API advertises 50 — but nothing here wants more than a handful, so the
70
- * cap stays as cheap insurance rather than being raised for its own sake.
71
- */
20
+ /** The largest `limit` the route survives; see the module doc. The API advertises 50. */
72
21
  export const MAX_SAFE_LIMIT = 16;
73
22
  /**
74
23
  * Read the mode per call rather than at module load, so a test or a CLI run can
@@ -76,24 +25,12 @@ export const MAX_SAFE_LIMIT = 16;
76
25
  * for `ANIMATION_MODEL`. Unrecognised values fail CLOSED: an env typo must not
77
26
  * be what turns library substitution on.
78
27
  */
79
- export function getCharacterLibraryMode(representation) {
80
- // Two dials, because the two corpora are not equally proven. Voxel has 2,261
81
- // reviewed bodies and is live; low-poly has 197 and wants a spell in `shadow`
82
- // first. One switch would force turning voxel OFF to hold low-poly back.
83
- // Note the low-poly dial does NOT inherit from CHARACTER_LIBRARY: an operator
84
- // who turned the voxel library on months ago did not consent to substituting
85
- // low-poly bodies, so this stays off until somebody sets it.
86
- const configured = representation === 'lowpoly'
87
- ? process.env.CHARACTER_LIBRARY_LOWPOLY
88
- : process.env.CHARACTER_LIBRARY;
89
- const raw = configured?.trim().toLowerCase();
28
+ export function getCharacterLibraryMode() {
29
+ const raw = process.env.CHARACTER_LIBRARY?.trim().toLowerCase();
90
30
  return raw === 'on' || raw === 'shadow' ? raw : 'off';
91
31
  }
92
32
  /**
93
- * The floor for one shelf, overridable by `CHARACTER_LIBRARY_THRESHOLD` — or, for
94
- * the low-poly corpus alone, by `CHARACTER_LIBRARY_THRESHOLD_LOWPOLY`.
95
- *
96
- * The two shelves default differently; see {@link DEFAULT_LOWPOLY_LIBRARY_THRESHOLD}.
33
+ * The floor, overridable by `CHARACTER_LIBRARY_THRESHOLD`.
97
34
  *
98
35
  * An env var rather than a request field: it is an operations dial for tuning
99
36
  * against a growing corpus, not a creative choice, and an agent asked to pick a
@@ -103,71 +40,30 @@ export function getCharacterLibraryMode(representation) {
103
40
  * 0-1 or one that will not parse, so an unclamped typo would turn every
104
41
  * character generation into a hard failure instead of a fallback.
105
42
  */
106
- export function getCharacterLibraryThreshold(representation) {
107
- // The two shelves default differently because they cover the space differently;
108
- // falling back to the shared dial keeps one knob for operators who do not care.
109
- const lowpoly = representation === 'lowpoly';
110
- // The shared dial still overrides both, so an operator who does not care about
111
- // the split keeps one knob; only the DEFAULT differs per shelf.
112
- const raw = (lowpoly ? process.env.CHARACTER_LIBRARY_THRESHOLD_LOWPOLY : undefined)
113
- ?? process.env.CHARACTER_LIBRARY_THRESHOLD;
114
- const parsed = Number.parseFloat(raw ?? '');
115
- if (!Number.isFinite(parsed)) {
116
- return lowpoly ? DEFAULT_LOWPOLY_LIBRARY_THRESHOLD : DEFAULT_LIBRARY_THRESHOLD;
117
- }
43
+ export function getCharacterLibraryThreshold() {
44
+ const parsed = Number.parseFloat(process.env.CHARACTER_LIBRARY_THRESHOLD ?? '');
45
+ if (!Number.isFinite(parsed))
46
+ return DEFAULT_LIBRARY_THRESHOLD;
118
47
  return Math.min(1, Math.max(0, parsed));
119
48
  }
120
- /** The usable rows of a raw response, in the route's own order, plus what was seen. */
121
- function normaliseCandidates(items) {
122
- const candidates = [];
123
- let topSimilarity = 0;
124
- for (const item of items) {
125
- const similarity = typeof item?.similarity === 'number' ? item.similarity : 0;
126
- // Counted before the usability check on purpose: "how close did the shelf
127
- // come" is a question about the corpus, and a strong row that has no file
128
- // yet still answers it. That is what tells an operator the index needs
129
- // PUBLISHING rather than seeding.
130
- if (similarity > topSimilarity)
131
- topSimilarity = similarity;
132
- const assetUrl = typeof item?.assetUrl === 'string' ? item.assetUrl.trim() : '';
133
- const sid = typeof item?.sid === 'string' ? item.sid : '';
134
- if (!assetUrl || !sid)
135
- continue;
136
- candidates.push({
137
- sid,
138
- assetUrl,
139
- description: typeof item.description === 'string' ? item.description : '',
140
- subject: typeof item.subject === 'string' ? item.subject : null,
141
- similarity,
142
- });
143
- }
144
- return { candidates, topSimilarity };
145
- }
146
49
  /**
147
- * Every usable library character for a prompt, ranked, with the shelf's floor.
148
- *
149
- * The list form of {@link findLibraryCharacter}, and the same single request —
150
- * the route has always returned candidates and selection has always thrown all
151
- * but one away. Nothing here applies the floor: a caller that wants one body
152
- * automatically wants `findLibraryCharacter`, and a caller that wants to show a
153
- * creator their options wants every row plus the bar to mark them against.
50
+ * Find the closest usable library character for a prompt.
154
51
  *
155
- * Never throws, for the same structural reason `findLibraryCharacter` does not:
156
- * every failure resolves to an empty `candidates` with a `reason`.
52
+ * Selection is the highest-ranked row that has BOTH a usable `assetUrl` and a
53
+ * similarity at or above the floor — walking the list rather than taking the
54
+ * first, so an unpublished row costs a fallback instead of a forge.
157
55
  */
158
- export async function searchLibraryCharacters(prompt, deps) {
159
- const { forger, logger, representation } = deps;
160
- const threshold = getCharacterLibraryThreshold(representation);
56
+ export async function findLibraryCharacter(prompt, deps) {
57
+ const { forger, logger } = deps;
161
58
  if (!forger.hasCredentials()) {
162
- return { candidates: [], threshold, reason: 'disabled' };
59
+ return { match: null, reason: 'disabled' };
163
60
  }
61
+ const threshold = getCharacterLibraryThreshold();
164
62
  let body;
165
63
  try {
166
64
  body = await forger.get(ENDPOINT, {
167
65
  prompt,
168
- representation,
169
- // Deliberately 0, so the FLOOR is applied by the caller and not by the
170
- // route.
66
+ // Deliberately 0, so the FLOOR is applied here and not by the route.
171
67
  //
172
68
  // Sending the real floor looks tidier and is worse: the route filters the
173
69
  // rows out before we see them, so every miss comes back as an empty list.
@@ -177,54 +73,48 @@ export async function searchLibraryCharacters(prompt, deps) {
177
73
  // mode was added to collect. Omitting it is not an option either: the route
178
74
  // defaults to 0.3, which is its own silent filter.
179
75
  threshold: 0,
180
- limit: Math.min(deps.limit ?? LIBRARY_CANDIDATE_LIMIT, MAX_SAFE_LIMIT),
76
+ limit: Math.min(LIBRARY_CANDIDATE_LIMIT, MAX_SAFE_LIMIT),
181
77
  }, 'CharacterLibrary');
182
78
  }
183
79
  catch (error) {
184
80
  // Includes the route's own 500s, which surface as a non-2xx throw.
185
- logger.warn({ err: error }, '[character-library] Search failed');
186
- return { candidates: [], threshold, reason: 'unreachable' };
81
+ logger.warn({ err: error }, '[character-library] Search failed; forging instead');
82
+ return { match: null, reason: 'unreachable' };
187
83
  }
188
84
  if (!Array.isArray(body?.items)) {
189
- logger.warn({ error: body?.error }, '[character-library] Unexpected search response');
190
- return { candidates: [], threshold, reason: 'malformed' };
85
+ logger.warn({ error: body?.error }, '[character-library] Unexpected search response; forging instead');
86
+ return { match: null, reason: 'malformed' };
191
87
  }
192
88
  const items = body.items;
193
89
  if (items.length === 0) {
194
- return { candidates: [], threshold, reason: 'empty' };
90
+ return { match: null, reason: 'empty' };
91
+ }
92
+ let topSimilarity = 0;
93
+ let sawUsable = false;
94
+ for (const item of items) {
95
+ const similarity = typeof item?.similarity === 'number' ? item.similarity : 0;
96
+ if (similarity > topSimilarity)
97
+ topSimilarity = similarity;
98
+ const assetUrl = typeof item?.assetUrl === 'string' ? item.assetUrl.trim() : '';
99
+ const sid = typeof item?.sid === 'string' ? item.sid : '';
100
+ if (!assetUrl || !sid)
101
+ continue;
102
+ sawUsable = true;
103
+ if (similarity < threshold)
104
+ continue;
105
+ return {
106
+ match: {
107
+ sid,
108
+ assetUrl,
109
+ description: typeof item.description === 'string' ? item.description : '',
110
+ subject: typeof item.subject === 'string' ? item.subject : null,
111
+ similarity,
112
+ },
113
+ topSimilarity,
114
+ };
195
115
  }
196
- const { candidates, topSimilarity } = normaliseCandidates(items);
197
116
  // Separating these two is what tells an operator which half is missing: rows
198
117
  // with no files need PUBLISHING, an empty index needs SEEDING.
199
- if (candidates.length === 0) {
200
- return { candidates, threshold, reason: 'no-asset-url', topSimilarity };
201
- }
202
- return { candidates, threshold, topSimilarity };
203
- }
204
- /**
205
- * Find the closest usable library character for a prompt.
206
- *
207
- * Selection is the highest-ranked row that has BOTH a usable `assetUrl` and a
208
- * similarity at or above the floor — walking the list rather than taking the
209
- * first, so an unpublished row costs a fallback instead of a forge.
210
- *
211
- * The floor is applied HERE rather than in the search, which is the only
212
- * difference between the two: `deps.threshold` overrides it (0 for "the best
213
- * available, whatever it scored"), and omitting it takes the shelf's own.
214
- */
215
- export async function findLibraryCharacter(prompt, deps) {
216
- const { candidates, reason, topSimilarity } = await searchLibraryCharacters(prompt, deps);
217
- // Spread rather than assigned, because a caller distinguishes "no rows at all"
218
- // (no score to report) from "rows, none close enough", and an explicit
219
- // `topSimilarity: undefined` is not the same shape as an absent key.
220
- const seen = topSimilarity !== undefined ? { topSimilarity } : {};
221
- if (candidates.length === 0) {
222
- return { match: null, reason, ...seen };
223
- }
224
- const threshold = deps.threshold ?? getCharacterLibraryThreshold(deps.representation);
225
- const match = candidates.find((candidate) => candidate.similarity >= threshold);
226
- return match
227
- ? { match, ...seen }
228
- : { match: null, reason: 'below-threshold', ...seen };
118
+ return { match: null, reason: sawUsable ? 'below-threshold' : 'no-asset-url', topSimilarity };
229
119
  }
230
120
  //# sourceMappingURL=character-library.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"character-library.js","sourceRoot":"","sources":["../../src/generators/character-library.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"character-library.js","sourceRoot":"","sources":["../../src/generators/character-library.ts"],"names":[],"mappings":"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"}
@@ -22,23 +22,6 @@ export declare const characterParamsSchema: z.ZodObject<{
22
22
  applyToPlayer: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
23
23
  headScale: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
24
24
  assetId: z.ZodOptional<z.ZodString>;
25
- libraryOnly: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
26
- libraryPick: z.ZodOptional<z.ZodObject<{
27
- sid: z.ZodString;
28
- assetUrl: z.ZodString;
29
- description: z.ZodOptional<z.ZodString>;
30
- similarity: z.ZodNumber;
31
- }, "strict", z.ZodTypeAny, {
32
- sid: string;
33
- assetUrl: string;
34
- similarity: number;
35
- description?: string | undefined;
36
- }, {
37
- sid: string;
38
- assetUrl: string;
39
- similarity: number;
40
- description?: string | undefined;
41
- }>>;
42
25
  useLibrary: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
43
26
  voxelize: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
44
27
  meshModel: z.ZodOptional<z.ZodString>;
@@ -47,16 +30,9 @@ export declare const characterParamsSchema: z.ZodObject<{
47
30
  prompt: string;
48
31
  applyToPlayer: boolean;
49
32
  headScale: number;
50
- libraryOnly: boolean;
51
33
  useLibrary: boolean;
52
34
  voxelize: boolean;
53
35
  assetId?: string | undefined;
54
- libraryPick?: {
55
- sid: string;
56
- assetUrl: string;
57
- similarity: number;
58
- description?: string | undefined;
59
- } | undefined;
60
36
  meshModel?: string | undefined;
61
37
  }, {
62
38
  name: string;
@@ -64,13 +40,6 @@ export declare const characterParamsSchema: z.ZodObject<{
64
40
  assetId?: string | undefined;
65
41
  applyToPlayer?: boolean | undefined;
66
42
  headScale?: number | undefined;
67
- libraryOnly?: boolean | undefined;
68
- libraryPick?: {
69
- sid: string;
70
- assetUrl: string;
71
- similarity: number;
72
- description?: string | undefined;
73
- } | undefined;
74
43
  useLibrary?: boolean | undefined;
75
44
  voxelize?: boolean | undefined;
76
45
  meshModel?: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"character.d.ts","sourceRoot":"","sources":["../../src/generators/character.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,eAAe,EAAc,YAAY,EAAc,MAAM,aAAa,CAAC;AAWzF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,IAAI,OAAO,CAEzD;AAED,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6CvB,CAAC;AA4CZ;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,MAAM,MAAM,eAAe,GAAG,eAAe,GAAG;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gFAAgF;IAChF,OAAO,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/C,CAAC;AAWF;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AAEzD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,GAAG,SAAS,CAGjG;AAsBD,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEtE;AA6CD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,eAAe,CAAC,CAyM1B"}
1
+ {"version":3,"file":"character.d.ts","sourceRoot":"","sources":["../../src/generators/character.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,eAAe,EAAc,YAAY,EAAc,MAAM,aAAa,CAAC;AAKzF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,IAAI,OAAO,CAEzD;AAED,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiCvB,CAAC;AAEZ;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,MAAM,MAAM,eAAe,GAAG,eAAe,GAAG;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gFAAgF;IAChF,OAAO,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/C,CAAC;AAWF;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AAEzD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,GAAG,SAAS,CAGjG;AAsBD,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEtE;AA6CD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,eAAe,CAAC,CAiJ1B"}
@@ -1,8 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  import { fail, ok } from '../result.js';
3
- import { isManagedAssetUrl } from '../managed-hosts.js';
4
3
  import { formatZodIssues } from '../validation.js';
5
- import { findLibraryCharacter, getCharacterLibraryMode, getCharacterLibraryThreshold, } from './character-library.js';
4
+ import { findLibraryCharacter, getCharacterLibraryMode } from './character-library.js';
6
5
  /**
7
6
  * The chibi house style every library body is built at. Named because the
8
7
  * library search keys off it: a stored body has its head scale baked in, so a
@@ -42,18 +41,6 @@ export const characterParamsSchema = z.object({
42
41
  assetId: z.string()
43
42
  .optional()
44
43
  .describe('Pre-generated asset id from the manifest. The character is stored in world.json assets[] under this id so code can reference it via registerNpc({ characterAssetId }).'),
45
- libraryOnly: z.boolean()
46
- .optional()
47
- .default(false)
48
- .describe('Take the closest ready-made body the library has and never forge. Free and instant; fails if the library has nothing usable rather than falling back to a paid generation. Ignores the quality floor, so a weak match is still returned — the reply says how close it was.'),
49
- libraryPick: z.object({
50
- sid: z.string().min(1),
51
- assetUrl: z.string().min(1),
52
- description: z.string().optional(),
53
- similarity: z.number().min(0).max(1),
54
- }).strict()
55
- .optional()
56
- .describe('A library body the caller has ALREADY chosen, from a prior search. Skips the search and the floor entirely and adds exactly this one; free, and nothing is forged. Use it to honour a creator picking from ranked candidates rather than taking whatever ranked first.'),
57
44
  useLibrary: z.boolean()
58
45
  .optional()
59
46
  .default(true)
@@ -61,54 +48,12 @@ export const characterParamsSchema = z.object({
61
48
  voxelize: z.boolean()
62
49
  .optional()
63
50
  .default(true)
64
- .describe('Voxelize the rigged body (default — the voxel house style). false keeps the textured low-poly rig the forger makes first, for a game whose artStyle is low-poly; the library is then searched for a low-poly body rather than a voxel one.'),
51
+ .describe('Voxelize the rigged body (default — the voxel house style). false keeps the textured low-poly rig the forger makes first, for a game whose artStyle is low-poly; the voxel-only library is skipped.'),
65
52
  meshModel: z.string()
66
53
  .min(1)
67
54
  .optional()
68
- .describe("Asset Forger image-to-mesh model. Low-poly characters default to 'runware-rodin-gen-2', which forges a true low-poly body — an even quad remesh at a triangle count we chose — in ~3 minutes, and bills 60 sparks. Pass 'unified-trellis' to put one back on the cheap lane at 15 sparks; voxel characters use the Forger default."),
55
+ .describe("Asset Forger image-to-mesh model. Low-poly characters default to 'runware-rodin-gen-2', which forges a true low-poly body — an even quad remesh at a triangle count we chose — for ~$0.40 and ~3 minutes. Pass 'unified-trellis' to put one back on the free lane; voxel characters use the Forger default."),
69
56
  }).strict();
70
- /**
71
- * The combinations `libraryOnly` and `libraryPick` rule out.
72
- *
73
- * Checked here rather than as a `.superRefine` on the schema, because that turns
74
- * `characterParamsSchema` into a `ZodEffects` and the exported object's `.shape`
75
- * is what other packages build their own tool schemas out of —
76
- * `game-play-agent/src/mastra/tools/character-generation-tool.ts` reads five
77
- * fields off it. A refinement would be tidier and would break them.
78
- */
79
- function contradiction(input) {
80
- if (input.libraryPick) {
81
- // The same three the automatic path rules out, for the same reasons -- a
82
- // pick is a stored body too, and nothing about having chosen it makes a
83
- // forge parameter applicable.
84
- if (input.libraryOnly) {
85
- return 'libraryPick and libraryOnly contradict each other — one names the body to use, the other asks us to choose.';
86
- }
87
- if (!input.useLibrary) {
88
- return 'libraryPick and useLibrary:false contradict each other — one names a stored body, the other forbids one.';
89
- }
90
- if (input.meshModel !== undefined) {
91
- return 'meshModel selects how a character is FORGED, and libraryPick never forges.';
92
- }
93
- if (!isManagedAssetUrl(input.libraryPick.assetUrl)) {
94
- // Defence in depth rather than a load-bearing gate: a creator can already
95
- // put any URL in their own world.json by hand. What it protects is the
96
- // claim -- a patch that says `source: 'library'` should not be able to
97
- // carry a stranger's host.
98
- return 'libraryPick.assetUrl must be an https URL on a bitmagic asset host.';
99
- }
100
- return null;
101
- }
102
- if (!input.libraryOnly)
103
- return null;
104
- if (!input.useLibrary) {
105
- return 'libraryOnly and useLibrary:false contradict each other — one asks for a stored body, the other forbids it.';
106
- }
107
- if (input.meshModel !== undefined) {
108
- return 'meshModel selects how a character is FORGED, and libraryOnly never forges.';
109
- }
110
- return null;
111
- }
112
57
  const ENDPOINT = '/ai/v1/generate-rigged-character/jobs';
113
58
  /**
114
59
  * The Asset Forger mesh model that forges a true low-poly body: an even quad
@@ -211,23 +156,6 @@ export async function generateCharacter(params, deps) {
211
156
  return fail(formatZodIssues(parsed.error));
212
157
  }
213
158
  const input = parsed.data;
214
- const conflict = contradiction(input);
215
- if (conflict !== null) {
216
- logger.warn({ conflict }, '[character] Contradictory parameters');
217
- return fail(conflict);
218
- }
219
- // A body the caller has already chosen needs NOTHING from the Forger: no
220
- // search, no floor, no dial, and no credentials -- so it answers before the
221
- // credentials guard rather than after it. It still goes through
222
- // `buildCharacterPatches`, which is the point: the deliberate write order
223
- // that path documents stays in one place across all three ways a character
224
- // can arrive.
225
- if (input.libraryPick) {
226
- const { sid, assetUrl, description, similarity } = input.libraryPick;
227
- onProgress(`Adding ready-made character ${sid} from the library…`);
228
- logger.info({ sid, similarity }, '[character] Adding the library character the caller chose');
229
- return ok(`Character "${input.name}" added from the library (${sid}, ${Math.round(similarity * 100)}% match): ${assetUrl}`, buildCharacterPatches(input, assetUrl, 'library', description, sid), { assetId: input.assetId, characterUrl: assetUrl, library: { sid, similarity } });
230
- }
231
159
  if (!forger.hasCredentials()) {
232
160
  logger.error('[character] Missing Asset Forger credentials');
233
161
  return fail(forger.getMissingCredentialsMessage());
@@ -242,66 +170,36 @@ export async function generateCharacter(params, deps) {
242
170
  // worse than forging. (zod fills the default, so "explicitly 150" and
243
171
  // "omitted" are indistinguishable here — and identical in effect.)
244
172
  //
245
- // The art style picks the shelf, it does not decide whether to look: the
246
- // catalogue holds a voxel body AND a textured low-poly rig per character, and
247
- // asking for the wrong one would hand a low-poly game a pile of cubes. Each
248
- // medium has its own dial, so low-poly can sit in `shadow` while voxel is live.
173
+ // An unvoxelized request skips it too: every stored body is a voxel one, so the
174
+ // closest match would be in the wrong medium.
249
175
  //
250
176
  // An explicit meshModel suppresses it for the same reason a non-default
251
177
  // headScale does: a library body was forged by whatever model made it, so
252
178
  // handing one back would silently ignore the model the caller asked for --
253
179
  // and on a paid mesh lane that is the entire point of the request.
254
- //
255
- // `libraryOnly` is none of the above. It is an explicit "give me the closest
256
- // thing you already have, and do not spend anything", so it consults neither
257
- // the substitution dial nor the guards that protect a forge -- there is no
258
- // forge to protect. It suppresses only what it cannot honour: a head scale is
259
- // baked into a stored body, so a non-default one is reported and dropped.
260
- const representation = input.voxelize ? 'voxel' : 'lowpoly';
261
- const libraryMode = getCharacterLibraryMode(representation);
262
- const libraryWanted = input.libraryOnly || (libraryMode !== 'off' && input.useLibrary);
263
- const librarySearchable = input.libraryOnly
264
- || (libraryWanted && input.headScale === DEFAULT_HEAD_SCALE && input.meshModel === undefined);
265
- if (input.libraryOnly && input.headScale !== DEFAULT_HEAD_SCALE) {
266
- logger.info({ headScale: input.headScale }, '[character] libraryOnly: head scale is baked into a stored body and cannot be applied');
267
- onProgress(`Head scale ${input.headScale} cannot be applied to a ready-made body — using it as built.`);
180
+ const libraryMode = getCharacterLibraryMode();
181
+ const libraryWanted = libraryMode !== 'off' && input.useLibrary;
182
+ const librarySearchable = libraryWanted
183
+ && input.headScale === DEFAULT_HEAD_SCALE
184
+ && input.voxelize
185
+ && input.meshModel === undefined;
186
+ if (libraryWanted && !input.voxelize) {
187
+ logger.info('[character] Library skipped: it holds voxel bodies only and this request keeps the low-poly rig');
268
188
  }
269
189
  if (librarySearchable) {
270
- onProgress(input.libraryOnly
271
- ? 'Taking the closest ready-made character…'
272
- : 'Searching the character library…');
273
- const outcome = await findLibraryCharacter(input.prompt, {
274
- forger, logger, representation,
275
- // No floor: the caller asked for the best available, not for a body that
276
- // clears the bar automatic substitution has to clear.
277
- ...(input.libraryOnly ? { threshold: 0 } : {}),
278
- });
190
+ onProgress('Searching the character library…');
191
+ const outcome = await findLibraryCharacter(input.prompt, { forger, logger });
279
192
  const percent = (value) => `${Math.round(value * 100)}%`;
280
- if (outcome.match && (libraryMode === 'on' || input.libraryOnly)) {
193
+ if (outcome.match && libraryMode === 'on') {
281
194
  const { sid, similarity, subject, description, assetUrl } = outcome.match;
282
- onProgress(input.libraryOnly && similarity < getCharacterLibraryThreshold(representation)
283
- ? `Closest ready-made character: ${subject ?? sid} — only a ${percent(similarity)} match,`
284
- + ' below what automatic substitution would accept.'
285
- : `Found a ready-made character: ${subject ?? sid} (${percent(similarity)} match) — no generation needed.`);
286
- logger.info({ sid, similarity, representation }, '[character] Using a library character');
195
+ onProgress(`Found a ready-made character: ${subject ?? sid} (${percent(similarity)} match) — no generation needed.`);
196
+ logger.info({ sid, similarity }, '[character] Using a library character');
287
197
  return ok(`Character "${input.name}" taken from the library (${sid}, ${percent(similarity)} match): ${assetUrl}`, buildCharacterPatches(input, assetUrl, 'library', description, sid), { assetId: input.assetId, characterUrl: assetUrl, library: { sid, similarity } });
288
198
  }
289
199
  // `shadow` observes without substituting, and a miss falls through to the
290
200
  // forge either way. The best score is logged even when it lost — that is the
291
201
  // number that says whether the floor is set right.
292
- logger.info({ mode: libraryMode, representation, sid: outcome.match?.sid, reason: outcome.reason, topSimilarity: outcome.topSimilarity }, '[character] Library did not supply this character');
293
- // Stop here rather than forging. The whole point of libraryOnly is not to
294
- // spend, so falling through would turn a free request into a paid one; and a
295
- // failed result is not billable, so this costs the creator nothing at all.
296
- if (input.libraryOnly) {
297
- const nearest = outcome.topSimilarity !== undefined
298
- ? ` The closest was ${percent(outcome.topSimilarity)}, which had no usable file.`
299
- : '';
300
- logger.info({ representation, reason: outcome.reason, topSimilarity: outcome.topSimilarity }, '[character] libraryOnly found nothing usable');
301
- return fail(`The ${representation} library has no usable body for "${input.prompt}".${nearest}`
302
- + ' Nothing was generated and nothing was charged —'
303
- + ' Run `bitmagic character generate` to forge one.');
304
- }
202
+ logger.info({ mode: libraryMode, sid: outcome.match?.sid, reason: outcome.reason, topSimilarity: outcome.topSimilarity }, '[character] Library did not supply this character');
305
203
  if (outcome.topSimilarity !== undefined && !outcome.match) {
306
204
  onProgress(`No close library match (best ${percent(outcome.topSimilarity)}) — making a new character.`);
307
205
  }
@@ -1 +1 @@
1
- {"version":3,"file":"character.js","sourceRoot":"","sources":["../../src/generators/character.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"character.js","sourceRoot":"","sources":["../../src/generators/character.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -22,9 +22,8 @@ export { generateReferenceImage, referenceImageParamsSchema, REFERENCE_IMAGE_WID
22
22
  export type { ReferenceImageParams, ReferenceImageResult } from './generators/reference.js';
23
23
  export { generateCharacter, characterParamsSchema, meshModelFor, meshModelIsPaid, LOW_POLY_MESH_MODEL, } from './generators/character.js';
24
24
  export type { CharacterParams, CharacterResult } from './generators/character.js';
25
- export { findLibraryCharacter, searchLibraryCharacters, getCharacterLibraryMode, getCharacterLibraryThreshold, DEFAULT_LIBRARY_THRESHOLD, DEFAULT_LOWPOLY_LIBRARY_THRESHOLD, LIBRARY_CANDIDATE_LIMIT, MAX_SAFE_LIMIT, } from './generators/character-library.js';
26
- export type { CharacterLibraryMode, LibraryCharacterMatch, LibraryMissReason, LibraryRepresentation, LibrarySearchOutcome, LibrarySearchResults, SearchLibraryCharactersDeps, VoxelCharacterMatch, } from './generators/character-library.js';
27
- export { isManagedAssetHost, isManagedAssetUrl, MANAGED_HOST_SUFFIXES } from './managed-hosts.js';
25
+ export { findLibraryCharacter, getCharacterLibraryMode, getCharacterLibraryThreshold, DEFAULT_LIBRARY_THRESHOLD, LIBRARY_CANDIDATE_LIMIT, } from './generators/character-library.js';
26
+ export type { CharacterLibraryMode, LibraryMissReason, LibrarySearchOutcome, VoxelCharacterMatch, } from './generators/character-library.js';
28
27
  export { generateProp, propParamsSchema } from './generators/prop.js';
29
28
  export type { PropParams, PropResult } from './generators/prop.js';
30
29
  export { generatePropVoxels, propVoxelParamsSchema, propVoxelGrids } from './generators/prop-voxel.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -11,8 +11,7 @@ export { formatZodIssues } from './validation.js';
11
11
  export { generateImageAsset, imageAssetParamsSchema } from './generators/image.js';
12
12
  export { generateReferenceImage, referenceImageParamsSchema, REFERENCE_IMAGE_WIDTH, REFERENCE_IMAGE_HEIGHT, } from './generators/reference.js';
13
13
  export { generateCharacter, characterParamsSchema, meshModelFor, meshModelIsPaid, LOW_POLY_MESH_MODEL, } from './generators/character.js';
14
- export { findLibraryCharacter, searchLibraryCharacters, getCharacterLibraryMode, getCharacterLibraryThreshold, DEFAULT_LIBRARY_THRESHOLD, DEFAULT_LOWPOLY_LIBRARY_THRESHOLD, LIBRARY_CANDIDATE_LIMIT, MAX_SAFE_LIMIT, } from './generators/character-library.js';
15
- export { isManagedAssetHost, isManagedAssetUrl, MANAGED_HOST_SUFFIXES } from './managed-hosts.js';
14
+ export { findLibraryCharacter, getCharacterLibraryMode, getCharacterLibraryThreshold, DEFAULT_LIBRARY_THRESHOLD, LIBRARY_CANDIDATE_LIMIT, } from './generators/character-library.js';
16
15
  export { generateProp, propParamsSchema } from './generators/prop.js';
17
16
  export { generatePropVoxels, propVoxelParamsSchema, propVoxelGrids } from './generators/prop-voxel.js';
18
17
  export { generateAnimationAsset, animationParamsSchema, getConfiguredAnimationModel, ANIMATION_MODEL_TEXT_TO_MOTION_3, ANIMATION_MODEL_TEXT_TO_MOTION_2, ANIMATION_MODEL_OLDER, } from './generators/animation.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bitmagic/asset-core",
3
- "version": "0.2.20-dev.23",
3
+ "version": "0.2.20-dev.3",
4
4
  "license": "SEE LICENSE IN LICENSE.md",
5
5
  "author": "Bitmagic Oy",
6
6
  "type": "module",
@@ -1,29 +0,0 @@
1
- /**
2
- * Which hosts are bitmagic's own.
3
- *
4
- * The environment classification the whole platform shares: `bitmagic.ai` is
5
- * production (`mini.bitmagic.ai`, `forged-assets.bitmagic.ai`, ...) and
6
- * `bitmagic.cloud` is dev/sandbox (`beta.portal.bitmagic.cloud`,
7
- * `magic-mesh-gen.sandbox.dev.bitmagic.cloud`, ...). Everything else is
8
- * deliberately not ours: an unrecognised host is far likelier to be a creator's
9
- * own endpoint than an asset we should be claiming.
10
- *
11
- * It lives in asset-core because two packages need the same answer and a second
12
- * copy of a security-relevant allowlist is exactly the kind of thing that drifts:
13
- * the CLI's mobile bridge decides which URLs it will fetch on a phone's behalf
14
- * (`cli/src/mobile/asset-hosts.ts`, which re-exports this), and the character
15
- * generator decides whether a caller-supplied `assetUrl` may be written into a
16
- * project as a library body (`generators/character.ts`).
17
- */
18
- /** Host suffixes that identify a bitmagic-controlled host. */
19
- export declare const MANAGED_HOST_SUFFIXES: readonly ["bitmagic.ai", "bitmagic.cloud"];
20
- export declare function isManagedAssetHost(hostname: string): boolean;
21
- /**
22
- * True when `url` is an https URL on a bitmagic-controlled host.
23
- *
24
- * Stricter than {@link isManagedAssetHost} on purpose — it also refuses a port,
25
- * embedded credentials and plain http — because its callers are deciding whether
26
- * to STORE the URL, where the mobile bridge is only deciding whether to fetch it.
27
- */
28
- export declare function isManagedAssetUrl(url: string): boolean;
29
- //# sourceMappingURL=managed-hosts.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"managed-hosts.d.ts","sourceRoot":"","sources":["../src/managed-hosts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,8DAA8D;AAC9D,eAAO,MAAM,qBAAqB,4CAA6C,CAAC;AAKhF,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAI5D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAUtD"}
@@ -1,49 +0,0 @@
1
- /**
2
- * Which hosts are bitmagic's own.
3
- *
4
- * The environment classification the whole platform shares: `bitmagic.ai` is
5
- * production (`mini.bitmagic.ai`, `forged-assets.bitmagic.ai`, ...) and
6
- * `bitmagic.cloud` is dev/sandbox (`beta.portal.bitmagic.cloud`,
7
- * `magic-mesh-gen.sandbox.dev.bitmagic.cloud`, ...). Everything else is
8
- * deliberately not ours: an unrecognised host is far likelier to be a creator's
9
- * own endpoint than an asset we should be claiming.
10
- *
11
- * It lives in asset-core because two packages need the same answer and a second
12
- * copy of a security-relevant allowlist is exactly the kind of thing that drifts:
13
- * the CLI's mobile bridge decides which URLs it will fetch on a phone's behalf
14
- * (`cli/src/mobile/asset-hosts.ts`, which re-exports this), and the character
15
- * generator decides whether a caller-supplied `assetUrl` may be written into a
16
- * project as a library body (`generators/character.ts`).
17
- */
18
- /** Host suffixes that identify a bitmagic-controlled host. */
19
- export const MANAGED_HOST_SUFFIXES = ['bitmagic.ai', 'bitmagic.cloud'];
20
- /** A hostname with no port and no credentials — what a proxy path's first segment may hold. */
21
- const HOSTNAME = /^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/;
22
- export function isManagedAssetHost(hostname) {
23
- const host = hostname.toLowerCase();
24
- if (!HOSTNAME.test(host))
25
- return false;
26
- return MANAGED_HOST_SUFFIXES.some((suffix) => host === suffix || host.endsWith(`.${suffix}`));
27
- }
28
- /**
29
- * True when `url` is an https URL on a bitmagic-controlled host.
30
- *
31
- * Stricter than {@link isManagedAssetHost} on purpose — it also refuses a port,
32
- * embedded credentials and plain http — because its callers are deciding whether
33
- * to STORE the URL, where the mobile bridge is only deciding whether to fetch it.
34
- */
35
- export function isManagedAssetUrl(url) {
36
- let parsed;
37
- try {
38
- parsed = new URL(url);
39
- }
40
- catch {
41
- return false;
42
- }
43
- if (parsed.protocol !== 'https:')
44
- return false;
45
- if (parsed.port !== '' || parsed.username !== '' || parsed.password !== '')
46
- return false;
47
- return isManagedAssetHost(parsed.hostname);
48
- }
49
- //# sourceMappingURL=managed-hosts.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"managed-hosts.js","sourceRoot":"","sources":["../src/managed-hosts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,8DAA8D;AAC9D,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,aAAa,EAAE,gBAAgB,CAAU,CAAC;AAEhF,+FAA+F;AAC/F,MAAM,QAAQ,GAAG,mEAAmE,CAAC;AAErF,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACpC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC;AAChG,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,MAAM,CAAC,IAAI,KAAK,EAAE,IAAI,MAAM,CAAC,QAAQ,KAAK,EAAE,IAAI,MAAM,CAAC,QAAQ,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IACzF,OAAO,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC7C,CAAC"}