synthos 0.6.0 → 0.7.1

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 (153) hide show
  1. package/README.md +33 -1
  2. package/default-pages/app_builder.html +40 -0
  3. package/default-pages/app_builder.json +1 -0
  4. package/default-pages/json_tools.html +89 -159
  5. package/default-pages/json_tools.json +1 -0
  6. package/default-pages/my_notes.html +33 -0
  7. package/default-pages/my_notes.json +12 -0
  8. package/default-pages/neon_asteroids.html +77 -0
  9. package/default-pages/neon_asteroids.json +12 -0
  10. package/default-pages/sidebar_builder.html +49 -0
  11. package/default-pages/sidebar_builder.json +1 -0
  12. package/default-pages/solar_explorer.html +1956 -0
  13. package/default-pages/solar_explorer.json +12 -0
  14. package/default-pages/solar_tutorial.html +476 -0
  15. package/default-pages/solar_tutorial.json +1 -0
  16. package/default-pages/two-panel_builder.html +66 -0
  17. package/default-pages/two-panel_builder.json +1 -0
  18. package/default-themes/nebula-dawn.css +682 -0
  19. package/default-themes/nebula-dawn.json +19 -0
  20. package/default-themes/nebula-dusk.css +674 -0
  21. package/default-themes/nebula-dusk.json +19 -0
  22. package/dist/connectors/index.d.ts +3 -0
  23. package/dist/connectors/index.d.ts.map +1 -0
  24. package/dist/connectors/index.js +6 -0
  25. package/dist/connectors/index.js.map +1 -0
  26. package/dist/connectors/registry.d.ts +3 -0
  27. package/dist/connectors/registry.d.ts.map +1 -0
  28. package/dist/connectors/registry.js +100 -0
  29. package/dist/connectors/registry.js.map +1 -0
  30. package/dist/connectors/types.d.ts +61 -0
  31. package/dist/connectors/types.d.ts.map +1 -0
  32. package/dist/connectors/types.js +3 -0
  33. package/dist/connectors/types.js.map +1 -0
  34. package/dist/files.d.ts +2 -0
  35. package/dist/files.d.ts.map +1 -1
  36. package/dist/files.js +12 -1
  37. package/dist/files.js.map +1 -1
  38. package/dist/init.d.ts +8 -1
  39. package/dist/init.d.ts.map +1 -1
  40. package/dist/init.js +155 -3
  41. package/dist/init.js.map +1 -1
  42. package/dist/migrations.d.ts +11 -0
  43. package/dist/migrations.d.ts.map +1 -0
  44. package/dist/migrations.js +281 -0
  45. package/dist/migrations.js.map +1 -0
  46. package/dist/models/index.d.ts +3 -0
  47. package/dist/models/index.d.ts.map +1 -0
  48. package/dist/models/index.js +10 -0
  49. package/dist/models/index.js.map +1 -0
  50. package/dist/models/providers.d.ts +7 -0
  51. package/dist/models/providers.d.ts.map +1 -0
  52. package/dist/models/providers.js +33 -0
  53. package/dist/models/providers.js.map +1 -0
  54. package/dist/models/types.d.ts +21 -0
  55. package/dist/models/types.d.ts.map +1 -0
  56. package/dist/models/types.js +3 -0
  57. package/dist/models/types.js.map +1 -0
  58. package/dist/pages.d.ts +21 -2
  59. package/dist/pages.d.ts.map +1 -1
  60. package/dist/pages.js +202 -23
  61. package/dist/pages.js.map +1 -1
  62. package/dist/scripts.js +2 -2
  63. package/dist/scripts.js.map +1 -1
  64. package/dist/service/createCompletePrompt.d.ts +3 -2
  65. package/dist/service/createCompletePrompt.d.ts.map +1 -1
  66. package/dist/service/createCompletePrompt.js +11 -16
  67. package/dist/service/createCompletePrompt.js.map +1 -1
  68. package/dist/service/debugLog.d.ts +11 -0
  69. package/dist/service/debugLog.d.ts.map +1 -0
  70. package/dist/service/debugLog.js +26 -0
  71. package/dist/service/debugLog.js.map +1 -0
  72. package/dist/service/modelInstructions.d.ts +7 -0
  73. package/dist/service/modelInstructions.d.ts.map +1 -0
  74. package/dist/service/modelInstructions.js +16 -0
  75. package/dist/service/modelInstructions.js.map +1 -0
  76. package/dist/service/requiresSettings.d.ts +2 -2
  77. package/dist/service/requiresSettings.d.ts.map +1 -1
  78. package/dist/service/requiresSettings.js.map +1 -1
  79. package/dist/service/server.d.ts.map +1 -1
  80. package/dist/service/server.js +15 -0
  81. package/dist/service/server.js.map +1 -1
  82. package/dist/service/transformPage.d.ts +81 -2
  83. package/dist/service/transformPage.d.ts.map +1 -1
  84. package/dist/service/transformPage.js +672 -82
  85. package/dist/service/transformPage.js.map +1 -1
  86. package/dist/service/useApiRoutes.d.ts.map +1 -1
  87. package/dist/service/useApiRoutes.js +579 -13
  88. package/dist/service/useApiRoutes.js.map +1 -1
  89. package/dist/service/useConnectorRoutes.d.ts +4 -0
  90. package/dist/service/useConnectorRoutes.d.ts.map +1 -0
  91. package/dist/service/useConnectorRoutes.js +389 -0
  92. package/dist/service/useConnectorRoutes.js.map +1 -0
  93. package/dist/service/useDataRoutes.d.ts.map +1 -1
  94. package/dist/service/useDataRoutes.js +83 -70
  95. package/dist/service/useDataRoutes.js.map +1 -1
  96. package/dist/service/usePageRoutes.d.ts.map +1 -1
  97. package/dist/service/usePageRoutes.js +243 -38
  98. package/dist/service/usePageRoutes.js.map +1 -1
  99. package/dist/settings.d.ts +33 -4
  100. package/dist/settings.d.ts.map +1 -1
  101. package/dist/settings.js +108 -15
  102. package/dist/settings.js.map +1 -1
  103. package/dist/synthos-cli.d.ts.map +1 -1
  104. package/dist/synthos-cli.js +11 -1
  105. package/dist/synthos-cli.js.map +1 -1
  106. package/dist/themes.d.ts +9 -0
  107. package/dist/themes.d.ts.map +1 -0
  108. package/dist/themes.js +64 -0
  109. package/dist/themes.js.map +1 -0
  110. package/package.json +6 -3
  111. package/required-pages/builder.html +74 -0
  112. package/required-pages/builder.json +1 -0
  113. package/required-pages/pages.html +169 -126
  114. package/required-pages/pages.json +1 -0
  115. package/required-pages/settings.html +812 -156
  116. package/required-pages/settings.json +1 -0
  117. package/required-pages/synthos_apis.html +272 -0
  118. package/required-pages/synthos_apis.json +1 -0
  119. package/required-pages/synthos_scripts.html +87 -0
  120. package/required-pages/synthos_scripts.json +1 -0
  121. package/src/connectors/index.ts +12 -0
  122. package/src/connectors/registry.ts +98 -0
  123. package/src/connectors/types.ts +68 -0
  124. package/src/files.ts +11 -0
  125. package/src/init.ts +151 -5
  126. package/src/migrations.ts +266 -0
  127. package/src/models/index.ts +2 -0
  128. package/src/models/providers.ts +33 -0
  129. package/src/models/types.ts +23 -0
  130. package/src/pages.ts +234 -26
  131. package/src/scripts.ts +2 -2
  132. package/src/service/createCompletePrompt.ts +14 -18
  133. package/src/service/debugLog.ts +17 -0
  134. package/src/service/modelInstructions.ts +14 -0
  135. package/src/service/requiresSettings.ts +3 -3
  136. package/src/service/server.ts +19 -2
  137. package/src/service/transformPage.ts +709 -88
  138. package/src/service/useApiRoutes.ts +632 -16
  139. package/src/service/useConnectorRoutes.ts +427 -0
  140. package/src/service/useDataRoutes.ts +87 -71
  141. package/src/service/usePageRoutes.ts +237 -44
  142. package/src/settings.ts +143 -20
  143. package/src/synthos-cli.ts +11 -1
  144. package/src/themes.ts +71 -0
  145. package/default-pages/[application].html +0 -95
  146. package/default-pages/[markdown].html +0 -271
  147. package/default-pages/[sidebar].html +0 -114
  148. package/default-pages/[split-application].html +0 -118
  149. package/default-pages/solar_system.html +0 -432
  150. package/default-pages/space_invaders.html +0 -617
  151. package/required-pages/apis.html +0 -362
  152. package/required-pages/home.html +0 -126
  153. package/required-pages/scripts.html +0 -350
