@lowdefy/server-dev 6.1.0 → 7.1.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 (624) hide show
  1. package/client/App.jsx +52 -24
  2. package/client/Inspector.jsx +73 -30
  3. package/client/JourneyObserver.jsx +47 -0
  4. package/client/Page.jsx +54 -22
  5. package/client/Recorder.jsx +73 -0
  6. package/client/Routing.jsx +37 -13
  7. package/client/clientBuildImports.test.mjs +2 -0
  8. package/client/devStreamConnections.test.mjs +40 -0
  9. package/client/feedback/FeedbackMount.jsx +2 -2
  10. package/client/feedback/FeedbackOverlay.jsx +7 -4
  11. package/client/feedback/feedbackStyles.js +3 -0
  12. package/client/journeyObserver/startJourneyObserver.js +101 -0
  13. package/client/journeyObserver/startJourneyObserver.test.mjs +149 -0
  14. package/client/openInEditor/OpenInEditorListener.jsx +2 -0
  15. package/client/recorder/buildEngineRecord.js +37 -0
  16. package/client/recorder/buildInteractionRecord.js +64 -0
  17. package/client/recorder/buildTraceEvent.js +57 -0
  18. package/client/recorder/buildTraceEvent.test.mjs +81 -0
  19. package/client/recorder/chunkRecords.js +69 -0
  20. package/client/recorder/chunkRecords.test.mjs +59 -0
  21. package/client/recorder/collectEventActions.js +30 -0
  22. package/client/recorder/collectEventEndpoints.js +40 -0
  23. package/client/recorder/collectEventRequests.js +39 -0
  24. package/client/recorder/createPairingBuffer.js +187 -0
  25. package/client/recorder/createPairingBuffer.test.mjs +405 -0
  26. package/client/recorder/createPasswordRedactor.js +84 -0
  27. package/client/recorder/createRecordBatcher.js +54 -0
  28. package/client/recorder/createRecordBatcher.test.mjs +76 -0
  29. package/client/recorder/createRecorder.js +216 -0
  30. package/client/recorder/createRecorder.test.mjs +318 -0
  31. package/client/recorder/createRecordingSession.js +61 -0
  32. package/client/recorder/createRecordingSession.test.mjs +72 -0
  33. package/client/recorder/diffStateWrites.js +77 -0
  34. package/client/recorder/diffStateWrites.test.mjs +66 -0
  35. package/client/recorder/isEventCall.js +30 -0
  36. package/client/recorder/jsonType.js +39 -0
  37. package/client/recorder/keyChord.js +47 -0
  38. package/client/recorder/keyChord.test.mjs +50 -0
  39. package/client/recorder/sendRecords.js +40 -0
  40. package/client/recorder/toJsonSafe.js +29 -0
  41. package/lib/client/BuildingPage.jsx +3 -1
  42. package/lib/client/ErrorBar.jsx +17 -13
  43. package/lib/client/RedirectingPage.jsx +56 -0
  44. package/lib/client/auth/Auth.jsx +11 -6
  45. package/lib/client/auth/AuthConfigured.jsx +222 -36
  46. package/lib/client/auth/AuthNotConfigured.js +45 -4
  47. package/lib/client/auth/authNotConfiguredParity.test.mjs +61 -0
  48. package/lib/client/auth/authTemplateSync.test.mjs +40 -0
  49. package/lib/client/auth/betterAuthSessionContract.test.mjs +181 -0
  50. package/lib/client/auth/createFetchCheckingBuild.js +45 -0
  51. package/lib/client/bundleBuildId.js +25 -0
  52. package/lib/client/collectVisibleBlockIds.js +51 -0
  53. package/lib/client/getCspNonce.js +25 -0
  54. package/lib/client/getPagePath.js +36 -0
  55. package/lib/client/getPagePath.test.mjs +51 -0
  56. package/lib/client/utils/formatErrorsForCopy.js +30 -0
  57. package/lib/client/utils/formatErrorsForCopy.test.mjs +39 -0
  58. package/lib/client/utils/getErrorBarColor.js +25 -0
  59. package/lib/client/utils/getErrorBarColor.test.mjs +34 -0
  60. package/lib/client/utils/request.js +8 -1
  61. package/lib/client/utils/usePageConfig.js +89 -25
  62. package/lib/client/utils/usePageConfig.test.mjs +198 -13
  63. package/lib/configTree/buildConfigTree.mjs +58 -0
  64. package/lib/configTree/buildConfigTree.test.mjs +77 -0
  65. package/lib/configTree/collectConfigText.mjs +101 -0
  66. package/lib/configTree/collectConfigText.test.mjs +116 -0
  67. package/lib/configTree/prepareScratchServer.mjs +46 -0
  68. package/lib/configTree/runConfigTreeBuild.mjs +88 -0
  69. package/lib/configTree/runConfigTreeBuild.skipPluginChecks.test.mjs +74 -0
  70. package/lib/configTree/runConfigTreeBuild.test.mjs +202 -0
  71. package/lib/docs/JourneyStepError.js +30 -0
  72. package/lib/docs/acquireBrowserSlot.js +30 -0
  73. package/lib/docs/addNestedEndpoints.js +54 -0
  74. package/lib/docs/addNestedEndpoints.test.mjs +185 -0
  75. package/lib/docs/addWriteFlags.js +77 -0
  76. package/lib/docs/buildEditedPages.js +50 -0
  77. package/lib/docs/buildWaitHeader.js +21 -0
  78. package/lib/docs/captureAnnotatedScreenshot.js +23 -12
  79. package/lib/docs/checkAgentFiles.js +148 -0
  80. package/lib/docs/checkAgentFiles.test.mjs +225 -0
  81. package/lib/docs/checkStepReferences.js +239 -0
  82. package/lib/docs/checkStepReferences.test.mjs +173 -0
  83. package/lib/docs/checkpointStore.js +3 -0
  84. package/lib/docs/clientErrorStore.js +18 -1
  85. package/lib/docs/clientErrorStore.test.mjs +46 -0
  86. package/lib/docs/collectExercised.js +52 -0
  87. package/lib/docs/createBrowserLifecycle.js +102 -0
  88. package/lib/docs/createBrowserLifecycle.test.mjs +212 -0
  89. package/lib/docs/createDocsMcpServer.js +345 -388
  90. package/lib/docs/createDocsMcpServer.test.mjs +644 -4
  91. package/lib/docs/createDocsMcpServerRunJourney.test.mjs +148 -0
  92. package/lib/docs/createJourneyActors.chromium.test.mjs +227 -0
  93. package/lib/docs/createJourneyActors.js +213 -0
  94. package/lib/docs/createJourneyActors.test.mjs +79 -0
  95. package/lib/docs/createJourneyObservations.js +80 -0
  96. package/lib/docs/createLeftOriginError.js +26 -0
  97. package/lib/docs/createNetworkCounter.js +101 -0
  98. package/lib/docs/dataSets/checkSharedCollectionIds.js +78 -0
  99. package/lib/docs/dataSets/dataSessionRegistry.js +25 -0
  100. package/lib/docs/dataSets/dataSetJourneys.chromium.mongodb.test.mjs +727 -0
  101. package/lib/docs/dataSets/describeDataSetResult.js +25 -0
  102. package/lib/docs/dataSets/describeDatabaseTarget.js +46 -0
  103. package/lib/docs/dataSets/describeTargetKey.js +29 -0
  104. package/lib/docs/dataSets/deserializeFixture.js +34 -0
  105. package/lib/docs/dataSets/drainSessionWork.js +37 -0
  106. package/lib/docs/dataSets/drainSessionWork.test.mjs +64 -0
  107. package/lib/docs/dataSets/duplicateIndexName.js +24 -0
  108. package/lib/docs/dataSets/getDataStore.js +106 -0
  109. package/lib/docs/dataSets/getDataStore.mongodb.test.mjs +63 -0
  110. package/lib/docs/dataSets/getDataStore.test.mjs +195 -0
  111. package/lib/docs/dataSets/groupDataSetByCollection.js +52 -0
  112. package/lib/docs/dataSets/insertFixture.js +57 -0
  113. package/lib/docs/dataSets/insertGeneratedDocuments.js +41 -0
  114. package/lib/docs/dataSets/isDataStoreGone.js +29 -0
  115. package/lib/docs/dataSets/loadDataSetCollection.js +42 -0
  116. package/lib/docs/dataSets/mergeCollectionIndexes.js +52 -0
  117. package/lib/docs/dataSets/mergeCollectionIndexes.test.mjs +59 -0
  118. package/lib/docs/dataSets/openDataSession.js +133 -0
  119. package/lib/docs/dataSets/openDataSession.mongodb.test.mjs +493 -0
  120. package/lib/docs/dataSets/pickDataStorePort.js +58 -0
  121. package/lib/docs/dataSets/pickDataStorePort.test.mjs +63 -0
  122. package/lib/docs/dataSets/readConnectionArtifacts.js +46 -0
  123. package/lib/docs/dataSets/readDataSession.js +41 -0
  124. package/lib/docs/dataSets/readDataSession.test.mjs +57 -0
  125. package/lib/docs/dataSets/readDataSet.js +83 -0
  126. package/lib/docs/dataSets/readDataSet.test.mjs +251 -0
  127. package/lib/docs/dataSets/registerDataStoreShutdown.js +47 -0
  128. package/lib/docs/dataSets/removeDataStoreFiles.js +32 -0
  129. package/lib/docs/dataSets/resolveDataSetCollection.js +46 -0
  130. package/lib/docs/dataSets/resolveJourneyDataSet.js +106 -0
  131. package/lib/docs/dataSets/resolveJourneyDataSet.test.mjs +130 -0
  132. package/lib/docs/dataSets/sessionDatabaseName.js +32 -0
  133. package/lib/docs/dataSets/sweepOrphanDatabases.js +36 -0
  134. package/lib/docs/dataSets/test/app/lowdefy.yaml +225 -0
  135. package/lib/docs/dataSets/test/app/modules/archive/module.lowdefy.yaml +30 -0
  136. package/lib/docs/dataSets/test/app/tests/data/shop.yaml +12 -0
  137. package/lib/docs/dataSets/test/buildTestApp.mjs +43 -0
  138. package/lib/docs/devEventBus.js +136 -0
  139. package/lib/docs/devEventBus.test.mjs +269 -0
  140. package/lib/docs/devToolDefinitions.js +529 -0
  141. package/lib/docs/docSources.js +21 -0
  142. package/lib/docs/docs.test.mjs +171 -15
  143. package/lib/docs/docsIndex.test.mjs +377 -0
  144. package/lib/docs/evalOperator.js +5 -3
  145. package/lib/docs/evalOperatorHeadless.js +84 -12
  146. package/lib/docs/evalOperatorHeadless.test.mjs +7 -1
  147. package/lib/docs/evalOperatorInTab.js +2 -1
  148. package/lib/docs/findConfig.js +95 -49
  149. package/lib/docs/fitResponse.js +81 -0
  150. package/lib/docs/fitResponse.test.mjs +128 -0
  151. package/lib/docs/formatFeedback.js +26 -5
  152. package/lib/docs/formatFeedback.test.mjs +48 -0
  153. package/lib/docs/getAppMap.js +7 -1
  154. package/lib/docs/getBrowser.js +150 -80
  155. package/lib/docs/getBrowser.test.mjs +407 -16
  156. package/lib/docs/getBuildId.js +61 -0
  157. package/lib/docs/getBuildId.test.mjs +84 -0
  158. package/lib/docs/getBuildStatus.js +81 -7
  159. package/lib/docs/getBuildStatus.test.mjs +229 -0
  160. package/lib/docs/getBuildStatusAfterEdits.js +35 -0
  161. package/lib/docs/getBuildStatusAfterEdits.test.mjs +76 -0
  162. package/lib/docs/getCoreDoc.js +9 -1
  163. package/lib/docs/getDoc.js +100 -0
  164. package/lib/docs/getDocsIndex.js +152 -0
  165. package/lib/docs/getHazards.js +115 -0
  166. package/lib/docs/getHazards.test.mjs +175 -0
  167. package/lib/docs/getMailOutboxDirectory.js +26 -0
  168. package/lib/docs/getOverview.js +79 -13
  169. package/lib/docs/getOverviewBasePath.test.mjs +37 -0
  170. package/lib/docs/getPageBuildStatus.js +46 -0
  171. package/lib/docs/getPluginDoc.js +21 -23
  172. package/lib/docs/getSchema.js +33 -1
  173. package/lib/docs/getStaleStatus.js +36 -0
  174. package/lib/docs/getStaleStatus.test.mjs +74 -0
  175. package/lib/docs/guardJourneyOrigin.js +39 -0
  176. package/lib/docs/inspectState.js +5 -3
  177. package/lib/docs/inspectStateFromTab.js +2 -2
  178. package/lib/docs/inspectStateHeadless.js +89 -27
  179. package/lib/docs/inspectStateHeadless.test.mjs +20 -1
  180. package/lib/docs/installHeadlessShell.failure.test.mjs +45 -0
  181. package/lib/docs/installHeadlessShell.js +123 -0
  182. package/lib/docs/installHeadlessShell.test.mjs +70 -0
  183. package/lib/docs/installHeadlessShell.timeout.test.mjs +72 -0
  184. package/lib/docs/isHeadlessShellIncomplete.js +34 -0
  185. package/lib/docs/isHeadlessShellIncomplete.test.mjs +63 -0
  186. package/lib/docs/isPageReady.js +77 -0
  187. package/lib/docs/isPageReady.test.mjs +235 -0
  188. package/lib/docs/isRunErrorEntry.js +25 -0
  189. package/lib/docs/journeyMutantCookie.chromium.test.mjs +150 -0
  190. package/lib/docs/journeyRunRecording.js +35 -0
  191. package/lib/docs/journeyRunRecording.test.mjs +39 -0
  192. package/lib/docs/keepEventStreamAlive.js +68 -0
  193. package/lib/docs/keepEventStreamAlive.test.mjs +77 -0
  194. package/lib/docs/launchBrowser.js +83 -0
  195. package/lib/docs/launchBrowser.test.mjs +175 -0
  196. package/lib/docs/listModuleDocEntries.js +69 -0
  197. package/lib/docs/listPackageDocFiles.js +67 -0
  198. package/lib/docs/listPluginDocEntries.js +111 -0
  199. package/lib/docs/listPlugins.js +9 -58
  200. package/lib/docs/listTypes.js +14 -6
  201. package/lib/docs/loadFrameworkHazards.js +40 -0
  202. package/lib/docs/loadFrameworkHazards.test.mjs +43 -0
  203. package/lib/docs/loadState.js +103 -35
  204. package/lib/docs/makeModuleManifestDoc.js +174 -0
  205. package/lib/docs/matchExercisedPages.js +35 -0
  206. package/lib/docs/matchJourneyRoute.js +69 -0
  207. package/lib/docs/matchJourneyRoute.test.mjs +178 -0
  208. package/lib/docs/mergeNetworkSnapshots.js +49 -0
  209. package/lib/docs/nextJourneySequence.js +30 -0
  210. package/lib/docs/noBrowserError.js +22 -0
  211. package/lib/docs/observe/TRANSIENT_SELECTOR.js +21 -0
  212. package/lib/docs/observe/claimExpectedErrors.js +67 -0
  213. package/lib/docs/observe/createJourneyAppErrors.js +236 -0
  214. package/lib/docs/observe/createJourneyAppErrors.test.mjs +385 -0
  215. package/lib/docs/observe/evaluateInvariants.js +183 -0
  216. package/lib/docs/observe/evaluateInvariants.test.mjs +299 -0
  217. package/lib/docs/observe/findingKey.js +29 -0
  218. package/lib/docs/observe/hasNoEffect.js +31 -0
  219. package/lib/docs/observe/hasNoEffect.test.mjs +37 -0
  220. package/lib/docs/observe/installStepObserver.js +72 -0
  221. package/lib/docs/observe/isAppApiUrl.js +33 -0
  222. package/lib/docs/observe/parseAppApiUrl.js +37 -0
  223. package/lib/docs/observe/readStepObserver.js +42 -0
  224. package/lib/docs/observe/relativeSource.js +29 -0
  225. package/lib/docs/observe/resolveConfigKeySource.js +33 -0
  226. package/lib/docs/observe/takeJourneyEvents.js +36 -0
  227. package/lib/docs/observe/toAppErrorFailure.js +61 -0
  228. package/lib/docs/observe/usesSearchStage.js +45 -0
  229. package/lib/docs/observe/waitForClientErrorReports.js +31 -0
  230. package/lib/docs/observe/watchJourneyContext.js +75 -0
  231. package/lib/docs/observe/withAppErrors.js +31 -0
  232. package/lib/docs/observe/withAppErrors.test.mjs +101 -0
  233. package/lib/docs/openJourney.js +94 -0
  234. package/lib/docs/openJourneyEmail.js +41 -0
  235. package/lib/docs/openJourneyEmail.test.mjs +187 -0
  236. package/lib/docs/pageBlocks.js +47 -0
  237. package/lib/docs/pageBuildStatus.test.mjs +103 -0
  238. package/lib/{client/setPageId.js → docs/parseModuleSource.js} +11 -12
  239. package/lib/docs/rails/authEngineActions.js +53 -0
  240. package/lib/docs/rails/authEngineActions.test.mjs +69 -0
  241. package/lib/docs/rails/authEngineMethods.js +52 -0
  242. package/lib/docs/rails/authEngineMethods.test.mjs +36 -0
  243. package/lib/docs/rails/checkAuthActionsRan.js +66 -0
  244. package/lib/docs/rails/checkAuthActionsRan.test.mjs +149 -0
  245. package/lib/docs/rails/checkClickRails.js +56 -0
  246. package/lib/docs/rails/createDataSetRails.js +82 -0
  247. package/lib/docs/rails/createDataSetRails.test.mjs +172 -0
  248. package/lib/docs/rails/findExternalBlocks.js +147 -0
  249. package/lib/docs/rails/findExternalBlocks.test.mjs +254 -0
  250. package/lib/docs/rails/installAuthActionRecorder.js +56 -0
  251. package/lib/docs/rails/readAuthActionRecorder.js +32 -0
  252. package/lib/docs/rails/readBuiltArtifact.js +30 -0
  253. package/lib/docs/readConnectionPlugins.js +26 -0
  254. package/lib/docs/readDevAuthMode.js +32 -0
  255. package/lib/docs/readDocEntry.js +40 -0
  256. package/lib/docs/readDocTitle.js +26 -0
  257. package/lib/docs/readJourneyEmailMatch.js +57 -0
  258. package/lib/docs/readJourneyEmailMatch.test.mjs +110 -0
  259. package/lib/docs/readJourneySession.js +56 -0
  260. package/lib/docs/readMailOutbox.js +37 -0
  261. package/lib/docs/readPagePath.js +27 -0
  262. package/lib/docs/readPluginPackages.js +99 -0
  263. package/lib/docs/readProxyBuildWait.js +38 -0
  264. package/lib/docs/readRoutineSteps.js +45 -0
  265. package/lib/docs/registerShownTextEngine.js +118 -0
  266. package/lib/docs/requestRestart.js +30 -0
  267. package/lib/docs/requestRestart.test.mjs +49 -0
  268. package/lib/docs/resolvePageInstance.js +46 -0
  269. package/lib/docs/resolvePageInstance.test.mjs +81 -0
  270. package/lib/docs/resolveSource.js +11 -7
  271. package/lib/docs/resolveSource.test.mjs +1 -1
  272. package/lib/docs/resolveToolCaller.js +62 -0
  273. package/lib/docs/reviewPage.js +51 -0
  274. package/lib/docs/reviewPageBuilds.js +56 -0
  275. package/lib/docs/reviewPageBuilds.test.mjs +207 -0
  276. package/lib/docs/runCheck.js +75 -0
  277. package/lib/docs/runCheck.test.mjs +91 -0
  278. package/lib/docs/runCheckChild.js +49 -0
  279. package/lib/docs/runEndpoint.js +185 -0
  280. package/lib/docs/runEndpoint.test.mjs +509 -0
  281. package/lib/docs/runErrorBuffers.js +99 -0
  282. package/lib/docs/runErrorBuffers.test.mjs +95 -0
  283. package/lib/docs/runJourney.js +347 -0
  284. package/lib/docs/runJourney.test.mjs +2383 -0
  285. package/lib/docs/runJourneyAsUsers.js +44 -0
  286. package/lib/docs/runJourneyDataSet.test.mjs +274 -0
  287. package/lib/docs/runJourneySteps.js +1320 -0
  288. package/lib/docs/runRequest.js +100 -59
  289. package/lib/docs/runRequest.test.mjs +190 -0
  290. package/lib/docs/saveAnnotatedScreenshot.js +1 -1
  291. package/lib/docs/scaffoldPage.js +3 -1
  292. package/lib/docs/screenshotPage.js +163 -11
  293. package/lib/docs/screenshotPage.test.mjs +263 -1
  294. package/lib/docs/screenshotPageClip.test.mjs +4 -0
  295. package/lib/docs/searchDocs.js +82 -30
  296. package/lib/docs/searchDocs.test.mjs +100 -0
  297. package/lib/docs/searchIcons.js +90 -0
  298. package/lib/docs/searchIcons.test.mjs +127 -0
  299. package/lib/docs/selectExercised.js +39 -0
  300. package/lib/docs/selectFinalState.js +66 -0
  301. package/lib/docs/selectFinalState.test.mjs +51 -0
  302. package/lib/docs/serverErrorStore.js +54 -0
  303. package/lib/docs/serverErrorStore.test.mjs +50 -0
  304. package/lib/docs/setupTestFixtures.mjs +133 -39
  305. package/lib/docs/shownTextSelector.js +28 -0
  306. package/lib/docs/snapshotState.js +13 -5
  307. package/lib/docs/splitSearchTerms.js +62 -0
  308. package/lib/docs/splitSearchTerms.test.mjs +50 -0
  309. package/lib/docs/stateCheckpoints.test.mjs +77 -0
  310. package/lib/docs/tabAvailable.js +6 -5
  311. package/lib/docs/tabChannel.js +127 -21
  312. package/lib/docs/tabChannel.test.mjs +187 -29
  313. package/lib/docs/unsettledPageNote.js +24 -0
  314. package/lib/docs/validateJourneyMail.js +36 -0
  315. package/lib/docs/validateJourneyTimeout.js +38 -0
  316. package/lib/docs/validateJourneyTimeout.test.mjs +29 -0
  317. package/lib/docs/validateRecordingParam.js +42 -0
  318. package/lib/docs/validateStateSelection.js +33 -0
  319. package/lib/docs/validateStateSelection.test.mjs +33 -0
  320. package/lib/docs/validateViewport.js +51 -0
  321. package/lib/docs/validateViewport.test.mjs +54 -0
  322. package/lib/docs/waitForBuild.js +50 -0
  323. package/lib/docs/waitForBuild.test.mjs +75 -0
  324. package/lib/docs/waitForJourneyEmail.js +77 -0
  325. package/lib/docs/withBrowserSlot.js +45 -0
  326. package/lib/docs/withBrowserSlot.test.mjs +75 -0
  327. package/lib/docs/withDataSession.js +53 -0
  328. package/lib/server/applyDataSetRedirect.js +92 -0
  329. package/lib/server/applyDataSetRedirect.test.mjs +446 -0
  330. package/lib/server/applyDataSetRedirectTenantReach.test.mjs +207 -0
  331. package/lib/server/applyDataSetRedirectWalled.test.mjs +134 -0
  332. package/lib/server/auth/createSystemContext.js +73 -0
  333. package/lib/server/auth/{getAuthConfig.js → getAuth.js} +15 -9
  334. package/lib/server/auth/getHeadlessUser.js +9 -8
  335. package/lib/server/auth/getHeadlessUser.test.mjs +41 -0
  336. package/lib/server/auth/getMockUser.js +18 -14
  337. package/lib/server/auth/{session.js → getStrategies.js} +17 -16
  338. package/lib/server/auth/headlessUser.js +3 -2
  339. package/lib/server/auth/journeyActor.js +35 -0
  340. package/lib/server/auth/resolveHeadlessUser.test.mjs +0 -4
  341. package/lib/server/checkPageRecord.js +44 -0
  342. package/lib/server/contextMapBudget.js +24 -0
  343. package/lib/server/contextMapBudget.test.mjs +98 -0
  344. package/lib/server/continueJitKeys.js +28 -0
  345. package/lib/server/continueJitKeys.test.mjs +43 -0
  346. package/lib/server/createDataSessionEndedError.js +33 -0
  347. package/lib/server/createDataSetRefusal.js +26 -0
  348. package/lib/server/createLowdefyContext.js +168 -41
  349. package/lib/server/createLowdefyContext.test.mjs +331 -8
  350. package/lib/server/getClientAddress.js +51 -0
  351. package/lib/server/getClientAddress.test.mjs +56 -0
  352. package/lib/server/getPageJitEnrichment.test.mjs +29 -11
  353. package/lib/server/hashConfigContent.js +26 -0
  354. package/lib/server/importAppCode.test.mjs +57 -0
  355. package/lib/server/isRoutineStep.js +27 -0
  356. package/lib/server/jitPageBuilder.js +309 -126
  357. package/lib/server/jitPageBuilder.skipPluginChecks.test.mjs +78 -0
  358. package/lib/server/jitPageBuilder.test.mjs +218 -0
  359. package/lib/server/journeyCookies/JOURNEY_COOKIES.js +37 -0
  360. package/lib/server/journeyCookies/forwardJourneyCookies.js +46 -0
  361. package/lib/server/journeyCookies/readJourneyCookie.js +52 -0
  362. package/lib/server/journeyCookies/writeJourneyCookie.js +46 -0
  363. package/lib/server/journeyCookies.js +22 -0
  364. package/lib/server/journeyCookies.test.mjs +145 -0
  365. package/lib/server/loadDynamicJsMap.js +47 -0
  366. package/lib/server/log/createHandleError.js +38 -2
  367. package/lib/server/log/createHandleError.test.mjs +125 -2
  368. package/lib/server/log/createLogger.js +3 -0
  369. package/lib/server/log/createLogger.test.mjs +15 -0
  370. package/lib/server/log/logRequest.js +2 -3
  371. package/lib/server/mutantDataSetWrappers.test.mjs +115 -0
  372. package/lib/server/mutants/applyMutant.js +39 -0
  373. package/lib/server/mutants/artifactPatterns.js +25 -0
  374. package/lib/server/mutants/buildAnchor.js +45 -0
  375. package/lib/server/mutants/collectSharedIds.js +41 -0
  376. package/lib/server/mutants/configPathSegments.js +38 -0
  377. package/lib/server/mutants/createMutantReadConfigFile.js +42 -0
  378. package/lib/server/mutants/describeEvent.js +22 -0
  379. package/lib/server/mutants/enumerateArtifact.js +56 -0
  380. package/lib/server/mutants/findNodeByKey.js +45 -0
  381. package/lib/server/mutants/findNodeByPointer.js +49 -0
  382. package/lib/server/mutants/getArtifactKind.js +32 -0
  383. package/lib/server/mutants/groupMutantCopies.js +56 -0
  384. package/lib/server/mutants/hashArtifact.js +25 -0
  385. package/lib/server/mutants/hashMutantTarget.js +34 -0
  386. package/lib/server/mutants/listMutants.js +122 -0
  387. package/lib/server/mutants/listMutants.test.mjs +502 -0
  388. package/lib/server/mutants/mutantId.js +30 -0
  389. package/lib/server/mutants/mutantRuns.js +57 -0
  390. package/lib/server/mutants/mutantRuns.test.mjs +136 -0
  391. package/lib/server/mutants/operators/dropAction.js +47 -0
  392. package/lib/server/mutants/operators/dropBlock.js +44 -0
  393. package/lib/server/mutants/operators/dropPayload.js +52 -0
  394. package/lib/server/mutants/operators/dropStep.js +44 -0
  395. package/lib/server/mutants/operators/flipVisible.js +53 -0
  396. package/lib/server/mutants/operators/index.js +37 -0
  397. package/lib/server/mutants/operators/retargetLink.js +72 -0
  398. package/lib/server/mutants/operators/skipValidate.js +77 -0
  399. package/lib/server/mutants/operators/swapIf.js +112 -0
  400. package/lib/server/mutants/operators.test.mjs +396 -0
  401. package/lib/server/mutants/positionFreePath.js +38 -0
  402. package/lib/server/mutants/removeFromParent.js +28 -0
  403. package/lib/server/mutants/test/fixtures.mjs +173 -0
  404. package/lib/server/mutants/test/keyArtifact.mjs +63 -0
  405. package/lib/server/mutants/validateMutantParam.js +69 -0
  406. package/lib/server/mutants/validateMutantsBody.js +88 -0
  407. package/lib/server/mutants/walkArtifact.js +179 -0
  408. package/lib/server/pageBuildRecords.js +131 -0
  409. package/lib/server/pageBuildRecords.test.mjs +258 -0
  410. package/lib/server/pageCache.mjs +22 -7
  411. package/lib/server/pageCache.test.mjs +22 -7
  412. package/lib/server/pageRebuilds.test.mjs +543 -0
  413. package/lib/server/pruneJitMaps.js +36 -0
  414. package/lib/server/pruneJitMaps.test.mjs +55 -0
  415. package/lib/server/readInstanceRecord.js +33 -0
  416. package/lib/server/readInstanceRecord.test.mjs +99 -0
  417. package/lib/server/readMergedMaps.js +86 -0
  418. package/lib/server/readMergedMaps.test.mjs +79 -0
  419. package/lib/server/recording/appendRecords.js +33 -0
  420. package/lib/server/recording/errorRecordingStamp.js +34 -0
  421. package/lib/server/recording/errorRecordingStamp.test.mjs +31 -0
  422. package/lib/server/recording/isRecordingEnabled.js +31 -0
  423. package/lib/server/recording/readRecordingCookie.js +71 -0
  424. package/lib/server/recording/readRecordingCookie.test.mjs +73 -0
  425. package/lib/server/recording/recordingCookiePayload.js +33 -0
  426. package/lib/server/recording/servedBuilds.js +46 -0
  427. package/lib/server/recording/servedBuilds.test.mjs +42 -0
  428. package/lib/server/sinkExternalConnections.js +95 -0
  429. package/lib/server/sinkExternalConnections.test.mjs +135 -0
  430. package/lib/server/skipStaleMapWrites.js +62 -0
  431. package/lib/server/skipStaleMapWrites.test.mjs +113 -0
  432. package/lib/server/startIdleGc.js +67 -0
  433. package/lib/server/startIdleGc.test.mjs +138 -0
  434. package/lib/server/testFixtures/importAppCodeTwice.mjs +70 -0
  435. package/lib/server/trackSessionWork.js +30 -0
  436. package/lib/vite/createDevServerExclude.js +40 -0
  437. package/lib/vite/createDevServerExclude.test.mjs +79 -0
  438. package/manager/getContext.mjs +25 -3
  439. package/manager/processes/initialBuild.mjs +17 -1
  440. package/manager/processes/initialBuild.test.mjs +104 -0
  441. package/manager/processes/lowdefyBuild.mjs +31 -7
  442. package/manager/processes/lowdefyBuild.skipPluginChecks.test.mjs +72 -0
  443. package/manager/processes/lowdefyBuild.test.mjs +136 -1
  444. package/manager/processes/optimizeDependencies.mjs +59 -0
  445. package/manager/processes/restartServer.mjs +34 -6
  446. package/manager/processes/restartServer.test.mjs +162 -0
  447. package/manager/processes/shutdownServer.mjs +11 -0
  448. package/manager/processes/shutdownServer.test.mjs +45 -0
  449. package/manager/processes/startFirstServer.mjs +46 -0
  450. package/manager/processes/startFirstServer.test.mjs +326 -0
  451. package/manager/processes/startMailSink.mjs +135 -0
  452. package/manager/processes/startMailSink.test.mjs +146 -0
  453. package/manager/processes/startProxy.mjs +129 -12
  454. package/manager/processes/startProxy.test.mjs +366 -0
  455. package/manager/processes/startServer.mjs +47 -6
  456. package/manager/processes/startServer.test.mjs +155 -0
  457. package/manager/processes/startWatchers.mjs +6 -4
  458. package/manager/processes/syncServer.mjs +69 -0
  459. package/manager/processes/syncServer.test.mjs +141 -0
  460. package/manager/processes/waitForDevServer.mjs +48 -0
  461. package/manager/processes/waitForDevServer.test.mjs +112 -0
  462. package/manager/run.mjs +128 -43
  463. package/manager/utils/BatchChanges.mjs +21 -5
  464. package/manager/utils/BatchChanges.test.mjs +77 -0
  465. package/manager/utils/acquireDevInstance.mjs +99 -0
  466. package/manager/utils/acquireDevInstance.test.mjs +160 -0
  467. package/manager/utils/createBuildActivity.mjs +67 -0
  468. package/manager/utils/createBuildActivity.test.mjs +58 -0
  469. package/manager/utils/createChangeSignal.mjs +39 -0
  470. package/manager/utils/createChangeSignal.test.mjs +62 -0
  471. package/manager/utils/createCustomPluginMessagesMap.mjs +23 -33
  472. package/manager/utils/createCustomPluginTypesMap.mjs +24 -30
  473. package/manager/utils/createCustomPluginTypesMap.test.mjs +94 -0
  474. package/manager/utils/createDotPathIgnore.mjs +44 -0
  475. package/manager/utils/createDotPathIgnore.test.mjs +65 -0
  476. package/manager/utils/createIdleGc.mjs +51 -0
  477. package/manager/utils/createIdleGc.test.mjs +77 -0
  478. package/manager/utils/createRequestActivity.mjs +100 -0
  479. package/manager/utils/createRequestActivity.test.mjs +121 -0
  480. package/manager/utils/createServerArtifactTracker.mjs +83 -0
  481. package/manager/utils/createServerArtifactTracker.test.mjs +78 -0
  482. package/manager/utils/createServerEnv.mjs +39 -0
  483. package/manager/utils/filesHaveSameBytes.mjs +41 -0
  484. package/manager/utils/findBuildFilesOutsideWatch.mjs +59 -0
  485. package/manager/utils/findBuildFilesOutsideWatch.test.mjs +111 -0
  486. package/manager/utils/importFresh.mjs +46 -0
  487. package/manager/utils/importFresh.test.mjs +72 -0
  488. package/manager/utils/importFreshWorker.mjs +20 -0
  489. package/manager/utils/killTaggedBrowser.mjs +35 -0
  490. package/manager/utils/pagePathChanged.mjs +56 -0
  491. package/manager/utils/pruneRecordings.mjs +85 -0
  492. package/manager/utils/pruneRecordings.test.mjs +117 -0
  493. package/manager/utils/publishBuildDirectory.mjs +121 -0
  494. package/manager/utils/publishBuildDirectory.order.test.mjs +74 -0
  495. package/manager/utils/publishBuildDirectory.test.mjs +262 -0
  496. package/manager/utils/readBasePath.mjs +27 -0
  497. package/manager/utils/readBasePath.test.mjs +43 -0
  498. package/manager/utils/readBuildStatusWait.mjs +67 -0
  499. package/manager/utils/readManagerVersion.mjs +30 -0
  500. package/manager/utils/readManagerVersion.test.mjs +35 -0
  501. package/manager/utils/readPluginDefinitions.mjs +36 -0
  502. package/manager/utils/resolveDevAuthUrl.mjs +58 -0
  503. package/manager/utils/resolveDevAuthUrl.test.mjs +107 -0
  504. package/manager/utils/resolvePorts.mjs +49 -0
  505. package/manager/utils/setupWatcher.mjs +19 -11
  506. package/manager/utils/startRecordingPruner.mjs +45 -0
  507. package/manager/utils/startRecordingPruner.test.mjs +66 -0
  508. package/manager/utils/waitForChildExit.mjs +53 -0
  509. package/manager/utils/waitForChildExit.test.mjs +70 -0
  510. package/manager/utils/waitForServer.mjs +44 -0
  511. package/manager/utils/writeBuildStatus.mjs +1 -1
  512. package/manager/watchers/createPluginSourceIgnore.mjs +77 -0
  513. package/manager/watchers/envWatcher.mjs +9 -2
  514. package/manager/watchers/envWatcher.test.mjs +87 -0
  515. package/manager/watchers/listServerSidePackages.mjs +47 -0
  516. package/manager/watchers/listServerSidePackages.test.mjs +38 -0
  517. package/manager/watchers/lowdefyBuildWatcher.mjs +106 -22
  518. package/manager/watchers/lowdefyBuildWatcher.test.mjs +309 -0
  519. package/manager/watchers/pluginSourceWatcher.mjs +79 -0
  520. package/manager/watchers/pluginSourceWatcher.test.mjs +222 -0
  521. package/manager/watchers/restartRequestWatcher.mjs +71 -0
  522. package/manager/watchers/restartRequestWatcher.test.mjs +111 -0
  523. package/manager/watchers/selectLocalPluginPackages.mjs +48 -0
  524. package/manager/watchers/selectLocalPluginPackages.test.mjs +73 -0
  525. package/manager/watchers/serverPackageWatcher.mjs +38 -0
  526. package/package.json +60 -47
  527. package/package.original.json +60 -47
  528. package/src/app.js +131 -20
  529. package/src/html/renderDevPage.js +63 -11
  530. package/src/html/renderDevPage.test.mjs +138 -0
  531. package/src/lib/getRequestPath.js +29 -0
  532. package/src/middleware/createSameOriginGuard.js +37 -0
  533. package/src/middleware/createSameOriginGuard.test.mjs +102 -0
  534. package/src/middleware/errorHandler.js +51 -1
  535. package/src/middleware/errorHandler.test.mjs +173 -3
  536. package/src/middleware/isRebindingSafeHost.js +44 -0
  537. package/src/middleware/isRebindingSafeHost.test.mjs +32 -0
  538. package/src/middleware/localDevToolsOnly.js +38 -0
  539. package/src/middleware/localDevToolsOnly.test.mjs +61 -0
  540. package/src/middleware/noStore.js +27 -0
  541. package/src/middleware/noStore.test.mjs +48 -0
  542. package/src/middleware/requestTimeout.js +38 -0
  543. package/src/middleware/staleFlag.js +76 -0
  544. package/src/middleware/staleFlag.test.mjs +127 -0
  545. package/src/middleware/stampCaller.js +38 -0
  546. package/src/middleware/stampCaller.test.mjs +64 -0
  547. package/src/routes/agent.js +15 -3
  548. package/src/routes/auth.js +29 -20
  549. package/src/routes/auth.test.mjs +30 -56
  550. package/src/routes/clientError.js +13 -13
  551. package/src/routes/cron.js +3 -1
  552. package/src/routes/cronForward.js +3 -1
  553. package/src/routes/detached.js +22 -9
  554. package/src/routes/devInspect.js +17 -8
  555. package/src/routes/devInspect.test.mjs +44 -7
  556. package/src/routes/devRecording.js +113 -0
  557. package/src/routes/devRecording.test.mjs +253 -0
  558. package/src/routes/docs/buildStatus.js +10 -2
  559. package/src/routes/docs/buildStatus.test.mjs +46 -0
  560. package/src/routes/docs/content.js +5 -3
  561. package/src/routes/docs/evalOperator.js +15 -1
  562. package/src/routes/docs/events.js +50 -0
  563. package/src/routes/docs/events.test.mjs +117 -0
  564. package/src/routes/docs/find.js +9 -1
  565. package/src/routes/docs/icons.js +30 -0
  566. package/src/routes/docs/inspectState.js +16 -1
  567. package/src/routes/docs/journey.js +194 -0
  568. package/src/routes/docs/journey.test.mjs +401 -0
  569. package/src/routes/docs/journeyRefusals.test.mjs +71 -0
  570. package/src/routes/docs/loadState.js +4 -2
  571. package/src/routes/docs/mcp.js +34 -3
  572. package/src/routes/docs/mcp.test.mjs +130 -0
  573. package/src/routes/docs/mutants.js +78 -0
  574. package/src/routes/docs/mutants.test.mjs +180 -0
  575. package/src/routes/docs/parsePathParamsParam.js +41 -0
  576. package/src/routes/docs/parsePathParamsParam.test.mjs +42 -0
  577. package/src/routes/docs/parseUserParam.js +27 -21
  578. package/src/routes/docs/parseUserParam.test.mjs +17 -5
  579. package/src/routes/docs/restart.js +35 -0
  580. package/src/routes/docs/restart.test.mjs +64 -0
  581. package/src/routes/docs/runEndpoint.js +54 -0
  582. package/src/routes/docs/runEndpoint.test.mjs +165 -0
  583. package/src/routes/docs/runRequest.js +25 -8
  584. package/src/routes/docs/runRequest.test.mjs +92 -0
  585. package/src/routes/docs/screenshot.js +50 -2
  586. package/src/routes/docs/screenshot.test.mjs +117 -0
  587. package/src/routes/docs/search.js +15 -2
  588. package/src/routes/docs/snapshotState.js +17 -3
  589. package/src/routes/endpoints.js +27 -26
  590. package/src/routes/endpointsTextAnswer.test.mjs +77 -0
  591. package/src/routes/feedback.js +10 -13
  592. package/src/routes/jitPage.js +99 -35
  593. package/src/routes/jitPage.test.mjs +248 -0
  594. package/src/routes/mcp.js +82 -5
  595. package/src/routes/mcp.test.mjs +215 -0
  596. package/src/routes/mcpMemberToken.test.mjs +125 -0
  597. package/src/routes/mcpProtectedResourceMetadata.js +34 -0
  598. package/src/routes/mcpProtectedResourceMetadata.test.mjs +65 -0
  599. package/src/routes/mountDevPageRoutes.js +25 -0
  600. package/src/routes/mountDevPageRoutes.test.mjs +30 -0
  601. package/src/routes/mountOauthDiscovery.js +44 -0
  602. package/src/routes/mountOauthDiscovery.test.mjs +79 -0
  603. package/src/routes/normalizeMcpProtocolVersionHeader.js +46 -0
  604. package/src/routes/normalizeMcpProtocolVersionHeader.test.mjs +62 -0
  605. package/src/routes/reload.js +16 -0
  606. package/src/routes/request.js +6 -4
  607. package/src/routes/request.test.mjs +9 -5
  608. package/src/routes/requestBody.test.mjs +159 -0
  609. package/src/routes/usage.js +6 -2
  610. package/src/routes/user.js +27 -0
  611. package/src/routes/websocket.js +29 -8
  612. package/src/routes/websocket.test.mjs +65 -0
  613. package/src/routes/wellKnownFallback.js +30 -0
  614. package/src/routes/wellKnownFallback.test.mjs +32 -0
  615. package/src/websocket/devWebSocket.js +41 -26
  616. package/src/websocket/devWebSocket.test.mjs +157 -0
  617. package/vite.config.js +53 -23
  618. package/lib/server/auth/getDevSession.js +0 -70
  619. package/lib/server/auth/getDevSession.test.mjs +0 -138
  620. package/manager/processes/warnAuthUrlPortMismatch.mjs +0 -47
  621. package/manager/processes/warnAuthUrlPortMismatch.test.mjs +0 -93
  622. package/manager/watchers/moduleBuildWatcher.mjs +0 -79
  623. package/manager/watchers/serverArtifactWatcher.mjs +0 -120
  624. package/src/routes/apiPage.js +0 -37
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lowdefy/server-dev",
3
- "version": "6.1.0",
3
+ "version": "7.1.0",
4
4
  "license": "Apache-2.0",
