@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,337 @@
|
|
|
1
|
+
import { parseDeclaration, parseDslStringToken } from "../dsl-shared.mjs";
|
|
2
|
+
import { scaffoldDslParseError } from "./dsl-error.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/scaffold/workspace-dsl.ts
|
|
5
|
+
const STRING = "\"((?:[^\"\\\\]|\\\\.)*)\"";
|
|
6
|
+
function pathHasTraversal(path) {
|
|
7
|
+
let decoded = path;
|
|
8
|
+
try {
|
|
9
|
+
decoded = decodeURIComponent(path);
|
|
10
|
+
} catch {}
|
|
11
|
+
const re = /(^|\/)\.\.($|\/)/;
|
|
12
|
+
return re.test(path) || re.test(decoded);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Project a parsed workspace definition onto the formalized convention
|
|
16
|
+
* manifest — flattening sections to their folder roots and lifting the agent
|
|
17
|
+
* and default content path.
|
|
18
|
+
*/
|
|
19
|
+
function workspaceManifestFromDefinition(definition) {
|
|
20
|
+
const roots = [];
|
|
21
|
+
for (const section of definition.sections ?? []) for (const root of section.roots ?? []) roots.push({
|
|
22
|
+
id: root.id,
|
|
23
|
+
title: root.title,
|
|
24
|
+
path: root.path,
|
|
25
|
+
...root.editable !== void 0 ? { editable: root.editable } : {}
|
|
26
|
+
});
|
|
27
|
+
return {
|
|
28
|
+
roots,
|
|
29
|
+
...definition.defaultPath ? { defaultPath: definition.defaultPath } : {},
|
|
30
|
+
...definition.agent?.module ? { agent: {
|
|
31
|
+
module: definition.agent.module,
|
|
32
|
+
...definition.agent.title ? { title: definition.agent.title } : {},
|
|
33
|
+
...definition.agent.placeholder ? { placeholder: definition.agent.placeholder } : {}
|
|
34
|
+
} } : {}
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Schema-validate a workspace convention manifest (strict: declare ⇒ execute,
|
|
39
|
+
* never silently degrade to an empty workspace). Throws a
|
|
40
|
+
* {@link ScaffoldDslCompileError} on any violation:
|
|
41
|
+
* - no folder roots at all,
|
|
42
|
+
* - a root `from` / `default` path that is relative or contains `..` traversal.
|
|
43
|
+
*/
|
|
44
|
+
function validateWorkspaceManifest(manifest) {
|
|
45
|
+
if (!manifest.roots || manifest.roots.length === 0) throw parseError(1, "Workspace manifest must declare at least one root");
|
|
46
|
+
for (const root of manifest.roots) {
|
|
47
|
+
if (!root.path.startsWith("/")) throw parseError(1, `Workspace root "${root.id}" path must be absolute: ${root.path}`);
|
|
48
|
+
if (pathHasTraversal(root.path)) throw parseError(1, `Workspace root "${root.id}" path must not contain traversal (..): ${root.path}`);
|
|
49
|
+
}
|
|
50
|
+
if (manifest.defaultPath !== void 0) {
|
|
51
|
+
if (!manifest.defaultPath.startsWith("/")) throw parseError(1, `Workspace default path must be absolute: ${manifest.defaultPath}`);
|
|
52
|
+
if (pathHasTraversal(manifest.defaultPath)) throw parseError(1, `Workspace default path must not contain traversal (..): ${manifest.defaultPath}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function compileWorkspaceDsl(source) {
|
|
56
|
+
const declaration = parseDeclaration(source, {
|
|
57
|
+
kind: "workspace",
|
|
58
|
+
allowQuotedId: true,
|
|
59
|
+
allowHeadValues: true,
|
|
60
|
+
expected: "Expected workspace \"Title\" {",
|
|
61
|
+
fieldKeywords: [
|
|
62
|
+
"description",
|
|
63
|
+
"default",
|
|
64
|
+
"detail",
|
|
65
|
+
"agent",
|
|
66
|
+
"rail",
|
|
67
|
+
"group",
|
|
68
|
+
"root"
|
|
69
|
+
],
|
|
70
|
+
fieldInlineContinuationKeywords: { root: ["description"] },
|
|
71
|
+
nestedFieldKeywords: ["group"],
|
|
72
|
+
error: parseSharedError
|
|
73
|
+
});
|
|
74
|
+
const variant = parseVariant(declaration.headValues ?? []);
|
|
75
|
+
const workspace = {
|
|
76
|
+
title: declaration.id,
|
|
77
|
+
...variant ? { variant } : {},
|
|
78
|
+
rail: [],
|
|
79
|
+
sections: []
|
|
80
|
+
};
|
|
81
|
+
let railOrder = 1;
|
|
82
|
+
const sections = [];
|
|
83
|
+
for (const field of declaration.fields) {
|
|
84
|
+
if (field.name.value === "description") {
|
|
85
|
+
workspace.description = parseSingleStringField(field, "Expected description \"<text>\"");
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (field.name.value === "default") {
|
|
89
|
+
workspace.defaultPath = parseSingleStringField(field, "Expected default \"<path>\"");
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (field.name.value === "detail") {
|
|
93
|
+
workspace.detail = parseDetailField(field);
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (field.name.value === "agent") {
|
|
97
|
+
workspace.agent = parseAgentField(field);
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (field.name.value === "rail") {
|
|
101
|
+
workspace.rail ??= [];
|
|
102
|
+
workspace.rail.push(parseRailField(field, railOrder++));
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (field.name.value === "group") {
|
|
106
|
+
sections.push(parseGroupField(field, sections.length + 1));
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (field.name.value === "root") {
|
|
110
|
+
const section = ensureDefaultSection(sections);
|
|
111
|
+
section.roots ??= [];
|
|
112
|
+
section.roots.push(parseRootField(field, section.roots.length + 1));
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
throw parseError(field.name.line, `Unsupported workspace DSL line: ${field.name.value}`, field.name.column);
|
|
116
|
+
}
|
|
117
|
+
workspace.sections = sections;
|
|
118
|
+
if (workspace.rail?.length === 0) delete workspace.rail;
|
|
119
|
+
if (workspace.sections.length === 0) throw parseError(1, "Workspace DSL must define at least one root");
|
|
120
|
+
return workspace;
|
|
121
|
+
}
|
|
122
|
+
function formatWorkspaceDsl(source) {
|
|
123
|
+
const workspace = compileWorkspaceDsl(source);
|
|
124
|
+
const lines = [`workspace ${quote(workspace.title ?? "Workspace")}${workspace.variant ? ` variant ${workspace.variant}` : ""} {`];
|
|
125
|
+
if (workspace.description) lines.push(` description ${quote(workspace.description)}`);
|
|
126
|
+
if (workspace.defaultPath) lines.push(` default ${quote(workspace.defaultPath)}`);
|
|
127
|
+
if (workspace.detail?.renderer) lines.push(` detail ${workspace.detail.renderer}${workspace.detail.pattern ? ` pattern ${workspace.detail.pattern}` : ""}`);
|
|
128
|
+
if (workspace.agent?.module) lines.push(` agent ${workspace.agent.module}${workspace.agent.title ? ` ${quote(workspace.agent.title)}` : ""}${workspace.agent.placeholder ? ` placeholder ${quote(workspace.agent.placeholder)}` : ""}`);
|
|
129
|
+
for (const item of workspace.rail ?? []) lines.push(` rail ${quote(item.title)}${item.icon ? ` icon ${item.icon}` : ""}${item.href ? ` href ${quote(item.href)}` : ""}${item.active ? " active" : ""}`);
|
|
130
|
+
const sections = workspace.sections ?? [];
|
|
131
|
+
if (sections.length > 0) lines.push("");
|
|
132
|
+
sections.forEach((section, index) => {
|
|
133
|
+
if (index > 0) lines.push("");
|
|
134
|
+
const sectionId = section.id && section.id !== slugify(section.title) ? `${section.id} ` : "";
|
|
135
|
+
lines.push(` group ${sectionId}${quote(section.title)} {`);
|
|
136
|
+
if (section.description) lines.push(` description ${quote(section.description)}`);
|
|
137
|
+
for (const root of section.roots ?? []) {
|
|
138
|
+
const options = [
|
|
139
|
+
root.maxDepth !== void 0 ? `depth ${root.maxDepth}` : void 0,
|
|
140
|
+
root.itemStyle && root.itemStyle !== "compact" ? `style ${root.itemStyle}` : void 0,
|
|
141
|
+
...formatRootFilterOptions(root),
|
|
142
|
+
root.description ? `description ${quote(root.description)}` : void 0,
|
|
143
|
+
root.editable === true ? "editable" : root.editable === false ? "readonly" : void 0
|
|
144
|
+
].filter(Boolean).join(" ");
|
|
145
|
+
const rootId = root.id && root.id !== slugify(root.title) ? `${root.id} ` : "";
|
|
146
|
+
lines.push(` root ${rootId}${quote(root.title)} from ${quote(root.path)}${options ? ` ${options}` : ""}`);
|
|
147
|
+
}
|
|
148
|
+
lines.push(" }");
|
|
149
|
+
});
|
|
150
|
+
lines.push("}");
|
|
151
|
+
return `${lines.join("\n")}\n`;
|
|
152
|
+
}
|
|
153
|
+
function ensureDefaultSection(sections) {
|
|
154
|
+
let section = sections[0];
|
|
155
|
+
if (!section) {
|
|
156
|
+
section = {
|
|
157
|
+
id: "workspace",
|
|
158
|
+
title: "Workspace",
|
|
159
|
+
order: 1,
|
|
160
|
+
roots: []
|
|
161
|
+
};
|
|
162
|
+
sections.push(section);
|
|
163
|
+
}
|
|
164
|
+
return section;
|
|
165
|
+
}
|
|
166
|
+
function parseVariant(tokens) {
|
|
167
|
+
if (tokens.length === 0) return void 0;
|
|
168
|
+
if (tokens.length === 2 && tokens[0]?.type === "word" && tokens[0].value === "variant") {
|
|
169
|
+
const variant = tokens[1];
|
|
170
|
+
if (variant?.type === "word") return variant.value;
|
|
171
|
+
}
|
|
172
|
+
const token = tokens[0];
|
|
173
|
+
throw parseError(token?.line ?? 1, "Expected workspace \"Title\" [variant name] {", token?.column);
|
|
174
|
+
}
|
|
175
|
+
function parseDetailField(field) {
|
|
176
|
+
const renderer = field.values[0];
|
|
177
|
+
if (renderer?.type !== "word" || renderer.value !== "surface" && renderer.value !== "auto-surface") throw parseError(renderer?.line ?? field.name.line, "Expected detail surface|auto-surface");
|
|
178
|
+
const patternKeyword = field.values[1];
|
|
179
|
+
const pattern = field.values[2];
|
|
180
|
+
if (!patternKeyword) return { renderer: renderer.value };
|
|
181
|
+
if (patternKeyword.type === "word" && patternKeyword.value === "pattern" && pattern?.type === "word") return {
|
|
182
|
+
renderer: renderer.value,
|
|
183
|
+
pattern: pattern.value
|
|
184
|
+
};
|
|
185
|
+
throw parseError(patternKeyword.line, "Expected detail surface|auto-surface [pattern name]");
|
|
186
|
+
}
|
|
187
|
+
function parseAgentField(field) {
|
|
188
|
+
const module = field.values[0];
|
|
189
|
+
if (module?.type !== "word") throw parseError(module?.line ?? field.name.line, "Expected agent <module> [\"Title\"]");
|
|
190
|
+
let index = 1;
|
|
191
|
+
let title;
|
|
192
|
+
if (field.values[index]?.type === "string") {
|
|
193
|
+
title = parseDslStringToken(field.values[index], parseSharedError);
|
|
194
|
+
index += 1;
|
|
195
|
+
}
|
|
196
|
+
let placeholder;
|
|
197
|
+
const placeholderKeyword = field.values[index];
|
|
198
|
+
if (placeholderKeyword) {
|
|
199
|
+
const value = field.values[index + 1];
|
|
200
|
+
if (placeholderKeyword.type !== "word" || placeholderKeyword.value !== "placeholder" || value?.type !== "string") throw parseError(placeholderKeyword.line, "Expected agent <module> [\"Title\"] [placeholder \"...\"]");
|
|
201
|
+
placeholder = parseDslStringToken(value, parseSharedError);
|
|
202
|
+
index += 2;
|
|
203
|
+
}
|
|
204
|
+
if (field.values.length !== index) {
|
|
205
|
+
const token = field.values[index];
|
|
206
|
+
throw parseError(token.line, "Expected agent <module> [\"Title\"] [placeholder \"...\"]", token.column);
|
|
207
|
+
}
|
|
208
|
+
return {
|
|
209
|
+
module: module.value,
|
|
210
|
+
...title ? { title } : {},
|
|
211
|
+
...placeholder ? { placeholder } : {}
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
function parseRailField(field, order) {
|
|
215
|
+
const titleToken = field.values[0];
|
|
216
|
+
if (titleToken?.type !== "string") throw parseError(titleToken?.line ?? field.name.line, "Expected rail \"Title\"");
|
|
217
|
+
const title = parseDslStringToken(titleToken, parseSharedError);
|
|
218
|
+
const rest = joinDslValues(field.values.slice(1));
|
|
219
|
+
const icon = rest.match(/\bicon\s+([A-Za-z0-9_-]+)/);
|
|
220
|
+
const href = rest.match(/* @__PURE__ */ new RegExp(`\\bhref\\s+${STRING}`));
|
|
221
|
+
return {
|
|
222
|
+
id: slugify(title),
|
|
223
|
+
title,
|
|
224
|
+
...icon?.[1] ? { icon: icon[1] } : {},
|
|
225
|
+
...href?.[1] ? { href: unescapeString(href[1]) } : {},
|
|
226
|
+
...rest.match(/\bactive\b/) ? { active: true } : {},
|
|
227
|
+
order
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
function parseGroupField(field, order) {
|
|
231
|
+
const parsed = parseOptionalIdTitleField(field, "Expected group [id] \"Title\" {");
|
|
232
|
+
const section = {
|
|
233
|
+
id: parsed.id ?? slugify(parsed.title),
|
|
234
|
+
title: parsed.title,
|
|
235
|
+
order,
|
|
236
|
+
roots: []
|
|
237
|
+
};
|
|
238
|
+
let rootOrder = 1;
|
|
239
|
+
for (const child of field.children ?? []) {
|
|
240
|
+
if (child.name.value === "description") {
|
|
241
|
+
section.description = parseSingleStringField(child, "Expected description \"<text>\"");
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
if (child.name.value === "root") {
|
|
245
|
+
section.roots?.push(parseRootField(child, rootOrder++));
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
throw parseError(child.name.line, `Unsupported workspace group DSL line: ${child.name.value}`, child.name.column);
|
|
249
|
+
}
|
|
250
|
+
return section;
|
|
251
|
+
}
|
|
252
|
+
function parseRootField(field, order) {
|
|
253
|
+
const parsed = parseOptionalIdTitleField(field, "Expected root [id] \"Title\" from \"<path>\"");
|
|
254
|
+
const from = field.values[parsed.nextIndex];
|
|
255
|
+
const path = field.values[parsed.nextIndex + 1];
|
|
256
|
+
if (from?.type !== "word" || from.value !== "from" || path?.type !== "string") throw parseError(from?.line ?? field.name.line, "Expected root [id] \"Title\" from \"<path>\"");
|
|
257
|
+
const rest = joinDslValues(field.values.slice(parsed.nextIndex + 2));
|
|
258
|
+
const depth = rest.match(/\bdepth\s+(\d+)/);
|
|
259
|
+
const style = rest.match(/\bstyle\s+([A-Za-z0-9_-]+)/);
|
|
260
|
+
const descriptionValue = rest.match(/* @__PURE__ */ new RegExp(`\\bdescription\\s+${STRING}`));
|
|
261
|
+
const excludes = parseStringListOption(rest, "exclude");
|
|
262
|
+
const filter = excludes.length > 0 ? { exclude: excludes } : rest.match(/\bfilter\s+none\b/) ? void 0 : { exclude: [".aup"] };
|
|
263
|
+
const editable = rest.match(/\beditable\b/) ? true : rest.match(/\breadonly\b/) ? false : void 0;
|
|
264
|
+
return {
|
|
265
|
+
id: parsed.id ?? slugify(parsed.title),
|
|
266
|
+
title: parsed.title,
|
|
267
|
+
path: parseDslStringToken(path, parseSharedError),
|
|
268
|
+
...descriptionValue?.[1] ? { description: unescapeString(descriptionValue[1]) } : {},
|
|
269
|
+
order,
|
|
270
|
+
maxDepth: depth ? Number(depth[1]) : 1,
|
|
271
|
+
layout: "grouped",
|
|
272
|
+
itemStyle: style?.[1] ?? "compact",
|
|
273
|
+
...filter ? { filter } : {},
|
|
274
|
+
sort: { field: "id" },
|
|
275
|
+
...editable !== void 0 ? { editable } : {}
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
function parseOptionalIdTitleField(field, message) {
|
|
279
|
+
const first = field.values[0];
|
|
280
|
+
const second = field.values[1];
|
|
281
|
+
if (first?.type === "string") return {
|
|
282
|
+
title: parseDslStringToken(first, parseSharedError),
|
|
283
|
+
nextIndex: 1
|
|
284
|
+
};
|
|
285
|
+
if (first?.type === "word" && second?.type === "string") return {
|
|
286
|
+
id: first.value,
|
|
287
|
+
title: parseDslStringToken(second, parseSharedError),
|
|
288
|
+
nextIndex: 2
|
|
289
|
+
};
|
|
290
|
+
throw parseError(first?.line ?? field.name.line, message, first?.column ?? field.name.column);
|
|
291
|
+
}
|
|
292
|
+
function parseSingleStringField(field, message) {
|
|
293
|
+
const value = field.values[0];
|
|
294
|
+
if (field.values.length !== 1 || value?.type !== "string") throw parseError(value?.line ?? field.name.line, message, value?.column ?? field.name.column);
|
|
295
|
+
return parseDslStringToken(value, parseSharedError);
|
|
296
|
+
}
|
|
297
|
+
function joinDslValues(tokens) {
|
|
298
|
+
return tokens.map((token) => token.value).join(" ");
|
|
299
|
+
}
|
|
300
|
+
function parseSharedError(message, line, column = 1) {
|
|
301
|
+
return parseError(line, message, column);
|
|
302
|
+
}
|
|
303
|
+
function unescapeString(value) {
|
|
304
|
+
return value.replace(/\\"/g, "\"").replace(/\\\\/g, "\\");
|
|
305
|
+
}
|
|
306
|
+
function quote(value) {
|
|
307
|
+
return JSON.stringify(value);
|
|
308
|
+
}
|
|
309
|
+
function parseStringListOption(rest, option) {
|
|
310
|
+
const optionMatch = rest.match(/* @__PURE__ */ new RegExp(`\\b${option}\\b`));
|
|
311
|
+
if (!optionMatch || optionMatch.index === void 0) return [];
|
|
312
|
+
const tail = rest.slice(optionMatch.index + option.length).trimStart();
|
|
313
|
+
const nextKeywordIndex = tail.search(/\s+(?:description|depth|style|editable|readonly|filter)\b/);
|
|
314
|
+
const valueSource = nextKeywordIndex >= 0 ? tail.slice(0, nextKeywordIndex) : tail;
|
|
315
|
+
const values = [];
|
|
316
|
+
for (const match of valueSource.matchAll(new RegExp(STRING, "g"))) values.push(unescapeString(match[1] ?? ""));
|
|
317
|
+
return values;
|
|
318
|
+
}
|
|
319
|
+
function formatRootFilterOptions(root) {
|
|
320
|
+
if (!root.filter) return ["filter none"];
|
|
321
|
+
if (typeof root.filter === "string") return [];
|
|
322
|
+
const exclude = root.filter.exclude;
|
|
323
|
+
if (!Array.isArray(exclude)) return [];
|
|
324
|
+
const values = exclude.filter((value) => typeof value === "string");
|
|
325
|
+
if (values.length === 1 && values[0] === ".aup") return [];
|
|
326
|
+
return [`exclude ${values.map((value) => quote(value)).join(" ")}`];
|
|
327
|
+
}
|
|
328
|
+
function slugify(value) {
|
|
329
|
+
return value.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "") || "workspace";
|
|
330
|
+
}
|
|
331
|
+
function parseError(line, message, column = 1) {
|
|
332
|
+
return scaffoldDslParseError("workspace", line, message, column);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
//#endregion
|
|
336
|
+
export { compileWorkspaceDsl, formatWorkspaceDsl, validateWorkspaceManifest, workspaceManifestFromDefinition };
|
|
337
|
+
//# sourceMappingURL=workspace-dsl.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-dsl.mjs","names":[],"sources":["../../src/scaffold/workspace-dsl.ts"],"sourcesContent":["import {\n type DslField,\n type DslToken,\n parseDeclaration,\n parseDslStringToken,\n} from \"../dsl-shared.js\";\nimport { scaffoldDslParseError } from \"./dsl-error.js\";\nimport type {\n ScaffoldWorkspaceDefinition,\n ScaffoldWorkspaceRailItem,\n ScaffoldWorkspaceRoot,\n ScaffoldWorkspaceSection,\n} from \"./types.js\";\n\nconst STRING = '\"((?:[^\"\\\\\\\\]|\\\\\\\\.)*)\"';\n\n/**\n * Formalized `afs-workspace` convention contract (task 0.1).\n *\n * The `workspace.dsl` shell language parses into a {@link ScaffoldWorkspaceDefinition}\n * (rail/variant/sections/etc — the full shell). The *convention schema* is the\n * narrower contract the generalized wiring depends on: the folder roots (each a\n * select→content source), the agent, and the default content path. Extracting\n * it into a flat, validated manifest keeps the convention decoupled from the\n * particular DSL surface and gives one place to reject bad manifests.\n */\nexport interface WorkspaceManifestRoot {\n id: string;\n title: string;\n /** Absolute AFS path to the folder this root projects. */\n path: string;\n editable?: boolean;\n}\n\nexport interface WorkspaceManifestAgent {\n module: string;\n title?: string;\n placeholder?: string;\n}\n\nexport interface WorkspaceManifest {\n roots: WorkspaceManifestRoot[];\n defaultPath?: string;\n agent?: WorkspaceManifestAgent;\n}\n\nfunction pathHasTraversal(path: string): boolean {\n // Check both the raw and percent-decoded forms so an encoded `%2e%2e`\n // traversal cannot slip past the literal `..` check.\n let decoded = path;\n try {\n decoded = decodeURIComponent(path);\n } catch {\n // Malformed encoding — treat the raw form as the source of truth.\n }\n const re = /(^|\\/)\\.\\.($|\\/)/;\n return re.test(path) || re.test(decoded);\n}\n\n/**\n * Project a parsed workspace definition onto the formalized convention\n * manifest — flattening sections to their folder roots and lifting the agent\n * and default content path.\n */\nexport function workspaceManifestFromDefinition(\n definition: ScaffoldWorkspaceDefinition,\n): WorkspaceManifest {\n const roots: WorkspaceManifestRoot[] = [];\n for (const section of definition.sections ?? []) {\n for (const root of section.roots ?? []) {\n roots.push({\n id: root.id,\n title: root.title,\n path: root.path,\n ...(root.editable !== undefined ? { editable: root.editable } : {}),\n });\n }\n }\n return {\n roots,\n ...(definition.defaultPath ? { defaultPath: definition.defaultPath } : {}),\n ...(definition.agent?.module\n ? {\n agent: {\n module: definition.agent.module,\n ...(definition.agent.title ? { title: definition.agent.title } : {}),\n ...(definition.agent.placeholder ? { placeholder: definition.agent.placeholder } : {}),\n },\n }\n : {}),\n };\n}\n\n/**\n * Schema-validate a workspace convention manifest (strict: declare ⇒ execute,\n * never silently degrade to an empty workspace). Throws a\n * {@link ScaffoldDslCompileError} on any violation:\n * - no folder roots at all,\n * - a root `from` / `default` path that is relative or contains `..` traversal.\n */\nexport function validateWorkspaceManifest(manifest: WorkspaceManifest): void {\n if (!manifest.roots || manifest.roots.length === 0) {\n throw parseError(1, \"Workspace manifest must declare at least one root\");\n }\n for (const root of manifest.roots) {\n if (!root.path.startsWith(\"/\")) {\n throw parseError(1, `Workspace root \"${root.id}\" path must be absolute: ${root.path}`);\n }\n if (pathHasTraversal(root.path)) {\n throw parseError(\n 1,\n `Workspace root \"${root.id}\" path must not contain traversal (..): ${root.path}`,\n );\n }\n }\n if (manifest.defaultPath !== undefined) {\n if (!manifest.defaultPath.startsWith(\"/\")) {\n throw parseError(1, `Workspace default path must be absolute: ${manifest.defaultPath}`);\n }\n if (pathHasTraversal(manifest.defaultPath)) {\n throw parseError(\n 1,\n `Workspace default path must not contain traversal (..): ${manifest.defaultPath}`,\n );\n }\n }\n}\n\nexport function compileWorkspaceDsl(source: string): ScaffoldWorkspaceDefinition {\n const declaration = parseDeclaration(source, {\n kind: \"workspace\",\n allowQuotedId: true,\n allowHeadValues: true,\n expected: 'Expected workspace \"Title\" {',\n fieldKeywords: [\"description\", \"default\", \"detail\", \"agent\", \"rail\", \"group\", \"root\"],\n fieldInlineContinuationKeywords: { root: [\"description\"] },\n nestedFieldKeywords: [\"group\"],\n error: parseSharedError,\n });\n\n const variant = parseVariant(declaration.headValues ?? []);\n const workspace: ScaffoldWorkspaceDefinition = {\n title: declaration.id,\n ...(variant ? { variant } : {}),\n rail: [],\n sections: [],\n };\n\n let railOrder = 1;\n const sections: ScaffoldWorkspaceSection[] = [];\n for (const field of declaration.fields) {\n if (field.name.value === \"description\") {\n workspace.description = parseSingleStringField(field, 'Expected description \"<text>\"');\n continue;\n }\n if (field.name.value === \"default\") {\n workspace.defaultPath = parseSingleStringField(field, 'Expected default \"<path>\"');\n continue;\n }\n if (field.name.value === \"detail\") {\n workspace.detail = parseDetailField(field);\n continue;\n }\n if (field.name.value === \"agent\") {\n workspace.agent = parseAgentField(field);\n continue;\n }\n if (field.name.value === \"rail\") {\n workspace.rail ??= [];\n workspace.rail.push(parseRailField(field, railOrder++));\n continue;\n }\n if (field.name.value === \"group\") {\n sections.push(parseGroupField(field, sections.length + 1));\n continue;\n }\n if (field.name.value === \"root\") {\n const section = ensureDefaultSection(sections);\n section.roots ??= [];\n section.roots.push(parseRootField(field, section.roots.length + 1));\n continue;\n }\n\n throw parseError(\n field.name.line,\n `Unsupported workspace DSL line: ${field.name.value}`,\n field.name.column,\n );\n }\n\n workspace.sections = sections;\n if (workspace.rail?.length === 0) delete workspace.rail;\n if (workspace.sections.length === 0) {\n throw parseError(1, \"Workspace DSL must define at least one root\");\n }\n return workspace;\n}\n\nexport function formatWorkspaceDsl(source: string): string {\n const workspace = compileWorkspaceDsl(source);\n const lines = [\n `workspace ${quote(workspace.title ?? \"Workspace\")}${\n workspace.variant ? ` variant ${workspace.variant}` : \"\"\n } {`,\n ];\n if (workspace.description) lines.push(` description ${quote(workspace.description)}`);\n if (workspace.defaultPath) lines.push(` default ${quote(workspace.defaultPath)}`);\n if (workspace.detail?.renderer) {\n lines.push(\n ` detail ${workspace.detail.renderer}${\n workspace.detail.pattern ? ` pattern ${workspace.detail.pattern}` : \"\"\n }`,\n );\n }\n if (workspace.agent?.module) {\n lines.push(\n ` agent ${workspace.agent.module}${\n workspace.agent.title ? ` ${quote(workspace.agent.title)}` : \"\"\n }${workspace.agent.placeholder ? ` placeholder ${quote(workspace.agent.placeholder)}` : \"\"}`,\n );\n }\n for (const item of workspace.rail ?? []) {\n lines.push(\n ` rail ${quote(item.title)}${item.icon ? ` icon ${item.icon}` : \"\"}${\n item.href ? ` href ${quote(item.href)}` : \"\"\n }${item.active ? \" active\" : \"\"}`,\n );\n }\n\n const sections = workspace.sections ?? [];\n if (sections.length > 0) lines.push(\"\");\n sections.forEach((section, index) => {\n if (index > 0) lines.push(\"\");\n const sectionId = section.id && section.id !== slugify(section.title) ? `${section.id} ` : \"\";\n lines.push(` group ${sectionId}${quote(section.title)} {`);\n if (section.description) lines.push(` description ${quote(section.description)}`);\n for (const root of section.roots ?? []) {\n const options = [\n root.maxDepth !== undefined ? `depth ${root.maxDepth}` : undefined,\n root.itemStyle && root.itemStyle !== \"compact\" ? `style ${root.itemStyle}` : undefined,\n ...formatRootFilterOptions(root),\n root.description ? `description ${quote(root.description)}` : undefined,\n root.editable === true ? \"editable\" : root.editable === false ? \"readonly\" : undefined,\n ]\n .filter(Boolean)\n .join(\" \");\n const rootId = root.id && root.id !== slugify(root.title) ? `${root.id} ` : \"\";\n lines.push(\n ` root ${rootId}${quote(root.title)} from ${quote(root.path)}${options ? ` ${options}` : \"\"}`,\n );\n }\n lines.push(\" }\");\n });\n\n lines.push(\"}\");\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction ensureDefaultSection(sections: ScaffoldWorkspaceSection[]): ScaffoldWorkspaceSection {\n let section = sections[0];\n if (!section) {\n section = { id: \"workspace\", title: \"Workspace\", order: 1, roots: [] };\n sections.push(section);\n }\n return section;\n}\n\nfunction parseVariant(tokens: DslToken[]): string | undefined {\n if (tokens.length === 0) return undefined;\n if (tokens.length === 2 && tokens[0]?.type === \"word\" && tokens[0].value === \"variant\") {\n const variant = tokens[1];\n if (variant?.type === \"word\") return variant.value;\n }\n const token = tokens[0];\n throw parseError(token?.line ?? 1, 'Expected workspace \"Title\" [variant name] {', token?.column);\n}\n\nfunction parseDetailField(field: DslField): NonNullable<ScaffoldWorkspaceDefinition[\"detail\"]> {\n const renderer = field.values[0];\n if (\n renderer?.type !== \"word\" ||\n (renderer.value !== \"surface\" && renderer.value !== \"auto-surface\")\n ) {\n throw parseError(renderer?.line ?? field.name.line, \"Expected detail surface|auto-surface\");\n }\n\n const patternKeyword = field.values[1];\n const pattern = field.values[2];\n if (!patternKeyword) return { renderer: renderer.value };\n if (\n patternKeyword.type === \"word\" &&\n patternKeyword.value === \"pattern\" &&\n pattern?.type === \"word\"\n ) {\n return { renderer: renderer.value, pattern: pattern.value };\n }\n throw parseError(patternKeyword.line, \"Expected detail surface|auto-surface [pattern name]\");\n}\n\nfunction parseAgentField(field: DslField): NonNullable<ScaffoldWorkspaceDefinition[\"agent\"]> {\n const module = field.values[0];\n if (module?.type !== \"word\") {\n throw parseError(module?.line ?? field.name.line, 'Expected agent <module> [\"Title\"]');\n }\n\n let index = 1;\n let title: string | undefined;\n if (field.values[index]?.type === \"string\") {\n title = parseDslStringToken(field.values[index]!, parseSharedError);\n index += 1;\n }\n\n let placeholder: string | undefined;\n const placeholderKeyword = field.values[index];\n if (placeholderKeyword) {\n const value = field.values[index + 1];\n if (\n placeholderKeyword.type !== \"word\" ||\n placeholderKeyword.value !== \"placeholder\" ||\n value?.type !== \"string\"\n ) {\n throw parseError(\n placeholderKeyword.line,\n 'Expected agent <module> [\"Title\"] [placeholder \"...\"]',\n );\n }\n placeholder = parseDslStringToken(value, parseSharedError);\n index += 2;\n }\n if (field.values.length !== index) {\n const token = field.values[index]!;\n throw parseError(\n token.line,\n 'Expected agent <module> [\"Title\"] [placeholder \"...\"]',\n token.column,\n );\n }\n\n return {\n module: module.value,\n ...(title ? { title } : {}),\n ...(placeholder ? { placeholder } : {}),\n };\n}\n\nfunction parseRailField(field: DslField, order: number): ScaffoldWorkspaceRailItem {\n const titleToken = field.values[0];\n if (titleToken?.type !== \"string\") {\n throw parseError(titleToken?.line ?? field.name.line, 'Expected rail \"Title\"');\n }\n const title = parseDslStringToken(titleToken, parseSharedError);\n const rest = joinDslValues(field.values.slice(1));\n const icon = rest.match(/\\bicon\\s+([A-Za-z0-9_-]+)/);\n const href = rest.match(new RegExp(`\\\\bhref\\\\s+${STRING}`));\n return {\n id: slugify(title),\n title,\n ...(icon?.[1] ? { icon: icon[1] } : {}),\n ...(href?.[1] ? { href: unescapeString(href[1]) } : {}),\n ...(rest.match(/\\bactive\\b/) ? { active: true } : {}),\n order,\n };\n}\n\nfunction parseGroupField(field: DslField, order: number): ScaffoldWorkspaceSection {\n const parsed = parseOptionalIdTitleField(field, 'Expected group [id] \"Title\" {');\n const section: ScaffoldWorkspaceSection = {\n id: parsed.id ?? slugify(parsed.title),\n title: parsed.title,\n order,\n roots: [],\n };\n let rootOrder = 1;\n for (const child of field.children ?? []) {\n if (child.name.value === \"description\") {\n section.description = parseSingleStringField(child, 'Expected description \"<text>\"');\n continue;\n }\n if (child.name.value === \"root\") {\n section.roots?.push(parseRootField(child, rootOrder++));\n continue;\n }\n throw parseError(\n child.name.line,\n `Unsupported workspace group DSL line: ${child.name.value}`,\n child.name.column,\n );\n }\n return section;\n}\n\nfunction parseRootField(field: DslField, order: number): ScaffoldWorkspaceRoot {\n const parsed = parseOptionalIdTitleField(field, 'Expected root [id] \"Title\" from \"<path>\"');\n const from = field.values[parsed.nextIndex];\n const path = field.values[parsed.nextIndex + 1];\n if (from?.type !== \"word\" || from.value !== \"from\" || path?.type !== \"string\") {\n throw parseError(from?.line ?? field.name.line, 'Expected root [id] \"Title\" from \"<path>\"');\n }\n\n const rest = joinDslValues(field.values.slice(parsed.nextIndex + 2));\n const depth = rest.match(/\\bdepth\\s+(\\d+)/);\n const style = rest.match(/\\bstyle\\s+([A-Za-z0-9_-]+)/);\n const descriptionValue = rest.match(new RegExp(`\\\\bdescription\\\\s+${STRING}`));\n const excludes = parseStringListOption(rest, \"exclude\");\n const filter =\n excludes.length > 0\n ? { exclude: excludes }\n : rest.match(/\\bfilter\\s+none\\b/)\n ? undefined\n : { exclude: [\".aup\"] };\n const editable = rest.match(/\\beditable\\b/)\n ? true\n : rest.match(/\\breadonly\\b/)\n ? false\n : undefined;\n\n return {\n id: parsed.id ?? slugify(parsed.title),\n title: parsed.title,\n path: parseDslStringToken(path, parseSharedError),\n ...(descriptionValue?.[1] ? { description: unescapeString(descriptionValue[1]) } : {}),\n order,\n maxDepth: depth ? Number(depth[1]) : 1,\n layout: \"grouped\",\n itemStyle: style?.[1] ?? \"compact\",\n ...(filter ? { filter } : {}),\n sort: { field: \"id\" },\n ...(editable !== undefined ? { editable } : {}),\n };\n}\n\nfunction parseOptionalIdTitleField(\n field: DslField,\n message: string,\n): { id?: string; nextIndex: number; title: string } {\n const first = field.values[0];\n const second = field.values[1];\n if (first?.type === \"string\") {\n return { title: parseDslStringToken(first, parseSharedError), nextIndex: 1 };\n }\n if (first?.type === \"word\" && second?.type === \"string\") {\n return {\n id: first.value,\n title: parseDslStringToken(second, parseSharedError),\n nextIndex: 2,\n };\n }\n throw parseError(first?.line ?? field.name.line, message, first?.column ?? field.name.column);\n}\n\nfunction parseSingleStringField(field: DslField, message: string): string {\n const value = field.values[0];\n if (field.values.length !== 1 || value?.type !== \"string\") {\n throw parseError(value?.line ?? field.name.line, message, value?.column ?? field.name.column);\n }\n return parseDslStringToken(value, parseSharedError);\n}\n\nfunction joinDslValues(tokens: DslToken[]): string {\n return tokens.map((token) => token.value).join(\" \");\n}\n\nfunction parseSharedError(message: string, line: number, column = 1): Error {\n return parseError(line, message, column);\n}\n\nfunction unescapeString(value: string): string {\n return value.replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, \"\\\\\");\n}\n\nfunction quote(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction parseStringListOption(rest: string, option: string): string[] {\n const optionMatch = rest.match(new RegExp(`\\\\b${option}\\\\b`));\n if (!optionMatch || optionMatch.index === undefined) return [];\n const tail = rest.slice(optionMatch.index + option.length).trimStart();\n const nextKeywordIndex = tail.search(/\\s+(?:description|depth|style|editable|readonly|filter)\\b/);\n const valueSource = nextKeywordIndex >= 0 ? tail.slice(0, nextKeywordIndex) : tail;\n const values: string[] = [];\n for (const match of valueSource.matchAll(new RegExp(STRING, \"g\"))) {\n values.push(unescapeString(match[1] ?? \"\"));\n }\n return values;\n}\n\nfunction formatRootFilterOptions(root: ScaffoldWorkspaceRoot): string[] {\n if (!root.filter) return [\"filter none\"];\n if (typeof root.filter === \"string\") return [];\n const exclude = root.filter.exclude;\n if (!Array.isArray(exclude)) return [];\n const values = exclude.filter((value): value is string => typeof value === \"string\");\n if (values.length === 1 && values[0] === \".aup\") return [];\n return [`exclude ${values.map((value) => quote(value)).join(\" \")}`];\n}\n\nfunction slugify(value: string): string {\n return (\n value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\") || \"workspace\"\n );\n}\n\nfunction parseError(line: number, message: string, column = 1): Error {\n return scaffoldDslParseError(\"workspace\", line, message, column);\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
let ufo = require("ufo");
|
|
2
|
+
let _aigne_afs = require("@aigne/afs");
|
|
3
|
+
|
|
4
|
+
//#region src/scope/read-blocklet-scope.ts
|
|
5
|
+
/**
|
|
6
|
+
* Read /registry/blocklets/<name>/blocklet.yaml via globalAFS and return
|
|
7
|
+
* the declared scope. Falls back to "app" on any error — never throws.
|
|
8
|
+
*
|
|
9
|
+
* Scope routing must always have a defined value, so any failure
|
|
10
|
+
* (404, malformed YAML, invalid scope, unsafe blocklet name) collapses
|
|
11
|
+
* to the safe default. Callers downstream then route through an activator.
|
|
12
|
+
*/
|
|
13
|
+
const REGISTRY_PATH = "/registry/blocklets";
|
|
14
|
+
const MANIFEST_FILE = "blocklet.yaml";
|
|
15
|
+
const UTF8_DECODER = new TextDecoder();
|
|
16
|
+
async function readBlockletScope(globalAFS, blockletName) {
|
|
17
|
+
try {
|
|
18
|
+
if (typeof globalAFS.read !== "function") return "app";
|
|
19
|
+
const raw = ((await globalAFS.read((0, ufo.joinURL)(REGISTRY_PATH, blockletName, MANIFEST_FILE)))?.data)?.content;
|
|
20
|
+
const content = typeof raw === "string" ? raw : raw instanceof Uint8Array ? UTF8_DECODER.decode(raw) : null;
|
|
21
|
+
if (typeof content !== "string" || !content.trim()) return "app";
|
|
22
|
+
return (0, _aigne_afs.parseBlockletManifest)(content).scope ?? "app";
|
|
23
|
+
} catch {
|
|
24
|
+
return "app";
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
//#endregion
|
|
29
|
+
exports.readBlockletScope = readBlockletScope;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { BlockletScope } from "./types.cjs";
|
|
2
|
+
import { AFSRoot } from "@aigne/afs";
|
|
3
|
+
|
|
4
|
+
//#region src/scope/read-blocklet-scope.d.ts
|
|
5
|
+
declare function readBlockletScope(globalAFS: AFSRoot, blockletName: string): Promise<BlockletScope>;
|
|
6
|
+
//#endregion
|
|
7
|
+
export { readBlockletScope };
|
|
8
|
+
//# sourceMappingURL=read-blocklet-scope.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-blocklet-scope.d.cts","names":[],"sources":["../../src/scope/read-blocklet-scope.ts"],"mappings":";;;;iBAiBsB,iBAAA,CACpB,SAAA,EAAW,OAAA,EACX,YAAA,WACC,OAAA,CAAQ,aAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { BlockletScope } from "./types.mjs";
|
|
2
|
+
import { AFSRoot } from "@aigne/afs";
|
|
3
|
+
|
|
4
|
+
//#region src/scope/read-blocklet-scope.d.ts
|
|
5
|
+
declare function readBlockletScope(globalAFS: AFSRoot, blockletName: string): Promise<BlockletScope>;
|
|
6
|
+
//#endregion
|
|
7
|
+
export { readBlockletScope };
|
|
8
|
+
//# sourceMappingURL=read-blocklet-scope.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-blocklet-scope.d.mts","names":[],"sources":["../../src/scope/read-blocklet-scope.ts"],"mappings":";;;;iBAiBsB,iBAAA,CACpB,SAAA,EAAW,OAAA,EACX,YAAA,WACC,OAAA,CAAQ,aAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { joinURL } from "ufo";
|
|
2
|
+
import { parseBlockletManifest } from "@aigne/afs";
|
|
3
|
+
|
|
4
|
+
//#region src/scope/read-blocklet-scope.ts
|
|
5
|
+
/**
|
|
6
|
+
* Read /registry/blocklets/<name>/blocklet.yaml via globalAFS and return
|
|
7
|
+
* the declared scope. Falls back to "app" on any error — never throws.
|
|
8
|
+
*
|
|
9
|
+
* Scope routing must always have a defined value, so any failure
|
|
10
|
+
* (404, malformed YAML, invalid scope, unsafe blocklet name) collapses
|
|
11
|
+
* to the safe default. Callers downstream then route through an activator.
|
|
12
|
+
*/
|
|
13
|
+
const REGISTRY_PATH = "/registry/blocklets";
|
|
14
|
+
const MANIFEST_FILE = "blocklet.yaml";
|
|
15
|
+
const UTF8_DECODER = new TextDecoder();
|
|
16
|
+
async function readBlockletScope(globalAFS, blockletName) {
|
|
17
|
+
try {
|
|
18
|
+
if (typeof globalAFS.read !== "function") return "app";
|
|
19
|
+
const raw = ((await globalAFS.read(joinURL(REGISTRY_PATH, blockletName, MANIFEST_FILE)))?.data)?.content;
|
|
20
|
+
const content = typeof raw === "string" ? raw : raw instanceof Uint8Array ? UTF8_DECODER.decode(raw) : null;
|
|
21
|
+
if (typeof content !== "string" || !content.trim()) return "app";
|
|
22
|
+
return parseBlockletManifest(content).scope ?? "app";
|
|
23
|
+
} catch {
|
|
24
|
+
return "app";
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
//#endregion
|
|
29
|
+
export { readBlockletScope };
|
|
30
|
+
//# sourceMappingURL=read-blocklet-scope.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-blocklet-scope.mjs","names":[],"sources":["../../src/scope/read-blocklet-scope.ts"],"sourcesContent":["/**\n * Read /registry/blocklets/<name>/blocklet.yaml via globalAFS and return\n * the declared scope. Falls back to \"app\" on any error — never throws.\n *\n * Scope routing must always have a defined value, so any failure\n * (404, malformed YAML, invalid scope, unsafe blocklet name) collapses\n * to the safe default. Callers downstream then route through an activator.\n */\n\nimport { type AFSRoot, parseBlockletManifest } from \"@aigne/afs\";\nimport { joinURL } from \"ufo\";\nimport type { BlockletScope } from \"./types.js\";\n\nconst REGISTRY_PATH = \"/registry/blocklets\";\nconst MANIFEST_FILE = \"blocklet.yaml\";\nconst UTF8_DECODER = new TextDecoder();\n\nexport async function readBlockletScope(\n globalAFS: AFSRoot,\n blockletName: string,\n): Promise<BlockletScope> {\n try {\n if (typeof globalAFS.read !== \"function\") return \"app\";\n const result = await globalAFS.read(joinURL(REGISTRY_PATH, blockletName, MANIFEST_FILE));\n const raw = (result?.data as { content?: unknown } | undefined)?.content;\n const content =\n typeof raw === \"string\" ? raw : raw instanceof Uint8Array ? UTF8_DECODER.decode(raw) : null;\n if (typeof content !== \"string\" || !content.trim()) return \"app\";\n return parseBlockletManifest(content).scope ?? \"app\";\n } catch {\n return \"app\";\n }\n}\n"],"mappings":";;;;;;;;;;;;AAaA,MAAM,gBAAgB;AACtB,MAAM,gBAAgB;AACtB,MAAM,eAAe,IAAI,aAAa;AAEtC,eAAsB,kBACpB,WACA,cACwB;AACxB,KAAI;AACF,MAAI,OAAO,UAAU,SAAS,WAAY,QAAO;EAEjD,MAAM,QADS,MAAM,UAAU,KAAK,QAAQ,eAAe,cAAc,cAAc,CAAC,GACnE,OAA4C;EACjE,MAAM,UACJ,OAAO,QAAQ,WAAW,MAAM,eAAe,aAAa,aAAa,OAAO,IAAI,GAAG;AACzF,MAAI,OAAO,YAAY,YAAY,CAAC,QAAQ,MAAM,CAAE,QAAO;AAC3D,SAAO,sBAAsB,QAAQ,CAAC,SAAS;SACzC;AACN,SAAO"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
const require_read_blocklet_scope = require('./read-blocklet-scope.cjs');
|
|
2
|
+
let _aigne_afs = require("@aigne/afs");
|
|
3
|
+
|
|
4
|
+
//#region src/scope/resolve-scoped-afs.ts
|
|
5
|
+
/**
|
|
6
|
+
* Single source of truth for "given a blocklet, which AFS serves its requests?".
|
|
7
|
+
*
|
|
8
|
+
* Routing rules:
|
|
9
|
+
* scope: root → globalAFS pass-through, no activation, no wrapping
|
|
10
|
+
* scope: app → activator.ensureActivated() → runtime AFS
|
|
11
|
+
* scope: user → same as app; caller data is overlaid per session by SessionUserAFS
|
|
12
|
+
* scope: agent → same as app
|
|
13
|
+
*
|
|
14
|
+
* Failure modes (graceful, never throw on activation failure):
|
|
15
|
+
* - Activator missing for non-root scope → log warn, fall back to globalAFS
|
|
16
|
+
* - Activator returns null → log warn, fall back to globalAFS
|
|
17
|
+
*
|
|
18
|
+
* Adversarial: invalid blocklet names (path traversal, separators, null bytes,
|
|
19
|
+
* empty strings) reject synchronously before any I/O.
|
|
20
|
+
*
|
|
21
|
+
* Concurrency: parallel calls for the same (activator, blocklet) share a single
|
|
22
|
+
* activation promise so the activator is invoked at most once under contention.
|
|
23
|
+
*/
|
|
24
|
+
const log = (0, _aigne_afs.makeNsLog)("aos");
|
|
25
|
+
const BLOCKLET_NAME_RE = /^[A-Za-z0-9._-]+$/;
|
|
26
|
+
function validateBlockletName(name) {
|
|
27
|
+
if (typeof name !== "string" || name.length === 0) throw new _aigne_afs.AFSValidationError("Invalid blocklet name: empty or non-string");
|
|
28
|
+
if (name.includes("/") || name.includes("\\") || name.includes("\0")) throw new _aigne_afs.AFSValidationError(`Invalid blocklet name: contains path separator or null byte (${JSON.stringify(name)})`);
|
|
29
|
+
if (name === "." || name === "..") throw new _aigne_afs.AFSValidationError(`Invalid blocklet name: reserved (${JSON.stringify(name)})`);
|
|
30
|
+
if (!BLOCKLET_NAME_RE.test(name)) throw new _aigne_afs.AFSValidationError(`Invalid blocklet name: must match ${BLOCKLET_NAME_RE} (${JSON.stringify(name)})`);
|
|
31
|
+
}
|
|
32
|
+
const activationLocks = /* @__PURE__ */ new WeakMap();
|
|
33
|
+
function activateOnce(activator, blockletName) {
|
|
34
|
+
let perActivator = activationLocks.get(activator);
|
|
35
|
+
if (!perActivator) {
|
|
36
|
+
perActivator = /* @__PURE__ */ new Map();
|
|
37
|
+
activationLocks.set(activator, perActivator);
|
|
38
|
+
}
|
|
39
|
+
const inflight = perActivator.get(blockletName);
|
|
40
|
+
if (inflight) return inflight;
|
|
41
|
+
const promise = (async () => {
|
|
42
|
+
try {
|
|
43
|
+
return await activator.ensureActivated(blockletName);
|
|
44
|
+
} finally {
|
|
45
|
+
Promise.resolve().then(() => {
|
|
46
|
+
perActivator.delete(blockletName);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
})();
|
|
50
|
+
perActivator.set(blockletName, promise);
|
|
51
|
+
return promise;
|
|
52
|
+
}
|
|
53
|
+
async function resolveScopedAFS(input) {
|
|
54
|
+
const { globalAFS, blockletName, activator } = input;
|
|
55
|
+
validateBlockletName(blockletName);
|
|
56
|
+
const scope = input.scope ?? await require_read_blocklet_scope.readBlockletScope(globalAFS, blockletName);
|
|
57
|
+
if (scope === "root") return {
|
|
58
|
+
afs: globalAFS,
|
|
59
|
+
scope: "root",
|
|
60
|
+
isGlobal: true
|
|
61
|
+
};
|
|
62
|
+
if (!activator) {
|
|
63
|
+
log.warn(`[resolveScopedAFS] no activator provided for blocklet=${blockletName} scope=${scope}; falling back to globalAFS`);
|
|
64
|
+
return {
|
|
65
|
+
afs: globalAFS,
|
|
66
|
+
scope,
|
|
67
|
+
isGlobal: true
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const runtimeAFS = await activateOnce(activator, blockletName);
|
|
71
|
+
if (!runtimeAFS) {
|
|
72
|
+
log.warn(`[resolveScopedAFS] activator returned null for blocklet=${blockletName} scope=${scope}; falling back to globalAFS`);
|
|
73
|
+
return {
|
|
74
|
+
afs: globalAFS,
|
|
75
|
+
scope,
|
|
76
|
+
isGlobal: true
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
afs: runtimeAFS,
|
|
81
|
+
scope,
|
|
82
|
+
isGlobal: false
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
//#endregion
|
|
87
|
+
exports.resolveScopedAFS = resolveScopedAFS;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ResolveScopedAFSInput, ResolveScopedAFSResult } from "./types.cjs";
|
|
2
|
+
|
|
3
|
+
//#region src/scope/resolve-scoped-afs.d.ts
|
|
4
|
+
declare function resolveScopedAFS(input: ResolveScopedAFSInput): Promise<ResolveScopedAFSResult>;
|
|
5
|
+
//#endregion
|
|
6
|
+
export { resolveScopedAFS };
|
|
7
|
+
//# sourceMappingURL=resolve-scoped-afs.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-scoped-afs.d.cts","names":[],"sources":["../../src/scope/resolve-scoped-afs.ts"],"mappings":";;;iBA4EsB,gBAAA,CACpB,KAAA,EAAO,qBAAA,GACN,OAAA,CAAQ,sBAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ResolveScopedAFSInput, ResolveScopedAFSResult } from "./types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/scope/resolve-scoped-afs.d.ts
|
|
4
|
+
declare function resolveScopedAFS(input: ResolveScopedAFSInput): Promise<ResolveScopedAFSResult>;
|
|
5
|
+
//#endregion
|
|
6
|
+
export { resolveScopedAFS };
|
|
7
|
+
//# sourceMappingURL=resolve-scoped-afs.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-scoped-afs.d.mts","names":[],"sources":["../../src/scope/resolve-scoped-afs.ts"],"mappings":";;;iBA4EsB,gBAAA,CACpB,KAAA,EAAO,qBAAA,GACN,OAAA,CAAQ,sBAAA"}
|