@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.
- package/dist/chain.d.ts +20 -0
- package/dist/chain.d.ts.map +1 -0
- package/dist/chain.js +59 -0
- package/dist/chain.js.map +1 -0
- package/dist/client/handle.d.ts +13 -0
- package/dist/client/handle.d.ts.map +1 -0
- package/dist/client/handle.js +46 -0
- package/dist/client/handle.js.map +1 -0
- package/dist/client/index.d.ts +21 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +5 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/trpc.d.ts +13 -0
- package/dist/client/trpc.d.ts.map +1 -0
- package/dist/client/trpc.js +78 -0
- package/dist/client/trpc.js.map +1 -0
- package/dist/client.d.ts +2 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +2 -0
- package/dist/client.js.map +1 -0
- package/dist/comp/handle.d.ts +14 -0
- package/dist/comp/handle.d.ts.map +1 -0
- package/dist/comp/handle.js +21 -0
- package/dist/comp/handle.js.map +1 -0
- package/dist/comp/index.d.ts +42 -0
- package/dist/comp/index.d.ts.map +1 -0
- package/dist/comp/index.js +126 -0
- package/dist/comp/index.js.map +1 -0
- package/dist/comp/needs.d.ts +26 -0
- package/dist/comp/needs.d.ts.map +1 -0
- package/dist/comp/needs.js +101 -0
- package/dist/comp/needs.js.map +1 -0
- package/dist/comp/validate.d.ts +13 -0
- package/dist/comp/validate.d.ts.map +1 -0
- package/dist/comp/validate.js +117 -0
- package/dist/comp/validate.js.map +1 -0
- package/dist/comp.d.ts +2 -0
- package/dist/comp.d.ts.map +1 -0
- package/dist/comp.js +2 -0
- package/dist/comp.js.map +1 -0
- package/dist/contexts/schema/index.d.ts +7 -0
- package/dist/contexts/schema/index.d.ts.map +1 -0
- package/dist/contexts/schema/index.js +2 -0
- package/dist/contexts/schema/index.js.map +1 -0
- package/dist/contexts/schema.d.ts +2 -0
- package/dist/contexts/schema.d.ts.map +1 -0
- package/dist/contexts/schema.js +2 -0
- package/dist/contexts/schema.js.map +1 -0
- package/dist/contexts/service/index.d.ts +31 -0
- package/dist/contexts/service/index.d.ts.map +1 -0
- package/dist/contexts/service/index.js +16 -0
- package/dist/contexts/service/index.js.map +1 -0
- package/dist/contexts/service.d.ts +1 -14
- package/dist/contexts/service.d.ts.map +1 -1
- package/dist/contexts/service.js +2 -0
- package/dist/contexts/service.js.map +1 -0
- package/dist/contexts/telegram/index.d.ts +19 -0
- package/dist/contexts/telegram/index.d.ts.map +1 -0
- package/dist/contexts/telegram/index.js +89 -0
- package/dist/contexts/telegram/index.js.map +1 -0
- package/dist/contexts/text/index.d.ts +7 -0
- package/dist/contexts/text/index.d.ts.map +1 -0
- package/dist/contexts/text/index.js +9 -0
- package/dist/contexts/text/index.js.map +1 -0
- package/dist/contexts/text.d.ts +2 -0
- package/dist/contexts/text.d.ts.map +1 -0
- package/dist/contexts/text.js +2 -0
- package/dist/contexts/text.js.map +1 -0
- package/dist/core/component.d.ts +41 -0
- package/dist/core/component.d.ts.map +1 -0
- package/dist/core/component.js +105 -0
- package/dist/core/component.js.map +1 -0
- package/dist/core/context.d.ts +5 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +3 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +8 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/path.d.ts +7 -0
- package/dist/core/path.d.ts.map +1 -0
- package/dist/core/path.js +37 -0
- package/dist/core/path.js.map +1 -0
- package/dist/core/registry.d.ts +16 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +100 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core.d.ts +2 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +2 -0
- package/dist/core.js.map +1 -0
- package/dist/log.d.ts +8 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +31 -0
- package/dist/log.js.map +1 -0
- package/dist/mod/discover.d.ts +4 -0
- package/dist/mod/discover.d.ts.map +1 -0
- package/dist/mod/discover.js +103 -0
- package/dist/mod/discover.js.map +1 -0
- package/dist/mod/examples/ticker/seed.d.ts +3 -0
- package/dist/mod/examples/ticker/seed.d.ts.map +1 -0
- package/dist/mod/examples/ticker/seed.js +16 -0
- package/dist/mod/examples/ticker/seed.js.map +1 -0
- package/dist/mod/examples/ticker/service.d.ts +2 -0
- package/dist/mod/examples/ticker/service.d.ts.map +1 -0
- package/dist/mod/examples/ticker/service.js +18 -0
- package/dist/mod/examples/ticker/service.js.map +1 -0
- package/dist/mod/examples/ticker/types.d.ts +16 -0
- package/dist/mod/examples/ticker/types.d.ts.map +1 -0
- package/dist/mod/examples/ticker/types.js +20 -0
- package/dist/mod/examples/ticker/types.js.map +1 -0
- package/dist/mod/examples/ticker/view.d.ts +2 -0
- package/dist/mod/examples/ticker/view.d.ts.map +1 -0
- package/dist/mod/examples/ticker/view.js +10 -0
- package/dist/mod/examples/ticker/view.js.map +1 -0
- package/dist/mod/index.d.ts +11 -0
- package/dist/mod/index.d.ts.map +1 -0
- package/dist/mod/index.js +8 -0
- package/dist/mod/index.js.map +1 -0
- package/dist/mod/loader.d.ts +18 -0
- package/dist/mod/loader.d.ts.map +1 -0
- package/dist/mod/loader.js +154 -0
- package/dist/mod/loader.js.map +1 -0
- package/dist/mod/optimistic.d.ts +34 -0
- package/dist/mod/optimistic.d.ts.map +1 -0
- package/dist/mod/optimistic.js +176 -0
- package/dist/mod/optimistic.js.map +1 -0
- package/dist/mod/prefab.d.ts +18 -0
- package/dist/mod/prefab.d.ts.map +1 -0
- package/dist/mod/prefab.js +42 -0
- package/dist/mod/prefab.js.map +1 -0
- package/dist/mod/tracking.d.ts +8 -0
- package/dist/mod/tracking.d.ts.map +1 -0
- package/dist/mod/tracking.js +44 -0
- package/dist/mod/tracking.js.map +1 -0
- package/dist/mod/types.d.ts +31 -0
- package/dist/mod/types.d.ts.map +1 -0
- package/dist/mod/types.js +5 -0
- package/dist/mod/types.js.map +1 -0
- package/dist/mod.d.ts +2 -0
- package/dist/mod.d.ts.map +1 -0
- package/dist/mod.js +2 -0
- package/dist/mod.js.map +1 -0
- package/dist/mods/autostart/server.d.ts +2 -0
- package/dist/mods/autostart/server.d.ts.map +1 -0
- package/dist/mods/autostart/server.js +2 -0
- package/dist/mods/autostart/server.js.map +1 -0
- package/dist/mods/autostart/service.d.ts +14 -0
- package/dist/mods/autostart/service.d.ts.map +1 -0
- package/dist/mods/autostart/service.js +88 -0
- package/dist/mods/autostart/service.js.map +1 -0
- package/dist/mods/llm/index.d.ts +13 -0
- package/dist/mods/llm/index.d.ts.map +1 -0
- package/dist/mods/llm/index.js +43 -0
- package/dist/mods/llm/index.js.map +1 -0
- package/dist/mods/llm/server.d.ts +2 -0
- package/dist/mods/llm/server.d.ts.map +1 -0
- package/dist/mods/llm/server.js +2 -0
- package/dist/mods/llm/server.js.map +1 -0
- package/dist/mods/mcp/server.d.ts +3 -0
- package/dist/mods/mcp/server.d.ts.map +1 -0
- package/dist/mods/mcp/server.js +3 -0
- package/dist/mods/mcp/server.js.map +1 -0
- package/dist/mods/mcp/service.d.ts +2 -0
- package/dist/mods/mcp/service.d.ts.map +1 -0
- package/dist/mods/mcp/service.js +17 -0
- package/dist/mods/mcp/service.js.map +1 -0
- package/dist/mods/mcp/types.d.ts +5 -0
- package/dist/mods/mcp/types.d.ts.map +1 -0
- package/dist/mods/mcp/types.js +7 -0
- package/dist/mods/mcp/types.js.map +1 -0
- package/dist/mods/treenity/agent-port.d.ts +2 -0
- package/dist/mods/treenity/agent-port.d.ts.map +1 -0
- package/dist/mods/treenity/agent-port.js +76 -0
- package/dist/mods/treenity/agent-port.js.map +1 -0
- package/dist/mods/treenity/groups.d.ts +2 -0
- package/dist/mods/treenity/groups.d.ts.map +1 -0
- package/dist/mods/treenity/groups.js +18 -0
- package/dist/mods/treenity/groups.js.map +1 -0
- package/dist/mods/treenity/mod-type.d.ts +2 -0
- package/dist/mods/treenity/mod-type.d.ts.map +1 -0
- package/dist/mods/treenity/mod-type.js +9 -0
- package/dist/mods/treenity/mod-type.js.map +1 -0
- package/dist/mods/treenity/seed.d.ts +2 -0
- package/dist/mods/treenity/seed.d.ts.map +1 -0
- package/dist/mods/treenity/seed.js +53 -0
- package/dist/mods/treenity/seed.js.map +1 -0
- package/dist/mods/treenity/server.d.ts +5 -0
- package/dist/mods/treenity/server.d.ts.map +1 -0
- package/dist/mods/treenity/server.js +5 -0
- package/dist/mods/treenity/server.js.map +1 -0
- package/dist/mods/treenity/system.d.ts +36 -0
- package/dist/mods/treenity/system.d.ts.map +1 -0
- package/dist/mods/treenity/system.js +61 -0
- package/dist/mods/treenity/system.js.map +1 -0
- package/dist/mods/uix/client.d.ts +3 -0
- package/dist/mods/uix/client.d.ts.map +1 -0
- package/dist/mods/uix/client.js +96 -0
- package/dist/mods/uix/client.js.map +1 -0
- package/dist/mods/uix/compile.d.ts +7 -0
- package/dist/mods/uix/compile.d.ts.map +1 -0
- package/dist/mods/uix/compile.js +94 -0
- package/dist/mods/uix/compile.js.map +1 -0
- package/dist/mods/uix/jsx-parser.d.ts +2 -0
- package/dist/mods/uix/jsx-parser.d.ts.map +1 -0
- package/dist/mods/uix/jsx-parser.js +565 -0
- package/dist/mods/uix/jsx-parser.js.map +1 -0
- package/dist/mods/uix/verify.d.ts +7 -0
- package/dist/mods/uix/verify.d.ts.map +1 -0
- package/dist/mods/uix/verify.js +59 -0
- package/dist/mods/uix/verify.js.map +1 -0
- package/dist/schema/catalog.d.ts +23 -0
- package/dist/schema/catalog.d.ts.map +1 -0
- package/dist/schema/catalog.js +82 -0
- package/dist/schema/catalog.js.map +1 -0
- package/dist/schema/extract-schemas.d.ts +5 -0
- package/dist/schema/extract-schemas.d.ts.map +1 -0
- package/dist/schema/extract-schemas.js +444 -0
- package/dist/schema/extract-schemas.js.map +1 -0
- package/dist/schema/load.d.ts +2 -0
- package/dist/schema/load.d.ts.map +1 -0
- package/dist/schema/load.js +23 -0
- package/dist/schema/load.js.map +1 -0
- package/dist/schema/test-fixture.types.d.ts +2 -0
- package/dist/schema/test-fixture.types.d.ts.map +1 -0
- package/dist/schema/test-fixture.types.js +19 -0
- package/dist/schema/test-fixture.types.js.map +1 -0
- package/dist/schema/test-opaque.d.ts +3 -0
- package/dist/schema/test-opaque.d.ts.map +1 -0
- package/dist/schema/test-opaque.js +43 -0
- package/dist/schema/test-opaque.js.map +1 -0
- package/dist/schema/types.d.ts +37 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +3 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/server/actions.d.ts +35 -0
- package/dist/server/actions.d.ts.map +1 -0
- package/dist/server/actions.js +170 -0
- package/dist/server/actions.js.map +1 -0
- package/dist/server/agent.d.ts +6 -0
- package/dist/server/agent.d.ts.map +1 -0
- package/dist/server/agent.js +15 -0
- package/dist/server/agent.js.map +1 -0
- package/dist/server/auth.d.ts +39 -0
- package/dist/server/auth.d.ts.map +1 -0
- package/dist/server/auth.js +335 -0
- package/dist/server/auth.js.map +1 -0
- package/dist/server/client.d.ts +183 -0
- package/dist/server/client.d.ts.map +1 -0
- package/dist/server/client.js +22 -0
- package/dist/server/client.js.map +1 -0
- package/dist/server/cookies.d.ts +5 -0
- package/dist/server/cookies.d.ts.map +1 -0
- package/dist/server/cookies.js +24 -0
- package/dist/server/cookies.js.map +1 -0
- package/dist/server/doc-index.d.ts +38 -0
- package/dist/server/doc-index.d.ts.map +1 -0
- package/dist/server/doc-index.js +244 -0
- package/dist/server/doc-index.js.map +1 -0
- package/dist/server/errors.d.ts +7 -0
- package/dist/server/errors.d.ts.map +1 -0
- package/dist/server/errors.js +11 -0
- package/dist/server/errors.js.map +1 -0
- package/dist/server/factory.d.ts +23 -0
- package/dist/server/factory.d.ts.map +1 -0
- package/dist/server/factory.js +70 -0
- package/dist/server/factory.js.map +1 -0
- package/dist/server/main.d.ts +6 -0
- package/dist/server/main.d.ts.map +1 -0
- package/dist/server/main.js +45 -0
- package/dist/server/main.js.map +1 -0
- package/dist/server/mcp.d.ts +5 -0
- package/dist/server/mcp.d.ts.map +1 -0
- package/dist/server/mcp.js +280 -0
- package/dist/server/mcp.js.map +1 -0
- package/dist/server/migrate.d.ts +3 -0
- package/dist/server/migrate.d.ts.map +1 -0
- package/dist/server/migrate.js +56 -0
- package/dist/server/migrate.js.map +1 -0
- package/dist/server/mod-catalog.d.ts +14 -0
- package/dist/server/mod-catalog.d.ts.map +1 -0
- package/dist/server/mod-catalog.js +40 -0
- package/dist/server/mod-catalog.js.map +1 -0
- package/dist/server/mods-mount.d.ts +4 -0
- package/dist/server/mods-mount.d.ts.map +1 -0
- package/dist/server/mods-mount.js +169 -0
- package/dist/server/mods-mount.js.map +1 -0
- package/dist/server/mount-adapters.d.ts +9 -0
- package/dist/server/mount-adapters.d.ts.map +1 -0
- package/dist/server/mount-adapters.js +75 -0
- package/dist/server/mount-adapters.js.map +1 -0
- package/dist/server/mount.d.ts +3 -0
- package/dist/server/mount.d.ts.map +1 -0
- package/dist/server/mount.js +195 -0
- package/dist/server/mount.js.map +1 -0
- package/dist/server/prefab.d.ts +18 -0
- package/dist/server/prefab.d.ts.map +1 -0
- package/dist/server/prefab.js +70 -0
- package/dist/server/prefab.js.map +1 -0
- package/dist/server/seed/index.d.ts +6 -0
- package/dist/server/seed/index.d.ts.map +1 -0
- package/dist/server/seed/index.js +16 -0
- package/dist/server/seed/index.js.map +1 -0
- package/dist/server/server.d.ts +28 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +117 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/sub.d.ts +34 -0
- package/dist/server/sub.d.ts.map +1 -0
- package/dist/server/sub.js +174 -0
- package/dist/server/sub.js.map +1 -0
- package/dist/server/trpc.d.ts +192 -0
- package/dist/server/trpc.d.ts.map +1 -0
- package/dist/server/trpc.js +319 -0
- package/dist/server/trpc.js.map +1 -0
- package/dist/server/types-mount.d.ts +3 -0
- package/dist/server/types-mount.d.ts.map +1 -0
- package/dist/server/types-mount.js +144 -0
- package/dist/server/types-mount.js.map +1 -0
- package/dist/server/validate.d.ts +3 -0
- package/dist/server/validate.d.ts.map +1 -0
- package/dist/server/validate.js +20 -0
- package/dist/server/validate.js.map +1 -0
- package/dist/server/volatile.d.ts +11 -0
- package/dist/server/volatile.d.ts.map +1 -0
- package/dist/server/volatile.js +26 -0
- package/dist/server/volatile.js.map +1 -0
- package/dist/server/watch.d.ts +23 -0
- package/dist/server/watch.d.ts.map +1 -0
- package/dist/server/watch.js +178 -0
- package/dist/server/watch.js.map +1 -0
- package/dist/tree/cache.d.ts +3 -0
- package/dist/tree/cache.d.ts.map +1 -0
- package/dist/tree/cache.js +48 -0
- package/dist/tree/cache.js.map +1 -0
- package/dist/tree/fs.d.ts +3 -0
- package/dist/tree/fs.d.ts.map +1 -0
- package/dist/tree/fs.js +274 -0
- package/dist/tree/fs.js.map +1 -0
- package/dist/tree/index.d.ts +38 -0
- package/dist/tree/index.d.ts.map +1 -0
- package/dist/tree/index.js +182 -0
- package/dist/tree/index.js.map +1 -0
- package/dist/tree/inflight.d.ts +2 -0
- package/dist/tree/inflight.d.ts.map +1 -0
- package/dist/tree/inflight.js +15 -0
- package/dist/tree/inflight.js.map +1 -0
- package/dist/tree/json-codec.d.ts +2 -0
- package/dist/tree/json-codec.d.ts.map +1 -0
- package/dist/tree/json-codec.js +13 -0
- package/dist/tree/json-codec.js.map +1 -0
- package/dist/tree/mimefs.d.ts +13 -0
- package/dist/tree/mimefs.d.ts.map +1 -0
- package/dist/tree/mimefs.js +124 -0
- package/dist/tree/mimefs.js.map +1 -0
- package/dist/tree/mongo.d.ts +5 -0
- package/dist/tree/mongo.d.ts.map +1 -0
- package/dist/tree/mongo.js +110 -0
- package/dist/tree/mongo.js.map +1 -0
- package/dist/tree/patch.d.ts +30 -0
- package/dist/tree/patch.d.ts.map +1 -0
- package/dist/tree/patch.js +112 -0
- package/dist/tree/patch.js.map +1 -0
- package/dist/tree/query.d.ts +12 -0
- package/dist/tree/query.d.ts.map +1 -0
- package/dist/tree/query.js +61 -0
- package/dist/tree/query.js.map +1 -0
- package/dist/tree/repath.d.ts +3 -0
- package/dist/tree/repath.d.ts.map +1 -0
- package/dist/tree/repath.js +38 -0
- package/dist/tree/repath.js.map +1 -0
- package/dist/tree-chain.d.ts +18 -0
- package/dist/tree-chain.d.ts.map +1 -0
- package/dist/tree-chain.js +109 -0
- package/dist/tree-chain.js.map +1 -0
- package/dist/tree.d.ts +2 -0
- package/dist/tree.d.ts.map +1 -0
- package/dist/tree.js +2 -0
- package/dist/tree.js.map +1 -0
- package/dist/uri.d.ts +11 -0
- package/dist/uri.d.ts.map +1 -0
- package/dist/uri.js +79 -0
- package/dist/uri.js.map +1 -0
- package/package.json +39 -40
- package/src/chain.test.ts +190 -0
- package/src/chain.ts +82 -0
- package/src/client/client.test.ts +192 -0
- package/src/client/handle.ts +53 -0
- package/src/client/index.ts +18 -0
- package/src/client/trpc.ts +91 -0
- package/src/client.ts +1 -0
- package/src/comp/CLAUDE.md +14 -0
- package/src/comp/handle.ts +36 -0
- package/src/comp/index.test.ts +129 -0
- package/src/comp/index.ts +175 -0
- package/src/comp/needs.test.ts +499 -0
- package/src/comp/needs.ts +113 -0
- package/src/comp/validate.test.ts +304 -0
- package/src/comp/validate.ts +125 -0
- package/src/comp.ts +1 -0
- package/src/contexts/schema/index.ts +7 -0
- package/src/contexts/schema.ts +1 -0
- package/src/contexts/service/index.test.ts +323 -0
- package/src/contexts/service/index.ts +43 -0
- package/src/contexts/service.ts +1 -0
- package/src/contexts/telegram/index.ts +115 -0
- package/src/contexts/text/index.test.ts +31 -0
- package/src/contexts/text/index.ts +18 -0
- package/src/contexts/text.ts +1 -0
- package/src/core/component.ts +151 -0
- package/src/core/context.ts +14 -0
- package/src/core/index.test.ts +203 -0
- package/src/core/index.ts +9 -0
- package/src/core/path.ts +35 -0
- package/src/core/registry.ts +115 -0
- package/src/core.ts +1 -0
- package/src/log.test.ts +70 -0
- package/src/log.ts +28 -0
- package/src/mod/discover.test.ts +133 -0
- package/src/mod/discover.ts +100 -0
- package/src/mod/docs/00-index.md +19 -0
- package/src/mod/docs/01-primitives.md +38 -0
- package/src/mod/docs/02-core-api.md +68 -0
- package/src/mod/docs/03-registry.md +30 -0
- package/src/mod/docs/04-store.md +62 -0
- package/src/mod/docs/05-comp.md +111 -0
- package/src/mod/docs/06-actions.md +193 -0
- package/src/mod/docs/07-realtime.md +100 -0
- package/src/mod/docs/08-services.md +33 -0
- package/src/mod/docs/09-mounts.md +43 -0
- package/src/mod/docs/10-acl.md +60 -0
- package/src/mod/docs/11-server.md +62 -0
- package/src/mod/docs/12-conventions.md +65 -0
- package/src/mod/docs/13-example.md +132 -0
- package/src/mod/docs/14-mod-format.md +304 -0
- package/src/mod/docs/15-documenting-types.md +156 -0
- package/src/mod/examples/ticker/seed.ts +19 -0
- package/src/mod/examples/ticker/service.ts +20 -0
- package/src/mod/examples/ticker/ticker.test.ts +18 -0
- package/src/mod/examples/ticker/types.ts +22 -0
- package/src/mod/examples/ticker/view.tsx +19 -0
- package/src/mod/index.ts +12 -0
- package/src/mod/loader.test.ts +168 -0
- package/src/mod/loader.ts +174 -0
- package/src/mod/optimistic.test.ts +446 -0
- package/src/mod/optimistic.ts +210 -0
- package/src/mod/prefab.ts +62 -0
- package/src/mod/tracking.test.ts +59 -0
- package/src/mod/tracking.ts +51 -0
- package/src/mod/types.ts +40 -0
- package/src/mod.ts +1 -0
- package/src/mods/autostart/CLAUDE.md +6 -0
- package/src/mods/autostart/autostart.test.ts +85 -0
- package/src/mods/autostart/server.ts +1 -0
- package/src/mods/autostart/service.ts +98 -0
- package/src/mods/llm/CLAUDE.md +6 -0
- package/src/mods/llm/index.ts +57 -0
- package/src/mods/llm/llm.test.ts +109 -0
- package/src/mods/llm/server.ts +1 -0
- package/src/mods/mcp/CLAUDE.md +6 -0
- package/src/mods/mcp/server.ts +2 -0
- package/src/mods/mcp/service.ts +19 -0
- package/src/mods/mcp/types.ts +7 -0
- package/src/mods/treenity/agent-port.ts +93 -0
- package/src/mods/treenity/groups.ts +19 -0
- package/src/mods/treenity/mod-type.ts +10 -0
- package/src/mods/treenity/seed.ts +56 -0
- package/src/mods/treenity/server.ts +4 -0
- package/src/mods/treenity/system.ts +70 -0
- package/src/mods/uix/CLAUDE.md +7 -0
- package/src/mods/uix/client.ts +117 -0
- package/src/mods/uix/compile.test.ts +228 -0
- package/src/mods/uix/compile.ts +110 -0
- package/src/mods/uix/jsx-parser.test.ts +554 -0
- package/src/mods/uix/jsx-parser.ts +489 -0
- package/src/mods/uix/lazy-load.test.ts +261 -0
- package/src/mods/uix/uix-repomix.md +3509 -0
- package/src/mods/uix/verify.ts +68 -0
- package/src/schema/CLAUDE.md +13 -0
- package/src/schema/catalog.ts +101 -0
- package/src/schema/extract-schemas.test.ts +84 -0
- package/src/schema/extract-schemas.ts +462 -0
- package/src/schema/generated/autostart.json +44 -0
- package/src/schema/generated/board.column.json +25 -0
- package/src/schema/generated/board.task.json +147 -0
- package/src/schema/generated/brahman.action.back.json +12 -0
- package/src/schema/generated/brahman.action.broadcast.json +31 -0
- package/src/schema/generated/brahman.action.call.json +57 -0
- package/src/schema/generated/brahman.action.emittext.json +23 -0
- package/src/schema/generated/brahman.action.eval.json +23 -0
- package/src/schema/generated/brahman.action.file.json +28 -0
- package/src/schema/generated/brahman.action.forward.json +29 -0
- package/src/schema/generated/brahman.action.getvalue.json +28 -0
- package/src/schema/generated/brahman.action.ifelse.json +42 -0
- package/src/schema/generated/brahman.action.keywordselect.json +46 -0
- package/src/schema/generated/brahman.action.message.json +127 -0
- package/src/schema/generated/brahman.action.onerror.json +29 -0
- package/src/schema/generated/brahman.action.page.json +22 -0
- package/src/schema/generated/brahman.action.params.json +36 -0
- package/src/schema/generated/brahman.action.question.json +43 -0
- package/src/schema/generated/brahman.action.remove.json +12 -0
- package/src/schema/generated/brahman.action.resethistory.json +12 -0
- package/src/schema/generated/brahman.action.resetsession.json +12 -0
- package/src/schema/generated/brahman.action.selectlang.json +20 -0
- package/src/schema/generated/brahman.action.setvalue.json +27 -0
- package/src/schema/generated/brahman.action.tag.json +27 -0
- package/src/schema/generated/brahman.bot.json +68 -0
- package/src/schema/generated/brahman.page.json +25 -0
- package/src/schema/generated/brahman.session.json +29 -0
- package/src/schema/generated/brahman.user.json +58 -0
- package/src/schema/generated/cafe.contact.json +56 -0
- package/src/schema/generated/cafe.mail.json +29 -0
- package/src/schema/generated/default.json +15 -0
- package/src/schema/generated/doc.page.json +23 -0
- package/src/schema/generated/examples.demo.generator.json +16 -0
- package/src/schema/generated/examples.demo.sensor.json +35 -0
- package/src/schema/generated/groups.json +20 -0
- package/src/schema/generated/launcher.json +91 -0
- package/src/schema/generated/mcp.server.json +15 -0
- package/src/schema/generated/mindmap.map.json +22 -0
- package/src/schema/generated/sim.agent.json +24 -0
- package/src/schema/generated/sim.ai.json +24 -0
- package/src/schema/generated/sim.config.json +38 -0
- package/src/schema/generated/sim.descriptive.json +26 -0
- package/src/schema/generated/sim.events.json +47 -0
- package/src/schema/generated/sim.item.json +20 -0
- package/src/schema/generated/sim.memory.json +17 -0
- package/src/schema/generated/sim.nearby.json +17 -0
- package/src/schema/generated/sim.position.json +25 -0
- package/src/schema/generated/sim.round.json +64 -0
- package/src/schema/generated/sim.world.json +32 -0
- package/src/schema/generated/t.agent.port.json +74 -0
- package/src/schema/generated/t.llm.json +20 -0
- package/src/schema/generated/t.mod.json +27 -0
- package/src/schema/generated/t3d.animator.json +46 -0
- package/src/schema/generated/t3d.audio.json +58 -0
- package/src/schema/generated/t3d.camera.json +50 -0
- package/src/schema/generated/t3d.collider.json +84 -0
- package/src/schema/generated/t3d.light.json +90 -0
- package/src/schema/generated/t3d.line.json +47 -0
- package/src/schema/generated/t3d.lod.json +28 -0
- package/src/schema/generated/t3d.material.json +131 -0
- package/src/schema/generated/t3d.mesh.json +65 -0
- package/src/schema/generated/t3d.object.json +64 -0
- package/src/schema/generated/t3d.particles.json +109 -0
- package/src/schema/generated/t3d.rigidbody.json +81 -0
- package/src/schema/generated/t3d.scene.json +7 -0
- package/src/schema/generated/t3d.script.json +23 -0
- package/src/schema/generated/t3d.text.json +86 -0
- package/src/schema/generated/t3d.trail.json +45 -0
- package/src/schema/generated/task.json +96 -0
- package/src/schema/generated/test.fixture.json +43 -0
- package/src/schema/generated/ticker.config.json +43 -0
- package/src/schema/generated/ticker.price.json +20 -0
- package/src/schema/generated/todo.item.json +25 -0
- package/src/schema/generated/todo.list.json +33 -0
- package/src/schema/generated/treenity.system.json +259 -0
- package/src/schema/generated/whisper.audio.json +25 -0
- package/src/schema/generated/whisper.checklist.json +17 -0
- package/src/schema/generated/whisper.config.json +30 -0
- package/src/schema/generated/whisper.inbox.json +24 -0
- package/src/schema/generated/whisper.meta.json +35 -0
- package/src/schema/generated/whisper.text.json +16 -0
- package/src/schema/load.ts +24 -0
- package/src/schema/schema.test.ts +86 -0
- package/src/schema/test-fixture.types.ts +21 -0
- package/src/schema/test-opaque.ts +42 -0
- package/src/schema/types.ts +33 -0
- package/src/server/CLAUDE.md +26 -0
- package/src/server/actions.test.ts +272 -0
- package/src/server/actions.ts +274 -0
- package/src/server/agent-sub.test.ts +90 -0
- package/src/server/agent.test.ts +305 -0
- package/src/server/agent.ts +17 -0
- package/src/server/api.test.ts +454 -0
- package/src/server/auth.test.ts +441 -0
- package/src/server/auth.ts +386 -0
- package/src/server/client.ts +24 -0
- package/src/server/conditions.test.ts +128 -0
- package/src/server/cookies.ts +25 -0
- package/src/server/coverage.test.ts +827 -0
- package/src/server/doc-index.ts +286 -0
- package/src/server/e2e.test.ts +966 -0
- package/src/server/errors.ts +11 -0
- package/src/server/factory.ts +99 -0
- package/src/server/main.ts +56 -0
- package/src/server/mcp.ts +326 -0
- package/src/server/migrate.test.ts +123 -0
- package/src/server/migrate.ts +62 -0
- package/src/server/mod-catalog.ts +59 -0
- package/src/server/mods-mount.ts +179 -0
- package/src/server/mount-adapters.ts +82 -0
- package/src/server/mount.parametrized.test.ts +52 -0
- package/src/server/mount.query.test.ts +127 -0
- package/src/server/mount.test.ts +497 -0
- package/src/server/mount.ts +208 -0
- package/src/server/prefab.test.ts +415 -0
- package/src/server/prefab.ts +104 -0
- package/src/server/seed/index.ts +24 -0
- package/src/server/server.ts +153 -0
- package/src/server/stress.test.ts +844 -0
- package/src/server/sub.test.ts +55 -0
- package/src/server/sub.ts +224 -0
- package/src/server/trpc.ts +369 -0
- package/src/server/types-mount.ts +142 -0
- package/src/server/validate.test.ts +91 -0
- package/src/server/validate.ts +22 -0
- package/src/server/volatile.test.ts +140 -0
- package/src/server/volatile.ts +32 -0
- package/src/server/watch.test.ts +594 -0
- package/src/server/watch.ts +202 -0
- package/src/server/workflow.test.ts +82 -0
- package/src/tree/CLAUDE.md +13 -0
- package/src/tree/cache.test.ts +213 -0
- package/src/tree/cache.ts +51 -0
- package/src/tree/fs.test.ts +247 -0
- package/src/tree/fs.ts +251 -0
- package/src/tree/index.test.ts +164 -0
- package/src/tree/index.ts +216 -0
- package/src/tree/inflight.ts +15 -0
- package/src/tree/json-codec.ts +16 -0
- package/src/tree/mimefs.test.ts +289 -0
- package/src/tree/mimefs.ts +142 -0
- package/src/tree/mongo.ts +125 -0
- package/src/tree/patch.test.ts +192 -0
- package/src/tree/patch.ts +133 -0
- package/src/tree/query.test.ts +110 -0
- package/src/tree/query.ts +70 -0
- package/src/tree/repath.test.ts +86 -0
- package/src/tree/repath.ts +53 -0
- package/src/tree-chain.test.ts +723 -0
- package/src/tree-chain.ts +144 -0
- package/src/tree.ts +1 -0
- package/src/uri.test.ts +86 -0
- package/src/uri.ts +82 -0
- package/CHANGELOG.md +0 -314
- package/README.md +0 -18
- package/dist/context.d.ts +0 -41
- package/dist/context.d.ts.map +0 -1
- package/dist/context.mjs +0 -81
- package/dist/context.mjs.map +0 -1
- package/dist/contexts/node-engine.d.ts +0 -12
- package/dist/contexts/node-engine.d.ts.map +0 -1
- package/dist/contexts/node-engine.mjs +0 -7
- package/dist/contexts/node-engine.mjs.map +0 -1
- package/dist/contexts/noflo/types.d.ts +0 -20
- package/dist/contexts/noflo/types.d.ts.map +0 -1
- package/dist/contexts/object.d.ts +0 -11
- package/dist/contexts/object.d.ts.map +0 -1
- package/dist/contexts/object.mjs +0 -15
- package/dist/contexts/object.mjs.map +0 -1
- package/dist/contexts/proto.d.ts +0 -11
- package/dist/contexts/proto.d.ts.map +0 -1
- package/dist/contexts/proto.mjs +0 -7
- package/dist/contexts/proto.mjs.map +0 -1
- package/dist/contexts/react-context.d.ts +0 -21
- package/dist/contexts/react-context.d.ts.map +0 -1
- package/dist/contexts/react-context.mjs +0 -24
- package/dist/contexts/react-context.mjs.map +0 -1
- package/dist/contexts/service.mjs +0 -7
- package/dist/contexts/service.mjs.map +0 -1
- package/dist/get-type-cache.d.ts +0 -2
- package/dist/get-type-cache.d.ts.map +0 -1
- package/dist/get-type-cache.mjs +0 -7
- package/dist/get-type-cache.mjs.map +0 -1
- package/dist/index.d.ts +0 -13
- package/dist/index.d.ts.map +0 -1
- package/dist/index.mjs +0 -10
- package/dist/index.mjs.map +0 -1
- package/dist/link/link.d.ts +0 -25
- package/dist/link/link.d.ts.map +0 -1
- package/dist/link/link.mjs +0 -72
- package/dist/link/link.mjs.map +0 -1
- package/dist/link/link.test.d.ts +0 -2
- package/dist/link/link.test.d.ts.map +0 -1
- package/dist/loading.d.ts +0 -9
- package/dist/loading.d.ts.map +0 -1
- package/dist/meta-type.d.ts +0 -58
- package/dist/meta-type.d.ts.map +0 -1
- package/dist/meta-type.mjs +0 -104
- package/dist/meta-type.mjs.map +0 -1
- package/dist/meta.d.ts +0 -20
- package/dist/meta.d.ts.map +0 -1
- package/dist/meta.mjs +0 -16
- package/dist/meta.mjs.map +0 -1
- package/dist/node/index.d.ts +0 -2
- package/dist/node/index.d.ts.map +0 -1
- package/dist/node/types.d.ts +0 -37
- package/dist/node/types.d.ts.map +0 -1
- package/dist/test/context.test.d.ts +0 -2
- package/dist/test/context.test.d.ts.map +0 -1
- package/dist/types.d.ts +0 -14
- package/dist/types.d.ts.map +0 -1
- package/dist/types.mjs +0 -16
- package/dist/types.mjs.map +0 -1
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# 07 — Подписки и React
|
|
2
|
+
|
|
3
|
+
## Серверная сторона
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
import { withSubscriptions, type ReactivStore, type NodeEvent } from '#server/sub';
|
|
7
|
+
|
|
8
|
+
type NodeEvent =
|
|
9
|
+
| { type: 'set'; path: string; node: NodeData; patches?: Patch[] }
|
|
10
|
+
| { type: 'patch'; path: string; patches: Patch[] }
|
|
11
|
+
| { type: 'remove'; path: string };
|
|
12
|
+
|
|
13
|
+
const reactive: ReactivStore = withSubscriptions(store);
|
|
14
|
+
|
|
15
|
+
const unsub = reactive.subscribe('/tasks', (event: NodeEvent) => {
|
|
16
|
+
// срабатывает на /tasks, /tasks/1, /tasks/1/sub, ...
|
|
17
|
+
});
|
|
18
|
+
unsub();
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
В сервисе store уже реактивный. `store.set()` / `store.remove()` автоматически нотифицируют подписчиков.
|
|
22
|
+
|
|
23
|
+
## CDC Matrix (Query Mounts)
|
|
24
|
+
|
|
25
|
+
При store.set() подписки автоматически проверяют все активные query mount-ы. Если нода вошла/вышла из фильтра — генерируются `addVps` / `rmVps` в событии. Клиентский кэш автоматически добавляет/убирает ноду из виртуальных папок.
|
|
26
|
+
|
|
27
|
+
## React хуки
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
import { useNode, useChildren, useComponent, useAction, useNodeCount } from '#front/hooks';
|
|
31
|
+
|
|
32
|
+
const [node, setNode] = useNode('/tasks/1');
|
|
33
|
+
await setNode({ ...node, title: 'Updated' }); // optimistic → server → refetch
|
|
34
|
+
|
|
35
|
+
const children = useChildren('/tasks', {
|
|
36
|
+
watch: true, // подписаться на изменения существующих
|
|
37
|
+
watchNew: true, // подписаться на появление новых
|
|
38
|
+
limit: 50,
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
const [comp, setComp] = useComponent('/tasks/1', 'status');
|
|
42
|
+
await setComp({ $type: 'status', value: 'done' });
|
|
43
|
+
|
|
44
|
+
const results = useAction('/dashboard', 'stats');
|
|
45
|
+
const count = useNodeCount();
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Рендер через контекст
|
|
49
|
+
|
|
50
|
+
```tsx
|
|
51
|
+
import { Render, RenderContext, NodeProvider, useCurrentNode, useTreeContext } from '#contexts/react';
|
|
52
|
+
|
|
53
|
+
<Render value={component} onChange={handler} />
|
|
54
|
+
|
|
55
|
+
<RenderContext name="react:compact">
|
|
56
|
+
<Render value={component} /> {/* ищет react:compact → react → default */}
|
|
57
|
+
</RenderContext>
|
|
58
|
+
|
|
59
|
+
function MyRenderer({ value, onChange }) {
|
|
60
|
+
const node = useCurrentNode();
|
|
61
|
+
const context = useTreeContext();
|
|
62
|
+
return <div>{value.title}</div>;
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## react:list — самодостаточные list-item компоненты
|
|
67
|
+
|
|
68
|
+
```tsx
|
|
69
|
+
function DefaultListItem({ value }: { value: NodeData }) {
|
|
70
|
+
return (
|
|
71
|
+
<div className="child-card" onClick={() => navigate(value.$path)}>
|
|
72
|
+
<span className="child-icon">{typeIcon(value.$type)}</span>
|
|
73
|
+
<div className="child-info">
|
|
74
|
+
<span className="child-name">{pathName(value.$path)}</span>
|
|
75
|
+
<span className="child-type">{value.$type}</span>
|
|
76
|
+
</div>
|
|
77
|
+
<span className="child-chevron">›</span>
|
|
78
|
+
</div>
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
register('default', 'react:list', DefaultListItem as any);
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Fallback: `react:list` → `default@react:list` → strip `:list` → `react`.
|
|
85
|
+
|
|
86
|
+
## Нода КАК компонент — flat fields
|
|
87
|
+
|
|
88
|
+
Когда `node.$type` совпадает с `$type` компонента, нода **сама является** компонентом. Поля лежат плоско:
|
|
89
|
+
|
|
90
|
+
```ts
|
|
91
|
+
// Правильно
|
|
92
|
+
await store.set({ $path: '/bot', $type: 'brahman.bot', token: '...', alias: '@bot' } as NodeData);
|
|
93
|
+
|
|
94
|
+
// Неправильно
|
|
95
|
+
await store.set({ $path: '/bot', $type: 'brahman.bot', config: { $type: 'brahman.bot', token: '...' } });
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Views — read-only
|
|
99
|
+
|
|
100
|
+
View (`react` контекст) — только отображение. Редактирование — через NodeEditor (edit panel + schema forms).
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# 08 — Сервисы
|
|
2
|
+
|
|
3
|
+
Фоновые процессы: боты, сенсоры, воркеры. `register(type, "service", handler)` → возвращает `{ stop() }`.
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
import { register, type NodeData } from '#core';
|
|
7
|
+
import { type ServiceHandle, type ServiceCtx } from '#contexts/service';
|
|
8
|
+
|
|
9
|
+
register('my-worker', 'service', async (node: NodeData, ctx: ServiceCtx) => {
|
|
10
|
+
const timer = setInterval(async () => {
|
|
11
|
+
await ctx.store.set({
|
|
12
|
+
$path: `${node.$path}/${Date.now()}`,
|
|
13
|
+
$type: 'tick',
|
|
14
|
+
ts: Date.now(),
|
|
15
|
+
} as NodeData);
|
|
16
|
+
}, 5000);
|
|
17
|
+
|
|
18
|
+
return {
|
|
19
|
+
stop: async () => clearInterval(timer),
|
|
20
|
+
} satisfies ServiceHandle;
|
|
21
|
+
});
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Автозапуск
|
|
25
|
+
|
|
26
|
+
Создай ref-ноду в `/sys/autostart`:
|
|
27
|
+
|
|
28
|
+
```ts
|
|
29
|
+
await store.set({ $path: '/my-worker', $type: 'my-worker' } as NodeData);
|
|
30
|
+
await store.set({ $path: '/sys/autostart/my-worker', $type: 'ref', $ref: '/my-worker' } as NodeData);
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
При старте сервера `startServices(store)` обходит `/sys/autostart`, резолвит refs, вызывает service-хэндлеры.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# 09 — Mount-адаптеры
|
|
2
|
+
|
|
3
|
+
Маршрутизация поддеревьев к другим бэкендам. Всё под `/mount-point/*` обслуживается подключённым Store.
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
register('my-adapter', 'mount', async (config, parentStore, ctx, globalStore) => {
|
|
7
|
+
return createMongoStore(config.uri, config.db, config.col);
|
|
8
|
+
});
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Нода с маунтом:
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
await store.set(createNode('/external', 'my-adapter', {
|
|
15
|
+
connection: { $type: 'connection', uri: '...', db: 'x', col: 'y' },
|
|
16
|
+
mount: { $type: 'my-adapter' },
|
|
17
|
+
}));
|
|
18
|
+
// Всё под /external/* теперь идёт в Mongo-коллекцию
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Встроенные маунты
|
|
22
|
+
|
|
23
|
+
| Тип | Назначение |
|
|
24
|
+
|-----|-----------|
|
|
25
|
+
| `t.mount.mongo` | MongoDB-коллекция |
|
|
26
|
+
| `t.mount.fs` | Файловая система |
|
|
27
|
+
| `t.mount.memory` | In-memory (volatile) |
|
|
28
|
+
| `t.mount.overlay` | Overlay двух store |
|
|
29
|
+
| `t.mount.query` | Виртуальная папка с sift-фильтром |
|
|
30
|
+
| `t.mount.types` | Интроспекция registry |
|
|
31
|
+
|
|
32
|
+
## Query Mounts — виртуальные папки
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
await store.set(createNode('/orders/incoming', 't.mount.query', {
|
|
36
|
+
mount: {
|
|
37
|
+
$type: 't.mount.query',
|
|
38
|
+
source: '/orders/data',
|
|
39
|
+
match: { status: { value: 'incoming' } },
|
|
40
|
+
},
|
|
41
|
+
}));
|
|
42
|
+
// GET /orders/incoming → только ноды из /orders/data с status.value === 'incoming'
|
|
43
|
+
```
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# 10 — ACL, валидация, volatile
|
|
2
|
+
|
|
3
|
+
## ACL
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
import { R, W, A, S, type GroupPerm } from '#core';
|
|
7
|
+
|
|
8
|
+
// R=1 Read, W=2 Write, A=4 Admin, S=8 Subscribe
|
|
9
|
+
// p > 0: allow bits
|
|
10
|
+
// p = 0: deny all (sticky)
|
|
11
|
+
// p < 0: deny specific bits (sticky)
|
|
12
|
+
|
|
13
|
+
node.$acl = [
|
|
14
|
+
{ g: 'admin', p: R | W | A | S }, // всё
|
|
15
|
+
{ g: 'authenticated', p: R | S }, // чтение + подписка
|
|
16
|
+
{ g: 'public', p: R }, // только чтение
|
|
17
|
+
{ g: 'banned', p: 0 }, // блок (sticky)
|
|
18
|
+
];
|
|
19
|
+
node.$owner = 'user123';
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Уровни: node-level (`$acl`, `$owner`) + component-level (`register(type, "acl", handler)`).
|
|
23
|
+
|
|
24
|
+
ACL на тип по умолчанию:
|
|
25
|
+
|
|
26
|
+
```ts
|
|
27
|
+
register('secret', 'acl', () => [{ g: 'admin', p: R | W | A | S }]);
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Валидация
|
|
31
|
+
|
|
32
|
+
`withValidation(store)` — write-barrier: проверяет компоненты против JSON Schema перед store.set().
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
import { withValidation } from '#server/validate';
|
|
36
|
+
|
|
37
|
+
const validated = withValidation(store);
|
|
38
|
+
// validated.set() бросит ошибку, если компонент не проходит schema
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Volatile Nodes
|
|
42
|
+
|
|
43
|
+
Ноды с `$volatile: true` хранятся только в памяти, не персистятся на диск/Mongo.
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
import { withVolatile } from '#server/volatile';
|
|
47
|
+
|
|
48
|
+
const store = withVolatile(backingStore);
|
|
49
|
+
await store.set({ $path: '/temp', $type: 'session', $volatile: true } as NodeData);
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Server Pipeline
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
bootstrap store (fs/mongo)
|
|
56
|
+
→ mountable (mount system)
|
|
57
|
+
→ volatile (memory-only nodes)
|
|
58
|
+
→ validated (JSON Schema check)
|
|
59
|
+
→ subscriptions (events + CDC)
|
|
60
|
+
```
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# 11 — Server: tRPC, MCP, Seed
|
|
2
|
+
|
|
3
|
+
## Seed
|
|
4
|
+
|
|
5
|
+
`seed(store)` — идемпотентно создаёт системные ноды:
|
|
6
|
+
- `/sys`, `/sys/autostart`
|
|
7
|
+
- `/auth`, `/auth/users`, `/auth/sessions`
|
|
8
|
+
- `/mnt/orders`, `/entities`, `/orders`
|
|
9
|
+
|
|
10
|
+
## MCP Server
|
|
11
|
+
|
|
12
|
+
Инструменты (без ACL):
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
get_node(path) // → NodeData | undefined
|
|
16
|
+
list_children(path, depth?) // → Page<NodeData>
|
|
17
|
+
set_node(path, type, components?) // read-merge-write → NodeData
|
|
18
|
+
remove_node(path) // → boolean
|
|
19
|
+
execute(path, action, component?, data?) // → result
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## tRPC Router — все endpoints
|
|
23
|
+
|
|
24
|
+
### Чтение
|
|
25
|
+
```ts
|
|
26
|
+
get({ path, watch? }) // → NodeData | undefined
|
|
27
|
+
getChildren({ path, limit?, offset?, watch?, watchNew? }) // → Page<NodeData>
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Запись
|
|
31
|
+
```ts
|
|
32
|
+
set({ node }) // → void
|
|
33
|
+
setComponent({ path, name, data, rev? }) // → void
|
|
34
|
+
remove({ path }) // → boolean
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Экшены
|
|
38
|
+
```ts
|
|
39
|
+
execute({ path, type?, key?, action, data? }) // → result
|
|
40
|
+
streamAction({ path, type?, key?, action, data? }) // → AsyncIterable (subscription)
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Шаблоны
|
|
44
|
+
```ts
|
|
45
|
+
getTemplates() // → NodeData[]
|
|
46
|
+
applyTemplate({ templatePath, targetPath }) // → { applied, blocks }
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Аутентификация
|
|
50
|
+
```ts
|
|
51
|
+
register({ userId, password }) // → { token, userId }
|
|
52
|
+
login({ userId, password }) // → { token, userId }
|
|
53
|
+
anonLogin() // → { token, userId }
|
|
54
|
+
me() // → { userId } | null
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Watch
|
|
58
|
+
```ts
|
|
59
|
+
unwatch({ paths }) // отписаться от exact-path
|
|
60
|
+
unwatchChildren({ paths }) // отписаться от prefix-watch
|
|
61
|
+
events // SSE поток NodeEvent
|
|
62
|
+
```
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# 12 — Naming, стили, правила
|
|
2
|
+
|
|
3
|
+
## Naming Convention
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
string → core built-in: dir, ref, root, user, type, mount-point, autostart
|
|
7
|
+
t.* → treenity infrastructure: t.mount.fs, t.mount.mongo, t.llm
|
|
8
|
+
{vendor}.* → package types: acme.block.hero, acme.bot, order.status
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Разделитель: только `.` (не `/`, не `@`, не `:`).
|
|
12
|
+
Паттерн: `{namespace}.{category}.{name}`.
|
|
13
|
+
|
|
14
|
+
## Стили
|
|
15
|
+
|
|
16
|
+
Используй **Tailwind CSS** классы, не inline styles. Tailwind 4 + `@tailwindcss/vite` подключены.
|
|
17
|
+
|
|
18
|
+
```tsx
|
|
19
|
+
// Правильно
|
|
20
|
+
<div className="flex gap-2 text-sm px-2 py-1 bg-muted rounded">
|
|
21
|
+
|
|
22
|
+
// Неправильно
|
|
23
|
+
<div style={{ display: 'flex', gap: 8, fontSize: 13 }}>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Для составных компонентов используй shadcn/ui (`@/components/ui/*`): `Badge`, `Button`, `Input`, `Card` и др.
|
|
27
|
+
|
|
28
|
+
## Контексты — сводная таблица
|
|
29
|
+
|
|
30
|
+
| Контекст | Тип handler | Назначение |
|
|
31
|
+
| --------------- | -------------------------------- | --------------------------- |
|
|
32
|
+
| `schema` | `() => JSONSchema` | JSON Schema для UI-форм |
|
|
33
|
+
| `react` | `FC<{ value, onChange? }>` | React-компонент |
|
|
34
|
+
| `react:compact` | | fallback к `react` |
|
|
35
|
+
| `text` | `(data) => string` | Текстовый рендер |
|
|
36
|
+
| `action:*` | `(ctx: ActionCtx, data) => any` | Серверный экшен |
|
|
37
|
+
| `service` | `(node, ctx) => ServiceHandle` | Фоновый сервис |
|
|
38
|
+
| `mount` | `(config, parent, ctx, global) => Store` | Mount-адаптер |
|
|
39
|
+
| `acl` | `() => GroupPerm[]` | ACL по умолчанию для типа |
|
|
40
|
+
| `class` | `Class<T>` | Registered component class |
|
|
41
|
+
| `telegram` | `(node, tgCtx) => void` | Telegram-хэндлер |
|
|
42
|
+
|
|
43
|
+
## Ошибки
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
import { OpError } from '#server/errors';
|
|
47
|
+
|
|
48
|
+
// Коды: 'NOT_FOUND' | 'BAD_REQUEST' | 'CONFLICT' | 'FORBIDDEN'
|
|
49
|
+
throw new OpError('NOT_FOUND', 'Node not found: /path');
|
|
50
|
+
throw new OpError('CONFLICT', 'Stale revision');
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
`OpError` → автоматически маппится на tRPC error (NOT_FOUND → 404, CONFLICT → 409 и т.д.).
|
|
54
|
+
|
|
55
|
+
## Архитектурные правила
|
|
56
|
+
|
|
57
|
+
1. **Core < 500 строк.** Всё остальное — в контекстах и модах
|
|
58
|
+
2. **Zero dependencies в core.** Только TypeScript
|
|
59
|
+
3. **Layer model:** нижний слой не знает о верхнем
|
|
60
|
+
4. **Sealed registry:** нет переопределений, только расширение
|
|
61
|
+
5. **Компонент знает только свои данные.** Соседи — через `needs`
|
|
62
|
+
6. **Refs только на ноды** (`$ref: "/path"`), никогда глубокие пути
|
|
63
|
+
7. **Дети — по path prefix query**, не хранятся в родителе
|
|
64
|
+
8. **`$` prefix — системные поля.** В Mongo `$` ↔ `_` автоматически
|
|
65
|
+
9. **Fallback контекстов:** exact → default@same-ctx → strip suffix → recurse → null
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# 13 — Полный пример: мод от начала до конца
|
|
2
|
+
|
|
3
|
+
## 1. types.ts — определение компонентов
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
// src/mods/sensor/types.ts
|
|
7
|
+
import { getCtx, registerComp } from '#comp';
|
|
8
|
+
import { join, type NodeData } from '#core';
|
|
9
|
+
|
|
10
|
+
export class SensorConfig {
|
|
11
|
+
/** @title Интервал @description Секунды между замерами */
|
|
12
|
+
interval = 5;
|
|
13
|
+
/** @title Источник */
|
|
14
|
+
source = '';
|
|
15
|
+
|
|
16
|
+
updateInterval(data: { interval: number }) {
|
|
17
|
+
this.interval = data.interval;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
async history() {
|
|
21
|
+
const { node, store } = getCtx();
|
|
22
|
+
const { items } = await store.getChildren(node.$path, { limit: 100 });
|
|
23
|
+
return { items: items.map(n => ({ value: (n as any).value, ts: (n as any).ts })) };
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
registerComp('sensor.config', SensorConfig);
|
|
28
|
+
|
|
29
|
+
export class SensorReading {
|
|
30
|
+
value = 0;
|
|
31
|
+
ts = 0;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
registerComp('sensor.reading', SensorReading);
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## 2. service.ts — фоновый процесс
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
// src/mods/sensor/service.ts
|
|
41
|
+
import { register, type NodeData } from '#core';
|
|
42
|
+
import { getComp } from '#comp';
|
|
43
|
+
import { type ServiceHandle, type ServiceCtx } from '#contexts/service';
|
|
44
|
+
import { SensorConfig } from './types';
|
|
45
|
+
|
|
46
|
+
register('sensor', 'service', async (node: NodeData, ctx: ServiceCtx) => {
|
|
47
|
+
const config = getComp(node, SensorConfig);
|
|
48
|
+
const interval = (config?.interval ?? 5) * 1000;
|
|
49
|
+
|
|
50
|
+
const timer = setInterval(async () => {
|
|
51
|
+
await ctx.store.set({
|
|
52
|
+
$path: `${node.$path}/${Date.now()}`,
|
|
53
|
+
$type: 'sensor.reading',
|
|
54
|
+
value: Math.random() * 100,
|
|
55
|
+
ts: Date.now(),
|
|
56
|
+
} as NodeData);
|
|
57
|
+
}, interval);
|
|
58
|
+
|
|
59
|
+
return { stop: async () => clearInterval(timer) } satisfies ServiceHandle;
|
|
60
|
+
});
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## 3. view.tsx — React-рендер
|
|
64
|
+
|
|
65
|
+
```tsx
|
|
66
|
+
// src/mods/sensor/view.tsx
|
|
67
|
+
import { register, type ComponentData } from '#core';
|
|
68
|
+
import { useCurrentNode } from '#contexts/react';
|
|
69
|
+
import { useChildren } from '#front/hooks';
|
|
70
|
+
|
|
71
|
+
register('sensor.config', 'react', ({ value, onChange }) => {
|
|
72
|
+
return (
|
|
73
|
+
<div>
|
|
74
|
+
<label>Interval: {(value as any).interval}s</label>
|
|
75
|
+
<label>Source: {(value as any).source}</label>
|
|
76
|
+
</div>
|
|
77
|
+
);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
register('sensor', 'react', ({ value }) => {
|
|
81
|
+
const node = useCurrentNode();
|
|
82
|
+
const readings = useChildren(node.$path, { limit: 10, watchNew: true });
|
|
83
|
+
|
|
84
|
+
return (
|
|
85
|
+
<div>
|
|
86
|
+
<h3>Sensor: {node.$path}</h3>
|
|
87
|
+
{readings.map(r => (
|
|
88
|
+
<div key={r.$path}>
|
|
89
|
+
{(r as any).value?.toFixed(1)} @ {new Date((r as any).ts).toLocaleTimeString()}
|
|
90
|
+
</div>
|
|
91
|
+
))}
|
|
92
|
+
</div>
|
|
93
|
+
);
|
|
94
|
+
});
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## 4. schemas.ts — JSON Schema
|
|
98
|
+
|
|
99
|
+
```ts
|
|
100
|
+
// src/mods/sensor/schemas.ts
|
|
101
|
+
import { register } from '#core';
|
|
102
|
+
|
|
103
|
+
register('sensor.config', 'schema', () => ({
|
|
104
|
+
title: 'Sensor Config',
|
|
105
|
+
properties: {
|
|
106
|
+
interval: { type: 'number', title: 'Interval (sec)', minimum: 1 },
|
|
107
|
+
source: { type: 'string', title: 'Source URL' },
|
|
108
|
+
},
|
|
109
|
+
}));
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## 5. Регистрация
|
|
113
|
+
|
|
114
|
+
```ts
|
|
115
|
+
// src/mods/index.ts — добавить:
|
|
116
|
+
import './sensor/types';
|
|
117
|
+
import './sensor/service';
|
|
118
|
+
|
|
119
|
+
// src/mods/views.ts — добавить:
|
|
120
|
+
import './sensor/view';
|
|
121
|
+
import './sensor/schemas';
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## 6. Seed-данные
|
|
125
|
+
|
|
126
|
+
```ts
|
|
127
|
+
await store.set({ $path: '/sensors/temp', $type: 'sensor',
|
|
128
|
+
config: { $type: 'sensor.config', interval: 10, source: 'internal' },
|
|
129
|
+
} as NodeData);
|
|
130
|
+
|
|
131
|
+
await store.set({ $path: '/sys/autostart/temp-sensor', $type: 'ref', $ref: '/sensors/temp' } as NodeData);
|
|
132
|
+
```
|