5
5
  "description": "",
6
6
  "homepage": "https://lowdefy.com",
@@ -39,62 +39,69 @@
39
39
  ],
40
40
  "dependencies": {
41
41
  "@ant-design/cssinjs": "2.1.2",
42
- "@ant-design/x": "2.7.0",
43
- "@auth/core": "0.41.3",
44
- "@hono/auth-js": "1.1.1",
45
- "@hono/mcp": "0.3.0",
42
+ "@ant-design/x": "2.9.0",
43
+ "@better-auth/oauth-provider": "1.7.7",
44
+ "@better-auth/passkey": "1.7.7",
45
+ "@hono/mcp": "0.3.2",
46
46
  "@hono/node-server": "2.0.10",
47
47
  "@hono/vite-dev-server": "0.26.0",
48
- "@lowdefy/actions-core": "6.1.0",
49
- "@lowdefy/api": "6.1.0",
50
- "@lowdefy/block-utils": "6.1.0",
51
- "@lowdefy/blocks-aggrid": "6.1.0",
52
- "@lowdefy/blocks-antd": "6.1.0",
53
- "@lowdefy/blocks-antd-x": "6.1.0",
54
- "@lowdefy/blocks-basic": "6.1.0",
55
- "@lowdefy/blocks-echarts": "6.1.0",
56
- "@lowdefy/blocks-loaders": "6.1.0",
57
- "@lowdefy/blocks-markdown": "6.1.0",
58
- "@lowdefy/blocks-tiptap": "6.1.0",
59
- "@lowdefy/build": "6.1.0",
60
- "@lowdefy/client": "6.1.0",
61
- "@lowdefy/connection-axios-http": "6.1.0",
62
- "@lowdefy/docs-content": "6.1.0",
63
- "@lowdefy/engine": "6.1.0",
64
- "@lowdefy/errors": "6.1.0",
65
- "@lowdefy/helpers": "6.1.0",
66
- "@lowdefy/layout": "6.1.0",
67
- "@lowdefy/logger": "6.1.0",
68
- "@lowdefy/node-utils": "6.1.0",
69
- "@lowdefy/operators-change-case": "6.1.0",
70
- "@lowdefy/operators-dayjs": "6.1.0",
71
- "@lowdefy/operators-diff": "6.1.0",
72
- "@lowdefy/operators-js": "6.1.0",
73
- "@lowdefy/operators-mql": "6.1.0",
74
- "@lowdefy/operators-nunjucks": "6.1.0",
75
- "@lowdefy/operators-uuid": "6.1.0",
76
- "@lowdefy/operators-yaml": "6.1.0",
77
- "@lowdefy/plugin-next-auth": "6.1.0",
78
- "@lowdefy/websockets-core": "6.1.0",
79
- "@modelcontextprotocol/sdk": "1.29.0",
80
- "@tailwindcss/postcss": "4.3.1",
48
+ "@lowdefy/actions-core": "7.1.0",
49
+ "@lowdefy/api": "7.1.0",
50
+ "@lowdefy/block-utils": "7.1.0",
51
+ "@lowdefy/blocks-aggrid": "7.1.0",
52
+ "@lowdefy/blocks-antd": "7.1.0",
53
+ "@lowdefy/blocks-antd-x": "7.1.0",
54
+ "@lowdefy/blocks-basic": "7.1.0",
55
+ "@lowdefy/blocks-captcha": "7.1.0",
56
+ "@lowdefy/blocks-echarts": "7.1.0",
57
+ "@lowdefy/blocks-loaders": "7.1.0",
58
+ "@lowdefy/blocks-markdown": "7.1.0",
59
+ "@lowdefy/blocks-table": "7.1.0",
60
+ "@lowdefy/blocks-tiptap": "7.1.0",
61
+ "@lowdefy/build": "7.1.0",
62
+ "@lowdefy/client": "7.1.0",
63
+ "@lowdefy/connection-axios-http": "7.1.0",
64
+ "@lowdefy/connection-mongodb": "7.1.0",
65
+ "@lowdefy/docs-content": "7.1.0",
66
+ "@lowdefy/e2e-utils": "7.1.0",
67
+ "@lowdefy/engine": "7.1.0",
68
+ "@lowdefy/errors": "7.1.0",
69
+ "@lowdefy/helpers": "7.1.0",
70
+ "@lowdefy/layout": "7.1.0",
71
+ "@lowdefy/logger": "7.1.0",
72
+ "@lowdefy/node-utils": "7.1.0",
73
+ "@lowdefy/operators-change-case": "7.1.0",
74
+ "@lowdefy/operators-cron": "7.1.0",
75
+ "@lowdefy/operators-dayjs": "7.1.0",
76
+ "@lowdefy/operators-diff": "7.1.0",
77
+ "@lowdefy/operators-js": "7.1.0",
78
+ "@lowdefy/operators-mql": "7.1.0",
79
+ "@lowdefy/operators-nunjucks": "7.1.0",
80
+ "@lowdefy/operators-uuid": "7.1.0",
81
+ "@lowdefy/operators-yaml": "7.1.0",
82
+ "@lowdefy/plugin-better-auth": "7.1.0",
83
+ "@lowdefy/websockets-core": "7.1.0",
84
+ "@modelcontextprotocol/sdk": "1.31.0",
85
+ "@tailwindcss/postcss": "4.3.3",
81
86
  "@vitejs/plugin-react": "6.0.2",
82
- "antd": "6.3.1",
87
+ "antd": "6.6.5",
88
+ "better-auth": "1.7.7",
83
89
  "chokidar": "3.5.3",
84
90
  "dayjs": "1.11.20",
85
91
  "dotenv": "16.3.1",
86
- "hono": "4.13.5",
92
+ "hono": "4.13.7",
87
93
  "html-to-image": "1.11.13",
94
+ "mongodb": "7.2.0",
95
+ "mongodb-memory-server-core": "9.2.0",
88
96
  "opener": "1.5.2",
89
97
  "pino": "10.3.1",
90
98
  "playwright-core": "1.59.1",
91
- "postcss": "8.5.23",
92
- "process": "0.11.10",
99
+ "postal-mime": "3.0.0",
93
100
  "react": "18.2.0",
94
101
  "react-dom": "18.2.0",
95
- "react-icons": "5.6.0",
102
+ "smtp-server": "3.19.13",
96
103
  "swr": "2.2.4",
97
- "tailwindcss": "4.3.1",
104
+ "tailwindcss": "4.3.3",
98
105
  "tinykeys": "3.0.0",
99
106
  "uuid": "14.0.0",
100
107
  "vite": "8.0.16",
@@ -104,10 +111,14 @@
104
111
  "zod": "3.25.76"
105
112
  },
