@arch-cadre/modules 0.0.26 → 0.0.28

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 (69) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +29 -0
  2. package/dist/client/extension-point.cjs +19 -0
  3. package/dist/client/extension-point.d.cts +21 -0
  4. package/dist/client/extension-point.d.cts.map +1 -0
  5. package/dist/client/extension-point.d.mts +21 -0
  6. package/dist/client/extension-point.d.mts.map +1 -0
  7. package/dist/client/extension-point.mjs +19 -0
  8. package/dist/client/extension-point.mjs.map +1 -0
  9. package/dist/client/widget-area.cjs +20 -0
  10. package/dist/client/widget-area.d.cts +19 -0
  11. package/dist/client/widget-area.d.cts.map +1 -0
  12. package/dist/client/widget-area.d.mts +19 -0
  13. package/dist/client/widget-area.d.mts.map +1 -0
  14. package/dist/client/widget-area.mjs +20 -0
  15. package/dist/client/widget-area.mjs.map +1 -0
  16. package/dist/index.cjs +5 -19
  17. package/dist/index.d.cts +4 -20
  18. package/dist/index.d.mts +4 -20
  19. package/dist/index.mjs +4 -19
  20. package/dist/server/lifecycle.cjs +193 -0
  21. package/dist/server/lifecycle.d.cts +9 -0
  22. package/dist/server/lifecycle.d.cts.map +1 -0
  23. package/dist/server/lifecycle.d.mts +9 -0
  24. package/dist/server/lifecycle.d.mts.map +1 -0
  25. package/dist/server/lifecycle.mjs +189 -0
  26. package/dist/server/lifecycle.mjs.map +1 -0
  27. package/dist/server/manage.cjs +126 -0
  28. package/dist/server/manage.d.cts +31 -0
  29. package/dist/server/manage.d.cts.map +1 -0
  30. package/dist/server/manage.d.mts +31 -0
  31. package/dist/server/manage.d.mts.map +1 -0
  32. package/dist/server/manage.mjs +118 -0
  33. package/dist/server/manage.mjs.map +1 -0
  34. package/dist/server/registry.cjs +86 -0
  35. package/dist/server/registry.d.cts +5 -0
  36. package/dist/server/registry.d.cts.map +1 -0
  37. package/dist/server/registry.d.mts +5 -0
  38. package/dist/server/registry.d.mts.map +1 -0
  39. package/dist/server/registry.mjs +86 -0
  40. package/dist/server/registry.mjs.map +1 -0
  41. package/dist/server/ui.cjs +180 -0
  42. package/dist/server/ui.d.cts +17 -0
  43. package/dist/server/ui.d.cts.map +1 -0
  44. package/dist/server/ui.d.mts +17 -0
  45. package/dist/server/ui.d.mts.map +1 -0
  46. package/dist/{ui-lsiPxu_C.mjs → server/ui.mjs} +5 -129
  47. package/dist/server/ui.mjs.map +1 -0
  48. package/dist/server.cjs +19 -292
  49. package/dist/server.d.cts +7 -59
  50. package/dist/server.d.mts +7 -59
  51. package/dist/server.mjs +8 -280
  52. package/dist/types.cjs +19 -0
  53. package/dist/{ui-CWGtK5lA.d.cts → types.d.cts} +2 -15
  54. package/dist/types.d.cts.map +1 -0
  55. package/dist/{ui-aeAUERbe.d.mts → types.d.mts} +2 -15
  56. package/dist/types.d.mts.map +1 -0
  57. package/dist/types.mjs +19 -0
  58. package/dist/types.mjs.map +1 -0
  59. package/package.json +1 -1
  60. package/dist/index.d.cts.map +0 -1
  61. package/dist/index.d.mts.map +0 -1
  62. package/dist/index.mjs.map +0 -1
  63. package/dist/server.d.cts.map +0 -1
  64. package/dist/server.d.mts.map +0 -1
  65. package/dist/server.mjs.map +0 -1
  66. package/dist/ui-CCBvXMXH.cjs +0 -441
  67. package/dist/ui-CWGtK5lA.d.cts.map +0 -1
  68. package/dist/ui-aeAUERbe.d.mts.map +0 -1
  69. package/dist/ui-lsiPxu_C.mjs.map +0 -1
