@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.
Files changed (691) hide show
  1. package/Dockerfile +103 -0
  2. package/README.md +173 -0
  3. package/agent/activity.ts +31 -0
  4. package/agent/costs.ts +93 -0
  5. package/agent/dashboard/dist/assets/addon-fit-YJmn1quW.js +12 -0
  6. package/agent/dashboard/dist/assets/addon-web-links-BWjmmSgS.js +12 -0
  7. package/agent/dashboard/dist/assets/index-B4OKDQ7e.css +32 -0
  8. package/agent/dashboard/dist/assets/index-fZ_N6Wsi.js +193 -0
  9. package/agent/dashboard/dist/assets/xterm-BqvuqXEL.js +27 -0
  10. package/agent/dashboard/dist/index.html +19 -0
  11. package/agent/dashboard/dist/pixel-engine/characters/char_0.png +0 -0
  12. package/agent/dashboard/dist/pixel-engine/characters/char_1.png +0 -0
  13. package/agent/dashboard/dist/pixel-engine/characters/char_2.png +0 -0
  14. package/agent/dashboard/dist/pixel-engine/characters/char_3.png +0 -0
  15. package/agent/dashboard/dist/pixel-engine/characters/char_4.png +0 -0
  16. package/agent/dashboard/dist/pixel-engine/characters/char_5.png +0 -0
  17. package/agent/dashboard/dist/pixel-engine/default-layout.json +4320 -0
  18. package/agent/dashboard/dist/pixel-engine/floors/floor_0.png +0 -0
  19. package/agent/dashboard/dist/pixel-engine/floors/floor_1.png +0 -0
  20. package/agent/dashboard/dist/pixel-engine/floors/floor_2.png +0 -0
  21. package/agent/dashboard/dist/pixel-engine/floors/floor_3.png +0 -0
  22. package/agent/dashboard/dist/pixel-engine/floors/floor_4.png +0 -0
  23. package/agent/dashboard/dist/pixel-engine/floors/floor_5.png +0 -0
  24. package/agent/dashboard/dist/pixel-engine/floors/floor_6.png +0 -0
  25. package/agent/dashboard/dist/pixel-engine/floors/floor_7.png +0 -0
  26. package/agent/dashboard/dist/pixel-engine/floors/floor_8.png +0 -0
  27. package/agent/dashboard/dist/pixel-engine/fonts/FSPixelSansUnicode-Regular.ttf +0 -0
  28. package/agent/dashboard/dist/pixel-engine/furniture/BIN/BIN.png +0 -0
  29. package/agent/dashboard/dist/pixel-engine/furniture/BIN/manifest.json +13 -0
  30. package/agent/dashboard/dist/pixel-engine/furniture/BLACKBOARD/BLACKBOARD.png +0 -0
  31. package/agent/dashboard/dist/pixel-engine/furniture/BLACKBOARD/manifest.json +16 -0
  32. package/agent/dashboard/dist/pixel-engine/furniture/BOOKSHELF/BOOKSHELF.png +0 -0
  33. package/agent/dashboard/dist/pixel-engine/furniture/BOOKSHELF/manifest.json +16 -0
  34. package/agent/dashboard/dist/pixel-engine/furniture/CACTUS/CACTUS.png +0 -0
  35. package/agent/dashboard/dist/pixel-engine/furniture/CACTUS/manifest.json +13 -0
  36. package/agent/dashboard/dist/pixel-engine/furniture/CLOCK/CLOCK.png +0 -0
  37. package/agent/dashboard/dist/pixel-engine/furniture/CLOCK/manifest.json +13 -0
  38. package/agent/dashboard/dist/pixel-engine/furniture/COFFEE/COFFEE.png +0 -0
  39. package/agent/dashboard/dist/pixel-engine/furniture/COFFEE/manifest.json +13 -0
  40. package/agent/dashboard/dist/pixel-engine/furniture/COFFEE_TABLE/COFFEE_TABLE.png +0 -0
  41. package/agent/dashboard/dist/pixel-engine/furniture/COFFEE_TABLE/manifest.json +13 -0
  42. package/agent/dashboard/dist/pixel-engine/furniture/CUSHIONED_BENCH/CUSHIONED_BENCH.png +0 -0
  43. package/agent/dashboard/dist/pixel-engine/furniture/CUSHIONED_BENCH/manifest.json +13 -0
  44. package/agent/dashboard/dist/pixel-engine/furniture/CUSHIONED_CHAIR/CUSHIONED_CHAIR_BACK.png +0 -0
  45. package/agent/dashboard/dist/pixel-engine/furniture/CUSHIONED_CHAIR/CUSHIONED_CHAIR_FRONT.png +0 -0
  46. package/agent/dashboard/dist/pixel-engine/furniture/CUSHIONED_CHAIR/CUSHIONED_CHAIR_SIDE.png +0 -0
  47. package/agent/dashboard/dist/pixel-engine/furniture/CUSHIONED_CHAIR/manifest.json +44 -0
  48. package/agent/dashboard/dist/pixel-engine/furniture/DESK/DESK_FRONT.png +0 -0
  49. package/agent/dashboard/dist/pixel-engine/furniture/DESK/DESK_SIDE.png +0 -0
  50. package/agent/dashboard/dist/pixel-engine/furniture/DESK/manifest.json +33 -0
  51. package/agent/dashboard/dist/pixel-engine/furniture/DOUBLE_BOOKSHELF/DOUBLE_BOOKSHELF.png +0 -0
  52. package/agent/dashboard/dist/pixel-engine/furniture/DOUBLE_BOOKSHELF/manifest.json +16 -0
  53. package/agent/dashboard/dist/pixel-engine/furniture/FILE_BOXES_1/FILE_BOXES_1.png +0 -0
  54. package/agent/dashboard/dist/pixel-engine/furniture/FILE_BOXES_1/manifest.json +13 -0
  55. package/agent/dashboard/dist/pixel-engine/furniture/FILE_BOXES_2/FILE_BOXES_2.png +0 -0
  56. package/agent/dashboard/dist/pixel-engine/furniture/FILE_BOXES_2/manifest.json +13 -0
  57. package/agent/dashboard/dist/pixel-engine/furniture/HANGING_PLANT/HANGING_PLANT.png +0 -0
  58. package/agent/dashboard/dist/pixel-engine/furniture/HANGING_PLANT/manifest.json +13 -0
  59. package/agent/dashboard/dist/pixel-engine/furniture/LARGE_PAINTING/LARGE_PAINTING.png +0 -0
  60. package/agent/dashboard/dist/pixel-engine/furniture/LARGE_PAINTING/manifest.json +13 -0
  61. package/agent/dashboard/dist/pixel-engine/furniture/LARGE_PLANT/LARGE_PLANT.png +0 -0
  62. package/agent/dashboard/dist/pixel-engine/furniture/LARGE_PLANT/manifest.json +13 -0
  63. package/agent/dashboard/dist/pixel-engine/furniture/PC/PC_BACK.png +0 -0
  64. package/agent/dashboard/dist/pixel-engine/furniture/PC/PC_FRONT_OFF.png +0 -0
  65. package/agent/dashboard/dist/pixel-engine/furniture/PC/PC_FRONT_ON_1.png +0 -0
  66. package/agent/dashboard/dist/pixel-engine/furniture/PC/PC_FRONT_ON_2.png +0 -0
  67. package/agent/dashboard/dist/pixel-engine/furniture/PC/PC_FRONT_ON_3.png +0 -0
  68. package/agent/dashboard/dist/pixel-engine/furniture/PC/PC_SIDE.png +0 -0
  69. package/agent/dashboard/dist/pixel-engine/furniture/PC/manifest.json +88 -0
  70. package/agent/dashboard/dist/pixel-engine/furniture/PLANT/PLANT.png +0 -0
  71. package/agent/dashboard/dist/pixel-engine/furniture/PLANT/manifest.json +13 -0
  72. package/agent/dashboard/dist/pixel-engine/furniture/PLANT_2/PLANT_2.png +0 -0
  73. package/agent/dashboard/dist/pixel-engine/furniture/PLANT_2/manifest.json +13 -0
  74. package/agent/dashboard/dist/pixel-engine/furniture/POT/POT.png +0 -0
  75. package/agent/dashboard/dist/pixel-engine/furniture/POT/manifest.json +13 -0
  76. package/agent/dashboard/dist/pixel-engine/furniture/SMALL_PAINTING/SMALL_PAINTING.png +0 -0
  77. package/agent/dashboard/dist/pixel-engine/furniture/SMALL_PAINTING/manifest.json +13 -0
  78. package/agent/dashboard/dist/pixel-engine/furniture/SMALL_PAINTING_2/SMALL_PAINTING_2.png +0 -0
  79. package/agent/dashboard/dist/pixel-engine/furniture/SMALL_PAINTING_2/manifest.json +13 -0
  80. package/agent/dashboard/dist/pixel-engine/furniture/SMALL_TABLE/SMALL_TABLE_FRONT.png +0 -0
  81. package/agent/dashboard/dist/pixel-engine/furniture/SMALL_TABLE/SMALL_TABLE_SIDE.png +0 -0
  82. package/agent/dashboard/dist/pixel-engine/furniture/SMALL_TABLE/manifest.json +33 -0
  83. package/agent/dashboard/dist/pixel-engine/furniture/SOFA/SOFA_BACK.png +0 -0
  84. package/agent/dashboard/dist/pixel-engine/furniture/SOFA/SOFA_FRONT.png +0 -0
  85. package/agent/dashboard/dist/pixel-engine/furniture/SOFA/SOFA_SIDE.png +0 -0
  86. package/agent/dashboard/dist/pixel-engine/furniture/SOFA/manifest.json +44 -0
  87. package/agent/dashboard/dist/pixel-engine/furniture/TABLE_FRONT/TABLE_FRONT.png +0 -0
  88. package/agent/dashboard/dist/pixel-engine/furniture/TABLE_FRONT/manifest.json +13 -0
  89. package/agent/dashboard/dist/pixel-engine/furniture/VENDER_MACHINE/VENDER_MACHINE.png +0 -0
  90. package/agent/dashboard/dist/pixel-engine/furniture/VENDER_MACHINE/manifest.json +16 -0
  91. package/agent/dashboard/dist/pixel-engine/furniture/WATER_MACHINE/WATER_MACHINE.png +0 -0
  92. package/agent/dashboard/dist/pixel-engine/furniture/WATER_MACHINE/manifest.json +16 -0
  93. package/agent/dashboard/dist/pixel-engine/furniture/WHITEBOARD/WHITEBOARD.png +0 -0
  94. package/agent/dashboard/dist/pixel-engine/furniture/WHITEBOARD/manifest.json +16 -0
  95. package/agent/dashboard/dist/pixel-engine/furniture/WOODEN_BENCH/WOODEN_BENCH.png +0 -0
  96. package/agent/dashboard/dist/pixel-engine/furniture/WOODEN_BENCH/manifest.json +13 -0
  97. package/agent/dashboard/dist/pixel-engine/furniture/WOODEN_CHAIR/WOODEN_CHAIR_BACK.png +0 -0
  98. package/agent/dashboard/dist/pixel-engine/furniture/WOODEN_CHAIR/WOODEN_CHAIR_FRONT.png +0 -0
  99. package/agent/dashboard/dist/pixel-engine/furniture/WOODEN_CHAIR/WOODEN_CHAIR_SIDE.png +0 -0
  100. package/agent/dashboard/dist/pixel-engine/furniture/WOODEN_CHAIR/manifest.json +44 -0
  101. package/agent/dashboard/dist/pixel-engine/furniture/index.json +32 -0
  102. package/agent/dashboard/dist/pixel-engine/walls/wall_0.png +0 -0
  103. package/agent/dashboard/index.html +18 -0
  104. package/agent/dashboard/package.json +41 -0
  105. package/agent/dashboard/public/pixel-engine/CREDITS.md +17 -0
  106. package/agent/dashboard/public/pixel-engine/characters/char_0.png +0 -0
  107. package/agent/dashboard/public/pixel-engine/characters/char_1.png +0 -0
  108. package/agent/dashboard/public/pixel-engine/characters/char_2.png +0 -0
  109. package/agent/dashboard/public/pixel-engine/characters/char_3.png +0 -0
  110. package/agent/dashboard/public/pixel-engine/characters/char_4.png +0 -0
  111. package/agent/dashboard/public/pixel-engine/characters/char_5.png +0 -0
  112. package/agent/dashboard/public/pixel-engine/default-layout.json +4320 -0
  113. package/agent/dashboard/public/pixel-engine/floors/floor_0.png +0 -0
  114. package/agent/dashboard/public/pixel-engine/floors/floor_1.png +0 -0
  115. package/agent/dashboard/public/pixel-engine/floors/floor_2.png +0 -0
  116. package/agent/dashboard/public/pixel-engine/floors/floor_3.png +0 -0
  117. package/agent/dashboard/public/pixel-engine/floors/floor_4.png +0 -0
  118. package/agent/dashboard/public/pixel-engine/floors/floor_5.png +0 -0
  119. package/agent/dashboard/public/pixel-engine/floors/floor_6.png +0 -0
  120. package/agent/dashboard/public/pixel-engine/floors/floor_7.png +0 -0
  121. package/agent/dashboard/public/pixel-engine/floors/floor_8.png +0 -0
  122. package/agent/dashboard/public/pixel-engine/fonts/FSPixelSansUnicode-Regular.ttf +0 -0
  123. package/agent/dashboard/public/pixel-engine/furniture/BIN/BIN.png +0 -0
  124. package/agent/dashboard/public/pixel-engine/furniture/BIN/manifest.json +13 -0
  125. package/agent/dashboard/public/pixel-engine/furniture/BLACKBOARD/BLACKBOARD.png +0 -0
  126. package/agent/dashboard/public/pixel-engine/furniture/BLACKBOARD/manifest.json +16 -0
  127. package/agent/dashboard/public/pixel-engine/furniture/BOOKSHELF/BOOKSHELF.png +0 -0
  128. package/agent/dashboard/public/pixel-engine/furniture/BOOKSHELF/manifest.json +16 -0
  129. package/agent/dashboard/public/pixel-engine/furniture/CACTUS/CACTUS.png +0 -0
  130. package/agent/dashboard/public/pixel-engine/furniture/CACTUS/manifest.json +13 -0
  131. package/agent/dashboard/public/pixel-engine/furniture/CLOCK/CLOCK.png +0 -0
  132. package/agent/dashboard/public/pixel-engine/furniture/CLOCK/manifest.json +13 -0
  133. package/agent/dashboard/public/pixel-engine/furniture/COFFEE/COFFEE.png +0 -0
  134. package/agent/dashboard/public/pixel-engine/furniture/COFFEE/manifest.json +13 -0
  135. package/agent/dashboard/public/pixel-engine/furniture/COFFEE_TABLE/COFFEE_TABLE.png +0 -0
  136. package/agent/dashboard/public/pixel-engine/furniture/COFFEE_TABLE/manifest.json +13 -0
  137. package/agent/dashboard/public/pixel-engine/furniture/CUSHIONED_BENCH/CUSHIONED_BENCH.png +0 -0
  138. package/agent/dashboard/public/pixel-engine/furniture/CUSHIONED_BENCH/manifest.json +13 -0
  139. package/agent/dashboard/public/pixel-engine/furniture/CUSHIONED_CHAIR/CUSHIONED_CHAIR_BACK.png +0 -0
  140. package/agent/dashboard/public/pixel-engine/furniture/CUSHIONED_CHAIR/CUSHIONED_CHAIR_FRONT.png +0 -0
  141. package/agent/dashboard/public/pixel-engine/furniture/CUSHIONED_CHAIR/CUSHIONED_CHAIR_SIDE.png +0 -0
  142. package/agent/dashboard/public/pixel-engine/furniture/CUSHIONED_CHAIR/manifest.json +44 -0
  143. package/agent/dashboard/public/pixel-engine/furniture/DESK/DESK_FRONT.png +0 -0
  144. package/agent/dashboard/public/pixel-engine/furniture/DESK/DESK_SIDE.png +0 -0
  145. package/agent/dashboard/public/pixel-engine/furniture/DESK/manifest.json +33 -0
  146. package/agent/dashboard/public/pixel-engine/furniture/DOUBLE_BOOKSHELF/DOUBLE_BOOKSHELF.png +0 -0
  147. package/agent/dashboard/public/pixel-engine/furniture/DOUBLE_BOOKSHELF/manifest.json +16 -0
  148. package/agent/dashboard/public/pixel-engine/furniture/FILE_BOXES_1/FILE_BOXES_1.png +0 -0
  149. package/agent/dashboard/public/pixel-engine/furniture/FILE_BOXES_1/manifest.json +13 -0
  150. package/agent/dashboard/public/pixel-engine/furniture/FILE_BOXES_2/FILE_BOXES_2.png +0 -0
  151. package/agent/dashboard/public/pixel-engine/furniture/FILE_BOXES_2/manifest.json +13 -0
  152. package/agent/dashboard/public/pixel-engine/furniture/HANGING_PLANT/HANGING_PLANT.png +0 -0
  153. package/agent/dashboard/public/pixel-engine/furniture/HANGING_PLANT/manifest.json +13 -0
  154. package/agent/dashboard/public/pixel-engine/furniture/LARGE_PAINTING/LARGE_PAINTING.png +0 -0
  155. package/agent/dashboard/public/pixel-engine/furniture/LARGE_PAINTING/manifest.json +13 -0
  156. package/agent/dashboard/public/pixel-engine/furniture/LARGE_PLANT/LARGE_PLANT.png +0 -0
  157. package/agent/dashboard/public/pixel-engine/furniture/LARGE_PLANT/manifest.json +13 -0
  158. package/agent/dashboard/public/pixel-engine/furniture/PC/PC_BACK.png +0 -0
  159. package/agent/dashboard/public/pixel-engine/furniture/PC/PC_FRONT_OFF.png +0 -0
  160. package/agent/dashboard/public/pixel-engine/furniture/PC/PC_FRONT_ON_1.png +0 -0
  161. package/agent/dashboard/public/pixel-engine/furniture/PC/PC_FRONT_ON_2.png +0 -0
  162. package/agent/dashboard/public/pixel-engine/furniture/PC/PC_FRONT_ON_3.png +0 -0
  163. package/agent/dashboard/public/pixel-engine/furniture/PC/PC_SIDE.png +0 -0
  164. package/agent/dashboard/public/pixel-engine/furniture/PC/manifest.json +88 -0
  165. package/agent/dashboard/public/pixel-engine/furniture/PLANT/PLANT.png +0 -0
  166. package/agent/dashboard/public/pixel-engine/furniture/PLANT/manifest.json +13 -0
  167. package/agent/dashboard/public/pixel-engine/furniture/PLANT_2/PLANT_2.png +0 -0
  168. package/agent/dashboard/public/pixel-engine/furniture/PLANT_2/manifest.json +13 -0
  169. package/agent/dashboard/public/pixel-engine/furniture/POT/POT.png +0 -0
  170. package/agent/dashboard/public/pixel-engine/furniture/POT/manifest.json +13 -0
  171. package/agent/dashboard/public/pixel-engine/furniture/SMALL_PAINTING/SMALL_PAINTING.png +0 -0
  172. package/agent/dashboard/public/pixel-engine/furniture/SMALL_PAINTING/manifest.json +13 -0
  173. package/agent/dashboard/public/pixel-engine/furniture/SMALL_PAINTING_2/SMALL_PAINTING_2.png +0 -0
  174. package/agent/dashboard/public/pixel-engine/furniture/SMALL_PAINTING_2/manifest.json +13 -0
  175. package/agent/dashboard/public/pixel-engine/furniture/SMALL_TABLE/SMALL_TABLE_FRONT.png +0 -0
  176. package/agent/dashboard/public/pixel-engine/furniture/SMALL_TABLE/SMALL_TABLE_SIDE.png +0 -0
  177. package/agent/dashboard/public/pixel-engine/furniture/SMALL_TABLE/manifest.json +33 -0
  178. package/agent/dashboard/public/pixel-engine/furniture/SOFA/SOFA_BACK.png +0 -0
  179. package/agent/dashboard/public/pixel-engine/furniture/SOFA/SOFA_FRONT.png +0 -0
  180. package/agent/dashboard/public/pixel-engine/furniture/SOFA/SOFA_SIDE.png +0 -0
  181. package/agent/dashboard/public/pixel-engine/furniture/SOFA/manifest.json +44 -0
  182. package/agent/dashboard/public/pixel-engine/furniture/TABLE_FRONT/TABLE_FRONT.png +0 -0
  183. package/agent/dashboard/public/pixel-engine/furniture/TABLE_FRONT/manifest.json +13 -0
  184. package/agent/dashboard/public/pixel-engine/furniture/VENDER_MACHINE/VENDER_MACHINE.png +0 -0
  185. package/agent/dashboard/public/pixel-engine/furniture/VENDER_MACHINE/manifest.json +16 -0
  186. package/agent/dashboard/public/pixel-engine/furniture/WATER_MACHINE/WATER_MACHINE.png +0 -0
  187. package/agent/dashboard/public/pixel-engine/furniture/WATER_MACHINE/manifest.json +16 -0
  188. package/agent/dashboard/public/pixel-engine/furniture/WHITEBOARD/WHITEBOARD.png +0 -0
  189. package/agent/dashboard/public/pixel-engine/furniture/WHITEBOARD/manifest.json +16 -0
  190. package/agent/dashboard/public/pixel-engine/furniture/WOODEN_BENCH/WOODEN_BENCH.png +0 -0
  191. package/agent/dashboard/public/pixel-engine/furniture/WOODEN_BENCH/manifest.json +13 -0
  192. package/agent/dashboard/public/pixel-engine/furniture/WOODEN_CHAIR/WOODEN_CHAIR_BACK.png +0 -0
  193. package/agent/dashboard/public/pixel-engine/furniture/WOODEN_CHAIR/WOODEN_CHAIR_FRONT.png +0 -0
  194. package/agent/dashboard/public/pixel-engine/furniture/WOODEN_CHAIR/WOODEN_CHAIR_SIDE.png +0 -0
  195. package/agent/dashboard/public/pixel-engine/furniture/WOODEN_CHAIR/manifest.json +44 -0
  196. package/agent/dashboard/public/pixel-engine/furniture/index.json +32 -0
  197. package/agent/dashboard/public/pixel-engine/walls/wall_0.png +0 -0
  198. package/agent/dashboard/src/app.tsx +223 -0
  199. package/agent/dashboard/src/components/alert.tsx +24 -0
  200. package/agent/dashboard/src/components/badge.tsx +41 -0
  201. package/agent/dashboard/src/components/button.tsx +44 -0
  202. package/agent/dashboard/src/components/card.tsx +21 -0
  203. package/agent/dashboard/src/components/dialog.tsx +28 -0
  204. package/agent/dashboard/src/components/index.ts +7 -0
  205. package/agent/dashboard/src/components/input.tsx +45 -0
  206. package/agent/dashboard/src/components/status-dot.tsx +31 -0
  207. package/agent/dashboard/src/index.css +126 -0
  208. package/agent/dashboard/src/lib/api.test.ts +41 -0
  209. package/agent/dashboard/src/lib/api.ts +53 -0
  210. package/agent/dashboard/src/lib/fleet-context.tsx +92 -0
  211. package/agent/dashboard/src/lib/format.test.ts +119 -0
  212. package/agent/dashboard/src/lib/format.ts +41 -0
  213. package/agent/dashboard/src/lib/login-gate.tsx +117 -0
  214. package/agent/dashboard/src/lib/sanitize.test.ts +86 -0
  215. package/agent/dashboard/src/lib/sanitize.ts +13 -0
  216. package/agent/dashboard/src/lib/snippet.test.ts +50 -0
  217. package/agent/dashboard/src/lib/snippet.ts +15 -0
  218. package/agent/dashboard/src/lib/ws-parse.test.ts +72 -0
  219. package/agent/dashboard/src/lib/ws-parse.ts +46 -0
  220. package/agent/dashboard/src/main.tsx +25 -0
  221. package/agent/dashboard/src/pixel-engine/colorize.ts +230 -0
  222. package/agent/dashboard/src/pixel-engine/components/BottomToolbar.tsx +83 -0
  223. package/agent/dashboard/src/pixel-engine/components/DebugView.tsx +175 -0
  224. package/agent/dashboard/src/pixel-engine/components/OfficeCanvas.tsx +838 -0
  225. package/agent/dashboard/src/pixel-engine/components/PixelOffice.tsx +646 -0
  226. package/agent/dashboard/src/pixel-engine/components/SettingsModal.tsx +213 -0
  227. package/agent/dashboard/src/pixel-engine/components/ToolOverlay.tsx +203 -0
  228. package/agent/dashboard/src/pixel-engine/components/ZoomControls.tsx +177 -0
  229. package/agent/dashboard/src/pixel-engine/constants.ts +132 -0
  230. package/agent/dashboard/src/pixel-engine/editor/EditorToolbar.tsx +737 -0
  231. package/agent/dashboard/src/pixel-engine/editor/editorActions.ts +291 -0
  232. package/agent/dashboard/src/pixel-engine/editor/editorState.ts +123 -0
  233. package/agent/dashboard/src/pixel-engine/engine/characters.ts +595 -0
  234. package/agent/dashboard/src/pixel-engine/engine/gameLoop.ts +50 -0
  235. package/agent/dashboard/src/pixel-engine/engine/interactionScheduler.ts +442 -0
  236. package/agent/dashboard/src/pixel-engine/engine/matrixEffect.ts +139 -0
  237. package/agent/dashboard/src/pixel-engine/engine/officeState.ts +748 -0
  238. package/agent/dashboard/src/pixel-engine/engine/renderer.ts +693 -0
  239. package/agent/dashboard/src/pixel-engine/floorTiles.ts +74 -0
  240. package/agent/dashboard/src/pixel-engine/hooks/useAssetLoader.ts +488 -0
  241. package/agent/dashboard/src/pixel-engine/hooks/useEditorActions.ts +661 -0
  242. package/agent/dashboard/src/pixel-engine/hooks/useEditorKeyboard.ts +83 -0
  243. package/agent/dashboard/src/pixel-engine/hooks/useLayoutPersistence.ts +162 -0
  244. package/agent/dashboard/src/pixel-engine/hooks/useOfficeStream.ts +353 -0
  245. package/agent/dashboard/src/pixel-engine/layout/furnitureCatalog.ts +417 -0
  246. package/agent/dashboard/src/pixel-engine/layout/layoutSerializer.ts +416 -0
  247. package/agent/dashboard/src/pixel-engine/layout/tileMap.ts +109 -0
  248. package/agent/dashboard/src/pixel-engine/notificationSound.ts +69 -0
  249. package/agent/dashboard/src/pixel-engine/pixel-office.css +55 -0
  250. package/agent/dashboard/src/pixel-engine/sprites/bubble-permission.json +27 -0
  251. package/agent/dashboard/src/pixel-engine/sprites/bubble-waiting.json +27 -0
  252. package/agent/dashboard/src/pixel-engine/sprites/spriteCache.ts +82 -0
  253. package/agent/dashboard/src/pixel-engine/sprites/spriteData.ts +176 -0
  254. package/agent/dashboard/src/pixel-engine/toolUtils.ts +28 -0
  255. package/agent/dashboard/src/pixel-engine/types.ts +232 -0
  256. package/agent/dashboard/src/pixel-engine/wallTiles.ts +203 -0
  257. package/agent/dashboard/src/views/auth.tsx +249 -0
  258. package/agent/dashboard/src/views/fleet.tsx +263 -0
  259. package/agent/dashboard/src/views/network.tsx +106 -0
  260. package/agent/dashboard/src/views/schedule-types.ts +12 -0
  261. package/agent/dashboard/src/views/schedule-utils.ts +49 -0
  262. package/agent/dashboard/src/views/schedule.tsx +326 -0
  263. package/agent/dashboard/src/views/sessions/conversation-viewer.tsx +279 -0
  264. package/agent/dashboard/src/views/sessions/session-detail.tsx +48 -0
  265. package/agent/dashboard/src/views/sessions/session-list.tsx +265 -0
  266. package/agent/dashboard/src/views/sessions/terminal-pane.tsx +270 -0
  267. package/agent/dashboard/src/views/sessions.tsx +55 -0
  268. package/agent/dashboard/src/views/settings-config.tsx +265 -0
  269. package/agent/dashboard/src/views/settings-logs.tsx +99 -0
  270. package/agent/dashboard/src/views/settings-status.tsx +215 -0
  271. package/agent/dashboard/src/views/settings.tsx +324 -0
  272. package/agent/dashboard/src/views/webhooks.tsx +230 -0
  273. package/agent/dashboard/src/vite-env.d.ts +3 -0
  274. package/agent/dashboard/tsconfig.json +13 -0
  275. package/agent/entry.ts +168 -0
  276. package/agent/event-log.ts +103 -0
  277. package/agent/node-pty-adapter.ts +39 -0
  278. package/agent/paths.ts +12 -0
  279. package/agent/pty-manager.ts +265 -0
  280. package/agent/pty-types.ts +25 -0
  281. package/agent/routes/api.ts +149 -0
  282. package/agent/routes/config.ts +116 -0
  283. package/agent/routes/dashboard.ts +101 -0
  284. package/agent/routes/schedule.ts +84 -0
  285. package/agent/routes/sessions.ts +43 -0
  286. package/agent/routes/webhooks.ts +113 -0
  287. package/agent/scheduler.ts +373 -0
  288. package/agent/server-schema.ts +25 -0
  289. package/agent/server-utils.ts +163 -0
  290. package/agent/server.ts +218 -0
  291. package/agent/server.types.ts +39 -0
  292. package/agent/session-history-types.ts +78 -0
  293. package/agent/session-history-utils.ts +96 -0
  294. package/agent/session-history.ts +318 -0
  295. package/agent/session.ts +152 -0
  296. package/agent/tools/mecha-call.ts +106 -0
  297. package/agent/tools/mecha-fleet.ts +176 -0
  298. package/agent/tools/mecha-list.ts +56 -0
  299. package/agent/tools/mecha-server.ts +70 -0
  300. package/agent/types.ts +35 -0
  301. package/agent/webhook.ts +127 -0
  302. package/agent/ws-terminal.ts +174 -0
  303. package/dist/agent/activity.d.ts +14 -0
  304. package/dist/agent/activity.d.ts.map +1 -0
  305. package/dist/agent/activity.js +25 -0
  306. package/dist/agent/activity.js.map +1 -0
  307. package/dist/agent/character-config.test.d.ts +2 -0
  308. package/dist/agent/character-config.test.d.ts.map +1 -0
  309. package/dist/agent/character-config.test.js +51 -0
  310. package/dist/agent/character-config.test.js.map +1 -0
  311. package/dist/agent/costs.d.ts +16 -0
  312. package/dist/agent/costs.d.ts.map +1 -0
  313. package/dist/agent/costs.js +82 -0
  314. package/dist/agent/costs.js.map +1 -0
  315. package/dist/agent/dashboard/dist/assets/addon-fit-YJmn1quW.js +12 -0
  316. package/dist/agent/dashboard/dist/assets/addon-web-links-BWjmmSgS.js +12 -0
  317. package/dist/agent/dashboard/dist/assets/index-B4OKDQ7e.css +32 -0
  318. package/dist/agent/dashboard/dist/assets/index-fZ_N6Wsi.js +193 -0
  319. package/dist/agent/dashboard/dist/assets/xterm-BqvuqXEL.js +27 -0
  320. package/dist/agent/dashboard/dist/index.html +19 -0
  321. package/dist/agent/dashboard/dist/pixel-engine/characters/char_0.png +0 -0
  322. package/dist/agent/dashboard/dist/pixel-engine/characters/char_1.png +0 -0
  323. package/dist/agent/dashboard/dist/pixel-engine/characters/char_2.png +0 -0
  324. package/dist/agent/dashboard/dist/pixel-engine/characters/char_3.png +0 -0
  325. package/dist/agent/dashboard/dist/pixel-engine/characters/char_4.png +0 -0
  326. package/dist/agent/dashboard/dist/pixel-engine/characters/char_5.png +0 -0
  327. package/dist/agent/dashboard/dist/pixel-engine/default-layout.json +4320 -0
  328. package/dist/agent/dashboard/dist/pixel-engine/floors/floor_0.png +0 -0
  329. package/dist/agent/dashboard/dist/pixel-engine/floors/floor_1.png +0 -0
  330. package/dist/agent/dashboard/dist/pixel-engine/floors/floor_2.png +0 -0
  331. package/dist/agent/dashboard/dist/pixel-engine/floors/floor_3.png +0 -0
  332. package/dist/agent/dashboard/dist/pixel-engine/floors/floor_4.png +0 -0
  333. package/dist/agent/dashboard/dist/pixel-engine/floors/floor_5.png +0 -0
  334. package/dist/agent/dashboard/dist/pixel-engine/floors/floor_6.png +0 -0
  335. package/dist/agent/dashboard/dist/pixel-engine/floors/floor_7.png +0 -0
  336. package/dist/agent/dashboard/dist/pixel-engine/floors/floor_8.png +0 -0
  337. package/dist/agent/dashboard/dist/pixel-engine/fonts/FSPixelSansUnicode-Regular.ttf +0 -0
  338. package/dist/agent/dashboard/dist/pixel-engine/furniture/BIN/BIN.png +0 -0
  339. package/dist/agent/dashboard/dist/pixel-engine/furniture/BIN/manifest.json +13 -0
  340. package/dist/agent/dashboard/dist/pixel-engine/furniture/BLACKBOARD/BLACKBOARD.png +0 -0
  341. package/dist/agent/dashboard/dist/pixel-engine/furniture/BLACKBOARD/manifest.json +16 -0
  342. package/dist/agent/dashboard/dist/pixel-engine/furniture/BOOKSHELF/BOOKSHELF.png +0 -0
  343. package/dist/agent/dashboard/dist/pixel-engine/furniture/BOOKSHELF/manifest.json +16 -0
  344. package/dist/agent/dashboard/dist/pixel-engine/furniture/CACTUS/CACTUS.png +0 -0
  345. package/dist/agent/dashboard/dist/pixel-engine/furniture/CACTUS/manifest.json +13 -0
  346. package/dist/agent/dashboard/dist/pixel-engine/furniture/CLOCK/CLOCK.png +0 -0
  347. package/dist/agent/dashboard/dist/pixel-engine/furniture/CLOCK/manifest.json +13 -0
  348. package/dist/agent/dashboard/dist/pixel-engine/furniture/COFFEE/COFFEE.png +0 -0
  349. package/dist/agent/dashboard/dist/pixel-engine/furniture/COFFEE/manifest.json +13 -0
  350. package/dist/agent/dashboard/dist/pixel-engine/furniture/COFFEE_TABLE/COFFEE_TABLE.png +0 -0
  351. package/dist/agent/dashboard/dist/pixel-engine/furniture/COFFEE_TABLE/manifest.json +13 -0
  352. package/dist/agent/dashboard/dist/pixel-engine/furniture/CUSHIONED_BENCH/CUSHIONED_BENCH.png +0 -0
  353. package/dist/agent/dashboard/dist/pixel-engine/furniture/CUSHIONED_BENCH/manifest.json +13 -0
  354. package/dist/agent/dashboard/dist/pixel-engine/furniture/CUSHIONED_CHAIR/CUSHIONED_CHAIR_BACK.png +0 -0
  355. package/dist/agent/dashboard/dist/pixel-engine/furniture/CUSHIONED_CHAIR/CUSHIONED_CHAIR_FRONT.png +0 -0
  356. package/dist/agent/dashboard/dist/pixel-engine/furniture/CUSHIONED_CHAIR/CUSHIONED_CHAIR_SIDE.png +0 -0
  357. package/dist/agent/dashboard/dist/pixel-engine/furniture/CUSHIONED_CHAIR/manifest.json +44 -0
  358. package/dist/agent/dashboard/dist/pixel-engine/furniture/DESK/DESK_FRONT.png +0 -0
  359. package/dist/agent/dashboard/dist/pixel-engine/furniture/DESK/DESK_SIDE.png +0 -0
  360. package/dist/agent/dashboard/dist/pixel-engine/furniture/DESK/manifest.json +33 -0
  361. package/dist/agent/dashboard/dist/pixel-engine/furniture/DOUBLE_BOOKSHELF/DOUBLE_BOOKSHELF.png +0 -0
  362. package/dist/agent/dashboard/dist/pixel-engine/furniture/DOUBLE_BOOKSHELF/manifest.json +16 -0
  363. package/dist/agent/dashboard/dist/pixel-engine/furniture/FILE_BOXES_1/FILE_BOXES_1.png +0 -0
  364. package/dist/agent/dashboard/dist/pixel-engine/furniture/FILE_BOXES_1/manifest.json +13 -0
  365. package/dist/agent/dashboard/dist/pixel-engine/furniture/FILE_BOXES_2/FILE_BOXES_2.png +0 -0
  366. package/dist/agent/dashboard/dist/pixel-engine/furniture/FILE_BOXES_2/manifest.json +13 -0
  367. package/dist/agent/dashboard/dist/pixel-engine/furniture/HANGING_PLANT/HANGING_PLANT.png +0 -0
  368. package/dist/agent/dashboard/dist/pixel-engine/furniture/HANGING_PLANT/manifest.json +13 -0
  369. package/dist/agent/dashboard/dist/pixel-engine/furniture/LARGE_PAINTING/LARGE_PAINTING.png +0 -0
  370. package/dist/agent/dashboard/dist/pixel-engine/furniture/LARGE_PAINTING/manifest.json +13 -0
  371. package/dist/agent/dashboard/dist/pixel-engine/furniture/LARGE_PLANT/LARGE_PLANT.png +0 -0
  372. package/dist/agent/dashboard/dist/pixel-engine/furniture/LARGE_PLANT/manifest.json +13 -0
  373. package/dist/agent/dashboard/dist/pixel-engine/furniture/PC/PC_BACK.png +0 -0
  374. package/dist/agent/dashboard/dist/pixel-engine/furniture/PC/PC_FRONT_OFF.png +0 -0
  375. package/dist/agent/dashboard/dist/pixel-engine/furniture/PC/PC_FRONT_ON_1.png +0 -0
  376. package/dist/agent/dashboard/dist/pixel-engine/furniture/PC/PC_FRONT_ON_2.png +0 -0
  377. package/dist/agent/dashboard/dist/pixel-engine/furniture/PC/PC_FRONT_ON_3.png +0 -0
  378. package/dist/agent/dashboard/dist/pixel-engine/furniture/PC/PC_SIDE.png +0 -0
  379. package/dist/agent/dashboard/dist/pixel-engine/furniture/PC/manifest.json +88 -0
  380. package/dist/agent/dashboard/dist/pixel-engine/furniture/PLANT/PLANT.png +0 -0
  381. package/dist/agent/dashboard/dist/pixel-engine/furniture/PLANT/manifest.json +13 -0
  382. package/dist/agent/dashboard/dist/pixel-engine/furniture/PLANT_2/PLANT_2.png +0 -0
  383. package/dist/agent/dashboard/dist/pixel-engine/furniture/PLANT_2/manifest.json +13 -0
  384. package/dist/agent/dashboard/dist/pixel-engine/furniture/POT/POT.png +0 -0
  385. package/dist/agent/dashboard/dist/pixel-engine/furniture/POT/manifest.json +13 -0
  386. package/dist/agent/dashboard/dist/pixel-engine/furniture/SMALL_PAINTING/SMALL_PAINTING.png +0 -0
  387. package/dist/agent/dashboard/dist/pixel-engine/furniture/SMALL_PAINTING/manifest.json +13 -0
  388. package/dist/agent/dashboard/dist/pixel-engine/furniture/SMALL_PAINTING_2/SMALL_PAINTING_2.png +0 -0
  389. package/dist/agent/dashboard/dist/pixel-engine/furniture/SMALL_PAINTING_2/manifest.json +13 -0
  390. package/dist/agent/dashboard/dist/pixel-engine/furniture/SMALL_TABLE/SMALL_TABLE_FRONT.png +0 -0
  391. package/dist/agent/dashboard/dist/pixel-engine/furniture/SMALL_TABLE/SMALL_TABLE_SIDE.png +0 -0
  392. package/dist/agent/dashboard/dist/pixel-engine/furniture/SMALL_TABLE/manifest.json +33 -0
  393. package/dist/agent/dashboard/dist/pixel-engine/furniture/SOFA/SOFA_BACK.png +0 -0
  394. package/dist/agent/dashboard/dist/pixel-engine/furniture/SOFA/SOFA_FRONT.png +0 -0
  395. package/dist/agent/dashboard/dist/pixel-engine/furniture/SOFA/SOFA_SIDE.png +0 -0
  396. package/dist/agent/dashboard/dist/pixel-engine/furniture/SOFA/manifest.json +44 -0
  397. package/dist/agent/dashboard/dist/pixel-engine/furniture/TABLE_FRONT/TABLE_FRONT.png +0 -0
  398. package/dist/agent/dashboard/dist/pixel-engine/furniture/TABLE_FRONT/manifest.json +13 -0
  399. package/dist/agent/dashboard/dist/pixel-engine/furniture/VENDER_MACHINE/VENDER_MACHINE.png +0 -0
  400. package/dist/agent/dashboard/dist/pixel-engine/furniture/VENDER_MACHINE/manifest.json +16 -0
  401. package/dist/agent/dashboard/dist/pixel-engine/furniture/WATER_MACHINE/WATER_MACHINE.png +0 -0
  402. package/dist/agent/dashboard/dist/pixel-engine/furniture/WATER_MACHINE/manifest.json +16 -0
  403. package/dist/agent/dashboard/dist/pixel-engine/furniture/WHITEBOARD/WHITEBOARD.png +0 -0
  404. package/dist/agent/dashboard/dist/pixel-engine/furniture/WHITEBOARD/manifest.json +16 -0
  405. package/dist/agent/dashboard/dist/pixel-engine/furniture/WOODEN_BENCH/WOODEN_BENCH.png +0 -0
  406. package/dist/agent/dashboard/dist/pixel-engine/furniture/WOODEN_BENCH/manifest.json +13 -0
  407. package/dist/agent/dashboard/dist/pixel-engine/furniture/WOODEN_CHAIR/WOODEN_CHAIR_BACK.png +0 -0
  408. package/dist/agent/dashboard/dist/pixel-engine/furniture/WOODEN_CHAIR/WOODEN_CHAIR_FRONT.png +0 -0
  409. package/dist/agent/dashboard/dist/pixel-engine/furniture/WOODEN_CHAIR/WOODEN_CHAIR_SIDE.png +0 -0
  410. package/dist/agent/dashboard/dist/pixel-engine/furniture/WOODEN_CHAIR/manifest.json +44 -0
  411. package/dist/agent/dashboard/dist/pixel-engine/furniture/index.json +32 -0
  412. package/dist/agent/dashboard/dist/pixel-engine/walls/wall_0.png +0 -0
  413. package/dist/agent/entry.d.ts +2 -0
  414. package/dist/agent/entry.d.ts.map +1 -0
  415. package/dist/agent/entry.js +157 -0
  416. package/dist/agent/entry.js.map +1 -0
  417. package/dist/agent/event-log.d.ts +11 -0
  418. package/dist/agent/event-log.d.ts.map +1 -0
  419. package/dist/agent/event-log.js +102 -0
  420. package/dist/agent/event-log.js.map +1 -0
  421. package/dist/agent/node-pty-adapter.d.ts +4 -0
  422. package/dist/agent/node-pty-adapter.d.ts.map +1 -0
  423. package/dist/agent/node-pty-adapter.js +35 -0
  424. package/dist/agent/node-pty-adapter.js.map +1 -0
  425. package/dist/agent/paths.d.ts +11 -0
  426. package/dist/agent/paths.d.ts.map +1 -0
  427. package/dist/agent/paths.js +12 -0
  428. package/dist/agent/paths.js.map +1 -0
  429. package/dist/agent/pty-manager.d.ts +34 -0
  430. package/dist/agent/pty-manager.d.ts.map +1 -0
  431. package/dist/agent/pty-manager.js +210 -0
  432. package/dist/agent/pty-manager.js.map +1 -0
  433. package/dist/agent/pty-types.d.ts +26 -0
  434. package/dist/agent/pty-types.d.ts.map +1 -0
  435. package/dist/agent/pty-types.js +2 -0
  436. package/dist/agent/pty-types.js.map +1 -0
  437. package/dist/agent/routes/api.d.ts +17 -0
  438. package/dist/agent/routes/api.d.ts.map +1 -0
  439. package/dist/agent/routes/api.js +125 -0
  440. package/dist/agent/routes/api.js.map +1 -0
  441. package/dist/agent/routes/config.d.ts +6 -0
  442. package/dist/agent/routes/config.d.ts.map +1 -0
  443. package/dist/agent/routes/config.js +116 -0
  444. package/dist/agent/routes/config.js.map +1 -0
  445. package/dist/agent/routes/dashboard.d.ts +4 -0
  446. package/dist/agent/routes/dashboard.d.ts.map +1 -0
  447. package/dist/agent/routes/dashboard.js +97 -0
  448. package/dist/agent/routes/dashboard.js.map +1 -0
  449. package/dist/agent/routes/schedule.d.ts +4 -0
  450. package/dist/agent/routes/schedule.d.ts.map +1 -0
  451. package/dist/agent/routes/schedule.js +98 -0
  452. package/dist/agent/routes/schedule.js.map +1 -0
  453. package/dist/agent/routes/sessions.d.ts +4 -0
  454. package/dist/agent/routes/sessions.d.ts.map +1 -0
  455. package/dist/agent/routes/sessions.js +43 -0
  456. package/dist/agent/routes/sessions.js.map +1 -0
  457. package/dist/agent/routes/webhooks.d.ts +5 -0
  458. package/dist/agent/routes/webhooks.d.ts.map +1 -0
  459. package/dist/agent/routes/webhooks.js +102 -0
  460. package/dist/agent/routes/webhooks.js.map +1 -0
  461. package/dist/agent/scheduler.d.ts +50 -0
  462. package/dist/agent/scheduler.d.ts.map +1 -0
  463. package/dist/agent/scheduler.js +332 -0
  464. package/dist/agent/scheduler.js.map +1 -0
  465. package/dist/agent/server-schema.d.ts +20 -0
  466. package/dist/agent/server-schema.d.ts.map +1 -0
  467. package/dist/agent/server-schema.js +20 -0
  468. package/dist/agent/server-schema.js.map +1 -0
  469. package/dist/agent/server-utils.d.ts +18 -0
  470. package/dist/agent/server-utils.d.ts.map +1 -0
  471. package/dist/agent/server-utils.js +132 -0
  472. package/dist/agent/server-utils.js.map +1 -0
  473. package/dist/agent/server.d.ts +17 -0
  474. package/dist/agent/server.d.ts.map +1 -0
  475. package/dist/agent/server.js +196 -0
  476. package/dist/agent/server.js.map +1 -0
  477. package/dist/agent/server.types.d.ts +38 -0
  478. package/dist/agent/server.types.d.ts.map +1 -0
  479. package/dist/agent/server.types.js +2 -0
  480. package/dist/agent/server.types.js.map +1 -0
  481. package/dist/agent/session-history-types.d.ts +74 -0
  482. package/dist/agent/session-history-types.d.ts.map +1 -0
  483. package/dist/agent/session-history-types.js +2 -0
  484. package/dist/agent/session-history-types.js.map +1 -0
  485. package/dist/agent/session-history-utils.d.ts +13 -0
  486. package/dist/agent/session-history-utils.d.ts.map +1 -0
  487. package/dist/agent/session-history-utils.js +102 -0
  488. package/dist/agent/session-history-utils.js.map +1 -0
  489. package/dist/agent/session-history.d.ts +20 -0
  490. package/dist/agent/session-history.d.ts.map +1 -0
  491. package/dist/agent/session-history.js +282 -0
  492. package/dist/agent/session-history.js.map +1 -0
  493. package/dist/agent/session.d.ts +51 -0
  494. package/dist/agent/session.d.ts.map +1 -0
  495. package/dist/agent/session.js +135 -0
  496. package/dist/agent/session.js.map +1 -0
  497. package/dist/agent/tools/mecha-call.d.ts +2 -0
  498. package/dist/agent/tools/mecha-call.d.ts.map +1 -0
  499. package/dist/agent/tools/mecha-call.js +101 -0
  500. package/dist/agent/tools/mecha-call.js.map +1 -0
  501. package/dist/agent/tools/mecha-fleet.d.ts +25 -0
  502. package/dist/agent/tools/mecha-fleet.d.ts.map +1 -0
  503. package/dist/agent/tools/mecha-fleet.js +144 -0
  504. package/dist/agent/tools/mecha-fleet.js.map +1 -0
  505. package/dist/agent/tools/mecha-list.d.ts +6 -0
  506. package/dist/agent/tools/mecha-list.d.ts.map +1 -0
  507. package/dist/agent/tools/mecha-list.js +46 -0
  508. package/dist/agent/tools/mecha-list.js.map +1 -0
  509. package/dist/agent/tools/mecha-server.d.ts +4 -0
  510. package/dist/agent/tools/mecha-server.d.ts.map +1 -0
  511. package/dist/agent/tools/mecha-server.js +49 -0
  512. package/dist/agent/tools/mecha-server.js.map +1 -0
  513. package/dist/agent/types.d.ts +38 -0
  514. package/dist/agent/types.d.ts.map +1 -0
  515. package/dist/agent/types.js +32 -0
  516. package/dist/agent/types.js.map +1 -0
  517. package/dist/agent/webhook.d.ts +12 -0
  518. package/dist/agent/webhook.d.ts.map +1 -0
  519. package/dist/agent/webhook.js +105 -0
  520. package/dist/agent/webhook.js.map +1 -0
  521. package/dist/agent/ws-terminal.d.ts +4 -0
  522. package/dist/agent/ws-terminal.d.ts.map +1 -0
  523. package/dist/agent/ws-terminal.js +160 -0
  524. package/dist/agent/ws-terminal.js.map +1 -0
  525. package/dist/shared/atomic-write.d.ts +5 -0
  526. package/dist/shared/atomic-write.d.ts.map +1 -0
  527. package/dist/shared/atomic-write.js +63 -0
  528. package/dist/shared/atomic-write.js.map +1 -0
  529. package/dist/shared/errors.d.ts +71 -0
  530. package/dist/shared/errors.d.ts.map +1 -0
  531. package/dist/shared/errors.js +52 -0
  532. package/dist/shared/errors.js.map +1 -0
  533. package/dist/shared/logger.d.ts +7 -0
  534. package/dist/shared/logger.d.ts.map +1 -0
  535. package/dist/shared/logger.js +52 -0
  536. package/dist/shared/logger.js.map +1 -0
  537. package/dist/shared/mutex.d.ts +12 -0
  538. package/dist/shared/mutex.d.ts.map +1 -0
  539. package/dist/shared/mutex.js +73 -0
  540. package/dist/shared/mutex.js.map +1 -0
  541. package/dist/shared/safe-read.d.ts +12 -0
  542. package/dist/shared/safe-read.d.ts.map +1 -0
  543. package/dist/shared/safe-read.js +33 -0
  544. package/dist/shared/safe-read.js.map +1 -0
  545. package/dist/shared/totp.d.ts +7 -0
  546. package/dist/shared/totp.d.ts.map +1 -0
  547. package/dist/shared/totp.js +75 -0
  548. package/dist/shared/totp.js.map +1 -0
  549. package/dist/shared/validation.d.ts +7 -0
  550. package/dist/shared/validation.d.ts.map +1 -0
  551. package/dist/shared/validation.js +30 -0
  552. package/dist/shared/validation.js.map +1 -0
  553. package/dist/src/auth.d.ts +48 -0
  554. package/dist/src/auth.d.ts.map +1 -0
  555. package/dist/src/auth.js +160 -0
  556. package/dist/src/auth.js.map +1 -0
  557. package/dist/src/cli-output.d.ts +14 -0
  558. package/dist/src/cli-output.d.ts.map +1 -0
  559. package/dist/src/cli-output.js +47 -0
  560. package/dist/src/cli-output.js.map +1 -0
  561. package/dist/src/cli-utils.d.ts +15 -0
  562. package/dist/src/cli-utils.d.ts.map +1 -0
  563. package/dist/src/cli-utils.js +241 -0
  564. package/dist/src/cli-utils.js.map +1 -0
  565. package/dist/src/cli.d.ts +3 -0
  566. package/dist/src/cli.d.ts.map +1 -0
  567. package/dist/src/cli.js +535 -0
  568. package/dist/src/cli.js.map +1 -0
  569. package/dist/src/cli.utils.d.ts +10 -0
  570. package/dist/src/cli.utils.d.ts.map +1 -0
  571. package/dist/src/cli.utils.js +127 -0
  572. package/dist/src/cli.utils.js.map +1 -0
  573. package/dist/src/commands/auth.d.ts +3 -0
  574. package/dist/src/commands/auth.d.ts.map +1 -0
  575. package/dist/src/commands/auth.js +139 -0
  576. package/dist/src/commands/auth.js.map +1 -0
  577. package/dist/src/commands/bot-api.d.ts +15 -0
  578. package/dist/src/commands/bot-api.d.ts.map +1 -0
  579. package/dist/src/commands/bot-api.js +40 -0
  580. package/dist/src/commands/bot-api.js.map +1 -0
  581. package/dist/src/commands/completion.d.ts +3 -0
  582. package/dist/src/commands/completion.d.ts.map +1 -0
  583. package/dist/src/commands/completion.js +108 -0
  584. package/dist/src/commands/completion.js.map +1 -0
  585. package/dist/src/commands/config.d.ts +3 -0
  586. package/dist/src/commands/config.d.ts.map +1 -0
  587. package/dist/src/commands/config.js +110 -0
  588. package/dist/src/commands/config.js.map +1 -0
  589. package/dist/src/commands/costs.d.ts +3 -0
  590. package/dist/src/commands/costs.d.ts.map +1 -0
  591. package/dist/src/commands/costs.js +88 -0
  592. package/dist/src/commands/costs.js.map +1 -0
  593. package/dist/src/commands/daemon.d.ts +3 -0
  594. package/dist/src/commands/daemon.d.ts.map +1 -0
  595. package/dist/src/commands/daemon.js +86 -0
  596. package/dist/src/commands/daemon.js.map +1 -0
  597. package/dist/src/commands/push-dashboard.d.ts +3 -0
  598. package/dist/src/commands/push-dashboard.d.ts.map +1 -0
  599. package/dist/src/commands/push-dashboard.js +48 -0
  600. package/dist/src/commands/push-dashboard.js.map +1 -0
  601. package/dist/src/commands/schedule.d.ts +3 -0
  602. package/dist/src/commands/schedule.d.ts.map +1 -0
  603. package/dist/src/commands/schedule.js +70 -0
  604. package/dist/src/commands/schedule.js.map +1 -0
  605. package/dist/src/commands/sessions.d.ts +3 -0
  606. package/dist/src/commands/sessions.d.ts.map +1 -0
  607. package/dist/src/commands/sessions.js +62 -0
  608. package/dist/src/commands/sessions.js.map +1 -0
  609. package/dist/src/commands/webhooks.d.ts +3 -0
  610. package/dist/src/commands/webhooks.d.ts.map +1 -0
  611. package/dist/src/commands/webhooks.js +44 -0
  612. package/dist/src/commands/webhooks.js.map +1 -0
  613. package/dist/src/config.d.ts +9 -0
  614. package/dist/src/config.d.ts.map +1 -0
  615. package/dist/src/config.js +56 -0
  616. package/dist/src/config.js.map +1 -0
  617. package/dist/src/daemon-audit.d.ts +13 -0
  618. package/dist/src/daemon-audit.d.ts.map +1 -0
  619. package/dist/src/daemon-audit.js +33 -0
  620. package/dist/src/daemon-audit.js.map +1 -0
  621. package/dist/src/daemon.d.ts +25 -0
  622. package/dist/src/daemon.d.ts.map +1 -0
  623. package/dist/src/daemon.js +344 -0
  624. package/dist/src/daemon.js.map +1 -0
  625. package/dist/src/dashboard-server-schema.d.ts +23 -0
  626. package/dist/src/dashboard-server-schema.d.ts.map +1 -0
  627. package/dist/src/dashboard-server-schema.js +45 -0
  628. package/dist/src/dashboard-server-schema.js.map +1 -0
  629. package/dist/src/dashboard-server-utils.d.ts +18 -0
  630. package/dist/src/dashboard-server-utils.d.ts.map +1 -0
  631. package/dist/src/dashboard-server-utils.js +107 -0
  632. package/dist/src/dashboard-server-utils.js.map +1 -0
  633. package/dist/src/dashboard-server.d.ts +2 -0
  634. package/dist/src/dashboard-server.d.ts.map +1 -0
  635. package/dist/src/dashboard-server.js +777 -0
  636. package/dist/src/dashboard-server.js.map +1 -0
  637. package/dist/src/docker.constants.d.ts +5 -0
  638. package/dist/src/docker.constants.d.ts.map +1 -0
  639. package/dist/src/docker.constants.js +7 -0
  640. package/dist/src/docker.constants.js.map +1 -0
  641. package/dist/src/docker.d.ts +16 -0
  642. package/dist/src/docker.d.ts.map +1 -0
  643. package/dist/src/docker.js +437 -0
  644. package/dist/src/docker.js.map +1 -0
  645. package/dist/src/docker.types.d.ts +13 -0
  646. package/dist/src/docker.types.d.ts.map +1 -0
  647. package/dist/src/docker.types.js +2 -0
  648. package/dist/src/docker.types.js.map +1 -0
  649. package/dist/src/docker.utils.d.ts +24 -0
  650. package/dist/src/docker.utils.d.ts.map +1 -0
  651. package/dist/src/docker.utils.js +239 -0
  652. package/dist/src/docker.utils.js.map +1 -0
  653. package/dist/src/doctor.d.ts +3 -0
  654. package/dist/src/doctor.d.ts.map +1 -0
  655. package/dist/src/doctor.js +80 -0
  656. package/dist/src/doctor.js.map +1 -0
  657. package/dist/src/doctor.utils.d.ts +30 -0
  658. package/dist/src/doctor.utils.d.ts.map +1 -0
  659. package/dist/src/doctor.utils.js +192 -0
  660. package/dist/src/doctor.utils.js.map +1 -0
  661. package/dist/src/mcp-proxy.d.ts +2 -0
  662. package/dist/src/mcp-proxy.d.ts.map +1 -0
  663. package/dist/src/mcp-proxy.js +177 -0
  664. package/dist/src/mcp-proxy.js.map +1 -0
  665. package/dist/src/resolve-endpoint.d.ts +13 -0
  666. package/dist/src/resolve-endpoint.d.ts.map +1 -0
  667. package/dist/src/resolve-endpoint.js +112 -0
  668. package/dist/src/resolve-endpoint.js.map +1 -0
  669. package/dist/src/store.d.ts +41 -0
  670. package/dist/src/store.d.ts.map +1 -0
  671. package/dist/src/store.js +263 -0
  672. package/dist/src/store.js.map +1 -0
  673. package/package.json +84 -0
  674. package/s6/mecha-agent/dependencies.d/tailscale-up +0 -0
  675. package/s6/mecha-agent/finish +4 -0
  676. package/s6/mecha-agent/run +39 -0
  677. package/s6/mecha-agent/type +1 -0
  678. package/s6/tailscale-up/dependencies.d/tailscaled +0 -0
  679. package/s6/tailscale-up/type +1 -0
  680. package/s6/tailscale-up/up +39 -0
  681. package/s6/tailscaled/run +14 -0
  682. package/s6/tailscaled/type +1 -0
  683. package/shared/atomic-write.ts +58 -0
  684. package/shared/errors.ts +137 -0
  685. package/shared/logger.ts +50 -0
  686. package/shared/mutex.ts +73 -0
  687. package/shared/safe-read.ts +52 -0
  688. package/shared/totp.ts +83 -0
  689. package/shared/validation.ts +29 -0
  690. package/tsconfig.agent.json +10 -0
  691. package/tsconfig.json +22 -0