106
113
  "devDependencies": {
107
- "jest": "28.1.3"
114
+ "@jest/globals": "28.1.3",
115
+ "@shelf/jest-mongodb": "4.3.2",
116
+ "jest": "28.1.3",
117
+ "jest-environment-jsdom": "28.1.3",
118
+ "nodemailer": "10.0.13"
108
119
  },
109
120
  "engines": {
110
- "node": ">=22"
121
+ "node": ">=24"
111
122
  },
112
123
  "publishConfig": {
113
124
  "access": "public"
@@ -116,6 +127,8 @@
116
127
  "scripts": {
117
128
  "build": "cp package.json package.original.json || copy package.json package.original.json",
118
129
  "start": "node manager/run.mjs",
119
- "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"
130
+ "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
131
+ "test:fixture": "node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.fixture.config.mjs",
132
+ "test:mongodb": "node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.mongodb.config.mjs"
120
133
  }
121
134
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lowdefy/server-dev",
3
- "version": "6.1.0",
3
+ "version": "7.1.0",
4
4
  "license": "Apache-2.0",
5
5
  "description": "",
6
6
  "homepage": "https://lowdefy.com",
@@ -41,66 +41,75 @@
41
41
  "build": "cp package.json package.original.json || copy package.json package.original.json",
42
42
  "prepublishOnly": "pnpm build",
43
43
  "start": "node manager/run.mjs",
44
- "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"
44
+ "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
45
+ "test:fixture": "node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.fixture.config.mjs",
46
+ "test:mongodb": "node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.mongodb.config.mjs"
45
47
  },
