@treenity/core 1.0.48 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (807) hide show
  1. package/README.md +72 -12
  2. package/dist/chain.d.ts +19 -0
  3. package/dist/chain.d.ts.map +1 -0
  4. package/dist/chain.js +59 -0
  5. package/dist/chain.js.map +1 -0
  6. package/dist/client/handle.d.ts +13 -0
  7. package/dist/client/handle.d.ts.map +1 -0
  8. package/dist/client/handle.js +46 -0
  9. package/dist/client/handle.js.map +1 -0
  10. package/dist/client/index.d.ts +21 -0
  11. package/dist/client/index.d.ts.map +1 -0
  12. package/dist/client/index.js +5 -0
  13. package/dist/client/index.js.map +1 -0
  14. package/dist/client/trpc.d.ts +13 -0
  15. package/dist/client/trpc.d.ts.map +1 -0
  16. package/dist/client/trpc.js +79 -0
  17. package/dist/client/trpc.js.map +1 -0
  18. package/dist/client.d.ts +2 -0
  19. package/dist/client.d.ts.map +1 -0
  20. package/dist/client.js +2 -0
  21. package/dist/client.js.map +1 -0
  22. package/dist/comp/handle.d.ts +14 -0
  23. package/dist/comp/handle.d.ts.map +1 -0
  24. package/dist/comp/handle.js +21 -0
  25. package/dist/comp/handle.js.map +1 -0
  26. package/dist/comp/index.d.ts +41 -0
  27. package/dist/comp/index.d.ts.map +1 -0
  28. package/dist/comp/index.js +127 -0
  29. package/dist/comp/index.js.map +1 -0
  30. package/dist/comp/needs.d.ts +26 -0
  31. package/dist/comp/needs.d.ts.map +1 -0
  32. package/dist/comp/needs.js +101 -0
  33. package/dist/comp/needs.js.map +1 -0
  34. package/dist/comp/validate.d.ts +13 -0
  35. package/dist/comp/validate.d.ts.map +1 -0
  36. package/dist/comp/validate.js +117 -0
  37. package/dist/comp/validate.js.map +1 -0
  38. package/dist/comp.d.ts +2 -0
  39. package/dist/comp.d.ts.map +1 -0
  40. package/dist/comp.js +2 -0
  41. package/dist/comp.js.map +1 -0
  42. package/dist/contexts/schema/index.d.ts +7 -0
  43. package/dist/contexts/schema/index.d.ts.map +1 -0
  44. package/dist/contexts/schema/index.js +2 -0
  45. package/dist/contexts/schema/index.js.map +1 -0
  46. package/dist/contexts/schema.d.ts +2 -0
  47. package/dist/contexts/schema.d.ts.map +1 -0
  48. package/dist/contexts/schema.js +2 -0
  49. package/dist/contexts/schema.js.map +1 -0
  50. package/dist/contexts/service/index.d.ts +31 -0
  51. package/dist/contexts/service/index.d.ts.map +1 -0
  52. package/dist/contexts/service/index.js +16 -0
  53. package/dist/contexts/service/index.js.map +1 -0
  54. package/dist/contexts/service.d.ts +1 -14
  55. package/dist/contexts/service.d.ts.map +1 -1
  56. package/dist/contexts/service.js +2 -0
  57. package/dist/contexts/service.js.map +1 -0
  58. package/dist/contexts/telegram/index.d.ts +19 -0
  59. package/dist/contexts/telegram/index.d.ts.map +1 -0
  60. package/dist/contexts/telegram/index.js +89 -0
  61. package/dist/contexts/telegram/index.js.map +1 -0
  62. package/dist/contexts/text/index.d.ts +7 -0
  63. package/dist/contexts/text/index.d.ts.map +1 -0
  64. package/dist/contexts/text/index.js +9 -0
  65. package/dist/contexts/text/index.js.map +1 -0
  66. package/dist/contexts/text.d.ts +2 -0
  67. package/dist/contexts/text.d.ts.map +1 -0
  68. package/dist/contexts/text.js +2 -0
  69. package/dist/contexts/text.js.map +1 -0
  70. package/dist/core/component.d.ts +43 -0
  71. package/dist/core/component.d.ts.map +1 -0
  72. package/dist/core/component.js +101 -0
  73. package/dist/core/component.js.map +1 -0
  74. package/dist/core/context.d.ts +5 -0
  75. package/dist/core/context.d.ts.map +1 -0
  76. package/dist/core/context.js +3 -0
  77. package/dist/core/context.js.map +1 -0
  78. package/dist/core/index.d.ts +5 -0
  79. package/dist/core/index.d.ts.map +1 -0
  80. package/dist/core/index.js +8 -0
  81. package/dist/core/index.js.map +1 -0
  82. package/dist/core/path.d.ts +7 -0
  83. package/dist/core/path.d.ts.map +1 -0
  84. package/dist/core/path.js +41 -0
  85. package/dist/core/path.js.map +1 -0
  86. package/dist/core/registry.d.ts +17 -0
  87. package/dist/core/registry.d.ts.map +1 -0
  88. package/dist/core/registry.js +100 -0
  89. package/dist/core/registry.js.map +1 -0
  90. package/dist/core.d.ts +2 -0
  91. package/dist/core.d.ts.map +1 -0
  92. package/dist/core.js +2 -0
  93. package/dist/core.js.map +1 -0
  94. package/dist/index.d.ts +1 -12
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.js +2 -0
  97. package/dist/index.js.map +1 -0
  98. package/dist/log.d.ts +38 -0
  99. package/dist/log.d.ts.map +1 -0
  100. package/dist/log.js +150 -0
  101. package/dist/log.js.map +1 -0
  102. package/dist/mod/discover.d.ts +4 -0
  103. package/dist/mod/discover.d.ts.map +1 -0
  104. package/dist/mod/discover.js +103 -0
  105. package/dist/mod/discover.js.map +1 -0
  106. package/dist/mod/examples/ticker/seed.d.ts +3 -0
  107. package/dist/mod/examples/ticker/seed.d.ts.map +1 -0
  108. package/dist/mod/examples/ticker/seed.js +16 -0
  109. package/dist/mod/examples/ticker/seed.js.map +1 -0
  110. package/dist/mod/examples/ticker/service.d.ts +2 -0
  111. package/dist/mod/examples/ticker/service.d.ts.map +1 -0
  112. package/dist/mod/examples/ticker/service.js +17 -0
  113. package/dist/mod/examples/ticker/service.js.map +1 -0
  114. package/dist/mod/examples/ticker/types.d.ts +16 -0
  115. package/dist/mod/examples/ticker/types.d.ts.map +1 -0
  116. package/dist/mod/examples/ticker/types.js +20 -0
  117. package/dist/mod/examples/ticker/types.js.map +1 -0
  118. package/dist/mod/examples/ticker/view.d.ts +2 -0
  119. package/dist/mod/examples/ticker/view.d.ts.map +1 -0
  120. package/dist/mod/examples/ticker/view.js +10 -0
  121. package/dist/mod/examples/ticker/view.js.map +1 -0
  122. package/dist/mod/index.d.ts +11 -0
  123. package/dist/mod/index.d.ts.map +1 -0
  124. package/dist/mod/index.js +8 -0
  125. package/dist/mod/index.js.map +1 -0
  126. package/dist/mod/loader.d.ts +19 -0
  127. package/dist/mod/loader.d.ts.map +1 -0
  128. package/dist/mod/loader.js +180 -0
  129. package/dist/mod/loader.js.map +1 -0
  130. package/dist/mod/optimistic.d.ts +34 -0
  131. package/dist/mod/optimistic.d.ts.map +1 -0
  132. package/dist/mod/optimistic.js +176 -0
  133. package/dist/mod/optimistic.js.map +1 -0
  134. package/dist/mod/prefab.d.ts +18 -0
  135. package/dist/mod/prefab.d.ts.map +1 -0
  136. package/dist/mod/prefab.js +42 -0
  137. package/dist/mod/prefab.js.map +1 -0
  138. package/dist/mod/tracking.d.ts +8 -0
  139. package/dist/mod/tracking.d.ts.map +1 -0
  140. package/dist/mod/tracking.js +44 -0
  141. package/dist/mod/tracking.js.map +1 -0
  142. package/dist/mod/types.d.ts +31 -0
  143. package/dist/mod/types.d.ts.map +1 -0
  144. package/dist/mod/types.js +5 -0
  145. package/dist/mod/types.js.map +1 -0
  146. package/dist/mod.d.ts +2 -0
  147. package/dist/mod.d.ts.map +1 -0
  148. package/dist/mod.js +2 -0
  149. package/dist/mod.js.map +1 -0
  150. package/dist/mods/autostart/server.d.ts +2 -0
  151. package/dist/mods/autostart/server.d.ts.map +1 -0
  152. package/dist/mods/autostart/server.js +2 -0
  153. package/dist/mods/autostart/server.js.map +1 -0
  154. package/dist/mods/autostart/service.d.ts +14 -0
  155. package/dist/mods/autostart/service.d.ts.map +1 -0
  156. package/dist/mods/autostart/service.js +88 -0
  157. package/dist/mods/autostart/service.js.map +1 -0
  158. package/dist/mods/clients.d.ts +2 -0
  159. package/dist/mods/clients.d.ts.map +1 -0
  160. package/dist/mods/clients.js +3 -0
  161. package/dist/mods/clients.js.map +1 -0
  162. package/dist/mods/llm/index.d.ts +13 -0
  163. package/dist/mods/llm/index.d.ts.map +1 -0
  164. package/dist/mods/llm/index.js +43 -0
  165. package/dist/mods/llm/index.js.map +1 -0
  166. package/dist/mods/llm/server.d.ts +2 -0
  167. package/dist/mods/llm/server.d.ts.map +1 -0
  168. package/dist/mods/llm/server.js +2 -0
  169. package/dist/mods/llm/server.js.map +1 -0
  170. package/dist/mods/mcp/server.d.ts +2 -0
  171. package/dist/mods/mcp/server.js +2 -0
  172. package/dist/mods/mcp/service.d.ts +1 -0
  173. package/dist/mods/mcp/service.js +16 -0
  174. package/dist/mods/mcp/types.d.ts +4 -0
  175. package/dist/mods/mcp/types.js +6 -0
  176. package/dist/mods/servers.d.ts +4 -0
  177. package/dist/mods/servers.d.ts.map +1 -0
  178. package/dist/mods/servers.js +5 -0
  179. package/dist/mods/servers.js.map +1 -0
  180. package/dist/mods/treenity/agent-port.d.ts +2 -0
  181. package/dist/mods/treenity/agent-port.d.ts.map +1 -0
  182. package/dist/mods/treenity/agent-port.js +76 -0
  183. package/dist/mods/treenity/agent-port.js.map +1 -0
  184. package/dist/mods/treenity/builtins.d.ts +2 -0
  185. package/dist/mods/treenity/builtins.d.ts.map +1 -0
  186. package/dist/mods/treenity/builtins.js +18 -0
  187. package/dist/mods/treenity/builtins.js.map +1 -0
  188. package/dist/mods/treenity/groups.d.ts +2 -0
  189. package/dist/mods/treenity/groups.d.ts.map +1 -0
  190. package/dist/mods/treenity/groups.js +18 -0
  191. package/dist/mods/treenity/groups.js.map +1 -0
  192. package/dist/mods/treenity/logs.d.ts +18 -0
  193. package/dist/mods/treenity/logs.d.ts.map +1 -0
  194. package/dist/mods/treenity/logs.js +17 -0
  195. package/dist/mods/treenity/logs.js.map +1 -0
  196. package/dist/mods/treenity/mod-type.d.ts +2 -0
  197. package/dist/mods/treenity/mod-type.d.ts.map +1 -0
  198. package/dist/mods/treenity/mod-type.js +9 -0
  199. package/dist/mods/treenity/mod-type.js.map +1 -0
  200. package/dist/mods/treenity/seed.d.ts +2 -0
  201. package/dist/mods/treenity/seed.d.ts.map +1 -0
  202. package/dist/mods/treenity/seed.js +55 -0
  203. package/dist/mods/treenity/seed.js.map +1 -0
  204. package/dist/mods/treenity/server.d.ts +7 -0
  205. package/dist/mods/treenity/server.d.ts.map +1 -0
  206. package/dist/mods/treenity/server.js +7 -0
  207. package/dist/mods/treenity/server.js.map +1 -0
  208. package/dist/mods/treenity/system.d.ts +36 -0
  209. package/dist/mods/treenity/system.d.ts.map +1 -0
  210. package/dist/mods/treenity/system.js +61 -0
  211. package/dist/mods/treenity/system.js.map +1 -0
  212. package/dist/mods/uix/client.d.ts +3 -0
  213. package/dist/mods/uix/client.d.ts.map +1 -0
  214. package/dist/mods/uix/client.js +96 -0
  215. package/dist/mods/uix/client.js.map +1 -0
  216. package/dist/mods/uix/compile.d.ts +7 -0
  217. package/dist/mods/uix/compile.d.ts.map +1 -0
  218. package/dist/mods/uix/compile.js +96 -0
  219. package/dist/mods/uix/compile.js.map +1 -0
  220. package/dist/mods/uix/jsx-parser.d.ts +2 -0
  221. package/dist/mods/uix/jsx-parser.d.ts.map +1 -0
  222. package/dist/mods/uix/jsx-parser.js +565 -0
  223. package/dist/mods/uix/jsx-parser.js.map +1 -0
  224. package/dist/mods/uix/verify.d.ts +7 -0
  225. package/dist/mods/uix/verify.d.ts.map +1 -0
  226. package/dist/mods/uix/verify.js +59 -0
  227. package/dist/mods/uix/verify.js.map +1 -0
  228. package/dist/schema/_test-fixture.d.ts +11 -0
  229. package/dist/schema/_test-fixture.d.ts.map +1 -0
  230. package/dist/schema/_test-fixture.js +8 -0
  231. package/dist/schema/_test-fixture.js.map +1 -0
  232. package/dist/schema/catalog.d.ts +23 -0
  233. package/dist/schema/catalog.d.ts.map +1 -0
  234. package/dist/schema/catalog.js +82 -0
  235. package/dist/schema/catalog.js.map +1 -0
  236. package/dist/schema/extract-schemas.d.ts +5 -0
  237. package/dist/schema/extract-schemas.d.ts.map +1 -0
  238. package/dist/schema/extract-schemas.js +444 -0
  239. package/dist/schema/extract-schemas.js.map +1 -0
  240. package/dist/schema/load.d.ts +2 -0
  241. package/dist/schema/load.d.ts.map +1 -0
  242. package/dist/schema/load.js +23 -0
  243. package/dist/schema/load.js.map +1 -0
  244. package/dist/schema/test-fixture.types.d.ts +2 -0
  245. package/dist/schema/test-fixture.types.d.ts.map +1 -0
  246. package/dist/schema/test-fixture.types.js +19 -0
  247. package/dist/schema/test-fixture.types.js.map +1 -0
  248. package/dist/schema/types.d.ts +38 -0
  249. package/dist/schema/types.d.ts.map +1 -0
  250. package/dist/schema/types.js +3 -0
  251. package/dist/schema/types.js.map +1 -0
  252. package/dist/server/actions.d.ts +35 -0
  253. package/dist/server/actions.d.ts.map +1 -0
  254. package/dist/server/actions.js +170 -0
  255. package/dist/server/actions.js.map +1 -0
  256. package/dist/server/agent.d.ts +6 -0
  257. package/dist/server/agent.d.ts.map +1 -0
  258. package/dist/server/agent.js +15 -0
  259. package/dist/server/agent.js.map +1 -0
  260. package/dist/server/auth.d.ts +39 -0
  261. package/dist/server/auth.d.ts.map +1 -0
  262. package/dist/server/auth.js +336 -0
  263. package/dist/server/auth.js.map +1 -0
  264. package/dist/server/client.d.ts +190 -0
  265. package/dist/server/client.d.ts.map +1 -0
  266. package/dist/server/client.js +22 -0
  267. package/dist/server/client.js.map +1 -0
  268. package/dist/server/cookies.d.ts +5 -0
  269. package/dist/server/cookies.d.ts.map +1 -0
  270. package/dist/server/cookies.js +24 -0
  271. package/dist/server/cookies.js.map +1 -0
  272. package/dist/server/doc-index.d.ts +38 -0
  273. package/dist/server/doc-index.d.ts.map +1 -0
  274. package/dist/server/doc-index.js +245 -0
  275. package/dist/server/doc-index.js.map +1 -0
  276. package/dist/server/errors.d.ts +7 -0
  277. package/dist/server/errors.d.ts.map +1 -0
  278. package/dist/server/errors.js +11 -0
  279. package/dist/server/errors.js.map +1 -0
  280. package/dist/server/factory.d.ts +29 -0
  281. package/dist/server/factory.d.ts.map +1 -0
  282. package/dist/server/factory.js +89 -0
  283. package/dist/server/factory.js.map +1 -0
  284. package/dist/server/main.d.ts +2 -0
  285. package/dist/server/main.d.ts.map +1 -0
  286. package/dist/server/main.js +19 -0
  287. package/dist/server/main.js.map +1 -0
  288. package/dist/server/mcp.d.ts +4 -0
  289. package/dist/server/mcp.js +279 -0
  290. package/dist/server/migrate.d.ts +3 -0
  291. package/dist/server/migrate.d.ts.map +1 -0
  292. package/dist/server/migrate.js +56 -0
  293. package/dist/server/migrate.js.map +1 -0
  294. package/dist/server/mod-catalog.d.ts +14 -0
  295. package/dist/server/mod-catalog.d.ts.map +1 -0
  296. package/dist/server/mod-catalog.js +40 -0
  297. package/dist/server/mod-catalog.js.map +1 -0
  298. package/dist/server/mods-mount.d.ts +3 -0
  299. package/dist/server/mods-mount.d.ts.map +1 -0
  300. package/dist/server/mods-mount.js +168 -0
  301. package/dist/server/mods-mount.js.map +1 -0
  302. package/dist/server/mount-adapters.d.ts +9 -0
  303. package/dist/server/mount-adapters.d.ts.map +1 -0
  304. package/dist/server/mount-adapters.js +80 -0
  305. package/dist/server/mount-adapters.js.map +1 -0
  306. package/dist/server/mount.d.ts +3 -0
  307. package/dist/server/mount.d.ts.map +1 -0
  308. package/dist/server/mount.js +195 -0
  309. package/dist/server/mount.js.map +1 -0
  310. package/dist/server/prefab.d.ts +18 -0
  311. package/dist/server/prefab.d.ts.map +1 -0
  312. package/dist/server/prefab.js +72 -0
  313. package/dist/server/prefab.js.map +1 -0
  314. package/dist/server/refs.d.ts +3 -0
  315. package/dist/server/refs.d.ts.map +1 -0
  316. package/dist/server/refs.js +59 -0
  317. package/dist/server/refs.js.map +1 -0
  318. package/dist/server/seed/index.d.ts +6 -0
  319. package/dist/server/seed/index.d.ts.map +1 -0
  320. package/dist/server/seed/index.js +16 -0
  321. package/dist/server/seed/index.js.map +1 -0
  322. package/dist/server/server.d.ts +28 -0
  323. package/dist/server/server.d.ts.map +1 -0
  324. package/dist/server/server.js +127 -0
  325. package/dist/server/server.js.map +1 -0
  326. package/dist/server/sub.d.ts +34 -0
  327. package/dist/server/sub.d.ts.map +1 -0
  328. package/dist/server/sub.js +174 -0
  329. package/dist/server/sub.js.map +1 -0
  330. package/dist/server/trpc.d.ts +199 -0
  331. package/dist/server/trpc.d.ts.map +1 -0
  332. package/dist/server/trpc.js +323 -0
  333. package/dist/server/trpc.js.map +1 -0
  334. package/dist/server/types-mount.d.ts +3 -0
  335. package/dist/server/types-mount.d.ts.map +1 -0
  336. package/dist/server/types-mount.js +144 -0
  337. package/dist/server/types-mount.js.map +1 -0
  338. package/dist/server/validate.d.ts +3 -0
  339. package/dist/server/validate.d.ts.map +1 -0
  340. package/dist/server/validate.js +20 -0
  341. package/dist/server/validate.js.map +1 -0
  342. package/dist/server/volatile.d.ts +11 -0
  343. package/dist/server/volatile.d.ts.map +1 -0
  344. package/dist/server/volatile.js +26 -0
  345. package/dist/server/volatile.js.map +1 -0
  346. package/dist/server/watch.d.ts +23 -0
  347. package/dist/server/watch.d.ts.map +1 -0
  348. package/dist/server/watch.js +178 -0
  349. package/dist/server/watch.js.map +1 -0
  350. package/dist/tree/cache.d.ts +3 -0
  351. package/dist/tree/cache.d.ts.map +1 -0
  352. package/dist/tree/cache.js +48 -0
  353. package/dist/tree/cache.js.map +1 -0
  354. package/dist/tree/fs.d.ts +3 -0
  355. package/dist/tree/fs.d.ts.map +1 -0
  356. package/dist/tree/fs.js +276 -0
  357. package/dist/tree/fs.js.map +1 -0
  358. package/dist/tree/index.d.ts +38 -0
  359. package/dist/tree/index.d.ts.map +1 -0
  360. package/dist/tree/index.js +183 -0
  361. package/dist/tree/index.js.map +1 -0
  362. package/dist/tree/inflight.d.ts +2 -0
  363. package/dist/tree/inflight.d.ts.map +1 -0
  364. package/dist/tree/inflight.js +15 -0
  365. package/dist/tree/inflight.js.map +1 -0
  366. package/dist/tree/json-codec.d.ts +2 -0
  367. package/dist/tree/json-codec.d.ts.map +1 -0
  368. package/dist/tree/json-codec.js +13 -0
  369. package/dist/tree/json-codec.js.map +1 -0
  370. package/dist/tree/mimefs.d.ts +13 -0
  371. package/dist/tree/mimefs.d.ts.map +1 -0
  372. package/dist/tree/mimefs.js +124 -0
  373. package/dist/tree/mimefs.js.map +1 -0
  374. package/dist/tree/mongo.d.ts +5 -0
  375. package/dist/tree/mongo.d.ts.map +1 -0
  376. package/dist/tree/mongo.js +110 -0
  377. package/dist/tree/mongo.js.map +1 -0
  378. package/dist/tree/patch.d.ts +30 -0
  379. package/dist/tree/patch.d.ts.map +1 -0
  380. package/dist/tree/patch.js +112 -0
  381. package/dist/tree/patch.js.map +1 -0
  382. package/dist/tree/query.d.ts +12 -0
  383. package/dist/tree/query.d.ts.map +1 -0
  384. package/dist/tree/query.js +61 -0
  385. package/dist/tree/query.js.map +1 -0
  386. package/dist/tree/repath.d.ts +3 -0
  387. package/dist/tree/repath.d.ts.map +1 -0
  388. package/dist/tree/repath.js +38 -0
  389. package/dist/tree/repath.js.map +1 -0
  390. package/dist/tree-chain.d.ts +19 -0
  391. package/dist/tree-chain.d.ts.map +1 -0
  392. package/dist/tree-chain.js +111 -0
  393. package/dist/tree-chain.js.map +1 -0
  394. package/dist/tree.d.ts +2 -0
  395. package/dist/tree.d.ts.map +1 -0
  396. package/dist/tree.js +2 -0
  397. package/dist/tree.js.map +1 -0
  398. package/dist/uri.d.ts +11 -0
  399. package/dist/uri.d.ts.map +1 -0
  400. package/dist/uri.js +84 -0
  401. package/dist/uri.js.map +1 -0
  402. package/package.json +78 -37
  403. package/src/chain.test.ts +190 -0
  404. package/src/chain.ts +84 -0
  405. package/src/client/client.test.ts +192 -0
  406. package/src/client/handle.ts +53 -0
  407. package/src/client/index.ts +18 -0
  408. package/src/client/trpc.ts +92 -0
  409. package/src/client.ts +1 -0
  410. package/src/comp/CLAUDE.md +14 -0
  411. package/src/comp/handle.ts +36 -0
  412. package/src/comp/index.test.ts +165 -0
  413. package/src/comp/index.ts +186 -0
  414. package/src/comp/needs.test.ts +499 -0
  415. package/src/comp/needs.ts +113 -0
  416. package/src/comp/validate.test.ts +304 -0
  417. package/src/comp/validate.ts +125 -0
  418. package/src/comp.ts +1 -0
  419. package/src/contexts/schema/index.ts +7 -0
  420. package/src/contexts/schema.ts +1 -0
  421. package/src/contexts/service/index.test.ts +323 -0
  422. package/src/contexts/service/index.ts +43 -0
  423. package/src/contexts/service.ts +1 -0
  424. package/src/contexts/telegram/index.ts +115 -0
  425. package/src/contexts/text/index.test.ts +31 -0
  426. package/src/contexts/text/index.ts +18 -0
  427. package/src/contexts/text.ts +1 -0
  428. package/src/core/component.ts +153 -0
  429. package/src/core/context.ts +14 -0
  430. package/src/core/index.test.ts +224 -0
  431. package/src/core/index.ts +9 -0
  432. package/src/core/path.ts +38 -0
  433. package/src/core/registry.ts +112 -0
  434. package/src/core.ts +1 -0
  435. package/src/index.ts +1 -0
  436. package/src/log.test.ts +70 -0
  437. package/src/log.ts +199 -0
  438. package/src/mod/discover.test.ts +133 -0
  439. package/src/mod/discover.ts +100 -0
  440. package/src/mod/docs/00-index.md +19 -0
  441. package/src/mod/docs/01-primitives.md +38 -0
  442. package/src/mod/docs/02-core-api.md +68 -0
  443. package/src/mod/docs/03-registry.md +30 -0
  444. package/src/mod/docs/04-store.md +62 -0
  445. package/src/mod/docs/05-comp.md +111 -0
  446. package/src/mod/docs/06-actions.md +193 -0
  447. package/src/mod/docs/07-realtime.md +108 -0
  448. package/src/mod/docs/08-services.md +35 -0
  449. package/src/mod/docs/09-mounts.md +43 -0
  450. package/src/mod/docs/10-acl.md +60 -0
  451. package/src/mod/docs/11-server.md +62 -0
  452. package/src/mod/docs/12-conventions.md +108 -0
  453. package/src/mod/docs/13-example.md +142 -0
  454. package/src/mod/docs/14-mod-format.md +377 -0
  455. package/src/mod/docs/15-documenting-types.md +156 -0
  456. package/src/mod/examples/ticker/seed.ts +19 -0
  457. package/src/mod/examples/ticker/service.ts +19 -0
  458. package/src/mod/examples/ticker/ticker.test.ts +18 -0
  459. package/src/mod/examples/ticker/types.ts +22 -0
  460. package/src/mod/examples/ticker/view.tsx +19 -0
  461. package/src/mod/index.ts +12 -0
  462. package/src/mod/loader.test.ts +220 -0
  463. package/src/mod/loader.ts +207 -0
  464. package/src/mod/optimistic.test.ts +446 -0
  465. package/src/mod/optimistic.ts +210 -0
  466. package/src/mod/prefab.ts +62 -0
  467. package/src/mod/tracking.test.ts +59 -0
  468. package/src/mod/tracking.ts +51 -0
  469. package/src/mod/types.ts +40 -0
  470. package/src/mod.ts +1 -0
  471. package/src/mods/autostart/CLAUDE.md +6 -0
  472. package/src/mods/autostart/autostart.test.ts +85 -0
  473. package/src/mods/autostart/server.ts +1 -0
  474. package/src/mods/autostart/service.ts +98 -0
  475. package/src/mods/clients.ts +2 -0
  476. package/src/mods/llm/CLAUDE.md +6 -0
  477. package/src/mods/llm/index.ts +57 -0
  478. package/src/mods/llm/llm.test.ts +109 -0
  479. package/src/mods/llm/server.ts +1 -0
  480. package/src/mods/servers.ts +4 -0
  481. package/src/mods/treenity/agent-port.ts +93 -0
  482. package/src/mods/treenity/builtins.ts +21 -0
  483. package/src/mods/treenity/groups.ts +19 -0
  484. package/src/mods/treenity/logs.ts +26 -0
  485. package/src/mods/treenity/mod-type.ts +10 -0
  486. package/src/mods/treenity/seed.ts +58 -0
  487. package/src/mods/treenity/server.ts +6 -0
  488. package/src/mods/treenity/system.ts +70 -0
  489. package/src/mods/uix/CLAUDE.md +7 -0
  490. package/src/mods/uix/client.ts +117 -0
  491. package/src/mods/uix/compile.test.ts +228 -0
  492. package/src/mods/uix/compile.ts +112 -0
  493. package/src/mods/uix/jsx-parser.test.ts +554 -0
  494. package/src/mods/uix/jsx-parser.ts +489 -0
  495. package/src/mods/uix/lazy-load.test.ts +261 -0
  496. package/src/mods/uix/uix-repomix.md +3509 -0
  497. package/src/mods/uix/verify.ts +68 -0
  498. package/src/schema/CLAUDE.md +13 -0
  499. package/src/schema/_test-fixture.ts +12 -0
  500. package/src/schema/catalog.ts +101 -0
  501. package/src/schema/extract-schemas.test.ts +84 -0
  502. package/src/schema/extract-schemas.ts +462 -0
  503. package/src/schema/generated/ai.agent.json +133 -0
  504. package/src/schema/generated/ai.approval.json +105 -0
  505. package/src/schema/generated/ai.approvals.json +24 -0
  506. package/src/schema/generated/ai.assignment.json +28 -0
  507. package/src/schema/generated/ai.plan.json +84 -0
  508. package/src/schema/generated/ai.policy.json +105 -0
  509. package/src/schema/generated/ai.pool.json +37 -0
  510. package/src/schema/generated/ai.thread.json +64 -0
  511. package/src/schema/generated/autostart.json +44 -0
  512. package/src/schema/generated/board.column.json +25 -0
  513. package/src/schema/generated/board.kanban.json +7 -0
  514. package/src/schema/generated/board.task.json +147 -0
  515. package/src/schema/generated/brahman.action.back.json +12 -0
  516. package/src/schema/generated/brahman.action.broadcast.json +31 -0
  517. package/src/schema/generated/brahman.action.call.json +57 -0
  518. package/src/schema/generated/brahman.action.emittext.json +23 -0
  519. package/src/schema/generated/brahman.action.eval.json +23 -0
  520. package/src/schema/generated/brahman.action.file.json +28 -0
  521. package/src/schema/generated/brahman.action.forward.json +29 -0
  522. package/src/schema/generated/brahman.action.getvalue.json +28 -0
  523. package/src/schema/generated/brahman.action.ifelse.json +42 -0
  524. package/src/schema/generated/brahman.action.keywordselect.json +46 -0
  525. package/src/schema/generated/brahman.action.message.json +127 -0
  526. package/src/schema/generated/brahman.action.onerror.json +29 -0
  527. package/src/schema/generated/brahman.action.page.json +22 -0
  528. package/src/schema/generated/brahman.action.params.json +36 -0
  529. package/src/schema/generated/brahman.action.question.json +43 -0
  530. package/src/schema/generated/brahman.action.remove.json +12 -0
  531. package/src/schema/generated/brahman.action.resethistory.json +12 -0
  532. package/src/schema/generated/brahman.action.resetsession.json +12 -0
  533. package/src/schema/generated/brahman.action.selectlang.json +20 -0
  534. package/src/schema/generated/brahman.action.setvalue.json +27 -0
  535. package/src/schema/generated/brahman.action.tag.json +27 -0
  536. package/src/schema/generated/brahman.bot.json +68 -0
  537. package/src/schema/generated/brahman.page.json +25 -0
  538. package/src/schema/generated/brahman.session.json +29 -0
  539. package/src/schema/generated/brahman.user.json +58 -0
  540. package/src/schema/generated/cafe.contact.json +56 -0
  541. package/src/schema/generated/cafe.mail.json +29 -0
  542. package/src/schema/generated/canary.item.json +40 -0
  543. package/src/schema/generated/claude-search.json +20 -0
  544. package/src/schema/generated/craft.product.json +47 -0
  545. package/src/schema/generated/craft.shop.json +94 -0
  546. package/src/schema/generated/craft.subscription.json +27 -0
  547. package/src/schema/generated/default.json +15 -0
  548. package/src/schema/generated/doc.page.json +23 -0
  549. package/src/schema/generated/examples.demo.generator.json +16 -0
  550. package/src/schema/generated/examples.demo.sensor.json +35 -0
  551. package/src/schema/generated/examples.demo.sensor.reading.json +25 -0
  552. package/src/schema/generated/flow.node.action.json +61 -0
  553. package/src/schema/generated/flow.node.code.json +43 -0
  554. package/src/schema/generated/flow.node.condition.json +37 -0
  555. package/src/schema/generated/flow.node.end.json +35 -0
  556. package/src/schema/generated/flow.node.http.json +65 -0
  557. package/src/schema/generated/flow.node.llm.json +67 -0
  558. package/src/schema/generated/flow.node.loop.json +49 -0
  559. package/src/schema/generated/flow.node.start.json +39 -0
  560. package/src/schema/generated/flow.scenario.json +118 -0
  561. package/src/schema/generated/groups.json +20 -0
  562. package/src/schema/generated/grove.attempt.json +199 -0
  563. package/src/schema/generated/grove.path.json +93 -0
  564. package/src/schema/generated/grove.review.json +27 -0
  565. package/src/schema/generated/grove.task.json +164 -0
  566. package/src/schema/generated/intel.scenario.json +58 -0
  567. package/src/schema/generated/intel.signal.json +113 -0
  568. package/src/schema/generated/intel.world.json +15 -0
  569. package/src/schema/generated/landing.block.json +201 -0
  570. package/src/schema/generated/landing.page.json +84 -0
  571. package/src/schema/generated/launcher.json +91 -0
  572. package/src/schema/generated/mcp.server.json +15 -0
  573. package/src/schema/generated/metatron.config.json +119 -0
  574. package/src/schema/generated/metatron.permission.json +36 -0
  575. package/src/schema/generated/metatron.skill.json +36 -0
  576. package/src/schema/generated/metatron.task.json +114 -0
  577. package/src/schema/generated/metatron.template.json +26 -0
  578. package/src/schema/generated/metatron.workspace.json +60 -0
  579. package/src/schema/generated/mindmap.map.json +22 -0
  580. package/src/schema/generated/order.status.json +21 -0
  581. package/src/schema/generated/polyhope.backtest.json +161 -0
  582. package/src/schema/generated/polyhope.feed.json +33 -0
  583. package/src/schema/generated/polyhope.run.json +94 -0
  584. package/src/schema/generated/polyhope.strategy.json +152 -0
  585. package/src/schema/generated/polymax.activity.json +65 -0
  586. package/src/schema/generated/polymax.aggr-feed.json +28 -0
  587. package/src/schema/generated/polymax.aggr.json +20 -0
  588. package/src/schema/generated/polymax.alert.json +56 -0
  589. package/src/schema/generated/polymax.bot-config.json +14 -0
  590. package/src/schema/generated/polymax.bot-status.json +35 -0
  591. package/src/schema/generated/polymax.classification.json +55 -0
  592. package/src/schema/generated/polymax.deposits.json +45 -0
  593. package/src/schema/generated/polymax.holding.json +55 -0
  594. package/src/schema/generated/polymax.identity.json +71 -0
  595. package/src/schema/generated/polymax.lb-entry.json +75 -0
  596. package/src/schema/generated/polymax.leaderboard.json +37 -0
  597. package/src/schema/generated/polymax.market-ref.json +25 -0
  598. package/src/schema/generated/polymax.performance.json +65 -0
  599. package/src/schema/generated/polymax.profile.json +16 -0
  600. package/src/schema/generated/polymax.scan-result.json +50 -0
  601. package/src/schema/generated/polymax.status.json +40 -0
  602. package/src/schema/generated/polymax.tags.json +53 -0
  603. package/src/schema/generated/polymax.trader.json +16 -0
  604. package/src/schema/generated/polymax.wallet-market.json +50 -0
  605. package/src/schema/generated/polymax.wallet-pnl.json +35 -0
  606. package/src/schema/generated/pult.concept.json +53 -0
  607. package/src/schema/generated/pult.config.json +227 -0
  608. package/src/schema/generated/pult.connector.json +72 -0
  609. package/src/schema/generated/pult.market.json +113 -0
  610. package/src/schema/generated/pult.order.json +113 -0
  611. package/src/schema/generated/pult.rete.json +68 -0
  612. package/src/schema/generated/pult.sensor.json +74 -0
  613. package/src/schema/generated/pult.signal.json +54 -0
  614. package/src/schema/generated/pult.synapse.json +93 -0
  615. package/src/schema/generated/pult.trade.json +93 -0
  616. package/src/schema/generated/resim.config.json +34 -0
  617. package/src/schema/generated/resim.function.json +62 -0
  618. package/src/schema/generated/resim.goal.json +22 -0
  619. package/src/schema/generated/resim.resource.json +40 -0
  620. package/src/schema/generated/resim.state.json +48 -0
  621. package/src/schema/generated/resim.world.json +40 -0
  622. package/src/schema/generated/saveme.action.save.json +29 -0
  623. package/src/schema/generated/saveme.message.json +36 -0
  624. package/src/schema/generated/saveme.router.json +31 -0
  625. package/src/schema/generated/sim.agent.json +24 -0
  626. package/src/schema/generated/sim.ai.json +24 -0
  627. package/src/schema/generated/sim.config.json +38 -0
  628. package/src/schema/generated/sim.descriptive.json +26 -0
  629. package/src/schema/generated/sim.events.json +47 -0
  630. package/src/schema/generated/sim.item.json +20 -0
  631. package/src/schema/generated/sim.memory.json +17 -0
  632. package/src/schema/generated/sim.nearby.json +17 -0
  633. package/src/schema/generated/sim.position.json +25 -0
  634. package/src/schema/generated/sim.round.json +64 -0
  635. package/src/schema/generated/sim.world.json +32 -0
  636. package/src/schema/generated/t.agent.port.json +74 -0
  637. package/src/schema/generated/t.coolify.json +50 -0
  638. package/src/schema/generated/t.event.json +46 -0
  639. package/src/schema/generated/t.llm.json +20 -0
  640. package/src/schema/generated/t.logs.json +155 -0
  641. package/src/schema/generated/t.mod.json +27 -0
  642. package/src/schema/generated/t.note.json +31 -0
  643. package/src/schema/generated/t.person.json +36 -0
  644. package/src/schema/generated/t.tenant.json +57 -0
  645. package/src/schema/generated/t.tenant.status.json +42 -0
  646. package/src/schema/generated/t3d.animator.json +46 -0
  647. package/src/schema/generated/t3d.audio.json +58 -0
  648. package/src/schema/generated/t3d.camera.json +50 -0
  649. package/src/schema/generated/t3d.collider.json +84 -0
  650. package/src/schema/generated/t3d.light.json +90 -0
  651. package/src/schema/generated/t3d.line.json +47 -0
  652. package/src/schema/generated/t3d.lod.json +28 -0
  653. package/src/schema/generated/t3d.material.json +131 -0
  654. package/src/schema/generated/t3d.mesh.json +65 -0
  655. package/src/schema/generated/t3d.object.json +64 -0
  656. package/src/schema/generated/t3d.particles.json +109 -0
  657. package/src/schema/generated/t3d.rigidbody.json +81 -0
  658. package/src/schema/generated/t3d.scene.json +7 -0
  659. package/src/schema/generated/t3d.script.json +23 -0
  660. package/src/schema/generated/t3d.text.json +86 -0
  661. package/src/schema/generated/t3d.trail.json +45 -0
  662. package/src/schema/generated/tagger.config.json +115 -0
  663. package/src/schema/generated/tagger.result.json +57 -0
  664. package/src/schema/generated/tagger.tree.json +36 -0
  665. package/src/schema/generated/task.json +96 -0
  666. package/src/schema/generated/test.fixture.json +43 -0
  667. package/src/schema/generated/ticker.config.json +43 -0
  668. package/src/schema/generated/ticker.price.json +20 -0
  669. package/src/schema/generated/todo.item.json +25 -0
  670. package/src/schema/generated/todo.list.json +33 -0
  671. package/src/schema/generated/treenity.system.json +259 -0
  672. package/src/schema/generated/ui.table.json +46 -0
  673. package/src/schema/generated/whisper.audio.json +25 -0
  674. package/src/schema/generated/whisper.checklist.json +17 -0
  675. package/src/schema/generated/whisper.config.json +30 -0
  676. package/src/schema/generated/whisper.inbox.json +24 -0
  677. package/src/schema/generated/whisper.meta.json +35 -0
  678. package/src/schema/generated/whisper.text.json +16 -0
  679. package/src/schema/load.ts +24 -0
  680. package/src/schema/schema.test.ts +86 -0
  681. package/src/schema/test-fixture.types.ts +21 -0
  682. package/src/schema/types.ts +34 -0
  683. package/src/server/CLAUDE.md +26 -0
  684. package/src/server/actions.test.ts +272 -0
  685. package/src/server/actions.ts +274 -0
  686. package/src/server/agent-sub.test.ts +90 -0
  687. package/src/server/agent.test.ts +305 -0
  688. package/src/server/agent.ts +17 -0
  689. package/src/server/api.test.ts +463 -0
  690. package/src/server/auth.test.ts +441 -0
  691. package/src/server/auth.ts +387 -0
  692. package/src/server/client.ts +24 -0
  693. package/src/server/conditions.test.ts +128 -0
  694. package/src/server/cookies.ts +25 -0
  695. package/src/server/coverage.test.ts +827 -0
  696. package/src/server/doc-index.ts +287 -0
  697. package/src/server/e2e.test.ts +967 -0
  698. package/src/server/errors.ts +11 -0
  699. package/src/server/factory.ts +121 -0
  700. package/src/server/main.ts +24 -0
  701. package/src/server/migrate.test.ts +123 -0
  702. package/src/server/migrate.ts +62 -0
  703. package/src/server/mod-catalog.ts +59 -0
  704. package/src/server/mods-mount.ts +177 -0
  705. package/src/server/mount-adapters.ts +87 -0
  706. package/src/server/mount.parametrized.test.ts +52 -0
  707. package/src/server/mount.query.test.ts +127 -0
  708. package/src/server/mount.test.ts +565 -0
  709. package/src/server/mount.ts +208 -0
  710. package/src/server/prefab.test.ts +415 -0
  711. package/src/server/prefab.ts +105 -0
  712. package/src/server/refs.test.ts +82 -0
  713. package/src/server/refs.ts +64 -0
  714. package/src/server/seed/index.ts +24 -0
  715. package/src/server/server.ts +164 -0
  716. package/src/server/stress.test.ts +844 -0
  717. package/src/server/sub.test.ts +55 -0
  718. package/src/server/sub.ts +224 -0
  719. package/src/server/trpc.ts +375 -0
  720. package/src/server/types-mount.ts +142 -0
  721. package/src/server/validate.test.ts +91 -0
  722. package/src/server/validate.ts +22 -0
  723. package/src/server/volatile.test.ts +140 -0
  724. package/src/server/volatile.ts +32 -0
  725. package/src/server/watch.test.ts +594 -0
  726. package/src/server/watch.ts +202 -0
  727. package/src/server/workflow.test.ts +82 -0
  728. package/src/tree/CLAUDE.md +13 -0
  729. package/src/tree/cache.test.ts +213 -0
  730. package/src/tree/cache.ts +51 -0
  731. package/src/tree/fs.test.ts +247 -0
  732. package/src/tree/fs.ts +257 -0
  733. package/src/tree/index.test.ts +190 -0
  734. package/src/tree/index.ts +217 -0
  735. package/src/tree/inflight.ts +15 -0
  736. package/src/tree/json-codec.ts +16 -0
  737. package/src/tree/mimefs.test.ts +289 -0
  738. package/src/tree/mimefs.ts +142 -0
  739. package/src/tree/mongo.ts +125 -0
  740. package/src/tree/patch.test.ts +192 -0
  741. package/src/tree/patch.ts +133 -0
  742. package/src/tree/query.test.ts +110 -0
  743. package/src/tree/query.ts +70 -0
  744. package/src/tree/repath.test.ts +86 -0
  745. package/src/tree/repath.ts +53 -0
  746. package/src/tree-chain.test.ts +716 -0
  747. package/src/tree-chain.ts +150 -0
  748. package/src/tree.ts +1 -0
  749. package/src/uri.test.ts +113 -0
  750. package/src/uri.ts +84 -0
  751. package/CHANGELOG.md +0 -314
  752. package/dist/context.d.ts +0 -41
  753. package/dist/context.d.ts.map +0 -1
  754. package/dist/context.mjs +0 -81
  755. package/dist/context.mjs.map +0 -1
  756. package/dist/contexts/node-engine.d.ts +0 -12
  757. package/dist/contexts/node-engine.d.ts.map +0 -1
  758. package/dist/contexts/node-engine.mjs +0 -7
  759. package/dist/contexts/node-engine.mjs.map +0 -1
  760. package/dist/contexts/noflo/types.d.ts +0 -20
  761. package/dist/contexts/noflo/types.d.ts.map +0 -1
  762. package/dist/contexts/object.d.ts +0 -11
  763. package/dist/contexts/object.d.ts.map +0 -1
  764. package/dist/contexts/object.mjs +0 -15
  765. package/dist/contexts/object.mjs.map +0 -1
  766. package/dist/contexts/proto.d.ts +0 -11
  767. package/dist/contexts/proto.d.ts.map +0 -1
  768. package/dist/contexts/proto.mjs +0 -7
  769. package/dist/contexts/proto.mjs.map +0 -1
  770. package/dist/contexts/react-context.d.ts +0 -21
  771. package/dist/contexts/react-context.d.ts.map +0 -1
  772. package/dist/contexts/react-context.mjs +0 -24
  773. package/dist/contexts/react-context.mjs.map +0 -1
  774. package/dist/contexts/service.mjs +0 -7
  775. package/dist/contexts/service.mjs.map +0 -1
  776. package/dist/get-type-cache.d.ts +0 -2
  777. package/dist/get-type-cache.d.ts.map +0 -1
  778. package/dist/get-type-cache.mjs +0 -7
  779. package/dist/get-type-cache.mjs.map +0 -1
  780. package/dist/index.mjs +0 -10
  781. package/dist/index.mjs.map +0 -1
  782. package/dist/link/link.d.ts +0 -25
  783. package/dist/link/link.d.ts.map +0 -1
  784. package/dist/link/link.mjs +0 -72
  785. package/dist/link/link.mjs.map +0 -1
  786. package/dist/link/link.test.d.ts +0 -2
  787. package/dist/link/link.test.d.ts.map +0 -1
  788. package/dist/loading.d.ts +0 -9
  789. package/dist/loading.d.ts.map +0 -1
  790. package/dist/meta-type.d.ts +0 -58
  791. package/dist/meta-type.d.ts.map +0 -1
  792. package/dist/meta-type.mjs +0 -104
  793. package/dist/meta-type.mjs.map +0 -1
  794. package/dist/meta.d.ts +0 -20
  795. package/dist/meta.d.ts.map +0 -1
  796. package/dist/meta.mjs +0 -16
  797. package/dist/meta.mjs.map +0 -1
  798. package/dist/node/index.d.ts +0 -2
  799. package/dist/node/index.d.ts.map +0 -1
  800. package/dist/node/types.d.ts +0 -37
  801. package/dist/node/types.d.ts.map +0 -1
  802. package/dist/test/context.test.d.ts +0 -2
  803. package/dist/test/context.test.d.ts.map +0 -1
  804. package/dist/types.d.ts +0 -14
  805. package/dist/types.d.ts.map +0 -1
  806. package/dist/types.mjs +0 -16
  807. package/dist/types.mjs.map +0 -1
