@aigne/aos 0.2.0-beta
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/CHANGELOG.md +49 -0
- package/LICENSE.md +26 -0
- package/dist/agent-dsl.cjs +116 -0
- package/dist/agent-dsl.d.cts +31 -0
- package/dist/agent-dsl.d.cts.map +1 -0
- package/dist/agent-dsl.d.mts +31 -0
- package/dist/agent-dsl.d.mts.map +1 -0
- package/dist/agent-dsl.mjs +115 -0
- package/dist/agent-dsl.mjs.map +1 -0
- package/dist/arc-compat.cjs +125 -0
- package/dist/arc-compat.d.cts +17 -0
- package/dist/arc-compat.d.cts.map +1 -0
- package/dist/arc-compat.d.mts +17 -0
- package/dist/arc-compat.d.mts.map +1 -0
- package/dist/arc-compat.mjs +123 -0
- package/dist/arc-compat.mjs.map +1 -0
- package/dist/auto-surface/compiler.cjs +36 -0
- package/dist/auto-surface/compiler.d.cts +7 -0
- package/dist/auto-surface/compiler.d.cts.map +1 -0
- package/dist/auto-surface/compiler.d.mts +7 -0
- package/dist/auto-surface/compiler.d.mts.map +1 -0
- package/dist/auto-surface/compiler.mjs +37 -0
- package/dist/auto-surface/compiler.mjs.map +1 -0
- package/dist/auto-surface/definition-dsl.cjs +333 -0
- package/dist/auto-surface/definition-dsl.d.cts +41 -0
- package/dist/auto-surface/definition-dsl.d.cts.map +1 -0
- package/dist/auto-surface/definition-dsl.d.mts +41 -0
- package/dist/auto-surface/definition-dsl.d.mts.map +1 -0
- package/dist/auto-surface/definition-dsl.mjs +332 -0
- package/dist/auto-surface/definition-dsl.mjs.map +1 -0
- package/dist/auto-surface/fragments.cjs +177 -0
- package/dist/auto-surface/fragments.d.cts +23 -0
- package/dist/auto-surface/fragments.d.cts.map +1 -0
- package/dist/auto-surface/fragments.d.mts +23 -0
- package/dist/auto-surface/fragments.d.mts.map +1 -0
- package/dist/auto-surface/fragments.mjs +175 -0
- package/dist/auto-surface/fragments.mjs.map +1 -0
- package/dist/auto-surface/index.d.mts +9 -0
- package/dist/auto-surface/layering.cjs +43 -0
- package/dist/auto-surface/layering.d.cts +7 -0
- package/dist/auto-surface/layering.d.cts.map +1 -0
- package/dist/auto-surface/layering.d.mts +7 -0
- package/dist/auto-surface/layering.d.mts.map +1 -0
- package/dist/auto-surface/layering.mjs +43 -0
- package/dist/auto-surface/layering.mjs.map +1 -0
- package/dist/auto-surface/projection.cjs +11 -0
- package/dist/auto-surface/projection.d.cts +11 -0
- package/dist/auto-surface/projection.d.cts.map +1 -0
- package/dist/auto-surface/projection.d.mts +11 -0
- package/dist/auto-surface/projection.d.mts.map +1 -0
- package/dist/auto-surface/projection.mjs +12 -0
- package/dist/auto-surface/projection.mjs.map +1 -0
- package/dist/auto-surface/projectors/settings-shell.cjs +114 -0
- package/dist/auto-surface/projectors/settings-shell.d.cts +10 -0
- package/dist/auto-surface/projectors/settings-shell.d.cts.map +1 -0
- package/dist/auto-surface/projectors/settings-shell.d.mts +10 -0
- package/dist/auto-surface/projectors/settings-shell.d.mts.map +1 -0
- package/dist/auto-surface/projectors/settings-shell.mjs +114 -0
- package/dist/auto-surface/projectors/settings-shell.mjs.map +1 -0
- package/dist/auto-surface/scenario.cjs +38 -0
- package/dist/auto-surface/scenario.d.cts +31 -0
- package/dist/auto-surface/scenario.d.cts.map +1 -0
- package/dist/auto-surface/scenario.d.mts +31 -0
- package/dist/auto-surface/scenario.d.mts.map +1 -0
- package/dist/auto-surface/scenario.mjs +37 -0
- package/dist/auto-surface/scenario.mjs.map +1 -0
- package/dist/auto-surface/types.cjs +9 -0
- package/dist/auto-surface/types.d.cts +153 -0
- package/dist/auto-surface/types.d.cts.map +1 -0
- package/dist/auto-surface/types.d.mts +153 -0
- package/dist/auto-surface/types.d.mts.map +1 -0
- package/dist/auto-surface/types.mjs +9 -0
- package/dist/auto-surface/types.mjs.map +1 -0
- package/dist/auto-surface/value-dsl.cjs +80 -0
- package/dist/auto-surface/value-dsl.d.cts +24 -0
- package/dist/auto-surface/value-dsl.d.cts.map +1 -0
- package/dist/auto-surface/value-dsl.d.mts +24 -0
- package/dist/auto-surface/value-dsl.d.mts.map +1 -0
- package/dist/auto-surface/value-dsl.mjs +79 -0
- package/dist/auto-surface/value-dsl.mjs.map +1 -0
- package/dist/blocklet/activation.cjs +94 -0
- package/dist/blocklet/activation.d.cts +30 -0
- package/dist/blocklet/activation.d.cts.map +1 -0
- package/dist/blocklet/activation.d.mts +30 -0
- package/dist/blocklet/activation.d.mts.map +1 -0
- package/dist/blocklet/activation.mjs +94 -0
- package/dist/blocklet/activation.mjs.map +1 -0
- package/dist/blocklet/did-space-registry.cjs +282 -0
- package/dist/blocklet/did-space-registry.d.cts +82 -0
- package/dist/blocklet/did-space-registry.d.cts.map +1 -0
- package/dist/blocklet/did-space-registry.d.mts +82 -0
- package/dist/blocklet/did-space-registry.d.mts.map +1 -0
- package/dist/blocklet/did-space-registry.mjs +281 -0
- package/dist/blocklet/did-space-registry.mjs.map +1 -0
- package/dist/blocklet/handlers.cjs +66 -0
- package/dist/blocklet/handlers.d.cts +16 -0
- package/dist/blocklet/handlers.d.cts.map +1 -0
- package/dist/blocklet/handlers.d.mts +16 -0
- package/dist/blocklet/handlers.d.mts.map +1 -0
- package/dist/blocklet/handlers.mjs +65 -0
- package/dist/blocklet/handlers.mjs.map +1 -0
- package/dist/blocklet/index.d.mts +7 -0
- package/dist/blocklet/manifest.d.cts +2 -0
- package/dist/blocklet/manifest.d.mts +2 -0
- package/dist/blocklet/manifest.mjs +3 -0
- package/dist/blocklet/registry.cjs +447 -0
- package/dist/blocklet/registry.d.cts +197 -0
- package/dist/blocklet/registry.d.cts.map +1 -0
- package/dist/blocklet/registry.d.mts +197 -0
- package/dist/blocklet/registry.d.mts.map +1 -0
- package/dist/blocklet/registry.mjs +441 -0
- package/dist/blocklet/registry.mjs.map +1 -0
- package/dist/blocklet/static-render.cjs +183 -0
- package/dist/blocklet/static-render.d.cts +55 -0
- package/dist/blocklet/static-render.d.cts.map +1 -0
- package/dist/blocklet/static-render.d.mts +55 -0
- package/dist/blocklet/static-render.d.mts.map +1 -0
- package/dist/blocklet/static-render.mjs +181 -0
- package/dist/blocklet/static-render.mjs.map +1 -0
- package/dist/blocklet/types.d.cts +70 -0
- package/dist/blocklet/types.d.cts.map +1 -0
- package/dist/blocklet/types.d.mts +70 -0
- package/dist/blocklet/types.d.mts.map +1 -0
- package/dist/devices/chain.cjs +127 -0
- package/dist/devices/chain.d.cts +48 -0
- package/dist/devices/chain.d.cts.map +1 -0
- package/dist/devices/chain.d.mts +48 -0
- package/dist/devices/chain.d.mts.map +1 -0
- package/dist/devices/chain.mjs +125 -0
- package/dist/devices/chain.mjs.map +1 -0
- package/dist/dsl-shared.cjs +290 -0
- package/dist/dsl-shared.d.cts +54 -0
- package/dist/dsl-shared.d.cts.map +1 -0
- package/dist/dsl-shared.d.mts +54 -0
- package/dist/dsl-shared.d.mts.map +1 -0
- package/dist/dsl-shared.mjs +287 -0
- package/dist/dsl-shared.mjs.map +1 -0
- package/dist/http/afs-mcp.cjs +85 -0
- package/dist/http/afs-mcp.d.cts +14 -0
- package/dist/http/afs-mcp.d.cts.map +1 -0
- package/dist/http/afs-mcp.d.mts +14 -0
- package/dist/http/afs-mcp.d.mts.map +1 -0
- package/dist/http/afs-mcp.mjs +86 -0
- package/dist/http/afs-mcp.mjs.map +1 -0
- package/dist/http/afs-raw.cjs +264 -0
- package/dist/http/afs-raw.d.cts +31 -0
- package/dist/http/afs-raw.d.cts.map +1 -0
- package/dist/http/afs-raw.d.mts +31 -0
- package/dist/http/afs-raw.d.mts.map +1 -0
- package/dist/http/afs-raw.mjs +264 -0
- package/dist/http/afs-raw.mjs.map +1 -0
- package/dist/http/afs-rest.cjs +30 -0
- package/dist/http/afs-rest.d.cts +21 -0
- package/dist/http/afs-rest.d.cts.map +1 -0
- package/dist/http/afs-rest.d.mts +21 -0
- package/dist/http/afs-rest.d.mts.map +1 -0
- package/dist/http/afs-rest.mjs +31 -0
- package/dist/http/afs-rest.mjs.map +1 -0
- package/dist/http/afs-rpc-wire.cjs +271 -0
- package/dist/http/afs-rpc-wire.d.cts +195 -0
- package/dist/http/afs-rpc-wire.d.cts.map +1 -0
- package/dist/http/afs-rpc-wire.d.mts +195 -0
- package/dist/http/afs-rpc-wire.d.mts.map +1 -0
- package/dist/http/afs-rpc-wire.mjs +262 -0
- package/dist/http/afs-rpc-wire.mjs.map +1 -0
- package/dist/http/afs-rpc.cjs +729 -0
- package/dist/http/afs-rpc.d.cts +103 -0
- package/dist/http/afs-rpc.d.cts.map +1 -0
- package/dist/http/afs-rpc.d.mts +103 -0
- package/dist/http/afs-rpc.d.mts.map +1 -0
- package/dist/http/afs-rpc.mjs +729 -0
- package/dist/http/afs-rpc.mjs.map +1 -0
- package/dist/http/afs-upload.cjs +116 -0
- package/dist/http/afs-upload.d.cts +40 -0
- package/dist/http/afs-upload.d.cts.map +1 -0
- package/dist/http/afs-upload.d.mts +40 -0
- package/dist/http/afs-upload.d.mts.map +1 -0
- package/dist/http/afs-upload.mjs +116 -0
- package/dist/http/afs-upload.mjs.map +1 -0
- package/dist/http/aup-client.cjs +60 -0
- package/dist/http/aup-client.d.cts +22 -0
- package/dist/http/aup-client.d.cts.map +1 -0
- package/dist/http/aup-client.d.mts +22 -0
- package/dist/http/aup-client.d.mts.map +1 -0
- package/dist/http/aup-client.mjs +59 -0
- package/dist/http/aup-client.mjs.map +1 -0
- package/dist/http/aup-event.cjs +100 -0
- package/dist/http/aup-event.d.cts +38 -0
- package/dist/http/aup-event.d.cts.map +1 -0
- package/dist/http/aup-event.d.mts +38 -0
- package/dist/http/aup-event.d.mts.map +1 -0
- package/dist/http/aup-event.mjs +101 -0
- package/dist/http/aup-event.mjs.map +1 -0
- package/dist/http/auth-context.cjs +66 -0
- package/dist/http/auth-context.d.cts +64 -0
- package/dist/http/auth-context.d.cts.map +1 -0
- package/dist/http/auth-context.d.mts +64 -0
- package/dist/http/auth-context.d.mts.map +1 -0
- package/dist/http/auth-context.mjs +66 -0
- package/dist/http/auth-context.mjs.map +1 -0
- package/dist/http/csrf.cjs +50 -0
- package/dist/http/csrf.d.cts +8 -0
- package/dist/http/csrf.d.cts.map +1 -0
- package/dist/http/csrf.d.mts +8 -0
- package/dist/http/csrf.d.mts.map +1 -0
- package/dist/http/csrf.mjs +49 -0
- package/dist/http/csrf.mjs.map +1 -0
- package/dist/http/handlers.cjs +106 -0
- package/dist/http/handlers.d.cts +39 -0
- package/dist/http/handlers.d.cts.map +1 -0
- package/dist/http/handlers.d.mts +39 -0
- package/dist/http/handlers.d.mts.map +1 -0
- package/dist/http/handlers.mjs +104 -0
- package/dist/http/handlers.mjs.map +1 -0
- package/dist/http/index.d.mts +1 -0
- package/dist/http/ingest-facade.cjs +315 -0
- package/dist/http/ingest-facade.mjs +314 -0
- package/dist/http/ingest-facade.mjs.map +1 -0
- package/dist/http/raw-url.cjs +136 -0
- package/dist/http/raw-url.d.cts +54 -0
- package/dist/http/raw-url.d.cts.map +1 -0
- package/dist/http/raw-url.d.mts +54 -0
- package/dist/http/raw-url.d.mts.map +1 -0
- package/dist/http/raw-url.mjs +136 -0
- package/dist/http/raw-url.mjs.map +1 -0
- package/dist/http/request-context.cjs +178 -0
- package/dist/http/request-context.d.cts +76 -0
- package/dist/http/request-context.d.cts.map +1 -0
- package/dist/http/request-context.d.mts +76 -0
- package/dist/http/request-context.d.mts.map +1 -0
- package/dist/http/request-context.mjs +179 -0
- package/dist/http/request-context.mjs.map +1 -0
- package/dist/index.cjs +197 -0
- package/dist/index.d.cts +63 -0
- package/dist/index.d.mts +68 -0
- package/dist/index.mjs +61 -0
- package/dist/mcp/index.cjs +9 -0
- package/dist/mcp/index.d.cts +5 -0
- package/dist/mcp/index.d.mts +5 -0
- package/dist/mcp/index.mjs +6 -0
- package/dist/mcp/prompts.cjs +17 -0
- package/dist/mcp/prompts.d.cts +8 -0
- package/dist/mcp/prompts.d.cts.map +1 -0
- package/dist/mcp/prompts.d.mts +8 -0
- package/dist/mcp/prompts.d.mts.map +1 -0
- package/dist/mcp/prompts.mjs +17 -0
- package/dist/mcp/prompts.mjs.map +1 -0
- package/dist/mcp/resources.cjs +22 -0
- package/dist/mcp/resources.d.cts +8 -0
- package/dist/mcp/resources.d.cts.map +1 -0
- package/dist/mcp/resources.d.mts +8 -0
- package/dist/mcp/resources.d.mts.map +1 -0
- package/dist/mcp/resources.mjs +22 -0
- package/dist/mcp/resources.mjs.map +1 -0
- package/dist/mcp/server.cjs +51 -0
- package/dist/mcp/server.d.cts +20 -0
- package/dist/mcp/server.d.cts.map +1 -0
- package/dist/mcp/server.d.mts +20 -0
- package/dist/mcp/server.d.mts.map +1 -0
- package/dist/mcp/server.mjs +52 -0
- package/dist/mcp/server.mjs.map +1 -0
- package/dist/mcp/tools.cjs +218 -0
- package/dist/mcp/tools.d.cts +8 -0
- package/dist/mcp/tools.d.cts.map +1 -0
- package/dist/mcp/tools.d.mts +8 -0
- package/dist/mcp/tools.d.mts.map +1 -0
- package/dist/mcp/tools.mjs +219 -0
- package/dist/mcp/tools.mjs.map +1 -0
- package/dist/mcp/utils.cjs +75 -0
- package/dist/mcp/utils.mjs +69 -0
- package/dist/mcp/utils.mjs.map +1 -0
- package/dist/mount/index.cjs +4 -0
- package/dist/mount/index.d.cts +3 -0
- package/dist/mount/index.d.mts +3 -0
- package/dist/mount/index.mjs +3 -0
- package/dist/mount/materializer.cjs +167 -0
- package/dist/mount/materializer.d.cts +97 -0
- package/dist/mount/materializer.d.cts.map +1 -0
- package/dist/mount/materializer.d.mts +97 -0
- package/dist/mount/materializer.d.mts.map +1 -0
- package/dist/mount/materializer.mjs +167 -0
- package/dist/mount/materializer.mjs.map +1 -0
- package/dist/mount/types.d.cts +90 -0
- package/dist/mount/types.d.cts.map +1 -0
- package/dist/mount/types.d.mts +90 -0
- package/dist/mount/types.d.mts.map +1 -0
- package/dist/mount-config.cjs +61 -0
- package/dist/mount-config.d.cts +19 -0
- package/dist/mount-config.d.cts.map +1 -0
- package/dist/mount-config.d.mts +19 -0
- package/dist/mount-config.d.mts.map +1 -0
- package/dist/mount-config.mjs +61 -0
- package/dist/mount-config.mjs.map +1 -0
- package/dist/projectors/aup-projector.cjs +190 -0
- package/dist/projectors/aup-projector.d.cts +59 -0
- package/dist/projectors/aup-projector.d.cts.map +1 -0
- package/dist/projectors/aup-projector.d.mts +59 -0
- package/dist/projectors/aup-projector.d.mts.map +1 -0
- package/dist/projectors/aup-projector.mjs +188 -0
- package/dist/projectors/aup-projector.mjs.map +1 -0
- package/dist/projectors/index.cjs +6 -0
- package/dist/projectors/index.d.cts +2 -0
- package/dist/projectors/index.d.mts +2 -0
- package/dist/projectors/index.mjs +3 -0
- package/dist/scaffold/afs.cjs +195 -0
- package/dist/scaffold/afs.d.cts +16 -0
- package/dist/scaffold/afs.d.cts.map +1 -0
- package/dist/scaffold/afs.d.mts +16 -0
- package/dist/scaffold/afs.d.mts.map +1 -0
- package/dist/scaffold/afs.mjs +195 -0
- package/dist/scaffold/afs.mjs.map +1 -0
- package/dist/scaffold/composition.cjs +92 -0
- package/dist/scaffold/composition.d.cts +10 -0
- package/dist/scaffold/composition.d.cts.map +1 -0
- package/dist/scaffold/composition.d.mts +10 -0
- package/dist/scaffold/composition.d.mts.map +1 -0
- package/dist/scaffold/composition.mjs +92 -0
- package/dist/scaffold/composition.mjs.map +1 -0
- package/dist/scaffold/dsl-error.cjs +21 -0
- package/dist/scaffold/dsl-error.d.cts +11 -0
- package/dist/scaffold/dsl-error.d.cts.map +1 -0
- package/dist/scaffold/dsl-error.d.mts +11 -0
- package/dist/scaffold/dsl-error.d.mts.map +1 -0
- package/dist/scaffold/dsl-error.mjs +20 -0
- package/dist/scaffold/dsl-error.mjs.map +1 -0
- package/dist/scaffold/index.d.mts +12 -0
- package/dist/scaffold/manifest-dsl.cjs +188 -0
- package/dist/scaffold/manifest-dsl.d.cts +8 -0
- package/dist/scaffold/manifest-dsl.d.cts.map +1 -0
- package/dist/scaffold/manifest-dsl.d.mts +8 -0
- package/dist/scaffold/manifest-dsl.d.mts.map +1 -0
- package/dist/scaffold/manifest-dsl.mjs +188 -0
- package/dist/scaffold/manifest-dsl.mjs.map +1 -0
- package/dist/scaffold/module-dsl.cjs +284 -0
- package/dist/scaffold/module-dsl.d.cts +8 -0
- package/dist/scaffold/module-dsl.d.cts.map +1 -0
- package/dist/scaffold/module-dsl.d.mts +8 -0
- package/dist/scaffold/module-dsl.d.mts.map +1 -0
- package/dist/scaffold/module-dsl.mjs +284 -0
- package/dist/scaffold/module-dsl.mjs.map +1 -0
- package/dist/scaffold/resolver.cjs +156 -0
- package/dist/scaffold/resolver.d.cts +7 -0
- package/dist/scaffold/resolver.d.cts.map +1 -0
- package/dist/scaffold/resolver.d.mts +7 -0
- package/dist/scaffold/resolver.d.mts.map +1 -0
- package/dist/scaffold/resolver.mjs +156 -0
- package/dist/scaffold/resolver.mjs.map +1 -0
- package/dist/scaffold/runtime.cjs +24 -0
- package/dist/scaffold/runtime.d.cts +19 -0
- package/dist/scaffold/runtime.d.cts.map +1 -0
- package/dist/scaffold/runtime.d.mts +19 -0
- package/dist/scaffold/runtime.d.mts.map +1 -0
- package/dist/scaffold/runtime.mjs +25 -0
- package/dist/scaffold/runtime.mjs.map +1 -0
- package/dist/scaffold/shell-dsl.cjs +279 -0
- package/dist/scaffold/shell-dsl.d.cts +8 -0
- package/dist/scaffold/shell-dsl.d.cts.map +1 -0
- package/dist/scaffold/shell-dsl.d.mts +8 -0
- package/dist/scaffold/shell-dsl.d.mts.map +1 -0
- package/dist/scaffold/shell-dsl.mjs +279 -0
- package/dist/scaffold/shell-dsl.mjs.map +1 -0
- package/dist/scaffold/surface-dsl.cjs +182 -0
- package/dist/scaffold/surface-dsl.d.cts +8 -0
- package/dist/scaffold/surface-dsl.d.cts.map +1 -0
- package/dist/scaffold/surface-dsl.d.mts +8 -0
- package/dist/scaffold/surface-dsl.d.mts.map +1 -0
- package/dist/scaffold/surface-dsl.mjs +182 -0
- package/dist/scaffold/surface-dsl.mjs.map +1 -0
- package/dist/scaffold/surfaces.cjs +84 -0
- package/dist/scaffold/surfaces.d.cts +23 -0
- package/dist/scaffold/surfaces.d.cts.map +1 -0
- package/dist/scaffold/surfaces.d.mts +24 -0
- package/dist/scaffold/surfaces.d.mts.map +1 -0
- package/dist/scaffold/surfaces.mjs +84 -0
- package/dist/scaffold/surfaces.mjs.map +1 -0
- package/dist/scaffold/types.d.cts +264 -0
- package/dist/scaffold/types.d.cts.map +1 -0
- package/dist/scaffold/types.d.mts +265 -0
- package/dist/scaffold/types.d.mts.map +1 -0
- package/dist/scaffold/workspace-dsl.cjs +339 -0
- package/dist/scaffold/workspace-dsl.d.cts +49 -0
- package/dist/scaffold/workspace-dsl.d.cts.map +1 -0
- package/dist/scaffold/workspace-dsl.d.mts +49 -0
- package/dist/scaffold/workspace-dsl.d.mts.map +1 -0
- package/dist/scaffold/workspace-dsl.mjs +337 -0
- package/dist/scaffold/workspace-dsl.mjs.map +1 -0
- package/dist/scope/index.d.mts +3 -0
- package/dist/scope/read-blocklet-scope.cjs +29 -0
- package/dist/scope/read-blocklet-scope.d.cts +8 -0
- package/dist/scope/read-blocklet-scope.d.cts.map +1 -0
- package/dist/scope/read-blocklet-scope.d.mts +8 -0
- package/dist/scope/read-blocklet-scope.d.mts.map +1 -0
- package/dist/scope/read-blocklet-scope.mjs +30 -0
- package/dist/scope/read-blocklet-scope.mjs.map +1 -0
- package/dist/scope/resolve-scoped-afs.cjs +87 -0
- package/dist/scope/resolve-scoped-afs.d.cts +7 -0
- package/dist/scope/resolve-scoped-afs.d.cts.map +1 -0
- package/dist/scope/resolve-scoped-afs.d.mts +7 -0
- package/dist/scope/resolve-scoped-afs.d.mts.map +1 -0
- package/dist/scope/resolve-scoped-afs.mjs +88 -0
- package/dist/scope/resolve-scoped-afs.mjs.map +1 -0
- package/dist/scope/types.d.cts +25 -0
- package/dist/scope/types.d.cts.map +1 -0
- package/dist/scope/types.d.mts +25 -0
- package/dist/scope/types.d.mts.map +1 -0
- package/dist/session/backends.cjs +90 -0
- package/dist/session/backends.d.cts +35 -0
- package/dist/session/backends.d.cts.map +1 -0
- package/dist/session/backends.d.mts +35 -0
- package/dist/session/backends.d.mts.map +1 -0
- package/dist/session/backends.mjs +89 -0
- package/dist/session/backends.mjs.map +1 -0
- package/dist/session/replication-resolver.cjs +323 -0
- package/dist/session/replication-resolver.d.cts +71 -0
- package/dist/session/replication-resolver.d.cts.map +1 -0
- package/dist/session/replication-resolver.d.mts +71 -0
- package/dist/session/replication-resolver.d.mts.map +1 -0
- package/dist/session/replication-resolver.mjs +323 -0
- package/dist/session/replication-resolver.mjs.map +1 -0
- package/dist/session/role-level.cjs +36 -0
- package/dist/session/role-level.d.cts +24 -0
- package/dist/session/role-level.d.cts.map +1 -0
- package/dist/session/role-level.d.mts +24 -0
- package/dist/session/role-level.d.mts.map +1 -0
- package/dist/session/role-level.mjs +35 -0
- package/dist/session/role-level.mjs.map +1 -0
- package/dist/session/session-dir-providers.cjs +254 -0
- package/dist/session/session-dir-providers.d.cts +32 -0
- package/dist/session/session-dir-providers.d.cts.map +1 -0
- package/dist/session/session-dir-providers.d.mts +32 -0
- package/dist/session/session-dir-providers.d.mts.map +1 -0
- package/dist/session/session-dir-providers.mjs +252 -0
- package/dist/session/session-dir-providers.mjs.map +1 -0
- package/dist/session/session-id.cjs +20 -0
- package/dist/session/session-id.d.cts +15 -0
- package/dist/session/session-id.d.cts.map +1 -0
- package/dist/session/session-id.d.mts +15 -0
- package/dist/session/session-id.d.mts.map +1 -0
- package/dist/session/session-id.mjs +20 -0
- package/dist/session/session-id.mjs.map +1 -0
- package/dist/session/session-user-afs.cjs +899 -0
- package/dist/session/session-user-afs.d.cts +296 -0
- package/dist/session/session-user-afs.d.cts.map +1 -0
- package/dist/session/session-user-afs.d.mts +296 -0
- package/dist/session/session-user-afs.d.mts.map +1 -0
- package/dist/session/session-user-afs.mjs +896 -0
- package/dist/session/session-user-afs.mjs.map +1 -0
- package/dist/session/settings-cascade.cjs +69 -0
- package/dist/session/settings-cascade.d.cts +81 -0
- package/dist/session/settings-cascade.d.cts.map +1 -0
- package/dist/session/settings-cascade.d.mts +81 -0
- package/dist/session/settings-cascade.d.mts.map +1 -0
- package/dist/session/settings-cascade.mjs +69 -0
- package/dist/session/settings-cascade.mjs.map +1 -0
- package/dist/session/settings-resolver.cjs +770 -0
- package/dist/session/settings-resolver.d.cts +177 -0
- package/dist/session/settings-resolver.d.cts.map +1 -0
- package/dist/session/settings-resolver.d.mts +177 -0
- package/dist/session/settings-resolver.d.mts.map +1 -0
- package/dist/session/settings-resolver.mjs +771 -0
- package/dist/session/settings-resolver.mjs.map +1 -0
- package/dist/session/settings-schema-store.cjs +0 -0
- package/dist/session/settings-schema-store.d.cts +72 -0
- package/dist/session/settings-schema-store.d.cts.map +1 -0
- package/dist/session/settings-schema-store.d.mts +72 -0
- package/dist/session/settings-schema-store.d.mts.map +1 -0
- package/dist/session/settings-schema-store.mjs +0 -0
- package/dist/session/settings-schema-store.mjs.map +1 -0
- package/dist/system-mounts/index.cjs +14 -0
- package/dist/system-mounts/index.d.cts +6 -0
- package/dist/system-mounts/index.d.mts +6 -0
- package/dist/system-mounts/index.mjs +6 -0
- package/dist/system-mounts/install.cjs +101 -0
- package/dist/system-mounts/install.d.cts +36 -0
- package/dist/system-mounts/install.d.cts.map +1 -0
- package/dist/system-mounts/install.d.mts +37 -0
- package/dist/system-mounts/install.d.mts.map +1 -0
- package/dist/system-mounts/install.mjs +102 -0
- package/dist/system-mounts/install.mjs.map +1 -0
- package/dist/system-mounts/installers.cjs +247 -0
- package/dist/system-mounts/installers.d.cts +13 -0
- package/dist/system-mounts/installers.d.cts.map +1 -0
- package/dist/system-mounts/installers.d.mts +14 -0
- package/dist/system-mounts/installers.d.mts.map +1 -0
- package/dist/system-mounts/installers.mjs +244 -0
- package/dist/system-mounts/installers.mjs.map +1 -0
- package/dist/system-mounts/lists.cjs +122 -0
- package/dist/system-mounts/lists.d.cts +34 -0
- package/dist/system-mounts/lists.d.cts.map +1 -0
- package/dist/system-mounts/lists.d.mts +34 -0
- package/dist/system-mounts/lists.d.mts.map +1 -0
- package/dist/system-mounts/lists.mjs +122 -0
- package/dist/system-mounts/lists.mjs.map +1 -0
- package/dist/system-mounts/types.d.cts +124 -0
- package/dist/system-mounts/types.d.cts.map +1 -0
- package/dist/system-mounts/types.d.mts +125 -0
- package/dist/system-mounts/types.d.mts.map +1 -0
- package/dist/system-mounts/validate.cjs +56 -0
- package/dist/system-mounts/validate.d.cts +34 -0
- package/dist/system-mounts/validate.d.cts.map +1 -0
- package/dist/system-mounts/validate.d.mts +34 -0
- package/dist/system-mounts/validate.d.mts.map +1 -0
- package/dist/system-mounts/validate.mjs +56 -0
- package/dist/system-mounts/validate.mjs.map +1 -0
- package/dist/terminal-llm.cjs +90 -0
- package/dist/terminal-llm.d.cts +50 -0
- package/dist/terminal-llm.d.cts.map +1 -0
- package/dist/terminal-llm.d.mts +50 -0
- package/dist/terminal-llm.d.mts.map +1 -0
- package/dist/terminal-llm.mjs +90 -0
- package/dist/terminal-llm.mjs.map +1 -0
- package/dist/terminal-repl.cjs +371 -0
- package/dist/terminal-repl.d.cts +69 -0
- package/dist/terminal-repl.d.cts.map +1 -0
- package/dist/terminal-repl.d.mts +69 -0
- package/dist/terminal-repl.d.mts.map +1 -0
- package/dist/terminal-repl.mjs +370 -0
- package/dist/terminal-repl.mjs.map +1 -0
- package/dist/transport/idle-timer.cjs +136 -0
- package/dist/transport/idle-timer.d.cts +92 -0
- package/dist/transport/idle-timer.d.cts.map +1 -0
- package/dist/transport/idle-timer.d.mts +92 -0
- package/dist/transport/idle-timer.d.mts.map +1 -0
- package/dist/transport/idle-timer.mjs +132 -0
- package/dist/transport/idle-timer.mjs.map +1 -0
- package/dist/web-component-dsl.cjs +153 -0
- package/dist/web-component-dsl.d.cts +27 -0
- package/dist/web-component-dsl.d.cts.map +1 -0
- package/dist/web-component-dsl.d.mts +27 -0
- package/dist/web-component-dsl.d.mts.map +1 -0
- package/dist/web-component-dsl.mjs +152 -0
- package/dist/web-component-dsl.mjs.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
const require_role_level = require('./role-level.cjs');
|
|
2
|
+
let _aigne_afs = require("@aigne/afs");
|
|
3
|
+
|
|
4
|
+
//#region src/session/replication-resolver.ts
|
|
5
|
+
/**
|
|
6
|
+
* Compute the overlay mount prefix for a set of replicated collections.
|
|
7
|
+
* Returns the LCP (longest common prefix) of the "pre-collection" segments
|
|
8
|
+
* (everything before the collection-name segment, which sits just before `*`)
|
|
9
|
+
* across all canonical patterns. This is the path at which a single
|
|
10
|
+
* ReplicationResolver overlay is mounted in SessionUserAFS.
|
|
11
|
+
*
|
|
12
|
+
* Examples:
|
|
13
|
+
* { notes: { canonical: "instance/notes/*" } }
|
|
14
|
+
* → "instance" (pre-collection = ["instance"])
|
|
15
|
+
* { posts: "instance/app/posts/*", comments: "instance/app/comments/*" }
|
|
16
|
+
* → "instance/app" (LCP of ["instance","app"] and ["instance","app"])
|
|
17
|
+
* { notes: "instance/notes/*", posts: "instance/app/posts/*" }
|
|
18
|
+
* → "instance" (LCP of ["instance"] and ["instance","app"])
|
|
19
|
+
*/
|
|
20
|
+
function computeReplicationMountPrefix(collections) {
|
|
21
|
+
const entries = Object.values(collections);
|
|
22
|
+
if (entries.length === 0) throw new Error("No replicated collections declared");
|
|
23
|
+
const parents = entries.map(({ canonical }) => {
|
|
24
|
+
const segs = canonical.split("/").filter((s) => s.length > 0);
|
|
25
|
+
const starIdx = segs.indexOf("*");
|
|
26
|
+
if (starIdx < 1) throw new Error(`Invalid canonical pattern (no * or too short): ${canonical}`);
|
|
27
|
+
return segs.slice(0, starIdx - 1);
|
|
28
|
+
});
|
|
29
|
+
const first = parents[0];
|
|
30
|
+
let lcpLen = first.length;
|
|
31
|
+
for (let k = 1; k < parents.length; k++) {
|
|
32
|
+
const p = parents[k];
|
|
33
|
+
let len = 0;
|
|
34
|
+
while (len < lcpLen && len < p.length && first[len] === p[len]) len++;
|
|
35
|
+
lcpLen = len;
|
|
36
|
+
}
|
|
37
|
+
return first.slice(0, lcpLen).join("/") || "instance";
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Derive the sidecar path for a given item path, using the pattern to determine
|
|
41
|
+
* the injection point. Injects `.provenance/` before the collection segment
|
|
42
|
+
* (segment at firstStarIndex - 1 of the pattern).
|
|
43
|
+
*
|
|
44
|
+
* Examples:
|
|
45
|
+
* pattern="instance/app/posts/*", item="/instance/app/posts/p1"
|
|
46
|
+
* → "/instance/app/.provenance/posts/p1"
|
|
47
|
+
* pattern="instance/app/posts/{star}/comments/{star}", item="/instance/app/posts/p1/comments/c1"
|
|
48
|
+
* → "/instance/app/.provenance/posts/p1/comments/c1"
|
|
49
|
+
* Works for copy paths too: item="/user/app/posts/p1"
|
|
50
|
+
* → "/user/app/.provenance/posts/p1"
|
|
51
|
+
*/
|
|
52
|
+
function deriveSidecarPath(pattern, fullItemPath) {
|
|
53
|
+
const patternSegs = pattern.split("/").filter((s) => s.length > 0);
|
|
54
|
+
const firstStarIdx = patternSegs.indexOf("*");
|
|
55
|
+
if (firstStarIdx < 1) throw new Error(`Invalid pattern (no * or too short): ${pattern}`);
|
|
56
|
+
const preCollectionLen = firstStarIdx - 1;
|
|
57
|
+
const collectionSeg = patternSegs[firstStarIdx - 1];
|
|
58
|
+
const itemSegs = fullItemPath.replace(/^\//, "").split("/").filter((s) => s.length > 0);
|
|
59
|
+
const itemTail = itemSegs.slice(firstStarIdx);
|
|
60
|
+
return `/${[
|
|
61
|
+
...itemSegs.slice(0, preCollectionLen),
|
|
62
|
+
".provenance",
|
|
63
|
+
collectionSeg,
|
|
64
|
+
...itemTail
|
|
65
|
+
].join("/")}`;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Find the best-matching collection for a given (normalized, no-leading-slash) item path.
|
|
69
|
+
* Uses longest-match: the pattern that consumes the most path segments with static segments wins.
|
|
70
|
+
* Returns null if no collection matches.
|
|
71
|
+
*/
|
|
72
|
+
function matchCollections(collections, normalizedPath) {
|
|
73
|
+
const itemSegs = normalizedPath.replace(/^\//, "").split("/").filter((s) => s.length > 0);
|
|
74
|
+
let best = null;
|
|
75
|
+
for (const [name, collection] of Object.entries(collections)) {
|
|
76
|
+
const score = tryMatchPattern(collection.canonical.split("/").filter((s) => s.length > 0), itemSegs);
|
|
77
|
+
if (score !== null && (best === null || score > best.score)) best = {
|
|
78
|
+
name,
|
|
79
|
+
collection,
|
|
80
|
+
score
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
return best ? {
|
|
84
|
+
name: best.name,
|
|
85
|
+
collection: best.collection
|
|
86
|
+
} : null;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Try to match a pattern (segment array) against an item path (segment array).
|
|
90
|
+
* Returns a score (higher = more specific) on match, or null on mismatch.
|
|
91
|
+
* Rules:
|
|
92
|
+
* - Static segments must match exactly.
|
|
93
|
+
* - Non-terminal `*` matches exactly one segment.
|
|
94
|
+
* - Terminal `*` matches one or more remaining segments (item + subtree).
|
|
95
|
+
*/
|
|
96
|
+
function tryMatchPattern(patternSegs, itemSegs) {
|
|
97
|
+
let pIdx = 0;
|
|
98
|
+
let iIdx = 0;
|
|
99
|
+
let score = 0;
|
|
100
|
+
while (pIdx < patternSegs.length) {
|
|
101
|
+
const pSeg = patternSegs[pIdx];
|
|
102
|
+
if (pSeg === "*") {
|
|
103
|
+
if (pIdx === patternSegs.length - 1) {
|
|
104
|
+
if (iIdx >= itemSegs.length) return null;
|
|
105
|
+
score += 10 + (itemSegs.length - iIdx - 1);
|
|
106
|
+
return score;
|
|
107
|
+
}
|
|
108
|
+
if (iIdx >= itemSegs.length) return null;
|
|
109
|
+
iIdx++;
|
|
110
|
+
score += 100;
|
|
111
|
+
} else {
|
|
112
|
+
if (iIdx >= itemSegs.length || itemSegs[iIdx] !== pSeg) return null;
|
|
113
|
+
iIdx++;
|
|
114
|
+
score += 1e3;
|
|
115
|
+
}
|
|
116
|
+
pIdx++;
|
|
117
|
+
}
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Match a path against canonical collection patterns OR their derived sidecar
|
|
122
|
+
* mirror patterns (`.provenance/` prefixed). Used for the read gate (P2).
|
|
123
|
+
*
|
|
124
|
+
* Sidecar matching: strips the `.provenance` segment from the path and checks
|
|
125
|
+
* the resulting path against the canonical patterns.
|
|
126
|
+
*/
|
|
127
|
+
function matchCollectionsForRead(collections, normalizedPath) {
|
|
128
|
+
const direct = matchCollections(collections, normalizedPath);
|
|
129
|
+
if (direct) return direct;
|
|
130
|
+
const segs = normalizedPath.split("/").filter((s) => s.length > 0);
|
|
131
|
+
const provenanceIdx = segs.indexOf(".provenance");
|
|
132
|
+
if (provenanceIdx < 0) return null;
|
|
133
|
+
return matchCollections(collections, [...segs.slice(0, provenanceIdx), ...segs.slice(provenanceIdx + 1)].join("/"));
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Check that a path contains no `..` or empty segments (path safety).
|
|
137
|
+
* Returns the normalized path (no leading `/`) on success.
|
|
138
|
+
* Throws AFSForbiddenError on suspicious input.
|
|
139
|
+
*/
|
|
140
|
+
function assertPathSafe(path) {
|
|
141
|
+
const norm = path.replace(/^\//, "");
|
|
142
|
+
const segs = norm.split("/");
|
|
143
|
+
for (const seg of segs) if (seg === "" || seg === "..") throw new _aigne_afs.AFSForbiddenError(path, `path contains unsafe segment: "${seg === "" ? "(empty)" : seg}"`);
|
|
144
|
+
return norm;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Convert a canonical `/instance/...` path to the author-copy `/user/...` path.
|
|
148
|
+
* Replaces the first segment (`instance`) with `user`.
|
|
149
|
+
* Returns the VIEW path (prefixed with /user) — callers must strip /user before
|
|
150
|
+
* passing to userBackend, since userBackend operates at provider-relative paths.
|
|
151
|
+
*/
|
|
152
|
+
function canonicalToViewCopyPath(canonicalPath) {
|
|
153
|
+
const norm = canonicalPath.replace(/^\//, "");
|
|
154
|
+
const slashIdx = norm.indexOf("/");
|
|
155
|
+
if (slashIdx < 0) return "/user";
|
|
156
|
+
return `/user${norm.slice(slashIdx)}`;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Strip the `/user` view prefix from a copy view path to get the
|
|
160
|
+
* provider-relative path for userBackend calls.
|
|
161
|
+
*/
|
|
162
|
+
function copyViewToProviderPath(viewPath) {
|
|
163
|
+
if (viewPath === "/user") return "/";
|
|
164
|
+
if (viewPath.startsWith("/user/")) return viewPath.slice(5);
|
|
165
|
+
return viewPath;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* ReplicationResolver intercepts writes and deletes to replicated-collection
|
|
169
|
+
* paths, enforces role gates, and fans out to both canonical (instanceBackend)
|
|
170
|
+
* and author copy (userBackend) with provenance sidecars.
|
|
171
|
+
*
|
|
172
|
+
* Mounted as a SessionUserAFS overlay at `/${mountPrefix}` (typically
|
|
173
|
+
* /instance). Receives SUB-PATHS (after prefix stripping by the overlay
|
|
174
|
+
* system) and reconstructs full paths internally using mountPrefix.
|
|
175
|
+
*
|
|
176
|
+
* P1: write + delete implemented.
|
|
177
|
+
* P2: read gate (readRole) + createSessionView wiring.
|
|
178
|
+
*/
|
|
179
|
+
var ReplicationResolver = class {
|
|
180
|
+
name;
|
|
181
|
+
mountPrefix;
|
|
182
|
+
constructor(opts) {
|
|
183
|
+
this.opts = opts;
|
|
184
|
+
this.name = `replication-resolver:${opts.sessionId}`;
|
|
185
|
+
this.mountPrefix = opts.mountPrefix ?? computeReplicationMountPrefix(opts.collections);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Reconstruct the full canonical path from the sub-path the overlay delivers.
|
|
189
|
+
* The overlay at `/${mountPrefix}` strips the prefix, leaving e.g. `/notes/n1`
|
|
190
|
+
* from `/instance/notes/n1`. We prepend mountPrefix to restore the full path.
|
|
191
|
+
*/
|
|
192
|
+
toFullPath(sub) {
|
|
193
|
+
const s = sub.startsWith("/") ? sub : `/${sub}`;
|
|
194
|
+
return `/${this.mountPrefix}${s}`;
|
|
195
|
+
}
|
|
196
|
+
async getEffectiveMinRole(collectionName, collection) {
|
|
197
|
+
if (this.opts.settingsResolver) try {
|
|
198
|
+
const v = (await this.opts.settingsResolver.read(`/${collectionName}/minRole.json/value`)).data?.content;
|
|
199
|
+
if (typeof v === "string" && v.length > 0) return v;
|
|
200
|
+
} catch {}
|
|
201
|
+
return collection.minRole ?? "member";
|
|
202
|
+
}
|
|
203
|
+
async getEffectiveReadRole(collectionName, collection) {
|
|
204
|
+
if (this.opts.settingsResolver) try {
|
|
205
|
+
const v = (await this.opts.settingsResolver.read(`/${collectionName}/readRole.json/value`)).data?.content;
|
|
206
|
+
if (typeof v === "string" && v.length > 0) return v;
|
|
207
|
+
} catch {}
|
|
208
|
+
return collection.readRole ?? "guest";
|
|
209
|
+
}
|
|
210
|
+
async read(path, options) {
|
|
211
|
+
const fullPath = this.toFullPath(path);
|
|
212
|
+
const normPath = assertPathSafe(fullPath);
|
|
213
|
+
const match = matchCollectionsForRead(this.opts.collections, normPath);
|
|
214
|
+
if (match) {
|
|
215
|
+
const effectiveReadRole = await this.getEffectiveReadRole(match.name, match.collection);
|
|
216
|
+
if (require_role_level.roleLevel(this.opts.callerRole) < require_role_level.roleLevel(effectiveReadRole)) throw new _aigne_afs.AFSForbiddenError(fullPath, `role '${this.opts.callerRole ?? "guest"}' is below readRole '${effectiveReadRole}'`);
|
|
217
|
+
}
|
|
218
|
+
if (!this.opts.instanceBackend.read) throw new _aigne_afs.AFSForbiddenError(fullPath, "instanceBackend does not support read");
|
|
219
|
+
return this.opts.instanceBackend.read(fullPath, options);
|
|
220
|
+
}
|
|
221
|
+
async list(path, options) {
|
|
222
|
+
const fullPath = this.toFullPath(path);
|
|
223
|
+
const normPath = assertPathSafe(fullPath);
|
|
224
|
+
const match = matchCollectionsForRead(this.opts.collections, normPath);
|
|
225
|
+
if (match) {
|
|
226
|
+
const effectiveReadRole = await this.getEffectiveReadRole(match.name, match.collection);
|
|
227
|
+
if (require_role_level.roleLevel(this.opts.callerRole) < require_role_level.roleLevel(effectiveReadRole)) throw new _aigne_afs.AFSForbiddenError(fullPath, `role '${this.opts.callerRole ?? "guest"}' is below readRole '${effectiveReadRole}'`);
|
|
228
|
+
}
|
|
229
|
+
if (!this.opts.instanceBackend.list) throw new _aigne_afs.AFSForbiddenError(fullPath, "instanceBackend does not support list");
|
|
230
|
+
return this.opts.instanceBackend.list(fullPath, options);
|
|
231
|
+
}
|
|
232
|
+
async stat(path, options) {
|
|
233
|
+
const fullPath = this.toFullPath(path);
|
|
234
|
+
const normPath = assertPathSafe(fullPath);
|
|
235
|
+
const match = matchCollectionsForRead(this.opts.collections, normPath);
|
|
236
|
+
if (match) {
|
|
237
|
+
const effectiveReadRole = await this.getEffectiveReadRole(match.name, match.collection);
|
|
238
|
+
if (require_role_level.roleLevel(this.opts.callerRole) < require_role_level.roleLevel(effectiveReadRole)) throw new _aigne_afs.AFSForbiddenError(fullPath, `role '${this.opts.callerRole ?? "guest"}' is below readRole '${effectiveReadRole}'`);
|
|
239
|
+
}
|
|
240
|
+
if (!this.opts.instanceBackend.stat) throw new _aigne_afs.AFSForbiddenError(fullPath, "instanceBackend does not support stat");
|
|
241
|
+
return this.opts.instanceBackend.stat(fullPath, options);
|
|
242
|
+
}
|
|
243
|
+
async search(path, query, options) {
|
|
244
|
+
const fullPath = this.toFullPath(path);
|
|
245
|
+
const normPath = assertPathSafe(fullPath);
|
|
246
|
+
const match = matchCollectionsForRead(this.opts.collections, normPath);
|
|
247
|
+
if (match) {
|
|
248
|
+
const effectiveReadRole = await this.getEffectiveReadRole(match.name, match.collection);
|
|
249
|
+
if (require_role_level.roleLevel(this.opts.callerRole) < require_role_level.roleLevel(effectiveReadRole)) throw new _aigne_afs.AFSForbiddenError(fullPath, `role '${this.opts.callerRole ?? "guest"}' is below readRole '${effectiveReadRole}'`);
|
|
250
|
+
}
|
|
251
|
+
if (!this.opts.instanceBackend.search) throw new _aigne_afs.AFSForbiddenError(fullPath, "instanceBackend does not support search");
|
|
252
|
+
return this.opts.instanceBackend.search(fullPath, query, options);
|
|
253
|
+
}
|
|
254
|
+
async write(path, content, options) {
|
|
255
|
+
const fullPath = this.toFullPath(path);
|
|
256
|
+
const normPath = assertPathSafe(fullPath);
|
|
257
|
+
const match = matchCollections(this.opts.collections, normPath);
|
|
258
|
+
if (!match) {
|
|
259
|
+
if ((options?.context)?.callerOrigin === "network") throw new _aigne_afs.AFSForbiddenError(fullPath, "network clients cannot write non-replicated instance paths");
|
|
260
|
+
if (!this.opts.instanceBackend.write) throw new _aigne_afs.AFSForbiddenError(fullPath, "instanceBackend does not support write");
|
|
261
|
+
return this.opts.instanceBackend.write(fullPath, content, options);
|
|
262
|
+
}
|
|
263
|
+
const { name: collectionName, collection } = match;
|
|
264
|
+
const effectiveMinRole = await this.getEffectiveMinRole(collectionName, collection);
|
|
265
|
+
if (require_role_level.roleLevel(this.opts.callerRole) < require_role_level.roleLevel(effectiveMinRole)) throw new _aigne_afs.AFSForbiddenError(fullPath, `role '${this.opts.callerRole ?? "guest"}' is below minRole '${effectiveMinRole}'`);
|
|
266
|
+
const authorDid = this.opts.callerDid ?? null;
|
|
267
|
+
const publishedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
268
|
+
if ((collection.copy ?? "mirror") !== "none" && this.opts.userBackend !== null && this.opts.userBackend.write) {
|
|
269
|
+
const copyViewPath = canonicalToViewCopyPath(fullPath);
|
|
270
|
+
const copyProviderPath = copyViewToProviderPath(copyViewPath);
|
|
271
|
+
await this.opts.userBackend.write(copyProviderPath, content);
|
|
272
|
+
const copySidecarProviderPath = copyViewToProviderPath(deriveSidecarPath(collection.canonical, copyViewPath));
|
|
273
|
+
const copySidecar = {
|
|
274
|
+
canonical_ref: {
|
|
275
|
+
instance_did: this.opts.instanceDid ?? "",
|
|
276
|
+
path: normPath.replace(/^instance\//, "")
|
|
277
|
+
},
|
|
278
|
+
published_at: publishedAt
|
|
279
|
+
};
|
|
280
|
+
await this.opts.userBackend.write(copySidecarProviderPath, { content: JSON.stringify(copySidecar) });
|
|
281
|
+
}
|
|
282
|
+
if (!this.opts.instanceBackend.write) throw new _aigne_afs.AFSForbiddenError(fullPath, "instanceBackend does not support write");
|
|
283
|
+
const result = await this.opts.instanceBackend.write(fullPath, content, options);
|
|
284
|
+
const canonicalSidecarPath = deriveSidecarPath(collection.canonical, fullPath);
|
|
285
|
+
const canonicalSidecar = {
|
|
286
|
+
author_did: authorDid,
|
|
287
|
+
published_at: publishedAt
|
|
288
|
+
};
|
|
289
|
+
await this.opts.instanceBackend.write(canonicalSidecarPath, { content: JSON.stringify(canonicalSidecar) });
|
|
290
|
+
return result;
|
|
291
|
+
}
|
|
292
|
+
async delete(path, options) {
|
|
293
|
+
const fullPath = this.toFullPath(path);
|
|
294
|
+
const normPath = assertPathSafe(fullPath);
|
|
295
|
+
const match = matchCollections(this.opts.collections, normPath);
|
|
296
|
+
if (!match) {
|
|
297
|
+
if (!this.opts.instanceBackend.delete) return {};
|
|
298
|
+
return this.opts.instanceBackend.delete(fullPath, options);
|
|
299
|
+
}
|
|
300
|
+
const { collection } = match;
|
|
301
|
+
const canonicalSidecarPath = deriveSidecarPath(collection.canonical, fullPath);
|
|
302
|
+
let provenanceAuthorDid = null;
|
|
303
|
+
if (this.opts.instanceBackend.read) try {
|
|
304
|
+
const raw = (await this.opts.instanceBackend.read(canonicalSidecarPath)).data?.content;
|
|
305
|
+
if (typeof raw === "string") provenanceAuthorDid = JSON.parse(raw).author_did ?? null;
|
|
306
|
+
} catch {}
|
|
307
|
+
const callerDid = this.opts.callerDid;
|
|
308
|
+
const anyItemRoleStr = collection.delete?.anyItem ?? "admin";
|
|
309
|
+
const isOwnItem = callerDid != null && provenanceAuthorDid != null && callerDid === provenanceAuthorDid;
|
|
310
|
+
const hasAnyItemRole = require_role_level.roleLevel(this.opts.callerRole) >= require_role_level.roleLevel(anyItemRoleStr);
|
|
311
|
+
if (!isOwnItem && !hasAnyItemRole) throw new _aigne_afs.AFSForbiddenError(fullPath, `insufficient permission to delete: role='${this.opts.callerRole ?? "guest"}'`);
|
|
312
|
+
if (!this.opts.instanceBackend.delete) return {};
|
|
313
|
+
const result = await this.opts.instanceBackend.delete(fullPath, options);
|
|
314
|
+
try {
|
|
315
|
+
await this.opts.instanceBackend.delete(canonicalSidecarPath);
|
|
316
|
+
} catch {}
|
|
317
|
+
return result;
|
|
318
|
+
}
|
|
319
|
+
};
|
|
320
|
+
|
|
321
|
+
//#endregion
|
|
322
|
+
exports.ReplicationResolver = ReplicationResolver;
|
|
323
|
+
exports.computeReplicationMountPrefix = computeReplicationMountPrefix;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { SettingsResolver } from "./settings-resolver.cjs";
|
|
2
|
+
import { AFSDeleteOptions, AFSDeleteResult, AFSListOptions, AFSListResult, AFSModule, AFSReadOptions, AFSReadResult, AFSRoot, AFSSearchOptions, AFSSearchResult, AFSStatOptions, AFSStatResult, AFSWriteEntryPayload, AFSWriteOptions, AFSWriteResult, ReplicatedCollection } from "@aigne/afs";
|
|
3
|
+
|
|
4
|
+
//#region src/session/replication-resolver.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Construction options for ReplicationResolver.
|
|
7
|
+
* Injected at createSessionView (P2), not pre-built upstream.
|
|
8
|
+
*/
|
|
9
|
+
interface ReplicationResolverOptions {
|
|
10
|
+
/**
|
|
11
|
+
* Parsed replicated-collection declarations from the blocklet manifest.
|
|
12
|
+
* Key = logical collection name; value = validated ReplicatedCollection.
|
|
13
|
+
*/
|
|
14
|
+
collections: Record<string, ReplicatedCollection>;
|
|
15
|
+
/** The canonical backend (instance space, role:system). */
|
|
16
|
+
instanceBackend: AFSRoot;
|
|
17
|
+
/** The author-copy backend (user space, role:user), or null for anonymous callers. */
|
|
18
|
+
userBackend: AFSModule | null;
|
|
19
|
+
/** SettingsResolver reference for reading effective minRole/readRole overrides. */
|
|
20
|
+
settingsResolver: SettingsResolver | null;
|
|
21
|
+
/** Verified caller DID (from AFSContext.caller.did, never client-supplied). */
|
|
22
|
+
callerDid: string | undefined;
|
|
23
|
+
/** Caller role (daemon-folded single string from getCallerForSession). */
|
|
24
|
+
callerRole: string | undefined;
|
|
25
|
+
/** Owning session id — for event origin tagging in P2+. */
|
|
26
|
+
sessionId: string;
|
|
27
|
+
/** Instance DID used in copy-side sidecar canonical_ref. */
|
|
28
|
+
instanceDid?: string;
|
|
29
|
+
/**
|
|
30
|
+
* The path prefix this resolver is mounted at, WITHOUT leading slash.
|
|
31
|
+
* e.g. "instance" when mounted at /instance. Used to reconstruct the full
|
|
32
|
+
* canonical path from the sub-path the overlay system delivers.
|
|
33
|
+
* When omitted, computed automatically via computeReplicationMountPrefix().
|
|
34
|
+
*/
|
|
35
|
+
mountPrefix?: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* ReplicationResolver intercepts writes and deletes to replicated-collection
|
|
39
|
+
* paths, enforces role gates, and fans out to both canonical (instanceBackend)
|
|
40
|
+
* and author copy (userBackend) with provenance sidecars.
|
|
41
|
+
*
|
|
42
|
+
* Mounted as a SessionUserAFS overlay at `/${mountPrefix}` (typically
|
|
43
|
+
* /instance). Receives SUB-PATHS (after prefix stripping by the overlay
|
|
44
|
+
* system) and reconstructs full paths internally using mountPrefix.
|
|
45
|
+
*
|
|
46
|
+
* P1: write + delete implemented.
|
|
47
|
+
* P2: read gate (readRole) + createSessionView wiring.
|
|
48
|
+
*/
|
|
49
|
+
declare class ReplicationResolver implements AFSModule {
|
|
50
|
+
private readonly opts;
|
|
51
|
+
readonly name: string;
|
|
52
|
+
private readonly mountPrefix;
|
|
53
|
+
constructor(opts: ReplicationResolverOptions);
|
|
54
|
+
/**
|
|
55
|
+
* Reconstruct the full canonical path from the sub-path the overlay delivers.
|
|
56
|
+
* The overlay at `/${mountPrefix}` strips the prefix, leaving e.g. `/notes/n1`
|
|
57
|
+
* from `/instance/notes/n1`. We prepend mountPrefix to restore the full path.
|
|
58
|
+
*/
|
|
59
|
+
private toFullPath;
|
|
60
|
+
private getEffectiveMinRole;
|
|
61
|
+
private getEffectiveReadRole;
|
|
62
|
+
read(path: string, options?: AFSReadOptions): Promise<AFSReadResult>;
|
|
63
|
+
list(path: string, options?: AFSListOptions): Promise<AFSListResult>;
|
|
64
|
+
stat(path: string, options?: AFSStatOptions): Promise<AFSStatResult>;
|
|
65
|
+
search(path: string, query: string, options?: AFSSearchOptions): Promise<AFSSearchResult>;
|
|
66
|
+
write(path: string, content: AFSWriteEntryPayload, options?: AFSWriteOptions): Promise<AFSWriteResult>;
|
|
67
|
+
delete(path: string, options?: AFSDeleteOptions): Promise<AFSDeleteResult>;
|
|
68
|
+
}
|
|
69
|
+
//#endregion
|
|
70
|
+
export { ReplicationResolver, ReplicationResolverOptions };
|
|
71
|
+
//# sourceMappingURL=replication-resolver.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replication-resolver.d.cts","names":[],"sources":["../../src/session/replication-resolver.ts"],"mappings":";;;;;;;;UAqCiB,0BAAA;EAKa;;;;EAA5B,WAAA,EAAa,MAAA,SAAe,oBAAA;EAM5B;EAJA,eAAA,EAAiB,OAAA;EAMjB;EAJA,WAAA,EAAa,SAAA;EAQb;EANA,gBAAA,EAAkB,gBAAA;EAelB;EAbA,SAAA;EAaW;EAXX,UAAA;EAkP+B;EAhP/B,SAAA;EAoPmC;EAlPnC,WAAA;EA2S4D;;;;;;EApS5D,WAAA;AAAA;;;;;;;;;;;;;cAuOW,mBAAA,YAA+B,SAAA;EAAA,iBAIb,IAAA;EAAA,SAHpB,IAAA;EAAA,iBACQ,WAAA;cAEY,IAAA,EAAM,0BAAA;EAgP7B;;;;;EAAA,QApOE,UAAA;EAAA,QAOM,mBAAA;EAAA,QAkBA,oBAAA;EAoBR,IAAA,CAAK,IAAA,UAAc,OAAA,GAAU,cAAA,GAAiB,OAAA,CAAQ,aAAA;EAyBtD,IAAA,CAAK,IAAA,UAAc,OAAA,GAAU,cAAA,GAAiB,OAAA,CAAQ,aAAA;EAsBtD,IAAA,CAAK,IAAA,UAAc,OAAA,GAAU,cAAA,GAAiB,OAAA,CAAQ,aAAA;EAsBtD,MAAA,CAAO,IAAA,UAAc,KAAA,UAAe,OAAA,GAAU,gBAAA,GAAmB,OAAA,CAAQ,eAAA;EAsBzE,KAAA,CACJ,IAAA,UACA,OAAA,EAAS,oBAAA,EACT,OAAA,GAAU,eAAA,GACT,OAAA,CAAQ,cAAA;EAwFL,MAAA,CAAO,IAAA,UAAc,OAAA,GAAU,gBAAA,GAAmB,OAAA,CAAQ,eAAA;AAAA"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { SettingsResolver } from "./settings-resolver.mjs";
|
|
2
|
+
import { AFSDeleteOptions, AFSDeleteResult, AFSListOptions, AFSListResult, AFSModule, AFSReadOptions, AFSReadResult, AFSRoot, AFSSearchOptions, AFSSearchResult, AFSStatOptions, AFSStatResult, AFSWriteEntryPayload, AFSWriteOptions, AFSWriteResult, ReplicatedCollection } from "@aigne/afs";
|
|
3
|
+
|
|
4
|
+
//#region src/session/replication-resolver.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Construction options for ReplicationResolver.
|
|
7
|
+
* Injected at createSessionView (P2), not pre-built upstream.
|
|
8
|
+
*/
|
|
9
|
+
interface ReplicationResolverOptions {
|
|
10
|
+
/**
|
|
11
|
+
* Parsed replicated-collection declarations from the blocklet manifest.
|
|
12
|
+
* Key = logical collection name; value = validated ReplicatedCollection.
|
|
13
|
+
*/
|
|
14
|
+
collections: Record<string, ReplicatedCollection>;
|
|
15
|
+
/** The canonical backend (instance space, role:system). */
|
|
16
|
+
instanceBackend: AFSRoot;
|
|
17
|
+
/** The author-copy backend (user space, role:user), or null for anonymous callers. */
|
|
18
|
+
userBackend: AFSModule | null;
|
|
19
|
+
/** SettingsResolver reference for reading effective minRole/readRole overrides. */
|
|
20
|
+
settingsResolver: SettingsResolver | null;
|
|
21
|
+
/** Verified caller DID (from AFSContext.caller.did, never client-supplied). */
|
|
22
|
+
callerDid: string | undefined;
|
|
23
|
+
/** Caller role (daemon-folded single string from getCallerForSession). */
|
|
24
|
+
callerRole: string | undefined;
|
|
25
|
+
/** Owning session id — for event origin tagging in P2+. */
|
|
26
|
+
sessionId: string;
|
|
27
|
+
/** Instance DID used in copy-side sidecar canonical_ref. */
|
|
28
|
+
instanceDid?: string;
|
|
29
|
+
/**
|
|
30
|
+
* The path prefix this resolver is mounted at, WITHOUT leading slash.
|
|
31
|
+
* e.g. "instance" when mounted at /instance. Used to reconstruct the full
|
|
32
|
+
* canonical path from the sub-path the overlay system delivers.
|
|
33
|
+
* When omitted, computed automatically via computeReplicationMountPrefix().
|
|
34
|
+
*/
|
|
35
|
+
mountPrefix?: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* ReplicationResolver intercepts writes and deletes to replicated-collection
|
|
39
|
+
* paths, enforces role gates, and fans out to both canonical (instanceBackend)
|
|
40
|
+
* and author copy (userBackend) with provenance sidecars.
|
|
41
|
+
*
|
|
42
|
+
* Mounted as a SessionUserAFS overlay at `/${mountPrefix}` (typically
|
|
43
|
+
* /instance). Receives SUB-PATHS (after prefix stripping by the overlay
|
|
44
|
+
* system) and reconstructs full paths internally using mountPrefix.
|
|
45
|
+
*
|
|
46
|
+
* P1: write + delete implemented.
|
|
47
|
+
* P2: read gate (readRole) + createSessionView wiring.
|
|
48
|
+
*/
|
|
49
|
+
declare class ReplicationResolver implements AFSModule {
|
|
50
|
+
private readonly opts;
|
|
51
|
+
readonly name: string;
|
|
52
|
+
private readonly mountPrefix;
|
|
53
|
+
constructor(opts: ReplicationResolverOptions);
|
|
54
|
+
/**
|
|
55
|
+
* Reconstruct the full canonical path from the sub-path the overlay delivers.
|
|
56
|
+
* The overlay at `/${mountPrefix}` strips the prefix, leaving e.g. `/notes/n1`
|
|
57
|
+
* from `/instance/notes/n1`. We prepend mountPrefix to restore the full path.
|
|
58
|
+
*/
|
|
59
|
+
private toFullPath;
|
|
60
|
+
private getEffectiveMinRole;
|
|
61
|
+
private getEffectiveReadRole;
|
|
62
|
+
read(path: string, options?: AFSReadOptions): Promise<AFSReadResult>;
|
|
63
|
+
list(path: string, options?: AFSListOptions): Promise<AFSListResult>;
|
|
64
|
+
stat(path: string, options?: AFSStatOptions): Promise<AFSStatResult>;
|
|
65
|
+
search(path: string, query: string, options?: AFSSearchOptions): Promise<AFSSearchResult>;
|
|
66
|
+
write(path: string, content: AFSWriteEntryPayload, options?: AFSWriteOptions): Promise<AFSWriteResult>;
|
|
67
|
+
delete(path: string, options?: AFSDeleteOptions): Promise<AFSDeleteResult>;
|
|
68
|
+
}
|
|
69
|
+
//#endregion
|
|
70
|
+
export { ReplicationResolver, ReplicationResolverOptions };
|
|
71
|
+
//# sourceMappingURL=replication-resolver.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replication-resolver.d.mts","names":[],"sources":["../../src/session/replication-resolver.ts"],"mappings":";;;;;;;;UAqCiB,0BAAA;EAKa;;;;EAA5B,WAAA,EAAa,MAAA,SAAe,oBAAA;EAM5B;EAJA,eAAA,EAAiB,OAAA;EAMjB;EAJA,WAAA,EAAa,SAAA;EAQb;EANA,gBAAA,EAAkB,gBAAA;EAelB;EAbA,SAAA;EAaW;EAXX,UAAA;EAkP+B;EAhP/B,SAAA;EAoPmC;EAlPnC,WAAA;EA2S4D;;;;;;EApS5D,WAAA;AAAA;;;;;;;;;;;;;cAuOW,mBAAA,YAA+B,SAAA;EAAA,iBAIb,IAAA;EAAA,SAHpB,IAAA;EAAA,iBACQ,WAAA;cAEY,IAAA,EAAM,0BAAA;EAgP7B;;;;;EAAA,QApOE,UAAA;EAAA,QAOM,mBAAA;EAAA,QAkBA,oBAAA;EAoBR,IAAA,CAAK,IAAA,UAAc,OAAA,GAAU,cAAA,GAAiB,OAAA,CAAQ,aAAA;EAyBtD,IAAA,CAAK,IAAA,UAAc,OAAA,GAAU,cAAA,GAAiB,OAAA,CAAQ,aAAA;EAsBtD,IAAA,CAAK,IAAA,UAAc,OAAA,GAAU,cAAA,GAAiB,OAAA,CAAQ,aAAA;EAsBtD,MAAA,CAAO,IAAA,UAAc,KAAA,UAAe,OAAA,GAAU,gBAAA,GAAmB,OAAA,CAAQ,eAAA;EAsBzE,KAAA,CACJ,IAAA,UACA,OAAA,EAAS,oBAAA,EACT,OAAA,GAAU,eAAA,GACT,OAAA,CAAQ,cAAA;EAwFL,MAAA,CAAO,IAAA,UAAc,OAAA,GAAU,gBAAA,GAAmB,OAAA,CAAQ,eAAA;AAAA"}
|