akanjs 3.0.0-alpha.7 → 3.0.0-alpha.70

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 (681) 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/sharedContext.ts +31 -0
  13. package/client/translator.ts +2 -2
  14. package/client/types.ts +3 -3
  15. package/common/clientAddress.ts +40 -0
  16. package/common/deepObjectify.ts +21 -7
  17. package/common/index.ts +18 -0
  18. package/common/mcpExposure.ts +114 -0
  19. package/common/pathGetLoose.ts +31 -0
  20. package/common/pathSet.ts +17 -5
  21. package/common/routeConvention.ts +22 -12
  22. package/common/websocketBinaryFrame.ts +46 -0
  23. package/constant/crystalize.ts +48 -2
  24. package/constant/deserialize.ts +3 -2
  25. package/constant/fieldInfo.ts +43 -3
  26. package/constant/fieldQueryMeta.ts +35 -0
  27. package/constant/immerify.ts +1 -1
  28. package/constant/index.ts +3 -0
  29. package/constant/labelOf.ts +26 -0
  30. package/constant/mask.ts +67 -0
  31. package/constant/purify.ts +17 -11
  32. package/constant/textFieldPaths.ts +13 -7
  33. package/constant/types.ts +19 -13
  34. package/constant/via.ts +10 -3
  35. package/dictionary/DictionaryLookup.ts +30 -0
  36. package/dictionary/agent.dictionary.ts +31 -0
  37. package/dictionary/agentTurn.dictionary.ts +29 -0
  38. package/dictionary/base.dictionary.ts +81 -0
  39. package/dictionary/dictInfo.ts +11 -2
  40. package/dictionary/dictionary.ts +9 -3
  41. package/dictionary/index.ts +1 -0
  42. package/dictionary/trans.ts +2 -2
  43. package/document/documentQuery.ts +1 -0
  44. package/document/filterMeta.ts +77 -12
  45. package/document/index.ts +1 -0
  46. package/document/noDocumentError.ts +12 -0
  47. package/document/types.ts +0 -1
  48. package/fetch/agentTurn.ts +19 -0
  49. package/fetch/client/fetchClient.ts +110 -28
  50. package/fetch/client/httpClient.ts +95 -20
  51. package/fetch/client/wsClient.ts +27 -12
  52. package/fetch/fetchType/appliedReturn.type.ts +65 -44
  53. package/fetch/fetchType/endpointFetch.type.ts +17 -8
  54. package/fetch/fetchType/sliceFetch.type.ts +27 -50
  55. package/fetch/index.ts +1 -0
  56. package/index.ts +80 -6
  57. package/local/apps/akan/akan-local.db +0 -0
  58. package/local/apps/akan/akan-local.db-shm +0 -0
  59. package/local/apps/akan/akan-local.db-wal +0 -0
  60. package/local/apps/akan/akan-local_solid.db +0 -0
  61. package/local/apps/akan/akan-local_solid.db-shm +0 -0
  62. package/local/apps/akan/akan-local_solid.db-wal +0 -0
  63. package/local/apps/serverLifecycle/serverLifecycle-local.db +0 -0
  64. package/local/apps/serverLifecycle/serverLifecycle-local.db-shm +0 -0
  65. package/local/apps/serverLifecycle/serverLifecycle-local.db-wal +0 -0
  66. package/local/apps/serverLifecycle/serverLifecycle-local_solid.db +0 -0
  67. package/local/apps/serverLifecycle/serverLifecycle-local_solid.db-shm +0 -0
  68. package/local/apps/serverLifecycle/serverLifecycle-local_solid.db-wal +0 -0
  69. package/package.json +17 -18
  70. package/server/akanApp.ts +194 -45
  71. package/server/akanAppHeaders.ts +16 -2
  72. package/server/akanOption.ts +63 -8
  73. package/server/akanServer.ts +312 -31
  74. package/server/animatedImage.ts +83 -0
  75. package/server/assetEncoding.ts +4 -24
  76. package/server/binaryPubsub.ts +55 -0
  77. package/server/console.ts +9 -101
  78. package/server/consoleEvaluator.ts +51 -0
  79. package/server/consolePasteFilter.ts +91 -0
  80. package/server/consoleSession.ts +198 -0
  81. package/server/contentEncoding.ts +83 -0
  82. package/server/devtools/signalSerializer.ts +2 -2
  83. package/server/devtools/types.ts +4 -4
  84. package/server/di/diLifecycle.ts +123 -13
  85. package/server/di/predefinedAdaptor.ts +6 -0
  86. package/server/di/utils.ts +40 -0
  87. package/server/imageOptimizer.ts +154 -57
  88. package/server/lifecycle/runtimeDir.ts +14 -0
  89. package/server/lifecycle/shutdownManager.ts +1 -1
  90. package/server/mcp/McpAuth.ts +188 -0
  91. package/server/mcp/McpDispatcher.ts +285 -0
  92. package/server/mcp/McpEventStream.ts +76 -0
  93. package/server/mcp/McpExecutionContext.ts +105 -0
  94. package/server/mcp/McpRouter.ts +621 -0
  95. package/server/mcp/index.ts +5 -0
  96. package/server/processMetricsCollector.ts +1 -1
  97. package/server/resolver/database.resolver.ts +5 -4
  98. package/server/resolver/signal.resolver.ts +134 -39
  99. package/server/routeTreeBuilder.ts +10 -8
  100. package/server/routing/apiRouter.ts +39 -11
  101. package/server/routing/appWsData.ts +24 -2
  102. package/server/routing/soloAppRoutes.ts +46 -0
  103. package/server/rscWorker.tsx +11 -15
  104. package/server/semaphore.ts +22 -0
  105. package/server/subRouteIndexDocument.tsx +61 -0
  106. package/server/systemPageDocument.tsx +3 -3
  107. package/server/systemPages.tsx +49 -16
  108. package/server/types.tsx +28 -0
  109. package/server/vendor/akanjs-fetch.ts +1 -0
  110. package/server/webRouter.ts +87 -39
  111. package/service/adapt.ts +4 -4
  112. package/service/agent.service.ts +81 -0
  113. package/service/base.service.ts +2 -1
  114. package/service/index.ts +1 -0
  115. package/service/injectInfo.ts +8 -3
  116. package/service/ipcTypes.ts +1 -0
  117. package/service/predefinedAdaptor/compress.adaptor.ts +5 -1
  118. package/service/predefinedAdaptor/database.adaptor.ts +68 -37
  119. package/service/predefinedAdaptor/deepseekLlm.ts +271 -0
  120. package/service/predefinedAdaptor/index.ts +3 -0
  121. package/service/predefinedAdaptor/insightQuery.ts +183 -0
  122. package/service/predefinedAdaptor/llm.adaptor.ts +115 -0
  123. package/service/predefinedAdaptor/queue.adaptor.ts +5 -2
  124. package/service/predefinedAdaptor/role.adaptor.ts +2 -0
  125. package/service/predefinedAdaptor/schedule.adaptor.ts +12 -5
  126. package/service/predefinedAdaptor/solidPubsub.adaptor.ts +10 -6
  127. package/service/predefinedAdaptor/solidQueue.adaptor.ts +6 -2
  128. package/service/predefinedAdaptor/solidSqlite.ts +11 -9
  129. package/service/predefinedAdaptor/websocket.adaptor.ts +6 -1
  130. package/service/serve.ts +16 -9
  131. package/service/toolNames.ts +119 -0
  132. package/signal/agent/AgentCatalogue.ts +165 -0
  133. package/signal/agent/index.ts +1 -0
  134. package/signal/agent.signal.ts +38 -0
  135. package/signal/agentTurn.ts +8 -0
  136. package/signal/agentTurnStream.ts +60 -0
  137. package/signal/base.signal.ts +2 -1
  138. package/signal/endpointInfo.ts +38 -2
  139. package/signal/guard.ts +28 -1
  140. package/signal/guards.ts +49 -1
  141. package/signal/index.ts +6 -0
  142. package/signal/intercept.ts +4 -4
  143. package/signal/internalArg.ts +21 -4
  144. package/signal/mcp/McpDocument.ts +326 -0
  145. package/signal/mcp/McpProgress.ts +106 -0
  146. package/signal/mcp/McpUriTemplate.ts +80 -0
  147. package/signal/mcp/Msg.ts +368 -0
  148. package/signal/mcp/index.ts +5 -0
  149. package/signal/mcp/mcpProtocol.ts +120 -0
  150. package/signal/middleware.ts +3 -3
  151. package/signal/openapi/openapi.ts +36 -173
  152. package/signal/schema/JsonSchemaBuilder.ts +221 -0
  153. package/signal/schema/index.ts +1 -0
  154. package/signal/serializer/fetch.serializer.ts +51 -0
  155. package/signal/signalContext.ts +276 -61
  156. package/signal/slice.ts +62 -27
  157. package/signal/types.ts +55 -4
  158. package/store/action.ts +29 -35
  159. package/store/actionTag.ts +33 -0
  160. package/store/agent/AgentBridge.ts +87 -0
  161. package/store/agent/AgentContext.ts +71 -0
  162. package/store/agent/AgentPrompts.ts +111 -0
  163. package/store/agent/ScreenReader.ts +349 -0
  164. package/store/agent/ScreenSettle.ts +45 -0
  165. package/store/agent/ScreenTarget.ts +135 -0
  166. package/store/agent/StoreCatalogue.ts +116 -0
  167. package/store/agent/StoreSurfaceSource.ts +225 -0
  168. package/store/agent/index.ts +13 -0
  169. package/store/agent/storeSurface.ts +28 -0
  170. package/store/agent/types.ts +16 -0
  171. package/store/agentic/AgentValue.ts +119 -0
  172. package/store/agentic/StExposeBuilder.ts +47 -0
  173. package/store/agentic/StExposeDraft.ts +24 -0
  174. package/store/agentic/StStateBuilder.ts +85 -0
  175. package/store/agentic/StStateDraft.ts +23 -0
  176. package/store/agentic/StToolBuilder.ts +279 -0
  177. package/store/agentic/StToolDraft.ts +22 -0
  178. package/store/agentic/attachAgentic.ts +33 -0
  179. package/store/agentic/formFields.ts +194 -0
  180. package/store/agentic/index.ts +12 -0
  181. package/store/agentic/useFieldTool.ts +183 -0
  182. package/store/agentic/useFormTools.ts +77 -0
  183. package/store/agentic/useRelationFieldTool.ts +113 -0
  184. package/store/baseSt.ts +1 -1
  185. package/store/databaseStateNames.ts +31 -0
  186. package/store/formSetterNames.ts +35 -0
  187. package/store/index.ts +8 -0
  188. package/store/rootStore.ts +3 -1
  189. package/store/sliceRole.ts +36 -0
  190. package/store/state.ts +2 -12
  191. package/store/store.ts +9 -0
  192. package/store/storeInstance.ts +185 -20
  193. package/store/storeRegistry.ts +39 -1
  194. package/store/types.ts +5 -0
  195. package/store/withSelector.ts +5 -4
  196. package/test/index.ts +1 -1
  197. package/test/registerDom.ts +4 -0
  198. package/test/sampleOf.ts +2 -0
  199. package/test/signalTestRuntime.ts +5 -5
  200. package/test/testServer.ts +8 -5
  201. package/types/base/baseEnv.d.ts +1 -1
  202. package/types/base/primitiveRegistry.d.ts +20 -8
  203. package/types/base/symbols.d.ts +4 -0
  204. package/types/client/capacitor.d.ts +39 -0
  205. package/types/client/clientRuntime.d.ts +7 -0
  206. package/types/client/index.d.ts +1 -0
  207. package/types/client/sharedContext.d.ts +21 -0
  208. package/types/client/types.d.ts +5 -3
  209. package/types/common/clientAddress.d.ts +19 -0
  210. package/types/common/deepObjectify.d.ts +4 -2
  211. package/types/common/index.d.ts +5 -1
  212. package/types/common/mcpExposure.d.ts +64 -0
  213. package/types/common/pathGetLoose.d.ts +8 -0
  214. package/types/common/routeConvention.d.ts +6 -0
  215. package/types/common/websocketBinaryFrame.d.ts +17 -0
  216. package/types/constant/constantRegistry.d.ts +2 -10
  217. package/types/constant/crystalize.d.ts +2 -0
  218. package/types/constant/fieldInfo.d.ts +20 -3
  219. package/types/constant/fieldQueryMeta.d.ts +17 -0
  220. package/types/constant/index.d.ts +3 -0
  221. package/types/constant/labelOf.d.ts +7 -0
  222. package/types/constant/mask.d.ts +41 -0
  223. package/types/constant/purify.d.ts +2 -2
  224. package/types/constant/types.d.ts +5 -5
  225. package/types/dictionary/DictionaryLookup.d.ts +14 -0
  226. package/types/dictionary/agent.dictionary.d.ts +1 -0
  227. package/types/dictionary/agentTurn.dictionary.d.ts +1 -0
  228. package/types/dictionary/base.dictionary.d.ts +1 -1
  229. package/types/dictionary/dictInfo.d.ts +7 -1
  230. package/types/dictionary/dictionary.d.ts +11 -9
  231. package/types/dictionary/index.d.ts +1 -0
  232. package/types/document/filterMeta.d.ts +24 -4
  233. package/types/document/index.d.ts +1 -0
  234. package/types/document/noDocumentError.d.ts +12 -0
  235. package/types/document/types.d.ts +0 -1
  236. package/types/fetch/agentTurn.d.ts +475 -0
  237. package/types/fetch/client/fetchClient.d.ts +12 -0
  238. package/types/fetch/client/httpClient.d.ts +2 -1
  239. package/types/fetch/fetchType/appliedReturn.type.d.ts +37 -18
  240. package/types/fetch/fetchType/endpointFetch.type.d.ts +8 -5
  241. package/types/fetch/fetchType/sliceFetch.type.d.ts +11 -15
  242. package/types/fetch/index.d.ts +1 -0
  243. package/types/index.d.ts +74 -10
  244. package/types/server/akanApp.d.ts +12 -0
  245. package/types/server/akanAppHeaders.d.ts +7 -1
  246. package/types/server/akanOption.d.ts +36 -6
  247. package/types/server/akanServer.d.ts +67 -9
  248. package/types/server/animatedImage.d.ts +7 -0
  249. package/types/server/assetEncoding.d.ts +1 -1
  250. package/types/server/binaryPubsub.d.ts +18 -0
  251. package/types/server/console.d.ts +1 -1
  252. package/types/server/consoleEvaluator.d.ts +2 -0
  253. package/types/server/consolePasteFilter.d.ts +11 -0
  254. package/types/server/consoleSession.d.ts +12 -0
  255. package/types/server/contentEncoding.d.ts +28 -0
  256. package/types/server/devtools/types.d.ts +4 -4
  257. package/types/server/di/diLifecycle.d.ts +10 -2
  258. package/types/server/di/predefinedAdaptor.d.ts +4 -1
  259. package/types/server/di/utils.d.ts +16 -0
  260. package/types/server/lifecycle/runtimeDir.d.ts +5 -0
  261. package/types/server/mcp/McpAuth.d.ts +66 -0
  262. package/types/server/mcp/McpDispatcher.d.ts +61 -0
  263. package/types/server/mcp/McpEventStream.d.ts +18 -0
  264. package/types/server/mcp/McpExecutionContext.d.ts +44 -0
  265. package/types/server/mcp/McpRouter.d.ts +65 -0
  266. package/types/server/mcp/index.d.ts +5 -0
  267. package/types/server/mcp.d.ts +1 -0
  268. package/types/server/resolver/signal.resolver.d.ts +7 -4
  269. package/types/server/routing/apiRouter.d.ts +2 -1
  270. package/types/server/routing/appWsData.d.ts +13 -1
  271. package/types/server/routing/soloAppRoutes.d.ts +15 -0
  272. package/types/server/semaphore.d.ts +5 -0
  273. package/types/server/subRouteIndexDocument.d.ts +8 -0
  274. package/types/server/systemPageDocument.d.ts +1 -0
  275. package/types/server/systemPages.d.ts +5 -0
  276. package/types/server/types.d.ts +16 -0
  277. package/types/server/vendor/akanjs-fetch.d.ts +1 -0
  278. package/types/server/webRouter.d.ts +12 -3
  279. package/types/service/adapt.d.ts +2 -2
  280. package/types/service/agent.service.d.ts +32 -0
  281. package/types/service/base.service.d.ts +4 -0
  282. package/types/service/index.d.ts +1 -0
  283. package/types/service/injectInfo.d.ts +2 -2
  284. package/types/service/ipcTypes.d.ts +1 -0
  285. package/types/service/predefinedAdaptor/compress.adaptor.d.ts +1 -1
  286. package/types/service/predefinedAdaptor/database.adaptor.d.ts +9 -3
  287. package/types/service/predefinedAdaptor/deepseekLlm.d.ts +76 -0
  288. package/types/service/predefinedAdaptor/index.d.ts +3 -0
  289. package/types/service/predefinedAdaptor/insightQuery.d.ts +50 -0
  290. package/types/service/predefinedAdaptor/llm.adaptor.d.ts +105 -0
  291. package/types/service/predefinedAdaptor/queue.adaptor.d.ts +3 -2
  292. package/types/service/predefinedAdaptor/role.adaptor.d.ts +2 -0
  293. package/types/service/predefinedAdaptor/schedule.adaptor.d.ts +10 -6
  294. package/types/service/predefinedAdaptor/solidQueue.adaptor.d.ts +6 -2
  295. package/types/service/predefinedAdaptor/solidSqlite.d.ts +2 -2
  296. package/types/service/serve.d.ts +3 -3
  297. package/types/service/toolNames.d.ts +35 -0
  298. package/types/signal/agent/AgentCatalogue.d.ts +100 -0
  299. package/types/signal/agent/index.d.ts +1 -0
  300. package/types/signal/agent.d.ts +1 -0
  301. package/types/signal/agent.signal.d.ts +24 -0
  302. package/types/signal/agentTurn.d.ts +9 -0
  303. package/types/signal/agentTurnStream.d.ts +24 -0
  304. package/types/signal/base.signal.d.ts +1 -1
  305. package/types/signal/endpointInfo.d.ts +21 -3
  306. package/types/signal/guard.d.ts +12 -0
  307. package/types/signal/guards.d.ts +23 -1
  308. package/types/signal/index.d.ts +6 -0
  309. package/types/signal/intercept.d.ts +2 -2
  310. package/types/signal/internalArg.d.ts +22 -6
  311. package/types/signal/mcp/McpDocument.d.ts +84 -0
  312. package/types/signal/mcp/McpProgress.d.ts +40 -0
  313. package/types/signal/mcp/McpUriTemplate.d.ts +25 -0
  314. package/types/signal/mcp/Msg.d.ts +143 -0
  315. package/types/signal/mcp/index.d.ts +5 -0
  316. package/types/signal/mcp/mcpProtocol.d.ts +107 -0
  317. package/types/signal/mcp.d.ts +1 -0
  318. package/types/signal/middleware.d.ts +7 -7
  319. package/types/signal/openapi/openapi.d.ts +3 -3
  320. package/types/signal/schema/JsonSchemaBuilder.d.ts +51 -0
  321. package/types/signal/schema/index.d.ts +1 -0
  322. package/types/signal/schema.d.ts +1 -0
  323. package/types/signal/signalContext.d.ts +52 -6
  324. package/types/signal/slice.d.ts +42 -15
  325. package/types/signal/types.d.ts +53 -4
  326. package/types/store/action.d.ts +7 -5
  327. package/types/store/actionTag.d.ts +21 -0
  328. package/types/store/agent/AgentBridge.d.ts +37 -0
  329. package/types/store/agent/AgentContext.d.ts +16 -0
  330. package/types/store/agent/AgentPrompts.d.ts +31 -0
  331. package/types/store/agent/ScreenReader.d.ts +29 -0
  332. package/types/store/agent/ScreenSettle.d.ts +22 -0
  333. package/types/store/agent/ScreenTarget.d.ts +34 -0
  334. package/types/store/agent/StoreCatalogue.d.ts +26 -0
  335. package/types/store/agent/StoreSurfaceSource.d.ts +30 -0
  336. package/types/store/agent/index.d.ts +11 -0
  337. package/types/store/agent/storeSurface.d.ts +14 -0
  338. package/types/store/agent/types.d.ts +15 -0
  339. package/types/store/agent.d.ts +1 -0
  340. package/types/store/agentic/AgentValue.d.ts +43 -0
  341. package/types/store/agentic/StExposeBuilder.d.ts +21 -0
  342. package/types/store/agentic/StExposeDraft.d.ts +13 -0
  343. package/types/store/agentic/StStateBuilder.d.ts +21 -0
  344. package/types/store/agentic/StStateDraft.d.ts +12 -0
  345. package/types/store/agentic/StToolBuilder.d.ts +56 -0
  346. package/types/store/agentic/StToolDraft.d.ts +13 -0
  347. package/types/store/agentic/attachAgentic.d.ts +25 -0
  348. package/types/store/agentic/formFields.d.ts +53 -0
  349. package/types/store/agentic/index.d.ts +12 -0
  350. package/types/store/agentic/useFieldTool.d.ts +22 -0
  351. package/types/store/agentic/useFormTools.d.ts +19 -0
  352. package/types/store/agentic/useRelationFieldTool.d.ts +27 -0
  353. package/types/store/agentic.d.ts +1 -0
  354. package/types/store/baseSt.d.ts +35 -39
  355. package/types/store/databaseStateNames.d.ts +25 -0
  356. package/types/store/formSetterNames.d.ts +30 -0
  357. package/types/store/index.d.ts +7 -0
  358. package/types/store/rootStore.d.ts +5 -1
  359. package/types/store/sliceRole.d.ts +25 -0
  360. package/types/store/store.d.ts +5 -1
  361. package/types/store/storeInstance.d.ts +33 -1
  362. package/types/store/storeRegistry.d.ts +5 -0
  363. package/types/store/types.d.ts +4 -0
  364. package/types/store/withSelector.d.ts +5 -4
  365. package/types/test/index.d.ts +1 -1
  366. package/types/test/registerDom.d.ts +1 -0
  367. package/types/test/signalTestRuntime.d.ts +2 -3
  368. package/types/test/testServer.d.ts +6 -4
  369. package/types/ui/Agent/Approval.d.ts +8 -0
  370. package/types/ui/Agent/Attach.d.ts +16 -0
  371. package/types/ui/Agent/Bubble.d.ts +26 -0
  372. package/types/ui/Agent/Chat.d.ts +91 -0
  373. package/types/ui/Agent/ChatCommands.d.ts +34 -0
  374. package/types/ui/Agent/Composer.d.ts +23 -0
  375. package/types/ui/Agent/Context.d.ts +13 -0
  376. package/types/ui/Agent/Dock.d.ts +17 -0
  377. package/types/ui/Agent/Guide.d.ts +9 -0
  378. package/types/ui/Agent/History.d.ts +26 -0
  379. package/types/ui/Agent/Launcher.d.ts +16 -0
  380. package/types/ui/Agent/Markdown.d.ts +19 -0
  381. package/types/ui/Agent/Menu.d.ts +18 -0
  382. package/types/ui/Agent/Mic.d.ts +8 -0
  383. package/types/ui/Agent/Question.d.ts +14 -0
  384. package/types/ui/Agent/Section.d.ts +10 -0
  385. package/types/ui/Agent/Skip.d.ts +22 -0
  386. package/types/ui/Agent/StateKey.d.ts +16 -0
  387. package/types/ui/Agent/Tool.d.ts +15 -0
  388. package/types/ui/Agent/Transcript.d.ts +13 -0
  389. package/types/ui/Agent/Zone.d.ts +48 -0
  390. package/types/ui/Agent/agentSessionOf.d.ts +27 -0
  391. package/types/ui/Agent/attachment.d.ts +34 -0
  392. package/types/ui/Agent/fetchRunner.d.ts +12 -0
  393. package/types/ui/Agent/index.d.ts +19 -0
  394. package/types/ui/Agent/index_.d.ts +1 -0
  395. package/types/ui/Agent/markdownBlocks.d.ts +35 -0
  396. package/types/ui/Agent/markdownSpans.d.ts +2 -0
  397. package/types/ui/Agent/markdownTable.d.ts +16 -0
  398. package/types/ui/Agent/sessionHistory.d.ts +14 -0
  399. package/types/ui/Agent/sessionView.d.ts +15 -0
  400. package/types/ui/Agent/tokenCount.d.ts +6 -0
  401. package/types/ui/Agent/useChatAttachments.d.ts +24 -0
  402. package/types/ui/Agent/useChatVoice.d.ts +30 -0
  403. package/types/ui/Agent/useDraftRecall.d.ts +14 -0
  404. package/types/ui/Agent/useKeyboardInset.d.ts +8 -0
  405. package/types/ui/Agent/useSlashMenu.d.ts +24 -0
  406. package/types/ui/Agent/voice.d.ts +71 -0
  407. package/types/ui/Agent.d.ts +1 -0
  408. package/types/ui/Badge.d.ts +1 -1
  409. package/types/ui/Button.d.ts +1 -1
  410. package/types/ui/Constant/Graph.d.ts +10 -0
  411. package/types/ui/Constant/index.d.ts +2 -1
  412. package/types/ui/Constant/schemaGraph.d.ts +39 -0
  413. package/types/ui/Data/Dashboard.d.ts +16 -3
  414. package/types/ui/Data/Insight.d.ts +1 -1
  415. package/types/ui/Data/ListContainer.d.ts +15 -7
  416. package/types/ui/Data/QueryMaker.d.ts +45 -3
  417. package/types/ui/Data/RefPicker.d.ts +16 -0
  418. package/types/ui/Data/dataExport.d.ts +5 -0
  419. package/types/ui/Data/dataText.d.ts +6 -0
  420. package/types/ui/Data/index.d.ts +2 -0
  421. package/types/ui/Data/index_.d.ts +1 -0
  422. package/types/ui/DatePicker.d.ts +15 -11
  423. package/types/ui/Dialog/LegacyModal.d.ts +13 -0
  424. package/types/ui/Dialog/Provider.d.ts +3 -1
  425. package/types/ui/Dialog/context.d.ts +9 -1
  426. package/types/ui/Dialog/index.d.ts +1 -0
  427. package/types/ui/DraggableList.d.ts +1 -1
  428. package/types/ui/Dropdown.d.ts +5 -1
  429. package/types/ui/Field.d.ts +13 -12
  430. package/types/ui/Layout/BottomTab.d.ts +3 -2
  431. package/types/ui/LegacyModal.d.ts +24 -0
  432. package/types/ui/Loading/ProgressBar.d.ts +4 -0
  433. package/types/ui/Loading/Spin.d.ts +2 -1
  434. package/types/ui/Model/AdminPanel.d.ts +15 -3
  435. package/types/ui/Model/EditModal.d.ts +1 -1
  436. package/types/ui/Model/New.d.ts +3 -1
  437. package/types/ui/Model/NewWrapper.d.ts +2 -0
  438. package/types/ui/Model/NewWrapper_Client.d.ts +2 -1
  439. package/types/ui/Pagination.d.ts +2 -2
  440. package/types/ui/Radio.d.ts +1 -1
  441. package/types/ui/RecentTime.d.ts +18 -1
  442. package/types/ui/Reference/Collapse.d.ts +11 -0
  443. package/types/ui/Reference/Panel.d.ts +29 -0
  444. package/types/ui/Reference/Segmented.d.ts +17 -0
  445. package/types/ui/Reference/Summary.d.ts +13 -0
  446. package/types/ui/Reference/Toolbar.d.ts +21 -0
  447. package/types/ui/Reference/dictText.d.ts +6 -0
  448. package/types/ui/Reference/index.d.ts +7 -0
  449. package/types/ui/Reference/style.d.ts +20 -0
  450. package/types/ui/Reference.d.ts +1 -0
  451. package/types/ui/ScreenNavigator.d.ts +3 -1
  452. package/types/ui/Signal/Arg.d.ts +7 -3
  453. package/types/ui/Signal/Doc.d.ts +4 -6
  454. package/types/ui/Signal/Object.d.ts +2 -1
  455. package/types/ui/Signal/RestApi.d.ts +2 -1
  456. package/types/ui/Signal/WebSocket.d.ts +2 -1
  457. package/types/ui/Signal/endpointEntries.d.ts +20 -0
  458. package/types/ui/Signal/style.d.ts +9 -8
  459. package/types/ui/System/Client.d.ts +1 -2
  460. package/types/ui/System/Common.d.ts +3 -4
  461. package/types/ui/System/Messages.d.ts +1 -1
  462. package/types/ui/Tab/Provider.d.ts +3 -1
  463. package/types/ui/Tab/context.d.ts +4 -2
  464. package/types/ui/ToggleSelect.d.ts +1 -0
  465. package/types/ui/UiOverride/context.d.ts +18 -1
  466. package/types/ui/agentAttrs.d.ts +14 -0
  467. package/types/ui/index.d.ts +22 -1
  468. package/types/ui/overlayLayer.d.ts +13 -0
  469. package/types/ui/overlayPosition.d.ts +28 -0
  470. package/types/ui/recipe/badgeRecipe.d.ts +2 -2
  471. package/types/ui/recipe/buttonRecipe.d.ts +2 -2
  472. package/types/vendor/use-agentic/AgentAbort.d.ts +17 -0
  473. package/types/vendor/use-agentic/AgentProgress.d.ts +27 -0
  474. package/types/vendor/use-agentic/AgentProvider.d.ts +17 -0
  475. package/types/vendor/use-agentic/AgentScope.d.ts +9 -0
  476. package/types/vendor/use-agentic/AgentSession.d.ts +163 -0
  477. package/types/vendor/use-agentic/Agentic.d.ts +21 -0
  478. package/types/vendor/use-agentic/AgenticSurface.d.ts +58 -0
  479. package/types/vendor/use-agentic/Compaction.d.ts +48 -0
  480. package/types/vendor/use-agentic/ToolOutput.d.ts +21 -0
  481. package/types/vendor/use-agentic/Transcript.d.ts +18 -0
  482. package/types/vendor/use-agentic/httpRunner.d.ts +15 -0
  483. package/types/vendor/use-agentic/index.d.ts +19 -0
  484. package/types/vendor/use-agentic/sharedContext.d.ts +15 -0
  485. package/types/vendor/use-agentic/surfaceContext.d.ts +5 -0
  486. package/types/vendor/use-agentic/types.d.ts +182 -0
  487. package/types/vendor/use-agentic/useAgent.d.ts +4 -0
  488. package/types/vendor/use-agentic/useAgentGuide.d.ts +6 -0
  489. package/types/vendor/use-agentic/useAgentResource.d.ts +12 -0
  490. package/types/vendor/use-agentic/useAgentState.d.ts +16 -0
  491. package/types/vendor/use-agentic/useAgentTool.d.ts +16 -0
  492. package/types/vendor/use-agentic.d.ts +1 -0
  493. package/types/webkit/index.d.ts +4 -0
  494. package/types/webkit/useBodyScrollLock.d.ts +2 -0
  495. package/types/webkit/usePageTool.d.ts +19 -0
  496. package/types/webkit/useScreenScope.d.ts +25 -0
  497. package/ui/Agent/Approval.tsx +32 -0
  498. package/ui/Agent/Attach.tsx +77 -0
  499. package/ui/Agent/Bubble.tsx +192 -0
  500. package/ui/Agent/Chat.tsx +525 -0
  501. package/ui/Agent/ChatCommands.ts +141 -0
  502. package/ui/Agent/Composer.tsx +94 -0
  503. package/ui/Agent/Context.tsx +49 -0
  504. package/ui/Agent/Dock.tsx +77 -0
  505. package/ui/Agent/Guide.tsx +16 -0
  506. package/ui/Agent/History.tsx +49 -0
  507. package/ui/Agent/Launcher.tsx +60 -0
  508. package/ui/Agent/Markdown.tsx +142 -0
  509. package/ui/Agent/Menu.tsx +55 -0
  510. package/ui/Agent/Mic.tsx +27 -0
  511. package/ui/Agent/Question.tsx +63 -0
  512. package/ui/Agent/Section.tsx +24 -0
  513. package/ui/Agent/Skip.tsx +30 -0
  514. package/ui/Agent/StateKey.tsx +46 -0
  515. package/ui/Agent/Tool.tsx +59 -0
  516. package/ui/Agent/Transcript.tsx +33 -0
  517. package/ui/Agent/Zone.tsx +116 -0
  518. package/ui/Agent/agentSessionOf.ts +60 -0
  519. package/ui/Agent/attachment.ts +73 -0
  520. package/ui/Agent/fetchRunner.ts +44 -0
  521. package/ui/Agent/index.ts +27 -0
  522. package/ui/Agent/index_.tsx +4 -0
  523. package/ui/Agent/markdownBlocks.ts +137 -0
  524. package/ui/Agent/markdownSpans.tsx +49 -0
  525. package/ui/Agent/markdownTable.ts +54 -0
  526. package/ui/Agent/sessionHistory.ts +62 -0
  527. package/ui/Agent/sessionView.ts +38 -0
  528. package/ui/Agent/tokenCount.ts +10 -0
  529. package/ui/Agent/useChatAttachments.ts +84 -0
  530. package/ui/Agent/useChatVoice.ts +129 -0
  531. package/ui/Agent/useDraftRecall.ts +42 -0
  532. package/ui/Agent/useKeyboardInset.ts +26 -0
  533. package/ui/Agent/useSlashMenu.ts +58 -0
  534. package/ui/Agent/voice.ts +177 -0
  535. package/ui/Badge.tsx +1 -1
  536. package/ui/BottomSheet.tsx +32 -36
  537. package/ui/Button.tsx +3 -1
  538. package/ui/Clipboard.tsx +3 -6
  539. package/ui/Constant/Doc.tsx +265 -254
  540. package/ui/Constant/Graph.tsx +151 -0
  541. package/ui/Constant/index.ts +3 -2
  542. package/ui/Constant/schemaGraph.ts +232 -0
  543. package/ui/Data/CardList.tsx +14 -3
  544. package/ui/Data/Dashboard.tsx +70 -52
  545. package/ui/Data/Insight.tsx +18 -12
  546. package/ui/Data/Item.tsx +42 -56
  547. package/ui/Data/ListContainer.tsx +246 -132
  548. package/ui/Data/Pagination.tsx +10 -3
  549. package/ui/Data/QueryMaker.tsx +160 -11
  550. package/ui/Data/RefPicker.tsx +202 -0
  551. package/ui/Data/TableList.tsx +22 -13
  552. package/ui/Data/dataExport.ts +54 -0
  553. package/ui/Data/dataText.ts +22 -0
  554. package/ui/Data/index.ts +13 -1
  555. package/ui/Data/index_.tsx +1 -0
  556. package/ui/DatePicker.tsx +110 -128
  557. package/ui/Dialog/Close.tsx +3 -7
  558. package/ui/Dialog/LegacyModal.tsx +241 -0
  559. package/ui/Dialog/Modal.tsx +62 -195
  560. package/ui/Dialog/Provider.tsx +47 -3
  561. package/ui/Dialog/Trigger.tsx +3 -7
  562. package/ui/Dialog/context.ts +14 -2
  563. package/ui/Dialog/index.tsx +2 -0
  564. package/ui/DragAction.tsx +3 -2
  565. package/ui/DraggableList.tsx +9 -4
  566. package/ui/Dropdown.tsx +89 -27
  567. package/ui/Empty.tsx +6 -4
  568. package/ui/Field.tsx +128 -58
  569. package/ui/Input.tsx +27 -5
  570. package/ui/KeyboardAvoiding.tsx +2 -2
  571. package/ui/Layout/BottomTab.tsx +32 -37
  572. package/ui/Layout/Sider.tsx +37 -14
  573. package/ui/LegacyModal.tsx +53 -0
  574. package/ui/Link/CsrLink.tsx +1 -1
  575. package/ui/Load/Pagination.tsx +15 -8
  576. package/ui/Load/Units.tsx +30 -7
  577. package/ui/Load/View.tsx +10 -3
  578. package/ui/Loading/Area.tsx +7 -6
  579. package/ui/Loading/Button.tsx +7 -9
  580. package/ui/Loading/Input.tsx +7 -9
  581. package/ui/Loading/ProgressBar.tsx +16 -7
  582. package/ui/Loading/Skeleton.tsx +8 -13
  583. package/ui/Loading/Spin.tsx +20 -14
  584. package/ui/Menu.tsx +1 -1
  585. package/ui/Model/AdminPanel.tsx +52 -12
  586. package/ui/Model/EditModal.tsx +27 -5
  587. package/ui/Model/EditWrapper.tsx +16 -4
  588. package/ui/Model/New.tsx +4 -0
  589. package/ui/Model/NewWrapper.tsx +2 -0
  590. package/ui/Model/NewWrapper_Client.tsx +20 -6
  591. package/ui/Model/Remove.tsx +18 -6
  592. package/ui/Model/RemoveWrapper.tsx +12 -2
  593. package/ui/Model/SureToRemove.tsx +18 -6
  594. package/ui/Model/ViewEditModal.tsx +64 -15
  595. package/ui/Model/ViewModal.tsx +25 -11
  596. package/ui/Model/ViewWrapper.tsx +15 -4
  597. package/ui/Model/index_.tsx +1 -1
  598. package/ui/Pagination.tsx +51 -66
  599. package/ui/Popconfirm.tsx +88 -78
  600. package/ui/Radio.tsx +53 -24
  601. package/ui/RecentTime.tsx +83 -35
  602. package/ui/Reference/Collapse.tsx +26 -0
  603. package/ui/Reference/Panel.tsx +79 -0
  604. package/ui/Reference/Segmented.tsx +41 -0
  605. package/ui/Reference/Summary.tsx +25 -0
  606. package/ui/Reference/Toolbar.tsx +44 -0
  607. package/ui/Reference/dictText.ts +9 -0
  608. package/ui/Reference/index.ts +7 -0
  609. package/ui/Reference/style.ts +45 -0
  610. package/ui/ScreenNavigator.tsx +17 -2
  611. package/ui/Select.tsx +96 -57
  612. package/ui/Signal/Arg.tsx +83 -68
  613. package/ui/Signal/Doc.tsx +163 -129
  614. package/ui/Signal/Listener.tsx +40 -29
  615. package/ui/Signal/Message.tsx +87 -135
  616. package/ui/Signal/Object.tsx +79 -57
  617. package/ui/Signal/PubSub.tsx +72 -113
  618. package/ui/Signal/Request.tsx +2 -22
  619. package/ui/Signal/Response.tsx +19 -45
  620. package/ui/Signal/RestApi.tsx +170 -200
  621. package/ui/Signal/WebSocket.tsx +29 -26
  622. package/ui/Signal/endpointEntries.ts +59 -0
  623. package/ui/Signal/makeExample.ts +10 -3
  624. package/ui/Signal/style.ts +34 -29
  625. package/ui/Switch.tsx +4 -0
  626. package/ui/System/CSR.tsx +1 -1
  627. package/ui/System/Client.tsx +30 -14
  628. package/ui/System/Common.tsx +3 -4
  629. package/ui/System/DevModeToggle.tsx +1 -1
  630. package/ui/System/Gtag.tsx +2 -2
  631. package/ui/System/Messages.tsx +52 -31
  632. package/ui/System/Reconnect.tsx +22 -56
  633. package/ui/System/SelectLanguage.tsx +24 -15
  634. package/ui/System/ThemeToggle.tsx +25 -13
  635. package/ui/Tab/Menu.tsx +24 -12
  636. package/ui/Tab/Menus.tsx +6 -3
  637. package/ui/Tab/Provider.tsx +30 -3
  638. package/ui/Tab/context.ts +8 -4
  639. package/ui/Table.tsx +66 -60
  640. package/ui/ToggleSelect.tsx +8 -7
  641. package/ui/Tooltip.tsx +15 -1
  642. package/ui/UiOverride/context.ts +21 -2
  643. package/ui/Unauthorized.tsx +6 -4
  644. package/ui/agentAttrs.ts +19 -0
  645. package/ui/index.ts +49 -1
  646. package/ui/overlayLayer.ts +12 -2
  647. package/ui/overlayPosition.ts +104 -0
  648. package/ui/recipe/buttonRecipe.ts +2 -2
  649. package/ui/styles.css +31 -0
  650. package/vendor/use-agentic/AgentAbort.ts +29 -0
  651. package/vendor/use-agentic/AgentProgress.ts +40 -0
  652. package/vendor/use-agentic/AgentProvider.tsx +39 -0
  653. package/vendor/use-agentic/AgentScope.tsx +20 -0
  654. package/vendor/use-agentic/AgentSession.ts +750 -0
  655. package/vendor/use-agentic/Agentic.tsx +44 -0
  656. package/vendor/use-agentic/AgenticSurface.ts +333 -0
  657. package/vendor/use-agentic/Compaction.ts +120 -0
  658. package/vendor/use-agentic/ToolOutput.ts +60 -0
  659. package/vendor/use-agentic/Transcript.ts +50 -0
  660. package/vendor/use-agentic/WIRE.md +86 -0
  661. package/vendor/use-agentic/httpRunner.ts +131 -0
  662. package/vendor/use-agentic/index.ts +20 -0
  663. package/vendor/use-agentic/sharedContext.ts +25 -0
  664. package/vendor/use-agentic/surfaceContext.ts +10 -0
  665. package/vendor/use-agentic/types.ts +192 -0
  666. package/vendor/use-agentic/useAgent.ts +18 -0
  667. package/vendor/use-agentic/useAgentGuide.ts +16 -0
  668. package/vendor/use-agentic/useAgentResource.ts +36 -0
  669. package/vendor/use-agentic/useAgentState.ts +64 -0
  670. package/vendor/use-agentic/useAgentTool.ts +55 -0
  671. package/webkit/bootCsr.tsx +10 -8
  672. package/webkit/index.ts +4 -0
  673. package/webkit/lazy.tsx +5 -1
  674. package/webkit/useBodyScrollLock.tsx +29 -0
  675. package/webkit/useFrameRuntime.ts +1 -1
  676. package/webkit/usePageTool.tsx +37 -0
  677. package/webkit/useScreenScope.tsx +60 -0
  678. package/types/ui/Constant/Mermaid.d.ts +0 -8
  679. package/types/ui/Signal/Collapse.d.ts +0 -12
  680. package/ui/Constant/Mermaid.tsx +0 -149
  681. package/ui/Signal/Collapse.tsx +0 -29
