@iniesta8888/agent-live-pi-adapter 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.
Files changed (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +9 -0
  3. package/dist/adapter.js +2375 -0
  4. package/package.json +23 -0
  5. package/web/app.d.ts +1 -0
  6. package/web/app.js +1317 -0
  7. package/web/index.html +45 -0
  8. package/web/office.js +350 -0
  9. package/web/sprites.js +185 -0
  10. package/web/style.css +288 -0
  11. package/web/v2/bootstrap.js +276 -0
  12. package/web/v2/content/README.md +17 -0
  13. package/web/v2/content/agent-skins/studio-team.json +33 -0
  14. package/web/v2/content/agent-skins/tiny-developers.json +33 -0
  15. package/web/v2/content/atmospheres/default.json +13 -0
  16. package/web/v2/content/atmospheres/rainy-night.json +37 -0
  17. package/web/v2/content/catalog.json +14 -0
  18. package/web/v2/content/component-library/activity-implementations.json +873 -0
  19. package/web/v2/content/component-library/activity-recipes.json +25 -0
  20. package/web/v2/content/component-library/agent-profile-templates.json +18 -0
  21. package/web/v2/content/component-library/catalog.json +38 -0
  22. package/web/v2/content/component-library/npc-templates.json +42 -0
  23. package/web/v2/content/component-library/props.json +41 -0
  24. package/web/v2/content/environments/local-office.json +31 -0
  25. package/web/v2/content/environments/rainy-night.json +28 -0
  26. package/web/v2/content/environments/static-office.json +27 -0
  27. package/web/v2/content/layouts/boardroom-office.json +122 -0
  28. package/web/v2/content/layouts/demo-office.json +88 -0
  29. package/web/v2/content/layouts/lively-office.json +96 -0
  30. package/web/v2/content/layouts/old-school-office.json +154 -0
  31. package/web/v2/content/layouts/tech-open-office.json +132 -0
  32. package/web/v2/content/life-activities/boardroom-routines.json +67 -0
  33. package/web/v2/content/life-activities/none.json +10 -0
  34. package/web/v2/content/life-activities/office-basics.json +39 -0
  35. package/web/v2/content/life-activities/old-school-routines.json +74 -0
  36. package/web/v2/content/life-activities/tech-office-routines.json +148 -0
  37. package/web/v2/content/npcs/boardroom-staff.json +54 -0
  38. package/web/v2/content/npcs/none.json +10 -0
  39. package/web/v2/content/npcs/office-staff.json +25 -0
  40. package/web/v2/content/npcs/old-school-staff.json +39 -0
  41. package/web/v2/content/npcs/tech-office-staff.json +40 -0
  42. package/web/v2/content/official-offices/boardroom-office.json +25 -0
  43. package/web/v2/content/official-offices/old-school-office.json +25 -0
  44. package/web/v2/content/official-offices/tech-open-office.json +25 -0
  45. package/web/v2/content/presets/boardroom-office.json +21 -0
  46. package/web/v2/content/presets/cozy-studio.json +19 -0
  47. package/web/v2/content/presets/demo-office.json +19 -0
  48. package/web/v2/content/presets/lively-office.json +19 -0
  49. package/web/v2/content/presets/night-shift.json +19 -0
  50. package/web/v2/content/presets/old-school-office.json +20 -0
  51. package/web/v2/content/presets/refined-demo.json +20 -0
  52. package/web/v2/content/presets/tech-open-office.json +21 -0
  53. package/web/v2/content/props/default-office.json +23 -0
  54. package/web/v2/content/props/extended-office.json +39 -0
  55. package/web/v2/content/props/tech-office.json +28 -0
  56. package/web/v2/content/styles/pixel-classic.json +160 -0
  57. package/web/v2/content/styles/warm-studio.json +150 -0
  58. package/web/v2/environment-runtime.d.ts +1 -0
  59. package/web/v2/environment-runtime.js +138 -0
  60. package/web/v2/graph-validator.d.ts +55 -0
  61. package/web/v2/graph-validator.js +225 -0
  62. package/web/v2/i18n.js +54 -0
  63. package/web/v2/locales/en.json +209 -0
  64. package/web/v2/locales/zh-CN.json +52 -0
  65. package/web/v2/office-engine.d.ts +1 -0
  66. package/web/v2/office-engine.js +145 -0
  67. package/web/v2/office-renderer.d.ts +1 -0
  68. package/web/v2/office-renderer.js +843 -0
  69. package/web/v2/parity.html +10 -0
  70. package/web/v2/parity.js +82 -0
  71. package/web/v2/sprite-renderer.d.ts +1 -0
  72. package/web/v2/sprite-renderer.js +242 -0
  73. package/web/v2/static-content.js +48 -0
  74. package/web/v2/style.css +140 -0
  75. package/web/v2.html +68 -0
@@ -0,0 +1,25 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "kind": "activity-recipe-library",
4
+ "id": "builtin/activity-recipe-library",
5
+ "version": "1.0.0",
6
+ "contract": "single-office-v1",
7
+ "entries": [
8
+ { "id": "builtin/boss-briefing", "name": "Boss briefing", "description": "A boss presents priorities to the room.", "tags": ["meeting", "leadership"], "participantKinds": ["npc"], "participantRoles": ["boss"], "capabilities": ["plan", "communicate"], "interruptible": false },
9
+ { "id": "builtin/boss-plan-round", "name": "Boss planning round", "description": "A boss checks the planning board and returns to the executive desk.", "tags": ["leadership", "planning", "office-life"], "participantKinds": ["npc"], "participantRoles": ["boss"], "capabilities": ["plan"], "interruptible": false },
10
+ { "id": "builtin/boss-water-break", "name": "Boss water break", "description": "A boss takes a short water break and returns to the executive desk.", "tags": ["leadership", "break", "water"], "participantKinds": ["npc"], "participantRoles": ["boss"], "capabilities": ["water"], "interruptible": false },
11
+ { "id": "builtin/boss-cheer-round", "name": "Boss encouragement round", "description": "A boss walks through the work area and encourages the team.", "tags": ["leadership", "social", "office-life"], "participantKinds": ["npc"], "participantRoles": ["boss"], "capabilities": ["communicate"], "interruptible": false },
12
+ { "id": "builtin/briefing-support", "name": "Briefing support", "description": "A secretary prepares meeting materials.", "tags": ["meeting", "administration"], "participantKinds": ["npc"], "participantRoles": ["secretary"], "capabilities": ["research"], "interruptible": false },
13
+ { "id": "builtin/cleaning-round", "name": "Cleaning round", "description": "A cleaner visits configured cleaning stops.", "tags": ["service", "cleaning"], "participantKinds": ["npc"], "participantRoles": ["cleaner"], "capabilities": [], "interruptible": false },
14
+ { "id": "builtin/colleague-chat", "name": "Colleague chat", "description": "Two idle people, including background colleagues, have an informal conversation.", "tags": ["social", "break"], "participantKinds": ["agent", "npc"], "minimumAgents": 2, "capabilities": ["collaborate"], "interruptible": true },
15
+ { "id": "builtin/corridor-chat", "name": "Corridor chat", "description": "Two idle agents chat in a corridor.", "tags": ["social", "break", "corridor"], "participantKinds": ["agent"], "minimumAgents": 2, "capabilities": ["collaborate"], "interruptible": true },
16
+ { "id": "builtin/facility-round", "name": "Facility round", "description": "A custodian checks shared office facilities.", "tags": ["service", "maintenance"], "participantKinds": ["npc"], "participantRoles": ["cleaner"], "capabilities": [], "interruptible": false },
17
+ { "id": "builtin/get-water", "name": "Get water", "description": "An idle agent or background colleague visits a water facility.", "tags": ["break", "water"], "participantKinds": ["agent", "npc"], "participantRoles": ["colleague"], "capabilities": ["water"], "interruptible": true },
18
+ { "id": "builtin/outside-walk", "name": "Outside walk", "description": "Two idle people, including background colleagues, leave for a short walk.", "tags": ["social", "break", "outside"], "participantKinds": ["agent", "npc"], "participantRoles": ["colleague"], "minimumAgents": 2, "capabilities": [], "interruptible": true },
19
+ { "id": "builtin/paperwork-round", "name": "Paperwork round", "description": "A receptionist processes calls, copies and filing.", "tags": ["service", "paperwork"], "participantKinds": ["npc"], "participantRoles": ["receptionist"], "capabilities": ["research", "communicate"], "interruptible": false },
20
+ { "id": "builtin/plant-watering", "name": "Plant watering", "description": "A cleaner waters the office plants and checks their condition.", "tags": ["service", "plants", "office-life"], "participantKinds": ["npc"], "participantRoles": ["cleaner"], "capabilities": [], "interruptible": false },
21
+ { "id": "builtin/phone-break", "name": "Phone break", "description": "An idle coding agent or background colleague takes a short phone break.", "tags": ["break", "phone"], "participantKinds": ["agent", "npc"], "participantRoles": ["colleague"], "capabilities": [], "interruptible": true },
22
+ { "id": "builtin/refreshment-round", "name": "Refreshment round", "description": "An attendant prepares and serves refreshments.", "tags": ["service", "meeting", "coffee"], "participantKinds": ["npc"], "participantRoles": ["attendant"], "capabilities": ["coffee"], "interruptible": false },
23
+ { "id": "builtin/restroom-break", "name": "Restroom break", "description": "An idle agent or background colleague takes a restroom break.", "tags": ["break", "restroom"], "participantKinds": ["agent", "npc"], "participantRoles": ["colleague"], "capabilities": [], "interruptible": true }
24
+ ]
25
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "kind": "agent-profile-template-library",
4
+ "id": "builtin/agent-profile-template-library",
5
+ "version": "1.0.0",
6
+ "contract": "single-office-v1",
7
+ "defaultTemplate": "builtin/host-agent",
8
+ "entries": [
9
+ {
10
+ "id": "builtin/host-agent",
11
+ "name": "Host agent",
12
+ "description": "Keeps the coding agent identity reported by Pi or Codex while allowing local display overrides.",
13
+ "tags": ["agent", "host", "identity"],
14
+ "defaultAppearance": {},
15
+ "allowedOverrides": ["name", "title", "appearance"]
16
+ }
17
+ ]
18
+ }
@@ -0,0 +1,38 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "kind": "component-library",
4
+ "id": "builtin/agent-live-components",
5
+ "version": "1.0.0",
6
+ "contract": "single-office-v1",
7
+ "registries": {
8
+ "props": "props.json",
9
+ "npcTemplates": "npc-templates.json",
10
+ "agentProfileTemplates": "agent-profile-templates.json",
11
+ "activityRecipes": "activity-recipes.json",
12
+ "activityImplementations": "activity-implementations.json"
13
+ },
14
+ "styles": [
15
+ { "id": "builtin/pixel-classic", "name": "Pixel Classic", "description": "Crisp, high-contrast pixel office art.", "tags": ["pixel", "modern", "high-contrast"] },
16
+ { "id": "builtin/warm-studio", "name": "Warm Studio", "description": "Warm wood and muted-color pixel office art.", "tags": ["pixel", "warm", "traditional"] }
17
+ ],
18
+ "layouts": [
19
+ { "id": "builtin/boardroom-office", "name": "Boardroom Office", "description": "A long-table meeting room led from the front.", "tags": ["meeting", "formal", "long-table"] },
20
+ { "id": "builtin/demo-office", "name": "Demo Office", "description": "The preserved original single-room demo layout.", "tags": ["office", "baseline", "compact"] },
21
+ { "id": "builtin/lively-office", "name": "Lively Office", "description": "A compact office with shared break facilities.", "tags": ["office", "social", "compact"] },
22
+ { "id": "builtin/old-school-office", "name": "Old-school Office", "description": "A compartmentalized traditional office with administration and service areas.", "tags": ["office", "traditional", "cubicle"] },
23
+ { "id": "builtin/tech-open-office", "name": "Tech Open Office", "description": "An informal open office for a modern technology team.", "tags": ["office", "technology", "open-plan"] }
24
+ ],
25
+ "agentSkins": [
26
+ { "id": "builtin/studio-team", "name": "Studio Team", "description": "A warm-toned pixel character palette.", "tags": ["pixel", "warm", "character"] },
27
+ { "id": "builtin/tiny-developers", "name": "Tiny Developers", "description": "The default colorful coding-agent character palette.", "tags": ["pixel", "technology", "character"] }
28
+ ],
29
+ "atmospheres": [
30
+ { "id": "builtin/default-atmosphere", "name": "Default Atmosphere", "description": "Uses the selected style without additional ambience.", "tags": ["neutral", "day-night"] },
31
+ { "id": "builtin/rainy-night", "name": "Rainy Night", "description": "Adds rainy windows and a darker nighttime mood.", "tags": ["rain", "night", "ambient"] }
32
+ ],
33
+ "environments": [
34
+ { "id": "builtin/local-office-environment", "name": "Local Office Time", "description": "Follows the user's local clock and accepts host weather input.", "tags": ["local-time", "dynamic", "weather"] },
35
+ { "id": "builtin/rainy-night-environment", "name": "Fixed Rainy Night", "description": "A fixed nighttime environment with rain enabled.", "tags": ["fixed-time", "rain", "night"] },
36
+ { "id": "builtin/static-office-environment", "name": "Static Office Time", "description": "A deterministic fixed-time environment for demos and tests.", "tags": ["fixed-time", "testing"] }
37
+ ]
38
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "kind": "npc-template-library",
4
+ "id": "builtin/npc-template-library",
5
+ "version": "1.0.0",
6
+ "contract": "single-office-v1",
7
+ "defaultTemplate": "builtin/colleague",
8
+ "genderValues": ["female", "male", "nonbinary", "unspecified"],
9
+ "defaultInstancePolicy": {
10
+ "selection": "seeded-random-profile",
11
+ "seedFrom": "instance-id",
12
+ "persistResolvedProfile": true
13
+ },
14
+ "entries": [
15
+ { "id": "builtin/boss", "name": "Boss", "description": "Office leader or meeting host.", "tags": ["leadership", "meeting"], "role": "boss", "defaultTitle": "Boss", "defaultGender": "unspecified", "defaultPose": "sit", "defaultAppearance": { "skin": "#d5a47c", "hair": "#2b3039", "shirt": "#465d80", "trim": "#2d405e", "badge": "#ffcc4d" }, "defaultActivities": ["builtin/boss-cheer-round"], "allowedActivities": ["builtin/boss-briefing", "builtin/boss-plan-round", "builtin/boss-water-break", "builtin/boss-cheer-round"], "allowedOverrides": ["name", "title", "gender", "appearance", "spawn", "shift", "pose"] },
16
+ { "id": "builtin/cleaner", "name": "Cleaner", "description": "Office cleaner or general custodian.", "tags": ["service", "cleaning"], "role": "cleaner", "defaultTitle": "Cleaner", "defaultGender": "unspecified", "defaultPose": "stand", "defaultAppearance": { "skin": "#d69f70", "hair": "#30333b", "shirt": "#4f9d88", "trim": "#347264", "badge": "#b7eadb" }, "defaultActivities": ["builtin/plant-watering"], "allowedActivities": ["builtin/cleaning-round", "builtin/facility-round", "builtin/plant-watering"], "allowedOverrides": ["name", "title", "gender", "appearance", "spawn", "shift", "pose"] },
17
+ { "id": "builtin/receptionist", "name": "Receptionist", "description": "Front-desk receptionist and office coordinator.", "tags": ["service", "reception"], "role": "receptionist", "defaultTitle": "Receptionist", "defaultGender": "unspecified", "defaultPose": "stand", "defaultAppearance": { "skin": "#d69f70", "hair": "#3d302a", "shirt": "#718b78", "trim": "#526a59", "badge": "#d7ae5b" }, "allowedActivities": ["builtin/paperwork-round"], "allowedOverrides": ["name", "title", "gender", "appearance", "spawn", "shift", "pose"] },
18
+ { "id": "builtin/secretary", "name": "Secretary", "description": "Administrative assistant supporting meetings and paperwork.", "tags": ["service", "administration"], "role": "secretary", "defaultTitle": "Secretary", "defaultGender": "unspecified", "defaultPose": "stand", "defaultAppearance": { "skin": "#e8b98f", "hair": "#30333b", "shirt": "#568c83", "trim": "#37645e", "badge": "#b9dfd5" }, "allowedActivities": ["builtin/briefing-support"], "allowedOverrides": ["name", "title", "gender", "appearance", "spawn", "shift", "pose"] },
19
+ { "id": "builtin/attendant", "name": "Meeting attendant", "description": "Meeting-room service and refreshment attendant.", "tags": ["service", "meeting"], "role": "attendant", "defaultTitle": "Meeting attendant", "defaultGender": "unspecified", "defaultPose": "stand", "defaultAppearance": { "skin": "#d69f70", "hair": "#4a4038", "shirt": "#687779", "trim": "#485658", "badge": "#d7b261" }, "allowedActivities": ["builtin/refreshment-round"], "allowedOverrides": ["name", "title", "gender", "appearance", "spawn", "shift", "pose"] },
20
+ {
21
+ "id": "builtin/colleague",
22
+ "name": "Colleague",
23
+ "description": "The default background NPC identity. It has no coding-agent identity, task state, token usage or tool events.",
24
+ "tags": ["coworker", "background", "default"],
25
+ "role": "colleague",
26
+ "defaultTitle": "Colleague",
27
+ "defaultGender": "unspecified",
28
+ "defaultPose": "sit",
29
+ "defaultAppearance": { "skin": "#e8b98f", "hair": "#40352f", "shirt": "#5b89c2", "trim": "#3c6090", "badge": "#9fc1e8" },
30
+ "defaultProfiles": [
31
+ { "id": "alex", "name": "Alex", "gender": "unspecified", "appearance": { "skin": "#f0cba3", "hair": "#2f2418", "shirt": "#4a78c8", "trim": "#33569a", "badge": "#8fb8ff" } },
32
+ { "id": "jordan", "name": "Jordan", "gender": "male", "appearance": { "skin": "#d69f70", "hair": "#1f2430", "shirt": "#4f9d69", "trim": "#37714b", "badge": "#8fd6a6" } },
33
+ { "id": "robin", "name": "Robin", "gender": "female", "appearance": { "skin": "#e8b98f", "hair": "#4a2f22", "shirt": "#b8574f", "trim": "#8d3f38", "badge": "#ef9a91" } },
34
+ { "id": "casey", "name": "Casey", "gender": "nonbinary", "appearance": { "skin": "#b87a4f", "hair": "#3b3b45", "shirt": "#7b57b8", "trim": "#5b3d8d", "badge": "#b99ae8" } }
35
+ ],
36
+ "allowedBehaviors": ["work", "restroom", "water", "shift-departure"],
37
+ "defaultActivities": ["builtin/colleague-chat", "builtin/outside-walk", "builtin/phone-break", "builtin/restroom-break"],
38
+ "allowedActivities": ["builtin/colleague-chat", "builtin/get-water", "builtin/outside-walk", "builtin/phone-break", "builtin/restroom-break"],
39
+ "allowedOverrides": ["name", "title", "gender", "appearance", "spawn", "shift", "pose"]
40
+ }
41
+ ]
42
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "kind": "prop-library",
4
+ "id": "builtin/prop-library",
5
+ "version": "1.0.0",
6
+ "contract": "single-office-v1",
7
+ "entries": [
8
+ { "id": "builtin/archive-cabinet", "name": "Archive cabinet", "description": "Cabinet used for research and archive work.", "tags": ["storage", "research", "floor"], "size": { "width": 44, "height": 32 }, "capabilities": ["research"], "renderer": "archive-cabinet" },
9
+ { "id": "builtin/av-console", "name": "AV console", "description": "Meeting-room audiovisual control console.", "tags": ["meeting", "compute", "floor"], "size": { "width": 60, "height": 45 }, "capabilities": ["compute", "communicate"], "renderer": "av-console" },
10
+ { "id": "builtin/boardroom-table", "name": "Boardroom table", "description": "Long shared table for collaborative work.", "tags": ["meeting", "work", "floor"], "size": { "width": 204, "height": 125 }, "capabilities": ["create", "collaborate"], "renderer": "boardroom-table" },
11
+ { "id": "builtin/boss-desk", "name": "Boss desk", "description": "Compact desk for an office leader.", "tags": ["executive", "work", "floor"], "size": { "width": 36, "height": 16 }, "capabilities": [], "renderer": "boss-desk" },
12
+ { "id": "builtin/coat-rack", "name": "Coat rack", "description": "Freestanding rack for coats and bags.", "tags": ["service", "decoration", "floor"], "size": { "width": 13, "height": 29 }, "capabilities": [], "renderer": "coat-rack" },
13
+ { "id": "builtin/coffee-machine", "name": "Coffee machine", "description": "Office drink station used for coffee breaks.", "tags": ["service", "coffee", "floor"], "size": { "width": 26, "height": 22 }, "capabilities": ["coffee"], "renderer": "coffee-machine" },
14
+ { "id": "builtin/copy-station", "name": "Copy station", "description": "Printer and copier used for document work.", "tags": ["service", "research", "floor"], "size": { "width": 26, "height": 38 }, "capabilities": ["research"], "renderer": "copy-station" },
15
+ { "id": "builtin/cubicle-cell", "name": "Cubicle", "description": "Partitioned individual work cell.", "tags": ["work", "partition", "floor"], "size": { "width": 56, "height": 36 }, "capabilities": [], "renderer": "cubicle-cell" },
16
+ { "id": "builtin/door", "name": "Door", "description": "Standard office entrance or interior door.", "tags": ["architecture", "entry", "wall"], "size": { "width": 36, "height": 30 }, "capabilities": ["entry"], "renderer": "door" },
17
+ { "id": "builtin/dumbbell", "name": "Dumbbell", "description": "Small recreation-area exercise prop.", "tags": ["recreation", "decoration", "floor"], "size": { "width": 16, "height": 7 }, "capabilities": [], "renderer": "dumbbell" },
18
+ { "id": "builtin/executive-desk", "name": "Executive desk", "description": "Large desk supporting planning and communication.", "tags": ["executive", "work", "floor"], "size": { "width": 69, "height": 18 }, "capabilities": ["create", "plan", "communicate"], "renderer": "executive-desk" },
19
+ { "id": "builtin/floor-fan", "name": "Floor fan", "description": "Old-school freestanding office fan.", "tags": ["utility", "decoration", "floor"], "size": { "width": 18, "height": 27 }, "capabilities": [], "renderer": "floor-fan" },
20
+ { "id": "builtin/lounge-sofa", "name": "Lounge sofa", "description": "Shared sofa for breaks and informal conversations.", "tags": ["lounge", "collaboration", "floor"], "size": { "width": 112, "height": 26 }, "capabilities": ["collaborate"], "renderer": "lounge-sofa" },
21
+ { "id": "builtin/meeting-table", "name": "Meeting table", "description": "Small table for team collaboration.", "tags": ["meeting", "collaboration", "floor"], "size": { "width": 112, "height": 26 }, "capabilities": ["collaborate"], "renderer": "meeting-table" },
22
+ { "id": "builtin/notice-board", "name": "Notice board", "description": "Wall board for office notices.", "tags": ["information", "decoration", "wall"], "size": { "width": 55, "height": 23 }, "capabilities": [], "renderer": "notice-board" },
23
+ { "id": "builtin/office-clock", "name": "Office clock", "description": "Wall clock synchronized with the office environment.", "tags": ["time", "decoration", "wall"], "size": { "width": 14, "height": 14 }, "capabilities": [], "renderer": "office-clock" },
24
+ { "id": "builtin/phone-table", "name": "Phone table", "description": "Small telephone station for communication work.", "tags": ["communication", "work", "floor"], "size": { "width": 32, "height": 14 }, "capabilities": ["communicate"], "renderer": "phone-table" },
25
+ { "id": "builtin/plant", "name": "Plant", "description": "Indoor decorative plant.", "tags": ["decoration", "nature", "floor"], "size": { "width": 12, "height": 21 }, "capabilities": [], "renderer": "plant" },
26
+ { "id": "builtin/presentation-screen", "name": "Presentation screen", "description": "Large display for planning and presentations.", "tags": ["meeting", "information", "wall"], "size": { "width": 162, "height": 43 }, "capabilities": ["plan", "communicate"], "renderer": "presentation-screen" },
27
+ { "id": "builtin/reception-desk", "name": "Reception desk", "description": "Front-desk station for office communication.", "tags": ["reception", "communication", "floor"], "size": { "width": 64, "height": 20 }, "capabilities": ["communicate"], "renderer": "reception-desk" },
28
+ { "id": "builtin/restroom-door", "name": "Restroom door", "description": "Door marking the office restroom entrance.", "tags": ["service", "restroom", "wall"], "size": { "width": 28, "height": 30 }, "capabilities": ["restroom"], "renderer": "restroom-door" },
29
+ { "id": "builtin/rug", "name": "Rug", "description": "Large decorative floor rug.", "tags": ["decoration", "floor"], "size": { "width": 146, "height": 42 }, "capabilities": [], "renderer": "rug" },
30
+ { "id": "builtin/server-rack", "name": "Server rack", "description": "Compute infrastructure used for server work.", "tags": ["compute", "infrastructure", "floor"], "size": { "width": 48, "height": 32 }, "capabilities": ["compute"], "renderer": "server-rack" },
31
+ { "id": "builtin/service-cart", "name": "Service cart", "description": "Mobile cart for cleaning and office service.", "tags": ["service", "cleaning", "floor"], "size": { "width": 50, "height": 30 }, "capabilities": ["research"], "renderer": "service-cart" },
32
+ { "id": "builtin/sideboard", "name": "Sideboard", "description": "Meeting-room cabinet used for refreshments.", "tags": ["meeting", "coffee", "floor"], "size": { "width": 55, "height": 18 }, "capabilities": ["coffee"], "renderer": "sideboard" },
33
+ { "id": "builtin/vending-machine", "name": "Vending machine", "description": "Self-service office refreshment machine.", "tags": ["service", "refreshment", "floor"], "size": { "width": 17, "height": 28 }, "capabilities": [], "renderer": "vending-machine" },
34
+ { "id": "builtin/venetian-window", "name": "Venetian window", "description": "Window with old-school office blinds.", "tags": ["architecture", "window", "wall"], "size": { "width": 55, "height": 23 }, "capabilities": [], "renderer": "venetian-window" },
35
+ { "id": "builtin/wall-calendar", "name": "Wall calendar", "description": "Traditional office wall calendar.", "tags": ["decoration", "time", "wall"], "size": { "width": 16, "height": 22 }, "capabilities": [], "renderer": "wall-calendar" },
36
+ { "id": "builtin/water-cooler", "name": "Water cooler", "description": "Floor-standing facility used by water-break activities.", "tags": ["service", "water", "floor"], "size": { "width": 16, "height": 26 }, "capabilities": ["water"], "renderer": "water-cooler" },
37
+ { "id": "builtin/whiteboard", "name": "Whiteboard", "description": "Planning surface used for reasoning and review.", "tags": ["planning", "work", "wall"], "size": { "width": 72, "height": 26 }, "capabilities": ["plan"], "renderer": "whiteboard" },
38
+ { "id": "builtin/window", "name": "Window", "description": "Office window showing the current environment.", "tags": ["architecture", "window", "wall"], "size": { "width": 44, "height": 22 }, "capabilities": [], "renderer": "window" },
39
+ { "id": "builtin/workstation", "name": "Workstation", "description": "Primary desk and computer for agent work.", "tags": ["work", "desk", "floor"], "size": { "width": 48, "height": 16 }, "capabilities": ["create", "research", "compute", "communicate"], "renderer": "workstation" }
40
+ ]
41
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "kind": "environment",
4
+ "id": "builtin/local-office-environment",
5
+ "name": "本地真实环境",
6
+ "version": "1.0.0",
7
+ "engine": { "min": "0.2.0" },
8
+ "render": { "dynamicTime": true, "dynamicWeather": true },
9
+ "clock": {
10
+ "mode": "local",
11
+ "phases": [
12
+ { "id": "morning", "start": "06:00" },
13
+ { "id": "noon", "start": "11:00" },
14
+ { "id": "evening", "start": "17:00" },
15
+ { "id": "night", "start": "20:00" }
16
+ ],
17
+ "preview": { "enabled": true, "startTime": "06:00", "durationMs": 24000 }
18
+ },
19
+ "weather": {
20
+ "source": "runtime",
21
+ "fallback": "clear",
22
+ "allowedConditions": ["clear", "cloudy", "rain", "snow"]
23
+ },
24
+ "lighting": { "enabled": true, "activePhases": ["evening", "night"] },
25
+ "npcSchedule": {
26
+ "enabled": true,
27
+ "defaultShift": { "start": "06:00", "end": "18:30", "endLatest": "21:30" },
28
+ "roleOverrides": {},
29
+ "labels": { "arrival": "上班啦", "departure": "下班啦" }
30
+ }
31
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "kind": "environment",
4
+ "id": "builtin/rainy-night-environment",
5
+ "name": "固定雨夜环境",
6
+ "version": "1.0.0",
7
+ "engine": { "min": "0.2.0" },
8
+ "render": { "dynamicTime": true, "dynamicWeather": true },
9
+ "clock": {
10
+ "mode": "fixed",
11
+ "fixedTime": "22:00",
12
+ "phases": [
13
+ { "id": "morning", "start": "06:00" },
14
+ { "id": "noon", "start": "11:00" },
15
+ { "id": "evening", "start": "17:00" },
16
+ { "id": "night", "start": "20:00" }
17
+ ],
18
+ "preview": { "enabled": false }
19
+ },
20
+ "weather": { "source": "fixed", "condition": "rain", "allowedConditions": ["clear", "cloudy", "rain", "snow"] },
21
+ "lighting": { "enabled": true, "activePhases": ["evening", "night"] },
22
+ "npcSchedule": {
23
+ "enabled": true,
24
+ "defaultShift": { "start": "06:00", "end": "18:30", "endLatest": "21:30" },
25
+ "roleOverrides": {},
26
+ "labels": { "arrival": "上班啦", "departure": "下班啦" }
27
+ }
28
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "kind": "environment",
4
+ "id": "builtin/static-office-environment",
5
+ "name": "静态兼容环境",
6
+ "version": "1.0.0",
7
+ "engine": { "min": "0.2.0" },
8
+ "render": { "dynamicTime": false, "dynamicWeather": false },
9
+ "clock": {
10
+ "mode": "local",
11
+ "phases": [
12
+ { "id": "morning", "start": "06:00" },
13
+ { "id": "noon", "start": "11:00" },
14
+ { "id": "evening", "start": "17:00" },
15
+ { "id": "night", "start": "20:00" }
16
+ ],
17
+ "preview": { "enabled": false }
18
+ },
19
+ "weather": { "source": "fixed", "condition": "clear", "allowedConditions": ["clear", "cloudy", "rain", "snow"] },
20
+ "lighting": { "enabled": false, "activePhases": [] },
21
+ "npcSchedule": {
22
+ "enabled": true,
23
+ "defaultShift": { "start": "06:00", "end": "18:30", "endLatest": "21:30" },
24
+ "roleOverrides": {},
25
+ "labels": { "arrival": "上班啦", "departure": "下班啦" }
26
+ }
27
+ }
@@ -0,0 +1,122 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "kind": "layout",
4
+ "id": "builtin/boardroom-office",
5
+ "name": "大会议室长桌办公布局",
6
+ "version": "1.0.0",
7
+ "engine": { "min": "0.2.0" },
8
+ "contract": "single-office-v1",
9
+ "canvas": { "width": 384, "height": 216 },
10
+ "wallHeight": 54,
11
+ "camera": { "mode": "fixed", "fit": "contain", "integerScale": true },
12
+ "zones": [
13
+ { "id": "presentation", "name": "Presentation Front", "x": 82, "y": 54, "width": 220, "height": 30 },
14
+ { "id": "table-left", "name": "Left Work Side", "x": 82, "y": 76, "width": 110, "height": 126 },
15
+ { "id": "table-right", "name": "Right Work Side", "x": 192, "y": 76, "width": 110, "height": 126 },
16
+ { "id": "service-left", "name": "Document & Refreshment Service", "x": 10, "y": 60, "width": 72, "height": 150 },
17
+ { "id": "service-right", "name": "AV & Water Service", "x": 302, "y": 60, "width": 72, "height": 150 },
18
+ { "id": "circulation", "name": "Meeting Room Circulation", "x": 0, "y": 54, "width": 384, "height": 162 }
19
+ ],
20
+ "textSlots": [{"id":"company","name":"Company name / text logo","x":125,"y":11,"width":132,"height":12,"maxLength":24,"defaultText":""},{"id":"notice","name":"Notice","x":125,"y":27,"width":132,"height":12,"maxLength":48,"defaultText":""},{"id":"slogan","name":"Area slogan","x":18,"y":128,"width":52,"height":11,"maxLength":48,"defaultText":""}],
21
+ "placementSlots": [
22
+ {"id":"extra-1","zone":"circulation","x":14,"y":111,"accepts":["plant"],"maxSize":{"width":14,"height":22},"required":false},
23
+ {"id":"extra-2","zone":"circulation","x":362,"y":117,"accepts":["plant"],"maxSize":{"width":14,"height":22},"required":false},
24
+ {"id":"extra-3","zone":"circulation","x":306,"y":121,"accepts":["water-cooler","vending-machine"],"maxSize":{"width":18,"height":28},"required":false},
25
+ { "id": "front-decoration-left", "zone": "presentation", "x": 91, "y": 69, "accepts": ["plant"], "maxSize": { "width": 14, "height": 22 }, "required": false, "occupiedBy": "plant-front-left" },
26
+ { "id": "front-decoration-right", "zone": "presentation", "x": 295, "y": 69, "accepts": ["plant"], "maxSize": { "width": 14, "height": 22 }, "required": false, "occupiedBy": "plant-front-right" },
27
+ { "id": "left-refreshment", "zone": "service-left", "x": 48, "y": 105, "accepts": ["coffee-machine"], "maxSize": { "width": 26, "height": 22 }, "required": false, "occupiedBy": "coffee-main" },
28
+ { "id": "left-service-storage", "zone": "service-left", "x": 18, "y": 161, "accepts": ["service-cart", "sideboard"], "maxSize": { "width": 55, "height": 30 }, "required": false, "occupiedBy": "archive-main" },
29
+ { "id": "right-refreshment", "zone": "service-right", "x": 344, "y": 170, "accepts": ["water-cooler", "vending-machine"], "maxSize": { "width": 18, "height": 28 }, "required": false, "occupiedBy": "water-main" }
30
+ ],
31
+ "navigation": {
32
+ "lanes": [60, 112, 146, 198],
33
+ "connectors": [10, 80, 192, 304, 374],
34
+ "perimeter": { "leftX": 82, "rightX": 302, "topY": 60, "bottomY": 210 }
35
+ },
36
+ "interactions": { "handoff": "seated", "directorNpcRole": "boss" },
37
+ "seats": [
38
+ { "index": 0, "cx": 127, "renderer": "boardroom-seat", "desk": { "x": 145, "y": 88, "width": 15, "height": 10 }, "anchor": { "x": 127, "y": 101, "dir": "right", "lane": 1, "zone": "left" } },
39
+ { "index": 1, "cx": 257, "renderer": "boardroom-seat", "desk": { "x": 224, "y": 88, "width": 15, "height": 10 }, "anchor": { "x": 257, "y": 101, "dir": "left", "lane": 1, "zone": "right" } },
40
+ { "index": 2, "cx": 119, "renderer": "boardroom-seat", "desk": { "x": 141, "y": 112, "width": 15, "height": 10 }, "anchor": { "x": 119, "y": 125, "dir": "right", "lane": 1, "zone": "left" } },
41
+ { "index": 3, "cx": 265, "renderer": "boardroom-seat", "desk": { "x": 228, "y": 112, "width": 15, "height": 10 }, "anchor": { "x": 265, "y": 125, "dir": "left", "lane": 1, "zone": "right" } },
42
+ { "index": 4, "cx": 111, "renderer": "boardroom-seat", "desk": { "x": 137, "y": 138, "width": 15, "height": 10 }, "anchor": { "x": 111, "y": 151, "dir": "right", "lane": 2, "zone": "left" } },
43
+ { "index": 5, "cx": 273, "renderer": "boardroom-seat", "desk": { "x": 232, "y": 138, "width": 15, "height": 10 }, "anchor": { "x": 273, "y": 151, "dir": "left", "lane": 2, "zone": "right" } },
44
+ { "index": 6, "cx": 103, "renderer": "boardroom-seat", "desk": { "x": 133, "y": 164, "width": 15, "height": 10 }, "anchor": { "x": 103, "y": 177, "dir": "right", "lane": 3, "zone": "left" } },
45
+ { "index": 7, "cx": 281, "renderer": "boardroom-seat", "desk": { "x": 236, "y": 164, "width": 15, "height": 10 }, "anchor": { "x": 281, "y": 177, "dir": "left", "lane": 3, "zone": "right" } }
46
+ ],
47
+ "standingAnchors": [
48
+ { "x": 82, "y": 86, "dir": "right", "lane": 1, "zone": "circulation" },
49
+ { "x": 302, "y": 86, "dir": "left", "lane": 1, "zone": "circulation" },
50
+ { "x": 82, "y": 132, "dir": "right", "lane": 2, "zone": "circulation" },
51
+ { "x": 302, "y": 132, "dir": "left", "lane": 2, "zone": "circulation" },
52
+ { "x": 82, "y": 198, "dir": "right", "lane": 3, "zone": "circulation" },
53
+ { "x": 302, "y": 198, "dir": "left", "lane": 3, "zone": "circulation" },
54
+ { "x": 112, "y": 60, "dir": "down", "lane": 0, "zone": "circulation" },
55
+ { "x": 272, "y": 60, "dir": "down", "lane": 0, "zone": "circulation" }
56
+ ],
57
+ "targets": {
58
+ "staff-entry": {"x":10,"y":60,"dir":"right","lane":0,"zone":"top"},
59
+ "archive": { "x": 68, "y": 184, "dir": "left", "lane": 3 },
60
+ "server": { "x": 336, "y": 111, "dir": "up", "lane": 1 },
61
+ "whiteboard": { "x": 50, "y": 116, "dir": "up", "lane": 1 },
62
+ "phone": { "x": 192, "y": 151, "dir": "up", "lane": 2 },
63
+ "coffee": { "x": 68, "y": 148, "dir": "left", "lane": 2 },
64
+ "water": { "x": 352, "y": 198, "dir": "right", "lane": 3 },
65
+ "meetA": { "x": 145, "y": 139, "dir": "right", "lane": 2 },
66
+ "meetB": { "x": 239, "y": 139, "dir": "left", "lane": 2 },
67
+ "entry": { "x": 10, "y": 60, "dir": "right", "lane": 0, "zone": "top" },
68
+ "boss-seat": { "x": 192, "y": 68, "dir": "down", "lane": 0, "zone": "top" },
69
+ "secretary-entry": { "x": 10, "y": 198, "dir": "right", "lane": 3, "zone": "left" },
70
+ "service-entry": { "x": 374, "y": 198, "dir": "left", "lane": 3, "zone": "right" },
71
+ "decision-wall": { "x": 50, "y": 116, "dir": "up", "lane": 1, "zone": "left" },
72
+ "table-service-left": { "x": 82, "y": 151, "dir": "right", "lane": 2, "zone": "left" },
73
+ "table-service-right": { "x": 302, "y": 151, "dir": "left", "lane": 2, "zone": "right" }
74
+ },
75
+ "stations": {
76
+ "research": { "kind": "seat" },
77
+ "create": { "kind": "seat" },
78
+ "compute": { "kind": "seat" },
79
+ "plan": { "kind": "seat" },
80
+ "communicate": { "kind": "seat" },
81
+ "collaborate": { "kind": "seat", "meetingTargets": ["meetA", "meetB"] },
82
+ "coffee": { "kind": "target", "target": "coffee" },
83
+ "water": { "kind": "target", "target": "water" }
84
+ },
85
+ "legacyActions": {
86
+ "type": "create",
87
+ "archive": "research",
88
+ "server": "compute",
89
+ "whiteboard": "plan",
90
+ "phone": "communicate",
91
+ "delegate": "collaborate",
92
+ "coffee": "coffee"
93
+ },
94
+ "furniture": {
95
+ "archive": { "x": 18, "y": 161, "w": 50, "h": 30 },
96
+ "server": { "x": 306, "y": 64, "w": 60, "h": 45 },
97
+ "coffee": { "x": 48, "y": 108, "w": 26, "h": 22 },
98
+ "water": { "x": 344, "y": 170, "w": 16, "h": 26 },
99
+ "phone": { "x": 181, "y": 143, "w": 22, "h": 12 },
100
+ "whiteboard": { "x": 15, "y": 64, "w": 65, "h": 45 },
101
+ "meeting": { "x": 90, "y": 76, "w": 204, "h": 125 }
102
+ },
103
+ "propInstances": [
104
+ { "id": "boardroom-rug", "type": "rug", "x": 75, "y": 70, "width": 234, "height": 140 },
105
+ { "id": "entry-door", "type": "door", "x": 2, "y": 12, "width": 24, "height": 42 },
106
+ { "id": "city-window-left", "type": "window", "x": 32, "y": 8, "width": 67, "height": 38 },
107
+ { "id": "city-window-right", "type": "window", "x": 285, "y": 8, "width": 67, "height": 38 },
108
+ { "id": "presentation-main", "type": "presentation-screen", "x": 111, "y": 6 },
109
+ { "id": "decision-board", "type": "whiteboard", "x": 15, "y": 64, "width": 65, "height": 45 },
110
+ { "id": "av-main", "type": "av-console", "x": 306, "y": 64 },
111
+ { "id": "meeting-main", "type": "boardroom-table", "x": 90, "y": 76 },
112
+ { "id": "coffee-sideboard", "type": "sideboard", "x": 16, "y": 126 },
113
+ { "id": "coffee-main", "type": "coffee-machine", "x": 48, "y": 105 },
114
+ { "id": "archive-main", "type": "service-cart", "x": 18, "y": 161 },
115
+ { "id": "water-main", "type": "water-cooler", "x": 344, "y": 170 },
116
+ { "id": "service-cabinet", "type": "sideboard", "x": 318, "y": 157, "width": 45, "height": 42 },
117
+ { "id": "plant-front-left", "type": "plant", "x": 91, "y": 69 },
118
+ { "id": "plant-front-right", "type": "plant", "x": 295, "y": 69 },
119
+ { "id": "wall-clock", "type": "office-clock", "x": 362, "y": 8 }
120
+ ],
121
+ "npcSpawns": ["staff-entry", "boss-seat", "secretary-entry", "service-entry"]
122
+ }
@@ -0,0 +1,88 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "kind": "layout",
4
+ "id": "builtin/demo-office",
5
+ "name": "原版办公室布局",
6
+ "version": "1.0.0",
7
+ "engine": { "min": "0.2.0" },
8
+ "contract": "single-office-v1",
9
+ "canvas": { "width": 384, "height": 216 },
10
+ "wallHeight": 36,
11
+ "camera": { "mode": "fixed", "fit": "contain", "integerScale": true },
12
+ "navigation": {
13
+ "lanes": [46, 100, 162],
14
+ "connectors": [76, 140, 204, 276]
15
+ },
16
+ "seats": [
17
+ { "index": 0, "cx": 44, "desk": { "x": 20, "y": 58, "width": 48, "height": 16 }, "anchor": { "x": 44, "y": 84, "dir": "up", "lane": 1 } },
18
+ { "index": 1, "cx": 108, "desk": { "x": 84, "y": 58, "width": 48, "height": 16 }, "anchor": { "x": 108, "y": 84, "dir": "up", "lane": 1 } },
19
+ { "index": 2, "cx": 172, "desk": { "x": 148, "y": 58, "width": 48, "height": 16 }, "anchor": { "x": 172, "y": 84, "dir": "up", "lane": 1 } },
20
+ { "index": 3, "cx": 236, "desk": { "x": 212, "y": 58, "width": 48, "height": 16 }, "anchor": { "x": 236, "y": 84, "dir": "up", "lane": 1 } },
21
+ { "index": 4, "cx": 44, "desk": { "x": 20, "y": 118, "width": 48, "height": 16 }, "anchor": { "x": 44, "y": 144, "dir": "up", "lane": 2 } },
22
+ { "index": 5, "cx": 108, "desk": { "x": 84, "y": 118, "width": 48, "height": 16 }, "anchor": { "x": 108, "y": 144, "dir": "up", "lane": 2 } },
23
+ { "index": 6, "cx": 172, "desk": { "x": 148, "y": 118, "width": 48, "height": 16 }, "anchor": { "x": 172, "y": 144, "dir": "up", "lane": 2 } },
24
+ { "index": 7, "cx": 236, "desk": { "x": 212, "y": 118, "width": 48, "height": 16 }, "anchor": { "x": 236, "y": 144, "dir": "up", "lane": 2 } }
25
+ ],
26
+ "standingAnchors": [
27
+ { "x": 278, "y": 92, "dir": "left", "lane": 1 },
28
+ { "x": 278, "y": 152, "dir": "left", "lane": 2 },
29
+ { "x": 92, "y": 190, "dir": "right", "lane": 2 },
30
+ { "x": 242, "y": 190, "dir": "left", "lane": 2 },
31
+ { "x": 214, "y": 46, "dir": "down", "lane": 0 },
32
+ { "x": 246, "y": 46, "dir": "down", "lane": 0 },
33
+ { "x": 278, "y": 46, "dir": "down", "lane": 0 },
34
+ { "x": 310, "y": 46, "dir": "down", "lane": 0 }
35
+ ],
36
+ "targets": {
37
+ "archive": { "x": 318, "y": 100, "dir": "up", "lane": 1 },
38
+ "server": { "x": 320, "y": 158, "dir": "up", "lane": 2 },
39
+ "whiteboard": { "x": 152, "y": 46, "dir": "up", "lane": 0 },
40
+ "phone": { "x": 364, "y": 64, "dir": "up", "lane": 1 },
41
+ "coffee": { "x": 290, "y": 188, "dir": "right", "lane": 2 },
42
+ "meetA": { "x": 108, "y": 190, "dir": "right", "lane": 2 },
43
+ "meetB": { "x": 244, "y": 190, "dir": "left", "lane": 2 },
44
+ "entry": { "x": 38, "y": 46, "dir": "down", "lane": 0 }
45
+ },
46
+ "stations": {
47
+ "research": { "kind": "target", "target": "archive" },
48
+ "create": { "kind": "seat" },
49
+ "compute": { "kind": "target", "target": "server" },
50
+ "plan": { "kind": "target", "target": "whiteboard" },
51
+ "communicate": { "kind": "target", "target": "phone" },
52
+ "collaborate": { "kind": "seat", "meetingTargets": ["meetA", "meetB"] },
53
+ "coffee": { "kind": "target", "target": "coffee" }
54
+ },
55
+ "legacyActions": {
56
+ "type": "create",
57
+ "archive": "research",
58
+ "server": "compute",
59
+ "whiteboard": "plan",
60
+ "phone": "communicate",
61
+ "delegate": "collaborate",
62
+ "coffee": "coffee"
63
+ },
64
+ "furniture": {
65
+ "archive": { "x": 296, "y": 56, "w": 44, "h": 32 },
66
+ "server": { "x": 296, "y": 116, "w": 48, "h": 32 },
67
+ "coffee": { "x": 300, "y": 176, "w": 26, "h": 22 },
68
+ "phone": { "x": 348, "y": 40, "w": 32, "h": 14 },
69
+ "whiteboard": { "x": 116, "y": 8, "w": 72, "h": 26 },
70
+ "meeting": { "x": 120, "y": 176, "w": 112, "h": 26 }
71
+ },
72
+ "propInstances": [
73
+ { "id": "meeting-rug", "type": "rug", "x": 104, "y": 170 },
74
+ { "id": "entry-door", "type": "door", "x": 20, "y": 6 },
75
+ { "id": "window-1", "type": "window", "x": 208, "y": 8 },
76
+ { "id": "window-2", "type": "window", "x": 268, "y": 8 },
77
+ { "id": "whiteboard-main", "type": "whiteboard", "x": 116, "y": 8 },
78
+ { "id": "phone-main", "type": "phone-table", "x": 348, "y": 40 },
79
+ { "id": "archive-main", "type": "archive-cabinet", "x": 296, "y": 56 },
80
+ { "id": "server-main", "type": "server-rack", "x": 296, "y": 116 },
81
+ { "id": "coffee-main", "type": "coffee-machine", "x": 300, "y": 176 },
82
+ { "id": "meeting-main", "type": "meeting-table", "x": 120, "y": 176 },
83
+ { "id": "plant-1", "type": "plant", "x": 16, "y": 200 },
84
+ { "id": "plant-2", "type": "plant", "x": 78, "y": 200 },
85
+ { "id": "plant-3", "type": "plant", "x": 366, "y": 200 }
86
+ ],
87
+ "npcSpawns": []
88
+ }