@iniesta8888/agent-live 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 (182) hide show
  1. package/CODE_OF_CONDUCT.md +7 -0
  2. package/CONTRIBUTING.md +56 -0
  3. package/LICENSE +21 -0
  4. package/README.md +92 -0
  5. package/SECURITY.md +13 -0
  6. package/dist/adapter-sdk/index.d.ts +45 -0
  7. package/dist/adapter-sdk/index.d.ts.map +1 -0
  8. package/dist/adapter-sdk/index.js +106 -0
  9. package/dist/adapter-sdk/index.js.map +1 -0
  10. package/dist/content/compiler.d.ts +31 -0
  11. package/dist/content/compiler.d.ts.map +1 -0
  12. package/dist/content/compiler.js +218 -0
  13. package/dist/content/compiler.js.map +1 -0
  14. package/dist/content/graph-validator.d.ts +56 -0
  15. package/dist/content/graph-validator.d.ts.map +1 -0
  16. package/dist/content/graph-validator.js +226 -0
  17. package/dist/content/graph-validator.js.map +1 -0
  18. package/dist/content/library.d.ts +4 -0
  19. package/dist/content/library.d.ts.map +1 -0
  20. package/dist/content/library.js +45 -0
  21. package/dist/content/library.js.map +1 -0
  22. package/dist/content/registry.d.ts +34 -0
  23. package/dist/content/registry.d.ts.map +1 -0
  24. package/dist/content/registry.js +130 -0
  25. package/dist/content/registry.js.map +1 -0
  26. package/dist/content/runtime-content.d.ts +63 -0
  27. package/dist/content/runtime-content.d.ts.map +1 -0
  28. package/dist/content/runtime-content.js +78 -0
  29. package/dist/content/runtime-content.js.map +1 -0
  30. package/dist/content/schema.d.ts +142 -0
  31. package/dist/content/schema.d.ts.map +1 -0
  32. package/dist/content/schema.js +280 -0
  33. package/dist/content/schema.js.map +1 -0
  34. package/dist/content/validator.d.ts +35 -0
  35. package/dist/content/validator.d.ts.map +1 -0
  36. package/dist/content/validator.js +205 -0
  37. package/dist/content/validator.js.map +1 -0
  38. package/dist/core/agents.d.ts +56 -0
  39. package/dist/core/agents.d.ts.map +1 -0
  40. package/dist/core/agents.js +148 -0
  41. package/dist/core/agents.js.map +1 -0
  42. package/dist/core/limits.d.ts +15 -0
  43. package/dist/core/limits.d.ts.map +1 -0
  44. package/dist/core/limits.js +16 -0
  45. package/dist/core/limits.js.map +1 -0
  46. package/dist/core/mapping.d.ts +17 -0
  47. package/dist/core/mapping.d.ts.map +1 -0
  48. package/dist/core/mapping.js +94 -0
  49. package/dist/core/mapping.js.map +1 -0
  50. package/dist/core/protocol.d.ts +105 -0
  51. package/dist/core/protocol.d.ts.map +1 -0
  52. package/dist/core/protocol.js +6 -0
  53. package/dist/core/protocol.js.map +1 -0
  54. package/dist/core/state.d.ts +49 -0
  55. package/dist/core/state.d.ts.map +1 -0
  56. package/dist/core/state.js +216 -0
  57. package/dist/core/state.js.map +1 -0
  58. package/dist/creator/commands.d.ts +19 -0
  59. package/dist/creator/commands.d.ts.map +1 -0
  60. package/dist/creator/commands.js +44 -0
  61. package/dist/creator/commands.js.map +1 -0
  62. package/dist/creator/mode.d.ts +10 -0
  63. package/dist/creator/mode.d.ts.map +1 -0
  64. package/dist/creator/mode.js +23 -0
  65. package/dist/creator/mode.js.map +1 -0
  66. package/dist/creator/service.d.ts +199 -0
  67. package/dist/creator/service.d.ts.map +1 -0
  68. package/dist/creator/service.js +159 -0
  69. package/dist/creator/service.js.map +1 -0
  70. package/dist/index.d.ts +14 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +10 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/runtime/agent-live-runtime.d.ts +17 -0
  75. package/dist/runtime/agent-live-runtime.d.ts.map +1 -0
  76. package/dist/runtime/agent-live-runtime.js +50 -0
  77. package/dist/runtime/agent-live-runtime.js.map +1 -0
  78. package/dist/runtime/content-service.d.ts +75 -0
  79. package/dist/runtime/content-service.d.ts.map +1 -0
  80. package/dist/runtime/content-service.js +60 -0
  81. package/dist/runtime/content-service.js.map +1 -0
  82. package/dist/runtime/resource-guard.d.ts +17 -0
  83. package/dist/runtime/resource-guard.d.ts.map +1 -0
  84. package/dist/runtime/resource-guard.js +54 -0
  85. package/dist/runtime/resource-guard.js.map +1 -0
  86. package/dist/runtime/server.d.ts +39 -0
  87. package/dist/runtime/server.d.ts.map +1 -0
  88. package/dist/runtime/server.js +286 -0
  89. package/dist/runtime/server.js.map +1 -0
  90. package/dist/web/app.d.ts +1 -0
  91. package/dist/web/app.js +1317 -0
  92. package/dist/web/index.html +45 -0
  93. package/dist/web/office.js +350 -0
  94. package/dist/web/sprites.js +185 -0
  95. package/dist/web/style.css +288 -0
  96. package/dist/web/v2/bootstrap.js +276 -0
  97. package/dist/web/v2/content/README.md +17 -0
  98. package/dist/web/v2/content/agent-skins/studio-team.json +33 -0
  99. package/dist/web/v2/content/agent-skins/tiny-developers.json +33 -0
  100. package/dist/web/v2/content/atmospheres/default.json +13 -0
  101. package/dist/web/v2/content/atmospheres/rainy-night.json +37 -0
  102. package/dist/web/v2/content/catalog.json +14 -0
  103. package/dist/web/v2/content/component-library/activity-implementations.json +873 -0
  104. package/dist/web/v2/content/component-library/activity-recipes.json +25 -0
  105. package/dist/web/v2/content/component-library/agent-profile-templates.json +18 -0
  106. package/dist/web/v2/content/component-library/catalog.json +38 -0
  107. package/dist/web/v2/content/component-library/npc-templates.json +42 -0
  108. package/dist/web/v2/content/component-library/props.json +41 -0
  109. package/dist/web/v2/content/environments/local-office.json +31 -0
  110. package/dist/web/v2/content/environments/rainy-night.json +28 -0
  111. package/dist/web/v2/content/environments/static-office.json +27 -0
  112. package/dist/web/v2/content/layouts/boardroom-office.json +122 -0
  113. package/dist/web/v2/content/layouts/demo-office.json +88 -0
  114. package/dist/web/v2/content/layouts/lively-office.json +96 -0
  115. package/dist/web/v2/content/layouts/old-school-office.json +154 -0
  116. package/dist/web/v2/content/layouts/tech-open-office.json +132 -0
  117. package/dist/web/v2/content/life-activities/boardroom-routines.json +67 -0
  118. package/dist/web/v2/content/life-activities/none.json +10 -0
  119. package/dist/web/v2/content/life-activities/office-basics.json +39 -0
  120. package/dist/web/v2/content/life-activities/old-school-routines.json +74 -0
  121. package/dist/web/v2/content/life-activities/tech-office-routines.json +148 -0
  122. package/dist/web/v2/content/npcs/boardroom-staff.json +54 -0
  123. package/dist/web/v2/content/npcs/none.json +10 -0
  124. package/dist/web/v2/content/npcs/office-staff.json +25 -0
  125. package/dist/web/v2/content/npcs/old-school-staff.json +39 -0
  126. package/dist/web/v2/content/npcs/tech-office-staff.json +40 -0
  127. package/dist/web/v2/content/official-offices/boardroom-office.json +25 -0
  128. package/dist/web/v2/content/official-offices/old-school-office.json +25 -0
  129. package/dist/web/v2/content/official-offices/tech-open-office.json +25 -0
  130. package/dist/web/v2/content/presets/boardroom-office.json +21 -0
  131. package/dist/web/v2/content/presets/cozy-studio.json +19 -0
  132. package/dist/web/v2/content/presets/demo-office.json +19 -0
  133. package/dist/web/v2/content/presets/lively-office.json +19 -0
  134. package/dist/web/v2/content/presets/night-shift.json +19 -0
  135. package/dist/web/v2/content/presets/old-school-office.json +20 -0
  136. package/dist/web/v2/content/presets/refined-demo.json +20 -0
  137. package/dist/web/v2/content/presets/tech-open-office.json +21 -0
  138. package/dist/web/v2/content/props/default-office.json +23 -0
  139. package/dist/web/v2/content/props/extended-office.json +39 -0
  140. package/dist/web/v2/content/props/tech-office.json +28 -0
  141. package/dist/web/v2/content/styles/pixel-classic.json +160 -0
  142. package/dist/web/v2/content/styles/warm-studio.json +150 -0
  143. package/dist/web/v2/environment-runtime.d.ts +1 -0
  144. package/dist/web/v2/environment-runtime.js +138 -0
  145. package/dist/web/v2/graph-validator.d.ts +55 -0
  146. package/dist/web/v2/graph-validator.js +225 -0
  147. package/dist/web/v2/i18n.js +54 -0
  148. package/dist/web/v2/locales/en.json +209 -0
  149. package/dist/web/v2/locales/zh-CN.json +52 -0
  150. package/dist/web/v2/office-engine.d.ts +1 -0
  151. package/dist/web/v2/office-engine.js +145 -0
  152. package/dist/web/v2/office-renderer.d.ts +1 -0
  153. package/dist/web/v2/office-renderer.js +843 -0
  154. package/dist/web/v2/parity.html +10 -0
  155. package/dist/web/v2/parity.js +82 -0
  156. package/dist/web/v2/sprite-renderer.d.ts +1 -0
  157. package/dist/web/v2/sprite-renderer.js +242 -0
  158. package/dist/web/v2/static-content.js +48 -0
  159. package/dist/web/v2/style.css +140 -0
  160. package/dist/web/v2.html +68 -0
  161. package/docs/ADAPTER-DEVELOPMENT.md +328 -0
  162. package/docs/ADAPTER-SDK.md +109 -0
  163. package/docs/ARCHITECTURE.md +223 -0
  164. package/docs/COMPONENT-LIBRARY.md +212 -0
  165. package/docs/CUSTOMIZATION.md +163 -0
  166. package/docs/DEVELOPER.md +186 -0
  167. package/docs/DSH-ADAPTER-DESIGN.md +173 -0
  168. package/docs/OFFICE-THEMES.md +516 -0
  169. package/docs/PRESET-CONFIG.md +460 -0
  170. package/docs/RELEASE-CHECK.md +23 -0
  171. package/docs/TECHNICAL.md +515 -0
  172. package/docs/USING-CODEX.md +24 -0
  173. package/docs/USING-DSH.md +44 -0
  174. package/docs/USING-PI.md +50 -0
  175. package/docs/VISION.md +146 -0
  176. package/examples/adapter/local-office.mjs +52 -0
  177. package/package.json +89 -0
  178. package/skills/agent-live-adapter-builder/SKILL.md +30 -0
  179. package/skills/agent-live-adapter-builder/agents/openai.yaml +4 -0
  180. package/skills/agent-live-adapter-builder/references/investigation.md +9 -0
  181. package/skills/agent-live-adapter-builder/references/review.md +7 -0
  182. package/skills/agent-live-adapter-builder/scripts/create-adapter.mjs +26 -0
