akanjs 3.0.0-beta.17 → 3.0.0-beta.19

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 (327) hide show
  1. package/base/base.ts +1 -1
  2. package/base/baseEnv.ts +12 -3
  3. package/base/databaseModes.ts +76 -0
  4. package/base/index.ts +1 -0
  5. package/base/primitiveRegistry.ts +27 -7
  6. package/client/csrTypes.ts +1 -31
  7. package/client/frameConfig.ts +2 -2
  8. package/client/route/RootLayoutDefinition.ts +0 -6
  9. package/client/route/RouteDefinition.ts +1 -13
  10. package/common/CodeTranscript.ts +13 -2
  11. package/common/codeAgentProfile.ts +36 -0
  12. package/common/codeAgentWire.ts +17 -3
  13. package/common/index.ts +3 -0
  14. package/common/routeConvention.ts +0 -3
  15. package/constant/constantRegistry.ts +8 -11
  16. package/constant/getDefault.ts +21 -2
  17. package/constant/mask.ts +35 -3
  18. package/dictionary/agent.dictionary.ts +9 -0
  19. package/dictionary/base.dictionary.ts +5 -0
  20. package/document/dataLoader.ts +48 -15
  21. package/document/database.ts +39 -3
  22. package/document/loaderInfo.ts +28 -7
  23. package/document/queryEvaluator.ts +10 -1
  24. package/fetch/client/fetchClient.ts +14 -12
  25. package/fetch/client/httpClient.ts +1 -1
  26. package/index.ts +10 -1
  27. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0001.log +44 -0
  28. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0002.log +42 -0
  29. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0003.log +43 -0
  30. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0004.log +44 -0
  31. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0005.log +50 -0
  32. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0006.log +46 -0
  33. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0007.log +46 -0
  34. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0008.log +47 -0
  35. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0009.log +47 -0
  36. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0010.log +6 -0
  37. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0011.log +14 -0
  38. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0012.log +6 -0
  39. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0013.log +35 -0
  40. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0014.log +46 -0
  41. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0015.log +46 -0
  42. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0016.log +47 -0
  43. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0017.log +47 -0
  44. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0018.log +46 -0
  45. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0019.log +46 -0
  46. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0020.log +47 -0
  47. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0021.log +47 -0
  48. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0022.log +46 -0
  49. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0023.log +46 -0
  50. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0024.log +46 -0
  51. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0025.log +46 -0
  52. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0026.log +46 -0
  53. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0027.log +46 -0
  54. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0028.log +46 -0
  55. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0029.log +46 -0
  56. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0030.log +46 -0
  57. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0031.log +46 -0
  58. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0032.log +46 -0
  59. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0033.log +46 -0
  60. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0034.log +46 -0
  61. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0035.log +46 -0
  62. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0036.log +46 -0
  63. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0037.log +46 -0
  64. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0038.log +46 -0
  65. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0039.log +46 -0
  66. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0040.log +46 -0
  67. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0041.log +46 -0
  68. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0042.log +46 -0
  69. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0043.log +46 -0
  70. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0044.log +46 -0
  71. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0045.log +46 -0
  72. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0046.log +46 -0
  73. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0047.log +46 -0
  74. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0048.log +46 -0
  75. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0049.log +46 -0
  76. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0050.log +46 -0
  77. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0051.log +46 -0
  78. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0052.log +46 -0
  79. package/local/apps/crossTest/runtime/logs/crossTest-testing-local-2026-09-25-all-0053.log +46 -0
  80. package/local/apps/serverLifecycle/serverLifecycle-local.db-shm +0 -0
  81. package/local/apps/serverLifecycle/serverLifecycle-local_solid.db-shm +0 -0
  82. package/package.json +2 -1
  83. package/server/akanApp.ts +28 -1
  84. package/server/akanOption.ts +22 -1
  85. package/server/akanServer.ts +39 -5
  86. package/server/artifact/builderRpc.ts +7 -2
  87. package/server/artifact/ipcTypes.ts +1 -0
  88. package/server/artifact/routeClientCache.ts +5 -1
  89. package/server/console.ts +9 -9
  90. package/server/decorators.ts +3 -64
  91. package/server/devtools/depsSerializer.ts +1 -4
  92. package/server/di/diLifecycle.ts +32 -6
  93. package/server/di/predefinedAdaptor.ts +13 -3
  94. package/server/head.tsx +60 -0
  95. package/server/hmr/devHmrController.ts +8 -1
  96. package/server/imageOptimizer.ts +3 -1
  97. package/server/mcp/McpDispatcher.ts +7 -5
  98. package/server/mcp/McpRateLimiter.ts +67 -21
  99. package/server/mcp/McpRouter.ts +14 -8
  100. package/server/mcp/PagePromptComposer.ts +6 -2
  101. package/server/ops/ageEncryption.ts +322 -0
  102. package/server/ops/appInfo.ts +92 -0
  103. package/server/ops/opsCommand.ts +120 -0
  104. package/server/ops/opsRoute.ts +155 -0
  105. package/server/ops/opsToken.ts +97 -0
  106. package/server/ops/snapshotJobs.ts +137 -0
  107. package/server/ops/snapshotRestore.ts +127 -0
  108. package/server/ops/snapshotTypes.ts +54 -0
  109. package/server/ops/sqliteFiles.ts +43 -0
  110. package/server/ops/sqliteSnapshot.ts +153 -0
  111. package/server/resolver/database.resolver.ts +29 -26
  112. package/server/resolver/signal.resolver.ts +49 -10
  113. package/server/routeElementComposer.tsx +3 -3
  114. package/server/routeTreeBuilder.ts +1 -24
  115. package/server/routing/soloAppRoutes.ts +5 -0
  116. package/server/rscWorker.tsx +10 -21
  117. package/server/rscWorkerHost.ts +9 -1
  118. package/server/webRouter.ts +23 -11
  119. package/service/agent.service.ts +8 -1
  120. package/service/injectInfo.ts +105 -73
  121. package/service/ipcTypes.ts +3 -0
  122. package/service/predefinedAdaptor/anthropicLlm.ts +36 -10
  123. package/service/predefinedAdaptor/cache.adaptor.ts +260 -74
  124. package/service/predefinedAdaptor/database.adaptor.ts +357 -74
  125. package/service/predefinedAdaptor/documentTransfer.ts +91 -0
  126. package/service/predefinedAdaptor/index.ts +2 -0
  127. package/service/predefinedAdaptor/insightQuery.ts +113 -43
  128. package/service/predefinedAdaptor/llm.adaptor.ts +33 -0
  129. package/service/predefinedAdaptor/llmOverflow.ts +73 -0
  130. package/service/predefinedAdaptor/openaiDialect.ts +23 -2
  131. package/service/predefinedAdaptor/openaiLlm.ts +11 -17
  132. package/service/predefinedAdaptor/queue.adaptor.ts +40 -21
  133. package/service/predefinedAdaptor/schedule.adaptor.ts +69 -8
  134. package/service/predefinedAdaptor/searchIndex.ts +63 -288
  135. package/service/predefinedAdaptor/solidCache.adaptor.ts +135 -12
  136. package/service/predefinedAdaptor/solidPubsub.adaptor.ts +27 -12
  137. package/service/predefinedAdaptor/solidQueue.adaptor.ts +66 -10
  138. package/service/predefinedAdaptor/solidSqlite.ts +8 -2
  139. package/service/predefinedAdaptor/sql/PostgresInsightSession.ts +116 -0
  140. package/service/predefinedAdaptor/sql/QueryCompiler.ts +47 -19
  141. package/service/predefinedAdaptor/sql/SqlDocumentStore.ts +256 -60
  142. package/service/predefinedAdaptor/sql/SqliteInsightSession.ts +89 -0
  143. package/service/predefinedAdaptor/sql/dialect/postgres.ts +139 -51
  144. package/service/predefinedAdaptor/sql/dialect/sqlite.ts +17 -13
  145. package/service/predefinedAdaptor/sql/driver/bunSqlite.ts +29 -4
  146. package/service/predefinedAdaptor/sql/driver/libsql.ts +26 -12
  147. package/service/predefinedAdaptor/sql/driver/postgres.ts +13 -7
  148. package/service/predefinedAdaptor/sql/search/fts5.ts +260 -0
  149. package/service/predefinedAdaptor/sql/search/mirror.ts +76 -0
  150. package/service/predefinedAdaptor/sql/search/postgres.ts +455 -0
  151. package/service/predefinedAdaptor/sql/search/types.ts +54 -0
  152. package/service/predefinedAdaptor/sql/types.ts +79 -16
  153. package/service/predefinedAdaptor/sql/values.ts +14 -1
  154. package/service/predefinedAdaptor/storage.adaptor.ts +22 -6
  155. package/service/predefinedAdaptor/websocket.adaptor.ts +157 -168
  156. package/signal/agent.signal.ts +8 -4
  157. package/signal/agentMeter.ts +49 -0
  158. package/signal/agentTurnStream.ts +18 -7
  159. package/signal/endpointCache.ts +75 -0
  160. package/signal/guard.ts +4 -3
  161. package/signal/index.ts +1 -0
  162. package/signal/internal.ts +2 -2
  163. package/signal/internalArg.ts +7 -0
  164. package/signal/mcp/McpDocument.ts +1 -1
  165. package/signal/middleware.ts +0 -77
  166. package/signal/schema/JsonSchemaBuilder.ts +27 -4
  167. package/signal/signalContext.ts +17 -16
  168. package/signal/types.ts +10 -5
  169. package/store/agent/index.ts +1 -1
  170. package/store/agentic/AgentValue.ts +9 -6
  171. package/store/agentic/formFields.ts +3 -0
  172. package/test/conformance.ts +313 -0
  173. package/test/index.ts +1 -0
  174. package/test/sampleOf.ts +19 -2
  175. package/test/signalTestRuntime.ts +2 -2
  176. package/test/testServer.ts +64 -12
  177. package/types/base/baseEnv.d.ts +2 -2
  178. package/types/base/databaseModes.d.ts +29 -0
  179. package/types/base/index.d.ts +1 -0
  180. package/types/base/primitiveRegistry.d.ts +21 -4
  181. package/types/client/csrTypes.d.ts +1 -31
  182. package/types/client/route/RootLayoutDefinition.d.ts +0 -1
  183. package/types/client/route/RouteDefinition.d.ts +1 -3
  184. package/types/common/codeAgentProfile.d.ts +37 -0
  185. package/types/common/codeAgentWire.d.ts +11 -1
  186. package/types/common/index.d.ts +1 -1
  187. package/types/constant/constantRegistry.d.ts +2 -2
  188. package/types/constant/getDefault.d.ts +10 -1
  189. package/types/constant/mask.d.ts +10 -1
  190. package/types/dictionary/agent.dictionary.d.ts +1 -1
  191. package/types/dictionary/base.dictionary.d.ts +1 -1
  192. package/types/dictionary/dictionary.d.ts +9 -9
  193. package/types/document/dataLoader.d.ts +6 -1
  194. package/types/document/database.d.ts +15 -3
  195. package/types/document/loaderInfo.d.ts +9 -4
  196. package/types/index.d.ts +9 -1
  197. package/types/server/akanOption.d.ts +10 -1
  198. package/types/server/artifact/builderRpc.d.ts +2 -1
  199. package/types/server/artifact/ipcTypes.d.ts +1 -0
  200. package/types/server/console.d.ts +1 -1
  201. package/types/server/decorators.d.ts +1 -8
  202. package/types/server/di/predefinedAdaptor.d.ts +5 -0
  203. package/types/server/head.d.ts +10 -0
  204. package/types/server/mcp/McpRateLimiter.d.ts +15 -5
  205. package/types/server/mcp/McpRouter.d.ts +1 -1
  206. package/types/server/ops/ageEncryption.d.ts +24 -0
  207. package/types/server/ops/appInfo.d.ts +36 -0
  208. package/types/server/ops/opsCommand.d.ts +9 -0
  209. package/types/server/ops/opsRoute.d.ts +28 -0
  210. package/types/server/ops/opsToken.d.ts +30 -0
  211. package/types/server/ops/snapshotJobs.d.ts +25 -0
  212. package/types/server/ops/snapshotRestore.d.ts +24 -0
  213. package/types/server/ops/snapshotTypes.d.ts +46 -0
  214. package/types/server/ops/sqliteFiles.d.ts +10 -0
  215. package/types/server/ops/sqliteSnapshot.d.ts +31 -0
  216. package/types/server/resolver/signal.resolver.d.ts +5 -0
  217. package/types/server/routeElementComposer.d.ts +1 -1
  218. package/types/server/routing/soloAppRoutes.d.ts +2 -1
  219. package/types/server/rscWorkerHost.d.ts +3 -1
  220. package/types/service/agent.service.d.ts +3 -0
  221. package/types/service/injectInfo.d.ts +26 -14
  222. package/types/service/ipcTypes.d.ts +6 -0
  223. package/types/service/predefinedAdaptor/anthropicLlm.d.ts +10 -1
  224. package/types/service/predefinedAdaptor/cache.adaptor.d.ts +46 -12
  225. package/types/service/predefinedAdaptor/database.adaptor.d.ts +20 -3
  226. package/types/service/predefinedAdaptor/documentTransfer.d.ts +17 -0
  227. package/types/service/predefinedAdaptor/index.d.ts +2 -0
  228. package/types/service/predefinedAdaptor/insightQuery.d.ts +14 -12
  229. package/types/service/predefinedAdaptor/llm.adaptor.d.ts +31 -0
  230. package/types/service/predefinedAdaptor/llmOverflow.d.ts +26 -0
  231. package/types/service/predefinedAdaptor/openaiDialect.d.ts +14 -1
  232. package/types/service/predefinedAdaptor/openaiLlm.d.ts +3 -1
  233. package/types/service/predefinedAdaptor/queue.adaptor.d.ts +12 -7
  234. package/types/service/predefinedAdaptor/schedule.adaptor.d.ts +7 -2
  235. package/types/service/predefinedAdaptor/searchIndex.d.ts +12 -25
  236. package/types/service/predefinedAdaptor/solidCache.adaptor.d.ts +15 -6
  237. package/types/service/predefinedAdaptor/solidPubsub.adaptor.d.ts +6 -4
  238. package/types/service/predefinedAdaptor/solidSqlite.d.ts +1 -0
  239. package/types/service/predefinedAdaptor/sql/PostgresInsightSession.d.ts +23 -0
  240. package/types/service/predefinedAdaptor/sql/QueryCompiler.d.ts +7 -3
  241. package/types/service/predefinedAdaptor/sql/SqlDocumentStore.d.ts +11 -2
  242. package/types/service/predefinedAdaptor/sql/SqliteInsightSession.d.ts +19 -0
  243. package/types/service/predefinedAdaptor/sql/dialect/postgres.d.ts +20 -10
  244. package/types/service/predefinedAdaptor/sql/dialect/sqlite.d.ts +5 -2
  245. package/types/service/predefinedAdaptor/sql/driver/bunSqlite.d.ts +9 -3
  246. package/types/service/predefinedAdaptor/sql/driver/libsql.d.ts +9 -5
  247. package/types/service/predefinedAdaptor/sql/driver/postgres.d.ts +4 -4
  248. package/types/service/predefinedAdaptor/sql/search/fts5.d.ts +33 -0
  249. package/types/service/predefinedAdaptor/sql/search/mirror.d.ts +20 -0
  250. package/types/service/predefinedAdaptor/sql/search/postgres.d.ts +54 -0
  251. package/types/service/predefinedAdaptor/sql/search/types.d.ts +49 -0
  252. package/types/service/predefinedAdaptor/sql/types.d.ts +73 -15
  253. package/types/service/predefinedAdaptor/sql/values.d.ts +3 -0
  254. package/types/service/predefinedAdaptor/storage.adaptor.d.ts +7 -2
  255. package/types/service/predefinedAdaptor/websocket.adaptor.d.ts +29 -13
  256. package/types/signal/agent.signal.d.ts +4 -1
  257. package/types/signal/agentMeter.d.ts +28 -0
  258. package/types/signal/agentTurnStream.d.ts +6 -1
  259. package/types/signal/endpointCache.d.ts +19 -0
  260. package/types/signal/guard.d.ts +4 -3
  261. package/types/signal/index.d.ts +1 -0
  262. package/types/signal/internalArg.d.ts +4 -0
  263. package/types/signal/middleware.d.ts +0 -20
  264. package/types/signal/schema/JsonSchemaBuilder.d.ts +11 -2
  265. package/types/signal/signalContext.d.ts +1 -6
  266. package/types/signal/types.d.ts +10 -5
  267. package/types/store/agent/index.d.ts +1 -1
  268. package/types/store/agentic/AgentValue.d.ts +3 -3
  269. package/types/test/conformance.d.ts +87 -0
  270. package/types/test/index.d.ts +1 -0
  271. package/types/test/sampleOf.d.ts +1 -1
  272. package/types/test/signalTestRuntime.d.ts +1 -1
  273. package/types/test/testServer.d.ts +4 -3
  274. package/types/ui/Agent/Chat.d.ts +4 -2
  275. package/types/ui/Agent/Menu.d.ts +2 -2
  276. package/types/ui/Button.d.ts +1 -1
  277. package/types/ui/CsrImage.d.ts +2 -1
  278. package/types/ui/Data/Item.d.ts +1 -1
  279. package/types/ui/Link/CsrLink.d.ts +1 -1
  280. package/types/ui/Link/types.d.ts +2 -0
  281. package/types/ui/System/CSR.d.ts +2 -2
  282. package/types/ui/System/Client.d.ts +2 -3
  283. package/types/ui/System/Common.d.ts +0 -2
  284. package/types/ui/System/SSR.d.ts +2 -2
  285. package/types/ui/recipe/inputRecipe.d.ts +1 -1
  286. package/types/vendor/use-agentic/AgentProgress.d.ts +12 -0
  287. package/types/vendor/use-agentic/AgentSession.d.ts +11 -1
  288. package/types/vendor/use-agentic/Compaction.d.ts +42 -5
  289. package/types/vendor/use-agentic/Transcript.d.ts +2 -0
  290. package/types/vendor/use-agentic/types.d.ts +29 -0
  291. package/ui/Agent/Bubble.tsx +47 -1
  292. package/ui/Agent/Chat.tsx +15 -6
  293. package/ui/Agent/Menu.tsx +2 -2
  294. package/ui/Agent/fetchRunner.ts +2 -1
  295. package/ui/Button.tsx +1 -1
  296. package/ui/Constant/Doc.tsx +121 -77
  297. package/ui/Constant/Graph.tsx +11 -3
  298. package/ui/CsrImage.tsx +9 -5
  299. package/ui/Data/Item.tsx +1 -1
  300. package/ui/Field/Choice.tsx +1 -1
  301. package/ui/Field/Collection.tsx +4 -3
  302. package/ui/Image.tsx +9 -10
  303. package/ui/Link/CsrLink.tsx +5 -1
  304. package/ui/Link/types.ts +2 -0
  305. package/ui/Portal.tsx +2 -3
  306. package/ui/Refresh.tsx +1 -3
  307. package/ui/ScreenNavigator.tsx +6 -4
  308. package/ui/System/CSR.tsx +1 -9
  309. package/ui/System/Client.tsx +2 -4
  310. package/ui/System/Common.tsx +0 -2
  311. package/ui/System/SSR.tsx +9 -14
  312. package/ui/recipe/inputRecipe.ts +1 -1
  313. package/vendor/use-agentic/AgentProgress.ts +13 -1
  314. package/vendor/use-agentic/AgentSession.ts +119 -27
  315. package/vendor/use-agentic/Compaction.ts +82 -8
  316. package/vendor/use-agentic/Transcript.ts +6 -1
  317. package/vendor/use-agentic/WIRE.md +16 -2
  318. package/vendor/use-agentic/httpRunner.ts +19 -4
  319. package/vendor/use-agentic/types.ts +33 -2
  320. package/webkit/bootCsr.tsx +0 -12
  321. package/webkit/useCamera.tsx +4 -3
  322. package/webkit/useCsrValues.ts +3 -3
  323. package/webkit/useFetch.ts +6 -7
  324. package/server/metadata.tsx +0 -198
  325. package/types/server/metadata.d.ts +0 -22
  326. package/types/ui/System/Gtag.d.ts +0 -4
  327. package/ui/System/Gtag.tsx +0 -69
