@treenity/mods 3.0.1

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 (486) hide show
  1. package/board/board.test.ts +212 -0
  2. package/board/client.ts +1 -0
  3. package/board/seed.ts +26 -0
  4. package/board/server.ts +5 -0
  5. package/board/types.ts +87 -0
  6. package/board/view.tsx +574 -0
  7. package/brahman/CLAUDE.md +18 -0
  8. package/brahman/brahman.test.ts +855 -0
  9. package/brahman/client.ts +2 -0
  10. package/brahman/helpers.ts +374 -0
  11. package/brahman/server.ts +2 -0
  12. package/brahman/service.ts +328 -0
  13. package/brahman/types.ts +727 -0
  14. package/brahman/view.tsx +73 -0
  15. package/brahman/views/action-cards.tsx +615 -0
  16. package/brahman/views/bot-view.tsx +76 -0
  17. package/brahman/views/chat-editor.tsx +782 -0
  18. package/brahman/views/chat-preview.tsx +266 -0
  19. package/brahman/views/menu-editor.tsx +451 -0
  20. package/brahman/views/page-layout.tsx +285 -0
  21. package/brahman/views/tstring-input.tsx +84 -0
  22. package/cafe/CLAUDE.md +7 -0
  23. package/cafe/seed.ts +8 -0
  24. package/cafe/server.ts +2 -0
  25. package/cafe/types.ts +32 -0
  26. package/canary/seed.ts +8 -0
  27. package/canary/server.ts +3 -0
  28. package/canary/service.ts +101 -0
  29. package/canary/types.ts +16 -0
  30. package/dist/board/client.d.ts +2 -0
  31. package/dist/board/client.d.ts.map +1 -0
  32. package/dist/board/client.js +2 -0
  33. package/dist/board/client.js.map +1 -0
  34. package/dist/board/seed.d.ts +2 -0
  35. package/dist/board/seed.d.ts.map +1 -0
  36. package/dist/board/seed.js +23 -0
  37. package/dist/board/seed.js.map +1 -0
  38. package/dist/board/server.d.ts +3 -0
  39. package/dist/board/server.d.ts.map +1 -0
  40. package/dist/board/server.js +5 -0
  41. package/dist/board/server.js.map +1 -0
  42. package/dist/board/types.d.ts +45 -0
  43. package/dist/board/types.d.ts.map +1 -0
  44. package/dist/board/types.js +82 -0
  45. package/dist/board/types.js.map +1 -0
  46. package/dist/board/view.d.ts +2 -0
  47. package/dist/board/view.d.ts.map +1 -0
  48. package/dist/board/view.js +254 -0
  49. package/dist/board/view.js.map +1 -0
  50. package/dist/brahman/client.d.ts +3 -0
  51. package/dist/brahman/client.d.ts.map +1 -0
  52. package/dist/brahman/client.js +3 -0
  53. package/dist/brahman/client.js.map +1 -0
  54. package/dist/brahman/helpers.d.ts +51 -0
  55. package/dist/brahman/helpers.d.ts.map +1 -0
  56. package/dist/brahman/helpers.js +321 -0
  57. package/dist/brahman/helpers.js.map +1 -0
  58. package/dist/brahman/server.d.ts +3 -0
  59. package/dist/brahman/server.d.ts.map +1 -0
  60. package/dist/brahman/server.js +3 -0
  61. package/dist/brahman/server.js.map +1 -0
  62. package/dist/brahman/service.d.ts +2 -0
  63. package/dist/brahman/service.d.ts.map +1 -0
  64. package/dist/brahman/service.js +310 -0
  65. package/dist/brahman/service.js.map +1 -0
  66. package/dist/brahman/types.d.ts +335 -0
  67. package/dist/brahman/types.d.ts.map +1 -0
  68. package/dist/brahman/types.js +633 -0
  69. package/dist/brahman/types.js.map +1 -0
  70. package/dist/brahman/view.d.ts +2 -0
  71. package/dist/brahman/view.d.ts.map +1 -0
  72. package/dist/brahman/view.js +47 -0
  73. package/dist/brahman/view.js.map +1 -0
  74. package/dist/brahman/views/action-cards.d.ts +60 -0
  75. package/dist/brahman/views/action-cards.d.ts.map +1 -0
  76. package/dist/brahman/views/action-cards.js +283 -0
  77. package/dist/brahman/views/action-cards.js.map +1 -0
  78. package/dist/brahman/views/bot-view.d.ts +5 -0
  79. package/dist/brahman/views/bot-view.d.ts.map +1 -0
  80. package/dist/brahman/views/bot-view.js +14 -0
  81. package/dist/brahman/views/bot-view.js.map +1 -0
  82. package/dist/brahman/views/chat-editor.d.ts +5 -0
  83. package/dist/brahman/views/chat-editor.d.ts.map +1 -0
  84. package/dist/brahman/views/chat-editor.js +306 -0
  85. package/dist/brahman/views/chat-editor.js.map +1 -0
  86. package/dist/brahman/views/chat-preview.d.ts +5 -0
  87. package/dist/brahman/views/chat-preview.d.ts.map +1 -0
  88. package/dist/brahman/views/chat-preview.js +145 -0
  89. package/dist/brahman/views/chat-preview.js.map +1 -0
  90. package/dist/brahman/views/menu-editor.d.ts +11 -0
  91. package/dist/brahman/views/menu-editor.d.ts.map +1 -0
  92. package/dist/brahman/views/menu-editor.js +171 -0
  93. package/dist/brahman/views/menu-editor.js.map +1 -0
  94. package/dist/brahman/views/page-layout.d.ts +5 -0
  95. package/dist/brahman/views/page-layout.d.ts.map +1 -0
  96. package/dist/brahman/views/page-layout.js +114 -0
  97. package/dist/brahman/views/page-layout.js.map +1 -0
  98. package/dist/brahman/views/tstring-input.d.ts +15 -0
  99. package/dist/brahman/views/tstring-input.d.ts.map +1 -0
  100. package/dist/brahman/views/tstring-input.js +23 -0
  101. package/dist/brahman/views/tstring-input.js.map +1 -0
  102. package/dist/cafe/seed.d.ts +2 -0
  103. package/dist/cafe/seed.d.ts.map +1 -0
  104. package/dist/cafe/seed.js +7 -0
  105. package/dist/cafe/seed.js.map +1 -0
  106. package/dist/cafe/server.d.ts +3 -0
  107. package/dist/cafe/server.d.ts.map +1 -0
  108. package/dist/cafe/server.js +3 -0
  109. package/dist/cafe/server.js.map +1 -0
  110. package/dist/cafe/types.d.ts +2 -0
  111. package/dist/cafe/types.d.ts.map +1 -0
  112. package/dist/cafe/types.js +31 -0
  113. package/dist/cafe/types.js.map +1 -0
  114. package/dist/canary/seed.d.ts +2 -0
  115. package/dist/canary/seed.d.ts.map +1 -0
  116. package/dist/canary/seed.js +7 -0
  117. package/dist/canary/seed.js.map +1 -0
  118. package/dist/canary/server.d.ts +4 -0
  119. package/dist/canary/server.d.ts.map +1 -0
  120. package/dist/canary/server.js +4 -0
  121. package/dist/canary/server.js.map +1 -0
  122. package/dist/canary/service.d.ts +2 -0
  123. package/dist/canary/service.d.ts.map +1 -0
  124. package/dist/canary/service.js +101 -0
  125. package/dist/canary/service.js.map +1 -0
  126. package/dist/canary/types.d.ts +9 -0
  127. package/dist/canary/types.d.ts.map +1 -0
  128. package/dist/canary/types.js +13 -0
  129. package/dist/canary/types.js.map +1 -0
  130. package/dist/doc/client.d.ts +3 -0
  131. package/dist/doc/client.d.ts.map +1 -0
  132. package/dist/doc/client.js +5 -0
  133. package/dist/doc/client.js.map +1 -0
  134. package/dist/doc/fs-codec.d.ts +2 -0
  135. package/dist/doc/fs-codec.d.ts.map +1 -0
  136. package/dist/doc/fs-codec.js +44 -0
  137. package/dist/doc/fs-codec.js.map +1 -0
  138. package/dist/doc/markdown.d.ts +13 -0
  139. package/dist/doc/markdown.d.ts.map +1 -0
  140. package/dist/doc/markdown.js +250 -0
  141. package/dist/doc/markdown.js.map +1 -0
  142. package/dist/doc/prefab.d.ts +2 -0
  143. package/dist/doc/prefab.d.ts.map +1 -0
  144. package/dist/doc/prefab.js +23 -0
  145. package/dist/doc/prefab.js.map +1 -0
  146. package/dist/doc/renderers.d.ts +2 -0
  147. package/dist/doc/renderers.d.ts.map +1 -0
  148. package/dist/doc/renderers.js +94 -0
  149. package/dist/doc/renderers.js.map +1 -0
  150. package/dist/doc/seed.d.ts +2 -0
  151. package/dist/doc/seed.d.ts.map +1 -0
  152. package/dist/doc/seed.js +9 -0
  153. package/dist/doc/seed.js.map +1 -0
  154. package/dist/doc/server.d.ts +6 -0
  155. package/dist/doc/server.d.ts.map +1 -0
  156. package/dist/doc/server.js +6 -0
  157. package/dist/doc/server.js.map +1 -0
  158. package/dist/doc/slash-command.d.ts +3 -0
  159. package/dist/doc/slash-command.d.ts.map +1 -0
  160. package/dist/doc/slash-command.js +123 -0
  161. package/dist/doc/slash-command.js.map +1 -0
  162. package/dist/doc/slash-menu.d.ts +15 -0
  163. package/dist/doc/slash-menu.d.ts.map +1 -0
  164. package/dist/doc/slash-menu.js +54 -0
  165. package/dist/doc/slash-menu.js.map +1 -0
  166. package/dist/doc/text.d.ts +2 -0
  167. package/dist/doc/text.d.ts.map +1 -0
  168. package/dist/doc/text.js +22 -0
  169. package/dist/doc/text.js.map +1 -0
  170. package/dist/doc/toolbar.d.ts +5 -0
  171. package/dist/doc/toolbar.d.ts.map +1 -0
  172. package/dist/doc/toolbar.js +15 -0
  173. package/dist/doc/toolbar.js.map +1 -0
  174. package/dist/doc/treenity-block-view.d.ts +2 -0
  175. package/dist/doc/treenity-block-view.d.ts.map +1 -0
  176. package/dist/doc/treenity-block-view.js +37 -0
  177. package/dist/doc/treenity-block-view.js.map +1 -0
  178. package/dist/doc/treenity-block.d.ts +3 -0
  179. package/dist/doc/treenity-block.d.ts.map +1 -0
  180. package/dist/doc/treenity-block.js +27 -0
  181. package/dist/doc/treenity-block.js.map +1 -0
  182. package/dist/doc/types.d.ts +2 -0
  183. package/dist/doc/types.d.ts.map +1 -0
  184. package/dist/doc/types.js +10 -0
  185. package/dist/doc/types.js.map +1 -0
  186. package/dist/launcher/client.d.ts +5 -0
  187. package/dist/launcher/client.d.ts.map +1 -0
  188. package/dist/launcher/client.js +5 -0
  189. package/dist/launcher/client.js.map +1 -0
  190. package/dist/launcher/icons.d.ts +2 -0
  191. package/dist/launcher/icons.d.ts.map +1 -0
  192. package/dist/launcher/icons.js +57 -0
  193. package/dist/launcher/icons.js.map +1 -0
  194. package/dist/launcher/seed.d.ts +2 -0
  195. package/dist/launcher/seed.d.ts.map +1 -0
  196. package/dist/launcher/seed.js +36 -0
  197. package/dist/launcher/seed.js.map +1 -0
  198. package/dist/launcher/server.d.ts +3 -0
  199. package/dist/launcher/server.d.ts.map +1 -0
  200. package/dist/launcher/server.js +3 -0
  201. package/dist/launcher/server.js.map +1 -0
  202. package/dist/launcher/types.d.ts +21 -0
  203. package/dist/launcher/types.d.ts.map +1 -0
  204. package/dist/launcher/types.js +47 -0
  205. package/dist/launcher/types.js.map +1 -0
  206. package/dist/launcher/view.d.ts +2 -0
  207. package/dist/launcher/view.d.ts.map +1 -0
  208. package/dist/launcher/view.js +187 -0
  209. package/dist/launcher/view.js.map +1 -0
  210. package/dist/launcher/widgets.d.ts +2 -0
  211. package/dist/launcher/widgets.d.ts.map +1 -0
  212. package/dist/launcher/widgets.js +73 -0
  213. package/dist/launcher/widgets.js.map +1 -0
  214. package/dist/mindmap/branch.d.ts +17 -0
  215. package/dist/mindmap/branch.d.ts.map +1 -0
  216. package/dist/mindmap/branch.js +47 -0
  217. package/dist/mindmap/branch.js.map +1 -0
  218. package/dist/mindmap/client.d.ts +3 -0
  219. package/dist/mindmap/client.d.ts.map +1 -0
  220. package/dist/mindmap/client.js +3 -0
  221. package/dist/mindmap/client.js.map +1 -0
  222. package/dist/mindmap/radial-tree.d.ts +14 -0
  223. package/dist/mindmap/radial-tree.d.ts.map +1 -0
  224. package/dist/mindmap/radial-tree.js +184 -0
  225. package/dist/mindmap/radial-tree.js.map +1 -0
  226. package/dist/mindmap/sidebar.d.ts +8 -0
  227. package/dist/mindmap/sidebar.d.ts.map +1 -0
  228. package/dist/mindmap/sidebar.js +24 -0
  229. package/dist/mindmap/sidebar.js.map +1 -0
  230. package/dist/mindmap/types.d.ts +8 -0
  231. package/dist/mindmap/types.d.ts.map +1 -0
  232. package/dist/mindmap/types.js +10 -0
  233. package/dist/mindmap/types.js.map +1 -0
  234. package/dist/mindmap/use-tree-data.d.ts +14 -0
  235. package/dist/mindmap/use-tree-data.d.ts.map +1 -0
  236. package/dist/mindmap/use-tree-data.js +95 -0
  237. package/dist/mindmap/use-tree-data.js.map +1 -0
  238. package/dist/mindmap/view.d.ts +3 -0
  239. package/dist/mindmap/view.d.ts.map +1 -0
  240. package/dist/mindmap/view.js +141 -0
  241. package/dist/mindmap/view.js.map +1 -0
  242. package/dist/sensor-demo/client.d.ts +2 -0
  243. package/dist/sensor-demo/client.d.ts.map +1 -0
  244. package/dist/sensor-demo/client.js +2 -0
  245. package/dist/sensor-demo/client.js.map +1 -0
  246. package/dist/sensor-demo/server.d.ts +2 -0
  247. package/dist/sensor-demo/server.d.ts.map +1 -0
  248. package/dist/sensor-demo/server.js +2 -0
  249. package/dist/sensor-demo/server.js.map +1 -0
  250. package/dist/sensor-demo/service.d.ts +2 -0
  251. package/dist/sensor-demo/service.d.ts.map +1 -0
  252. package/dist/sensor-demo/service.js +27 -0
  253. package/dist/sensor-demo/service.js.map +1 -0
  254. package/dist/sensor-demo/types.d.ts +15 -0
  255. package/dist/sensor-demo/types.d.ts.map +1 -0
  256. package/dist/sensor-demo/types.js +18 -0
  257. package/dist/sensor-demo/types.js.map +1 -0
  258. package/dist/sensor-demo/view.d.ts +2 -0
  259. package/dist/sensor-demo/view.d.ts.map +1 -0
  260. package/dist/sensor-demo/view.js +33 -0
  261. package/dist/sensor-demo/view.js.map +1 -0
  262. package/dist/sensor-generator/action.d.ts +2 -0
  263. package/dist/sensor-generator/action.d.ts.map +1 -0
  264. package/dist/sensor-generator/action.js +23 -0
  265. package/dist/sensor-generator/action.js.map +1 -0
  266. package/dist/sensor-generator/client.d.ts +2 -0
  267. package/dist/sensor-generator/client.d.ts.map +1 -0
  268. package/dist/sensor-generator/client.js +2 -0
  269. package/dist/sensor-generator/client.js.map +1 -0
  270. package/dist/sensor-generator/server.d.ts +2 -0
  271. package/dist/sensor-generator/server.d.ts.map +1 -0
  272. package/dist/sensor-generator/server.js +2 -0
  273. package/dist/sensor-generator/server.js.map +1 -0
  274. package/dist/sensor-generator/view.d.ts +2 -0
  275. package/dist/sensor-generator/view.d.ts.map +1 -0
  276. package/dist/sensor-generator/view.js +64 -0
  277. package/dist/sensor-generator/view.js.map +1 -0
  278. package/dist/sim/client.d.ts +2 -0
  279. package/dist/sim/client.d.ts.map +1 -0
  280. package/dist/sim/client.js +2 -0
  281. package/dist/sim/client.js.map +1 -0
  282. package/dist/sim/seed.d.ts +2 -0
  283. package/dist/sim/seed.d.ts.map +1 -0
  284. package/dist/sim/seed.js +50 -0
  285. package/dist/sim/seed.js.map +1 -0
  286. package/dist/sim/server.d.ts +3 -0
  287. package/dist/sim/server.d.ts.map +1 -0
  288. package/dist/sim/server.js +3 -0
  289. package/dist/sim/server.js.map +1 -0
  290. package/dist/sim/service.d.ts +4 -0
  291. package/dist/sim/service.d.ts.map +1 -0
  292. package/dist/sim/service.js +528 -0
  293. package/dist/sim/service.js.map +1 -0
  294. package/dist/sim/types.d.ts +63 -0
  295. package/dist/sim/types.d.ts.map +1 -0
  296. package/dist/sim/types.js +57 -0
  297. package/dist/sim/types.js.map +1 -0
  298. package/dist/sim/view.d.ts +2 -0
  299. package/dist/sim/view.d.ts.map +1 -0
  300. package/dist/sim/view.js +205 -0
  301. package/dist/sim/view.js.map +1 -0
  302. package/dist/table/client.d.ts +4 -0
  303. package/dist/table/client.d.ts.map +1 -0
  304. package/dist/table/client.js +4 -0
  305. package/dist/table/client.js.map +1 -0
  306. package/dist/table/edit.d.ts +2 -0
  307. package/dist/table/edit.d.ts.map +1 -0
  308. package/dist/table/edit.js +115 -0
  309. package/dist/table/edit.js.map +1 -0
  310. package/dist/table/server.d.ts +2 -0
  311. package/dist/table/server.d.ts.map +1 -0
  312. package/dist/table/server.js +2 -0
  313. package/dist/table/server.js.map +1 -0
  314. package/dist/table/types.d.ts +18 -0
  315. package/dist/table/types.d.ts.map +1 -0
  316. package/dist/table/types.js +13 -0
  317. package/dist/table/types.js.map +1 -0
  318. package/dist/table/use-debounced-sync.d.ts +8 -0
  319. package/dist/table/use-debounced-sync.d.ts.map +1 -0
  320. package/dist/table/use-debounced-sync.js +56 -0
  321. package/dist/table/use-debounced-sync.js.map +1 -0
  322. package/dist/table/view.d.ts +2 -0
  323. package/dist/table/view.d.ts.map +1 -0
  324. package/dist/table/view.js +199 -0
  325. package/dist/table/view.js.map +1 -0
  326. package/dist/tasks/server.d.ts +2 -0
  327. package/dist/tasks/server.d.ts.map +1 -0
  328. package/dist/tasks/server.js +2 -0
  329. package/dist/tasks/server.js.map +1 -0
  330. package/dist/tasks/types.d.ts +22 -0
  331. package/dist/tasks/types.d.ts.map +1 -0
  332. package/dist/tasks/types.js +34 -0
  333. package/dist/tasks/types.js.map +1 -0
  334. package/dist/three/client.d.ts +2 -0
  335. package/dist/three/client.d.ts.map +1 -0
  336. package/dist/three/client.js +2 -0
  337. package/dist/three/client.js.map +1 -0
  338. package/dist/three/seed.d.ts +2 -0
  339. package/dist/three/seed.d.ts.map +1 -0
  340. package/dist/three/seed.js +45 -0
  341. package/dist/three/seed.js.map +1 -0
  342. package/dist/three/server.d.ts +3 -0
  343. package/dist/three/server.d.ts.map +1 -0
  344. package/dist/three/server.js +3 -0
  345. package/dist/three/server.js.map +1 -0
  346. package/dist/three/types.d.ts +178 -0
  347. package/dist/three/types.d.ts.map +1 -0
  348. package/dist/three/types.js +209 -0
  349. package/dist/three/types.js.map +1 -0
  350. package/dist/three/view.d.ts +2 -0
  351. package/dist/three/view.d.ts.map +1 -0
  352. package/dist/three/view.js +307 -0
  353. package/dist/three/view.js.map +1 -0
  354. package/dist/todo/client.d.ts +3 -0
  355. package/dist/todo/client.d.ts.map +1 -0
  356. package/dist/todo/client.js +3 -0
  357. package/dist/todo/client.js.map +1 -0
  358. package/dist/todo/seed.d.ts +2 -0
  359. package/dist/todo/seed.d.ts.map +1 -0
  360. package/dist/todo/seed.js +8 -0
  361. package/dist/todo/seed.js.map +1 -0
  362. package/dist/todo/server.d.ts +3 -0
  363. package/dist/todo/server.d.ts.map +1 -0
  364. package/dist/todo/server.js +3 -0
  365. package/dist/todo/server.js.map +1 -0
  366. package/dist/todo/types.d.ts +15 -0
  367. package/dist/todo/types.d.ts.map +1 -0
  368. package/dist/todo/types.js +29 -0
  369. package/dist/todo/types.js.map +1 -0
  370. package/dist/todo/view.d.ts +2 -0
  371. package/dist/todo/view.d.ts.map +1 -0
  372. package/dist/todo/view.js +27 -0
  373. package/dist/todo/view.js.map +1 -0
  374. package/dist/whisper/client.d.ts +2 -0
  375. package/dist/whisper/client.d.ts.map +1 -0
  376. package/dist/whisper/client.js +2 -0
  377. package/dist/whisper/client.js.map +1 -0
  378. package/dist/whisper/inbox.d.ts +2 -0
  379. package/dist/whisper/inbox.d.ts.map +1 -0
  380. package/dist/whisper/inbox.js +50 -0
  381. package/dist/whisper/inbox.js.map +1 -0
  382. package/dist/whisper/route.d.ts +10 -0
  383. package/dist/whisper/route.d.ts.map +1 -0
  384. package/dist/whisper/route.js +154 -0
  385. package/dist/whisper/route.js.map +1 -0
  386. package/dist/whisper/seed.d.ts +2 -0
  387. package/dist/whisper/seed.d.ts.map +1 -0
  388. package/dist/whisper/seed.js +14 -0
  389. package/dist/whisper/seed.js.map +1 -0
  390. package/dist/whisper/server.d.ts +5 -0
  391. package/dist/whisper/server.d.ts.map +1 -0
  392. package/dist/whisper/server.js +5 -0
  393. package/dist/whisper/server.js.map +1 -0
  394. package/dist/whisper/service.d.ts +2 -0
  395. package/dist/whisper/service.d.ts.map +1 -0
  396. package/dist/whisper/service.js +26 -0
  397. package/dist/whisper/service.js.map +1 -0
  398. package/dist/whisper/types.d.ts +38 -0
  399. package/dist/whisper/types.d.ts.map +1 -0
  400. package/dist/whisper/types.js +45 -0
  401. package/dist/whisper/types.js.map +1 -0
  402. package/dist/whisper/view.d.ts +2 -0
  403. package/dist/whisper/view.d.ts.map +1 -0
  404. package/dist/whisper/view.js +40 -0
  405. package/dist/whisper/view.js.map +1 -0
  406. package/doc/CLAUDE.md +49 -0
  407. package/doc/client.ts +5 -0
  408. package/doc/editor.css +283 -0
  409. package/doc/fs-codec.test.ts +119 -0
  410. package/doc/fs-codec.ts +50 -0
  411. package/doc/markdown.test.ts +152 -0
  412. package/doc/markdown.ts +284 -0
  413. package/doc/prefab.ts +26 -0
  414. package/doc/renderers.tsx +126 -0
  415. package/doc/seed.ts +10 -0
  416. package/doc/server.ts +5 -0
  417. package/doc/slash-command.ts +136 -0
  418. package/doc/slash-menu.tsx +91 -0
  419. package/doc/text.ts +20 -0
  420. package/doc/toolbar.tsx +86 -0
  421. package/doc/treenity-block-view.tsx +116 -0
  422. package/doc/treenity-block.ts +31 -0
  423. package/doc/types.ts +10 -0
  424. package/launcher/client.ts +4 -0
  425. package/launcher/icons.tsx +234 -0
  426. package/launcher/launcher.css +64 -0
  427. package/launcher/seed.ts +41 -0
  428. package/launcher/server.ts +2 -0
  429. package/launcher/types.ts +53 -0
  430. package/launcher/view.tsx +401 -0
  431. package/launcher/widgets.tsx +171 -0
  432. package/mindmap/branch.tsx +163 -0
  433. package/mindmap/client.ts +2 -0
  434. package/mindmap/mindmap.css +243 -0
  435. package/mindmap/sidebar.tsx +127 -0
  436. package/mindmap/types.ts +10 -0
  437. package/mindmap/view.tsx +247 -0
  438. package/package.json +75 -0
  439. package/sensor-demo/CLAUDE.md +3 -0
  440. package/sensor-demo/client.ts +1 -0
  441. package/sensor-demo/server.ts +1 -0
  442. package/sensor-demo/service.ts +27 -0
  443. package/sensor-demo/types.ts +20 -0
  444. package/sensor-demo/view.tsx +64 -0
  445. package/sensor-generator/CLAUDE.md +3 -0
  446. package/sensor-generator/action.ts +28 -0
  447. package/sensor-generator/client.ts +1 -0
  448. package/sensor-generator/server.ts +1 -0
  449. package/sensor-generator/view.tsx +107 -0
  450. package/sim/CLAUDE.md +16 -0
  451. package/sim/client.ts +1 -0
  452. package/sim/seed.ts +55 -0
  453. package/sim/server.ts +2 -0
  454. package/sim/service.ts +594 -0
  455. package/sim/sim.test.ts +282 -0
  456. package/sim/types.ts +87 -0
  457. package/sim/view.tsx +446 -0
  458. package/table/client.ts +3 -0
  459. package/table/edit.tsx +241 -0
  460. package/table/server.ts +1 -0
  461. package/table/types.ts +22 -0
  462. package/table/use-debounced-sync.ts +67 -0
  463. package/table/view.tsx +339 -0
  464. package/tasks/CLAUDE.md +6 -0
  465. package/tasks/server.ts +1 -0
  466. package/tasks/types.ts +36 -0
  467. package/three/CLAUDE.md +6 -0
  468. package/three/client.ts +1 -0
  469. package/three/seed.ts +54 -0
  470. package/three/server.ts +2 -0
  471. package/three/types.ts +238 -0
  472. package/three/view.tsx +453 -0
  473. package/todo/client.ts +2 -0
  474. package/todo/seed.ts +9 -0
  475. package/todo/server.ts +2 -0
  476. package/todo/types.ts +32 -0
  477. package/todo/view.tsx +67 -0
  478. package/whisper/CLAUDE.md +16 -0
  479. package/whisper/client.ts +1 -0
  480. package/whisper/inbox.ts +54 -0
  481. package/whisper/route.ts +182 -0
  482. package/whisper/seed.ts +15 -0
  483. package/whisper/server.ts +4 -0
  484. package/whisper/service.ts +29 -0
  485. package/whisper/types.ts +51 -0
  486. package/whisper/view.tsx +81 -0
