synthos 0.8.0 → 0.10.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 (368) hide show
  1. package/README.md +1 -1
  2. package/default-pages/application/page.html +42 -0
  3. package/default-pages/application/page.json +10 -0
  4. package/default-pages/elevenlabs_effects_studio/page.html +1363 -0
  5. package/default-pages/elevenlabs_effects_studio/page.json +11 -0
  6. package/default-pages/elevenlabs_voice_studio/page.html +801 -0
  7. package/default-pages/elevenlabs_voice_studio/page.json +11 -0
  8. package/default-pages/{json_tools.html → json_tools/page.html} +13 -11
  9. package/default-pages/json_tools/page.json +10 -0
  10. package/default-pages/my_notes/notes/a1b2c3d4-e5f6-7890-abcd-ef1234567890.json +5 -0
  11. package/default-pages/my_notes/page.html +132 -0
  12. package/default-pages/{my_notes.json → my_notes/page.json} +2 -2
  13. package/default-pages/neon_asteroids/files/Ambient_Space.mp3 +0 -0
  14. package/default-pages/neon_asteroids/files/Ambient_Space2.mp3 +0 -0
  15. package/default-pages/neon_asteroids/files/Ambient_Space3.mp3 +0 -0
  16. package/default-pages/neon_asteroids/files/Asteroid_Explosion.mp3 +0 -0
  17. package/default-pages/neon_asteroids/files/Hyperspace_Jump.mp3 +0 -0
  18. package/default-pages/neon_asteroids/files/Laser_Fire.mp3 +0 -0
  19. package/default-pages/neon_asteroids/files/Menu_Navigate.mp3 +0 -0
  20. package/default-pages/neon_asteroids/files/Power_Up_Collect.mp3 +0 -0
  21. package/default-pages/neon_asteroids/files/Saucer_Alert.mp3 +0 -0
  22. package/default-pages/neon_asteroids/files/Ship_Thrust.mp3 +0 -0
  23. package/default-pages/neon_asteroids/files/effects.json +74 -0
  24. package/default-pages/neon_asteroids/page.html +1803 -0
  25. package/default-pages/{neon_asteroids.json → neon_asteroids/page.json} +3 -3
  26. package/default-pages/{oregon_trail.html → oregon_trail/page.html} +16 -30
  27. package/default-pages/{oregon_trail.json → oregon_trail/page.json} +2 -2
  28. package/default-pages/retro_game_starter/page.html +1308 -0
  29. package/default-pages/retro_game_starter/page.json +12 -0
  30. package/default-pages/{sidebar_page.html → sidebar_page/page.html} +12 -10
  31. package/default-pages/sidebar_page/page.json +10 -0
  32. package/default-pages/{solar_explorer.html → solar_explorer/page.html} +15 -12
  33. package/default-pages/{solar_explorer.json → solar_explorer/page.json} +2 -2
  34. package/default-pages/{solar_tutorial.html → solar_tutorial/page.html} +12 -10
  35. package/default-pages/solar_tutorial/page.json +10 -0
  36. package/default-pages/{two-panel_page.html → two-panel_page/page.html} +13 -11
  37. package/default-pages/two-panel_page/page.json +10 -0
  38. package/default-pages/{us_map.html → us_map/page.html} +193 -192
  39. package/default-pages/{us_map.json → us_map/page.json} +12 -12
  40. package/default-pages/{us_map_1850.html → us_map_1850/page.html} +326 -325
  41. package/default-pages/{us_map_1850.json → us_map_1850/page.json} +12 -12
  42. package/default-pages/{western_cities_1850.html → western_cities_1850/page.html} +527 -526
  43. package/default-pages/{western_cities_1850.json → western_cities_1850/page.json} +12 -12
  44. package/default-themes/aurora-dawn.json +19 -0
  45. package/default-themes/aurora-dawn.v3.css +198 -0
  46. package/default-themes/aurora-dusk.json +19 -0
  47. package/default-themes/aurora-dusk.v3.css +200 -0
  48. package/default-themes/cosmos-dawn.json +19 -0
  49. package/default-themes/cosmos-dawn.v3.css +198 -0
  50. package/default-themes/cosmos-dusk.json +19 -0
  51. package/default-themes/cosmos-dusk.v3.css +200 -0
  52. package/default-themes/high-contrast-dark.json +19 -0
  53. package/default-themes/high-contrast-dark.v3.css +200 -0
  54. package/default-themes/high-contrast-light.json +19 -0
  55. package/default-themes/high-contrast-light.v3.css +198 -0
  56. package/default-themes/nebula-dawn.v2.css +110 -0
  57. package/default-themes/nebula-dawn.v3.css +199 -0
  58. package/default-themes/nebula-dusk.v2.css +104 -0
  59. package/default-themes/nebula-dusk.v3.css +201 -0
  60. package/default-themes/solar-flare-dawn.json +19 -0
  61. package/default-themes/solar-flare-dawn.v3.css +198 -0
  62. package/default-themes/solar-flare-dusk.json +19 -0
  63. package/default-themes/solar-flare-dusk.v3.css +200 -0
  64. package/dist/agents/index.d.ts +1 -1
  65. package/dist/agents/index.d.ts.map +1 -1
  66. package/dist/agents/index.js +2 -1
  67. package/dist/agents/index.js.map +1 -1
  68. package/dist/agents/openclaw/gatewayManager.d.ts +4 -0
  69. package/dist/agents/openclaw/gatewayManager.d.ts.map +1 -1
  70. package/dist/agents/openclaw/gatewayManager.js +27 -11
  71. package/dist/agents/openclaw/gatewayManager.js.map +1 -1
  72. package/dist/agents/openclaw/openclawProvider.d.ts.map +1 -1
  73. package/dist/agents/openclaw/openclawProvider.js +2 -4
  74. package/dist/agents/openclaw/openclawProvider.js.map +1 -1
  75. package/dist/agents/openclaw/sshTunnelManager.d.ts +2 -0
  76. package/dist/agents/openclaw/sshTunnelManager.d.ts.map +1 -1
  77. package/dist/agents/openclaw/sshTunnelManager.js +31 -12
  78. package/dist/agents/openclaw/sshTunnelManager.js.map +1 -1
  79. package/dist/builders/anthropic.d.ts +31 -0
  80. package/dist/builders/anthropic.d.ts.map +1 -0
  81. package/dist/builders/anthropic.js +227 -0
  82. package/dist/builders/anthropic.js.map +1 -0
  83. package/dist/builders/fireworksai.d.ts +9 -0
  84. package/dist/builders/fireworksai.d.ts.map +1 -0
  85. package/dist/builders/fireworksai.js +57 -0
  86. package/dist/builders/fireworksai.js.map +1 -0
  87. package/dist/builders/index.d.ts +13 -0
  88. package/dist/builders/index.d.ts.map +1 -0
  89. package/dist/builders/index.js +31 -0
  90. package/dist/builders/index.js.map +1 -0
  91. package/dist/builders/openai.d.ts +8 -0
  92. package/dist/builders/openai.d.ts.map +1 -0
  93. package/dist/builders/openai.js +87 -0
  94. package/dist/builders/openai.js.map +1 -0
  95. package/dist/builders/types.d.ts +54 -0
  96. package/dist/builders/types.d.ts.map +1 -0
  97. package/dist/builders/types.js +211 -0
  98. package/dist/builders/types.js.map +1 -0
  99. package/dist/connectors/index.d.ts +1 -1
  100. package/dist/connectors/index.d.ts.map +1 -1
  101. package/dist/connectors/index.js +3 -2
  102. package/dist/connectors/index.js.map +1 -1
  103. package/dist/connectors/registry.d.ts +2 -1
  104. package/dist/connectors/registry.d.ts.map +1 -1
  105. package/dist/connectors/registry.js +31 -8
  106. package/dist/connectors/registry.js.map +1 -1
  107. package/dist/customizer/Customizer.d.ts +62 -0
  108. package/dist/customizer/Customizer.d.ts.map +1 -0
  109. package/dist/customizer/Customizer.js +134 -0
  110. package/dist/customizer/Customizer.js.map +1 -0
  111. package/dist/customizer/index.d.ts +4 -0
  112. package/dist/customizer/index.d.ts.map +1 -0
  113. package/dist/customizer/index.js +9 -0
  114. package/dist/customizer/index.js.map +1 -0
  115. package/dist/files.d.ts +16 -0
  116. package/dist/files.d.ts.map +1 -1
  117. package/dist/files.js +60 -1
  118. package/dist/files.js.map +1 -1
  119. package/dist/index.d.ts +2 -0
  120. package/dist/index.d.ts.map +1 -1
  121. package/dist/index.js +2 -0
  122. package/dist/index.js.map +1 -1
  123. package/dist/init.d.ts +12 -6
  124. package/dist/init.d.ts.map +1 -1
  125. package/dist/init.js +150 -133
  126. package/dist/init.js.map +1 -1
  127. package/dist/migrations.d.ts.map +1 -1
  128. package/dist/migrations.js +23 -10
  129. package/dist/migrations.js.map +1 -1
  130. package/dist/models/anthropic.d.ts +4 -2
  131. package/dist/models/anthropic.d.ts.map +1 -1
  132. package/dist/models/anthropic.js +33 -6
  133. package/dist/models/anthropic.js.map +1 -1
  134. package/dist/models/fireworksai.d.ts.map +1 -1
  135. package/dist/models/fireworksai.js +9 -1
  136. package/dist/models/fireworksai.js.map +1 -1
  137. package/dist/models/index.d.ts +1 -1
  138. package/dist/models/index.d.ts.map +1 -1
  139. package/dist/models/index.js +2 -1
  140. package/dist/models/index.js.map +1 -1
  141. package/dist/models/openai.d.ts +1 -1
  142. package/dist/models/openai.d.ts.map +1 -1
  143. package/dist/models/openai.js +24 -3
  144. package/dist/models/openai.js.map +1 -1
  145. package/dist/models/types.d.ts +20 -1
  146. package/dist/models/types.d.ts.map +1 -1
  147. package/dist/models/types.js +6 -1
  148. package/dist/models/types.js.map +1 -1
  149. package/dist/pages.d.ts +34 -10
  150. package/dist/pages.d.ts.map +1 -1
  151. package/dist/pages.js +229 -79
  152. package/dist/pages.js.map +1 -1
  153. package/dist/service/createCompletePrompt.d.ts +2 -1
  154. package/dist/service/createCompletePrompt.d.ts.map +1 -1
  155. package/dist/service/createCompletePrompt.js +2 -2
  156. package/dist/service/createCompletePrompt.js.map +1 -1
  157. package/dist/service/requiresSettings.d.ts +2 -1
  158. package/dist/service/requiresSettings.d.ts.map +1 -1
  159. package/dist/service/requiresSettings.js +3 -3
  160. package/dist/service/requiresSettings.js.map +1 -1
  161. package/dist/service/server.d.ts +2 -1
  162. package/dist/service/server.d.ts.map +1 -1
  163. package/dist/service/server.js +37 -8
  164. package/dist/service/server.js.map +1 -1
  165. package/dist/service/transformPage.d.ts +47 -20
  166. package/dist/service/transformPage.d.ts.map +1 -1
  167. package/dist/service/transformPage.js +514 -293
  168. package/dist/service/transformPage.js.map +1 -1
  169. package/dist/service/useAgentRoutes.d.ts +2 -1
  170. package/dist/service/useAgentRoutes.d.ts.map +1 -1
  171. package/dist/service/useAgentRoutes.js +17 -14
  172. package/dist/service/useAgentRoutes.js.map +1 -1
  173. package/dist/service/useApiRoutes.d.ts +2 -1
  174. package/dist/service/useApiRoutes.d.ts.map +1 -1
  175. package/dist/service/useApiRoutes.js +287 -172
  176. package/dist/service/useApiRoutes.js.map +1 -1
  177. package/dist/service/useConnectorRoutes.js +17 -17
  178. package/dist/service/useConnectorRoutes.js.map +1 -1
  179. package/dist/service/useDataRoutes.d.ts.map +1 -1
  180. package/dist/service/useDataRoutes.js +13 -10
  181. package/dist/service/useDataRoutes.js.map +1 -1
  182. package/dist/service/useFileRoutes.d.ts +4 -0
  183. package/dist/service/useFileRoutes.d.ts.map +1 -0
  184. package/dist/service/useFileRoutes.js +122 -0
  185. package/dist/service/useFileRoutes.js.map +1 -0
  186. package/dist/service/usePageRoutes.d.ts +2 -1
  187. package/dist/service/usePageRoutes.d.ts.map +1 -1
  188. package/dist/service/usePageRoutes.js +671 -74
  189. package/dist/service/usePageRoutes.js.map +1 -1
  190. package/dist/service/useSharedDataRoutes.d.ts +4 -0
  191. package/dist/service/useSharedDataRoutes.d.ts.map +1 -0
  192. package/dist/service/useSharedDataRoutes.js +107 -0
  193. package/dist/service/useSharedDataRoutes.js.map +1 -0
  194. package/dist/service/useSharedFileRoutes.d.ts +4 -0
  195. package/dist/service/useSharedFileRoutes.d.ts.map +1 -0
  196. package/dist/service/useSharedFileRoutes.js +121 -0
  197. package/dist/service/useSharedFileRoutes.js.map +1 -0
  198. package/dist/settings.d.ts +5 -3
  199. package/dist/settings.d.ts.map +1 -1
  200. package/dist/settings.js +12 -10
  201. package/dist/settings.js.map +1 -1
  202. package/dist/storage/FsStorageProvider.d.ts +25 -0
  203. package/dist/storage/FsStorageProvider.d.ts.map +1 -0
  204. package/dist/storage/FsStorageProvider.js +103 -0
  205. package/dist/storage/FsStorageProvider.js.map +1 -0
  206. package/dist/storage/StorageProvider.d.ts +31 -0
  207. package/dist/storage/StorageProvider.d.ts.map +1 -0
  208. package/dist/storage/StorageProvider.js +3 -0
  209. package/dist/storage/StorageProvider.js.map +1 -0
  210. package/dist/storage/index.d.ts +3 -0
  211. package/dist/storage/index.d.ts.map +1 -0
  212. package/dist/storage/index.js +6 -0
  213. package/dist/storage/index.js.map +1 -0
  214. package/dist/synthos-cli.d.ts.map +1 -1
  215. package/dist/synthos-cli.js +4 -3
  216. package/dist/synthos-cli.js.map +1 -1
  217. package/dist/themes.d.ts +1 -0
  218. package/dist/themes.d.ts.map +1 -1
  219. package/dist/themes.js +65 -28
  220. package/dist/themes.js.map +1 -1
  221. package/migration-rules/v1-to-v2.md +193 -0
  222. package/migration-rules/v2-to-v3.md +481 -0
  223. package/package.json +11 -10
  224. package/required-pages/builder/page.html +43 -0
  225. package/required-pages/builder/page.json +10 -0
  226. package/required-pages/{pages.html → pages/page.html} +238 -233
  227. package/required-pages/pages/page.json +10 -0
  228. package/required-pages/{settings.html → settings/page.html} +389 -275
  229. package/required-pages/settings/page.json +10 -0
  230. package/required-pages/synthos_apis/page.html +846 -0
  231. package/required-pages/synthos_apis/page.json +10 -0
  232. package/required-pages/{synthos_scripts.html → synthos_scripts/page.html} +13 -11
  233. package/required-pages/synthos_scripts/page.json +10 -0
  234. package/src/agents/index.ts +1 -1
  235. package/src/agents/openclaw/gatewayManager.ts +22 -11
  236. package/src/agents/openclaw/openclawProvider.ts +2 -4
  237. package/src/agents/openclaw/sshTunnelManager.ts +19 -11
  238. package/src/builders/anthropic.ts +283 -0
  239. package/src/builders/fireworksai.ts +59 -0
  240. package/src/builders/index.ts +33 -0
  241. package/src/builders/openai.ts +89 -0
  242. package/src/builders/types.ts +261 -0
  243. package/src/connectors/index.ts +1 -1
  244. package/src/connectors/registry.ts +28 -8
  245. package/src/customizer/Customizer.ts +163 -0
  246. package/src/customizer/index.ts +5 -0
  247. package/src/files.ts +57 -0
  248. package/src/index.ts +3 -1
  249. package/src/init.ts +195 -145
  250. package/src/migrations.ts +30 -10
  251. package/src/models/anthropic.ts +40 -10
  252. package/src/models/fireworksai.ts +9 -2
  253. package/src/models/index.ts +1 -1
  254. package/src/models/openai.ts +26 -6
  255. package/src/models/types.ts +31 -1
  256. package/src/pages.ts +230 -77
  257. package/src/service/createCompletePrompt.ts +3 -2
  258. package/src/service/requiresSettings.ts +4 -3
  259. package/src/service/server.ts +36 -9
  260. package/src/service/transformPage.ts +557 -326
  261. package/src/service/useAgentRoutes.ts +19 -14
  262. package/src/service/useApiRoutes.ts +208 -84
  263. package/src/service/useConnectorRoutes.ts +18 -18
  264. package/src/service/useDataRoutes.ts +13 -10
  265. package/src/service/useFileRoutes.ts +128 -0
  266. package/src/service/usePageRoutes.ts +730 -81
  267. package/src/service/useSharedDataRoutes.ts +109 -0
  268. package/src/service/useSharedFileRoutes.ts +127 -0
  269. package/src/settings.ts +14 -10
  270. package/src/storage/FsStorageProvider.ts +87 -0
  271. package/src/storage/StorageProvider.ts +34 -0
  272. package/src/storage/index.ts +2 -0
  273. package/src/synthos-cli.ts +4 -3
  274. package/src/themes.ts +64 -27
  275. package/static-files/favicon.svg +12 -0
  276. package/static-files/fluentlm-instructions.llmd +868 -0
  277. package/static-files/fluentlm-instructions.md +1595 -0
  278. package/static-files/fluentlm.css +4844 -0
  279. package/static-files/fluentlm.js +3602 -0
  280. package/static-files/fluentlm.min.css +1 -0
  281. package/static-files/fluentlm.min.js +1 -0
  282. package/{page-scripts/helpers-v2.js → static-files/helpers.v3.js} +82 -0
  283. package/static-files/page.v3.js +1290 -0
  284. package/static-files/recommended-frameworks.llmd +81 -0
  285. package/static-files/recommended-frameworks.md +137 -0
  286. package/static-files/retro-game.js +877 -0
  287. package/static-files/shell.css +797 -0
  288. package/static-files/theme-dark.css +169 -0
  289. package/static-files/theme-light.css +169 -0
  290. package/tests/builders.spec.ts +139 -0
  291. package/tests/pages.spec.ts +54 -84
  292. package/tests/transformPage.spec.ts +299 -360
  293. package/default-pages/application.html +0 -40
  294. package/default-pages/application.json +0 -1
  295. package/default-pages/json_tools.json +0 -1
  296. package/default-pages/my_notes.html +0 -33
  297. package/default-pages/neon_asteroids.html +0 -77
  298. package/default-pages/sidebar_page.json +0 -1
  299. package/default-pages/solar_tutorial.json +0 -1
  300. package/default-pages/two-panel_page.json +0 -1
  301. package/dist/service/useGatewayRoutes.d.ts +0 -4
  302. package/dist/service/useGatewayRoutes.d.ts.map +0 -1
  303. package/dist/service/useGatewayRoutes.js +0 -168
  304. package/dist/service/useGatewayRoutes.js.map +0 -1
  305. package/page-scripts/page-v2.js +0 -656
  306. package/required-pages/builder.html +0 -48
  307. package/required-pages/builder.json +0 -1
  308. package/required-pages/pages.json +0 -1
  309. package/required-pages/settings.json +0 -1
  310. package/required-pages/synthos_apis.html +0 -327
  311. package/required-pages/synthos_apis.json +0 -1
  312. package/required-pages/synthos_scripts.json +0 -1
  313. package/src/connectors/airtable/connector.json +0 -27
  314. package/src/connectors/alpha-vantage/connector.json +0 -26
  315. package/src/connectors/brave-search/connector.json +0 -26
  316. package/src/connectors/cloudinary/connector.json +0 -27
  317. package/src/connectors/deepl/connector.json +0 -28
  318. package/src/connectors/elevenlabs/connector.json +0 -30
  319. package/src/connectors/giphy/connector.json +0 -27
  320. package/src/connectors/github/connector.json +0 -29
  321. package/src/connectors/huggingface/connector.json +0 -27
  322. package/src/connectors/imgur/connector.json +0 -29
  323. package/src/connectors/instagram/connector.json +0 -43
  324. package/src/connectors/jira/connector.json +0 -28
  325. package/src/connectors/mapbox/connector.json +0 -26
  326. package/src/connectors/nasa/connector.json +0 -27
  327. package/src/connectors/newsapi/connector.json +0 -27
  328. package/src/connectors/notion/connector.json +0 -28
  329. package/src/connectors/open-exchange-rates/connector.json +0 -27
  330. package/src/connectors/openweathermap/connector.json +0 -26
  331. package/src/connectors/pexels/connector.json +0 -27
  332. package/src/connectors/resend/connector.json +0 -29
  333. package/src/connectors/rss2json/connector.json +0 -27
  334. package/src/connectors/sendgrid/connector.json +0 -27
  335. package/src/connectors/spoonacular/connector.json +0 -28
  336. package/src/connectors/stability-ai/connector.json +0 -27
  337. package/src/connectors/twilio/connector.json +0 -28
  338. package/src/connectors/unsplash/connector.json +0 -27
  339. package/src/connectors/wolfram-alpha/connector.json +0 -26
  340. package/src/connectors/youtube-data/connector.json +0 -30
  341. /package/{dist/connectors → service-connectors}/airtable/connector.json +0 -0
  342. /package/{dist/connectors → service-connectors}/alpha-vantage/connector.json +0 -0
  343. /package/{dist/connectors → service-connectors}/brave-search/connector.json +0 -0
  344. /package/{dist/connectors → service-connectors}/cloudinary/connector.json +0 -0
  345. /package/{dist/connectors → service-connectors}/deepl/connector.json +0 -0
  346. /package/{dist/connectors → service-connectors}/elevenlabs/connector.json +0 -0
  347. /package/{dist/connectors → service-connectors}/giphy/connector.json +0 -0
  348. /package/{dist/connectors → service-connectors}/github/connector.json +0 -0
  349. /package/{dist/connectors → service-connectors}/huggingface/connector.json +0 -0
  350. /package/{dist/connectors → service-connectors}/imgur/connector.json +0 -0
  351. /package/{dist/connectors → service-connectors}/instagram/connector.json +0 -0
  352. /package/{dist/connectors → service-connectors}/jira/connector.json +0 -0
  353. /package/{dist/connectors → service-connectors}/mapbox/connector.json +0 -0
  354. /package/{dist/connectors → service-connectors}/nasa/connector.json +0 -0
  355. /package/{dist/connectors → service-connectors}/newsapi/connector.json +0 -0
  356. /package/{dist/connectors → service-connectors}/notion/connector.json +0 -0
  357. /package/{dist/connectors → service-connectors}/open-exchange-rates/connector.json +0 -0
  358. /package/{dist/connectors → service-connectors}/openweathermap/connector.json +0 -0
  359. /package/{dist/connectors → service-connectors}/pexels/connector.json +0 -0
  360. /package/{dist/connectors → service-connectors}/resend/connector.json +0 -0
  361. /package/{dist/connectors → service-connectors}/rss2json/connector.json +0 -0
  362. /package/{dist/connectors → service-connectors}/sendgrid/connector.json +0 -0
  363. /package/{dist/connectors → service-connectors}/spoonacular/connector.json +0 -0
  364. /package/{dist/connectors → service-connectors}/stability-ai/connector.json +0 -0
  365. /package/{dist/connectors → service-connectors}/twilio/connector.json +0 -0
  366. /package/{dist/connectors → service-connectors}/unsplash/connector.json +0 -0
  367. /package/{dist/connectors → service-connectors}/wolfram-alpha/connector.json +0 -0
  368. /package/{dist/connectors → service-connectors}/youtube-data/connector.json +0 -0
