@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.
Files changed (307) hide show
  1. package/README.md +2 -2
  2. package/dist/{main.js → app/main.js} +2 -2
  3. package/dist/app/main.js.map +1 -0
  4. package/dist/{commands → controllers}/create.controller.d.ts +2 -2
  5. package/dist/controllers/create.controller.d.ts.map +1 -0
  6. package/dist/{commands → controllers}/create.controller.js +2 -2
  7. package/dist/controllers/create.controller.js.map +1 -0
  8. package/dist/{commands → controllers}/dev.controller.js +1 -1
  9. package/dist/controllers/dev.controller.js.map +1 -0
  10. package/dist/{commands → controllers}/grant.controller.d.ts +3 -3
  11. package/dist/controllers/grant.controller.d.ts.map +1 -0
  12. package/dist/{commands → controllers}/grant.controller.js +2 -2
  13. package/dist/controllers/grant.controller.js.map +1 -0
  14. package/dist/{commands → controllers}/info.controller.d.ts +2 -2
  15. package/dist/controllers/info.controller.d.ts.map +1 -0
  16. package/dist/{commands → controllers}/info.controller.js +2 -2
  17. package/dist/controllers/info.controller.js.map +1 -0
  18. package/dist/{commands → controllers}/inspect.controller.js +8 -2
  19. package/dist/controllers/inspect.controller.js.map +1 -0
  20. package/dist/{commands → controllers}/install.controller.d.ts +2 -2
  21. package/dist/controllers/install.controller.d.ts.map +1 -0
  22. package/dist/{commands → controllers}/install.controller.js +2 -2
  23. package/dist/controllers/install.controller.js.map +1 -0
  24. package/dist/{commands → controllers}/list.controller.d.ts +2 -2
  25. package/dist/controllers/list.controller.d.ts.map +1 -0
  26. package/dist/{commands → controllers}/list.controller.js +2 -2
  27. package/dist/controllers/list.controller.js.map +1 -0
  28. package/dist/controllers/pack.controller.d.ts +19 -0
  29. package/dist/controllers/pack.controller.d.ts.map +1 -0
  30. package/dist/{commands → controllers}/pack.controller.js +8 -4
  31. package/dist/controllers/pack.controller.js.map +1 -0
  32. package/dist/{commands → controllers}/permissions.controller.d.ts +2 -2
  33. package/dist/controllers/permissions.controller.d.ts.map +1 -0
  34. package/dist/{commands → controllers}/permissions.controller.js +2 -2
  35. package/dist/controllers/permissions.controller.js.map +1 -0
  36. package/dist/{commands → controllers}/publish.controller.d.ts +3 -3
  37. package/dist/controllers/publish.controller.d.ts.map +1 -0
  38. package/dist/{commands → controllers}/publish.controller.js +2 -2
  39. package/dist/controllers/publish.controller.js.map +1 -0
  40. package/dist/{commands → controllers}/registry.controller.d.ts +2 -2
  41. package/dist/controllers/registry.controller.d.ts.map +1 -0
  42. package/dist/{commands → controllers}/registry.controller.js +2 -2
  43. package/dist/controllers/registry.controller.js.map +1 -0
  44. package/dist/{commands → controllers}/revoke.controller.d.ts +2 -2
  45. package/dist/controllers/revoke.controller.d.ts.map +1 -0
  46. package/dist/{commands → controllers}/revoke.controller.js +2 -2
  47. package/dist/controllers/revoke.controller.js.map +1 -0
  48. package/dist/{commands → controllers}/run.controller.js +8 -6
  49. package/dist/controllers/run.controller.js.map +1 -0
  50. package/dist/{commands → controllers}/uninstall.controller.d.ts +2 -2
  51. package/dist/controllers/uninstall.controller.d.ts.map +1 -0
  52. package/dist/{commands → controllers}/uninstall.controller.js +2 -2
  53. package/dist/controllers/uninstall.controller.js.map +1 -0
  54. package/dist/{commands → controllers}/update.controller.d.ts +2 -2
  55. package/dist/controllers/update.controller.d.ts.map +1 -0
  56. package/dist/{commands → controllers}/update.controller.js +2 -2
  57. package/dist/controllers/update.controller.js.map +1 -0
  58. package/dist/{commands → controllers}/validate-publish.controller.d.ts +3 -3
  59. package/dist/controllers/validate-publish.controller.d.ts.map +1 -0
  60. package/dist/{commands → controllers}/validate-publish.controller.js +9 -5
  61. package/dist/controllers/validate-publish.controller.js.map +1 -0
  62. package/dist/index.d.ts +51 -51
  63. package/dist/index.js +46 -45
  64. package/dist/package.js +1 -1
  65. package/dist/{runtime → services}/app-build.service.d.ts +2 -2
  66. package/dist/services/app-build.service.d.ts.map +1 -0
  67. package/dist/{runtime → services}/app-build.service.js +4 -2
  68. package/dist/services/app-build.service.js.map +1 -0
  69. package/dist/{bundle → services}/app-bundle.service.d.ts +18 -6
  70. package/dist/services/app-bundle.service.d.ts.map +1 -0
  71. package/dist/services/app-bundle.service.js +305 -0
  72. package/dist/services/app-bundle.service.js.map +1 -0
  73. package/dist/{permissions → services}/app-grant.service.d.ts +4 -4
  74. package/dist/services/app-grant.service.d.ts.map +1 -0
  75. package/dist/{permissions → services}/app-grant.service.js +7 -4
  76. package/dist/services/app-grant.service.js.map +1 -0
  77. package/dist/{paths → services}/app-home.service.d.ts +2 -1
  78. package/dist/services/app-home.service.d.ts.map +1 -0
  79. package/dist/{paths → services}/app-home.service.js +4 -1
  80. package/dist/services/app-home.service.js.map +1 -0
  81. package/dist/{host → services}/app-host.service.d.ts +2 -2
  82. package/dist/services/app-host.service.d.ts.map +1 -0
  83. package/dist/{host → services}/app-host.service.js +3 -3
  84. package/dist/services/app-host.service.js.map +1 -0
  85. package/dist/services/app-install-source.service.js +72 -0
  86. package/dist/services/app-install-source.service.js.map +1 -0
  87. package/dist/services/app-installation.service.d.ts +48 -0
  88. package/dist/services/app-installation.service.d.ts.map +1 -0
  89. package/dist/services/app-installation.service.js +411 -0
  90. package/dist/services/app-installation.service.js.map +1 -0
  91. package/dist/services/app-instance.service.d.ts +34 -0
  92. package/dist/services/app-instance.service.d.ts.map +1 -0
  93. package/dist/{host → services}/app-instance.service.js +4 -4
  94. package/dist/services/app-instance.service.js.map +1 -0
  95. package/dist/{manifest → services}/app-manifest.service.d.ts +12 -2
  96. package/dist/services/app-manifest.service.d.ts.map +1 -0
  97. package/dist/services/app-manifest.service.js +271 -0
  98. package/dist/services/app-manifest.service.js.map +1 -0
  99. package/dist/{publish → services}/app-marketplace-client.service.d.ts +2 -2
  100. package/dist/services/app-marketplace-client.service.d.ts.map +1 -0
  101. package/dist/{publish → services}/app-marketplace-client.service.js +2 -2
  102. package/dist/services/app-marketplace-client.service.js.map +1 -0
  103. package/dist/{publish → services}/app-marketplace-metadata.service.d.ts +7 -3
  104. package/dist/services/app-marketplace-metadata.service.d.ts.map +1 -0
  105. package/dist/{publish → services}/app-marketplace-metadata.service.js +45 -3
  106. package/dist/services/app-marketplace-metadata.service.js.map +1 -0
  107. package/dist/{permissions → services}/app-permissions.service.d.ts +3 -3
  108. package/dist/services/app-permissions.service.d.ts.map +1 -0
  109. package/dist/{permissions → services}/app-permissions.service.js +4 -1
  110. package/dist/services/app-permissions.service.js.map +1 -0
  111. package/dist/{publish → services}/app-publish-validation.service.d.ts +9 -7
  112. package/dist/services/app-publish-validation.service.d.ts.map +1 -0
  113. package/dist/{publish → services}/app-publish-validation.service.js +14 -10
  114. package/dist/services/app-publish-validation.service.js.map +1 -0
  115. package/dist/{publish → services}/app-publish.service.d.ts +5 -5
  116. package/dist/services/app-publish.service.d.ts.map +1 -0
  117. package/dist/{publish → services}/app-publish.service.js +10 -7
  118. package/dist/services/app-publish.service.js.map +1 -0
  119. package/dist/{registry → services}/app-registry-config.service.d.ts +3 -3
  120. package/dist/{registry → services}/app-registry-config.service.d.ts.map +1 -1
  121. package/dist/{registry → services}/app-registry-config.service.js +3 -3
  122. package/dist/services/app-registry-config.service.js.map +1 -0
  123. package/dist/{registry → services}/app-registry.service.d.ts +20 -5
  124. package/dist/services/app-registry.service.d.ts.map +1 -0
  125. package/dist/services/app-registry.service.js +228 -0
  126. package/dist/services/app-registry.service.js.map +1 -0
  127. package/dist/{registry → services}/app-remote-registry-client.service.d.ts +6 -2
  128. package/dist/services/app-remote-registry-client.service.d.ts.map +1 -0
  129. package/dist/{registry → services}/app-remote-registry-client.service.js +54 -8
  130. package/dist/services/app-remote-registry-client.service.js.map +1 -0
  131. package/dist/{cli → services}/app-runtime-cli.service.d.ts +1 -1
  132. package/dist/services/app-runtime-cli.service.d.ts.map +1 -0
  133. package/dist/{cli → services}/app-runtime-cli.service.js +19 -19
  134. package/dist/services/app-runtime-cli.service.js.map +1 -0
  135. package/dist/{cli → services}/app-runtime-options.service.d.ts +6 -6
  136. package/dist/services/app-runtime-options.service.d.ts.map +1 -0
  137. package/dist/{cli → services}/app-runtime-options.service.js +3 -9
  138. package/dist/services/app-runtime-options.service.js.map +1 -0
  139. package/dist/{runtime → services}/app-runtime-toolchain.service.d.ts +1 -1
  140. package/dist/services/app-runtime-toolchain.service.d.ts.map +1 -0
  141. package/dist/{runtime → services}/app-runtime-toolchain.service.js +1 -1
  142. package/dist/services/app-runtime-toolchain.service.js.map +1 -0
  143. package/dist/{scaffold → services}/app-scaffold.service.d.ts +1 -1
  144. package/dist/{scaffold → services}/app-scaffold.service.d.ts.map +1 -1
  145. package/dist/{scaffold → services}/app-scaffold.service.js +1 -1
  146. package/dist/{scaffold → services}/app-scaffold.service.js.map +1 -1
  147. package/dist/{scaffold → services}/app-ts-http-lite-scaffold-template.service.d.ts +1 -1
  148. package/dist/{scaffold → services}/app-ts-http-lite-scaffold-template.service.d.ts.map +1 -1
  149. package/dist/{scaffold → services}/app-ts-http-lite-scaffold-template.service.js +1 -1
  150. package/dist/{scaffold → services}/app-ts-http-lite-scaffold-template.service.js.map +1 -1
  151. package/dist/{scaffold → services}/app-ts-http-scaffold-template.service.d.ts +1 -1
  152. package/dist/{scaffold → services}/app-ts-http-scaffold-template.service.d.ts.map +1 -1
  153. package/dist/{scaffold → services}/app-ts-http-scaffold-template.service.js +1 -1
  154. package/dist/{scaffold → services}/app-ts-http-scaffold-template.service.js.map +1 -1
  155. package/dist/{bridge → services}/host-bridge.service.d.ts +2 -2
  156. package/dist/services/host-bridge.service.d.ts.map +1 -0
  157. package/dist/{bridge → services}/host-bridge.service.js +1 -1
  158. package/dist/services/host-bridge.service.js.map +1 -0
  159. package/dist/services/main-runner.service.d.ts +9 -0
  160. package/dist/services/main-runner.service.d.ts.map +1 -0
  161. package/dist/services/main-runner.service.js +6 -0
  162. package/dist/services/main-runner.service.js.map +1 -0
  163. package/dist/{publish → services}/platform-auth-state.service.d.ts +1 -1
  164. package/dist/services/platform-auth-state.service.d.ts.map +1 -0
  165. package/dist/{publish → services}/platform-auth-state.service.js +1 -1
  166. package/dist/services/platform-auth-state.service.js.map +1 -0
  167. package/dist/{ui → services}/ui-server.service.d.ts +3 -3
  168. package/dist/services/ui-server.service.d.ts.map +1 -0
  169. package/dist/{ui → services}/ui-server.service.js +1 -1
  170. package/dist/services/ui-server.service.js.map +1 -0
  171. package/dist/{runtime → services}/wasm-main-runner.service.d.ts +3 -3
  172. package/dist/services/wasm-main-runner.service.d.ts.map +1 -0
  173. package/dist/{runtime → services}/wasm-main-runner.service.js +2 -2
  174. package/dist/services/wasm-main-runner.service.js.map +1 -0
  175. package/dist/{sidecar → services}/wasm-sidecar-client.service.d.ts +1 -1
  176. package/dist/services/wasm-sidecar-client.service.d.ts.map +1 -0
  177. package/dist/{sidecar → services}/wasm-sidecar-client.service.js +1 -1
  178. package/dist/services/wasm-sidecar-client.service.js.map +1 -0
  179. package/dist/{runtime → services}/wasmtime-wasi-http-component.service.d.ts +1 -1
  180. package/dist/services/wasmtime-wasi-http-component.service.d.ts.map +1 -0
  181. package/dist/{runtime → services}/wasmtime-wasi-http-component.service.js +1 -1
  182. package/dist/services/wasmtime-wasi-http-component.service.js.map +1 -0
  183. package/dist/{bundle → types}/app-bundle.types.d.ts +1 -1
  184. package/dist/types/app-bundle.types.d.ts.map +1 -0
  185. package/dist/{install → types}/app-installation.types.d.ts +29 -7
  186. package/dist/types/app-installation.types.d.ts.map +1 -0
  187. package/dist/types/app-manifest.types.d.ts +119 -0
  188. package/dist/types/app-manifest.types.d.ts.map +1 -0
  189. package/dist/types/app-manifest.types.js +11 -0
  190. package/dist/types/app-manifest.types.js.map +1 -0
  191. package/dist/{permissions → types}/app-permissions.types.d.ts +2 -2
  192. package/dist/types/app-permissions.types.d.ts.map +1 -0
  193. package/dist/{publish → types}/app-publish.types.d.ts +11 -5
  194. package/dist/types/app-publish.types.d.ts.map +1 -0
  195. package/dist/{publish → types}/app-publish.types.js +1 -1
  196. package/dist/types/app-publish.types.js.map +1 -0
  197. package/dist/{registry → types}/app-registry.types.d.ts +11 -4
  198. package/dist/types/app-registry.types.d.ts.map +1 -0
  199. package/dist/{registry → types}/app-remote-registry.types.d.ts +3 -3
  200. package/dist/types/app-remote-registry.types.d.ts.map +1 -0
  201. package/dist/{registry → types}/app-remote-registry.types.js +1 -1
  202. package/dist/types/app-remote-registry.types.js.map +1 -0
  203. package/dist/{runtime → types}/main-runner.types.d.ts +3 -3
  204. package/dist/types/main-runner.types.d.ts.map +1 -0
  205. package/package.json +10 -3
  206. package/dist/bridge/host-bridge.service.d.ts.map +0 -1
  207. package/dist/bridge/host-bridge.service.js.map +0 -1
  208. package/dist/bundle/app-bundle.service.d.ts.map +0 -1
  209. package/dist/bundle/app-bundle.service.js +0 -196
  210. package/dist/bundle/app-bundle.service.js.map +0 -1
  211. package/dist/bundle/app-bundle.types.d.ts.map +0 -1
  212. package/dist/cli/app-runtime-cli.service.d.ts.map +0 -1
  213. package/dist/cli/app-runtime-cli.service.js.map +0 -1
  214. package/dist/cli/app-runtime-options.service.d.ts.map +0 -1
  215. package/dist/cli/app-runtime-options.service.js.map +0 -1
  216. package/dist/commands/create.controller.d.ts.map +0 -1
  217. package/dist/commands/create.controller.js.map +0 -1
  218. package/dist/commands/dev.controller.js.map +0 -1
  219. package/dist/commands/grant.controller.d.ts.map +0 -1
  220. package/dist/commands/grant.controller.js.map +0 -1
  221. package/dist/commands/info.controller.d.ts.map +0 -1
  222. package/dist/commands/info.controller.js.map +0 -1
  223. package/dist/commands/inspect.controller.js.map +0 -1
  224. package/dist/commands/install.controller.d.ts.map +0 -1
  225. package/dist/commands/install.controller.js.map +0 -1
  226. package/dist/commands/list.controller.d.ts.map +0 -1
  227. package/dist/commands/list.controller.js.map +0 -1
  228. package/dist/commands/pack.controller.d.ts +0 -17
  229. package/dist/commands/pack.controller.d.ts.map +0 -1
  230. package/dist/commands/pack.controller.js.map +0 -1
  231. package/dist/commands/permissions.controller.d.ts.map +0 -1
  232. package/dist/commands/permissions.controller.js.map +0 -1
  233. package/dist/commands/publish.controller.d.ts.map +0 -1
  234. package/dist/commands/publish.controller.js.map +0 -1
  235. package/dist/commands/registry.controller.d.ts.map +0 -1
  236. package/dist/commands/registry.controller.js.map +0 -1
  237. package/dist/commands/revoke.controller.d.ts.map +0 -1
  238. package/dist/commands/revoke.controller.js.map +0 -1
  239. package/dist/commands/run.controller.js.map +0 -1
  240. package/dist/commands/uninstall.controller.d.ts.map +0 -1
  241. package/dist/commands/uninstall.controller.js.map +0 -1
  242. package/dist/commands/update.controller.d.ts.map +0 -1
  243. package/dist/commands/update.controller.js.map +0 -1
  244. package/dist/commands/validate-publish.controller.d.ts.map +0 -1
  245. package/dist/commands/validate-publish.controller.js.map +0 -1
  246. package/dist/host/app-host.service.d.ts.map +0 -1
  247. package/dist/host/app-host.service.js.map +0 -1
  248. package/dist/host/app-instance.service.d.ts +0 -34
  249. package/dist/host/app-instance.service.d.ts.map +0 -1
  250. package/dist/host/app-instance.service.js.map +0 -1
  251. package/dist/install/app-installation.service.d.ts +0 -41
  252. package/dist/install/app-installation.service.d.ts.map +0 -1
  253. package/dist/install/app-installation.service.js +0 -276
  254. package/dist/install/app-installation.service.js.map +0 -1
  255. package/dist/install/app-installation.types.d.ts.map +0 -1
  256. package/dist/main.js.map +0 -1
  257. package/dist/manifest/app-manifest.service.d.ts.map +0 -1
  258. package/dist/manifest/app-manifest.service.js +0 -147
  259. package/dist/manifest/app-manifest.service.js.map +0 -1
  260. package/dist/manifest/app-manifest.types.d.ts +0 -68
  261. package/dist/manifest/app-manifest.types.d.ts.map +0 -1
  262. package/dist/paths/app-home.service.d.ts.map +0 -1
  263. package/dist/paths/app-home.service.js.map +0 -1
  264. package/dist/permissions/app-grant.service.d.ts.map +0 -1
  265. package/dist/permissions/app-grant.service.js.map +0 -1
  266. package/dist/permissions/app-permissions.service.d.ts.map +0 -1
  267. package/dist/permissions/app-permissions.service.js.map +0 -1
  268. package/dist/permissions/app-permissions.types.d.ts.map +0 -1
  269. package/dist/publish/app-marketplace-client.service.d.ts.map +0 -1
  270. package/dist/publish/app-marketplace-client.service.js.map +0 -1
  271. package/dist/publish/app-marketplace-metadata.service.d.ts.map +0 -1
  272. package/dist/publish/app-marketplace-metadata.service.js.map +0 -1
  273. package/dist/publish/app-publish-validation.service.d.ts.map +0 -1
  274. package/dist/publish/app-publish-validation.service.js.map +0 -1
  275. package/dist/publish/app-publish.service.d.ts.map +0 -1
  276. package/dist/publish/app-publish.service.js.map +0 -1
  277. package/dist/publish/app-publish.types.d.ts.map +0 -1
  278. package/dist/publish/app-publish.types.js.map +0 -1
  279. package/dist/publish/platform-auth-state.service.d.ts.map +0 -1
  280. package/dist/publish/platform-auth-state.service.js.map +0 -1
  281. package/dist/registry/app-registry-config.service.js.map +0 -1
  282. package/dist/registry/app-registry.service.d.ts.map +0 -1
  283. package/dist/registry/app-registry.service.js +0 -118
  284. package/dist/registry/app-registry.service.js.map +0 -1
  285. package/dist/registry/app-registry.types.d.ts.map +0 -1
  286. package/dist/registry/app-remote-registry-client.service.d.ts.map +0 -1
  287. package/dist/registry/app-remote-registry-client.service.js.map +0 -1
  288. package/dist/registry/app-remote-registry.types.d.ts.map +0 -1
  289. package/dist/registry/app-remote-registry.types.js.map +0 -1
  290. package/dist/runtime/app-build.service.d.ts.map +0 -1
  291. package/dist/runtime/app-build.service.js.map +0 -1
  292. package/dist/runtime/app-runtime-toolchain.service.d.ts.map +0 -1
  293. package/dist/runtime/app-runtime-toolchain.service.js.map +0 -1
  294. package/dist/runtime/main-runner.service.d.ts +0 -9
  295. package/dist/runtime/main-runner.service.d.ts.map +0 -1
  296. package/dist/runtime/main-runner.service.js +0 -6
  297. package/dist/runtime/main-runner.service.js.map +0 -1
  298. package/dist/runtime/main-runner.types.d.ts.map +0 -1
  299. package/dist/runtime/wasm-main-runner.service.d.ts.map +0 -1
  300. package/dist/runtime/wasm-main-runner.service.js.map +0 -1
  301. package/dist/runtime/wasmtime-wasi-http-component.service.d.ts.map +0 -1
  302. package/dist/runtime/wasmtime-wasi-http-component.service.js.map +0 -1
  303. package/dist/sidecar/wasm-sidecar-client.service.d.ts.map +0 -1
  304. package/dist/sidecar/wasm-sidecar-client.service.js.map +0 -1
  305. package/dist/ui/ui-server.service.d.ts.map +0 -1
  306. package/dist/ui/ui-server.service.js.map +0 -1
  307. /package/dist/{main.d.ts → app/main.d.ts} +0 -0