@@ -0,0 +1,442 @@
1
+ import type { Character, Seat, PlacedFurniture, TileType } from '../types.js';
2
+ import { CharacterState, Direction } from '../types.js';
3
+ import {
4
+ CHAT_RANGE_TILES,
5
+ CHAT_MIN_SEC,
6
+ CHAT_MAX_SEC,
7
+ INTERACT_MIN_SEC,
8
+ INTERACT_MAX_SEC,
9
+ LOUNGE_SIT_MIN_SEC,
10
+ LOUNGE_SIT_MAX_SEC,
11
+ IDLE_WEIGHT_WANDER,
12
+ IDLE_WEIGHT_INTERACT,
13
+ IDLE_WEIGHT_CHAT,
14
+ IDLE_WEIGHT_LOUNGE,
15
+ } from '../constants.js';
16
+ import type { CatalogEntryWithCategory } from '../layout/furnitureCatalog.js';
17
+ import { getCatalogEntry } from '../layout/furnitureCatalog.js';
18
+ import { findPath } from '../layout/tileMap.js';
19
+
20
+ export type IdleAction =
21
+ | { type: 'wander' }
22
+ | {
23
+ type: 'interact';
24
+ furnitureUid: string;
25
+ tileCol: number;
26
+ tileRow: number;
27
+ facingDir: number;
28
+ duration: number;
29
+ }
30
+ | {
31
+ type: 'chat';
32
+ partnerId: number;
33
+ tileCol: number;
34
+ tileRow: number;
35
+ facingDir: number;
36
+ duration: number;
37
+ }
38
+ | { type: 'lounge'; seatUid: string }
39
+ | { type: 'rest' };
40
+
41
+ export class InteractionScheduler {
42
+ /** furniture uid → character id */
43
+ furnitureReservations = new Map<string, number>();
44
+ /** character id → partner id (symmetric) */
45
+ chatPairs = new Map<number, number>();
46
+ /** seat uid → character id (work desks) */
47
+ deskClaims = new Map<string, number>();
48
+ /** Pending chat requests from SSE (sub-agent spawns) */
49
+ pendingRealChats: Array<{ parentId: number; childId: number }> = [];
50
+
51
+ /** Release all reservations for a character (on preemption, despawn, etc.) */
52
+ releaseAll(charId: number, characters?: Map<number, Character>): void {
53
+ for (const [uid, id] of this.furnitureReservations) {
54
+ if (id === charId) this.furnitureReservations.delete(uid);
55
+ }
56
+ const partnerId = this.chatPairs.get(charId);
57
+ if (partnerId !== undefined) {
58
+ this.chatPairs.delete(charId);
59
+ this.chatPairs.delete(partnerId);
60
+ // Cancel partner's chat state so they don't keep walking/interacting with nobody
61
+ if (characters) {
62
+ const partner = characters.get(partnerId);
63
+ if (partner && partner.chatPartner === charId) {
64
+ partner.chatPartner = null;
65
+ partner.chatTimer = 0;
66
+ partner.interactTimer = 0;
67
+ if (partner.state === CharacterState.INTERACT || partner.state === CharacterState.WALK) {
68
+ partner.state = CharacterState.IDLE;
69
+ partner.path = [];
70
+ partner.moveProgress = 0;
71
+ }
72
+ }
73
+ }
74
+ }
75
+ for (const [uid, id] of this.deskClaims) {
76
+ if (id === charId) this.deskClaims.delete(uid);
77
+ }
78
+ }
79
+
80
+ /** Select next idle action for a character */
81
+ selectIdleAction(
82
+ char: Character,
83
+ characters: Map<number, Character>,
84
+ seats: Map<string, Seat>,
85
+ furniture: PlacedFurniture[],
86
+ tileMap: TileType[][],
87
+ blockedTiles: Set<string>,
88
+ ): IdleAction {
89
+ // Check if should rest
90
+ if (char.idleActionCount >= char.idleActionLimit) {
91
+ return { type: 'rest' };
92
+ }
93
+
94
+ // Weighted random selection with fallback
95
+ const roll = Math.random() * 100;
96
+ const thresholds = [
97
+ IDLE_WEIGHT_WANDER,
98
+ IDLE_WEIGHT_WANDER + IDLE_WEIGHT_INTERACT,
99
+ IDLE_WEIGHT_WANDER + IDLE_WEIGHT_INTERACT + IDLE_WEIGHT_CHAT,
100
+ 100,
101
+ ];
102
+
103
+ if (roll < thresholds[0]) return { type: 'wander' };
104
+
105
+ if (roll < thresholds[1]) {
106
+ const action = this.tryInteractAction(char, furniture, tileMap, blockedTiles);
107
+ if (action) return action;
108
+ return { type: 'wander' }; // fallback
109
+ }
110
+
111
+ if (roll < thresholds[2]) {
112
+ const action = this.tryChatAction(char, characters, tileMap, blockedTiles);
113
+ if (action) return action;
114
+ return { type: 'wander' }; // fallback
115
+ }
116
+
117
+ const action = this.tryLoungeAction(char, seats);
118
+ if (action) return action;
119
+ return { type: 'wander' }; // fallback
120
+ }
121
+
122
+ /** Try to find interactable furniture and reserve it */
123
+ private tryInteractAction(
124
+ char: Character,
125
+ furniture: PlacedFurniture[],
126
+ tileMap: TileType[][],
127
+ blockedTiles: Set<string>,
128
+ ): IdleAction | null {
129
+ // Get interactable furniture not already reserved
130
+ const candidates = furniture.filter((f) => {
131
+ const entry = getCatalogEntry(f.type);
132
+ return entry?.interactable && !this.furnitureReservations.has(f.uid);
133
+ });
134
+ if (candidates.length === 0) return null;
135
+
136
+ // Pick random, find adjacent walkable tile
137
+ const shuffled = [...candidates].sort(() => Math.random() - 0.5);
138
+ for (const f of shuffled) {
139
+ const entry = getCatalogEntry(f.type)!;
140
+ const sides = entry.interactSides ?? ['front'];
141
+ const tile = this.findInteractionTile(f, entry, sides, tileMap, blockedTiles);
142
+ if (!tile) continue;
143
+
144
+ // Check pathfinding
145
+ const path = findPath(
146
+ char.tileCol,
147
+ char.tileRow,
148
+ tile.col,
149
+ tile.row,
150
+ tileMap,
151
+ blockedTiles,
152
+ );
153
+ if (path.length === 0 && (char.tileCol !== tile.col || char.tileRow !== tile.row)) continue;
154
+
155
+ this.furnitureReservations.set(f.uid, char.id);
156
+ const duration =
157
+ INTERACT_MIN_SEC + Math.random() * (INTERACT_MAX_SEC - INTERACT_MIN_SEC);
158
+ return {
159
+ type: 'interact',
160
+ furnitureUid: f.uid,
161
+ tileCol: tile.col,
162
+ tileRow: tile.row,
163
+ facingDir: tile.dir,
164
+ duration,
165
+ };
166
+ }
167
+ return null;
168
+ }
169
+
170
+ /** Find a walkable tile adjacent to furniture on an allowed side */
171
+ private findInteractionTile(
172
+ f: PlacedFurniture,
173
+ entry: CatalogEntryWithCategory,
174
+ sides: string[],
175
+ tileMap: TileType[][],
176
+ blockedTiles: Set<string>,
177
+ ): { col: number; row: number; dir: number } | null {
178
+ const fw = entry.footprintW,
179
+ fh = entry.footprintH;
180
+ const candidates: Array<{ col: number; row: number; dir: number }> = [];
181
+
182
+ for (const side of sides) {
183
+ if (side === 'front' || side === 'any') {
184
+ // Row below furniture, facing UP
185
+ for (let c = f.col; c < f.col + fw; c++) {
186
+ candidates.push({ col: c, row: f.row + fh, dir: Direction.UP });
187
+ }
188
+ }
189
+ if (side === 'back' || side === 'any') {
190
+ for (let c = f.col; c < f.col + fw; c++) {
191
+ candidates.push({ col: c, row: f.row - 1, dir: Direction.DOWN });
192
+ }
193
+ }
194
+ if (side === 'left' || side === 'any') {
195
+ for (let r = f.row; r < f.row + fh; r++) {
196
+ candidates.push({ col: f.col - 1, row: r, dir: Direction.RIGHT });
197
+ }
198
+ }
199
+ if (side === 'right' || side === 'any') {
200
+ for (let r = f.row; r < f.row + fh; r++) {
201
+ candidates.push({ col: f.col + fw, row: r, dir: Direction.LEFT });
202
+ }
203
+ }
204
+ }
205
+
206
+ // Filter to walkable, non-blocked tiles
207
+ const rows = tileMap.length,
208
+ cols = tileMap[0]?.length ?? 0;
209
+ const valid = candidates.filter(
210
+ (t) =>
211
+ t.col >= 0 &&
212
+ t.col < cols &&
213
+ t.row >= 0 &&
214
+ t.row < rows &&
215
+ tileMap[t.row][t.col] > 0 &&
216
+ tileMap[t.row][t.col] < 255 &&
217
+ !blockedTiles.has(`${t.col},${t.row}`),
218
+ );
219
+
220
+ if (valid.length === 0) return null;
221
+ return valid[Math.floor(Math.random() * valid.length)];
222
+ }
223
+
224
+ /** Try to pair this character with another idle bot for chat */
225
+ private tryChatAction(
226
+ char: Character,
227
+ characters: Map<number, Character>,
228
+ tileMap: TileType[][],
229
+ blockedTiles: Set<string>,
230
+ ): IdleAction | null {
231
+ // Find idle bots not in chat, within range
232
+ const candidates: Character[] = [];
233
+ for (const other of characters.values()) {
234
+ if (other.id === char.id) continue;
235
+ if (other.state !== CharacterState.IDLE) continue;
236
+ if (other.isActive) continue;
237
+ if (this.chatPairs.has(other.id)) continue;
238
+ if (other.isSubagent) continue;
239
+ const dist =
240
+ Math.abs(other.tileCol - char.tileCol) + Math.abs(other.tileRow - char.tileRow);
241
+ if (dist <= CHAT_RANGE_TILES) candidates.push(other);
242
+ }
243
+ if (candidates.length === 0) return null;
244
+
245
+ // Pick closest
246
+ candidates.sort((a, b) => {
247
+ const da = Math.abs(a.tileCol - char.tileCol) + Math.abs(a.tileRow - char.tileRow);
248
+ const db = Math.abs(b.tileCol - char.tileCol) + Math.abs(b.tileRow - char.tileRow);
249
+ return da - db;
250
+ });
251
+ const partner = candidates[0];
252
+
253
+ // Find two adjacent tiles facing each other (midpoint search)
254
+ const midCol = Math.round((char.tileCol + partner.tileCol) / 2);
255
+ const midRow = Math.round((char.tileRow + partner.tileRow) / 2);
256
+ const meetTiles = this.findChatMeetingTiles(midCol, midRow, tileMap, blockedTiles);
257
+ if (!meetTiles) return null;
258
+
259
+ // Verify both can reach meeting tiles before reserving
260
+ const pathA = findPath(char.tileCol, char.tileRow, meetTiles.a.col, meetTiles.a.row, tileMap, blockedTiles);
261
+ const pathB = findPath(partner.tileCol, partner.tileRow, meetTiles.b.col, meetTiles.b.row, tileMap, blockedTiles);
262
+ const charAtTarget = char.tileCol === meetTiles.a.col && char.tileRow === meetTiles.a.row;
263
+ const partnerAtTarget = partner.tileCol === meetTiles.b.col && partner.tileRow === meetTiles.b.row;
264
+ if ((pathA.length === 0 && !charAtTarget) || (pathB.length === 0 && !partnerAtTarget)) return null;
265
+
266
+ // Reserve both
267
+ const duration = CHAT_MIN_SEC + Math.random() * (CHAT_MAX_SEC - CHAT_MIN_SEC);
268
+ this.chatPairs.set(char.id, partner.id);
269
+ this.chatPairs.set(partner.id, char.id);
270
+
271
+ // Assign partner's action directly
272
+ partner.chatPartner = char.id;
273
+ partner.path = pathB;
274
+ partner.state = CharacterState.WALK;
275
+ partner.chatTimer = duration;
276
+
277
+ return {
278
+ type: 'chat',
279
+ partnerId: partner.id,
280
+ tileCol: meetTiles.a.col,
281
+ tileRow: meetTiles.a.row,
282
+ facingDir: meetTiles.a.dir,
283
+ duration,
284
+ };
285
+ }
286
+
287
+ /** Find two adjacent walkable tiles facing each other near a target point */
288
+ private findChatMeetingTiles(
289
+ centerCol: number,
290
+ centerRow: number,
291
+ tileMap: TileType[][],
292
+ blockedTiles: Set<string>,
293
+ ): {
294
+ a: { col: number; row: number; dir: number };
295
+ b: { col: number; row: number; dir: number };
296
+ } | null {
297
+ const rows = tileMap.length,
298
+ cols = tileMap[0]?.length ?? 0;
299
+ const isWalkable = (c: number, r: number) =>
300
+ c >= 0 &&
301
+ c < cols &&
302
+ r >= 0 &&
303
+ r < rows &&
304
+ tileMap[r][c] > 0 &&
305
+ tileMap[r][c] < 255 &&
306
+ !blockedTiles.has(`${c},${r}`);
307
+
308
+ // Search in expanding radius from center
309
+ for (let radius = 0; radius < 8; radius++) {
310
+ for (let dr = -radius; dr <= radius; dr++) {
311
+ for (let dc = -radius; dc <= radius; dc++) {
312
+ if (Math.abs(dr) !== radius && Math.abs(dc) !== radius) continue;
313
+ const c = centerCol + dc,
314
+ r = centerRow + dr;
315
+ // Try horizontal pair
316
+ if (isWalkable(c, r) && isWalkable(c + 1, r)) {
317
+ return {
318
+ a: { col: c, row: r, dir: Direction.RIGHT },
319
+ b: { col: c + 1, row: r, dir: Direction.LEFT },
320
+ };
321
+ }
322
+ // Try vertical pair
323
+ if (isWalkable(c, r) && isWalkable(c, r + 1)) {
324
+ return {
325
+ a: { col: c, row: r, dir: Direction.DOWN },
326
+ b: { col: c, row: r + 1, dir: Direction.UP },
327
+ };
328
+ }
329
+ }
330
+ }
331
+ }
332
+ return null;
333
+ }
334
+
335
+ /** Try to find a lounge seat */
336
+ private tryLoungeAction(char: Character, seats: Map<string, Seat>): IdleAction | null {
337
+ const loungeSeats = [...seats.values()].filter(
338
+ (s) => s.kind === 'lounge' && !s.assigned && !this.deskClaims.has(s.uid),
339
+ );
340
+ if (loungeSeats.length === 0) return null;
341
+ const seat = loungeSeats[Math.floor(Math.random() * loungeSeats.length)];
342
+ return { type: 'lounge', seatUid: seat.uid };
343
+ }
344
+
345
+ /** Claim nearest available PC desk for an active bot. Returns seat or null. */
346
+ claimDeskSeat(
347
+ char: Character,
348
+ seats: Map<string, Seat>,
349
+ tileMap: TileType[][],
350
+ blockedTiles: Set<string>,
351
+ ): Seat | null {
352
+ const candidates = [...seats.values()].filter(
353
+ (s) => s.kind === 'desk' && s.hasPc && !this.deskClaims.has(s.uid),
354
+ );
355
+ if (candidates.length === 0) return null;
356
+
357
+ // Sort by Manhattan distance
358
+ candidates.sort((a, b) => {
359
+ const da =
360
+ Math.abs(a.seatCol - char.tileCol) + Math.abs(a.seatRow - char.tileRow);
361
+ const db =
362
+ Math.abs(b.seatCol - char.tileCol) + Math.abs(b.seatRow - char.tileRow);
363
+ return da - db;
364
+ });
365
+
366
+ // Pick nearest reachable
367
+ for (const seat of candidates) {
368
+ const path = findPath(
369
+ char.tileCol,
370
+ char.tileRow,
371
+ seat.seatCol,
372
+ seat.seatRow,
373
+ tileMap,
374
+ blockedTiles,
375
+ );
376
+ if (path.length > 0 || (char.tileCol === seat.seatCol && char.tileRow === seat.seatRow)) {
377
+ this.deskClaims.set(seat.uid, char.id);
378
+ return seat;
379
+ }
380
+ }
381
+ return null;
382
+ }
383
+
384
+ /** Release desk claim when character leaves */
385
+ releaseDeskClaim(seatUid: string): void {
386
+ this.deskClaims.delete(seatUid);
387
+ }
388
+
389
+ /** Release furniture reservation */
390
+ releaseFurniture(furnitureUid: string): void {
391
+ this.furnitureReservations.delete(furnitureUid);
392
+ }
393
+
394
+ /** Trigger a real chat from SSE sub-agent spawn */
395
+ requestRealChat(parentId: number, childId: number): void {
396
+ this.pendingRealChats.push({ parentId, childId });
397
+ }
398
+
399
+ /** Process pending real chats (called from OfficeState.update each frame) */
400
+ processPendingChats(
401
+ characters: Map<number, Character>,
402
+ tileMap: TileType[][],
403
+ blockedTiles: Set<string>,
404
+ ): void {
405
+ while (this.pendingRealChats.length > 0) {
406
+ const { parentId, childId } = this.pendingRealChats.shift()!;
407
+ const parent = characters.get(parentId);
408
+ const child = characters.get(childId);
409
+ if (!parent || !child) continue;
410
+ if (parent.isActive || child.isActive) continue;
411
+ if (this.chatPairs.has(parentId) || this.chatPairs.has(childId)) continue;
412
+
413
+ const midCol = Math.round((parent.tileCol + child.tileCol) / 2);
414
+ const midRow = Math.round((parent.tileRow + child.tileRow) / 2);
415
+ const meetTiles = this.findChatMeetingTiles(midCol, midRow, tileMap, blockedTiles);
416
+ if (!meetTiles) continue;
417
+
418
+ // Verify both can reach meeting tiles
419
+ const pathP = findPath(parent.tileCol, parent.tileRow, meetTiles.a.col, meetTiles.a.row, tileMap, blockedTiles);
420
+ const pathC = findPath(child.tileCol, child.tileRow, meetTiles.b.col, meetTiles.b.row, tileMap, blockedTiles);
421
+ const parentAtTarget = parent.tileCol === meetTiles.a.col && parent.tileRow === meetTiles.a.row;
422
+ const childAtTarget = child.tileCol === meetTiles.b.col && child.tileRow === meetTiles.b.row;
423
+ if ((pathP.length === 0 && !parentAtTarget) || (pathC.length === 0 && !childAtTarget)) continue;
424
+
425
+ const duration = CHAT_MIN_SEC + Math.random() * (CHAT_MAX_SEC - CHAT_MIN_SEC);
426
+ this.chatPairs.set(parentId, childId);
427
+ this.chatPairs.set(childId, parentId);
428
+
429
+ parent.chatPartner = childId;
430
+ parent.chatTimer = duration;
431
+ parent.path = pathP;
432
+ parent.state = parentAtTarget ? CharacterState.INTERACT : CharacterState.WALK;
433
+ if (parentAtTarget) parent.interactTimer = duration;
434
+
435
+ child.chatPartner = parentId;
436
+ child.chatTimer = duration;
437
+ child.path = pathC;
438
+ child.state = childAtTarget ? CharacterState.INTERACT : CharacterState.WALK;
439
+ if (childAtTarget) child.interactTimer = duration;
440
+ }
441
+ }
442
+ }
@@ -0,0 +1,139 @@
1
+ import {
2
+ MATRIX_COLUMN_STAGGER_RANGE,
3
+ MATRIX_FLICKER_FPS,
4
+ MATRIX_FLICKER_VISIBILITY_THRESHOLD,
5
+ MATRIX_HEAD_COLOR,
6
+ MATRIX_SPRITE_COLS,
7
+ MATRIX_SPRITE_ROWS,
8
+ MATRIX_TRAIL_DIM_THRESHOLD,
9
+ MATRIX_TRAIL_EMPTY_ALPHA,
10
+ MATRIX_TRAIL_LENGTH,
11
+ MATRIX_TRAIL_MID_THRESHOLD,
12
+ MATRIX_TRAIL_OVERLAY_ALPHA,
13
+ } from '../constants.js';
14
+ import type { Character, SpriteData } from '../types.js';
15
+ import { MATRIX_EFFECT_DURATION } from '../types.js';
16
+
17
+ /** Hash-based flicker: ~70% visible for shimmer effect */
18
+ function flickerVisible(col: number, row: number, time: number): boolean {
19
+ const t = Math.floor(time * MATRIX_FLICKER_FPS);
20
+ const hash = (col * 7 + row * 13 + t * 31) & 0xff;
21
+ return hash < MATRIX_FLICKER_VISIBILITY_THRESHOLD;
22
+ }
23
+
24
+ function generateSeeds(): number[] {
25
+ const seeds: number[] = [];
26
+ for (let i = 0; i < MATRIX_SPRITE_COLS; i++) {
27
+ seeds.push(Math.random());
28
+ }
29
+ return seeds;
30
+ }
31
+
32
+ export { generateSeeds as matrixEffectSeeds };
33
+
34
+ /**
35
+ * Render a character with a Matrix-style digital rain spawn/despawn effect.
36
+ * Per-pixel rendering: each column sweeps top-to-bottom with a bright head and fading green trail.
37
+ */
38
+ export function renderMatrixEffect(
39
+ ctx: CanvasRenderingContext2D,
40
+ ch: Character,
41
+ spriteData: SpriteData,
42
+ drawX: number,
43
+ drawY: number,
44
+ zoom: number,
45
+ ): void {
46
+ const progress = ch.matrixEffectTimer / MATRIX_EFFECT_DURATION;
47
+ const isSpawn = ch.matrixEffect === 'spawn';
48
+ const time = ch.matrixEffectTimer;
49
+ const totalSweep = MATRIX_SPRITE_ROWS + MATRIX_TRAIL_LENGTH;
50
+
51
+ for (let col = 0; col < MATRIX_SPRITE_COLS; col++) {
52
+ // Stagger: each column starts at a slightly different time
53
+ const stagger = (ch.matrixEffectSeeds[col] ?? 0) * MATRIX_COLUMN_STAGGER_RANGE;
54
+ const colProgress = Math.max(
55
+ 0,
56
+ Math.min(1, (progress - stagger) / (1 - MATRIX_COLUMN_STAGGER_RANGE)),
57
+ );
58
+ const headRow = colProgress * totalSweep;
59
+
60
+ for (let row = 0; row < MATRIX_SPRITE_ROWS; row++) {
61
+ const pixel = spriteData[row]?.[col];
62
+ const hasPixel = pixel && pixel !== '';
63
+ const distFromHead = headRow - row;
64
+ const px = drawX + col * zoom;
65
+ const py = drawY + row * zoom;
66
+
67
+ if (isSpawn) {
68
+ // Spawn: head sweeps down revealing character pixels
69
+ if (distFromHead < 0) {
70
+ // Above head: invisible
71
+ continue;
72
+ } else if (distFromHead < 1) {
73
+ // Head pixel: bright white-green
74
+ ctx.fillStyle = MATRIX_HEAD_COLOR;
75
+ ctx.fillRect(px, py, zoom, zoom);
76
+ } else if (distFromHead < MATRIX_TRAIL_LENGTH) {
77
+ // Trail zone: show character pixel with green overlay, or just green if no pixel
78
+ const trailPos = distFromHead / MATRIX_TRAIL_LENGTH;
79
+ if (hasPixel) {
80
+ // Draw original pixel
81
+ ctx.fillStyle = pixel;
82
+ ctx.fillRect(px, py, zoom, zoom);
83
+ // Green overlay that fades as trail progresses
84
+ const greenAlpha = (1 - trailPos) * MATRIX_TRAIL_OVERLAY_ALPHA;
85
+ if (flickerVisible(col, row, time)) {
86
+ ctx.fillStyle = `rgba(0, 255, 65, ${greenAlpha})`;
87
+ ctx.fillRect(px, py, zoom, zoom);
88
+ }
89
+ } else {
90
+ // No character pixel: fading green trail
91
+ if (flickerVisible(col, row, time)) {
92
+ const alpha = (1 - trailPos) * MATRIX_TRAIL_EMPTY_ALPHA;
93
+ ctx.fillStyle =
94
+ trailPos < MATRIX_TRAIL_MID_THRESHOLD
95
+ ? `rgba(0, 255, 65, ${alpha})`
96
+ : trailPos < MATRIX_TRAIL_DIM_THRESHOLD
97
+ ? `rgba(0, 170, 40, ${alpha})`
98
+ : `rgba(0, 85, 20, ${alpha})`;
99
+ ctx.fillRect(px, py, zoom, zoom);
100
+ }
101
+ }
102
+ } else {
103
+ // Below trail: normal character pixel
104
+ if (hasPixel) {
105
+ ctx.fillStyle = pixel;
106
+ ctx.fillRect(px, py, zoom, zoom);
107
+ }
108
+ }
109
+ } else {
110
+ // Despawn: head sweeps down consuming character pixels
111
+ if (distFromHead < 0) {
112
+ // Above head: normal character pixel (not yet consumed)
113
+ if (hasPixel) {
114
+ ctx.fillStyle = pixel;
115
+ ctx.fillRect(px, py, zoom, zoom);
116
+ }
117
+ } else if (distFromHead < 1) {
118
+ // Head pixel: bright white-green
119
+ ctx.fillStyle = MATRIX_HEAD_COLOR;
120
+ ctx.fillRect(px, py, zoom, zoom);
121
+ } else if (distFromHead < MATRIX_TRAIL_LENGTH) {
122
+ // Trail zone: fading green
123
+ if (flickerVisible(col, row, time)) {
124
+ const trailPos = distFromHead / MATRIX_TRAIL_LENGTH;
125
+ const alpha = (1 - trailPos) * MATRIX_TRAIL_EMPTY_ALPHA;
126
+ ctx.fillStyle =
127
+ trailPos < MATRIX_TRAIL_MID_THRESHOLD
128
+ ? `rgba(0, 255, 65, ${alpha})`
129
+ : trailPos < MATRIX_TRAIL_DIM_THRESHOLD
130
+ ? `rgba(0, 170, 40, ${alpha})`
131
+ : `rgba(0, 85, 20, ${alpha})`;
132
+ ctx.fillRect(px, py, zoom, zoom);
133
+ }
134
+ }
135
+ // Below trail: nothing (consumed)
136
+ }
137
+ }
138
+ }
139
+ }