@nocobase/app-plugin-foundation 0.0.0-stage → 0.1.0-beta.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.
Files changed (252) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +96 -2
  3. package/dist/cli/index.d.ts +4 -0
  4. package/dist/cli/index.d.ts.map +1 -0
  5. package/dist/cli/index.js +16 -0
  6. package/dist/cli/index.js.map +1 -0
  7. package/dist/cli/module-manifest.d.ts +9 -0
  8. package/dist/cli/module-manifest.d.ts.map +1 -0
  9. package/dist/cli/module-manifest.js +12 -0
  10. package/dist/cli/module-manifest.js.map +1 -0
  11. package/dist/client/api.d.ts +19 -0
  12. package/dist/client/api.d.ts.map +1 -0
  13. package/dist/client/api.js +57 -0
  14. package/dist/client/api.js.map +1 -0
  15. package/dist/client/business-modules.d.ts +5 -0
  16. package/dist/client/business-modules.d.ts.map +1 -0
  17. package/dist/client/business-modules.js +87 -0
  18. package/dist/client/business-modules.js.map +1 -0
  19. package/dist/client/components/capability-icons.d.ts +4 -0
  20. package/dist/client/components/capability-icons.d.ts.map +1 -0
  21. package/dist/client/components/capability-icons.js +17 -0
  22. package/dist/client/components/capability-icons.js.map +1 -0
  23. package/dist/client/components/collections-browser.d.ts +7 -0
  24. package/dist/client/components/collections-browser.d.ts.map +1 -0
  25. package/dist/client/components/collections-browser.js +63 -0
  26. package/dist/client/components/collections-browser.js.map +1 -0
  27. package/dist/client/components/format.d.ts +7 -0
  28. package/dist/client/components/format.d.ts.map +1 -0
  29. package/dist/client/components/format.js +42 -0
  30. package/dist/client/components/format.js.map +1 -0
  31. package/dist/client/components/foundation-page.d.ts +16 -0
  32. package/dist/client/components/foundation-page.d.ts.map +1 -0
  33. package/dist/client/components/foundation-page.js +217 -0
  34. package/dist/client/components/foundation-page.js.map +1 -0
  35. package/dist/client/components/foundation-translation.d.ts +12 -0
  36. package/dist/client/components/foundation-translation.d.ts.map +1 -0
  37. package/dist/client/components/foundation-translation.js +19 -0
  38. package/dist/client/components/foundation-translation.js.map +1 -0
  39. package/dist/client/components/module-matrix.d.ts +9 -0
  40. package/dist/client/components/module-matrix.d.ts.map +1 -0
  41. package/dist/client/components/module-matrix.js +59 -0
  42. package/dist/client/components/module-matrix.js.map +1 -0
  43. package/dist/client/components/ui/button.d.ts +8 -0
  44. package/dist/client/components/ui/button.d.ts.map +1 -0
  45. package/dist/client/components/ui/button.js +35 -0
  46. package/dist/client/components/ui/button.js.map +1 -0
  47. package/dist/client/components/ui/collapsible.d.ts +7 -0
  48. package/dist/client/components/ui/collapsible.d.ts.map +1 -0
  49. package/dist/client/components/ui/collapsible.js +13 -0
  50. package/dist/client/components/ui/collapsible.js.map +1 -0
  51. package/dist/client/components/ui/dialog.d.ts +18 -0
  52. package/dist/client/components/ui/dialog.d.ts.map +1 -0
  53. package/dist/client/components/ui/dialog.js +37 -0
  54. package/dist/client/components/ui/dialog.js.map +1 -0
  55. package/dist/client/components/ui/input.d.ts +4 -0
  56. package/dist/client/components/ui/input.d.ts.map +1 -0
  57. package/dist/client/components/ui/input.js +8 -0
  58. package/dist/client/components/ui/input.js.map +1 -0
  59. package/dist/client/components/ui/table.d.ts +11 -0
  60. package/dist/client/components/ui/table.d.ts.map +1 -0
  61. package/dist/client/components/ui/table.js +28 -0
  62. package/dist/client/components/ui/table.js.map +1 -0
  63. package/dist/client/components/ui/tooltip.d.ts +8 -0
  64. package/dist/client/components/ui/tooltip.d.ts.map +1 -0
  65. package/dist/client/components/ui/tooltip.js +17 -0
  66. package/dist/client/components/ui/tooltip.js.map +1 -0
  67. package/dist/client/index.d.ts +6 -0
  68. package/dist/client/index.d.ts.map +1 -0
  69. package/dist/client/index.js +7 -0
  70. package/dist/client/index.js.map +1 -0
  71. package/dist/client/locales/de-DE.d.ts +4 -0
  72. package/dist/client/locales/de-DE.d.ts.map +1 -0
  73. package/dist/client/locales/de-DE.js +334 -0
  74. package/dist/client/locales/de-DE.js.map +1 -0
  75. package/dist/client/locales/en-US.d.ts +336 -0
  76. package/dist/client/locales/en-US.d.ts.map +1 -0
  77. package/dist/client/locales/en-US.js +334 -0
  78. package/dist/client/locales/en-US.js.map +1 -0
  79. package/dist/client/locales/es-ES.d.ts +4 -0
  80. package/dist/client/locales/es-ES.d.ts.map +1 -0
  81. package/dist/client/locales/es-ES.js +335 -0
  82. package/dist/client/locales/es-ES.js.map +1 -0
  83. package/dist/client/locales/fr-FR.d.ts +4 -0
  84. package/dist/client/locales/fr-FR.d.ts.map +1 -0
  85. package/dist/client/locales/fr-FR.js +335 -0
  86. package/dist/client/locales/fr-FR.js.map +1 -0
  87. package/dist/client/locales/id-ID.d.ts +4 -0
  88. package/dist/client/locales/id-ID.d.ts.map +1 -0
  89. package/dist/client/locales/id-ID.js +334 -0
  90. package/dist/client/locales/id-ID.js.map +1 -0
  91. package/dist/client/locales/index.d.ts +4 -0
  92. package/dist/client/locales/index.d.ts.map +1 -0
  93. package/dist/client/locales/index.js +14 -0
  94. package/dist/client/locales/index.js.map +1 -0
  95. package/dist/client/locales/ja-JP.d.ts +4 -0
  96. package/dist/client/locales/ja-JP.d.ts.map +1 -0
  97. package/dist/client/locales/ja-JP.js +334 -0
  98. package/dist/client/locales/ja-JP.js.map +1 -0
  99. package/dist/client/locales/pt-BR.d.ts +4 -0
  100. package/dist/client/locales/pt-BR.d.ts.map +1 -0
  101. package/dist/client/locales/pt-BR.js +335 -0
  102. package/dist/client/locales/pt-BR.js.map +1 -0
  103. package/dist/client/locales/vi-VN.d.ts +4 -0
  104. package/dist/client/locales/vi-VN.d.ts.map +1 -0
  105. package/dist/client/locales/vi-VN.js +334 -0
  106. package/dist/client/locales/vi-VN.js.map +1 -0
  107. package/dist/client/locales/zh-CN.d.ts +4 -0
  108. package/dist/client/locales/zh-CN.d.ts.map +1 -0
  109. package/dist/client/locales/zh-CN.js +334 -0
  110. package/dist/client/locales/zh-CN.js.map +1 -0
  111. package/dist/client/locales/zh-TW.d.ts +4 -0
  112. package/dist/client/locales/zh-TW.d.ts.map +1 -0
  113. package/dist/client/locales/zh-TW.js +334 -0
  114. package/dist/client/locales/zh-TW.js.map +1 -0
  115. package/dist/client/navigation.d.ts +8 -0
  116. package/dist/client/navigation.d.ts.map +1 -0
  117. package/dist/client/navigation.js +21 -0
  118. package/dist/client/navigation.js.map +1 -0
  119. package/dist/client/plugin.d.ts +11 -0
  120. package/dist/client/plugin.d.ts.map +1 -0
  121. package/dist/client/plugin.js +10 -0
  122. package/dist/client/plugin.js.map +1 -0
  123. package/dist/client/provider-inventory.d.ts +6 -0
  124. package/dist/client/provider-inventory.d.ts.map +1 -0
  125. package/dist/client/provider-inventory.js +49 -0
  126. package/dist/client/provider-inventory.js.map +1 -0
  127. package/dist/client/routes.d.ts +18 -0
  128. package/dist/client/routes.d.ts.map +1 -0
  129. package/dist/client/routes.js +41 -0
  130. package/dist/client/routes.js.map +1 -0
  131. package/dist/package.d.ts +2 -0
  132. package/dist/package.d.ts.map +1 -0
  133. package/dist/package.js +2 -0
  134. package/dist/package.js.map +1 -0
  135. package/dist/server/api-evidence.d.ts +13 -0
  136. package/dist/server/api-evidence.d.ts.map +1 -0
  137. package/dist/server/api-evidence.js +178 -0
  138. package/dist/server/api-evidence.js.map +1 -0
  139. package/dist/server/capabilities/data.d.ts +9 -0
  140. package/dist/server/capabilities/data.d.ts.map +1 -0
  141. package/dist/server/capabilities/data.js +143 -0
  142. package/dist/server/capabilities/data.js.map +1 -0
  143. package/dist/server/capabilities/index.d.ts +5 -0
  144. package/dist/server/capabilities/index.d.ts.map +1 -0
  145. package/dist/server/capabilities/index.js +24 -0
  146. package/dist/server/capabilities/index.js.map +1 -0
  147. package/dist/server/capabilities/intelligence.d.ts +4 -0
  148. package/dist/server/capabilities/intelligence.d.ts.map +1 -0
  149. package/dist/server/capabilities/intelligence.js +105 -0
  150. package/dist/server/capabilities/intelligence.js.map +1 -0
  151. package/dist/server/capabilities/messaging.d.ts +4 -0
  152. package/dist/server/capabilities/messaging.d.ts.map +1 -0
  153. package/dist/server/capabilities/messaging.js +108 -0
  154. package/dist/server/capabilities/messaging.js.map +1 -0
  155. package/dist/server/capabilities/people.d.ts +4 -0
  156. package/dist/server/capabilities/people.d.ts.map +1 -0
  157. package/dist/server/capabilities/people.js +151 -0
  158. package/dist/server/capabilities/people.js.map +1 -0
  159. package/dist/server/capabilities/platform.d.ts +10 -0
  160. package/dist/server/capabilities/platform.d.ts.map +1 -0
  161. package/dist/server/capabilities/platform.js +143 -0
  162. package/dist/server/capabilities/platform.js.map +1 -0
  163. package/dist/server/capabilities/processes.d.ts +3 -0
  164. package/dist/server/capabilities/processes.d.ts.map +1 -0
  165. package/dist/server/capabilities/processes.js +86 -0
  166. package/dist/server/capabilities/processes.js.map +1 -0
  167. package/dist/server/capabilities/types.d.ts +41 -0
  168. package/dist/server/capabilities/types.d.ts.map +1 -0
  169. package/dist/server/capabilities/types.js +23 -0
  170. package/dist/server/capabilities/types.js.map +1 -0
  171. package/dist/server/catalog.d.ts +3 -0
  172. package/dist/server/catalog.d.ts.map +1 -0
  173. package/dist/server/catalog.js +44 -0
  174. package/dist/server/catalog.js.map +1 -0
  175. package/dist/server/index.d.ts +6 -0
  176. package/dist/server/index.d.ts.map +1 -0
  177. package/dist/server/index.js +5 -0
  178. package/dist/server/index.js.map +1 -0
  179. package/dist/server/inventory.d.ts +54 -0
  180. package/dist/server/inventory.d.ts.map +1 -0
  181. package/dist/server/inventory.js +184 -0
  182. package/dist/server/inventory.js.map +1 -0
  183. package/dist/server/module-manifest.d.ts +10 -0
  184. package/dist/server/module-manifest.d.ts.map +1 -0
  185. package/dist/server/module-manifest.js +66 -0
  186. package/dist/server/module-manifest.js.map +1 -0
  187. package/dist/server/module-sources.d.ts +5 -0
  188. package/dist/server/module-sources.d.ts.map +1 -0
  189. package/dist/server/module-sources.js +482 -0
  190. package/dist/server/module-sources.js.map +1 -0
  191. package/dist/server/packages.d.ts +18 -0
  192. package/dist/server/packages.d.ts.map +1 -0
  193. package/dist/server/packages.js +62 -0
  194. package/dist/server/packages.js.map +1 -0
  195. package/dist/server/plugin.d.ts +4 -0
  196. package/dist/server/plugin.d.ts.map +1 -0
  197. package/dist/server/plugin.js +12 -0
  198. package/dist/server/plugin.js.map +1 -0
  199. package/dist/server/provider-inventory.d.ts +13 -0
  200. package/dist/server/provider-inventory.d.ts.map +1 -0
  201. package/dist/server/provider-inventory.js +180 -0
  202. package/dist/server/provider-inventory.js.map +1 -0
  203. package/dist/server/providers/foundation.d.ts +7 -0
  204. package/dist/server/providers/foundation.d.ts.map +1 -0
  205. package/dist/server/providers/foundation.js +24 -0
  206. package/dist/server/providers/foundation.js.map +1 -0
  207. package/dist/server/providers/index.d.ts +4 -0
  208. package/dist/server/providers/index.d.ts.map +1 -0
  209. package/dist/server/providers/index.js +6 -0
  210. package/dist/server/providers/index.js.map +1 -0
  211. package/dist/server/read-queue.d.ts +10 -0
  212. package/dist/server/read-queue.d.ts.map +1 -0
  213. package/dist/server/read-queue.js +50 -0
  214. package/dist/server/read-queue.js.map +1 -0
  215. package/dist/server/request-evidence.d.ts +14 -0
  216. package/dist/server/request-evidence.d.ts.map +1 -0
  217. package/dist/server/request-evidence.js +141 -0
  218. package/dist/server/request-evidence.js.map +1 -0
  219. package/dist/server/routes/index.d.ts +6 -0
  220. package/dist/server/routes/index.d.ts.map +1 -0
  221. package/dist/server/routes/index.js +77 -0
  222. package/dist/server/routes/index.js.map +1 -0
  223. package/dist/server/routes/schemas.d.ts +13 -0
  224. package/dist/server/routes/schemas.d.ts.map +1 -0
  225. package/dist/server/routes/schemas.js +160 -0
  226. package/dist/server/routes/schemas.js.map +1 -0
  227. package/dist/server/services/foundation.d.ts +44 -0
  228. package/dist/server/services/foundation.d.ts.map +1 -0
  229. package/dist/server/services/foundation.js +265 -0
  230. package/dist/server/services/foundation.js.map +1 -0
  231. package/dist/server/source-evidence.d.ts +26 -0
  232. package/dist/server/source-evidence.d.ts.map +1 -0
  233. package/dist/server/source-evidence.js +271 -0
  234. package/dist/server/source-evidence.js.map +1 -0
  235. package/dist/server/static-values.d.ts +16 -0
  236. package/dist/server/static-values.d.ts.map +1 -0
  237. package/dist/server/static-values.js +181 -0
  238. package/dist/server/static-values.js.map +1 -0
  239. package/dist/server/tokens.d.ts +18 -0
  240. package/dist/server/tokens.d.ts.map +1 -0
  241. package/dist/server/tokens.js +3 -0
  242. package/dist/server/tokens.js.map +1 -0
  243. package/dist/shared/available-capabilities.d.ts +6 -0
  244. package/dist/shared/available-capabilities.d.ts.map +1 -0
  245. package/dist/shared/available-capabilities.js +66 -0
  246. package/dist/shared/available-capabilities.js.map +1 -0
  247. package/dist/shared/foundation.d.ts +155 -0
  248. package/dist/shared/foundation.d.ts.map +1 -0
  249. package/dist/shared/foundation.js +39 -0
  250. package/dist/shared/foundation.js.map +1 -0
  251. package/package.json +106 -3
  252. package/skills/nocobase-app-plugin-foundation/SKILL.md +78 -0
