@zyno-io/dk-server-foundation 26.216.430

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 (663) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +458 -0
  3. package/dist/devconsole/assets/index-CKF3C3kv.css +1 -0
  4. package/dist/devconsole/assets/index-CsHdomhM.js +27 -0
  5. package/dist/devconsole/index.html +13 -0
  6. package/dist/resources/proto/generated/devconsole/devconsole.d.ts +320 -0
  7. package/dist/resources/proto/generated/devconsole/devconsole.d.ts.map +1 -0
  8. package/dist/resources/proto/generated/devconsole/devconsole.js +3751 -0
  9. package/dist/resources/proto/generated/devconsole/devconsole.js.map +1 -0
  10. package/dist/src/app/base.d.ts +36 -0
  11. package/dist/src/app/base.d.ts.map +1 -0
  12. package/dist/src/app/base.js +240 -0
  13. package/dist/src/app/base.js.map +1 -0
  14. package/dist/src/app/config.d.ts +90 -0
  15. package/dist/src/app/config.d.ts.map +1 -0
  16. package/dist/src/app/config.js +33 -0
  17. package/dist/src/app/config.js.map +1 -0
  18. package/dist/src/app/config.loader.d.ts +14 -0
  19. package/dist/src/app/config.loader.d.ts.map +1 -0
  20. package/dist/src/app/config.loader.js +67 -0
  21. package/dist/src/app/config.loader.js.map +1 -0
  22. package/dist/src/app/const.d.ts +3 -0
  23. package/dist/src/app/const.d.ts.map +1 -0
  24. package/dist/src/app/const.js +6 -0
  25. package/dist/src/app/const.js.map +1 -0
  26. package/dist/src/app/dev.d.ts +7 -0
  27. package/dist/src/app/dev.d.ts.map +1 -0
  28. package/dist/src/app/dev.js +105 -0
  29. package/dist/src/app/dev.js.map +1 -0
  30. package/dist/src/app/index.d.ts +7 -0
  31. package/dist/src/app/index.d.ts.map +1 -0
  32. package/dist/src/app/index.js +12 -0
  33. package/dist/src/app/index.js.map +1 -0
  34. package/dist/src/app/openapi.d.ts +4 -0
  35. package/dist/src/app/openapi.d.ts.map +1 -0
  36. package/dist/src/app/openapi.js +6 -0
  37. package/dist/src/app/openapi.js.map +1 -0
  38. package/dist/src/app/resolver.d.ts +11 -0
  39. package/dist/src/app/resolver.d.ts.map +1 -0
  40. package/dist/src/app/resolver.js +60 -0
  41. package/dist/src/app/resolver.js.map +1 -0
  42. package/dist/src/app/shutdown.d.ts +12 -0
  43. package/dist/src/app/shutdown.d.ts.map +1 -0
  44. package/dist/src/app/shutdown.js +63 -0
  45. package/dist/src/app/shutdown.js.map +1 -0
  46. package/dist/src/app/state.d.ts +16 -0
  47. package/dist/src/app/state.d.ts.map +1 -0
  48. package/dist/src/app/state.js +12 -0
  49. package/dist/src/app/state.js.map +1 -0
  50. package/dist/src/auth/index.d.ts +3 -0
  51. package/dist/src/auth/index.d.ts.map +1 -0
  52. package/dist/src/auth/index.js +6 -0
  53. package/dist/src/auth/index.js.map +1 -0
  54. package/dist/src/auth/jwt.d.ts +76 -0
  55. package/dist/src/auth/jwt.d.ts.map +1 -0
  56. package/dist/src/auth/jwt.js +218 -0
  57. package/dist/src/auth/jwt.js.map +1 -0
  58. package/dist/src/auth/provider.d.ts +15 -0
  59. package/dist/src/auth/provider.d.ts.map +1 -0
  60. package/dist/src/auth/provider.js +50 -0
  61. package/dist/src/auth/provider.js.map +1 -0
  62. package/dist/src/cli/dksf-dev.d.ts +3 -0
  63. package/dist/src/cli/dksf-dev.d.ts.map +1 -0
  64. package/dist/src/cli/dksf-dev.js +408 -0
  65. package/dist/src/cli/dksf-dev.js.map +1 -0
  66. package/dist/src/cli/dksf-gen-proto.d.ts +3 -0
  67. package/dist/src/cli/dksf-gen-proto.d.ts.map +1 -0
  68. package/dist/src/cli/dksf-gen-proto.js +164 -0
  69. package/dist/src/cli/dksf-gen-proto.js.map +1 -0
  70. package/dist/src/cli/dksf-install.d.ts +3 -0
  71. package/dist/src/cli/dksf-install.d.ts.map +1 -0
  72. package/dist/src/cli/dksf-install.js +10 -0
  73. package/dist/src/cli/dksf-install.js.map +1 -0
  74. package/dist/src/cli/dksf-test.d.ts +3 -0
  75. package/dist/src/cli/dksf-test.d.ts.map +1 -0
  76. package/dist/src/cli/dksf-test.js +78 -0
  77. package/dist/src/cli/dksf-test.js.map +1 -0
  78. package/dist/src/cli/dksf-update.d.ts +3 -0
  79. package/dist/src/cli/dksf-update.d.ts.map +1 -0
  80. package/dist/src/cli/dksf-update.js +86 -0
  81. package/dist/src/cli/dksf-update.js.map +1 -0
  82. package/dist/src/database/common.d.ts +84 -0
  83. package/dist/src/database/common.d.ts.map +1 -0
  84. package/dist/src/database/common.js +380 -0
  85. package/dist/src/database/common.js.map +1 -0
  86. package/dist/src/database/dialect.d.ts +10 -0
  87. package/dist/src/database/dialect.d.ts.map +1 -0
  88. package/dist/src/database/dialect.js +56 -0
  89. package/dist/src/database/dialect.js.map +1 -0
  90. package/dist/src/database/entity.d.ts +62 -0
  91. package/dist/src/database/entity.d.ts.map +1 -0
  92. package/dist/src/database/entity.js +198 -0
  93. package/dist/src/database/entity.js.map +1 -0
  94. package/dist/src/database/index.d.ts +8 -0
  95. package/dist/src/database/index.d.ts.map +1 -0
  96. package/dist/src/database/index.js +15 -0
  97. package/dist/src/database/index.js.map +1 -0
  98. package/dist/src/database/migration/MigrationResetCommand.d.ts +9 -0
  99. package/dist/src/database/migration/MigrationResetCommand.d.ts.map +1 -0
  100. package/dist/src/database/migration/MigrationResetCommand.js +75 -0
  101. package/dist/src/database/migration/MigrationResetCommand.js.map +1 -0
  102. package/dist/src/database/migration/MigrationRunCommand.d.ts +11 -0
  103. package/dist/src/database/migration/MigrationRunCommand.d.ts.map +1 -0
  104. package/dist/src/database/migration/MigrationRunCommand.js +118 -0
  105. package/dist/src/database/migration/MigrationRunCommand.js.map +1 -0
  106. package/dist/src/database/migration/characters.d.ts +14 -0
  107. package/dist/src/database/migration/characters.d.ts.map +1 -0
  108. package/dist/src/database/migration/characters.js +56 -0
  109. package/dist/src/database/migration/characters.js.map +1 -0
  110. package/dist/src/database/migration/create/MigrationCreateCommand.d.ts +11 -0
  111. package/dist/src/database/migration/create/MigrationCreateCommand.d.ts.map +1 -0
  112. package/dist/src/database/migration/create/MigrationCreateCommand.js +106 -0
  113. package/dist/src/database/migration/create/MigrationCreateCommand.js.map +1 -0
  114. package/dist/src/database/migration/create/comparator.d.ts +3 -0
  115. package/dist/src/database/migration/create/comparator.d.ts.map +1 -0
  116. package/dist/src/database/migration/create/comparator.js +408 -0
  117. package/dist/src/database/migration/create/comparator.js.map +1 -0
  118. package/dist/src/database/migration/create/db-reader.d.ts +5 -0
  119. package/dist/src/database/migration/create/db-reader.d.ts.map +1 -0
  120. package/dist/src/database/migration/create/db-reader.js +473 -0
  121. package/dist/src/database/migration/create/db-reader.js.map +1 -0
  122. package/dist/src/database/migration/create/ddl-generator.d.ts +3 -0
  123. package/dist/src/database/migration/create/ddl-generator.d.ts.map +1 -0
  124. package/dist/src/database/migration/create/ddl-generator.js +725 -0
  125. package/dist/src/database/migration/create/ddl-generator.js.map +1 -0
  126. package/dist/src/database/migration/create/entity-reader.d.ts +4 -0
  127. package/dist/src/database/migration/create/entity-reader.d.ts.map +1 -0
  128. package/dist/src/database/migration/create/entity-reader.js +417 -0
  129. package/dist/src/database/migration/create/entity-reader.js.map +1 -0
  130. package/dist/src/database/migration/create/file-generator.d.ts +3 -0
  131. package/dist/src/database/migration/create/file-generator.d.ts.map +1 -0
  132. package/dist/src/database/migration/create/file-generator.js +62 -0
  133. package/dist/src/database/migration/create/file-generator.js.map +1 -0
  134. package/dist/src/database/migration/create/prompt.d.ts +4 -0
  135. package/dist/src/database/migration/create/prompt.d.ts.map +1 -0
  136. package/dist/src/database/migration/create/prompt.js +55 -0
  137. package/dist/src/database/migration/create/prompt.js.map +1 -0
  138. package/dist/src/database/migration/create/schema-model.d.ts +109 -0
  139. package/dist/src/database/migration/create/schema-model.d.ts.map +1 -0
  140. package/dist/src/database/migration/create/schema-model.js +24 -0
  141. package/dist/src/database/migration/create/schema-model.js.map +1 -0
  142. package/dist/src/database/migration/helpers.d.ts +3 -0
  143. package/dist/src/database/migration/helpers.d.ts.map +1 -0
  144. package/dist/src/database/migration/helpers.js +13 -0
  145. package/dist/src/database/migration/helpers.js.map +1 -0
  146. package/dist/src/database/migration/index.d.ts +9 -0
  147. package/dist/src/database/migration/index.d.ts.map +1 -0
  148. package/dist/src/database/migration/index.js +43 -0
  149. package/dist/src/database/migration/index.js.map +1 -0
  150. package/dist/src/database/migration/migration.entity.d.ts +8 -0
  151. package/dist/src/database/migration/migration.entity.d.ts.map +1 -0
  152. package/dist/src/database/migration/migration.entity.js +16 -0
  153. package/dist/src/database/migration/migration.entity.js.map +1 -0
  154. package/dist/src/database/mysql.d.ts +16 -0
  155. package/dist/src/database/mysql.d.ts.map +1 -0
  156. package/dist/src/database/mysql.js +140 -0
  157. package/dist/src/database/mysql.js.map +1 -0
  158. package/dist/src/database/postgres.d.ts +16 -0
  159. package/dist/src/database/postgres.d.ts.map +1 -0
  160. package/dist/src/database/postgres.js +91 -0
  161. package/dist/src/database/postgres.js.map +1 -0
  162. package/dist/src/database/types.d.ts +21 -0
  163. package/dist/src/database/types.d.ts.map +1 -0
  164. package/dist/src/database/types.js +27 -0
  165. package/dist/src/database/types.js.map +1 -0
  166. package/dist/src/devconsole/devconsole.controller.d.ts +7 -0
  167. package/dist/src/devconsole/devconsole.controller.d.ts.map +1 -0
  168. package/dist/src/devconsole/devconsole.controller.js +82 -0
  169. package/dist/src/devconsole/devconsole.controller.js.map +1 -0
  170. package/dist/src/devconsole/devconsole.middleware.d.ts +12 -0
  171. package/dist/src/devconsole/devconsole.middleware.d.ts.map +1 -0
  172. package/dist/src/devconsole/devconsole.middleware.js +28 -0
  173. package/dist/src/devconsole/devconsole.middleware.js.map +1 -0
  174. package/dist/src/devconsole/devconsole.srpc.d.ts +14 -0
  175. package/dist/src/devconsole/devconsole.srpc.d.ts.map +1 -0
  176. package/dist/src/devconsole/devconsole.srpc.js +94 -0
  177. package/dist/src/devconsole/devconsole.srpc.js.map +1 -0
  178. package/dist/src/devconsole/devconsole.store.d.ts +101 -0
  179. package/dist/src/devconsole/devconsole.store.d.ts.map +1 -0
  180. package/dist/src/devconsole/devconsole.store.js +125 -0
  181. package/dist/src/devconsole/devconsole.store.js.map +1 -0
  182. package/dist/src/devconsole/devconsole.ws.d.ts +18 -0
  183. package/dist/src/devconsole/devconsole.ws.d.ts.map +1 -0
  184. package/dist/src/devconsole/devconsole.ws.js +470 -0
  185. package/dist/src/devconsole/devconsole.ws.js.map +1 -0
  186. package/dist/src/devconsole/index.d.ts +2 -0
  187. package/dist/src/devconsole/index.d.ts.map +1 -0
  188. package/dist/src/devconsole/index.js +6 -0
  189. package/dist/src/devconsole/index.js.map +1 -0
  190. package/dist/src/devconsole/patches.d.ts +6 -0
  191. package/dist/src/devconsole/patches.d.ts.map +1 -0
  192. package/dist/src/devconsole/patches.js +397 -0
  193. package/dist/src/devconsole/patches.js.map +1 -0
  194. package/dist/src/health/health.module.d.ts +6 -0
  195. package/dist/src/health/health.module.d.ts.map +1 -0
  196. package/dist/src/health/health.module.js +32 -0
  197. package/dist/src/health/health.module.js.map +1 -0
  198. package/dist/src/health/healthcheck.controller.d.ts +10 -0
  199. package/dist/src/health/healthcheck.controller.d.ts.map +1 -0
  200. package/dist/src/health/healthcheck.controller.js +30 -0
  201. package/dist/src/health/healthcheck.controller.js.map +1 -0
  202. package/dist/src/health/healthcheck.service.d.ts +13 -0
  203. package/dist/src/health/healthcheck.service.d.ts.map +1 -0
  204. package/dist/src/health/healthcheck.service.js +33 -0
  205. package/dist/src/health/healthcheck.service.js.map +1 -0
  206. package/dist/src/health/index.d.ts +3 -0
  207. package/dist/src/health/index.d.ts.map +1 -0
  208. package/dist/src/health/index.js +6 -0
  209. package/dist/src/health/index.js.map +1 -0
  210. package/dist/src/helpers/async/context.d.ts +11 -0
  211. package/dist/src/helpers/async/context.d.ts.map +1 -0
  212. package/dist/src/helpers/async/context.js +75 -0
  213. package/dist/src/helpers/async/context.js.map +1 -0
  214. package/dist/src/helpers/async/process.d.ts +16 -0
  215. package/dist/src/helpers/async/process.d.ts.map +1 -0
  216. package/dist/src/helpers/async/process.js +44 -0
  217. package/dist/src/helpers/async/process.js.map +1 -0
  218. package/dist/src/helpers/async/promise.d.ts +5 -0
  219. package/dist/src/helpers/async/promise.d.ts.map +1 -0
  220. package/dist/src/helpers/async/promise.js +27 -0
  221. package/dist/src/helpers/async/promise.js.map +1 -0
  222. package/dist/src/helpers/data/array.d.ts +3 -0
  223. package/dist/src/helpers/data/array.d.ts.map +1 -0
  224. package/dist/src/helpers/data/array.js +17 -0
  225. package/dist/src/helpers/data/array.js.map +1 -0
  226. package/dist/src/helpers/data/objects.d.ts +12 -0
  227. package/dist/src/helpers/data/objects.d.ts.map +1 -0
  228. package/dist/src/helpers/data/objects.js +75 -0
  229. package/dist/src/helpers/data/objects.js.map +1 -0
  230. package/dist/src/helpers/data/serialization.d.ts +4 -0
  231. package/dist/src/helpers/data/serialization.d.ts.map +1 -0
  232. package/dist/src/helpers/data/serialization.js +15 -0
  233. package/dist/src/helpers/data/serialization.js.map +1 -0
  234. package/dist/src/helpers/data/transformer.d.ts +13 -0
  235. package/dist/src/helpers/data/transformer.d.ts.map +1 -0
  236. package/dist/src/helpers/data/transformer.js +55 -0
  237. package/dist/src/helpers/data/transformer.js.map +1 -0
  238. package/dist/src/helpers/framework/decorators.d.ts +5 -0
  239. package/dist/src/helpers/framework/decorators.d.ts.map +1 -0
  240. package/dist/src/helpers/framework/decorators.js +39 -0
  241. package/dist/src/helpers/framework/decorators.js.map +1 -0
  242. package/dist/src/helpers/framework/event.d.ts +3 -0
  243. package/dist/src/helpers/framework/event.d.ts.map +1 -0
  244. package/dist/src/helpers/framework/event.js +20 -0
  245. package/dist/src/helpers/framework/event.js.map +1 -0
  246. package/dist/src/helpers/framework/injection.d.ts +7 -0
  247. package/dist/src/helpers/framework/injection.d.ts.map +1 -0
  248. package/dist/src/helpers/framework/injection.js +52 -0
  249. package/dist/src/helpers/framework/injection.js.map +1 -0
  250. package/dist/src/helpers/index.d.ts +22 -0
  251. package/dist/src/helpers/index.d.ts.map +1 -0
  252. package/dist/src/helpers/index.js +32 -0
  253. package/dist/src/helpers/index.js.map +1 -0
  254. package/dist/src/helpers/io/package.d.ts +5 -0
  255. package/dist/src/helpers/io/package.d.ts.map +1 -0
  256. package/dist/src/helpers/io/package.js +31 -0
  257. package/dist/src/helpers/io/package.js.map +1 -0
  258. package/dist/src/helpers/io/stream.d.ts +18 -0
  259. package/dist/src/helpers/io/stream.d.ts.map +1 -0
  260. package/dist/src/helpers/io/stream.js +91 -0
  261. package/dist/src/helpers/io/stream.js.map +1 -0
  262. package/dist/src/helpers/redis/broadcast.d.ts +13 -0
  263. package/dist/src/helpers/redis/broadcast.d.ts.map +1 -0
  264. package/dist/src/helpers/redis/broadcast.js +100 -0
  265. package/dist/src/helpers/redis/broadcast.js.map +1 -0
  266. package/dist/src/helpers/redis/cache.d.ts +7 -0
  267. package/dist/src/helpers/redis/cache.d.ts.map +1 -0
  268. package/dist/src/helpers/redis/cache.js +28 -0
  269. package/dist/src/helpers/redis/cache.js.map +1 -0
  270. package/dist/src/helpers/redis/mutex.d.ts +24 -0
  271. package/dist/src/helpers/redis/mutex.d.ts.map +1 -0
  272. package/dist/src/helpers/redis/mutex.js +240 -0
  273. package/dist/src/helpers/redis/mutex.js.map +1 -0
  274. package/dist/src/helpers/redis/redis.d.ts +11 -0
  275. package/dist/src/helpers/redis/redis.d.ts.map +1 -0
  276. package/dist/src/helpers/redis/redis.js +59 -0
  277. package/dist/src/helpers/redis/redis.js.map +1 -0
  278. package/dist/src/helpers/security/crypto.d.ts +26 -0
  279. package/dist/src/helpers/security/crypto.d.ts.map +1 -0
  280. package/dist/src/helpers/security/crypto.js +121 -0
  281. package/dist/src/helpers/security/crypto.js.map +1 -0
  282. package/dist/src/helpers/security/validation.d.ts +4 -0
  283. package/dist/src/helpers/security/validation.d.ts.map +1 -0
  284. package/dist/src/helpers/security/validation.js +25 -0
  285. package/dist/src/helpers/security/validation.js.map +1 -0
  286. package/dist/src/helpers/utils/date.d.ts +4 -0
  287. package/dist/src/helpers/utils/date.d.ts.map +1 -0
  288. package/dist/src/helpers/utils/date.js +23 -0
  289. package/dist/src/helpers/utils/date.js.map +1 -0
  290. package/dist/src/helpers/utils/error.d.ts +24 -0
  291. package/dist/src/helpers/utils/error.d.ts.map +1 -0
  292. package/dist/src/helpers/utils/error.js +168 -0
  293. package/dist/src/helpers/utils/error.js.map +1 -0
  294. package/dist/src/helpers/utils/jsx.d.ts +3 -0
  295. package/dist/src/helpers/utils/jsx.d.ts.map +1 -0
  296. package/dist/src/helpers/utils/jsx.js +13 -0
  297. package/dist/src/helpers/utils/jsx.js.map +1 -0
  298. package/dist/src/helpers/utils/uuid.d.ts +3 -0
  299. package/dist/src/helpers/utils/uuid.d.ts.map +1 -0
  300. package/dist/src/helpers/utils/uuid.js +14 -0
  301. package/dist/src/helpers/utils/uuid.js.map +1 -0
  302. package/dist/src/http/auth.d.ts +46 -0
  303. package/dist/src/http/auth.d.ts.map +1 -0
  304. package/dist/src/http/auth.js +162 -0
  305. package/dist/src/http/auth.js.map +1 -0
  306. package/dist/src/http/context.d.ts +5 -0
  307. package/dist/src/http/context.d.ts.map +1 -0
  308. package/dist/src/http/context.js +22 -0
  309. package/dist/src/http/context.js.map +1 -0
  310. package/dist/src/http/cors.d.ts +36 -0
  311. package/dist/src/http/cors.d.ts.map +1 -0
  312. package/dist/src/http/cors.js +171 -0
  313. package/dist/src/http/cors.js.map +1 -0
  314. package/dist/src/http/errors.d.ts +3 -0
  315. package/dist/src/http/errors.d.ts.map +1 -0
  316. package/dist/src/http/errors.js +10 -0
  317. package/dist/src/http/errors.js.map +1 -0
  318. package/dist/src/http/index.d.ts +24 -0
  319. package/dist/src/http/index.d.ts.map +1 -0
  320. package/dist/src/http/index.js +25 -0
  321. package/dist/src/http/index.js.map +1 -0
  322. package/dist/src/http/kernel.d.ts +17 -0
  323. package/dist/src/http/kernel.d.ts.map +1 -0
  324. package/dist/src/http/kernel.js +133 -0
  325. package/dist/src/http/kernel.js.map +1 -0
  326. package/dist/src/http/middleware.d.ts +12 -0
  327. package/dist/src/http/middleware.d.ts.map +1 -0
  328. package/dist/src/http/middleware.js +61 -0
  329. package/dist/src/http/middleware.js.map +1 -0
  330. package/dist/src/http/overrides.d.ts +2 -0
  331. package/dist/src/http/overrides.d.ts.map +1 -0
  332. package/dist/src/http/overrides.js +19 -0
  333. package/dist/src/http/overrides.js.map +1 -0
  334. package/dist/src/http/store.d.ts +33 -0
  335. package/dist/src/http/store.d.ts.map +1 -0
  336. package/dist/src/http/store.js +102 -0
  337. package/dist/src/http/store.js.map +1 -0
  338. package/dist/src/http/uploads.d.ts +7 -0
  339. package/dist/src/http/uploads.d.ts.map +1 -0
  340. package/dist/src/http/uploads.js +8 -0
  341. package/dist/src/http/uploads.js.map +1 -0
  342. package/dist/src/http/workflow.d.ts +18 -0
  343. package/dist/src/http/workflow.d.ts.map +1 -0
  344. package/dist/src/http/workflow.js +181 -0
  345. package/dist/src/http/workflow.js.map +1 -0
  346. package/dist/src/index.d.ts +13 -0
  347. package/dist/src/index.d.ts.map +1 -0
  348. package/dist/src/index.js +25 -0
  349. package/dist/src/index.js.map +1 -0
  350. package/dist/src/services/cli/invoke.d.ts +5 -0
  351. package/dist/src/services/cli/invoke.d.ts.map +1 -0
  352. package/dist/src/services/cli/invoke.js +45 -0
  353. package/dist/src/services/cli/invoke.js.map +1 -0
  354. package/dist/src/services/cli/repl-context.d.ts +13 -0
  355. package/dist/src/services/cli/repl-context.d.ts.map +1 -0
  356. package/dist/src/services/cli/repl-context.js +60 -0
  357. package/dist/src/services/cli/repl-context.js.map +1 -0
  358. package/dist/src/services/cli/repl.d.ts +5 -0
  359. package/dist/src/services/cli/repl.d.ts.map +1 -0
  360. package/dist/src/services/cli/repl.js +32 -0
  361. package/dist/src/services/cli/repl.js.map +1 -0
  362. package/dist/src/services/cli.d.ts +12 -0
  363. package/dist/src/services/cli.d.ts.map +1 -0
  364. package/dist/src/services/cli.js +76 -0
  365. package/dist/src/services/cli.js.map +1 -0
  366. package/dist/src/services/index.d.ts +7 -0
  367. package/dist/src/services/index.d.ts.map +1 -0
  368. package/dist/src/services/index.js +10 -0
  369. package/dist/src/services/index.js.map +1 -0
  370. package/dist/src/services/leader.d.ts +32 -0
  371. package/dist/src/services/leader.d.ts.map +1 -0
  372. package/dist/src/services/leader.js +174 -0
  373. package/dist/src/services/leader.js.map +1 -0
  374. package/dist/src/services/logger.d.ts +35 -0
  375. package/dist/src/services/logger.d.ts.map +1 -0
  376. package/dist/src/services/logger.js +245 -0
  377. package/dist/src/services/logger.js.map +1 -0
  378. package/dist/src/services/mail/index.d.ts +61 -0
  379. package/dist/src/services/mail/index.d.ts.map +1 -0
  380. package/dist/src/services/mail/index.js +90 -0
  381. package/dist/src/services/mail/index.js.map +1 -0
  382. package/dist/src/services/mail/postmark.d.ts +11 -0
  383. package/dist/src/services/mail/postmark.d.ts.map +1 -0
  384. package/dist/src/services/mail/postmark.js +42 -0
  385. package/dist/src/services/mail/postmark.js.map +1 -0
  386. package/dist/src/services/mail/smtp.d.ts +11 -0
  387. package/dist/src/services/mail/smtp.d.ts.map +1 -0
  388. package/dist/src/services/mail/smtp.js +61 -0
  389. package/dist/src/services/mail/smtp.js.map +1 -0
  390. package/dist/src/services/mesh.d.ts +65 -0
  391. package/dist/src/services/mesh.d.ts.map +1 -0
  392. package/dist/src/services/mesh.js +422 -0
  393. package/dist/src/services/mesh.js.map +1 -0
  394. package/dist/src/services/worker/bootstrap.d.ts +3 -0
  395. package/dist/src/services/worker/bootstrap.d.ts.map +1 -0
  396. package/dist/src/services/worker/bootstrap.js +64 -0
  397. package/dist/src/services/worker/bootstrap.js.map +1 -0
  398. package/dist/src/services/worker/cli.d.ts +11 -0
  399. package/dist/src/services/worker/cli.d.ts.map +1 -0
  400. package/dist/src/services/worker/cli.js +43 -0
  401. package/dist/src/services/worker/cli.js.map +1 -0
  402. package/dist/src/services/worker/entity.d.ts +18 -0
  403. package/dist/src/services/worker/entity.d.ts.map +1 -0
  404. package/dist/src/services/worker/entity.js +16 -0
  405. package/dist/src/services/worker/entity.js.map +1 -0
  406. package/dist/src/services/worker/index.d.ts +9 -0
  407. package/dist/src/services/worker/index.d.ts.map +1 -0
  408. package/dist/src/services/worker/index.js +40 -0
  409. package/dist/src/services/worker/index.js.map +1 -0
  410. package/dist/src/services/worker/queue.d.ts +8 -0
  411. package/dist/src/services/worker/queue.d.ts.map +1 -0
  412. package/dist/src/services/worker/queue.js +32 -0
  413. package/dist/src/services/worker/queue.js.map +1 -0
  414. package/dist/src/services/worker/recorder.d.ts +16 -0
  415. package/dist/src/services/worker/recorder.d.ts.map +1 -0
  416. package/dist/src/services/worker/recorder.js +168 -0
  417. package/dist/src/services/worker/recorder.js.map +1 -0
  418. package/dist/src/services/worker/runner.d.ts +21 -0
  419. package/dist/src/services/worker/runner.d.ts.map +1 -0
  420. package/dist/src/services/worker/runner.js +156 -0
  421. package/dist/src/services/worker/runner.js.map +1 -0
  422. package/dist/src/services/worker/types.d.ts +26 -0
  423. package/dist/src/services/worker/types.d.ts.map +1 -0
  424. package/dist/src/services/worker/types.js +29 -0
  425. package/dist/src/services/worker/types.js.map +1 -0
  426. package/dist/src/srpc/SrpcByteStream.d.ts +67 -0
  427. package/dist/src/srpc/SrpcByteStream.d.ts.map +1 -0
  428. package/dist/src/srpc/SrpcByteStream.js +319 -0
  429. package/dist/src/srpc/SrpcByteStream.js.map +1 -0
  430. package/dist/src/srpc/SrpcClient.d.ts +75 -0
  431. package/dist/src/srpc/SrpcClient.d.ts.map +1 -0
  432. package/dist/src/srpc/SrpcClient.js +445 -0
  433. package/dist/src/srpc/SrpcClient.js.map +1 -0
  434. package/dist/src/srpc/SrpcServer.d.ts +80 -0
  435. package/dist/src/srpc/SrpcServer.d.ts.map +1 -0
  436. package/dist/src/srpc/SrpcServer.js +561 -0
  437. package/dist/src/srpc/SrpcServer.js.map +1 -0
  438. package/dist/src/srpc/index.d.ts +7 -0
  439. package/dist/src/srpc/index.d.ts.map +1 -0
  440. package/dist/src/srpc/index.js +12 -0
  441. package/dist/src/srpc/index.js.map +1 -0
  442. package/dist/src/srpc/types.d.ts +131 -0
  443. package/dist/src/srpc/types.d.ts.map +1 -0
  444. package/dist/src/srpc/types.js +65 -0
  445. package/dist/src/srpc/types.js.map +1 -0
  446. package/dist/src/telemetry/index.d.ts +2 -0
  447. package/dist/src/telemetry/index.d.ts.map +1 -0
  448. package/dist/src/telemetry/index.js +5 -0
  449. package/dist/src/telemetry/index.js.map +1 -0
  450. package/dist/src/telemetry/otel/MariaDBInstrumentation.d.ts +22 -0
  451. package/dist/src/telemetry/otel/MariaDBInstrumentation.d.ts.map +1 -0
  452. package/dist/src/telemetry/otel/MariaDBInstrumentation.js +248 -0
  453. package/dist/src/telemetry/otel/MariaDBInstrumentation.js.map +1 -0
  454. package/dist/src/telemetry/otel/helpers.d.ts +27 -0
  455. package/dist/src/telemetry/otel/helpers.d.ts.map +1 -0
  456. package/dist/src/telemetry/otel/helpers.js +126 -0
  457. package/dist/src/telemetry/otel/helpers.js.map +1 -0
  458. package/dist/src/telemetry/otel/index.d.ts +14 -0
  459. package/dist/src/telemetry/otel/index.d.ts.map +1 -0
  460. package/dist/src/telemetry/otel/index.js +132 -0
  461. package/dist/src/telemetry/otel/index.js.map +1 -0
  462. package/dist/src/telemetry/otel/metrics.controller.d.ts +6 -0
  463. package/dist/src/telemetry/otel/metrics.controller.d.ts.map +1 -0
  464. package/dist/src/telemetry/otel/metrics.controller.js +63 -0
  465. package/dist/src/telemetry/otel/metrics.controller.js.map +1 -0
  466. package/dist/src/telemetry/sentry.d.ts +9 -0
  467. package/dist/src/telemetry/sentry.d.ts.map +1 -0
  468. package/dist/src/telemetry/sentry.js +62 -0
  469. package/dist/src/telemetry/sentry.js.map +1 -0
  470. package/dist/src/testing/expect.d.ts +25 -0
  471. package/dist/src/testing/expect.d.ts.map +1 -0
  472. package/dist/src/testing/expect.js +151 -0
  473. package/dist/src/testing/expect.js.map +1 -0
  474. package/dist/src/testing/fixtures.d.ts +19 -0
  475. package/dist/src/testing/fixtures.d.ts.map +1 -0
  476. package/dist/src/testing/fixtures.js +69 -0
  477. package/dist/src/testing/fixtures.js.map +1 -0
  478. package/dist/src/testing/index.d.ts +260 -0
  479. package/dist/src/testing/index.d.ts.map +1 -0
  480. package/dist/src/testing/index.js +345 -0
  481. package/dist/src/testing/index.js.map +1 -0
  482. package/dist/src/testing/requests.d.ts +10 -0
  483. package/dist/src/testing/requests.d.ts.map +1 -0
  484. package/dist/src/testing/requests.js +56 -0
  485. package/dist/src/testing/requests.js.map +1 -0
  486. package/dist/src/testing/sql.d.ts +11 -0
  487. package/dist/src/testing/sql.d.ts.map +1 -0
  488. package/dist/src/testing/sql.js +55 -0
  489. package/dist/src/testing/sql.js.map +1 -0
  490. package/dist/src/types/index.d.ts +57 -0
  491. package/dist/src/types/index.d.ts.map +1 -0
  492. package/dist/src/types/index.js +73 -0
  493. package/dist/src/types/index.js.map +1 -0
  494. package/dist/src/types/phone.d.ts +11 -0
  495. package/dist/src/types/phone.d.ts.map +1 -0
  496. package/dist/src/types/phone.js +73 -0
  497. package/dist/src/types/phone.js.map +1 -0
  498. package/docs/.vitepress/config.mts +79 -0
  499. package/docs/.yarnrc.yml +1 -0
  500. package/docs/content/CONTRIBUTING.md +140 -0
  501. package/docs/content/README-DEV.md +142 -0
  502. package/docs/content/README.md +39 -0
  503. package/docs/content/authentication.md +215 -0
  504. package/docs/content/cli.md +335 -0
  505. package/docs/content/configuration.md +175 -0
  506. package/docs/content/database.md +422 -0
  507. package/docs/content/devconsole.md +123 -0
  508. package/docs/content/getting-started.md +154 -0
  509. package/docs/content/guides/test-migration-guide.md +351 -0
  510. package/docs/content/health.md +54 -0
  511. package/docs/content/helpers.md +322 -0
  512. package/docs/content/http.md +253 -0
  513. package/docs/content/index.md +147 -0
  514. package/docs/content/leader-service.md +98 -0
  515. package/docs/content/logging.md +150 -0
  516. package/docs/content/mail.md +161 -0
  517. package/docs/content/mesh-service.md +204 -0
  518. package/docs/content/public/images/devconsole/01-dashboard.png +0 -0
  519. package/docs/content/public/images/devconsole/02-routes.png +0 -0
  520. package/docs/content/public/images/devconsole/03-openapi.png +0 -0
  521. package/docs/content/public/images/devconsole/04-requests.png +0 -0
  522. package/docs/content/public/images/devconsole/05-srpc.png +0 -0
  523. package/docs/content/public/images/devconsole/06-database.png +0 -0
  524. package/docs/content/public/images/devconsole/07-health.png +0 -0
  525. package/docs/content/public/images/devconsole/08-mutex.png +0 -0
  526. package/docs/content/public/images/devconsole/09-repl.png +0 -0
  527. package/docs/content/public/images/devconsole/10-workers.png +0 -0
  528. package/docs/content/redis.md +168 -0
  529. package/docs/content/srpc.md +261 -0
  530. package/docs/content/telemetry.md +166 -0
  531. package/docs/content/testing.md +222 -0
  532. package/docs/content/types.md +215 -0
  533. package/docs/content/worker.md +177 -0
  534. package/docs/package.json +16 -0
  535. package/docs/scripts/README-SCREENSHOTS.md +145 -0
  536. package/docs/scripts/capture-devconsole-screenshots.js +184 -0
  537. package/docs/yarn.lock +2408 -0
  538. package/package.json +144 -0
  539. package/patches/@deepkit+type+1.0.19.patch +38 -0
  540. package/patches/deepkit-openapi-core+0.0.9.patch +62 -0
  541. package/src/app/base.ts +253 -0
  542. package/src/app/config.loader.ts +66 -0
  543. package/src/app/config.ts +119 -0
  544. package/src/app/const.ts +4 -0
  545. package/src/app/dev.ts +92 -0
  546. package/src/app/index.ts +6 -0
  547. package/src/app/openapi.ts +3 -0
  548. package/src/app/resolver.ts +49 -0
  549. package/src/app/shutdown.ts +55 -0
  550. package/src/app/state.ts +19 -0
  551. package/src/auth/index.ts +2 -0
  552. package/src/auth/jwt.ts +275 -0
  553. package/src/auth/provider.ts +57 -0
  554. package/src/cli/dksf-dev.ts +416 -0
  555. package/src/cli/dksf-gen-proto.ts +176 -0
  556. package/src/cli/dksf-install.ts +11 -0
  557. package/src/cli/dksf-test.ts +84 -0
  558. package/src/cli/dksf-update.ts +101 -0
  559. package/src/database/common.ts +385 -0
  560. package/src/database/dialect.ts +43 -0
  561. package/src/database/entity.ts +285 -0
  562. package/src/database/index.ts +7 -0
  563. package/src/database/migration/MigrationResetCommand.ts +72 -0
  564. package/src/database/migration/MigrationRunCommand.ts +118 -0
  565. package/src/database/migration/characters.ts +53 -0
  566. package/src/database/migration/create/MigrationCreateCommand.ts +96 -0
  567. package/src/database/migration/create/comparator.ts +467 -0
  568. package/src/database/migration/create/db-reader.ts +510 -0
  569. package/src/database/migration/create/ddl-generator.ts +755 -0
  570. package/src/database/migration/create/entity-reader.ts +471 -0
  571. package/src/database/migration/create/file-generator.ts +57 -0
  572. package/src/database/migration/create/prompt.ts +49 -0
  573. package/src/database/migration/create/schema-model.ts +102 -0
  574. package/src/database/migration/helpers.ts +7 -0
  575. package/src/database/migration/index.ts +35 -0
  576. package/src/database/migration/migration.entity.ts +10 -0
  577. package/src/database/mysql.ts +140 -0
  578. package/src/database/postgres.ts +97 -0
  579. package/src/database/types.ts +18 -0
  580. package/src/devconsole/devconsole.controller.ts +59 -0
  581. package/src/devconsole/devconsole.middleware.ts +23 -0
  582. package/src/devconsole/devconsole.srpc.ts +94 -0
  583. package/src/devconsole/devconsole.store.ts +190 -0
  584. package/src/devconsole/devconsole.ws.ts +491 -0
  585. package/src/devconsole/index.ts +1 -0
  586. package/src/devconsole/patches.ts +428 -0
  587. package/src/health/health.module.ts +30 -0
  588. package/src/health/healthcheck.controller.ts +17 -0
  589. package/src/health/healthcheck.service.ts +28 -0
  590. package/src/health/index.ts +2 -0
  591. package/src/helpers/async/context.ts +67 -0
  592. package/src/helpers/async/process.ts +49 -0
  593. package/src/helpers/async/promise.ts +16 -0
  594. package/src/helpers/data/array.ts +11 -0
  595. package/src/helpers/data/objects.ts +64 -0
  596. package/src/helpers/data/serialization.ts +11 -0
  597. package/src/helpers/data/transformer.ts +54 -0
  598. package/src/helpers/framework/decorators.ts +27 -0
  599. package/src/helpers/framework/event.ts +11 -0
  600. package/src/helpers/framework/injection.ts +47 -0
  601. package/src/helpers/index.ts +34 -0
  602. package/src/helpers/io/package.ts +26 -0
  603. package/src/helpers/io/stream.ts +79 -0
  604. package/src/helpers/redis/broadcast.ts +96 -0
  605. package/src/helpers/redis/cache.ts +28 -0
  606. package/src/helpers/redis/mutex.ts +260 -0
  607. package/src/helpers/redis/redis.ts +60 -0
  608. package/src/helpers/security/crypto.ts +133 -0
  609. package/src/helpers/security/validation.ts +16 -0
  610. package/src/helpers/utils/date.ts +13 -0
  611. package/src/helpers/utils/error.ts +155 -0
  612. package/src/helpers/utils/jsx.ts +8 -0
  613. package/src/helpers/utils/uuid.ts +8 -0
  614. package/src/http/auth.ts +156 -0
  615. package/src/http/context.ts +15 -0
  616. package/src/http/cors.ts +159 -0
  617. package/src/http/errors.ts +9 -0
  618. package/src/http/index.ts +19 -0
  619. package/src/http/kernel.ts +138 -0
  620. package/src/http/middleware.ts +59 -0
  621. package/src/http/overrides.ts +20 -0
  622. package/src/http/store.ts +86 -0
  623. package/src/http/uploads.ts +6 -0
  624. package/src/http/workflow.ts +167 -0
  625. package/src/index.ts +19 -0
  626. package/src/services/cli/invoke.ts +39 -0
  627. package/src/services/cli/repl-context.ts +63 -0
  628. package/src/services/cli/repl.ts +22 -0
  629. package/src/services/cli.ts +74 -0
  630. package/src/services/index.ts +6 -0
  631. package/src/services/leader.ts +201 -0
  632. package/src/services/logger.ts +258 -0
  633. package/src/services/mail/index.ts +117 -0
  634. package/src/services/mail/postmark.ts +37 -0
  635. package/src/services/mail/smtp.ts +46 -0
  636. package/src/services/mesh.ts +508 -0
  637. package/src/services/worker/bootstrap.ts +53 -0
  638. package/src/services/worker/cli.ts +32 -0
  639. package/src/services/worker/entity.ts +22 -0
  640. package/src/services/worker/index.ts +30 -0
  641. package/src/services/worker/queue.ts +35 -0
  642. package/src/services/worker/recorder.ts +172 -0
  643. package/src/services/worker/runner.ts +179 -0
  644. package/src/services/worker/types.ts +32 -0
  645. package/src/srpc/SrpcByteStream.ts +382 -0
  646. package/src/srpc/SrpcClient.ts +512 -0
  647. package/src/srpc/SrpcServer.ts +681 -0
  648. package/src/srpc/index.ts +15 -0
  649. package/src/srpc/types.ts +146 -0
  650. package/src/telemetry/index.ts +1 -0
  651. package/src/telemetry/otel/MariaDBInstrumentation.ts +297 -0
  652. package/src/telemetry/otel/helpers.ts +117 -0
  653. package/src/telemetry/otel/index.ts +150 -0
  654. package/src/telemetry/otel/metrics.controller.ts +50 -0
  655. package/src/telemetry/sentry.ts +58 -0
  656. package/src/testing/expect.ts +148 -0
  657. package/src/testing/fixtures.ts +62 -0
  658. package/src/testing/index.ts +355 -0
  659. package/src/testing/requests.ts +68 -0
  660. package/src/testing/sql.ts +50 -0
  661. package/src/types/index.ts +64 -0
  662. package/src/types/phone.ts +64 -0
  663. package/types.d.ts +20 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Signal24 LLC dba Zyno Consulting
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,458 @@
1
+ # @zyno-io/dk-server-foundation
2
+
3
+ A TypeScript foundation library built on top of the [Deepkit framework](https://deepkit.io) for building server applications. Provides opinionated abstractions and utilities for database management, HTTP handling, authentication, background jobs, RPC, distributed systems, and observability.
4
+
5
+ 📚 **[Documentation Site](https://zyno-io.github.io/dk-server-foundation/)** | 🚀 **[Getting Started](./docs/getting-started.md)**
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install @zyno-io/dk-server-foundation
11
+ # or
12
+ yarn add @zyno-io/dk-server-foundation
13
+ ```
14
+
15
+ The postinstall script runs `deepkit-type-install` and `patch-package` automatically.
16
+
17
+ > **Requirement:** TypeScript with `experimentalDecorators: true` and Deepkit's `"reflection": true` in tsconfig.json.
18
+
19
+ ## Quick Start
20
+
21
+ ```typescript
22
+ import { createApp, BaseAppConfig, createMySQLDatabase } from '@zyno-io/dk-server-foundation';
23
+
24
+ class AppConfig extends BaseAppConfig {
25
+ MY_SETTING!: string;
26
+ }
27
+
28
+ class MyDB extends createMySQLDatabase({}, [UserEntity]) {}
29
+
30
+ const app = createApp({
31
+ config: AppConfig,
32
+ db: MyDB,
33
+ cors: config => ({ hosts: ['https://example.com'], credentials: true }),
34
+ controllers: [UserController],
35
+ providers: [UserService]
36
+ });
37
+
38
+ app.run();
39
+ ```
40
+
41
+ This gives you an HTTP server on port 3000 with health checks, CORS, database, logging, and OpenAPI docs (in development).
42
+
43
+ ## Modules
44
+
45
+ | Module | Description | Docs |
46
+ | --------------------------------------- | ---------------------------------------------------------- | -------------------------------------------- |
47
+ | [Application](#application) | App factory, config, DI resolution | [Getting Started](./docs/getting-started.md) |
48
+ | [Graceful Shutdown](#graceful-shutdown) | Pre-shutdown event for async cleanup | |
49
+ | [Configuration](#configuration) | Environment-based config with secrets support | [Configuration](./docs/configuration.md) |
50
+ | [Database](#database) | MySQL/MariaDB ORM with transactions, hooks, and migrations | [Database](./docs/database.md) |
51
+ | [HTTP](#http) | Custom HTTP kernel, middleware, uploads, CORS | [HTTP](./docs/http.md) |
52
+ | [Authentication](#authentication) | JWT and Basic Auth with entity resolution | [Authentication](./docs/authentication.md) |
53
+ | [Workers](#workers) | BullMQ background job processing | [Workers](./docs/worker.md) |
54
+ | [SRPC](#srpc) | Bidirectional WebSocket RPC with binary streams | [SRPC](./docs/srpc.md) |
55
+ | [Leader Election](#leader-election) | Redis-based distributed leader election | [Leader Service](./docs/leader-service.md) |
56
+ | [Mesh Networking](#mesh-networking) | Typed RPC between distributed instances | [Mesh Service](./docs/mesh-service.md) |
57
+ | [Mail](#mail) | Email via Postmark or SMTP with templates | [Mail](./docs/mail.md) |
58
+ | [Telemetry](#telemetry) | OpenTelemetry and Sentry integration | [Telemetry](./docs/telemetry.md) |
59
+ | [Health Checks](#health-checks) | Liveness endpoint with pluggable checks | [Health](./docs/health.md) |
60
+ | [Helpers](#helpers) | Async context, Redis cache/mutex, crypto, and more | [Helpers](./docs/helpers.md) |
61
+ | [Testing](#testing) | Test facades, fixtures, and request mocking | [Testing](./docs/testing.md) |
62
+ | [Types](#types) | Phone numbers, dates, coordinates, and utility types | [Types](./docs/types.md) |
63
+ | [Logging](#logging) | Scoped Pino logger with context tracking | [Logging](./docs/logging.md) |
64
+ | [DevConsole](#devconsole) | Built-in web dashboard for development monitoring | [DevConsole](./docs/devconsole.md) |
65
+ | [CLI Tools](#cli-tools) | REPL, provider invoke, migrations, proto generation | [CLI](./docs/cli.md) |
66
+
67
+ ---
68
+
69
+ ## Application
70
+
71
+ Applications are created with `createApp()`, which sets up a Deepkit app with opinionated defaults: custom HTTP kernel, health checks, config loading from environment variables, CORS, and optional worker/RPC support.
72
+
73
+ ```typescript
74
+ const app = createApp({
75
+ config: MyConfig,
76
+ db: MyDB,
77
+ enableWorker: true,
78
+ cors: config => ({ hosts: [config.CORS_ORIGIN], credentials: true })
79
+ });
80
+ ```
81
+
82
+ Services decorated with `@AutoStart()` are instantiated at startup for establishing connections or background processes.
83
+
84
+ Use `resolve()` (or its alias `r()`) to access any provider from the DI container outside of constructor injection:
85
+
86
+ ```typescript
87
+ import { r } from '@zyno-io/dk-server-foundation';
88
+ const db = r(MyDatabase);
89
+ ```
90
+
91
+ ## Graceful Shutdown
92
+
93
+ `createApp()` automatically installs a `ShutdownListener` that intercepts SIGTERM/SIGINT and dispatches an `onServerShutdownRequested` event before forwarding to Deepkit's built-in shutdown. This lets you perform async cleanup (drain connections, finish in-flight work) before the framework tears down.
94
+
95
+ ```typescript
96
+ import { eventDispatcher } from '@deepkit/event';
97
+ import { onServerShutdownRequested } from '@zyno-io/dk-server-foundation';
98
+
99
+ class MyShutdownHandler {
100
+ @eventDispatcher.listen(onServerShutdownRequested)
101
+ async onShutdownRequested() {
102
+ // Async cleanup here — this handler is awaited before
103
+ // Deepkit's onServerShutdown fires.
104
+ }
105
+ }
106
+ ```
107
+
108
+ Register your handler as a listener in `createApp()`:
109
+
110
+ ```typescript
111
+ const app = createApp({
112
+ config: AppConfig,
113
+ listeners: [MyShutdownHandler]
114
+ });
115
+ ```
116
+
117
+ ## Configuration
118
+
119
+ Extend `BaseAppConfig` to define application settings. All properties are loaded from environment variables via `@zyno-io/config`. Properties ending in `_SECRET` are treated as secrets.
120
+
121
+ ```typescript
122
+ class AppConfig extends BaseAppConfig {
123
+ STRIPE_API_KEY_SECRET!: string;
124
+ MAX_UPLOAD_SIZE: number = 10_000_000;
125
+ }
126
+ ```
127
+
128
+ See [Configuration](./docs/configuration.md) for the full list of built-in settings.
129
+
130
+ ## Database
131
+
132
+ Extends Deepkit's ORM with support for both **MySQL** and **PostgreSQL**: transaction hooks, session locks, raw query helpers, and entity creation utilities.
133
+
134
+ ```typescript
135
+ class MyDB extends createMySQLDatabase({}, [User, Post]) {}
136
+ // or
137
+ class MyDB extends createPostgresDatabase({}, [User, Post]) {}
138
+
139
+ // Entity creation
140
+ const user = await createPersistedEntity(User, { email: 'a@b.com', name: 'Alice' }, session);
141
+
142
+ // Transaction with hooks
143
+ await db.transaction(async session => {
144
+ session.addPostCommitHook(async () => {
145
+ await notifyUser(user);
146
+ });
147
+ await session.flush();
148
+ });
149
+
150
+ // Session locks (MySQL: _locks table, PostgreSQL: pg_advisory_xact_lock)
151
+ await db.transaction(async session => {
152
+ await session.acquireSessionLock(['wallet', walletId]);
153
+ // Lock held until commit/rollback
154
+ });
155
+ ```
156
+
157
+ ### Migrations
158
+
159
+ Generate migrations by diffing entity definitions against the live database:
160
+
161
+ ```bash
162
+ # Interactive mode (prompts for column renames)
163
+ ts-node app.ts migration:create
164
+
165
+ # Non-interactive (CI-safe, treats ambiguous changes as drop+add)
166
+ ts-node app.ts migration:create --non-interactive
167
+
168
+ # Run pending migrations
169
+ ts-node app.ts migration:run
170
+ ```
171
+
172
+ The `migration:create` command reads entity metadata via Deepkit reflection, introspects the database schema, and generates dialect-appropriate DDL covering: table creation/removal, column additions/removals/modifications/renames, index and foreign key changes, primary key changes, and PostgreSQL enum type management. Migration files use the `createMigration()` format:
173
+
174
+ ```typescript
175
+ import { createMigration } from '@zyno-io/dk-server-foundation';
176
+
177
+ export default createMigration(async db => {
178
+ await db.rawExecute(`ALTER TABLE \`users\` ADD COLUMN \`bio\` varchar(500) NULL AFTER \`email\``);
179
+ });
180
+ ```
181
+
182
+ ## HTTP
183
+
184
+ Custom HTTP kernel with configurable request logging, middleware that preserves HTTP error codes, file uploads, and multi-origin CORS support.
185
+
186
+ ```typescript
187
+ // Custom middleware
188
+ class RateLimitMiddleware extends HttpMiddleware {
189
+ async handle(request: HttpRequest, response: HttpResponse) {
190
+ // Rate limiting logic; throw HttpError to reject
191
+ }
192
+ }
193
+ ```
194
+
195
+ Response type helpers (`OkResponse`, `RedirectResponse`, `EmptyResponse`, `AnyResponse`) are used as return type annotations on controller methods.
196
+
197
+ ## Authentication
198
+
199
+ JWT (HS256/EdDSA) and HTTP Basic Auth with request-scoped caching and entity resolution.
200
+
201
+ ```typescript
202
+ // Create auth middleware that validates JWT and checks entity existence
203
+ const authMiddleware = createAuthMiddleware(User);
204
+
205
+ // Use as route middleware
206
+ @http.GET('/me').use(authMiddleware)
207
+ async getMe(/* ... */) {
208
+ // JWT is validated; use getEntityFromRequestJwt to load the entity
209
+ }
210
+ ```
211
+
212
+ ## Workers
213
+
214
+ BullMQ-based background job processing. Define jobs with `@WorkerJob()` and queue them via `WorkerService`.
215
+
216
+ ```typescript
217
+ @WorkerJob()
218
+ class SendEmailJob extends BaseJob<{ to: string; body: string }, void> {
219
+ async handle(data: { to: string; body: string }) {
220
+ await sendEmail(data.to, data.body);
221
+ }
222
+ }
223
+
224
+ // Queue a job
225
+ await workerService.queueJob(SendEmailJob, { to: 'user@example.com', body: 'Hello' });
226
+ ```
227
+
228
+ Enable with `enableWorker: true` in `createApp()`. Jobs are automatically discovered and registered.
229
+
230
+ ## SRPC
231
+
232
+ Bidirectional RPC over WebSocket with HMAC authentication, ts-proto code generation, and multiplexed binary streams.
233
+
234
+ ```typescript
235
+ // Server
236
+ const server = new SrpcServer({ logger, clientMessage, serverMessage, wsPath: '/rpc' });
237
+ server.registerMessageHandler('uEcho', async (stream, data) => {
238
+ return { message: data.message };
239
+ });
240
+
241
+ // Client
242
+ const client = new SrpcClient(logger, 'wss://host/rpc', clientMessage, serverMessage, 'client-1');
243
+ const result = client.invoke('uEcho', { message: 'hello' });
244
+ ```
245
+
246
+ Generate TypeScript types from `.proto` files:
247
+
248
+ ```bash
249
+ dksf-gen-proto input.proto output/
250
+ ```
251
+
252
+ ## Leader Election
253
+
254
+ Distributed leader election using Redis. Exactly one instance holds leadership at a time, with automatic renewal and failover.
255
+
256
+ ```typescript
257
+ const leader = new LeaderService('my-task');
258
+ leader.setBecameLeaderCallback(async () => {
259
+ /* start leader-only work */
260
+ });
261
+ leader.start();
262
+ ```
263
+
264
+ See [Leader Service](./docs/leader-service.md) for full API documentation.
265
+
266
+ ## Mesh Networking
267
+
268
+ Typed RPC between distributed application instances. Nodes get unique IDs and can invoke handlers on any other node with full type safety.
269
+
270
+ ```typescript
271
+ type Messages = {
272
+ getStatus: { request: {}; response: { status: string } };
273
+ };
274
+
275
+ const mesh = new MeshService<Messages>('my-app');
276
+ mesh.registerHandler('getStatus', async () => ({ status: 'ok' }));
277
+ await mesh.start();
278
+ ```
279
+
280
+ See [Mesh Service](./docs/mesh-service.md) for full API documentation.
281
+
282
+ ## Mail
283
+
284
+ Email sending via Postmark or SMTP with a template system.
285
+
286
+ ```typescript
287
+ class WelcomeEmail extends MailTemplate<{ name: string }> {
288
+ subject = 'Welcome!';
289
+ generateHtml() {
290
+ return `<h1>Hello ${this.data.name}</h1>`;
291
+ }
292
+ }
293
+
294
+ await mailService.sendFromTemplate({
295
+ to: { address: 'user@example.com' },
296
+ template: WelcomeEmail,
297
+ data: { name: 'Alice' }
298
+ });
299
+ ```
300
+
301
+ ## Telemetry
302
+
303
+ OpenTelemetry auto-instrumentation for HTTP, database, Redis, DNS, and BullMQ. Optional Sentry integration.
304
+
305
+ ```typescript
306
+ // Call before other imports
307
+ import { init } from '@zyno-io/dk-server-foundation/telemetry/otel';
308
+ init();
309
+
310
+ // Manual spans
311
+ import { withSpan } from '@zyno-io/dk-server-foundation';
312
+ await withSpan('processOrder', async () => {
313
+ // traced operation
314
+ });
315
+ ```
316
+
317
+ ## Health Checks
318
+
319
+ A `/healthz` endpoint is automatically registered by `createApp()`. Register additional checks via `HealthcheckService.register()`. When a database is configured, a connectivity check is added automatically.
320
+
321
+ ```typescript
322
+ class MyService {
323
+ constructor(private hcSvc: HealthcheckService) {
324
+ hcSvc.register(async () => {
325
+ // Throw to indicate unhealthy
326
+ await checkExternalDependency();
327
+ }, 'External API');
328
+ }
329
+ }
330
+ ```
331
+
332
+ Use `checkIndividual()` for per-check status results (used by DevConsole's Health view).
333
+
334
+ ## Helpers
335
+
336
+ Organized utility functions for common patterns:
337
+
338
+ - **Async**: `AsyncContext`, semaphores, child process execution
339
+ - **Redis**: Cache with TTL, distributed mutex, pub/sub broadcast channels
340
+ - **Crypto**: AES-256-GCM encryption, random string generation
341
+ - **Data**: Array/object manipulation, chainable `Transformer` pipelines
342
+ - **Framework**: Deepkit decorator utilities, event handler inheritance
343
+
344
+ ```typescript
345
+ // Distributed mutex
346
+ await withMutex({
347
+ key: 'user:123',
348
+ fn: async () => {
349
+ /* critical section */
350
+ }
351
+ });
352
+
353
+ // Redis cache
354
+ await Cache.setObj('key', data, 3600);
355
+ const data = await Cache.getObj<MyType>('key');
356
+
357
+ // Broadcast
358
+ const channel = createBroadcastChannel<MyEvent>('events');
359
+ channel.subscribe(data => handleEvent(data));
360
+ channel.publish({ type: 'update' });
361
+ ```
362
+
363
+ ## Testing
364
+
365
+ Test facades with per-test database isolation, entity fixtures, and request mocking.
366
+
367
+ ```typescript
368
+ const tf = TestingHelpers.createTestingFacade(app, {
369
+ enableDatabase: true,
370
+ seedData: async facade => {
371
+ await loadEntityFixtures([fixtures.user1, fixtures.user2]);
372
+ }
373
+ });
374
+
375
+ TestingHelpers.installStandardHooks(tf);
376
+
377
+ it('should return user', async () => {
378
+ const res = await makeMockRequest(tf, 'GET', '/api/users/1', {});
379
+ expect(res.statusCode).toBe(200);
380
+ });
381
+ ```
382
+
383
+ ## Types
384
+
385
+ Custom validated types for common patterns:
386
+
387
+ - `DateString` -- MySQL DATE field (`YYYY-MM-DD`)
388
+ - `PhoneNumber` / `PhoneNumberNANP` -- Validated phone numbers via libphonenumber
389
+ - `Coordinate` -- MySQL POINT geometry
390
+ - `EmailAddress` -- Regex-validated email
391
+ - `TrimmedString` / `NonEmptyTrimmedString` -- Auto-trimmed during deserialization
392
+ - `ValidDate` -- Date that rejects `Invalid Date`
393
+
394
+ ## Logging
395
+
396
+ Scoped Pino logger with async context tracking and error reporting.
397
+
398
+ ```typescript
399
+ const logger = createLogger(this); // or createLogger('MyService')
400
+ logger.info('Processing order', { orderId: 123 });
401
+ logger.error('Failed to process', err);
402
+ ```
403
+
404
+ ## CLI Tools
405
+
406
+ | Command | Description |
407
+ | -------------------------------------------- | -------------------------------------------------------- |
408
+ | `dksf-dev <cmd>` | Dev workflow: clean, build, run, migrate, repl, test |
409
+ | `dksf-gen-proto <input> <output>` | Generate TypeScript types from .proto files |
410
+ | `dksf-install` | Postinstall setup (patch-package + deepkit-type-install) |
411
+ | `dksf-update` | Update utility |
412
+ | `repl` | Interactive REPL with access to all providers |
413
+ | `provider:invoke <provider> <method> [args]` | Invoke any provider method from CLI |
414
+ | `worker:start` | Start the job runner (with leader-elected recorder) |
415
+ | `worker:queue <jobName> [data]` | Queue a job by name |
416
+ | `migration:create` | Generate migration from entity/DB schema diff |
417
+ | `migration:run` | Run pending database migrations |
418
+ | `migration:reset` | Reset migrations to a single base migration |
419
+ | `migration:characters [charset] [collation]` | Standardize database character set |
420
+
421
+ ## DevConsole
422
+
423
+ A built-in web dashboard for development-time monitoring and debugging, automatically enabled when `APP_ENV !== 'production'`. Access it at `http://localhost:{PORT}/_devconsole/` — no setup required.
424
+
425
+ Features include an HTTP request inspector, SRPC connection monitor, database entity browser with SQL editor, worker job inspector, Redis mutex monitor, health check viewer, environment config display, OpenAPI schema viewer, and a live REPL with access to the DI container.
426
+
427
+ DevConsole is localhost-only and communicates over SRPC/WebSocket for real-time updates. See [DevConsole](./docs/devconsole.md) for details.
428
+
429
+ A demo app showcasing all features is included:
430
+
431
+ ```bash
432
+ yarn demoapp
433
+ # then open http://localhost:3000/_devconsole/
434
+ ```
435
+
436
+ ## Important Notes
437
+
438
+ - **Timezone**: The server enforces UTC. The entry point throws if `TZ !== UTC`.
439
+ - **Identity Maps**: Disabled by default in database sessions for predictable behavior.
440
+ - **Development Mode**: When `APP_ENV !== 'production'`, DevConsole is enabled at `/_devconsole/`, connection pools are smaller, and the worker runner auto-starts.
441
+
442
+ ## Commands
443
+
444
+ ```bash
445
+ yarn build # Clean build
446
+ yarn build:dirty # Quick rebuild
447
+ yarn dev # Watch mode
448
+ yarn test # Run all tests
449
+ yarn format # Lint with oxlint + format with Prettier
450
+ ```
451
+
452
+ ## Versioning
453
+
454
+ This library uses **calendar versioning** in the format `YY.MMDD.HHmm` (e.g. `25.0214.1830`). Versions are generated automatically from the CI pipeline timestamp. There are no stability guarantees between releases — pin to a specific version if you need predictability.
455
+
456
+ ## License
457
+
458
+ MIT. See [LICENSE](./LICENSE) for details.
@@ -0,0 +1 @@
1
+ .sidebar[data-v-d720e473]{width:200px;background:#161b22;border-right:1px solid #21262d;min-height:100vh;flex-shrink:0;display:flex;flex-direction:column}.sidebar-header[data-v-d720e473]{padding:16px;border-bottom:1px solid #21262d;display:flex;align-items:center;gap:8px}.logo[data-v-d720e473]{font-weight:700;font-size:16px;color:#f0f6fc}.conn-dot[data-v-d720e473]{width:8px;height:8px;border-radius:50%;flex-shrink:0}.conn-on[data-v-d720e473]{background:#3fb950;box-shadow:0 0 4px #3fb95088}.conn-off[data-v-d720e473]{background:#f85149;box-shadow:0 0 4px #f8514988}.nav-list[data-v-d720e473]{list-style:none;padding:8px;flex:1}.nav-list li a[data-v-d720e473]{display:block;padding:8px 12px;border-radius:6px;color:#8b949e;text-decoration:none;font-size:14px}.nav-list li a[data-v-d720e473]:hover{color:#e1e4e8;background:#21262d;text-decoration:none}.nav-list li a.active[data-v-d720e473]{color:#f0f6fc;background:#1f6feb33}.sidebar-status[data-v-d720e473]{padding:12px;border-top:1px solid #21262d;font-size:12px}.status-row[data-v-d720e473]{display:flex;justify-content:space-between;padding:2px 0}.status-label[data-v-d720e473]{color:#484f58}.status-value[data-v-d720e473]{color:#8b949e}*{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;background:#0f1117;color:#e1e4e8;font-size:14px}.app{display:flex;min-height:100vh}.main{flex:1;overflow-x:auto}.view-padding{padding:24px}a{color:#58a6ff;text-decoration:none}a:hover{text-decoration:underline}table{width:100%;border-collapse:collapse}th,td{text-align:left;padding:8px 12px;border-bottom:1px solid #21262d}th{color:#8b949e;font-weight:600;font-size:12px;text-transform:uppercase;letter-spacing:.5px}tr:hover{background:#161b22}pre{background:#161b22;border:1px solid #21262d;border-radius:6px;padding:12px;overflow-x:auto;font-size:13px}code{font-family:SF Mono,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace}.card{background:#161b22;border:1px solid #21262d;border-radius:8px;padding:16px;margin-bottom:16px}.page-title{font-size:20px;font-weight:600;margin-bottom:16px}.badge{display:inline-block;padding:2px 8px;border-radius:12px;font-size:12px;font-weight:600}.badge-green{background:#0d4429;color:#3fb950}.badge-red{background:#490d0d;color:#f85149}.badge-yellow{background:#4a3b0d;color:#d29922}.badge-blue{background:#0d2d4a;color:#58a6ff}.badge-gray{background:#21262d;color:#8b949e}.mono{font-family:SF Mono,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace}.text-muted{color:#8b949e}.loading{color:#8b949e;padding:24px}.error{color:#f85149;padding:24px}.stats-grid[data-v-4cdf1468]{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:16px;margin-bottom:16px}.stat-card[data-v-4cdf1468]{text-align:center}.stat-label[data-v-4cdf1468]{font-size:12px;color:#8b949e;text-transform:uppercase;letter-spacing:.5px;margin-bottom:8px}.stat-value[data-v-4cdf1468]{font-size:24px;font-weight:600;color:#f0f6fc}.stat-detail[data-v-4cdf1468]{font-size:13px;color:#8b949e;margin-top:4px}.section-title[data-v-4cdf1468]{font-size:16px;font-weight:600;margin:16px 0 8px}.info-columns[data-v-4cdf1468]{display:grid;grid-template-columns:1fr 1fr;gap:16px}.db-layout[data-v-5ca2be79]{display:flex;height:100vh}.db-sidebar[data-v-5ca2be79]{width:220px;flex-shrink:0;border-right:1px solid #21262d;overflow-y:auto;background:#0f1117}.sidebar-title[data-v-5ca2be79]{font-size:14px;font-weight:600;color:#8b949e;padding:16px 12px 8px;text-transform:uppercase;letter-spacing:.5px}.entity-list[data-v-5ca2be79]{list-style:none;padding:0 4px}.entity-item[data-v-5ca2be79]{display:flex;flex-direction:column;padding:6px 10px;border-radius:6px;cursor:pointer;margin-bottom:1px}.entity-item[data-v-5ca2be79]:hover{background:#21262d}.entity-active[data-v-5ca2be79]{background:#1f6feb33!important}.entity-name[data-v-5ca2be79]{font-size:13px;color:#e1e4e8;font-weight:500}.entity-table[data-v-5ca2be79]{font-size:11px}.db-main[data-v-5ca2be79]{flex:1;display:flex;flex-direction:column;min-width:0;overflow:hidden}.query-bar[data-v-5ca2be79]{padding:12px 16px;border-bottom:1px solid #21262d;background:#161b22;flex-shrink:0}.query-input[data-v-5ca2be79]{width:100%;background:#0d1117;border:1px solid #30363d;border-radius:6px;color:#e1e4e8;padding:8px 10px;font-size:13px;resize:vertical;outline:none}.query-input[data-v-5ca2be79]:focus{border-color:#58a6ff}.query-actions[data-v-5ca2be79]{display:flex;align-items:center;gap:12px;margin-top:8px}.run-btn[data-v-5ca2be79]{background:#238636;color:#fff;border:none;border-radius:6px;padding:6px 16px;font-size:13px;font-weight:600;cursor:pointer}.run-btn[data-v-5ca2be79]:hover:not(:disabled){background:#2ea043}.run-btn[data-v-5ca2be79]:disabled{opacity:.6;cursor:not-allowed}.query-hint[data-v-5ca2be79]{font-size:12px}.query-error[data-v-5ca2be79]{padding:12px 16px;background:#3d1114;color:#f85149;font-size:13px;font-family:SF Mono,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;white-space:pre-wrap;word-break:break-word}.results-area[data-v-5ca2be79]{flex:1;display:flex;flex-direction:column;min-height:0;overflow:hidden}.results-meta[data-v-5ca2be79]{padding:6px 16px;font-size:12px;border-bottom:1px solid #21262d;flex-shrink:0}.results-table-wrap[data-v-5ca2be79]{flex:1;overflow:auto}.results-table-wrap table[data-v-5ca2be79]{min-width:100%}.results-table-wrap th[data-v-5ca2be79]{text-transform:none}.results-table-wrap td[data-v-5ca2be79]{font-size:13px;white-space:pre-wrap;word-break:break-word;max-width:400px;vertical-align:top}.empty-state[data-v-5ca2be79]{flex:1;display:flex;align-items:center;justify-content:center;font-size:14px}.page-header[data-v-655778ae]{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px}.page-header .page-title[data-v-655778ae]{margin-bottom:0}.btn[data-v-655778ae]{background:#21262d;color:#c9d1d9;border:1px solid #30363d;border-radius:6px;padding:6px 16px;font-size:13px;cursor:pointer}.btn[data-v-655778ae]:hover:not(:disabled){background:#30363d;border-color:#8b949e}.btn[data-v-655778ae]:disabled{opacity:.5;cursor:not-allowed}.section-title[data-v-3c2c86ac]{font-size:14px;font-weight:600;color:#8b949e;margin:20px 0 8px}.section-title[data-v-3c2c86ac]:first-of-type{margin-top:0}.repl-layout[data-v-2e6f5e45]{display:flex;flex-direction:column;height:100vh}.repl-output[data-v-2e6f5e45]{flex:1;overflow-y:auto;padding:16px}.repl-entry[data-v-2e6f5e45]{margin-bottom:12px}.repl-input-line[data-v-2e6f5e45]{display:flex;gap:8px;align-items:flex-start}.repl-prompt[data-v-2e6f5e45]{color:#58a6ff;font-weight:700;font-family:SF Mono,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:13px;flex-shrink:0;line-height:1.5;-webkit-user-select:none;user-select:none}.repl-code[data-v-2e6f5e45]{color:#e1e4e8;font-size:13px;margin:0;background:none;border:none;padding:0;white-space:pre-wrap;word-break:break-word}.repl-result[data-v-2e6f5e45]{color:#8b949e;font-size:13px;margin:2px 0 0 18px;background:none;border:none;padding:0;white-space:pre-wrap;word-break:break-word}.repl-error[data-v-2e6f5e45]{color:#f85149;font-size:13px;margin:2px 0 0 18px;background:none;border:none;padding:0;white-space:pre-wrap;word-break:break-word}.repl-running[data-v-2e6f5e45]{margin-left:18px;font-size:13px}.repl-input-bar[data-v-2e6f5e45]{display:flex;align-items:flex-start;gap:8px;padding:12px 16px;border-top:1px solid #21262d;background:#161b22;flex-shrink:0}.repl-input-wrap[data-v-2e6f5e45]{flex:1;position:relative}.repl-input[data-v-2e6f5e45]{width:100%;background:#0d1117;border:1px solid #30363d;border-radius:6px;color:#e1e4e8;padding:6px 10px;font-size:13px;resize:none;outline:none;line-height:1.5;overflow:hidden}.repl-input[data-v-2e6f5e45]:focus{border-color:#58a6ff}.run-btn[data-v-2e6f5e45]{background:#238636;color:#fff;border:none;border-radius:6px;padding:6px 14px;font-size:13px;font-weight:600;cursor:pointer;flex-shrink:0;align-self:flex-end}.run-btn[data-v-2e6f5e45]:hover:not(:disabled){background:#2ea043}.run-btn[data-v-2e6f5e45]:disabled{opacity:.6;cursor:not-allowed}.ac-popup[data-v-2e6f5e45]{position:absolute;bottom:100%;left:0;margin-bottom:4px;background:#1c2128;border:1px solid #30363d;border-radius:6px;max-height:240px;overflow-y:auto;min-width:220px;max-width:400px;z-index:100;box-shadow:0 4px 12px #0006}.ac-item[data-v-2e6f5e45]{display:flex;align-items:center;gap:8px;padding:4px 10px;cursor:pointer;font-size:13px}.ac-item[data-v-2e6f5e45]:hover{background:#21262d}.ac-selected[data-v-2e6f5e45]{background:#1f6feb44!important}.ac-kind[data-v-2e6f5e45]{width:18px;height:18px;border-radius:3px;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;flex-shrink:0}.ac-kind-method[data-v-2e6f5e45]{background:#3d2d6b;color:#b392f0}.ac-kind-property[data-v-2e6f5e45]{background:#0d3d5e;color:#79c0ff}.ac-kind-accessor[data-v-2e6f5e45]{background:#3d3d0d;color:#d2a822}.ac-kind-global[data-v-2e6f5e45]{background:#1a3d1a;color:#7ee787}.ac-label[data-v-2e6f5e45]{color:#e1e4e8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.json-viewer[data-v-a57320a5]{position:relative}.toggle[data-v-a57320a5]{background:#21262d;border:1px solid #30363d;color:#8b949e;border-radius:4px;padding:4px 8px;font-size:12px;cursor:pointer;margin-bottom:8px}.toggle[data-v-a57320a5]:hover{color:#e1e4e8}.requests-layout[data-v-b0b359e7]{display:flex;flex-direction:column;height:100vh}.requests-list[data-v-b0b359e7]{flex:1;overflow-y:auto;min-height:0;padding:24px}.requests-list.has-detail[data-v-b0b359e7]{flex:1}.clickable-row[data-v-b0b359e7]{cursor:pointer;border-left:2px solid transparent}.clickable-row[data-v-b0b359e7]:hover{background:#1c2128}.selected-row[data-v-b0b359e7]{background:#1c2128!important;border-left-color:#58a6ff}.resize-handle[data-v-b0b359e7]{flex-shrink:0;height:4px;background:#30363d;cursor:row-resize}.resize-handle[data-v-b0b359e7]:hover{background:#58a6ff}.detail-panel[data-v-b0b359e7]{flex-shrink:0;min-height:150px;background:#161b22;display:flex;flex-direction:column}.detail-panel-header[data-v-b0b359e7]{display:flex;align-items:center;justify-content:space-between;padding:8px 16px;border-bottom:1px solid #21262d;background:#1c2128;flex-shrink:0}.detail-panel-title[data-v-b0b359e7]{display:flex;align-items:center;gap:8px;font-size:13px;min-width:0;overflow:hidden;white-space:nowrap}.header-sep[data-v-b0b359e7]{width:1px;height:14px;background:#30363d;flex-shrink:0}.detail-controls[data-v-b0b359e7]{display:flex;align-items:center;gap:12px;flex-shrink:0}.pretty-toggle[data-v-b0b359e7]{display:flex;align-items:center;gap:4px;font-size:12px;color:#8b949e;cursor:pointer;-webkit-user-select:none;user-select:none}.pretty-toggle input[data-v-b0b359e7]{cursor:pointer}.detail-close[data-v-b0b359e7]{background:none;border:none;color:#8b949e;font-size:20px;cursor:pointer;padding:0 4px;line-height:1}.detail-close[data-v-b0b359e7]:hover{color:#e1e4e8}.detail-panel-body[data-v-b0b359e7]{flex:1;overflow:hidden}.detail-split[data-v-b0b359e7]{display:flex;height:100%}.detail-pane[data-v-b0b359e7]{flex:1;min-width:0;overflow-y:auto;padding:12px}.detail-pane+.detail-pane[data-v-b0b359e7]{border-left:1px solid #21262d}.detail-pane pre[data-v-b0b359e7]{margin:0}.detail-error[data-v-b0b359e7]{color:#f85149;font-size:12px;margin:0;white-space:pre-wrap;word-break:break-word}.error-details[data-v-b0b359e7]{margin-top:4px;font-size:12px}.subsection-title[data-v-b0b359e7]{font-size:11px;font-weight:600;color:#8b949e;text-transform:uppercase;letter-spacing:.5px;margin:12px 0 4px}.subsection-title[data-v-b0b359e7]:first-of-type{margin-top:0}.srpc-layout[data-v-ccb881e5]{display:flex;flex-direction:column;height:100vh}.srpc-top[data-v-ccb881e5]{flex:1;overflow-y:auto;min-height:0;padding:24px}.section-title[data-v-ccb881e5]{font-size:16px;font-weight:600;margin:16px 0 8px}.clickable-row[data-v-ccb881e5]{cursor:pointer;border-left:2px solid transparent}.clickable-row[data-v-ccb881e5]:hover{background:#1c2128}.selected-row[data-v-ccb881e5]{background:#1c2128!important;border-left-color:#58a6ff}.resize-handle[data-v-ccb881e5]{flex-shrink:0;height:4px;background:#30363d;cursor:row-resize}.resize-handle[data-v-ccb881e5]:hover{background:#58a6ff}.detail-panel[data-v-ccb881e5]{flex-shrink:0;min-height:150px;background:#161b22;display:flex;flex-direction:column}.detail-panel-header[data-v-ccb881e5]{display:flex;align-items:center;justify-content:space-between;padding:8px 16px;border-bottom:1px solid #21262d;background:#1c2128;flex-shrink:0}.detail-panel-title[data-v-ccb881e5]{display:flex;align-items:center;gap:8px;font-size:13px}.detail-close[data-v-ccb881e5]{background:none;border:none;color:#8b949e;font-size:20px;cursor:pointer;padding:0 4px;line-height:1;flex-shrink:0}.detail-close[data-v-ccb881e5]:hover{color:#e1e4e8}.detail-panel-body[data-v-ccb881e5]{flex:1;overflow:hidden}.messages-and-detail[data-v-ccb881e5]{display:flex;height:100%}.messages-list[data-v-ccb881e5]{width:45%;min-width:300px;overflow-y:auto;border-right:1px solid #21262d}.message-detail[data-v-ccb881e5]{flex:1;min-width:0;overflow-y:auto}.detail-split[data-v-ccb881e5]{display:flex;height:100%}.detail-pane[data-v-ccb881e5]{flex:1;min-width:0;overflow-y:auto;padding:12px}.detail-pane+.detail-pane[data-v-ccb881e5]{border-left:1px solid #21262d}.detail-pane pre[data-v-ccb881e5]{margin:0;font-size:12px}.pane-title[data-v-ccb881e5]{font-size:13px;font-weight:600;margin-bottom:8px;color:#e1e4e8}.msg-meta[data-v-ccb881e5]{display:flex;align-items:center;gap:8px;font-size:12px;margin-bottom:8px}.msg-error[data-v-ccb881e5]{color:#f85149;font-size:13px;margin-bottom:8px}.sortable[data-v-4881b228]{cursor:pointer;-webkit-user-select:none;user-select:none}.sortable[data-v-4881b228]:hover{text-decoration:underline}.sort-indicator[data-v-4881b228]{font-size:.75em}.workers-layout[data-v-4cf93eca]{display:flex;flex-direction:column;height:100vh}.workers-list[data-v-4cf93eca]{flex:1;overflow-y:auto;min-height:0;padding:24px}.workers-list.has-detail[data-v-4cf93eca]{flex:1}.queue-summary[data-v-4cf93eca]{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:16px}.queue-chip[data-v-4cf93eca]{display:flex;align-items:center;gap:8px;background:#161b22;border:1px solid #21262d;border-radius:6px;padding:6px 12px;font-size:13px}.queue-chip-name[data-v-4cf93eca]{font-weight:600;color:#f0f6fc}.queue-chip-stat[data-v-4cf93eca]{color:#8b949e;font-size:12px}.queue-chip-stat strong[data-v-4cf93eca]{color:#e1e4e8}.clickable-row[data-v-4cf93eca]{cursor:pointer;border-left:2px solid transparent}.clickable-row[data-v-4cf93eca]:hover{background:#1c2128}.selected-row[data-v-4cf93eca]{background:#1c2128!important;border-left-color:#58a6ff}.resize-handle[data-v-4cf93eca]{flex-shrink:0;height:4px;background:#30363d;cursor:row-resize}.resize-handle[data-v-4cf93eca]:hover{background:#58a6ff}.detail-panel[data-v-4cf93eca]{flex-shrink:0;min-height:150px;background:#161b22;display:flex;flex-direction:column}.detail-panel-header[data-v-4cf93eca]{display:flex;align-items:center;justify-content:space-between;padding:8px 16px;border-bottom:1px solid #21262d;background:#1c2128;flex-shrink:0}.detail-panel-title[data-v-4cf93eca]{display:flex;align-items:center;gap:8px;font-size:13px;min-width:0;overflow:hidden;white-space:nowrap}.header-sep[data-v-4cf93eca]{width:1px;height:14px;background:#30363d;flex-shrink:0}.detail-close[data-v-4cf93eca]{background:none;border:none;color:#8b949e;font-size:20px;cursor:pointer;padding:0 4px;line-height:1}.detail-close[data-v-4cf93eca]:hover{color:#e1e4e8}.detail-panel-body[data-v-4cf93eca]{flex:1;overflow:hidden}.detail-split[data-v-4cf93eca]{display:flex;height:100%}.detail-pane[data-v-4cf93eca]{flex:1;min-width:0;overflow-y:auto;padding:12px}.detail-pane+.detail-pane[data-v-4cf93eca]{border-left:1px solid #21262d}.detail-pane pre[data-v-4cf93eca]{margin:0}.subsection-title[data-v-4cf93eca]{font-size:11px;font-weight:600;color:#8b949e;text-transform:uppercase;letter-spacing:.5px;margin:12px 0 4px}.subsection-title[data-v-4cf93eca]:first-of-type{margin-top:0}.timestamps-table[data-v-4cf93eca]{font-size:13px}.timestamps-table td[data-v-4cf93eca]{padding:4px 12px 4px 0;border:none}.timestamps-table tr[data-v-4cf93eca]:hover{background:none}.openapi-view[data-v-8a5d400c]{height:100vh;overflow-y:auto}.swagger-container[data-v-8a5d400c]{padding:0 24px 24px}.swagger-container *{margin:revert;padding:revert;box-sizing:revert}.swagger-container .swagger-ui,.swagger-container .swagger-ui div,.swagger-container .swagger-ui section,.swagger-container .swagger-ui header,.swagger-container .swagger-ui span,.swagger-container .swagger-ui small,.swagger-container .swagger-ui td,.swagger-container .swagger-ui th,.swagger-container .swagger-ui tr,.swagger-container .swagger-ui table,.swagger-container .swagger-ui ul,.swagger-container .swagger-ui li,.swagger-container .swagger-ui p,.swagger-container .swagger-ui label,.swagger-container .swagger-ui h1,.swagger-container .swagger-ui h2,.swagger-container .swagger-ui h3,.swagger-container .swagger-ui h4,.swagger-container .swagger-ui h5,.swagger-container .swagger-ui hgroup{background-color:transparent!important;background:transparent!important}.swagger-container .swagger-ui{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif!important;font-size:14px;color:#e1e4e8}.swagger-container .swagger-ui *{border-color:#21262d!important}.swagger-container .swagger-ui svg:not(.opblock-summary-method svg){fill:#8b949e}.swagger-container .swagger-ui a{color:#58a6ff}.swagger-container .swagger-ui .wrapper{padding:0;max-width:none}.swagger-container .swagger-ui .info{margin:20px 0 12px}.swagger-container .swagger-ui .info .title{color:#f0f6fc;font-size:20px;font-weight:600}.swagger-container .swagger-ui .info .title small{background:#21262d!important;color:#8b949e!important;border:none!important;font-size:11px;padding:2px 8px!important;border-radius:12px;font-weight:600;vertical-align:middle;top:0;position:relative}.swagger-container .swagger-ui .info .title small pre{color:#8b949e;padding:0!important;font-family:inherit;font-size:inherit;border:none!important}.swagger-container .swagger-ui .info .base-url{color:#484f58;font-size:12px}.swagger-container .swagger-ui .info p,.swagger-container .swagger-ui .info li,.swagger-container .swagger-ui .info table td,.swagger-container .swagger-ui .info table th,.swagger-container .swagger-ui .info h1,.swagger-container .swagger-ui .info h2,.swagger-container .swagger-ui .info h3,.swagger-container .swagger-ui .info h4{color:#8b949e}.swagger-container .swagger-ui .info a{color:#58a6ff}.swagger-container .swagger-ui .scheme-container{box-shadow:none;padding:12px 0}.swagger-container .swagger-ui .scheme-container label{color:#8b949e;font-size:12px}.swagger-container .swagger-ui .filter-container{margin:0;padding:12px 0}.swagger-container .swagger-ui .filter-container .operation-filter-input{background:#161b22!important;border:1px solid #30363d!important;color:#e1e4e8;border-radius:6px;padding:8px 12px;font-size:13px}.swagger-container .swagger-ui .opblock-tag{color:#e1e4e8;font-size:16px;font-weight:600;padding:12px 0}.swagger-container .swagger-ui .opblock-tag small{color:#484f58;font-size:12px}.swagger-container .swagger-ui .opblock-tag a{color:inherit}.swagger-container .swagger-ui .opblock-tag svg{fill:#484f58}.swagger-container .swagger-ui .opblock{margin:0 0 4px;border-radius:6px;border:1px solid!important;box-shadow:none}.swagger-container .swagger-ui .opblock .opblock-summary{padding:8px 12px}.swagger-container .swagger-ui .opblock .opblock-summary-method{font-size:11px!important;font-weight:700;padding:3px 0!important;min-width:62px;border-radius:12px!important;text-align:center;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.swagger-container .swagger-ui .opblock .opblock-summary-path,.swagger-container .swagger-ui .opblock .opblock-summary-path span,.swagger-container .swagger-ui .opblock .opblock-summary-path a{color:#e1e4e8!important;font-family:SF Mono,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:13px}.swagger-container .swagger-ui .opblock .opblock-summary-description{color:#484f58;font-size:13px}.swagger-container .swagger-ui .opblock .opblock-summary-control svg{fill:#484f58}.swagger-container .swagger-ui .opblock.opblock-get{background:#0d2d4a33!important;border-color:#58a6ff26!important}.swagger-container .swagger-ui .opblock.opblock-get .opblock-summary-method{background:#0d2d4a!important;color:#58a6ff!important}.swagger-container .swagger-ui .opblock.opblock-post{background:#0d442933!important;border-color:#3fb95026!important}.swagger-container .swagger-ui .opblock.opblock-post .opblock-summary-method{background:#0d4429!important;color:#3fb950!important}.swagger-container .swagger-ui .opblock.opblock-put{background:#4a3b0d33!important;border-color:#d2992226!important}.swagger-container .swagger-ui .opblock.opblock-put .opblock-summary-method{background:#4a3b0d!important;color:#d29922!important}.swagger-container .swagger-ui .opblock.opblock-delete{background:#490d0d33!important;border-color:#f8514926!important}.swagger-container .swagger-ui .opblock.opblock-delete .opblock-summary-method{background:#490d0d!important;color:#f85149!important}.swagger-container .swagger-ui .opblock.opblock-patch{background:#2d1a4e33!important;border-color:#a371f726!important}.swagger-container .swagger-ui .opblock.opblock-patch .opblock-summary-method{background:#2d1a4e!important;color:#a371f7!important}.swagger-container .swagger-ui .opblock.opblock-options,.swagger-container .swagger-ui .opblock.opblock-head{background:#21262d33!important;border-color:#21262d!important}.swagger-container .swagger-ui .opblock.opblock-options .opblock-summary-method,.swagger-container .swagger-ui .opblock.opblock-head .opblock-summary-method{background:#21262d!important;color:#8b949e!important}.swagger-container .swagger-ui .opblock.opblock-deprecated{opacity:.6;background:#21262d33!important;border-color:#21262d!important}.swagger-container .swagger-ui .opblock.opblock-deprecated .opblock-summary-method{background:#21262d!important;color:#8b949e!important}.swagger-container .swagger-ui .opblock-section-header{box-shadow:none}.swagger-container .swagger-ui .opblock-section-header h4{color:#e1e4e8;font-size:13px;font-weight:600}.swagger-container .swagger-ui .opblock-section-header label,.swagger-container .swagger-ui .opblock-description-wrapper p,.swagger-container .swagger-ui .opblock-external-docs-wrapper p{color:#8b949e}.swagger-container .swagger-ui pre,.swagger-container .swagger-ui pre.microlight,.swagger-container .swagger-ui .highlight-code .microlight,.swagger-container .swagger-ui .microlight{background:#0d1117!important;color:#e1e4e8!important;border:1px solid #21262d!important;border-radius:6px;padding:12px;font-family:SF Mono,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:12px}.swagger-container .swagger-ui .request-url pre{background:#0d1117!important;color:#e1e4e8!important}.swagger-container .swagger-ui .parameters-col_description p,.swagger-container .swagger-ui table thead tr td,.swagger-container .swagger-ui table thead tr th{color:#8b949e}.swagger-container .swagger-ui .parameter__name{color:#e1e4e8;font-family:SF Mono,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:13px}.swagger-container .swagger-ui .parameter__name.required:after{color:#f85149}.swagger-container .swagger-ui .parameter__type,.swagger-container .swagger-ui .parameter__deprecated,.swagger-container .swagger-ui .parameter__in{color:#484f58;font-size:12px}.swagger-container .swagger-ui input[type=text],.swagger-container .swagger-ui input[type=search],.swagger-container .swagger-ui input[type=email],.swagger-container .swagger-ui input[type=file],.swagger-container .swagger-ui input[type=password],.swagger-container .swagger-ui textarea{background:#0d1117!important;border:1px solid #30363d!important;color:#e1e4e8!important;border-radius:6px;font-family:SF Mono,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:13px}.swagger-container .swagger-ui input:focus,.swagger-container .swagger-ui textarea:focus{border-color:#58a6ff!important;outline:none;box-shadow:0 0 0 2px #58a6ff33}.swagger-container .swagger-ui select{background:#161b22!important;border:1px solid #30363d!important;color:#e1e4e8!important;border-radius:6px;font-size:13px}.swagger-container .swagger-ui .btn{border-radius:6px;font-size:13px;font-weight:600}.swagger-container .swagger-ui .btn.execute{background:#1f6feb!important;border-color:#1f6feb!important;color:#fff!important}.swagger-container .swagger-ui .btn.cancel{background:transparent!important;border:1px solid #f85149!important;color:#f85149!important}.swagger-container .swagger-ui .btn.authorize{border-color:#3fb950!important;color:#3fb950!important}.swagger-container .swagger-ui .btn.authorize svg{fill:#3fb950}.swagger-container .swagger-ui .try-out__btn{border-color:#30363d!important;color:#8b949e!important}.swagger-container .swagger-ui .try-out__btn:hover{color:#e1e4e8!important;border-color:#8b949e!important}.swagger-container .swagger-ui .responses-inner h4,.swagger-container .swagger-ui .responses-inner h5{color:#e1e4e8;font-size:13px}.swagger-container .swagger-ui .response-col_status{color:#e1e4e8;font-family:SF Mono,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:13px}.swagger-container .swagger-ui .response-col_description,.swagger-container .swagger-ui .response-col_description__inner p,.swagger-container .swagger-ui .response-col_links{color:#8b949e}.swagger-container .swagger-ui .tab li{color:#484f58}.swagger-container .swagger-ui .tab li:hover{color:#8b949e}.swagger-container .swagger-ui .tab li.active{color:#e1e4e8}.swagger-container .swagger-ui section.models{border:1px solid #21262d!important;border-radius:8px;background:#161b22!important;margin-top:16px}.swagger-container .swagger-ui section.models h4{color:#e1e4e8;font-size:14px;font-weight:600}.swagger-container .swagger-ui section.models h4 svg{fill:#484f58}.swagger-container .swagger-ui section.models .model-container{margin:0}.swagger-container .swagger-ui .model{color:#8b949e}.swagger-container .swagger-ui .model-title,.swagger-container .swagger-ui span.model-title__text{color:#e1e4e8;font-family:SF Mono,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:13px}.swagger-container .swagger-ui .model .property{color:#e1e4e8}.swagger-container .swagger-ui .model .property.primitive{color:#58a6ff}.swagger-container .swagger-ui .model-toggle:after{filter:invert(.6)}.swagger-container .swagger-ui .markdown p,.swagger-container .swagger-ui .markdown li,.swagger-container .swagger-ui .renderedMarkdown p{color:#8b949e}.swagger-container .swagger-ui .markdown code,.swagger-container .swagger-ui .renderedMarkdown code{background:#0d1117!important;color:#e1e4e8;border-radius:4px;padding:2px 6px;font-size:12px;font-family:SF Mono,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace}.swagger-container .swagger-ui .dialog-ux .modal-ux{background:#161b22!important;border:1px solid #30363d!important;border-radius:8px;box-shadow:0 16px 48px #0006}.swagger-container .swagger-ui .dialog-ux .modal-ux-header h3{color:#e1e4e8}.swagger-container .swagger-ui .dialog-ux .modal-ux-content p,.swagger-container .swagger-ui .dialog-ux .modal-ux-content label{color:#8b949e}.swagger-container .swagger-ui .dialog-ux .modal-ux-content h4{color:#e1e4e8}.swagger-container .swagger-ui .dialog-ux .backdrop-ux{background:#0009!important}.swagger-container .swagger-ui .copy-to-clipboard{background:#21262d!important;border-radius:6px}.swagger-container .swagger-ui .opblock-body p,.swagger-container .swagger-ui .opblock-body small,.swagger-container .swagger-ui .opblock-body label{color:#8b949e}.swagger-container .swagger-ui .loading-container .loading:after{color:#8b949e}.swagger-container .swagger-ui svg.arrow{fill:#484f58}.openapi-view::-webkit-scrollbar{width:8px}.openapi-view::-webkit-scrollbar-track{background:transparent}.openapi-view::-webkit-scrollbar-thumb{background:#30363d;border-radius:4px}.openapi-view::-webkit-scrollbar-thumb:hover{background:#484f58}