@nocobase/server 2.1.0-alpha.2 → 2.1.0-alpha.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/LICENSE +201 -661
  2. package/README.md +79 -10
  3. package/lib/acl/available-action.js +1 -1
  4. package/lib/aes-encryptor.js +3 -2
  5. package/lib/ai/create-docs-index.js +2 -1
  6. package/lib/app-supervisor/app-options-factory.d.ts +1 -0
  7. package/lib/app-supervisor/index.js +15 -1
  8. package/lib/app-supervisor/main-only-adapter.d.ts +1 -1
  9. package/lib/app-supervisor/main-only-adapter.js +17 -12
  10. package/lib/application.d.ts +1 -2
  11. package/lib/application.js +3 -24
  12. package/lib/commands/create-migration.js +1 -1
  13. package/lib/commands/install.js +3 -1
  14. package/lib/commands/pm.js +7 -0
  15. package/lib/commands/start.js +2 -2
  16. package/lib/commands/upgrade.js +3 -1
  17. package/lib/event-queue.js +1 -1
  18. package/lib/gateway/index.d.ts +13 -3
  19. package/lib/gateway/index.js +135 -13
  20. package/lib/gateway/utils.d.ts +17 -0
  21. package/lib/gateway/utils.js +115 -0
  22. package/lib/helper.js +33 -1
  23. package/lib/index.d.ts +1 -0
  24. package/lib/index.js +2 -0
  25. package/lib/main-data-source.js +1 -1
  26. package/lib/plugin-manager/deps.js +2 -1
  27. package/lib/plugin-manager/options/resource.d.ts +11 -1
  28. package/lib/plugin-manager/options/resource.js +153 -53
  29. package/lib/plugin-manager/plugin-manager.d.ts +7 -2
  30. package/lib/plugin-manager/plugin-manager.js +56 -43
  31. package/lib/plugin-manager/utils.d.ts +7 -1
  32. package/lib/plugin-manager/utils.js +33 -9
  33. package/lib/plugin.js +43 -2
  34. package/lib/pub-sub-manager/handler-manager.d.ts +1 -0
  35. package/lib/pub-sub-manager/handler-manager.js +11 -0
  36. package/lib/pub-sub-manager/pub-sub-manager.js +2 -1
  37. package/lib/swagger/app.d.ts +102 -0
  38. package/lib/swagger/app.js +124 -0
  39. package/lib/swagger/base.d.ts +244 -0
  40. package/lib/swagger/base.js +292 -0
  41. package/lib/swagger/collections.d.ts +996 -0
  42. package/lib/swagger/collections.js +1264 -0
  43. package/lib/swagger/index.d.ts +1774 -0
  44. package/lib/swagger/index.js +70 -0
  45. package/lib/swagger/pm.d.ts +462 -0
  46. package/lib/swagger/pm.js +422 -0
  47. package/lib/sync-message-manager.js +8 -1
  48. package/lib/worker-mode.d.ts +19 -0
  49. package/lib/worker-mode.js +67 -0
  50. package/package.json +18 -18
  51. package/lib/swagger/index.json +0 -1569
package/lib/plugin.js CHANGED
@@ -213,6 +213,34 @@ const _Plugin = class _Plugin {
213
213
  log: this.log
214
214
  });
215
215
  await toolsLoader.load();
216
+ const mcpLoader = new import_ai.MCPLoader(this.ai, {
217
+ scan: {
218
+ basePath,
219
+ pattern: ["mcp/*.ts", "mcp/*.js", "!mcp/*.d.ts"]
220
+ },
221
+ log: this.log
222
+ });
223
+ await mcpLoader.load();
224
+ const skillsLoader = new import_ai.SkillsLoader(this.ai, {
225
+ scan: { basePath, pattern: ["**/skills/**/SKILLS.md"] },
226
+ log: this.log
227
+ });
228
+ await skillsLoader.load();
229
+ const employeeLoader = new import_ai.AIEmployeeLoader(this.ai, {
230
+ scan: {
231
+ basePath,
232
+ pattern: [
233
+ "**/ai-employees/*.ts",
234
+ "**/ai-employees/*/index.ts",
235
+ "**/ai-employees/*.js",
236
+ "**/ai-employees/*/index.js",
237
+ "**/ai-employees/*/prompt.md",
238
+ "!**/ai-employees/**/*.d.ts"
239
+ ]
240
+ },
241
+ log: this.log
242
+ });
243
+ await employeeLoader.load();
216
244
  }