package/dist/server.mjs CHANGED
@@ -1,280 +1,8 @@
1
- import { _ as registerModules, a as getKryoPathPrefix, c as getModuleWidgets, d as hasExtension, f as getModuleConfig, g as isModuleEnabled, h as getModules, i as getKryoModuleRoutes, l as getPrivateModuleRoutes, m as getModuleStatus, n as getExtensions, o as getModuleNavigation, p as getModuleInstance, r as getKryoModuleNavigationGrouped, s as getModuleNavigationGrouped, t as getApiModuleRoutes, u as getPublicModuleRoutes, v as updateModuleConfig, y as ModuleManifestSchema } from "./ui-lsiPxu_C.mjs";
2
- import "react";
3
- import { db } from "@arch-cadre/core/server";
4
- import fs from "node:fs/promises";
5
- import path from "node:path";
6
- import { eventBus, systemModulesTable } from "@arch-cadre/core";
7
- import { eq } from "drizzle-orm";
8
- import { jsx } from "react/jsx-runtime";
9
- import { exec } from "node:child_process";
10
- import { promisify } from "node:util";
11
-
12
- //#region src/client/extension-point.tsx
13
- async function ExtensionPoint({ module, point, className, props, fallback }) {
14
- const extensions = await getExtensions(module, point);
15
- if (extensions.length === 0) return fallback || null;
16
- return /* @__PURE__ */ jsx("div", {
17
- className,
18
- children: extensions.map((ext) => {
19
- const Component = ext.component;
20
- return /* @__PURE__ */ jsx(Component, { ...props }, ext.id);
21
- })
22
- });
23
- }
24
-
25
- //#endregion
26
- //#region src/server/lifecycle.ts
27
- const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
28
- async function updateStep(moduleId, step) {
29
- console.log(`[Kernel] "${moduleId}" step: ${step}`);
30
- await db.update(systemModulesTable).set({ lastStep: step }).where(eq(systemModulesTable.id, moduleId));
31
- }
32
- async function resolveSchemaPath(moduleId) {
33
- const root = process.cwd();
34
- if (moduleId === "@arch-cadre/core" || moduleId === "core") {
35
- const p = path.join(root, "node_modules", "@kryo", "core", "dist", "server", "database", "schema.cjs");
36
- try {
37
- await fs.access(p);
38
- return p;
39
- } catch {
40
- const devP = path.resolve(root, "../../packages/kryo-core/src/server/database/schema.ts");
41
- try {
42
- await fs.access(devP);
43
- return devP;
44
- } catch {}
45
- }
46
- return null;
47
- }
48
- const cleanId = moduleId.replace("@arch-cadre/", "");
49
- const possible = [
50
- path.join(root, "modules", cleanId, "schema.ts"),
51
- path.join(root, "modules", moduleId, "schema.ts"),
52
- path.join(root, "node_modules", moduleId, "dist", "schema.cjs"),
53
- path.join(root, "node_modules", `@arch-cadre/${cleanId}`, "dist", "schema.cjs"),
54
- path.join(root, "node_modules", moduleId, "src", "schema.ts"),
55
- path.join(root, "node_modules", `@arch-cadre/${cleanId}`, "src", "schema.ts"),
56
- path.resolve(root, "../../packages", cleanId, "src", "schema.ts"),
57
- path.resolve(root, "../../packages", `kryo-${cleanId}`, "src", "schema.ts"),
58
- path.resolve(root, "../../packages", cleanId, "schema.ts")
59
- ];
60
- for (const p of possible) try {
61
- await fs.access(p);
62
- console.log(`[Kernel:Lifecycle] Resolved schema for ${moduleId} at: ${p}`);
63
- return p;
64
- } catch {
65
- console.warn(`[Kernel:Lifecycle] Unresolved schema for ${moduleId} at: ${p}`);
66
- }
67
- console.warn(`[Kernel:Lifecycle] Could not resolve schema path for: ${moduleId}`);
68
- return null;
69
- }
70
- async function pushModuleSchema(moduleId) {
71
- const execAsync = promisify(exec);
72
- console.log(`[Kernel:Lifecycle] Targeted sync for module: ${moduleId}`);
73
- const root = process.cwd();
74
- const enabledFromDb = await db.select({ id: systemModulesTable.id }).from(systemModulesTable).where(eq(systemModulesTable.enabled, true));
75
- const activeModuleIds = new Set(enabledFromDb.map((m) => m.id));
76
- activeModuleIds.add("@arch-cadre/core");
77
- activeModuleIds.add(moduleId);
78
- const schemaPaths = [];
79
- for (const id of Array.from(activeModuleIds)) {
80
- const p = await resolveSchemaPath(id);
81
- if (p) schemaPaths.push(p);
82
- }
83
- if (schemaPaths.length === 0) {
84
- console.warn(`[Kernel:Lifecycle] No schema paths resolved for ${moduleId}, skipping push.`);
85
- return;
86
- }
87
- const configPath = path.join(root, "drizzle.config.ts");
88
- const cmd = `"${path.join(root, "node_modules", ".bin", "drizzle-kit")}" push --force --config=${configPath}`;
89
- console.log(`[Kernel:Lifecycle] Executing isolated migration. Modules: ${Array.from(activeModuleIds).join(", ")}`);
90
- try {
91
- await execAsync(cmd, {
92
- env: {
93
- ...process.env,
94
- CI: "true",
95
- DRIZZLE_SCHEMA_OVERRIDE: schemaPaths.join(",")
96
- },
97
- cwd: root
98
- });
99
- console.log(`[Kernel:Lifecycle] Isolated migration successful for ${moduleId}`);
100
- } catch (e) {
101
- console.error(`[Kernel:Lifecycle] Isolated migration failed for ${moduleId}:`);
102
- console.error(e.stdout || e.message);
103
- throw new Error(`Migration failed: ${moduleId}`);
104
- }
105
- }
106
- async function performToggle(moduleId, isEnabled) {
107
- try {
108
- const allModules = await getModules();
109
- const manifest = allModules.find((m) => m.id === moduleId);
110
- await updateStep(moduleId, "Validate module...");
111
- await sleep(500);
112
- if (!manifest) return;
113
- if (isEnabled) {
114
- await updateStep(moduleId, "Queued...");
115
- await sleep(500);
116
- if (manifest.dependencies?.length) {
117
- const pendingDeps = manifest.dependencies.filter((depId) => {
118
- const dep = allModules.find((m) => m.id === depId);
119
- return dep && !dep.enabled && !dep.system;
120
- });
121
- if (pendingDeps.length > 0) for (const depId of pendingDeps) {
122
- await updateStep(moduleId, `Waiting for dependency "${depId}"...`);
123
- await performToggle(depId, true);
124
- await sleep(500);
125
- }
126
- }
127
- await updateStep(moduleId, "Initializing...");
128
- await sleep(500);
129
- await db.update(systemModulesTable).set({ enabled: true }).where(eq(systemModulesTable.id, moduleId));
130
- const instance = await getModuleInstance(moduleId);
131
- await updateStep(moduleId, "Migrate database...");
132
- await sleep(500);
133
- try {
134
- if (instance?.onMigrate) await instance.onMigrate();
135
- else await pushModuleSchema(moduleId);
136
- await updateStep(moduleId, "Migration successful");
137
- } catch (e) {
138
- console.error(`[Kernel] Migration failed for ${moduleId}:`, e);
139
- await updateStep(moduleId, `Migration failed: ${e.message}`);
140
- await sleep(500);
141
- }
142
- if (instance?.onEnable) {
143
- await updateStep(moduleId, "Running setup...");
144
- await sleep(500);
145
- await instance.onEnable();
146
- }
147
- await updateStep(moduleId, "Finishing...");
148
- await sleep(500);
149
- await db.update(systemModulesTable).set({
150
- installed: true,
151
- lastStep: null
152
- }).where(eq(systemModulesTable.id, moduleId));
153
- } else {
154
- const dependents = allModules.filter((m) => {
155
- if (!m.enabled || m.id === moduleId) return false;
156
- if (m.dependencies?.includes(moduleId)) return true;
157
- if (m.extends?.includes(moduleId)) return m.extends.filter((targetId) => {
158
- if (targetId === moduleId) return false;
159
- return allModules.find((mod) => mod.id === targetId)?.enabled;
160
- }).length === 0;
161
- return false;
162
- });
163
- if (dependents.length > 0) {
164
- await updateStep(moduleId, `Deactivating dependents...`);
165
- for (const dep of dependents) {
166
- await performToggle(dep.id, false);
167
- await sleep(500);
168
- }
169
- }
170
- await updateStep(moduleId, "Deactivating...");
171
- const instance = await getModuleInstance(moduleId);
172
- if (instance?.onDisable) await instance.onDisable();
173
- await db.update(systemModulesTable).set({
174
- enabled: false,
175
- installed: false
176
- }).where(eq(systemModulesTable.id, moduleId));
177
- await updateStep(moduleId, null);
178
- }
179
- } catch (e) {
180
- console.error(`[Kernel] Fatal error for ${moduleId}:`, e);
181
- await updateStep(moduleId, `Error: ${e.message}`);
182
- }
183
- }
184
- async function toggleModuleState(moduleId, isEnabled) {
185
- const manifest = (await getModules()).find((m) => m.id === moduleId);
186
- if (!manifest) throw new Error(`Module "${moduleId}" not found`);
187
- if (manifest.enabled === isEnabled) return { success: true };
188
- performToggle(moduleId, isEnabled);
189
- return { success: true };
190
- }
191
- async function initOperationalModules() {
192
- const allModules = await getModules();
193
- for (const mod of allModules) if (mod.enabled) try {
194
- const instance = await getModuleInstance(mod.id);
195
- if (instance?.init) await instance.init();
196
- } catch (e) {
197
- console.error(`[Kernel] Failed to init module ${mod.id}:`, e);
198
- }
199
- }
200
-
201
- //#endregion
202
- //#region src/server/registry.ts
203
- const globalForRegistry = globalThis;
204
- async function initModules(force = false) {
205
- if (globalForRegistry.__KRYO_MODULES_INITIALIZED__ && !force) return;
206
- if (force) {
207
- console.log("[Kernel:Registry] Forcing re-initialization...");
208
- eventBus.clearAll();
209
- }
210
- console.log("[Kernel:Registry] Synchronizing module listeners...");
211
- globalForRegistry.__KRYO_MODULES_INITIALIZED__ = true;
212
- await eventBus.publish("system:modules:init:start", { timestamp: Date.now() });
213
- const processedModuleIds = /* @__PURE__ */ new Set();
214
- let hasNewModules = true;
215
- let iterations = 0;
216
- const MAX_ITERATIONS = 10;
217
- while (hasNewModules && iterations < MAX_ITERATIONS) {
218
- hasNewModules = false;
219
- iterations++;
220
- const pendingModules = (await getModules()).filter((mod) => !processedModuleIds.has(mod.id));
221
- if (pendingModules.length === 0) break;
222
- for (const mod of pendingModules) try {
223
- await db.insert(systemModulesTable).values({
224
- id: mod.id,
225
- enabled: mod.system ?? false,
226
- installed: mod.system ?? false,
227
- system: mod.system ?? false
228
- }).onConflictDoNothing();
229
- } catch (_e) {}
230
- const sortedPending = [...pendingModules].sort((a, b) => a.system === b.system ? 0 : a.system ? -1 : 1);
231
- for (const mod of sortedPending) {
232
- processedModuleIds.add(mod.id);
233
- hasNewModules = true;
234
- try {
235
- const enabled = await isModuleEnabled(mod.id);
236
- if (!enabled) continue;
237
- const instance = await getModuleInstance(mod.id);
238
- if (!instance) {
239
- console.warn(`[Kernel:Registry] No instance found for module ${mod.id}. Ensure it is registered correctly.`);
240
- continue;
241
- }
242
- let dbMod = null;
243
- try {
244
- [dbMod] = await db.select().from(systemModulesTable).where(eq(systemModulesTable.id, mod.id));
245
- } catch (_e) {}
246
- if (enabled && (!dbMod || !dbMod.installed)) {
247
- console.log(`[Kernel:Registry] Installing module ${mod.id}...`);
248
- if (instance.onMigrate) {
249
- console.log(`[Kernel:Registry] Running onMigrate for ${mod.id}...`);
250
- await instance.onMigrate();
251
- }
252
- console.log(`[Kernel:Registry] Running onEnable for ${mod.id}...`);
253
- if (instance.onEnable) await instance.onEnable();
254
- try {
255
- await db.update(systemModulesTable).set({
256
- installed: true,
257
- lastStep: null
258
- }).where(eq(systemModulesTable.id, mod.id));
259
- } catch (_e) {}
260
- }
261
- if (instance.init) {
262
- console.log(`[Kernel:Registry] Initializing ${mod.id}...`);
263
- await instance.init();
264
- console.log(`[Kernel:Registry] Module ${mod.id} is active.`);
265
- }
266
- } catch (error) {
267
- console.error(`[Kernel:Registry] Critical failure for ${mod.id}:`, error);
268
- }
269
- }
270
- }
271
- if (iterations >= MAX_ITERATIONS) console.warn("[Kernel:Registry] Max init iterations reached. Check for circular module registrations.");
272
- await eventBus.publish("system:modules:init:end", {
273
- timestamp: Date.now(),
274
- moduleCount: processedModuleIds.size
275
- });
276
- }
277
-
278
- //#endregion
279
- export { ExtensionPoint, ModuleManifestSchema, getApiModuleRoutes, getExtensions, getKryoModuleNavigationGrouped, getKryoModuleRoutes, getKryoPathPrefix, getModuleConfig, getModuleInstance, getModuleNavigation, getModuleNavigationGrouped, getModuleStatus, getModuleWidgets, getModules, getPrivateModuleRoutes, getPublicModuleRoutes, hasExtension, initModules, initOperationalModules, isModuleEnabled, pushModuleSchema, registerModules, toggleModuleState, updateModuleConfig };
280
- //# sourceMappingURL=server.mjs.map
1
+ import { ModuleManifestSchema } from "./types.mjs";
2
+ import { getModuleConfig, getModuleInstance, getModuleStatus, getModules, isModuleEnabled, registerModules, updateModuleConfig } from "./server/manage.mjs";
3
+ import { getApiModuleRoutes, getExtensions, getKryoModuleNavigationGrouped, getKryoModuleRoutes, getKryoPathPrefix, getModuleNavigation, getModuleNavigationGrouped, getModuleWidgets, getPrivateModuleRoutes, getPublicModuleRoutes, hasExtension } from "./server/ui.mjs";
4
+ import { ExtensionPoint } from "./client/extension-point.mjs";
5
+ import { initOperationalModules, pushModuleSchema, toggleModuleState } from "./server/lifecycle.mjs";
6
+ import { initModules } from "./server/registry.mjs";
7
+
8
+ export { ExtensionPoint, ModuleManifestSchema, getApiModuleRoutes, getExtensions, getKryoModuleNavigationGrouped, getKryoModuleRoutes, getKryoPathPrefix, getModuleConfig, getModuleInstance, getModuleNavigation, getModuleNavigationGrouped, getModuleStatus, getModuleWidgets, getModules, getPrivateModuleRoutes, getPublicModuleRoutes, hasExtension, initModules, initOperationalModules, isModuleEnabled, pushModuleSchema, registerModules, toggleModuleState, updateModuleConfig };
package/dist/types.cjs ADDED
@@ -0,0 +1,19 @@
1
+ const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
2
+ let zod = require("zod");
3
+
4
+ //#region src/types.ts
5
+ const ModuleManifestSchema = zod.z.object({
6
+ id: zod.z.string(),
7
+ name: zod.z.string(),
8
+ version: zod.z.string(),
9
+ description: zod.z.string().optional(),
10
+ dependencies: zod.z.array(zod.z.string()).default([]),
11
+ extends: zod.z.array(zod.z.string()).default([]),
12
+ enabled: zod.z.boolean().default(true),
13
+ system: zod.z.boolean().default(false),
14
+ npmDependencies: zod.z.array(zod.z.string()).optional(),
15
+ npmDevDependencies: zod.z.array(zod.z.string()).optional()
16
+ });
17
+
18
+ //#endregion
19
+ exports.ModuleManifestSchema = ModuleManifestSchema;
@@ -113,18 +113,5 @@ interface ModuleNavigation {
113
113
  globalRoutes?: (PublicRouteDefinition | PrivateRouteDefinition | ApiRouteDefinition)[];
114
114
  }
