@treenity/core 1.0.47 → 3.0.0

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 (696) hide show
  1. package/dist/chain.d.ts +20 -0
  2. package/dist/chain.d.ts.map +1 -0
  3. package/dist/chain.js +59 -0
  4. package/dist/chain.js.map +1 -0
  5. package/dist/client/handle.d.ts +13 -0
  6. package/dist/client/handle.d.ts.map +1 -0
  7. package/dist/client/handle.js +46 -0
  8. package/dist/client/handle.js.map +1 -0
  9. package/dist/client/index.d.ts +21 -0
  10. package/dist/client/index.d.ts.map +1 -0
  11. package/dist/client/index.js +5 -0
  12. package/dist/client/index.js.map +1 -0
  13. package/dist/client/trpc.d.ts +13 -0
  14. package/dist/client/trpc.d.ts.map +1 -0
  15. package/dist/client/trpc.js +78 -0
  16. package/dist/client/trpc.js.map +1 -0
  17. package/dist/client.d.ts +2 -0
  18. package/dist/client.d.ts.map +1 -0
  19. package/dist/client.js +2 -0
  20. package/dist/client.js.map +1 -0
  21. package/dist/comp/handle.d.ts +14 -0
  22. package/dist/comp/handle.d.ts.map +1 -0
  23. package/dist/comp/handle.js +21 -0
  24. package/dist/comp/handle.js.map +1 -0
  25. package/dist/comp/index.d.ts +42 -0
  26. package/dist/comp/index.d.ts.map +1 -0
  27. package/dist/comp/index.js +126 -0
  28. package/dist/comp/index.js.map +1 -0
  29. package/dist/comp/needs.d.ts +26 -0
  30. package/dist/comp/needs.d.ts.map +1 -0
  31. package/dist/comp/needs.js +101 -0
  32. package/dist/comp/needs.js.map +1 -0
  33. package/dist/comp/validate.d.ts +13 -0
  34. package/dist/comp/validate.d.ts.map +1 -0
  35. package/dist/comp/validate.js +117 -0
  36. package/dist/comp/validate.js.map +1 -0
  37. package/dist/comp.d.ts +2 -0
  38. package/dist/comp.d.ts.map +1 -0
  39. package/dist/comp.js +2 -0
  40. package/dist/comp.js.map +1 -0
  41. package/dist/contexts/schema/index.d.ts +7 -0
  42. package/dist/contexts/schema/index.d.ts.map +1 -0
  43. package/dist/contexts/schema/index.js +2 -0
  44. package/dist/contexts/schema/index.js.map +1 -0
  45. package/dist/contexts/schema.d.ts +2 -0
  46. package/dist/contexts/schema.d.ts.map +1 -0
  47. package/dist/contexts/schema.js +2 -0
  48. package/dist/contexts/schema.js.map +1 -0
  49. package/dist/contexts/service/index.d.ts +31 -0
  50. package/dist/contexts/service/index.d.ts.map +1 -0
  51. package/dist/contexts/service/index.js +16 -0
  52. package/dist/contexts/service/index.js.map +1 -0
  53. package/dist/contexts/service.d.ts +1 -14
  54. package/dist/contexts/service.d.ts.map +1 -1
  55. package/dist/contexts/service.js +2 -0
  56. package/dist/contexts/service.js.map +1 -0
  57. package/dist/contexts/telegram/index.d.ts +19 -0
  58. package/dist/contexts/telegram/index.d.ts.map +1 -0
  59. package/dist/contexts/telegram/index.js +89 -0
  60. package/dist/contexts/telegram/index.js.map +1 -0
  61. package/dist/contexts/text/index.d.ts +7 -0
  62. package/dist/contexts/text/index.d.ts.map +1 -0
  63. package/dist/contexts/text/index.js +9 -0
  64. package/dist/contexts/text/index.js.map +1 -0
  65. package/dist/contexts/text.d.ts +2 -0
  66. package/dist/contexts/text.d.ts.map +1 -0
  67. package/dist/contexts/text.js +2 -0
  68. package/dist/contexts/text.js.map +1 -0
  69. package/dist/core/component.d.ts +41 -0
  70. package/dist/core/component.d.ts.map +1 -0
  71. package/dist/core/component.js +105 -0
  72. package/dist/core/component.js.map +1 -0
  73. package/dist/core/context.d.ts +5 -0
  74. package/dist/core/context.d.ts.map +1 -0
  75. package/dist/core/context.js +3 -0
  76. package/dist/core/context.js.map +1 -0
  77. package/dist/core/index.d.ts +5 -0
  78. package/dist/core/index.d.ts.map +1 -0
  79. package/dist/core/index.js +8 -0
  80. package/dist/core/index.js.map +1 -0
  81. package/dist/core/path.d.ts +7 -0
  82. package/dist/core/path.d.ts.map +1 -0
  83. package/dist/core/path.js +37 -0
  84. package/dist/core/path.js.map +1 -0
  85. package/dist/core/registry.d.ts +16 -0
  86. package/dist/core/registry.d.ts.map +1 -0
  87. package/dist/core/registry.js +100 -0
  88. package/dist/core/registry.js.map +1 -0
  89. package/dist/core.d.ts +2 -0
  90. package/dist/core.d.ts.map +1 -0
  91. package/dist/core.js +2 -0
  92. package/dist/core.js.map +1 -0
  93. package/dist/log.d.ts +8 -0
  94. package/dist/log.d.ts.map +1 -0
  95. package/dist/log.js +31 -0
  96. package/dist/log.js.map +1 -0
  97. package/dist/mod/discover.d.ts +4 -0
  98. package/dist/mod/discover.d.ts.map +1 -0
  99. package/dist/mod/discover.js +103 -0
  100. package/dist/mod/discover.js.map +1 -0
  101. package/dist/mod/examples/ticker/seed.d.ts +3 -0
  102. package/dist/mod/examples/ticker/seed.d.ts.map +1 -0
  103. package/dist/mod/examples/ticker/seed.js +16 -0
  104. package/dist/mod/examples/ticker/seed.js.map +1 -0
  105. package/dist/mod/examples/ticker/service.d.ts +2 -0
  106. package/dist/mod/examples/ticker/service.d.ts.map +1 -0
  107. package/dist/mod/examples/ticker/service.js +18 -0
  108. package/dist/mod/examples/ticker/service.js.map +1 -0
  109. package/dist/mod/examples/ticker/types.d.ts +16 -0
  110. package/dist/mod/examples/ticker/types.d.ts.map +1 -0
  111. package/dist/mod/examples/ticker/types.js +20 -0
  112. package/dist/mod/examples/ticker/types.js.map +1 -0
  113. package/dist/mod/examples/ticker/view.d.ts +2 -0
  114. package/dist/mod/examples/ticker/view.d.ts.map +1 -0
  115. package/dist/mod/examples/ticker/view.js +10 -0
  116. package/dist/mod/examples/ticker/view.js.map +1 -0
  117. package/dist/mod/index.d.ts +11 -0
  118. package/dist/mod/index.d.ts.map +1 -0
  119. package/dist/mod/index.js +8 -0
  120. package/dist/mod/index.js.map +1 -0
  121. package/dist/mod/loader.d.ts +18 -0
  122. package/dist/mod/loader.d.ts.map +1 -0
  123. package/dist/mod/loader.js +154 -0
  124. package/dist/mod/loader.js.map +1 -0
  125. package/dist/mod/optimistic.d.ts +34 -0
  126. package/dist/mod/optimistic.d.ts.map +1 -0
  127. package/dist/mod/optimistic.js +176 -0
  128. package/dist/mod/optimistic.js.map +1 -0
  129. package/dist/mod/prefab.d.ts +18 -0
  130. package/dist/mod/prefab.d.ts.map +1 -0
  131. package/dist/mod/prefab.js +42 -0
  132. package/dist/mod/prefab.js.map +1 -0
  133. package/dist/mod/tracking.d.ts +8 -0
  134. package/dist/mod/tracking.d.ts.map +1 -0
  135. package/dist/mod/tracking.js +44 -0
  136. package/dist/mod/tracking.js.map +1 -0
  137. package/dist/mod/types.d.ts +31 -0
  138. package/dist/mod/types.d.ts.map +1 -0
  139. package/dist/mod/types.js +5 -0
  140. package/dist/mod/types.js.map +1 -0
  141. package/dist/mod.d.ts +2 -0
  142. package/dist/mod.d.ts.map +1 -0
  143. package/dist/mod.js +2 -0
  144. package/dist/mod.js.map +1 -0
  145. package/dist/mods/autostart/server.d.ts +2 -0
  146. package/dist/mods/autostart/server.d.ts.map +1 -0
  147. package/dist/mods/autostart/server.js +2 -0
  148. package/dist/mods/autostart/server.js.map +1 -0
  149. package/dist/mods/autostart/service.d.ts +14 -0
  150. package/dist/mods/autostart/service.d.ts.map +1 -0
  151. package/dist/mods/autostart/service.js +88 -0
  152. package/dist/mods/autostart/service.js.map +1 -0
  153. package/dist/mods/llm/index.d.ts +13 -0
  154. package/dist/mods/llm/index.d.ts.map +1 -0
  155. package/dist/mods/llm/index.js +43 -0
  156. package/dist/mods/llm/index.js.map +1 -0
  157. package/dist/mods/llm/server.d.ts +2 -0
  158. package/dist/mods/llm/server.d.ts.map +1 -0
  159. package/dist/mods/llm/server.js +2 -0
  160. package/dist/mods/llm/server.js.map +1 -0
  161. package/dist/mods/mcp/server.d.ts +3 -0
  162. package/dist/mods/mcp/server.d.ts.map +1 -0
  163. package/dist/mods/mcp/server.js +3 -0
  164. package/dist/mods/mcp/server.js.map +1 -0
  165. package/dist/mods/mcp/service.d.ts +2 -0
  166. package/dist/mods/mcp/service.d.ts.map +1 -0
  167. package/dist/mods/mcp/service.js +17 -0
  168. package/dist/mods/mcp/service.js.map +1 -0
  169. package/dist/mods/mcp/types.d.ts +5 -0
  170. package/dist/mods/mcp/types.d.ts.map +1 -0
  171. package/dist/mods/mcp/types.js +7 -0
  172. package/dist/mods/mcp/types.js.map +1 -0
  173. package/dist/mods/treenity/agent-port.d.ts +2 -0
  174. package/dist/mods/treenity/agent-port.d.ts.map +1 -0
  175. package/dist/mods/treenity/agent-port.js +76 -0
  176. package/dist/mods/treenity/agent-port.js.map +1 -0
  177. package/dist/mods/treenity/groups.d.ts +2 -0
  178. package/dist/mods/treenity/groups.d.ts.map +1 -0
  179. package/dist/mods/treenity/groups.js +18 -0
  180. package/dist/mods/treenity/groups.js.map +1 -0
  181. package/dist/mods/treenity/mod-type.d.ts +2 -0
  182. package/dist/mods/treenity/mod-type.d.ts.map +1 -0
  183. package/dist/mods/treenity/mod-type.js +9 -0
  184. package/dist/mods/treenity/mod-type.js.map +1 -0
  185. package/dist/mods/treenity/seed.d.ts +2 -0
  186. package/dist/mods/treenity/seed.d.ts.map +1 -0
  187. package/dist/mods/treenity/seed.js +53 -0
  188. package/dist/mods/treenity/seed.js.map +1 -0
  189. package/dist/mods/treenity/server.d.ts +5 -0
  190. package/dist/mods/treenity/server.d.ts.map +1 -0
  191. package/dist/mods/treenity/server.js +5 -0
  192. package/dist/mods/treenity/server.js.map +1 -0
  193. package/dist/mods/treenity/system.d.ts +36 -0
  194. package/dist/mods/treenity/system.d.ts.map +1 -0
  195. package/dist/mods/treenity/system.js +61 -0
  196. package/dist/mods/treenity/system.js.map +1 -0
  197. package/dist/mods/uix/client.d.ts +3 -0
  198. package/dist/mods/uix/client.d.ts.map +1 -0
  199. package/dist/mods/uix/client.js +96 -0
  200. package/dist/mods/uix/client.js.map +1 -0
  201. package/dist/mods/uix/compile.d.ts +7 -0
  202. package/dist/mods/uix/compile.d.ts.map +1 -0
  203. package/dist/mods/uix/compile.js +94 -0
  204. package/dist/mods/uix/compile.js.map +1 -0
  205. package/dist/mods/uix/jsx-parser.d.ts +2 -0
  206. package/dist/mods/uix/jsx-parser.d.ts.map +1 -0
  207. package/dist/mods/uix/jsx-parser.js +565 -0
  208. package/dist/mods/uix/jsx-parser.js.map +1 -0
  209. package/dist/mods/uix/verify.d.ts +7 -0
  210. package/dist/mods/uix/verify.d.ts.map +1 -0
  211. package/dist/mods/uix/verify.js +59 -0
  212. package/dist/mods/uix/verify.js.map +1 -0
  213. package/dist/schema/catalog.d.ts +23 -0
  214. package/dist/schema/catalog.d.ts.map +1 -0
  215. package/dist/schema/catalog.js +82 -0
  216. package/dist/schema/catalog.js.map +1 -0
  217. package/dist/schema/extract-schemas.d.ts +5 -0
  218. package/dist/schema/extract-schemas.d.ts.map +1 -0
  219. package/dist/schema/extract-schemas.js +444 -0
  220. package/dist/schema/extract-schemas.js.map +1 -0
  221. package/dist/schema/load.d.ts +2 -0
  222. package/dist/schema/load.d.ts.map +1 -0
  223. package/dist/schema/load.js +23 -0
  224. package/dist/schema/load.js.map +1 -0
  225. package/dist/schema/test-fixture.types.d.ts +2 -0
  226. package/dist/schema/test-fixture.types.d.ts.map +1 -0
  227. package/dist/schema/test-fixture.types.js +19 -0
  228. package/dist/schema/test-fixture.types.js.map +1 -0
  229. package/dist/schema/test-opaque.d.ts +3 -0
  230. package/dist/schema/test-opaque.d.ts.map +1 -0
  231. package/dist/schema/test-opaque.js +43 -0
  232. package/dist/schema/test-opaque.js.map +1 -0
  233. package/dist/schema/types.d.ts +37 -0
  234. package/dist/schema/types.d.ts.map +1 -0
  235. package/dist/schema/types.js +3 -0
  236. package/dist/schema/types.js.map +1 -0
  237. package/dist/server/actions.d.ts +35 -0
  238. package/dist/server/actions.d.ts.map +1 -0
  239. package/dist/server/actions.js +170 -0
  240. package/dist/server/actions.js.map +1 -0
  241. package/dist/server/agent.d.ts +6 -0
  242. package/dist/server/agent.d.ts.map +1 -0
  243. package/dist/server/agent.js +15 -0
  244. package/dist/server/agent.js.map +1 -0
  245. package/dist/server/auth.d.ts +39 -0
  246. package/dist/server/auth.d.ts.map +1 -0
  247. package/dist/server/auth.js +335 -0
  248. package/dist/server/auth.js.map +1 -0
  249. package/dist/server/client.d.ts +183 -0
  250. package/dist/server/client.d.ts.map +1 -0
  251. package/dist/server/client.js +22 -0
  252. package/dist/server/client.js.map +1 -0
  253. package/dist/server/cookies.d.ts +5 -0
  254. package/dist/server/cookies.d.ts.map +1 -0
  255. package/dist/server/cookies.js +24 -0
  256. package/dist/server/cookies.js.map +1 -0
  257. package/dist/server/doc-index.d.ts +38 -0
  258. package/dist/server/doc-index.d.ts.map +1 -0
  259. package/dist/server/doc-index.js +244 -0
  260. package/dist/server/doc-index.js.map +1 -0
  261. package/dist/server/errors.d.ts +7 -0
  262. package/dist/server/errors.d.ts.map +1 -0
  263. package/dist/server/errors.js +11 -0
  264. package/dist/server/errors.js.map +1 -0
  265. package/dist/server/factory.d.ts +23 -0
  266. package/dist/server/factory.d.ts.map +1 -0
  267. package/dist/server/factory.js +70 -0
  268. package/dist/server/factory.js.map +1 -0
  269. package/dist/server/main.d.ts +6 -0
  270. package/dist/server/main.d.ts.map +1 -0
  271. package/dist/server/main.js +45 -0
  272. package/dist/server/main.js.map +1 -0
  273. package/dist/server/mcp.d.ts +5 -0
  274. package/dist/server/mcp.d.ts.map +1 -0
  275. package/dist/server/mcp.js +280 -0
  276. package/dist/server/mcp.js.map +1 -0
  277. package/dist/server/migrate.d.ts +3 -0
  278. package/dist/server/migrate.d.ts.map +1 -0
  279. package/dist/server/migrate.js +56 -0
  280. package/dist/server/migrate.js.map +1 -0
  281. package/dist/server/mod-catalog.d.ts +14 -0
  282. package/dist/server/mod-catalog.d.ts.map +1 -0
  283. package/dist/server/mod-catalog.js +40 -0
  284. package/dist/server/mod-catalog.js.map +1 -0
  285. package/dist/server/mods-mount.d.ts +4 -0
  286. package/dist/server/mods-mount.d.ts.map +1 -0
  287. package/dist/server/mods-mount.js +169 -0
  288. package/dist/server/mods-mount.js.map +1 -0
  289. package/dist/server/mount-adapters.d.ts +9 -0
  290. package/dist/server/mount-adapters.d.ts.map +1 -0
  291. package/dist/server/mount-adapters.js +75 -0
  292. package/dist/server/mount-adapters.js.map +1 -0
  293. package/dist/server/mount.d.ts +3 -0
  294. package/dist/server/mount.d.ts.map +1 -0
  295. package/dist/server/mount.js +195 -0
  296. package/dist/server/mount.js.map +1 -0
  297. package/dist/server/prefab.d.ts +18 -0
  298. package/dist/server/prefab.d.ts.map +1 -0
  299. package/dist/server/prefab.js +70 -0
  300. package/dist/server/prefab.js.map +1 -0
  301. package/dist/server/seed/index.d.ts +6 -0
  302. package/dist/server/seed/index.d.ts.map +1 -0
  303. package/dist/server/seed/index.js +16 -0
  304. package/dist/server/seed/index.js.map +1 -0
  305. package/dist/server/server.d.ts +28 -0
  306. package/dist/server/server.d.ts.map +1 -0
  307. package/dist/server/server.js +117 -0
  308. package/dist/server/server.js.map +1 -0
  309. package/dist/server/sub.d.ts +34 -0
  310. package/dist/server/sub.d.ts.map +1 -0
  311. package/dist/server/sub.js +174 -0
  312. package/dist/server/sub.js.map +1 -0
  313. package/dist/server/trpc.d.ts +192 -0
  314. package/dist/server/trpc.d.ts.map +1 -0
  315. package/dist/server/trpc.js +319 -0
  316. package/dist/server/trpc.js.map +1 -0
  317. package/dist/server/types-mount.d.ts +3 -0
  318. package/dist/server/types-mount.d.ts.map +1 -0
  319. package/dist/server/types-mount.js +144 -0
  320. package/dist/server/types-mount.js.map +1 -0
  321. package/dist/server/validate.d.ts +3 -0
  322. package/dist/server/validate.d.ts.map +1 -0
  323. package/dist/server/validate.js +20 -0
  324. package/dist/server/validate.js.map +1 -0
  325. package/dist/server/volatile.d.ts +11 -0
  326. package/dist/server/volatile.d.ts.map +1 -0
  327. package/dist/server/volatile.js +26 -0
  328. package/dist/server/volatile.js.map +1 -0
  329. package/dist/server/watch.d.ts +23 -0
  330. package/dist/server/watch.d.ts.map +1 -0
  331. package/dist/server/watch.js +178 -0
  332. package/dist/server/watch.js.map +1 -0
  333. package/dist/tree/cache.d.ts +3 -0
  334. package/dist/tree/cache.d.ts.map +1 -0
  335. package/dist/tree/cache.js +48 -0
  336. package/dist/tree/cache.js.map +1 -0
  337. package/dist/tree/fs.d.ts +3 -0
  338. package/dist/tree/fs.d.ts.map +1 -0
  339. package/dist/tree/fs.js +274 -0
  340. package/dist/tree/fs.js.map +1 -0
  341. package/dist/tree/index.d.ts +38 -0
  342. package/dist/tree/index.d.ts.map +1 -0
  343. package/dist/tree/index.js +182 -0
  344. package/dist/tree/index.js.map +1 -0
  345. package/dist/tree/inflight.d.ts +2 -0
  346. package/dist/tree/inflight.d.ts.map +1 -0
  347. package/dist/tree/inflight.js +15 -0
  348. package/dist/tree/inflight.js.map +1 -0
  349. package/dist/tree/json-codec.d.ts +2 -0
  350. package/dist/tree/json-codec.d.ts.map +1 -0
  351. package/dist/tree/json-codec.js +13 -0
  352. package/dist/tree/json-codec.js.map +1 -0
  353. package/dist/tree/mimefs.d.ts +13 -0
  354. package/dist/tree/mimefs.d.ts.map +1 -0
  355. package/dist/tree/mimefs.js +124 -0
  356. package/dist/tree/mimefs.js.map +1 -0
  357. package/dist/tree/mongo.d.ts +5 -0
  358. package/dist/tree/mongo.d.ts.map +1 -0
  359. package/dist/tree/mongo.js +110 -0
  360. package/dist/tree/mongo.js.map +1 -0
  361. package/dist/tree/patch.d.ts +30 -0
  362. package/dist/tree/patch.d.ts.map +1 -0
  363. package/dist/tree/patch.js +112 -0
  364. package/dist/tree/patch.js.map +1 -0
  365. package/dist/tree/query.d.ts +12 -0
  366. package/dist/tree/query.d.ts.map +1 -0
  367. package/dist/tree/query.js +61 -0
  368. package/dist/tree/query.js.map +1 -0
  369. package/dist/tree/repath.d.ts +3 -0
  370. package/dist/tree/repath.d.ts.map +1 -0
  371. package/dist/tree/repath.js +38 -0
  372. package/dist/tree/repath.js.map +1 -0
  373. package/dist/tree-chain.d.ts +18 -0
  374. package/dist/tree-chain.d.ts.map +1 -0
  375. package/dist/tree-chain.js +109 -0
  376. package/dist/tree-chain.js.map +1 -0
  377. package/dist/tree.d.ts +2 -0
  378. package/dist/tree.d.ts.map +1 -0
  379. package/dist/tree.js +2 -0
  380. package/dist/tree.js.map +1 -0
  381. package/dist/uri.d.ts +11 -0
  382. package/dist/uri.d.ts.map +1 -0
  383. package/dist/uri.js +79 -0
  384. package/dist/uri.js.map +1 -0
  385. package/package.json +39 -40
  386. package/src/chain.test.ts +190 -0
  387. package/src/chain.ts +82 -0
  388. package/src/client/client.test.ts +192 -0
  389. package/src/client/handle.ts +53 -0
  390. package/src/client/index.ts +18 -0
  391. package/src/client/trpc.ts +91 -0
  392. package/src/client.ts +1 -0
  393. package/src/comp/CLAUDE.md +14 -0
  394. package/src/comp/handle.ts +36 -0
  395. package/src/comp/index.test.ts +129 -0
  396. package/src/comp/index.ts +175 -0
  397. package/src/comp/needs.test.ts +499 -0
  398. package/src/comp/needs.ts +113 -0
  399. package/src/comp/validate.test.ts +304 -0
  400. package/src/comp/validate.ts +125 -0
  401. package/src/comp.ts +1 -0
  402. package/src/contexts/schema/index.ts +7 -0
  403. package/src/contexts/schema.ts +1 -0
  404. package/src/contexts/service/index.test.ts +323 -0
  405. package/src/contexts/service/index.ts +43 -0
  406. package/src/contexts/service.ts +1 -0
  407. package/src/contexts/telegram/index.ts +115 -0
  408. package/src/contexts/text/index.test.ts +31 -0
  409. package/src/contexts/text/index.ts +18 -0
  410. package/src/contexts/text.ts +1 -0
  411. package/src/core/component.ts +151 -0
  412. package/src/core/context.ts +14 -0
  413. package/src/core/index.test.ts +203 -0
  414. package/src/core/index.ts +9 -0
  415. package/src/core/path.ts +35 -0
  416. package/src/core/registry.ts +115 -0
  417. package/src/core.ts +1 -0
  418. package/src/log.test.ts +70 -0
  419. package/src/log.ts +28 -0
  420. package/src/mod/discover.test.ts +133 -0
  421. package/src/mod/discover.ts +100 -0
  422. package/src/mod/docs/00-index.md +19 -0
  423. package/src/mod/docs/01-primitives.md +38 -0
  424. package/src/mod/docs/02-core-api.md +68 -0
  425. package/src/mod/docs/03-registry.md +30 -0
  426. package/src/mod/docs/04-store.md +62 -0
  427. package/src/mod/docs/05-comp.md +111 -0
  428. package/src/mod/docs/06-actions.md +193 -0
  429. package/src/mod/docs/07-realtime.md +100 -0
  430. package/src/mod/docs/08-services.md +33 -0
  431. package/src/mod/docs/09-mounts.md +43 -0
  432. package/src/mod/docs/10-acl.md +60 -0
  433. package/src/mod/docs/11-server.md +62 -0
  434. package/src/mod/docs/12-conventions.md +65 -0
  435. package/src/mod/docs/13-example.md +132 -0
  436. package/src/mod/docs/14-mod-format.md +304 -0
  437. package/src/mod/docs/15-documenting-types.md +156 -0
  438. package/src/mod/examples/ticker/seed.ts +19 -0
  439. package/src/mod/examples/ticker/service.ts +20 -0
  440. package/src/mod/examples/ticker/ticker.test.ts +18 -0
  441. package/src/mod/examples/ticker/types.ts +22 -0
  442. package/src/mod/examples/ticker/view.tsx +19 -0
  443. package/src/mod/index.ts +12 -0
  444. package/src/mod/loader.test.ts +168 -0
  445. package/src/mod/loader.ts +174 -0
  446. package/src/mod/optimistic.test.ts +446 -0
  447. package/src/mod/optimistic.ts +210 -0
  448. package/src/mod/prefab.ts +62 -0
  449. package/src/mod/tracking.test.ts +59 -0
  450. package/src/mod/tracking.ts +51 -0
  451. package/src/mod/types.ts +40 -0
  452. package/src/mod.ts +1 -0
  453. package/src/mods/autostart/CLAUDE.md +6 -0
  454. package/src/mods/autostart/autostart.test.ts +85 -0
  455. package/src/mods/autostart/server.ts +1 -0
  456. package/src/mods/autostart/service.ts +98 -0
  457. package/src/mods/llm/CLAUDE.md +6 -0
  458. package/src/mods/llm/index.ts +57 -0
  459. package/src/mods/llm/llm.test.ts +109 -0
  460. package/src/mods/llm/server.ts +1 -0
  461. package/src/mods/mcp/CLAUDE.md +6 -0
  462. package/src/mods/mcp/server.ts +2 -0
  463. package/src/mods/mcp/service.ts +19 -0
  464. package/src/mods/mcp/types.ts +7 -0
  465. package/src/mods/treenity/agent-port.ts +93 -0
  466. package/src/mods/treenity/groups.ts +19 -0
  467. package/src/mods/treenity/mod-type.ts +10 -0
  468. package/src/mods/treenity/seed.ts +56 -0
  469. package/src/mods/treenity/server.ts +4 -0
  470. package/src/mods/treenity/system.ts +70 -0
  471. package/src/mods/uix/CLAUDE.md +7 -0
  472. package/src/mods/uix/client.ts +117 -0
  473. package/src/mods/uix/compile.test.ts +228 -0
  474. package/src/mods/uix/compile.ts +110 -0
  475. package/src/mods/uix/jsx-parser.test.ts +554 -0
  476. package/src/mods/uix/jsx-parser.ts +489 -0
  477. package/src/mods/uix/lazy-load.test.ts +261 -0
  478. package/src/mods/uix/uix-repomix.md +3509 -0
  479. package/src/mods/uix/verify.ts +68 -0
  480. package/src/schema/CLAUDE.md +13 -0
  481. package/src/schema/catalog.ts +101 -0
  482. package/src/schema/extract-schemas.test.ts +84 -0
  483. package/src/schema/extract-schemas.ts +462 -0
  484. package/src/schema/generated/autostart.json +44 -0
  485. package/src/schema/generated/board.column.json +25 -0
  486. package/src/schema/generated/board.task.json +147 -0
  487. package/src/schema/generated/brahman.action.back.json +12 -0
  488. package/src/schema/generated/brahman.action.broadcast.json +31 -0
  489. package/src/schema/generated/brahman.action.call.json +57 -0
  490. package/src/schema/generated/brahman.action.emittext.json +23 -0
  491. package/src/schema/generated/brahman.action.eval.json +23 -0
  492. package/src/schema/generated/brahman.action.file.json +28 -0
  493. package/src/schema/generated/brahman.action.forward.json +29 -0
  494. package/src/schema/generated/brahman.action.getvalue.json +28 -0
  495. package/src/schema/generated/brahman.action.ifelse.json +42 -0
  496. package/src/schema/generated/brahman.action.keywordselect.json +46 -0
  497. package/src/schema/generated/brahman.action.message.json +127 -0
  498. package/src/schema/generated/brahman.action.onerror.json +29 -0
  499. package/src/schema/generated/brahman.action.page.json +22 -0
  500. package/src/schema/generated/brahman.action.params.json +36 -0
  501. package/src/schema/generated/brahman.action.question.json +43 -0
  502. package/src/schema/generated/brahman.action.remove.json +12 -0
  503. package/src/schema/generated/brahman.action.resethistory.json +12 -0
  504. package/src/schema/generated/brahman.action.resetsession.json +12 -0
  505. package/src/schema/generated/brahman.action.selectlang.json +20 -0
  506. package/src/schema/generated/brahman.action.setvalue.json +27 -0
  507. package/src/schema/generated/brahman.action.tag.json +27 -0
  508. package/src/schema/generated/brahman.bot.json +68 -0
  509. package/src/schema/generated/brahman.page.json +25 -0
  510. package/src/schema/generated/brahman.session.json +29 -0
  511. package/src/schema/generated/brahman.user.json +58 -0
  512. package/src/schema/generated/cafe.contact.json +56 -0
  513. package/src/schema/generated/cafe.mail.json +29 -0
  514. package/src/schema/generated/default.json +15 -0
  515. package/src/schema/generated/doc.page.json +23 -0
  516. package/src/schema/generated/examples.demo.generator.json +16 -0
  517. package/src/schema/generated/examples.demo.sensor.json +35 -0
  518. package/src/schema/generated/groups.json +20 -0
  519. package/src/schema/generated/launcher.json +91 -0
  520. package/src/schema/generated/mcp.server.json +15 -0
  521. package/src/schema/generated/mindmap.map.json +22 -0
  522. package/src/schema/generated/sim.agent.json +24 -0
  523. package/src/schema/generated/sim.ai.json +24 -0
  524. package/src/schema/generated/sim.config.json +38 -0
  525. package/src/schema/generated/sim.descriptive.json +26 -0
  526. package/src/schema/generated/sim.events.json +47 -0
  527. package/src/schema/generated/sim.item.json +20 -0
  528. package/src/schema/generated/sim.memory.json +17 -0
  529. package/src/schema/generated/sim.nearby.json +17 -0
  530. package/src/schema/generated/sim.position.json +25 -0
  531. package/src/schema/generated/sim.round.json +64 -0
  532. package/src/schema/generated/sim.world.json +32 -0
  533. package/src/schema/generated/t.agent.port.json +74 -0
  534. package/src/schema/generated/t.llm.json +20 -0
  535. package/src/schema/generated/t.mod.json +27 -0
  536. package/src/schema/generated/t3d.animator.json +46 -0
  537. package/src/schema/generated/t3d.audio.json +58 -0
  538. package/src/schema/generated/t3d.camera.json +50 -0
  539. package/src/schema/generated/t3d.collider.json +84 -0
  540. package/src/schema/generated/t3d.light.json +90 -0
  541. package/src/schema/generated/t3d.line.json +47 -0
  542. package/src/schema/generated/t3d.lod.json +28 -0
  543. package/src/schema/generated/t3d.material.json +131 -0
  544. package/src/schema/generated/t3d.mesh.json +65 -0
  545. package/src/schema/generated/t3d.object.json +64 -0
  546. package/src/schema/generated/t3d.particles.json +109 -0
  547. package/src/schema/generated/t3d.rigidbody.json +81 -0
  548. package/src/schema/generated/t3d.scene.json +7 -0
  549. package/src/schema/generated/t3d.script.json +23 -0
  550. package/src/schema/generated/t3d.text.json +86 -0
  551. package/src/schema/generated/t3d.trail.json +45 -0
  552. package/src/schema/generated/task.json +96 -0
  553. package/src/schema/generated/test.fixture.json +43 -0
  554. package/src/schema/generated/ticker.config.json +43 -0
  555. package/src/schema/generated/ticker.price.json +20 -0
  556. package/src/schema/generated/todo.item.json +25 -0
  557. package/src/schema/generated/todo.list.json +33 -0
  558. package/src/schema/generated/treenity.system.json +259 -0
  559. package/src/schema/generated/whisper.audio.json +25 -0
  560. package/src/schema/generated/whisper.checklist.json +17 -0
  561. package/src/schema/generated/whisper.config.json +30 -0
  562. package/src/schema/generated/whisper.inbox.json +24 -0
  563. package/src/schema/generated/whisper.meta.json +35 -0
  564. package/src/schema/generated/whisper.text.json +16 -0
  565. package/src/schema/load.ts +24 -0
  566. package/src/schema/schema.test.ts +86 -0
  567. package/src/schema/test-fixture.types.ts +21 -0
  568. package/src/schema/test-opaque.ts +42 -0
  569. package/src/schema/types.ts +33 -0
  570. package/src/server/CLAUDE.md +26 -0
  571. package/src/server/actions.test.ts +272 -0
  572. package/src/server/actions.ts +274 -0
  573. package/src/server/agent-sub.test.ts +90 -0
  574. package/src/server/agent.test.ts +305 -0
  575. package/src/server/agent.ts +17 -0
  576. package/src/server/api.test.ts +454 -0
  577. package/src/server/auth.test.ts +441 -0
  578. package/src/server/auth.ts +386 -0
  579. package/src/server/client.ts +24 -0
  580. package/src/server/conditions.test.ts +128 -0
  581. package/src/server/cookies.ts +25 -0
  582. package/src/server/coverage.test.ts +827 -0
  583. package/src/server/doc-index.ts +286 -0
  584. package/src/server/e2e.test.ts +966 -0
  585. package/src/server/errors.ts +11 -0
  586. package/src/server/factory.ts +99 -0
  587. package/src/server/main.ts +56 -0
  588. package/src/server/mcp.ts +326 -0
  589. package/src/server/migrate.test.ts +123 -0
  590. package/src/server/migrate.ts +62 -0
  591. package/src/server/mod-catalog.ts +59 -0
  592. package/src/server/mods-mount.ts +179 -0
  593. package/src/server/mount-adapters.ts +82 -0
  594. package/src/server/mount.parametrized.test.ts +52 -0
  595. package/src/server/mount.query.test.ts +127 -0
  596. package/src/server/mount.test.ts +497 -0
  597. package/src/server/mount.ts +208 -0
  598. package/src/server/prefab.test.ts +415 -0
  599. package/src/server/prefab.ts +104 -0
  600. package/src/server/seed/index.ts +24 -0
  601. package/src/server/server.ts +153 -0
  602. package/src/server/stress.test.ts +844 -0
  603. package/src/server/sub.test.ts +55 -0
  604. package/src/server/sub.ts +224 -0
  605. package/src/server/trpc.ts +369 -0
  606. package/src/server/types-mount.ts +142 -0
  607. package/src/server/validate.test.ts +91 -0
  608. package/src/server/validate.ts +22 -0
  609. package/src/server/volatile.test.ts +140 -0
  610. package/src/server/volatile.ts +32 -0
  611. package/src/server/watch.test.ts +594 -0
  612. package/src/server/watch.ts +202 -0
  613. package/src/server/workflow.test.ts +82 -0
  614. package/src/tree/CLAUDE.md +13 -0
  615. package/src/tree/cache.test.ts +213 -0
  616. package/src/tree/cache.ts +51 -0
  617. package/src/tree/fs.test.ts +247 -0
  618. package/src/tree/fs.ts +251 -0
  619. package/src/tree/index.test.ts +164 -0
  620. package/src/tree/index.ts +216 -0
  621. package/src/tree/inflight.ts +15 -0
  622. package/src/tree/json-codec.ts +16 -0
  623. package/src/tree/mimefs.test.ts +289 -0
  624. package/src/tree/mimefs.ts +142 -0
  625. package/src/tree/mongo.ts +125 -0
  626. package/src/tree/patch.test.ts +192 -0
  627. package/src/tree/patch.ts +133 -0
  628. package/src/tree/query.test.ts +110 -0
  629. package/src/tree/query.ts +70 -0
  630. package/src/tree/repath.test.ts +86 -0
  631. package/src/tree/repath.ts +53 -0
  632. package/src/tree-chain.test.ts +723 -0
  633. package/src/tree-chain.ts +144 -0
  634. package/src/tree.ts +1 -0
  635. package/src/uri.test.ts +86 -0
  636. package/src/uri.ts +82 -0
  637. package/CHANGELOG.md +0 -305
  638. package/README.md +0 -18
  639. package/dist/context.d.ts +0 -41
  640. package/dist/context.d.ts.map +0 -1
  641. package/dist/context.mjs +0 -81
  642. package/dist/context.mjs.map +0 -1
  643. package/dist/contexts/node-engine.d.ts +0 -12
  644. package/dist/contexts/node-engine.d.ts.map +0 -1
  645. package/dist/contexts/node-engine.mjs +0 -7
  646. package/dist/contexts/node-engine.mjs.map +0 -1
  647. package/dist/contexts/noflo/types.d.ts +0 -20
  648. package/dist/contexts/noflo/types.d.ts.map +0 -1
  649. package/dist/contexts/object.d.ts +0 -11
  650. package/dist/contexts/object.d.ts.map +0 -1
  651. package/dist/contexts/object.mjs +0 -15
  652. package/dist/contexts/object.mjs.map +0 -1
  653. package/dist/contexts/proto.d.ts +0 -11
  654. package/dist/contexts/proto.d.ts.map +0 -1
  655. package/dist/contexts/proto.mjs +0 -7
  656. package/dist/contexts/proto.mjs.map +0 -1
  657. package/dist/contexts/react-context.d.ts +0 -21
  658. package/dist/contexts/react-context.d.ts.map +0 -1
  659. package/dist/contexts/react-context.mjs +0 -24
  660. package/dist/contexts/react-context.mjs.map +0 -1
  661. package/dist/contexts/service.mjs +0 -7
  662. package/dist/contexts/service.mjs.map +0 -1
  663. package/dist/get-type-cache.d.ts +0 -2
  664. package/dist/get-type-cache.d.ts.map +0 -1
  665. package/dist/get-type-cache.mjs +0 -7
  666. package/dist/get-type-cache.mjs.map +0 -1
  667. package/dist/index.d.ts +0 -13
  668. package/dist/index.d.ts.map +0 -1
  669. package/dist/index.mjs +0 -10
  670. package/dist/index.mjs.map +0 -1
  671. package/dist/link/link.d.ts +0 -25
  672. package/dist/link/link.d.ts.map +0 -1
  673. package/dist/link/link.mjs +0 -72
  674. package/dist/link/link.mjs.map +0 -1
  675. package/dist/link/link.test.d.ts +0 -2
  676. package/dist/link/link.test.d.ts.map +0 -1
  677. package/dist/loading.d.ts +0 -9
  678. package/dist/loading.d.ts.map +0 -1
  679. package/dist/meta-type.d.ts +0 -58
  680. package/dist/meta-type.d.ts.map +0 -1
  681. package/dist/meta-type.mjs +0 -104
  682. package/dist/meta-type.mjs.map +0 -1
  683. package/dist/meta.d.ts +0 -20
  684. package/dist/meta.d.ts.map +0 -1
  685. package/dist/meta.mjs +0 -16
  686. package/dist/meta.mjs.map +0 -1
  687. package/dist/node/index.d.ts +0 -2
  688. package/dist/node/index.d.ts.map +0 -1
  689. package/dist/node/types.d.ts +0 -37
  690. package/dist/node/types.d.ts.map +0 -1
  691. package/dist/test/context.test.d.ts +0 -2
  692. package/dist/test/context.test.d.ts.map +0 -1
  693. package/dist/types.d.ts +0 -14
  694. package/dist/types.d.ts.map +0 -1
  695. package/dist/types.mjs +0 -16
  696. package/dist/types.mjs.map +0 -1