217
245
  /**
218
246
  * @deprecated
@@ -234,6 +262,19 @@ const _Plugin = class _Plugin {
234
262
  ...this.options
235
263
  };
236
264
  }
265
+ const langMap = {
266
+ "zh-CN": "cn/",
267
+ "en-US": "",
268
+ "ja-JP": "ja/",
269
+ "ko-KR": "ko/",
270
+ "es-ES": "es/",
271
+ "pt-PT": "pt/",
272
+ "de-DE": "de",
273
+ "fr-FR": "fr/"
274
+ };
275
+ if (packageName.startsWith("@nocobase/plugin-")) {
276
+ packageJson.homepage = `https://v2.docs.nocobase.com/${langMap[locale] || ""}plugins/${packageName}`;
277
+ }
237
278
  const results = {
238
279
  ...this.options,
239
280
  keywords: packageJson.keywords,
@@ -241,7 +282,7 @@ const _Plugin = class _Plugin {
241
282
  changelogUrl: (0, import_plugin_manager.getExposeChangelogUrl)(packageName),
242
283
  displayName: packageJson[`displayName.${locale}`] || packageJson.displayName || name,
243
284
  description: packageJson[`description.${locale}`] || packageJson.description,
244
- homepage: packageJson[`homepage.${locale}`] || packageJson.homepage
285
+ homepage: packageJson.homepage
245
286
  };
246
287
  if (!options.withOutOpenFile) {
247
288
  const file = await import_fs.default.promises.realpath(
@@ -252,7 +293,7 @@ const _Plugin = class _Plugin {
252
293
  ...await (0, import_utils2.checkAndGetCompatible)(packageName),
253
294
  lastUpdated: (await import_fs.default.promises.stat(file)).ctime,
254
295
  file,
255
- updatable: file.startsWith(process.env.PLUGIN_STORAGE_PATH)
296
+ updatable: file.startsWith((0, import_utils.resolvePluginStoragePath)())
256
297
  };
257
298
  }
258
299
  return results;
@@ -29,6 +29,7 @@ export declare class HandlerManager {
29
29
  set(channel: string, callback: any, options: PubSubManagerSubscribeOptions): (wrappedMessage: any) => Promise<void>;
30
30
  get(channel: string, callback: any): any;
31
31
  delete(channel: string, callback: any): any;
32
+ cancelPendingDebounce(): void;
32
33
  reset(): void;
33
34
  each(callback: any): Promise<void>;
34
35
  }
@@ -129,7 +129,18 @@ const _HandlerManager = class _HandlerManager {
129
129
  headlerMap.delete(callback);
130
130
  return headler;
131
131
  }
132
+ cancelPendingDebounce() {
133
+ if (this.uniqueMessageHandlers) {
134
+ for (const handler of this.uniqueMessageHandlers.values()) {
135
+ if (typeof (handler == null ? void 0 : handler.cancel) === "function") {
136
+ handler.cancel();
137
+ }
138
+ }
139
+ this.uniqueMessageHandlers.clear();
140
+ }
141
+ }
132
142
  reset() {
143
+ this.cancelPendingDebounce();
133
144
  this.handlers = /* @__PURE__ */ new Map();
134
145
  this.uniqueMessageHandlers = /* @__PURE__ */ new Map();
135
146
  }