46
48
  "dependencies": {
47
49
  "@ant-design/cssinjs": "2.1.2",
48
- "@ant-design/x": "2.7.0",
49
- "@auth/core": "0.41.3",
50
- "@hono/auth-js": "1.1.1",
51
- "@hono/mcp": "0.3.0",
50
+ "@ant-design/x": "2.9.0",
51
+ "@better-auth/oauth-provider": "1.7.7",
52
+ "@better-auth/passkey": "1.7.7",
53
+ "@hono/mcp": "0.3.2",
52
54
  "@hono/node-server": "2.0.10",
53
55
  "@hono/vite-dev-server": "0.26.0",
54
- "@lowdefy/actions-core": "6.1.0",
55
- "@lowdefy/api": "6.1.0",
56
- "@lowdefy/block-utils": "6.1.0",
57
- "@lowdefy/blocks-aggrid": "6.1.0",
58
- "@lowdefy/blocks-antd": "6.1.0",
59
- "@lowdefy/blocks-antd-x": "6.1.0",
60
- "@lowdefy/blocks-basic": "6.1.0",
61
- "@lowdefy/blocks-echarts": "6.1.0",
62
- "@lowdefy/blocks-loaders": "6.1.0",
63
- "@lowdefy/blocks-markdown": "6.1.0",
64
- "@lowdefy/blocks-tiptap": "6.1.0",
65
- "@lowdefy/build": "6.1.0",
66
- "@lowdefy/client": "6.1.0",
67
- "@lowdefy/connection-axios-http": "6.1.0",
68
- "@lowdefy/docs-content": "6.1.0",
69
- "@lowdefy/engine": "6.1.0",
70
- "@lowdefy/errors": "6.1.0",
71
- "@lowdefy/helpers": "6.1.0",
72
- "@lowdefy/layout": "6.1.0",
73
- "@lowdefy/logger": "6.1.0",
74
- "@lowdefy/node-utils": "6.1.0",
75
- "@lowdefy/operators-change-case": "6.1.0",
76
- "@lowdefy/operators-dayjs": "6.1.0",
77
- "@lowdefy/operators-diff": "6.1.0",
78
- "@lowdefy/operators-js": "6.1.0",
79
- "@lowdefy/operators-mql": "6.1.0",
80
- "@lowdefy/operators-nunjucks": "6.1.0",
81
- "@lowdefy/operators-uuid": "6.1.0",
82
- "@lowdefy/operators-yaml": "6.1.0",
83
- "@lowdefy/plugin-next-auth": "6.1.0",
84
- "@lowdefy/websockets-core": "6.1.0",
85
- "@modelcontextprotocol/sdk": "1.29.0",
86
- "@tailwindcss/postcss": "4.3.1",
56
+ "@lowdefy/actions-core": "7.1.0",
57
+ "@lowdefy/api": "7.1.0",
58
+ "@lowdefy/block-utils": "7.1.0",
59
+ "@lowdefy/blocks-aggrid": "7.1.0",
60
+ "@lowdefy/blocks-antd": "7.1.0",
61
+ "@lowdefy/blocks-antd-x": "7.1.0",
62
+ "@lowdefy/blocks-basic": "7.1.0",
63
+ "@lowdefy/blocks-captcha": "7.1.0",
64
+ "@lowdefy/blocks-echarts": "7.1.0",
65
+ "@lowdefy/blocks-loaders": "7.1.0",
66
+ "@lowdefy/blocks-markdown": "7.1.0",
67
+ "@lowdefy/blocks-table": "7.1.0",
68
+ "@lowdefy/blocks-tiptap": "7.1.0",
69
+ "@lowdefy/build": "7.1.0",
70
+ "@lowdefy/client": "7.1.0",
71
+ "@lowdefy/connection-axios-http": "7.1.0",
72
+ "@lowdefy/connection-mongodb": "7.1.0",
73
+ "@lowdefy/docs-content": "7.1.0",
74
+ "@lowdefy/e2e-utils": "7.1.0",
75
+ "@lowdefy/engine": "7.1.0",
76
+ "@lowdefy/errors": "7.1.0",
77
+ "@lowdefy/helpers": "7.1.0",
78
+ "@lowdefy/layout": "7.1.0",
79
+ "@lowdefy/logger": "7.1.0",
80
+ "@lowdefy/node-utils": "7.1.0",
81
+ "@lowdefy/operators-change-case": "7.1.0",
82
+ "@lowdefy/operators-cron": "7.1.0",
83
+ "@lowdefy/operators-dayjs": "7.1.0",
84
+ "@lowdefy/operators-diff": "7.1.0",
85
+ "@lowdefy/operators-js": "7.1.0",
86
+ "@lowdefy/operators-mql": "7.1.0",
87
+ "@lowdefy/operators-nunjucks": "7.1.0",
88
+ "@lowdefy/operators-uuid": "7.1.0",
89
+ "@lowdefy/operators-yaml": "7.1.0",
90
+ "@lowdefy/plugin-better-auth": "7.1.0",
91
+ "@lowdefy/websockets-core": "7.1.0",
92
+ "@modelcontextprotocol/sdk": "1.31.0",
93
+ "@tailwindcss/postcss": "4.3.3",
87
94
  "@vitejs/plugin-react": "6.0.2",
88
- "antd": "6.3.1",
95
+ "antd": "6.6.5",
96
+ "better-auth": "1.7.7",
89
97
  "chokidar": "3.5.3",
90
98
  "dayjs": "1.11.20",
91
99
  "dotenv": "16.3.1",
92
- "hono": "4.13.5",
100
+ "hono": "4.13.7",
93
101
  "html-to-image": "1.11.13",
102
+ "mongodb": "7.2.0",
103
+ "mongodb-memory-server-core": "9.2.0",
94
104
  "opener": "1.5.2",
95
105
  "pino": "10.3.1",
96
106
  "playwright-core": "1.59.1",
97
- "postcss": "8.5.23",
98
- "process": "0.11.10",
107
+ "postal-mime": "3.0.0",
99
108
  "react": "18.2.0",
100
109
  "react-dom": "18.2.0",
101
- "react-icons": "5.6.0",
110
+ "smtp-server": "3.19.13",
102
111
  "swr": "2.2.4",
103
- "tailwindcss": "4.3.1",
112
+ "tailwindcss": "4.3.3",
104
113
  "tinykeys": "3.0.0",
105
114
  "uuid": "14.0.0",
106
115
  "vite": "8.0.16",
@@ -110,10 +119,14 @@
110
119
  "zod": "3.25.76"
111
120
  },
