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.
- package/CHANGELOG.md +103 -0
- package/README.ko.md +1 -1
- package/README.md +1 -1
- package/base/baseEnv.ts +7 -4
- package/base/primitiveRegistry.ts +59 -12
- package/base/symbols.ts +4 -0
- package/client/capacitor.ts +34 -0
- package/client/clientRuntime.ts +5 -0
- package/client/csrTypes.ts +4 -3
- package/client/index.ts +1 -0
- package/client/locale.ts +2 -2
- package/client/router.ts +7 -7
- package/client/sharedContext.ts +31 -0
- package/client/translator.ts +2 -2
- package/client/types.ts +3 -3
- package/common/Logger.ts +280 -67
- package/common/clientAddress.ts +40 -0
- package/common/deepObjectify.ts +24 -9
- package/common/index.ts +42 -1
- package/common/logContext.ts +27 -0
- package/common/mcpExposure.ts +114 -0
- package/common/pathGetLoose.ts +31 -0
- package/common/pathSet.ts +17 -5
- package/common/plainFieldsOf.ts +13 -0
- package/common/routeConvention.ts +22 -12
- package/common/websocketBinaryFrame.ts +46 -0
- package/constant/crystalize.ts +94 -28
- package/constant/dateSlot.ts +62 -0
- package/constant/deserialize.ts +3 -2
- package/constant/fieldInfo.ts +43 -3
- package/constant/fieldQueryMeta.ts +35 -0
- package/constant/getDefault.ts +16 -11
- package/constant/hydrationPlan.ts +72 -0
- package/constant/immerify.ts +4 -6
- package/constant/index.ts +5 -0
- package/constant/labelOf.ts +26 -0
- package/constant/mask.ts +67 -0
- package/constant/purify.ts +17 -11
- package/constant/textFieldPaths.ts +13 -7
- package/constant/types.ts +19 -13
- package/constant/via.ts +24 -17
- package/dictionary/DictionaryLookup.ts +30 -0
- package/dictionary/agent.dictionary.ts +31 -0
- package/dictionary/agentTurn.dictionary.ts +29 -0
- package/dictionary/base.dictionary.ts +81 -0
- package/dictionary/dictInfo.ts +11 -2
- package/dictionary/dictionary.ts +9 -3
- package/dictionary/index.ts +1 -0
- package/dictionary/trans.ts +2 -2
- package/document/documentQuery.ts +1 -0
- package/document/filterMeta.ts +77 -12
- package/document/index.ts +1 -0
- package/document/noDocumentError.ts +12 -0
- package/document/types.ts +0 -1
- package/fetch/agentTurn.ts +19 -0
- package/fetch/client/fetchClient.ts +137 -37
- package/fetch/client/httpClient.ts +95 -20
- package/fetch/client/wsClient.ts +27 -12
- package/fetch/fetchType/appliedReturn.type.ts +65 -44
- package/fetch/fetchType/endpointFetch.type.ts +17 -8
- package/fetch/fetchType/sliceFetch.type.ts +27 -50
- package/fetch/index.ts +1 -0
- package/index.ts +80 -6
- package/local/apps/akan/akan-local.db +0 -0
- package/local/apps/akan/akan-local.db-shm +0 -0
- package/local/apps/akan/akan-local.db-wal +0 -0
- package/local/apps/akan/akan-local_solid.db +0 -0
- package/local/apps/akan/akan-local_solid.db-shm +0 -0
- package/local/apps/akan/akan-local_solid.db-wal +0 -0
- package/local/apps/serverLifecycle/serverLifecycle-local.db +0 -0
- package/local/apps/serverLifecycle/serverLifecycle-local.db-shm +0 -0
- package/local/apps/serverLifecycle/serverLifecycle-local.db-wal +0 -0
- package/local/apps/serverLifecycle/serverLifecycle-local_solid.db +0 -0
- package/local/apps/serverLifecycle/serverLifecycle-local_solid.db-shm +0 -0
- package/local/apps/serverLifecycle/serverLifecycle-local_solid.db-wal +0 -0
- package/package.json +27 -18
- package/server/akanApp.ts +278 -138
- package/server/akanAppHeaders.ts +16 -2
- package/server/akanOption.ts +63 -8
- package/server/akanServer.ts +387 -32
- package/server/animatedImage.ts +83 -0
- package/server/assetEncoding.ts +4 -24
- package/server/binaryPubsub.ts +55 -0
- package/server/console.ts +110 -101
- package/server/consoleEvaluator.ts +51 -0
- package/server/consolePasteFilter.ts +91 -0
- package/server/consoleSession.ts +242 -0
- package/server/contentEncoding.ts +83 -0
- package/server/devtools/signalSerializer.ts +2 -2
- package/server/devtools/types.ts +4 -4
- package/server/di/diLifecycle.ts +123 -13
- package/server/di/predefinedAdaptor.ts +6 -0
- package/server/di/utils.ts +40 -0
- package/server/imageOptimizer.ts +154 -57
- package/server/lifecycle/runtimeDir.ts +14 -0
- package/server/lifecycle/shutdownManager.ts +1 -1
- package/server/logging/childOutputReader.ts +137 -0
- package/server/logging/hubFileSink.ts +39 -0
- package/server/logging/logControlSocket.ts +173 -0
- package/server/logging/logForwarder.ts +131 -0
- package/server/logging/logHub.ts +0 -0
- package/server/logging/logQuery.ts +130 -0
- package/server/logging/logStdoutWriter.ts +39 -0
- package/server/logging/logStreamRoute.ts +87 -0
- package/server/logging/logTailClient.ts +161 -0
- package/server/mcp/McpAuth.ts +177 -0
- package/server/mcp/McpDispatcher.ts +289 -0
- package/server/mcp/McpEventStream.ts +24 -0
- package/server/mcp/McpExecutionContext.ts +105 -0
- package/server/mcp/McpRouter.ts +621 -0
- package/server/mcp/index.ts +5 -0
- package/server/processMetricsCollector.ts +1 -1
- package/server/resolver/database.resolver.ts +5 -4
- package/server/resolver/signal.resolver.ts +208 -86
- package/server/routeTreeBuilder.ts +10 -8
- package/server/routing/apiRouter.ts +44 -14
- package/server/routing/appWsData.ts +24 -2
- package/server/routing/eventStream.ts +93 -0
- package/server/routing/soloAppRoutes.ts +50 -0
- package/server/rscWorker.tsx +36 -22
- package/server/rscWorkerHost.ts +59 -8
- package/server/semaphore.ts +22 -0
- package/server/subRouteIndexDocument.tsx +61 -0
- package/server/systemPageDocument.tsx +3 -3
- package/server/systemPages.tsx +49 -16
- package/server/types.tsx +28 -0
- package/server/vendor/akanjs-fetch.ts +1 -0
- package/server/webRouter.ts +96 -39
- package/service/adapt.ts +4 -4
- package/service/agent.service.ts +81 -0
- package/service/base.service.ts +2 -1
- package/service/index.ts +1 -0
- package/service/injectInfo.ts +8 -3
- package/service/ipcTypes.ts +6 -0
- package/service/predefinedAdaptor/compress.adaptor.ts +5 -1
- package/service/predefinedAdaptor/database.adaptor.ts +68 -37
- package/service/predefinedAdaptor/deepseekLlm.ts +271 -0
- package/service/predefinedAdaptor/index.ts +3 -0
- package/service/predefinedAdaptor/insightQuery.ts +183 -0
- package/service/predefinedAdaptor/llm.adaptor.ts +115 -0
- package/service/predefinedAdaptor/logging.adaptor.ts +1 -1
- package/service/predefinedAdaptor/queue.adaptor.ts +5 -2
- package/service/predefinedAdaptor/role.adaptor.ts +2 -0
- package/service/predefinedAdaptor/schedule.adaptor.ts +12 -5
- package/service/predefinedAdaptor/solidPubsub.adaptor.ts +10 -6
- package/service/predefinedAdaptor/solidQueue.adaptor.ts +6 -2
- package/service/predefinedAdaptor/solidSqlite.ts +11 -9
- package/service/predefinedAdaptor/websocket.adaptor.ts +6 -1
- package/service/serve.ts +16 -9
- package/service/toolNames.ts +119 -0
- package/signal/agent/AgentCatalogue.ts +165 -0
- package/signal/agent/index.ts +1 -0
- package/signal/agent.signal.ts +38 -0
- package/signal/agentTurn.ts +8 -0
- package/signal/agentTurnStream.ts +60 -0
- package/signal/base.signal.ts +2 -1
- package/signal/endpointInfo.ts +38 -2
- package/signal/guard.ts +28 -1
- package/signal/guards.ts +49 -1
- package/signal/index.ts +6 -0
- package/signal/intercept.ts +4 -4
- package/signal/internalArg.ts +21 -4
- package/signal/mcp/McpDocument.ts +326 -0
- package/signal/mcp/McpProgress.ts +106 -0
- package/signal/mcp/McpUriTemplate.ts +80 -0
- package/signal/mcp/Msg.ts +368 -0
- package/signal/mcp/index.ts +5 -0
- package/signal/mcp/mcpProtocol.ts +120 -0
- package/signal/middleware.ts +3 -3
- package/signal/openapi/openapi.ts +36 -173
- package/signal/schema/JsonSchemaBuilder.ts +221 -0
- package/signal/schema/index.ts +1 -0
- package/signal/serializer/fetch.serializer.ts +51 -0
- package/signal/signalContext.ts +324 -76
- package/signal/slice.ts +62 -27
- package/signal/trace.ts +268 -9
- package/signal/types.ts +55 -4
- package/store/action.ts +34 -41
- package/store/actionTag.ts +33 -0
- package/store/agent/AgentBridge.ts +87 -0
- package/store/agent/AgentContext.ts +71 -0
- package/store/agent/AgentPrompts.ts +111 -0
- package/store/agent/ScreenReader.ts +349 -0
- package/store/agent/ScreenSettle.ts +45 -0
- package/store/agent/ScreenTarget.ts +135 -0
- package/store/agent/StoreCatalogue.ts +116 -0
- package/store/agent/StoreSurfaceSource.ts +225 -0
- package/store/agent/index.ts +13 -0
- package/store/agent/storeSurface.ts +28 -0
- package/store/agent/types.ts +16 -0
- package/store/agentic/AgentValue.ts +119 -0
- package/store/agentic/StExposeBuilder.ts +47 -0
- package/store/agentic/StExposeDraft.ts +24 -0
- package/store/agentic/StStateBuilder.ts +85 -0
- package/store/agentic/StStateDraft.ts +23 -0
- package/store/agentic/StToolBuilder.ts +279 -0
- package/store/agentic/StToolDraft.ts +22 -0
- package/store/agentic/attachAgentic.ts +33 -0
- package/store/agentic/formFields.ts +194 -0
- package/store/agentic/index.ts +12 -0
- package/store/agentic/useFieldTool.ts +183 -0
- package/store/agentic/useFormTools.ts +77 -0
- package/store/agentic/useRelationFieldTool.ts +113 -0
- package/store/baseSt.ts +1 -1
- package/store/databaseStateNames.ts +31 -0
- package/store/formSetterNames.ts +35 -0
- package/store/index.ts +8 -0
- package/store/rootStore.ts +3 -1
- package/store/sliceRole.ts +36 -0
- package/store/state.ts +2 -12
- package/store/store.ts +9 -0
- package/store/storeInstance.ts +185 -20
- package/store/storeRegistry.ts +39 -1
- package/store/types.ts +5 -0
- package/store/withSelector.ts +5 -4
- package/test/index.ts +1 -1
- package/test/registerDom.ts +4 -0
- package/test/sampleOf.ts +2 -0
- package/test/signalTestRuntime.ts +5 -5
- package/test/testServer.ts +14 -11
- package/types/base/baseEnv.d.ts +1 -1
- package/types/base/primitiveRegistry.d.ts +20 -8
- package/types/base/symbols.d.ts +4 -0
- package/types/client/capacitor.d.ts +39 -0
- package/types/client/clientRuntime.d.ts +7 -0
- package/types/client/index.d.ts +1 -0
- package/types/client/sharedContext.d.ts +21 -0
- package/types/client/types.d.ts +5 -3
- package/types/common/Logger.d.ts +88 -6
- package/types/common/clientAddress.d.ts +19 -0
- package/types/common/deepObjectify.d.ts +4 -2
- package/types/common/index.d.ts +8 -2
- package/types/common/logContext.d.ts +17 -0
- package/types/common/mcpExposure.d.ts +64 -0
- package/types/common/pathGetLoose.d.ts +8 -0
- package/types/common/plainFieldsOf.d.ts +6 -0
- package/types/common/routeConvention.d.ts +6 -0
- package/types/common/websocketBinaryFrame.d.ts +17 -0
- package/types/constant/constantRegistry.d.ts +2 -10
- package/types/constant/crystalize.d.ts +5 -0
- package/types/constant/dateSlot.d.ts +14 -0
- package/types/constant/fieldInfo.d.ts +20 -3
- package/types/constant/fieldQueryMeta.d.ts +17 -0
- package/types/constant/getDefault.d.ts +8 -0
- package/types/constant/hydrationPlan.d.ts +24 -0
- package/types/constant/index.d.ts +5 -0
- package/types/constant/labelOf.d.ts +7 -0
- package/types/constant/mask.d.ts +41 -0
- package/types/constant/purify.d.ts +2 -2
- package/types/constant/types.d.ts +5 -5
- package/types/dictionary/DictionaryLookup.d.ts +14 -0
- package/types/dictionary/agent.dictionary.d.ts +1 -0
- package/types/dictionary/agentTurn.dictionary.d.ts +1 -0
- package/types/dictionary/base.dictionary.d.ts +1 -1
- package/types/dictionary/dictInfo.d.ts +7 -1
- package/types/dictionary/dictionary.d.ts +11 -9
- package/types/dictionary/index.d.ts +1 -0
- package/types/document/filterMeta.d.ts +24 -4
- package/types/document/index.d.ts +1 -0
- package/types/document/noDocumentError.d.ts +12 -0
- package/types/document/types.d.ts +0 -1
- package/types/fetch/agentTurn.d.ts +475 -0
- package/types/fetch/client/fetchClient.d.ts +12 -0
- package/types/fetch/client/httpClient.d.ts +2 -1
- package/types/fetch/fetchType/appliedReturn.type.d.ts +37 -18
- package/types/fetch/fetchType/endpointFetch.type.d.ts +8 -5
- package/types/fetch/fetchType/sliceFetch.type.d.ts +11 -15
- package/types/fetch/index.d.ts +1 -0
- package/types/index.d.ts +74 -10
- package/types/server/akanApp.d.ts +12 -0
- package/types/server/akanAppHeaders.d.ts +7 -1
- package/types/server/akanOption.d.ts +36 -6
- package/types/server/akanServer.d.ts +67 -9
- package/types/server/animatedImage.d.ts +7 -0
- package/types/server/assetEncoding.d.ts +1 -1
- package/types/server/binaryPubsub.d.ts +18 -0
- package/types/server/console.d.ts +11 -1
- package/types/server/consoleEvaluator.d.ts +2 -0
- package/types/server/consolePasteFilter.d.ts +11 -0
- package/types/server/consoleSession.d.ts +22 -0
- package/types/server/contentEncoding.d.ts +28 -0
- package/types/server/devtools/types.d.ts +4 -4
- package/types/server/di/diLifecycle.d.ts +10 -2
- package/types/server/di/predefinedAdaptor.d.ts +4 -1
- package/types/server/di/utils.d.ts +16 -0
- package/types/server/lifecycle/runtimeDir.d.ts +5 -0
- package/types/server/logging/childOutputReader.d.ts +40 -0
- package/types/server/logging/hubFileSink.d.ts +18 -0
- package/types/server/logging/logControlSocket.d.ts +60 -0
- package/types/server/logging/logForwarder.d.ts +37 -0
- package/types/server/logging/logHub.d.ts +70 -0
- package/types/server/logging/logQuery.d.ts +31 -0
- package/types/server/logging/logStdoutWriter.d.ts +35 -0
- package/types/server/logging/logStreamRoute.d.ts +20 -0
- package/types/server/logging/logTailClient.d.ts +42 -0
- package/types/server/mcp/McpAuth.d.ts +62 -0
- package/types/server/mcp/McpDispatcher.d.ts +61 -0
- package/types/server/mcp/McpEventStream.d.ts +17 -0
- package/types/server/mcp/McpExecutionContext.d.ts +44 -0
- package/types/server/mcp/McpRouter.d.ts +65 -0
- package/types/server/mcp/index.d.ts +5 -0
- package/types/server/mcp.d.ts +1 -0
- package/types/server/resolver/signal.resolver.d.ts +7 -4
- package/types/server/routing/apiRouter.d.ts +2 -1
- package/types/server/routing/appWsData.d.ts +13 -1
- package/types/server/routing/eventStream.d.ts +23 -0
- package/types/server/routing/soloAppRoutes.d.ts +17 -0
- package/types/server/rscWorkerHost.d.ts +4 -1
- package/types/server/semaphore.d.ts +5 -0
- package/types/server/subRouteIndexDocument.d.ts +8 -0
- package/types/server/systemPageDocument.d.ts +1 -0
- package/types/server/systemPages.d.ts +5 -0
- package/types/server/types.d.ts +16 -0
- package/types/server/vendor/akanjs-fetch.d.ts +1 -0
- package/types/server/webRouter.d.ts +15 -4
- package/types/service/adapt.d.ts +2 -2
- package/types/service/agent.service.d.ts +32 -0
- package/types/service/base.service.d.ts +4 -0
- package/types/service/index.d.ts +1 -0
- package/types/service/injectInfo.d.ts +2 -2
- package/types/service/ipcTypes.d.ts +12 -0
- package/types/service/predefinedAdaptor/compress.adaptor.d.ts +1 -1
- package/types/service/predefinedAdaptor/database.adaptor.d.ts +9 -3
- package/types/service/predefinedAdaptor/deepseekLlm.d.ts +76 -0
- package/types/service/predefinedAdaptor/index.d.ts +3 -0
- package/types/service/predefinedAdaptor/insightQuery.d.ts +50 -0
- package/types/service/predefinedAdaptor/llm.adaptor.d.ts +105 -0
- package/types/service/predefinedAdaptor/queue.adaptor.d.ts +3 -2
- package/types/service/predefinedAdaptor/role.adaptor.d.ts +2 -0
- package/types/service/predefinedAdaptor/schedule.adaptor.d.ts +10 -6
- package/types/service/predefinedAdaptor/solidQueue.adaptor.d.ts +6 -2
- package/types/service/predefinedAdaptor/solidSqlite.d.ts +2 -2
- package/types/service/serve.d.ts +3 -3
- package/types/service/toolNames.d.ts +35 -0
- package/types/signal/agent/AgentCatalogue.d.ts +100 -0
- package/types/signal/agent/index.d.ts +1 -0
- package/types/signal/agent.d.ts +1 -0
- package/types/signal/agent.signal.d.ts +24 -0
- package/types/signal/agentTurn.d.ts +9 -0
- package/types/signal/agentTurnStream.d.ts +24 -0
- package/types/signal/base.signal.d.ts +1 -1
- package/types/signal/endpointInfo.d.ts +21 -3
- package/types/signal/guard.d.ts +12 -0
- package/types/signal/guards.d.ts +23 -1
- package/types/signal/index.d.ts +6 -0
- package/types/signal/intercept.d.ts +2 -2
- package/types/signal/internalArg.d.ts +22 -6
- package/types/signal/mcp/McpDocument.d.ts +84 -0
- package/types/signal/mcp/McpProgress.d.ts +40 -0
- package/types/signal/mcp/McpUriTemplate.d.ts +25 -0
- package/types/signal/mcp/Msg.d.ts +143 -0
- package/types/signal/mcp/index.d.ts +5 -0
- package/types/signal/mcp/mcpProtocol.d.ts +107 -0
- package/types/signal/mcp.d.ts +1 -0
- package/types/signal/middleware.d.ts +7 -7
- package/types/signal/openapi/openapi.d.ts +3 -3
- package/types/signal/schema/JsonSchemaBuilder.d.ts +51 -0
- package/types/signal/schema/index.d.ts +1 -0
- package/types/signal/schema.d.ts +1 -0
- package/types/signal/signalContext.d.ts +67 -8
- package/types/signal/slice.d.ts +42 -15
- package/types/signal/trace.d.ts +52 -2
- package/types/signal/types.d.ts +53 -4
- package/types/store/action.d.ts +7 -5
- package/types/store/actionTag.d.ts +21 -0
- package/types/store/agent/AgentBridge.d.ts +37 -0
- package/types/store/agent/AgentContext.d.ts +16 -0
- package/types/store/agent/AgentPrompts.d.ts +31 -0
- package/types/store/agent/ScreenReader.d.ts +29 -0
- package/types/store/agent/ScreenSettle.d.ts +22 -0
- package/types/store/agent/ScreenTarget.d.ts +34 -0
- package/types/store/agent/StoreCatalogue.d.ts +26 -0
- package/types/store/agent/StoreSurfaceSource.d.ts +30 -0
- package/types/store/agent/index.d.ts +11 -0
- package/types/store/agent/storeSurface.d.ts +14 -0
- package/types/store/agent/types.d.ts +15 -0
- package/types/store/agent.d.ts +1 -0
- package/types/store/agentic/AgentValue.d.ts +43 -0
- package/types/store/agentic/StExposeBuilder.d.ts +21 -0
- package/types/store/agentic/StExposeDraft.d.ts +13 -0
- package/types/store/agentic/StStateBuilder.d.ts +21 -0
- package/types/store/agentic/StStateDraft.d.ts +12 -0
- package/types/store/agentic/StToolBuilder.d.ts +56 -0
- package/types/store/agentic/StToolDraft.d.ts +13 -0
- package/types/store/agentic/attachAgentic.d.ts +25 -0
- package/types/store/agentic/formFields.d.ts +53 -0
- package/types/store/agentic/index.d.ts +12 -0
- package/types/store/agentic/useFieldTool.d.ts +22 -0
- package/types/store/agentic/useFormTools.d.ts +19 -0
- package/types/store/agentic/useRelationFieldTool.d.ts +27 -0
- package/types/store/agentic.d.ts +1 -0
- package/types/store/baseSt.d.ts +35 -39
- package/types/store/databaseStateNames.d.ts +25 -0
- package/types/store/formSetterNames.d.ts +30 -0
- package/types/store/index.d.ts +7 -0
- package/types/store/rootStore.d.ts +5 -1
- package/types/store/sliceRole.d.ts +25 -0
- package/types/store/store.d.ts +5 -1
- package/types/store/storeInstance.d.ts +33 -1
- package/types/store/storeRegistry.d.ts +5 -0
- package/types/store/types.d.ts +4 -0
- package/types/store/withSelector.d.ts +5 -4
- package/types/test/index.d.ts +1 -1
- package/types/test/registerDom.d.ts +1 -0
- package/types/test/signalTestRuntime.d.ts +2 -3
- package/types/test/testServer.d.ts +6 -4
- package/types/ui/Agent/Approval.d.ts +8 -0
- package/types/ui/Agent/Attach.d.ts +16 -0
- package/types/ui/Agent/Bubble.d.ts +26 -0
- package/types/ui/Agent/Chat.d.ts +91 -0
- package/types/ui/Agent/ChatCommands.d.ts +34 -0
- package/types/ui/Agent/Composer.d.ts +23 -0
- package/types/ui/Agent/Context.d.ts +13 -0
- package/types/ui/Agent/Dock.d.ts +17 -0
- package/types/ui/Agent/Guide.d.ts +9 -0
- package/types/ui/Agent/History.d.ts +26 -0
- package/types/ui/Agent/Launcher.d.ts +16 -0
- package/types/ui/Agent/Markdown.d.ts +19 -0
- package/types/ui/Agent/Menu.d.ts +18 -0
- package/types/ui/Agent/Mic.d.ts +8 -0
- package/types/ui/Agent/Question.d.ts +14 -0
- package/types/ui/Agent/Section.d.ts +10 -0
- package/types/ui/Agent/Skip.d.ts +22 -0
- package/types/ui/Agent/StateKey.d.ts +16 -0
- package/types/ui/Agent/Tool.d.ts +15 -0
- package/types/ui/Agent/Transcript.d.ts +13 -0
- package/types/ui/Agent/Zone.d.ts +48 -0
- package/types/ui/Agent/agentSessionOf.d.ts +27 -0
- package/types/ui/Agent/attachment.d.ts +34 -0
- package/types/ui/Agent/fetchRunner.d.ts +12 -0
- package/types/ui/Agent/index.d.ts +19 -0
- package/types/ui/Agent/index_.d.ts +1 -0
- package/types/ui/Agent/markdownBlocks.d.ts +35 -0
- package/types/ui/Agent/markdownSpans.d.ts +2 -0
- package/types/ui/Agent/markdownTable.d.ts +16 -0
- package/types/ui/Agent/sessionHistory.d.ts +14 -0
- package/types/ui/Agent/sessionView.d.ts +15 -0
- package/types/ui/Agent/tokenCount.d.ts +6 -0
- package/types/ui/Agent/useChatAttachments.d.ts +24 -0
- package/types/ui/Agent/useChatVoice.d.ts +30 -0
- package/types/ui/Agent/useDraftRecall.d.ts +14 -0
- package/types/ui/Agent/useKeyboardInset.d.ts +8 -0
- package/types/ui/Agent/useSlashMenu.d.ts +24 -0
- package/types/ui/Agent/voice.d.ts +71 -0
- package/types/ui/Agent.d.ts +1 -0
- package/types/ui/Badge.d.ts +1 -1
- package/types/ui/Button.d.ts +1 -1
- package/types/ui/Constant/Graph.d.ts +10 -0
- package/types/ui/Constant/index.d.ts +2 -1
- package/types/ui/Constant/schemaGraph.d.ts +39 -0
- package/types/ui/Data/Dashboard.d.ts +16 -3
- package/types/ui/Data/Insight.d.ts +1 -1
- package/types/ui/Data/ListContainer.d.ts +15 -7
- package/types/ui/Data/QueryMaker.d.ts +45 -3
- package/types/ui/Data/RefPicker.d.ts +16 -0
- package/types/ui/Data/dataExport.d.ts +5 -0
- package/types/ui/Data/dataText.d.ts +6 -0
- package/types/ui/Data/index.d.ts +2 -0
- package/types/ui/Data/index_.d.ts +1 -0
- package/types/ui/DatePicker.d.ts +15 -11
- package/types/ui/Dialog/LegacyModal.d.ts +13 -0
- package/types/ui/Dialog/Provider.d.ts +3 -1
- package/types/ui/Dialog/context.d.ts +9 -1
- package/types/ui/Dialog/index.d.ts +1 -0
- package/types/ui/DraggableList.d.ts +1 -1
- package/types/ui/Dropdown.d.ts +5 -1
- package/types/ui/Field.d.ts +13 -12
- package/types/ui/Layout/BottomTab.d.ts +3 -2
- package/types/ui/LegacyModal.d.ts +24 -0
- package/types/ui/Loading/ProgressBar.d.ts +4 -0
- package/types/ui/Loading/Spin.d.ts +2 -1
- package/types/ui/Model/AdminPanel.d.ts +15 -3
- package/types/ui/Model/EditModal.d.ts +1 -1
- package/types/ui/Model/New.d.ts +3 -1
- package/types/ui/Model/NewWrapper.d.ts +2 -0
- package/types/ui/Model/NewWrapper_Client.d.ts +2 -1
- package/types/ui/Pagination.d.ts +2 -2
- package/types/ui/Radio.d.ts +1 -1
- package/types/ui/RecentTime.d.ts +18 -1
- package/types/ui/Reference/Collapse.d.ts +11 -0
- package/types/ui/Reference/Panel.d.ts +29 -0
- package/types/ui/Reference/Segmented.d.ts +17 -0
- package/types/ui/Reference/Summary.d.ts +13 -0
- package/types/ui/Reference/Toolbar.d.ts +21 -0
- package/types/ui/Reference/dictText.d.ts +6 -0
- package/types/ui/Reference/index.d.ts +7 -0
- package/types/ui/Reference/style.d.ts +20 -0
- package/types/ui/Reference.d.ts +1 -0
- package/types/ui/ScreenNavigator.d.ts +3 -1
- package/types/ui/Signal/Arg.d.ts +7 -3
- package/types/ui/Signal/Doc.d.ts +4 -6
- package/types/ui/Signal/Object.d.ts +2 -1
- package/types/ui/Signal/RestApi.d.ts +2 -1
- package/types/ui/Signal/WebSocket.d.ts +2 -1
- package/types/ui/Signal/endpointEntries.d.ts +20 -0
- package/types/ui/Signal/style.d.ts +9 -8
- package/types/ui/System/Client.d.ts +1 -2
- package/types/ui/System/Common.d.ts +3 -4
- package/types/ui/System/Messages.d.ts +1 -1
- package/types/ui/Tab/Provider.d.ts +3 -1
- package/types/ui/Tab/context.d.ts +4 -2
- package/types/ui/ToggleSelect.d.ts +1 -0
- package/types/ui/UiOverride/context.d.ts +18 -1
- package/types/ui/agentAttrs.d.ts +14 -0
- package/types/ui/index.d.ts +22 -1
- package/types/ui/overlayLayer.d.ts +13 -0
- package/types/ui/overlayPosition.d.ts +28 -0
- package/types/ui/recipe/badgeRecipe.d.ts +2 -2
- package/types/ui/recipe/buttonRecipe.d.ts +2 -2
- package/types/vendor/use-agentic/AgentAbort.d.ts +17 -0
- package/types/vendor/use-agentic/AgentProgress.d.ts +27 -0
- package/types/vendor/use-agentic/AgentProvider.d.ts +17 -0
- package/types/vendor/use-agentic/AgentScope.d.ts +9 -0
- package/types/vendor/use-agentic/AgentSession.d.ts +163 -0
- package/types/vendor/use-agentic/Agentic.d.ts +21 -0
- package/types/vendor/use-agentic/AgenticSurface.d.ts +58 -0
- package/types/vendor/use-agentic/Compaction.d.ts +48 -0
- package/types/vendor/use-agentic/ToolOutput.d.ts +21 -0
- package/types/vendor/use-agentic/Transcript.d.ts +18 -0
- package/types/vendor/use-agentic/httpRunner.d.ts +15 -0
- package/types/vendor/use-agentic/index.d.ts +19 -0
- package/types/vendor/use-agentic/sharedContext.d.ts +15 -0
- package/types/vendor/use-agentic/surfaceContext.d.ts +5 -0
- package/types/vendor/use-agentic/types.d.ts +182 -0
- package/types/vendor/use-agentic/useAgent.d.ts +4 -0
- package/types/vendor/use-agentic/useAgentGuide.d.ts +6 -0
- package/types/vendor/use-agentic/useAgentResource.d.ts +12 -0
- package/types/vendor/use-agentic/useAgentState.d.ts +16 -0
- package/types/vendor/use-agentic/useAgentTool.d.ts +16 -0
- package/types/vendor/use-agentic.d.ts +1 -0
- package/types/webkit/index.d.ts +4 -0
- package/types/webkit/useBodyScrollLock.d.ts +2 -0
- package/types/webkit/usePageTool.d.ts +19 -0
- package/types/webkit/useScreenScope.d.ts +25 -0
- package/ui/Agent/Approval.tsx +32 -0
- package/ui/Agent/Attach.tsx +77 -0
- package/ui/Agent/Bubble.tsx +192 -0
- package/ui/Agent/Chat.tsx +525 -0
- package/ui/Agent/ChatCommands.ts +141 -0
- package/ui/Agent/Composer.tsx +94 -0
- package/ui/Agent/Context.tsx +49 -0
- package/ui/Agent/Dock.tsx +77 -0
- package/ui/Agent/Guide.tsx +16 -0
- package/ui/Agent/History.tsx +49 -0
- package/ui/Agent/Launcher.tsx +60 -0
- package/ui/Agent/Markdown.tsx +142 -0
- package/ui/Agent/Menu.tsx +55 -0
- package/ui/Agent/Mic.tsx +27 -0
- package/ui/Agent/Question.tsx +63 -0
- package/ui/Agent/Section.tsx +24 -0
- package/ui/Agent/Skip.tsx +30 -0
- package/ui/Agent/StateKey.tsx +46 -0
- package/ui/Agent/Tool.tsx +59 -0
- package/ui/Agent/Transcript.tsx +33 -0
- package/ui/Agent/Zone.tsx +116 -0
- package/ui/Agent/agentSessionOf.ts +60 -0
- package/ui/Agent/attachment.ts +73 -0
- package/ui/Agent/fetchRunner.ts +44 -0
- package/ui/Agent/index.ts +27 -0
- package/ui/Agent/index_.tsx +4 -0
- package/ui/Agent/markdownBlocks.ts +137 -0
- package/ui/Agent/markdownSpans.tsx +49 -0
- package/ui/Agent/markdownTable.ts +54 -0
- package/ui/Agent/sessionHistory.ts +62 -0
- package/ui/Agent/sessionView.ts +38 -0
- package/ui/Agent/tokenCount.ts +10 -0
- package/ui/Agent/useChatAttachments.ts +84 -0
- package/ui/Agent/useChatVoice.ts +129 -0
- package/ui/Agent/useDraftRecall.ts +42 -0
- package/ui/Agent/useKeyboardInset.ts +26 -0
- package/ui/Agent/useSlashMenu.ts +58 -0
- package/ui/Agent/voice.ts +177 -0
- package/ui/Badge.tsx +1 -1
- package/ui/BottomSheet.tsx +32 -36
- package/ui/Button.tsx +3 -1
- package/ui/Clipboard.tsx +3 -6
- package/ui/Constant/Doc.tsx +265 -254
- package/ui/Constant/Graph.tsx +151 -0
- package/ui/Constant/index.ts +3 -2
- package/ui/Constant/schemaGraph.ts +232 -0
- package/ui/Data/CardList.tsx +14 -3
- package/ui/Data/Dashboard.tsx +70 -52
- package/ui/Data/Insight.tsx +18 -12
- package/ui/Data/Item.tsx +42 -56
- package/ui/Data/ListContainer.tsx +246 -132
- package/ui/Data/Pagination.tsx +10 -3
- package/ui/Data/QueryMaker.tsx +160 -11
- package/ui/Data/RefPicker.tsx +202 -0
- package/ui/Data/TableList.tsx +22 -13
- package/ui/Data/dataExport.ts +54 -0
- package/ui/Data/dataText.ts +22 -0
- package/ui/Data/index.ts +13 -1
- package/ui/Data/index_.tsx +1 -0
- package/ui/DatePicker.tsx +110 -128
- package/ui/Dialog/Close.tsx +3 -7
- package/ui/Dialog/LegacyModal.tsx +241 -0
- package/ui/Dialog/Modal.tsx +62 -195
- package/ui/Dialog/Provider.tsx +47 -3
- package/ui/Dialog/Trigger.tsx +3 -7
- package/ui/Dialog/context.ts +14 -2
- package/ui/Dialog/index.tsx +2 -0
- package/ui/DragAction.tsx +3 -2
- package/ui/DraggableList.tsx +9 -4
- package/ui/Dropdown.tsx +89 -27
- package/ui/Empty.tsx +6 -4
- package/ui/Field.tsx +128 -58
- package/ui/Input.tsx +27 -5
- package/ui/KeyboardAvoiding.tsx +2 -2
- package/ui/Layout/BottomTab.tsx +32 -37
- package/ui/Layout/Sider.tsx +37 -14
- package/ui/LegacyModal.tsx +53 -0
- package/ui/Link/CsrLink.tsx +1 -1
- package/ui/Load/Pagination.tsx +15 -8
- package/ui/Load/Units.tsx +30 -7
- package/ui/Load/View.tsx +10 -3
- package/ui/Loading/Area.tsx +7 -6
- package/ui/Loading/Button.tsx +7 -9
- package/ui/Loading/Input.tsx +7 -9
- package/ui/Loading/ProgressBar.tsx +16 -7
- package/ui/Loading/Skeleton.tsx +8 -13
- package/ui/Loading/Spin.tsx +20 -14
- package/ui/Menu.tsx +1 -1
- package/ui/Model/AdminPanel.tsx +52 -12
- package/ui/Model/EditModal.tsx +28 -6
- package/ui/Model/EditWrapper.tsx +16 -4
- package/ui/Model/New.tsx +4 -0
- package/ui/Model/NewWrapper.tsx +2 -0
- package/ui/Model/NewWrapper_Client.tsx +20 -6
- package/ui/Model/Remove.tsx +18 -6
- package/ui/Model/RemoveWrapper.tsx +12 -2
- package/ui/Model/SureToRemove.tsx +18 -6
- package/ui/Model/ViewEditModal.tsx +64 -15
- package/ui/Model/ViewModal.tsx +25 -11
- package/ui/Model/ViewWrapper.tsx +15 -4
- package/ui/Model/index_.tsx +1 -1
- package/ui/Pagination.tsx +51 -66
- package/ui/Popconfirm.tsx +88 -78
- package/ui/Radio.tsx +53 -24
- package/ui/RecentTime.tsx +83 -35
- package/ui/Reference/Collapse.tsx +26 -0
- package/ui/Reference/Panel.tsx +79 -0
- package/ui/Reference/Segmented.tsx +41 -0
- package/ui/Reference/Summary.tsx +25 -0
- package/ui/Reference/Toolbar.tsx +44 -0
- package/ui/Reference/dictText.ts +9 -0
- package/ui/Reference/index.ts +7 -0
- package/ui/Reference/style.ts +45 -0
- package/ui/ScreenNavigator.tsx +17 -2
- package/ui/Select.tsx +96 -57
- package/ui/Signal/Arg.tsx +83 -68
- package/ui/Signal/Doc.tsx +163 -129
- package/ui/Signal/Listener.tsx +40 -29
- package/ui/Signal/Message.tsx +87 -135
- package/ui/Signal/Object.tsx +79 -57
- package/ui/Signal/PubSub.tsx +72 -113
- package/ui/Signal/Request.tsx +2 -22
- package/ui/Signal/Response.tsx +19 -45
- package/ui/Signal/RestApi.tsx +170 -200
- package/ui/Signal/WebSocket.tsx +29 -26
- package/ui/Signal/endpointEntries.ts +59 -0
- package/ui/Signal/makeExample.ts +10 -3
- package/ui/Signal/style.ts +34 -29
- package/ui/Switch.tsx +4 -0
- package/ui/System/CSR.tsx +1 -1
- package/ui/System/Client.tsx +31 -15
- package/ui/System/Common.tsx +3 -4
- package/ui/System/DevModeToggle.tsx +1 -1
- package/ui/System/Gtag.tsx +2 -2
- package/ui/System/Messages.tsx +52 -31
- package/ui/System/Reconnect.tsx +22 -56
- package/ui/System/SelectLanguage.tsx +24 -15
- package/ui/System/ThemeToggle.tsx +25 -13
- package/ui/Tab/Menu.tsx +24 -12
- package/ui/Tab/Menus.tsx +6 -3
- package/ui/Tab/Provider.tsx +30 -3
- package/ui/Tab/context.ts +8 -4
- package/ui/Table.tsx +66 -60
- package/ui/ToggleSelect.tsx +8 -7
- package/ui/Tooltip.tsx +15 -1
- package/ui/UiOverride/context.ts +21 -2
- package/ui/Unauthorized.tsx +6 -4
- package/ui/agentAttrs.ts +19 -0
- package/ui/index.ts +49 -1
- package/ui/overlayLayer.ts +12 -2
- package/ui/overlayPosition.ts +104 -0
- package/ui/recipe/buttonRecipe.ts +2 -2
- package/ui/styles.css +31 -0
- package/vendor/use-agentic/AgentAbort.ts +29 -0
- package/vendor/use-agentic/AgentProgress.ts +40 -0
- package/vendor/use-agentic/AgentProvider.tsx +39 -0
- package/vendor/use-agentic/AgentScope.tsx +20 -0
- package/vendor/use-agentic/AgentSession.ts +750 -0
- package/vendor/use-agentic/Agentic.tsx +44 -0
- package/vendor/use-agentic/AgenticSurface.ts +333 -0
- package/vendor/use-agentic/Compaction.ts +120 -0
- package/vendor/use-agentic/ToolOutput.ts +60 -0
- package/vendor/use-agentic/Transcript.ts +50 -0
- package/vendor/use-agentic/WIRE.md +86 -0
- package/vendor/use-agentic/httpRunner.ts +131 -0
- package/vendor/use-agentic/index.ts +20 -0
- package/vendor/use-agentic/sharedContext.ts +25 -0
- package/vendor/use-agentic/surfaceContext.ts +10 -0
- package/vendor/use-agentic/types.ts +192 -0
- package/vendor/use-agentic/useAgent.ts +18 -0
- package/vendor/use-agentic/useAgentGuide.ts +16 -0
- package/vendor/use-agentic/useAgentResource.ts +36 -0
- package/vendor/use-agentic/useAgentState.ts +64 -0
- package/vendor/use-agentic/useAgentTool.ts +55 -0
- package/webkit/bootCsr.tsx +10 -8
- package/webkit/index.ts +4 -0
- package/webkit/lazy.tsx +5 -1
- package/webkit/useBodyScrollLock.tsx +29 -0
- package/webkit/useFrameRuntime.ts +1 -1
- package/webkit/usePageTool.tsx +37 -0
- package/webkit/useScreenScope.tsx +60 -0
- package/types/ui/Constant/Mermaid.d.ts +0 -8
- package/types/ui/Signal/Collapse.d.ts +0 -12
- package/ui/Constant/Mermaid.tsx +0 -149
- package/ui/Signal/Collapse.tsx +0 -29
package/ui/Signal/RestApi.tsx
CHANGED
|
@@ -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 {
|
|
16
|
+
import { endpointEntriesOf, guardsOf, isWsEndpoint, matchesGuards, matchesSearch } from "./endpointEntries";
|
|
15
17
|
import { getExampleData } from "./makeExample";
|
|
16
18
|
import Response from "./Response";
|
|
17
|
-
import {
|
|
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
|
|
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
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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((
|
|
72
|
+
<div className="flex flex-col gap-2">
|
|
73
|
+
{endpointEntries.map(({ key, endpoint }) => (
|
|
67
74
|
<RestApiEndpoint
|
|
68
|
-
key={
|
|
75
|
+
key={key}
|
|
69
76
|
signalPrefix={signalPrefix}
|
|
70
77
|
refName={refName}
|
|
71
78
|
fetch={fetch}
|
|
72
|
-
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
|
-
<
|
|
119
|
+
<Collapse
|
|
107
120
|
open={open}
|
|
108
|
-
contentClassName="bg-background/60"
|
|
109
121
|
summary={
|
|
110
|
-
<div className="flex
|
|
111
|
-
<div className=
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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
|
-
|
|
129
|
-
|
|
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
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
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
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
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
|
-
{
|
|
191
|
-
<
|
|
192
|
-
<div className={
|
|
193
|
-
|
|
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
|
-
</
|
|
197
|
-
)
|
|
198
|
-
|
|
199
|
-
<
|
|
200
|
-
<div className=
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
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
|
-
</
|
|
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-
|
|
311
|
-
<
|
|
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: "
|
|
314
|
-
|
|
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
|
-
<
|
|
320
|
-
<div className={
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
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
|
-
<
|
|
336
|
-
<div className={
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
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
|
-
<
|
|
352
|
-
<div className={
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
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
|
-
<
|
|
368
|
-
<div className={signalUi.sectionTitle}>Body</div>
|
|
343
|
+
<ArgSection label="Body">
|
|
369
344
|
<Arg.Json value={bodyRequest} onChange={setBodyRequest} />
|
|
370
|
-
</
|
|
345
|
+
</ArgSection>
|
|
371
346
|
) : null}
|
|
372
|
-
<
|
|
373
|
-
<
|
|
374
|
-
|
|
375
|
-
|
|
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
|
};
|
package/ui/Signal/WebSocket.tsx
CHANGED
|
@@ -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
|
|
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 =
|
|
19
|
-
.
|
|
20
|
-
.filter((
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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((
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
+
};
|
package/ui/Signal/makeExample.ts
CHANGED
|
@@ -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 (
|
|
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 ??
|
|
47
|
+
? arraiedModel(field.example ?? field.enum?.values[0], field.optArrDepth)
|
|
41
48
|
: arraiedModel(getRequestExample(field.modelRef), field.arrDepth)
|
|
42
49
|
) as unknown;
|
|
43
50
|
});
|