package/constant/mask.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { FIELD_META } from "akanjs/base";
1
+ import { type Cls, FIELD_META, getNonArrayModel, type PrimitiveAgentFace, PrimitiveRegistry } from "akanjs/base";
2
2
 
3
3
  /**
4
4
  * A model as masking reads it — the constructor, for the field metadata it carries at runtime.
@@ -14,7 +14,10 @@ export interface MaskModel {
14
14
  interface MaskField {
15
15
  fieldType?: string;
16
16
  isClass?: boolean;
17
+ isMap?: boolean;
17
18
  modelRef?: MaskModel;
19
+ of?: unknown;
20
+ arrDepth?: number;
18
21
  visual?: boolean;
19
22
  }
20
23
 
@@ -40,7 +43,8 @@ export const leakingFieldsOf = (model: MaskModel, value: Record<string, unknown>
40
43
  /**
41
44
  * Strips what a model marks `hidden`, `secret`, or `visual`, by the model the caller names rather than by the one
42
45
  * the value happens to still carry. The first two are secrecy and the third is cost, but the answer is the same
43
- * one — leave the field out — and this is the only place every AI-facing read already passes through.
46
+ * one — leave the field out — and this is the only place every AI-facing read already passes through. For the same
47
+ * reason it is where a primitive declaring an agent face is read into that face (`agentRead`).
44
48
  *
45
49
  * That distinction is the whole point. A check that reads the class off the value can only mask what arrives as an
46
50
  * instance, so a `{ ...doc }` spread, a `toJSON()`, an `immerify()`, or a round-trip through `JSON.stringify` reaches
@@ -61,11 +65,39 @@ export const mask = (model: MaskModel, value: unknown): unknown => {
61
65
  const masked: Record<string, unknown> = {};
62
66
  for (const [key, field] of Object.entries(fields)) {
63
67
  if (field.fieldType === "hidden" || field.fieldType === "secret" || field.visual || !(key in source)) continue;
64
- masked[key] = field.isClass && field.modelRef ? mask(field.modelRef, source[key]) : source[key];
68
+ masked[key] = maskField(field, source[key]);
65
69
  }
66
70
  return masked;
67
71
  };
68
72
 
73
+ /**
74
+ * What an agent reads of a primitive value: the primitive's `agent.read` when it declares an agent face, the value
75
+ * untouched otherwise. The read is applied through `arrDepth` levels of array, the way a field declares them.
76
+ */
77
+ export const agentRead = (modelRef: unknown, value: unknown, arrDepth = 0): unknown => {
78
+ const face = PrimitiveRegistry.agentOf(modelRef);
79
+ return face ? readThrough(face, value, arrDepth) : value;
80
+ };
81
+
82
+ const readThrough = (face: PrimitiveAgentFace, value: unknown, arrDepth: number): unknown => {
83
+ if (value === null || value === undefined) return value;
84
+ if (arrDepth > 0 && Array.isArray(value)) return value.map((item) => readThrough(face, item, arrDepth - 1));
85
+ return face.read(value);
86
+ };
87
+
88
+ const maskField = (field: MaskField, value: unknown): unknown => {
89
+ if (field.isClass && field.modelRef) return mask(field.modelRef, value);
90
+ if (field.isMap) return maskMapValues(field.of, value);
91
+ return agentRead(field.modelRef, value, field.arrDepth ?? 0);
92
+ };
93
+
94
+ const maskMapValues = (of: unknown, value: unknown): unknown => {
95
+ const [valueRef, arrDepth] = getNonArrayModel(of as Cls);
96
+ if (!PrimitiveRegistry.agentOf(valueRef) || value === null || typeof value !== "object") return value;
97
+ const entries = value instanceof Map ? [...value.entries()] : Object.entries(value);
98
+ return Object.fromEntries(entries.map(([key, item]) => [key, agentRead(valueRef, item, arrDepth)]));
99
+ };
100
+
69
101
  /**
70
102
  * Drops what a model marks `hidden` or `secret`, and nothing else.
71
103
  *
@@ -29,4 +29,13 @@ export const agentDictionary = serviceDictionary(["en", "ko"])
29
29
  "{provider} refused this turn with status {status}. Reason: {reason}",
30
30
  "{provider}가 이번 턴을 거절했습니다 (status {status}). 사유: {reason}",
31
31
  ],
32
+
33
+ contextOverflow: [
34
+ "This conversation no longer fits the model's context window at {provider}. Use /compact to summarize it, or /new to start over",
35
+ "대화가 {provider} 모델의 컨텍스트 창을 넘었습니다. /compact로 요약하거나 /new로 새로 시작할 수 있습니다.",
36
+ ],
37
+ quotaExceeded: [
38
+ "The agent's usage limit for this account has been reached",
39
+ "이 계정의 에이전트 사용 한도에 도달했습니다.",
40
+ ],
32
41
  });
@@ -109,6 +109,11 @@ export const baseDictionary = serviceDictionary(["en", "ko"])
109
109
  agentToolRunning: ["Running", "실행 중"],
110
110
  agentToolResult: ["Show what this tool returned", "이 툴이 반환한 값 보기"],
111
111
  agentTokens: ["~{count} tokens", "약 {count} 토큰"],
112
+ agentTokensOf: ["~{count} / {limit} tokens", "약 {count} / {limit} 토큰"],
113
+ agentCompactsAt: [
114
+ "The conversation summarizes itself past {limit} tokens",
115
+ "{limit} 토큰을 넘으면 대화를 스스로 요약합니다",
116
+ ],
112
117
  agentSummarizing: ["Summarizing the conversation…", "대화를 요약하는 중…"],
113
118
  agentContinue: ["This is taking a while. Keep going?", "시간이 걸리고 있습니다. 계속할까요?"],
114
119
  agentKeepGoing: ["Keep going", "계속하기"],
@@ -11,7 +11,12 @@ type BatchLoadFn<Key, Value> = (
11
11
  ) => PromiseLike<ReadonlyArray<Value | Error>> | ReadonlyArray<Value | Error>;
12
12
 
13
13
  interface DataLoaderOptions<Key, CacheKey> {
14
- cache?: boolean;
14
+ /**
15
+ * How long a loaded key is answered from memory: `false` (the default) remembers nothing past its own batch,
16
+ * a number keeps each key for that many milliseconds, and `true` keeps it for the life of the loader. A model's
17
+ * loaders live as long as the process, so anything but `false` serves a stale document after it changes.
18
+ */
19
+ cache?: boolean | number;
15
20
  cacheKeyFn?: (key: Key) => CacheKey;