115
115
  //#endregion
116
- //#region src/server/ui.d.ts
117
- declare function getModuleNavigationGrouped(type: "admin" | "settings"): Promise<Record<string, ModuleNavElement[]>>;
118
- declare function getKryoPathPrefix(): Promise<string>;
119
- declare function getKryoModuleNavigationGrouped(type: "admin" | "settings"): Promise<Record<string, ModuleNavElement[]>>;
120
- declare function getModuleNavigation(type: "public"): Promise<ModuleNavElement[]>;
121
- declare function getPublicModuleRoutes(): Promise<PublicRouteDefinition[]>;
122
- declare function getPrivateModuleRoutes(): Promise<PrivateRouteDefinition[]>;
123
- declare function getKryoModuleRoutes(): Promise<PrivateRouteDefinition[]>;
124
- declare function getApiModuleRoutes(): Promise<ApiRouteDefinition[]>;
125
- declare function getModuleWidgets(area: string): Promise<ModuleWidget[]>;
126
- declare function getExtensions(targetModule: string, point?: string): Promise<ModuleExtension[]>;
127
- declare function hasExtension(targetModule: string, point?: string): Promise<boolean>;
128
- //#endregion
129
- export { PrivateRouteDefinition as C, SidebarMenuType as D, SidebarMenuItemType as E, SystemEvent as O, ModuleWidget as S, SidebarGroupType as T, ModuleNavElement as _, getKryoPathPrefix as a, ModulePageProps as b, getModuleWidgets as c, hasExtension as d, ApiRouteDefinition as f, ModuleManifestSchema as g, ModuleManifest as h, getKryoModuleRoutes as i, getPrivateModuleRoutes as l, ModuleExtension as m, getExtensions as n, getModuleNavigation as o, IModule as p, getKryoModuleNavigationGrouped as r, getModuleNavigationGrouped as s, getApiModuleRoutes as t, getPublicModuleRoutes as u, ModuleNavigation as v, PublicRouteDefinition as w, ModuleRouteDefinition as x, ModuleNavigationGroupMap as y };
130
- //# sourceMappingURL=ui-CWGtK5lA.d.cts.map
116
+ export { ApiRouteDefinition, IModule, ModuleExtension, ModuleManifest, ModuleManifestSchema, ModuleNavElement, ModuleNavigation, ModuleNavigationGroupMap, ModulePageProps, ModuleRouteDefinition, ModuleWidget, PrivateRouteDefinition, PublicRouteDefinition, SidebarGroupType, SidebarMenuItemType, SidebarMenuType, type SystemEvent };
117
+ //# sourceMappingURL=types.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.cts","names":[],"sources":["../src/types.ts"],"mappings":";;;;;KAMY,gBAAA;EACV,KAAA;EACA,KAAA,EAAO,eAAA;AAAA;AAAA,KAGG,mBAAA,KAAwB,MAAA;EAClC,EAAA;EACA,KAAA;EACA,IAAA;EACA,GAAA;EACA,KAAA;EACA,WAAA;EACA,KAAA;EACA,YAAA;AAAA,IAOE,CAAA;AAAA,KAEQ,eAAA,GAAkB,mBAAA;EAC5B,KAAA,GAAQ,mBAAA;AAAA;AAAA,cAGG,oBAAA,EAAoB,CAAA,CAAA,SAAA;;;;;;;;;;;;KAarB,cAAA,GAAiB,CAAA,CAAE,KAAA,QAAa,oBAAA;AAAA,UAI3B,eAAA;EACf,EAAA;EACA,YAAA;EACA,KAAA;EACA,SAAA,EAAW,KAAA,CAAM,aAAA;EACjB,QAAA;EACA,QAAA;AAAA;AAAA,UAGe,eAAA;EACf,MAAA;EACA,YAAA;AAAA;AAAA,UAGe,qBAAA;EACf,EAAA;EACA,KAAA,GAAQ,QAAA;EACR,WAAA,GAAc,cAAA;EACd,SAAA,EAAW,KAAA,CAAM,aAAA;EACjB,MAAA,GAAS,KAAA,CAAM,aAAA;IAAgB,QAAA,EAAU,KAAA,CAAM,SAAA;EAAA;EAC/C,gBAAA,IAAoB,KAAA,EAAO,eAAA,KAAoB,OAAA,CAAQ,QAAA,IAAY,QAAA;AAAA;AAAA,UAKpD,YAAA;EACf,EAAA;EACA,IAAA;EACA,IAAA;EACA,SAAA,EAAW,KAAA,CAAM,aAAA;EACjB,QAAA;AAAA;AAAA,UAGe,OAAA;EACf,QAAA,EAAU,cAAA;EACV,MAAA;EACA,SAAA,SAAkB,OAAA;EAClB,QAAA,SAAiB,OAAA;EACjB,SAAA,SAAkB,OAAA;EAClB,IAAA,SAAa,OAAA;EACb,OAAA,GAAU,YAAA;EACV,UAAA,GAAa,eAAA;EACb,UAAA,GAAa,gBAAA;EACb,MAAA;IACE,MAAA,GAAS,qBAAA;IACT,OAAA,GAAU,sBAAA;IACV,GAAA,GAAM,kBAAA;EAAA;AAAA;;;;KASE,gBAAA,GAAmB,mBAAA;EAC7B,KAAA,GAAQ,mBAAA;AAAA;;;;;;KAQE,wBAAA,GAA2B,MAAA,SAAe,gBAAA;AAAA,UAErC,qBAAA,SAA8B,qBAAA;EAC7C,IAAA;EACA,IAAA;AAAA;AAAA,UAGe,sBAAA,SAA+B,qBAAA;EAC9C,IAAA;EACA,IAAA;AAAA;AAAA,UAGe,kBAAA;EACf,EAAA;EACA,IAAA;EACA,OAAA,GAAU,OAAA,EAAS,OAAA,EAAS,OAAA,UAAiB,OAAA,CAAQ,QAAA,IAAY,QAAA;EACjE,IAAA;EACA,KAAA,GAAQ,QAAA;EACR,WAAA,GAAc,cAAA;AAAA;AAAA,UAGC,gBAAA;EACf,MAAA,GAAS,gBAAA;EACT,KAAA,GAAQ,wBAAA;EACR,QAAA,GAAW,wBAAA;EACX,YAAA,IACI,qBAAA,GACA,sBAAA,GACA,kBAAA;AAAA"}
@@ -113,18 +113,5 @@ interface ModuleNavigation {
113
113
  globalRoutes?: (PublicRouteDefinition | PrivateRouteDefinition | ApiRouteDefinition)[];
114
114
  }
