@elementspanel/epanel-plugin-config 1.0.0 → 1.0.1

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.
@@ -109,7 +109,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
109
109
  return (mod && mod.__esModule) ? mod : { "default": mod };
110
110
  };
111
111
  Object.defineProperty(exports, "__esModule", ({ value: true }));
112
- exports.StorageSubsystem = exports.MCServerStatus = exports.InstanceStreamListener = exports.GlobalVariable = exports.normalizeDockerPlatform = exports.normalizeDockerOS = exports.normalizeDockerArchitecture = exports.removeTrail = exports.uninstallNpmPlugin = exports.npmPluginRoots = exports.listNpmPlugins = exports.installNpmPlugin = exports.currentProjectRoot = exports.currentPackageRoot = exports.sortPlugins = exports.resolvePluginEntry = exports.readPluginManifest = exports.createFrontendPluginMetadata = exports.discoverPluginsFromRoots = exports.discoverPlugins = exports.arrayUnique = exports.toText = exports.toNumber = exports.toBoolean = exports.supposeValue = exports.isEmpty = exports.configureEntityParams = exports.systemInfo = exports.QueryWrapper = exports.QueryMapWrapper = exports.MySqlSource = exports.LocalFileSource = exports.killProcess = exports.ProcessWrapper = void 0;
112
+ exports.StorageSubsystem = exports.MCServerStatus = exports.InstanceStreamListener = exports.GlobalVariable = exports.normalizeDockerPlatform = exports.normalizeDockerOS = exports.normalizeDockerArchitecture = exports.removeTrail = exports.uninstallNpmPlugin = exports.isEssentialNpmPlugin = exports.npmPluginOperationPending = exports.npmPluginRoots = exports.listNpmPlugins = exports.installNpmPlugin = exports.currentProjectRoot = exports.currentPackageRoot = exports.sortPlugins = exports.resolvePluginEntry = exports.readPluginManifest = exports.createFrontendPluginMetadata = exports.discoverPluginsFromRoots = exports.discoverPlugins = exports.arrayUnique = exports.toText = exports.toNumber = exports.toBoolean = exports.supposeValue = exports.isEmpty = exports.configureEntityParams = exports.systemInfo = exports.QueryWrapper = exports.QueryMapWrapper = exports.MySqlSource = exports.LocalFileSource = exports.killProcess = exports.ProcessWrapper = void 0;
113
113
  const global_variable_1 = __importDefault(__webpack_require__("../common/src/global_variable.ts"));
114
114
  exports.GlobalVariable = global_variable_1.default;
115
115
  const instance_stream_1 = __importDefault(__webpack_require__("../common/src/instance_stream.ts"));
@@ -141,6 +141,8 @@ __exportStar(__webpack_require__("../common/src/plugin_contract.ts"), exports);
141
141
  __exportStar(__webpack_require__("../common/src/plugin_overrides.ts"), exports);
142
142
  __exportStar(__webpack_require__("../common/src/plugin_lifecycle.ts"), exports);
143
143
  __exportStar(__webpack_require__("../common/src/plugin_revision.ts"), exports);
144
+ __exportStar(__webpack_require__("../common/src/plugin_modules.ts"), exports);
145
+ __exportStar(__webpack_require__("../common/src/plugin_watch.ts"), exports);
144
146
  __exportStar(__webpack_require__("../common/src/runtime_paths.ts"), exports);
145
147
  var plugin_manifest_1 = __webpack_require__("../common/src/plugin_manifest.ts");
146
148
  Object.defineProperty(exports, "discoverPlugins", ({ enumerable: true, get: function () { return plugin_manifest_1.discoverPlugins; } }));
