@nextclaw/app-runtime 0.9.13 → 0.9.15
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/README.md +2 -2
- package/dist/{main.js → app/main.js} +2 -2
- package/dist/app/main.js.map +1 -0
- package/dist/{commands → controllers}/create.controller.d.ts +2 -2
- package/dist/controllers/create.controller.d.ts.map +1 -0
- package/dist/{commands → controllers}/create.controller.js +2 -2
- package/dist/controllers/create.controller.js.map +1 -0
- package/dist/{commands → controllers}/dev.controller.js +1 -1
- package/dist/controllers/dev.controller.js.map +1 -0
- package/dist/{commands → controllers}/grant.controller.d.ts +3 -3
- package/dist/controllers/grant.controller.d.ts.map +1 -0
- package/dist/{commands → controllers}/grant.controller.js +2 -2
- package/dist/controllers/grant.controller.js.map +1 -0
- package/dist/{commands → controllers}/info.controller.d.ts +2 -2
- package/dist/controllers/info.controller.d.ts.map +1 -0
- package/dist/{commands → controllers}/info.controller.js +2 -2
- package/dist/controllers/info.controller.js.map +1 -0
- package/dist/{commands → controllers}/inspect.controller.js +8 -2
- package/dist/controllers/inspect.controller.js.map +1 -0
- package/dist/{commands → controllers}/install.controller.d.ts +2 -2
- package/dist/controllers/install.controller.d.ts.map +1 -0
- package/dist/{commands → controllers}/install.controller.js +2 -2
- package/dist/controllers/install.controller.js.map +1 -0
- package/dist/{commands → controllers}/list.controller.d.ts +2 -2
- package/dist/controllers/list.controller.d.ts.map +1 -0
- package/dist/{commands → controllers}/list.controller.js +2 -2
- package/dist/controllers/list.controller.js.map +1 -0
- package/dist/controllers/pack.controller.d.ts +19 -0
- package/dist/controllers/pack.controller.d.ts.map +1 -0
- package/dist/{commands → controllers}/pack.controller.js +8 -4
- package/dist/controllers/pack.controller.js.map +1 -0
- package/dist/{commands → controllers}/permissions.controller.d.ts +2 -2
- package/dist/controllers/permissions.controller.d.ts.map +1 -0
- package/dist/{commands → controllers}/permissions.controller.js +2 -2
- package/dist/controllers/permissions.controller.js.map +1 -0
- package/dist/{commands → controllers}/publish.controller.d.ts +3 -3
- package/dist/controllers/publish.controller.d.ts.map +1 -0
- package/dist/{commands → controllers}/publish.controller.js +2 -2
- package/dist/controllers/publish.controller.js.map +1 -0
- package/dist/{commands → controllers}/registry.controller.d.ts +2 -2
- package/dist/controllers/registry.controller.d.ts.map +1 -0
- package/dist/{commands → controllers}/registry.controller.js +2 -2
- package/dist/controllers/registry.controller.js.map +1 -0
- package/dist/{commands → controllers}/revoke.controller.d.ts +2 -2
- package/dist/controllers/revoke.controller.d.ts.map +1 -0
- package/dist/{commands → controllers}/revoke.controller.js +2 -2
- package/dist/controllers/revoke.controller.js.map +1 -0
- package/dist/{commands → controllers}/run.controller.js +8 -6
- package/dist/controllers/run.controller.js.map +1 -0
- package/dist/{commands → controllers}/uninstall.controller.d.ts +2 -2
- package/dist/controllers/uninstall.controller.d.ts.map +1 -0
- package/dist/{commands → controllers}/uninstall.controller.js +2 -2
- package/dist/controllers/uninstall.controller.js.map +1 -0
- package/dist/{commands → controllers}/update.controller.d.ts +2 -2
- package/dist/controllers/update.controller.d.ts.map +1 -0
- package/dist/{commands → controllers}/update.controller.js +2 -2
- package/dist/controllers/update.controller.js.map +1 -0
- package/dist/{commands → controllers}/validate-publish.controller.d.ts +3 -3
- package/dist/controllers/validate-publish.controller.d.ts.map +1 -0
- package/dist/{commands → controllers}/validate-publish.controller.js +9 -5
- package/dist/controllers/validate-publish.controller.js.map +1 -0
- package/dist/index.d.ts +51 -51
- package/dist/index.js +46 -45
- package/dist/package.js +1 -1
- package/dist/{runtime → services}/app-build.service.d.ts +2 -2
- package/dist/services/app-build.service.d.ts.map +1 -0
- package/dist/{runtime → services}/app-build.service.js +4 -2
- package/dist/services/app-build.service.js.map +1 -0
- package/dist/{bundle → services}/app-bundle.service.d.ts +18 -6
- package/dist/services/app-bundle.service.d.ts.map +1 -0
- package/dist/services/app-bundle.service.js +305 -0
- package/dist/services/app-bundle.service.js.map +1 -0
- package/dist/{permissions → services}/app-grant.service.d.ts +4 -4
- package/dist/services/app-grant.service.d.ts.map +1 -0
- package/dist/{permissions → services}/app-grant.service.js +7 -4
- package/dist/services/app-grant.service.js.map +1 -0
- package/dist/{paths → services}/app-home.service.d.ts +2 -1
- package/dist/services/app-home.service.d.ts.map +1 -0
- package/dist/{paths → services}/app-home.service.js +4 -1
- package/dist/services/app-home.service.js.map +1 -0
- package/dist/{host → services}/app-host.service.d.ts +2 -2
- package/dist/services/app-host.service.d.ts.map +1 -0
- package/dist/{host → services}/app-host.service.js +3 -3
- package/dist/services/app-host.service.js.map +1 -0
- package/dist/services/app-install-source.service.js +72 -0
- package/dist/services/app-install-source.service.js.map +1 -0
- package/dist/services/app-installation.service.d.ts +48 -0
- package/dist/services/app-installation.service.d.ts.map +1 -0
- package/dist/services/app-installation.service.js +411 -0
- package/dist/services/app-installation.service.js.map +1 -0
- package/dist/services/app-instance.service.d.ts +34 -0
- package/dist/services/app-instance.service.d.ts.map +1 -0
- package/dist/{host → services}/app-instance.service.js +4 -4
- package/dist/services/app-instance.service.js.map +1 -0
- package/dist/{manifest → services}/app-manifest.service.d.ts +12 -2
- package/dist/services/app-manifest.service.d.ts.map +1 -0
- package/dist/services/app-manifest.service.js +271 -0
- package/dist/services/app-manifest.service.js.map +1 -0
- package/dist/{publish → services}/app-marketplace-client.service.d.ts +2 -2
- package/dist/services/app-marketplace-client.service.d.ts.map +1 -0
- package/dist/{publish → services}/app-marketplace-client.service.js +2 -2
- package/dist/services/app-marketplace-client.service.js.map +1 -0
- package/dist/{publish → services}/app-marketplace-metadata.service.d.ts +7 -3
- package/dist/services/app-marketplace-metadata.service.d.ts.map +1 -0
- package/dist/{publish → services}/app-marketplace-metadata.service.js +45 -3
- package/dist/services/app-marketplace-metadata.service.js.map +1 -0
- package/dist/{permissions → services}/app-permissions.service.d.ts +3 -3
- package/dist/services/app-permissions.service.d.ts.map +1 -0
- package/dist/{permissions → services}/app-permissions.service.js +4 -1
- package/dist/services/app-permissions.service.js.map +1 -0
- package/dist/{publish → services}/app-publish-validation.service.d.ts +9 -7
- package/dist/services/app-publish-validation.service.d.ts.map +1 -0
- package/dist/{publish → services}/app-publish-validation.service.js +14 -10
- package/dist/services/app-publish-validation.service.js.map +1 -0
- package/dist/{publish → services}/app-publish.service.d.ts +5 -5
- package/dist/services/app-publish.service.d.ts.map +1 -0
- package/dist/{publish → services}/app-publish.service.js +10 -7
- package/dist/services/app-publish.service.js.map +1 -0
- package/dist/{registry → services}/app-registry-config.service.d.ts +3 -3
- package/dist/{registry → services}/app-registry-config.service.d.ts.map +1 -1
- package/dist/{registry → services}/app-registry-config.service.js +3 -3
- package/dist/services/app-registry-config.service.js.map +1 -0
- package/dist/{registry → services}/app-registry.service.d.ts +20 -5
- package/dist/services/app-registry.service.d.ts.map +1 -0
- package/dist/services/app-registry.service.js +228 -0
- package/dist/services/app-registry.service.js.map +1 -0
- package/dist/{registry → services}/app-remote-registry-client.service.d.ts +6 -2
- package/dist/services/app-remote-registry-client.service.d.ts.map +1 -0
- package/dist/{registry → services}/app-remote-registry-client.service.js +54 -8
- package/dist/services/app-remote-registry-client.service.js.map +1 -0
- package/dist/{cli → services}/app-runtime-cli.service.d.ts +1 -1
- package/dist/services/app-runtime-cli.service.d.ts.map +1 -0
- package/dist/{cli → services}/app-runtime-cli.service.js +19 -19
- package/dist/services/app-runtime-cli.service.js.map +1 -0
- package/dist/{cli → services}/app-runtime-options.service.d.ts +6 -6
- package/dist/services/app-runtime-options.service.d.ts.map +1 -0
- package/dist/{cli → services}/app-runtime-options.service.js +3 -9
- package/dist/services/app-runtime-options.service.js.map +1 -0
- package/dist/{runtime → services}/app-runtime-toolchain.service.d.ts +1 -1
- package/dist/services/app-runtime-toolchain.service.d.ts.map +1 -0
- package/dist/{runtime → services}/app-runtime-toolchain.service.js +1 -1
- package/dist/services/app-runtime-toolchain.service.js.map +1 -0
- package/dist/{scaffold → services}/app-scaffold.service.d.ts +1 -1
- package/dist/{scaffold → services}/app-scaffold.service.d.ts.map +1 -1
- package/dist/{scaffold → services}/app-scaffold.service.js +1 -1
- package/dist/{scaffold → services}/app-scaffold.service.js.map +1 -1
- package/dist/{scaffold → services}/app-ts-http-lite-scaffold-template.service.d.ts +1 -1
- package/dist/{scaffold → services}/app-ts-http-lite-scaffold-template.service.d.ts.map +1 -1
- package/dist/{scaffold → services}/app-ts-http-lite-scaffold-template.service.js +1 -1
- package/dist/{scaffold → services}/app-ts-http-lite-scaffold-template.service.js.map +1 -1
- package/dist/{scaffold → services}/app-ts-http-scaffold-template.service.d.ts +1 -1
- package/dist/{scaffold → services}/app-ts-http-scaffold-template.service.d.ts.map +1 -1
- package/dist/{scaffold → services}/app-ts-http-scaffold-template.service.js +1 -1
- package/dist/{scaffold → services}/app-ts-http-scaffold-template.service.js.map +1 -1
- package/dist/{bridge → services}/host-bridge.service.d.ts +2 -2
- package/dist/services/host-bridge.service.d.ts.map +1 -0
- package/dist/{bridge → services}/host-bridge.service.js +1 -1
- package/dist/services/host-bridge.service.js.map +1 -0
- package/dist/services/main-runner.service.d.ts +9 -0
- package/dist/services/main-runner.service.d.ts.map +1 -0
- package/dist/services/main-runner.service.js +6 -0
- package/dist/services/main-runner.service.js.map +1 -0
- package/dist/{publish → services}/platform-auth-state.service.d.ts +1 -1
- package/dist/services/platform-auth-state.service.d.ts.map +1 -0
- package/dist/{publish → services}/platform-auth-state.service.js +1 -1
- package/dist/services/platform-auth-state.service.js.map +1 -0
- package/dist/{ui → services}/ui-server.service.d.ts +3 -3
- package/dist/services/ui-server.service.d.ts.map +1 -0
- package/dist/{ui → services}/ui-server.service.js +1 -1
- package/dist/services/ui-server.service.js.map +1 -0
- package/dist/{runtime → services}/wasm-main-runner.service.d.ts +3 -3
- package/dist/services/wasm-main-runner.service.d.ts.map +1 -0
- package/dist/{runtime → services}/wasm-main-runner.service.js +2 -2
- package/dist/services/wasm-main-runner.service.js.map +1 -0
- package/dist/{sidecar → services}/wasm-sidecar-client.service.d.ts +1 -1
- package/dist/services/wasm-sidecar-client.service.d.ts.map +1 -0
- package/dist/{sidecar → services}/wasm-sidecar-client.service.js +1 -1
- package/dist/services/wasm-sidecar-client.service.js.map +1 -0
- package/dist/{runtime → services}/wasmtime-wasi-http-component.service.d.ts +1 -1
- package/dist/services/wasmtime-wasi-http-component.service.d.ts.map +1 -0
- package/dist/{runtime → services}/wasmtime-wasi-http-component.service.js +1 -1
- package/dist/services/wasmtime-wasi-http-component.service.js.map +1 -0
- package/dist/{bundle → types}/app-bundle.types.d.ts +1 -1
- package/dist/types/app-bundle.types.d.ts.map +1 -0
- package/dist/{install → types}/app-installation.types.d.ts +29 -7
- package/dist/types/app-installation.types.d.ts.map +1 -0
- package/dist/types/app-manifest.types.d.ts +119 -0
- package/dist/types/app-manifest.types.d.ts.map +1 -0
- package/dist/types/app-manifest.types.js +11 -0
- package/dist/types/app-manifest.types.js.map +1 -0
- package/dist/{permissions → types}/app-permissions.types.d.ts +2 -2
- package/dist/types/app-permissions.types.d.ts.map +1 -0
- package/dist/{publish → types}/app-publish.types.d.ts +11 -5
- package/dist/types/app-publish.types.d.ts.map +1 -0
- package/dist/{publish → types}/app-publish.types.js +1 -1
- package/dist/types/app-publish.types.js.map +1 -0
- package/dist/{registry → types}/app-registry.types.d.ts +11 -4
- package/dist/types/app-registry.types.d.ts.map +1 -0
- package/dist/{registry → types}/app-remote-registry.types.d.ts +3 -3
- package/dist/types/app-remote-registry.types.d.ts.map +1 -0
- package/dist/{registry → types}/app-remote-registry.types.js +1 -1
- package/dist/types/app-remote-registry.types.js.map +1 -0
- package/dist/{runtime → types}/main-runner.types.d.ts +3 -3
- package/dist/types/main-runner.types.d.ts.map +1 -0
- package/package.json +10 -3
- package/dist/bridge/host-bridge.service.d.ts.map +0 -1
- package/dist/bridge/host-bridge.service.js.map +0 -1
- package/dist/bundle/app-bundle.service.d.ts.map +0 -1
- package/dist/bundle/app-bundle.service.js +0 -196
- package/dist/bundle/app-bundle.service.js.map +0 -1
- package/dist/bundle/app-bundle.types.d.ts.map +0 -1
- package/dist/cli/app-runtime-cli.service.d.ts.map +0 -1
- package/dist/cli/app-runtime-cli.service.js.map +0 -1
- package/dist/cli/app-runtime-options.service.d.ts.map +0 -1
- package/dist/cli/app-runtime-options.service.js.map +0 -1
- package/dist/commands/create.controller.d.ts.map +0 -1
- package/dist/commands/create.controller.js.map +0 -1
- package/dist/commands/dev.controller.js.map +0 -1
- package/dist/commands/grant.controller.d.ts.map +0 -1
- package/dist/commands/grant.controller.js.map +0 -1
- package/dist/commands/info.controller.d.ts.map +0 -1
- package/dist/commands/info.controller.js.map +0 -1
- package/dist/commands/inspect.controller.js.map +0 -1
- package/dist/commands/install.controller.d.ts.map +0 -1
- package/dist/commands/install.controller.js.map +0 -1
- package/dist/commands/list.controller.d.ts.map +0 -1
- package/dist/commands/list.controller.js.map +0 -1
- package/dist/commands/pack.controller.d.ts +0 -17
- package/dist/commands/pack.controller.d.ts.map +0 -1
- package/dist/commands/pack.controller.js.map +0 -1
- package/dist/commands/permissions.controller.d.ts.map +0 -1
- package/dist/commands/permissions.controller.js.map +0 -1
- package/dist/commands/publish.controller.d.ts.map +0 -1
- package/dist/commands/publish.controller.js.map +0 -1
- package/dist/commands/registry.controller.d.ts.map +0 -1
- package/dist/commands/registry.controller.js.map +0 -1
- package/dist/commands/revoke.controller.d.ts.map +0 -1
- package/dist/commands/revoke.controller.js.map +0 -1
- package/dist/commands/run.controller.js.map +0 -1
- package/dist/commands/uninstall.controller.d.ts.map +0 -1
- package/dist/commands/uninstall.controller.js.map +0 -1
- package/dist/commands/update.controller.d.ts.map +0 -1
- package/dist/commands/update.controller.js.map +0 -1
- package/dist/commands/validate-publish.controller.d.ts.map +0 -1
- package/dist/commands/validate-publish.controller.js.map +0 -1
- package/dist/host/app-host.service.d.ts.map +0 -1
- package/dist/host/app-host.service.js.map +0 -1
- package/dist/host/app-instance.service.d.ts +0 -34
- package/dist/host/app-instance.service.d.ts.map +0 -1
- package/dist/host/app-instance.service.js.map +0 -1
- package/dist/install/app-installation.service.d.ts +0 -41
- package/dist/install/app-installation.service.d.ts.map +0 -1
- package/dist/install/app-installation.service.js +0 -276
- package/dist/install/app-installation.service.js.map +0 -1
- package/dist/install/app-installation.types.d.ts.map +0 -1
- package/dist/main.js.map +0 -1
- package/dist/manifest/app-manifest.service.d.ts.map +0 -1
- package/dist/manifest/app-manifest.service.js +0 -147
- package/dist/manifest/app-manifest.service.js.map +0 -1
- package/dist/manifest/app-manifest.types.d.ts +0 -68
- package/dist/manifest/app-manifest.types.d.ts.map +0 -1
- package/dist/paths/app-home.service.d.ts.map +0 -1
- package/dist/paths/app-home.service.js.map +0 -1
- package/dist/permissions/app-grant.service.d.ts.map +0 -1
- package/dist/permissions/app-grant.service.js.map +0 -1
- package/dist/permissions/app-permissions.service.d.ts.map +0 -1
- package/dist/permissions/app-permissions.service.js.map +0 -1
- package/dist/permissions/app-permissions.types.d.ts.map +0 -1
- package/dist/publish/app-marketplace-client.service.d.ts.map +0 -1
- package/dist/publish/app-marketplace-client.service.js.map +0 -1
- package/dist/publish/app-marketplace-metadata.service.d.ts.map +0 -1
- package/dist/publish/app-marketplace-metadata.service.js.map +0 -1
- package/dist/publish/app-publish-validation.service.d.ts.map +0 -1
- package/dist/publish/app-publish-validation.service.js.map +0 -1
- package/dist/publish/app-publish.service.d.ts.map +0 -1
- package/dist/publish/app-publish.service.js.map +0 -1
- package/dist/publish/app-publish.types.d.ts.map +0 -1
- package/dist/publish/app-publish.types.js.map +0 -1
- package/dist/publish/platform-auth-state.service.d.ts.map +0 -1
- package/dist/publish/platform-auth-state.service.js.map +0 -1
- package/dist/registry/app-registry-config.service.js.map +0 -1
- package/dist/registry/app-registry.service.d.ts.map +0 -1
- package/dist/registry/app-registry.service.js +0 -118
- package/dist/registry/app-registry.service.js.map +0 -1
- package/dist/registry/app-registry.types.d.ts.map +0 -1
- package/dist/registry/app-remote-registry-client.service.d.ts.map +0 -1
- package/dist/registry/app-remote-registry-client.service.js.map +0 -1
- package/dist/registry/app-remote-registry.types.d.ts.map +0 -1
- package/dist/registry/app-remote-registry.types.js.map +0 -1
- package/dist/runtime/app-build.service.d.ts.map +0 -1
- package/dist/runtime/app-build.service.js.map +0 -1
- package/dist/runtime/app-runtime-toolchain.service.d.ts.map +0 -1
- package/dist/runtime/app-runtime-toolchain.service.js.map +0 -1
- package/dist/runtime/main-runner.service.d.ts +0 -9
- package/dist/runtime/main-runner.service.d.ts.map +0 -1
- package/dist/runtime/main-runner.service.js +0 -6
- package/dist/runtime/main-runner.service.js.map +0 -1
- package/dist/runtime/main-runner.types.d.ts.map +0 -1
- package/dist/runtime/wasm-main-runner.service.d.ts.map +0 -1
- package/dist/runtime/wasm-main-runner.service.js.map +0 -1
- package/dist/runtime/wasmtime-wasi-http-component.service.d.ts.map +0 -1
- package/dist/runtime/wasmtime-wasi-http-component.service.js.map +0 -1
- package/dist/sidecar/wasm-sidecar-client.service.d.ts.map +0 -1
- package/dist/sidecar/wasm-sidecar-client.service.js.map +0 -1
- package/dist/ui/ui-server.service.d.ts.map +0 -1
- package/dist/ui/ui-server.service.js.map +0 -1
- /package/dist/{main.d.ts → app/main.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-ts-http-scaffold-template.service.js","names":[],"sources":["../../src/scaffold/app-ts-http-scaffold-template.service.ts"],"sourcesContent":["export type AppScaffoldFile = {\n relativePath: string;\n content: string | Buffer;\n};\n\nexport class AppTsHttpScaffoldTemplateService {\n buildFiles = (params: {\n appId: string;\n appName: string;\n }): AppScaffoldFile[] => {\n const { appId, appName } = params;\n return [\n {\n relativePath: \"manifest.json\",\n content: `${JSON.stringify(this.buildManifest(appId, appName), null, 2)}\\n`,\n },\n {\n relativePath: \"marketplace.json\",\n content: `${JSON.stringify(this.buildMarketplaceMetadata(appName), null, 2)}\\n`,\n },\n {\n relativePath: \"README.md\",\n content: this.buildReadme(appName, appId),\n },\n {\n relativePath: \"main/package.json\",\n content: `${JSON.stringify(this.buildMainPackageJson(appId), null, 2)}\\n`,\n },\n {\n relativePath: \"main/tsconfig.json\",\n content: `${JSON.stringify(this.buildTsconfig(), null, 2)}\\n`,\n },\n {\n relativePath: \"main/rolldown.config.mjs\",\n content: this.buildRolldownConfig(),\n },\n {\n relativePath: \"main/wit/world.wit\",\n content: this.buildWitWorld(),\n },\n {\n relativePath: \"main/src/component.ts\",\n content: this.buildComponentSource(),\n },\n {\n relativePath: \"main/app.wasm\",\n content: Buffer.from(APP_WASM_PLACEHOLDER_BASE64, \"base64\"),\n },\n {\n relativePath: \"ui/index.html\",\n content: this.buildUiHtml(appName),\n },\n {\n relativePath: \"ui/app.js\",\n content: this.buildUiScript(),\n },\n {\n relativePath: \"assets/icon.svg\",\n content: this.buildIconSvg(),\n },\n ];\n };\n\n private buildManifest = (appId: string, appName: string) => {\n return {\n schemaVersion: 1,\n id: appId,\n name: appName,\n version: \"0.1.0\",\n description: \"A TypeScript WASI HTTP NApp scaffold created by napp.\",\n icon: \"assets/icon.svg\",\n main: {\n kind: \"wasi-http-component\",\n entry: \"main/app.wasm\",\n },\n ui: {\n entry: \"ui/index.html\",\n },\n };\n };\n\n private buildMainPackageJson = (appId: string) => {\n return {\n name: `${appId.replace(/\\./g, \"-\")}-main`,\n version: \"0.1.0\",\n private: true,\n type: \"module\",\n scripts: {\n build: \"npm run prepare-wit && npm run guest-types && npm run typecheck && npm run bundle && npm run componentize\",\n \"prepare-wit\": \"wkg wit fetch\",\n \"guest-types\": \"jco guest-types wit --world-name napp-http --out-dir generated/types\",\n typecheck: \"tsc --noEmit\",\n bundle: \"rolldown -c\",\n componentize: \"jco componentize -w wit -n napp-http -o app.wasm dist/component.js\",\n },\n dependencies: {\n \"@bytecodealliance/jco-std\": \"^0.1.3\",\n hono: \"^4.10.0\",\n },\n devDependencies: {\n \"@bytecodealliance/componentize-js\": \"^0.20.0\",\n \"@bytecodealliance/jco\": \"^1.19.0\",\n rolldown: \"^1.0.0-rc.17\",\n typescript: \"^5.6.3\",\n },\n };\n };\n\n private buildTsconfig = () => {\n return {\n compilerOptions: {\n target: \"ES2022\",\n module: \"ESNext\",\n moduleResolution: \"Bundler\",\n strict: true,\n skipLibCheck: true,\n lib: [\"ES2022\", \"DOM\"],\n types: [\"./generated/types/interfaces/wasi-filesystem-preopens\", \"./generated/types/interfaces/wasi-filesystem-types\"],\n },\n include: [\"src/**/*.ts\"],\n };\n };\n\n private buildMarketplaceMetadata = (appName: string) => {\n return {\n slug: this.normalizeSlug(appName),\n summary: `A TypeScript WASI HTTP ${appName} scaffold created by napp.`,\n summaryI18n: {\n en: `A TypeScript WASI HTTP ${appName} scaffold created by napp.`,\n zh: `一个由 napp 创建的 TypeScript WASI HTTP ${appName} 应用骨架。`,\n },\n description: `A TypeScript NApp scaffold for ${appName}, designed for ordinary frontend-to-backend HTTP development on WASI components.`,\n descriptionI18n: {\n en: `A TypeScript NApp scaffold for ${appName}, designed for ordinary frontend-to-backend HTTP development on WASI components.`,\n zh: `一个面向 ${appName} 的 TypeScript NApp 应用骨架,用 WASI component 承载普通前后端 HTTP 开发心智。`,\n },\n author: \"NextClaw\",\n tags: [\"starter\", \"typescript\", \"wasi-http\", \"official\"],\n sourceRepo: \"https://github.com/Peiiii/nextclaw\",\n homepage: \"https://nextclaw.io\",\n featured: false,\n };\n };\n\n private buildReadme = (appName: string, appId: string): string => {\n return `# ${appName}\n\nThis app was created by \\`napp create --template ts-http\\`.\n\nIt keeps the existing NApp directory contract, while making \\`main/app.wasm\\` a WASI HTTP component.\n\n## App ID\n\n\\`${appId}\\`\n\n## Build the TypeScript backend\n\nRecommended:\n\n\\`\\`\\`bash\nnapp build . --install\n\\`\\`\\`\n\nManual equivalent:\n\n\\`\\`\\`bash\ncd main\nnpm install\nnpm run build\n\\`\\`\\`\n\nThe build writes the backend component to:\n\n\\`\\`\\`text\nmain/app.wasm\n\\`\\`\\`\n\nThe build uses the official Bytecode Alliance toolchain and expects \\`wkg\\` to be available for fetching WIT dependencies:\n\n\\`\\`\\`bash\ncargo install wkg\n\\`\\`\\`\n\n## Local workflow\n\n\\`\\`\\`bash\nnapp inspect .\nnapp run . --data ./data\n\\`\\`\\`\n\nThe runtime mounts the host data directory to guest \\`/data\\`. This example stores todos in:\n\n\\`\\`\\`text\n./data/todos.json\n\\`\\`\\`\n\nThe frontend can call the backend as ordinary same-origin HTTP:\n\n\\`\\`\\`js\nawait fetch(\"/api/todos\");\n\\`\\`\\`\n`;\n };\n\n private buildRolldownConfig = (): string => {\n return `export default {\n input: \"src/component.ts\",\n output: {\n file: \"dist/component.js\",\n format: \"esm\"\n },\n external: [/^wasi:/]\n};\n`;\n };\n\n private buildWitWorld = (): string => {\n return `package nextclaw:napp;\n\nworld napp-http {\n import wasi:filesystem/types@0.2.2;\n import wasi:filesystem/preopens@0.2.2;\n\n export wasi:http/incoming-handler@0.2.6;\n}\n`;\n };\n\n private buildComponentSource = (): string => {\n return `import { Hono } from \"hono\";\nimport { fire } from \"@bytecodealliance/jco-std/wasi/0.2.6/http/adapters/hono/server\";\nimport { getDirectories } from \"wasi:filesystem/preopens@0.2.2\";\n\ntype Todo = {\n id: string;\n title: string;\n completed: boolean;\n};\n\ntype TodoInput = {\n title?: string;\n};\n\nconst TODOS_FILE = \"todos.json\";\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\nconst app = new Hono();\n\napp.get(\"/api/todos\", (context) => {\n return context.json(loadTodos());\n});\n\napp.post(\"/api/todos\", async (context) => {\n const input = await context.req.json<TodoInput>();\n if (!input.title?.trim()) {\n return context.json({ error: \"title is required\" }, 400);\n }\n\n const todos = loadTodos();\n todos.push({\n id: crypto.randomUUID(),\n title: input.title.trim(),\n completed: false,\n });\n saveTodos(todos);\n return context.json(todos);\n});\n\napp.patch(\"/api/todos/:id\", async (context) => {\n const input = await context.req.json<Partial<Todo>>();\n const todos = loadTodos();\n const todo = todos.find((entry) => entry.id === context.req.param(\"id\"));\n if (!todo) {\n return context.json({ error: \"todo not found\" }, 404);\n }\n\n if (typeof input.title === \"string\") {\n todo.title = input.title;\n }\n if (typeof input.completed === \"boolean\") {\n todo.completed = input.completed;\n }\n saveTodos(todos);\n return context.json(todos);\n});\n\napp.delete(\"/api/todos/:id\", (context) => {\n const nextTodos = loadTodos().filter((entry) => entry.id !== context.req.param(\"id\"));\n saveTodos(nextTodos);\n return context.json(nextTodos);\n});\n\napp.notFound((context) => context.text(\"Not found\", 404));\n\nfire(app);\n\nexport { incomingHandler } from \"@bytecodealliance/jco-std/wasi/0.2.6/http/adapters/hono/server\";\n\nfunction loadTodos(): Todo[] {\n const file = openTodosFile({ read: true });\n if (!file) {\n return [];\n }\n const [bytes] = file.read(BigInt(1024 * 1024), BigInt(0));\n if (bytes.length === 0) {\n return [];\n }\n return JSON.parse(decoder.decode(bytes)) as Todo[];\n}\n\nfunction saveTodos(todos: Todo[]): void {\n const file = getDataDirectory().openAt(\n { symlinkFollow: true },\n TODOS_FILE,\n { create: true, truncate: true },\n { write: true },\n );\n file.write(encoder.encode(JSON.stringify(todos, null, 2)), BigInt(0));\n}\n\nfunction openTodosFile(flags: { read?: boolean; write?: boolean }) {\n try {\n return getDataDirectory().openAt({ symlinkFollow: true }, TODOS_FILE, {}, flags);\n } catch {\n return undefined;\n }\n}\n\nfunction getDataDirectory() {\n for (const [descriptor, guestPath] of getDirectories()) {\n if (guestPath === \"/data\") {\n return descriptor;\n }\n }\n throw new Error(\"Missing /data preopen. NApp runtime must mount the app data directory at /data.\");\n}\n`;\n };\n\n private buildUiHtml = (appName: string): string => {\n return `<!doctype html>\n<html lang=\"zh-CN\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>${appName}</title>\n <style>\n :root {\n color-scheme: light;\n font-family: \"IBM Plex Sans\", \"Helvetica Neue\", sans-serif;\n background: linear-gradient(135deg, #f4efe6 0%, #eff6f9 50%, #f8fafc 100%);\n color: #13212f;\n }\n\n body {\n margin: 0;\n min-height: 100vh;\n }\n\n main {\n box-sizing: border-box;\n max-width: 720px;\n margin: 0 auto;\n padding: 48px 20px;\n }\n\n .panel {\n border: 1px solid rgba(19, 33, 47, 0.1);\n border-radius: 24px;\n background: rgba(255, 255, 255, 0.82);\n box-shadow: 0 24px 70px rgba(19, 33, 47, 0.14);\n padding: 28px;\n }\n\n h1 {\n margin: 0 0 10px;\n font-size: clamp(32px, 7vw, 58px);\n letter-spacing: -0.06em;\n }\n\n form {\n display: flex;\n gap: 10px;\n margin: 24px 0;\n }\n\n input {\n flex: 1;\n border: 1px solid rgba(19, 33, 47, 0.18);\n border-radius: 999px;\n padding: 12px 14px;\n font-size: 15px;\n }\n\n button {\n border: 0;\n border-radius: 999px;\n background: #13212f;\n color: white;\n padding: 12px 18px;\n cursor: pointer;\n }\n\n li {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 12px 0;\n border-top: 1px solid rgba(19, 33, 47, 0.1);\n }\n </style>\n </head>\n <body>\n <main>\n <section class=\"panel\">\n <p>TypeScript WASI HTTP NApp</p>\n <h1>${appName}</h1>\n <form id=\"todo-form\">\n <input id=\"todo-title\" type=\"text\" placeholder=\"Add a todo\" />\n <button type=\"submit\">Add</button>\n </form>\n <ul id=\"todos\"></ul>\n </section>\n </main>\n <script type=\"module\" src=\"./app.js\"></script>\n </body>\n</html>\n`;\n };\n\n private buildUiScript = (): string => {\n return `const form = document.getElementById(\"todo-form\");\nconst input = document.getElementById(\"todo-title\");\nconst list = document.getElementById(\"todos\");\n\nasync function loadTodos() {\n const response = await fetch(\"/api/todos\");\n render(await response.json());\n}\n\nasync function addTodo(title) {\n const response = await fetch(\"/api/todos\", {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\"\n },\n body: JSON.stringify({ title })\n });\n render(await response.json());\n}\n\nasync function toggleTodo(todo) {\n const response = await fetch(\\`/api/todos/\\${todo.id}\\`, {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\"\n },\n body: JSON.stringify({ completed: !todo.completed })\n });\n render(await response.json());\n}\n\nfunction render(todos) {\n list.replaceChildren(\n ...todos.map((todo) => {\n const item = document.createElement(\"li\");\n const label = document.createElement(\"span\");\n label.textContent = todo.completed ? \\`✓ \\${todo.title}\\` : todo.title;\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.textContent = todo.completed ? \"Reopen\" : \"Done\";\n button.addEventListener(\"click\", () => {\n void toggleTodo(todo);\n });\n item.append(label, button);\n return item;\n })\n );\n}\n\nform.addEventListener(\"submit\", (event) => {\n event.preventDefault();\n const title = input.value.trim();\n if (!title) {\n return;\n }\n input.value = \"\";\n void addTodo(title);\n});\n\nvoid loadTodos();\n`;\n };\n\n private buildIconSvg = (): string => {\n return `<svg width=\"160\" height=\"160\" viewBox=\"0 0 160 160\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"160\" height=\"160\" rx=\"38\" fill=\"#13212F\" />\n <path d=\"M44 49H116V63H44V49Z\" fill=\"#F2C879\" />\n <path d=\"M44 76H116V90H44V76Z\" fill=\"#F7F4EC\" />\n <path d=\"M44 103H92V117H44V103Z\" fill=\"#8FD3C7\" />\n</svg>\n`;\n };\n\n private normalizeSlug = (value: string): string => {\n return value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n };\n}\n\nconst APP_WASM_PLACEHOLDER_BASE64 =\n \"AGFzbQEAAAABBwFgAn9/AX8DAgEABxMBD3N1bW1hcml6ZV9ub3RlcwAACg0BCwAgACABakHIAWoL\";\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"app-ts-http-scaffold-template.service.js","names":[],"sources":["../../src/services/app-ts-http-scaffold-template.service.ts"],"sourcesContent":["export type AppScaffoldFile = {\n relativePath: string;\n content: string | Buffer;\n};\n\nexport class AppTsHttpScaffoldTemplateService {\n buildFiles = (params: {\n appId: string;\n appName: string;\n }): AppScaffoldFile[] => {\n const { appId, appName } = params;\n return [\n {\n relativePath: \"manifest.json\",\n content: `${JSON.stringify(this.buildManifest(appId, appName), null, 2)}\\n`,\n },\n {\n relativePath: \"marketplace.json\",\n content: `${JSON.stringify(this.buildMarketplaceMetadata(appName), null, 2)}\\n`,\n },\n {\n relativePath: \"README.md\",\n content: this.buildReadme(appName, appId),\n },\n {\n relativePath: \"main/package.json\",\n content: `${JSON.stringify(this.buildMainPackageJson(appId), null, 2)}\\n`,\n },\n {\n relativePath: \"main/tsconfig.json\",\n content: `${JSON.stringify(this.buildTsconfig(), null, 2)}\\n`,\n },\n {\n relativePath: \"main/rolldown.config.mjs\",\n content: this.buildRolldownConfig(),\n },\n {\n relativePath: \"main/wit/world.wit\",\n content: this.buildWitWorld(),\n },\n {\n relativePath: \"main/src/component.ts\",\n content: this.buildComponentSource(),\n },\n {\n relativePath: \"main/app.wasm\",\n content: Buffer.from(APP_WASM_PLACEHOLDER_BASE64, \"base64\"),\n },\n {\n relativePath: \"ui/index.html\",\n content: this.buildUiHtml(appName),\n },\n {\n relativePath: \"ui/app.js\",\n content: this.buildUiScript(),\n },\n {\n relativePath: \"assets/icon.svg\",\n content: this.buildIconSvg(),\n },\n ];\n };\n\n private buildManifest = (appId: string, appName: string) => {\n return {\n schemaVersion: 1,\n id: appId,\n name: appName,\n version: \"0.1.0\",\n description: \"A TypeScript WASI HTTP NApp scaffold created by napp.\",\n icon: \"assets/icon.svg\",\n main: {\n kind: \"wasi-http-component\",\n entry: \"main/app.wasm\",\n },\n ui: {\n entry: \"ui/index.html\",\n },\n };\n };\n\n private buildMainPackageJson = (appId: string) => {\n return {\n name: `${appId.replace(/\\./g, \"-\")}-main`,\n version: \"0.1.0\",\n private: true,\n type: \"module\",\n scripts: {\n build: \"npm run prepare-wit && npm run guest-types && npm run typecheck && npm run bundle && npm run componentize\",\n \"prepare-wit\": \"wkg wit fetch\",\n \"guest-types\": \"jco guest-types wit --world-name napp-http --out-dir generated/types\",\n typecheck: \"tsc --noEmit\",\n bundle: \"rolldown -c\",\n componentize: \"jco componentize -w wit -n napp-http -o app.wasm dist/component.js\",\n },\n dependencies: {\n \"@bytecodealliance/jco-std\": \"^0.1.3\",\n hono: \"^4.10.0\",\n },\n devDependencies: {\n \"@bytecodealliance/componentize-js\": \"^0.20.0\",\n \"@bytecodealliance/jco\": \"^1.19.0\",\n rolldown: \"^1.0.0-rc.17\",\n typescript: \"^5.6.3\",\n },\n };\n };\n\n private buildTsconfig = () => {\n return {\n compilerOptions: {\n target: \"ES2022\",\n module: \"ESNext\",\n moduleResolution: \"Bundler\",\n strict: true,\n skipLibCheck: true,\n lib: [\"ES2022\", \"DOM\"],\n types: [\"./generated/types/interfaces/wasi-filesystem-preopens\", \"./generated/types/interfaces/wasi-filesystem-types\"],\n },\n include: [\"src/**/*.ts\"],\n };\n };\n\n private buildMarketplaceMetadata = (appName: string) => {\n return {\n slug: this.normalizeSlug(appName),\n summary: `A TypeScript WASI HTTP ${appName} scaffold created by napp.`,\n summaryI18n: {\n en: `A TypeScript WASI HTTP ${appName} scaffold created by napp.`,\n zh: `一个由 napp 创建的 TypeScript WASI HTTP ${appName} 应用骨架。`,\n },\n description: `A TypeScript NApp scaffold for ${appName}, designed for ordinary frontend-to-backend HTTP development on WASI components.`,\n descriptionI18n: {\n en: `A TypeScript NApp scaffold for ${appName}, designed for ordinary frontend-to-backend HTTP development on WASI components.`,\n zh: `一个面向 ${appName} 的 TypeScript NApp 应用骨架,用 WASI component 承载普通前后端 HTTP 开发心智。`,\n },\n author: \"NextClaw\",\n tags: [\"starter\", \"typescript\", \"wasi-http\", \"official\"],\n sourceRepo: \"https://github.com/Peiiii/nextclaw\",\n homepage: \"https://nextclaw.io\",\n featured: false,\n };\n };\n\n private buildReadme = (appName: string, appId: string): string => {\n return `# ${appName}\n\nThis app was created by \\`napp create --template ts-http\\`.\n\nIt keeps the existing NApp directory contract, while making \\`main/app.wasm\\` a WASI HTTP component.\n\n## App ID\n\n\\`${appId}\\`\n\n## Build the TypeScript backend\n\nRecommended:\n\n\\`\\`\\`bash\nnapp build . --install\n\\`\\`\\`\n\nManual equivalent:\n\n\\`\\`\\`bash\ncd main\nnpm install\nnpm run build\n\\`\\`\\`\n\nThe build writes the backend component to:\n\n\\`\\`\\`text\nmain/app.wasm\n\\`\\`\\`\n\nThe build uses the official Bytecode Alliance toolchain and expects \\`wkg\\` to be available for fetching WIT dependencies:\n\n\\`\\`\\`bash\ncargo install wkg\n\\`\\`\\`\n\n## Local workflow\n\n\\`\\`\\`bash\nnapp inspect .\nnapp run . --data ./data\n\\`\\`\\`\n\nThe runtime mounts the host data directory to guest \\`/data\\`. This example stores todos in:\n\n\\`\\`\\`text\n./data/todos.json\n\\`\\`\\`\n\nThe frontend can call the backend as ordinary same-origin HTTP:\n\n\\`\\`\\`js\nawait fetch(\"/api/todos\");\n\\`\\`\\`\n`;\n };\n\n private buildRolldownConfig = (): string => {\n return `export default {\n input: \"src/component.ts\",\n output: {\n file: \"dist/component.js\",\n format: \"esm\"\n },\n external: [/^wasi:/]\n};\n`;\n };\n\n private buildWitWorld = (): string => {\n return `package nextclaw:napp;\n\nworld napp-http {\n import wasi:filesystem/types@0.2.2;\n import wasi:filesystem/preopens@0.2.2;\n\n export wasi:http/incoming-handler@0.2.6;\n}\n`;\n };\n\n private buildComponentSource = (): string => {\n return `import { Hono } from \"hono\";\nimport { fire } from \"@bytecodealliance/jco-std/wasi/0.2.6/http/adapters/hono/server\";\nimport { getDirectories } from \"wasi:filesystem/preopens@0.2.2\";\n\ntype Todo = {\n id: string;\n title: string;\n completed: boolean;\n};\n\ntype TodoInput = {\n title?: string;\n};\n\nconst TODOS_FILE = \"todos.json\";\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\nconst app = new Hono();\n\napp.get(\"/api/todos\", (context) => {\n return context.json(loadTodos());\n});\n\napp.post(\"/api/todos\", async (context) => {\n const input = await context.req.json<TodoInput>();\n if (!input.title?.trim()) {\n return context.json({ error: \"title is required\" }, 400);\n }\n\n const todos = loadTodos();\n todos.push({\n id: crypto.randomUUID(),\n title: input.title.trim(),\n completed: false,\n });\n saveTodos(todos);\n return context.json(todos);\n});\n\napp.patch(\"/api/todos/:id\", async (context) => {\n const input = await context.req.json<Partial<Todo>>();\n const todos = loadTodos();\n const todo = todos.find((entry) => entry.id === context.req.param(\"id\"));\n if (!todo) {\n return context.json({ error: \"todo not found\" }, 404);\n }\n\n if (typeof input.title === \"string\") {\n todo.title = input.title;\n }\n if (typeof input.completed === \"boolean\") {\n todo.completed = input.completed;\n }\n saveTodos(todos);\n return context.json(todos);\n});\n\napp.delete(\"/api/todos/:id\", (context) => {\n const nextTodos = loadTodos().filter((entry) => entry.id !== context.req.param(\"id\"));\n saveTodos(nextTodos);\n return context.json(nextTodos);\n});\n\napp.notFound((context) => context.text(\"Not found\", 404));\n\nfire(app);\n\nexport { incomingHandler } from \"@bytecodealliance/jco-std/wasi/0.2.6/http/adapters/hono/server\";\n\nfunction loadTodos(): Todo[] {\n const file = openTodosFile({ read: true });\n if (!file) {\n return [];\n }\n const [bytes] = file.read(BigInt(1024 * 1024), BigInt(0));\n if (bytes.length === 0) {\n return [];\n }\n return JSON.parse(decoder.decode(bytes)) as Todo[];\n}\n\nfunction saveTodos(todos: Todo[]): void {\n const file = getDataDirectory().openAt(\n { symlinkFollow: true },\n TODOS_FILE,\n { create: true, truncate: true },\n { write: true },\n );\n file.write(encoder.encode(JSON.stringify(todos, null, 2)), BigInt(0));\n}\n\nfunction openTodosFile(flags: { read?: boolean; write?: boolean }) {\n try {\n return getDataDirectory().openAt({ symlinkFollow: true }, TODOS_FILE, {}, flags);\n } catch {\n return undefined;\n }\n}\n\nfunction getDataDirectory() {\n for (const [descriptor, guestPath] of getDirectories()) {\n if (guestPath === \"/data\") {\n return descriptor;\n }\n }\n throw new Error(\"Missing /data preopen. NApp runtime must mount the app data directory at /data.\");\n}\n`;\n };\n\n private buildUiHtml = (appName: string): string => {\n return `<!doctype html>\n<html lang=\"zh-CN\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>${appName}</title>\n <style>\n :root {\n color-scheme: light;\n font-family: \"IBM Plex Sans\", \"Helvetica Neue\", sans-serif;\n background: linear-gradient(135deg, #f4efe6 0%, #eff6f9 50%, #f8fafc 100%);\n color: #13212f;\n }\n\n body {\n margin: 0;\n min-height: 100vh;\n }\n\n main {\n box-sizing: border-box;\n max-width: 720px;\n margin: 0 auto;\n padding: 48px 20px;\n }\n\n .panel {\n border: 1px solid rgba(19, 33, 47, 0.1);\n border-radius: 24px;\n background: rgba(255, 255, 255, 0.82);\n box-shadow: 0 24px 70px rgba(19, 33, 47, 0.14);\n padding: 28px;\n }\n\n h1 {\n margin: 0 0 10px;\n font-size: clamp(32px, 7vw, 58px);\n letter-spacing: -0.06em;\n }\n\n form {\n display: flex;\n gap: 10px;\n margin: 24px 0;\n }\n\n input {\n flex: 1;\n border: 1px solid rgba(19, 33, 47, 0.18);\n border-radius: 999px;\n padding: 12px 14px;\n font-size: 15px;\n }\n\n button {\n border: 0;\n border-radius: 999px;\n background: #13212f;\n color: white;\n padding: 12px 18px;\n cursor: pointer;\n }\n\n li {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 12px 0;\n border-top: 1px solid rgba(19, 33, 47, 0.1);\n }\n </style>\n </head>\n <body>\n <main>\n <section class=\"panel\">\n <p>TypeScript WASI HTTP NApp</p>\n <h1>${appName}</h1>\n <form id=\"todo-form\">\n <input id=\"todo-title\" type=\"text\" placeholder=\"Add a todo\" />\n <button type=\"submit\">Add</button>\n </form>\n <ul id=\"todos\"></ul>\n </section>\n </main>\n <script type=\"module\" src=\"./app.js\"></script>\n </body>\n</html>\n`;\n };\n\n private buildUiScript = (): string => {\n return `const form = document.getElementById(\"todo-form\");\nconst input = document.getElementById(\"todo-title\");\nconst list = document.getElementById(\"todos\");\n\nasync function loadTodos() {\n const response = await fetch(\"/api/todos\");\n render(await response.json());\n}\n\nasync function addTodo(title) {\n const response = await fetch(\"/api/todos\", {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\"\n },\n body: JSON.stringify({ title })\n });\n render(await response.json());\n}\n\nasync function toggleTodo(todo) {\n const response = await fetch(\\`/api/todos/\\${todo.id}\\`, {\n method: \"PATCH\",\n headers: {\n \"content-type\": \"application/json\"\n },\n body: JSON.stringify({ completed: !todo.completed })\n });\n render(await response.json());\n}\n\nfunction render(todos) {\n list.replaceChildren(\n ...todos.map((todo) => {\n const item = document.createElement(\"li\");\n const label = document.createElement(\"span\");\n label.textContent = todo.completed ? \\`✓ \\${todo.title}\\` : todo.title;\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.textContent = todo.completed ? \"Reopen\" : \"Done\";\n button.addEventListener(\"click\", () => {\n void toggleTodo(todo);\n });\n item.append(label, button);\n return item;\n })\n );\n}\n\nform.addEventListener(\"submit\", (event) => {\n event.preventDefault();\n const title = input.value.trim();\n if (!title) {\n return;\n }\n input.value = \"\";\n void addTodo(title);\n});\n\nvoid loadTodos();\n`;\n };\n\n private buildIconSvg = (): string => {\n return `<svg width=\"160\" height=\"160\" viewBox=\"0 0 160 160\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"160\" height=\"160\" rx=\"38\" fill=\"#13212F\" />\n <path d=\"M44 49H116V63H44V49Z\" fill=\"#F2C879\" />\n <path d=\"M44 76H116V90H44V76Z\" fill=\"#F7F4EC\" />\n <path d=\"M44 103H92V117H44V103Z\" fill=\"#8FD3C7\" />\n</svg>\n`;\n };\n\n private normalizeSlug = (value: string): string => {\n return value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n };\n}\n\nconst APP_WASM_PLACEHOLDER_BASE64 =\n \"AGFzbQEAAAABBwFgAn9/AX8DAgEABxMBD3N1bW1hcml6ZV9ub3RlcwAACg0BCwAgACABakHIAWoL\";\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { AppInstanceService } from "
|
|
1
|
+
import { AppInstanceService } from "./app-instance.service.js";
|
|
2
2
|
import { IncomingMessage, ServerResponse } from "node:http";
|
|
3
3
|
|
|
4
|
-
//#region src/
|
|
4
|
+
//#region src/services/host-bridge.service.d.ts
|
|
5
5
|
declare class HostBridgeServer {
|
|
6
6
|
private readonly appInstance;
|
|
7
7
|
constructor(appInstance: AppInstanceService);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-bridge.service.d.ts","names":[],"sources":["../../src/services/host-bridge.service.ts"],"mappings":";;;;cAGa,gBAAA;EAAA,iBACkB,WAAA;cAAA,WAAA,EAAa,kBAAA;EAE1C,MAAA,GACE,OAAA,EAAS,eAAA,EACT,QAAA,EAAU,cAAA,KACT,OAAA;EAAA,QA4CK,YAAA;EAAA,QAYA,SAAA;AAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-bridge.service.js","names":[],"sources":["../../src/services/host-bridge.service.ts"],"sourcesContent":["import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { AppInstanceService } from \"#app-runtime/services/app-instance.service.js\";\n\nexport class HostBridgeServer {\n constructor(private readonly appInstance: AppInstanceService) {}\n\n handle = async (\n request: IncomingMessage,\n response: ServerResponse,\n ): Promise<boolean> => {\n const requestUrl = new URL(request.url ?? \"/\", \"http://127.0.0.1\");\n if (!requestUrl.pathname.startsWith(\"/__napp\")) {\n return false;\n }\n\n if (request.method === \"GET\" && requestUrl.pathname === \"/__napp/health\") {\n this.writeJson(response, 200, { ok: true });\n return true;\n }\n\n if (request.method === \"GET\" && requestUrl.pathname === \"/__napp/manifest\") {\n this.writeJson(response, 200, {\n ok: true,\n manifest: this.appInstance.summarizeManifest(),\n });\n return true;\n }\n\n if (request.method === \"GET\" && requestUrl.pathname === \"/__napp/permissions\") {\n this.writeJson(response, 200, {\n ok: true,\n permissions: this.appInstance.summarizePermissions(),\n });\n return true;\n }\n\n if (request.method === \"POST\" && requestUrl.pathname === \"/__napp/run\") {\n const body = await this.readJsonBody<{ action?: string }>(request);\n const result = await this.appInstance.runAction(body.action);\n this.writeJson(response, 200, { ok: true, result });\n return true;\n }\n\n this.writeJson(response, 404, {\n ok: false,\n error: {\n code: \"NOT_FOUND\",\n message: `Unknown bridge path: ${requestUrl.pathname}`,\n },\n });\n return true;\n };\n\n private readJsonBody = async <T>(request: IncomingMessage): Promise<T> => {\n const chunks: Buffer[] = [];\n for await (const chunk of request) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n const rawBody = Buffer.concat(chunks).toString(\"utf-8\").trim();\n if (!rawBody) {\n return {} as T;\n }\n return JSON.parse(rawBody) as T;\n };\n\n private writeJson = (\n response: ServerResponse,\n statusCode: number,\n payload: unknown,\n ): void => {\n response.writeHead(statusCode, {\n \"content-type\": \"application/json; charset=utf-8\",\n \"cache-control\": \"no-store\",\n });\n response.end(JSON.stringify(payload, null, 2));\n };\n}\n"],"mappings":";AAGA,IAAa,mBAAb,MAA8B;CAC5B,YAAY,aAAkD;AAAjC,OAAA,cAAA;;CAE7B,SAAS,OACP,SACA,aACqB;EACrB,MAAM,aAAa,IAAI,IAAI,QAAQ,OAAO,KAAK,mBAAmB;AAClE,MAAI,CAAC,WAAW,SAAS,WAAW,UAAU,CAC5C,QAAO;AAGT,MAAI,QAAQ,WAAW,SAAS,WAAW,aAAa,kBAAkB;AACxE,QAAK,UAAU,UAAU,KAAK,EAAE,IAAI,MAAM,CAAC;AAC3C,UAAO;;AAGT,MAAI,QAAQ,WAAW,SAAS,WAAW,aAAa,oBAAoB;AAC1E,QAAK,UAAU,UAAU,KAAK;IAC5B,IAAI;IACJ,UAAU,KAAK,YAAY,mBAAmB;IAC/C,CAAC;AACF,UAAO;;AAGT,MAAI,QAAQ,WAAW,SAAS,WAAW,aAAa,uBAAuB;AAC7E,QAAK,UAAU,UAAU,KAAK;IAC5B,IAAI;IACJ,aAAa,KAAK,YAAY,sBAAsB;IACrD,CAAC;AACF,UAAO;;AAGT,MAAI,QAAQ,WAAW,UAAU,WAAW,aAAa,eAAe;GACtE,MAAM,OAAO,MAAM,KAAK,aAAkC,QAAQ;GAClE,MAAM,SAAS,MAAM,KAAK,YAAY,UAAU,KAAK,OAAO;AAC5D,QAAK,UAAU,UAAU,KAAK;IAAE,IAAI;IAAM;IAAQ,CAAC;AACnD,UAAO;;AAGT,OAAK,UAAU,UAAU,KAAK;GAC5B,IAAI;GACJ,OAAO;IACL,MAAM;IACN,SAAS,wBAAwB,WAAW;IAC7C;GACF,CAAC;AACF,SAAO;;CAGT,eAAuB,OAAU,YAAyC;EACxE,MAAM,SAAmB,EAAE;AAC3B,aAAW,MAAM,SAAS,QACxB,QAAO,KAAK,OAAO,SAAS,MAAM,GAAG,QAAQ,OAAO,KAAK,MAAM,CAAC;EAElE,MAAM,UAAU,OAAO,OAAO,OAAO,CAAC,SAAS,QAAQ,CAAC,MAAM;AAC9D,MAAI,CAAC,QACH,QAAO,EAAE;AAEX,SAAO,KAAK,MAAM,QAAQ;;CAG5B,aACE,UACA,YACA,YACS;AACT,WAAS,UAAU,YAAY;GAC7B,gBAAgB;GAChB,iBAAiB;GAClB,CAAC;AACF,WAAS,IAAI,KAAK,UAAU,SAAS,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { MainRunRequest, MainRunResult } from "../types/main-runner.types.js";
|
|
2
|
+
|
|
3
|
+
//#region src/services/main-runner.service.d.ts
|
|
4
|
+
declare abstract class MainRunnerService {
|
|
5
|
+
abstract runDocumentSummary(request: MainRunRequest): Promise<MainRunResult>;
|
|
6
|
+
}
|
|
7
|
+
//#endregion
|
|
8
|
+
export { MainRunnerService };
|
|
9
|
+
//# sourceMappingURL=main-runner.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main-runner.service.d.ts","names":[],"sources":["../../src/services/main-runner.service.ts"],"mappings":";;;uBAEsB,iBAAA;EAAA,SACX,kBAAA,CAAmB,OAAA,EAAS,cAAA,GAAiB,OAAA,CAAQ,aAAA;AAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main-runner.service.js","names":[],"sources":["../../src/services/main-runner.service.ts"],"sourcesContent":["import type { MainRunRequest, MainRunResult } from \"#app-runtime/types/main-runner.types.js\";\n\nexport abstract class MainRunnerService {\n abstract runDocumentSummary(request: MainRunRequest): Promise<MainRunResult>;\n}\n"],"mappings":";AAEA,IAAsB,oBAAtB,MAAwC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-auth-state.service.d.ts","names":[],"sources":["../../src/services/platform-auth-state.service.ts"],"mappings":";KAWY,wBAAA;EACV,KAAA;EACA,UAAA;AAAA;AAAA,cAMW,wBAAA;EACX,oBAAA,QAA2B,wBAAA;EAAA,QA4BnB,iBAAA;AAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { resolve } from "node:path";
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
3
|
import { existsSync, readFileSync } from "node:fs";
|
|
4
|
-
//#region src/
|
|
4
|
+
//#region src/services/platform-auth-state.service.ts
|
|
5
5
|
const NEXTCLAW_HOME_ENV_KEY = "NEXTCLAW_HOME";
|
|
6
6
|
const NEXTCLAW_DEFAULT_HOME_DIR = ".nextclaw";
|
|
7
7
|
var PlatformAuthStateService = class {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-auth-state.service.js","names":[],"sources":["../../src/services/platform-auth-state.service.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { homedir } from \"node:os\";\n\ntype NextclawConfig = {\n providers?: Record<string, {\n apiKey?: string;\n apiBase?: string | null;\n } | undefined>;\n};\n\nexport type PlatformPublishAuthState = {\n token: string | null;\n apiBaseUrl?: string;\n};\n\nconst NEXTCLAW_HOME_ENV_KEY = \"NEXTCLAW_HOME\";\nconst NEXTCLAW_DEFAULT_HOME_DIR = \".nextclaw\";\n\nexport class PlatformAuthStateService {\n readCurrentAuthState = (): PlatformPublishAuthState => {\n const configPath = this.resolveConfigPath();\n if (!existsSync(configPath)) {\n return {\n token: null,\n };\n }\n try {\n const raw = readFileSync(configPath, \"utf-8\");\n const parsed = JSON.parse(raw) as NextclawConfig;\n const provider = parsed.providers?.nextclaw;\n const token = typeof provider?.apiKey === \"string\" && provider.apiKey.trim().length > 0\n ? provider.apiKey.trim()\n : null;\n const apiBase = typeof provider?.apiBase === \"string\" && provider.apiBase.trim().length > 0\n ? provider.apiBase.trim()\n : undefined;\n return {\n token,\n apiBaseUrl: apiBase,\n };\n } catch {\n return {\n token: null,\n };\n }\n };\n\n private resolveConfigPath = (): string => {\n const nextclawHome = process.env[NEXTCLAW_HOME_ENV_KEY]?.trim();\n const dataHome = nextclawHome && nextclawHome.length > 0\n ? resolve(nextclawHome)\n : resolve(homedir(), NEXTCLAW_DEFAULT_HOME_DIR);\n return resolve(dataHome, \"config.json\");\n };\n}\n"],"mappings":";;;;AAgBA,MAAM,wBAAwB;AAC9B,MAAM,4BAA4B;AAElC,IAAa,2BAAb,MAAsC;CACpC,6BAAuD;EACrD,MAAM,aAAa,KAAK,mBAAmB;AAC3C,MAAI,CAAC,WAAW,WAAW,CACzB,QAAO,EACL,OAAO,MACR;AAEH,MAAI;GACF,MAAM,MAAM,aAAa,YAAY,QAAQ;GAE7C,MAAM,WADS,KAAK,MAAM,IAAI,CACN,WAAW;AAOnC,UAAO;IACL,OAPY,OAAO,UAAU,WAAW,YAAY,SAAS,OAAO,MAAM,CAAC,SAAS,IAClF,SAAS,OAAO,MAAM,GACtB;IAMF,YALc,OAAO,UAAU,YAAY,YAAY,SAAS,QAAQ,MAAM,CAAC,SAAS,IACtF,SAAS,QAAQ,MAAM,GACvB,KAAA;IAIH;UACK;AACN,UAAO,EACL,OAAO,MACR;;;CAIL,0BAA0C;EACxC,MAAM,eAAe,QAAQ,IAAI,wBAAwB,MAAM;AAI/D,SAAO,QAHU,gBAAgB,aAAa,SAAS,IACnD,QAAQ,aAAa,GACrB,QAAQ,SAAS,EAAE,0BAA0B,EACxB,cAAc"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AppStandaloneManifestBundle } from "../types/app-manifest.types.js";
|
|
2
2
|
import { IncomingMessage, ServerResponse } from "node:http";
|
|
3
3
|
|
|
4
|
-
//#region src/
|
|
4
|
+
//#region src/services/ui-server.service.d.ts
|
|
5
5
|
declare class UiServerService {
|
|
6
6
|
private readonly bundle;
|
|
7
|
-
constructor(bundle:
|
|
7
|
+
constructor(bundle: AppStandaloneManifestBundle);
|
|
8
8
|
handle: (request: IncomingMessage, response: ServerResponse) => Promise<boolean>;
|
|
9
9
|
private resolveContentType;
|
|
10
10
|
private exists;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-server.service.d.ts","names":[],"sources":["../../src/services/ui-server.service.ts"],"mappings":";;;;cAca,eAAA;EAAA,iBACkB,MAAA;cAAA,MAAA,EAAQ,2BAAA;EAErC,MAAA,GACE,OAAA,EAAS,eAAA,EACT,QAAA,EAAU,cAAA,KACT,OAAA;EAAA,QA8BK,kBAAA;EAAA,QAKA,MAAA;EAAA,QASA,wBAAA;AAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { access, readFile } from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
//#region src/
|
|
3
|
+
//#region src/services/ui-server.service.ts
|
|
4
4
|
const CONTENT_TYPE_BY_EXTENSION = {
|
|
5
5
|
".css": "text/css; charset=utf-8",
|
|
6
6
|
".html": "text/html; charset=utf-8",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-server.service.js","names":[],"sources":["../../src/services/ui-server.service.ts"],"sourcesContent":["import { access, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { AppStandaloneManifestBundle } from \"#app-runtime/types/app-manifest.types.js\";\n\nconst CONTENT_TYPE_BY_EXTENSION: Record<string, string> = {\n \".css\": \"text/css; charset=utf-8\",\n \".html\": \"text/html; charset=utf-8\",\n \".js\": \"text/javascript; charset=utf-8\",\n \".json\": \"application/json; charset=utf-8\",\n \".png\": \"image/png\",\n \".svg\": \"image/svg+xml; charset=utf-8\",\n};\n\nexport class UiServerService {\n constructor(private readonly bundle: AppStandaloneManifestBundle) {}\n\n handle = async (\n request: IncomingMessage,\n response: ServerResponse,\n ): Promise<boolean> => {\n const requestUrl = new URL(request.url ?? \"/\", \"http://127.0.0.1\");\n const requestPath = requestUrl.pathname === \"/\" ? \"/index.html\" : requestUrl.pathname;\n const candidatePaths = [\n path.join(this.bundle.uiDirectoryPath, requestPath.slice(1)),\n path.join(this.bundle.assetsDirectoryPath, requestPath.slice(1)),\n ];\n\n for (const candidatePath of candidatePaths) {\n if (!(await this.isInsideAllowedDirectory(candidatePath))) {\n continue;\n }\n if (!(await this.exists(candidatePath))) {\n continue;\n }\n const content = await readFile(candidatePath);\n response.writeHead(200, {\n \"content-type\": this.resolveContentType(candidatePath),\n });\n response.end(content);\n return true;\n }\n\n response.writeHead(404, {\n \"content-type\": \"text/plain; charset=utf-8\",\n });\n response.end(`Not found: ${requestPath}`);\n return true;\n };\n\n private resolveContentType = (filePath: string): string => {\n const extension = path.extname(filePath).toLowerCase();\n return CONTENT_TYPE_BY_EXTENSION[extension] ?? \"application/octet-stream\";\n };\n\n private exists = async (filePath: string): Promise<boolean> => {\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n };\n\n private isInsideAllowedDirectory = async (candidatePath: string): Promise<boolean> => {\n const allowedDirectories = [this.bundle.uiDirectoryPath, this.bundle.assetsDirectoryPath];\n return allowedDirectories.some((directoryPath) => {\n const relative = path.relative(directoryPath, candidatePath);\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n });\n };\n}\n"],"mappings":";;;AAKA,MAAM,4BAAoD;CACxD,QAAQ;CACR,SAAS;CACT,OAAO;CACP,SAAS;CACT,QAAQ;CACR,QAAQ;CACT;AAED,IAAa,kBAAb,MAA6B;CAC3B,YAAY,QAAsD;AAArC,OAAA,SAAA;;CAE7B,SAAS,OACP,SACA,aACqB;EACrB,MAAM,aAAa,IAAI,IAAI,QAAQ,OAAO,KAAK,mBAAmB;EAClE,MAAM,cAAc,WAAW,aAAa,MAAM,gBAAgB,WAAW;EAC7E,MAAM,iBAAiB,CACrB,KAAK,KAAK,KAAK,OAAO,iBAAiB,YAAY,MAAM,EAAE,CAAC,EAC5D,KAAK,KAAK,KAAK,OAAO,qBAAqB,YAAY,MAAM,EAAE,CAAC,CACjE;AAED,OAAK,MAAM,iBAAiB,gBAAgB;AAC1C,OAAI,CAAE,MAAM,KAAK,yBAAyB,cAAc,CACtD;AAEF,OAAI,CAAE,MAAM,KAAK,OAAO,cAAc,CACpC;GAEF,MAAM,UAAU,MAAM,SAAS,cAAc;AAC7C,YAAS,UAAU,KAAK,EACtB,gBAAgB,KAAK,mBAAmB,cAAc,EACvD,CAAC;AACF,YAAS,IAAI,QAAQ;AACrB,UAAO;;AAGT,WAAS,UAAU,KAAK,EACtB,gBAAgB,6BACjB,CAAC;AACF,WAAS,IAAI,cAAc,cAAc;AACzC,SAAO;;CAGT,sBAA8B,aAA6B;AAEzD,SAAO,0BADW,KAAK,QAAQ,SAAS,CAAC,aAAa,KACP;;CAGjD,SAAiB,OAAO,aAAuC;AAC7D,MAAI;AACF,SAAM,OAAO,SAAS;AACtB,UAAO;UACD;AACN,UAAO;;;CAIX,2BAAmC,OAAO,kBAA4C;AAEpF,SAD2B,CAAC,KAAK,OAAO,iBAAiB,KAAK,OAAO,oBAAoB,CAC/D,MAAM,kBAAkB;GAChD,MAAM,WAAW,KAAK,SAAS,eAAe,cAAc;AAC5D,UAAO,aAAa,MAAO,CAAC,SAAS,WAAW,KAAK,IAAI,CAAC,KAAK,WAAW,SAAS;IACnF"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { MainRunRequest, MainRunResult } from "
|
|
1
|
+
import { MainRunRequest, MainRunResult } from "../types/main-runner.types.js";
|
|
2
2
|
import { MainRunnerService } from "./main-runner.service.js";
|
|
3
|
-
import { WasmSidecarClientService } from "
|
|
3
|
+
import { WasmSidecarClientService } from "./wasm-sidecar-client.service.js";
|
|
4
4
|
|
|
5
|
-
//#region src/
|
|
5
|
+
//#region src/services/wasm-main-runner.service.d.ts
|
|
6
6
|
declare class WasmMainRunnerService extends MainRunnerService {
|
|
7
7
|
private readonly sidecarClient;
|
|
8
8
|
constructor(sidecarClient?: WasmSidecarClientService);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm-main-runner.service.d.ts","names":[],"sources":["../../src/services/wasm-main-runner.service.ts"],"mappings":";;;;;cAIa,qBAAA,SAA8B,iBAAA;EAAA,iBAEtB,aAAA;cAAA,aAAA,GAAe,wBAAA;EAKlC,kBAAA,GAA4B,OAAA,EAAS,cAAA,KAAiB,OAAA,CAAQ,aAAA;AAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { MainRunnerService } from "./main-runner.service.js";
|
|
2
|
-
import { WasmSidecarClientService } from "
|
|
3
|
-
//#region src/
|
|
2
|
+
import { WasmSidecarClientService } from "./wasm-sidecar-client.service.js";
|
|
3
|
+
//#region src/services/wasm-main-runner.service.ts
|
|
4
4
|
var WasmMainRunnerService = class extends MainRunnerService {
|
|
5
5
|
constructor(sidecarClient = new WasmSidecarClientService()) {
|
|
6
6
|
super();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm-main-runner.service.js","names":[],"sources":["../../src/services/wasm-main-runner.service.ts"],"sourcesContent":["import { MainRunnerService } from \"./main-runner.service.js\";\nimport type { MainRunRequest, MainRunResult } from \"#app-runtime/types/main-runner.types.js\";\nimport { WasmSidecarClientService } from \"#app-runtime/services/wasm-sidecar-client.service.js\";\n\nexport class WasmMainRunnerService extends MainRunnerService {\n constructor(\n private readonly sidecarClient: WasmSidecarClientService = new WasmSidecarClientService(),\n ) {\n super();\n }\n\n runDocumentSummary = async (request: MainRunRequest): Promise<MainRunResult> => {\n if (request.bundle.manifest.main.kind !== \"wasm\") {\n throw new Error(\"runDocumentSummary 只支持 main.kind=wasm。\");\n }\n const output = await this.sidecarClient.runExport({\n wasmPath: request.bundle.mainEntryPath,\n exportName: request.bundle.manifest.main.export,\n args: [request.input.documentCount, request.input.textBytes],\n });\n return {\n exportName: request.bundle.manifest.main.export,\n output,\n };\n };\n}\n"],"mappings":";;;AAIA,IAAa,wBAAb,cAA2C,kBAAkB;CAC3D,YACE,gBAA2D,IAAI,0BAA0B,EACzF;AACA,SAAO;AAFU,OAAA,gBAAA;;CAKnB,qBAAqB,OAAO,YAAoD;AAC9E,MAAI,QAAQ,OAAO,SAAS,KAAK,SAAS,OACxC,OAAM,IAAI,MAAM,yCAAyC;EAE3D,MAAM,SAAS,MAAM,KAAK,cAAc,UAAU;GAChD,UAAU,QAAQ,OAAO;GACzB,YAAY,QAAQ,OAAO,SAAS,KAAK;GACzC,MAAM,CAAC,QAAQ,MAAM,eAAe,QAAQ,MAAM,UAAU;GAC7D,CAAC;AACF,SAAO;GACL,YAAY,QAAQ,OAAO,SAAS,KAAK;GACzC;GACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm-sidecar-client.service.d.ts","names":[],"sources":["../../src/services/wasm-sidecar-client.service.ts"],"mappings":";cAaa,wBAAA;EACX,SAAA,GAAmB,MAAA;IACjB,QAAA;IACA,UAAA;IACA,IAAA;EAAA,MACE,OAAA;AAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { readFile } from "node:fs/promises";
|
|
2
|
-
//#region src/
|
|
2
|
+
//#region src/services/wasm-sidecar-client.service.ts
|
|
3
3
|
var WasmSidecarClientService = class {
|
|
4
4
|
runExport = async (params) => {
|
|
5
5
|
const { wasmPath, exportName, args } = params;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm-sidecar-client.service.js","names":[],"sources":["../../src/services/wasm-sidecar-client.service.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\n\ntype WasmRuntime = {\n instantiate(\n wasmBytes: Buffer,\n imports: Record<string, unknown>,\n ): Promise<{\n instance: {\n exports: Record<string, unknown>;\n };\n }>;\n};\n\nexport class WasmSidecarClientService {\n runExport = async (params: {\n wasmPath: string;\n exportName: string;\n args: number[];\n }): Promise<number> => {\n const { wasmPath, exportName, args } = params;\n const wasmBytes = await readFile(wasmPath);\n const wasmRuntime = (globalThis as typeof globalThis & { WebAssembly?: WasmRuntime })\n .WebAssembly;\n if (!wasmRuntime) {\n throw new Error(\"当前 Node 运行时不支持 WebAssembly。\");\n }\n const instance = await wasmRuntime.instantiate(wasmBytes, {});\n const exported = instance.instance.exports[exportName];\n if (typeof exported !== \"function\") {\n throw new Error(`Wasm 导出不存在或不可调用:${exportName}`);\n }\n const result = exported(...args);\n if (typeof result !== \"number\") {\n throw new Error(`Wasm 导出 ${exportName} 必须返回 number。`);\n }\n return result;\n };\n}\n"],"mappings":";;AAaA,IAAa,2BAAb,MAAsC;CACpC,YAAY,OAAO,WAII;EACrB,MAAM,EAAE,UAAU,YAAY,SAAS;EACvC,MAAM,YAAY,MAAM,SAAS,SAAS;EAC1C,MAAM,cAAe,WAClB;AACH,MAAI,CAAC,YACH,OAAM,IAAI,MAAM,8BAA8B;EAGhD,MAAM,YADW,MAAM,YAAY,YAAY,WAAW,EAAE,CAAC,EACnC,SAAS,QAAQ;AAC3C,MAAI,OAAO,aAAa,WACtB,OAAM,IAAI,MAAM,mBAAmB,aAAa;EAElD,MAAM,SAAS,SAAS,GAAG,KAAK;AAChC,MAAI,OAAO,WAAW,SACpB,OAAM,IAAI,MAAM,WAAW,WAAW,eAAe;AAEvD,SAAO"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { IncomingMessage, ServerResponse } from "node:http";
|
|
2
2
|
|
|
3
|
-
//#region src/
|
|
3
|
+
//#region src/services/wasmtime-wasi-http-component.service.d.ts
|
|
4
4
|
type WasmtimeWasiHttpComponentStartOptions = {
|
|
5
5
|
wasmPath: string;
|
|
6
6
|
dataDirectory: string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasmtime-wasi-http-component.service.d.ts","names":[],"sources":["../../src/services/wasmtime-wasi-http-component.service.ts"],"mappings":";;;KAMY,qCAAA;EACV,QAAA;EACA,aAAA;AAAA;AAAA,KAGU,+BAAA;EACV,GAAA;EACA,IAAA;AAAA;AAAA,cAGW,gCAAA;EAAA,QACH,OAAA;EAAA,QACA,MAAA;EAER,KAAA,GACE,OAAA,EAAS,qCAAA,KACR,OAAA,CAAQ,+BAAA;EAqCX,IAAA,QAAiB,OAAA;EAqBjB,aAAA,GACE,OAAA,EAAS,eAAA,EACT,QAAA,EAAU,cAAA,KACT,OAAA;EAAA,QAiCK,QAAA;EAAA,QAQA,kBAAA;EAAA,QAIA,iBAAA;EAAA,QAyBA,cAAA;AAAA"}
|
|
@@ -2,7 +2,7 @@ import { mkdir } from "node:fs/promises";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { createServer } from "node:http";
|
|
4
4
|
import { spawn } from "node:child_process";
|
|
5
|
-
//#region src/
|
|
5
|
+
//#region src/services/wasmtime-wasi-http-component.service.ts
|
|
6
6
|
var WasmtimeWasiHttpComponentService = class {
|
|
7
7
|
process;
|
|
8
8
|
handle;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasmtime-wasi-http-component.service.js","names":[],"sources":["../../src/services/wasmtime-wasi-http-component.service.ts"],"sourcesContent":["import { spawn, type ChildProcessByStdio } from \"node:child_process\";\nimport { mkdir } from \"node:fs/promises\";\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport path from \"node:path\";\nimport type { Readable } from \"node:stream\";\n\nexport type WasmtimeWasiHttpComponentStartOptions = {\n wasmPath: string;\n dataDirectory: string;\n};\n\nexport type WasmtimeWasiHttpComponentHandle = {\n url: string;\n port: number;\n};\n\nexport class WasmtimeWasiHttpComponentService {\n private process?: ChildProcessByStdio<null, Readable, Readable>;\n private handle?: WasmtimeWasiHttpComponentHandle;\n\n start = async (\n options: WasmtimeWasiHttpComponentStartOptions,\n ): Promise<WasmtimeWasiHttpComponentHandle> => {\n if (this.process) {\n throw new Error(\"WASI HTTP component 已经启动。\");\n }\n const dataDirectory = path.resolve(options.dataDirectory);\n await mkdir(dataDirectory, { recursive: true });\n const port = await this.findAvailablePort();\n const child = spawn(\n \"wasmtime\",\n [\n \"serve\",\n \"-S\",\n \"cli=y\",\n \"-S\",\n \"http=y\",\n \"-S\",\n \"inherit-network=y\",\n \"--addr\",\n `127.0.0.1:${port}`,\n \"--dir\",\n `${dataDirectory}::/data`,\n options.wasmPath,\n ],\n {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n },\n );\n this.process = child;\n const handle = {\n url: `http://127.0.0.1:${port}`,\n port,\n };\n this.handle = handle;\n await this.waitUntilReady(handle.url, child);\n return handle;\n };\n\n stop = async (): Promise<void> => {\n const child = this.process;\n if (!child) {\n return;\n }\n await new Promise<void>((resolve) => {\n child.once(\"exit\", () => {\n resolve();\n });\n child.kill(\"SIGTERM\");\n setTimeout(() => {\n if (!child.killed) {\n child.kill(\"SIGKILL\");\n }\n resolve();\n }, 1_000).unref();\n });\n this.process = undefined;\n this.handle = undefined;\n };\n\n handleRequest = async (\n request: IncomingMessage,\n response: ServerResponse,\n ): Promise<boolean> => {\n const handle = this.handle;\n if (!handle) {\n return false;\n }\n const requestUrl = new URL(request.url ?? \"/\", handle.url);\n if (!requestUrl.pathname.startsWith(\"/api/\")) {\n return false;\n }\n const headers = new Headers();\n for (const [key, value] of Object.entries(request.headers)) {\n if (value === undefined || key.toLowerCase() === \"host\") {\n continue;\n }\n if (Array.isArray(value)) {\n for (const item of value) {\n headers.append(key, item);\n }\n continue;\n }\n headers.set(key, value);\n }\n const body = await this.readBody(request);\n const upstreamResponse = await fetch(requestUrl, {\n method: request.method,\n headers,\n body: this.methodSupportsBody(request.method) ? body : undefined,\n });\n response.writeHead(upstreamResponse.status, Object.fromEntries(upstreamResponse.headers));\n response.end(Buffer.from(await upstreamResponse.arrayBuffer()));\n return true;\n };\n\n private readBody = async (request: IncomingMessage): Promise<Buffer> => {\n const chunks: Buffer[] = [];\n for await (const chunk of request) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks);\n };\n\n private methodSupportsBody = (method: string | undefined): boolean => {\n return method !== undefined && method !== \"GET\" && method !== \"HEAD\";\n };\n\n private findAvailablePort = async (): Promise<number> => {\n const server = createServer();\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(0, \"127.0.0.1\", () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n const address = server.address();\n await new Promise<void>((resolve, reject) => {\n server.close((error) => {\n if (error) {\n reject(error);\n return;\n }\n resolve();\n });\n });\n if (!address || typeof address === \"string\") {\n throw new Error(\"无法分配 WASI HTTP component 端口。\");\n }\n return address.port;\n };\n\n private waitUntilReady = async (\n url: string,\n child: ChildProcessByStdio<null, Readable, Readable>,\n ): Promise<void> => {\n const errors: string[] = [];\n child.stderr.on(\"data\", (chunk: Buffer) => {\n errors.push(chunk.toString(\"utf-8\"));\n });\n for (let attempt = 0; attempt < 50; attempt += 1) {\n if (child.exitCode !== null) {\n throw new Error(\n `WASI HTTP component 启动失败:${errors.join(\"\").trim() || `exit ${child.exitCode}`}`,\n );\n }\n try {\n await fetch(url);\n return;\n } catch {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n }\n throw new Error(`WASI HTTP component 启动超时:${errors.join(\"\").trim()}`);\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-bundle.types.d.ts","names":[],"sources":["../../src/types/app-bundle.types.ts"],"mappings":";KAAY,mBAAA;AAAA,KAEA,iBAAA;EACV,mBAAA;EACA,gBAAA,EAAkB,mBAAA;EAClB,KAAA;EACA,IAAA;EACA,OAAA;EACA,aAAA;EACA,aAAA;AAAA;AAAA,KAGU,kBAAA;EACV,SAAA;EACA,KAAA,EAAO,MAAA;AAAA;AAAA,KAGG,mBAAA;EACV,UAAA;EACA,QAAA,EAAU,iBAAA;EACV,SAAA;EACA,SAAA;AAAA;AAAA,KAGU,sBAAA;EACV,YAAA;EACA,QAAA,EAAU,iBAAA;EACV,SAAA,EAAW,kBAAA;AAAA"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { AppPermissions } from "
|
|
2
|
-
import { AppDistributionMode } from "
|
|
3
|
-
import { AppDocumentGrantMap } from "
|
|
4
|
-
import { AppPublisher } from "
|
|
5
|
-
import { AppInstallSourceKind } from "
|
|
1
|
+
import { AppPermissions, AppResolvedComponent } from "./app-manifest.types.js";
|
|
2
|
+
import { AppDistributionMode } from "./app-bundle.types.js";
|
|
3
|
+
import { AppDocumentGrantMap } from "./app-permissions.types.js";
|
|
4
|
+
import { AppPublisher } from "./app-remote-registry.types.js";
|
|
5
|
+
import { AppInstallSourceKind } from "./app-registry.types.js";
|
|
6
6
|
|
|
7
|
-
//#region src/
|
|
7
|
+
//#region src/types/app-installation.types.d.ts
|
|
8
|
+
type AppInstallProgressPhase = "resolving" | "downloading" | "verifying" | "installing" | "finalizing";
|
|
9
|
+
type AppInstallProgressHandler = (phase: AppInstallProgressPhase) => void | Promise<void>;
|
|
8
10
|
type AppInstallResult = {
|
|
9
11
|
appId: string;
|
|
10
12
|
name: string;
|
|
@@ -19,12 +21,17 @@ type AppInstallResult = {
|
|
|
19
21
|
bundleUrl?: string;
|
|
20
22
|
sha256?: string;
|
|
21
23
|
publisher?: AppPublisher;
|
|
24
|
+
enabled: boolean;
|
|
25
|
+
manifestSchemaVersion: 1 | 2;
|
|
26
|
+
components?: AppResolvedComponent[];
|
|
27
|
+
primaryPanelId?: string;
|
|
22
28
|
};
|
|
23
29
|
type AppInfoResult = {
|
|
24
30
|
appId: string;
|
|
25
31
|
name: string;
|
|
26
32
|
description?: string;
|
|
27
33
|
activeVersion: string;
|
|
34
|
+
enabled: boolean;
|
|
28
35
|
dataDirectory: string;
|
|
29
36
|
installedVersions: Array<{
|
|
30
37
|
version: string;
|
|
@@ -38,6 +45,9 @@ type AppInfoResult = {
|
|
|
38
45
|
bundleUrl?: string;
|
|
39
46
|
sha256?: string;
|
|
40
47
|
publisher?: AppPublisher;
|
|
48
|
+
manifestSchemaVersion: 1 | 2;
|
|
49
|
+
components?: AppResolvedComponent[];
|
|
50
|
+
primaryPanelId?: string;
|
|
41
51
|
}>;
|
|
42
52
|
grants: AppDocumentGrantMap;
|
|
43
53
|
};
|
|
@@ -47,6 +57,9 @@ type InstalledAppListItem = {
|
|
|
47
57
|
activeVersion: string;
|
|
48
58
|
sourceKind: AppInstallSourceKind;
|
|
49
59
|
distributionMode?: AppDistributionMode;
|
|
60
|
+
enabled: boolean;
|
|
61
|
+
manifestSchemaVersion: 1 | 2;
|
|
62
|
+
primaryPanelId?: string;
|
|
50
63
|
};
|
|
51
64
|
type AppUninstallResult = {
|
|
52
65
|
appId: string;
|
|
@@ -63,6 +76,15 @@ type AppUpdateResult = AppInstallResult & {
|
|
|
63
76
|
previousVersion: string;
|
|
64
77
|
updated: boolean;
|
|
65
78
|
};
|
|
79
|
+
type AppActivationResult = {
|
|
80
|
+
appId: string;
|
|
81
|
+
activeVersion: string;
|
|
82
|
+
enabled: boolean;
|
|
83
|
+
};
|
|
84
|
+
type AppRollbackResult = AppActivationResult & {
|
|
85
|
+
previousVersion: string;
|
|
86
|
+
rolledBack: boolean;
|
|
87
|
+
};
|
|
66
88
|
//#endregion
|
|
67
|
-
export { AppInfoResult, AppInstallResult, AppLaunchResolution, AppUninstallResult, AppUpdateResult, InstalledAppListItem };
|
|
89
|
+
export { AppActivationResult, AppInfoResult, AppInstallProgressHandler, AppInstallProgressPhase, AppInstallResult, AppLaunchResolution, AppRollbackResult, AppUninstallResult, AppUpdateResult, InstalledAppListItem };
|
|
68
90
|
//# sourceMappingURL=app-installation.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-installation.types.d.ts","names":[],"sources":["../../src/types/app-installation.types.ts"],"mappings":";;;;;;;KAMY,uBAAA;AAAA,KAOA,yBAAA,IACV,KAAA,EAAO,uBAAA,YACG,OAAA;AAAA,KAEA,gBAAA;EACV,KAAA;EACA,IAAA;EACA,OAAA;EACA,gBAAA;EACA,aAAA;EACA,UAAA,EAAY,oBAAA;EACZ,gBAAA,GAAmB,mBAAA;EACnB,SAAA;EACA,WAAA,EAAa,cAAA;EACb,WAAA;EACA,SAAA;EACA,MAAA;EACA,SAAA,GAAY,YAAA;EACZ,OAAA;EACA,qBAAA;EACA,UAAA,GAAa,oBAAA;EACb,cAAA;AAAA;AAAA,KAGU,aAAA;EACV,KAAA;EACA,IAAA;EACA,WAAA;EACA,aAAA;EACA,OAAA;EACA,aAAA;EACA,iBAAA,EAAmB,KAAA;IACjB,OAAA;IACA,gBAAA;IACA,UAAA,EAAY,oBAAA;IACZ,gBAAA,GAAmB,mBAAA;IACnB,SAAA;IACA,WAAA;IACA,WAAA,EAAa,cAAA;IACb,WAAA;IACA,SAAA;IACA,MAAA;IACA,SAAA,GAAY,YAAA;IACZ,qBAAA;IACA,UAAA,GAAa,oBAAA;IACb,cAAA;EAAA;EAEF,MAAA,EAAQ,mBAAA;AAAA;AAAA,KAGE,oBAAA;EACV,KAAA;EACA,IAAA;EACA,aAAA;EACA,UAAA,EAAY,oBAAA;EACZ,gBAAA,GAAmB,mBAAA;EACnB,OAAA;EACA,qBAAA;EACA,cAAA;AAAA;AAAA,KAGU,kBAAA;EACV,KAAA;EACA,eAAA;EACA,WAAA;AAAA;AAAA,KAGU,mBAAA;EACV,YAAA;EACA,KAAA;EACA,aAAA;EACA,gBAAA,EAAkB,mBAAA;AAAA;AAAA,KAGR,eAAA,GAAkB,gBAAA;EAC5B,eAAA;EACA,OAAA;AAAA;AAAA,KAGU,mBAAA;EACV,KAAA;EACA,aAAA;EACA,OAAA;AAAA;AAAA,KAGU,iBAAA,GAAoB,mBAAA;EAC9B,eAAA;EACA,UAAA;AAAA"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
//#region src/types/app-manifest.types.d.ts
|
|
2
|
+
type AppDocumentAccessMode = "read" | "read-write";
|
|
3
|
+
type AppDocumentAccessScope = {
|
|
4
|
+
id: string;
|
|
5
|
+
mode: AppDocumentAccessMode;
|
|
6
|
+
description?: string;
|
|
7
|
+
};
|
|
8
|
+
type AppPermissions = {
|
|
9
|
+
documentAccess?: AppDocumentAccessScope[];
|
|
10
|
+
allowedDomains?: string[];
|
|
11
|
+
storage?: boolean | {
|
|
12
|
+
namespace?: string;
|
|
13
|
+
};
|
|
14
|
+
capabilities?: {
|
|
15
|
+
hostBridge?: boolean;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
type AppCoreWasmMainManifest = {
|
|
19
|
+
kind: "wasm";
|
|
20
|
+
entry: string;
|
|
21
|
+
export: string;
|
|
22
|
+
action: string;
|
|
23
|
+
};
|
|
24
|
+
type AppWasiHttpComponentMainManifest = {
|
|
25
|
+
kind: "wasi-http-component";
|
|
26
|
+
entry: string;
|
|
27
|
+
};
|
|
28
|
+
type AppMainManifest = AppCoreWasmMainManifest | AppWasiHttpComponentMainManifest;
|
|
29
|
+
type AppUiManifest = {
|
|
30
|
+
entry: string;
|
|
31
|
+
};
|
|
32
|
+
type AppStandaloneManifest = {
|
|
33
|
+
schemaVersion: 1;
|
|
34
|
+
id: string;
|
|
35
|
+
name: string;
|
|
36
|
+
version: string;
|
|
37
|
+
description?: string;
|
|
38
|
+
icon?: string;
|
|
39
|
+
main: AppMainManifest;
|
|
40
|
+
ui: AppUiManifest;
|
|
41
|
+
permissions?: AppPermissions;
|
|
42
|
+
};
|
|
43
|
+
type AppComponentKind = "panel" | "service";
|
|
44
|
+
type AppComponentReference = {
|
|
45
|
+
kind: AppComponentKind;
|
|
46
|
+
path: string;
|
|
47
|
+
};
|
|
48
|
+
type AppComponentManifest = {
|
|
49
|
+
schemaVersion: 2;
|
|
50
|
+
id: string;
|
|
51
|
+
name: string;
|
|
52
|
+
version: string;
|
|
53
|
+
description?: string;
|
|
54
|
+
icon?: string;
|
|
55
|
+
engines?: {
|
|
56
|
+
nextclaw?: string;
|
|
57
|
+
};
|
|
58
|
+
presentation?: {
|
|
59
|
+
primaryPanel?: string;
|
|
60
|
+
};
|
|
61
|
+
components: AppComponentReference[];
|
|
62
|
+
};
|
|
63
|
+
type AppManifest = AppStandaloneManifest | AppComponentManifest;
|
|
64
|
+
type AppResolvedComponent = AppComponentReference & {
|
|
65
|
+
id: string;
|
|
66
|
+
componentDirectory: string;
|
|
67
|
+
manifestPath: string;
|
|
68
|
+
};
|
|
69
|
+
type AppStandaloneManifestBundle = {
|
|
70
|
+
appDirectory: string;
|
|
71
|
+
manifestPath: string;
|
|
72
|
+
manifest: AppStandaloneManifest;
|
|
73
|
+
mainEntryPath: string;
|
|
74
|
+
uiEntryPath: string;
|
|
75
|
+
uiDirectoryPath: string;
|
|
76
|
+
assetsDirectoryPath: string;
|
|
77
|
+
iconPath?: string;
|
|
78
|
+
};
|
|
79
|
+
type AppComponentManifestBundle = {
|
|
80
|
+
appDirectory: string;
|
|
81
|
+
manifestPath: string;
|
|
82
|
+
manifest: AppComponentManifest;
|
|
83
|
+
components: AppResolvedComponent[];
|
|
84
|
+
assetsDirectoryPath: string;
|
|
85
|
+
iconPath?: string;
|
|
86
|
+
primaryPanelId?: string;
|
|
87
|
+
};
|
|
88
|
+
type AppManifestBundle = AppStandaloneManifestBundle | AppComponentManifestBundle;
|
|
89
|
+
type AppStandaloneManifestSummary = {
|
|
90
|
+
schemaVersion: 1;
|
|
91
|
+
id: string;
|
|
92
|
+
name: string;
|
|
93
|
+
version: string;
|
|
94
|
+
description?: string;
|
|
95
|
+
mainKind: AppMainManifest["kind"];
|
|
96
|
+
action?: string;
|
|
97
|
+
manifestPath: string;
|
|
98
|
+
mainEntryPath: string;
|
|
99
|
+
uiEntryPath: string;
|
|
100
|
+
iconPath?: string;
|
|
101
|
+
permissions: AppPermissions;
|
|
102
|
+
};
|
|
103
|
+
type AppComponentManifestSummary = {
|
|
104
|
+
schemaVersion: 2;
|
|
105
|
+
id: string;
|
|
106
|
+
name: string;
|
|
107
|
+
version: string;
|
|
108
|
+
description?: string;
|
|
109
|
+
manifestPath: string;
|
|
110
|
+
iconPath?: string;
|
|
111
|
+
primaryPanelId?: string;
|
|
112
|
+
components: AppResolvedComponent[];
|
|
113
|
+
};
|
|
114
|
+
type AppManifestSummary = AppStandaloneManifestSummary | AppComponentManifestSummary;
|
|
115
|
+
declare function isAppStandaloneManifestBundle(bundle: AppManifestBundle): bundle is AppStandaloneManifestBundle;
|
|
116
|
+
declare function isAppComponentManifestBundle(bundle: AppManifestBundle): bundle is AppComponentManifestBundle;
|
|
117
|
+
//#endregion
|
|
118
|
+
export { AppComponentKind, AppComponentManifest, AppComponentManifestBundle, AppComponentManifestSummary, AppComponentReference, AppCoreWasmMainManifest, AppDocumentAccessMode, AppDocumentAccessScope, AppMainManifest, AppManifest, AppManifestBundle, AppManifestSummary, AppPermissions, AppResolvedComponent, AppStandaloneManifest, AppStandaloneManifestBundle, AppStandaloneManifestSummary, AppUiManifest, AppWasiHttpComponentMainManifest, isAppComponentManifestBundle, isAppStandaloneManifestBundle };
|
|
119
|
+
//# sourceMappingURL=app-manifest.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-manifest.types.d.ts","names":[],"sources":["../../src/types/app-manifest.types.ts"],"mappings":";KAAY,qBAAA;AAAA,KAEA,sBAAA;EACV,EAAA;EACA,IAAA,EAAM,qBAAA;EACN,WAAA;AAAA;AAAA,KAGU,cAAA;EACV,cAAA,GAAiB,sBAAA;EACjB,cAAA;EACA,OAAA;IAAsB,SAAA;EAAA;EACtB,YAAA;IACE,UAAA;EAAA;AAAA;AAAA,KAIQ,uBAAA;EACV,IAAA;EACA,KAAA;EACA,MAAA;EACA,MAAA;AAAA;AAAA,KAGU,gCAAA;EACV,IAAA;EACA,KAAA;AAAA;AAAA,KAGU,eAAA,GAAkB,uBAAA,GAA0B,gCAAA;AAAA,KAE5C,aAAA;EACV,KAAA;AAAA;AAAA,KAGU,qBAAA;EACV,aAAA;EACA,EAAA;EACA,IAAA;EACA,OAAA;EACA,WAAA;EACA,IAAA;EACA,IAAA,EAAM,eAAA;EACN,EAAA,EAAI,aAAA;EACJ,WAAA,GAAc,cAAA;AAAA;AAAA,KAGJ,gBAAA;AAAA,KAEA,qBAAA;EACV,IAAA,EAAM,gBAAA;EACN,IAAA;AAAA;AAAA,KAGU,oBAAA;EACV,aAAA;EACA,EAAA;EACA,IAAA;EACA,OAAA;EACA,WAAA;EACA,IAAA;EACA,OAAA;IACE,QAAA;EAAA;EAEF,YAAA;IACE,YAAA;EAAA;EAEF,UAAA,EAAY,qBAAA;AAAA;AAAA,KAGF,WAAA,GAAc,qBAAA,GAAwB,oBAAA;AAAA,KAEtC,oBAAA,GAAuB,qBAAA;EACjC,EAAA;EACA,kBAAA;EACA,YAAA;AAAA;AAAA,KAGU,2BAAA;EACV,YAAA;EACA,YAAA;EACA,QAAA,EAAU,qBAAA;EACV,aAAA;EACA,WAAA;EACA,eAAA;EACA,mBAAA;EACA,QAAA;AAAA;AAAA,KAGU,0BAAA;EACV,YAAA;EACA,YAAA;EACA,QAAA,EAAU,oBAAA;EACV,UAAA,EAAY,oBAAA;EACZ,mBAAA;EACA,QAAA;EACA,cAAA;AAAA;AAAA,KAGU,iBAAA,GAAoB,2BAAA,GAA8B,0BAAA;AAAA,KAElD,4BAAA;EACV,aAAA;EACA,EAAA;EACA,IAAA;EACA,OAAA;EACA,WAAA;EACA,QAAA,EAAU,eAAA;EACV,MAAA;EACA,YAAA;EACA,aAAA;EACA,WAAA;EACA,QAAA;EACA,WAAA,EAAa,cAAA;AAAA;AAAA,KAGH,2BAAA;EACV,aAAA;EACA,EAAA;EACA,IAAA;EACA,OAAA;EACA,WAAA;EACA,YAAA;EACA,QAAA;EACA,cAAA;EACA,UAAA,EAAY,oBAAA;AAAA;AAAA,KAGF,kBAAA,GAAqB,4BAAA,GAA+B,2BAAA;AAAA,iBAEhD,6BAAA,CACd,MAAA,EAAQ,iBAAA,GACP,MAAA,IAAU,2BAAA;AAAA,iBAIG,4BAAA,CACd,MAAA,EAAQ,iBAAA,GACP,MAAA,IAAU,0BAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//#region src/types/app-manifest.types.ts
|
|
2
|
+
function isAppStandaloneManifestBundle(bundle) {
|
|
3
|
+
return bundle.manifest.schemaVersion === 1;
|
|
4
|
+
}
|
|
5
|
+
function isAppComponentManifestBundle(bundle) {
|
|
6
|
+
return bundle.manifest.schemaVersion === 2;
|
|
7
|
+
}
|
|
8
|
+
//#endregion
|
|
9
|
+
export { isAppComponentManifestBundle, isAppStandaloneManifestBundle };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=app-manifest.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-manifest.types.js","names":[],"sources":["../../src/types/app-manifest.types.ts"],"sourcesContent":["export type AppDocumentAccessMode = \"read\" | \"read-write\";\n\nexport type AppDocumentAccessScope = {\n id: string;\n mode: AppDocumentAccessMode;\n description?: string;\n};\n\nexport type AppPermissions = {\n documentAccess?: AppDocumentAccessScope[];\n allowedDomains?: string[];\n storage?: boolean | { namespace?: string };\n capabilities?: {\n hostBridge?: boolean;\n };\n};\n\nexport type AppCoreWasmMainManifest = {\n kind: \"wasm\";\n entry: string;\n export: string;\n action: string;\n};\n\nexport type AppWasiHttpComponentMainManifest = {\n kind: \"wasi-http-component\";\n entry: string;\n};\n\nexport type AppMainManifest = AppCoreWasmMainManifest | AppWasiHttpComponentMainManifest;\n\nexport type AppUiManifest = {\n entry: string;\n};\n\nexport type AppStandaloneManifest = {\n schemaVersion: 1;\n id: string;\n name: string;\n version: string;\n description?: string;\n icon?: string;\n main: AppMainManifest;\n ui: AppUiManifest;\n permissions?: AppPermissions;\n};\n\nexport type AppComponentKind = \"panel\" | \"service\";\n\nexport type AppComponentReference = {\n kind: AppComponentKind;\n path: string;\n};\n\nexport type AppComponentManifest = {\n schemaVersion: 2;\n id: string;\n name: string;\n version: string;\n description?: string;\n icon?: string;\n engines?: {\n nextclaw?: string;\n };\n presentation?: {\n primaryPanel?: string;\n };\n components: AppComponentReference[];\n};\n\nexport type AppManifest = AppStandaloneManifest | AppComponentManifest;\n\nexport type AppResolvedComponent = AppComponentReference & {\n id: string;\n componentDirectory: string;\n manifestPath: string;\n};\n\nexport type AppStandaloneManifestBundle = {\n appDirectory: string;\n manifestPath: string;\n manifest: AppStandaloneManifest;\n mainEntryPath: string;\n uiEntryPath: string;\n uiDirectoryPath: string;\n assetsDirectoryPath: string;\n iconPath?: string;\n};\n\nexport type AppComponentManifestBundle = {\n appDirectory: string;\n manifestPath: string;\n manifest: AppComponentManifest;\n components: AppResolvedComponent[];\n assetsDirectoryPath: string;\n iconPath?: string;\n primaryPanelId?: string;\n};\n\nexport type AppManifestBundle = AppStandaloneManifestBundle | AppComponentManifestBundle;\n\nexport type AppStandaloneManifestSummary = {\n schemaVersion: 1;\n id: string;\n name: string;\n version: string;\n description?: string;\n mainKind: AppMainManifest[\"kind\"];\n action?: string;\n manifestPath: string;\n mainEntryPath: string;\n uiEntryPath: string;\n iconPath?: string;\n permissions: AppPermissions;\n};\n\nexport type AppComponentManifestSummary = {\n schemaVersion: 2;\n id: string;\n name: string;\n version: string;\n description?: string;\n manifestPath: string;\n iconPath?: string;\n primaryPanelId?: string;\n components: AppResolvedComponent[];\n};\n\nexport type AppManifestSummary = AppStandaloneManifestSummary | AppComponentManifestSummary;\n\nexport function isAppStandaloneManifestBundle(\n bundle: AppManifestBundle,\n): bundle is AppStandaloneManifestBundle {\n return bundle.manifest.schemaVersion === 1;\n}\n\nexport function isAppComponentManifestBundle(\n bundle: AppManifestBundle,\n): bundle is AppComponentManifestBundle {\n return bundle.manifest.schemaVersion === 2;\n}\n"],"mappings":";AAkIA,SAAgB,8BACd,QACuC;AACvC,QAAO,OAAO,SAAS,kBAAkB;;AAG3C,SAAgB,6BACd,QACsC;AACtC,QAAO,OAAO,SAAS,kBAAkB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { AppPermissions } from "
|
|
1
|
+
import { AppPermissions } from "./app-manifest.types.js";
|
|
2
2
|
|
|
3
|
-
//#region src/
|
|
3
|
+
//#region src/types/app-permissions.types.d.ts
|
|
4
4
|
type AppDocumentGrantMap = Record<string, string>;
|
|
5
5
|
type ResolvedDocumentGrant = {
|
|
6
6
|
id: string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-permissions.types.d.ts","names":[],"sources":["../../src/types/app-permissions.types.ts"],"mappings":";;;KAEY,mBAAA,GAAsB,MAAA;AAAA,KAEtB,qBAAA;EACV,EAAA;EACA,IAAA;EACA,WAAA;EACA,IAAA;AAAA;AAAA,KAGU,mBAAA;EACV,cAAA,EAAgB,qBAAA;EAChB,cAAA;EACA,OAAA;IACE,OAAA;IACA,SAAA;EAAA;EAEF,YAAA;IACE,UAAA;EAAA;AAAA;AAAA,KAIQ,oBAAA,GAAuB,IAAA,CACjC,mBAAA;EAGA,SAAA,EAAW,cAAA;AAAA;AAAA,KAGD,qBAAA;EACV,EAAA;EACA,IAAA;EACA,WAAA;EACA,OAAA;EACA,WAAA;AAAA;AAAA,KAGU,2BAAA;EACV,KAAA;EACA,IAAA;EACA,aAAA;EACA,cAAA,EAAgB,qBAAA;EAChB,cAAA;EACA,OAAA;IACE,OAAA;IACA,SAAA;EAAA;EAEF,YAAA;IACE,UAAA;EAAA;AAAA;AAAA,KAIQ,8BAAA;EACV,KAAA;EACA,OAAA;EACA,WAAA;EACA,OAAA;AAAA"}
|