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
@@ -1,20 +1,22 @@
1
1
  "use client";
2
2
  import { PrimitiveRegistry } from "akanjs/base";
3
- import { usePage } from "akanjs/client";
3
+ import { cn, usePage } from "akanjs/client";
4
+ import { mcpHintsOf, mcpRefusalOf } from "akanjs/common";
4
5
  import { type ConstantCls, ConstantRegistry } from "akanjs/constant";
5
6
  import { FetchClient, type FetchProxy } from "akanjs/fetch";
6
7
  import type { SerializedEndpoint } from "akanjs/signal";
7
8
  import { st } from "akanjs/store";
8
- import { useMemo, useState } from "react";
9
- import { AiOutlineApi, AiOutlineCopy, AiOutlineFileWord, AiOutlineSend } from "react-icons/ai";
9
+ import { type ReactNode, useMemo, useState } from "react";
10
+ import { AiOutlineApi, AiOutlineCopy, AiOutlineFileWord, AiOutlineSend, AiOutlineWarning } from "react-icons/ai";
10
11
  import { buttonRecipe } from "../Button";
11
12
  import { Copy } from "../Copy";
13
+ import { Collapse, dictText, docPill, docUi, Panel, Segmented } from "../Reference";
12
14
  import { Signal } from ".";
13
15
  import Arg from "./Arg";
14
- import { SignalCollapse } from "./Collapse";
16
+ import { endpointEntriesOf, guardsOf, isWsEndpoint, matchesGuards, matchesSearch } from "./endpointEntries";
15
17
  import { getExampleData } from "./makeExample";
16
18
  import Response from "./Response";
17
- import { getEndpointBadgeClassName, getGuardBadgeClassName, signalUi } from "./style";
19
+ import { getGuardBadgeClassName, getMcpBadgeClassName, getMethodBadgeClassName, getMethodLabel } from "./style";
18
20
 