16
21
  batch?: boolean;
17
22
  batchScheduleFn?: (callback: () => void) => void;
@@ -27,20 +32,27 @@ interface BatchItem<Key, Value> {
27
32
 
28
33
  /** Minimal DataLoader-compatible batch loader used by Akan document resolvers. */
29
34
  export class DataLoader<Key, Value, CacheKey = Key> {
35
+ static readonly #minSweepSize = 1024;
30
36
  readonly name?: string;
31
37
  readonly #batchLoadFn: BatchLoadFn<Key, Value>;
32
- readonly #cache: boolean;
38
+ readonly #ttl: number;
33
39
  readonly #cacheKeyFn: (key: Key) => CacheKey;
34
40
  readonly #batch: boolean;
35
41
  readonly #batchScheduleFn: (callback: () => void) => void;
36
42
  readonly #maxBatchSize: number;
37
- readonly #promiseCache = new Map<CacheKey, Promise<Value>>();
43
+ readonly #promiseCache = new Map<CacheKey, { promise: Promise<Value>; expiresAt: number }>();
44
+ #sweepAt = DataLoader.#minSweepSize;
38
45
  #queue: BatchItem<Key, Value>[] = [];
39
46
  #scheduled = false;
40
47
 
41
48
  constructor(batchLoadFn: BatchLoadFn<Key, Value>, options: DataLoaderOptions<Key, CacheKey> = {}) {
42
49
  this.#batchLoadFn = batchLoadFn;
43
- this.#cache = options.cache !== false;
50
+ this.#ttl =
51
+ options.cache === true
52
+ ? Number.POSITIVE_INFINITY
53
+ : typeof options.cache === "number" && options.cache > 0
54
+ ? options.cache
55
+ : 0;
44
56
  this.#cacheKeyFn = options.cacheKeyFn ?? ((key) => key as unknown as CacheKey);
45
57
  this.#batch = options.batch !== false;
46
58
  this.#batchScheduleFn = options.batchScheduleFn ?? ((callback) => queueMicrotask(callback));
@@ -50,17 +62,21 @@ export class DataLoader<Key, Value, CacheKey = Key> {
50
62
 
51
63
  load(key: Key): Promise<Value> {
52
64
  const cacheKey = this.#cacheKeyFn(key);
53
- if (this.#cache) {
54
- const cached = this.#promiseCache.get(cacheKey);
55
- if (cached) return cached;
56
- }
65
+ const cached = this.#cached(cacheKey);
66
+ if (cached) return cached;
57
67
 
58
68
  const promise = new Promise<Value>((resolve, reject) => {
59
69
  this.#queue.push({ key, resolve, reject });
60
70
  if (this.#batch) this.#schedule();
61
71
  else this.#dispatch();
62
72
  });
63
- if (this.#cache) this.#promiseCache.set(cacheKey, promise);
73
+ if (this.#ttl > 0) {
74
+ this.#remember(cacheKey, promise);
75
+
76
+ promise.catch(() => {
77
+ if (this.#promiseCache.get(cacheKey)?.promise === promise) this.#promiseCache.delete(cacheKey);
78
+ });
79
+ }
64
80
  return promise;
65
81
  }
66
82
 
@@ -80,13 +96,30 @@ export class DataLoader<Key, Value, CacheKey = Key> {
80
96
  }
81
97
 
82
98
  prime(key: Key, value: Value | Error): this {
83
- if (!this.#cache) return this;
99
+ if (this.#ttl <= 0) return this;
84
100
  const cacheKey = this.#cacheKeyFn(key);
85
- if (this.#promiseCache.has(cacheKey)) return this;
86
- this.#promiseCache.set(cacheKey, value instanceof Error ? Promise.reject(value) : Promise.resolve(value));
101
+ if (this.#cached(cacheKey)) return this;
102
+ this.#remember(cacheKey, value instanceof Error ? Promise.reject(value) : Promise.resolve(value));
87
103
  return this;
88
104
  }
89
105
 
106
+ #cached(cacheKey: CacheKey): Promise<Value> | undefined {
107
+ if (this.#ttl <= 0) return undefined;
108
+ const entry = this.#promiseCache.get(cacheKey);
109
+ if (!entry) return undefined;
110
+ if (entry.expiresAt > Date.now()) return entry.promise;
111
+ this.#promiseCache.delete(cacheKey);
112
+ return undefined;
113
+ }
114
+
115
+ #remember(cacheKey: CacheKey, promise: Promise<Value>) {
116
+ this.#promiseCache.set(cacheKey, { promise, expiresAt: Date.now() + this.#ttl });
117
+ if (this.#promiseCache.size < this.#sweepAt) return;
118
+ const now = Date.now();
119
+ for (const [key, entry] of this.#promiseCache) if (entry.expiresAt <= now) this.#promiseCache.delete(key);
120
+ this.#sweepAt = Math.max(DataLoader.#minSweepSize, this.#promiseCache.size * 2);
121
+ }
122
+
90
123
  #schedule() {
91
124
  if (this.#scheduled) return;
92
125
  this.#scheduled = true;
@@ -159,7 +192,7 @@ export const createLoader = <Key, Value>(model: LoaderModel, fieldName = "id", d
159
192
  });
160
193
  return data as unknown as Promise<Value[]>;
161
194
  },
162
- { name: "dataloader", cache: false },
195
+ { name: "dataloader" },
163
196
  );
164
197
  };
165
198
  export const createArrayLoader = <K, V>(model: LoaderModel, fieldName = "id", defaultQuery: QueryOf<unknown> = {}) => {
@@ -194,7 +227,7 @@ export const createArrayElementLoader = <K, V>(
194
227
  });
195
228
  return data as unknown as Promise<V[]>;
196
229
  },
197
- { name: "dataloader", cache: false },
230
+ { name: "dataloader" },
198
231
  );
199
232
  };
200
233
 
@@ -214,7 +247,7 @@ export const createQueryLoader = <Key, Value>(
214
247
  });
215
248
  return data as unknown as Promise<Value[]>;
216
249
  },
217
- { name: "dataloader", cache: false },
250
+ { name: "dataloader" },
218
251
  );
219
252
  };
220
253
 
@@ -1,7 +1,7 @@
1
1
  import type { MergedValues, PromiseOrObject } from "akanjs/base";
2
2
  import { Logger } from "akanjs/common";
3
3
  import type { DocumentModel, QueryOf } from "akanjs/constant";
4
- import type { CacheAdaptor, CacheSetOptions } from "akanjs/service";
4
+ import type { CacheAdaptor, CacheSetOptions, CacheValue } from "akanjs/service";
5
5
  import type { DataLoader } from "./dataLoader";
6
6
  import type { DocumentUpdateInput } from "./documentQuery";
7
7
  import type { ExtractQuery, ExtractSort, FilterInstance } from "./filterMeta";
@@ -16,15 +16,51 @@ export class CacheDatabase<T = unknown> {
16
16
  ) {
17
17
  this.logger = new Logger(`${refName}Cache`);
18
18
  }
19
- async set(topic: string, key: string, value: string | number | Buffer, option: CacheSetOptions = {}) {
19
+ async set(topic: string, key: string, value: CacheValue, option: CacheSetOptions = {}) {
20
20
  await this.cache.set(this.refName, `${topic}:${key}`, value, option);
21
21
  }
22
- async get<T extends string | number | Buffer>(topic: string, key: string): Promise<T | undefined> {
22
+ async get<T extends CacheValue = CacheValue>(topic: string, key: string): Promise<T | undefined> {
23
23
  return await this.cache.get<T>(this.refName, `${topic}:${key}`);
24
24
  }
25
25
  async delete(topic: string, key: string) {
26
26
  await this.cache.delete(this.refName, `${topic}:${key}`);
27
27
  }
28
+ async getDel<T extends CacheValue = CacheValue>(topic: string, key: string): Promise<T | undefined> {
29
+ return await this.cache.getDel<T>(this.refName, `${topic}:${key}`);
30
+ }
31
+ async setIfAbsent(topic: string, key: string, value: CacheValue, option: CacheSetOptions = {}) {
32
+ return await this.cache.setIfAbsent(this.refName, `${topic}:${key}`, value, option);
33
+ }
34
+ async incr(topic: string, key: string, by = 1, option: CacheSetOptions = {}) {
35
+ return await this.cache.incr(this.refName, `${topic}:${key}`, by, option);
36
+ }
37
+ async hset(topic: string, key: string, subKey: string, value: CacheValue, option: CacheSetOptions = {}) {
38
+ await this.cache.hset(this.refName, `${topic}:${key}`, subKey, value, option);
39
+ }
40
+ async hget<T extends CacheValue = CacheValue>(topic: string, key: string, subKey: string): Promise<T | undefined> {
41
+ return await this.cache.hget<T>(this.refName, `${topic}:${key}`, subKey);
42
+ }
43
+ async hdelete(topic: string, key: string, subKey: string) {
44
+ await this.cache.hdelete(this.refName, `${topic}:${key}`, subKey);
45
+ }
46
+ async hkeys(topic: string, key: string) {
47
+ return await this.cache.hkeys(this.refName, `${topic}:${key}`);
48
+ }
49
+ async hentries<T extends CacheValue = CacheValue>(topic: string, key: string): Promise<[string, T][]> {
50
+ return await this.cache.hentries<T>(this.refName, `${topic}:${key}`);
51
+ }
52
+ async hclear(topic: string, key: string) {
53
+ await this.cache.hclear(this.refName, `${topic}:${key}`);
54
+ }
55
+ async hgetDel<T extends CacheValue = CacheValue>(topic: string, key: string, subKey: string): Promise<T | undefined> {
56
+ return await this.cache.hgetDel<T>(this.refName, `${topic}:${key}`, subKey);
57
+ }
58
+ async hsetIfAbsent(topic: string, key: string, subKey: string, value: CacheValue, option: CacheSetOptions = {}) {
59
+ return await this.cache.hsetIfAbsent(this.refName, `${topic}:${key}`, subKey, value, option);
60
+ }
61
+ async hincr(topic: string, key: string, subKey: string, by = 1, option: CacheSetOptions = {}) {
62
+ return await this.cache.hincr(this.refName, `${topic}:${key}`, subKey, by, option);
63
+ }
28
64
  }
29
65
  /**
30
66
  * What `update<Filter>` returns. The patch cannot be a trailing parameter — a filter's own args may be optional,
@@ -15,25 +15,46 @@ export type ModelCls<
15
15
  _libsOnSchema: (schema: SchemaOf<any, any>) => void;
16
16
  }
17
17
  >;
18
+ export interface LoaderOption {
19
+ /** `false` by default; a number of milliseconds, or `true` for as long as the process runs. */
20
+ cache?: boolean | number;
21
+ }
22
+
18
23
  export class LoaderInfo<Doc = any, Key extends keyof Doc = keyof Doc, QueryArg = Doc[Key]> {
19
24
  type: LoaderType;
20
25
  field: Key | Key[];
21
26
  defaultQuery: QueryOf<unknown>;
27
+ cache: boolean | number;
22
28
  queryArg: QueryArg | undefined;
23
- constructor(type: LoaderType, field: Key | Key[], defaultQuery: QueryOf<unknown> = {}) {
29
+ constructor(
30
+ type: LoaderType,
31
+ field: Key | Key[],
32
+ defaultQuery: QueryOf<unknown> = {},
33
+ { cache = false }: LoaderOption = {},
34
+ ) {
24
35
  this.type = type;
25
36
  this.field = field;
26
37
  this.defaultQuery = defaultQuery;
38
+ this.cache = cache;
27
39
  }
28
40
  }
29
41
 
30
42
  export const makeLoaderBuilder = <Doc>() => ({
31
- byField: <Key extends keyof Doc & string>(fieldName: Key, defaultQuery: QueryOf<unknown> = {}) =>
32
- new LoaderInfo<Doc, Key>("field", fieldName, defaultQuery),
33
- byArrayField: <Key extends keyof Doc & string>(fieldName: Key, defaultQuery: QueryOf<unknown> = {}) =>
34
- new LoaderInfo<Doc, Key>("arrayField", fieldName, defaultQuery),
35
- byQuery: <Key extends keyof Doc & string>(queryKeys: readonly Key[], defaultQuery: QueryOf<unknown> = {}) =>
36
- new LoaderInfo<Doc, Key, Pick<Doc, Key>>("query", queryKeys as Key[], defaultQuery),
43
+ byField: <Key extends keyof Doc & string>(
44
+ fieldName: Key,
45
+ defaultQuery: QueryOf<unknown> = {},
46
+ option: LoaderOption = {},
47
+ ) => new LoaderInfo<Doc, Key>("field", fieldName, defaultQuery, option),
48
+ byArrayField: <Key extends keyof Doc & string>(
49
+ fieldName: Key,
50
+ defaultQuery: QueryOf<unknown> = {},
51
+ option: LoaderOption = {},
52
+ ) => new LoaderInfo<Doc, Key>("arrayField", fieldName, defaultQuery, option),
53
+ byQuery: <Key extends keyof Doc & string>(
54
+ queryKeys: readonly Key[],
55
+ defaultQuery: QueryOf<unknown> = {},
56
+ option: LoaderOption = {},
57
+ ) => new LoaderInfo<Doc, Key, Pick<Doc, Key>>("query", queryKeys as Key[], defaultQuery, option),
37
58
  });
38
59
 
39
60
  export type LoaderBuilder<Doc = any> = (builder: ReturnType<typeof makeLoaderBuilder<Doc>>) => {
@@ -217,7 +217,12 @@ export class DocumentQueryEvaluator {
217
217
  return this.#has(read, operand);
218
218
  case "contains":
219
219
 
220
- return read.value !== null && String(read.value).toLowerCase().includes(String(operand).toLowerCase());
220
+ return (
221
+ read.value !== null &&
222
+ DocumentQueryEvaluator.#foldAscii(String(read.value)).includes(
223
+ DocumentQueryEvaluator.#foldAscii(String(operand)),
224
+ )
225
+ );
221
226
  }
222
227
  }
223
228
 
@@ -313,6 +318,10 @@ export class DocumentQueryEvaluator {
313
318
  return leftPoints.length === rightPoints.length ? 0 : leftPoints.length < rightPoints.length ? -1 : 1;
314
319
  }
315
320
 
321
+ static #foldAscii(text: string) {
322
+ return text.replace(/[A-Z]/g, (char) => char.toLowerCase());
323
+ }
324
+
316
325
  static #isNode(value: unknown): value is DocumentQueryNode {
317
326
  return !!value && typeof value === "object" && "kind" in value;
318
327
  }
