@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,2 @@
1
+ import './types';
2
+ import './view';
@@ -0,0 +1,374 @@
1
+ // Brahman helpers — template engine, formatting, keyboards, execution runtime
2
+ // Shared between action handlers and bot service
3
+
4
+ import { getComponent, type NodeData, resolve as resolveCtx } from '@treenity/core';
5
+ import type { Tree } from '@treenity/core/tree';
6
+ import { type Context, InlineKeyboard, Keyboard } from 'grammy';
7
+ import { BrahmanUser, type MenuRow, type MenuType, PageConfig, type TString, type WaitState } from './types';
8
+
9
+ // ── TString formatting ──
10
+
11
+ export function formatTString(ts: TString | undefined, lang: string): string {
12
+ if (!ts) return '';
13
+ return ts[lang] || ts.ru || ts.en || Object.values(ts).find(v => v) || '';
14
+ }
15
+
16
+ // ── Template engine (Handlebars-compatible) ──
17
+ // Supports: {field}, {data.nested}, {{#ifEquals a b}}...{{else}}...{{/ifEquals}},
18
+ // {{#tag name}}...{{else}}...{{/tag}}, {{shortDate d}}, {{toFixed n f}},
19
+ // {{switch v c1 v1 c2 v2}}, {{#and v1 v2}}...{{else}}...{{/and}}, {{eval expr}}
20
+
21
+ export function resolveVar(path: string, data: Record<string, unknown>): unknown {
22
+ let val: unknown = data;
23
+ for (const key of path.split('.')) {
24
+ if (val == null || typeof val !== 'object') return undefined;
25
+ val = (val as Record<string, unknown>)[key];
26
+ }
27
+ return val;
28
+ }
29
+
30
+ export function renderTemplate(template: string, data: Record<string, unknown>): string {
31
+ let result = template;
32
+
33
+ // Block helpers: {{#helper args}}...{{else}}...{{/helper}}
34
+ result = result.replace(
35
+ /\{\{#ifEquals\s+(\S+)\s+['"]?([^'"}\s]+)['"]?\}\}([\s\S]*?)\{\{\/ifEquals\}\}/g,
36
+ (_, varPath, compareVal, body) => {
37
+ const val = String(resolveVar(varPath, data) ?? '');
38
+ const [truePart, falsePart = ''] = body.split('{{else}}');
39
+ return val === compareVal ? truePart : falsePart;
40
+ },
41
+ );
42
+
43
+ result = result.replace(
44
+ /\{\{#tag\s+(\S+)\}\}([\s\S]*?)\{\{\/tag\}\}/g,
45
+ (_, tagName, body) => {
46
+ const tags = (data.userTags ?? data.tags ?? []) as string[];
47
+ const [truePart, falsePart = ''] = body.split('{{else}}');
48
+ return tags.includes(tagName) ? truePart : falsePart;
49
+ },
50
+ );
51
+
52
+ result = result.replace(
53
+ /\{\{#and\s+([\s\S]*?)\}\}([\s\S]*?)\{\{\/and\}\}/g,
54
+ (_, varsStr, body) => {
55
+ const vars = varsStr.trim().split(/\s+/);
56
+ const allTrue = vars.every((v: string) => !!resolveVar(v, data));
57
+ const [truePart, falsePart = ''] = body.split('{{else}}');
58
+ return allTrue ? truePart : falsePart;
59
+ },
60
+ );
61
+
62
+ // Inline helpers: {{helperName args}}
63
+ result = result.replace(/\{\{shortDate\s+(\S+)\}\}/g, (_, varPath) => {
64
+ const val = resolveVar(varPath, data);
65
+ if (!val) return '';
66
+ const d = new Date(val as string | number);
67
+ const dd = String(d.getDate()).padStart(2, '0');
68
+ const mm = String(d.getMonth() + 1).padStart(2, '0');
69
+ const yy = String(d.getFullYear()).slice(-2);
70
+ return `${dd}.${mm}.${yy}`;
71
+ });
72
+
73
+ result = result.replace(/\{\{toFixed\s+(\S+)\s+(\d+)\}\}/g, (_, varPath, fraction) => {
74
+ const val = resolveVar(varPath, data);
75
+ return val != null ? Number(val).toFixed(Number(fraction)) : '';
76
+ });
77
+
78
+ result = result.replace(/\{\{is\s+(\S+)\}\}/g, (_, varPath) => {
79
+ return resolveVar(varPath, data) ? 'true' : '';
80
+ });
81
+
82
+ result = result.replace(/\{\{switch\s+([\s\S]*?)\}\}/g, (_, argsStr) => {
83
+ const args = argsStr.trim().split(/\s+/);
84
+ const val = String(resolveVar(args[0], data) ?? '');
85
+ for (let i = 1; i < args.length - 1; i += 2) {
86
+ if (args[i] === val) return args[i + 1] ?? '';
87
+ }
88
+ return '';
89
+ });
90
+
91
+ result = result.replace(/\{\{eval\s+([\s\S]*?)\}\}/g, (_, expr) => {
92
+ try {
93
+ const fn = new Function('data', 'session', 'user', `return (${expr})`);
94
+ return String(fn(data, data, data.user) ?? '');
95
+ } catch { return ''; }
96
+ });
97
+
98
+ // Simple variable interpolation: {field} and {data.nested} and {{field}}
99
+ result = result.replace(/\{\{(\w+(?:\.\w+)*)\}\}/g, (_, path: string) => {
100
+ const val = resolveVar(path, data);
101
+ return val != null ? String(val) : '';
102
+ });
103
+
104
+ result = result.replace(/\{(\w+(?:\.\w+)*)\}/g, (_, path: string) => {
105
+ const val = resolveVar(path, data);
106
+ return val != null ? String(val) : '';
107
+ });
108
+
109
+ return result;
110
+ }
111
+
112
+ // ── Tag checking (from old brahman) ──
113
+ // Tags with ! prefix = exclude, without = include (at least one match)
114
+
115
+ export function checkTags(userTags: string[], buttonTags: string[]): boolean {
116
+ if (!buttonTags.length) return true;
117
+
118
+ const includes = buttonTags.filter(t => !t.startsWith('!'));
119
+ const excludes = buttonTags.filter(t => t.startsWith('!')).map(t => t.slice(1));
120
+
121
+ if (excludes.some(t => userTags.includes(t))) return false;
122
+ if (includes.length === 0) return true;
123
+ return includes.some(t => userTags.includes(t));
124
+ }
125
+
126
+ // ── Keyboard building ──
127
+
128
+ export function buildReplyMarkup(rows: MenuRow[], type: MenuType, lang: string, userTags: string[] = []) {
129
+ if (type === 'none') return undefined;
130
+ if (type === 'remove') return { reply_markup: { remove_keyboard: true as const } };
131
+ if (type === 'force_reply') return { reply_markup: { force_reply: true as const } };
132
+
133
+ if (type === 'keyboard') {
134
+ const kb = new Keyboard();
135
+ for (const row of rows) {
136
+ for (const btn of row.buttons) {
137
+ if (!checkTags(userTags, btn.tags ?? [])) continue;
138
+ const text = formatTString(btn.title, lang);
139
+ if (!text) continue; // Telegram rejects empty button text
140
+ kb.text(text);
141
+ }
142
+ kb.row();
143
+ }
144
+ return { reply_markup: kb.resized() };
145
+ }
146
+
147
+ // Inline keyboards (inline, inline_new, inline_close)
148
+ const kb = new InlineKeyboard();
149
+ for (const row of rows) {
150
+ for (const btn of row.buttons) {
151
+ if (!checkTags(userTags, btn.tags ?? [])) continue;
152
+ const text = formatTString(btn.title, lang);
153
+ if (!text) continue; // Telegram rejects empty button text
154
+ if (btn.url) {
155
+ kb.url(text, btn.url);
156
+ } else {
157
+ const cbData = btn.action?.type === 'brahman.action.page'
158
+ ? `page:${btn.action.target ?? ''}`
159
+ : `btn:${btn.id}`;
160
+ kb.text(text, cbData);
161
+ }
162
+ }
163
+ kb.row();
164
+ }
165
+ return { reply_markup: kb };
166
+ }
167
+
168
+ // ── Brahman execution context ──
169
+
170
+ /** @opaque Runtime-injected, not part of public schema */
171
+ export type BrahmanCtx = {
172
+ ctx: Context;
173
+ store: Tree;
174
+ session: Record<string, unknown>;
175
+ sessionNode: NodeData;
176
+ user: NodeData;
177
+ lang: string;
178
+ botPath: string;
179
+ userTags: string[];
180
+ botLangs: string[];
181
+ /** Last error for on-error actions */
182
+ error?: Error;
183
+ };
184
+
185
+ // ── Find action component on a node ──
186
+
187
+ export function findActionComp(node: NodeData): Record<string, unknown> | undefined {
188
+ // Node itself is the action (same logic as getComponent: node.$type match → return node)
189
+ if (node.$type?.startsWith('brahman.action.')) return node;
190
+ // Fallback: scan nested components
191
+ for (const [k, v] of Object.entries(node)) {
192
+ if (k.startsWith('$')) continue;
193
+ if (typeof v === 'object' && v && '$type' in v
194
+ && typeof (v as any).$type === 'string'
195
+ && (v as any).$type.startsWith('brahman.action.')) {
196
+ return v as Record<string, unknown>;
197
+ }
198
+ }
199
+ }
200
+
201
+ // ── StopProcess sentinel (for if-else stopAfterAction) ──
202
+
203
+ export class StopProcess extends Error { constructor() { super('StopProcess'); } }
204
+
205
+ // ── Build template context from BrahmanCtx ──
206
+
207
+ export function buildTemplateData(bCtx: BrahmanCtx): Record<string, unknown> {
208
+ const userData = getComponent(bCtx.user, BrahmanUser);
209
+ return {
210
+ ...bCtx.session,
211
+ user: userData ?? {},
212
+ userTags: bCtx.userTags,
213
+ tags: bCtx.userTags,
214
+ lang: bCtx.lang,
215
+ ctx: {
216
+ user: userData,
217
+ session: bCtx.session,
218
+ },
219
+ };
220
+ }
221
+
222
+ // ── Format template with BrahmanCtx ──
223
+
224
+ export function format(template: string, bCtx: BrahmanCtx): string {
225
+ return renderTemplate(template, buildTemplateData(bCtx));
226
+ }
227
+
228
+ // ── Format TString + template ──
229
+
230
+ export function formatText(ts: TString | undefined, bCtx: BrahmanCtx): string {
231
+ const raw = formatTString(ts, bCtx.lang);
232
+ return format(raw, bCtx);
233
+ }
234
+
235
+ // ── Language flags ──
236
+
237
+ export const LANG_FLAGS: Record<string, string> = {
238
+ ru: '\u{1F1F7}\u{1F1FA}', en: '\u{1F1EC}\u{1F1E7}', de: '\u{1F1E9}\u{1F1EA}',
239
+ uz: '\u{1F1FA}\u{1F1FF}', fr: '\u{1F1EB}\u{1F1F7}', es: '\u{1F1EA}\u{1F1F8}',
240
+ it: '\u{1F1EE}\u{1F1F9}', pt: '\u{1F1F5}\u{1F1F9}', tr: '\u{1F1F9}\u{1F1F7}',
241
+ };
242
+
243
+ // ── Language keyboard builder ──
244
+
245
+ export function buildLangKeyboard(langs: string[]) {
246
+ const kb = new InlineKeyboard();
247
+ for (const l of langs) {
248
+ const flag = LANG_FLAGS[l] || l.toUpperCase();
249
+ kb.text(`${flag} ${l}`, `lang:${l}`);
250
+ }
251
+ return kb;
252
+ }
253
+
254
+ // ── Page execution ──
255
+
256
+ export async function executePage(pagePath: string, bCtx: BrahmanCtx): Promise<void> {
257
+ const pageNode = await bCtx.store.get(pagePath);
258
+ if (!pageNode) return;
259
+
260
+ const pageComp = getComponent(pageNode, PageConfig);
261
+ if (!pageComp) return;
262
+
263
+ // Push to history
264
+ const history = (bCtx.session.history ?? []) as string[];
265
+ history.push(pagePath);
266
+
267
+ const { items } = await bCtx.store.getChildren(pagePath + '/_actions');
268
+ const positions = pageComp.positions ?? [];
269
+ const tracked = new Set(positions);
270
+ const sorted = [
271
+ ...positions.map(p => items.find(n => n.$path === p)).filter((n): n is NodeData => !!n),
272
+ ...items.filter(n => !tracked.has(n.$path) && n.$type?.startsWith('brahman.action.')),
273
+ ];
274
+
275
+ try {
276
+ await executeActions(sorted, bCtx);
277
+ } catch (e) {
278
+ if (e instanceof StopProcess) return;
279
+
280
+ // Error routing — run 'error' command page if exists
281
+ const errorMsg = e instanceof Error ? e.message : String(e);
282
+ console.error(`[brahman:${bCtx.botPath}] action error:`, errorMsg);
283
+
284
+ // 403 = user blocked the bot
285
+ if (errorMsg.includes('403') || errorMsg.includes('Forbidden')) {
286
+ const userData = getComponent(bCtx.user, BrahmanUser);
287
+ if (userData) {
288
+ (userData as any).blocked = true;
289
+ await bCtx.store.set(bCtx.user);
290
+ }
291
+ return;
292
+ }
293
+
294
+ // Tree error in session and route to error page
295
+ bCtx.error = e instanceof Error ? e : new Error(String(e));
296
+ bCtx.session.error = { message: errorMsg };
297
+
298
+ try {
299
+ const { items: pages } = await bCtx.store.getChildren(`${bCtx.botPath}/pages`);
300
+ const errorPage = pages.find(p => getComponent(p, PageConfig)?.command === '/error');
301
+ if (errorPage) await executePage(errorPage.$path, bCtx);
302
+ } catch (innerErr) {
303
+ console.error(`[brahman:${bCtx.botPath}] error page failed:`, innerErr);
304
+ }
305
+ }
306
+ }
307
+
308
+ // ── Action dispatcher ──
309
+ // Calls action:run (auto-registered by registerType from run() methods on action classes)
310
+
311
+ const _neverAbort = new AbortController().signal;
312
+
313
+ export async function executeAction(node: NodeData, bCtx: BrahmanCtx): Promise<void> {
314
+ const handler = resolveCtx(node.$type, 'action:run');
315
+ if (!handler) return;
316
+ await (handler as any)({ node, store: bCtx.store, signal: _neverAbort }, bCtx);
317
+ }
318
+
319
+ // ── Sequential action runner with wait support ──
320
+ // Stops if an action sets session.wait (question asked), stores remaining paths
321
+
322
+ export async function executeActions(actions: NodeData[], bCtx: BrahmanCtx): Promise<void> {
323
+ for (let i = 0; i < actions.length; i++) {
324
+ await executeAction(actions[i], bCtx);
325
+ if (bCtx.session.wait) {
326
+ (bCtx.session.wait as WaitState).remaining = actions.slice(i + 1).map(n => n.$path);
327
+ return;
328
+ }
329
+ }
330
+ }
331
+
332
+ // ── Resolve persisted wait state from session ──
333
+ // Called by middleware when a message arrives and session.wait is set
334
+
335
+ export async function resolveWait(bCtx: BrahmanCtx, gCtx: Context): Promise<boolean> {
336
+ const wait = bCtx.session.wait as WaitState | undefined;
337
+ if (!wait) return false;
338
+
339
+ const msgType = gCtx.message?.text ? 'text' : (gCtx.message as any)?.photo ? 'photo' : null;
340
+ if (!msgType || msgType !== wait.type) return false;
341
+
342
+ // Save answer to session
343
+ if (wait.saveTo) {
344
+ if (wait.type === 'text') {
345
+ bCtx.session[wait.saveTo] = gCtx.message?.text ?? '';
346
+ } else {
347
+ const photos = (gCtx.message as any)?.photo;
348
+ bCtx.session[wait.saveTo] = photos?.[photos.length - 1]?.file_id ?? '';
349
+ }
350
+ }
351
+
352
+ // Delete messages if configured
353
+ if (wait.deleteMessages) {
354
+ const chatId = gCtx.chat?.id;
355
+ if (chatId) {
356
+ try {
357
+ if (wait.sentMsgId) await gCtx.api.deleteMessage(chatId, wait.sentMsgId);
358
+ if (gCtx.message?.message_id) await gCtx.api.deleteMessage(chatId, gCtx.message.message_id);
359
+ } catch { /* deletion may fail if msg too old */ }
360
+ }
361
+ }
362
+
363
+ // Grab remaining action paths before clearing wait
364
+ const remaining = wait.remaining ?? [];
365
+ delete bCtx.session.wait;
366
+
367
+ // Execute remaining actions (may set a new wait if another question is encountered)
368
+ if (remaining.length) {
369
+ const nodes = (await Promise.all(remaining.map(p => bCtx.store.get(p)))).filter(Boolean) as NodeData[];
370
+ await executeActions(nodes, bCtx);
371
+ }
372
+
373
+ return true;
374
+ }
@@ -0,0 +1,2 @@
1
+ import './types';
2
+ import './service';