akanjs 3.0.0-beta.2 → 3.0.0-beta.20
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/base/base.ts +6 -11
- package/base/baseEnv.ts +17 -11
- package/base/databaseModes.ts +75 -0
- package/base/index.ts +1 -0
- package/base/primitiveRegistry.ts +38 -47
- package/base/symbols.ts +1 -1
- package/base/types.ts +1 -1
- package/base/utils.ts +3 -6
- package/capacitor.base.config.ts +2 -3
- package/client/capacitor.ts +18 -63
- package/client/cn.ts +3 -13
- package/client/cookie.ts +6 -15
- package/client/createFont.ts +0 -2
- package/client/csrTypes.ts +6 -59
- package/client/decorators.ts +1 -1
- package/client/device.ts +52 -44
- package/client/frameConfig.ts +15 -26
- package/client/index.ts +0 -1
- package/client/makePageProto.tsx +3 -4
- package/client/route/RootLayoutDefinition.ts +0 -6
- package/client/route/RouteDefinition.ts +5 -30
- package/client/route/resolveRouteModule.ts +1 -5
- package/client/router.ts +35 -39
- package/client/rscNavigation.ts +4 -5
- package/client/sharedContext.ts +2 -19
- package/client/storage.ts +29 -38
- package/client/translator.ts +5 -6
- package/client/types.ts +0 -3
- package/common/CodeAgentClient.ts +91 -0
- package/common/CodeTranscript.ts +325 -0
- package/common/Logger.ts +9 -34
- package/common/TrustedProxy.ts +6 -34
- package/common/applyMixins.ts +13 -2
- package/common/authToken.ts +0 -11
- package/common/capitalize.ts +3 -4
- package/common/clamp.ts +0 -1
- package/common/clientAddress.ts +1 -15
- package/common/codeAgentProfile.ts +181 -0
- package/common/codeAgentWire.ts +305 -0
- package/{server/routing → common}/eventStream.ts +1 -6
- package/common/fileUpload.ts +1 -12
- package/common/formatNumber.ts +3 -12
- package/common/index.ts +104 -19
- package/common/interpolateTranslation.ts +1 -6
- package/common/isEmail.ts +0 -1
- package/common/isRecord.ts +2 -0
- package/common/isThenable.ts +1 -8
- package/common/isValidDate.ts +3 -5
- package/common/logContext.ts +1 -1
- package/{ui/Agent → common}/markdownBlocks.ts +0 -3
- package/common/markdownSpans.ts +47 -0
- package/{ui/Agent → common}/markdownTable.ts +1 -5
- package/common/mcpExposure.ts +4 -27
- package/common/objectPath.ts +67 -0
- package/common/objectify.ts +52 -0
- package/common/{isPhoneNumber.ts → phone.ts} +7 -1
- package/common/randomPick.ts +13 -0
- package/common/requestOrigin.ts +0 -17
- package/common/restClient.ts +8 -13
- package/common/round.ts +4 -0
- package/common/routeConvention.ts +21 -14
- package/common/sleep.ts +1 -8
- package/common/subRoute.ts +4 -7
- package/common/toError.ts +1 -0
- package/common/tunnelWire.ts +263 -0
- package/common/types.ts +6 -7
- package/common/{splitVersion.ts → version.ts} +3 -6
- package/common/{websocketBinaryFrame.ts → websocketContract.ts} +43 -9
- package/constant/cascadePaths.ts +6 -9
- package/constant/constantRegistry.ts +21 -57
- package/constant/crystalize.ts +2 -12
- package/constant/dateSlot.ts +0 -15
- package/constant/fieldInfo.ts +30 -109
- package/constant/fieldQueryMeta.ts +2 -10
- package/constant/getDefault.ts +16 -8
- package/constant/hydrationPlan.ts +1 -9
- package/constant/index.ts +0 -1
- package/constant/labelOf.ts +1 -6
- package/constant/mask.ts +36 -38
- package/constant/purify.ts +6 -14
- package/constant/serialize.ts +82 -5
- package/constant/textFieldPaths.ts +2 -3
- package/constant/types.ts +2 -6
- package/constant/via.ts +20 -60
- package/dictionary/DictionaryLookup.ts +1 -7
- package/dictionary/agent.dictionary.ts +43 -11
- package/dictionary/base.dictionary.ts +11 -0
- package/dictionary/dictInfo.ts +145 -626
- package/dictionary/dictShape.ts +54 -0
- package/dictionary/dictionary.ts +1 -2
- package/dictionary/dictionaryRegistry.ts +7 -28
- package/dictionary/locale.ts +24 -116
- package/dictionary/trans.ts +18 -56
- package/document/dataLoader.ts +77 -78
- package/document/database.ts +52 -56
- package/document/documentQuery.ts +32 -32
- package/document/documentSchema.ts +21 -26
- package/document/filterMeta.ts +11 -31
- package/document/index.ts +0 -1
- package/document/into.ts +8 -18
- package/document/loaderInfo.ts +28 -7
- package/document/noDocumentError.ts +2 -7
- package/document/queryEvaluator.ts +21 -43
- package/document/types.ts +0 -1
- package/fetch/client/fetchClient.ts +66 -105
- package/fetch/client/fetchHandle.ts +4 -12
- package/fetch/client/httpClient.ts +35 -68
- package/fetch/client/remoteError.ts +2 -8
- package/fetch/client/sliceInitHandle.ts +3 -6
- package/fetch/client/sliceQueryArgs.ts +11 -0
- package/fetch/client/wsClient.ts +75 -64
- package/fetch/fetchType/appliedReturn.type.ts +5 -24
- package/fetch/fetchType/buildFetch.type.ts +28 -1
- package/fetch/fetchType/index.ts +0 -1
- package/fetch/requestStorage.ts +7 -28
- package/fetch/types.ts +0 -1
- package/index.ts +31 -64
- package/package.json +19 -5
- package/server/akanApp.ts +138 -289
- package/server/akanAppHeaders.ts +2 -3
- package/server/akanOption.ts +25 -27
- package/server/akanServer.ts +98 -219
- package/server/animatedImage.ts +2 -11
- package/server/artifact/builderRpc.ts +24 -64
- package/server/artifact/index.ts +0 -1
- package/server/artifact/ipcTypes.ts +27 -30
- package/server/artifact/routeClientCache.ts +18 -37
- package/server/artifact/routeSeedIndexStore.ts +2 -35
- package/server/artifact/routesManifestStore.ts +13 -38
- package/server/binaryPubsub.ts +0 -9
- package/server/cachePolicy.ts +10 -44
- package/server/console.ts +12 -16
- package/server/consoleSession.ts +55 -12
- package/server/contentEncoding.ts +42 -27
- package/server/decorators.ts +4 -70
- package/server/devtools/constantSerializer.ts +2 -14
- package/server/devtools/depsSerializer.ts +14 -46
- package/server/devtools/devtoolsJson.ts +6 -18
- package/server/devtools/devtoolsRouter.ts +2 -12
- package/server/devtools/signalSerializer.ts +5 -44
- package/server/devtools/types.ts +0 -12
- package/server/di/diLifecycle.ts +141 -221
- package/server/di/predefinedAdaptor.ts +11 -5
- package/server/di/resolveHierarchy.ts +114 -5
- package/server/di/utils.ts +13 -29
- package/server/head.tsx +53 -0
- package/server/hmr/clientScript.ts +2 -8
- package/server/hmr/devHmrController.ts +28 -32
- package/server/hmr/wsHub.ts +9 -7
- package/server/imageOptimizer.ts +5 -26
- package/server/index.ts +1 -1
- package/server/lifecycle/portInUse.ts +1 -4
- package/server/lifecycle/runtimeDir.ts +0 -4
- package/server/lifecycle/shutdownManager.ts +4 -29
- package/server/logging/childOutputReader.ts +0 -12
- package/server/logging/hubFileSink.ts +10 -6
- package/server/logging/logControlSocket.ts +13 -7
- package/server/logging/logForwarder.ts +19 -22
- package/server/logging/logHub.ts +0 -0
- package/server/logging/logQuery.ts +4 -7
- package/server/logging/logStdoutWriter.ts +1 -11
- package/server/logging/logStreamRoute.ts +4 -21
- package/server/logging/logTailClient.ts +1 -8
- package/server/logging/rotatingLogWriter.ts +4 -6
- package/server/mcp/McpAuth.ts +5 -79
- package/server/mcp/McpDispatcher.ts +13 -90
- package/server/mcp/McpEventStream.ts +2 -12
- package/server/mcp/McpExecutionContext.ts +1 -42
- package/server/mcp/McpRateLimiter.ts +61 -30
- package/server/mcp/McpRouter.ts +49 -208
- package/server/mcp/PagePromptComposer.ts +7 -29
- package/server/memoryLimit.ts +1 -13
- package/server/oauth/OAuthAuthorize.ts +3 -7
- package/server/oauth/OAuthClientIdMetadata.ts +2 -27
- package/server/oauth/OAuthErrors.ts +0 -13
- package/server/oauth/OAuthMetadata.ts +1 -7
- package/server/oauth/OAuthPkce.ts +0 -2
- package/server/oauth/OAuthRedirect.ts +0 -9
- package/server/oauth/OAuthRegistration.ts +0 -2
- package/server/oauth/OAuthRevocation.ts +1 -11
- package/server/oauth/OAuthToken.ts +3 -14
- package/server/oauth/oauthTypes.ts +1 -2
- package/server/ops/ageEncryption.ts +317 -0
- package/server/ops/appInfo.ts +92 -0
- package/server/ops/opsCommand.ts +116 -0
- package/server/ops/opsRoute.ts +151 -0
- package/server/ops/opsToken.ts +93 -0
- package/server/ops/snapshotJobs.ts +133 -0
- package/server/ops/snapshotRestore.ts +118 -0
- package/server/ops/snapshotTypes.ts +52 -0
- package/server/ops/sqliteFiles.ts +20 -0
- package/server/ops/sqliteSnapshot.ts +149 -0
- package/server/processMetricsCollector.ts +12 -14
- package/server/proxy/hostBasePathWebProxy.ts +20 -13
- package/server/proxy/index.ts +2 -3
- package/server/proxy/localeWebProxy.ts +3 -17
- package/server/proxy/types.ts +14 -0
- package/server/proxy/webProxyRunner.ts +13 -1
- package/server/resolver/CascadeRunner.ts +7 -23
- package/server/resolver/database.resolver.ts +57 -123
- package/server/resolver/service.resolver.ts +9 -161
- package/server/resolver/signal.resolver.ts +73 -98
- package/server/routeElementComposer.tsx +23 -52
- package/server/routeState.ts +15 -34
- package/server/routeTreeBuilder.ts +24 -83
- package/server/routing/apiRouter.ts +17 -49
- package/server/routing/appWsData.ts +4 -28
- package/server/routing/soloAppRoutes.ts +5 -5
- package/server/rscClient.tsx +31 -37
- package/server/rscClientFetch.ts +7 -3
- package/server/rscClientPatch.ts +4 -25
- package/server/rscHttp.ts +1 -1
- package/server/rscNavigationState.ts +10 -25
- package/server/rscPagePrompts.ts +4 -24
- package/server/rscSegmentOutlet.tsx +1 -5
- package/server/rscWorker.tsx +146 -285
- package/server/rscWorkerCache.ts +74 -8
- package/server/rscWorkerHost.ts +45 -192
- package/server/semaphore.ts +1 -1
- package/server/sitemap.ts +1 -3
- package/server/ssrFromRscRenderer.tsx +31 -124
- package/server/ssrTypes.ts +3 -29
- package/server/staticPath.ts +0 -16
- package/server/systemPageDocument.tsx +65 -2
- package/server/systemPages.tsx +4 -2
- package/server/tunnel/TunnelAgent.ts +237 -0
- package/server/tunnel/TunnelDataSocket.ts +146 -0
- package/server/tunnel/TunnelHttpStream.ts +86 -0
- package/server/tunnel/TunnelTcpStream.ts +96 -0
- package/server/tunnel/TunnelWebsocketStream.ts +110 -0
- package/server/tunnel/index.ts +6 -0
- package/server/tunnel/tunnelStream.ts +32 -0
- package/server/types.tsx +2 -9
- package/server/webRouter.ts +88 -306
- package/service/agent.service.ts +66 -35
- package/service/injectInfo.ts +106 -75
- package/service/ipcTypes.ts +4 -1
- package/service/liveSyncHub.ts +4 -34
- package/service/predefinedAdaptor/anthropicLlm.ts +65 -75
- package/service/predefinedAdaptor/cache.adaptor.ts +257 -75
- package/service/predefinedAdaptor/database.adaptor.ts +366 -108
- package/service/predefinedAdaptor/documentTransfer.ts +89 -0
- package/service/predefinedAdaptor/index.ts +2 -1
- package/service/predefinedAdaptor/insightQuery.ts +89 -79
- package/service/predefinedAdaptor/llm.adaptor.ts +64 -54
- package/service/predefinedAdaptor/llmOverflow.ts +63 -0
- package/service/predefinedAdaptor/openaiDialect.ts +56 -64
- package/service/predefinedAdaptor/openaiLlm.ts +24 -27
- package/service/predefinedAdaptor/queue.adaptor.ts +41 -22
- package/service/predefinedAdaptor/schedule.adaptor.ts +69 -9
- package/service/predefinedAdaptor/searchIndex.ts +76 -325
- package/service/predefinedAdaptor/solidCache.adaptor.ts +135 -12
- package/service/predefinedAdaptor/solidPubsub.adaptor.ts +28 -16
- package/service/predefinedAdaptor/solidQueue.adaptor.ts +61 -10
- package/service/predefinedAdaptor/solidSqlite.ts +10 -16
- package/service/predefinedAdaptor/sql/PendingStoreEnsures.ts +1 -0
- package/service/predefinedAdaptor/sql/PostgresInsightSession.ts +113 -0
- package/service/predefinedAdaptor/sql/QueryCompiler.ts +50 -30
- package/service/predefinedAdaptor/sql/SqlDocumentStore.ts +290 -138
- package/service/predefinedAdaptor/sql/SqliteInsightSession.ts +85 -0
- package/service/predefinedAdaptor/sql/UpdateCompiler.ts +1 -7
- package/service/predefinedAdaptor/sql/dialect/postgres.ts +138 -53
- package/service/predefinedAdaptor/sql/dialect/sqlite.ts +18 -15
- package/service/predefinedAdaptor/sql/driver/bunSqlite.ts +31 -4
- package/service/predefinedAdaptor/sql/driver/libsql.ts +20 -12
- package/service/predefinedAdaptor/sql/driver/postgres.ts +13 -7
- package/service/predefinedAdaptor/sql/search/fts5.ts +249 -0
- package/service/predefinedAdaptor/sql/search/mirror.ts +76 -0
- package/service/predefinedAdaptor/sql/search/postgres.ts +453 -0
- package/service/predefinedAdaptor/sql/search/types.ts +50 -0
- package/service/predefinedAdaptor/sql/types.ts +76 -17
- package/service/predefinedAdaptor/sql/values.ts +40 -2
- package/service/predefinedAdaptor/sqlitePath.ts +12 -0
- package/service/predefinedAdaptor/sseData.ts +23 -0
- package/service/predefinedAdaptor/storage.adaptor.ts +19 -7
- package/service/predefinedAdaptor/websocket.adaptor.ts +154 -184
- package/service/serve.ts +1 -2
- package/service/serviceModule.ts +52 -70
- package/service/toolNames.ts +5 -22
- package/service/types.ts +3 -9
- package/signal/CrossSiteGuard.ts +5 -40
- package/signal/SignalFailure.ts +2 -15
- package/signal/agent/AgentCatalogue.ts +9 -55
- package/signal/agent.signal.ts +9 -6
- package/signal/agentMeter.ts +45 -0
- package/signal/agentTurnStream.ts +48 -46
- package/signal/endpoint.ts +12 -2
- package/signal/endpointCache.ts +59 -0
- package/signal/endpointInfo.ts +13 -27
- package/signal/exception.ts +3 -34
- package/signal/guard.ts +4 -21
- package/signal/guards.ts +2 -10
- package/signal/index.ts +1 -0
- package/signal/internal.ts +3 -7
- package/signal/internalArg.ts +10 -13
- package/signal/internalInfo.ts +1 -1
- package/signal/mcp/McpDocument.ts +21 -90
- package/signal/mcp/McpProgress.ts +6 -19
- package/signal/mcp/McpUriTemplate.ts +1 -27
- package/signal/mcp/Msg.ts +13 -122
- package/signal/mcp/mcpProtocol.ts +3 -26
- package/signal/mcp/pagePrompt.ts +3 -9
- package/signal/middleware.ts +15 -65
- package/signal/openapi/openapi.ts +0 -4
- package/signal/schema/JsonSchemaBuilder.ts +32 -46
- package/signal/serializer/fetch.serializer.ts +37 -43
- package/signal/serverSignal.ts +6 -8
- package/signal/signalContext.ts +70 -161
- package/signal/signalRegistry.ts +11 -17
- package/signal/slice.ts +6 -12
- package/signal/sliceInfo.ts +5 -30
- package/signal/trace.ts +11 -84
- package/signal/types.ts +27 -57
- package/store/SliceRequest.ts +1 -11
- package/store/action.ts +153 -395
- package/store/actionTag.ts +1 -10
- package/store/agent/AgentBridge.ts +3 -25
- package/store/agent/AgentContext.ts +2 -9
- package/store/agent/AgentCursor.ts +160 -0
- package/store/agent/AgentPrompts.ts +0 -15
- package/store/agent/AgentVisual.ts +152 -0
- package/store/agent/ScreenFlash.ts +67 -0
- package/store/agent/ScreenReader.ts +3 -52
- package/store/agent/ScreenSettle.ts +1 -13
- package/store/agent/ScreenTarget.ts +15 -32
- package/store/agent/StoreCatalogue.ts +12 -24
- package/store/agent/StoreSurfaceSource.ts +35 -65
- package/store/agent/index.ts +4 -4
- package/store/agentic/AgentValue.ts +9 -26
- package/store/agentic/StExposeBuilder.ts +3 -12
- package/store/agentic/StExposeDraft.ts +0 -6
- package/store/agentic/StStateBuilder.ts +3 -11
- package/store/agentic/StStateDraft.ts +0 -5
- package/store/agentic/StToolBuilder.ts +48 -41
- package/store/agentic/StToolDraft.ts +0 -7
- package/store/agentic/attachAgentic.ts +2 -10
- package/store/agentic/formFields.ts +8 -42
- package/store/agentic/index.ts +1 -1
- package/store/agentic/useAgentReference.ts +31 -0
- package/store/agentic/useFieldTool.ts +176 -58
- package/store/agentic/useFormTools.ts +4 -21
- package/store/agentic/useRelationFieldTool.ts +2 -15
- package/store/databaseStateNames.ts +0 -9
- package/store/draftStore.ts +4 -54
- package/store/formSetterNames.ts +2 -19
- package/store/hooks.ts +1 -1
- package/store/liveInsert.ts +1 -30
- package/store/sliceKeys.ts +37 -0
- package/store/sliceRole.ts +1 -10
- package/store/state.ts +4 -50
- package/store/stateBuilder.ts +1 -23
- package/store/storeInstance.ts +21 -114
- package/store/storeRegistry.ts +1 -8
- package/store/types.ts +1 -1
- package/test/conformance.ts +299 -0
- package/test/index.ts +2 -2
- package/test/sampleOf.ts +52 -28
- package/test/signalTestRuntime.ts +6 -10
- package/test/testServer.ts +66 -31
- package/types/base/base.d.ts +2 -3
- package/types/base/baseEnv.d.ts +7 -10
- package/types/base/databaseModes.d.ts +28 -0
- package/types/base/index.d.ts +1 -0
- package/types/base/primitiveRegistry.d.ts +23 -10
- package/types/base/symbols.d.ts +1 -1
- package/types/capacitor.base.config.d.ts +1 -1
- package/types/client/cn.d.ts +3 -13
- package/types/client/cookie.d.ts +3 -12
- package/types/client/csrTypes.d.ts +6 -57
- package/types/client/decorators.d.ts +1 -1
- package/types/client/device.d.ts +2 -1
- package/types/client/index.d.ts +0 -1
- package/types/client/route/RootLayoutDefinition.d.ts +0 -1
- package/types/client/route/RouteDefinition.d.ts +4 -16
- package/types/client/route/resolveRouteModule.d.ts +1 -5
- package/types/client/router.d.ts +8 -4
- package/types/client/rscNavigation.d.ts +4 -5
- package/types/client/sharedContext.d.ts +2 -19
- package/types/client/storage.d.ts +1 -1
- package/types/client/types.d.ts +0 -3
- package/types/common/CodeAgentClient.d.ts +20 -0
- package/types/common/CodeTranscript.d.ts +72 -0
- package/types/common/Logger.d.ts +4 -20
- package/types/common/TrustedProxy.d.ts +2 -28
- package/types/common/applyMixins.d.ts +3 -0
- package/types/common/authToken.d.ts +0 -11
- package/types/common/capitalize.d.ts +1 -1
- package/types/common/clamp.d.ts +0 -1
- package/types/common/clientAddress.d.ts +1 -15
- package/types/common/codeAgentProfile.d.ts +115 -0
- package/types/common/codeAgentWire.d.ts +279 -0
- package/types/{server/routing → common}/eventStream.d.ts +0 -5
- package/types/common/fileUpload.d.ts +6 -11
- package/types/common/index.d.ts +20 -19
- package/types/common/interpolateTranslation.d.ts +1 -6
- package/types/common/isEmail.d.ts +0 -1
- package/types/common/isRecord.d.ts +1 -0
- package/types/common/isThenable.d.ts +0 -8
- package/types/common/logContext.d.ts +1 -1
- package/types/{ui/Agent → common}/markdownBlocks.d.ts +0 -3
- package/types/common/markdownSpans.d.ts +30 -0
- package/types/{ui/Agent → common}/markdownTable.d.ts +0 -2
- package/types/common/mcpExposure.d.ts +3 -23
- package/types/common/objectPath.d.ts +10 -0
- package/types/common/objectify.d.ts +7 -0
- package/types/common/phone.d.ts +2 -0
- package/types/common/randomPick.d.ts +1 -0
- package/types/common/requestOrigin.d.ts +0 -17
- package/types/common/restClient.d.ts +0 -7
- package/types/common/round.d.ts +1 -0
- package/types/common/routeConvention.d.ts +2 -5
- package/types/common/sleep.d.ts +0 -1
- package/types/common/subRoute.d.ts +4 -6
- package/types/common/toError.d.ts +1 -0
- package/types/common/tunnelWire.d.ts +161 -0
- package/types/common/types.d.ts +7 -7
- package/types/common/version.d.ts +6 -0
- package/types/common/websocketContract.d.ts +41 -0
- package/types/constant/cascadePaths.d.ts +2 -5
- package/types/constant/constantRegistry.d.ts +4 -4
- package/types/constant/dateSlot.d.ts +0 -5
- package/types/constant/fieldInfo.d.ts +2 -21
- package/types/constant/fieldQueryMeta.d.ts +2 -10
- package/types/constant/getDefault.d.ts +5 -7
- package/types/constant/hydrationPlan.d.ts +0 -8
- package/types/constant/index.d.ts +0 -1
- package/types/constant/labelOf.d.ts +1 -6
- package/types/constant/mask.d.ts +11 -36
- package/types/constant/serialize.d.ts +10 -2
- package/types/constant/types.d.ts +2 -6
- package/types/constant/via.d.ts +0 -1
- package/types/dictionary/DictionaryLookup.d.ts +1 -7
- package/types/dictionary/agent.dictionary.d.ts +2 -1
- package/types/dictionary/base.dictionary.d.ts +1 -1
- package/types/dictionary/dictInfo.d.ts +25 -92
- package/types/dictionary/dictShape.d.ts +26 -0
- package/types/dictionary/dictionary.d.ts +9 -9
- package/types/dictionary/dictionaryRegistry.d.ts +1 -15
- package/types/dictionary/locale.d.ts +9 -28
- package/types/dictionary/trans.d.ts +5 -14
- package/types/document/dataLoader.d.ts +2 -2
- package/types/document/database.d.ts +21 -14
- package/types/document/documentQuery.d.ts +6 -1
- package/types/document/documentSchema.d.ts +3 -7
- package/types/document/filterMeta.d.ts +3 -8
- package/types/document/index.d.ts +0 -1
- package/types/document/into.d.ts +3 -2
- package/types/document/loaderInfo.d.ts +9 -4
- package/types/document/noDocumentError.d.ts +2 -7
- package/types/document/queryEvaluator.d.ts +7 -24
- package/types/document/types.d.ts +0 -1
- package/types/fetch/client/fetchClient.d.ts +6 -9
- package/types/fetch/client/fetchHandle.d.ts +3 -11
- package/types/fetch/client/httpClient.d.ts +5 -1
- package/types/fetch/client/remoteError.d.ts +2 -8
- package/types/fetch/client/sliceInitHandle.d.ts +2 -5
- package/types/fetch/client/sliceQueryArgs.d.ts +3 -0
- package/types/fetch/client/wsClient.d.ts +10 -15
- package/types/fetch/fetchType/appliedReturn.type.d.ts +5 -23
- package/types/fetch/fetchType/buildFetch.type.d.ts +15 -1
- package/types/fetch/fetchType/index.d.ts +0 -1
- package/types/fetch/requestStorage.d.ts +3 -16
- package/types/fetch/types.d.ts +0 -1
- package/types/index.d.ts +30 -64
- package/types/server/akanApp.d.ts +5 -28
- package/types/server/akanAppHeaders.d.ts +0 -1
- package/types/server/akanOption.d.ts +12 -24
- package/types/server/akanServer.d.ts +16 -56
- package/types/server/animatedImage.d.ts +0 -6
- package/types/server/artifact/builderRpc.d.ts +7 -30
- package/types/server/artifact/index.d.ts +0 -1
- package/types/server/artifact/ipcTypes.d.ts +22 -29
- package/types/server/artifact/routeClientCache.d.ts +3 -11
- package/types/server/artifact/routeSeedIndexStore.d.ts +0 -16
- package/types/server/artifact/routesManifestStore.d.ts +1 -1
- package/types/server/binaryPubsub.d.ts +0 -8
- package/types/server/cachePolicy.d.ts +2 -21
- package/types/server/console.d.ts +3 -6
- package/types/server/consoleSession.d.ts +2 -2
- package/types/server/contentEncoding.d.ts +6 -14
- package/types/server/decorators.d.ts +0 -12
- package/types/server/devtools/constantSerializer.d.ts +1 -6
- package/types/server/devtools/depsSerializer.d.ts +1 -7
- package/types/server/devtools/devtoolsJson.d.ts +1 -7
- package/types/server/devtools/devtoolsRouter.d.ts +2 -11
- package/types/server/devtools/signalSerializer.d.ts +1 -9
- package/types/server/devtools/types.d.ts +0 -11
- package/types/server/di/diLifecycle.d.ts +0 -36
- package/types/server/di/predefinedAdaptor.d.ts +3 -2
- package/types/server/di/resolveHierarchy.d.ts +22 -5
- package/types/server/di/utils.d.ts +4 -17
- package/types/server/head.d.ts +9 -0
- package/types/server/hmr/devHmrController.d.ts +0 -2
- package/types/server/hmr/wsHub.d.ts +6 -1
- package/types/server/index.d.ts +1 -1
- package/types/server/lifecycle/portInUse.d.ts +1 -4
- package/types/server/lifecycle/runtimeDir.d.ts +0 -4
- package/types/server/lifecycle/shutdownManager.d.ts +0 -9
- package/types/server/logging/childOutputReader.d.ts +0 -12
- package/types/server/logging/hubFileSink.d.ts +1 -5
- package/types/server/logging/logControlSocket.d.ts +2 -7
- package/types/server/logging/logForwarder.d.ts +3 -15
- package/types/server/logging/logHub.d.ts +1 -15
- package/types/server/logging/logQuery.d.ts +3 -6
- package/types/server/logging/logStdoutWriter.d.ts +0 -6
- package/types/server/logging/logStreamRoute.d.ts +0 -9
- package/types/server/logging/logTailClient.d.ts +0 -5
- package/types/server/mcp/McpAuth.d.ts +3 -71
- package/types/server/mcp/McpDispatcher.d.ts +0 -23
- package/types/server/mcp/McpEventStream.d.ts +1 -12
- package/types/server/mcp/McpExecutionContext.d.ts +0 -33
- package/types/server/mcp/McpRateLimiter.d.ts +10 -13
- package/types/server/mcp/McpRouter.d.ts +1 -47
- package/types/server/mcp/PagePromptComposer.d.ts +1 -13
- package/types/server/memoryLimit.d.ts +1 -13
- package/types/server/oauth/OAuthAuthorize.d.ts +1 -6
- package/types/server/oauth/OAuthClientIdMetadata.d.ts +2 -26
- package/types/server/oauth/OAuthErrors.d.ts +0 -13
- package/types/server/oauth/OAuthMetadata.d.ts +1 -7
- package/types/server/oauth/OAuthPkce.d.ts +0 -1
- package/types/server/oauth/OAuthRedirect.d.ts +0 -9
- package/types/server/oauth/OAuthRegistration.d.ts +0 -1
- package/types/server/oauth/OAuthRevocation.d.ts +1 -11
- package/types/server/oauth/OAuthToken.d.ts +1 -13
- package/types/server/oauth/oauthTypes.d.ts +1 -2
- package/types/server/ops/ageEncryption.d.ts +19 -0
- package/types/server/ops/appInfo.d.ts +36 -0
- package/types/server/ops/opsCommand.d.ts +5 -0
- package/types/server/ops/opsRoute.d.ts +24 -0
- package/types/server/ops/opsToken.d.ts +26 -0
- package/types/server/ops/snapshotJobs.d.ts +24 -0
- package/types/server/ops/snapshotRestore.d.ts +24 -0
- package/types/server/ops/snapshotTypes.d.ts +45 -0
- package/types/server/ops/sqliteFiles.d.ts +5 -0
- package/types/server/ops/sqliteSnapshot.d.ts +32 -0
- package/types/server/processMetricsCollector.d.ts +3 -1
- package/types/server/proxy/hostBasePathWebProxy.d.ts +7 -1
- package/types/server/proxy/index.d.ts +2 -3
- package/types/server/proxy/localeWebProxy.d.ts +1 -1
- package/types/server/proxy/types.d.ts +5 -0
- package/types/server/proxy/webProxyRunner.d.ts +1 -0
- package/types/server/resolver/CascadeRunner.d.ts +0 -4
- package/types/server/resolver/database.resolver.d.ts +1 -1
- package/types/server/resolver/service.resolver.d.ts +2 -2
- package/types/server/resolver/signal.resolver.d.ts +1 -15
- package/types/server/routeElementComposer.d.ts +2 -8
- package/types/server/routeState.d.ts +1 -1
- package/types/server/routing/apiRouter.d.ts +2 -20
- package/types/server/routing/appWsData.d.ts +0 -26
- package/types/server/routing/soloAppRoutes.d.ts +2 -6
- package/types/server/rscClient.d.ts +0 -9
- package/types/server/rscClientFetch.d.ts +6 -6
- package/types/server/rscClientPatch.d.ts +1 -1
- package/types/server/rscHttp.d.ts +1 -0
- package/types/server/rscNavigationState.d.ts +3 -2
- package/types/server/rscPagePrompts.d.ts +0 -9
- package/types/server/rscWorkerCache.d.ts +41 -3
- package/types/server/rscWorkerHost.d.ts +5 -61
- package/types/server/ssrFromRscRenderer.d.ts +0 -12
- package/types/server/ssrTypes.d.ts +2 -29
- package/types/server/staticPath.d.ts +0 -16
- package/types/server/systemPageDocument.d.ts +8 -0
- package/types/server/systemPages.d.ts +2 -3
- package/types/server/tunnel/TunnelAgent.d.ts +29 -0
- package/types/server/tunnel/TunnelDataSocket.d.ts +22 -0
- package/types/server/tunnel/TunnelHttpStream.d.ts +10 -0
- package/types/server/tunnel/TunnelTcpStream.d.ts +11 -0
- package/types/server/tunnel/TunnelWebsocketStream.d.ts +10 -0
- package/types/server/tunnel/index.d.ts +6 -0
- package/types/server/tunnel/tunnelStream.d.ts +19 -0
- package/types/server/tunnel.d.ts +1 -0
- package/types/server/types.d.ts +2 -9
- package/types/server/webRouter.d.ts +2 -19
- package/types/service/agent.service.d.ts +16 -29
- package/types/service/injectInfo.d.ts +26 -15
- package/types/service/ipcTypes.d.ts +6 -0
- package/types/service/liveSyncHub.d.ts +4 -22
- package/types/service/predefinedAdaptor/anthropicLlm.d.ts +20 -29
- package/types/service/predefinedAdaptor/cache.adaptor.d.ts +42 -12
- package/types/service/predefinedAdaptor/database.adaptor.d.ts +20 -16
- package/types/service/predefinedAdaptor/documentTransfer.d.ts +15 -0
- package/types/service/predefinedAdaptor/index.d.ts +2 -1
- package/types/service/predefinedAdaptor/insightQuery.d.ts +7 -30
- package/types/service/predefinedAdaptor/llm.adaptor.d.ts +54 -54
- package/types/service/predefinedAdaptor/llmOverflow.d.ts +16 -0
- package/types/service/predefinedAdaptor/openaiDialect.d.ts +19 -29
- package/types/service/predefinedAdaptor/openaiLlm.d.ts +9 -14
- package/types/service/predefinedAdaptor/queue.adaptor.d.ts +12 -7
- package/types/service/predefinedAdaptor/schedule.adaptor.d.ts +7 -2
- package/types/service/predefinedAdaptor/searchIndex.d.ts +17 -47
- package/types/service/predefinedAdaptor/solidCache.adaptor.d.ts +15 -6
- package/types/service/predefinedAdaptor/solidPubsub.adaptor.d.ts +6 -4
- package/types/service/predefinedAdaptor/solidSqlite.d.ts +2 -1
- package/types/service/predefinedAdaptor/sql/PostgresInsightSession.d.ts +20 -0
- package/types/service/predefinedAdaptor/sql/QueryCompiler.d.ts +9 -11
- package/types/service/predefinedAdaptor/sql/SqlDocumentStore.d.ts +11 -25
- package/types/service/predefinedAdaptor/sql/SqliteInsightSession.d.ts +15 -0
- package/types/service/predefinedAdaptor/sql/UpdateCompiler.d.ts +0 -4
- package/types/service/predefinedAdaptor/sql/dialect/postgres.d.ts +18 -10
- package/types/service/predefinedAdaptor/sql/dialect/sqlite.d.ts +5 -2
- package/types/service/predefinedAdaptor/sql/driver/bunSqlite.d.ts +9 -3
- package/types/service/predefinedAdaptor/sql/driver/libsql.d.ts +8 -5
- package/types/service/predefinedAdaptor/sql/driver/postgres.d.ts +4 -4
- package/types/service/predefinedAdaptor/sql/search/fts5.d.ts +28 -0
- package/types/service/predefinedAdaptor/sql/search/mirror.d.ts +20 -0
- package/types/service/predefinedAdaptor/sql/search/postgres.d.ts +53 -0
- package/types/service/predefinedAdaptor/sql/search/types.d.ts +45 -0
- package/types/service/predefinedAdaptor/sql/types.d.ts +69 -15
- package/types/service/predefinedAdaptor/sql/values.d.ts +8 -0
- package/types/service/predefinedAdaptor/sqlitePath.d.ts +1 -0
- package/types/service/predefinedAdaptor/sseData.d.ts +1 -0
- package/types/service/predefinedAdaptor/storage.adaptor.d.ts +3 -2
- package/types/service/predefinedAdaptor/websocket.adaptor.d.ts +26 -26
- package/types/service/serviceModule.d.ts +7 -7
- package/types/service/toolNames.d.ts +4 -21
- package/types/service/types.d.ts +3 -3
- package/types/signal/CrossSiteGuard.d.ts +3 -28
- package/types/signal/SignalFailure.d.ts +1 -15
- package/types/signal/agent/AgentCatalogue.d.ts +8 -54
- package/types/signal/agent.signal.d.ts +4 -1
- package/types/signal/agentMeter.d.ts +24 -0
- package/types/signal/agentTurnStream.d.ts +10 -11
- package/types/signal/endpoint.d.ts +0 -1
- package/types/signal/endpointCache.d.ts +5 -0
- package/types/signal/endpointInfo.d.ts +1 -9
- package/types/signal/exception.d.ts +1 -34
- package/types/signal/guard.d.ts +4 -15
- package/types/signal/guards.d.ts +2 -10
- package/types/signal/index.d.ts +1 -0
- package/types/signal/internal.d.ts +1 -5
- package/types/signal/internalArg.d.ts +7 -13
- package/types/signal/mcp/McpDocument.d.ts +5 -45
- package/types/signal/mcp/McpProgress.d.ts +6 -19
- package/types/signal/mcp/McpUriTemplate.d.ts +1 -19
- package/types/signal/mcp/Msg.d.ts +13 -70
- package/types/signal/mcp/mcpProtocol.d.ts +1 -26
- package/types/signal/mcp/pagePrompt.d.ts +3 -9
- package/types/signal/middleware.d.ts +0 -18
- package/types/signal/schema/JsonSchemaBuilder.d.ts +15 -43
- package/types/signal/serializer/fetch.serializer.d.ts +1 -6
- package/types/signal/serverSignal.d.ts +0 -1
- package/types/signal/signalContext.d.ts +14 -61
- package/types/signal/signalRegistry.d.ts +0 -1
- package/types/signal/slice.d.ts +3 -9
- package/types/signal/sliceInfo.d.ts +5 -30
- package/types/signal/trace.d.ts +2 -30
- package/types/signal/types.d.ts +27 -57
- package/types/store/SliceRequest.d.ts +1 -11
- package/types/store/action.d.ts +2 -6
- package/types/store/actionTag.d.ts +1 -10
- package/types/store/agent/AgentBridge.d.ts +3 -22
- package/types/store/agent/AgentContext.d.ts +1 -7
- package/types/store/agent/AgentCursor.d.ts +24 -0
- package/types/store/agent/AgentPrompts.d.ts +0 -5
- package/types/store/agent/AgentVisual.d.ts +25 -0
- package/types/store/agent/ScreenFlash.d.ts +23 -0
- package/types/store/agent/ScreenReader.d.ts +3 -26
- package/types/store/agent/ScreenSettle.d.ts +1 -12
- package/types/store/agent/ScreenTarget.d.ts +3 -23
- package/types/store/agent/StoreCatalogue.d.ts +12 -16
- package/types/store/agent/StoreSurfaceSource.d.ts +11 -23
- package/types/store/agent/index.d.ts +4 -3
- package/types/store/agentic/AgentValue.d.ts +3 -23
- package/types/store/agentic/StExposeBuilder.d.ts +2 -11
- package/types/store/agentic/StExposeDraft.d.ts +0 -6
- package/types/store/agentic/StStateBuilder.d.ts +1 -7
- package/types/store/agentic/StStateDraft.d.ts +0 -5
- package/types/store/agentic/StToolBuilder.d.ts +14 -37
- package/types/store/agentic/StToolDraft.d.ts +0 -7
- package/types/store/agentic/attachAgentic.d.ts +2 -10
- package/types/store/agentic/formFields.d.ts +5 -41
- package/types/store/agentic/index.d.ts +1 -1
- package/types/store/agentic/useAgentReference.d.ts +14 -0
- package/types/store/agentic/useFieldTool.d.ts +19 -16
- package/types/store/agentic/useFormTools.d.ts +1 -18
- package/types/store/agentic/useRelationFieldTool.d.ts +1 -14
- package/types/store/baseSt.d.ts +2 -2
- package/types/store/databaseStateNames.d.ts +0 -9
- package/types/store/draftStore.d.ts +4 -30
- package/types/store/formSetterNames.d.ts +0 -19
- package/types/store/hooks.d.ts +1 -1
- package/types/store/liveInsert.d.ts +0 -23
- package/types/store/sliceKeys.d.ts +31 -0
- package/types/store/sliceRole.d.ts +1 -10
- package/types/store/state.d.ts +2 -9
- package/types/store/stateBuilder.d.ts +0 -14
- package/types/store/storeInstance.d.ts +6 -20
- package/types/store/storeRegistry.d.ts +0 -2
- package/types/test/conformance.d.ts +73 -0
- package/types/test/index.d.ts +2 -2
- package/types/test/sampleOf.d.ts +17 -2
- package/types/test/signalTestRuntime.d.ts +1 -1
- package/types/test/testServer.d.ts +4 -3
- package/types/ui/Agent/Attach.d.ts +2 -2
- package/types/ui/Agent/Bubble.d.ts +3 -14
- package/types/ui/Agent/Chat.d.ts +31 -64
- package/types/ui/Agent/ChatCommands.d.ts +4 -14
- package/types/ui/Agent/Composer.d.ts +18 -5
- package/types/ui/Agent/Dock.d.ts +38 -10
- package/types/ui/Agent/Guide.d.ts +1 -5
- package/types/ui/Agent/History.d.ts +1 -18
- package/types/ui/Agent/Launcher.d.ts +2 -2
- package/types/ui/Agent/Markdown.d.ts +2 -6
- package/types/ui/Agent/MentionNode.d.ts +18 -0
- package/types/ui/Agent/Menu.d.ts +4 -4
- package/types/ui/Agent/Question.d.ts +1 -6
- package/types/ui/Agent/Queued.d.ts +1 -6
- package/types/ui/Agent/Refer.d.ts +9 -0
- package/types/ui/Agent/RichInput.d.ts +14 -0
- package/types/ui/Agent/Skip.d.ts +3 -15
- package/types/ui/Agent/Steps.d.ts +17 -0
- package/types/ui/Agent/ToolCard.d.ts +9 -0
- package/types/ui/Agent/Zone.d.ts +13 -30
- package/types/ui/Agent/agentSessionOf.d.ts +20 -16
- package/types/ui/Agent/attachment.d.ts +4 -38
- package/types/ui/Agent/fetchRunner.d.ts +1 -8
- package/types/ui/Agent/index.d.ts +2 -6
- package/types/ui/Agent/mentionDraft.d.ts +9 -0
- package/types/ui/Agent/tokenCount.d.ts +1 -5
- package/types/ui/Agent/useChatAttachments.d.ts +0 -5
- package/types/ui/Agent/useChatQueue.d.ts +3 -14
- package/types/ui/Agent/useChatReferences.d.ts +15 -0
- package/types/ui/Agent/useChatVoice.d.ts +0 -12
- package/types/ui/Agent/useDraftRecall.d.ts +0 -8
- package/types/ui/Agent/useKeyboardInset.d.ts +0 -7
- package/types/ui/Agent/useReferenceMenu.d.ts +35 -0
- package/types/ui/Agent/useSlashMenu.d.ts +0 -2
- package/types/ui/Agent/voice.d.ts +8 -42
- package/types/ui/Badge.d.ts +0 -1
- package/types/ui/BottomSheet.d.ts +2 -5
- package/types/ui/Button.d.ts +6 -23
- package/types/ui/ClientSide.d.ts +0 -2
- package/types/ui/Constant/schemaGraph.d.ts +0 -4
- package/types/ui/Copy.d.ts +2 -3
- package/types/ui/CsrImage.d.ts +2 -1
- package/types/ui/Data/Dashboard.d.ts +1 -4
- package/types/ui/Data/Item.d.ts +1 -1
- package/types/ui/Data/ListContainer.d.ts +1 -10
- package/types/ui/Data/Pagination.d.ts +0 -2
- package/types/ui/Data/QueryMaker.d.ts +0 -7
- package/types/ui/Data/RefPicker.d.ts +0 -7
- package/types/ui/DatePicker.d.ts +0 -11
- package/types/ui/Dialog/LegacyModal.d.ts +1 -4
- package/types/ui/Dialog/Provider.d.ts +37 -4
- package/types/ui/Dialog/index.d.ts +4 -4
- package/types/ui/Dropdown.d.ts +1 -9
- package/types/ui/Empty.d.ts +3 -10
- package/types/ui/Field/Collection.d.ts +1 -16
- package/types/ui/Field/Relation.d.ts +10 -37
- package/types/ui/Field/Text.d.ts +9 -66
- package/types/ui/Field/index.d.ts +0 -9
- package/types/ui/Field/lightRefCache.d.ts +11 -0
- package/types/ui/Field/useRelationOptions.d.ts +28 -0
- package/types/ui/Image.d.ts +8 -12
- package/types/ui/InfiniteScroll.d.ts +2 -6
- package/types/ui/Input.d.ts +8 -15
- package/types/ui/Layout/Role.d.ts +23 -0
- package/types/ui/Layout/Sider.d.ts +21 -0
- package/types/ui/Layout/TopInset.d.ts +5 -0
- package/types/ui/Layout/index.d.ts +7 -7
- package/types/ui/LegacyModal.d.ts +1 -12
- package/types/ui/Link/Action.d.ts +11 -0
- package/types/ui/Link/Anchor.d.ts +20 -0
- package/types/ui/Link/index.d.ts +4 -7
- package/types/ui/Load/Edit_Client.d.ts +1 -1
- package/types/ui/Load/Page.d.ts +3 -5
- package/types/ui/Load/Stream.d.ts +0 -12
- package/types/ui/Load/Units.d.ts +1 -1
- package/types/ui/Load/View.d.ts +2 -7
- package/types/ui/Loading/ProgressBar.d.ts +0 -4
- package/types/ui/Loading/Skeleton.d.ts +2 -0
- package/types/ui/Loading/Spin.d.ts +12 -2
- package/types/ui/Loading/index.d.ts +3 -8
- package/types/ui/Loading/index_.d.ts +3 -10
- package/types/ui/Menu.d.ts +0 -5
- package/types/ui/Modal.d.ts +0 -17
- package/types/ui/Model/AdminPanel.d.ts +1 -4
- package/types/ui/Model/DraftBar.d.ts +2 -7
- package/types/ui/Model/EditModal.d.ts +7 -22
- package/types/ui/Model/LoadStore.d.ts +18 -0
- package/types/ui/Model/Remove.d.ts +0 -2
- package/types/ui/Model/SureToRemove.d.ts +0 -3
- package/types/ui/Model/ViewEditModal.d.ts +0 -2
- package/types/ui/Model/draftScope.d.ts +0 -7
- package/types/ui/Model/index.d.ts +2 -2
- package/types/ui/Model/index_.d.ts +2 -2
- package/types/ui/Pagination.d.ts +4 -12
- package/types/ui/Popconfirm.d.ts +3 -17
- package/types/ui/Radio.d.ts +0 -4
- package/types/ui/RecentTime.d.ts +5 -9
- package/types/ui/Reference/Panel.d.ts +44 -6
- package/types/ui/Reference/Segmented.d.ts +0 -3
- package/types/ui/Reference/{style.d.ts → docUi.d.ts} +6 -2
- package/types/ui/Reference/index.d.ts +3 -7
- package/types/ui/Refresh.d.ts +1 -1
- package/types/ui/ScreenNavigator.d.ts +2 -2
- package/types/ui/Select.d.ts +4 -19
- package/types/ui/Signal/Endpoint.d.ts +43 -0
- package/types/ui/Signal/WebSocket.d.ts +23 -0
- package/types/ui/Signal/endpointEntries.d.ts +2 -4
- package/types/ui/Signal/index.d.ts +1 -3
- package/types/ui/Signal/style.d.ts +1 -2
- package/types/ui/Switch.d.ts +1 -5
- package/types/ui/System/CSR.d.ts +2 -2
- package/types/ui/System/Client.d.ts +2 -6
- package/types/ui/System/Common.d.ts +11 -22
- package/types/ui/System/Root.d.ts +1 -4
- package/types/ui/System/SSR.d.ts +2 -2
- package/types/ui/System/ThemeToggle.d.ts +1 -0
- package/types/ui/System/index.d.ts +1 -0
- package/types/ui/Tab/Provider.d.ts +24 -4
- package/types/ui/Tab/index.d.ts +3 -3
- package/types/ui/Table.d.ts +7 -23
- package/types/ui/Toast.d.ts +9 -16
- package/types/ui/ToggleSelect.d.ts +0 -5
- package/types/ui/Tooltip.d.ts +1 -2
- package/types/ui/UiOverride/{context.d.ts → UiOverride.d.ts} +24 -40
- package/types/ui/UiOverride/index.d.ts +2 -5
- package/types/ui/UiOverride/override.d.ts +2 -18
- package/types/ui/Unauthorized.d.ts +0 -6
- package/types/ui/agentAttrs.d.ts +4 -11
- package/types/ui/index.d.ts +9 -5
- package/types/ui/overlayLayer.d.ts +4 -24
- package/types/ui/overlayPosition.d.ts +0 -12
- package/types/ui/recipe/badgeRecipe.d.ts +2 -2
- package/types/ui/recipe/buttonRecipe.d.ts +2 -2
- package/types/ui/recipe/factory.d.ts +1 -21
- package/types/ui/recipe/index.d.ts +0 -14
- package/types/ui/recipe/inputRecipe.d.ts +3 -3
- package/types/ui/sliceNamesOf.d.ts +78 -0
- package/types/ui/triggerSlot.d.ts +2 -12
- package/types/vendor/use-agentic/AgentProgress.d.ts +12 -0
- package/types/vendor/use-agentic/AgentSession.d.ts +94 -2
- package/types/vendor/use-agentic/Compaction.d.ts +42 -5
- package/types/vendor/use-agentic/Reference.d.ts +56 -0
- package/types/vendor/use-agentic/ToolRunner.d.ts +31 -1
- package/types/vendor/use-agentic/Transcript.d.ts +4 -1
- package/types/vendor/use-agentic/index.d.ts +1 -0
- package/types/vendor/use-agentic/types.d.ts +109 -7
- package/types/webkit/RenderLayer.d.ts +11 -0
- package/types/webkit/index.d.ts +1 -2
- package/types/webkit/lazy.d.ts +3 -12
- package/types/webkit/{createRobotPage.d.ts → seoPages.d.ts} +4 -0
- package/types/webkit/useBodyScrollLock.d.ts +0 -1
- package/types/webkit/useCamera.d.ts +1 -1
- package/types/webkit/useContact.d.ts +1 -1
- package/types/webkit/useDebounce.d.ts +0 -1
- package/types/webkit/useEscapeKey.d.ts +1 -4
- package/types/webkit/useFetch.d.ts +1 -6
- package/types/webkit/useFrameRuntime.d.ts +1 -1
- package/types/webkit/useGeoLocation.d.ts +1 -1
- package/types/webkit/usePageTool.d.ts +2 -9
- package/types/webkit/usePurchase.d.ts +1 -4
- package/types/webkit/useScreenScope.d.ts +2 -13
- package/ui/Agent/Attach.tsx +5 -4
- package/ui/Agent/Bubble.tsx +51 -31
- package/ui/Agent/Chat.tsx +114 -102
- package/ui/Agent/ChatCommands.ts +5 -21
- package/ui/Agent/Composer.tsx +110 -28
- package/ui/Agent/Dock.tsx +176 -16
- package/ui/Agent/Guide.tsx +1 -5
- package/ui/Agent/History.tsx +1 -18
- package/ui/Agent/Launcher.tsx +2 -2
- package/ui/Agent/Markdown.tsx +40 -14
- package/ui/Agent/MentionNode.ts +54 -0
- package/ui/Agent/Menu.tsx +8 -5
- package/ui/Agent/Question.tsx +1 -6
- package/ui/Agent/Queued.tsx +3 -6
- package/ui/Agent/Refer.tsx +40 -0
- package/ui/Agent/RichInput.tsx +146 -0
- package/ui/Agent/Skip.tsx +3 -15
- package/ui/Agent/Steps.tsx +33 -0
- package/ui/Agent/ToolCard.tsx +32 -0
- package/ui/Agent/Zone.tsx +15 -31
- package/ui/Agent/agentSessionOf.ts +115 -15
- package/ui/Agent/attachment.ts +5 -42
- package/ui/Agent/fetchRunner.ts +3 -15
- package/ui/Agent/index.ts +1 -6
- package/ui/Agent/mentionDraft.ts +91 -0
- package/ui/Agent/tokenCount.ts +1 -5
- package/ui/Agent/useChatAttachments.ts +2 -9
- package/ui/Agent/useChatQueue.ts +12 -14
- package/ui/Agent/useChatReferences.ts +51 -0
- package/ui/Agent/useChatVoice.ts +2 -23
- package/ui/Agent/useDraftRecall.ts +0 -9
- package/ui/Agent/useKeyboardInset.ts +0 -7
- package/ui/Agent/useReferenceMenu.ts +93 -0
- package/ui/Agent/useSlashMenu.ts +0 -3
- package/ui/Agent/voice.ts +8 -43
- package/ui/Badge.tsx +0 -2
- package/ui/BottomSheet.tsx +2 -5
- package/ui/Button.tsx +9 -45
- package/ui/ClientSide.tsx +0 -2
- package/ui/Clipboard.tsx +0 -1
- package/ui/Constant/Doc.tsx +274 -265
- package/ui/Constant/Graph.tsx +11 -3
- package/ui/Constant/schemaGraph.ts +0 -9
- package/ui/Copy.tsx +2 -3
- package/ui/CsrImage.tsx +9 -9
- package/ui/Data/CardList.tsx +2 -17
- package/ui/Data/Dashboard.tsx +2 -5
- package/ui/Data/Item.tsx +2 -3
- package/ui/Data/ListContainer.tsx +15 -61
- package/ui/Data/Pagination.tsx +3 -22
- package/ui/Data/QueryMaker.tsx +1 -8
- package/ui/Data/RefPicker.tsx +1 -8
- package/ui/Data/TableList.tsx +2 -15
- package/ui/DatePicker.tsx +1 -12
- package/ui/Dialog/LegacyModal.tsx +3 -7
- package/ui/Dialog/Modal.tsx +3 -4
- package/ui/Dialog/Provider.tsx +85 -7
- package/ui/Dialog/index.tsx +1 -5
- package/ui/DraggableList.tsx +1 -4
- package/ui/Dropdown.tsx +4 -17
- package/ui/Empty.tsx +4 -12
- package/ui/Field/Choice.tsx +1 -1
- package/ui/Field/Collection.tsx +7 -29
- package/ui/Field/DateField.tsx +2 -7
- package/ui/Field/Label.tsx +0 -1
- package/ui/Field/NumberField.tsx +0 -1
- package/ui/Field/Relation.tsx +79 -199
- package/ui/Field/Text.tsx +25 -86
- package/ui/Field/index.tsx +0 -9
- package/ui/Field/lightRefCache.ts +61 -0
- package/ui/Field/useRelationOptions.ts +97 -0
- package/ui/Image.tsx +35 -65
- package/ui/InfiniteScroll.tsx +3 -21
- package/ui/Input.tsx +82 -174
- package/ui/Layout/Role.tsx +42 -0
- package/ui/Layout/Sider.tsx +82 -1
- package/ui/Layout/TopInset.tsx +23 -1
- package/ui/Layout/index.ts +3 -9
- package/ui/LegacyModal.tsx +1 -12
- package/ui/Link/Action.tsx +29 -0
- package/ui/Link/Anchor.tsx +118 -0
- package/ui/Link/index.tsx +7 -8
- package/ui/Load/Edit_Client.tsx +2 -37
- package/ui/Load/Page.tsx +3 -6
- package/ui/Load/Pagination.tsx +4 -19
- package/ui/Load/Stream.tsx +0 -12
- package/ui/Load/Units.tsx +13 -86
- package/ui/Load/View.tsx +4 -21
- package/ui/Loading/ProgressBar.tsx +0 -4
- package/ui/Loading/Skeleton.tsx +14 -0
- package/ui/Loading/Spin.tsx +34 -5
- package/ui/Loading/index.ts +0 -5
- package/ui/Loading/index_.tsx +2 -12
- package/ui/Menu.tsx +3 -21
- package/ui/Modal.tsx +0 -17
- package/ui/Model/AdminPanel.tsx +2 -5
- package/ui/Model/DraftBar.tsx +3 -14
- package/ui/Model/EditModal.tsx +11 -48
- package/ui/Model/EditWrapper.tsx +2 -3
- package/ui/Model/LoadStore.tsx +18 -0
- package/ui/Model/NewWrapper_Client.tsx +1 -1
- package/ui/Model/Remove.tsx +4 -12
- package/ui/Model/RemoveWrapper.tsx +2 -3
- package/ui/Model/SureToRemove.tsx +4 -13
- package/ui/Model/ViewEditModal.tsx +0 -6
- package/ui/Model/ViewModal.tsx +1 -5
- package/ui/Model/ViewWrapper.tsx +1 -2
- package/ui/Model/draftScope.ts +0 -7
- package/ui/Model/index_.tsx +2 -22
- package/ui/Pagination.tsx +4 -12
- package/ui/Popconfirm.tsx +3 -18
- package/ui/Portal.tsx +2 -3
- package/ui/Radio.tsx +1 -5
- package/ui/RecentTime.tsx +19 -31
- package/ui/Reference/Panel.tsx +102 -6
- package/ui/Reference/Segmented.tsx +5 -11
- package/ui/Reference/{style.ts → docUi.ts} +10 -2
- package/ui/Reference/index.ts +3 -7
- package/ui/Refresh.tsx +79 -13
- package/ui/ScreenNavigator.tsx +8 -13
- package/ui/Select.tsx +29 -37
- package/ui/Signal/Endpoint.tsx +154 -0
- package/ui/Signal/Listener.tsx +1 -4
- package/ui/Signal/Object.tsx +67 -73
- package/ui/Signal/RestApi.tsx +30 -76
- package/ui/Signal/WebSocket.tsx +253 -2
- package/ui/Signal/endpointEntries.ts +3 -5
- package/ui/Signal/index.ts +1 -3
- package/ui/Signal/style.ts +1 -2
- package/ui/Switch.tsx +1 -5
- package/ui/System/CSR.tsx +29 -109
- package/ui/System/Client.tsx +15 -19
- package/ui/System/Common.tsx +31 -22
- package/ui/System/Messages.tsx +2 -2
- package/ui/System/Reconnect.tsx +1 -6
- package/ui/System/Root.tsx +1 -4
- package/ui/System/SSR.tsx +10 -16
- package/ui/System/ThemeToggle.tsx +15 -0
- package/ui/System/index.tsx +2 -2
- package/ui/Tab/Provider.tsx +115 -7
- package/ui/Tab/index.tsx +1 -4
- package/ui/Table.tsx +7 -23
- package/ui/Toast.tsx +9 -16
- package/ui/ToggleSelect.tsx +10 -24
- package/ui/Tooltip.tsx +2 -8
- package/ui/UiOverride/{context.ts → UiOverride.tsx} +54 -42
- package/ui/UiOverride/index.ts +9 -6
- package/ui/UiOverride/override.ts +2 -18
- package/ui/Unauthorized.tsx +1 -8
- package/ui/agentAttrs.ts +9 -12
- package/ui/index.ts +20 -5
- package/ui/overlayLayer.ts +4 -25
- package/ui/overlayPosition.ts +2 -14
- package/ui/recipe/badgeRecipe.ts +1 -1
- package/ui/recipe/buttonRecipe.ts +4 -4
- package/ui/recipe/factory.ts +1 -22
- package/ui/recipe/index.ts +1 -14
- package/ui/recipe/inputRecipe.ts +2 -2
- package/ui/sliceNamesOf.ts +26 -0
- package/ui/styles.css +195 -1
- package/ui/triggerSlot.tsx +2 -12
- package/vendor/use-agentic/AgentProgress.ts +13 -1
- package/vendor/use-agentic/AgentSession.ts +313 -29
- package/vendor/use-agentic/AgenticSurface.ts +2 -0
- package/vendor/use-agentic/Compaction.ts +91 -9
- package/vendor/use-agentic/Reference.ts +99 -0
- package/vendor/use-agentic/ToolRunner.ts +77 -2
- package/vendor/use-agentic/Transcript.ts +15 -4
- package/vendor/use-agentic/WIRE.md +16 -2
- package/vendor/use-agentic/httpRunner.ts +19 -4
- package/vendor/use-agentic/index.ts +1 -1
- package/vendor/use-agentic/types.ts +121 -10
- package/webkit/RenderLayer.tsx +45 -0
- package/webkit/bootCsr.tsx +4 -57
- package/webkit/index.ts +1 -2
- package/webkit/lazy.tsx +3 -13
- package/webkit/{createRobotPage.ts → seoPages.ts} +5 -0
- package/webkit/useBodyScrollLock.tsx +0 -6
- package/webkit/useCamera.tsx +10 -28
- package/webkit/useCodepush.tsx +8 -31
- package/webkit/useContact.tsx +1 -8
- package/webkit/useCsrValues.ts +203 -428
- package/webkit/useDebounce.ts +0 -3
- package/webkit/useEscapeKey.tsx +1 -12
- package/webkit/useFetch.ts +7 -13
- package/webkit/useFrameRuntime.ts +5 -43
- package/webkit/useGeoLocation.tsx +1 -1
- package/webkit/useLocation.ts +5 -8
- package/webkit/usePageTool.tsx +2 -9
- package/webkit/usePurchase.tsx +17 -33
- package/webkit/useScreenScope.tsx +2 -13
- package/client/fetch.ts +0 -1
- package/client/frameDebug.ts +0 -29
- package/common/deepObjectify.ts +0 -42
- package/common/dynamicRecord.ts +0 -12
- package/common/formatPhone.ts +0 -7
- package/common/getAllPropertyDescriptors.ts +0 -13
- package/common/lowerlize.ts +0 -4
- package/common/mergeVersion.ts +0 -10
- package/common/pathGet.ts +0 -13
- package/common/pathGetLoose.ts +0 -31
- package/common/pathSet.ts +0 -28
- package/common/plainFieldsOf.ts +0 -13
- package/common/randomPicks.ts +0 -12
- package/common/websocketAuth.ts +0 -24
- package/constant/deserialize.ts +0 -98
- package/dictionary/agentTurn.dictionary.ts +0 -33
- package/document/schema.ts +0 -24
- package/fetch/fetchType/clientSignal.type.ts +0 -22
- 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/server/artifact/manifestTypes.ts +0 -19
- package/server/assetEncoding.ts +0 -27
- package/server/consoleEvaluator.ts +0 -51
- package/server/di/index.ts +0 -4
- package/server/di/resolveAdaptorHierarchy.ts +0 -91
- package/server/di/resolveServiceHierarchy.ts +0 -47
- package/server/hmr/changeBatch.ts +0 -14
- package/server/hmr/index.ts +0 -4
- package/server/metadata.tsx +0 -198
- package/server/proxy/akanResponse.ts +0 -16
- package/server/proxy/bunRequestFields.ts +0 -12
- package/server/rscPartialCommit.ts +0 -3
- package/server/rscPatchSafety.ts +0 -57
- package/server/rscWorkerReplay.ts +0 -49
- package/server/subRouteIndexDocument.tsx +0 -61
- package/service/predefinedAdaptor/deepseekLlm.ts +0 -82
- package/service/predefinedAdaptor/sqlDescriptor.ts +0 -25
- package/store/agent/storeSurface.ts +0 -28
- package/store/agent/types.ts +0 -16
- package/store/agentic/useFileFieldTool.ts +0 -221
- package/store/stateInfo.ts +0 -66
- package/test/playwright.config.base.ts +0 -48
- package/test/playwright.pageAgent.ts +0 -41
- package/test/sample.ts +0 -19
- package/types/client/fetch.d.ts +0 -1
- package/types/client/frameDebug.d.ts +0 -3
- package/types/common/deepObjectify.d.ts +0 -6
- package/types/common/dynamicRecord.d.ts +0 -14
- package/types/common/formatPhone.d.ts +0 -2
- package/types/common/getAllPropertyDescriptors.d.ts +0 -5
- package/types/common/isPhoneNumber.d.ts +0 -2
- package/types/common/lowerlize.d.ts +0 -2
- package/types/common/mergeVersion.d.ts +0 -10
- package/types/common/pathGet.d.ts +0 -1
- package/types/common/pathGetLoose.d.ts +0 -8
- package/types/common/pathSet.d.ts +0 -3
- package/types/common/plainFieldsOf.d.ts +0 -6
- package/types/common/randomPicks.d.ts +0 -1
- package/types/common/splitVersion.d.ts +0 -11
- package/types/common/websocketAuth.d.ts +0 -19
- package/types/common/websocketBinaryFrame.d.ts +0 -17
- package/types/constant/deserialize.d.ts +0 -10
- package/types/dictionary/agentTurn.dictionary.d.ts +0 -1
- package/types/document/schema.d.ts +0 -5
- package/types/fetch/fetchType/clientSignal.type.d.ts +0 -16
- package/types/server/artifact/manifestTypes.d.ts +0 -16
- package/types/server/assetEncoding.d.ts +0 -7
- package/types/server/consoleEvaluator.d.ts +0 -2
- package/types/server/di/index.d.ts +0 -4
- package/types/server/di/resolveAdaptorHierarchy.d.ts +0 -21
- package/types/server/di/resolveServiceHierarchy.d.ts +0 -13
- package/types/server/di.d.ts +0 -1
- package/types/server/hmr/changeBatch.d.ts +0 -13
- package/types/server/hmr/index.d.ts +0 -4
- package/types/server/hmr.d.ts +0 -1
- package/types/server/metadata.d.ts +0 -22
- package/types/server/proxy/akanResponse.d.ts +0 -7
- package/types/server/proxy/bunRequestFields.d.ts +0 -1
- package/types/server/rscPartialCommit.d.ts +0 -1
- package/types/server/rscPatchSafety.d.ts +0 -8
- package/types/server/rscWorkerReplay.d.ts +0 -32
- package/types/server/subRouteIndexDocument.d.ts +0 -8
- package/types/service/predefinedAdaptor/deepseekLlm.d.ts +0 -19
- package/types/service/predefinedAdaptor/sqlDescriptor.d.ts +0 -5
- package/types/store/agent/storeSurface.d.ts +0 -14
- package/types/store/agent/types.d.ts +0 -15
- package/types/store/agentic/useFileFieldTool.d.ts +0 -41
- package/types/store/stateInfo.d.ts +0 -23
- package/types/test/playwright.config.base.d.ts +0 -9
- package/types/test/playwright.pageAgent.d.ts +0 -12
- package/types/test/sample.d.ts +0 -15
- package/types/ui/Agent/Context.d.ts +0 -13
- package/types/ui/Agent/Mic.d.ts +0 -8
- package/types/ui/Agent/Section.d.ts +0 -10
- package/types/ui/Agent/StateKey.d.ts +0 -16
- package/types/ui/Agent/Tool.d.ts +0 -15
- package/types/ui/Agent/Transcript.d.ts +0 -13
- package/types/ui/Agent/markdownSpans.d.ts +0 -2
- package/types/ui/Agent/sessionHistory.d.ts +0 -14
- package/types/ui/Agent/sessionView.d.ts +0 -15
- package/types/ui/Dialog/Action.d.ts +0 -5
- package/types/ui/Dialog/Close.d.ts +0 -6
- package/types/ui/Dialog/Content.d.ts +0 -6
- package/types/ui/Dialog/Title.d.ts +0 -5
- package/types/ui/Dialog/Trigger.d.ts +0 -6
- package/types/ui/Dialog/context.d.ts +0 -18
- package/types/ui/Layout/LeftSider.d.ts +0 -11
- package/types/ui/Layout/RightSider.d.ts +0 -12
- package/types/ui/Layout/Template.d.ts +0 -7
- package/types/ui/Layout/TopLeftAction.d.ts +0 -6
- package/types/ui/Layout/Unit.d.ts +0 -9
- package/types/ui/Layout/View.d.ts +0 -8
- package/types/ui/Layout/Zone.d.ts +0 -6
- package/types/ui/Link/Back.d.ts +0 -7
- package/types/ui/Link/Close.d.ts +0 -7
- package/types/ui/Link/CsrLink.d.ts +0 -2
- package/types/ui/Link/Lang.d.ts +0 -8
- package/types/ui/Link/SsrLink.d.ts +0 -2
- package/types/ui/Link/types.d.ts +0 -50
- package/types/ui/Loading/Area.d.ts +0 -9
- package/types/ui/Loading/Button.d.ts +0 -7
- package/types/ui/Loading/Input.d.ts +0 -7
- package/types/ui/Model/LoadInit.d.ts +0 -10
- package/types/ui/Model/LoadView.d.ts +0 -10
- package/types/ui/Reference/Collapse.d.ts +0 -11
- package/types/ui/Reference/Summary.d.ts +0 -13
- package/types/ui/Reference/Toolbar.d.ts +0 -21
- package/types/ui/Reference/dictText.d.ts +0 -6
- package/types/ui/Signal/Message.d.ts +0 -23
- package/types/ui/Signal/PubSub.d.ts +0 -24
- package/types/ui/Signal/Request.d.ts +0 -8
- package/types/ui/System/DevModeToggle.d.ts +0 -1
- package/types/ui/System/Gtag.d.ts +0 -4
- package/types/ui/System/frameCssVars.d.ts +0 -5
- package/types/ui/Tab/Menu.d.ts +0 -12
- package/types/ui/Tab/Menus.d.ts +0 -6
- package/types/ui/Tab/Panel.d.ts +0 -8
- package/types/ui/Tab/context.d.ts +0 -11
- package/types/ui/UiOverride/Provider.d.ts +0 -15
- package/types/ui/UiOverride/createOverridable.d.ts +0 -9
- package/types/ui/UiOverride/useUiOverride.d.ts +0 -7
- package/types/ui/UiOverride/useUiRecipe.d.ts +0 -8
- package/types/webkit/createSitemapPage.d.ts +0 -4
- package/ui/Agent/Context.tsx +0 -49
- package/ui/Agent/Mic.tsx +0 -27
- package/ui/Agent/Section.tsx +0 -24
- package/ui/Agent/StateKey.tsx +0 -46
- package/ui/Agent/Tool.tsx +0 -59
- package/ui/Agent/Transcript.tsx +0 -33
- package/ui/Agent/markdownSpans.tsx +0 -49
- package/ui/Agent/sessionHistory.ts +0 -62
- package/ui/Agent/sessionView.ts +0 -38
- package/ui/Dialog/Action.tsx +0 -15
- package/ui/Dialog/Close.tsx +0 -18
- package/ui/Dialog/Content.tsx +0 -11
- package/ui/Dialog/Title.tsx +0 -15
- package/ui/Dialog/Trigger.tsx +0 -18
- package/ui/Dialog/context.ts +0 -32
- package/ui/Layout/LeftSider.tsx +0 -43
- package/ui/Layout/RightSider.tsx +0 -47
- package/ui/Layout/Template.tsx +0 -11
- package/ui/Layout/TopLeftAction.tsx +0 -28
- package/ui/Layout/Unit.tsx +0 -19
- package/ui/Layout/View.tsx +0 -12
- package/ui/Layout/Zone.tsx +0 -10
- package/ui/Link/Back.tsx +0 -15
- package/ui/Link/Close.tsx +0 -20
- package/ui/Link/CsrLink.tsx +0 -46
- package/ui/Link/Lang.tsx +0 -16
- package/ui/Link/SsrLink.tsx +0 -72
- package/ui/Link/types.ts +0 -55
- package/ui/Loading/Area.tsx +0 -27
- package/ui/Loading/Button.tsx +0 -15
- package/ui/Loading/Input.tsx +0 -15
- package/ui/Model/LoadInit.tsx +0 -11
- package/ui/Model/LoadView.tsx +0 -11
- package/ui/Reference/Collapse.tsx +0 -26
- package/ui/Reference/Summary.tsx +0 -25
- package/ui/Reference/Toolbar.tsx +0 -44
- package/ui/Reference/dictText.ts +0 -9
- package/ui/Signal/Message.tsx +0 -215
- package/ui/Signal/PubSub.tsx +0 -201
- package/ui/Signal/Request.tsx +0 -11
- package/ui/System/DevModeToggle.tsx +0 -19
- package/ui/System/Gtag.tsx +0 -69
- package/ui/System/frameCssVars.ts +0 -25
- package/ui/Tab/Menu.tsx +0 -70
- package/ui/Tab/Menus.tsx +0 -13
- package/ui/Tab/Panel.tsx +0 -25
- package/ui/Tab/context.ts +0 -20
- package/ui/UiOverride/Provider.tsx +0 -26
- package/ui/UiOverride/createOverridable.tsx +0 -25
- package/ui/UiOverride/useUiOverride.ts +0 -15
- package/ui/UiOverride/useUiRecipe.ts +0 -15
- package/webkit/createSitemapPage.ts +0 -4
package/server/akanApp.ts
CHANGED
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
|
|
2
|
-
|
|
3
2
|
import { mkdir, readdir, rm } from "node:fs/promises";
|
|
4
3
|
import path from "node:path";
|
|
5
|
-
import { Logger
|
|
4
|
+
import { Logger } from "akanjs/common";
|
|
6
5
|
import type { AkanChildRole, AkanChildStatus, AkanIpcMessage, AkanMetricsReport, AkanUpstream } from "akanjs/service";
|
|
7
6
|
import { getApiPrefix, getWsPrefix, normalizeRoutePrefix, resetEnvCache } from "../base/baseEnv";
|
|
8
7
|
import { isTraceEnabled } from "../signal/trace";
|
|
9
8
|
import { makeAkanChildProxyHeaders } from "./akanAppHeaders";
|
|
10
9
|
import type { BuilderCsrReq, BuilderCsrRes, BuilderMessage, BuilderReq, BuilderRes } from "./artifact";
|
|
11
|
-
import {
|
|
12
|
-
import { compressResponse } from "./contentEncoding";
|
|
10
|
+
import { compressResponse, encodedFileResponse } from "./contentEncoding";
|
|
13
11
|
import { isPortInUseError } from "./lifecycle/portInUse";
|
|
14
12
|
import { resolveRuntimeDir } from "./lifecycle/runtimeDir";
|
|
15
13
|
import { ChildOutputReader } from "./logging/childOutputReader";
|
|
@@ -18,6 +16,8 @@ import { LogControlSocket } from "./logging/logControlSocket";
|
|
|
18
16
|
import { LogHub } from "./logging/logHub";
|
|
19
17
|
import { LogStreamRoute } from "./logging/logStreamRoute";
|
|
20
18
|
import { RotatingLogWriter } from "./logging/rotatingLogWriter";
|
|
19
|
+
import { AppInfo } from "./ops/appInfo";
|
|
20
|
+
import type { OpsRoute } from "./ops/opsRoute";
|
|
21
21
|
import { ProcessMetricsCollector } from "./processMetricsCollector";
|
|
22
22
|
import { resolveStaticPath } from "./staticPath";
|
|
23
23
|
import { getWebConfigFromEnv } from "./types";
|
|
@@ -45,7 +45,6 @@ interface ChildState {
|
|
|
45
45
|
lastErrorMessage?: string;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
/** The shape `#startSolo` needs off `server.ts`; the module itself is loaded by path, so it has no type here. */
|
|
49
48
|
interface SoloServer {
|
|
50
49
|
start: (options: { listen: boolean }) => Promise<unknown>;
|
|
51
50
|
}
|
|
@@ -60,20 +59,12 @@ type GatewayUpstream = {
|
|
|
60
59
|
ws?: Extract<AkanUpstream, { type: "tcp" }>;
|
|
61
60
|
};
|
|
62
61
|
|
|
63
|
-
/**
|
|
64
|
-
* Received-only close codes cannot be sent in a close frame. The gateway deliberately normalizes
|
|
65
|
-
* every unsendable code, including semantically distinct 1005 and 1006 events, to 1001 in both
|
|
66
|
-
* relay directions. In particular, Bun's global client `WebSocket.close()` throws an
|
|
67
|
-
* InvalidAccessError for these codes at the client-to-upstream relay; normalization at the
|
|
68
|
-
* upstream-to-client `Bun.ServerWebSocket.close()` relay is defensive and keeps behavior symmetric.
|
|
69
|
-
*/
|
|
70
62
|
const relayableCloseCode = (code: number): number => {
|
|
71
63
|
if (code >= 3000 && code <= 4999) return code;
|
|
72
64
|
if (code >= 1000 && code <= 1014 && code !== 1004 && code !== 1005 && code !== 1006) return code;
|
|
73
65
|
return 1001;
|
|
74
66
|
};
|
|
75
67
|
|
|
76
|
-
/** Options for the Akan gateway that launches child server replicas and listens for traffic. */
|
|
77
68
|
export interface AkanAppOptions {
|
|
78
69
|
replica?: number | string;
|
|
79
70
|
serverPath?: string;
|
|
@@ -81,38 +72,17 @@ export interface AkanAppOptions {
|
|
|
81
72
|
port?: number;
|
|
82
73
|
wsBasePort?: number;
|
|
83
74
|
openapi?: boolean;
|
|
84
|
-
/**
|
|
85
|
-
* Where the signal endpoints are mounted, `/api` by default. Handed down as `AKAN_API_PREFIX`, which every
|
|
86
|
-
* server process reads — the replicas that build the route table, and the RSC worker, whose page-side
|
|
87
|
-
* `fetch.*` calls travel over HTTP like any other client's. A server-rendered page also carries it to the
|
|
88
|
-
* browser, so the tab's `fetchClient` follows the process that rendered it. A prebuilt CSR or mobile bundle
|
|
89
|
-
* cannot be reached that way and follows `akan.config.ts` instead.
|
|
90
|
-
*/
|
|
75
|
+
/** Signal endpoint mount, `/api` by default; handed down as `AKAN_API_PREFIX` (CSR/mobile follow akan.config.ts). */
|
|
91
76
|
prefix?: string;
|
|
92
77
|
/** Where the websocket upgrade sits under `prefix`, `/ws` by default. Handed down as `AKAN_WS_PREFIX`. */
|
|
93
78
|
websocketPrefix?: string;
|
|
94
|
-
/**
|
|
95
|
-
* Boot only these modules and the ones they reach, in every child. Omitted or empty mounts every enabled
|
|
96
|
-
* module. Handed down as `AKAN_MODULES`, since each replica builds its own container.
|
|
97
|
-
*/
|
|
79
|
+
/** Boot only these modules and what they reach; omitted or empty mounts every enabled one. `AKAN_MODULES`. */
|
|
98
80
|
modules?: string[];
|
|
99
|
-
/**
|
|
100
|
-
* The inverse of `modules`: mount everything except these and whatever reaches them, in every child. Written
|
|
101
|
-
* for a lib the app depends on but does not serve — `server.ts` is generated from the dependency graph, so a
|
|
102
|
-
* lib cannot be dropped by editing it. Handed down as `AKAN_DISABLE_MODULES`, and applied after `modules`.
|
|
103
|
-
*/
|
|
81
|
+
/** Mount all but these and whatever reaches them, applied after `modules`. `AKAN_DISABLE_MODULES`. */
|
|
104
82
|
disableModules?: string[];
|
|
105
|
-
/**
|
|
106
|
-
* The same, by owning lib: every module the named libs registered stays out of every child, along with
|
|
107
|
-
* everything that reaches one. Handed down as `AKAN_DISABLE_LIBS`.
|
|
108
|
-
*/
|
|
83
|
+
/** Like `disableModules`, by owning lib. `AKAN_DISABLE_LIBS`. */
|
|
109
84
|
disableLibs?: string[];
|
|
110
|
-
/**
|
|
111
|
-
* Run the one replica in this process instead of spawning it — see `#startSolo`. Defaults on for a single
|
|
112
|
-
* traffic replica the environment configured, and off whenever `replica` is passed here, because code that
|
|
113
|
-
* states a topology is asking for the gateway that serves it. `AKAN_SOLO=false` turns it off; like
|
|
114
|
-
* `AKAN_SSR`, the env can only narrow, so it cannot force a gateway's replicas into one process.
|
|
115
|
-
*/
|
|
85
|
+
/** In-process replica; default on for one env-set traffic replica, off if `replica` is passed or AKAN_SOLO=false. */
|
|
116
86
|
solo?: boolean;
|
|
117
87
|
}
|
|
118
88
|
|
|
@@ -124,16 +94,13 @@ interface AkanReplicaConfig {
|
|
|
124
94
|
value: string;
|
|
125
95
|
}
|
|
126
96
|
|
|
127
|
-
/** Gateway/orchestrator that starts Akan child servers and proxies HTTP/WebSocket traffic. */
|
|
128
97
|
export class AkanApp {
|
|
129
98
|
static readonly #childRestartBaseDelayMs = 1_000;
|
|
130
99
|
static readonly #childRestartMaxDelayMs = 30_000;
|
|
131
100
|
static readonly #childRestartGraceMs = 5_000;
|
|
132
|
-
/** In dev, stop restarting a replica that never boots after this many consecutive failures. */
|
|
133
101
|
static readonly #devMaxChildBootFailures = 3;
|
|
134
102
|
|
|
135
103
|
readonly logger = new Logger("AkanApp");
|
|
136
|
-
/** Hosted by `akan start`: crash loops should yield to the dev host, which restarts on file edits. */
|
|
137
104
|
readonly #devHosted = process.env.AKAN_COMMAND_TYPE === "start";
|
|
138
105
|
readonly #healthTimeoutMs = AkanApp.#parseHealthTimeoutMs();
|
|
139
106
|
readonly #upstreamWaitMs = AkanApp.#parseUpstreamWaitMs();
|
|
@@ -149,7 +116,6 @@ export class AkanApp {
|
|
|
149
116
|
readonly #openapi?: boolean;
|
|
150
117
|
readonly #prefix: string;
|
|
151
118
|
readonly #websocketPrefix: string;
|
|
152
|
-
/** The gateway hands `/_akan/client|styles|fonts` straight off disk, so it needs the same answer its children do. */
|
|
153
119
|
readonly #web = getWebConfigFromEnv();
|
|
154
120
|
readonly #modules: string[];
|
|
155
121
|
readonly #disableModules: string[];
|
|
@@ -157,7 +123,7 @@ export class AkanApp {
|
|
|
157
123
|
readonly #solo: boolean;
|
|
158
124
|
readonly #children = new Map<number, ChildState>();
|
|
159
125
|
readonly #roomChildren = new Map<string, Set<number>>();
|
|
160
|
-
readonly #childRooms = new Map<number, Set<string
|
|
126
|
+
readonly #childRooms = new Map<number, Map<string, Set<string>>>();
|
|
161
127
|
readonly #socketRooms = new Map<string, { childIdx: number; rooms: Set<string> }>();
|
|
162
128
|
#nextBuilderReqId = 1;
|
|
163
129
|
readonly #builderReqMap = new Map<number, { childIdx: number; childLocalId: number }>();
|
|
@@ -168,11 +134,11 @@ export class AkanApp {
|
|
|
168
134
|
#healthTimer: Timer | null = null;
|
|
169
135
|
#metricsTimer: Timer | null = null;
|
|
170
136
|
#logWriter: RotatingLogWriter | null = null;
|
|
171
|
-
#
|
|
137
|
+
#detachFileLog: (() => void) | null = null;
|
|
172
138
|
#logHub: LogHub | null = null;
|
|
173
139
|
#logControl: LogControlSocket | null = null;
|
|
174
|
-
#hubFileSink: HubFileSink | null = null;
|
|
175
140
|
#logStream: LogStreamRoute | null = null;
|
|
141
|
+
#ops: OpsRoute | null = null;
|
|
176
142
|
static readonly #ansiPattern = new RegExp(`${String.fromCharCode(27)}\\[[0-?]*[ -/]*[@-~]`, "g");
|
|
177
143
|
#gatewayMetrics: AkanMetricsReport = {};
|
|
178
144
|
#proxyHopCount = 0;
|
|
@@ -201,15 +167,6 @@ export class AkanApp {
|
|
|
201
167
|
this.#logHub = LogHub.attach();
|
|
202
168
|
}
|
|
203
169
|
|
|
204
|
-
/**
|
|
205
|
-
* One replica that serves traffic means there is nothing to balance and nothing to fan pubsub out to, so the
|
|
206
|
-
* gateway is a second Bun runtime and a proxy hop in front of the only server there is. Measured on
|
|
207
|
-
* `apps/akan`: 28MB of RSS and half the requests per second.
|
|
208
|
-
*
|
|
209
|
-
* A batch-only replica is excluded because it never listens — keeping the gateway is what leaves something
|
|
210
|
-
* bound to answer `/_akan/app/health`. `akan start` is excluded because the gateway is also the dev host's
|
|
211
|
-
* builder relay, its crash page, and what holds the port across a child restart.
|
|
212
|
-
*/
|
|
213
170
|
static #resolveSolo(options: AkanAppOptions, replica: AkanReplicaConfig) {
|
|
214
171
|
if (options.solo !== undefined) return options.solo;
|
|
215
172
|
if (process.env.AKAN_SOLO === "false" || process.env.AKAN_SOLO === "0") return false;
|
|
@@ -229,9 +186,9 @@ export class AkanApp {
|
|
|
229
186
|
const configured = value ?? process.env.AKAN_REPLICA;
|
|
230
187
|
const raw = String(configured ?? "0,0,1").trim();
|
|
231
188
|
const [federationRaw, batchRaw, allRaw] = raw.split(",");
|
|
232
|
-
const federation = AkanApp.#parseReplicaCount(federationRaw,
|
|
233
|
-
const batch = AkanApp.#parseReplicaCount(batchRaw,
|
|
234
|
-
const all = AkanApp.#parseReplicaCount(allRaw, configured == null ? 1 : 0
|
|
189
|
+
const federation = AkanApp.#parseReplicaCount(federationRaw, 0);
|
|
190
|
+
const batch = AkanApp.#parseReplicaCount(batchRaw, 0);
|
|
191
|
+
const all = AkanApp.#parseReplicaCount(allRaw, configured == null ? 1 : 0);
|
|
235
192
|
const normalizedAll = federation + batch + all > 0 ? all : 1;
|
|
236
193
|
return {
|
|
237
194
|
federation,
|
|
@@ -242,18 +199,11 @@ export class AkanApp {
|
|
|
242
199
|
};
|
|
243
200
|
}
|
|
244
201
|
|
|
245
|
-
static #parseReplicaCount(value: string | undefined, fallback: number
|
|
202
|
+
static #parseReplicaCount(value: string | undefined, fallback: number) {
|
|
246
203
|
const parsed = Number.parseInt(value ?? "", 10);
|
|
247
|
-
|
|
248
|
-
return Math.max(min, parsed);
|
|
204
|
+
return Number.isFinite(parsed) ? Math.max(0, parsed) : fallback;
|
|
249
205
|
}
|
|
250
206
|
|
|
251
|
-
/**
|
|
252
|
-
* The command that started this gateway outranks an inherited `NODE_ENV`: the command is a statement about
|
|
253
|
-
* this run, while the env var can arrive from a shell export, a CI image, or the workspace `.env` Bun loads
|
|
254
|
-
* on its own. Handing a dev child `NODE_ENV=production` makes it serve from the production route cache and
|
|
255
|
-
* throw on every route, since only `akan build` writes the routes manifest that cache expects.
|
|
256
|
-
*/
|
|
257
207
|
static #defaultChildNodeEnv() {
|
|
258
208
|
if (process.env.AKAN_COMMAND_TYPE === "start") return "development";
|
|
259
209
|
if (process.env.AKAN_COMMAND_TYPE === "build") return "production";
|
|
@@ -261,31 +211,18 @@ export class AkanApp {
|
|
|
261
211
|
return Bun.main.endsWith(".js") ? "production" : "development";
|
|
262
212
|
}
|
|
263
213
|
|
|
264
|
-
/**
|
|
265
|
-
* Dev builds and first-touch transpiles can stall a child's event loop well past the production
|
|
266
|
-
* pong budget, so `akan start` runs with a wider timeout to avoid restarting healthy replicas.
|
|
267
|
-
*/
|
|
268
214
|
static #parseHealthTimeoutMs() {
|
|
269
215
|
const configured = Number(process.env.AKAN_HEALTH_TIMEOUT_MS);
|
|
270
216
|
if (Number.isFinite(configured) && configured > 0) return configured;
|
|
271
217
|
return process.env.AKAN_COMMAND_TYPE === "start" ? 15_000 : 5_000;
|
|
272
218
|
}
|
|
273
219
|
|
|
274
|
-
/**
|
|
275
|
-
* How long a request waits for a replica that is booting or restarting before the gateway answers
|
|
276
|
-
* 503. Dev pays first-touch transpiles on the boot path, so it gets the wider budget; `0` restores
|
|
277
|
-
* the old fail-immediately behavior.
|
|
278
|
-
*/
|
|
279
220
|
static #parseUpstreamWaitMs() {
|
|
280
221
|
const configured = Number(process.env.AKAN_UPSTREAM_WAIT_MS);
|
|
281
222
|
if (Number.isFinite(configured) && configured >= 0) return configured;
|
|
282
223
|
return process.env.AKAN_COMMAND_TYPE === "start" ? 15_000 : 5_000;
|
|
283
224
|
}
|
|
284
225
|
|
|
285
|
-
/**
|
|
286
|
-
* Must exceed the child's own shutdown timeout (see `AkanServer.#defaultShutdownTimeoutMs`) so
|
|
287
|
-
* children always get to exit on their own before this gateway stops waiting.
|
|
288
|
-
*/
|
|
289
226
|
static #childShutdownWaitMs() {
|
|
290
227
|
const configured = Number(process.env.AKAN_CHILD_SHUTDOWN_WAIT_MS);
|
|
291
228
|
if (Number.isFinite(configured) && configured > 0) return configured;
|
|
@@ -293,11 +230,16 @@ export class AkanApp {
|
|
|
293
230
|
}
|
|
294
231
|
|
|
295
232
|
async start() {
|
|
233
|
+
if (process.argv[2] === "ops") {
|
|
234
|
+
const { OpsCommand } = await import("./ops/opsCommand");
|
|
235
|
+
process.exit(await OpsCommand.run(process.argv.slice(3)));
|
|
236
|
+
}
|
|
296
237
|
if (this.#solo) return await this.#startSolo();
|
|
297
238
|
Logger.role = "gateway";
|
|
298
239
|
await this.#prepareRuntimeDir();
|
|
299
240
|
await this.#startLogHub();
|
|
300
241
|
this.#startFileLogging();
|
|
242
|
+
await this.#startOps();
|
|
301
243
|
for (let idx = 0; idx < this.#replica.total; idx++) this.#spawn(idx);
|
|
302
244
|
try {
|
|
303
245
|
this.#listen();
|
|
@@ -312,37 +254,22 @@ export class AkanApp {
|
|
|
312
254
|
}
|
|
313
255
|
this.#snapshotTimer = setInterval(() => this.#requestRoomSnapshots(), 30_000);
|
|
314
256
|
this.#healthTimer = setInterval(() => this.#checkHealth(), 2_000);
|
|
315
|
-
this.#
|
|
257
|
+
this.#metricsTimer ??= ProcessMetricsCollector.startReporting(() => this.#reportMetrics());
|
|
316
258
|
process.on("message", (message) => this.#handleHostMessage(message as BuilderMessage));
|
|
317
259
|
process.on("disconnect", () => this.#handleHostDisconnect());
|
|
318
260
|
process.on("SIGINT", () => this.#handleShutdownSignal("SIGINT"));
|
|
319
261
|
process.on("SIGTERM", () => this.#handleShutdownSignal("SIGTERM"));
|
|
320
262
|
await new Promise<void>((resolve) => {
|
|
321
|
-
|
|
322
263
|
this.#resolveStopped = resolve;
|
|
323
264
|
});
|
|
324
265
|
}
|
|
325
266
|
|
|
326
267
|
async #startSolo() {
|
|
327
268
|
const role = this.#getRole(0);
|
|
328
|
-
|
|
329
|
-
Object.assign(process.env, {
|
|
330
|
-
PORT: String(this.#port),
|
|
331
|
-
NODE_ENV: AkanApp.#defaultChildNodeEnv(),
|
|
332
|
-
AKAN_REPLICA: this.#replica.value,
|
|
333
|
-
AKAN_REPLICA_IDX: "0",
|
|
334
|
-
AKAN_APP_DIR: path.dirname(this.#serverPath),
|
|
335
|
-
SERVER_MODE: role,
|
|
336
|
-
AKAN_API_PREFIX: this.#prefix,
|
|
337
|
-
AKAN_WS_PREFIX: this.#websocketPrefix,
|
|
338
|
-
...(this.#openapi === undefined ? {} : { AKAN_OPENAPI: this.#openapi ? "true" : "false" }),
|
|
339
|
-
...(this.#modules.length ? { AKAN_MODULES: this.#modules.join(",") } : {}),
|
|
340
|
-
...(this.#disableModules.length ? { AKAN_DISABLE_MODULES: this.#disableModules.join(",") } : {}),
|
|
341
|
-
...(this.#disableLibs.length ? { AKAN_DISABLE_LIBS: this.#disableLibs.join(",") } : {}),
|
|
342
|
-
});
|
|
343
|
-
|
|
344
|
-
resetEnvCache();
|
|
345
269
|
|
|
270
|
+
Object.assign(process.env, this.#childEnv(0, role));
|
|
271
|
+
|
|
272
|
+
resetEnvCache();
|
|
346
273
|
this.logger.info(`Starting ${role} replica in this process (solo); set AKAN_SOLO=false for the gateway`);
|
|
347
274
|
const mod = (await import(this.#serverPath)) as { server?: SoloServer; app?: SoloServer };
|
|
348
275
|
const server = mod.server ?? mod.app;
|
|
@@ -353,32 +280,22 @@ export class AkanApp {
|
|
|
353
280
|
async stop(signal = "SIGTERM") {
|
|
354
281
|
if (this.#stopping) return;
|
|
355
282
|
this.#stopping = true;
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
if (this.#healthTimer) {
|
|
361
|
-
clearInterval(this.#healthTimer);
|
|
362
|
-
this.#healthTimer = null;
|
|
363
|
-
}
|
|
364
|
-
if (this.#metricsTimer) {
|
|
365
|
-
clearInterval(this.#metricsTimer);
|
|
366
|
-
this.#metricsTimer = null;
|
|
367
|
-
}
|
|
283
|
+
for (const timer of [this.#snapshotTimer, this.#healthTimer, this.#metricsTimer]) if (timer) clearInterval(timer);
|
|
284
|
+
this.#snapshotTimer = null;
|
|
285
|
+
this.#healthTimer = null;
|
|
286
|
+
this.#metricsTimer = null;
|
|
368
287
|
this.#server?.stop(true);
|
|
369
288
|
this.#server = null;
|
|
370
289
|
for (const child of this.#children.values()) {
|
|
371
|
-
if (child.restartTimer)
|
|
372
|
-
|
|
373
|
-
child.restartTimer = null;
|
|
374
|
-
}
|
|
290
|
+
if (child.restartTimer) clearTimeout(child.restartTimer);
|
|
291
|
+
child.restartTimer = null;
|
|
375
292
|
this.#sendToChild(child, { type: "shutdown", signal } satisfies AkanIpcMessage);
|
|
376
293
|
}
|
|
377
294
|
await Promise.race([
|
|
378
295
|
Promise.all([...this.#children.values()].map((child) => child.proc.exited.catch(() => undefined))),
|
|
379
296
|
new Promise((resolve) => setTimeout(resolve, AkanApp.#childShutdownWaitMs())),
|
|
380
297
|
]);
|
|
381
|
-
|
|
298
|
+
|
|
382
299
|
const stragglers = [...this.#children.values()].filter((child) => !child.proc.killed);
|
|
383
300
|
for (const child of stragglers) child.proc.kill("SIGKILL");
|
|
384
301
|
await Promise.all(stragglers.map((child) => child.proc.exited.catch(() => undefined)));
|
|
@@ -399,10 +316,6 @@ export class AkanApp {
|
|
|
399
316
|
});
|
|
400
317
|
}
|
|
401
318
|
|
|
402
|
-
/**
|
|
403
|
-
* The IPC channel closes when the dev host dies (including SIGKILL). Exiting takes the children
|
|
404
|
-
* down too, so a dead host never strands a gateway tree that would block the next `akan start`.
|
|
405
|
-
*/
|
|
406
319
|
#handleHostDisconnect() {
|
|
407
320
|
if (this.#stopping) return;
|
|
408
321
|
this.logger.warn("Host IPC channel closed; shutting down gateway and children");
|
|
@@ -414,27 +327,16 @@ export class AkanApp {
|
|
|
414
327
|
#spawn(idx: number) {
|
|
415
328
|
const role = this.#getRole(idx);
|
|
416
329
|
const upstream = this.#getChildUpstream(idx, role);
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
proc = Bun.spawn(["bun", "-e", childCode], {
|
|
330
|
+
|
|
331
|
+
const childCode = `import(${JSON.stringify(path.resolve(this.#serverPath))}).then((mod)=>{ const server = mod.server ?? mod.app; if (!server?.start) throw new Error("server.ts must export server or app with start()"); return server.start({ listen: process.env.SERVER_MODE !== "batch" }); }).catch((error)=>{ const exit = () => process.exit(1); setTimeout(exit, 2000); if (!process.send) return exit(); process.send({ type: "error", message: error instanceof Error ? error.message : String(error), stack: error instanceof Error ? error.stack : undefined, pid: process.pid }, undefined, undefined, exit); });`;
|
|
332
|
+
const proc: Bun.Subprocess<"ignore", "pipe", "pipe"> = Bun.spawn(["bun", "-e", childCode], {
|
|
420
333
|
cwd: process.cwd(),
|
|
421
334
|
env: {
|
|
422
335
|
...process.env,
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
NODE_ENV: AkanApp.#defaultChildNodeEnv(),
|
|
426
|
-
AKAN_REPLICA: this.#replica.value,
|
|
427
|
-
AKAN_REPLICA_IDX: String(idx),
|
|
428
|
-
AKAN_APP_DIR: path.dirname(this.#serverPath),
|
|
429
|
-
SERVER_MODE: role,
|
|
336
|
+
|
|
337
|
+
...this.#childEnv(idx, role),
|
|
430
338
|
AKAN_CHILD_SOCKET: upstream.http.socketPath,
|
|
431
339
|
AKAN_CHILD_WS_PORT: upstream.ws ? String(upstream.ws.port) : "",
|
|
432
|
-
AKAN_API_PREFIX: this.#prefix,
|
|
433
|
-
AKAN_WS_PREFIX: this.#websocketPrefix,
|
|
434
|
-
...(this.#openapi === undefined ? {} : { AKAN_OPENAPI: this.#openapi ? "true" : "false" }),
|
|
435
|
-
...(this.#modules.length ? { AKAN_MODULES: this.#modules.join(",") } : {}),
|
|
436
|
-
...(this.#disableModules.length ? { AKAN_DISABLE_MODULES: this.#disableModules.join(",") } : {}),
|
|
437
|
-
...(this.#disableLibs.length ? { AKAN_DISABLE_LIBS: this.#disableLibs.join(",") } : {}),
|
|
438
340
|
},
|
|
439
341
|
ipc: (message) => this.#handleMessage(idx, message as AkanIpcMessage, proc),
|
|
440
342
|
stdout: "pipe",
|
|
@@ -457,7 +359,7 @@ export class AkanApp {
|
|
|
457
359
|
lastRestartAt: previous?.lastRestartAt,
|
|
458
360
|
lastRestartReason: previous?.lastRestartReason,
|
|
459
361
|
});
|
|
460
|
-
this.#
|
|
362
|
+
this.#federationChildCache = null;
|
|
461
363
|
const output = new ChildOutputReader({
|
|
462
364
|
onLine: (line) => this.#writeChildLine(idx, role, proc.pid, "stdout", line),
|
|
463
365
|
onBlock: (lines) => this.#writeChildStderrBlock(idx, role, proc.pid, lines),
|
|
@@ -467,13 +369,30 @@ export class AkanApp {
|
|
|
467
369
|
proc.exited.then((code) => this.#handleChildExit(idx, proc, code));
|
|
468
370
|
}
|
|
469
371
|
|
|
372
|
+
#childEnv(idx: number, role: AkanChildRole) {
|
|
373
|
+
return {
|
|
374
|
+
PORT: String(this.#port),
|
|
375
|
+
NODE_ENV: AkanApp.#defaultChildNodeEnv(),
|
|
376
|
+
AKAN_REPLICA: this.#replica.value,
|
|
377
|
+
AKAN_REPLICA_IDX: String(idx),
|
|
378
|
+
AKAN_APP_DIR: path.dirname(this.#serverPath),
|
|
379
|
+
SERVER_MODE: role,
|
|
380
|
+
AKAN_API_PREFIX: this.#prefix,
|
|
381
|
+
AKAN_WS_PREFIX: this.#websocketPrefix,
|
|
382
|
+
...(this.#openapi === undefined ? {} : { AKAN_OPENAPI: this.#openapi ? "true" : "false" }),
|
|
383
|
+
...(this.#modules.length ? { AKAN_MODULES: this.#modules.join(",") } : {}),
|
|
384
|
+
...(this.#disableModules.length ? { AKAN_DISABLE_MODULES: this.#disableModules.join(",") } : {}),
|
|
385
|
+
...(this.#disableLibs.length ? { AKAN_DISABLE_LIBS: this.#disableLibs.join(",") } : {}),
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
|
|
470
389
|
#handleChildExit(idx: number, proc: Bun.Subprocess<"ignore", "pipe", "pipe">, code: number | null) {
|
|
471
390
|
const child = this.#children.get(idx);
|
|
472
391
|
if (!child || child.proc !== proc) return;
|
|
473
392
|
if (child.status === "crashed") return;
|
|
474
393
|
child.status = "exited";
|
|
475
394
|
child.lastExitCode = code;
|
|
476
|
-
this.#
|
|
395
|
+
this.#federationChildCache = null;
|
|
477
396
|
this.#removeChildRooms(idx);
|
|
478
397
|
if (this.#stopping) return;
|
|
479
398
|
void this.#scheduleChildRestart(child, proc, `exit:${code ?? "unknown"}`);
|
|
@@ -497,7 +416,7 @@ export class AkanApp {
|
|
|
497
416
|
child.upstream = undefined;
|
|
498
417
|
child.wsUpstream = undefined;
|
|
499
418
|
child.healthPath = undefined;
|
|
500
|
-
this.#
|
|
419
|
+
this.#federationChildCache = null;
|
|
501
420
|
child.lastRestartReason = reason;
|
|
502
421
|
child.lastRestartAt = Date.now();
|
|
503
422
|
this.#removeChildRooms(child.idx);
|
|
@@ -556,10 +475,6 @@ export class AkanApp {
|
|
|
556
475
|
this.#spawn(idx);
|
|
557
476
|
}
|
|
558
477
|
|
|
559
|
-
/**
|
|
560
|
-
* Dev-only terminal state: the same broken code fails every boot, so retrying is pure churn.
|
|
561
|
-
* The dev host replaces this whole gateway on the next server-side edit, which clears the state.
|
|
562
|
-
*/
|
|
563
478
|
#markChildCrashed(child: ChildState, reason: string) {
|
|
564
479
|
|
|
565
480
|
if (child.status === "crashed") return;
|
|
@@ -570,7 +485,7 @@ export class AkanApp {
|
|
|
570
485
|
child.wsUpstream = undefined;
|
|
571
486
|
child.healthPath = undefined;
|
|
572
487
|
child.lastRestartReason = reason;
|
|
573
|
-
this.#
|
|
488
|
+
this.#federationChildCache = null;
|
|
574
489
|
this.#removeChildRooms(child.idx);
|
|
575
490
|
const attempts = child.restartAttempts + 1;
|
|
576
491
|
const detail = child.lastErrorMessage ?? reason;
|
|
@@ -579,7 +494,6 @@ export class AkanApp {
|
|
|
579
494
|
this.#reportBackendBuildStatus({ ok: false, message });
|
|
580
495
|
}
|
|
581
496
|
|
|
582
|
-
/** Forwards a backend-phase build status to the dev host so failures reach the HMR overlay. */
|
|
583
497
|
#reportBackendBuildStatus({ ok, message }: { ok: boolean; message: string }) {
|
|
584
498
|
process.send?.({
|
|
585
499
|
type: "build-status",
|
|
@@ -593,9 +507,7 @@ export class AkanApp {
|
|
|
593
507
|
|
|
594
508
|
async #stopChildForRestart(child: ChildState, proc: Bun.Subprocess<"ignore", "pipe", "pipe">, reason: string) {
|
|
595
509
|
if (reason.startsWith("exit:") || proc.killed) return;
|
|
596
|
-
|
|
597
|
-
this.#sendToChild(child, { type: "shutdown", signal: reason } satisfies AkanIpcMessage);
|
|
598
|
-
}
|
|
510
|
+
this.#sendToChild(child, { type: "shutdown", signal: reason } satisfies AkanIpcMessage);
|
|
599
511
|
const result = await Promise.race([
|
|
600
512
|
proc.exited.then(() => "exited" as const).catch(() => "exited" as const),
|
|
601
513
|
new Promise<"timeout">((resolve) => setTimeout(() => resolve("timeout"), AkanApp.#childRestartGraceMs)),
|
|
@@ -609,7 +521,7 @@ export class AkanApp {
|
|
|
609
521
|
|
|
610
522
|
async #prepareRuntimeDir() {
|
|
611
523
|
await mkdir(this.#runtimeDir, { recursive: true });
|
|
612
|
-
|
|
524
|
+
|
|
613
525
|
const entries = await readdir(this.#runtimeDir).catch(() => []);
|
|
614
526
|
await Promise.all(
|
|
615
527
|
entries
|
|
@@ -628,44 +540,31 @@ export class AkanApp {
|
|
|
628
540
|
|
|
629
541
|
#startFileLogging() {
|
|
630
542
|
this.#logWriter = RotatingLogWriter.fromRuntimeDir(this.#runtimeDir);
|
|
631
|
-
if (
|
|
632
|
-
if (this.#logHub && Logger.isNdjson) {
|
|
633
|
-
this.#hubFileSink = new HubFileSink(this.#logHub, this.#logWriter, {
|
|
634
|
-
minSev: logSeverity[Logger.fileLevel],
|
|
635
|
-
json: Logger.format === "ndjson-only",
|
|
636
|
-
});
|
|
637
|
-
return;
|
|
638
|
-
}
|
|
639
|
-
this.#removeLogSink = Logger.addSink((entry) => {
|
|
640
|
-
this.#logWriter?.write("gateway", entry.plainMessage);
|
|
641
|
-
});
|
|
543
|
+
if (this.#logWriter) this.#detachFileLog = HubFileSink.attach(this.#logWriter, this.#logHub, "gateway");
|
|
642
544
|
}
|
|
643
545
|
|
|
644
546
|
async #stopFileLogging() {
|
|
645
|
-
this.#
|
|
646
|
-
this.#
|
|
647
|
-
this.#hubFileSink?.close();
|
|
648
|
-
this.#hubFileSink = null;
|
|
547
|
+
this.#detachFileLog?.();
|
|
548
|
+
this.#detachFileLog = null;
|
|
649
549
|
const writer = this.#logWriter;
|
|
650
550
|
this.#logWriter = null;
|
|
651
551
|
await writer?.close();
|
|
652
552
|
}
|
|
653
553
|
|
|
654
|
-
/** The journal every child forwards into, and the socket `akan logs` reads it from. Additive to the text file. */
|
|
655
554
|
async #startLogHub() {
|
|
656
555
|
const hub = LogHub.attach();
|
|
657
556
|
this.#logHub = hub;
|
|
658
557
|
hub.onFloorChange((minSev) => this.#fanoutToAll({ type: "log.level", minSev }));
|
|
659
558
|
this.#logStream = LogStreamRoute.fromEnv(() => this.#logHub);
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
)
|
|
668
|
-
}
|
|
559
|
+
this.#logControl = await LogControlSocket.open(hub, this.#runtimeDir, this.logger);
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
async #startOps() {
|
|
563
|
+
if (!process.env.AKAN_OPS_PUBLIC_KEY?.trim()) return;
|
|
564
|
+
const { OpsRoute } = await import("./ops/opsRoute");
|
|
565
|
+
this.#ops = OpsRoute.fromEnv({
|
|
566
|
+
detail: () => AppInfo.detail({ serverMode: "gateway", solo: false, replicaIdx: null }),
|
|
567
|
+
});
|
|
669
568
|
}
|
|
670
569
|
|
|
671
570
|
async #stopLogHub() {
|
|
@@ -701,6 +600,8 @@ export class AkanApp {
|
|
|
701
600
|
if (url.pathname === "/_akan/app/metrics") return Response.json(this.#getMetricsStatus());
|
|
702
601
|
if (url.pathname === LogStreamRoute.path && this.#logStream) return this.#logStream.handle(req);
|
|
703
602
|
if (url.pathname === "/_akan/bench/ping") return new Response("ok");
|
|
603
|
+
if (url.pathname === AppInfo.publicPath) return AppInfo.handlePublic();
|
|
604
|
+
if (this.#ops?.matches(url.pathname)) return await this.#ops.handle(req);
|
|
704
605
|
if (this.#isWebSocketPath(url.pathname)) return this.#upgradeWebSocket(req, server);
|
|
705
606
|
const assetResponse = await this.#serveImmutableArtifact(req, url);
|
|
706
607
|
if (assetResponse) return assetResponse;
|
|
@@ -711,48 +612,36 @@ export class AkanApp {
|
|
|
711
612
|
return pathname === `${this.#prefix}${this.#websocketPrefix}` || pathname === "/_akan/hmr";
|
|
712
613
|
}
|
|
713
614
|
|
|
615
|
+
static readonly #immutableArtifacts = [
|
|
616
|
+
{ prefix: "/_akan/client/", root: "client", strip: "/_akan/client/".length, type: "application/javascript" },
|
|
617
|
+
{ prefix: "/_akan/styles/", root: "", strip: "/_akan/".length, type: "text/css; charset=utf-8" },
|
|
618
|
+
{ prefix: "/_akan/fonts/", root: "", strip: "/_akan/".length, type: "font/woff2" },
|
|
619
|
+
] as const;
|
|
620
|
+
|
|
714
621
|
async #serveImmutableArtifact(req: Request, url: URL): Promise<Response | null> {
|
|
715
622
|
if (!this.#web.ssr) return null;
|
|
716
|
-
const
|
|
717
|
-
if (
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
contentType: file.type || "application/javascript",
|
|
727
|
-
cacheControl: "public, max-age=31536000, immutable",
|
|
728
|
-
});
|
|
729
|
-
}
|
|
730
|
-
|
|
731
|
-
for (const prefix of ["/_akan/styles/", "/_akan/fonts/"]) {
|
|
732
|
-
if (!url.pathname.startsWith(prefix)) continue;
|
|
733
|
-
const filePath = resolveStaticPath(this.#artifactDir, url.pathname.slice("/_akan/".length));
|
|
734
|
-
if (!filePath) return new Response("Not Found", { status: 404 });
|
|
735
|
-
const file = Bun.file(filePath);
|
|
736
|
-
if (!(await file.exists())) return new Response("Not Found", { status: 404 });
|
|
737
|
-
return this.#fileResponse(req, filePath, {
|
|
738
|
-
contentType: file.type || (prefix === "/_akan/styles/" ? "text/css; charset=utf-8" : "font/woff2"),
|
|
739
|
-
cacheControl: "public, max-age=31536000, immutable",
|
|
740
|
-
});
|
|
741
|
-
}
|
|
742
|
-
|
|
743
|
-
return null;
|
|
623
|
+
const artifact = AkanApp.#immutableArtifacts.find(({ prefix }) => url.pathname.startsWith(prefix));
|
|
624
|
+
if (!artifact) return null;
|
|
625
|
+
const filePath = resolveStaticPath(path.join(this.#artifactDir, artifact.root), url.pathname.slice(artifact.strip));
|
|
626
|
+
if (!filePath) return new Response("Not Found", { status: 404 });
|
|
627
|
+
const file = Bun.file(filePath);
|
|
628
|
+
if (!(await file.exists())) return new Response("Not Found", { status: 404 });
|
|
629
|
+
return this.#fileResponse(req, filePath, {
|
|
630
|
+
contentType: file.type || artifact.type,
|
|
631
|
+
cacheControl: "public, max-age=31536000, immutable",
|
|
632
|
+
});
|
|
744
633
|
}
|
|
745
634
|
|
|
746
635
|
#upgradeWebSocket(req: Request, server: Bun.Server<GatewayWsData>): Response | undefined {
|
|
747
636
|
const child = this.#pickFederationChild();
|
|
748
|
-
|
|
637
|
+
|
|
749
638
|
const upstream = child?.upstream ? (child.wsUpstream ?? this.#getChildUpstream(child.idx, child.role).ws) : null;
|
|
750
639
|
if (!child || !upstream) return new Response("No websocket upstream is ready", { status: 503 });
|
|
751
640
|
const url = new URL(req.url);
|
|
752
641
|
const upstreamWs = new WebSocket(`ws://${upstream.host}:${upstream.port}${url.pathname}${url.search}`, {
|
|
753
|
-
headers:
|
|
642
|
+
headers: makeAkanChildProxyHeaders(req, child.idx, server.requestIP(req)),
|
|
754
643
|
} as unknown as string[]);
|
|
755
|
-
|
|
644
|
+
|
|
756
645
|
const upgraded = server.upgrade(req, { data: { childIdx: child.idx, upstream: upstreamWs } });
|
|
757
646
|
if (!upgraded) {
|
|
758
647
|
upstreamWs.close();
|
|
@@ -854,7 +743,7 @@ export class AkanApp {
|
|
|
854
743
|
if (!child?.upstream || child.upstream.type !== "unix") return this.#respondWithUnavailable(req);
|
|
855
744
|
const url = new URL(req.url);
|
|
856
745
|
const upstreamUrl = `http://akan-child${url.pathname}${url.search}`;
|
|
857
|
-
const headers =
|
|
746
|
+
const headers = makeAkanChildProxyHeaders(req, child.idx, server.requestIP(req));
|
|
858
747
|
child.metrics.activeRequests = (child.metrics.activeRequests ?? 0) + 1;
|
|
859
748
|
child.metrics.totalRequests = (child.metrics.totalRequests ?? 0) + 1;
|
|
860
749
|
const traced = isTraceEnabled();
|
|
@@ -897,14 +786,6 @@ export class AkanApp {
|
|
|
897
786
|
return candidate.code === "FailedToOpenSocket" || String(candidate.message ?? "").includes("FailedToOpenSocket");
|
|
898
787
|
}
|
|
899
788
|
|
|
900
|
-
/**
|
|
901
|
-
* The socket opened and then died under us: the child crashed, or was recycled, while its response was still
|
|
902
|
-
* in flight. Distinct from `FailedToOpenSocket` — that one means the child was already gone when we dialled,
|
|
903
|
-
* and only that one implies the socket needs a restart, which the child's own exit handler schedules anyway.
|
|
904
|
-
* Rethrowing this instead reaches Bun as an unhandled route error, which answers 500 and prints the raw
|
|
905
|
-
* `TypeError` against whatever URL happened to be in flight — usually a browser background probe, which is
|
|
906
|
-
* how a dead child gets misread as a bug in the probed route.
|
|
907
|
-
*/
|
|
908
789
|
static #isUpstreamMidFlightClose(error: unknown): boolean {
|
|
909
790
|
if (!error || typeof error !== "object") return false;
|
|
910
791
|
const candidate = error as { code?: unknown; message?: unknown };
|
|
@@ -934,11 +815,6 @@ export class AkanApp {
|
|
|
934
815
|
});
|
|
935
816
|
}
|
|
936
817
|
|
|
937
|
-
/**
|
|
938
|
-
* A replica that is booting or restarting is normally back within a second or two, and a browser
|
|
939
|
-
* handed a 503 stays on that dead page until somebody reloads by hand — so a request waits for the
|
|
940
|
-
* upstream instead of failing at it. A dev crash loop is terminal, so it is answered immediately.
|
|
941
|
-
*/
|
|
942
818
|
async #pickReadyFederationChild(req: Request): Promise<ChildState | null> {
|
|
943
819
|
const ready = this.#pickFederationChild();
|
|
944
820
|
if (ready?.upstream) return ready;
|
|
@@ -952,7 +828,6 @@ export class AkanApp {
|
|
|
952
828
|
return null;
|
|
953
829
|
}
|
|
954
830
|
|
|
955
|
-
/** Dev-only terminal state: every traffic replica gave up booting. The detail is the boot error. */
|
|
956
831
|
#getCrashLoopDetail(): string | null {
|
|
957
832
|
if (!this.#devHosted) return null;
|
|
958
833
|
const trafficChildren = [...this.#children.values()].filter((child) => child.role !== "batch");
|
|
@@ -964,10 +839,6 @@ export class AkanApp {
|
|
|
964
839
|
);
|
|
965
840
|
}
|
|
966
841
|
|
|
967
|
-
/**
|
|
968
|
-
* Both states answer 503, so an ingress or CDN reads them exactly as before; the HTML body is what
|
|
969
|
-
* a browser navigation needs, since nothing on a bare-text 503 can bring the page back on its own.
|
|
970
|
-
*/
|
|
971
842
|
#respondWithUnavailable(req: Request): Response {
|
|
972
843
|
const crashDetail = this.#getCrashLoopDetail();
|
|
973
844
|
const page = crashDetail
|
|
@@ -992,10 +863,6 @@ export class AkanApp {
|
|
|
992
863
|
return AkanApp.#unavailableResponse(req, page.text);
|
|
993
864
|
}
|
|
994
865
|
|
|
995
|
-
/**
|
|
996
|
-
* An API caller asks for JSON, so it is answered with the payload `HttpClient` restores into an `Err` —
|
|
997
|
-
* a bare-text 503 reaches the browser as a JSON parse error naming the page body instead of the outage.
|
|
998
|
-
*/
|
|
999
866
|
static #unavailableResponse(req: Request, detail: string): Response {
|
|
1000
867
|
const headers = { "cache-control": "no-store" };
|
|
1001
868
|
if (!req.headers.get("accept")?.includes("application/json")) return new Response(detail, { status: 503, headers });
|
|
@@ -1050,10 +917,6 @@ export class AkanApp {
|
|
|
1050
917
|
return text.replace(/[&<>"']/g, (ch) => replacements[ch] ?? ch);
|
|
1051
918
|
}
|
|
1052
919
|
|
|
1053
|
-
/**
|
|
1054
|
-
* Gateway-observed upstream round-trip time. The pure proxy overhead is this value
|
|
1055
|
-
* minus the child handler time captured in the per-request trace.
|
|
1056
|
-
*/
|
|
1057
920
|
#recordProxyHop(durationMs: number) {
|
|
1058
921
|
this.#proxyHopCount += 1;
|
|
1059
922
|
this.#proxyHopSumMs += durationMs;
|
|
@@ -1062,7 +925,7 @@ export class AkanApp {
|
|
|
1062
925
|
|
|
1063
926
|
async #proxyResponse(req: Request, upstreamRes: Response): Promise<Response> {
|
|
1064
927
|
const headers = new Headers(upstreamRes.headers);
|
|
1065
|
-
|
|
928
|
+
|
|
1066
929
|
headers.delete("content-encoding");
|
|
1067
930
|
headers.delete("content-length");
|
|
1068
931
|
this.#rewriteInternalLocation(headers);
|
|
@@ -1071,7 +934,7 @@ export class AkanApp {
|
|
|
1071
934
|
statusText: upstreamRes.statusText,
|
|
1072
935
|
headers,
|
|
1073
936
|
});
|
|
1074
|
-
|
|
937
|
+
|
|
1075
938
|
return AkanApp.#isProxiedJson(headers) ? await compressResponse(req, proxied) : proxied;
|
|
1076
939
|
}
|
|
1077
940
|
|
|
@@ -1096,24 +959,9 @@ export class AkanApp {
|
|
|
1096
959
|
): Promise<Response> {
|
|
1097
960
|
const headers = new Headers({ "Content-Type": options.contentType });
|
|
1098
961
|
if (options.cacheControl) headers.set("Cache-Control", options.cacheControl);
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
headers.set("Content-Encoding", sidecar.encoding);
|
|
1103
|
-
headers.set("Content-Length", String(sidecar.bytes.byteLength));
|
|
1104
|
-
headers.set("Vary", "Accept-Encoding");
|
|
1105
|
-
return new Response(sidecar.bytes, { headers });
|
|
1106
|
-
}
|
|
1107
|
-
|
|
1108
|
-
return new Response(Bun.file(filePath).stream(), { headers });
|
|
1109
|
-
}
|
|
1110
|
-
|
|
1111
|
-
#makeProxyHeaders(req: Request, childIdx: number, server?: Bun.Server<GatewayWsData>) {
|
|
1112
|
-
return makeAkanChildProxyHeaders(req, childIdx, server?.requestIP(req));
|
|
1113
|
-
}
|
|
1114
|
-
|
|
1115
|
-
#invalidateFederationChildCache() {
|
|
1116
|
-
this.#federationChildCache = null;
|
|
962
|
+
headers.set("X-Content-Type-Options", "nosniff");
|
|
963
|
+
headers.set("Referrer-Policy", "strict-origin-when-cross-origin");
|
|
964
|
+
return await encodedFileResponse(req, filePath, options.contentType, headers);
|
|
1117
965
|
}
|
|
1118
966
|
|
|
1119
967
|
#pickFederationChild() {
|
|
@@ -1170,6 +1018,9 @@ export class AkanApp {
|
|
|
1170
1018
|
case "pubsub.snapshot":
|
|
1171
1019
|
this.#replaceRoomSnapshot(idx, message.rooms);
|
|
1172
1020
|
return;
|
|
1021
|
+
case "live.change":
|
|
1022
|
+
this.#fanoutLiveChange(idx, message);
|
|
1023
|
+
return;
|
|
1173
1024
|
case "metrics.report":
|
|
1174
1025
|
this.#updateMetrics(idx, message.metrics);
|
|
1175
1026
|
return;
|
|
@@ -1228,7 +1079,7 @@ export class AkanApp {
|
|
|
1228
1079
|
this.#sendToChild(child, { type: "log.level", minSev: this.#logHub.floor });
|
|
1229
1080
|
child.restartPending = false;
|
|
1230
1081
|
child.lastErrorMessage = undefined;
|
|
1231
|
-
this.#
|
|
1082
|
+
this.#federationChildCache = null;
|
|
1232
1083
|
|
|
1233
1084
|
const trafficChildren = [...this.#children.values()].filter((item) => item.role !== "batch");
|
|
1234
1085
|
if (child.role !== "batch" && trafficChildren.every((item) => item.ready)) {
|
|
@@ -1244,7 +1095,7 @@ export class AkanApp {
|
|
|
1244
1095
|
if (!child) return;
|
|
1245
1096
|
child.status = "healthy";
|
|
1246
1097
|
child.lastPongAtMono = performance.now();
|
|
1247
|
-
this.#
|
|
1098
|
+
this.#federationChildCache = null;
|
|
1248
1099
|
}
|
|
1249
1100
|
|
|
1250
1101
|
#deliverPubsub(originIdx: number, message: Extract<AkanIpcMessage, { type: "pubsub.publish" }>) {
|
|
@@ -1277,49 +1128,55 @@ export class AkanApp {
|
|
|
1277
1128
|
roomChildren.add(childIdx);
|
|
1278
1129
|
this.#roomChildren.set(roomId, roomChildren);
|
|
1279
1130
|
|
|
1280
|
-
const childRooms = this.#childRooms.get(childIdx) ?? new Set<string
|
|
1281
|
-
childRooms.
|
|
1131
|
+
const childRooms = this.#childRooms.get(childIdx) ?? new Map<string, Set<string>>();
|
|
1132
|
+
const roomSockets = childRooms.get(roomId) ?? new Set<string>();
|
|
1133
|
+
childRooms.set(roomId, roomSockets);
|
|
1282
1134
|
this.#childRooms.set(childIdx, childRooms);
|
|
1283
1135
|
|
|
1284
1136
|
if (socketId) {
|
|
1137
|
+
roomSockets.add(socketId);
|
|
1285
1138
|
const socketRooms = this.#socketRooms.get(socketId) ?? { childIdx, rooms: new Set<string>() };
|
|
1286
1139
|
socketRooms.rooms.add(roomId);
|
|
1287
1140
|
this.#socketRooms.set(socketId, socketRooms);
|
|
1288
1141
|
}
|
|
1289
1142
|
}
|
|
1290
1143
|
|
|
1291
|
-
#
|
|
1144
|
+
#leaveRoom(childIdx: number, roomId: string) {
|
|
1292
1145
|
const roomChildren = this.#roomChildren.get(roomId);
|
|
1293
1146
|
roomChildren?.delete(childIdx);
|
|
1294
1147
|
if (roomChildren?.size === 0) this.#roomChildren.delete(roomId);
|
|
1148
|
+
}
|
|
1295
1149
|
|
|
1150
|
+
#removeRoomMembership(childIdx: number, roomId: string, socketId?: string) {
|
|
1296
1151
|
const childRooms = this.#childRooms.get(childIdx);
|
|
1152
|
+
const roomSockets = childRooms?.get(roomId);
|
|
1153
|
+
if (socketId) {
|
|
1154
|
+
this.#forgetSocketRoom(socketId, roomId);
|
|
1155
|
+
roomSockets?.delete(socketId);
|
|
1156
|
+
if (roomSockets?.size) return;
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
for (const staleSocketId of roomSockets ?? []) this.#forgetSocketRoom(staleSocketId, roomId);
|
|
1160
|
+
this.#leaveRoom(childIdx, roomId);
|
|
1297
1161
|
childRooms?.delete(roomId);
|
|
1298
1162
|
if (childRooms?.size === 0) this.#childRooms.delete(childIdx);
|
|
1163
|
+
}
|
|
1299
1164
|
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
}
|
|
1165
|
+
#forgetSocketRoom(socketId: string, roomId: string) {
|
|
1166
|
+
const socketRooms = this.#socketRooms.get(socketId);
|
|
1167
|
+
socketRooms?.rooms.delete(roomId);
|
|
1168
|
+
if (!socketRooms || socketRooms.rooms.size === 0) this.#socketRooms.delete(socketId);
|
|
1305
1169
|
}
|
|
1306
1170
|
|
|
1307
1171
|
#replaceRoomSnapshot(childIdx: number, rooms: string[]) {
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
}
|
|
1313
|
-
this.#childRooms.set(childIdx, new Set());
|
|
1314
|
-
for (const roomId of rooms) this.#addRoomMembership(childIdx, roomId);
|
|
1172
|
+
const held = new Set(rooms);
|
|
1173
|
+
for (const roomId of [...(this.#childRooms.get(childIdx)?.keys() ?? [])])
|
|
1174
|
+
if (!held.has(roomId)) this.#removeRoomMembership(childIdx, roomId);
|
|
1175
|
+
for (const roomId of held) this.#addRoomMembership(childIdx, roomId);
|
|
1315
1176
|
}
|
|
1316
1177
|
|
|
1317
1178
|
#removeChildRooms(childIdx: number) {
|
|
1318
|
-
for (const roomId of this.#childRooms.get(childIdx) ?? [])
|
|
1319
|
-
const roomChildren = this.#roomChildren.get(roomId);
|
|
1320
|
-
roomChildren?.delete(childIdx);
|
|
1321
|
-
if (roomChildren?.size === 0) this.#roomChildren.delete(roomId);
|
|
1322
|
-
}
|
|
1179
|
+
for (const roomId of this.#childRooms.get(childIdx)?.keys() ?? []) this.#leaveRoom(childIdx, roomId);
|
|
1323
1180
|
this.#childRooms.delete(childIdx);
|
|
1324
1181
|
for (const [socketId, socket] of this.#socketRooms.entries()) {
|
|
1325
1182
|
if (socket.childIdx === childIdx) this.#socketRooms.delete(socketId);
|
|
@@ -1332,15 +1189,6 @@ export class AkanApp {
|
|
|
1332
1189
|
child.metrics = { ...child.metrics, pid: metrics.pid ?? child.pid, ...metrics };
|
|
1333
1190
|
}
|
|
1334
1191
|
|
|
1335
|
-
#startMetricsReporting() {
|
|
1336
|
-
if (this.#metricsTimer) return;
|
|
1337
|
-
const report = () => {
|
|
1338
|
-
void this.#reportMetrics();
|
|
1339
|
-
};
|
|
1340
|
-
report();
|
|
1341
|
-
this.#metricsTimer = setInterval(report, ProcessMetricsCollector.parseMemoryLogIntervalMs());
|
|
1342
|
-
}
|
|
1343
|
-
|
|
1344
1192
|
async #reportMetrics() {
|
|
1345
1193
|
this.#gatewayMetrics = await ProcessMetricsCollector.collect({ role: "gateway" });
|
|
1346
1194
|
if (process.env.AKAN_MEMORY_LOG !== "1") return;
|
|
@@ -1376,7 +1224,7 @@ export class AkanApp {
|
|
|
1376
1224
|
if (this.#isChildUnavailable(child)) continue;
|
|
1377
1225
|
if (child.lastPongAtMono && nowMono - child.lastPongAtMono > this.#healthTimeoutMs) {
|
|
1378
1226
|
child.status = "unhealthy";
|
|
1379
|
-
this.#
|
|
1227
|
+
this.#federationChildCache = null;
|
|
1380
1228
|
void this.#scheduleChildRestart(child, child.proc, "health-timeout");
|
|
1381
1229
|
continue;
|
|
1382
1230
|
}
|
|
@@ -1387,7 +1235,7 @@ export class AkanApp {
|
|
|
1387
1235
|
} satisfies AkanIpcMessage);
|
|
1388
1236
|
if (!sent) {
|
|
1389
1237
|
child.status = "unhealthy";
|
|
1390
|
-
this.#
|
|
1238
|
+
this.#federationChildCache = null;
|
|
1391
1239
|
void this.#scheduleChildRestart(child, child.proc, "health-send-failed");
|
|
1392
1240
|
}
|
|
1393
1241
|
}
|
|
@@ -1422,6 +1270,11 @@ export class AkanApp {
|
|
|
1422
1270
|
for (const child of this.#children.values()) this.#sendToChild(child, message);
|
|
1423
1271
|
}
|
|
1424
1272
|
|
|
1273
|
+
#fanoutLiveChange(originIdx: number, message: Extract<AkanIpcMessage, { type: "live.change" }>) {
|
|
1274
|
+
for (const child of this.#children.values())
|
|
1275
|
+
if (child.idx !== originIdx && child.role !== "batch") this.#sendToChild(child, message);
|
|
1276
|
+
}
|
|
1277
|
+
|
|
1425
1278
|
#fanoutToBatch(message: AkanIpcMessage) {
|
|
1426
1279
|
for (const child of this.#children.values()) {
|
|
1427
1280
|
if (child.role === "batch" || child.role === "all") {
|
|
@@ -1457,10 +1310,6 @@ export class AkanApp {
|
|
|
1457
1310
|
this.#logWriter?.write(`${idx}-${role}`, AkanApp.#stripAnsi(prefixedLine));
|
|
1458
1311
|
}
|
|
1459
1312
|
|
|
1460
|
-
/**
|
|
1461
|
-
* In ndjson mode a stack trace is one record, and `AKAN_CHILD_STDERR` does not apply: the line that killed a
|
|
1462
|
-
* child is the one the collector must not miss.
|
|
1463
|
-
*/
|
|
1464
1313
|
#writeChildStderrBlock(idx: number, role: AkanChildRole, pid: number | null, lines: string[]) {
|
|
1465
1314
|
const text = lines.join("");
|
|
1466
1315
|
if (AkanApp.#isBenignRsdwConnectionClosedBlock(text)) return;
|