@@ -155,6 +157,8 @@ Object.defineProperty(exports, "currentProjectRoot", ({ enumerable: true, get: f
155
157
  Object.defineProperty(exports, "installNpmPlugin", ({ enumerable: true, get: function () { return plugin_npm_1.installNpmPlugin; } }));
156
158
  Object.defineProperty(exports, "listNpmPlugins", ({ enumerable: true, get: function () { return plugin_npm_1.listNpmPlugins; } }));
157
159
  Object.defineProperty(exports, "npmPluginRoots", ({ enumerable: true, get: function () { return plugin_npm_1.npmPluginRoots; } }));
160
+ Object.defineProperty(exports, "npmPluginOperationPending", ({ enumerable: true, get: function () { return plugin_npm_1.npmPluginOperationPending; } }));
161
+ Object.defineProperty(exports, "isEssentialNpmPlugin", ({ enumerable: true, get: function () { return plugin_npm_1.isEssentialNpmPlugin; } }));
158
162
  Object.defineProperty(exports, "uninstallNpmPlugin", ({ enumerable: true, get: function () { return plugin_npm_1.uninstallNpmPlugin; } }));
159
163
  var string_utils_1 = __webpack_require__("../common/src/string_utils.ts");
160
164
  Object.defineProperty(exports, "removeTrail", ({ enumerable: true, get: function () { return string_utils_1.removeTrail; } }));
@@ -623,7 +627,45 @@ function createFrontendPluginMetadata(manifest, extras = {}) {
623
627
  };
624
628
  }
625
629
  const MANIFEST_FILES = ["plugin.json", "manifest.json", "package.json"];
626
- /** Reads the manifest of one plugin directory, or null if it has none. */
630
+ const ENTRY_FIELDS = ["backend", "frontend", "panel", "daemon", "main", "entry", "ui"];
631
+ function objectValue(value) {
632
+ return value && typeof value === "object" && !Array.isArray(value)
633
+ ? value
634
+ : {};
635
+ }
636
+ /**
637
+ * Source plugins keep package.json beside plugin.json. Published npm plugins
638
+ * keep it at the package root, with runtime metadata under elementspanel.<side>.
639
+ * Stop at the first package boundary so a host's metadata cannot reach a plugin.
640
+ */
641
+ function readPackageMetadata(directory, id) {
642
+ const pluginDirectory = node_path_1.default.resolve(directory);
643
+ let current = pluginDirectory;
644
+ while (true) {
645
+ const filename = node_path_1.default.join(current, "package.json");
646
+ if (node_fs_1.default.existsSync(filename)) {
647
+ const { elementspanel, ...metadata } = objectValue(JSON.parse(node_fs_1.default.readFileSync(filename, "utf8")));
648
+ const { id: packageId, panel, daemon, ...shared } = objectValue(elementspanel);
649
+ const definition = [panel, daemon]
650
+ .map(objectValue)
651
+ .find((side) => typeof side.directory === "string" &&
652
+ node_path_1.default.resolve(current, side.directory) === pluginDirectory);
653
+ if (current !== pluginDirectory && (packageId !== id || !definition))
654
+ return {};
655
+ const { directory: _directory, folder: _folder, ...sideMetadata } = definition !== null && definition !== void 0 ? definition : {};
656
+ const result = { ...metadata, ...shared, ...sideMetadata };
657
+ // npm's main/entry fields do not define a side's execution entry.
658
+ for (const field of ["dual", ...ENTRY_FIELDS])
659
+ delete result[field];
660
+ return result;
661
+ }
662
+ const parent = node_path_1.default.dirname(current);
663
+ if (parent === current)
664
+ return {};
665
+ current = parent;
666
+ }
667
+ }
668
+ /** Merges package metadata with a plugin's identity and entries. Legacy manifests still load. */
627
669
  function readPluginManifest(directory, onWarning, fallbackId = node_path_1.default.basename(directory)) {
628
670
  for (const file of MANIFEST_FILES) {
629
671
  const filePath = node_path_1.default.join(directory, file);
@@ -636,7 +678,18 @@ function readPluginManifest(directory, onWarning, fallbackId = node_path_1.defau
636
678
  const id = typeof value.id === "string" ? value.id : fallbackId;
637
679
  if (!id.trim())
638
680
  return null;
639
- return { ...value, id: id.trim() };
681
+ const manifest = {
682
+ ...value,
683
+ ...readPackageMetadata(directory, id.trim()),
684
+ id: id.trim()
685
+ };
686
+ // Identity and execution paths always belong to plugin.json. Package
687
+ // metadata wins for descriptions, priority, configuration and dependencies.
688
+ for (const field of ["version", "dual", ...ENTRY_FIELDS]) {
689
+ if (value[field] !== undefined)
690
+ manifest[field] = value[field];
691
+ }
692
+ return manifest;
640
693
  }
641
694
  catch (error) {
642
695
  onWarning === null || onWarning === void 0 ? void 0 : onWarning(`Failed to read plugin manifest: ${filePath}`, error);
@@ -738,6 +791,13 @@ function discoverPluginsFromRoots(roots, options) {
738
791
  discovered.push({
739
792
  ...plugin,
740
793
  manifest,
794
+ ...(root.packageRoot
795
+ ? {
796
+ packageRoot: root.packageRoot,
797
+ packageName: root.packageName,
798
+ npmSource: root.npmSource
799
+ }
800
+ : {}),
741
801
  ...(root.folder ? { folder: root.folder } : {})
742
802
  });
743
803
  }
@@ -751,6 +811,178 @@ function sortPlugins(plugins) {
751
811
  }
752
812
 
753
813
 
814
+ /***/ },
815
+
816
+ /***/ "../common/src/plugin_modules.ts"
817
+ (__unused_webpack_module, exports, __webpack_require__) {
818
+
819
+
820
+ var __importDefault = (this && this.__importDefault) || function (mod) {
821
+ return (mod && mod.__esModule) ? mod : { "default": mod };
822
+ };
823
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
824
+ exports.pluginBackendRevision = pluginBackendRevision;
825
+ exports.forgetPluginModules = forgetPluginModules;
826
+ exports.loadPluginModule = loadPluginModule;
827
+ const node_fs_1 = __importDefault(__webpack_require__("node:fs"));
828
+ const node_path_1 = __importDefault(__webpack_require__("node:path"));
829
+ const node_url_1 = __webpack_require__("node:url");
830
+ const node_crypto_1 = __webpack_require__("node:crypto");
831
+ const node_module_1 = __webpack_require__("node:module");
832
+ const plugin_revision_1 = __webpack_require__("../common/src/plugin_revision.ts");
833
+ const REVISION = "epanelPluginRevision";
834
+ const graphs = new Map();
835
+ const previousRoots = new Map();
836
+ let hooksInstalled = false;
837
+ const sharedModules = new Set([
838
+ "cordis",
839
+ "@cordisjs/core",
840
+ "@cordisjs/logger",
841
+ "@cordisjs/timer",
842
+ "@cordisjs/schema",
843
+ "cosmokit",
844
+ "schemastery",
845
+ "reggol"
846
+ ]);
847
+ function dependencyRoots(directory) {
848
+ const visited = new Set([directory]);
849
+ const walk = (root) => {
850
+ const filename = node_path_1.default.join(root, "package.json");
851
+ if (!node_fs_1.default.existsSync(filename))
852
+ return;
853
+ const metadata = JSON.parse(node_fs_1.default.readFileSync(filename, "utf8"));
854
+ const localRequire = (0, node_module_1.createRequire)(filename);
855
+ for (const name of Object.keys({
856
+ ...metadata.dependencies,
857
+ ...metadata.optionalDependencies
858
+ })) {
859
+ if (sharedModules.has(name))
860
+ continue;
861
+ const target = (localRequire.resolve.paths(name) || [])
862
+ .map((directory) => node_path_1.default.join(directory, name, "package.json"))
863
+ .find((candidate) => node_fs_1.default.existsSync(candidate));
864
+ if (!target)
865
+ continue;
866
+ const dependency = node_fs_1.default.realpathSync(node_path_1.default.dirname(target));
867
+ if (visited.has(dependency))
868
+ continue;
869
+ visited.add(dependency);
870
+ walk(dependency);
871
+ }
872
+ };
873
+ walk(directory);
874
+ visited.delete(directory);
875
+ return [...visited];
876
+ }
877
+ /** Include transitive dependency versions so npm updates replace the affected graph. */
878
+ function pluginBackendRevision(entry, directory) {
879
+ const hash = (0, node_crypto_1.createHash)("sha256").update((0, plugin_revision_1.pluginDirectoryRevision)(node_path_1.default.dirname(entry)));
880
+ for (const root of [directory, ...dependencyRoots(directory)]) {
881
+ const filename = node_path_1.default.join(root, "package.json");
882
+ if (node_fs_1.default.existsSync(filename))
883
+ hash.update(root).update(node_fs_1.default.readFileSync(filename));
884
+ }
885
+ return hash.digest("hex").slice(0, 24);
886
+ }
887
+ function within(root, filename) {
888
+ const relative = node_path_1.default.relative(root, filename);
889
+ return (relative === "" ||
890
+ (!relative.startsWith(`..${node_path_1.default.sep}`) && relative !== ".." && !node_path_1.default.isAbsolute(relative)));
891
+ }
892
+ /** Clear the plugin's complete CJS graph, keeping shared host modules intact. */
893
+ function forgetPluginModules(directory) {
894
+ const runtimeRequire = eval("require");
895
+ const owned = [directory, ...(previousRoots.get(directory) || []), ...dependencyRoots(directory)];
896
+ previousRoots.delete(directory);
897
+ const belongs = (filename) => {
898
+ const parts = filename.split(`${node_path_1.default.sep}node_modules${node_path_1.default.sep}`);
899
+ if (parts.slice(1).some((part) => {
900
+ const name = part.startsWith("@")
901
+ ? part.split(node_path_1.default.sep).slice(0, 2).join("/")
902
+ : part.split(node_path_1.default.sep)[0];
903
+ return sharedModules.has(name);
904
+ }))
905
+ return false;
906
+ return owned.some((root) => within(root, filename));
907
+ };
908
+ for (const filename of Object.keys(runtimeRequire.cache)) {
909
+ if (belongs(filename))
910
+ delete runtimeRequire.cache[filename];
911
+ }
912
+ for (const mod of Object.values(runtimeRequire.cache)) {
913
+ if (mod)
914
+ mod.children = mod.children.filter((child) => !belongs(child.filename));
915
+ }
916
+ // npm can move a dependency or change its main entry. Node's CJS resolver
917
+ // retains those paths separately from require.cache.
918
+ const pathCache = runtimeRequire("node:module")._pathCache;
919
+ for (const [key, filename] of Object.entries(pathCache)) {
920
+ if (belongs(filename) || owned.some((root) => key.includes(root)))
921
+ delete pathCache[key];
922
+ }
923
+ }
924
+ function isEsm(entry) {
925
+ if (entry.endsWith(".mjs"))
926
+ return true;
927
+ if (entry.endsWith(".cjs"))
928
+ return false;
929
+ let directory = node_path_1.default.dirname(entry);
930
+ while (true) {
931
+ const filename = node_path_1.default.join(directory, "package.json");
932
+ if (node_fs_1.default.existsSync(filename))
933
+ return JSON.parse(node_fs_1.default.readFileSync(filename, "utf8")).type === "module";
934
+ const parent = node_path_1.default.dirname(directory);
935
+ if (parent === directory)
936
+ return false;
937
+ directory = parent;
938
+ }
939
+ }
940
+ /** Give an ESM entry and its local imports the same immutable revision URL. */
941
+ async function loadPluginModule(entry, directory, revision) {
942
+ const runtimeRequire = eval("require");
943
+ previousRoots.set(directory, dependencyRoots(directory));
944
+ if (!isEsm(entry)) {
945
+ try {
946
+ return runtimeRequire(entry);
947
+ }
948
+ catch (error) {
949
+ if ((error === null || error === void 0 ? void 0 : error.code) !== "ERR_REQUIRE_ESM")
950
+ throw error;
951
+ }
952
+ }
953
+ graphs.set(revision, [directory, ...dependencyRoots(directory)]);
954
+ if (!hooksInstalled) {
955
+ const { registerHooks } = runtimeRequire("node:module");
956
+ if (typeof registerHooks !== "function")
957
+ throw new Error("ESM plugin updates require Node.js 22.15 or newer.");
958
+ registerHooks({
959
+ resolve(specifier, context, nextResolve) {
960
+ var _a;
961
+ const resolved = nextResolve(specifier, context);
962
+ if (!((_a = context.parentURL) === null || _a === void 0 ? void 0 : _a.startsWith("file:")) || !resolved.url.startsWith("file:"))
963
+ return resolved;
964
+ const parent = new URL(context.parentURL);
965
+ const parentRevision = parent.searchParams.get(REVISION);
966
+ if (!parentRevision)
967
+ return resolved;
968
+ const roots = graphs.get(parentRevision);
969
+ if (!(roots === null || roots === void 0 ? void 0 : roots.some((root) => within(root, (0, node_url_1.fileURLToPath)(parent)))) ||
970
+ !roots.some((root) => within(root, (0, node_url_1.fileURLToPath)(resolved.url))))
971
+ return resolved;
972
+ const url = new URL(resolved.url);
973
+ url.searchParams.set(REVISION, parentRevision);
974
+ return { ...resolved, url: url.href };
975
+ }
976
+ });
977
+ hooksInstalled = true;
978
+ }
979
+ const url = (0, node_url_1.pathToFileURL)(entry);
980
+ url.searchParams.set(REVISION, revision);
981
+ const dynamicImport = new Function("specifier", "return import(specifier)");
982
+ return dynamicImport(url.href);
983
+ }
984
+
985
+
754
986
  /***/ },
755
987
 
756
988
  /***/ "../common/src/plugin_npm.ts"
@@ -760,20 +992,25 @@ function sortPlugins(plugins) {
760
992
  var __importDefault = (this && this.__importDefault) || function (mod) {
761
993
  return (mod && mod.__esModule) ? mod : { "default": mod };
762
994
  };
995
+ var _a;
763
996
  Object.defineProperty(exports, "__esModule", ({ value: true }));
764
997
  exports.currentPackageRoot = currentPackageRoot;
765
998
  exports.currentProjectRoot = currentProjectRoot;
766
999
  exports.npmPluginRoots = npmPluginRoots;
767
1000
  exports.listNpmPlugins = listNpmPlugins;
1001
+ exports.npmPluginOperationPending = npmPluginOperationPending;
1002
+ exports.isEssentialNpmPlugin = isEssentialNpmPlugin;
768
1003
  exports.installNpmPlugin = installNpmPlugin;
769
1004
  exports.uninstallNpmPlugin = uninstallNpmPlugin;
770
1005
  const child_process_1 = __webpack_require__("child_process");
771
1006
  const fs_extra_1 = __importDefault(__webpack_require__("fs-extra"));
772
1007
  const path_1 = __importDefault(__webpack_require__("path"));
773
1008
  const module_1 = __webpack_require__("module");
1009
+ const plugin_manifest_1 = __webpack_require__("../common/src/plugin_manifest.ts");
1010
+ const plugin_contract_1 = __webpack_require__("../common/src/plugin_contract.ts");
774
1011
  const PLUGIN_ID = /^[a-z][a-z0-9_-]{1,63}$/;
775
1012
  const PACKAGE_NAME = /^(?:@[a-z0-9_.-]+\/)?epanel-plugin-[a-z0-9_.-]+$/;
776
- const VERSION = /^[0-9][^\s/]{0,63}$/;
1013
+ const VERSION = /^[a-zA-Z0-9][a-zA-Z0-9._+-]{0,63}$/;
777
1014
  function readJson(filename) {
778
1015
  try {
779
1016
  const parsed = JSON.parse(fs_extra_1.default.readFileSync(filename, "utf8"));
@@ -843,8 +1080,20 @@ function pluginRecord(pluginId, name, source, packageRoot, directory, folder, ve
843
1080
  return { pluginId, name, version, sides: [], directory, folder, packageRoot, source };
844
1081
  }
845
1082
  function readPackageEntry(packageRoot, name) {
846
- const hostRequire = (0, module_1.createRequire)(path_1.default.join(packageRoot, "package.json"));
847
- const manifestPath = hostRequire.resolve(`${name}/package.json`);
1083
+ // Read package boundaries directly: Node caches require.resolve() paths even
1084
+ // after npm moves an installation between nested and hoisted node_modules.
1085
+ let manifestPath;
1086
+ for (const root of [packageRoot, currentProjectRoot(packageRoot)]) {
1087
+ const localRequire = (0, module_1.createRequire)(path_1.default.join(root, "package.json"));
1088
+ manifestPath = (localRequire.resolve.paths(name) || [])
1089
+ .map((directory) => path_1.default.join(directory, name, "package.json"))
1090
+ .find((filename) => fs_extra_1.default.existsSync(filename));
1091
+ if (manifestPath)
1092
+ break;
1093
+ }
1094
+ if (!manifestPath)
1095
+ throw new Error(`Missing npm plugin package: ${name}.`);
1096
+ manifestPath = fs_extra_1.default.realpathSync(manifestPath);
848
1097
  const metadata = readJson(manifestPath);
849
1098
  if (!metadata)
850
1099
  throw new Error(`Missing package metadata for ${name}.`);
@@ -858,7 +1107,10 @@ function sideDirectory(packageRoot, metadata, side) {
858
1107
  return undefined;
859
1108
  const target = path_1.default.resolve(packageRoot, directory);
860
1109
  const relative = path_1.default.relative(packageRoot, target);
861
- if (relative === "" || relative.startsWith(`..${path_1.default.sep}`) || path_1.default.isAbsolute(relative))
1110
+ if (relative === "" ||
1111
+ relative === ".." ||
1112
+ relative.startsWith(`..${path_1.default.sep}`) ||
1113
+ path_1.default.isAbsolute(relative))
862
1114
  return undefined;
863
1115
  return target;
864
1116
  }
@@ -876,7 +1128,7 @@ function recordFromPackage(pluginId, name, source, packageRoot, metadata, side)
876
1128
  return undefined;
877
1129
  const directory = sideDirectory(packageRoot, metadata, target);
878
1130
  const folder = stringValue((_a = objectValue(elements[target])) === null || _a === void 0 ? void 0 : _a.folder);
879
- if (!directory || !folder)
1131
+ if (!directory || !PLUGIN_ID.test(folder))
880
1132
  return undefined;
881
1133
  return {
882
1134
  ...pluginRecord(pluginId, name, source, packageRoot, directory, folder, version),
@@ -892,14 +1144,29 @@ function recordFromPackage(pluginId, name, source, packageRoot, metadata, side)
892
1144
  * is what lets a two-sided project share one dependency list between sides.
893
1145
  */
894
1146
  function listNpmPlugins(side, options = {}) {
895
- var _a;
1147
+ var _a, _b;
896
1148
  const { packageRoot, projectRoot } = npmPluginRoots(options);
897
1149
  const host = readJson(path_1.default.join(packageRoot, "package.json"));
898
1150
  if (!host)
899
1151
  throw new Error(`Missing runtime package metadata: ${packageRoot}`);
900
- const project = path_1.default.resolve(projectRoot) === path_1.default.resolve(packageRoot) ? null : readProjectManifest(projectRoot);
1152
+ const project = path_1.default.resolve(projectRoot) === path_1.default.resolve(packageRoot)
1153
+ ? null
1154
+ : readProjectManifest(projectRoot);
901
1155
  const hostMappings = mappingsOf(host);
902
- const projectMappings = mappingsOf(project);
1156
+ const projectMappings = { ...mappingsOf(project) };
1157
+ for (const name of Object.keys(dependenciesOf(project))) {
1158
+ if (!PACKAGE_NAME.test(name) || Object.values(projectMappings).includes(name))
1159
+ continue;
1160
+ try {
1161
+ const entry = readPackageEntry(projectRoot, name);
1162
+ const id = stringValue((_a = objectValue(entry.metadata.elementspanel)) === null || _a === void 0 ? void 0 : _a.id);
1163
+ if (PLUGIN_ID.test(id) && projectMappings[id] === undefined)
1164
+ projectMappings[id] = name;
1165
+ }
1166
+ catch (_c) {
1167
+ /* npm may still be writing the package. */
1168
+ }
1169
+ }
903
1170
  const mappings = new Map();
904
1171
  for (const [pluginId, name] of Object.entries(projectMappings)) {
905
1172
  if (!PLUGIN_ID.test(pluginId) || typeof name !== "string" || !PACKAGE_NAME.test(name))
@@ -909,6 +1176,8 @@ function listNpmPlugins(side, options = {}) {
909
1176
  for (const [pluginId, name] of Object.entries(hostMappings)) {
910
1177
  if (!PLUGIN_ID.test(pluginId) || typeof name !== "string" || !PACKAGE_NAME.test(name))
911
1178
  continue;
1179
+ if (dependenciesOf(host)[name] === undefined)
1180
+ continue;
912
1181
  mappings.set(pluginId, { name, source: "bundled" });
913
1182
  }
914
1183
  const hostDependencies = dependenciesOf(host);
@@ -916,7 +1185,7 @@ function listNpmPlugins(side, options = {}) {
916
1185
  const folders = new Set();
917
1186
  const records = [];
918
1187
  for (const [pluginId, mapping] of mappings) {
919
- const declared = (_a = hostDependencies[mapping.name]) !== null && _a !== void 0 ? _a : projectDependencies[mapping.name];
1188
+ const declared = (_b = hostDependencies[mapping.name]) !== null && _b !== void 0 ? _b : projectDependencies[mapping.name];
920
1189
  if (declared === undefined) {
921
1190
  if (options.skipInvalid)
922
1191
  continue;
@@ -924,7 +1193,7 @@ function listNpmPlugins(side, options = {}) {
924
1193
  }
925
1194
  let entry;
926
1195
  try {
927
- entry = readPackageEntry(packageRoot, mapping.name);
1196
+ entry = readPackageEntry(mapping.source === "project" ? projectRoot : packageRoot, mapping.name);
928
1197
  }
929
1198
  catch (error) {
930
1199
  if (options.skipInvalid)
@@ -957,7 +1226,12 @@ function runNpm(args, cwd) {
957
1226
  : process.platform === "win32"
958
1227
  ? {
959
1228
  command: process.env.ComSpec || "cmd.exe",
960
- args: ["/d", "/s", "/c", `npm ${args.map((item) => `"${item.replace(/"/g, '""')}"`).join(" ")}`],
1229
+ args: [
1230
+ "/d",
1231
+ "/s",
1232
+ "/c",
1233
+ `npm ${args.map((item) => `"${item.replace(/"/g, '""')}"`).join(" ")}`
1234
+ ],
961
1235
  shell: false
962
1236
  }
963
1237
  : { command: "npm", args, shell: false };
@@ -976,10 +1250,10 @@ function runNpm(args, cwd) {
976
1250
  };
977
1251
  (_a = child.stdout) === null || _a === void 0 ? void 0 : _a.on("data", append);
978
1252
  (_b = child.stderr) === null || _b === void 0 ? void 0 : _b.on("data", append);
1253
+ const action = args.find((argument) => argument === "install" || argument === "uninstall") || "operation";
979
1254
  const timer = setTimeout(() => {
980
- var _a;
981
1255
  child.kill("SIGKILL");
982
- reject(new Error(`npm ${(_a = args[0]) !== null && _a !== void 0 ? _a : ""} timed out.`));
1256
+ reject(new Error(`npm ${action} timed out.`));
983
1257
  }, 10 * 60 * 1000);
984
1258
  (_c = timer.unref) === null || _c === void 0 ? void 0 : _c.call(timer);
985
1259
  child.once("error", (error) => {
@@ -987,20 +1261,74 @@ function runNpm(args, cwd) {
987
1261
  reject(error);
988
1262
  });
989
1263
  child.once("close", (code) => {
990
- var _a;
991
1264
  clearTimeout(timer);
992
1265
  if (code === 0)
993
1266
  return resolve(output);
994
- reject(new Error(`npm ${(_a = args[0]) !== null && _a !== void 0 ? _a : ""} failed (${code}): ${output.trim()}`));
1267
+ reject(new Error(`npm ${action} failed (${code}): ${output.trim()}`));
995
1268
  });
996
1269
  });
997
1270
  }
998
- const operations = new Map();
1271
+ const operationsKey = Symbol.for("elementspanel.npm.operations");
1272
+ const shared = globalThis;
1273
+ const operations = ((_a = shared[operationsKey]) !== null && _a !== void 0 ? _a : (shared[operationsKey] = new Map()));
1274
+ const LOCK_NAME = ".elementspanel-npm.lock";
1275
+ async function acquireProjectLock(projectRoot) {
1276
+ var _a, _b;
1277
+ await fs_extra_1.default.ensureDir(projectRoot);
1278
+ const directory = path_1.default.join(projectRoot, LOCK_NAME);
1279
+ const deadline = Date.now() + 11 * 60 * 1000;
1280
+ while (true) {
1281
+ try {
1282
+ await fs_extra_1.default.mkdir(directory);
1283
+ await fs_extra_1.default.writeJson(path_1.default.join(directory, "owner.json"), { pid: process.pid });
1284
+ return () => fs_extra_1.default.remove(directory);
1285
+ }
1286
+ catch (error) {
1287
+ if (error.code !== "EEXIST")
1288
+ throw error;
1289
+ try {
1290
+ const owner = await fs_extra_1.default.readJson(path_1.default.join(directory, "owner.json"));
1291
+ try {
1292
+ process.kill(owner.pid, 0);
1293
+ }
1294
+ catch (failure) {
1295
+ if (failure.code === "ESRCH") {
1296
+ await fs_extra_1.default.remove(directory);
1297
+ continue;
1298
+ }
1299
+ }
1300
+ }
1301
+ catch (_c) {
1302
+ if (Date.now() - ((_b = (_a = (await fs_extra_1.default.stat(directory).catch(() => null))) === null || _a === void 0 ? void 0 : _a.mtimeMs) !== null && _b !== void 0 ? _b : Date.now()) >
1303
+ 60000) {
1304
+ await fs_extra_1.default.remove(directory);
1305
+ continue;
1306
+ }
1307
+ }
1308
+ if (Date.now() > deadline)
1309
+ throw new Error("Another npm plugin operation is still running.");
1310
+ await new Promise((resolve) => setTimeout(resolve, 200));
1311
+ }
1312
+ }
1313
+ }
1314
+ function npmPluginOperationPending() {
1315
+ const { packageRoot, projectRoot } = npmPluginRoots();
1316
+ return (operations.size > 0 ||
1317
+ [packageRoot, projectRoot].some((root) => fs_extra_1.default.existsSync(path_1.default.join(root, LOCK_NAME))));
1318
+ }
999
1319
  function withProjectLock(projectRoot, operation) {
1000
1320
  var _a;
1001
1321
  const key = process.platform === "win32" ? projectRoot.toLowerCase() : projectRoot;
1002
1322
  const previous = (_a = operations.get(key)) !== null && _a !== void 0 ? _a : Promise.resolve();
1003
- const result = previous.then(operation);
1323
+ const result = previous.then(async () => {
1324
+ const release = await acquireProjectLock(projectRoot);
1325
+ try {
1326
+ return await operation();
1327
+ }
1328
+ finally {
1329
+ await release();
1330
+ }
1331
+ });
1004
1332
  const settled = result.then(() => { }, () => { });
1005
1333
  operations.set(key, settled);
1006
1334
  return result.finally(() => {
@@ -1008,85 +1336,174 @@ function withProjectLock(projectRoot, operation) {
1008
1336
  operations.delete(key);
1009
1337
  });
1010
1338
  }
1011
- /**
1012
- * Installs (or updates) one npm plugin as a project dependency.
1013
- *
1014
- * The version is pinned with `--save-exact`: the panel performs updates, so a
1015
- * later bare `npm install` must not silently move the plugin to another release.
1016
- */
1339
+ /** Core services keep the connection and management interface available. */
1340
+ function isEssentialNpmPlugin(pluginId) {
1341
+ return ["i18n", "storage", "runtime", "server", "console", "config"].includes(pluginId);
1342
+ }
1343
+ /** npm changes dependencies and lockfiles; only append our plugin mapping afterwards. */
1017
1344
  async function installNpmPlugin(options) {
1018
- const { name, pluginId, version, side } = options;
1019
- if (!PLUGIN_ID.test(pluginId))
1020
- throw new Error(`Invalid plugin id: ${pluginId}`);
1345
+ const { name, side } = options;
1346
+ const version = options.version || "latest";
1021
1347
  if (!PACKAGE_NAME.test(name))
1022
1348
  throw new Error(`Invalid npm plugin package: ${name}`);
1349
+ if (options.pluginId && !PLUGIN_ID.test(options.pluginId))
1350
+ throw new Error(`Invalid plugin id: ${options.pluginId}`);
1023
1351
  if (!VERSION.test(version))
1024
1352
  throw new Error(`Invalid plugin version: ${version}`);
1025
1353
  const { packageRoot, projectRoot } = npmPluginRoots(options);
1026
1354
  return withProjectLock(projectRoot, async () => {
1027
- var _a;
1355
+ var _a, _b;
1028
1356
  const host = readJson(path_1.default.join(packageRoot, "package.json"));
1029
1357
  if (!host)
1030
1358
  throw new Error(`Missing runtime package metadata: ${packageRoot}`);
1031
- if (mappingsOf(host)[pluginId] !== undefined)
1032
- throw new Error(`BUNDLED:${pluginId}`);
1033
- const existing = mappingsOf(readProjectManifest(projectRoot))[pluginId];
1034
- if (existing !== undefined && existing !== name)
1035
- throw new Error(`Plugin id ${pluginId} is already installed as ${String(existing)}.`);
1036
- await fs_extra_1.default.ensureDir(projectRoot);
1037
- await runNpm(["install", `${name}@${version}`, "--save", "--save-exact", "--no-fund", "--no-audit", "--ignore-scripts"], projectRoot);
1038
- let entry;
1359
+ const hostId = (_a = Object.entries(mappingsOf(host)).find(([, value]) => value === name && dependenciesOf(host)[name] !== undefined)) === null || _a === void 0 ? void 0 : _a[0];
1360
+ const targetRoot = hostId ? packageRoot : projectRoot;
1361
+ if (hostId && isEssentialNpmPlugin(hostId))
1362
+ throw new Error(`The essential plugin "${hostId}" cannot be replaced while running.`);
1363
+ if (options.pluginId &&
1364
+ mappingsOf(host)[options.pluginId] &&
1365
+ dependenciesOf(host)[String(mappingsOf(host)[options.pluginId])] !== undefined &&
1366
+ mappingsOf(host)[options.pluginId] !== name)
1367
+ throw new Error(`BUNDLED:${options.pluginId}`);
1368
+ const original = readProjectManifest(targetRoot);
1369
+ const previous = dependenciesOf(original)[name];
1370
+ let previousVersion = previous;
1371
+ if (previous) {
1372
+ try {
1373
+ previousVersion = readPackageEntry(targetRoot, name).metadata.version || previous;
1374
+ }
1375
+ catch (_c) {
1376
+ /* Keep the declared spec if the previous package is incomplete. */
1377
+ }
1378
+ }
1379
+ const backups = new Map();
1380
+ for (const filename of ["package.json", "package-lock.json", "npm-shrinkwrap.json"]) {
1381
+ const target = path_1.default.join(targetRoot, filename);
1382
+ backups.set(target, fs_extra_1.default.existsSync(target) ? fs_extra_1.default.readFileSync(target) : null);
1383
+ }
1039
1384
  try {
1040
- entry = readPackageEntry(packageRoot, name);
1385
+ await runNpm([
1386
+ "--prefix",
1387
+ targetRoot,
1388
+ "install",
1389
+ `${name}@${version}`,
1390
+ "--save",
1391
+ "--save-exact",
1392
+ "--no-fund",
1393
+ "--no-audit",
1394
+ "--ignore-scripts"
1395
+ ], targetRoot);
1396
+ const entry = readPackageEntry(targetRoot, name);
1397
+ const pluginId = options.pluginId || stringValue((_b = objectValue(entry.metadata.elementspanel)) === null || _b === void 0 ? void 0 : _b.id);
1398
+ if (!PLUGIN_ID.test(pluginId))
1399
+ throw new Error(`Invalid plugin id in ${name}.`);
1400
+ if (mappingsOf(host)[pluginId] &&
1401
+ dependenciesOf(host)[String(mappingsOf(host)[pluginId])] !== undefined &&
1402
+ mappingsOf(host)[pluginId] !== name)
1403
+ throw new Error(`Plugin id ${pluginId} belongs to a bundled dependency.`);
1404
+ if (hostId && pluginId !== hostId)
1405
+ throw new Error(`The package ${name} changed its plugin id from ${hostId} to ${pluginId}.`);
1406
+ const mapped = mappingsOf(readProjectManifest(targetRoot))[pluginId];
1407
+ if (mapped !== undefined && mapped !== name)
1408
+ throw new Error(`Plugin id ${pluginId} is already installed as ${String(mapped)}.`);
1409
+ const record = recordFromPackage(pluginId, name, hostId ? "bundled" : "project", entry.root, entry.metadata, side);
1410
+ if (!record)
1411
+ throw new Error(`The package ${name} does not provide a ${side} plugin named ${pluginId}.`);
1412
+ if (/^[0-9]/.test(version) && record.version !== version)
1413
+ throw new Error(`The installed package ${name} is ${record.version}, expected ${version}.`);
1414
+ if (!process.env.EPANEL_PACKAGE_ROOT &&
1415
+ (0, plugin_manifest_1.discoverPlugins)(path_1.default.join(packageRoot, "plugins"), {
1416
+ entryFields: [],
1417
+ includeDisabled: true
1418
+ }).some((plugin) => plugin.manifest.id === pluginId))
1419
+ throw new Error(`Source plugin ${pluginId} cannot be replaced with an npm dependency.`);
1420
+ const manifest = (0, plugin_manifest_1.readPluginManifest)(record.directory);
1421
+ if (!manifest || manifest.id !== pluginId || manifest.version !== record.version)
1422
+ throw new Error(`The plugin manifest in ${name} does not match its package.`);
1423
+ (0, plugin_contract_1.validatePluginCompatibility)(manifest.elements);
1424
+ for (const field of ["backend", "frontend", "panel", "daemon", "main", "entry", "ui"]) {
1425
+ if (typeof manifest[field] === "string" &&
1426
+ !(0, plugin_manifest_1.resolvePluginEntry)(record.directory, manifest, { entryFields: [field] }))
1427
+ throw new Error(`Invalid ${field} entry in ${name}.`);
1428
+ }
1429
+ const others = listNpmPlugins(side, { packageRoot, projectRoot, skipInvalid: true });
1430
+ if (others.some((plugin) => plugin.pluginId === pluginId && plugin.name !== name))
1431
+ throw new Error(`Plugin id ${pluginId} is already provided by another dependency.`);
1432
+ const collision = others.find((plugin) => plugin.pluginId !== pluginId && plugin.folder === record.folder);
1433
+ if (collision)
1434
+ throw new Error(`Plugin asset directory ${record.folder} is already used by ${collision.name}.`);
1435
+ const updated = readProjectManifest(targetRoot);
1436
+ updated.dependencies = { ...dependenciesOf(updated), [name]: record.version };
1437
+ updated.elementspanel = {
1438
+ ...objectValue(updated.elementspanel),
1439
+ plugins: { ...mappingsOf(updated), [pluginId]: name }
1440
+ };
1441
+ writeProjectManifest(targetRoot, updated);
1442
+ return record;
1041
1443
  }
1042
1444
  catch (error) {
1043
- await runNpm(["uninstall", name, "--no-fund", "--no-audit", "--ignore-scripts"], projectRoot).catch(() => { });
1445
+ try {
1446
+ await runNpm(previous
1447
+ ? [
1448
+ "--prefix",
1449
+ targetRoot,
1450
+ "install",
1451
+ `${name}@${String(previousVersion)}`,
1452
+ "--save",
1453
+ "--no-fund",
1454
+ "--no-audit",
1455
+ "--ignore-scripts"
1456
+ ]
1457
+ : [
1458
+ "--prefix",
1459
+ targetRoot,
1460
+ "uninstall",
1461
+ name,
1462
+ "--no-fund",
1463
+ "--no-audit",
1464
+ "--ignore-scripts"
1465
+ ], targetRoot);
1466
+ }
1467
+ catch (rollback) {
1468
+ throw new Error(`${String(error)}; npm rollback failed: ${String(rollback)}`);
1469
+ }
1470
+ finally {
1471
+ for (const [filename, content] of backups) {
1472
+ if (content === null)
1473
+ await fs_extra_1.default.remove(filename);
1474
+ else
1475
+ await fs_extra_1.default.writeFile(filename, content);
1476
+ }
1477
+ }
1044
1478
  throw error;
1045
1479
  }
1046
- const record = recordFromPackage(pluginId, name, "project", entry.root, entry.metadata, side);
1047
- if (!record) {
1048
- await runNpm(["uninstall", name, "--no-fund", "--no-audit", "--ignore-scripts"], projectRoot).catch(() => { });
1049
- throw new Error(`The package ${name} does not provide a ${side} plugin named ${pluginId}.`);
1050
- }
1051
- if (record.version !== version) {
1052
- await runNpm(["uninstall", name, "--no-fund", "--no-audit", "--ignore-scripts"], projectRoot).catch(() => { });
1053
- throw new Error(`The installed package ${name} is ${record.version}, expected ${version}.`);
1054
- }
1055
- const manifest = readProjectManifest(projectRoot);
1056
- const dependencies = { ...dependenciesOf(manifest), [name]: version };
1057
- const elementspanel = { ...((_a = objectValue(manifest.elementspanel)) !== null && _a !== void 0 ? _a : {}) };
1058
- const plugins = { ...mappingsOf(manifest), [pluginId]: name };
1059
- manifest.dependencies = dependencies;
1060
- manifest.elementspanel = { ...elementspanel, plugins };
1061
- writeProjectManifest(projectRoot, manifest);
1062
- return record;
1063
1480
  });
1064
1481
  }
1065
- /** Removes one project-installed npm plugin. Built-in packages are left alone. */
1482
+ /** Remove the dependency from the manifest that owns it, preserving user configuration. */
1066
1483
  async function uninstallNpmPlugin(pluginId, options = {}) {
1067
1484
  if (!PLUGIN_ID.test(pluginId))
1068
1485
  throw new Error(`Invalid plugin id: ${pluginId}`);
1486
+ if (isEssentialNpmPlugin(pluginId))
1487
+ throw new Error(`The essential plugin "${pluginId}" cannot be uninstalled.`);
1069
1488
  const { packageRoot, projectRoot } = npmPluginRoots(options);
1070
1489
  return withProjectLock(projectRoot, async () => {
1071
- var _a;
1490
+ var _a, _b;
1072
1491
  const host = readJson(path_1.default.join(packageRoot, "package.json"));
1073
- if (host && mappingsOf(host)[pluginId] !== undefined)
1074
- throw new Error(`BUNDLED:${pluginId}`);
1075
- const manifest = readProjectManifest(projectRoot);
1076
- const name = mappingsOf(manifest)[pluginId];
1492
+ const bundledName = mappingsOf(host)[pluginId];
1493
+ const targetRoot = typeof bundledName === "string" && dependenciesOf(host)[bundledName] !== undefined
1494
+ ? packageRoot
1495
+ : projectRoot;
1496
+ const manifest = readProjectManifest(targetRoot);
1497
+ const name = (_a = mappingsOf(manifest)[pluginId]) !== null && _a !== void 0 ? _a : (_b = listNpmPlugins(undefined, { packageRoot, projectRoot, skipInvalid: true }).find((item) => item.pluginId === pluginId)) === null || _b === void 0 ? void 0 : _b.name;
1077
1498
  if (typeof name !== "string" || !PACKAGE_NAME.test(name))
1078
1499
  return null;
1079
1500
  const record = listNpmPlugins(undefined, { packageRoot, projectRoot, skipInvalid: true }).find((item) => item.pluginId === pluginId);
1080
- await runNpm(["uninstall", name, "--no-fund", "--no-audit", "--ignore-scripts"], projectRoot);
1081
- const plugins = { ...mappingsOf(manifest) };
1501
+ await runNpm(["--prefix", targetRoot, "uninstall", name, "--no-fund", "--no-audit", "--ignore-scripts"], targetRoot);
1502
+ const updated = readProjectManifest(targetRoot);
1503
+ const plugins = { ...mappingsOf(updated) };
1082
1504
  delete plugins[pluginId];
1083
- const elementspanel = { ...((_a = objectValue(manifest.elementspanel)) !== null && _a !== void 0 ? _a : {}) };
1084
- if (Object.keys(plugins).length)
1085
- elementspanel.plugins = plugins;
1086
- else
1087
- delete elementspanel.plugins;
1088
- manifest.elementspanel = elementspanel;
1089
- writeProjectManifest(projectRoot, manifest);
1505
+ updated.elementspanel = { ...objectValue(updated.elementspanel), plugins };
1506
+ writeProjectManifest(targetRoot, updated);
1090
1507
  return record !== null && record !== void 0 ? record : null;
1091
1508
  });
1092
1509
  }
@@ -1235,6 +1652,82 @@ function pluginDirectoryRevision(directory) {
1235
1652
  }
1236
1653
 
1237
1654
 
1655
+ /***/ },
1656
+
1657
+ /***/ "../common/src/plugin_watch.ts"
1658
+ (__unused_webpack_module, exports, __webpack_require__) {
1659
+
1660
+
1661
+ var __importDefault = (this && this.__importDefault) || function (mod) {
1662
+ return (mod && mod.__esModule) ? mod : { "default": mod };
1663
+ };
1664
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
1665
+ exports.watchNpmPlugins = watchNpmPlugins;
1666
+ const node_fs_1 = __importDefault(__webpack_require__("node:fs"));
1667
+ const node_path_1 = __importDefault(__webpack_require__("node:path"));
1668
+ const plugin_npm_1 = __webpack_require__("../common/src/plugin_npm.ts");
1669
+ /** Poll package boundaries, allowing npm to finish replacing files before reconciliation. */
1670
+ function watchNpmPlugins(ctx, side, reload, changed) {
1671
+ const stamp = () => {
1672
+ const { packageRoot, projectRoot } = (0, plugin_npm_1.npmPluginRoots)();
1673
+ if (!node_fs_1.default.existsSync(node_path_1.default.join(packageRoot, "package.json")))
1674
+ return "";
1675
+ const files = [];
1676
+ for (const root of [packageRoot, projectRoot])
1677
+ for (const name of [
1678
+ "package.json",
1679
+ "package-lock.json",
1680
+ "npm-shrinkwrap.json",
1681
+ "node_modules/.package-lock.json"
1682
+ ])
1683
+ files.push(node_path_1.default.join(root, name));
1684
+ for (const plugin of (0, plugin_npm_1.listNpmPlugins)(side, { skipInvalid: true }))
1685
+ files.push(node_path_1.default.join(plugin.packageRoot, "package.json"), node_path_1.default.join(plugin.directory, "plugin.json"));
1686
+ return JSON.stringify(files.map((filename) => {
1687
+ try {
1688
+ const stat = node_fs_1.default.statSync(filename);
1689
+ return [filename, stat.size, stat.mtimeMs, stat.ctimeMs];
1690
+ }
1691
+ catch (_a) {
1692
+ return [filename, null];
1693
+ }
1694
+ }));
1695
+ };
1696
+ let applied = stamp();
1697
+ let candidate = applied;
1698
+ let busy = false;
1699
+ ctx.setInterval(() => {
1700
+ if (busy || (0, plugin_npm_1.npmPluginOperationPending)())
1701
+ return;
1702
+ try {
1703
+ const next = stamp();
1704
+ if (next === applied) {
1705
+ candidate = next;
1706
+ return;
1707
+ }
1708
+ if (next !== candidate) {
1709
+ candidate = next;
1710
+ return;
1711
+ }
1712
+ busy = true;
1713
+ void reload()
1714
+ .then(() => {
1715
+ applied = next;
1716
+ candidate = next;
1717
+ changed === null || changed === void 0 ? void 0 : changed();
1718
+ })
1719
+ .catch((error) => ctx.logger.warn("Failed to synchronize npm plugins", error))
1720
+ .finally(() => {
1721
+ busy = false;
1722
+ });
1723
+ }
1724
+ catch (error) {
1725
+ ctx.logger.warn("Failed to inspect npm plugins", error);
1726
+ }
1727
+ }, 2000);
1728
+ }
1729
+
1730
+
1238
1731
  /***/ },
1239
1732
 
1240
1733
  /***/ "../common/src/process_tools.ts"
@@ -1547,6 +2040,9 @@ function npmPluginRoots(side) {
1547
2040
  const { resolveNpmPlugins } = runtimeRequire(resolver);
1548
2041
  return resolveNpmPlugins(packagePath(), side, { skipInvalid: true }).map((record) => ({
1549
2042
  directory: record.directory,
2043
+ packageRoot: record.packageRoot,
2044
+ packageName: record.name,
2045
+ npmSource: record.source,
1550
2046
  ...(record.folder ? { folder: record.folder } : {}),
1551
2047
  // Built-in packages are part of the runtime's default configuration. A
1552
2048
  // project dependency is installed but remains dormant until the user
@@ -2115,6 +2611,13 @@ module.exports = require("node:fs");
2115
2611
 
2116
2612
  /***/ },
2117
2613
 
2614
+ /***/ "node:module"
2615
+ (module) {
2616
+
2617
+ module.exports = require("node:module");
2618
+
2619
+ /***/ },
2620
+
2118
2621
  /***/ "node:os"
2119
2622
  (module) {
2120
2623
 
@@ -2129,6 +2632,13 @@ module.exports = require("node:path");
2129
2632
 
2130
2633
  /***/ },
2131
2634
 
2635
+ /***/ "node:url"
2636
+ (module) {
2637
+
2638
+ module.exports = require("node:url");
2639
+
2640
+ /***/ },
2641
+
2132
2642
  /***/ "os"
2133
2643
  (module) {
2134
2644
 
@@ -2153,84 +2663,84 @@ module.exports = require("process");
2153
2663
  /***/ "./plugins/config/src/i18n/de_DE.json"
2154
2664
  (module) {
2155
2665
 
2156
- module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"Möchtest du das entsprechende Plugin auch auf den folgenden Knoten deaktivieren? Wähle die gewünschten Knoten aus.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"Möchtest du das entsprechende Plugin auch von den folgenden Knoten entfernen? Wähle die gewünschten Knoten aus.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"Die Plugins auf diesen Knoten konnten nicht geprüft werden: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"Die Plugin-Aktion wurde auf diesen Knoten nicht abgeschlossen: {nodes}","TXT_CODE_PLUGIN_CONFIG":"Plugin-Konfiguration","TXT_CODE_PLUGIN_CANCEL":"Abbrechen","TXT_CODE_PLUGIN_DELETE":"Entfernen","TXT_CODE_PLUGIN_DELETE_CONFIRM":"Die Plugin-Dateien und gespeicherten Einstellungen werden dauerhaft entfernt.","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"{name} entfernen?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"Plugins are installed as npm dependencies; remove them with npm.","TXT_CODE_PLUGIN_DELETED":"Plugin entfernt","TXT_CODE_PLUGIN_SAVE_SETTINGS":"Einstellungen speichern","TXT_CODE_PLUGIN_SAVE_REMINDER":"Denke daran, deine Einstellungen zu speichern!","TXT_CODE_PLUGIN_DISABLE":"Deaktivieren","TXT_CODE_PLUGIN_DISABLED":"Plugin deaktiviert","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"Alles, was dieses Plugin bereitstellt, wird sofort entfernt.","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"{name} deaktivieren?","TXT_CODE_PLUGIN_ENABLE":"Aktivieren","TXT_CODE_PLUGIN_ENABLED":"Plugin aktiviert","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"Der Webserver kann nicht über das Panel deaktiviert werden, das er selbst bereitstellt. Setze stattdessen enabled auf false in seiner plugin.json.","TXT_CODE_PLUGIN_IS_DISABLED":"Dieses Plugin ist deaktiviert. Seine Seiten, Routen und API sind erst nach dem Aktivieren wieder verfügbar.","TXT_CODE_PLUGIN_LOAD_FAILED":"Dieses Plugin konnte nicht geladen werden","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"Die Plugins dieses Knotens konnten nicht aufgelistet werden.","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"Dieser Knoten existiert nicht.","TXT_CODE_PLUGIN_NODE_OFFLINE":"nicht verbunden","TXT_CODE_PLUGIN_NODE_SELECT":"Knoten auswählen","TXT_CODE_PLUGIN_NO_CONFIG":"Dieses Plugin hat keine konfigurierbaren Optionen.","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"Nicht zugeordnet","TXT_CODE_PLUGIN_GROUP_ADD":"Gruppe hinzufügen","TXT_CODE_PLUGIN_GROUP_EDIT":"Plugin-Gruppe bearbeiten","TXT_CODE_PLUGIN_GROUP_RENAME":"Gruppe umbenennen","TXT_CODE_PLUGIN_GROUP_DELETE":"Gruppe löschen","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"Gruppe {name} löschen?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"Die Gruppe und ihre Plugin-Zuordnungen werden entfernt. Die Plugins selbst werden nicht gelöscht.","TXT_CODE_PLUGIN_GROUP_NAME":"Gruppenname","TXT_CODE_PLUGIN_SCOPE_NODE":"Knoten","TXT_CODE_PLUGIN_SCOPE_PANEL":"Panel","TXT_CODE_PLUGIN_SELF_DISABLE":"Die Plugin-Verwaltung kann sich nicht selbst deaktivieren. Setze stattdessen enabled auf false in ihrer plugin.json.","TXT_CODE_PLUGIN_STATE_PENDING":"Wartet auf Abhängigkeiten","TXT_CODE_PLUGIN_STATE_DISABLED":"Deaktiviert","TXT_CODE_PLUGIN_STATE_LOADING":"Wird geladen","TXT_CODE_PLUGIN_STATE_ACTIVE":"Aktiv","TXT_CODE_PLUGIN_STATE_UNLOADING":"Wird entladen","TXT_CODE_PLUGIN_RESTART_REQUIRED":"Starten Sie den Dienst neu, um die Änderung anzuwenden.","TXT_CODE_PLUGIN_SAVED_PENDING":"Gespeichert; wartet auf Plugin-Abhängigkeiten.","TXT_CODE_PLUGIN_FRONTEND_FAILED":"Browser-Plugin fehlgeschlagen","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"Laden Sie die Seite neu, um die aktualisierte Browser-Laufzeit zu laden."}');
2666
+ module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"Möchtest du das entsprechende Plugin auch auf den folgenden Knoten deaktivieren? Wähle die gewünschten Knoten aus.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"Möchtest du das entsprechende Plugin auch von den folgenden Knoten entfernen? Wähle die gewünschten Knoten aus.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"Die Plugins auf diesen Knoten konnten nicht geprüft werden: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"Die Plugin-Aktion wurde auf diesen Knoten nicht abgeschlossen: {nodes}","TXT_CODE_PLUGIN_CONFIG":"Plugin-Konfiguration","TXT_CODE_PLUGIN_CANCEL":"Abbrechen","TXT_CODE_PLUGIN_DELETE":"Entfernen","TXT_CODE_PLUGIN_DELETE_CONFIRM":"Die npm-Abhängigkeit wird deinstalliert. Gespeicherte Einstellungen bleiben erhalten.","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"{name} entfernen?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"Kernplugins und Quellcode-Plugins können hier nicht deinstalliert werden.","TXT_CODE_PLUGIN_DELETED":"Plugin entfernt","TXT_CODE_PLUGIN_SAVE_SETTINGS":"Einstellungen speichern","TXT_CODE_PLUGIN_SAVE_REMINDER":"Denke daran, deine Einstellungen zu speichern!","TXT_CODE_PLUGIN_DISABLE":"Deaktivieren","TXT_CODE_PLUGIN_DISABLED":"Plugin deaktiviert","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"Alles, was dieses Plugin bereitstellt, wird sofort entfernt.","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"{name} deaktivieren?","TXT_CODE_PLUGIN_ENABLE":"Aktivieren","TXT_CODE_PLUGIN_ENABLED":"Plugin aktiviert","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"Der Webserver kann nicht über das Panel deaktiviert werden, das er selbst bereitstellt. Setze stattdessen plugins.server.enabled auf false in seiner data/plugin-overrides.json.","TXT_CODE_PLUGIN_IS_DISABLED":"Dieses Plugin ist deaktiviert. Seine Seiten, Routen und API sind erst nach dem Aktivieren wieder verfügbar.","TXT_CODE_PLUGIN_LOAD_FAILED":"Dieses Plugin konnte nicht geladen werden","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"Die Plugins dieses Knotens konnten nicht aufgelistet werden.","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"Dieser Knoten existiert nicht.","TXT_CODE_PLUGIN_NODE_OFFLINE":"nicht verbunden","TXT_CODE_PLUGIN_NODE_SELECT":"Knoten auswählen","TXT_CODE_PLUGIN_NO_CONFIG":"Dieses Plugin hat keine konfigurierbaren Optionen.","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"Nicht zugeordnet","TXT_CODE_PLUGIN_GROUP_ADD":"Gruppe hinzufügen","TXT_CODE_PLUGIN_GROUP_EDIT":"Plugin-Gruppe bearbeiten","TXT_CODE_PLUGIN_GROUP_RENAME":"Gruppe umbenennen","TXT_CODE_PLUGIN_GROUP_DELETE":"Gruppe löschen","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"Gruppe {name} löschen?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"Die Gruppe und ihre Plugin-Zuordnungen werden entfernt. Die Plugins selbst werden nicht gelöscht.","TXT_CODE_PLUGIN_GROUP_NAME":"Gruppenname","TXT_CODE_PLUGIN_SCOPE_NODE":"Knoten","TXT_CODE_PLUGIN_SCOPE_PANEL":"Panel","TXT_CODE_PLUGIN_SELF_DISABLE":"Die Plugin-Verwaltung kann sich nicht selbst deaktivieren. Setze stattdessen plugins.config.enabled auf false in ihrer data/plugin-overrides.json.","TXT_CODE_PLUGIN_STATE_PENDING":"Wartet auf Abhängigkeiten","TXT_CODE_PLUGIN_STATE_DISABLED":"Deaktiviert","TXT_CODE_PLUGIN_STATE_LOADING":"Wird geladen","TXT_CODE_PLUGIN_STATE_ACTIVE":"Aktiv","TXT_CODE_PLUGIN_STATE_UNLOADING":"Wird entladen","TXT_CODE_PLUGIN_RESTART_REQUIRED":"Starten Sie den Dienst neu, um die Änderung anzuwenden.","TXT_CODE_PLUGIN_SAVED_PENDING":"Gespeichert; wartet auf Plugin-Abhängigkeiten.","TXT_CODE_PLUGIN_FRONTEND_FAILED":"Browser-Plugin fehlgeschlagen","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"Laden Sie die Seite neu, um die aktualisierte Browser-Laufzeit zu laden.","TXT_CODE_PLUGIN_NPM_INSTALL":"Plugin installieren / aktualisieren","TXT_CODE_PLUGIN_NPM_PACKAGE":"npm-Paketname","TXT_CODE_PLUGIN_NPM_VERSION":"Version oder Tag (Standard: latest)","TXT_CODE_PLUGIN_NPM_INSTALLED":"Plugin installiert und synchronisiert"}');
2157
2667
 
2158
2668
  /***/ },
2159
2669
 
2160
2670
  /***/ "./plugins/config/src/i18n/en_US.json"
2161
2671
  (module) {
2162
2672
 
2163
- module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"Also disable the matching plugin on the following nodes? Select the nodes to include.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"Also remove the matching plugin from the following nodes? Select the nodes to include.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"Could not check the plugins on these nodes: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"The plugin action did not complete on these nodes: {nodes}","TXT_CODE_PLUGIN_CONFIG":"Plugin Configuration","TXT_CODE_PLUGIN_CANCEL":"Cancel","TXT_CODE_PLUGIN_DELETE":"Remove","TXT_CODE_PLUGIN_DELETE_CONFIRM":"The plugin files and saved configuration will be permanently removed.","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"Remove {name}?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"Plugins are installed as npm dependencies; remove them with npm.","TXT_CODE_PLUGIN_DELETED":"Plugin removed","TXT_CODE_PLUGIN_SAVE_SETTINGS":"Save settings","TXT_CODE_PLUGIN_SAVE_REMINDER":"Remember to save your settings!","TXT_CODE_PLUGIN_DISABLE":"Disable","TXT_CODE_PLUGIN_DISABLED":"Plugin disabled","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"Everything this plugin provides is removed at once.","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"Disable {name}?","TXT_CODE_PLUGIN_ENABLE":"Enable","TXT_CODE_PLUGIN_ENABLED":"Plugin enabled","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"The web server cannot be disabled from the panel it serves. Set enabled to false in its plugin.json instead.","TXT_CODE_PLUGIN_IS_DISABLED":"This plugin is disabled. Its pages, routes and API are unavailable until it is enabled again.","TXT_CODE_PLUGIN_LOAD_FAILED":"This plugin failed to load","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"This node\'s plugins could not be listed.","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"That node does not exist.","TXT_CODE_PLUGIN_NODE_OFFLINE":"not connected","TXT_CODE_PLUGIN_NODE_SELECT":"Select a node","TXT_CODE_PLUGIN_NO_CONFIG":"This plugin has no configurable options.","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"Unassigned","TXT_CODE_PLUGIN_GROUP_ADD":"Add group","TXT_CODE_PLUGIN_GROUP_EDIT":"Edit plugin group","TXT_CODE_PLUGIN_GROUP_RENAME":"Rename group","TXT_CODE_PLUGIN_GROUP_DELETE":"Delete group","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"Delete group {name}?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"The group and its plugin assignments will be removed. The plugins themselves will not be deleted.","TXT_CODE_PLUGIN_GROUP_NAME":"Group name","TXT_CODE_PLUGIN_SCOPE_NODE":"Nodes","TXT_CODE_PLUGIN_SCOPE_PANEL":"Panel","TXT_CODE_PLUGIN_SELF_DISABLE":"The plugin manager cannot disable itself. Set enabled to false in its plugin.json instead.","TXT_CODE_PLUGIN_STATE_PENDING":"Waiting for dependencies","TXT_CODE_PLUGIN_STATE_DISABLED":"Disabled","TXT_CODE_PLUGIN_STATE_LOADING":"Loading","TXT_CODE_PLUGIN_STATE_ACTIVE":"Running","TXT_CODE_PLUGIN_STATE_UNLOADING":"Unloading","TXT_CODE_PLUGIN_RESTART_REQUIRED":"Restart the service to apply this change.","TXT_CODE_PLUGIN_SAVED_PENDING":"Saved; waiting for plugin dependencies.","TXT_CODE_PLUGIN_FRONTEND_FAILED":"Browser plugin failed","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"Refresh the page to load the updated browser runtime."}');
2673
+ module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"Also disable the matching plugin on the following nodes? Select the nodes to include.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"Also remove the matching plugin from the following nodes? Select the nodes to include.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"Could not check the plugins on these nodes: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"The plugin action did not complete on these nodes: {nodes}","TXT_CODE_PLUGIN_CONFIG":"Plugin Configuration","TXT_CODE_PLUGIN_CANCEL":"Cancel","TXT_CODE_PLUGIN_DELETE":"Remove","TXT_CODE_PLUGIN_DELETE_CONFIRM":"The npm dependency will be uninstalled. Saved configuration is kept.","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"Remove {name}?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"Core plugins and development source plugins cannot be uninstalled here.","TXT_CODE_PLUGIN_DELETED":"Plugin removed","TXT_CODE_PLUGIN_SAVE_SETTINGS":"Save settings","TXT_CODE_PLUGIN_SAVE_REMINDER":"Remember to save your settings!","TXT_CODE_PLUGIN_DISABLE":"Disable","TXT_CODE_PLUGIN_DISABLED":"Plugin disabled","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"Everything this plugin provides is removed at once.","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"Disable {name}?","TXT_CODE_PLUGIN_ENABLE":"Enable","TXT_CODE_PLUGIN_ENABLED":"Plugin enabled","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"The web server cannot be disabled from the panel it serves. Set plugins.server.enabled to false in its data/plugin-overrides.json instead.","TXT_CODE_PLUGIN_IS_DISABLED":"This plugin is disabled. Its pages, routes and API are unavailable until it is enabled again.","TXT_CODE_PLUGIN_LOAD_FAILED":"This plugin failed to load","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"This node\'s plugins could not be listed.","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"That node does not exist.","TXT_CODE_PLUGIN_NODE_OFFLINE":"not connected","TXT_CODE_PLUGIN_NODE_SELECT":"Select a node","TXT_CODE_PLUGIN_NO_CONFIG":"This plugin has no configurable options.","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"Unassigned","TXT_CODE_PLUGIN_GROUP_ADD":"Add group","TXT_CODE_PLUGIN_GROUP_EDIT":"Edit plugin group","TXT_CODE_PLUGIN_GROUP_RENAME":"Rename group","TXT_CODE_PLUGIN_GROUP_DELETE":"Delete group","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"Delete group {name}?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"The group and its plugin assignments will be removed. The plugins themselves will not be deleted.","TXT_CODE_PLUGIN_GROUP_NAME":"Group name","TXT_CODE_PLUGIN_SCOPE_NODE":"Nodes","TXT_CODE_PLUGIN_SCOPE_PANEL":"Panel","TXT_CODE_PLUGIN_SELF_DISABLE":"The plugin manager cannot disable itself. Set plugins.config.enabled to false in its data/plugin-overrides.json instead.","TXT_CODE_PLUGIN_STATE_PENDING":"Waiting for dependencies","TXT_CODE_PLUGIN_STATE_DISABLED":"Disabled","TXT_CODE_PLUGIN_STATE_LOADING":"Loading","TXT_CODE_PLUGIN_STATE_ACTIVE":"Running","TXT_CODE_PLUGIN_STATE_UNLOADING":"Unloading","TXT_CODE_PLUGIN_RESTART_REQUIRED":"Restart the service to apply this change.","TXT_CODE_PLUGIN_SAVED_PENDING":"Saved; waiting for plugin dependencies.","TXT_CODE_PLUGIN_FRONTEND_FAILED":"Browser plugin failed","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"Refresh the page to load the updated browser runtime.","TXT_CODE_PLUGIN_NPM_INSTALL":"Install / update plugin","TXT_CODE_PLUGIN_NPM_PACKAGE":"npm package name","TXT_CODE_PLUGIN_NPM_VERSION":"Version or tag (latest by default)","TXT_CODE_PLUGIN_NPM_INSTALLED":"Plugin installed and synchronized"}');
2164
2674
 
2165
2675
  /***/ },
2166
2676
 
2167
2677
  /***/ "./plugins/config/src/i18n/es_ES.json"
2168
2678
  (module) {
2169
2679
 
2170
- module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"¿Quieres desactivar también el complemento correspondiente en los siguientes nodos? Selecciona los nodos que quieras incluir.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"¿Quieres eliminar también el complemento correspondiente de los siguientes nodos? Selecciona los nodos que quieras incluir.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"No se pudieron comprobar los complementos de estos nodos: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"La operación del complemento no se completó en estos nodos: {nodes}","TXT_CODE_PLUGIN_CONFIG":"Configuracion de plugins","TXT_CODE_PLUGIN_CANCEL":"Cancelar","TXT_CODE_PLUGIN_DELETE":"Eliminar","TXT_CODE_PLUGIN_DELETE_CONFIRM":"Los archivos del complemento y su configuración guardada se eliminarán permanentemente.","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"¿Eliminar {name}?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"Plugins are installed as npm dependencies; remove them with npm.","TXT_CODE_PLUGIN_DELETED":"Complemento eliminado","TXT_CODE_PLUGIN_SAVE_SETTINGS":"Guardar configuración","TXT_CODE_PLUGIN_SAVE_REMINDER":"¡Recuerda guardar la configuración!","TXT_CODE_PLUGIN_DISABLE":"Desactivar","TXT_CODE_PLUGIN_DISABLED":"Complemento desactivado","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"Todo lo que aporta este complemento se elimina de inmediato.","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"¿Desactivar {name}?","TXT_CODE_PLUGIN_ENABLE":"Activar","TXT_CODE_PLUGIN_ENABLED":"Complemento activado","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"El servidor web no puede desactivarse desde el panel que él mismo sirve. Establece enabled en false en su plugin.json.","TXT_CODE_PLUGIN_IS_DISABLED":"Este complemento está desactivado. Sus páginas, rutas y API no están disponibles hasta que se vuelva a activar.","TXT_CODE_PLUGIN_LOAD_FAILED":"No se pudo cargar este complemento","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"No se pudieron listar los complementos de este nodo.","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"Ese nodo no existe.","TXT_CODE_PLUGIN_NODE_OFFLINE":"sin conexión","TXT_CODE_PLUGIN_NODE_SELECT":"Seleccionar un nodo","TXT_CODE_PLUGIN_NO_CONFIG":"Este plugin no tiene opciones configurables.","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"Sin asignar","TXT_CODE_PLUGIN_GROUP_ADD":"Añadir grupo","TXT_CODE_PLUGIN_GROUP_EDIT":"Editar grupo de plugins","TXT_CODE_PLUGIN_GROUP_RENAME":"Cambiar nombre del grupo","TXT_CODE_PLUGIN_GROUP_DELETE":"Eliminar grupo","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"¿Eliminar el grupo {name}?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"Se eliminarán el grupo y sus asignaciones de plugins. Los plugins no se eliminarán.","TXT_CODE_PLUGIN_GROUP_NAME":"Nombre del grupo","TXT_CODE_PLUGIN_SCOPE_NODE":"Nodos","TXT_CODE_PLUGIN_SCOPE_PANEL":"Panel","TXT_CODE_PLUGIN_SELF_DISABLE":"El gestor de complementos no puede desactivarse a sí mismo. Establece enabled en false en su plugin.json.","TXT_CODE_PLUGIN_STATE_PENDING":"Esperando dependencias","TXT_CODE_PLUGIN_STATE_DISABLED":"Desactivado","TXT_CODE_PLUGIN_STATE_LOADING":"Cargando","TXT_CODE_PLUGIN_STATE_ACTIVE":"En ejecución","TXT_CODE_PLUGIN_STATE_UNLOADING":"Descargando","TXT_CODE_PLUGIN_RESTART_REQUIRED":"Reinicia el servicio para aplicar el cambio.","TXT_CODE_PLUGIN_SAVED_PENDING":"Guardado; esperando dependencias del complemento.","TXT_CODE_PLUGIN_FRONTEND_FAILED":"Error del complemento del navegador","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"Recarga la página para cargar el entorno actualizado del navegador."}');
2680
+ module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"¿Quieres desactivar también el complemento correspondiente en los siguientes nodos? Selecciona los nodos que quieras incluir.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"¿Quieres eliminar también el complemento correspondiente de los siguientes nodos? Selecciona los nodos que quieras incluir.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"No se pudieron comprobar los complementos de estos nodos: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"La operación del complemento no se completó en estos nodos: {nodes}","TXT_CODE_PLUGIN_CONFIG":"Configuracion de plugins","TXT_CODE_PLUGIN_CANCEL":"Cancelar","TXT_CODE_PLUGIN_DELETE":"Eliminar","TXT_CODE_PLUGIN_DELETE_CONFIRM":"Se desinstalará la dependencia npm. Se conservará la configuración guardada.","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"¿Eliminar {name}?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"Los complementos principales y de código fuente no se pueden desinstalar aquí.","TXT_CODE_PLUGIN_DELETED":"Complemento eliminado","TXT_CODE_PLUGIN_SAVE_SETTINGS":"Guardar configuración","TXT_CODE_PLUGIN_SAVE_REMINDER":"¡Recuerda guardar la configuración!","TXT_CODE_PLUGIN_DISABLE":"Desactivar","TXT_CODE_PLUGIN_DISABLED":"Complemento desactivado","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"Todo lo que aporta este complemento se elimina de inmediato.","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"¿Desactivar {name}?","TXT_CODE_PLUGIN_ENABLE":"Activar","TXT_CODE_PLUGIN_ENABLED":"Complemento activado","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"El servidor web no puede desactivarse desde el panel que él mismo sirve. Establece plugins.server.enabled en false en su data/plugin-overrides.json.","TXT_CODE_PLUGIN_IS_DISABLED":"Este complemento está desactivado. Sus páginas, rutas y API no están disponibles hasta que se vuelva a activar.","TXT_CODE_PLUGIN_LOAD_FAILED":"No se pudo cargar este complemento","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"No se pudieron listar los complementos de este nodo.","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"Ese nodo no existe.","TXT_CODE_PLUGIN_NODE_OFFLINE":"sin conexión","TXT_CODE_PLUGIN_NODE_SELECT":"Seleccionar un nodo","TXT_CODE_PLUGIN_NO_CONFIG":"Este plugin no tiene opciones configurables.","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"Sin asignar","TXT_CODE_PLUGIN_GROUP_ADD":"Añadir grupo","TXT_CODE_PLUGIN_GROUP_EDIT":"Editar grupo de plugins","TXT_CODE_PLUGIN_GROUP_RENAME":"Cambiar nombre del grupo","TXT_CODE_PLUGIN_GROUP_DELETE":"Eliminar grupo","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"¿Eliminar el grupo {name}?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"Se eliminarán el grupo y sus asignaciones de plugins. Los plugins no se eliminarán.","TXT_CODE_PLUGIN_GROUP_NAME":"Nombre del grupo","TXT_CODE_PLUGIN_SCOPE_NODE":"Nodos","TXT_CODE_PLUGIN_SCOPE_PANEL":"Panel","TXT_CODE_PLUGIN_SELF_DISABLE":"El gestor de complementos no puede desactivarse a sí mismo. Establece plugins.config.enabled en false en su data/plugin-overrides.json.","TXT_CODE_PLUGIN_STATE_PENDING":"Esperando dependencias","TXT_CODE_PLUGIN_STATE_DISABLED":"Desactivado","TXT_CODE_PLUGIN_STATE_LOADING":"Cargando","TXT_CODE_PLUGIN_STATE_ACTIVE":"En ejecución","TXT_CODE_PLUGIN_STATE_UNLOADING":"Descargando","TXT_CODE_PLUGIN_RESTART_REQUIRED":"Reinicia el servicio para aplicar el cambio.","TXT_CODE_PLUGIN_SAVED_PENDING":"Guardado; esperando dependencias del complemento.","TXT_CODE_PLUGIN_FRONTEND_FAILED":"Error del complemento del navegador","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"Recarga la página para cargar el entorno actualizado del navegador.","TXT_CODE_PLUGIN_NPM_INSTALL":"Instalar / actualizar complemento","TXT_CODE_PLUGIN_NPM_PACKAGE":"Nombre del paquete npm","TXT_CODE_PLUGIN_NPM_VERSION":"Versión o etiqueta (latest por defecto)","TXT_CODE_PLUGIN_NPM_INSTALLED":"Complemento instalado y sincronizado"}');
2171
2681
 
2172
2682
  /***/ },
2173
2683
 
2174
2684
  /***/ "./plugins/config/src/i18n/fr_FR.json"
2175
2685
  (module) {
2176
2686
 
2177
- module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"Voulez-vous aussi désactiver le plugin correspondant sur les nœuds suivants ? Sélectionnez les nœuds à inclure.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"Voulez-vous aussi supprimer le plugin correspondant des nœuds suivants ? Sélectionnez les nœuds à inclure.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"Impossible de vérifier les plugins sur ces nœuds : {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"L’opération sur le plugin n’a pas abouti sur ces nœuds : {nodes}","TXT_CODE_PLUGIN_CONFIG":"Configuration des plugins","TXT_CODE_PLUGIN_CANCEL":"Annuler","TXT_CODE_PLUGIN_DELETE":"Supprimer","TXT_CODE_PLUGIN_DELETE_CONFIRM":"Les fichiers du plugin et sa configuration enregistrée seront supprimés définitivement.","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"Supprimer {name} ?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"Plugins are installed as npm dependencies; remove them with npm.","TXT_CODE_PLUGIN_DELETED":"Plugin supprimé","TXT_CODE_PLUGIN_SAVE_SETTINGS":"Enregistrer la configuration","TXT_CODE_PLUGIN_SAVE_REMINDER":"Pensez à enregistrer la configuration !","TXT_CODE_PLUGIN_DISABLE":"Désactiver","TXT_CODE_PLUGIN_DISABLED":"Extension désactivée","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"Tout ce que cette extension fournit est retiré immédiatement.","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"Désactiver {name} ?","TXT_CODE_PLUGIN_ENABLE":"Activer","TXT_CODE_PLUGIN_ENABLED":"Extension activée","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"Le serveur web ne peut pas être désactivé depuis le panneau qu il sert lui-même. Définissez plutôt enabled à false dans son plugin.json.","TXT_CODE_PLUGIN_IS_DISABLED":"Cette extension est désactivée. Ses pages, routes et API ne sont pas disponibles avant sa réactivation.","TXT_CODE_PLUGIN_LOAD_FAILED":"Le chargement de cette extension a échoué","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"Impossible de lister les extensions de ce nœud.","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"Ce nœud n existe pas.","TXT_CODE_PLUGIN_NODE_OFFLINE":"non connecté","TXT_CODE_PLUGIN_NODE_SELECT":"Sélectionner un nœud","TXT_CODE_PLUGIN_NO_CONFIG":"Ce plugin ne comporte aucune option configurable.","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"Non attribués","TXT_CODE_PLUGIN_GROUP_ADD":"Ajouter un groupe","TXT_CODE_PLUGIN_GROUP_EDIT":"Modifier le groupe de plugins","TXT_CODE_PLUGIN_GROUP_RENAME":"Renommer le groupe","TXT_CODE_PLUGIN_GROUP_DELETE":"Supprimer le groupe","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"Supprimer le groupe {name} ?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"Le groupe et ses affectations de plugins seront supprimés. Les plugins eux-mêmes ne seront pas supprimés.","TXT_CODE_PLUGIN_GROUP_NAME":"Nom du groupe","TXT_CODE_PLUGIN_SCOPE_NODE":"Nœuds","TXT_CODE_PLUGIN_SCOPE_PANEL":"Panneau","TXT_CODE_PLUGIN_SELF_DISABLE":"Le gestionnaire d extensions ne peut pas se désactiver lui-même. Définissez plutôt enabled à false dans son plugin.json.","TXT_CODE_PLUGIN_STATE_PENDING":"En attente des dépendances","TXT_CODE_PLUGIN_STATE_DISABLED":"Désactivé","TXT_CODE_PLUGIN_STATE_LOADING":"Chargement","TXT_CODE_PLUGIN_STATE_ACTIVE":"Actif","TXT_CODE_PLUGIN_STATE_UNLOADING":"Déchargement","TXT_CODE_PLUGIN_RESTART_REQUIRED":"Redémarrez le service pour appliquer cette modification.","TXT_CODE_PLUGIN_SAVED_PENDING":"Enregistré ; en attente des dépendances du plugin.","TXT_CODE_PLUGIN_FRONTEND_FAILED":"Échec du plugin du navigateur","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"Actualisez la page pour charger le nouvel environnement du navigateur."}');
2687
+ module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"Voulez-vous aussi désactiver le plugin correspondant sur les nœuds suivants ? Sélectionnez les nœuds à inclure.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"Voulez-vous aussi supprimer le plugin correspondant des nœuds suivants ? Sélectionnez les nœuds à inclure.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"Impossible de vérifier les plugins sur ces nœuds : {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"L’opération sur le plugin n’a pas abouti sur ces nœuds : {nodes}","TXT_CODE_PLUGIN_CONFIG":"Configuration des plugins","TXT_CODE_PLUGIN_CANCEL":"Annuler","TXT_CODE_PLUGIN_DELETE":"Supprimer","TXT_CODE_PLUGIN_DELETE_CONFIRM":"La dépendance npm sera désinstallée. La configuration enregistrée sera conservée.","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"Supprimer {name} ?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"Les plugins essentiels et ceux du code source ne peuvent pas être désinstallés ici.","TXT_CODE_PLUGIN_DELETED":"Plugin supprimé","TXT_CODE_PLUGIN_SAVE_SETTINGS":"Enregistrer la configuration","TXT_CODE_PLUGIN_SAVE_REMINDER":"Pensez à enregistrer la configuration !","TXT_CODE_PLUGIN_DISABLE":"Désactiver","TXT_CODE_PLUGIN_DISABLED":"Extension désactivée","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"Tout ce que cette extension fournit est retiré immédiatement.","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"Désactiver {name} ?","TXT_CODE_PLUGIN_ENABLE":"Activer","TXT_CODE_PLUGIN_ENABLED":"Extension activée","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"Le serveur web ne peut pas être désactivé depuis le panneau qu il sert lui-même. Définissez plutôt plugins.server.enabled à false dans son data/plugin-overrides.json.","TXT_CODE_PLUGIN_IS_DISABLED":"Cette extension est désactivée. Ses pages, routes et API ne sont pas disponibles avant sa réactivation.","TXT_CODE_PLUGIN_LOAD_FAILED":"Le chargement de cette extension a échoué","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"Impossible de lister les extensions de ce nœud.","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"Ce nœud n existe pas.","TXT_CODE_PLUGIN_NODE_OFFLINE":"non connecté","TXT_CODE_PLUGIN_NODE_SELECT":"Sélectionner un nœud","TXT_CODE_PLUGIN_NO_CONFIG":"Ce plugin ne comporte aucune option configurable.","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"Non attribués","TXT_CODE_PLUGIN_GROUP_ADD":"Ajouter un groupe","TXT_CODE_PLUGIN_GROUP_EDIT":"Modifier le groupe de plugins","TXT_CODE_PLUGIN_GROUP_RENAME":"Renommer le groupe","TXT_CODE_PLUGIN_GROUP_DELETE":"Supprimer le groupe","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"Supprimer le groupe {name} ?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"Le groupe et ses affectations de plugins seront supprimés. Les plugins eux-mêmes ne seront pas supprimés.","TXT_CODE_PLUGIN_GROUP_NAME":"Nom du groupe","TXT_CODE_PLUGIN_SCOPE_NODE":"Nœuds","TXT_CODE_PLUGIN_SCOPE_PANEL":"Panneau","TXT_CODE_PLUGIN_SELF_DISABLE":"Le gestionnaire d extensions ne peut pas se désactiver lui-même. Définissez plutôt plugins.config.enabled à false dans son data/plugin-overrides.json.","TXT_CODE_PLUGIN_STATE_PENDING":"En attente des dépendances","TXT_CODE_PLUGIN_STATE_DISABLED":"Désactivé","TXT_CODE_PLUGIN_STATE_LOADING":"Chargement","TXT_CODE_PLUGIN_STATE_ACTIVE":"Actif","TXT_CODE_PLUGIN_STATE_UNLOADING":"Déchargement","TXT_CODE_PLUGIN_RESTART_REQUIRED":"Redémarrez le service pour appliquer cette modification.","TXT_CODE_PLUGIN_SAVED_PENDING":"Enregistré ; en attente des dépendances du plugin.","TXT_CODE_PLUGIN_FRONTEND_FAILED":"Échec du plugin du navigateur","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"Actualisez la page pour charger le nouvel environnement du navigateur.","TXT_CODE_PLUGIN_NPM_INSTALL":"Installer / mettre à jour le plugin","TXT_CODE_PLUGIN_NPM_PACKAGE":"Nom du paquet npm","TXT_CODE_PLUGIN_NPM_VERSION":"Version ou étiquette (latest par défaut)","TXT_CODE_PLUGIN_NPM_INSTALLED":"Plugin installé et synchronisé"}');
2178
2688
 
2179
2689
  /***/ },
2180
2690
 
2181
2691
  /***/ "./plugins/config/src/i18n/ja_JP.json"
2182
2692
  (module) {
2183
2693
 
2184
- module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"以下のノードにある同じプラグインも無効にしますか?対象のノードを選択してください。","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"以下のノードにある同じプラグインも削除しますか?対象のノードを選択してください。","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"以下のノードのプラグインを確認できませんでした:{nodes}。","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"以下のノードでプラグインの操作が完了しませんでした:{nodes}","TXT_CODE_PLUGIN_CONFIG":"プラグイン設定","TXT_CODE_PLUGIN_CANCEL":"キャンセル","TXT_CODE_PLUGIN_DELETE":"削除","TXT_CODE_PLUGIN_DELETE_CONFIRM":"プラグインファイルと保存済みの設定が完全に削除されます。","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"{name} を削除しますか?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"Plugins are installed as npm dependencies; remove them with npm.","TXT_CODE_PLUGIN_DELETED":"プラグインを削除しました","TXT_CODE_PLUGIN_SAVE_SETTINGS":"設定を保存","TXT_CODE_PLUGIN_SAVE_REMINDER":"設定の保存をお忘れなく!","TXT_CODE_PLUGIN_DISABLE":"無効化","TXT_CODE_PLUGIN_DISABLED":"プラグインを無効にしました","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"このプラグインが提供するすべての要素が即座に削除されます。","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"{name} を無効にしますか?","TXT_CODE_PLUGIN_ENABLE":"有効化","TXT_CODE_PLUGIN_ENABLED":"プラグインを有効にしました","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"Web サーバーは、それ自身が配信しているパネルからは無効にできません。plugin.json で enabled を false に設定してください。","TXT_CODE_PLUGIN_IS_DISABLED":"このプラグインは無効です。再度有効にするまで、ページ・ルート・API は利用できません。","TXT_CODE_PLUGIN_LOAD_FAILED":"このプラグインの読み込みに失敗しました","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"このノードのプラグイン一覧を取得できませんでした。","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"そのノードは存在しません。","TXT_CODE_PLUGIN_NODE_OFFLINE":"未接続","TXT_CODE_PLUGIN_NODE_SELECT":"ノードを選択","TXT_CODE_PLUGIN_NO_CONFIG":"このプラグインには設定可能な項目がありません。","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"未分類","TXT_CODE_PLUGIN_GROUP_ADD":"グループを追加","TXT_CODE_PLUGIN_GROUP_EDIT":"プラグイン グループを編集","TXT_CODE_PLUGIN_GROUP_RENAME":"グループ名を変更","TXT_CODE_PLUGIN_GROUP_DELETE":"グループを削除","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"グループ「{name}」を削除しますか?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"グループとプラグインの割り当てを削除します。プラグイン自体は削除されません。","TXT_CODE_PLUGIN_GROUP_NAME":"グループ名","TXT_CODE_PLUGIN_SCOPE_NODE":"ノード","TXT_CODE_PLUGIN_SCOPE_PANEL":"パネル","TXT_CODE_PLUGIN_SELF_DISABLE":"プラグイン管理自身は無効にできません。plugin.json で enabled を false に設定してください。","TXT_CODE_PLUGIN_STATE_PENDING":"依存関係を待機中","TXT_CODE_PLUGIN_STATE_DISABLED":"無効","TXT_CODE_PLUGIN_STATE_LOADING":"読み込み中","TXT_CODE_PLUGIN_STATE_ACTIVE":"実行中","TXT_CODE_PLUGIN_STATE_UNLOADING":"アンロード中","TXT_CODE_PLUGIN_RESTART_REQUIRED":"変更を適用するにはサービスを再起動してください。","TXT_CODE_PLUGIN_SAVED_PENDING":"保存しました。プラグインの依存関係を待機しています。","TXT_CODE_PLUGIN_FRONTEND_FAILED":"ブラウザープラグインの読み込みに失敗しました","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"更新されたブラウザーランタイムを読み込むにはページを再読み込みしてください。"}');
2694
+ module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"以下のノードにある同じプラグインも無効にしますか?対象のノードを選択してください。","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"以下のノードにある同じプラグインも削除しますか?対象のノードを選択してください。","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"以下のノードのプラグインを確認できませんでした:{nodes}。","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"以下のノードでプラグインの操作が完了しませんでした:{nodes}","TXT_CODE_PLUGIN_CONFIG":"プラグイン設定","TXT_CODE_PLUGIN_CANCEL":"キャンセル","TXT_CODE_PLUGIN_DELETE":"削除","TXT_CODE_PLUGIN_DELETE_CONFIRM":"npm 依存パッケージをアンインストールします。保存済みの設定は保持されます。","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"{name} を削除しますか?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"コアプラグインと開発用ソースプラグインはここではアンインストールできません。","TXT_CODE_PLUGIN_DELETED":"プラグインを削除しました","TXT_CODE_PLUGIN_SAVE_SETTINGS":"設定を保存","TXT_CODE_PLUGIN_SAVE_REMINDER":"設定の保存をお忘れなく!","TXT_CODE_PLUGIN_DISABLE":"無効化","TXT_CODE_PLUGIN_DISABLED":"プラグインを無効にしました","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"このプラグインが提供するすべての要素が即座に削除されます。","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"{name} を無効にしますか?","TXT_CODE_PLUGIN_ENABLE":"有効化","TXT_CODE_PLUGIN_ENABLED":"プラグインを有効にしました","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"Web サーバーは、それ自身が配信しているパネルからは無効にできません。data/plugin-overrides.json で plugins.server.enabled を false に設定してください。","TXT_CODE_PLUGIN_IS_DISABLED":"このプラグインは無効です。再度有効にするまで、ページ・ルート・API は利用できません。","TXT_CODE_PLUGIN_LOAD_FAILED":"このプラグインの読み込みに失敗しました","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"このノードのプラグイン一覧を取得できませんでした。","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"そのノードは存在しません。","TXT_CODE_PLUGIN_NODE_OFFLINE":"未接続","TXT_CODE_PLUGIN_NODE_SELECT":"ノードを選択","TXT_CODE_PLUGIN_NO_CONFIG":"このプラグインには設定可能な項目がありません。","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"未分類","TXT_CODE_PLUGIN_GROUP_ADD":"グループを追加","TXT_CODE_PLUGIN_GROUP_EDIT":"プラグイン グループを編集","TXT_CODE_PLUGIN_GROUP_RENAME":"グループ名を変更","TXT_CODE_PLUGIN_GROUP_DELETE":"グループを削除","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"グループ「{name}」を削除しますか?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"グループとプラグインの割り当てを削除します。プラグイン自体は削除されません。","TXT_CODE_PLUGIN_GROUP_NAME":"グループ名","TXT_CODE_PLUGIN_SCOPE_NODE":"ノード","TXT_CODE_PLUGIN_SCOPE_PANEL":"パネル","TXT_CODE_PLUGIN_SELF_DISABLE":"プラグイン管理自身は無効にできません。data/plugin-overrides.json で plugins.config.enabled を false に設定してください。","TXT_CODE_PLUGIN_STATE_PENDING":"依存関係を待機中","TXT_CODE_PLUGIN_STATE_DISABLED":"無効","TXT_CODE_PLUGIN_STATE_LOADING":"読み込み中","TXT_CODE_PLUGIN_STATE_ACTIVE":"実行中","TXT_CODE_PLUGIN_STATE_UNLOADING":"アンロード中","TXT_CODE_PLUGIN_RESTART_REQUIRED":"変更を適用するにはサービスを再起動してください。","TXT_CODE_PLUGIN_SAVED_PENDING":"保存しました。プラグインの依存関係を待機しています。","TXT_CODE_PLUGIN_FRONTEND_FAILED":"ブラウザープラグインの読み込みに失敗しました","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"更新されたブラウザーランタイムを読み込むにはページを再読み込みしてください。","TXT_CODE_PLUGIN_NPM_INSTALL":"プラグインのインストール / 更新","TXT_CODE_PLUGIN_NPM_PACKAGE":"npm パッケージ名","TXT_CODE_PLUGIN_NPM_VERSION":"バージョンまたはタグ(既定: latest)","TXT_CODE_PLUGIN_NPM_INSTALLED":"プラグインをインストールして同期しました"}');
2185
2695
 
2186
2696
  /***/ },
2187
2697
 
2188
2698
  /***/ "./plugins/config/src/i18n/ko_KR.json"
2189
2699
  (module) {
2190
2700
 
2191
- module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"다음 노드의 동일한 플러그인도 비활성화할까요? 함께 처리할 노드를 선택하세요.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"다음 노드의 동일한 플러그인도 삭제할까요? 함께 처리할 노드를 선택하세요.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"다음 노드의 플러그인을 확인할 수 없습니다: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"다음 노드에서 플러그인 작업이 완료되지 않았습니다: {nodes}","TXT_CODE_PLUGIN_CONFIG":"플러그인 설정","TXT_CODE_PLUGIN_CANCEL":"취소","TXT_CODE_PLUGIN_DELETE":"삭제","TXT_CODE_PLUGIN_DELETE_CONFIRM":"플러그인 파일과 저장된 설정이 영구적으로 삭제됩니다.","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"{name} 플러그인을 삭제할까요?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"Plugins are installed as npm dependencies; remove them with npm.","TXT_CODE_PLUGIN_DELETED":"플러그인을 삭제했습니다","TXT_CODE_PLUGIN_SAVE_SETTINGS":"설정 저장","TXT_CODE_PLUGIN_SAVE_REMINDER":"설정을 저장하는 것을 잊지 마세요!","TXT_CODE_PLUGIN_DISABLE":"비활성화","TXT_CODE_PLUGIN_DISABLED":"플러그인을 비활성화했습니다","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"이 플러그인이 제공하는 모든 구성 요소가 즉시 제거됩니다.","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"{name}을(를) 비활성화할까요?","TXT_CODE_PLUGIN_ENABLE":"활성화","TXT_CODE_PLUGIN_ENABLED":"플러그인을 활성화했습니다","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"웹 서버는 자신이 제공하는 패널에서 비활성화할 수 없습니다. plugin.json에서 enabled 를 false 로 설정하세요.","TXT_CODE_PLUGIN_IS_DISABLED":"이 플러그인은 비활성화되어 있습니다. 다시 활성화할 때까지 페이지, 경로, API를 사용할 수 없습니다.","TXT_CODE_PLUGIN_LOAD_FAILED":"이 플러그인을 불러오지 못했습니다","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"이 노드의 플러그인 목록을 가져올 수 없습니다.","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"해당 노드가 존재하지 않습니다.","TXT_CODE_PLUGIN_NODE_OFFLINE":"연결되지 않음","TXT_CODE_PLUGIN_NODE_SELECT":"노드 선택","TXT_CODE_PLUGIN_NO_CONFIG":"이 플러그인에는 구성 가능한 옵션이 없습니다.","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"미분류","TXT_CODE_PLUGIN_GROUP_ADD":"그룹 추가","TXT_CODE_PLUGIN_GROUP_EDIT":"플러그인 그룹 편집","TXT_CODE_PLUGIN_GROUP_RENAME":"그룹 이름 변경","TXT_CODE_PLUGIN_GROUP_DELETE":"그룹 삭제","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"{name} 그룹을 삭제하시겠습니까?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"그룹과 플러그인 할당이 삭제됩니다. 플러그인 자체는 삭제되지 않습니다.","TXT_CODE_PLUGIN_GROUP_NAME":"그룹 이름","TXT_CODE_PLUGIN_SCOPE_NODE":"노드","TXT_CODE_PLUGIN_SCOPE_PANEL":"패널","TXT_CODE_PLUGIN_SELF_DISABLE":"플러그인 관리자는 자신을 비활성화할 수 없습니다. plugin.json에서 enabled 를 false 로 설정하세요.","TXT_CODE_PLUGIN_STATE_PENDING":"종속성 대기 중","TXT_CODE_PLUGIN_STATE_DISABLED":"비활성","TXT_CODE_PLUGIN_STATE_LOADING":"로드 중","TXT_CODE_PLUGIN_STATE_ACTIVE":"실행 중","TXT_CODE_PLUGIN_STATE_UNLOADING":"언로드 중","TXT_CODE_PLUGIN_RESTART_REQUIRED":"변경 사항을 적용하려면 서비스를 다시 시작하세요.","TXT_CODE_PLUGIN_SAVED_PENDING":"저장되었습니다. 플러그인 종속성을 기다리는 중입니다.","TXT_CODE_PLUGIN_FRONTEND_FAILED":"브라우저 플러그인 로드 실패","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"업데이트된 브라우저 런타임을 로드하려면 페이지를 새로 고치세요."}');
2701
+ module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"다음 노드의 동일한 플러그인도 비활성화할까요? 함께 처리할 노드를 선택하세요.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"다음 노드의 동일한 플러그인도 삭제할까요? 함께 처리할 노드를 선택하세요.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"다음 노드의 플러그인을 확인할 수 없습니다: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"다음 노드에서 플러그인 작업이 완료되지 않았습니다: {nodes}","TXT_CODE_PLUGIN_CONFIG":"플러그인 설정","TXT_CODE_PLUGIN_CANCEL":"취소","TXT_CODE_PLUGIN_DELETE":"삭제","TXT_CODE_PLUGIN_DELETE_CONFIRM":"npm 의존성을 제거합니다. 저장된 설정은 유지됩니다.","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"{name} 플러그인을 삭제할까요?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"핵심 플러그인과 개발용 소스 플러그인은 여기서 제거할 수 없습니다.","TXT_CODE_PLUGIN_DELETED":"플러그인을 삭제했습니다","TXT_CODE_PLUGIN_SAVE_SETTINGS":"설정 저장","TXT_CODE_PLUGIN_SAVE_REMINDER":"설정을 저장하는 것을 잊지 마세요!","TXT_CODE_PLUGIN_DISABLE":"비활성화","TXT_CODE_PLUGIN_DISABLED":"플러그인을 비활성화했습니다","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"이 플러그인이 제공하는 모든 구성 요소가 즉시 제거됩니다.","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"{name}을(를) 비활성화할까요?","TXT_CODE_PLUGIN_ENABLE":"활성화","TXT_CODE_PLUGIN_ENABLED":"플러그인을 활성화했습니다","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"웹 서버는 자신이 제공하는 패널에서 비활성화할 수 없습니다. data/plugin-overrides.json에서 plugins.server.enabled 를 false 로 설정하세요.","TXT_CODE_PLUGIN_IS_DISABLED":"이 플러그인은 비활성화되어 있습니다. 다시 활성화할 때까지 페이지, 경로, API를 사용할 수 없습니다.","TXT_CODE_PLUGIN_LOAD_FAILED":"이 플러그인을 불러오지 못했습니다","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"이 노드의 플러그인 목록을 가져올 수 없습니다.","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"해당 노드가 존재하지 않습니다.","TXT_CODE_PLUGIN_NODE_OFFLINE":"연결되지 않음","TXT_CODE_PLUGIN_NODE_SELECT":"노드 선택","TXT_CODE_PLUGIN_NO_CONFIG":"이 플러그인에는 구성 가능한 옵션이 없습니다.","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"미분류","TXT_CODE_PLUGIN_GROUP_ADD":"그룹 추가","TXT_CODE_PLUGIN_GROUP_EDIT":"플러그인 그룹 편집","TXT_CODE_PLUGIN_GROUP_RENAME":"그룹 이름 변경","TXT_CODE_PLUGIN_GROUP_DELETE":"그룹 삭제","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"{name} 그룹을 삭제하시겠습니까?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"그룹과 플러그인 할당이 삭제됩니다. 플러그인 자체는 삭제되지 않습니다.","TXT_CODE_PLUGIN_GROUP_NAME":"그룹 이름","TXT_CODE_PLUGIN_SCOPE_NODE":"노드","TXT_CODE_PLUGIN_SCOPE_PANEL":"패널","TXT_CODE_PLUGIN_SELF_DISABLE":"플러그인 관리자는 자신을 비활성화할 수 없습니다. data/plugin-overrides.json에서 plugins.config.enabled 를 false 로 설정하세요.","TXT_CODE_PLUGIN_STATE_PENDING":"종속성 대기 중","TXT_CODE_PLUGIN_STATE_DISABLED":"비활성","TXT_CODE_PLUGIN_STATE_LOADING":"로드 중","TXT_CODE_PLUGIN_STATE_ACTIVE":"실행 중","TXT_CODE_PLUGIN_STATE_UNLOADING":"언로드 중","TXT_CODE_PLUGIN_RESTART_REQUIRED":"변경 사항을 적용하려면 서비스를 다시 시작하세요.","TXT_CODE_PLUGIN_SAVED_PENDING":"저장되었습니다. 플러그인 종속성을 기다리는 중입니다.","TXT_CODE_PLUGIN_FRONTEND_FAILED":"브라우저 플러그인 로드 실패","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"업데이트된 브라우저 런타임을 로드하려면 페이지를 새로 고치세요.","TXT_CODE_PLUGIN_NPM_INSTALL":"플러그인 설치 / 업데이트","TXT_CODE_PLUGIN_NPM_PACKAGE":"npm 패키지 이름","TXT_CODE_PLUGIN_NPM_VERSION":"버전 또는 태그 (기본값: latest)","TXT_CODE_PLUGIN_NPM_INSTALLED":"플러그인이 설치되고 동기화되었습니다"}');
2192
2702
 
2193
2703
  /***/ },
2194
2704
 
2195
2705
  /***/ "./plugins/config/src/i18n/pt_BR.json"
2196
2706
  (module) {
2197
2707
 
2198
- module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"Desativar também o plugin correspondente nos seguintes nós? Selecione os nós que deseja incluir.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"Remover também o plugin correspondente dos seguintes nós? Selecione os nós que deseja incluir.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"Não foi possível verificar os plugins nestes nós: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"A operação do plugin não foi concluída nestes nós: {nodes}","TXT_CODE_PLUGIN_CONFIG":"Configuracao de plugins","TXT_CODE_PLUGIN_CANCEL":"Cancelar","TXT_CODE_PLUGIN_DELETE":"Remover","TXT_CODE_PLUGIN_DELETE_CONFIRM":"Os arquivos do plugin e as configurações salvas serão removidos permanentemente.","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"Remover {name}?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"Plugins are installed as npm dependencies; remove them with npm.","TXT_CODE_PLUGIN_DELETED":"Plugin removido","TXT_CODE_PLUGIN_SAVE_SETTINGS":"Salvar configurações","TXT_CODE_PLUGIN_SAVE_REMINDER":"Lembre-se de salvar as configurações!","TXT_CODE_PLUGIN_DISABLE":"Desativar","TXT_CODE_PLUGIN_DISABLED":"Plugin desativado","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"Tudo o que este plugin fornece é removido de imediato.","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"Desativar {name}?","TXT_CODE_PLUGIN_ENABLE":"Ativar","TXT_CODE_PLUGIN_ENABLED":"Plugin ativado","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"O servidor web não pode ser desativado pelo painel que ele mesmo serve. Defina enabled como false no plugin.json dele.","TXT_CODE_PLUGIN_IS_DISABLED":"Este plugin está desativado. Suas páginas, rotas e API ficam indisponíveis até ser ativado novamente.","TXT_CODE_PLUGIN_LOAD_FAILED":"Falha ao carregar este plugin","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"Não foi possível listar os plugins deste nó.","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"Esse nó não existe.","TXT_CODE_PLUGIN_NODE_OFFLINE":"não conectado","TXT_CODE_PLUGIN_NODE_SELECT":"Selecionar um nó","TXT_CODE_PLUGIN_NO_CONFIG":"Este plugin nao possui opcoes configuraveis.","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"Não atribuídos","TXT_CODE_PLUGIN_GROUP_ADD":"Adicionar grupo","TXT_CODE_PLUGIN_GROUP_EDIT":"Editar grupo de plugins","TXT_CODE_PLUGIN_GROUP_RENAME":"Renomear grupo","TXT_CODE_PLUGIN_GROUP_DELETE":"Excluir grupo","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"Excluir o grupo {name}?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"O grupo e suas associações de plugins serão removidos. Os plugins não serão excluídos.","TXT_CODE_PLUGIN_GROUP_NAME":"Nome do grupo","TXT_CODE_PLUGIN_SCOPE_NODE":"Nós","TXT_CODE_PLUGIN_SCOPE_PANEL":"Painel","TXT_CODE_PLUGIN_SELF_DISABLE":"O gerenciador de plugins não pode desativar a si mesmo. Defina enabled como false no plugin.json dele.","TXT_CODE_PLUGIN_STATE_PENDING":"Aguardando dependências","TXT_CODE_PLUGIN_STATE_DISABLED":"Desativado","TXT_CODE_PLUGIN_STATE_LOADING":"Carregando","TXT_CODE_PLUGIN_STATE_ACTIVE":"Em execução","TXT_CODE_PLUGIN_STATE_UNLOADING":"Descarregando","TXT_CODE_PLUGIN_RESTART_REQUIRED":"Reinicie o serviço para aplicar a alteração.","TXT_CODE_PLUGIN_SAVED_PENDING":"Salvo; aguardando dependências do plugin.","TXT_CODE_PLUGIN_FRONTEND_FAILED":"Falha no plugin do navegador","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"Atualize a página para carregar o novo ambiente do navegador."}');
2708
+ module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"Desativar também o plugin correspondente nos seguintes nós? Selecione os nós que deseja incluir.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"Remover também o plugin correspondente dos seguintes nós? Selecione os nós que deseja incluir.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"Não foi possível verificar os plugins nestes nós: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"A operação do plugin não foi concluída nestes nós: {nodes}","TXT_CODE_PLUGIN_CONFIG":"Configuracao de plugins","TXT_CODE_PLUGIN_CANCEL":"Cancelar","TXT_CODE_PLUGIN_DELETE":"Remover","TXT_CODE_PLUGIN_DELETE_CONFIRM":"A dependência npm será desinstalada. As configurações salvas serão mantidas.","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"Remover {name}?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"Plugins essenciais e de código-fonte não podem ser desinstalados aqui.","TXT_CODE_PLUGIN_DELETED":"Plugin removido","TXT_CODE_PLUGIN_SAVE_SETTINGS":"Salvar configurações","TXT_CODE_PLUGIN_SAVE_REMINDER":"Lembre-se de salvar as configurações!","TXT_CODE_PLUGIN_DISABLE":"Desativar","TXT_CODE_PLUGIN_DISABLED":"Plugin desativado","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"Tudo o que este plugin fornece é removido de imediato.","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"Desativar {name}?","TXT_CODE_PLUGIN_ENABLE":"Ativar","TXT_CODE_PLUGIN_ENABLED":"Plugin ativado","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"O servidor web não pode ser desativado pelo painel que ele mesmo serve. Defina plugins.server.enabled como false no data/plugin-overrides.json dele.","TXT_CODE_PLUGIN_IS_DISABLED":"Este plugin está desativado. Suas páginas, rotas e API ficam indisponíveis até ser ativado novamente.","TXT_CODE_PLUGIN_LOAD_FAILED":"Falha ao carregar este plugin","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"Não foi possível listar os plugins deste nó.","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"Esse nó não existe.","TXT_CODE_PLUGIN_NODE_OFFLINE":"não conectado","TXT_CODE_PLUGIN_NODE_SELECT":"Selecionar um nó","TXT_CODE_PLUGIN_NO_CONFIG":"Este plugin nao possui opcoes configuraveis.","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"Não atribuídos","TXT_CODE_PLUGIN_GROUP_ADD":"Adicionar grupo","TXT_CODE_PLUGIN_GROUP_EDIT":"Editar grupo de plugins","TXT_CODE_PLUGIN_GROUP_RENAME":"Renomear grupo","TXT_CODE_PLUGIN_GROUP_DELETE":"Excluir grupo","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"Excluir o grupo {name}?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"O grupo e suas associações de plugins serão removidos. Os plugins não serão excluídos.","TXT_CODE_PLUGIN_GROUP_NAME":"Nome do grupo","TXT_CODE_PLUGIN_SCOPE_NODE":"Nós","TXT_CODE_PLUGIN_SCOPE_PANEL":"Painel","TXT_CODE_PLUGIN_SELF_DISABLE":"O gerenciador de plugins não pode desativar a si mesmo. Defina plugins.config.enabled como false no data/plugin-overrides.json dele.","TXT_CODE_PLUGIN_STATE_PENDING":"Aguardando dependências","TXT_CODE_PLUGIN_STATE_DISABLED":"Desativado","TXT_CODE_PLUGIN_STATE_LOADING":"Carregando","TXT_CODE_PLUGIN_STATE_ACTIVE":"Em execução","TXT_CODE_PLUGIN_STATE_UNLOADING":"Descarregando","TXT_CODE_PLUGIN_RESTART_REQUIRED":"Reinicie o serviço para aplicar a alteração.","TXT_CODE_PLUGIN_SAVED_PENDING":"Salvo; aguardando dependências do plugin.","TXT_CODE_PLUGIN_FRONTEND_FAILED":"Falha no plugin do navegador","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"Atualize a página para carregar o novo ambiente do navegador.","TXT_CODE_PLUGIN_NPM_INSTALL":"Instalar / atualizar plugin","TXT_CODE_PLUGIN_NPM_PACKAGE":"Nome do pacote npm","TXT_CODE_PLUGIN_NPM_VERSION":"Versão ou tag (latest por padrão)","TXT_CODE_PLUGIN_NPM_INSTALLED":"Plugin instalado e sincronizado"}');
2199
2709
 
2200
2710
  /***/ },
2201
2711
 
2202
2712
  /***/ "./plugins/config/src/i18n/ru_RU.json"
2203
2713
  (module) {
2204
2714
 
2205
- module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"Отключить соответствующий плагин также на следующих узлах? Выберите нужные узлы.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"Удалить соответствующий плагин также со следующих узлов? Выберите нужные узлы.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"Не удалось проверить плагины на этих узлах: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"Операция с плагином не завершена на этих узлах: {nodes}","TXT_CODE_PLUGIN_CONFIG":"Настройка плагинов","TXT_CODE_PLUGIN_CANCEL":"Отмена","TXT_CODE_PLUGIN_DELETE":"Удалить","TXT_CODE_PLUGIN_DELETE_CONFIRM":"Файлы плагина и сохранённые настройки будут удалены без возможности восстановления.","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"Удалить {name}?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"Plugins are installed as npm dependencies; remove them with npm.","TXT_CODE_PLUGIN_DELETED":"Плагин удалён","TXT_CODE_PLUGIN_SAVE_SETTINGS":"Сохранить настройки","TXT_CODE_PLUGIN_SAVE_REMINDER":"Не забудьте сохранить настройки!","TXT_CODE_PLUGIN_DISABLE":"Отключить","TXT_CODE_PLUGIN_DISABLED":"Плагин отключён","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"Всё, что предоставляет этот плагин, будет удалено сразу.","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"Отключить {name}?","TXT_CODE_PLUGIN_ENABLE":"Включить","TXT_CODE_PLUGIN_ENABLED":"Плагин включён","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"Веб-сервер нельзя отключить из панели, которую он сам и обслуживает. Укажите enabled: false в его plugin.json.","TXT_CODE_PLUGIN_IS_DISABLED":"Этот плагин отключён. Его страницы, маршруты и API недоступны, пока он не будет включён снова.","TXT_CODE_PLUGIN_LOAD_FAILED":"Не удалось загрузить этот плагин","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"Не удалось получить список плагинов этого узла.","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"Такого узла не существует.","TXT_CODE_PLUGIN_NODE_OFFLINE":"не подключён","TXT_CODE_PLUGIN_NODE_SELECT":"Выберите узел","TXT_CODE_PLUGIN_NO_CONFIG":"У этого плагина нет настраиваемых параметров.","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"Без группы","TXT_CODE_PLUGIN_GROUP_ADD":"Добавить группу","TXT_CODE_PLUGIN_GROUP_EDIT":"Редактировать группу плагинов","TXT_CODE_PLUGIN_GROUP_RENAME":"Переименовать группу","TXT_CODE_PLUGIN_GROUP_DELETE":"Удалить группу","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"Удалить группу {name}?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"Группа и привязанные к ней плагины будут удалены из списка. Сами плагины удалены не будут.","TXT_CODE_PLUGIN_GROUP_NAME":"Название группы","TXT_CODE_PLUGIN_SCOPE_NODE":"Узлы","TXT_CODE_PLUGIN_SCOPE_PANEL":"Панель","TXT_CODE_PLUGIN_SELF_DISABLE":"Менеджер плагинов не может отключить сам себя. Укажите enabled: false в его plugin.json.","TXT_CODE_PLUGIN_STATE_PENDING":"Ожидание зависимостей","TXT_CODE_PLUGIN_STATE_DISABLED":"Отключён","TXT_CODE_PLUGIN_STATE_LOADING":"Загрузка","TXT_CODE_PLUGIN_STATE_ACTIVE":"Работает","TXT_CODE_PLUGIN_STATE_UNLOADING":"Выгрузка","TXT_CODE_PLUGIN_RESTART_REQUIRED":"Перезапустите службу, чтобы применить изменение.","TXT_CODE_PLUGIN_SAVED_PENDING":"Сохранено; ожидание зависимостей плагина.","TXT_CODE_PLUGIN_FRONTEND_FAILED":"Ошибка плагина браузера","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"Обновите страницу для загрузки новой среды браузера."}');
2715
+ module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"Отключить соответствующий плагин также на следующих узлах? Выберите нужные узлы.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"Удалить соответствующий плагин также со следующих узлов? Выберите нужные узлы.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"Не удалось проверить плагины на этих узлах: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"Операция с плагином не завершена на этих узлах: {nodes}","TXT_CODE_PLUGIN_CONFIG":"Настройка плагинов","TXT_CODE_PLUGIN_CANCEL":"Отмена","TXT_CODE_PLUGIN_DELETE":"Удалить","TXT_CODE_PLUGIN_DELETE_CONFIRM":"Зависимость npm будет удалена. Сохранённые настройки останутся.","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"Удалить {name}?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"Основные плагины и плагины из исходного кода нельзя удалить здесь.","TXT_CODE_PLUGIN_DELETED":"Плагин удалён","TXT_CODE_PLUGIN_SAVE_SETTINGS":"Сохранить настройки","TXT_CODE_PLUGIN_SAVE_REMINDER":"Не забудьте сохранить настройки!","TXT_CODE_PLUGIN_DISABLE":"Отключить","TXT_CODE_PLUGIN_DISABLED":"Плагин отключён","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"Всё, что предоставляет этот плагин, будет удалено сразу.","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"Отключить {name}?","TXT_CODE_PLUGIN_ENABLE":"Включить","TXT_CODE_PLUGIN_ENABLED":"Плагин включён","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"Веб-сервер нельзя отключить из панели, которую он сам и обслуживает. Укажите plugins.server.enabled: false в его data/plugin-overrides.json.","TXT_CODE_PLUGIN_IS_DISABLED":"Этот плагин отключён. Его страницы, маршруты и API недоступны, пока он не будет включён снова.","TXT_CODE_PLUGIN_LOAD_FAILED":"Не удалось загрузить этот плагин","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"Не удалось получить список плагинов этого узла.","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"Такого узла не существует.","TXT_CODE_PLUGIN_NODE_OFFLINE":"не подключён","TXT_CODE_PLUGIN_NODE_SELECT":"Выберите узел","TXT_CODE_PLUGIN_NO_CONFIG":"У этого плагина нет настраиваемых параметров.","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"Без группы","TXT_CODE_PLUGIN_GROUP_ADD":"Добавить группу","TXT_CODE_PLUGIN_GROUP_EDIT":"Редактировать группу плагинов","TXT_CODE_PLUGIN_GROUP_RENAME":"Переименовать группу","TXT_CODE_PLUGIN_GROUP_DELETE":"Удалить группу","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"Удалить группу {name}?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"Группа и привязанные к ней плагины будут удалены из списка. Сами плагины удалены не будут.","TXT_CODE_PLUGIN_GROUP_NAME":"Название группы","TXT_CODE_PLUGIN_SCOPE_NODE":"Узлы","TXT_CODE_PLUGIN_SCOPE_PANEL":"Панель","TXT_CODE_PLUGIN_SELF_DISABLE":"Менеджер плагинов не может отключить сам себя. Укажите plugins.config.enabled: false в его data/plugin-overrides.json.","TXT_CODE_PLUGIN_STATE_PENDING":"Ожидание зависимостей","TXT_CODE_PLUGIN_STATE_DISABLED":"Отключён","TXT_CODE_PLUGIN_STATE_LOADING":"Загрузка","TXT_CODE_PLUGIN_STATE_ACTIVE":"Работает","TXT_CODE_PLUGIN_STATE_UNLOADING":"Выгрузка","TXT_CODE_PLUGIN_RESTART_REQUIRED":"Перезапустите службу, чтобы применить изменение.","TXT_CODE_PLUGIN_SAVED_PENDING":"Сохранено; ожидание зависимостей плагина.","TXT_CODE_PLUGIN_FRONTEND_FAILED":"Ошибка плагина браузера","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"Обновите страницу для загрузки новой среды браузера.","TXT_CODE_PLUGIN_NPM_INSTALL":"Установить / обновить плагин","TXT_CODE_PLUGIN_NPM_PACKAGE":"Имя пакета npm","TXT_CODE_PLUGIN_NPM_VERSION":"Версия или тег (по умолчанию latest)","TXT_CODE_PLUGIN_NPM_INSTALLED":"Плагин установлен и синхронизирован"}');
2206
2716
 
2207
2717
  /***/ },
