@arch-cadre/modules 0.0.6 → 0.0.8

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.
@@ -2,21 +2,21 @@
2
2
 
3
3
  const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
4
4
  const require_manage = require('./manage.cjs');
5
- let _kryo_core_server = require("@kryo/core/server");
6
- let _kryo_core = require("@kryo/core");
5
+ let _arch_cadre_core_server = require("@arch-cadre/core/server");
6
+ let _arch_cadre_core = require("@arch-cadre/core");
7
7
  let drizzle_orm = require("drizzle-orm");
8
8
 
9
9
  //#region src/server/lifecycle.ts
10
10
  const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
11
11
  async function updateStep(moduleId, step) {
12
12
  console.log(`[Kernel] "${moduleId}" step: ${step}`);
13
- await _kryo_core_server.db.update(_kryo_core.systemModulesTable).set({ lastStep: step }).where((0, drizzle_orm.eq)(_kryo_core.systemModulesTable.id, moduleId));
13
+ await _arch_cadre_core_server.db.update(_arch_cadre_core.systemModulesTable).set({ lastStep: step }).where((0, drizzle_orm.eq)(_arch_cadre_core.systemModulesTable.id, moduleId));
14
14
  }
15
15
  async function resolveSchemaPath(moduleId) {
16
16
  const path = await import("node:path");
17
17
  const fs = await import("node:fs/promises");
18
18
  const root = process.cwd();
19
- if (moduleId === "@kryo/core" || moduleId === "core") {
19
+ if (moduleId === "@arch-cadre/core" || moduleId === "core") {
20
20
  const p = path.join(root, "node_modules", "@kryo", "core", "dist", "server", "database", "schema.cjs");
21
21
  try {
22
22
  await fs.access(p);
@@ -30,12 +30,12 @@ async function resolveSchemaPath(moduleId) {
30
30
  }
31
31
  return null;
32
32
  }
33
- const cleanId = moduleId.replace("@kryo/", "");
33
+ const cleanId = moduleId.replace("@arch-cadre/", "");
34
34
  const possible = [
35
35
  path.join(root, "modules", cleanId, "schema.ts"),
36
36
  path.join(root, "modules", moduleId, "schema.ts"),
37
37
  path.join(root, "node_modules", moduleId, "dist", "schema.cjs"),
38
- path.join(root, "node_modules", `@kryo/${cleanId}`, "dist", "schema.cjs"),
38
+ path.join(root, "node_modules", `@arch-cadre/${cleanId}`, "dist", "schema.cjs"),
39
39
  path.resolve(root, "../../packages", cleanId, "src", "schema.ts"),
40
40
  path.resolve(root, "../../packages", `kryo-${cleanId}`, "src", "schema.ts"),
41
41
  path.resolve(root, "../../packages", cleanId, "schema.ts")
@@ -55,9 +55,9 @@ async function pushModuleSchema(moduleId) {
55
55
  const path = await import("node:path");
56
56
  console.log(`[Kernel:Lifecycle] Targeted sync for module: ${moduleId}`);
57
57
  const root = process.cwd();
58
- const enabledFromDb = await _kryo_core_server.db.select({ id: _kryo_core.systemModulesTable.id }).from(_kryo_core.systemModulesTable).where((0, drizzle_orm.eq)(_kryo_core.systemModulesTable.enabled, true));
58
+ const enabledFromDb = await _arch_cadre_core_server.db.select({ id: _arch_cadre_core.systemModulesTable.id }).from(_arch_cadre_core.systemModulesTable).where((0, drizzle_orm.eq)(_arch_cadre_core.systemModulesTable.enabled, true));
59
59
  const activeModuleIds = new Set(enabledFromDb.map((m) => m.id));
60
- activeModuleIds.add("@kryo/core");
60
+ activeModuleIds.add("@arch-cadre/core");
61
61
  activeModuleIds.add(moduleId);
62
62
  const schemaPaths = [];
63
63
  for (const id of Array.from(activeModuleIds)) {
@@ -115,7 +115,7 @@ async function performToggle(moduleId, isEnabled) {
115
115
  }
116
116
  await updateStep(moduleId, "Initializing...");
117
117
  await sleep(500);
118
- await _kryo_core_server.db.update(_kryo_core.systemModulesTable).set({ enabled: true }).where((0, drizzle_orm.eq)(_kryo_core.systemModulesTable.id, moduleId));
118
+ await _arch_cadre_core_server.db.update(_arch_cadre_core.systemModulesTable).set({ enabled: true }).where((0, drizzle_orm.eq)(_arch_cadre_core.systemModulesTable.id, moduleId));
119
119
  const instance = await require_manage.getModuleInstance(moduleId);
120
120
  await updateStep(moduleId, "Migrate database...");
121
121
  await sleep(500);
@@ -134,10 +134,10 @@ async function performToggle(moduleId, isEnabled) {
134
134
  }
135
135
  await updateStep(moduleId, "Finishing...");
136
136
  await sleep(500);
137
- await _kryo_core_server.db.update(_kryo_core.systemModulesTable).set({
137
+ await _arch_cadre_core_server.db.update(_arch_cadre_core.systemModulesTable).set({
138
138
  installed: true,
139
139
  lastStep: null
140
- }).where((0, drizzle_orm.eq)(_kryo_core.systemModulesTable.id, moduleId));
140
+ }).where((0, drizzle_orm.eq)(_arch_cadre_core.systemModulesTable.id, moduleId));
141
141
  } else {
142
142
  const dependents = allModules.filter((m) => {
143
143
  if (!m.enabled || m.id === moduleId) return false;
@@ -158,10 +158,10 @@ async function performToggle(moduleId, isEnabled) {
158
158
  await updateStep(moduleId, "Deactivating...");
159
159
  const instance = await require_manage.getModuleInstance(moduleId);
160
160
  if (instance?.onDisable) await instance.onDisable();
161
- await _kryo_core_server.db.update(_kryo_core.systemModulesTable).set({
161
+ await _arch_cadre_core_server.db.update(_arch_cadre_core.systemModulesTable).set({
162
162
  enabled: false,
163
163
  installed: false
164
- }).where((0, drizzle_orm.eq)(_kryo_core.systemModulesTable.id, moduleId));
164
+ }).where((0, drizzle_orm.eq)(_arch_cadre_core.systemModulesTable.id, moduleId));
165
165
  await updateStep(moduleId, null);
166
166
  }
167
167
  } catch (e) {
@@ -1,8 +1,8 @@
1
1
  "use server";
2
2
 
3
3
  import { getModuleInstance, getModules } from "./manage.mjs";
4
- import { db } from "@kryo/core/server";
5
- import { systemModulesTable } from "@kryo/core";
4
+ import { db } from "@arch-cadre/core/server";
5
+ import { systemModulesTable } from "@arch-cadre/core";
6
6
  import { eq } from "drizzle-orm";
7
7
 
8
8
  //#region src/server/lifecycle.ts
@@ -15,7 +15,7 @@ async function resolveSchemaPath(moduleId) {
15
15
  const path = await import("node:path");
16
16
  const fs = await import("node:fs/promises");
17
17
  const root = process.cwd();
18
- if (moduleId === "@kryo/core" || moduleId === "core") {
18
+ if (moduleId === "@arch-cadre/core" || moduleId === "core") {
19
19
  const p = path.join(root, "node_modules", "@kryo", "core", "dist", "server", "database", "schema.cjs");
20
20
  try {
21
21
  await fs.access(p);
@@ -29,12 +29,12 @@ async function resolveSchemaPath(moduleId) {
29
29
  }
30
30
  return null;
31
31
  }
32
- const cleanId = moduleId.replace("@kryo/", "");
32
+ const cleanId = moduleId.replace("@arch-cadre/", "");
33
33
  const possible = [
34
34
  path.join(root, "modules", cleanId, "schema.ts"),
35
35
  path.join(root, "modules", moduleId, "schema.ts"),
36
36
  path.join(root, "node_modules", moduleId, "dist", "schema.cjs"),
37
- path.join(root, "node_modules", `@kryo/${cleanId}`, "dist", "schema.cjs"),
37
+ path.join(root, "node_modules", `@arch-cadre/${cleanId}`, "dist", "schema.cjs"),
38
38
  path.resolve(root, "../../packages", cleanId, "src", "schema.ts"),
39
39
  path.resolve(root, "../../packages", `kryo-${cleanId}`, "src", "schema.ts"),
40
40
  path.resolve(root, "../../packages", cleanId, "schema.ts")
@@ -56,7 +56,7 @@ async function pushModuleSchema(moduleId) {
56
56
  const root = process.cwd();
57
57
  const enabledFromDb = await db.select({ id: systemModulesTable.id }).from(systemModulesTable).where(eq(systemModulesTable.enabled, true));
58
58
  const activeModuleIds = new Set(enabledFromDb.map((m) => m.id));
59
- activeModuleIds.add("@kryo/core");
59
+ activeModuleIds.add("@arch-cadre/core");
60
60
  activeModuleIds.add(moduleId);
61
61
  const schemaPaths = [];
62
62
  for (const id of Array.from(activeModuleIds)) {
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.mjs","names":[],"sources":["../../src/server/lifecycle.ts"],"sourcesContent":["\"use server\";\n\nimport { systemModulesTable } from \"@kryo/core\";\nimport { db } from \"@kryo/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 === \"@kryo/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 @kryo/ prefix if present for directory searching)\n const cleanId = moduleId.replace(\"@kryo/\", \"\");\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(root, \"node_modules\", `@kryo/${cleanId}`, \"dist\", \"schema.cjs\"),\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 }\n\n console.warn(\n `[Kernel:Lifecycle] Could not resolve schema path for: ${moduleId}`,\n );\n return null;\n}\n\nexport async function pushModuleSchema(moduleId: string) {\n const { exec } = await import(\"node:child_process\");\n const { promisify } = await import(\"node:util\");\n const execAsync = promisify(exec);\n const path = await import(\"node:path\");\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(\"@kryo/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 { exec } = await import(\"node:child_process\");\n const { promisify } = await import(\"node:util\");\n const execAsync = promisify(exec);\n\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 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 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 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(1000);\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"],"mappings":"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"}
1
+ {"version":3,"file":"lifecycle.mjs","names":[],"sources":["../../src/server/lifecycle.ts"],"sourcesContent":["\"use server\";\n\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(root, \"node_modules\", `@arch-cadre/${cleanId}`, \"dist\", \"schema.cjs\"),\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 }\n\n console.warn(\n `[Kernel:Lifecycle] Could not resolve schema path for: ${moduleId}`,\n );\n return null;\n}\n\nexport async function pushModuleSchema(moduleId: string) {\n const { exec } = await import(\"node:child_process\");\n const { promisify } = await import(\"node:util\");\n const execAsync = promisify(exec);\n const path = await import(\"node:path\");\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 { exec } = await import(\"node:child_process\");\n const { promisify } = await import(\"node:util\");\n const execAsync = promisify(exec);\n\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 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 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 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(1000);\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"],"mappings":"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"}
@@ -2,8 +2,8 @@
2
2
 
3
3
  const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
4
4
  const require_types = require('../types.cjs');
5
- let _kryo_core_server = require("@kryo/core/server");
6
- let _kryo_core = require("@kryo/core");
5
+ let _arch_cadre_core_server = require("@arch-cadre/core/server");
6
+ let _arch_cadre_core = require("@arch-cadre/core");
7
7
  let drizzle_orm = require("drizzle-orm");
8
8
 
9
9
  //#region src/server/manage.ts
@@ -17,7 +17,7 @@ async function getModules() {
17
17
  try {
18
18
  const fs = await import("node:fs/promises");
19
19
  const path = await import("node:path");
20
- const modulesDir = await (0, _kryo_core_server.getModulesDir)();
20
+ const modulesDir = await (0, _arch_cadre_core_server.getModulesDir)();
21
21
  const manifests = [];
22
22
  const entries = await fs.readdir(modulesDir).catch(() => []);
23
23
  for (const dir of entries) {
@@ -36,7 +36,7 @@ async function getModules() {
36
36
  ...mod.manifest,
37
37
  hasDocs: false
38
38
  });
39
- const dbModules = await _kryo_core_server.db.select().from(_kryo_core.systemModulesTable).catch(() => []);
39
+ const dbModules = await _arch_cadre_core_server.db.select().from(_arch_cadre_core.systemModulesTable).catch(() => []);
40
40
  const dbMap = new Map(dbModules.map((m) => [m.id, m]));
41
41
  return manifests.map((mod) => {
42
42
  const dbEntry = dbMap.get(mod.id);
@@ -54,7 +54,7 @@ async function getModules() {
54
54
  }
55
55
  async function getModuleStatus(moduleId) {
56
56
  try {
57
- const [mod] = await _kryo_core_server.db.select().from(_kryo_core.systemModulesTable).where((0, drizzle_orm.eq)(_kryo_core.systemModulesTable.id, moduleId));
57
+ const [mod] = await _arch_cadre_core_server.db.select().from(_arch_cadre_core.systemModulesTable).where((0, drizzle_orm.eq)(_arch_cadre_core.systemModulesTable.id, moduleId));
58
58
  return {
59
59
  enabled: mod?.enabled,
60
60
  installed: mod?.installed,
@@ -69,7 +69,7 @@ async function getModuleStatus(moduleId) {
69
69
  }
70
70
  async function isModuleEnabled(moduleId) {
71
71
  try {
72
- const [mod] = await _kryo_core_server.db.select().from(_kryo_core.systemModulesTable).where((0, drizzle_orm.eq)(_kryo_core.systemModulesTable.id, moduleId));
72
+ const [mod] = await _arch_cadre_core_server.db.select().from(_arch_cadre_core.systemModulesTable).where((0, drizzle_orm.eq)(_arch_cadre_core.systemModulesTable.id, moduleId));
73
73
  return !!mod?.enabled || !!mod?.system;
74
74
  } catch {
75
75
  return false;
@@ -98,7 +98,7 @@ async function getModuleInstance(moduleId) {
98
98
  }
99
99
  async function getModuleConfig(moduleId) {
100
100
  try {
101
- const [mod] = await _kryo_core_server.db.select({ config: _kryo_core.systemModulesTable.config }).from(_kryo_core.systemModulesTable).where((0, drizzle_orm.eq)(_kryo_core.systemModulesTable.id, moduleId));
101
+ const [mod] = await _arch_cadre_core_server.db.select({ config: _arch_cadre_core.systemModulesTable.config }).from(_arch_cadre_core.systemModulesTable).where((0, drizzle_orm.eq)(_arch_cadre_core.systemModulesTable.id, moduleId));
102
102
  if (!mod?.config) return null;
103
103
  return JSON.parse(mod.config);
104
104
  } catch {
@@ -107,7 +107,7 @@ async function getModuleConfig(moduleId) {
107
107
  }
108
108
  async function updateModuleConfig(moduleId, config) {
109
109
  try {
110
- await _kryo_core_server.db.update(_kryo_core.systemModulesTable).set({ config: JSON.stringify(config) }).where((0, drizzle_orm.eq)(_kryo_core.systemModulesTable.id, moduleId));
110
+ await _arch_cadre_core_server.db.update(_arch_cadre_core.systemModulesTable).set({ config: JSON.stringify(config) }).where((0, drizzle_orm.eq)(_arch_cadre_core.systemModulesTable.id, moduleId));
111
111
  } catch (e) {
112
112
  console.warn(`[Kernel:Manage] Failed to update config for ${moduleId}:`, e);
113
113
  }
@@ -3,9 +3,9 @@ import { IModule } from "../types.cjs";
3
3
  //#region src/server/manage.d.ts
4
4
  declare function registerModules(modules: IModule[]): Promise<void>;
5
5
  declare function getModules(): Promise<{
6
- enabled: boolean;
7
- installed: boolean;
8
- lastStep: string | null | undefined;
6
+ enabled: any;
7
+ installed: any;
8
+ lastStep: any;
9
9
  hasDocs: boolean;
10
10
  id: string;
11
11
  name: string;
@@ -18,9 +18,9 @@ declare function getModules(): Promise<{
18
18
  npmDevDependencies?: string[] | undefined;
19
19
  }[]>;
20
20
  declare function getModuleStatus(moduleId: string): Promise<{
21
- enabled: boolean;
22
- installed: boolean;
23
- lastStep: string | null;
21
+ enabled: any;
22
+ installed: any;
23
+ lastStep: any;
24
24
  } | {
25
25
  enabled: boolean;
26
26
  installed: boolean;
@@ -3,9 +3,9 @@ import { IModule } from "../types.mjs";
3
3
  //#region src/server/manage.d.ts
4
4
  declare function registerModules(modules: IModule[]): Promise<void>;
5
5
  declare function getModules(): Promise<{
6
- enabled: boolean;
7
- installed: boolean;
8
- lastStep: string | null | undefined;
6
+ enabled: any;
7
+ installed: any;
8
+ lastStep: any;
9
9
  hasDocs: boolean;
10
10
  id: string;
11
11
  name: string;
@@ -18,9 +18,9 @@ declare function getModules(): Promise<{
18
18
  npmDevDependencies?: string[] | undefined;
19
19
  }[]>;
20
20
  declare function getModuleStatus(moduleId: string): Promise<{
21
- enabled: boolean;
22
- installed: boolean;
23
- lastStep: string | null;
21
+ enabled: any;
22
+ installed: any;
23
+ lastStep: any;
24
24
  } | {
25
25
  enabled: boolean;
26
26
  installed: boolean;
@@ -1,8 +1,8 @@
1
1
  "use server";
2
2
 
3
3
  import { ModuleManifestSchema } from "../types.mjs";
4
- import { db, getModulesDir } from "@kryo/core/server";
5
- import { systemModulesTable } from "@kryo/core";
4
+ import { db, getModulesDir } from "@arch-cadre/core/server";
5
+ import { systemModulesTable } from "@arch-cadre/core";
6
6
  import { eq } from "drizzle-orm";
7
7
 
8
8
  //#region src/server/manage.ts
@@ -1 +1 @@
1
- {"version":3,"file":"manage.mjs","names":[],"sources":["../../src/server/manage.ts"],"sourcesContent":["\"use server\";\n\nimport { systemModulesTable } from \"@kryo/core\";\nimport { db, getModulesDir } from \"@kryo/core/server\";\nimport { eq } from \"drizzle-orm\";\nimport { type IModule, ModuleManifestSchema } from \"../types\";\n\nconst globalForModules = globalThis as any;\n\nif (!globalForModules.__KRYO_REGISTERED_MODULES__) {\n globalForModules.__KRYO_REGISTERED_MODULES__ = new Map<string, IModule>();\n}\n\nexport async function registerModules(modules: IModule[]) {\n const store = globalForModules.__KRYO_REGISTERED_MODULES__;\n for (const mod of modules) {\n if (mod.manifest?.id) {\n store.set(mod.manifest.id, mod);\n }\n }\n}\n\nexport async function getModules() {\n try {\n const fs = await import(\"node:fs/promises\");\n const path = await import(\"node:path\");\n const modulesDir = await getModulesDir();\n const manifests = [];\n const entries = await fs.readdir(modulesDir).catch(() => []);\n\n for (const dir of entries) {\n if (dir.startsWith(\".\")) continue;\n try {\n const content = await fs.readFile(\n path.join(modulesDir, dir, \"manifest.json\"),\n \"utf-8\",\n );\n const manifest = ModuleManifestSchema.parse(JSON.parse(content));\n manifests.push({ ...manifest, hasDocs: false });\n } catch {}\n }\n const store = globalForModules.__KRYO_REGISTERED_MODULES__ as Map<\n string,\n IModule\n >;\n for (const mod of store.values()) {\n if (!manifests.some((m) => m.id === mod.manifest.id)) {\n manifests.push({ ...mod.manifest, hasDocs: false });\n }\n }\n const dbModules = await db\n .select()\n .from(systemModulesTable)\n .catch(() => []);\n const dbMap = new Map(dbModules.map((m) => [m.id, m]));\n return manifests.map((mod) => {\n const dbEntry = dbMap.get(mod.id);\n return {\n ...mod,\n enabled: mod.system ? true : (dbEntry?.enabled ?? false),\n installed: mod.system ? true : (dbEntry?.installed ?? false),\n lastStep: dbEntry?.lastStep,\n hasDocs: mod.hasDocs,\n };\n });\n } catch {\n return [];\n }\n}\n\nexport async function getModuleStatus(moduleId: string) {\n try {\n const [mod] = await db\n .select()\n .from(systemModulesTable)\n .where(eq(systemModulesTable.id, moduleId));\n return {\n enabled: mod?.enabled,\n installed: mod?.installed,\n lastStep: mod?.lastStep,\n };\n } catch {\n return { enabled: false, installed: false };\n }\n}\n\nexport async function isModuleEnabled(moduleId: string): Promise<boolean> {\n try {\n const [mod] = await db\n .select()\n .from(systemModulesTable)\n .where(eq(systemModulesTable.id, moduleId));\n return !!mod?.enabled || !!mod?.system;\n } catch {\n return false;\n }\n}\n\n// export async function getModuleUrl(\n// moduleId: string,\n// path: string,\n// type: \"public\" | \"admin\" = \"public\",\n// ) {\n// const cleanPath = path === \"index\" || path === \"\" ? \"\" : `/${path}`;\n// return type === \"public\"\n// ? `/m/${moduleId}${cleanPath}`\n// : `/module/${moduleId}${cleanPath}`;\n// }\n\nexport async function getModuleInstance(\n moduleId: string,\n): Promise<IModule | null> {\n try {\n const store = globalForModules.__KRYO_REGISTERED_MODULES__ as Map<\n string,\n IModule\n >;\n\n // 1. Check if module is already registered in the global store\n if (store.has(moduleId)) {\n console.log(`[Kernel:Manage] Module \"${moduleId}\" found in registry.`);\n return store.get(moduleId) || null;\n }\n\n console.log(\n `[Kernel:Manage] Module \"${moduleId}\" not in registry. Registry size: ${store.size}. Keys: ${Array.from(store.keys()).join(\", \")}`,\n );\n\n // 2. Try to load as an NPM package (for modules installed via npm/pnpm)\n // We only try this if it doesn't look like a local module path\n if (!moduleId.startsWith(\".\") && !moduleId.startsWith(\"/\")) {\n try {\n const mod = await import(moduleId);\n console.log(\n `[Kernel:Manage] Module \"${moduleId}\" loaded via import().`,\n );\n return mod.default || mod || null;\n } catch (e: any) {\n console.warn(\n `[Kernel:Manage] Failed to import module \"${moduleId}\": ${e.message}`,\n );\n }\n }\n\n return null;\n } catch (error: any) {\n console.error(\n `[Kernel:Manage] Error in getModuleInstance for \"${moduleId}\":`,\n error,\n );\n return null;\n }\n}\n\nexport async function getModuleConfig<T>(moduleId: string): Promise<T | null> {\n try {\n const [mod] = await db\n .select({ config: systemModulesTable.config })\n .from(systemModulesTable)\n .where(eq(systemModulesTable.id, moduleId));\n if (!mod?.config) return null;\n return JSON.parse(mod.config) as T;\n } catch {\n return null;\n }\n}\n\nexport async function updateModuleConfig(moduleId: string, config: any) {\n try {\n await db\n .update(systemModulesTable)\n .set({ config: JSON.stringify(config) })\n .where(eq(systemModulesTable.id, moduleId));\n } catch (e) {\n console.warn(`[Kernel:Manage] Failed to update config for ${moduleId}:`, e);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"manage.mjs","names":[],"sources":["../../src/server/manage.ts"],"sourcesContent":["\"use server\";\n\nimport { systemModulesTable } from \"@arch-cadre/core\";\nimport { db, getModulesDir } from \"@arch-cadre/core/server\";\nimport { eq } from \"drizzle-orm\";\nimport { type IModule, ModuleManifestSchema } from \"../types\";\n\nconst globalForModules = globalThis as any;\n\nif (!globalForModules.__KRYO_REGISTERED_MODULES__) {\n globalForModules.__KRYO_REGISTERED_MODULES__ = new Map<string, IModule>();\n}\n\nexport async function registerModules(modules: IModule[]) {\n const store = globalForModules.__KRYO_REGISTERED_MODULES__;\n for (const mod of modules) {\n if (mod.manifest?.id) {\n store.set(mod.manifest.id, mod);\n }\n }\n}\n\nexport async function getModules() {\n try {\n const fs = await import(\"node:fs/promises\");\n const path = await import(\"node:path\");\n const modulesDir = await getModulesDir();\n const manifests = [];\n const entries = await fs.readdir(modulesDir).catch(() => []);\n\n for (const dir of entries) {\n if (dir.startsWith(\".\")) continue;\n try {\n const content = await fs.readFile(\n path.join(modulesDir, dir, \"manifest.json\"),\n \"utf-8\",\n );\n const manifest = ModuleManifestSchema.parse(JSON.parse(content));\n manifests.push({ ...manifest, hasDocs: false });\n } catch {}\n }\n const store = globalForModules.__KRYO_REGISTERED_MODULES__ as Map<\n string,\n IModule\n >;\n for (const mod of store.values()) {\n if (!manifests.some((m) => m.id === mod.manifest.id)) {\n manifests.push({ ...mod.manifest, hasDocs: false });\n }\n }\n const dbModules = await db\n .select()\n .from(systemModulesTable)\n .catch(() => []);\n const dbMap = new Map(dbModules.map((m) => [m.id, m]));\n return manifests.map((mod) => {\n const dbEntry = dbMap.get(mod.id);\n return {\n ...mod,\n enabled: mod.system ? true : (dbEntry?.enabled ?? false),\n installed: mod.system ? true : (dbEntry?.installed ?? false),\n lastStep: dbEntry?.lastStep,\n hasDocs: mod.hasDocs,\n };\n });\n } catch {\n return [];\n }\n}\n\nexport async function getModuleStatus(moduleId: string) {\n try {\n const [mod] = await db\n .select()\n .from(systemModulesTable)\n .where(eq(systemModulesTable.id, moduleId));\n return {\n enabled: mod?.enabled,\n installed: mod?.installed,\n lastStep: mod?.lastStep,\n };\n } catch {\n return { enabled: false, installed: false };\n }\n}\n\nexport async function isModuleEnabled(moduleId: string): Promise<boolean> {\n try {\n const [mod] = await db\n .select()\n .from(systemModulesTable)\n .where(eq(systemModulesTable.id, moduleId));\n return !!mod?.enabled || !!mod?.system;\n } catch {\n return false;\n }\n}\n\n// export async function getModuleUrl(\n// moduleId: string,\n// path: string,\n// type: \"public\" | \"admin\" = \"public\",\n// ) {\n// const cleanPath = path === \"index\" || path === \"\" ? \"\" : `/${path}`;\n// return type === \"public\"\n// ? `/m/${moduleId}${cleanPath}`\n// : `/module/${moduleId}${cleanPath}`;\n// }\n\nexport async function getModuleInstance(\n moduleId: string,\n): Promise<IModule | null> {\n try {\n const store = globalForModules.__KRYO_REGISTERED_MODULES__ as Map<\n string,\n IModule\n >;\n\n // 1. Check if module is already registered in the global store\n if (store.has(moduleId)) {\n console.log(`[Kernel:Manage] Module \"${moduleId}\" found in registry.`);\n return store.get(moduleId) || null;\n }\n\n console.log(\n `[Kernel:Manage] Module \"${moduleId}\" not in registry. Registry size: ${store.size}. Keys: ${Array.from(store.keys()).join(\", \")}`,\n );\n\n // 2. Try to load as an NPM package (for modules installed via npm/pnpm)\n // We only try this if it doesn't look like a local module path\n if (!moduleId.startsWith(\".\") && !moduleId.startsWith(\"/\")) {\n try {\n const mod = await import(moduleId);\n console.log(\n `[Kernel:Manage] Module \"${moduleId}\" loaded via import().`,\n );\n return mod.default || mod || null;\n } catch (e: any) {\n console.warn(\n `[Kernel:Manage] Failed to import module \"${moduleId}\": ${e.message}`,\n );\n }\n }\n\n return null;\n } catch (error: any) {\n console.error(\n `[Kernel:Manage] Error in getModuleInstance for \"${moduleId}\":`,\n error,\n );\n return null;\n }\n}\n\nexport async function getModuleConfig<T>(moduleId: string): Promise<T | null> {\n try {\n const [mod] = await db\n .select({ config: systemModulesTable.config })\n .from(systemModulesTable)\n .where(eq(systemModulesTable.id, moduleId));\n if (!mod?.config) return null;\n return JSON.parse(mod.config) as T;\n } catch {\n return null;\n }\n}\n\nexport async function updateModuleConfig(moduleId: string, config: any) {\n try {\n await db\n .update(systemModulesTable)\n .set({ config: JSON.stringify(config) })\n .where(eq(systemModulesTable.id, moduleId));\n } catch (e) {\n console.warn(`[Kernel:Manage] Failed to update config for ${moduleId}:`, e);\n }\n}\n"],"mappings":"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"}
@@ -2,8 +2,8 @@
2
2
 
3
3
  const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
4
4
  const require_manage = require('./manage.cjs');
5
- let _kryo_core_server = require("@kryo/core/server");
6
- let _kryo_core = require("@kryo/core");
5
+ let _arch_cadre_core_server = require("@arch-cadre/core/server");
6
+ let _arch_cadre_core = require("@arch-cadre/core");
7
7
  let drizzle_orm = require("drizzle-orm");
8
8
 
9
9
  //#region src/server/registry.ts
@@ -12,11 +12,11 @@ async function initModules(force = false) {
12
12
  if (globalForRegistry.__WINKLY_MODULES_INITIALIZED__ && !force) return;
13
13
  if (force) {
14
14
  console.log("[Kernel:Registry] Forcing re-initialization...");
15
- _kryo_core.eventBus.clearAll();
15
+ _arch_cadre_core.eventBus.clearAll();
16
16
  }
17
17
  console.log("[Kernel:Registry] Synchronizing module listeners...");
18
18
  globalForRegistry.__WINKLY_MODULES_INITIALIZED__ = true;
19
- await _kryo_core.eventBus.publish("system:modules:init:start", { timestamp: Date.now() });
19
+ await _arch_cadre_core.eventBus.publish("system:modules:init:start", { timestamp: Date.now() });
20
20
  const processedModuleIds = /* @__PURE__ */ new Set();
21
21
  let hasNewModules = true;
22
22
  let iterations = 0;
@@ -27,7 +27,7 @@ async function initModules(force = false) {
27
27
  const pendingModules = (await require_manage.getModules()).filter((mod) => !processedModuleIds.has(mod.id));
28
28
  if (pendingModules.length === 0) break;
29
29
  for (const mod of pendingModules) try {
30
- await _kryo_core_server.db.insert(_kryo_core.systemModulesTable).values({
30
+ await _arch_cadre_core_server.db.insert(_arch_cadre_core.systemModulesTable).values({
31
31
  id: mod.id,
32
32
  enabled: mod.system ?? false,
33
33
  installed: mod.system ?? false,
@@ -48,7 +48,7 @@ async function initModules(force = false) {
48
48
  }
49
49
  let dbMod = null;
50
50
  try {
51
- [dbMod] = await _kryo_core_server.db.select().from(_kryo_core.systemModulesTable).where((0, drizzle_orm.eq)(_kryo_core.systemModulesTable.id, mod.id));
51
+ [dbMod] = await _arch_cadre_core_server.db.select().from(_arch_cadre_core.systemModulesTable).where((0, drizzle_orm.eq)(_arch_cadre_core.systemModulesTable.id, mod.id));
52
52
  } catch (e) {}
53
53
  if (enabled && (!dbMod || !dbMod.installed)) {
54
54
  console.log(`[Kernel:Registry] Installing module ${mod.id}...`);
@@ -59,10 +59,10 @@ async function initModules(force = false) {
59
59
  console.log(`[Kernel:Registry] Running onEnable for ${mod.id}...`);
60
60
  if (instance.onEnable) await instance.onEnable();
61
61
  try {
62
- await _kryo_core_server.db.update(_kryo_core.systemModulesTable).set({
62
+ await _arch_cadre_core_server.db.update(_arch_cadre_core.systemModulesTable).set({
63
63
  installed: true,
64
64
  lastStep: null
65
- }).where((0, drizzle_orm.eq)(_kryo_core.systemModulesTable.id, mod.id));
65
+ }).where((0, drizzle_orm.eq)(_arch_cadre_core.systemModulesTable.id, mod.id));
66
66
  } catch (e) {}
67
67
  }
68
68
  if (instance.init) {
@@ -76,7 +76,7 @@ async function initModules(force = false) {
76
76
  }
77
77
  }
78
78
  if (iterations >= MAX_ITERATIONS) console.warn("[Kernel:Registry] Max init iterations reached. Check for circular module registrations.");
79
- await _kryo_core.eventBus.publish("system:modules:init:end", {
79
+ await _arch_cadre_core.eventBus.publish("system:modules:init:end", {
80
80
  timestamp: Date.now(),
81
81
  moduleCount: processedModuleIds.size
82
82
  });
@@ -1,8 +1,8 @@
1
1
  "use server";
2
2
 
3
3
  import { getModuleInstance, getModules, isModuleEnabled } from "./manage.mjs";
4
- import { db } from "@kryo/core/server";
5
- import { eventBus, systemModulesTable } from "@kryo/core";
4
+ import { db } from "@arch-cadre/core/server";
5
+ import { eventBus, systemModulesTable } from "@arch-cadre/core";
6
6
  import { eq } from "drizzle-orm";
7
7
 
8
8
  //#region src/server/registry.ts
@@ -1 +1 @@
1
- {"version":3,"file":"registry.mjs","names":[],"sources":["../../src/server/registry.ts"],"sourcesContent":["\"use server\";\n\nimport { eventBus, systemModulesTable } from \"@kryo/core\";\nimport { db } from \"@kryo/core/server\";\nimport { eq } from \"drizzle-orm\";\nimport { getModuleInstance, getModules, isModuleEnabled } from \"./manage\";\n\nconst globalForRegistry = globalThis as unknown as {\n __WINKLY_MODULES_INITIALIZED__: boolean | undefined;\n};\n\nexport async function initModules(force = false) {\n if (globalForRegistry.__WINKLY_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.__WINKLY_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":";;;;;;;;AAOA,MAAM,oBAAoB;AAI1B,eAAsB,YAAY,QAAQ,OAAO;AAC/C,KAAI,kBAAkB,kCAAkC,CAAC,MAAO;AAEhE,KAAI,OAAO;AACT,UAAQ,IAAI,iDAAiD;AAC7D,WAAS,UAAU;;AAGrB,SAAQ,IAAI,sDAAsD;AAClE,mBAAkB,iCAAiC;AAEnD,OAAM,SAAS,QAAQ,6BAA6B,EAClD,WAAW,KAAK,KAAK,EACtB,CAAC;CAEF,MAAM,qCAAqB,IAAI,KAAa;CAC5C,IAAI,gBAAgB;CACpB,IAAI,aAAa;CACjB,MAAM,iBAAiB;AAEvB,QAAO,iBAAiB,aAAa,gBAAgB;AACnD,kBAAgB;AAChB;EAMA,MAAM,kBAHiB,MAAM,YAAY,EAGH,QACnC,QAAQ,CAAC,mBAAmB,IAAI,IAAI,GAAG,CACzC;AAED,MAAI,eAAe,WAAW,EAC5B;AAIF,OAAK,MAAM,OAAO,eAChB,KAAI;AACF,SAAM,GACH,OAAO,mBAAmB,CAC1B,OAAO;IACN,IAAI,IAAI;IACR,SAAS,IAAI,UAAU;IACvB,WAAW,IAAI,UAAU;IACzB,QAAQ,IAAI,UAAU;IACvB,CAAC,CACD,qBAAqB;WACjB,GAAG;EAMd,MAAM,gBAAgB,CAAC,GAAG,eAAe,CAAC,MAAM,GAAG,MACjD,EAAE,WAAW,EAAE,SAAS,IAAI,EAAE,SAAS,KAAK,EAC7C;AAGD,OAAK,MAAM,OAAO,eAAe;AAE/B,sBAAmB,IAAI,IAAI,GAAG;AAC9B,mBAAgB;AAEhB,OAAI;IACF,MAAM,UAAU,MAAM,gBAAgB,IAAI,GAAG;AAC7C,QAAI,CAAC,QAAS;IAEd,MAAM,WAAW,MAAM,kBAAkB,IAAI,GAAG;AAEhD,QAAI,CAAC,UAAU;AACb,aAAQ,KACN,kDAAkD,IAAI,GAAG,sCAC1D;AACD;;IAGF,IAAI,QAAa;AACjB,QAAI;AACF,MAAC,SAAS,MAAM,GACb,QAAQ,CACR,KAAK,mBAAmB,CACxB,MAAM,GAAG,mBAAmB,IAAI,IAAI,GAAG,CAAC;aACpC,GAAG;AAKZ,QAAI,YAAY,CAAC,SAAS,CAAC,MAAM,YAAY;AAC3C,aAAQ,IAAI,uCAAuC,IAAI,GAAG,KAAK;AAG/D,SAAI,SAAS,WAAW;AACtB,cAAQ,IAAI,2CAA2C,IAAI,GAAG,KAAK;AACnE,YAAM,SAAS,WAAW;;AAI5B,aAAQ,IAAI,0CAA0C,IAAI,GAAG,KAAK;AAClE,SAAI,SAAS,SAAU,OAAM,SAAS,UAAU;AAEhD,SAAI;AACF,YAAM,GACH,OAAO,mBAAmB,CAC1B,IAAI;OAAE,WAAW;OAAM,UAAU;OAAM,CAAC,CACxC,MAAM,GAAG,mBAAmB,IAAI,IAAI,GAAG,CAAC;cACpC,GAAG;;AAMd,QAAI,SAAS,MAAM;AACjB,aAAQ,IAAI,kCAAkC,IAAI,GAAG,KAAK;AAC1D,WAAM,SAAS,MAAM;AACrB,aAAQ,IAAI,4BAA4B,IAAI,GAAG,aAAa;;YAEvD,OAAO;AACd,YAAQ,MACN,0CAA0C,IAAI,GAAG,IACjD,MACD;;;;AAKP,KAAI,cAAc,eAChB,SAAQ,KACN,0FACD;AAGH,OAAM,SAAS,QAAQ,2BAA2B;EAChD,WAAW,KAAK,KAAK;EACrB,aAAa,mBAAmB;EACjC,CAAC"}
1
+ {"version":3,"file":"registry.mjs","names":[],"sources":["../../src/server/registry.ts"],"sourcesContent":["\"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 __WINKLY_MODULES_INITIALIZED__: boolean | undefined;\n};\n\nexport async function initModules(force = false) {\n if (globalForRegistry.__WINKLY_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.__WINKLY_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":";;;;;;;;AAOA,MAAM,oBAAoB;AAI1B,eAAsB,YAAY,QAAQ,OAAO;AAC/C,KAAI,kBAAkB,kCAAkC,CAAC,MAAO;AAEhE,KAAI,OAAO;AACT,UAAQ,IAAI,iDAAiD;AAC7D,WAAS,UAAU;;AAGrB,SAAQ,IAAI,sDAAsD;AAClE,mBAAkB,iCAAiC;AAEnD,OAAM,SAAS,QAAQ,6BAA6B,EAClD,WAAW,KAAK,KAAK,EACtB,CAAC;CAEF,MAAM,qCAAqB,IAAI,KAAa;CAC5C,IAAI,gBAAgB;CACpB,IAAI,aAAa;CACjB,MAAM,iBAAiB;AAEvB,QAAO,iBAAiB,aAAa,gBAAgB;AACnD,kBAAgB;AAChB;EAMA,MAAM,kBAHiB,MAAM,YAAY,EAGH,QACnC,QAAQ,CAAC,mBAAmB,IAAI,IAAI,GAAG,CACzC;AAED,MAAI,eAAe,WAAW,EAC5B;AAIF,OAAK,MAAM,OAAO,eAChB,KAAI;AACF,SAAM,GACH,OAAO,mBAAmB,CAC1B,OAAO;IACN,IAAI,IAAI;IACR,SAAS,IAAI,UAAU;IACvB,WAAW,IAAI,UAAU;IACzB,QAAQ,IAAI,UAAU;IACvB,CAAC,CACD,qBAAqB;WACjB,GAAG;EAMd,MAAM,gBAAgB,CAAC,GAAG,eAAe,CAAC,MAAM,GAAG,MACjD,EAAE,WAAW,EAAE,SAAS,IAAI,EAAE,SAAS,KAAK,EAC7C;AAGD,OAAK,MAAM,OAAO,eAAe;AAE/B,sBAAmB,IAAI,IAAI,GAAG;AAC9B,mBAAgB;AAEhB,OAAI;IACF,MAAM,UAAU,MAAM,gBAAgB,IAAI,GAAG;AAC7C,QAAI,CAAC,QAAS;IAEd,MAAM,WAAW,MAAM,kBAAkB,IAAI,GAAG;AAEhD,QAAI,CAAC,UAAU;AACb,aAAQ,KACN,kDAAkD,IAAI,GAAG,sCAC1D;AACD;;IAGF,IAAI,QAAa;AACjB,QAAI;AACF,MAAC,SAAS,MAAM,GACb,QAAQ,CACR,KAAK,mBAAmB,CACxB,MAAM,GAAG,mBAAmB,IAAI,IAAI,GAAG,CAAC;aACpC,GAAG;AAKZ,QAAI,YAAY,CAAC,SAAS,CAAC,MAAM,YAAY;AAC3C,aAAQ,IAAI,uCAAuC,IAAI,GAAG,KAAK;AAG/D,SAAI,SAAS,WAAW;AACtB,cAAQ,IAAI,2CAA2C,IAAI,GAAG,KAAK;AACnE,YAAM,SAAS,WAAW;;AAI5B,aAAQ,IAAI,0CAA0C,IAAI,GAAG,KAAK;AAClE,SAAI,SAAS,SAAU,OAAM,SAAS,UAAU;AAEhD,SAAI;AACF,YAAM,GACH,OAAO,mBAAmB,CAC1B,IAAI;OAAE,WAAW;OAAM,UAAU;OAAM,CAAC,CACxC,MAAM,GAAG,mBAAmB,IAAI,IAAI,GAAG,CAAC;cACpC,GAAG;;AAMd,QAAI,SAAS,MAAM;AACjB,aAAQ,IAAI,kCAAkC,IAAI,GAAG,KAAK;AAC1D,WAAM,SAAS,MAAM;AACrB,aAAQ,IAAI,4BAA4B,IAAI,GAAG,aAAa;;YAEvD,OAAO;AACd,YAAQ,MACN,0CAA0C,IAAI,GAAG,IACjD,MACD;;;;AAKP,KAAI,cAAc,eAChB,SAAQ,KACN,0FACD;AAGH,OAAM,SAAS,QAAQ,2BAA2B;EAChD,WAAW,KAAK,KAAK;EACrB,aAAa,mBAAmB;EACjC,CAAC"}
@@ -2,7 +2,7 @@
2
2
 
3
3
  const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
4
4
  const require_manage = require('./manage.cjs');
5
- let _kryo_core_server = require("@kryo/core/server");
5
+ let _arch_cadre_core_server = require("@arch-cadre/core/server");
6
6
 
7
7
  //#region src/server/ui.ts
8
8
  /**
@@ -26,7 +26,7 @@ function filterNavItem(item, userRoles, userPermissions) {
26
26
  return item;
27
27
  }
28
28
  async function getModuleNavigationGrouped(type) {
29
- const { user } = await (0, _kryo_core_server.getCurrentSession)();
29
+ const { user } = await (0, _arch_cadre_core_server.getCurrentSession)();
30
30
  const userRoles = user?.roles || [];
31
31
  const userPermissions = user?.permissions || [];
32
32
  const active = (await require_manage.getModules()).filter((m) => m.enabled);
@@ -47,7 +47,7 @@ async function getModuleNavigationGrouped(type) {
47
47
  }
48
48
  async function getKryoPathPrefix() {
49
49
  try {
50
- await (0, _kryo_core_server.ensureSystemInitialized)();
50
+ await (0, _arch_cadre_core_server.ensureSystemInitialized)();
51
51
  return (await require_manage.getModuleConfig("kryo-panel"))?.pathPrefix ?? "/kryo";
52
52
  } catch (e) {
53
53
  return "/kryo";
@@ -72,8 +72,8 @@ async function getKryoModuleNavigationGrouped(type) {
72
72
  return transformedGroups;
73
73
  }
74
74
  async function getModuleNavigation(type) {
75
- await (0, _kryo_core_server.ensureSystemInitialized)();
76
- const { user } = await (0, _kryo_core_server.getCurrentSession)();
75
+ await (0, _arch_cadre_core_server.ensureSystemInitialized)();
76
+ const { user } = await (0, _arch_cadre_core_server.getCurrentSession)();
77
77
  const userRoles = user?.roles || [];
78
78
  const userPermissions = user?.permissions || [];
79
79
  const active = (await require_manage.getModules()).filter((m) => m.enabled);
@@ -91,7 +91,7 @@ async function getModuleNavigation(type) {
91
91
  return all;
92
92
  }
93
93
  async function getPublicModuleRoutes() {
94
- await (0, _kryo_core_server.ensureSystemInitialized)();
94
+ await (0, _arch_cadre_core_server.ensureSystemInitialized)();
95
95
  const active = (await require_manage.getModules()).filter((m) => m.enabled);
96
96
  const allRoutes = [];
97
97
  for (const mod of active) try {
@@ -101,7 +101,7 @@ async function getPublicModuleRoutes() {
101
101
  return allRoutes;
102
102
  }
103
103
  async function getPrivateModuleRoutes() {
104
- await (0, _kryo_core_server.ensureSystemInitialized)();
104
+ await (0, _arch_cadre_core_server.ensureSystemInitialized)();
105
105
  const active = (await require_manage.getModules()).filter((m) => m.enabled);
106
106
  const allRoutes = [];
107
107
  for (const mod of active) try {
@@ -119,7 +119,7 @@ async function getKryoModuleRoutes() {
119
119
  }));
120
120
  }
121
121
  async function getApiModuleRoutes() {
122
- await (0, _kryo_core_server.ensureSystemInitialized)();
122
+ await (0, _arch_cadre_core_server.ensureSystemInitialized)();
123
123
  const active = (await require_manage.getModules()).filter((m) => m.enabled);
124
124
  const allRoutes = [];
125
125
  for (const mod of active) try {
@@ -129,7 +129,7 @@ async function getApiModuleRoutes() {
129
129
  return allRoutes;
130
130
  }
131
131
  async function getModuleWidgets(area) {
132
- await (0, _kryo_core_server.ensureSystemInitialized)();
132
+ await (0, _arch_cadre_core_server.ensureSystemInitialized)();
133
133
  const active = (await require_manage.getModules()).filter((m) => m.enabled);
134
134
  const widgets = [];
135
135
  for (const mod of active) try {
@@ -142,7 +142,7 @@ async function getModuleWidgets(area) {
142
142
  return widgets.sort((a, b) => (a.priority || 0) - (b.priority || 0));
143
143
  }
144
144
  async function getExtensions(targetModule, point) {
145
- await (0, _kryo_core_server.ensureSystemInitialized)();
145
+ await (0, _arch_cadre_core_server.ensureSystemInitialized)();
146
146
  const active = (await require_manage.getModules()).filter((m) => m.enabled);
147
147
  const extensions = [];
148
148
  for (const mod of active) try {
@@ -159,7 +159,7 @@ async function getExtensions(targetModule, point) {
159
159
  return extensions.sort((a, b) => (a.priority || 0) - (b.priority || 0));
160
160
  }
161
161
  async function hasExtension(targetModule, point) {
162
- await (0, _kryo_core_server.ensureSystemInitialized)();
162
+ await (0, _arch_cadre_core_server.ensureSystemInitialized)();
163
163
  const active = (await require_manage.getModules()).filter((m) => m.enabled);
164
164
  for (const mod of active) try {
165
165
  const instance = await require_manage.getModuleInstance(mod.id);
@@ -1,7 +1,7 @@
1
1
  "use server";
2
2
 
3
3
  import { getModuleConfig, getModuleInstance, getModules } from "./manage.mjs";
4
- import { ensureSystemInitialized, getCurrentSession } from "@kryo/core/server";
4
+ import { ensureSystemInitialized, getCurrentSession } from "@arch-cadre/core/server";
5
5
 
6
6
  //#region src/server/ui.ts
7
7
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ui.mjs","names":[],"sources":["../../src/server/ui.ts"],"sourcesContent":["\"use server\";\n\nimport { ensureSystemInitialized, getCurrentSession } from \"@kryo/core/server\";\nimport type {\n ApiRouteDefinition,\n ModuleExtension,\n ModuleNavElement,\n ModuleNavigationGroupMap,\n ModuleWidget,\n PrivateRouteDefinition,\n PublicRouteDefinition,\n} from \"../types\";\nimport { getModuleConfig, getModuleInstance, getModules } from \"./manage\";\n\n/**\n * Helper to check and filter a navigation item based on roles and permissions.\n * Returns the item (potentially with filtered sub-items) or null if access is denied.\n */\nfunction filterNavItem(\n item: ModuleNavElement,\n userRoles: string[],\n userPermissions: string[],\n): ModuleNavElement | null {\n // 1. Check access for the item itself\n if (item.roles && item.roles.length > 0) {\n if (!item.roles.some((role) => userRoles.includes(role))) {\n return null;\n }\n }\n\n if (item.permissions && item.permissions.length > 0) {\n if (!item.permissions.every((perm) => userPermissions.includes(perm))) {\n return null;\n }\n }\n\n // 2. Recursively filter sub-items if they exist\n if (item.items && item.items.length > 0) {\n const filteredSubItems = item.items\n .map((subItem) =>\n filterNavItem(subItem as any, userRoles, userPermissions),\n )\n .filter((subItem): subItem is ModuleNavElement => subItem !== null);\n\n return {\n ...item,\n items: filteredSubItems as any,\n };\n }\n\n return item;\n}\n\nexport async function getModuleNavigationGrouped(type: \"admin\" | \"settings\") {\n // await ensureSystemInitialized();\n // const { getCurrentSession } = await import(\"../auth/session\");\n // const { getModules, getModuleInstance } = await import(\"./manage\");\n\n const { user } = await getCurrentSession();\n const userRoles = user?.roles || [];\n const userPermissions = user?.permissions || [];\n\n const modules = await getModules();\n const active = modules.filter((m) => m.enabled);\n const groups: Record<string, ModuleNavElement[]> = {};\n\n for (const mod of active) {\n try {\n const instance = await getModuleInstance(mod.id);\n\n // 1. From instance\n const instanceNav = instance?.navigation?.[type];\n if (instanceNav) {\n for (const [groupName, items] of Object.entries(\n instanceNav as ModuleNavigationGroupMap,\n )) {\n if (!groups[groupName]) groups[groupName] = [];\n for (const rawItem of items) {\n const item = filterNavItem(rawItem, userRoles, userPermissions);\n if (\n item &&\n !groups[groupName].some((existing) => existing.url === item.url)\n ) {\n groups[groupName].push(item);\n }\n }\n }\n }\n } catch (_e) {\n console.warn(\n `[Kernel:UI] Failed to load navigation for module ${mod.id}:`,\n _e,\n );\n }\n }\n return groups;\n}\n\nexport async function getKryoPathPrefix(): Promise<string> {\n try {\n await ensureSystemInitialized();\n const config = await getModuleConfig<{ pathPrefix: string }>(\"kryo-panel\");\n return config?.pathPrefix ?? \"/kryo\";\n } catch (e) {\n return \"/kryo\";\n }\n}\n\nexport async function getKryoModuleNavigationGrouped(\n type: \"admin\" | \"settings\",\n) {\n const groups = await getModuleNavigationGrouped(type);\n const prefix = await getKryoPathPrefix();\n\n const prefixUrl = (url: string) => {\n if (url.startsWith(prefix)) return url;\n return url === \"/\" ? prefix : `${prefix}${url}`;\n };\n\n const processItems = (items: ModuleNavElement[]): ModuleNavElement[] => {\n return items.map((item) => ({\n ...item,\n url: prefixUrl(item.url),\n items: item.items\n ? processItems(item.items as ModuleNavElement[])\n : undefined,\n })) as ModuleNavElement[];\n };\n\n const transformedGroups: Record<string, ModuleNavElement[]> = {};\n for (const [group, items] of Object.entries(groups)) {\n transformedGroups[group] = processItems(items);\n }\n\n return transformedGroups;\n}\n\nexport async function getModuleNavigation(\n type: \"public\",\n): Promise<ModuleNavElement[]> {\n await ensureSystemInitialized();\n // const { getCurrentSession } = await import(\"../auth/session\");\n // const { getModules, getModuleInstance } = await import(\"./manage\");\n\n const { user } = await getCurrentSession();\n const userRoles = user?.roles || [];\n const userPermissions = user?.permissions || [];\n\n const modules = await getModules();\n const active = modules.filter((m) => m.enabled);\n const all: ModuleNavElement[] = [];\n\n for (const mod of active) {\n try {\n const instance = await getModuleInstance(mod.id);\n if (instance?.navigation?.[type]) {\n const items = instance.navigation[type] as ModuleNavElement[];\n for (const rawItem of items) {\n const item = filterNavItem(rawItem, userRoles, userPermissions);\n if (item) all.push(item);\n }\n }\n\n // if (!instance?.navigation?.[type]) {\n // const navModule = await import(`@/modules/${mod.id}/navigation`).catch(\n // () => null,\n // );\n // if (navModule?.navigation?.[type]) {\n // const items = navModule.navigation[type] as ModuleNavElement[];\n // for (const rawItem of items) {\n // const item = filterNavItem(rawItem, userRoles, userPermissions);\n // if (item) {\n // all.push(item);\n // }\n // }\n // }\n // }\n } catch {}\n }\n return all;\n}\n\nexport async function getPublicModuleRoutes(): Promise<\n PublicRouteDefinition[]\n> {\n await ensureSystemInitialized();\n // const { getModules, getModuleInstance } = await import(\"./manage\");\n const modules = await getModules();\n const active = modules.filter((m) => m.enabled);\n const allRoutes: PublicRouteDefinition[] = [];\n\n for (const mod of active) {\n try {\n const instance = await getModuleInstance(mod.id);\n\n // 1. Try from instance (if pre-defined)\n if (instance?.routes?.public) {\n allRoutes.push(...instance.routes.public);\n } else {\n // 2. Try loading from a dedicated routes file (better for bundling)\n // const routesModule = await import(`@/modules/${mod.id}/routes`).catch(\n // () => null,\n // );\n // if (routesModule?.publicRoutes) {\n // allRoutes.push(...routesModule.publicRoutes);\n // }\n }\n } catch {}\n }\n return allRoutes;\n}\n\nexport async function getPrivateModuleRoutes(): Promise<\n PrivateRouteDefinition[]\n> {\n await ensureSystemInitialized();\n // const { getModules, getModuleInstance } = await import(\"./manage\");\n const modules = await getModules();\n const active = modules.filter((m) => m.enabled);\n const allRoutes: PrivateRouteDefinition[] = [];\n\n for (const mod of active) {\n try {\n const instance = await getModuleInstance(mod.id);\n\n // 1. Try from instance\n if (instance?.routes?.private) {\n allRoutes.push(...instance.routes.private);\n } else {\n // 2. Try from routes file\n // const routesModule = await import(`@/modules/${mod.id}/routes`).catch(\n // () => null,\n // );\n // if (routesModule?.privateRoutes) {\n // allRoutes.push(...routesModule.privateRoutes);\n // }\n }\n } catch {}\n }\n return allRoutes;\n}\n\nexport async function getKryoModuleRoutes(): Promise<PrivateRouteDefinition[]> {\n const routes = await getPrivateModuleRoutes();\n const prefix = await getKryoPathPrefix();\n\n return routes.map((route) => ({\n ...route,\n path: route.path === \"/\" ? prefix : `${prefix}${route.path}`,\n }));\n}\n\nexport async function getApiModuleRoutes(): Promise<ApiRouteDefinition[]> {\n await ensureSystemInitialized();\n // const { getModules, getModuleInstance } = await import(\"./manage\");\n const modules = await getModules();\n const active = modules.filter((m) => m.enabled);\n const allRoutes: ApiRouteDefinition[] = [];\n\n for (const mod of active) {\n try {\n const instance = await getModuleInstance(mod.id);\n if (instance?.routes?.api) {\n allRoutes.push(...instance.routes.api);\n }\n } catch {}\n }\n return allRoutes;\n}\n\nexport async function getModuleWidgets(area: string) {\n await ensureSystemInitialized();\n // const { getModules, getModuleInstance } = await import(\"./manage\");\n const modules = await getModules();\n const active = modules.filter((m) => m.enabled);\n const widgets: ModuleWidget[] = [];\n\n for (const mod of active) {\n try {\n const instance = await getModuleInstance(mod.id);\n\n if (instance?.widgets) {\n const matching = instance.widgets.filter(\n (w: ModuleWidget) => w.area === area,\n );\n widgets.push(...matching);\n }\n } catch (_e) {}\n }\n\n return widgets.sort((a, b) => (a.priority || 0) - (b.priority || 0));\n}\n\nexport async function getExtensions(targetModule: string, point?: string) {\n await ensureSystemInitialized();\n // const { getModules, getModuleInstance } = await import(\"./manage\");\n const modules = await getModules();\n const active = modules.filter((m) => m.enabled);\n const extensions: ModuleExtension[] = [];\n\n for (const mod of active) {\n try {\n const instance = await getModuleInstance(mod.id);\n\n if (instance?.extensions) {\n const matching = instance.extensions.filter((ext: ModuleExtension) => {\n const isTarget = ext.targetModule === targetModule;\n const isPoint = point ? ext.point === point : true;\n return isTarget && isPoint;\n });\n extensions.push(...matching);\n }\n } catch (_e) {}\n }\n\n return extensions.sort((a, b) => (a.priority || 0) - (b.priority || 0));\n}\n\nexport async function hasExtension(targetModule: string, point?: string) {\n await ensureSystemInitialized();\n // const { getModules, getModuleInstance } = await import(\"./manage\");\n const modules = await getModules();\n const active = modules.filter((m) => m.enabled);\n\n for (const mod of active) {\n try {\n const instance = await getModuleInstance(mod.id);\n\n if (instance?.extensions) {\n const matching = instance.extensions.filter((ext: ModuleExtension) => {\n const isTarget = ext.targetModule === targetModule;\n const isPoint = point ? ext.point === point : true;\n return isTarget && isPoint;\n });\n if (matching.length > 0) return true;\n }\n } catch (_e) {}\n }\n\n return false;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ui.mjs","names":[],"sources":["../../src/server/ui.ts"],"sourcesContent":["\"use server\";\n\nimport { ensureSystemInitialized, getCurrentSession } from \"@arch-cadre/core/server\";\nimport type {\n ApiRouteDefinition,\n ModuleExtension,\n ModuleNavElement,\n ModuleNavigationGroupMap,\n ModuleWidget,\n PrivateRouteDefinition,\n PublicRouteDefinition,\n} from \"../types\";\nimport { getModuleConfig, getModuleInstance, getModules } from \"./manage\";\n\n/**\n * Helper to check and filter a navigation item based on roles and permissions.\n * Returns the item (potentially with filtered sub-items) or null if access is denied.\n */\nfunction filterNavItem(\n item: ModuleNavElement,\n userRoles: string[],\n userPermissions: string[],\n): ModuleNavElement | null {\n // 1. Check access for the item itself\n if (item.roles && item.roles.length > 0) {\n if (!item.roles.some((role) => userRoles.includes(role))) {\n return null;\n }\n }\n\n if (item.permissions && item.permissions.length > 0) {\n if (!item.permissions.every((perm) => userPermissions.includes(perm))) {\n return null;\n }\n }\n\n // 2. Recursively filter sub-items if they exist\n if (item.items && item.items.length > 0) {\n const filteredSubItems = item.items\n .map((subItem) =>\n filterNavItem(subItem as any, userRoles, userPermissions),\n )\n .filter((subItem): subItem is ModuleNavElement => subItem !== null);\n\n return {\n ...item,\n items: filteredSubItems as any,\n };\n }\n\n return item;\n}\n\nexport async function getModuleNavigationGrouped(type: \"admin\" | \"settings\") {\n // await ensureSystemInitialized();\n // const { getCurrentSession } = await import(\"../auth/session\");\n // const { getModules, getModuleInstance } = await import(\"./manage\");\n\n const { user } = await getCurrentSession();\n const userRoles = user?.roles || [];\n const userPermissions = user?.permissions || [];\n\n const modules = await getModules();\n const active = modules.filter((m) => m.enabled);\n const groups: Record<string, ModuleNavElement[]> = {};\n\n for (const mod of active) {\n try {\n const instance = await getModuleInstance(mod.id);\n\n // 1. From instance\n const instanceNav = instance?.navigation?.[type];\n if (instanceNav) {\n for (const [groupName, items] of Object.entries(\n instanceNav as ModuleNavigationGroupMap,\n )) {\n if (!groups[groupName]) groups[groupName] = [];\n for (const rawItem of items) {\n const item = filterNavItem(rawItem, userRoles, userPermissions);\n if (\n item &&\n !groups[groupName].some((existing) => existing.url === item.url)\n ) {\n groups[groupName].push(item);\n }\n }\n }\n }\n } catch (_e) {\n console.warn(\n `[Kernel:UI] Failed to load navigation for module ${mod.id}:`,\n _e,\n );\n }\n }\n return groups;\n}\n\nexport async function getKryoPathPrefix(): Promise<string> {\n try {\n await ensureSystemInitialized();\n const config = await getModuleConfig<{ pathPrefix: string }>(\"kryo-panel\");\n return config?.pathPrefix ?? \"/kryo\";\n } catch (e) {\n return \"/kryo\";\n }\n}\n\nexport async function getKryoModuleNavigationGrouped(\n type: \"admin\" | \"settings\",\n) {\n const groups = await getModuleNavigationGrouped(type);\n const prefix = await getKryoPathPrefix();\n\n const prefixUrl = (url: string) => {\n if (url.startsWith(prefix)) return url;\n return url === \"/\" ? prefix : `${prefix}${url}`;\n };\n\n const processItems = (items: ModuleNavElement[]): ModuleNavElement[] => {\n return items.map((item) => ({\n ...item,\n url: prefixUrl(item.url),\n items: item.items\n ? processItems(item.items as ModuleNavElement[])\n : undefined,\n })) as ModuleNavElement[];\n };\n\n const transformedGroups: Record<string, ModuleNavElement[]> = {};\n for (const [group, items] of Object.entries(groups)) {\n transformedGroups[group] = processItems(items);\n }\n\n return transformedGroups;\n}\n\nexport async function getModuleNavigation(\n type: \"public\",\n): Promise<ModuleNavElement[]> {\n await ensureSystemInitialized();\n // const { getCurrentSession } = await import(\"../auth/session\");\n // const { getModules, getModuleInstance } = await import(\"./manage\");\n\n const { user } = await getCurrentSession();\n const userRoles = user?.roles || [];\n const userPermissions = user?.permissions || [];\n\n const modules = await getModules();\n const active = modules.filter((m) => m.enabled);\n const all: ModuleNavElement[] = [];\n\n for (const mod of active) {\n try {\n const instance = await getModuleInstance(mod.id);\n if (instance?.navigation?.[type]) {\n const items = instance.navigation[type] as ModuleNavElement[];\n for (const rawItem of items) {\n const item = filterNavItem(rawItem, userRoles, userPermissions);\n if (item) all.push(item);\n }\n }\n\n // if (!instance?.navigation?.[type]) {\n // const navModule = await import(`@/modules/${mod.id}/navigation`).catch(\n // () => null,\n // );\n // if (navModule?.navigation?.[type]) {\n // const items = navModule.navigation[type] as ModuleNavElement[];\n // for (const rawItem of items) {\n // const item = filterNavItem(rawItem, userRoles, userPermissions);\n // if (item) {\n // all.push(item);\n // }\n // }\n // }\n // }\n } catch {}\n }\n return all;\n}\n\nexport async function getPublicModuleRoutes(): Promise<\n PublicRouteDefinition[]\n> {\n await ensureSystemInitialized();\n // const { getModules, getModuleInstance } = await import(\"./manage\");\n const modules = await getModules();\n const active = modules.filter((m) => m.enabled);\n const allRoutes: PublicRouteDefinition[] = [];\n\n for (const mod of active) {\n try {\n const instance = await getModuleInstance(mod.id);\n\n // 1. Try from instance (if pre-defined)\n if (instance?.routes?.public) {\n allRoutes.push(...instance.routes.public);\n } else {\n // 2. Try loading from a dedicated routes file (better for bundling)\n // const routesModule = await import(`@/modules/${mod.id}/routes`).catch(\n // () => null,\n // );\n // if (routesModule?.publicRoutes) {\n // allRoutes.push(...routesModule.publicRoutes);\n // }\n }\n } catch {}\n }\n return allRoutes;\n}\n\nexport async function getPrivateModuleRoutes(): Promise<\n PrivateRouteDefinition[]\n> {\n await ensureSystemInitialized();\n // const { getModules, getModuleInstance } = await import(\"./manage\");\n const modules = await getModules();\n const active = modules.filter((m) => m.enabled);\n const allRoutes: PrivateRouteDefinition[] = [];\n\n for (const mod of active) {\n try {\n const instance = await getModuleInstance(mod.id);\n\n // 1. Try from instance\n if (instance?.routes?.private) {\n allRoutes.push(...instance.routes.private);\n } else {\n // 2. Try from routes file\n // const routesModule = await import(`@/modules/${mod.id}/routes`).catch(\n // () => null,\n // );\n // if (routesModule?.privateRoutes) {\n // allRoutes.push(...routesModule.privateRoutes);\n // }\n }\n } catch {}\n }\n return allRoutes;\n}\n\nexport async function getKryoModuleRoutes(): Promise<PrivateRouteDefinition[]> {\n const routes = await getPrivateModuleRoutes();\n const prefix = await getKryoPathPrefix();\n\n return routes.map((route) => ({\n ...route,\n path: route.path === \"/\" ? prefix : `${prefix}${route.path}`,\n }));\n}\n\nexport async function getApiModuleRoutes(): Promise<ApiRouteDefinition[]> {\n await ensureSystemInitialized();\n // const { getModules, getModuleInstance } = await import(\"./manage\");\n const modules = await getModules();\n const active = modules.filter((m) => m.enabled);\n const allRoutes: ApiRouteDefinition[] = [];\n\n for (const mod of active) {\n try {\n const instance = await getModuleInstance(mod.id);\n if (instance?.routes?.api) {\n allRoutes.push(...instance.routes.api);\n }\n } catch {}\n }\n return allRoutes;\n}\n\nexport async function getModuleWidgets(area: string) {\n await ensureSystemInitialized();\n // const { getModules, getModuleInstance } = await import(\"./manage\");\n const modules = await getModules();\n const active = modules.filter((m) => m.enabled);\n const widgets: ModuleWidget[] = [];\n\n for (const mod of active) {\n try {\n const instance = await getModuleInstance(mod.id);\n\n if (instance?.widgets) {\n const matching = instance.widgets.filter(\n (w: ModuleWidget) => w.area === area,\n );\n widgets.push(...matching);\n }\n } catch (_e) {}\n }\n\n return widgets.sort((a, b) => (a.priority || 0) - (b.priority || 0));\n}\n\nexport async function getExtensions(targetModule: string, point?: string) {\n await ensureSystemInitialized();\n // const { getModules, getModuleInstance } = await import(\"./manage\");\n const modules = await getModules();\n const active = modules.filter((m) => m.enabled);\n const extensions: ModuleExtension[] = [];\n\n for (const mod of active) {\n try {\n const instance = await getModuleInstance(mod.id);\n\n if (instance?.extensions) {\n const matching = instance.extensions.filter((ext: ModuleExtension) => {\n const isTarget = ext.targetModule === targetModule;\n const isPoint = point ? ext.point === point : true;\n return isTarget && isPoint;\n });\n extensions.push(...matching);\n }\n } catch (_e) {}\n }\n\n return extensions.sort((a, b) => (a.priority || 0) - (b.priority || 0));\n}\n\nexport async function hasExtension(targetModule: string, point?: string) {\n await ensureSystemInitialized();\n // const { getModules, getModuleInstance } = await import(\"./manage\");\n const modules = await getModules();\n const active = modules.filter((m) => m.enabled);\n\n for (const mod of active) {\n try {\n const instance = await getModuleInstance(mod.id);\n\n if (instance?.extensions) {\n const matching = instance.extensions.filter((ext: ModuleExtension) => {\n const isTarget = ext.targetModule === targetModule;\n const isPoint = point ? ext.point === point : true;\n return isTarget && isPoint;\n });\n if (matching.length > 0) return true;\n }\n } catch (_e) {}\n }\n\n return false;\n}\n"],"mappings":"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"}
package/dist/types.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { SystemEvent, UserPermission, UserRole } from "@kryo/core";
1
+ import { SystemEvent, UserPermission, UserRole } from "@arch-cadre/core";
2
2
  import { Metadata } from "next";
3
3
  import { z } from "zod";
4
4
 
package/dist/types.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { SystemEvent, UserPermission, UserRole } from "@kryo/core";
1
+ import { SystemEvent, UserPermission, UserRole } from "@arch-cadre/core";
2
2
  import { z } from "zod";
3
3
  import { Metadata } from "next";
4
4
 
@@ -1 +1 @@
1
- {"version":3,"file":"types.mjs","names":[],"sources":["../src/types.ts"],"sourcesContent":["import type { SystemEvent, UserPermission, UserRole } from \"@kryo/core\";\nexport type { SystemEvent };\n\nimport type { Metadata } from \"next\";\nimport { z } from \"zod\";\n// import type { SidebarMenuItemType } from \"@kryo/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"}
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.6",
3
+ "version": "0.0.8",
4
4
  "description": "Core Modules for Kryo framework",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.cts",
@@ -26,19 +26,19 @@
26
26
  "build": "tsdown"
27
27
  },
28
28
  "dependencies": {
29
- "@arch-cadre/core": "^0.0.6",
29
+ "@arch-cadre/core": "^0.0.8",
30
30
  "server-only": "^0.0.1",
31
31
  "zod": "^4.1.12"
32
32
  },
33
33
  "peerDependencies": {
34
- "@arch-cadre/core": "^0.0.6",
34
+ "@arch-cadre/core": "^0.0.8",
35
35
  "drizzle-orm": "1.0.0-beta.6-4414a19",
36
36
  "next": ">=15.0.0",
37
37
  "react": "^19.0.0",
38
38
  "react-dom": "^19.0.0"
39
39
  },
40
40
  "devDependencies": {
41
- "@arch-cadre/core": "^0.0.6",
41
+ "@arch-cadre/core": "^0.0.8",
42
42
  "@biomejs/biome": "2.3.8",
43
43
  "@types/react": "^19",
44
44
  "@types/react-dom": "^19",