112
121
  "devDependencies": {
113
- "jest": "28.1.3"
122
+ "@jest/globals": "28.1.3",
123
+ "@shelf/jest-mongodb": "4.3.2",
124
+ "jest": "28.1.3",
125
+ "jest-environment-jsdom": "28.1.3",
126
+ "nodemailer": "10.0.13"
114
127
  },
115
128
  "engines": {
116
- "node": ">=22"
129
+ "node": ">=24"
117
130
  },
118
131
  "publishConfig": {
119
132
  "access": "public"
package/src/app.js CHANGED
@@ -16,8 +16,8 @@
16
16
 
17
17
  import { Hono } from 'hono';
18
18
  import { bodyLimit } from 'hono/body-limit';
19
- import { initAuthConfig } from '@hono/auth-js';
20
19
  import { serveStatic } from '@hono/node-server/serve-static';
20
+ import { runInCredentialScope } from '@lowdefy/node-utils';
21
21
 
22
22
  import agentHandler from './routes/agent.js';
23
23
  import apiContext from './middleware/apiContext.js';
@@ -30,6 +30,7 @@ import cronForwardHandler from './routes/cronForward.js';
30
30
  import cronHandler from './routes/cron.js';
31
31
  import detachedHandler from './routes/detached.js';
32
32
  import devInspectHandler from './routes/devInspect.js';
33
+ import devRecordingHandler from './routes/devRecording.js';
33
34
  import devToolsHandler from './routes/devTools.js';
34
35
  import feedbackHandler from './routes/feedback.js';
35
36
  import docsAppMapHandler from './routes/docs/appMap.js';
@@ -39,13 +40,18 @@ import docsCheckpointsListHandler from './routes/docs/checkpointsList.js';
39
40
  import docsCheckpointsRevertHandler from './routes/docs/checkpointsRevert.js';
40
41
  import docsContentHandler from './routes/docs/content.js';
41
42
  import docsEvalOperatorHandler from './routes/docs/evalOperator.js';
43
+ import docsEventsHandler from './routes/docs/events.js';
42
44
  import docsExamplesHandler from './routes/docs/examples.js';
43
45
  import docsFindHandler from './routes/docs/find.js';
44
46
  import docsIndexHandler from './routes/docs/index.js';
45
47
  import docsInspectStateHandler from './routes/docs/inspectState.js';
48
+ import docsJourneyHandler from './routes/docs/journey.js';
49
+ import docsMutantsHandler from './routes/docs/mutants.js';
46
50
  import docsLoadStateHandler from './routes/docs/loadState.js';
47
51
  import docsMcpHandler from './routes/docs/mcp.js';
48
52
  import docsPageConfigHandler from './routes/docs/pageConfig.js';
53
+ import docsRestartHandler from './routes/docs/restart.js';
54
+ import docsRunEndpointHandler from './routes/docs/runEndpoint.js';
49
55
  import docsRunRequestHandler from './routes/docs/runRequest.js';
50
56
  import docsSnapshotStateHandler from './routes/docs/snapshotState.js';
51
57
  import docsStateCheckpointsListHandler from './routes/docs/stateCheckpointsList.js';
@@ -53,23 +59,41 @@ import docsPluginDocHandler from './routes/docs/pluginDoc.js';
53
59
  import docsPluginsHandler from './routes/docs/plugins.js';
54
60
  import docsSchemaHandler from './routes/docs/schema.js';
55
61
  import docsScreenshotHandler from './routes/docs/screenshot.js';
62
+ import docsIconsHandler from './routes/docs/icons.js';
56
63
  import docsSearchHandler from './routes/docs/search.js';
57
64
  import docsTypesHandler from './routes/docs/types.js';
58
65
  import endpointsHandler from './routes/endpoints.js';
59
- import getAuthConfig from '../lib/server/auth/getAuthConfig.js';
66
+ import getAuth from '../lib/server/auth/getAuth.js';
67
+ import getStrategies from '../lib/server/auth/getStrategies.js';
68
+ import getMockUser from '../lib/server/auth/getMockUser.js';
60
69
  import jitPageHandler from './routes/jitPage.js';
70
+ import localDevToolsOnly from './middleware/localDevToolsOnly.js';
61
71
  import lowdefyConfig from '../lib/build/config.js';
62
72
  import mcpHandler from './routes/mcp.js';
73
+ import mountDevPageRoutes from './routes/mountDevPageRoutes.js';
74
+ import mountOauthDiscovery from './routes/mountOauthDiscovery.js';
75
+ import noStore from './middleware/noStore.js';
76
+ import wellKnownFallbackHandler from './routes/wellKnownFallback.js';
63
77
  import pingHandler from './routes/ping.js';
64
78
  import reloadHandler from './routes/reload.js';
65
79
  import renderDevPage from './html/renderDevPage.js';
66
80
  import requestHandler from './routes/request.js';
81
+ import requestTimeout from './middleware/requestTimeout.js';
67
82
  import rootHandler from './routes/root.js';
83
+ import staleFlag from './middleware/staleFlag.js';
84
+ import stampCaller from './middleware/stampCaller.js';
85
+ import startIdleGc from '../lib/server/startIdleGc.js';
86
+ import getDocsIndex from '../lib/docs/getDocsIndex.js';
68
87
  import usageHandler from './routes/usage.js';
88
+ import userHandler from './routes/user.js';
69
89
  import websocketHandler from './routes/websocket.js';
70
90
 
71
91
  const basePath = lowdefyConfig.basePath ?? '';
72
92
 
93
+ // Same default as the production server, so a request that would time out in production (a 504
94
+ // the page shows as a generic error, beside the other requests' results) also times out in dev.
95
+ const requestTimeoutMs = lowdefyConfig.requestTimeout ?? 30000;
96
+
73
97
  // Dev Hono app — mounted into Vite via @hono/vite-dev-server (Vite owns HTTP
74
98
  // and serves /client/* modules with HMR; everything else lands here).
75
99
  // No compression in dev (parity with the old next.config compress: false,
@@ -78,6 +102,10 @@ function createApp() {
78
102
  const app = basePath ? new Hono().basePath(basePath) : new Hono();
79
103
  const logger = createLogger({ server: 'lowdefy-dev' });
80
104
 
105
+ // Each request runs in its own credential scope: what it marks with _credential is scrubbed
106
+ // from every log line written while it is handled.
107
+ app.use('*', (c, next) => runInCredentialScope(next));
108
+
81
109
  // No api context: SSE/health routes had no apiWrapper before.
82
110
  app.get('/api/reload', reloadHandler);
83
111
  app.get('/api/ping', pingHandler);
@@ -88,34 +116,59 @@ function createApp() {
88
116
  // /lowdefy-feedback is a reserved page-path prefix in dev, like /lowdefy-docs.
89
117
  app.post('/lowdefy-feedback', feedbackHandler);
90
118
 
91
- // Auth config must be registered before the /lowdefy-docs routes: Hono
92
- // middleware only applies to routes registered after it, and run-request/
93
- // eval-operator build a full Lowdefy context whose getSession(c) reads the
94
- // authConfig this middleware sets. It does not protect any route — it only
95
- // makes the auth config available on the Hono context.
96
- if (authJson.configured === true) {
97
- app.use(
98
- '*',
99
- initAuthConfig(() => getAuthConfig({ logger }))
100
- );
119
+ const mockUser = getMockUser();
120
+ if (authJson.configured === true && !mockUser) {
121
+ // Construct the BetterAuth instance and strategy verifiers at startup so
122
+ // config errors fail boot instead of the first request, and so the
123
+ // process-memoized singletons capture the base logger rather than the
124
+ // first request's rid-scoped child.
125
+ getAuth({ logger });
126
+ getStrategies({ logger });
101
127
  }
102
128
 
129
+ mountOauthDiscovery({
130
+ app,
131
+ auth: authJson.configured === true && !mockUser ? getAuth({ logger }) : null,
132
+ });
133
+ app.all('/.well-known/*', wellKnownFallbackHandler);
134
+
103
135
  // Docs and MCP endpoint for AI coding agents — always on in dev. Serves
104
136
  // schemas/examples/docs for every installed plugin (core and local) plus
105
137
  // the extracted core docs (@lowdefy/docs-content). Mounted outside /api/*
106
138
  // so it can't clash with user API endpoints; /lowdefy-docs is a reserved page
107
139
  // prefix in dev. The handlers need no auth protection or api context —
108
- // they read build artifacts and node_modules directly — but run-request
109
- // and eval-operator read the caller's session, hence initAuthConfig above.
140
+ // they read build artifacts and node_modules directly — but run-request,
141
+ // run-endpoint and eval-operator build a full Lowdefy context (createLowdefyContext),
142
+ // which resolves the caller from the request headers via resolveAuthentication.
143
+ // The MCP transport is registered before staleFlag on purpose: hono
144
+ // dispatches in registration order, so the stale middleware never sees a
145
+ // JSON-RPC envelope. MCP carries its own stale notice, prepended to each
146
+ // tool result in createDocsMcpServer — merging fields into the envelope
147
+ // instead would put unknown members on a strictly-validated message.
148
+ // localDevToolsOnly comes first of all: it refuses requests a browser sends
149
+ // on behalf of another site. Registered twice because hono's `/*` pattern
150
+ // does not match the bare path.
151
+ app.use('/lowdefy-docs', localDevToolsOnly());
152
+ app.use('/lowdefy-docs/*', localDevToolsOnly());
110
153
  app.all('/lowdefy-docs/mcp', docsMcpHandler);
154
+ // Flags every other docs response while the last build failed. Registered
155
+ // twice: hono's `/*` pattern does not match the bare path.
156
+ app.use('/lowdefy-docs', staleFlag());
157
+ app.use('/lowdefy-docs/*', staleFlag());
111
158
  app.get('/lowdefy-docs', docsIndexHandler);
112
159
  app.get('/lowdefy-docs/build-status', docsBuildStatusHandler);
113
- app.get('/lowdefy-docs/page-config/:pageId', docsPageConfigHandler);
160
+ // Push channel for non-MCP clients. Must sit above the `/lowdefy-docs/:kind`
161
+ // catch-all, which would otherwise treat "events" as a type kind.
162
+ app.get('/lowdefy-docs/events', docsEventsHandler);
163
+ app.get('/lowdefy-docs/page-config/:pageId{.+}', docsPageConfigHandler);
114
164
  app.get('/lowdefy-docs/find/:id', docsFindHandler);
115
- app.get('/lowdefy-docs/screenshot/:pageId', docsScreenshotHandler);
116
- app.get('/lowdefy-docs/inspect-state/:pageId', docsInspectStateHandler);
165
+ app.get('/lowdefy-docs/screenshot/:pageId{.+}', docsScreenshotHandler);
166
+ app.post('/lowdefy-docs/journey', docsJourneyHandler);
167
+ app.post('/lowdefy-docs/mutants', docsMutantsHandler);
168
+ app.get('/lowdefy-docs/inspect-state/:pageId{.+}', docsInspectStateHandler);
117
169
  app.post('/lowdefy-docs/eval-operator', docsEvalOperatorHandler);
118
170
  app.post('/lowdefy-docs/run-request', docsRunRequestHandler);
171
+ app.post('/lowdefy-docs/run-endpoint', docsRunEndpointHandler);
119
172
  app.get('/lowdefy-docs/app-map', docsAppMapHandler);
120
173
  app.get('/lowdefy-docs/checkpoints', docsCheckpointsListHandler);
121
174
  app.post('/lowdefy-docs/checkpoints', docsCheckpointsCreateHandler);
@@ -123,21 +176,71 @@ function createApp() {
123
176
  app.get('/lowdefy-docs/state-checkpoints', docsStateCheckpointsListHandler);
124
177
  app.post('/lowdefy-docs/state-checkpoints/snapshot', docsSnapshotStateHandler);
125
178
  app.post('/lowdefy-docs/state-checkpoints/load', docsLoadStateHandler);
179
+ app.post('/lowdefy-docs/restart', docsRestartHandler);
126
180
  // Live-tab inspection channel: dev tabs (client/Inspector.jsx) answer
127
181
  // targeted SSE events by posting results here; GET lists connected tabs
128
182
  // and serves checkpoint parts for the ?_checkpoint bootstrap.
183
+ // The live-tab channel acts on the developer's open tabs and loads recorded
184
+ // request mocks - the same cross-site guard as the docs tools.
185
+ app.use('/api/dev-inspect', localDevToolsOnly());
186
+ app.use('/api/dev-inspect/*', localDevToolsOnly());
129
187
  app.all('/api/dev-inspect', devInspectHandler);
130
188
  app.all('/api/dev-inspect/*', devInspectHandler);
189
+ // The dev recorder (client/Recorder.jsx) posts interaction records here.
190
+ // It needs no Lowdefy context, and registering it before apiContext keeps
191
+ // it out of the request timeout list.
192
+ app.use('/api/dev-recording', localDevToolsOnly());
193
+ app.post('/api/dev-recording', bodyLimit({ maxSize: 1024 * 1024 }), devRecordingHandler);
194
+ // Built now so the first doc search does not pay for reading every plugin
195
+ // and module's docs.
196
+ getDocsIndex();
131
197
  app.get('/lowdefy-docs/plugins', docsPluginsHandler);
132
198
  app.get('/lowdefy-docs/schema/:kind/:type', docsSchemaHandler);
133
199
  app.get('/lowdefy-docs/examples/:type', docsExamplesHandler);
134
200
  app.get('/lowdefy-docs/search', docsSearchHandler);
201
+ app.get('/lowdefy-docs/icons', docsIconsHandler);
135
202
  app.get('/lowdefy-docs/plugin-doc/:package{.+}', docsPluginDocHandler);
136
203
  app.get('/lowdefy-docs/content/:slug{.+}', docsContentHandler);
137
204
  app.get('/lowdefy-docs/:kind', docsTypesHandler);
138
205
 
206
+ // Only the routes that run app logic: JIT page builds, the docs/MCP routes and the SSE streams
207
+ // are dev-only and can legitimately run longer than any production request.
208
+ if (requestTimeoutMs > 0) {
209
+ const timeoutMiddleware = requestTimeout({ timeoutMs: requestTimeoutMs });
210
+ [
211
+ '/api/request/*',
212
+ '/api/endpoints/*',
213
+ '/api/cron/*',
214
+ '/api/cron-forward/*',
215
+ '/api/detached/*',
216
+ ].forEach((route) => app.use(route, timeoutMiddleware));
217
+ }
218
+
139
219
  app.use('/api/*', apiContext());
140
- app.use('/api/auth/*', authMiddleware());
220
+ // Responses that carry the caller's data are never stored by a browser or proxy cache,
221
+ // as in the production server. /api/root is the dev form of the root config the
222
+ // production page embeds. The page routes use the same middleware.
223
+ const noStoreMiddleware = noStore();
224
+ ['/api/root', '/api/page/*', '/api/user', '/api/request/*', '/api/endpoints/*'].forEach((route) =>
225
+ app.use(route, noStoreMiddleware)
226
+ );
227
+ // Unified dev get-session: createLowdefyContext resolves the mock or headless
228
+ // caller into context.user on every path, so read it here rather than
229
+ // re-deriving the precedence. context.user is only absent in the real-engine
230
+ // case (the developer's own browser), which must fall through to BetterAuth.
231
+ // Registered before the /api/auth/* mount so this exact path wins while every
232
+ // other auth route still reaches the engine.
233
+ app.get('/api/auth/get-session', async (c, next) => {
234
+ const context = c.get('lowdefyContext');
235
+ if (context.user) return c.json({ session: { id: 'dev' }, user: context.user });
236
+ return next();
237
+ });
238
+ app.use('/api/auth/*', authMiddleware({ logger }));
239
+ // The caller each page, request and endpoint response was answered as: the
240
+ // client reloads when it differs from the caller it renders (stampCaller).
241
+ app.use('/api/request/*', stampCaller());
242
+ app.use('/api/endpoints/*', stampCaller());
243
+ app.use('/api/page/*', stampCaller());
141
244
  app.get('/api/root', rootHandler);
142
245
  app.get('/api/page/*', jitPageHandler);
143
246
  app.all('/api/request/*', requestHandler);
@@ -152,6 +255,7 @@ function createApp() {
152
255
  app.all('/api/agent/*', bodyLimit({ maxSize: 10 * 1024 * 1024 }), agentHandler);
153
256
  app.all('/api/mcp', bodyLimit({ maxSize: 10 * 1024 * 1024 }), mcpHandler);
154
257
  app.get('/api/websocket', websocketHandler);
258
+ app.get('/api/user', userHandler);
155
259
 
156
260
  // User public assets (icons, images). Vite serves /client modules itself.
157
261
  app.use(
@@ -164,12 +268,19 @@ function createApp() {
164
268
 
165
269
  // Every page path renders the same shell — the client fetches config and
166
270
  // handles home/404 routing, exactly like the old dev pages router did.
167
- app.get('/', (c) => renderDevPage(c, { basePath }));
168
- app.get('/:rest{.+}', (c) => renderDevPage(c, { basePath }));
271
+ // The context middleware runs here too (mirroring the production server)
272
+ // so the shell can inject the resolved caller — without it the client's
273
+ // _user never carries roles/organization_id under `lowdefy dev`.
274
+ app.use('/*', apiContext());
275
+ // Registered after the static middleware, which answers a file without calling next().
276
+ app.use('/*', noStoreMiddleware);
277
+ mountDevPageRoutes({ app, renderPage: (c) => renderDevPage(c, { basePath }) });
169
278
 
170
279
  app.onError(createErrorHandler({ basePath, logger }));
171
280
 
172
281
  return app;
173
282
  }
174
283
 
284
+ startIdleGc({ configDirectory: process.env.LOWDEFY_DIRECTORY_CONFIG });
285
+
175
286
  export default createApp();