@@ -0,0 +1,328 @@
1
+ // Brahman bot service — Telegram runtime
2
+ // Session + auth middleware, command routing, callback queries, start/stop lifecycle
3
+
4
+ import { run as runBot, type RunnerHandle } from '@grammyjs/runner';
5
+ import { getComponent, type NodeData, register } from '@treenity/core';
6
+ import type { ServiceCtx, ServiceHandle } from '@treenity/core/contexts/service';
7
+ import { Autostart } from '@treenity/core/mods/autostart/service';
8
+ import type { ActionCtx } from '@treenity/core/server/actions';
9
+ import { Bot } from 'grammy';
10
+ import { type BrahmanCtx, executeAction, executePage, findActionComp, formatTString, resolveWait } from './helpers';
11
+ import { BotConfig, BrahmanSession, BrahmanUser, PageConfig } from './types';
12
+
13
+ // ── Bot factory (overridable for tests) ──
14
+
15
+ let _botFactory: ((token: string) => unknown) | undefined;
16
+ export function setBotFactory(f: ((token: string) => unknown) | undefined) { _botFactory = f; }
17
+
18
+ // ── Bot service registration ──
19
+
20
+ register('brahman.bot', 'service', async (node: NodeData, svcCtx: ServiceCtx): Promise<ServiceHandle> => {
21
+ const config = getComponent(node, BotConfig);
22
+ if (!config?.token) throw new Error('brahman.bot: token not configured');
23
+
24
+ const bot = (_botFactory?.(config.token) ?? new Bot(config.token)) as Bot;
25
+ const botPath = node.$path;
26
+ const botLangs = (config.langs || 'ru,en').split(',').map(s => s.trim());
27
+ const defaultLang = botLangs[0] || 'ru';
28
+
29
+ // Ensure dirs exist
30
+ const dirs = ['pages', 'users', 'sessions'];
31
+ for (const d of dirs) {
32
+ const dirPath = `${botPath}/${d}`;
33
+ if (!(await svcCtx.store.get(dirPath))) {
34
+ await svcCtx.store.set({ $path: dirPath, $type: 'dir' } as NodeData);
35
+ }
36
+ }
37
+
38
+ // ── Global middleware: pending callbacks → maintenance → session → auth ──
39
+
40
+ bot.use(async (gCtx, next) => {
41
+ const userId = gCtx.from?.id;
42
+ if (!userId) return;
43
+
44
+ // Maintenance check
45
+ if (config.maintenance) {
46
+ await gCtx.reply(config.maintenance);
47
+ return;
48
+ }
49
+
50
+ // Load/create session
51
+ const sessionPath = `${botPath}/sessions/${userId}`;
52
+ let sessionNode = await svcCtx.store.get(sessionPath);
53
+ if (!sessionNode) {
54
+ sessionNode = {
55
+ $path: sessionPath, $type: 'brahman.session',
56
+ tid: userId, data: {}, history: [], callbacks: {},
57
+ } as NodeData;
58
+ await svcCtx.store.set(sessionNode);
59
+ }
60
+
61
+ // Load/create user
62
+ const userPath = `${botPath}/users/${userId}`;
63
+ let userNode = await svcCtx.store.get(userPath);
64
+ if (!userNode) {
65
+ userNode = {
66
+ $path: userPath, $type: 'brahman.user',
67
+ tid: userId,
68
+ firstName: gCtx.from.first_name ?? '',
69
+ lastName: gCtx.from.last_name ?? '',
70
+ username: gCtx.from.username ?? '',
71
+ lang: gCtx.from.language_code ?? defaultLang,
72
+ isAdmin: false, blocked: false, banned: false, tags: [],
73
+ } as NodeData;
74
+ await svcCtx.store.set(userNode);
75
+ }
76
+
77
+ const userData = getComponent(userNode, BrahmanUser);
78
+ if (userData?.banned) return;
79
+
80
+ // Mark as unblocked if previously blocked (user restarted bot)
81
+ if (userData?.blocked) {
82
+ (userData as any).blocked = false;
83
+ await svcCtx.store.set(userNode);
84
+ }
85
+
86
+ const sessionComp = getComponent(sessionNode, BrahmanSession);
87
+ const sessionData = (sessionComp as any)?.data ?? {};
88
+ if (!sessionData.history) sessionData.history = (sessionComp as any)?.history ?? [];
89
+
90
+ const bCtx: BrahmanCtx = {
91
+ ctx: gCtx, store: svcCtx.store,
92
+ session: sessionData,
93
+ sessionNode,
94
+ user: userNode,
95
+ lang: userData?.lang || defaultLang,
96
+ botPath,
97
+ userTags: userData?.tags ?? [],
98
+ botLangs,
99
+ };
100
+
101
+ (gCtx as any)._brahman = bCtx;
102
+
103
+ // Resolve pending wait (session-persisted) — consumes message if matched
104
+ if (!(sessionData.wait && await resolveWait(bCtx, gCtx))) {
105
+ await next();
106
+ }
107
+
108
+ // Save session after handler
109
+ Object.assign(sessionNode, {
110
+ data: sessionData,
111
+ history: sessionData.history ?? [],
112
+ callbacks: sessionData.callbacks ?? {},
113
+ });
114
+ await svcCtx.store.set(sessionNode);
115
+ });
116
+
117
+ // ── Dynamic page lookup (pages can be added/changed at runtime) ──
118
+
119
+ async function getPages() {
120
+ const { items } = await svcCtx.store.getChildren(`${botPath}/pages`, { depth: 10 });
121
+ return items.filter(n => n.$type === 'brahman.page');
122
+ }
123
+
124
+ async function findPageByCommand(cmd: string) {
125
+ const pages = await getPages();
126
+ return pages.find(p => {
127
+ const pc = getComponent(p, PageConfig);
128
+ return pc?.command === `/${cmd}` || pc?.command === cmd;
129
+ });
130
+ }
131
+
132
+ async function findStartPage() {
133
+ return findPageByCommand('start');
134
+ }
135
+
136
+ // ── Callback queries: page:/path, btn:id, lang:xx ──
137
+
138
+ bot.on('callback_query:data', async (gCtx) => {
139
+ const bCtx = (gCtx as any)._brahman as BrahmanCtx;
140
+ if (!bCtx) return;
141
+ const data = gCtx.callbackQuery.data;
142
+
143
+ if (data.startsWith('page:')) {
144
+ const pagePath = data.slice(5);
145
+ const colonIdx = pagePath.indexOf(':');
146
+ if (colonIdx >= 0) {
147
+ bCtx.session.param = pagePath.slice(colonIdx + 1);
148
+ await executePage(pagePath.slice(0, colonIdx), bCtx);
149
+ } else {
150
+ await executePage(pagePath, bCtx);
151
+ }
152
+ } else if (data.startsWith('btn:')) {
153
+ const btnId = parseInt(data.slice(4), 10);
154
+ const lastMenuPath = bCtx.session._lastMenu as string | undefined;
155
+ if (lastMenuPath) {
156
+ const menuNode = await svcCtx.store.get(lastMenuPath);
157
+ const menuComp = menuNode ? findActionComp(menuNode) as any : null;
158
+ if (menuComp?.rows) {
159
+ for (const row of menuComp.rows) {
160
+ for (const btn of row.buttons) {
161
+ if (btn.id === btnId && btn.action) {
162
+ if (btn.action.type === 'brahman.action.page' && btn.action.target) {
163
+ await executePage(btn.action.target, bCtx);
164
+ } else if (btn.action.target) {
165
+ const actionNode = await svcCtx.store.get(btn.action.target);
166
+ if (actionNode) await executeAction(actionNode, bCtx);
167
+ }
168
+ }
169
+ }
170
+ }
171
+ }
172
+ }
173
+ } else if (data.startsWith('lang:')) {
174
+ const newLang = data.slice(5);
175
+ if (bCtx.botLangs.includes(newLang)) {
176
+ const userData = getComponent(bCtx.user, BrahmanUser);
177
+ if (userData) {
178
+ (userData as any).lang = newLang;
179
+ await svcCtx.store.set(bCtx.user);
180
+ bCtx.lang = newLang;
181
+ }
182
+ bCtx.session.langSelected = newLang;
183
+ const startPage = await findStartPage();
184
+ if (startPage) await executePage(startPage.$path, bCtx);
185
+ }
186
+ }
187
+ await gCtx.answerCallbackQuery();
188
+ });
189
+
190
+ // ── Text message handler: button callback → command fallback ──
191
+
192
+ bot.on('message:text', async (gCtx) => {
193
+ const bCtx = (gCtx as any)._brahman as BrahmanCtx;
194
+ if (!bCtx) return;
195
+
196
+ const text = gCtx.message.text;
197
+ if (text.startsWith('/')) {
198
+ const cmd = text.slice(1).split(/\s/)[0];
199
+ const page = await findPageByCommand(cmd);
200
+ if (page) {
201
+ const paramMatch = text.match(/^\/\S+\s+(.*)/);
202
+ if (paramMatch) bCtx.session.param = paramMatch[1];
203
+ await executePage(page.$path, bCtx);
204
+ return;
205
+ }
206
+ const startPage = await findStartPage();
207
+ if (startPage) await executePage(startPage.$path, bCtx);
208
+ return;
209
+ }
210
+
211
+ // Try button callback from last page in history
212
+ const history = (bCtx.session.history ?? []) as string[];
213
+ if (history.length > 0) {
214
+ const lastPagePath = history[history.length - 1];
215
+ const pageNode = await svcCtx.store.get(lastPagePath);
216
+ if (pageNode) {
217
+ const { items: children } = await svcCtx.store.getChildren(lastPagePath + '/_actions');
218
+ for (const child of children) {
219
+ const actionComp = findActionComp(child) as any;
220
+ if (!actionComp) continue;
221
+ if (actionComp.menuType === 'keyboard' && actionComp.rows) {
222
+ for (const row of actionComp.rows) {
223
+ for (const btn of row.buttons) {
224
+ const btnText = formatTString(btn.title, bCtx.lang);
225
+ if (btnText === text && btn.action) {
226
+ if (btn.action.type === 'brahman.action.page' && btn.action.target) {
227
+ await executePage(btn.action.target, bCtx);
228
+ return;
229
+ } else if (btn.action.target) {
230
+ const actionNode = await svcCtx.store.get(btn.action.target);
231
+ if (actionNode) await executeAction(actionNode, bCtx);
232
+ return;
233
+ }
234
+ }
235
+ }
236
+ }
237
+ }
238
+ }
239
+ }
240
+ }
241
+
242
+ // Fallback: check _lastMenu for backward compat
243
+ const lastMenuPath = bCtx.session._lastMenu as string | undefined;
244
+ if (lastMenuPath) {
245
+ const menuNode = await svcCtx.store.get(lastMenuPath);
246
+ const menuComp = menuNode ? findActionComp(menuNode) as any : null;
247
+ if (menuComp?.menuType === 'keyboard' && menuComp.rows) {
248
+ for (const row of menuComp.rows) {
249
+ for (const btn of row.buttons) {
250
+ const btnText = formatTString(btn.title, bCtx.lang);
251
+ if (btnText === text && btn.action) {
252
+ if (btn.action.type === 'brahman.action.page' && btn.action.target) {
253
+ await executePage(btn.action.target, bCtx);
254
+ return;
255
+ }
256
+ }
257
+ }
258
+ }
259
+ }
260
+ }
261
+
262
+ // Default fallback: /start page
263
+ const startPage = await findStartPage();
264
+ if (startPage) {
265
+ await executePage(startPage.$path, bCtx);
266
+ }
267
+ });
268
+
269
+ bot.catch(err => console.error(`[brahman:${config.alias || botPath}]`, err.message ?? err));
270
+
271
+ // Init bot (getMe) and fill node with bot info
272
+ await bot.init();
273
+ const info = bot.botInfo;
274
+ if (info) {
275
+ const updates: Record<string, unknown> = {};
276
+ if (info.username && !config.alias) updates.alias = `@${info.username}`;
277
+ if (info.first_name && !config.name) updates.name = info.first_name;
278
+ if (Object.keys(updates).length > 0) {
279
+ const fresh = await svcCtx.store.get(botPath);
280
+ if (fresh) await svcCtx.store.set({ ...fresh, ...updates });
281
+ }
282
+ }
283
+
284
+ let runner: RunnerHandle | null = null;
285
+
286
+ if (config.running !== false) {
287
+ runner = runBot(bot);
288
+ }
289
+
290
+ // React to start/stop actions toggling the running flag
291
+ const unsub = svcCtx.subscribe(botPath, async () => {
292
+ const fresh = await svcCtx.store.get(botPath);
293
+ if (!fresh) return;
294
+ const cfg = getComponent(fresh, BotConfig);
295
+ const shouldRun = cfg?.running !== false;
296
+
297
+ if (shouldRun && !runner) {
298
+ runner = runBot(bot);
299
+ } else if (!shouldRun && runner) {
300
+ runner.stop();
301
+ runner = null;
302
+ }
303
+ });
304
+
305
+ return {
306
+ stop: async () => {
307
+ unsub();
308
+ if (runner) runner.stop();
309
+ },
310
+ };
311
+ });
312
+
313
+ // ── Start/stop actions — delegate to autostart service manager ──
314
+
315
+ /** @description Start the Telegram bot polling loop via autostart service */
316
+ register('brahman.bot', 'action:start', async (ctx: ActionCtx) => {
317
+ await ctx.nc('/sys/autostart').get(Autostart).start({ path: ctx.node.$path });
318
+ // Set running flag — service subscription reacts and calls bot.start()
319
+ const fresh = await ctx.store.get(ctx.node.$path);
320
+ if (fresh) await ctx.store.set({ ...fresh, running: true });
321
+ });
322
+
323
+ /** @description Stop the Telegram bot polling loop via autostart service */
324
+ register('brahman.bot', 'action:stop', async (ctx: ActionCtx) => {
325
+ await ctx.nc('/sys/autostart').get(Autostart).stop({ path: ctx.node.$path });
326
+ const fresh = await ctx.store.get(ctx.node.$path);
327
+ if (fresh) await ctx.store.set({ ...fresh, running: false });
328
+ });