2208
2718
 
2209
2719
  /***/ "./plugins/config/src/i18n/th_TH.json"
2210
2720
  (module) {
2211
2721
 
2212
- module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"ต้องการปิดใช้งานปลั๊กอินเดียวกันบนโหนดต่อไปนี้ด้วยหรือไม่? เลือกโหนดที่ต้องการดำเนินการด้วย","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"ต้องการลบปลั๊กอินเดียวกันออกจากโหนดต่อไปนี้ด้วยหรือไม่? เลือกโหนดที่ต้องการดำเนินการด้วย","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"ไม่สามารถตรวจสอบปลั๊กอินบนโหนดเหล่านี้ได้: {nodes}","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"การดำเนินการกับปลั๊กอินบนโหนดเหล่านี้ไม่สำเร็จ: {nodes}","TXT_CODE_PLUGIN_CONFIG":"การกำหนดค่าปลั๊กอิน","TXT_CODE_PLUGIN_CANCEL":"ยกเลิก","TXT_CODE_PLUGIN_DELETE":"ลบ","TXT_CODE_PLUGIN_DELETE_CONFIRM":"ไฟล์ปลั๊กอินและการตั้งค่าที่บันทึกไว้จะถูกลบอย่างถาวร","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"ลบ {name} หรือไม่?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"Plugins are installed as npm dependencies; remove them with npm.","TXT_CODE_PLUGIN_DELETED":"ลบปลั๊กอินแล้ว","TXT_CODE_PLUGIN_SAVE_SETTINGS":"บันทึกการตั้งค่า","TXT_CODE_PLUGIN_SAVE_REMINDER":"อย่าลืมบันทึกการตั้งค่า!","TXT_CODE_PLUGIN_DISABLE":"ปิดใช้งาน","TXT_CODE_PLUGIN_DISABLED":"ปิดใช้งานปลั๊กอินแล้ว","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"ทุกอย่างที่ปลั๊กอินนี้ให้มาจะถูกลบออกทันที","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"ปิดใช้งาน {name} หรือไม่?","TXT_CODE_PLUGIN_ENABLE":"เปิดใช้งาน","TXT_CODE_PLUGIN_ENABLED":"เปิดใช้งานปลั๊กอินแล้ว","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"ไม่สามารถปิดใช้งานเว็บเซิร์ฟเวอร์จากแผงควบคุมที่ตัวมันเองให้บริการอยู่ กรุณาตั้ง enabled เป็น false ใน plugin.json ของมันแทน","TXT_CODE_PLUGIN_IS_DISABLED":"ปลั๊กอินนี้ถูกปิดใช้งาน หน้า เส้นทาง และ API จะใช้ไม่ได้จนกว่าจะเปิดใช้งานอีกครั้ง","TXT_CODE_PLUGIN_LOAD_FAILED":"โหลดปลั๊กอินนี้ไม่สำเร็จ","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"ไม่สามารถแสดงรายการปลั๊กอินของโหนดนี้ได้","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"ไม่มีโหนดนี้","TXT_CODE_PLUGIN_NODE_OFFLINE":"ไม่ได้เชื่อมต่อ","TXT_CODE_PLUGIN_NODE_SELECT":"เลือกโหนด","TXT_CODE_PLUGIN_NO_CONFIG":"ปลั๊กอินนี้ไม่มีตัวเลือกที่กำหนดค่าได้","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"ยังไม่ได้จัดกลุ่ม","TXT_CODE_PLUGIN_GROUP_ADD":"เพิ่มกลุ่ม","TXT_CODE_PLUGIN_GROUP_EDIT":"แก้ไขกลุ่มปลั๊กอิน","TXT_CODE_PLUGIN_GROUP_RENAME":"เปลี่ยนชื่อกลุ่ม","TXT_CODE_PLUGIN_GROUP_DELETE":"ลบกลุ่ม","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"ลบกลุ่ม {name} หรือไม่","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"กลุ่มและการกำหนดปลั๊กอินจะถูกลบ ปลั๊กอินจะไม่ถูกลบ","TXT_CODE_PLUGIN_GROUP_NAME":"ชื่อกลุ่ม","TXT_CODE_PLUGIN_SCOPE_NODE":"โหนด","TXT_CODE_PLUGIN_SCOPE_PANEL":"แผงควบคุม","TXT_CODE_PLUGIN_SELF_DISABLE":"ตัวจัดการปลั๊กอินปิดใช้งานตัวเองไม่ได้ กรุณาตั้ง enabled เป็น false ใน plugin.json ของมันแทน","TXT_CODE_PLUGIN_STATE_PENDING":"กำลังรอส่วนที่ต้องพึ่งพา","TXT_CODE_PLUGIN_STATE_DISABLED":"ปิดใช้งาน","TXT_CODE_PLUGIN_STATE_LOADING":"กำลังโหลด","TXT_CODE_PLUGIN_STATE_ACTIVE":"กำลังทำงาน","TXT_CODE_PLUGIN_STATE_UNLOADING":"กำลังยกเลิกการโหลด","TXT_CODE_PLUGIN_RESTART_REQUIRED":"รีสตาร์ทบริการเพื่อใช้การเปลี่ยนแปลงนี้","TXT_CODE_PLUGIN_SAVED_PENDING":"บันทึกแล้ว กำลังรอส่วนที่ปลั๊กอินต้องพึ่งพา","TXT_CODE_PLUGIN_FRONTEND_FAILED":"ปลั๊กอินเบราว์เซอร์ล้มเหลว","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"รีเฟรชหน้าเพื่อโหลดรันไทม์เบราว์เซอร์ที่อัปเดต"}');
2722
+ module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"ต้องการปิดใช้งานปลั๊กอินเดียวกันบนโหนดต่อไปนี้ด้วยหรือไม่? เลือกโหนดที่ต้องการดำเนินการด้วย","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"ต้องการลบปลั๊กอินเดียวกันออกจากโหนดต่อไปนี้ด้วยหรือไม่? เลือกโหนดที่ต้องการดำเนินการด้วย","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"ไม่สามารถตรวจสอบปลั๊กอินบนโหนดเหล่านี้ได้: {nodes}","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"การดำเนินการกับปลั๊กอินบนโหนดเหล่านี้ไม่สำเร็จ: {nodes}","TXT_CODE_PLUGIN_CONFIG":"การกำหนดค่าปลั๊กอิน","TXT_CODE_PLUGIN_CANCEL":"ยกเลิก","TXT_CODE_PLUGIN_DELETE":"ลบ","TXT_CODE_PLUGIN_DELETE_CONFIRM":"จะถอนการติดตั้งแพ็กเกจ npm โดยเก็บการตั้งค่าที่บันทึกไว้","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"ลบ {name} หรือไม่?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"ไม่สามารถถอนการติดตั้งปลั๊กอินหลักและปลั๊กอินซอร์สโค้ดที่นี่ได้","TXT_CODE_PLUGIN_DELETED":"ลบปลั๊กอินแล้ว","TXT_CODE_PLUGIN_SAVE_SETTINGS":"บันทึกการตั้งค่า","TXT_CODE_PLUGIN_SAVE_REMINDER":"อย่าลืมบันทึกการตั้งค่า!","TXT_CODE_PLUGIN_DISABLE":"ปิดใช้งาน","TXT_CODE_PLUGIN_DISABLED":"ปิดใช้งานปลั๊กอินแล้ว","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"ทุกอย่างที่ปลั๊กอินนี้ให้มาจะถูกลบออกทันที","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"ปิดใช้งาน {name} หรือไม่?","TXT_CODE_PLUGIN_ENABLE":"เปิดใช้งาน","TXT_CODE_PLUGIN_ENABLED":"เปิดใช้งานปลั๊กอินแล้ว","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"ไม่สามารถปิดใช้งานเว็บเซิร์ฟเวอร์จากแผงควบคุมที่ตัวมันเองให้บริการอยู่ กรุณาตั้ง plugins.server.enabled เป็น false ใน data/plugin-overrides.json ของมันแทน","TXT_CODE_PLUGIN_IS_DISABLED":"ปลั๊กอินนี้ถูกปิดใช้งาน หน้า เส้นทาง และ API จะใช้ไม่ได้จนกว่าจะเปิดใช้งานอีกครั้ง","TXT_CODE_PLUGIN_LOAD_FAILED":"โหลดปลั๊กอินนี้ไม่สำเร็จ","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"ไม่สามารถแสดงรายการปลั๊กอินของโหนดนี้ได้","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"ไม่มีโหนดนี้","TXT_CODE_PLUGIN_NODE_OFFLINE":"ไม่ได้เชื่อมต่อ","TXT_CODE_PLUGIN_NODE_SELECT":"เลือกโหนด","TXT_CODE_PLUGIN_NO_CONFIG":"ปลั๊กอินนี้ไม่มีตัวเลือกที่กำหนดค่าได้","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"ยังไม่ได้จัดกลุ่ม","TXT_CODE_PLUGIN_GROUP_ADD":"เพิ่มกลุ่ม","TXT_CODE_PLUGIN_GROUP_EDIT":"แก้ไขกลุ่มปลั๊กอิน","TXT_CODE_PLUGIN_GROUP_RENAME":"เปลี่ยนชื่อกลุ่ม","TXT_CODE_PLUGIN_GROUP_DELETE":"ลบกลุ่ม","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"ลบกลุ่ม {name} หรือไม่","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"กลุ่มและการกำหนดปลั๊กอินจะถูกลบ ปลั๊กอินจะไม่ถูกลบ","TXT_CODE_PLUGIN_GROUP_NAME":"ชื่อกลุ่ม","TXT_CODE_PLUGIN_SCOPE_NODE":"โหนด","TXT_CODE_PLUGIN_SCOPE_PANEL":"แผงควบคุม","TXT_CODE_PLUGIN_SELF_DISABLE":"ตัวจัดการปลั๊กอินปิดใช้งานตัวเองไม่ได้ กรุณาตั้ง plugins.config.enabled เป็น false ใน data/plugin-overrides.json ของมันแทน","TXT_CODE_PLUGIN_STATE_PENDING":"กำลังรอส่วนที่ต้องพึ่งพา","TXT_CODE_PLUGIN_STATE_DISABLED":"ปิดใช้งาน","TXT_CODE_PLUGIN_STATE_LOADING":"กำลังโหลด","TXT_CODE_PLUGIN_STATE_ACTIVE":"กำลังทำงาน","TXT_CODE_PLUGIN_STATE_UNLOADING":"กำลังยกเลิกการโหลด","TXT_CODE_PLUGIN_RESTART_REQUIRED":"รีสตาร์ทบริการเพื่อใช้การเปลี่ยนแปลงนี้","TXT_CODE_PLUGIN_SAVED_PENDING":"บันทึกแล้ว กำลังรอส่วนที่ปลั๊กอินต้องพึ่งพา","TXT_CODE_PLUGIN_FRONTEND_FAILED":"ปลั๊กอินเบราว์เซอร์ล้มเหลว","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"รีเฟรชหน้าเพื่อโหลดรันไทม์เบราว์เซอร์ที่อัปเดต","TXT_CODE_PLUGIN_NPM_INSTALL":"ติดตั้ง / อัปเดตปลั๊กอิน","TXT_CODE_PLUGIN_NPM_PACKAGE":"ชื่อแพ็กเกจ npm","TXT_CODE_PLUGIN_NPM_VERSION":"เวอร์ชันหรือแท็ก (ค่าเริ่มต้น latest)","TXT_CODE_PLUGIN_NPM_INSTALLED":"ติดตั้งและซิงค์ปลั๊กอินแล้ว"}');
2213
2723
 