package/CHANGELOG.md CHANGED
@@ -1,5 +1,108 @@
1
1
  # akanjs
2
2
 
3
+ ## 2.4.2
4
+
5
+ ### Minor Changes
6
+
7
+ - 11aa655: feat(constant): remove a relation's target with its owner via `cascade: "remove"`
8
+
9
+ A relation field can now take its target down with it: `image: field(File, { cascade: "remove" })`, arrays
10
+ included. The removal runs through the **target's service**, so the target's own `_postRemove` runs with it —
11
+ that is how removing a model also deletes the file's stored blob or object, with no extra wiring in the owning
12
+ module.
13
+
14
+ Only a relation accepts the option. A `String`, an `ID`, a scalar, and a nested array each fail while the class
15
+ is being built, naming the field: none of them points at a document the framework could remove.
16
+
17
+ Target services resolve lazily, at removal time, so a cascade adds no boot-order edge between two services and a
18
+ cascade cycle cannot fail the boot. They resolve _before_ the parent is touched, so a model cascading into a
19
+ module the app never mounted fails with nothing half-removed.
20
+
21
+ Two limits worth knowing. Nothing checks whether another document still references the same target, so declaring
22
+ `cascade` asserts that the field owns its target exclusively. And query-level removal (`deleteManyByQuery` /
23
+ `updateManyByQuery`) stamps `removedAt` in one atomic update that fires no hooks and therefore no cascade —
24
+ remove documents one at a time when they cascade.
25
+
26
+ - 11aa655: feat(store): invalidate sibling slices on create and refetch them in `Load.Units`
27
+
28
+ A model with more than one parent is listed by more than one slice, and a create could only ever be spliced
29
+ into the slice it was issued from. Creating a `bizDoc` from `bizDocInOrg` left `bizDocListInProject` without
30
+ it, and an RSC navigation back to that page replayed a cached payload whose server-stamped
31
+ `bizDocInitAtInProject` still satisfied `Load.Units`' cache check — so the new document stayed invisible until
32
+ a full reload.
33
+
34
+ `create<Model>` and `create<Model>InForm` now stamp a new per-slice `<model>StaleAt<Suffix>` on every slice
35
+ _except_ the one named by `sliceName`. Whether the new document belongs to a sibling slice is a server-side
36
+ filter decision, so the siblings are marked for revalidation rather than patched optimistically. `Load.Units`
37
+ refetches through `refresh<Model><Suffix>` when its slice's `StaleAt` is newer than its `InitAt`, and a
38
+ completed refresh restamps `InitAt` past `StaleAt` to end the stale state. The refetch is skipped while the
39
+ list is already loading, which also dedups several `Load.Units` mounted on one slice.
40
+
41
+ `Load.Units` also takes a `staleTime` prop, in milliseconds, for age-based revalidation independent of any
42
+ create: `staleTime={0}` always refetches on mount, `staleTime={30_000}` refetches only when the cached data is
43
+ older than 30s. Omitting it leaves the component purely invalidation-driven.
44
+
45
+ Update and remove are unchanged — they already walk every slice, because a document they touch is one the
46
+ cached lists can be searched for by id.
47
+
48
+ - 11aa655: feat(server): add subRoute hosts at runtime with `AKAN_SUB_ROUTE_HOSTS`
49
+
50
+ An app resolved a request Host to a basePath through a map fixed at build time — the domains written into
51
+ `akan.config.ts` plus the generated `<basePath>-<branch>.<serveDomain>`. A platform that mints its hostnames when
52
+ a project is created cannot write either one into the repo, so its subRoute hosts fell through to the root app.
53
+
54
+ `AKAN_SUB_ROUTE_HOSTS` adds to that map at boot, in the same spirit as `AKAN_PUBLIC_BASE_PATHS`:
55
+
56
+ ```
57
+ AKAN_SUB_ROUTE_HOSTS="soft=soft-abc.try.akanjs.com,soft.acme.com;office=office-abc.try.akanjs.com"
58
+ ```
59
+
60
+ Hosts are matched lowercased and without a port, exactly as the built-in ones are. The env mapping is a union with
61
+ the built one, never a replacement, so a tenant's own domains keep working and removing the env restores the
62
+ previous behaviour byte for byte.
63
+
64
+ A basePath the build does not serve is dropped with a warning rather than honoured — the route tree is a build
65
+ output, so accepting one would answer every request under it with a 404 and nothing to explain why. A malformed
66
+ entry is skipped the same way: the value is rendered by a deployment platform, and one bad character must not turn
67
+ into a boot loop across every pod.
68
+
69
+ `x-base-path` is now checked against the basePaths the build serves before it is trusted, matching the check
70
+ `getBasePathFromPathname` already applied to it. An unrecognised value falls through to host matching instead of
71
+ selecting a basePath that resolves to nothing.
72
+
73
+ - 25d5b15: feat(devkit): sync lib `page` trees into apps and honor `pageConfig.devOnly`
74
+
75
+ Apps can opt in with `syncPageLibs` (`true` / lib list) so `akan sync` links each lib's routes under
76
+ `page/(libs)/(<lib>)` — once per basePath when the app has subRoutes. The link is generated and
77
+ gitignored; the lib source stays the edit target. Collision on the resolved route pattern is a
78
+ sync-time error.
79
+
80
+ `pageConfig.devOnly: true` (literal only) keeps a route out of `akan build` while `akan start` still
81
+ serves it. On a `_layout` it excludes the whole subtree. Symlink-aware file ops avoid wiping a synced
82
+ lib when cleaning an app link, and dangling lib links no longer break `getApps`.
83
+
84
+ - 25d5b15: feat(signal): refresh websocket credentials in-session and re-check pubsub rooms
85
+
86
+ Handshake credentials now live on `AppWsData` (headers/cookies only). Clients that hold the token in
87
+ memory send it with `fetch.setJwt(...)`, which forwards an `__auth` frame; the server swaps the
88
+ snapshot synchronously and re-runs each subscribed room's guards, unsubscribing the ones that fail.
89
+
90
+ Guards should read the caller with `context.get("account")` instead of branching on HTTP vs websocket
91
+ transport. Slice-level guards still only wrap generated query/mutation endpoints — a pubsub endpoint
92
+ needs its own `guards` if the room itself must be protected.
93
+
94
+ ### Patch Changes
95
+
96
+ - 6d58c7e: add search feature for sqlit database with fts5
97
+ - 25d5b15: fix(ui): refresh EditModal when the hydrated edit payload is stale
98
+
99
+ RSC navigation can replay a cached page tree, and an edit shell hydrated from that payload can show
100
+ arbitrarily old form data. EditModal now treats a cache replay (or a `modelViewAt` older than 60s) as
101
+ stale and refetches via `edit<Model>` while keeping the modal open on the last known id.
102
+
103
+ - 42cf7a2: Normalize unsendable relayed WebSocket close codes to 1001 so Bun's global client WebSocket.close no longer throws InvalidAccessError at the gateway's client-to-upstream relay when a peer disappears without a close frame (code 1006). The upstream-to-client relay applies the same normalization defensively.
104
+ - 04cb46d: Allow the documented wsConnect export during source validation for root layouts, including base-path and grouped root boundaries, while continuing to reject it on nested layouts.
105
+
3
106
  ## 2.4.1
