akanjs 3.0.0-alpha.7 → 3.0.0-alpha.71

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 (719) hide show
  1. package/CHANGELOG.md +103 -0
  2. package/README.ko.md +1 -1
  3. package/README.md +1 -1
  4. package/base/baseEnv.ts +7 -4
  5. package/base/primitiveRegistry.ts +59 -12
  6. package/base/symbols.ts +4 -0
  7. package/client/capacitor.ts +34 -0
  8. package/client/clientRuntime.ts +5 -0
  9. package/client/csrTypes.ts +4 -3
  10. package/client/index.ts +1 -0
  11. package/client/locale.ts +2 -2
  12. package/client/router.ts +7 -7
  13. package/client/sharedContext.ts +31 -0
  14. package/client/translator.ts +2 -2
  15. package/client/types.ts +3 -3
  16. package/common/Logger.ts +280 -67
  17. package/common/clientAddress.ts +40 -0
  18. package/common/deepObjectify.ts +24 -9
  19. package/common/index.ts +42 -1
  20. package/common/logContext.ts +27 -0
  21. package/common/mcpExposure.ts +114 -0
  22. package/common/pathGetLoose.ts +31 -0
  23. package/common/pathSet.ts +17 -5
  24. package/common/plainFieldsOf.ts +13 -0
  25. package/common/routeConvention.ts +22 -12
  26. package/common/websocketBinaryFrame.ts +46 -0
  27. package/constant/crystalize.ts +94 -28
  28. package/constant/dateSlot.ts +62 -0
  29. package/constant/deserialize.ts +3 -2
  30. package/constant/fieldInfo.ts +43 -3
  31. package/constant/fieldQueryMeta.ts +35 -0
  32. package/constant/getDefault.ts +16 -11
  33. package/constant/hydrationPlan.ts +72 -0
  34. package/constant/immerify.ts +4 -6
  35. package/constant/index.ts +5 -0
  36. package/constant/labelOf.ts +26 -0
  37. package/constant/mask.ts +67 -0
  38. package/constant/purify.ts +17 -11
  39. package/constant/textFieldPaths.ts +13 -7
  40. package/constant/types.ts +19 -13
  41. package/constant/via.ts +24 -17
  42. package/dictionary/DictionaryLookup.ts +30 -0
  43. package/dictionary/agent.dictionary.ts +31 -0
  44. package/dictionary/agentTurn.dictionary.ts +29 -0
  45. package/dictionary/base.dictionary.ts +81 -0
  46. package/dictionary/dictInfo.ts +11 -2
  47. package/dictionary/dictionary.ts +9 -3
  48. package/dictionary/index.ts +1 -0
  49. package/dictionary/trans.ts +2 -2
  50. package/document/documentQuery.ts +1 -0
  51. package/document/filterMeta.ts +77 -12
  52. package/document/index.ts +1 -0
  53. package/document/noDocumentError.ts +12 -0
  54. package/document/types.ts +0 -1
  55. package/fetch/agentTurn.ts +19 -0
  56. package/fetch/client/fetchClient.ts +137 -37
  57. package/fetch/client/httpClient.ts +95 -20
  58. package/fetch/client/wsClient.ts +27 -12
  59. package/fetch/fetchType/appliedReturn.type.ts +65 -44
  60. package/fetch/fetchType/endpointFetch.type.ts +17 -8
  61. package/fetch/fetchType/sliceFetch.type.ts +27 -50
  62. package/fetch/index.ts +1 -0
  63. package/index.ts +80 -6
  64. package/local/apps/akan/akan-local.db +0 -0
  65. package/local/apps/akan/akan-local.db-shm +0 -0
  66. package/local/apps/akan/akan-local.db-wal +0 -0
  67. package/local/apps/akan/akan-local_solid.db +0 -0
  68. package/local/apps/akan/akan-local_solid.db-shm +0 -0
  69. package/local/apps/akan/akan-local_solid.db-wal +0 -0
  70. package/local/apps/serverLifecycle/serverLifecycle-local.db +0 -0
  71. package/local/apps/serverLifecycle/serverLifecycle-local.db-shm +0 -0
  72. package/local/apps/serverLifecycle/serverLifecycle-local.db-wal +0 -0
  73. package/local/apps/serverLifecycle/serverLifecycle-local_solid.db +0 -0
  74. package/local/apps/serverLifecycle/serverLifecycle-local_solid.db-shm +0 -0
  75. package/local/apps/serverLifecycle/serverLifecycle-local_solid.db-wal +0 -0
  76. package/package.json +27 -18
  77. package/server/akanApp.ts +278 -138
  78. package/server/akanAppHeaders.ts +16 -2
  79. package/server/akanOption.ts +63 -8
  80. package/server/akanServer.ts +387 -32
  81. package/server/animatedImage.ts +83 -0
  82. package/server/assetEncoding.ts +4 -24
  83. package/server/binaryPubsub.ts +55 -0
  84. package/server/console.ts +110 -101
  85. package/server/consoleEvaluator.ts +51 -0
  86. package/server/consolePasteFilter.ts +91 -0
  87. package/server/consoleSession.ts +242 -0
  88. package/server/contentEncoding.ts +83 -0
  89. package/server/devtools/signalSerializer.ts +2 -2
  90. package/server/devtools/types.ts +4 -4
  91. package/server/di/diLifecycle.ts +123 -13
  92. package/server/di/predefinedAdaptor.ts +6 -0
  93. package/server/di/utils.ts +40 -0
  94. package/server/imageOptimizer.ts +154 -57
  95. package/server/lifecycle/runtimeDir.ts +14 -0
  96. package/server/lifecycle/shutdownManager.ts +1 -1
  97. package/server/logging/childOutputReader.ts +137 -0
  98. package/server/logging/hubFileSink.ts +39 -0
  99. package/server/logging/logControlSocket.ts +173 -0
  100. package/server/logging/logForwarder.ts +131 -0
  101. package/server/logging/logHub.ts +0 -0
  102. package/server/logging/logQuery.ts +130 -0
  103. package/server/logging/logStdoutWriter.ts +39 -0
  104. package/server/logging/logStreamRoute.ts +87 -0
  105. package/server/logging/logTailClient.ts +161 -0
  106. package/server/mcp/McpAuth.ts +177 -0
  107. package/server/mcp/McpDispatcher.ts +289 -0
  108. package/server/mcp/McpEventStream.ts +24 -0
  109. package/server/mcp/McpExecutionContext.ts +105 -0
  110. package/server/mcp/McpRouter.ts +621 -0
  111. package/server/mcp/index.ts +5 -0
  112. package/server/processMetricsCollector.ts +1 -1
  113. package/server/resolver/database.resolver.ts +5 -4
  114. package/server/resolver/signal.resolver.ts +208 -86
  115. package/server/routeTreeBuilder.ts +10 -8
  116. package/server/routing/apiRouter.ts +44 -14
  117. package/server/routing/appWsData.ts +24 -2
  118. package/server/routing/eventStream.ts +93 -0
  119. package/server/routing/soloAppRoutes.ts +50 -0
  120. package/server/rscWorker.tsx +36 -22
  121. package/server/rscWorkerHost.ts +59 -8
  122. package/server/semaphore.ts +22 -0
  123. package/server/subRouteIndexDocument.tsx +61 -0
  124. package/server/systemPageDocument.tsx +3 -3
  125. package/server/systemPages.tsx +49 -16
  126. package/server/types.tsx +28 -0
  127. package/server/vendor/akanjs-fetch.ts +1 -0
  128. package/server/webRouter.ts +96 -39
  129. package/service/adapt.ts +4 -4
  130. package/service/agent.service.ts +81 -0
  131. package/service/base.service.ts +2 -1
  132. package/service/index.ts +1 -0
  133. package/service/injectInfo.ts +8 -3
  134. package/service/ipcTypes.ts +6 -0
  135. package/service/predefinedAdaptor/compress.adaptor.ts +5 -1
  136. package/service/predefinedAdaptor/database.adaptor.ts +68 -37
  137. package/service/predefinedAdaptor/deepseekLlm.ts +271 -0
  138. package/service/predefinedAdaptor/index.ts +3 -0
  139. package/service/predefinedAdaptor/insightQuery.ts +183 -0
  140. package/service/predefinedAdaptor/llm.adaptor.ts +115 -0
  141. package/service/predefinedAdaptor/logging.adaptor.ts +1 -1
  142. package/service/predefinedAdaptor/queue.adaptor.ts +5 -2
  143. package/service/predefinedAdaptor/role.adaptor.ts +2 -0
  144. package/service/predefinedAdaptor/schedule.adaptor.ts +12 -5
  145. package/service/predefinedAdaptor/solidPubsub.adaptor.ts +10 -6
  146. package/service/predefinedAdaptor/solidQueue.adaptor.ts +6 -2
  147. package/service/predefinedAdaptor/solidSqlite.ts +11 -9
  148. package/service/predefinedAdaptor/websocket.adaptor.ts +6 -1
  149. package/service/serve.ts +16 -9
  150. package/service/toolNames.ts +119 -0
  151. package/signal/agent/AgentCatalogue.ts +165 -0
  152. package/signal/agent/index.ts +1 -0
  153. package/signal/agent.signal.ts +38 -0
  154. package/signal/agentTurn.ts +8 -0
  155. package/signal/agentTurnStream.ts +60 -0
  156. package/signal/base.signal.ts +2 -1
  157. package/signal/endpointInfo.ts +38 -2
  158. package/signal/guard.ts +28 -1
  159. package/signal/guards.ts +49 -1
  160. package/signal/index.ts +6 -0
  161. package/signal/intercept.ts +4 -4
  162. package/signal/internalArg.ts +21 -4
  163. package/signal/mcp/McpDocument.ts +326 -0
  164. package/signal/mcp/McpProgress.ts +106 -0
  165. package/signal/mcp/McpUriTemplate.ts +80 -0
  166. package/signal/mcp/Msg.ts +368 -0
  167. package/signal/mcp/index.ts +5 -0
  168. package/signal/mcp/mcpProtocol.ts +120 -0
  169. package/signal/middleware.ts +3 -3
  170. package/signal/openapi/openapi.ts +36 -173
  171. package/signal/schema/JsonSchemaBuilder.ts +221 -0
  172. package/signal/schema/index.ts +1 -0
  173. package/signal/serializer/fetch.serializer.ts +51 -0
  174. package/signal/signalContext.ts +324 -76
  175. package/signal/slice.ts +62 -27
  176. package/signal/trace.ts +268 -9
  177. package/signal/types.ts +55 -4
  178. package/store/action.ts +34 -41
  179. package/store/actionTag.ts +33 -0
  180. package/store/agent/AgentBridge.ts +87 -0
  181. package/store/agent/AgentContext.ts +71 -0
  182. package/store/agent/AgentPrompts.ts +111 -0
  183. package/store/agent/ScreenReader.ts +349 -0
  184. package/store/agent/ScreenSettle.ts +45 -0
  185. package/store/agent/ScreenTarget.ts +135 -0
  186. package/store/agent/StoreCatalogue.ts +116 -0
  187. package/store/agent/StoreSurfaceSource.ts +225 -0
  188. package/store/agent/index.ts +13 -0
  189. package/store/agent/storeSurface.ts +28 -0
  190. package/store/agent/types.ts +16 -0
  191. package/store/agentic/AgentValue.ts +119 -0
  192. package/store/agentic/StExposeBuilder.ts +47 -0
  193. package/store/agentic/StExposeDraft.ts +24 -0
  194. package/store/agentic/StStateBuilder.ts +85 -0
  195. package/store/agentic/StStateDraft.ts +23 -0
  196. package/store/agentic/StToolBuilder.ts +279 -0
  197. package/store/agentic/StToolDraft.ts +22 -0
  198. package/store/agentic/attachAgentic.ts +33 -0
  199. package/store/agentic/formFields.ts +194 -0
  200. package/store/agentic/index.ts +12 -0
  201. package/store/agentic/useFieldTool.ts +183 -0
  202. package/store/agentic/useFormTools.ts +77 -0
  203. package/store/agentic/useRelationFieldTool.ts +113 -0
  204. package/store/baseSt.ts +1 -1
  205. package/store/databaseStateNames.ts +31 -0
  206. package/store/formSetterNames.ts +35 -0
  207. package/store/index.ts +8 -0
  208. package/store/rootStore.ts +3 -1
  209. package/store/sliceRole.ts +36 -0
  210. package/store/state.ts +2 -12
  211. package/store/store.ts +9 -0
  212. package/store/storeInstance.ts +185 -20
  213. package/store/storeRegistry.ts +39 -1
  214. package/store/types.ts +5 -0
  215. package/store/withSelector.ts +5 -4
  216. package/test/index.ts +1 -1
  217. package/test/registerDom.ts +4 -0
  218. package/test/sampleOf.ts +2 -0
  219. package/test/signalTestRuntime.ts +5 -5
  220. package/test/testServer.ts +14 -11
  221. package/types/base/baseEnv.d.ts +1 -1
  222. package/types/base/primitiveRegistry.d.ts +20 -8
  223. package/types/base/symbols.d.ts +4 -0
  224. package/types/client/capacitor.d.ts +39 -0
  225. package/types/client/clientRuntime.d.ts +7 -0
  226. package/types/client/index.d.ts +1 -0
  227. package/types/client/sharedContext.d.ts +21 -0
  228. package/types/client/types.d.ts +5 -3
  229. package/types/common/Logger.d.ts +88 -6
  230. package/types/common/clientAddress.d.ts +19 -0
  231. package/types/common/deepObjectify.d.ts +4 -2
  232. package/types/common/index.d.ts +8 -2
  233. package/types/common/logContext.d.ts +17 -0
  234. package/types/common/mcpExposure.d.ts +64 -0
  235. package/types/common/pathGetLoose.d.ts +8 -0
  236. package/types/common/plainFieldsOf.d.ts +6 -0
  237. package/types/common/routeConvention.d.ts +6 -0
  238. package/types/common/websocketBinaryFrame.d.ts +17 -0
  239. package/types/constant/constantRegistry.d.ts +2 -10
  240. package/types/constant/crystalize.d.ts +5 -0
  241. package/types/constant/dateSlot.d.ts +14 -0
  242. package/types/constant/fieldInfo.d.ts +20 -3
  243. package/types/constant/fieldQueryMeta.d.ts +17 -0
  244. package/types/constant/getDefault.d.ts +8 -0
  245. package/types/constant/hydrationPlan.d.ts +24 -0
  246. package/types/constant/index.d.ts +5 -0
  247. package/types/constant/labelOf.d.ts +7 -0
  248. package/types/constant/mask.d.ts +41 -0
  249. package/types/constant/purify.d.ts +2 -2
  250. package/types/constant/types.d.ts +5 -5
  251. package/types/dictionary/DictionaryLookup.d.ts +14 -0
  252. package/types/dictionary/agent.dictionary.d.ts +1 -0
  253. package/types/dictionary/agentTurn.dictionary.d.ts +1 -0
  254. package/types/dictionary/base.dictionary.d.ts +1 -1
  255. package/types/dictionary/dictInfo.d.ts +7 -1
  256. package/types/dictionary/dictionary.d.ts +11 -9
  257. package/types/dictionary/index.d.ts +1 -0
  258. package/types/document/filterMeta.d.ts +24 -4
  259. package/types/document/index.d.ts +1 -0
  260. package/types/document/noDocumentError.d.ts +12 -0
  261. package/types/document/types.d.ts +0 -1
  262. package/types/fetch/agentTurn.d.ts +475 -0
  263. package/types/fetch/client/fetchClient.d.ts +12 -0
  264. package/types/fetch/client/httpClient.d.ts +2 -1
  265. package/types/fetch/fetchType/appliedReturn.type.d.ts +37 -18
  266. package/types/fetch/fetchType/endpointFetch.type.d.ts +8 -5
  267. package/types/fetch/fetchType/sliceFetch.type.d.ts +11 -15
  268. package/types/fetch/index.d.ts +1 -0
  269. package/types/index.d.ts +74 -10
  270. package/types/server/akanApp.d.ts +12 -0
  271. package/types/server/akanAppHeaders.d.ts +7 -1
  272. package/types/server/akanOption.d.ts +36 -6
  273. package/types/server/akanServer.d.ts +67 -9
  274. package/types/server/animatedImage.d.ts +7 -0
  275. package/types/server/assetEncoding.d.ts +1 -1
  276. package/types/server/binaryPubsub.d.ts +18 -0
  277. package/types/server/console.d.ts +11 -1
  278. package/types/server/consoleEvaluator.d.ts +2 -0
  279. package/types/server/consolePasteFilter.d.ts +11 -0
  280. package/types/server/consoleSession.d.ts +22 -0
  281. package/types/server/contentEncoding.d.ts +28 -0
  282. package/types/server/devtools/types.d.ts +4 -4
  283. package/types/server/di/diLifecycle.d.ts +10 -2
  284. package/types/server/di/predefinedAdaptor.d.ts +4 -1
  285. package/types/server/di/utils.d.ts +16 -0
  286. package/types/server/lifecycle/runtimeDir.d.ts +5 -0
  287. package/types/server/logging/childOutputReader.d.ts +40 -0
  288. package/types/server/logging/hubFileSink.d.ts +18 -0
  289. package/types/server/logging/logControlSocket.d.ts +60 -0
  290. package/types/server/logging/logForwarder.d.ts +37 -0
  291. package/types/server/logging/logHub.d.ts +70 -0
  292. package/types/server/logging/logQuery.d.ts +31 -0
  293. package/types/server/logging/logStdoutWriter.d.ts +35 -0
  294. package/types/server/logging/logStreamRoute.d.ts +20 -0
  295. package/types/server/logging/logTailClient.d.ts +42 -0
  296. package/types/server/mcp/McpAuth.d.ts +62 -0
  297. package/types/server/mcp/McpDispatcher.d.ts +61 -0
  298. package/types/server/mcp/McpEventStream.d.ts +17 -0
  299. package/types/server/mcp/McpExecutionContext.d.ts +44 -0
  300. package/types/server/mcp/McpRouter.d.ts +65 -0
  301. package/types/server/mcp/index.d.ts +5 -0
  302. package/types/server/mcp.d.ts +1 -0
  303. package/types/server/resolver/signal.resolver.d.ts +7 -4
  304. package/types/server/routing/apiRouter.d.ts +2 -1
  305. package/types/server/routing/appWsData.d.ts +13 -1
  306. package/types/server/routing/eventStream.d.ts +23 -0
  307. package/types/server/routing/soloAppRoutes.d.ts +17 -0
  308. package/types/server/rscWorkerHost.d.ts +4 -1
  309. package/types/server/semaphore.d.ts +5 -0
  310. package/types/server/subRouteIndexDocument.d.ts +8 -0
  311. package/types/server/systemPageDocument.d.ts +1 -0
  312. package/types/server/systemPages.d.ts +5 -0
  313. package/types/server/types.d.ts +16 -0
  314. package/types/server/vendor/akanjs-fetch.d.ts +1 -0
  315. package/types/server/webRouter.d.ts +15 -4
  316. package/types/service/adapt.d.ts +2 -2
  317. package/types/service/agent.service.d.ts +32 -0
  318. package/types/service/base.service.d.ts +4 -0
  319. package/types/service/index.d.ts +1 -0
  320. package/types/service/injectInfo.d.ts +2 -2
  321. package/types/service/ipcTypes.d.ts +12 -0
  322. package/types/service/predefinedAdaptor/compress.adaptor.d.ts +1 -1
  323. package/types/service/predefinedAdaptor/database.adaptor.d.ts +9 -3
  324. package/types/service/predefinedAdaptor/deepseekLlm.d.ts +76 -0
  325. package/types/service/predefinedAdaptor/index.d.ts +3 -0
  326. package/types/service/predefinedAdaptor/insightQuery.d.ts +50 -0
  327. package/types/service/predefinedAdaptor/llm.adaptor.d.ts +105 -0
  328. package/types/service/predefinedAdaptor/queue.adaptor.d.ts +3 -2
  329. package/types/service/predefinedAdaptor/role.adaptor.d.ts +2 -0
  330. package/types/service/predefinedAdaptor/schedule.adaptor.d.ts +10 -6
  331. package/types/service/predefinedAdaptor/solidQueue.adaptor.d.ts +6 -2
  332. package/types/service/predefinedAdaptor/solidSqlite.d.ts +2 -2
  333. package/types/service/serve.d.ts +3 -3
  334. package/types/service/toolNames.d.ts +35 -0
  335. package/types/signal/agent/AgentCatalogue.d.ts +100 -0
  336. package/types/signal/agent/index.d.ts +1 -0
  337. package/types/signal/agent.d.ts +1 -0
  338. package/types/signal/agent.signal.d.ts +24 -0
  339. package/types/signal/agentTurn.d.ts +9 -0
  340. package/types/signal/agentTurnStream.d.ts +24 -0
  341. package/types/signal/base.signal.d.ts +1 -1
  342. package/types/signal/endpointInfo.d.ts +21 -3
  343. package/types/signal/guard.d.ts +12 -0
  344. package/types/signal/guards.d.ts +23 -1
  345. package/types/signal/index.d.ts +6 -0
  346. package/types/signal/intercept.d.ts +2 -2
  347. package/types/signal/internalArg.d.ts +22 -6
  348. package/types/signal/mcp/McpDocument.d.ts +84 -0
  349. package/types/signal/mcp/McpProgress.d.ts +40 -0
  350. package/types/signal/mcp/McpUriTemplate.d.ts +25 -0
  351. package/types/signal/mcp/Msg.d.ts +143 -0
  352. package/types/signal/mcp/index.d.ts +5 -0
  353. package/types/signal/mcp/mcpProtocol.d.ts +107 -0
  354. package/types/signal/mcp.d.ts +1 -0
  355. package/types/signal/middleware.d.ts +7 -7
  356. package/types/signal/openapi/openapi.d.ts +3 -3
  357. package/types/signal/schema/JsonSchemaBuilder.d.ts +51 -0
  358. package/types/signal/schema/index.d.ts +1 -0
  359. package/types/signal/schema.d.ts +1 -0
  360. package/types/signal/signalContext.d.ts +67 -8
  361. package/types/signal/slice.d.ts +42 -15
  362. package/types/signal/trace.d.ts +52 -2
  363. package/types/signal/types.d.ts +53 -4
  364. package/types/store/action.d.ts +7 -5
  365. package/types/store/actionTag.d.ts +21 -0
  366. package/types/store/agent/AgentBridge.d.ts +37 -0
  367. package/types/store/agent/AgentContext.d.ts +16 -0
  368. package/types/store/agent/AgentPrompts.d.ts +31 -0
  369. package/types/store/agent/ScreenReader.d.ts +29 -0
  370. package/types/store/agent/ScreenSettle.d.ts +22 -0
  371. package/types/store/agent/ScreenTarget.d.ts +34 -0
  372. package/types/store/agent/StoreCatalogue.d.ts +26 -0
  373. package/types/store/agent/StoreSurfaceSource.d.ts +30 -0
  374. package/types/store/agent/index.d.ts +11 -0
  375. package/types/store/agent/storeSurface.d.ts +14 -0
  376. package/types/store/agent/types.d.ts +15 -0
  377. package/types/store/agent.d.ts +1 -0
  378. package/types/store/agentic/AgentValue.d.ts +43 -0
  379. package/types/store/agentic/StExposeBuilder.d.ts +21 -0
  380. package/types/store/agentic/StExposeDraft.d.ts +13 -0
  381. package/types/store/agentic/StStateBuilder.d.ts +21 -0
  382. package/types/store/agentic/StStateDraft.d.ts +12 -0
  383. package/types/store/agentic/StToolBuilder.d.ts +56 -0
  384. package/types/store/agentic/StToolDraft.d.ts +13 -0
  385. package/types/store/agentic/attachAgentic.d.ts +25 -0
  386. package/types/store/agentic/formFields.d.ts +53 -0
  387. package/types/store/agentic/index.d.ts +12 -0
  388. package/types/store/agentic/useFieldTool.d.ts +22 -0
  389. package/types/store/agentic/useFormTools.d.ts +19 -0
  390. package/types/store/agentic/useRelationFieldTool.d.ts +27 -0
  391. package/types/store/agentic.d.ts +1 -0
  392. package/types/store/baseSt.d.ts +35 -39
  393. package/types/store/databaseStateNames.d.ts +25 -0
  394. package/types/store/formSetterNames.d.ts +30 -0
  395. package/types/store/index.d.ts +7 -0
  396. package/types/store/rootStore.d.ts +5 -1
  397. package/types/store/sliceRole.d.ts +25 -0
  398. package/types/store/store.d.ts +5 -1
  399. package/types/store/storeInstance.d.ts +33 -1
  400. package/types/store/storeRegistry.d.ts +5 -0
  401. package/types/store/types.d.ts +4 -0
  402. package/types/store/withSelector.d.ts +5 -4
  403. package/types/test/index.d.ts +1 -1
  404. package/types/test/registerDom.d.ts +1 -0
  405. package/types/test/signalTestRuntime.d.ts +2 -3
  406. package/types/test/testServer.d.ts +6 -4
  407. package/types/ui/Agent/Approval.d.ts +8 -0
  408. package/types/ui/Agent/Attach.d.ts +16 -0
  409. package/types/ui/Agent/Bubble.d.ts +26 -0
  410. package/types/ui/Agent/Chat.d.ts +91 -0
  411. package/types/ui/Agent/ChatCommands.d.ts +34 -0
  412. package/types/ui/Agent/Composer.d.ts +23 -0
  413. package/types/ui/Agent/Context.d.ts +13 -0
  414. package/types/ui/Agent/Dock.d.ts +17 -0
  415. package/types/ui/Agent/Guide.d.ts +9 -0
  416. package/types/ui/Agent/History.d.ts +26 -0
  417. package/types/ui/Agent/Launcher.d.ts +16 -0
  418. package/types/ui/Agent/Markdown.d.ts +19 -0
  419. package/types/ui/Agent/Menu.d.ts +18 -0
  420. package/types/ui/Agent/Mic.d.ts +8 -0
  421. package/types/ui/Agent/Question.d.ts +14 -0
  422. package/types/ui/Agent/Section.d.ts +10 -0
  423. package/types/ui/Agent/Skip.d.ts +22 -0
  424. package/types/ui/Agent/StateKey.d.ts +16 -0
  425. package/types/ui/Agent/Tool.d.ts +15 -0
  426. package/types/ui/Agent/Transcript.d.ts +13 -0
  427. package/types/ui/Agent/Zone.d.ts +48 -0
  428. package/types/ui/Agent/agentSessionOf.d.ts +27 -0
  429. package/types/ui/Agent/attachment.d.ts +34 -0
  430. package/types/ui/Agent/fetchRunner.d.ts +12 -0
  431. package/types/ui/Agent/index.d.ts +19 -0
  432. package/types/ui/Agent/index_.d.ts +1 -0
  433. package/types/ui/Agent/markdownBlocks.d.ts +35 -0
  434. package/types/ui/Agent/markdownSpans.d.ts +2 -0
  435. package/types/ui/Agent/markdownTable.d.ts +16 -0
  436. package/types/ui/Agent/sessionHistory.d.ts +14 -0
  437. package/types/ui/Agent/sessionView.d.ts +15 -0
  438. package/types/ui/Agent/tokenCount.d.ts +6 -0
  439. package/types/ui/Agent/useChatAttachments.d.ts +24 -0
  440. package/types/ui/Agent/useChatVoice.d.ts +30 -0
  441. package/types/ui/Agent/useDraftRecall.d.ts +14 -0
  442. package/types/ui/Agent/useKeyboardInset.d.ts +8 -0
  443. package/types/ui/Agent/useSlashMenu.d.ts +24 -0
  444. package/types/ui/Agent/voice.d.ts +71 -0
  445. package/types/ui/Agent.d.ts +1 -0
  446. package/types/ui/Badge.d.ts +1 -1
  447. package/types/ui/Button.d.ts +1 -1
  448. package/types/ui/Constant/Graph.d.ts +10 -0
  449. package/types/ui/Constant/index.d.ts +2 -1
  450. package/types/ui/Constant/schemaGraph.d.ts +39 -0
  451. package/types/ui/Data/Dashboard.d.ts +16 -3
  452. package/types/ui/Data/Insight.d.ts +1 -1
  453. package/types/ui/Data/ListContainer.d.ts +15 -7
  454. package/types/ui/Data/QueryMaker.d.ts +45 -3
  455. package/types/ui/Data/RefPicker.d.ts +16 -0
  456. package/types/ui/Data/dataExport.d.ts +5 -0
  457. package/types/ui/Data/dataText.d.ts +6 -0
  458. package/types/ui/Data/index.d.ts +2 -0
  459. package/types/ui/Data/index_.d.ts +1 -0
  460. package/types/ui/DatePicker.d.ts +15 -11
  461. package/types/ui/Dialog/LegacyModal.d.ts +13 -0
  462. package/types/ui/Dialog/Provider.d.ts +3 -1
  463. package/types/ui/Dialog/context.d.ts +9 -1
  464. package/types/ui/Dialog/index.d.ts +1 -0
  465. package/types/ui/DraggableList.d.ts +1 -1
  466. package/types/ui/Dropdown.d.ts +5 -1
  467. package/types/ui/Field.d.ts +13 -12
  468. package/types/ui/Layout/BottomTab.d.ts +3 -2
  469. package/types/ui/LegacyModal.d.ts +24 -0
  470. package/types/ui/Loading/ProgressBar.d.ts +4 -0
  471. package/types/ui/Loading/Spin.d.ts +2 -1
  472. package/types/ui/Model/AdminPanel.d.ts +15 -3
  473. package/types/ui/Model/EditModal.d.ts +1 -1
  474. package/types/ui/Model/New.d.ts +3 -1
  475. package/types/ui/Model/NewWrapper.d.ts +2 -0
  476. package/types/ui/Model/NewWrapper_Client.d.ts +2 -1
  477. package/types/ui/Pagination.d.ts +2 -2
  478. package/types/ui/Radio.d.ts +1 -1
  479. package/types/ui/RecentTime.d.ts +18 -1
  480. package/types/ui/Reference/Collapse.d.ts +11 -0
  481. package/types/ui/Reference/Panel.d.ts +29 -0
  482. package/types/ui/Reference/Segmented.d.ts +17 -0
  483. package/types/ui/Reference/Summary.d.ts +13 -0
  484. package/types/ui/Reference/Toolbar.d.ts +21 -0
  485. package/types/ui/Reference/dictText.d.ts +6 -0
  486. package/types/ui/Reference/index.d.ts +7 -0
  487. package/types/ui/Reference/style.d.ts +20 -0
  488. package/types/ui/Reference.d.ts +1 -0
  489. package/types/ui/ScreenNavigator.d.ts +3 -1
  490. package/types/ui/Signal/Arg.d.ts +7 -3
  491. package/types/ui/Signal/Doc.d.ts +4 -6
  492. package/types/ui/Signal/Object.d.ts +2 -1
  493. package/types/ui/Signal/RestApi.d.ts +2 -1
  494. package/types/ui/Signal/WebSocket.d.ts +2 -1
  495. package/types/ui/Signal/endpointEntries.d.ts +20 -0
  496. package/types/ui/Signal/style.d.ts +9 -8
  497. package/types/ui/System/Client.d.ts +1 -2
  498. package/types/ui/System/Common.d.ts +3 -4
  499. package/types/ui/System/Messages.d.ts +1 -1
  500. package/types/ui/Tab/Provider.d.ts +3 -1
  501. package/types/ui/Tab/context.d.ts +4 -2
  502. package/types/ui/ToggleSelect.d.ts +1 -0
  503. package/types/ui/UiOverride/context.d.ts +18 -1
  504. package/types/ui/agentAttrs.d.ts +14 -0
  505. package/types/ui/index.d.ts +22 -1
  506. package/types/ui/overlayLayer.d.ts +13 -0
  507. package/types/ui/overlayPosition.d.ts +28 -0
  508. package/types/ui/recipe/badgeRecipe.d.ts +2 -2
  509. package/types/ui/recipe/buttonRecipe.d.ts +2 -2
  510. package/types/vendor/use-agentic/AgentAbort.d.ts +17 -0
  511. package/types/vendor/use-agentic/AgentProgress.d.ts +27 -0
  512. package/types/vendor/use-agentic/AgentProvider.d.ts +17 -0
  513. package/types/vendor/use-agentic/AgentScope.d.ts +9 -0
  514. package/types/vendor/use-agentic/AgentSession.d.ts +163 -0
  515. package/types/vendor/use-agentic/Agentic.d.ts +21 -0
  516. package/types/vendor/use-agentic/AgenticSurface.d.ts +58 -0
  517. package/types/vendor/use-agentic/Compaction.d.ts +48 -0
  518. package/types/vendor/use-agentic/ToolOutput.d.ts +21 -0
  519. package/types/vendor/use-agentic/Transcript.d.ts +18 -0
  520. package/types/vendor/use-agentic/httpRunner.d.ts +15 -0
  521. package/types/vendor/use-agentic/index.d.ts +19 -0
  522. package/types/vendor/use-agentic/sharedContext.d.ts +15 -0
  523. package/types/vendor/use-agentic/surfaceContext.d.ts +5 -0
  524. package/types/vendor/use-agentic/types.d.ts +182 -0
  525. package/types/vendor/use-agentic/useAgent.d.ts +4 -0
  526. package/types/vendor/use-agentic/useAgentGuide.d.ts +6 -0
  527. package/types/vendor/use-agentic/useAgentResource.d.ts +12 -0
  528. package/types/vendor/use-agentic/useAgentState.d.ts +16 -0
  529. package/types/vendor/use-agentic/useAgentTool.d.ts +16 -0
  530. package/types/vendor/use-agentic.d.ts +1 -0
  531. package/types/webkit/index.d.ts +4 -0
  532. package/types/webkit/useBodyScrollLock.d.ts +2 -0
  533. package/types/webkit/usePageTool.d.ts +19 -0
  534. package/types/webkit/useScreenScope.d.ts +25 -0
  535. package/ui/Agent/Approval.tsx +32 -0
  536. package/ui/Agent/Attach.tsx +77 -0
  537. package/ui/Agent/Bubble.tsx +192 -0
  538. package/ui/Agent/Chat.tsx +525 -0
  539. package/ui/Agent/ChatCommands.ts +141 -0
  540. package/ui/Agent/Composer.tsx +94 -0
  541. package/ui/Agent/Context.tsx +49 -0
  542. package/ui/Agent/Dock.tsx +77 -0
  543. package/ui/Agent/Guide.tsx +16 -0
  544. package/ui/Agent/History.tsx +49 -0
  545. package/ui/Agent/Launcher.tsx +60 -0
  546. package/ui/Agent/Markdown.tsx +142 -0
  547. package/ui/Agent/Menu.tsx +55 -0
  548. package/ui/Agent/Mic.tsx +27 -0
  549. package/ui/Agent/Question.tsx +63 -0
  550. package/ui/Agent/Section.tsx +24 -0
  551. package/ui/Agent/Skip.tsx +30 -0
  552. package/ui/Agent/StateKey.tsx +46 -0
  553. package/ui/Agent/Tool.tsx +59 -0
  554. package/ui/Agent/Transcript.tsx +33 -0
  555. package/ui/Agent/Zone.tsx +116 -0
  556. package/ui/Agent/agentSessionOf.ts +60 -0
  557. package/ui/Agent/attachment.ts +73 -0
  558. package/ui/Agent/fetchRunner.ts +44 -0
  559. package/ui/Agent/index.ts +27 -0
  560. package/ui/Agent/index_.tsx +4 -0
  561. package/ui/Agent/markdownBlocks.ts +137 -0
  562. package/ui/Agent/markdownSpans.tsx +49 -0
  563. package/ui/Agent/markdownTable.ts +54 -0
  564. package/ui/Agent/sessionHistory.ts +62 -0
  565. package/ui/Agent/sessionView.ts +38 -0
  566. package/ui/Agent/tokenCount.ts +10 -0
  567. package/ui/Agent/useChatAttachments.ts +84 -0
  568. package/ui/Agent/useChatVoice.ts +129 -0
  569. package/ui/Agent/useDraftRecall.ts +42 -0
  570. package/ui/Agent/useKeyboardInset.ts +26 -0
  571. package/ui/Agent/useSlashMenu.ts +58 -0
  572. package/ui/Agent/voice.ts +177 -0
  573. package/ui/Badge.tsx +1 -1
  574. package/ui/BottomSheet.tsx +32 -36
  575. package/ui/Button.tsx +3 -1
  576. package/ui/Clipboard.tsx +3 -6
  577. package/ui/Constant/Doc.tsx +265 -254
  578. package/ui/Constant/Graph.tsx +151 -0
  579. package/ui/Constant/index.ts +3 -2
  580. package/ui/Constant/schemaGraph.ts +232 -0
  581. package/ui/Data/CardList.tsx +14 -3
  582. package/ui/Data/Dashboard.tsx +70 -52
  583. package/ui/Data/Insight.tsx +18 -12
  584. package/ui/Data/Item.tsx +42 -56
  585. package/ui/Data/ListContainer.tsx +246 -132
  586. package/ui/Data/Pagination.tsx +10 -3
  587. package/ui/Data/QueryMaker.tsx +160 -11
  588. package/ui/Data/RefPicker.tsx +202 -0
  589. package/ui/Data/TableList.tsx +22 -13
  590. package/ui/Data/dataExport.ts +54 -0
  591. package/ui/Data/dataText.ts +22 -0
  592. package/ui/Data/index.ts +13 -1
  593. package/ui/Data/index_.tsx +1 -0
  594. package/ui/DatePicker.tsx +110 -128
  595. package/ui/Dialog/Close.tsx +3 -7
  596. package/ui/Dialog/LegacyModal.tsx +241 -0
  597. package/ui/Dialog/Modal.tsx +62 -195
  598. package/ui/Dialog/Provider.tsx +47 -3
  599. package/ui/Dialog/Trigger.tsx +3 -7
  600. package/ui/Dialog/context.ts +14 -2
  601. package/ui/Dialog/index.tsx +2 -0
  602. package/ui/DragAction.tsx +3 -2
  603. package/ui/DraggableList.tsx +9 -4
  604. package/ui/Dropdown.tsx +89 -27
  605. package/ui/Empty.tsx +6 -4
  606. package/ui/Field.tsx +128 -58
  607. package/ui/Input.tsx +27 -5
  608. package/ui/KeyboardAvoiding.tsx +2 -2
  609. package/ui/Layout/BottomTab.tsx +32 -37
  610. package/ui/Layout/Sider.tsx +37 -14
  611. package/ui/LegacyModal.tsx +53 -0
  612. package/ui/Link/CsrLink.tsx +1 -1
  613. package/ui/Load/Pagination.tsx +15 -8
  614. package/ui/Load/Units.tsx +30 -7
  615. package/ui/Load/View.tsx +10 -3
  616. package/ui/Loading/Area.tsx +7 -6
  617. package/ui/Loading/Button.tsx +7 -9
  618. package/ui/Loading/Input.tsx +7 -9
  619. package/ui/Loading/ProgressBar.tsx +16 -7
  620. package/ui/Loading/Skeleton.tsx +8 -13
  621. package/ui/Loading/Spin.tsx +20 -14
  622. package/ui/Menu.tsx +1 -1
  623. package/ui/Model/AdminPanel.tsx +52 -12
  624. package/ui/Model/EditModal.tsx +28 -6
  625. package/ui/Model/EditWrapper.tsx +16 -4
  626. package/ui/Model/New.tsx +4 -0
  627. package/ui/Model/NewWrapper.tsx +2 -0
  628. package/ui/Model/NewWrapper_Client.tsx +20 -6
  629. package/ui/Model/Remove.tsx +18 -6
  630. package/ui/Model/RemoveWrapper.tsx +12 -2
  631. package/ui/Model/SureToRemove.tsx +18 -6
  632. package/ui/Model/ViewEditModal.tsx +64 -15
  633. package/ui/Model/ViewModal.tsx +25 -11
  634. package/ui/Model/ViewWrapper.tsx +15 -4
  635. package/ui/Model/index_.tsx +1 -1
  636. package/ui/Pagination.tsx +51 -66
  637. package/ui/Popconfirm.tsx +88 -78
  638. package/ui/Radio.tsx +53 -24
  639. package/ui/RecentTime.tsx +83 -35
  640. package/ui/Reference/Collapse.tsx +26 -0
  641. package/ui/Reference/Panel.tsx +79 -0
  642. package/ui/Reference/Segmented.tsx +41 -0
  643. package/ui/Reference/Summary.tsx +25 -0
  644. package/ui/Reference/Toolbar.tsx +44 -0
  645. package/ui/Reference/dictText.ts +9 -0
  646. package/ui/Reference/index.ts +7 -0
  647. package/ui/Reference/style.ts +45 -0
  648. package/ui/ScreenNavigator.tsx +17 -2
  649. package/ui/Select.tsx +96 -57
  650. package/ui/Signal/Arg.tsx +83 -68
  651. package/ui/Signal/Doc.tsx +163 -129
  652. package/ui/Signal/Listener.tsx +40 -29
  653. package/ui/Signal/Message.tsx +87 -135
  654. package/ui/Signal/Object.tsx +79 -57
  655. package/ui/Signal/PubSub.tsx +72 -113
  656. package/ui/Signal/Request.tsx +2 -22
  657. package/ui/Signal/Response.tsx +19 -45
  658. package/ui/Signal/RestApi.tsx +170 -200
  659. package/ui/Signal/WebSocket.tsx +29 -26
  660. package/ui/Signal/endpointEntries.ts +59 -0
  661. package/ui/Signal/makeExample.ts +10 -3
  662. package/ui/Signal/style.ts +34 -29
  663. package/ui/Switch.tsx +4 -0
  664. package/ui/System/CSR.tsx +1 -1
  665. package/ui/System/Client.tsx +31 -15
  666. package/ui/System/Common.tsx +3 -4
  667. package/ui/System/DevModeToggle.tsx +1 -1
  668. package/ui/System/Gtag.tsx +2 -2
  669. package/ui/System/Messages.tsx +52 -31
  670. package/ui/System/Reconnect.tsx +22 -56
  671. package/ui/System/SelectLanguage.tsx +24 -15
  672. package/ui/System/ThemeToggle.tsx +25 -13
  673. package/ui/Tab/Menu.tsx +24 -12
  674. package/ui/Tab/Menus.tsx +6 -3
  675. package/ui/Tab/Provider.tsx +30 -3
  676. package/ui/Tab/context.ts +8 -4
  677. package/ui/Table.tsx +66 -60
  678. package/ui/ToggleSelect.tsx +8 -7
  679. package/ui/Tooltip.tsx +15 -1
  680. package/ui/UiOverride/context.ts +21 -2
  681. package/ui/Unauthorized.tsx +6 -4
  682. package/ui/agentAttrs.ts +19 -0
  683. package/ui/index.ts +49 -1
  684. package/ui/overlayLayer.ts +12 -2
  685. package/ui/overlayPosition.ts +104 -0
  686. package/ui/recipe/buttonRecipe.ts +2 -2
  687. package/ui/styles.css +31 -0
  688. package/vendor/use-agentic/AgentAbort.ts +29 -0
  689. package/vendor/use-agentic/AgentProgress.ts +40 -0
  690. package/vendor/use-agentic/AgentProvider.tsx +39 -0
  691. package/vendor/use-agentic/AgentScope.tsx +20 -0
  692. package/vendor/use-agentic/AgentSession.ts +750 -0
  693. package/vendor/use-agentic/Agentic.tsx +44 -0
  694. package/vendor/use-agentic/AgenticSurface.ts +333 -0
  695. package/vendor/use-agentic/Compaction.ts +120 -0
  696. package/vendor/use-agentic/ToolOutput.ts +60 -0
  697. package/vendor/use-agentic/Transcript.ts +50 -0
  698. package/vendor/use-agentic/WIRE.md +86 -0
  699. package/vendor/use-agentic/httpRunner.ts +131 -0
  700. package/vendor/use-agentic/index.ts +20 -0
  701. package/vendor/use-agentic/sharedContext.ts +25 -0
  702. package/vendor/use-agentic/surfaceContext.ts +10 -0
  703. package/vendor/use-agentic/types.ts +192 -0
  704. package/vendor/use-agentic/useAgent.ts +18 -0
  705. package/vendor/use-agentic/useAgentGuide.ts +16 -0
  706. package/vendor/use-agentic/useAgentResource.ts +36 -0
  707. package/vendor/use-agentic/useAgentState.ts +64 -0
  708. package/vendor/use-agentic/useAgentTool.ts +55 -0
  709. package/webkit/bootCsr.tsx +10 -8
  710. package/webkit/index.ts +4 -0
  711. package/webkit/lazy.tsx +5 -1
  712. package/webkit/useBodyScrollLock.tsx +29 -0
  713. package/webkit/useFrameRuntime.ts +1 -1
  714. package/webkit/usePageTool.tsx +37 -0
  715. package/webkit/useScreenScope.tsx +60 -0
  716. package/types/ui/Constant/Mermaid.d.ts +0 -8
  717. package/types/ui/Signal/Collapse.d.ts +0 -12
  718. package/ui/Constant/Mermaid.tsx +0 -149
  719. package/ui/Signal/Collapse.tsx +0 -29