2214
2724
  /***/ },
2215
2725
 
2216
2726
  /***/ "./plugins/config/src/i18n/tr_TR.json"
2217
2727
  (module) {
2218
2728
 
2219
- module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"Aşağıdaki düğümlerdeki aynı eklenti de devre dışı bırakılsın mı? Dahil edilecek düğümleri seçin.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"Aşağıdaki düğümlerdeki aynı eklenti de kaldırılsın mı? Dahil edilecek düğümleri seçin.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"Bu düğümlerdeki eklentiler kontrol edilemedi: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"Bu düğümlerde eklenti işlemi tamamlanamadı: {nodes}","TXT_CODE_PLUGIN_CONFIG":"Eklenti Yapilandirmasi","TXT_CODE_PLUGIN_CANCEL":"Iptal","TXT_CODE_PLUGIN_DELETE":"Kaldır","TXT_CODE_PLUGIN_DELETE_CONFIRM":"Eklenti dosyaları ve kaydedilmiş yapılandırması kalıcı olarak kaldırılacak.","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"{name} kaldırılsın mı?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"Plugins are installed as npm dependencies; remove them with npm.","TXT_CODE_PLUGIN_DELETED":"Eklenti kaldırıldı","TXT_CODE_PLUGIN_SAVE_SETTINGS":"Ayarları kaydet","TXT_CODE_PLUGIN_SAVE_REMINDER":"Ayarları kaydetmeyi unutmayın!","TXT_CODE_PLUGIN_DISABLE":"Devre dışı bırak","TXT_CODE_PLUGIN_DISABLED":"Eklenti devre dışı bırakıldı","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"Bu eklentinin sağladığı her şey hemen kaldırılır.","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"{name} devre dışı bırakılsın mı?","TXT_CODE_PLUGIN_ENABLE":"Etkinleştir","TXT_CODE_PLUGIN_ENABLED":"Eklenti etkinleştirildi","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"Web sunucusu, kendisinin sunduğu panel üzerinden devre dışı bırakılamaz. Bunun yerine plugin.json dosyasında enabled değerini false yapın.","TXT_CODE_PLUGIN_IS_DISABLED":"Bu eklenti devre dışı. Yeniden etkinleştirilene kadar sayfaları, yolları ve API si kullanılamaz.","TXT_CODE_PLUGIN_LOAD_FAILED":"Bu eklenti yüklenemedi","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"Bu düğümün eklentileri listelenemedi.","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"Böyle bir düğüm yok.","TXT_CODE_PLUGIN_NODE_OFFLINE":"bağlı değil","TXT_CODE_PLUGIN_NODE_SELECT":"Bir düğüm seçin","TXT_CODE_PLUGIN_NO_CONFIG":"Bu eklentinin yapilandirilabilir secenegi yok.","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"Atanmamış","TXT_CODE_PLUGIN_GROUP_ADD":"Grup ekle","TXT_CODE_PLUGIN_GROUP_EDIT":"Eklenti grubunu düzenle","TXT_CODE_PLUGIN_GROUP_RENAME":"Grubu yeniden adlandır","TXT_CODE_PLUGIN_GROUP_DELETE":"Grubu sil","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"{name} grubu silinsin mi?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"Grup ve eklenti atamaları kaldırılacak. Eklentilerin kendisi silinmeyecek.","TXT_CODE_PLUGIN_GROUP_NAME":"Grup adı","TXT_CODE_PLUGIN_SCOPE_NODE":"Düğümler","TXT_CODE_PLUGIN_SCOPE_PANEL":"Panel","TXT_CODE_PLUGIN_SELF_DISABLE":"Eklenti yöneticisi kendisini devre dışı bırakamaz. Bunun yerine plugin.json dosyasında enabled değerini false yapın.","TXT_CODE_PLUGIN_STATE_PENDING":"Bağımlılıklar bekleniyor","TXT_CODE_PLUGIN_STATE_DISABLED":"Devre dışı","TXT_CODE_PLUGIN_STATE_LOADING":"Yükleniyor","TXT_CODE_PLUGIN_STATE_ACTIVE":"Çalışıyor","TXT_CODE_PLUGIN_STATE_UNLOADING":"Kaldırılıyor","TXT_CODE_PLUGIN_RESTART_REQUIRED":"Değişikliği uygulamak için hizmeti yeniden başlatın.","TXT_CODE_PLUGIN_SAVED_PENDING":"Kaydedildi; eklenti bağımlılıkları bekleniyor.","TXT_CODE_PLUGIN_FRONTEND_FAILED":"Tarayıcı eklentisi başarısız oldu","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"Güncellenen tarayıcı çalışma zamanını yüklemek için sayfayı yenileyin."}');
2729
+ module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"Aşağıdaki düğümlerdeki aynı eklenti de devre dışı bırakılsın mı? Dahil edilecek düğümleri seçin.","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"Aşağıdaki düğümlerdeki aynı eklenti de kaldırılsın mı? Dahil edilecek düğümleri seçin.","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"Bu düğümlerdeki eklentiler kontrol edilemedi: {nodes}.","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"Bu düğümlerde eklenti işlemi tamamlanamadı: {nodes}","TXT_CODE_PLUGIN_CONFIG":"Eklenti Yapilandirmasi","TXT_CODE_PLUGIN_CANCEL":"Iptal","TXT_CODE_PLUGIN_DELETE":"Kaldır","TXT_CODE_PLUGIN_DELETE_CONFIRM":"npm bağımlılığı kaldırılacak. Kaydedilen ayarlar korunacak.","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"{name} kaldırılsın mı?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"Temel eklentiler ve kaynak kod eklentileri buradan kaldırılamaz.","TXT_CODE_PLUGIN_DELETED":"Eklenti kaldırıldı","TXT_CODE_PLUGIN_SAVE_SETTINGS":"Ayarları kaydet","TXT_CODE_PLUGIN_SAVE_REMINDER":"Ayarları kaydetmeyi unutmayın!","TXT_CODE_PLUGIN_DISABLE":"Devre dışı bırak","TXT_CODE_PLUGIN_DISABLED":"Eklenti devre dışı bırakıldı","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"Bu eklentinin sağladığı her şey hemen kaldırılır.","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"{name} devre dışı bırakılsın mı?","TXT_CODE_PLUGIN_ENABLE":"Etkinleştir","TXT_CODE_PLUGIN_ENABLED":"Eklenti etkinleştirildi","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"Web sunucusu, kendisinin sunduğu panel üzerinden devre dışı bırakılamaz. Bunun yerine data/plugin-overrides.json dosyasında plugins.server.enabled değerini false yapın.","TXT_CODE_PLUGIN_IS_DISABLED":"Bu eklenti devre dışı. Yeniden etkinleştirilene kadar sayfaları, yolları ve API si kullanılamaz.","TXT_CODE_PLUGIN_LOAD_FAILED":"Bu eklenti yüklenemedi","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"Bu düğümün eklentileri listelenemedi.","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"Böyle bir düğüm yok.","TXT_CODE_PLUGIN_NODE_OFFLINE":"bağlı değil","TXT_CODE_PLUGIN_NODE_SELECT":"Bir düğüm seçin","TXT_CODE_PLUGIN_NO_CONFIG":"Bu eklentinin yapilandirilabilir secenegi yok.","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"Atanmamış","TXT_CODE_PLUGIN_GROUP_ADD":"Grup ekle","TXT_CODE_PLUGIN_GROUP_EDIT":"Eklenti grubunu düzenle","TXT_CODE_PLUGIN_GROUP_RENAME":"Grubu yeniden adlandır","TXT_CODE_PLUGIN_GROUP_DELETE":"Grubu sil","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"{name} grubu silinsin mi?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"Grup ve eklenti atamaları kaldırılacak. Eklentilerin kendisi silinmeyecek.","TXT_CODE_PLUGIN_GROUP_NAME":"Grup adı","TXT_CODE_PLUGIN_SCOPE_NODE":"Düğümler","TXT_CODE_PLUGIN_SCOPE_PANEL":"Panel","TXT_CODE_PLUGIN_SELF_DISABLE":"Eklenti yöneticisi kendisini devre dışı bırakamaz. Bunun yerine data/plugin-overrides.json dosyasında plugins.config.enabled değerini false yapın.","TXT_CODE_PLUGIN_STATE_PENDING":"Bağımlılıklar bekleniyor","TXT_CODE_PLUGIN_STATE_DISABLED":"Devre dışı","TXT_CODE_PLUGIN_STATE_LOADING":"Yükleniyor","TXT_CODE_PLUGIN_STATE_ACTIVE":"Çalışıyor","TXT_CODE_PLUGIN_STATE_UNLOADING":"Kaldırılıyor","TXT_CODE_PLUGIN_RESTART_REQUIRED":"Değişikliği uygulamak için hizmeti yeniden başlatın.","TXT_CODE_PLUGIN_SAVED_PENDING":"Kaydedildi; eklenti bağımlılıkları bekleniyor.","TXT_CODE_PLUGIN_FRONTEND_FAILED":"Tarayıcı eklentisi başarısız oldu","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"Güncellenen tarayıcı çalışma zamanını yüklemek için sayfayı yenileyin.","TXT_CODE_PLUGIN_NPM_INSTALL":"Eklenti yükle / güncelle","TXT_CODE_PLUGIN_NPM_PACKAGE":"npm paket adı","TXT_CODE_PLUGIN_NPM_VERSION":"Sürüm veya etiket (varsayılan: latest)","TXT_CODE_PLUGIN_NPM_INSTALLED":"Eklenti yüklendi ve eşitlendi"}');
2220
2730
 
