@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,295 @@
|
|
|
1
|
+
import { promptRegistry } from '../server/prompts/promptRegistry.ts'
|
|
2
|
+
import { dispatchVerbInProcess } from '../server/rpc/dispatchVerbInProcess.ts'
|
|
3
|
+
import { findVerbByCommandName } from '../server/rpc/findVerbByCommandName.ts'
|
|
4
|
+
import { verbRegistry } from '../server/rpc/verbRegistry.ts'
|
|
5
|
+
import { socketOperations } from '../server/sockets/socketOperations.ts'
|
|
6
|
+
import { socketRegistry } from '../server/sockets/socketRegistry.ts'
|
|
7
|
+
import { abideLog } from '../shared/abideLog.ts'
|
|
8
|
+
import { commandNameForUrl } from '../shared/commandNameForUrl.ts'
|
|
9
|
+
import { forwardHeaders } from '../shared/forwardHeaders.ts'
|
|
10
|
+
import { jsonSchemaForSchema } from '../shared/jsonSchemaForSchema.ts'
|
|
11
|
+
import { annotationsForMethod } from './annotationsForMethod.ts'
|
|
12
|
+
import { getMcpResourceServer } from './mcpResourceServerSlot.ts'
|
|
13
|
+
import { toolResultFromResponse } from './toolResultFromResponse.ts'
|
|
14
|
+
import type { McpResourceContents } from './types/McpResourceContents.ts'
|
|
15
|
+
import type { McpResourceDescriptor } from './types/McpResourceDescriptor.ts'
|
|
16
|
+
|
|
17
|
+
/*
|
|
18
|
+
The app's MCP surface, projected for in-process consumers. This is the single
|
|
19
|
+
source of truth dispatchMcpRequest (the JSON-RPC-over-HTTP transport) and the
|
|
20
|
+
in-app agent loop (abide/server/agent) both build on — the same tool/prompt/
|
|
21
|
+
resource derivation, so a model reaching the app over HTTP and a model driven
|
|
22
|
+
in-process can't drift on what's exposed.
|
|
23
|
+
|
|
24
|
+
Internal: there is no package export. The public entry is `agent()`, which
|
|
25
|
+
calls `mcpSurface(request)` to hand an engine the gated tool set.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
export type ToolDescriptor = {
|
|
29
|
+
name: string
|
|
30
|
+
description: string
|
|
31
|
+
inputSchema: Record<string, unknown>
|
|
32
|
+
outputSchema?: Record<string, unknown>
|
|
33
|
+
annotations?: Record<string, boolean>
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export type PromptDescriptor = {
|
|
37
|
+
name: string
|
|
38
|
+
description?: string
|
|
39
|
+
arguments: Array<{ name: string; description?: string; required: boolean }>
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// The MCP tools/call result shape (a text content block plus optional structuredContent).
|
|
43
|
+
export type ToolResult = Record<string, unknown>
|
|
44
|
+
|
|
45
|
+
// A prompt rendered to plain messages — the user turn(s) that seed a conversation.
|
|
46
|
+
export type PromptMessage = { role: 'user'; text: string }
|
|
47
|
+
|
|
48
|
+
export type McpSurface = {
|
|
49
|
+
tools: ToolDescriptor[]
|
|
50
|
+
call(name: string, args: Record<string, unknown> | undefined): Promise<ToolResult>
|
|
51
|
+
prompts: PromptDescriptor[]
|
|
52
|
+
getPrompt(name: string, args?: Record<string, unknown>): PromptMessage[]
|
|
53
|
+
listResources(): Promise<McpResourceDescriptor[]>
|
|
54
|
+
readResource(uri: string): Promise<McpResourceContents | undefined>
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/*
|
|
58
|
+
Builds the array of MCP tool descriptors.
|
|
59
|
+
|
|
60
|
+
RPCs: every verb with clients.mcp=true becomes one tool named after the
|
|
61
|
+
export's URL (folder segments joined with `-`). The HTTP verb feeds the
|
|
62
|
+
tool's annotations (readOnlyHint / destructiveHint / idempotentHint) so
|
|
63
|
+
a model can tell a read from a write; reads auto-expose while mutating
|
|
64
|
+
verbs require an explicit clients.mcp (see resolveClientFlags). When the
|
|
65
|
+
verb declares an `outputSchema` it's advertised as the tool outputSchema.
|
|
66
|
+
|
|
67
|
+
Sockets: every socket with clients.mcp=true contributes a `<base>-tail`
|
|
68
|
+
read tool (recent buffered messages) and, when clientPublish is set, a
|
|
69
|
+
`<base>-publish` tool.
|
|
70
|
+
*/
|
|
71
|
+
export function buildTools(): ToolDescriptor[] {
|
|
72
|
+
const tools: ToolDescriptor[] = []
|
|
73
|
+
for (const entry of verbRegistry.values()) {
|
|
74
|
+
if (!entry.clients.mcp) {
|
|
75
|
+
continue
|
|
76
|
+
}
|
|
77
|
+
/*
|
|
78
|
+
Tool description favours the schema's top-level description (the
|
|
79
|
+
vendor's JSON Schema conversion carries `.describe(...)` through),
|
|
80
|
+
falling back to `method url` so the tool is still labelled when
|
|
81
|
+
the schema has none.
|
|
82
|
+
*/
|
|
83
|
+
const inputSchema = jsonSchemaForSchema(entry.inputSchema)
|
|
84
|
+
const tool: ToolDescriptor = {
|
|
85
|
+
name: commandNameForUrl(entry.remote.url),
|
|
86
|
+
description:
|
|
87
|
+
(inputSchema.description as string | undefined) ??
|
|
88
|
+
`${entry.remote.method} ${entry.remote.url}`,
|
|
89
|
+
inputSchema,
|
|
90
|
+
annotations: annotationsForMethod(entry.remote.method),
|
|
91
|
+
}
|
|
92
|
+
if (entry.outputSchema) {
|
|
93
|
+
tool.outputSchema = jsonSchemaForSchema(entry.outputSchema)
|
|
94
|
+
}
|
|
95
|
+
tools.push(tool)
|
|
96
|
+
}
|
|
97
|
+
for (const entry of socketRegistry.values()) {
|
|
98
|
+
if (!entry.clients.mcp) {
|
|
99
|
+
continue
|
|
100
|
+
}
|
|
101
|
+
const payloadSchema = jsonSchemaForSchema(entry.schema)
|
|
102
|
+
for (const operation of socketOperations(entry)) {
|
|
103
|
+
if (operation.kind === 'tail') {
|
|
104
|
+
tools.push({
|
|
105
|
+
name: operation.name,
|
|
106
|
+
description: `Read recent messages from the "${operation.socketName}" socket`,
|
|
107
|
+
inputSchema: {
|
|
108
|
+
type: 'object',
|
|
109
|
+
properties: {
|
|
110
|
+
count: { type: 'number', description: 'max recent messages to return' },
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
outputSchema: {
|
|
114
|
+
type: 'object',
|
|
115
|
+
properties: { frames: { type: 'array', items: payloadSchema } },
|
|
116
|
+
},
|
|
117
|
+
annotations: { readOnlyHint: true, destructiveHint: false },
|
|
118
|
+
})
|
|
119
|
+
continue
|
|
120
|
+
}
|
|
121
|
+
tools.push({
|
|
122
|
+
name: operation.name,
|
|
123
|
+
description: `Publish a message to the "${operation.socketName}" socket`,
|
|
124
|
+
inputSchema: payloadSchema,
|
|
125
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false },
|
|
126
|
+
})
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return tools
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/*
|
|
133
|
+
MCP prompts derived from src/mcp/prompts. Arguments come from the JSON
|
|
134
|
+
Schema the resolver built from each prompt's frontmatter `arguments` list
|
|
135
|
+
(top-level properties + required flags); the model fills them in and the
|
|
136
|
+
framework interpolates them into the body on getPrompt.
|
|
137
|
+
*/
|
|
138
|
+
export function buildPrompts(): PromptDescriptor[] {
|
|
139
|
+
return Array.from(promptRegistry.values()).map((entry) => {
|
|
140
|
+
const jsonSchema = entry.jsonSchema ?? {}
|
|
141
|
+
const properties = (jsonSchema.properties ?? {}) as Record<string, { description?: string }>
|
|
142
|
+
const required = new Set((jsonSchema.required as string[] | undefined) ?? [])
|
|
143
|
+
return {
|
|
144
|
+
name: entry.prompt.name,
|
|
145
|
+
...(entry.prompt.description ? { description: entry.prompt.description } : {}),
|
|
146
|
+
arguments: Object.entries(properties).map(([argName, prop]) => ({
|
|
147
|
+
name: argName,
|
|
148
|
+
...(prop?.description ? { description: prop.description } : {}),
|
|
149
|
+
required: required.has(argName),
|
|
150
|
+
})),
|
|
151
|
+
}
|
|
152
|
+
})
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/* MCP tool-dispatch spans, opt-in via DEBUG=abide:mcp — a model's tool call,
|
|
156
|
+
wrapping the underlying verb dispatch in the same trace. */
|
|
157
|
+
const mcpLog = abideLog.channel('abide:mcp')
|
|
158
|
+
|
|
159
|
+
function textResult(text: string, isError = false): ToolResult {
|
|
160
|
+
return { content: [{ type: 'text', text }], ...(isError ? { isError: true } : {}) }
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/*
|
|
164
|
+
Dispatches the socket tail / publish tools by matching the tool name
|
|
165
|
+
against each mcp-exposed socket's operations (socketOperations is the same
|
|
166
|
+
projection tools/list advertised, so the publish op only exists when the
|
|
167
|
+
socket allows it). tail returns the retained tail (request/response
|
|
168
|
+
can't hold a live subscription); publish validates against the socket
|
|
169
|
+
schema and fans out. Returns undefined when the name isn't a known socket
|
|
170
|
+
tool so callTool can fall through to "unknown tool".
|
|
171
|
+
*/
|
|
172
|
+
function callSocketTool(
|
|
173
|
+
toolName: string,
|
|
174
|
+
args: Record<string, unknown> | undefined,
|
|
175
|
+
): ToolResult | undefined {
|
|
176
|
+
for (const entry of socketRegistry.values()) {
|
|
177
|
+
if (!entry.clients.mcp) {
|
|
178
|
+
continue
|
|
179
|
+
}
|
|
180
|
+
const operation = socketOperations(entry).find((op) => op.name === toolName)
|
|
181
|
+
if (!operation) {
|
|
182
|
+
continue
|
|
183
|
+
}
|
|
184
|
+
if (operation.kind === 'tail') {
|
|
185
|
+
const count = typeof args?.count === 'number' ? args.count : undefined
|
|
186
|
+
const frames = entry.snapshotTail(count)
|
|
187
|
+
return {
|
|
188
|
+
content: [{ type: 'text', text: frames.map((f) => JSON.stringify(f)).join('\n') }],
|
|
189
|
+
structuredContent: { frames },
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
try {
|
|
193
|
+
// publish() validates the payload against the socket schema and throws on failure.
|
|
194
|
+
entry.socket.publish(args)
|
|
195
|
+
} catch (error) {
|
|
196
|
+
return textResult(error instanceof Error ? error.message : String(error), true)
|
|
197
|
+
}
|
|
198
|
+
return textResult('ok')
|
|
199
|
+
}
|
|
200
|
+
return undefined
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/*
|
|
204
|
+
Tool dispatch. RPC tools synthesize a Request (with forwarded auth
|
|
205
|
+
headers from `inbound`) and pipe it through verb.fetch inside the request
|
|
206
|
+
scope — the same seam the HTTP router crosses, so validation, the handler,
|
|
207
|
+
and the request-scoped helpers (per-call cache(), cookies(), request())
|
|
208
|
+
behave identically. A handler throw is caught by the scope and framed as
|
|
209
|
+
an isError tool result (via the 500 response) rather than escaping. The
|
|
210
|
+
response (buffered or streaming) is framed by toolResultFromResponse.
|
|
211
|
+
Socket tools (`<base>-tail` / `<base>-publish`) fall through to the socket
|
|
212
|
+
dispatcher.
|
|
213
|
+
*/
|
|
214
|
+
export async function callTool(
|
|
215
|
+
toolName: string,
|
|
216
|
+
args: Record<string, unknown> | undefined,
|
|
217
|
+
inbound: Request,
|
|
218
|
+
): Promise<ToolResult> {
|
|
219
|
+
const entry = findVerbByCommandName(toolName)
|
|
220
|
+
if (entry) {
|
|
221
|
+
/* A verb owns this name. If it isn't mcp-exposed it's still unavailable —
|
|
222
|
+
don't fall through to a socket op that happens to share the name. */
|
|
223
|
+
if (!entry.clients.mcp) {
|
|
224
|
+
throw new Error(`unknown tool: ${toolName}`)
|
|
225
|
+
}
|
|
226
|
+
const response = await dispatchVerbInProcess({
|
|
227
|
+
remote: entry.remote,
|
|
228
|
+
args,
|
|
229
|
+
baseUrl: `${new URL(inbound.url).origin}/`,
|
|
230
|
+
headers: forwardHeaders(inbound.headers),
|
|
231
|
+
})
|
|
232
|
+
return toolResultFromResponse(response)
|
|
233
|
+
}
|
|
234
|
+
const socketResult = callSocketTool(toolName, args)
|
|
235
|
+
if (socketResult) {
|
|
236
|
+
return socketResult
|
|
237
|
+
}
|
|
238
|
+
throw new Error(`unknown tool: ${toolName}`)
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/*
|
|
242
|
+
Renders a prompt: looks it up, interpolates the caller's args, and returns its
|
|
243
|
+
optional description plus the message(s) that seed a conversation. A markdown
|
|
244
|
+
prompt is a single user turn whose text is the interpolated template. Throws on
|
|
245
|
+
an unknown prompt name. The one place prompt rendering lives — dispatchMcpRequest
|
|
246
|
+
wraps this in the prompts/get wire shape, the agent loop reads the messages plain.
|
|
247
|
+
*/
|
|
248
|
+
export function renderPrompt(
|
|
249
|
+
name: string,
|
|
250
|
+
args?: Record<string, unknown>,
|
|
251
|
+
): { description?: string; messages: PromptMessage[] } {
|
|
252
|
+
const entry = promptRegistry.get(name)
|
|
253
|
+
if (!entry) {
|
|
254
|
+
throw new Error(`unknown prompt: ${name}`)
|
|
255
|
+
}
|
|
256
|
+
return {
|
|
257
|
+
...(entry.prompt.description ? { description: entry.prompt.description } : {}),
|
|
258
|
+
messages: [
|
|
259
|
+
{ role: 'user', text: entry.prompt.render((args ?? {}) as Record<string, string>) },
|
|
260
|
+
],
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/*
|
|
265
|
+
Projects the app's MCP surface for an in-process consumer bound to `request`
|
|
266
|
+
— tool calls forward that request's auth headers into the verb handler, so
|
|
267
|
+
the model acts with the caller's identity. Used by `agent()`.
|
|
268
|
+
*/
|
|
269
|
+
export function mcpSurface(request: Request): McpSurface {
|
|
270
|
+
// Built on first read and memoized: an engine that advertises tools but never
|
|
271
|
+
// reads prompts (or reaches tools over HTTP, reading neither) skips the unused build.
|
|
272
|
+
let tools: ToolDescriptor[] | undefined
|
|
273
|
+
let prompts: PromptDescriptor[] | undefined
|
|
274
|
+
return {
|
|
275
|
+
get tools() {
|
|
276
|
+
tools ??= buildTools()
|
|
277
|
+
return tools
|
|
278
|
+
},
|
|
279
|
+
get prompts() {
|
|
280
|
+
prompts ??= buildPrompts()
|
|
281
|
+
return prompts
|
|
282
|
+
},
|
|
283
|
+
call: (name, args) => mcpLog.trace(`mcp ${name}`, () => callTool(name, args, request)),
|
|
284
|
+
/* The conversation-seeding messages, without the wire-shape wrapping. */
|
|
285
|
+
getPrompt: (name, args) => renderPrompt(name, args).messages,
|
|
286
|
+
async listResources() {
|
|
287
|
+
const server = getMcpResourceServer()
|
|
288
|
+
return server ? server.list() : []
|
|
289
|
+
},
|
|
290
|
+
async readResource(uri) {
|
|
291
|
+
const server = getMcpResourceServer()
|
|
292
|
+
return server ? server.read(uri) : undefined
|
|
293
|
+
},
|
|
294
|
+
}
|
|
295
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
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
|
+
|
|
6
|
+
// Frames a value as MCP text content — strings verbatim, everything else as JSON.
|
|
7
|
+
function asText(value: unknown): string {
|
|
8
|
+
return typeof value === 'string' ? value : JSON.stringify(value)
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/*
|
|
12
|
+
Turns an rpc/socket Response into an MCP `tools/call` result. Always
|
|
13
|
+
carries a `text` content block for backward compatibility; adds
|
|
14
|
+
`structuredContent` (an object, per the MCP spec) so models that
|
|
15
|
+
understand structured output get the typed value instead of a stringified
|
|
16
|
+
blob.
|
|
17
|
+
|
|
18
|
+
- non-2xx → { content:[text], isError:true }
|
|
19
|
+
- sse/jsonl body → drained frame-by-frame; structuredContent = { frames }.
|
|
20
|
+
A mid-stream error surfaces as isError with the
|
|
21
|
+
frames collected so far.
|
|
22
|
+
- object body → structuredContent = the object.
|
|
23
|
+
- array/primitive → text only (structuredContent must be an object).
|
|
24
|
+
*/
|
|
25
|
+
export async function toolResultFromResponse(response: Response): Promise<Record<string, unknown>> {
|
|
26
|
+
if (!response.ok) {
|
|
27
|
+
return {
|
|
28
|
+
content: [{ type: 'text', text: await responseErrorText(response) }],
|
|
29
|
+
isError: true,
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (isStreamingResponse(response)) {
|
|
34
|
+
const frames: unknown[] = []
|
|
35
|
+
try {
|
|
36
|
+
for await (const frame of streamResponse(response)) {
|
|
37
|
+
frames.push(frame)
|
|
38
|
+
}
|
|
39
|
+
} catch (error) {
|
|
40
|
+
return {
|
|
41
|
+
content: [
|
|
42
|
+
{ type: 'text', text: frames.map(asText).join('\n') },
|
|
43
|
+
{
|
|
44
|
+
type: 'text',
|
|
45
|
+
text: `stream error: ${error instanceof Error ? error.message : String(error)}`,
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
structuredContent: { frames },
|
|
49
|
+
isError: true,
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
content: [{ type: 'text', text: frames.map(asText).join('\n') }],
|
|
54
|
+
structuredContent: { frames },
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const body = await decodeResponse(response)
|
|
59
|
+
const result: Record<string, unknown> = {
|
|
60
|
+
content: [{ type: 'text', text: asText(body) }],
|
|
61
|
+
}
|
|
62
|
+
if (body !== null && typeof body === 'object' && !Array.isArray(body)) {
|
|
63
|
+
result.structuredContent = body
|
|
64
|
+
}
|
|
65
|
+
return result
|
|
66
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/*
|
|
2
|
+
JSON-RPC 2.0 request frame as MCP delivers it over Streamable HTTP. The
|
|
3
|
+
`id` is absent for notifications (which we don't currently receive from
|
|
4
|
+
clients but accept silently). `method` is a string like "tools/list" or
|
|
5
|
+
"resources/read".
|
|
6
|
+
*/
|
|
7
|
+
export type JsonRpcRequest = {
|
|
8
|
+
jsonrpc: '2.0'
|
|
9
|
+
id?: string | number
|
|
10
|
+
method: string
|
|
11
|
+
params?: Record<string, unknown>
|
|
12
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/*
|
|
2
|
+
JSON-RPC 2.0 response frame. Exactly one of `result` / `error` is set
|
|
3
|
+
per request. The `id` echoes the inbound request id (null when the
|
|
4
|
+
request id was malformed and the error is being returned).
|
|
5
|
+
*/
|
|
6
|
+
export type JsonRpcResponse =
|
|
7
|
+
| {
|
|
8
|
+
jsonrpc: '2.0'
|
|
9
|
+
id: string | number | null
|
|
10
|
+
result: unknown
|
|
11
|
+
}
|
|
12
|
+
| {
|
|
13
|
+
jsonrpc: '2.0'
|
|
14
|
+
id: string | number | null
|
|
15
|
+
error: {
|
|
16
|
+
code: number
|
|
17
|
+
message: string
|
|
18
|
+
data?: unknown
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/*
|
|
2
|
+
One entry in an MCP resources/read result. Text-typed resources carry `text`;
|
|
3
|
+
everything else carries base64 `blob` — exactly one is present.
|
|
4
|
+
*/
|
|
5
|
+
export type McpResourceContents = {
|
|
6
|
+
uri: string
|
|
7
|
+
mimeType: string
|
|
8
|
+
text?: string
|
|
9
|
+
blob?: string
|
|
10
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { McpResourceContents } from './McpResourceContents.ts'
|
|
2
|
+
import type { McpResourceDescriptor } from './McpResourceDescriptor.ts'
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
Serves the project's src/mcp/resources files to the MCP dispatcher. `list`
|
|
6
|
+
backs resources/list; `read` backs resources/read and resolves to undefined
|
|
7
|
+
for an unknown uri.
|
|
8
|
+
*/
|
|
9
|
+
export type McpResourceServer = {
|
|
10
|
+
list(): Promise<McpResourceDescriptor[]>
|
|
11
|
+
read(uri: string): Promise<McpResourceContents | undefined>
|
|
12
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Public shape returned by createMcpServer. The bun route handler at
|
|
3
|
+
/__abide/mcp delegates inbound requests to `handle(request)`, which
|
|
4
|
+
parses the JSON-RPC envelope, dispatches to tools/resources, and returns
|
|
5
|
+
a Response carrying the JSON-RPC reply.
|
|
6
|
+
*/
|
|
7
|
+
export type McpServer = {
|
|
8
|
+
handle(request: Request): Promise<Response>
|
|
9
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/*
|
|
2
|
+
User-facing options for createMcpServer. All fields optional — the
|
|
3
|
+
zero-arg call works for any abide project (server info is derived from
|
|
4
|
+
package.json by the bundler when MCP is wired into createServer).
|
|
5
|
+
|
|
6
|
+
- `name` / `version`: identify the server in the MCP `initialize`
|
|
7
|
+
response. Defaults come from the project's package.json.
|
|
8
|
+
- `authorize`: optional boundary check. Runs once per MCP request before
|
|
9
|
+
any tool/resource dispatch. Throw HttpError (or any Error) to reject.
|
|
10
|
+
Per-tool authorization stays in the underlying verb handler.
|
|
11
|
+
*/
|
|
12
|
+
export type McpServerOptions = {
|
|
13
|
+
name?: string
|
|
14
|
+
version?: string
|
|
15
|
+
authorize?: (request: Request) => Promise<void> | void
|
|
16
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { Server } from 'bun'
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
Optional hooks exported from src/app.ts. All hooks are optional; defaults
|
|
5
|
+
kick in when an export is missing. init returns an optional cleanup
|
|
6
|
+
function that runs on SIGINT/SIGTERM. handle is single-middleware with
|
|
7
|
+
next so user code can mutate the response or branch on the URL.
|
|
8
|
+
|
|
9
|
+
WebSockets are not exposed here — abide's only native WebSocket
|
|
10
|
+
surface is the sockets hub (see `abide/server/socket`), multiplexed onto a
|
|
11
|
+
single framework-owned connection per client at `/__abide/sockets`.
|
|
12
|
+
Inside request scopes, the live Bun.Server is reachable via the
|
|
13
|
+
exported `server()` function from `abide/server`; `init` receives it
|
|
14
|
+
explicitly because it runs outside a request.
|
|
15
|
+
*/
|
|
16
|
+
// @readme plumbing
|
|
17
|
+
export type AppModule = {
|
|
18
|
+
/*
|
|
19
|
+
Extra inbound header names to forward onto in-process rpc Requests, on
|
|
20
|
+
top of abide's built-in auth/identity set (cookie, authorization, the
|
|
21
|
+
x-forwarded-* hints). Names a handler reads during SSR or an MCP call
|
|
22
|
+
that aren't in the default allowlist — e.g. 'accept-language',
|
|
23
|
+
'x-request-id', a custom 'x-tenant-id'. Case-insensitive.
|
|
24
|
+
*/
|
|
25
|
+
forwardHeaders?: string[]
|
|
26
|
+
init?: (ctx: {
|
|
27
|
+
server: Server<unknown>
|
|
28
|
+
}) => void | (() => void | Promise<void>) | Promise<void | (() => void | Promise<void>)>
|
|
29
|
+
handle?: (
|
|
30
|
+
request: Request,
|
|
31
|
+
next: (req: Request) => Promise<Response>,
|
|
32
|
+
) => Promise<Response> | Response
|
|
33
|
+
handleError?: (error: unknown, request: Request) => Promise<Response> | Response
|
|
34
|
+
/*
|
|
35
|
+
App fields merged into the /__abide/health payload the client `health()`
|
|
36
|
+
polls — e.g. `{ authenticated: await sessionValid(request) }`. Runs ahead
|
|
37
|
+
of `handle` (the endpoint must answer without auth — reporting
|
|
38
|
+
"authenticated: false" requires exactly that), so the request arrives
|
|
39
|
+
unfiltered: cookies are readable, nothing is guaranteed valid. The
|
|
40
|
+
payload is public and unauthenticated — never put secrets in it. The
|
|
41
|
+
framework's identity keys (abide/name/version) win on collision; a
|
|
42
|
+
thrown hook is logged and the base payload still serves, so an app bug
|
|
43
|
+
can't masquerade as an unreachable server. Keep it cheap: the client
|
|
44
|
+
probe times out at 5s.
|
|
45
|
+
*/
|
|
46
|
+
health?: (request: Request) => unknown | Promise<unknown>
|
|
47
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { VerbHelper } from './rpc/types/VerbHelper.ts'
|
|
2
|
+
import { unprocessed } from './rpc/unprocessed.ts'
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
DELETE verb helper. The bundler rewrites every `export const x = DELETE(fn)` inside
|
|
6
|
+
`src/server/rpc/<file>.ts` into a defineVerb call (server target) or a
|
|
7
|
+
remoteProxy stub (client target). Calling this directly throws.
|
|
8
|
+
*/
|
|
9
|
+
// @readme rpc
|
|
10
|
+
export const DELETE: VerbHelper = (_fn: any, _opts?: any) => unprocessed('DELETE')
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { VerbHelper } from './rpc/types/VerbHelper.ts'
|
|
2
|
+
import { unprocessed } from './rpc/unprocessed.ts'
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
GET verb helper. The bundler rewrites every `export const x = GET(fn)` inside
|
|
6
|
+
`src/server/rpc/<file>.ts` into a defineVerb call (server target) or a
|
|
7
|
+
remoteProxy stub (client target). Calling this directly throws.
|
|
8
|
+
*/
|
|
9
|
+
// @readme rpc
|
|
10
|
+
export const GET: VerbHelper = (_fn: any, _opts?: any) => unprocessed('GET')
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { VerbHelper } from './rpc/types/VerbHelper.ts'
|
|
2
|
+
import { unprocessed } from './rpc/unprocessed.ts'
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
HEAD verb helper. The bundler rewrites every `export const x = HEAD(fn)` inside
|
|
6
|
+
`src/server/rpc/<file>.ts` into a defineVerb call (server target) or a
|
|
7
|
+
remoteProxy stub (client target). Calling this directly throws.
|
|
8
|
+
*/
|
|
9
|
+
// @readme rpc
|
|
10
|
+
export const HEAD: VerbHelper = (_fn: any, _opts?: any) => unprocessed('HEAD')
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { VerbHelper } from './rpc/types/VerbHelper.ts'
|
|
2
|
+
import { unprocessed } from './rpc/unprocessed.ts'
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
PATCH verb helper. The bundler rewrites every `export const x = PATCH(fn)` inside
|
|
6
|
+
`src/server/rpc/<file>.ts` into a defineVerb call (server target) or a
|
|
7
|
+
remoteProxy stub (client target). Calling this directly throws.
|
|
8
|
+
*/
|
|
9
|
+
// @readme rpc
|
|
10
|
+
export const PATCH: VerbHelper = (_fn: any, _opts?: any) => unprocessed('PATCH')
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { VerbHelper } from './rpc/types/VerbHelper.ts'
|
|
2
|
+
import { unprocessed } from './rpc/unprocessed.ts'
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
POST verb helper. The bundler rewrites every `export const x = POST(fn)` inside
|
|
6
|
+
`src/server/rpc/<file>.ts` into a defineVerb call (server target) or a
|
|
7
|
+
remoteProxy stub (client target). Calling this directly throws.
|
|
8
|
+
*/
|
|
9
|
+
// @readme rpc
|
|
10
|
+
export const POST: VerbHelper = (_fn: any, _opts?: any) => unprocessed('POST')
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { VerbHelper } from './rpc/types/VerbHelper.ts'
|
|
2
|
+
import { unprocessed } from './rpc/unprocessed.ts'
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
PUT verb helper. The bundler rewrites every `export const x = PUT(fn)` inside
|
|
6
|
+
`src/server/rpc/<file>.ts` into a defineVerb call (server target) or a
|
|
7
|
+
remoteProxy stub (client target). Calling this directly throws.
|
|
8
|
+
*/
|
|
9
|
+
// @readme rpc
|
|
10
|
+
export const PUT: VerbHelper = (_fn: any, _opts?: any) => unprocessed('PUT')
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { McpSurface } from '../mcp/mcpSurface.ts'
|
|
2
|
+
import { mcpSurface } from '../mcp/mcpSurface.ts'
|
|
3
|
+
import { request } from './request.ts'
|
|
4
|
+
|
|
5
|
+
/*
|
|
6
|
+
The in-app agent surface. `agent(engine, messages)` runs a model engine
|
|
7
|
+
against the app's own MCP surface and returns the engine's frame stream —
|
|
8
|
+
it does NOT pick a transport. The handler wraps it in `jsonl()` or `sse()`,
|
|
9
|
+
so consumption is the app's choice, same as any other streaming verb:
|
|
10
|
+
|
|
11
|
+
// src/server/rpc/chat.ts
|
|
12
|
+
import { agent } from '@abide/abide/server/agent'
|
|
13
|
+
import { jsonl } from '@abide/abide/server/jsonl'
|
|
14
|
+
import { engine } from '@abide/anthropic'
|
|
15
|
+
|
|
16
|
+
const chatEngine = engine({ model: 'claude-opus-4-8', apiKey: config.ANTHROPIC_API_KEY })
|
|
17
|
+
export const chat = POST(({ messages }) => jsonl(agent(chatEngine, messages)), { inputSchema })
|
|
18
|
+
|
|
19
|
+
The engine — provider-specific, lives in a `@abide/<provider>` package —
|
|
20
|
+
only sees the surface in and yields frames out, so swapping providers never
|
|
21
|
+
touches the verb or the UI.
|
|
22
|
+
|
|
23
|
+
Permission is decided server-side, not negotiated at runtime: the surface
|
|
24
|
+
is already gated by each verb's `clients.mcp` declaration plus its own
|
|
25
|
+
per-call handler auth, and any provider built-ins (e.g. Claude Code's bash
|
|
26
|
+
tool) are fenced by static rules in the engine's config.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
// A turn in the conversation, provider-neutral. The engine maps these to its provider's wire shape.
|
|
30
|
+
// @readme agent
|
|
31
|
+
export type NeutralMessage =
|
|
32
|
+
| { role: 'user'; text: string }
|
|
33
|
+
| {
|
|
34
|
+
role: 'assistant'
|
|
35
|
+
text?: string
|
|
36
|
+
toolUses?: { id: string; name: string; input: unknown }[]
|
|
37
|
+
}
|
|
38
|
+
| { role: 'tool'; results: { id: string; content: string; isError?: boolean }[] }
|
|
39
|
+
|
|
40
|
+
// What the engine streams out; the handler frames it via jsonl()/sse() for the client.
|
|
41
|
+
export type AgentFrame =
|
|
42
|
+
| { type: 'text'; delta: string }
|
|
43
|
+
| { type: 'tool_use'; id: string; name: string; input: unknown }
|
|
44
|
+
| { type: 'tool_result'; id: string; name: string; ok: boolean }
|
|
45
|
+
/*
|
|
46
|
+
`stop` is the reason the engine's loop ended. `error` covers an abnormal
|
|
47
|
+
stop the model didn't choose — a provider error/limit (e.g. Claude Code's
|
|
48
|
+
max-turns) or the engine's own tool-loop cap — so a client can tell a cut-off
|
|
49
|
+
answer from a clean `end`.
|
|
50
|
+
*/
|
|
51
|
+
| {
|
|
52
|
+
type: 'done'
|
|
53
|
+
stop: 'end' | 'tool_use' | 'max_tokens' | 'refusal' | 'error'
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// The app's tool/prompt/resource surface handed to an engine (already gated).
|
|
57
|
+
export type AgentSurface = McpSurface
|
|
58
|
+
|
|
59
|
+
/*
|
|
60
|
+
A model engine: surface + conversation in, frames out. It owns its own loop
|
|
61
|
+
(a raw-model tool loop, or driving a full agent harness) — core only sees
|
|
62
|
+
the frame stream. `origin` lets engines that reach the MCP endpoint over
|
|
63
|
+
HTTP address this server. Implementations live in `@abide/<provider>`
|
|
64
|
+
packages.
|
|
65
|
+
*/
|
|
66
|
+
export type AgentEngine = (input: {
|
|
67
|
+
surface: AgentSurface
|
|
68
|
+
messages: NeutralMessage[]
|
|
69
|
+
origin: string
|
|
70
|
+
}) => AsyncIterable<AgentFrame>
|
|
71
|
+
|
|
72
|
+
/*
|
|
73
|
+
Runs an engine against the current request's MCP surface and returns its
|
|
74
|
+
AgentFrame stream. Must be called inside a verb's request scope —
|
|
75
|
+
mcpSurface() forwards the caller's auth into every tool dispatch. The
|
|
76
|
+
handler chooses the transport: `jsonl(agent(engine, messages))` or
|
|
77
|
+
`sse(agent(engine, messages))`.
|
|
78
|
+
*/
|
|
79
|
+
export function agent(engine: AgentEngine, messages: NeutralMessage[]): AsyncIterable<AgentFrame> {
|
|
80
|
+
const inbound = request()
|
|
81
|
+
return engine({
|
|
82
|
+
surface: mcpSurface(inbound),
|
|
83
|
+
messages,
|
|
84
|
+
origin: new URL(inbound.url).origin,
|
|
85
|
+
})
|
|
86
|
+
}
|