@@ -38,7 +38,7 @@ const createPubSubManager = /* @__PURE__ */ __name((app, options) => {
38
38
  app.on("afterStart", async () => {
39
39
  await pubSubManager.connect();
40
40
  });
41
- app.on("afterStop", async () => {
41
+ app.on("beforeStop", async () => {
42
42
  await pubSubManager.close();
43
43
  });
44
44
  return pubSubManager;
@@ -77,6 +77,7 @@ const _PubSubManager = class _PubSubManager {
77
77
  });
78
78
  }
79
79
  async close() {
80
+ this.handlerManager.cancelPendingDebounce();
80
81
  if (!this.adapter) {
81
82
  return;
82
83
  }
@@ -0,0 +1,102 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+ declare const _default: {
10
+ readonly '/app:getLang': {
11
+ readonly get: {
12
+ readonly tags: readonly ["app"];
13
+ readonly summary: "Get the current application language";
14
+ readonly description: "Return the current locale used by the server.";
15
+ readonly parameters: readonly [];
16
+ readonly responses: {
17
+ readonly 200: {
18
+ readonly description: "OK";
19
+ readonly content: {
20
+ readonly 'application/json': {
21
+ readonly schema: {
22
+ readonly type: "string";
23
+ };
24
+ };
25
+ };
26
+ };
27
+ };
28
+ };
29
+ };
30
+ readonly '/app:getInfo': {
31
+ readonly get: {
32
+ readonly tags: readonly ["app"];
33
+ readonly summary: "Get application metadata";
34
+ readonly description: "Return basic application information, including version and environment-related metadata.";
35
+ readonly parameters: readonly [];
36
+ readonly responses: {
37
+ readonly 200: {
38
+ readonly description: "OK";
39
+ readonly content: {
40
+ readonly 'application/json': {
41
+ readonly schema: {
42
+ readonly type: "object";
43
+ readonly additionalProperties: true;
44
+ };
45
+ };
46
+ };
47
+ };
48
+ };
49
+ };
50
+ };
51
+ readonly '/app:getPlugins': {
52
+ readonly get: {
53
+ readonly tags: readonly ["app"];
54
+ readonly summary: "List loaded plugins";
55
+ readonly description: "Return plugin metadata for the current application runtime.";
56
+ readonly parameters: readonly [];
57
+ readonly responses: {
58
+ readonly 200: {
59
+ readonly description: "OK";
60
+ readonly content: {
61
+ readonly 'application/json': {
62
+ readonly schema: {
63
+ readonly type: "array";
64
+ readonly items: {
65
+ readonly type: "object";
66
+ readonly additionalProperties: true;
67
+ };
68
+ };
69
+ };
70
+ };
71
+ };
72
+ };
73
+ };
74
+ };
75
+ readonly '/app:restart': {
76
+ readonly post: {
77
+ readonly tags: readonly ["app"];
78
+ readonly summary: "Restart the application";
79
+ readonly description: "Trigger an application restart asynchronously.";
80
+ readonly parameters: readonly [];
81
+ readonly responses: {
82
+ readonly 200: {
83
+ readonly description: "OK";
84
+ };
85
+ };
86
+ };
87
+ };
88
+ readonly '/app:clearCache': {
89
+ readonly post: {
90
+ readonly tags: readonly ["app"];
91
+ readonly summary: "Clear application cache";
92
+ readonly description: "Clear server-side caches used by the current application instance.";
93
+ readonly parameters: readonly [];
94
+ readonly responses: {
95
+ readonly 200: {
96
+ readonly description: "OK";
97
+ };
98
+ };
99
+ };
100
+ };
101
+ };
102
+ export default _default;
@@ -0,0 +1,124 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ var __defProp = Object.defineProperty;
11
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
12
+ var __getOwnPropNames = Object.getOwnPropertyNames;
13
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
14
+ var __export = (target, all) => {
15
+ for (var name in all)
16
+ __defProp(target, name, { get: all[name], enumerable: true });
17
+ };
18
+ var __copyProps = (to, from, except, desc) => {
19
+ if (from && typeof from === "object" || typeof from === "function") {
20
+ for (let key of __getOwnPropNames(from))
21
+ if (!__hasOwnProp.call(to, key) && key !== except)
22
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
23
+ }
24
+ return to;
25
+ };
26
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
27
+ var app_exports = {};
28
+ __export(app_exports, {
29
+ default: () => app_default
30
+ });
31
+ module.exports = __toCommonJS(app_exports);
32
+ var app_default = {
33
+ "/app:getLang": {
34
+ get: {
35
+ tags: ["app"],
36
+ summary: "Get the current application language",
37
+ description: "Return the current locale used by the server.",
38
+ parameters: [],
39
+ responses: {
40
+ 200: {
41
+ description: "OK",
42
+ content: {
43
+ "application/json": {
44
+ schema: {
45
+ type: "string"
46
+ }
47
+ }
48
+ }
49
+ }
50
+ }
51
+ }
52
+ },
53
+ "/app:getInfo": {
54
+ get: {
55
+ tags: ["app"],
56
+ summary: "Get application metadata",
57
+ description: "Return basic application information, including version and environment-related metadata.",
58
+ parameters: [],
59
+ responses: {
60
+ 200: {
61
+ description: "OK",
62
+ content: {
63
+ "application/json": {
64
+ schema: {
65
+ type: "object",
66
+ additionalProperties: true
67
+ }
68
+ }
69
+ }
70
+ }
71
+ }
72
+ }
73
+ },
74
+ "/app:getPlugins": {
75
+ get: {
76
+ tags: ["app"],
77
+ summary: "List loaded plugins",
78
+ description: "Return plugin metadata for the current application runtime.",
79
+ parameters: [],
80
+ responses: {
81
+ 200: {
82
+ description: "OK",
83
+ content: {
84
+ "application/json": {
85
+ schema: {
86
+ type: "array",
87
+ items: {
88
+ type: "object",
89
+ additionalProperties: true
90
+ }
91
+ }
92
+ }
93
+ }
94
+ }
95
+ }
96
+ }
97
+ },
98
+ "/app:restart": {
99
+ post: {
100
+ tags: ["app"],
101
+ summary: "Restart the application",
102
+ description: "Trigger an application restart asynchronously.",
103
+ parameters: [],
104
+ responses: {
105
+ 200: {
106
+ description: "OK"
107
+ }
108
+ }
109
+ }
110
+ },
111
+ "/app:clearCache": {
112
+ post: {
113
+ tags: ["app"],
114
+ summary: "Clear application cache",
115
+ description: "Clear server-side caches used by the current application instance.",
116
+ parameters: [],
117
+ responses: {
118
+ 200: {
119
+ description: "OK"
120
+ }
121
+ }
122
+ }
123
+ }
124
+ };
@@ -0,0 +1,244 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+ declare const _default: {
10
+ readonly openapi: "3.0.2";
11
+ readonly info: {
12
+ readonly title: "NocoBase API - Core";
13
+ };
14
+ readonly tags: readonly [{
15
+ readonly name: "$collection";
16
+ readonly description: "Data table";
17
+ }, {
18
+ readonly name: "$collection.$oneToOneAssociation";
19
+ readonly description: "One to one relationship";
20
+ }, {
21
+ readonly name: "$collection.$manyToOneAssociation";
22
+ readonly description: "Many to one relationship";
23
+ }, {
24
+ readonly name: "$collection.$oneToManyAssociation";
25
+ readonly description: "One to many relationship";
26
+ }, {
27
+ readonly name: "$collection.$manyToManyAssociation";
28
+ readonly description: "Many to many relationship";
29
+ }, {
30
+ readonly name: "app";
31
+ readonly description: "app";
32
+ }, {
33
+ readonly name: "pm";
34
+ readonly description: "pm";
35
+ }];
36
+ readonly components: {
37
+ readonly parameters: {
38
+ readonly collectionName: {
39
+ readonly required: true;
40
+ readonly name: "collectionName";
41
+ readonly in: "path";
42
+ readonly description: "Collection name";
43
+ readonly schema: {
44
+ readonly type: "string";
45
+ };
46
+ };
47
+ readonly collectionIndex: {
48
+ readonly required: true;
49
+ readonly name: "collectionIndex";
50
+ readonly in: "path";
51
+ readonly description: "Collection index";
52
+ readonly schema: {
53
+ readonly type: "integer";
54
+ readonly format: "int64";
55
+ };
56
+ };
57
+ readonly oneToOneAssociation: {
58
+ readonly required: true;
59
+ readonly name: "oneToOneAssociation";
60
+ readonly in: "path";
61
+ readonly description: "Association name";
62
+ readonly schema: {
63
+ readonly type: "string";
64
+ };
65
+ };
66
+ readonly manyToOneAssociation: {
67
+ readonly required: true;
68
+ readonly name: "manyToOneAssociation";
69
+ readonly in: "path";
70
+ readonly description: "Association name";
71
+ readonly schema: {
72
+ readonly type: "string";
73
+ };
74
+ };
75
+ readonly oneToManyAssociation: {
76
+ readonly required: true;
77
+ readonly name: "oneToManyAssociation";
78
+ readonly in: "path";
79
+ readonly description: "Association name";
80
+ readonly schema: {
81
+ readonly type: "string";
82
+ };
83
+ };
84
+ readonly manyToManyAssociation: {
85
+ readonly required: true;
86
+ readonly name: "manyToManyAssociation";
87
+ readonly in: "path";
88
+ readonly description: "Association name";
89
+ readonly schema: {
90
+ readonly type: "string";
91
+ };
92
+ };
93
+ readonly page: {
94
+ readonly name: "page";
95
+ readonly in: "query";
96
+ readonly description: "page number";
97
+ readonly required: false;
98
+ readonly schema: {
99
+ readonly type: "integer";
100
+ };
101
+ };
102
+ readonly pageSize: {
103
+ readonly name: "pageSize";
104
+ readonly in: "query";
105
+ readonly description: "page size";
106
+ readonly required: false;
107
+ readonly schema: {
108
+ readonly type: "integer";
109
+ };
110
+ };
111
+ readonly filterByTk: {
112
+ readonly name: "filterByTk";
113
+ readonly in: "query";
114
+ readonly description: "filter by TK(default by ID)";
115
+ readonly schema: {
116
+ readonly type: "string";
117
+ };
118
+ };
119
+ readonly filterByTks: {
120
+ readonly name: "filterByTks";
121
+ readonly in: "query";
122
+ readonly description: "filter by TKs(default by ID), example: `1,2,3`";
123
+ readonly schema: {
124
+ readonly type: "string";
125
+ };
126
+ };
127
+ readonly filter: {
128
+ readonly name: "filter";
129
+ readonly in: "query";
130
+ readonly description: "filter items";
131
+ readonly content: {
132
+ readonly 'application/json': {
133
+ readonly schema: {
134
+ readonly type: "object";
135
+ };
136
+ };
137
+ };
138
+ };
139
+ readonly sort: {
140
+ readonly name: "sort";
141
+ readonly in: "query";
142
+ readonly description: "sort items by fields, example: `-field1,-field2,field3`";
143
+ readonly schema: {
144
+ readonly oneOf: readonly [{
145
+ readonly type: "array";
146
+ readonly items: {
147
+ readonly type: "string";
148
+ };
149
+ readonly example: readonly ["-id", "createdAt"];
150
+ }, {
151
+ readonly type: "string";
152
+ readonly example: "-id,createdAt";
153
+ }];
154
+ };
155
+ };
156
+ readonly fields: {
157
+ readonly name: "fields";
158
+ readonly in: "query";
159
+ readonly description: "select fields, example: `field1,field2`";
160
+ readonly schema: {
161
+ readonly oneOf: readonly [{
162
+ readonly type: "array";
163
+ readonly items: {
164
+ readonly type: "string";
165
+ };
166
+ readonly example: readonly ["id", "createdAt"];
167
+ }, {
168
+ readonly type: "string";
169
+ readonly example: "id,createdAt";
170
+ }];
171
+ };
172
+ };
173
+ readonly except: {
174
+ readonly name: "except";
175
+ readonly in: "query";
176
+ readonly description: "except fields in results, example: `field1,field2`";
177
+ readonly schema: {
178
+ readonly oneOf: readonly [{
179
+ readonly type: "array";
180
+ readonly items: {
181
+ readonly type: "string";
182
+ };
183
+ readonly example: readonly ["id", "createdAt"];
184
+ }, {
185
+ readonly type: "string";
186
+ readonly example: "id,createdAt";
187
+ }];
188
+ };
189
+ };
190
+ readonly appends: {
191
+ readonly name: "appends";
192
+ readonly in: "query";
193
+ readonly description: "append associations in results, example: `assoc1,assoc2`";
194
+ readonly schema: {
195
+ readonly oneOf: readonly [{
196
+ readonly type: "array";
197
+ readonly items: {
198
+ readonly type: "string";
199
+ };
200
+ readonly example: readonly ["id", "createdAt"];
201
+ }, {
202
+ readonly type: "string";
203
+ readonly example: "id,createdAt";
204
+ }];
205
+ };
206
+ };
207
+ readonly whitelist: {
208
+ readonly name: "whitelist";
209
+ readonly in: "query";
210
+ readonly description: "whitelist for fields changes, example: `field1,field2`";
211
+ readonly schema: {
212
+ readonly oneOf: readonly [{
213
+ readonly type: "array";
214
+ readonly items: {
215
+ readonly type: "string";
216
+ };
217
+ readonly example: readonly ["id", "createdAt"];
218
+ }, {
219
+ readonly type: "string";
220
+ readonly example: "id,createdAt";
221
+ }];
222
+ };
223
+ };
224
+ readonly blacklist: {
225
+ readonly name: "blacklist";
226
+ readonly in: "query";
227
+ readonly description: "blacklist for fields changes, example: `field1,field2`";
228
+ readonly schema: {
229
+ readonly oneOf: readonly [{
230
+ readonly type: "array";
231
+ readonly items: {
232
+ readonly type: "string";
233
+ };
234
+ readonly example: readonly ["id", "createdAt"];
235
+ }, {
236
+ readonly type: "string";
237
+ readonly example: "id,createdAt";
238
+ }];
239
+ };
240
+ };
241
+ };
242
+ };
243
+ };
244
+ export default _default;