nextclaw 0.34.0 → 0.35.0

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 (50) hide show
  1. package/dist/cli/app/index.js +31 -33
  2. package/dist/cli/app/index.js.map +1 -1
  3. package/package.json +10 -10
  4. package/ui-dist/assets/{api-a_GaOFc7.js → api-Dket1cmq.js} +1 -1
  5. package/ui-dist/assets/{appearance-settings-page-Bpd2RhK5.js → appearance-settings-page-CfwDf9ag.js} +1 -1
  6. package/ui-dist/assets/{channels-list-page-CTblam4c.js → channels-list-page-Dyn83ZlS.js} +1 -1
  7. package/ui-dist/assets/{chat-page-Bg3_X8G9.js → chat-page-CL0IMvgF.js} +1 -1
  8. package/ui-dist/assets/{config-split-page-ps1Aod3g.js → config-split-page-D4D4HFhq.js} +1 -1
  9. package/ui-dist/assets/{confirm-dialog-DJSUNG33.js → confirm-dialog-Cv6-9Nnj.js} +1 -1
  10. package/ui-dist/assets/{desktop-update-config-D9AyIhJZ.js → desktop-update-config-Bckgulvm.js} +1 -1
  11. package/ui-dist/assets/{dist-BkTYNzm_.js → dist-Bh_tj3FN.js} +1 -1
  12. package/ui-dist/assets/{dist-DkR7_Dpl.js → dist-BrRgjiq1.js} +1 -1
  13. package/ui-dist/assets/{doc-browser-Q67TOGVS.js → doc-browser-BlWjhmnM.js} +1 -1
  14. package/ui-dist/assets/doc-browser-Da9hDsoQ.js +1 -0
  15. package/ui-dist/assets/{doc-browser-context-BQim8SqD.js → doc-browser-context-NGYa66Xg.js} +1 -1
  16. package/ui-dist/assets/{form-actions-B2-bpFie.js → form-actions-CeKgh4SQ.js} +1 -1
  17. package/ui-dist/assets/{index-VQAVqwG8.js → index-Bz5yNMXA.js} +30 -30
  18. package/ui-dist/assets/loader-circle-DLp2jNIf.js +1 -0
  19. package/ui-dist/assets/mcp-marketplace-page-CIWbjXM8.js +1 -0
  20. package/ui-dist/assets/{mcp-marketplace-page-w8panjZG.js → mcp-marketplace-page-DfNmMqKs.js} +1 -1
  21. package/ui-dist/assets/{model-config-page-B8Aubkwx.js → model-config-page-DHzyDV5v.js} +1 -1
  22. package/ui-dist/assets/{navigation-link-mpHFXwRr.js → navigation-link-CzGgQGi_.js} +1 -1
  23. package/ui-dist/assets/plus-Dfj3tJ_m.js +1 -0
  24. package/ui-dist/assets/{provider-scoped-model-input-BRnIH-5O.js → provider-scoped-model-input-CjrHwzFb.js} +1 -1
  25. package/ui-dist/assets/{providers-config-page-0r9AZNNZ.js → providers-config-page-ZPvJWHFN.js} +1 -1
  26. package/ui-dist/assets/{react-BlXwvOLo.js → react-BXRf96P-.js} +1 -1
  27. package/ui-dist/assets/{refresh-cw-JFuyDj_P.js → refresh-cw-ChKuqgPR.js} +1 -1
  28. package/ui-dist/assets/remote-C2enAZbs.js +1 -0
  29. package/ui-dist/assets/rotate-cw-BGkZpcc7.js +1 -0
  30. package/ui-dist/assets/{runtime-config-page-BgeYpvMK.js → runtime-config-page-CGpPQD8K.js} +1 -1
  31. package/ui-dist/assets/{save-BL8P8CLX.js → save-BWGNAKV5.js} +1 -1
  32. package/ui-dist/assets/{search-bZL75Pgc.js → search-DFcT_9wJ.js} +1 -1
  33. package/ui-dist/assets/{search-config-page-CzNzLyd0.js → search-config-page-DBBzVAQZ.js} +1 -1
  34. package/ui-dist/assets/{secrets-config-page-C4k3ik0v.js → secrets-config-page-bnJ8sIB7.js} +1 -1
  35. package/ui-dist/assets/security-config-CfbXSpgX.js +1 -0
  36. package/ui-dist/assets/{select-rUZ8nIZu.js → select-BnNrv8si.js} +1 -1
  37. package/ui-dist/assets/{settings-2-BI4SCkxQ.js → settings-2-CFHrgKTX.js} +1 -1
  38. package/ui-dist/assets/skeleton-tfWhGuJT.js +1 -0
  39. package/ui-dist/assets/{tag-chip-BdI_yIOA.js → tag-chip-L5w4xfS7.js} +1 -1
  40. package/ui-dist/assets/x-BCSE3LCQ.js +1 -0
  41. package/ui-dist/index.html +18 -18
  42. package/ui-dist/assets/doc-browser-DahzJEWj.js +0 -1
  43. package/ui-dist/assets/loader-circle-DyXZU92l.js +0 -1
  44. package/ui-dist/assets/mcp-marketplace-page-B0dBE5CV.js +0 -1
  45. package/ui-dist/assets/plus-Dhb4KuMH.js +0 -1
  46. package/ui-dist/assets/remote-DQzE55WW.js +0 -1
  47. package/ui-dist/assets/rotate-cw-DjbbiIW_.js +0 -1
  48. package/ui-dist/assets/security-config-DmJw9QZA.js +0 -1
  49. package/ui-dist/assets/skeleton-CVmEPG43.js +0 -1
  50. package/ui-dist/assets/x-BcEayhV6.js +0 -1