19
21
  type RestApiFetchFn = (
20
22
  ...args: [...args: unknown[], option: { token?: string; crystalize?: boolean }]
@@ -24,6 +26,22 @@ export default function RestApi() {
24
26
  return <div></div>;
25
27
  }
26
28
 
29
+ const restViewItems = [
30
+ { key: "doc", label: "Reference", icon: <AiOutlineFileWord /> },
31
+ { key: "test", label: "Try it", icon: <AiOutlineApi /> },
32
+ ] as const;
33
+
34
+ interface ArgSectionProps {
35
+ label: string;
36
+ children: ReactNode;
37
+ }
38
+ const ArgSection = ({ label, children }: ArgSectionProps) => (
39
+ <div className="flex flex-col gap-2">
40
+ <div className={docUi.sectionLabel}>{label}</div>
41
+ {children}
42
+ </div>
43
+ );
44
+
27
45
  interface RestApiEndpointsProps {
28
46
  refName: string;
29
47
  fetch: FetchProxy;
@@ -31,45 +49,34 @@ interface RestApiEndpointsProps {
31
49
  endpoints?: string[];
32
50
  openAll?: boolean;
33
51
  httpUri?: string;
52
+ search?: string;
34
53
  }
35
- const RestApiEndpoints = ({ refName, fetch, prefix, endpoints, openAll, httpUri }: RestApiEndpointsProps) => {
36
- const tryRoles = st.use.tryRoles();
54
+ const RestApiEndpoints = ({ refName, fetch, prefix, endpoints, openAll, httpUri, search }: RestApiEndpointsProps) => {
55
+ const tryGuards = st.use.tryGuards({ agent: false });
37
56
  const signal = fetch.serializedSignal[refName];
57
+ if (!signal) return <div className={docUi.emptyPanel}>No signal is registered as “{refName}”.</div>;
38
58
  const signalPrefix = prefix ?? signal.prefix;
39
- const baseEndpointEntries = Object.entries(FetchClient.getBaseEndpoint(refName, signal));
40
- const sliceEndpointEntries = signal.slice
41
- ? Object.entries(signal.slice).flatMap(([suffix, slice]) => {
42
- const endpoint = FetchClient.getEndpointFromSlice(refName, suffix, slice);
43
- return Object.entries(endpoint);
44
- })
45
- : [];
46
- const endpointEntries = [...baseEndpointEntries, ...sliceEndpointEntries, ...Object.entries(signal.endpoint)]
47
- .filter(([key, endpoint]) => !endpoints || endpoints.includes(key))
48
- .sort(([keyA], [keyB]) => (keyA > keyB ? 1 : -1))
49
- .filter(([key, endpoint]) => {
50
- if (endpoint.type === "pubsub" || endpoint.type === "message") return false;
51
- if (!endpoint.guards?.length) return true;
52
- if (endpoint.guards?.includes("Public") && tryRoles.includes("Public")) return true;
53
- if ((endpoint.guards?.includes("User") || endpoint.guards?.includes("Every")) && tryRoles.includes("User"))
54
- return true;
55
- if ((endpoint.guards?.includes("Admin") || endpoint.guards?.includes("Every")) && tryRoles.includes("Admin"))
56
- return true;
57
- if (
58
- (endpoint.guards?.includes("SuperAdmin") || endpoint.guards?.includes("Every")) &&
59
- tryRoles.includes("SuperAdmin")
60
- )
61
- return true;
62
- return false;
63
- });
59
+ const endpointEntries = endpointEntriesOf(refName, fetch)
60
+ .filter(({ key }) => !endpoints || endpoints.includes(key))
61
+ .filter(({ key, endpoint }) =>
62
+ matchesSearch(key, FetchClient.makeHttpUrl(key, endpoint, signalPrefix, new Map()), search ?? ""),
63
+ )
64
+ .filter(({ endpoint }) => !isWsEndpoint(endpoint) && matchesGuards(endpoint, tryGuards));
65
+ if (!endpointEntries.length)
66
+ return (
67
+ <div className={docUi.emptyPanel}>
68
+ {search?.trim() ? `No endpoint matches “${search.trim()}”.` : "No endpoint is gated by the selected guards."}
69
+ </div>
70
+ );
64
71
  return (
65
- <div>
66
- {endpointEntries.map(([endpointKey, endpoint], idx) => (
72
+ <div className="flex flex-col gap-2">
73
+ {endpointEntries.map(({ key, endpoint }) => (
67
74
  <RestApiEndpoint
68
- key={endpointKey}
75
+ key={key}
69
76
  signalPrefix={signalPrefix}
70
77
  refName={refName}
71
78
  fetch={fetch}
72
- endpointKey={endpointKey}
79
+ endpointKey={key}
73
80
  endpoint={endpoint}
74
81
  open={openAll}
75
82
  httpUri={httpUri}
@@ -102,73 +109,62 @@ const RestApiEndpoint = ({
102
109
  const { l } = usePage();
103
110
  const [viewStatus, setViewStatus] = useState<"doc" | "test">("doc");
104
111
  const path = FetchClient.makeHttpUrl(endpointKey, endpoint, signalPrefix, new Map());
112
+
113
+ const mcpRefusal = mcpRefusalOf(endpoint, { refName, key: endpointKey });
114
+ const guards = guardsOf(endpoint);
115
+ const label = dictText(l, `${refName}.signal.${endpointKey}`);
116
+ const desc = dictText(l, `${refName}.signal.${endpointKey}.desc`);
117
+ const hints = Object.entries(mcpHintsOf(endpointKey, endpoint)).filter(([, on]) => on);
105
118
  return (
106
- <SignalCollapse
119
+ <Collapse
107
120
  open={open}
108
- contentClassName="bg-background/60"
109
121
  summary={
110
- <div className="flex flex-wrap items-center gap-2">
111
- <div className={getEndpointBadgeClassName(endpoint.type)}>{endpoint.type === "query" ? "GET" : "POST"}</div>
112
- <div className="font-bold text-lg">{path}</div>
113
- <div className="text-foreground/70 text-sm">{l._(`${refName}.signal.${endpointKey}`)}</div>
114
- </div>
115
- }
116
- >
117
- <div>
118
- <div className="rounded-xl bg-background p-3">
119
- <div className={signalUi.sectionTitle}>Description</div>
120
- {endpoint.guards?.some((guard) => guard !== "None") ? (
121
- <div className="mt-2 flex flex-wrap items-center gap-2 font-normal text-sm">
122
- <span className="text-foreground/70">Guards</span>
123
- {endpoint.guards.map((guard) => (
122
+ <div className="flex min-w-0 flex-col gap-1.5">
123
+ <div className="flex flex-wrap items-center gap-2">
124
+ <span className={getMethodBadgeClassName(endpoint.type)}>{getMethodLabel(endpoint.type)}</span>
125
+ <span className="break-all font-medium font-mono text-sm">{path}</span>
126
+ <span className="ml-auto flex flex-wrap items-center gap-1.5">
127
+ {guards.map((guard) => (
124
128
  <span className={getGuardBadgeClassName(guard)} key={guard}>
125
129
  {guard}
126
130
  </span>
127
131
  ))}
128
- </div>
129
- ) : null}
130
- <div className="mt-2 font-normal text-foreground/70 text-sm">
131
- {l._(`${refName}.signal.${endpointKey}.desc`)}
132
+ <span className={getMcpBadgeClassName(!mcpRefusal)}>{mcpRefusal ? "MCP refused" : "MCP"}</span>
133
+ </span>
132
134
  </div>
135
+ {label ? <div className="text-foreground/55 text-sm">{label}</div> : null}
133
136
  </div>
134
- <div className="inline-flex w-fit overflow-hidden rounded-field">
135
- <button
136
- onClick={() => {
137
- setViewStatus("doc");
138
- }}
139
- className={buttonRecipe(
140
- { variant: viewStatus === "doc" ? "primary" : "outline", size: "sm" },
141
- "rounded-none",
142
- )}
143
- >
144
- <AiOutlineFileWord className="text-xl" /> View Doc
145
- </button>
146
- <button
147
- onClick={() => {
148
- setViewStatus("test");
149
- }}
150
- className={buttonRecipe(
151
- { variant: viewStatus === "test" ? "primary" : "outline", size: "sm" },
152
- "rounded-none",
153
- )}
154
- >
155
- <AiOutlineApi className="text-xl" /> Restful API
156
- </button>
137
+ }
138
+ >
139
+ {desc ? <p className={docUi.prose}>{desc}</p> : null}
140
+ {mcpRefusal ? (
141
+ <div className="flex items-start gap-2 rounded-box border border-warning/30 bg-warning/10 p-3 text-sm text-warning">
142
+ <AiOutlineWarning className="mt-0.5 shrink-0" />
143
+ <span>{mcpRefusal}</span>
157
144
  </div>
158
- {viewStatus === "doc" ? (
159
- <RestApiInterface refName={refName} endpointKey={endpointKey} endpoint={endpoint} />
160
- ) : (
161
- <RestApiTry
162
- signalPrefix={signalPrefix}
163
- fetch={fetch}
164
- refName={refName}
165
- endpointKey={endpointKey}
166
- endpoint={endpoint}
167
- httpUri={httpUri}
168
- />
169
- )}
170
- </div>
171
- </SignalCollapse>
145
+ ) : hints.length ? (
146
+ <div className="flex flex-wrap items-center gap-1.5">
147
+ {hints.map(([hint]) => (
148
+ <span className={docPill("muted")} key={hint}>
149
+ {hint}
150
+ </span>
151
+ ))}
152
+ </div>
153
+ ) : null}
154
+ <Segmented items={restViewItems} onChange={setViewStatus} value={viewStatus} />
155
+ {viewStatus === "doc" ? (
156
+ <RestApiInterface refName={refName} endpointKey={endpointKey} endpoint={endpoint} />
157
+ ) : (
158
+ <RestApiTry
159
+ signalPrefix={signalPrefix}
160
+ fetch={fetch}
161
+ refName={refName}
162
+ endpointKey={endpointKey}
163
+ endpoint={endpoint}
164
+ httpUri={httpUri}
165
+ />
166
+ )}
167
+ </Collapse>
172
168
  );
173
169
  };
174
170
  RestApi.Endpoint = RestApiEndpoint;
@@ -181,58 +177,31 @@ interface RestApiInterfaceProps {
181
177
  const RestApiInterface = ({ refName, endpointKey, endpoint }: RestApiInterfaceProps) => {
182
178
  const returnRef = ConstantRegistry.getModelRef(endpoint.returns.refName, endpoint.returns.modelType);
183
179
  const isReturnModelType = !PrimitiveRegistry.has(returnRef);
184
- const uploadArgs = endpoint.args.filter((arg) => arg.type === "upload");
185
- const paramArgs = endpoint.args.filter((arg) => arg.type === "param");
186
- const searchArgs = endpoint.args.filter((arg) => arg.type === "search");
187
- const bodyArgs = endpoint.args.filter((arg) => arg.type === "body");
180
+ const argSections = [
181
+ { label: "Form data", args: endpoint.args.filter((arg) => arg.type === "upload") },
182
+ { label: "Path parameters", args: endpoint.args.filter((arg) => arg.type === "param") },
183
+ { label: "Query", args: endpoint.args.filter((arg) => arg.type === "search") },
184
+ { label: "Body", args: endpoint.args.filter((arg) => arg.type === "body") },
185
+ ].filter((section) => section.args.length);
188
186
  return (
189
187
  <div className="flex w-full flex-col gap-4">
190
- {uploadArgs.length ? (
191
- <div>
192
- <div className={signalUi.sectionTitle}>Form data upload</div>
193
- <div className={signalUi.tablePanel}>
194
- <Arg.Table refName={refName} endpointKey={endpointKey} args={uploadArgs} />
188
+ {argSections.map((section) => (
189
+ <ArgSection key={section.label} label={section.label}>
190
+ <div className={docUi.tablePanel}>
191
+ <Arg.Table refName={refName} endpointKey={endpointKey} args={section.args} />
195
192
  </div>
196
- </div>
197
- ) : null}
198
- {paramArgs.length ? (
199
- <div>
200
- <div className={signalUi.sectionTitle}>Parameters</div>
201
- <div className={signalUi.tablePanel}>
202
- <Arg.Table refName={refName} endpointKey={endpointKey} args={paramArgs} />
203
- </div>
204
- </div>
205
- ) : null}
206
- {searchArgs.length ? (
207
- <div>
208
- <div className={signalUi.sectionTitle}>Query</div>
209
- <div className={signalUi.tablePanel}>
210
- <Arg.Table refName={refName} endpointKey={endpointKey} args={searchArgs} />
211
- </div>
212
- </div>
213
- ) : null}
214
- {bodyArgs.length ? (
215
- <div>
216
- <div className={signalUi.sectionTitle}>Body</div>
217
- <div className={signalUi.tablePanel}>
218
- <Arg.Table refName={refName} endpointKey={endpointKey} args={bodyArgs} />
219
- </div>
220
- </div>
221
- ) : null}
222
- <div className="font-bold text-lg">
223
- <div className="flex w-full flex-col gap-2 rounded-md font-normal md:flex-row">
224
- <div className="w-full md:w-1/2">
225
- <div className={signalUi.sectionTitle}>Response Type</div>
226
- <div className="max-h-72 overflow-auto rounded-xl bg-background p-4 md:h-72">
227
- Returns: <Signal.Object.Type objRef={returnRef} arrDepth={endpoint.returns.arrDepth ?? 0} />
228
- {isReturnModelType ? <Signal.Object.Detail objRef={returnRef as ConstantCls} /> : null}
229
- </div>
230
- </div>
231
- <div className="w-full md:w-1/2">
232
- <div className={signalUi.sectionTitle}>Response Example</div>
233
- <Response.Example endpoint={endpoint} />
193
+ </ArgSection>
194
+ ))}
195
+ <div className="grid gap-3 md:grid-cols-2 md:items-start">
196
+ <Panel bodyClassName="max-h-none" label="Returns">
197
+ <div className="flex flex-col items-start gap-3">
198
+ <Signal.Object.Type objRef={returnRef} arrDepth={endpoint.returns.arrDepth ?? 0} />
199
+ {isReturnModelType ? (
200
+ <Signal.Object.Detail className="w-full border-0 bg-transparent" objRef={returnRef as ConstantCls} />
201
+ ) : null}
234
202
  </div>
235
- </div>
203
+ </Panel>
204
+ <Response.Example endpoint={endpoint} />
236
205
  </div>
237
206
  </div>
238
207
  );
@@ -252,7 +221,7 @@ const RestApiTry = ({ signalPrefix, refName, endpointKey, endpoint, fetch, httpU
252
221
  const paramArgs = endpoint.args.filter((arg) => arg.type === "param");
253
222
  const bodyArgs = endpoint.args.filter((arg) => arg.type === "body");
254
223
  const uploadArgs = endpoint.args.filter((arg) => arg.type === "upload");
255
- const tryJwt = st.use.tryJwt();
224
+ const tryJwt = st.use.tryJwt({ agent: false });
256
225
  const paramExample = useMemo(() => getExampleData<string>(paramArgs, "restapi"), []);
257
226
  const queryExample = useMemo(() => getExampleData<string>(queryArgs, "restapi"), []);
258
227
  const bodyExample = useMemo(() => JSON.stringify(getExampleData(bodyArgs, "restapi"), null, 2), []);
@@ -307,77 +276,78 @@ const RestApiTry = ({ signalPrefix, refName, endpointKey, endpoint, fetch, httpU
307
276
  };
308
277
  return (
309
278
  <div className="flex w-full flex-col gap-4">
310
- <div className="flex flex-wrap items-center gap-2 rounded-xl bg-background p-3">
311
- <div className={signalUi.sectionTitle}>Request URL</div>
279
+ <div className="flex flex-wrap items-center gap-2 rounded-box border border-border bg-background px-3 py-2">
280
+ <span className={getMethodBadgeClassName(endpoint.type)}>{getMethodLabel(endpoint.type)}</span>
281
+ <span className="min-w-0 flex-1 break-all font-mono text-foreground/80 text-sm">
282
+ {httpUri ?? ""}
283
+ {requestPath}
284
+ </span>
312
285
  <Copy text={`${httpUri ?? ""}${requestPath}`}>
313
- <button className={buttonRecipe({ variant: "outline", size: "sm" })}>
314
- {requestPath} <AiOutlineCopy />
286
+ <button className={buttonRecipe({ variant: "ghost", size: "xs" }, "text-foreground/50")} type="button">
287
+ <AiOutlineCopy />
315
288
  </button>
316
289
  </Copy>
317
290
  </div>
318
291
  {uploadArgs.length ? (
319
- <div>
320
- <div className={signalUi.sectionTitle}>Form data upload</div>
321
- {uploadArgs.map((arg) => (
322
- <Arg.FormData
323
- key={arg.name}
324
- endpointKey={endpointKey}
325
- arg={arg}
326
- value={""}
327
- onChange={(fileList: FileList) => {
328
- setUploadRequest({ ...uploadRequest, [arg.name]: fileList });
329
- }}
330
- />
331
- ))}
332
- </div>
292
+ <ArgSection label="Form data">
293
+ <div className={docUi.panel}>
294
+ {uploadArgs.map((arg) => (
295
+ <Arg.FormData
296
+ key={arg.name}
297
+ endpointKey={endpointKey}
298
+ arg={arg}
299
+ value={""}
300
+ onChange={(fileList: FileList) => {
301
+ setUploadRequest({ ...uploadRequest, [arg.name]: fileList });
302
+ }}
303
+ />
304
+ ))}
305
+ </div>
306
+ </ArgSection>
333
307
  ) : null}
334
308
  {paramArgs.length ? (
335
- <div className={signalUi.sectionPanel}>
336
- <div className={signalUi.sectionTitle}>Parameters</div>
337
- {paramArgs.map((arg, idx) => (
338
- <Arg.Param
339
- key={idx}
340
- endpointKey={endpointKey}
341
- arg={arg}
342
- value={paramRequest[arg.name]}
343
- onChange={(value: string) => {
344
- setParamRequest({ ...paramRequest, [arg.name]: value });
345
- }}
346
- />
347
- ))}
348
- </div>
309
+ <ArgSection label="Path parameters">
310
+ <div className={cn(docUi.panel, "px-3 py-1")}>
311
+ {paramArgs.map((arg, idx) => (
312
+ <Arg.Param
313
+ key={idx}
314
+ endpointKey={endpointKey}
315
+ arg={arg}
316
+ value={paramRequest[arg.name]}
317
+ onChange={(value: string) => {
318
+ setParamRequest({ ...paramRequest, [arg.name]: value });
319
+ }}
320
+ />
321
+ ))}
322
+ </div>
323
+ </ArgSection>
349
324
  ) : null}
350
325
  {queryArgs.length ? (
351
- <div className={signalUi.sectionPanel}>
352
- <div className={signalUi.sectionTitle}>Queries</div>
353
- {queryArgs.map((arg, idx) => (
354
- <Arg.Query
355
- key={idx}
356
- endpointKey={endpointKey}
357
- arg={arg}
358
- value={queryRequest[arg.name] ?? ""}
359
- onChange={(value: string) => {
360
- setQueryRequest({ ...queryRequest, [arg.name]: value });
361
- }}
362
- />
363
- ))}
364
- </div>
326
+ <ArgSection label="Query">
327
+ <div className={cn(docUi.panel, "px-3 py-1")}>
328
+ {queryArgs.map((arg, idx) => (
329
+ <Arg.Query
330
+ key={idx}
331
+ endpointKey={endpointKey}
332
+ arg={arg}
333
+ value={queryRequest[arg.name] ?? ""}
334
+ onChange={(value: string) => {
335
+ setQueryRequest({ ...queryRequest, [arg.name]: value });
336
+ }}
337
+ />
338
+ ))}
339
+ </div>
340
+ </ArgSection>
365
341
  ) : null}
366
342
  {bodyArgs.length ? (
367
- <div>
368
- <div className={signalUi.sectionTitle}>Body</div>
343
+ <ArgSection label="Body">
369
344
  <Arg.Json value={bodyRequest} onChange={setBodyRequest} />
370
- </div>
345
+ </ArgSection>
371
346
  ) : null}
372
- <div>
373
- <button className={buttonRecipe({ variant: "primary" }, "w-full")} onClick={() => void onSend()}>
374
- <AiOutlineSend className="-mt-0.5" /> Send Request
375
- </button>
376
- </div>
377
- <div>
378
- <div className={signalUi.sectionTitle}>Response</div>
379
- <Response.Result status={response.status} data={response.data as object} />
380
- </div>
347
+ <button className={buttonRecipe({ variant: "primary" }, "w-full")} onClick={() => void onSend()} type="button">
348
+ <AiOutlineSend /> Send Request
349
+ </button>
350
+ <Response.Result status={response.status} data={response.data as object} />
381
351
  </div>
382
352
  );
383
353
  };
@@ -1,5 +1,8 @@
1
1
  "use client";
2
2
  import type { FetchProxy } from "akanjs/fetch";
3
+ import { st } from "akanjs/store";
4
+ import { docUi } from "../Reference";
5
+ import { endpointEntriesOf, isWsEndpoint, matchesGuards, matchesSearch } from "./endpointEntries";
3
6
  import Message from "./Message";
4
7
  import PubSub from "./PubSub";
5
8
 
@@ -11,36 +14,36 @@ interface WebSocketEndpointsProps {
11
14
  refName: string;
12
15
  fetch: FetchProxy;
13
16
  openAll?: boolean;
17
+ search?: string;
14
18
  }
15
- const WebSocketEndpoints = ({ refName, fetch, openAll }: WebSocketEndpointsProps) => {
16
- const signal = fetch.serializedSignal[refName];
19
+ const WebSocketEndpoints = ({ refName, fetch, openAll, search }: WebSocketEndpointsProps) => {
20
+ const tryGuards = st.use.tryGuards({ agent: false });
21
+ if (!fetch.serializedSignal[refName])
22
+ return <div className={docUi.emptyPanel}>No signal is registered as “{refName}”.</div>;
23
+ const wsEntries = endpointEntriesOf(refName, fetch).filter(({ endpoint }) => isWsEndpoint(endpoint));
17
24
 
18
- const endpointEntries = Object.entries(signal.endpoint)
19
- .sort(([keyA], [keyB]) => (keyA > keyB ? 1 : -1))
20
- .filter(([key, endpoint]) => {
21
- if (endpoint.type === "query" || endpoint.type === "mutation") return false;
22
-
23
- return false;
24
- });
25
+ const endpointEntries = wsEntries
26
+ .filter(({ endpoint }) => matchesGuards(endpoint, tryGuards))
27
+ .filter(({ key }) => matchesSearch(key, key, search ?? ""));
28
+ if (!endpointEntries.length)
29
+ return (
30
+ <div className={docUi.emptyPanel}>
31
+ {!wsEntries.length
32
+ ? "This signal declares no websocket endpoint."
33
+ : search?.trim()
34
+ ? `No endpoint matches “${search.trim()}”.`
35
+ : "No websocket endpoint is gated by the selected guards."}
36
+ </div>
37
+ );
25
38
  return (
26
39
  <div className="flex flex-col gap-2">
27
- {endpointEntries.map(([endpointKey, endpoint], idx) => {
28
- if (endpoint.type === "pubsub") {
29
- return (
30
- <PubSub.Endpoint key={idx} refName={refName} endpointKey={endpointKey} endpoint={endpoint} open={openAll} />
31
- );
32
- } else {
33
- return (
34
- <Message.Endpoint
35
- key={idx}
36
- refName={refName}
37
- endpointKey={endpointKey}
38
- endpoint={endpoint}
39
- open={openAll}
40
- />
41
- );
42
- }
43
- })}
40
+ {endpointEntries.map(({ key, endpoint }) =>
41
+ endpoint.type === "pubsub" ? (
42
+ <PubSub.Endpoint key={key} refName={refName} endpointKey={key} endpoint={endpoint} open={openAll} />
43
+ ) : (
44
+ <Message.Endpoint key={key} refName={refName} endpointKey={key} endpoint={endpoint} open={openAll} />
45
+ ),
46
+ )}
44
47
  </div>
45
48
  );
46
49
  };
@@ -0,0 +1,59 @@
1
+ import { FetchClient, type FetchProxy } from "akanjs/fetch";
2
+ import type { SerializedEndpoint } from "akanjs/signal";
3
+
4
+ export interface EndpointEntry {
5
+ key: string;
6
+ endpoint: SerializedEndpoint;
7
+ }
8
+
9
+ export const isWsEndpoint = (endpoint: SerializedEndpoint) => endpoint.type === "pubsub" || endpoint.type === "message";
10
+
11
+ /** Generated CRUD, slice reads, and hand-written endpoints in one list — what the summary counts and the list share. */
12
+ export const endpointEntriesOf = (refName: string, fetch: FetchProxy): EndpointEntry[] => {
13
+ const signal = fetch.serializedSignal[refName];
14
+ if (!signal) return [];
15
+ const base = Object.entries(FetchClient.getBaseEndpoint(refName, signal));
16
+ const slices = Object.entries(signal.slice ?? {}).flatMap(([suffix, slice]) =>
17
+ Object.entries(FetchClient.getEndpointFromSlice(refName, suffix, slice)),
18
+ );
19
+ const custom = Object.entries(signal.endpoint);
20
+ return [...base, ...slices, ...custom]
21
+ .map(([key, endpoint]) => ({ key, endpoint }))
22
+ .sort((a, b) => (a.key > b.key ? 1 : -1));
23
+ };
24
+
25
+ export const matchesSearch = (key: string, path: string, search: string) => {
26
+ const text = search.trim().toLowerCase();
27
+ if (!text) return true;
28
+ return key.toLowerCase().includes(text) || path.toLowerCase().includes(text);
29
+ };
30
+
31
+ /** `None` refuses every caller and is never badged, so it is not a name anyone filters by either. */
32
+ export const guardsOf = (endpoint: SerializedEndpoint) => endpoint.guards?.filter((guard) => guard !== "None") ?? [];
33
+
34
+ /** Naming no guard is `Public` spelled by omission — both are reachable by every caller, so the filter reads them
35
+ * as the same thing even though only the explicit one carries a badge. */
36
+ export const isPublicEndpoint = (endpoint: SerializedEndpoint) => {
37
+ const guards = guardsOf(endpoint);
38
+ return !guards.length || guards.every((guard) => guard === "Public");
39
+ };
40
+
41
+ /** Every guard name the serialized signals declare — the app's own authorization vocabulary, not a fixed role list. */
42
+ export const guardNamesOf = (fetch: FetchProxy) => {
43
+ const names = new Set<string>();
44
+ for (const refName of Object.keys(fetch.serializedSignal))
45
+ for (const { endpoint } of endpointEntriesOf(refName, fetch)) {
46
+
47
+ if (isPublicEndpoint(endpoint)) names.add("Public");
48
+ for (const guard of guardsOf(endpoint)) names.add(guard);
49
+ }
50
+ return [...names].sort((a, b) => (a > b ? 1 : -1));
51
+ };
52
+
53
+ /** No selection is no filter, and a selection is a claim about the guard list — so a public endpoint answers to
54
+ * `Public` alone rather than surviving every other filter. */
55
+ export const matchesGuards = (endpoint: SerializedEndpoint, selected: string[]) => {
56
+ if (!selected.length) return true;
57
+ if (isPublicEndpoint(endpoint)) return selected.includes("Public");
58
+ return guardsOf(endpoint).some((guard) => selected.includes(guard));
59
+ };
@@ -8,10 +8,15 @@ import {
8
8
  PrimitiveRegistry,
9
9
  type PrimitiveScalar,
10
10
  } from "akanjs/base";
11
- import { type ConstantCls, ConstantRegistry } from "akanjs/constant";
11
+ import { type ConstantCls, type ConstantField, ConstantRegistry } from "akanjs/constant";
12
12
 
13
13
  import type { SerializedArg, SerializedEndpoint, SignalType } from "akanjs/signal";
14
14
 
15
+ const getMapExample = (field: ConstantField, getValueExample: (modelRef: Cls) => unknown) => {
16
+ const [valueRef, valueArrDepth] = getNonArrayModel(field.of as Cls);
17
+ return { key: arraiedModel(getValueExample(valueRef as Cls), valueArrDepth) };
18
+ };
19
+
15
20
  const getResponseExample = (ref: Cls | Cls[]) => {
16
21
  const [modelRef, arrDepth] = getNonArrayModel(ref);
17
22
  const isPrimitive = PrimitiveRegistry.has(modelRef);
@@ -21,6 +26,7 @@ const getResponseExample = (ref: Cls | Cls[]) => {
21
26
  Object.entries((modelRef as ConstantCls)[FIELD_META]).forEach(([key, field]) => {
22
27
  if (field.example) example[key] = field.example as unknown;
23
28
  else if (field.enum) example[key] = arraiedModel<string>(field.enum.values[0] as string, field.arrDepth);
29
+ else if (field.isMap) example[key] = getMapExample(field, getResponseExample);
24
30
  else example[key] = getResponseExample(field.modelRef);
25
31
  });
26
32
  const result = arraiedModel(example, arrDepth);
@@ -33,11 +39,12 @@ const getRequestExample = (modelRef: Cls) => {
33
39
  if (isPrimitive) return (modelRef as typeof PrimitiveScalar)[EXAMPLE_VALUE];
34
40
  else {
35
41
  Object.entries((modelRef as ConstantCls)[FIELD_META]).forEach(([key, field]) => {
36
- if (!field.isScalar && field.isClass) example[key] = "ObjectID";
42
+ if (field.isMap) example[key] = getMapExample(field, getRequestExample);
43
+ else if (!field.isScalar && field.isClass) example[key] = "ObjectID";
37
44
  else
38
45
  example[key] = (
39
46
  (field.example ?? field.enum)
40
- ? arraiedModel(field.example ?? (field.enum?.values as string[])[0], field.optArrDepth)
47
+ ? arraiedModel(field.example ?? field.enum?.values[0], field.optArrDepth)
41
48
  : arraiedModel(getRequestExample(field.modelRef), field.arrDepth)
42
49
  ) as unknown;
43
50
  });