@@ -1,147 +0,0 @@
1
- import { access, readFile } from "node:fs/promises";
2
- import path from "node:path";
3
- //#region src/manifest/app-manifest.service.ts
4
- var AppManifestService = class {
5
- load = async (appDirectory) => {
6
- const normalizedDirectory = path.resolve(appDirectory);
7
- const manifestPath = path.join(normalizedDirectory, "manifest.json");
8
- const rawManifest = JSON.parse(await readFile(manifestPath, "utf-8"));
9
- const manifest = this.parseManifest(rawManifest);
10
- const mainEntryPath = await this.assertResolvedFile(normalizedDirectory, manifest.main.entry, "main.entry");
11
- const uiEntryPath = await this.assertResolvedFile(normalizedDirectory, manifest.ui.entry, "ui.entry");
12
- return {
13
- appDirectory: normalizedDirectory,
14
- manifestPath,
15
- manifest,
16
- mainEntryPath,
17
- uiEntryPath,
18
- uiDirectoryPath: path.dirname(uiEntryPath),
19
- assetsDirectoryPath: path.join(normalizedDirectory, "assets"),
20
- iconPath: manifest.icon ? await this.assertResolvedFile(normalizedDirectory, manifest.icon, "icon") : void 0
21
- };
22
- };
23
- summarize = (bundle) => {
24
- const permissions = bundle.manifest.permissions ?? {};
25
- return {
26
- id: bundle.manifest.id,
27
- name: bundle.manifest.name,
28
- version: bundle.manifest.version,
29
- description: bundle.manifest.description,
30
- mainKind: bundle.manifest.main.kind,
31
- action: bundle.manifest.main.kind === "wasm" ? bundle.manifest.main.action : void 0,
32
- manifestPath: bundle.manifestPath,
33
- mainEntryPath: bundle.mainEntryPath,
34
- uiEntryPath: bundle.uiEntryPath,
35
- iconPath: bundle.iconPath,
36
- permissions
37
- };
38
- };
39
- parseManifest = (rawManifest) => {
40
- if (!rawManifest || typeof rawManifest !== "object" || Array.isArray(rawManifest)) throw new Error("manifest.json 必须是一个对象。");
41
- const candidate = rawManifest;
42
- if (this.readNumber(candidate.schemaVersion, "schemaVersion") !== 1) throw new Error("当前只支持 schemaVersion = 1。");
43
- const permissions = this.parsePermissions(candidate.permissions);
44
- return {
45
- schemaVersion: 1,
46
- id: this.readRequiredString(candidate.id, "id"),
47
- name: this.readRequiredString(candidate.name, "name"),
48
- version: this.readRequiredString(candidate.version, "version"),
49
- description: this.readOptionalString(candidate.description, "description"),
50
- icon: this.readOptionalString(candidate.icon, "icon"),
51
- main: this.parseMain(candidate.main),
52
- ui: this.parseUi(candidate.ui),
53
- permissions
54
- };
55
- };
56
- parseMain = (rawMain) => {
57
- const candidate = this.assertObject(rawMain, "main");
58
- const kind = this.readRequiredString(candidate.kind, "main.kind");
59
- if (kind === "wasm") return {
60
- kind: "wasm",
61
- entry: this.readRequiredString(candidate.entry, "main.entry"),
62
- export: this.readRequiredString(candidate.export, "main.export"),
63
- action: this.readRequiredString(candidate.action, "main.action")
64
- };
65
- if (kind === "wasi-http-component") return {
66
- kind: "wasi-http-component",
67
- entry: this.readRequiredString(candidate.entry, "main.entry")
68
- };
69
- throw new Error("当前 main.kind 只支持 wasm 或 wasi-http-component。");
70
- };
71
- parseUi = (rawUi) => {
72
- const candidate = this.assertObject(rawUi, "ui");
73
- return { entry: this.readRequiredString(candidate.entry, "ui.entry") };
74
- };
75
- parsePermissions = (rawPermissions) => {
76
- if (rawPermissions === void 0) return;
77
- const candidate = this.assertObject(rawPermissions, "permissions");
78
- return {
79
- documentAccess: this.parseDocumentAccess(candidate.documentAccess),
80
- allowedDomains: this.parseStringArray(candidate.allowedDomains, "permissions.allowedDomains"),
81
- storage: this.parseStorage(candidate.storage),
82
- capabilities: this.parseCapabilities(candidate.capabilities)
83
- };
84
- };
85
- parseDocumentAccess = (rawDocumentAccess) => {
86
- if (rawDocumentAccess === void 0) return;
87
- if (!Array.isArray(rawDocumentAccess)) throw new Error("permissions.documentAccess 必须是数组。");
88
- return rawDocumentAccess.map((scope, index) => {
89
- const candidate = this.assertObject(scope, `permissions.documentAccess[${index}]`);
90
- const mode = this.readRequiredString(candidate.mode, `permissions.documentAccess[${index}].mode`);
91
- if (mode !== "read" && mode !== "read-write") throw new Error(`permissions.documentAccess[${index}].mode 只支持 read 或 read-write。`);
92
- return {
93
- id: this.readRequiredString(candidate.id, `permissions.documentAccess[${index}].id`),
94
- mode,
95
- description: this.readOptionalString(candidate.description, `permissions.documentAccess[${index}].description`)
96
- };
97
- });
98
- };
99
- parseStringArray = (rawValue, fieldName) => {
100
- if (rawValue === void 0) return;
101
- if (!Array.isArray(rawValue)) throw new Error(`${fieldName} 必须是字符串数组。`);
102
- return rawValue.map((item, index) => this.readRequiredString(item, `${fieldName}[${index}]`));
103
- };
104
- parseStorage = (rawStorage) => {
105
- if (rawStorage === void 0) return;
106
- if (typeof rawStorage === "boolean") return rawStorage;
107
- const candidate = this.assertObject(rawStorage, "permissions.storage");
108
- return { namespace: this.readOptionalString(candidate.namespace, "permissions.storage.namespace") };
109
- };
110
- parseCapabilities = (rawCapabilities) => {
111
- if (rawCapabilities === void 0) return;
112
- const candidate = this.assertObject(rawCapabilities, "permissions.capabilities");
113
- return { hostBridge: candidate.hostBridge === void 0 ? void 0 : this.readBoolean(candidate.hostBridge, "permissions.capabilities.hostBridge") };
114
- };
115
- assertResolvedFile = async (appDirectory, relativePath, fieldName) => {
116
- if (path.isAbsolute(relativePath)) throw new Error(`${fieldName} 必须使用应用目录内的相对路径。`);
117
- const resolvedPath = path.resolve(appDirectory, relativePath);
118
- const relative = path.relative(appDirectory, resolvedPath);
119
- if (relative.startsWith("..") || path.isAbsolute(relative)) throw new Error(`${fieldName} 不能指向应用目录之外。`);
120
- await access(resolvedPath);
121
- return resolvedPath;
122
- };
123
- assertObject = (value, fieldName) => {
124
- if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error(`${fieldName} 必须是对象。`);
125
- return value;
126
- };
127
- readRequiredString = (value, fieldName) => {
128
- if (typeof value !== "string" || !value.trim()) throw new Error(`${fieldName} 必须是非空字符串。`);
129
- return value.trim();
130
- };
131
- readOptionalString = (value, fieldName) => {
132
- if (value === void 0) return;
133
- return this.readRequiredString(value, fieldName);
134
- };
135
- readNumber = (value, fieldName) => {
136
- if (typeof value !== "number" || Number.isNaN(value)) throw new Error(`${fieldName} 必须是数字。`);
137
- return value;
138
- };
139
- readBoolean = (value, fieldName) => {
140
- if (typeof value !== "boolean") throw new Error(`${fieldName} 必须是布尔值。`);
141
- return value;
142
- };
143
- };
144
- //#endregion
145
- export { AppManifestService };
146
-
147
- //# sourceMappingURL=app-manifest.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-manifest.service.js","names":[],"sources":["../../src/manifest/app-manifest.service.ts"],"sourcesContent":["import { access, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type {\n AppDocumentAccessScope,\n AppManifest,\n AppManifestBundle,\n AppManifestSummary,\n AppPermissions,\n} from \"./app-manifest.types.js\";\n\nexport class AppManifestService {\n load = async (appDirectory: string): Promise<AppManifestBundle> => {\n const normalizedDirectory = path.resolve(appDirectory);\n const manifestPath = path.join(normalizedDirectory, \"manifest.json\");\n const rawManifest = JSON.parse(await readFile(manifestPath, \"utf-8\")) as unknown;\n const manifest = this.parseManifest(rawManifest);\n const mainEntryPath = await this.assertResolvedFile(\n normalizedDirectory,\n manifest.main.entry,\n \"main.entry\",\n );\n const uiEntryPath = await this.assertResolvedFile(\n normalizedDirectory,\n manifest.ui.entry,\n \"ui.entry\",\n );\n const uiDirectoryPath = path.dirname(uiEntryPath);\n const assetsDirectoryPath = path.join(normalizedDirectory, \"assets\");\n const iconPath = manifest.icon\n ? await this.assertResolvedFile(normalizedDirectory, manifest.icon, \"icon\")\n : undefined;\n\n return {\n appDirectory: normalizedDirectory,\n manifestPath,\n manifest,\n mainEntryPath,\n uiEntryPath,\n uiDirectoryPath,\n assetsDirectoryPath,\n iconPath,\n };\n };\n\n summarize = (bundle: AppManifestBundle): AppManifestSummary => {\n const permissions = bundle.manifest.permissions ?? {};\n return {\n id: bundle.manifest.id,\n name: bundle.manifest.name,\n version: bundle.manifest.version,\n description: bundle.manifest.description,\n mainKind: bundle.manifest.main.kind,\n action: bundle.manifest.main.kind === \"wasm\" ? bundle.manifest.main.action : undefined,\n manifestPath: bundle.manifestPath,\n mainEntryPath: bundle.mainEntryPath,\n uiEntryPath: bundle.uiEntryPath,\n iconPath: bundle.iconPath,\n permissions,\n };\n };\n\n private parseManifest = (rawManifest: unknown): AppManifest => {\n if (!rawManifest || typeof rawManifest !== \"object\" || Array.isArray(rawManifest)) {\n throw new Error(\"manifest.json 必须是一个对象。\");\n }\n\n const candidate = rawManifest as Record<string, unknown>;\n const schemaVersion = this.readNumber(candidate.schemaVersion, \"schemaVersion\");\n if (schemaVersion !== 1) {\n throw new Error(\"当前只支持 schemaVersion = 1。\");\n }\n\n const permissions = this.parsePermissions(candidate.permissions);\n\n return {\n schemaVersion: 1,\n id: this.readRequiredString(candidate.id, \"id\"),\n name: this.readRequiredString(candidate.name, \"name\"),\n version: this.readRequiredString(candidate.version, \"version\"),\n description: this.readOptionalString(candidate.description, \"description\"),\n icon: this.readOptionalString(candidate.icon, \"icon\"),\n main: this.parseMain(candidate.main),\n ui: this.parseUi(candidate.ui),\n permissions,\n };\n };\n\n private parseMain = (rawMain: unknown): AppManifest[\"main\"] => {\n const candidate = this.assertObject(rawMain, \"main\");\n const kind = this.readRequiredString(candidate.kind, \"main.kind\");\n if (kind === \"wasm\") {\n return {\n kind: \"wasm\",\n entry: this.readRequiredString(candidate.entry, \"main.entry\"),\n export: this.readRequiredString(candidate.export, \"main.export\"),\n action: this.readRequiredString(candidate.action, \"main.action\"),\n };\n }\n if (kind === \"wasi-http-component\") {\n return {\n kind: \"wasi-http-component\",\n entry: this.readRequiredString(candidate.entry, \"main.entry\"),\n };\n }\n throw new Error(\"当前 main.kind 只支持 wasm 或 wasi-http-component。\");\n };\n\n private parseUi = (rawUi: unknown): AppManifest[\"ui\"] => {\n const candidate = this.assertObject(rawUi, \"ui\");\n return {\n entry: this.readRequiredString(candidate.entry, \"ui.entry\"),\n };\n };\n\n private parsePermissions = (rawPermissions: unknown): AppPermissions | undefined => {\n if (rawPermissions === undefined) {\n return undefined;\n }\n const candidate = this.assertObject(rawPermissions, \"permissions\");\n return {\n documentAccess: this.parseDocumentAccess(candidate.documentAccess),\n allowedDomains: this.parseStringArray(candidate.allowedDomains, \"permissions.allowedDomains\"),\n storage: this.parseStorage(candidate.storage),\n capabilities: this.parseCapabilities(candidate.capabilities),\n };\n };\n\n private parseDocumentAccess = (\n rawDocumentAccess: unknown,\n ): AppDocumentAccessScope[] | undefined => {\n if (rawDocumentAccess === undefined) {\n return undefined;\n }\n if (!Array.isArray(rawDocumentAccess)) {\n throw new Error(\"permissions.documentAccess 必须是数组。\");\n }\n return rawDocumentAccess.map((scope, index) => {\n const candidate = this.assertObject(scope, `permissions.documentAccess[${index}]`);\n const mode = this.readRequiredString(\n candidate.mode,\n `permissions.documentAccess[${index}].mode`,\n );\n if (mode !== \"read\" && mode !== \"read-write\") {\n throw new Error(\n `permissions.documentAccess[${index}].mode 只支持 read 或 read-write。`,\n );\n }\n return {\n id: this.readRequiredString(candidate.id, `permissions.documentAccess[${index}].id`),\n mode,\n description: this.readOptionalString(\n candidate.description,\n `permissions.documentAccess[${index}].description`,\n ),\n };\n });\n };\n\n private parseStringArray = (\n rawValue: unknown,\n fieldName: string,\n ): string[] | undefined => {\n if (rawValue === undefined) {\n return undefined;\n }\n if (!Array.isArray(rawValue)) {\n throw new Error(`${fieldName} 必须是字符串数组。`);\n }\n return rawValue.map((item, index) =>\n this.readRequiredString(item, `${fieldName}[${index}]`),\n );\n };\n\n private parseStorage = (\n rawStorage: unknown,\n ): AppPermissions[\"storage\"] | undefined => {\n if (rawStorage === undefined) {\n return undefined;\n }\n if (typeof rawStorage === \"boolean\") {\n return rawStorage;\n }\n const candidate = this.assertObject(rawStorage, \"permissions.storage\");\n return {\n namespace: this.readOptionalString(candidate.namespace, \"permissions.storage.namespace\"),\n };\n };\n\n private parseCapabilities = (\n rawCapabilities: unknown,\n ): AppPermissions[\"capabilities\"] | undefined => {\n if (rawCapabilities === undefined) {\n return undefined;\n }\n const candidate = this.assertObject(rawCapabilities, \"permissions.capabilities\");\n return {\n hostBridge:\n candidate.hostBridge === undefined\n ? undefined\n : this.readBoolean(candidate.hostBridge, \"permissions.capabilities.hostBridge\"),\n };\n };\n\n private assertResolvedFile = async (\n appDirectory: string,\n relativePath: string,\n fieldName: string,\n ): Promise<string> => {\n if (path.isAbsolute(relativePath)) {\n throw new Error(`${fieldName} 必须使用应用目录内的相对路径。`);\n }\n const resolvedPath = path.resolve(appDirectory, relativePath);\n const relative = path.relative(appDirectory, resolvedPath);\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n throw new Error(`${fieldName} 不能指向应用目录之外。`);\n }\n await access(resolvedPath);\n return resolvedPath;\n };\n\n private assertObject = (value: unknown, fieldName: string): Record<string, unknown> => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(`${fieldName} 必须是对象。`);\n }\n return value as Record<string, unknown>;\n };\n\n private readRequiredString = (value: unknown, fieldName: string): string => {\n if (typeof value !== \"string\" || !value.trim()) {\n throw new Error(`${fieldName} 必须是非空字符串。`);\n }\n return value.trim();\n };\n\n private readOptionalString = (value: unknown, fieldName: string): string | undefined => {\n if (value === undefined) {\n return undefined;\n }\n return this.readRequiredString(value, fieldName);\n };\n\n private readNumber = (value: unknown, fieldName: string): number => {\n if (typeof value !== \"number\" || Number.isNaN(value)) {\n throw new Error(`${fieldName} 必须是数字。`);\n }\n return value;\n };\n\n private readBoolean = (value: unknown, fieldName: string): boolean => {\n if (typeof value !== \"boolean\") {\n throw new Error(`${fieldName} 必须是布尔值。`);\n }\n return value;\n };\n}\n"],"mappings":"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"}
@@ -1,68 +0,0 @@
1
- //#region src/manifest/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 AppManifest = {
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 AppManifestBundle = {
44
- appDirectory: string;
45
- manifestPath: string;
46
- manifest: AppManifest;
47
- mainEntryPath: string;
48
- uiEntryPath: string;
49
- uiDirectoryPath: string;
50
- assetsDirectoryPath: string;
51
- iconPath?: string;
52
- };
53
- type AppManifestSummary = {
54
- id: string;
55
- name: string;
56
- version: string;
57
- description?: string;
58
- mainKind: AppMainManifest["kind"];
59
- action?: string;
60
- manifestPath: string;
61
- mainEntryPath: string;
62
- uiEntryPath: string;
63
- iconPath?: string;
64
- permissions: AppPermissions;
65
- };
66
- //#endregion
67
- export { AppCoreWasmMainManifest, AppDocumentAccessMode, AppDocumentAccessScope, AppMainManifest, AppManifest, AppManifestBundle, AppManifestSummary, AppPermissions, AppUiManifest, AppWasiHttpComponentMainManifest };
68
- //# sourceMappingURL=app-manifest.types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-manifest.types.d.ts","names":[],"sources":["../../src/manifest/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,WAAA;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,iBAAA;EACV,YAAA;EACA,YAAA;EACA,QAAA,EAAU,WAAA;EACV,aAAA;EACA,WAAA;EACA,eAAA;EACA,mBAAA;EACA,QAAA;AAAA;AAAA,KAGU,kBAAA;EACV,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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-home.service.d.ts","names":[],"sources":["../../src/paths/app-home.service.ts"],"mappings":";cAIa,cAAA;EAAA,iBAEQ,gBAAA;cAAA,gBAAA;EAKnB,mBAAA;EAIA,oBAAA;EAIA,gBAAA;EAIA,eAAA;EAIA,aAAA;EAIA,mBAAA,GAAuB,KAAA,UAAe,OAAA;EAItC,mBAAA,GAAuB,KAAA;EAIvB,qBAAA,QAAkC,OAAA;EAQlC,wBAAA,GAAkC,MAAA,aAAiB,OAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-home.service.js","names":[],"sources":["../../src/paths/app-home.service.ts"],"sourcesContent":["import { mkdir, mkdtemp } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\n\nexport class AppHomeService {\n constructor(\n private readonly appHomeDirectory: string = process.env.NEXTCLAW_APP_HOME\n ? path.resolve(process.env.NEXTCLAW_APP_HOME)\n : path.join(process.env.HOME ?? process.cwd(), \".nextclaw\", \"apps\"),\n ) {}\n\n getAppHomeDirectory = (): string => {\n return this.appHomeDirectory;\n };\n\n getPackagesDirectory = (): string => {\n return path.join(this.appHomeDirectory, \"packages\");\n };\n\n getDataDirectory = (): string => {\n return path.join(this.appHomeDirectory, \"data\");\n };\n\n getRegistryPath = (): string => {\n return path.join(this.appHomeDirectory, \"registry.json\");\n };\n\n getConfigPath = (): string => {\n return path.join(this.appHomeDirectory, \"config.json\");\n };\n\n getInstallDirectory = (appId: string, version: string): string => {\n return path.join(this.getPackagesDirectory(), appId, version);\n };\n\n getAppDataDirectory = (appId: string): string => {\n return path.join(this.getDataDirectory(), appId);\n };\n\n ensureBaseDirectories = async (): Promise<void> => {\n await Promise.all([\n mkdir(this.appHomeDirectory, { recursive: true }),\n mkdir(this.getPackagesDirectory(), { recursive: true }),\n mkdir(this.getDataDirectory(), { recursive: true }),\n ]);\n };\n\n createTemporaryDirectory = async (prefix: string): Promise<string> => {\n return mkdtemp(path.join(tmpdir(), prefix));\n };\n}\n"],"mappings":";;;;AAIA,IAAa,iBAAb,MAA4B;CAC1B,YACE,mBAA4C,QAAQ,IAAI,oBACpD,KAAK,QAAQ,QAAQ,IAAI,kBAAkB,GAC3C,KAAK,KAAK,QAAQ,IAAI,QAAQ,QAAQ,KAAK,EAAE,aAAa,OAAO,EACrE;AAHiB,OAAA,mBAAA;;CAKnB,4BAAoC;AAClC,SAAO,KAAK;;CAGd,6BAAqC;AACnC,SAAO,KAAK,KAAK,KAAK,kBAAkB,WAAW;;CAGrD,yBAAiC;AAC/B,SAAO,KAAK,KAAK,KAAK,kBAAkB,OAAO;;CAGjD,wBAAgC;AAC9B,SAAO,KAAK,KAAK,KAAK,kBAAkB,gBAAgB;;CAG1D,sBAA8B;AAC5B,SAAO,KAAK,KAAK,KAAK,kBAAkB,cAAc;;CAGxD,uBAAuB,OAAe,YAA4B;AAChE,SAAO,KAAK,KAAK,KAAK,sBAAsB,EAAE,OAAO,QAAQ;;CAG/D,uBAAuB,UAA0B;AAC/C,SAAO,KAAK,KAAK,KAAK,kBAAkB,EAAE,MAAM;;CAGlD,wBAAwB,YAA2B;AACjD,QAAM,QAAQ,IAAI;GAChB,MAAM,KAAK,kBAAkB,EAAE,WAAW,MAAM,CAAC;GACjD,MAAM,KAAK,sBAAsB,EAAE,EAAE,WAAW,MAAM,CAAC;GACvD,MAAM,KAAK,kBAAkB,EAAE,EAAE,WAAW,MAAM,CAAC;GACpD,CAAC;;CAGJ,2BAA2B,OAAO,WAAoC;AACpE,SAAO,QAAQ,KAAK,KAAK,QAAQ,EAAE,OAAO,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-grant.service.d.ts","names":[],"sources":["../../src/permissions/app-grant.service.ts"],"mappings":";;;;;cASa,eAAA;EAAA,iBAEQ,eAAA;EAAA,iBACA,eAAA;cADA,eAAA,GAAiB,kBAAA,EACjB,eAAA,GAAiB,kBAAA;EAGpC,SAAA,GAAmB,KAAA,aAAgB,OAAA,CAAQ,2BAAA;EAsC3C,kBAAA,GAA4B,MAAA;IAC1B,KAAA;IACA,OAAA;IACA,aAAA;EAAA,MACE,OAAA,CAAQ,8BAAA;EA2BZ,mBAAA,GAA6B,MAAA;IAC3B,KAAA;IACA,OAAA;EAAA,MACE,OAAA,CAAQ,8BAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-grant.service.js","names":[],"sources":["../../src/permissions/app-grant.service.ts"],"sourcesContent":["import { access } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { AppManifestService } from \"../manifest/app-manifest.service.js\";\nimport { AppRegistryService } from \"../registry/app-registry.service.js\";\nimport type {\n AppDocumentGrantMutationResult,\n AppInstalledPermissionState,\n} from \"./app-permissions.types.js\";\n\nexport class AppGrantService {\n constructor(\n private readonly registryService: AppRegistryService = new AppRegistryService(),\n private readonly manifestService: AppManifestService = new AppManifestService(),\n ) {}\n\n summarize = async (appId: string): Promise<AppInstalledPermissionState> => {\n const appRecord = await this.registryService.getApp(appId);\n if (!appRecord) {\n throw new Error(`未找到已安装应用:${appId}`);\n }\n const activeVersion = appRecord.installedVersions[appRecord.activeVersion];\n if (!activeVersion) {\n throw new Error(`已安装应用缺少激活版本:${appId}`);\n }\n const bundle = await this.manifestService.load(activeVersion.installDirectory);\n const requestedPermissions = bundle.manifest.permissions ?? {};\n return {\n appId: appRecord.appId,\n name: appRecord.name,\n activeVersion: appRecord.activeVersion,\n documentAccess: (requestedPermissions.documentAccess ?? []).map((scope) => ({\n id: scope.id,\n mode: scope.mode,\n description: scope.description,\n granted: Boolean(appRecord.grants[scope.id]),\n grantedPath: appRecord.grants[scope.id],\n })),\n allowedDomains: requestedPermissions.allowedDomains ?? [],\n storage: {\n enabled:\n requestedPermissions.storage !== undefined &&\n requestedPermissions.storage !== false,\n namespace:\n typeof requestedPermissions.storage === \"object\"\n ? requestedPermissions.storage.namespace\n : undefined,\n },\n capabilities: {\n hostBridge: requestedPermissions.capabilities?.hostBridge !== false,\n },\n };\n };\n\n grantDocumentScope = async (params: {\n appId: string;\n scopeId: string;\n directoryPath: string;\n }): Promise<AppDocumentGrantMutationResult> => {\n const { appId, scopeId, directoryPath } = params;\n const permissionState = await this.summarize(appId);\n const requestedScope = permissionState.documentAccess.find(\n (scope) => scope.id === scopeId,\n );\n if (!requestedScope) {\n throw new Error(`应用 ${appId} 未声明 documentAccess scope:${scopeId}`);\n }\n const normalizedDirectory = path.resolve(directoryPath);\n try {\n await access(normalizedDirectory);\n } catch {\n throw new Error(`授权目录不存在:${normalizedDirectory}`);\n }\n await this.registryService.setDocumentGrant(\n appId,\n scopeId,\n normalizedDirectory,\n );\n return {\n appId,\n scopeId,\n grantedPath: normalizedDirectory,\n };\n };\n\n revokeDocumentScope = async (params: {\n appId: string;\n scopeId: string;\n }): Promise<AppDocumentGrantMutationResult> => {\n const { appId, scopeId } = params;\n await this.summarize(appId);\n const removed = await this.registryService.removeDocumentGrant(\n appId,\n scopeId,\n );\n return {\n appId,\n scopeId,\n removed,\n };\n };\n}\n"],"mappings":";;;;;AASA,IAAa,kBAAb,MAA6B;CAC3B,YACE,kBAAuD,IAAI,oBAAoB,EAC/E,kBAAuD,IAAI,oBAAoB,EAC/E;AAFiB,OAAA,kBAAA;AACA,OAAA,kBAAA;;CAGnB,YAAY,OAAO,UAAwD;EACzE,MAAM,YAAY,MAAM,KAAK,gBAAgB,OAAO,MAAM;AAC1D,MAAI,CAAC,UACH,OAAM,IAAI,MAAM,YAAY,QAAQ;EAEtC,MAAM,gBAAgB,UAAU,kBAAkB,UAAU;AAC5D,MAAI,CAAC,cACH,OAAM,IAAI,MAAM,eAAe,QAAQ;EAGzC,MAAM,wBADS,MAAM,KAAK,gBAAgB,KAAK,cAAc,iBAAiB,EAC1C,SAAS,eAAe,EAAE;AAC9D,SAAO;GACL,OAAO,UAAU;GACjB,MAAM,UAAU;GAChB,eAAe,UAAU;GACzB,iBAAiB,qBAAqB,kBAAkB,EAAE,EAAE,KAAK,WAAW;IAC1E,IAAI,MAAM;IACV,MAAM,MAAM;IACZ,aAAa,MAAM;IACnB,SAAS,QAAQ,UAAU,OAAO,MAAM,IAAI;IAC5C,aAAa,UAAU,OAAO,MAAM;IACrC,EAAE;GACH,gBAAgB,qBAAqB,kBAAkB,EAAE;GACzD,SAAS;IACP,SACE,qBAAqB,YAAY,KAAA,KACjC,qBAAqB,YAAY;IACnC,WACE,OAAO,qBAAqB,YAAY,WACpC,qBAAqB,QAAQ,YAC7B,KAAA;IACP;GACD,cAAc,EACZ,YAAY,qBAAqB,cAAc,eAAe,OAC/D;GACF;;CAGH,qBAAqB,OAAO,WAImB;EAC7C,MAAM,EAAE,OAAO,SAAS,kBAAkB;AAK1C,MAAI,EAJoB,MAAM,KAAK,UAAU,MAAM,EACZ,eAAe,MACnD,UAAU,MAAM,OAAO,QACzB,CAEC,OAAM,IAAI,MAAM,MAAM,MAAM,4BAA4B,UAAU;EAEpE,MAAM,sBAAsB,KAAK,QAAQ,cAAc;AACvD,MAAI;AACF,SAAM,OAAO,oBAAoB;UAC3B;AACN,SAAM,IAAI,MAAM,WAAW,sBAAsB;;AAEnD,QAAM,KAAK,gBAAgB,iBACzB,OACA,SACA,oBACD;AACD,SAAO;GACL;GACA;GACA,aAAa;GACd;;CAGH,sBAAsB,OAAO,WAGkB;EAC7C,MAAM,EAAE,OAAO,YAAY;AAC3B,QAAM,KAAK,UAAU,MAAM;AAK3B,SAAO;GACL;GACA;GACA,SAPc,MAAM,KAAK,gBAAgB,oBACzC,OACA,QACD;GAKA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-permissions.service.d.ts","names":[],"sources":["../../src/permissions/app-permissions.service.ts"],"mappings":";;;;cAaa,qBAAA;EACX,OAAA,GACE,MAAA,EAAQ,iBAAA,EACR,gBAAA,EAAkB,mBAAA,EAClB,OAAA;IACE,KAAA;EAAA,MAED,OAAA,CAAQ,mBAAA;EA2BX,SAAA,GACE,MAAA,EAAQ,iBAAA,EACR,WAAA,EAAa,mBAAA,KACZ,oBAAA;EAAA,QAUK,oBAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-permissions.service.js","names":[],"sources":["../../src/permissions/app-permissions.service.ts"],"sourcesContent":["import { access } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type {\n AppDocumentAccessScope,\n AppManifestBundle,\n} from \"../manifest/app-manifest.types.js\";\nimport type {\n AppDocumentGrantMap,\n AppPermissionSummary,\n ResolvedDocumentGrant,\n ResolvedPermissions,\n} from \"./app-permissions.types.js\";\n\nexport class AppPermissionsService {\n resolve = async (\n bundle: AppManifestBundle,\n documentGrantMap: AppDocumentGrantMap,\n context?: {\n appId?: string;\n },\n ): Promise<ResolvedPermissions> => {\n const requestedPermissions = bundle.manifest.permissions ?? {};\n const documentAccess =\n requestedPermissions.documentAccess === undefined\n ? []\n : await Promise.all(\n requestedPermissions.documentAccess.map((scope) =>\n this.resolveDocumentGrant(scope, documentGrantMap, context?.appId),\n ),\n );\n\n return {\n documentAccess,\n allowedDomains: requestedPermissions.allowedDomains ?? [],\n storage: {\n enabled: requestedPermissions.storage !== undefined && requestedPermissions.storage !== false,\n namespace:\n typeof requestedPermissions.storage === \"object\"\n ? requestedPermissions.storage.namespace\n : undefined,\n },\n capabilities: {\n hostBridge: requestedPermissions.capabilities?.hostBridge !== false,\n },\n };\n };\n\n summarize = (\n bundle: AppManifestBundle,\n permissions: ResolvedPermissions,\n ): AppPermissionSummary => {\n return {\n requested: bundle.manifest.permissions ?? {},\n documentAccess: permissions.documentAccess,\n allowedDomains: permissions.allowedDomains,\n storage: permissions.storage,\n capabilities: permissions.capabilities,\n };\n };\n\n private resolveDocumentGrant = async (\n scope: AppDocumentAccessScope,\n documentGrantMap: AppDocumentGrantMap,\n appId?: string,\n ): Promise<ResolvedDocumentGrant> => {\n const grantedPath = documentGrantMap[scope.id];\n if (!grantedPath) {\n if (appId) {\n throw new Error(\n `缺少 documentAccess 授权:${scope.id}。请先执行 napp grant ${appId} --document ${scope.id}=/absolute/path`,\n );\n }\n throw new Error(\n `缺少 documentAccess 授权:${scope.id}。请通过 --document ${scope.id}=/absolute/path 提供授权。`,\n );\n }\n const normalizedPath = path.resolve(grantedPath);\n try {\n await access(normalizedPath);\n } catch {\n throw new Error(`documentAccess 授权路径不存在:${scope.id} -> ${normalizedPath}`);\n }\n return {\n id: scope.id,\n mode: scope.mode,\n description: scope.description,\n path: normalizedPath,\n };\n };\n}\n"],"mappings":";;;AAaA,IAAa,wBAAb,MAAmC;CACjC,UAAU,OACR,QACA,kBACA,YAGiC;EACjC,MAAM,uBAAuB,OAAO,SAAS,eAAe,EAAE;AAU9D,SAAO;GACL,gBATA,qBAAqB,mBAAmB,KAAA,IACpC,EAAE,GACF,MAAM,QAAQ,IACZ,qBAAqB,eAAe,KAAK,UACvC,KAAK,qBAAqB,OAAO,kBAAkB,SAAS,MAAM,CACnE,CACF;GAIL,gBAAgB,qBAAqB,kBAAkB,EAAE;GACzD,SAAS;IACP,SAAS,qBAAqB,YAAY,KAAA,KAAa,qBAAqB,YAAY;IACxF,WACE,OAAO,qBAAqB,YAAY,WACpC,qBAAqB,QAAQ,YAC7B,KAAA;IACP;GACD,cAAc,EACZ,YAAY,qBAAqB,cAAc,eAAe,OAC/D;GACF;;CAGH,aACE,QACA,gBACyB;AACzB,SAAO;GACL,WAAW,OAAO,SAAS,eAAe,EAAE;GAC5C,gBAAgB,YAAY;GAC5B,gBAAgB,YAAY;GAC5B,SAAS,YAAY;GACrB,cAAc,YAAY;GAC3B;;CAGH,uBAA+B,OAC7B,OACA,kBACA,UACmC;EACnC,MAAM,cAAc,iBAAiB,MAAM;AAC3C,MAAI,CAAC,aAAa;AAChB,OAAI,MACF,OAAM,IAAI,MACR,wBAAwB,MAAM,GAAG,mBAAmB,MAAM,cAAc,MAAM,GAAG,iBAClF;AAEH,SAAM,IAAI,MACR,wBAAwB,MAAM,GAAG,kBAAkB,MAAM,GAAG,uBAC7D;;EAEH,MAAM,iBAAiB,KAAK,QAAQ,YAAY;AAChD,MAAI;AACF,SAAM,OAAO,eAAe;UACtB;AACN,SAAM,IAAI,MAAM,0BAA0B,MAAM,GAAG,MAAM,iBAAiB;;AAE5E,SAAO;GACL,IAAI,MAAM;GACV,MAAM,MAAM;GACZ,aAAa,MAAM;GACnB,MAAM;GACP"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-permissions.types.d.ts","names":[],"sources":["../../src/permissions/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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-marketplace-client.service.d.ts","names":[],"sources":["../../src/publish/app-marketplace-client.service.ts"],"mappings":";;;cAGa,2BAAA;EACX,OAAA,GAAiB,MAAA;IACf,OAAA,EAAS,iBAAA;IACT,UAAA;IACA,KAAA;EAAA,MACE,OAAA,CAAQ,gBAAA;EAAA,QAyCJ,gBAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-marketplace-client.service.js","names":[],"sources":["../../src/publish/app-marketplace-client.service.ts"],"sourcesContent":["import type { AppPublishPayload, AppPublishResult } from \"./app-publish.types.js\";\nimport { DEFAULT_APP_MARKETPLACE_API_BASE } from \"./app-publish.types.js\";\n\nexport class AppMarketplaceClientService {\n publish = async (params: {\n payload: AppPublishPayload;\n apiBaseUrl?: string;\n token?: string;\n }): Promise<AppPublishResult> => {\n const apiBaseUrl = this.normalizeApiBase(\n params.apiBaseUrl ?? DEFAULT_APP_MARKETPLACE_API_BASE,\n );\n const token = params.token?.trim();\n if (!token) {\n throw new Error(\"缺少 marketplace publish token。请先登录 NextClaw,或传入 --token。\");\n }\n const response = await fetch(`${apiBaseUrl}/api/v1/apps/publish`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${token}`,\n accept: \"application/json\",\n },\n body: JSON.stringify(params.payload),\n });\n const payload = await response.json().catch(() => null);\n if (!response.ok) {\n const message =\n typeof payload === \"object\" &&\n payload &&\n \"error\" in payload &&\n typeof (payload as { error?: { message?: unknown } }).error?.message === \"string\"\n ? (payload as { error: { message: string } }).error.message\n : `${response.status} ${response.statusText}`;\n throw new Error(`发布 app 失败:${message}`);\n }\n const data =\n typeof payload === \"object\" &&\n payload &&\n \"data\" in payload &&\n typeof (payload as { data?: unknown }).data === \"object\"\n ? (payload as { data: AppPublishResult }).data\n : null;\n if (!data) {\n throw new Error(\"marketplace publish 返回格式无效。\");\n }\n return data;\n };\n\n private normalizeApiBase = (apiBaseUrl: string): string => {\n const normalized = new URL(apiBaseUrl);\n return normalized.toString().replace(/\\/+$/, \"\");\n };\n}\n"],"mappings":";;AAGA,IAAa,8BAAb,MAAyC;CACvC,UAAU,OAAO,WAIgB;EAC/B,MAAM,aAAa,KAAK,iBACtB,OAAO,cAAA,oCACR;EACD,MAAM,QAAQ,OAAO,OAAO,MAAM;AAClC,MAAI,CAAC,MACH,OAAM,IAAI,MAAM,0DAA0D;EAE5E,MAAM,WAAW,MAAM,MAAM,GAAG,WAAW,uBAAuB;GAChE,QAAQ;GACR,SAAS;IACP,gBAAgB;IAChB,eAAe,UAAU;IACzB,QAAQ;IACT;GACD,MAAM,KAAK,UAAU,OAAO,QAAQ;GACrC,CAAC;EACF,MAAM,UAAU,MAAM,SAAS,MAAM,CAAC,YAAY,KAAK;AACvD,MAAI,CAAC,SAAS,IAAI;GAChB,MAAM,UACJ,OAAO,YAAY,YACnB,WACA,WAAW,WACX,OAAQ,QAA8C,OAAO,YAAY,WACpE,QAA2C,MAAM,UAClD,GAAG,SAAS,OAAO,GAAG,SAAS;AACrC,SAAM,IAAI,MAAM,aAAa,UAAU;;EAEzC,MAAM,OACJ,OAAO,YAAY,YACnB,WACA,UAAU,WACV,OAAQ,QAA+B,SAAS,WAC3C,QAAuC,OACxC;AACN,MAAI,CAAC,KACH,OAAM,IAAI,MAAM,8BAA8B;AAEhD,SAAO;;CAGT,oBAA4B,eAA+B;AAEzD,SADmB,IAAI,IAAI,WAAW,CACpB,UAAU,CAAC,QAAQ,QAAQ,GAAG"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-marketplace-metadata.service.d.ts","names":[],"sources":["../../src/publish/app-marketplace-metadata.service.ts"],"mappings":";;;;cAMa,6BAAA;EACX,IAAA,GAAc,MAAA;IACZ,YAAA;IACA,QAAA,EAAU,WAAA;IACV,YAAA;EAAA,MACE,OAAA,CAAQ,sBAAA;EASZ,mBAAA,GAA6B,MAAA;IAC3B,YAAA;IACA,YAAA;EAAA,MACE,OAAA,CAAQ,KAAA;IAAQ,IAAA;IAAc,KAAA,EAAO,MAAA;EAAA;EAAA,QAoBjC,aAAA;EAAA,QA+BA,cAAA;EAAA,QAiBA,kBAAA;EAAA,QAOA,kBAAA;EAAA,QAUA,eAAA;EAAA,QASA,mBAAA;EAAA,QAaA,oBAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-marketplace-metadata.service.js","names":[],"sources":["../../src/publish/app-marketplace-metadata.service.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { AppManifest } from \"../manifest/app-manifest.types.js\";\nimport type { AppMarketplaceMetadata } from \"./app-publish.types.js\";\n\nexport class AppMarketplaceMetadataService {\n load = async (params: {\n appDirectory: string;\n manifest: AppManifest;\n metadataPath?: string;\n }): Promise<AppMarketplaceMetadata> => {\n const { appDirectory, manifest, metadataPath: customMetadataPath } = params;\n const metadataPath = customMetadataPath\n ? path.resolve(customMetadataPath)\n : path.join(path.resolve(appDirectory), \"marketplace.json\");\n const raw = JSON.parse(await readFile(metadataPath, \"utf-8\")) as unknown;\n return this.parseMetadata(raw, manifest);\n };\n\n collectPublishFiles = async (params: {\n appDirectory: string;\n metadataPath?: string;\n }): Promise<Array<{ path: string; bytes: Buffer }>> => {\n const appDirectory = path.resolve(params.appDirectory);\n const publishFiles: Array<{ path: string; bytes: Buffer }> = [];\n const metadataPath = params.metadataPath\n ? path.resolve(params.metadataPath)\n : path.join(appDirectory, \"marketplace.json\");\n publishFiles.push({\n path: \"marketplace.json\",\n bytes: Buffer.from(await readFile(metadataPath)),\n });\n const readmePath = path.join(appDirectory, \"README.md\");\n if (existsSync(readmePath)) {\n publishFiles.push({\n path: \"README.md\",\n bytes: Buffer.from(await readFile(readmePath)),\n });\n }\n return publishFiles;\n };\n\n private parseMetadata = (\n rawMetadata: unknown,\n manifest: AppManifest,\n ): AppMarketplaceMetadata => {\n if (!rawMetadata || typeof rawMetadata !== \"object\" || Array.isArray(rawMetadata)) {\n throw new Error(\"marketplace.json 必须是对象。\");\n }\n const candidate = rawMetadata as Record<string, unknown>;\n const slug = this.readRequiredString(candidate.slug, \"slug\");\n const summary = this.readRequiredString(candidate.summary, \"summary\");\n const description = this.readOptionalString(candidate.description, \"description\");\n const author =\n this.readOptionalString(candidate.author, \"author\") ?? manifest.name;\n const publisher = this.parsePublisher(candidate.publisher);\n return {\n slug,\n summary,\n summaryI18n: this.readLocalizedTextMap(candidate.summaryI18n, \"summaryI18n\", summary),\n description,\n descriptionI18n: description\n ? this.readLocalizedTextMap(candidate.descriptionI18n, \"descriptionI18n\", description)\n : undefined,\n author,\n tags: this.readStringArray(candidate.tags, \"tags\"),\n sourceRepo: this.readOptionalString(candidate.sourceRepo, \"sourceRepo\"),\n homepage: this.readOptionalString(candidate.homepage, \"homepage\"),\n featured: this.readOptionalBoolean(candidate.featured, \"featured\") ?? false,\n publisher,\n };\n };\n\n private parsePublisher = (\n rawPublisher: unknown,\n ): AppMarketplaceMetadata[\"publisher\"] => {\n if (rawPublisher === undefined) {\n return undefined;\n }\n if (!rawPublisher || typeof rawPublisher !== \"object\" || Array.isArray(rawPublisher)) {\n throw new Error(\"publisher 必须是对象。\");\n }\n const candidate = rawPublisher as Record<string, unknown>;\n return {\n id: this.readRequiredString(candidate.id, \"publisher.id\"),\n name: this.readRequiredString(candidate.name, \"publisher.name\"),\n url: this.readOptionalString(candidate.url, \"publisher.url\"),\n };\n };\n\n private readRequiredString = (value: unknown, fieldName: string): string => {\n if (typeof value !== \"string\" || !value.trim()) {\n throw new Error(`${fieldName} 必须是非空字符串。`);\n }\n return value.trim();\n };\n\n private readOptionalString = (\n value: unknown,\n fieldName: string,\n ): string | undefined => {\n if (value === undefined) {\n return undefined;\n }\n return this.readRequiredString(value, fieldName);\n };\n\n private readStringArray = (value: unknown, fieldName: string): string[] => {\n if (!Array.isArray(value) || value.length === 0) {\n throw new Error(`${fieldName} 必须是非空字符串数组。`);\n }\n return value.map((item, index) =>\n this.readRequiredString(item, `${fieldName}[${index}]`),\n );\n };\n\n private readOptionalBoolean = (\n value: unknown,\n fieldName: string,\n ): boolean | undefined => {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== \"boolean\") {\n throw new Error(`${fieldName} 必须是布尔值。`);\n }\n return value;\n };\n\n private readLocalizedTextMap = (\n value: unknown,\n fieldName: string,\n fallbackEn: string,\n ): Record<string, string> => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(`${fieldName} 必须是对象。`);\n }\n const candidate = value as Record<string, unknown>;\n const normalized = Object.fromEntries(\n Object.entries(candidate).map(([locale, localeValue]) => [\n locale,\n this.readRequiredString(localeValue, `${fieldName}.${locale}`),\n ]),\n );\n if (!normalized.en) {\n normalized.en = fallbackEn;\n }\n return normalized;\n };\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-publish-validation.service.d.ts","names":[],"sources":["../../src/publish/app-publish-validation.service.ts"],"mappings":";;;;;;KAYY,+BAAA;AAAA,KAIA,2BAAA;EACV,IAAA,EAAM,+BAAA;EACN,OAAA;AAAA;AAAA,KAGU,0BAAA;EACV,EAAA;EACA,YAAA;EACA,YAAA;EACA,KAAA;EACA,OAAA;EACA,gBAAA,EAAkB,mBAAA;EAClB,QAAA;EACA,aAAA;EACA,kBAAA;EACA,eAAA;EACA,eAAA;EACA,QAAA,EAAU,2BAAA;AAAA;AAAA,cAGC,2BAAA;EAAA,iBAEQ,eAAA;EAAA,iBACA,eAAA;EAAA,iBACA,aAAA;cAFA,eAAA,GAAiB,kBAAA,EACjB,eAAA,GAAiB,6BAAA,EACjB,aAAA,GAAe,gBAAA;EAGlC,QAAA,GAAkB,MAAA;IAChB,YAAA;IACA,YAAA;IACA,IAAA,GAAO,mBAAA;EAAA,MACL,OAAA,CAAQ,0BAAA;EAAA,QAiDJ,aAAA;EAAA,QAqBA,WAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-publish-validation.service.js","names":[],"sources":["../../src/publish/app-publish-validation.service.ts"],"sourcesContent":["import { stat } from \"node:fs/promises\";\nimport { mkdtemp, rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { AppBundleService } from \"../bundle/app-bundle.service.js\";\nimport type { AppDistributionMode } from \"../bundle/app-bundle.types.js\";\nimport { AppManifestService } from \"../manifest/app-manifest.service.js\";\nimport { AppMarketplaceMetadataService } from \"./app-marketplace-metadata.service.js\";\n\nconst MAIN_ENTRY_WARN_BYTES = 10 * 1024 * 1024;\nconst BUNDLE_WARN_BYTES = 5 * 1024 * 1024;\n\nexport type AppPublishValidationWarningCode =\n | \"main-entry-large\"\n | \"bundle-large\";\n\nexport type AppPublishValidationWarning = {\n code: AppPublishValidationWarningCode;\n message: string;\n};\n\nexport type AppPublishValidationResult = {\n ok: boolean;\n appDirectory: string;\n metadataPath: string;\n appId: string;\n version: string;\n distributionMode: AppDistributionMode;\n mainKind: string;\n mainEntryPath: string;\n mainEntrySizeBytes: number;\n bundleSizeBytes: number;\n bundleFilePaths: string[];\n warnings: AppPublishValidationWarning[];\n};\n\nexport class AppPublishValidationService {\n constructor(\n private readonly manifestService: AppManifestService = new AppManifestService(),\n private readonly metadataService: AppMarketplaceMetadataService = new AppMarketplaceMetadataService(),\n private readonly bundleService: AppBundleService = new AppBundleService(),\n ) {}\n\n validate = async (params: {\n appDirectory: string;\n metadataPath?: string;\n mode?: AppDistributionMode;\n }): Promise<AppPublishValidationResult> => {\n const {\n appDirectory: inputAppDirectory,\n metadataPath: inputMetadataPath,\n mode,\n } = params;\n const appDirectory = path.resolve(inputAppDirectory);\n const distributionMode = mode ?? \"source\";\n const bundle = await this.manifestService.load(appDirectory);\n const metadataPath = inputMetadataPath\n ? path.resolve(inputMetadataPath)\n : path.join(appDirectory, \"marketplace.json\");\n await this.metadataService.load({\n appDirectory,\n manifest: bundle.manifest,\n metadataPath,\n });\n\n const tempDirectory = await mkdtemp(path.join(tmpdir(), \"napp-validate-publish-\"));\n try {\n const packResult = await this.bundleService.packAppDirectory({\n appDirectory,\n outputPath: path.join(tempDirectory, `${bundle.manifest.id}-${bundle.manifest.version}.napp`),\n mode: distributionMode,\n });\n const mainEntryStats = await stat(bundle.mainEntryPath);\n const warnings = this.buildWarnings({\n mainEntrySizeBytes: mainEntryStats.size,\n bundleSizeBytes: packResult.sizeBytes,\n });\n return {\n ok: true,\n appDirectory,\n metadataPath,\n appId: bundle.manifest.id,\n version: bundle.manifest.version,\n distributionMode,\n mainKind: bundle.manifest.main.kind,\n mainEntryPath: bundle.mainEntryPath,\n mainEntrySizeBytes: mainEntryStats.size,\n bundleSizeBytes: packResult.sizeBytes,\n bundleFilePaths: packResult.filePaths,\n warnings,\n };\n } finally {\n await rm(tempDirectory, { recursive: true, force: true });\n }\n };\n\n private buildWarnings = (params: {\n mainEntrySizeBytes: number;\n bundleSizeBytes: number;\n }): AppPublishValidationWarning[] => {\n const { bundleSizeBytes, mainEntrySizeBytes } = params;\n const warnings: AppPublishValidationWarning[] = [];\n if (mainEntrySizeBytes > MAIN_ENTRY_WARN_BYTES) {\n warnings.push({\n code: \"main-entry-large\",\n message: `main entry is ${this.formatBytes(mainEntrySizeBytes)}, which is larger than the ${this.formatBytes(MAIN_ENTRY_WARN_BYTES)} warning threshold.`,\n });\n }\n if (bundleSizeBytes > BUNDLE_WARN_BYTES) {\n warnings.push({\n code: \"bundle-large\",\n message: `packed .napp is ${this.formatBytes(bundleSizeBytes)}, which is larger than the ${this.formatBytes(BUNDLE_WARN_BYTES)} warning threshold.`,\n });\n }\n return warnings;\n };\n\n private formatBytes = (value: number): string => {\n if (value < 1024) {\n return `${value} B`;\n }\n if (value < 1024 * 1024) {\n return `${(value / 1024).toFixed(1)} KB`;\n }\n return `${(value / (1024 * 1024)).toFixed(1)} MB`;\n };\n}\n"],"mappings":";;;;;;;AASA,MAAM,wBAAwB,KAAK,OAAO;AAC1C,MAAM,oBAAoB,IAAI,OAAO;AA0BrC,IAAa,8BAAb,MAAyC;CACvC,YACE,kBAAuD,IAAI,oBAAoB,EAC/E,kBAAkE,IAAI,+BAA+B,EACrG,gBAAmD,IAAI,kBAAkB,EACzE;AAHiB,OAAA,kBAAA;AACA,OAAA,kBAAA;AACA,OAAA,gBAAA;;CAGnB,WAAW,OAAO,WAIyB;EACzC,MAAM,EACJ,cAAc,mBACd,cAAc,mBACd,SACE;EACJ,MAAM,eAAe,KAAK,QAAQ,kBAAkB;EACpD,MAAM,mBAAmB,QAAQ;EACjC,MAAM,SAAS,MAAM,KAAK,gBAAgB,KAAK,aAAa;EAC5D,MAAM,eAAe,oBACjB,KAAK,QAAQ,kBAAkB,GAC/B,KAAK,KAAK,cAAc,mBAAmB;AAC/C,QAAM,KAAK,gBAAgB,KAAK;GAC9B;GACA,UAAU,OAAO;GACjB;GACD,CAAC;EAEF,MAAM,gBAAgB,MAAM,QAAQ,KAAK,KAAK,QAAQ,EAAE,yBAAyB,CAAC;AAClF,MAAI;GACF,MAAM,aAAa,MAAM,KAAK,cAAc,iBAAiB;IAC3D;IACA,YAAY,KAAK,KAAK,eAAe,GAAG,OAAO,SAAS,GAAG,GAAG,OAAO,SAAS,QAAQ,OAAO;IAC7F,MAAM;IACP,CAAC;GACF,MAAM,iBAAiB,MAAM,KAAK,OAAO,cAAc;GACvD,MAAM,WAAW,KAAK,cAAc;IAClC,oBAAoB,eAAe;IACnC,iBAAiB,WAAW;IAC7B,CAAC;AACF,UAAO;IACL,IAAI;IACJ;IACA;IACA,OAAO,OAAO,SAAS;IACvB,SAAS,OAAO,SAAS;IACzB;IACA,UAAU,OAAO,SAAS,KAAK;IAC/B,eAAe,OAAO;IACtB,oBAAoB,eAAe;IACnC,iBAAiB,WAAW;IAC5B,iBAAiB,WAAW;IAC5B;IACD;YACO;AACR,SAAM,GAAG,eAAe;IAAE,WAAW;IAAM,OAAO;IAAM,CAAC;;;CAI7D,iBAAyB,WAGY;EACnC,MAAM,EAAE,iBAAiB,uBAAuB;EAChD,MAAM,WAA0C,EAAE;AAClD,MAAI,qBAAqB,sBACvB,UAAS,KAAK;GACZ,MAAM;GACN,SAAS,iBAAiB,KAAK,YAAY,mBAAmB,CAAC,6BAA6B,KAAK,YAAY,sBAAsB,CAAC;GACrI,CAAC;AAEJ,MAAI,kBAAkB,kBACpB,UAAS,KAAK;GACZ,MAAM;GACN,SAAS,mBAAmB,KAAK,YAAY,gBAAgB,CAAC,6BAA6B,KAAK,YAAY,kBAAkB,CAAC;GAChI,CAAC;AAEJ,SAAO;;CAGT,eAAuB,UAA0B;AAC/C,MAAI,QAAQ,KACV,QAAO,GAAG,MAAM;AAElB,MAAI,QAAQ,OAAO,KACjB,QAAO,IAAI,QAAQ,MAAM,QAAQ,EAAE,CAAC;AAEtC,SAAO,IAAI,SAAS,OAAO,OAAO,QAAQ,EAAE,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-publish.service.d.ts","names":[],"sources":["../../src/publish/app-publish.service.ts"],"mappings":";;;;;;;;;cAkBa,iBAAA;EAAA,iBAEQ,eAAA;EAAA,iBACA,aAAA;EAAA,iBACA,eAAA;EAAA,iBACA,iBAAA;EAAA,iBACA,gBAAA;cAJA,eAAA,GAAiB,kBAAA,EACjB,aAAA,GAAe,gBAAA,EACf,eAAA,GAAiB,6BAAA,EACjB,iBAAA,GAAmB,2BAAA,EACnB,gBAAA,GAAkB,wBAAA;EAGrC,OAAA,GAAiB,MAAA;IACf,YAAA;IACA,YAAA;IACA,UAAA;IACA,KAAA;IACA,IAAA,GAAO,mBAAA;EAAA,MACL,OAAA,CAAQ,gBAAA;EAAA,QAiEJ,mBAAA;EAAA,QA6CA,wBAAA;EAAA,QA6CA,sBAAA;EAAA,QAOA,kBAAA;EAAA,QAkBA,sBAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-publish.service.js","names":[],"sources":["../../src/publish/app-publish.service.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { AppBundleService } from \"../bundle/app-bundle.service.js\";\nimport type { AppDistributionMode } from \"../bundle/app-bundle.types.js\";\nimport { AppManifestService } from \"../manifest/app-manifest.service.js\";\nimport { AppMarketplaceClientService } from \"./app-marketplace-client.service.js\";\nimport { AppMarketplaceMetadataService } from \"./app-marketplace-metadata.service.js\";\nimport type { AppPublishPayload, AppPublishResult } from \"./app-publish.types.js\";\nimport { PlatformAuthStateService } from \"./platform-auth-state.service.js\";\n\nconst DEFAULT_PLATFORM_API_BASE = \"https://ai-gateway-api.nextclaw.io\";\n\ntype ResolvedPublishActor = {\n token: string;\n publisher: NonNullable<AppPublishPayload[\"publisher\"]>;\n};\n\nexport class AppPublishService {\n constructor(\n private readonly manifestService: AppManifestService = new AppManifestService(),\n private readonly bundleService: AppBundleService = new AppBundleService(),\n private readonly metadataService: AppMarketplaceMetadataService = new AppMarketplaceMetadataService(),\n private readonly marketplaceClient: AppMarketplaceClientService = new AppMarketplaceClientService(),\n private readonly authStateService: PlatformAuthStateService = new PlatformAuthStateService(),\n ) {}\n\n publish = async (params: {\n appDirectory: string;\n metadataPath?: string;\n apiBaseUrl?: string;\n token?: string;\n mode?: AppDistributionMode;\n }): Promise<AppPublishResult> => {\n const { appDirectory: inputAppDirectory, metadataPath, apiBaseUrl, token } = params;\n const distributionMode = params.mode ?? \"source\";\n const appDirectory = path.resolve(inputAppDirectory);\n const manifestBundle = await this.manifestService.load(appDirectory);\n const metadata = await this.metadataService.load({\n appDirectory,\n manifest: manifestBundle.manifest,\n metadataPath,\n });\n const actor = await this.resolvePublishActor({\n apiBaseUrl,\n explicitToken: token,\n appId: manifestBundle.manifest.id,\n });\n const bundle = await this.bundleService.packAppDirectory({\n appDirectory,\n mode: distributionMode,\n });\n const bundleBytes = Buffer.from(await readFile(bundle.bundlePath));\n const bundleSha256 = createHash(\"sha256\").update(bundleBytes).digest(\"hex\");\n const publishFiles = await this.metadataService.collectPublishFiles({\n appDirectory,\n metadataPath,\n });\n const payload: AppPublishPayload = {\n slug: metadata.slug,\n appId: manifestBundle.manifest.id,\n name: manifestBundle.manifest.name,\n version: manifestBundle.manifest.version,\n summary: metadata.summary,\n summaryI18n: metadata.summaryI18n,\n description: metadata.description ?? manifestBundle.manifest.description,\n descriptionI18n: metadata.descriptionI18n,\n author: metadata.author,\n tags: metadata.tags,\n sourceRepo: metadata.sourceRepo,\n homepage: metadata.homepage,\n featured: metadata.featured ?? false,\n publisher: actor.publisher,\n distributionMode,\n manifest: manifestBundle.manifest,\n permissions: manifestBundle.manifest.permissions ?? {},\n bundleBase64: bundleBytes.toString(\"base64\"),\n bundleSha256,\n files: publishFiles.map((file) => ({\n path: file.path,\n contentBase64: file.bytes.toString(\"base64\"),\n })),\n };\n const result = await this.marketplaceClient.publish({\n payload,\n apiBaseUrl,\n token: actor.token,\n });\n return {\n ...result,\n distribution: {\n path: bundle.bundlePath,\n sha256: bundleSha256,\n mode: distributionMode,\n },\n };\n };\n\n private resolvePublishActor = async (params: {\n apiBaseUrl?: string;\n explicitToken?: string;\n appId: string;\n }): Promise<ResolvedPublishActor> => {\n const explicitToken = params.explicitToken?.trim();\n const envAdminToken = process.env.NEXTCLAW_MARKETPLACE_ADMIN_TOKEN?.trim();\n if (explicitToken) {\n const token = explicitToken;\n if (!token) {\n throw new Error(\"缺少 publish token。\");\n }\n const me = await this.fetchCurrentPlatformUser({\n token,\n platformApiBase: this.resolvePlatformApiBase(),\n });\n return {\n token,\n publisher: this.buildUserPublisher(me, params.appId),\n };\n }\n\n const authState = this.authStateService.readCurrentAuthState();\n const platformToken = authState.token?.trim();\n if (platformToken) {\n const me = await this.fetchCurrentPlatformUser({\n token: platformToken,\n platformApiBase: this.resolvePlatformApiBase(authState.apiBaseUrl),\n });\n return {\n token: platformToken,\n publisher: this.buildUserPublisher(me, params.appId),\n };\n }\n\n if (envAdminToken) {\n return {\n token: envAdminToken,\n publisher: this.buildOfficialPublisher(),\n };\n }\n\n throw new Error(\"发布需要 NextClaw 平台登录态。请先运行 nextclaw login,或传入 --token。\");\n };\n\n private fetchCurrentPlatformUser = async (params: {\n token: string;\n platformApiBase: string;\n }): Promise<{\n id: string;\n username: string | null;\n role: \"admin\" | \"user\";\n }> => {\n const response = await fetch(`${params.platformApiBase}/platform/auth/me`, {\n headers: {\n authorization: `Bearer ${params.token}`,\n accept: \"application/json\",\n },\n });\n const payload = await response.json().catch(() => null);\n if (!response.ok) {\n const message =\n typeof payload === \"object\" &&\n payload &&\n \"error\" in payload &&\n typeof (payload as { error?: { message?: unknown } }).error?.message === \"string\"\n ? (payload as { error: { message: string } }).error.message\n : `${response.status} ${response.statusText}`;\n throw new Error(`读取 NextClaw 登录态失败:${message}`);\n }\n const user = typeof payload === \"object\" &&\n payload &&\n \"data\" in payload &&\n typeof (payload as { data?: { user?: unknown } }).data?.user === \"object\" &&\n (payload as { data: { user: Record<string, unknown> } }).data.user\n ? (payload as { data: { user: Record<string, unknown> } }).data.user\n : null;\n const id = typeof user?.id === \"string\" ? user.id.trim() : \"\";\n const username = typeof user?.username === \"string\" ? user.username.trim() : \"\";\n const role = user?.role === \"admin\" ? \"admin\" : \"user\";\n if (!id) {\n throw new Error(\"平台登录态缺少用户 id。\");\n }\n return {\n id,\n username: username || null,\n role,\n };\n };\n\n private resolvePlatformApiBase = (configuredApiBase?: string): string => {\n const source = configuredApiBase?.trim() || process.env.NEXTCLAW_PLATFORM_API_BASE?.trim() || DEFAULT_PLATFORM_API_BASE;\n const normalized = new URL(source);\n normalized.pathname = normalized.pathname.replace(/\\/v1\\/?$/, \"/\");\n return normalized.toString().replace(/\\/+$/, \"\");\n };\n\n private buildUserPublisher = (\n user: { id: string; username: string | null; role: \"admin\" | \"user\" },\n appId: string,\n ): NonNullable<AppPublishPayload[\"publisher\"]> => {\n const isOfficialScope = appId.startsWith(\"nextclaw.\");\n if (isOfficialScope && user.role === \"admin\") {\n return this.buildOfficialPublisher();\n }\n if (!user.username) {\n throw new Error(\"当前 NextClaw 账号还没有 username,无法发布个人 scope app。请先在平台账号页设置用户名。\");\n }\n return {\n id: user.username,\n name: user.username,\n url: `https://platform.nextclaw.io/account`,\n };\n };\n\n private buildOfficialPublisher = (): NonNullable<AppPublishPayload[\"publisher\"]> => {\n return {\n id: \"nextclaw\",\n name: \"NextClaw\",\n url: \"https://nextclaw.io\",\n };\n };\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-publish.types.d.ts","names":[],"sources":["../../src/publish/app-publish.types.ts"],"mappings":";;;;;cAIa,gCAAA;AAAA,KAED,sBAAA;EACV,IAAA;EACA,OAAA;EACA,WAAA,EAAa,MAAA;EACb,WAAA;EACA,eAAA,GAAkB,MAAA;EAClB,MAAA;EACA,IAAA;EACA,UAAA;EACA,QAAA;EACA,QAAA;EACA,SAAA,GAAY,YAAA;AAAA;AAAA,KAGF,cAAA;EACV,IAAA;EACA,aAAA;AAAA;AAAA,KAGU,iBAAA;EACV,IAAA;EACA,KAAA;EACA,IAAA;EACA,OAAA;EACA,OAAA;EACA,WAAA,EAAa,MAAA;EACb,WAAA;EACA,eAAA,GAAkB,MAAA;EAClB,MAAA;EACA,IAAA;EACA,UAAA;EACA,QAAA;EACA,QAAA;EACA,SAAA,EAAW,YAAA;EACX,gBAAA,EAAkB,mBAAA;EAClB,QAAA,EAAU,WAAA;EACV,WAAA,EAAa,cAAA;EACb,YAAA;EACA,YAAA;EACA,KAAA,EAAO,cAAA;AAAA;AAAA,KAGG,gBAAA;EACV,OAAA;EACA,IAAA;IACE,IAAA;IACA,KAAA;IACA,IAAA;IACA,aAAA;IACA,MAAA;IACA,OAAA;MACE,IAAA;MACA,IAAA;MACA,OAAA;MACA,QAAA;IAAA;EAAA;EAGJ,YAAA;IACE,IAAA;IACA,MAAA;IACA,IAAA,EAAM,mBAAA;EAAA;EAER,SAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-publish.types.js","names":[],"sources":["../../src/publish/app-publish.types.ts"],"sourcesContent":["import type { AppDistributionMode } from \"../bundle/app-bundle.types.js\";\nimport type { AppManifest, AppPermissions } from \"../manifest/app-manifest.types.js\";\nimport type { AppPublisher } from \"../registry/app-remote-registry.types.js\";\n\nexport const DEFAULT_APP_MARKETPLACE_API_BASE = \"https://apps-registry.nextclaw.io\";\n\nexport type AppMarketplaceMetadata = {\n slug: string;\n summary: string;\n summaryI18n: Record<string, string>;\n description?: string;\n descriptionI18n?: Record<string, string>;\n author: string;\n tags: string[];\n sourceRepo?: string;\n homepage?: string;\n featured?: boolean;\n publisher?: AppPublisher;\n};\n\nexport type AppPublishFile = {\n path: string;\n contentBase64: string;\n};\n\nexport type AppPublishPayload = {\n slug: string;\n appId: string;\n name: string;\n version: string;\n summary: string;\n summaryI18n: Record<string, string>;\n description?: string;\n descriptionI18n?: Record<string, string>;\n author: string;\n tags: string[];\n sourceRepo?: string;\n homepage?: string;\n featured: boolean;\n publisher: AppPublisher;\n distributionMode: AppDistributionMode;\n manifest: AppManifest;\n permissions: AppPermissions;\n bundleBase64: string;\n bundleSha256: string;\n files: AppPublishFile[];\n};\n\nexport type AppPublishResult = {\n created: boolean;\n item: {\n slug: string;\n appId: string;\n name: string;\n latestVersion: string;\n webUrl?: string;\n install: {\n kind: \"registry\";\n spec: string;\n command: string;\n registry: string;\n };\n };\n distribution: {\n path: string;\n sha256: string;\n mode: AppDistributionMode;\n };\n fileCount: number;\n};\n"],"mappings":";AAIA,MAAa,mCAAmC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"platform-auth-state.service.d.ts","names":[],"sources":["../../src/publish/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 +0,0 @@
1
- {"version":3,"file":"platform-auth-state.service.js","names":[],"sources":["../../src/publish/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 +0,0 @@
1
- {"version":3,"file":"app-registry-config.service.js","names":[],"sources":["../../src/registry/app-registry-config.service.ts"],"sourcesContent":["import { readFile, rm, writeFile } from \"node:fs/promises\";\nimport { AppHomeService } from \"../paths/app-home.service.js\";\nimport {\n DEFAULT_APP_REGISTRY_URL,\n type AppRegistryConfig,\n type AppRegistryConfigSnapshot,\n} from \"./app-remote-registry.types.js\";\n\nexport class AppRegistryConfigService {\n constructor(\n private readonly appHomeService: AppHomeService = new AppHomeService(),\n ) {}\n\n getSnapshot = async (): Promise<AppRegistryConfigSnapshot> => {\n const envUrl = process.env.NEXTCLAW_APP_REGISTRY?.trim();\n if (envUrl) {\n return {\n defaultUrl: DEFAULT_APP_REGISTRY_URL,\n currentUrl: this.normalizeRegistryUrl(envUrl),\n source: \"env\",\n };\n }\n const config = await this.loadOptionalConfig();\n if (config) {\n return {\n defaultUrl: DEFAULT_APP_REGISTRY_URL,\n currentUrl: this.normalizeRegistryUrl(config.registry.url),\n source: \"config\",\n };\n }\n return {\n defaultUrl: DEFAULT_APP_REGISTRY_URL,\n currentUrl: DEFAULT_APP_REGISTRY_URL,\n source: \"default\",\n };\n };\n\n setRegistryUrl = async (registryUrl: string): Promise<AppRegistryConfigSnapshot> => {\n const normalized = this.normalizeRegistryUrl(registryUrl);\n await this.appHomeService.ensureBaseDirectories();\n await writeFile(\n this.appHomeService.getConfigPath(),\n `${JSON.stringify(\n {\n schemaVersion: 1,\n registry: {\n url: normalized,\n },\n } satisfies AppRegistryConfig,\n null,\n 2,\n )}\\n`,\n \"utf-8\",\n );\n return {\n defaultUrl: DEFAULT_APP_REGISTRY_URL,\n currentUrl: normalized,\n source: \"config\",\n };\n };\n\n resetRegistryUrl = async (): Promise<AppRegistryConfigSnapshot> => {\n await rm(this.appHomeService.getConfigPath(), { force: true });\n return {\n defaultUrl: DEFAULT_APP_REGISTRY_URL,\n currentUrl: DEFAULT_APP_REGISTRY_URL,\n source: \"default\",\n };\n };\n\n private loadOptionalConfig = async (): Promise<AppRegistryConfig | undefined> => {\n try {\n const raw = await readFile(this.appHomeService.getConfigPath(), \"utf-8\");\n return this.parseConfig(JSON.parse(raw) as unknown);\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return undefined;\n }\n throw error;\n }\n };\n\n private parseConfig = (rawConfig: unknown): AppRegistryConfig => {\n if (!rawConfig || typeof rawConfig !== \"object\" || Array.isArray(rawConfig)) {\n throw new Error(\"config.json 必须是对象。\");\n }\n const candidate = rawConfig as Record<string, unknown>;\n if (candidate.schemaVersion !== 1) {\n throw new Error(\"当前只支持 config schemaVersion = 1。\");\n }\n const registry = candidate.registry;\n if (!registry || typeof registry !== \"object\" || Array.isArray(registry)) {\n throw new Error(\"config.registry 必须是对象。\");\n }\n const registryUrl = (registry as Record<string, unknown>).url;\n if (typeof registryUrl !== \"string\" || !registryUrl.trim()) {\n throw new Error(\"config.registry.url 必须是非空字符串。\");\n }\n return {\n schemaVersion: 1,\n registry: {\n url: this.normalizeRegistryUrl(registryUrl),\n },\n };\n };\n\n private normalizeRegistryUrl = (registryUrl: string): string => {\n let normalized: URL;\n try {\n normalized = new URL(registryUrl);\n } catch {\n throw new Error(`非法 registry URL:${registryUrl}`);\n }\n if (normalized.protocol !== \"http:\" && normalized.protocol !== \"https:\") {\n throw new Error(`registry URL 只支持 http/https:${registryUrl}`);\n }\n const text = normalized.toString();\n return text.endsWith(\"/\") ? text : `${text}/`;\n };\n}\n"],"mappings":";;;;AAQA,IAAa,2BAAb,MAAsC;CACpC,YACE,iBAAkD,IAAI,gBAAgB,EACtE;AADiB,OAAA,iBAAA;;CAGnB,cAAc,YAAgD;EAC5D,MAAM,SAAS,QAAQ,IAAI,uBAAuB,MAAM;AACxD,MAAI,OACF,QAAO;GACL,YAAY;GACZ,YAAY,KAAK,qBAAqB,OAAO;GAC7C,QAAQ;GACT;EAEH,MAAM,SAAS,MAAM,KAAK,oBAAoB;AAC9C,MAAI,OACF,QAAO;GACL,YAAY;GACZ,YAAY,KAAK,qBAAqB,OAAO,SAAS,IAAI;GAC1D,QAAQ;GACT;AAEH,SAAO;GACL,YAAY;GACZ,YAAY;GACZ,QAAQ;GACT;;CAGH,iBAAiB,OAAO,gBAA4D;EAClF,MAAM,aAAa,KAAK,qBAAqB,YAAY;AACzD,QAAM,KAAK,eAAe,uBAAuB;AACjD,QAAM,UACJ,KAAK,eAAe,eAAe,EACnC,GAAG,KAAK,UACN;GACE,eAAe;GACf,UAAU,EACR,KAAK,YACN;GACF,EACD,MACA,EACD,CAAC,KACF,QACD;AACD,SAAO;GACL,YAAY;GACZ,YAAY;GACZ,QAAQ;GACT;;CAGH,mBAAmB,YAAgD;AACjE,QAAM,GAAG,KAAK,eAAe,eAAe,EAAE,EAAE,OAAO,MAAM,CAAC;AAC9D,SAAO;GACL,YAAY;GACZ,YAAY;GACZ,QAAQ;GACT;;CAGH,qBAA6B,YAAoD;AAC/E,MAAI;GACF,MAAM,MAAM,MAAM,SAAS,KAAK,eAAe,eAAe,EAAE,QAAQ;AACxE,UAAO,KAAK,YAAY,KAAK,MAAM,IAAI,CAAY;WAC5C,OAAO;AACd,OACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACV,MAAM,SAAS,SAEf;AAEF,SAAM;;;CAIV,eAAuB,cAA0C;AAC/D,MAAI,CAAC,aAAa,OAAO,cAAc,YAAY,MAAM,QAAQ,UAAU,CACzE,OAAM,IAAI,MAAM,qBAAqB;EAEvC,MAAM,YAAY;AAClB,MAAI,UAAU,kBAAkB,EAC9B,OAAM,IAAI,MAAM,kCAAkC;EAEpD,MAAM,WAAW,UAAU;AAC3B,MAAI,CAAC,YAAY,OAAO,aAAa,YAAY,MAAM,QAAQ,SAAS,CACtE,OAAM,IAAI,MAAM,yBAAyB;EAE3C,MAAM,cAAe,SAAqC;AAC1D,MAAI,OAAO,gBAAgB,YAAY,CAAC,YAAY,MAAM,CACxD,OAAM,IAAI,MAAM,gCAAgC;AAElD,SAAO;GACL,eAAe;GACf,UAAU,EACR,KAAK,KAAK,qBAAqB,YAAY,EAC5C;GACF;;CAGH,wBAAgC,gBAAgC;EAC9D,IAAI;AACJ,MAAI;AACF,gBAAa,IAAI,IAAI,YAAY;UAC3B;AACN,SAAM,IAAI,MAAM,mBAAmB,cAAc;;AAEnD,MAAI,WAAW,aAAa,WAAW,WAAW,aAAa,SAC7D,OAAM,IAAI,MAAM,+BAA+B,cAAc;EAE/D,MAAM,OAAO,WAAW,UAAU;AAClC,SAAO,KAAK,SAAS,IAAI,GAAG,OAAO,GAAG,KAAK"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-registry.service.d.ts","names":[],"sources":["../../src/registry/app-registry.service.ts"],"mappings":";;;;;;cAWa,kBAAA;EAAA,iBACkB,cAAA;cAAA,cAAA,GAAgB,cAAA;EAE7C,IAAA,QAAiB,OAAA,CAAQ,WAAA;EAsBzB,IAAA,GAAc,QAAA,EAAU,WAAA,KAAc,OAAA;EAStC,QAAA,QAAqB,OAAA,CAAQ,oBAAA;EAK7B,MAAA,GAAgB,KAAA,aAAgB,OAAA,CAAQ,oBAAA;EAKxC,gBAAA,GACE,KAAA,aACC,OAAA,CAAQ,2BAAA;EAQX,kBAAA,GAA4B,MAAA;IAC1B,KAAA;IACA,IAAA;IACA,WAAA;IACA,OAAA;IACA,gBAAA;IACA,aAAA;IACA,UAAA,EAAY,oBAAA;IACZ,SAAA;IACA,WAAA;IACA,gBAAA,GAAmB,2BAAA;IACnB,WAAA,EAAa,cAAA;IACb,WAAA;IACA,SAAA;IACA,MAAA;IACA,SAAA,GAAY,2BAAA;EAAA,MACV,OAAA,CAAQ,oBAAA;EAiDZ,YAAA,GACE,KAAA,UACA,MAAA,EAAQ,mBAAA,KACP,OAAA,CAAQ,oBAAA;EAeX,gBAAA,GACE,KAAA,UACA,OAAA,UACA,aAAA,aACC,OAAA,CAAQ,oBAAA;EAMX,mBAAA,GACE,KAAA,UACA,OAAA,aACC,OAAA;EAeH,SAAA,GAAmB,KAAA,aAAgB,OAAA,CAAQ,oBAAA;EAAA,QAWnC,aAAA;AAAA"}
@@ -1,118 +0,0 @@
1
- import { AppHomeService } from "../paths/app-home.service.js";
2
- import { readFile, writeFile } from "node:fs/promises";
3
- //#region src/registry/app-registry.service.ts
4
- var AppRegistryService = class {
5
- constructor(appHomeService = new AppHomeService()) {
6
- this.appHomeService = appHomeService;
7
- }
8
- load = async () => {
9
- await this.appHomeService.ensureBaseDirectories();
10
- const registryPath = this.appHomeService.getRegistryPath();
11
- try {
12
- const raw = await readFile(registryPath, "utf-8");
13
- return this.parseRegistry(JSON.parse(raw));
14
- } catch (error) {
15
- if (typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT") return {
16
- schemaVersion: 1,
17
- apps: {}
18
- };
19
- throw error;
20
- }
21
- };
22
- save = async (registry) => {
23
- await this.appHomeService.ensureBaseDirectories();
24
- await writeFile(this.appHomeService.getRegistryPath(), `${JSON.stringify(registry, null, 2)}\n`, "utf-8");
25
- };
26
- listApps = async () => {
27
- const registry = await this.load();
28
- return Object.values(registry.apps).sort((left, right) => left.appId.localeCompare(right.appId));
29
- };
30
- getApp = async (appId) => {
31
- return (await this.load()).apps[appId];
32
- };
33
- getActiveVersion = async (appId) => {
34
- const appRecord = await this.getApp(appId);
35
- if (!appRecord) return;
36
- return appRecord.installedVersions[appRecord.activeVersion];
37
- };
38
- upsertInstallation = async (params) => {
39
- const { appId, name, description, version, installDirectory, dataDirectory, sourceKind, sourceRef, installedAt, distributionMode, permissions, registryUrl, bundleUrl, sha256, publisher } = params;
40
- const registry = await this.load();
41
- const currentRecord = registry.apps[appId];
42
- const nextRecord = {
43
- appId,
44
- name,
45
- description,
46
- activeVersion: version,
47
- dataDirectory,
48
- installedVersions: {
49
- ...currentRecord?.installedVersions ?? {},
50
- [version]: {
51
- version,
52
- installDirectory,
53
- sourceKind,
54
- sourceRef,
55
- installedAt,
56
- distributionMode,
57
- permissions,
58
- registryUrl,
59
- bundleUrl,
60
- sha256,
61
- publisher
62
- }
63
- },
64
- grants: currentRecord?.grants ?? {}
65
- };
66
- registry.apps[appId] = nextRecord;
67
- await this.save(registry);
68
- return nextRecord;
69
- };
70
- updateGrants = async (appId, grants) => {
71
- const registry = await this.load();
72
- const appRecord = registry.apps[appId];
73
- if (!appRecord) throw new Error(`未找到已安装应用:${appId}`);
74
- appRecord.grants = {
75
- ...appRecord.grants,
76
- ...grants
77
- };
78
- registry.apps[appId] = appRecord;
79
- await this.save(registry);
80
- return appRecord;
81
- };
82
- setDocumentGrant = async (appId, scopeId, directoryPath) => {
83
- return this.updateGrants(appId, { [scopeId]: directoryPath });
84
- };
85
- removeDocumentGrant = async (appId, scopeId) => {
86
- const registry = await this.load();
87
- const appRecord = registry.apps[appId];
88
- if (!appRecord) throw new Error(`未找到已安装应用:${appId}`);
89
- if (!(scopeId in appRecord.grants)) return false;
90
- delete appRecord.grants[scopeId];
91
- registry.apps[appId] = appRecord;
92
- await this.save(registry);
93
- return true;
94
- };
95
- removeApp = async (appId) => {
96
- const registry = await this.load();
97
- const appRecord = registry.apps[appId];
98
- if (!appRecord) return;
99
- delete registry.apps[appId];
100
- await this.save(registry);
101
- return appRecord;
102
- };
103
- parseRegistry = (rawRegistry) => {
104
- if (!rawRegistry || typeof rawRegistry !== "object" || Array.isArray(rawRegistry)) throw new Error("registry.json 必须是对象。");
105
- const candidate = rawRegistry;
106
- if (candidate.schemaVersion !== 1) throw new Error("当前只支持 registry schemaVersion = 1。");
107
- const apps = candidate.apps;
108
- if (!apps || typeof apps !== "object" || Array.isArray(apps)) throw new Error("registry.apps 必须是对象。");
109
- return {
110
- schemaVersion: 1,
111
- apps
112
- };
113
- };
114
- };
115
- //#endregion
116
- export { AppRegistryService };
117
-
118
- //# sourceMappingURL=app-registry.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-registry.service.js","names":[],"sources":["../../src/registry/app-registry.service.ts"],"sourcesContent":["import { readFile, writeFile } from \"node:fs/promises\";\nimport type { AppPermissions } from \"../manifest/app-manifest.types.js\";\nimport type { AppDocumentGrantMap } from \"../permissions/app-permissions.types.js\";\nimport { AppHomeService } from \"../paths/app-home.service.js\";\nimport type {\n AppInstallSourceKind,\n AppRegistry,\n AppRegistryAppRecord,\n AppRegistryInstalledVersion,\n} from \"./app-registry.types.js\";\n\nexport class AppRegistryService {\n constructor(private readonly appHomeService: AppHomeService = new AppHomeService()) {}\n\n load = async (): Promise<AppRegistry> => {\n await this.appHomeService.ensureBaseDirectories();\n const registryPath = this.appHomeService.getRegistryPath();\n try {\n const raw = await readFile(registryPath, \"utf-8\");\n return this.parseRegistry(JSON.parse(raw) as unknown);\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return {\n schemaVersion: 1,\n apps: {},\n };\n }\n throw error;\n }\n };\n\n save = async (registry: AppRegistry): Promise<void> => {\n await this.appHomeService.ensureBaseDirectories();\n await writeFile(\n this.appHomeService.getRegistryPath(),\n `${JSON.stringify(registry, null, 2)}\\n`,\n \"utf-8\",\n );\n };\n\n listApps = async (): Promise<AppRegistryAppRecord[]> => {\n const registry = await this.load();\n return Object.values(registry.apps).sort((left, right) => left.appId.localeCompare(right.appId));\n };\n\n getApp = async (appId: string): Promise<AppRegistryAppRecord | undefined> => {\n const registry = await this.load();\n return registry.apps[appId];\n };\n\n getActiveVersion = async (\n appId: string,\n ): Promise<AppRegistryInstalledVersion | undefined> => {\n const appRecord = await this.getApp(appId);\n if (!appRecord) {\n return undefined;\n }\n return appRecord.installedVersions[appRecord.activeVersion];\n };\n\n upsertInstallation = async (params: {\n appId: string;\n name: string;\n description?: string;\n version: string;\n installDirectory: string;\n dataDirectory: string;\n sourceKind: AppInstallSourceKind;\n sourceRef: string;\n installedAt: string;\n distributionMode?: AppRegistryInstalledVersion[\"distributionMode\"];\n permissions: AppPermissions;\n registryUrl?: string;\n bundleUrl?: string;\n sha256?: string;\n publisher?: AppRegistryInstalledVersion[\"publisher\"];\n }): Promise<AppRegistryAppRecord> => {\n const {\n appId,\n name,\n description,\n version,\n installDirectory,\n dataDirectory,\n sourceKind,\n sourceRef,\n installedAt,\n distributionMode,\n permissions,\n registryUrl,\n bundleUrl,\n sha256,\n publisher,\n } = params;\n const registry = await this.load();\n const currentRecord = registry.apps[appId];\n const nextRecord: AppRegistryAppRecord = {\n appId,\n name,\n description,\n activeVersion: version,\n dataDirectory,\n installedVersions: {\n ...(currentRecord?.installedVersions ?? {}),\n [version]: {\n version,\n installDirectory,\n sourceKind,\n sourceRef,\n installedAt,\n distributionMode,\n permissions,\n registryUrl,\n bundleUrl,\n sha256,\n publisher,\n },\n },\n grants: currentRecord?.grants ?? {},\n };\n registry.apps[appId] = nextRecord;\n await this.save(registry);\n return nextRecord;\n };\n\n updateGrants = async (\n appId: string,\n grants: AppDocumentGrantMap,\n ): Promise<AppRegistryAppRecord> => {\n const registry = await this.load();\n const appRecord = registry.apps[appId];\n if (!appRecord) {\n throw new Error(`未找到已安装应用:${appId}`);\n }\n appRecord.grants = {\n ...appRecord.grants,\n ...grants,\n };\n registry.apps[appId] = appRecord;\n await this.save(registry);\n return appRecord;\n };\n\n setDocumentGrant = async (\n appId: string,\n scopeId: string,\n directoryPath: string,\n ): Promise<AppRegistryAppRecord> => {\n return this.updateGrants(appId, {\n [scopeId]: directoryPath,\n });\n };\n\n removeDocumentGrant = async (\n appId: string,\n scopeId: string,\n ): Promise<boolean> => {\n const registry = await this.load();\n const appRecord = registry.apps[appId];\n if (!appRecord) {\n throw new Error(`未找到已安装应用:${appId}`);\n }\n if (!(scopeId in appRecord.grants)) {\n return false;\n }\n delete appRecord.grants[scopeId];\n registry.apps[appId] = appRecord;\n await this.save(registry);\n return true;\n };\n\n removeApp = async (appId: string): Promise<AppRegistryAppRecord | undefined> => {\n const registry = await this.load();\n const appRecord = registry.apps[appId];\n if (!appRecord) {\n return undefined;\n }\n delete registry.apps[appId];\n await this.save(registry);\n return appRecord;\n };\n\n private parseRegistry = (rawRegistry: unknown): AppRegistry => {\n if (!rawRegistry || typeof rawRegistry !== \"object\" || Array.isArray(rawRegistry)) {\n throw new Error(\"registry.json 必须是对象。\");\n }\n const candidate = rawRegistry as Record<string, unknown>;\n if (candidate.schemaVersion !== 1) {\n throw new Error(\"当前只支持 registry schemaVersion = 1。\");\n }\n const apps = candidate.apps;\n if (!apps || typeof apps !== \"object\" || Array.isArray(apps)) {\n throw new Error(\"registry.apps 必须是对象。\");\n }\n return {\n schemaVersion: 1,\n apps: apps as Record<string, AppRegistryAppRecord>,\n };\n };\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-registry.types.d.ts","names":[],"sources":["../../src/registry/app-registry.types.ts"],"mappings":";;;;;;KAKY,oBAAA;AAAA,KAEA,2BAAA;EACV,OAAA;EACA,gBAAA;EACA,UAAA,EAAY,oBAAA;EACZ,SAAA;EACA,WAAA;EACA,gBAAA,GAAmB,mBAAA;EACnB,WAAA,EAAa,cAAA;EACb,WAAA;EACA,SAAA;EACA,MAAA;EACA,SAAA,GAAY,YAAA;AAAA;AAAA,KAGF,oBAAA;EACV,KAAA;EACA,IAAA;EACA,WAAA;EACA,aAAA;EACA,aAAA;EACA,iBAAA,EAAmB,MAAA,SAAe,2BAAA;EAClC,MAAA,EAAQ,mBAAA;AAAA;AAAA,KAGE,WAAA;EACV,aAAA;EACA,IAAA,EAAM,MAAA,SAAe,oBAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-remote-registry-client.service.d.ts","names":[],"sources":["../../src/registry/app-remote-registry-client.service.ts"],"mappings":";;;;cAUa,8BAAA;EAAA,iBAEQ,aAAA;cAAA,aAAA,GAAe,wBAAA;EAGlC,OAAA,GAAiB,MAAA;IACf,KAAA;IACA,OAAA;IACA,WAAA;EAAA,MACE,OAAA,CAAQ,2BAAA;EAqCZ,cAAA,GAAwB,MAAA;IACtB,UAAA,EAAY,2BAAA;IACZ,eAAA;EAAA,MACE,OAAA;IACF,UAAA;EAAA;EAAA,QA0BM,aAAA;EAAA,QAsCA,YAAA;EAAA,QAwDA,cAAA;EAAA,QAkBA,kBAAA;EAAA,QAOA,kBAAA;EAAA,QAUA,uBAAA;EAAA,QAIA,oBAAA;AAAA"}