@@ -0,0 +1,304 @@
1
+ # Treenity Module Format
2
+
3
+ Модуль — отдельный npm-пакет, подключаемый к любому инстансу Treenity.
4
+
5
+ ## Структура пакета
6
+
7
+ ```
8
+ treenity-mod-weather/
9
+ package.json
10
+ src/
11
+ index.ts — defineMod() — точка входа
12
+ types.ts — registerComp() — компоненты
13
+ service.ts — register(type, 'service', ...) — сервисы
14
+ view.tsx — register(type, 'react', ...) — React-рендеры
15
+ schemas.ts — register(type, 'schema', ...) — JSON Schema
16
+ ```
17
+
18
+ ## package.json
19
+
20
+ ```json
21
+ {
22
+ "name": "treenity-mod-weather",
23
+ "version": "1.0.0",
24
+ "peerDependencies": {
25
+ "@treenity/core": "^0.1.0"
26
+ },
27
+ "treenity": {
28
+ "name": "weather",
29
+ "version": "1.0.0",
30
+ "types": ["weather.sensor", "weather.config", "weather.reading"],
31
+ "dependencies": ["core-sensors"],
32
+ "server": "./dist/server.js",
33
+ "client": "./dist/client.js",
34
+ "seed": "./dist/seed.js"
35
+ }
36
+ }
37
+ ```
38
+
39
+ Поле `treenity` — маркер для автоматического обнаружения. Без него пакет игнорируется.
40
+
41
+ | Поле | Назначение |
42
+ |------|-----------|
43
+ | `name` | Имя модуля (если не указано, берётся из `package.name`) |
44
+ | `version` | Версия модуля (fallback: `package.version`) |
45
+ | `types` | Типы, которые модуль регистрирует (для интроспекции) |
46
+ | `dependencies` | Другие модули, которые нужно загрузить первыми |
47
+ | `server` | Entry point для серверных регистраций |
48
+ | `client` | Entry point для клиентских регистраций (views, schemas) |
49
+ | `seed` | Entry point для seed-данных |
50
+
51
+ ## defineMod() — точка входа
52
+
53
+ ```ts
54
+ // src/index.ts
55
+ import { defineMod } from '@treenity/core';
56
+
57
+ export default defineMod({
58
+ name: 'weather',
59
+ version: '1.0.0',
60
+ types: ['weather.sensor', 'weather.config'],
61
+ dependencies: [],
62
+
63
+ // Ленивая загрузка серверных регистраций
64
+ server: () => import('./types').then(() => import('./service')),
65
+
66
+ // Ленивая загрузка клиентских регистраций
67
+ client: () => import('./types').then(() => import('./view')),
68
+
69
+ // Seed: создание начальных нод
70
+ seed: async (store) => {
71
+ const existing = await store.get('/sensors/weather');
72
+ if (existing) return; // идемпотентно
73
+
74
+ await store.set({
75
+ $path: '/sensors/weather',
76
+ $type: 'weather.sensor',
77
+ config: { $type: 'weather.config', location: 'Moscow', interval: 60 },
78
+ } as any);
79
+
80
+ await store.set({
81
+ $path: '/sys/autostart/weather',
82
+ $type: 'ref',
83
+ $ref: '/sensors/weather',
84
+ } as any);
85
+ },
86
+
87
+ onLoad: () => console.log('Weather mod loaded'),
88
+ onUnload: () => console.log('Weather mod unloaded'),
89
+ });
90
+ ```
91
+
92
+ ## Обнаружение
93
+
94
+ ```ts
95
+ import { discoverMods } from '#mod';
96
+
97
+ // Сканирует node_modules, ищет пакеты с полем "treenity" в package.json
98
+ const manifests = await discoverMods('./node_modules');
99
+ // → [{ name: 'weather', version: '1.0.0', types: [...], server: '...', ... }]
100
+ ```
101
+
102
+ Поддерживает: обычные пакеты, scoped пакеты (`@org/treenity-mod-*`), произвольные имена.
103
+
104
+ ## Загрузка
105
+
106
+ ```ts
107
+ import { discoverMods, loadMods } from '#mod';
108
+
109
+ const manifests = await discoverMods('./node_modules');
110
+ const result = await loadMods(manifests, 'server', store);
111
+
112
+ console.log(result.loaded); // ['core-sensors', 'weather'] — в порядке зависимостей
113
+ console.log(result.failed); // [{ name: 'broken-mod', error: Error }]
114
+ ```
115
+
116
+ `loadMods()` автоматически:
117
+ 1. Сортирует по зависимостям (Kahn's algorithm)
118
+ 2. Проверяет что зависимости загружены
119
+ 3. Импортирует server/client entry point
120
+ 4. Вызывает `onLoad()`
121
+ 5. Seed (если target = server и передан store)
122
+ 6. Отслеживает состояние в реестре
123
+
124
+ ### Ошибки загрузки
125
+
126
+ - Неизвестная зависимость → `Error: Mod "X" depends on unknown mod "Y"`
127
+ - Циклическая зависимость → `Error: Circular dependency among mods: A, B, C`
128
+ - Ошибка загрузки → модуль помечается `state: 'failed'`, остальные продолжают грузиться
129
+
130
+ ## Реестр
131
+
132
+ ```ts
133
+ import { getLoadedMods, getMod, isModLoaded } from '#mod';
134
+
135
+ getLoadedMods(); // → LoadedMod[]
136
+ getMod('weather'); // → { manifest, mod, state: 'loaded', loadedAt }
137
+ isModLoaded('weather'); // → true
138
+ ```
139
+
140
+ ## Dev workflow
141
+
142
+ Полный рабочий пример — [examples/ticker/](examples/ticker/) — types, service, view, seed, test.
143
+ Скопируй, адаптируй под свой мод.
144
+
145
+ **Подключение (добавить импорты):**
146
+ ```ts
147
+ // src/mods/index.ts
148
+ import './ticker/types';
149
+ import './ticker/service';
150
+
151
+ // src/mods/views.ts
152
+ import './ticker/view';
153
+ ```
154
+
155
+ **Запуск:**
156
+ ```bash
157
+ npm run dev:server # tsx --watch
158
+ npm run dev:front # vite HMR
159
+ ```
160
+
161
+ **Дебаг сервера через Chrome DevTools:**
162
+ ```bash
163
+ node --inspect -r tsx/esm src/server/index.ts
164
+ # → chrome://inspect
165
+ ```
166
+
167
+ **Тест:**
168
+ ```bash
169
+ npx tsx --test src/mods/ticker/ticker.test.ts
170
+ ```
171
+
172
+ **Готово → npm:**
173
+ ```bash
174
+ mkdir treenity-mod-ticker && cd treenity-mod-ticker
175
+ npm init
176
+ # Скопировать файлы, заменить @/ на @treenity/core, добавить "treenity" в package.json
177
+ npm publish
178
+ ```
179
+
180
+ ---
181
+
182
+ ## Typed Signatures — контракты между модами
183
+
184
+ Модули связываются через типы. Класс компонента — экспортируемый контракт:
185
+
186
+ ```ts
187
+ // treenity-mod-accounting
188
+ export class Account {
189
+ static $type = 'accounting.account'
190
+ balance = 0
191
+
192
+ debit(data: { amount: number }) { this.balance -= data.amount }
193
+ }
194
+ ```
195
+
196
+ ```ts
197
+ // treenity-mod-billing — зависит от accounting
198
+ import { Account } from 'treenity-mod-accounting'
199
+
200
+ export class Invoice {
201
+ static $type = 'billing.invoice'
202
+
203
+ async charge(data: { amount: number, account: Account }) {
204
+ data.account.debit({ amount: data.amount })
205
+ }
206
+ }
207
+ ```
208
+
209
+ `account: Account` в сигнатуре — это одновременно:
210
+ - **Типизированный параметр** при вызове из кода: `invoice.charge({ amount: 10, account })`
211
+ - **Порт** в визуальном редакторе: входной разъём, к которому подключается Account-нода
212
+
213
+ Никакого DI-фреймворка, event bus, plugin API. ES import класса = зависимость.
214
+ TypeScript проверяет, JSON Schema генерируется для AI/UI.
215
+
216
+ ---
217
+
218
+ ## Optimistic Updates
219
+
220
+ Класс компонента — shared kernel между клиентом и сервером. Один код, две среды:
221
+ - **Сервер:** метод выполняется через Immer draft → patches → store.set()
222
+ - **Клиент:** тот же метод выполняется на клоне → мгновенный UI → сервер подтверждает или откатывает
223
+
224
+ ### OptimisticBuffer
225
+
226
+ ```ts
227
+ import { OptimisticBuffer } from '#mod';
228
+
229
+ const buf = new OptimisticBuffer();
230
+ ```
231
+
232
+ ### Цикл: apply → confirm/rollback
233
+
234
+ ```ts
235
+ // 1. Юзер жмёт кнопку — применяем оптимистично
236
+ const { predicted, mutationId } = buf.apply(
237
+ node, // текущая нода
238
+ 'order.status', // тип компонента
239
+ 'advance', // имя метода
240
+ (target, data) => target.advance(),// метод
241
+ undefined, // data (аргументы метода)
242
+ );
243
+ // predicted — нода с предсказанным результатом
244
+ // → обновить кэш: cache.put(predicted)
245
+
246
+ // 2. Отправить экшен на сервер
247
+ trpc.execute.mutate({ path: '/orders/1', type: 'order.status', action: 'advance' });
248
+
249
+ // 3. Сервер отвечает через подписку (SSE patches)
250
+ const { node: final, rolledBack } = buf.confirm('/orders/1', serverNode);
251
+ // rolledBack = false → предсказание совпало
252
+ // rolledBack = true → сервер вернул другое, откатили
253
+
254
+ cache.put(final);
255
+ ```
256
+
257
+ ### Множественные мутации
258
+
259
+ Мутации на одном пути стакаются. При подтверждении первой — остальные ребейзятся:
260
+
261
+ ```ts
262
+ buf.apply(counter0, 'counter', 'increment', incMethod, undefined); // → count: 1
263
+ buf.apply(counter1, 'counter', 'increment', incMethod, undefined); // → count: 2
264
+ buf.apply(counter2, 'counter', 'increment', incMethod, undefined); // → count: 3
265
+
266
+ buf.getPendingCount('/counters/1'); // → 3
267
+ buf.getOptimistic('/counters/1'); // → { count: 3 }
268
+
269
+ // Сервер подтверждает первое (count=1)
270
+ buf.confirm('/counters/1', serverNode); // rebase: оставшиеся 2 переигрываются
271
+ buf.getPendingCount('/counters/1'); // → 2
272
+ ```
273
+
274
+ ### Конфликт — сервер всегда прав
275
+
276
+ ```ts
277
+ buf.apply(order, 'order.status', 'advance', advanceMethod, undefined);
278
+
279
+ const { node, rolledBack } = buf.confirm('/orders/1', cancelledOrder);
280
+ // rolledBack = true, все pending сброшены
281
+ // node = cancelledOrder (серверная версия)
282
+ ```
283
+
284
+ ### API
285
+
286
+ ```ts
287
+ buf.hasPending('/path'); // есть ли ожидающие мутации
288
+ buf.getPendingCount('/path'); // сколько
289
+ buf.getPendingCount(); // всего по всем путям
290
+ buf.rollback('/path'); // откатить всё, вернуть baseline
291
+ buf.rollbackById(mutationId); // откатить конкретную мутацию
292
+ buf.confirmById(mutationId); // подтвердить конкретную
293
+ buf.expire(30_000); // удалить мутации старше 30с
294
+ buf.clear(); // сбросить всё
295
+ ```
296
+
297
+ ### Как работает внутри
298
+
299
+ 1. `apply()` — `structuredClone(node)` → найти компонент → вызвать метод → сохранить baseline + predicted + method + data
300
+ 2. `confirm()` — сравнить predicted с serverNode (без $rev) → совпало? drop. нет? rollback all.
301
+ 3. `rebase()` — переиграть оставшиеся мутации на новой базе, используя сохранённые method + data
302
+ 4. `expire()` — таймаут для зависших мутаций (сервер не ответил)
303
+
304
+ **Почему хранится method + data:** `structuredClone()` стирает прототипы. Без сохранённой ссылки на метод rebase не может переиграть мутации.
@@ -0,0 +1,156 @@
1
+ # 15 — JSDoc-аннотации для типов
2
+
3
+ ## Как работает
4
+
5
+ ```
6
+ Class JSDoc → extract-schemas.ts → src/schema/generated/*.json → registry('schema') → Inspector / MCP / Client
7
+ ```
8
+
9
+ `registerComp(type, Class)` регистрирует класс. `npm run schema` сканирует AST, извлекает JSDoc, генерирует JSON Schema. Схема загружается при старте через `register(type, 'schema', () => schema)`. Три потребителя:
10
+
11
+ 1. **Inspector** — рендерит формы с лейблами, подсказками, виджетами
12
+ 2. **MCP** — `catalog`, `describe_type`, `search_types` для AI-discovery
13
+ 3. **TypeCatalog** — программный доступ к каталогу типов из любого контекста
14
+
15
+ ## Справочник тегов
16
+
17
+ | Тег | Где | Результат | Пример |
18
+ |-----|-----|-----------|--------|
19
+ | _(первая строка)_ | Класс | `schema.title` — название типа | `/** Contact form — receives submissions */` |
20
+ | `@title` | Свойство/метод | `title` — лейбл в форме | `@title Recipient` |
21
+ | `@description` | Свойство/метод | `description` — подсказка | `@description SMTP address` |
22
+ | `@format` | Свойство | UI-виджет (см. таблицу ниже) | `@format image` |
23
+ | `@refType` | Свойство | Ссылка на тип компонента (auto-detect если тип = registered class) | `@refType cafe.mail` |
24
+ | `@pre` | Метод | Поля-предусловия (через пробел) | `@pre source trust` |
25
+ | `@post` | Метод | Поля-результаты (через пробел) | `@post lastSubmission` |
26
+
27
+ Префикс `_` в имени метода скрывает его из схемы.
28
+
29
+ ## Значения @format
30
+
31
+ | Format | Виджет | Для чего |
32
+ |--------|--------|----------|
33
+ | `image` | URL + превью | Ссылки на изображения |
34
+ | `textarea` | Многострочное поле | Длинный текст, JSON, описания |
35
+ | `uri` | URL + кликабельная ссылка | Внешние ссылки |
36
+ | `email` | Текстовое поле | Email-адреса |
37
+ | `path` | Поле пути | Treenity node paths (auto при refType) |
38
+ | `tags` | Чипсы с add/remove | Массивы тегов |
39
+ | `tstring` | Мультиязычный редактор | Переводы `{ ru: "...", en: "..." }` |
40
+ | `timestamp` | Форматированная дата | Unix-метки времени |
41
+
42
+ Без `@format` — рендерится по типу (`string` → input, `number` → number input, `boolean` → checkbox).
43
+
44
+ ## Примеры
45
+
46
+ ### Data-only компонент
47
+
48
+ **Плохо** — Inspector покажет сырой JSON:
49
+ ```typescript
50
+ class BlockHero {
51
+ title = '';
52
+ image = '';
53
+ }
54
+ registerComp('mabu.block.hero', BlockHero);
55
+ ```
56
+
57
+ **Хорошо** — Inspector покажет формы с лейблами и виджетами:
58
+ ```typescript
59
+ /** Hero banner — full-width section with title, subtitle, CTA */
60
+ class BlockHero {
61
+ /** @title Title @description Page title */
62
+ title = '';
63
+ /** @title Background image @format image */
64
+ image = '';
65
+ /** @title Button text @description Learn more */
66
+ cta = '';
67
+ }
68
+ registerComp('mabu.block.hero', BlockHero);
69
+ ```
70
+
71
+ ### Компонент с экшенами
72
+
73
+ **Плохо** — MCP `catalog` покажет экшен без описания:
74
+ ```typescript
75
+ class OrderStatus {
76
+ value = 'incoming';
77
+ advance() { /* ... */ }
78
+ }
79
+ ```
80
+
81
+ **Хорошо** — AI видит и понимает экшен:
82
+ ```typescript
83
+ /** Kitchen order status — advances through incoming → kitchen → ready */
84
+ class OrderStatus {
85
+ /** @title Status */
86
+ value: string = 'incoming';
87
+ /** @description Advance order to next stage in the flow */
88
+ advance() { /* ... */ }
89
+ }
90
+ registerComp('order.status', OrderStatus);
91
+ ```
92
+
93
+ ### Кросс-ссылки (refType)
94
+
95
+ ```typescript
96
+ /** Contact form — receives submissions, logs them */
97
+ class CafeContact {
98
+ /** @title Recipient @format email */
99
+ recipient = '';
100
+ /** @title Mail service */
101
+ mailService?: CafeMailService; // auto-detect → refType: "cafe.mail"
102
+
103
+ /** @description Submit contact form — validates and logs */
104
+ submit(data: { name: string; email: string; message: string }) { /* ... */ }
105
+ }
106
+ registerComp('cafe.contact', CafeContact);
107
+ ```
108
+
109
+ ### Внешние экшены (register-based)
110
+
111
+ ```typescript
112
+ /** @description Start the Telegram bot polling loop */
113
+ register('brahman.bot', 'action:start', startHandler);
114
+ ```
115
+
116
+ ## Чеклист
117
+
118
+ 1. Каждый класс — JSDoc на первой строке: `/** {Noun} — {what it does} */`
119
+ 2. Каждое публичное свойство — `@title` (лейбл формы)
120
+ 3. `@description` для подсказок (необязательно, но рекомендуется)
121
+ 4. `@format` когда нужен специальный виджет
122
+ 5. Каждый публичный метод — `@description` (экшен в MCP/Inspector)
123
+ 6. `_` prefix для скрытых/внутренних методов
124
+ 7. `@refType` auto-detect для свойств с типом registered class
125
+ 8. `@pre`/`@post` для документирования зависимостей между полями
126
+ 9. После изменений: `npm run schema`
127
+ 10. Проверить: `src/schema/generated/{type}.json` — title, properties, methods
128
+
129
+ ## Промпт для LLM
130
+
131
+ Копируй как system instructions для AI, который создаёт или документирует типы:
132
+
133
+ ```
134
+ ## Treenity Type Annotation Rules
135
+
136
+ When creating or documenting a Treenity component class:
137
+
138
+ 1. CLASS: one-line JSDoc `/** {Noun phrase} — {what it does} */`
139
+ 2. PROPERTIES: `/** @title {Label} @description {hint} @format {widget} */`
140
+ - @title = form label (required for every public field)
141
+ - @description = placeholder/explanation (recommended)
142
+ - @format = image | textarea | uri | email | path | tags | tstring | timestamp
143
+ 3. METHODS: `/** @description {verb phrase — what the action does} */`
144
+ - Methods with _ prefix are hidden from schema
145
+ - Typed args: method(data: { field: type }) auto-generates argument schema
146
+ 4. CROSS-REFS: use registered class as property type for auto refType
147
+ mailService?: CafeMailService → generates refType: "cafe.mail"
148
+ 5. EXTERNAL ACTIONS: JSDoc before register() call
149
+ /** @description Start the bot */ register('bot', 'action:start', handler)
150
+ 6. DISCOVERY: use MCP tools to explore existing types:
151
+ - catalog → list all types with titles
152
+ - describe_type(name) → full schema + cross-references
153
+ - search_types(query) → find by keyword
154
+
155
+ After writing: npm run schema → verify src/schema/generated/{type}.json
156
+ ```
@@ -0,0 +1,19 @@
1
+ import type { NodeData } from '#core';
2
+ import type { Tree } from '#tree';
3
+
4
+ export async function seedTicker(store: Tree) {
5
+ if (await store.get('/demo/ticker')) return;
6
+
7
+ await store.set({
8
+ $path: '/demo/ticker',
9
+ $type: 'ticker',
10
+ config: { $type: 'ticker.config', symbol: 'BTC', intervalSec: 5 },
11
+ mount: { $type: 't.mount.memory' },
12
+ } as NodeData);
13
+
14
+ await store.set({
15
+ $path: '/sys/autostart/ticker',
16
+ $type: 'ref',
17
+ $ref: '/demo/ticker',
18
+ } as NodeData);
19
+ }
@@ -0,0 +1,20 @@
1
+ import { getComp } from '#comp';
2
+ import { type NodeData, register } from '#core';
3
+ import { TickerConfig } from './types';
4
+
5
+ register('ticker', 'service', async (node: NodeData, ctx) => {
6
+ const config = getComp(node, TickerConfig);
7
+ const interval = (config?.intervalSec ?? 10) * 1000;
8
+
9
+ const timer = setInterval(async () => {
10
+ const price = 50000 + Math.random() * 1000; // stub — replace with real API
11
+ await ctx.store.set({
12
+ $path: `${node.$path}/${Date.now()}`,
13
+ $type: 'ticker.price',
14
+ price,
15
+ ts: Date.now(),
16
+ } as NodeData);
17
+ }, interval);
18
+
19
+ return { stop: async () => clearInterval(timer) };
20
+ });
@@ -0,0 +1,18 @@
1
+ import assert from 'node:assert/strict';
2
+ import { describe, it } from 'node:test';
3
+ import { TickerConfig } from './types';
4
+
5
+ describe('TickerConfig', () => {
6
+ it('has sensible defaults', () => {
7
+ const c = new TickerConfig();
8
+ assert.equal(c.symbol, 'BTC');
9
+ assert.equal(c.intervalSec, 10);
10
+ });
11
+
12
+ it('configure updates fields', () => {
13
+ const c = new TickerConfig();
14
+ c.configure({ symbol: 'ETH', intervalSec: 30 });
15
+ assert.equal(c.symbol, 'ETH');
16
+ assert.equal(c.intervalSec, 30);
17
+ });
18
+ });
@@ -0,0 +1,22 @@
1
+ // Example mod: Ticker — price feed with real-time updates
2
+ import { registerType } from '#comp';
3
+
4
+ /** Price feed config — trading symbol and polling interval */
5
+ export class TickerConfig {
6
+ symbol = 'BTC';
7
+ intervalSec = 10;
8
+
9
+ /** @description Update symbol and polling interval */
10
+ configure(data: { symbol: string; intervalSec: number }) {
11
+ this.symbol = data.symbol;
12
+ this.intervalSec = data.intervalSec;
13
+ }
14
+ }
15
+ registerType('ticker.config', TickerConfig);
16
+
17
+ /** Latest price snapshot — current price and timestamp */
18
+ export class TickerPrice {
19
+ price = 0;
20
+ ts = 0;
21
+ }
22
+ registerType('ticker.price', TickerPrice);
@@ -0,0 +1,19 @@
1
+ import { register } from '#core';
2
+ import { useCurrentNode } from '@treenity/react/context';
3
+ import { useChildren } from '@treenity/react/hooks';
4
+
5
+ register('ticker', 'react', () => {
6
+ const node = useCurrentNode();
7
+ const prices = useChildren(node.$path, { limit: 20, watchNew: true });
8
+
9
+ return (
10
+ <div className="space-y-1 p-2">
11
+ <h3 className="font-bold">{node.$path}</h3>
12
+ {prices.map(p => (
13
+ <div key={p.$path} className="text-sm font-mono">
14
+ ${(p as any).price?.toFixed(2)} — {new Date((p as any).ts).toLocaleTimeString()}
15
+ </div>
16
+ ))}
17
+ </div>
18
+ );
19
+ });
@@ -0,0 +1,12 @@
1
+ // Treenity Module System — public API
2
+
3
+ export { defineMod } from './types';
4
+ export type { TreenityMod, ModManifest, ModState, LoadedMod } from './types';
5
+ export { discoverMods } from './discover';
6
+ export { sortByDependencies, loadMods, loadLocalMods, getLoadedMods, getMod, isModLoaded, clearModRegistry } from './loader';
7
+ export type { LoadTarget, LoadResult } from './loader';
8
+ export { OptimisticBuffer } from './optimistic';
9
+ export type { PendingMutation } from './optimistic';
10
+ export { registerPrefab, getPrefab, getModPrefabs, getRegisteredMods, getSeedPrefabs, clearPrefabs } from './prefab';
11
+ export type { PrefabSetup, PrefabMeta, PrefabEntry } from './prefab';
12
+ export { getTypesForMod, inferModFromType, clearTracking } from './tracking';