4
107
 
5
108
  ### Patch Changes
package/README.ko.md CHANGED
@@ -26,7 +26,7 @@ generated reference가 같은 의도에서 이어집니다.
26
26
 
27
27
  ## 요구사항
28
28
 
29
- - [Bun](https://bun.sh) `>=1.3.13`
29
+ - [Bun](https://bun.sh) `>=1.4.0`
30
30
  - TypeScript 중심의 애플리케이션 코드
31
31
  - React 기반 UI surface
32
32
 
package/README.md CHANGED
@@ -25,7 +25,7 @@ server, app packaging, deployment artifacts, and generated references.
25
25
 
26
26
  ## Requirements
27
27
 
28
- - [Bun](https://bun.sh) `>=1.3.13`
28
+ - [Bun](https://bun.sh) `>=1.4.0`
29
29
  - TypeScript-first application code
30
30
  - React-based UI surfaces
31
31
 
package/base/baseEnv.ts CHANGED
@@ -15,7 +15,7 @@ export interface BaseEnv {
15
15
  operationMode: "local" | "edge" | "cloud" | "module";
16
16
  databaseMode?: DatabaseMode;
17
17
  }
18
- export type BackendEnv = BaseEnv & {
18
+ export type BackendEnv = {
19
19
  hostname?: string | null;
20
20
  port?: number;
21
21
  database?: {
@@ -73,15 +73,18 @@ export type ClientEnv = BaseEnv & {
73
73
 
74
74
  let cachedEnv: ClientEnv | undefined;
75
75
 
76
+ const missingPublicEnv = (key: string) =>
77
+ `getEnv() cannot run at build time: akan build does not inject ${key}. Call it from a runtime function instead of at module scope (e.g. env(() => getEnv()) in adapt(), a method body, or a default thunk).`;
78
+
76
79
  /** Reads and caches Akan runtime environment values from process/browser environment settings. */
77
80
  export const getEnv = (): ClientEnv => {
78
81
  if (cachedEnv) return cachedEnv;
79
82
  const appName = process.env.AKAN_PUBLIC_APP_NAME ?? "unknown";
80
83
  const repoName = process.env.AKAN_PUBLIC_REPO_NAME ?? "unknown";
81
84
  const serveDomain = process.env.AKAN_PUBLIC_SERVE_DOMAIN ?? "unknown";
82
- if (appName === "unknown") throw new Error("environment variable AKAN_PUBLIC_APP_NAME is required");
83
- if (repoName === "unknown") throw new Error("environment variable AKAN_PUBLIC_REPO_NAME is required");
84
- if (serveDomain === "unknown") throw new Error("environment variable AKAN_PUBLIC_SERVE_DOMAIN is required");
85
+ if (appName === "unknown") throw new Error(missingPublicEnv("AKAN_PUBLIC_APP_NAME"));
86
+ if (repoName === "unknown") throw new Error(missingPublicEnv("AKAN_PUBLIC_REPO_NAME"));
87
+ if (serveDomain === "unknown") throw new Error(missingPublicEnv("AKAN_PUBLIC_SERVE_DOMAIN"));
85
88
  const environment = (process.env.AKAN_PUBLIC_ENV ?? "debug") as BaseEnv["environment"];
86
89
  const operationMode = (process.env.AKAN_PUBLIC_OPERATION_MODE ??
87
90
  (environment === "local" ? "local" : "cloud")) as BaseEnv["operationMode"];
@@ -44,7 +44,7 @@ export class PrimitiveRegistry {
44
44
  }
45
45
  }
46
46
 
47
- export type PrimitiveValue = string | number | boolean | Dayjs | Date | null | undefined;
47
+ export type PrimitiveValue = string | number | boolean | Dayjs | Date | Uint8Array | null | undefined;
48
48
  export class PrimitiveScalar {
49
49
  static refName: string;
50
50
  static [SERVER_VALUE]: unknown;
@@ -176,6 +176,49 @@ export class Any extends PrimitiveScalar {
176
176
  }
177
177
  PrimitiveRegistry.register(Any);
178
178
 
179
+ type NodeBuffer = Uint8Array & { toString(encoding: string): string };
180
+ interface BufferCtor {
181
+ from(buffer: ArrayBufferLike, byteOffset: number, length: number): NodeBuffer;
182
+ from(text: string, encoding: string): NodeBuffer;
183
+ }
184
+
185
+ export class Binary extends PrimitiveScalar {
186
+ static override refName: "Binary" = "Binary";
187
+ static override [SERVER_VALUE]: Uint8Array;
188
+ static override [CLIENT_VALUE]: Uint8Array;
189
+ static override [DEFAULT_VALUE]: Uint8Array | null = null;
190
+ static override [PURIFIED_VALUE]: Uint8Array | null = null;
191
+ static override [EXAMPLE_VALUE]: string = "AAEC";
192
+
193
+ static override validate(value: Uint8Array | string): boolean {
194
+ return value instanceof Uint8Array || typeof value === "string";
195
+ }
196
+ static override parseValue(input: Uint8Array | string): Uint8Array {
197
+ return typeof input === "string" ? Binary.#fromBase64(input) : input;
198
+ }
199
+ static override serializeValue(value: Uint8Array | string): string {
200
+ return typeof value === "string" ? value : Binary.#toBase64(value);
201
+ }
202
+
203
+ static #toBase64(bytes: Uint8Array): string {
204
+ const buffer = (globalThis as { Buffer?: BufferCtor }).Buffer;
205
+ if (buffer) return buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength).toString("base64");
206
+ let binary = "";
207
+ for (let idx = 0; idx < bytes.length; idx += 0x8000)
208
+ binary += String.fromCharCode(...bytes.subarray(idx, idx + 0x8000));
209
+ return btoa(binary);
210
+ }
211
+ static #fromBase64(text: string): Uint8Array {
212
+ const buffer = (globalThis as { Buffer?: BufferCtor }).Buffer;
213
+ if (buffer) return buffer.from(text, "base64");
214
+ const binary = atob(text);
215
+ const bytes = new Uint8Array(binary.length);
216
+ for (let idx = 0; idx < binary.length; idx += 1) bytes[idx] = binary.charCodeAt(idx);
217
+ return bytes;
218
+ }
219
+ }
220
+ PrimitiveRegistry.register(Binary);
221
+
179
222
  export class Upload extends PrimitiveScalar {
180
223
  static override refName: "Upload" = "Upload";
181
224
  static override [SERVER_VALUE]: File;
@@ -209,12 +252,12 @@ declare global {
209
252
  [DEFAULT_VALUE]: boolean;
210
253
  [PURIFIED_VALUE]: boolean;
211
254
  [EXAMPLE_VALUE]: boolean;
212
- validate(value: boolean | number): boolean;
213
- parseValue(input: boolean | number): boolean | number;
214
- serializeValue(value: boolean | number): boolean | number;
215
- _parse(input: boolean | number): boolean;
216
- _serialize(value: boolean | number): boolean;
217
- _checkValue(value: boolean | number): void;
255
+ validate(value: boolean | number | string): boolean;
256
+ parseValue(input: boolean | number | string): boolean | number | string;
257
+ serializeValue(value: boolean | number | string): boolean | number | string;
258
+ _parse(input: boolean | number | string): boolean;
259
+ _serialize(value: boolean | number | string): boolean;
260
+ _checkValue(value: boolean | number | string): void;
218
261
  }
219
262
  interface DateConstructor {
220
263
  refName: "Date";
@@ -305,10 +348,14 @@ Object.assign(String, scalarPrimitiveStatics, {
305
348
  });
306
349
  PrimitiveRegistry.register(String);
307
350
 
308
- const normalizeBooleanPrimitiveValue = (value: boolean | number): boolean | null => {
351
+ const normalizeBooleanPrimitiveValue = (value: boolean | number | string): boolean | null => {
309
352
  if (typeof value === "boolean") return value;
310
353
  if (value === 1) return true;
311
354
  if (value === 0) return false;
355
+ if (typeof value !== "string") return null;
356
+ const text = value.trim().toLowerCase();
357
+ if (text === "true" || text === "1") return true;
358
+ if (text === "false" || text === "0") return false;
312
359
  return null;
313
360
  };
314
361
 
@@ -317,13 +364,13 @@ Object.assign(Boolean, {
317
364
  refName: "Boolean",
318
365
  [DEFAULT_VALUE]: false,
319
366
  [EXAMPLE_VALUE]: true,
320
- validate(value: boolean | number) {
367
+ validate(value: boolean | number | string) {
321
368
  return normalizeBooleanPrimitiveValue(value) !== null;
322
369
  },
323
- parseValue(input: boolean | number) {
370
+ parseValue(input: boolean | number | string) {
324
371
  return normalizeBooleanPrimitiveValue(input) ?? input;
325
372
  },
326
- serializeValue(value: boolean | number) {
373
+ serializeValue(value: boolean | number | string) {
327
374
  return normalizeBooleanPrimitiveValue(value) ?? value;
328
375
  },
329
376
  });
@@ -350,4 +397,4 @@ Object.assign(Date, {
350
397
  });
351
398
  PrimitiveRegistry.register(Date);
352
399
 
353
- export type DefaultPrimitiveName = "String" | "Boolean" | "Date" | "Int" | "Float" | "ID" | "Any" | "Upload";
400
+ export type DefaultPrimitiveName = "String" | "Boolean" | "Date" | "Int" | "Float" | "ID" | "Any" | "Binary" | "Upload";
package/base/symbols.ts CHANGED
@@ -13,6 +13,10 @@ export const STATE_META = Symbol.for("akan.state");
13
13
  export const STATE_INIT_META = Symbol.for("akan.state.init");
14
14
  export const STATE_DERIVED_META = Symbol.for("akan.state.derived");
15
15
  export const ACTION_META = Symbol.for("akan.action");
16
+ /** Which module declared each action. See `ActionOwner`. */
17
+ export const ACTION_OWNER_META = Symbol.for("akan.action.owner");
18
+ /** What a dispatcher does, carried on the function so a component handed one can annotate the DOM with it. */
19
+ export const ACTION_TAG = Symbol.for("akan.action.tag");
16
20
  export const SERVER_VALUE = Symbol.for("akan.value.server");
17
21
  export const CLIENT_VALUE = Symbol.for("akan.value.client");
18
22
  export const DEFAULT_VALUE = Symbol.for("akan.value.default");
@@ -46,6 +46,28 @@ export type CapacitorContactsModule = {
46
46
  };
47
47
  };
48
48
 
49
+ export type CapacitorSpeechRecognitionModule = {
50
+ SpeechRecognition: {
51
+ available: () => Promise<{ available: boolean }>;
52
+ checkPermissions: () => Promise<{ speechRecognition: CapacitorPermissionState }>;
53
+ requestPermissions: () => Promise<{ speechRecognition: CapacitorPermissionState }>;
54
+ start: (options: Record<string, unknown>) => Promise<{ matches?: string[] }>;
55
+ stop: () => Promise<void>;
56
+ removeAllListeners: () => Promise<void> | void;
57
+ addListener: (
58
+ eventName: string,
59
+ listenerFunc: (data: { matches?: string[] }) => void,
60
+ ) => Promise<{ remove: () => Promise<void> | void }> | { remove: () => Promise<void> | void };
61
+ };
62
+ };
63
+
64
+ export type CapacitorTextToSpeechModule = {
65
+ TextToSpeech: {
66
+ speak: (options: { text: string; lang?: string; rate?: number }) => Promise<void>;
67
+ stop: () => Promise<void>;
68
+ };
69
+ };
70
+
49
71
  export type CapacitorCoreModule = {
50
72
  CapacitorCookies: {
51
73
  setCookie: (options: { key: string; value: string; path?: string }) => Promise<void> | void;
@@ -155,6 +177,8 @@ type CapacitorModuleMap = {
155
177
  preferences: CapacitorPreferencesModule;
156
178
  pushNotifications: CapacitorPushNotificationsModule;
157
179
  safeArea: CapacitorSafeAreaModule;
180
+ speechRecognition: CapacitorSpeechRecognitionModule;
181
+ textToSpeech: CapacitorTextToSpeechModule;
158
182
  updater: CapacitorUpdaterModule;
159
183
  };
160
184
 
@@ -257,6 +281,16 @@ export const loadCapacitorSafeArea = () =>
257
281
  SafeArea: getCapacitorPlugin<CapacitorSafeAreaModule["SafeArea"]>("SafeArea"),
258
282
  }));
259
283
 
284
+ export const loadCapacitorSpeechRecognition = () =>
285
+ loadCapacitorModule("speechRecognition", async () => ({
286
+ SpeechRecognition: getCapacitorPlugin<CapacitorSpeechRecognitionModule["SpeechRecognition"]>("SpeechRecognition"),
287
+ }));
288
+
289
+ export const loadCapacitorTextToSpeech = () =>
290
+ loadCapacitorModule("textToSpeech", async () => ({
291
+ TextToSpeech: getCapacitorPlugin<CapacitorTextToSpeechModule["TextToSpeech"]>("TextToSpeech"),
292
+ }));
293
+
260
294
  export const loadCapacitorUpdater = () =>
261
295
  loadCapacitorModule("updater", async () => ({
262
296
  CapacitorUpdater: getCapacitorPlugin<CapacitorUpdaterModule["CapacitorUpdater"]>("CapacitorUpdater"),
@@ -1,4 +1,5 @@
1
1
  import type { SliceMeta } from "akanjs/fetch";
2
+ import type { SerializedArg } from "akanjs/signal";
2
3
  import type { ReactNode } from "react";
3
4
  import type { TransMessageOption } from "./makePageProto";
4
5
 
@@ -47,6 +48,10 @@ type RuntimeFetch = typeof globalThis.fetch & {
47
48
  serializedSignal: Record<string, unknown>;
48
49
  setJwt: (jwt: string | null) => void;
49
50
  slice: Record<string, SliceMeta>;
51
+ /** Sort keys per model refName, registered from each serialized signal's filter. */
52
+ sortKeyMap?: Map<string, string[]>;
53
+ /** Filter queries per model refName, with the args each one takes — what the root slice picks from. */
54
+ filterQueryMap?: Map<string, { [queryKey: string]: SerializedArg[] }>;
50
55
  ws: RuntimeWs;
51
56
  [key: string]: unknown;
52
57
  };
@@ -1,9 +1,10 @@
1
1
  "use client";
2
2
  import type { ReactDOMAttributes } from "@use-gesture/react/dist/declarations/src/types";
3
3
  import type { PromiseOrObject } from "akanjs/base";
4
- import { createContext, type ForwardRefExoticComponent, type ReactNode, type RefObject, useContext } from "react";
4
+ import { type ForwardRefExoticComponent, type ReactNode, type RefObject, useContext } from "react";
5
5
  import type { AnimatedComponent, AnimatedProps, Interpolation, SpringValue } from "react-spring";
6
6
  import type { RouterInstance } from "./router";
7
+ import { sharedContext } from "./sharedContext";
7
8
  import type { ReactFont } from "./types";
8
9
 
9
10
  export type TransitionType = "none" | "fade" | "bottomUp" | "stack" | "scaleOut";
@@ -349,7 +350,7 @@ export type UseCsrTransition = CsrTransitionStyles & {
349
350
  };
350
351
 
351
352
  export type CsrContextType = RouteState & UseCsrTransition;
352
- export const csrContext = createContext<CsrContextType>({} as unknown as CsrContextType);
353
+ export const csrContext = sharedContext<CsrContextType>("csr", {} as unknown as CsrContextType);
353
354
  export const useCsr = () => {
354
355
  const contextValues = useContext(csrContext);
355
356
  return contextValues;
@@ -363,7 +364,7 @@ export interface PathContextType {
363
364
  setGestureEnabled: (enabled: boolean) => void;
364
365
  registerFrameSlot: (slot: FrameSlotRegistration) => () => void;
365
366
  }
366
- export const pathContext = createContext<PathContextType>({} as unknown as PathContextType);
367
+ export const pathContext = sharedContext<PathContextType>("path", {} as unknown as PathContextType);
367
368
  export const usePathCtx = () => {
368
369
  const contextValues = useContext(pathContext);
369
370
  return contextValues;
package/client/index.ts CHANGED
@@ -11,6 +11,7 @@ export * from "./locale";
11
11
  export * from "./makePageProto";
12
12
  export * from "./router";
13
13
  export * from "./rscNavigation";
14
+ export * from "./sharedContext";
14
15
  export * from "./storage";
15
16
  export * from "./translator";
16
17
  export * from "./types";
package/client/locale.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  "use client";
2
- import { createContext } from "react";
2
+ import { sharedContext } from "./sharedContext";
3
3
 
4
- export const dictionaryContext = createContext<{ [key: string]: { [key: string]: string } }>({});
4
+ export const dictionaryContext = sharedContext<{ [key: string]: { [key: string]: string } }>("dictionary", {});
@@ -0,0 +1,31 @@
1
+ "use client";
2
+ import { type Context, createContext } from "react";
3
+
4
+ /**
5
+ * A React context interned on `globalThis`, which is how every context this framework owns must be made.
6
+ *
7
+ * An akan build does not give an app one copy of `akanjs`: it inlines each reachable module into every client
8
+ * chunk that reaches it — four copies of the agent runtime in this repo's own docs app. A context is identified
9
+ * by object identity, so a Provider mounted from one copy is invisible to a consumer holding another, and the
10
+ * consumer silently reads the context's default instead.
11
+ *
12
+ * Silently is the whole problem. `UiOverrideContext` was a plain `createContext`, so a route's `_overrides.tsx`
13
+ * bound its slots in the chunk holding the generated provider and every overridable component in another chunk
14
+ * kept rendering the framework default — no throw, no warning, and only *some* slots affected, which reads like
15
+ * a bug in the app's own component. The same shape cost a zone every tool it declared.
16
+ *
17
+ * The rule is therefore mechanical rather than case-by-case: a context whose Provider and consumers can be
18
+ * bundled apart is every context worth having, so all of them go through here. A test fails if one does not.
19
+ *
20
+ * `use-agentic` carries its own twin under a `useAgentic.` prefix, deliberately — it ships as a standalone
21
+ * package and cannot import this one. The prefixes keep the two namespaces from ever meeting.
22
+ */
23
+ export const sharedContext = <T>(name: string, initial: T): Context<T> => {
24
+ const key = Symbol.for(`akanjs.context.${name}`);
25
+ const holder = globalThis as typeof globalThis & { [slot: symbol]: Context<T> | undefined };
26
+ const existing = holder[key];
27
+ if (existing) return existing;
28
+ const created = createContext(initial);
29
+ holder[key] = created;
30
+ return created;
31
+ };
@@ -1,4 +1,4 @@
1
- import { pathGet } from "akanjs/common";
1
+ import { pathGetLoose } from "akanjs/common";
2
2
 
3
3
  export interface Dictionary {
4
4
  [key: string]: {
@@ -63,7 +63,7 @@ export class Translator {
63
63
  static translateByLocale(lang: string, key: string, param?: Record<string, string | number>): string {
64
64
  const dictionary = getTranslatorState().langDictionaryMap.get(lang);
65
65
  if (!dictionary) return key;
66
- const msg = (pathGet(key, dictionary, ".", { t: key }) as { t: string }).t;
66
+ const msg = (pathGetLoose(key, dictionary, ".", { t: key }) as { t: string }).t;
67
67
  return param ? msg.replace(/{([^}]+)}/g, (_, key: string) => param[key] as string) : msg;
68
68
  }
69
69
 
package/client/types.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { BaseInsight } from "akanjs/constant";
2
- import type { FetchInitForm, SliceMeta } from "akanjs/fetch";
2
+ import type { FetchInitForm, QuerySetting, SliceMeta } from "akanjs/fetch";
3
3
  import type { ReactElement, ReactNode } from "react";
4
4
 
5
5
  export type ReactFontStyle = "normal" | "italic" | "oblique";
@@ -109,7 +109,7 @@ const slugFontPart = (value: string) =>
109
109
  export interface ModelsProps<M extends { id: string }> {
110
110
  className?: string;
111
111
  slice?: SliceMeta;
112
- query?: Record<string, unknown>;
112
+ query?: QuerySetting;
113
113
  init?: FetchInitForm<any, any>;
114
114
  onClickItem?: (model: M) => unknown;
115
115
  }
@@ -127,7 +127,7 @@ export type ModelProps<T extends string, L extends { id: string }> = { [key in T
127
127
  export interface ModelDashboardProps<Summary> {
128
128
  className?: string;
129
129
  summary: Summary;
130
- queryMap?: Record<string, unknown>;
130
+ queryMap?: { [column: string]: QuerySetting };
131
131
  columns?: (keyof Summary)[];
132
132
  hidePresents?: boolean;
133
133
  slice?: SliceMeta;
@@ -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,13 +19,20 @@ 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
34
  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);
35
+ if (typeof objRecord[key] !== "function") val[key] = objectifyChild(objRecord[key], option);
22
36
  });
23
37
  return val as T;
24
38
  } else {
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,
@@ -27,15 +33,26 @@ export {
27
33
  resolveAkanI18nConfig,
28
34
  } from "./localeConfig";
29
35
  export { lowerlize } from "./lowerlize";
36
+ export {
37
+ isMcpDescribableArg,
38
+ type McpExposureEndpoint,
39
+ type McpExposureOption,
40
+ mcpBaseVerbOf,
41
+ mcpHintsOf,
42
+ mcpPromptRefusalOf,
43
+ mcpRefusalOf,
44
+ } from "./mcpExposure";
30
45
  export { mergeVersion } from "./mergeVersion";
31
46
  export { objectify } from "./objectify";
32
47
  export { pathGet } from "./pathGet";
48
+ export { pathGetLoose } from "./pathGetLoose";
33
49
  export { pathSet } from "./pathSet";
34
50
  export { randomPick } from "./randomPick";
35
51
  export { randomPicks } from "./randomPicks";
36
52
  export {
37
53
  assertUniqueRoutePatterns,
38
54
  compareRouteSpecificity,
55
+ getPageSourceFileViolation,
39
56
  getRouteExports,
40
57
  isRouteSourceFile,
41
58
  isSpecialRouteLeaf,
@@ -65,3 +82,4 @@ export {
65
82
  type WebsocketAuthRequest,
66
83
  websocketAuthContract,
67
84
  } from "./websocketAuth";
85
+ export { type WebsocketBinaryFrame, websocketBinaryFrameContract } from "./websocketBinaryFrame";