@lowdefy/server-dev 0.0.0-experimental-20260720072521 → 0.0.0-experimental-20260720135014

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 (196) hide show
  1. package/.eslintrc.yaml +1 -0
  2. package/lib/build/app.js +1 -8
  3. package/lib/build/appMeta.js +1 -8
  4. package/lib/build/auth.js +1 -8
  5. package/lib/build/config.js +1 -8
  6. package/lib/build/i18n.js +1 -8
  7. package/lib/build/logger.js +1 -8
  8. package/lib/build/theme.js +1 -8
  9. package/lib/client/App.js +80 -0
  10. package/{client/Page.jsx → lib/client/Page.js} +5 -5
  11. package/{client/Reload.jsx → lib/client/Reload.js} +7 -5
  12. package/lib/client/auth/{Auth.jsx → Auth.js} +5 -12
  13. package/lib/client/auth/AuthConfigured.js +61 -0
  14. package/lib/client/auth/AuthNotConfigured.js +2 -22
  15. package/lib/client/setPageId.js +5 -6
  16. package/lib/client/utils/useMutateCache.js +1 -14
  17. package/lib/client/utils/usePageConfig.js +11 -31
  18. package/lib/server/apiWrapper.js +116 -0
  19. package/lib/server/auth/{getStrategies.js → getAuthOptions.js} +9 -14
  20. package/lib/server/auth/{getMockUser.js → getMockSession.js} +19 -10
  21. package/{src/routes/docs/checkpointsRevert.js → lib/server/auth/getServerSession.js} +13 -11
  22. package/lib/server/compileCss.js +39 -0
  23. package/lib/server/jitPageBuilder.js +11 -36
  24. package/lib/server/log/logRequest.js +3 -1
  25. package/manager/getContext.mjs +7 -3
  26. package/manager/processes/compileCss.mjs +54 -0
  27. package/manager/processes/initialBuild.mjs +2 -0
  28. package/manager/processes/installPlugins.mjs +11 -19
  29. package/manager/processes/lowdefyBuild.mjs +7 -29
  30. package/manager/processes/nextBuild.mjs +50 -0
  31. package/manager/processes/readDotEnv.mjs +1 -13
  32. package/manager/processes/shutdownServer.mjs +6 -6
  33. package/manager/processes/startServer.mjs +7 -8
  34. package/manager/processes/startWatchers.mjs +2 -2
  35. package/manager/run.mjs +0 -41
  36. package/manager/utils/createCustomPluginMessagesMap.mjs +1 -8
  37. package/manager/utils/createCustomPluginTypesMap.mjs +2 -3
  38. package/manager/utils/{getViteBin.mjs → getNextBin.mjs} +10 -7
  39. package/manager/utils/updatePageTailwindCss.mjs +1 -7
  40. package/manager/watchers/lowdefyBuildWatcher.mjs +1 -0
  41. package/manager/watchers/moduleBuildWatcher.mjs +1 -0
  42. package/manager/watchers/{serverArtifactWatcher.mjs → nextBuildWatcher.mjs} +22 -18
  43. package/next.config.js +25 -0
  44. package/package.json +47 -63
  45. package/package.original.json +55 -66
  46. package/{src/routes/devTools.js → pages/404.js} +2 -4
  47. package/{src/routes/docs/appMap.js → pages/[[...pageId]].js} +2 -6
  48. package/{client/App.jsx → pages/_app.js} +33 -21
  49. package/pages/_document.js +107 -0
  50. package/pages/api/agent/[...path].js +86 -0
  51. package/pages/api/auth/[...nextauth].js +48 -0
  52. package/pages/api/client-error.js +45 -0
  53. package/{src/routes/docs/buildStatus.js → pages/api/dev-tools.js} +4 -5
  54. package/{lib/docs/clientErrorStore.js → pages/api/endpoints/[...endpointId].js} +11 -15
  55. package/{src/lib/serveBuildJs.js → pages/api/icons/dynamic.js} +12 -8
  56. package/{src/routes/jsEnv.js → pages/api/js/[env].js} +20 -8
  57. package/pages/api/page/[...pageId].js +74 -0
  58. package/{src/routes → pages/api}/ping.js +2 -4
  59. package/pages/api/reload.js +53 -0
  60. package/pages/api/request/[...path].js +41 -0
  61. package/{src/routes → pages/api}/root.js +4 -4
  62. package/client/Inspector.jsx +0 -206
  63. package/client/Routing.jsx +0 -106
  64. package/client/feedback/FeedbackMount.jsx +0 -83
  65. package/client/feedback/FeedbackOverlay.jsx +0 -901
  66. package/client/feedback/captureTabScreenshot.js +0 -84
  67. package/client/feedback/copyToClipboard.js +0 -45
  68. package/client/feedback/drawAnnotationsSvg.js +0 -119
  69. package/client/feedback/elementInspect.js +0 -99
  70. package/client/feedback/feedbackStyles.js +0 -301
  71. package/client/feedback/pinResponsiveImages.js +0 -59
  72. package/client/feedback/sendFeedback.js +0 -39
  73. package/client/feedback/useFeedbackToggle.js +0 -70
  74. package/client/main.jsx +0 -42
  75. package/client/openInEditor/OpenInEditorListener.jsx +0 -261
  76. package/client/openInEditor/findBlockLocation.js +0 -51
  77. package/lib/client/auth/AuthConfigured.jsx +0 -155
  78. package/lib/docs/captureAnnotatedScreenshot.js +0 -88
  79. package/lib/docs/checkpointPaths.js +0 -91
  80. package/lib/docs/checkpointStore.js +0 -234
  81. package/lib/docs/checkpointToMocks.js +0 -65
  82. package/lib/docs/configCheckpoints.test.mjs +0 -156
  83. package/lib/docs/createConfigCheckpoint.js +0 -92
  84. package/lib/docs/createDocsMcpServer.js +0 -506
  85. package/lib/docs/createDocsMcpServer.test.mjs +0 -123
  86. package/lib/docs/devMockRegistry.js +0 -68
  87. package/lib/docs/docs.test.mjs +0 -448
  88. package/lib/docs/enrichFeedback.js +0 -71
  89. package/lib/docs/evalOperator.js +0 -39
  90. package/lib/docs/evalOperator.test.mjs +0 -112
  91. package/lib/docs/evalOperatorHeadless.js +0 -87
  92. package/lib/docs/evalOperatorHeadless.test.mjs +0 -72
  93. package/lib/docs/evalOperatorInTab.js +0 -48
  94. package/lib/docs/findConfig.js +0 -260
  95. package/lib/docs/formatFeedback.js +0 -121
  96. package/lib/docs/formatFeedback.test.mjs +0 -204
  97. package/lib/docs/getAppMap.js +0 -180
  98. package/lib/docs/getBrowser.js +0 -115
  99. package/lib/docs/getBuildStatus.js +0 -37
  100. package/lib/docs/getCoreDoc.js +0 -63
  101. package/lib/docs/getDocsManifest.js +0 -40
  102. package/lib/docs/getExamples.js +0 -58
  103. package/lib/docs/getOverview.js +0 -115
  104. package/lib/docs/getPageConfig.js +0 -53
  105. package/lib/docs/getPluginDoc.js +0 -55
  106. package/lib/docs/getSchema.js +0 -65
  107. package/lib/docs/inspectState.js +0 -41
  108. package/lib/docs/inspectState.test.mjs +0 -91
  109. package/lib/docs/inspectStateFromTab.js +0 -40
  110. package/lib/docs/inspectStateHeadless.js +0 -84
  111. package/lib/docs/inspectStateHeadless.test.mjs +0 -60
  112. package/lib/docs/isWriteRequestsAllowed.js +0 -50
  113. package/lib/docs/listConfigCheckpoints.js +0 -55
  114. package/lib/docs/listPlugins.js +0 -80
  115. package/lib/docs/listTypes.js +0 -105
  116. package/lib/docs/loadState.js +0 -139
  117. package/lib/docs/mapPageBuildErrors.js +0 -28
  118. package/lib/docs/normalizeTypeKind.js +0 -40
  119. package/lib/docs/readBuildArtifact.js +0 -35
  120. package/lib/docs/readPageArtifact.js +0 -26
  121. package/lib/docs/resolvePluginDir.js +0 -49
  122. package/lib/docs/revertConfigCheckpoint.js +0 -73
  123. package/lib/docs/runRequest.js +0 -141
  124. package/lib/docs/saveAnnotatedScreenshot.js +0 -43
  125. package/lib/docs/scaffoldPage.js +0 -75
  126. package/lib/docs/scaffoldPage.test.mjs +0 -97
  127. package/lib/docs/screenshotPage.js +0 -109
  128. package/lib/docs/screenshotPage.test.mjs +0 -59
  129. package/lib/docs/screenshotPageClip.test.mjs +0 -102
  130. package/lib/docs/searchDocs.js +0 -67
  131. package/lib/docs/setupTestFixtures.mjs +0 -335
  132. package/lib/docs/snapshotState.js +0 -59
  133. package/lib/docs/stateCheckpoints.test.mjs +0 -348
  134. package/lib/docs/tabAvailable.js +0 -28
  135. package/lib/docs/tabChannel.js +0 -119
  136. package/lib/docs/tabChannel.test.mjs +0 -130
  137. package/lib/server/auth/createSystemContext.js +0 -70
  138. package/lib/server/auth/getAuth.js +0 -46
  139. package/lib/server/auth/getHeadlessUser.js +0 -39
  140. package/lib/server/auth/headlessUser.js +0 -30
  141. package/lib/server/createLowdefyContext.js +0 -133
  142. package/lib/server/loadDynamicJsMap.js +0 -47
  143. package/manager/processes/lowdefyBuild.test.mjs +0 -102
  144. package/manager/utils/formatNoticeBox.mjs +0 -30
  145. package/manager/utils/writeBuildStatus.mjs +0 -39
  146. package/manager/utils/writeBuildStatus.test.mjs +0 -76
  147. package/postcss.config.cjs +0 -1
  148. package/src/app.js +0 -188
  149. package/src/html/renderDevPage.js +0 -86
  150. package/src/lib/getPathSegments.js +0 -25
  151. package/src/lib/safeScriptJson.js +0 -38
  152. package/src/middleware/apiContext.js +0 -32
  153. package/src/middleware/errorHandler.js +0 -55
  154. package/src/routes/agent.js +0 -64
  155. package/src/routes/auth.js +0 -43
  156. package/src/routes/clientError.js +0 -57
  157. package/src/routes/cron.js +0 -44
  158. package/src/routes/detached.js +0 -51
  159. package/src/routes/devInspect.js +0 -94
  160. package/src/routes/docs/checkpointsCreate.js +0 -28
  161. package/src/routes/docs/checkpointsList.js +0 -23
  162. package/src/routes/docs/content.js +0 -31
  163. package/src/routes/docs/evalOperator.js +0 -46
  164. package/src/routes/docs/examples.js +0 -33
  165. package/src/routes/docs/find.js +0 -30
  166. package/src/routes/docs/index.js +0 -23
  167. package/src/routes/docs/inspectState.js +0 -34
  168. package/src/routes/docs/loadState.js +0 -38
  169. package/src/routes/docs/mcp.js +0 -30
  170. package/src/routes/docs/pageConfig.js +0 -36
  171. package/src/routes/docs/pluginDoc.js +0 -33
  172. package/src/routes/docs/plugins.js +0 -23
  173. package/src/routes/docs/runRequest.js +0 -34
  174. package/src/routes/docs/schema.js +0 -37
  175. package/src/routes/docs/screenshot.js +0 -66
  176. package/src/routes/docs/search.js +0 -27
  177. package/src/routes/docs/snapshotState.js +0 -36
  178. package/src/routes/docs/stateCheckpointsList.js +0 -26
  179. package/src/routes/docs/types.js +0 -33
  180. package/src/routes/endpoints.js +0 -76
  181. package/src/routes/feedback.js +0 -110
  182. package/src/routes/feedback.test.mjs +0 -204
  183. package/src/routes/iconsDynamic.js +0 -25
  184. package/src/routes/jitPage.js +0 -99
  185. package/src/routes/reload.js +0 -81
  186. package/src/routes/request.js +0 -66
  187. package/src/routes/usage.js +0 -46
  188. package/src/routes/user.js +0 -27
  189. package/src/routes/websocket.js +0 -33
  190. package/src/websocket/devWebSocket.js +0 -78
  191. package/vite.config.js +0 -111
  192. /package/lib/client/{BuildErrorPage.jsx → BuildErrorPage.js} +0 -0
  193. /package/lib/client/{BuildingPage.jsx → BuildingPage.js} +0 -0
  194. /package/lib/client/{ErrorBar.jsx → ErrorBar.js} +0 -0
  195. /package/lib/client/{InstallingPluginsPage.jsx → InstallingPluginsPage.js} +0 -0
  196. /package/lib/client/{RestartingPage.jsx → RestartingPage.js} +0 -0
