@abide/abide 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +607 -0
- package/LICENSE +21 -0
- package/README.md +154 -0
- package/bin/abide.ts +212 -0
- package/package.json +155 -0
- package/src/abideLsp.ts +211 -0
- package/src/abideModules.d.ts +8 -0
- package/src/abideResolverPlugin.ts +923 -0
- package/src/appEntry.ts +151 -0
- package/src/assets/app.html +12 -0
- package/src/build.ts +143 -0
- package/src/buildCli.ts +127 -0
- package/src/buildDisconnected.ts +118 -0
- package/src/bundleApp.ts +147 -0
- package/src/bundleDisconnectedEntry.ts +14 -0
- package/src/checkAbide.ts +77 -0
- package/src/cliEntry.ts +25 -0
- package/src/clientBuildPlugins.ts +33 -0
- package/src/clientEntry.ts +17 -0
- package/src/compile.ts +63 -0
- package/src/controlServerWorker.ts +426 -0
- package/src/devEntry.ts +250 -0
- package/src/discoveryEntry.ts +81 -0
- package/src/lib/bundle/BundleMenu.ts +12 -0
- package/src/lib/bundle/BundleMenuItem.ts +25 -0
- package/src/lib/bundle/BundleWindow.ts +37 -0
- package/src/lib/bundle/WEBVIEW_BUILD_REVISION.ts +9 -0
- package/src/lib/bundle/WEBVIEW_VERSION.ts +7 -0
- package/src/lib/bundle/bindConnectedFlag.ts +29 -0
- package/src/lib/bundle/bindRequestNavigate.ts +34 -0
- package/src/lib/bundle/buildWebviewLib.ts +111 -0
- package/src/lib/bundle/bundled.ts +35 -0
- package/src/lib/bundle/disconnected.abide +236 -0
- package/src/lib/bundle/disconnected.css +9 -0
- package/src/lib/bundle/ensureWebviewLib.ts +20 -0
- package/src/lib/bundle/exitWithParent.ts +28 -0
- package/src/lib/bundle/infoPlist.ts +46 -0
- package/src/lib/bundle/installDownloads.ts +24 -0
- package/src/lib/bundle/installMacMenu.ts +39 -0
- package/src/lib/bundle/listenLocalControlServer.ts +19 -0
- package/src/lib/bundle/native/abideMenu.mm +422 -0
- package/src/lib/bundle/native/webview.h +4557 -0
- package/src/lib/bundle/onMenu.ts +42 -0
- package/src/lib/bundle/openWebview.ts +104 -0
- package/src/lib/bundle/pngToIcns.ts +47 -0
- package/src/lib/bundle/probeAbideServer.ts +57 -0
- package/src/lib/bundle/resolveServerBinary.ts +12 -0
- package/src/lib/bundle/resolveWebviewLib.ts +53 -0
- package/src/lib/bundle/serverBinaryFilename.ts +8 -0
- package/src/lib/bundle/signMacApp.ts +37 -0
- package/src/lib/bundle/spawnEmbeddedServer.ts +64 -0
- package/src/lib/bundle/stableLocalPort.ts +19 -0
- package/src/lib/bundle/waitForServer.ts +23 -0
- package/src/lib/bundle/webviewCachePath.ts +23 -0
- package/src/lib/bundle/webviewLibName.ts +11 -0
- package/src/lib/cli/connectToServer.ts +23 -0
- package/src/lib/cli/createClient.ts +108 -0
- package/src/lib/cli/dispatchCommand.ts +71 -0
- package/src/lib/cli/loadEnvFromBinaryDir.ts +15 -0
- package/src/lib/cli/parseArgvForRpc.ts +100 -0
- package/src/lib/cli/printHelp.ts +119 -0
- package/src/lib/cli/printSessionHelp.ts +27 -0
- package/src/lib/cli/printSessionStatus.ts +21 -0
- package/src/lib/cli/printTrimmed.ts +8 -0
- package/src/lib/cli/printValue.ts +10 -0
- package/src/lib/cli/resolveCliTarget.ts +48 -0
- package/src/lib/cli/runCli.ts +176 -0
- package/src/lib/cli/runSession.ts +108 -0
- package/src/lib/cli/startLocalInstance.ts +14 -0
- package/src/lib/cli/tokenizeLine.ts +51 -0
- package/src/lib/cli/types/CliManifest.ts +9 -0
- package/src/lib/cli/types/CliManifestEntry.ts +17 -0
- package/src/lib/cli/types/CliTarget.ts +13 -0
- package/src/lib/mcp/annotationsForMethod.ts +29 -0
- package/src/lib/mcp/createMcpResourceServer.ts +102 -0
- package/src/lib/mcp/createMcpServer.ts +48 -0
- package/src/lib/mcp/dispatchMcpRequest.ts +138 -0
- package/src/lib/mcp/mcpResourceServerSlot.ts +18 -0
- package/src/lib/mcp/mcpSurface.ts +295 -0
- package/src/lib/mcp/toolResultFromResponse.ts +66 -0
- package/src/lib/mcp/types/JsonRpcRequest.ts +12 -0
- package/src/lib/mcp/types/JsonRpcResponse.ts +20 -0
- package/src/lib/mcp/types/McpResourceContents.ts +10 -0
- package/src/lib/mcp/types/McpResourceDescriptor.ts +6 -0
- package/src/lib/mcp/types/McpResourceServer.ts +12 -0
- package/src/lib/mcp/types/McpServer.ts +9 -0
- package/src/lib/mcp/types/McpServerOptions.ts +16 -0
- package/src/lib/server/AppModule.ts +47 -0
- package/src/lib/server/DELETE.ts +10 -0
- package/src/lib/server/GET.ts +10 -0
- package/src/lib/server/HEAD.ts +10 -0
- package/src/lib/server/PATCH.ts +10 -0
- package/src/lib/server/POST.ts +10 -0
- package/src/lib/server/PUT.ts +10 -0
- package/src/lib/server/agent.ts +86 -0
- package/src/lib/server/appDataDir.ts +16 -0
- package/src/lib/server/cli/buildEnvContent.ts +19 -0
- package/src/lib/server/cli/createTarGz.ts +77 -0
- package/src/lib/server/cli/handleCliDownload.ts +150 -0
- package/src/lib/server/cli/handleCliInstall.ts +37 -0
- package/src/lib/server/cli/installScript.ts +31 -0
- package/src/lib/server/cli/maxSourceMtime.ts +26 -0
- package/src/lib/server/cookies.ts +30 -0
- package/src/lib/server/env.ts +51 -0
- package/src/lib/server/error.ts +73 -0
- package/src/lib/server/json.ts +42 -0
- package/src/lib/server/jsonl.ts +47 -0
- package/src/lib/server/prompts/definePrompt.ts +21 -0
- package/src/lib/server/prompts/promptRegistry.ts +9 -0
- package/src/lib/server/prompts/registerPrompt.ts +6 -0
- package/src/lib/server/prompts/renderPromptTemplate.ts +17 -0
- package/src/lib/server/prompts/types/Prompt.ts +13 -0
- package/src/lib/server/prompts/types/PromptOptions.ts +12 -0
- package/src/lib/server/prompts/types/PromptRegistryEntry.ts +13 -0
- package/src/lib/server/prompts/types/PromptRoutes.ts +10 -0
- package/src/lib/server/reachable.ts +45 -0
- package/src/lib/server/redirect.ts +43 -0
- package/src/lib/server/request.ts +19 -0
- package/src/lib/server/rpc/defineVerb.ts +210 -0
- package/src/lib/server/rpc/dispatchVerbInProcess.ts +46 -0
- package/src/lib/server/rpc/findVerbByCommandName.ts +18 -0
- package/src/lib/server/rpc/parseArgs.ts +127 -0
- package/src/lib/server/rpc/readBodyWithinLimit.ts +44 -0
- package/src/lib/server/rpc/registerVerb.ts +6 -0
- package/src/lib/server/rpc/runWithVerbTimeout.ts +49 -0
- package/src/lib/server/rpc/types/RemoteHandler.ts +27 -0
- package/src/lib/server/rpc/types/RemoteRoutes.ts +13 -0
- package/src/lib/server/rpc/types/TypedResponse.ts +18 -0
- package/src/lib/server/rpc/types/VerbHelper.ts +87 -0
- package/src/lib/server/rpc/types/VerbRegistryEntry.ts +35 -0
- package/src/lib/server/rpc/unprocessed.ts +14 -0
- package/src/lib/server/rpc/verbRegistry.ts +11 -0
- package/src/lib/server/runtime/DEFAULT_PORT.ts +6 -0
- package/src/lib/server/runtime/DEV_READY_MESSAGE.ts +6 -0
- package/src/lib/server/runtime/DEV_REBUILD_MESSAGE.ts +4 -0
- package/src/lib/server/runtime/DEV_RELOAD_CLIENT_SCRIPT.ts +107 -0
- package/src/lib/server/runtime/SSR_SWAP_SCRIPT.ts +16 -0
- package/src/lib/server/runtime/acceptsGzip.ts +24 -0
- package/src/lib/server/runtime/buildCacheSnapshot.ts +61 -0
- package/src/lib/server/runtime/buildHealthPayload.ts +34 -0
- package/src/lib/server/runtime/buildInspectorSurface.ts +37 -0
- package/src/lib/server/runtime/buildOpenApiSpec.ts +106 -0
- package/src/lib/server/runtime/cacheControlForAsset.ts +22 -0
- package/src/lib/server/runtime/containsTraversal.ts +37 -0
- package/src/lib/server/runtime/createAppAssetServer.ts +76 -0
- package/src/lib/server/runtime/createAssetHeaderCache.ts +31 -0
- package/src/lib/server/runtime/createPublicAssetServer.ts +67 -0
- package/src/lib/server/runtime/createReachable.ts +109 -0
- package/src/lib/server/runtime/createRouteDispatcher.ts +127 -0
- package/src/lib/server/runtime/createServer.ts +674 -0
- package/src/lib/server/runtime/createUiPageRenderer.ts +181 -0
- package/src/lib/server/runtime/crossOriginForbidden.ts +17 -0
- package/src/lib/server/runtime/crossOriginGate.ts +29 -0
- package/src/lib/server/runtime/devClientFingerprint.ts +117 -0
- package/src/lib/server/runtime/devHotModuleResponse.ts +40 -0
- package/src/lib/server/runtime/devReloadResponse.ts +41 -0
- package/src/lib/server/runtime/disableIdleTimeoutForStream.ts +27 -0
- package/src/lib/server/runtime/envSchemaStore.ts +15 -0
- package/src/lib/server/runtime/findOpenPort.ts +21 -0
- package/src/lib/server/runtime/getActiveServer.ts +6 -0
- package/src/lib/server/runtime/globToPathSet.ts +29 -0
- package/src/lib/server/runtime/gzipResponse.ts +46 -0
- package/src/lib/server/runtime/inProcessServer.ts +20 -0
- package/src/lib/server/runtime/internalErrorResponse.ts +25 -0
- package/src/lib/server/runtime/isCrossOriginRequest.ts +23 -0
- package/src/lib/server/runtime/listenOnOpenPort.ts +36 -0
- package/src/lib/server/runtime/logExposedSurfaces.ts +156 -0
- package/src/lib/server/runtime/maybeMountInspector.ts +97 -0
- package/src/lib/server/runtime/mimeForExtension.ts +14 -0
- package/src/lib/server/runtime/pageUrlFromStore.ts +15 -0
- package/src/lib/server/runtime/parseIdleTimeout.ts +10 -0
- package/src/lib/server/runtime/parsePort.ts +11 -0
- package/src/lib/server/runtime/registryManifests.ts +66 -0
- package/src/lib/server/runtime/requestContext.ts +5 -0
- package/src/lib/server/runtime/resolvePageSnapshot.ts +25 -0
- package/src/lib/server/runtime/respondWithEmbeddedAsset.ts +18 -0
- package/src/lib/server/runtime/runWithRequestScope.ts +150 -0
- package/src/lib/server/runtime/safeJsonForScript.ts +17 -0
- package/src/lib/server/runtime/serializeCacheSnapshot.ts +45 -0
- package/src/lib/server/runtime/serverSlot.ts +13 -0
- package/src/lib/server/runtime/setActiveServer.ts +6 -0
- package/src/lib/server/runtime/snapshotEntryFromCache.ts +83 -0
- package/src/lib/server/runtime/streamCacheResolutions.ts +37 -0
- package/src/lib/server/runtime/streamFromIterator.ts +86 -0
- package/src/lib/server/runtime/types/Assets.ts +6 -0
- package/src/lib/server/runtime/types/DevReloadStamp.ts +18 -0
- package/src/lib/server/runtime/types/InspectorCacheEntry.ts +24 -0
- package/src/lib/server/runtime/types/InspectorCacheSnapshot.ts +11 -0
- package/src/lib/server/runtime/types/InspectorContext.ts +30 -0
- package/src/lib/server/runtime/types/InspectorSocket.ts +17 -0
- package/src/lib/server/runtime/types/InspectorSurface.ts +13 -0
- package/src/lib/server/runtime/types/InspectorVerb.ts +27 -0
- package/src/lib/server/runtime/types/RequestStore.ts +55 -0
- package/src/lib/server/runtime/warnUnguardedMcp.ts +32 -0
- package/src/lib/server/runtime/withResponseDefaults.ts +24 -0
- package/src/lib/server/server.ts +33 -0
- package/src/lib/server/socket.ts +32 -0
- package/src/lib/server/sockets/createSocketDispatcher.ts +337 -0
- package/src/lib/server/sockets/defineSocket.ts +179 -0
- package/src/lib/server/sockets/lookupSocket.ts +6 -0
- package/src/lib/server/sockets/registerSocket.ts +6 -0
- package/src/lib/server/sockets/socketOperations.ts +36 -0
- package/src/lib/server/sockets/socketRegistry.ts +9 -0
- package/src/lib/server/sockets/types/Socket.ts +23 -0
- package/src/lib/server/sockets/types/SocketClientFrame.ts +19 -0
- package/src/lib/server/sockets/types/SocketOperation.ts +22 -0
- package/src/lib/server/sockets/types/SocketOptions.ts +26 -0
- package/src/lib/server/sockets/types/SocketRegistryEntry.ts +19 -0
- package/src/lib/server/sockets/types/SocketRoutes.ts +10 -0
- package/src/lib/server/sockets/types/SocketServerFrame.ts +24 -0
- package/src/lib/server/sse.ts +54 -0
- package/src/lib/shared/ABIDE_PACKAGE_NAME.ts +7 -0
- package/src/lib/shared/ABIDE_VERSION.ts +9 -0
- package/src/lib/shared/CACHE_CONTROL_VALUES.ts +16 -0
- package/src/lib/shared/CACHE_WRAPPED.ts +8 -0
- package/src/lib/shared/CLI_PATH.ts +7 -0
- package/src/lib/shared/DEV_HOT_PREFIX.ts +7 -0
- package/src/lib/shared/DEV_RELOAD_PATH.ts +6 -0
- package/src/lib/shared/HEALTH_PATH.ts +7 -0
- package/src/lib/shared/HttpError.ts +20 -0
- package/src/lib/shared/IDENTITY_PATH.ts +6 -0
- package/src/lib/shared/INSPECTOR_PATH.ts +7 -0
- package/src/lib/shared/NAV_HEADER.ts +8 -0
- package/src/lib/shared/OFFLINE_HEADER.ts +8 -0
- package/src/lib/shared/REMOTE_FUNCTION.ts +8 -0
- package/src/lib/shared/REPLAYABLE_METHODS.ts +12 -0
- package/src/lib/shared/SOCKETS_PATH.ts +7 -0
- package/src/lib/shared/STREAMING_CONTENT_TYPES.ts +11 -0
- package/src/lib/shared/SocketDisconnectedError.ts +13 -0
- package/src/lib/shared/TEXT_PLAIN.ts +7 -0
- package/src/lib/shared/abideImportName.ts +44 -0
- package/src/lib/shared/abideLog.ts +38 -0
- package/src/lib/shared/activeCacheStore.ts +20 -0
- package/src/lib/shared/activePage.ts +25 -0
- package/src/lib/shared/appDataDir.ts +34 -0
- package/src/lib/shared/appNameSlot.ts +10 -0
- package/src/lib/shared/basePath.ts +10 -0
- package/src/lib/shared/basePathFromAppUrl.ts +20 -0
- package/src/lib/shared/baseSlot.ts +14 -0
- package/src/lib/shared/binaryDirEnvPath.ts +12 -0
- package/src/lib/shared/browserClientFlags.ts +10 -0
- package/src/lib/shared/buildRpcProxy.ts +39 -0
- package/src/lib/shared/buildRpcRequest.ts +70 -0
- package/src/lib/shared/buildSocketOverChannel.ts +58 -0
- package/src/lib/shared/bundleLayout.ts +36 -0
- package/src/lib/shared/cache.ts +951 -0
- package/src/lib/shared/cacheEntryFromSnapshot.ts +59 -0
- package/src/lib/shared/cacheStoreSlot.ts +16 -0
- package/src/lib/shared/cacheStores.ts +10 -0
- package/src/lib/shared/canonicalJson.ts +63 -0
- package/src/lib/shared/carriesBodyArgs.ts +13 -0
- package/src/lib/shared/clearLastConnection.ts +7 -0
- package/src/lib/shared/commandNameForUrl.ts +17 -0
- package/src/lib/shared/createCacheStore.ts +104 -0
- package/src/lib/shared/createChannelLog.ts +122 -0
- package/src/lib/shared/createLifecycleChannel.ts +56 -0
- package/src/lib/shared/createLivenessWatch.ts +118 -0
- package/src/lib/shared/createPushIterator.ts +127 -0
- package/src/lib/shared/createRemoteFunction.ts +122 -0
- package/src/lib/shared/createSubscriber.ts +55 -0
- package/src/lib/shared/createTraceContext.ts +21 -0
- package/src/lib/shared/dataDirEnvPath.ts +12 -0
- package/src/lib/shared/decodeResponse.ts +47 -0
- package/src/lib/shared/detectTarget.ts +27 -0
- package/src/lib/shared/detectVerbMethod.ts +17 -0
- package/src/lib/shared/emitLogRecord.ts +190 -0
- package/src/lib/shared/exeSuffix.ts +9 -0
- package/src/lib/shared/exitOnBuildFailure.ts +17 -0
- package/src/lib/shared/extraForwardHeaders.ts +16 -0
- package/src/lib/shared/fileStem.ts +9 -0
- package/src/lib/shared/findExportCallSite.ts +476 -0
- package/src/lib/shared/formatTraceparent.ts +6 -0
- package/src/lib/shared/forwardHeaders.ts +44 -0
- package/src/lib/shared/getRemoteMeta.ts +5 -0
- package/src/lib/shared/globalCacheStore.ts +15 -0
- package/src/lib/shared/globalCacheStoreSlot.ts +14 -0
- package/src/lib/shared/health.ts +179 -0
- package/src/lib/shared/healthReadSlot.ts +11 -0
- package/src/lib/shared/healthSeedSlot.ts +12 -0
- package/src/lib/shared/html.ts +38 -0
- package/src/lib/shared/importNamesToStrip.ts +13 -0
- package/src/lib/shared/invalidateEvent.ts +11 -0
- package/src/lib/shared/invalidateTripwire.ts +40 -0
- package/src/lib/shared/isAbideHealthPayload.ts +11 -0
- package/src/lib/shared/isCompileTarget.ts +15 -0
- package/src/lib/shared/isDebugEnabled.ts +26 -0
- package/src/lib/shared/isDebugNegated.ts +19 -0
- package/src/lib/shared/isModuleNotFound.ts +16 -0
- package/src/lib/shared/isReadOnlyMethod.ts +14 -0
- package/src/lib/shared/isReplayableMethod.ts +7 -0
- package/src/lib/shared/isStreamingResponse.ts +11 -0
- package/src/lib/shared/isSubscribable.ts +15 -0
- package/src/lib/shared/jsonSchemaForPromptArguments.ts +29 -0
- package/src/lib/shared/jsonSchemaForSchema.ts +39 -0
- package/src/lib/shared/jsonlErrorFrame.ts +24 -0
- package/src/lib/shared/keyForRemoteCall.ts +29 -0
- package/src/lib/shared/keyMatchesPrefix.ts +9 -0
- package/src/lib/shared/lastConnectionPath.ts +7 -0
- package/src/lib/shared/layoutChainForRoute.ts +22 -0
- package/src/lib/shared/loadEnvFile.ts +17 -0
- package/src/lib/shared/loadEnvFromDataDir.ts +14 -0
- package/src/lib/shared/log.ts +24 -0
- package/src/lib/shared/logClosingRecord.ts +28 -0
- package/src/lib/shared/logTapSlot.ts +13 -0
- package/src/lib/shared/manifestModule.ts +39 -0
- package/src/lib/shared/matchesDebugPattern.ts +16 -0
- package/src/lib/shared/memoizeByKey.ts +32 -0
- package/src/lib/shared/normalizeTarget.ts +10 -0
- package/src/lib/shared/online.ts +51 -0
- package/src/lib/shared/page.ts +30 -0
- package/src/lib/shared/pageSlot.ts +17 -0
- package/src/lib/shared/pageUrlForFile.ts +14 -0
- package/src/lib/shared/parseBoundedEnvInt.ts +20 -0
- package/src/lib/shared/parseDebugPatterns.ts +21 -0
- package/src/lib/shared/parseEnv.ts +30 -0
- package/src/lib/shared/parsePromptMarkdown.ts +35 -0
- package/src/lib/shared/parseRouteSegments.ts +22 -0
- package/src/lib/shared/parseTraceparent.ts +26 -0
- package/src/lib/shared/pending.ts +30 -0
- package/src/lib/shared/prepareRpcModule.ts +59 -0
- package/src/lib/shared/prepareSocketModule.ts +49 -0
- package/src/lib/shared/probeRegistries.ts +68 -0
- package/src/lib/shared/producerKey.ts +32 -0
- package/src/lib/shared/programNameForPackage.ts +14 -0
- package/src/lib/shared/promptNameForFile.ts +10 -0
- package/src/lib/shared/queryStringFromArgs.ts +27 -0
- package/src/lib/shared/randomHexId.ts +14 -0
- package/src/lib/shared/readEnvFile.ts +15 -0
- package/src/lib/shared/readLastConnection.ts +18 -0
- package/src/lib/shared/readPackageJson.ts +9 -0
- package/src/lib/shared/recordRemoteMeta.ts +5 -0
- package/src/lib/shared/refreshing.ts +31 -0
- package/src/lib/shared/remoteMetaStore.ts +16 -0
- package/src/lib/shared/requestScopeSlot.ts +15 -0
- package/src/lib/shared/resolveClientFlags.ts +20 -0
- package/src/lib/shared/responseErrorText.ts +9 -0
- package/src/lib/shared/rpcTimeoutSlot.ts +9 -0
- package/src/lib/shared/rpcUrlForFile.ts +19 -0
- package/src/lib/shared/runningAsStandaloneBinary.ts +13 -0
- package/src/lib/shared/selectorMatcher.ts +68 -0
- package/src/lib/shared/selectorPrefix.ts +39 -0
- package/src/lib/shared/serializeEnv.ts +18 -0
- package/src/lib/shared/setAppName.ts +5 -0
- package/src/lib/shared/setBaseResolver.ts +6 -0
- package/src/lib/shared/setCacheStoreResolver.ts +6 -0
- package/src/lib/shared/setGlobalCacheStoreResolver.ts +6 -0
- package/src/lib/shared/setPageResolver.ts +7 -0
- package/src/lib/shared/setRequestScopeResolver.ts +6 -0
- package/src/lib/shared/snippet.ts +25 -0
- package/src/lib/shared/socketNameForFile.ts +11 -0
- package/src/lib/shared/socketTapSlot.ts +12 -0
- package/src/lib/shared/sseErrorFrame.ts +29 -0
- package/src/lib/shared/streamResponse.ts +169 -0
- package/src/lib/shared/stripImport.ts +27 -0
- package/src/lib/shared/subscribableFromResponse.ts +51 -0
- package/src/lib/shared/tailProbeSlot.ts +16 -0
- package/src/lib/shared/toBunRoutePattern.ts +28 -0
- package/src/lib/shared/toScopeSet.ts +4 -0
- package/src/lib/shared/trace.ts +16 -0
- package/src/lib/shared/types/CacheEntry.ts +84 -0
- package/src/lib/shared/types/CacheInvalidation.ts +9 -0
- package/src/lib/shared/types/CacheOnContext.ts +25 -0
- package/src/lib/shared/types/CacheOptions.ts +39 -0
- package/src/lib/shared/types/CacheSelector.ts +17 -0
- package/src/lib/shared/types/CacheSnapshot.ts +16 -0
- package/src/lib/shared/types/CacheSnapshotEntry.ts +17 -0
- package/src/lib/shared/types/CacheStats.ts +13 -0
- package/src/lib/shared/types/CacheStore.ts +39 -0
- package/src/lib/shared/types/ChannelLog.ts +13 -0
- package/src/lib/shared/types/ClientFlags.ts +11 -0
- package/src/lib/shared/types/CompileTarget.ts +6 -0
- package/src/lib/shared/types/FrameworkLog.ts +13 -0
- package/src/lib/shared/types/HttpVerb.ts +1 -0
- package/src/lib/shared/types/LastConnection.ts +9 -0
- package/src/lib/shared/types/Log.ts +13 -0
- package/src/lib/shared/types/LogRecord.ts +42 -0
- package/src/lib/shared/types/LogVoice.ts +7 -0
- package/src/lib/shared/types/PageSnapshot.ts +14 -0
- package/src/lib/shared/types/PromptArgument.ts +12 -0
- package/src/lib/shared/types/RawRemoteFunction.ts +14 -0
- package/src/lib/shared/types/RemoteCallable.ts +12 -0
- package/src/lib/shared/types/RemoteFunction.ts +47 -0
- package/src/lib/shared/types/ReplayableMethod.ts +7 -0
- package/src/lib/shared/types/RequestScopeInfo.ts +16 -0
- package/src/lib/shared/types/RpcInvoker.ts +6 -0
- package/src/lib/shared/types/SocketChannel.ts +17 -0
- package/src/lib/shared/types/SocketSubCallbacks.ts +13 -0
- package/src/lib/shared/types/StandardSchemaV1.ts +56 -0
- package/src/lib/shared/types/StreamedResolution.ts +10 -0
- package/src/lib/shared/types/Subscribable.ts +26 -0
- package/src/lib/shared/types/TailHooks.ts +12 -0
- package/src/lib/shared/types/TailOptions.ts +10 -0
- package/src/lib/shared/types/TraceContext.ts +17 -0
- package/src/lib/shared/url.ts +118 -0
- package/src/lib/shared/withBase.ts +11 -0
- package/src/lib/shared/withBaseUrl.ts +17 -0
- package/src/lib/shared/withJsonSchema.ts +21 -0
- package/src/lib/shared/writeDts.ts +12 -0
- package/src/lib/shared/writeHealthDts.ts +36 -0
- package/src/lib/shared/writeLastConnection.ts +13 -0
- package/src/lib/shared/writePublicAssetsDts.ts +31 -0
- package/src/lib/shared/writeRoutesDts.ts +73 -0
- package/src/lib/shared/writeRpcDts.ts +49 -0
- package/src/lib/shared/writeTestRpcDts.ts +45 -0
- package/src/lib/shared/writeTestSocketsDts.ts +34 -0
- package/src/lib/test/assertAgentFrameConformance.ts +73 -0
- package/src/lib/test/createScriptedSurface.ts +45 -0
- package/src/lib/test/createTestApp.ts +203 -0
- package/src/lib/test/createTestSocketChannel.ts +142 -0
- package/src/lib/ui/README.md +86 -0
- package/src/lib/ui/compile/SSR_ESCAPE.ts +25 -0
- package/src/lib/ui/compile/UI_RUNTIME_IMPORTS.ts +36 -0
- package/src/lib/ui/compile/VOID_TAGS.ts +21 -0
- package/src/lib/ui/compile/abideUiPlugin.ts +65 -0
- package/src/lib/ui/compile/analyzeComponent.ts +117 -0
- package/src/lib/ui/compile/assetModulesFile.ts +32 -0
- package/src/lib/ui/compile/branchElements.ts +50 -0
- package/src/lib/ui/compile/collectAbideDiagnostics.ts +59 -0
- package/src/lib/ui/compile/compileComponent.ts +20 -0
- package/src/lib/ui/compile/compileModule.ts +116 -0
- package/src/lib/ui/compile/compileSSR.ts +36 -0
- package/src/lib/ui/compile/compileShadow.ts +352 -0
- package/src/lib/ui/compile/createShadowLanguageService.ts +197 -0
- package/src/lib/ui/compile/createShadowProgram.ts +96 -0
- package/src/lib/ui/compile/decodeHtmlEntities.ts +49 -0
- package/src/lib/ui/compile/desugarSignals.ts +133 -0
- package/src/lib/ui/compile/escapeHtml.ts +15 -0
- package/src/lib/ui/compile/generateBuild.ts +638 -0
- package/src/lib/ui/compile/generateSSR.ts +380 -0
- package/src/lib/ui/compile/groupBindParts.ts +28 -0
- package/src/lib/ui/compile/hoistCells.ts +120 -0
- package/src/lib/ui/compile/loadShadowTsConfig.ts +31 -0
- package/src/lib/ui/compile/lowerDocAccess.ts +202 -0
- package/src/lib/ui/compile/nearestProjectRoot.ts +16 -0
- package/src/lib/ui/compile/parseTemplate.ts +396 -0
- package/src/lib/ui/compile/partitionSlots.ts +36 -0
- package/src/lib/ui/compile/prepareNestedScript.ts +42 -0
- package/src/lib/ui/compile/remapShadowDiagnostic.ts +30 -0
- package/src/lib/ui/compile/renameSignalRefs.ts +85 -0
- package/src/lib/ui/compile/resolveAbideImports.ts +29 -0
- package/src/lib/ui/compile/scopeCss.ts +115 -0
- package/src/lib/ui/compile/shadowNaming.ts +11 -0
- package/src/lib/ui/compile/sourceToShadowOffset.ts +24 -0
- package/src/lib/ui/compile/staticAttrValue.ts +13 -0
- package/src/lib/ui/compile/stripEffects.ts +32 -0
- package/src/lib/ui/compile/types/AbideDiagnostic.ts +14 -0
- package/src/lib/ui/compile/types/AnalyzedComponent.ts +25 -0
- package/src/lib/ui/compile/types/CompiledShadow.ts +15 -0
- package/src/lib/ui/compile/types/TemplateAttr.ts +16 -0
- package/src/lib/ui/compile/types/TemplateNode.ts +78 -0
- package/src/lib/ui/compile/types/TextPart.ts +8 -0
- package/src/lib/ui/derived.ts +28 -0
- package/src/lib/ui/doc.ts +15 -0
- package/src/lib/ui/dom/appendSnippet.ts +34 -0
- package/src/lib/ui/dom/appendStatic.ts +27 -0
- package/src/lib/ui/dom/appendText.ts +114 -0
- package/src/lib/ui/dom/applyResolved.ts +72 -0
- package/src/lib/ui/dom/attach.ts +20 -0
- package/src/lib/ui/dom/attr.ts +19 -0
- package/src/lib/ui/dom/awaitBlock.ts +224 -0
- package/src/lib/ui/dom/cloneStatic.ts +52 -0
- package/src/lib/ui/dom/each.ts +115 -0
- package/src/lib/ui/dom/eachAsync.ts +153 -0
- package/src/lib/ui/dom/hydrate.ts +35 -0
- package/src/lib/ui/dom/mount.ts +29 -0
- package/src/lib/ui/dom/mountChild.ts +33 -0
- package/src/lib/ui/dom/on.ts +15 -0
- package/src/lib/ui/dom/openChild.ts +22 -0
- package/src/lib/ui/dom/openRoot.ts +20 -0
- package/src/lib/ui/dom/switchBlock.ts +75 -0
- package/src/lib/ui/dom/text.ts +20 -0
- package/src/lib/ui/dom/tryBlock.ts +112 -0
- package/src/lib/ui/dom/types/EachRow.ts +3 -0
- package/src/lib/ui/dom/types/SwitchCase.ts +6 -0
- package/src/lib/ui/dom/when.ts +73 -0
- package/src/lib/ui/effect.ts +16 -0
- package/src/lib/ui/installHotBridge.ts +73 -0
- package/src/lib/ui/matchRoute.ts +89 -0
- package/src/lib/ui/navigate.ts +17 -0
- package/src/lib/ui/probeNavigation.ts +33 -0
- package/src/lib/ui/remoteProxy.ts +97 -0
- package/src/lib/ui/renderChain.ts +50 -0
- package/src/lib/ui/renderToStream.ts +104 -0
- package/src/lib/ui/router.ts +286 -0
- package/src/lib/ui/runtime/OUTLET_TAG.ts +8 -0
- package/src/lib/ui/runtime/OWNER.ts +8 -0
- package/src/lib/ui/runtime/REACTIVE_CONTEXT.ts +14 -0
- package/src/lib/ui/runtime/RENDER.ts +23 -0
- package/src/lib/ui/runtime/RESUME.ts +16 -0
- package/src/lib/ui/runtime/applyPatchToTree.ts +41 -0
- package/src/lib/ui/runtime/claimChild.ts +10 -0
- package/src/lib/ui/runtime/clientPage.ts +16 -0
- package/src/lib/ui/runtime/createComputedNode.ts +16 -0
- package/src/lib/ui/runtime/createDoc.ts +177 -0
- package/src/lib/ui/runtime/createEffectNode.ts +58 -0
- package/src/lib/ui/runtime/createSignalNode.ts +16 -0
- package/src/lib/ui/runtime/detachLink.ts +21 -0
- package/src/lib/ui/runtime/endTracking.ts +24 -0
- package/src/lib/ui/runtime/enterRenderPass.ts +12 -0
- package/src/lib/ui/runtime/exitRenderPass.ts +7 -0
- package/src/lib/ui/runtime/firstOutlet.ts +22 -0
- package/src/lib/ui/runtime/flushEffects.ts +17 -0
- package/src/lib/ui/runtime/hotInstances.ts +10 -0
- package/src/lib/ui/runtime/hotReloadEnabled.ts +8 -0
- package/src/lib/ui/runtime/hotReplace.ts +25 -0
- package/src/lib/ui/runtime/nextBlockId.ts +11 -0
- package/src/lib/ui/runtime/pathExists.ts +23 -0
- package/src/lib/ui/runtime/readNode.ts +17 -0
- package/src/lib/ui/runtime/registerHotInstance.ts +23 -0
- package/src/lib/ui/runtime/runNode.ts +28 -0
- package/src/lib/ui/runtime/runtimePath.ts +9 -0
- package/src/lib/ui/runtime/scope.ts +24 -0
- package/src/lib/ui/runtime/toTeardown.ts +26 -0
- package/src/lib/ui/runtime/track.ts +58 -0
- package/src/lib/ui/runtime/trigger.ts +44 -0
- package/src/lib/ui/runtime/types/Cell.ts +5 -0
- package/src/lib/ui/runtime/types/Derived.ts +3 -0
- package/src/lib/ui/runtime/types/Doc.ts +19 -0
- package/src/lib/ui/runtime/types/EffectResult.ts +10 -0
- package/src/lib/ui/runtime/types/HotInstance.ts +14 -0
- package/src/lib/ui/runtime/types/NavVerdict.ts +9 -0
- package/src/lib/ui/runtime/types/Patch.ts +11 -0
- package/src/lib/ui/runtime/types/ReactiveLink.ts +21 -0
- package/src/lib/ui/runtime/types/ReactiveNode.ts +25 -0
- package/src/lib/ui/runtime/types/Route.ts +8 -0
- package/src/lib/ui/runtime/types/RouteLoader.ts +7 -0
- package/src/lib/ui/runtime/types/SsrRender.ts +22 -0
- package/src/lib/ui/runtime/types/State.ts +3 -0
- package/src/lib/ui/runtime/types/Teardown.ts +5 -0
- package/src/lib/ui/runtime/types/UiComponent.ts +16 -0
- package/src/lib/ui/runtime/types/UiProps.ts +15 -0
- package/src/lib/ui/runtime/unlinkDeps.ts +20 -0
- package/src/lib/ui/runtime/untrack.ts +20 -0
- package/src/lib/ui/runtime/valueAtPath.ts +18 -0
- package/src/lib/ui/runtime/writeNode.ts +16 -0
- package/src/lib/ui/socketChannel.ts +227 -0
- package/src/lib/ui/socketProxy.ts +25 -0
- package/src/lib/ui/startClient.ts +58 -0
- package/src/lib/ui/state.ts +25 -0
- package/src/lib/ui/tail.ts +324 -0
- package/src/lib/ui/types/Layouts.ts +9 -0
- package/src/lib/ui/types/Pages.ts +8 -0
- package/src/preload.ts +19 -0
- package/src/scaffold.ts +153 -0
- package/src/serverBuildPlugins.ts +19 -0
- package/src/serverEntry.ts +95 -0
- package/template/bunfig.toml +4 -0
- package/template/package.json +18 -0
- package/template/src/app.ts +28 -0
- package/template/src/bundle/icon.png +0 -0
- package/template/src/cli/banner.txt +3 -0
- package/template/src/cli/footer.txt +1 -0
- package/template/src/server/config.ts +17 -0
- package/template/src/server/rpc/getHello.ts +36 -0
- package/template/src/ui/Layout.abide +19 -0
- package/template/src/ui/app.css +21 -0
- package/template/src/ui/app.html +24 -0
- package/template/src/ui/pages/about/page.abide +9 -0
- package/template/src/ui/pages/page.abide +22 -0
- package/template/test/app.test.ts +30 -0
- package/template/tsconfig.json +18 -0
- package/tsconfig.app.json +17 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { decodeResponse } from '../shared/decodeResponse.ts'
|
|
2
|
+
import { isStreamingResponse } from '../shared/isStreamingResponse.ts'
|
|
3
|
+
import { responseErrorText } from '../shared/responseErrorText.ts'
|
|
4
|
+
import { streamResponse } from '../shared/streamResponse.ts'
|
|
5
|
+
import { createClient } from './createClient.ts'
|
|
6
|
+
import { parseArgvForRpc } from './parseArgvForRpc.ts'
|
|
7
|
+
import { printValue } from './printValue.ts'
|
|
8
|
+
import type { CliManifest } from './types/CliManifest.ts'
|
|
9
|
+
|
|
10
|
+
/*
|
|
11
|
+
Runs one RPC command against a target server and prints the result, returning a
|
|
12
|
+
process exit code. Shared by the one-shot path (runCli) and the interactive
|
|
13
|
+
session (runSession) so a command behaves identically typed at the shell or at
|
|
14
|
+
the session prompt. Streaming responses (sse/jsonl — a streaming verb or a socket
|
|
15
|
+
`tail`) print frame-by-frame as NDJSON; everything else decodes and prints once.
|
|
16
|
+
*/
|
|
17
|
+
export async function dispatchCommand({
|
|
18
|
+
programName,
|
|
19
|
+
manifest,
|
|
20
|
+
command,
|
|
21
|
+
argvTail,
|
|
22
|
+
url,
|
|
23
|
+
token,
|
|
24
|
+
}: {
|
|
25
|
+
programName: string
|
|
26
|
+
manifest: CliManifest
|
|
27
|
+
command: string
|
|
28
|
+
argvTail: string[]
|
|
29
|
+
url: string
|
|
30
|
+
token?: string
|
|
31
|
+
}): Promise<number> {
|
|
32
|
+
const entry = manifest[command]
|
|
33
|
+
if (!entry) {
|
|
34
|
+
console.error(
|
|
35
|
+
`${programName}: unknown command "${command}" — run \`${programName} --help\` for the list`,
|
|
36
|
+
)
|
|
37
|
+
return 1
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
let args: Record<string, unknown> | undefined
|
|
41
|
+
try {
|
|
42
|
+
args = await parseArgvForRpc(argvTail, entry.jsonSchema)
|
|
43
|
+
} catch (error) {
|
|
44
|
+
console.error(`${programName}: ${error instanceof Error ? error.message : String(error)}`)
|
|
45
|
+
return 1
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const client = createClient({ url, token, manifest })
|
|
49
|
+
const fn = client[command]
|
|
50
|
+
if (!fn) {
|
|
51
|
+
console.error(`${programName}: command "${command}" not in client`)
|
|
52
|
+
return 1
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
const response = await fn.raw(args)
|
|
56
|
+
if (isStreamingResponse(response)) {
|
|
57
|
+
for await (const frame of streamResponse(response)) {
|
|
58
|
+
printValue(frame, false)
|
|
59
|
+
}
|
|
60
|
+
return 0
|
|
61
|
+
}
|
|
62
|
+
if (!response.ok) {
|
|
63
|
+
throw new Error(await responseErrorText(response))
|
|
64
|
+
}
|
|
65
|
+
printValue(await decodeResponse(response), true)
|
|
66
|
+
return 0
|
|
67
|
+
} catch (error) {
|
|
68
|
+
console.error(`${programName}: ${error instanceof Error ? error.message : String(error)}`)
|
|
69
|
+
return 1
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { binaryDirEnvPath } from '../shared/binaryDirEnvPath.ts'
|
|
2
|
+
import { loadEnvFile } from '../shared/loadEnvFile.ts'
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
Loads the bundle's shipped `.env` into `process.env`, resolved from the running
|
|
6
|
+
binary's directory (`process.execPath`) via bundleLayout — beside the binary in
|
|
7
|
+
the flat layout, under `Contents/Resources` in a macOS `.app`. This is the file the
|
|
8
|
+
install tarball ships beside the executable — and, for a bundle, the one `bundleApp`
|
|
9
|
+
copies from the project's `bundle.env`. It carries the app's shipped defaults; the
|
|
10
|
+
fill-when-unset merge (see loadEnvFile) lets per-shell exports, Bun's CWD
|
|
11
|
+
`.env`, and the user's data-dir config all override it.
|
|
12
|
+
*/
|
|
13
|
+
export async function loadEnvFromBinaryDir(): Promise<void> {
|
|
14
|
+
await loadEnvFile(binaryDirEnvPath())
|
|
15
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Parses an argv tail into the JSON args bag for an RPC. The JSON Schema
|
|
3
|
+
on the manifest entry (when present) drives flag typing:
|
|
4
|
+
- properties whose type is "boolean" accept `--name` / `--no-name`
|
|
5
|
+
- properties whose type is "number" / "integer" accept `--name <n>` and
|
|
6
|
+
coerce with Number()
|
|
7
|
+
- properties whose type is "array" accept repeated `--name <v>`
|
|
8
|
+
- anything else accepts `--name <value>` as a string
|
|
9
|
+
|
|
10
|
+
For complex shapes (nested objects, unions, anyOf) the CLI exposes
|
|
11
|
+
`--json <stringified-args>` as an escape hatch that supplies the whole
|
|
12
|
+
args bag verbatim. Stdin: if a JSON object arrives piped in, it's used
|
|
13
|
+
as the full args bag (flags layer on top).
|
|
14
|
+
|
|
15
|
+
Unrecognised flags throw — early loud feedback is more useful than
|
|
16
|
+
silent drops.
|
|
17
|
+
*/
|
|
18
|
+
export async function parseArgvForRpc(
|
|
19
|
+
argv: string[],
|
|
20
|
+
jsonSchema: Record<string, unknown> | undefined,
|
|
21
|
+
): Promise<Record<string, unknown> | undefined> {
|
|
22
|
+
const properties =
|
|
23
|
+
(jsonSchema?.properties as Record<string, { type?: string }> | undefined) ?? {}
|
|
24
|
+
const args: Record<string, unknown> = {}
|
|
25
|
+
|
|
26
|
+
/*
|
|
27
|
+
Stdin override: if a JSON object is piped in, treat it as the
|
|
28
|
+
starting args bag. `Bun.stdin.text()` reads the whole pipe; if
|
|
29
|
+
nothing was piped, the read resolves with an empty string.
|
|
30
|
+
*/
|
|
31
|
+
if (!process.stdin.isTTY) {
|
|
32
|
+
const text = await Bun.stdin.text()
|
|
33
|
+
if (text.trim()) {
|
|
34
|
+
try {
|
|
35
|
+
const piped = JSON.parse(text)
|
|
36
|
+
if (piped && typeof piped === 'object' && !Array.isArray(piped)) {
|
|
37
|
+
Object.assign(args, piped)
|
|
38
|
+
}
|
|
39
|
+
} catch {
|
|
40
|
+
throw new Error(`stdin is not a valid JSON object: ${text.slice(0, 80)}…`)
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
for (let index = 0; index < argv.length; index++) {
|
|
46
|
+
const token = argv[index] as string
|
|
47
|
+
if (token === '--json') {
|
|
48
|
+
const next = argv[++index]
|
|
49
|
+
if (!next) {
|
|
50
|
+
throw new Error('--json requires a value')
|
|
51
|
+
}
|
|
52
|
+
const parsed = JSON.parse(next)
|
|
53
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
54
|
+
throw new Error('--json value must be a JSON object')
|
|
55
|
+
}
|
|
56
|
+
Object.assign(args, parsed)
|
|
57
|
+
continue
|
|
58
|
+
}
|
|
59
|
+
if (!token.startsWith('--')) {
|
|
60
|
+
throw new Error(`unexpected positional argument: ${token}`)
|
|
61
|
+
}
|
|
62
|
+
const stripped = token.slice('--'.length)
|
|
63
|
+
const [literalName, eqValue] = stripped.includes('=')
|
|
64
|
+
? [stripped.slice(0, stripped.indexOf('=')), stripped.slice(stripped.indexOf('=') + 1)]
|
|
65
|
+
: [stripped, undefined]
|
|
66
|
+
/* `--no-x` negates only a known boolean property x; otherwise the literal
|
|
67
|
+
name wins, so a property legitimately named `no-…` stays reachable. */
|
|
68
|
+
const negatedName = literalName.startsWith('no-')
|
|
69
|
+
? literalName.slice('no-'.length)
|
|
70
|
+
: undefined
|
|
71
|
+
const isNegated = negatedName !== undefined && properties[negatedName]?.type === 'boolean'
|
|
72
|
+
const name = isNegated ? (negatedName as string) : literalName
|
|
73
|
+
const prop = properties[name]
|
|
74
|
+
const propType = prop?.type
|
|
75
|
+
if (propType === 'boolean') {
|
|
76
|
+
args[name] = !isNegated
|
|
77
|
+
continue
|
|
78
|
+
}
|
|
79
|
+
const value = eqValue ?? argv[++index]
|
|
80
|
+
if (value === undefined) {
|
|
81
|
+
throw new Error(`--${name} requires a value`)
|
|
82
|
+
}
|
|
83
|
+
if (propType === 'number' || propType === 'integer') {
|
|
84
|
+
const n = Number(value)
|
|
85
|
+
if (Number.isNaN(n)) {
|
|
86
|
+
throw new Error(`--${name} expects a number, got ${value}`)
|
|
87
|
+
}
|
|
88
|
+
args[name] = n
|
|
89
|
+
continue
|
|
90
|
+
}
|
|
91
|
+
if (propType === 'array') {
|
|
92
|
+
const existing = args[name]
|
|
93
|
+
args[name] = Array.isArray(existing) ? [...existing, value] : [value]
|
|
94
|
+
continue
|
|
95
|
+
}
|
|
96
|
+
args[name] = value
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return Object.keys(args).length === 0 ? undefined : args
|
|
100
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { printTrimmed } from './printTrimmed.ts'
|
|
2
|
+
import type { CliManifest } from './types/CliManifest.ts'
|
|
3
|
+
import type { CliManifestEntry } from './types/CliManifestEntry.ts'
|
|
4
|
+
|
|
5
|
+
/*
|
|
6
|
+
Compact one-line flag signature for the top-level listing: required
|
|
7
|
+
flags are shown bare, optional flags wrapped in `[ ]`. Booleans drop the
|
|
8
|
+
value placeholder; arrays show `<value...>` to hint repetition. Full
|
|
9
|
+
per-flag types + descriptions live in `<cmd> --help`.
|
|
10
|
+
*/
|
|
11
|
+
function flagSignature(jsonSchema: CliManifestEntry['jsonSchema']): string {
|
|
12
|
+
const properties =
|
|
13
|
+
(jsonSchema?.properties as Record<string, { type?: string }> | undefined) ?? {}
|
|
14
|
+
const required = new Set((jsonSchema?.required as string[] | undefined) ?? [])
|
|
15
|
+
return Object.entries(properties)
|
|
16
|
+
.map(([key, value]) => {
|
|
17
|
+
const placeholder =
|
|
18
|
+
value.type === 'boolean'
|
|
19
|
+
? `--${key}`
|
|
20
|
+
: value.type === 'array'
|
|
21
|
+
? `--${key} <value...>`
|
|
22
|
+
: `--${key} <${value.type ?? 'value'}>`
|
|
23
|
+
return required.has(key) ? placeholder : `[${placeholder}]`
|
|
24
|
+
})
|
|
25
|
+
.join(' ')
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/*
|
|
29
|
+
Top-level help (no subcommand) lists every available command with a
|
|
30
|
+
one-line summary. Per-command help (`<cmd> --help`) prints the flags
|
|
31
|
+
derived from the command's JSON Schema. Output goes to stdout in both
|
|
32
|
+
cases; the caller exits zero after printing.
|
|
33
|
+
*/
|
|
34
|
+
export function printTopLevelHelp(
|
|
35
|
+
programName: string,
|
|
36
|
+
manifest: CliManifest,
|
|
37
|
+
banner = '',
|
|
38
|
+
footer = '',
|
|
39
|
+
): void {
|
|
40
|
+
if (banner.trim()) {
|
|
41
|
+
printTrimmed(banner)
|
|
42
|
+
console.log('')
|
|
43
|
+
}
|
|
44
|
+
const names = Object.keys(manifest).toSorted()
|
|
45
|
+
console.log(`usage: ${programName} <command> [--flags]\n`)
|
|
46
|
+
console.log('commands:')
|
|
47
|
+
for (const name of names) {
|
|
48
|
+
const entry = manifest[name]
|
|
49
|
+
if (!entry) {
|
|
50
|
+
continue
|
|
51
|
+
}
|
|
52
|
+
/*
|
|
53
|
+
Summary line favours the schema's top-level description (carried
|
|
54
|
+
through by the vendor's JSON Schema conversion); falls back to
|
|
55
|
+
`method url` when the schema has none. The detail line below
|
|
56
|
+
always shows the args, plus method/url when it isn't already the
|
|
57
|
+
summary.
|
|
58
|
+
*/
|
|
59
|
+
const description = entry.jsonSchema?.description as string | undefined
|
|
60
|
+
console.log(` ${name.padEnd(20)} ${description ?? `${entry.method} ${entry.url}`}`)
|
|
61
|
+
const signature = flagSignature(entry.jsonSchema)
|
|
62
|
+
const detail = [description && `${entry.method} ${entry.url}`, signature]
|
|
63
|
+
.filter(Boolean)
|
|
64
|
+
.join(' ')
|
|
65
|
+
if (detail) {
|
|
66
|
+
console.log(` ${' '.repeat(20)} ${detail}`)
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
console.log(`\nconnection (\`/\` manages the connection, a bare word runs a command):`)
|
|
70
|
+
console.log(` ${programName} /connect <url> connect to a remote server`)
|
|
71
|
+
console.log(` ${programName} /start start a local instance`)
|
|
72
|
+
console.log(` ${programName} /disconnect forget the saved connection`)
|
|
73
|
+
console.log(` ${programName} resume the saved connection (session)`)
|
|
74
|
+
console.log(`\n --help, -h show this help`)
|
|
75
|
+
console.log(` <command> --help show help for a specific command`)
|
|
76
|
+
console.log(`\nenv:`)
|
|
77
|
+
console.log(` ABIDE_APP_URL default server URL (baked at install; shell-overridable)`)
|
|
78
|
+
console.log(` ABIDE_APP_TOKEN sent as Authorization: Bearer <value>`)
|
|
79
|
+
if (footer.trim()) {
|
|
80
|
+
console.log('')
|
|
81
|
+
printTrimmed(footer)
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function printCommandHelp(programName: string, name: string, manifest: CliManifest): void {
|
|
86
|
+
const entry = manifest[name]
|
|
87
|
+
if (!entry) {
|
|
88
|
+
console.log(`unknown command: ${name}`)
|
|
89
|
+
return
|
|
90
|
+
}
|
|
91
|
+
console.log(`usage: ${programName} ${name} [--flags]\n`)
|
|
92
|
+
console.log(` ${entry.method} ${entry.url}\n`)
|
|
93
|
+
const schema = entry.jsonSchema
|
|
94
|
+
const commandDescription = schema?.description as string | undefined
|
|
95
|
+
if (commandDescription) {
|
|
96
|
+
console.log(`${commandDescription}\n`)
|
|
97
|
+
}
|
|
98
|
+
const properties =
|
|
99
|
+
(schema?.properties as
|
|
100
|
+
| Record<string, { type?: string; description?: string }>
|
|
101
|
+
| undefined) ?? {}
|
|
102
|
+
const required = new Set((schema?.required as string[] | undefined) ?? [])
|
|
103
|
+
if (Object.keys(properties).length === 0) {
|
|
104
|
+
console.log('flags: (none)')
|
|
105
|
+
} else {
|
|
106
|
+
console.log('flags:')
|
|
107
|
+
for (const [key, value] of Object.entries(properties)) {
|
|
108
|
+
const tag =
|
|
109
|
+
value.type === 'boolean'
|
|
110
|
+
? `--${key} / --no-${key}`
|
|
111
|
+
: `--${key} <${value.type ?? 'value'}>`
|
|
112
|
+
const requiredTag = required.has(key) ? ' (required)' : ''
|
|
113
|
+
const description = value.description ? ` — ${value.description}` : ''
|
|
114
|
+
console.log(` ${tag.padEnd(28)}${requiredTag}${description}`)
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
console.log('\n --json <object> full args bag as JSON (overrides flags)')
|
|
118
|
+
console.log(' (stdin) pipe a JSON object as the args bag')
|
|
119
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { printCommandHelp, printTopLevelHelp } from './printHelp.ts'
|
|
2
|
+
import type { CliManifest } from './types/CliManifest.ts'
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
Session `/help`: with a command name, the per-command flag help; otherwise the
|
|
6
|
+
meta-command list followed by the RPC command listing (no banner — already shown
|
|
7
|
+
at session start).
|
|
8
|
+
*/
|
|
9
|
+
export function printSessionHelp(
|
|
10
|
+
programName: string,
|
|
11
|
+
manifest: CliManifest,
|
|
12
|
+
command?: string,
|
|
13
|
+
): void {
|
|
14
|
+
if (command) {
|
|
15
|
+
printCommandHelp(programName, command, manifest)
|
|
16
|
+
return
|
|
17
|
+
}
|
|
18
|
+
console.log('session commands:')
|
|
19
|
+
console.log(' /connect <url> connect to a remote server')
|
|
20
|
+
console.log(' /start start a local instance')
|
|
21
|
+
console.log(' /disconnect disconnect and forget the saved connection')
|
|
22
|
+
console.log(' /help [command] show this help, or help for one command')
|
|
23
|
+
console.log(' /clear clear the screen')
|
|
24
|
+
console.log(' /exit leave the session')
|
|
25
|
+
console.log('')
|
|
26
|
+
printTopLevelHelp(programName, manifest)
|
|
27
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { probeAbideServer } from '../bundle/probeAbideServer.ts'
|
|
2
|
+
import type { CliTarget } from './types/CliTarget.ts'
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
Prints the session's connection line. A local instance (spawned child) reads as
|
|
6
|
+
"running a local instance"; a remote one reads as "connected to <name>", using the
|
|
7
|
+
name the target already carries from its resolve-time probe and only re-probing
|
|
8
|
+
when it doesn't. No target → the not-connected hint listing the verbs.
|
|
9
|
+
*/
|
|
10
|
+
export async function printSessionStatus(target: CliTarget | undefined): Promise<void> {
|
|
11
|
+
if (!target) {
|
|
12
|
+
console.log('(not connected — /connect <url> or /start)')
|
|
13
|
+
return
|
|
14
|
+
}
|
|
15
|
+
if (target.child) {
|
|
16
|
+
console.log(`running a local instance at ${target.url}`)
|
|
17
|
+
return
|
|
18
|
+
}
|
|
19
|
+
const name = target.name ?? (await probeAbideServer(target.url))?.name ?? target.url
|
|
20
|
+
console.log(`connected to ${name} at ${target.url}`)
|
|
21
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// Prints a block of chrome (banner/footer) with its trailing newline stripped,
|
|
2
|
+
// or nothing when the text is blank. Shared by the help, banner, and session
|
|
3
|
+
// footer so the trim-and-skip idiom lives in one place.
|
|
4
|
+
export function printTrimmed(text: string): void {
|
|
5
|
+
if (text.trim()) {
|
|
6
|
+
console.log(text.replace(/\n$/, ''))
|
|
7
|
+
}
|
|
8
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// String results print verbatim (with a trailing newline); everything else as a JSON line.
|
|
2
|
+
export function printValue(value: unknown, pretty: boolean): void {
|
|
3
|
+
if (typeof value === 'string') {
|
|
4
|
+
process.stdout.write(value.endsWith('\n') ? value : `${value}\n`)
|
|
5
|
+
return
|
|
6
|
+
}
|
|
7
|
+
if (value !== undefined) {
|
|
8
|
+
process.stdout.write(`${JSON.stringify(value, null, pretty ? 2 : undefined)}\n`)
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { probeAbideServer } from '../bundle/probeAbideServer.ts'
|
|
2
|
+
import { spawnEmbeddedServer } from '../bundle/spawnEmbeddedServer.ts'
|
|
3
|
+
import { abideLog } from '../shared/abideLog.ts'
|
|
4
|
+
import { readLastConnection } from '../shared/readLastConnection.ts'
|
|
5
|
+
import type { CliTarget } from './types/CliTarget.ts'
|
|
6
|
+
|
|
7
|
+
// Bound a resume boot so a slow/failed local start falls back to not-connected
|
|
8
|
+
// rather than hanging the CLI before the prompt appears.
|
|
9
|
+
const AUTO_START_CEILING_MS = 3000
|
|
10
|
+
|
|
11
|
+
/*
|
|
12
|
+
Resolves the connection to resume when the CLI runs without an explicit
|
|
13
|
+
connection verb — the terminal analogue of the bundle's resolveLaunchTarget.
|
|
14
|
+
Reads the saved intent:
|
|
15
|
+
- embedded → boot a fresh local instance (bounded; undefined on failure)
|
|
16
|
+
- url, still alive → connect to it
|
|
17
|
+
- url, now dead → warn, undefined (caller shows the not-connected prompt)
|
|
18
|
+
- nothing recorded → the baked/shell ABIDE_APP_URL default, else undefined
|
|
19
|
+
Returns undefined when there's nothing live to talk to.
|
|
20
|
+
*/
|
|
21
|
+
export async function resolveCliTarget(programName: string): Promise<CliTarget | undefined> {
|
|
22
|
+
const last = await readLastConnection(programName)
|
|
23
|
+
if (last?.kind === 'embedded') {
|
|
24
|
+
try {
|
|
25
|
+
const { url, child } = await spawnEmbeddedServer({
|
|
26
|
+
programName,
|
|
27
|
+
timeoutMs: AUTO_START_CEILING_MS,
|
|
28
|
+
})
|
|
29
|
+
return { url, child }
|
|
30
|
+
} catch (error) {
|
|
31
|
+
abideLog.warn(
|
|
32
|
+
`could not start local instance: ${error instanceof Error ? error.message : String(error)}`,
|
|
33
|
+
)
|
|
34
|
+
return undefined
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (last?.kind === 'url') {
|
|
38
|
+
const identity = await probeAbideServer(last.url)
|
|
39
|
+
if (identity) {
|
|
40
|
+
return { url: last.url, token: process.env.ABIDE_APP_TOKEN, name: identity.name }
|
|
41
|
+
}
|
|
42
|
+
abideLog.warn(`last server at ${last.url} is not responding`)
|
|
43
|
+
return undefined
|
|
44
|
+
}
|
|
45
|
+
// Nothing recorded — fall back to the baked default / shell override.
|
|
46
|
+
const appUrl = process.env.ABIDE_APP_URL
|
|
47
|
+
return appUrl ? { url: appUrl, token: process.env.ABIDE_APP_TOKEN } : undefined
|
|
48
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { clearLastConnection } from '../shared/clearLastConnection.ts'
|
|
2
|
+
import { loadEnvFromDataDir } from '../shared/loadEnvFromDataDir.ts'
|
|
3
|
+
import { connectToServer } from './connectToServer.ts'
|
|
4
|
+
import { dispatchCommand } from './dispatchCommand.ts'
|
|
5
|
+
import { loadEnvFromBinaryDir } from './loadEnvFromBinaryDir.ts'
|
|
6
|
+
import { printCommandHelp, printTopLevelHelp } from './printHelp.ts'
|
|
7
|
+
import { printTrimmed } from './printTrimmed.ts'
|
|
8
|
+
import { resolveCliTarget } from './resolveCliTarget.ts'
|
|
9
|
+
import { runSession } from './runSession.ts'
|
|
10
|
+
import { startLocalInstance } from './startLocalInstance.ts'
|
|
11
|
+
import type { CliManifest } from './types/CliManifest.ts'
|
|
12
|
+
import type { CliTarget } from './types/CliTarget.ts'
|
|
13
|
+
|
|
14
|
+
const isHelpFlag = (arg: string): boolean => arg === '--help' || arg === '-h'
|
|
15
|
+
|
|
16
|
+
/*
|
|
17
|
+
Whether a command's argv tail genuinely requests help, i.e. a help flag appears
|
|
18
|
+
at a flag position rather than as the value of a value-expecting flag. Mirrors
|
|
19
|
+
parseArgvForRpc's flag rule: boolean props (and `--name=…`) consume no following
|
|
20
|
+
token, everything else consumes the next token as its value — so `--title --help`
|
|
21
|
+
passes `--help` as the title value, not a help request.
|
|
22
|
+
*/
|
|
23
|
+
function commandArgvRequestsHelp(
|
|
24
|
+
argvTail: string[],
|
|
25
|
+
jsonSchema: Record<string, unknown> | undefined,
|
|
26
|
+
): boolean {
|
|
27
|
+
const properties =
|
|
28
|
+
(jsonSchema?.properties as Record<string, { type?: string }> | undefined) ?? {}
|
|
29
|
+
for (let index = 0; index < argvTail.length; index += 1) {
|
|
30
|
+
const token = argvTail[index] as string
|
|
31
|
+
if (isHelpFlag(token)) {
|
|
32
|
+
return true
|
|
33
|
+
}
|
|
34
|
+
if (!token.startsWith('--')) {
|
|
35
|
+
continue
|
|
36
|
+
}
|
|
37
|
+
if (token === '--json') {
|
|
38
|
+
index += 1 // consumes its value
|
|
39
|
+
continue
|
|
40
|
+
}
|
|
41
|
+
const rawName = token.slice('--'.length)
|
|
42
|
+
if (rawName.includes('=')) {
|
|
43
|
+
continue // inline value, consumes no following token
|
|
44
|
+
}
|
|
45
|
+
const name = rawName.startsWith('no-') ? rawName.slice('no-'.length) : rawName
|
|
46
|
+
if (properties[name]?.type !== 'boolean') {
|
|
47
|
+
index += 1 // a value-expecting flag consumes the next token
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return false
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/*
|
|
54
|
+
Top-level CLI driver for the standalone binary. The binary is a thin remote client
|
|
55
|
+
— it carries no handler code, so it always talks to a running server over HTTP, but
|
|
56
|
+
it can boot one: the full binary ships the server beside it, so `/start` spawns a
|
|
57
|
+
local instance. One rule governs the first positional — `/` manages the connection,
|
|
58
|
+
a bare word runs a command:
|
|
59
|
+
|
|
60
|
+
--help / -h → top-level help
|
|
61
|
+
/help [cmd] → help (per-command with an arg)
|
|
62
|
+
(none) + TTY → interactive session, resuming the saved connection
|
|
63
|
+
(none) + non-TTY → top-level help (scripts use `<cmd>` one-shot)
|
|
64
|
+
/connect <url> → connect to a remote server, open a session
|
|
65
|
+
/start → boot a local instance, open a session
|
|
66
|
+
/disconnect → forget the saved connection, exit
|
|
67
|
+
<cmd> [--flags] → one-shot RPC against the resumed target
|
|
68
|
+
|
|
69
|
+
The connection verbs are `/`-prefixed only — no bare aliases — so a bare word is
|
|
70
|
+
always an RPC command and never collides. Env layers ABIDE_APP_URL/ABIDE_APP_TOKEN (shell >
|
|
71
|
+
data-dir > binary-dir) supply the baked default a fresh download resumes against.
|
|
72
|
+
*/
|
|
73
|
+
export async function runCli({
|
|
74
|
+
programName,
|
|
75
|
+
manifest,
|
|
76
|
+
banner = '',
|
|
77
|
+
footer = '',
|
|
78
|
+
argv,
|
|
79
|
+
}: {
|
|
80
|
+
programName: string
|
|
81
|
+
manifest: CliManifest
|
|
82
|
+
banner?: string
|
|
83
|
+
footer?: string
|
|
84
|
+
argv: string[]
|
|
85
|
+
}): Promise<number> {
|
|
86
|
+
await loadEnvFromDataDir(programName)
|
|
87
|
+
await loadEnvFromBinaryDir()
|
|
88
|
+
|
|
89
|
+
const first = argv[0]
|
|
90
|
+
|
|
91
|
+
// Explicit help, top-level and per-command.
|
|
92
|
+
if (first && isHelpFlag(first)) {
|
|
93
|
+
printTopLevelHelp(programName, manifest, banner, footer)
|
|
94
|
+
return 0
|
|
95
|
+
}
|
|
96
|
+
if (first === '/help') {
|
|
97
|
+
if (argv[1]) {
|
|
98
|
+
printCommandHelp(programName, argv[1], manifest)
|
|
99
|
+
} else {
|
|
100
|
+
printTopLevelHelp(programName, manifest, banner, footer)
|
|
101
|
+
}
|
|
102
|
+
return 0
|
|
103
|
+
}
|
|
104
|
+
if (first && commandArgvRequestsHelp(argv.slice(1), manifest[first]?.jsonSchema)) {
|
|
105
|
+
printCommandHelp(programName, first, manifest)
|
|
106
|
+
return 0
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// No command: interactive session on a TTY, help otherwise (scripts/pipes).
|
|
110
|
+
if (!first) {
|
|
111
|
+
if (!process.stdin.isTTY) {
|
|
112
|
+
printTopLevelHelp(programName, manifest, banner, footer)
|
|
113
|
+
return 0
|
|
114
|
+
}
|
|
115
|
+
printTrimmed(banner)
|
|
116
|
+
const target = await resolveCliTarget(programName)
|
|
117
|
+
return runSession({ programName, manifest, footer, target })
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Disconnect (reset): clear the saved connection and exit.
|
|
121
|
+
if (first === '/disconnect') {
|
|
122
|
+
await clearLastConnection(programName)
|
|
123
|
+
console.log('disconnected')
|
|
124
|
+
return 0
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Connect to a remote server, then open a session.
|
|
128
|
+
if (first === '/connect') {
|
|
129
|
+
const url = argv[1]
|
|
130
|
+
if (!url) {
|
|
131
|
+
console.error(`${programName}: /connect requires a url`)
|
|
132
|
+
return 1
|
|
133
|
+
}
|
|
134
|
+
printTrimmed(banner)
|
|
135
|
+
const target = await connectToServer(programName, url)
|
|
136
|
+
if (!target) {
|
|
137
|
+
return 1
|
|
138
|
+
}
|
|
139
|
+
return runSession({ programName, manifest, footer, target })
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Start a local instance, then open a session.
|
|
143
|
+
if (first === '/start') {
|
|
144
|
+
printTrimmed(banner)
|
|
145
|
+
let target: CliTarget
|
|
146
|
+
try {
|
|
147
|
+
target = await startLocalInstance(programName)
|
|
148
|
+
} catch (error) {
|
|
149
|
+
console.error(
|
|
150
|
+
`${programName}: ${error instanceof Error ? error.message : String(error)}`,
|
|
151
|
+
)
|
|
152
|
+
return 1
|
|
153
|
+
}
|
|
154
|
+
return runSession({ programName, manifest, footer, target })
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// One-shot RPC dispatch (scripting): resolve the target without a session.
|
|
158
|
+
const target = await resolveCliTarget(programName)
|
|
159
|
+
if (!target) {
|
|
160
|
+
console.error(
|
|
161
|
+
`${programName}: not connected — run \`${programName} /connect <url>\` or \`${programName} /start\``,
|
|
162
|
+
)
|
|
163
|
+
return 1
|
|
164
|
+
}
|
|
165
|
+
const code = await dispatchCommand({
|
|
166
|
+
programName,
|
|
167
|
+
manifest,
|
|
168
|
+
command: first,
|
|
169
|
+
argvTail: argv.slice(1),
|
|
170
|
+
url: target.url,
|
|
171
|
+
token: target.token,
|
|
172
|
+
})
|
|
173
|
+
// Reap any local instance booted just to resolve the target.
|
|
174
|
+
target.child?.kill()
|
|
175
|
+
return code
|
|
176
|
+
}
|