@@ -544,7 +544,7 @@ export class FetchClient {
544
544
 
545
545
  const anyCruGuards = signal.cruGuards ?? signal.createGuards ?? signal.updateGuards ?? signal.removeGuards;
546
546
  const updateGuards = signal.updateGuards ?? signal.cruGuards;
547
- if (anyCruGuards) {
547
+ if (signal.getGuards) {
548
548
  this.#setHandlerFactory(names.viewModel, () =>
549
549
  this.#makeModelHandleFn(refName, names.model, names.viewModel, `${refName}View`),
550
550
  );
@@ -557,6 +557,8 @@ export class FetchClient {
557
557
  return { refName, [`${refName}Obj`]: modelObj, [`${refName}ViewAt`]: new Date() };
558
558
  }) as FetchHandler,
559
559
  );
560
+ }
561
+ if (signal.getGuards && anyCruGuards) {
560
562
  this.#setHandlerFactory(names.editModel, () =>
561
563
  this.#makeModelHandleFn(refName, names.model, names.editModel, `${refName}Edit`),
562
564
  );
@@ -569,17 +571,17 @@ export class FetchClient {
569
571
  return { refName, [`${refName}Obj`]: modelObj, [`${refName}ViewAt`]: new Date() };
570
572
  }) as FetchHandler,
