@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.
Files changed (562) hide show
  1. package/CHANGELOG.md +607 -0
  2. package/LICENSE +21 -0
  3. package/README.md +154 -0
  4. package/bin/abide.ts +212 -0
  5. package/package.json +155 -0
  6. package/src/abideLsp.ts +211 -0
  7. package/src/abideModules.d.ts +8 -0
  8. package/src/abideResolverPlugin.ts +923 -0
  9. package/src/appEntry.ts +151 -0
  10. package/src/assets/app.html +12 -0
  11. package/src/build.ts +143 -0
  12. package/src/buildCli.ts +127 -0
  13. package/src/buildDisconnected.ts +118 -0
  14. package/src/bundleApp.ts +147 -0
  15. package/src/bundleDisconnectedEntry.ts +14 -0
  16. package/src/checkAbide.ts +77 -0
  17. package/src/cliEntry.ts +25 -0
  18. package/src/clientBuildPlugins.ts +33 -0
  19. package/src/clientEntry.ts +17 -0
  20. package/src/compile.ts +63 -0
  21. package/src/controlServerWorker.ts +426 -0
  22. package/src/devEntry.ts +250 -0
  23. package/src/discoveryEntry.ts +81 -0
  24. package/src/lib/bundle/BundleMenu.ts +12 -0
  25. package/src/lib/bundle/BundleMenuItem.ts +25 -0
  26. package/src/lib/bundle/BundleWindow.ts +37 -0
  27. package/src/lib/bundle/WEBVIEW_BUILD_REVISION.ts +9 -0
  28. package/src/lib/bundle/WEBVIEW_VERSION.ts +7 -0
  29. package/src/lib/bundle/bindConnectedFlag.ts +29 -0
  30. package/src/lib/bundle/bindRequestNavigate.ts +34 -0
  31. package/src/lib/bundle/buildWebviewLib.ts +111 -0
  32. package/src/lib/bundle/bundled.ts +35 -0
  33. package/src/lib/bundle/disconnected.abide +236 -0
  34. package/src/lib/bundle/disconnected.css +9 -0
  35. package/src/lib/bundle/ensureWebviewLib.ts +20 -0
  36. package/src/lib/bundle/exitWithParent.ts +28 -0
  37. package/src/lib/bundle/infoPlist.ts +46 -0
  38. package/src/lib/bundle/installDownloads.ts +24 -0
  39. package/src/lib/bundle/installMacMenu.ts +39 -0
  40. package/src/lib/bundle/listenLocalControlServer.ts +19 -0
  41. package/src/lib/bundle/native/abideMenu.mm +422 -0
  42. package/src/lib/bundle/native/webview.h +4557 -0
  43. package/src/lib/bundle/onMenu.ts +42 -0
  44. package/src/lib/bundle/openWebview.ts +104 -0
  45. package/src/lib/bundle/pngToIcns.ts +47 -0
  46. package/src/lib/bundle/probeAbideServer.ts +57 -0
  47. package/src/lib/bundle/resolveServerBinary.ts +12 -0
  48. package/src/lib/bundle/resolveWebviewLib.ts +53 -0
  49. package/src/lib/bundle/serverBinaryFilename.ts +8 -0
  50. package/src/lib/bundle/signMacApp.ts +37 -0
  51. package/src/lib/bundle/spawnEmbeddedServer.ts +64 -0
  52. package/src/lib/bundle/stableLocalPort.ts +19 -0
  53. package/src/lib/bundle/waitForServer.ts +23 -0
  54. package/src/lib/bundle/webviewCachePath.ts +23 -0
  55. package/src/lib/bundle/webviewLibName.ts +11 -0
  56. package/src/lib/cli/connectToServer.ts +23 -0
  57. package/src/lib/cli/createClient.ts +108 -0
  58. package/src/lib/cli/dispatchCommand.ts +71 -0
  59. package/src/lib/cli/loadEnvFromBinaryDir.ts +15 -0
  60. package/src/lib/cli/parseArgvForRpc.ts +100 -0
  61. package/src/lib/cli/printHelp.ts +119 -0
  62. package/src/lib/cli/printSessionHelp.ts +27 -0
  63. package/src/lib/cli/printSessionStatus.ts +21 -0
  64. package/src/lib/cli/printTrimmed.ts +8 -0
  65. package/src/lib/cli/printValue.ts +10 -0
  66. package/src/lib/cli/resolveCliTarget.ts +48 -0
  67. package/src/lib/cli/runCli.ts +176 -0
  68. package/src/lib/cli/runSession.ts +108 -0
  69. package/src/lib/cli/startLocalInstance.ts +14 -0
  70. package/src/lib/cli/tokenizeLine.ts +51 -0
  71. package/src/lib/cli/types/CliManifest.ts +9 -0
  72. package/src/lib/cli/types/CliManifestEntry.ts +17 -0
  73. package/src/lib/cli/types/CliTarget.ts +13 -0
  74. package/src/lib/mcp/annotationsForMethod.ts +29 -0
  75. package/src/lib/mcp/createMcpResourceServer.ts +102 -0
  76. package/src/lib/mcp/createMcpServer.ts +48 -0
  77. package/src/lib/mcp/dispatchMcpRequest.ts +138 -0
  78. package/src/lib/mcp/mcpResourceServerSlot.ts +18 -0
  79. package/src/lib/mcp/mcpSurface.ts +295 -0
  80. package/src/lib/mcp/toolResultFromResponse.ts +66 -0
  81. package/src/lib/mcp/types/JsonRpcRequest.ts +12 -0
  82. package/src/lib/mcp/types/JsonRpcResponse.ts +20 -0
  83. package/src/lib/mcp/types/McpResourceContents.ts +10 -0
  84. package/src/lib/mcp/types/McpResourceDescriptor.ts +6 -0
  85. package/src/lib/mcp/types/McpResourceServer.ts +12 -0
  86. package/src/lib/mcp/types/McpServer.ts +9 -0
  87. package/src/lib/mcp/types/McpServerOptions.ts +16 -0
  88. package/src/lib/server/AppModule.ts +47 -0
  89. package/src/lib/server/DELETE.ts +10 -0
  90. package/src/lib/server/GET.ts +10 -0
  91. package/src/lib/server/HEAD.ts +10 -0
  92. package/src/lib/server/PATCH.ts +10 -0
  93. package/src/lib/server/POST.ts +10 -0
  94. package/src/lib/server/PUT.ts +10 -0
  95. package/src/lib/server/agent.ts +86 -0
  96. package/src/lib/server/appDataDir.ts +16 -0
  97. package/src/lib/server/cli/buildEnvContent.ts +19 -0
  98. package/src/lib/server/cli/createTarGz.ts +77 -0
  99. package/src/lib/server/cli/handleCliDownload.ts +150 -0
  100. package/src/lib/server/cli/handleCliInstall.ts +37 -0
  101. package/src/lib/server/cli/installScript.ts +31 -0
  102. package/src/lib/server/cli/maxSourceMtime.ts +26 -0
  103. package/src/lib/server/cookies.ts +30 -0
  104. package/src/lib/server/env.ts +51 -0
  105. package/src/lib/server/error.ts +73 -0
  106. package/src/lib/server/json.ts +42 -0
  107. package/src/lib/server/jsonl.ts +47 -0
  108. package/src/lib/server/prompts/definePrompt.ts +21 -0
  109. package/src/lib/server/prompts/promptRegistry.ts +9 -0
  110. package/src/lib/server/prompts/registerPrompt.ts +6 -0
  111. package/src/lib/server/prompts/renderPromptTemplate.ts +17 -0
  112. package/src/lib/server/prompts/types/Prompt.ts +13 -0
  113. package/src/lib/server/prompts/types/PromptOptions.ts +12 -0
  114. package/src/lib/server/prompts/types/PromptRegistryEntry.ts +13 -0
  115. package/src/lib/server/prompts/types/PromptRoutes.ts +10 -0
  116. package/src/lib/server/reachable.ts +45 -0
  117. package/src/lib/server/redirect.ts +43 -0
  118. package/src/lib/server/request.ts +19 -0
  119. package/src/lib/server/rpc/defineVerb.ts +210 -0
  120. package/src/lib/server/rpc/dispatchVerbInProcess.ts +46 -0
  121. package/src/lib/server/rpc/findVerbByCommandName.ts +18 -0
  122. package/src/lib/server/rpc/parseArgs.ts +127 -0
  123. package/src/lib/server/rpc/readBodyWithinLimit.ts +44 -0
  124. package/src/lib/server/rpc/registerVerb.ts +6 -0
  125. package/src/lib/server/rpc/runWithVerbTimeout.ts +49 -0
  126. package/src/lib/server/rpc/types/RemoteHandler.ts +27 -0
  127. package/src/lib/server/rpc/types/RemoteRoutes.ts +13 -0
  128. package/src/lib/server/rpc/types/TypedResponse.ts +18 -0
  129. package/src/lib/server/rpc/types/VerbHelper.ts +87 -0
  130. package/src/lib/server/rpc/types/VerbRegistryEntry.ts +35 -0
  131. package/src/lib/server/rpc/unprocessed.ts +14 -0
  132. package/src/lib/server/rpc/verbRegistry.ts +11 -0
  133. package/src/lib/server/runtime/DEFAULT_PORT.ts +6 -0
  134. package/src/lib/server/runtime/DEV_READY_MESSAGE.ts +6 -0
  135. package/src/lib/server/runtime/DEV_REBUILD_MESSAGE.ts +4 -0
  136. package/src/lib/server/runtime/DEV_RELOAD_CLIENT_SCRIPT.ts +107 -0
  137. package/src/lib/server/runtime/SSR_SWAP_SCRIPT.ts +16 -0
  138. package/src/lib/server/runtime/acceptsGzip.ts +24 -0
  139. package/src/lib/server/runtime/buildCacheSnapshot.ts +61 -0
  140. package/src/lib/server/runtime/buildHealthPayload.ts +34 -0
  141. package/src/lib/server/runtime/buildInspectorSurface.ts +37 -0
  142. package/src/lib/server/runtime/buildOpenApiSpec.ts +106 -0
  143. package/src/lib/server/runtime/cacheControlForAsset.ts +22 -0
  144. package/src/lib/server/runtime/containsTraversal.ts +37 -0
  145. package/src/lib/server/runtime/createAppAssetServer.ts +76 -0
  146. package/src/lib/server/runtime/createAssetHeaderCache.ts +31 -0
  147. package/src/lib/server/runtime/createPublicAssetServer.ts +67 -0
  148. package/src/lib/server/runtime/createReachable.ts +109 -0
  149. package/src/lib/server/runtime/createRouteDispatcher.ts +127 -0
  150. package/src/lib/server/runtime/createServer.ts +674 -0
  151. package/src/lib/server/runtime/createUiPageRenderer.ts +181 -0
  152. package/src/lib/server/runtime/crossOriginForbidden.ts +17 -0
  153. package/src/lib/server/runtime/crossOriginGate.ts +29 -0
  154. package/src/lib/server/runtime/devClientFingerprint.ts +117 -0
  155. package/src/lib/server/runtime/devHotModuleResponse.ts +40 -0
  156. package/src/lib/server/runtime/devReloadResponse.ts +41 -0
  157. package/src/lib/server/runtime/disableIdleTimeoutForStream.ts +27 -0
  158. package/src/lib/server/runtime/envSchemaStore.ts +15 -0
  159. package/src/lib/server/runtime/findOpenPort.ts +21 -0
  160. package/src/lib/server/runtime/getActiveServer.ts +6 -0
  161. package/src/lib/server/runtime/globToPathSet.ts +29 -0
  162. package/src/lib/server/runtime/gzipResponse.ts +46 -0
  163. package/src/lib/server/runtime/inProcessServer.ts +20 -0
  164. package/src/lib/server/runtime/internalErrorResponse.ts +25 -0
  165. package/src/lib/server/runtime/isCrossOriginRequest.ts +23 -0
  166. package/src/lib/server/runtime/listenOnOpenPort.ts +36 -0
  167. package/src/lib/server/runtime/logExposedSurfaces.ts +156 -0
  168. package/src/lib/server/runtime/maybeMountInspector.ts +97 -0
  169. package/src/lib/server/runtime/mimeForExtension.ts +14 -0
  170. package/src/lib/server/runtime/pageUrlFromStore.ts +15 -0
  171. package/src/lib/server/runtime/parseIdleTimeout.ts +10 -0
  172. package/src/lib/server/runtime/parsePort.ts +11 -0
  173. package/src/lib/server/runtime/registryManifests.ts +66 -0
  174. package/src/lib/server/runtime/requestContext.ts +5 -0
  175. package/src/lib/server/runtime/resolvePageSnapshot.ts +25 -0
  176. package/src/lib/server/runtime/respondWithEmbeddedAsset.ts +18 -0
  177. package/src/lib/server/runtime/runWithRequestScope.ts +150 -0
  178. package/src/lib/server/runtime/safeJsonForScript.ts +17 -0
  179. package/src/lib/server/runtime/serializeCacheSnapshot.ts +45 -0
  180. package/src/lib/server/runtime/serverSlot.ts +13 -0
  181. package/src/lib/server/runtime/setActiveServer.ts +6 -0
  182. package/src/lib/server/runtime/snapshotEntryFromCache.ts +83 -0
  183. package/src/lib/server/runtime/streamCacheResolutions.ts +37 -0
  184. package/src/lib/server/runtime/streamFromIterator.ts +86 -0
  185. package/src/lib/server/runtime/types/Assets.ts +6 -0
  186. package/src/lib/server/runtime/types/DevReloadStamp.ts +18 -0
  187. package/src/lib/server/runtime/types/InspectorCacheEntry.ts +24 -0
  188. package/src/lib/server/runtime/types/InspectorCacheSnapshot.ts +11 -0
  189. package/src/lib/server/runtime/types/InspectorContext.ts +30 -0
  190. package/src/lib/server/runtime/types/InspectorSocket.ts +17 -0
  191. package/src/lib/server/runtime/types/InspectorSurface.ts +13 -0
  192. package/src/lib/server/runtime/types/InspectorVerb.ts +27 -0
  193. package/src/lib/server/runtime/types/RequestStore.ts +55 -0
  194. package/src/lib/server/runtime/warnUnguardedMcp.ts +32 -0
  195. package/src/lib/server/runtime/withResponseDefaults.ts +24 -0
  196. package/src/lib/server/server.ts +33 -0
  197. package/src/lib/server/socket.ts +32 -0
  198. package/src/lib/server/sockets/createSocketDispatcher.ts +337 -0
  199. package/src/lib/server/sockets/defineSocket.ts +179 -0
  200. package/src/lib/server/sockets/lookupSocket.ts +6 -0
  201. package/src/lib/server/sockets/registerSocket.ts +6 -0
  202. package/src/lib/server/sockets/socketOperations.ts +36 -0
  203. package/src/lib/server/sockets/socketRegistry.ts +9 -0
  204. package/src/lib/server/sockets/types/Socket.ts +23 -0
  205. package/src/lib/server/sockets/types/SocketClientFrame.ts +19 -0
  206. package/src/lib/server/sockets/types/SocketOperation.ts +22 -0
  207. package/src/lib/server/sockets/types/SocketOptions.ts +26 -0
  208. package/src/lib/server/sockets/types/SocketRegistryEntry.ts +19 -0
  209. package/src/lib/server/sockets/types/SocketRoutes.ts +10 -0
  210. package/src/lib/server/sockets/types/SocketServerFrame.ts +24 -0
  211. package/src/lib/server/sse.ts +54 -0
  212. package/src/lib/shared/ABIDE_PACKAGE_NAME.ts +7 -0
  213. package/src/lib/shared/ABIDE_VERSION.ts +9 -0
  214. package/src/lib/shared/CACHE_CONTROL_VALUES.ts +16 -0
  215. package/src/lib/shared/CACHE_WRAPPED.ts +8 -0
  216. package/src/lib/shared/CLI_PATH.ts +7 -0
  217. package/src/lib/shared/DEV_HOT_PREFIX.ts +7 -0
  218. package/src/lib/shared/DEV_RELOAD_PATH.ts +6 -0
  219. package/src/lib/shared/HEALTH_PATH.ts +7 -0
  220. package/src/lib/shared/HttpError.ts +20 -0
  221. package/src/lib/shared/IDENTITY_PATH.ts +6 -0
  222. package/src/lib/shared/INSPECTOR_PATH.ts +7 -0
  223. package/src/lib/shared/NAV_HEADER.ts +8 -0
  224. package/src/lib/shared/OFFLINE_HEADER.ts +8 -0
  225. package/src/lib/shared/REMOTE_FUNCTION.ts +8 -0
  226. package/src/lib/shared/REPLAYABLE_METHODS.ts +12 -0
  227. package/src/lib/shared/SOCKETS_PATH.ts +7 -0
  228. package/src/lib/shared/STREAMING_CONTENT_TYPES.ts +11 -0
  229. package/src/lib/shared/SocketDisconnectedError.ts +13 -0
  230. package/src/lib/shared/TEXT_PLAIN.ts +7 -0
  231. package/src/lib/shared/abideImportName.ts +44 -0
  232. package/src/lib/shared/abideLog.ts +38 -0
  233. package/src/lib/shared/activeCacheStore.ts +20 -0
  234. package/src/lib/shared/activePage.ts +25 -0
  235. package/src/lib/shared/appDataDir.ts +34 -0
  236. package/src/lib/shared/appNameSlot.ts +10 -0
  237. package/src/lib/shared/basePath.ts +10 -0
  238. package/src/lib/shared/basePathFromAppUrl.ts +20 -0
  239. package/src/lib/shared/baseSlot.ts +14 -0
  240. package/src/lib/shared/binaryDirEnvPath.ts +12 -0
  241. package/src/lib/shared/browserClientFlags.ts +10 -0
  242. package/src/lib/shared/buildRpcProxy.ts +39 -0
  243. package/src/lib/shared/buildRpcRequest.ts +70 -0
  244. package/src/lib/shared/buildSocketOverChannel.ts +58 -0
  245. package/src/lib/shared/bundleLayout.ts +36 -0
  246. package/src/lib/shared/cache.ts +951 -0
  247. package/src/lib/shared/cacheEntryFromSnapshot.ts +59 -0
  248. package/src/lib/shared/cacheStoreSlot.ts +16 -0
  249. package/src/lib/shared/cacheStores.ts +10 -0
  250. package/src/lib/shared/canonicalJson.ts +63 -0
  251. package/src/lib/shared/carriesBodyArgs.ts +13 -0
  252. package/src/lib/shared/clearLastConnection.ts +7 -0
  253. package/src/lib/shared/commandNameForUrl.ts +17 -0
  254. package/src/lib/shared/createCacheStore.ts +104 -0
  255. package/src/lib/shared/createChannelLog.ts +122 -0
  256. package/src/lib/shared/createLifecycleChannel.ts +56 -0
  257. package/src/lib/shared/createLivenessWatch.ts +118 -0
  258. package/src/lib/shared/createPushIterator.ts +127 -0
  259. package/src/lib/shared/createRemoteFunction.ts +122 -0
  260. package/src/lib/shared/createSubscriber.ts +55 -0
  261. package/src/lib/shared/createTraceContext.ts +21 -0
  262. package/src/lib/shared/dataDirEnvPath.ts +12 -0
  263. package/src/lib/shared/decodeResponse.ts +47 -0
  264. package/src/lib/shared/detectTarget.ts +27 -0
  265. package/src/lib/shared/detectVerbMethod.ts +17 -0
  266. package/src/lib/shared/emitLogRecord.ts +190 -0
  267. package/src/lib/shared/exeSuffix.ts +9 -0
  268. package/src/lib/shared/exitOnBuildFailure.ts +17 -0
  269. package/src/lib/shared/extraForwardHeaders.ts +16 -0
  270. package/src/lib/shared/fileStem.ts +9 -0
  271. package/src/lib/shared/findExportCallSite.ts +476 -0
  272. package/src/lib/shared/formatTraceparent.ts +6 -0
  273. package/src/lib/shared/forwardHeaders.ts +44 -0
  274. package/src/lib/shared/getRemoteMeta.ts +5 -0
  275. package/src/lib/shared/globalCacheStore.ts +15 -0
  276. package/src/lib/shared/globalCacheStoreSlot.ts +14 -0
  277. package/src/lib/shared/health.ts +179 -0
  278. package/src/lib/shared/healthReadSlot.ts +11 -0
  279. package/src/lib/shared/healthSeedSlot.ts +12 -0
  280. package/src/lib/shared/html.ts +38 -0
  281. package/src/lib/shared/importNamesToStrip.ts +13 -0
  282. package/src/lib/shared/invalidateEvent.ts +11 -0
  283. package/src/lib/shared/invalidateTripwire.ts +40 -0
  284. package/src/lib/shared/isAbideHealthPayload.ts +11 -0
  285. package/src/lib/shared/isCompileTarget.ts +15 -0
  286. package/src/lib/shared/isDebugEnabled.ts +26 -0
  287. package/src/lib/shared/isDebugNegated.ts +19 -0
  288. package/src/lib/shared/isModuleNotFound.ts +16 -0
  289. package/src/lib/shared/isReadOnlyMethod.ts +14 -0
  290. package/src/lib/shared/isReplayableMethod.ts +7 -0
  291. package/src/lib/shared/isStreamingResponse.ts +11 -0
  292. package/src/lib/shared/isSubscribable.ts +15 -0
  293. package/src/lib/shared/jsonSchemaForPromptArguments.ts +29 -0
  294. package/src/lib/shared/jsonSchemaForSchema.ts +39 -0
  295. package/src/lib/shared/jsonlErrorFrame.ts +24 -0
  296. package/src/lib/shared/keyForRemoteCall.ts +29 -0
  297. package/src/lib/shared/keyMatchesPrefix.ts +9 -0
  298. package/src/lib/shared/lastConnectionPath.ts +7 -0
  299. package/src/lib/shared/layoutChainForRoute.ts +22 -0
  300. package/src/lib/shared/loadEnvFile.ts +17 -0
  301. package/src/lib/shared/loadEnvFromDataDir.ts +14 -0
  302. package/src/lib/shared/log.ts +24 -0
  303. package/src/lib/shared/logClosingRecord.ts +28 -0
  304. package/src/lib/shared/logTapSlot.ts +13 -0
  305. package/src/lib/shared/manifestModule.ts +39 -0
  306. package/src/lib/shared/matchesDebugPattern.ts +16 -0
  307. package/src/lib/shared/memoizeByKey.ts +32 -0
  308. package/src/lib/shared/normalizeTarget.ts +10 -0
  309. package/src/lib/shared/online.ts +51 -0
  310. package/src/lib/shared/page.ts +30 -0
  311. package/src/lib/shared/pageSlot.ts +17 -0
  312. package/src/lib/shared/pageUrlForFile.ts +14 -0
  313. package/src/lib/shared/parseBoundedEnvInt.ts +20 -0
  314. package/src/lib/shared/parseDebugPatterns.ts +21 -0
  315. package/src/lib/shared/parseEnv.ts +30 -0
  316. package/src/lib/shared/parsePromptMarkdown.ts +35 -0
  317. package/src/lib/shared/parseRouteSegments.ts +22 -0
  318. package/src/lib/shared/parseTraceparent.ts +26 -0
  319. package/src/lib/shared/pending.ts +30 -0
  320. package/src/lib/shared/prepareRpcModule.ts +59 -0
  321. package/src/lib/shared/prepareSocketModule.ts +49 -0
  322. package/src/lib/shared/probeRegistries.ts +68 -0
  323. package/src/lib/shared/producerKey.ts +32 -0
  324. package/src/lib/shared/programNameForPackage.ts +14 -0
  325. package/src/lib/shared/promptNameForFile.ts +10 -0
  326. package/src/lib/shared/queryStringFromArgs.ts +27 -0
  327. package/src/lib/shared/randomHexId.ts +14 -0
  328. package/src/lib/shared/readEnvFile.ts +15 -0
  329. package/src/lib/shared/readLastConnection.ts +18 -0
  330. package/src/lib/shared/readPackageJson.ts +9 -0
  331. package/src/lib/shared/recordRemoteMeta.ts +5 -0
  332. package/src/lib/shared/refreshing.ts +31 -0
  333. package/src/lib/shared/remoteMetaStore.ts +16 -0
  334. package/src/lib/shared/requestScopeSlot.ts +15 -0
  335. package/src/lib/shared/resolveClientFlags.ts +20 -0
  336. package/src/lib/shared/responseErrorText.ts +9 -0
  337. package/src/lib/shared/rpcTimeoutSlot.ts +9 -0
  338. package/src/lib/shared/rpcUrlForFile.ts +19 -0
  339. package/src/lib/shared/runningAsStandaloneBinary.ts +13 -0
  340. package/src/lib/shared/selectorMatcher.ts +68 -0
  341. package/src/lib/shared/selectorPrefix.ts +39 -0
  342. package/src/lib/shared/serializeEnv.ts +18 -0
  343. package/src/lib/shared/setAppName.ts +5 -0
  344. package/src/lib/shared/setBaseResolver.ts +6 -0
  345. package/src/lib/shared/setCacheStoreResolver.ts +6 -0
  346. package/src/lib/shared/setGlobalCacheStoreResolver.ts +6 -0
  347. package/src/lib/shared/setPageResolver.ts +7 -0
  348. package/src/lib/shared/setRequestScopeResolver.ts +6 -0
  349. package/src/lib/shared/snippet.ts +25 -0
  350. package/src/lib/shared/socketNameForFile.ts +11 -0
  351. package/src/lib/shared/socketTapSlot.ts +12 -0
  352. package/src/lib/shared/sseErrorFrame.ts +29 -0
  353. package/src/lib/shared/streamResponse.ts +169 -0
  354. package/src/lib/shared/stripImport.ts +27 -0
  355. package/src/lib/shared/subscribableFromResponse.ts +51 -0
  356. package/src/lib/shared/tailProbeSlot.ts +16 -0
  357. package/src/lib/shared/toBunRoutePattern.ts +28 -0
  358. package/src/lib/shared/toScopeSet.ts +4 -0
  359. package/src/lib/shared/trace.ts +16 -0
  360. package/src/lib/shared/types/CacheEntry.ts +84 -0
  361. package/src/lib/shared/types/CacheInvalidation.ts +9 -0
  362. package/src/lib/shared/types/CacheOnContext.ts +25 -0
  363. package/src/lib/shared/types/CacheOptions.ts +39 -0
  364. package/src/lib/shared/types/CacheSelector.ts +17 -0
  365. package/src/lib/shared/types/CacheSnapshot.ts +16 -0
  366. package/src/lib/shared/types/CacheSnapshotEntry.ts +17 -0
  367. package/src/lib/shared/types/CacheStats.ts +13 -0
  368. package/src/lib/shared/types/CacheStore.ts +39 -0
  369. package/src/lib/shared/types/ChannelLog.ts +13 -0
  370. package/src/lib/shared/types/ClientFlags.ts +11 -0
  371. package/src/lib/shared/types/CompileTarget.ts +6 -0
  372. package/src/lib/shared/types/FrameworkLog.ts +13 -0
  373. package/src/lib/shared/types/HttpVerb.ts +1 -0
  374. package/src/lib/shared/types/LastConnection.ts +9 -0
  375. package/src/lib/shared/types/Log.ts +13 -0
  376. package/src/lib/shared/types/LogRecord.ts +42 -0
  377. package/src/lib/shared/types/LogVoice.ts +7 -0
  378. package/src/lib/shared/types/PageSnapshot.ts +14 -0
  379. package/src/lib/shared/types/PromptArgument.ts +12 -0
  380. package/src/lib/shared/types/RawRemoteFunction.ts +14 -0
  381. package/src/lib/shared/types/RemoteCallable.ts +12 -0
  382. package/src/lib/shared/types/RemoteFunction.ts +47 -0
  383. package/src/lib/shared/types/ReplayableMethod.ts +7 -0
  384. package/src/lib/shared/types/RequestScopeInfo.ts +16 -0
  385. package/src/lib/shared/types/RpcInvoker.ts +6 -0
  386. package/src/lib/shared/types/SocketChannel.ts +17 -0
  387. package/src/lib/shared/types/SocketSubCallbacks.ts +13 -0
  388. package/src/lib/shared/types/StandardSchemaV1.ts +56 -0
  389. package/src/lib/shared/types/StreamedResolution.ts +10 -0
  390. package/src/lib/shared/types/Subscribable.ts +26 -0
  391. package/src/lib/shared/types/TailHooks.ts +12 -0
  392. package/src/lib/shared/types/TailOptions.ts +10 -0
  393. package/src/lib/shared/types/TraceContext.ts +17 -0
  394. package/src/lib/shared/url.ts +118 -0
  395. package/src/lib/shared/withBase.ts +11 -0
  396. package/src/lib/shared/withBaseUrl.ts +17 -0
  397. package/src/lib/shared/withJsonSchema.ts +21 -0
  398. package/src/lib/shared/writeDts.ts +12 -0
  399. package/src/lib/shared/writeHealthDts.ts +36 -0
  400. package/src/lib/shared/writeLastConnection.ts +13 -0
  401. package/src/lib/shared/writePublicAssetsDts.ts +31 -0
  402. package/src/lib/shared/writeRoutesDts.ts +73 -0
  403. package/src/lib/shared/writeRpcDts.ts +49 -0
  404. package/src/lib/shared/writeTestRpcDts.ts +45 -0
  405. package/src/lib/shared/writeTestSocketsDts.ts +34 -0
  406. package/src/lib/test/assertAgentFrameConformance.ts +73 -0
  407. package/src/lib/test/createScriptedSurface.ts +45 -0
  408. package/src/lib/test/createTestApp.ts +203 -0
  409. package/src/lib/test/createTestSocketChannel.ts +142 -0
  410. package/src/lib/ui/README.md +86 -0
  411. package/src/lib/ui/compile/SSR_ESCAPE.ts +25 -0
  412. package/src/lib/ui/compile/UI_RUNTIME_IMPORTS.ts +36 -0
  413. package/src/lib/ui/compile/VOID_TAGS.ts +21 -0
  414. package/src/lib/ui/compile/abideUiPlugin.ts +65 -0
  415. package/src/lib/ui/compile/analyzeComponent.ts +117 -0
  416. package/src/lib/ui/compile/assetModulesFile.ts +32 -0
  417. package/src/lib/ui/compile/branchElements.ts +50 -0
  418. package/src/lib/ui/compile/collectAbideDiagnostics.ts +59 -0
  419. package/src/lib/ui/compile/compileComponent.ts +20 -0
  420. package/src/lib/ui/compile/compileModule.ts +116 -0
  421. package/src/lib/ui/compile/compileSSR.ts +36 -0
  422. package/src/lib/ui/compile/compileShadow.ts +352 -0
  423. package/src/lib/ui/compile/createShadowLanguageService.ts +197 -0
  424. package/src/lib/ui/compile/createShadowProgram.ts +96 -0
  425. package/src/lib/ui/compile/decodeHtmlEntities.ts +49 -0
  426. package/src/lib/ui/compile/desugarSignals.ts +133 -0
  427. package/src/lib/ui/compile/escapeHtml.ts +15 -0
  428. package/src/lib/ui/compile/generateBuild.ts +638 -0
  429. package/src/lib/ui/compile/generateSSR.ts +380 -0
  430. package/src/lib/ui/compile/groupBindParts.ts +28 -0
  431. package/src/lib/ui/compile/hoistCells.ts +120 -0
  432. package/src/lib/ui/compile/loadShadowTsConfig.ts +31 -0
  433. package/src/lib/ui/compile/lowerDocAccess.ts +202 -0
  434. package/src/lib/ui/compile/nearestProjectRoot.ts +16 -0
  435. package/src/lib/ui/compile/parseTemplate.ts +396 -0
  436. package/src/lib/ui/compile/partitionSlots.ts +36 -0
  437. package/src/lib/ui/compile/prepareNestedScript.ts +42 -0
  438. package/src/lib/ui/compile/remapShadowDiagnostic.ts +30 -0
  439. package/src/lib/ui/compile/renameSignalRefs.ts +85 -0
  440. package/src/lib/ui/compile/resolveAbideImports.ts +29 -0
  441. package/src/lib/ui/compile/scopeCss.ts +115 -0
  442. package/src/lib/ui/compile/shadowNaming.ts +11 -0
  443. package/src/lib/ui/compile/sourceToShadowOffset.ts +24 -0
  444. package/src/lib/ui/compile/staticAttrValue.ts +13 -0
  445. package/src/lib/ui/compile/stripEffects.ts +32 -0
  446. package/src/lib/ui/compile/types/AbideDiagnostic.ts +14 -0
  447. package/src/lib/ui/compile/types/AnalyzedComponent.ts +25 -0
  448. package/src/lib/ui/compile/types/CompiledShadow.ts +15 -0
  449. package/src/lib/ui/compile/types/TemplateAttr.ts +16 -0
  450. package/src/lib/ui/compile/types/TemplateNode.ts +78 -0
  451. package/src/lib/ui/compile/types/TextPart.ts +8 -0
  452. package/src/lib/ui/derived.ts +28 -0
  453. package/src/lib/ui/doc.ts +15 -0
  454. package/src/lib/ui/dom/appendSnippet.ts +34 -0
  455. package/src/lib/ui/dom/appendStatic.ts +27 -0
  456. package/src/lib/ui/dom/appendText.ts +114 -0
  457. package/src/lib/ui/dom/applyResolved.ts +72 -0
  458. package/src/lib/ui/dom/attach.ts +20 -0
  459. package/src/lib/ui/dom/attr.ts +19 -0
  460. package/src/lib/ui/dom/awaitBlock.ts +224 -0
  461. package/src/lib/ui/dom/cloneStatic.ts +52 -0
  462. package/src/lib/ui/dom/each.ts +115 -0
  463. package/src/lib/ui/dom/eachAsync.ts +153 -0
  464. package/src/lib/ui/dom/hydrate.ts +35 -0
  465. package/src/lib/ui/dom/mount.ts +29 -0
  466. package/src/lib/ui/dom/mountChild.ts +33 -0
  467. package/src/lib/ui/dom/on.ts +15 -0
  468. package/src/lib/ui/dom/openChild.ts +22 -0
  469. package/src/lib/ui/dom/openRoot.ts +20 -0
  470. package/src/lib/ui/dom/switchBlock.ts +75 -0
  471. package/src/lib/ui/dom/text.ts +20 -0
  472. package/src/lib/ui/dom/tryBlock.ts +112 -0
  473. package/src/lib/ui/dom/types/EachRow.ts +3 -0
  474. package/src/lib/ui/dom/types/SwitchCase.ts +6 -0
  475. package/src/lib/ui/dom/when.ts +73 -0
  476. package/src/lib/ui/effect.ts +16 -0
  477. package/src/lib/ui/installHotBridge.ts +73 -0
  478. package/src/lib/ui/matchRoute.ts +89 -0
  479. package/src/lib/ui/navigate.ts +17 -0
  480. package/src/lib/ui/probeNavigation.ts +33 -0
  481. package/src/lib/ui/remoteProxy.ts +97 -0
  482. package/src/lib/ui/renderChain.ts +50 -0
  483. package/src/lib/ui/renderToStream.ts +104 -0
  484. package/src/lib/ui/router.ts +286 -0
  485. package/src/lib/ui/runtime/OUTLET_TAG.ts +8 -0
  486. package/src/lib/ui/runtime/OWNER.ts +8 -0
  487. package/src/lib/ui/runtime/REACTIVE_CONTEXT.ts +14 -0
  488. package/src/lib/ui/runtime/RENDER.ts +23 -0
  489. package/src/lib/ui/runtime/RESUME.ts +16 -0
  490. package/src/lib/ui/runtime/applyPatchToTree.ts +41 -0
  491. package/src/lib/ui/runtime/claimChild.ts +10 -0
  492. package/src/lib/ui/runtime/clientPage.ts +16 -0
  493. package/src/lib/ui/runtime/createComputedNode.ts +16 -0
  494. package/src/lib/ui/runtime/createDoc.ts +177 -0
  495. package/src/lib/ui/runtime/createEffectNode.ts +58 -0
  496. package/src/lib/ui/runtime/createSignalNode.ts +16 -0
  497. package/src/lib/ui/runtime/detachLink.ts +21 -0
  498. package/src/lib/ui/runtime/endTracking.ts +24 -0
  499. package/src/lib/ui/runtime/enterRenderPass.ts +12 -0
  500. package/src/lib/ui/runtime/exitRenderPass.ts +7 -0
  501. package/src/lib/ui/runtime/firstOutlet.ts +22 -0
  502. package/src/lib/ui/runtime/flushEffects.ts +17 -0
  503. package/src/lib/ui/runtime/hotInstances.ts +10 -0
  504. package/src/lib/ui/runtime/hotReloadEnabled.ts +8 -0
  505. package/src/lib/ui/runtime/hotReplace.ts +25 -0
  506. package/src/lib/ui/runtime/nextBlockId.ts +11 -0
  507. package/src/lib/ui/runtime/pathExists.ts +23 -0
  508. package/src/lib/ui/runtime/readNode.ts +17 -0
  509. package/src/lib/ui/runtime/registerHotInstance.ts +23 -0
  510. package/src/lib/ui/runtime/runNode.ts +28 -0
  511. package/src/lib/ui/runtime/runtimePath.ts +9 -0
  512. package/src/lib/ui/runtime/scope.ts +24 -0
  513. package/src/lib/ui/runtime/toTeardown.ts +26 -0
  514. package/src/lib/ui/runtime/track.ts +58 -0
  515. package/src/lib/ui/runtime/trigger.ts +44 -0
  516. package/src/lib/ui/runtime/types/Cell.ts +5 -0
  517. package/src/lib/ui/runtime/types/Derived.ts +3 -0
  518. package/src/lib/ui/runtime/types/Doc.ts +19 -0
  519. package/src/lib/ui/runtime/types/EffectResult.ts +10 -0
  520. package/src/lib/ui/runtime/types/HotInstance.ts +14 -0
  521. package/src/lib/ui/runtime/types/NavVerdict.ts +9 -0
  522. package/src/lib/ui/runtime/types/Patch.ts +11 -0
  523. package/src/lib/ui/runtime/types/ReactiveLink.ts +21 -0
  524. package/src/lib/ui/runtime/types/ReactiveNode.ts +25 -0
  525. package/src/lib/ui/runtime/types/Route.ts +8 -0
  526. package/src/lib/ui/runtime/types/RouteLoader.ts +7 -0
  527. package/src/lib/ui/runtime/types/SsrRender.ts +22 -0
  528. package/src/lib/ui/runtime/types/State.ts +3 -0
  529. package/src/lib/ui/runtime/types/Teardown.ts +5 -0
  530. package/src/lib/ui/runtime/types/UiComponent.ts +16 -0
  531. package/src/lib/ui/runtime/types/UiProps.ts +15 -0
  532. package/src/lib/ui/runtime/unlinkDeps.ts +20 -0
  533. package/src/lib/ui/runtime/untrack.ts +20 -0
  534. package/src/lib/ui/runtime/valueAtPath.ts +18 -0
  535. package/src/lib/ui/runtime/writeNode.ts +16 -0
  536. package/src/lib/ui/socketChannel.ts +227 -0
  537. package/src/lib/ui/socketProxy.ts +25 -0
  538. package/src/lib/ui/startClient.ts +58 -0
  539. package/src/lib/ui/state.ts +25 -0
  540. package/src/lib/ui/tail.ts +324 -0
  541. package/src/lib/ui/types/Layouts.ts +9 -0
  542. package/src/lib/ui/types/Pages.ts +8 -0
  543. package/src/preload.ts +19 -0
  544. package/src/scaffold.ts +153 -0
  545. package/src/serverBuildPlugins.ts +19 -0
  546. package/src/serverEntry.ts +95 -0
  547. package/template/bunfig.toml +4 -0
  548. package/template/package.json +18 -0
  549. package/template/src/app.ts +28 -0
  550. package/template/src/bundle/icon.png +0 -0
  551. package/template/src/cli/banner.txt +3 -0
  552. package/template/src/cli/footer.txt +1 -0
  553. package/template/src/server/config.ts +17 -0
  554. package/template/src/server/rpc/getHello.ts +36 -0
  555. package/template/src/ui/Layout.abide +19 -0
  556. package/template/src/ui/app.css +21 -0
  557. package/template/src/ui/app.html +24 -0
  558. package/template/src/ui/pages/about/page.abide +9 -0
  559. package/template/src/ui/pages/page.abide +22 -0
  560. package/template/test/app.test.ts +30 -0
  561. package/template/tsconfig.json +18 -0
  562. 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,6 @@
1
+ /* One entry in an MCP resources/list result — a file under src/mcp/resources. */
2
+ export type McpResourceDescriptor = {
3
+ uri: string
4
+ name: string
5
+ mimeType: string
6
+ }
@@ -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
+ }