agentshire 1.0.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 (406) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/LICENSE +21 -0
  3. package/README.md +437 -0
  4. package/README.zh-CN.md +441 -0
  5. package/ROADMAP.md +207 -0
  6. package/THIRD_PARTY_NOTICES.md +49 -0
  7. package/VISION.md +101 -0
  8. package/index.ts +386 -0
  9. package/openclaw.plugin.json +27 -0
  10. package/package.json +100 -0
  11. package/src/bridge/AGENTS.md +136 -0
  12. package/src/bridge/ActivityStream.ts +184 -0
  13. package/src/bridge/CitizenManager.ts +280 -0
  14. package/src/bridge/DirectorBridge.ts +1076 -0
  15. package/src/bridge/EventTranslator.ts +142 -0
  16. package/src/bridge/NpcEventQueue.ts +61 -0
  17. package/src/bridge/ReconnectManager.ts +42 -0
  18. package/src/bridge/RouteManager.ts +270 -0
  19. package/src/bridge/StateTracker.ts +100 -0
  20. package/src/bridge/ToolVfxMapper.ts +94 -0
  21. package/src/bridge/__tests__/ActivityStream.test.ts +156 -0
  22. package/src/bridge/__tests__/CitizenManager.test.ts +174 -0
  23. package/src/bridge/__tests__/EventTranslator.test.ts +292 -0
  24. package/src/bridge/__tests__/NpcEventQueue.test.ts +92 -0
  25. package/src/bridge/__tests__/RouteManager.test.ts +106 -0
  26. package/src/bridge/data/route-config.json +36 -0
  27. package/src/bridge/data/route-config.ts +19 -0
  28. package/src/bridge/implicit-chat.ts +192 -0
  29. package/src/bridge/index.ts +12 -0
  30. package/src/contracts/agent-state.ts +87 -0
  31. package/src/contracts/agui.ts +212 -0
  32. package/src/contracts/chat.ts +67 -0
  33. package/src/contracts/events.ts +170 -0
  34. package/src/contracts/index.ts +71 -0
  35. package/src/contracts/media.ts +77 -0
  36. package/src/contracts/registry.ts +32 -0
  37. package/src/plugin/AGENTS.md +192 -0
  38. package/src/plugin/__tests__/editor-serve-megapack.test.ts +150 -0
  39. package/src/plugin/__tests__/hook-translator.test.ts +197 -0
  40. package/src/plugin/auto-config.ts +131 -0
  41. package/src/plugin/channel.ts +399 -0
  42. package/src/plugin/chat-asset-resolver.ts +75 -0
  43. package/src/plugin/chat-session-watcher.ts +98 -0
  44. package/src/plugin/citizen-agent-manager.ts +178 -0
  45. package/src/plugin/citizen-chat-router.ts +83 -0
  46. package/src/plugin/citizen-workshop-manager.ts +96 -0
  47. package/src/plugin/custom-asset-manager.ts +250 -0
  48. package/src/plugin/editor-serve.ts +1368 -0
  49. package/src/plugin/group-discussion.ts +223 -0
  50. package/src/plugin/hook-translator.ts +202 -0
  51. package/src/plugin/llm-agent-proxy.ts +193 -0
  52. package/src/plugin/outbound-adapter.ts +187 -0
  53. package/src/plugin/paths.ts +33 -0
  54. package/src/plugin/plan-manager.ts +594 -0
  55. package/src/plugin/runtime.ts +9 -0
  56. package/src/plugin/session-history.ts +838 -0
  57. package/src/plugin/session-log-watcher.ts +221 -0
  58. package/src/plugin/soul-prompt-template.ts +290 -0
  59. package/src/plugin/subagent-tracker.ts +205 -0
  60. package/src/plugin/tools.ts +493 -0
  61. package/src/plugin/town-session.ts +40 -0
  62. package/src/plugin/ws-server.ts +680 -0
  63. package/src/town-souls.ts +134 -0
  64. package/town-frontend/dist/assets/CustomAssetStore-oi8aIurt.js +2 -0
  65. package/town-frontend/dist/assets/GLTFLoader-BA5RqSME.js +3804 -0
  66. package/town-frontend/dist/assets/OrbitControls-ZmySp9sQ.js +2 -0
  67. package/town-frontend/dist/assets/SettingsPanel-BO52reJe.js +2 -0
  68. package/town-frontend/dist/assets/SkeletonUtils-BCVmgslc.js +2 -0
  69. package/town-frontend/dist/assets/SkillLearnCard-Dk38iDpy.js +6 -0
  70. package/town-frontend/dist/assets/TopicSetupPanel-DLaLHB_Z.js +2 -0
  71. package/town-frontend/dist/assets/Trap-Bold-CT0JBE39.woff2 +0 -0
  72. package/town-frontend/dist/assets/Trap-SemiBold-R4_-Ld0j.woff2 +0 -0
  73. package/town-frontend/dist/assets/WeatherSystem-Cb3BvHes.js +550 -0
  74. package/town-frontend/dist/assets/avatars/char-female-a.webp +0 -0
  75. package/town-frontend/dist/assets/avatars/char-female-b.webp +0 -0
  76. package/town-frontend/dist/assets/avatars/char-female-c.webp +0 -0
  77. package/town-frontend/dist/assets/avatars/char-female-d.webp +0 -0
  78. package/town-frontend/dist/assets/avatars/char-female-e.webp +0 -0
  79. package/town-frontend/dist/assets/avatars/char-female-f.webp +0 -0
  80. package/town-frontend/dist/assets/avatars/char-male-a.webp +0 -0
  81. package/town-frontend/dist/assets/avatars/char-male-b.webp +0 -0
  82. package/town-frontend/dist/assets/avatars/char-male-c.webp +0 -0
  83. package/town-frontend/dist/assets/avatars/char-male-d.webp +0 -0
  84. package/town-frontend/dist/assets/avatars/char-male-e.webp +0 -0
  85. package/town-frontend/dist/assets/avatars/char-male-f.webp +0 -0
  86. package/town-frontend/dist/assets/avatars/char-pet-beaver.webp +0 -0
  87. package/town-frontend/dist/assets/avatars/char-pet-bee.webp +0 -0
  88. package/town-frontend/dist/assets/avatars/char-pet-bunny.webp +0 -0
  89. package/town-frontend/dist/assets/avatars/char-pet-cat.webp +0 -0
  90. package/town-frontend/dist/assets/avatars/char-pet-caterpillar.webp +0 -0
  91. package/town-frontend/dist/assets/avatars/char-pet-chick.webp +0 -0
  92. package/town-frontend/dist/assets/avatars/char-pet-cow.webp +0 -0
  93. package/town-frontend/dist/assets/avatars/char-pet-crab.webp +0 -0
  94. package/town-frontend/dist/assets/avatars/char-pet-deer.webp +0 -0
  95. package/town-frontend/dist/assets/avatars/char-pet-dog.webp +0 -0
  96. package/town-frontend/dist/assets/avatars/char-pet-elephant.webp +0 -0
  97. package/town-frontend/dist/assets/avatars/char-pet-fish.webp +0 -0
  98. package/town-frontend/dist/assets/avatars/char-pet-fox.webp +0 -0
  99. package/town-frontend/dist/assets/avatars/char-pet-giraffe.webp +0 -0
  100. package/town-frontend/dist/assets/avatars/char-pet-hog.webp +0 -0
  101. package/town-frontend/dist/assets/avatars/char-pet-koala.webp +0 -0
  102. package/town-frontend/dist/assets/avatars/char-pet-lion.webp +0 -0
  103. package/town-frontend/dist/assets/avatars/char-pet-monkey.webp +0 -0
  104. package/town-frontend/dist/assets/avatars/char-pet-panda.webp +0 -0
  105. package/town-frontend/dist/assets/avatars/char-pet-parrot.webp +0 -0
  106. package/town-frontend/dist/assets/avatars/char-pet-penguin.webp +0 -0
  107. package/town-frontend/dist/assets/avatars/char-pet-pig.webp +0 -0
  108. package/town-frontend/dist/assets/avatars/char-pet-polar.webp +0 -0
  109. package/town-frontend/dist/assets/avatars/char-pet-tiger.webp +0 -0
  110. package/town-frontend/dist/assets/character-catalog-DSmLtlNC.js +2 -0
  111. package/town-frontend/dist/assets/citizenEditor-DubGSJOQ.js +296 -0
  112. package/town-frontend/dist/assets/command-parser-BUd15Bmv.js +12 -0
  113. package/town-frontend/dist/assets/editor-B5QO0OtX.js +258 -0
  114. package/town-frontend/dist/assets/editor-Bk8g1NCD.css +1 -0
  115. package/town-frontend/dist/assets/index-BWfrufil.js +2 -0
  116. package/town-frontend/dist/assets/index-faS20RJk.js +6 -0
  117. package/town-frontend/dist/assets/logo-DJI6EtST.png +0 -0
  118. package/town-frontend/dist/assets/logo-title-AdKPZX5E.png +0 -0
  119. package/town-frontend/dist/assets/main-CqsN43aT.js +224 -0
  120. package/town-frontend/dist/assets/main-D7neuy3w.css +1 -0
  121. package/town-frontend/dist/assets/models/buildings/base.bin +0 -0
  122. package/town-frontend/dist/assets/models/buildings/base.gltf +136 -0
  123. package/town-frontend/dist/assets/models/buildings/bench.bin +0 -0
  124. package/town-frontend/dist/assets/models/buildings/bench.gltf +136 -0
  125. package/town-frontend/dist/assets/models/buildings/box_A.bin +0 -0
  126. package/town-frontend/dist/assets/models/buildings/box_A.gltf +136 -0
  127. package/town-frontend/dist/assets/models/buildings/box_B.bin +0 -0
  128. package/town-frontend/dist/assets/models/buildings/box_B.gltf +136 -0
  129. package/town-frontend/dist/assets/models/buildings/building_A.bin +0 -0
  130. package/town-frontend/dist/assets/models/buildings/building_A.gltf +136 -0
  131. package/town-frontend/dist/assets/models/buildings/building_A_withoutBase.bin +0 -0
  132. package/town-frontend/dist/assets/models/buildings/building_A_withoutBase.gltf +136 -0
  133. package/town-frontend/dist/assets/models/buildings/building_B.bin +0 -0
  134. package/town-frontend/dist/assets/models/buildings/building_B.gltf +136 -0
  135. package/town-frontend/dist/assets/models/buildings/building_B_withoutBase.bin +0 -0
  136. package/town-frontend/dist/assets/models/buildings/building_B_withoutBase.gltf +136 -0
  137. package/town-frontend/dist/assets/models/buildings/building_C.bin +0 -0
  138. package/town-frontend/dist/assets/models/buildings/building_C.gltf +136 -0
  139. package/town-frontend/dist/assets/models/buildings/building_C_withoutBase.bin +0 -0
  140. package/town-frontend/dist/assets/models/buildings/building_C_withoutBase.gltf +136 -0
  141. package/town-frontend/dist/assets/models/buildings/building_D.bin +0 -0
  142. package/town-frontend/dist/assets/models/buildings/building_D.gltf +136 -0
  143. package/town-frontend/dist/assets/models/buildings/building_D_withoutBase.bin +0 -0
  144. package/town-frontend/dist/assets/models/buildings/building_D_withoutBase.gltf +136 -0
  145. package/town-frontend/dist/assets/models/buildings/building_E.bin +0 -0
  146. package/town-frontend/dist/assets/models/buildings/building_E.gltf +136 -0
  147. package/town-frontend/dist/assets/models/buildings/building_E_withoutBase.bin +0 -0
  148. package/town-frontend/dist/assets/models/buildings/building_E_withoutBase.gltf +136 -0
  149. package/town-frontend/dist/assets/models/buildings/building_F.bin +0 -0
  150. package/town-frontend/dist/assets/models/buildings/building_F.gltf +136 -0
  151. package/town-frontend/dist/assets/models/buildings/building_F_withoutBase.bin +0 -0
  152. package/town-frontend/dist/assets/models/buildings/building_F_withoutBase.gltf +136 -0
  153. package/town-frontend/dist/assets/models/buildings/building_G.bin +0 -0
  154. package/town-frontend/dist/assets/models/buildings/building_G.gltf +136 -0
  155. package/town-frontend/dist/assets/models/buildings/building_G_withoutBase.bin +0 -0
  156. package/town-frontend/dist/assets/models/buildings/building_G_withoutBase.gltf +136 -0
  157. package/town-frontend/dist/assets/models/buildings/building_H.bin +0 -0
  158. package/town-frontend/dist/assets/models/buildings/building_H.gltf +136 -0
  159. package/town-frontend/dist/assets/models/buildings/building_H_withoutBase.bin +0 -0
  160. package/town-frontend/dist/assets/models/buildings/building_H_withoutBase.gltf +136 -0
  161. package/town-frontend/dist/assets/models/buildings/bush.bin +0 -0
  162. package/town-frontend/dist/assets/models/buildings/bush.gltf +136 -0
  163. package/town-frontend/dist/assets/models/buildings/car_hatchback.bin +0 -0
  164. package/town-frontend/dist/assets/models/buildings/car_hatchback.gltf +442 -0
  165. package/town-frontend/dist/assets/models/buildings/car_police.bin +0 -0
  166. package/town-frontend/dist/assets/models/buildings/car_police.gltf +442 -0
  167. package/town-frontend/dist/assets/models/buildings/car_sedan.bin +0 -0
  168. package/town-frontend/dist/assets/models/buildings/car_sedan.gltf +442 -0
  169. package/town-frontend/dist/assets/models/buildings/car_stationwagon.bin +0 -0
  170. package/town-frontend/dist/assets/models/buildings/car_stationwagon.gltf +442 -0
  171. package/town-frontend/dist/assets/models/buildings/car_taxi.bin +0 -0
  172. package/town-frontend/dist/assets/models/buildings/car_taxi.gltf +442 -0
  173. package/town-frontend/dist/assets/models/buildings/citybits_texture.png +0 -0
  174. package/town-frontend/dist/assets/models/buildings/dumpster.bin +0 -0
  175. package/town-frontend/dist/assets/models/buildings/dumpster.gltf +136 -0
  176. package/town-frontend/dist/assets/models/buildings/firehydrant.bin +0 -0
  177. package/town-frontend/dist/assets/models/buildings/firehydrant.gltf +136 -0
  178. package/town-frontend/dist/assets/models/buildings/road_corner.bin +0 -0
  179. package/town-frontend/dist/assets/models/buildings/road_corner.gltf +136 -0
  180. package/town-frontend/dist/assets/models/buildings/road_corner_curved.bin +0 -0
  181. package/town-frontend/dist/assets/models/buildings/road_corner_curved.gltf +136 -0
  182. package/town-frontend/dist/assets/models/buildings/road_junction.bin +0 -0
  183. package/town-frontend/dist/assets/models/buildings/road_junction.gltf +136 -0
  184. package/town-frontend/dist/assets/models/buildings/road_straight.bin +0 -0
  185. package/town-frontend/dist/assets/models/buildings/road_straight.gltf +136 -0
  186. package/town-frontend/dist/assets/models/buildings/road_straight_crossing.bin +0 -0
  187. package/town-frontend/dist/assets/models/buildings/road_straight_crossing.gltf +136 -0
  188. package/town-frontend/dist/assets/models/buildings/road_tsplit.bin +0 -0
  189. package/town-frontend/dist/assets/models/buildings/road_tsplit.gltf +136 -0
  190. package/town-frontend/dist/assets/models/buildings/streetlight.bin +0 -0
  191. package/town-frontend/dist/assets/models/buildings/streetlight.gltf +136 -0
  192. package/town-frontend/dist/assets/models/buildings/trafficlight_A.bin +0 -0
  193. package/town-frontend/dist/assets/models/buildings/trafficlight_A.gltf +136 -0
  194. package/town-frontend/dist/assets/models/buildings/trafficlight_B.bin +0 -0
  195. package/town-frontend/dist/assets/models/buildings/trafficlight_B.gltf +136 -0
  196. package/town-frontend/dist/assets/models/buildings/trafficlight_C.bin +0 -0
  197. package/town-frontend/dist/assets/models/buildings/trafficlight_C.gltf +136 -0
  198. package/town-frontend/dist/assets/models/buildings/trash_A.bin +0 -0
  199. package/town-frontend/dist/assets/models/buildings/trash_A.gltf +136 -0
  200. package/town-frontend/dist/assets/models/buildings/trash_B.bin +0 -0
  201. package/town-frontend/dist/assets/models/buildings/trash_B.gltf +136 -0
  202. package/town-frontend/dist/assets/models/buildings/watertower.bin +0 -0
  203. package/town-frontend/dist/assets/models/buildings/watertower.gltf +136 -0
  204. package/town-frontend/dist/assets/models/characters/Textures/colormap.png +0 -0
  205. package/town-frontend/dist/assets/models/characters/character-female-a.glb +0 -0
  206. package/town-frontend/dist/assets/models/characters/character-female-b.glb +0 -0
  207. package/town-frontend/dist/assets/models/characters/character-female-c.glb +0 -0
  208. package/town-frontend/dist/assets/models/characters/character-female-d.glb +0 -0
  209. package/town-frontend/dist/assets/models/characters/character-female-e.glb +0 -0
  210. package/town-frontend/dist/assets/models/characters/character-female-f.glb +0 -0
  211. package/town-frontend/dist/assets/models/characters/character-male-a.glb +0 -0
  212. package/town-frontend/dist/assets/models/characters/character-male-b.glb +0 -0
  213. package/town-frontend/dist/assets/models/characters/character-male-c.glb +0 -0
  214. package/town-frontend/dist/assets/models/characters/character-male-d.glb +0 -0
  215. package/town-frontend/dist/assets/models/characters/character-male-e.glb +0 -0
  216. package/town-frontend/dist/assets/models/characters/character-male-f.glb +0 -0
  217. package/town-frontend/dist/assets/models/characters/character-pet-beaver.glb +0 -0
  218. package/town-frontend/dist/assets/models/characters/character-pet-bee.glb +0 -0
  219. package/town-frontend/dist/assets/models/characters/character-pet-bunny.glb +0 -0
  220. package/town-frontend/dist/assets/models/characters/character-pet-cat.glb +0 -0
  221. package/town-frontend/dist/assets/models/characters/character-pet-caterpillar.glb +0 -0
  222. package/town-frontend/dist/assets/models/characters/character-pet-chick.glb +0 -0
  223. package/town-frontend/dist/assets/models/characters/character-pet-cow.glb +0 -0
  224. package/town-frontend/dist/assets/models/characters/character-pet-crab.glb +0 -0
  225. package/town-frontend/dist/assets/models/characters/character-pet-deer.glb +0 -0
  226. package/town-frontend/dist/assets/models/characters/character-pet-dog.glb +0 -0
  227. package/town-frontend/dist/assets/models/characters/character-pet-elephant.glb +0 -0
  228. package/town-frontend/dist/assets/models/characters/character-pet-fish.glb +0 -0
  229. package/town-frontend/dist/assets/models/characters/character-pet-fox.glb +0 -0
  230. package/town-frontend/dist/assets/models/characters/character-pet-giraffe.glb +0 -0
  231. package/town-frontend/dist/assets/models/characters/character-pet-hog.glb +0 -0
  232. package/town-frontend/dist/assets/models/characters/character-pet-koala.glb +0 -0
  233. package/town-frontend/dist/assets/models/characters/character-pet-lion.glb +0 -0
  234. package/town-frontend/dist/assets/models/characters/character-pet-monkey.glb +0 -0
  235. package/town-frontend/dist/assets/models/characters/character-pet-panda.glb +0 -0
  236. package/town-frontend/dist/assets/models/characters/character-pet-parrot.glb +0 -0
  237. package/town-frontend/dist/assets/models/characters/character-pet-penguin.glb +0 -0
  238. package/town-frontend/dist/assets/models/characters/character-pet-pig.glb +0 -0
  239. package/town-frontend/dist/assets/models/characters/character-pet-polar.glb +0 -0
  240. package/town-frontend/dist/assets/models/characters/character-pet-tiger.glb +0 -0
  241. package/town-frontend/dist/assets/models/characters/colormap.png +0 -0
  242. package/town-frontend/dist/assets/models/furniture/armchair.bin +0 -0
  243. package/town-frontend/dist/assets/models/furniture/armchair.gltf +136 -0
  244. package/town-frontend/dist/assets/models/furniture/armchair_pillows.bin +0 -0
  245. package/town-frontend/dist/assets/models/furniture/armchair_pillows.gltf +136 -0
  246. package/town-frontend/dist/assets/models/furniture/bed_double_A.bin +0 -0
  247. package/town-frontend/dist/assets/models/furniture/bed_double_A.gltf +136 -0
  248. package/town-frontend/dist/assets/models/furniture/bed_double_B.bin +0 -0
  249. package/town-frontend/dist/assets/models/furniture/bed_double_B.gltf +136 -0
  250. package/town-frontend/dist/assets/models/furniture/bed_single_A.bin +0 -0
  251. package/town-frontend/dist/assets/models/furniture/bed_single_A.gltf +136 -0
  252. package/town-frontend/dist/assets/models/furniture/bed_single_B.bin +0 -0
  253. package/town-frontend/dist/assets/models/furniture/bed_single_B.gltf +136 -0
  254. package/town-frontend/dist/assets/models/furniture/book_set.bin +0 -0
  255. package/town-frontend/dist/assets/models/furniture/book_set.gltf +136 -0
  256. package/town-frontend/dist/assets/models/furniture/book_single.bin +0 -0
  257. package/town-frontend/dist/assets/models/furniture/book_single.gltf +136 -0
  258. package/town-frontend/dist/assets/models/furniture/cabinet_medium.bin +0 -0
  259. package/town-frontend/dist/assets/models/furniture/cabinet_medium.gltf +136 -0
  260. package/town-frontend/dist/assets/models/furniture/cabinet_medium_decorated.bin +0 -0
  261. package/town-frontend/dist/assets/models/furniture/cabinet_medium_decorated.gltf +136 -0
  262. package/town-frontend/dist/assets/models/furniture/cabinet_small.bin +0 -0
  263. package/town-frontend/dist/assets/models/furniture/cabinet_small.gltf +136 -0
  264. package/town-frontend/dist/assets/models/furniture/cabinet_small_decorated.bin +0 -0
  265. package/town-frontend/dist/assets/models/furniture/cabinet_small_decorated.gltf +136 -0
  266. package/town-frontend/dist/assets/models/furniture/cactus_medium_A.bin +0 -0
  267. package/town-frontend/dist/assets/models/furniture/cactus_medium_A.gltf +136 -0
  268. package/town-frontend/dist/assets/models/furniture/cactus_medium_B.bin +0 -0
  269. package/town-frontend/dist/assets/models/furniture/cactus_medium_B.gltf +136 -0
  270. package/town-frontend/dist/assets/models/furniture/cactus_small_A.bin +0 -0
  271. package/town-frontend/dist/assets/models/furniture/cactus_small_A.gltf +136 -0
  272. package/town-frontend/dist/assets/models/furniture/cactus_small_B.bin +0 -0
  273. package/town-frontend/dist/assets/models/furniture/cactus_small_B.gltf +136 -0
  274. package/town-frontend/dist/assets/models/furniture/chair_A.bin +0 -0
  275. package/town-frontend/dist/assets/models/furniture/chair_A.gltf +136 -0
  276. package/town-frontend/dist/assets/models/furniture/chair_A_wood.bin +0 -0
  277. package/town-frontend/dist/assets/models/furniture/chair_A_wood.gltf +136 -0
  278. package/town-frontend/dist/assets/models/furniture/chair_B.bin +0 -0
  279. package/town-frontend/dist/assets/models/furniture/chair_B.gltf +136 -0
  280. package/town-frontend/dist/assets/models/furniture/chair_B_wood.bin +0 -0
  281. package/town-frontend/dist/assets/models/furniture/chair_B_wood.gltf +136 -0
  282. package/town-frontend/dist/assets/models/furniture/chair_C.bin +0 -0
  283. package/town-frontend/dist/assets/models/furniture/chair_C.gltf +136 -0
  284. package/town-frontend/dist/assets/models/furniture/chair_stool.bin +0 -0
  285. package/town-frontend/dist/assets/models/furniture/chair_stool.gltf +136 -0
  286. package/town-frontend/dist/assets/models/furniture/chair_stool_wood.bin +0 -0
  287. package/town-frontend/dist/assets/models/furniture/chair_stool_wood.gltf +136 -0
  288. package/town-frontend/dist/assets/models/furniture/couch.bin +0 -0
  289. package/town-frontend/dist/assets/models/furniture/couch.gltf +136 -0
  290. package/town-frontend/dist/assets/models/furniture/couch_pillows.bin +0 -0
  291. package/town-frontend/dist/assets/models/furniture/couch_pillows.gltf +136 -0
  292. package/town-frontend/dist/assets/models/furniture/furniturebits_texture.png +0 -0
  293. package/town-frontend/dist/assets/models/furniture/lamp_standing.bin +0 -0
  294. package/town-frontend/dist/assets/models/furniture/lamp_standing.gltf +136 -0
  295. package/town-frontend/dist/assets/models/furniture/lamp_table.bin +0 -0
  296. package/town-frontend/dist/assets/models/furniture/lamp_table.gltf +136 -0
  297. package/town-frontend/dist/assets/models/furniture/pictureframe_large_A.bin +0 -0
  298. package/town-frontend/dist/assets/models/furniture/pictureframe_large_A.gltf +136 -0
  299. package/town-frontend/dist/assets/models/furniture/pictureframe_large_B.bin +0 -0
  300. package/town-frontend/dist/assets/models/furniture/pictureframe_large_B.gltf +136 -0
  301. package/town-frontend/dist/assets/models/furniture/pictureframe_medium.bin +0 -0
  302. package/town-frontend/dist/assets/models/furniture/pictureframe_medium.gltf +136 -0
  303. package/town-frontend/dist/assets/models/furniture/pictureframe_small_A.bin +0 -0
  304. package/town-frontend/dist/assets/models/furniture/pictureframe_small_A.gltf +136 -0
  305. package/town-frontend/dist/assets/models/furniture/pictureframe_small_B.bin +0 -0
  306. package/town-frontend/dist/assets/models/furniture/pictureframe_small_B.gltf +136 -0
  307. package/town-frontend/dist/assets/models/furniture/pictureframe_small_C.bin +0 -0
  308. package/town-frontend/dist/assets/models/furniture/pictureframe_small_C.gltf +136 -0
  309. package/town-frontend/dist/assets/models/furniture/pictureframe_standing_A.bin +0 -0
  310. package/town-frontend/dist/assets/models/furniture/pictureframe_standing_A.gltf +136 -0
  311. package/town-frontend/dist/assets/models/furniture/pictureframe_standing_B.bin +0 -0
  312. package/town-frontend/dist/assets/models/furniture/pictureframe_standing_B.gltf +136 -0
  313. package/town-frontend/dist/assets/models/furniture/pillow_A.bin +0 -0
  314. package/town-frontend/dist/assets/models/furniture/pillow_A.gltf +136 -0
  315. package/town-frontend/dist/assets/models/furniture/pillow_B.bin +0 -0
  316. package/town-frontend/dist/assets/models/furniture/pillow_B.gltf +136 -0
  317. package/town-frontend/dist/assets/models/furniture/rug_oval_A.bin +0 -0
  318. package/town-frontend/dist/assets/models/furniture/rug_oval_A.gltf +136 -0
  319. package/town-frontend/dist/assets/models/furniture/rug_oval_B.bin +0 -0
  320. package/town-frontend/dist/assets/models/furniture/rug_oval_B.gltf +136 -0
  321. package/town-frontend/dist/assets/models/furniture/rug_rectangle_A.bin +0 -0
  322. package/town-frontend/dist/assets/models/furniture/rug_rectangle_A.gltf +136 -0
  323. package/town-frontend/dist/assets/models/furniture/rug_rectangle_B.bin +0 -0
  324. package/town-frontend/dist/assets/models/furniture/rug_rectangle_B.gltf +136 -0
  325. package/town-frontend/dist/assets/models/furniture/rug_rectangle_stripes_A.bin +0 -0
  326. package/town-frontend/dist/assets/models/furniture/rug_rectangle_stripes_A.gltf +136 -0
  327. package/town-frontend/dist/assets/models/furniture/rug_rectangle_stripes_B.bin +0 -0
  328. package/town-frontend/dist/assets/models/furniture/rug_rectangle_stripes_B.gltf +136 -0
  329. package/town-frontend/dist/assets/models/furniture/shelf_A_big.bin +0 -0
  330. package/town-frontend/dist/assets/models/furniture/shelf_A_big.gltf +136 -0
  331. package/town-frontend/dist/assets/models/furniture/shelf_A_small.bin +0 -0
  332. package/town-frontend/dist/assets/models/furniture/shelf_A_small.gltf +136 -0
  333. package/town-frontend/dist/assets/models/furniture/shelf_B_large.bin +0 -0
  334. package/town-frontend/dist/assets/models/furniture/shelf_B_large.gltf +136 -0
  335. package/town-frontend/dist/assets/models/furniture/shelf_B_large_decorated.bin +0 -0
  336. package/town-frontend/dist/assets/models/furniture/shelf_B_large_decorated.gltf +136 -0
  337. package/town-frontend/dist/assets/models/furniture/shelf_B_small.bin +0 -0
  338. package/town-frontend/dist/assets/models/furniture/shelf_B_small.gltf +136 -0
  339. package/town-frontend/dist/assets/models/furniture/shelf_B_small_decorated.bin +0 -0
  340. package/town-frontend/dist/assets/models/furniture/shelf_B_small_decorated.gltf +136 -0
  341. package/town-frontend/dist/assets/models/furniture/table_low.bin +0 -0
  342. package/town-frontend/dist/assets/models/furniture/table_low.gltf +136 -0
  343. package/town-frontend/dist/assets/models/furniture/table_medium.bin +0 -0
  344. package/town-frontend/dist/assets/models/furniture/table_medium.gltf +136 -0
  345. package/town-frontend/dist/assets/models/furniture/table_medium_long.bin +0 -0
  346. package/town-frontend/dist/assets/models/furniture/table_medium_long.gltf +136 -0
  347. package/town-frontend/dist/assets/models/furniture/table_small.bin +0 -0
  348. package/town-frontend/dist/assets/models/furniture/table_small.gltf +136 -0
  349. package/town-frontend/dist/assets/models/props/bench.bin +0 -0
  350. package/town-frontend/dist/assets/models/props/bench.gltf +136 -0
  351. package/town-frontend/dist/assets/models/props/bush.bin +0 -0
  352. package/town-frontend/dist/assets/models/props/bush.gltf +136 -0
  353. package/town-frontend/dist/assets/models/props/capybara.glb +0 -0
  354. package/town-frontend/dist/assets/models/props/car_hatchback.bin +0 -0
  355. package/town-frontend/dist/assets/models/props/car_hatchback.gltf +442 -0
  356. package/town-frontend/dist/assets/models/props/car_sedan.bin +0 -0
  357. package/town-frontend/dist/assets/models/props/car_sedan.gltf +442 -0
  358. package/town-frontend/dist/assets/models/props/car_taxi.bin +0 -0
  359. package/town-frontend/dist/assets/models/props/car_taxi.gltf +442 -0
  360. package/town-frontend/dist/assets/models/props/citybits_texture.png +0 -0
  361. package/town-frontend/dist/assets/models/props/dumpster.bin +0 -0
  362. package/town-frontend/dist/assets/models/props/dumpster.gltf +136 -0
  363. package/town-frontend/dist/assets/models/props/firehydrant.bin +0 -0
  364. package/town-frontend/dist/assets/models/props/firehydrant.gltf +136 -0
  365. package/town-frontend/dist/assets/models/props/streetlight.bin +0 -0
  366. package/town-frontend/dist/assets/models/props/streetlight.gltf +136 -0
  367. package/town-frontend/dist/assets/models/props/trafficlight_A.bin +0 -0
  368. package/town-frontend/dist/assets/models/props/trafficlight_A.gltf +136 -0
  369. package/town-frontend/dist/assets/models/props/trash_A.bin +0 -0
  370. package/town-frontend/dist/assets/models/props/trash_A.gltf +136 -0
  371. package/town-frontend/dist/assets/models/props/watertower.bin +0 -0
  372. package/town-frontend/dist/assets/models/props/watertower.gltf +136 -0
  373. package/town-frontend/dist/assets/models/stage-deco/Flowers_1_D.glb +0 -0
  374. package/town-frontend/dist/assets/models/stage-deco/Flowers_2_B.glb +0 -0
  375. package/town-frontend/dist/assets/models/stage-deco/Grass_A_1.glb +0 -0
  376. package/town-frontend/dist/assets/models/stage-deco/Park_GrassHill_A.glb +0 -0
  377. package/town-frontend/dist/assets/models/stage-deco/Pebles_1_A_2.glb +0 -0
  378. package/town-frontend/dist/assets/music/bgm_day.mp3 +0 -0
  379. package/town-frontend/dist/assets/music/bgm_dusk.mp3 +0 -0
  380. package/town-frontend/dist/assets/music/bgm_night.mp3 +0 -0
  381. package/town-frontend/dist/assets/music/bgm_work.mp3 +0 -0
  382. package/town-frontend/dist/assets/office-whiteboard-idle-CyEwBrq_.webp +0 -0
  383. package/town-frontend/dist/assets/preview-B6hYEQij.js +2 -0
  384. package/town-frontend/dist/assets/town-BKesnERP.js +8888 -0
  385. package/town-frontend/dist/assets/town-BnswKsjF.css +1 -0
  386. package/town-frontend/dist/citizen-editor.html +166 -0
  387. package/town-frontend/dist/editor.html +227 -0
  388. package/town-frontend/dist/index.html +22 -0
  389. package/town-frontend/dist/preview.html +56 -0
  390. package/town-frontend/dist/town.html +165 -0
  391. package/town-frontend/dist/viewer.html +91 -0
  392. package/town-souls/CHEN.md +130 -0
  393. package/town-souls/CHENGZI.md +92 -0
  394. package/town-souls/CITIZEN_tpl.md +16 -0
  395. package/town-souls/DIANDIAN.md +92 -0
  396. package/town-souls/HAITANG.md +94 -0
  397. package/town-souls/QIQI.md +119 -0
  398. package/town-souls/SOUL.md +141 -0
  399. package/town-souls/SOUL_tpl.md +135 -0
  400. package/town-souls/XIAOLIE.md +107 -0
  401. package/town-souls/YAN.md +107 -0
  402. package/town-workspace/IDENTITY.md +5 -0
  403. package/town-workspace/SOUL.md +141 -0
  404. package/town-workspace/project-workflow.md +81 -0
  405. package/town-workspace/town-defaults.json +92 -0
  406. package/town-workspace/town-guide.md +45 -0
