@hraness/slopcamera 3.2.7 → 3.3.1
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/NOTICE.md +1 -7
- package/PRIVACY.md +16 -7
- package/README.md +65 -20
- package/apps/desktop/README.md +14 -130
- package/apps/desktop/application/context.ts +6 -9
- package/apps/desktop/application/default-registry.ts +26 -10
- package/apps/desktop/application/operation.ts +14 -5
- package/apps/desktop/application/operations/index.ts +4 -1
- package/apps/desktop/application/operations/spatial-behavior.ts +151 -0
- package/apps/desktop/application/operations/spatial-direction.ts +222 -0
- package/apps/desktop/application/operations/spatial-rendered-audit.ts +174 -0
- package/apps/desktop/application/operations/spatial-review.ts +194 -0
- package/apps/desktop/application/operations/spatial-scene.ts +25 -1
- package/apps/desktop/application/registry.ts +2 -2
- package/apps/desktop/application/spatial-asset-admission.ts +201 -0
- package/apps/desktop/application/spatial-assets.ts +160 -31
- package/apps/desktop/application/spatial-render.ts +217 -20
- package/apps/desktop/application/spatial-rendered-audit.ts +273 -0
- package/apps/desktop/application/spatial-review.ts +361 -0
- package/apps/desktop/application/spatial-spz.ts +48 -3
- package/apps/desktop/application/spatial-world-import.ts +26 -5
- package/apps/desktop/application/spatial-world-metadata.ts +105 -0
- package/apps/desktop/cli/args.ts +528 -97
- package/apps/desktop/cli/capability-manifest.ts +374 -0
- package/apps/desktop/cli/cinema-renderer.ts +608 -0
- package/apps/desktop/cli/command-host-resources.ts +31 -2
- package/apps/desktop/cli/commands.ts +1215 -70
- package/apps/desktop/cli/gateway-review-provider.ts +334 -0
- package/apps/desktop/cli/help.ts +183 -23
- package/apps/desktop/cli/html-scene.ts +139 -28
- package/apps/desktop/cli/io.ts +2 -1
- package/apps/desktop/cli/main.ts +26 -50
- package/apps/desktop/cli/menubar.ts +244 -0
- package/apps/desktop/cli/music-analysis-service.ts +61 -0
- package/apps/desktop/cli/portable-surface.ts +18 -5
- package/apps/desktop/cli/spatial-asset-service.ts +124 -0
- package/apps/desktop/cli/spatial-design-service.ts +237 -0
- package/apps/desktop/cli/spatial-generate-service.ts +370 -0
- package/apps/desktop/cli/spatial-scene-service.ts +268 -4
- package/apps/desktop/cli/workflow-code.ts +1 -1
- package/apps/desktop/code/application-node-planner.ts +0 -47
- package/apps/desktop/code/host-source-layout.ts +46 -0
- package/apps/desktop/code/public.ts +0 -1
- package/apps/desktop/code/runtime-identity.ts +50 -8
- package/apps/desktop/code/semantic-builder.ts +24 -43
- package/apps/desktop/code/source-bundle.ts +23 -6
- package/apps/desktop/code/source-typecheck.ts +131 -43
- package/apps/desktop/code/worker-client.ts +14 -2
- package/apps/desktop/contracts/cinema.ts +736 -0
- package/apps/desktop/contracts/index.ts +1 -0
- package/apps/desktop/contracts/spatial-asset.ts +16 -0
- package/apps/desktop/contracts/spatial-world.ts +26 -3
- package/apps/desktop/core/cinema-plan.ts +1320 -0
- package/apps/desktop/core/index.ts +1 -0
- package/apps/desktop/core/music-analysis.ts +124 -1
- package/apps/desktop/core/storage.ts +75 -0
- package/apps/desktop/dist/cli/main.js +737 -291
- package/apps/desktop/html-overlay/audio-reactivity.ts +127 -0
- package/apps/desktop/html-overlay/index.ts +9 -0
- package/apps/desktop/html-overlay/runtime.ts +2 -0
- package/apps/desktop/html-overlay/scene.ts +29 -0
- package/apps/desktop/html-overlay/spatial.ts +619 -57
- package/apps/desktop/workflows/cinematic-world.ts +127 -0
- package/apps/desktop/workflows/index.ts +6 -0
- package/dist/cli.js +32 -434
- package/dist/code/advanced.js +1 -269
- package/dist/code/index.js +16 -2239
- package/dist/generate.js +1 -23
- package/dist/host-resources.js +1 -25
- package/dist/index-0bbesn4m.js +35 -0
- package/dist/index-296qhpf2.js +3 -0
- package/dist/index-3cxf2c58.js +3 -0
- package/dist/index-77fjfg9f.js +3 -0
- package/dist/index-80a36bc0.js +3 -0
- package/dist/index-a3vvs3rf.js +3 -0
- package/dist/index-b3geqczn.js +5 -0
- package/dist/index-cgpkyjqa.js +3 -0
- package/dist/index-f0ptv8dm.js +7 -0
- package/dist/index-grk47tgs.js +3 -0
- package/dist/index-qry58nj2.js +10 -0
- package/dist/index.js +1 -240
- package/dist/operations.js +1 -28
- package/dist/skill-install-gx7afxsd.js +2 -0
- package/dist/vectorize/worker.js +1 -141
- package/dist/workflow.js +1 -15
- package/docs/README.md +5 -1
- package/docs/studio.md +1 -1
- package/package.json +11 -24
- package/skills/slopcamera/SKILL.md +14 -1
- package/skills/slopcamera/references/diagrams.md +5 -14
- package/skills/slopcamera/references/directed-scenes.md +22 -2
- package/skills/slopcamera/references/gateway-media.md +15 -1
- package/skills/slopcamera/references/image-galleries.md +166 -0
- package/skills/slopcamera/references/install.md +2 -2
- package/skills/slopcamera/references/music-video.md +23 -3
- package/skills/slopcamera/references/parametric-design.md +14 -0
- package/skills/slopcamera/references/reference-led-3d.md +1 -1
- package/skills/slopcamera/references/scene-building.md +32 -0
- package/skills/slopcamera/references/social-collage-banners.md +204 -0
- package/skills/slopcamera/references/support.md +25 -0
- package/skills/slopcamera/references/web-media-excerpts.md +120 -0
- package/skills/slopcamera/references/workflows-sdk.md +3 -3
- package/skills/slopcamera/scripts/compose-social-collage-banner.ts +728 -0
- package/src/capability-manifest.ts +361 -0
- package/src/cli.ts +250 -102
- package/src/code/canonical-json.ts +9 -0
- package/src/generate.ts +2 -2
- package/src/icon.ts +1111 -0
- package/src/image-gallery.ts +1049 -0
- package/src/index.ts +11 -23
- package/src/mcp/boundary.ts +11 -11
- package/src/mcp/index.ts +3 -0
- package/src/mcp/server.ts +2 -1
- package/src/mcp/tools.ts +1642 -130
- package/src/mcp/types.ts +19 -0
- package/src/operations.ts +412 -0
- package/src/portable-capability-manifest.ts +67 -0
- package/src/scene-gallery.ts +184 -0
- package/src/spatial-scene/asset-admission.ts +183 -0
- package/src/spatial-scene/audit-rendered.ts +692 -0
- package/src/spatial-scene/audit.ts +617 -0
- package/src/spatial-scene/behavior-audit.ts +252 -0
- package/src/spatial-scene/behavior-bake.ts +233 -0
- package/src/spatial-scene/behavior-fns.ts +585 -0
- package/src/spatial-scene/behavior-gallery.ts +109 -0
- package/src/spatial-scene/behavior-stdlib.ts +323 -0
- package/src/spatial-scene/behavior-trace.ts +325 -0
- package/src/spatial-scene/behavior.ts +618 -0
- package/src/spatial-scene/build.ts +632 -0
- package/src/spatial-scene/camera-rig.ts +125 -0
- package/src/spatial-scene/camera-track.ts +4 -2
- package/src/spatial-scene/character.ts +124 -0
- package/src/spatial-scene/contracts.ts +75 -7
- package/src/spatial-scene/design-templates.ts +351 -0
- package/src/spatial-scene/design.ts +327 -0
- package/src/spatial-scene/direction-compile.ts +584 -0
- package/src/spatial-scene/direction.ts +122 -0
- package/src/spatial-scene/effects.ts +149 -0
- package/src/spatial-scene/evaluate.ts +109 -29
- package/src/spatial-scene/gallery.ts +277 -0
- package/src/spatial-scene/generate.ts +239 -0
- package/src/spatial-scene/geometry-native.ts +165 -0
- package/src/spatial-scene/geometry.ts +1216 -0
- package/src/spatial-scene/gltf.ts +600 -77
- package/src/spatial-scene/identity.ts +55 -2
- package/src/spatial-scene/index.ts +36 -0
- package/src/spatial-scene/inspect.ts +35 -6
- package/src/spatial-scene/material-lighting.ts +609 -0
- package/src/spatial-scene/math.ts +21 -4
- package/src/spatial-scene/motion-evidence.ts +88 -0
- package/src/spatial-scene/parametric.ts +765 -0
- package/src/spatial-scene/particle-preparation.ts +183 -0
- package/src/spatial-scene/particle.ts +195 -0
- package/src/spatial-scene/patch.ts +109 -15
- package/src/spatial-scene/performance.ts +1613 -0
- package/src/spatial-scene/probe.ts +137 -0
- package/src/spatial-scene/recipe-pack.ts +86 -0
- package/src/spatial-scene/render-effects.ts +240 -0
- package/src/spatial-scene/review.ts +639 -0
- package/src/spatial-scene/simulation-bake.ts +206 -0
- package/src/spatial-scene/simulation.ts +187 -0
- package/src/spatial-scene/solve.ts +366 -0
- package/src/spatial-scene/temporal-audit.ts +354 -0
- package/src/support-completion.ts +16 -0
- package/src/support.ts +42 -0
- package/src/version.ts +1 -1
- package/apps/desktop/application/operations/recording/index.ts +0 -5
- package/apps/desktop/application/operations/recording/pause.ts +0 -34
- package/apps/desktop/application/operations/recording/resume.ts +0 -34
- package/apps/desktop/application/operations/recording/shared.ts +0 -199
- package/apps/desktop/application/operations/recording/start.ts +0 -169
- package/apps/desktop/application/operations/recording/stop.ts +0 -34
- package/apps/desktop/capture/protocol.ts +0 -689
- package/apps/desktop/cli/capture-bundle.ts +0 -1117
- package/apps/desktop/cli/recording-controller.ts +0 -1567
- package/apps/desktop/cli/recording-daemon.ts +0 -931
- package/dist/index-42zsesc1.js +0 -2257
- package/dist/index-7308egqr.js +0 -48
- package/dist/index-8txs6fkn.js +0 -712
- package/dist/index-mcy8z0br.js +0 -192
- package/dist/index-p63wavx0.js +0 -2029
- package/dist/index-r7gdhmsp.js +0 -424
- package/dist/index-rvghzt7b.js +0 -2013
- package/dist/index-sh6xbav6.js +0 -1219
- package/dist/index-z1w83f81.js +0 -4
- package/dist/index-z7239b4h.js +0 -2363
- package/dist/skill-install-dh0ntqba.js +0 -10
- package/src/desktop.ts +0 -253
|
@@ -124,21 +124,12 @@ assets for ordinary proportional text while retaining host discovery for
|
|
|
124
124
|
explicit mono and custom font roles.
|
|
125
125
|
|
|
126
126
|
|
|
127
|
-
## Use
|
|
127
|
+
## Use browser canvas tooling deliberately
|
|
128
128
|
|
|
129
|
-
The generated `.tldr` file is editable interchange and does not require
|
|
130
|
-
|
|
131
|
-
wants direct canvas editing
|
|
132
|
-
|
|
133
|
-
```sh
|
|
134
|
-
slopcamera canvas open diagrams/<slug>.tldr
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
If the optional app is absent, `slopcamera canvas install` resolves the current
|
|
138
|
-
official release, verifies its published SHA-256 digest, and launches the
|
|
139
|
-
platform installer. The app imports `.tldr` as an unsaved document; save it
|
|
140
|
-
there to create its newer native `.tldraw` bundle. Never rewrite a native
|
|
141
|
-
`.tldraw` ZIP/SQLite bundle directly.
|
|
129
|
+
The generated `.tldr` file is editable interchange and does not require a
|
|
130
|
+
separate application to create. Open it in a browser-based canvas editor when a
|
|
131
|
+
person wants direct canvas editing. Slopcamera does not install or launch a
|
|
132
|
+
diagram editor or application bundle, and `.tldraw` application bundles are outside its contract.
|
|
142
133
|
|
|
143
134
|
## Verify
|
|
144
135
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Use `slopcamera scene --help` to check that the installed CLI includes the directed-scene foundation. The initial renderer uses Three.js and supports explicit scene JSON, semantic edits, calibrated cameras, native media surfaces, contact sheets, and transparent video.
|
|
4
4
|
|
|
5
|
-
Start with `slopcamera scene init scene.json --json`, then `slopcamera scene inspect scene.json --json`. Retain the original source. Use its stable entity IDs and exact `sceneSha256` in typed patches; save each edit with `--output` to a new file. Inspect `editableControls` before changing generated parts or imported materials. Do not replace named scene parts with opaque regenerated source merely to change one color or camera.
|
|
5
|
+
To author a scene from code — builder helpers, procedural generator modules, glTF admission, or geometric audit — read [scene building](scene-building.md) first. Start interactive work with `slopcamera scene init scene.json --json`, then `slopcamera scene inspect scene.json --json`. Retain the original source. Use its stable entity IDs and exact `sceneSha256` in typed patches; save each edit with `--output` to a new file. Inspect `editableControls` before changing generated parts or imported materials. Do not replace named scene parts with opaque regenerated source merely to change one color or camera.
|
|
6
6
|
|
|
7
7
|
Use `slopcamera scene plan scene.json --request request.json --json` before rendering. A frame request is:
|
|
8
8
|
|
|
@@ -22,15 +22,35 @@ For a media project, finish ordinary timeline/audio edits before V2 migration. R
|
|
|
22
22
|
|
|
23
23
|
Use `scene project restore` to select an earlier retained scene for explicit shots in a new project revision. Use `add-asset`/`replace-asset` and `set-mesh-geometry` for authored representation changes. Preserve the entity ID and explicitly readdress GLB node/clip indices after a payload replacement; inspect available controls again afterward.
|
|
24
24
|
|
|
25
|
+
Generated raster assets enter the scene the same way: declare the image as an `add-asset` payload with `provenance.source: "generated"`, then apply it explicitly — `set-material` with `material.map` on an authored procedural mesh for a texture, or `add-entity` a `kind: "environment"` entity (`role` plus bounded `intensity`) for a skybox. When alternatives matter, review them through [an image gallery](image-galleries.md) first and promote only the selected candidate; a frame renders at most one visible environment entity.
|
|
26
|
+
|
|
25
27
|
Prepare a camera program with `slopcamera scene project prepare-render <project-id> --input prepare.json --output prepared-render.json --json`. The input declares the exact basis, calibrated output profile, straight-alpha full-frame scene policy, and delivery output/sync policy/tier. Then run `slopcamera workflows plan directed-scene --input prepared-render.json --json` and `slopcamera workflows run directed-scene --input prepared-render.json --json`. Use `slopcamera workflows show directed-scene --json` for the complete prepared-input schema.
|
|
26
28
|
|
|
27
29
|
Use `--profile three-webgl2-hardware-v1` on scene rendering or project preparation to require the qualified macOS Metal backend. Missing or software GPU evidence rejects; no silent fallback occurs. A profile already in the request must agree with the CLI. Omit both fields for the historical software renderer. GPU identity and retained artifact hashes serve different purposes: cross-driver regeneration need not be pixel-identical.
|
|
28
30
|
|
|
29
|
-
Import saved SPZ and an optional approximate collider with `scene world import --input import.json --source-root <directory> --output-root artifacts/slopcamera/generated/<name> --json`. Declare exact payload hashes, stable IDs, scale, source up axis and uniform transform. Historical World Labs provenance remains supported for offline replay and requires the matching world ID, approximate collider and retained provider receipt. Import needs no provider credential; paid world-generation commands were removed from current source (they remain in the historical Atet v3.2.3 release). Keep all returned assets and the splat entity, and save the consuming scene JSON inside that import output directory so its asset paths resolve relative to the scene file. Metadata dependencies preserve provenance through source-gone replay. Do not invent scale or relabel a collider as verified physics. Use `three-spark-webgl2-hardware-v1` for non-AA SPZ v2/v3, perspective cameras and at most 500,000 splats across the rendered world. This profile renders beauty only; splat depth/ID products and interleaved transparent world surfaces are unsupported. Materials and internal objects inside a splat are not ordinary editable mesh parts.
|
|
31
|
+
Import saved SPZ and an optional approximate collider with `scene world import --input import.json --source-root <directory> --output-root artifacts/slopcamera/generated/<name> --json`. Declare exact payload hashes, stable IDs, scale, source up axis and uniform transform. An optional `providerMetadata` payload reference (for example a Marble `semantics_metadata` JSON export) surfaces recognized scale/ground/up-axis fields as an advisory `suggestedNormalization` in the output manifest; normalization still comes only from the explicit input fields. Historical World Labs provenance remains supported for offline replay and requires the matching world ID, approximate collider and retained provider receipt. Import needs no provider credential; paid world-generation commands were removed from current source (they remain in the historical Atet v3.2.3 release). Keep all returned assets and the splat entity, and save the consuming scene JSON inside that import output directory so its asset paths resolve relative to the scene file. Metadata dependencies preserve provenance through source-gone replay. Do not invent scale or relabel a collider as verified physics. Use `three-spark-webgl2-hardware-v1` for non-AA SPZ v2/v3, perspective cameras and at most 500,000 splats across the rendered world. This profile renders beauty only; splat depth/ID products and interleaved transparent world surfaces are unsupported. Materials and internal objects inside a splat are not ordinary editable mesh parts.
|
|
30
32
|
|
|
31
33
|
Keep receipts and the original run ID after interruption. Inspect `slopcamera runs` and reconcile the exact attempt instead of blindly repeating a possibly published operation. Candidate records preserve derivation and staleness; candidate selection does not yet replace authored footage in the V2 scene compositor. Interactive scene editing and portable simulation remain deferred; native Blender jobs retain their own simulation caches. Use the separate [directing workflow](directing-video.md) to generate and review short clips before assembling an ordinary media project.
|
|
32
34
|
|
|
33
35
|
|
|
36
|
+
## Direct cinematic worlds
|
|
37
|
+
|
|
38
|
+
A `slopcamera.spatial-direction` document describes beats, actions, camera coverage, and look intents semantically; its `projectDigest` must equal the scene's `sceneSha256` from `scene inspect`. Check it with `slopcamera scene direction check direction.json --scene scene.json --json`, compile proposals with `scene direction plan ... --camera <camera-id> --output plan.json`, and plan bounded variants with `scene direction gallery ... --axis performance|camera|lighting|materials|effects|sequence`. Compiled direction stays `verified: false` — it is review evidence, not applied state.
|
|
39
|
+
|
|
40
|
+
Bind declared effects through `scene effects plan` and `scene effects check` against the same scene, and bake planned simulation through `scene effects bake` when the plan calls for it. `scene temporal-audit` and `scene render-audit` report sampled evidence over explicit `--times-us` without inventing quality claims.
|
|
41
|
+
|
|
42
|
+
## Author character behaviors
|
|
43
|
+
|
|
44
|
+
A `slopcamera.spatial-behavior` document describes deterministic character behavior programs as ALGAL organism graphs — inert manifests of typed cells (`input`/`const`/`fn`/`repeat`/`each`/`organism` only for bake-safe behaviors), declared channels, scene binding, and explicit initial state. The organism closure is a content-addressed map of manifest digests to manifests; the `entry` field selects the top-level organism.
|
|
45
|
+
|
|
46
|
+
Check a behavior against a scene with `slopcamera scene behavior check behavior.json --scene scene.json --json`. The checker validates the organism closure (digest consistency, fn references against the admitted catalog, wiring, carry bindings, interface completeness, entity and range against the scene). Bake it with `slopcamera scene behavior bake behavior.json --scene scene.json --output bake.json --json`; the bake runs through the real ALGAL runtime and produces a deterministic emitted trace with a bound receipt. Plan seeded gallery variants with `slopcamera scene behavior gallery behavior.json --scene scene.json --json`. Audit a baked trace with `slopcamera scene behavior audit bake.json --json`; the audit reports state thrash, exact periodicity, dead channels, and unreachable states as advisory findings.
|
|
47
|
+
|
|
48
|
+
Four standard-library organisms are available for composition: locomotion FSM (`behavior.fsm.v1` — state machines with after/chance/flag/clear/always guards), expression layer (`behavior.expression.v1` — blink, gaze, mood), interaction sequence (`behavior.interact.v1` — phase sequencer with emit-on-entry), and a combined organism that merges all three via pairwise `emitted.append`. Each follows the `repeat`+`carry`+`window.advance` accumulation pattern. Use the stdlib organisms as templates; compose them into a behavior document with explicit initial states and scene-bound args.
|
|
49
|
+
|
|
50
|
+
The authoring loop: (1) assemble a behavior doc from stdlib organisms with scene-bound args, (2) check it with `scene behavior check`, (3) bake it with `scene behavior bake`, (4) audit the trace with `scene behavior audit`, (5) plan gallery variants and review. Identical behavior doc + seed + scene produce byte-identical bakes. The `seed` interface input auto-binds from `behavior.seed` for gallery diversity. A channel map (`--channel-map`) binds emitted channels to clip runs, attach/release pairs, or trajectory waypoints for performance directives. Behaviors never execute source, contact providers, or access the filesystem; organisms are data.
|
|
51
|
+
|
|
52
|
+
The `cinematic-world` built-in workflow composes exactly these operations for one admitted scene. Its input is an inert `slopcamera.spatial-recipe-pack` — one scene digest, one direction document, bounded gallery axes, up to 4 named preview render requests, optional declared effects, and optional temporal-audit inputs — wrapped with the scene document and its repository path. Plan it with `slopcamera workflows plan cinematic-world --input input.json --json`; run it with `workflows run`. The workflow never selects or promotes a candidate: registration uses `scene project add-candidate <project-id> --input <request.json>`, and selection uses `scene project select-candidate <project-id> --input <request.json>`, both after review. A recipe pack is data — it cannot register executors, source paths beyond the declared render source, permissions, secrets, or URLs.
|
|
53
|
+
|
|
34
54
|
## Direct short generated clips
|
|
35
55
|
|
|
36
56
|
Use [short-video directing](directing-video.md) for retained paid takes and accepted-shot assembly. Use the matching Slopcamera source build for those commands.
|
|
@@ -109,6 +109,12 @@ Never automatically retry an interrupted or failed paid generation. Slopcamera u
|
|
|
109
109
|
zero client retries because an ambiguous request may still have been charged.
|
|
110
110
|
Report the failure receipt and reconcile the exact attempt. A deliberate new paid command needs authority within the user’s budget; do not infer that an ambiguous failure was free.
|
|
111
111
|
|
|
112
|
+
When the request leaves alternatives open — texture maps, skyboxes,
|
|
113
|
+
backdrops, sprites, or competing design directions — prefer `slopcamera ai
|
|
114
|
+
image gallery`, which runs one tracked job per candidate and composes a
|
|
115
|
+
labelled contact sheet for one review pass. [Image galleries](image-galleries.md)
|
|
116
|
+
covers the candidate grammar, receipt, and explicit promotion steps.
|
|
117
|
+
|
|
112
118
|
## Finish the task
|
|
113
119
|
|
|
114
120
|
Report:
|
|
@@ -123,7 +129,9 @@ Report:
|
|
|
123
129
|
|
|
124
130
|
Use [directing video](directing-video.md) for budgeted takes, accepted predecessor frames and local recovery. URL-only models can use its explicit private Blob path; do not paste short-lived signed URLs into CLI arguments or project files. Blob charges and authority are separate from Gateway.
|
|
125
131
|
|
|
126
|
-
The small portable `slopcamera image generate '<prompt>' --output image.webp` command defaults to `recraft/recraft-v4.1-utility` and admits PNG/JPEG/WebP output. It is distinct from the local `ai` catalog workflow. Preserve literal prompts when requested, keep its output inside the intended workspace and never automatically retry a failed paid call.
|
|
132
|
+
The small portable `slopcamera image generate '<prompt>' --output image.webp` command defaults to `recraft/recraft-v4.1-utility` and admits PNG/JPEG/WebP output. It is distinct from the local `ai` catalog workflow. Preserve literal prompts when requested, keep its output inside the intended workspace and never automatically retry a failed paid call. Its sibling `slopcamera image gallery '<subject>' --output-dir <directory>` shares that bounded model contract and composes several candidates into one review sheet; see [image galleries](image-galleries.md).
|
|
133
|
+
|
|
134
|
+
For product identity SVGs, `slopcamera image icon '<subject>' --purpose <mark|illustration> --output icon.svg` is the canned pipeline. `mark` produces a compact favicon/app/header mark: one to three bold masses in one ink, gated for 16–32 px recognition and low path count. `illustration` (the compatibility default) produces the related marketing illustration: simple isometric structure in one ink, gated against hairlines, dense fills, and detail lost at 64 px. Both run one style-locked Gateway raster through ink normalization, local tracing, and deterministic geometry gates. `--rounds 2` (the default) adds a purpose-specific vision critique that revises the prompt between attempts; `--rounds 1` is a single paid generation with no critique call. `--ink` overrides the ink color and `--keep-raster` retains the normalized line-art PNG beside the SVG.
|
|
127
135
|
|
|
128
136
|
## Style recipes
|
|
129
137
|
|
|
@@ -132,3 +140,9 @@ vignette and typewriter notes on paper right), do not ask Gateway to redraw the
|
|
|
132
140
|
whole poster. Follow [rubber-stamp-field-notes.md](rubber-stamp-field-notes.md):
|
|
133
141
|
generate only the stamp with a reference-capable model, then assemble with the
|
|
134
142
|
local compositor.
|
|
143
|
+
|
|
144
|
+
For an editorial or social banner made from an opaque plate, transparent
|
|
145
|
+
characters, motif clusters, local type, annotations, and diagram clippings,
|
|
146
|
+
follow [social-collage-banners.md](social-collage-banners.md). Generate each
|
|
147
|
+
semantic role independently, inspect its pixels, and compose the selected files
|
|
148
|
+
with the packaged manifest-driven compositor.
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# Generate and review candidate galleries
|
|
2
|
+
|
|
3
|
+
Use an image gallery when a request leaves visual alternatives open: texture
|
|
4
|
+
maps, skyboxes and environment plates, backdrops, sprites, or competing design
|
|
5
|
+
directions. One command produces several bounded candidates in parallel,
|
|
6
|
+
composes a labelled contact sheet, and keeps every candidate independently
|
|
7
|
+
addressable with its exact prompt, digest, and provenance. Review the sheet
|
|
8
|
+
once, then promote the chosen candidate through an explicit authored step.
|
|
9
|
+
Generation never edits authored source or an existing project implicitly.
|
|
10
|
+
|
|
11
|
+
## Pick the gallery lane
|
|
12
|
+
|
|
13
|
+
Two commands share one planner and compositor:
|
|
14
|
+
|
|
15
|
+
```sh
|
|
16
|
+
# Portable: bounded file output, default utility model, still paid per candidate.
|
|
17
|
+
slopcamera image gallery 'weathered copper panel' \
|
|
18
|
+
--kind texture --output-dir review/copper --json
|
|
19
|
+
|
|
20
|
+
# Durable: one tracked Gateway job per candidate, catalog model required.
|
|
21
|
+
slopcamera ai image gallery 'weathered copper panel' \
|
|
22
|
+
--model <image-model-id> --kind texture --output-dir review/copper --json
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The portable lane writes candidate files, `gallery.png`, and `receipt.json`
|
|
26
|
+
into `--output-dir`. The durable lane additionally publishes each candidate
|
|
27
|
+
through the generated-artifact store beneath `artifacts/slopcamera/generated/`
|
|
28
|
+
with a retained job record per attempt, so interrupted or ambiguous paid work
|
|
29
|
+
stays reconcilable. Prefer the durable lane when provenance must survive the
|
|
30
|
+
invocation; both lanes are paid calls per candidate with zero client retries.
|
|
31
|
+
|
|
32
|
+
## Choose the kind
|
|
33
|
+
|
|
34
|
+
`--kind` selects the prompt contract and default aspect:
|
|
35
|
+
|
|
36
|
+
| Kind | Contract | Aspect |
|
|
37
|
+
| --- | --- | --- |
|
|
38
|
+
| `image` | Plain subject, clean composition | 1:1 |
|
|
39
|
+
| `texture` | Seamless tileable flat-lit surface | 1:1 |
|
|
40
|
+
| `skybox` | Equirectangular 360 panorama, centered horizon | 2:1 |
|
|
41
|
+
| `backdrop` | Scenic plate for compositing | 16:9 |
|
|
42
|
+
| `sprite` | One isolated subject on neutral background | 1:1 |
|
|
43
|
+
|
|
44
|
+
## Control the candidate set
|
|
45
|
+
|
|
46
|
+
- `--count <n>` renders the same kind contract `n` times (up to 16).
|
|
47
|
+
- `--vary 'axis[=v1,v2][;axis2...]'` takes the cartesian product of
|
|
48
|
+
`style`, `palette`, `material`, `lighting`, `mood`, and `detail` values.
|
|
49
|
+
Omit `=values` to use the kind-aware defaults, for example
|
|
50
|
+
`--vary 'style;lighting=golden hour,night'`.
|
|
51
|
+
- `--candidates <file.json>` supplies an explicit bounded list of
|
|
52
|
+
`{id, prompt|variant}` entries. `prompt` replaces the kind template
|
|
53
|
+
verbatim; `variant` appends one direction inside it.
|
|
54
|
+
- `--cell <n>` sets the square cell edge in pixels (64–1024, default 512).
|
|
55
|
+
|
|
56
|
+
`--candidates` is mutually exclusive with `--vary` and `--count`.
|
|
57
|
+
|
|
58
|
+
## See seams and applied renders, not flat pixels
|
|
59
|
+
|
|
60
|
+
`--kind texture` composites each cell as a 2×2 tiled repeat so tiling seams
|
|
61
|
+
are visible in the sheet itself; `--no-tile` keeps a flat cell, and `--tile`
|
|
62
|
+
opts other kinds in. `--tile` and `--no-tile` are mutually exclusive, and
|
|
63
|
+
receipt rows carry `tiled: true`.
|
|
64
|
+
|
|
65
|
+
On the durable lane, `--preview probe` renders each settled candidate inside a
|
|
66
|
+
fixed checked-in probe scene — a texture becomes the material map on lit
|
|
67
|
+
geometry plus four adjacent wall tiles that expose seams, a skybox becomes the
|
|
68
|
+
scene environment lighting a reflective sphere, a backdrop becomes a surface
|
|
69
|
+
behind a lit subject — and the cell shows the rendered still:
|
|
70
|
+
|
|
71
|
+
```sh
|
|
72
|
+
slopcamera ai image gallery 'weathered copper panel' \
|
|
73
|
+
--model <image-model-id> --kind texture --preview probe \
|
|
74
|
+
--output-dir review/copper --json
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
`--preview probe` is valid only for `texture`, `skybox`, and `backdrop`. The
|
|
78
|
+
receipt row keeps the generated candidate `path`/`sha256` and the rendered
|
|
79
|
+
`cellImage` `path`/`sha256` as separate fields — promotion always targets the
|
|
80
|
+
candidate, never the still. A failed render leaves the flat candidate in the
|
|
81
|
+
sheet with a warning.
|
|
82
|
+
|
|
83
|
+
## Review whole-scene variants
|
|
84
|
+
|
|
85
|
+
`slopcamera ai scene gallery` renders a base scene's bounded typed variants —
|
|
86
|
+
environment swaps, material changes, palette or transform axes expressed as
|
|
87
|
+
`slopcamera.spatial-scene-patch` operations — into the same kind of labelled
|
|
88
|
+
contact sheet, with no paid calls:
|
|
89
|
+
|
|
90
|
+
```sh
|
|
91
|
+
slopcamera ai scene gallery scene.json \
|
|
92
|
+
--variants gallery.variants.json --output-dir review/world --json
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
```json
|
|
96
|
+
{ "kind": "slopcamera.scene-variants", "schemaVersion": 1,
|
|
97
|
+
"variants": [
|
|
98
|
+
{ "id": "dusk", "label": "Dusk",
|
|
99
|
+
"patch": { "kind": "slopcamera.spatial-scene-patch", "schemaVersion": 1,
|
|
100
|
+
"operations": [{ "kind": "set-color", "entityId": "entity_sky_dome", "color": "#2a1e4f" }] } }
|
|
101
|
+
] }
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Each variant's `expectedSceneSha256` is optional and defaults to the base
|
|
105
|
+
digest; a mismatched value fails before any render. Every derived scene is
|
|
106
|
+
published at `variants/<id>/scene.json` under the output directory with its
|
|
107
|
+
asset payloads staged alongside — inherited payload paths resolve beside the
|
|
108
|
+
authored scene, variant-authored `add-asset`/`replace-asset` payload paths
|
|
109
|
+
resolve beside the variants file — so the derived scene re-renders
|
|
110
|
+
standalone. The receipt keeps the base digest, per-variant patch and derived
|
|
111
|
+
scene digests, the rendered still digest, and the render receipt path per row;
|
|
112
|
+
a failed render stays in the sheet as a failed row. `--camera` selects a scene
|
|
113
|
+
camera, `--time-us` picks the frame, `--cell` sizes cells.
|
|
114
|
+
|
|
115
|
+
## Review the sheet
|
|
116
|
+
|
|
117
|
+
Inspect `gallery.png` directly. Each cell carries a `#<index> <id>` label; a
|
|
118
|
+
failed candidate stays in the sheet as a dark cell marked `failed` so the
|
|
119
|
+
review covers the whole requested set. `receipt.json` rows map every index to
|
|
120
|
+
its path, SHA-256, media type, request ID, cell geometry, and — on the durable
|
|
121
|
+
lane — its job record path.
|
|
122
|
+
|
|
123
|
+
## Promote a selected candidate explicitly
|
|
124
|
+
|
|
125
|
+
A gallery never applies itself. After selecting a cell, use that candidate's
|
|
126
|
+
own path and digest. For a scene material or environment, declare the image
|
|
127
|
+
as an asset and apply it through one `scene patch` carrying the current
|
|
128
|
+
`expectedSceneSha256`:
|
|
129
|
+
|
|
130
|
+
```json
|
|
131
|
+
{ "kind": "add-asset", "asset": {
|
|
132
|
+
"assetId": "asset_copper",
|
|
133
|
+
"payload": { "path": "<candidate path relative to the scene file>", "sha256": "<receipt sha256>", "bytes": <n> },
|
|
134
|
+
"interpretation": { "kind": "image", "width": <w>, "height": <h>, "colorSpace": "srgb", "alpha": "opaque", "mimeType": "image/png" },
|
|
135
|
+
"dependencies": [],
|
|
136
|
+
"provenance": { "source": "generated", "description": "Gallery candidate copper-weathered", "receiptSha256": "<receipt.json sha256>" } } },
|
|
137
|
+
{ "kind": "set-material", "entityId": "entity_pedestal",
|
|
138
|
+
"material": { "kind": "standard", "color": "#ffffff", "opacity": 1, "roughness": 0.7, "metalness": 0.8, "map": "asset_copper" } }
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
`material.map` applies to authored procedural geometry only, and scene image
|
|
142
|
+
assets admit PNG/JPEG/SVG payloads. For a selected skybox, `add-entity` a
|
|
143
|
+
`kind: "environment"` entity referencing the image asset with
|
|
144
|
+
`role: "background" | "environment" | "both"` and a bounded `intensity`; at
|
|
145
|
+
most one visible environment entity may appear in a frame, so gate alternates
|
|
146
|
+
through authored `visible` flags. Keep the scene file where its asset paths
|
|
147
|
+
resolve, the same rule as world imports.
|
|
148
|
+
|
|
149
|
+
Outside scenes, promote by pointing the consuming step at the exact retained
|
|
150
|
+
path — a video `project add`, a design slot, or an `image vectorize` input —
|
|
151
|
+
never by copying bytes into an authored path implicitly.
|
|
152
|
+
|
|
153
|
+
For a scene-variant gallery, promotion is adopting the variant: apply the
|
|
154
|
+
selected patch from the variants file through `scene patch` (the receipt row
|
|
155
|
+
keeps its digest), or move the derived `variants/<id>/scene.json` — with its
|
|
156
|
+
staged payloads — to its permanent home. The authored base scene is never
|
|
157
|
+
edited by the gallery.
|
|
158
|
+
|
|
159
|
+
## Preserve failures and outputs
|
|
160
|
+
|
|
161
|
+
Gallery publication is no-replace: an existing `gallery.png` or
|
|
162
|
+
`receipt.json` in the output directory fails the command before any paid
|
|
163
|
+
dispatch. A failed candidate never retries inside the run; reconcile its
|
|
164
|
+
retained job record or receipt row before deciding a new paid command is
|
|
165
|
+
authorized. If every candidate fails, the labelled sheet and receipt are
|
|
166
|
+
still retained and the command reports `GENERATION_FAILED`.
|
|
@@ -14,7 +14,7 @@ command -v slopcamera
|
|
|
14
14
|
|
|
15
15
|
A restricted shell can omit package-manager paths. Check known host installation paths before declaring a tool unavailable. If Bun is genuinely absent, follow its official [installation guide](https://bun.sh/docs/installation) within the user’s authorized setup scope. Do not switch package managers or pipe an unreviewed installer into a shell.
|
|
16
16
|
|
|
17
|
-
Slopcamera installs from its verified release archive: `bun add --global https://github.com/hraness/slopcamera/releases/download/v3.2.
|
|
17
|
+
Slopcamera installs from its verified release archive: `bun add --global https://github.com/hraness/slopcamera/releases/download/v3.2.8/hraness-slopcamera-3.2.8.tgz`, then `slopcamera doctor --json`. Building from source is the contributor path. Historical Atet archives do not install the renamed CLI; never substitute `slopcamera` into an old archive URL.
|
|
18
18
|
|
|
19
19
|
Use an existing compatible source build when available. Otherwise follow the [complete source-install guide](https://github.com/hraness/slopcamera/blob/main/docs/how-to/use-current-source.md): clone into a new directory, record its exact commit, install locked dependencies without lifecycle scripts, build the SDK and source CLI, then define the shell command against that checkout. A clone or skill installation alone does not install the executable. Do not alter an existing active checkout to satisfy this path.
|
|
20
20
|
|
|
@@ -51,7 +51,7 @@ slopcamera skill path
|
|
|
51
51
|
## Add only required optional tools
|
|
52
52
|
|
|
53
53
|
Treat `slopcamera doctor --json` as the readiness report. Install FFmpeg, a supported
|
|
54
|
-
browser, native capture support, VTracer,
|
|
54
|
+
browser, native capture support, VTracer, or another optional
|
|
55
55
|
dependency only when the requested workflow needs it and the user has
|
|
56
56
|
authorized that machine change. Slopcamera obtains its checksum-pinned VTracer on
|
|
57
57
|
first vectorization use; do not replace that path with an unverified binary.
|
|
@@ -95,10 +95,27 @@ Maintain multisample antialiasing on the scene render target if adding
|
|
|
95
95
|
post-processing. Bound draw calls, geometry, and shader work, and validate frame
|
|
96
96
|
zero before a full render.
|
|
97
97
|
|
|
98
|
+
Set `audio.reactivity` to `{ "profile": "bands-v1" }` when local lights or
|
|
99
|
+
materials should follow separate bass, midrange, treble, and overall-energy
|
|
100
|
+
envelopes. Slopcamera derives these bands offline from the verified soundtrack
|
|
101
|
+
(35–180 Hz, 180–2,000 Hz, 2,000–12,000 Hz), smooths them, and retains a
|
|
102
|
+
hash-bound 60 Hz JSON resource named `audio-reactivity`. Load that resource once
|
|
103
|
+
with `SlopcameraOverlay.asset("audio-reactivity")`, pass its JSON to
|
|
104
|
+
`SlopcameraOverlay.prepareAudioReactivity`, and sample by integer microseconds
|
|
105
|
+
inside `onFrame`. The profile is limited to ten minutes and returns zero outside
|
|
106
|
+
its analyzed range. It is an envelope for animation, not a flash-safety
|
|
107
|
+
certificate.
|
|
108
|
+
|
|
98
109
|
Smooth effects are not a seizure-safety certificate. The timing and pulse helpers
|
|
99
110
|
do not analyze rendered flashes or certify safety. Review the actual result and
|
|
100
111
|
avoid claiming a safety guarantee.
|
|
101
112
|
|
|
113
|
+
For emissive trails and communication ribbons, discard inactive fragments before
|
|
114
|
+
computing color, clamp nonnegative bases before fractional `pow`, and handle
|
|
115
|
+
degenerate segment vectors. Review native lossless frames when a glow appears as
|
|
116
|
+
a block or stripe. Small diagnostics should use area averaging; ordinary video
|
|
117
|
+
resampling can turn legitimate dark shadows into black samples.
|
|
118
|
+
|
|
102
119
|
## Validate, render, and review
|
|
103
120
|
|
|
104
121
|
```sh
|
|
@@ -116,9 +133,12 @@ Use returned `output.path`, `receipt.path`, `source.path`, `projectId`, and
|
|
|
116
133
|
`projectPath`. Artifact paths are relative to the workspace root. The retained
|
|
117
134
|
job includes original HTML, declared resources, original music when supplied,
|
|
118
135
|
source and render receipts, lossless RGB `scene.mp4`, and delivery `video.mp4`.
|
|
119
|
-
The delivery is H.264 with optional 48 kHz stereo AAC at 320 kb/s.
|
|
120
|
-
|
|
121
|
-
|
|
136
|
+
The delivery is H.264 with optional 48 kHz stereo AAC at 320 kb/s. Both generated
|
|
137
|
+
media files use the 512 MiB local media bound. The scene intermediate is checked
|
|
138
|
+
for its complete declared frame count before retention; when the bound truncates
|
|
139
|
+
it, the command reports an actionable bounded-render error and suggests lowering
|
|
140
|
+
the canvas, frame rate, or duration. Its ordinary project keeps the scene video
|
|
141
|
+
and original music separate. Input files remain unchanged.
|
|
122
142
|
|
|
123
143
|
The returned `source.path` identifies a reusable `source.json` request with the
|
|
124
144
|
original canvas, frame rate, timing, seed, parameters, and other render settings.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Build a revisable parametric design
|
|
2
|
+
|
|
3
|
+
Use current source and `slopcamera scene design` for dimensions, repeated architectural parts, furniture, pavilions and façades that must regenerate from retained rules. This is a local mesh-design workflow; Rhino, Grasshopper and native engine execution are separate tools.
|
|
4
|
+
|
|
5
|
+
1. Discover original studies with `slopcamera scene design catalog --json`. Start with `scene design init <new-directory> --template crescent-pavilion|spiral-stair|ribbed-tower|modular-bookshelf`.
|
|
6
|
+
2. Read the emitted `design.json` and inspect it with `scene design inspect`. Describe the user's intended shape in named parameters, derived scalar values, constraints and semantic geometry stages. Keep references to engineering knowledge separate from visual references. Do not infer structural validation from appearance.
|
|
7
|
+
3. Save an explicit numeric values object and use `scene design set <design.json> --parameters <values.json> --output <new-design.json>` to preserve revisions. A dimensional change should update dependent members and details together.
|
|
8
|
+
4. Compile with `scene design compile <design.json> --scene <base.scene.json> --output-dir <new-bundle> --json`. Pass the starter's staging scene for cameras and lights, or a previous compiled scene to preserve supported generated-part overrides. Retain design, scene, exact asset bytes and receipt together.
|
|
9
|
+
5. Render `scene render <bundle/scene.json> --request <bundle/render.json> --json`. Review hero pixels, then use `camera_detail` and `camera_plan` to inspect repeated members, joints, silhouette and framing. Geometry compilation does not prove visual quality.
|
|
10
|
+
6. For alternatives, use `scene design gallery` with a bounded `slopcamera.spatial-design-variants` document. It emits up to six complete models; render the candidates through the same camera before selecting one. It makes no paid calls and does not upload source.
|
|
11
|
+
|
|
12
|
+
Place generated bundles below `artifacts/slopcamera/generated/`. Existing files conflict. An interrupted bundle without its final receipt is incomplete; inspect it and choose a fresh destination. The design compiler never executes source text. For native CAD operations or Blender/Cycles production shading, retain a native-studio source and use the explicit trusted-code workflow in [native studio](native-studio.md).
|
|
13
|
+
|
|
14
|
+
Detailed contracts and checked commands: [design reference](https://github.com/hraness/slopcamera/blob/main/docs/parametric-design.md) and [design guide](https://github.com/hraness/slopcamera/blob/main/docs/how-to/parametric-design.md). The portable SDK exports the design compiler and starter catalog from `@hraness/slopcamera/code`; file publication and rendering belong to the CLI.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Reference-led Three.js and metallic treatments
|
|
2
2
|
|
|
3
3
|
Use this guide only when Slopcamera's complete local Code Mode host is available.
|
|
4
|
-
It ships in this repository alongside the
|
|
4
|
+
It ships in this repository alongside the local CLI host and optional unbundled menu-bar companion. The
|
|
5
5
|
portable `@hraness/slopcamera/code` and `@hraness/slopcamera/workflow`
|
|
6
6
|
entrypoints intentionally expose no HTML renderer, Three.js operation, or
|
|
7
7
|
arbitrary source execution. Those capabilities belong to the local host.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Build scenes from code
|
|
2
|
+
|
|
3
|
+
Prefer helpers over hand-written scene JSON. The `@hraness/slopcamera/code` export ships pure builders in `spatial-scene/build` that return validated v1 scene data; feed their output into entities, transforms, and animation channels, then parse the whole scene before writing it. Helpers never read files, execute source, or touch a renderer, and every result already satisfies the contract schemas. Use [directed scenes](directed-scenes.md) for rendering, patching, and project commands.
|
|
4
|
+
|
|
5
|
+
## Camera and animation helpers
|
|
6
|
+
|
|
7
|
+
- `perspectiveFromFov({fovDeg, width, height, near, far})` → calibrated projection. `fovDeg` is the horizontal field of view.
|
|
8
|
+
- `lookAtPose(position, target)` → camera pose facing local −Z at the target.
|
|
9
|
+
- `frameFitPose(bounds, projection, margin)` → pose framing authored or admitted bounds.
|
|
10
|
+
- `easeKeys({from, to, durationUs, easing})` → dense keys for `linear`, `ease-in`, `ease-out`, or `ease-in-out`; `easeChannel({channelId, targetId, property, ...})` wraps them into a ready animation channel. Baked keys stay small: about 25 per 4-second span.
|
|
11
|
+
- `orbitKeys({center, radius, durationUs, ...})` → paired position and look-at rotation keys for a turntable.
|
|
12
|
+
|
|
13
|
+
## Layout and placement helpers
|
|
14
|
+
|
|
15
|
+
- `align(items, axis, edge)`, `distribute(items, axis, {gap}|{span})`, `row`, `column`, `stack` order existing entities by their transforms and optional bounds.
|
|
16
|
+
- `grid({rows, columns, cellSize, origin?})` → ground-plane cell positions; `scatter({seed, count, region, minSpacing?})` → deterministic seeded XZ positions.
|
|
17
|
+
- `groundSnap(transform, halfHeight, floorY)`, `onTopOf(moverBounds, moverTransform, targetBounds, targetTransform)`, `nextTo(...)`, `facing(transform, target)` resolve relations to concrete transforms immediately. They need bounds — primitives have them; GLB and splat bounds come from `scene asset admit` output or an explicit `--asset-bounds` map.
|
|
18
|
+
|
|
19
|
+
## The create → audit → patch loop
|
|
20
|
+
|
|
21
|
+
1. Build or generate the scene JSON.
|
|
22
|
+
2. `slopcamera scene audit scene.json --camera camera_hero --json` samples evaluated geometry across the duration and reports per-entity frustum state, projected pixel footprint, and findings such as off-camera or never-visible entities. `--times-us` picks explicit samples; `--asset-bounds bounds.json` supplies decoded asset enclosures as a bounds map, an admission document, a `{manifest, facts}` pair, or an array of those.
|
|
23
|
+
3. Fix with a typed `scene patch` carrying `expectedSceneSha256`, or regenerate. `slopcamera scene diff before.json after.json --json` shows the exact structural difference a patch produced.
|
|
24
|
+
4. Re-audit, then verify pixels with `slopcamera scene render-audit scene.json --camera camera_hero --json` — it renders the real object-ID pass in the bound browser runtime at each sampled time and counts attributed pixels per entity, catching occlusion and never-rendered cases geometric audit cannot see. Splats and camera-bound view surfaces report honestly as unsupported or non-attributable rather than estimated. Neither audit tier inspects beauty output — materials, textures, text layout, and splat internals still need rendered-frame inspection.
|
|
25
|
+
|
|
26
|
+
## Generate procedural scenes
|
|
27
|
+
|
|
28
|
+
`slopcamera scene generate --module <file.ts> --generator-id <id> --output scene.json --json` runs a trusted TypeScript module at authoring time — the same trust class as an explicitly imported workflow module, with no sandbox. See `examples/scene-generators/grid-city.ts` for the shape: the module exports `generate(ctx)` returning `{entities, editableKeys?}`; entities carry a caller `key` and never `entityId` or `origin`, which the host stamps from the generator identity. Draw randomness only from `ctx.seed`; an identical run must reproduce identical output, and the retained record pins source, parameters, seed, and output digests. Use `ctx.lib.entityId(key)` to parent entities inside one output. `--parameters` accepts a bounded JSON object; `--into scene.json` regenerates one generator's output while preserving authored entities, other generators, and declared overrides. Transitive relative `.ts`/`.js`/`.json` imports inside the module's own directory are allowed and hashed into the retained closure digest; absolute or escaping specifiers, symlinks, `require()`, and dynamic `import()` are rejected. Asset references are rejected in this version.
|
|
29
|
+
|
|
30
|
+
## Admit a local glTF asset
|
|
31
|
+
|
|
32
|
+
`slopcamera scene asset admit model.glb --source-root <dir> --output manifest.json --json` validates a local GLB 2.0 against the closed profile, stores it content-addressed, derives model-space and scene-space bounds into a sibling facts manifest, and emits the mesh entity plus ready `add-asset`/`add-entity` patch operations. The source path must stay inside `--source-root`; unsupported GLB features reject rather than degrade. Apply the returned operations through `scene patch`, then feed the admission document itself to `scene audit --asset-bounds`.
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
# Compose a social collage banner
|
|
2
|
+
|
|
3
|
+
Use this workflow for an editorial or social banner built from several generated visual roles, local labels, annotations, and optional diagram material. Generate the parts independently, inspect them, then assemble the selected files with the packaged local compositor. Do not ask one model call to render the final banner or important text.
|
|
4
|
+
|
|
5
|
+
## Fix the delivery frame first
|
|
6
|
+
|
|
7
|
+
Record the exact output geometry before prompting. For an X profile header, use `1500×500` unless the user or current platform tooling supplies another target. Keep important faces and title copy away from the lower-left profile-photo overlap and the outer crop margins.
|
|
8
|
+
|
|
9
|
+
Split the brief into visual roles rather than requesting several complete banners:
|
|
10
|
+
|
|
11
|
+
- one opaque background plate that establishes place, lighting, and atmosphere;
|
|
12
|
+
- one or more isolated subjects on transparent backgrounds;
|
|
13
|
+
- one motif cluster for secondary concepts;
|
|
14
|
+
- optional editable diagrams for literal values and relationships;
|
|
15
|
+
- local title, labels, circles, arrows, tape, grain, and vignette.
|
|
16
|
+
|
|
17
|
+
A role prompt should describe only that asset. Tell an isolated-asset model that the output needs a fully transparent background and no words, letters, or logos. Tell a background model to omit people when a separate character layer will cover it. This reduces accidental text, duplicate subjects, and baked-in composition decisions.
|
|
18
|
+
|
|
19
|
+
## Discover the model and controls
|
|
20
|
+
|
|
21
|
+
Inspect the current image catalog and selected model instead of naming a remembered “latest” model:
|
|
22
|
+
|
|
23
|
+
```sh
|
|
24
|
+
slopcamera ai models list --type image --json
|
|
25
|
+
slopcamera ai models show <image-model-id> --json
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Check that the model reports image output, the intended size or aspect control, and provider options for transparent PNG output before relying on them. Keep provider options in a private physical file because the same surface may contain sensitive values:
|
|
29
|
+
|
|
30
|
+
```sh
|
|
31
|
+
cat > transparent-provider-options.json <<'JSON'
|
|
32
|
+
{
|
|
33
|
+
"openai": {
|
|
34
|
+
"background": "transparent",
|
|
35
|
+
"outputFormat": "png",
|
|
36
|
+
"quality": "high"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
JSON
|
|
40
|
+
chmod 600 transparent-provider-options.json
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
That object is an example for a compatible OpenAI image model, not a portable option set. Use only namespaces and fields reported for the selected model. An opaque background plate normally needs a separate options file without `background: "transparent"`.
|
|
44
|
+
|
|
45
|
+
## Generate independent roles in parallel
|
|
46
|
+
|
|
47
|
+
Write one prompt file per role and retain it beside the collage manifest. Start independent text-only generations concurrently when the agent host supports parallel tool calls. Each command remains one durable paid job with its own output and receipt:
|
|
48
|
+
|
|
49
|
+
```sh
|
|
50
|
+
vercel env run -- bun "$SLOPCAMERA_SOURCE_ROOT/apps/desktop/dist/cli/main.js" ai image generate \
|
|
51
|
+
--model <image-model-id> \
|
|
52
|
+
--prompt-file prompts/background.txt \
|
|
53
|
+
--size 1536x1024 \
|
|
54
|
+
--provider-options opaque-provider-options.json \
|
|
55
|
+
--json
|
|
56
|
+
|
|
57
|
+
vercel env run -- bun "$SLOPCAMERA_SOURCE_ROOT/apps/desktop/dist/cli/main.js" ai image generate \
|
|
58
|
+
--model <image-model-id> \
|
|
59
|
+
--prompt-file prompts/character-sticker.txt \
|
|
60
|
+
--size 1024x1024 \
|
|
61
|
+
--provider-options transparent-provider-options.json \
|
|
62
|
+
--json
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Do not hide several semantic roles in `--count`; they need separate prompts and retained requests. Use an [image gallery](image-galleries.md) when a role needs competing visual alternatives. Text-only generation does not authorize uploading local media. If a role needs a local reference, name that exact file and add `--allow-cloud-upload` only when the task already authorizes its upload.
|
|
66
|
+
|
|
67
|
+
Inspect every candidate before composition. Check background alpha for isolated layers, accidental writing, duplicated limbs or objects, clipped silhouettes, and whether the visual metaphor still reads at banner size. A successful receipt does not establish those facts.
|
|
68
|
+
|
|
69
|
+
## Render literal facts as an editable diagram
|
|
70
|
+
|
|
71
|
+
Use a Slopcamera diagram when the banner needs a pipeline, architecture, values, or named relationships. Keep its `.diagram.json` source and render the PNG locally:
|
|
72
|
+
|
|
73
|
+
```sh
|
|
74
|
+
slopcamera diagram check work/token-flow.diagram.json --strict
|
|
75
|
+
slopcamera diagram render work/token-flow.diagram.json
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Place that PNG as a `paper` image layer. The diagram remains editable and factual while the surrounding composition can stay loose and expressive.
|
|
79
|
+
|
|
80
|
+
## Author the collage manifest
|
|
81
|
+
|
|
82
|
+
The packaged compositor accepts local PNG, JPEG, and WebP inputs. Paths are relative to the manifest unless absolute. Every `x` and `y` identifies the layer center. Array order is back-to-front.
|
|
83
|
+
|
|
84
|
+
```json
|
|
85
|
+
{
|
|
86
|
+
"schemaVersion": 1,
|
|
87
|
+
"canvas": {
|
|
88
|
+
"width": 1500,
|
|
89
|
+
"height": 500,
|
|
90
|
+
"color": "#100a1c",
|
|
91
|
+
"background": {
|
|
92
|
+
"path": "../generated/background.png",
|
|
93
|
+
"position": "centre"
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
"layers": [
|
|
97
|
+
{
|
|
98
|
+
"kind": "image",
|
|
99
|
+
"path": "../generated/character.png",
|
|
100
|
+
"x": 255,
|
|
101
|
+
"y": 258,
|
|
102
|
+
"width": 330,
|
|
103
|
+
"rotation": -4,
|
|
104
|
+
"treatment": {
|
|
105
|
+
"kind": "sticker",
|
|
106
|
+
"border": 12,
|
|
107
|
+
"borderColor": "#ffffff",
|
|
108
|
+
"shadow": { "dx": 10, "dy": 14, "blur": 14, "opacity": 0.5 }
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"kind": "image",
|
|
113
|
+
"path": "token-flow.light.png",
|
|
114
|
+
"x": 760,
|
|
115
|
+
"y": 430,
|
|
116
|
+
"width": 850,
|
|
117
|
+
"rotation": -1.5,
|
|
118
|
+
"treatment": {
|
|
119
|
+
"kind": "paper",
|
|
120
|
+
"padding": 26,
|
|
121
|
+
"color": "#faf5e8"
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"kind": "tape",
|
|
126
|
+
"x": 430,
|
|
127
|
+
"y": 325,
|
|
128
|
+
"width": 120,
|
|
129
|
+
"height": 38,
|
|
130
|
+
"rotation": -38,
|
|
131
|
+
"color": "#f8ebaa",
|
|
132
|
+
"opacity": 0.82
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"kind": "text",
|
|
136
|
+
"text": "275B TOKENS",
|
|
137
|
+
"x": 760,
|
|
138
|
+
"y": 64,
|
|
139
|
+
"fontSize": 58,
|
|
140
|
+
"fontFamily": "sans",
|
|
141
|
+
"fontWeight": 900,
|
|
142
|
+
"fill": "#ffe05a",
|
|
143
|
+
"stroke": "#3c1450",
|
|
144
|
+
"strokeWidth": 4,
|
|
145
|
+
"rotation": 1
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"kind": "ellipse",
|
|
149
|
+
"x": 1210,
|
|
150
|
+
"y": 250,
|
|
151
|
+
"width": 350,
|
|
152
|
+
"height": 330,
|
|
153
|
+
"rotation": -5,
|
|
154
|
+
"color": "#ff5048",
|
|
155
|
+
"strokeWidth": 8
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
"kind": "arrow",
|
|
159
|
+
"from": { "x": 1080, "y": 130 },
|
|
160
|
+
"to": { "x": 1150, "y": 180 },
|
|
161
|
+
"bend": 0.25,
|
|
162
|
+
"color": "#ff5048",
|
|
163
|
+
"width": 8
|
|
164
|
+
}
|
|
165
|
+
],
|
|
166
|
+
"effects": {
|
|
167
|
+
"grain": 0.18,
|
|
168
|
+
"grainSeed": 7,
|
|
169
|
+
"vignette": 0.35,
|
|
170
|
+
"chromaticShift": 2
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Image treatments are `plain`, `sticker`, and `paper`. Text supports `sans`, `serif`, and `mono`, newline-separated rows, fill, stroke, weight, alignment, and rotation. Annotation layers are `arrow`, `ellipse`, and `tape`. The compositor bounds canvas size, input bytes, decoded pixels, layer count, text, geometry, and effects; it rejects remote URLs and never replaces an existing output.
|
|
176
|
+
|
|
177
|
+
Render through the version-matched packaged skill:
|
|
178
|
+
|
|
179
|
+
```sh
|
|
180
|
+
skill_root="$(slopcamera skill path)"
|
|
181
|
+
bun "$skill_root/scripts/compose-social-collage-banner.ts" \
|
|
182
|
+
--manifest /absolute/banner.manifest.json \
|
|
183
|
+
--output /absolute/banner-v1.png
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
The command writes the PNG and a same-stem `.receipt.json` containing the manifest digest, exact input paths and digests, output digest, canvas, and layer count. Save a new manifest or output name for each material revision.
|
|
187
|
+
|
|
188
|
+
## Inspect the delivered pixels
|
|
189
|
+
|
|
190
|
+
Open the final PNG and inspect it at full size. Also inspect crops around the title, faces, high-contrast annotations, paper edges, and each platform exclusion zone. Confirm:
|
|
191
|
+
|
|
192
|
+
- the file has the exact requested dimensions;
|
|
193
|
+
- text is local, legible, and free of missing-glyph boxes;
|
|
194
|
+
- transparent assets have no opaque square or dark fringe;
|
|
195
|
+
- paper clippings and tape stay behind labels that must remain readable;
|
|
196
|
+
- chromatic shift and grain do not damage small text;
|
|
197
|
+
- factual diagram labels remain accurate;
|
|
198
|
+
- the composition still reads when scaled down.
|
|
199
|
+
|
|
200
|
+
Keep the prompt files, provider-option digests, generated receipts, diagram source, collage manifest, compositor receipt, and rejected attempts that explain a selection or recovery.
|
|
201
|
+
|
|
202
|
+
## Recover paid failures deliberately
|
|
203
|
+
|
|
204
|
+
Run each paid command with zero client retries. If a generation fails or is interrupted, inspect its retained job path and reconciliation state before doing anything else. Do not automatically resubmit an ambiguous attempt. A deliberate replacement call is appropriate only after reconciliation and within the task's existing spending authority. The local compositor is deterministic and unpaid, so layout revisions should happen there rather than through more model calls.
|