@@ -0,0 +1,142 @@
1
+ # 13 — Полный пример: мод от начала до конца
2
+
3
+ ## 1. types.ts — определение компонентов
4
+
5
+ ```ts
6
+ // src/mods/sensor/types.ts
7
+ import { getCtx, registerComp, getComp } from '#comp';
8
+
9
+ export class SensorConfig {
10
+ /** @title Интервал @description Секунды между замерами */
11
+ interval = 5;
12
+ /** @title Источник */
13
+ source = '';
14
+
15
+ updateInterval(data: { interval: number }) {
16
+ this.interval = data.interval;
17
+ }
18
+
19
+ async history() {
20
+ const { node, store } = getCtx();
21
+ const { items } = await store.getChildren(node.$path, { limit: 100 });
22
+ return { items: items.map(n => {
23
+ const r = getComp(n, SensorReading);
24
+ return r ? { value: r.value, ts: r.ts } : null;
25
+ }).filter(Boolean) };
26
+ }
27
+ }
28
+
29
+ registerComp('sensor.config', SensorConfig);
30
+
31
+ export class SensorReading {
32
+ value = 0;
33
+ ts = 0;
34
+ }
35
+
36
+ registerComp('sensor.reading', SensorReading);
37
+ ```
38
+
39
+ ## 2. service.ts — фоновый процесс
40
+
41
+ ```ts
42
+ // src/mods/sensor/service.ts
43
+ import { register, createNode, type NodeData } from '#core';
44
+ import { getComp } from '#comp';
45
+ import { type ServiceHandle, type ServiceCtx } from '#contexts/service';
46
+ import { SensorConfig } from './types';
47
+
48
+ register('sensor', 'service', async (node: NodeData, ctx: ServiceCtx) => {
49
+ const config = getComp(node, SensorConfig);
50
+ const interval = (config?.interval ?? 5) * 1000;
51
+
52
+ const timer = setInterval(async () => {
53
+ await ctx.store.set(createNode(
54
+ `${node.$path}/${Date.now()}`,
55
+ 'sensor.reading',
56
+ { value: Math.random() * 100, ts: Date.now() },
57
+ ));
58
+ }, interval);
59
+
60
+ return { stop: async () => clearInterval(timer) } satisfies ServiceHandle;
61
+ });
62
+ ```
63
+
64
+ ## 3. view.tsx — React-рендер
65
+
66
+ ```tsx
67
+ // src/mods/sensor/view.tsx
68
+ import { register } from '#core';
69
+ import type { View } from '@treenity/react/context';
70
+ import { useChildren } from '@treenity/react/hooks';
71
+ import { SensorConfig, SensorReading } from './types';
72
+
73
+ // View<T> — типизированный компонент. value: T, ctx: ViewCtx
74
+ const ConfigView: View<SensorConfig> = ({ value }) => {
75
+ return (
76
+ <div>
77
+ <label>Interval: {value.interval}s</label>
78
+ <label>Source: {value.source}</label>
79
+ </div>
80
+ );
81
+ };
82
+
83
+ const SensorView: View<SensorConfig> = ({ value, ctx }) => {
84
+ const readings = useChildren(ctx!.node.$path, { limit: 10, watchNew: true });
85
+
86
+ return (
87
+ <div>
88
+ <h3>Sensor: {ctx!.node.$path}</h3>
89
+ {readings.map(r => (
90
+ <div key={r.$path}>
91
+ {(r as SensorReading).value?.toFixed(1)} @ {new Date((r as SensorReading).ts).toLocaleTimeString()}
92
+ </div>
93
+ ))}
94
+ </div>
95
+ );
96
+ };
97
+
98
+ // register принимает Class<T> — типы пробрасываются автоматически
99
+ register(SensorConfig, 'react', ConfigView);
100
+ register(SensorConfig, 'react:list', SensorView);
101
+ ```
102
+
103
+ ## 4. schemas.ts — JSON Schema
104
+
105
+ ```ts
106
+ // src/mods/sensor/schemas.ts
107
+ import { register } from '#core';
108
+
109
+ register('sensor.config', 'schema', () => ({
110
+ title: 'Sensor Config',
111
+ properties: {
112
+ interval: { type: 'number', title: 'Interval (sec)', minimum: 1 },
113
+ source: { type: 'string', title: 'Source URL' },
114
+ },
115
+ }));
116
+ ```
117
+
118
+ ## 5. Регистрация
119
+
120
+ ```ts
121
+ // src/mods/index.ts — добавить:
122
+ import './sensor/types';
123
+ import './sensor/service';
124
+
125
+ // src/mods/views.ts — добавить:
126
+ import './sensor/view';
127
+ import './sensor/schemas';
128
+ ```
129
+
130
+ ## 6. Seed-данные
131
+
132
+ ```ts
133
+ import { createNode } from '#core';
134
+
135
+ await store.set(createNode('/sensors/temp', 'sensor', {
136
+ config: { $type: 'sensor.config', interval: 10, source: 'internal' },
137
+ }));
138
+
139
+ await store.set(createNode('/sys/autostart/temp-sensor', 'ref', {
140
+ $ref: '/sensors/temp',
141
+ }));
142
+ ```
@@ -0,0 +1,377 @@
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(createNode('/sensors/weather', 'weather.sensor', {
75
+ config: { $type: 'weather.config', location: 'Moscow', interval: 60 },
76
+ }));
77
+
78
+ await store.set(createNode('/sys/autostart/weather', 'ref', {
79
+ $ref: '/sensors/weather',
80
+ }));
81
+ },
82
+
83
+ onLoad: () => console.log('Weather mod loaded'),
84
+ onUnload: () => console.log('Weather mod unloaded'),
85
+ });
86
+ ```
87
+
88
+ ## Обнаружение
89
+
90
+ ```ts
91
+ import { discoverMods } from '#mod';
92
+
93
+ // Сканирует node_modules, ищет пакеты с полем "treenity" в package.json
94
+ const manifests = await discoverMods('./node_modules');
95
+ // → [{ name: 'weather', version: '1.0.0', types: [...], server: '...', ... }]
96
+ ```
97
+
98
+ Поддерживает: обычные пакеты, scoped пакеты (`@org/treenity-mod-*`), произвольные имена.
99
+
100
+ ## Загрузка
101
+
102
+ ```ts
103
+ import { discoverMods, loadMods } from '#mod';
104
+
105
+ const manifests = await discoverMods('./node_modules');
106
+ const result = await loadMods(manifests, 'server', store);
107
+
108
+ console.log(result.loaded); // ['core-sensors', 'weather'] — в порядке зависимостей
109
+ console.log(result.failed); // [{ name: 'broken-mod', error: Error }]
110
+ ```
111
+
112
+ `loadMods()` автоматически:
113
+ 1. Сортирует по зависимостям (Kahn's algorithm)
114
+ 2. Проверяет что зависимости загружены
115
+ 3. Импортирует server/client entry point
116
+ 4. Вызывает `onLoad()`
117
+ 5. Seed (если target = server и передан store)
118
+ 6. Отслеживает состояние в реестре
119
+
120
+ ### Ошибки загрузки
121
+
122
+ - Неизвестная зависимость → `Error: Mod "X" depends on unknown mod "Y"`
123
+ - Циклическая зависимость → `Error: Circular dependency among mods: A, B, C`
124
+ - Ошибка загрузки → модуль помечается `state: 'failed'`, остальные продолжают грузиться
125
+
126
+ ## Реестр
127
+
128
+ ```ts
129
+ import { getLoadedMods, getMod, isModLoaded } from '#mod';
130
+
131
+ getLoadedMods(); // → LoadedMod[]
132
+ getMod('weather'); // → { manifest, mod, state: 'loaded', loadedAt }
133
+ isModLoaded('weather'); // → true
134
+ ```
135
+
136
+ ## Dev workflow
137
+
138
+ Полный рабочий пример — [examples/ticker/](examples/ticker/) — types, service, view, seed, test.
139
+ Скопируй, адаптируй под свой мод.
140
+
141
+ **Подключение (добавить импорты):**
142
+ ```ts
143
+ // src/mods/index.ts
144
+ import './ticker/types';
145
+ import './ticker/service';
146
+
147
+ // src/mods/views.ts
148
+ import './ticker/view';
149
+ ```
150
+
151
+ **Запуск:**
152
+ ```bash
153
+ npm run dev:server # tsx --watch
154
+ npm run dev:front # vite HMR
155
+ ```
156
+
157
+ **Дебаг сервера через Chrome DevTools:**
158
+ ```bash
159
+ node --inspect -r tsx/esm src/server/index.ts
160
+ # → chrome://inspect
161
+ ```
162
+
163
+ **Тест:**
164
+ ```bash
165
+ npx tsx --test src/mods/ticker/ticker.test.ts
166
+ ```
167
+
168
+ **Готово → npm:**
169
+ ```bash
170
+ mkdir treenity-mod-ticker && cd treenity-mod-ticker
171
+ npm init
172
+ # Скопировать файлы, заменить @/ на @treenity/core, добавить "treenity" в package.json
173
+ npm publish
174
+ ```
175
+
176
+ ---
177
+
178
+ ## Typed Signatures — контракты между модами
179
+
180
+ Модули связываются через типы. Класс компонента — экспортируемый контракт:
181
+
182
+ ```ts
183
+ // treenity-mod-accounting
184
+ export class Account {
185
+ static $type = 'accounting.account'
186
+ balance = 0
187
+
188
+ debit(data: { amount: number }) { this.balance -= data.amount }
189
+ }
190
+ ```
191
+
192
+ ```ts
193
+ // treenity-mod-billing — зависит от accounting
194
+ import { Account } from 'treenity-mod-accounting'
195
+
196
+ export class Invoice {
197
+ static $type = 'billing.invoice'
198
+
199
+ async charge(data: { amount: number, account: Account }) {
200
+ data.account.debit({ amount: data.amount })
201
+ }
202
+ }
203
+ ```
204
+
205
+ `account: Account` в сигнатуре — это одновременно:
206
+ - **Типизированный параметр** при вызове из кода: `invoice.charge({ amount: 10, account })`
207
+ - **Порт** в визуальном редакторе: входной разъём, к которому подключается Account-нода
208
+
209
+ Никакого DI-фреймворка, event bus, plugin API. ES import класса = зависимость.
210
+ TypeScript проверяет, JSON Schema генерируется для AI/UI.
211
+
212
+ ---
213
+
214
+ ## Optimistic Updates
215
+
216
+ Класс компонента — shared kernel между клиентом и сервером. Один код, две среды:
217
+ - **Сервер:** метод выполняется через Immer draft → patches → store.set()
218
+ - **Клиент:** тот же метод выполняется на клоне → мгновенный UI → сервер подтверждает или откатывает
219
+
220
+ ### OptimisticBuffer
221
+
222
+ ```ts
223
+ import { OptimisticBuffer } from '#mod';
224
+
225
+ const buf = new OptimisticBuffer();
226
+ ```
227
+
228
+ ### Цикл: apply → confirm/rollback
229
+
230
+ ```ts
231
+ // 1. Юзер жмёт кнопку — применяем оптимистично
232
+ const { predicted, mutationId } = buf.apply(
233
+ node, // текущая нода
234
+ 'order.status', // тип компонента
235
+ 'advance', // имя метода
236
+ (target, data) => target.advance(),// метод
237
+ undefined, // data (аргументы метода)
238
+ );
239
+ // predicted — нода с предсказанным результатом
240
+ // → обновить кэш: cache.put(predicted)
241
+
242
+ // 2. Отправить экшен на сервер
243
+ trpc.execute.mutate({ path: '/orders/1', type: 'order.status', action: 'advance' });
244
+
245
+ // 3. Сервер отвечает через подписку (SSE patches)
246
+ const { node: final, rolledBack } = buf.confirm('/orders/1', serverNode);
247
+ // rolledBack = false → предсказание совпало
248
+ // rolledBack = true → сервер вернул другое, откатили
249
+
250
+ cache.put(final);
251
+ ```
252
+
253
+ ### Множественные мутации
254
+
255
+ Мутации на одном пути стакаются. При подтверждении первой — остальные ребейзятся:
256
+
257
+ ```ts
258
+ buf.apply(counter0, 'counter', 'increment', incMethod, undefined); // → count: 1
259
+ buf.apply(counter1, 'counter', 'increment', incMethod, undefined); // → count: 2
260
+ buf.apply(counter2, 'counter', 'increment', incMethod, undefined); // → count: 3
261
+
262
+ buf.getPendingCount('/counters/1'); // → 3
263
+ buf.getOptimistic('/counters/1'); // → { count: 3 }
264
+
265
+ // Сервер подтверждает первое (count=1)
266
+ buf.confirm('/counters/1', serverNode); // rebase: оставшиеся 2 переигрываются
267
+ buf.getPendingCount('/counters/1'); // → 2
268
+ ```
269
+
270
+ ### Конфликт — сервер всегда прав
271
+
272
+ ```ts
273
+ buf.apply(order, 'order.status', 'advance', advanceMethod, undefined);
274
+
275
+ const { node, rolledBack } = buf.confirm('/orders/1', cancelledOrder);
276
+ // rolledBack = true, все pending сброшены
277
+ // node = cancelledOrder (серверная версия)
278
+ ```
279
+
280
+ ### API
281
+
282
+ ```ts
283
+ buf.hasPending('/path'); // есть ли ожидающие мутации
284
+ buf.getPendingCount('/path'); // сколько
285
+ buf.getPendingCount(); // всего по всем путям
286
+ buf.rollback('/path'); // откатить всё, вернуть baseline
287
+ buf.rollbackById(mutationId); // откатить конкретную мутацию
288
+ buf.confirmById(mutationId); // подтвердить конкретную
289
+ buf.expire(30_000); // удалить мутации старше 30с
290
+ buf.clear(); // сбросить всё
291
+ ```
292
+
293
+ ### Как работает внутри
294
+
295
+ 1. `apply()` — `structuredClone(node)` → найти компонент → вызвать метод → сохранить baseline + predicted + method + data
296
+ 2. `confirm()` — сравнить predicted с serverNode (без $rev) → совпало? drop. нет? rollback all.
297
+ 3. `rebase()` — переиграть оставшиеся мутации на новой базе, используя сохранённые method + data
298
+ 4. `expire()` — таймаут для зависших мутаций (сервер не ответил)
299
+
300
+ **Почему хранится method + data:** `structuredClone()` стирает прототипы. Без сохранённой ссылки на метод rebase не может переиграть мутации.
301
+
302
+ ---
303
+
304
+ ## Views — register / Render / RenderContext
305
+
306
+ Вьюхи НИКОГДА не рендерят дочерние компоненты напрямую. Всё через реестр:
307
+
308
+ ### Регистрация — типобезопасная
309
+
310
+ ```tsx
311
+ import { register } from '@treenity/core/core';
312
+ import type { View } from '@treenity/react/context';
313
+ import { Render, RenderContext } from '@treenity/react/context';
314
+
315
+ // View<T> — типизированный React-компонент: { value: T, ctx?, onChange? }
316
+ const SensorView: View<WeatherSensor> = ({ value, ctx }) => {
317
+ const path = ctx!.node.$path; // путь ноды — через ctx, НЕ из value
318
+ return <div>{value.location} — {value.temperature}°C</div>;
319
+ };
320
+
321
+ const SensorRow: View<WeatherSensor> = ({ value, ctx }) => { ... };
322
+
323
+ // register принимает Class<T> — T пробрасывается в handler автоматически
324
+ register(WeatherSensor, 'react', SensorView); // detail view
325
+ register(WeatherSensor, 'react:list', SensorRow); // compact list view
326
+ ```
327
+
328
+ **ЗАПРЕЩЕНО:**
329
+ ```tsx
330
+ // WRONG — as any убивает типизацию, прячет ошибки:
331
+ register('weather.sensor', 'react', SensorView as any);
332
+
333
+ // WRONG — NodeData не смешивать с типами компонентов:
334
+ function SensorRow({ value }: { value: NodeData & WeatherSensor }) { ... }
335
+
336
+ // WRONG — путь из value (value — данные компонента, не нода):
337
+ const path = value.$path; // может не существовать!
338
+ ```
339
+
340
+ ### Рендер дочерних — ТОЛЬКО через `<Render>`
341
+
342
+ ```tsx
343
+ // WRONG — хардкод, обходит реестр:
344
+ {sensors.map(s => <SensorRow key={s.$path} sensor={s} />)}
345
+
346
+ // RIGHT — через реестр, композабельно:
347
+ <RenderContext name="react:list">
348
+ {sensors.map(s => <Render key={s.$path} value={s} />)}
349
+ </RenderContext>
350
+ ```
351
+
352
+ ### Контексты
353
+
354
+ | Контекст | Назначение |
355
+ |----------|-----------|
356
+ | `react` | default/detail view |
357
+ | `react:list` | компактная карточка для списков |
358
+ | `react:edit` | форма редактирования |
359
+
360
+ Fallback автоматический: `react:list` → `react` → `default`.
361
+
362
+ ### Сигнатура view-функции
363
+
364
+ ```tsx
365
+ // View<T> даёт: value: T, ctx: ViewCtx (node, path, execute), onChange
366
+ const SensorView: View<WeatherSensor> = ({ value, ctx }) => {
367
+ // value — данные компонента (WeatherSensor fields)
368
+ // ctx!.node — полная NodeData (с $path, $type, $acl и т.д.)
369
+ // ctx!.execute(action, data) — вызов экшена
370
+ };
371
+ ```
372
+
373
+ ### Почему это важно
374
+
375
+ - **Композиция:** любой тип рендерит чужих детей, не зная их вьюх
376
+ - **Переопределение:** зарегистрируй новый `react:list` для типа → все списки обновятся
377
+ - **AI visibility:** реестр интроспектируемый, AI находит доступные вьюхи
@@ -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
+ }