@@ -0,0 +1,31 @@
1
+ /// <reference types="node" />
2
+ /**
3
+ * Abstraction over user-mutable storage (pages, settings, themes, data, uploads).
4
+ *
5
+ * All paths are absolute. Callers build paths with `path.join(config.pagesFolder, ...)`
6
+ * exactly as they do today — the provider simply executes the I/O against
7
+ * whatever backend it wraps (local filesystem, blob storage, etc.).
8
+ *
9
+ * Package/read-only content (required-pages, default-themes, static-files,
10
+ * service-connectors) stays on local filesystem and is NOT routed through
11
+ * this interface.
12
+ */
13
+ export interface StorageProvider {
14
+ checkIfExists(filePath: string): Promise<boolean>;
15
+ loadFile(filePath: string): Promise<string>;
16
+ saveFile(filePath: string, content: string): Promise<void>;
17
+ deleteFile(filePath: string): Promise<void>;
18
+ saveBuffer(filePath: string, data: Buffer): Promise<void>;
19
+ loadBuffer(filePath: string): Promise<Buffer>;
20
+ stat(filePath: string): Promise<{
21
+ size: number;
22
+ isFile: boolean;
23
+ }>;
24
+ createReadStream(filePath: string): NodeJS.ReadableStream;
25
+ listFiles(dirPath: string): Promise<string[]>;
26
+ listFolders(dirPath: string): Promise<string[]>;
27
+ ensureFolderExists(dirPath: string): Promise<void>;
28
+ deleteFolder(dirPath: string): Promise<void>;
29
+ copyFolderRecursive(srcPath: string, destPath: string): Promise<void>;
30
+ }
31
+ //# sourceMappingURL=StorageProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StorageProvider.d.ts","sourceRoot":"","sources":["../../src/storage/StorageProvider.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;AACH,MAAM,WAAW,eAAe;IAG5B,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAI5C,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACnE,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;IAI1D,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9C,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAChD,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzE"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=StorageProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StorageProvider.js","sourceRoot":"","sources":["../../src/storage/StorageProvider.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export { StorageProvider } from './StorageProvider';
2
+ export { FsStorageProvider } from './FsStorageProvider';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FsStorageProvider = void 0;
4
+ var FsStorageProvider_1 = require("./FsStorageProvider");
5
+ Object.defineProperty(exports, "FsStorageProvider", { enumerable: true, get: function () { return FsStorageProvider_1.FsStorageProvider; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":";;;AACA,yDAAwD;AAA/C,sHAAA,iBAAiB,OAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"synthos-cli.d.ts","sourceRoot":"","sources":["../src/synthos-cli.ts"],"names":[],"mappings":"AAOA,wBAAsB,GAAG,kBAwCxB"}
1
+ {"version":3,"file":"synthos-cli.d.ts","sourceRoot":"","sources":["../src/synthos-cli.ts"],"names":[],"mappings":"AAQA,wBAAsB,GAAG,kBAwCxB"}
@@ -8,6 +8,7 @@ const yargs_1 = __importDefault(require("yargs"));
8
8
  const helpers_1 = require("yargs/helpers");
9
9
  const service_1 = require("./service");
10
10
  const init_1 = require("./init");
11
+ const customizer_1 = require("./customizer");
11
12
  const dynamicImport = new Function('specifier', `return import(specifier)`);
12
13
  async function run() {
13
14
  await (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
@@ -20,7 +21,7 @@ async function run() {
20
21
  default: 4242
21
22
  })
22
23
  .option('pages', {
23
- describe: `Include default pages when initializing a new .synthos folder.`,
24
+ describe: `Include default pages when initializing a new local folder.`,
24
25
  type: 'boolean',
25
26
  default: true
26
27
  })
@@ -36,9 +37,9 @@ async function run() {
36
37
  })
37
38
  .demandOption([]);
38
39
  }, async (args) => {
39
- const config = (0, init_1.createConfig)('.synthos', { debug: args.debug, debugPageUpdates: args.debugPageUpdates });
40
+ const config = await (0, init_1.createConfig)(customizer_1.customizer.localFolder, { debug: args.debug, debugPageUpdates: args.debugPageUpdates }, customizer_1.customizer);
40
41
  await (0, init_1.init)(config, args.pages);
41
- await (0, service_1.server)(config).listen(args.port, async () => {
42
+ await (0, service_1.server)(config, customizer_1.customizer).listen(args.port, async () => {
42
43
  console.log(`SynthOS server is running on http://localhost:${args.port}`);
43
44
  // Open using default browser
44
45
  const open = await dynamicImport('open');
@@ -1 +1 @@
1
- {"version":3,"file":"synthos-cli.js","sourceRoot":"","sources":["../src/synthos-cli.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,2CAAwC;AACxC,uCAAmC;AACnC,iCAA4C;AAE5C,MAAM,aAAa,GAAG,IAAI,QAAQ,CAAC,WAAW,EAAE,0BAA0B,CAAC,CAAC;AAErE,KAAK,UAAU,GAAG;IACrB,MAAM,IAAA,eAAK,EAAC,IAAA,iBAAO,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SAC7B,UAAU,CAAC,SAAS,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,4BAA4B,EAAE,CAAC,KAAK,EAAE,EAAE;QACtD,OAAO,KAAK;aACP,MAAM,CAAC,MAAM,EAAE;YACZ,QAAQ,EAAE,yBAAyB;YACnC,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,IAAI;SAChB,CAAC;aACD,MAAM,CAAC,OAAO,EAAE;YACb,QAAQ,EAAE,gEAAgE;YAC1E,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,IAAI;SAChB,CAAC;aACD,MAAM,CAAC,OAAO,EAAE;YACb,QAAQ,EAAE,gEAAgE;YAC1E,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,KAAK;SACjB,CAAC;aACD,MAAM,CAAC,oBAAoB,EAAE;YAC1B,QAAQ,EAAE,iEAAiE;YAC3E,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,KAAK;SACjB,CAAC;aACD,YAAY,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACd,MAAM,MAAM,GAAG,IAAA,mBAAY,EAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACxG,MAAM,IAAA,WAAI,EAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,IAAA,gBAAM,EAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;YAC9C,OAAO,CAAC,GAAG,CAAC,iDAAiD,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAE1E,6BAA6B;YAC7B,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;YACzC,IAAI,CAAC,OAAO,CAAC,oBAAoB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;SACD,IAAI,EAAE;SACN,aAAa,EAAE;SACf,UAAU,EAAE,CAAC;AACtB,CAAC;AAxCD,kBAwCC"}
1
+ {"version":3,"file":"synthos-cli.js","sourceRoot":"","sources":["../src/synthos-cli.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,2CAAwC;AACxC,uCAAmC;AACnC,iCAA4C;AAC5C,6CAA0C;AAE1C,MAAM,aAAa,GAAG,IAAI,QAAQ,CAAC,WAAW,EAAE,0BAA0B,CAAC,CAAC;AAErE,KAAK,UAAU,GAAG;IACrB,MAAM,IAAA,eAAK,EAAC,IAAA,iBAAO,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SAC7B,UAAU,CAAC,SAAS,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,4BAA4B,EAAE,CAAC,KAAK,EAAE,EAAE;QACtD,OAAO,KAAK;aACP,MAAM,CAAC,MAAM,EAAE;YACZ,QAAQ,EAAE,yBAAyB;YACnC,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,IAAI;SAChB,CAAC;aACD,MAAM,CAAC,OAAO,EAAE;YACb,QAAQ,EAAE,6DAA6D;YACvE,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,IAAI;SAChB,CAAC;aACD,MAAM,CAAC,OAAO,EAAE;YACb,QAAQ,EAAE,gEAAgE;YAC1E,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,KAAK;SACjB,CAAC;aACD,MAAM,CAAC,oBAAoB,EAAE;YAC1B,QAAQ,EAAE,iEAAiE;YAC3E,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,KAAK;SACjB,CAAC;aACD,YAAY,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACd,MAAM,MAAM,GAAG,MAAM,IAAA,mBAAY,EAAC,uBAAU,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE,uBAAU,CAAC,CAAC;QACtI,MAAM,IAAA,WAAI,EAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,IAAA,gBAAM,EAAC,MAAM,EAAE,uBAAU,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;YAC1D,OAAO,CAAC,GAAG,CAAC,iDAAiD,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAE1E,6BAA6B;YAC7B,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;YACzC,IAAI,CAAC,OAAO,CAAC,oBAAoB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;SACD,IAAI,EAAE;SACN,aAAa,EAAE;SACf,UAAU,EAAE,CAAC;AACtB,CAAC;AAxCD,kBAwCC"}
package/dist/themes.d.ts CHANGED
@@ -13,6 +13,7 @@ export declare function parseThemeFilename(filename: string): {
13
13
  name: string;
14
14
  version: number;
15
15
  } | undefined;
16
+ export declare function loadThemeVersion(name: string, config: SynthOSConfig): Promise<number>;
16
17
  export declare function loadThemeInfo(name: string, config: SynthOSConfig): Promise<ThemeInfo | undefined>;
17
18
  export declare function loadTheme(name: string, config: SynthOSConfig): Promise<string | undefined>;
18
19
  export declare function listThemes(config: SynthOSConfig): Promise<string[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"themes.d.ts","sourceRoot":"","sources":["../src/themes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,eAAO,MAAM,aAAa,IAAI,CAAC;AAE/B,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAMD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAOlG;AAqBD,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAevG;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAahG;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAuBzE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAkChF"}
1
+ {"version":3,"file":"themes.d.ts","sourceRoot":"","sources":["../src/themes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,eAAO,MAAM,aAAa,IAAI,CAAC;AAE/B,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAMD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAOlG;AAwCD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ3F;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAkBvG;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAkBhG;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAsBzE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmChF"}
package/dist/themes.js CHANGED
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getOutdatedThemes = exports.listThemes = exports.loadTheme = exports.loadThemeInfo = exports.parseThemeFilename = exports.THEME_VERSION = void 0;
6
+ exports.getOutdatedThemes = exports.listThemes = exports.loadTheme = exports.loadThemeInfo = exports.loadThemeVersion = exports.parseThemeFilename = exports.THEME_VERSION = void 0;
7
7
  const path_1 = __importDefault(require("path"));
8
8
  const files_1 = require("./files");
9
9
  exports.THEME_VERSION = 2;
@@ -26,10 +26,29 @@ function parseThemeFilename(filename) {
26
26
  }
27
27
  exports.parseThemeFilename = parseThemeFilename;
28
28
  /**
29
- * Find the CSS file for a theme by name in a folder.
29
+ * Find the CSS file for a theme by name in a user folder (via storageProvider).
30
30
  * Prefers the highest-versioned file (e.g. name.v2.css over name.css).
31
31
  */
32
- async function findThemeCssFile(folder, name) {
32
+ async function findUserThemeCssFile(config, folder, name) {
33
+ const sp = config.storageProvider;
34
+ if (!await sp.checkIfExists(folder))
35
+ return undefined;
36
+ const files = await sp.listFiles(folder);
37
+ let best;
38
+ for (const f of files) {
39
+ const parsed = parseThemeFilename(f);
40
+ if (parsed && parsed.name === name) {
41
+ if (!best || parsed.version > best.version) {
42
+ best = { path: path_1.default.join(folder, f), version: parsed.version };
43
+ }
44
+ }
45
+ }
46
+ return best;
47
+ }
48
+ /**
49
+ * Find the CSS file for a theme by name in a local-fs folder (package defaults).
50
+ */
51
+ async function findDefaultThemeCssFile(folder, name) {
33
52
  if (!await (0, files_1.checkIfExists)(folder))
34
53
  return undefined;
35
54
  const files = await (0, files_1.listFiles)(folder);
@@ -44,15 +63,29 @@ async function findThemeCssFile(folder, name) {
44
63
  }
45
64
  return best;
46
65
  }
66
+ async function loadThemeVersion(name, config) {
67
+ const local = await findUserThemeCssFile(config, userThemesFolder(config), name);
68
+ if (local)
69
+ return local.version;
70
+ for (const folder of config.defaultThemesFolders) {
71
+ const def = await findDefaultThemeCssFile(folder, name);
72
+ if (def)
73
+ return def.version;
74
+ }
75
+ return 1;
76
+ }
77
+ exports.loadThemeVersion = loadThemeVersion;
47
78
  async function loadThemeInfo(name, config) {
48
- // Check user's local themes first, then fall back to package defaults
79
+ const sp = config.storageProvider;
80
+ // Check user's local themes first (user storage)
49
81
  const localPath = path_1.default.join(userThemesFolder(config), `${name}.json`);
50
- if (await (0, files_1.checkIfExists)(localPath)) {
51
- const raw = await (0, files_1.loadFile)(localPath);
82
+ if (await sp.checkIfExists(localPath)) {
83
+ const raw = await sp.loadFile(localPath);
52
84
  return raw ? JSON.parse(raw) : undefined;
53
85
  }
54
- const defaultPath = path_1.default.join(config.defaultThemesFolder, `${name}.json`);
55
- if (await (0, files_1.checkIfExists)(defaultPath)) {
86
+ // Fall back to package defaults (local fs)
87
+ const defaultPath = await (0, files_1.findFileInFolders)(config.defaultThemesFolders, `${name}.json`);
88
+ if (defaultPath) {
56
89
  const raw = await (0, files_1.loadFile)(defaultPath);
57
90
  return raw ? JSON.parse(raw) : undefined;
58
91
  }
@@ -60,38 +93,41 @@ async function loadThemeInfo(name, config) {
60
93
  }
61
94
  exports.loadThemeInfo = loadThemeInfo;
62
95
  async function loadTheme(name, config) {
63
- // Check user's local themes first, then fall back to package defaults
64
- const local = await findThemeCssFile(userThemesFolder(config), name);
96
+ const sp = config.storageProvider;
97
+ // Check user's local themes first (user storage)
98
+ const local = await findUserThemeCssFile(config, userThemesFolder(config), name);
65
99
  if (local) {
66
- return await (0, files_1.loadFile)(local.path);
100
+ return await sp.loadFile(local.path);
67
101
  }
68
- const def = await findThemeCssFile(config.defaultThemesFolder, name);
69
- if (def) {
70
- return await (0, files_1.loadFile)(def.path);
102
+ // Search all default theme folders (local fs)
103
+ for (const folder of config.defaultThemesFolders) {
104
+ const def = await findDefaultThemeCssFile(folder, name);
105
+ if (def) {
106
+ return await (0, files_1.loadFile)(def.path);
107
+ }
71
108
  }
72
109
  return undefined;
73
110
  }
74
111
  exports.loadTheme = loadTheme;
75
112
  async function listThemes(config) {
113
+ const sp = config.storageProvider;
76
114
  const names = new Set();
77
- // Collect from user's local themes folder
115
+ // Collect from user's local themes folder (user storage)
78
116
  const localFolder = userThemesFolder(config);
79
- if (await (0, files_1.checkIfExists)(localFolder)) {
80
- const files = await (0, files_1.listFiles)(localFolder);
117
+ if (await sp.checkIfExists(localFolder)) {
118
+ const files = await sp.listFiles(localFolder);
81
119
  for (const f of files) {
82
120
  const parsed = parseThemeFilename(f);
83
121
  if (parsed)
84
122
  names.add(parsed.name);
85
123
  }
86
124
  }
87
- // Collect from package defaults
88
- if (await (0, files_1.checkIfExists)(config.defaultThemesFolder)) {
89
- const files = await (0, files_1.listFiles)(config.defaultThemesFolder);
90
- for (const f of files) {
91
- const parsed = parseThemeFilename(f);
92
- if (parsed)
93
- names.add(parsed.name);
94
- }
125
+ // Collect from all default theme folders (local fs)
126
+ const defaultFiles = await (0, files_1.listFilesFromFolders)(config.defaultThemesFolders);
127
+ for (const f of defaultFiles) {
128
+ const parsed = parseThemeFilename(f);
129
+ if (parsed)
130
+ names.add(parsed.name);
95
131
  }
96
132
  return Array.from(names).sort();
97
133
  }
@@ -100,11 +136,12 @@ exports.listThemes = listThemes;
100
136
  * Compare local theme versions against defaults and return themes that need upgrading.
101
137
  */
102
138
  async function getOutdatedThemes(config) {
139
+ const sp = config.storageProvider;
103
140
  const localFolder = userThemesFolder(config);
104
- if (!await (0, files_1.checkIfExists)(localFolder))
141
+ if (!await sp.checkIfExists(localFolder))
105
142
  return [];
106
- const defaultFiles = await (0, files_1.listFiles)(config.defaultThemesFolder);
107
- const localFiles = await (0, files_1.listFiles)(localFolder);
143
+ const defaultFiles = await (0, files_1.listFilesFromFolders)(config.defaultThemesFolders);
144
+ const localFiles = await sp.listFiles(localFolder);
108
145
  // Build maps: theme name → highest version
109
146
  const defaultVersions = new Map();
110
147
  for (const f of defaultFiles) {
@@ -1 +1 @@
1
- {"version":3,"file":"themes.js","sourceRoot":"","sources":["../src/themes.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AACxB,mCAA6D;AAGhD,QAAA,aAAa,GAAG,CAAC,CAAC;AAO/B,SAAS,gBAAgB,CAAC,MAAqB;IAC3C,OAAO,cAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AACnD,CAAC;AAED;;;;GAIG;AACH,SAAgB,kBAAkB,CAAC,QAAgB;IAC/C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IACjD,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC7D,IAAI,cAAc,EAAE;QAChB,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;KAChF;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AAChE,CAAC;AAPD,gDAOC;AAED;;;GAGG;AACH,KAAK,UAAU,gBAAgB,CAAC,MAAc,EAAE,IAAY;IACxD,IAAI,CAAC,MAAM,IAAA,qBAAa,EAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IACnD,MAAM,KAAK,GAAG,MAAM,IAAA,iBAAS,EAAC,MAAM,CAAC,CAAC;IACtC,IAAI,IAAmD,CAAC;IACxD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;QACnB,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE;YAChC,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;gBACxC,IAAI,GAAG,EAAE,IAAI,EAAE,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;aAClE;SACJ;KACJ;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAEM,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,MAAqB;IACnE,sEAAsE;IACtE,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;IACtE,IAAI,MAAM,IAAA,qBAAa,EAAC,SAAS,CAAC,EAAE;QAChC,MAAM,GAAG,GAAG,MAAM,IAAA,gBAAQ,EAAC,SAAS,CAAC,CAAC;QACtC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;KAC5C;IAED,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;IAC1E,IAAI,MAAM,IAAA,qBAAa,EAAC,WAAW,CAAC,EAAE;QAClC,MAAM,GAAG,GAAG,MAAM,IAAA,gBAAQ,EAAC,WAAW,CAAC,CAAC;QACxC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;KAC5C;IAED,OAAO,SAAS,CAAC;AACrB,CAAC;AAfD,sCAeC;AAEM,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,MAAqB;IAC/D,sEAAsE;IACtE,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;IACrE,IAAI,KAAK,EAAE;QACP,OAAO,MAAM,IAAA,gBAAQ,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC;KACrC;IAED,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;IACrE,IAAI,GAAG,EAAE;QACL,OAAO,MAAM,IAAA,gBAAQ,EAAC,GAAG,CAAC,IAAI,CAAC,CAAC;KACnC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC;AAbD,8BAaC;AAEM,KAAK,UAAU,UAAU,CAAC,MAAqB;IAClD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,0CAA0C;IAC1C,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,MAAM,IAAA,qBAAa,EAAC,WAAW,CAAC,EAAE;QAClC,MAAM,KAAK,GAAG,MAAM,IAAA,iBAAS,EAAC,WAAW,CAAC,CAAC;QAC3C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;YACnB,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;YACrC,IAAI,MAAM;gBAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SACtC;KACJ;IAED,gCAAgC;IAChC,IAAI,MAAM,IAAA,qBAAa,EAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE;QACjD,MAAM,KAAK,GAAG,MAAM,IAAA,iBAAS,EAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC1D,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;YACnB,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;YACrC,IAAI,MAAM;gBAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SACtC;KACJ;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AACpC,CAAC;AAvBD,gCAuBC;AAED;;GAEG;AACI,KAAK,UAAU,iBAAiB,CAAC,MAAqB;IACzD,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,IAAA,qBAAa,EAAC,WAAW,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjD,MAAM,YAAY,GAAG,MAAM,IAAA,iBAAS,EAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACjE,MAAM,UAAU,GAAG,MAAM,IAAA,iBAAS,EAAC,WAAW,CAAC,CAAC;IAEhD,2CAA2C;IAC3C,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE;QAC1B,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,MAAM,EAAE;YACR,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClD,IAAI,MAAM,CAAC,OAAO,GAAG,GAAG;gBAAE,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;SAC9E;KACJ;IAED,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAChD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE;QACxB,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,MAAM,EAAE;YACR,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,MAAM,CAAC,OAAO,GAAG,GAAG;gBAAE,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;SAC5E;KACJ;IAED,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,eAAe,EAAE;QAC1C,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,QAAQ,GAAG,MAAM,EAAE;YACnB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACvB;KACJ;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC;AAlCD,8CAkCC"}
1
+ {"version":3,"file":"themes.js","sourceRoot":"","sources":["../src/themes.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AACxB,mCAAsG;AAGzF,QAAA,aAAa,GAAG,CAAC,CAAC;AAO/B,SAAS,gBAAgB,CAAC,MAAqB;IAC3C,OAAO,cAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AACnD,CAAC;AAED;;;;GAIG;AACH,SAAgB,kBAAkB,CAAC,QAAgB;IAC/C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IACjD,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC7D,IAAI,cAAc,EAAE;QAChB,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;KAChF;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AAChE,CAAC;AAPD,gDAOC;AAED;;;GAGG;AACH,KAAK,UAAU,oBAAoB,CAAC,MAAqB,EAAE,MAAc,EAAE,IAAY;IACnF,MAAM,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IACtD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,IAAmD,CAAC;IACxD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;QACnB,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE;YAChC,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;gBACxC,IAAI,GAAG,EAAE,IAAI,EAAE,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;aAClE;SACJ;KACJ;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,uBAAuB,CAAC,MAAc,EAAE,IAAY;IAC/D,IAAI,CAAC,MAAM,IAAA,qBAAa,EAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IACnD,MAAM,KAAK,GAAG,MAAM,IAAA,iBAAS,EAAC,MAAM,CAAC,CAAC;IACtC,IAAI,IAAmD,CAAC;IACxD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;QACnB,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE;YAChC,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;gBACxC,IAAI,GAAG,EAAE,IAAI,EAAE,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;aAClE;SACJ;KACJ;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAEM,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,MAAqB;IACtE,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;IACjF,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IAChC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,oBAAoB,EAAE;QAC9C,MAAM,GAAG,GAAG,MAAM,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACxD,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC,OAAO,CAAC;KAC/B;IACD,OAAO,CAAC,CAAC;AACb,CAAC;AARD,4CAQC;AAEM,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,MAAqB;IACnE,MAAM,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC;IAElC,iDAAiD;IACjD,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;IACtE,IAAI,MAAM,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE;QACnC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACzC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;KAC5C;IAED,2CAA2C;IAC3C,MAAM,WAAW,GAAG,MAAM,IAAA,yBAAiB,EAAC,MAAM,CAAC,oBAAoB,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;IACzF,IAAI,WAAW,EAAE;QACb,MAAM,GAAG,GAAG,MAAM,IAAA,gBAAQ,EAAC,WAAW,CAAC,CAAC;QACxC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;KAC5C;IAED,OAAO,SAAS,CAAC;AACrB,CAAC;AAlBD,sCAkBC;AAEM,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,MAAqB;IAC/D,MAAM,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC;IAElC,iDAAiD;IACjD,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;IACjF,IAAI,KAAK,EAAE;QACP,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;KACxC;IAED,8CAA8C;IAC9C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,oBAAoB,EAAE;QAC9C,MAAM,GAAG,GAAG,MAAM,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACxD,IAAI,GAAG,EAAE;YACL,OAAO,MAAM,IAAA,gBAAQ,EAAC,GAAG,CAAC,IAAI,CAAC,CAAC;SACnC;KACJ;IAED,OAAO,SAAS,CAAC;AACrB,CAAC;AAlBD,8BAkBC;AAEM,KAAK,UAAU,UAAU,CAAC,MAAqB;IAClD,MAAM,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,yDAAyD;IACzD,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,MAAM,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE;QACrC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC9C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;YACnB,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;YACrC,IAAI,MAAM;gBAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SACtC;KACJ;IAED,oDAAoD;IACpD,MAAM,YAAY,GAAG,MAAM,IAAA,4BAAoB,EAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC7E,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE;QAC1B,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,MAAM;YAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;KACtC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AACpC,CAAC;AAtBD,gCAsBC;AAED;;GAEG;AACI,KAAK,UAAU,iBAAiB,CAAC,MAAqB;IACzD,MAAM,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC;IAClC,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpD,MAAM,YAAY,GAAG,MAAM,IAAA,4BAAoB,EAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC7E,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAEnD,2CAA2C;IAC3C,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE;QAC1B,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,MAAM,EAAE;YACR,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClD,IAAI,MAAM,CAAC,OAAO,GAAG,GAAG;gBAAE,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;SAC9E;KACJ;IAED,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAChD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE;QACxB,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,MAAM,EAAE;YACR,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,MAAM,CAAC,OAAO,GAAG,GAAG;gBAAE,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;SAC5E;KACJ;IAED,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,eAAe,EAAE;QAC1C,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,QAAQ,GAAG,MAAM,EAAE;YACnB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACvB;KACJ;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC;AAnCD,8CAmCC"}
@@ -0,0 +1,193 @@
1
+ You are a code migration tool. You convert SynthOS v1 pages to v2 format.
2
+
3
+ ## CRITICAL — Structural Elements You MUST Preserve
4
+
5
+ These elements are required by the SynthOS runtime (`page-script.js`). Removing them breaks the page.
6
+
7
+ 1. **Chat panel** — The entire `.chat-panel` div including:
8
+ - `.chat-header`
9
+ - `.chat-messages` with all message history
10
+ - `.link-group` with Save/Pages/Reset links
11
+ - `<form id="chatForm">` with `.chat-input` and `.chat-submit`
12
+ If the chat form is missing, POST requests fail with "Cannot POST /".
13
+
14
+ 2. **Thoughts div** — `<div id="thoughts" style="display: none;">...</div>` must stay in the page.
15
+
16
+ 3. **Loading overlay** — `<div id="loadingOverlay" class="loading-overlay"><div class="spinner"></div></div>` must be **inside** `.viewer-panel` (not outside it, not removed).
17
+
18
+ 4. **Two-panel layout** — The `chat-panel` + `viewer-panel` structure must remain intact.
19
+
20
+ ---
21
+
22
+ ## Rules — What to REMOVE
23
+
24
+ ### 1. Shared CSS rules
25
+
26
+ Remove CSS rules matching these selectors (they are now in theme.css):
27
+
28
+ **Base:** `:root`, `*`, `body`, `html`
29
+
30
+ **Chat panel:** `.chat-panel`, `.chat-header`, `.chat-messages`, `.chat-message`, `.chat-message p`, `.chat-message p strong`, `.chat-message p code`, `.chat-message strong`, `.chat-message pre`, `.chat-message code`, `.chat-message a`, `.link-group`, `.link-group a`, `.link-group a:hover`, `form`, `.chat-input`, `.chat-input:focus`, `.chat-input::placeholder`, `.chat-input:disabled`, `.chat-submit`, `.chat-submit:hover`, `.chat-submit:active`, `.chat-submit:disabled`, `.chat-input-wrapper`, `.chat-input-wrapper .chat-input`
31
+
32
+ **Viewer panel:** `.viewer-panel`, `.viewer-panel::before`, `.viewer-panel.full-viewer`
33
+
34
+ **Loading:** `.loading-overlay`, `.spinner`, `#loadingOverlay`
35
+
36
+ **Chat toggle:** `.chat-toggle`, `.chat-toggle:hover`, `.chat-toggle-dots`, `.chat-toggle-dot`, `.chat-toggle:hover .chat-toggle-dot`, `body.chat-collapsed .chat-panel`, `body.chat-collapsed .chat-toggle`
37
+
38
+ **Modals:** `.modal-overlay`, `.modal-overlay.show`, `.modal-content`, `.modal-header`, `.modal-body`, `.modal-footer`, `.modal-footer-right`, `.modal-btn`, `.modal-btn-primary`, `.modal-btn-primary:hover`, `.modal-btn-secondary`, `.modal-btn-secondary:hover`, `.modal-btn-danger`, `.modal-btn-danger:hover`
39
+
40
+ **Form elements:** `.form-group`, `.form-group:last-child`, `.form-label`, `.form-input`, `.form-input:focus`, `.form-input:read-only`, `.form-input::placeholder`, `.checkbox-label`, `.checkbox-label input[type="checkbox"]`, `.checkbox-label span`
41
+
42
+ **Brainstorm:** All `.brainstorm-*` selectors
43
+
44
+ **Animations:** `@keyframes spin`, `@keyframes nebula-pulse`
45
+
46
+ **Scrollbars:** All `::-webkit-scrollbar*` rules, `scrollbar-width` and `scrollbar-color` on `*`
47
+
48
+ ### 2. Shared inline JS
49
+
50
+ Remove these specific code blocks from `<script>` tags (page-script.js handles them now):
51
+
52
+ - `document.getElementById('chatInput').focus()` line
53
+ - `chatForm` submit event listener (the one with setTimeout and loading overlay)
54
+ - `saveLink` click handler
55
+ - `resetLink` click handler
56
+ - `window.onload` that ONLY scrolls chatMessages — **keep other onload logic!**
57
+ - Chat panel toggle IIFE (references `synthos-chat-collapsed`)
58
+ - Focus management IIFE (references `stopImmediatePropagation`)
59
+ - `// Basic chat functionality` comment
60
+
61
+ ### 3. Empty tags
62
+
63
+ If a `<script>` or `<style>` block becomes empty after stripping, remove it entirely.
64
+
65
+ ---
66
+
67
+ ## Rules — What to ADD
68
+
69
+ In `<head>`, add these two lines right after the `<title>` tag (if not already present):
70
+ ```html
71
+ <script src="/api/theme-info.js"></script>
72
+ <link rel="stylesheet" href="/api/theme.css">
73
+ ```
74
+
75
+ Do NOT add `page-info.js`, `page-helpers.js`, or `page-script.js` — the server auto-injects those.
76
+
77
+ ---
78
+
79
+ ## Rules — What to TRANSFORM
80
+
81
+ ### Data/Table API migration
82
+
83
+ The data API changed from global tables to **page-scoped** tables. Prefer converting raw fetch calls to `synthos.data.*` helpers (they auto-scope via `window.pageInfo.name`):
84
+
85
+ | v1 pattern | v2 replacement |
86
+ |---|---|
87
+ | `fetch('/api/data/TABLE')` | `synthos.data.list('TABLE')` |
88
+ | `fetch('/api/data/TABLE/ID')` | `synthos.data.get('TABLE', 'ID')` |
89
+ | `fetch('/api/data/TABLE', {method:'POST', body:...})` | `synthos.data.save('TABLE', row)` |
90
+ | `fetch('/api/data/TABLE/ID', {method:'DELETE'})` | `synthos.data.remove('TABLE', 'ID')` |
91
+
92
+ **Important:** `synthos.data.get()` returns the object directly (or `null`), NOT a Response — no `.json()` needed.
93
+
94
+ If raw fetch must be kept: `fetch('/api/data/notes')` → `fetch('/api/data/' + pageName + '/notes')`
95
+
96
+ ### Color variables
97
+
98
+ Replace hardcoded Nebula Dusk colors with CSS variables in **page-specific CSS only**:
99
+
100
+ | Hardcoded | CSS Variable |
101
+ |-----------|-------------|
102
+ | `#667eea` | `var(--accent-primary)` |
103
+ | `#764ba2` | `var(--accent-secondary)` |
104
+ | `#f093fb` | `var(--accent-tertiary)` |
105
+ | `#b794f6` | `var(--text-secondary)` |
106
+ | `#e0e0e0` | `var(--text-primary)` |
107
+ | `rgba(138, 43, 226, 0.3)` | `var(--border-color)` or `var(--accent-glow)` |
108
+ | `#1a1a2e` | `var(--bg-primary)` |
109
+ | `#16213e` | `var(--bg-secondary)` |
110
+ | `#0f0f23` | `var(--bg-tertiary)` |
111
+
112
+ For gradients: `linear-gradient(135deg, #667eea, #764ba2)` → `linear-gradient(135deg, var(--accent-primary), var(--accent-secondary))`
113
+
114
+ **Exceptions — do NOT replace colors in:**
115
+ - Canvas 2D API calls (`ctx.fillStyle`, `ctx.strokeStyle`, etc.) — CSS variables don't work in Canvas JS
116
+ - Print-specific styles (`@media print`) — these target white backgrounds and need hardcoded dark-on-light colors
117
+
118
+ ---
119
+
120
+ ## Rules — What to PRESERVE (do NOT modify)
121
+
122
+ - ALL viewer-panel HTML content (games, presentations, tools, dashboards, etc.)
123
+ - ALL page-specific JavaScript (game logic, presentation logic, keyboard handlers, etc.)
124
+ - ALL page-specific CSS (styles for custom classes not in the shared list above)
125
+ - Chat message history in `.chat-messages`
126
+ - `<div id="thoughts">` content
127
+ - External CDN script tags (`<script src="...">`)
128
+ - The `loadingOverlay` element (just ensure it's inside `.viewer-panel`)
129
+
130
+ ---
131
+
132
+ ## Viewer Panel Overrides
133
+
134
+ The theme sets `.viewer-panel` to `justify-content: center; align-items: center; overflow: hidden`. Pages with **scrollable or top-aligned content** (dashboards, lists, tabs, tables) need these overrides in their page-specific `<style>`:
135
+
136
+ ```css
137
+ .viewer-panel {
138
+ justify-content: flex-start;
139
+ align-items: stretch;
140
+ overflow-y: auto;
141
+ }
142
+ ```
143
+
144
+ Add this override when the viewer-panel contains content that should scroll or align to the top.
145
+
146
+ ---
147
+
148
+ ## V2 Page Structure Reference
149
+
150
+ ```html
151
+ <!DOCTYPE html>
152
+ <html lang="en">
153
+ <head>
154
+ <meta charset="UTF-8">
155
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
156
+ <title>SynthOS - Page Title</title>
157
+ <script src="/api/theme-info.js"></script>
158
+ <link rel="stylesheet" href="/api/theme.css">
159
+ <style>
160
+ /* Only page-specific styles here */
161
+ </style>
162
+ </head>
163
+ <body>
164
+ <div class="chat-panel">
165
+ <div class="chat-header">SynthOS</div>
166
+ <div class="chat-messages" id="chatMessages">
167
+ <!-- chat messages preserved -->
168
+ </div>
169
+ <div class="link-group">
170
+ <a href="#" id="saveLink">Save</a>
171
+ <a href="/pages" id="pagesLink">Pages</a>
172
+ <a href="#" id="resetLink">Reset</a>
173
+ </div>
174
+ <form action="/" method="POST" id="chatForm">
175
+ <input type="text" class="chat-input" id="chatInput" name="message" placeholder="Type a message...">
176
+ <button type="submit" class="chat-submit">Send</button>
177
+ </form>
178
+ </div>
179
+ <div class="viewer-panel" id="viewerPanel">
180
+ <!-- page content preserved -->
181
+ <div id="loadingOverlay" class="loading-overlay"><div class="spinner"></div></div>
182
+ </div>
183
+ <div id="thoughts" style="display: none;">...</div>
184
+ <script>
185
+ /* Only page-specific JS here */
186
+ </script>
187
+ </body>
188
+ </html>
189
+ ```
190
+
191
+ ## Output format
192
+
193
+ Return ONLY the complete migrated HTML. No markdown fences, no explanation, no commentary. Just the raw HTML starting with `<!DOCTYPE html>`.