package/manager/run.mjs CHANGED
@@ -16,11 +16,9 @@
16
16
  */
17
17
 
18
18
  import { wait } from '@lowdefy/helpers';
19
- import { findAvailablePort } from '@lowdefy/node-utils';
20
19
  import opener from 'opener';
21
20
  import getContext from './getContext.mjs';
22
21
  import startServer from './processes/startServer.mjs';
23
- import formatNoticeBox from './utils/formatNoticeBox.mjs';
24
22
 
25
23
  /*
26
24
  The run script does the following:
@@ -80,16 +78,6 @@ The run script does the following:
80
78
 
81
79
  const context = await getContext();
82
80
 
83
- // Shut the Vite child down on direct signals (process managers, scripts/dev.mjs
84
- // signal forwarding) — terminal Ctrl+C signals the whole process group, but a
85
- // targeted SIGTERM would otherwise orphan the child.
86
- for (const signal of ['SIGINT', 'SIGTERM']) {
87
- process.on(signal, () => {
88
- context.shutdownServer();
89
- process.exit(0);
90
- });
91
- }
92
-
93
81
  try {
94
82
  await context.initialBuild();
95
83
 
@@ -97,37 +85,8 @@ try {
97
85
  // because chokidar sometimes doesn't fire this event, and it seems like there isn't an issue with not waiting.
98
86
  context.startWatchers();
99
87
 
100
- // The manager is the component that binds the port, so it re-checks here to
101
- // cover every launch path (CLI, monorepo dev script, direct run.mjs) and any
102
- // process that grabbed the port during the initial build.
103
- const availablePort = await findAvailablePort({ port: context.options.port });
104
- if (availablePort !== context.options.port) {
105
- context.logger.warn(
106
- `Port ${context.options.port} is in use, using port ${availablePort} instead.`
107
- );
108
- context.options.port = availablePort;
109
- }
110
-
111
88
  startServer(context);
112
89
  await wait(800);
113
- const docsUrl = `http://localhost:${context.options.port}/lowdefy-docs`;
114
- context.logger.info(
115
- { color: 'blue' },
116
- formatNoticeBox({
117
- title: 'Lowdefy coding agent tools',
118
- lines: [
119
- `Docs & MCP ${docsUrl}`,
120
- ' run `lowdefy agent-setup` to connect your agent',
121
- '',
122
- 'Annotate Press Cmd/Ctrl+/ in the browser to point, draw,',
123
- ' and comment on the running app, then paste the',
124
- ' copied feedback into your coding agent session.',
125
- '',
126
- 'Open code Cmd/Ctrl+click any element in the browser to open',
127
- ' its yaml in VS Code at the defining line.',
128
- ],
129
- })
130
- );
131
90
  if (process.env.LOWDEFY_SERVER_DEV_OPEN_BROWSER === 'true') {
132
91
  // TODO: Wait 1 sec for a ping and don't open if a ping is seen
133
92
  opener(`http://localhost:${context.options.port}`);
@@ -23,10 +23,6 @@ import YAML from 'yaml';
23
23
 
24
24
  const require = createRequire(import.meta.url);
25
25
 
26
- // The map is rebuilt on every config rebuild — warn once per plugin per
27
- // process instead of repeating the same skip message on each rebuild.
28
- const warnedMissingMessages = new Set();
29
-
30
26
  async function getPluginDefinitions({ directories }) {
31
27
  let lowdefyYaml = await readFile(path.join(directories.config, 'lowdefy.yaml'));
32
28
  if (!lowdefyYaml) {
@@ -49,10 +45,7 @@ async function createCustomPluginMessagesMap({ directories, logger }) {
49
45
  messagesModule = require(`${plugin.name}/messages`);
50
46
  } catch (e) {
51
47
  // Plugin does not ship a `./messages` export — silently skip.
52
- if (!warnedMissingMessages.has(plugin.name)) {
53
- warnedMissingMessages.add(plugin.name);
54
- logger?.debug?.(`Plugin "${plugin.name}" has no "./messages" export; skipping.`);
55
- }
48
+ logger?.debug?.(`Plugin "${plugin.name}" has no "./messages" export; skipping.`);
56
49
  continue;
57
50
  }
58
51
  const messages = messagesModule.default ?? messagesModule;
@@ -42,11 +42,11 @@ async function createCustomPluginTypesMap({ directories, logger }) {
42
42
  agents: {},
43
43
  auth: {
44
44
  adapters: {},
45
+ callbacks: {},
46
+ events: {},
45
47
  providers: {},
46
- strategies: {},
47
48
  },
48
49
  blockMetas: {},
49
- connectionMetas: {},
50
50
  blocks: {},
51
51
  connections: {},
52
52
  icons: {},
@@ -55,7 +55,6 @@ async function createCustomPluginTypesMap({ directories, logger }) {
55
55
  server: {},
56
56
  },
57
57
  requests: {},
58
- websockets: {},
59
58
  };
60
59
 
61
60
  const pluginDefinitions = await getPluginDefinitions({ directories });
@@ -17,17 +17,20 @@
17
17
  import path from 'path';
18
18
  import { createRequire } from 'module';
19
19
 
20
- function getViteBin() {
20
+ function getNextBin() {
21
21
  const require = createRequire(import.meta.url);
22
- const vitePackageJsonPath = require.resolve('vite/package.json');
23
- const vitePackageJson = require('vite/package.json');
22
+ const nextPackageJson = require('next/package.json');
23
+
24
+ const nextPath = require.resolve('next');
25
+ let nextMainFragment = nextPackageJson.main.substring(1);
26
+ let nextBinFragment = nextPackageJson.bin.next;
24
27
 
25
- let viteBinFragment = vitePackageJson.bin.vite;
26
28
  if (process.platform === 'win32') {
27
- viteBinFragment = viteBinFragment.replaceAll('/', '\\');
29
+ nextMainFragment = nextMainFragment.replaceAll('/', '\\');
30
+ nextBinFragment = nextBinFragment.replaceAll('/', '\\');
28
31
  }
29
32
 
30
- return path.join(path.dirname(vitePackageJsonPath), viteBinFragment);
33
+ return path.join(nextPath.replace(nextMainFragment, ''), nextBinFragment);
31
34
  }
32
35
 
33
- export default getViteBin;
36
+ export default getNextBin;
@@ -65,13 +65,7 @@ async function updatePageTailwindCss({ changedFiles, context }) {
65
65
  });
66
66
 
67
67
  if (contentWritten) {
68
- // Touch the candidates file so Vite's CSS pipeline re-runs Tailwind —
69
- // globals.css imports it, putting it in the dev module graph.
70
- const candidatesPath = path.join(context.directories.build, 'tailwind-candidates.css');
71
- fs.writeFileSync(
72
- candidatesPath,
73
- `/* Generated by Lowdefy build — rewritten on page changes to trigger CSS recompilation */\n/* ${Date.now()} */\n`
74
- );
68
+ await context.compileCss();
75
69
  }
76
70
  return contentWritten;
77
71
  }
@@ -51,6 +51,7 @@ function lowdefyBuildWatcher(context) {
51
51
 
52
52
  if (isSkeletonChange) {
53
53
  await context.lowdefyBuild();
54
+ await context.compileCss();
54
55
  } else {
55
56
  const invalidatePath = path.join(context.directories.build, 'invalidatePages');
56
57
  fs.writeFileSync(invalidatePath, String(Date.now()));
@@ -56,6 +56,7 @@ function moduleBuildWatcher(context) {
56
56
  : 'Module skeleton files changed, running shallow rebuild.'
57
57
  );
58
58
  await context.lowdefyBuild();
59
+ await context.compileCss();
59
60
  } else {
60
61
  const invalidatePath = path.join(context.directories.build, 'invalidatePages');
61
62
  fs.writeFileSync(invalidatePath, String(Date.now()));
@@ -22,18 +22,25 @@ import setupWatcher from '../utils/setupWatcher.mjs';
22
22
 
23
23
  const hashes = {};
24
24
 
25
- // Replaces nextBuildWatcher. Only files the server reads at startup are
26
- // tracked — a change requires a server restart for a fresh ESM module cache.
27
- // Client-side artifacts (blocks.js, operators/client.js, globals.css, ...)
28
- // are watched by Vite itself and hot-replaced without a restart.
29
25
  const trackedFiles = [
30
26
  'build/app.json',
31
27
  'build/auth.json',
32
28
  'build/config.json',
29
+ 'build/plugins/actions.js',
33
30
  'build/plugins/auth/adapters.js',
31
+ 'build/plugins/auth/callbacks.js',
32
+ 'build/plugins/auth/events.js',
34
33
  'build/plugins/auth/providers.js',
34
+ 'build/plugins/blocks.js',
35
35
  'build/plugins/connections.js',
36
+ 'build/plugins/icons.js',
37
+ 'build/plugins/operators/client.js',
38
+ 'build/plugins/operators/clientJsMap.js',
36
39
  'build/plugins/operators/server.js',
40
+ 'build/plugins/operators/serverJsMap.js',
41
+ 'build/plugins/styles.css',
42
+ 'build/globals.css',
43
+ 'public/styles.css',
37
44
  'package.json',
38
45
  ];
39
46
 
@@ -54,8 +61,8 @@ async function sha1(filePath) {
54
61
  .digest('base64');
55
62
  }
56
63
 
57
- async function serverArtifactWatcher(context) {
58
- // Initialize hashes so that the server does not restart the first time
64
+ async function nextBuildWatcher(context) {
65
+ // Initialize hashes so that app does not rebuild the first time
59
66
  // Lowdefy build is run.
60
67
  await Promise.all(
61
68
  trackedFiles.map(async (filePath) => {
@@ -65,21 +72,21 @@ async function serverArtifactWatcher(context) {
65
72
 
66
73
  const callback = async () => {
67
74
  let install = false;
68
- let restart = false;
75
+ let build = false;
69
76
  await Promise.all(
70
77
  trackedFiles.map(async (filePath) => {
71
78
  const hash = await sha1(filePath);
72
79
  if (hashes[filePath] === hash) {
73
80
  return;
74
81
  }
75
- restart = true;
82
+ build = true;
76
83
  if (filePath.endsWith('package.json')) {
77
84
  install = true;
78
85
  }
79
86
  hashes[filePath] = hash;
80
87
  })
81
88
  );
82
- if (!restart) {
89
+ if (!build) {
83
90
  context.logger.info({ spin: 'succeed' }, 'Reloaded app.');
84
91
  return;
85
92
  }
@@ -88,8 +95,8 @@ async function serverArtifactWatcher(context) {
88
95
  if (install) {
89
96
  context.logger.warn('Plugin dependencies have changed and will be reinstalled.');
90
97
  await context.installPlugins();
91
- // Rebuild Lowdefy artifacts (blocks.js, icons.js, connections.js, etc.)
92
- // so newly installed packages are included in the plugin imports.
98
+ // Rebuild Lowdefy artifacts (blocks.js, icons.js, styles.css, etc.)
99
+ // so newly installed packages are included in the Next.js bundle.
93
100
  await context.lowdefyBuild();
94
101
  // Re-hash all tracked files to avoid detecting our own build output
95
102
  // changes as new changes on the next watcher callback.
@@ -99,6 +106,8 @@ async function serverArtifactWatcher(context) {
99
106
  })
100
107
  );
101
108
  }
109
+ await context.nextBuild();
110
+ await context.compileCss();
102
111
  context.restartServer();
103
112
  };
104
113
 
@@ -106,13 +115,8 @@ async function serverArtifactWatcher(context) {
106
115
  callback,
107
116
  context,
108
117
  watchDotfiles: true,
109
- watchPaths: [
110
- path.join(context.directories.server, 'package.json'),
111
- ...trackedFiles
112
- .filter((filePath) => filePath.startsWith('build/'))
113
- .map((filePath) => path.join(context.directories.server, filePath)),
114
- ],
118
+ watchPaths: [path.join(context.directories.server, 'package.json')],
115
119
  });
116
120
  }
117
121
 
118
- export default serverArtifactWatcher;
122
+ export default nextBuildWatcher;
package/next.config.js ADDED
@@ -0,0 +1,25 @@
1
+ const lowdefyConfig = require('./build/config.json');
2
+ const blockPackages = require('./build/blockPackages.json');
3
+ const serverExternalPackages = require('./build/serverExternalPackages.json');
4
+
5
+ // Transpile @lowdefy/client plus all block plugin packages that may
6
+ // contain CSS imports (e.g., AG Grid themes, loaders, markdown).
7
+ // Built dynamically so custom user plugins are included automatically.
8
+ const transpilePackages = [
9
+ '@lowdefy/client',
10
+ '@ant-design/x',
11
+ '@ant-design/x-markdown',
12
+ ...blockPackages,
13
+ ];
14
+
15
+ const nextConfig = {
16
+ basePath: lowdefyConfig.basePath,
17
+ // reactStrictMode: true,
18
+ turbopack: {},
19
+ transpilePackages,
20
+ serverExternalPackages,
21
+ compress: false,
22
+ poweredByHeader: false,
23
+ };
24
+
25
+ module.exports = nextConfig;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lowdefy/server-dev",
3
- "version": "0.0.0-experimental-20260720072521",
3
+ "version": "0.0.0-experimental-20260720135014",
4
4
  "license": "Apache-2.0",
5
5
  "description": "",
6
6
  "homepage": "https://lowdefy.com",
@@ -28,97 +28,81 @@
28
28
  "files": [
29
29
  "lib/*",
30
30
  "manager/*",
31
+ "pages/*",
31
32
  "public_default/*",
33
+ "next.config.js",
32
34
  "package.original.json",
33
35
  ".eslintrc.yaml",
34
- ".npmrc",
35
- "src/*",
36
- "client/*",
37
- "vite.config.js",
38
- "postcss.config.cjs"
36
+ ".npmrc"
39
37
  ],
40
38
  "dependencies": {
39
+ "@lowdefy/actions-core": "0.0.0-experimental-20260720135014",
40
+ "@lowdefy/api": "0.0.0-experimental-20260720135014",
41
+ "@lowdefy/block-utils": "0.0.0-experimental-20260720135014",
42
+ "@lowdefy/blocks-aggrid": "0.0.0-experimental-20260720135014",
43
+ "@lowdefy/blocks-antd": "0.0.0-experimental-20260720135014",
44
+ "@lowdefy/blocks-antd-x": "0.0.0-experimental-20260720135014",
45
+ "@lowdefy/blocks-basic": "0.0.0-experimental-20260720135014",
46
+ "@lowdefy/blocks-echarts": "0.0.0-experimental-20260720135014",
47
+ "@lowdefy/blocks-loaders": "0.0.0-experimental-20260720135014",
48
+ "@lowdefy/blocks-markdown": "0.0.0-experimental-20260720135014",
49
+ "@lowdefy/blocks-tiptap": "0.0.0-experimental-20260720135014",
50
+ "@lowdefy/build": "0.0.0-experimental-20260720135014",
51
+ "@lowdefy/client": "0.0.0-experimental-20260720135014",
52
+ "@lowdefy/connection-axios-http": "0.0.0-experimental-20260720135014",
53
+ "@lowdefy/engine": "0.0.0-experimental-20260720135014",
54
+ "@lowdefy/errors": "0.0.0-experimental-20260720135014",
55
+ "@lowdefy/helpers": "0.0.0-experimental-20260720135014",
56
+ "@lowdefy/layout": "0.0.0-experimental-20260720135014",
57
+ "@lowdefy/logger": "0.0.0-experimental-20260720135014",
58
+ "@lowdefy/node-utils": "0.0.0-experimental-20260720135014",
59
+ "@lowdefy/operators-change-case": "0.0.0-experimental-20260720135014",
60
+ "@lowdefy/operators-dayjs": "0.0.0-experimental-20260720135014",
61
+ "@lowdefy/operators-diff": "0.0.0-experimental-20260720135014",
62
+ "@lowdefy/operators-js": "0.0.0-experimental-20260720135014",
63
+ "@lowdefy/operators-mql": "0.0.0-experimental-20260720135014",
64
+ "@lowdefy/operators-nunjucks": "0.0.0-experimental-20260720135014",
65
+ "@lowdefy/operators-uuid": "0.0.0-experimental-20260720135014",
66
+ "@lowdefy/operators-yaml": "0.0.0-experimental-20260720135014",
67
+ "@lowdefy/plugin-next-auth": "0.0.0-experimental-20260720135014",
41
68
  "@ant-design/cssinjs": "2.1.2",
42
69
  "@ant-design/x": "2.7.0",
43
- "@better-auth/passkey": "1.6.23",
44
- "@hono/mcp": "0.3.0",
45
- "@hono/node-server": "2.0.4",
46
- "@hono/vite-dev-server": "0.26.0",
47
- "@lowdefy/actions-core": "0.0.0-experimental-20260720072521",
48
- "@lowdefy/api": "0.0.0-experimental-20260720072521",
49
- "@lowdefy/block-utils": "0.0.0-experimental-20260720072521",
50
- "@lowdefy/blocks-aggrid": "0.0.0-experimental-20260720072521",
51
- "@lowdefy/blocks-antd": "0.0.0-experimental-20260720072521",
52
- "@lowdefy/blocks-antd-x": "0.0.0-experimental-20260720072521",
53
- "@lowdefy/blocks-basic": "0.0.0-experimental-20260720072521",
54
- "@lowdefy/blocks-captcha": "0.0.0-experimental-20260720072521",
55
- "@lowdefy/blocks-echarts": "0.0.0-experimental-20260720072521",
56
- "@lowdefy/blocks-loaders": "0.0.0-experimental-20260720072521",
57
- "@lowdefy/blocks-markdown": "0.0.0-experimental-20260720072521",
58
- "@lowdefy/blocks-tiptap": "0.0.0-experimental-20260720072521",
59
- "@lowdefy/build": "0.0.0-experimental-20260720072521",
60
- "@lowdefy/client": "0.0.0-experimental-20260720072521",
61
- "@lowdefy/connection-axios-http": "0.0.0-experimental-20260720072521",
62
- "@lowdefy/connection-mongodb": "0.0.0-experimental-20260720072521",
63
- "@lowdefy/docs-content": "0.0.0-experimental-20260720072521",
64
- "@lowdefy/engine": "0.0.0-experimental-20260720072521",
65
- "@lowdefy/errors": "0.0.0-experimental-20260720072521",
66
- "@lowdefy/helpers": "0.0.0-experimental-20260720072521",
67
- "@lowdefy/layout": "0.0.0-experimental-20260720072521",
68
- "@lowdefy/logger": "0.0.0-experimental-20260720072521",
69
- "@lowdefy/node-utils": "0.0.0-experimental-20260720072521",
70
- "@lowdefy/operators-change-case": "0.0.0-experimental-20260720072521",
71
- "@lowdefy/operators-dayjs": "0.0.0-experimental-20260720072521",
72
- "@lowdefy/operators-diff": "0.0.0-experimental-20260720072521",
73
- "@lowdefy/operators-js": "0.0.0-experimental-20260720072521",
74
- "@lowdefy/operators-mql": "0.0.0-experimental-20260720072521",
75
- "@lowdefy/operators-nunjucks": "0.0.0-experimental-20260720072521",
76
- "@lowdefy/operators-uuid": "0.0.0-experimental-20260720072521",
77
- "@lowdefy/operators-yaml": "0.0.0-experimental-20260720072521",
78
- "@lowdefy/plugin-better-auth": "0.0.0-experimental-20260720072521",
79
- "@lowdefy/websockets-core": "0.0.0-experimental-20260720072521",
80
- "@modelcontextprotocol/sdk": "1.29.0",
81
- "@tailwindcss/postcss": "4.3.1",
82
- "@vitejs/plugin-react": "6.0.2",
83
70
  "antd": "6.3.1",
84
- "better-auth": "1.6.23",
71
+ "dayjs": "1.11.19",
85
72
  "chokidar": "3.5.3",
86
- "dayjs": "1.11.20",
87
73
  "dotenv": "16.3.1",
88
- "hono": "4.12.25",
89
- "html-to-image": "1.11.13",
90
- "opener": "1.5.2",
91
- "pino": "10.3.1",
92
- "playwright-core": "1.59.1",
74
+ "@tailwindcss/postcss": "4.2.1",
75
+ "next": "16.1.6",
93
76
  "postcss": "8.5.6",
77
+ "tailwindcss": "4.2.1",
78
+ "next-auth": "4.24.10",
79
+ "opener": "1.5.2",
80
+ "pino": "8.16.2",
94
81
  "process": "0.11.10",
95
82
  "react": "18.2.0",
96
83
  "react-dom": "18.2.0",
97
84
  "react-icons": "5.6.0",
98
85
  "swr": "2.2.4",
99
- "tailwindcss": "4.3.1",
100
- "tinykeys": "3.0.0",
101
- "uuid": "14.0.0",
102
- "vite": "8.0.16",
103
- "ws": "8.18.0",
104
- "yaml": "2.9.0",
105
- "yargs": "18.0.0",
106
- "zod": "3.25.76"
86
+ "uuid": "13.0.0",
87
+ "yaml": "2.3.4",
88
+ "yargs": "17.7.2"
107
89
  },
108
90
  "devDependencies": {
91
+ "@next/eslint-plugin-next": "16.1.6",
109
92
  "jest": "28.1.3",
110
93
  "webpack": "5.94.0"
111
94
  },
112
95
  "engines": {
113
- "node": ">=22"
96
+ "node": ">=18"
114
97
  },
115
98
  "publishConfig": {
116
99
  "access": "public"
117
100
  },
118
- "type": "module",
119
101
  "scripts": {
120
102
  "build": "cp package.json package.original.json || copy package.json package.original.json",
121
103
  "start": "node manager/run.mjs",
104
+ "lint": "next lint",
105
+ "next": "next",
122
106
  "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"
123
107
  }
124
108
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lowdefy/server-dev",
3
- "version": "0.0.0-experimental-20260720072521",
3
+ "version": "0.0.0-experimental-20260720135014",
4
4
  "license": "Apache-2.0",
5
5
  "description": "",
6
6
  "homepage": "https://lowdefy.com",
@@ -28,98 +28,87 @@
28
28
  "files": [
29
29
  "lib/*",
30
30
  "manager/*",
31
+ "pages/*",
31
32
  "public_default/*",
33
+ "next.config.js",
32
34
  "package.original.json",
33
35
  ".eslintrc.yaml",
34
- ".npmrc",
35
- "src/*",
36
- "client/*",
37
- "vite.config.js",
38
- "postcss.config.cjs"
36
+ ".npmrc"
39
37
  ],
40
38
  "scripts": {
41
39
  "build": "cp package.json package.original.json || copy package.json package.original.json",
42
- "prepublishOnly": "pnpm build",
43
40
  "start": "node manager/run.mjs",
44
- "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"
41
+ "lint": "next lint",
42
+ "next": "next",
43
+ "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
44
+ "prepublishOnly": "pnpm build"
45
45
  },
46
46
  "dependencies": {
47
+ "@lowdefy/actions-core": "0.0.0-experimental-20260720135014",
48
+ "@lowdefy/api": "0.0.0-experimental-20260720135014",
49
+ "@lowdefy/block-utils": "0.0.0-experimental-20260720135014",
50
+ "@lowdefy/blocks-aggrid": "0.0.0-experimental-20260720135014",
51
+ "@lowdefy/blocks-antd": "0.0.0-experimental-20260720135014",
52
+ "@lowdefy/blocks-antd-x": "0.0.0-experimental-20260720135014",
53
+ "@lowdefy/blocks-basic": "0.0.0-experimental-20260720135014",
54
+ "@lowdefy/blocks-echarts": "0.0.0-experimental-20260720135014",
55
+ "@lowdefy/blocks-loaders": "0.0.0-experimental-20260720135014",
56
+ "@lowdefy/blocks-markdown": "0.0.0-experimental-20260720135014",
57
+ "@lowdefy/blocks-tiptap": "0.0.0-experimental-20260720135014",
58
+ "@lowdefy/build": "0.0.0-experimental-20260720135014",
59
+ "@lowdefy/client": "0.0.0-experimental-20260720135014",
60
+ "@lowdefy/connection-axios-http": "0.0.0-experimental-20260720135014",
61
+ "@lowdefy/engine": "0.0.0-experimental-20260720135014",
62
+ "@lowdefy/errors": "0.0.0-experimental-20260720135014",
63
+ "@lowdefy/helpers": "0.0.0-experimental-20260720135014",
64
+ "@lowdefy/layout": "0.0.0-experimental-20260720135014",
65
+ "@lowdefy/logger": "0.0.0-experimental-20260720135014",
66
+ "@lowdefy/node-utils": "0.0.0-experimental-20260720135014",
67
+ "@lowdefy/operators-change-case": "0.0.0-experimental-20260720135014",
68
+ "@lowdefy/operators-dayjs": "0.0.0-experimental-20260720135014",
69
+ "@lowdefy/operators-diff": "0.0.0-experimental-20260720135014",
70
+ "@lowdefy/operators-js": "0.0.0-experimental-20260720135014",
71
+ "@lowdefy/operators-mql": "0.0.0-experimental-20260720135014",
72
+ "@lowdefy/operators-nunjucks": "0.0.0-experimental-20260720135014",
73
+ "@lowdefy/operators-uuid": "0.0.0-experimental-20260720135014",
74
+ "@lowdefy/operators-yaml": "0.0.0-experimental-20260720135014",
75
+ "@lowdefy/plugin-next-auth": "0.0.0-experimental-20260720135014",
47
76
  "@ant-design/cssinjs": "2.1.2",
48
77
  "@ant-design/x": "2.7.0",
49
- "@better-auth/passkey": "1.6.23",
50
- "@hono/mcp": "0.3.0",
51
- "@hono/node-server": "2.0.4",
52
- "@hono/vite-dev-server": "0.26.0",
53
- "@lowdefy/actions-core": "0.0.0-experimental-20260720072521",
54
- "@lowdefy/api": "0.0.0-experimental-20260720072521",
55
- "@lowdefy/block-utils": "0.0.0-experimental-20260720072521",
56
- "@lowdefy/blocks-aggrid": "0.0.0-experimental-20260720072521",
57
- "@lowdefy/blocks-antd": "0.0.0-experimental-20260720072521",
58
- "@lowdefy/blocks-antd-x": "0.0.0-experimental-20260720072521",
59
- "@lowdefy/blocks-basic": "0.0.0-experimental-20260720072521",
60
- "@lowdefy/blocks-captcha": "0.0.0-experimental-20260720072521",
61
- "@lowdefy/blocks-echarts": "0.0.0-experimental-20260720072521",
62
- "@lowdefy/blocks-loaders": "0.0.0-experimental-20260720072521",
63
- "@lowdefy/blocks-markdown": "0.0.0-experimental-20260720072521",
64
- "@lowdefy/blocks-tiptap": "0.0.0-experimental-20260720072521",
65
- "@lowdefy/build": "0.0.0-experimental-20260720072521",
66
- "@lowdefy/client": "0.0.0-experimental-20260720072521",
67
- "@lowdefy/connection-axios-http": "0.0.0-experimental-20260720072521",
68
- "@lowdefy/connection-mongodb": "0.0.0-experimental-20260720072521",
69
- "@lowdefy/docs-content": "0.0.0-experimental-20260720072521",
70
- "@lowdefy/engine": "0.0.0-experimental-20260720072521",
71
- "@lowdefy/errors": "0.0.0-experimental-20260720072521",
72
- "@lowdefy/helpers": "0.0.0-experimental-20260720072521",
73
- "@lowdefy/layout": "0.0.0-experimental-20260720072521",
74
- "@lowdefy/logger": "0.0.0-experimental-20260720072521",
75
- "@lowdefy/node-utils": "0.0.0-experimental-20260720072521",
76
- "@lowdefy/operators-change-case": "0.0.0-experimental-20260720072521",
77
- "@lowdefy/operators-dayjs": "0.0.0-experimental-20260720072521",
78
- "@lowdefy/operators-diff": "0.0.0-experimental-20260720072521",
79
- "@lowdefy/operators-js": "0.0.0-experimental-20260720072521",
80
- "@lowdefy/operators-mql": "0.0.0-experimental-20260720072521",
81
- "@lowdefy/operators-nunjucks": "0.0.0-experimental-20260720072521",
82
- "@lowdefy/operators-uuid": "0.0.0-experimental-20260720072521",
83
- "@lowdefy/operators-yaml": "0.0.0-experimental-20260720072521",
84
- "@lowdefy/plugin-better-auth": "0.0.0-experimental-20260720072521",
85
- "@lowdefy/websockets-core": "0.0.0-experimental-20260720072521",
86
- "@modelcontextprotocol/sdk": "1.29.0",
87
- "@tailwindcss/postcss": "4.3.1",
88
- "@vitejs/plugin-react": "6.0.2",
89
78
  "antd": "6.3.1",
90
- "better-auth": "1.6.23",
79
+ "dayjs": "1.11.19",
91
80
  "chokidar": "3.5.3",
92
- "dayjs": "1.11.20",
93
81
  "dotenv": "16.3.1",
94
- "hono": "4.12.25",
95
- "html-to-image": "1.11.13",
96
- "opener": "1.5.2",
97
- "pino": "10.3.1",
98
- "playwright-core": "1.59.1",
82
+ "@tailwindcss/postcss": "4.2.1",
83
+ "next": "16.1.6",
99
84
  "postcss": "8.5.6",
85
+ "tailwindcss": "4.2.1",
86
+ "next-auth": "4.24.10",
87
+ "opener": "1.5.2",
88
+ "pino": "8.16.2",
100
89
  "process": "0.11.10",
101
90
  "react": "18.2.0",
102
91
  "react-dom": "18.2.0",
103
92
  "react-icons": "5.6.0",
104
93
  "swr": "2.2.4",
105
- "tailwindcss": "4.3.1",
106
- "tinykeys": "3.0.0",
107
- "uuid": "14.0.0",
108
- "vite": "8.0.16",
109
- "ws": "8.18.0",
110
- "yaml": "2.9.0",
111
- "yargs": "18.0.0",
112
- "zod": "3.25.76"
94
+ "uuid": "13.0.0",
95
+ "yaml": "2.3.4",
96
+ "yargs": "17.7.2"
113
97
  },
114
98
  "devDependencies": {
99
+ "@next/eslint-plugin-next": "16.1.6",
115
100
  "jest": "28.1.3",
116
101
  "webpack": "5.94.0"
117
102
  },
118
103
  "engines": {
119
- "node": ">=22"
104
+ "node": ">=18"
105
+ },
106
+ "pnpm": {
107
+ "onlyBuiltDependencies": [
108
+ "better-sqlite3"
109
+ ]
120
110
  },
121
111
  "publishConfig": {
122
112
  "access": "public"
123
- },
124
- "type": "module"
113
+ }
125
114
  }
@@ -14,8 +14,6 @@
14
14
  limitations under the License.
15
15
  */
16
16
 
17
- function devToolsHandler(c) {
18
- return c.json({ directories: { config: process.env.LOWDEFY_DIRECTORY_CONFIG } });
19
- }
17
+ import App from '../lib/client/App.js';
20
18
 
21
- export default devToolsHandler;
19
+ export default App;
@@ -14,10 +14,6 @@
14
14
  limitations under the License.
15
15
  */
16
16
 
17
- import getAppMap from '../../../lib/docs/getAppMap.js';
17
+ import App from '../lib/client/App.js';
18
18
 
19
- function docsAppMapHandler(c) {
20
- return c.json(getAppMap());
21
- }
22
-
23
- export default docsAppMapHandler;
19
+ export default App;