portrayal.dev
Build a rack elevation from Portrayal's devices: place them by RU, front and rear, open any one in Explorer, and keep your racks in this browser.
First seen 2026-11-05 · Last seen 2026-11-05 · Source: webmcp.com
Answer 5 · Act 6 · Transact 0 · Score: Not yet scored
Tool inspector
edit_rack
Apply edits to the open rack, in order: all apply or none, as one undo step. Name what a command creates with as: "srv", then use "@srv" as a later id. Refs and cfgs come from find_devices, port paths from list_free_ports, slot paths and field keys from inspect. fit seats one optic or module; field sets one value. cable.remove and cable.update take select in place of id. Send only what changes. dry_run checks without changing anything.
Page: /rack
Input schema
| Property | Type | Required | Description |
|---|---|---|---|
commands |
array | yes | The edits, in order. All are applied, or none. |
dry_run |
boolean | no | Check the edits and say what they would do, changing nothing. |
Raw JSON schema
{
"type": "object",
"properties": {
"commands": {
"type": "array",
"minItems": 1,
"maxItems": 50,
"items": {
"oneOf": [
{
"type": "object",
"description": "Put a device in the rack with its bottom at a U on a face. A cable manager put over a device bolts onto it. Refused, with the reason, when it does not fit, or when the device has no such configuration.",
"required": [
"op",
"ref",
"face",
"ru"
],
"properties": {
"op": {
"const": "place"
},
"ref": {
"type": "string",
"minLength": 1,
"description": "The device, as the catalogue lists it (its ref)."
},
"cfg": {
"type": "string",
"description": "Which of the device's configurations; its default when left out."
},
"face": {
"enum": [
"front",
"rear"
],
"description": "Which face of the rack: front or rear."
},
"ru": {
"type": "number",
"minimum": 1,
"multipleOf": 0.5,
"description": "Its bottom, in units from 1 at the bottom of the rails, in steps of 0.5 (12.5 is the upper half of U12). A whole-unit device takes a whole unit."
},
"label": {
"type": "string",
"description": "The name shown on the drawing; its model when left out."
},
"as": {
"type": "string",
"minLength": 1,
"description": "A name for what this creates; later commands in the same batch can use \"@name\" as its id."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Move a device to another U and/or face. Its cable managers move with it; a cable manager moved onto a device bolts onto it.",
"required": [
"op",
"id"
],
"properties": {
"op": {
"const": "move"
},
"id": {
"type": "string",
"minLength": 1,
"description": "The id of the device, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"ru": {
"type": "number",
"minimum": 1,
"multipleOf": 0.5,
"description": "Its bottom, in units from 1 at the bottom of the rails, in steps of 0.5 (12.5 is the upper half of U12). A whole-unit device takes a whole unit."
},
"face": {
"enum": [
"front",
"rear"
],
"description": "Which face of the rack: front or rear."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Change a placed device's configuration, label, turned state, roll or setback, or replace all of what is seated in it and all of its part settings at once. A new configuration on its own clears what was seated and set; to change one slot or one setting, use fit or field.",
"required": [
"op",
"id"
],
"properties": {
"op": {
"const": "patch"
},
"id": {
"type": "string",
"minLength": 1,
"description": "The id of the device, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"cfg": {
"type": "string",
"description": "Which of its configurations; it keeps its own when left out."
},
"swaps": {
"type": "object",
"description": "Replaces every swap: {slot path: part ref}. To change one slot, use fit."
},
"fields": {
"type": "object",
"description": "Replaces every field: {part path: {key: value}}. To set one, use field."
},
"label": {
"type": "string",
"description": "The name shown on the drawing."
},
"turned": {
"type": "boolean",
"description": "true when mounted back to front."
},
"setback": {
"type": [
"number",
"null"
],
"description": "Millimetres its faceplate stands behind its rail, into the rack; negative is proud. null for the default of the device or the rack."
},
"heldBy": {
"type": [
"object",
"null"
],
"description": "null frees a device held on a shelf or a rail (a saved one reads {item, at}). Only null is taken yet."
},
"roll": {
"enum": [
90,
180,
270,
null
],
"description": "Degrees it is turned clockwise in its face, as seen from that face: 180 is upside down. null for upright."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Take a device out of the rack. Its cables are kept as loose ends, or removed with it; its cable managers stay on the rack.",
"required": [
"op",
"id"
],
"properties": {
"op": {
"const": "remove"
},
"id": {
"type": "string",
"minLength": 1,
"description": "The id of the device, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"cables": {
"enum": [
"keep",
"remove"
],
"description": "keep its cables as loose ends, or remove them; keep when left out."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Bolt an unattached cable manager onto the device at its U.",
"required": [
"op",
"id"
],
"properties": {
"op": {
"const": "attach"
},
"id": {
"type": "string",
"minLength": 1,
"description": "The id of the cable manager, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Unbolt a cable manager from its device; it stays at its U on its own.",
"required": [
"op",
"id"
],
"properties": {
"op": {
"const": "detach"
},
"id": {
"type": "string",
"minLength": 1,
"description": "The id of the cable manager, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Change the rack frame. A lower height packs devices down and removes from the bottom what still does not fit; their cables are kept as loose ends. A frame set from a rack product refuses a number the product fixes, and takes a rail depth only within its range; customise it first to change those.",
"required": [
"op"
],
"properties": {
"op": {
"const": "frame"
},
"kind": {
"enum": [
"four-post",
"two-post"
],
"description": "four-post or two-post."
},
"heightRU": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"description": "How many U tall, from 1 to 100."
},
"numbering": {
"enum": [
"bottom-up",
"top-down"
],
"description": "Which way the U labels count."
},
"holes": {
"type": "object",
"additionalProperties": false,
"description": "The rail holes: {style, thread}: square or tapped, and the thread of tapped holes.",
"properties": {
"style": {
"enum": [
"square",
"tapped",
"round"
],
"description": "square, tapped or round."
},
"thread": {
"enum": [
"12-24",
"10-32",
"M6",
null
],
"description": "The thread of tapped holes."
}
}
},
"railDepth": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Millimetres between the front and rear rails (four-post)."
},
"usableDepth": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Millimetres from the front rail to the deepest point a device may reach."
},
"startU": {
"type": "integer",
"minimum": 1,
"description": "The number of the first unit, for a rack whose labels do not start at 1."
},
"setback": {
"type": [
"number",
"null"
],
"description": "Millimetres a faceplate stands behind its rail in this rack, for a device that states none; null for flush."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Set the rack frame from a rack product: its ref is kept in the frame, and its height, kind, numbering, rail holes, rail depth and usable depth are copied in. Devices are packed as for a lower frame height. Refused when the catalogue has no such product.",
"required": [
"op",
"ref"
],
"properties": {
"op": {
"const": "frame.apply"
},
"ref": {
"type": "string",
"minLength": 1,
"description": "The rack product, as find_rack_products lists it: vendor/name@major, e.g. apc/ar203a@1."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Stop following the rack product the frame was set from. Every number stays; the frame becomes a generic one that can be edited freely.",
"required": [
"op"
],
"properties": {
"op": {
"const": "frame.customise"
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Rename the rack.",
"required": [
"op",
"name"
],
"properties": {
"op": {
"const": "rename"
},
"name": {
"type": "string",
"description": "The new name."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Seat one part in one bay or cage of a placed device, empty it, or put back what its configuration builds there. Only that slot changes; a part taken out takes what was seated in it, and its settings, with it. Refused, with what the slot takes, when the part does not fit there.",
"required": [
"op",
"id",
"path",
"ref"
],
"properties": {
"op": {
"const": "fit"
},
"id": {
"type": "string",
"minLength": 1,
"description": "The id of the device, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"path": {
"type": "string",
"minLength": 1,
"description": "The bay or cage, as inspecting the device lists it (e.g. port-1, bay-2/module/lc1)."
},
"ref": {
"type": [
"string",
"null"
],
"minLength": 1,
"description": "The part to seat, as the slot lists it; null to empty the slot; \"default\" for what the configuration builds."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Set one setting of one part seated in a placed device, such as a cassette's latch color or an optic's label; null puts it back to the part's default. Its other settings stay. Refused, with the part's settings or choices, when the part has no such setting or does not take the value.",
"required": [
"op",
"id",
"path",
"key",
"value"
],
"properties": {
"op": {
"const": "field"
},
"id": {
"type": "string",
"minLength": 1,
"description": "The id of the device, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"path": {
"type": "string",
"minLength": 1,
"description": "The part, as inspecting the device lists its fields (e.g. bay-1/module, port-1-occupant)."
},
"key": {
"type": "string",
"minLength": 1,
"description": "The setting, as the part's fields list it (e.g. latch-color)."
},
"value": {
"type": [
"string",
"number",
"null"
],
"description": "The new value; null for the default."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Put a narrow rail part (a finger bracket narrower than the opening) on one rail, its bottom at a U. It takes that rail only, so another can stand on the other rail at the same U.",
"required": [
"op",
"ref",
"face",
"ru",
"side"
],
"properties": {
"op": {
"const": "side.place"
},
"ref": {
"type": "string",
"minLength": 1,
"description": "The part, as the catalogue lists it (its ref)."
},
"cfg": {
"type": "string",
"description": "Which of the part's configurations; its default when left out."
},
"face": {
"enum": [
"front",
"rear"
],
"description": "Which face of the rack: front or rear."
},
"ru": {
"type": "integer",
"minimum": 1,
"description": "The U its bottom sits in, counted from 1 at the bottom of the rails."
},
"side": {
"enum": [
"left",
"right"
],
"description": "Which rail it is on, as seen from its face: left or right."
},
"label": {
"type": "string",
"description": "The name shown on the drawing; its model when left out."
},
"as": {
"type": "string",
"minLength": 1,
"description": "A name for what this creates; later commands in the same batch can use \"@name\" as its id."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Put a narrow rail part on the left or right rail, or (side null) across both, where it bolts onto a device behind it.",
"required": [
"op",
"id",
"side"
],
"properties": {
"op": {
"const": "side.set"
},
"id": {
"type": "string",
"minLength": 1,
"description": "The id of the rail part, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"side": {
"enum": [
"left",
"right",
null
],
"description": "left, right, or null for across both rails."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Stand a zero-U part (a vertical cable manager, or a zero-U PDU) beside the rack at an upright, its bottom level with a U. It takes no rack unit; the lane beside that upright runs through a duct. Refused, with the reason, when it does not fit.",
"required": [
"op",
"ref",
"at",
"ru"
],
"properties": {
"op": {
"const": "zerou.place"
},
"ref": {
"type": "string",
"minLength": 1,
"description": "The part, as the catalogue lists it (its ref); it stands beside the rack."
},
"cfg": {
"type": "string",
"description": "Which of the part's configurations; its default when left out."
},
"at": {
"type": "string",
"minLength": 1,
"description": "Its upright: left or right (two-post); left-front, right-front, left-rear or right-rear (four-post)."
},
"ru": {
"type": "integer",
"minimum": 1,
"description": "The U its bottom is level with, counted from 1 at the bottom of the rails."
},
"between": {
"type": "boolean",
"description": "true when it stands between this rack and the next one, serving both."
},
"label": {
"type": "string",
"description": "The name shown on the drawing; its model when left out."
},
"as": {
"type": "string",
"minLength": 1,
"description": "A name for what this creates; later commands in the same batch can use \"@name\" as its id."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Move a part beside the rack to another upright or U, say whether it stands between racks, or rename it.",
"required": [
"op",
"id"
],
"properties": {
"op": {
"const": "zerou.update"
},
"id": {
"type": "string",
"minLength": 1,
"description": "The id of the part beside the rack, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"at": {
"type": "string",
"minLength": 1,
"description": "Its upright: left or right (two-post); left-front, right-front, left-rear or right-rear (four-post)."
},
"ru": {
"type": "integer",
"minimum": 1,
"description": "The U its bottom is level with, counted from 1 at the bottom of the rails."
},
"between": {
"type": "boolean",
"description": "true when it stands between this rack and the next one, serving both."
},
"label": {
"type": "string",
"description": "The name shown on the drawing."
},
"swaps": {
"type": "object",
"description": "Replaces every swap: {slot path: part ref}. To change one slot, use fit."
},
"fields": {
"type": "object",
"description": "Replaces every field: {part path: {key: value}}. To set one, use field."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Hang a part beside the rack (a zero-U PDU) on brackets placed there, or take it off them. Hung, it stands where the brackets hold it, and moves when one moves. Refused, with the distance, when its mount points do not meet their slots.",
"required": [
"op",
"id",
"on"
],
"properties": {
"op": {
"const": "zerou.hang"
},
"id": {
"type": "string",
"minLength": 1,
"description": "The id of the part beside the rack, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"on": {
"type": [
"array",
"null"
],
"minItems": 1,
"description": "The ids of the brackets that hold it, or null to take it off them.",
"items": {
"type": "string",
"minLength": 1,
"description": "A bracket id, or \"@name\" from earlier in this batch."
}
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Set what one part of a placed device or of a part beside the rack is, such as a status lamp lit, a port lamp up, a PSU or fan lamp ok, or an outlet of a PDU on or off; null clears it. `inspect` of the device lists every path it can set and what each can be (`settable`). Refused, with what the device does declare, when the path or the state is not one of them.",
"required": [
"op",
"id",
"path",
"state"
],
"properties": {
"op": {
"const": "state.set"
},
"id": {
"type": "string",
"minLength": 1,
"description": "The id of the device or part beside the rack, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"path": {
"type": "string",
"minLength": 1,
"description": "The part, by its path on the device, as `inspect` lists it under settable (e.g. led-sys, led-port-3, outlet-a1)."
},
"state": {
"type": [
"string",
"null"
],
"minLength": 1,
"description": "The state name, as the part declares it (e.g. on, off); null to clear."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Store readings taken from a device or a part beside the rack, with where they came from and when; null clears them.",
"required": [
"op",
"id",
"readings"
],
"properties": {
"op": {
"const": "readings.set"
},
"id": {
"type": "string",
"minLength": 1,
"description": "The id of the device or part beside the rack, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"readings": {
"type": [
"object",
"null"
],
"description": "{source, at, values}: where they came from, an RFC 3339 time, and part path to {current-a, power-w, energy-kwh}; null to clear."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Set what a display of a placed device or of a part beside the rack shows: text (lines, cut to its columns and rows), digits (a segment display) or an image (fitted to the window; a GIF shows its first frame); null clears it. Refused, with the displays it has, when the path is no display or the display cannot show that. The displays query lists them.",
"required": [
"op",
"id",
"path",
"content"
],
"properties": {
"op": {
"const": "display.set"
},
"id": {
"type": "string",
"minLength": 1,
"description": "The id of the device or part beside the rack, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"path": {
"type": "string",
"minLength": 1,
"description": "The display, by its path as the displays query lists it (e.g. network-module/module/lcd)."
},
"content": {
"type": [
"object",
"null"
],
"additionalProperties": false,
"description": "What it shows: {text: [lines]}, {digits: \"04\"} or {image: data URL or library path}; null clears.",
"properties": {
"text": {
"type": "array",
"items": {
"type": "string"
},
"description": "The lines of text, for a pixel or character display."
},
"digits": {
"type": "string",
"description": "The digits of a segment display: 0 to 9, a to f, a space for blank; right-aligned."
},
"image": {
"type": "string",
"minLength": 1,
"description": "A data URL of an SVG, PNG, JPEG or GIF up to 512 KiB, or a library asset path."
}
}
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Take a part away from beside the rack. Its cables (the cords on a PDU's outlets) are kept as loose ends, or removed with it.",
"required": [
"op",
"id"
],
"properties": {
"op": {
"const": "zerou.remove"
},
"id": {
"type": "string",
"minLength": 1,
"description": "The id of the part beside the rack, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"cables": {
"enum": [
"keep",
"remove"
],
"description": "keep its cables as loose ends, or remove them; keep when left out."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Run a cable between two free ports. Refused when a port already has a cable or a device is gone.",
"required": [
"op",
"a",
"b"
],
"properties": {
"op": {
"const": "cable.add"
},
"a": {
"type": "object",
"required": [
"item",
"path",
"view"
],
"additionalProperties": false,
"description": "One end: {item, path, view}: a device id or a zeroU id (a PDU outlet), a path from list_free_ports, and front or rear.",
"properties": {
"item": {
"type": "string",
"minLength": 1,
"description": "The id of the device or part beside the rack, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"path": {
"type": "string",
"minLength": 1,
"description": "The port or outlet, as the free ports name it (e.g. port-1, outlet-a2)."
},
"view": {
"enum": [
"front",
"rear"
],
"description": "Which of the device's own panels the port is on: front or rear."
},
"plug": {
"type": "string",
"minLength": 1,
"description": "The plug or lug at this end, as a component ref (e.g. generic/c14-plug@1). Only for a port that takes more than one."
}
}
},
"b": {
"type": "object",
"required": [
"item",
"path",
"view"
],
"additionalProperties": false,
"description": "The other end: {item, path, view}, as for a.",
"properties": {
"item": {
"type": "string",
"minLength": 1,
"description": "The id of the device or part beside the rack, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"path": {
"type": "string",
"minLength": 1,
"description": "The port or outlet, as the free ports name it (e.g. port-1, outlet-a2)."
},
"view": {
"enum": [
"front",
"rear"
],
"description": "Which of the device's own panels the port is on: front or rear."
},
"plug": {
"type": "string",
"minLength": 1,
"description": "The plug or lug at this end, as a component ref (e.g. generic/c14-plug@1). Only for a port that takes more than one."
}
}
},
"media": {
"enum": [
"",
"os2",
"om3",
"om4",
"om5",
"cat6",
"cat6a",
"dac",
"aoc",
"power",
"ground"
],
"description": "The cable type: os2, om3, om4, om5, cat6, cat6a, dac, aoc, power, ground, or \"\" for not known."
},
"purpose": {
"type": "string",
"description": "What the cable is for, in a word or two (e.g. uplink, management)."
},
"label": {
"type": "string",
"description": "The text on its tags. Its id is used when there is none."
},
"length": {
"type": [
"object",
"null"
],
"required": [
"value"
],
"additionalProperties": false,
"description": "How long: {value, unit} with unit m or ft (m when left out), or null for not known.",
"properties": {
"value": {
"type": "number",
"exclusiveMinimum": 0,
"description": "The length, above 0."
},
"unit": {
"enum": [
"m",
"ft"
],
"description": "Metres (m) or feet (ft); m when left out."
},
"source": {
"type": "string",
"description": "Where the length came from; \"entered\" when left out."
}
}
},
"color": {
"type": [
"string",
"null"
],
"description": "Its own color, as # and three or six hex digits (e.g. #2bb3c8); null for none of its own, so that its ends, its type or its media decide."
},
"as": {
"type": "string",
"minLength": 1,
"description": "A name for what this creates; later commands in the same batch can use \"@name\" as its id."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Change a cable's type, purpose, label, length or color, or move either end to another port. A moved end keeps the cable's id and everything else about it; refused when the new port already has a cable.",
"required": [
"op"
],
"properties": {
"op": {
"const": "cable.update"
},
"id": {
"type": "string",
"minLength": 1,
"description": "The id of the cable, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"a": {
"type": "object",
"required": [
"item",
"path",
"view"
],
"additionalProperties": false,
"description": "Moves end a to another port: {item, path, view}. The cable keeps its id, media, label and length.",
"properties": {
"item": {
"type": "string",
"minLength": 1,
"description": "The id of the device or part beside the rack, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"path": {
"type": "string",
"minLength": 1,
"description": "The port or outlet, as the free ports name it (e.g. port-1, outlet-a2)."
},
"view": {
"enum": [
"front",
"rear"
],
"description": "Which of the device's own panels the port is on: front or rear."
},
"plug": {
"type": "string",
"minLength": 1,
"description": "The plug or lug at this end, as a component ref (e.g. generic/c14-plug@1). Only for a port that takes more than one."
}
}
},
"b": {
"type": "object",
"required": [
"item",
"path",
"view"
],
"additionalProperties": false,
"description": "Moves end b to another port: {item, path, view}, as for a.",
"properties": {
"item": {
"type": "string",
"minLength": 1,
"description": "The id of the device or part beside the rack, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"path": {
"type": "string",
"minLength": 1,
"description": "The port or outlet, as the free ports name it (e.g. port-1, outlet-a2)."
},
"view": {
"enum": [
"front",
"rear"
],
"description": "Which of the device's own panels the port is on: front or rear."
},
"plug": {
"type": "string",
"minLength": 1,
"description": "The plug or lug at this end, as a component ref (e.g. generic/c14-plug@1). Only for a port that takes more than one."
}
}
},
"media": {
"enum": [
"",
"os2",
"om3",
"om4",
"om5",
"cat6",
"cat6a",
"dac",
"aoc",
"power",
"ground"
],
"description": "The cable type: os2, om3, om4, om5, cat6, cat6a, dac, aoc, power, ground, or \"\" for not known."
},
"purpose": {
"type": "string",
"description": "What the cable is for, in a word or two (e.g. uplink, management)."
},
"label": {
"type": "string",
"description": "The text on its tags. Its id is used when there is none."
},
"length": {
"type": [
"object",
"null"
],
"required": [
"value"
],
"additionalProperties": false,
"description": "How long: {value, unit} with unit m or ft (m when left out), or null for not known.",
"properties": {
"value": {
"type": "number",
"exclusiveMinimum": 0,
"description": "The length, above 0."
},
"unit": {
"enum": [
"m",
"ft"
],
"description": "Metres (m) or feet (ft); m when left out."
},
"source": {
"type": "string",
"description": "Where the length came from; \"entered\" when left out."
}
}
},
"color": {
"type": [
"string",
"null"
],
"description": "Its own color, as # and three or six hex digits (e.g. #2bb3c8); null for none of its own, so that its ends, its type or its media decide."
},
"straps": {
"type": [
"object",
"null"
],
"additionalProperties": false,
"description": "The straps of this cable alone: {anchors: false} for none tying it to a tray it passes; null for the default.",
"properties": {
"anchors": {
"type": "boolean",
"description": "false for no strap tying it to a tray it lies on."
}
}
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
},
"select": {
"type": "object",
"description": "In place of id: {item}, {item, path, view}, {loose: true}, {purpose} or {media}. Reads the rack as it was before this batch."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Delete a cable.",
"required": [
"op"
],
"properties": {
"op": {
"const": "cable.remove"
},
"id": {
"type": "string",
"minLength": 1,
"description": "The id of the cable, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
},
"select": {
"type": "object",
"description": "In place of id: {item}, {item, path, view}, {loose: true}, {purpose} or {media}. Reads the rack as it was before this batch."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Route a cable by hand through the waypoints given, in order. Its routed length follows. A waypoint may name a part beside the rack: its duct (the lane run through it) or a window such as pass-through-2. A pathway may be named as the route summary says it: \"ring 3\", \"left end ring\", \"front-duct\" for duct. Refused for a pathway or gutter the rack lacks; the refusal lists what exists.",
"required": [
"op",
"id",
"route"
],
"properties": {
"op": {
"const": "cable.route"
},
"id": {
"type": "string",
"minLength": 1,
"description": "The id of the cable, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"route": {
"type": "array",
"description": "In order: {item, via} for a pathway on a device or a part beside the rack (its duct, a window), {lane, ru} for a gutter at a U.",
"items": {
"type": "object",
"additionalProperties": false,
"description": "One waypoint: {item, via} for a pathway on a device, or {lane, ru} for a gutter at a U.",
"properties": {
"item": {
"type": "string",
"minLength": 1,
"description": "The device the pathway is on, with via."
},
"via": {
"type": "string",
"minLength": 1,
"description": "The pathway on that device's drawing, such as a ring or a duct, with item."
},
"lane": {
"type": "string",
"minLength": 1,
"description": "The gutter beside the rails, with ru. A four-post also has the lane between a rail and a part beside it, such as left-rear-inner."
},
"ru": {
"type": "integer",
"description": "The U the gutter is crossed at, with lane."
}
},
"dependentRequired": {
"item": [
"via"
],
"via": [
"item"
],
"lane": [
"ru"
],
"ru": [
"lane"
]
}
}
},
"summary": {
"type": "string",
"description": "How the step is described in Undo and the notice; set by the caller."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Say where the spare length of a cable is stored: in a finger duct its route uses (a horizontal manager, a vertical manager beside the rack, a rack-face bracket), on a tray it rests on, or at one of its ends. A ring, a pass-through and a pathway off its route hold none. With no value the place takes what is left. A duct is counted against its capacity, stated or estimated. Refused, with where spare can go, for a place that cannot hold it, for more spare than it has, and on a short cable.",
"required": [
"op",
"id",
"at"
],
"properties": {
"op": {
"const": "cable.slack"
},
"id": {
"type": "string",
"minLength": 1,
"description": "The id of the cable, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"at": {
"type": "object",
"additionalProperties": false,
"description": "The place: {item, via} for a duct or a tray on a device or on a part beside the rack, or {end} for an end of the cable.",
"properties": {
"item": {
"type": "string",
"minLength": 1,
"description": "The device or the part beside the rack the duct or tray is on, with via."
},
"via": {
"type": "string",
"minLength": 1,
"description": "The duct or tray on it, with item: duct, front-duct, rear-duct, duct-rear or a tray id."
},
"end": {
"enum": [
"a",
"b"
],
"description": "The end of the cable the spare is left at: a or b."
}
}
},
"value": {
"type": "number",
"exclusiveMinimum": 0,
"description": "How much is stored there, above 0; the rest when left out."
},
"unit": {
"enum": [
"m",
"ft"
],
"description": "Metres (m) or feet (ft); m when left out."
},
"form": {
"enum": [
"coil",
"serpentine",
"spool"
],
"description": "How it is stored: coil, serpentine or spool (a tray only); a coil on a tray and a loop in a duct when left out."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Take back where the spare of a cable is stored: one place, or with no place all of them, so that nothing is said of it.",
"required": [
"op",
"id"
],
"properties": {
"op": {
"const": "cable.slack.clear"
},
"id": {
"type": "string",
"minLength": 1,
"description": "The id of the cable, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"at": {
"type": "object",
"additionalProperties": false,
"description": "The place to clear: {item, via} or {end}; all of them when left out.",
"properties": {
"item": {
"type": "string",
"minLength": 1,
"description": "The device the tray is on, with via."
},
"via": {
"type": "string",
"minLength": 1,
"description": "The tray on that device, with item."
},
"end": {
"enum": [
"a",
"b"
],
"description": "The end of the cable: a or b."
}
}
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Pin how a cable lies in one pathway: which face of a tray it lies on, and its place across the pathway. null unpins either; a key left out is kept. The face is acted on by the routes; the position is kept for when lay order is built.",
"required": [
"op",
"id",
"at"
],
"properties": {
"op": {
"const": "cable.lay"
},
"id": {
"type": "string",
"minLength": 1,
"description": "The id of the cable, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"at": {
"type": "object",
"required": [
"item",
"via"
],
"additionalProperties": false,
"description": "The pathway: {item, via}, a tray, ring or duct on a device.",
"properties": {
"item": {
"type": "string",
"minLength": 1,
"description": "The device the pathway is on."
},
"via": {
"type": "string",
"minLength": 1,
"description": "The pathway on that device."
}
}
},
"position": {
"type": [
"integer",
"null"
],
"minimum": 1,
"description": "Its place across the pathway, counted from 1; null to unpin it."
},
"face": {
"enum": [
"top",
"underside",
null
],
"description": "The face of a tray it lies on, as the part names its own: top or underside; null unpins it. Refused on a ring or a duct."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Drop a hand-made route; the cable takes its own route again.",
"required": [
"op",
"id"
],
"properties": {
"op": {
"const": "cable.route.reset"
},
"id": {
"type": "string",
"minLength": 1,
"description": "The id of the cable, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"summary": {
"type": "string",
"description": "How the step is described in Undo and the notice; set by the caller."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Bundle two or more cables sharing part of their route. It runs where they run together, unless given a route. A cable whose own route does not meet a given route joins and leaves it at the points nearest its two ports. Refused for a bundled cable.",
"required": [
"op",
"cables"
],
"properties": {
"op": {
"const": "bundle.create"
},
"cables": {
"type": "array",
"minItems": 2,
"description": "The cables to bundle, two or more, by id, in combing order.",
"items": {
"type": "string",
"minLength": 1,
"description": "A cable id, or \"@name\" from earlier in this batch."
}
},
"label": {
"type": "string",
"description": "The name on its tags; \"Bundle <number>\" is used when there is none. Empty when left out."
},
"number": {
"type": "integer",
"minimum": 1,
"description": "Its number, unique in the rack; one past the highest in use when left out."
},
"route": {
"type": "array",
"description": "Its route by hand, in order: {item, via} or {lane, ru}. Worked out from where its cables run together when left out.",
"items": {
"type": "object",
"additionalProperties": false,
"description": "One waypoint: {item, via} for a pathway on a device, or {lane, ru} for a gutter at a U.",
"properties": {
"item": {
"type": "string",
"minLength": 1,
"description": "The device the pathway is on, with via."
},
"via": {
"type": "string",
"minLength": 1,
"description": "The pathway on that device's drawing, such as a ring or a duct, with item."
},
"lane": {
"type": "string",
"minLength": 1,
"description": "The gutter beside the rails, with ru. A four-post also has the lane between a rail and a part beside it, such as left-rear-inner."
},
"ru": {
"type": "integer",
"description": "The U the gutter is crossed at, with lane."
}
},
"dependentRequired": {
"item": [
"via"
],
"via": [
"item"
],
"lane": [
"ru"
],
"ru": [
"lane"
]
}
}
},
"straps": {
"type": [
"object",
"null"
],
"additionalProperties": false,
"description": "Its straps: {every, breakout, anchors}, any of them. every is {value, unit} in in or mm, or null for no spacing straps. null for the defaults.",
"properties": {
"every": {
"type": [
"object",
"null"
],
"required": [
"value",
"unit"
],
"additionalProperties": false,
"description": "The spacing, {value, unit}, or null for no spacing straps. Every 12 in when never set.",
"properties": {
"value": {
"type": "number",
"exclusiveMinimum": 0,
"description": "How far apart, above 0."
},
"unit": {
"enum": [
"in",
"mm"
],
"description": "Inches (in) or millimetres (mm)."
}
}
},
"breakout": {
"type": "boolean",
"description": "A strap beside each point where a cable joins or leaves. On when never set, unless every is null."
},
"anchors": {
"type": "boolean",
"description": "A strap at each tray tie slot the bundle lies on. On when never set, unless every is null."
}
}
},
"as": {
"type": "string",
"minLength": 1,
"description": "A name for what this creates; later commands in the same batch can use \"@name\" as its id."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Add cables to a bundle. A cable already in it rides the whole bundle again. Refused for a cable in another bundle.",
"required": [
"op",
"id",
"cables"
],
"properties": {
"op": {
"const": "bundle.add"
},
"id": {
"type": "string",
"minLength": 1,
"description": "The id of the bundle, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"cables": {
"type": "array",
"minItems": 1,
"description": "The cables to add, by id.",
"items": {
"type": "string",
"minLength": 1,
"description": "A cable id, or \"@name\" from earlier in this batch."
}
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Take a cable out of a bundle. With at, it stays bundled up to that waypoint, then runs on its own to one end.",
"required": [
"op",
"id",
"cable"
],
"properties": {
"op": {
"const": "bundle.peel"
},
"id": {
"type": "string",
"minLength": 1,
"description": "The id of the bundle, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"cable": {
"type": "string",
"minLength": 1,
"description": "The id of the cable, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"at": {
"type": "object",
"additionalProperties": false,
"description": "A waypoint on the bundle's route where the cable leaves it: {item, via} or {lane, ru}. When left out, it leaves the bundle altogether.",
"properties": {
"item": {
"type": "string",
"minLength": 1,
"description": "The device the pathway is on, with via."
},
"via": {
"type": "string",
"minLength": 1,
"description": "The pathway on that device's drawing, such as a ring or a duct, with item."
},
"lane": {
"type": "string",
"minLength": 1,
"description": "The gutter beside the rails, with ru. A four-post also has the lane between a rail and a part beside it, such as left-rear-inner."
},
"ru": {
"type": "integer",
"description": "The U the gutter is crossed at, with lane."
}
},
"dependentRequired": {
"item": [
"via"
],
"via": [
"item"
],
"lane": [
"ru"
],
"ru": [
"lane"
]
}
},
"end": {
"enum": [
"a",
"b"
],
"description": "The end it heads for after it leaves at that waypoint; the end whose port is nearer when left out."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Change a bundle's label, number or strap spacing, or route it by hand. A cable whose own route does not meet a route given by hand joins and leaves it at the points nearest its two ports. A route of null works the route out again from its cables.",
"required": [
"op",
"id"
],
"properties": {
"op": {
"const": "bundle.update"
},
"id": {
"type": "string",
"minLength": 1,
"description": "The id of the bundle, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"label": {
"type": "string",
"description": "The name on its tags; empty for \"Bundle <number>\". Kept when left out."
},
"number": {
"type": "integer",
"minimum": 1,
"description": "Its number, unique in the rack. Kept when left out."
},
"straps": {
"type": [
"object",
"null"
],
"additionalProperties": false,
"description": "Its straps: {every, breakout, anchors}; a key left out stays as it is. every is {value, unit} or null. null for the defaults.",
"properties": {
"every": {
"type": [
"object",
"null"
],
"required": [
"value",
"unit"
],
"additionalProperties": false,
"description": "The spacing, {value, unit}, or null for no spacing straps. Every 12 in when never set.",
"properties": {
"value": {
"type": "number",
"exclusiveMinimum": 0,
"description": "How far apart, above 0."
},
"unit": {
"enum": [
"in",
"mm"
],
"description": "Inches (in) or millimetres (mm)."
}
}
},
"breakout": {
"type": "boolean",
"description": "A strap beside each point where a cable joins or leaves. On when never set, unless every is null."
},
"anchors": {
"type": "boolean",
"description": "A strap at each tray tie slot the bundle lies on. On when never set, unless every is null."
}
}
},
"route": {
"type": [
"array",
"null"
],
"description": "Its route by hand, in order, or null to work it out again from its cables. Kept when left out.",
"items": {
"type": "object",
"additionalProperties": false,
"description": "One waypoint: {item, via} for a pathway on a device, or {lane, ru} for a gutter at a U.",
"properties": {
"item": {
"type": "string",
"minLength": 1,
"description": "The device the pathway is on, with via."
},
"via": {
"type": "string",
"minLength": 1,
"description": "The pathway on that device's drawing, such as a ring or a duct, with item."
},
"lane": {
"type": "string",
"minLength": 1,
"description": "The gutter beside the rails, with ru. A four-post also has the lane between a rail and a part beside it, such as left-rear-inner."
},
"ru": {
"type": "integer",
"description": "The U the gutter is crossed at, with lane."
}
},
"dependentRequired": {
"item": [
"via"
],
"via": [
"item"
],
"lane": [
"ru"
],
"ru": [
"lane"
]
}
}
},
"summary": {
"type": "string",
"description": "How the step is described in Undo and the notice; set by the caller."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
},
{
"type": "object",
"description": "Dissolve a bundle. Its cables are kept and follow their own routes again.",
"required": [
"op",
"id"
],
"properties": {
"op": {
"const": "bundle.remove"
},
"id": {
"type": "string",
"minLength": 1,
"description": "The id of the bundle, as the rack's description lists it, or \"@name\" from earlier in this batch."
},
"rack": {
"type": "string",
"description": "Edits go to the rack that is open; describe_rack names it."
}
},
"additionalProperties": false
}
]
},
"description": "The edits, in order. All are applied, or none."
},
"dry_run": {
"type": "boolean",
"description": "Check the edits and say what they would do, changing nothing."
}
},
"required": [
"commands"
],
"additionalProperties": false
}
Similar websites
morphus.myles4miles.chatgpt.site
Morphus is an AI-native workspace for designing worlds and generating playable game experiences.
damnpdfs.com
Install the DamnPDFs Codex plugin, pair a browser workspace and use PDF, image and file tools from your coding agent. Includes setup and privacy limits.
insignifi4nt.github.io
broCAD/M: local-first CAD and CAM for parametric design, wire EDM planning, simulation and controller export.
cabinet.varera.studio
The Cartographer's Cabinet