2221
2731
  /***/ },
2222
2732
 
2223
2733
  /***/ "./plugins/config/src/i18n/zh_CN.json"
2224
2734
  (module) {
2225
2735
 
2226
- module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"是否同时禁用以下节点上的对应插件?请勾选需要同步操作的节点。","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"是否同时删除以下节点上的对应插件?请勾选需要同步操作的节点。","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"无法检查以下节点的插件:{nodes}。","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"以下节点上的插件操作未完成:{nodes}","TXT_CODE_PLUGIN_CONFIG":"插件配置","TXT_CODE_PLUGIN_CANCEL":"取消","TXT_CODE_PLUGIN_DELETE":"删除插件","TXT_CODE_PLUGIN_DELETE_CONFIRM":"插件文件和已保存的配置将被永久删除。","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"确定删除 {name}?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"插件以 npm 依赖形式安装,请使用 npm 卸载。","TXT_CODE_PLUGIN_DELETED":"插件已删除","TXT_CODE_PLUGIN_SAVE_SETTINGS":"保存配置","TXT_CODE_PLUGIN_SAVE_REMINDER":"记得保存配置!","TXT_CODE_PLUGIN_DISABLE":"禁用","TXT_CODE_PLUGIN_DISABLED":"插件已禁用","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"该插件提供的所有组件都会被立即移除。","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"确定禁用 {name}?","TXT_CODE_PLUGIN_ENABLE":"启用","TXT_CODE_PLUGIN_ENABLED":"插件已启用","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"Web 服务器无法从它自己提供的页面上禁用,请改为在其 plugin.json 中把 enabled 设为 false。","TXT_CODE_PLUGIN_IS_DISABLED":"此插件已禁用,重新启用前其页面、路由与接口均不可用。","TXT_CODE_PLUGIN_LOAD_FAILED":"此插件加载失败","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"无法读取该节点的插件列表。","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"该节点不存在。","TXT_CODE_PLUGIN_NODE_OFFLINE":"未连接","TXT_CODE_PLUGIN_NODE_SELECT":"选择节点","TXT_CODE_PLUGIN_NO_CONFIG":"此插件没有可配置项","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"未分组","TXT_CODE_PLUGIN_GROUP_ADD":"添加分组","TXT_CODE_PLUGIN_GROUP_EDIT":"编辑插件分组","TXT_CODE_PLUGIN_GROUP_RENAME":"重命名分组","TXT_CODE_PLUGIN_GROUP_DELETE":"删除分组","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"删除分组“{name}”?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"将删除该分组及其插件归属,插件本身不会被删除。","TXT_CODE_PLUGIN_GROUP_NAME":"分组名称","TXT_CODE_PLUGIN_SCOPE_NODE":"节点","TXT_CODE_PLUGIN_SCOPE_PANEL":"面板","TXT_CODE_PLUGIN_SELF_DISABLE":"插件管理自身无法被禁用,请改为在其 plugin.json 中把 enabled 设为 false。","TXT_CODE_PLUGIN_STATE_PENDING":"等待依赖","TXT_CODE_PLUGIN_STATE_DISABLED":"已禁用","TXT_CODE_PLUGIN_STATE_LOADING":"加载中","TXT_CODE_PLUGIN_STATE_ACTIVE":"运行中","TXT_CODE_PLUGIN_STATE_UNLOADING":"卸载中","TXT_CODE_PLUGIN_RESTART_REQUIRED":"需要重启服务才能应用此更改。","TXT_CODE_PLUGIN_SAVED_PENDING":"已保存,正在等待插件依赖。","TXT_CODE_PLUGIN_FRONTEND_FAILED":"浏览器插件加载失败","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"需要刷新页面才能加载更新后的浏览器运行时。"}');
2736
+ module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"是否同时禁用以下节点上的对应插件?请勾选需要同步操作的节点。","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"是否同时删除以下节点上的对应插件?请勾选需要同步操作的节点。","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"无法检查以下节点的插件:{nodes}。","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"以下节点上的插件操作未完成:{nodes}","TXT_CODE_PLUGIN_CONFIG":"插件配置","TXT_CODE_PLUGIN_CANCEL":"取消","TXT_CODE_PLUGIN_DELETE":"删除插件","TXT_CODE_PLUGIN_DELETE_CONFIRM":"将卸载此插件的 npm 依赖,保留已保存的配置。","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"确定删除 {name}?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"核心插件和开发环境的源码插件无法在此卸载。","TXT_CODE_PLUGIN_DELETED":"插件已删除","TXT_CODE_PLUGIN_SAVE_SETTINGS":"保存配置","TXT_CODE_PLUGIN_SAVE_REMINDER":"记得保存配置!","TXT_CODE_PLUGIN_DISABLE":"禁用","TXT_CODE_PLUGIN_DISABLED":"插件已禁用","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"该插件提供的所有组件都会被立即移除。","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"确定禁用 {name}?","TXT_CODE_PLUGIN_ENABLE":"启用","TXT_CODE_PLUGIN_ENABLED":"插件已启用","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"Web 服务器无法从它自己提供的页面上禁用,请改为在其 data/plugin-overrides.json 中把 plugins.server.enabled 设为 false。","TXT_CODE_PLUGIN_IS_DISABLED":"此插件已禁用,重新启用前其页面、路由与接口均不可用。","TXT_CODE_PLUGIN_LOAD_FAILED":"此插件加载失败","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"无法读取该节点的插件列表。","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"该节点不存在。","TXT_CODE_PLUGIN_NODE_OFFLINE":"未连接","TXT_CODE_PLUGIN_NODE_SELECT":"选择节点","TXT_CODE_PLUGIN_NO_CONFIG":"此插件没有可配置项","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"未分组","TXT_CODE_PLUGIN_GROUP_ADD":"添加分组","TXT_CODE_PLUGIN_GROUP_EDIT":"编辑插件分组","TXT_CODE_PLUGIN_GROUP_RENAME":"重命名分组","TXT_CODE_PLUGIN_GROUP_DELETE":"删除分组","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"删除分组“{name}”?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"将删除该分组及其插件归属,插件本身不会被删除。","TXT_CODE_PLUGIN_GROUP_NAME":"分组名称","TXT_CODE_PLUGIN_SCOPE_NODE":"节点","TXT_CODE_PLUGIN_SCOPE_PANEL":"面板","TXT_CODE_PLUGIN_SELF_DISABLE":"插件管理自身无法被禁用,请改为在其 data/plugin-overrides.json 中把 plugins.config.enabled 设为 false。","TXT_CODE_PLUGIN_STATE_PENDING":"等待依赖","TXT_CODE_PLUGIN_STATE_DISABLED":"已禁用","TXT_CODE_PLUGIN_STATE_LOADING":"加载中","TXT_CODE_PLUGIN_STATE_ACTIVE":"运行中","TXT_CODE_PLUGIN_STATE_UNLOADING":"卸载中","TXT_CODE_PLUGIN_RESTART_REQUIRED":"需要重启服务才能应用此更改。","TXT_CODE_PLUGIN_SAVED_PENDING":"已保存,正在等待插件依赖。","TXT_CODE_PLUGIN_FRONTEND_FAILED":"浏览器插件加载失败","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"需要刷新页面才能加载更新后的浏览器运行时。","TXT_CODE_PLUGIN_NPM_INSTALL":"安装 / 更新插件","TXT_CODE_PLUGIN_NPM_PACKAGE":"npm 包名","TXT_CODE_PLUGIN_NPM_VERSION":"版本号或标签(默认 latest)","TXT_CODE_PLUGIN_NPM_INSTALLED":"插件已安装并同步"}');
2227
2737
 
