@forgeax/game 0.2.4 → 0.3.0

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 CHANGED
@@ -1,252 +1,231 @@
1
1
  # `@forgeax/game`
2
2
 
3
3
  [![npm](https://img.shields.io/npm/v/@forgeax/game?label=npm)](https://www.npmjs.com/package/@forgeax/game)
4
- [![Node](https://img.shields.io/badge/node-%3E%3D18-339933?logo=node.js&logoColor=white)](./package.json)
5
- [![MCP](https://img.shields.io/badge/MCP-stdio-6f42c1)](https://modelcontextprotocol.io/)
4
+ [![Node](https://img.shields.io/badge/node-%3E%3D22.13-339933?logo=node.js&logoColor=white)](./package.json)
5
+ [![MCP](https://img.shields.io/badge/MCP-stdio%20%7C%20streamable--http-6f42c1)](https://modelcontextprotocol.io/)
6
6
 
7
- ForgeaX game development as a self-contained plugin for MCP-capable agent clients.
8
- One executable provides both surfaces:
9
-
10
- - `forgeax-game` with no arguments runs the stdio MCP server.
11
- - `forgeax-game <command>` performs one-time setup and project operations.
12
-
13
- The package has one exact runtime dependency, `@forgeax/game-runtime@0.3.33`, and
14
- externalizes it from the Game bundle.
7
+ Two-command MCP/CLI onboarding for ForgeaX Engine games. The Game Plugin delegates
8
+ creation, build, and Preview to the exact Engine SDK instead of carrying a second
9
+ runtime.
15
10
 
16
11
  > [!IMPORTANT]
17
- > The normal user path does **not** require a ForgeaX source checkout, Bun workspace,
18
- > or a manually started Studio. The plugin installs the matching Skill and obtains a
19
- > versioned ForgeaX Runtime artifact on first use, then builds and serves a static game
20
- > preview itself. `FORGEAX_START_COMMAND` is an advanced override for private or
21
- > development deployments only.
12
+ > The published package carries `forgeax-game` and scoped `game` binary aliases and resolves the exact
13
+ > `@forgeax/engine-sdk@0.1.7` and `pnpm@11.7.0` dependencies. It has no
14
+ > `@forgeax/game-runtime` dependency and no static Preview fallback.
15
+
16
+ ## Supported flow
17
+
18
+ ```mermaid
19
+ flowchart LR
20
+ INSTALL["npx -y @forgeax/game install --ide codex,cursor,claude"] --> HOSTS["Agent MCP entries"]
21
+ INIT["npx -y @forgeax/game init"] --> GAME["Engine game in current directory"]
22
+ CARRIER["Exact npm SDK carrier"] --> GAME
23
+ PLUGIN["@forgeax/game"] --> INSTALL
24
+ PLUGIN --> INIT
25
+ GAME --> BUILD["Exact Engine CLI build --json"]
26
+ BUILD --> PREVIEW["Exact Engine CLI preview --json"]
27
+ PREVIEW --> PROOF["Release-aware readiness proof"]
28
+ ```
22
29
 
23
- ## Install
30
+ `install` verifies the unbound package identity before changing any Agent config.
31
+ `init` creates the default empty game in a genuinely blank current directory through
32
+ the exact Engine carrier, then binds routing and host skills. The connector never asks
33
+ users to download an SDK, unpack a carrier, run a third Engine command, or set a
34
+ mutable SDK path/environment override.
24
35
 
25
- ### New client setup
36
+ ## Two-command onboarding
26
37
 
27
- Run this once per machine to add the ForgeaX MCP server to the selected agent client.
38
+ Requirements: Node.js `>=22.13.0` and a genuinely blank target directory for `init`.
39
+ The exact package and Engine carrier are resolved by npm and the Game Plugin.
28
40
 
29
41
  ```bash
30
42
  npx -y @forgeax/game install --ide codex,cursor,claude
43
+ cd ./empty-game-directory
44
+ npx -y @forgeax/game init
31
45
  ```
32
46
 
33
- For ZCode, use `--ide zcode`; this writes its native user configuration to
34
- `~/.zcode/cli/config.json` and can run from any directory:
47
+ The first command writes only the `forgeax` MCP member in the canonical Codex,
48
+ Cursor, and Claude Code user configs. It preserves unrelated bytes and values,
49
+ reports `CURRENT` on an idempotent rerun, and says which host must restart or reload.
50
+ The second command must run from the intended blank directory. It creates the Engine
51
+ game there, binds the exact release identity, and reports the canonical root and
52
+ host-skill result. Existing exact games are read back and bound without recreation;
53
+ unknown non-empty directories fail closed.
54
+
55
+ > [!NOTE]
56
+ > Asset3D is optional and **disabled by default**. The two commands above never contact
57
+ > the internal asset catalog, download a platform Provider, or add
58
+ > `asset3d-search` to the project. Enable it only in an already initialized project:
59
+ >
60
+ > ```bash
61
+ > npx -y @forgeax/game asset3d enable
62
+ > ```
63
+
64
+ ## Agent completion contract
65
+
66
+ `init` records `.forgeax/game-authoring-baseline.json` before gameplay authoring. An
67
+ untouched Empty template remains runnable, but once gameplay or assets change the
68
+ connector refuses Preview until the Agent has replaced the template identity, kept a
69
+ single game README heading, removed the Empty package output name, updated gameplay
70
+ tests, and documented controls. A valid behavior test imports a named game-specific
71
+ state transition or rule and exercises it with an assertion; merely renaming an Empty
72
+ template test does not qualify. Standalone source remains in `<game-root>/src`; the
73
+ Studio-hosted `.forgeax/games/<slug>` layout is never created by this package.
74
+
75
+ Every supported host receives the same packaged `forgeax-game` Skill and routing rule.
76
+ They require UI to mount under the Engine Host `uiRoot` or `#game-ui`. The released
77
+ standalone Host provides `#game-ui`; direct `document.body` mutation is rejected.
78
+ An explicit request for an existing/library 3D asset requires the separately installed
79
+ project-local `asset3d-search/search_asset` tool. When it is absent, Agents must report
80
+ `BLOCKED(asset-library-tools-missing)` instead of relabeling procedural geometry or
81
+ generation as an asset-library result.
82
+
83
+ ## MCP transports
84
+
85
+ Local Agent clients should use the default stdio transport installed by
86
+ `forgeax-game install`. For a shared local daemon, bind only to loopback:
35
87
 
36
88
  ```bash
37
- npx -y @forgeax/game install --ide zcode
89
+ forgeax-game mcp --transport http --host 127.0.0.1 --port 18940 --root "$PWD"
38
90
  ```
39
91
 
40
- Configure several clients in one pass:
92
+ The Streamable HTTP endpoint is `http://127.0.0.1:18940/mcp`. A non-loopback
93
+ listener requires `FORGEAX_REMOTE_MCP_TOKEN`; `--require-auth` also enforces bearer
94
+ authentication on loopback. HTTP mode adds bounded game-file tools under the fixed
95
+ root and never accepts a caller-provided `target_dir`.
41
96
 
42
- ```bash
43
- npx -y @forgeax/game install --ide codex,claude,cursor,zcode
97
+ ## MCP surface
98
+
99
+ | Surface | Kind | Contract |
100
+ |:--|:--|:--|
101
+ | `forgeax://status` | Resource | Read-only game, Engine release, DevKit, and Preview identity |
102
+ | `forgeax_status_lite` | Tool | Resource fallback for clients without MCP resource support |
103
+ | `forgeax_run_current_game` | Tool | Exact Engine build followed by start/reuse of Engine-owned Preview |
104
+ | `forgeax_generate_image` | Tool | Existing image-generation helper; outside the G0 Preview cutover |
105
+ | `forgeax_generate_3d` | Tool | Generation fallback used only for misses after the Asset3D search lifecycle |
106
+ | `forgeax_game_list_files` | HTTP tool | List non-hidden files below the selected game |
107
+ | `forgeax_game_read_file` | HTTP tool | Read one UTF-8 game file and return its SHA-256 |
108
+ | `forgeax_game_read_logs` | HTTP tool | Read a bounded Preview log tail for remote diagnosis |
109
+ | `forgeax_game_write_file` | HTTP tool | Atomically create or hash-guard replacement of a text file |
110
+
111
+ The build plus Preview-readiness deadline is 150 seconds. Preview readiness starts
112
+ with one bounded `CommandEnvelope@1.0.0`. Engines that expose
113
+ `GET /.forgeax/preview-health` are bearer-authenticated and must echo the canonical
114
+ root, exact release, build digest, and instance ID. Released Engine 0.1.7 emits the
115
+ documented minimal Preview envelope instead; the connector binds its already verified
116
+ release and fresh instance ID, then reads the served `forgeax-dist.json` and requires
117
+ its SHA-256 to equal the build it just produced.
118
+
119
+ Any build or Preview failure is an MCP `isError` result. Agents must not probe or
120
+ reuse an existing localhost port after a failed call: HTTP 200 is not ownership
121
+ evidence. Only a successful result containing `preview.status: ready`, `preview_url`,
122
+ `preview.root`, `preview.build_digest`, and `preview.instance_id` authorizes a Preview
123
+ claim. If another game owns the Engine port, stop that game explicitly or report the
124
+ blocker; never substitute its URL.
125
+
126
+ ## Preview ownership
127
+
128
+ Per game, connector-owned state lives at:
129
+
130
+ ```text
131
+ <project>/.forgeax/run/engine-preview/<sha256(canonical-game-root)>/
132
+ ├── lock
133
+ ├── state.json
134
+ ├── stdout.log
135
+ └── stderr.log
44
136
  ```
45
137
 
46
- Omitting `--ide` configures every supported client. User-scoped clients can be
47
- installed before a project exists; Trae and VS Code use project scope and are written
48
- when `install` runs inside the project. The original WorkBuddy name remains accepted
49
- as an alias of the current CodeBuddy client:
138
+ The directory is `0700`; files are `0600`; logs rotate at 8 MiB and keep two prior
139
+ files. Reuse requires the build/Engine/instance identity, unchanged process-start
140
+ identity, and either authenticated health or the exact served dist digest after MCP
141
+ restart. PID alone never authorizes a signal.
50
142
 
51
143
  ```bash
52
- npx -y @forgeax/game install --ide trae,workbuddy
144
+ forgeax-game preview stop --target-dir ./my-game
145
+ forgeax-game preview stop --target-dir ./my-game --json
53
146
  ```
54
147
 
55
- Before writing any config, the installer launches the exact command it intends to
56
- store and completes a real `initialize` `tools/list` `resources/list` handshake.
57
- Existing config files are merged, and a changed file is backed up beside the original
58
- with the `.bak.latest` suffix.
148
+ Stop and cancellation signal only the verified owning Preview process, with a bounded
149
+ TERM/KILL cleanup. Dead state is removed under the lock; a matching orphan is adopted;
150
+ a live unverifiable PID fails closed as `preview_ownership_unverified`.
59
151
 
60
- ### Create a project
152
+ ## Asset3D installation and transaction
61
153
 
62
- Choose an empty directory and initialize a game there:
154
+ Asset3D is an opt-in, project-local MCP integration for the internal catalog. Run it
155
+ only after `init` and while connected to the internal network:
63
156
 
64
157
  ```bash
65
- cd /path/to/empty-directory
66
- npx -y @forgeax/game init
158
+ npx -y @forgeax/game asset3d enable
159
+ forgeax-game asset3d doctor --json
67
160
  ```
68
161
 
69
- `init` creates the ForgeaX project, installs the matching Engine SDK, and mounts the
70
- bundled Skills for every client that already has a ForgeaX MCP entry. Use
71
- `--game <slug>` to choose a game name or `--ide zcode` when initializing a project
72
- for ZCode specifically.
162
+ `enable` first probes `http://21.214.216.8:5180/api/assets` with a body-free `HEAD`
163
+ request. The current network-gated service returns `200` and requires no API Key, so
164
+ the plugin reports `authentication=none`. It then reuses the exact verified Provider
165
+ from `~/.forgeax/providers/asset3d-search/<sha256>/`, or downloads the digest-pinned
166
+ platform release artifact over HTTPS when the cache is absent. Only after Provider
167
+ verification and its MCP handshake succeed does the command merge the `forgeax` and
168
+ `asset3d-search` entries into `.forgeax/mcp.json` and project the approved Asset3D
169
+ workflow into the Agent hosts selected during `install`.
73
170
 
74
171
  > [!IMPORTANT]
75
- > `init` does not install the user-level MCP entry. A new machine must run
76
- > `install --ide zcode` once before `init`. A user who already has the `forgeax`
77
- > entry configured in ZCode can run `init` directly for each new project.
78
-
79
- ### Refresh an existing project
172
+ > The internal catalog does **not** use `ANTHROPIC_API_KEY`. No model-provider key is
173
+ > accepted, copied, or written by `asset3d enable`. If a future catalog returns
174
+ > `401`/`403`, this release fails closed with `asset3d_api_key_contract_missing` until
175
+ > that service publishes an explicit authentication header and validation contract;
176
+ > an arbitrary secret is never guessed or persisted in project config.
80
177
 
81
- For a project that was initialized previously, use `update` instead of running the
82
- same `init` again:
178
+ The transaction commands are normally driven by the installed Agent workflow:
83
179
 
84
180
  ```bash
85
- cd /path/to/existing-forgeax-project
86
- npx -y @forgeax/game update
87
- ```
88
181
 
89
- If the project has no game-development Skills yet, use:
182
+ forgeax-game asset3d begin --query "weathered oak tree" --json
183
+ # Call the configured asset3d-search/search_asset MCP tool with the returned output_dir.
184
+ # Pass its complete TextContent JSON to commit on stdin:
185
+ forgeax-game asset3d commit --execution <uuid> --provider-result-stdin --json < result.json
90
186
 
91
- ```bash
92
- npx -y @forgeax/game devkit install
187
+ forgeax-game asset3d doctor --json
188
+ forgeax-game asset3d uninstall
93
189
  ```
94
190
 
95
- After installing or refreshing ZCode Skills, open the project as a ZCode workspace,
96
- refresh Settings Skills, and start a new session. Check Settings → MCP Servers or
97
- run `/mcp status` to confirm `forgeax` is connected.
191
+ <details>
192
+ <summary>Maintainer-only local bundle installation</summary>
98
193
 
99
- For local package development or offline use, pin the currently running executable:
194
+ The low-level command remains available for producing and validating platform release
195
+ artifacts. It is not the user onboarding path.
100
196
 
101
197
  ```bash
102
- bun src/main.ts install --ide codex --local
198
+ forgeax-game asset3d install \
199
+ --provider-bundle ./asset3d-search-provider-<commit>-<os>-<arch>.tar.gz \
200
+ --sha256 <archive-sha256> \
201
+ --download-origin http://21.214.216.8:5180 \
202
+ --catalog-base-url http://21.214.216.8:5180
103
203
  ```
104
204
 
105
- ## Commands
106
-
107
- | Command | Purpose |
108
- |:--|:--|
109
- | `install [--ide a,b] [--local]` | Verify the MCP launch command, then merge client configuration |
110
- | `init [--game <slug>] [--ide ...]` | Create a project/game, install routing rules, and materialize the bundled Engine SDK |
111
- | `use <slug>` | Activate an existing game through the server |
112
- | `doctor` | Check Node, project binding, service tiers, and client configuration |
113
- | `devkit install` | Install the game-development Skill and host rules; use `forgeax-install` only when available |
114
- | `agents update` | Insert or refresh only the managed ForgeaX block in `AGENTS.md` |
115
- | `update [--ide ...]` | Verify the published launch command, refresh installed client entries, and update project routing rules |
116
-
117
- `init` can create the minimal `.forgeax/` instance and game in an ordinary empty
118
- directory. It also installs `.forgeax/engine-sdk/`, containing declarations, API
119
- metadata, both canonical templates (`game-default` and `game-empty`), authoring
120
- skills, and the Engine implementation source generated from the same Engine pin as the
121
- selected Runtime package. `use`, `devkit install`, and `agents update` operate on the nearest
122
- project root. Runtime extraction and startup are automatic; a running server is not
123
- an `init` prerequisite.
205
+ The catalog authority must also be an exact member of `--download-origin`.
124
206
 
125
- ## MCP surface
207
+ </details>
126
208
 
127
- The server intentionally exposes only high-frequency development-loop operations.
128
- Installation and project mutation stay in the CLI so models do not reconsider
129
- one-time actions on every turn.
209
+ Provider output is checked at a 1 MiB stdin boundary. The transaction ignores
210
+ `downloaded_to`, accepts only declared relative manifest paths contained by its
211
+ private quarantine, and publishes the whole asset directory under
212
+ `assets/3d/ea-3d/<providerAssetId>`. It invokes only the exact released Engine CLI
213
+ with `asset add ... --reimport-policy semantic-only --json`, then requires
214
+ verify/list/inspect readback before committing provenance. Same-digest content is
215
+ reused only after live file and catalog checks; changed content requires `--refresh`
216
+ and rolls back the entire prior directory on failure.
130
217
 
131
- | Entry | Kind | Use |
132
- |:--|:-:|:--|
133
- | `forgeax://status` | Resource | Preferred read-only project, service, and next-action status |
134
- | `forgeax_status_lite` | Tool | Status fallback for clients without MCP resource support |
135
- | `forgeax_run_current_game` | Tool | Build or reuse the active game's static preview, return its URL and health identity, and identify the runtime log file |
136
- | `forgeax_generate_image` | Tool | Text-to-image, or image-to-image with a local `image`; saves a PNG/JPG into the active game's `assets/` and returns its path |
137
- | `forgeax_generate_3d` | Tool | Text-to-3D (`prompt`) or image-to-3D (public https `image` URL); runs the async job to completion and saves a `.glb` into `assets/` |
218
+ See [docs/asset3d.md](docs/asset3d.md) for the platform, origin, ownership, recovery,
219
+ and evidence boundaries.
138
220
 
139
- When this plugin cold-starts the managed Runtime, runtime output is written to:
221
+ ## Scope boundary
140
222
 
141
- ```text
142
- <project>/.forgeax/logs/runtime/runtime.log
143
- ```
144
-
145
- Read that file with the host client's normal file tools. Runtime process output is
146
- captured there; exceptions thrown inside the browser remain in the browser console.
147
- The run result reports the Runtime version, instance identity, selected ports, and
148
- whether the log belongs to the current plugin-owned process; status reports the
149
- cached Runtime installation state.
150
-
151
- Runtime artifacts are cached per platform and version under `~/.forgeax/runtimes/`.
152
- The selected `@forgeax/game-runtime-<platform>-<arch>` package carries the archive,
153
- so first run verifies and extracts npm-installed bytes without another download.
154
- The cache uses a checksum-verified ready
155
- marker and keeps the previous version until a new version has started successfully.
156
- `forgeax_run_current_game` reports `runtime.version`, `engine_sdk.commit`, and a
157
- combined `engine.identity`; those must match before preview acceptance.
158
-
159
- The game SDK is available at `.forgeax/engine-sdk/`. Use its declaration files and
160
- `templates/game-default` or `templates/game-empty` before writing imports. If an API
161
- is absent, inspect `source/<package>/src/` instead of guessing.
162
-
163
- ### Asset generation (LiteLLM)
164
-
165
- `forgeax_generate_image` and `forgeax_generate_3d` produce art and 3D assets through a
166
- LiteLLM gateway and save them into the active game's `assets/` directory, returning the
167
- project-relative path to reference from game code. Configure via environment:
168
-
169
- | Variable | Required | Default |
170
- |:--|:-:|:--|
171
- | `FORGEAX_LITELLM_API_KEY` | yes | — (secret; never commit it) |
172
- | `FORGEAX_LITELLM_BASE_URL` | no | the shared ForgeaX gateway |
173
- | `FORGEAX_GEN_IMAGE_MODEL` | no | `gemini-3-pro-image` |
174
- | `FORGEAX_GEN_3D_TEXT_MODEL` | no | `tripo-3d-text` |
175
- | `FORGEAX_GEN_3D_IMAGE_MODEL` | no | `tripo-3d-image` |
176
- | `FORGEAX_COS_BUCKET` / `FORGEAX_COS_REGION` | for local image-to-3D | — |
177
- | `FORGEAX_COS_SECRET_ID` / `FORGEAX_COS_SECRET_KEY` | for local image-to-3D | — (secret; never commit) |
178
-
179
- - **Text-to-image / image-to-image**: `forgeax_generate_image({ prompt, image? })`. A
180
- local `image` path switches to editing that image with the prompt.
181
- - **Text-to-3D**: `forgeax_generate_3d({ prompt })` — submits, polls to completion
182
- (~1–2 min), and downloads the `.glb`.
183
- - **Image-to-3D**: `forgeax_generate_3d({ image })`. `image` is a **public https URL**,
184
- or a **local file path** when COS is configured — the file is uploaded to the COS
185
- bucket and passed to the backend as a short-lived presigned URL (the private bucket
186
- stays private; the URL expires within the hour). This makes the "generate a concept
187
- image, then turn it into a mesh" flow work end to end. Without COS, only a public URL
188
- is accepted, because the 3D endpoint rejects local paths and inline base64.
189
-
190
- ## Supported clients
191
-
192
- | Client ID | Config path | Scope |
193
- |:--|:--|:-:|
194
- | `codex` | `~/.codex/config.toml` | User |
195
- | `claude` | `~/.claude.json` | User |
196
- | `cursor` | `~/.cursor/mcp.json` | User |
197
- | `trae` | `<project>/.trae/mcp.json` | Project |
198
- | `codebuddy` / `workbuddy` | `~/.codebuddy/.mcp.json` | User |
199
- | `windsurf` | `~/.codeium/windsurf/mcp_config.json` | User |
200
- | `vscode` | `<project>/.vscode/mcp.json` | Project |
201
- | `zcode` | `~/.zcode/cli/config.json` | User |
202
- | `opencode` | `~/.config/opencode/opencode.json` | User |
203
-
204
- > [!NOTE]
205
- > `workbuddy` is an accepted installer alias. Both names target CodeBuddy's current
206
- > MCP file, so selecting both does not create duplicate entries.
207
- >
208
- > The OpenCode entry follows its stable configuration schema (`mcp.<name>`,
209
- > `type: "local"`, and an argv-style `command`). It is process-verified with
210
- > OpenCode 1.17.9: `opencode mcp list` starts this package and reports
211
- > `forgeax connected`. If a future client release changes the schema, `doctor`
212
- > will still report whether the configured entry matches what this package writes.
213
- >
214
- > ZCode uses its native `mcp.servers.<name>` user configuration rather than the
215
- > `.agents/mcp.json` fallback. Project Skills are installed under `.zcode/skills`;
216
- > start a new ZCode session and run `/mcp status` after installation.
217
-
218
- ## Game development Skill
219
-
220
- The canonical Skill lives at the repository root in `skills/forgeax-game/`. Package
221
- builds derive the copy shipped under `assets/`; there is no second handwritten source.
222
- The Skill contains the MCP/file/browser decision loop, failure recovery, current
223
- engine-project map, example-selection rules, scaffold/template authority, and the
224
- real Studio-versus-Play validation boundary.
225
-
226
- The published package also carries the host-install metadata needed to expose that
227
- Skill directly to Codex, Claude Code, Cursor and other configured clients. A harness
228
- checkout is optional compatibility support, not a user prerequisite. Inside a ForgeaX
229
- project, `install`, `init`, and `update` refresh it automatically. It can also be
230
- installed explicitly:
231
-
232
- ```bash
233
- npx -y @forgeax/game devkit install
234
- ```
235
-
236
- When the project already has a `.forgeax-harness/install-manifest.json`, the command
237
- may replay that project's recorded `forgeax-install` specification. Otherwise the
238
- published package uses its bundled host-install metadata and writes only its managed
239
- Skill/rule blocks. It never reports a successful user install while silently requiring
240
- a missing harness checkout.
241
-
242
- ## Develop
243
-
244
- ```bash
245
- bun run typecheck
246
- bun test
247
- bun run build
248
- node dist/main.js help
249
- ```
223
+ > [!WARNING]
224
+ > G0/A0 packed and controlled-fixture evidence is supporting evidence only. It does
225
+ > not prove Studio, Editor, RuntimeInstance, host permission parity, visible Play, or
226
+ > real EA/provider access. Those remain separate downstream integration and terminal
227
+ > acceptance gates.
250
228
 
251
- The handshake end-to-end test builds `dist/main.js`, executes that file through its
252
- Node shebang, and verifies the real MCP surface.
229
+ See [docs/runtime.md](docs/runtime.md) for the exact artifact and lifecycle contract.
230
+ For the `0.3.0` onboarding release, migration, verification, and maintainer publish
231
+ checklist, see [docs/release-0.3.0.md](docs/release-0.3.0.md).
@@ -0,0 +1,29 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "forgeax.asset3d-search-receipt/1.0.0",
4
+ "title": "ForgeaX Asset3D Search Receipt",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schemaVersion",
9
+ "provider",
10
+ "providerCommit",
11
+ "originSetDigest"
12
+ ],
13
+ "properties": {
14
+ "schemaVersion": {
15
+ "const": "forgeax.asset3d-search-receipt/1.0.0"
16
+ },
17
+ "provider": {
18
+ "const": "ea-3d"
19
+ },
20
+ "providerCommit": {
21
+ "type": "string",
22
+ "pattern": "^[0-9a-f]{40}$"
23
+ },
24
+ "originSetDigest": {
25
+ "type": "string",
26
+ "pattern": "^[0-9a-f]{64}$"
27
+ }
28
+ }
29
+ }