@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Brian Cray
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,154 @@
1
+ # abide
2
+
3
+ **A type-safe isomorphic framework built on web standards and Bun. Zero runtime dependencies, single runtime.**
4
+
5
+ abide is not just a web framework. Strongly-typed RPCs surface through HTTP, a CLI, and an MCP, with a full OpenAPI spec. Everything is generated for you with zero additional work - but you control surface exposure. Its a framework built for humans *and* machines.
6
+
7
+ ## Quick start
8
+
9
+ ```sh
10
+ bunx abide scaffold my-app # scaffolds, installs, and starts the dev server
11
+ ```
12
+
13
+ To see a full demo, clone the repo and run the kitchen-sink example — every surface is a runnable, documented page:
14
+
15
+ ```sh
16
+ git clone https://github.com/briancray/abide
17
+ cd abide && bun install
18
+ cd examples/kitchen-sink && bun run dev
19
+ ```
20
+
21
+ ## Three foundational primitives
22
+
23
+ ### RPCs
24
+
25
+ An RPC is a handler wrapped by its HTTP method — one export per file under `src/server/rpc/`. The file path is the URL; the schema validates args and projects the MCP tool, CLI flags, and OpenAPI operation. Standard Schema is the contract: zod, valibot, and arktype work unadapted.
26
+
27
+ ```ts
28
+ // src/server/rpc/getMessages.ts
29
+ import { GET } from '@abide/abide/server/GET'
30
+ import { json } from '@abide/abide/server/json'
31
+ import { z } from 'zod'
32
+
33
+ // query args arrive as strings — coerce in the schema
34
+ const inputSchema = z.object({ room: z.string(), limit: z.coerce.number().default(50) })
35
+
36
+ export const getMessages = GET(
37
+ async ({ room, limit }) => json(await db.recentMessages(room, limit)),
38
+ { inputSchema },
39
+ )
40
+ ```
41
+
42
+ One declared verb fans out to every surface — this is the whole premise:
43
+
44
+ ```text
45
+ export const getMessages = GET(fn, { inputSchema })
46
+
47
+ ┌───────────────┬────────────┼──────────────┬────────────────┐
48
+ SSR call browser fetch MCP tool CLI subcommand OpenAPI op
49
+ cache(fn)() fetch /rpc/... getMessages app get-messages /openapi.json
50
+ (in-process) (typed proxy) (read-only+schema) (schema→flags) (described)
51
+ ```
52
+
53
+ The same callable is consumed differently per side — `cache(getMessages)({ room })` in-process, the swapped `fetch` in the browser, `.raw(args)` for a `Response`, `.stream(args)` for `tail()`. A schema gates the machine surfaces: it unlocks CLI and (for read-only verbs) MCP; a mutating verb never auto-exposes to MCP — it needs an explicit `clients: { mcp: true }`. Per-verb `timeout` (504, on every surface) is distinct from the client-side `ABIDE_CLIENT_TIMEOUT`.
54
+
55
+ > Query args travel as strings — use `z.coerce.*` so numbers and booleans validate.
56
+
57
+ ### Sockets
58
+
59
+ One broadcast topic per file under `src/server/sockets/`. A `Socket<T>` is an isomorphic `AsyncIterable<T>` — every socket multiplexes onto one ws at `/__abide/sockets`.
60
+
61
+ ```ts
62
+ // src/server/sockets/chat.ts
63
+ import { socket } from '@abide/abide/server/socket'
64
+ import { z } from 'zod'
65
+
66
+ const schema = z.object({ id: z.string(), from: z.string(), text: z.string(), at: z.number() })
67
+
68
+ // retain the last 100 frames, evict any older than an hour
69
+ export const chat = socket({ schema, tail: 100, ttl: 3_600_000 })
70
+ export type ChatMessage = z.infer<typeof schema>
71
+ ```
72
+
73
+ For clients that can't speak the ws multiplex, each socket has an HTTP face at `/__abide/sockets/<name>` — `GET` returns the retained tail, `POST` publishes (gated by `clientPublish`).
74
+
75
+ ### Components
76
+
77
+ Components are `.abide` files — valid HTML with `<script>`, native `<template>` control flow, `{expr}` bindings, and a component-scoped `<style>`. The reactive primitives (`state`, `derived`, `effect`, `prop`) are in scope without import. This page reads the verb above through `cache()`, tails the socket live, and exercises most of the template grammar:
78
+
79
+ ```html
80
+ <script>
81
+ import { cache } from '@abide/abide/shared/cache'
82
+ import { tail } from '@abide/abide/ui/tail'
83
+ import { getMessages } from '$server/rpc/getMessages.ts'
84
+ import { publishChat } from '$server/rpc/publishChat.ts'
85
+ import { chat } from '$server/sockets/chat.ts'
86
+ import Avatar from '$ui/Avatar.abide'
87
+
88
+ let room = prop('room') // typed via src/.abide/routes.d.ts
89
+ const history = derived(() => cache(getMessages)({ room })) // SSR snapshot + reactive refetch
90
+ const latest = derived(() => tail(chat)) // re-renders on every new frame
91
+
92
+ let from = state('alice')
93
+ let text = state('')
94
+ let filter = state('all') // all | mine | others
95
+ let onlyUnread = state(false)
96
+
97
+ async function send(event: SubmitEvent) {
98
+ event.preventDefault()
99
+ if (text.trim() === '') return
100
+ await publishChat({ room, from, text }) // server validates, then broadcasts
101
+ text = ''
102
+ }
103
+ </script>
104
+
105
+ <template name="message" args={m}> <!-- snippet: a reusable builder -->
106
+ <li class="row"><Avatar name={m.from} /> <strong>{m.from}</strong>: {m.text}</li>
107
+ </template>
108
+
109
+ <form onsubmit={send}>
110
+ <input bind:value={from} placeholder="you" />
111
+ <input bind:value={text} placeholder="say something…" />
112
+ <label><input type="checkbox" bind:checked={onlyUnread} /> unread only</label>
113
+ <fieldset>
114
+ <label><input type="radio" bind:group={filter} value="all" /> all</label>
115
+ <label><input type="radio" bind:group={filter} value="mine" /> mine</label>
116
+ </fieldset>
117
+ <button type="submit" disabled={text.trim() === ''}>send</button>
118
+ </form>
119
+
120
+ <template if={latest}>
121
+ <p class="ping">latest from <strong>{latest.from}</strong></p>
122
+ <template else>
123
+ <p class="ping muted">no live messages yet</p>
124
+ </template>
125
+ </template>
126
+
127
+ <template switch={filter}>
128
+ <template case={'mine'}><p>showing your messages</p></template>
129
+ <template default><p>showing every message</p></template>
130
+ </template>
131
+
132
+ <template await={history}>
133
+ <p>loading history…</p>
134
+ <template then="messages">
135
+ <ul>
136
+ <template each={messages} as="m" key="m.id">
137
+ {message(m)} <!-- render the snippet -->
138
+ </template>
139
+ </ul>
140
+ </template>
141
+ <template catch="err">
142
+ <p class="error">{err.message}</p>
143
+ </template>
144
+ </template>
145
+
146
+ <style>
147
+ .row { display: flex; gap: 0.5rem; }
148
+ .muted { color: #94a3b8; }
149
+ .error { color: #dc2626; }
150
+ </style>
151
+ ```
152
+
153
+
154
+ MIT
package/bin/abide.ts ADDED
@@ -0,0 +1,212 @@
1
+ #!/usr/bin/env bun
2
+ import { abideLsp } from '../src/abideLsp.ts'
3
+ import { build } from '../src/build.ts'
4
+ import { buildCli } from '../src/buildCli.ts'
5
+ import { bundleApp } from '../src/bundleApp.ts'
6
+ import { checkAbide } from '../src/checkAbide.ts'
7
+ import { compile } from '../src/compile.ts'
8
+ import { normalizeTarget } from '../src/lib/shared/normalizeTarget.ts'
9
+ import { scaffold } from '../src/scaffold.ts'
10
+
11
+ const PRELOAD = new URL('../src/preload.ts', import.meta.url).pathname
12
+ const SERVER_ENTRY = new URL('../src/serverEntry.ts', import.meta.url).pathname
13
+ const DEV_ENTRY = new URL('../src/devEntry.ts', import.meta.url).pathname
14
+ const cwd = process.cwd()
15
+ const [, , command, ...rest] = process.argv
16
+
17
+ // Reads `--name=value` or `--name value` from the trailing argv tail.
18
+ function parseFlag(name: string): string | undefined {
19
+ const prefix = `--${name}=`
20
+ const match = rest.find((arg) => arg.startsWith(prefix))
21
+ if (match) {
22
+ return match.slice(prefix.length)
23
+ }
24
+ const index = rest.indexOf(`--${name}`)
25
+ if (index !== -1 && index + 1 < rest.length) {
26
+ return rest[index + 1]
27
+ }
28
+ return undefined
29
+ }
30
+
31
+ /*
32
+ Runs a long-lived child (server, job, script) and owns its shutdown. Ctrl+C
33
+ delivers SIGINT to the whole foreground process group, so without a parent
34
+ handler the parent's default action kills it instantly — abandoning the
35
+ `await child.exited` and orphaning the child, which (for a server) can then
36
+ linger holding the port. Forwarding the signal and awaiting the child's exit
37
+ (with a SIGKILL watchdog for a wedged child) guarantees the child is reaped
38
+ before the parent leaves. Mirrors the child's exit code so callers and CI see
39
+ the real result.
40
+ */
41
+ async function runChild(cmd: string[]): Promise<never> {
42
+ const child = Bun.spawn({ cmd, cwd, stdio: ['inherit', 'inherit', 'inherit'] })
43
+ const forward = (signal: NodeJS.Signals) => {
44
+ child.kill(signal)
45
+ setTimeout(() => child.kill('SIGKILL'), 3000).unref()
46
+ }
47
+ process.on('SIGINT', () => forward('SIGINT'))
48
+ process.on('SIGTERM', () => forward('SIGTERM'))
49
+ process.exit(await child.exited)
50
+ }
51
+
52
+ /*
53
+ Runs the dev orchestrator (devEntry) — not `bun --watch`. The orchestrator owns
54
+ the loop: it builds the client, spawns the server as a child on a fixed dev
55
+ port, watches src/ recursively, and on any change rebuilds + restarts the child.
56
+ The server mounts a live-reload channel under dev, so the browser reloads itself
57
+ when the restarted server comes back. runChild forwards Ctrl+C so the
58
+ orchestrator (and its server child) shut down cleanly.
59
+ */
60
+ async function dev(): Promise<void> {
61
+ await runChild(['bun', '--preload', PRELOAD, DEV_ENTRY])
62
+ }
63
+
64
+ // Performs a single client build with no server attached (for CI / static deploys).
65
+ async function buildOnce(): Promise<void> {
66
+ await build({ cwd })
67
+ }
68
+
69
+ // Starts the production server against an already-built dist directory.
70
+ async function start(): Promise<void> {
71
+ await runChild(['bun', '--preload', PRELOAD, SERVER_ENTRY])
72
+ }
73
+
74
+ /*
75
+ Runs an arbitrary script under the abide preload — same runtime as the server,
76
+ so jobs/scripts get .abide compilation, abide/* + $server/$shared resolution,
77
+ and the .css no-op loader for free. Everything after `run` is forwarded
78
+ verbatim: the first token is the script, the rest are its argv (bun stops
79
+ parsing its own flags at the script path).
80
+ */
81
+ async function runCmd(): Promise<void> {
82
+ if (rest.length === 0) {
83
+ console.error('usage: abide run <file> [args...]')
84
+ process.exit(1)
85
+ }
86
+ await runChild(['bun', '--preload', PRELOAD, ...rest])
87
+ }
88
+
89
+ // Parses the --target and --out flags and produces a standalone executable.
90
+ async function compileCmd(): Promise<void> {
91
+ const targetFlag = parseFlag('target')
92
+ const outFlag = parseFlag('out')
93
+ await compile({
94
+ cwd,
95
+ target: targetFlag ? normalizeTarget(targetFlag) : undefined,
96
+ outfile: outFlag,
97
+ })
98
+ }
99
+
100
+ // Builds the standalone CLI binary — a thin remote client (manifest baked in)
101
+ // that ships the compiled server beside it, so it can talk to a remote server
102
+ // or spawn a local instance (`<name> start`). Discovery walks the rpc registry
103
+ // to bake the manifest in. `--platforms a,b,c` cross-compiles per target into
104
+ // dist/cli-thin/<platform>/ (cli + server) — the layout the /__abide/cli
105
+ // download endpoint streams. For just the server, use `abide compile`.
106
+ async function cliCmd(): Promise<void> {
107
+ const targetFlag = parseFlag('target')
108
+ const outFlag = parseFlag('out')
109
+ const platformsFlag = parseFlag('platforms')
110
+ const platforms = platformsFlag
111
+ ? platformsFlag.split(',').map((value) => normalizeTarget(value.trim()))
112
+ : undefined
113
+ await buildCli({
114
+ cwd,
115
+ target: targetFlag ? normalizeTarget(targetFlag) : undefined,
116
+ outfile: outFlag,
117
+ platforms,
118
+ })
119
+ }
120
+
121
+ // Type-checks every .abide component's template + props through its shadow and
122
+ // exits non-zero if any errors are found.
123
+ async function checkCmd(): Promise<void> {
124
+ const errors = await checkAbide({ cwd })
125
+ process.exit(errors === 0 ? 0 : 1)
126
+ }
127
+
128
+ // Runs the .abide language server over stdio (JSON-RPC) — an editor spawns this
129
+ // to get live template + prop type-check diagnostics. Runs until the client exits.
130
+ async function lspCmd(): Promise<void> {
131
+ await abideLsp({ cwd })
132
+ }
133
+
134
+ // Assembles a movable, self-contained app bundle for the host platform —
135
+ // the server binary, the launcher, and the webview lib together (a .app on
136
+ // macOS, a flat directory elsewhere). Unsigned; for distribution to other
137
+ // users the bundle still needs platform signing/notarization.
138
+ async function bundleCmd(): Promise<void> {
139
+ await bundleApp({ cwd })
140
+ }
141
+
142
+ /*
143
+ Scaffolds the bundled template, installs it, and — interactively — starts the
144
+ dev server so the one command ends in a running app. Non-TTY runs (CI,
145
+ scripts) never auto-start; `--no-dev` opts out explicitly.
146
+ */
147
+ async function scaffoldCmd(): Promise<void> {
148
+ const name = rest.find((arg) => !arg.startsWith('--'))
149
+ if (!name) {
150
+ console.error('usage: bunx abide scaffold <project-name> [--no-install] [--no-dev]')
151
+ process.exit(1)
152
+ }
153
+ const install = !rest.includes('--no-install')
154
+ // scaffold gates dev on a successful install, so only the TTY/flag policy lives here.
155
+ const dev = !rest.includes('--no-dev') && Boolean(process.stdout.isTTY)
156
+ await scaffold({ cwd, name, install, dev })
157
+ }
158
+
159
+ // Prints the CLI synopsis to stderr and exits non-zero. Marked `never` because the process is gone.
160
+ function usage(): never {
161
+ console.error(
162
+ 'usage:\n' +
163
+ ' bunx abide scaffold <project-name> scaffold a new abide project, install\n' +
164
+ ' it, and start its dev server\n' +
165
+ ' (--no-install / --no-dev to skip)\n' +
166
+ ' abide dev build + run with hot reload\n' +
167
+ ' abide build build the client into dist/_app/\n' +
168
+ ' abide check type-check .abide templates + props\n' +
169
+ ' abide start run the production server against dist/\n' +
170
+ ' abide run <file> [args...] run a script under the abide preload\n' +
171
+ ' (jobs, one-off scripts — same runtime as\n' +
172
+ ' the server). For tests, add\n' +
173
+ ' preload = ["@abide/abide/preload"] under\n' +
174
+ ' [test] in bunfig.toml and use `bun test`\n' +
175
+ ' abide compile [--target=<bun-...>] [--out=<path>]\n' +
176
+ ' build a standalone server executable\n' +
177
+ ' abide cli [--target=<bun-...>] [--out=<path>] [--platforms=<a,b,c>]\n' +
178
+ ' build the cli binary — a thin remote client that\n' +
179
+ ' ships the server beside it (connect to a remote\n' +
180
+ ' server or `start` a local instance; --platforms\n' +
181
+ ' cross-compiles per platform)\n' +
182
+ ' abide bundle build a movable, self-contained app\n' +
183
+ ' bundle for this platform (unsigned). Boots\n' +
184
+ ' into a connect screen — start the embedded\n' +
185
+ ' server or connect to a remote one',
186
+ )
187
+ process.exit(1)
188
+ }
189
+
190
+ if (command === 'scaffold') {
191
+ await scaffoldCmd()
192
+ } else if (command === 'dev') {
193
+ await dev()
194
+ } else if (command === 'build') {
195
+ await buildOnce()
196
+ } else if (command === 'start') {
197
+ await start()
198
+ } else if (command === 'run') {
199
+ await runCmd()
200
+ } else if (command === 'compile') {
201
+ await compileCmd()
202
+ } else if (command === 'cli') {
203
+ await cliCmd()
204
+ } else if (command === 'bundle') {
205
+ await bundleCmd()
206
+ } else if (command === 'check') {
207
+ await checkCmd()
208
+ } else if (command === 'lsp') {
209
+ await lspCmd()
210
+ } else {
211
+ usage()
212
+ }
package/package.json ADDED
@@ -0,0 +1,155 @@
1
+ {
2
+ "name": "@abide/abide",
3
+ "version": "0.28.0",
4
+ "type": "module",
5
+ "sideEffects": false,
6
+ "description": "Isomorphic multimodal HTTP framework built for humans and machines in a single Bun runtime",
7
+ "license": "MIT",
8
+ "author": "Brian Cray",
9
+ "homepage": "https://github.com/briancray/abide#readme",
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/briancray/abide.git",
13
+ "directory": "packages/abide"
14
+ },
15
+ "bugs": {
16
+ "url": "https://github.com/briancray/abide/issues"
17
+ },
18
+ "keywords": [
19
+ "bun",
20
+ "ssr",
21
+ "spa",
22
+ "framework",
23
+ "isomorphic",
24
+ "rpc",
25
+ "mcp",
26
+ "cli"
27
+ ],
28
+ "engines": {
29
+ "bun": ">=1.3.0"
30
+ },
31
+ "publishConfig": {
32
+ "access": "public",
33
+ "provenance": true
34
+ },
35
+ "exports": {
36
+ "./server/GET": "./src/lib/server/GET.ts",
37
+ "./server/POST": "./src/lib/server/POST.ts",
38
+ "./server/PUT": "./src/lib/server/PUT.ts",
39
+ "./server/PATCH": "./src/lib/server/PATCH.ts",
40
+ "./server/DELETE": "./src/lib/server/DELETE.ts",
41
+ "./server/HEAD": "./src/lib/server/HEAD.ts",
42
+ "./server/socket": "./src/lib/server/socket.ts",
43
+ "./server/json": "./src/lib/server/json.ts",
44
+ "./server/jsonl": "./src/lib/server/jsonl.ts",
45
+ "./server/sse": "./src/lib/server/sse.ts",
46
+ "./server/error": "./src/lib/server/error.ts",
47
+ "./server/redirect": "./src/lib/server/redirect.ts",
48
+ "./server/request": "./src/lib/server/request.ts",
49
+ "./server/reachable": "./src/lib/server/reachable.ts",
50
+ "./server/cookies": "./src/lib/server/cookies.ts",
51
+ "./server/env": "./src/lib/server/env.ts",
52
+ "./server/appDataDir": "./src/lib/server/appDataDir.ts",
53
+ "./server/server": "./src/lib/server/server.ts",
54
+ "./server/AppModule": "./src/lib/server/AppModule.ts",
55
+ "./server/InspectorContext": "./src/lib/server/runtime/types/InspectorContext.ts",
56
+ "./server/agent": "./src/lib/server/agent.ts",
57
+ "./server/rpc/defineVerb": "./src/lib/server/rpc/defineVerb.ts",
58
+ "./server/sockets/defineSocket": "./src/lib/server/sockets/defineSocket.ts",
59
+ "./server/prompts/definePrompt": "./src/lib/server/prompts/definePrompt.ts",
60
+ "./ui/tail": "./src/lib/ui/tail.ts",
61
+ "./shared/cache": "./src/lib/shared/cache.ts",
62
+ "./shared/pending": "./src/lib/shared/pending.ts",
63
+ "./shared/refreshing": "./src/lib/shared/refreshing.ts",
64
+ "./shared/HttpError": "./src/lib/shared/HttpError.ts",
65
+ "./shared/html": "./src/lib/shared/html.ts",
66
+ "./shared/snippet": "./src/lib/shared/snippet.ts",
67
+ "./shared/withJsonSchema": "./src/lib/shared/withJsonSchema.ts",
68
+ "./shared/health": "./src/lib/shared/health.ts",
69
+ "./shared/log": "./src/lib/shared/log.ts",
70
+ "./shared/online": "./src/lib/shared/online.ts",
71
+ "./shared/page": "./src/lib/shared/page.ts",
72
+ "./shared/trace": "./src/lib/shared/trace.ts",
73
+ "./shared/url": "./src/lib/shared/url.ts",
74
+ "./shared/createSubscriber": "./src/lib/shared/createSubscriber.ts",
75
+ "./ui/state": "./src/lib/ui/state.ts",
76
+ "./ui/derived": "./src/lib/ui/derived.ts",
77
+ "./ui/effect": "./src/lib/ui/effect.ts",
78
+ "./ui/doc": "./src/lib/ui/doc.ts",
79
+ "./ui/dom/mount": "./src/lib/ui/dom/mount.ts",
80
+ "./ui/dom/mountChild": "./src/lib/ui/dom/mountChild.ts",
81
+ "./ui/dom/hydrate": "./src/lib/ui/dom/hydrate.ts",
82
+ "./ui/dom/text": "./src/lib/ui/dom/text.ts",
83
+ "./ui/dom/openChild": "./src/lib/ui/dom/openChild.ts",
84
+ "./ui/dom/openRoot": "./src/lib/ui/dom/openRoot.ts",
85
+ "./ui/dom/appendText": "./src/lib/ui/dom/appendText.ts",
86
+ "./ui/dom/appendSnippet": "./src/lib/ui/dom/appendSnippet.ts",
87
+ "./ui/dom/appendStatic": "./src/lib/ui/dom/appendStatic.ts",
88
+ "./ui/dom/cloneStatic": "./src/lib/ui/dom/cloneStatic.ts",
89
+ "./ui/dom/attr": "./src/lib/ui/dom/attr.ts",
90
+ "./ui/dom/on": "./src/lib/ui/dom/on.ts",
91
+ "./ui/dom/attach": "./src/lib/ui/dom/attach.ts",
92
+ "./ui/dom/each": "./src/lib/ui/dom/each.ts",
93
+ "./ui/dom/eachAsync": "./src/lib/ui/dom/eachAsync.ts",
94
+ "./ui/dom/when": "./src/lib/ui/dom/when.ts",
95
+ "./ui/dom/awaitBlock": "./src/lib/ui/dom/awaitBlock.ts",
96
+ "./ui/dom/tryBlock": "./src/lib/ui/dom/tryBlock.ts",
97
+ "./ui/dom/switchBlock": "./src/lib/ui/dom/switchBlock.ts",
98
+ "./ui/dom/applyResolved": "./src/lib/ui/dom/applyResolved.ts",
99
+ "./ui/runtime/nextBlockId": "./src/lib/ui/runtime/nextBlockId.ts",
100
+ "./ui/runtime/enterRenderPass": "./src/lib/ui/runtime/enterRenderPass.ts",
101
+ "./ui/runtime/exitRenderPass": "./src/lib/ui/runtime/exitRenderPass.ts",
102
+ "./ui/router": "./src/lib/ui/router.ts",
103
+ "./ui/startClient": "./src/lib/ui/startClient.ts",
104
+ "./ui/navigate": "./src/lib/ui/navigate.ts",
105
+ "./ui/renderToStream": "./src/lib/ui/renderToStream.ts",
106
+ "./ui-plugin": "./src/lib/ui/compile/abideUiPlugin.ts",
107
+ "./mcp/createMcpServer": "./src/lib/mcp/createMcpServer.ts",
108
+ "./bundle/BundleWindow": "./src/lib/bundle/BundleWindow.ts",
109
+ "./bundle/BundleMenu": "./src/lib/bundle/BundleMenu.ts",
110
+ "./bundle/BundleMenuItem": "./src/lib/bundle/BundleMenuItem.ts",
111
+ "./bundle/onMenu": "./src/lib/bundle/onMenu.ts",
112
+ "./bundle/bundled": "./src/lib/bundle/bundled.ts",
113
+ "./test/createTestApp": "./src/lib/test/createTestApp.ts",
114
+ "./test/createScriptedSurface": "./src/lib/test/createScriptedSurface.ts",
115
+ "./test/assertAgentFrameConformance": "./src/lib/test/assertAgentFrameConformance.ts",
116
+ "./tsconfig": "./tsconfig.app.json",
117
+ "./build": "./src/build.ts",
118
+ "./compile": "./src/compile.ts",
119
+ "./preload": "./src/preload.ts",
120
+ "./resolver-plugin": "./src/abideResolverPlugin.ts",
121
+ "./ui/remoteProxy": "./src/lib/ui/remoteProxy.ts",
122
+ "./ui/socketProxy": "./src/lib/ui/socketProxy.ts",
123
+ "./server/prompts/renderPromptTemplate": "./src/lib/server/prompts/renderPromptTemplate.ts"
124
+ },
125
+ "bin": {
126
+ "abide": "./bin/abide.ts"
127
+ },
128
+ "files": [
129
+ "src",
130
+ "bin",
131
+ "template",
132
+ "tsconfig.app.json",
133
+ "CHANGELOG.md"
134
+ ],
135
+ "dependencies": {
136
+ "typescript": "^6.0.3"
137
+ },
138
+ "peerDependencies": {
139
+ "bun-plugin-tailwind": "*",
140
+ "tailwindcss": "^4.0.0"
141
+ },
142
+ "peerDependenciesMeta": {
143
+ "bun-plugin-tailwind": {
144
+ "optional": true
145
+ },
146
+ "tailwindcss": {
147
+ "optional": true
148
+ }
149
+ },
150
+ "devDependencies": {
151
+ "@abide/inspector": "workspace:*",
152
+ "bun-plugin-tailwind": "^0.1.2",
153
+ "tailwindcss": "^4.0.0"
154
+ }
155
+ }