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.
- package/CHANGELOG.md +36 -0
- package/LICENSE +21 -0
- package/README.md +437 -0
- package/README.zh-CN.md +441 -0
- package/ROADMAP.md +207 -0
- package/THIRD_PARTY_NOTICES.md +49 -0
- package/VISION.md +101 -0
- package/index.ts +386 -0
- package/openclaw.plugin.json +27 -0
- package/package.json +100 -0
- package/src/bridge/AGENTS.md +136 -0
- package/src/bridge/ActivityStream.ts +184 -0
- package/src/bridge/CitizenManager.ts +280 -0
- package/src/bridge/DirectorBridge.ts +1076 -0
- package/src/bridge/EventTranslator.ts +142 -0
- package/src/bridge/NpcEventQueue.ts +61 -0
- package/src/bridge/ReconnectManager.ts +42 -0
- package/src/bridge/RouteManager.ts +270 -0
- package/src/bridge/StateTracker.ts +100 -0
- package/src/bridge/ToolVfxMapper.ts +94 -0
- package/src/bridge/__tests__/ActivityStream.test.ts +156 -0
- package/src/bridge/__tests__/CitizenManager.test.ts +174 -0
- package/src/bridge/__tests__/EventTranslator.test.ts +292 -0
- package/src/bridge/__tests__/NpcEventQueue.test.ts +92 -0
- package/src/bridge/__tests__/RouteManager.test.ts +106 -0
- package/src/bridge/data/route-config.json +36 -0
- package/src/bridge/data/route-config.ts +19 -0
- package/src/bridge/implicit-chat.ts +192 -0
- package/src/bridge/index.ts +12 -0
- package/src/contracts/agent-state.ts +87 -0
- package/src/contracts/agui.ts +212 -0
- package/src/contracts/chat.ts +67 -0
- package/src/contracts/events.ts +170 -0
- package/src/contracts/index.ts +71 -0
- package/src/contracts/media.ts +77 -0
- package/src/contracts/registry.ts +32 -0
- package/src/plugin/AGENTS.md +192 -0
- package/src/plugin/__tests__/editor-serve-megapack.test.ts +150 -0
- package/src/plugin/__tests__/hook-translator.test.ts +197 -0
- package/src/plugin/auto-config.ts +131 -0
- package/src/plugin/channel.ts +399 -0
- package/src/plugin/chat-asset-resolver.ts +75 -0
- package/src/plugin/chat-session-watcher.ts +98 -0
- package/src/plugin/citizen-agent-manager.ts +178 -0
- package/src/plugin/citizen-chat-router.ts +83 -0
- package/src/plugin/citizen-workshop-manager.ts +96 -0
- package/src/plugin/custom-asset-manager.ts +250 -0
- package/src/plugin/editor-serve.ts +1368 -0
- package/src/plugin/group-discussion.ts +223 -0
- package/src/plugin/hook-translator.ts +202 -0
- package/src/plugin/llm-agent-proxy.ts +193 -0
- package/src/plugin/outbound-adapter.ts +187 -0
- package/src/plugin/paths.ts +33 -0
- package/src/plugin/plan-manager.ts +594 -0
- package/src/plugin/runtime.ts +9 -0
- package/src/plugin/session-history.ts +838 -0
- package/src/plugin/session-log-watcher.ts +221 -0
- package/src/plugin/soul-prompt-template.ts +290 -0
- package/src/plugin/subagent-tracker.ts +205 -0
- package/src/plugin/tools.ts +493 -0
- package/src/plugin/town-session.ts +40 -0
- package/src/plugin/ws-server.ts +680 -0
- package/src/town-souls.ts +134 -0
- package/town-frontend/dist/assets/CustomAssetStore-oi8aIurt.js +2 -0
- package/town-frontend/dist/assets/GLTFLoader-BA5RqSME.js +3804 -0
- package/town-frontend/dist/assets/OrbitControls-ZmySp9sQ.js +2 -0
- package/town-frontend/dist/assets/SettingsPanel-BO52reJe.js +2 -0
- package/town-frontend/dist/assets/SkeletonUtils-BCVmgslc.js +2 -0
- package/town-frontend/dist/assets/SkillLearnCard-Dk38iDpy.js +6 -0
- package/town-frontend/dist/assets/TopicSetupPanel-DLaLHB_Z.js +2 -0
- package/town-frontend/dist/assets/Trap-Bold-CT0JBE39.woff2 +0 -0
- package/town-frontend/dist/assets/Trap-SemiBold-R4_-Ld0j.woff2 +0 -0
- package/town-frontend/dist/assets/WeatherSystem-Cb3BvHes.js +550 -0
- package/town-frontend/dist/assets/avatars/char-female-a.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-female-b.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-female-c.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-female-d.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-female-e.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-female-f.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-male-a.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-male-b.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-male-c.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-male-d.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-male-e.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-male-f.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-pet-beaver.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-pet-bee.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-pet-bunny.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-pet-cat.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-pet-caterpillar.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-pet-chick.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-pet-cow.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-pet-crab.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-pet-deer.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-pet-dog.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-pet-elephant.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-pet-fish.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-pet-fox.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-pet-giraffe.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-pet-hog.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-pet-koala.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-pet-lion.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-pet-monkey.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-pet-panda.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-pet-parrot.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-pet-penguin.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-pet-pig.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-pet-polar.webp +0 -0
- package/town-frontend/dist/assets/avatars/char-pet-tiger.webp +0 -0
- package/town-frontend/dist/assets/character-catalog-DSmLtlNC.js +2 -0
- package/town-frontend/dist/assets/citizenEditor-DubGSJOQ.js +296 -0
- package/town-frontend/dist/assets/command-parser-BUd15Bmv.js +12 -0
- package/town-frontend/dist/assets/editor-B5QO0OtX.js +258 -0
- package/town-frontend/dist/assets/editor-Bk8g1NCD.css +1 -0
- package/town-frontend/dist/assets/index-BWfrufil.js +2 -0
- package/town-frontend/dist/assets/index-faS20RJk.js +6 -0
- package/town-frontend/dist/assets/logo-DJI6EtST.png +0 -0
- package/town-frontend/dist/assets/logo-title-AdKPZX5E.png +0 -0
- package/town-frontend/dist/assets/main-CqsN43aT.js +224 -0
- package/town-frontend/dist/assets/main-D7neuy3w.css +1 -0
- package/town-frontend/dist/assets/models/buildings/base.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/base.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/bench.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/bench.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/box_A.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/box_A.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/box_B.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/box_B.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/building_A.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/building_A.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/building_A_withoutBase.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/building_A_withoutBase.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/building_B.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/building_B.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/building_B_withoutBase.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/building_B_withoutBase.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/building_C.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/building_C.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/building_C_withoutBase.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/building_C_withoutBase.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/building_D.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/building_D.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/building_D_withoutBase.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/building_D_withoutBase.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/building_E.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/building_E.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/building_E_withoutBase.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/building_E_withoutBase.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/building_F.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/building_F.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/building_F_withoutBase.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/building_F_withoutBase.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/building_G.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/building_G.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/building_G_withoutBase.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/building_G_withoutBase.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/building_H.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/building_H.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/building_H_withoutBase.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/building_H_withoutBase.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/bush.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/bush.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/car_hatchback.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/car_hatchback.gltf +442 -0
- package/town-frontend/dist/assets/models/buildings/car_police.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/car_police.gltf +442 -0
- package/town-frontend/dist/assets/models/buildings/car_sedan.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/car_sedan.gltf +442 -0
- package/town-frontend/dist/assets/models/buildings/car_stationwagon.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/car_stationwagon.gltf +442 -0
- package/town-frontend/dist/assets/models/buildings/car_taxi.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/car_taxi.gltf +442 -0
- package/town-frontend/dist/assets/models/buildings/citybits_texture.png +0 -0
- package/town-frontend/dist/assets/models/buildings/dumpster.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/dumpster.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/firehydrant.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/firehydrant.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/road_corner.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/road_corner.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/road_corner_curved.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/road_corner_curved.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/road_junction.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/road_junction.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/road_straight.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/road_straight.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/road_straight_crossing.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/road_straight_crossing.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/road_tsplit.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/road_tsplit.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/streetlight.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/streetlight.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/trafficlight_A.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/trafficlight_A.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/trafficlight_B.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/trafficlight_B.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/trafficlight_C.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/trafficlight_C.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/trash_A.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/trash_A.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/trash_B.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/trash_B.gltf +136 -0
- package/town-frontend/dist/assets/models/buildings/watertower.bin +0 -0
- package/town-frontend/dist/assets/models/buildings/watertower.gltf +136 -0
- package/town-frontend/dist/assets/models/characters/Textures/colormap.png +0 -0
- package/town-frontend/dist/assets/models/characters/character-female-a.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-female-b.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-female-c.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-female-d.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-female-e.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-female-f.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-male-a.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-male-b.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-male-c.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-male-d.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-male-e.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-male-f.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-pet-beaver.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-pet-bee.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-pet-bunny.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-pet-cat.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-pet-caterpillar.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-pet-chick.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-pet-cow.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-pet-crab.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-pet-deer.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-pet-dog.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-pet-elephant.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-pet-fish.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-pet-fox.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-pet-giraffe.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-pet-hog.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-pet-koala.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-pet-lion.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-pet-monkey.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-pet-panda.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-pet-parrot.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-pet-penguin.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-pet-pig.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-pet-polar.glb +0 -0
- package/town-frontend/dist/assets/models/characters/character-pet-tiger.glb +0 -0
- package/town-frontend/dist/assets/models/characters/colormap.png +0 -0
- package/town-frontend/dist/assets/models/furniture/armchair.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/armchair.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/armchair_pillows.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/armchair_pillows.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/bed_double_A.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/bed_double_A.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/bed_double_B.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/bed_double_B.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/bed_single_A.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/bed_single_A.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/bed_single_B.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/bed_single_B.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/book_set.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/book_set.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/book_single.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/book_single.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/cabinet_medium.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/cabinet_medium.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/cabinet_medium_decorated.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/cabinet_medium_decorated.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/cabinet_small.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/cabinet_small.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/cabinet_small_decorated.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/cabinet_small_decorated.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/cactus_medium_A.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/cactus_medium_A.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/cactus_medium_B.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/cactus_medium_B.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/cactus_small_A.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/cactus_small_A.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/cactus_small_B.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/cactus_small_B.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/chair_A.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/chair_A.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/chair_A_wood.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/chair_A_wood.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/chair_B.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/chair_B.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/chair_B_wood.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/chair_B_wood.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/chair_C.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/chair_C.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/chair_stool.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/chair_stool.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/chair_stool_wood.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/chair_stool_wood.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/couch.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/couch.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/couch_pillows.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/couch_pillows.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/furniturebits_texture.png +0 -0
- package/town-frontend/dist/assets/models/furniture/lamp_standing.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/lamp_standing.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/lamp_table.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/lamp_table.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/pictureframe_large_A.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/pictureframe_large_A.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/pictureframe_large_B.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/pictureframe_large_B.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/pictureframe_medium.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/pictureframe_medium.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/pictureframe_small_A.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/pictureframe_small_A.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/pictureframe_small_B.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/pictureframe_small_B.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/pictureframe_small_C.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/pictureframe_small_C.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/pictureframe_standing_A.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/pictureframe_standing_A.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/pictureframe_standing_B.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/pictureframe_standing_B.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/pillow_A.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/pillow_A.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/pillow_B.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/pillow_B.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/rug_oval_A.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/rug_oval_A.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/rug_oval_B.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/rug_oval_B.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/rug_rectangle_A.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/rug_rectangle_A.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/rug_rectangle_B.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/rug_rectangle_B.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/rug_rectangle_stripes_A.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/rug_rectangle_stripes_A.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/rug_rectangle_stripes_B.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/rug_rectangle_stripes_B.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/shelf_A_big.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/shelf_A_big.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/shelf_A_small.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/shelf_A_small.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/shelf_B_large.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/shelf_B_large.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/shelf_B_large_decorated.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/shelf_B_large_decorated.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/shelf_B_small.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/shelf_B_small.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/shelf_B_small_decorated.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/shelf_B_small_decorated.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/table_low.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/table_low.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/table_medium.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/table_medium.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/table_medium_long.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/table_medium_long.gltf +136 -0
- package/town-frontend/dist/assets/models/furniture/table_small.bin +0 -0
- package/town-frontend/dist/assets/models/furniture/table_small.gltf +136 -0
- package/town-frontend/dist/assets/models/props/bench.bin +0 -0
- package/town-frontend/dist/assets/models/props/bench.gltf +136 -0
- package/town-frontend/dist/assets/models/props/bush.bin +0 -0
- package/town-frontend/dist/assets/models/props/bush.gltf +136 -0
- package/town-frontend/dist/assets/models/props/capybara.glb +0 -0
- package/town-frontend/dist/assets/models/props/car_hatchback.bin +0 -0
- package/town-frontend/dist/assets/models/props/car_hatchback.gltf +442 -0
- package/town-frontend/dist/assets/models/props/car_sedan.bin +0 -0
- package/town-frontend/dist/assets/models/props/car_sedan.gltf +442 -0
- package/town-frontend/dist/assets/models/props/car_taxi.bin +0 -0
- package/town-frontend/dist/assets/models/props/car_taxi.gltf +442 -0
- package/town-frontend/dist/assets/models/props/citybits_texture.png +0 -0
- package/town-frontend/dist/assets/models/props/dumpster.bin +0 -0
- package/town-frontend/dist/assets/models/props/dumpster.gltf +136 -0
- package/town-frontend/dist/assets/models/props/firehydrant.bin +0 -0
- package/town-frontend/dist/assets/models/props/firehydrant.gltf +136 -0
- package/town-frontend/dist/assets/models/props/streetlight.bin +0 -0
- package/town-frontend/dist/assets/models/props/streetlight.gltf +136 -0
- package/town-frontend/dist/assets/models/props/trafficlight_A.bin +0 -0
- package/town-frontend/dist/assets/models/props/trafficlight_A.gltf +136 -0
- package/town-frontend/dist/assets/models/props/trash_A.bin +0 -0
- package/town-frontend/dist/assets/models/props/trash_A.gltf +136 -0
- package/town-frontend/dist/assets/models/props/watertower.bin +0 -0
- package/town-frontend/dist/assets/models/props/watertower.gltf +136 -0
- package/town-frontend/dist/assets/models/stage-deco/Flowers_1_D.glb +0 -0
- package/town-frontend/dist/assets/models/stage-deco/Flowers_2_B.glb +0 -0
- package/town-frontend/dist/assets/models/stage-deco/Grass_A_1.glb +0 -0
- package/town-frontend/dist/assets/models/stage-deco/Park_GrassHill_A.glb +0 -0
- package/town-frontend/dist/assets/models/stage-deco/Pebles_1_A_2.glb +0 -0
- package/town-frontend/dist/assets/music/bgm_day.mp3 +0 -0
- package/town-frontend/dist/assets/music/bgm_dusk.mp3 +0 -0
- package/town-frontend/dist/assets/music/bgm_night.mp3 +0 -0
- package/town-frontend/dist/assets/music/bgm_work.mp3 +0 -0
- package/town-frontend/dist/assets/office-whiteboard-idle-CyEwBrq_.webp +0 -0
- package/town-frontend/dist/assets/preview-B6hYEQij.js +2 -0
- package/town-frontend/dist/assets/town-BKesnERP.js +8888 -0
- package/town-frontend/dist/assets/town-BnswKsjF.css +1 -0
- package/town-frontend/dist/citizen-editor.html +166 -0
- package/town-frontend/dist/editor.html +227 -0
- package/town-frontend/dist/index.html +22 -0
- package/town-frontend/dist/preview.html +56 -0
- package/town-frontend/dist/town.html +165 -0
- package/town-frontend/dist/viewer.html +91 -0
- package/town-souls/CHEN.md +130 -0
- package/town-souls/CHENGZI.md +92 -0
- package/town-souls/CITIZEN_tpl.md +16 -0
- package/town-souls/DIANDIAN.md +92 -0
- package/town-souls/HAITANG.md +94 -0
- package/town-souls/QIQI.md +119 -0
- package/town-souls/SOUL.md +141 -0
- package/town-souls/SOUL_tpl.md +135 -0
- package/town-souls/XIAOLIE.md +107 -0
- package/town-souls/YAN.md +107 -0
- package/town-workspace/IDENTITY.md +5 -0
- package/town-workspace/SOUL.md +141 -0
- package/town-workspace/project-workflow.md +81 -0
- package/town-workspace/town-defaults.json +92 -0
- package/town-workspace/town-guide.md +45 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import"https://fonts.googleapis.com/css2?family=Poppins:wght@500;600;700&family=Inter:wght@400;500&display=swap";@font-face{font-family:Trap;src:url(./Trap-SemiBold-R4_-Ld0j.woff2) format("woff2");font-weight:600;font-style:normal;font-display:swap}@font-face{font-family:Trap;src:url(./Trap-Bold-CT0JBE39.woff2) format("woff2");font-weight:700;font-style:normal;font-display:swap}:root{--accent-green: #45E796;--accent-blue: #38bdf8;--accent-cyan: #38bdf8;--gradient-primary: linear-gradient(135deg, #C4915E, #D4A574);--accent-gold: #ffd700;--app-bg-canvas: #181818;--app-bg-surface: #1e1e1e;--app-text-tertiary: #6e6e73;--app-text-secondary: #a1a1a6;--app-brand-primary: #D4A574;--app-brand-secondary: #E7DDCC;--accent: var(--app-brand-primary);--tab-selected-bg: rgba(212, 165, 116, .1);--bg-deep: #000000;--bg-panel: rgba(12, 12, 12, .95);--bg-card: rgba(30, 30, 30, .96);--bg-overlay: rgba(0, 0, 0, .8);--bg-card-gradient: linear-gradient(145deg, rgba(24, 24, 24, .9), rgba(12, 12, 12, .95));--border-subtle: rgba(255, 255, 255, .06);--border-default: rgba(255, 255, 255, .1);--border-hover: rgba(255, 255, 255, .2);--border-active: rgba(69, 231, 150, .45);--border-gold: rgba(255, 215, 0, .3);--text-primary: #FFFFFF;--text-secondary: rgba(255, 255, 255, .85);--text-dim: rgba(255, 255, 255, .5);--text-muted: rgba(255, 255, 255, .3);--btn-bg: rgba(255, 255, 255, .05);--btn-bg-hover: rgba(255, 255, 255, .1);--btn-bg-active: rgba(69, 231, 150, .15);--btn-primary: var(--gradient-primary);--input-bg: rgba(0, 0, 0, .3);--input-border: rgba(255, 255, 255, .1);--input-focus-border: var(--accent-green);--input-focus-glow: rgba(69, 231, 150, .2);--status-error: #f55;--toolbar-h: 48px;--palette-w: 280px;--radius-lg: 16px;--radius-md: 10px;--radius-sm: 6px;--transition: .2s cubic-bezier(.4, 0, .2, 1);--shadow-sm: 0 2px 8px rgba(0,0,0,.3);--shadow-md: 0 8px 24px rgba(0,0,0,.4);--shadow-lg: 0 12px 32px rgba(0,0,0,.5);--shadow-glow: 0 0 16px rgba(69, 231, 150, .18)}*{margin:0;padding:0;box-sizing:border-box}html,body{width:100%;height:100%;overflow:hidden;background:var(--bg-deep);font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,sans-serif;color:var(--text-primary);-webkit-font-smoothing:antialiased;-webkit-user-select:none;user-select:none}@media (prefers-reduced-motion: reduce){*,*:before,*:after{transition-duration:.01ms!important;animation-duration:.01ms!important}}#editor-root{width:100%;height:100%;position:relative}#scene-container{position:absolute;top:0;right:0;bottom:0;left:0;z-index:0}#scene-container canvas{display:block;width:100%!important;height:100%!important}#editor-loading{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1000;background:var(--bg-deep);display:flex;flex-direction:column;justify-content:center;align-items:center;transition:opacity .4s}#editor-loading.hidden{opacity:0;pointer-events:none}.loading-spinner{width:40px;height:40px;border:3px solid rgba(255,255,255,.15);border-top-color:#00e676;border-right-color:var(--accent-cyan);border-radius:50%;animation:spin .8s linear infinite;margin-bottom:16px}@keyframes spin{to{transform:rotate(360deg)}}.loading-text{font-size:14px;color:var(--text-dim)}.loading-progress{font-size:12px;color:var(--text-muted);margin-top:8px}#editor-toolbar{position:absolute;top:0;left:0;right:0;height:var(--toolbar-h);z-index:50;display:flex;align-items:center;gap:0;padding:0 16px;background:var(--app-bg-canvas);border-bottom:1px solid var(--border-subtle);box-shadow:none}.toolbar-brand{display:flex;align-items:flex-end;align-self:flex-end;flex-shrink:0;z-index:2;text-decoration:none;cursor:pointer;line-height:0}.toolbar-logo{display:block;height:36px;width:auto;object-fit:contain;object-position:bottom}.editor-mode-switch{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);display:flex;align-items:center;gap:4px;z-index:1;pointer-events:auto}.editor-mode-indicator{display:none}.editor-mode-btn{display:flex;align-items:center;justify-content:center;min-height:32px;padding:0 24px;font-family:Trap,sans-serif;font-size:13px;font-weight:700;color:var(--app-text-tertiary);background:transparent;border:none;border-radius:9999px;cursor:pointer;text-decoration:none;white-space:nowrap;transition:color .15s ease,background .15s ease}.editor-mode-btn:hover{color:var(--app-text-secondary)}.editor-mode-btn:active{transform:scale(.98)}.editor-mode-btn.active{color:var(--app-brand-secondary);background:var(--tab-selected-bg)}.editor-mode-btn.active:hover{color:var(--app-brand-secondary)}.toolbar-title{font-family:Poppins,sans-serif;font-size:15px;font-weight:600;background:linear-gradient(90deg,var(--accent-green),var(--accent-blue));-webkit-background-clip:text;-webkit-text-fill-color:transparent;white-space:nowrap;letter-spacing:.5px}.toolbar-spacer{flex:1}.toolbar-section{display:flex;align-items:center;gap:4px}.toolbar-section+.toolbar-section{position:relative;margin-left:6px;padding-left:6px}.toolbar-section+.toolbar-section:before{content:"";position:absolute;left:0;top:50%;transform:translateY(-50%);width:1px;height:16px;background:var(--border-subtle)}.toolbar-btn{display:flex;align-items:center;justify-content:center;gap:6px;padding:8px 12px;background:none;border:1px solid transparent;border-radius:var(--radius-sm);color:var(--text-dim);font-size:13px;font-weight:500;cursor:pointer;transition:all var(--transition);white-space:nowrap;font-family:inherit;outline:none}.toolbar-btn:hover{background:var(--btn-bg-hover);color:var(--text-primary)}.toolbar-btn:focus-visible{outline:2px solid var(--accent-green);outline-offset:1px}.toolbar-btn.active{background:var(--btn-bg-active);border-color:var(--border-active);color:var(--accent-green);box-shadow:var(--shadow-glow)}.toolbar-btn svg{width:16px;height:16px;flex-shrink:0}.toolbar-btn.btn-danger{color:var(--status-error)}.toolbar-btn.btn-danger:hover{background:#ff44661a}.toolbar-btn-primary{display:flex;align-items:center;justify-content:center;gap:5px;padding:6px 14px;background:var(--gradient-primary);border:none;border-radius:var(--radius-sm);color:#fff;font-size:12px;font-weight:600;cursor:pointer;white-space:nowrap;font-family:inherit;outline:none;transition:all .2s ease}.toolbar-btn-primary svg{width:14px;height:14px;flex-shrink:0}.toolbar-btn-primary:hover{filter:brightness(1.1)}.toolbar-btn-primary:active{transform:scale(.96)}.toolbar-btn-primary:focus-visible{outline:2px solid var(--accent-green);outline-offset:2px}.toolbar-btn.save-flash{color:var(--accent-green)!important;border-color:var(--border-active)!important;background:var(--btn-bg-active)!important;transition:none}.more-dropdown{position:relative}.more-menu{display:none;position:absolute;top:100%;right:0;background:var(--bg-card);border:1px solid var(--border-subtle);border-radius:10px;padding:8px 4px 4px;z-index:60;min-width:160px;margin-top:8px;backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);box-shadow:var(--shadow-lg)}.more-menu:before{content:"";position:absolute;top:-16px;left:0;right:0;height:16px}.more-dropdown:hover .more-menu,.more-menu:hover{display:block}.more-menu button{display:flex;align-items:center;gap:8px;width:100%;text-align:left;padding:8px 12px;font-size:12px;font-weight:500;background:none;border:none;color:var(--text-dim);border-radius:6px;cursor:pointer;font-family:inherit;transition:all var(--transition)}.more-menu button svg{flex-shrink:0}.more-menu button:hover{background:var(--btn-bg-hover);color:var(--text-primary)}.more-menu .menu-danger{color:#ff6478b3}.more-menu .menu-danger:hover{background:#ff44661a;color:var(--status-error)}.menu-divider{height:1px;background:var(--border-subtle);margin:4px 8px}#scene-toolbar{position:absolute;bottom:44px;left:50%;transform:translate(-50%);z-index:45;display:flex;align-items:center;gap:0;padding:6px 8px;background:#141414eb;backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);border:1px solid var(--border-subtle);border-radius:12px;box-shadow:0 8px 32px #00000073,0 0 0 1px #ffffff0a inset;transition:opacity .25s ease,transform .25s cubic-bezier(.4,0,.2,1)}#scene-toolbar.hidden{opacity:0;transform:translate(-50%) translateY(12px);pointer-events:none}.ftb-group{display:flex;align-items:center;gap:2px}.ftb-divider{width:1px;height:16px;background:#ffffff1a;margin:0 4px;flex-shrink:0}.ftb-btn{display:flex;align-items:center;justify-content:center;width:36px;height:36px;background:none;border:1px solid transparent;border-radius:8px;color:var(--text-dim);cursor:pointer;transition:all var(--transition);font-family:inherit;outline:none;position:relative}.ftb-btn svg{width:18px;height:18px;flex-shrink:0}.ftb-btn:hover{background:#ffffff14;color:var(--text-primary)}.ftb-btn:focus-visible{outline:2px solid var(--accent-green);outline-offset:1px}.ftb-btn.active{background:#ffffff1f;color:var(--text-primary);border-color:#ffffff26}.ftb-btn[data-tool].active{background:var(--btn-bg-active);color:var(--accent-green);border-color:var(--border-active);box-shadow:0 0 12px #45e7961f}.resize-dropdown{position:relative}.resize-dropdown--up .resize-menu{display:none;position:absolute;bottom:calc(100% + 8px);left:50%;transform:translate(-50%);background:#121212f5;backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);border:1px solid var(--border-subtle);border-radius:10px;padding:4px;z-index:60;min-width:180px;box-shadow:var(--shadow-lg)}.resize-dropdown--up .resize-menu:before{content:"";position:absolute;bottom:-8px;left:0;right:0;height:8px}.resize-dropdown--up:hover .resize-menu,.resize-dropdown--up .resize-menu:hover{display:block}.resize-menu button{display:block;width:100%;text-align:left;padding:7px 12px;font-size:12px;background:none;border:none;color:var(--text-dim);border-radius:6px;cursor:pointer;font-family:inherit}.resize-menu button:hover{background:var(--btn-bg);color:var(--text-primary)}.resize-divider{height:1px;background:var(--border-subtle);margin:4px 8px}.ftb-camera-toggle{display:flex;align-items:center;cursor:pointer;margin-left:4px}.ftb-camera-track{position:relative;width:46px;height:26px;background:#ffffff0f;border-radius:7px;transition:background .2s ease}.ftb-camera-toggle:hover .ftb-camera-track{background:#ffffff1a}.ftb-camera-toggle.active .ftb-camera-track{background:#45e7961f}.ftb-camera-toggle.active:hover .ftb-camera-track{background:#45e7962e}.ftb-camera-thumb{position:absolute;top:2px;left:2px;width:22px;height:22px;background:#ffffff26;border-radius:5px;display:flex;align-items:center;justify-content:center;transition:transform .2s cubic-bezier(.4,0,.2,1),background .2s ease}.ftb-camera-thumb svg{width:12px;height:12px;color:var(--text-dim);transition:color .2s ease}.ftb-camera-toggle:hover .ftb-camera-thumb{background:#fff3}.ftb-camera-toggle:hover .ftb-camera-thumb svg{color:var(--text-secondary)}.ftb-camera-toggle.active .ftb-camera-thumb{transform:translate(20px);background:var(--accent-green)}.ftb-camera-toggle.active:hover .ftb-camera-thumb{background:#7affdf}.ftb-camera-toggle.active .ftb-camera-thumb svg{color:#0a0a0a}#terrain-bar{position:absolute;bottom:96px;left:50%;transform:translate(-50%);display:none;gap:4px;z-index:44;background:#141414eb;backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border-radius:10px;padding:6px 10px;border:1px solid var(--border-subtle);box-shadow:0 4px 16px #0000004d}#terrain-bar.visible{display:flex}.terrain-swatch{width:30px;height:30px;border-radius:6px;border:2px solid transparent;cursor:pointer;transition:border-color .15s,transform .1s}.terrain-swatch.active{border-color:var(--accent-green);transform:scale(1.1)}.terrain-swatch:hover{border-color:var(--border-hover)}.citizen-placeholder{position:absolute;top:0;right:0;bottom:0;left:0;z-index:35;display:none;align-items:center;justify-content:center;background:#0009;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.citizen-placeholder.visible{display:flex}.citizen-placeholder-content{text-align:center;animation:modalPop .3s cubic-bezier(.34,1.56,.64,1) forwards;transform:scale(.95)}.citizen-placeholder-icon{width:72px;height:72px;margin:0 auto 20px;display:flex;align-items:center;justify-content:center;border-radius:20px;background:#d4a5741a;border:1px solid rgba(212,165,116,.35);color:var(--app-brand-primary)}.citizen-placeholder-title{font-family:Poppins,sans-serif;font-size:20px;font-weight:700;color:var(--text-primary);margin-bottom:8px;letter-spacing:.5px}.citizen-placeholder-desc{font-size:14px;color:var(--text-dim);line-height:1.6}.citizen-workshop{position:absolute;top:0;left:0;right:0;bottom:0;display:none;z-index:45;background:linear-gradient(135deg,#d5af6e,#ddb369,#c9a05c);padding-top:var(--toolbar-h)}.citizen-workshop.visible{display:flex}.cw-roster{width:240px;flex-shrink:0;display:flex;flex-direction:column;background:var(--app-bg-surface);backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);border-right:1px solid var(--border-subtle)}.cw-roster-header{padding:16px 16px 12px;flex-shrink:0}.cw-roster-title{font-family:Poppins,sans-serif;font-size:13px;font-weight:600;color:var(--app-text-secondary);letter-spacing:.3px}.cw-roster-list{flex:1;overflow-y:auto;padding:0 8px}.cw-roster-footer{padding:8px;flex-shrink:0}.cw-add-btn{display:block;width:100%;padding:10px;text-align:center;font-size:13px;font-weight:500;background:#d4a5741a;border:1px solid rgba(212,165,116,.4);border-radius:var(--radius-sm);color:var(--app-brand-primary);cursor:pointer;font-family:inherit;transition:background .15s ease,border-color .15s ease}.cw-add-btn:hover{background:#d4a57429;border-color:#d4a5748c}.cw-roster-group{margin-bottom:4px}.cw-roster-group-label{font-size:10px;font-weight:600;color:var(--app-text-tertiary);text-transform:uppercase;letter-spacing:1px;padding:8px 8px 4px}.cw-roster-item{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:var(--radius-sm);cursor:pointer;transition:background .15s ease;position:relative}.cw-roster-item:hover{background:#ffffff0a}.cw-roster-item.selected{background:#d4a57414}.cw-roster-avatar{width:32px;height:32px;border-radius:8px;background:#ffffff0f;display:flex;align-items:center;justify-content:center;flex-shrink:0;overflow:hidden;font-size:14px}.cw-roster-avatar img{width:100%;height:100%;object-fit:cover;border-radius:inherit}.cw-roster-info{flex:1;min-width:0}.cw-roster-name{font-size:13px;font-weight:500;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cw-roster-meta{font-size:11px;color:var(--app-text-tertiary);margin-top:1px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cw-roster-more{width:22px;height:22px;display:none;align-items:center;justify-content:center;background:none;border:none;color:var(--text-muted);border-radius:4px;cursor:pointer;flex-shrink:0;padding:0}.cw-roster-item:hover .cw-roster-more{display:flex}.cw-roster-more:hover{color:var(--text-secondary);background:#ffffff14}.cw-roster-menu{min-width:120px;background:var(--app-bg-surface);border:1px solid var(--border-default);border-radius:8px;padding:4px;box-shadow:0 8px 24px #0006;z-index:1000}.cw-roster-menu-item{display:flex;align-items:center;gap:8px;width:100%;padding:7px 10px;font-size:12px;font-weight:500;color:var(--text-secondary);background:none;border:none;border-radius:6px;cursor:pointer;text-align:left;font-family:inherit}.cw-roster-menu-item:hover{background:#ffffff0f}.cw-roster-menu-item.danger{color:var(--status-error)}.cw-roster-menu-item.danger:hover{background:#ff44661a}.cw-center{flex:1;display:flex;flex-direction:column;min-width:0;overflow:hidden;background:transparent}.cw-stage-wrap{flex:1 1 auto;position:relative;overflow:hidden;min-height:180px;transition:flex .25s ease}.cw-center.picker-open .cw-stage-wrap{flex:0 0 38%}.cw-stage-canvas{position:absolute;top:0;right:0;bottom:0;left:0}.cw-stage-canvas canvas{display:block;width:100%!important;height:100%!important}.cw-model-bar{display:flex;align-items:center;justify-content:center;gap:12px;padding:10px 16px;flex-shrink:0;border-top:1px solid var(--border-subtle);background:var(--app-bg-surface);backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);position:relative;z-index:2}.cw-center.picker-open .cw-model-bar{display:none}.cw-model-bar-label{font-size:12px;color:var(--app-text-tertiary);font-weight:400}.cw-model-current{font-size:13px;color:var(--text-primary);font-weight:600}.cw-model-change-btn{font-size:12px;font-weight:500;padding:5px 14px;background:#ffffff0f;border:1px solid rgba(255,255,255,.1);border-radius:6px;color:var(--text-secondary);cursor:pointer;font-family:inherit;transition:all .2s ease}.cw-model-change-btn:hover{background:#ffffff1a;color:var(--text-primary);border-color:#fff3}.cw-picker-topbar{display:none;align-items:center;gap:10px;padding:8px 14px;flex-shrink:0;border-top:1px solid var(--border-subtle);background:var(--app-bg-surface);backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);z-index:2}.cw-center.picker-open .cw-picker-topbar{display:flex}.cw-picker-title{font-size:13px;font-weight:600;color:var(--text-primary);letter-spacing:.01em;margin-right:6px}.cw-picker-tabs{display:flex;gap:4px;flex-shrink:0;background:#ffffff0a;border-radius:9999px;padding:2px}.cw-picker-tab{padding:5px 14px;font-size:12px;font-weight:600;font-family:Trap,sans-serif;color:var(--app-text-tertiary);background:none;border:none;border-radius:9999px;cursor:pointer;transition:color .15s ease,background .15s ease;min-height:28px}.cw-picker-tab:hover{color:var(--app-text-secondary)}.cw-picker-tab.active{color:var(--app-brand-secondary);background:var(--tab-selected-bg);box-shadow:none}.cw-picker-close{margin-left:auto;width:28px;height:28px;display:flex;align-items:center;justify-content:center;background:none;border:none;border-radius:6px;color:var(--app-text-tertiary);cursor:pointer;transition:color .15s ease,background .15s ease}.cw-picker-close:hover{background:#ffffff14;color:var(--text-primary)}.cw-picker-scroll{display:none;flex:1;overflow-y:auto;padding:6px 14px 10px;background:var(--app-bg-surface);backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px)}.cw-center.picker-open .cw-picker-scroll{display:block}.cw-picker-scroll::-webkit-scrollbar{width:4px}.cw-picker-scroll::-webkit-scrollbar-track{background:transparent}.cw-picker-scroll::-webkit-scrollbar-thumb{background:#ffffff1a;border-radius:2px}.cw-picker-scroll::-webkit-scrollbar-thumb:hover{background:#fff3}.cw-picker-grid{display:grid;grid-template-columns:repeat(6,1fr);gap:8px;padding:4px 0}.cw-model-card{background:#ffffff08;border:1px solid rgba(255,255,255,.06);border-radius:10px;cursor:pointer;display:flex;flex-direction:column;align-items:center;gap:0;transition:transform .2s ease,border-color .2s ease,background .2s ease,box-shadow .2s ease;overflow:hidden;position:relative;padding:0 0 6px}.cw-model-card:hover{background:#ffffff0f;border-color:#ffffff26;transform:translateY(-2px);box-shadow:0 4px 12px #0000004d}.cw-model-card.current{border:2px solid rgba(212,165,116,.85);box-shadow:inset 0 0 0 1px #d4a57440,0 0 12px #d4a5742e;padding:0 0 5px}.cw-model-card.current:after{content:"当前";position:absolute;top:8px;right:8px;font-size:10px;font-weight:600;color:#1a1510;background:#d4a574f2;padding:3px 8px;border-radius:5px;line-height:1.3;letter-spacing:.03em;box-shadow:0 2px 6px #0000004d;z-index:2}.cw-model-card.candidate{border:2px solid rgba(69,231,150,.55);box-shadow:inset 0 0 0 1px #45e79633,0 0 12px #45e7961f;padding:0 0 5px}.cw-model-card.candidate:after{content:"";position:absolute;top:8px;right:8px;width:22px;height:22px;background:#45e796f2;border-radius:50%;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%230a0a0a' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:center;background-size:12px;box-shadow:0 2px 6px #0000004d;z-index:2}.cw-model-card.selected{border-color:var(--accent-green);background:#45e79614}.cw-model-card-thumb{width:100%;aspect-ratio:1;display:flex;align-items:center;justify-content:center;color:var(--text-muted);font-size:18px;overflow:hidden;border-radius:0;background:#ffffff05}.cw-model-card-thumb img{width:100%;height:100%;object-fit:cover;border-radius:0;transition:transform .25s ease}.cw-model-card:hover .cw-model-card-thumb img{transform:scale(1.04)}.cw-model-card-name{font-size:13px;color:var(--text-secondary);text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%;line-height:1.4;padding:5px 6px 0;font-weight:500}.cw-model-card-upload{border-style:dashed;border-color:#ffffff1a}.cw-model-card-upload:hover{border-color:var(--accent-green);color:var(--accent-green);transform:translateY(-2px)}.cw-model-card-upload .cw-model-card-thumb{color:var(--text-muted);transition:color .2s ease}.cw-model-card-upload:hover .cw-model-card-thumb{color:var(--accent-green)}.cw-model-card-upload .cw-model-card-name{color:var(--text-dim)}.cw-model-card-upload:hover .cw-model-card-name{color:var(--accent-green)}.cw-model-card-name-row{display:flex;align-items:center;padding:5px 6px 0;gap:2px;width:100%}.cw-model-card-name-row .cw-model-card-name{flex:1;min-width:0;padding:0}.cw-card-more-btn{width:22px;height:22px;flex-shrink:0;background:none;border:none;border-radius:var(--radius-sm);color:var(--text-muted);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.cw-card-more-btn:hover{background:#ffffff1a;color:var(--text-primary)}.cw-picker-footer{display:none;align-items:center;gap:12px;padding:8px 14px;flex-shrink:0;border-top:1px solid var(--border-subtle);background:var(--app-bg-surface);backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);z-index:2}.cw-center.picker-open .cw-picker-footer{display:flex}.cw-picker-footer-current{font-size:12px;color:var(--app-text-tertiary);font-weight:400}.cw-picker-footer-arrow{font-size:14px;color:var(--text-muted)}.cw-picker-footer-candidate{font-size:12px;color:var(--app-brand-primary);font-weight:600}.cw-picker-confirm-btn{font-size:12px;font-weight:600;padding:6px 20px;background:var(--app-brand-primary);border:none;border-radius:6px;color:#1a1510;cursor:pointer;font-family:inherit;transition:filter .15s ease,box-shadow .15s ease,transform .15s ease;box-shadow:0 2px 8px #d4a57459;letter-spacing:.01em}.cw-picker-confirm-btn:hover:not(:disabled){filter:brightness(1.06);box-shadow:0 3px 12px #d4a57473;transform:translateY(-1px)}.cw-picker-confirm-btn:disabled{opacity:.3;cursor:not-allowed;box-shadow:none}.cw-picker-footer-actions{margin-left:auto;display:flex;gap:8px;align-items:center}.cw-picker-cancel-btn{font-size:12px;font-weight:500;padding:6px 16px;background:#ffffff0f;border:1px solid var(--border-default);border-radius:6px;color:var(--app-text-tertiary);cursor:pointer;font-family:inherit;transition:background .15s ease,color .15s ease,border-color .15s ease}.cw-picker-cancel-btn:hover{background:#ffffff1a;color:var(--app-text-secondary);border-color:#fff3}.cw-picker-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;padding:40px 20px;color:var(--text-muted)}.cw-picker-empty-icon{font-size:36px;opacity:.35}.cw-picker-empty-text{font-size:13px;color:var(--text-dim);font-weight:400}.cw-picker-empty-hint{font-size:11px;color:var(--text-muted);font-weight:400;opacity:.7}.cw-picker-empty-btn{font-size:12px;font-weight:500;padding:8px 20px;background:#ffffff0a;border:1.5px dashed rgba(255,255,255,.12);border-radius:8px;color:var(--text-dim);cursor:pointer;font-family:inherit;transition:all .2s ease;text-align:center}.cw-picker-empty-btn:hover{background:#d4a5741a;border-color:#d4a57473;color:var(--app-brand-primary);transform:translateY(-1px)}.cw-picker-detail{padding:8px 12px 10px;border-top:1px solid var(--border-subtle);flex-shrink:0}.cw-picker-detail-row{display:flex;align-items:flex-start;gap:10px;margin-bottom:10px}.cw-picker-detail-row:last-child{margin-bottom:0}.cw-picker-detail-label{font-size:12px;font-weight:500;color:var(--text-secondary);width:32px;flex-shrink:0;padding-top:4px}.cw-picker-variant-btns{display:flex;gap:4px;flex-wrap:wrap}.cw-picker-variant-btn{width:28px;height:28px;background:#ffffff0d;border:1px solid rgba(255,255,255,.1);border-radius:6px;color:var(--text-dim);font-size:12px;font-weight:500;cursor:pointer;font-family:inherit;display:flex;align-items:center;justify-content:center;transition:all .15s ease}.cw-picker-variant-btn:hover{background:#ffffff1a;color:var(--text-primary)}.cw-picker-variant-btn.active{background:#d4a57424;border-color:#d4a57473;color:var(--app-brand-primary)}.cw-picker-color-swatches{display:flex;flex-wrap:wrap;gap:6px}.cw-picker-color-swatch{width:22px;height:22px;border-radius:6px;border:2px solid transparent;cursor:pointer;transition:all .15s ease;box-shadow:inset 0 0 0 1px #00000026}.cw-picker-color-swatch:hover{border-color:#ffffff80;transform:scale(1.1)}.cw-picker-color-swatch.active{border-color:#fff;transform:scale(1.12);box-shadow:inset 0 0 0 1px #00000026,0 0 8px #ffffff40}.cw-inspector{width:280px;flex-shrink:0;display:flex;flex-direction:column;background:var(--app-bg-surface);backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);border-left:1px solid var(--border-subtle)}.cw-inspector-header{padding:12px 16px 10px;flex-shrink:0;border-bottom:1px solid var(--border-subtle)}.cw-inspector-title{font-size:13px;font-weight:600;color:var(--text-primary);letter-spacing:.01em}.cw-inspector-content{padding:20px 16px;display:flex;flex-direction:column;gap:0;overflow-y:auto;flex:1}.cw-section{margin-bottom:4px}.cw-section.cw-section-conditional{margin-top:8px}.cw-section-title{font-size:12px;font-weight:500;color:var(--app-text-secondary);margin-bottom:10px}.cw-field{margin-bottom:25px}.cw-field-label{font-size:12px;font-weight:500;color:var(--app-text-secondary);margin-bottom:6px}.cw-identity-row{display:flex;align-items:center;gap:12px;margin-bottom:25px}.cw-identity-fields{flex:1;min-width:0}.cw-input-name{font-size:14px;font-weight:600}.cw-avatar-clickable{width:44px;height:44px;border-radius:12px;background:#ffffff0f;border:1.5px solid rgba(255,255,255,.1);display:flex;align-items:center;justify-content:center;overflow:hidden;flex-shrink:0;color:var(--text-muted);font-size:18px;cursor:pointer;position:relative;transition:border-color .2s ease,box-shadow .2s ease}.cw-avatar-clickable:hover{border-color:var(--accent-green);box-shadow:0 0 10px #45e7961f}.cw-avatar-clickable img{width:100%;height:100%;object-fit:cover;border-radius:inherit}.cw-avatar-hover-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background:#00000073;display:flex;align-items:center;justify-content:center;color:#fff;opacity:0;transition:opacity .2s ease;border-radius:inherit}.cw-avatar-clickable:hover .cw-avatar-hover-overlay{opacity:1}.cw-input{width:100%;padding:7px 10px;font-size:13px;background:var(--input-bg);border:1px solid var(--input-border);border-radius:var(--radius-sm);color:var(--text-primary);font-family:inherit;outline:none;transition:border-color var(--transition)}.cw-input:focus{border-color:var(--accent-green);box-shadow:0 0 0 2px var(--input-focus-glow)}.cw-textarea{width:100%;padding:8px 10px;font-size:13px;height:100px;background:var(--input-bg);border:1px solid var(--input-border);border-radius:var(--radius-sm);color:var(--text-primary);font-family:inherit;outline:none;resize:none;line-height:1.5;transition:border-color var(--transition)}.cw-textarea::placeholder{color:var(--text-muted)}.cw-textarea:focus{border-color:var(--accent-green);box-shadow:0 0 0 2px var(--input-focus-glow)}.cw-select{width:100%;padding:7px 28px 7px 10px;font-size:13px;background:var(--input-bg);border:1px solid var(--input-border);border-radius:var(--radius-sm);color:var(--text-primary);font-family:inherit;outline:none;-moz-appearance:none;appearance:none;-webkit-appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='rgba(255,255,255,0.5)' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 8px center;cursor:pointer;transition:border-color var(--transition);color-scheme:dark}.cw-dropdown{position:relative;width:100%}.cw-dropdown-trigger{display:flex;align-items:center;justify-content:space-between;width:100%;padding:7px 10px;font-size:13px;font-family:inherit;color:var(--text-primary);background:var(--input-bg);border:1px solid var(--input-border);border-radius:var(--radius-sm);cursor:pointer;outline:none;transition:border-color var(--transition);text-align:left}.cw-dropdown-trigger:hover{border-color:var(--border-hover)}.cw-dropdown-trigger.open{border-color:var(--accent-green)}.cw-dropdown-trigger:after{content:"";display:block;width:0;height:0;border-left:4px solid transparent;border-right:4px solid transparent;border-top:5px solid rgba(255,255,255,.4);flex-shrink:0;margin-left:8px;transition:transform .2s}.cw-dropdown-trigger.open:after{transform:rotate(180deg)}.cw-dropdown-trigger .cw-dd-text{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cw-dropdown-trigger .cw-dd-placeholder{color:var(--text-muted)}.cw-dropdown-menu{position:absolute;left:0;right:0;top:calc(100% + 4px);background:#121212f5;backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);border:1px solid var(--border-subtle);border-radius:8px;box-shadow:var(--shadow-md);z-index:100;max-height:240px;overflow-y:auto;padding:4px;display:none;animation:dropdownSlide .15s ease-out}.cw-dropdown-menu.open{display:block}.cw-dropdown-option{display:block;width:100%;padding:7px 10px;font-size:13px;font-family:inherit;color:var(--text-secondary);background:none;border:none;border-radius:6px;cursor:pointer;text-align:left;transition:background .1s}.cw-dropdown-option:hover{background:#ffffff0f;color:var(--text-primary)}.cw-dropdown-option.selected{color:var(--accent-green);background:#45e7960f}.cw-dropdown-menu::-webkit-scrollbar{width:4px}.cw-dropdown-menu::-webkit-scrollbar-thumb{background:#ffffff26;border-radius:2px}.cw-cascade-group{padding:2px 0}.cw-cascade-group+.cw-cascade-group{border-top:1px solid rgba(255,255,255,.06);margin-top:2px;padding-top:4px}.cw-cascade-label{font-size:10px;font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px;padding:4px 10px 2px;pointer-events:none}.cw-cascade-group .cw-dropdown-option{padding-left:16px;font-size:12px}.cw-select option{background:#1e1e1e;color:var(--text-primary);padding:6px 10px}.cw-select:focus{border-color:var(--accent-green)}.cw-avatar-upload{display:flex;align-items:center;gap:12px}.cw-avatar-preview{width:48px;height:48px;border-radius:12px;background:#ffffff0f;border:1px solid var(--border-subtle);display:flex;align-items:center;justify-content:center;overflow:hidden;flex-shrink:0;color:var(--text-muted);font-size:20px}.cw-avatar-preview img{width:100%;height:100%;object-fit:cover;border-radius:inherit}.cw-avatar-btn{font-size:12px;font-weight:500;padding:5px 12px;background:var(--btn-bg);border:1px solid var(--border-subtle);border-radius:var(--radius-sm);color:var(--text-dim);cursor:pointer;font-family:inherit;transition:all var(--transition)}.cw-avatar-btn:hover{background:var(--btn-bg-hover);color:var(--text-primary);border-color:var(--border-hover)}.cw-divider{height:1px;background:#ffffff0d;margin:8px 0 12px}.cw-soul-toggle{display:flex;align-items:center;gap:6px;font-size:12px;font-weight:500;color:var(--text-dim);cursor:pointer;padding:6px 0;transition:color .15s ease}.cw-soul-toggle:hover{color:var(--text-secondary)}.cw-soul-toggle svg{transition:transform .2s ease}.cw-soul-toggle.expanded svg{transform:rotate(90deg)}.cw-soul-textarea{font-family:SF Mono,Fira Code,Cascadia Code,monospace;font-size:12px;line-height:1.6;resize:vertical;min-height:200px;max-height:400px}.cw-field-label-row{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}.cw-field-label-row .cw-field-label{margin-bottom:0}.cw-field-label-row .cw-ai-gen-btn{display:inline-flex;align-items:center;gap:4px;width:90px;justify-content:center;margin:0;padding:3px 10px}.cw-field-label-row .cw-ai-gen-btn svg{flex-shrink:0;vertical-align:middle}.cw-ai-gen-btn{display:block;width:100%;margin-top:8px;padding:8px;font-size:12px;font-weight:500;background:#d4a57414;border:1px solid rgba(212,165,116,.25);border-radius:var(--radius-sm);color:var(--app-brand-primary);cursor:pointer;font-family:inherit;transition:all .15s ease}.cw-ai-gen-btn:hover{background:#d4a57426;border-color:#d4a57466}.cw-ai-gen-btn.disabled{opacity:.5;pointer-events:none}.cw-ai-gen-btn svg.cw-spin{animation:cw-spin 1.2s linear infinite}.cw-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:12px;color:var(--text-muted);font-size:13px}.mode-hidden{opacity:0!important;pointer-events:none!important;transition:opacity .2s ease!important}#asset-palette{position:absolute;top:calc(var(--toolbar-h) + 12px);left:12px;bottom:40px;width:var(--palette-w);z-index:30;background:var(--bg-card);backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);border:1px solid var(--border-subtle);border-radius:var(--radius-lg);display:flex;flex-direction:column;overflow:hidden;transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s ease-out;box-shadow:var(--shadow-lg)}#asset-palette.collapsed{transform:translate(calc(-1 * var(--palette-w) - 24px));opacity:0;pointer-events:none}.palette-expand-btn{display:none;position:absolute;top:calc(var(--toolbar-h) + 12px);left:0;z-index:30;width:36px;border-radius:0 var(--radius-md) var(--radius-md) 0;background:var(--bg-panel);border:1px solid var(--border-subtle);border-left:none;backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);color:var(--text-dim);cursor:pointer;flex-direction:column;align-items:center;justify-content:center;gap:6px;padding:12px 6px;transition:all var(--transition);box-shadow:var(--shadow-md);writing-mode:vertical-lr;font-size:12px;font-weight:600;font-family:Inter,sans-serif;letter-spacing:2px}.palette-expand-btn .expand-label{writing-mode:vertical-lr;text-orientation:mixed;font-size:12px;font-weight:600;letter-spacing:2px;color:var(--text-dim)}.palette-expand-btn:hover{background:#181818;color:var(--text-primary);border-color:var(--border-hover)}.palette-expand-btn:hover .expand-label{color:var(--text-primary)}#asset-palette.collapsed~.palette-expand-btn,.palette-expand-btn.visible{display:flex}.panel-header{display:flex;align-items:center;justify-content:space-between;padding:16px 16px 12px;flex-shrink:0}.panel-title{font-family:Poppins,sans-serif;font-size:14px;font-weight:600;color:var(--text-primary);letter-spacing:.5px}.panel-collapse{width:28px;height:28px;border-radius:var(--radius-sm);background:var(--btn-bg);border:1px solid transparent;color:var(--text-dim);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:16px;transition:all var(--transition)}.panel-collapse:hover{background:var(--btn-bg-hover);color:var(--text-primary);border-color:var(--border-subtle)}.palette-tabs{display:flex;flex-shrink:0;border-bottom:1px solid var(--border-subtle);padding:0 8px;overflow-x:auto;overflow-y:hidden;scrollbar-width:none}.palette-tabs::-webkit-scrollbar{display:none}.palette-tab{flex-shrink:0;padding:10px 12px;text-align:center;font-size:12px;font-weight:500;background:none;border:none;color:var(--text-dim);cursor:pointer;transition:color var(--transition);position:relative;font-family:inherit;white-space:nowrap}.palette-tab:hover{color:var(--text-secondary)}.palette-tab.active{color:var(--accent-green);font-weight:600}.palette-tab.active:after{content:"";position:absolute;bottom:0;left:15%;right:15%;height:2px;background:var(--gradient-primary);border-radius:2px 2px 0 0;box-shadow:0 -2px 8px #45e79666}.palette-list{flex:1;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:8px;align-content:start}.asset-card{background:#ffffff05;border:1px solid rgba(255,255,255,.03);border-radius:var(--radius-md);padding:10px 14px;cursor:pointer;-webkit-user-select:none;user-select:none;display:flex;align-items:center;gap:12px;transition:all var(--transition);overflow:hidden;outline:none;min-height:52px;flex-shrink:0}.asset-card:hover{background:#ffffff0d;border-color:var(--border-hover);transform:translateY(-1px)}.asset-card:focus-visible{outline:2px solid var(--accent-green);outline-offset:2px}.asset-card.selected{background:var(--btn-bg-active);border-color:var(--border-active);box-shadow:var(--shadow-glow)}.asset-icon{width:36px;height:36px;display:flex;align-items:center;justify-content:center;border-radius:var(--radius-sm);background:#0003;border:1px solid var(--border-subtle);flex-shrink:0;color:var(--text-dim)}.asset-card-info{flex:1;min-width:0}.asset-name{font-size:13px;color:var(--text-primary);font-weight:500;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.asset-meta{font-size:11px;color:var(--text-muted);margin-top:2px}.color-bar{display:flex;flex-wrap:wrap;gap:4px;padding:8px 14px;background:#00000040;border-top:1px solid var(--border-subtle);border-bottom:1px solid var(--border-subtle);flex-shrink:0}.color-swatch{width:26px;height:26px;border-radius:6px;border:1.5px solid rgba(255,255,255,.1);background:var(--btn-bg);color:var(--text-dim);font-size:10px;font-weight:600;font-family:inherit;cursor:pointer;transition:all var(--transition);display:flex;align-items:center;justify-content:center}.color-swatch:hover{border-color:var(--border-hover);color:var(--text-primary);transform:scale(1.05)}.color-swatch.active{border-color:var(--border-active);background:var(--btn-bg-active);color:var(--accent-green);box-shadow:var(--shadow-glow)}.palette-empty{grid-column:1 / -1;text-align:center;color:var(--text-muted);padding:32px 20px;font-size:13px}.palette-pager{display:flex;align-items:center;justify-content:center;gap:12px;padding:12px 16px;border-top:1px solid var(--border-subtle);background:#0000001a;flex-shrink:0}.pager-btn{width:32px;height:32px;border-radius:var(--radius-sm);background:var(--btn-bg);border:1px solid transparent;color:var(--text-dim);font-size:16px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all var(--transition);font-family:inherit}.pager-btn:hover:not(:disabled){background:var(--btn-bg-hover);color:var(--text-primary);border-color:var(--border-subtle)}.pager-btn:disabled{opacity:.3;cursor:not-allowed}.pager-info{font-size:12px;font-weight:500;color:var(--text-dim)}#property-inspector{position:absolute;top:calc(var(--toolbar-h) + 12px);right:12px;width:300px;z-index:30;background:var(--bg-card);backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);border:1px solid var(--border-subtle);border-radius:var(--radius-lg);padding:16px;display:none;flex-direction:column;gap:0;max-height:calc(100vh - var(--toolbar-h) - 60px);overflow-y:auto;box-shadow:var(--shadow-lg);animation:panelSlideIn .3s cubic-bezier(.4,0,.2,1)}#property-inspector.visible{display:flex}@keyframes panelSlideIn{0%{opacity:0;transform:translate(16px)}to{opacity:1;transform:translate(0)}}.pi-title{font-family:Poppins,sans-serif;font-size:13px;font-weight:600;color:var(--text-primary);letter-spacing:.3px;margin-bottom:12px}.pi-section-title{font-size:11px;font-weight:600;color:var(--text-dim);text-transform:uppercase;letter-spacing:1px;margin-bottom:8px}.pi-divider{height:1px;background:var(--border-subtle);margin:12px 0}.pi-info-row{display:flex;align-items:center;justify-content:space-between;padding:0 0 4px}.pi-info-row .pi-label{font-size:12px;font-weight:500;color:var(--text-dim)}.pi-info-row .pi-value{font-size:12px;color:var(--text-secondary);font-family:Inter,monospace;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:170px}.pi-angle-row{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:8px}.pi-num-field{display:flex;align-items:center;gap:6px;min-width:0}.pi-num-label{font-size:11px;font-weight:600;color:var(--text-dim);min-width:14px;text-align:center;flex-shrink:0;white-space:nowrap}.pi-num-input{flex:1;min-width:0;padding:6px 8px;font-size:12px;font-weight:500;background:var(--input-bg);border:1px solid var(--input-border);border-radius:var(--radius-sm);color:var(--text-primary);font-family:Inter,monospace;outline:none;-moz-appearance:textfield;transition:border-color var(--transition)}.pi-num-input:focus{border-color:var(--accent-green);box-shadow:0 0 0 2px var(--input-focus-glow)}.pi-num-input::-webkit-inner-spin-button{-webkit-appearance:none}.pi-transform-btns{display:flex;gap:4px}.pi-transform-btns .pi-icon-btn{flex:1}.pi-icon-btn{width:28px;height:28px;display:flex;align-items:center;justify-content:center;background:var(--btn-bg);border:1px solid transparent;border-radius:var(--radius-sm);color:var(--text-dim);cursor:pointer;transition:all var(--transition)}.pi-icon-btn svg{pointer-events:none}.pi-icon-btn:hover{background:var(--btn-bg-hover);color:var(--text-primary);border-color:var(--border-subtle)}.pi-icon-btn.active{background:var(--btn-bg-active);border-color:var(--border-active);color:var(--accent-green)}.pi-scale-row{display:flex;align-items:center;gap:8px}.pi-scale-btn{width:28px;height:28px;border-radius:var(--radius-sm);background:var(--btn-bg);border:1px solid transparent;color:var(--text-dim);font-size:16px;font-weight:600;cursor:pointer;display:flex;flex-shrink:0;align-items:center;justify-content:center;transition:all var(--transition);font-family:inherit}.pi-scale-btn:hover{background:var(--btn-bg-hover);color:var(--text-primary);border-color:var(--border-subtle)}.pi-scale-range{flex:1;height:6px;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#ffffff1a;border-radius:3px;outline:none;cursor:pointer;min-width:0}.pi-scale-range::-webkit-slider-thumb{-webkit-appearance:none;width:14px;height:14px;border-radius:50%;background:var(--app-brand-primary);border:2px solid rgba(0,0,0,.35);cursor:pointer;box-shadow:0 1px 3px #00000059}.pi-scale-num{width:50px;padding:6px 4px;font-size:12px;font-weight:500;text-align:center;border-radius:var(--radius-sm);background:var(--input-bg);border:1px solid var(--input-border);color:var(--text-primary);font-family:Inter,monospace;outline:none;-moz-appearance:textfield;transition:border-color var(--transition);flex-shrink:0}.pi-scale-num:focus{border-color:#d4a5748c}.pi-scale-num::-webkit-inner-spin-button{-webkit-appearance:none}.pi-delete-row{display:flex}.pi-icon-btn[data-tip]{position:relative}.pi-tooltip{position:fixed;transform:translate(-50%,-100%);padding:4px 8px;font-size:11px;font-weight:500;white-space:nowrap;color:var(--text-primary);background:#000000d9;border:1px solid var(--border-subtle);border-radius:4px;pointer-events:none;z-index:9999;opacity:0;visibility:hidden;transition:opacity .15s ease-out}.pi-tooltip.visible{opacity:1;visibility:visible}.pi-delete-btn{display:flex;align-items:center;justify-content:center;gap:6px;width:100%;padding:8px 12px;font-size:12px;font-weight:500;background:none;border:1px solid rgba(255,68,102,.2);border-radius:var(--radius-sm);color:var(--status-error);cursor:pointer;transition:all var(--transition);font-family:inherit}.pi-delete-btn:hover{background:#ff44661a;border-color:#f466}#asset-preview{position:absolute;top:calc(var(--toolbar-h) + 12px);left:calc(var(--palette-w) + 24px);width:320px;z-index:35;background:var(--bg-card);backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);border:1px solid var(--border-subtle);border-radius:var(--radius-lg);overflow:hidden;display:none;flex-direction:column;box-shadow:var(--shadow-lg);animation:panelSlideIn .3s cubic-bezier(.4,0,.2,1)}#asset-preview.visible{display:flex}.preview-header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid var(--border-subtle);flex-shrink:0;background:#0003}.preview-title{font-size:13px;font-weight:600;color:var(--text-secondary);letter-spacing:.5px}.preview-close{width:26px;height:26px;border-radius:var(--radius-sm);background:none;border:1px solid transparent;color:var(--text-dim);font-size:18px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all var(--transition)}.preview-close:hover{background:var(--btn-bg-hover);color:var(--text-primary);border-color:var(--border-subtle)}.preview-canvas-wrap{width:100%;height:280px;position:relative;background:radial-gradient(circle at center,rgba(255,255,255,.05) 0%,transparent 70%)}.preview-canvas-wrap canvas{display:block;width:100%!important;height:100%!important}.preview-info{display:flex;align-items:center;justify-content:space-between;padding:10px 16px;border-top:1px solid var(--border-subtle);flex-shrink:0;background:#0003}.preview-name{font-size:13px;font-weight:500;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}.preview-size{font-size:11px;color:var(--text-dim);font-family:Inter,monospace;flex-shrink:0;margin-left:12px;background:var(--btn-bg);padding:2px 6px;border-radius:4px}#binding-overlay{display:none;position:fixed;top:0;right:0;bottom:0;left:0;background:var(--bg-overlay);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);z-index:100;justify-content:center;align-items:center;animation:fadeIn .2s ease-out}#binding-overlay.open{display:flex}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}#binding-panel{background:var(--bg-card-gradient);border:1px solid var(--border-subtle);border-radius:20px;padding:24px;width:440px;max-height:85vh;overflow-y:auto;box-shadow:var(--shadow-lg);position:relative;transform:scale(.95);animation:modalPop .3s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes modalPop{to{transform:scale(1)}}.binding-title{font-family:Poppins,sans-serif;font-size:18px;font-weight:700;color:var(--text-primary);margin-bottom:20px;text-align:center;letter-spacing:.5px}.binding-row{display:flex;align-items:center;gap:14px;padding:14px 16px;margin-bottom:10px;background:#ffffff08;border:1px solid rgba(255,255,255,.05);border-radius:14px;transition:all var(--transition)}.binding-row:hover{background:#ffffff0d;border-color:#ffffff1a}.binding-icon{width:36px;height:36px;flex-shrink:0;display:flex;align-items:center;justify-content:center;background:#ffd70014;border:1px solid rgba(255,215,0,.15);border-radius:10px;color:var(--accent-gold)}.binding-info{flex:1;min-width:0}.binding-label{font-size:13px;color:var(--text-primary);font-weight:600;margin-bottom:3px;display:flex;align-items:center;gap:8px}.binding-desc{font-size:11px;color:var(--text-dim);line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.binding-tag{font-size:10px;font-weight:600;padding:1px 6px;border-radius:4px;letter-spacing:.3px}.tag-required{background:#ff446626;color:var(--status-error)}.tag-optional{background:#45e7961a;color:var(--accent-green)}.tag-auto{background:#ffffff14;color:var(--text-dim)}.binding-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.binding-badge{font-size:10px;padding:3px 8px;border-radius:5px;font-weight:600;flex-shrink:0;letter-spacing:.3px}.binding-badge.set{background:#45e7961f;color:var(--accent-green);border:1px solid rgba(69,231,150,.25)}.binding-badge.unset{background:#ff44661f;color:var(--status-error);border:1px solid rgba(255,68,102,.25)}.binding-action-btn{font-size:11px;font-weight:500;padding:4px 10px;border-radius:6px;border:1px solid transparent;cursor:pointer;transition:all var(--transition);font-family:inherit;white-space:nowrap}.btn-bind{background:#45e7961f;color:var(--accent-green);border-color:#45e79640}.btn-bind:hover{background:#45e79633;border-color:#45e79666}.btn-change{background:var(--btn-bg);color:var(--text-dim);border-color:var(--border-subtle)}.btn-change:hover{background:var(--btn-bg-hover);color:var(--text-primary)}.btn-unbind{background:#ff446614;color:#ff6478cc;border-color:#ff446626}.btn-unbind:hover{background:#ff446626;color:var(--status-error);border-color:#ff44664d}.binding-close{position:absolute;top:16px;right:16px;width:32px;height:32px;border-radius:50%;background:#ffffff0d;border:1px solid transparent;color:var(--text-dim);font-size:18px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all var(--transition)}.binding-close:hover{background:#ff446626;color:var(--status-error);border-color:#ff44664d;transform:rotate(90deg)}.binding-tip{margin-top:16px;font-size:11px;color:var(--text-muted);text-align:center}#status-bar{position:absolute;bottom:0;left:0;right:0;height:32px;z-index:40;display:flex;align-items:center;padding:0 16px;gap:20px;background:var(--bg-card);backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);border-top:1px solid var(--border-subtle);font-size:12px;font-weight:500;color:var(--text-dim);box-shadow:0 -2px 10px #0000001a}.status-spacer{flex:1}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#ffffff26;border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#ffffff40}.binding-dropdown{position:absolute;z-index:110;min-width:220px;max-width:300px;max-height:280px;overflow-y:auto;background:#121212f5;backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);border:1px solid var(--border-subtle);border-radius:var(--radius-md);padding:4px;box-shadow:var(--shadow-lg);animation:dropdownSlide .15s ease-out}@keyframes dropdownSlide{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.bd-item{display:flex;align-items:center;gap:8px;padding:8px 12px;border-radius:var(--radius-sm);cursor:pointer;transition:background var(--transition);font-size:12px}.bd-item:hover:not(.bd-disabled):not(.bd-current){background:var(--btn-bg-hover)}.bd-item.bd-disabled{opacity:.4;cursor:not-allowed}.bd-item.bd-current{background:var(--btn-bg-active);cursor:default}.bd-name{flex:1;min-width:0;color:var(--text-primary);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bd-meta{font-size:10px;color:var(--text-muted);font-family:Inter,monospace;flex-shrink:0}.bd-lock{font-size:10px;font-weight:600;padding:1px 6px;border-radius:4px;background:#ff44661f;color:#ff6478cc;flex-shrink:0}.bd-current-tag{font-size:10px;font-weight:600;padding:1px 6px;border-radius:4px;background:#45e7961f;color:var(--accent-green);flex-shrink:0}.bd-empty{padding:16px;text-align:center;font-size:12px;color:var(--text-muted)}#confirm-overlay,.confirm-overlay-base{display:none;position:fixed;top:0;right:0;bottom:0;left:0;background:var(--bg-overlay);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);z-index:200;justify-content:center;align-items:center;animation:fadeIn .15s ease-out}#confirm-overlay.open,.confirm-overlay-base.open{display:flex}.confirm-dialog{background:var(--bg-card-gradient);border:1px solid var(--border-subtle);border-radius:20px;padding:32px 28px 24px;width:340px;text-align:center;box-shadow:var(--shadow-lg);transform:scale(.95);animation:modalPop .25s cubic-bezier(.34,1.56,.64,1) forwards}.confirm-icon{width:48px;height:48px;margin:0 auto 16px;display:flex;align-items:center;justify-content:center;border-radius:50%;background:#ff44661a;color:var(--status-error)}.confirm-title{font-family:Poppins,sans-serif;font-size:16px;font-weight:700;color:var(--text-primary);margin-bottom:8px}.confirm-message{font-size:13px;color:var(--text-dim);line-height:1.5;margin-bottom:24px}.confirm-actions{display:flex;gap:10px}.cw-dialog-input{width:100%;padding:10px 12px;font-size:14px;font-family:inherit;color:var(--text-primary);background:#ffffff0f;border:1px solid var(--border-default);border-radius:8px;outline:none;margin-bottom:18px;transition:border-color .2s}.cw-dialog-input:focus{border-color:#d4a5748c}.cw-dialog-input::placeholder{color:var(--text-muted)}.confirm-btn{flex:1;padding:10px 16px;font-size:13px;font-weight:600;border-radius:var(--radius-md);border:1px solid transparent;cursor:pointer;font-family:inherit;transition:all var(--transition)}.confirm-cancel{background:var(--btn-bg);border-color:var(--border-subtle);color:var(--text-dim)}.confirm-cancel:hover{background:var(--btn-bg-hover);color:var(--text-primary);border-color:var(--border-hover)}.confirm-ok{background:#ff446626;border-color:#ff44664d;color:var(--status-error)}.confirm-ok:hover{background:#ff446640;border-color:#ff446680}#add-citizen-overlay .cw-dialog-input{border-color:#d4a57459}#add-citizen-overlay .cw-dialog-input:focus{border-color:#d4a574a6}#add-citizen-overlay .confirm-icon{background:#d4a5741f;color:var(--app-brand-primary)}#add-citizen-overlay .confirm-ok{background:#d4a5741f;border-color:#d4a57473;color:var(--app-brand-primary)}#add-citizen-overlay .confirm-ok:hover{background:#d4a57433;border-color:#d4a574a6;box-shadow:0 2px 12px #d4a57438}.custom-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:40px 20px}.custom-empty-icon{width:56px;height:56px;border-radius:50%;background:#d4a5741a;display:flex;align-items:center;justify-content:center;color:var(--app-brand-primary)}.custom-add-btn-empty{margin-top:4px;padding:8px 20px;font-size:13px;font-weight:600;background:var(--app-brand-primary);color:#1a1510;border:none;border-radius:var(--radius-sm);cursor:pointer;font-family:inherit;transition:opacity .15s ease,transform .15s ease}.custom-add-btn-empty:hover{opacity:.85;transform:scale(1.02)}.custom-card{position:relative}.custom-card .custom-thumb-wrap{width:40px;height:40px;border-radius:var(--radius-sm);background:#ffffff0a;overflow:hidden;display:flex;align-items:center;justify-content:center;flex-shrink:0}.custom-thumb{width:100%;height:100%;object-fit:cover}.custom-more-btn{width:24px;height:24px;flex-shrink:0;background:none;border:1px solid transparent;border-radius:var(--radius-sm);color:var(--text-muted);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all var(--transition)}.custom-more-btn:hover{background:var(--btn-bg-hover);color:var(--text-primary);border-color:var(--border-subtle)}.custom-add-footer{display:block;width:calc(100% - 16px);margin:8px;padding:10px;text-align:center;font-size:13px;font-weight:600;background:#d4a5741a;border:1px solid rgba(212,165,116,.4);border-radius:var(--radius-sm);color:var(--app-brand-primary);cursor:pointer;font-family:inherit;transition:background .15s ease,border-color .15s ease;flex-shrink:0}.custom-add-footer:hover{background:#d4a57429;border-color:#d4a5748c}.custom-popover{z-index:50;min-width:100px;background:var(--bg-card-gradient);border:1px solid var(--border-subtle);border-radius:var(--radius-md);box-shadow:var(--shadow-md);padding:4px;overflow:hidden;animation:fadeIn .1s ease-out}.popover-item{display:flex;align-items:center;gap:8px;width:100%;padding:8px 12px;font-size:12px;font-weight:500;color:var(--text-secondary);background:none;border:none;border-radius:var(--radius-sm);cursor:pointer;font-family:inherit;text-align:left;transition:all var(--transition)}.popover-item:hover{background:var(--btn-bg-hover);color:var(--text-primary)}.popover-danger{color:var(--status-error)}.popover-danger:hover{background:#ff44661a;color:var(--status-error)}#upload-overlay{display:none;position:fixed;top:0;right:0;bottom:0;left:0;background:var(--bg-overlay);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);z-index:200;justify-content:center;align-items:center;animation:fadeIn .15s ease-out}#upload-overlay.open{display:flex}.upload-panel{background:var(--bg-card-gradient);border:1px solid var(--border-subtle);border-radius:20px;padding:24px;width:400px;max-height:85vh;overflow-y:auto;box-shadow:var(--shadow-lg);transform:scale(.95);animation:modalPop .25s cubic-bezier(.34,1.56,.64,1) forwards}.upload-panel.upload-panel--step2{width:720px;display:flex;flex-direction:column}.upload-body{display:flex;gap:20px;flex:1;min-height:0}.upload-body .upload-form{flex:0 0 280px;display:flex;flex-direction:column}.upload-body .upload-footer{margin-top:auto}.upload-body .upload-preview-area{flex:1;height:auto;min-height:380px;margin-bottom:0}.upload-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}.upload-title{font-family:Poppins,sans-serif;font-size:16px;font-weight:700;color:var(--text-primary)}.upload-close-btn{width:28px;height:28px;border-radius:var(--radius-sm);background:none;border:1px solid transparent;color:var(--text-muted);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all var(--transition)}.upload-close-btn:hover{background:var(--btn-bg-hover);color:var(--text-primary)}.upload-dropzone{border:2px dashed rgba(255,255,255,.15);border-radius:var(--radius-md);padding:40px 20px;text-align:center;cursor:pointer;transition:all var(--transition)}.upload-dropzone:hover,.upload-dropzone.dragover{border-color:var(--accent-green);background:#45e7960a}.dropzone-icon{color:var(--text-muted);margin-bottom:12px;transition:color var(--transition)}.upload-dropzone:hover .dropzone-icon,.upload-dropzone.dragover .dropzone-icon{color:var(--accent-green)}.dropzone-text{font-size:14px;font-weight:500;color:var(--text-secondary);margin-bottom:4px}.dropzone-hint{font-size:12px;color:var(--text-muted)}.upload-preview-area{position:relative;width:100%;height:200px;border-radius:var(--radius-md);overflow:hidden;background:#101018;margin-bottom:16px}.upload-preview-canvas{width:100%;height:100%;display:block}.upload-preview-info{position:absolute;bottom:0;left:0;right:0;padding:6px 10px;font-size:11px;color:var(--text-dim);background:#0009;text-align:center}.upload-form{display:flex;flex-direction:column;gap:12px}.upload-label{display:flex;flex-direction:column;gap:4px;font-size:12px;font-weight:500;color:var(--text-dim)}.upload-input{padding:8px 10px;font-size:13px;background:var(--input-bg);border:1px solid var(--input-border);border-radius:var(--radius-sm);color:var(--text-primary);font-family:inherit;outline:none;transition:border-color var(--transition),box-shadow var(--transition)}.upload-input:focus{border-color:var(--input-focus-border);box-shadow:0 0 0 3px var(--input-focus-glow)}select.upload-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='rgba(255,255,255,0.5)' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 8px center;padding-right:28px}.upload-row{display:flex;gap:12px}.upload-row .upload-label{flex:1}.upload-range{width:100%;height:4px;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:var(--border-subtle);border-radius:2px;outline:none;margin-top:4px}.upload-range::-webkit-slider-thumb{-webkit-appearance:none;width:14px;height:14px;background:var(--app-brand-primary);border-radius:50%;cursor:pointer;border:2px solid rgba(0,0,0,.35);box-shadow:0 1px 3px #0000004d}.upload-error{font-size:12px;color:var(--status-error);min-height:0;overflow:hidden;max-height:0;transition:all .2s;padding:0}.upload-error.visible{max-height:40px;padding:8px 0 0}.upload-actions{display:flex;gap:10px;margin-top:16px}.upload-btn{flex:1;padding:10px 16px;font-size:13px;font-weight:600;border-radius:var(--radius-md);border:1px solid transparent;cursor:pointer;font-family:inherit;transition:all var(--transition)}.upload-btn:disabled{opacity:.5;cursor:not-allowed}.upload-btn-cancel{background:var(--btn-bg);border-color:var(--border-subtle);color:var(--text-dim)}.upload-btn-cancel:hover{background:var(--btn-bg-hover);color:var(--text-primary)}.upload-btn-save{background:var(--gradient-primary);color:#000;font-weight:700}.upload-btn-save:hover{opacity:.9}.upload-optimize-label{display:flex;align-items:center;gap:10px;cursor:pointer;margin-top:10px;margin-bottom:4px;padding:8px 10px;border-radius:8px;border:1px solid rgba(255,255,255,.06);transition:all .2s}.upload-optimize-label:hover{background:#45e7960a;border-color:#45e79626}.upload-optimize-label input[type=checkbox]{display:none}.upload-optimize-check{width:18px;height:18px;flex-shrink:0;border:2px solid rgba(255,255,255,.2);border-radius:5px;display:flex;align-items:center;justify-content:center;transition:all .2s;background:transparent}.upload-optimize-label input:checked+.upload-optimize-check{background:#45e796;border-color:#45e796}.upload-optimize-label input:checked+.upload-optimize-check svg{opacity:1}.upload-optimize-check svg{opacity:0;transition:opacity .15s}.upload-optimize-text{display:flex;flex-direction:column;gap:1px}.upload-optimize-name{font-size:13px;font-weight:500;color:#ffffffbf}.upload-optimize-hint{font-size:11px;color:#ffffff59}.upload-scale-row{display:flex;align-items:center;gap:6px}.upload-scale-row .pi-scale-btn{width:24px;height:24px;font-size:14px}.upload-scale-row .pi-scale-range{flex:1}.upload-scale-row .pi-scale-num{width:46px;padding:5px 3px;font-size:11px}.upload-rot-wrap{position:relative;display:inline-flex;align-items:center;flex-shrink:0}.upload-rot-wrap .pi-scale-num{width:46px;padding:5px 4px;text-align:center}.upload-rot-wrap:after{content:"°";position:absolute;right:5px;top:3px;font-size:9px;color:var(--text-muted);-webkit-user-select:none;user-select:none;pointer-events:none;line-height:1}.upload-divider{display:flex;align-items:center;gap:12px;margin:16px 0 12px}.upload-divider-line{flex:1;height:1px;background:var(--border-subtle)}.upload-divider-text{font-size:12px;color:var(--text-muted);flex-shrink:0}.ai-gen-toggle{display:flex;align-items:center;width:100%;padding:10px 14px;background:#45e7960a;border:1px solid rgba(69,231,150,.12);border-radius:var(--radius-md);color:var(--accent-green);font-size:13px;font-weight:600;cursor:pointer;font-family:inherit;transition:all var(--transition);position:relative}.ai-gen-toggle svg:first-child{flex-shrink:0}.ai-gen-label{flex:1;text-align:center}.ai-gen-toggle:hover{background:#45e79614;border-color:#45e79640}.ai-gen-toggle .ai-gen-arrow{margin-left:auto;flex-shrink:0;transition:transform .2s ease}.ai-gen-toggle.expanded .ai-gen-arrow{transform:rotate(180deg)}.ai-gen-tools{display:grid;grid-template-columns:1fr 1fr;gap:8px;max-height:0;overflow:hidden;transition:max-height .3s cubic-bezier(.4,0,.2,1),margin .3s cubic-bezier(.4,0,.2,1),opacity .25s ease;opacity:0;margin-top:0}.ai-gen-tools.expanded{max-height:200px;opacity:1;margin-top:10px;overflow:visible}.ai-tool-card{display:flex;align-items:center;gap:10px;padding:10px 12px;background:#ffffff08;border:1px solid rgba(255,255,255,.06);border-radius:var(--radius-sm);cursor:pointer;text-decoration:none;transition:all var(--transition)}.ai-tool-card:hover{background:#ffffff12;border-color:var(--border-hover);transform:translateY(-1px);box-shadow:0 4px 12px #0003}.ai-tool-logo{width:32px;height:32px;flex-shrink:0;border-radius:8px;display:flex;align-items:center;justify-content:center;font-size:15px;font-weight:700;color:#fff;font-family:Poppins,sans-serif}.ai-tool-name{font-size:13px;font-weight:600;color:var(--text-secondary);white-space:nowrap}.ai-tool-card:hover .ai-tool-name{color:var(--text-primary)}.upload-footer{display:flex;gap:10px;margin-top:16px;flex-shrink:0}.anim-dialog-overlay{display:none;position:fixed;top:0;right:0;bottom:0;left:0;background:#000000a6;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);z-index:210;align-items:center;justify-content:center}.anim-dialog-overlay.open{display:flex}.anim-dialog{width:840px;max-width:94vw;height:82vh;background:#191920;border:1px solid rgba(255,255,255,.08);border-radius:14px;display:flex;flex-direction:column;box-shadow:0 24px 80px #0009;overflow:hidden}.anim-dialog-header{display:flex;align-items:center;justify-content:space-between;padding:14px 20px;border-bottom:1px solid rgba(255,255,255,.06);flex-shrink:0}.anim-dialog-title{font-size:14px;font-weight:600;color:#f0f0f0;letter-spacing:.3px}.anim-dialog-close{background:none;border:none;color:#fff6;cursor:pointer;padding:4px;border-radius:6px;transition:all .15s}.anim-dialog-close:hover{color:#fff;background:#ffffff14}.anim-dialog-body{display:flex;flex:1;min-height:0;overflow:hidden}.anim-dialog-left{width:290px;flex-shrink:0;display:flex;flex-direction:column;padding:14px 16px;border-right:1px solid rgba(255,255,255,.06);overflow-y:auto;gap:0}.amd-section-label{font-size:12px;font-weight:600;color:#ffffff73;letter-spacing:.5px;margin-bottom:8px;margin-top:4px}.amd-sources{display:flex;flex-direction:column;gap:2px;margin-bottom:8px}.amd-source-row{display:flex;align-items:center;justify-content:space-between;padding:6px 8px;border-radius:6px;transition:background .1s}.amd-source-row:hover{background:#ffffff0a}.amd-source-info{display:flex;align-items:center;gap:6px;min-width:0;flex:1}.amd-source-name{font-size:12px;color:#ffffffa6;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.amd-source-badge{font-size:10px;color:#fff6;background:#ffffff0f;padding:1px 6px;border-radius:10px;flex-shrink:0}.amd-source-tag{font-size:10px;color:#45e796b3;background:#45e79614;padding:1px 6px;border-radius:10px;flex-shrink:0}.amd-source-actions{display:flex;gap:2px;opacity:0;transition:opacity .12s}.amd-source-row:hover .amd-source-actions{opacity:1}.amd-source-act{background:none;border:none;color:#ffffff59;cursor:pointer;padding:3px;border-radius:4px;transition:all .12s}.amd-source-act:hover{color:#fffc;background:#ffffff14}.amd-source-del:hover{color:#ff5c6c;background:#ff5c6c1f}.amd-source-empty{font-size:12px;color:#ffffff4d;padding:6px 0}.amd-add-btn,.amd-auto-btn{display:inline-flex;align-items:center;gap:5px;background:none;border:1px dashed rgba(255,255,255,.12);border-radius:7px;color:#fff6;font-size:11px;font-family:inherit;padding:6px 10px;cursor:pointer;transition:all .18s}.amd-add-btn:hover,.amd-auto-btn:hover{border-color:#45e79666;color:#45e796cc}.amd-divider{height:1px;background:#ffffff0f;margin:12px 0}.amd-map-list{display:flex;flex-direction:column;gap:4px;flex:1;overflow-y:auto}.amd-map-row{display:flex;align-items:center;gap:6px}.amd-map-label{flex:0 0 48px;font-size:11px;color:#fff6;text-align:left;font-weight:500;white-space:nowrap}.amd-map-dd{flex:1;position:relative}.amd-dd-trigger{display:flex;align-items:center;justify-content:space-between;width:100%;padding:5px 8px;font-size:11px;font-family:inherit;background:#ffffff0a;border:1px solid rgba(255,255,255,.08);border-radius:5px;color:#e0e0e0;outline:none;cursor:pointer;transition:border-color .15s;text-align:left}.amd-dd-trigger:after{content:"";display:block;width:0;height:0;border-left:3.5px solid transparent;border-right:3.5px solid transparent;border-top:4px solid rgba(255,255,255,.3);flex-shrink:0;margin-left:6px;transition:transform .15s}.amd-dd-trigger.open:after{transform:rotate(180deg)}.amd-dd-trigger:hover{border-color:#ffffff26}.amd-dd-trigger .amd-dd-text{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.amd-dd-trigger .amd-dd-text.placeholder{color:#ffffff4d}.amd-dd-menu{display:none;position:absolute;left:0;right:0;top:calc(100% + 3px);background:#1e1e24;border:1px solid rgba(255,255,255,.1);border-radius:6px;box-shadow:0 8px 24px #00000080;z-index:60;max-height:180px;overflow-y:auto;padding:3px}.amd-dd-menu.open{display:block}.amd-dd-opt{display:block;width:100%;padding:5px 8px;font-size:11px;font-family:inherit;color:#fff9;background:none;border:none;border-radius:4px;cursor:pointer;text-align:left;transition:background 80ms}.amd-dd-opt:hover{background:#ffffff0f;color:#fff}.amd-dd-opt.selected{color:#45e796;background:#45e79614}.amd-dd-menu::-webkit-scrollbar{width:3px}.amd-dd-menu::-webkit-scrollbar-thumb{background:#ffffff1f;border-radius:2px}.anim-dialog-right{flex:1;display:flex;flex-direction:column;min-height:0;min-width:0}.amd-preview-wrap{flex:1;position:relative;background:#1a1a1e;overflow:hidden;min-height:0}.amd-preview-canvas{display:block;width:100%;height:100%}.amd-preview-loading{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;font-size:12px;color:#ffffff80;background:#0006;pointer-events:none}.amd-slot-tabs{position:absolute;top:10px;left:10px;right:10px;display:flex;flex-wrap:wrap;gap:5px;pointer-events:auto}.amd-slot-tab{padding:4px 10px;font-size:11px;font-weight:500;border-radius:6px;border:1px solid rgba(255,255,255,.1);background:#00000080;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);color:#ffffffb3;cursor:pointer;transition:all .15s;font-family:inherit;white-space:nowrap}.amd-slot-tab:hover{background:#ffffff1a;border-color:#fff3}.amd-slot-tab.active{background:#45e79626;border-color:#45e79680;color:#45e796}.amd-slot-tab.disabled{opacity:.25;cursor:not-allowed;pointer-events:none}.anim-dialog-footer{display:flex;justify-content:flex-end;gap:8px;padding:12px 20px;border-top:1px solid rgba(255,255,255,.06);flex-shrink:0}.amd-btn{padding:8px 22px;font-size:13px;font-weight:500;border-radius:8px;border:none;cursor:pointer;font-family:inherit;transition:all .15s}.amd-btn-cancel{background:#ffffff0f;color:#fff9}.amd-btn-cancel:hover{background:#ffffff1a;color:#fff}.amd-btn-confirm{background:#45e796;color:#111;font-weight:600}.amd-btn-confirm:hover{background:#5af0cc}.cw-anim-status{display:flex;align-items:flex-start;gap:10px;padding:10px 12px;border-radius:8px;background:#ffffff08;border:1px solid var(--border-subtle);margin-bottom:10px}.cw-anim-status-icon{font-size:16px;line-height:1.2;flex-shrink:0}.cw-anim-status.has-anim .cw-anim-status-icon{color:var(--accent-green)}.cw-anim-status.no-anim .cw-anim-status-icon{color:var(--text-muted)}.cw-anim-status-title{font-size:13px;font-weight:500;color:var(--text-primary)}.cw-anim-status-detail{font-size:11px;color:var(--text-muted);margin-top:2px}.cw-anim-edit-btn{display:block;width:100%;padding:8px;text-align:center;font-size:12px;font-weight:500;background:#ffffff0a;border:1px solid var(--border-default);border-radius:8px;color:var(--text-secondary);cursor:pointer;font-family:inherit;transition:all .2s}.cw-anim-edit-btn:hover{background:#45e7960f;border-color:#45e7964d;color:var(--accent-green)}.cw-agent-toggle-row{display:flex;align-items:center;gap:10px;margin-bottom:6px}.cw-agent-toggle-label{font-size:12px;color:var(--text-secondary, #aaa);cursor:pointer;-webkit-user-select:none;user-select:none}.cw-agent-hint{font-size:11px;color:var(--text-muted, #666);line-height:1.4}.cw-agent-auto-badge{display:flex;align-items:center;gap:8px;padding:8px 12px;background:#45e7960f;border:1px solid rgba(69,231,150,.15);border-radius:8px;font-size:12px;color:var(--accent-green, #45E796)}.cw-agent-auto-badge svg{flex-shrink:0;stroke:var(--accent-green, #45E796)}.cw-avatar-standalone{display:flex;justify-content:center;margin-bottom:16px}.cw-avatar-standalone .cw-avatar-clickable{width:64px;height:64px;border-radius:50%;overflow:hidden;cursor:pointer;position:relative}.cw-persona-block{background:#ffffff08;border:1px solid rgba(255,255,255,.08);border-radius:10px;padding:12px;margin-bottom:16px;transition:opacity .2s,border-color .2s}.cw-persona-default{opacity:.7}.cw-persona-default input[readonly],.cw-persona-default textarea[readonly]{color:var(--text-muted, #666);cursor:default;pointer-events:none}.cw-persona-custom{border-color:#d4a57459;opacity:1}.cw-persona-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;padding-bottom:8px;border-bottom:1px solid rgba(255,255,255,.06)}.cw-persona-header-label{font-size:12px;font-weight:500;color:var(--text-secondary, #aaa)}.cw-persona-hint{font-size:11px;color:var(--app-text-secondary);margin-top:8px;line-height:1.45}.publish-wrap{display:inline-flex}.toolbar-btn-primary:disabled{opacity:.45;cursor:not-allowed;filter:saturate(.3);pointer-events:none}.cw-spin{animation:cw-spin .8s linear infinite}@keyframes cw-spin{to{transform:rotate(360deg)}}.cw-toast{position:fixed;top:60px;left:50%;transform:translate(-50%) translateY(-8px);padding:12px 28px;background:#141418eb;border:1px solid rgba(69,231,150,.3);color:var(--accent-green, #45E796);border-radius:12px;font-size:14px;font-weight:500;z-index:999;opacity:0;transition:opacity .3s,transform .3s;backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);box-shadow:0 8px 32px #00000080}.cw-toast.visible{opacity:1;transform:translate(-50%) translateY(0)}.cw-toast-error{border-color:#ff44664d;color:var(--status-error, #ff4466)}.char-upload-overlay{display:none;position:fixed;top:0;right:0;bottom:0;left:0;background:var(--bg-overlay);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);z-index:200;justify-content:center;align-items:center;animation:fadeIn .15s ease-out}.char-upload-overlay.open{display:flex}.char-upload-panel{transform:scale(.95);animation:modalPop .25s cubic-bezier(.34,1.56,.64,1) forwards}.upload-custom-select{position:relative}.upload-select-trigger{display:flex;align-items:center;justify-content:space-between;padding:8px 10px;font-size:13px;background:var(--input-bg);border:1px solid var(--input-border);border-radius:var(--radius-sm);color:var(--text-primary);cursor:pointer;transition:border-color var(--transition),box-shadow var(--transition);font-family:inherit}.upload-select-trigger:hover{border-color:var(--border-hover)}.upload-custom-select.open .upload-select-trigger{border-color:var(--input-focus-border);box-shadow:0 0 0 3px var(--input-focus-glow)}.upload-select-arrow{flex-shrink:0;color:var(--text-muted);transition:transform .15s ease}.upload-custom-select.open .upload-select-arrow{transform:rotate(180deg)}.upload-select-dropdown{display:none;position:absolute;top:calc(100% + 4px);left:0;right:0;background:#121212f5;backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);border:1px solid var(--border-subtle);border-radius:var(--radius-sm);padding:4px;z-index:10;max-height:200px;overflow-y:auto;box-shadow:var(--shadow-md);animation:dropdownSlide .15s ease-out}.upload-custom-select.open .upload-select-dropdown{display:block}.upload-select-option{padding:7px 10px;font-size:12px;font-weight:500;color:var(--text-secondary);border-radius:4px;cursor:pointer;transition:all var(--transition)}.upload-select-option:hover{background:var(--btn-bg-hover);color:var(--text-primary)}.upload-select-option.active{background:var(--btn-bg-active);color:var(--accent-green)}.editor-marquee{position:absolute;border:1.5px solid var(--accent-blue);background:#38bdf814;pointer-events:none;z-index:45;border-radius:2px}.pi-align-section{margin-bottom:4px}.pi-align-row{display:flex;align-items:center;gap:6px;margin-bottom:6px}.pi-align-label{font-size:11px;font-weight:600;color:var(--text-dim);width:14px;text-align:center;flex-shrink:0}.pi-align-btns{display:flex;gap:3px;flex:1}.pi-align-btns .pi-icon-btn{flex:1;min-width:0;font-size:11px;font-weight:600;height:26px}.pi-group-btns{display:flex;gap:8px}.pi-group-btn{flex:1;padding:8px 10px;font-size:12px;font-weight:500;border-radius:var(--radius-sm);border:1px solid var(--border-subtle);background:var(--btn-bg);color:var(--text-dim);cursor:pointer;font-family:inherit;transition:all var(--transition);display:flex;align-items:center;justify-content:center;gap:4px}.pi-group-btn:hover{background:var(--btn-bg-hover);color:var(--text-primary);border-color:var(--border-hover)}.pi-group-btn.btn-primary{background:var(--btn-bg-active);border-color:var(--border-active);color:var(--accent-green)}.pi-group-btn.btn-primary:hover{background:#45e79633}.cw-field-inline{display:flex;align-items:center;gap:8px}.cw-field-inline .cw-field-label{flex:0 0 56px;margin-bottom:0;text-align:right}.cw-field-inline .cw-input-sm{flex:1;padding:5px 8px;font-size:12px}.cw-anim-hint{font-size:12px;color:var(--text-dim);padding:6px 0}.preview-hidden{display:none!important}#scene-container.preview-active{cursor:default}.preview-hud{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;z-index:200}.preview-hud-top{position:absolute;top:0;left:0;right:0;display:flex;align-items:center;justify-content:space-between;padding:12px 20px;background:linear-gradient(180deg,rgba(0,0,0,.5) 0%,transparent 100%);pointer-events:auto}.preview-exit-btn{background:#d4a57426;border:1px solid rgba(212,165,116,.35);color:var(--app-brand-secondary);padding:6px 14px;border-radius:6px;font-size:13px;cursor:pointer;transition:background .2s}.preview-exit-btn:hover{background:#d4a57447}.preview-time-label{font-size:18px;font-weight:600;color:#fff;text-shadow:0 1px 4px rgba(0,0,0,.5);font-variant-numeric:tabular-nums}.preview-hud-bottom{position:absolute;bottom:0;left:0;right:0;display:flex;align-items:center;justify-content:center;gap:16px;padding:12px 20px;background:linear-gradient(0deg,rgba(0,0,0,.6) 0%,transparent 100%);pointer-events:auto}.preview-hud-group{display:flex;align-items:center;gap:6px}.preview-time-slider{width:160px;height:4px;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#fff3;border-radius:2px;outline:none}.preview-time-slider::-webkit-slider-thumb{-webkit-appearance:none;width:14px;height:14px;border-radius:50%;background:var(--app-brand-primary);cursor:pointer;border:2px solid rgba(0,0,0,.35)}.preview-weather-btn,.preview-speed-btn{background:#ffffff14;border:1px solid rgba(255,255,255,.15);color:#ffffffb3;padding:4px 10px;border-radius:4px;font-size:12px;cursor:pointer;transition:all .2s}.preview-weather-btn:hover,.preview-speed-btn:hover{background:#ffffff26;color:#fff}.preview-weather-btn.active,.preview-speed-btn.active{background:#d4a5742e;border-color:#d4a57473;color:var(--app-brand-secondary)}.pi-toggle{position:relative;width:44px;height:26px;background:#ffffff24;border:1px solid rgba(255,255,255,.18);border-radius:13px;cursor:pointer;transition:background .2s ease,border-color .2s ease,box-shadow .2s ease;flex-shrink:0;box-shadow:inset 0 1px 2px #00000040}.pi-toggle:hover{background:#ffffff2e;border-color:#ffffff38}.pi-toggle.active{background:#d4a5748c;border-color:#d4a574d9;box-shadow:inset 0 1px 2px #00000026}.pi-toggle:after{content:"";position:absolute;top:3px;left:3px;width:18px;height:18px;border-radius:50%;background:#fff;box-shadow:0 1px 3px #00000059;transition:transform .22s cubic-bezier(.4,0,.2,1),background .2s ease}.pi-toggle.active:after{transform:translate(18px);background:#fffef8;box-shadow:0 2px 4px #00000047}.pi-toggle:focus-visible{outline:2px solid rgba(212,165,116,.55);outline-offset:2px}.pi-light-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:4px;margin-bottom:4px}.pi-light-grid .pi-num-field{min-width:0}.pi-light-grid .pi-num-input{width:100%;min-width:0}.pi-color-input{width:36px;height:24px;padding:0;border:1px solid rgba(255,255,255,.12);border-radius:4px;background:none;cursor:pointer;vertical-align:middle}.pi-color-input::-webkit-color-swatch-wrapper{padding:2px}.pi-color-input::-webkit-color-swatch{border:none;border-radius:2px}#property-inspector{scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.15) transparent}.cw-transform-panel{padding:0 14px 14px}.cw-transform-panel .cw-section{margin-top:4px}.cw-transform-grid{display:grid;grid-template-columns:48px 1fr 60px;gap:6px 8px;align-items:center}.cw-transform-label{font-size:11px;font-weight:500;color:var(--app-text-tertiary);white-space:nowrap}.cw-transform-slider{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:100%;height:4px;border-radius:2px;background:#ffffff1a;outline:none;cursor:pointer}.cw-transform-slider::-webkit-slider-thumb{-webkit-appearance:none;width:14px;height:14px;border-radius:50%;background:var(--app-brand-primary);border:2px solid rgba(0,0,0,.35);cursor:pointer;box-shadow:0 1px 3px #00000059;margin-top:-5px}.cw-transform-slider::-webkit-slider-runnable-track{height:4px;border-radius:2px;background:#ffffff1a}.cw-transform-slider::-moz-range-thumb{width:14px;height:14px;border-radius:50%;background:var(--app-brand-primary);border:2px solid rgba(0,0,0,.35);cursor:pointer;box-shadow:0 1px 3px #00000059}.cw-transform-slider::-moz-range-track{height:4px;border-radius:2px;background:#ffffff1a}.cw-transform-num{width:100%;padding:5px 6px;font-size:11px;font-weight:500;color:var(--text-primary);-moz-appearance:textfield;background:var(--input-bg);border:1px solid var(--border-default);border-radius:var(--radius-sm);text-align:center;outline:none;font-family:inherit;transition:border-color .15s ease}.cw-transform-num::-webkit-outer-spin-button,.cw-transform-num::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.cw-transform-num:focus{border-color:#d4a5748c;box-shadow:0 0 0 2px #d4a5741f}.cw-transform-reset{margin-top:10px;width:100%;padding:6px 0;font-size:11px;color:var(--app-text-secondary);background:#ffffff0d;border:1px solid var(--border-subtle);border-radius:6px;cursor:pointer;transition:background .15s,color .15s,border-color .15s}.cw-transform-reset:hover{background:#ffffff14;color:var(--text-primary);border-color:var(--border-default)}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
(function(){const i=document.createElement("link").relList;if(i&&i.supports&&i.supports("modulepreload"))return;for(const e of document.querySelectorAll('link[rel="modulepreload"]'))r(e);new MutationObserver(e=>{for(const t of e)if(t.type==="childList")for(const a of t.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&r(a)}).observe(document,{childList:!0,subtree:!0});function o(e){const t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin==="use-credentials"?t.credentials="include":e.crossOrigin==="anonymous"?t.credentials="omit":t.credentials="same-origin",t}function r(e){if(e.ep)return;e.ep=!0;const t=o(e);fetch(e.href,t)}})();const l={"period.dawn":"黎明","period.morning":"上午","period.noon":"正午","period.afternoon":"下午","period.dusk":"傍晚","period.night":"夜晚","weather.clear":"晴","weather.cloudy":"阴","weather.drizzle":"细雨","weather.rain":"雨","weather.heavyRain":"暴雨","weather.storm":"雷暴","weather.lightSnow":"小雪","weather.snow":"雪","weather.blizzard":"暴雪","weather.fog":"雾","weather.sandstorm":"沙暴","weather.aurora":"极光","input.busy":"AI 工作中...","input.idle":"输入消息...","input.gathering":"居民赶来中...","input.topic":"输入话题...",steward:"管家",mayor:"镇长",you:"你",resident:"居民",ai_steward:"AI 管家",session_label:"会话",more_btn:"更多",attach_title:"上传图片",voice_title:"语音输入","menu.new_task":"新任务","menu.start_topic":"发起话题","menu.settings":"设置",back_to_town:"← 返回小镇",task_done:"任务完成",try_now:"立即体验",later:"稍后再说",download:"下 载",cancel:"取消",confirm:"确认",new_project:"新项目",new_game:"新游戏","loading.init_town":"正在初始化小镇...","loading.creating_souls":"正在为居民创建人设文件","settings.title":"设置","settings.language":"语言","settings.music":"小镇音乐","settings.soul_mode":"灵魂模式","settings.soul_mode_desc":"NPC 使用 AI 进行深度对话","settings.reset":"重置小镇","settings.reset_desc":"清除所有设定,重新开始","settings.on":"开","settings.off":"关","settings.cancel":"取消","settings.save":"保存","topic.title":"发起话题","topic.subtitle":"选择参与讨论的居民(至少2位)","topic.gather":"召集","topic.gather_n":"召集({n}人)","topic.end_title":"结束话题?","topic.end_desc":"居民将回归日常生活","topic.not_in_town":"当前居民还不在小镇","reset.confirm":"重置小镇?将清除所有设定并重新开始创镇流程。","card.chat":"聊天","card.busy_working":"对方正在专心工作","card.offline":"对方不在线","card.task_list":"任务列表","card.work_logs":"最近工作日志","card.thinking":"正在思考","mode.work":"工作模式","media.download_fail":"下载失败,请稍后重试","media.view":"立即查看","media.download_btn":"立即下载","media.unknown_file":"未知文件","media.unknown_type":"未知类型","media.image":"[图片]","media.video":"[视频]","media.audio":"[音频]","media.file":"[文件]","ws.error":"无法连接 OpenClaw Gateway ({url})。请检查:1) Gateway 是否已启动 2) WebSocket 端口是否正确。确认后刷新页面即可。","topnav.citizens":"居民管理","topnav.town_editor":"小镇改造","topnav.skill_store":"技能商店","topnav.settings":"设置","screen.analyzing":"分析中","skill.equipped":"已获取","skill.market":"技能超市","skill.empty":"还没有获取技能,去技能超市看看吧","skill.search":"搜索技能名称或描述...","skill.all":"全部","skill.get":"获取","skill.getting":"获取中","skill.got":"已获取","skill.new_skill":"已获取新技能","skill.learn_now":"立即学习","skill.learn_later":"稍后再说","skill.wan":"万","setup.title_suffix":"小镇 居民总览","setup.hint":"以后随时可以修改或招募新居民","setup.close":"关闭",town_name:"夏尔小镇","editor.scene_workshop":"场景工坊","editor.citizen_workshop":"角色工坊","editor.save":"保存","editor.preview":"预览","editor.publish":"发布","editor.more":"更多","editor.undo":"撤销","editor.redo":"重做","editor.import_map":"导入地图","editor.export_map":"导出地图","editor.clear_map":"清空地图","editor.import_char":"导入角色配置","editor.export_char":"导出角色配置","editor.clear_char":"清空角色配置","editor.loading_assets":"加载美术资产...","editor.asset_lib":"资产库","editor.buildings":"建筑","editor.roads":"道路","editor.nature":"自然","editor.props":"道具","editor.asset_preview":"资产预览","editor.select_mode":"选择模式","editor.building_count":"建筑","editor.prop_count":"道具","editor.clear_confirm_title":"清空地图","editor.clear_confirm_msg":"确定要清空当前地图吗?此操作不可撤销。","editor.cancel":"取消","editor.ok":"确定","editor.select_tool":"选择","editor.terrain_tool":"地形刷","editor.erase_tool":"删除","editor.bindings":"功能绑定","editor.resize":"扩建地图","editor.persp_mode":"透视模式","editor.preview_loading":"正在加载预览...","editor.preview_fail":"预览加载失败","editor.close_window":"关闭窗口","editor.char_list":"角色列表","editor.add_citizen":"+ 添加居民","editor.selected_model":"已选角色模型:","editor.change_model":"更换模型","editor.char_asset_lib":"角色资产库","editor.tab_all":"通用","editor.tab_custom":"我的","editor.selected_char":"已选角色:","editor.change_to":"更换为:","editor.not_selected":"未选择","editor.confirm_change":"确认更换","editor.char_settings":"角色设置","editor.add_citizen_title":"添加居民","editor.add_citizen_msg":"请输入新居民的名称","editor.citizen_name_placeholder":"居民名称","editor.add":"添加","editor.confirm_title":"确认","editor.publish_to_town":"发布到小镇"},c={"period.dawn":"Dawn","period.morning":"AM","period.noon":"Noon","period.afternoon":"PM","period.dusk":"Dusk","period.night":"Night","weather.clear":"Clear","weather.cloudy":"Cloudy","weather.drizzle":"Drizzle","weather.rain":"Rain","weather.heavyRain":"Storm","weather.storm":"Thunder","weather.lightSnow":"Snow","weather.snow":"Snow","weather.blizzard":"Blizzard","weather.fog":"Fog","weather.sandstorm":"Dust","weather.aurora":"Aurora","input.busy":"Working...","input.idle":"Message...","input.gathering":"Gathering...","input.topic":"Topic...",steward:"Steward",mayor:"Mayor",you:"You",resident:"Citizen",ai_steward:"AI Steward",session_label:"Session",more_btn:"More",attach_title:"Attach",voice_title:"Voice","menu.new_task":"New Task","menu.start_topic":"Start Topic","menu.settings":"Settings",back_to_town:"← Back",task_done:"Done!",try_now:"Try Now",later:"Later",download:"Download",cancel:"Cancel",confirm:"Confirm",new_project:"New Project",new_game:"New Game","loading.init_town":"Initializing...","loading.creating_souls":"Setting up citizens","settings.title":"Settings","settings.language":"Language","settings.music":"Music","settings.soul_mode":"Soul Mode","settings.soul_mode_desc":"NPC AI conversations","settings.reset":"Reset Town","settings.reset_desc":"Clear all data and restart","settings.on":"ON","settings.off":"OFF","settings.cancel":"Cancel","settings.save":"Save","topic.title":"Start Topic","topic.subtitle":"Select citizens to join (min 2)","topic.gather":"Gather","topic.gather_n":"Gather ({n})","topic.end_title":"End topic?","topic.end_desc":"Citizens will return to daily life","topic.not_in_town":"Citizen is not in town yet","reset.confirm":"Reset town? This will clear all settings and restart.","card.chat":"Chat","card.busy_working":"Busy working","card.offline":"Offline","card.task_list":"Tasks","card.work_logs":"Logs","card.thinking":"Thinking","mode.work":"Work Mode","media.download_fail":"Download failed","media.view":"View","media.download_btn":"Download","media.unknown_file":"Unknown file","media.unknown_type":"Unknown","media.image":"[Image]","media.video":"[Video]","media.audio":"[Audio]","media.file":"[File]","ws.error":"Cannot connect to OpenClaw Gateway ({url}). Check: 1) Gateway is running 2) Port is correct. Refresh after fixing.","topnav.citizens":"Citizens","topnav.town_editor":"Town Editor","topnav.skill_store":"Skill Store","topnav.settings":"Settings","screen.analyzing":"Analyzing","skill.equipped":"Installed","skill.market":"Skill Store","skill.empty":"No skills yet. Browse the store!","skill.search":"Search skills...","skill.all":"All","skill.get":"Install","skill.getting":"Installing","skill.got":"Installed","skill.new_skill":"New Skill Acquired","skill.learn_now":"Learn Now","skill.learn_later":"Later","skill.wan":"K","setup.title_suffix":"Town Overview","setup.hint":"You can modify or recruit citizens anytime","setup.close":"Close",town_name:"Shire Town","editor.scene_workshop":"Scene Editor","editor.citizen_workshop":"Character Workshop","editor.save":"Save","editor.preview":"Preview","editor.publish":"Publish","editor.more":"More","editor.undo":"Undo","editor.redo":"Redo","editor.import_map":"Import Map","editor.export_map":"Export Map","editor.clear_map":"Clear Map","editor.import_char":"Import Config","editor.export_char":"Export Config","editor.clear_char":"Clear Config","editor.loading_assets":"Loading assets...","editor.asset_lib":"Assets","editor.buildings":"Buildings","editor.roads":"Roads","editor.nature":"Nature","editor.props":"Props","editor.asset_preview":"Preview","editor.select_mode":"Select","editor.building_count":"Buildings","editor.prop_count":"Props","editor.clear_confirm_title":"Clear Map","editor.clear_confirm_msg":"Clear the map? This cannot be undone.","editor.cancel":"Cancel","editor.ok":"OK","editor.select_tool":"Select","editor.terrain_tool":"Terrain","editor.erase_tool":"Delete","editor.bindings":"Bindings","editor.resize":"Resize","editor.persp_mode":"Perspective","editor.preview_loading":"Loading preview...","editor.preview_fail":"Preview failed","editor.close_window":"Close","editor.char_list":"Characters","editor.add_citizen":"+ Add Citizen","editor.selected_model":"Model: ","editor.change_model":"Change","editor.char_asset_lib":"Character Library","editor.tab_all":"Library","editor.tab_custom":"Custom","editor.selected_char":"Current: ","editor.change_to":"Change to: ","editor.not_selected":"None","editor.confirm_change":"Confirm","editor.char_settings":"Settings","editor.add_citizen_title":"Add Citizen","editor.add_citizen_msg":"Enter citizen name","editor.citizen_name_placeholder":"Name","editor.add":"Add","editor.confirm_title":"Confirm","editor.publish_to_town":"Publish"},s={"zh-CN":l,en:c};let d="zh-CN";function _(){const i=new URLSearchParams(location.search).get("lang");let o=null;try{const e=localStorage.getItem("agentshire_settings");if(e){const t=JSON.parse(e);typeof t.language=="string"&&(o=t.language)}}catch{}const r=i||o||"zh-CN";s[r]&&(d=r)}function g(){return d}function p(n,i){var r,e;let o=((r=s[d])==null?void 0:r[n])??((e=s["zh-CN"])==null?void 0:e[n])??n;if(i)for(const[t,a]of Object.entries(i))o=o.replace(new RegExp(`\\{${t}\\}`,"g"),a);return o}export{g,_ as i,p as t};
|
|
2
|
+
//# sourceMappingURL=index-BWfrufil.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
var G=Object.defineProperty;var V=(c,t,e)=>t in c?G(c,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):c[t]=e;var h=(c,t,e)=>V(c,typeof t!="symbol"?t+"":t,e);import{a as z,p as O}from"./WeatherSystem-Cb3BvHes.js";import"./GLTFLoader-BA5RqSME.js";import"./SkeletonUtils-BCVmgslc.js";import"./character-catalog-DSmLtlNC.js";const H=new Set(["read_file","write_file","edit_file"]);function K(c,t){if(H.has(c))return t.path??t.file;if(c==="bash"){const i=String(t.command??"").match(/(?:cat|head|tail|vi|vim|nano|code)\s+["']?([^\s"']+)/);return i?i[1]:null}return null}class X{constructor(t){h(this,"tracker");this.tracker=t}translate(t,e){switch(t.type){case"system":return this.handleSystem(t);case"sub_agent":return this.handleSubAgent(t);case"text_delta":return[{type:"dialog_message",npcId:e??this.tracker.stewardNpcId,text:t.delta,isStreaming:!0}];case"text":return[{type:"dialog_message",npcId:e??this.tracker.stewardNpcId,text:t.content,isStreaming:!1}];case"tool_use":return this.handleToolUse(t,e);case"tool_result":return this.handleToolResult(t,e);case"thinking_delta":return e?[{type:"npc_phase",npcId:e,phase:"thinking"}]:[{type:"npc_phase",npcId:this.tracker.stewardNpcId,phase:"thinking"}];case"turn_end":return e?[{type:"npc_phase",npcId:e,phase:"idle"},{type:"workstation_screen",stationId:"",state:{mode:"off"}}]:[];case"bus_message":{const i=this.tracker.resolveNpcId(t.from);return i?[{type:"dialog_message",npcId:i,text:t.summary,isStreaming:!1}]:[]}case"world_control":return t.target==="time"?[{type:"set_time",action:t.action,hour:t.hour}]:t.target==="weather"?[{type:"set_weather",action:t.action,weather:t.weather}]:[];case"error":return e?[{type:"npc_phase",npcId:e,phase:"error"},{type:"npc_emote",npcId:e,emote:"frustrated"}]:[];default:return[]}}handleSystem(t){return t.subtype==="init"?(console.log("[EventTranslator] handleSystem init, sending world_init (NPCs already spawned by MainScene from town-defaults.json)"),[{type:"world_init",config:{townName:"夏尔",stewardName:"OpenClaw",citizenCount:5}}]):[]}handleSubAgent(t){const{subtype:e,agentId:i}=t;if(e==="started"){const n=t.displayName??i,s=i.replace(/^agent_/,"");this.tracker.registerMapping(i,s);const r=this.tracker.allocateStation(),o=[{type:"npc_spawn",npcId:s,name:n,role:"programming",category:"citizen",task:t.task}];return r&&(this.tracker.setStationForNpc(s,r),o.push({type:"workstation_assign",npcId:s,stationId:r})),o}if(e==="done"){const n=this.tracker.resolveNpcId(i);if(!n)return[];const r=t.status==="failed";return this.tracker.removeMapping(i),[{type:"npc_phase",npcId:n,phase:r?"error":"done"},{type:"npc_glow",npcId:n,color:r?"red":"green"},{type:"fx",effect:r?"error_sparks":"completion_stars",params:{npcId:n}}]}if(e==="progress"){const n=this.tracker.resolveNpcId(i);return n?this.translate(t.event,n):[]}return[]}handleToolUse(t,e){const i=e??this.tracker.stewardNpcId,n=K(t.name,t.input),s=[{type:"npc_phase",npcId:i,phase:"working"}];if(n){const r=n.split("/").pop()??n;s.push({type:"workstation_screen",stationId:"",state:{mode:"coding",fileName:r}})}return s}handleToolResult(t,e){var i;return(i=t.meta)!=null&&i.filePath?[{type:"workstation_screen",stationId:"",state:{mode:"done"}}]:[]}}const Y=["B","C","F","G","D","E","H","A","I","J"];class Z{constructor(){h(this,"agentToNpc",new Map);h(this,"npcToAgent",new Map);h(this,"npcStates",new Map);h(this,"usedStations",new Set);h(this,"stewardNpcId","steward")}resolveNpcId(t){return this.agentToNpc.get(t)}resolveAgentId(t){return this.npcToAgent.get(t)}getStationForNpc(t){var e;return(e=this.npcStates.get(t))==null?void 0:e.stationId}registerMapping(t,e){this.agentToNpc.set(t,e),this.npcToAgent.set(e,t)}removeMapping(t){const e=this.agentToNpc.get(t);if(e){const i=this.npcStates.get(e);i!=null&&i.stationId&&this.usedStations.delete(i.stationId),this.npcToAgent.delete(e),this.npcStates.delete(e)}this.agentToNpc.delete(t)}removeMappingByNpcId(t){const e=this.npcToAgent.get(t);e&&this.removeMapping(e)}allocateStation(){for(const t of Y)if(!this.usedStations.has(t))return this.usedStations.add(t),t;return null}releaseStation(t){this.usedStations.delete(t)}updatePhase(t,e){const i=this.npcStates.get(t);i&&(i.phase=e)}setStationForNpc(t,e){let i=this.npcStates.get(t);i||(i={npcId:t,agentId:this.npcToAgent.get(t)??"",phase:"idle"},this.npcStates.set(t,i)),i.stationId=e}getAllNpcStates(){return[...this.npcStates.values()]}clear(){this.agentToNpc.clear(),this.npcToAgent.clear(),this.npcStates.clear(),this.usedStations.clear()}}class xt{constructor(t){h(this,"attempt",0);h(this,"maxDelay",3e4);h(this,"timer",null);h(this,"onReconnect");this.onReconnect=t}scheduleReconnect(){const t=Math.min(1e3*Math.pow(2,this.attempt),this.maxDelay);this.attempt++,console.log(`[ReconnectManager] Reconnecting in ${t}ms (attempt ${this.attempt})`),this.timer=setTimeout(()=>{this.onReconnect()},t)}onSuccess(){this.attempt=0,this.timer&&(clearTimeout(this.timer),this.timer=null)}stop(){this.timer&&(clearTimeout(this.timer),this.timer=null),this.attempt=0}}function J(c){return Math.min(8e3,Math.max(1500,c*120))}class tt{constructor(t){h(this,"pendingPhase",[]);h(this,"dialogProtected",!1);h(this,"dialogTimer",null);h(this,"dialogTextLength",0);h(this,"emitFn");this.emitFn=t}enqueueDialog(t,e){this.emitFn(t),this.dialogTextLength+=e,this.dialogProtected=!0,this.dialogTimer&&clearTimeout(this.dialogTimer);const i=J(this.dialogTextLength);this.dialogTimer=setTimeout(()=>{this.dialogProtected=!1,this.dialogTimer=null,this.dialogTextLength=0,this.drainPending()},i)}enqueuePhase(t){this.dialogProtected?this.pendingPhase.push({events:t}):this.emitFn(t)}flush(){this.dialogTimer&&(clearTimeout(this.dialogTimer),this.dialogTimer=null),this.dialogProtected=!1,this.dialogTextLength=0,this.drainPending()}drainPending(){const t=this.pendingPhase.splice(0);for(const e of t)this.emitFn(e.events)}}const et=[{id:"house_a_door",x:5.5,z:7.2},{id:"house_b_door",x:5.4,z:12.3},{id:"house_c_door",x:5.5,z:17.1},{id:"market_door",x:29.2,z:6.2},{id:"cafe_door",x:29.1,z:12},{id:"museum_door",x:29,z:18},{id:"user_home_door",x:10.2,z:18.2}],it={town:{plaza_n:{x:18,z:17,neighbors:["plaza_c","west_n","east_n"]},plaza_c:{x:18,z:13,neighbors:["plaza_n","plaza_s","west_c","east_c"]},plaza_s:{x:18,z:9,neighbors:["plaza_c","west_s","east_s"]},west_n:{x:12,z:17,neighbors:["plaza_n","west_c","west_far_n"]},west_c:{x:12,z:13,neighbors:["west_n","plaza_c","west_s","west_far_c"]},west_s:{x:12,z:9,neighbors:["west_c","plaza_s","west_far_s"]},east_n:{x:24,z:17,neighbors:["plaza_n","east_c","east_far_n"]},east_c:{x:24,z:13,neighbors:["east_n","plaza_c","east_s","east_far_c"]},east_s:{x:24,z:9,neighbors:["east_c","plaza_s","east_far_s"]},west_far_n:{x:8,z:17,neighbors:["west_n","west_far_c"]},west_far_c:{x:8,z:13,neighbors:["west_far_n","west_c","west_far_s"]},west_far_s:{x:8,z:9,neighbors:["west_far_c","west_s"]},east_far_n:{x:28,z:17,neighbors:["east_n","east_far_c"]},east_far_c:{x:28,z:13,neighbors:["east_far_n","east_c","east_far_s"]},east_far_s:{x:28,z:9,neighbors:["east_far_c","east_s"]}},office:{office_entry_l:{x:14,z:5,neighbors:["office_center"]},office_entry_c:{x:17,z:5,neighbors:["office_center"]},office_entry_r:{x:20,z:5,neighbors:["office_center"]},office_center:{x:17,z:12,neighbors:["office_entry_l","office_entry_c","office_entry_r"]}}},st={citizenDestinationPoints:et,routeGraphs:it},Q=st,x=Q.citizenDestinationPoints,j=Q.routeGraphs,B={x:20,z:24},k={x:18,z:13},D=6.2,nt=2.2,W={x:17,z:15.8};class at{constructor(t){h(this,"moveRequestSeq",0);h(this,"pendingMoveRequests",new Map);h(this,"destinationClaimCount",new Map);h(this,"npcDestinationClaim",new Map);h(this,"npcLastDestination",new Map);h(this,"emitFn");this.emitFn=t}nextMoveRequestId(t){return this.moveRequestSeq+=1,`${t}-move-${this.moveRequestSeq}`}resolveMoveRequest(t,e,i){if(!t)return;const n=this.pendingMoveRequests.get(t);n&&(clearTimeout(n.timer),this.pendingMoveRequests.delete(t),n.npcId!==e&&console.warn(`[RouteManager][MoveAck] requestId=${t} npc mismatch expected=${n.npcId} actual=${e}`),n.resolve(i))}moveNpcAndWait(t,e,i,n=25e3){const s=this.nextMoveRequestId(t);return new Promise(r=>{const o=setTimeout(()=>{this.pendingMoveRequests.delete(s),console.warn(`[RouteManager][MoveAck] timeout npc=${t} requestId=${s}`),r("interrupted")},n);this.pendingMoveRequests.set(s,{npcId:t,resolve:r,timer:o}),this.emitFn([{type:"npc_move_to",npcId:t,target:e,speed:i,requestId:s}])})}distance2D(t,e){const i=t.x-e.x,n=t.z-e.z;return Math.sqrt(i*i+n*n)}getGreetPoint(t){const e=t*1.37%(Math.PI*2),i=nt+(Math.random()-.5)*.45;return{x:W.x+Math.cos(e)*i,z:W.z+Math.sin(e)*i}}computeLeavePlazaPoint(t){let e=t.x-k.x,i=t.z-k.z;const n=Math.sqrt(e*e+i*i);if(n<1e-4){const r=Math.random()*Math.PI*2;e=Math.cos(r),i=Math.sin(r)}else e/=n,i/=n;const s=D+.7+Math.random()*1.8;return{x:k.x+e*s,z:k.z+i*s}}claimDestinationForNpc(t,e){const i=this.npcDestinationClaim.get(t);if(i!==e){if(i){const n=this.destinationClaimCount.get(i)??0;n<=1?this.destinationClaimCount.delete(i):this.destinationClaimCount.set(i,n-1)}this.npcDestinationClaim.set(t,e),this.destinationClaimCount.set(e,(this.destinationClaimCount.get(e)??0)+1),this.npcLastDestination.set(t,e)}}releaseDestinationClaim(t,e){if(this.npcDestinationClaim.get(t)!==e)return;this.npcDestinationClaim.delete(t);const n=this.destinationClaimCount.get(e)??0;n<=1?this.destinationClaimCount.delete(e):this.destinationClaimCount.set(e,n-1)}releaseDestinationClaimLater(t,e,i){setTimeout(()=>{this.releaseDestinationClaim(t,e)},i)}chooseCitizenDestination(t,e){const i=this.npcLastDestination.get(t);let n=null;const s=x.filter(a=>this.distance2D({x:a.x,z:a.z},k)<D?!1:(this.destinationClaimCount.get(a.id)??0)===0),r=s.length>0?s:x;for(const a of r){if(this.distance2D({x:a.x,z:a.z},k)<D)continue;const u=this.distance2D(e,{x:a.x,z:a.z}),m=this.destinationClaimCount.get(a.id)??0,f=a.id===i?8:0,l=m*6,g=Math.random()*2.5-u*.42-l-f;(!n||g>n.score)&&(n={id:a.id,x:a.x,z:a.z,score:g})}if(n)return n;const o=x[Math.floor(Math.random()*x.length)];return{id:o.id,x:o.x,z:o.z,score:-999}}getRouteGraph(t){return j[t]??j.town}inferRouteScene(t,e){return t.z<=8.5&&e.z<=8.5?"office":"town"}isRouteDebugEnabled(){var t,e,i;try{const n=globalThis,s=typeof((t=n.location)==null?void 0:t.search)=="string"?new URLSearchParams(n.location.search):null;if((s==null?void 0:s.get("routeDebug"))==="1")return!0;const r=(i=(e=n.localStorage)==null?void 0:e.getItem)==null?void 0:i.call(e,"agentshire_route_debug");return r==="1"||r==="true"}catch{return!1}}getNearestRouteNodeId(t,e){const i=this.getRouteGraph(e);let s=Object.keys(i)[0]??"plaza_c",r=Number.POSITIVE_INFINITY;for(const[o,a]of Object.entries(i)){const p=this.distance2D(t,a);p<r&&(r=p,s=o)}return s}planRouteNodePath(t,e,i){const n=this.getRouteGraph(i);if(t===e)return[t];const s=new Set([t]),r=new Map,o=new Map,a=new Map,p=(u,m)=>this.distance2D(n[u],n[m]);for(o.set(t,0),a.set(t,p(t,e));s.size>0;){let u=null,m=Number.POSITIVE_INFINITY;for(const l of s){const d=a.get(l)??Number.POSITIVE_INFINITY;d<m&&(m=d,u=l)}if(!u)break;if(u===e){const l=[u];for(;r.has(u);)u=r.get(u),l.push(u);return l.reverse(),l}s.delete(u);const f=n[u];for(const l of f.neighbors){const d=(o.get(u)??Number.POSITIVE_INFINITY)+this.distance2D(f,n[l]);d<(o.get(l)??Number.POSITIVE_INFINITY)&&(r.set(l,u),o.set(l,d),a.set(l,d+p(l,e)),s.add(l))}}return[t,e]}planSceneRoute(t,e,i){const n=this.getRouteGraph(t),s=this.getNearestRouteNodeId(e,t),r=this.getNearestRouteNodeId(i,t),o=this.planRouteNodePath(s,r,t),a=[];for(const[p,u]of o.entries())p===0&&this.distance2D(e,n[u])<1.2||p===o.length-1&&this.distance2D(i,n[u])<1.2||a.push({x:n[u].x,z:n[u].z});return a.push({x:i.x,z:i.z}),a}}const rt=new Set(["png","jpg","jpeg","gif","webp","svg"]),ot=new Set(["mp4","webm","mov","m4v"]),ct=new Set(["mp3","wav","ogg","m4a","aac","flac"]),M={game:"game",app:"app",website:"website"};function ht(c,t){if(new Set(["read_file","write_file","edit_file"]).has(c))return t.path??t.file;if(c==="bash"){const n=String(t.command??"").match(/(?:cat|head|tail|vi|vim|nano|code)\s+["']?([^\s"']+)/);return n?n[1]:null}return null}function lt(c){return c?/\bpersonas?\b/i.test(c):!1}function S(c){return["write_file","edit_file"].includes(c)?"💻":c==="bash"?"⚡":["read_file","grep","glob"].includes(c)?"🔍":c==="web_search"||c==="web_fetch"?"🌐":c==="skill"?"⚡":"🔧"}const pt=new Set(["sessions_spawn","sessions_yield","next_step","create_plan","project_complete","register_project","spawn_agent"]);function ut(c,t,e){const i=[],n=ht(c,e??{}),s=(n==null?void 0:n.split("/").pop())??"",r=lt(n);if(pt.has(c))return i.push({type:"npc_emoji",npcId:t,emoji:S(c)}),{events:i,phase:"thinking"};if(["read_file","grep","glob"].includes(c)){if(r)return{events:i,phase:"documenting"};i.push({type:"npc_anim",npcId:t,anim:"reading"}),s&&i.push({type:"fx",effect:"fileIcon",params:{npcId:t,fileName:s}}),i.push({type:"npc_emoji",npcId:t,emoji:S(c)})}else if(["write_file","edit_file"].includes(c)){if(r)return{events:i,phase:"documenting"};i.push({type:"npc_anim",npcId:t,anim:"typing"}),s&&i.push({type:"fx",effect:"fileIcon",params:{npcId:t,fileName:s}}),i.push({type:"npc_emoji",npcId:t,emoji:S(c)})}else c==="bash"?(i.push({type:"npc_anim",npcId:t,anim:"typing"}),i.push({type:"npc_emoji",npcId:t,emoji:S(c)})):c==="web_search"||c==="web_fetch"?(i.push({type:"npc_anim",npcId:t,anim:"reading"}),i.push({type:"fx",effect:"searchRadar",params:{npcId:t}}),i.push({type:"npc_emoji",npcId:t,emoji:S(c)})):i.push({type:"npc_emoji",npcId:t,emoji:S(c)});return{events:i,phase:"working"}}function q(c){const e=c.toLowerCase().split(".").pop()??"";return rt.has(e)?"image":ot.has(e)?"video":ct.has(e)?"audio":"file"}const dt=500;class mt{constructor(t){h(this,"thinkingBuffers",new Map);h(this,"thinkingFlushTimers",new Map);h(this,"activityLog",[]);h(this,"emitFn");this.emitFn=t}nowHHMM(){const t=new Date;return`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}cacheActivity(t){this.activityLog.push(t),this.activityLog.length>dt&&this.activityLog.shift()}getActivityReplayEvents(){return this.activityLog.slice()}emitActivity(t,e,i,n){const s={type:"npc_activity",npcId:t,icon:e,message:i,time:this.nowHHMM()};n&&(s.status=null),this.cacheActivity(s),this.emitFn([s])}emitActivityStatus(t,e){for(let n=0;n<this.activityLog.length;n++){const s=this.activityLog[n];if(s.npcId===t&&s.type==="npc_activity"&&s.status===void 0){s.status=e;break}}const i={type:"npc_activity_status",npcId:t,success:e};this.cacheActivity(i),this.emitFn([i])}startThinkingStream(t){if(this.thinkingFlushTimers.has(t))return;const e={type:"npc_activity",npcId:t,icon:"brain",message:"",time:this.nowHHMM()};this.cacheActivity(e),this.emitFn([e]);const i=setInterval(()=>{const n=this.thinkingBuffers.get(t);if(n&&n.length>0){const s={type:"npc_activity_stream",npcId:t,delta:n};this.cacheActivity(s),this.emitFn([s]),this.thinkingBuffers.set(t,"")}},500);this.thinkingFlushTimers.set(t,i)}appendThinkingDelta(t,e){if(!e&&!this.thinkingFlushTimers.has(t))return;const i=this.thinkingBuffers.get(t)??"";this.thinkingBuffers.set(t,i+e),this.thinkingFlushTimers.has(t)||this.startThinkingStream(t)}flushThinking(t){const e=this.thinkingFlushTimers.get(t);if(!e)return;clearInterval(e),this.thinkingFlushTimers.delete(t);const i=this.thinkingBuffers.get(t);if(i&&i.length>0){const s={type:"npc_activity_stream",npcId:t,delta:i};this.cacheActivity(s),this.emitFn([s])}this.thinkingBuffers.set(t,"");const n={type:"npc_activity_stream_end",npcId:t};this.cacheActivity(n),this.emitFn([n])}toolActivityIcon(t){return t==="__thinking__"||t==="__thinking_placeholder__"?"sparkles":t==="bash"||t==="exec"?"terminal":["read","read_file","grep","glob"].includes(t)?"file-search":["write","edit","write_file","edit_file"].includes(t)?"file-edit":t==="web_search"||t==="web_fetch"||t==="browser"?"globe":t==="process"?"terminal":t==="skill"?"zap":t==="spawn_agent"||t==="sessions_spawn"?"users":t==="todo_write"?"list-checks":"wrench"}toolActivityMsg(t,e){var n;const i=e??{};if(t==="__thinking__"){const r=String(i.content??"").split(`
|
|
2
|
+
`)[0].trim();return`思考完成
|
|
3
|
+
${r.length>60?r.slice(0,57)+"...":r}`}if(t==="__thinking_placeholder__")return"正在思考";if(t==="bash"||t==="exec"){const s=String(i.command??"").trim();return/\b(pnpm|npm|yarn)\s+(install|i|ci)\b/.test(s)?"安装依赖":/\b(git\s+clone|cp\s+-r|rsync)\b/.test(s)?"克隆项目":/\bmkdir\b/.test(s)?"创建目录":/\b(rm|rmdir)\b/.test(s)?"删除文件":/\b(pnpm|npm|yarn|npx)\s+(run|exec|start|dev|build|test)\b/.test(s)||/\b(node|ts-node|tsx)\b/.test(s)?"运行脚本":/\b(cat|head|tail|less|more)\b/.test(s)?"查看文件":/\bls\b/.test(s)?"查看目录":/\b(sed|awk|grep|find)\b/.test(s)?"处理文件":/\bscreencapture\b/.test(s)?"截取屏幕":/\bcurl|wget\b/.test(s)?"网络请求":/\bdocker\b/.test(s)?"运行容器":/\bcd\b/.test(s)?"切换目录":"执行命令"}if(["read","read_file","grep","glob"].includes(t))return`阅读 ${(String(i.path??i.pattern??"").split("/").pop()??"")||"文件"}`;if(["write","edit","write_file","edit_file"].includes(t))return String(i.path??i.file??((n=i.content)==null?void 0:n.toString().slice(0,0))??"").split("/").pop(),`编辑 ${(String(i.path??i.file??"").split("/").pop()??"")||"文件"}`;if(t==="web_search")return"搜索网络";if(t==="web_fetch")return"访问网页";if(t==="browser")return"浏览器操作";if(t==="process"){const s=String(i.action??"");return s==="poll"?"等待进程完成":s==="log"?"查看进程日志":s==="kill"?"终止进程":"进程操作"}return t==="skill"?`使用技能:${String(i.skill_name??i.name??"").slice(0,20)||"技能"}`:t==="spawn_agent"||t==="sessions_spawn"?`召唤 ${String(i.name??i.displayName??i.label??"").slice(0,15)||"居民"}`:t==="todo_write"?"":`使用工具:${t}`}isTodoWrite(t){return t==="todo_write"}emitTodoActivity(t,e){const i=e.todos;if(!i||!Array.isArray(i))return;const n={type:"npc_activity_todo",npcId:t,todos:i.map(s=>({id:s.id,content:s.content,status:s.status}))};this.cacheActivity(n),this.emitFn([n])}}class gt{constructor(t){h(this,"pendingCitizenNames",[]);h(this,"citizenSpawnQueue",[]);h(this,"citizenSpawning",!1);h(this,"activeCitizenNpcs",new Set);h(this,"spawnedCitizenCount",0);h(this,"spawnedCitizenIds",new Set);h(this,"citizenFlowStartMs",new Map);h(this,"pendingStewardRenameTimer",null);this.deps=t}async detectPersonaSwitch(t){if(t.name!=="switch_persona")return;const i=String(t.output??"").match(/Persona switched to "(.+?)"/);if(!i)return;const n=i[1];this.deps.emit([{type:"fx",effect:"personaTransform",params:{npcId:this.deps.getStewardName()}}]),this.pendingStewardRenameTimer&&(clearTimeout(this.pendingStewardRenameTimer),this.pendingStewardRenameTimer=null),this.pendingStewardRenameTimer=setTimeout(()=>{this.pendingStewardRenameTimer=null,this.deps.emit([{type:"steward_rename",npcId:"steward",newName:n}])},1500),this.flushPendingCitizens(),this.deps.onPersonaChanged(n)}detectCitizenCreated(t){var r;if(t.name!=="write_file")return;const e=String(((r=t.meta)==null?void 0:r.filePath)??this.deps.getLastToolInput().path??"");if(console.log("[CitizenManager] detectCitizenCreated filePath:",e,"isPersona:",this.isPersonaPath(e)),!this.isPersonaPath(e))return;const n=(e.split("/").pop()??"").replace(/\.md$/i,"").replace(/_/g," ").trim();if(!n)return;const s=`citizen_${n.toLowerCase().replace(/\s+/g,"_")}`;if(!this.spawnedCitizenIds.has(s)&&!this.pendingCitizenNames.some(o=>o.npcId===s)&&!this.citizenSpawnQueue.some(o=>o.npcId===s)){if(!this.deps.isStewardConfirmed()){console.log(`[CitizenManager] steward not confirmed yet, queue persona file: ${n} (${s})`),this.pendingCitizenNames.push({npcId:s,citizenName:n});return}if(this.isStewardName(n)){console.log(`[CitizenManager] skipping recognized steward persona file: ${n}`),this.spawnedCitizenIds.add(s);return}console.log(`[CitizenManager] citizen persona detected: ${n} (${s}), spawn immediately`),this.spawnedCitizenIds.add(s),this.citizenSpawnQueue.push({npcId:s,citizenName:n}),this.drainCitizenSpawnQueue()}}isStewardName(t){const e=t.toLowerCase().replace(/\s+/g,"_"),i=this.deps.getPersonaName();if(i&&e===i.toLowerCase().replace(/\s+/g,"_"))return!0;const n=this.deps.getStewardName();return n!=="steward"&&e===n.toLowerCase().replace(/\s+/g,"_")}flushPendingCitizens(){if(!this.deps.isStewardConfirmed()){console.log("[CitizenManager] steward persona not confirmed yet, defer citizen spawning");return}const t=this.pendingCitizenNames.splice(0);for(const{npcId:e,citizenName:i}of t)if(!this.spawnedCitizenIds.has(e)){if(this.isStewardName(i)){console.log(`[CitizenManager] skipping steward persona: ${i}`),this.spawnedCitizenIds.add(e);continue}this.spawnedCitizenIds.add(e),this.citizenSpawnQueue.push({npcId:e,citizenName:i})}this.drainCitizenSpawnQueue()}drainCitizenSpawnQueue(){for(;this.citizenSpawnQueue.length>0;){if(this.citizenSpawning)return;const t=this.citizenSpawnQueue[0];if(this.isStewardName(t.citizenName)){console.log(`[CitizenManager] drainQueue: skipping steward persona: ${t.citizenName}`),this.citizenSpawnQueue.shift();continue}this.citizenSpawning=!0,this.citizenSpawnQueue.shift(),this.spawnCitizenSequence(t.npcId,t.citizenName);return}}async spawnCitizenSequence(t,e){var f;const i=this.spawnedCitizenCount++,n=B.x+(i%3-1)*2.5,s=B.z,r=Date.now();this.citizenFlowStartMs.set(t,r),console.log(`[CitizenManager] spawning citizen: ${e} (${t}) at (${n.toFixed(1)}, ${s.toFixed(1)})`),this.activeCitizenNpcs.add(t);let o=null,a=!1;const p=this.deps.getConfig(),u=(f=p==null?void 0:p.citizens)==null?void 0:f.find(l=>l.id===t),m=(u==null?void 0:u.avatarId)??z();this.deps.emit([{type:"npc_spawn",npcId:t,name:e,role:"general",category:"citizen",spawn:{x:n,y:0,z:s},avatarId:m}]);try{await this.deps.delayMs(300);const l=this.deps.routes.getGreetPoint(i),d=l.x,g=l.z,T=Math.sqrt((d-n)**2+(g-s)**2),w=5,y=Date.now();if(console.log(`[CitizenManager][CitizenFlow] ${t} -> greet target=(${d.toFixed(2)}, ${g.toFixed(2)}) speed=${w} mode=arrival-driven`),await this.deps.routes.moveNpcAndWait(t,{x:d,y:0,z:g},w)!=="arrived"){console.warn(`[CitizenManager][CitizenFlow] ${t} greet move interrupted`);return}this.deps.emit([{type:"npc_anim",npcId:t,anim:"wave"},{type:"fx",effect:"exclamation",params:{npcId:t}},{type:"dialog_message",npcId:t,text:`你好!我是${e},很高兴来到小镇!`,isStreaming:!1}]),await this.deps.delayMs(2500);const _=this.deps.routes.chooseCitizenDestination(t,{x:d,z:g}),P=_.x+(Math.random()-.5)*1.3,A=_.z+(Math.random()-.5)*1.3;this.deps.routes.claimDestinationForNpc(t,_.id),o=_.id;const zt=this.deps.routes.distance2D({x:d,z:g},{x:P,z:A});if(console.log(`[CitizenManager][CitizenFlow] ${t} route destination=${_.id} target=(${P.toFixed(2)}, ${A.toFixed(2)}) score=${_.score.toFixed(2)} mode=arrival-driven`),await this.deps.routes.moveNpcAndWait(t,{x:P,y:0,z:A},w)!=="arrived"){console.warn(`[CitizenManager][CitizenFlow] ${t} destination move interrupted`);return}a=!0,this.deps.emit([{type:"npc_daily_behavior_ready",npcId:t}]),this.deps.routes.releaseDestinationClaimLater(t,_.id,3e4);const U=Date.now();console.log(`[CitizenManager][CitizenFlow] ${t} done total=${U-r}ms`)}finally{o&&!a&&this.deps.routes.releaseDestinationClaim(t,o),this.activeCitizenNpcs.delete(t),this.citizenFlowStartMs.delete(t),this.citizenSpawning=!1,this.drainCitizenSpawnQueue()}}findCitizenNpcId(t){const e=t.toLowerCase().replace(/\s+/g,"_"),i=this.deps.getConfig();if(i!=null&&i.citizens){for(const s of i.citizens)if(s.name===t||s.name.toLowerCase().replace(/\s+/g,"_")===e)return s.id}const n=`citizen_${e}`;if(this.spawnedCitizenIds.has(n))return n;for(const s of this.spawnedCitizenIds)if(s.endsWith(`_${e}`))return s;return null}fuzzyMatchCitizen(t){const e=t.toLowerCase().replace(/\s+/g,"");if(!e)return null;const i=this.deps.getConfig();if(i!=null&&i.citizens)for(const n of i.citizens){const s=n.name.toLowerCase().replace(/\s+/g,"");if(s.includes(e)||e.includes(s))return n.id}for(const n of this.spawnedCitizenIds){const s=n.replace(/^citizen_/,"").replace(/_/g,"");if(s.includes(e)||e.includes(s))return n}return null}looksLikeIdFragment(t){return/^[a-z0-9_\- ]{1,12}$/i.test(t)&&!/[\u4e00-\u9fa5]/.test(t)}isPersonaPath(t){return t?/\bpersonas?\b/i.test(t):!1}}function E(c,t){return["read","read_file","grep","glob"].includes(c)?!0:["write","write_file","edit","edit_file"].includes(c)?/^Successfully/.test(t):![/^Error:/i,/^node:/,/EADDRINUSE/,/ENOENT/,/EACCES/,/throw\s+er;/,/command not found/i,/permission denied/i,/^fatal:/i,/^SyntaxError:/,/^TypeError:/,/^ReferenceError:/].some(i=>i.test(t))}const ft={x:15,z:24},_t=3e3;class Mt{constructor(){h(this,"tracker",new Z);h(this,"translator",new X(this.tracker));h(this,"phase","idle");h(this,"agents",new Map);h(this,"agentOrder",[]);h(this,"summonTimer",null);h(this,"emitFn",null);h(this,"emitBuffer",[]);h(this,"stewardName","steward");h(this,"activeToolCount",0);h(this,"personaName",null);h(this,"stewardPersonaConfirmed",!0);h(this,"townConfig",null);h(this,"personaChangedFn",null);h(this,"npcQueues",new Map);h(this,"progressRingId",null);h(this,"lastToolInput",{});h(this,"pendingProjectName","");h(this,"pendingProjectType","");h(this,"bubbleDebugEnabled",this.readBubbleDebugFlag());h(this,"systemInitReceived",!1);h(this,"workflowSummonEmitted",!1);h(this,"npcCharacterAssignments",new Map([["user",z()],["steward",z()]]));h(this,"tempWorkerNpcIds",new Set);h(this,"lastStewardText","");h(this,"pendingWorkSnapshot",null);h(this,"routes",new at(t=>this.emit(t)));h(this,"activity",new mt(t=>this.emit(t)));h(this,"citizens",new gt({emit:t=>this.emit(t),routes:this.routes,getConfig:()=>this.townConfig,getCharacterAssignments:()=>this.npcCharacterAssignments,isStewardConfirmed:()=>this.stewardPersonaConfirmed,getPersonaName:()=>this.personaName,getStewardName:()=>this.stewardName,onPersonaChanged:t=>{var e;return(e=this.personaChangedFn)==null?void 0:e.call(this,t)},delayMs:t=>this.delayMs(t),scheduleDelayedEmit:(t,e)=>this.scheduleDelayedEmit(t,e),getLastToolInput:()=>this.lastToolInput}))}readBubbleDebugFlag(){var t,e,i;try{const n=globalThis,s=typeof((t=n.location)==null?void 0:t.search)=="string"?new URLSearchParams(n.location.search):null;if((s==null?void 0:s.get("bubbleDebug"))==="1")return!0;const r=(i=(e=n.localStorage)==null?void 0:e.getItem)==null?void 0:i.call(e,"agentshire_bubble_debug");return r==="1"||r==="true"}catch{return!1}}logBubbleIngress(t,e){this.bubbleDebugEnabled&&console.log(`[BubbleDebug][Bridge][${t}] ${JSON.stringify(e)}`)}onEmit(t){if(this.emitFn=t,this.emitBuffer.length>0){const e=this.emitBuffer;this.emitBuffer=[];for(const i of e)t(i)}}onPersonaChanged(t){this.personaChangedFn=t}setPersonaName(t){this.personaName=t,this.emit([{type:"steward_rename",npcId:"steward",newName:t}])}setTownConfig(t){var e,i,n;if(this.townConfig=t,(e=t==null?void 0:t.steward)!=null&&e.avatarId&&this.npcCharacterAssignments.set("steward",t.steward.avatarId),(i=t==null?void 0:t.user)!=null&&i.avatarId&&this.npcCharacterAssignments.set("user",t.user.avatarId),((n=t==null?void 0:t.citizens)==null?void 0:n.length)>0){for(const s of t.citizens)s.id&&s.avatarId&&this.npcCharacterAssignments.set(s.id,s.avatarId);this.emit([{type:"town_config_ready",config:t}])}return!!this.pendingWorkSnapshot}executePendingRestore(){if(!this.pendingWorkSnapshot)return;const t=this.pendingWorkSnapshot;this.pendingWorkSnapshot=null,this.doRestoreWorkState(t)}onStewardRenamed(t){var e;this.personaName=t,(e=this.personaChangedFn)==null||e.call(this,t)}onUserMessage(t){this.emit([{type:"dialog_message",npcId:"user",text:t,isStreaming:!1}])}getQueue(t){let e=this.npcQueues.get(t);return e||(e=new tt(i=>this.emit(i)),this.npcQueues.set(t,e)),e}processWorldAction(t){switch(t.type){case"user_message":return{type:"chat",message:t.text};case"abort_requested":return{type:"abort"};case"steward_renamed":return this.onStewardRenamed(t.name),null;case"town_setup_complete":return null;case"return_to_town":return this.phase==="working"&&this.emit([{type:"scene_switch",target:"town"}]),null;case"building_door_clicked":return this.phase==="working"&&t.buildingId==="office"&&this.emit([{type:"scene_switch",target:"office"}]),null;case"npc_move_completed":return this.routes.resolveMoveRequest(String(t.requestId??""),String(t.npcId??""),t.status==="arrived"?"arrived":"interrupted"),null;case"workstation_released":{const e=String(t.npcId??""),i=String(t.stationId??this.tracker.getStationForNpc(e)??"");return i&&this.tracker.releaseStation(i),e&&this.tracker.removeMappingByNpcId(e),null}case"workflow_phase_complete":{const e=String(t.phase??"");if(console.log(`[DirectorBridge] workflow_phase_complete: ${e}, current phase: ${this.phase}`),e==="summoning"&&this.phase==="summoning"){this.phase="assigning",this.emit([{type:"mode_change",mode:"work",workSubState:"assigning"}]);const i=this.agentOrder.map(n=>this.agents.get(n)).filter(Boolean);this.emit([{type:"workflow_assign",agents:i.map(n=>({npcId:n.npcId,displayName:n.displayName,task:n.task}))}])}else if(e==="assigning"&&this.phase==="assigning"){this.phase="going_to_office";const i=this.agentOrder.map(n=>this.agents.get(n)).filter(Boolean);this.emit([{type:"mode_change",mode:"work",workSubState:"going_to_office"},{type:"workflow_go_office",agents:i.map(n=>({npcId:n.npcId}))}])}else if(e==="going_to_office"&&this.phase==="going_to_office"){this.phase="working";const i=[...this.agents.values()].filter(s=>s.status==="completed"||s.status==="failed").length,n=this.agents.size;this.emit([{type:"mode_change",mode:"work",workSubState:"working"},{type:"progress",current:i,total:n,label:`${i}/${n} 完成`}])}else if(e==="publishing"&&this.phase==="publishing"){this.phase="returning",this.emit([{type:"mode_change",mode:"work",workSubState:"returning"}]);const i=this.agentOrder.map(n=>this.agents.get(n)).filter(Boolean);this.emit([{type:"workflow_return",agents:i.map(n=>({npcId:n.npcId})),wasInOffice:!0}])}else if(e==="returning"&&this.phase==="returning"){this.phase="idle",this.activeToolCount=0,this.emit([{type:"mode_change",mode:"life"},{type:"npc_phase",npcId:this.stewardName,phase:"idle"}]),this.agents.clear(),this.agentOrder=[],this.tracker.clear(),this.pendingProjectName="",this.pendingProjectType="",this.citizens.pendingStewardRenameTimer&&(clearTimeout(this.citizens.pendingStewardRenameTimer),this.citizens.pendingStewardRenameTimer=null),this.routes.destinationClaimCount.clear(),this.routes.npcDestinationClaim.clear(),this.routes.npcLastDestination.clear();for(const i of this.npcQueues.values())i.flush();this.npcQueues.clear(),this.workflowSummonEmitted=!1}return null}default:return null}}getPersonaSyncEvents(){return this.personaName?[{type:"steward_rename",npcId:"steward",newName:this.personaName}]:[]}restoreWorkState(t){var e;if((e=t.agents)!=null&&e.length){if(!this.townConfig){console.log("[DirectorBridge] restoreWorkState: townConfig not ready, deferring"),this.pendingWorkSnapshot=t;return}this.doRestoreWorkState(t)}}doRestoreWorkState(t){var i,n;console.log("[DirectorBridge] doRestoreWorkState: restoring",t.agents.length,"agents"),this.agents.clear(),this.agentOrder=[],this.tracker.clear(),t.stewardPersona&&(this.personaName=t.stewardPersona,this.stewardPersonaConfirmed=!0);const e=[];for(const s of t.agents){const r=s.displayName??s.id.replace(/^agent_/,""),o=r.replace(/^agent_/,"").replace(/_/g," ").replace(/\b\w/g,l=>l.toUpperCase());let a=this.citizens.findCitizenNpcId(o)??this.citizens.findCitizenNpcId(r)??s.id.replace(/^agent_/,"");(a==="steward"||a==="user")&&(a=`temp_${s.id.replace(/^agent_/,"").slice(0,8)}_${Date.now().toString(36)}`);const p=!this.citizens.findCitizenNpcId(o)&&!this.citizens.findCitizenNpcId(r);p&&this.tempWorkerNpcIds.add(a),this.tracker.registerMapping(s.id,a);const u=s.status==="completed"||s.status==="failed"?s.status:"working",m={agentId:s.id,npcId:a,displayName:o,task:s.task,status:u};this.agents.set(s.id,m),this.agentOrder.push(s.id);let f;if(p)f=O(this.npcCharacterAssignments);else{const l=(n=(i=this.townConfig)==null?void 0:i.citizens)==null?void 0:n.find(d=>d.id===a);f=(l==null?void 0:l.avatarId)??z()}this.npcCharacterAssignments.set(a,f),e.push({npcId:a,displayName:o,task:s.task,status:u,avatarId:f})}this.phase="working",this.emit([{type:"restore_work_state",agents:e}]);for(const s of t.agents){const r=s.activityLog;if(!r||r.length===0)continue;const o=this.agents.get(s.id);if(!o)continue;const a=[];for(const p of r){const u=this.activity.toolActivityIcon(p.name),m=this.activity.toolActivityMsg(p.name,p.input),f=p.success===!0?"success":p.success===!1?"error":"none";a.push({kind:"activity",icon:u,message:m,status:f})}a.length>0&&this.emit([{type:"npc_activity_restore",npcId:o.npcId,entries:a}])}}processAgentEvent(t){var e,i,n;switch(t.type!=="text_delta"&&t.type!=="thinking_delta"&&t.type!=="tool_input_delta"&&console.log("[DirectorBridge] event:",t.type,"phase:",this.phase,"name"in t?t.name??"":""),t.type!=="text"&&t.type!=="text_delta"&&(this.lastStewardText=""),t.type){case"sub_agent":this.handleSubAgent(t);return;case"text_delta":this.lastStewardText="",this.handleStewardText(t);return;case"text":{const s=t.content??"";if(s&&s===this.lastStewardText)return;this.lastStewardText=s,this.handleStewardText(t);return}case"thinking_delta":this.activity.appendThinkingDelta(this.stewardName,t.delta??""),(this.phase==="idle"||this.phase==="working")&&(console.log("[DirectorBridge] → steward thinking"),this.getQueue(this.stewardName).enqueuePhase([{type:"npc_phase",npcId:this.stewardName,phase:"thinking"}]));return;case"tool_input_delta":(this.phase==="idle"||this.phase==="working")&&this.activeToolCount===0&&this.getQueue(this.stewardName).enqueuePhase([{type:"npc_phase",npcId:this.stewardName,phase:"thinking"}]);return;case"tool_use":if(console.log("[DirectorBridge] tool_use:",t.name,"phase:",this.phase,"toolCount:",this.activeToolCount),this.activity.flushThinking(this.stewardName),this.lastToolInput=t.input??{},this.activity.isTodoWrite(t.name??"")?this.activity.emitTodoActivity(this.stewardName,t.input??{}):this.activity.emitActivity(this.stewardName,this.activity.toolActivityIcon(t.name??""),this.activity.toolActivityMsg(t.name??"",t.input)),this.phase==="idle"||this.phase==="working"){this.activeToolCount++;const{events:s,phase:r}=ut(t.name??"",this.stewardName,t.input);this.getQueue(this.stewardName).enqueuePhase([{type:"npc_phase",npcId:this.stewardName,phase:r},...s])}return;case"tool_result":if(console.log("[DirectorBridge] tool_result:",t.name,"phase:",this.phase),this.activity.emitActivityStatus(this.stewardName,E(t.name??"",t.output??"")),this.citizens.detectPersonaSwitch(t),this.citizens.detectCitizenCreated(t),t.name==="register_project"&&(this.lastToolInput.name&&(this.pendingProjectName=String(this.lastToolInput.name)),this.lastToolInput.type&&(this.pendingProjectType=String(this.lastToolInput.type))),t.name==="project_complete"){(this.phase==="idle"||this.phase==="working")&&(this.activeToolCount=Math.max(0,this.activeToolCount-1)),this.handleProjectComplete(t);return}if(t.name==="deliver_output"){(this.phase==="idle"||this.phase==="working")&&(this.activeToolCount=Math.max(0,this.activeToolCount-1)),this.handleDeliverOutput();return}(this.phase==="idle"||this.phase==="working")&&(this.activeToolCount=Math.max(0,this.activeToolCount-1),this.activeToolCount===0&&this.getQueue(this.stewardName).enqueuePhase([{type:"npc_phase",npcId:this.stewardName,phase:"thinking"},{type:"npc_emoji",npcId:this.stewardName,emoji:null}]));return;case"turn_end":this.activity.flushThinking(this.stewardName);for(const s of this.npcQueues.values())s.flush();if(this.citizens.flushPendingCitizens(),this.phase==="summoning"){this.summonTimer&&(clearTimeout(this.summonTimer),this.summonTimer=null),this.emitWorkflowSummon();return}(this.phase==="idle"||this.phase==="working")&&(this.activeToolCount=0,this.emit([{type:"npc_phase",npcId:this.stewardName,phase:"idle"}]));return;case"llm_call":t.subtype==="start"&&(this.phase==="idle"||this.phase==="working")&&this.getQueue(this.stewardName).enqueuePhase([{type:"npc_phase",npcId:this.stewardName,phase:"thinking"}]);return;case"error":this.emit([{type:"npc_phase",npcId:this.stewardName,phase:"error"}]);return;case"bus_message":t.from&&t.to&&(this.emit([{type:"npc_look_at",npcId:t.from,targetNpcId:t.to},{type:"fx",effect:"connectionBeam",params:{fromNpcId:t.from,toNpcId:t.to}}]),t.summary&&this.emit([{type:"dialog_message",npcId:t.from,text:t.summary,isStreaming:!1}]));return;case"hook_activity":this.phase!=="working"&&this.emit([{type:"fx",effect:"hookFlash",params:{npcId:this.stewardName}}]);return;case"media_output":{if(t.role!=="assistant"||t.source==="tts")return;const r={image:"image",video:"video",audio:"audio",file:"file"}[t.kind]??"file";console.log("[DirectorBridge] media_output → deliverable_card:",r,t.path),this.emit([{type:"deliverable_card",cardType:r,name:((e=t.meta)==null?void 0:e.filename)||(typeof((i=t.meta)==null?void 0:i.originalPath)=="string"?t.meta.originalPath.split("/").pop():void 0)||((n=t.path)==null?void 0:n.split("/").pop()),filePath:t.path,mimeType:t.mimeType,thumbnailData:t.kind==="image"?t.data:void 0,data:t.data}]);return}case"system":{const s=t;if(s.subtype==="init"){if(this.systemInitReceived)return;this.systemInitReceived=!0}s.subtype==="done"&&(this.systemInitReceived=!1),this.emit(this.translator.translate(t));return}default:this.emit(this.translator.translate(t));return}}processCitizenEvent(t,e){var n,s,r;const i=this.getQueue(t);switch(e.type){case"thinking_delta":this.activity.appendThinkingDelta(t,e.delta??""),i.enqueuePhase([{type:"npc_phase",npcId:t,phase:"thinking"}]);return;case"tool_use":this.activity.flushThinking(t),this.activity.isTodoWrite(e.name??"")?this.activity.emitTodoActivity(t,e.input??{}):this.activity.emitActivity(t,this.activity.toolActivityIcon(e.name??""),this.activity.toolActivityMsg(e.name??"",e.input)),i.enqueuePhase([{type:"npc_phase",npcId:t,phase:"working"}]);return;case"tool_result":this.activity.emitActivityStatus(t,E(e.name??"",e.output??"")),i.enqueuePhase([{type:"npc_phase",npcId:t,phase:"thinking"}]);return;case"text_delta":{const o=e.delta??"";if(!o)return;i.enqueueDialog([{type:"dialog_message",npcId:t,text:o,isStreaming:!0},{type:"npc_look_at",npcId:t,targetNpcId:"user"}],o.length);return}case"text":{const o=e.content??"";if(!o)return;o&&this.activity.emitActivity(t,"message-circle",o,!0),i.enqueueDialog([{type:"dialog_message",npcId:t,text:o,isStreaming:!1},{type:"npc_look_at",npcId:t,targetNpcId:"user"}],o.length);return}case"media_output":{if(e.role!=="assistant"||e.source==="tts")return;const a={image:"image",video:"video",audio:"audio",file:"file"}[e.kind]??"file";this.emit([{type:"deliverable_card",cardType:a,name:((n=e.meta)==null?void 0:n.filename)||(typeof((s=e.meta)==null?void 0:s.originalPath)=="string"?e.meta.originalPath.split("/").pop():void 0)||((r=e.path)==null?void 0:r.split("/").pop()),filePath:e.path,mimeType:e.mimeType,thumbnailData:e.kind==="image"?e.data:void 0}]);return}case"turn_end":this.activity.flushThinking(t),i.flush(),this.emit([{type:"npc_phase",npcId:t,phase:"idle"}]);return;case"error":this.emit([{type:"npc_phase",npcId:t,phase:"error"}]);return}}handleStewardText(t){const e=this.getQueue(this.stewardName);if(t.type==="text_delta"){const i=t.delta??"";this.logBubbleIngress(`steward:text_delta:${this.stewardName}`,i),e.enqueueDialog([{type:"dialog_message",npcId:this.stewardName,text:i,isStreaming:!0},{type:"npc_look_at",npcId:this.stewardName,targetNpcId:"user"}],i.length)}else if(t.type==="text"){const i=t.content??"";this.logBubbleIngress(`steward:text:${this.stewardName}`,i),i&&this.activity.emitActivity(this.stewardName,"message-circle",i,!0),e.enqueueDialog([{type:"dialog_message",npcId:this.stewardName,text:i,isStreaming:!1},{type:"npc_look_at",npcId:this.stewardName,targetNpcId:"user"}],i.length)}}handleSubAgent(t){var n,s,r;const{subtype:e,agentId:i}=t;if(e==="started"){const o=t.displayName??i.replace(/^agent_/,"");let a=o.replace(/^agent_/,"").replace(/_/g," ").replace(/\b\w/g,y=>y.toUpperCase());const p=i.replace(/^agent_/,""),u=t.task??"",m=t,f=m.avatarId??((n=m.metadata)==null?void 0:n.avatarId)??void 0;let l=this.citizens.findCitizenNpcId(a)??this.citizens.findCitizenNpcId(o);l||(l=this.citizens.fuzzyMatchCitizen(a)??this.citizens.fuzzyMatchCitizen(o)),!l&&this.citizens.looksLikeIdFragment(a)&&(a=`临时工 ${this.agents.size+1}`);const d=new Set(["steward","user"]);let g=l??p;d.has(g)&&(g=`temp_${i.replace(/^agent_/,"").slice(0,8)}_${Date.now().toString(36)}`),!l&&(this.tempWorkerNpcIds.add(g),(!a||this.citizens.looksLikeIdFragment(o))&&(a=`临时工 ${this.tempWorkerNpcIds.size}`)),this.tracker.registerMapping(i,g);const w={agentId:i,npcId:g,displayName:a,task:u,status:"pending",avatarId:f};if(this.agents.set(i,w),this.agentOrder.push(i),this.phase==="idle"){this.phase="summoning",this.emit([{type:"npc_phase",npcId:this.stewardName,phase:"idle"},{type:"npc_emoji",npcId:this.stewardName,emoji:null},{type:"mode_change",mode:"work",workSubState:"summoning"},{type:"dialog_message",npcId:this.stewardName,text:"好,我来召唤团队!",isStreaming:!1}]);const y=5,b=350;for(let _=0;_<y;_++)this.scheduleDelayedEmit(800+_*b,[{type:"fx",effect:"summon_ripple",params:{npcId:this.stewardName}}])}if(this.emitArrival(w,this.phase==="working"?ft:void 0),this.phase==="working"){this.assignLateArrival(w);const y=[...this.agents.values()].filter(_=>_.status==="completed"||_.status==="failed").length,b=this.agents.size;this.emit([{type:"progress",current:y,total:b,label:`${y}/${b} 完成`}]);return}if(this.phase==="going_to_office"||this.phase==="assigning"||this.workflowSummonEmitted)return;this.summonTimer&&clearTimeout(this.summonTimer),this.summonTimer=setTimeout(()=>{this.summonTimer=null,this.phase==="summoning"&&this.emitWorkflowSummon()},_t);return}if(e==="progress"){const o=this.agents.get(i);if(!o)return;const a=o.npcId,p=t.event;if(!p)return;const u=this.getQueue(a),m=this.phase==="working"||this.phase==="going_to_office",f=this.phase==="working";switch(p.type){case"thinking_delta":m&&(this.activity.appendThinkingDelta(a,p.delta??""),u.enqueuePhase([{type:"npc_phase",npcId:a,phase:"thinking"},{type:"npc_emoji",npcId:a,emoji:"💭"}]));break;case"tool_use":{this.activity.flushThinking(a);const l=p.name==="__thinking__"||p.name==="__thinking_placeholder__";if(this.activity.isTodoWrite(p.name)?this.activity.emitTodoActivity(a,p.input??{}):this.activity.emitActivity(a,this.activity.toolActivityIcon(p.name),this.activity.toolActivityMsg(p.name,p.input??{}),l),!l&&f){const d=S(p.name);u.enqueuePhase([{type:"npc_phase",npcId:a,phase:"working"},{type:"npc_emoji",npcId:a,emoji:d}])}break}case"tool_result":{p.name==="__thinking__"||this.activity.emitActivityStatus(a,E(p.name??"",p.output??"")),m&&u.enqueuePhase([{type:"npc_emoji",npcId:a,emoji:null}]);break}case"text_delta":{const l=p.delta??"";this.logBubbleIngress(`subagent:text_delta:${a}`,l),m&&u.enqueueDialog([{type:"dialog_message",npcId:a,text:l,isStreaming:!0}],l.length);break}case"text":{const l=p.content??"";this.logBubbleIngress(`subagent:text:${a}`,l),l&&this.activity.emitActivity(a,"message-circle",l,!0),m&&u.enqueueDialog([{type:"dialog_message",npcId:a,text:l,isStreaming:!1}],l.length);break}case"turn_end":this.activity.flushThinking(a),u.flush(),this.emit([{type:"npc_phase",npcId:a,phase:"idle"},{type:"npc_emoji",npcId:a,emoji:null}]);break;case"error":{this.activity.flushThinking(a),this.activity.emitActivity(a,"alert-circle","出错"),u.flush();const l=(s=this.tracker.getAllNpcStates().find(d=>d.npcId===a))==null?void 0:s.stationId;this.emit([{type:"npc_phase",npcId:a,phase:"error"},{type:"npc_emoji",npcId:a,emoji:"❌"},{type:"npc_emote",npcId:a,emote:"frustrated"},...l?[{type:"workstation_screen",stationId:l,state:{mode:"error"}}]:[]]);break}}return}if(e==="done"){const o=this.agents.get(i);if(!o)return;const a=o.npcId,p=t.status==="failed";o.status=p?"failed":"completed";const u=(r=this.tracker.getAllNpcStates().find(d=>d.npcId===a))==null?void 0:r.stationId,m=this.tempWorkerNpcIds.has(a);this.emit([{type:"npc_work_done",npcId:a,status:p?"failed":"completed",stationId:u,isTempWorker:m}]),m&&this.tempWorkerNpcIds.delete(a);const f=[...this.agents.values()].filter(d=>d.status==="completed"||d.status==="failed").length,l=this.agents.size;this.emit([{type:"progress",current:f,total:l,label:`${f}/${l} 完成`}]),this.allAgentsDone()&&console.log("[DirectorBridge] all agents done — waiting for steward to call project_complete");return}}emitArrival(t,e){var s,r;let i;if(typeof t.avatarId=="string"&&t.avatarId.trim())i=t.avatarId.trim();else if(this.tempWorkerNpcIds.has(t.npcId))i=O(this.npcCharacterAssignments);else{const o=(r=(s=this.townConfig)==null?void 0:s.citizens)==null?void 0:r.find(a=>a.id===t.npcId);i=(o==null?void 0:o.avatarId)??z(t.npcId)}this.npcCharacterAssignments.set(t.npcId,i);const n=e?{x:e.x,y:0,z:e.z}:void 0;this.emit([{type:"npc_spawn",npcId:t.npcId,name:t.displayName,role:"programming",category:"citizen",task:t.task,avatarId:i,spawn:n,arrivalFanfare:!0}])}emitWorkflowSummon(){if(this.workflowSummonEmitted)return;this.workflowSummonEmitted=!0;const t=this.agentOrder.map(e=>this.agents.get(e)).filter(Boolean);this.emit([{type:"workflow_summon",agents:t.map(e=>({npcId:e.npcId,displayName:e.displayName,task:e.task}))}])}assignLateArrival(t){t.status="working",this.emit([{type:"workstation_assign",npcId:t.npcId,stationId:""}])}allAgentsDone(){if(this.agents.size===0)return!1;for(const t of this.agents.values())if(t.status!=="completed"&&t.status!=="failed")return!1;return!0}handleProjectComplete(t){const e=String((t==null?void 0:t.output)??"");if(/^error:/i.test(e.trim())){console.warn("[DirectorBridge] project_complete rejected by tool:",e);return}const i=this.lastToolInput??{},n=String(i.type??"operation"),s=String(i.summary??""),r=i.url?String(i.url):void 0,o=i.name?String(i.name):this.pendingProjectName||"",a=Array.isArray(i.files)?i.files.map(d=>String(d??"").trim()).filter(Boolean):[];let p=M[n]??null;!p&&this.pendingProjectType&&(p=M[this.pendingProjectType]??null);const u=Array.isArray(i._enrichedFiles)?i._enrichedFiles:[],m=[];if(p&&a.length>0){const d=a[0],g=u.find(w=>w.path===d),T=(g==null?void 0:g.httpUrl)||r||d;m.push({type:"deliverable_card",cardType:p,name:o||void 0,url:T})}else if(p&&r)m.push({type:"deliverable_card",cardType:p,name:o||void 0,url:r});else if(n==="files"||n==="media")for(const d of a){const g=u.find(T=>T.path===d);g&&(g.data||g.httpUrl)?m.push({type:"deliverable_card",cardType:g.mediaType,name:g.fileName,url:g.httpUrl,filePath:d,mimeType:g.mimeType,data:g.data,thumbnailData:g.thumbnailData,httpUrl:g.httpUrl}):m.push({type:"deliverable_card",cardType:q(d),name:d.split("/").pop()??d,filePath:d})}if(console.log("[DirectorBridge] project_complete:",n,"pendingType:",this.pendingProjectType,"name:",o,"cards:",m.length,"phase:",this.phase),this.phase==="publishing"||this.phase==="returning"){m.length>0&&this.emit(m);return}const f=this.phase==="working";this.phase="publishing",f&&this.emit([{type:"mode_change",mode:"work",workSubState:"publishing"}]);const l=this.agentOrder.map(d=>this.agents.get(d)).filter(Boolean);this.emit([{type:"workflow_publish",summary:s||"任务完成了!",deliverableCards:m,agents:l.map(d=>({npcId:d.npcId,displayName:d.displayName,status:d.status}))}])}handleDeliverOutput(){const t=this.lastToolInput??{},e=String(t.type??"operation"),i=t.url?String(t.url):void 0,n=t.name?String(t.name):"",s=Array.isArray(t.files)?t.files.map(a=>String(a??"").trim()).filter(Boolean):[];let r=M[e]??null;!r&&this.pendingProjectType&&(r=M[this.pendingProjectType]??null);const o=[];if(r&&i)o.push({type:"deliverable_card",cardType:r,name:n||void 0,url:i});else if(e==="files"||e==="media")for(const a of s)o.push({type:"deliverable_card",cardType:q(a),name:a.split("/").pop()??a,filePath:a});console.log("[DirectorBridge] deliver_output: cards:",o.length),o.length>0&&this.emit(o)}emit(t){for(const e of t)if(e.type==="npc_spawn"){const i=e.npcId;i&&this.npcCharacterAssignments.set(i,z(i,typeof e.avatarId=="string"?e.avatarId:void 0))}else e.type==="steward_rename"&&typeof e.characterKey=="string"?this.npcCharacterAssignments.set("steward",e.characterKey):e.type==="npc_despawn"&&this.npcCharacterAssignments.delete(e.npcId);t.length>0&&(this.emitFn?this.emitFn(t):this.emitBuffer.push(t))}scheduleDelayedEmit(t,e){setTimeout(()=>this.emit(e),t)}delayMs(t){return new Promise(e=>setTimeout(e,t))}getActivityReplayEvents(){return this.activity.getActivityReplayEvents()}}const wt={daily_plan:200,tactical_decision:80,daily_reflection:60,encounter_init:80,encounter_reply:80,dialogue_summary:60,town_journal:300,task_assign:100,work_thought:60,supervision_comment:80},yt=[`
|
|
4
|
+
|
|
5
|
+
`],St={encounter_init:["嗨,好久不见!","哟,你也在这啊","今天天气不错呢","嘿!在干嘛呢?"],encounter_reply:["是呀!","哈哈对","嗯嗯","说得也是","确实如此"],dialogue_summary:["闲聊了几句"],daily_reflection:["今天过得还不错","充实的一天","平淡但安心"],daily_plan:[],tactical_decision:[]};function F(c){const t=St[c];return!t||t.length===0?"":t[Math.floor(Math.random()*t.length)]}const kt={model:"qwen-turbo",temperature:.85,timeoutMs:8e3};let R=null,C={...kt},I=0,$=0,L=0,N=0,v=0;function Pt(c){R=c}function At(c){C={...C,...c}}function Dt(){return{totalCalls:I,totalTokensIn:$,totalTokensOut:L,totalLatencyMs:N,fallbackCount:v,avgLatencyMs:I>0?Math.round(N/I):0}}function Et(){I=0,$=0,L=0,N=0,v=0}async function Ft(c){if(I++,!R)return v++,{text:F(c.scene),latencyMs:0,fallback:!0};const t=c.maxTokens??wt[c.scene],e=c.temperature??C.temperature,i=[...yt,...c.extraStop??[]],n=performance.now();try{const s=await Promise.race([R({model:C.model,system:c.system,user:c.user,maxTokens:t,temperature:e,stop:i}),new Promise((a,p)=>setTimeout(()=>p(new Error("implicit_chat_timeout")),C.timeoutMs))]),r=Math.round(performance.now()-n);N+=r;const o=(s.text??"").trim();return o?(s.usage&&($+=s.usage.input,L+=s.usage.output),{text:o,latencyMs:r,tokenUsage:s.usage,fallback:!1}):(v++,{text:F(c.scene),latencyMs:r,fallback:!0})}catch(s){const r=Math.round(performance.now()-n);N+=r,v++;const o=s instanceof Error&&s.message==="implicit_chat_timeout"?"[timeout]":"[error]";return console.warn(`implicitChat ${o} scene=${c.scene} ${r}ms`,s),{text:F(c.scene),latencyMs:r,fallback:!0}}}export{mt as ActivityStream,M as CARD_TYPES,gt as CitizenManager,Mt as DirectorBridge,X as EventTranslator,tt as NpcEventQueue,xt as ReconnectManager,at as RouteManager,Z as StateTracker,ht as extractFilePath,Dt as getImplicitChatStats,Ft as implicitChat,q as inferDeliverableCardType,lt as isPersonaPath,Et as resetImplicitChatStats,At as setImplicitChatConfig,Pt as setImplicitChatFn,S as toolEmoji,ut as toolToVfxEvents};
|
|
6
|
+
//# sourceMappingURL=index-faS20RJk.js.map
|
|
Binary file
|
|
Binary file
|