@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,265 @@
|
|
|
1
|
+
import { useState, useEffect } from "react";
|
|
2
|
+
import { botFetch } from "../lib/api";
|
|
3
|
+
import { Button, Input, Select, Textarea, Card, Alert } from "../components";
|
|
4
|
+
|
|
5
|
+
interface Config {
|
|
6
|
+
name?: string;
|
|
7
|
+
model?: string;
|
|
8
|
+
max_turns?: number;
|
|
9
|
+
permission_mode?: string;
|
|
10
|
+
system?: string;
|
|
11
|
+
auth_type?: string;
|
|
12
|
+
auth_profile?: string;
|
|
13
|
+
schedule?: number;
|
|
14
|
+
webhooks?: { accept?: string[] };
|
|
15
|
+
workspace?: boolean;
|
|
16
|
+
workspace_writable?: boolean;
|
|
17
|
+
[key: string]: unknown;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
interface AuthProfile {
|
|
21
|
+
name: string;
|
|
22
|
+
type: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
interface AuthInfo {
|
|
26
|
+
current_profile: string | null;
|
|
27
|
+
profiles: AuthProfile[];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export default function ConfigEditor() {
|
|
31
|
+
const [config, setConfig] = useState<Config | null>(null);
|
|
32
|
+
const [draft, setDraft] = useState<Record<string, unknown>>({});
|
|
33
|
+
const [saving, setSaving] = useState(false);
|
|
34
|
+
const [message, setMessage] = useState<{ text: string; type: "success" | "error" } | null>(null);
|
|
35
|
+
const [loading, setLoading] = useState(true);
|
|
36
|
+
const [systemExpanded, setSystemExpanded] = useState(false);
|
|
37
|
+
const [authProfiles, setAuthProfiles] = useState<AuthProfile[]>([]);
|
|
38
|
+
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
const loadConfig = async () => {
|
|
41
|
+
try {
|
|
42
|
+
const configResp = await botFetch("/api/config");
|
|
43
|
+
if (!configResp.ok) throw new Error(`HTTP ${configResp.status}`);
|
|
44
|
+
setConfig(await configResp.json() as Config);
|
|
45
|
+
} catch {
|
|
46
|
+
setMessage({ text: "Failed to load config", type: "error" });
|
|
47
|
+
setLoading(false);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
const authResp = await botFetch("/api/auth/profiles");
|
|
52
|
+
if (authResp.ok) {
|
|
53
|
+
setAuthProfiles((await authResp.json() as AuthInfo).profiles);
|
|
54
|
+
}
|
|
55
|
+
} catch { /* auth profiles are optional */ }
|
|
56
|
+
setLoading(false);
|
|
57
|
+
};
|
|
58
|
+
loadConfig();
|
|
59
|
+
}, []);
|
|
60
|
+
|
|
61
|
+
function updateDraft(key: string, value: unknown) {
|
|
62
|
+
if (config && value === config[key]) {
|
|
63
|
+
setDraft((prev) => {
|
|
64
|
+
const next = { ...prev };
|
|
65
|
+
delete next[key];
|
|
66
|
+
return next;
|
|
67
|
+
});
|
|
68
|
+
} else {
|
|
69
|
+
setDraft((prev) => ({ ...prev, [key]: value }));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function currentVal(key: string): unknown {
|
|
74
|
+
return key in draft ? draft[key] : config?.[key];
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const hasChanges = Object.keys(draft).length > 0;
|
|
78
|
+
|
|
79
|
+
async function handleSave() {
|
|
80
|
+
if (!hasChanges) return;
|
|
81
|
+
setSaving(true);
|
|
82
|
+
setMessage(null);
|
|
83
|
+
try {
|
|
84
|
+
const resp = await botFetch("/api/config", {
|
|
85
|
+
method: "PUT",
|
|
86
|
+
headers: { "Content-Type": "application/json" },
|
|
87
|
+
body: JSON.stringify(draft),
|
|
88
|
+
});
|
|
89
|
+
if (!resp.ok) {
|
|
90
|
+
const data = await resp.json().catch(() => ({}));
|
|
91
|
+
throw new Error((data as Record<string, string>).error || `HTTP ${resp.status}`);
|
|
92
|
+
}
|
|
93
|
+
await resp.json();
|
|
94
|
+
// Update auth_profile display if auth was changed
|
|
95
|
+
if (draft.auth) {
|
|
96
|
+
setConfig((prev) => prev ? { ...prev, ...draft, auth_profile: draft.auth as string } : prev);
|
|
97
|
+
} else {
|
|
98
|
+
setConfig((prev) => prev ? { ...prev, ...draft } : prev);
|
|
99
|
+
}
|
|
100
|
+
setDraft({});
|
|
101
|
+
setMessage({ text: "Config updated — bot is restarting...", type: "success" });
|
|
102
|
+
} catch (err) {
|
|
103
|
+
setMessage({ text: err instanceof Error ? err.message : "Save failed", type: "error" });
|
|
104
|
+
} finally {
|
|
105
|
+
setSaving(false);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (loading) {
|
|
110
|
+
return (
|
|
111
|
+
<section>
|
|
112
|
+
<h2 className="text-lg font-semibold text-foreground mb-3">Configuration</h2>
|
|
113
|
+
<Card className="text-sm text-muted-foreground">
|
|
114
|
+
Loading...
|
|
115
|
+
</Card>
|
|
116
|
+
</section>
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (!config) {
|
|
121
|
+
return (
|
|
122
|
+
<section>
|
|
123
|
+
<h2 className="text-lg font-semibold text-foreground mb-3">Configuration</h2>
|
|
124
|
+
<Card className="text-sm text-destructive">
|
|
125
|
+
{message?.text || "Failed to load configuration"}
|
|
126
|
+
</Card>
|
|
127
|
+
</section>
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const authType = config.auth_type;
|
|
132
|
+
const authTypeLabel = authType === "oauth" ? "OAuth" : authType === "api_key" ? "API Key" : "Unknown";
|
|
133
|
+
|
|
134
|
+
return (
|
|
135
|
+
<section>
|
|
136
|
+
<h2 className="text-lg font-semibold text-foreground mb-3">Configuration</h2>
|
|
137
|
+
<Card spacing={4}>
|
|
138
|
+
{/* Name (read-only) */}
|
|
139
|
+
<div className="space-y-1">
|
|
140
|
+
<label className="text-sm text-muted-foreground">Name</label>
|
|
141
|
+
<div className="text-sm text-foreground font-mono">{config.name ?? "—"}</div>
|
|
142
|
+
</div>
|
|
143
|
+
|
|
144
|
+
{/* Model */}
|
|
145
|
+
<div className="space-y-1">
|
|
146
|
+
<label className="text-sm text-muted-foreground">Model</label>
|
|
147
|
+
<Select
|
|
148
|
+
value={(currentVal("model") as string) ?? "sonnet"}
|
|
149
|
+
onChange={(e) => updateDraft("model", e.target.value)}
|
|
150
|
+
className="w-full"
|
|
151
|
+
>
|
|
152
|
+
<option value="sonnet">sonnet</option>
|
|
153
|
+
<option value="opus">opus</option>
|
|
154
|
+
<option value="haiku">haiku</option>
|
|
155
|
+
</Select>
|
|
156
|
+
</div>
|
|
157
|
+
|
|
158
|
+
{/* Max Turns */}
|
|
159
|
+
<div className="space-y-1">
|
|
160
|
+
<label className="text-sm text-muted-foreground">Max Turns</label>
|
|
161
|
+
<Input
|
|
162
|
+
type="number"
|
|
163
|
+
min={1}
|
|
164
|
+
max={100}
|
|
165
|
+
value={(currentVal("max_turns") as number) ?? 25}
|
|
166
|
+
onChange={(e) => {
|
|
167
|
+
const n = Number(e.target.value);
|
|
168
|
+
if (!Number.isFinite(n)) return;
|
|
169
|
+
updateDraft("max_turns", Math.max(1, Math.min(100, n)));
|
|
170
|
+
}}
|
|
171
|
+
className="w-full"
|
|
172
|
+
/>
|
|
173
|
+
</div>
|
|
174
|
+
|
|
175
|
+
{/* Permission Mode */}
|
|
176
|
+
<div className="space-y-1">
|
|
177
|
+
<label className="text-sm text-muted-foreground">Permission Mode</label>
|
|
178
|
+
<Select
|
|
179
|
+
value={(currentVal("permission_mode") as string) ?? "default"}
|
|
180
|
+
onChange={(e) => updateDraft("permission_mode", e.target.value)}
|
|
181
|
+
className="w-full"
|
|
182
|
+
>
|
|
183
|
+
<option value="default">default</option>
|
|
184
|
+
<option value="acceptEdits">acceptEdits</option>
|
|
185
|
+
<option value="bypassPermissions">bypassPermissions</option>
|
|
186
|
+
<option value="plan">plan</option>
|
|
187
|
+
<option value="dontAsk">dontAsk</option>
|
|
188
|
+
</Select>
|
|
189
|
+
</div>
|
|
190
|
+
|
|
191
|
+
{/* Auth Profile */}
|
|
192
|
+
{authProfiles.length > 0 && (
|
|
193
|
+
<div className="space-y-1">
|
|
194
|
+
<label className="text-sm text-muted-foreground">Auth Profile <span className="text-xs text-muted-foreground/60">({authTypeLabel})</span></label>
|
|
195
|
+
<Select
|
|
196
|
+
value={(currentVal("auth") as string) ?? config.auth_profile ?? ""}
|
|
197
|
+
onChange={(e) => {
|
|
198
|
+
const val = e.target.value;
|
|
199
|
+
if (val === (config.auth_profile ?? "")) {
|
|
200
|
+
setDraft((prev) => { const next = { ...prev }; delete next.auth; return next; });
|
|
201
|
+
} else {
|
|
202
|
+
updateDraft("auth", val);
|
|
203
|
+
}
|
|
204
|
+
}}
|
|
205
|
+
className="w-full"
|
|
206
|
+
>
|
|
207
|
+
{!config.auth_profile && <option value="">Select profile...</option>}
|
|
208
|
+
{authProfiles.map((p) => (
|
|
209
|
+
<option key={p.name} value={p.name}>
|
|
210
|
+
{p.name} ({p.type === "oauth_token" ? "OAuth" : "API Key"})
|
|
211
|
+
</option>
|
|
212
|
+
))}
|
|
213
|
+
</Select>
|
|
214
|
+
</div>
|
|
215
|
+
)}
|
|
216
|
+
|
|
217
|
+
{authProfiles.length === 0 && (
|
|
218
|
+
<div className="space-y-1">
|
|
219
|
+
<label className="text-sm text-muted-foreground">Auth Profile</label>
|
|
220
|
+
<div className="text-sm text-foreground font-mono">{config.auth_profile ?? "—"} <span className="text-muted-foreground font-sans text-xs">({authTypeLabel})</span></div>
|
|
221
|
+
</div>
|
|
222
|
+
)}
|
|
223
|
+
|
|
224
|
+
{/* System Prompt */}
|
|
225
|
+
<div className="space-y-1">
|
|
226
|
+
<button
|
|
227
|
+
type="button"
|
|
228
|
+
onClick={() => setSystemExpanded(!systemExpanded)}
|
|
229
|
+
className="flex items-center gap-1.5 text-sm text-muted-foreground hover:text-foreground transition-colors"
|
|
230
|
+
>
|
|
231
|
+
<span className="text-xs">{systemExpanded ? "v" : ">"}</span>
|
|
232
|
+
System Prompt
|
|
233
|
+
</button>
|
|
234
|
+
{systemExpanded && (
|
|
235
|
+
<Textarea
|
|
236
|
+
mono
|
|
237
|
+
rows={6}
|
|
238
|
+
value={(currentVal("system") as string) ?? ""}
|
|
239
|
+
onChange={(e) => updateDraft("system", e.target.value)}
|
|
240
|
+
className="w-full"
|
|
241
|
+
/>
|
|
242
|
+
)}
|
|
243
|
+
</div>
|
|
244
|
+
|
|
245
|
+
{/* Save button */}
|
|
246
|
+
<div className="pt-2 border-t border-border">
|
|
247
|
+
<Button
|
|
248
|
+
size="lg"
|
|
249
|
+
onClick={handleSave}
|
|
250
|
+
disabled={!hasChanges || saving}
|
|
251
|
+
>
|
|
252
|
+
{saving ? "Saving..." : "Save & Restart"}
|
|
253
|
+
</Button>
|
|
254
|
+
</div>
|
|
255
|
+
|
|
256
|
+
{/* Status message */}
|
|
257
|
+
{message && (
|
|
258
|
+
<Alert variant={message.type}>
|
|
259
|
+
{message.text}
|
|
260
|
+
</Alert>
|
|
261
|
+
)}
|
|
262
|
+
</Card>
|
|
263
|
+
</section>
|
|
264
|
+
);
|
|
265
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { useState, useEffect, useRef, useCallback } from "react";
|
|
2
|
+
import { botFetch } from "../lib/api";
|
|
3
|
+
import { Button, Select } from "../components";
|
|
4
|
+
|
|
5
|
+
interface LogEntry {
|
|
6
|
+
type: string;
|
|
7
|
+
timestamp: string;
|
|
8
|
+
[key: string]: unknown;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export default function EventLog() {
|
|
12
|
+
const [logs, setLogs] = useState<LogEntry[]>([]);
|
|
13
|
+
const [filter, setFilter] = useState("");
|
|
14
|
+
const [loading, setLoading] = useState(true);
|
|
15
|
+
const [fetchError, setFetchError] = useState<string | null>(null);
|
|
16
|
+
const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);
|
|
17
|
+
|
|
18
|
+
const fetchLogs = useCallback(async (showLoading = false) => {
|
|
19
|
+
if (showLoading) setLoading(true);
|
|
20
|
+
try {
|
|
21
|
+
const r = await botFetch("/api/logs?limit=100");
|
|
22
|
+
if (!r.ok) throw new Error(`HTTP ${r.status}`);
|
|
23
|
+
const data = await r.json();
|
|
24
|
+
if (Array.isArray(data)) setLogs((data as LogEntry[]).reverse());
|
|
25
|
+
setFetchError(null);
|
|
26
|
+
} catch (err) {
|
|
27
|
+
setFetchError(err instanceof Error ? err.message : "Failed to load logs");
|
|
28
|
+
} finally {
|
|
29
|
+
setLoading(false);
|
|
30
|
+
}
|
|
31
|
+
}, []);
|
|
32
|
+
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
fetchLogs(true);
|
|
35
|
+
intervalRef.current = setInterval(() => fetchLogs(), 10_000);
|
|
36
|
+
return () => {
|
|
37
|
+
if (intervalRef.current) clearInterval(intervalRef.current);
|
|
38
|
+
};
|
|
39
|
+
}, [fetchLogs]);
|
|
40
|
+
|
|
41
|
+
const eventTypes = Array.from(new Set(logs.map((l) => l.type))).sort();
|
|
42
|
+
const filtered = filter ? logs.filter((l) => l.type === filter) : logs;
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
<section>
|
|
46
|
+
<div className="flex items-center justify-between mb-3">
|
|
47
|
+
<h2 className="text-lg font-semibold text-foreground">Event Log</h2>
|
|
48
|
+
<div className="flex items-center gap-2">
|
|
49
|
+
<Select
|
|
50
|
+
compact
|
|
51
|
+
value={filter}
|
|
52
|
+
onChange={(e) => setFilter(e.target.value)}
|
|
53
|
+
>
|
|
54
|
+
<option value="">All</option>
|
|
55
|
+
{eventTypes.map((t) => (
|
|
56
|
+
<option key={t} value={t}>{t}</option>
|
|
57
|
+
))}
|
|
58
|
+
</Select>
|
|
59
|
+
<Button
|
|
60
|
+
variant="secondary"
|
|
61
|
+
size="xs"
|
|
62
|
+
onClick={() => fetchLogs(true)}
|
|
63
|
+
>
|
|
64
|
+
Refresh
|
|
65
|
+
</Button>
|
|
66
|
+
</div>
|
|
67
|
+
</div>
|
|
68
|
+
<div className="space-y-1 font-mono text-sm max-h-96 overflow-y-auto scrollbar-thin">
|
|
69
|
+
{loading && <p className="text-muted-foreground">Loading...</p>}
|
|
70
|
+
{!loading && fetchError && <p className="text-destructive">{fetchError}</p>}
|
|
71
|
+
{!loading && !fetchError && filtered.length === 0 && <p className="text-muted-foreground">No events</p>}
|
|
72
|
+
{!loading && filtered.map((entry, i) => (
|
|
73
|
+
<div key={`${entry.timestamp}-${entry.type}-${i}`} className="flex gap-3 py-1 border-b border-border/50">
|
|
74
|
+
<span className="text-muted-foreground shrink-0">
|
|
75
|
+
{new Date(entry.timestamp).toLocaleTimeString()}
|
|
76
|
+
</span>
|
|
77
|
+
<span
|
|
78
|
+
className={`shrink-0 ${
|
|
79
|
+
entry.type === "mecha_call"
|
|
80
|
+
? "text-primary"
|
|
81
|
+
: entry.type === "error"
|
|
82
|
+
? "text-destructive"
|
|
83
|
+
: "text-muted-foreground"
|
|
84
|
+
}`}
|
|
85
|
+
>
|
|
86
|
+
{entry.type}
|
|
87
|
+
</span>
|
|
88
|
+
<span className="text-foreground truncate">
|
|
89
|
+
{Object.entries(entry)
|
|
90
|
+
.filter(([k]) => k !== "type" && k !== "timestamp")
|
|
91
|
+
.map(([k, v]) => `${k}=${JSON.stringify(v)}`)
|
|
92
|
+
.join(" ")}
|
|
93
|
+
</span>
|
|
94
|
+
</div>
|
|
95
|
+
))}
|
|
96
|
+
</div>
|
|
97
|
+
</section>
|
|
98
|
+
);
|
|
99
|
+
}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { useState, useEffect, useRef, useCallback } from "react";
|
|
2
|
+
import { botFetch, botUrl } from "../lib/api";
|
|
3
|
+
import { Card, StatusDot } from "../components";
|
|
4
|
+
|
|
5
|
+
interface BotStatus {
|
|
6
|
+
name: string;
|
|
7
|
+
state: string;
|
|
8
|
+
model: string;
|
|
9
|
+
uptime: number;
|
|
10
|
+
current_task: string | null;
|
|
11
|
+
current_session_id: string | null;
|
|
12
|
+
talking_to: string | null;
|
|
13
|
+
last_active: string | null;
|
|
14
|
+
versions?: Record<string, string>;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const VERSION_LABELS = [
|
|
18
|
+
{ key: "claude_code", label: "Claude Code CLI" },
|
|
19
|
+
{ key: "claude_agent_sdk_js", label: "Agent SDK (JS)" },
|
|
20
|
+
{ key: "claude_agent_sdk_py", label: "Agent SDK (Python)" },
|
|
21
|
+
{ key: "codex", label: "Codex CLI" },
|
|
22
|
+
{ key: "gemini_cli", label: "Gemini CLI" },
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
const STATE_COLORS: Record<string, "green" | "yellow" | "red" | "muted"> = {
|
|
26
|
+
idle: "green",
|
|
27
|
+
thinking: "yellow",
|
|
28
|
+
calling: "yellow",
|
|
29
|
+
scheduled: "yellow",
|
|
30
|
+
webhook: "yellow",
|
|
31
|
+
error: "red",
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
function stateColor(state: string): "green" | "yellow" | "red" | "muted" {
|
|
35
|
+
return STATE_COLORS[state] ?? "muted";
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function formatUptime(seconds: number): string {
|
|
39
|
+
const h = Math.floor(seconds / 3600);
|
|
40
|
+
const m = Math.floor((seconds % 3600) / 60);
|
|
41
|
+
const s = Math.floor(seconds % 60);
|
|
42
|
+
const parts: string[] = [];
|
|
43
|
+
if (h > 0) parts.push(`${h}h`);
|
|
44
|
+
if (m > 0) parts.push(`${m}m`);
|
|
45
|
+
if (s > 0 || parts.length === 0) parts.push(`${s}s`);
|
|
46
|
+
return parts.join(" ");
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function formatRelative(isoOrNull: string | null): string {
|
|
50
|
+
if (!isoOrNull) return "never";
|
|
51
|
+
const ts = new Date(isoOrNull).getTime();
|
|
52
|
+
if (isNaN(ts)) return "never";
|
|
53
|
+
const diff = Math.floor((Date.now() - ts) / 1000);
|
|
54
|
+
if (diff < 5) return "just now";
|
|
55
|
+
if (diff < 60) return `${diff}s ago`;
|
|
56
|
+
if (diff < 3600) return `${Math.floor(diff / 60)}m ago`;
|
|
57
|
+
if (diff < 86400) return `${Math.floor(diff / 3600)}h ago`;
|
|
58
|
+
return `${Math.floor(diff / 86400)}d ago`;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export default function StatusCard() {
|
|
62
|
+
const [status, setStatus] = useState<BotStatus | null>(null);
|
|
63
|
+
const [error, setError] = useState<string | null>(null);
|
|
64
|
+
const [, setTick] = useState(0);
|
|
65
|
+
const uptimeBaseRef = useRef<{ serverUptime: number; fetchedAt: number } | null>(null);
|
|
66
|
+
const pollRef = useRef<ReturnType<typeof setInterval> | null>(null);
|
|
67
|
+
const tickRef = useRef<ReturnType<typeof setInterval> | null>(null);
|
|
68
|
+
|
|
69
|
+
const fetchStatus = useCallback(async () => {
|
|
70
|
+
try {
|
|
71
|
+
const r = await botFetch("/api/status");
|
|
72
|
+
if (!r.ok) throw new Error(`HTTP ${r.status}`);
|
|
73
|
+
const data = await r.json() as BotStatus;
|
|
74
|
+
uptimeBaseRef.current = { serverUptime: data.uptime, fetchedAt: Date.now() / 1000 };
|
|
75
|
+
setStatus(data);
|
|
76
|
+
setError(null);
|
|
77
|
+
} catch (e) {
|
|
78
|
+
setError(e instanceof Error ? e.message : "Fetch failed");
|
|
79
|
+
}
|
|
80
|
+
}, []);
|
|
81
|
+
|
|
82
|
+
const stopPolling = useCallback(() => {
|
|
83
|
+
if (pollRef.current) {
|
|
84
|
+
clearInterval(pollRef.current);
|
|
85
|
+
pollRef.current = null;
|
|
86
|
+
}
|
|
87
|
+
}, []);
|
|
88
|
+
|
|
89
|
+
const startPolling = useCallback(() => {
|
|
90
|
+
stopPolling();
|
|
91
|
+
pollRef.current = setInterval(fetchStatus, 5000);
|
|
92
|
+
}, [fetchStatus, stopPolling]);
|
|
93
|
+
|
|
94
|
+
useEffect(() => {
|
|
95
|
+
fetchStatus();
|
|
96
|
+
|
|
97
|
+
const es = new EventSource(botUrl("/api/status/stream"));
|
|
98
|
+
|
|
99
|
+
const handleSSE = (e: MessageEvent) => {
|
|
100
|
+
try {
|
|
101
|
+
const data = JSON.parse(e.data);
|
|
102
|
+
// Normalize camelCase SSE fields to snake_case BotStatus
|
|
103
|
+
const normalized: Partial<BotStatus> = {};
|
|
104
|
+
// snapshot sends "activity", state events send "state"
|
|
105
|
+
if (data.state) normalized.state = data.state;
|
|
106
|
+
else if (data.activity) normalized.state = data.activity;
|
|
107
|
+
if ("talkingTo" in data) normalized.talking_to = data.talkingTo;
|
|
108
|
+
if ("lastActive" in data) normalized.last_active = data.lastActive;
|
|
109
|
+
if ("talking_to" in data) normalized.talking_to = data.talking_to;
|
|
110
|
+
if ("last_active" in data) normalized.last_active = data.last_active;
|
|
111
|
+
setStatus((prev) => prev ? { ...prev, ...normalized } : null);
|
|
112
|
+
setError(null);
|
|
113
|
+
stopPolling();
|
|
114
|
+
} catch {}
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
es.addEventListener("state", handleSSE);
|
|
118
|
+
es.addEventListener("snapshot", handleSSE);
|
|
119
|
+
|
|
120
|
+
es.onopen = () => stopPolling();
|
|
121
|
+
es.onerror = () => {
|
|
122
|
+
if (!pollRef.current) startPolling();
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
tickRef.current = setInterval(() => setTick((t) => t + 1), 1000);
|
|
126
|
+
|
|
127
|
+
return () => {
|
|
128
|
+
es.close();
|
|
129
|
+
stopPolling();
|
|
130
|
+
if (tickRef.current) clearInterval(tickRef.current);
|
|
131
|
+
};
|
|
132
|
+
}, [fetchStatus, startPolling, stopPolling]);
|
|
133
|
+
|
|
134
|
+
if (error && !status) {
|
|
135
|
+
return (
|
|
136
|
+
<Card>
|
|
137
|
+
<h2 className="text-lg font-semibold text-foreground mb-2">Status</h2>
|
|
138
|
+
<p className="text-sm text-destructive">{error}</p>
|
|
139
|
+
</Card>
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (!status) {
|
|
144
|
+
return (
|
|
145
|
+
<Card>
|
|
146
|
+
<h2 className="text-lg font-semibold text-foreground mb-2">Status</h2>
|
|
147
|
+
<p className="text-sm text-muted-foreground">Loading...</p>
|
|
148
|
+
</Card>
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const liveUptime = uptimeBaseRef.current
|
|
153
|
+
? uptimeBaseRef.current.serverUptime + (Date.now() / 1000 - uptimeBaseRef.current.fetchedAt)
|
|
154
|
+
: status.uptime;
|
|
155
|
+
const displayUptime = formatUptime(liveUptime > 0 ? liveUptime : 0);
|
|
156
|
+
|
|
157
|
+
return (
|
|
158
|
+
<Card>
|
|
159
|
+
<h2 className="text-lg font-semibold text-foreground mb-3">Status</h2>
|
|
160
|
+
<div className="flex items-center justify-between mb-2">
|
|
161
|
+
<div className="flex items-center gap-2">
|
|
162
|
+
<StatusDot color={stateColor(status.state)} />
|
|
163
|
+
<span className="text-sm font-medium text-foreground capitalize">{status.state}</span>
|
|
164
|
+
</div>
|
|
165
|
+
<span className="text-sm text-muted-foreground">
|
|
166
|
+
Uptime: <span className="text-foreground font-mono">{displayUptime}</span>
|
|
167
|
+
</span>
|
|
168
|
+
</div>
|
|
169
|
+
<div className="flex items-center justify-between mb-3">
|
|
170
|
+
<span className="text-sm text-muted-foreground">
|
|
171
|
+
Model: <span className="text-foreground font-mono">{status.model || "unknown"}</span>
|
|
172
|
+
</span>
|
|
173
|
+
<span className="text-sm text-muted-foreground">
|
|
174
|
+
Last active: <span className="text-foreground font-mono">{formatRelative(status.last_active)}</span>
|
|
175
|
+
</span>
|
|
176
|
+
</div>
|
|
177
|
+
{status.versions && (
|
|
178
|
+
<div className="pt-2 border-t border-border mb-3">
|
|
179
|
+
<h3 className="text-sm font-medium text-foreground mb-2">Installed Packages</h3>
|
|
180
|
+
<div className="space-y-1">
|
|
181
|
+
{VERSION_LABELS.map(({ key, label }) => {
|
|
182
|
+
const ver = status.versions?.[key];
|
|
183
|
+
if (!ver) return null;
|
|
184
|
+
const installed = ver !== "not installed";
|
|
185
|
+
return (
|
|
186
|
+
<div key={key} className="flex items-center justify-between">
|
|
187
|
+
<span className="text-xs text-muted-foreground">{label}</span>
|
|
188
|
+
<span className={`text-xs font-mono ${installed ? "text-foreground" : "text-muted-foreground"}`}>
|
|
189
|
+
{ver}
|
|
190
|
+
</span>
|
|
191
|
+
</div>
|
|
192
|
+
);
|
|
193
|
+
})}
|
|
194
|
+
</div>
|
|
195
|
+
</div>
|
|
196
|
+
)}
|
|
197
|
+
<div className="pt-2 border-t border-border">
|
|
198
|
+
{status.current_task ? (
|
|
199
|
+
<div className="flex items-center gap-2 text-sm">
|
|
200
|
+
<span className="text-muted-foreground">Task</span>
|
|
201
|
+
<span className="font-mono text-foreground">{status.current_task.slice(0, 8)}</span>
|
|
202
|
+
{status.talking_to && (
|
|
203
|
+
<>
|
|
204
|
+
<span className="text-muted-foreground">with</span>
|
|
205
|
+
<span className="font-mono text-foreground">{status.talking_to}</span>
|
|
206
|
+
</>
|
|
207
|
+
)}
|
|
208
|
+
</div>
|
|
209
|
+
) : (
|
|
210
|
+
<p className="text-sm text-muted-foreground">No active task</p>
|
|
211
|
+
)}
|
|
212
|
+
</div>
|
|
213
|
+
</Card>
|
|
214
|
+
);
|
|
215
|
+
}
|