115
115
  //#endregion
116
- //#region src/server/ui.d.ts
117
- declare function getModuleNavigationGrouped(type: "admin" | "settings"): Promise<Record<string, ModuleNavElement[]>>;
118
- declare function getKryoPathPrefix(): Promise<string>;
119
- declare function getKryoModuleNavigationGrouped(type: "admin" | "settings"): Promise<Record<string, ModuleNavElement[]>>;
120
- declare function getModuleNavigation(type: "public"): Promise<ModuleNavElement[]>;
121
- declare function getPublicModuleRoutes(): Promise<PublicRouteDefinition[]>;
122
- declare function getPrivateModuleRoutes(): Promise<PrivateRouteDefinition[]>;
123
- declare function getKryoModuleRoutes(): Promise<PrivateRouteDefinition[]>;
124
- declare function getApiModuleRoutes(): Promise<ApiRouteDefinition[]>;
125
- declare function getModuleWidgets(area: string): Promise<ModuleWidget[]>;
126
- declare function getExtensions(targetModule: string, point?: string): Promise<ModuleExtension[]>;
127
- declare function hasExtension(targetModule: string, point?: string): Promise<boolean>;
128
- //#endregion
129
- export { PrivateRouteDefinition as C, SidebarMenuType as D, SidebarMenuItemType as E, SystemEvent as O, ModuleWidget as S, SidebarGroupType as T, ModuleNavElement as _, getKryoPathPrefix as a, ModulePageProps as b, getModuleWidgets as c, hasExtension as d, ApiRouteDefinition as f, ModuleManifestSchema as g, ModuleManifest as h, getKryoModuleRoutes as i, getPrivateModuleRoutes as l, ModuleExtension as m, getExtensions as n, getModuleNavigation as o, IModule as p, getKryoModuleNavigationGrouped as r, getModuleNavigationGrouped as s, getApiModuleRoutes as t, getPublicModuleRoutes as u, ModuleNavigation as v, PublicRouteDefinition as w, ModuleRouteDefinition as x, ModuleNavigationGroupMap as y };
130
- //# sourceMappingURL=ui-aeAUERbe.d.mts.map
116
+ export { ApiRouteDefinition, IModule, ModuleExtension, ModuleManifest, ModuleManifestSchema, ModuleNavElement, ModuleNavigation, ModuleNavigationGroupMap, ModulePageProps, ModuleRouteDefinition, ModuleWidget, PrivateRouteDefinition, PublicRouteDefinition, SidebarGroupType, SidebarMenuItemType, SidebarMenuType, type SystemEvent };
117
+ //# sourceMappingURL=types.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../src/types.ts"],"mappings":";;;;;KAMY,gBAAA;EACV,KAAA;EACA,KAAA,EAAO,eAAA;AAAA;AAAA,KAGG,mBAAA,KAAwB,MAAA;EAClC,EAAA;EACA,KAAA;EACA,IAAA;EACA,GAAA;EACA,KAAA;EACA,WAAA;EACA,KAAA;EACA,YAAA;AAAA,IAOE,CAAA;AAAA,KAEQ,eAAA,GAAkB,mBAAA;EAC5B,KAAA,GAAQ,mBAAA;AAAA;AAAA,cAGG,oBAAA,EAAoB,CAAA,CAAA,SAAA;;;;;;;;;;;;KAarB,cAAA,GAAiB,CAAA,CAAE,KAAA,QAAa,oBAAA;AAAA,UAI3B,eAAA;EACf,EAAA;EACA,YAAA;EACA,KAAA;EACA,SAAA,EAAW,KAAA,CAAM,aAAA;EACjB,QAAA;EACA,QAAA;AAAA;AAAA,UAGe,eAAA;EACf,MAAA;EACA,YAAA;AAAA;AAAA,UAGe,qBAAA;EACf,EAAA;EACA,KAAA,GAAQ,QAAA;EACR,WAAA,GAAc,cAAA;EACd,SAAA,EAAW,KAAA,CAAM,aAAA;EACjB,MAAA,GAAS,KAAA,CAAM,aAAA;IAAgB,QAAA,EAAU,KAAA,CAAM,SAAA;EAAA;EAC/C,gBAAA,IAAoB,KAAA,EAAO,eAAA,KAAoB,OAAA,CAAQ,QAAA,IAAY,QAAA;AAAA;AAAA,UAKpD,YAAA;EACf,EAAA;EACA,IAAA;EACA,IAAA;EACA,SAAA,EAAW,KAAA,CAAM,aAAA;EACjB,QAAA;AAAA;AAAA,UAGe,OAAA;EACf,QAAA,EAAU,cAAA;EACV,MAAA;EACA,SAAA,SAAkB,OAAA;EAClB,QAAA,SAAiB,OAAA;EACjB,SAAA,SAAkB,OAAA;EAClB,IAAA,SAAa,OAAA;EACb,OAAA,GAAU,YAAA;EACV,UAAA,GAAa,eAAA;EACb,UAAA,GAAa,gBAAA;EACb,MAAA;IACE,MAAA,GAAS,qBAAA;IACT,OAAA,GAAU,sBAAA;IACV,GAAA,GAAM,kBAAA;EAAA;AAAA;;;;KASE,gBAAA,GAAmB,mBAAA;EAC7B,KAAA,GAAQ,mBAAA;AAAA;;;;;;KAQE,wBAAA,GAA2B,MAAA,SAAe,gBAAA;AAAA,UAErC,qBAAA,SAA8B,qBAAA;EAC7C,IAAA;EACA,IAAA;AAAA;AAAA,UAGe,sBAAA,SAA+B,qBAAA;EAC9C,IAAA;EACA,IAAA;AAAA;AAAA,UAGe,kBAAA;EACf,EAAA;EACA,IAAA;EACA,OAAA,GAAU,OAAA,EAAS,OAAA,EAAS,OAAA,UAAiB,OAAA,CAAQ,QAAA,IAAY,QAAA;EACjE,IAAA;EACA,KAAA,GAAQ,QAAA;EACR,WAAA,GAAc,cAAA;AAAA;AAAA,UAGC,gBAAA;EACf,MAAA,GAAS,gBAAA;EACT,KAAA,GAAQ,wBAAA;EACR,QAAA,GAAW,wBAAA;EACX,YAAA,IACI,qBAAA,GACA,sBAAA,GACA,kBAAA;AAAA"}
package/dist/types.mjs ADDED
@@ -0,0 +1,19 @@
1
+ import { z } from "zod";
2
+
3
+ //#region src/types.ts
4
+ const ModuleManifestSchema = z.object({
5
+ id: z.string(),
6
+ name: z.string(),
7
+ version: z.string(),
8
+ description: z.string().optional(),
9
+ dependencies: z.array(z.string()).default([]),
10
+ extends: z.array(z.string()).default([]),
11
+ enabled: z.boolean().default(true),
12
+ system: z.boolean().default(false),
13
+ npmDependencies: z.array(z.string()).optional(),
14
+ npmDevDependencies: z.array(z.string()).optional()
15
+ });
16
+
17
+ //#endregion
18
+ export { ModuleManifestSchema };
19
+ //# sourceMappingURL=types.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.mjs","names":[],"sources":["../src/types.ts"],"sourcesContent":["import type { SystemEvent, UserPermission, UserRole } from \"@arch-cadre/core\";\nexport type { SystemEvent };\n\nimport type { Metadata } from \"next\";\nimport { z } from \"zod\";\n// import type { SidebarMenuItemType } from \"@arch-cadre/core\";\nexport type SidebarGroupType = {\n title: string;\n items: SidebarMenuType;\n};\n\nexport type SidebarMenuItemType<T = Record<string, string>> = {\n id?: string;\n title: string;\n icon?: string;\n url: string;\n roles?: string[];\n permissions?: string[];\n badge?: string | number | null | undefined;\n badgeVariant?:\n | \"default\"\n | \"secondary\"\n | \"destructive\"\n | \"outline\"\n | null\n | undefined;\n} & T;\n\nexport type SidebarMenuType = SidebarMenuItemType<{\n items?: SidebarMenuItemType[];\n}>[];\n\nexport const ModuleManifestSchema = z.object({\n id: z.string(),\n name: z.string(),\n version: z.string(),\n description: z.string().optional(),\n dependencies: z.array(z.string()).default([]),\n extends: z.array(z.string()).default([]), // NOWE: Lista modułów, które ten moduł rozszerza\n enabled: z.boolean().default(true),\n system: z.boolean().default(false),\n npmDependencies: z.array(z.string()).optional(),\n npmDevDependencies: z.array(z.string()).optional(),\n});\n\nexport type ModuleManifest = z.infer<typeof ModuleManifestSchema>;\n\n// --- NOWA STRUKTURA ROZSZERZEŃ ---\n\nexport interface ModuleExtension {\n id: string;\n targetModule: string; // ID modułu rozszerzanego\n point: string; // Miejsce rozszerzenia (np. \"post-editor-sidebar\")\n component: React.ComponentType<any>;\n priority?: number;\n metadata?: any;\n}\n\nexport interface ModulePageProps {\n params: any;\n searchParams: any;\n}\n\nexport interface ModuleRouteDefinition {\n id?: string;\n roles?: UserRole[];\n permissions?: UserPermission[];\n component: React.ComponentType<any>;\n layout?: React.ComponentType<{ children: React.ReactNode }>;\n generateMetadata?: (props: ModulePageProps) => Promise<Metadata> | Metadata;\n}\n\n// --- NOWA STRUKTURA WIDGETÓW ---\n\nexport interface ModuleWidget {\n id: string;\n name: string;\n area: \"dashboard-stats\" | \"dashboard-main\" | \"sidebar-bottom\" | string;\n component: React.ComponentType<any>;\n priority?: number;\n}\n\nexport interface IModule {\n manifest: ModuleManifest;\n schema?: any; // NOWE: Eksportowany schemat Drizzle\n onMigrate?: () => Promise<void>; // NOWE: Hook do migracji specyficznych dla modułu\n onEnable?: () => Promise<void>;\n onDisable?: () => Promise<void>;\n init?: () => Promise<void>;\n widgets?: ModuleWidget[];\n extensions?: ModuleExtension[]; // NOWE: Rejestracja rozszerzeń innych modułów\n navigation?: ModuleNavigation;\n routes?: {\n public?: PublicRouteDefinition[];\n private?: PrivateRouteDefinition[];\n api?: ApiRouteDefinition[];\n };\n}\n\n// --- Reszta bez zmian ---\n\n/**\n * Element menu zarejestrowany przez moduł.\n */\nexport type ModuleNavElement = SidebarMenuItemType<{\n items?: SidebarMenuItemType[];\n}>;\n\n/**\n * Mapa nawigacji modułu.\n * Klucz: Nazwa grupy (np. \"CMS\", \"Platform\", \"Journal\")\n * Vartość: Tablica elementów menu trafiających do tej grupy.\n */\nexport type ModuleNavigationGroupMap = Record<string, ModuleNavElement[]>;\n\nexport interface PublicRouteDefinition extends ModuleRouteDefinition {\n path: string; // np. \"/blog/:slug\"\n auth?: boolean;\n}\n\nexport interface PrivateRouteDefinition extends ModuleRouteDefinition {\n path: string; // np. \"/settings\" ale w systemie działa to jako \"/kryo/settings\"\n auth?: boolean;\n}\n\nexport interface ApiRouteDefinition {\n id?: string;\n path: string; // np. \"/api/my-module/data\"\n handler: (request: Request, context: any) => Promise<Response> | Response;\n auth?: boolean;\n roles?: UserRole[];\n permissions?: UserPermission[];\n}\n\nexport interface ModuleNavigation {\n public?: ModuleNavElement[];\n admin?: ModuleNavigationGroupMap;\n settings?: ModuleNavigationGroupMap;\n globalRoutes?: (\n | PublicRouteDefinition\n | PrivateRouteDefinition\n | ApiRouteDefinition\n )[];\n}\n"],"mappings":";;;AAgCA,MAAa,uBAAuB,EAAE,OAAO;CAC3C,IAAI,EAAE,QAAQ;CACd,MAAM,EAAE,QAAQ;CAChB,SAAS,EAAE,QAAQ;CACnB,aAAa,EAAE,QAAQ,CAAC,UAAU;CAClC,cAAc,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;CAC7C,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;CACxC,SAAS,EAAE,SAAS,CAAC,QAAQ,KAAK;CAClC,QAAQ,EAAE,SAAS,CAAC,QAAQ,MAAM;CAClC,iBAAiB,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;CAC/C,oBAAoB,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;CACnD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arch-cadre/modules",
3
- "version": "0.0.26",
3
+ "version": "0.0.28",
4
4
  "description": "Core Modules for Kryo framework",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/client/widget-area.tsx"],"mappings":";;;;;UAGU,eAAA;EACR,IAAA;EACA,SAAA;EACA,QAAA,GAAW,KAAA,CAAM,SAAA;EAEjB,KAAA;AAAA;AAAA,iBAGoB,UAAA,CAAA;EACpB,IAAA;EACA,SAAA;EACA,QAAA;EACA;AAAA,GACC,eAAA,GAAe,OAAA,sCAAA,QAAA,CAAA,KAAA,CAAA,SAAA,IAAA,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/client/widget-area.tsx"],"mappings":";;;;;UAGU,eAAA;EACR,IAAA;EACA,SAAA;EACA,QAAA,GAAW,KAAA,CAAM,SAAA;EAEjB,KAAA;AAAA;AAAA,iBAGoB,UAAA,CAAA;EACpB,IAAA;EACA,SAAA;EACA,QAAA;EACA;AAAA,GACC,eAAA,GAAe,OAAA,sCAAA,QAAA,CAAA,KAAA,CAAA,SAAA,IAAA,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/client/widget-area.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { getModuleWidgets } from \"../server/ui\";\n\ninterface WidgetAreaProps {\n area: string;\n className?: string;\n fallback?: React.ReactNode;\n // Przekazywanie dowolnych propsów do widgetów (np. dane użytkownika)\n props?: any;\n}\n\nexport async function WidgetArea({\n area,\n className,\n fallback,\n props,\n}: WidgetAreaProps) {\n const widgets = await getModuleWidgets(area);\n\n if (widgets.length === 0) {\n return fallback || null;\n }\n\n return (\n <div className={className}>\n {widgets.map((widget) => {\n const Component = widget.component;\n return <Component key={widget.id} {...props} />;\n })}\n </div>\n );\n}\n"],"mappings":";;;;;AAWA,eAAsB,WAAW,EAC/B,MACA,WACA,UACA,SACkB;CAClB,MAAM,UAAU,MAAM,iBAAiB,KAAK;AAE5C,KAAI,QAAQ,WAAW,EACrB,QAAO,YAAY;AAGrB,QACE,oBAAC;EAAe;YACb,QAAQ,KAAK,WAAW;GACvB,MAAM,YAAY,OAAO;AACzB,UAAO,oBAAC,aAA0B,GAAI,SAAf,OAAO,GAAiB;IAC/C;GACE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.d.cts","names":[],"sources":["../src/client/extension-point.tsx","../src/server/lifecycle.ts","../src/server/manage.ts","../src/server/registry.ts"],"mappings":";;;;;UAGU,mBAAA;EACR,MAAA;EACA,KAAA;EACA,SAAA;EACA,KAAA;EACA,QAAA,GAAW,KAAA,CAAM,SAAA;AAAA;AAAA,iBAGG,cAAA,CAAA;EACpB,MAAA;EACA,KAAA;EACA,SAAA;EACA,KAAA;EACA;AAAA,GACC,mBAAA,GAAmB,OAAA,sCAAA,QAAA,CAAA,KAAA,CAAA,SAAA,IAAA,kBAAA,CAAA,GAAA,CAAA,OAAA;;;iBC2FA,gBAAA,CAAiB,QAAA,WAAgB,OAAA;AAAA,iBAwLjC,iBAAA,CAAkB,QAAA,UAAkB,SAAA,YAAkB,OAAA;;;iBAWtD,sBAAA,CAAA,GAAsB,OAAA;;;iBChStB,eAAA,CAAgB,OAAA,EAAS,OAAA,KAAS,OAAA;AAAA,iBASlC,UAAA,CAAA,GAAU,OAAA;;;;;;;;;;;;;;;iBAmDV,eAAA,CAAgB,QAAA,WAAgB,OAAA;;;;;iBAiBhC,eAAA,CAAgB,QAAA,WAAmB,OAAA;AAAA,iBAYnC,iBAAA,CACpB,QAAA,WACC,OAAA,CAAQ,OAAA;AAAA,iBA6CW,eAAA,GAAA,CAAmB,QAAA,WAAmB,OAAA,CAAQ,CAAA;AAAA,iBAa9C,kBAAA,CAAmB,QAAA,UAAkB,MAAA,QAAW,OAAA;;;iBCzJhD,WAAA,CAAY,KAAA,aAAa,OAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.d.mts","names":[],"sources":["../src/client/extension-point.tsx","../src/server/lifecycle.ts","../src/server/manage.ts","../src/server/registry.ts"],"mappings":";;;;;UAGU,mBAAA;EACR,MAAA;EACA,KAAA;EACA,SAAA;EACA,KAAA;EACA,QAAA,GAAW,KAAA,CAAM,SAAA;AAAA;AAAA,iBAGG,cAAA,CAAA;EACpB,MAAA;EACA,KAAA;EACA,SAAA;EACA,KAAA;EACA;AAAA,GACC,mBAAA,GAAmB,OAAA,sCAAA,QAAA,CAAA,KAAA,CAAA,SAAA,IAAA,kBAAA,CAAA,GAAA,CAAA,OAAA;;;iBC2FA,gBAAA,CAAiB,QAAA,WAAgB,OAAA;AAAA,iBAwLjC,iBAAA,CAAkB,QAAA,UAAkB,SAAA,YAAkB,OAAA;;;iBAWtD,sBAAA,CAAA,GAAsB,OAAA;;;iBChStB,eAAA,CAAgB,OAAA,EAAS,OAAA,KAAS,OAAA;AAAA,iBASlC,UAAA,CAAA,GAAU,OAAA;;;;;;;;;;;;;;;iBAmDV,eAAA,CAAgB,QAAA,WAAgB,OAAA;;;;;iBAiBhC,eAAA,CAAgB,QAAA,WAAmB,OAAA;AAAA,iBAYnC,iBAAA,CACpB,QAAA,WACC,OAAA,CAAQ,OAAA;AAAA,iBA6CW,eAAA,GAAA,CAAmB,QAAA,WAAmB,OAAA,CAAQ,CAAA;AAAA,iBAa9C,kBAAA,CAAmB,QAAA,UAAkB,MAAA,QAAW,OAAA;;;iBCzJhD,WAAA,CAAY,KAAA,aAAa,OAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.mjs","names":[],"sources":["../src/client/extension-point.tsx","../src/server/lifecycle.ts","../src/server/registry.ts"],"sourcesContent":["import * as React from \"react\";\nimport { getExtensions } from \"../server/ui\";\n\ninterface ExtensionPointProps {\n module: string;\n point: string;\n className?: string;\n props?: any;\n fallback?: React.ReactNode;\n}\n\nexport async function ExtensionPoint({\n module,\n point,\n className,\n props,\n fallback,\n}: ExtensionPointProps) {\n const extensions = await getExtensions(module, point);\n\n if (extensions.length === 0) return fallback || null;\n\n return (\n <div className={className}>\n {extensions.map((ext) => {\n const Component = ext.component;\n return <Component key={ext.id} {...props} />;\n })}\n </div>\n );\n}\n","\"use server\";\n\nimport { exec } from \"node:child_process\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { systemModulesTable } from \"@arch-cadre/core\";\nimport { db } from \"@arch-cadre/core/server\";\nimport { eq } from \"drizzle-orm\";\nimport { getModuleInstance, getModules } from \"./manage\";\n\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nasync function updateStep(moduleId: string, step: string | null) {\n console.log(`[Kernel] \"${moduleId}\" step: ${step}`);\n await db\n .update(systemModulesTable)\n .set({ lastStep: step })\n .where(eq(systemModulesTable.id, moduleId));\n}\n\nasync function resolveSchemaPath(moduleId: string): Promise<string | null> {\n // const path = await import(\"node:path\");\n // const fs = await import(\"node:fs/promises\");\n const root = process.cwd();\n\n // 1. Special case for core\n if (moduleId === \"@arch-cadre/core\" || moduleId === \"core\") {\n const p = path.join(\n root,\n \"node_modules\",\n \"@kryo\",\n \"core\",\n \"dist\",\n \"server\",\n \"database\",\n \"schema.cjs\",\n );\n try {\n await fs.access(p);\n return p;\n } catch {\n // Monorepo dev fallback\n const devP = path.resolve(\n root,\n \"../../packages/kryo-core/src/server/database/schema.ts\",\n );\n try {\n await fs.access(devP);\n return devP;\n } catch {}\n }\n return null;\n }\n\n // Normalize moduleId (remove @arch-cadre/ prefix if present for directory searching)\n const cleanId = moduleId.replace(\"@arch-cadre/\", \"\");\n\n const possible = [\n // Local module\n path.join(root, \"modules\", cleanId, \"schema.ts\"),\n path.join(root, \"modules\", moduleId, \"schema.ts\"),\n\n // node_modules (installed or symlinked)\n path.join(root, \"node_modules\", moduleId, \"dist\", \"schema.cjs\"),\n path.join(\n root,\n \"node_modules\",\n `@arch-cadre/${cleanId}`,\n \"dist\",\n \"schema.cjs\",\n ),\n path.join(root, \"node_modules\", moduleId, \"src\", \"schema.ts\"),\n path.join(\n root,\n \"node_modules\",\n `@arch-cadre/${cleanId}`,\n \"src\",\n \"schema.ts\",\n ),\n\n // Monorepo packages (searching by various naming conventions)\n path.resolve(root, \"../../packages\", cleanId, \"src\", \"schema.ts\"),\n path.resolve(root, \"../../packages\", `kryo-${cleanId}`, \"src\", \"schema.ts\"),\n path.resolve(root, \"../../packages\", cleanId, \"schema.ts\"),\n ];\n\n for (const p of possible) {\n try {\n await fs.access(p);\n console.log(\n `[Kernel:Lifecycle] Resolved schema for ${moduleId} at: ${p}`,\n );\n return p;\n } catch {\n console.warn(\n `[Kernel:Lifecycle] Unresolved schema for ${moduleId} at: ${p}`,\n );\n }\n }\n\n console.warn(\n `[Kernel:Lifecycle] Could not resolve schema path for: ${moduleId}`,\n );\n\n return null;\n}\n\nexport async function pushModuleSchema(moduleId: string) {\n const execAsync = promisify(exec);\n\n console.log(`[Kernel:Lifecycle] Targeted sync for module: ${moduleId}`);\n\n const root = process.cwd();\n\n // 1. Get all currently enabled modules to avoid dropping their tables\n const enabledFromDb = await db\n .select({ id: systemModulesTable.id })\n .from(systemModulesTable)\n .where(eq(systemModulesTable.enabled, true));\n\n const activeModuleIds = new Set(enabledFromDb.map((m) => m.id));\n activeModuleIds.add(\"@arch-cadre/core\");\n activeModuleIds.add(moduleId);\n\n // 2. Resolve physical paths for all active schemas\n const schemaPaths: string[] = [];\n for (const id of Array.from(activeModuleIds)) {\n const p = await resolveSchemaPath(id);\n if (p) schemaPaths.push(p);\n }\n\n if (schemaPaths.length === 0) {\n console.warn(\n `[Kernel:Lifecycle] No schema paths resolved for ${moduleId}, skipping push.`,\n );\n return;\n }\n\n // 3. Prepare command\n const configPath = path.join(root, \"drizzle.config.ts\");\n const drizzleKitBin = path.join(root, \"node_modules\", \".bin\", \"drizzle-kit\");\n\n const cmd = `\"${drizzleKitBin}\" push --force --config=${configPath}`;\n\n console.log(\n `[Kernel:Lifecycle] Executing isolated migration. Modules: ${Array.from(activeModuleIds).join(\", \")}`,\n );\n\n try {\n await execAsync(cmd, {\n env: {\n ...process.env,\n CI: \"true\",\n // Pass the calculated schemas to our dynamic drizzle.config.ts\n DRIZZLE_SCHEMA_OVERRIDE: schemaPaths.join(\",\"),\n },\n cwd: root,\n });\n console.log(\n `[Kernel:Lifecycle] Isolated migration successful for ${moduleId}`,\n );\n } catch (e: any) {\n console.error(\n `[Kernel:Lifecycle] Isolated migration failed for ${moduleId}:`,\n );\n console.error(e.stdout || e.message);\n throw new Error(`Migration failed: ${moduleId}`);\n }\n}\n\nasync function performToggle(moduleId: string, isEnabled: boolean) {\n try {\n const allModules = await getModules();\n const manifest = allModules.find((m) => m.id === moduleId);\n\n await updateStep(moduleId, \"Validate module...\");\n await sleep(500);\n\n if (!manifest) return;\n\n if (isEnabled) {\n await updateStep(moduleId, \"Queued...\");\n await sleep(500);\n\n /*\n * 1. Check dependencies\n * 2. Enable module in DB (but not marked as installed yet)\n * 3. Run onMigrate (or default push) to sync DB\n * 4. Run onEnable\n * 5. Mark as installed\n */\n if (manifest.dependencies?.length) {\n const pendingDeps = manifest.dependencies.filter((depId) => {\n const dep = allModules.find((m) => m.id === depId);\n return dep && !dep.enabled && !dep.system;\n });\n\n if (pendingDeps.length > 0) {\n // await updateStep(moduleId, \"Waiting for dependencies...\");\n\n for (const depId of pendingDeps) {\n await updateStep(moduleId, `Waiting for dependency \"${depId}\"...`);\n await performToggle(depId, true);\n await sleep(500);\n }\n }\n }\n\n await updateStep(moduleId, \"Initializing...\");\n await sleep(500);\n await db\n .update(systemModulesTable)\n .set({ enabled: true })\n .where(eq(systemModulesTable.id, moduleId));\n\n const instance = await getModuleInstance(moduleId);\n\n await updateStep(moduleId, \"Migrate database...\");\n await sleep(500);\n\n try {\n if (instance?.onMigrate) {\n await instance.onMigrate();\n } else {\n // Fallback to default push if no hook provided but schema might exist\n await pushModuleSchema(moduleId);\n }\n await updateStep(moduleId, \"Migration successful\");\n } catch (e: any) {\n console.error(`[Kernel] Migration failed for ${moduleId}:`, e);\n await updateStep(moduleId, `Migration failed: ${e.message}`);\n await sleep(500);\n }\n\n if (instance?.onEnable) {\n await updateStep(moduleId, \"Running setup...\");\n await sleep(500);\n await instance.onEnable();\n }\n\n await updateStep(moduleId, \"Finishing...\");\n await sleep(500);\n await db\n .update(systemModulesTable)\n .set({ installed: true, lastStep: null })\n .where(eq(systemModulesTable.id, moduleId));\n } else {\n const dependents = allModules.filter((m) => {\n if (!m.enabled || m.id === moduleId) return false;\n\n if (m.dependencies?.includes(moduleId)) return true;\n\n if (m.extends?.includes(moduleId)) {\n const otherActiveTargets = m.extends.filter((targetId) => {\n if (targetId === moduleId) return false;\n const target = allModules.find((mod) => mod.id === targetId);\n return target?.enabled;\n });\n\n return otherActiveTargets.length === 0;\n }\n\n return false;\n });\n\n if (dependents.length > 0) {\n await updateStep(moduleId, `Deactivating dependents...`);\n for (const dep of dependents) {\n await performToggle(dep.id, false);\n await sleep(500);\n }\n }\n\n await updateStep(moduleId, \"Deactivating...\");\n\n const instance = await getModuleInstance(moduleId);\n if (instance?.onDisable) await instance.onDisable();\n\n await db\n .update(systemModulesTable)\n .set({ enabled: false, installed: false })\n .where(eq(systemModulesTable.id, moduleId));\n\n await updateStep(moduleId, null);\n }\n } catch (e) {\n console.error(`[Kernel] Fatal error for ${moduleId}:`, e);\n await updateStep(moduleId, `Error: ${(e as Error).message}`);\n }\n}\n\nexport async function toggleModuleState(moduleId: string, isEnabled: boolean) {\n const allModules = await getModules();\n const manifest = allModules.find((m) => m.id === moduleId);\n if (!manifest) throw new Error(`Module \"${moduleId}\" not found`);\n\n if (manifest.enabled === isEnabled) return { success: true };\n\n void performToggle(moduleId, isEnabled);\n return { success: true };\n}\n\nexport async function initOperationalModules() {\n const allModules = await getModules();\n for (const mod of allModules) {\n if (mod.enabled) {\n try {\n const instance = await getModuleInstance(mod.id);\n if (instance?.init) {\n await instance.init();\n }\n } catch (e) {\n console.error(`[Kernel] Failed to init module ${mod.id}:`, e);\n }\n }\n }\n}\n","\"use server\";\n\nimport { eventBus, systemModulesTable } from \"@arch-cadre/core\";\nimport { db } from \"@arch-cadre/core/server\";\nimport { eq } from \"drizzle-orm\";\nimport { getModuleInstance, getModules, isModuleEnabled } from \"./manage\";\n\nconst globalForRegistry = globalThis as unknown as {\n __KRYO_MODULES_INITIALIZED__: boolean | undefined;\n};\n\nexport async function initModules(force = false) {\n if (globalForRegistry.__KRYO_MODULES_INITIALIZED__ && !force) return;\n\n if (force) {\n console.log(\"[Kernel:Registry] Forcing re-initialization...\");\n eventBus.clearAll();\n }\n\n console.log(\"[Kernel:Registry] Synchronizing module listeners...\");\n globalForRegistry.__KRYO_MODULES_INITIALIZED__ = true;\n\n await eventBus.publish(\"system:modules:init:start\", {\n timestamp: Date.now(),\n });\n\n const processedModuleIds = new Set<string>();\n let hasNewModules = true;\n let iterations = 0;\n const MAX_ITERATIONS = 10; // Bezpiecznik przed nieskończoną pętlą\n\n while (hasNewModules && iterations < MAX_ITERATIONS) {\n hasNewModules = false;\n iterations++;\n\n // 1. Get ALL currently registered modules (including newly added ones)\n const currentModules = await getModules();\n\n // 2. Filter out modules that are already processed\n const pendingModules = currentModules.filter(\n (mod) => !processedModuleIds.has(mod.id),\n );\n\n if (pendingModules.length === 0) {\n break;\n }\n\n // 3. Synchronize new modules with database\n for (const mod of pendingModules) {\n try {\n await db\n .insert(systemModulesTable)\n .values({\n id: mod.id,\n enabled: mod.system ?? false,\n installed: mod.system ?? false,\n system: mod.system ?? false,\n })\n .onConflictDoNothing();\n } catch (_e) {\n // Table might not exist yet\n }\n }\n\n // 4. Sort pending modules: system modules first\n const sortedPending = [...pendingModules].sort((a, b) =>\n a.system === b.system ? 0 : a.system ? -1 : 1,\n );\n\n // 5. Initialize modules\n for (const mod of sortedPending) {\n // Mark as processed immediately to avoid cycles\n processedModuleIds.add(mod.id);\n hasNewModules = true; // We processed something, so we should check again in case it added more\n\n try {\n const enabled = await isModuleEnabled(mod.id);\n if (!enabled) continue;\n\n const instance = await getModuleInstance(mod.id);\n\n if (!instance) {\n console.warn(\n `[Kernel:Registry] No instance found for module ${mod.id}. Ensure it is registered correctly.`,\n );\n continue;\n }\n\n let dbMod: any = null;\n try {\n [dbMod] = await db\n .select()\n .from(systemModulesTable)\n .where(eq(systemModulesTable.id, mod.id));\n } catch (_e) {\n // Ignore missing table\n }\n\n // onEnable lifecycle\n if (enabled && (!dbMod || !dbMod.installed)) {\n console.log(`[Kernel:Registry] Installing module ${mod.id}...`);\n\n // 1. Run migrations first\n if (instance.onMigrate) {\n console.log(`[Kernel:Registry] Running onMigrate for ${mod.id}...`);\n await instance.onMigrate();\n }\n\n // 2. Run enable hook\n console.log(`[Kernel:Registry] Running onEnable for ${mod.id}...`);\n if (instance.onEnable) await instance.onEnable();\n\n try {\n await db\n .update(systemModulesTable)\n .set({ installed: true, lastStep: null })\n .where(eq(systemModulesTable.id, mod.id));\n } catch (_e) {\n // Ignore missing table\n }\n }\n\n // Operational init\n if (instance.init) {\n console.log(`[Kernel:Registry] Initializing ${mod.id}...`);\n await instance.init();\n console.log(`[Kernel:Registry] Module ${mod.id} is active.`);\n }\n } catch (error) {\n console.error(\n `[Kernel:Registry] Critical failure for ${mod.id}:`,\n error,\n );\n }\n }\n }\n\n if (iterations >= MAX_ITERATIONS) {\n console.warn(\n \"[Kernel:Registry] Max init iterations reached. Check for circular module registrations.\",\n );\n }\n\n await eventBus.publish(\"system:modules:init:end\", {\n timestamp: Date.now(),\n moduleCount: processedModuleIds.size,\n });\n}\n"],"mappings":"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"}