@@ -4,16 +4,16 @@ import { createRequire } from "node:module";
4
4
  import { APP_NAME, APP_TAGLINE, getConfigPath, getDataDir, getRunPath, loadConfig, resolveConfigSecrets } from "@nextclaw/core";
5
5
  import { Command, InvalidArgumentError } from "commander";
6
6
  import { constants, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
7
- import { randomBytes } from "node:crypto";
7
+ import { createHash, randomBytes } from "node:crypto";
8
8
  import { execFile } from "node:child_process";
9
9
  import path, { join, resolve } from "node:path";
10
10
  import { tmpdir } from "node:os";
11
11
  import "@nextclaw/server";
12
12
  import { NextclawDistributionService, NextclawServiceRuntime, readLearningLoopRuntimeConfig } from "@nextclaw/service";
13
- import { access, mkdtemp, readFile, rm, stat } from "node:fs/promises";
13
+ import { AppHomeService, AppInstanceStorageService, AppPublishService, AppPublishValidationService } from "@nextclaw/app-runtime";
14
14
  import { McpServiceAppRuntimeService, buildServiceActionId, getServiceAppManifestPath, mergeServiceAppRuntimeActions, readServiceAppManifest } from "@nextclaw/kernel";
15
+ import { access, mkdtemp, readFile, rm, stat } from "node:fs/promises";
15
16
  import { promisify } from "node:util";
16
- import { AppPublishService, AppPublishValidationService } from "@nextclaw/app-runtime";
17
17
  var __commonJSMin = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
18
18
  var __require = /* @__PURE__ */ createRequire(import.meta.url);
19
19
  //#endregion
@@ -2020,7 +2020,7 @@ var require_websocket = /* @__PURE__ */ __commonJSMin(((exports, module) => {
2020
2020
  const http$1 = __require("http");
2021
2021
  const net = __require("net");
2022
2022
  const tls = __require("tls");
2023
- const { randomBytes: randomBytes$1, createHash: createHash$1 } = __require("crypto");
2023
+ const { randomBytes: randomBytes$1, createHash: createHash$2 } = __require("crypto");
2024
2024
  const { Duplex: Duplex$2, Readable } = __require("stream");
2025
2025
  const { URL: URL$1 } = __require("url");
2026
2026
  const PerMessageDeflate = require_permessage_deflate();
@@ -2672,7 +2672,7 @@ var require_websocket = /* @__PURE__ */ __commonJSMin(((exports, module) => {
2672
2672
  abortHandshake(websocket, socket, "Invalid Upgrade header");
2673
2673
  return;
2674
2674
  }
2675
- const digest = createHash$1("sha1").update(key + GUID).digest("base64");
2675
+ const digest = createHash$2("sha1").update(key + GUID).digest("base64");
2676
2676
  if (res.headers["sec-websocket-accept"] !== digest) {
2677
2677
  abortHandshake(websocket, socket, "Invalid Sec-WebSocket-Accept header");
2678
2678
  return;
@@ -3144,7 +3144,7 @@ var require_websocket_server = /* @__PURE__ */ __commonJSMin(((exports, module)
3144
3144
  const EventEmitter = __require("events");
3145
3145
  const http = __require("http");
3146
3146
  const { Duplex } = __require("stream");
3147
- const { createHash } = __require("crypto");
3147
+ const { createHash: createHash$1 } = __require("crypto");
3148
3148
  const extension = require_extension();
3149
3149
  const PerMessageDeflate = require_permessage_deflate();
3150
3150
  const subprotocol = require_subprotocol();
@@ -3403,7 +3403,7 @@ var require_websocket_server = /* @__PURE__ */ __commonJSMin(((exports, module)
3403
3403
  "HTTP/1.1 101 Switching Protocols",
3404
3404
  "Upgrade: websocket",
3405
3405
  "Connection: Upgrade",
3406
- `Sec-WebSocket-Accept: ${createHash("sha1").update(key + GUID).digest("base64")}`
3406
+ `Sec-WebSocket-Accept: ${createHash$1("sha1").update(key + GUID).digest("base64")}`
3407
3407
  ];
3408
3408
  const ws = new this.options.WebSocket(null, void 0, this.options);
3409
3409
  if (protocols.size) {
@@ -3633,6 +3633,7 @@ const registerHostServiceControls = ({ program, nextclaw }) => {
3633
3633
  //#endregion
3634
3634
  //#region src/cli/app/services/service-app-dev.service.ts
3635
3635
  var ServiceAppDevService = class {
3636
+ instanceStorageService = new AppInstanceStorageService();
3636
3637
  constructor(params = {}) {
3637
3638
  this.params = params;
3638
3639
  }
@@ -3643,14 +3644,14 @@ var ServiceAppDevService = class {
3643
3644
  if (!loaded) return this.buildDevReport(appPath, void 0, [], issues);
3644
3645
  if (this.hasErrors(issues)) return this.buildDevReport(appPath, this.toServiceAppRecord(appPath, loaded.manifest, this.idleRuntimeStatus), [], issues);
3645
3646
  const runtime = this.createRuntimeService();
3646
- const dataDirectory = await this.createDevDataDirectory();
3647
+ const storage = await this.createDevStorage(appPath, loaded.manifest.id);
3647
3648
  try {
3648
- const startRecord = this.toServiceAppRecord(appPath, loaded.manifest, runtime, dataDirectory);
3649
+ const startRecord = this.toServiceAppRecord(appPath, loaded.manifest, runtime, storage);
3649
3650
  const runtimeActions = await runtime.listActions({
3650
3651
  app: startRecord,
3651
3652
  manifest: loaded.manifest
3652
3653
  });
3653
- const record = this.toServiceAppRecord(appPath, loaded.manifest, runtime, dataDirectory);
3654
+ const record = this.toServiceAppRecord(appPath, loaded.manifest, runtime, storage);
3654
3655
  const actions = mergeServiceAppRuntimeActions({
3655
3656
  record,
3656
3657
  manifest: loaded.manifest,
@@ -3659,14 +3660,7 @@ var ServiceAppDevService = class {
3659
3660
  this.collectRuntimeIssues(record, actions, issues);
3660
3661
  return this.buildDevReport(appPath, record, actions, issues);
3661
3662
  } finally {
3662
- try {
3663
- await runtime.dispose();
3664
- } finally {
3665
- await rm(dataDirectory, {
3666
- recursive: true,
3667
- force: true
3668
- });
3669
- }
3663
+ await runtime.dispose();
3670
3664
  }
3671
3665
  };
3672
3666
  call = async (target, actionName, input) => {
@@ -3686,19 +3680,19 @@ var ServiceAppDevService = class {
3686
3680
  return this.buildCallReport(appPath, record, void 0, void 0, issues);
3687
3681
  }
3688
3682
  const runtime = this.createRuntimeService();
3689
- const dataDirectory = await this.createDevDataDirectory();
3683
+ const storage = await this.createDevStorage(appPath, loaded.manifest.id);
3690
3684
  try {
3691
- const record = this.toServiceAppRecord(appPath, loaded.manifest, runtime, dataDirectory);
3685
+ const record = this.toServiceAppRecord(appPath, loaded.manifest, runtime, storage);
3692
3686
  const result = await runtime.invokeAction({
3693
3687
  app: record,
3694
3688
  manifest: loaded.manifest,
3695
3689
  actionName: action,
3696
3690
  input
3697
3691
  });
3698
- const nextRecord = this.toServiceAppRecord(appPath, loaded.manifest, runtime, dataDirectory);
3692
+ const nextRecord = this.toServiceAppRecord(appPath, loaded.manifest, runtime, storage);
3699
3693
  return this.buildCallReport(appPath, nextRecord, buildServiceActionId(loaded.manifest.id, action), result, issues);
3700
3694
  } catch (error) {
3701
- const record = this.toServiceAppRecord(appPath, loaded.manifest, runtime, dataDirectory);
3695
+ const record = this.toServiceAppRecord(appPath, loaded.manifest, runtime, storage);
3702
3696
  issues.push({
3703
3697
  severity: "error",
3704
3698
  code: "service.runtime.callFailed",
@@ -3706,14 +3700,7 @@ var ServiceAppDevService = class {
3706
3700
  });
3707
3701
  return this.buildCallReport(appPath, record, buildServiceActionId(loaded.manifest.id, action), void 0, issues);
3708
3702
  } finally {
3709
- try {
3710
- await runtime.dispose();
3711
- } finally {
3712
- await rm(dataDirectory, {
3713
- recursive: true,
3714
- force: true
3715
- });
3716
- }
3703
+ await runtime.dispose();
3717
3704
  }
3718
3705
  };
3719
3706
  loadServiceApp = async (appPath, issues) => {
@@ -3745,8 +3732,16 @@ var ServiceAppDevService = class {
3745
3732
  return resolveConfigSecrets(loadConfig(configPath), { configPath });
3746
3733
  };
3747
3734
  idleRuntimeStatus = { getStatus: () => ({ status: "idle" }) };
3748
- createDevDataDirectory = async () => await mkdtemp(path.join(tmpdir(), "nextclaw-service-app-dev-data-"));
3749
- toServiceAppRecord = (dirPath, manifest, runtime, dataDirectory) => {
3735
+ createDevStorage = async (appPath, appId) => {
3736
+ const sourceId = createHash("sha256").update(appPath).digest("hex").slice(0, 16);
3737
+ const instanceDirectory = path.join(new AppHomeService().getAppHomeDirectory(), "dev-instances", appId, sourceId, "default");
3738
+ return (await this.instanceStorageService.materialize({
3739
+ appId,
3740
+ instanceId: "default",
3741
+ instanceDirectory
3742
+ })).storage;
3743
+ };
3744
+ toServiceAppRecord = (dirPath, manifest, runtime, storage) => {
3750
3745
  const runtimeStatus = runtime.getStatus(manifest.id);
3751
3746
  const record = {
3752
3747
  id: manifest.id,
@@ -3759,7 +3754,10 @@ var ServiceAppDevService = class {
3759
3754
  enabled: manifest.enabled,
3760
3755
  protocol: manifest.protocol,
3761
3756
  status: manifest.enabled ? runtimeStatus.status : "stopped",
3762
- dataDirectory
3757
+ dataDirectory: storage?.dataDirectory,
3758
+ instanceId: storage?.instanceId,
3759
+ storage,
3760
+ isolation: "full-user"
3763
3761
  };
3764
3762
  if (manifest.description) record.description = manifest.description;
3765
3763
  if (runtimeStatus.lastError) record.lastError = runtimeStatus.lastError;