synthos 0.10.0 → 0.11.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 (312) hide show
  1. package/README.md +5 -5
  2. package/default-pages/elevenlabs_effects_studio/chat-history.json +1 -0
  3. package/default-pages/elevenlabs_effects_studio/page.html +1345 -1363
  4. package/default-pages/elevenlabs_effects_studio/page.json +13 -11
  5. package/default-pages/elevenlabs_voice_studio/chat-history.json +1 -0
  6. package/default-pages/elevenlabs_voice_studio/page.html +782 -801
  7. package/default-pages/elevenlabs_voice_studio/page.json +13 -11
  8. package/default-pages/json_tools/chat-history.json +1 -0
  9. package/default-pages/json_tools/page.html +70 -90
  10. package/default-pages/json_tools/page.json +12 -10
  11. package/default-pages/my_notes/chat-history.json +1 -0
  12. package/default-pages/my_notes/page.html +115 -131
  13. package/default-pages/my_notes/page.json +14 -12
  14. package/default-pages/neon_asteroids/chat-history.json +1 -0
  15. package/default-pages/neon_asteroids/page.html +1777 -1803
  16. package/default-pages/neon_asteroids/page.json +14 -12
  17. package/default-pages/oregon_trail/chat-history.json +1 -0
  18. package/default-pages/oregon_trail/page.html +290 -307
  19. package/default-pages/oregon_trail/page.json +14 -12
  20. package/default-pages/solar_explorer/chat-history.json +1 -0
  21. package/default-pages/solar_explorer/page.html +1929 -1951
  22. package/default-pages/solar_explorer/page.json +14 -12
  23. package/default-pages/solar_tutorial/chat-history.json +1 -0
  24. package/default-pages/solar_tutorial/page.html +464 -478
  25. package/default-pages/solar_tutorial/page.json +12 -10
  26. package/default-pages/us_map/chat-history.json +1 -0
  27. package/default-pages/us_map/page.html +170 -193
  28. package/default-pages/us_map/page.json +14 -12
  29. package/default-pages/us_map/page.light.png +0 -0
  30. package/default-pages/us_map_1850/chat-history.json +1 -0
  31. package/default-pages/us_map_1850/page.html +302 -326
  32. package/default-pages/us_map_1850/page.json +14 -12
  33. package/default-pages/western_cities_1850/chat-history.json +1 -0
  34. package/default-pages/western_cities_1850/page.html +503 -527
  35. package/default-pages/western_cities_1850/page.json +14 -12
  36. package/default-themes/aurora-dawn.v3.css +15 -14
  37. package/default-themes/aurora-dusk.v3.css +26 -26
  38. package/default-themes/cosmos-dawn.v3.css +15 -14
  39. package/default-themes/cosmos-dusk.v3.css +26 -26
  40. package/default-themes/elemental-dawn.v3.css +200 -0
  41. package/default-themes/nebula-dawn.v3.css +15 -14
  42. package/default-themes/nebula-dusk.v3.css +24 -24
  43. package/default-themes/solar-flare-dawn.v3.css +15 -14
  44. package/default-themes/solar-flare-dusk.v3.css +26 -26
  45. package/dist/builders/anthropic.d.ts +26 -2
  46. package/dist/builders/anthropic.d.ts.map +1 -1
  47. package/dist/builders/anthropic.js +132 -31
  48. package/dist/builders/anthropic.js.map +1 -1
  49. package/dist/builders/claudecode.d.ts +13 -0
  50. package/dist/builders/claudecode.d.ts.map +1 -0
  51. package/dist/builders/claudecode.js +253 -0
  52. package/dist/builders/claudecode.js.map +1 -0
  53. package/dist/builders/index.d.ts +2 -1
  54. package/dist/builders/index.d.ts.map +1 -1
  55. package/dist/builders/index.js +8 -1
  56. package/dist/builders/index.js.map +1 -1
  57. package/dist/builders/openai.js +2 -1
  58. package/dist/builders/openai.js.map +1 -1
  59. package/dist/builders/types.d.ts +31 -7
  60. package/dist/builders/types.d.ts.map +1 -1
  61. package/dist/builders/types.js +60 -28
  62. package/dist/builders/types.js.map +1 -1
  63. package/dist/connectors/types.d.ts +8 -0
  64. package/dist/connectors/types.d.ts.map +1 -1
  65. package/dist/init.d.ts.map +1 -1
  66. package/dist/init.js +13 -6
  67. package/dist/init.js.map +1 -1
  68. package/dist/migrations.d.ts.map +1 -1
  69. package/dist/migrations.js +161 -14
  70. package/dist/migrations.js.map +1 -1
  71. package/dist/models/anthropic.d.ts +1 -0
  72. package/dist/models/anthropic.d.ts.map +1 -1
  73. package/dist/models/anthropic.js +129 -29
  74. package/dist/models/anthropic.js.map +1 -1
  75. package/dist/models/chainOfThought.d.ts.map +1 -1
  76. package/dist/models/chainOfThought.js +32 -19
  77. package/dist/models/chainOfThought.js.map +1 -1
  78. package/dist/models/index.d.ts +2 -2
  79. package/dist/models/index.d.ts.map +1 -1
  80. package/dist/models/index.js +2 -1
  81. package/dist/models/index.js.map +1 -1
  82. package/dist/models/providers.d.ts +1 -0
  83. package/dist/models/providers.d.ts.map +1 -1
  84. package/dist/models/providers.js +12 -4
  85. package/dist/models/providers.js.map +1 -1
  86. package/dist/models/types.d.ts +15 -1
  87. package/dist/models/types.d.ts.map +1 -1
  88. package/dist/models/types.js.map +1 -1
  89. package/dist/pages.d.ts +57 -8
  90. package/dist/pages.d.ts.map +1 -1
  91. package/dist/pages.js +258 -45
  92. package/dist/pages.js.map +1 -1
  93. package/dist/service/createCompletePrompt.d.ts.map +1 -1
  94. package/dist/service/createCompletePrompt.js +5 -0
  95. package/dist/service/createCompletePrompt.js.map +1 -1
  96. package/dist/service/mediaCache.d.ts +36 -0
  97. package/dist/service/mediaCache.d.ts.map +1 -0
  98. package/dist/service/mediaCache.js +182 -0
  99. package/dist/service/mediaCache.js.map +1 -0
  100. package/dist/service/pageValidator.d.ts +25 -0
  101. package/dist/service/pageValidator.d.ts.map +1 -0
  102. package/dist/service/pageValidator.js +315 -0
  103. package/dist/service/pageValidator.js.map +1 -0
  104. package/dist/service/server.d.ts.map +1 -1
  105. package/dist/service/server.js +4 -0
  106. package/dist/service/server.js.map +1 -1
  107. package/dist/service/sharedTableSchema.d.ts +73 -0
  108. package/dist/service/sharedTableSchema.d.ts.map +1 -0
  109. package/dist/service/sharedTableSchema.js +206 -0
  110. package/dist/service/sharedTableSchema.js.map +1 -0
  111. package/dist/service/transformPage.d.ts +49 -11
  112. package/dist/service/transformPage.d.ts.map +1 -1
  113. package/dist/service/transformPage.js +354 -241
  114. package/dist/service/transformPage.js.map +1 -1
  115. package/dist/service/useApiRoutes.d.ts.map +1 -1
  116. package/dist/service/useApiRoutes.js +288 -34
  117. package/dist/service/useApiRoutes.js.map +1 -1
  118. package/dist/service/useConnectorRoutes.d.ts.map +1 -1
  119. package/dist/service/useConnectorRoutes.js +170 -32
  120. package/dist/service/useConnectorRoutes.js.map +1 -1
  121. package/dist/service/useDataRoutes.d.ts.map +1 -1
  122. package/dist/service/useDataRoutes.js +59 -2
  123. package/dist/service/useDataRoutes.js.map +1 -1
  124. package/dist/service/useExtractRoutes.d.ts +4 -0
  125. package/dist/service/useExtractRoutes.d.ts.map +1 -0
  126. package/dist/service/useExtractRoutes.js +304 -0
  127. package/dist/service/useExtractRoutes.js.map +1 -0
  128. package/dist/service/usePageRoutes.d.ts +17 -0
  129. package/dist/service/usePageRoutes.d.ts.map +1 -1
  130. package/dist/service/usePageRoutes.js +1385 -483
  131. package/dist/service/usePageRoutes.js.map +1 -1
  132. package/dist/service/useSharedDataRoutes.d.ts.map +1 -1
  133. package/dist/service/useSharedDataRoutes.js +54 -2
  134. package/dist/service/useSharedDataRoutes.js.map +1 -1
  135. package/dist/settings.d.ts +27 -0
  136. package/dist/settings.d.ts.map +1 -1
  137. package/dist/settings.js +40 -1
  138. package/dist/settings.js.map +1 -1
  139. package/dist/themes.d.ts +0 -5
  140. package/dist/themes.d.ts.map +1 -1
  141. package/dist/themes.js +3 -95
  142. package/dist/themes.js.map +1 -1
  143. package/migration-rules/v2-to-v3.md +277 -119
  144. package/package.json +5 -1
  145. package/{default-pages/application → required-pages/_shell}/page.html +56 -42
  146. package/required-pages/_shell/page.json +14 -0
  147. package/required-pages/_starters/page.html +534 -0
  148. package/required-pages/_starters/page.json +12 -0
  149. package/required-pages/builder/page.html +353 -43
  150. package/required-pages/builder/page.json +12 -10
  151. package/required-pages/pages/page.html +697 -924
  152. package/required-pages/pages/page.json +12 -10
  153. package/required-pages/settings/page.html +1879 -1753
  154. package/required-pages/settings/page.json +12 -10
  155. package/required-pages/synthos_apis/page.html +834 -845
  156. package/required-pages/synthos_apis/page.json +12 -10
  157. package/required-pages/synthos_scripts/page.html +74 -88
  158. package/required-pages/synthos_scripts/page.json +12 -10
  159. package/scripts/append-instructions.py +90 -0
  160. package/scripts/audit-instructions.py +76 -0
  161. package/scripts/cleanup-shell-markup.mjs +112 -0
  162. package/service-connectors/buffer/connector.json +46 -0
  163. package/service-connectors/canva/connector.json +67 -0
  164. package/service-connectors/elevenlabs/connector.json +1 -1
  165. package/src/builders/anthropic.ts +155 -30
  166. package/src/builders/claudecode.ts +310 -0
  167. package/src/builders/index.ts +7 -1
  168. package/src/builders/openai.ts +2 -1
  169. package/src/builders/types.ts +93 -32
  170. package/src/connectors/types.ts +8 -0
  171. package/src/init.ts +13 -7
  172. package/src/migrations.ts +187 -16
  173. package/src/models/anthropic.ts +140 -30
  174. package/src/models/chainOfThought.ts +33 -18
  175. package/src/models/index.ts +2 -2
  176. package/src/models/providers.ts +12 -3
  177. package/src/models/types.ts +21 -1
  178. package/src/pages.ts +271 -35
  179. package/src/service/createCompletePrompt.ts +6 -0
  180. package/src/service/mediaCache.ts +206 -0
  181. package/src/service/pageValidator.ts +337 -0
  182. package/src/service/server.ts +4 -0
  183. package/src/service/sharedTableSchema.ts +236 -0
  184. package/src/service/transformPage.ts +370 -260
  185. package/src/service/useApiRoutes.ts +282 -32
  186. package/src/service/useConnectorRoutes.ts +189 -34
  187. package/src/service/useDataRoutes.ts +198 -116
  188. package/src/service/useExtractRoutes.ts +331 -0
  189. package/src/service/usePageRoutes.ts +1411 -394
  190. package/src/service/useSharedDataRoutes.ts +184 -109
  191. package/src/settings.ts +65 -0
  192. package/src/themes.ts +78 -180
  193. package/starters/blank_starter/chat-history.json +1 -0
  194. package/starters/blank_starter/page.dark.png +0 -0
  195. package/starters/blank_starter/page.html +47 -0
  196. package/starters/blank_starter/page.json +13 -0
  197. package/starters/blank_starter/page.light.png +0 -0
  198. package/starters/calculator_starter/chat-history.json +1 -0
  199. package/starters/calculator_starter/page.dark.png +0 -0
  200. package/starters/calculator_starter/page.html +232 -0
  201. package/starters/calculator_starter/page.json +13 -0
  202. package/starters/calculator_starter/page.light.png +0 -0
  203. package/starters/calendar_starter/chat-history.json +1 -0
  204. package/starters/calendar_starter/page.dark.png +0 -0
  205. package/starters/calendar_starter/page.html +495 -0
  206. package/starters/calendar_starter/page.json +13 -0
  207. package/starters/calendar_starter/page.light.png +0 -0
  208. package/starters/chat_starter/chat-history.json +1 -0
  209. package/starters/chat_starter/page.dark.png +0 -0
  210. package/starters/chat_starter/page.html +351 -0
  211. package/starters/chat_starter/page.json +13 -0
  212. package/starters/chat_starter/page.light.png +0 -0
  213. package/starters/checklist_starter/chat-history.json +1 -0
  214. package/starters/checklist_starter/page.dark.png +0 -0
  215. package/starters/checklist_starter/page.html +437 -0
  216. package/starters/checklist_starter/page.json +13 -0
  217. package/starters/checklist_starter/page.light.png +0 -0
  218. package/starters/dashboard_starter/chat-history.json +1 -0
  219. package/starters/dashboard_starter/page.dark.png +0 -0
  220. package/starters/dashboard_starter/page.html +195 -0
  221. package/starters/dashboard_starter/page.json +13 -0
  222. package/starters/dashboard_starter/page.light.png +0 -0
  223. package/starters/form_starter/chat-history.json +1 -0
  224. package/starters/form_starter/page.dark.png +0 -0
  225. package/starters/form_starter/page.html +313 -0
  226. package/starters/form_starter/page.json +13 -0
  227. package/starters/form_starter/page.light.png +0 -0
  228. package/starters/gallery_starter/chat-history.json +1 -0
  229. package/starters/gallery_starter/page.dark.png +0 -0
  230. package/starters/gallery_starter/page.html +418 -0
  231. package/starters/gallery_starter/page.json +13 -0
  232. package/starters/gallery_starter/page.light.png +0 -0
  233. package/starters/generator_starter/chat-history.json +1 -0
  234. package/starters/generator_starter/page.dark.png +0 -0
  235. package/starters/generator_starter/page.html +261 -0
  236. package/starters/generator_starter/page.json +13 -0
  237. package/starters/generator_starter/page.light.png +0 -0
  238. package/starters/index.html +538 -0
  239. package/starters/kanban_starter/chat-history.json +1 -0
  240. package/starters/kanban_starter/page.dark.png +0 -0
  241. package/starters/kanban_starter/page.html +432 -0
  242. package/starters/kanban_starter/page.json +13 -0
  243. package/starters/kanban_starter/page.light.png +0 -0
  244. package/starters/presentation_builder/chat-history.json +1 -0
  245. package/starters/presentation_builder/page.dark.png +0 -0
  246. package/starters/presentation_builder/page.html +970 -0
  247. package/starters/presentation_builder/page.json +15 -0
  248. package/starters/presentation_builder/page.light.png +0 -0
  249. package/starters/presentation_builder/presentation_voice/voice_config.json +9 -0
  250. package/starters/pulse_starter/chat-history.json +1 -0
  251. package/starters/pulse_starter/page.dark.png +0 -0
  252. package/starters/pulse_starter/page.html +698 -0
  253. package/starters/pulse_starter/page.json +13 -0
  254. package/starters/pulse_starter/page.light.png +0 -0
  255. package/starters/quiz_starter/chat-history.json +1 -0
  256. package/starters/quiz_starter/page.dark.png +0 -0
  257. package/starters/quiz_starter/page.html +292 -0
  258. package/starters/quiz_starter/page.json +13 -0
  259. package/starters/quiz_starter/page.light.png +0 -0
  260. package/starters/reference_starter/chat-history.json +1 -0
  261. package/starters/reference_starter/page.dark.png +0 -0
  262. package/starters/reference_starter/page.html +250 -0
  263. package/starters/reference_starter/page.json +13 -0
  264. package/starters/reference_starter/page.light.png +0 -0
  265. package/starters/retro_game_starter/chat-history.json +1 -0
  266. package/starters/retro_game_starter/page.dark.png +0 -0
  267. package/{default-pages → starters}/retro_game_starter/page.html +1281 -1308
  268. package/starters/retro_game_starter/page.json +15 -0
  269. package/starters/retro_game_starter/page.light.png +0 -0
  270. package/starters/roster_starter/chat-history.json +1 -0
  271. package/starters/roster_starter/page.dark.png +0 -0
  272. package/starters/roster_starter/page.html +600 -0
  273. package/starters/roster_starter/page.json +13 -0
  274. package/starters/roster_starter/page.light.png +0 -0
  275. package/starters/server.js +182 -0
  276. package/starters/start.cmd +1 -0
  277. package/starters/timeline_starter/chat-history.json +1 -0
  278. package/starters/timeline_starter/page.dark.png +0 -0
  279. package/starters/timeline_starter/page.html +446 -0
  280. package/starters/timeline_starter/page.json +13 -0
  281. package/starters/timeline_starter/page.light.png +0 -0
  282. package/starters/tutorial_starter/chat-history.json +1 -0
  283. package/starters/tutorial_starter/page.dark.png +0 -0
  284. package/starters/tutorial_starter/page.html +283 -0
  285. package/starters/tutorial_starter/page.json +13 -0
  286. package/starters/tutorial_starter/page.light.png +0 -0
  287. package/static-files/agent.v3.js +122 -0
  288. package/static-files/connector.v3.js +48 -0
  289. package/static-files/extract.v3.js +188 -0
  290. package/static-files/helpers.v3.js +50 -6
  291. package/static-files/page-bridge.js +114 -0
  292. package/static-files/page.v3.js +1292 -1290
  293. package/static-files/script.v3.js +32 -0
  294. package/static-files/server.v3.js +89 -0
  295. package/static-files/shell-bridge.v3.js +174 -0
  296. package/static-files/shell-modals.v3.js +521 -0
  297. package/static-files/{shell.css → shell.v3.css} +271 -22
  298. package/static-files/shell.v3.js +1865 -0
  299. package/static-files/storage.v3.js +176 -0
  300. package/tests/anthropic.spec.ts +42 -7
  301. package/tests/builders.spec.ts +72 -4
  302. package/tests/pageValidator.spec.ts +548 -0
  303. package/tests/profiles.spec.ts +122 -0
  304. package/tests/providers.spec.ts +1 -1
  305. package/tests/sharedTableSchema.spec.ts +242 -0
  306. package/tests/transformPage.spec.ts +62 -81
  307. package/default-pages/application/page.json +0 -10
  308. package/default-pages/retro_game_starter/page.json +0 -12
  309. package/default-pages/sidebar_page/page.html +0 -51
  310. package/default-pages/sidebar_page/page.json +0 -10
  311. package/default-pages/two-panel_page/page.html +0 -68
  312. package/default-pages/two-panel_page/page.json +0 -10
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createMediaCache = void 0;
7
+ const crypto_1 = require("crypto");
8
+ const path_1 = __importDefault(require("path"));
9
+ function hashKey(key) {
10
+ return (0, crypto_1.createHash)('sha256').update(key).digest('hex');
11
+ }
12
+ const MAX_ENTRIES = 500;
13
+ const CATEGORIES = ['images', 'audio'];
14
+ function createMediaCache(options) {
15
+ const { storage, cacheRoot } = options;
16
+ function categoryDir(category) {
17
+ return path_1.default.join(cacheRoot, category);
18
+ }
19
+ async function ensureCategory(category) {
20
+ await storage.ensureFolderExists(categoryDir(category));
21
+ }
22
+ async function get(category, key) {
23
+ const hash = hashKey(key);
24
+ const dir = categoryDir(category);
25
+ const metaPath = path_1.default.join(dir, `${hash}.meta.json`);
26
+ if (!(await storage.checkIfExists(metaPath))) {
27
+ return { hit: false };
28
+ }
29
+ const meta = JSON.parse(await storage.loadFile(metaPath));
30
+ const dataPath = path_1.default.join(dir, `${hash}${meta.extension}`);
31
+ try {
32
+ const buffer = await storage.loadBuffer(dataPath);
33
+ // Update last access time for eviction tracking
34
+ meta.lastAccessedAt = new Date().toISOString();
35
+ await storage.saveFile(metaPath, JSON.stringify(meta, null, 2));
36
+ return { hit: true, buffer, contentType: meta.contentType };
37
+ }
38
+ catch {
39
+ return { hit: false };
40
+ }
41
+ }
42
+ async function put(category, key, data, contentType, meta) {
43
+ await ensureCategory(category);
44
+ const hash = hashKey(key);
45
+ const dir = categoryDir(category);
46
+ const extension = extensionForContentType(contentType);
47
+ const dataPath = path_1.default.join(dir, `${hash}${extension}`);
48
+ const metaPath = path_1.default.join(dir, `${hash}.meta.json`);
49
+ const now = new Date().toISOString();
50
+ await storage.saveBuffer(dataPath, data);
51
+ await storage.saveFile(metaPath, JSON.stringify({
52
+ ...meta,
53
+ contentType,
54
+ extension,
55
+ createdAt: now,
56
+ lastAccessedAt: now,
57
+ }, null, 2));
58
+ // Run eviction after writing the new entry
59
+ await evict();
60
+ }
61
+ async function evict() {
62
+ // Collect all entries across categories
63
+ const entries = [];
64
+ for (const category of CATEGORIES) {
65
+ const dir = categoryDir(category);
66
+ if (!(await storage.checkIfExists(dir)))
67
+ continue;
68
+ const files = await storage.listFiles(dir);
69
+ for (const file of files) {
70
+ if (!file.endsWith('.meta.json'))
71
+ continue;
72
+ const metaPath = path_1.default.join(dir, file);
73
+ try {
74
+ const meta = JSON.parse(await storage.loadFile(metaPath));
75
+ const hash = file.replace('.meta.json', '');
76
+ const dataPath = path_1.default.join(dir, `${hash}${meta.extension}`);
77
+ let size = 0;
78
+ try {
79
+ const info = await storage.stat(dataPath);
80
+ size = info.size;
81
+ }
82
+ catch { /* data file missing, size stays 0 */ }
83
+ entries.push({
84
+ category,
85
+ hash,
86
+ lastAccessedAt: meta.lastAccessedAt || meta.createdAt || '1970-01-01T00:00:00.000Z',
87
+ size,
88
+ metaPath,
89
+ extension: meta.extension,
90
+ });
91
+ }
92
+ catch { /* skip unreadable meta */ }
93
+ }
94
+ }
95
+ if (entries.length <= MAX_ENTRIES)
96
+ return;
97
+ // Sort by lastAccessedAt descending — most recent first
98
+ entries.sort((a, b) => b.lastAccessedAt.localeCompare(a.lastAccessedAt));
99
+ // Evict everything beyond the first 500
100
+ const toEvict = entries.slice(MAX_ENTRIES);
101
+ for (const entry of toEvict) {
102
+ const dir = categoryDir(entry.category);
103
+ const dataPath = path_1.default.join(dir, `${entry.hash}${entry.extension}`);
104
+ try {
105
+ await storage.deleteFile(dataPath);
106
+ }
107
+ catch { /* ignore */ }
108
+ try {
109
+ await storage.deleteFile(entry.metaPath);
110
+ }
111
+ catch { /* ignore */ }
112
+ }
113
+ }
114
+ async function invalidate(category, key) {
115
+ const hash = hashKey(key);
116
+ const dir = categoryDir(category);
117
+ const metaPath = path_1.default.join(dir, `${hash}.meta.json`);
118
+ if (await storage.checkIfExists(metaPath)) {
119
+ const meta = JSON.parse(await storage.loadFile(metaPath));
120
+ const dataPath = path_1.default.join(dir, `${hash}${meta.extension}`);
121
+ try {
122
+ await storage.deleteFile(dataPath);
123
+ }
124
+ catch { /* ignore */ }
125
+ try {
126
+ await storage.deleteFile(metaPath);
127
+ }
128
+ catch { /* ignore */ }
129
+ }
130
+ }
131
+ async function clearCategory(category) {
132
+ const dir = categoryDir(category);
133
+ if (await storage.checkIfExists(dir)) {
134
+ await storage.deleteFolder(dir);
135
+ }
136
+ }
137
+ async function clearAll() {
138
+ await clearCategory('images');
139
+ await clearCategory('audio');
140
+ }
141
+ async function stats() {
142
+ const result = {
143
+ images: { count: 0, totalBytes: 0 },
144
+ audio: { count: 0, totalBytes: 0 },
145
+ };
146
+ for (const category of CATEGORIES) {
147
+ const dir = categoryDir(category);
148
+ if (!(await storage.checkIfExists(dir)))
149
+ continue;
150
+ const files = await storage.listFiles(dir);
151
+ for (const file of files) {
152
+ if (file.endsWith('.meta.json'))
153
+ continue;
154
+ try {
155
+ const info = await storage.stat(path_1.default.join(dir, file));
156
+ result[category].count++;
157
+ result[category].totalBytes += info.size;
158
+ }
159
+ catch { /* skip missing */ }
160
+ }
161
+ }
162
+ return result;
163
+ }
164
+ return { get, put, invalidate, clearCategory, clearAll, stats, evict };
165
+ }
166
+ exports.createMediaCache = createMediaCache;
167
+ function extensionForContentType(contentType) {
168
+ if (contentType.includes('png'))
169
+ return '.png';
170
+ if (contentType.includes('jpeg') || contentType.includes('jpg'))
171
+ return '.jpg';
172
+ if (contentType.includes('webp'))
173
+ return '.webp';
174
+ if (contentType.includes('mpeg') || contentType.includes('mp3'))
175
+ return '.mp3';
176
+ if (contentType.includes('wav'))
177
+ return '.wav';
178
+ if (contentType.includes('ogg'))
179
+ return '.ogg';
180
+ return '.bin';
181
+ }
182
+ //# sourceMappingURL=mediaCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mediaCache.js","sourceRoot":"","sources":["../../src/service/mediaCache.ts"],"names":[],"mappings":";;;;;;AAAA,mCAAoC;AACpC,gDAAwB;AAyBxB,SAAS,OAAO,CAAC,GAAW;IACxB,OAAO,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,WAAW,GAAG,GAAG,CAAC;AACxB,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAU,CAAC;AAEhD,SAAgB,gBAAgB,CAAC,OAA0B;IACvD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAEvC,SAAS,WAAW,CAAC,QAAgB;QACjC,OAAO,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,UAAU,cAAc,CAAC,QAAgB;QAC1C,MAAM,OAAO,CAAC,kBAAkB,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,UAAU,GAAG,CAAC,QAAgB,EAAE,GAAW;QAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,YAAY,CAAC,CAAC;QAErD,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,EAAE;YAC1C,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;SACzB;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAC5D,IAAI;YACA,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAElD,gDAAgD;YAChD,IAAI,CAAC,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC/C,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAEhE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;SAC/D;QAAC,MAAM;YACJ,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;SACzB;IACL,CAAC;IAED,KAAK,UAAU,GAAG,CACd,QAAgB,EAChB,GAAW,EACX,IAAY,EACZ,WAAmB,EACnB,IAA6B;QAE7B,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,SAAS,GAAG,uBAAuB,CAAC,WAAW,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,SAAS,EAAE,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,YAAY,CAAC,CAAC;QAErD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACzC,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC;YAC5C,GAAG,IAAI;YACP,WAAW;YACX,SAAS;YACT,SAAS,EAAE,GAAG;YACd,cAAc,EAAE,GAAG;SACtB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEb,2CAA2C;QAC3C,MAAM,KAAK,EAAE,CAAC;IAClB,CAAC;IAED,KAAK,UAAU,KAAK;QAChB,wCAAwC;QACxC,MAAM,OAAO,GAAoH,EAAE,CAAC;QAEpI,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE;YAC/B,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;YAClC,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;gBAAE,SAAS;YAElD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;gBACtB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;oBAAE,SAAS;gBAC3C,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACtC,IAAI;oBACA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;oBAC5C,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;oBAC5D,IAAI,IAAI,GAAG,CAAC,CAAC;oBACb,IAAI;wBACA,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;wBAC1C,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;qBACpB;oBAAC,MAAM,EAAE,qCAAqC,EAAE;oBACjD,OAAO,CAAC,IAAI,CAAC;wBACT,QAAQ;wBACR,IAAI;wBACJ,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,SAAS,IAAI,0BAA0B;wBACnF,IAAI;wBACJ,QAAQ;wBACR,SAAS,EAAE,IAAI,CAAC,SAAS;qBAC5B,CAAC,CAAC;iBACN;gBAAC,MAAM,EAAE,0BAA0B,EAAE;aACzC;SACJ;QAED,IAAI,OAAO,CAAC,MAAM,IAAI,WAAW;YAAE,OAAO;QAE1C,wDAAwD;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;QAEzE,wCAAwC;QACxC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC3C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;YACzB,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACxC,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;YACnE,IAAI;gBAAE,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;aAAE;YAAC,MAAM,EAAE,YAAY,EAAE;YAClE,IAAI;gBAAE,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;aAAE;YAAC,MAAM,EAAE,YAAY,EAAE;SAC3E;IACL,CAAC;IAED,KAAK,UAAU,UAAU,CAAC,QAAgB,EAAE,GAAW;QACnD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,YAAY,CAAC,CAAC;QAErD,IAAI,MAAM,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE;YACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC1D,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YAC5D,IAAI;gBAAE,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;aAAE;YAAC,MAAM,EAAE,YAAY,EAAE;YAClE,IAAI;gBAAE,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;aAAE;YAAC,MAAM,EAAE,YAAY,EAAE;SACrE;IACL,CAAC;IAED,KAAK,UAAU,aAAa,CAAC,QAAgB;QACzC,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QAClC,IAAI,MAAM,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE;YAClC,MAAM,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;SACnC;IACL,CAAC;IAED,KAAK,UAAU,QAAQ;QACnB,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,UAAU,KAAK;QAChB,MAAM,MAAM,GAAe;YACvB,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;YACnC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;SACrC,CAAC;QAEF,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE;YAC/B,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;YAClC,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;gBAAE,SAAS;YAClD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;gBACtB,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;oBAAE,SAAS;gBAC1C,IAAI;oBACA,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;oBACtD,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC;oBACzB,MAAM,CAAC,QAAQ,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC;iBAC5C;gBAAC,MAAM,EAAE,kBAAkB,EAAE;aACjC;SACJ;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC3E,CAAC;AAhKD,4CAgKC;AAED,SAAS,uBAAuB,CAAC,WAAmB;IAChD,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAC/C,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAC/E,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,OAAO,CAAC;IACjD,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAC/E,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAC/C,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAC/C,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * pageValidator.ts — Lightweight page validation for LLM-generated HTML.
3
+ *
4
+ * Catches common errors (syntax, missing DOM elements, bad synthos.* calls)
5
+ * before serving pages. No browser binary — static analysis only.
6
+ *
7
+ * Layers:
8
+ * 1. Script extraction + Acorn parse → syntax errors
9
+ * 2. DOM element ID inventory → missing element references
10
+ * 3. SynthOS API pattern checks → hallucinated method calls
11
+ */
12
+ export interface PageValidationError {
13
+ type: 'syntax-error' | 'missing-element' | 'unknown-api';
14
+ message: string;
15
+ source?: string;
16
+ line?: number;
17
+ col?: number;
18
+ }
19
+ export interface PageValidationResult {
20
+ valid: boolean;
21
+ errors: PageValidationError[];
22
+ durationMs: number;
23
+ }
24
+ export declare function validatePage(html: string): PageValidationResult;
25
+ //# sourceMappingURL=pageValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pageValidator.d.ts","sourceRoot":"","sources":["../../src/service/pageValidator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,cAAc,GAAG,iBAAiB,GAAG,aAAa,CAAC;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;CACtB;AAsRD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,CA2B/D"}
@@ -0,0 +1,315 @@
1
+ "use strict";
2
+ /**
3
+ * pageValidator.ts — Lightweight page validation for LLM-generated HTML.
4
+ *
5
+ * Catches common errors (syntax, missing DOM elements, bad synthos.* calls)
6
+ * before serving pages. No browser binary — static analysis only.
7
+ *
8
+ * Layers:
9
+ * 1. Script extraction + Acorn parse → syntax errors
10
+ * 2. DOM element ID inventory → missing element references
11
+ * 3. SynthOS API pattern checks → hallucinated method calls
12
+ */
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || function (mod) {
30
+ if (mod && mod.__esModule) return mod;
31
+ var result = {};
32
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
33
+ __setModuleDefault(result, mod);
34
+ return result;
35
+ };
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.validatePage = void 0;
38
+ const acorn = __importStar(require("acorn"));
39
+ const cheerio = __importStar(require("cheerio"));
40
+ // ---------------------------------------------------------------------------
41
+ // Known injected script IDs — skip these during validation
42
+ // ---------------------------------------------------------------------------
43
+ const INJECTED_SCRIPT_IDS = new Set([
44
+ 'page-bridge',
45
+ 'page-helpers',
46
+ 'page-info',
47
+ 'page-script',
48
+ 'synthos-error-capture',
49
+ // V3 module scripts
50
+ 'shell-v3',
51
+ 'server-v3',
52
+ 'storage-v3',
53
+ 'script-v3',
54
+ 'connector-v3',
55
+ 'agent-v3',
56
+ ]);
57
+ // ---------------------------------------------------------------------------
58
+ // Known SynthOS API surface (from helpers.v3.js)
59
+ // ---------------------------------------------------------------------------
60
+ const KNOWN_SYNTHOS_METHODS = new Set([
61
+ // data
62
+ 'synthos.data',
63
+ 'synthos.data.list',
64
+ 'synthos.data.get',
65
+ 'synthos.data.save',
66
+ 'synthos.data.remove',
67
+ // files
68
+ 'synthos.files',
69
+ 'synthos.files.list',
70
+ 'synthos.files.upload',
71
+ 'synthos.files.url',
72
+ 'synthos.files.remove',
73
+ // shared.data
74
+ 'synthos.shared',
75
+ 'synthos.shared.data',
76
+ 'synthos.shared.data.list',
77
+ 'synthos.shared.data.get',
78
+ 'synthos.shared.data.save',
79
+ 'synthos.shared.data.remove',
80
+ // shared.files
81
+ 'synthos.shared.files',
82
+ 'synthos.shared.files.list',
83
+ 'synthos.shared.files.upload',
84
+ 'synthos.shared.files.url',
85
+ 'synthos.shared.files.remove',
86
+ // generate
87
+ 'synthos.generate',
88
+ 'synthos.generate.image',
89
+ 'synthos.generate.completion',
90
+ // script
91
+ 'synthos.script',
92
+ 'synthos.script.run',
93
+ // page
94
+ 'synthos.page',
95
+ 'synthos.page.list',
96
+ 'synthos.page.get',
97
+ 'synthos.page.update',
98
+ 'synthos.page.remove',
99
+ 'synthos.page.ask',
100
+ // search
101
+ 'synthos.search',
102
+ 'synthos.search.web',
103
+ // connector
104
+ 'synthos.connector',
105
+ 'synthos.connector.call',
106
+ 'synthos.connector.list',
107
+ // agent
108
+ 'synthos.agent',
109
+ 'synthos.agent.list',
110
+ 'synthos.agent.send',
111
+ 'synthos.agent.sendStream',
112
+ 'synthos.agent.chat',
113
+ 'synthos.agent.chat.send',
114
+ 'synthos.agent.chat.sendStream',
115
+ 'synthos.agent.chat.history',
116
+ 'synthos.agent.chat.abort',
117
+ 'synthos.agent.chat.clear',
118
+ 'synthos.agent.isEnabled',
119
+ 'synthos.agent.getCapabilities',
120
+ // shell
121
+ 'synthos.shell',
122
+ 'synthos.shell.navigate',
123
+ 'synthos.shell.submitChat',
124
+ 'synthos.shell.setDirty',
125
+ 'synthos.shell.showLoading',
126
+ 'synthos.shell.hideLoading',
127
+ 'synthos.shell.focusChat',
128
+ 'synthos.shell.openSaveModal',
129
+ 'synthos.shell.toggleBuilder',
130
+ 'synthos.shell.openBuilder',
131
+ 'synthos.shell.closeBuilder',
132
+ 'synthos.shell.on',
133
+ ]);
134
+ // ---------------------------------------------------------------------------
135
+ // Layer 1: Script Extraction + Acorn Parse
136
+ // ---------------------------------------------------------------------------
137
+ function estimateLineOffset(html, scriptHtml) {
138
+ const idx = html.indexOf(scriptHtml);
139
+ if (idx === -1)
140
+ return 0;
141
+ let line = 1;
142
+ for (let i = 0; i < idx; i++) {
143
+ if (html[i] === '\n')
144
+ line++;
145
+ }
146
+ return line;
147
+ }
148
+ function extractScripts(html) {
149
+ const $ = cheerio.load(html);
150
+ const scripts = [];
151
+ let index = 0;
152
+ $('script').each((_, el) => {
153
+ const $el = $(el);
154
+ // Skip external scripts (have src attribute)
155
+ if ($el.attr('src'))
156
+ return;
157
+ // Skip known injected scripts
158
+ const id = $el.attr('id');
159
+ if (id && INJECTED_SCRIPT_IDS.has(id))
160
+ return;
161
+ const source = $el.text();
162
+ if (!source.trim())
163
+ return;
164
+ scripts.push({
165
+ index: index++,
166
+ source,
167
+ startLine: estimateLineOffset(html, $.html(el)),
168
+ isModule: $el.attr('type') === 'module',
169
+ });
170
+ });
171
+ return scripts;
172
+ }
173
+ function parseSyntax(script) {
174
+ try {
175
+ acorn.parse(script.source, {
176
+ ecmaVersion: 'latest',
177
+ sourceType: script.isModule ? 'module' : 'script',
178
+ allowAwaitOutsideFunction: true,
179
+ });
180
+ return null;
181
+ }
182
+ catch (err) {
183
+ const e = err;
184
+ return {
185
+ type: 'syntax-error',
186
+ message: e.message ?? 'Unknown syntax error',
187
+ source: `inline-script-${script.index}`,
188
+ line: e.loc ? script.startLine + e.loc.line : undefined,
189
+ col: e.loc?.column,
190
+ };
191
+ }
192
+ }
193
+ // ---------------------------------------------------------------------------
194
+ // Layer 2: DOM Element ID Inventory
195
+ // ---------------------------------------------------------------------------
196
+ function buildIdInventory(html) {
197
+ const $ = cheerio.load(html);
198
+ const ids = new Set();
199
+ $('[id]').each((_, el) => {
200
+ const id = $(el).attr('id');
201
+ if (id)
202
+ ids.add(id);
203
+ });
204
+ return ids;
205
+ }
206
+ /**
207
+ * Patterns that CREATE element IDs inside script source text. Scripts that
208
+ * build DOM via `innerHTML = \`...<input id="btnSaveAll">...\`` or assign
209
+ * `el.id = 'foo'` produce IDs at runtime that `buildIdInventory` misses.
210
+ * Seeding those IDs as "known" prevents false-positive missing-element
211
+ * errors for dynamically constructed UI.
212
+ */
213
+ const ID_CREATE_PATTERNS = [
214
+ // id="foo" / id='foo' in string literals (innerHTML templates, etc.)
215
+ /\bid\s*=\s*["']([a-zA-Z_][\w-]*)["']/g,
216
+ // el.id = 'foo' / obj.id = "foo"
217
+ /\.id\s*=\s*["']([a-zA-Z_][\w-]*)["']/g,
218
+ ];
219
+ function collectDynamicIds(scripts) {
220
+ const ids = new Set();
221
+ for (const script of scripts) {
222
+ for (const pattern of ID_CREATE_PATTERNS) {
223
+ pattern.lastIndex = 0;
224
+ let match;
225
+ while ((match = pattern.exec(script.source)) !== null) {
226
+ ids.add(match[1]);
227
+ }
228
+ }
229
+ }
230
+ return ids;
231
+ }
232
+ /** Patterns that reference element IDs in JS code. */
233
+ const ID_REF_PATTERNS = [
234
+ /getElementById\(\s*['"]([^'"]+)['"]\s*\)/g,
235
+ /querySelector(?:All)?\(\s*['"]#([^'"]+)['"]\s*\)/g,
236
+ /\$\(\s*['"]#([^'"]+)['"]\s*\)/g,
237
+ ];
238
+ function checkIdReferences(scripts, ids) {
239
+ const errors = [];
240
+ for (const script of scripts) {
241
+ for (const pattern of ID_REF_PATTERNS) {
242
+ pattern.lastIndex = 0;
243
+ let match;
244
+ while ((match = pattern.exec(script.source)) !== null) {
245
+ const refId = match[1];
246
+ if (!ids.has(refId)) {
247
+ errors.push({
248
+ type: 'missing-element',
249
+ message: `Script references element '#${refId}' which does not exist in the page`,
250
+ source: `inline-script-${script.index}`,
251
+ });
252
+ }
253
+ }
254
+ }
255
+ }
256
+ return errors;
257
+ }
258
+ // ---------------------------------------------------------------------------
259
+ // Layer 3: SynthOS API Pattern Checks
260
+ // ---------------------------------------------------------------------------
261
+ const SYNTHOS_CALL_PATTERN = /synthos(?:\.[\w]+)+/g;
262
+ function checkSynthosApi(scripts) {
263
+ const errors = [];
264
+ const seen = new Set();
265
+ for (const script of scripts) {
266
+ SYNTHOS_CALL_PATTERN.lastIndex = 0;
267
+ let match;
268
+ while ((match = SYNTHOS_CALL_PATTERN.exec(script.source)) !== null) {
269
+ const call = match[0];
270
+ // Deduplicate within a single validation run
271
+ if (seen.has(call))
272
+ continue;
273
+ if (!KNOWN_SYNTHOS_METHODS.has(call)) {
274
+ seen.add(call);
275
+ errors.push({
276
+ type: 'unknown-api',
277
+ message: `Unknown SynthOS API call: ${call}`,
278
+ source: `inline-script-${script.index}`,
279
+ });
280
+ }
281
+ }
282
+ }
283
+ return errors;
284
+ }
285
+ // ---------------------------------------------------------------------------
286
+ // Public API
287
+ // ---------------------------------------------------------------------------
288
+ function validatePage(html) {
289
+ const start = Date.now();
290
+ const errors = [];
291
+ // Layer 1: Extract and parse scripts
292
+ const scripts = extractScripts(html);
293
+ for (const script of scripts) {
294
+ const err = parseSyntax(script);
295
+ if (err)
296
+ errors.push(err);
297
+ }
298
+ // Layer 2: DOM ID reference checks (only if no syntax errors)
299
+ if (errors.length === 0) {
300
+ const ids = buildIdInventory(html);
301
+ const dynamicIds = collectDynamicIds(scripts);
302
+ for (const id of dynamicIds)
303
+ ids.add(id);
304
+ errors.push(...checkIdReferences(scripts, ids));
305
+ }
306
+ // Layer 3: SynthOS API pattern checks (always runs)
307
+ errors.push(...checkSynthosApi(scripts));
308
+ return {
309
+ valid: errors.length === 0,
310
+ errors,
311
+ durationMs: Date.now() - start,
312
+ };
313
+ }
314
+ exports.validatePage = validatePage;
315
+ //# sourceMappingURL=pageValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pageValidator.js","sourceRoot":"","sources":["../../src/service/pageValidator.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/service/server.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAC,WAAW,EAAC,MAAM,SAAS,CAAC;AAG7C,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAQxC,OAAO,EAAmC,UAAU,EAAE,MAAM,eAAe,CAAC;AAE5E,wBAAgB,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,GAAE,UAA8B,GAAG,WAAW,CA4DrG"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/service/server.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAC,WAAW,EAAC,MAAM,SAAS,CAAC;AAG7C,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AASxC,OAAO,EAAmC,UAAU,EAAE,MAAM,eAAe,CAAC;AAE5E,wBAAgB,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,GAAE,UAA8B,GAAG,WAAW,CA+DrG"}
@@ -9,6 +9,7 @@ const usePageRoutes_1 = require("./usePageRoutes");
9
9
  const useApiRoutes_1 = require("./useApiRoutes");
10
10
  const useDataRoutes_1 = require("./useDataRoutes");
11
11
  const useFileRoutes_1 = require("./useFileRoutes");
12
+ const useExtractRoutes_1 = require("./useExtractRoutes");
12
13
  const useSharedDataRoutes_1 = require("./useSharedDataRoutes");
13
14
  const useSharedFileRoutes_1 = require("./useSharedFileRoutes");
14
15
  const useConnectorRoutes_1 = require("./useConnectorRoutes");
@@ -57,6 +58,9 @@ function server(config, customizer = customizer_1.customizer) {
57
58
  // File routes
58
59
  if (customizer.isEnabled('files'))
59
60
  (0, useFileRoutes_1.useFileRoutes)(config, app);
61
+ // Extract routes — schema-typed file extraction via active chat model
62
+ if (customizer.isEnabled('extract'))
63
+ (0, useExtractRoutes_1.useExtractRoutes)(config, app);
60
64
  // Shared data routes
61
65
  if (customizer.isEnabled('shared-data'))
62
66
  (0, useSharedDataRoutes_1.useSharedDataRoutes)(config, app);
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/service/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/service/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import { SynthOSConfig } from '../init';
2
+ /**
3
+ * Schema sidecar IO + additive-merge logic. Used by both shared-table and
4
+ * per-page-table routes — the only difference is the parent folder where the
5
+ * `<table>.schema.json` file lives.
6
+ *
7
+ * Spec: docs/specs/shared-tables-schema-sidecar.md
8
+ */
9
+ export interface SchemaWrapper {
10
+ version: number;
11
+ schema: Record<string, unknown>;
12
+ createdAt: string;
13
+ updatedAt: string;
14
+ definedBy?: string;
15
+ }
16
+ export type MergeMode = 'additive' | 'replace';
17
+ export interface MergeConflict {
18
+ field: string;
19
+ existing: unknown;
20
+ incoming: unknown;
21
+ }
22
+ /** Sidecar file path: `<parent>/<table>.schema.json`. */
23
+ export declare function schemaFile(parent: string, table: string): string;
24
+ /** Load the wrapper. Returns undefined if missing or unparsable. */
25
+ export declare function loadSchema(config: SynthOSConfig, parent: string, table: string): Promise<SchemaWrapper | undefined>;
26
+ /** Persist a wrapper to disk. */
27
+ export declare function saveSchema(config: SynthOSConfig, parent: string, table: string, wrapper: SchemaWrapper): Promise<void>;
28
+ /** Delete the schema sidecar. No-op if it doesn't exist. */
29
+ export declare function deleteSchema(config: SynthOSConfig, parent: string, table: string): Promise<void>;
30
+ /**
31
+ * Apply `incoming` against `existing` per `mode`:
32
+ * - 'replace' → drop existing entirely; incoming wins.
33
+ * - 'additive' → union of `properties` (existing wins on overlap if types match;
34
+ * conflicting types reported via `conflicts`); union of `required`.
35
+ *
36
+ * Returns the merged schema and any conflicts. On conflict, callers should
37
+ * surface them as a 409 and NOT persist the result.
38
+ */
39
+ export declare function mergeSchema(existing: Record<string, unknown> | undefined, incoming: Record<string, unknown>, mode: MergeMode): {
40
+ merged: Record<string, unknown>;
41
+ conflicts: MergeConflict[];
42
+ };
43
+ /**
44
+ * Validate the structural shape of an incoming JSON Schema. Strict-mode
45
+ * validation against the meta-schema is out of scope; we only check that the
46
+ * payload is a plain object so we don't persist garbage.
47
+ */
48
+ export declare function isValidSchemaPayload(s: unknown): s is Record<string, unknown>;
49
+ /**
50
+ * Build a SchemaWrapper from a plain JSON Schema, using `now` for both
51
+ * timestamps when no existing wrapper is being preserved.
52
+ */
53
+ export declare function newSchemaWrapper(schema: Record<string, unknown>, now: string, definedBy?: string): SchemaWrapper;
54
+ /**
55
+ * Update an existing wrapper, preserving createdAt and bumping updatedAt.
56
+ */
57
+ export declare function updateSchemaWrapper(existing: SchemaWrapper, schema: Record<string, unknown>, now: string, definedBy?: string): SchemaWrapper;
58
+ /**
59
+ * Enumerate tables in a namespace folder. A "table" is either:
60
+ * - a subfolder containing record files, OR
61
+ * - a `<name>.schema.json` sidecar (table may be schemaless until first save).
62
+ *
63
+ * Returns one entry per unique table name, with hasSchema + recordCount.
64
+ *
65
+ * `reserved` filters out names that occupy the namespace for non-table use
66
+ * (e.g. `files`, the per-page uploads folder).
67
+ */
68
+ export declare function listTables(config: SynthOSConfig, parent: string, reserved?: ReadonlySet<string>): Promise<Array<{
69
+ name: string;
70
+ hasSchema: boolean;
71
+ recordCount: number;
72
+ }>>;
73
+ //# sourceMappingURL=sharedTableSchema.d.ts.map