@@ -0,0 +1,227 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Agentshire Editor</title>
7
+ <link rel="icon" href="./assets/logo-DJI6EtST.png" />
8
+ <script type="module" crossorigin src="./assets/editor-B5QO0OtX.js"></script>
9
+ <link rel="modulepreload" crossorigin href="./assets/index-BWfrufil.js">
10
+ <link rel="modulepreload" crossorigin href="./assets/GLTFLoader-BA5RqSME.js">
11
+ <link rel="modulepreload" crossorigin href="./assets/SkeletonUtils-BCVmgslc.js">
12
+ <link rel="modulepreload" crossorigin href="./assets/CustomAssetStore-oi8aIurt.js">
13
+ <link rel="modulepreload" crossorigin href="./assets/OrbitControls-ZmySp9sQ.js">
14
+ <link rel="stylesheet" crossorigin href="./assets/editor-Bk8g1NCD.css">
15
+ </head>
16
+ <body>
17
+ <div id="editor-root">
18
+ <!-- 3D Canvas (full screen, behind everything) -->
19
+ <div id="scene-container"></div>
20
+
21
+ <!-- Loading overlay -->
22
+ <div id="editor-loading">
23
+ <div class="loading-spinner"></div>
24
+ <div class="loading-text" data-i18n="editor.loading_assets">加载美术资产...</div>
25
+ <div class="loading-progress" id="loading-progress"></div>
26
+ </div>
27
+
28
+ <!-- Top Nav Bar: brand + module tabs + global actions -->
29
+ <div id="editor-toolbar">
30
+ <a class="toolbar-brand" href="/">
31
+ <img src="./assets/logo-title-AdKPZX5E.png" alt="Agentshire" class="toolbar-logo" />
32
+ </a>
33
+ <nav class="editor-mode-switch" aria-label="工坊切换">
34
+ <div class="editor-mode-indicator"></div>
35
+ <button type="button" class="editor-mode-btn active" data-mode="scene" data-i18n="editor.scene_workshop">
36
+ 场景工坊
37
+ </button>
38
+ <a class="editor-mode-btn" href="citizen-editor.html" data-i18n="editor.citizen_workshop">
39
+ 角色工坊
40
+ </a>
41
+ </nav>
42
+
43
+ <span class="toolbar-spacer"></span>
44
+
45
+ <div class="toolbar-section">
46
+ <button class="toolbar-btn" id="btn-undo" title="撤销 (Ctrl+Z)" data-i18n-title="editor.undo">
47
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="1 4 1 10 7 10"/><path d="M3.51 15a9 9 0 102.13-9.36L1 10"/></svg>
48
+ </button>
49
+ <button class="toolbar-btn" id="btn-redo" title="重做 (Ctrl+Shift+Z)" data-i18n-title="editor.redo">
50
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="23 4 23 10 17 10"/><path d="M20.49 15a9 9 0 11-2.13-9.36L23 10"/></svg>
51
+ </button>
52
+ </div>
53
+
54
+ <div class="toolbar-section">
55
+ <button class="toolbar-btn" id="btn-save" title="保存 (Ctrl+S)" data-i18n-title="editor.save">
56
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M19 21H5a2 2 0 01-2-2V5a2 2 0 012-2h11l5 5v11a2 2 0 01-2 2z"/><polyline points="17 21 17 13 7 13 7 21"/><polyline points="7 3 7 8 15 8"/></svg>
57
+ <span data-i18n="editor.save">保存</span>
58
+ </button>
59
+ <button class="toolbar-btn" id="btn-preview" title="预览模式 (P)" data-i18n-title="editor.preview">
60
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="5 3 19 12 5 21 5 3"/></svg>
61
+ <span data-i18n="editor.preview">预览</span>
62
+ </button>
63
+ <span class="publish-wrap" title="Coming Soon">
64
+ <button class="toolbar-btn-primary" id="btn-publish" disabled>
65
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 2L11 13M22 2l-7 20-4-9-9-4 20-7z"/></svg>
66
+ <span data-i18n="editor.publish">发布</span>
67
+ </button>
68
+ </span>
69
+ <div class="more-dropdown">
70
+ <button class="toolbar-btn" id="btn-more" title="更多" data-i18n-title="editor.more">
71
+ <svg viewBox="0 0 24 24" fill="currentColor" stroke="none"><circle cx="12" cy="5" r="2"/><circle cx="12" cy="12" r="2"/><circle cx="12" cy="19" r="2"/></svg>
72
+ </button>
73
+ <div class="more-menu" id="more-menu">
74
+ <button id="btn-import">
75
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>
76
+ <span data-i18n="editor.import_map">导入地图</span>
77
+ </button>
78
+ <button id="btn-export">
79
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4"/><polyline points="17 8 12 3 7 8"/><line x1="12" y1="3" x2="12" y2="15"/></svg>
80
+ <span data-i18n="editor.export_map">导出地图</span>
81
+ </button>
82
+ <div class="menu-divider"></div>
83
+ <button id="btn-clear" class="menu-danger">
84
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 6h18"/><path d="M19 6v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6"/><path d="M8 6V4a2 2 0 012-2h4a2 2 0 012 2v2"/></svg>
85
+ <span data-i18n="editor.clear_map">清空地图</span>
86
+ </button>
87
+ </div>
88
+ </div>
89
+ </div>
90
+ </div>
91
+
92
+ <!-- Bottom Floating Toolbar (Figma-style, scene mode context tools) -->
93
+ <div id="scene-toolbar">
94
+ <div class="ftb-group">
95
+ <button class="ftb-btn active" data-tool="select" data-tip="选择 (V)" data-i18n-tip="editor.select_tool">
96
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 3l7.07 16.97 2.51-7.39 7.39-2.51L3 3z"/></svg>
97
+ </button>
98
+ <button class="ftb-btn" data-tool="terrain" data-tip="地形刷 (T)" data-i18n-tip="editor.terrain_tool">
99
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 19l7-7 3 3-7 7-3-3z"/><path d="M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z"/></svg>
100
+ </button>
101
+ <button class="ftb-btn" data-tool="erase" data-tip="删除 (X)" data-i18n-tip="editor.erase_tool">
102
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 6h18M19 6v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6m3 0V4a2 2 0 012-2h4a2 2 0 012 2v2"/></svg>
103
+ </button>
104
+ </div>
105
+
106
+ <div class="ftb-divider"></div>
107
+
108
+ <div class="ftb-group">
109
+ <button class="ftb-btn" id="btn-bindings" data-tip="功能绑定" data-i18n-tip="editor.bindings">
110
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M10 13a5 5 0 007.54.54l3-3a5 5 0 00-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 00-7.54-.54l-3 3a5 5 0 007.07 7.07l1.71-1.71"/></svg>
111
+ </button>
112
+ <div class="resize-dropdown resize-dropdown--up">
113
+ <button class="ftb-btn" id="btn-resize-trigger" data-tip="扩建地图" data-i18n-tip="editor.resize">
114
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="15 3 21 3 21 9"/><polyline points="9 21 3 21 3 15"/><line x1="21" y1="3" x2="14" y2="10"/><line x1="3" y1="21" x2="10" y2="14"/></svg>
115
+ </button>
116
+ <div class="resize-menu" id="resize-menu">
117
+ <button data-dir="right" data-amount="8">→ 向右扩展 +8 列</button>
118
+ <button data-dir="bottom" data-amount="8">↓ 向下扩展 +8 行</button>
119
+ <button data-dir="left" data-amount="8">← 向左扩展 +8 列</button>
120
+ <button data-dir="top" data-amount="8">↑ 向上扩展 +8 行</button>
121
+ <div class="resize-divider"></div>
122
+ <button data-dir="right" data-amount="-8">→ 向右收缩 -8 列</button>
123
+ <button data-dir="bottom" data-amount="-8">↓ 向下收缩 -8 行</button>
124
+ <button data-dir="left" data-amount="-8">← 向左收缩 -8 列</button>
125
+ <button data-dir="top" data-amount="-8">↑ 向上收缩 -8 行</button>
126
+ </div>
127
+ </div>
128
+ </div>
129
+
130
+ <div class="ftb-divider"></div>
131
+
132
+ <div class="ftb-group">
133
+ <div class="ftb-camera-toggle" id="btn-camera-toggle" data-tip="透视模式 (Tab)" data-i18n-tip="editor.persp_mode">
134
+ <div class="ftb-camera-track">
135
+ <div class="ftb-camera-thumb">
136
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 16V8a2 2 0 00-1-1.73l-7-4a2 2 0 00-2 0l-7 4A2 2 0 003 8v8a2 2 0 001 1.73l7 4a2 2 0 002 0l7-4A2 2 0 0021 16z"/><polyline points="3.27 6.96 12 12.01 20.73 6.96"/><line x1="12" y1="22.08" x2="12" y2="12"/></svg>
137
+ </div>
138
+ </div>
139
+ </div>
140
+ </div>
141
+ </div>
142
+
143
+ <!-- Terrain bar (above bottom toolbar, only visible in terrain mode) -->
144
+ <div id="terrain-bar"></div>
145
+
146
+ <!-- Left: Asset palette (floating) -->
147
+ <div id="asset-palette">
148
+ <div class="panel-header">
149
+ <span class="panel-title" data-i18n="editor.asset_lib">资产库</span>
150
+ <button class="panel-collapse" id="btn-collapse-palette">
151
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M15 18l-6-6 6-6"/></svg>
152
+ </button>
153
+ </div>
154
+ <div class="palette-tabs">
155
+ <button class="palette-tab active" data-category="buildings" data-i18n="editor.buildings">建筑</button>
156
+ <button class="palette-tab" data-category="roads" data-i18n="editor.roads">道路</button>
157
+ <button class="palette-tab" data-category="nature" data-i18n="editor.nature">自然</button>
158
+ <button class="palette-tab" data-category="streetProps" data-i18n="editor.props">道具</button>
159
+ </div>
160
+ <div class="palette-list" id="palette-list"></div>
161
+ </div>
162
+ <!-- Expand button (must be AFTER #asset-palette for ~ selector) -->
163
+ <button id="btn-expand-palette" class="palette-expand-btn" title="展开资产面板">
164
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M9 18l6-6-6-6"/></svg>
165
+ <span class="expand-label" data-i18n="editor.asset_lib">资产库</span>
166
+ </button>
167
+
168
+ <!-- Right: Property inspector (floating, appears on selection) -->
169
+ <div id="property-inspector"></div>
170
+
171
+ <!-- Asset preview floating window (right of palette) -->
172
+ <div id="asset-preview">
173
+ <div class="preview-header">
174
+ <span class="preview-title" data-i18n="editor.asset_preview">资产预览</span>
175
+ <button class="preview-close">
176
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 6L6 18M6 6l12 12"/></svg>
177
+ </button>
178
+ </div>
179
+ <div class="preview-canvas-wrap">
180
+ <canvas></canvas>
181
+ </div>
182
+ <div class="preview-info">
183
+ <span class="preview-name">-</span>
184
+ <span class="preview-size">-</span>
185
+ </div>
186
+ </div>
187
+
188
+ <!-- Binding panel overlay -->
189
+ <div id="binding-overlay">
190
+ <div id="binding-panel"></div>
191
+ </div>
192
+
193
+ <!-- Confirm dialog -->
194
+ <div id="confirm-overlay">
195
+ <div class="confirm-dialog">
196
+ <div class="confirm-icon">
197
+ <svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>
198
+ </div>
199
+ <div class="confirm-title" id="confirm-title" data-i18n="editor.clear_confirm_title">清空地图</div>
200
+ <div class="confirm-message" id="confirm-message" data-i18n="editor.clear_confirm_msg">确定要清空当前地图吗?此操作不可撤销。</div>
201
+ <div class="confirm-actions">
202
+ <button class="confirm-btn confirm-cancel" id="confirm-cancel" data-i18n="editor.cancel">取消</button>
203
+ <button class="confirm-btn confirm-ok" id="confirm-ok" data-i18n="editor.ok">确定</button>
204
+ </div>
205
+ </div>
206
+ </div>
207
+
208
+ <!-- Upload asset overlay -->
209
+ <div id="upload-overlay">
210
+ <div class="upload-panel"></div>
211
+ </div>
212
+
213
+ <!-- Status bar (bottom-left, minimal) -->
214
+ <div id="status-bar">
215
+ <span id="status-grid">40 × 24</span>
216
+ <span id="status-buildings" data-i18n="editor.building_count">建筑: 0</span>
217
+ <span id="status-props" data-i18n="editor.prop_count">道具: 0</span>
218
+ <span id="status-cursor">--</span>
219
+ <span class="status-spacer"></span>
220
+ <span id="status-tool" data-i18n="editor.select_mode">选择模式</span>
221
+ <span id="status-draft"></span>
222
+ </div>
223
+
224
+ </div>
225
+
226
+ </body>
227
+ </html>
@@ -0,0 +1,22 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />
6
+ <meta name="mobile-web-app-capable" content="yes" />
7
+ <meta name="theme-color" content="#0a0a12" />
8
+ <title>Agentshire</title>
9
+ <link rel="icon" href="./assets/logo-DJI6EtST.png" />
10
+ <style>
11
+ body { margin: 0; background: #0a0a12; overflow: hidden; }
12
+ #app-root { width: 100%; height: 100dvh; }
13
+ </style>
14
+ <script type="module" crossorigin src="./assets/main-CqsN43aT.js"></script>
15
+ <link rel="modulepreload" crossorigin href="./assets/index-BWfrufil.js">
16
+ <link rel="modulepreload" crossorigin href="./assets/command-parser-BUd15Bmv.js">
17
+ <link rel="stylesheet" crossorigin href="./assets/main-D7neuy3w.css">
18
+ </head>
19
+ <body>
20
+ <div id="app-root"></div>
21
+ </body>
22
+ </html>
@@ -0,0 +1,56 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Agentshire Preview</title>
7
+ <link rel="icon" href="./assets/logo-DJI6EtST.png" />
8
+ <style>
9
+ body { margin: 0; overflow: hidden; background: #000; }
10
+ #preview-container { width: 100vw; height: 100vh; position: relative; }
11
+ #preview-loading {
12
+ position: absolute; inset: 0; z-index: 1000;
13
+ display: flex; flex-direction: column; align-items: center; justify-content: center;
14
+ background: #0a0e14; color: #fff; font-family: system-ui, sans-serif; gap: 12px;
15
+ }
16
+ #preview-loading .loading-spinner {
17
+ width: 32px; height: 32px; border: 3px solid rgba(0,212,255,0.2);
18
+ border-top-color: #00d4ff; border-radius: 50%;
19
+ animation: spin 0.8s linear infinite;
20
+ }
21
+ @keyframes spin { to { transform: rotate(360deg) } }
22
+ #preview-loading .loading-text { font-size: 14px; color: rgba(255,255,255,0.6); }
23
+ #preview-error {
24
+ display: none; position: absolute; inset: 0; z-index: 1001;
25
+ flex-direction: column; align-items: center; justify-content: center;
26
+ background: #0a0e14; color: #ff4466; font-family: system-ui, sans-serif; gap: 12px;
27
+ }
28
+ #preview-error button {
29
+ background: rgba(0,212,255,0.15); border: 1px solid rgba(0,212,255,0.3);
30
+ color: #00d4ff; padding: 8px 20px; border-radius: 6px; cursor: pointer; font-size: 13px;
31
+ }
32
+ </style>
33
+ <script type="module" crossorigin src="./assets/preview-B6hYEQij.js"></script>
34
+ <link rel="modulepreload" crossorigin href="./assets/index-BWfrufil.js">
35
+ <link rel="modulepreload" crossorigin href="./assets/GLTFLoader-BA5RqSME.js">
36
+ <link rel="modulepreload" crossorigin href="./assets/SkeletonUtils-BCVmgslc.js">
37
+ <link rel="modulepreload" crossorigin href="./assets/CustomAssetStore-oi8aIurt.js">
38
+ <link rel="modulepreload" crossorigin href="./assets/character-catalog-DSmLtlNC.js">
39
+ <link rel="modulepreload" crossorigin href="./assets/WeatherSystem-Cb3BvHes.js">
40
+ <link rel="stylesheet" crossorigin href="./assets/editor-Bk8g1NCD.css">
41
+ </head>
42
+ <body>
43
+ <div id="preview-container">
44
+ <div id="preview-loading">
45
+ <div class="loading-spinner"></div>
46
+ <div class="loading-text" data-i18n="editor.preview_loading">正在加载预览...</div>
47
+ </div>
48
+ <div id="preview-error">
49
+ <div style="font-size: 16px;" data-i18n="editor.preview_fail">预览加载失败</div>
50
+ <div id="preview-error-msg" style="font-size: 13px; color: rgba(255,255,255,0.5);"></div>
51
+ <button onclick="window.close()" data-i18n="editor.close_window">关闭窗口</button>
52
+ </div>
53
+ </div>
54
+
55
+ </body>
56
+ </html>
@@ -0,0 +1,165 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />
6
+ <meta name="apple-mobile-web-app-capable" content="yes" />
7
+ <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
8
+ <meta name="theme-color" content="#1a1a2e" />
9
+ <title>Agentshire</title>
10
+ <link rel="icon" href="./assets/logo-DJI6EtST.png" />
11
+ <style>
12
+ body { margin: 0; background: #1e1e1e; overflow: hidden; }
13
+ #game-root { width: 100%; height: 100vh; }
14
+ #back-btn, #progress-bar, #progress-label, #npc-card,
15
+ #town-init-loading, #tab-settings,
16
+ #town-setup-overlay, #game-publish-overlay, #media-publish-overlay,
17
+ #media-lightbox, #scene-fade { display: none; }
18
+ #loading-screen {
19
+ position: absolute; inset: 0; z-index: 1000;
20
+ display: flex; flex-direction: column; align-items: center; justify-content: center;
21
+ background: #1e1e1e; font-family: system-ui, -apple-system, sans-serif;
22
+ }
23
+ .loading-label { color: rgba(212,165,116,0.5); font-size: 20px; font-weight: 900; letter-spacing: 0.3em; }
24
+ .loading-dots .dot { opacity: 0; }
25
+ #town-bottom-panel { position: fixed; bottom: 0; left: 0; right: 0; z-index: 100; }
26
+ </style>
27
+ <script type="module" crossorigin src="./assets/town-BKesnERP.js"></script>
28
+ <link rel="modulepreload" crossorigin href="./assets/index-BWfrufil.js">
29
+ <link rel="modulepreload" crossorigin href="./assets/command-parser-BUd15Bmv.js">
30
+ <link rel="modulepreload" crossorigin href="./assets/GLTFLoader-BA5RqSME.js">
31
+ <link rel="modulepreload" crossorigin href="./assets/SkeletonUtils-BCVmgslc.js">
32
+ <link rel="modulepreload" crossorigin href="./assets/character-catalog-DSmLtlNC.js">
33
+ <link rel="modulepreload" crossorigin href="./assets/WeatherSystem-Cb3BvHes.js">
34
+ <link rel="stylesheet" crossorigin href="./assets/town-BnswKsjF.css">
35
+ </head>
36
+ <body>
37
+ <div id="game-root">
38
+ <div id="main-content">
39
+ <div id="game-container" tabindex="0"></div>
40
+ <div id="scene-fade"></div>
41
+ <button id="back-btn">← Back</button>
42
+ <div id="progress-bar"><div class="fill" style="width:0%"></div></div>
43
+ <div id="progress-label"></div>
44
+ <div id="npc-card"></div>
45
+ <div id="loading-screen">
46
+ <div class="capybara-wrap">
47
+ <div class="capybara-shadow"></div>
48
+ <div class="capybara-bounce">
49
+ <svg width="200" height="200" viewBox="0 0 300 300" style="overflow:visible">
50
+ <path class="steam steam-1" d="M 140 5 Q 130 -10, 145 -20 T 140 -40" fill="none" stroke="#D4A574" stroke-width="6" stroke-linecap="round" pathLength="1"/>
51
+ <path class="steam steam-2" d="M 165 0 Q 180 -15, 160 -25 T 165 -45" fill="none" stroke="#D4A574" stroke-width="6" stroke-linecap="round" pathLength="1"/>
52
+ <path d="M 95 90 C 80 65, 50 75, 65 105" fill="#282420" stroke="#D4A574" stroke-width="8" stroke-linecap="round" stroke-linejoin="round"/>
53
+ <path d="M 205 90 C 220 65, 250 75, 235 105" fill="#282420" stroke="#D4A574" stroke-width="8" stroke-linecap="round" stroke-linejoin="round"/>
54
+ <path d="M 100 250 C 30 250, 20 130, 80 90 C 105 75, 130 70, 150 70 C 170 70, 195 75, 220 90 C 280 130, 270 250, 200 250 Z" fill="#282420" stroke="#D4A574" stroke-width="8" stroke-linecap="round" stroke-linejoin="round"/>
55
+ <g stroke="#D4A574" stroke-width="8" fill="#282420" stroke-linejoin="round" stroke-linecap="round">
56
+ <path d="M 115 70 L 115 30 C 115 25, 120 20, 125 20 L 175 20 C 180 20, 185 25, 185 30 L 185 70 Z"/>
57
+ <path d="M 185 35 C 210 35, 210 55, 185 55" fill="none"/>
58
+ <ellipse cx="150" cy="20" rx="30" ry="8" fill="#282420"/>
59
+ <ellipse cx="150" cy="20" rx="20" ry="4" fill="#D4A574" stroke="none"/>
60
+ </g>
61
+ <!-- blush removed -->
62
+ <ellipse cx="150" cy="175" rx="60" ry="45" fill="#302a24" stroke="#D4A574" stroke-width="8"/>
63
+ <path d="M 150 165 L 150 190 M 150 190 C 130 190, 120 180, 120 170 M 150 190 C 170 190, 180 180, 180 170" fill="none" stroke="#D4A574" stroke-width="8" stroke-linecap="round" stroke-linejoin="round"/>
64
+ <g stroke="#D4A574" stroke-width="8" stroke-linecap="round" fill="none">
65
+ <path d="M 70 145 Q 80 145 90 145">
66
+ <animate attributeName="d" values="M 70 145 Q 80 145 90 145;M 78 145 Q 80 145 82 145;M 70 145 Q 80 145 90 145;M 70 145 Q 80 145 90 145;M 78 145 Q 80 145 82 145;M 70 145 Q 80 145 90 145;M 70 145 Q 80 145 90 145" keyTimes="0;0.02;0.04;0.08;0.1;0.12;1" dur="6s" repeatCount="indefinite"/>
67
+ </path>
68
+ <path d="M 230 145 Q 220 145 210 145">
69
+ <animate attributeName="d" values="M 230 145 Q 220 145 210 145;M 222 145 Q 220 145 218 145;M 230 145 Q 220 145 210 145;M 230 145 Q 220 145 210 145;M 222 145 Q 220 145 218 145;M 230 145 Q 220 145 210 145;M 230 145 Q 220 145 210 145" keyTimes="0;0.02;0.04;0.08;0.1;0.12;1" dur="6s" repeatCount="indefinite"/>
70
+ </path>
71
+ </g>
72
+ </svg>
73
+ </div>
74
+ </div>
75
+ <div class="loading-label">LOADING<span class="loading-dots"><span class="dot d1">.</span><span class="dot d2">.</span><span class="dot d3">.</span></span></div>
76
+ </div>
77
+ <div id="town-init-loading">
78
+ <div class="loading-spinner"></div>
79
+ <div style="color:#fff;font-size:15px;margin-bottom:8px;" data-i18n="loading.init_town">正在初始化小镇...</div>
80
+ <div style="color:rgba(255,255,255,0.5);font-size:12px;" data-i18n="loading.creating_souls">正在为居民创建人设文件</div>
81
+ </div>
82
+ <button id="tab-settings" style="display:none;"></button>
83
+ </div>
84
+ </div>
85
+ <div id="town-setup-overlay">
86
+ <div class="ts-card" id="ts-card">
87
+ <!-- Content injected by TownSetupUI -->
88
+ </div>
89
+ </div>
90
+ <div id="game-publish-overlay">
91
+ <div class="gp-card" style="display:flex;flex-direction:column;align-items:center;">
92
+ <div class="gp-title" data-i18n="task_done">任务完成</div>
93
+ <div class="gp-cover-wrap" id="gp-cover-container"></div>
94
+ <button class="gp-play-btn" id="gp-play-btn" data-i18n="try_now">立即体验</button>
95
+ <button class="gp-later" id="gp-later-btn" data-i18n="later">稍后再说</button>
96
+ </div>
97
+ </div>
98
+
99
+ <div id="media-publish-overlay">
100
+ <div class="gp-card" id="media-card" style="display:flex;flex-direction:column;align-items:center;max-width:380px;">
101
+ <div class="gp-title" data-i18n="task_done">任务完成</div>
102
+
103
+ <!-- Single view: preview only -->
104
+ <div class="media-single-view" id="media-single-view">
105
+ <div class="media-preview-container" id="media-single-preview"></div>
106
+ </div>
107
+
108
+ <!-- List view -->
109
+ <div class="media-list-view" id="media-list-view">
110
+ <div id="media-list-container"></div>
111
+ </div>
112
+
113
+ <!-- Buttons as direct gp-card children, same as game card -->
114
+ <button class="gp-play-btn" id="media-single-download" style="display:none;" data-i18n="download">下 载</button>
115
+ <button class="gp-later" id="media-single-ignore" style="display:none;" data-i18n="later">稍后再说</button>
116
+ <button class="gp-later" id="media-list-ignore" style="display:none;" data-i18n="later">稍后再说</button>
117
+ </div>
118
+ </div>
119
+
120
+ <div id="media-lightbox">
121
+ <button id="media-lightbox-close">✕</button>
122
+ <img id="media-lightbox-img" src="" />
123
+ </div>
124
+
125
+ <!-- ── Bottom Input Panel (OpenClaw input bar) ── -->
126
+ <div id="town-bottom-panel">
127
+ <div id="town-agent-status">
128
+ <div class="tas-meta">
129
+ <div class="tas-line">
130
+ <span class="tas-name" data-i18n="steward">管家</span>
131
+ <span class="tas-model"></span>
132
+ </div>
133
+ <div class="tas-session" id="town-session-label" data-i18n-prefix="session_label">会话: --</div>
134
+ </div>
135
+ <div style="position:relative;flex-shrink:0;display:flex;gap:6px;align-items:center;">
136
+ <button id="town-end-topic-btn" type="button" style="display:none;">结束话题</button>
137
+ <button id="town-more-btn" type="button" title="More" data-i18n="more_btn">更多 <span style="font-size:10px;">▾</span></button>
138
+ <div id="town-action-dropdown" style="display:none;"></div>
139
+ </div>
140
+ </div>
141
+ <div id="town-stt-interim"></div>
142
+ <div id="town-image-preview"></div>
143
+ <div id="town-input-row">
144
+ <button id="town-attach-btn" aria-label="Attach image" data-i18n-title="attach_title" title="上传图片">
145
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
146
+ <rect x="3" y="3" width="18" height="18" rx="2" ry="2"/><circle cx="8.5" cy="8.5" r="1.5"/><polyline points="21 15 16 10 5 21"/>
147
+ </svg>
148
+ </button>
149
+ <input type="file" id="town-file-input" accept="image/png,image/jpeg,image/webp" multiple hidden>
150
+ <textarea id="town-input-text" data-i18n-placeholder="input.idle" placeholder="输入消息...." rows="1"></textarea>
151
+ <button id="town-voice-btn" aria-label="Voice input" data-i18n-title="voice_title" title="语音输入">
152
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
153
+ <path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"/><path d="M19 10v2a7 7 0 0 1-14 0v-2"/><line x1="12" y1="19" x2="12" y2="23"/><line x1="8" y1="23" x2="16" y2="23"/>
154
+ </svg>
155
+ </button>
156
+ <button id="town-send-btn" aria-label="Send">
157
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
158
+ <path d="M3.714 3.048a.498.498 0 0 0-.683.627l2.843 7.627a2 2 0 0 1 0 1.396l-2.842 7.627a.498.498 0 0 0 .682.627l18-8.5a.5.5 0 0 0 0-.904z"/><path d="M6 12h16"/>
159
+ </svg>
160
+ </button>
161
+ </div>
162
+ </div>
163
+
164
+ </body>
165
+ </html>
@@ -0,0 +1,91 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>文档查看器</title>
7
+ <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
8
+ <style>
9
+ * { margin: 0; padding: 0; box-sizing: border-box; }
10
+ body {
11
+ background: #0a0a12; color: #e8e8f0;
12
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
13
+ padding: 32px; max-width: 800px; margin: 0 auto; line-height: 1.7;
14
+ }
15
+ .loading { color: #6a6a8a; font-size: 14px; }
16
+ .error { color: #f87171; font-size: 14px; }
17
+ #content h1 { font-size: 28px; margin: 24px 0 16px; color: #fff; }
18
+ #content h2 { font-size: 22px; margin: 20px 0 12px; color: #e8e8f0; border-bottom: 1px solid #1a1a2e; padding-bottom: 8px; }
19
+ #content h3 { font-size: 18px; margin: 16px 0 8px; color: #e8e8f0; }
20
+ #content p { margin: 8px 0; color: #c8c8d8; }
21
+ #content ul, #content ol { margin: 8px 0 8px 24px; color: #c8c8d8; }
22
+ #content li { margin: 4px 0; }
23
+ #content code { background: rgba(255,255,255,0.08); padding: 2px 6px; border-radius: 4px; font-size: 13px; }
24
+ #content pre { background: rgba(255,255,255,0.05); padding: 16px; border-radius: 8px; overflow-x: auto; margin: 12px 0; }
25
+ #content pre code { background: none; padding: 0; }
26
+ #content blockquote { border-left: 3px solid #45E796; padding-left: 16px; margin: 12px 0; color: #a8a8c0; }
27
+ #content a { color: #00d4ff; text-decoration: none; }
28
+ #content a:hover { text-decoration: underline; }
29
+ #content hr { border: none; border-top: 1px solid #1a1a2e; margin: 20px 0; }
30
+ #content img { max-width: 100%; border-radius: 8px; margin: 12px 0; }
31
+ #content table { border-collapse: collapse; width: 100%; margin: 12px 0; }
32
+ #content th, #content td { border: 1px solid #1a1a2e; padding: 8px 12px; text-align: left; }
33
+ #content th { background: rgba(255,255,255,0.05); }
34
+ .toolbar { display: flex; gap: 12px; margin-bottom: 24px; align-items: center; }
35
+ .toolbar .filename { font-size: 13px; color: #6a6a8a; flex: 1; }
36
+ .toolbar button { background: rgba(255,255,255,0.1); color: #e8e8f0; border: none; padding: 6px 16px; border-radius: 6px; font-size: 12px; cursor: pointer; }
37
+ .toolbar button:hover { background: rgba(255,255,255,0.15); }
38
+ </style>
39
+ </head>
40
+ <body>
41
+
42
+ <div class="toolbar">
43
+ <span class="filename" id="filename">加载中...</span>
44
+ <button onclick="downloadRaw()">下载原文件</button>
45
+ </div>
46
+ <div id="content"><span class="loading">加载文档中...</span></div>
47
+
48
+ <script>
49
+ const params = new URLSearchParams(location.search);
50
+ const filePath = params.get('file');
51
+
52
+ let rawUrl = '';
53
+
54
+ async function loadDocument() {
55
+ const contentEl = document.getElementById('content');
56
+ const filenameEl = document.getElementById('filename');
57
+
58
+ if (!filePath) {
59
+ contentEl.innerHTML = '<span class="error">缺少 file 参数。用法: /viewer.html?file=/steward-workspace/tasks/xxx/article.md</span>';
60
+ return;
61
+ }
62
+
63
+ rawUrl = new URL(filePath, location.origin).href;
64
+ const fileName = filePath.split('/').pop() || filePath;
65
+ filenameEl.textContent = fileName;
66
+ document.title = fileName + ' — 文档查看器';
67
+
68
+ try {
69
+ const resp = await fetch(rawUrl);
70
+ if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
71
+ const text = await resp.text();
72
+
73
+ if (fileName.endsWith('.md')) {
74
+ contentEl.innerHTML = marked.parse(text);
75
+ } else {
76
+ contentEl.innerHTML = '<pre><code>' + text.replace(/</g, '&lt;').replace(/>/g, '&gt;') + '</code></pre>';
77
+ }
78
+ } catch (err) {
79
+ contentEl.innerHTML = `<span class="error">加载失败: ${err.message}<br><br>URL: ${rawUrl}</span>`;
80
+ }
81
+ }
82
+
83
+ function downloadRaw() {
84
+ if (rawUrl) window.open(rawUrl, '_blank');
85
+ }
86
+
87
+ loadDocument();
88
+ </script>
89
+
90
+ </body>
91
+ </html>