@@ -0,0 +1,516 @@
1
+ # Demo Office 可替换内容定义
2
+
3
+ > 状态:当前产品边界 · 2026-09-07
4
+
5
+ ## 核心决定
6
+
7
+ 当前只有一种公司形态:**Demo 这种单层、固定俯视、全场所同屏的办公室**。默认 Style 是当前像素风,但美术表现仍可替换。
8
+
9
+ 不再把 Big Company、Medium Company、Startup、OPC 作为产品选项,也不做园区、多楼层或视角下钻。办公室可以换布局和内容,但始终遵守同一套空间规则:单个场所、单层同屏、人物和工作行为清晰可见。
10
+
11
+ 产品模型进一步收敛为:
12
+
13
+ ```text
14
+ 固定的 Office Engine
15
+
16
+ Component Library(八类基础组件全集)
17
+
18
+ Office Spec
19
+
20
+ Official Preset / Custom Office
21
+ ```
22
+
23
+ Preset 不再拥有一套独立内容定义;它只是从同一个 Component Library 组装并验证出来的只读 Office Spec。Creator 的自定义也使用同一套组件、编译器和校验器:对 Preset Office 动第一笔改动就得到内容完整继承的 Custom Office(房间随之带来,不单独更换)。完整组件合同见 [基础组件库](COMPONENT-LIBRARY.md)。
24
+
25
+ ## 1. 固定不变的部分
26
+
27
+ 以下属于产品本身,内容包不能改写:
28
+
29
+ - 单层办公室、固定俯视镜头、整个场所同时可见。
30
+ - 宿主事件代表的真实事实,例如读取、编辑、执行、委派、等待、完成和失败。
31
+ - Work Event 的优先级;真实工作随时可以打断模拟的办公室生活。
32
+ - 移动、寻路、碰撞、气泡、状态灯、侧栏和事件回放的基础规则。
33
+ - NPC 不能冒充真实 Agent,Life Event 不能进入真实工作统计。
34
+
35
+ 工作语义保持稳定,但可以由不同设施承载:
36
+
37
+ | Work Semantic | 真实含义 | 默认设施 |
38
+ | --- | --- | --- |
39
+ | `research` | 读取、搜索、分析 | 档案柜 / 电脑 |
40
+ | `create` | 写入、编辑 | 个人工位 |
41
+ | `compute` | 命令、测试、运行 | 服务器 / 电脑 |
42
+ | `plan` | 计划与任务拆解 | 白板 |
43
+ | `communicate` | Web、提问、外部通信 | 电话桌 / 电脑 |
44
+ | `collaborate` | 委派、交接、评审 | 会议桌 |
45
+ | `idle` | 没有真实任务 | 工位或 Life Activity |
46
+
47
+ ## 2. Component Library 的八个组件族
48
+
49
+ 这八项是 Component Library 的内容分类,也是开发和内容制作的边界,不是要求普通用户逐项设置。它们可以归成四组:
50
+
51
+ - **视觉表现**:Style、Agent Skin、Atmosphere。
52
+ - **空间内容**:Layout、Props、NPC。
53
+ - **生活行为**:Life Activities。
54
+ - **公共运行环境**:Environment。
55
+
56
+ ### 2.1 Style:整套美术风格
57
+
58
+ Style 只回答“所有东西怎么画”,不决定房间里有什么:
59
+
60
+ - 色板、线条、材质、光影和像素比例。
61
+ - Agent、NPC、家具与物件的统一绘制语言。
62
+ - 气泡、侧栏、按钮、字体、图标和状态特效。
63
+ - 动画节奏、粒子以及可选的界面音效。
64
+
65
+ 第一版先保留当前像素风,再做第二套风格验证切换。Style 必须覆盖同一组标准对象;资源缺失时回退到默认像素资源。
66
+
67
+ ### 2.2 Layout:单层办公室布局
68
+
69
+ Layout 决定同一个办公室场所如何安排:
70
+
71
+ - 墙体、门窗、通道、可行走区域和镜头边界。
72
+ - 开放工区、会议角、资料区、设备区、茶水区、休息区等区域。
73
+ - 工位、功能锚点、NPC 出生点和活动路线。
74
+ - Props 的实例、坐标、朝向和层级。
75
+
76
+ Layout 可以做成 Loft、游戏工作室、共享办公等不同办公室,但都必须是 Demo 规格的单层同屏场景。它不是新的“公司类型”。
77
+
78
+ ### 2.3 Agent Skin:真实 Agent 外观
79
+
80
+ Agent Skin 决定真实 Agent 在办公室中的身份外观:
81
+
82
+ - 主 Agent 和子 Agent 的角色造型、服装、发型与配色。
83
+ - 名称、职位名、名牌和团队标识。
84
+ - 与 Style 兼容的待机、走路、工作、交接、成功和失败动作。
85
+
86
+ 它只能改变表现,不能增加不存在的 Agent,也不能改变 Agent 的真实状态。
87
+
88
+ ### 2.4 NPC:办公室角色
89
+
90
+ NPC 决定办公室中还有谁:
91
+
92
+ - 普通同事、前台、保安、保洁、快递员、维修人员和访客。
93
+ - 猫、狗、机器人等办公室伙伴。
94
+ - 每个 NPC 的身份、外观、值班时间、出生点和允许参与的 Life Activity。
95
+
96
+ NPC 是独立内容,可以逐个添加或移除;其行为由 Life Activities 驱动。
97
+
98
+ ### 2.5 Props:家具、设备与装饰物
99
+
100
+ Props 是可独立放入 Layout 的对象:
101
+
102
+ - 工作设施:电脑桌、档案柜、服务器、白板、电话和会议桌。
103
+ - 生活设施:饮水机、咖啡机、冰箱、沙发、卫生间入口和娱乐设备。
104
+ - 装饰物:绿植、地毯、灯、海报、纸箱、垃圾桶和品牌标识。
105
+
106
+ 具有功能的 Prop 要声明能力标签,例如 `research`、`compute`、`coffee` 或 `leisure`;纯装饰物不参与行为映射。
107
+
108
+ ### 2.6 Life Activities:非 Agent 工作事件
109
+
110
+ Life Activity 决定角色空闲时会做什么:
111
+
112
+ - Agent 接水、喝咖啡、休息、聊天、划水、去卫生间或娱乐。
113
+ - NPC 巡逻、打扫、接待、送件或维修。
114
+ - 午休、访客到来、生日庆祝等低频公共事件。
115
+
116
+ 每个活动声明参与者、需要的 Props、持续时间、冷却时间、概率和动画。所有 Life Activity 都可被新的 Work Event 打断,并明确标记为模拟事件。
117
+
118
+ ### 2.7 Atmosphere:环境视觉
119
+
120
+ Atmosphere 决定时间与天气状态如何被画出来,但不判断现实中现在是什么状态:
121
+
122
+ - 白天、黄昏和深夜的色板与窗外景色。
123
+ - 晴天、雨天、雪天的粒子和材质。
124
+ - 节日装饰、背景音乐与环境音。
125
+
126
+ ### 2.8 Environment:公共运行环境
127
+
128
+ Environment 集中管理跨 Preset 的现实规则:
129
+
130
+ - 使用用户本地时间还是固定演示时间,以及上午、中午、傍晚、夜晚的边界。
131
+ - 外部天气允许值、默认值和宿主注入的实时覆盖。
132
+ - 哪些时间阶段自动开启室内照明。
133
+ - NPC 的默认班次、按角色班次和单个 NPC 覆盖。
134
+
135
+ 核心不会自行联网获取天气;Connector 或宿主 WebView 只需注入标准化的 `clear/cloudy/rain/snow`。因此内容仍完全在本地运行,Environment 也不包含坐标或美术资源。
136
+
137
+ ## 3. 边界判断
138
+
139
+ 遇到新内容时按这张表归类:
140
+
141
+ | 用户想改变的内容 | 所属插槽 |
142
+ | --- | --- |
143
+ | 整体从像素风变成手绘风 | Style |
144
+ | 工位、会议桌和茶水区的位置 | Layout |
145
+ | 阿派穿什么、长什么样 | Agent Skin |
146
+ | 是否出现保安或办公室猫 | NPC |
147
+ | 是否摆放饮水机、沙发或游戏机 | Props |
148
+ | 空闲时去接水、聊天或巡逻 | Life Activities |
149
+ | 现在几点、外部天气、是否开灯、NPC 是否当班 | Environment |
150
+ | 雨夜或白天具体画成什么样 | Atmosphere |
151
+ | “执行命令”是否真的发生 | 不可替换,由 Work Event 决定 |
152
+ | “执行命令”去服务器还是电脑 | Layout 中 Props 的能力映射 |
153
+
154
+ 关键区别是:**Style 是对象的画法,Layout 和 Props 决定场景里有什么,Life Activities 决定空闲时发生什么。**
155
+
156
+ ## 4. Office Preset:用户实际选择的单位
157
+
158
+ 普通用户不需要逐项配置八个组件族。一个 Preset 是经过验证的只读 Office Spec,也是产品界面默认暴露的选择单位:
159
+
160
+ ```json
161
+ {
162
+ "id": "pixel-office-night",
163
+ "name": "像素办公室 · 雨夜",
164
+ "style": "pixel-classic",
165
+ "layout": "demo-office",
166
+ "agentSkin": "tiny-developers",
167
+ "npcs": ["cleaner", "office-cat"],
168
+ "props": ["default-workstations", "coffee-corner", "lounge"],
169
+ "lifeActivities": ["get-water", "coffee-break", "cleaning-round"],
170
+ "atmosphere": "rainy-night",
171
+ "environment": "rainy-night"
172
+ }
173
+ ```
174
+
175
+ 官方提供经过验证的 Preset。Creator 只通过 Capability Catalog 选择兼容组件;组件是否能组合由 Compiler 与 Validator 决定,不承诺任意模块都能自由组合。
176
+
177
+ ## 5. 当前实现对应关系
178
+
179
+ 当前已经有两条明确分开的实现路径:
180
+
181
+ - **原版基线**:`plugins/agent-live/web/office.js`、`plugins/agent-live/web/sprites.js`、`plugins/agent-live/web/style.css` 和 `plugins/agent-live/web/app.js`。只用于保留已验证的 Demo,不再承接新内容开发。
182
+ - **V2 内容入口**:`plugins/agent-live/web/v2.html` 与 `plugins/agent-live/web/v2/bootstrap.js`。Bootstrap 解析 Preset、加载并校验八类内容、创建 Environment Runtime、应用 UI tokens,然后启动 Office Runtime。
183
+ - **V2 原生办公室渲染**:`plugins/agent-live/web/v2/office-renderer.js` 从 Layout、Props 和 Style 配置生成地图、设施、导航与工作特效,不加载原版 `plugins/agent-live/web/office.js`。
184
+ - **V2 原生角色渲染**:`plugins/agent-live/web/v2/sprite-renderer.js` 从 Agent Skin 和 Style 配置生成角色与粒子,不加载原版 `plugins/agent-live/web/sprites.js`。
185
+ - **共享固定 Runtime**:`plugins/agent-live/web/app.js` 仍由原版和 V2 共用,负责 SSE、状态机、移动、气泡、交接、侧栏与动画循环。
186
+ - **工作事实层**:`plugins/agent-live/src/core/protocol.ts`、`plugins/agent-live/src/core/mapping.ts` 和 `plugins/agent-live/src/core/state.ts` 负责 Work Event、工具映射和会话状态,不属于可替换内容。
187
+
188
+ 八类内容已经按目录拆分到 `plugins/agent-live/web/v2/content/`。当前对用户开放三套正式 Preset(tech(科技)、meetingroom(会议室)、oldschool(格子间)),另保留五套内部回归内容;共有两套 Style 和五套 Layout。正式 Office 已通过统一 Component Library、Placement Slot 和 Office Spec Compiler 组装与校验。饮水、保洁与支持人员的本地 Life Activity 已经跑通,真实 Work Event 仍可立即打断 Agent 的生活行为。
189
+
190
+ 新增的两套空间组织已经进入正式 V2 入口:
191
+
192
+ - `old-school-office`:6 个固定格子间、独立经理室、正式会议室、档案 / 复印区、计算机房、前台和茶水间。档案读取、命令执行、规划、通信和委派都有独立落点。
193
+ - `boardroom-office`:一张长桌承载 Agent 两侧坐席,老板 NPC 坐在桌首指挥;主屏、决策墙、AV 控制台、会议电话、资料车和茶水边柜承担其他工作语义。Agent 的真实工作仍落在两侧坐席和对应设施,不冒充老板发言。
194
+
195
+ 两套 Layout 都保持 `single-office-v1`:384×216、单层同屏、8 个可分配座位、连通导航和六种必需 Work Semantic。独立原型页仍作为设计参考保留,正式产品使用 `/v2.html?preset=...`。
196
+
197
+ ## 6. 当前 Demo 的基准合同
198
+
199
+ 配置化不能改变 Demo 已经验证过的基本体验。第一版以以下数据作为 `single-office-v1` 合同:
200
+
201
+ | 项目 | 当前基准 | 约束 |
202
+ | --- | --- | --- |
203
+ | 逻辑画布 | 384 × 216 | Layout 使用同一逻辑坐标系;当前像素 Style 显示时做整数倍缩放 |
204
+ | 镜头 | 单层固定俯视 | 整间办公室始终同屏,不允许平移、缩放或下钻 |
205
+ | 人数 | 1 个主 Agent + 最多 7 个子 Agent | 共用 8 个可分配座位 |
206
+ | 导航 | 3 条横向通道 + 4 条纵向连接 | 所有座位和功能锚点必须连通 |
207
+ | 必需工作能力 | `research/create/compute/plan/communicate/collaborate` | 缺少专用设施时回退到个人工位 |
208
+ | 当前功能点 | 档案柜、工位、服务器、白板、电话桌、会议桌 | 可以换外观或位置,不能让工作事件失去落点 |
209
+ | 当前生活设施 | 咖啡机 | 后续加入饮水、休息和娱乐设施 |
210
+
211
+ 当前 `OfficeAction` 是面向具体家具的事件协议:`type/archive/server/whiteboard/phone/delegate/coffee`。其中前六项用于真实工作,`coffee` 是尚未接入工具映射的生活设施保留项。V2 目前仍接收这组事件以保持宿主协议稳定,但内容侧使用 Work Semantic 和能力标签;咖啡等行为归入 Life Activity,由 Runtime 决定当前 Layout 中实际去哪个 Prop。
212
+
213
+ ## 7. 通用内容清单
214
+
215
+ 每个可替换模块都有一个声明文件,并共享最小元数据:
216
+
217
+ ```json
218
+ {
219
+ "schemaVersion": 1,
220
+ "kind": "style | layout | agent-skin | npc | prop | life-activity | atmosphere | environment | preset",
221
+ "id": "作者命名空间/稳定-id",
222
+ "name": "用户可见名称",
223
+ "version": "1.0.0",
224
+ "engine": { "min": "0.2.0" }
225
+ }
226
+ ```
227
+
228
+ 约束:
229
+
230
+ - `id` 发布后不可改变;展示名称可以本地化。
231
+ - 内容引用只使用 `id`,不依赖目录名或用户可见名称。
232
+ - 第一版只加载声明式 JSON、图片、字体和音频,不允许内容包执行任意 JavaScript。
233
+ - 模块必须声明兼容的 Runtime 合同,第一版只有 `single-office-v1`。
234
+ - 内置默认资源永远存在;可选内容缺失时回退,必需能力缺失时拒绝加载并给出具体错误。
235
+
236
+ 建议的目录不是用户功能,而是实现时的清晰边界:
237
+
238
+ ```text
239
+ content/
240
+ styles/
241
+ layouts/
242
+ agent-skins/
243
+ npcs/
244
+ props/
245
+ life-activities/
246
+ atmospheres/
247
+ environments/
248
+ presets/
249
+ ```
250
+
251
+ ## 8. 各插槽的最小数据合同
252
+
253
+ ### 8.1 Style
254
+
255
+ 第一版 Style 只替换视觉 token,不替换布局几何或运行逻辑:
256
+
257
+ ```json
258
+ {
259
+ "kind": "style",
260
+ "id": "builtin/pixel-classic",
261
+ "contract": "office-2d-style-v1",
262
+ "tokens": {
263
+ "colors": {},
264
+ "typography": {},
265
+ "ui": {},
266
+ "effects": {},
267
+ "motion": {}
268
+ }
269
+ }
270
+ ```
271
+
272
+ `colors` 同时覆盖办公室、角色、状态和 UI;`motion` 只允许调整速度感、粒子数量和动画节奏,不能改变事件顺序。等 Style token 切换稳定以后,才考虑精灵图或完全不同的 renderer。
273
+
274
+ ### 8.2 Layout
275
+
276
+ Layout 是一份单层空间数据:
277
+
278
+ ```json
279
+ {
280
+ "kind": "layout",
281
+ "id": "builtin/demo-office",
282
+ "contract": "single-office-v1",
283
+ "canvas": { "width": 384, "height": 216 },
284
+ "navigation": { "lanes": [], "connectors": [] },
285
+ "seats": [],
286
+ "stations": {},
287
+ "propInstances": [],
288
+ "npcSpawns": [],
289
+ "camera": { "mode": "fixed", "fit": "contain" }
290
+ }
291
+ ```
292
+
293
+ 其中:
294
+
295
+ - `seats` 提供座位编号、人物锚点、朝向和最近通道。
296
+ - `stations` 把 Work Semantic 映射到带相应能力的 Prop anchor。
297
+ - `propInstances` 只记录类型、坐标、朝向和少量外观覆盖。
298
+ - `npcSpawns` 是出生点和路线入口,不等于自动启用某个 NPC。
299
+
300
+ Layout 校验必须确认:画布规格正确、座位不重叠、锚点位于可行走区域、所有必需能力可达、所有通道相互连通。
301
+
302
+ ### 8.3 Prop Type 与 Prop Instance
303
+
304
+ 家具定义和家具摆放必须分开:
305
+
306
+ ```json
307
+ {
308
+ "kind": "prop",
309
+ "id": "builtin/server-rack",
310
+ "size": { "width": 48, "height": 32 },
311
+ "collision": [],
312
+ "anchors": [{ "id": "operate", "x": 24, "y": 42, "dir": "up" }],
313
+ "capabilities": ["compute"],
314
+ "states": ["idle", "active", "success", "error"],
315
+ "renderer": "server-rack"
316
+ }
317
+ ```
318
+
319
+ ```json
320
+ {
321
+ "id": "server-main",
322
+ "type": "builtin/server-rack",
323
+ "x": 296,
324
+ "y": 116,
325
+ "dir": "down"
326
+ }
327
+ ```
328
+
329
+ 同一种服务器可以在多个 Layout 中重复摆放,也可以由 Style 改变画法。能力属于 Prop Type,坐标属于 Prop Instance。
330
+
331
+ ### 8.4 Agent Skin
332
+
333
+ 第一版继续使用当前程序化像素角色,只把参数抽离:
334
+
335
+ ```json
336
+ {
337
+ "kind": "agent-skin",
338
+ "id": "builtin/tiny-developers",
339
+ "contract": "pixel-character-v1",
340
+ "palettes": {},
341
+ "roles": {},
342
+ "animations": ["idle", "walk", "sit", "type", "reach", "talk"]
343
+ }
344
+ ```
345
+
346
+ 运行时仍根据 Agent ID 稳定生成外观;role 可以覆盖服装与职位名称。Skin 必须提供 Runtime 所需的全部动作,不能用缺失动作改变某种工作是否可表现。
347
+
348
+ ### 8.5 NPC
349
+
350
+ NPC 只定义身份和可参与活动,不直接编写工作逻辑:
351
+
352
+ ```json
353
+ {
354
+ "kind": "npc",
355
+ "id": "builtin/cleaner",
356
+ "role": "cleaner",
357
+ "skin": "builtin/tiny-office-staff",
358
+ "spawnTag": "service-entry",
359
+ "schedule": "office-hours",
360
+ "activities": ["builtin/cleaning-round", "builtin/coffee-break"]
361
+ }
362
+ ```
363
+
364
+ NPC 没有宿主 `agentId`、token、工具调用和真实工作状态。侧栏和事件记录必须使用独立的 NPC 标识。
365
+
366
+ ### 8.6 Life Activity
367
+
368
+ 第一版 Life Activity 是有限的声明式动作序列,不开放脚本:
369
+
370
+ ```json
371
+ {
372
+ "kind": "life-activity",
373
+ "id": "builtin/get-water",
374
+ "participants": { "kinds": ["agent", "npc"], "min": 1, "max": 1 },
375
+ "requires": [{ "capability": "water" }],
376
+ "timing": { "durationMs": 9000, "cooldownMs": 120000, "weight": 1 },
377
+ "interruptible": true,
378
+ "steps": [
379
+ { "type": "go-to", "capability": "water" },
380
+ { "type": "pose", "name": "reach", "durationMs": 1800 },
381
+ { "type": "bubble", "text": "接杯水" },
382
+ { "type": "return" }
383
+ ]
384
+ }
385
+ ```
386
+
387
+ 允许的 step 由 Runtime 白名单提供,例如 `go-to`、`pose`、`wait`、`bubble`、`effect` 和 `return`。新的 Work Event 到达时,Runtime 终止生活动作、清除模拟气泡,并重新按真实工作定位角色。
388
+
389
+ ### 8.7 Atmosphere
390
+
391
+ Atmosphere 只提供环境覆盖:
392
+
393
+ ```json
394
+ {
395
+ "kind": "atmosphere",
396
+ "id": "builtin/rainy-night",
397
+ "styleOverrides": {},
398
+ "windowScene": "rain-night",
399
+ "ambientEffects": ["rain"],
400
+ "audio": { "loop": "rain-room.ogg", "volume": 0.25 }
401
+ }
402
+ ```
403
+
404
+ 它可以改变窗外、环境色、装饰层和声音,但不能增加碰撞、移动锚点、角色或工作事件。
405
+
406
+ ### 8.8 Environment
407
+
408
+ Environment 只描述可执行的公共环境规则:
409
+
410
+ ```json
411
+ {
412
+ "kind": "environment",
413
+ "id": "builtin/local-office",
414
+ "render": { "dynamicTime": true, "dynamicWeather": true },
415
+ "clock": { "mode": "local", "phases": [], "preview": {} },
416
+ "weather": { "source": "runtime", "fallback": "clear", "allowedConditions": ["clear", "cloudy", "rain", "snow"] },
417
+ "lighting": { "enabled": true, "activePhases": ["evening", "night"] },
418
+ "npcSchedule": { "enabled": true, "defaultShift": { "start": "06:00", "end": "18:00" }, "roleOverrides": {} }
419
+ }
420
+ ```
421
+
422
+ 班次按“单个 NPC `shift` > 角色覆盖 > 默认班次”解析,也支持跨夜班次。Environment 决定状态,Atmosphere 和 renderer 决定表现,两者不能互相夹带配置。
423
+
424
+ ## 9. Runtime 的事件优先级
425
+
426
+ 同一个角色同一时间只能由一类事件控制。优先级固定为:
427
+
428
+ ```text
429
+ Work Event > 工作后的归位动作 > Life Activity > Ambient Idle
430
+ ```
431
+
432
+ - **Work Event**:来自宿主,包含思考、工具调用、委派、等待、完成和失败,拥有最高优先级。
433
+ - **归位动作**:一次真实工作结束后,角色走回工位或下一个真实工作地点。
434
+ - **Life Activity**:本地模拟的接水、聊天、休息等,只能占用明确空闲的角色。
435
+ - **Ambient Idle**:原地呼吸、看屏幕、窗外光点等不需要调度的环境动画。
436
+
437
+ Agent 参与 Life Activity 必须同时满足:
438
+
439
+ - 状态为 `idle`,没有正在执行的工具、委派交接或离场动作。
440
+ - 最近一段安静时间内没有新的 Work Event;默认可从 8–15 秒之间随机触发。
441
+ - 活动需要的设施存在且可达,没有被其他活动独占。
442
+ - 当前参与人数、冷却时间和出现概率满足要求。
443
+
444
+ NPC 不需要等待 Agent 会话空闲,可以独立巡逻或打扫,但必须避开正在进行的工作交接和主要通道。新的 Work Event 到来时:
445
+
446
+ 1. 立即取消该 Agent 尚未完成的 Life Activity。
447
+ 2. 释放设施占用,清理模拟气泡和模拟特效。
448
+ 3. 从当前位置重新寻路到真实工作锚点,不要求先返回工位。
449
+ 4. 仅在 Office Life 日志中记录“活动被工作打断”,不写入真实任务统计。
450
+
451
+ `waiting` 不等于 `idle`。等待用户回答、等待子 Agent 或等待外部工具时,角色仍处于真实任务上下文,第一版不参加 Life Activity,只显示对应的等待表现。
452
+
453
+ ## 10. Preset 的解析与兼容
454
+
455
+ Preset 是唯一面向普通用户的入口。加载顺序固定为:
456
+
457
+ 1. 加载内置默认内容,建立完整可运行办公室。
458
+ 2. 加载 Environment,建立当前时间、天气、照明和 NPC 班次快照。
459
+ 3. 应用 Preset 指向的 Style 和 Atmosphere。
460
+ 4. 加载 Layout,并解析其中的 Prop Type 与 Prop Instance。
461
+ 5. 加载 Agent Skin 和当前当班的 NPC。
462
+ 6. 只启用当前设施和参与者条件都满足的 Life Activities。
463
+ 7. 校验导航与必需工作能力,成功后一次性切换;失败则继续使用上一个有效 Preset。
464
+
465
+ 兼容原则:
466
+
467
+ | 情况 | 行为 |
468
+ | --- | --- |
469
+ | Style 缺少可选颜色或效果 | 使用内置 token |
470
+ | 可选 Prop 或 NPC 不存在 | 跳过并给出警告 |
471
+ | Life Activity 缺少所需设施 | 不启用该活动 |
472
+ | 专用工作设施缺失 | 优先回退到个人工位 |
473
+ | Layout 不连通或没有可用工位 | Preset 加载失败 |
474
+ | schema 或 Runtime 合同不兼容 | Preset 加载失败,不尝试猜测 |
475
+
476
+ Preset 切换只改变表现内容,不能清空当前会话或改写 Agent 状态。若工作正在进行,第一版可以等本轮结束后切换,避免角色在动作中途跳位。
477
+
478
+ ## 11. 第一版真正要实现的范围
479
+
480
+ “定义为可替换”不等于第一版全部开放给用户。实施顺序收敛为:
481
+
482
+ | 里程碑 | 做什么 | 状态 | 用户是否看见选择器 |
483
+ | --- | --- | --- | --- |
484
+ | M0 | 把当前 Demo 原样整理成一个内置 Preset | 已完成 | 是,作为原版基准选项 |
485
+ | M1 | 抽 Style tokens、Prop registry、Layout、Agent Skin,并切换到 V2 原生渲染器 | 已完成 | 否,验证重构不改变体验 |
486
+ | M2 | 加入饮水机、保洁 NPC 与可中断的接水 / 巡检 Life Activities | 已完成 | 是,由完整 Preset 启用 |
487
+ | M3 | 制作第二套 Style,支持多个官方 Preset | 已完成 | 是,只选择完整 Preset |
488
+ | M4 | 增加老派企业办公室与大会议室长桌办公 Layout、专属 NPC 和 Life Activities | 已完成 | 是,仍以 Preset 为主 |
489
+ | Later | 导入内容包、单独替换插槽和创作者工具 | 未规划 | 有真实需求后再决定 |
490
+
491
+ M0/M1 已完成的验收:
492
+
493
+ - `/agent-live demo` 的事件顺序、角色移动、工具落点和交接动画与当前版本一致。
494
+ - V2 房间、角色和粒子的 15 个逐像素回归用例均无差异。
495
+ - 内置 Preset 与八类内容通过 schema、引用、座位、时间/天气、班次和必需工作能力校验。
496
+ - V2 原生 renderer 不加载原版 `office.js` / `sprites.js`,原版文件保持冻结。
497
+
498
+ M2–M4 新增的验收门:
499
+
500
+ - Layout 中新增的生活设施可达,NPC 路线不会破坏 1–8 名 Agent 的座位与工作落点。
501
+ - Work Event 可以立即打断 Life Activity,且不会把模拟行为写入 token、工具和任务统计。
502
+ - 内容错误有明确提示,前端不会因某张图片或某个可选 NPC 缺失而白屏。
503
+
504
+ 当前迁移入口:
505
+
506
+ - 原版:`/?demo=1`,继续由 `plugins/agent-live/web/office.js`、`plugins/agent-live/web/sprites.js`、`plugins/agent-live/web/app.js` 驱动,不在迁移中修改。
507
+ - 新版:`/v2.html?demo=1&preset=<id>`,加载 URL 指定的 Preset(缺省为 `builtin/tech-open-office`),再由 `plugins/agent-live/web/v2/office-renderer.js` 与 `plugins/agent-live/web/v2/sprite-renderer.js` 原生渲染;只与原版共用固定的 `plugins/agent-live/web/app.js` Runtime。
508
+ - 回归:`/v2/parity.html` 对原版和 V2 的房间、角色与粒子做逐像素比较,当前 15 个用例均为 0 channel differences。
509
+ - 后续只在新版内容和 Runtime 上开发;原版作为视觉与行为回归基线保留。
510
+
511
+ ## 12. 当前不做
512
+
513
+ - 不做 Company Scale,也不提供 Big / Medium / Startup / OPC 选择。
514
+ - 不做园区、多建筑、多楼层、房间下钻或自由镜头。
515
+ - 不开放故事规则、工作语义、地图脚本或任意世界编辑。
516
+ - 不立即建设可视化编辑器、内容市场或任意模块组合系统。