@bitmagic/cli 0.1.65-dev.15 → 0.1.65-dev.17
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 +87 -39
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/character.d.ts +18 -0
- package/dist/commands/character.js +268 -0
- package/dist/commands/character.js.map +1 -0
- package/dist/commands/generate.d.ts +31 -15
- package/dist/commands/generate.js +46 -63
- package/dist/commands/generate.js.map +1 -1
- package/dist/generate/character-body.d.ts +79 -0
- package/dist/generate/character-body.js +100 -0
- package/dist/generate/character-body.js.map +1 -0
- package/dist/mobile/asset-hosts.d.ts +7 -9
- package/dist/mobile/asset-hosts.js +7 -16
- package/dist/mobile/asset-hosts.js.map +1 -1
- package/dist/project/character-search.d.ts +30 -0
- package/dist/project/character-search.js +82 -0
- package/dist/project/character-search.js.map +1 -0
- package/dist/scaffold/blender-level-skill-files.js +3 -2
- package/dist/scaffold/blender-level-skill-files.js.map +1 -1
- package/dist/scaffold/project-files.js +3 -3
- package/dist/telemetry/creator-prompt.d.ts +18 -2
- package/dist/telemetry/creator-prompt.js +24 -3
- package/dist/telemetry/creator-prompt.js.map +1 -1
- package/dist/telemetry/report.js +31 -16
- package/dist/telemetry/report.js.map +1 -1
- package/package.json +4 -4
|
@@ -12,18 +12,16 @@
|
|
|
12
12
|
* that redirection: which hosts are ours to fetch on the browser's behalf, and the reversible path
|
|
13
13
|
* that carries one.
|
|
14
14
|
*
|
|
15
|
-
* The host
|
|
16
|
-
*
|
|
17
|
-
* `
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* more likely to be a creator's own endpoint than an asset we should be relaying.
|
|
15
|
+
* The host allowlist itself lives in `@bitmagic/asset-core` (`managed-hosts.ts`) and is
|
|
16
|
+
* re-exported here, because api-server needs the same answer when it decides whether a
|
|
17
|
+
* caller-supplied library `assetUrl` may be stored — and two copies of a security-relevant
|
|
18
|
+
* allowlist drift. `esm.sh` and everything else is deliberately left alone: it serves the import
|
|
19
|
+
* map's modules and already answers `*`.
|
|
21
20
|
*/
|
|
21
|
+
import { isManagedAssetHost, MANAGED_HOST_SUFFIXES } from '@bitmagic/asset-core';
|
|
22
|
+
export { isManagedAssetHost, MANAGED_HOST_SUFFIXES };
|
|
22
23
|
/** The bridge route every proxied asset is fetched through. Trailing slash included. */
|
|
23
24
|
export declare const CDN_PROXY_PREFIX = "/__bm/cdn/";
|
|
24
|
-
/** Host suffixes that identify a bitmagic-controlled asset host. See the file header. */
|
|
25
|
-
export declare const MANAGED_HOST_SUFFIXES: readonly ["bitmagic.ai", "bitmagic.cloud"];
|
|
26
|
-
export declare function isManagedAssetHost(hostname: string): boolean;
|
|
27
25
|
/**
|
|
28
26
|
* The same-origin path that stands in for `url`, or null when the URL is not ours to proxy.
|
|
29
27
|
*
|
|
@@ -12,25 +12,16 @@
|
|
|
12
12
|
* that redirection: which hosts are ours to fetch on the browser's behalf, and the reversible path
|
|
13
13
|
* that carries one.
|
|
14
14
|
*
|
|
15
|
-
* The host
|
|
16
|
-
*
|
|
17
|
-
* `
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* more likely to be a creator's own endpoint than an asset we should be relaying.
|
|
15
|
+
* The host allowlist itself lives in `@bitmagic/asset-core` (`managed-hosts.ts`) and is
|
|
16
|
+
* re-exported here, because api-server needs the same answer when it decides whether a
|
|
17
|
+
* caller-supplied library `assetUrl` may be stored — and two copies of a security-relevant
|
|
18
|
+
* allowlist drift. `esm.sh` and everything else is deliberately left alone: it serves the import
|
|
19
|
+
* map's modules and already answers `*`.
|
|
21
20
|
*/
|
|
21
|
+
import { isManagedAssetHost, MANAGED_HOST_SUFFIXES } from '@bitmagic/asset-core';
|
|
22
|
+
export { isManagedAssetHost, MANAGED_HOST_SUFFIXES };
|
|
22
23
|
/** The bridge route every proxied asset is fetched through. Trailing slash included. */
|
|
23
24
|
export const CDN_PROXY_PREFIX = '/__bm/cdn/';
|
|
24
|
-
/** Host suffixes that identify a bitmagic-controlled asset host. See the file header. */
|
|
25
|
-
export const MANAGED_HOST_SUFFIXES = ['bitmagic.ai', 'bitmagic.cloud'];
|
|
26
|
-
/** A hostname with no port and no credentials — what a proxy path's first segment may hold. */
|
|
27
|
-
const HOSTNAME = /^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/;
|
|
28
|
-
export function isManagedAssetHost(hostname) {
|
|
29
|
-
const host = hostname.toLowerCase();
|
|
30
|
-
if (!HOSTNAME.test(host))
|
|
31
|
-
return false;
|
|
32
|
-
return MANAGED_HOST_SUFFIXES.some((suffix) => host === suffix || host.endsWith(`.${suffix}`));
|
|
33
|
-
}
|
|
34
25
|
/**
|
|
35
26
|
* The same-origin path that stands in for `url`, or null when the URL is not ours to proxy.
|
|
36
27
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset-hosts.js","sourceRoot":"","sources":["../../src/mobile/asset-hosts.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"asset-hosts.js","sourceRoot":"","sources":["../../src/mobile/asset-hosts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAEjF,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,CAAC;AAErD,wFAAwF;AACxF,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC;AAE7C;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IAC7E,IAAI,MAAM,CAAC,IAAI,KAAK,EAAE,IAAI,MAAM,CAAC,QAAQ,KAAK,EAAE,IAAI,MAAM,CAAC,QAAQ,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACxF,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACtD,OAAO,GAAG,gBAAgB,GAAG,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;AACnF,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC/C,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3D,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAChD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO,WAAW,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export declare function characterSearchPath(root: string): string;
|
|
2
|
+
/** One row as the search displayed it. The shape `libraryPick` needs, plus the caption. */
|
|
3
|
+
export interface CharacterCandidate {
|
|
4
|
+
sid: string;
|
|
5
|
+
assetUrl: string;
|
|
6
|
+
description: string;
|
|
7
|
+
subject: string | null;
|
|
8
|
+
similarity: number;
|
|
9
|
+
}
|
|
10
|
+
export interface CharacterSearchRecord {
|
|
11
|
+
/** The prompt that produced this list — `add --id` reuses it as the asset's brief. */
|
|
12
|
+
prompt: string;
|
|
13
|
+
/** Which shelf was searched. `add` sends the matching `voxelize` so the media cannot cross. */
|
|
14
|
+
representation: 'voxel' | 'lowpoly';
|
|
15
|
+
/** The floor automatic substitution would have applied, for the "auto" column. */
|
|
16
|
+
threshold: number;
|
|
17
|
+
searchedAt: string;
|
|
18
|
+
candidates: CharacterCandidate[];
|
|
19
|
+
}
|
|
20
|
+
/** The last search, or null when there is none to trust. */
|
|
21
|
+
export declare function readCharacterSearch(root: string): CharacterSearchRecord | null;
|
|
22
|
+
export declare function writeCharacterSearch(root: string, record: CharacterSearchRecord): void;
|
|
23
|
+
/**
|
|
24
|
+
* The cached row with this id, or null.
|
|
25
|
+
*
|
|
26
|
+
* Case-insensitive on the id because a creator reads it off a table and retypes
|
|
27
|
+
* it, and the corpus uses one case throughout — so a capital letter is a typo
|
|
28
|
+
* with an obvious intent, not a different character.
|
|
29
|
+
*/
|
|
30
|
+
export declare function findCachedCandidate(record: CharacterSearchRecord, sid: string): CharacterCandidate | null;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The candidates the last `bitmagic character search` returned, so
|
|
3
|
+
* `bitmagic character add --id <sid>` can name one of them.
|
|
4
|
+
*
|
|
5
|
+
* The search already fetched every row it displayed — sid, URL, caption and
|
|
6
|
+
* score. Keeping them means `add --id` needs nothing but the id: no second
|
|
7
|
+
* query, no re-ranking, and no asking the creator to retype the prompt that
|
|
8
|
+
* produced the list they are looking at. It also means `add` cannot drift from
|
|
9
|
+
* what was on screen, which a re-search could (the catalogue grows).
|
|
10
|
+
*
|
|
11
|
+
* Lives under `.bitmagic/` like `reference.json` and `cover.json`: generated,
|
|
12
|
+
* machine-written state. NOT in `bitmagic.json`, deliberately — that file is
|
|
13
|
+
* inside the publish fingerprint (shared/asset-core's publish-source.ts), so
|
|
14
|
+
* recording a search there would invalidate a passing `bitmagic verify` every
|
|
15
|
+
* time somebody browsed the shelf.
|
|
16
|
+
*
|
|
17
|
+
* Readers are lenient, like `readCoverRecord` and the reference records: a
|
|
18
|
+
* corrupt or absent file reads as "no search yet", because the worst case is one
|
|
19
|
+
* re-run of a free command, and a hard error would wedge the very command that
|
|
20
|
+
* would have replaced the bad file.
|
|
21
|
+
*
|
|
22
|
+
* There is deliberately no expiry. The catalogue only changes when someone
|
|
23
|
+
* promotes to it, and a stale row fails loudly and harmlessly (the URL 404s) —
|
|
24
|
+
* where a timeout would expire a list the creator is still reading. `add` prints
|
|
25
|
+
* the search's own timestamp instead, so age is visible rather than enforced.
|
|
26
|
+
*/
|
|
27
|
+
import * as path from 'path';
|
|
28
|
+
import { readJsonFile, writeJsonAtomic } from '../atomic-json.js';
|
|
29
|
+
const SEARCH_FILE = path.join('.bitmagic', 'character-search.json');
|
|
30
|
+
export function characterSearchPath(root) {
|
|
31
|
+
return path.join(root, SEARCH_FILE);
|
|
32
|
+
}
|
|
33
|
+
function isCandidate(value) {
|
|
34
|
+
if (typeof value !== 'object' || value === null)
|
|
35
|
+
return false;
|
|
36
|
+
const row = value;
|
|
37
|
+
return typeof row.sid === 'string' && row.sid !== ''
|
|
38
|
+
&& typeof row.assetUrl === 'string' && row.assetUrl !== ''
|
|
39
|
+
&& typeof row.similarity === 'number';
|
|
40
|
+
}
|
|
41
|
+
/** The last search, or null when there is none to trust. */
|
|
42
|
+
export function readCharacterSearch(root) {
|
|
43
|
+
const raw = readJsonFile(characterSearchPath(root));
|
|
44
|
+
if (typeof raw !== 'object' || raw === null)
|
|
45
|
+
return null;
|
|
46
|
+
const record = raw;
|
|
47
|
+
if (typeof record.prompt !== 'string')
|
|
48
|
+
return null;
|
|
49
|
+
if (record.representation !== 'voxel' && record.representation !== 'lowpoly')
|
|
50
|
+
return null;
|
|
51
|
+
if (!Array.isArray(record.candidates))
|
|
52
|
+
return null;
|
|
53
|
+
const candidates = record.candidates.filter(isCandidate).map((row) => ({
|
|
54
|
+
sid: row.sid,
|
|
55
|
+
assetUrl: row.assetUrl,
|
|
56
|
+
description: typeof row.description === 'string' ? row.description : '',
|
|
57
|
+
subject: typeof row.subject === 'string' ? row.subject : null,
|
|
58
|
+
similarity: row.similarity,
|
|
59
|
+
}));
|
|
60
|
+
return {
|
|
61
|
+
prompt: record.prompt,
|
|
62
|
+
representation: record.representation,
|
|
63
|
+
threshold: typeof record.threshold === 'number' ? record.threshold : 0,
|
|
64
|
+
searchedAt: typeof record.searchedAt === 'string' ? record.searchedAt : '',
|
|
65
|
+
candidates,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export function writeCharacterSearch(root, record) {
|
|
69
|
+
writeJsonAtomic(characterSearchPath(root), record);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* The cached row with this id, or null.
|
|
73
|
+
*
|
|
74
|
+
* Case-insensitive on the id because a creator reads it off a table and retypes
|
|
75
|
+
* it, and the corpus uses one case throughout — so a capital letter is a typo
|
|
76
|
+
* with an obvious intent, not a different character.
|
|
77
|
+
*/
|
|
78
|
+
export function findCachedCandidate(record, sid) {
|
|
79
|
+
const wanted = sid.trim().toLowerCase();
|
|
80
|
+
return record.candidates.find((row) => row.sid.toLowerCase() === wanted) ?? null;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=character-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"character-search.js","sourceRoot":"","sources":["../../src/project/character-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -60,7 +60,7 @@ any kind; this path is for places that are designed, not grown.
|
|
|
60
60
|
assumes voxels until told otherwise: put \`"artStyle": "low-poly"\` at the top level of
|
|
61
61
|
\`src/work/game.json\` (or scaffold with \`bitmagic init --art-style low-poly\`). That one field
|
|
62
62
|
switches the cover and reference prompts to low-poly, makes \`assets add\` and \`generate model|prop\`
|
|
63
|
-
keep meshes instead of voxelizing, makes \`
|
|
63
|
+
keep meshes instead of voxelizing, makes \`bitmagic character generate\` keep the textured rig, drops the
|
|
64
64
|
engine's voxel lighting/bloom presets, and gives \`bitmagic judge\` the medium when
|
|
65
65
|
\`## Art direction\` is missing. Set it before the first cover, or the cover is a picture of cubes.
|
|
66
66
|
|
|
@@ -600,7 +600,8 @@ bitmagic assets add build/level/<name>.glb --name <name> --keep-glb --asset-id l
|
|
|
600
600
|
| \`bitmagic cover\`, \`bitmagic reference make\` | MagicaVoxel-style prompt lead and tail | flat-shaded low-poly lead and tail; same image model |
|
|
601
601
|
| \`bitmagic assets add x.glb\` | voxelized in a headless browser | kept as a \`glb\` asset (\`--voxelize\` to bake) |
|
|
602
602
|
| \`bitmagic generate model\` / \`prop\` | voxel master baked in the browser | mesh generated, re-uploaded, registered as \`glb\` (\`--voxelize\` to bake) |
|
|
603
|
-
| \`bitmagic generate
|
|
603
|
+
| \`bitmagic character generate\` | voxelized rig, library search | textured low-poly rig, its own library shelf where enabled (\`--voxelize\` to override) |
|
|
604
|
+
| \`bitmagic character search\` / \`add\` | searches the voxel shelf | searches the low-poly shelf; free, never forges |
|
|
604
605
|
| \`bitmagic generate vehicle\` | voxel car | voxel car anyway — the builder is voxel-native; it says so |
|
|
605
606
|
| engine on load | sunset hemisphere light + faint bloom | neither; \`MeshLevel\`'s own lighting stands |
|
|
606
607
|
| \`bitmagic judge\` with no \`## Art direction\` | grades style as it finds it | judges within low-poly |
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blender-level-skill-files.js","sourceRoot":"","sources":["../../src/scaffold/blender-level-skill-files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,MAAM,UAAU,wBAAwB;IACtC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8QR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,iCAAiC;IAC/C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyFR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,4BAA4B;IAC1C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2FR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,4BAA4B;IAC1C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyER,CAAC;AACF,CAAC;AAED,MAAM,UAAU,mCAAmC;IACjD,OAAO
|
|
1
|
+
{"version":3,"file":"blender-level-skill-files.js","sourceRoot":"","sources":["../../src/scaffold/blender-level-skill-files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,MAAM,UAAU,wBAAwB;IACtC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8QR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,iCAAiC;IAC/C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyFR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,4BAA4B;IAC1C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2FR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,4BAA4B;IAC1C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyER,CAAC;AACF,CAAC;AAED,MAAM,UAAU,mCAAmC;IACjD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgHR,CAAC;AACF,CAAC"}
|
|
@@ -1079,7 +1079,7 @@ bitmagic generate block-type --name mossy_brick --description "damp green moss o
|
|
|
1079
1079
|
bitmagic generate sound --prompt "heavy wooden door slamming" [--duration 3] [--loop]
|
|
1080
1080
|
bitmagic generate music --prompt "driving synthwave, no vocals" [--duration 30] [--instrumental] [--out bed.mp3 --no-world]
|
|
1081
1081
|
bitmagic generate image --name hero-portrait --prompt "..." [--width 512] [--height 512]
|
|
1082
|
-
bitmagic generate
|
|
1082
|
+
bitmagic character generate --name guard --prompt "..." [--apply-to-player] [--fresh] # or FREE off the shelf: character search --prompt "..." then character add --name guard --id <sid>
|
|
1083
1083
|
bitmagic generate animation --family gait --name LimpStride --based-on walk [--dial limpSide=right]
|
|
1084
1084
|
bitmagic generate animation --spec clip.json # melee and oneShot clips: a spec file
|
|
1085
1085
|
bitmagic generate video --prompt "the castle gates swing open" [--duration 5] [--image cover.png]
|
|
@@ -1087,7 +1087,7 @@ bitmagic generate model --prompt "a mossy stone arch" [--height 3]
|
|
|
1087
1087
|
bitmagic generate vehicle --prompt "a rusty orange pickup" | --preset VAN
|
|
1088
1088
|
\`\`\`
|
|
1089
1089
|
|
|
1090
|
-
Run \`bitmagic generate <type> --help\` for the full flags of any one.
|
|
1090
|
+
Run \`bitmagic generate <type> --help\` for the full flags of any one, or \`bitmagic character <verb> --help\` — characters are their own group, where \`generate\` costs sparks and \`search\`/\`add\` are free because they use the ready-made library instead of forging.
|
|
1091
1091
|
|
|
1092
1092
|
**Always add \`--original-prompt "<creator's request, verbatim>"\`** — to EVERY \`bitmagic\` command, \`build\`/\`verify\`/\`dev\`/\`reload\`/\`publish\` included. Never affects output; it is what counts the prompts shown on the game's public page.
|
|
1093
1093
|
|
|
@@ -1535,7 +1535,7 @@ The \`bitmagic\` CLI generates content directly into this project. Eleven types
|
|
|
1535
1535
|
| \`bitmagic generate sound --prompt "..."\` | a sound effect | \`assets[]\` |
|
|
1536
1536
|
| \`bitmagic generate music --prompt "..." [--duration 30]\` | a music track (loops by default; billed per second) | \`assets[]\` (or a file with \`--out <mp3> --no-world\`) |
|
|
1537
1537
|
| \`bitmagic generate image --name <id> --prompt "..."\` | a 2D image | \`assets[]\` |
|
|
1538
|
-
| \`bitmagic generate
|
|
1538
|
+
| \`bitmagic character generate --name <id> --prompt "..."\` | a rigged character; substitutes a close-enough ready-made one when the library has it (\`--fresh\` always forges). \`character search --prompt "..."\` then \`character add --name <id> --id <sid>\` instead is **free** and never forges — prefer it when any plausible body will do | \`assets[]\` |
|
|
1539
1539
|
| \`bitmagic generate animation --family gait ...\` or \`--spec <file>\` | an animation clip | \`assets[]\` |
|
|
1540
1540
|
| \`bitmagic generate video --prompt "..." [--duration 5] [--image <png>]\` | a short 720p clip for a cutscene (billed per second) | \`assets[]\`, played with \`engine.playVideo("<id>")\` |
|
|
1541
1541
|
| \`bitmagic generate model --prompt "..."\` | a new 3D model | \`assets[]\` |
|
|
@@ -40,8 +40,9 @@ export declare function creatorPromptField(override?: unknown): {
|
|
|
40
40
|
/** `body` plus the creator's own words, when the flag was given and telemetry is on. */
|
|
41
41
|
export declare function withParent(body: Record<string, unknown>): Record<string, unknown>;
|
|
42
42
|
/**
|
|
43
|
-
* The creator's ask as an opaque, stable dedupe key — what
|
|
44
|
-
*
|
|
43
|
+
* The creator's ask as an opaque, stable dedupe key — what a game's "Built with N prompts" is
|
|
44
|
+
* counted on, so the COUNT never depends on storing anybody's words. (The beacon also carries the
|
|
45
|
+
* words themselves in {@link creatorAskText}, for a channel that shows them and stores nothing.)
|
|
45
46
|
*
|
|
46
47
|
* The CLI is the ONLY producer of this value. api-server stores it and compares it to other
|
|
47
48
|
* values from this same function; it never recomputes one from text, so the two sides cannot
|
|
@@ -56,3 +57,18 @@ export declare function withParent(body: Record<string, unknown>): Record<string
|
|
|
56
57
|
* `--original-prompt` produces — the count is a floor, never an overcount.
|
|
57
58
|
*/
|
|
58
59
|
export declare function creatorAskDigest(override?: unknown): string | undefined;
|
|
60
|
+
/**
|
|
61
|
+
* The creator's ask as TEXT, bounded for a wire that has a body limit.
|
|
62
|
+
*
|
|
63
|
+
* The beacon carries this so the live-prompts Slack channel can show what an
|
|
64
|
+
* agent is being asked for on the commands that send no prompt anywhere else —
|
|
65
|
+
* `build`, `verify`, `dev`, `reload`, `publish` — which are most of what
|
|
66
|
+
* building a GDK project consists of. api-server posts it and never stores it:
|
|
67
|
+
* the count still runs on {@link creatorAskDigest}, and no prompt text reaches
|
|
68
|
+
* Postgres.
|
|
69
|
+
*
|
|
70
|
+
* Capped by the same rule the digest hashes under, so the two always describe
|
|
71
|
+
* the same words. `DO_NOT_TRACK` drops it upstream in `beginCommand`, like
|
|
72
|
+
* every other field here.
|
|
73
|
+
*/
|
|
74
|
+
export declare function creatorAskText(override?: unknown): string | undefined;
|
|
@@ -52,8 +52,9 @@ export function withParent(body) {
|
|
|
52
52
|
return 'creatorPrompt' in field ? { ...body, ...field } : body;
|
|
53
53
|
}
|
|
54
54
|
/**
|
|
55
|
-
* The creator's ask as an opaque, stable dedupe key — what
|
|
56
|
-
*
|
|
55
|
+
* The creator's ask as an opaque, stable dedupe key — what a game's "Built with N prompts" is
|
|
56
|
+
* counted on, so the COUNT never depends on storing anybody's words. (The beacon also carries the
|
|
57
|
+
* words themselves in {@link creatorAskText}, for a channel that shows them and stores nothing.)
|
|
57
58
|
*
|
|
58
59
|
* The CLI is the ONLY producer of this value. api-server stores it and compares it to other
|
|
59
60
|
* values from this same function; it never recomputes one from text, so the two sides cannot
|
|
@@ -68,9 +69,29 @@ export function withParent(body) {
|
|
|
68
69
|
* `--original-prompt` produces — the count is a floor, never an overcount.
|
|
69
70
|
*/
|
|
70
71
|
export function creatorAskDigest(override) {
|
|
72
|
+
const text = creatorAskText(override);
|
|
73
|
+
if (text === undefined)
|
|
74
|
+
return undefined;
|
|
75
|
+
return createHash('sha256').update(text).digest('hex').slice(0, 16);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* The creator's ask as TEXT, bounded for a wire that has a body limit.
|
|
79
|
+
*
|
|
80
|
+
* The beacon carries this so the live-prompts Slack channel can show what an
|
|
81
|
+
* agent is being asked for on the commands that send no prompt anywhere else —
|
|
82
|
+
* `build`, `verify`, `dev`, `reload`, `publish` — which are most of what
|
|
83
|
+
* building a GDK project consists of. api-server posts it and never stores it:
|
|
84
|
+
* the count still runs on {@link creatorAskDigest}, and no prompt text reaches
|
|
85
|
+
* Postgres.
|
|
86
|
+
*
|
|
87
|
+
* Capped by the same rule the digest hashes under, so the two always describe
|
|
88
|
+
* the same words. `DO_NOT_TRACK` drops it upstream in `beginCommand`, like
|
|
89
|
+
* every other field here.
|
|
90
|
+
*/
|
|
91
|
+
export function creatorAskText(override) {
|
|
71
92
|
const field = creatorPromptField(override);
|
|
72
93
|
if (!('creatorPrompt' in field))
|
|
73
94
|
return undefined;
|
|
74
|
-
return
|
|
95
|
+
return field.creatorPrompt.slice(0, MAX_ASK_CHARS);
|
|
75
96
|
}
|
|
76
97
|
//# sourceMappingURL=creator-prompt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"creator-prompt.js","sourceRoot":"","sources":["../../src/telemetry/creator-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,sGAAsG;AACtG,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,oFAAoF;UAC7F,iEAAiE;CAC7D,CAAC;AAEX;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAkB;IACnD,MAAM,KAAK,GAAG,QAAQ,IAAI,cAAc,EAAE,EAAE,aAAa,CAAC;IAC1D,oFAAoF;IACpF,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACrG,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,UAAU,CAAC,IAA6B;IACtD,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;IACnC,gGAAgG;IAChG,8FAA8F;IAC9F,OAAO,eAAe,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACjE,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"creator-prompt.js","sourceRoot":"","sources":["../../src/telemetry/creator-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,sGAAsG;AACtG,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,oFAAoF;UAC7F,iEAAiE;CAC7D,CAAC;AAEX;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAkB;IACnD,MAAM,KAAK,GAAG,QAAQ,IAAI,cAAc,EAAE,EAAE,aAAa,CAAC;IAC1D,oFAAoF;IACpF,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACrG,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,UAAU,CAAC,IAA6B;IACtD,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;IACnC,gGAAgG;IAChG,8FAA8F;IAC9F,OAAO,eAAe,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACjE,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAkB;IACjD,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACzC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACtE,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,cAAc,CAAC,QAAkB;IAC/C,MAAM,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,CAAC,CAAC,eAAe,IAAI,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAClD,OAAO,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;AACrD,CAAC"}
|
package/dist/telemetry/report.js
CHANGED
|
@@ -16,11 +16,19 @@
|
|
|
16
16
|
* bounded to {@link REPORT_TIMEOUT_MS} per request so a finished command is
|
|
17
17
|
* never held open by a sulking network (the same reasoning as
|
|
18
18
|
* update/check.ts). It never prints.
|
|
19
|
-
* 2.
|
|
20
|
-
* exit code, a `CliError.code`, and a duration. A message can name a
|
|
21
|
-
* that does not belong in an analytics event. The
|
|
22
|
-
*
|
|
23
|
-
*
|
|
19
|
+
* 2. Its ANALYTICS are categories, never messages: the command name, ok/failed,
|
|
20
|
+
* the exit code, a `CliError.code`, and a duration. A message can name a
|
|
21
|
+
* path; that does not belong in an analytics event. The game id keeps the
|
|
22
|
+
* rule (it is an id we minted) and so does the ask DIGEST (opaque by
|
|
23
|
+
* construction), and neither reaches GA4.
|
|
24
|
+
*
|
|
25
|
+
* `creatorPrompt` is the one field that carries words, and it is not
|
|
26
|
+
* analytics: api-server posts it to an internal Slack channel and stores it
|
|
27
|
+
* nowhere — not GA4, not Postgres, not BigQuery. It is here because the
|
|
28
|
+
* commands that send prompt text to a route are the generators, and an
|
|
29
|
+
* agent building a GDK project spends most of its commands on the offline
|
|
30
|
+
* ones. `DO_NOT_TRACK` drops it with everything else. See
|
|
31
|
+
* {@link CommandProvenance}.
|
|
24
32
|
* 3. It is authenticated with the creator's own token, so the server can key
|
|
25
33
|
* the event to the account and look up their real Pro state. No token, no
|
|
26
34
|
* report — an anonymous beacon would be a spammable endpoint for nothing.
|
|
@@ -32,7 +40,7 @@ import { resolveAuth0ClientId } from '../config/environments.js';
|
|
|
32
40
|
import { getAccessToken } from '../auth/session.js';
|
|
33
41
|
import { readProjectGameIdOrNull } from '../project/context.js';
|
|
34
42
|
import { apiServerHeaders } from './request-headers.js';
|
|
35
|
-
import { creatorAskDigest } from './creator-prompt.js';
|
|
43
|
+
import { creatorAskDigest, creatorAskText } from './creator-prompt.js';
|
|
36
44
|
import { currentCommand, isTelemetryDisabled } from './command-context.js';
|
|
37
45
|
// Re-exported because this is where the opt-out is enforced for a report that is already
|
|
38
46
|
// under way; `beginCommand` consults the same predicate to skip collecting anything at all.
|
|
@@ -85,21 +93,28 @@ function defaultDeps() {
|
|
|
85
93
|
return { fetch: globalThis.fetch, env: process.env };
|
|
86
94
|
}
|
|
87
95
|
/**
|
|
88
|
-
* The game and the ask, when this command has either.
|
|
89
|
-
*
|
|
90
|
-
*
|
|
96
|
+
* The game and the ask, when this command has either. Keys are omitted rather than sent as null:
|
|
97
|
+
* api-server validates the body strictly, and an absent key is how "nothing to say" is spelled
|
|
98
|
+
* everywhere else on this wire.
|
|
99
|
+
*
|
|
100
|
+
* Nothing is present unless the command declared `--original-prompt` AND the agent passed it —
|
|
101
|
+
* `creatorAskDigest` reads the value `beginCommand` captured, which is also where `DO_NOT_TRACK`
|
|
102
|
+
* already dropped it.
|
|
91
103
|
*
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
104
|
+
* `gameId` and `askDigest` are only sent TOGETHER: a digest with no game cannot be counted, and a
|
|
105
|
+
* game with no digest is not an ask. `creatorPrompt` is independent of that pair, because the
|
|
106
|
+
* channel it feeds wants the ask from a command run before a game exists just as much — the pair
|
|
107
|
+
* is about counting, and counting needs a game to count against.
|
|
96
108
|
*/
|
|
97
109
|
function provenance(deps) {
|
|
98
|
-
const
|
|
99
|
-
if (
|
|
110
|
+
const creatorPrompt = creatorAskText();
|
|
111
|
+
if (creatorPrompt === undefined)
|
|
100
112
|
return {};
|
|
101
113
|
const gameId = readProjectGameIdOrNull(deps.cwd);
|
|
102
|
-
|
|
114
|
+
const askDigest = creatorAskDigest();
|
|
115
|
+
if (gameId === undefined || askDigest === undefined)
|
|
116
|
+
return { creatorPrompt };
|
|
117
|
+
return { creatorPrompt, gameId, askDigest };
|
|
103
118
|
}
|
|
104
119
|
/**
|
|
105
120
|
* Report the running command's `report` to api-server. Resolves when the report
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/telemetry/report.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/telemetry/report.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bitmagic/cli",
|
|
3
|
-
"version": "0.1.65-dev.
|
|
3
|
+
"version": "0.1.65-dev.17",
|
|
4
4
|
"description": "Build Bitmagic games from your own agent tool",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
6
6
|
"author": "Bitmagic Oy",
|
|
@@ -25,9 +25,9 @@
|
|
|
25
25
|
"playwright-core": "^1.59.1",
|
|
26
26
|
"tar": "^7.4.3",
|
|
27
27
|
"ws": "^8.21.3",
|
|
28
|
-
"@bitmagic/
|
|
29
|
-
"@bitmagic/
|
|
30
|
-
"@bitmagic/
|
|
28
|
+
"@bitmagic/animation-forger": "0.1.20-dev.17",
|
|
29
|
+
"@bitmagic/asset-core": "0.2.20-dev.17",
|
|
30
|
+
"@bitmagic/world-forger": "0.1.25-dev.17"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@eslint/js": "^9.38.0",
|