@mecha.im/cli 0.3.4
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/Dockerfile +103 -0
- package/README.md +173 -0
- package/agent/activity.ts +31 -0
- package/agent/costs.ts +93 -0
- package/agent/dashboard/dist/assets/addon-fit-YJmn1quW.js +12 -0
- package/agent/dashboard/dist/assets/addon-web-links-BWjmmSgS.js +12 -0
- package/agent/dashboard/dist/assets/index-B4OKDQ7e.css +32 -0
- package/agent/dashboard/dist/assets/index-fZ_N6Wsi.js +193 -0
- package/agent/dashboard/dist/assets/xterm-BqvuqXEL.js +27 -0
- package/agent/dashboard/dist/index.html +19 -0
- package/agent/dashboard/dist/pixel-engine/characters/char_0.png +0 -0
- package/agent/dashboard/dist/pixel-engine/characters/char_1.png +0 -0
- package/agent/dashboard/dist/pixel-engine/characters/char_2.png +0 -0
- package/agent/dashboard/dist/pixel-engine/characters/char_3.png +0 -0
- package/agent/dashboard/dist/pixel-engine/characters/char_4.png +0 -0
- package/agent/dashboard/dist/pixel-engine/characters/char_5.png +0 -0
- package/agent/dashboard/dist/pixel-engine/default-layout.json +4320 -0
- package/agent/dashboard/dist/pixel-engine/floors/floor_0.png +0 -0
- package/agent/dashboard/dist/pixel-engine/floors/floor_1.png +0 -0
- package/agent/dashboard/dist/pixel-engine/floors/floor_2.png +0 -0
- package/agent/dashboard/dist/pixel-engine/floors/floor_3.png +0 -0
- package/agent/dashboard/dist/pixel-engine/floors/floor_4.png +0 -0
- package/agent/dashboard/dist/pixel-engine/floors/floor_5.png +0 -0
- package/agent/dashboard/dist/pixel-engine/floors/floor_6.png +0 -0
- package/agent/dashboard/dist/pixel-engine/floors/floor_7.png +0 -0
- package/agent/dashboard/dist/pixel-engine/floors/floor_8.png +0 -0
- package/agent/dashboard/dist/pixel-engine/fonts/FSPixelSansUnicode-Regular.ttf +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/BIN/BIN.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/BIN/manifest.json +13 -0
- package/agent/dashboard/dist/pixel-engine/furniture/BLACKBOARD/BLACKBOARD.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/BLACKBOARD/manifest.json +16 -0
- package/agent/dashboard/dist/pixel-engine/furniture/BOOKSHELF/BOOKSHELF.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/BOOKSHELF/manifest.json +16 -0
- package/agent/dashboard/dist/pixel-engine/furniture/CACTUS/CACTUS.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/CACTUS/manifest.json +13 -0
- package/agent/dashboard/dist/pixel-engine/furniture/CLOCK/CLOCK.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/CLOCK/manifest.json +13 -0
- package/agent/dashboard/dist/pixel-engine/furniture/COFFEE/COFFEE.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/COFFEE/manifest.json +13 -0
- package/agent/dashboard/dist/pixel-engine/furniture/COFFEE_TABLE/COFFEE_TABLE.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/COFFEE_TABLE/manifest.json +13 -0
- package/agent/dashboard/dist/pixel-engine/furniture/CUSHIONED_BENCH/CUSHIONED_BENCH.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/CUSHIONED_BENCH/manifest.json +13 -0
- package/agent/dashboard/dist/pixel-engine/furniture/CUSHIONED_CHAIR/CUSHIONED_CHAIR_BACK.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/CUSHIONED_CHAIR/CUSHIONED_CHAIR_FRONT.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/CUSHIONED_CHAIR/CUSHIONED_CHAIR_SIDE.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/CUSHIONED_CHAIR/manifest.json +44 -0
- package/agent/dashboard/dist/pixel-engine/furniture/DESK/DESK_FRONT.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/DESK/DESK_SIDE.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/DESK/manifest.json +33 -0
- package/agent/dashboard/dist/pixel-engine/furniture/DOUBLE_BOOKSHELF/DOUBLE_BOOKSHELF.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/DOUBLE_BOOKSHELF/manifest.json +16 -0
- package/agent/dashboard/dist/pixel-engine/furniture/FILE_BOXES_1/FILE_BOXES_1.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/FILE_BOXES_1/manifest.json +13 -0
- package/agent/dashboard/dist/pixel-engine/furniture/FILE_BOXES_2/FILE_BOXES_2.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/FILE_BOXES_2/manifest.json +13 -0
- package/agent/dashboard/dist/pixel-engine/furniture/HANGING_PLANT/HANGING_PLANT.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/HANGING_PLANT/manifest.json +13 -0
- package/agent/dashboard/dist/pixel-engine/furniture/LARGE_PAINTING/LARGE_PAINTING.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/LARGE_PAINTING/manifest.json +13 -0
- package/agent/dashboard/dist/pixel-engine/furniture/LARGE_PLANT/LARGE_PLANT.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/LARGE_PLANT/manifest.json +13 -0
- package/agent/dashboard/dist/pixel-engine/furniture/PC/PC_BACK.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/PC/PC_FRONT_OFF.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/PC/PC_FRONT_ON_1.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/PC/PC_FRONT_ON_2.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/PC/PC_FRONT_ON_3.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/PC/PC_SIDE.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/PC/manifest.json +88 -0
- package/agent/dashboard/dist/pixel-engine/furniture/PLANT/PLANT.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/PLANT/manifest.json +13 -0
- package/agent/dashboard/dist/pixel-engine/furniture/PLANT_2/PLANT_2.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/PLANT_2/manifest.json +13 -0
- package/agent/dashboard/dist/pixel-engine/furniture/POT/POT.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/POT/manifest.json +13 -0
- package/agent/dashboard/dist/pixel-engine/furniture/SMALL_PAINTING/SMALL_PAINTING.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/SMALL_PAINTING/manifest.json +13 -0
- package/agent/dashboard/dist/pixel-engine/furniture/SMALL_PAINTING_2/SMALL_PAINTING_2.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/SMALL_PAINTING_2/manifest.json +13 -0
- package/agent/dashboard/dist/pixel-engine/furniture/SMALL_TABLE/SMALL_TABLE_FRONT.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/SMALL_TABLE/SMALL_TABLE_SIDE.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/SMALL_TABLE/manifest.json +33 -0
- package/agent/dashboard/dist/pixel-engine/furniture/SOFA/SOFA_BACK.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/SOFA/SOFA_FRONT.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/SOFA/SOFA_SIDE.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/SOFA/manifest.json +44 -0
- package/agent/dashboard/dist/pixel-engine/furniture/TABLE_FRONT/TABLE_FRONT.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/TABLE_FRONT/manifest.json +13 -0
- package/agent/dashboard/dist/pixel-engine/furniture/VENDER_MACHINE/VENDER_MACHINE.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/VENDER_MACHINE/manifest.json +16 -0
- package/agent/dashboard/dist/pixel-engine/furniture/WATER_MACHINE/WATER_MACHINE.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/WATER_MACHINE/manifest.json +16 -0
- package/agent/dashboard/dist/pixel-engine/furniture/WHITEBOARD/WHITEBOARD.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/WHITEBOARD/manifest.json +16 -0
- package/agent/dashboard/dist/pixel-engine/furniture/WOODEN_BENCH/WOODEN_BENCH.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/WOODEN_BENCH/manifest.json +13 -0
- package/agent/dashboard/dist/pixel-engine/furniture/WOODEN_CHAIR/WOODEN_CHAIR_BACK.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/WOODEN_CHAIR/WOODEN_CHAIR_FRONT.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/WOODEN_CHAIR/WOODEN_CHAIR_SIDE.png +0 -0
- package/agent/dashboard/dist/pixel-engine/furniture/WOODEN_CHAIR/manifest.json +44 -0
- package/agent/dashboard/dist/pixel-engine/furniture/index.json +32 -0
- package/agent/dashboard/dist/pixel-engine/walls/wall_0.png +0 -0
- package/agent/dashboard/index.html +18 -0
- package/agent/dashboard/package.json +41 -0
- package/agent/dashboard/public/pixel-engine/CREDITS.md +17 -0
- package/agent/dashboard/public/pixel-engine/characters/char_0.png +0 -0
- package/agent/dashboard/public/pixel-engine/characters/char_1.png +0 -0
- package/agent/dashboard/public/pixel-engine/characters/char_2.png +0 -0
- package/agent/dashboard/public/pixel-engine/characters/char_3.png +0 -0
- package/agent/dashboard/public/pixel-engine/characters/char_4.png +0 -0
- package/agent/dashboard/public/pixel-engine/characters/char_5.png +0 -0
- package/agent/dashboard/public/pixel-engine/default-layout.json +4320 -0
- package/agent/dashboard/public/pixel-engine/floors/floor_0.png +0 -0
- package/agent/dashboard/public/pixel-engine/floors/floor_1.png +0 -0
- package/agent/dashboard/public/pixel-engine/floors/floor_2.png +0 -0
- package/agent/dashboard/public/pixel-engine/floors/floor_3.png +0 -0
- package/agent/dashboard/public/pixel-engine/floors/floor_4.png +0 -0
- package/agent/dashboard/public/pixel-engine/floors/floor_5.png +0 -0
- package/agent/dashboard/public/pixel-engine/floors/floor_6.png +0 -0
- package/agent/dashboard/public/pixel-engine/floors/floor_7.png +0 -0
- package/agent/dashboard/public/pixel-engine/floors/floor_8.png +0 -0
- package/agent/dashboard/public/pixel-engine/fonts/FSPixelSansUnicode-Regular.ttf +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/BIN/BIN.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/BIN/manifest.json +13 -0
- package/agent/dashboard/public/pixel-engine/furniture/BLACKBOARD/BLACKBOARD.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/BLACKBOARD/manifest.json +16 -0
- package/agent/dashboard/public/pixel-engine/furniture/BOOKSHELF/BOOKSHELF.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/BOOKSHELF/manifest.json +16 -0
- package/agent/dashboard/public/pixel-engine/furniture/CACTUS/CACTUS.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/CACTUS/manifest.json +13 -0
- package/agent/dashboard/public/pixel-engine/furniture/CLOCK/CLOCK.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/CLOCK/manifest.json +13 -0
- package/agent/dashboard/public/pixel-engine/furniture/COFFEE/COFFEE.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/COFFEE/manifest.json +13 -0
- package/agent/dashboard/public/pixel-engine/furniture/COFFEE_TABLE/COFFEE_TABLE.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/COFFEE_TABLE/manifest.json +13 -0
- package/agent/dashboard/public/pixel-engine/furniture/CUSHIONED_BENCH/CUSHIONED_BENCH.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/CUSHIONED_BENCH/manifest.json +13 -0
- package/agent/dashboard/public/pixel-engine/furniture/CUSHIONED_CHAIR/CUSHIONED_CHAIR_BACK.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/CUSHIONED_CHAIR/CUSHIONED_CHAIR_FRONT.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/CUSHIONED_CHAIR/CUSHIONED_CHAIR_SIDE.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/CUSHIONED_CHAIR/manifest.json +44 -0
- package/agent/dashboard/public/pixel-engine/furniture/DESK/DESK_FRONT.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/DESK/DESK_SIDE.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/DESK/manifest.json +33 -0
- package/agent/dashboard/public/pixel-engine/furniture/DOUBLE_BOOKSHELF/DOUBLE_BOOKSHELF.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/DOUBLE_BOOKSHELF/manifest.json +16 -0
- package/agent/dashboard/public/pixel-engine/furniture/FILE_BOXES_1/FILE_BOXES_1.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/FILE_BOXES_1/manifest.json +13 -0
- package/agent/dashboard/public/pixel-engine/furniture/FILE_BOXES_2/FILE_BOXES_2.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/FILE_BOXES_2/manifest.json +13 -0
- package/agent/dashboard/public/pixel-engine/furniture/HANGING_PLANT/HANGING_PLANT.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/HANGING_PLANT/manifest.json +13 -0
- package/agent/dashboard/public/pixel-engine/furniture/LARGE_PAINTING/LARGE_PAINTING.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/LARGE_PAINTING/manifest.json +13 -0
- package/agent/dashboard/public/pixel-engine/furniture/LARGE_PLANT/LARGE_PLANT.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/LARGE_PLANT/manifest.json +13 -0
- package/agent/dashboard/public/pixel-engine/furniture/PC/PC_BACK.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/PC/PC_FRONT_OFF.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/PC/PC_FRONT_ON_1.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/PC/PC_FRONT_ON_2.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/PC/PC_FRONT_ON_3.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/PC/PC_SIDE.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/PC/manifest.json +88 -0
- package/agent/dashboard/public/pixel-engine/furniture/PLANT/PLANT.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/PLANT/manifest.json +13 -0
- package/agent/dashboard/public/pixel-engine/furniture/PLANT_2/PLANT_2.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/PLANT_2/manifest.json +13 -0
- package/agent/dashboard/public/pixel-engine/furniture/POT/POT.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/POT/manifest.json +13 -0
- package/agent/dashboard/public/pixel-engine/furniture/SMALL_PAINTING/SMALL_PAINTING.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/SMALL_PAINTING/manifest.json +13 -0
- package/agent/dashboard/public/pixel-engine/furniture/SMALL_PAINTING_2/SMALL_PAINTING_2.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/SMALL_PAINTING_2/manifest.json +13 -0
- package/agent/dashboard/public/pixel-engine/furniture/SMALL_TABLE/SMALL_TABLE_FRONT.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/SMALL_TABLE/SMALL_TABLE_SIDE.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/SMALL_TABLE/manifest.json +33 -0
- package/agent/dashboard/public/pixel-engine/furniture/SOFA/SOFA_BACK.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/SOFA/SOFA_FRONT.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/SOFA/SOFA_SIDE.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/SOFA/manifest.json +44 -0
- package/agent/dashboard/public/pixel-engine/furniture/TABLE_FRONT/TABLE_FRONT.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/TABLE_FRONT/manifest.json +13 -0
- package/agent/dashboard/public/pixel-engine/furniture/VENDER_MACHINE/VENDER_MACHINE.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/VENDER_MACHINE/manifest.json +16 -0
- package/agent/dashboard/public/pixel-engine/furniture/WATER_MACHINE/WATER_MACHINE.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/WATER_MACHINE/manifest.json +16 -0
- package/agent/dashboard/public/pixel-engine/furniture/WHITEBOARD/WHITEBOARD.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/WHITEBOARD/manifest.json +16 -0
- package/agent/dashboard/public/pixel-engine/furniture/WOODEN_BENCH/WOODEN_BENCH.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/WOODEN_BENCH/manifest.json +13 -0
- package/agent/dashboard/public/pixel-engine/furniture/WOODEN_CHAIR/WOODEN_CHAIR_BACK.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/WOODEN_CHAIR/WOODEN_CHAIR_FRONT.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/WOODEN_CHAIR/WOODEN_CHAIR_SIDE.png +0 -0
- package/agent/dashboard/public/pixel-engine/furniture/WOODEN_CHAIR/manifest.json +44 -0
- package/agent/dashboard/public/pixel-engine/furniture/index.json +32 -0
- package/agent/dashboard/public/pixel-engine/walls/wall_0.png +0 -0
- package/agent/dashboard/src/app.tsx +223 -0
- package/agent/dashboard/src/components/alert.tsx +24 -0
- package/agent/dashboard/src/components/badge.tsx +41 -0
- package/agent/dashboard/src/components/button.tsx +44 -0
- package/agent/dashboard/src/components/card.tsx +21 -0
- package/agent/dashboard/src/components/dialog.tsx +28 -0
- package/agent/dashboard/src/components/index.ts +7 -0
- package/agent/dashboard/src/components/input.tsx +45 -0
- package/agent/dashboard/src/components/status-dot.tsx +31 -0
- package/agent/dashboard/src/index.css +126 -0
- package/agent/dashboard/src/lib/api.test.ts +41 -0
- package/agent/dashboard/src/lib/api.ts +53 -0
- package/agent/dashboard/src/lib/fleet-context.tsx +92 -0
- package/agent/dashboard/src/lib/format.test.ts +119 -0
- package/agent/dashboard/src/lib/format.ts +41 -0
- package/agent/dashboard/src/lib/login-gate.tsx +117 -0
- package/agent/dashboard/src/lib/sanitize.test.ts +86 -0
- package/agent/dashboard/src/lib/sanitize.ts +13 -0
- package/agent/dashboard/src/lib/snippet.test.ts +50 -0
- package/agent/dashboard/src/lib/snippet.ts +15 -0
- package/agent/dashboard/src/lib/ws-parse.test.ts +72 -0
- package/agent/dashboard/src/lib/ws-parse.ts +46 -0
- package/agent/dashboard/src/main.tsx +25 -0
- package/agent/dashboard/src/pixel-engine/colorize.ts +230 -0
- package/agent/dashboard/src/pixel-engine/components/BottomToolbar.tsx +83 -0
- package/agent/dashboard/src/pixel-engine/components/DebugView.tsx +175 -0
- package/agent/dashboard/src/pixel-engine/components/OfficeCanvas.tsx +838 -0
- package/agent/dashboard/src/pixel-engine/components/PixelOffice.tsx +646 -0
- package/agent/dashboard/src/pixel-engine/components/SettingsModal.tsx +213 -0
- package/agent/dashboard/src/pixel-engine/components/ToolOverlay.tsx +203 -0
- package/agent/dashboard/src/pixel-engine/components/ZoomControls.tsx +177 -0
- package/agent/dashboard/src/pixel-engine/constants.ts +132 -0
- package/agent/dashboard/src/pixel-engine/editor/EditorToolbar.tsx +737 -0
- package/agent/dashboard/src/pixel-engine/editor/editorActions.ts +291 -0
- package/agent/dashboard/src/pixel-engine/editor/editorState.ts +123 -0
- package/agent/dashboard/src/pixel-engine/engine/characters.ts +595 -0
- package/agent/dashboard/src/pixel-engine/engine/gameLoop.ts +50 -0
- package/agent/dashboard/src/pixel-engine/engine/interactionScheduler.ts +442 -0
- package/agent/dashboard/src/pixel-engine/engine/matrixEffect.ts +139 -0
- package/agent/dashboard/src/pixel-engine/engine/officeState.ts +748 -0
- package/agent/dashboard/src/pixel-engine/engine/renderer.ts +693 -0
- package/agent/dashboard/src/pixel-engine/floorTiles.ts +74 -0
- package/agent/dashboard/src/pixel-engine/hooks/useAssetLoader.ts +488 -0
- package/agent/dashboard/src/pixel-engine/hooks/useEditorActions.ts +661 -0
- package/agent/dashboard/src/pixel-engine/hooks/useEditorKeyboard.ts +83 -0
- package/agent/dashboard/src/pixel-engine/hooks/useLayoutPersistence.ts +162 -0
- package/agent/dashboard/src/pixel-engine/hooks/useOfficeStream.ts +353 -0
- package/agent/dashboard/src/pixel-engine/layout/furnitureCatalog.ts +417 -0
- package/agent/dashboard/src/pixel-engine/layout/layoutSerializer.ts +416 -0
- package/agent/dashboard/src/pixel-engine/layout/tileMap.ts +109 -0
- package/agent/dashboard/src/pixel-engine/notificationSound.ts +69 -0
- package/agent/dashboard/src/pixel-engine/pixel-office.css +55 -0
- package/agent/dashboard/src/pixel-engine/sprites/bubble-permission.json +27 -0
- package/agent/dashboard/src/pixel-engine/sprites/bubble-waiting.json +27 -0
- package/agent/dashboard/src/pixel-engine/sprites/spriteCache.ts +82 -0
- package/agent/dashboard/src/pixel-engine/sprites/spriteData.ts +176 -0
- package/agent/dashboard/src/pixel-engine/toolUtils.ts +28 -0
- package/agent/dashboard/src/pixel-engine/types.ts +232 -0
- package/agent/dashboard/src/pixel-engine/wallTiles.ts +203 -0
- package/agent/dashboard/src/views/auth.tsx +249 -0
- package/agent/dashboard/src/views/fleet.tsx +263 -0
- package/agent/dashboard/src/views/network.tsx +106 -0
- package/agent/dashboard/src/views/schedule-types.ts +12 -0
- package/agent/dashboard/src/views/schedule-utils.ts +49 -0
- package/agent/dashboard/src/views/schedule.tsx +326 -0
- package/agent/dashboard/src/views/sessions/conversation-viewer.tsx +279 -0
- package/agent/dashboard/src/views/sessions/session-detail.tsx +48 -0
- package/agent/dashboard/src/views/sessions/session-list.tsx +265 -0
- package/agent/dashboard/src/views/sessions/terminal-pane.tsx +270 -0
- package/agent/dashboard/src/views/sessions.tsx +55 -0
- package/agent/dashboard/src/views/settings-config.tsx +265 -0
- package/agent/dashboard/src/views/settings-logs.tsx +99 -0
- package/agent/dashboard/src/views/settings-status.tsx +215 -0
- package/agent/dashboard/src/views/settings.tsx +324 -0
- package/agent/dashboard/src/views/webhooks.tsx +230 -0
- package/agent/dashboard/src/vite-env.d.ts +3 -0
- package/agent/dashboard/tsconfig.json +13 -0
- package/agent/entry.ts +168 -0
- package/agent/event-log.ts +103 -0
- package/agent/node-pty-adapter.ts +39 -0
- package/agent/paths.ts +12 -0
- package/agent/pty-manager.ts +265 -0
- package/agent/pty-types.ts +25 -0
- package/agent/routes/api.ts +149 -0
- package/agent/routes/config.ts +116 -0
- package/agent/routes/dashboard.ts +101 -0
- package/agent/routes/schedule.ts +84 -0
- package/agent/routes/sessions.ts +43 -0
- package/agent/routes/webhooks.ts +113 -0
- package/agent/scheduler.ts +373 -0
- package/agent/server-schema.ts +25 -0
- package/agent/server-utils.ts +163 -0
- package/agent/server.ts +218 -0
- package/agent/server.types.ts +39 -0
- package/agent/session-history-types.ts +78 -0
- package/agent/session-history-utils.ts +96 -0
- package/agent/session-history.ts +318 -0
- package/agent/session.ts +152 -0
- package/agent/tools/mecha-call.ts +106 -0
- package/agent/tools/mecha-fleet.ts +176 -0
- package/agent/tools/mecha-list.ts +56 -0
- package/agent/tools/mecha-server.ts +70 -0
- package/agent/types.ts +35 -0
- package/agent/webhook.ts +127 -0
- package/agent/ws-terminal.ts +174 -0
- package/dist/agent/activity.d.ts +14 -0
- package/dist/agent/activity.d.ts.map +1 -0
- package/dist/agent/activity.js +25 -0
- package/dist/agent/activity.js.map +1 -0
- package/dist/agent/character-config.test.d.ts +2 -0
- package/dist/agent/character-config.test.d.ts.map +1 -0
- package/dist/agent/character-config.test.js +51 -0
- package/dist/agent/character-config.test.js.map +1 -0
- package/dist/agent/costs.d.ts +16 -0
- package/dist/agent/costs.d.ts.map +1 -0
- package/dist/agent/costs.js +82 -0
- package/dist/agent/costs.js.map +1 -0
- package/dist/agent/dashboard/dist/assets/addon-fit-YJmn1quW.js +12 -0
- package/dist/agent/dashboard/dist/assets/addon-web-links-BWjmmSgS.js +12 -0
- package/dist/agent/dashboard/dist/assets/index-B4OKDQ7e.css +32 -0
- package/dist/agent/dashboard/dist/assets/index-fZ_N6Wsi.js +193 -0
- package/dist/agent/dashboard/dist/assets/xterm-BqvuqXEL.js +27 -0
- package/dist/agent/dashboard/dist/index.html +19 -0
- package/dist/agent/dashboard/dist/pixel-engine/characters/char_0.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/characters/char_1.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/characters/char_2.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/characters/char_3.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/characters/char_4.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/characters/char_5.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/default-layout.json +4320 -0
- package/dist/agent/dashboard/dist/pixel-engine/floors/floor_0.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/floors/floor_1.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/floors/floor_2.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/floors/floor_3.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/floors/floor_4.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/floors/floor_5.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/floors/floor_6.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/floors/floor_7.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/floors/floor_8.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/fonts/FSPixelSansUnicode-Regular.ttf +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/BIN/BIN.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/BIN/manifest.json +13 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/BLACKBOARD/BLACKBOARD.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/BLACKBOARD/manifest.json +16 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/BOOKSHELF/BOOKSHELF.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/BOOKSHELF/manifest.json +16 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/CACTUS/CACTUS.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/CACTUS/manifest.json +13 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/CLOCK/CLOCK.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/CLOCK/manifest.json +13 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/COFFEE/COFFEE.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/COFFEE/manifest.json +13 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/COFFEE_TABLE/COFFEE_TABLE.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/COFFEE_TABLE/manifest.json +13 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/CUSHIONED_BENCH/CUSHIONED_BENCH.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/CUSHIONED_BENCH/manifest.json +13 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/CUSHIONED_CHAIR/CUSHIONED_CHAIR_BACK.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/CUSHIONED_CHAIR/CUSHIONED_CHAIR_FRONT.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/CUSHIONED_CHAIR/CUSHIONED_CHAIR_SIDE.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/CUSHIONED_CHAIR/manifest.json +44 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/DESK/DESK_FRONT.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/DESK/DESK_SIDE.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/DESK/manifest.json +33 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/DOUBLE_BOOKSHELF/DOUBLE_BOOKSHELF.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/DOUBLE_BOOKSHELF/manifest.json +16 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/FILE_BOXES_1/FILE_BOXES_1.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/FILE_BOXES_1/manifest.json +13 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/FILE_BOXES_2/FILE_BOXES_2.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/FILE_BOXES_2/manifest.json +13 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/HANGING_PLANT/HANGING_PLANT.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/HANGING_PLANT/manifest.json +13 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/LARGE_PAINTING/LARGE_PAINTING.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/LARGE_PAINTING/manifest.json +13 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/LARGE_PLANT/LARGE_PLANT.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/LARGE_PLANT/manifest.json +13 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/PC/PC_BACK.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/PC/PC_FRONT_OFF.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/PC/PC_FRONT_ON_1.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/PC/PC_FRONT_ON_2.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/PC/PC_FRONT_ON_3.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/PC/PC_SIDE.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/PC/manifest.json +88 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/PLANT/PLANT.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/PLANT/manifest.json +13 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/PLANT_2/PLANT_2.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/PLANT_2/manifest.json +13 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/POT/POT.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/POT/manifest.json +13 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/SMALL_PAINTING/SMALL_PAINTING.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/SMALL_PAINTING/manifest.json +13 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/SMALL_PAINTING_2/SMALL_PAINTING_2.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/SMALL_PAINTING_2/manifest.json +13 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/SMALL_TABLE/SMALL_TABLE_FRONT.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/SMALL_TABLE/SMALL_TABLE_SIDE.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/SMALL_TABLE/manifest.json +33 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/SOFA/SOFA_BACK.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/SOFA/SOFA_FRONT.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/SOFA/SOFA_SIDE.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/SOFA/manifest.json +44 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/TABLE_FRONT/TABLE_FRONT.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/TABLE_FRONT/manifest.json +13 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/VENDER_MACHINE/VENDER_MACHINE.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/VENDER_MACHINE/manifest.json +16 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/WATER_MACHINE/WATER_MACHINE.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/WATER_MACHINE/manifest.json +16 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/WHITEBOARD/WHITEBOARD.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/WHITEBOARD/manifest.json +16 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/WOODEN_BENCH/WOODEN_BENCH.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/WOODEN_BENCH/manifest.json +13 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/WOODEN_CHAIR/WOODEN_CHAIR_BACK.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/WOODEN_CHAIR/WOODEN_CHAIR_FRONT.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/WOODEN_CHAIR/WOODEN_CHAIR_SIDE.png +0 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/WOODEN_CHAIR/manifest.json +44 -0
- package/dist/agent/dashboard/dist/pixel-engine/furniture/index.json +32 -0
- package/dist/agent/dashboard/dist/pixel-engine/walls/wall_0.png +0 -0
- package/dist/agent/entry.d.ts +2 -0
- package/dist/agent/entry.d.ts.map +1 -0
- package/dist/agent/entry.js +157 -0
- package/dist/agent/entry.js.map +1 -0
- package/dist/agent/event-log.d.ts +11 -0
- package/dist/agent/event-log.d.ts.map +1 -0
- package/dist/agent/event-log.js +102 -0
- package/dist/agent/event-log.js.map +1 -0
- package/dist/agent/node-pty-adapter.d.ts +4 -0
- package/dist/agent/node-pty-adapter.d.ts.map +1 -0
- package/dist/agent/node-pty-adapter.js +35 -0
- package/dist/agent/node-pty-adapter.js.map +1 -0
- package/dist/agent/paths.d.ts +11 -0
- package/dist/agent/paths.d.ts.map +1 -0
- package/dist/agent/paths.js +12 -0
- package/dist/agent/paths.js.map +1 -0
- package/dist/agent/pty-manager.d.ts +34 -0
- package/dist/agent/pty-manager.d.ts.map +1 -0
- package/dist/agent/pty-manager.js +210 -0
- package/dist/agent/pty-manager.js.map +1 -0
- package/dist/agent/pty-types.d.ts +26 -0
- package/dist/agent/pty-types.d.ts.map +1 -0
- package/dist/agent/pty-types.js +2 -0
- package/dist/agent/pty-types.js.map +1 -0
- package/dist/agent/routes/api.d.ts +17 -0
- package/dist/agent/routes/api.d.ts.map +1 -0
- package/dist/agent/routes/api.js +125 -0
- package/dist/agent/routes/api.js.map +1 -0
- package/dist/agent/routes/config.d.ts +6 -0
- package/dist/agent/routes/config.d.ts.map +1 -0
- package/dist/agent/routes/config.js +116 -0
- package/dist/agent/routes/config.js.map +1 -0
- package/dist/agent/routes/dashboard.d.ts +4 -0
- package/dist/agent/routes/dashboard.d.ts.map +1 -0
- package/dist/agent/routes/dashboard.js +97 -0
- package/dist/agent/routes/dashboard.js.map +1 -0
- package/dist/agent/routes/schedule.d.ts +4 -0
- package/dist/agent/routes/schedule.d.ts.map +1 -0
- package/dist/agent/routes/schedule.js +98 -0
- package/dist/agent/routes/schedule.js.map +1 -0
- package/dist/agent/routes/sessions.d.ts +4 -0
- package/dist/agent/routes/sessions.d.ts.map +1 -0
- package/dist/agent/routes/sessions.js +43 -0
- package/dist/agent/routes/sessions.js.map +1 -0
- package/dist/agent/routes/webhooks.d.ts +5 -0
- package/dist/agent/routes/webhooks.d.ts.map +1 -0
- package/dist/agent/routes/webhooks.js +102 -0
- package/dist/agent/routes/webhooks.js.map +1 -0
- package/dist/agent/scheduler.d.ts +50 -0
- package/dist/agent/scheduler.d.ts.map +1 -0
- package/dist/agent/scheduler.js +332 -0
- package/dist/agent/scheduler.js.map +1 -0
- package/dist/agent/server-schema.d.ts +20 -0
- package/dist/agent/server-schema.d.ts.map +1 -0
- package/dist/agent/server-schema.js +20 -0
- package/dist/agent/server-schema.js.map +1 -0
- package/dist/agent/server-utils.d.ts +18 -0
- package/dist/agent/server-utils.d.ts.map +1 -0
- package/dist/agent/server-utils.js +132 -0
- package/dist/agent/server-utils.js.map +1 -0
- package/dist/agent/server.d.ts +17 -0
- package/dist/agent/server.d.ts.map +1 -0
- package/dist/agent/server.js +196 -0
- package/dist/agent/server.js.map +1 -0
- package/dist/agent/server.types.d.ts +38 -0
- package/dist/agent/server.types.d.ts.map +1 -0
- package/dist/agent/server.types.js +2 -0
- package/dist/agent/server.types.js.map +1 -0
- package/dist/agent/session-history-types.d.ts +74 -0
- package/dist/agent/session-history-types.d.ts.map +1 -0
- package/dist/agent/session-history-types.js +2 -0
- package/dist/agent/session-history-types.js.map +1 -0
- package/dist/agent/session-history-utils.d.ts +13 -0
- package/dist/agent/session-history-utils.d.ts.map +1 -0
- package/dist/agent/session-history-utils.js +102 -0
- package/dist/agent/session-history-utils.js.map +1 -0
- package/dist/agent/session-history.d.ts +20 -0
- package/dist/agent/session-history.d.ts.map +1 -0
- package/dist/agent/session-history.js +282 -0
- package/dist/agent/session-history.js.map +1 -0
- package/dist/agent/session.d.ts +51 -0
- package/dist/agent/session.d.ts.map +1 -0
- package/dist/agent/session.js +135 -0
- package/dist/agent/session.js.map +1 -0
- package/dist/agent/tools/mecha-call.d.ts +2 -0
- package/dist/agent/tools/mecha-call.d.ts.map +1 -0
- package/dist/agent/tools/mecha-call.js +101 -0
- package/dist/agent/tools/mecha-call.js.map +1 -0
- package/dist/agent/tools/mecha-fleet.d.ts +25 -0
- package/dist/agent/tools/mecha-fleet.d.ts.map +1 -0
- package/dist/agent/tools/mecha-fleet.js +144 -0
- package/dist/agent/tools/mecha-fleet.js.map +1 -0
- package/dist/agent/tools/mecha-list.d.ts +6 -0
- package/dist/agent/tools/mecha-list.d.ts.map +1 -0
- package/dist/agent/tools/mecha-list.js +46 -0
- package/dist/agent/tools/mecha-list.js.map +1 -0
- package/dist/agent/tools/mecha-server.d.ts +4 -0
- package/dist/agent/tools/mecha-server.d.ts.map +1 -0
- package/dist/agent/tools/mecha-server.js +49 -0
- package/dist/agent/tools/mecha-server.js.map +1 -0
- package/dist/agent/types.d.ts +38 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +32 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/agent/webhook.d.ts +12 -0
- package/dist/agent/webhook.d.ts.map +1 -0
- package/dist/agent/webhook.js +105 -0
- package/dist/agent/webhook.js.map +1 -0
- package/dist/agent/ws-terminal.d.ts +4 -0
- package/dist/agent/ws-terminal.d.ts.map +1 -0
- package/dist/agent/ws-terminal.js +160 -0
- package/dist/agent/ws-terminal.js.map +1 -0
- package/dist/shared/atomic-write.d.ts +5 -0
- package/dist/shared/atomic-write.d.ts.map +1 -0
- package/dist/shared/atomic-write.js +63 -0
- package/dist/shared/atomic-write.js.map +1 -0
- package/dist/shared/errors.d.ts +71 -0
- package/dist/shared/errors.d.ts.map +1 -0
- package/dist/shared/errors.js +52 -0
- package/dist/shared/errors.js.map +1 -0
- package/dist/shared/logger.d.ts +7 -0
- package/dist/shared/logger.d.ts.map +1 -0
- package/dist/shared/logger.js +52 -0
- package/dist/shared/logger.js.map +1 -0
- package/dist/shared/mutex.d.ts +12 -0
- package/dist/shared/mutex.d.ts.map +1 -0
- package/dist/shared/mutex.js +73 -0
- package/dist/shared/mutex.js.map +1 -0
- package/dist/shared/safe-read.d.ts +12 -0
- package/dist/shared/safe-read.d.ts.map +1 -0
- package/dist/shared/safe-read.js +33 -0
- package/dist/shared/safe-read.js.map +1 -0
- package/dist/shared/totp.d.ts +7 -0
- package/dist/shared/totp.d.ts.map +1 -0
- package/dist/shared/totp.js +75 -0
- package/dist/shared/totp.js.map +1 -0
- package/dist/shared/validation.d.ts +7 -0
- package/dist/shared/validation.d.ts.map +1 -0
- package/dist/shared/validation.js +30 -0
- package/dist/shared/validation.js.map +1 -0
- package/dist/src/auth.d.ts +48 -0
- package/dist/src/auth.d.ts.map +1 -0
- package/dist/src/auth.js +160 -0
- package/dist/src/auth.js.map +1 -0
- package/dist/src/cli-output.d.ts +14 -0
- package/dist/src/cli-output.d.ts.map +1 -0
- package/dist/src/cli-output.js +47 -0
- package/dist/src/cli-output.js.map +1 -0
- package/dist/src/cli-utils.d.ts +15 -0
- package/dist/src/cli-utils.d.ts.map +1 -0
- package/dist/src/cli-utils.js +241 -0
- package/dist/src/cli-utils.js.map +1 -0
- package/dist/src/cli.d.ts +3 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +535 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/cli.utils.d.ts +10 -0
- package/dist/src/cli.utils.d.ts.map +1 -0
- package/dist/src/cli.utils.js +127 -0
- package/dist/src/cli.utils.js.map +1 -0
- package/dist/src/commands/auth.d.ts +3 -0
- package/dist/src/commands/auth.d.ts.map +1 -0
- package/dist/src/commands/auth.js +139 -0
- package/dist/src/commands/auth.js.map +1 -0
- package/dist/src/commands/bot-api.d.ts +15 -0
- package/dist/src/commands/bot-api.d.ts.map +1 -0
- package/dist/src/commands/bot-api.js +40 -0
- package/dist/src/commands/bot-api.js.map +1 -0
- package/dist/src/commands/completion.d.ts +3 -0
- package/dist/src/commands/completion.d.ts.map +1 -0
- package/dist/src/commands/completion.js +108 -0
- package/dist/src/commands/completion.js.map +1 -0
- package/dist/src/commands/config.d.ts +3 -0
- package/dist/src/commands/config.d.ts.map +1 -0
- package/dist/src/commands/config.js +110 -0
- package/dist/src/commands/config.js.map +1 -0
- package/dist/src/commands/costs.d.ts +3 -0
- package/dist/src/commands/costs.d.ts.map +1 -0
- package/dist/src/commands/costs.js +88 -0
- package/dist/src/commands/costs.js.map +1 -0
- package/dist/src/commands/daemon.d.ts +3 -0
- package/dist/src/commands/daemon.d.ts.map +1 -0
- package/dist/src/commands/daemon.js +86 -0
- package/dist/src/commands/daemon.js.map +1 -0
- package/dist/src/commands/push-dashboard.d.ts +3 -0
- package/dist/src/commands/push-dashboard.d.ts.map +1 -0
- package/dist/src/commands/push-dashboard.js +48 -0
- package/dist/src/commands/push-dashboard.js.map +1 -0
- package/dist/src/commands/schedule.d.ts +3 -0
- package/dist/src/commands/schedule.d.ts.map +1 -0
- package/dist/src/commands/schedule.js +70 -0
- package/dist/src/commands/schedule.js.map +1 -0
- package/dist/src/commands/sessions.d.ts +3 -0
- package/dist/src/commands/sessions.d.ts.map +1 -0
- package/dist/src/commands/sessions.js +62 -0
- package/dist/src/commands/sessions.js.map +1 -0
- package/dist/src/commands/webhooks.d.ts +3 -0
- package/dist/src/commands/webhooks.d.ts.map +1 -0
- package/dist/src/commands/webhooks.js +44 -0
- package/dist/src/commands/webhooks.js.map +1 -0
- package/dist/src/config.d.ts +9 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +56 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/daemon-audit.d.ts +13 -0
- package/dist/src/daemon-audit.d.ts.map +1 -0
- package/dist/src/daemon-audit.js +33 -0
- package/dist/src/daemon-audit.js.map +1 -0
- package/dist/src/daemon.d.ts +25 -0
- package/dist/src/daemon.d.ts.map +1 -0
- package/dist/src/daemon.js +344 -0
- package/dist/src/daemon.js.map +1 -0
- package/dist/src/dashboard-server-schema.d.ts +23 -0
- package/dist/src/dashboard-server-schema.d.ts.map +1 -0
- package/dist/src/dashboard-server-schema.js +45 -0
- package/dist/src/dashboard-server-schema.js.map +1 -0
- package/dist/src/dashboard-server-utils.d.ts +18 -0
- package/dist/src/dashboard-server-utils.d.ts.map +1 -0
- package/dist/src/dashboard-server-utils.js +107 -0
- package/dist/src/dashboard-server-utils.js.map +1 -0
- package/dist/src/dashboard-server.d.ts +2 -0
- package/dist/src/dashboard-server.d.ts.map +1 -0
- package/dist/src/dashboard-server.js +777 -0
- package/dist/src/dashboard-server.js.map +1 -0
- package/dist/src/docker.constants.d.ts +5 -0
- package/dist/src/docker.constants.d.ts.map +1 -0
- package/dist/src/docker.constants.js +7 -0
- package/dist/src/docker.constants.js.map +1 -0
- package/dist/src/docker.d.ts +16 -0
- package/dist/src/docker.d.ts.map +1 -0
- package/dist/src/docker.js +437 -0
- package/dist/src/docker.js.map +1 -0
- package/dist/src/docker.types.d.ts +13 -0
- package/dist/src/docker.types.d.ts.map +1 -0
- package/dist/src/docker.types.js +2 -0
- package/dist/src/docker.types.js.map +1 -0
- package/dist/src/docker.utils.d.ts +24 -0
- package/dist/src/docker.utils.d.ts.map +1 -0
- package/dist/src/docker.utils.js +239 -0
- package/dist/src/docker.utils.js.map +1 -0
- package/dist/src/doctor.d.ts +3 -0
- package/dist/src/doctor.d.ts.map +1 -0
- package/dist/src/doctor.js +80 -0
- package/dist/src/doctor.js.map +1 -0
- package/dist/src/doctor.utils.d.ts +30 -0
- package/dist/src/doctor.utils.d.ts.map +1 -0
- package/dist/src/doctor.utils.js +192 -0
- package/dist/src/doctor.utils.js.map +1 -0
- package/dist/src/mcp-proxy.d.ts +2 -0
- package/dist/src/mcp-proxy.d.ts.map +1 -0
- package/dist/src/mcp-proxy.js +177 -0
- package/dist/src/mcp-proxy.js.map +1 -0
- package/dist/src/resolve-endpoint.d.ts +13 -0
- package/dist/src/resolve-endpoint.d.ts.map +1 -0
- package/dist/src/resolve-endpoint.js +112 -0
- package/dist/src/resolve-endpoint.js.map +1 -0
- package/dist/src/store.d.ts +41 -0
- package/dist/src/store.d.ts.map +1 -0
- package/dist/src/store.js +263 -0
- package/dist/src/store.js.map +1 -0
- package/package.json +84 -0
- package/s6/mecha-agent/dependencies.d/tailscale-up +0 -0
- package/s6/mecha-agent/finish +4 -0
- package/s6/mecha-agent/run +39 -0
- package/s6/mecha-agent/type +1 -0
- package/s6/tailscale-up/dependencies.d/tailscaled +0 -0
- package/s6/tailscale-up/type +1 -0
- package/s6/tailscale-up/up +39 -0
- package/s6/tailscaled/run +14 -0
- package/s6/tailscaled/type +1 -0
- package/shared/atomic-write.ts +58 -0
- package/shared/errors.ts +137 -0
- package/shared/logger.ts +50 -0
- package/shared/mutex.ts +73 -0
- package/shared/safe-read.ts +52 -0
- package/shared/totp.ts +83 -0
- package/shared/validation.ts +29 -0
- package/tsconfig.agent.json +10 -0
- package/tsconfig.json +22 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { extractSnippet } from "./snippet";
|
|
3
|
+
|
|
4
|
+
describe("extractSnippet", () => {
|
|
5
|
+
it("centers snippet around the match", () => {
|
|
6
|
+
const text = "a".repeat(100) + "NEEDLE" + "b".repeat(100);
|
|
7
|
+
const result = extractSnippet(text, "needle");
|
|
8
|
+
expect(result).toContain("NEEDLE");
|
|
9
|
+
expect(result.startsWith("...")).toBe(true);
|
|
10
|
+
expect(result.endsWith("...")).toBe(true);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it("returns start of text when needle not found", () => {
|
|
14
|
+
const text = "a".repeat(200);
|
|
15
|
+
const result = extractSnippet(text, "xyz");
|
|
16
|
+
expect(result.length).toBe(160); // contextChars * 2
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it("no ellipsis when match is at the start", () => {
|
|
20
|
+
const text = "NEEDLE" + "b".repeat(200);
|
|
21
|
+
const result = extractSnippet(text, "needle");
|
|
22
|
+
expect(result.startsWith("...")).toBe(false);
|
|
23
|
+
expect(result.endsWith("...")).toBe(true);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("no ellipsis when match is at the end", () => {
|
|
27
|
+
const text = "a".repeat(200) + "NEEDLE";
|
|
28
|
+
const result = extractSnippet(text, "needle");
|
|
29
|
+
expect(result.startsWith("...")).toBe(true);
|
|
30
|
+
expect(result.endsWith("...")).toBe(false);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it("no ellipsis when text fits within context", () => {
|
|
34
|
+
const result = extractSnippet("short text with needle here", "needle");
|
|
35
|
+
expect(result).toBe("short text with needle here");
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it("replaces newlines with spaces", () => {
|
|
39
|
+
const result = extractSnippet("line1\nneedle\nline3", "needle");
|
|
40
|
+
expect(result).not.toContain("\n");
|
|
41
|
+
expect(result).toContain("line1 needle line3");
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it("respects custom contextChars", () => {
|
|
45
|
+
const text = "a".repeat(50) + "NEEDLE" + "b".repeat(50);
|
|
46
|
+
const result = extractSnippet(text, "needle", 10);
|
|
47
|
+
// 10 chars before + "NEEDLE" (6) + 10 chars after = ~26, plus "..." on both sides
|
|
48
|
+
expect(result.length).toBeLessThan(40);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract a text snippet centered around a search needle with surrounding context.
|
|
3
|
+
* Re-exported from session-history for testability in the dashboard test suite.
|
|
4
|
+
*/
|
|
5
|
+
export function extractSnippet(text: string, needle: string, contextChars = 80): string {
|
|
6
|
+
const lower = text.toLowerCase();
|
|
7
|
+
const idx = lower.indexOf(needle.toLowerCase());
|
|
8
|
+
if (idx === -1) return text.slice(0, contextChars * 2);
|
|
9
|
+
const start = Math.max(0, idx - contextChars);
|
|
10
|
+
const end = Math.min(text.length, idx + needle.length + contextChars);
|
|
11
|
+
let snippet = text.slice(start, end).replace(/\n/g, " ");
|
|
12
|
+
if (start > 0) snippet = "..." + snippet;
|
|
13
|
+
if (end < text.length) snippet = snippet + "...";
|
|
14
|
+
return snippet;
|
|
15
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { parseWsMessage } from "./ws-parse";
|
|
3
|
+
|
|
4
|
+
describe("parseWsMessage", () => {
|
|
5
|
+
it("handles ArrayBuffer as binary", () => {
|
|
6
|
+
const buf = new ArrayBuffer(3);
|
|
7
|
+
new Uint8Array(buf).set([1, 2, 3]);
|
|
8
|
+
const result = parseWsMessage(buf);
|
|
9
|
+
expect(result.kind).toBe("binary");
|
|
10
|
+
if (result.kind === "binary") {
|
|
11
|
+
expect(Array.from(result.data)).toEqual([1, 2, 3]);
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it("handles plain text", () => {
|
|
16
|
+
const result = parseWsMessage("hello world");
|
|
17
|
+
expect(result).toEqual({ kind: "text", data: "hello world" });
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it("handles text starting with { but not valid JSON", () => {
|
|
21
|
+
const result = parseWsMessage("{not valid json");
|
|
22
|
+
expect(result).toEqual({ kind: "text", data: "{not valid json" });
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it("handles JSON without __mecha flag as plain text", () => {
|
|
26
|
+
const msg = JSON.stringify({ type: "some_event", data: 123 });
|
|
27
|
+
const result = parseWsMessage(msg);
|
|
28
|
+
expect(result).toEqual({ kind: "text", data: msg });
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("parses mecha session message", () => {
|
|
32
|
+
const msg = JSON.stringify({ __mecha: true, type: "session", id: "abc-123" });
|
|
33
|
+
const result = parseWsMessage(msg);
|
|
34
|
+
expect(result).toEqual({ kind: "mecha-session", id: "abc-123" });
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it("parses mecha exit message with code", () => {
|
|
38
|
+
const msg = JSON.stringify({ __mecha: true, type: "exit", code: 0 });
|
|
39
|
+
const result = parseWsMessage(msg);
|
|
40
|
+
expect(result).toEqual({ kind: "mecha-exit", code: 0 });
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it("parses mecha exit message without code (defaults to -1)", () => {
|
|
44
|
+
const msg = JSON.stringify({ __mecha: true, type: "exit" });
|
|
45
|
+
const result = parseWsMessage(msg);
|
|
46
|
+
expect(result).toEqual({ kind: "mecha-exit", code: -1 });
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it("parses mecha error message", () => {
|
|
50
|
+
const msg = JSON.stringify({ __mecha: true, type: "error", message: "something broke" });
|
|
51
|
+
const result = parseWsMessage(msg);
|
|
52
|
+
expect(result).toEqual({ kind: "mecha-error", message: "something broke" });
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it("parses mecha error without message (defaults)", () => {
|
|
56
|
+
const msg = JSON.stringify({ __mecha: true, type: "error" });
|
|
57
|
+
const result = parseWsMessage(msg);
|
|
58
|
+
expect(result).toEqual({ kind: "mecha-error", message: "Unknown error" });
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it("treats mecha session without id as plain text", () => {
|
|
62
|
+
const msg = JSON.stringify({ __mecha: true, type: "session" });
|
|
63
|
+
const result = parseWsMessage(msg);
|
|
64
|
+
// No id → falls through to plain text since no branch matches
|
|
65
|
+
expect(result).toEqual({ kind: "text", data: msg });
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it("handles empty string", () => {
|
|
69
|
+
const result = parseWsMessage("");
|
|
70
|
+
expect(result).toEqual({ kind: "text", data: "" });
|
|
71
|
+
});
|
|
72
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export interface MechaControlMessage {
|
|
2
|
+
__mecha: true;
|
|
3
|
+
type: string;
|
|
4
|
+
id?: string;
|
|
5
|
+
code?: number;
|
|
6
|
+
message?: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export type WsParseResult =
|
|
10
|
+
| { kind: "binary"; data: Uint8Array }
|
|
11
|
+
| { kind: "text"; data: string }
|
|
12
|
+
| { kind: "mecha-session"; id: string }
|
|
13
|
+
| { kind: "mecha-exit"; code: number }
|
|
14
|
+
| { kind: "mecha-error"; message: string };
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Parse a WebSocket message event.data into a typed result.
|
|
18
|
+
* Expects ws.binaryType = "arraybuffer" so binary arrives as ArrayBuffer.
|
|
19
|
+
*/
|
|
20
|
+
export function parseWsMessage(data: ArrayBuffer | string): WsParseResult {
|
|
21
|
+
if (data instanceof ArrayBuffer) {
|
|
22
|
+
return { kind: "binary", data: new Uint8Array(data) };
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const text = data;
|
|
26
|
+
if (text.charAt(0) === "{") {
|
|
27
|
+
try {
|
|
28
|
+
const msg = JSON.parse(text) as Partial<MechaControlMessage> & { type: string };
|
|
29
|
+
if (msg.__mecha) {
|
|
30
|
+
if (msg.type === "session" && msg.id) {
|
|
31
|
+
return { kind: "mecha-session", id: msg.id };
|
|
32
|
+
}
|
|
33
|
+
if (msg.type === "exit") {
|
|
34
|
+
return { kind: "mecha-exit", code: typeof msg.code === "number" ? msg.code : -1 };
|
|
35
|
+
}
|
|
36
|
+
if (msg.type === "error") {
|
|
37
|
+
return { kind: "mecha-error", message: msg.message ?? "Unknown error" };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
} catch {
|
|
41
|
+
// not valid JSON — fall through to plain text
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return { kind: "text", data: text };
|
|
46
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import ReactDOM from "react-dom/client";
|
|
3
|
+
import { FleetProvider } from "./lib/fleet-context";
|
|
4
|
+
import LoginGate from "./lib/login-gate";
|
|
5
|
+
import App from "./app";
|
|
6
|
+
import { PixelOffice } from "./pixel-engine/components/PixelOffice";
|
|
7
|
+
import "./index.css";
|
|
8
|
+
|
|
9
|
+
const isPublicOffice = window.location.pathname === "/office" || window.location.pathname === "/office/";
|
|
10
|
+
|
|
11
|
+
ReactDOM.createRoot(document.getElementById("root")!).render(
|
|
12
|
+
<React.StrictMode>
|
|
13
|
+
{isPublicOffice ? (
|
|
14
|
+
<div style={{ width: "100vw", height: "100vh", overflow: "hidden", background: "#111" }}>
|
|
15
|
+
<PixelOffice isActive readOnly />
|
|
16
|
+
</div>
|
|
17
|
+
) : (
|
|
18
|
+
<LoginGate>
|
|
19
|
+
<FleetProvider>
|
|
20
|
+
<App />
|
|
21
|
+
</FleetProvider>
|
|
22
|
+
</LoginGate>
|
|
23
|
+
)}
|
|
24
|
+
</React.StrictMode>,
|
|
25
|
+
);
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared sprite colorization module.
|
|
3
|
+
*
|
|
4
|
+
* Two modes:
|
|
5
|
+
* - Colorize (Photoshop-style): grayscale → fixed HSL. For floor tiles and opt-in furniture.
|
|
6
|
+
* - Adjust (default for furniture): shift original pixel HSL values.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { FloorColor, SpriteData } from './types.js';
|
|
10
|
+
|
|
11
|
+
/** Generic colorized sprite cache: arbitrary string key → SpriteData */
|
|
12
|
+
const colorizeCache = new Map<string, SpriteData>();
|
|
13
|
+
|
|
14
|
+
/** Max entries before evicting oldest (first inserted) */
|
|
15
|
+
const COLORIZE_CACHE_MAX = 500;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Get a color-adjusted sprite from cache, or compute and cache it.
|
|
19
|
+
* Dispatches to colorize or adjust mode based on `color.colorize`.
|
|
20
|
+
* Caller provides a unique cache key that must include the colorize flag.
|
|
21
|
+
*/
|
|
22
|
+
export function getColorizedSprite(
|
|
23
|
+
cacheKey: string,
|
|
24
|
+
sprite: SpriteData,
|
|
25
|
+
color: FloorColor,
|
|
26
|
+
): SpriteData {
|
|
27
|
+
const cached = colorizeCache.get(cacheKey);
|
|
28
|
+
if (cached) return cached;
|
|
29
|
+
const result = color.colorize ? colorizeSprite(sprite, color) : adjustSprite(sprite, color);
|
|
30
|
+
// Evict oldest entry when over limit
|
|
31
|
+
if (colorizeCache.size >= COLORIZE_CACHE_MAX) {
|
|
32
|
+
const firstKey = colorizeCache.keys().next().value;
|
|
33
|
+
if (firstKey !== undefined) colorizeCache.delete(firstKey);
|
|
34
|
+
}
|
|
35
|
+
colorizeCache.set(cacheKey, result);
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Clear all cached colorized sprites (e.g., on tab deactivation or asset reload) */
|
|
40
|
+
export function clearColorizeCache(): void {
|
|
41
|
+
colorizeCache.clear();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Colorize a sprite using HSL transformation.
|
|
46
|
+
*
|
|
47
|
+
* Algorithm (Photoshop Colorize-style):
|
|
48
|
+
* 1. Parse each pixel's color as perceived luminance (0-1)
|
|
49
|
+
* 2. Apply contrast: stretch/compress around midpoint 0.5
|
|
50
|
+
* 3. Apply brightness: shift lightness up/down
|
|
51
|
+
* 4. Create HSL color with user's hue + saturation
|
|
52
|
+
* 5. Convert HSL -> RGB -> hex
|
|
53
|
+
*/
|
|
54
|
+
export function colorizeSprite(sprite: SpriteData, color: FloorColor): SpriteData {
|
|
55
|
+
const { h, s, b, c } = color;
|
|
56
|
+
const result: SpriteData = [];
|
|
57
|
+
|
|
58
|
+
for (const row of sprite) {
|
|
59
|
+
const newRow: string[] = [];
|
|
60
|
+
for (const pixel of row) {
|
|
61
|
+
if (pixel === '') {
|
|
62
|
+
newRow.push('');
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Parse hex to get RGB values
|
|
67
|
+
const r = parseInt(pixel.slice(1, 3), 16);
|
|
68
|
+
const g = parseInt(pixel.slice(3, 5), 16);
|
|
69
|
+
const bv = parseInt(pixel.slice(5, 7), 16);
|
|
70
|
+
// Use perceived luminance for grayscale
|
|
71
|
+
let lightness = (0.299 * r + 0.587 * g + 0.114 * bv) / 255;
|
|
72
|
+
|
|
73
|
+
// Apply contrast: expand/compress around 0.5
|
|
74
|
+
if (c !== 0) {
|
|
75
|
+
const factor = (100 + c) / 100;
|
|
76
|
+
lightness = 0.5 + (lightness - 0.5) * factor;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Apply brightness: shift up/down
|
|
80
|
+
if (b !== 0) {
|
|
81
|
+
lightness = lightness + b / 200;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Clamp
|
|
85
|
+
lightness = Math.max(0, Math.min(1, lightness));
|
|
86
|
+
|
|
87
|
+
// Preserve original alpha
|
|
88
|
+
const alpha = extractAlpha(pixel);
|
|
89
|
+
|
|
90
|
+
// Convert HSL to RGB
|
|
91
|
+
const satFrac = s / 100;
|
|
92
|
+
const hex = hslToHex(h, satFrac, lightness);
|
|
93
|
+
newRow.push(appendAlpha(hex, alpha));
|
|
94
|
+
}
|
|
95
|
+
result.push(newRow);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** Extract alpha from a hex pixel string. Returns 255 for #RRGGBB, parsed value for #RRGGBBAA. */
|
|
102
|
+
function extractAlpha(pixel: string): number {
|
|
103
|
+
return pixel.length > 7 ? parseInt(pixel.slice(7, 9), 16) : 255;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** Append alpha to a #RRGGBB hex string, omitting if fully opaque. */
|
|
107
|
+
function appendAlpha(hex: string, alpha: number): string {
|
|
108
|
+
if (alpha >= 255) return hex;
|
|
109
|
+
return `${hex}${alpha.toString(16).padStart(2, '0').toUpperCase()}`;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** Convert HSL (h: 0-360, s: 0-1, l: 0-1) to #RRGGBB hex string */
|
|
113
|
+
function hslToHex(h: number, s: number, l: number): string {
|
|
114
|
+
const c = (1 - Math.abs(2 * l - 1)) * s;
|
|
115
|
+
const hp = h / 60;
|
|
116
|
+
const x = c * (1 - Math.abs((hp % 2) - 1));
|
|
117
|
+
let r1 = 0,
|
|
118
|
+
g1 = 0,
|
|
119
|
+
b1 = 0;
|
|
120
|
+
|
|
121
|
+
if (hp < 1) {
|
|
122
|
+
r1 = c;
|
|
123
|
+
g1 = x;
|
|
124
|
+
b1 = 0;
|
|
125
|
+
} else if (hp < 2) {
|
|
126
|
+
r1 = x;
|
|
127
|
+
g1 = c;
|
|
128
|
+
b1 = 0;
|
|
129
|
+
} else if (hp < 3) {
|
|
130
|
+
r1 = 0;
|
|
131
|
+
g1 = c;
|
|
132
|
+
b1 = x;
|
|
133
|
+
} else if (hp < 4) {
|
|
134
|
+
r1 = 0;
|
|
135
|
+
g1 = x;
|
|
136
|
+
b1 = c;
|
|
137
|
+
} else if (hp < 5) {
|
|
138
|
+
r1 = x;
|
|
139
|
+
g1 = 0;
|
|
140
|
+
b1 = c;
|
|
141
|
+
} else {
|
|
142
|
+
r1 = c;
|
|
143
|
+
g1 = 0;
|
|
144
|
+
b1 = x;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const m = l - c / 2;
|
|
148
|
+
const r = Math.round((r1 + m) * 255);
|
|
149
|
+
const g = Math.round((g1 + m) * 255);
|
|
150
|
+
const bOut = Math.round((b1 + m) * 255);
|
|
151
|
+
|
|
152
|
+
return `#${clamp255(r).toString(16).padStart(2, '0')}${clamp255(g).toString(16).padStart(2, '0')}${clamp255(bOut).toString(16).padStart(2, '0')}`.toUpperCase();
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function clamp255(v: number): number {
|
|
156
|
+
return Math.max(0, Math.min(255, v));
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/** Convert RGB (0-255 each) to HSL (h: 0-360, s: 0-1, l: 0-1) */
|
|
160
|
+
function rgbToHsl(r: number, g: number, b: number): [number, number, number] {
|
|
161
|
+
const rf = r / 255,
|
|
162
|
+
gf = g / 255,
|
|
163
|
+
bf = b / 255;
|
|
164
|
+
const max = Math.max(rf, gf, bf),
|
|
165
|
+
min = Math.min(rf, gf, bf);
|
|
166
|
+
const l = (max + min) / 2;
|
|
167
|
+
if (max === min) return [0, 0, l];
|
|
168
|
+
const d = max - min;
|
|
169
|
+
const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
|
|
170
|
+
let h = 0;
|
|
171
|
+
if (max === rf) h = ((gf - bf) / d + (gf < bf ? 6 : 0)) * 60;
|
|
172
|
+
else if (max === gf) h = ((bf - rf) / d + 2) * 60;
|
|
173
|
+
else h = ((rf - gf) / d + 4) * 60;
|
|
174
|
+
return [h, s, l];
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Adjust a sprite's colors by shifting HSL values (default mode for furniture).
|
|
179
|
+
*
|
|
180
|
+
* H slider (-180 to +180): rotates hue
|
|
181
|
+
* S slider (-100 to +100): shifts saturation
|
|
182
|
+
* B slider (-100 to 100): shifts lightness
|
|
183
|
+
* C slider (-100 to 100): adjusts contrast around midpoint
|
|
184
|
+
*/
|
|
185
|
+
export function adjustSprite(sprite: SpriteData, color: FloorColor): SpriteData {
|
|
186
|
+
const { h: hShift, s: sShift, b, c } = color;
|
|
187
|
+
const result: SpriteData = [];
|
|
188
|
+
|
|
189
|
+
for (const row of sprite) {
|
|
190
|
+
const newRow: string[] = [];
|
|
191
|
+
for (const pixel of row) {
|
|
192
|
+
if (pixel === '') {
|
|
193
|
+
newRow.push('');
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
const r = parseInt(pixel.slice(1, 3), 16);
|
|
198
|
+
const g = parseInt(pixel.slice(3, 5), 16);
|
|
199
|
+
const bv = parseInt(pixel.slice(5, 7), 16);
|
|
200
|
+
const alpha = extractAlpha(pixel);
|
|
201
|
+
const [origH, origS, origL] = rgbToHsl(r, g, bv);
|
|
202
|
+
|
|
203
|
+
// Shift hue
|
|
204
|
+
const newH = (((origH + hShift) % 360) + 360) % 360;
|
|
205
|
+
|
|
206
|
+
// Shift saturation
|
|
207
|
+
const newS = Math.max(0, Math.min(1, origS + sShift / 100));
|
|
208
|
+
|
|
209
|
+
// Apply contrast: expand/compress around 0.5
|
|
210
|
+
let lightness = origL;
|
|
211
|
+
if (c !== 0) {
|
|
212
|
+
const factor = (100 + c) / 100;
|
|
213
|
+
lightness = 0.5 + (lightness - 0.5) * factor;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Apply brightness
|
|
217
|
+
if (b !== 0) {
|
|
218
|
+
lightness = lightness + b / 200;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
lightness = Math.max(0, Math.min(1, lightness));
|
|
222
|
+
|
|
223
|
+
const hex = hslToHex(newH, newS, lightness);
|
|
224
|
+
newRow.push(appendAlpha(hex, alpha));
|
|
225
|
+
}
|
|
226
|
+
result.push(newRow);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
return result;
|
|
230
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
|
|
3
|
+
interface BottomToolbarProps {
|
|
4
|
+
isEditMode: boolean;
|
|
5
|
+
onToggleEditMode: () => void;
|
|
6
|
+
isDebugMode: boolean;
|
|
7
|
+
onToggleDebugMode: () => void;
|
|
8
|
+
onOpenSettings: () => void;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const panelStyle: React.CSSProperties = {
|
|
12
|
+
position: 'absolute',
|
|
13
|
+
bottom: 10,
|
|
14
|
+
left: 10,
|
|
15
|
+
zIndex: 'var(--pixel-controls-z)',
|
|
16
|
+
display: 'flex',
|
|
17
|
+
alignItems: 'center',
|
|
18
|
+
gap: 4,
|
|
19
|
+
background: 'var(--pixel-bg)',
|
|
20
|
+
border: '2px solid var(--pixel-border)',
|
|
21
|
+
borderRadius: 0,
|
|
22
|
+
padding: '4px 6px',
|
|
23
|
+
boxShadow: 'var(--pixel-shadow)',
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const btnBase: React.CSSProperties = {
|
|
27
|
+
padding: '5px 10px',
|
|
28
|
+
fontSize: '24px',
|
|
29
|
+
color: 'var(--pixel-text)',
|
|
30
|
+
background: 'var(--pixel-btn-bg)',
|
|
31
|
+
border: '2px solid transparent',
|
|
32
|
+
borderRadius: 0,
|
|
33
|
+
cursor: 'pointer',
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const btnActive: React.CSSProperties = {
|
|
37
|
+
...btnBase,
|
|
38
|
+
background: 'var(--pixel-active-bg)',
|
|
39
|
+
border: '2px solid var(--pixel-accent)',
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export function BottomToolbar({
|
|
43
|
+
isEditMode,
|
|
44
|
+
onToggleEditMode,
|
|
45
|
+
isDebugMode: _isDebugMode,
|
|
46
|
+
onToggleDebugMode: _onToggleDebugMode,
|
|
47
|
+
onOpenSettings,
|
|
48
|
+
}: BottomToolbarProps) {
|
|
49
|
+
const [hovered, setHovered] = useState<string | null>(null);
|
|
50
|
+
|
|
51
|
+
return (
|
|
52
|
+
<div style={panelStyle}>
|
|
53
|
+
<button
|
|
54
|
+
onClick={onToggleEditMode}
|
|
55
|
+
onMouseEnter={() => setHovered('edit')}
|
|
56
|
+
onMouseLeave={() => setHovered(null)}
|
|
57
|
+
style={
|
|
58
|
+
isEditMode
|
|
59
|
+
? { ...btnActive }
|
|
60
|
+
: {
|
|
61
|
+
...btnBase,
|
|
62
|
+
background: hovered === 'edit' ? 'var(--pixel-btn-hover-bg)' : btnBase.background,
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
title="Edit office layout"
|
|
66
|
+
>
|
|
67
|
+
Layout
|
|
68
|
+
</button>
|
|
69
|
+
<button
|
|
70
|
+
onClick={onOpenSettings}
|
|
71
|
+
onMouseEnter={() => setHovered('settings')}
|
|
72
|
+
onMouseLeave={() => setHovered(null)}
|
|
73
|
+
style={{
|
|
74
|
+
...btnBase,
|
|
75
|
+
background: hovered === 'settings' ? 'var(--pixel-btn-hover-bg)' : btnBase.background,
|
|
76
|
+
}}
|
|
77
|
+
title="Settings"
|
|
78
|
+
>
|
|
79
|
+
Settings
|
|
80
|
+
</button>
|
|
81
|
+
</div>
|
|
82
|
+
);
|
|
83
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import type { ToolActivity } from '../types.js';
|
|
2
|
+
|
|
3
|
+
interface DebugViewProps {
|
|
4
|
+
agents: number[];
|
|
5
|
+
selectedAgent: number | null;
|
|
6
|
+
agentTools: Record<number, ToolActivity[]>;
|
|
7
|
+
agentStatuses: Record<number, string>;
|
|
8
|
+
subagentTools: Record<number, Record<string, ToolActivity[]>>;
|
|
9
|
+
onSelectAgent: (id: number) => void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** Z-index just below the floating toolbar (50) so the toolbar stays on top */
|
|
13
|
+
const DEBUG_Z = 40;
|
|
14
|
+
|
|
15
|
+
function ToolDot({ tool }: { tool: ToolActivity }) {
|
|
16
|
+
return (
|
|
17
|
+
<span
|
|
18
|
+
className={tool.done ? undefined : 'pixel-agents-pulse'}
|
|
19
|
+
style={{
|
|
20
|
+
width: 6,
|
|
21
|
+
height: 6,
|
|
22
|
+
borderRadius: '50%',
|
|
23
|
+
background: tool.done
|
|
24
|
+
? '#89d185'
|
|
25
|
+
: tool.permissionWait
|
|
26
|
+
? '#cca700'
|
|
27
|
+
: '#3794ff',
|
|
28
|
+
display: 'inline-block',
|
|
29
|
+
flexShrink: 0,
|
|
30
|
+
}}
|
|
31
|
+
/>
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function ToolLine({ tool }: { tool: ToolActivity }) {
|
|
36
|
+
return (
|
|
37
|
+
<span
|
|
38
|
+
style={{
|
|
39
|
+
fontSize: '22px',
|
|
40
|
+
opacity: tool.done ? 0.5 : 0.8,
|
|
41
|
+
display: 'flex',
|
|
42
|
+
alignItems: 'center',
|
|
43
|
+
gap: 5,
|
|
44
|
+
}}
|
|
45
|
+
>
|
|
46
|
+
<ToolDot tool={tool} />
|
|
47
|
+
{tool.permissionWait && !tool.done ? 'Needs approval' : tool.status}
|
|
48
|
+
</span>
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function DebugView({
|
|
53
|
+
agents,
|
|
54
|
+
selectedAgent,
|
|
55
|
+
agentTools,
|
|
56
|
+
agentStatuses,
|
|
57
|
+
subagentTools,
|
|
58
|
+
onSelectAgent,
|
|
59
|
+
}: DebugViewProps) {
|
|
60
|
+
const renderAgentCard = (id: number) => {
|
|
61
|
+
const isSelected = selectedAgent === id;
|
|
62
|
+
const tools = agentTools[id] || [];
|
|
63
|
+
const subs = subagentTools[id] || {};
|
|
64
|
+
const status = agentStatuses[id];
|
|
65
|
+
const hasActiveTools = tools.some((t) => !t.done);
|
|
66
|
+
return (
|
|
67
|
+
<div
|
|
68
|
+
key={id}
|
|
69
|
+
style={{
|
|
70
|
+
border: `2px solid ${isSelected ? '#5a8cff' : '#4a4a6a'}`,
|
|
71
|
+
borderRadius: 0,
|
|
72
|
+
padding: '6px 8px',
|
|
73
|
+
background: isSelected
|
|
74
|
+
? 'rgba(255,255,255,0.04)'
|
|
75
|
+
: undefined,
|
|
76
|
+
}}
|
|
77
|
+
>
|
|
78
|
+
<span style={{ display: 'inline-flex', alignItems: 'center', gap: 0 }}>
|
|
79
|
+
<button
|
|
80
|
+
onClick={() => onSelectAgent(id)}
|
|
81
|
+
style={{
|
|
82
|
+
borderRadius: 0,
|
|
83
|
+
padding: '6px 10px',
|
|
84
|
+
fontSize: '26px',
|
|
85
|
+
background: isSelected ? 'rgba(90, 140, 255, 0.25)' : undefined,
|
|
86
|
+
color: isSelected ? '#fff' : undefined,
|
|
87
|
+
fontWeight: isSelected ? 'bold' : undefined,
|
|
88
|
+
}}
|
|
89
|
+
>
|
|
90
|
+
Agent #{id}
|
|
91
|
+
</button>
|
|
92
|
+
</span>
|
|
93
|
+
{(tools.length > 0 || status === 'waiting') && (
|
|
94
|
+
<div
|
|
95
|
+
style={{
|
|
96
|
+
display: 'flex',
|
|
97
|
+
flexDirection: 'column',
|
|
98
|
+
gap: 1,
|
|
99
|
+
marginTop: 4,
|
|
100
|
+
paddingLeft: 4,
|
|
101
|
+
}}
|
|
102
|
+
>
|
|
103
|
+
{tools.map((tool) => (
|
|
104
|
+
<div key={tool.toolId}>
|
|
105
|
+
<ToolLine tool={tool} />
|
|
106
|
+
{subs[tool.toolId] && subs[tool.toolId].length > 0 && (
|
|
107
|
+
<div
|
|
108
|
+
style={{
|
|
109
|
+
borderLeft: '2px solid rgba(255,255,255,0.12)',
|
|
110
|
+
marginLeft: 3,
|
|
111
|
+
paddingLeft: 8,
|
|
112
|
+
marginTop: 1,
|
|
113
|
+
display: 'flex',
|
|
114
|
+
flexDirection: 'column',
|
|
115
|
+
gap: 1,
|
|
116
|
+
}}
|
|
117
|
+
>
|
|
118
|
+
{subs[tool.toolId].map((subTool) => (
|
|
119
|
+
<ToolLine key={subTool.toolId} tool={subTool} />
|
|
120
|
+
))}
|
|
121
|
+
</div>
|
|
122
|
+
)}
|
|
123
|
+
</div>
|
|
124
|
+
))}
|
|
125
|
+
{status === 'waiting' && !hasActiveTools && (
|
|
126
|
+
<span
|
|
127
|
+
style={{
|
|
128
|
+
fontSize: '22px',
|
|
129
|
+
opacity: 0.85,
|
|
130
|
+
display: 'flex',
|
|
131
|
+
alignItems: 'center',
|
|
132
|
+
gap: 5,
|
|
133
|
+
}}
|
|
134
|
+
>
|
|
135
|
+
<span
|
|
136
|
+
style={{
|
|
137
|
+
width: 6,
|
|
138
|
+
height: 6,
|
|
139
|
+
borderRadius: '50%',
|
|
140
|
+
background: '#cca700',
|
|
141
|
+
display: 'inline-block',
|
|
142
|
+
flexShrink: 0,
|
|
143
|
+
}}
|
|
144
|
+
/>
|
|
145
|
+
Might be waiting for input
|
|
146
|
+
</span>
|
|
147
|
+
)}
|
|
148
|
+
</div>
|
|
149
|
+
)}
|
|
150
|
+
</div>
|
|
151
|
+
);
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
return (
|
|
155
|
+
<div
|
|
156
|
+
style={{
|
|
157
|
+
position: 'absolute',
|
|
158
|
+
top: 0,
|
|
159
|
+
left: 0,
|
|
160
|
+
width: '100%',
|
|
161
|
+
height: '100%',
|
|
162
|
+
background: 'var(--pixel-bg)',
|
|
163
|
+
zIndex: DEBUG_Z,
|
|
164
|
+
overflow: 'auto',
|
|
165
|
+
}}
|
|
166
|
+
>
|
|
167
|
+
{/* Top padding so cards don't overlap the floating toolbar */}
|
|
168
|
+
<div style={{ padding: '12px 12px 12px', fontSize: '28px' }}>
|
|
169
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
|
|
170
|
+
{agents.map(renderAgentCard)}
|
|
171
|
+
</div>
|
|
172
|
+
</div>
|
|
173
|
+
</div>
|
|
174
|
+
);
|
|
175
|
+
}
|