571
573
  );
572
- if (updateGuards) {
573
- this.#setHandlerFactory(
574
- names.mergeModel,
575
- () =>
576
- (async (modelOrId: string | { id: string }, data: UnknownRecord, option?: FetchPolicy) => {
577
- const id = typeof modelOrId === "string" ? modelOrId : modelOrId.id;
578
- const updateFn = this.#requireHandler(names.updateModel, names.mergeModel);
579
- return await updateFn(id, data, option);
580
- }) as FetchHandler,
581
- );
582
- }
574
+ }
575
+ if (updateGuards) {
576
+ this.#setHandlerFactory(
577
+ names.mergeModel,
578
+ () =>
579
+ (async (modelOrId: string | { id: string }, data: UnknownRecord, option?: FetchPolicy) => {
580
+ const id = typeof modelOrId === "string" ? modelOrId : modelOrId.id;
581
+ const updateFn = this.#requireHandler(names.updateModel, names.mergeModel);
582
+ return await updateFn(id, data, option);
583
+ }) as FetchHandler,
584
+ );
583
585
  }
584
586
 
585
587
  this.#setHandlerFactory(
@@ -207,7 +207,7 @@ export class HttpClient {
207
207
  const searchPath = searchParams.size > 0 ? `?${searchParams.toString()}` : "";
208
208
  const paramedPath = path.replace(/:(\w+)/g, (match, p1) => {
209
209
  const value = argMap.get(p1);
210
- return value === null || value === undefined ? match : String(value);
210
+ return value === null || value === undefined ? match : encodeURIComponent(String(value));
211
211
  });
212
212
  return `${paramedPath}${searchPath}`;
213
213
  }