2228
2738
  /***/ },
2229
2739
 
2230
2740
  /***/ "./plugins/config/src/i18n/zh_TW.json"
2231
2741
  (module) {
2232
2742
 
2233
- module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"是否同時停用以下節點上的對應外掛?請勾選需要同步操作的節點。","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"是否同時刪除以下節點上的對應外掛?請勾選需要同步操作的節點。","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"無法檢查以下節點的外掛:{nodes}。","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"以下節點上的外掛操作未完成:{nodes}","TXT_CODE_PLUGIN_CONFIG":"插件設定","TXT_CODE_PLUGIN_CANCEL":"取消","TXT_CODE_PLUGIN_DELETE":"刪除外掛","TXT_CODE_PLUGIN_DELETE_CONFIRM":"外掛檔案與已儲存的設定將會永久刪除。","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"確定刪除 {name}?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"外掛以 npm 相依形式安裝,請使用 npm 解除安裝。","TXT_CODE_PLUGIN_DELETED":"外掛已刪除","TXT_CODE_PLUGIN_SAVE_SETTINGS":"儲存設定","TXT_CODE_PLUGIN_SAVE_REMINDER":"記得儲存設定!","TXT_CODE_PLUGIN_DISABLE":"停用","TXT_CODE_PLUGIN_DISABLED":"外掛已停用","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"該外掛提供的所有元件都會被立即移除。","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"確定停用 {name}?","TXT_CODE_PLUGIN_ENABLE":"啟用","TXT_CODE_PLUGIN_ENABLED":"外掛已啟用","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"Web 伺服器無法從它自己提供的頁面上停用,請改為在其 plugin.json 中把 enabled 設為 false。","TXT_CODE_PLUGIN_IS_DISABLED":"此外掛已停用,重新啟用前其頁面、路由與介面皆不可用。","TXT_CODE_PLUGIN_LOAD_FAILED":"此外掛載入失敗","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"無法讀取該節點的外掛清單。","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"該節點不存在。","TXT_CODE_PLUGIN_NODE_OFFLINE":"未連線","TXT_CODE_PLUGIN_NODE_SELECT":"選擇節點","TXT_CODE_PLUGIN_NO_CONFIG":"此插件沒有可設定項目","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"未分組","TXT_CODE_PLUGIN_GROUP_ADD":"新增分組","TXT_CODE_PLUGIN_GROUP_EDIT":"編輯外掛分組","TXT_CODE_PLUGIN_GROUP_RENAME":"重新命名分組","TXT_CODE_PLUGIN_GROUP_DELETE":"刪除分組","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"刪除分組「{name}」?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"將刪除該分組及其插件歸屬,插件本身不會被刪除。","TXT_CODE_PLUGIN_GROUP_NAME":"分組名稱","TXT_CODE_PLUGIN_SCOPE_NODE":"節點","TXT_CODE_PLUGIN_SCOPE_PANEL":"面板","TXT_CODE_PLUGIN_SELF_DISABLE":"外掛管理本身無法被停用,請改為在其 plugin.json 中把 enabled 設為 false。","TXT_CODE_PLUGIN_STATE_PENDING":"等待依賴","TXT_CODE_PLUGIN_STATE_DISABLED":"已停用","TXT_CODE_PLUGIN_STATE_LOADING":"載入中","TXT_CODE_PLUGIN_STATE_ACTIVE":"執行中","TXT_CODE_PLUGIN_STATE_UNLOADING":"卸載中","TXT_CODE_PLUGIN_RESTART_REQUIRED":"需要重新啟動服務才能套用此變更。","TXT_CODE_PLUGIN_SAVED_PENDING":"已儲存,正在等待外掛依賴。","TXT_CODE_PLUGIN_FRONTEND_FAILED":"瀏覽器外掛載入失敗","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"需要重新整理頁面才能載入更新後的瀏覽器執行階段。"}');
2743
+ module.exports = /*#__PURE__*/JSON.parse('{"TXT_CODE_PLUGIN_NODE_DISABLE_CONFIRM":"是否同時停用以下節點上的對應外掛?請勾選需要同步操作的節點。","TXT_CODE_PLUGIN_NODE_DELETE_CONFIRM":"是否同時刪除以下節點上的對應外掛?請勾選需要同步操作的節點。","TXT_CODE_PLUGIN_NODE_CHECK_FAILED":"無法檢查以下節點的外掛:{nodes}。","TXT_CODE_PLUGIN_NODE_ACTION_FAILED":"以下節點上的外掛操作未完成:{nodes}","TXT_CODE_PLUGIN_CONFIG":"插件設定","TXT_CODE_PLUGIN_CANCEL":"取消","TXT_CODE_PLUGIN_DELETE":"刪除外掛","TXT_CODE_PLUGIN_DELETE_CONFIRM":"將解除安裝此外掛的 npm 相依套件,保留已儲存的設定。","TXT_CODE_PLUGIN_DELETE_CONFIRM_TITLE":"確定刪除 {name}?","TXT_CODE_PLUGIN_DELETE_UNAVAILABLE":"核心外掛與開發環境的原始碼外掛無法在此解除安裝。","TXT_CODE_PLUGIN_DELETED":"外掛已刪除","TXT_CODE_PLUGIN_SAVE_SETTINGS":"儲存設定","TXT_CODE_PLUGIN_SAVE_REMINDER":"記得儲存設定!","TXT_CODE_PLUGIN_DISABLE":"停用","TXT_CODE_PLUGIN_DISABLED":"外掛已停用","TXT_CODE_PLUGIN_DISABLE_CONFIRM":"該外掛提供的所有元件都會被立即移除。","TXT_CODE_PLUGIN_DISABLE_CONFIRM_TITLE":"確定停用 {name}?","TXT_CODE_PLUGIN_ENABLE":"啟用","TXT_CODE_PLUGIN_ENABLED":"外掛已啟用","TXT_CODE_PLUGIN_ESSENTIAL_DISABLE":"Web 伺服器無法從它自己提供的頁面上停用,請改為在其 data/plugin-overrides.json 中把 plugins.server.enabled 設為 false。","TXT_CODE_PLUGIN_IS_DISABLED":"此外掛已停用,重新啟用前其頁面、路由與介面皆不可用。","TXT_CODE_PLUGIN_LOAD_FAILED":"此外掛載入失敗","TXT_CODE_PLUGIN_NODE_LIST_FAILED":"無法讀取該節點的外掛清單。","TXT_CODE_PLUGIN_NODE_NOT_FOUND":"該節點不存在。","TXT_CODE_PLUGIN_NODE_OFFLINE":"未連線","TXT_CODE_PLUGIN_NODE_SELECT":"選擇節點","TXT_CODE_PLUGIN_NO_CONFIG":"此插件沒有可設定項目","TXT_CODE_PLUGIN_GROUP_UNASSIGNED":"未分組","TXT_CODE_PLUGIN_GROUP_ADD":"新增分組","TXT_CODE_PLUGIN_GROUP_EDIT":"編輯外掛分組","TXT_CODE_PLUGIN_GROUP_RENAME":"重新命名分組","TXT_CODE_PLUGIN_GROUP_DELETE":"刪除分組","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM_TITLE":"刪除分組「{name}」?","TXT_CODE_PLUGIN_GROUP_DELETE_CONFIRM":"將刪除該分組及其插件歸屬,插件本身不會被刪除。","TXT_CODE_PLUGIN_GROUP_NAME":"分組名稱","TXT_CODE_PLUGIN_SCOPE_NODE":"節點","TXT_CODE_PLUGIN_SCOPE_PANEL":"面板","TXT_CODE_PLUGIN_SELF_DISABLE":"外掛管理本身無法被停用,請改為在其 data/plugin-overrides.json 中把 plugins.config.enabled 設為 false。","TXT_CODE_PLUGIN_STATE_PENDING":"等待依賴","TXT_CODE_PLUGIN_STATE_DISABLED":"已停用","TXT_CODE_PLUGIN_STATE_LOADING":"載入中","TXT_CODE_PLUGIN_STATE_ACTIVE":"執行中","TXT_CODE_PLUGIN_STATE_UNLOADING":"卸載中","TXT_CODE_PLUGIN_RESTART_REQUIRED":"需要重新啟動服務才能套用此變更。","TXT_CODE_PLUGIN_SAVED_PENDING":"已儲存,正在等待外掛依賴。","TXT_CODE_PLUGIN_FRONTEND_FAILED":"瀏覽器外掛載入失敗","TXT_CODE_PLUGIN_REFRESH_REQUIRED":"需要重新整理頁面才能載入更新後的瀏覽器執行階段。","TXT_CODE_PLUGIN_NPM_INSTALL":"安裝 / 更新外掛","TXT_CODE_PLUGIN_NPM_PACKAGE":"npm 套件名稱","TXT_CODE_PLUGIN_NPM_VERSION":"版本或標籤(預設 latest)","TXT_CODE_PLUGIN_NPM_INSTALLED":"外掛已安裝並同步"}');
2234
2744
 
