@treenity/core 1.0.48 → 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 -314
  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,62 @@
1
+ // Treenity Prefab Registry — in-memory store for module prefab declarations
2
+ // Modules call registerPrefab() during import; mods-mount exposes data as virtual tree.
3
+ // Prefabs named 'seed' are auto-deployed at startup by deploySeedPrefabs().
4
+
5
+ import { type NodeData } from '#core';
6
+
7
+ export type PrefabSetup = (nodes: NodeData[], params?: unknown) => NodeData[] | Promise<NodeData[]>;
8
+
9
+ export type PrefabMeta = { tier?: 'core' };
10
+
11
+ export type PrefabEntry = {
12
+ nodes: NodeData[];
13
+ setup?: PrefabSetup;
14
+ meta?: PrefabMeta;
15
+ };
16
+
17
+ // Key: "mod/name"
18
+ const prefabs = new Map<string, PrefabEntry>();
19
+
20
+ export function registerPrefab(
21
+ mod: string,
22
+ name: string,
23
+ nodes: NodeData[],
24
+ setup?: PrefabSetup,
25
+ meta?: PrefabMeta,
26
+ ): void {
27
+ const key = `${mod}/${name}`;
28
+ if (prefabs.has(key)) return; // sealed, like registry
29
+ prefabs.set(key, { nodes, setup, meta });
30
+ }
31
+
32
+ export function getPrefab(mod: string, name: string): PrefabEntry | undefined {
33
+ return prefabs.get(`${mod}/${name}`);
34
+ }
35
+
36
+ export function getModPrefabs(mod: string): [string, PrefabEntry][] {
37
+ const result: [string, PrefabEntry][] = [];
38
+ for (const [k, v] of prefabs) {
39
+ if (k.startsWith(mod + '/')) result.push([k.slice(mod.length + 1), v]);
40
+ }
41
+ return result;
42
+ }
43
+
44
+ export function getRegisteredMods(): string[] {
45
+ const mods = new Set<string>();
46
+ for (const k of prefabs.keys()) mods.add(k.split('/')[0]);
47
+ return [...mods];
48
+ }
49
+
50
+ /** All seed prefabs: [mod, PrefabEntry][] */
51
+ export function getSeedPrefabs(): [string, PrefabEntry][] {
52
+ const result: [string, PrefabEntry][] = [];
53
+ for (const [k, v] of prefabs) {
54
+ if (k.endsWith('/seed')) result.push([k.split('/')[0], v]);
55
+ }
56
+ return result;
57
+ }
58
+
59
+ // For tests
60
+ export function clearPrefabs(): void {
61
+ prefabs.clear();
62
+ }
@@ -0,0 +1,59 @@
1
+ import assert from 'node:assert/strict';
2
+ import { afterEach, describe, it } from 'node:test';
3
+ import { clearTracking, getCurrentMod, getTypesForMod, inferModFromType, setCurrentMod, trackType } from './tracking';
4
+
5
+ describe('mod/tracking', () => {
6
+ afterEach(() => clearTracking());
7
+
8
+ it('setCurrentMod + trackType maps type to mod', () => {
9
+ setCurrentMod('cafe');
10
+ trackType('cafe.contact');
11
+ trackType('cafe.mail');
12
+ setCurrentMod(null);
13
+
14
+ assert.deepEqual(getTypesForMod('cafe').sort(), ['cafe.contact', 'cafe.mail']);
15
+ });
16
+
17
+ it('trackType without currentMod does not track', () => {
18
+ trackType('orphan.type');
19
+ assert.deepEqual(getTypesForMod('orphan'), []);
20
+ });
21
+
22
+ it('getTypesForMod returns empty for unknown mod', () => {
23
+ assert.deepEqual(getTypesForMod('nope'), []);
24
+ });
25
+
26
+ it('getCurrentMod reflects setCurrentMod', () => {
27
+ assert.equal(getCurrentMod(), null);
28
+ setCurrentMod('test');
29
+ assert.equal(getCurrentMod(), 'test');
30
+ setCurrentMod(null);
31
+ assert.equal(getCurrentMod(), null);
32
+ });
33
+
34
+ it('inferModFromType uses tracked mapping first', () => {
35
+ setCurrentMod('my-cafe');
36
+ trackType('cafe.contact');
37
+ setCurrentMod(null);
38
+
39
+ assert.equal(inferModFromType('cafe.contact'), 'my-cafe');
40
+ });
41
+
42
+ it('inferModFromType falls back to first segment', () => {
43
+ assert.equal(inferModFromType('sim.agent'), 'sim');
44
+ assert.equal(inferModFromType('mabu.block.hero'), 'mabu');
45
+ });
46
+
47
+ it('inferModFromType uses alias map', () => {
48
+ assert.equal(inferModFromType('order.status'), 'orders');
49
+ });
50
+
51
+ it('clearTracking resets all state', () => {
52
+ setCurrentMod('x');
53
+ trackType('x.foo');
54
+ clearTracking();
55
+
56
+ assert.equal(getCurrentMod(), null);
57
+ assert.deepEqual(getTypesForMod('x'), []);
58
+ });
59
+ });
@@ -0,0 +1,51 @@
1
+ // Type→Mod tracking — runtime map of which mod registered which types
2
+ // setCurrentMod() wraps import() in loader; trackType() called from registerType.
3
+ // Convention fallback: first segment of type name = mod name (cafe.contact → cafe).
4
+
5
+ let currentMod: string | null = null;
6
+
7
+ // type → mod name
8
+ const typeToMod = new Map<string, string>();
9
+
10
+ // Aliases for types whose first segment ≠ mod dir name
11
+ const MOD_ALIASES: Record<string, string> = {
12
+ order: 'orders',
13
+ pult: 'pult',
14
+ };
15
+
16
+ export function setCurrentMod(name: string | null): void {
17
+ currentMod = name;
18
+ }
19
+
20
+ export function getCurrentMod(): string | null {
21
+ return currentMod;
22
+ }
23
+
24
+ export function trackType(typeName: string): void {
25
+ if (currentMod) {
26
+ typeToMod.set(typeName, currentMod);
27
+ }
28
+ }
29
+
30
+ export function getTypesForMod(modName: string): string[] {
31
+ const types: string[] = [];
32
+ for (const [type, mod] of typeToMod) {
33
+ if (mod === modName) types.push(type);
34
+ }
35
+ return types;
36
+ }
37
+
38
+ /** Infer mod name from type name: tracked → exact; else first segment + alias lookup */
39
+ export function inferModFromType(typeName: string): string {
40
+ const tracked = typeToMod.get(typeName);
41
+ if (tracked) return tracked;
42
+
43
+ const first = typeName.split('.')[0];
44
+ return MOD_ALIASES[first] ?? first;
45
+ }
46
+
47
+ // For tests
48
+ export function clearTracking(): void {
49
+ typeToMod.clear();
50
+ currentMod = null;
51
+ }
@@ -0,0 +1,40 @@
1
+ // Treenity Module System — type definitions
2
+
3
+ import type { Tree } from '#tree';
4
+
5
+ export interface TreenityMod {
6
+ name: string;
7
+ dependencies?: string[];
8
+ server?: () => Promise<unknown>;
9
+ client?: () => Promise<unknown>;
10
+ seed?: (store: Tree) => Promise<void>;
11
+ onLoad?: () => void | Promise<void>;
12
+ onUnload?: () => void | Promise<void>;
13
+ }
14
+
15
+ // package.json "treenity" field shape (npm discovery)
16
+ export interface ModManifest {
17
+ name: string;
18
+ version: string;
19
+ types?: string[];
20
+ dependencies?: string[];
21
+ server?: string;
22
+ client?: string;
23
+ seed?: string;
24
+ packagePath?: string;
25
+ }
26
+
27
+ export type ModState = 'discovered' | 'loading' | 'loaded' | 'failed' | 'disabled';
28
+
29
+ export interface LoadedMod {
30
+ manifest?: ModManifest;
31
+ mod?: TreenityMod;
32
+ name: string;
33
+ state: ModState;
34
+ error?: Error;
35
+ loadedAt?: number;
36
+ }
37
+
38
+ export function defineMod(mod: TreenityMod): TreenityMod {
39
+ return mod;
40
+ }
package/src/mod.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './mod/index.ts';
@@ -0,0 +1,6 @@
1
+ # autostart
2
+
3
+ Init.d-паттерн. Обходит `/sys/autostart`, резолвит ref-детей, запускает service-контекст каждого. Отслеживает состояние в `/proc/`. Экспонирует `start`/`stop` actions.
4
+
5
+ ## Types
6
+ - `autostart` — start/stop actions
@@ -0,0 +1,85 @@
1
+ // Autostart dynamic start/stop tests
2
+ // Tests: startService creates ref + starts, stopService removes ref + stops, boot walks children
3
+
4
+ import { startServices } from '#contexts/service/index';
5
+ import type { NodeData } from '#core';
6
+ import { createNode, register } from '#core';
7
+ import { createMemoryTree } from '#tree';
8
+ import assert from 'node:assert/strict';
9
+ import { describe, it } from 'node:test';
10
+
11
+ // Import real autostart module — registers 'autostart' type + service handler
12
+ import { startService, stopService } from './service';
13
+
14
+ // Register test service types once (sealed registry)
15
+ const svcLog: string[] = [];
16
+ register('test.autosvc', 'service', async (node) => {
17
+ svcLog.push(`start:${node.$path}`);
18
+ return { stop: async () => { svcLog.push(`stop:${node.$path}`); } };
19
+ });
20
+
21
+ describe('autostart dynamic start/stop', () => {
22
+ async function boot() {
23
+ svcLog.length = 0;
24
+ const store = createMemoryTree();
25
+ await store.set(createNode('/sys/autostart', 'autostart'));
26
+ const handle = await startServices(store, () => () => {});
27
+ assert.ok(handle);
28
+ return { store, handle: handle! };
29
+ }
30
+
31
+ it('startService creates ref child and starts service', async () => {
32
+ const { store, handle } = await boot();
33
+
34
+ await store.set({ $path: '/srv/a', $type: 'test.autosvc' } as NodeData);
35
+ await startService('/srv/a');
36
+
37
+ assert.deepEqual(svcLog, ['start:/srv/a']);
38
+
39
+ const { items } = await store.getChildren('/sys/autostart');
40
+ const ref = items.find(n => (n as any).$ref === '/srv/a');
41
+ assert.ok(ref, 'ref child created');
42
+ assert.equal(ref!.$type, 'ref');
43
+
44
+ await handle.stop();
45
+ });
46
+
47
+ it('stopService stops service and removes ref', async () => {
48
+ const { store, handle } = await boot();
49
+
50
+ await store.set({ $path: '/srv/b', $type: 'test.autosvc' } as NodeData);
51
+ await startService('/srv/b');
52
+ await stopService('/srv/b');
53
+
54
+ assert.deepEqual(svcLog, ['start:/srv/b', 'stop:/srv/b']);
55
+
56
+ const { items } = await store.getChildren('/sys/autostart');
57
+ const ref = items.find(n => (n as any).$ref === '/srv/b');
58
+ assert.equal(ref, undefined, 'ref removed after stop');
59
+
60
+ await handle.stop();
61
+ });
62
+
63
+ it('startService is idempotent', async () => {
64
+ const { store, handle } = await boot();
65
+
66
+ await store.set({ $path: '/srv/c', $type: 'test.autosvc' } as NodeData);
67
+ await startService('/srv/c');
68
+ await startService('/srv/c');
69
+
70
+ assert.deepEqual(svcLog, ['start:/srv/c'], 'started only once');
71
+ await handle.stop();
72
+ });
73
+
74
+ it('boot walks existing ref children', async () => {
75
+ svcLog.length = 0;
76
+ const store = createMemoryTree();
77
+ await store.set(createNode('/sys/autostart', 'autostart'));
78
+ await store.set({ $path: '/srv/d', $type: 'test.autosvc' } as NodeData);
79
+ await store.set({ $path: '/sys/autostart/d', $type: 'ref', $ref: '/srv/d' } as NodeData);
80
+
81
+ const handle = await startServices(store, () => () => {});
82
+ assert.deepEqual(svcLog, ['start:/srv/d']);
83
+ await handle!.stop();
84
+ });
85
+ });
@@ -0,0 +1 @@
1
+ import './service';
@@ -0,0 +1,98 @@
1
+ // Autostart — service coordinator with dynamic start/stop
2
+ // Walks children at boot, tracks handles, exposes start/stop actions
3
+ // Tree = truth: ref child exists ↔ service is running
4
+
5
+ import { registerType } from '#comp';
6
+ import { type ServiceCtx, type ServiceHandle } from '#contexts/service/index';
7
+ import { isRef, type NodeData, register, resolve as coreResolve } from '#core';
8
+ import { resolveRef } from '#tree';
9
+
10
+ // ── Module-scope service tracking ──
11
+
12
+ const handles = new Map<string, ServiceHandle>();
13
+ let _svcCtx: ServiceCtx | null = null;
14
+ let _autostartPath = '/sys/autostart';
15
+
16
+ async function _startService(path: string): Promise<void> {
17
+ if (handles.has(path)) return;
18
+ if (!_svcCtx) throw new Error('autostart: not initialized');
19
+
20
+ const node = await _svcCtx.store.get(path);
21
+ if (!node) throw new Error(`autostart: node not found: ${path}`);
22
+
23
+ const handler = coreResolve(node.$type, 'service');
24
+ if (!handler) throw new Error(`autostart: no service handler for ${node.$type}`);
25
+
26
+ handles.set(path, await handler(node, _svcCtx));
27
+ console.log(`[autostart] started ${path}`);
28
+ }
29
+
30
+ async function _stopService(path: string): Promise<void> {
31
+ const h = handles.get(path);
32
+ if (!h) return;
33
+ await h.stop();
34
+ handles.delete(path);
35
+ console.log(`[autostart] stopped ${path}`);
36
+ }
37
+
38
+ // ── Public API — direct import for server code, typed actions for MCP/tRPC ──
39
+
40
+ export async function startService(path: string): Promise<void> {
41
+ if (!_svcCtx) throw new Error('autostart: not initialized');
42
+ if (handles.has(path)) return;
43
+
44
+ // Add ref child → tree reflects reality
45
+ const name = path.split('/').filter(Boolean).join('-');
46
+ const refPath = `${_autostartPath}/${name}`;
47
+ const existing = await _svcCtx.store.get(refPath);
48
+ if (!existing) {
49
+ await _svcCtx.store.set({ $path: refPath, $type: 'ref', $ref: path } as NodeData);
50
+ }
51
+
52
+ await _startService(path);
53
+ }
54
+
55
+ export async function stopService(path: string): Promise<void> {
56
+ if (!_svcCtx) throw new Error('autostart: not initialized');
57
+
58
+ await _stopService(path);
59
+
60
+ // Remove ref child → tree reflects reality
61
+ const { items } = await _svcCtx.store.getChildren(_autostartPath);
62
+ const ref = items.find(n => isRef(n) && n.$ref === path);
63
+ if (ref) await _svcCtx.store.remove(ref.$path);
64
+ }
65
+
66
+ /** Service lifecycle manager — start/stop services via ref children */
67
+ export class Autostart {
68
+ /** @description Start a service at given path */
69
+ async start(data: { /** service to start */ path: string }) { await startService(data.path); }
70
+ /** @description Stop a service at given path */
71
+ async stop(data: { path: string }) { await stopService(data.path); }
72
+ }
73
+ registerType('autostart', Autostart);
74
+
75
+ // ── Boot service handler ──
76
+
77
+ register('autostart', 'service', async (node, ctx) => {
78
+ _svcCtx = ctx;
79
+ _autostartPath = node.$path;
80
+
81
+ const { items } = await ctx.store.getChildren(node.$path);
82
+ for (const child of items) {
83
+ try {
84
+ const target = await resolveRef(ctx.store, child);
85
+ await _startService(target.$path);
86
+ } catch (e) {
87
+ console.error(`[autostart] failed ${child.$path}:`, e);
88
+ }
89
+ }
90
+
91
+ return {
92
+ stop: async () => {
93
+ for (const path of [...handles.keys()]) {
94
+ await _stopService(path).catch(console.error);
95
+ }
96
+ },
97
+ };
98
+ });
@@ -0,0 +1,6 @@
1
+ # llm
2
+
3
+ Мост для LLM-контекста. Выгружает все зарегистрированные типы со схемами (`schema` action) и рендерит поддерево как текст (`describe` action) — для промптов и AI-потребления.
4
+
5
+ ## Types
6
+ - `t.llm` — actions: `schema`, `describe`
@@ -0,0 +1,57 @@
1
+ // Treenity LLM Context — Layer 6
2
+ // Schema export + tree description for LLM consumption
3
+ // Type: t.llm — node at /llm, actions: schema, describe
4
+
5
+ import { getContextsForType, getRegisteredTypes, register, resolve } from '#core';
6
+ import { basename } from '#core/path';
7
+ import { type ActionCtx } from '#server/actions';
8
+
9
+ export type TypeInfo = {
10
+ type: string;
11
+ schema: Record<string, unknown> | null;
12
+ contexts: string[];
13
+ actions: string[];
14
+ };
15
+
16
+ export type SchemaExport = { types: TypeInfo[] };
17
+
18
+ export function exportSchemaForLLM(): SchemaExport {
19
+ const types = getRegisteredTypes();
20
+ return {
21
+ types: types.map((type) => {
22
+ const contexts = getContextsForType(type);
23
+ const schemaHandler = resolve(type, 'schema');
24
+ return {
25
+ type,
26
+ schema: schemaHandler ? (schemaHandler() as Record<string, unknown>) : null,
27
+ contexts: contexts.filter((c) => !c.startsWith('action:')),
28
+ actions: contexts.filter((c) => c.startsWith('action:')).map((c) => c.slice(7)),
29
+ };
30
+ }),
31
+ };
32
+ }
33
+
34
+ export async function describeTree(ctx: ActionCtx, data: unknown): Promise<string> {
35
+ const { depth = 3 } = (data as { depth?: number }) ?? {};
36
+ const path = ctx.node.$path;
37
+ const lines: string[] = [];
38
+
39
+ async function walk(p: string, indent: number, remaining: number): Promise<void> {
40
+ if (remaining <= 0) return;
41
+ const { items } = await ctx.store.getChildren(p);
42
+ items.sort((a, b) => a.$path.localeCompare(b.$path));
43
+ for (const child of items) {
44
+ lines.push(`${' '.repeat(indent)}${basename(child.$path)} (${child.$type})`);
45
+ await walk(child.$path, indent + 1, remaining - 1);
46
+ }
47
+ }
48
+
49
+ lines.push(`${path} (${ctx.node.$type})`);
50
+ await walk(path, 1, depth);
51
+ return lines.join('\n');
52
+ }
53
+
54
+ /** @description Export all registered types with schemas, contexts, and actions for LLM consumption */
55
+ register('t.llm', 'action:schema', () => exportSchemaForLLM());
56
+ /** @description Describe the subtree under this node as indented text (depth-limited) */
57
+ register('t.llm', 'action:describe', describeTree);
@@ -0,0 +1,109 @@
1
+ import { createNode, type NodeData, register } from '#core';
2
+ import { clearRegistry } from '#core/index.test';
3
+ import { type ActionCtx, serverNodeHandle } from '#server/actions';
4
+ import { createMemoryTree } from '#tree';
5
+ import assert from 'node:assert/strict';
6
+ import { beforeEach, describe, it } from 'node:test';
7
+ import { describeTree, exportSchemaForLLM } from '.';
8
+
9
+ function makeCtx(store: ReturnType<typeof createMemoryTree>, node: NodeData): ActionCtx {
10
+ const nc = serverNodeHandle(store);
11
+ return { node, store, signal: AbortSignal.timeout(5000), nc };
12
+ }
13
+
14
+ describe('exportSchemaForLLM', () => {
15
+ beforeEach(() => clearRegistry());
16
+
17
+ it('returns types with schemas', () => {
18
+ register('task', 'schema', () => ({
19
+ title: 'Task',
20
+ type: 'object',
21
+ properties: { status: { type: 'string', title: 'Status' } },
22
+ }));
23
+ register('task', 'react', () => 'component');
24
+ const result = exportSchemaForLLM();
25
+ assert.equal(result.types.length, 1);
26
+ const t = result.types[0];
27
+ assert.equal(t.type, 't.task');
28
+ assert.deepEqual((t.schema as any).title, 'Task');
29
+ assert.ok(t.contexts.includes('schema'));
30
+ assert.ok(t.contexts.includes('react'));
31
+ });
32
+
33
+ it('extracts actions from contexts', () => {
34
+ register('task', 'schema', () => ({ title: 'Task', type: 'object', properties: {} }));
35
+ register('task', 'action:complete', () => 'done');
36
+ register('task', 'action:assign', () => 'assigned');
37
+ const result = exportSchemaForLLM();
38
+ const t = result.types[0];
39
+ assert.deepEqual(t.actions.sort(), ['assign', 'complete']);
40
+ assert.ok(!t.contexts.includes('action:complete'));
41
+ });
42
+
43
+ it('returns null schema when no schema handler', () => {
44
+ register('widget', 'react', () => 'component');
45
+ const result = exportSchemaForLLM();
46
+ const t = result.types.find((x) => x.type === 't.widget')!;
47
+ assert.equal(t.schema, null);
48
+ });
49
+
50
+ it('returns empty types when registry is empty', () => {
51
+ const result = exportSchemaForLLM();
52
+ assert.deepEqual(result.types, []);
53
+ });
54
+ });
55
+
56
+ describe('describeTree', () => {
57
+ beforeEach(() => clearRegistry());
58
+
59
+ it('renders tree structure', async () => {
60
+ const store = createMemoryTree();
61
+ const root = createNode('/', 'root');
62
+ await store.set(root);
63
+ await store.set(createNode('/pages', 'dir'));
64
+ await store.set(createNode('/pages/main', 'page'));
65
+ await store.set(createNode('/users', 'dir'));
66
+
67
+ const text = await describeTree(makeCtx(store, root), { depth: 3 });
68
+ assert.ok(text.includes('/ (t.root)'));
69
+ assert.ok(text.includes(' pages (t.dir)'));
70
+ assert.ok(text.includes(' main (t.page)'));
71
+ assert.ok(text.includes(' users (t.dir)'));
72
+ });
73
+
74
+ it('respects depth limit', async () => {
75
+ const store = createMemoryTree();
76
+ const root = createNode('/', 'root');
77
+ await store.set(root);
78
+ await store.set(createNode('/a', 'dir'));
79
+ await store.set(createNode('/a/b', 'dir'));
80
+ await store.set(createNode('/a/b/c', 'item'));
81
+
82
+ const text = await describeTree(makeCtx(store, root), { depth: 1 });
83
+ assert.ok(text.includes('a (t.dir)'));
84
+ assert.ok(!text.includes('b (t.dir)'));
85
+ });
86
+
87
+ it('describes subtree from given node', async () => {
88
+ const store = createMemoryTree();
89
+ const pages = createNode('/pages', 'dir');
90
+ await store.set(pages);
91
+ await store.set(createNode('/pages/main', 'page'));
92
+
93
+ const text = await describeTree(makeCtx(store, pages), {});
94
+ assert.ok(text.startsWith('/pages (t.dir)'));
95
+ assert.ok(text.includes('main (t.page)'));
96
+ });
97
+
98
+ it('sorts children alphabetically', async () => {
99
+ const store = createMemoryTree();
100
+ const root = createNode('/', 'root');
101
+ await store.set(root);
102
+ await store.set(createNode('/zebra', 'animal'));
103
+ await store.set(createNode('/apple', 'fruit'));
104
+
105
+ const text = await describeTree(makeCtx(store, root), { depth: 1 });
106
+ const lines = text.split('\n');
107
+ assert.ok(lines.indexOf(' apple (t.fruit)') < lines.indexOf(' zebra (t.animal)'));
108
+ });
109
+ });
@@ -0,0 +1 @@
1
+ import './index';
@@ -0,0 +1,6 @@
1
+ # mcp
2
+
3
+ Lifecycle-обёртка MCP HTTP-сервера. Запускает `createMcpHttpServer` как tree-сервис на настроенном порту.
4
+
5
+ ## Types
6
+ - `mcp.server` — port config, service lifecycle
@@ -0,0 +1,2 @@
1
+ import './types';
2
+ import './service';
@@ -0,0 +1,19 @@
1
+ // MCP autostart service — starts/stops the MCP HTTP server via tree lifecycle
2
+
3
+ import { getComp } from '#comp';
4
+ import { register } from '#core';
5
+ import { createMcpHttpServer } from '#server/mcp';
6
+ import { McpConfig } from './types';
7
+
8
+ register('mcp.server', 'service', async (node, ctx) => {
9
+ const config = getComp(node, McpConfig);
10
+ const port = config?.port ?? (Number(process.env.MCP_PORT) || 3212);
11
+ const server = createMcpHttpServer(ctx.store, port);
12
+
13
+ return {
14
+ stop: async () => {
15
+ server.close();
16
+ console.log(`[mcp] stopped :${port}`);
17
+ },
18
+ };
19
+ });
@@ -0,0 +1,7 @@
1
+ import { registerType } from '#comp';
2
+
3
+ /** MCP server — model context protocol endpoint for AI tool access */
4
+ export class McpConfig {
5
+ port = 3212;
6
+ }
7
+ registerType('mcp.server', McpConfig);