package/common/Logger.ts CHANGED
@@ -1,17 +1,64 @@
1
1
  import dayjs from "dayjs";
2
+ import { type LogContextSnapshot, readLogContext } from "./logContext";
2
3
 
3
- const logLevels = ["trace", "verbose", "debug", "log", "info", "warn", "error"] as const;
4
+ export const logLevels = ["trace", "verbose", "debug", "info", "warn", "error"] as const;
4
5
  export type LogLevel = (typeof logLevels)[number];
6
+ export type LogLevelInput = LogLevel | "log";
7
+
8
+ export const logSeverity = { trace: 1, verbose: 3, debug: 5, info: 9, warn: 13, error: 17 } as const satisfies {
9
+ [key in LogLevel]: number;
10
+ };
11
+
12
+ /** `text` is the human console line; the `ndjson` pair make the container's stdout one JSON record per line. */
13
+ export const logFormats = ["text", "ndjson", "ndjson-only"] as const;
14
+ export type LogFormat = (typeof logFormats)[number];
15
+
16
+ export type LogAttrValue = string | number | boolean | null;
17
+ export interface LogAttrs {
18
+ [key: string]: LogAttrValue;
19
+ }
20
+
21
+ export interface LogRecord {
22
+ at: number;
23
+ /** Milliseconds since the producing process started — what the `+Nms` in the rendered line shows. */
24
+ elapsedMs: number;
25
+ level: LogLevel | null;
26
+ sev: number;
27
+ name: string;
28
+ context: string;
29
+ message: string;
30
+ stream: "stdout" | "stderr";
31
+ pid: number | null;
32
+ replicaIdx: number | null;
33
+ role: string | null;
34
+ origin: string | null;
35
+ traceId: string | null;
36
+ endpoint: string | null;
37
+ attrs?: LogAttrs;
38
+ }
5
39
 