2235
2745
  /***/ }
2236
2746
 
@@ -2397,7 +2907,9 @@ function apply(ctx) {
2397
2907
  const groupsStorageId = (requestCtx) => String(ctx.identity.of(requestCtx).uuid || "anonymous");
2398
2908
  router.get("/groups", requireAdmin, async (requestCtx) => {
2399
2909
  var _a;
2400
- const stored = (await ctx.storage.getStorage().load(PLUGIN_GROUPS_CATEGORY, StoredPluginGroups, groupsStorageId(requestCtx)));
2910
+ const stored = (await ctx.storage
2911
+ .getStorage()
2912
+ .load(PLUGIN_GROUPS_CATEGORY, StoredPluginGroups, groupsStorageId(requestCtx)));
2401
2913
  requestCtx.body = (_a = stored === null || stored === void 0 ? void 0 : stored.groups) !== null && _a !== void 0 ? _a : [];
2402
2914
  });
2403
2915
  router.put("/groups", requireAdmin, async (requestCtx) => {
@@ -2423,6 +2935,14 @@ function apply(ctx) {
2423
2935
  await ctx.plugins.remove(String(requestCtx.request.query.id));
2424
2936
  requestCtx.body = { removed: true };
2425
2937
  });
2938
+ router.post("/npm/install", requireAdmin, ctx.middleware.validator({ body: { name: String } }), async (requestCtx) => {
2939
+ var _a;
2940
+ const payload = requestCtx.request.body;
2941
+ requestCtx.body = await ctx.plugins.install({
2942
+ name: payload.name.trim(),
2943
+ version: ((_a = payload.version) === null || _a === void 0 ? void 0 : _a.trim()) || undefined
2944
+ });
2945
+ });
2426
2946
  // The node half. `remote` is resolved here rather than injected at the top, so
2427
2947
  // removing `plugins/node` takes the node routes away and leaves the rest of the
2428
2948
  // page working.
@@ -2463,22 +2983,29 @@ function apply(ctx) {
2463
2983
  // switch off is the daemon's own business, and its refusal arrives as a
2464
2984
  // protocol error that the response protocol turns into this envelope.
2465
2985
  const record = await new RemoteRequest(node).request("plugin/enabled", { id, enabled });
2466
- // A daemon binds its protocol events onto each socket as that socket
2467
- // connects (`service/router.ts`), so a handler that has just appeared —
2468
- // or just gone — is invisible to the connection we are holding. The node
2469
- // is reconnected here, which is the only thing that makes the change
2470
- // actually reachable; the daemon has already answered by now.
2986
+ // Older daemons bind routes per socket; reconnect after their reply
2987
+ // so newly enabled handlers remain available there too.
2471
2988
  node.refreshReconnect();
2472
2989
  requestCtx.body = record;
2473
2990
  });
2474
2991
  nodeRouter.delete("/", requireAdmin, ctx.middleware.validator({ query: { daemonId: String, id: String } }), async (requestCtx) => {
2475
2992
  const node = nodeOf(requestCtx);
2476
2993
  // Removing unloads the plugin's scope before the files go, which can
2477
- // outlast the default request window; the market uninstall waits 30s too.
2478
- await new RemoteRequest(node).request("plugin/remove", { id: String(requestCtx.request.query.id) }, 30000);
2994
+ // outlast the default request window.
2995
+ await new RemoteRequest(node).request("plugin/remove", { id: String(requestCtx.request.query.id) }, 10 * 60 * 1000);
2479
2996
  node.refreshReconnect();
2480
2997
  requestCtx.body = { removed: true };
2481
2998
  });
2999
+ nodeRouter.post("/npm/install", requireAdmin, ctx.middleware.validator({ query: { daemonId: String }, body: { name: String } }), async (requestCtx) => {
3000
+ var _a;
3001
+ const node = nodeOf(requestCtx);
3002
+ const payload = requestCtx.request.body;
3003
+ requestCtx.body = await new RemoteRequest(node).request("plugin/npm/install", {
3004
+ name: payload.name.trim(),
3005
+ version: ((_a = payload.version) === null || _a === void 0 ? void 0 : _a.trim()) || undefined
3006
+ }, 10 * 60 * 1000);
3007
+ node.refreshReconnect();
3008
+ });
2482
3009
  // A daemon plugin's configuration, described by the plugin itself and
2483
3010
  // rendered by the same generic form. Nothing about the form lives here.
2484
3011
  nodeRouter.get("/settings", requireAdmin, ctx.middleware.validator({ query: { daemonId: String, id: String } }), async (requestCtx) => {