@@ -9,88 +9,101 @@ const path_1 = __importDefault(require("path"));
9
9
  const uuid_1 = require("uuid");
10
10
  const scripts_1 = require("../scripts");
11
11
  function useDataRoutes(config, app) {
12
- // Retrieve all rows from a table
13
- app.get('/api/data/:table', async (req, res) => {
14
- // Get list of row ids
15
- const { table } = req.params;
16
- const folder = await tableFolder(config, table);
17
- const ids = (await (0, files_1.listFiles)(folder)).filter(f => f.endsWith('.json')).map(f => f.replace('.json', ''));
18
- // Enumerate all rows
19
- const rows = [];
20
- for (const id of ids) {
21
- const file = recordFile(folder, id);
22
- try {
23
- const row = JSON.parse(await (0, files_1.loadFile)(file));
24
- row.id = id;
25
- rows.push(row);
26
- }
27
- catch (err) {
28
- console.error(err);
29
- }
30
- }
31
- // Return rows
32
- res.json(rows);
33
- });
34
- // Retrieve a single row from a table
35
- app.get('/api/data/:table/:id', async (req, res) => {
36
- const { table, id } = req.params;
37
- const folder = await tableFolder(config, table);
12
+ app.get('/api/data/:page/:table', (req, res) => handleList(config, req.params.page, req.params.table, req.query, res));
13
+ app.get('/api/data/:page/:table/:id', (req, res) => handleGet(config, req.params.page, req.params.table, req.params.id, res));
14
+ app.post('/api/data/:page/:table', (req, res) => handleUpsert(config, req.params.page, req.params.table, req.body, res));
15
+ app.delete('/api/data/:page/:table/:id', (req, res) => handleDelete(config, req.params.page, req.params.table, req.params.id, res));
16
+ }
17
+ exports.useDataRoutes = useDataRoutes;
18
+ // ---------------------------------------------------------------------------
19
+ // Route handlers
20
+ // ---------------------------------------------------------------------------
21
+ async function handleList(config, page, table, query, res) {
22
+ const folder = tableFolder(config, page, table);
23
+ if (!(await (0, files_1.checkIfExists)(folder))) {
24
+ res.status(404).json({ error: 'table_not_found', page, table });
25
+ return;
26
+ }
27
+ const ids = (await (0, files_1.listFiles)(folder)).filter(f => f.endsWith('.json')).map(f => f.replace('.json', ''));
28
+ const rows = [];
29
+ for (const id of ids) {
38
30
  const file = recordFile(folder, id);
39
31
  try {
40
32
  const row = JSON.parse(await (0, files_1.loadFile)(file));
41
33
  row.id = id;
42
- res.json(row);
34
+ rows.push(row);
43
35
  }
44
36
  catch (err) {
45
- res.json({});
37
+ console.error(err);
46
38
  }
47
- });
48
- // Upsert a single row into a table
49
- app.post('/api/data/:table', async (req, res) => {
50
- const { table } = req.params;
51
- const id = req.body.id ?? (0, uuid_1.v4)();
52
- const folder = await tableFolder(config, table);
53
- const file = recordFile(folder, id);
54
- try {
55
- const row = { ...req.body, id };
56
- await (0, files_1.ensureFolderExists)(folder);
57
- await (0, files_1.saveFile)(file, JSON.stringify(row, null, 4));
39
+ }
40
+ // Paginate when limit is provided
41
+ const limitParam = typeof query.limit === 'string' ? parseInt(query.limit, 10) : NaN;
42
+ if (!isNaN(limitParam) && limitParam > 0) {
43
+ const offset = Math.max(0, typeof query.offset === 'string' ? parseInt(query.offset, 10) || 0 : 0);
44
+ const items = rows.slice(offset, offset + limitParam);
45
+ res.json({ items, total: rows.length, offset, limit: limitParam, hasMore: offset + limitParam < rows.length });
46
+ }
47
+ else {
48
+ res.json(rows);
49
+ }
50
+ }
51
+ async function handleGet(config, page, table, id, res) {
52
+ const folder = tableFolder(config, page, table);
53
+ if (!(await (0, files_1.checkIfExists)(folder))) {
54
+ res.status(404).json({ error: 'table_not_found', page, table });
55
+ return;
56
+ }
57
+ const file = recordFile(folder, id);
58
+ try {
59
+ const row = JSON.parse(await (0, files_1.loadFile)(file));
60
+ row.id = id;
61
+ res.json(row);
62
+ }
63
+ catch (err) {
64
+ res.json({});
65
+ }
66
+ }
67
+ async function handleUpsert(config, page, table, body, res) {
68
+ const id = body.id ?? (0, uuid_1.v4)();
69
+ const folder = tableFolder(config, page, table);
70
+ const file = recordFile(folder, id);
71
+ try {
72
+ const row = { ...body, id };
73
+ await (0, files_1.ensureFolderExists)(folder);
74
+ await (0, files_1.saveFile)(file, JSON.stringify(row, null, 4));
75
+ if (table === 'scripts') {
76
+ (0, scripts_1.clearCachedScripts)();
77
+ }
78
+ res.json(row);
79
+ }
80
+ catch (err) {
81
+ console.error(err);
82
+ res.status(500).send(err.message);
83
+ }
84
+ }
85
+ async function handleDelete(config, page, table, id, res) {
86
+ const folder = tableFolder(config, page, table);
87
+ const file = recordFile(folder, id);
88
+ try {
89
+ if (await (0, files_1.checkIfExists)(file)) {
90
+ await (0, files_1.deleteFile)(file);
58
91
  if (table === 'scripts') {
59
92
  (0, scripts_1.clearCachedScripts)();
60
93
  }
61
- res.json(row);
62
- }
63
- catch (err) {
64
- console.error(err);
65
- res.status(500).send(err.message);
66
- }
67
- });
68
- // Delete a single row from a table
69
- app.delete('/api/data/:table/:id', async (req, res) => {
70
- const { table, id } = req.params;
71
- const folder = await tableFolder(config, table);
72
- const file = recordFile(folder, id);
73
- try {
74
- if (await (0, files_1.checkIfExists)(file)) {
75
- await (0, files_1.deleteFile)(file);
76
- // Clear cached scripts
77
- if (table === 'scripts') {
78
- (0, scripts_1.clearCachedScripts)();
79
- }
80
- }
81
- res.json({ success: true });
82
- }
83
- catch (err) {
84
- console.error(err);
85
- res.status(500).send(err.message);
86
94
  }
87
- });
95
+ res.json({ success: true });
96
+ }
97
+ catch (err) {
98
+ console.error(err);
99
+ res.status(500).send(err.message);
100
+ }
88
101
  }
89
- exports.useDataRoutes = useDataRoutes;
90
- async function tableFolder(config, table) {
91
- const folder = path_1.default.join(config.pagesFolder, table);
92
- await (0, files_1.ensureFolderExists)(folder);
93
- return folder;
102
+ // ---------------------------------------------------------------------------
103
+ // Helpers
104
+ // ---------------------------------------------------------------------------
105
+ function tableFolder(config, page, table) {
106
+ return path_1.default.join(config.pagesFolder, 'pages', page, table);
94
107
  }
95
108
  function recordFile(folder, id) {
96
109
  return path_1.default.join(folder, `${id}.json`);
@@ -1 +1 @@
1
- {"version":3,"file":"useDataRoutes.js","sourceRoot":"","sources":["../../src/service/useDataRoutes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useDataRoutes.js","sourceRoot":"","sources":["../../src/service/useDataRoutes.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"usePageRoutes.d.ts","sourceRoot":"","sources":["../../src/service/usePageRoutes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAOxC,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CA4H3E;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAC,SAAS,CAAC,CASzH"}
1
+ {"version":3,"file":"usePageRoutes.d.ts","sourceRoot":"","sources":["../../src/service/usePageRoutes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGtC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAuFxC,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CA4O3E;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAC,SAAS,CAAC,CASzH"}
@@ -1,12 +1,110 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  Object.defineProperty(exports, "__esModule", { value: true });
3
26
  exports.loadPageWithFallback = exports.usePageRoutes = void 0;
4
27
  const pages_1 = require("../pages");
5
28
  const settings_1 = require("../settings");
6
29
  const transformPage_1 = require("./transformPage");
30
+ const modelInstructions_1 = require("./modelInstructions");
7
31
  const createCompletePrompt_1 = require("./createCompletePrompt");
8
- const HOME_PAGE_ROUTE = '/home';
32
+ const debugLog_1 = require("./debugLog");
33
+ const themes_1 = require("../themes");
34
+ const cheerio = __importStar(require("cheerio"));
35
+ /**
36
+ * Required CDN imports that must be present on every v2 page.
37
+ * Each entry maps a detection selector to the script tag src to inject.
38
+ */
39
+ const REQUIRED_IMPORTS = [
40
+ { selector: 'script[src*="marked"]', src: 'https://cdnjs.cloudflare.com/ajax/libs/marked/14.1.1/marked.min.js' },
41
+ ];
42
+ /**
43
+ * Uses cheerio to ensure every required import is present in the page's <head>.
44
+ * Skips imports that already exist (detected via selector).
45
+ */
46
+ function ensureRequiredImports(html, pageVersion) {
47
+ if (pageVersion < 2)
48
+ return html;
49
+ const $ = cheerio.load(html);
50
+ for (const imp of REQUIRED_IMPORTS) {
51
+ if ($(imp.selector).length === 0) {
52
+ $('head').append(`<script src="${imp.src}"></script>\n`);
53
+ }
54
+ }
55
+ return $.html();
56
+ }
57
+ const HOME_PAGE_ROUTE = '/builder';
9
58
  const PAGE_NOT_FOUND = 'Page not found';
59
+ function injectPageInfoScript(html, pageName) {
60
+ const tag = `<script id="page-info" src="/api/page-info.js?page=${encodeURIComponent(pageName)}"></script>`;
61
+ // Replace any existing page-info script (may have a stale page name from the template)
62
+ const existing = html.match(/<script\s+id="page-info"[^>]*><\/script>/);
63
+ if (existing) {
64
+ return html.replace(existing[0], tag);
65
+ }
66
+ const idx = html.indexOf('</head>');
67
+ if (idx !== -1) {
68
+ return html.slice(0, idx) + tag + '\n' + html.slice(idx);
69
+ }
70
+ return tag + '\n' + html;
71
+ }
72
+ function injectPageHelpers(html, pageVersion) {
73
+ if (pageVersion < 2)
74
+ return html;
75
+ const tag = `<script id="page-helpers" src="/api/page-helpers.js?v=${pageVersion}"></script>`;
76
+ // Replace any existing page-helpers script (may be at wrong position from prior LLM output)
77
+ const existing = html.match(/<script\s+id="page-helpers"[^>]*><\/script>/);
78
+ if (existing) {
79
+ return html.replace(existing[0], tag);
80
+ }
81
+ // Inject into <head> after page-info so helpers are available before inline body scripts
82
+ const pageInfo = html.indexOf('id="page-info"');
83
+ if (pageInfo !== -1) {
84
+ const closeTag = html.indexOf('</script>', pageInfo);
85
+ if (closeTag !== -1) {
86
+ const insertAt = closeTag + '</script>'.length;
87
+ return html.slice(0, insertAt) + '\n' + tag + html.slice(insertAt);
88
+ }
89
+ }
90
+ const idx = html.indexOf('</head>');
91
+ if (idx !== -1) {
92
+ return html.slice(0, idx) + tag + '\n' + html.slice(idx);
93
+ }
94
+ return tag + '\n' + html;
95
+ }
96
+ function injectPageScript(html, pageVersion) {
97
+ if (pageVersion < 2)
98
+ return html;
99
+ if (html.includes('id="page-script"'))
100
+ return html;
101
+ const tag = `<script id="page-script" src="/api/page-script.js?v=${pageVersion}"></script>`;
102
+ const idx = html.indexOf('</body>');
103
+ if (idx !== -1) {
104
+ return html.slice(0, idx) + tag + '\n' + html.slice(idx);
105
+ }
106
+ return html + '\n' + tag;
107
+ }
10
108
  function usePageRoutes(config, app) {
11
109
  // Redirect / to /home page
12
110
  app.get('/', (req, res) => res.redirect(HOME_PAGE_ROUTE));
@@ -16,7 +114,7 @@ function usePageRoutes(config, app) {
16
114
  const { page } = req.params;
17
115
  const isConfigured = await (0, settings_1.hasConfiguredSettings)(config.pagesFolder);
18
116
  if (!isConfigured && page !== 'settings') {
19
- res.redirect('/settings');
117
+ res.redirect('/settings?firstRun=1');
20
118
  return;
21
119
  }
22
120
  // Ensure page exists
@@ -25,7 +123,19 @@ function usePageRoutes(config, app) {
25
123
  res.status(404).send(PAGE_NOT_FOUND);
26
124
  return;
27
125
  }
28
- res.send(pageState);
126
+ // Load page metadata for version-based script injection
127
+ const metadata = await (0, pages_1.loadPageMetadata)(config.pagesFolder, page, config.requiredPagesFolder);
128
+ const pageVersion = metadata?.pageVersion ?? 0;
129
+ // Block outdated pages (redirect to /pages so user sees upgrade UI)
130
+ if (pageVersion < pages_1.PAGE_VERSION && !pages_1.REQUIRED_PAGES.includes(page)) {
131
+ res.redirect('/pages');
132
+ return;
133
+ }
134
+ let html = ensureRequiredImports(pageState, pageVersion);
135
+ html = injectPageInfoScript(html, page);
136
+ html = injectPageHelpers(html, pageVersion);
137
+ html = injectPageScript(html, pageVersion);
138
+ res.send(html);
29
139
  });
30
140
  // Page reset
31
141
  app.get('/:page/reset', async (req, res) => {
@@ -33,7 +143,7 @@ function usePageRoutes(config, app) {
33
143
  const { page } = req.params;
34
144
  const isConfigured = await (0, settings_1.hasConfiguredSettings)(config.pagesFolder);
35
145
  if (!isConfigured) {
36
- res.redirect('/settings');
146
+ res.redirect('/settings?firstRun=1');
37
147
  return;
38
148
  }
39
149
  // Ensure page exists
@@ -45,29 +155,75 @@ function usePageRoutes(config, app) {
45
155
  res.redirect(`/${page}`);
46
156
  });
47
157
  // Page save
48
- app.get('/:page/save', async (req, res) => {
49
- // Redirect if settings not configured
50
- const { page } = req.params;
51
- const isConfigured = await (0, settings_1.hasConfiguredSettings)(config.pagesFolder);
52
- if (!isConfigured) {
53
- res.redirect('/settings');
54
- return;
55
- }
56
- // Normalize and validate save-as parameter
57
- const saveAs = (0, pages_1.normalizePageName)(req.query['name']);
58
- if (!saveAs) {
59
- res.status(400).send('Invalid or missing name parameter');
60
- return;
158
+ app.post('/:page/save', async (req, res) => {
159
+ try {
160
+ // Redirect if settings not configured
161
+ const { page } = req.params;
162
+ const isConfigured = await (0, settings_1.hasConfiguredSettings)(config.pagesFolder);
163
+ if (!isConfigured) {
164
+ res.status(400).json({ error: 'Settings not configured' });
165
+ return;
166
+ }
167
+ // Extract fields from JSON body
168
+ const { title, categories, greeting } = req.body;
169
+ if (!title || typeof title !== 'string') {
170
+ res.status(400).json({ error: 'title is required' });
171
+ return;
172
+ }
173
+ if (!categories || !Array.isArray(categories) || categories.length === 0) {
174
+ res.status(400).json({ error: 'categories is required (array of strings)' });
175
+ return;
176
+ }
177
+ // Normalize page name from title
178
+ const saveAs = (0, pages_1.normalizePageName)(title);
179
+ if (!saveAs) {
180
+ res.status(400).json({ error: 'Invalid title — cannot derive a page name' });
181
+ return;
182
+ }
183
+ // Reject reserved names
184
+ if (saveAs === 'builder') {
185
+ res.status(400).json({ error: '"Builder" is a reserved page name' });
186
+ return;
187
+ }
188
+ // Load page state
189
+ let pageState = await loadPageWithFallback(page, config, false);
190
+ if (!pageState) {
191
+ res.status(404).json({ error: PAGE_NOT_FOUND });
192
+ return;
193
+ }
194
+ // If greeting is provided, process with cheerio
195
+ if (greeting && typeof greeting === 'string' && greeting.trim().length > 0) {
196
+ const $ = cheerio.load(pageState);
197
+ const messages = $('#chatMessages .chat-message');
198
+ // Keep only the first message, remove the rest
199
+ messages.slice(1).remove();
200
+ // Update the greeting text in the first message
201
+ const firstP = messages.first().find('p');
202
+ const strong = firstP.find('strong');
203
+ if (strong.length) {
204
+ firstP.html('<strong>Synthos:</strong> ' + greeting.trim());
205
+ }
206
+ pageState = $.html();
207
+ }
208
+ // Save as new page
209
+ await (0, pages_1.savePageState)(config.pagesFolder, saveAs, pageState, title, categories);
210
+ // Also update metadata with categories (in case page.json already existed)
211
+ await (0, pages_1.savePageMetadata)(config.pagesFolder, saveAs, {
212
+ title,
213
+ categories,
214
+ pinned: false,
215
+ showInAll: true,
216
+ createdDate: new Date().toISOString(),
217
+ lastModified: new Date().toISOString(),
218
+ pageVersion: pages_1.PAGE_VERSION,
219
+ mode: 'unlocked',
220
+ });
221
+ res.json({ redirect: `/${saveAs}` });
61
222
  }
62
- // Load page state
63
- const pageState = await loadPageWithFallback(page, config, false);
64
- if (!pageState) {
65
- res.status(404).send(PAGE_NOT_FOUND);
66
- return;
223
+ catch (err) {
224
+ console.error(err);
225
+ res.status(500).json({ error: err.message });
67
226
  }
68
- // Save as new page and redirect to saved page
69
- await (0, pages_1.savePageState)(config.pagesFolder, saveAs, pageState);
70
- res.redirect(`/${saveAs}`);
71
227
  });
72
228
  // Page transformation
73
229
  app.post('/:page', async (req, res) => {
@@ -92,28 +248,77 @@ function usePageRoutes(config, app) {
92
248
  return;
93
249
  }
94
250
  // Create model instance
95
- const innerCompletePrompt = await (0, createCompletePrompt_1.createCompletePrompt)(config.pagesFolder, req.body.model);
96
- const completePrompt = (args) => {
97
- // console.log(`SYSTEM:\n${args.system!.content}`);
98
- // console.log(`PROMPT:\n${args.prompt!.content}`);
99
- return innerCompletePrompt(args);
251
+ const innerCompletePrompt = await (0, createCompletePrompt_1.createCompletePrompt)(config.pagesFolder, 'builder', req.body.model);
252
+ const debugVerbose = config.debugPageUpdates;
253
+ let inputChars = 0;
254
+ let outputChars = 0;
255
+ const completePrompt = async (args) => {
256
+ if (debugVerbose) {
257
+ console.log((0, debugLog_1.green)((0, debugLog_1.dim)('\n ===== PAGE UPDATE REQUEST =====')));
258
+ console.log((0, debugLog_1.green)(` SYSTEM:\n${args.system?.content}`));
259
+ console.log((0, debugLog_1.green)(`\n PROMPT:\n${args.prompt.content}`));
260
+ }
261
+ inputChars += (args.system?.content?.length ?? 0) + (args.prompt.content?.length ?? 0);
262
+ const result = await innerCompletePrompt(args);
263
+ if (result.completed) {
264
+ outputChars += result.value?.length ?? 0;
265
+ }
266
+ if (debugVerbose) {
267
+ console.log((0, debugLog_1.green)((0, debugLog_1.dim)('\n ----- PAGE UPDATE RESPONSE -----')));
268
+ if (result.completed) {
269
+ console.log((0, debugLog_1.green)(` RESPONSE:\n${result.value}`));
270
+ }
271
+ else {
272
+ console.log((0, debugLog_1.red)(` ERROR: ${result.error?.message}`));
273
+ }
274
+ console.log((0, debugLog_1.green)((0, debugLog_1.dim)(' ================================\n')));
275
+ }
276
+ return result;
100
277
  };
101
- // Transform and cache updated page
278
+ // Transform and cache updated page
102
279
  const pagesFolder = config.pagesFolder;
103
- const { maxTokens, instructions, model } = await (0, settings_1.loadSettings)(config.pagesFolder);
104
- const result = model.startsWith('gpt-') ?
105
- await (0, transformPage_1.transformPageAsObject)({ pagesFolder, pageState, message, maxTokens, instructions, completePrompt }) :
106
- await (0, transformPage_1.transformPage)({ pagesFolder, pageState, message, maxTokens, instructions, completePrompt });
280
+ const settings = await (0, settings_1.loadSettings)(config.pagesFolder);
281
+ const builder = (0, settings_1.getModelEntry)(settings, 'builder');
282
+ const { configuration, instructions } = builder;
283
+ const maxTokens = configuration.maxTokens;
284
+ const theme = settings.theme;
285
+ const themeInfo = await (0, themes_1.loadThemeInfo)(theme ?? 'nebula-dusk', config);
286
+ const modelInstructions = (0, modelInstructions_1.getModelInstructions)(builder.provider);
287
+ const configuredConnectors = settings.connectors;
288
+ const result = await (0, transformPage_1.transformPage)({ pagesFolder, pageState, message, maxTokens, instructions, modelInstructions, completePrompt, themeInfo, configuredConnectors });
107
289
  if (result.completed) {
108
- (0, pages_1.updatePageState)(page, result.value);
109
- res.send(result.value);
290
+ const { html, changeCount } = result.value;
291
+ if (config.debug) {
292
+ const inTokens = (0, debugLog_1.estimateTokens)(inputChars).toLocaleString();
293
+ const outTokens = (0, debugLog_1.estimateTokens)(outputChars).toLocaleString();
294
+ console.log(` page: ${page} | message: ${message.length} chars | changes: ${changeCount} ops | ~${inTokens} in / ~${outTokens} out tokens`);
295
+ }
296
+ (0, pages_1.updatePageState)(page, html);
297
+ // Update lastModified timestamp in page metadata
298
+ const metadata = await (0, pages_1.loadPageMetadata)(pagesFolder, page, config.requiredPagesFolder);
299
+ if (metadata) {
300
+ metadata.lastModified = new Date().toISOString();
301
+ await (0, pages_1.savePageMetadata)(pagesFolder, page, metadata);
302
+ }
303
+ // Inject required imports and page scripts (same as GET)
304
+ const pv = metadata?.pageVersion ?? 0;
305
+ let out = ensureRequiredImports(html, pv);
306
+ out = injectPageInfoScript(out, page);
307
+ out = injectPageHelpers(out, pv);
308
+ out = injectPageScript(out, pv);
309
+ res.send(out);
110
310
  }
111
311
  else {
112
312
  throw result.error;
113
313
  }
114
314
  }
115
315
  catch (err) {
116
- console.error(err);
316
+ if (config.debug) {
317
+ console.log((0, debugLog_1.red)(` ERROR: ${err.message}`));
318
+ }
319
+ else {
320
+ console.error(err);
321
+ }
117
322
  res.status(500).send(err.message);
118
323
  }
119
324
  });
@@ -1 +1 @@
1
- {"version":3,"file":"usePageRoutes.js","sourceRoot":"","sources":["../../src/service/usePageRoutes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"usePageRoutes.js","sourceRoot":"","sources":["../../src/service/usePageRoutes.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,42 @@
1
- export interface Settings {
1
+ import { ModelEntry } from './models';
2
+ export interface ServiceConfig {
3
+ apiKey: string;
4
+ enabled: boolean;
5
+ }
6
+ export type ServicesConfig = {
7
+ [serviceId: string]: ServiceConfig;
8
+ };
9
+ export type { ModelEntry } from './models';
10
+ /**
11
+ * V1 settings shape (flat, single model). Used as migration source.
12
+ */
13
+ export interface SettingsV1 {
2
14
  serviceApiKey: string;
3
15
  model: string;
4
16
  maxTokens: number;
5
17
  imageQuality: 'standard' | 'hd';
6
18
  instructions?: string;
7
19
  logCompletions?: boolean;
20
+ theme?: string;
21
+ services?: ServicesConfig;
22
+ }
23
+ /**
24
+ * V2 settings shape with versioned models array.
25
+ */
26
+ export interface SettingsV2 {
27
+ version: 2;
28
+ theme: string;
29
+ models: ModelEntry[];
30
+ features: string[];
31
+ services?: ServicesConfig;
32
+ connectors?: ServicesConfig;
8
33
  }
9
- export declare const DefaultSettings: Settings;
34
+ export declare const DefaultSettings: SettingsV2;
35
+ /**
36
+ * Find a model entry by its `use` field. Falls back to default if not found.
37
+ */
38
+ export declare function getModelEntry(settings: SettingsV2, use: 'builder' | 'chat'): ModelEntry;
10
39
  export declare function hasConfiguredSettings(folder: string): Promise<boolean>;
11
- export declare function loadSettings(folder: string): Promise<Settings>;
12
- export declare function saveSettings(folder: string, settings: Partial<Settings>): Promise<void>;
40
+ export declare function loadSettings(folder: string): Promise<SettingsV2>;
41
+ export declare function saveSettings(folder: string, settings: Partial<SettingsV2>): Promise<void>;
13
42
  //# sourceMappingURL=settings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,QAAQ;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,UAAU,GAAG,IAAI,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,eAAO,MAAM,eAAe,EAAE,QAO7B,CAAC;AAEF,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAa5E;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAgBpE;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAG7F"}
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAgC,MAAM,UAAU,CAAC;AAIpE,MAAM,WAAW,aAAa;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,cAAc,GAAG;IAAE,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,CAAA;CAAE,CAAC;AAGpE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,UAAU,GAAG,IAAI,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,UAAU,CAAC,EAAE,cAAc,CAAC;CAC/B;AAED,eAAO,MAAM,eAAe,EAAE,UAwB7B,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,GAAG,MAAM,GAAG,UAAU,CAIvF;AAmDD,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAc5E;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA+BtE;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAO/F"}