6
40
  export interface LoggerSinkEntry {
7
41
  stream: "stdout" | "stderr";
8
42
  level?: LogLevel;
9
43
  message: string;
10
44
  plainMessage: string;
45
+ record: LogRecord;
11
46
  }
12
47
 
13
48
  export type LoggerSink = (entry: LoggerSinkEntry) => void | Promise<void>;
14
49
 
50
+ export interface LoggerSinkOptions {
51
+ minLevel?: LogLevelInput;
52
+ }
53
+
54
+ export interface LoggerEmitInput {
55
+ level: LogLevel;
56
+ name: string;
57
+ message: string;
58
+ context?: string;
59
+ attrs?: LogAttrs;
60
+ }
61
+
15
62
  const clc = {
16
63
  bold: (text: string) => `\x1B[1m${text}\x1B[0m`,
17
64
  green: (text: string) => `\x1B[32m${text}\x1B[39m`,
@@ -25,7 +72,6 @@ const colorizeMap: { [key in LogLevel]: (text: string) => string } = {
25
72
  trace: clc.bold,
26
73
  verbose: clc.cyanBright,
27
74
  debug: clc.magentaBright,
28
- log: clc.green,
29
75
  info: clc.green,
30
76
  warn: clc.yellow,
31
77
  error: clc.red,
@@ -33,36 +79,122 @@ const colorizeMap: { [key in LogLevel]: (text: string) => string } = {
33
79
 
34
80
  const ansiPattern = new RegExp(`${String.fromCharCode(27)}\\[[0-?]*[ -/]*[@-~]`, "g");
35
81
 
82
+ const redactedAttrKey = /password|passwd|token|jwt|authorization|cookie|secret|api[-_]?key|private[-_]?key/i;
83
+
36
84
  /** Log-level aware logger used by Akan runtime, CLI, and application services. */
37
85
  export class Logger {
38
- static level: LogLevel = (process.env?.AKAN_PUBLIC_LOG_LEVEL as LogLevel | undefined) ?? "log";
39
- static #levelIdx = logLevels.findIndex((l) => l === (process.env?.AKAN_PUBLIC_LOG_LEVEL ?? "log"));
40
- static fileLevel: LogLevel = (process.env?.AKAN_LOG_FILE_LEVEL as LogLevel | undefined) ?? "trace";
41
- static #fileLevelIdx = logLevels.findIndex((l) => l === (process.env?.AKAN_LOG_FILE_LEVEL ?? "trace"));
42
- static #startAt = dayjs();
43
- static #sinks = new Set<LoggerSink>();
44
-
45
- static setLevel(level: LogLevel) {
46
- Logger.level = level;
47
- Logger.#levelIdx = logLevels.indexOf(level);
48
- }
49
- static addSink(sink: LoggerSink) {
50
- Logger.#sinks.add(sink);
86
+ /** `AKAN_LOG_STDOUT_LEVEL` names what the container's stdout carries; without it the console level is that. */
87
+ static level: LogLevel = Logger.#levelFromEnv(
88
+ process.env?.AKAN_LOG_STDOUT_LEVEL,
89
+ Logger.#levelFromEnv(process.env?.AKAN_PUBLIC_LOG_LEVEL, "info"),
90
+ );
91
+ static fileLevel: LogLevel = Logger.#levelFromEnv(process.env?.AKAN_LOG_FILE_LEVEL, "trace");
92
+ static format: LogFormat = Logger.#formatFromEnv(process.env?.AKAN_LOG_FORMAT);
93
+ /** Which process this is (`gateway`, `all`, `batch`, `rsc-worker`); the owner sets it at boot. */
94
+ static role: string | null = process.env?.SERVER_MODE ?? null;
95
+ /**
96
+ * Whether this process writes its own lines to the terminal. Off in every server process of an ndjson
97
+ * deployment: the hub owner writes the one JSON stream, and a text line from anyone would corrupt it.
98
+ */
99
+ static consoleOutput = true;
100
+ /** Set by the trace layer when a flight recorder or a per-request debug floor can be active. */
101
+ static contextGate = false;
102
+ static readonly startAt = Date.now();
103
+ static #consoleSev: number = logSeverity[Logger.level];
104
+ static #fileSev: number = logSeverity[Logger.fileLevel];
105
+ static #sinkFloorSev = Number.POSITIVE_INFINITY;
106
+ static #sinks = new Map<LoggerSink, number | null>();
107
+
108
+ static setLevel(level: LogLevelInput) {
109
+ Logger.level = Logger.normalizeLevel(level);
110
+ Logger.#consoleSev = logSeverity[Logger.level];
111
+ }
112
+ static setFileLevel(level: LogLevelInput) {
113
+ Logger.fileLevel = Logger.normalizeLevel(level);
114
+ Logger.#fileSev = logSeverity[Logger.fileLevel];
115
+ Logger.#refreshSinkFloor();
116
+ }
117
+ static addSink(sink: LoggerSink, { minLevel }: LoggerSinkOptions = {}) {
118
+ Logger.#sinks.set(sink, minLevel === undefined ? null : logSeverity[Logger.normalizeLevel(minLevel)]);
119
+ Logger.#refreshSinkFloor();
51
120
  return () => Logger.removeSink(sink);
52
121
  }
53
122
  static removeSink(sink: LoggerSink) {
54
123
  Logger.#sinks.delete(sink);
55
- }
56
- static setFileLevel(level: LogLevel) {
57
- Logger.fileLevel = level;
58
- Logger.#fileLevelIdx = logLevels.indexOf(level);
124
+ Logger.#refreshSinkFloor();
59
125
  }
60
126
  static isVerbose() {
61
- return Logger.#levelIdx <= 1;
127
+ return Logger.#consoleSev <= logSeverity.verbose;
128
+ }
129
+ static get isNdjson() {
130
+ return Logger.format !== "text";
62
131
  }
63
132
  /** For hot-path callers that would otherwise build a message the level is about to discard. */
64
- static shouldLog(logLevel: LogLevel) {
65
- return Logger.#shouldLog(logLevel);
133
+ static shouldLog(logLevel: LogLevelInput) {
134
+ return Logger.#shouldLog(Logger.normalizeLevel(logLevel));
135
+ }
136
+ static normalizeLevel(level: LogLevelInput): LogLevel {
137
+ return level === "log" ? "info" : level;
138
+ }
139
+ /** The lowest named level whose severity is at least `sev`. */
140
+ static levelAtOrAbove(sev: number): LogLevel {
141
+ return logLevels.find((level) => logSeverity[level] >= sev) ?? "error";
142
+ }
143
+ static render(record: LogRecord): string {
144
+ const level = record.level;
145
+ if (level === null) return record.message;
146
+ const replicaMsg = record.replicaIdx === null ? "" : `#${record.replicaIdx} `;
147
+ const processMsg = Logger.#colorize(`[${record.name}] ${replicaMsg}${record.pid ?? "window"} -`, level);
148
+ const timestampMsg = dayjs(record.at).format("MM/DD/YYYY, HH:mm:ss A");
149
+ const logLevelMsg = Logger.#colorize(level.toUpperCase().padStart(7, " "), level);
150
+ const contextMsg = record.context ? clc.yellow(`[${record.context}] `) : "";
151
+ const contentMsg = Logger.#colorize(record.message, level);
152
+ const attrsMsg = record.attrs ? Logger.formatAttrs(record.attrs) : "";
153
+ const timeDiffMsg = clc.yellow(`+${record.elapsedMs}ms`);
154
+ return `${processMsg} ${timestampMsg} ${logLevelMsg} ${contextMsg} ${contentMsg}${attrsMsg ? ` ${attrsMsg}` : ""} ${timeDiffMsg}\n`;
155
+ }
156
+ /** `key=value` pairs; a string with whitespace is quoted so the line stays splittable. */
157
+ static formatAttrs(attrs: LogAttrs): string {
158
+ return Object.entries(attrs)
159
+ .map(
160
+ ([key, value]) =>
161
+ `${key}=${typeof value === "string" && /\s/.test(value) ? JSON.stringify(value) : String(value)}`,
162
+ )
163
+ .join(" ");
164
+ }
165
+ /**
166
+ * A record somebody asked for below the level — a failed call's flight recorder, a request carrying
167
+ * `x-akan-debug` — passes every floor between here and the reader; the floors exist to drop what nobody asked for.
168
+ */
169
+ static isPromoted(record: LogRecord) {
170
+ return record.attrs?.flight === true || record.attrs?.debug === true;
171
+ }
172
+ static redactAttrs(attrs: LogAttrs): LogAttrs {
173
+ let redacted: LogAttrs | null = null;
174
+ for (const key of Object.keys(attrs)) {
175
+ if (!redactedAttrKey.test(key)) continue;
176
+ redacted ??= { ...attrs };
177
+ redacted[key] = "[redacted]";
178
+ }
179
+ return redacted ?? attrs;
180
+ }
181
+ /** A structured record from a caller that has more than a sentence to say — the canonical request line. */
182
+ static emit({ level, name, message, context = "", attrs }: LoggerEmitInput) {
183
+ if (Logger.#shouldLog(level)) Logger.#write(name, message, context, level, attrs);
184
+ }
185
+ /**
186
+ * Writes records that were captured below the gate and are now promoted — a failed request's flight
187
+ * recorder. They bypass the console level, since not showing them is what the recorder was for, and reach
188
+ * sinks under their own floors; each is marked `flight` so a reader knows why a trace line appears at info.
189
+ */
190
+ static replay(records: LogRecord[], { evicted = 0 }: { evicted?: number } = {}) {
191
+ records.forEach((record, idx) => {
192
+ const attrs: LogAttrs = { ...record.attrs, flight: true };
193
+ if (idx === 0 && evicted > 0) attrs.flightEvicted = evicted;
194
+ const entry = Logger.#entry({ ...record, attrs });
195
+ Logger.#emit(entry);
196
+ Logger.#writeConsole(entry);
197
+ });
66
198
  }
67
199
 
68
200
  name?: string;
@@ -70,25 +202,26 @@ export class Logger {
70
202
  this.name = name;
71
203
  }
72
204
  trace(msg: string, context = "", name = this.name ?? "App") {
73
- if (Logger.#shouldLog("trace")) Logger.#printMessages(name, msg, context, "trace");
205
+ if (Logger.#shouldLog("trace")) Logger.#write(name, msg, context, "trace");
74
206
  }
75
207
  verbose(msg: string, context = "", name = this.name ?? "App") {
76
- if (Logger.#shouldLog("verbose")) Logger.#printMessages(name, msg, context, "verbose");
208
+ if (Logger.#shouldLog("verbose")) Logger.#write(name, msg, context, "verbose");
77
209
  }
78
210
  debug(msg: string, context = "", name = this.name ?? "App") {
79
- if (Logger.#shouldLog("debug")) Logger.#printMessages(name, msg, context, "debug");
211
+ if (Logger.#shouldLog("debug")) Logger.#write(name, msg, context, "debug");
80
212
  }
213
+ /** @deprecated Emits at `info`; call `info()`. */
81
214
  log(msg: string, context = "", name = this.name ?? "App") {
82
- if (Logger.#shouldLog("log")) Logger.#printMessages(name, msg, context, "log");
215
+ if (Logger.#shouldLog("info")) Logger.#write(name, msg, context, "info");
83
216
  }
84
217
  info(msg: string, context = "", name = this.name ?? "App") {
85
- if (Logger.#shouldLog("info")) Logger.#printMessages(name, msg, context, "info");
218
+ if (Logger.#shouldLog("info")) Logger.#write(name, msg, context, "info");
86
219
  }
87
220
  warn(msg: string, context = "", name = this.name ?? "App") {
88
- if (Logger.#shouldLog("warn")) Logger.#printMessages(name, msg, context, "warn");
221
+ if (Logger.#shouldLog("warn")) Logger.#write(name, msg, context, "warn");
89
222
  }
90
223
  error(msg: string, context = "", name = this.name ?? "App") {
91
- if (Logger.#shouldLog("error")) Logger.#printMessages(name, msg, context, "error");
224
+ if (Logger.#shouldLog("error")) Logger.#write(name, msg, context, "error");
92
225
  }
93
226
  raw(msg: string, method?: "console" | "process") {
94
227
  Logger.rawLog(msg, method);
@@ -96,86 +229,166 @@ export class Logger {
96
229
  rawLog(msg: string, method?: "console" | "process") {
97
230
  Logger.rawLog(msg, method);
98
231
  }
99
-
100
232
  static trace(msg: string, context = "", name = "App") {
101
- if (Logger.#shouldLog("trace")) Logger.#printMessages(name, msg, context, "trace");
233
+ if (Logger.#shouldLog("trace")) Logger.#write(name, msg, context, "trace");
102
234
  }
103
235
  static verbose(msg: string, context = "", name = "App") {
104
- if (Logger.#shouldLog("verbose")) Logger.#printMessages(name, msg, context, "verbose");
236
+ if (Logger.#shouldLog("verbose")) Logger.#write(name, msg, context, "verbose");
105
237
  }
106
238
  static debug(msg: string, context = "", name = "App") {
107
- if (Logger.#shouldLog("debug")) Logger.#printMessages(name, msg, context, "debug");
239
+ if (Logger.#shouldLog("debug")) Logger.#write(name, msg, context, "debug");
108
240
  }
241
+ /** @deprecated Emits at `info`; call `info()`. */
109
242
  static log(msg: string, context = "", name = "App") {
110
- if (Logger.#shouldLog("log")) Logger.#printMessages(name, msg, context, "log");
243
+ if (Logger.#shouldLog("info")) Logger.#write(name, msg, context, "info");
111
244
  }
112
245
  static info(msg: string, context = "", name = "App") {
113
- if (Logger.#shouldLog("info")) Logger.#printMessages(name, msg, context, "info");
246
+ if (Logger.#shouldLog("info")) Logger.#write(name, msg, context, "info");
114
247
  }
115
248
  static warn(msg: string, context = "", name = "App") {
116
- if (Logger.#shouldLog("warn")) Logger.#printMessages(name, msg, context, "warn");
249
+ if (Logger.#shouldLog("warn")) Logger.#write(name, msg, context, "warn");
117
250
  }
118
251
  static error(msg: string, context = "", name = "App") {
119
- if (Logger.#shouldLog("error")) Logger.#printMessages(name, msg, context, "error");
252
+ if (Logger.#shouldLog("error")) Logger.#write(name, msg, context, "error");
253
+ }
254
+ static #levelFromEnv(value: string | undefined, fallback: LogLevel): LogLevel {
255
+ if (value === "log") return "info";
256
+ return (logLevels as readonly string[]).includes(value ?? "") ? (value as LogLevel) : fallback;
257
+ }
258
+ static #formatFromEnv(value: string | undefined): LogFormat {
259
+ return (logFormats as readonly string[]).includes(value ?? "") ? (value as LogFormat) : "text";
260
+ }
261
+ static #refreshSinkFloor() {
262
+ let floor = Number.POSITIVE_INFINITY;
263
+ for (const minSev of Logger.#sinks.values()) floor = Math.min(floor, minSev ?? Logger.#fileSev);
264
+ Logger.#sinkFloorSev = floor;
120
265
  }
121
266
  static #colorize(msg: string, logLevel: LogLevel) {
122
267
  return colorizeMap[logLevel](msg);
123
268
  }
124
- static #stripAnsi(msg: string) {
269
+ static stripAnsi(msg: string) {
125
270
  return msg.replace(ansiPattern, "");
126
271
  }
127
272
  static #shouldLog(logLevel: LogLevel) {
128
- return Logger.#shouldWriteConsole(logLevel) || Logger.#shouldEmitSink(logLevel);
273
+ if (Logger.#shouldWriteConsole(logLevel) || Logger.#shouldEmitSink(logLevel)) return true;
274
+ return Logger.contextGate && Logger.#contextFloor(readLogContext()) <= logSeverity[logLevel];
129
275
  }
130
276
  static #shouldWriteConsole(logLevel: LogLevel) {
131
- return Logger.#levelIdx <= logLevels.indexOf(logLevel);
277
+ return Logger.consoleOutput && logSeverity[logLevel] >= Logger.#consoleSev;
132
278
  }
133
279
  static #shouldEmitSink(logLevel: LogLevel) {
134
- return Logger.#sinks.size > 0 && Logger.#fileLevelIdx <= logLevels.indexOf(logLevel);
280
+ return logSeverity[logLevel] >= Logger.#sinkFloorSev;
281
+ }
282
+ /** The lowest severity the ambient request wants captured or shown, or +∞ outside one. */
283
+ static #contextFloor(ctx: LogContextSnapshot | undefined) {
284
+ if (!ctx) return Number.POSITIVE_INFINITY;
285
+ return Math.min(ctx.flight?.minSev ?? Number.POSITIVE_INFINITY, ctx.debugSev ?? Number.POSITIVE_INFINITY);
286
+ }
287
+ static #buildRecord(
288
+ name: string | undefined,
289
+ message: string,
290
+ context: string,
291
+ level: LogLevel | null,
292
+ stream: "stdout" | "stderr",
293
+ ctx: LogContextSnapshot | undefined,
294
+ attrs?: LogAttrs,
295
+ ): LogRecord {
296
+ const proc = process as unknown as NodeJS.Process | undefined;
297
+ const replicaIdx = Number(proc?.env?.AKAN_REPLICA_IDX ?? Number.NaN);
298
+ const at = Date.now();
299
+ return {
300
+ at,
301
+ elapsedMs: at - Logger.startAt,
302
+ level,
303
+ sev: level === null ? 0 : logSeverity[level],
304
+ name: name ?? "App",
305
+ context,
306
+ message,
307
+ stream,
308
+ pid: proc?.pid ?? null,
309
+ replicaIdx: Number.isNaN(replicaIdx) ? null : replicaIdx,
310
+ role: Logger.role,
311
+ origin: ctx?.origin ?? null,
312
+ traceId: ctx?.traceId ?? null,
313
+ endpoint: ctx?.endpoint ?? null,
314
+ ...(attrs ? { attrs: Logger.redactAttrs(attrs) } : {}),
315
+ };
316
+ }
317
+ static #entry(record: LogRecord, text?: string): LoggerSinkEntry {
318
+ let message = text;
319
+ let plainMessage: string | undefined;
320
+ return {
321
+ stream: record.stream,
322
+ level: record.level ?? undefined,
323
+ record,
324
+ get message() {
325
+ message ??= Logger.render(record);
326
+ return message;
327
+ },
328
+ get plainMessage() {
329
+ plainMessage ??= Logger.stripAnsi(this.message);
330
+ return plainMessage;
331
+ },
332
+ };
135
333
  }
136
334
  static #emit(entry: LoggerSinkEntry) {
137
- for (const sink of Logger.#sinks) {
335
+ for (const [sink, minSev] of Logger.#sinks) {
336
+
337
+ if (
338
+ entry.record.level !== null &&
339
+ entry.record.sev < (minSev ?? Logger.#fileSev) &&
340
+ !Logger.isPromoted(entry.record)
341
+ )
342
+ continue;
138
343
  try {
139
344
  void Promise.resolve(sink(entry)).catch(() => undefined);
140
345
  } catch {
141
346
  }
142
347
  }
143
348
  }
144
- static #printMessages(
145
- name: string | undefined,
146
- content: string,
147
- context: string,
148
- logLevel: LogLevel,
149
- writeStreamType: "stdout" | "stderr" = logLevel === "error" ? "stderr" : "stdout",
150
- ) {
151
- const now = dayjs();
152
- const replicaIdx = (process as unknown as NodeJS.Process | undefined)?.env?.AKAN_REPLICA_IDX;
153
- const replicaMsg = replicaIdx === undefined ? "" : `#${replicaIdx} `;
154
- const processMsg = Logger.#colorize(
155
- `[${name ?? "App"}] ${replicaMsg}${(process as unknown as NodeJS.Process | undefined)?.pid ?? "window"} -`,
349
+ static #writeConsole(entry: LoggerSinkEntry) {
350
+ if (!Logger.consoleOutput) return;
351
+ if (typeof window === "undefined")
352
+ (process[entry.stream] as unknown as NodeJS.WriteStream | undefined)?.write(entry.message);
353
+ else console.log(entry.message);
354
+ }
355
+ static #write(name: string | undefined, message: string, context: string, logLevel: LogLevel, attrs?: LogAttrs) {
356
+ const stream = logLevel === "error" ? "stderr" : "stdout";
357
+ const ctx = readLogContext();
358
+ const sev = logSeverity[logLevel];
359
+ const debug = ctx?.debugSev !== undefined && ctx.debugSev !== null && sev >= ctx.debugSev;
360
+
361
+ const promoted = debug && sev < Logger.#consoleSev;
362
+ const record = Logger.#buildRecord(
363
+ name,
364
+ message,
365
+ context,
156
366
  logLevel,
367
+ stream,
368
+ ctx,
369
+ promoted ? { ...attrs, debug: true } : attrs,
157
370
  );
158
- const timestampMsg = now.format("MM/DD/YYYY, HH:mm:ss A");
159
- const logLevelMsg = Logger.#colorize(logLevel.toUpperCase().padStart(7, " "), logLevel);
160
- const contextMsg = context ? clc.yellow(`[${context}] `) : "";
161
- const contentMsg = Logger.#colorize(content, logLevel);
162
- const timeDiffMsg = clc.yellow(`+${now.diff(Logger.#startAt, "ms")}ms`);
163
- const message = `${processMsg} ${timestampMsg} ${logLevelMsg} ${contextMsg} ${contentMsg} ${timeDiffMsg}\n`;
164
- if (Logger.#shouldEmitSink(logLevel))
165
- Logger.#emit({ stream: writeStreamType, level: logLevel, message, plainMessage: Logger.#stripAnsi(message) });
166
- if (!Logger.#shouldWriteConsole(logLevel)) return;
167
- if (typeof window === "undefined")
168
- (process[writeStreamType] as unknown as NodeJS.WriteStream | undefined)?.write(message);
169
- else console.log(message);
371
+ const toConsole = Logger.#shouldWriteConsole(logLevel) || (debug && Logger.consoleOutput);
372
+ const toSinks = Logger.#shouldEmitSink(logLevel) || debug;
373
+ ctx?.flight?.capture(record, toConsole || toSinks);
374
+ if (!toConsole && !toSinks) return;
375
+ const entry = Logger.#entry(record);
376
+ if (toSinks) Logger.#emit(entry);
377
+ if (toConsole) Logger.#writeConsole(entry);
170
378
  }
171
379
  static rawLog(msg = "", method?: "console" | "process", outputStream?: "log" | "error") {
172
380
  Logger.raw(`${msg}\n`, method, outputStream);
173
381
  }
174
382
  static raw(msg = "", method?: "console" | "process", outputStream?: "log" | "error") {
175
383
  const stream = outputStream === "error" ? "stderr" : "stdout";
176
- Logger.#emit({ stream, message: msg, plainMessage: Logger.#stripAnsi(msg) });
384
+ Logger.#emit(Logger.#entry(Logger.#buildRecord(undefined, msg, "", null, stream, readLogContext()), msg));
385
+ if (!Logger.consoleOutput) return;
177
386
  if (typeof window === "undefined" && method !== "console" && (process as unknown as NodeJS.Process | undefined))
178
387
  process[stream].write(msg);
179
388
  else console[outputStream === "error" ? "error" : "log"](msg.trim());
180
389
  }
390
+ static {
391
+ if (process.env?.AKAN_PUBLIC_LOG_LEVEL === "log" && typeof window === "undefined")
392
+ Logger.warn("AKAN_PUBLIC_LOG_LEVEL=log is deprecated and now means info; set AKAN_PUBLIC_LOG_LEVEL=info.");
393
+ }
181
394
  }
@@ -0,0 +1,40 @@
1
+ /** Headers a proxy hop writes so the next hop can still name the original caller. */
2
+ export const forwardedHeaders = [
3
+ "x-real-ip",
4
+ "x-forwarded-for",
5
+ "x-forwarded-port",
6
+ "x-forwarded-host",
7
+ "x-forwarded-proto",
8
+ ] as const;
9
+
10
+ /**
11
+ * An IPv4 client reaching a dual-stack listener is reported as `::ffff:203.0.113.10`. That form is not a
12
+ * valid destination for a `udp4` socket and does not compare equal to the same address written plainly, so
13
+ * it is unwrapped at every boundary rather than at each call site that happens to remember.
14
+ */
15
+ export const normalizeIpAddress = (address: string): string => {
16
+ const trimmed = address.trim();
17
+ const mapped = /^::ffff:(\d{1,3}(?:\.\d{1,3}){3})$/i.exec(trimmed);
18
+ return mapped?.[1] ?? trimmed;
19
+ };
20
+
21
+ /**
22
+ * The caller's address as the nearest proxy recorded it. `x-real-ip` is one hop's word for who the client is
23
+ * and wins; `x-forwarded-for` is a chain appended left to right, so its *first* entry is the original client
24
+ * and everything after it is a proxy.
25
+ *
26
+ * Returns `null` rather than a placeholder. A socket peer behind a proxy is the proxy, so `127.0.0.1` here
27
+ * would be indistinguishable from a genuinely local caller — and that is the failure this exists to prevent.
28
+ */
29
+ export const clientAddressFromHeaders = (headers: Headers): string | null => {
30
+ const realIp = headers.get("x-real-ip")?.trim();
31
+ if (realIp) return normalizeIpAddress(realIp);
32
+ const forwarded = headers.get("x-forwarded-for")?.split(",")[0]?.trim();
33
+ return forwarded ? normalizeIpAddress(forwarded) : null;
34
+ };
35
+
36
+ /** The client port the nearest proxy recorded, for correlating a connection with a peer's own logs. */
37
+ export const clientPortFromHeaders = (headers: Headers): number | null => {
38
+ const port = Number(headers.get("x-forwarded-port"));
39
+ return Number.isInteger(port) && port > 0 && port <= 65535 ? port : null;
40
+ };
@@ -1,9 +1,16 @@
1
1
  import { isDayjs } from "./isDayjs";
2
2
 
3
- export const deepObjectify = <T = unknown>(
4
- obj: T | null | undefined,
5
- option: { serializable?: boolean; convertDate?: "string" | "number" } = {},
6
- ): T => {
3
+ interface DeepObjectifyOption {
4
+ serializable?: boolean;
5
+ convertDate?: "string" | "number";
6
+ }
7
+
8
+ const objectifyChild = (value: unknown, option: DeepObjectifyOption): unknown => {
9
+ const modelValue = value as { __ModelType__?: string } | null | undefined;
10
+ return modelValue?.__ModelType__ && !option.serializable ? value : deepObjectify(value, option);
11
+ };
12
+
13
+ export const deepObjectify = <T = unknown>(obj: T | null | undefined, option: DeepObjectifyOption = {}): T => {
7
14
  if (isDayjs(obj) || obj?.constructor === Date) {
8
15
  if (!option.serializable && !option.convertDate) return obj as T;
9
16
  if (option.convertDate === "string") return obj.toISOString() as T;
@@ -12,14 +19,22 @@ export const deepObjectify = <T = unknown>(
12
19
  else return (isDayjs(obj) ? obj.toDate() : obj) as T;
13
20
  } else if (Array.isArray(obj)) {
14
21
  return obj.map((o: unknown) => deepObjectify(o, option)) as T;
22
+ } else if (obj instanceof Map) {
23
+
24
+ const entries = [...obj.entries()].map(
25
+ ([key, value]: [string, unknown]) => [key, objectifyChild(value, option)] as const,
26
+ );
27
+ return (option.serializable ? Object.fromEntries(entries) : new Map(entries)) as T;
28
+ } else if (obj instanceof Set) {
29
+ const values = [...obj.values()].map((value: unknown) => objectifyChild(value, option));
30
+ return (option.serializable ? values : new Set(values)) as T;
15
31
  } else if (obj && typeof obj === "object") {
16
32
  const val: Record<string, unknown> = {};
17
33
  const objRecord = obj as Record<string, unknown>;
18
- Object.keys(obj).forEach((key) => {
19
- const fieldValue = objRecord[key] as { __ModelType__: string } | null | undefined;
20
- if (fieldValue?.__ModelType__ && !option.serializable) val[key] = fieldValue;
21
- else if (typeof objRecord[key] !== "function") val[key] = deepObjectify(fieldValue, option);
22
- });
34
+
35
+ for (const key in objRecord) {
36
+ if (typeof objRecord[key] !== "function") val[key] = objectifyChild(objRecord[key], option);
37
+ }
23
38
  return val as T;
24
39
  } else {
25
40
  return obj as unknown as T;
package/common/index.ts CHANGED
@@ -1,5 +1,11 @@
1
1
  export { applyMixins } from "./applyMixins";
2
2
  export { capitalize } from "./capitalize";
3
+ export {
4
+ clientAddressFromHeaders,
5
+ clientPortFromHeaders,
6
+ forwardedHeaders,
7
+ normalizeIpAddress,
8
+ } from "./clientAddress";
3
9
  export { deepObjectify } from "./deepObjectify";
4
10
  export {
5
11
  type FileUploadCapability,
@@ -18,7 +24,22 @@ export { isQueryEqual } from "./isQueryEqual";
18
24
  export { isThenable } from "./isThenable";
19
25
  export { isValidDate } from "./isValidDate";
20
26
  export { decodeJwtPayload } from "./jwtDecode";
21
- export { Logger, type LoggerSink, type LoggerSinkEntry, type LogLevel } from "./Logger";
27
+ export {
28
+ type LogAttrs,
29
+ type LogAttrValue,
30
+ type LogFormat,
31
+ Logger,
32
+ type LoggerEmitInput,
33
+ type LoggerSink,
34
+ type LoggerSinkEntry,
35
+ type LoggerSinkOptions,
36
+ type LogLevel,
37
+ type LogLevelInput,
38
+ type LogRecord,
39
+ logFormats,
40
+ logLevels,
41
+ logSeverity,
42
+ } from "./Logger";
22
43
  export {
23
44
  type AkanI18nConfig,
24
45
  type AkanI18nConfigInput,
@@ -26,16 +47,35 @@ export {
26
47
  parseAkanI18nEnv,
27
48
  resolveAkanI18nConfig,
28
49
  } from "./localeConfig";
50
+ export {
51
+ type LogContextReader,
52
+ type LogContextSnapshot,
53
+ type LogFlightRecorder,
54
+ readLogContext,
55
+ registerLogContextReader,
56
+ } from "./logContext";
29
57
  export { lowerlize } from "./lowerlize";
58
+ export {
59
+ isMcpDescribableArg,
60
+ type McpExposureEndpoint,
61
+ type McpExposureOption,
62
+ mcpBaseVerbOf,
63
+ mcpHintsOf,
64
+ mcpPromptRefusalOf,
65
+ mcpRefusalOf,
66
+ } from "./mcpExposure";
30
67
  export { mergeVersion } from "./mergeVersion";
31
68
  export { objectify } from "./objectify";
32
69
  export { pathGet } from "./pathGet";
70
+ export { pathGetLoose } from "./pathGetLoose";
33
71
  export { pathSet } from "./pathSet";
72
+ export { plainFieldsOf } from "./plainFieldsOf";
34
73
  export { randomPick } from "./randomPick";
35
74
  export { randomPicks } from "./randomPicks";
36
75
  export {
37
76
  assertUniqueRoutePatterns,
38
77
  compareRouteSpecificity,
78
+ getPageSourceFileViolation,
39
79
  getRouteExports,
40
80
  isRouteSourceFile,
41
81
  isSpecialRouteLeaf,
@@ -65,3 +105,4 @@ export {
65
105
  type WebsocketAuthRequest,
66
106
  websocketAuthContract,
67
107
  } from "./websocketAuth";
108
+ export { type WebsocketBinaryFrame, websocketBinaryFrameContract } from "./websocketBinaryFrame";
@@ -0,0 +1,27 @@
1
+ import type { LogRecord } from "./Logger";
2
+
3
+ /** A per-request ring the Logger hands every record to; the trace decides at its end whether any of it is shown. */
4
+ export interface LogFlightRecorder {
5
+ minSev: number;
6
+ capture(record: LogRecord, written: boolean): void;
7
+ }
8
+
9
+ export interface LogContextSnapshot {
10
+ traceId: string | null;
11
+ endpoint: string | null;
12
+ origin: string | null;
13
+ flight?: LogFlightRecorder | null;
14
+ /** A per-request floor below the process level (`x-akan-debug`); `null` when the request asked for nothing. */
15
+ debugSev?: number | null;
16
+ }
17
+
18
+ export type LogContextReader = () => LogContextSnapshot | undefined;
19
+
20
+ const slot: { __akanLogContextReader?: LogContextReader | null } =
21
+ typeof process === "undefined" ? {} : (process as unknown as { __akanLogContextReader?: LogContextReader | null });
22
+
23
+ export const registerLogContextReader = (reader: LogContextReader | null) => {
24
+ slot.__akanLogContextReader = reader;
25
+ };
26
+
27
+ export const readLogContext = () => slot.__akanLogContextReader?.();