@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,281 @@
|
|
|
1
|
+
import { createAfsBlockletReader, createMapBlockletReader } from "./registry.mjs";
|
|
2
|
+
import { joinURL } from "ufo";
|
|
3
|
+
import { normalizeId } from "@aigne/afs-did-space";
|
|
4
|
+
import { getRequestScope } from "@aigne/afs-logger";
|
|
5
|
+
import { time } from "@aigne/afs-timing";
|
|
6
|
+
|
|
7
|
+
//#region src/blocklet/did-space-registry.ts
|
|
8
|
+
/**
|
|
9
|
+
* DID-Space-backed BlockletRegistry — runtime-agnostic engine (#674 v2).
|
|
10
|
+
*
|
|
11
|
+
* Resolves blocklets published to a DID Space via the global resolve table
|
|
12
|
+
* (`resolve/blocklet/<id>` → { owner, path }, written by the did-space provider's
|
|
13
|
+
* blocklet write-hook) and reads their files back through AFS. This lives in
|
|
14
|
+
* @aigne/aos (NOT @aigne/afs-did-space) because it needs `createAfsBlockletReader`
|
|
15
|
+
* + the Blocklet types, and aos already depends on did-space — the reverse
|
|
16
|
+
* dependency would be a cycle. Both runtimes (Node + CF) depend on aos, so this
|
|
17
|
+
* engine is shared: each runtime injects only the two things it does
|
|
18
|
+
* differently — how to read the resolve table and how to open an owner's space.
|
|
19
|
+
*
|
|
20
|
+
* Lookup path:
|
|
21
|
+
* 1. resolver.resolveBlocklet(name) → { owner, path }
|
|
22
|
+
* 2. openUserSpace(owner) → AFS rooted at the owner's whole space
|
|
23
|
+
* 3. createAfsBlockletReader(afs, "/"+path) → file reader for the blocklet
|
|
24
|
+
*
|
|
25
|
+
* The engine is decoupled from any concrete class via two minimal structural
|
|
26
|
+
* interfaces (BlockletResolveSource + the loose BlockletAfsReader): a
|
|
27
|
+
* `DIDSpaceResolver` satisfies the former, a mounted `AFS` the latter.
|
|
28
|
+
*/
|
|
29
|
+
/**
|
|
30
|
+
* Publish-time serve bundle for a DID-Space blocklet (#674 Phase 4): small text
|
|
31
|
+
* files inlined so a cold serve reads one object instead of one-per-file. Sits
|
|
32
|
+
* at the blocklet root as the matched partner of the `.blocklet-publish.json`
|
|
33
|
+
* register marker (a distinct name — NOT http-mount's `.afs/bundle.json`, which
|
|
34
|
+
* is a different mechanism / consumer).
|
|
35
|
+
*/
|
|
36
|
+
const BLOCKLET_BUNDLE_PATH = ".blocklet-bundle.json";
|
|
37
|
+
const BUNDLE_DECODER = new TextDecoder();
|
|
38
|
+
/** Extract UTF-8 text from an AFS read result's `content` (string | bytes). */
|
|
39
|
+
function decodeAfsText(raw) {
|
|
40
|
+
const content = raw?.content;
|
|
41
|
+
if (typeof content === "string") return content;
|
|
42
|
+
if (content instanceof Uint8Array) return BUNDLE_DECODER.decode(content);
|
|
43
|
+
if (content instanceof ArrayBuffer) return BUNDLE_DECODER.decode(new Uint8Array(content));
|
|
44
|
+
return "";
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* A BlockletReader backed by a publish-time `.afs/bundle.json` (small text files
|
|
48
|
+
* inlined at publish; see `shouldBundle`) layered over the live per-file AFS
|
|
49
|
+
* reader — the fallback serves large/binary files (not bundled) and blocklets
|
|
50
|
+
* that have no bundle.
|
|
51
|
+
*
|
|
52
|
+
* Why this exists: blocklet serve is one-file-per-request, so a cold isolate's
|
|
53
|
+
* first page load of a many-file blocklet would otherwise do one object read per
|
|
54
|
+
* file. Reading the bundle once serves every small file from memory instead.
|
|
55
|
+
*
|
|
56
|
+
* Why it does NOT go stale (the trap #729 fell into): the reader is memoized per
|
|
57
|
+
* name for the isolate lifetime, but it never freezes content. Every call does a
|
|
58
|
+
* cheap `stat` of the bundle to read its cid (a fresh path→cid index lookup, no
|
|
59
|
+
* object read); the parsed map is memoized by that cid (immutable). An unchanged
|
|
60
|
+
* bundle skips the re-read/re-parse; a re-publish yields a new cid and is picked
|
|
61
|
+
* up on the very next request.
|
|
62
|
+
*/
|
|
63
|
+
function createBundleBackedReader(afs, root, fallback) {
|
|
64
|
+
const bundlePath = joinURL(root, BLOCKLET_BUNDLE_PATH);
|
|
65
|
+
let memoCid;
|
|
66
|
+
let memoReader;
|
|
67
|
+
async function currentBundle() {
|
|
68
|
+
const rc = getRequestScope();
|
|
69
|
+
const rcKey = `bundle-cid:${bundlePath}`;
|
|
70
|
+
let cid;
|
|
71
|
+
if (rc?.has(rcKey)) cid = rc.get(rcKey);
|
|
72
|
+
else {
|
|
73
|
+
try {
|
|
74
|
+
const meta = (await afs.stat(bundlePath, {
|
|
75
|
+
includeActions: "none",
|
|
76
|
+
noReadFallback: true
|
|
77
|
+
}))?.data?.meta;
|
|
78
|
+
cid = meta?.version ?? meta?.cid;
|
|
79
|
+
} catch {
|
|
80
|
+
cid = void 0;
|
|
81
|
+
}
|
|
82
|
+
rc?.set(rcKey, cid);
|
|
83
|
+
}
|
|
84
|
+
if (!cid) {
|
|
85
|
+
memoCid = void 0;
|
|
86
|
+
memoReader = void 0;
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (cid === memoCid && memoReader) return memoReader;
|
|
90
|
+
try {
|
|
91
|
+
memoReader = createMapBlockletReader(JSON.parse(decodeAfsText((await afs.read(bundlePath, { includeActions: "none" }))?.data)));
|
|
92
|
+
memoCid = cid;
|
|
93
|
+
return memoReader;
|
|
94
|
+
} catch {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const reader = {
|
|
99
|
+
async exists(relPath) {
|
|
100
|
+
const b = await currentBundle();
|
|
101
|
+
if (b && await b.exists(relPath)) return true;
|
|
102
|
+
return fallback.exists(relPath);
|
|
103
|
+
},
|
|
104
|
+
async readText(relPath) {
|
|
105
|
+
const b = await currentBundle();
|
|
106
|
+
if (b) {
|
|
107
|
+
const v = await b.readText(relPath);
|
|
108
|
+
if (v !== void 0) return v;
|
|
109
|
+
}
|
|
110
|
+
return fallback.readText(relPath);
|
|
111
|
+
},
|
|
112
|
+
async readBytes(relPath) {
|
|
113
|
+
const b = await currentBundle();
|
|
114
|
+
if (b) {
|
|
115
|
+
const v = await b.readBytes(relPath);
|
|
116
|
+
if (v !== void 0) return v;
|
|
117
|
+
}
|
|
118
|
+
return fallback.readBytes(relPath);
|
|
119
|
+
},
|
|
120
|
+
async hasDir(relDir) {
|
|
121
|
+
const b = await currentBundle();
|
|
122
|
+
if (b && await b.hasDir(relDir)) return true;
|
|
123
|
+
return fallback.hasDir(relDir);
|
|
124
|
+
},
|
|
125
|
+
async listDir(relDir) {
|
|
126
|
+
const b = await currentBundle();
|
|
127
|
+
const fromBundle = b ? await b.listDir(relDir) : [];
|
|
128
|
+
const fromFallback = await fallback.listDir(relDir);
|
|
129
|
+
return [...new Set([...fromBundle, ...fromFallback])];
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
if (fallback.listEntries) reader.listEntries = (relDir) => fallback.listEntries(relDir);
|
|
133
|
+
return reader;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Create a runtime-agnostic DID-Space BlockletRegistry. Positive resolves are
|
|
137
|
+
* cached per-instance; misses are NOT cached, so a newly published blocklet is
|
|
138
|
+
* visible on the next lookup.
|
|
139
|
+
*/
|
|
140
|
+
function createDidSpaceBlockletRegistry(deps) {
|
|
141
|
+
const { resolver, openUserSpace } = deps;
|
|
142
|
+
const warn = deps.onWarn ?? (() => {});
|
|
143
|
+
const entryCache = /* @__PURE__ */ new Map();
|
|
144
|
+
async function lookup(name) {
|
|
145
|
+
const cached = entryCache.get(name);
|
|
146
|
+
if (cached !== void 0) return cached;
|
|
147
|
+
const rc = getRequestScope();
|
|
148
|
+
const rcKey = `blocklet-lookup:${name}`;
|
|
149
|
+
if (rc?.has(rcKey)) return rc.get(rcKey);
|
|
150
|
+
const result = await lookupUncached(name);
|
|
151
|
+
rc?.set(rcKey, result);
|
|
152
|
+
return result;
|
|
153
|
+
}
|
|
154
|
+
async function lookupUncached(name) {
|
|
155
|
+
if (resolver.resolveBlockletOrDomain) try {
|
|
156
|
+
const r = await resolver.resolveBlockletOrDomain(name);
|
|
157
|
+
if (!r) return null;
|
|
158
|
+
const result = r.source === "blocklet" ? {
|
|
159
|
+
owner: r.owner,
|
|
160
|
+
path: r.path ?? "",
|
|
161
|
+
canonicalName: name
|
|
162
|
+
} : {
|
|
163
|
+
owner: r.owner,
|
|
164
|
+
path: r.path ?? "",
|
|
165
|
+
canonicalName: normalizeId(r.did)
|
|
166
|
+
};
|
|
167
|
+
entryCache.set(name, result);
|
|
168
|
+
return result;
|
|
169
|
+
} catch (err) {
|
|
170
|
+
warn(`resolveBlockletOrDomain("${name}") failed: ${err instanceof Error ? err.message : err}`);
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
try {
|
|
174
|
+
const entry = await resolver.resolveBlocklet(name);
|
|
175
|
+
if (entry?.owner) {
|
|
176
|
+
const result = {
|
|
177
|
+
owner: entry.owner,
|
|
178
|
+
path: entry.path ?? "",
|
|
179
|
+
canonicalName: name
|
|
180
|
+
};
|
|
181
|
+
entryCache.set(name, result);
|
|
182
|
+
return result;
|
|
183
|
+
}
|
|
184
|
+
} catch (err) {
|
|
185
|
+
warn(`resolveBlocklet("${name}") failed: ${err instanceof Error ? err.message : err}`);
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
if (!resolver.resolveDomain) return null;
|
|
189
|
+
try {
|
|
190
|
+
const domainEntry = await resolver.resolveDomain(name);
|
|
191
|
+
if (!domainEntry?.owner) return null;
|
|
192
|
+
const result = {
|
|
193
|
+
owner: domainEntry.owner,
|
|
194
|
+
path: domainEntry.path ?? "",
|
|
195
|
+
canonicalName: normalizeId(domainEntry.did)
|
|
196
|
+
};
|
|
197
|
+
entryCache.set(name, result);
|
|
198
|
+
return result;
|
|
199
|
+
} catch (err) {
|
|
200
|
+
warn(`resolveDomain("${name}") failed: ${err instanceof Error ? err.message : err}`);
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return {
|
|
205
|
+
source: "remote",
|
|
206
|
+
async list() {
|
|
207
|
+
try {
|
|
208
|
+
return (await resolver.listBlocklets()).map((b) => b.id);
|
|
209
|
+
} catch {
|
|
210
|
+
return [];
|
|
211
|
+
}
|
|
212
|
+
},
|
|
213
|
+
async resolveName(name) {
|
|
214
|
+
return (await lookup(name))?.canonicalName ?? null;
|
|
215
|
+
},
|
|
216
|
+
async reader(name) {
|
|
217
|
+
const entry = await lookup(name);
|
|
218
|
+
if (!entry) return null;
|
|
219
|
+
try {
|
|
220
|
+
const afs = await openUserSpace(entry.owner);
|
|
221
|
+
const root = joinURL("/", entry.path);
|
|
222
|
+
return createBundleBackedReader(afs, root, createAfsBlockletReader(afs, root));
|
|
223
|
+
} catch (err) {
|
|
224
|
+
warn(`reader("${name}") failed: ${err instanceof Error ? err.message : err}`);
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
async afsRoot(name) {
|
|
229
|
+
const entry = await lookup(name);
|
|
230
|
+
if (!entry) return null;
|
|
231
|
+
try {
|
|
232
|
+
return {
|
|
233
|
+
afs: await openUserSpace(entry.owner),
|
|
234
|
+
rootPath: joinURL("/", entry.path)
|
|
235
|
+
};
|
|
236
|
+
} catch (err) {
|
|
237
|
+
warn(`afsRoot("${name}") failed: ${err instanceof Error ? err.message : err}`);
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Combine a static-bundle registry with a fallback registry (e.g. DID Space).
|
|
245
|
+
*
|
|
246
|
+
* The static bundle always wins — the fallback is only tried when the static
|
|
247
|
+
* registry returns null/empty. This preserves zero-regression for existing
|
|
248
|
+
* built-in blocklets. Fully generic (composes two BlockletRegistry objects).
|
|
249
|
+
*/
|
|
250
|
+
function createCompositeBlockletRegistry(staticRegistry, fallbackRegistry) {
|
|
251
|
+
if (!fallbackRegistry) return staticRegistry;
|
|
252
|
+
return {
|
|
253
|
+
source: "remote",
|
|
254
|
+
async list() {
|
|
255
|
+
const [staticNames, fallbackNames] = await Promise.all([staticRegistry.list(), fallbackRegistry.list()]);
|
|
256
|
+
const seen = new Set(staticNames);
|
|
257
|
+
const merged = [...staticNames];
|
|
258
|
+
for (const name of fallbackNames) if (!seen.has(name)) merged.push(name);
|
|
259
|
+
return merged;
|
|
260
|
+
},
|
|
261
|
+
async resolveName(name) {
|
|
262
|
+
const staticResult = await staticRegistry.resolveName?.(name);
|
|
263
|
+
if (staticResult) return staticResult;
|
|
264
|
+
return fallbackRegistry.resolveName?.(name) ?? null;
|
|
265
|
+
},
|
|
266
|
+
async reader(name) {
|
|
267
|
+
const staticReader = await time("resolve.static", () => staticRegistry.reader(name));
|
|
268
|
+
if (staticReader) return staticReader;
|
|
269
|
+
return time("resolve.didspace", () => fallbackRegistry.reader(name));
|
|
270
|
+
},
|
|
271
|
+
async afsRoot(name) {
|
|
272
|
+
const staticRoot = await staticRegistry.afsRoot?.(name);
|
|
273
|
+
if (staticRoot) return staticRoot;
|
|
274
|
+
return await fallbackRegistry.afsRoot?.(name) ?? null;
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
//#endregion
|
|
280
|
+
export { BLOCKLET_BUNDLE_PATH, createCompositeBlockletRegistry, createDidSpaceBlockletRegistry };
|
|
281
|
+
//# sourceMappingURL=did-space-registry.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"did-space-registry.mjs","names":[],"sources":["../../src/blocklet/did-space-registry.ts"],"sourcesContent":["/**\n * DID-Space-backed BlockletRegistry — runtime-agnostic engine (#674 v2).\n *\n * Resolves blocklets published to a DID Space via the global resolve table\n * (`resolve/blocklet/<id>` → { owner, path }, written by the did-space provider's\n * blocklet write-hook) and reads their files back through AFS. This lives in\n * @aigne/aos (NOT @aigne/afs-did-space) because it needs `createAfsBlockletReader`\n * + the Blocklet types, and aos already depends on did-space — the reverse\n * dependency would be a cycle. Both runtimes (Node + CF) depend on aos, so this\n * engine is shared: each runtime injects only the two things it does\n * differently — how to read the resolve table and how to open an owner's space.\n *\n * Lookup path:\n * 1. resolver.resolveBlocklet(name) → { owner, path }\n * 2. openUserSpace(owner) → AFS rooted at the owner's whole space\n * 3. createAfsBlockletReader(afs, \"/\"+path) → file reader for the blocklet\n *\n * The engine is decoupled from any concrete class via two minimal structural\n * interfaces (BlockletResolveSource + the loose BlockletAfsReader): a\n * `DIDSpaceResolver` satisfies the former, a mounted `AFS` the latter.\n */\n\nimport { normalizeId } from \"@aigne/afs-did-space\";\nimport { getRequestScope } from \"@aigne/afs-logger\";\nimport { time } from \"@aigne/afs-timing\";\nimport { joinURL } from \"ufo\";\nimport {\n type BlockletAfsReader,\n type BlockletReader,\n type BlockletRegistry,\n createAfsBlockletReader,\n createMapBlockletReader,\n} from \"./registry.js\";\n\n/**\n * Publish-time serve bundle for a DID-Space blocklet (#674 Phase 4): small text\n * files inlined so a cold serve reads one object instead of one-per-file. Sits\n * at the blocklet root as the matched partner of the `.blocklet-publish.json`\n * register marker (a distinct name — NOT http-mount's `.afs/bundle.json`, which\n * is a different mechanism / consumer).\n */\nexport const BLOCKLET_BUNDLE_PATH = \".blocklet-bundle.json\";\n\nconst BUNDLE_DECODER = new TextDecoder();\n\n/** Extract UTF-8 text from an AFS read result's `content` (string | bytes). */\nfunction decodeAfsText(raw: unknown): string {\n const content = (raw as { content?: unknown } | null | undefined)?.content;\n if (typeof content === \"string\") return content;\n if (content instanceof Uint8Array) return BUNDLE_DECODER.decode(content);\n if (content instanceof ArrayBuffer) return BUNDLE_DECODER.decode(new Uint8Array(content));\n return \"\";\n}\n\n/**\n * A BlockletReader backed by a publish-time `.afs/bundle.json` (small text files\n * inlined at publish; see `shouldBundle`) layered over the live per-file AFS\n * reader — the fallback serves large/binary files (not bundled) and blocklets\n * that have no bundle.\n *\n * Why this exists: blocklet serve is one-file-per-request, so a cold isolate's\n * first page load of a many-file blocklet would otherwise do one object read per\n * file. Reading the bundle once serves every small file from memory instead.\n *\n * Why it does NOT go stale (the trap #729 fell into): the reader is memoized per\n * name for the isolate lifetime, but it never freezes content. Every call does a\n * cheap `stat` of the bundle to read its cid (a fresh path→cid index lookup, no\n * object read); the parsed map is memoized by that cid (immutable). An unchanged\n * bundle skips the re-read/re-parse; a re-publish yields a new cid and is picked\n * up on the very next request.\n */\nfunction createBundleBackedReader(\n afs: BlockletAfsReader,\n root: string,\n fallback: BlockletReader,\n): BlockletReader {\n const bundlePath = joinURL(root, BLOCKLET_BUNDLE_PATH);\n let memoCid: string | undefined;\n let memoReader: BlockletReader | undefined;\n\n async function currentBundle(): Promise<BlockletReader | undefined> {\n // The bundle cid is re-`stat`ed on every reader op so a re-publish is picked\n // up (see doc above) — but within ONE request nothing can re-publish, and a\n // no-bundle blocklet pays that miss `stat` (get + isDirectory probe = 2 D1)\n // per op (detectBlockletPattern.exists + loadManifest.readText + …). Memo the\n // cid per REQUEST (issue #808 #5): zero staleness (cross-request stat still\n // runs → freshness kept), just no intra-request repeats.\n const rc = getRequestScope();\n const rcKey = `bundle-cid:${bundlePath}`;\n let cid: string | undefined;\n if (rc?.has(rcKey)) {\n cid = rc.get(rcKey) as string | undefined;\n } else {\n try {\n // noReadFallback: a bundle-less blocklet's stat miss must NOT trigger the\n // core's read() double-check — it would only miss again (issue #808,\n // halves the cold D1 on a DID-space serve without a bundle).\n const meta = (await afs.stat(bundlePath, { includeActions: \"none\", noReadFallback: true }))\n ?.data?.meta as { version?: string; cid?: string } | undefined;\n cid = meta?.version ?? meta?.cid;\n } catch {\n cid = undefined;\n }\n rc?.set(rcKey, cid);\n }\n if (!cid) {\n memoCid = undefined;\n memoReader = undefined;\n return undefined; // no bundle → per-file fallback\n }\n if (cid === memoCid && memoReader) return memoReader;\n try {\n const files = JSON.parse(\n decodeAfsText((await afs.read(bundlePath, { includeActions: \"none\" }))?.data),\n ) as Record<string, string>;\n memoReader = createMapBlockletReader(files);\n memoCid = cid;\n return memoReader;\n } catch {\n return undefined; // unreadable/corrupt bundle → per-file fallback\n }\n }\n\n const reader: BlockletReader = {\n async exists(relPath) {\n const b = await currentBundle();\n if (b && (await b.exists(relPath))) return true;\n return fallback.exists(relPath);\n },\n async readText(relPath) {\n const b = await currentBundle();\n if (b) {\n const v = await b.readText(relPath);\n if (v !== undefined) return v;\n }\n return fallback.readText(relPath);\n },\n async readBytes(relPath) {\n const b = await currentBundle();\n if (b) {\n const v = await b.readBytes(relPath);\n if (v !== undefined) return v;\n }\n return fallback.readBytes(relPath);\n },\n async hasDir(relDir) {\n const b = await currentBundle();\n if (b && (await b.hasDir(relDir))) return true;\n return fallback.hasDir(relDir);\n },\n async listDir(relDir) {\n const b = await currentBundle();\n const fromBundle = b ? await b.listDir(relDir) : [];\n const fromFallback = await fallback.listDir(relDir);\n return [...new Set([...fromBundle, ...fromFallback])];\n },\n };\n\n // `detectBlockletPattern` needs each root entry's name + kind (metadata), NOT\n // file CONTENT — and one `afs.list` of the root is complete for large + small\n // files alike. So forward `listEntries` straight to the inner AFS reader,\n // bypassing the bundle entirely: this avoids BOTH the bundle stat/read AND the\n // per-file MISS stats `exists`/`hasDir` fall back to (a bundle-less blocklet\n // like arcblock paid 4 serial cold stats here — issue #808 `resolve.pattern`).\n // Only exposed when the inner reader supports it, so detectBlockletPattern's\n // sequential fallback still fires for readers that don't.\n if (fallback.listEntries) {\n reader.listEntries = (relDir) => fallback.listEntries!(relDir);\n }\n return reader;\n}\n\n/**\n * Minimal resolve-table surface the engine needs. `DIDSpaceResolver`\n * (@aigne/afs-did-space) satisfies this structurally — typed here so aos doesn't\n * import the concrete class just for two methods.\n *\n * `resolveDomain` is OPTIONAL (#764 Phase 4b): a custom-domain fallback for\n * `lookup()` when the id-keyed `resolveBlocklet` misses. Optional so any other\n * structural implementer of this interface (e.g. a test fake, or a future\n * resolve-table backend that never grew domain support) degrades gracefully —\n * `lookup()` just skips straight to \"not found\" instead of throwing.\n */\nexport interface BlockletResolveSource {\n resolveBlocklet(id: string): Promise<{ owner?: string; path?: string } | null>;\n listBlocklets(): Promise<Array<{ id: string }>>;\n resolveDomain?(domain: string): Promise<{ did: string; owner: string; path: string } | null>;\n /**\n * Optional batched host resolution (issue #808): one backend round trip for\n * BOTH the `resolve/blocklet/<name>` and `resolve/domain/<name>` lookups the\n * sequential `resolveBlocklet` → `resolveDomain` ladder below performs. Blocklet\n * wins (id key), same priority. Preferred when present; absent → the ladder\n * runs (any structural implementer without it still works). `DIDSpaceResolver`\n * satisfies it structurally on both the D1 (CF) and SQLite (Node) stores.\n */\n resolveBlockletOrDomain?(\n name: string,\n ): Promise<\n | { source: \"blocklet\"; owner: string; path: string }\n | { source: \"domain\"; owner: string; path: string; did: string }\n | null\n >;\n}\n\nexport interface DidSpaceBlockletRegistryDeps {\n /** Global DID Space resolve table (resolve/blocklet/<id> → {owner, path}). */\n resolver: BlockletResolveSource;\n /**\n * Open the whole user-space AFS for a publisher's PLAINTEXT owner DID. The\n * runtime constructs the backend (CloudflareDIDSpace / local) and may cache it.\n */\n openUserSpace: (ownerDid: string) => Promise<BlockletAfsReader> | BlockletAfsReader;\n /** Optional sink for non-fatal failures (resolve/read errors are swallowed). */\n onWarn?: (message: string) => void;\n}\n\n/**\n * Create a runtime-agnostic DID-Space BlockletRegistry. Positive resolves are\n * cached per-instance; misses are NOT cached, so a newly published blocklet is\n * visible on the next lookup.\n */\nexport function createDidSpaceBlockletRegistry(\n deps: DidSpaceBlockletRegistryDeps,\n): BlockletRegistry {\n const { resolver, openUserSpace } = deps;\n const warn = deps.onWarn ?? (() => {});\n const entryCache = new Map<string, { owner: string; path: string; canonicalName: string }>();\n\n /**\n * Resolve `name` to `{owner, path}` — id-keyed first, then (#764 Phase 4b)\n * a custom-domain fallback. `canonicalName` is the blocklet's actual id: on\n * an id-keyed hit that's `name` itself; on a domain-keyed hit it's derived\n * from the domain entry's `did` (`normalizeId` strips the `did:blocklet:`\n * prefix — same normalization `resolveInstanceId` uses, see design.md). This\n * matters because `resolveName`'s result is treated everywhere downstream as\n * \"the canonical blocklet name\" (routes, AUP render, logging, tenant\n * partitioning) — returning the raw domain string instead would make the\n * same blocklet disagree with itself depending on which host reached it.\n */\n type LookupResult = { owner: string; path: string; canonicalName: string } | null;\n\n async function lookup(name: string): Promise<LookupResult> {\n const cached = entryCache.get(name);\n if (cached !== undefined) return cached;\n // Per-request memo INCLUDING negatives (issue #808 #2): a host that isn't a\n // blocklet id gets looked up repeatedly in one request — patternCache\n // resolveName + reader each call lookup(), and the domain router resolves\n // host-context more than once — every miss re-hitting `resolve/blocklet` +\n // `resolve/domain` D1. An isolate-level negative cache would break \"a newly\n // published blocklet is visible on the next lookup\" (positives stay on\n // `entryCache`, misses are NOT cached there); scoping the miss to the\n // request is zero-staleness. Outside a request scope (CLI/tests) → no memo.\n const rc = getRequestScope();\n const rcKey = `blocklet-lookup:${name}`;\n if (rc?.has(rcKey)) return rc.get(rcKey) as LookupResult;\n const result = await lookupUncached(name);\n rc?.set(rcKey, result);\n return result;\n }\n\n async function lookupUncached(name: string): Promise<LookupResult> {\n // Preferred: one round trip for both keys (issue #808 serve batching). Same\n // blocklet-wins priority as the sequential ladder — just one query.\n if (resolver.resolveBlockletOrDomain) {\n try {\n const r = await resolver.resolveBlockletOrDomain(name);\n if (!r) return null;\n const result =\n r.source === \"blocklet\"\n ? { owner: r.owner, path: r.path ?? \"\", canonicalName: name }\n : { owner: r.owner, path: r.path ?? \"\", canonicalName: normalizeId(r.did) };\n entryCache.set(name, result);\n return result;\n } catch (err) {\n warn(\n `resolveBlockletOrDomain(\"${name}\") failed: ${err instanceof Error ? err.message : err}`,\n );\n return null;\n }\n }\n // Fallback ladder for resolvers without the batched method.\n try {\n const entry = await resolver.resolveBlocklet(name);\n if (entry?.owner) {\n const result = { owner: entry.owner, path: entry.path ?? \"\", canonicalName: name };\n entryCache.set(name, result);\n return result;\n }\n } catch (err) {\n warn(`resolveBlocklet(\"${name}\") failed: ${err instanceof Error ? err.message : err}`);\n return null;\n }\n if (!resolver.resolveDomain) return null;\n try {\n const domainEntry = await resolver.resolveDomain(name);\n if (!domainEntry?.owner) return null;\n const result = {\n owner: domainEntry.owner,\n path: domainEntry.path ?? \"\",\n canonicalName: normalizeId(domainEntry.did),\n };\n entryCache.set(name, result);\n return result;\n } catch (err) {\n warn(`resolveDomain(\"${name}\") failed: ${err instanceof Error ? err.message : err}`);\n return null;\n }\n }\n\n return {\n source: \"remote\",\n\n async list(): Promise<string[]> {\n try {\n return (await resolver.listBlocklets()).map((b) => b.id);\n } catch {\n return [];\n }\n },\n\n async resolveName(name: string): Promise<string | null> {\n const entry = await lookup(name);\n return entry?.canonicalName ?? null;\n },\n\n async reader(name: string): Promise<BlockletReader | null> {\n const entry = await lookup(name);\n if (!entry) return null;\n try {\n const afs = await openUserSpace(entry.owner);\n // `entry.path` is the scope-absolute tree path captured at publish time\n // (no leading slash); root the reader at `/<path>` in the owner's space.\n // Bundle-backed reader: serve small files from the publish-time\n // `.afs/bundle.json` (one object read warms them all) with a per-file AFS\n // fallback for large/binary files. It stays fresh by re-checking the\n // bundle's cid on each call, so no staleness (unlike the retired #729\n // path-keyed cache). Raw byte reuse below it is handled by the provider's\n // content-addressed (cid-keyed) cache — immutable, so never stale.\n const root = joinURL(\"/\", entry.path);\n return createBundleBackedReader(afs, root, createAfsBlockletReader(afs, root));\n } catch (err) {\n warn(`reader(\"${name}\") failed: ${err instanceof Error ? err.message : err}`);\n return null;\n }\n },\n\n async afsRoot(name: string): Promise<{ afs: BlockletAfsReader; rootPath: string } | null> {\n const entry = await lookup(name);\n if (!entry) return null;\n try {\n const afs = await openUserSpace(entry.owner);\n return { afs, rootPath: joinURL(\"/\", entry.path) };\n } catch (err) {\n warn(`afsRoot(\"${name}\") failed: ${err instanceof Error ? err.message : err}`);\n return null;\n }\n },\n };\n}\n\n/**\n * Combine a static-bundle registry with a fallback registry (e.g. DID Space).\n *\n * The static bundle always wins — the fallback is only tried when the static\n * registry returns null/empty. This preserves zero-regression for existing\n * built-in blocklets. Fully generic (composes two BlockletRegistry objects).\n */\nexport function createCompositeBlockletRegistry(\n staticRegistry: BlockletRegistry,\n fallbackRegistry: BlockletRegistry | null,\n): BlockletRegistry {\n if (!fallbackRegistry) return staticRegistry;\n\n return {\n source: \"remote\",\n\n async list(): Promise<string[]> {\n const [staticNames, fallbackNames] = await Promise.all([\n staticRegistry.list(),\n fallbackRegistry.list(),\n ]);\n const seen = new Set(staticNames);\n const merged = [...staticNames];\n for (const name of fallbackNames) {\n if (!seen.has(name)) merged.push(name);\n }\n return merged;\n },\n\n async resolveName(name: string): Promise<string | null> {\n const staticResult = await staticRegistry.resolveName?.(name);\n if (staticResult) return staticResult;\n return fallbackRegistry.resolveName?.(name) ?? null;\n },\n\n async reader(name: string): Promise<BlockletReader | null> {\n // Split cold-start attribution: `resolve.static` is the /registry-store\n // probe (a MISS for a DID-Space-published blocklet still pays the bundle\n // fetch — issue #808), `resolve.didspace` is the D1 lookup that actually\n // hits for those blocklets.\n const staticReader = await time(\"resolve.static\", () => staticRegistry.reader(name));\n if (staticReader) return staticReader;\n return time(\"resolve.didspace\", () => fallbackRegistry.reader(name));\n },\n\n async afsRoot(name: string) {\n const staticRoot = await staticRegistry.afsRoot?.(name);\n if (staticRoot) return staticRoot;\n return (await fallbackRegistry.afsRoot?.(name)) ?? null;\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/blocklet/handlers.ts
|
|
3
|
+
function toSummary(activated) {
|
|
4
|
+
const { info, domains } = activated;
|
|
5
|
+
return {
|
|
6
|
+
id: info.id,
|
|
7
|
+
name: info.name,
|
|
8
|
+
description: info.manifest.description,
|
|
9
|
+
source: info.source,
|
|
10
|
+
mountPath: info.mountPath,
|
|
11
|
+
domains,
|
|
12
|
+
sites: info.manifest.sites?.map((s) => ({
|
|
13
|
+
name: s.name,
|
|
14
|
+
...s.domain && { domain: s.domain },
|
|
15
|
+
...s.port && { port: s.port }
|
|
16
|
+
}))
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create a handler for `GET /.well-known/service/blocklets`.
|
|
21
|
+
* Returns a JSON array of activated blocklets (sanitized — no credentials).
|
|
22
|
+
*/
|
|
23
|
+
function blockletListHandler(getActivated) {
|
|
24
|
+
return async (request) => {
|
|
25
|
+
if (request.method !== "GET") return new Response(JSON.stringify({ error: "Method Not Allowed" }), {
|
|
26
|
+
status: 405,
|
|
27
|
+
headers: { "Content-Type": "application/json" }
|
|
28
|
+
});
|
|
29
|
+
const list = getActivated().map(toSummary);
|
|
30
|
+
return new Response(JSON.stringify(list), {
|
|
31
|
+
status: 200,
|
|
32
|
+
headers: { "Content-Type": "application/json" }
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Create a handler for `GET /.well-known/service/blocklets/:id`.
|
|
38
|
+
* Returns a single blocklet's details (sanitized).
|
|
39
|
+
*/
|
|
40
|
+
function blockletDetailHandler(getActivated) {
|
|
41
|
+
return async (request) => {
|
|
42
|
+
if (request.method !== "GET") return new Response(JSON.stringify({ error: "Method Not Allowed" }), {
|
|
43
|
+
status: 405,
|
|
44
|
+
headers: { "Content-Type": "application/json" }
|
|
45
|
+
});
|
|
46
|
+
const parts = new URL(request.url).pathname.split("/");
|
|
47
|
+
const blockletId = decodeURIComponent(parts[parts.length - 1] ?? "");
|
|
48
|
+
if (!blockletId) return new Response(JSON.stringify({ error: "Missing blocklet ID" }), {
|
|
49
|
+
status: 400,
|
|
50
|
+
headers: { "Content-Type": "application/json" }
|
|
51
|
+
});
|
|
52
|
+
const activated = getActivated().find((a) => a.info.id === blockletId || a.info.name === blockletId);
|
|
53
|
+
if (!activated) return new Response(JSON.stringify({ error: "Blocklet not found" }), {
|
|
54
|
+
status: 404,
|
|
55
|
+
headers: { "Content-Type": "application/json" }
|
|
56
|
+
});
|
|
57
|
+
return new Response(JSON.stringify(toSummary(activated)), {
|
|
58
|
+
status: 200,
|
|
59
|
+
headers: { "Content-Type": "application/json" }
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
//#endregion
|
|
65
|
+
exports.blockletDetailHandler = blockletDetailHandler;
|
|
66
|
+
exports.blockletListHandler = blockletListHandler;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ActivatedBlocklet } from "./types.cjs";
|
|
2
|
+
|
|
3
|
+
//#region src/blocklet/handlers.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Create a handler for `GET /.well-known/service/blocklets`.
|
|
6
|
+
* Returns a JSON array of activated blocklets (sanitized — no credentials).
|
|
7
|
+
*/
|
|
8
|
+
declare function blockletListHandler(getActivated: () => ActivatedBlocklet[]): (request: Request) => Promise<Response>;
|
|
9
|
+
/**
|
|
10
|
+
* Create a handler for `GET /.well-known/service/blocklets/:id`.
|
|
11
|
+
* Returns a single blocklet's details (sanitized).
|
|
12
|
+
*/
|
|
13
|
+
declare function blockletDetailHandler(getActivated: () => ActivatedBlocklet[]): (request: Request) => Promise<Response>;
|
|
14
|
+
//#endregion
|
|
15
|
+
export { blockletDetailHandler, blockletListHandler };
|
|
16
|
+
//# sourceMappingURL=handlers.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.d.cts","names":[],"sources":["../../src/blocklet/handlers.ts"],"mappings":";;;;;;;iBAyCgB,mBAAA,CACd,YAAA,QAAoB,iBAAA,MAClB,OAAA,EAAS,OAAA,KAAY,OAAA,CAAQ,QAAA;;;;;iBAqBjB,qBAAA,CACd,YAAA,QAAoB,iBAAA,MAClB,OAAA,EAAS,OAAA,KAAY,OAAA,CAAQ,QAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ActivatedBlocklet } from "./types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/blocklet/handlers.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Create a handler for `GET /.well-known/service/blocklets`.
|
|
6
|
+
* Returns a JSON array of activated blocklets (sanitized — no credentials).
|
|
7
|
+
*/
|
|
8
|
+
declare function blockletListHandler(getActivated: () => ActivatedBlocklet[]): (request: Request) => Promise<Response>;
|
|
9
|
+
/**
|
|
10
|
+
* Create a handler for `GET /.well-known/service/blocklets/:id`.
|
|
11
|
+
* Returns a single blocklet's details (sanitized).
|
|
12
|
+
*/
|
|
13
|
+
declare function blockletDetailHandler(getActivated: () => ActivatedBlocklet[]): (request: Request) => Promise<Response>;
|
|
14
|
+
//#endregion
|
|
15
|
+
export { blockletDetailHandler, blockletListHandler };
|
|
16
|
+
//# sourceMappingURL=handlers.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.d.mts","names":[],"sources":["../../src/blocklet/handlers.ts"],"mappings":";;;;;;;iBAyCgB,mBAAA,CACd,YAAA,QAAoB,iBAAA,MAClB,OAAA,EAAS,OAAA,KAAY,OAAA,CAAQ,QAAA;;;;;iBAqBjB,qBAAA,CACd,YAAA,QAAoB,iBAAA,MAClB,OAAA,EAAS,OAAA,KAAY,OAAA,CAAQ,QAAA"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
//#region src/blocklet/handlers.ts
|
|
2
|
+
function toSummary(activated) {
|
|
3
|
+
const { info, domains } = activated;
|
|
4
|
+
return {
|
|
5
|
+
id: info.id,
|
|
6
|
+
name: info.name,
|
|
7
|
+
description: info.manifest.description,
|
|
8
|
+
source: info.source,
|
|
9
|
+
mountPath: info.mountPath,
|
|
10
|
+
domains,
|
|
11
|
+
sites: info.manifest.sites?.map((s) => ({
|
|
12
|
+
name: s.name,
|
|
13
|
+
...s.domain && { domain: s.domain },
|
|
14
|
+
...s.port && { port: s.port }
|
|
15
|
+
}))
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Create a handler for `GET /.well-known/service/blocklets`.
|
|
20
|
+
* Returns a JSON array of activated blocklets (sanitized — no credentials).
|
|
21
|
+
*/
|
|
22
|
+
function blockletListHandler(getActivated) {
|
|
23
|
+
return async (request) => {
|
|
24
|
+
if (request.method !== "GET") return new Response(JSON.stringify({ error: "Method Not Allowed" }), {
|
|
25
|
+
status: 405,
|
|
26
|
+
headers: { "Content-Type": "application/json" }
|
|
27
|
+
});
|
|
28
|
+
const list = getActivated().map(toSummary);
|
|
29
|
+
return new Response(JSON.stringify(list), {
|
|
30
|
+
status: 200,
|
|
31
|
+
headers: { "Content-Type": "application/json" }
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Create a handler for `GET /.well-known/service/blocklets/:id`.
|
|
37
|
+
* Returns a single blocklet's details (sanitized).
|
|
38
|
+
*/
|
|
39
|
+
function blockletDetailHandler(getActivated) {
|
|
40
|
+
return async (request) => {
|
|
41
|
+
if (request.method !== "GET") return new Response(JSON.stringify({ error: "Method Not Allowed" }), {
|
|
42
|
+
status: 405,
|
|
43
|
+
headers: { "Content-Type": "application/json" }
|
|
44
|
+
});
|
|
45
|
+
const parts = new URL(request.url).pathname.split("/");
|
|
46
|
+
const blockletId = decodeURIComponent(parts[parts.length - 1] ?? "");
|
|
47
|
+
if (!blockletId) return new Response(JSON.stringify({ error: "Missing blocklet ID" }), {
|
|
48
|
+
status: 400,
|
|
49
|
+
headers: { "Content-Type": "application/json" }
|
|
50
|
+
});
|
|
51
|
+
const activated = getActivated().find((a) => a.info.id === blockletId || a.info.name === blockletId);
|
|
52
|
+
if (!activated) return new Response(JSON.stringify({ error: "Blocklet not found" }), {
|
|
53
|
+
status: 404,
|
|
54
|
+
headers: { "Content-Type": "application/json" }
|
|
55
|
+
});
|
|
56
|
+
return new Response(JSON.stringify(toSummary(activated)), {
|
|
57
|
+
status: 200,
|
|
58
|
+
headers: { "Content-Type": "application/json" }
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
//#endregion
|
|
64
|
+
export { blockletDetailHandler, blockletListHandler };
|
|
65
|
+
//# sourceMappingURL=handlers.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.mjs","names":[],"sources":["../../src/blocklet/handlers.ts"],"sourcesContent":["/**\n * AOS Blocklet HTTP handlers — list/detail endpoints.\n *\n * Returns JSON responses with blocklet metadata.\n * Credential/secret fields are stripped from the response.\n */\n\nimport type { ActivatedBlocklet } from \"./types.js\";\n\n/** Sanitized blocklet info for HTTP response (no credentials/secrets). */\ninterface BlockletSummary {\n id: string;\n name: string;\n description?: string;\n source: \"local\" | \"embedded\" | \"remote\";\n mountPath: string;\n domains: string[];\n sites?: Array<{ name: string; domain?: string; port?: number }>;\n}\n\nfunction toSummary(activated: ActivatedBlocklet): BlockletSummary {\n const { info, domains } = activated;\n return {\n id: info.id,\n name: info.name,\n description: info.manifest.description,\n source: info.source,\n mountPath: info.mountPath,\n domains,\n sites: info.manifest.sites?.map((s) => ({\n name: s.name,\n ...(s.domain && { domain: s.domain }),\n ...(s.port && { port: s.port }),\n })),\n };\n}\n\n/**\n * Create a handler for `GET /.well-known/service/blocklets`.\n * Returns a JSON array of activated blocklets (sanitized — no credentials).\n */\nexport function blockletListHandler(\n getActivated: () => ActivatedBlocklet[],\n): (request: Request) => Promise<Response> {\n return async (request: Request) => {\n if (request.method !== \"GET\") {\n return new Response(JSON.stringify({ error: \"Method Not Allowed\" }), {\n status: 405,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n const list = getActivated().map(toSummary);\n return new Response(JSON.stringify(list), {\n status: 200,\n headers: { \"Content-Type\": \"application/json\" },\n });\n };\n}\n\n/**\n * Create a handler for `GET /.well-known/service/blocklets/:id`.\n * Returns a single blocklet's details (sanitized).\n */\nexport function blockletDetailHandler(\n getActivated: () => ActivatedBlocklet[],\n): (request: Request) => Promise<Response> {\n return async (request: Request) => {\n if (request.method !== \"GET\") {\n return new Response(JSON.stringify({ error: \"Method Not Allowed\" }), {\n status: 405,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n const url = new URL(request.url);\n const parts = url.pathname.split(\"/\");\n const blockletId = decodeURIComponent(parts[parts.length - 1] ?? \"\");\n if (!blockletId) {\n return new Response(JSON.stringify({ error: \"Missing blocklet ID\" }), {\n status: 400,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n const activated = getActivated().find(\n (a) => a.info.id === blockletId || a.info.name === blockletId,\n );\n if (!activated) {\n return new Response(JSON.stringify({ error: \"Blocklet not found\" }), {\n status: 404,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n return new Response(JSON.stringify(toSummary(activated)), {\n status: 200,\n headers: { \"Content-Type\": \"application/json\" },\n });\n };\n}\n"],"mappings":";AAoBA,SAAS,UAAU,WAA+C;CAChE,MAAM,EAAE,MAAM,YAAY;AAC1B,QAAO;EACL,IAAI,KAAK;EACT,MAAM,KAAK;EACX,aAAa,KAAK,SAAS;EAC3B,QAAQ,KAAK;EACb,WAAW,KAAK;EAChB;EACA,OAAO,KAAK,SAAS,OAAO,KAAK,OAAO;GACtC,MAAM,EAAE;GACR,GAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ;GACpC,GAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM;GAC/B,EAAE;EACJ;;;;;;AAOH,SAAgB,oBACd,cACyC;AACzC,QAAO,OAAO,YAAqB;AACjC,MAAI,QAAQ,WAAW,MACrB,QAAO,IAAI,SAAS,KAAK,UAAU,EAAE,OAAO,sBAAsB,CAAC,EAAE;GACnE,QAAQ;GACR,SAAS,EAAE,gBAAgB,oBAAoB;GAChD,CAAC;EAGJ,MAAM,OAAO,cAAc,CAAC,IAAI,UAAU;AAC1C,SAAO,IAAI,SAAS,KAAK,UAAU,KAAK,EAAE;GACxC,QAAQ;GACR,SAAS,EAAE,gBAAgB,oBAAoB;GAChD,CAAC;;;;;;;AAQN,SAAgB,sBACd,cACyC;AACzC,QAAO,OAAO,YAAqB;AACjC,MAAI,QAAQ,WAAW,MACrB,QAAO,IAAI,SAAS,KAAK,UAAU,EAAE,OAAO,sBAAsB,CAAC,EAAE;GACnE,QAAQ;GACR,SAAS,EAAE,gBAAgB,oBAAoB;GAChD,CAAC;EAIJ,MAAM,QADM,IAAI,IAAI,QAAQ,IAAI,CACd,SAAS,MAAM,IAAI;EACrC,MAAM,aAAa,mBAAmB,MAAM,MAAM,SAAS,MAAM,GAAG;AACpE,MAAI,CAAC,WACH,QAAO,IAAI,SAAS,KAAK,UAAU,EAAE,OAAO,uBAAuB,CAAC,EAAE;GACpE,QAAQ;GACR,SAAS,EAAE,gBAAgB,oBAAoB;GAChD,CAAC;EAGJ,MAAM,YAAY,cAAc,CAAC,MAC9B,MAAM,EAAE,KAAK,OAAO,cAAc,EAAE,KAAK,SAAS,WACpD;AACD,MAAI,CAAC,UACH,QAAO,IAAI,SAAS,KAAK,UAAU,EAAE,OAAO,sBAAsB,CAAC,EAAE;GACnE,QAAQ;GACR,SAAS,EAAE,gBAAgB,oBAAoB;GAChD,CAAC;AAGJ,SAAO,IAAI,SAAS,KAAK,UAAU,UAAU,UAAU,CAAC,EAAE;GACxD,QAAQ;GACR,SAAS,EAAE,gBAAgB,oBAAoB;GAChD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ActivatedBlocklet, ActivationHooks, BlockletCredentialStore, BlockletInfo, BlockletLoader, TriggerSpec } from "./types.mjs";
|
|
2
|
+
import { ActivateBlockletOptions, activateBlocklet, deactivateBlocklet } from "./activation.mjs";
|
|
3
|
+
import { AfsBlockletRegistryOptions, BlockletAfsReader, BlockletPattern, BlockletPatternCache, BlockletPatternKind, BlockletReader, BlockletRegistry, TERMINAL_INDEX_FILES, createAfsBlockletReader, createAfsBlockletRegistry, createMapBlockletReader, createPatternCache, createStaticBlockletRegistry, detectBlockletPattern, normalizeRel } from "./registry.mjs";
|
|
4
|
+
import { BLOCKLET_BUNDLE_PATH, BlockletResolveSource, DidSpaceBlockletRegistryDeps, createCompositeBlockletRegistry, createDidSpaceBlockletRegistry } from "./did-space-registry.mjs";
|
|
5
|
+
import { blockletDetailHandler, blockletListHandler } from "./handlers.mjs";
|
|
6
|
+
import { BlockletManifest, parseBlockletManifest } from "./manifest.mjs";
|
|
7
|
+
import { StaticRenderResult, guessContentType, isConventionalAssetPath, renderStaticBlocklet, serveBlockletAsset } from "./static-render.mjs";
|