# Editor Dialog Fields for AI Agents

> Editor dialog field ids for AI agents: publishing, credits, packs, preferences, screenshots, GitHub sync and the other dialogs in DiceyTable Edit Mode.

- Question: Which editor dialog fields can an agent set?
- Source: https://diceytable.com/docs/ai-agents/reference/fields/dialogs
- Last verified: 2026-10-09

These are the fields and buttons in the dialogs Edit Mode opens. Publish, Credits, packs, Preferences and Screenshots are some of them. Open a dialog first. Then its fields can be set.

## Panels in this group

28 panels, with the id prefix `dialog`. The [field catalogue](https://diceytable.com/docs/ai-agents/reference/fields) lists every group.

| Panel | Label | Tab | Fields | Actions |
|---|---|---|---|---|
| [`dialog.publish`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialogpublish) | Publish | `editor` | 3 | 2 |
| [`dialog.github-sync`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialoggithub-sync) | GitHub sync | `editor` | 0 | 20 |
| [`dialog.project-picker`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialogproject-picker) | Open project | `editor` | 2 | 7 |
| [`dialog.preferences`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialogpreferences) | Preferences | `editor` | 1 | 1 |
| [`dialog.credits-editor`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialogcredits-editor) | Credits editor | `editor` | 0 | 0 |
| [`dialog.ai-model-import`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialogai-model-import) | Import AI model | `editor` | 0 | 0 |
| [`dialog.asset-credit`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialogasset-credit) | Asset credit | `editor` | 0 | 1 |
| [`dialog.create-pack`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialogcreate-pack) | Create pack | `editor` | 6 | 8 |
| [`dialog.move-to-github`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialogmove-to-github) | Move to GitHub | `editor` | 1 | 2 |
| [`dialog.asset-pack-browser`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialogasset-pack-browser) | Asset pack browser | `editor` | 4 | 6 |
| [`dialog.board-from-image`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialogboard-from-image) | Board from image | `editor` | 6 | 2 |
| [`dialog.collection`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialogcollection) | Collection | `editor` | 5 | 2 |
| [`dialog.seat-template-promote`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialogseat-template-promote) | Promote to seat template | `editor` | 2 | 1 |
| [`dialog.seat-template-apply`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialogseat-template-apply) | Apply seat template | `editor` | 3 | 2 |
| [`dialog.split`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialogsplit) | Split into parts | `editor` | 5 | 1 |
| [`dialog.screenshots`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialogscreenshots) | Screenshots | `editor` | 0 | 7 |
| [`dialog.unsaved-changes`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialogunsaved-changes) | Unsaved changes | `editor` | 0 | 6 |
| [`dialog.link-update`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialoglink-update) | Update linked items | `editor` | 2 | 8 |
| [`dialog.problems`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialogproblems) | Problems | `editor` | 0 | 1 |
| [`dialog.editor-control`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialogeditor-control) | Editor control request | `editor` | 0 | 0 |
| [`dialog.pack-bump`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialogpack-bump) | Review a pack version bump | `editor` | 0 | 2 |
| [`dialog.variants`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialogvariants) | Variants | `editor` | 20 | 14 |
| [`dialog.media-crop`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialogmedia-crop) | Crop image | `editor` | 0 | 3 |
| [`dialog.bots-host-fallback`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialogbots-host-fallback) | You are now the host (paused bots) | `table` | 0 | 5 |
| [`dialog.pack-picker`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialogpack-picker) | Room / table picker | `editor` | 2 | 5 |
| [`dialog.pack-move`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialogpack-move) | Pack move review | `editor` | 1 | 2 |
| [`dialog.pack-updates`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialogpack-updates) | Referenced packs | `editor` | 0 | 2 |
| [`dialog.pack-verify`](https://diceytable.com/docs/ai-agents/reference/fields/dialogs#dialogpack-verify) | Verify as a new player | `editor` | 0 | 2 |

## `dialog.publish`

**Publish** · surface `editor` · singleton (no target)

How it opens: File ▸ Publish to GitHub… (publishing itself is H: the human clicks).

**Fields** (3)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `dialog.publish.repo` | Link a repository (owner/name) | `text` | — | — | W | — | The GitHub repository (owner/name) to link, when the project has none yet. |
| `dialog.publish.version` | Version | `text` | — | — | W | — | The version to publish (semver, e.g. 1.0.0). Committing it saves the draft and checkpoints to the wip branch. |
| `dialog.publish.message` | Commit message (optional) | `text` | — | — | W | — | The publish commit's message. |

**Actions** (2)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `dialog.publish.publish` | Publish | H | — | Requires the user's confirmation in the DiceyTable tab. Publish the project (promote wip → main on GitHub, making it live for multiplayer). Disabled while any AI-attested credit is unreviewed. Prefer publish_request, which only opens this dialog. |
| `dialog.publish.show-step-files` | Show this step's files | R | `project` | List the files of one publish step. Target: `{kind: "project", id: "<step id>"}`. |

## `dialog.github-sync`

**GitHub sync** · surface `editor` · singleton (no target)

How it opens: File ▸ Sync with GitHub…; also opens when a sync-down finds conflicts.

**Actions** (20)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `dialog.github-sync.close` | Close | R | — | Close the GitHub sync dialog. Undecided conflicts are asked again next time. |
| `dialog.github-sync.keep-all-local` | Keep all local | W | — | Choose the local copy for every conflicting file (applied only by Apply). |
| `dialog.github-sync.use-all-github` | Use all from GitHub | W | — | Choose GitHub's copy for every conflicting file (applied only by Apply, which asks the user). |
| `dialog.github-sync.clear-choices` | Clear choices | W | — | Forget every per-file choice. |
| `dialog.github-sync.compare` | Compare | R | `asset` | Show both versions of a conflicting file side by side. Target: the file path. |
| `dialog.github-sync.keep-local` | Keep local | W | `asset` | Choose the local copy of one conflicting file. Target: the file path. |
| `dialog.github-sync.use-github` | Use GitHub | W | `asset` | Choose GitHub's copy of one conflicting file (discards the local edit when applied). Target: the file path. |
| `dialog.github-sync.apply` | Apply choices | H | — | Requires the user's confirmation in the DiceyTable tab. Apply the per-file choices. Choosing GitHub's copy overwrites local work that was never published. |
| `dialog.github-sync.sync-now` | Sync now | W | — | Re-run the sync from GitHub now; files changed on one side only are synced down, conflicts are left alone. |
| `dialog.github-sync.reset.open` | Reset local copy from GitHub… | R | — | Show the reset-from-GitHub confirmation. Its typed repository-name confirmation is the human's alone. |
| `dialog.github-sync.reset.cancel` | Cancel | R | — | Hide the reset-from-GitHub confirmation. |
| `dialog.github-sync.reset.confirm` | Delete local copy and re-download | H | — | Requires the user's confirmation in the DiceyTable tab. Delete this device's whole local working copy and re-download the repository. Unpublished local edits are lost. Enabled only after the human types the repository name. |
| `dialog.github-sync.manifest.keep-all-draft` | Keep all from this draft | W | — | Choose the draft's value for every conflicting `diceytable.mod.json` item (applied only by Apply and save). |
| `dialog.github-sync.manifest.use-all-github` | Use all from GitHub | W | — | Choose GitHub's value for every conflicting manifest item (applied only by Apply and save). |
| `dialog.github-sync.manifest.clear-choices` | Clear choices | W | — | Forget every manifest-item choice. |
| `dialog.github-sync.manifest.group-draft` | All draft | W | `project` | Choose the draft's value for every conflict under one manifest key. Target: `{kind: "project", id: "<manifest key>"}`. |
| `dialog.github-sync.manifest.group-github` | All GitHub | W | `project` | Choose GitHub's value for every conflict under one manifest key. Target: the manifest key. |
| `dialog.github-sync.manifest.pick-draft` | This draft | W | `project` | Choose the draft's value for one manifest conflict. Target: `{kind: "project", id: "<conflict id>"}`. |
| `dialog.github-sync.manifest.pick-github` | GitHub | W | `project` | Choose GitHub's value for one manifest conflict. Target: the conflict id. |
| `dialog.github-sync.manifest.apply` | Apply and save | H | — | Requires the user's confirmation in the DiceyTable tab. Apply the manifest-item choices and save the draft. Choosing GitHub's value discards the draft's. |

## `dialog.project-picker`

**Open project** · surface `editor` · singleton (no target)

How it opens: File ▸ Open Project…

**Fields** (2)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `dialog.project-picker.folder` | Folder | `select` | — | — | W | — | Which pack kind's projects Open Project lists (all, games, rooms, tables, asset packs, …). View state only. |
| `dialog.project-picker.search` | Search projects | `text` | — | — | W | — | Filters Open Project by name, slug or repository. View state only; project names are the user's own text. |

**Actions** (7)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `dialog.project-picker.close` | Close | R | — | Close Open Project. |
| `dialog.project-picker.open` | Open | W | `project` | Load a project into this tab (the current one's unsaved changes are the editor's to guard). Target: the project id. |
| `dialog.project-picker.open-new-tab` | Open in another tab | R | `project` | Open a different project in a new browser tab. Target: the project id. |
| `dialog.project-picker.new-mod` | New Mod… | R | — | Open the New Mod dialog. |
| `dialog.project-picker.delete.ask` | Delete… | R | `project` | Ask to delete a never-published project; shows its confirm row. Target: the project id. |
| `dialog.project-picker.delete.cancel` | Cancel | R | `project` | Dismiss a project's delete confirm row. Target: the project id. |
| `dialog.project-picker.delete.confirm` | Delete | H | `project` | Requires the user's confirmation in the DiceyTable tab. Delete a never-published project and its local files for good. Target: the project id. |

## `dialog.preferences`

**Preferences** · surface `editor` · singleton (no target)

How it opens: File ▸ Preferences…

**Fields** (1)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `preferences.units.length` | Length | `select` | — | — | W | `mm`, `cm`, `m`, `in`, `ft`, `yd` | The unit the editor SHOWS lengths in. Display only: files stay in world feet, and agent length values are always feet regardless. |

**Actions** (1)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `dialog.preferences.close` | Close | R | — | Close the Preferences dialog. |

## `dialog.credits-editor`

**Credits editor** · surface `editor` · singleton (no target)

How it opens: Opened from Manifest ▸ Credits.

_No field or action is registered on this panel yet. `panel_open` can still open it, and `describe_panel` / `screenshot_panel` can read it._

## `dialog.ai-model-import`

**Import AI model** · surface `editor` · singleton (no target)

How it opens: Manifest ▸ Bots ▸ Import model… The human picks the .onnx file; an agent sends one with ai_model_import.

_No field or action is registered on this panel yet. `panel_open` can still open it, and `describe_panel` / `screenshot_panel` can read it._

## `dialog.asset-credit`

**Asset credit** · surface `editor` · singleton (no target)

How it opens: Opens during an import that needs a credit.

**Actions** (1)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `dialog.asset-credit.cancel` | Cancel import | W | — | Cancel the import waiting on the credit question: nothing is imported and no file is written. (An agent answers the question itself with credits_attest / asset_import's credit, never through this human dialog.) |

## `dialog.create-pack`

**Create pack** · surface `editor` · singleton (no target)

How it opens: Opened from the explorer's pack actions.

**Fields** (6)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `create-pack.name` | Name | `text` | — | — | W | — | The new project's display name. |
| `create-pack.kind` | What are you creating? | `select` | — | — | W | `game-pack`, `room-pack`, `table-pack`, `component-pack` | The kind of project, which becomes `manifest.type` and is frozen at the first publish. |
| `create-pack.scene-pack` | Room / table | `select` | — | `room` | W | — | The room or table the new project starts against (target id `room` or `table`). Empty = the built-in one; the live options are the published packs. For a game this is a real assignment; for every other kind it is editor-only preview state. |
| `create-pack.repo-mode` | Repository option | `select` | — | — | W | `new`, `existing` | Where the files live: a new public GitHub repository or an existing one. There is no local-only option; both need GitHub connected (the field is disabled until it is). |
| `create-pack.new-repo-name` | New repository name | `text` | — | — | W | — | The new repository's name (repository option `new`). New repositories are public: peers download assets from GitHub raw. |
| `create-pack.repo-search` | Search your repositories | `text` | — | — | W | — | Search the signed-in author's repositories (repository option `existing`); resets to page 1. |

**Actions** (8)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `create-pack.close` | Close | R | — | Close the chooser without creating anything. |
| `create-pack.change-kind` | Change | R | — | Go back to the kind step. |
| `create-pack.back` | Back | R | — | Go back one step. |
| `create-pack.continue` | Continue | R | — | Go to the next step (refused with the dialog's hint while the step is incomplete). |
| `create-pack.repo.select` | Select repository | R | `project` | Select one of your repositories (target id = `owner/name`). |
| `create-pack.repo.previous` | Previous | R | — | Previous page of your repositories. |
| `create-pack.repo.next` | Next | R | — | Next page of your repositories. |
| `create-pack.create` | Create | W | — | Create the project (and, for repository option `new`, a PUBLIC GitHub repository) and open it. Needs GitHub connected: every mod gets a repository. |

## `dialog.move-to-github`

**Move to GitHub** · surface `editor` · singleton (no target)

How it opens: Opens by itself when a local-only project (no linked repository) is opened in a writable tab.

**Fields** (1)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `move-to-github.repo-name` | New repository name | `text` | — | — | W | — | The name of the PUBLIC repository the open local-only project is moved to (defaults to a slug of the project name). Shown once GitHub is connected. |

**Actions** (2)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `move-to-github.move` | Move to GitHub | W | — | Create a PUBLIC GitHub repository with the dialog's name, link it to the open project and upload the project's files to its WIP branch. Needs GitHub connected. |
| `move-to-github.later` | Not now | R | — | Close the dialog for this tab. It opens again the next time this project is opened. |

## `dialog.asset-pack-browser`

**Asset pack browser** · surface `editor` · singleton (no target)

How it opens: Mod ▸ Browse Asset Packs…

**Fields** (4)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `asset-packs.search` | Search asset packs… | `text` | — | — | W | — | Filter the published asset packs by name, id, owner, summary or licence. |
| `asset-packs.import-mode` | Import as | `select` | — | — | W | `reference`, `vendor` | Reference the pack (stays current, credits the author, breaks if the pack vanishes) or copy it in (permanent, never receives fixes, drops out of attribution). Copy in is unavailable for subjects that forbid scripts. |
| `asset-packs.copy-prefab` | Copy this prefab | `boolean` | — | `asset` | W | — | Copy in only: tick the prefabs to copy (target id = the pack's prefab id). Ticking none copies every prefab. |
| `asset-packs.licence-ack` | I understand this pack's licence | `boolean` | — | — | H | — | Requires the user's confirmation in the DiceyTable tab. The licence acknowledgement for the selected asset pack. It is the human's statement, so an agent cannot tick it through fields_set. |

**Actions** (6)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `asset-packs.close` | Close | R | — | Close the asset pack browser. |
| `asset-packs.refresh` | Refresh | R | — | Re-read the published asset packs. |
| `asset-packs.open` | Open pack | R | `project` | Open a pack (target id = pack id) to list its prefabs, preview them and read its capability disclosure. Browsing never writes. |
| `asset-packs.prefab.select` | Preview prefab | R | `asset` | Show one of the open pack's prefabs in the preview (target id = prefab id). |
| `asset-packs.remove-reference` | Remove | D | `project` | Stop referencing this pack (target id = pack id). Entities placed from its prefabs stop resolving until it is referenced again. |
| `asset-packs.import` | Import | W | — | Reference the selected pack (or re-pin it), or — in Copy in mode — continue to the move review. Needs the human's licence acknowledgement first. |

## `dialog.board-from-image`

**Board from image** · surface `editor` · singleton (no target)

How it opens: Opened from the explorer's New actions.

**Fields** (6)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `board.name` | Name | `text` | — | — | W | — | The board's name; the texture, material, model and prefab are named from it. |
| `board.shape` | Shape | `select` | — | — | W | `rectangle`, `cutout` | `rectangle`: a slab with the image's proportions. `cutout`: extrude only the non-transparent parts of the image, holes included. |
| `board.alpha-threshold` | Transparency threshold | `slider` | — | — | W | ≥ 1, ≤ 254, step 1 | Cutout only: pixels with alpha at or above this (0-255) become board. Raise it to shave off soft edges. |
| `board.edge-detail` | Edge detail | `slider` | — | — | W | ≥ 0, ≤ 3, step 1 | Cutout only: 0 Fine, 1 Normal, 2 Coarse, 3 Blocky. Finer follows the artwork more closely and costs more triangles. |
| `board.longest-side` | Longest side | `length` | `length` | — | W | ≥ 0.041666666666666664, ≤ 8 | The board's longest horizontal side, in world feet (the dialog shows inches: 0.5-96 in). |
| `board.thickness` | Thickness | `length` | `length` | — | W | ≥ 0.0008333333333333333, ≤ 0.5 | The board's thickness, in world feet (the dialog shows inches: 0.01-6 in). |

**Actions** (2)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `board.close` | Close | R | — | Close the dialog without creating anything. |
| `board.create` | Create board | W | — | Write the board's four project items: a texture, a material, a model and a prefab. |

## `dialog.collection`

**Collection** · surface `editor` · singleton (no target)

How it opens: Mod ▸ Collections…

**Fields** (5)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `dialog.collection.collection` | Collection | `select` | — | — | W | — | Which published Collection the dialog composes the next version of; `""` selects none. |
| `dialog.collection.member-included` | Include member | `boolean` | — | `project` | W | — | Whether a member of the latest version stays in the NEXT version. Nothing is published until the Publish version action. Target: `{kind: "project", id: "<member mod id>"}`. |
| `dialog.collection.provider` | Room & table provider | `select` | — | — | W | — | The member mod id that supplies the room and the table for the next version; `""` asks the registry to resolve it. |
| `dialog.collection.version` | New version | `text` | — | — | W | — | The version label the next Collection version is published under. |
| `dialog.collection.note` | Note | `text` | — | — | W | — | An optional note published with the next Collection version. |

**Actions** (2)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `dialog.collection.close` | Close | R | — | Close the Collections dialog; nothing composed is published. |
| `dialog.collection.publish` | Publish version | H | — | Requires the user's confirmation in the DiceyTable tab. Publish the composed next version of the selected Collection to the package registry (admin-only on the server). |

## `dialog.seat-template-promote`

**Promote to seat template** · surface `editor` · singleton (no target)

How it opens: Opened from a seat group's promote action.

**Fields** (2)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `dialog.seat-template-promote.seat` | Seat | `select` | — | — | W | — | The seat to promote to the template. |
| `dialog.seat-template-promote.adopt-holders` | Adopt card holders | `boolean` | — | — | W | — | Make the card holders standing in the seat's zones template-owned (every linked seat gets one). |

**Actions** (1)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `dialog.seat-template-promote.promote` | Promote | W | — | Copy the chosen seat's zones and label into the seat template and link that seat. Undoable. |

## `dialog.seat-template-apply`

**Apply seat template** · surface `editor` · singleton (no target)

How it opens: Opened from the seat template's apply action.

**Fields** (3)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `dialog.seat-template-apply.seat` | Seat | `boolean` | — | `seat` | W | — | Tick this seat to link it to the template. |
| `dialog.seat-template-apply.placement-keep` | Keep each seat's current group transform | `boolean` | — | — | W | — | Placement radio: keep transforms. |
| `dialog.seat-template-apply.placement-even` | Re-arrange evenly around the table | `boolean` | — | — | W | — | Placement radio: re-arrange evenly. |

**Actions** (2)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `dialog.seat-template-apply.toggle-all` | All seats / Clear all | W | — | Tick every seat, or none, in the Apply dialog. |
| `dialog.seat-template-apply.apply` | Apply | W | — | Link the ticked seats to the template and materialize its layout (changes the card holder count). Undoable. |

## `dialog.split`

**Split into parts** · surface `editor` · singleton (no target)

How it opens: Opened from the model's Split into parts action.

**Fields** (5)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `dialog.split.prefix` | Name prefix | `text` | — | — | W | — | Prefix for the part models' names. |
| `dialog.split.place-scenery` | As environment scenery | `boolean` | — | — | W | — | Place-the-assembly radio: one environment placement at the source's origin. |
| `dialog.split.place-table` | On the table | `boolean` | — | — | W | — | Place-the-assembly radio: one table entity. |
| `dialog.split.place-none` | Don't place it | `boolean` | — | — | W | — | Place-the-assembly radio: only write the files. |
| `dialog.split.part` | Part | `boolean` | — | `asset` | W | — | Include this part (target id: the part's 0-based index). |

**Actions** (1)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `dialog.split.split` | Split into parts | W | — | Write each ticked part as its own model plus an assembly that puts them back together. The original model is kept. |

## `dialog.screenshots`

**Screenshots** · surface `editor` · singleton (no target)

How it opens: View ▸ Screenshots…

**Actions** (7)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `screenshots.close` | Close | R | — | Close the gallery. |
| `screenshots.open-preview` | Preview | R | — | Open Preview (to take a first capture in Photo mode). |
| `screenshots.select` | Select capture | R | `asset` | Select a capture (target id = its path under screenshots/). |
| `screenshots.promote-screenshot` | Use as store screenshot | W | — | Crop the selected capture to 16:9 and add it to the store page's screenshots (media/). |
| `screenshots.promote-cover` | Use as cover | W | — | Crop the selected capture to a square and replace the cover image (media/cover.webp). |
| `screenshots.retake` | Retake | R | — | Open Preview at the selected capture's camera and visibility. |
| `screenshots.delete` | Delete | H | — | Requires the user's confirmation in the DiceyTable tab. Delete the selected capture and its sidecar from the project (removed upstream on the next publish). The first press arms, the second deletes. |

## `dialog.unsaved-changes`

**Unsaved changes** · surface `editor` · singleton (no target)

How it opens: Opens when leaving with unsaved changes.

**Actions** (6)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `dialog.unsaved-changes.close` | Close | R | — | Close the Unsaved changes dialog. |
| `dialog.unsaved-changes.select-entity` | Select | R | `entity` | Select a changed entity in the viewport. Target: the entity id. |
| `dialog.unsaved-changes.open-tab` | Open tab | R | `asset` | Bring an editor tab with unsaved edits to the front. Target: `{kind: "asset", id: "<tab id>"}`. |
| `dialog.unsaved-changes.show-problems` | Show problems | R | — | Open the problems list that blocks saving. |
| `dialog.unsaved-changes.mark-saved` | Mark as saved | W | — | Mark a scene that differs only in formatting as saved, without a server round trip. |
| `dialog.unsaved-changes.save` | Save Draft | W | — | Save the draft to the server. |

## `dialog.link-update`

**Update linked items** · surface `editor` · singleton (no target)

How it opens: Opens when a linked library item has an update.

**Fields** (2)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `dialog.link-update.include` | Include item | `boolean` | — | `asset` | W | — | Whether a linked item's source update is part of the batch. Target: `{kind: "asset", id: "<link record path>"}`. |
| `dialog.link-update.conflict` | Conflict choice | `select` | — | `asset` | W | `mine`, `theirs` | Which value to keep for one field that both the project copy and the source changed (the row must be expanded). Target: `{kind: "asset", id: "<link record path>#<field key>"}`. |

**Actions** (8)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `dialog.link-update.cancel` | Cancel | R | — | Close the source-update review without applying anything. |
| `dialog.link-update.keep-all-mine` | Keep all mine | W | — | Choose the project copy's value for every conflict of every item. |
| `dialog.link-update.take-all-source` | Take all source | W | — | Choose the source's value for every conflict of every item. |
| `dialog.link-update.clear-choices` | Clear choices | W | — | Forget every conflict choice. |
| `dialog.link-update.toggle-item` | Show changes | R | `asset` | Expand or collapse one item's changes and conflicts. Target: the link record path. |
| `dialog.link-update.item-keep-all-mine` | Keep all mine | W | `asset` | Choose the project copy's value for every conflict of one item. Target: the link record path. |
| `dialog.link-update.item-take-all-source` | Take all source | W | `asset` | Choose the source's value for every conflict of one item. Target: the link record path. |
| `dialog.link-update.apply` | Apply updates | D | — | Write the chosen source updates over the linked project copies (props, link records and, where the source's bytes changed, the files). |

## `dialog.problems`

**Problems** · surface `editor` · singleton (no target)

How it opens: Click the save/problems pill in the top bar, or the status bar's problem count.

**Actions** (1)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `dialog.problems.fix` | Drop from manifest | W | `asset` | Apply this problem's fix: drop the missing path from the manifest (target id: the path). |

## `dialog.editor-control`

**Editor control request** · surface `editor` · singleton (no target)

How it opens: Opens when another tab asks this one for control of the project.

_No field or action is registered on this panel yet. `panel_open` can still open it, and `describe_panel` / `screenshot_panel` can read it._

## `dialog.pack-bump`

**Review a pack version bump** · surface `editor` · singleton (no target)

How it opens: Opens from the Asset pack browser or Mod ▸ Pack Updates when a pinned pack has a newer version.

**Actions** (2)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `dialog.pack-bump.apply-retro-update` | Update to <version> | D | — | Bump the pinned pack version and retro-update every placed copy the preview lists. Undoable. |
| `dialog.pack-bump.apply-update-review` | Update to <version> | D | — | Apply the reviewed pack update (bump the pin and retro-update the listed placed copies). Undoable. |

## `dialog.variants`

**Variants** · surface `editor` · singleton (no target)

How it opens: Game packs: Mod ▸ Variants…, or the Variants button in the top bar.

**Fields** (20)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `variants.editing` | Variant | `select` | — | — | W | — | Which variant the dialog's fields below describe (a variant id; the live options). Does not change what the editor shows — use dialog.variants.edit for that. |
| `variants.new-name` | New variant name | `text` | — | — | W | — | The name for the next variant dialog.variants.create makes, e.g. "9×9". Blank uses "New variant". |
| `variants.name` | Name | `text` | — | — | W | — | The selected variant's name, as the lobby's Variant dropdown shows it. |
| `variants.description` | Description | `text` | — | — | W | — | One line shown under the lobby dropdown when this variant is chosen. Optional. |
| `variants.own-players` | Own player range | `boolean` | — | — | W | — | On: this variant seats its own range (Min/Max below) instead of the game's. Off: it uses the game's range. |
| `variants.players-min` | Min players | `integer` | — | — | W | ≥ 1, ≤ 64, step 1 | Fewest players this variant seats. Only while Own player range is on. |
| `variants.players-max` | Max players | `integer` | — | — | W | ≥ 1, ≤ 64, step 1 | Most players this variant seats. Only while Own player range is on. |
| `variants.rules-enforced` | Rules enforced | `boolean` | — | — | W | — | On: this variant's scene script enforces the rules and reports the result with match.end, and the variant may be ranked (its Ranked play section appears). Off removes the ranking settings. Which scripts a variant runs is scene data (its scene-script attachments), not this switch. |
| `variants.ranking.enabled` | Offer ranked play | `boolean` | — | — | W | — | Whether the lobby may offer Ranked for the selected variant. Only while Fully scripted is on. |
| `variants.ranking.placement-games` | Placement games | `integer` | — | — | W | ≥ 3, ≤ 25, step 1 | Ranked games a player plays before their Score is shown publicly (default 5). |
| `variants.ranking.pool` | Ladder (pool) | `text` | — | — | W | — | Variants with the same ladder share one set of Scores. Lowercase letters, digits and single dashes; blank means the variant's own id. Variants on one ladder must rank the same sides and seat the same player range. |
| `variants.ranking.sides` | Rank | `select` | — | — | W | `seats`, `teams` | "seats" ranks each seat on its own; "teams" ranks table teams. Teams cannot be published yet: seat teams cannot be declared, so the scanner refuses it. |
| `variants.ranking.draws` | Offer draw button | `boolean` | — | — | W | — | Whether players get the platform's Offer draw button during a ranked match (default off). |
| `variants.ranking.takebacks` | Allow takebacks | `boolean` | — | — | W | — | Whether the consent-gated Undo (takeback) is offered during a ranked match (default on). Turn off for games with irreversible hidden draws. |
| `variants.ranking.require-kernel` | Require kernel | `boolean` | — | — | W | — | On: only matches recorded with a rules kernel (match.start({ kernel })) are ranked (default off). |
| `variants.ranking.min-moves` | Minimum moves | `integer` | — | — | W | ≥ 0, ≤ 500, step 1 | Kernel matches with fewer effective moves end as no contest (default 2). |
| `variants.ranking.min-seconds` | Minimum seconds | `integer` | — | — | W | ≥ 0, ≤ 3600, step 1 | Matches shorter than this end as no contest (default 30). |
| `variants.ranking.reconnect-grace` | Reconnect grace (seconds) | `integer` | — | — | W | ≥ 15, ≤ 600, step 1 | How long a disconnected player has to come back before they forfeit (default 90). |
| `variants.ranking.bots-ranked` | Rank matches with bots | `boolean` | — | — | W | — | Whether matches that include bots are ranked, for the humans and the bots (default on). |
| `variants.removed` | Removed from this variant | `select` | — | — | W | — | A base entity the selected variant has removed (its id; the live options). Pick one, then dialog.variants.restore-removed. |

**Actions** (14)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `dialog.variants.close` | Close | R | — | Close the Variants dialog. |
| `dialog.variants.create` | New variant | W | — | Add a variant named by variants.new-name, starting as a copy of the variant selected in the dialog, and switch the editor to it. The first one also names the existing scene "Standard". Undoable. |
| `dialog.variants.edit` | Edit this variant | W | — | Switch the editor to the variant selected in the dialog (same as editor.topbar.variant). |
| `dialog.variants.move-up` | Move up | W | — | Move the selected variant earlier in the lobby's dropdown. The first variant is the lobby's default. |
| `dialog.variants.move-down` | Move down | W | — | Move the selected variant later in the lobby's dropdown. |
| `dialog.variants.make-base` | Make this the base | W | — | Make the selected variant the base scene every other variant is recorded against. What each variant plays does not change. Undoable. |
| `dialog.variants.delete` | Delete variant | D | — | Delete the selected variant and everything it alone changes. Deleting down to one variant removes the variant list entirely. Undo restores it. |
| `dialog.variants.remove-undeclared` | Remove leftover differences | D | — | The setup file holds differences for variants the manifest no longer lists (after a hand edit or a merge), which blocks publishing. Delete those differences; the listed variants and the base are untouched. Undo restores them. |
| `dialog.variants.restore-removed` | Restore | W | — | Bring the base entity chosen in variants.removed back into the selected variant. |
| `dialog.variants.revert-table-room` | Use the base's table & room | W | — | Drop the selected variant's own table, room and environment so it uses the base's again. Undoable. |
| `dialog.variants.revert-seats-zones` | Use the base's seats & zones | W | — | Drop the selected variant's own seats, seat template, zones and player-count rules so it uses the base's again. Undoable. |
| `dialog.variants.revert-snap-points` | Use the base's snap points | W | — | Drop the selected variant's own snap points and grids so it uses the base's again. Undoable. |
| `dialog.variants.ranking-new-season` | Start a new season | W | — | Fully scripted variants: bump the selected variant's ranking season so ranked matches start a fresh ladder once published. The old season stays readable. Asks for confirmation; undoable. |
| `dialog.variants.revert-scene-scripts` | Use the base's scene scripts | W | — | Drop the selected variant's own scene-script attachments so it uses the base's again. Undoable. |

## `dialog.media-crop`

**Crop image** · surface `editor` · singleton (no target)

How it opens: Opens after a cover, gallery image or Re-crop is chosen in Manifest ▸ Details.

**Actions** (3)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `dialog.media-crop.cancel` | Cancel | R | — | Close the crop dialog; the image is not added. |
| `dialog.media-crop.centre-rest` | Centre the rest | W | — | Centre-crop this and every remaining image of a multi-image add, then add them (through the credit gate). |
| `dialog.media-crop.apply` | Apply crop | W | — | Use the framed crop: the image is re-encoded and added through the credit gate. |

## `dialog.bots-host-fallback`

**You are now the host (paused bots)** · surface `table` · singleton (no target)

How it opens: Raised on a player who has just become the host when their device cannot run a seated AI bot; not openable.

**Actions** (5)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `bots.fallback.select.keep-paused` | Keep it paused | R | — | Select "keep the paused bots paused" (the default). Nothing changes until `bots.fallback.choose`. |
| `bots.fallback.select.swap` | Swap it for the scripted bot | R | — | Select "swap each paused AI bot for the game's scripted fallback". Shown only when the game declares one. Nothing changes until `bots.fallback.choose`. |
| `bots.fallback.select.end` | End the table | R | — | Select "end the table". Nothing changes yet: Continue then becomes `bots.fallback.end-table`, which needs the user. |
| `bots.fallback.choose` | Continue | W | — | Apply the selected option: keep the paused AI bots paused (their turns are skipped and a player may take a paused bot's seat), or swap them for the game's scripted fallback in the same seats. Mounted only while one of those two is selected. |
| `bots.fallback.end-table` | Continue | H | — | Requires the user's confirmation in the DiceyTable tab. Leave and end this table: the host disconnects and goes home, and a table nobody is left at closes (one with a named save stays in the owner's tables). If another player is still connected the table passes to them instead. Mounted only while "End the table" is selected. |

## `dialog.pack-picker`

**Room / table picker** · surface `editor` · singleton (no target)

How it opens: Pack assignment ▸ Change… / Choose a… (or Lift out…) on the Room or Table row, or in the Pack tab.

**Fields** (2)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `pack.picker.search` | Search published packs… | `text` | — | — | W | — | Filter the picker's published packs by name, id, owner, summary or licence. |
| `pack.picker.licence-ack` | I understand this pack's licence | `boolean` | — | — | H | — | Requires the user's confirmation in the DiceyTable tab. The licence acknowledgement for the selected third-party pack. It is the human's statement, so an agent cannot tick it through fields_set. |

**Actions** (5)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `pack.picker.close` | Close | R | — | Close the picker without changing anything. |
| `pack.picker.refresh` | Refresh | R | — | Re-read the published packs. |
| `pack.picker.select-built-in` | Default | R | — | Select the Default card: no pin, which plays in the default packs (Modern Room / Square Table). |
| `pack.picker.select` | Select pack | R | `project` | Select a published pack's card (target id = pack id). A third-party pack needs the human's licence acknowledgement before it can be applied. |
| `pack.picker.apply` | Use this pack | W | — | Apply the selection: pin the selected pack (or clear to built-in); for a lift-out, continue to the move review. Undoable. |

## `dialog.pack-move`

**Pack move review** · surface `editor` · singleton (no target)

How it opens: Opens from Extract to a pack…, Detach & vendor…, a lift-out, or the asset pack browser's Copy in.

**Fields** (1)

| Field id | Label | Kind | Unit | Target | Class | Range / options | Description |
|---|---|---|---|---|---|---|---|
| `pack.move.repo-name` | New repository name | `text` | — | — | W | — | Extract only: the name of the PUBLIC GitHub repository created for the extracted pack (defaults to a slug of the pack's name). Shown once GitHub is connected. |

**Actions** (2)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `pack.move.cancel` | Cancel | R | — | Close the review without moving anything. |
| `pack.move.confirm` | Confirm move | D | — | Perform the reviewed move (extract, detach & vendor, copy in, or lift out). An extract first creates a PUBLIC GitHub repository (pack.move.repo-name) and needs GitHub connected. Copy-in and lift-out cut the link to the pack and are not reversible from here. |

## `dialog.pack-updates`

**Referenced packs** · surface `editor` · singleton (no target)

How it opens: Mod ▸ Check pack updates… — lists pinned packs with a newer published version.

**Actions** (2)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `pack.updates.close` | Close | R | — | Close the referenced-packs list. |
| `pack.updates.review` | Review update… | R | `project` | Compute the blast-radius preview of bumping this pack's pin (target id = pack id). Nothing is written until the preview applies. |

## `dialog.pack-verify`

**Verify as a new player** · surface `editor` · singleton (no target)

How it opens: Mod ▸ Verify as a New Player…

**Actions** (2)

| Action id | Label | Class | Target | Description |
|---|---|---|---|---|
| `pack.verify.run` | Verify | R | — | Re-fetch this project and every pinned pack cold from upstream and report what resolves. Reads only. |
| `pack.verify.close` | Close | R | — | Close the verification report. |
