@ultrst-armada/krnl 0.0.0-stage → 1.0.0

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 (236) hide show
  1. package/README.md +84 -2
  2. package/package.json +75 -4
  3. package/packages/cli/dist/K_ENT_Entity-PQ5MURQY-ZG6FZXXX.js +13 -0
  4. package/packages/cli/dist/K_LIB_Krnl_Aiko_Client-OPZAVZCW-K4CRQYA5.js +8 -0
  5. package/packages/cli/dist/K_LIB_Krnl_Ep_Tools-ROOE2TQF-LNPXZYOE.js +110 -0
  6. package/packages/cli/dist/K_LIB_Krnl_Frontend_Builder-2ZDUH6PF-3ALZPNX4.js +11 -0
  7. package/packages/cli/dist/K_LIB_Krnl_Frontend_Generator-UYNRNX2X-PJTICYSW.js +11 -0
  8. package/packages/cli/dist/K_LIB_Krnl_Registry_Client-NXV6D2QW-M5TYU55O.js +8 -0
  9. package/packages/cli/dist/K_LIB_Krnl_SubApp_Engine-7HR5HWW2-H6STOXRK.js +20 -0
  10. package/packages/cli/dist/K_LIB_Krnl_SubApp_Registry-7XYGDKJK-XPJXSF7D.js +19 -0
  11. package/packages/cli/dist/K_LIB_Krnl_SubApp_Worker_Host-CQVTGGG7-CUYGTWOW.js +7 -0
  12. package/packages/cli/dist/K_LIB_Krnl_System_App_Adapter-M6FJKLGU-VR6T4N6J.js +17 -0
  13. package/packages/cli/dist/K_LIB_Krnl_System_Base_Functionality_APIs-ZZUZ6ZG5-RLJ4QWDP.js +58 -0
  14. package/packages/cli/dist/K_LIB_Krnl_System_Magnetic_Loader-XBQO2KXF-BOQGUASC.js +22 -0
  15. package/packages/cli/dist/K_LIB_Krnl_System_Unified_Http_Adapter-RCEGP3OG-XJI7KIT5.js +8 -0
  16. package/packages/cli/dist/K_LIB_Krnl_Telemetry-77FRZ3KV-K5VCWAFW.js +9 -0
  17. package/packages/cli/dist/bin/krnl.cjs +9758 -0
  18. package/packages/cli/dist/bin/krnl.d.cts +1 -0
  19. package/packages/cli/dist/bin/krnl.d.ts +1 -0
  20. package/packages/cli/dist/bin/krnl.js +2006 -0
  21. package/packages/cli/dist/chunk-3TRM6CYL.js +152 -0
  22. package/packages/cli/dist/chunk-5JDK35TG.js +3872 -0
  23. package/packages/cli/dist/chunk-63PTK33I.js +997 -0
  24. package/packages/cli/dist/chunk-6NIKAMUZ.js +82 -0
  25. package/packages/cli/dist/chunk-BOXWWXQG.js +400 -0
  26. package/packages/cli/dist/chunk-EEKLK7QJ.js +565 -0
  27. package/packages/cli/dist/chunk-EG7T2IAD.js +107 -0
  28. package/packages/cli/dist/chunk-F5EHXE2O.js +1036 -0
  29. package/packages/cli/dist/chunk-F65ANSQG.js +269 -0
  30. package/packages/cli/dist/chunk-FDNCADFE.js +71 -0
  31. package/packages/cli/dist/chunk-GDLRMDAN.js +127 -0
  32. package/packages/cli/dist/chunk-HWMTCMOS.js +656 -0
  33. package/packages/cli/dist/chunk-I74QIQOD.js +5536 -0
  34. package/packages/cli/dist/chunk-JTLSTO25.js +71 -0
  35. package/packages/cli/dist/chunk-JULBBJ27.js +1033 -0
  36. package/packages/cli/dist/chunk-OHVMVRBP.js +117 -0
  37. package/packages/cli/dist/chunk-P2PCLEKX.js +666 -0
  38. package/packages/cli/dist/chunk-PJQIUOX2.js +7767 -0
  39. package/packages/cli/dist/chunk-PPOF3DJW.js +471 -0
  40. package/packages/cli/dist/chunk-Q45257P6.js +173 -0
  41. package/packages/cli/dist/chunk-QNROWGBI.js +1036 -0
  42. package/packages/cli/dist/chunk-RJNYUXZD.js +977 -0
  43. package/packages/cli/dist/chunk-SRTOPJ5W.js +104 -0
  44. package/packages/cli/dist/chunk-TCEX3MPS.js +702 -0
  45. package/packages/cli/dist/chunk-TNOAJO2J.js +675 -0
  46. package/packages/cli/dist/chunk-UR2SUCSF.js +701 -0
  47. package/packages/cli/dist/chunk-X5LOIFM7.js +68 -0
  48. package/packages/cli/dist/chunk-XIRFOO3H.js +589 -0
  49. package/packages/cli/dist/chunk-ZAAV3JXQ.js +809 -0
  50. package/packages/cli/dist/index.cjs +7798 -0
  51. package/packages/cli/dist/index.d.cts +7 -0
  52. package/packages/cli/dist/index.d.ts +7 -0
  53. package/packages/cli/dist/index.js +29 -0
  54. package/packages/cli/package.json +34 -0
  55. package/packages/core/dist/K_ENT_Entity-4MB7CU4A.js +12 -0
  56. package/packages/core/dist/K_ENT_Entity-DEJGIDGH.js +12 -0
  57. package/packages/core/dist/K_ENT_Entity-FXZO5UZ2.js +12 -0
  58. package/packages/core/dist/K_ENT_Entity-HDSCXC5F.js +12 -0
  59. package/packages/core/dist/K_ENT_Entity-JILABHLW.js +12 -0
  60. package/packages/core/dist/K_ENT_Entity-PQ5MURQY.js +13 -0
  61. package/packages/core/dist/K_ENT_Entity-ROAKDIHW.js +12 -0
  62. package/packages/core/dist/K_ENT_Entity-TBVFSKDV.js +12 -0
  63. package/packages/core/dist/K_ENT_Entity-ZFLKG3JO.js +12 -0
  64. package/packages/core/dist/K_LIB_Krnl_Aiko_Client-OPZAVZCW.js +8 -0
  65. package/packages/core/dist/K_LIB_Krnl_Ep_Tools-ROOE2TQF.js +110 -0
  66. package/packages/core/dist/K_LIB_Krnl_Frontend_Builder-2ZDUH6PF.js +9 -0
  67. package/packages/core/dist/K_LIB_Krnl_Frontend_Generator-UYNRNX2X.js +9 -0
  68. package/packages/core/dist/K_LIB_Krnl_Registry_Client-NXV6D2QW.js +8 -0
  69. package/packages/core/dist/K_LIB_Krnl_SubApp_Engine-7HR5HWW2.js +20 -0
  70. package/packages/core/dist/K_LIB_Krnl_SubApp_Registry-4C6GBQAG.js +18 -0
  71. package/packages/core/dist/K_LIB_Krnl_SubApp_Registry-6V23A6F6.js +18 -0
  72. package/packages/core/dist/K_LIB_Krnl_SubApp_Registry-7XYGDKJK.js +19 -0
  73. package/packages/core/dist/K_LIB_Krnl_SubApp_Registry-DYLLC5G2.js +18 -0
  74. package/packages/core/dist/K_LIB_Krnl_SubApp_Registry-F4FOFAUP.js +18 -0
  75. package/packages/core/dist/K_LIB_Krnl_SubApp_Registry-FBOXXMI3.js +18 -0
  76. package/packages/core/dist/K_LIB_Krnl_SubApp_Registry-Q73BWLNP.js +18 -0
  77. package/packages/core/dist/K_LIB_Krnl_SubApp_Registry-QM2C4MVA.js +18 -0
  78. package/packages/core/dist/K_LIB_Krnl_SubApp_Registry-QUGI6SMP.js +18 -0
  79. package/packages/core/dist/K_LIB_Krnl_SubApp_Registry-RGMTBHNP.js +18 -0
  80. package/packages/core/dist/K_LIB_Krnl_SubApp_Registry-RWR7UNDW.js +18 -0
  81. package/packages/core/dist/K_LIB_Krnl_SubApp_Worker_Host-CQVTGGG7.js +7 -0
  82. package/packages/core/dist/K_LIB_Krnl_System_App_Adapter-32MFJJ5Z.js +17 -0
  83. package/packages/core/dist/K_LIB_Krnl_System_App_Adapter-4J4CEWRY.js +17 -0
  84. package/packages/core/dist/K_LIB_Krnl_System_App_Adapter-A366YHF2.js +17 -0
  85. package/packages/core/dist/K_LIB_Krnl_System_App_Adapter-LK4LYJHI.js +17 -0
  86. package/packages/core/dist/K_LIB_Krnl_System_App_Adapter-M6FJKLGU.js +17 -0
  87. package/packages/core/dist/K_LIB_Krnl_System_App_Adapter-NW3K63II.js +17 -0
  88. package/packages/core/dist/K_LIB_Krnl_System_App_Adapter-QDHTI5ZV.js +17 -0
  89. package/packages/core/dist/K_LIB_Krnl_System_App_Adapter-VHCT6VIW.js +17 -0
  90. package/packages/core/dist/K_LIB_Krnl_System_App_Adapter-WBRKF24R.js +17 -0
  91. package/packages/core/dist/K_LIB_Krnl_System_App_Adapter-XKYQYT6Q.js +17 -0
  92. package/packages/core/dist/K_LIB_Krnl_System_App_Adapter-Z2PWZYDZ.js +17 -0
  93. package/packages/core/dist/K_LIB_Krnl_System_Base_Functionality_APIs-ZZUZ6ZG5.js +58 -0
  94. package/packages/core/dist/K_LIB_Krnl_System_Magnetic_Loader-2EZU7QF4.js +21 -0
  95. package/packages/core/dist/K_LIB_Krnl_System_Magnetic_Loader-6G3AQNAV.js +21 -0
  96. package/packages/core/dist/K_LIB_Krnl_System_Magnetic_Loader-B2NZMQUG.js +21 -0
  97. package/packages/core/dist/K_LIB_Krnl_System_Magnetic_Loader-C2RABMZP.js +21 -0
  98. package/packages/core/dist/K_LIB_Krnl_System_Magnetic_Loader-HHE3NZ4F.js +21 -0
  99. package/packages/core/dist/K_LIB_Krnl_System_Magnetic_Loader-LHFGR6WK.js +21 -0
  100. package/packages/core/dist/K_LIB_Krnl_System_Magnetic_Loader-M74BLM3N.js +21 -0
  101. package/packages/core/dist/K_LIB_Krnl_System_Magnetic_Loader-PT6ZA6EA.js +21 -0
  102. package/packages/core/dist/K_LIB_Krnl_System_Magnetic_Loader-SP52V3CX.js +21 -0
  103. package/packages/core/dist/K_LIB_Krnl_System_Magnetic_Loader-XBQO2KXF.js +22 -0
  104. package/packages/core/dist/K_LIB_Krnl_System_Magnetic_Loader-YNSEUHJJ.js +21 -0
  105. package/packages/core/dist/K_LIB_Krnl_System_Unified_Http_Adapter-M6SBHIVA.js +8 -0
  106. package/packages/core/dist/K_LIB_Krnl_System_Unified_Http_Adapter-RCEGP3OG.js +8 -0
  107. package/packages/core/dist/K_LIB_Krnl_Telemetry-77FRZ3KV.js +9 -0
  108. package/packages/core/dist/chunk-33L2J7V7.js +82 -0
  109. package/packages/core/dist/chunk-3ES4K2ZP.js +817 -0
  110. package/packages/core/dist/chunk-3SMHVVLL.js +82 -0
  111. package/packages/core/dist/chunk-3UEZ7JQA.js +4877 -0
  112. package/packages/core/dist/chunk-3XIE6KBD.js +4877 -0
  113. package/packages/core/dist/chunk-46ZLCML6.js +107 -0
  114. package/packages/core/dist/chunk-4UEL3DWJ.js +107 -0
  115. package/packages/core/dist/chunk-54GWZ5PC.js +82 -0
  116. package/packages/core/dist/chunk-6QCYRS5L.js +127 -0
  117. package/packages/core/dist/chunk-6ULMHNXR.js +104 -0
  118. package/packages/core/dist/chunk-7WUETJEV.js +117 -0
  119. package/packages/core/dist/chunk-A5KRAYDB.js +107 -0
  120. package/packages/core/dist/chunk-ANEAZ3PO.js +107 -0
  121. package/packages/core/dist/chunk-BE76RL6F.js +82 -0
  122. package/packages/core/dist/chunk-CIARVYDO.js +107 -0
  123. package/packages/core/dist/chunk-CR2ANE62.js +107 -0
  124. package/packages/core/dist/chunk-DI27MOR7.js +173 -0
  125. package/packages/core/dist/chunk-E6RLFHM5.js +596 -0
  126. package/packages/core/dist/chunk-EELAPMNV.js +4877 -0
  127. package/packages/core/dist/chunk-ENZ2RQVJ.js +107 -0
  128. package/packages/core/dist/chunk-F2U6CX4F.js +4877 -0
  129. package/packages/core/dist/chunk-FKG64OHL.js +82 -0
  130. package/packages/core/dist/chunk-FYAZJYM5.js +772 -0
  131. package/packages/core/dist/chunk-G4NP4RDQ.js +82 -0
  132. package/packages/core/dist/chunk-GADIRLRS.js +473 -0
  133. package/packages/core/dist/chunk-GR6CSLQJ.js +772 -0
  134. package/packages/core/dist/chunk-HDS7AT6O.js +772 -0
  135. package/packages/core/dist/chunk-HIMEZUU2.js +71 -0
  136. package/packages/core/dist/chunk-IB4UHG5I.js +596 -0
  137. package/packages/core/dist/chunk-J7ZYNVRS.js +772 -0
  138. package/packages/core/dist/chunk-JVLZU4K7.js +604 -0
  139. package/packages/core/dist/chunk-JYXXI7Q3.js +82 -0
  140. package/packages/core/dist/chunk-K54K2KZW.js +192 -0
  141. package/packages/core/dist/chunk-K6VHLBNH.js +3316 -0
  142. package/packages/core/dist/chunk-KCBP7ZYA.js +596 -0
  143. package/packages/core/dist/chunk-KFQGP6VL.js +33 -0
  144. package/packages/core/dist/chunk-KIUEUI7K.js +82 -0
  145. package/packages/core/dist/chunk-LB67NIZP.js +949 -0
  146. package/packages/core/dist/chunk-LDTYFUNW.js +596 -0
  147. package/packages/core/dist/chunk-MLVWARD4.js +596 -0
  148. package/packages/core/dist/chunk-MPYVXHKO.js +2777 -0
  149. package/packages/core/dist/chunk-MRQ3MITU.js +772 -0
  150. package/packages/core/dist/chunk-MVUN7I7O.js +107 -0
  151. package/packages/core/dist/chunk-NDDOIRW7.js +596 -0
  152. package/packages/core/dist/chunk-O3KDB5MH.js +3330 -0
  153. package/packages/core/dist/chunk-OEINUDSE.js +400 -0
  154. package/packages/core/dist/chunk-OPDENPT4.js +4877 -0
  155. package/packages/core/dist/chunk-P6XEM2LA.js +429 -0
  156. package/packages/core/dist/chunk-QKMRSQV4.js +82 -0
  157. package/packages/core/dist/chunk-R6CCWALL.js +4877 -0
  158. package/packages/core/dist/chunk-RAMMOO73.js +774 -0
  159. package/packages/core/dist/chunk-S3FTZFG6.js +772 -0
  160. package/packages/core/dist/chunk-T2ZVN434.js +4877 -0
  161. package/packages/core/dist/chunk-TFHLDMIA.js +107 -0
  162. package/packages/core/dist/chunk-TI3QUCIJ.js +107 -0
  163. package/packages/core/dist/chunk-TR2BAIGI.js +107 -0
  164. package/packages/core/dist/chunk-UGVVJKC6.js +4877 -0
  165. package/packages/core/dist/chunk-V2DX7YIU.js +984 -0
  166. package/packages/core/dist/chunk-W4IHYUYD.js +772 -0
  167. package/packages/core/dist/chunk-W6WBG5OY.js +4877 -0
  168. package/packages/core/dist/chunk-WN3M7O7H.js +3312 -0
  169. package/packages/core/dist/chunk-WR3NCU7U.js +4877 -0
  170. package/packages/core/dist/chunk-XC6B6L27.js +82 -0
  171. package/packages/core/dist/chunk-XNSE64ZY.js +3316 -0
  172. package/packages/core/dist/chunk-XROES2WN.js +634 -0
  173. package/packages/core/dist/chunk-XSCKNRCZ.js +5020 -0
  174. package/packages/core/dist/chunk-XVABPAUZ.js +82 -0
  175. package/packages/core/dist/chunk-YOBCB5C5.js +596 -0
  176. package/packages/core/dist/chunk-YUK6Q563.js +666 -0
  177. package/packages/core/dist/chunk-YXGL3ZEU.js +1030 -0
  178. package/packages/core/dist/chunk-ZINJ5OUX.js +596 -0
  179. package/packages/core/dist/chunk-ZPFD4BIQ.js +604 -0
  180. package/packages/core/dist/chunk-ZQZBFG6F.js +4826 -0
  181. package/packages/core/dist/chunk-ZZFRJGXM.js +4877 -0
  182. package/packages/core/dist/index.cjs +757 -0
  183. package/packages/core/dist/index.d.cts +360 -0
  184. package/packages/core/dist/index.d.ts +360 -0
  185. package/packages/core/dist/index.js +704 -0
  186. package/packages/core/package.json +34 -0
  187. package/packages/create-krnl/dist/K_ENT_Entity-PQ5MURQY-R2OH4VXE.js +14 -0
  188. package/packages/create-krnl/dist/K_LIB_Krnl_Aiko_Client-OPZAVZCW-AZM5HF4M.js +9 -0
  189. package/packages/create-krnl/dist/K_LIB_Krnl_Ep_Tools-ROOE2TQF-X5N6SV2S.js +111 -0
  190. package/packages/create-krnl/dist/K_LIB_Krnl_Frontend_Builder-2ZDUH6PF-5PFHF4JU.js +12 -0
  191. package/packages/create-krnl/dist/K_LIB_Krnl_Frontend_Generator-UYNRNX2X-ED33OQPH.js +12 -0
  192. package/packages/create-krnl/dist/K_LIB_Krnl_Registry_Client-NXV6D2QW-YGQLVR4P.js +9 -0
  193. package/packages/create-krnl/dist/K_LIB_Krnl_SubApp_Engine-7HR5HWW2-VM7CTU2L.js +21 -0
  194. package/packages/create-krnl/dist/K_LIB_Krnl_SubApp_Registry-7XYGDKJK-Y2GQFJ7I.js +21 -0
  195. package/packages/create-krnl/dist/K_LIB_Krnl_SubApp_Worker_Host-CQVTGGG7-L3JQWO54.js +8 -0
  196. package/packages/create-krnl/dist/K_LIB_Krnl_System_App_Adapter-M6FJKLGU-KQARASPR.js +19 -0
  197. package/packages/create-krnl/dist/K_LIB_Krnl_System_Base_Functionality_APIs-ZZUZ6ZG5-OF3IGLVL.js +59 -0
  198. package/packages/create-krnl/dist/K_LIB_Krnl_System_Magnetic_Loader-XBQO2KXF-JOLHKOEX.js +24 -0
  199. package/packages/create-krnl/dist/K_LIB_Krnl_System_Unified_Http_Adapter-RCEGP3OG-L46LSHKQ.js +10 -0
  200. package/packages/create-krnl/dist/K_LIB_Krnl_Telemetry-77FRZ3KV-4JUPRR3X.js +10 -0
  201. package/packages/create-krnl/dist/chunk-3TRM6CYL.js +152 -0
  202. package/packages/create-krnl/dist/chunk-3URCB3QS.js +127 -0
  203. package/packages/create-krnl/dist/chunk-5JDK35TG.js +3872 -0
  204. package/packages/create-krnl/dist/chunk-A2XAXDOW.js +812 -0
  205. package/packages/create-krnl/dist/chunk-AN6TMQHG.js +1033 -0
  206. package/packages/create-krnl/dist/chunk-BOXWWXQG.js +400 -0
  207. package/packages/create-krnl/dist/chunk-BPTBREBG.js +38 -0
  208. package/packages/create-krnl/dist/chunk-FDNCADFE.js +71 -0
  209. package/packages/create-krnl/dist/chunk-JTLSTO25.js +71 -0
  210. package/packages/create-krnl/dist/chunk-M3NCUIPL.js +107 -0
  211. package/packages/create-krnl/dist/chunk-N2EONSOC.js +7769 -0
  212. package/packages/create-krnl/dist/chunk-OHVMVRBP.js +117 -0
  213. package/packages/create-krnl/dist/chunk-Q45257P6.js +173 -0
  214. package/packages/create-krnl/dist/chunk-QGM4M3NI.js +37 -0
  215. package/packages/create-krnl/dist/chunk-RJNYUXZD.js +977 -0
  216. package/packages/create-krnl/dist/chunk-SRTOPJ5W.js +104 -0
  217. package/packages/create-krnl/dist/chunk-UPBIGEC3.js +666 -0
  218. package/packages/create-krnl/dist/chunk-V2DB7UD7.js +82 -0
  219. package/packages/create-krnl/dist/chunk-WMHLIUI6.js +3644 -0
  220. package/packages/create-krnl/dist/chunk-XIRFOO3H.js +589 -0
  221. package/packages/create-krnl/dist/chunk-Y2CEEVZP.js +5536 -0
  222. package/packages/create-krnl/dist/index.cjs +395 -0
  223. package/packages/create-krnl/dist/index.js +372 -0
  224. package/packages/create-krnl/dist/main-DXUMPBND.js +2217 -0
  225. package/packages/create-krnl/dist/wrapper-SDF2VKX3.js +31 -0
  226. package/packages/create-krnl/package.json +23 -0
  227. package/packages/eslint-plugin/dist/index.cjs +439 -0
  228. package/packages/eslint-plugin/dist/index.d.cts +336 -0
  229. package/packages/eslint-plugin/dist/index.d.ts +336 -0
  230. package/packages/eslint-plugin/dist/index.js +416 -0
  231. package/packages/eslint-plugin/package.json +24 -0
  232. package/packages/validate/dist/index.cjs +499 -0
  233. package/packages/validate/dist/index.d.cts +49 -0
  234. package/packages/validate/dist/index.d.ts +49 -0
  235. package/packages/validate/dist/index.js +462 -0
  236. package/packages/validate/package.json +27 -0