package/index.ts CHANGED
@@ -229,9 +229,18 @@ export interface AkanApiConfig {
229
229
  websocketPrefix: string;
230
230
  }
231
231
 
232
+ export interface AkanDatabaseConfig {
233
+ /**
234
+ * The modes this app's build can run in. `akan build` bundles the drivers of each, the image lets a deployment
235
+ * pick one of them with `AKAN_DATABASE_MODE` and no other, and `akan start` runs the first unless the shell names
236
+ * another. A deployment of a build carrying several has to name one.
237
+ */
238
+ modes: DatabaseMode[];
239
+ }
240
+
232
241
  export interface AppConfigResult {
233
242
  docker: DockerConfig;
234
- defaultDatabaseMode: DatabaseMode;
243
+ database: AkanDatabaseConfig;
235
244
  /**
236
245
  * Where this app mounts its endpoints. Declared here rather than only in `main.ts` because the value is baked
237
246
  * into every client bundle: a prebuilt CSR shell or a mobile bundle never reaches the server that would tell
@@ -0,0 +1,44 @@
1
+ [crossTest] 58035 - 09/25/2026, 16:51:41 PM VERBOSE crossTest is serving on port 47811 +114ms
2
+ [crossTest] 58035 - 09/25/2026, 16:51:41 PM VERBOSE 🚀 crossTest is running on port 47811 +117ms
3
+ [scheduler] 58035 - 09/25/2026, 16:52:41 PM DEBUG Schedule interval searchIndexRetry finished 2ms +60110ms
4
+ [scheduler] 58035 - 09/25/2026, 16:53:41 PM DEBUG Schedule interval searchIndexRetry finished 1ms +120110ms
5
+ [crossTest] 58035 - 09/25/2026, 16:53:57 PM DEBUG Received SIGTERM, starting graceful shutdown... +135947ms
6
+ [crossTest] 58035 - 09/25/2026, 16:53:57 PM INFO Shutting down gracefully... +135947ms
7
+ [DiLifecycle] 58035 - 09/25/2026, 16:53:57 PM VERBOSE Running destroy internals... +135947ms
8
+ [DiLifecycle] 58035 - 09/25/2026, 16:53:57 PM VERBOSE Destroy internals in 1ms +135948ms
9
+ [DiLifecycle] 58035 - 09/25/2026, 16:53:57 PM VERBOSE Destroying services... +135948ms
10
+ [BaseService] 58035 - 09/25/2026, 16:53:57 PM VERBOSE base service destroying... +135948ms
11
+ [AgentService] 58035 - 09/25/2026, 16:53:57 PM VERBOSE agent service destroying... +135948ms
12
+ [CrossItemService] 58035 - 09/25/2026, 16:53:57 PM VERBOSE crossItem service destroying... +135948ms
13
+ [BaseService] 58035 - 09/25/2026, 16:53:57 PM VERBOSE base service destroyed in 0ms +135948ms
14
+ [AgentService] 58035 - 09/25/2026, 16:53:57 PM VERBOSE agent service destroyed in 0ms +135948ms
15
+ [CrossItemService] 58035 - 09/25/2026, 16:53:57 PM VERBOSE crossItem service destroyed in 0ms +135948ms
16
+ [DiLifecycle] 58035 - 09/25/2026, 16:53:57 PM VERBOSE Destroy services in 0ms +135948ms
17
+ [DiLifecycle] 58035 - 09/25/2026, 16:53:57 PM VERBOSE Destroying adaptors... +135948ms
18
+ [crossItemModel] 58035 - 09/25/2026, 16:53:57 PM VERBOSE crossItemModel adaptor destroying... +135948ms
19
+ [crossItemModel] 58035 - 09/25/2026, 16:53:57 PM VERBOSE crossItemModel adaptor destroyed in 0ms +135948ms
20
+ [sqliteDatabase] 58035 - 09/25/2026, 16:53:57 PM VERBOSE sqliteDatabase adaptor destroying... +135948ms
21
+ [sqliteDatabase] 58035 - 09/25/2026, 16:53:57 PM VERBOSE sqliteDatabase adaptor destroyed in 5ms +135953ms
22
+ [bullQueue] 58035 - 09/25/2026, 16:53:57 PM VERBOSE bullQueue adaptor destroying... +135953ms
23
+ [scheduler] 58035 - 09/25/2026, 16:53:57 PM VERBOSE scheduler adaptor destroying... +135953ms
24
+ [wsRedis] 58035 - 09/25/2026, 16:53:57 PM VERBOSE wsRedis adaptor destroying... +135953ms
25
+ [scheduler] 58035 - 09/25/2026, 16:53:57 PM VERBOSE scheduler adaptor destroyed in 0ms +135953ms
26
+ [bullQueue] 58035 - 09/25/2026, 16:53:57 PM VERBOSE bullQueue adaptor destroyed in 0ms +135953ms
27
+ [wsRedis] 58035 - 09/25/2026, 16:53:57 PM VERBOSE WebSocket Redis adaptor destroyed +135957ms
28
+ [wsRedis] 58035 - 09/25/2026, 16:53:57 PM VERBOSE wsRedis adaptor destroyed in 4ms +135957ms
29
+ [redisCache] 58035 - 09/25/2026, 16:53:57 PM VERBOSE redisCache adaptor destroying... +135957ms
30
+ [blobStorage] 58035 - 09/25/2026, 16:53:57 PM VERBOSE blobStorage adaptor destroying... +135957ms
31
+ [consoleLogger] 58035 - 09/25/2026, 16:53:57 PM VERBOSE consoleLogger adaptor destroying... +135957ms
32
+ [jsonCompressor] 58035 - 09/25/2026, 16:53:57 PM VERBOSE jsonCompressor adaptor destroying... +135957ms
33
+ [openaiLlm] 58035 - 09/25/2026, 16:53:57 PM VERBOSE openaiLlm adaptor destroying... +135957ms
34
+ [llmAdaptorRole] 58035 - 09/25/2026, 16:53:57 PM VERBOSE llmAdaptorRole adaptor destroying... +135957ms
35
+ [redisCache] 58035 - 09/25/2026, 16:53:57 PM VERBOSE redisCache adaptor destroyed in 0ms +135957ms
36
+ [blobStorage] 58035 - 09/25/2026, 16:53:57 PM VERBOSE blobStorage adaptor destroyed in 0ms +135957ms
37
+ [consoleLogger] 58035 - 09/25/2026, 16:53:57 PM VERBOSE consoleLogger adaptor destroyed in 0ms +135957ms
38
+ [jsonCompressor] 58035 - 09/25/2026, 16:53:57 PM VERBOSE jsonCompressor adaptor destroyed in 0ms +135957ms
39
+ [openaiLlm] 58035 - 09/25/2026, 16:53:57 PM VERBOSE openaiLlm adaptor destroyed in 0ms +135957ms
40
+ [llmAdaptorRole] 58035 - 09/25/2026, 16:53:57 PM VERBOSE llmAdaptorRole adaptor destroyed in 0ms +135957ms
41
+ [DiLifecycle] 58035 - 09/25/2026, 16:53:57 PM VERBOSE Destroy adaptors in 9ms +135957ms
42
+ [DiLifecycle] 58035 - 09/25/2026, 16:53:57 PM VERBOSE Destroying uses... +135957ms
43
+ [DiLifecycle] 58035 - 09/25/2026, 16:53:57 PM VERBOSE Destroy uses in 0ms +135957ms
44
+ [crossTest] 58035 - 09/25/2026, 16:53:57 PM INFO Shutdown completed successfully in 10ms +135957ms
@@ -0,0 +1,42 @@
1
+ [crossTest] 59872 - 09/25/2026, 16:53:58 PM VERBOSE crossTest is serving on port 47811 +109ms
2
+ [crossTest] 59872 - 09/25/2026, 16:53:58 PM VERBOSE 🚀 crossTest is running on port 47811 +112ms
3
+ [crossTest] 59872 - 09/25/2026, 16:54:10 PM DEBUG Received SIGTERM, starting graceful shutdown... +11999ms
4
+ [crossTest] 59872 - 09/25/2026, 16:54:10 PM INFO Shutting down gracefully... +11999ms
5
+ [DiLifecycle] 59872 - 09/25/2026, 16:54:10 PM VERBOSE Running destroy internals... +12000ms
6
+ [DiLifecycle] 59872 - 09/25/2026, 16:54:10 PM VERBOSE Destroy internals in 0ms +12000ms
7
+ [DiLifecycle] 59872 - 09/25/2026, 16:54:10 PM VERBOSE Destroying services... +12000ms
8
+ [BaseService] 59872 - 09/25/2026, 16:54:10 PM VERBOSE base service destroying... +12000ms
9
+ [AgentService] 59872 - 09/25/2026, 16:54:10 PM VERBOSE agent service destroying... +12000ms
10
+ [CrossItemService] 59872 - 09/25/2026, 16:54:10 PM VERBOSE crossItem service destroying... +12000ms
11
+ [BaseService] 59872 - 09/25/2026, 16:54:10 PM VERBOSE base service destroyed in 0ms +12000ms
12
+ [AgentService] 59872 - 09/25/2026, 16:54:10 PM VERBOSE agent service destroyed in 0ms +12000ms
13
+ [CrossItemService] 59872 - 09/25/2026, 16:54:10 PM VERBOSE crossItem service destroyed in 0ms +12000ms
14
+ [DiLifecycle] 59872 - 09/25/2026, 16:54:10 PM VERBOSE Destroy services in 0ms +12000ms
15
+ [DiLifecycle] 59872 - 09/25/2026, 16:54:10 PM VERBOSE Destroying adaptors... +12000ms
16
+ [crossItemModel] 59872 - 09/25/2026, 16:54:10 PM VERBOSE crossItemModel adaptor destroying... +12000ms
17
+ [crossItemModel] 59872 - 09/25/2026, 16:54:10 PM VERBOSE crossItemModel adaptor destroyed in 0ms +12000ms
18
+ [sqliteDatabase] 59872 - 09/25/2026, 16:54:10 PM VERBOSE sqliteDatabase adaptor destroying... +12000ms
19
+ [sqliteDatabase] 59872 - 09/25/2026, 16:54:10 PM VERBOSE sqliteDatabase adaptor destroyed in 5ms +12005ms
20
+ [bullQueue] 59872 - 09/25/2026, 16:54:10 PM VERBOSE bullQueue adaptor destroying... +12005ms
21
+ [scheduler] 59872 - 09/25/2026, 16:54:10 PM VERBOSE scheduler adaptor destroying... +12005ms
22
+ [wsRedis] 59872 - 09/25/2026, 16:54:10 PM VERBOSE wsRedis adaptor destroying... +12005ms
23
+ [scheduler] 59872 - 09/25/2026, 16:54:10 PM VERBOSE scheduler adaptor destroyed in 1ms +12006ms
24
+ [bullQueue] 59872 - 09/25/2026, 16:54:10 PM VERBOSE bullQueue adaptor destroyed in 1ms +12006ms
25
+ [wsRedis] 59872 - 09/25/2026, 16:54:10 PM VERBOSE WebSocket Redis adaptor destroyed +12010ms
26
+ [wsRedis] 59872 - 09/25/2026, 16:54:10 PM VERBOSE wsRedis adaptor destroyed in 5ms +12010ms
27
+ [redisCache] 59872 - 09/25/2026, 16:54:10 PM VERBOSE redisCache adaptor destroying... +12010ms
28
+ [blobStorage] 59872 - 09/25/2026, 16:54:10 PM VERBOSE blobStorage adaptor destroying... +12010ms
29
+ [consoleLogger] 59872 - 09/25/2026, 16:54:10 PM VERBOSE consoleLogger adaptor destroying... +12010ms
30
+ [jsonCompressor] 59872 - 09/25/2026, 16:54:10 PM VERBOSE jsonCompressor adaptor destroying... +12010ms
31
+ [openaiLlm] 59872 - 09/25/2026, 16:54:10 PM VERBOSE openaiLlm adaptor destroying... +12010ms
32
+ [llmAdaptorRole] 59872 - 09/25/2026, 16:54:10 PM VERBOSE llmAdaptorRole adaptor destroying... +12010ms
33
+ [redisCache] 59872 - 09/25/2026, 16:54:10 PM VERBOSE redisCache adaptor destroyed in 0ms +12010ms
34
+ [blobStorage] 59872 - 09/25/2026, 16:54:10 PM VERBOSE blobStorage adaptor destroyed in 0ms +12010ms
35
+ [consoleLogger] 59872 - 09/25/2026, 16:54:10 PM VERBOSE consoleLogger adaptor destroyed in 0ms +12010ms
36
+ [jsonCompressor] 59872 - 09/25/2026, 16:54:10 PM VERBOSE jsonCompressor adaptor destroyed in 0ms +12010ms
37
+ [openaiLlm] 59872 - 09/25/2026, 16:54:10 PM VERBOSE openaiLlm adaptor destroyed in 0ms +12010ms
38
+ [llmAdaptorRole] 59872 - 09/25/2026, 16:54:10 PM VERBOSE llmAdaptorRole adaptor destroyed in 0ms +12010ms
39
+ [DiLifecycle] 59872 - 09/25/2026, 16:54:10 PM VERBOSE Destroy adaptors in 10ms +12010ms
40
+ [DiLifecycle] 59872 - 09/25/2026, 16:54:10 PM VERBOSE Destroying uses... +12010ms
41
+ [DiLifecycle] 59872 - 09/25/2026, 16:54:10 PM VERBOSE Destroy uses in 0ms +12010ms
42
+ [crossTest] 59872 - 09/25/2026, 16:54:10 PM INFO Shutdown completed successfully in 11ms +12010ms
@@ -0,0 +1,43 @@
1
+ [crossTest] 60280 - 09/25/2026, 16:54:26 PM VERBOSE crossTest is serving on port 47811 +111ms
2
+ [crossTest] 60280 - 09/25/2026, 16:54:26 PM VERBOSE 🚀 crossTest is running on port 47811 +114ms
3
+ [scheduler] 60280 - 09/25/2026, 16:55:26 PM DEBUG Schedule interval searchIndexRetry finished 3ms +60108ms
4
+ [crossTest] 60280 - 09/25/2026, 16:56:12 PM DEBUG Received SIGTERM, starting graceful shutdown... +105905ms
5
+ [crossTest] 60280 - 09/25/2026, 16:56:12 PM INFO Shutting down gracefully... +105905ms
6
+ [DiLifecycle] 60280 - 09/25/2026, 16:56:12 PM VERBOSE Running destroy internals... +105905ms
7
+ [DiLifecycle] 60280 - 09/25/2026, 16:56:12 PM VERBOSE Destroy internals in 0ms +105905ms
8
+ [DiLifecycle] 60280 - 09/25/2026, 16:56:12 PM VERBOSE Destroying services... +105905ms
9
+ [BaseService] 60280 - 09/25/2026, 16:56:12 PM VERBOSE base service destroying... +105906ms
10
+ [AgentService] 60280 - 09/25/2026, 16:56:12 PM VERBOSE agent service destroying... +105906ms
11
+ [CrossItemService] 60280 - 09/25/2026, 16:56:12 PM VERBOSE crossItem service destroying... +105906ms
12
+ [BaseService] 60280 - 09/25/2026, 16:56:12 PM VERBOSE base service destroyed in 0ms +105906ms
13
+ [AgentService] 60280 - 09/25/2026, 16:56:12 PM VERBOSE agent service destroyed in 0ms +105906ms
14
+ [CrossItemService] 60280 - 09/25/2026, 16:56:12 PM VERBOSE crossItem service destroyed in 0ms +105906ms
15
+ [DiLifecycle] 60280 - 09/25/2026, 16:56:12 PM VERBOSE Destroy services in 1ms +105906ms
16
+ [DiLifecycle] 60280 - 09/25/2026, 16:56:12 PM VERBOSE Destroying adaptors... +105906ms
17
+ [crossItemModel] 60280 - 09/25/2026, 16:56:12 PM VERBOSE crossItemModel adaptor destroying... +105906ms
18
+ [crossItemModel] 60280 - 09/25/2026, 16:56:12 PM VERBOSE crossItemModel adaptor destroyed in 0ms +105906ms
19
+ [sqliteDatabase] 60280 - 09/25/2026, 16:56:12 PM VERBOSE sqliteDatabase adaptor destroying... +105906ms
20
+ [sqliteDatabase] 60280 - 09/25/2026, 16:56:12 PM VERBOSE sqliteDatabase adaptor destroyed in 4ms +105910ms
21
+ [bullQueue] 60280 - 09/25/2026, 16:56:12 PM VERBOSE bullQueue adaptor destroying... +105910ms
22
+ [scheduler] 60280 - 09/25/2026, 16:56:12 PM VERBOSE scheduler adaptor destroying... +105910ms
23
+ [wsRedis] 60280 - 09/25/2026, 16:56:12 PM VERBOSE wsRedis adaptor destroying... +105910ms
24
+ [scheduler] 60280 - 09/25/2026, 16:56:12 PM VERBOSE scheduler adaptor destroyed in 1ms +105911ms
25
+ [bullQueue] 60280 - 09/25/2026, 16:56:12 PM VERBOSE bullQueue adaptor destroyed in 1ms +105911ms
26
+ [wsRedis] 60280 - 09/25/2026, 16:56:12 PM VERBOSE WebSocket Redis adaptor destroyed +105912ms
27
+ [wsRedis] 60280 - 09/25/2026, 16:56:12 PM VERBOSE wsRedis adaptor destroyed in 2ms +105912ms
28
+ [redisCache] 60280 - 09/25/2026, 16:56:12 PM VERBOSE redisCache adaptor destroying... +105912ms
29
+ [blobStorage] 60280 - 09/25/2026, 16:56:12 PM VERBOSE blobStorage adaptor destroying... +105912ms
30
+ [consoleLogger] 60280 - 09/25/2026, 16:56:12 PM VERBOSE consoleLogger adaptor destroying... +105912ms
31
+ [jsonCompressor] 60280 - 09/25/2026, 16:56:12 PM VERBOSE jsonCompressor adaptor destroying... +105912ms
32
+ [openaiLlm] 60280 - 09/25/2026, 16:56:12 PM VERBOSE openaiLlm adaptor destroying... +105912ms
33
+ [llmAdaptorRole] 60280 - 09/25/2026, 16:56:12 PM VERBOSE llmAdaptorRole adaptor destroying... +105912ms
34
+ [redisCache] 60280 - 09/25/2026, 16:56:12 PM VERBOSE redisCache adaptor destroyed in 0ms +105912ms
35
+ [blobStorage] 60280 - 09/25/2026, 16:56:12 PM VERBOSE blobStorage adaptor destroyed in 0ms +105912ms
36
+ [consoleLogger] 60280 - 09/25/2026, 16:56:12 PM VERBOSE consoleLogger adaptor destroyed in 0ms +105912ms
37
+ [jsonCompressor] 60280 - 09/25/2026, 16:56:12 PM VERBOSE jsonCompressor adaptor destroyed in 0ms +105912ms
38
+ [openaiLlm] 60280 - 09/25/2026, 16:56:12 PM VERBOSE openaiLlm adaptor destroyed in 1ms +105913ms
39
+ [llmAdaptorRole] 60280 - 09/25/2026, 16:56:12 PM VERBOSE llmAdaptorRole adaptor destroyed in 1ms +105913ms
40
+ [DiLifecycle] 60280 - 09/25/2026, 16:56:12 PM VERBOSE Destroy adaptors in 7ms +105913ms
41
+ [DiLifecycle] 60280 - 09/25/2026, 16:56:12 PM VERBOSE Destroying uses... +105913ms
42
+ [DiLifecycle] 60280 - 09/25/2026, 16:56:12 PM VERBOSE Destroy uses in 0ms +105913ms
43
+ [crossTest] 60280 - 09/25/2026, 16:56:12 PM INFO Shutdown completed successfully in 8ms +105913ms
@@ -0,0 +1,44 @@
1
+ [crossTest] 61977 - 09/25/2026, 16:56:22 PM VERBOSE crossTest is serving on port 47811 +113ms
2
+ [crossTest] 61977 - 09/25/2026, 16:56:22 PM VERBOSE 🚀 crossTest is running on port 47811 +116ms
3
+ [crossItemSliceEndpoint] 61977 - 09/25/2026, 16:56:22 PM DEBUG Before mutation-createCrossItem / 1790322982110 +171ms
4
+ [crossItemSliceEndpoint] 61977 - 09/25/2026, 16:56:22 PM DEBUG After mutation-createCrossItem / 2ms +173ms
5
+ [crossTest] 61977 - 09/25/2026, 16:57:03 PM DEBUG Received SIGTERM, starting graceful shutdown... +41514ms
6
+ [crossTest] 61977 - 09/25/2026, 16:57:03 PM INFO Shutting down gracefully... +41515ms
7
+ [DiLifecycle] 61977 - 09/25/2026, 16:57:03 PM VERBOSE Running destroy internals... +41515ms
8
+ [DiLifecycle] 61977 - 09/25/2026, 16:57:03 PM VERBOSE Destroy internals in 0ms +41515ms
9
+ [DiLifecycle] 61977 - 09/25/2026, 16:57:03 PM VERBOSE Destroying services... +41515ms
10
+ [BaseService] 61977 - 09/25/2026, 16:57:03 PM VERBOSE base service destroying... +41515ms
11
+ [AgentService] 61977 - 09/25/2026, 16:57:03 PM VERBOSE agent service destroying... +41515ms
12
+ [CrossItemService] 61977 - 09/25/2026, 16:57:03 PM VERBOSE crossItem service destroying... +41515ms
13
+ [BaseService] 61977 - 09/25/2026, 16:57:03 PM VERBOSE base service destroyed in 0ms +41515ms
14
+ [AgentService] 61977 - 09/25/2026, 16:57:03 PM VERBOSE agent service destroyed in 0ms +41515ms
15
+ [CrossItemService] 61977 - 09/25/2026, 16:57:03 PM VERBOSE crossItem service destroyed in 0ms +41515ms
16
+ [DiLifecycle] 61977 - 09/25/2026, 16:57:03 PM VERBOSE Destroy services in 0ms +41515ms
17
+ [DiLifecycle] 61977 - 09/25/2026, 16:57:03 PM VERBOSE Destroying adaptors... +41515ms
18
+ [crossItemModel] 61977 - 09/25/2026, 16:57:03 PM VERBOSE crossItemModel adaptor destroying... +41515ms
19
+ [crossItemModel] 61977 - 09/25/2026, 16:57:03 PM VERBOSE crossItemModel adaptor destroyed in 1ms +41516ms
20
+ [sqliteDatabase] 61977 - 09/25/2026, 16:57:03 PM VERBOSE sqliteDatabase adaptor destroying... +41516ms
21
+ [sqliteDatabase] 61977 - 09/25/2026, 16:57:03 PM VERBOSE sqliteDatabase adaptor destroyed in 3ms +41519ms
22
+ [bullQueue] 61977 - 09/25/2026, 16:57:03 PM VERBOSE bullQueue adaptor destroying... +41519ms
23
+ [scheduler] 61977 - 09/25/2026, 16:57:03 PM VERBOSE scheduler adaptor destroying... +41519ms
24
+ [wsRedis] 61977 - 09/25/2026, 16:57:03 PM VERBOSE wsRedis adaptor destroying... +41519ms
25
+ [scheduler] 61977 - 09/25/2026, 16:57:03 PM VERBOSE scheduler adaptor destroyed in 0ms +41519ms
26
+ [bullQueue] 61977 - 09/25/2026, 16:57:03 PM VERBOSE bullQueue adaptor destroyed in 0ms +41519ms
27
+ [wsRedis] 61977 - 09/25/2026, 16:57:03 PM VERBOSE WebSocket Redis adaptor destroyed +41521ms
28
+ [wsRedis] 61977 - 09/25/2026, 16:57:03 PM VERBOSE wsRedis adaptor destroyed in 2ms +41521ms
29
+ [redisCache] 61977 - 09/25/2026, 16:57:03 PM VERBOSE redisCache adaptor destroying... +41521ms
30
+ [blobStorage] 61977 - 09/25/2026, 16:57:03 PM VERBOSE blobStorage adaptor destroying... +41521ms
31
+ [consoleLogger] 61977 - 09/25/2026, 16:57:03 PM VERBOSE consoleLogger adaptor destroying... +41521ms
32
+ [jsonCompressor] 61977 - 09/25/2026, 16:57:03 PM VERBOSE jsonCompressor adaptor destroying... +41521ms
33
+ [openaiLlm] 61977 - 09/25/2026, 16:57:03 PM VERBOSE openaiLlm adaptor destroying... +41521ms
34
+ [llmAdaptorRole] 61977 - 09/25/2026, 16:57:03 PM VERBOSE llmAdaptorRole adaptor destroying... +41521ms
35
+ [redisCache] 61977 - 09/25/2026, 16:57:03 PM VERBOSE redisCache adaptor destroyed in 0ms +41521ms
36
+ [blobStorage] 61977 - 09/25/2026, 16:57:03 PM VERBOSE blobStorage adaptor destroyed in 0ms +41521ms
37
+ [consoleLogger] 61977 - 09/25/2026, 16:57:03 PM VERBOSE consoleLogger adaptor destroyed in 0ms +41521ms
38
+ [jsonCompressor] 61977 - 09/25/2026, 16:57:03 PM VERBOSE jsonCompressor adaptor destroyed in 0ms +41521ms
39
+ [openaiLlm] 61977 - 09/25/2026, 16:57:03 PM VERBOSE openaiLlm adaptor destroyed in 0ms +41521ms
40
+ [llmAdaptorRole] 61977 - 09/25/2026, 16:57:03 PM VERBOSE llmAdaptorRole adaptor destroyed in 0ms +41521ms
41
+ [DiLifecycle] 61977 - 09/25/2026, 16:57:03 PM VERBOSE Destroy adaptors in 6ms +41521ms
42
+ [DiLifecycle] 61977 - 09/25/2026, 16:57:03 PM VERBOSE Destroying uses... +41521ms
43
+ [DiLifecycle] 61977 - 09/25/2026, 16:57:03 PM VERBOSE Destroy uses in 0ms +41521ms
44
+ [crossTest] 61977 - 09/25/2026, 16:57:03 PM INFO Shutdown completed successfully in 6ms +41521ms