@@ -0,0 +1,178 @@
1
+ import ts from 'typescript';
2
+ import { StaticValues } from './static-values.js';
3
+ import { objectProperty, returned, REPOSITORY_ACTIONS, } from './request-evidence.js';
4
+ /** Compose only routers reachable from the selected API exports, retaining method and handler boundaries. */
5
+ export function apiDependencies(entry, sources, analysis, providers) {
6
+ const endpoints = [];
7
+ const roots = new Set();
8
+ const visited = new Set();
9
+ const imported = (node, module, name) => (analysis.symbol(node)?.declarations ?? []).some((declaration) => {
10
+ if (!ts.isImportSpecifier(declaration) ||
11
+ (declaration.propertyName?.text ?? declaration.name.text) !== name)
12
+ return false;
13
+ const statement = declaration.parent.parent.parent;
14
+ return (ts.isImportDeclaration(statement) &&
15
+ ts.isStringLiteralLike(statement.moduleSpecifier) &&
16
+ statement.moduleSpecifier.text === module);
17
+ });
18
+ const identity = (node, seen = new Set()) => {
19
+ if (seen.has(node))
20
+ return undefined;
21
+ seen.add(node);
22
+ for (const value of analysis.values(node)) {
23
+ if (ts.isNewExpression(value) &&
24
+ imported(value.expression, 'hono', 'Hono'))
25
+ return value;
26
+ if (ts.isCallExpression(value) &&
27
+ ts.isPropertyAccessExpression(value.expression))
28
+ return identity(value.expression.expression, seen);
29
+ if (value !== node) {
30
+ const result = identity(value, seen);
31
+ if (result)
32
+ return result;
33
+ }
34
+ }
35
+ return undefined;
36
+ };
37
+ const repository = (call) => {
38
+ const option = call.arguments[0];
39
+ for (const config of option ? analysis.values(option) : []) {
40
+ if (!ts.isObjectLiteralExpression(config))
41
+ continue;
42
+ const declared = objectProperty(config, 'repositories');
43
+ for (const array of declared ? analysis.values(declared) : []) {
44
+ if (!ts.isArrayLiteralExpression(array))
45
+ continue;
46
+ for (const element of array.elements)
47
+ for (const exposure of analysis.values(element)) {
48
+ if (!ts.isObjectLiteralExpression(exposure))
49
+ continue;
50
+ const name = objectProperty(exposure, 'name');
51
+ const actions = objectProperty(exposure, 'actions');
52
+ const collection = objectProperty(exposure, 'collection');
53
+ const names = name
54
+ ? analysis.values(name).filter(ts.isStringLiteralLike)
55
+ : [];
56
+ const collectionName = collection
57
+ ? analysis.values(collection).find(ts.isStringLiteralLike)?.text
58
+ : names[0]?.text;
59
+ for (const actionObject of actions
60
+ ? analysis.values(actions)
61
+ : []) {
62
+ if (!ts.isObjectLiteralExpression(actionObject))
63
+ continue;
64
+ for (const action of actionObject.properties) {
65
+ const key = action.name &&
66
+ (ts.isIdentifier(action.name) ||
67
+ ts.isStringLiteralLike(action.name))
68
+ ? action.name.text
69
+ : '';
70
+ if (!REPOSITORY_ACTIONS.has(key))
71
+ continue;
72
+ for (const exposureName of names)
73
+ endpoints.push({
74
+ path: `${exposureName.text}/${key}`,
75
+ method: 'POST',
76
+ providers: ['@nocobase/db'],
77
+ ...(collectionName
78
+ ? { collections: [collectionName] }
79
+ : {}),
80
+ });
81
+ }
82
+ }
83
+ }
84
+ }
85
+ }
86
+ };
87
+ const root = (node) => {
88
+ if (visited.has(node))
89
+ return;
90
+ visited.add(node);
91
+ for (const value of analysis.values(node)) {
92
+ if (ts.isArrayLiteralExpression(value))
93
+ value.elements.forEach(root);
94
+ else if (ts.isFunctionLike(value))
95
+ returned(value).forEach(root);
96
+ else if (ts.isCallExpression(value)) {
97
+ if (imported(value.expression, '@nocobase/app-server/router', 'defineRepositoryApiRoutes'))
98
+ repository(value);
99
+ else if (imported(value.expression, '@nocobase/app-server/router', 'defineApiRoutes'))
100
+ value.arguments.forEach(root);
101
+ else {
102
+ const router = identity(value);
103
+ if (router)
104
+ roots.add(router);
105
+ }
106
+ }
107
+ else {
108
+ const router = identity(value);
109
+ if (router)
110
+ roots.add(router);
111
+ }
112
+ }
113
+ };
114
+ for (const statement of entry.statements) {
115
+ if (ts.isExportAssignment(statement))
116
+ root(statement.expression);
117
+ if (ts.isFunctionDeclaration(statement) &&
118
+ statement.modifiers?.some((item) => item.kind === ts.SyntaxKind.DefaultKeyword))
119
+ root(statement);
120
+ }
121
+ const mounts = new Map();
122
+ const paths = new Map();
123
+ const bases = new Map();
124
+ const literals = new StaticValues(analysis);
125
+ for (const source of sources) {
126
+ const visit = (node) => {
127
+ if (ts.isFunctionLike(node) && !source.nodes.has(node))
128
+ return;
129
+ if (ts.isCallExpression(node) &&
130
+ ts.isPropertyAccessExpression(node.expression)) {
131
+ const router = identity(node.expression.expression);
132
+ const first = node.arguments[0];
133
+ const resolved = first ? literals.strings(first) : [];
134
+ for (const path of router ? resolved : []) {
135
+ if (!router)
136
+ continue;
137
+ const method = node.expression.name.text;
138
+ if (method === 'basePath' && resolved.length === 1)
139
+ bases.set(router, path);
140
+ else if (method === 'route' && node.arguments[1]) {
141
+ const child = identity(node.arguments[1]);
142
+ if (child)
143
+ mounts.set(router, [
144
+ ...(mounts.get(router) ?? []),
145
+ { prefix: path, child },
146
+ ]);
147
+ }
148
+ else if (['get', 'post', 'put', 'patch', 'delete'].includes(method)) {
149
+ paths.set(router, [
150
+ ...(paths.get(router) ?? []),
151
+ {
152
+ path,
153
+ method: method.toUpperCase(),
154
+ providers: providers(source.ast.fileName, node.arguments.slice(1)),
155
+ },
156
+ ]);
157
+ }
158
+ }
159
+ }
160
+ ts.forEachChild(node, visit);
161
+ };
162
+ visit(source.ast);
163
+ }
164
+ const join = (a, b) => '/' + [a, b].join('/').split('/').filter(Boolean).join('/');
165
+ const walk = (router, prefix, seen) => {
166
+ if (seen.has(router))
167
+ return;
168
+ const visited = new Set(seen).add(router);
169
+ const base = join(prefix, bases.get(router) ?? '');
170
+ for (const endpoint of paths.get(router) ?? [])
171
+ endpoints.push({ ...endpoint, path: join(base, endpoint.path) });
172
+ for (const mount of mounts.get(router) ?? [])
173
+ walk(mount.child, join(base, mount.prefix), visited);
174
+ };
175
+ roots.forEach((router) => walk(router, '', new Set()));
176
+ return endpoints;
177
+ }
178
+ //# sourceMappingURL=api-evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-evidence.js","sourceRoot":"","sources":["../../server/api-evidence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type CollectionSummary, type Probe } from '../inventory.js';
2
+ import { type CapabilityCollector, type CapabilityFindings } from './types.js';
3
+ /** The Collections that hold the application's own data rather than a NocoBase package's. */
4
+ export declare function applicationCollections(probe: Probe): readonly CollectionSummary[];
5
+ /** Catalog facts remain usable when a costly schema or record scan exceeds its deadline. */
6
+ export declare function dataModelingSummary(probe: Probe): CapabilityFindings;
7
+ export declare const dataModeling: CapabilityCollector;
8
+ export declare const files: CapabilityCollector;
9
+ //# sourceMappingURL=data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../server/capabilities/data.ts"],"names":[],"mappings":"AAGA,OAAO,EAAS,KAAK,iBAAiB,EAAE,KAAK,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAIL,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACxB,MAAM,YAAY,CAAC;AASpB,6FAA6F;AAC7F,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,KAAK,GACX,SAAS,iBAAiB,EAAE,CAI9B;AAED,4FAA4F;AAC5F,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,kBAAkB,CA8BpE;AAED,eAAO,MAAM,YAAY,EAAE,mBA+D1B,CAAC;AAYF,eAAO,MAAM,KAAK,EAAE,mBAsDnB,CAAC"}
@@ -0,0 +1,143 @@
1
+ import { driveManagerToken } from '@nocobase/app-server/drive';
2
+ import { systemCollectionOwner } from '../catalog.js';
3
+ import { total } from '../inventory.js';
4
+ import { fact, metric, NO_DATABASE, } from './types.js';
5
+ const RELATION_TYPES = new Set([
6
+ 'belongsTo',
7
+ 'hasOne',
8
+ 'hasMany',
9
+ 'belongsToMany',
10
+ ]);
11
+ /** The Collections that hold the application's own data rather than a NocoBase package's. */
12
+ export function applicationCollections(probe) {
13
+ return probe.inventory.collections.filter((collection) => systemCollectionOwner(collection.name) === undefined);
14
+ }
15
+ /** Catalog facts remain usable when a costly schema or record scan exceeds its deadline. */
16
+ export function dataModelingSummary(probe) {
17
+ const own = applicationCollections(probe);
18
+ const tables = own.filter((item) => item.kind === 'table');
19
+ return {
20
+ status: 'active',
21
+ facts: own.length
22
+ ? [
23
+ fact(own.length > 5
24
+ ? 'applicationCollectionsPreview'
25
+ : 'applicationCollections', {
26
+ count: own.length,
27
+ names: own.slice(0, 5).map((item) => item.title ?? item.name),
28
+ }),
29
+ ]
30
+ : [fact('noApplicationCollections')],
31
+ metrics: [
32
+ metric('businessRecords', null),
33
+ metric('businessCollections', tables.length),
34
+ metric('views', own.length - tables.length),
35
+ metric('fields', null),
36
+ metric('relations', null),
37
+ metric('systemCollections', probe.inventory.collections.length - own.length),
38
+ ],
39
+ };
40
+ }
41
+ export const dataModeling = {
42
+ key: 'dataModeling',
43
+ packages: [
44
+ '@nocobase/db',
45
+ '@nocobase/repository-input',
46
+ '@nocobase/snowflake',
47
+ ],
48
+ async collect({ probe, countRecords }) {
49
+ if (!probe)
50
+ return NO_DATABASE;
51
+ const own = applicationCollections(probe);
52
+ // A view reads rows another Collection already holds, so only tables count towards the records.
53
+ const tables = own.filter((collection) => collection.kind === 'table');
54
+ const records = countRecords
55
+ ? total(await probe.map(tables, (collection) => probe.count(collection.name)))
56
+ : {
57
+ value: tables.length === 0 ? 0 : null,
58
+ complete: tables.length === 0,
59
+ };
60
+ const definitions = await probe.map(own, (collection) => probe.inventory.definition(collection.name, probe.signal));
61
+ const fields = definitions.flatMap((definition) => definition?.fields ?? []);
62
+ const relations = fields.filter((field) => RELATION_TYPES.has(field.type));
63
+ return {
64
+ status: 'active',
65
+ facts: own.length === 0
66
+ ? [fact('noApplicationCollections')]
67
+ : [
68
+ fact(own.length > 5
69
+ ? 'applicationCollectionsPreview'
70
+ : 'applicationCollections', {
71
+ count: own.length,
72
+ names: own
73
+ .slice(0, 5)
74
+ .map((collection) => collection.title ?? collection.name),
75
+ }),
76
+ ...(relations.length > 0
77
+ ? [fact('relations', { count: relations.length })]
78
+ : []),
79
+ ],
80
+ metrics: [
81
+ metric('businessRecords', records.value, {
82
+ complete: records.complete,
83
+ }),
84
+ metric('businessCollections', tables.length),
85
+ metric('views', own.length - tables.length),
86
+ metric('fields', fields.length - relations.length),
87
+ metric('relations', relations.length),
88
+ metric('systemCollections', probe.inventory.collections.length - own.length),
89
+ ],
90
+ };
91
+ },
92
+ };
93
+ /** The columns the file plugin requires of a file Collection (`FILE_COLUMNS` in `@nocobase/app-plugin-file`). */
94
+ const FILE_COLUMNS = [
95
+ 'disk',
96
+ 'key',
97
+ 'filename',
98
+ 'ext',
99
+ 'mimeType',
100
+ 'size',
101
+ ];
102
+ export const files = {
103
+ key: 'files',
104
+ packages: ['@nocobase/app-plugin-file', '@nocobase/drive'],
105
+ async collect({ probe, container }) {
106
+ if (!probe)
107
+ return NO_DATABASE;
108
+ const candidates = await probe.map(applicationCollections(probe).filter((collection) => collection.kind === 'table'), async (collection) => {
109
+ const names = await probe.fieldNames(collection.name);
110
+ return names !== null &&
111
+ FILE_COLUMNS.every((column) => names.includes(column))
112
+ ? collection
113
+ : undefined;
114
+ });
115
+ const fileCollections = candidates.filter((collection) => collection !== undefined);
116
+ if (fileCollections.length === 0)
117
+ return { status: 'unused', reason: 'noFileCollection' };
118
+ const counts = total(await probe.map(fileCollections, (collection) => probe.count(collection.name)));
119
+ const bytes = total(await probe.map(fileCollections, (collection) => probe.sum(collection.name, 'size')));
120
+ const hasDrive = container.has(driveManagerToken);
121
+ return {
122
+ status: hasDrive ? 'active' : 'needsSetup',
123
+ ...(hasDrive ? {} : { reason: 'noDrive' }),
124
+ facts: [
125
+ fact('fileCollections', {
126
+ count: fileCollections.length,
127
+ names: fileCollections
128
+ .slice(0, 5)
129
+ .map((collection) => collection.title ?? collection.name),
130
+ }),
131
+ ],
132
+ metrics: [
133
+ metric('files', counts.value, { complete: counts.complete }),
134
+ metric('storedBytes', bytes.value, {
135
+ unit: 'bytes',
136
+ complete: bytes.complete,
137
+ }),
138
+ metric('fileCollections', fileCollections.length),
139
+ ],
140
+ };
141
+ },
142
+ };
143
+ //# sourceMappingURL=data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.js","sourceRoot":"","sources":["../../../server/capabilities/data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { CapabilityCollector } from './types.js';
2
+ /** Ordered adapters, independently extensible without a fixed capability enum. */
3
+ export declare const CAPABILITY_COLLECTORS: readonly CapabilityCollector[];
4
+ export type { CapabilityCollector, CollectorContext } from './types.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/capabilities/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAkBtD,kFAAkF;AAClF,eAAO,MAAM,qBAAqB,EAAE,SAAS,mBAAmB,EAAe,CAAC;AAEhF,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { dataModeling, files } from './data.js';
2
+ import { aiAgents, knowledge } from './intelligence.js';
3
+ import { mail, notifications } from './messaging.js';
4
+ import { permissions, usersAndOrganizations } from './people.js';
5
+ import { audit, integrations, operations, userInterface } from './platform.js';
6
+ import { workflows } from './processes.js';
7
+ const collectors = [
8
+ dataModeling,
9
+ files,
10
+ usersAndOrganizations,
11
+ permissions,
12
+ workflows,
13
+ aiAgents,
14
+ knowledge,
15
+ mail,
16
+ notifications,
17
+ integrations,
18
+ userInterface,
19
+ audit,
20
+ operations,
21
+ ];
22
+ /** Ordered adapters, independently extensible without a fixed capability enum. */
23
+ export const CAPABILITY_COLLECTORS = collectors;
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/capabilities/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,MAAM,UAAU,GAAmC;IACjD,YAAY;IACZ,KAAK;IACL,qBAAqB;IACrB,WAAW;IACX,SAAS;IACT,QAAQ;IACR,SAAS;IACT,IAAI;IACJ,aAAa;IACb,YAAY;IACZ,aAAa;IACb,KAAK;IACL,UAAU;CACX,CAAC;AAEF,kFAAkF;AAClF,MAAM,CAAC,MAAM,qBAAqB,GAAmC,UAAU,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type CapabilityCollector } from './types.js';
2
+ export declare const aiAgents: CapabilityCollector;
3
+ export declare const knowledge: CapabilityCollector;
4
+ //# sourceMappingURL=intelligence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intelligence.d.ts","sourceRoot":"","sources":["../../../server/capabilities/intelligence.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,mBAAmB,EACzB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,QAAQ,EAAE,mBA6EtB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,mBAwBvB,CAAC"}
@@ -0,0 +1,105 @@
1
+ import { total } from '../inventory.js';
2
+ import { fact, metric, NO_DATABASE, } from './types.js';
3
+ export const aiAgents = {
4
+ key: 'aiAgents',
5
+ packages: [
6
+ '@nocobase/app-plugin-agents',
7
+ '@nocobase/app-plugin-agent-sessions',
8
+ '@nocobase/app-plugin-ai-employee',
9
+ ],
10
+ async collect({ probe }) {
11
+ if (!probe)
12
+ return NO_DATABASE;
13
+ const hasModelServices = probe.has('agModelServices');
14
+ if (!hasModelServices && !probe.has('agRunners'))
15
+ return { status: 'unused', reason: 'notRegistered' };
16
+ const [services, agents, runners, runs, modelCalls, input, output] = await Promise.all([
17
+ hasModelServices
18
+ ? probe.count('agModelServices', { enabled: true })
19
+ : Promise.resolve(0),
20
+ probe.has('agAgents') ? probe.count('agAgents') : Promise.resolve(0),
21
+ probe.has('agRunners') ? probe.count('agRunners') : Promise.resolve(0),
22
+ probe.has('agRuns') ? probe.count('agRuns') : Promise.resolve(0),
23
+ probe.has('agModelUsage')
24
+ ? probe.count('agModelUsage')
25
+ : Promise.resolve(0),
26
+ probe.has('agModelUsage')
27
+ ? probe.sum('agModelUsage', 'inputTokens')
28
+ : Promise.resolve(0),
29
+ probe.has('agModelUsage')
30
+ ? probe.sum('agModelUsage', 'outputTokens')
31
+ : Promise.resolve(0),
32
+ ]);
33
+ const tokens = total([input, output]);
34
+ // Native OnlineAgent and gateway calls use model services directly, without an agAgents record.
35
+ const online = services !== null && services > 0;
36
+ const runner = runners !== null && runners > 0;
37
+ const parts = [];
38
+ if (hasModelServices && services !== null)
39
+ parts.push(online
40
+ ? { key: 'modelServices', status: 'active' }
41
+ : {
42
+ key: 'modelServices',
43
+ status: 'needsSetup',
44
+ reason: 'noModelService',
45
+ });
46
+ if (agents !== null)
47
+ parts.push({ key: 'agents', status: agents > 0 ? 'active' : 'unused' });
48
+ if (runners !== null)
49
+ parts.push({ key: 'runners', status: runner ? 'active' : 'unused' });
50
+ const active = online || runner;
51
+ const unknown = services === null || runners === null;
52
+ return {
53
+ status: active ? 'active' : unknown ? null : 'needsSetup',
54
+ ...(active || unknown ? {} : { reason: 'noModelOrRunner' }),
55
+ facts: active
56
+ ? [
57
+ ...(online ? [fact('modelServices', { count: services })] : []),
58
+ ...(runner ? [fact('runners', { count: runners })] : []),
59
+ ...(agents !== null && runs !== null && (agents > 0 || runs > 0)
60
+ ? [fact('agents', { count: agents, runs })]
61
+ : []),
62
+ ]
63
+ : [],
64
+ metrics: [
65
+ metric('agents', agents),
66
+ metric('modelServices', services),
67
+ metric('runners', runners),
68
+ metric('runs', runs),
69
+ metric('modelCalls', modelCalls),
70
+ metric('tokens', tokens.value, {
71
+ unit: 'tokens',
72
+ complete: tokens.complete,
73
+ }),
74
+ ],
75
+ parts,
76
+ };
77
+ },
78
+ };
79
+ export const knowledge = {
80
+ key: 'knowledge',
81
+ packages: ['@nocobase/app-plugin-knowledge'],
82
+ async collect({ probe }) {
83
+ if (!probe)
84
+ return NO_DATABASE;
85
+ if (!probe.has('kbSpaces'))
86
+ return { status: 'unused', reason: 'notRegistered' };
87
+ const [spaces, docs, chunks] = await Promise.all([
88
+ probe.count('kbSpaces'),
89
+ probe.has('kbDocs') ? probe.count('kbDocs') : Promise.resolve(0),
90
+ probe.has('kbChunks') ? probe.count('kbChunks') : Promise.resolve(0),
91
+ ]);
92
+ const active = (docs ?? 0) > 0;
93
+ return {
94
+ status: active ? 'active' : 'needsSetup',
95
+ ...(active ? {} : { reason: 'noDocuments' }),
96
+ facts: active ? [fact('documents', { count: docs ?? 0 })] : [],
97
+ metrics: [
98
+ metric('documents', docs),
99
+ metric('spaces', spaces),
100
+ metric('chunks', chunks),
101
+ ],
102
+ };
103
+ },
104
+ };
105
+ //# sourceMappingURL=intelligence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intelligence.js","sourceRoot":"","sources":["../../../server/capabilities/intelligence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type CapabilityCollector } from './types.js';
2
+ export declare const mail: CapabilityCollector;
3
+ export declare const notifications: CapabilityCollector;
4
+ //# sourceMappingURL=messaging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messaging.d.ts","sourceRoot":"","sources":["../../../server/capabilities/messaging.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,mBAAmB,EACzB,MAAM,YAAY,CAAC;AAKpB,eAAO,MAAM,IAAI,EAAE,mBA0ClB,CAAC;AAIF,eAAO,MAAM,aAAa,EAAE,mBAyE3B,CAAC"}
@@ -0,0 +1,108 @@
1
+ import { countOf, fact, metric, NO_DATABASE, } from './types.js';
2
+ /** Account states that need someone to act before the mailbox syncs again. */
3
+ const ATTENTION_STATES = ['reauthorizationRequired', 'suspended', 'revoked'];
4
+ export const mail = {
5
+ key: 'mail',
6
+ packages: ['@nocobase/app-plugin-mail', '@nocobase/mailer'],
7
+ async collect({ probe }) {
8
+ if (!probe)
9
+ return NO_DATABASE;
10
+ if (!probe.has('mailAccounts'))
11
+ return { status: 'unused', reason: 'notRegistered' };
12
+ const [accounts, messages, submissions] = await Promise.all([
13
+ probe.groupCount('mailAccounts', 'status'),
14
+ probe.has('mailMessages')
15
+ ? probe.count('mailMessages')
16
+ : Promise.resolve(0),
17
+ probe.has('mailSubmissions')
18
+ ? probe.groupCount('mailSubmissions', 'status')
19
+ : Promise.resolve(new Map()),
20
+ ]);
21
+ const connected = countOf(accounts, ['active']);
22
+ const attention = countOf(accounts, ATTENTION_STATES);
23
+ const active = (connected ?? 0) > 0;
24
+ return {
25
+ status: active ? 'active' : 'needsSetup',
26
+ ...(active ? {} : { reason: 'noConnectedMailbox' }),
27
+ facts: [
28
+ ...(active ? [fact('mailboxes', { count: connected ?? 0 })] : []),
29
+ ...((attention ?? 0) > 0
30
+ ? [fact('mailboxesNeedAttention', { count: attention ?? 0 })]
31
+ : []),
32
+ ],
33
+ metrics: [
34
+ metric('connectedMailboxes', connected),
35
+ metric('mailboxesNeedAttention', attention),
36
+ metric('messages', messages),
37
+ metric('submissions', submissions === null
38
+ ? null
39
+ : [...submissions.values()].reduce((sum, count) => sum + count, 0)),
40
+ metric('failedSubmissions', countOf(submissions, ['failed'])),
41
+ ],
42
+ };
43
+ },
44
+ };
45
+ const IN_FLIGHT = ['pending', 'preparing', 'submitting', 'retrying'];
46
+ export const notifications = {
47
+ key: 'notifications',
48
+ packages: [
49
+ '@nocobase/app-plugin-notification',
50
+ '@nocobase/app-plugin-notification-in-app',
51
+ '@nocobase/app-plugin-notification-providers',
52
+ '@nocobase/app-plugin-notification-web-push',
53
+ ],
54
+ async collect({ probe, config }) {
55
+ if (!probe)
56
+ return NO_DATABASE;
57
+ if (!probe.has('notificationDeliveries'))
58
+ return { status: 'unused', reason: 'notRegistered' };
59
+ const channels = Object.entries(config.get('notification')?.channels ?? {});
60
+ const [dispatches, deliveries, attempts, inApp, inAppRead] = await Promise.all([
61
+ probe.has('notificationDispatches')
62
+ ? probe.count('notificationDispatches')
63
+ : Promise.resolve(0),
64
+ probe.groupCount('notificationDeliveries', 'status'),
65
+ probe.has('notificationDeliveryAttempts')
66
+ ? probe.count('notificationDeliveryAttempts')
67
+ : Promise.resolve(0),
68
+ probe.has('notificationInAppItems')
69
+ ? probe.count('notificationInAppItems')
70
+ : Promise.resolve(undefined),
71
+ probe.has('notificationInAppItems')
72
+ ? probe.count('notificationInAppItems', (filter) => filter.date('readAt').notEmpty())
73
+ : Promise.resolve(undefined),
74
+ ]);
75
+ const active = channels.length > 0;
76
+ return {
77
+ status: active ? 'active' : 'needsSetup',
78
+ ...(active ? {} : { reason: 'noChannel' }),
79
+ facts: active
80
+ ? [
81
+ fact('channels', {
82
+ count: channels.length,
83
+ names: channels.map(([name, channel]) => `${name} (${typeof channel.provider === 'string' ? channel.provider : '?'})`),
84
+ }),
85
+ ]
86
+ : [],
87
+ metrics: [
88
+ // Accepted by the provider, which is not the same as read or even received.
89
+ metric('acceptedDeliveries', countOf(deliveries, ['accepted'])),
90
+ metric('notifications', dispatches),
91
+ metric('deliveries', deliveries === null
92
+ ? null
93
+ : [...deliveries.values()].reduce((sum, count) => sum + count, 0)),
94
+ metric('failedDeliveries', countOf(deliveries, ['failed'])),
95
+ metric('pendingDeliveries', countOf(deliveries, IN_FLIGHT)),
96
+ metric('deliveryAttempts', attempts),
97
+ ...(inApp === undefined
98
+ ? []
99
+ : [
100
+ metric('inAppMessages', inApp),
101
+ metric('inAppMessagesRead', inAppRead ?? null),
102
+ ]),
103
+ metric('channels', channels.length),
104
+ ],
105
+ };
106
+ },
107
+ };
108
+ //# sourceMappingURL=messaging.js.map