@@ -0,0 +1,565 @@
1
+ // ../validate/dist/index.js
2
+ import * as fs from "fs";
3
+ import * as path from "path";
4
+ import { Project, SyntaxKind } from "ts-morph";
5
+ var KrnlValidatorEngine = class {
6
+ project;
7
+ projectRoot;
8
+ maxFileLineLimit;
9
+ maxMainLogicLimit;
10
+ maxHelperLineLimit;
11
+ constructor(options) {
12
+ this.projectRoot = path.resolve(options.projectRoot);
13
+ this.maxFileLineLimit = options.maxFileLineLimit ?? 200;
14
+ this.maxMainLogicLimit = options.maxMainLogicLimit ?? 20;
15
+ this.maxHelperLineLimit = options.maxHelperLineLimit ?? 30;
16
+ const tsConfigPath = path.join(this.projectRoot, "tsconfig.json");
17
+ if (fs.existsSync(tsConfigPath)) {
18
+ this.project = new Project({ tsConfigFilePath: tsConfigPath, skipAddingFilesFromTsConfig: true });
19
+ } else {
20
+ this.project = new Project({ compilerOptions: {
21
+ target: 99
22
+ /* ESNext */
23
+ } });
24
+ }
25
+ }
26
+ /**
27
+ * Scans and validates all source files in the project.
28
+ */
29
+ validateAll() {
30
+ const files = this.collectSourceFiles(this.projectRoot);
31
+ const errors = [];
32
+ const warnings = [];
33
+ for (const f of files) {
34
+ const sf = this.project.addSourceFileAtPath(f);
35
+ const fileReport = this.validateSourceFile(sf);
36
+ errors.push(...fileReport.errors);
37
+ warnings.push(...fileReport.warnings);
38
+ }
39
+ return {
40
+ valid: errors.length === 0,
41
+ totalFiles: files.length,
42
+ errors,
43
+ warnings
44
+ };
45
+ }
46
+ /**
47
+ * Validates a single SourceFile.
48
+ */
49
+ validateSourceFile(sf) {
50
+ const errors = [];
51
+ const warnings = [];
52
+ const filePath = sf.getFilePath();
53
+ const sourceText = sf.getText();
54
+ const baseName = path.basename(filePath);
55
+ if (baseName.includes("_pb.") || baseName.endsWith(".d.ts")) {
56
+ return { errors, warnings };
57
+ }
58
+ const lines = sourceText.split("\n");
59
+ if (lines.length > this.maxFileLineLimit) {
60
+ errors.push({
61
+ ruleId: "krnl/file-line-limit",
62
+ filePath,
63
+ message: `File exceeds maximum length of ${this.maxFileLineLimit} lines (currently ${lines.length} lines). Decompose into sub-components, custom hooks, quad-units, or concept libraries.`,
64
+ severity: "error"
65
+ });
66
+ }
67
+ for (const decl of sf.getImportDeclarations()) {
68
+ const moduleSpec = decl.getModuleSpecifierValue();
69
+ if (moduleSpec.startsWith(".") && !moduleSpec.endsWith(".js") && !moduleSpec.endsWith(".json")) {
70
+ const line = decl.getStartLineNumber();
71
+ errors.push({
72
+ ruleId: "krnl/import-suffix",
73
+ filePath,
74
+ line,
75
+ message: `Relative import '${moduleSpec}' must end with '.js' for NodeNext module resolution.`,
76
+ severity: "error"
77
+ });
78
+ }
79
+ }
80
+ const isUiTopLevel = /^(App|main|index|_app|root)\.(tsx|jsx)$/i.test(baseName);
81
+ const isBackendTopLevel = /^(server|app)\.(ts|js)$/i.test(baseName) && (!filePath.includes("/components/") && !filePath.includes("/entities/") && !filePath.includes("/libraries/"));
82
+ if (isUiTopLevel) {
83
+ const jsxElements = sf.getDescendantsOfKind(SyntaxKind.JsxOpeningElement);
84
+ const jsxSelfClosing = sf.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement);
85
+ const allJsxTags = [...jsxElements, ...jsxSelfClosing];
86
+ for (const jsx of allJsxTags) {
87
+ const tagName = jsx.getTagNameNode().getText();
88
+ if (/^[a-z]/.test(tagName)) {
89
+ errors.push({
90
+ ruleId: "krnl/top-level-purity",
91
+ filePath,
92
+ line: jsx.getStartLineNumber(),
93
+ message: `Top-level file '${baseName}' violates Top-Level Purity Law. Raw JSX/HTML element '<${tagName}>' is strictly forbidden. Top-level files must ONLY import and compose React components.`,
94
+ severity: "error"
95
+ });
96
+ }
97
+ }
98
+ const calls2 = sf.getDescendantsOfKind(SyntaxKind.CallExpression);
99
+ for (const call of calls2) {
100
+ const exprText = call.getExpression().getText();
101
+ if (["useState", "useEffect", "useRef", "useMemo", "useCallback", "useReducer", "useContext", "useLayoutEffect"].includes(exprText) || /^use[A-Z]/.test(exprText) && exprText !== "use") {
102
+ errors.push({
103
+ ruleId: "krnl/top-level-purity",
104
+ filePath,
105
+ line: call.getStartLineNumber(),
106
+ message: `Top-level file '${baseName}' violates Top-Level Purity Law. React hook '${exprText}' is forbidden in top-level files. Encapsulate state and effects inside dedicated component files.`,
107
+ severity: "error"
108
+ });
109
+ }
110
+ }
111
+ }
112
+ if (isBackendTopLevel) {
113
+ const calls2 = sf.getDescendantsOfKind(SyntaxKind.CallExpression);
114
+ for (const call of calls2) {
115
+ const exprText = call.getExpression().getText();
116
+ if (/^(app|router|server)\.(get|post|put|delete|patch|options|head)$/.test(exprText)) {
117
+ errors.push({
118
+ ruleId: "krnl/top-level-purity",
119
+ filePath,
120
+ line: call.getStartLineNumber(),
121
+ message: `Backend entry file '${baseName}' violates Entry Purity Law. Inline route definition '${exprText}' is forbidden. Delegate to dedicated route/controller modules.`,
122
+ severity: "error"
123
+ });
124
+ }
125
+ }
126
+ }
127
+ if (filePath.endsWith(".tsx") || filePath.endsWith(".jsx")) {
128
+ const componentNames = [];
129
+ for (const fn of sf.getFunctions()) {
130
+ const name = fn.getName();
131
+ if (name && /^[A-Z]/.test(name)) {
132
+ const hasJsx = fn.getDescendantsOfKind(SyntaxKind.JsxElement).length > 0 || fn.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).length > 0 || fn.getDescendantsOfKind(SyntaxKind.JsxFragment).length > 0;
133
+ if (hasJsx) {
134
+ componentNames.push(name);
135
+ }
136
+ }
137
+ }
138
+ for (const stmt of sf.getVariableStatements()) {
139
+ for (const decl of stmt.getDeclarations()) {
140
+ const name = decl.getName();
141
+ if (/^[A-Z]/.test(name)) {
142
+ const typeText = decl.getTypeNode()?.getText() || "";
143
+ const isFcType = typeText.includes("FC") || typeText.includes("FunctionComponent") || typeText.includes("ComponentType");
144
+ const init = decl.getInitializer();
145
+ if (init) {
146
+ const hasJsx = init.getDescendantsOfKind(SyntaxKind.JsxElement).length > 0 || init.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement).length > 0 || init.getDescendantsOfKind(SyntaxKind.JsxFragment).length > 0;
147
+ if (isFcType || hasJsx) {
148
+ if (!componentNames.includes(name)) {
149
+ componentNames.push(name);
150
+ }
151
+ }
152
+ }
153
+ }
154
+ }
155
+ }
156
+ for (const cls of sf.getClasses()) {
157
+ const name = cls.getName();
158
+ const ext = cls.getExtends()?.getText() || "";
159
+ if (name && (ext.includes("Component") || ext.includes("PureComponent"))) {
160
+ if (!componentNames.includes(name)) {
161
+ componentNames.push(name);
162
+ }
163
+ }
164
+ }
165
+ if (componentNames.length > 1) {
166
+ errors.push({
167
+ ruleId: "krnl/one-component-per-file",
168
+ filePath,
169
+ message: `File '${baseName}' defines multiple React components (${componentNames.join(", ")}). Krnl strictly enforces ONE component per file. Decompose into sub-component files.`,
170
+ severity: "error"
171
+ });
172
+ }
173
+ }
174
+ const isHelper = filePath.includes("helper_functions") || filePath.includes("/helpers/") || filePath.includes("\\helpers\\");
175
+ const isMainLogic = filePath.endsWith("logic.ts") || filePath.endsWith("logic.js");
176
+ const isRootConcept = filePath.includes("libraries/") || filePath.includes("Concepts.ts");
177
+ if (isHelper) {
178
+ for (const decl of sf.getImportDeclarations()) {
179
+ const spec = decl.getModuleSpecifierValue();
180
+ if (["fs", "node:fs", "http", "node:http", "ws"].includes(spec)) {
181
+ errors.push({
182
+ ruleId: "krnl/helper-purity",
183
+ filePath,
184
+ line: decl.getStartLineNumber(),
185
+ message: `Helper functions (Layer 1) cannot directly import I/O modules ('${spec}'). Delegate to Layer 0 libraries or Entity context.`,
186
+ severity: "error"
187
+ });
188
+ }
189
+ }
190
+ for (const fn of sf.getFunctions()) {
191
+ const fnLines = fn.getText().split("\n").length;
192
+ if (fnLines > this.maxHelperLineLimit && !sourceText.includes("Concepts.")) {
193
+ errors.push({
194
+ ruleId: "krnl/helper-line-limit",
195
+ filePath,
196
+ line: fn.getStartLineNumber(),
197
+ message: `Helper function '${fn.getName() || "anonymous"}' exceeds ${this.maxHelperLineLimit} lines (${fnLines} lines). Must delegate to a root libraries/{Domain}Concepts.ts library.`,
198
+ severity: "error"
199
+ });
200
+ }
201
+ }
202
+ }
203
+ if (isMainLogic) {
204
+ const substantiveLines = lines.filter((l) => {
205
+ const trimmed = l.trim();
206
+ return trimmed.length > 0 && !trimmed.startsWith("//") && !trimmed.startsWith("/*") && !trimmed.startsWith("*");
207
+ });
208
+ if (substantiveLines.length > this.maxMainLogicLimit && !sourceText.includes("helpers") && !sourceText.includes("Concepts") && !sourceText.includes("state")) {
209
+ errors.push({
210
+ ruleId: "krnl/main-delegation",
211
+ filePath,
212
+ message: `Main logic function has ${substantiveLines.length} substantive lines without delegating to Layer 1 helper functions or Layer 0 libraries.`,
213
+ severity: "error"
214
+ });
215
+ }
216
+ }
217
+ if (sourceText.includes("main = async") || sourceText.includes("export const main = async")) {
218
+ const match = sourceText.match(/main\s*=\s*async\s*\([^,]+,\s*\{([^}]*)\}\s*\)/);
219
+ if (match) {
220
+ const destructured = match[1];
221
+ if (/\bsystem\b/.test(destructured) && !/\bentity\b/.test(destructured)) {
222
+ errors.push({
223
+ ruleId: "krnl/context-destructuring",
224
+ filePath,
225
+ message: `Functionality context parameter destructures 'system'. Functionality passes { state, entity }. Always destructure 'entity'.`,
226
+ severity: "error"
227
+ });
228
+ }
229
+ }
230
+ }
231
+ const calls = sf.getDescendantsOfKind(SyntaxKind.CallExpression);
232
+ for (const call of calls) {
233
+ const exprText = call.getExpression().getText();
234
+ if (exprText === "setInterval" || exprText === "window.setInterval") {
235
+ errors.push({
236
+ ruleId: "krnl/no-polling",
237
+ filePath,
238
+ line: call.getStartLineNumber(),
239
+ message: `Prohibited use of 'setInterval'. Krnl applications must use reactive event streams (entity.emitEvent / entity.on).`,
240
+ severity: "error"
241
+ });
242
+ }
243
+ }
244
+ const isEntityClass = sf.getClasses().some((c) => {
245
+ const ext = c.getExtends();
246
+ return ext && (ext.getText().includes("Entity") || ext.getText().includes("krnlEntityBase"));
247
+ });
248
+ if (isEntityClass) {
249
+ let loadAllLine = -1;
250
+ const addLocalLines = [];
251
+ for (const call of calls) {
252
+ const txt = call.getText();
253
+ if (txt.includes("MagneticLoader.loadAll") || txt.includes("KrnlMagneticLoader.loadAll")) {
254
+ loadAllLine = call.getStartLineNumber();
255
+ } else if (txt.startsWith("this.addLocal(")) {
256
+ const hasUiSpec = txt.includes("uiSpec");
257
+ const idMatch = txt.match(/id\s*:\s*["']([^"']+)["']/);
258
+ addLocalLines.push({
259
+ line: call.getStartLineNumber(),
260
+ hasUiSpec,
261
+ id: idMatch ? idMatch[1] : "unknown"
262
+ });
263
+ }
264
+ }
265
+ if (loadAllLine !== -1) {
266
+ for (const al of addLocalLines) {
267
+ if (al.hasUiSpec && al.line > loadAllLine) {
268
+ errors.push({
269
+ ruleId: "krnl/boot-order",
270
+ filePath,
271
+ line: al.line,
272
+ message: `addLocal('${al.id}') with uiSpec at line ${al.line} appears AFTER loadAll() at line ${loadAllLine}. All addLocal() with UI must precede loadAll().`,
273
+ severity: "error"
274
+ });
275
+ }
276
+ }
277
+ }
278
+ }
279
+ return { errors, warnings };
280
+ }
281
+ collectSourceFiles(dir, collected = []) {
282
+ if (!fs.existsSync(dir)) return collected;
283
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
284
+ for (const entry of entries) {
285
+ if (entry.name === "node_modules" || entry.name === "dist" || entry.name === ".git") continue;
286
+ const full = path.join(dir, entry.name);
287
+ if (entry.isDirectory()) {
288
+ this.collectSourceFiles(full, collected);
289
+ } else if (entry.isFile() && (entry.name.endsWith(".ts") || entry.name.endsWith(".js") || entry.name.endsWith(".tsx") || entry.name.endsWith(".jsx"))) {
290
+ collected.push(full);
291
+ }
292
+ }
293
+ return collected;
294
+ }
295
+ };
296
+
297
+ // src/commands/validate.ts
298
+ async function runValidate(projectRoot = process.cwd()) {
299
+ console.log(`
300
+ \u{1F50D} [Krnl Validate] Scanning project at: ${projectRoot}
301
+ `);
302
+ const validator = new KrnlValidatorEngine({ projectRoot });
303
+ const report = validator.validateAll();
304
+ if (report.warnings.length > 0) {
305
+ console.warn(`\u26A0\uFE0F [WARNINGS] Found ${report.warnings.length} warning(s):`);
306
+ for (const w of report.warnings) {
307
+ console.warn(` - [${w.ruleId}] ${w.filePath}${w.line ? `:${w.line}` : ""}: ${w.message}`);
308
+ }
309
+ }
310
+ if (!report.valid) {
311
+ console.error(`
312
+ \u274C [VALIDATION FAILED] Found ${report.errors.length} error(s):
313
+ `);
314
+ for (const err of report.errors) {
315
+ console.error(` \u274C [${err.ruleId}] ${err.filePath}${err.line ? `:${err.line}` : ""}`);
316
+ console.error(` ${err.message}
317
+ `);
318
+ }
319
+ return false;
320
+ }
321
+ console.log(`\u2705 [VALIDATION PASSED] ${report.totalFiles} source files verified clean against Krnl paradigms.
322
+ `);
323
+ return true;
324
+ }
325
+
326
+ // src/commands/generate.ts
327
+ import * as fs2 from "fs";
328
+ import * as path2 from "path";
329
+ async function runGenerate(type, name, parentEntity, projectRoot = process.cwd()) {
330
+ if (!name) {
331
+ console.error("\u274C Error: Resource name is required. Usage: krnl generate <entity|functionality|library|subapp> <Name> [ParentEntity]");
332
+ process.exit(1);
333
+ }
334
+ switch (type.toLowerCase()) {
335
+ case "entity":
336
+ generateEntity(name, projectRoot);
337
+ break;
338
+ case "functionality":
339
+ if (!parentEntity) {
340
+ console.error("\u274C Error: Parent entity name is required for functionality. Usage: krnl generate functionality <Name> <ParentEntity>");
341
+ process.exit(1);
342
+ }
343
+ generateFunctionality(name, parentEntity, projectRoot);
344
+ break;
345
+ case "library":
346
+ generateLibrary(name, projectRoot);
347
+ break;
348
+ case "subapp":
349
+ generateSubApp(name, projectRoot);
350
+ break;
351
+ default:
352
+ console.error(`\u274C Unknown resource type '${type}'. Valid types: entity, functionality, library, subapp`);
353
+ process.exit(1);
354
+ }
355
+ }
356
+ function generateEntity(name, projectRoot) {
357
+ const entityDir = path2.join(projectRoot, "src", "entities", name);
358
+ fs2.mkdirSync(entityDir, { recursive: true });
359
+ fs2.mkdirSync(path2.join(entityDir, "functionalities"), { recursive: true });
360
+ const entityFile = path2.join(entityDir, `${name}.ts`);
361
+ const content = `import { Entity, KrnlMagneticLoader } from '@dinilmusick/krnl-core';
362
+
363
+ export class ${name} extends Entity {
364
+ constructor() {
365
+ super({
366
+ id: '${name}',
367
+ version: '1.0.0',
368
+ description: '${name} root entity'
369
+ });
370
+ }
371
+
372
+ async boot(): Promise<void> {
373
+ // 1. Local functionalities with UI must precede loadAll
374
+
375
+ // 2. Discover magnetic functionalities, child entities, and subapps
376
+ await KrnlMagneticLoader.loadAll(this, import.meta.url);
377
+ }
378
+ }
379
+
380
+ export default ${name};
381
+ `;
382
+ fs2.writeFileSync(entityFile, content);
383
+ console.log(`\u2705 Created Entity: src/entities/${name}/${name}.ts`);
384
+ }
385
+ function generateFunctionality(name, entityName, projectRoot) {
386
+ const funcDir = path2.join(projectRoot, "src", "entities", entityName, "functionalities", name);
387
+ fs2.mkdirSync(path2.join(funcDir, "main_function"), { recursive: true });
388
+ fs2.mkdirSync(path2.join(funcDir, "state_data"), { recursive: true });
389
+ fs2.mkdirSync(path2.join(funcDir, "helper_functions"), { recursive: true });
390
+ fs2.mkdirSync(path2.join(funcDir, "events"), { recursive: true });
391
+ fs2.writeFileSync(path2.join(funcDir, `${name}Atom.ts`), `export interface ${name}Input {
392
+ message?: string;
393
+ }
394
+
395
+ export interface ${name}Output {
396
+ success: boolean;
397
+ timestamp: number;
398
+ }
399
+ `);
400
+ fs2.writeFileSync(path2.join(funcDir, "main_function", "logic.ts"), `import { ${name}Input, ${name}Output } from '../${name}Atom.js';
401
+ import { formatTimestamp } from '../helper_functions/formatTimestamp.js';
402
+
403
+ export const main = async (input: ${name}Input, { state, entity }: any): Promise<${name}Output> => {
404
+ const timestamp = formatTimestamp();
405
+ return {
406
+ success: true,
407
+ timestamp
408
+ };
409
+ };
410
+ `);
411
+ fs2.writeFileSync(path2.join(funcDir, "state_data", "state.ts"), `export interface ${name}State {
412
+ executionCount: number;
413
+ }
414
+
415
+ export const initialState: ${name}State = {
416
+ executionCount: 0
417
+ };
418
+ `);
419
+ fs2.writeFileSync(path2.join(funcDir, "helper_functions", "formatTimestamp.ts"), `export function formatTimestamp(): number {
420
+ return Date.now();
421
+ }
422
+ `);
423
+ console.log(`\u2705 Created Quad-Unit Functionality: src/entities/${entityName}/functionalities/${name}/`);
424
+ }
425
+ function generateLibrary(name, projectRoot) {
426
+ const libDir = path2.join(projectRoot, "src", "libraries");
427
+ fs2.mkdirSync(libDir, { recursive: true });
428
+ const fileName = `${name}Concepts.ts`;
429
+ fs2.writeFileSync(path2.join(libDir, fileName), `/**
430
+ * @file ${fileName}
431
+ * @role component
432
+ * @description Layer 0 pure domain concept library for ${name}.
433
+ */
434
+
435
+ export class ${name}Concepts {
436
+ static pureTransform<T>(data: T): T {
437
+ return data;
438
+ }
439
+ }
440
+ `);
441
+ console.log(`\u2705 Created Domain Concept Library: src/libraries/${fileName}`);
442
+ }
443
+ function generateSubApp(name, projectRoot) {
444
+ const subappDir = path2.join(projectRoot, "src", "subapps", name);
445
+ fs2.mkdirSync(subappDir, { recursive: true });
446
+ fs2.writeFileSync(path2.join(subappDir, "subapp.json"), JSON.stringify({
447
+ name,
448
+ version: "1.0.0",
449
+ description: `${name} self-contained sub-app`,
450
+ registrationEntry: "./register.js"
451
+ }, null, 2));
452
+ fs2.writeFileSync(path2.join(subappDir, "register.ts"), `export function register(context: any) {
453
+ context.logger.log('Registering ${name} sub-app');
454
+ return {
455
+ name: '${name}',
456
+ operations: []
457
+ };
458
+ }
459
+ export default register;
460
+ `);
461
+ console.log(`\u2705 Created Sub-App: src/subapps/${name}/`);
462
+ }
463
+
464
+ // src/commands/watch.ts
465
+ import * as fs3 from "fs";
466
+ import * as path3 from "path";
467
+ function generateMagneticDeclarations(projectRoot = process.cwd()) {
468
+ const functionalities = scanDirectory(projectRoot);
469
+ let dtsContent = `// Automatically generated by Krnl Magnetic Watcher. Do not edit manually.
470
+
471
+ `;
472
+ dtsContent += `import { Entity } from '@dinilmusick/krnl-core';
473
+
474
+ `;
475
+ const globalDeclarations = [];
476
+ for (const func of functionalities) {
477
+ const helpersDir = path3.join(func.funcPath, "helper_functions");
478
+ if (fs3.existsSync(helpersDir)) {
479
+ const files = fs3.readdirSync(helpersDir);
480
+ for (const file of files) {
481
+ if (file.endsWith(".js") || file.endsWith(".ts")) {
482
+ const filePath = path3.join(helpersDir, file);
483
+ const baseName = path3.basename(file, path3.extname(file));
484
+ const importPath = `./${path3.relative(projectRoot, filePath).replace(/\\/g, "/")}`;
485
+ const { named, hasDefault } = parseExports(filePath, baseName);
486
+ if (hasDefault) {
487
+ globalDeclarations.push(` const ${baseName}: typeof import('${importPath}')['default'];`);
488
+ }
489
+ for (const name of named) {
490
+ globalDeclarations.push(` const ${name}: typeof import('${importPath}')['${name}'];`);
491
+ }
492
+ }
493
+ }
494
+ }
495
+ const eventsDir = path3.join(func.funcPath, "events");
496
+ if (fs3.existsSync(eventsDir)) {
497
+ const files = fs3.readdirSync(eventsDir);
498
+ for (const file of files) {
499
+ if (file.endsWith(".js") || file.endsWith(".ts")) {
500
+ const filePath = path3.join(eventsDir, file);
501
+ const baseName = path3.basename(file, path3.extname(file));
502
+ const importPath = `./${path3.relative(projectRoot, filePath).replace(/\\/g, "/")}`;
503
+ const { named, hasDefault } = parseExports(filePath, baseName);
504
+ if (hasDefault) {
505
+ globalDeclarations.push(` const ${baseName}: typeof import('${importPath}')['default'];`);
506
+ }
507
+ for (const name of named) {
508
+ globalDeclarations.push(` const ${name}: typeof import('${importPath}')['${name}'];`);
509
+ }
510
+ }
511
+ }
512
+ }
513
+ }
514
+ if (globalDeclarations.length > 0) {
515
+ dtsContent += `declare global {
516
+ ${Array.from(new Set(globalDeclarations)).join("\n")}
517
+ }
518
+ `;
519
+ }
520
+ const outPath = path3.join(projectRoot, "krnl-magnetic.d.ts");
521
+ fs3.writeFileSync(outPath, dtsContent);
522
+ console.log(`[Krnl Watch] Updated ambient declarations: ${outPath}`);
523
+ }
524
+ function scanDirectory(dir, results = []) {
525
+ if (!fs3.existsSync(dir)) return results;
526
+ const list = fs3.readdirSync(dir, { withFileTypes: true });
527
+ for (const entry of list) {
528
+ if (entry.isDirectory()) {
529
+ if (entry.name === "node_modules" || entry.name === "dist" || entry.name === ".git") continue;
530
+ const fullPath = path3.join(dir, entry.name);
531
+ if (entry.name === "functionalities") {
532
+ const funcs = fs3.readdirSync(fullPath, { withFileTypes: true });
533
+ for (const f of funcs) {
534
+ if (f.isDirectory()) {
535
+ results.push({ funcPath: path3.join(fullPath, f.name), funcName: f.name });
536
+ }
537
+ }
538
+ } else {
539
+ scanDirectory(fullPath, results);
540
+ }
541
+ }
542
+ }
543
+ return results;
544
+ }
545
+ function parseExports(filePath, defaultName) {
546
+ const content = fs3.readFileSync(filePath, "utf8");
547
+ const named = [];
548
+ let hasDefault = false;
549
+ const namedRegex = /export\s+(?:const|let|var|function|class|async\s+function)\s+([a-zA-Z0-9_$]+)/g;
550
+ let match;
551
+ while ((match = namedRegex.exec(content)) !== null) {
552
+ if (match[1]) named.push(match[1]);
553
+ }
554
+ if (content.includes("export default")) {
555
+ hasDefault = true;
556
+ }
557
+ return { named, hasDefault };
558
+ }
559
+
560
+ export {
561
+ KrnlValidatorEngine,
562
+ runValidate,
563
+ runGenerate,
564
+ generateMagneticDeclarations
565
+ };
@@ -0,0 +1,107 @@
1
+ import {
2
+ krnlSystemEntityBase
3
+ } from "./chunk-PJQIUOX2.js";
4
+ import {
5
+ KrnlShell
6
+ } from "./chunk-3TRM6CYL.js";
7
+
8
+ // ../core/dist/chunk-ENZ2RQVJ.js
9
+ import fs from "fs";
10
+ import path from "path";
11
+ import http from "http";
12
+ import net from "net";
13
+ var KrnlNonKrnlAppAdapter = class extends krnlSystemEntityBase {
14
+ childProcess = null;
15
+ appPort = -1;
16
+ appPath;
17
+ constructor(name, appPath) {
18
+ super(name, null, -1, "127.0.0.1", { Singleton: true, _skipMagneticLoading: true });
19
+ this.appPath = appPath;
20
+ this._isIngressNetworkMember = true;
21
+ this.unifiedHttpAdapter._handleRequest = async (req, res) => {
22
+ await this.proxyRequest(req, res, req.url || "/");
23
+ };
24
+ }
25
+ async startApp() {
26
+ this.appPort = await this._probeAvailablePort(11e3, "127.0.0.1");
27
+ let command = "node";
28
+ let args = ["."];
29
+ try {
30
+ const pkgPath = path.join(this.appPath, "package.json");
31
+ if (fs.existsSync(pkgPath)) {
32
+ const packageJson = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
33
+ if (packageJson.scripts?.start) {
34
+ command = "npm";
35
+ args = ["run", "start"];
36
+ } else if (packageJson.main) {
37
+ args = [packageJson.main];
38
+ }
39
+ }
40
+ } catch (_) {
41
+ }
42
+ const env = {
43
+ ...process.env,
44
+ PORT: this.appPort.toString()
45
+ };
46
+ console.log(`[AppAdapter] Spawning non-Krnl app '${this.entityName}' in background (Port: ${this.appPort})...`);
47
+ this.childProcess = KrnlShell.spawn(command, args, {
48
+ cwd: this.appPath,
49
+ env,
50
+ stdio: "inherit"
51
+ });
52
+ let ready = false;
53
+ const timeout = 15e3;
54
+ const start = Date.now();
55
+ while (Date.now() - start < timeout) {
56
+ ready = await new Promise((resolve) => {
57
+ const socket = net.connect(this.appPort, "127.0.0.1");
58
+ socket.on("connect", () => {
59
+ socket.destroy();
60
+ resolve(true);
61
+ });
62
+ socket.on("error", () => resolve(false));
63
+ });
64
+ if (ready) break;
65
+ await new Promise((r) => setTimeout(r, 200));
66
+ }
67
+ if (!ready) {
68
+ throw new Error(`[AppAdapter] Non-Krnl app '${this.entityName}' failed to boot on port ${this.appPort} within 15s.`);
69
+ }
70
+ console.log(`[AppAdapter] Non-Krnl app '${this.entityName}' successfully booted.`);
71
+ }
72
+ async proxyRequest(req, res, subPath) {
73
+ if (this.appPort === -1) {
74
+ res.writeHead(503, { "Content-Type": "application/json" });
75
+ res.end(JSON.stringify({ status: "error", message: "Service Temporarily Unavailable: Sub-app not running." }));
76
+ return;
77
+ }
78
+ const options = {
79
+ hostname: "127.0.0.1",
80
+ port: this.appPort,
81
+ path: subPath,
82
+ method: req.method,
83
+ headers: req.headers
84
+ };
85
+ const proxyReq = http.request(options, (proxyRes) => {
86
+ res.writeHead(proxyRes.statusCode || 500, proxyRes.headers);
87
+ proxyRes.pipe(res);
88
+ });
89
+ proxyReq.on("error", (err) => {
90
+ res.writeHead(502, { "Content-Type": "application/json" });
91
+ res.end(JSON.stringify({ status: "error", message: `Bad Gateway: ${err.message}` }));
92
+ });
93
+ req.pipe(proxyReq);
94
+ }
95
+ dispose() {
96
+ if (this.childProcess) {
97
+ console.log(`[AppAdapter] Killing child process (PID: ${this.childProcess.pid}) for '${this.entityName}'`);
98
+ this.childProcess.kill("SIGTERM");
99
+ this.childProcess = null;
100
+ }
101
+ super.dispose();
102
+ }
103
+ };
104
+
105
+ export {
106
+ KrnlNonKrnlAppAdapter
107
+ };