synthos 0.8.0 → 0.9.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 (359) 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 +1822 -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} +14 -12
  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} +14 -11
  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.map +1 -1
  100. package/dist/connectors/index.js +3 -2
  101. package/dist/connectors/index.js.map +1 -1
  102. package/dist/connectors/registry.d.ts +2 -1
  103. package/dist/connectors/registry.d.ts.map +1 -1
  104. package/dist/connectors/registry.js +31 -8
  105. package/dist/connectors/registry.js.map +1 -1
  106. package/dist/customizer/Customizer.d.ts +57 -0
  107. package/dist/customizer/Customizer.d.ts.map +1 -0
  108. package/dist/customizer/Customizer.js +124 -0
  109. package/dist/customizer/Customizer.js.map +1 -0
  110. package/dist/customizer/index.d.ts.map +1 -0
  111. package/dist/customizer/index.js +9 -0
  112. package/dist/customizer/index.js.map +1 -0
  113. package/dist/files.d.ts +16 -0
  114. package/dist/files.d.ts.map +1 -1
  115. package/dist/files.js +60 -1
  116. package/dist/files.js.map +1 -1
  117. package/dist/index.d.ts.map +1 -1
  118. package/dist/index.js +1 -0
  119. package/dist/index.js.map +1 -1
  120. package/dist/init.d.ts +10 -6
  121. package/dist/init.d.ts.map +1 -1
  122. package/dist/init.js +96 -113
  123. package/dist/init.js.map +1 -1
  124. package/dist/migrations.d.ts.map +1 -1
  125. package/dist/migrations.js +23 -10
  126. package/dist/migrations.js.map +1 -1
  127. package/dist/models/anthropic.d.ts +4 -2
  128. package/dist/models/anthropic.d.ts.map +1 -1
  129. package/dist/models/anthropic.js +33 -6
  130. package/dist/models/anthropic.js.map +1 -1
  131. package/dist/models/fireworksai.d.ts.map +1 -1
  132. package/dist/models/fireworksai.js +9 -1
  133. package/dist/models/fireworksai.js.map +1 -1
  134. package/dist/models/index.d.ts +1 -1
  135. package/dist/models/index.d.ts.map +1 -1
  136. package/dist/models/index.js +2 -1
  137. package/dist/models/index.js.map +1 -1
  138. package/dist/models/openai.d.ts +1 -1
  139. package/dist/models/openai.d.ts.map +1 -1
  140. package/dist/models/openai.js +24 -3
  141. package/dist/models/openai.js.map +1 -1
  142. package/dist/models/types.d.ts +20 -1
  143. package/dist/models/types.d.ts.map +1 -1
  144. package/dist/models/types.js +6 -1
  145. package/dist/models/types.js.map +1 -1
  146. package/dist/pages.d.ts +30 -7
  147. package/dist/pages.d.ts.map +1 -1
  148. package/dist/pages.js +177 -55
  149. package/dist/pages.js.map +1 -1
  150. package/dist/service/server.d.ts.map +1 -1
  151. package/dist/service/server.js +37 -8
  152. package/dist/service/server.js.map +1 -1
  153. package/dist/service/transformPage.d.ts +47 -20
  154. package/dist/service/transformPage.d.ts.map +1 -1
  155. package/dist/service/transformPage.js +514 -293
  156. package/dist/service/transformPage.js.map +1 -1
  157. package/dist/service/useAgentRoutes.d.ts +2 -1
  158. package/dist/service/useAgentRoutes.d.ts.map +1 -1
  159. package/dist/service/useAgentRoutes.js +5 -2
  160. package/dist/service/useAgentRoutes.js.map +1 -1
  161. package/dist/service/useApiRoutes.d.ts.map +1 -1
  162. package/dist/service/useApiRoutes.js +237 -136
  163. package/dist/service/useApiRoutes.js.map +1 -1
  164. package/dist/service/useConnectorRoutes.js +6 -6
  165. package/dist/service/useConnectorRoutes.js.map +1 -1
  166. package/dist/service/useFileRoutes.d.ts +4 -0
  167. package/dist/service/useFileRoutes.d.ts.map +1 -0
  168. package/dist/service/useFileRoutes.js +122 -0
  169. package/dist/service/useFileRoutes.js.map +1 -0
  170. package/dist/service/usePageRoutes.d.ts.map +1 -1
  171. package/dist/service/usePageRoutes.js +648 -67
  172. package/dist/service/usePageRoutes.js.map +1 -1
  173. package/dist/service/useSharedDataRoutes.d.ts +4 -0
  174. package/dist/service/useSharedDataRoutes.d.ts.map +1 -0
  175. package/dist/service/useSharedDataRoutes.js +104 -0
  176. package/dist/service/useSharedDataRoutes.js.map +1 -0
  177. package/dist/service/useSharedFileRoutes.d.ts +4 -0
  178. package/dist/service/useSharedFileRoutes.d.ts.map +1 -0
  179. package/dist/service/useSharedFileRoutes.js +121 -0
  180. package/dist/service/useSharedFileRoutes.js.map +1 -0
  181. package/dist/settings.d.ts +1 -0
  182. package/dist/settings.d.ts.map +1 -1
  183. package/dist/settings.js +1 -0
  184. package/dist/settings.js.map +1 -1
  185. package/dist/synthos-cli.d.ts.map +1 -1
  186. package/dist/synthos-cli.js +4 -3
  187. package/dist/synthos-cli.js.map +1 -1
  188. package/dist/themes.d.ts +1 -0
  189. package/dist/themes.d.ts.map +1 -1
  190. package/dist/themes.js +28 -15
  191. package/dist/themes.js.map +1 -1
  192. package/migration-rules/v1-to-v2.md +193 -0
  193. package/migration-rules/v2-to-v3.md +481 -0
  194. package/package.json +11 -10
  195. package/required-pages/builder/page.html +43 -0
  196. package/required-pages/builder/page.json +10 -0
  197. package/required-pages/{pages.html → pages/page.html} +238 -233
  198. package/required-pages/pages/page.json +10 -0
  199. package/required-pages/{settings.html → settings/page.html} +389 -275
  200. package/required-pages/settings/page.json +10 -0
  201. package/required-pages/synthos_apis/page.html +846 -0
  202. package/required-pages/synthos_apis/page.json +10 -0
  203. package/required-pages/{synthos_scripts.html → synthos_scripts/page.html} +13 -11
  204. package/required-pages/synthos_scripts/page.json +10 -0
  205. package/src/agents/index.ts +1 -1
  206. package/src/agents/openclaw/gatewayManager.ts +22 -11
  207. package/src/agents/openclaw/openclawProvider.ts +2 -4
  208. package/src/agents/openclaw/sshTunnelManager.ts +19 -11
  209. package/src/builders/anthropic.ts +283 -0
  210. package/src/builders/fireworksai.ts +59 -0
  211. package/src/builders/index.ts +33 -0
  212. package/src/builders/openai.ts +89 -0
  213. package/src/builders/types.ts +261 -0
  214. package/src/connectors/index.ts +1 -1
  215. package/src/connectors/registry.ts +28 -8
  216. package/src/customizer/Customizer.ts +151 -0
  217. package/src/customizer/index.ts +5 -0
  218. package/src/files.ts +57 -0
  219. package/src/index.ts +2 -1
  220. package/src/init.ts +137 -123
  221. package/src/migrations.ts +30 -10
  222. package/src/models/anthropic.ts +40 -10
  223. package/src/models/fireworksai.ts +9 -2
  224. package/src/models/index.ts +1 -1
  225. package/src/models/openai.ts +26 -6
  226. package/src/models/types.ts +31 -1
  227. package/src/pages.ts +176 -54
  228. package/src/service/server.ts +36 -9
  229. package/src/service/transformPage.ts +557 -326
  230. package/src/service/useAgentRoutes.ts +7 -2
  231. package/src/service/useApiRoutes.ts +150 -41
  232. package/src/service/useConnectorRoutes.ts +7 -7
  233. package/src/service/useFileRoutes.ts +127 -0
  234. package/src/service/usePageRoutes.ts +720 -73
  235. package/src/service/useSharedDataRoutes.ts +106 -0
  236. package/src/service/useSharedFileRoutes.ts +126 -0
  237. package/src/settings.ts +2 -0
  238. package/src/synthos-cli.ts +4 -3
  239. package/src/themes.ts +25 -14
  240. package/static-files/favicon.svg +12 -0
  241. package/static-files/fluentlm-instructions.llmd +868 -0
  242. package/static-files/fluentlm-instructions.md +1595 -0
  243. package/static-files/fluentlm.css +4844 -0
  244. package/static-files/fluentlm.js +3602 -0
  245. package/static-files/fluentlm.min.css +1 -0
  246. package/static-files/fluentlm.min.js +1 -0
  247. package/{page-scripts/helpers-v2.js → static-files/helpers.v3.js} +82 -0
  248. package/static-files/page.v3.js +1290 -0
  249. package/static-files/recommended-frameworks.llmd +81 -0
  250. package/static-files/recommended-frameworks.md +137 -0
  251. package/static-files/retro-game.js +877 -0
  252. package/static-files/shell.css +797 -0
  253. package/static-files/theme-dark.css +169 -0
  254. package/static-files/theme-light.css +169 -0
  255. package/tests/builders.spec.ts +139 -0
  256. package/tests/pages.spec.ts +8 -8
  257. package/tests/transformPage.spec.ts +299 -360
  258. package/default-pages/application.html +0 -40
  259. package/default-pages/application.json +0 -1
  260. package/default-pages/json_tools.json +0 -1
  261. package/default-pages/my_notes.html +0 -33
  262. package/default-pages/neon_asteroids.html +0 -77
  263. package/default-pages/sidebar_page.json +0 -1
  264. package/default-pages/solar_tutorial.json +0 -1
  265. package/default-pages/two-panel_page.json +0 -1
  266. package/dist/agents/a2a/a2aProvider.d.ts +0 -3
  267. package/dist/agents/discovery.d.ts +0 -30
  268. package/dist/agents/openclaw/openclawProvider.d.ts +0 -3
  269. package/dist/agents/types.d.ts +0 -64
  270. package/dist/connectors/index.d.ts +0 -3
  271. package/dist/connectors/types.d.ts +0 -84
  272. package/dist/index.d.ts +0 -7
  273. package/dist/migrations.d.ts +0 -12
  274. package/dist/models/chainOfThought.d.ts +0 -12
  275. package/dist/models/fireworksai.d.ts +0 -30
  276. package/dist/models/logCompletePrompt.d.ts +0 -3
  277. package/dist/models/providers.d.ts +0 -8
  278. package/dist/models/utils.d.ts +0 -6
  279. package/dist/scripts.d.ts +0 -15
  280. package/dist/service/createCompletePrompt.d.ts +0 -5
  281. package/dist/service/debugLog.d.ts +0 -11
  282. package/dist/service/generateImage.d.ts +0 -32
  283. package/dist/service/index.d.ts +0 -8
  284. package/dist/service/modelInstructions.d.ts +0 -7
  285. package/dist/service/requiresSettings.d.ts +0 -3
  286. package/dist/service/server.d.ts +0 -4
  287. package/dist/service/useApiRoutes.d.ts +0 -4
  288. package/dist/service/useConnectorRoutes.d.ts +0 -4
  289. package/dist/service/useDataRoutes.d.ts +0 -4
  290. package/dist/service/useGatewayRoutes.d.ts +0 -4
  291. package/dist/service/useGatewayRoutes.d.ts.map +0 -1
  292. package/dist/service/useGatewayRoutes.js +0 -168
  293. package/dist/service/useGatewayRoutes.js.map +0 -1
  294. package/dist/service/usePageRoutes.d.ts +0 -5
  295. package/dist/synthos-cli.d.ts +0 -2
  296. package/page-scripts/page-v2.js +0 -656
  297. package/required-pages/builder.html +0 -48
  298. package/required-pages/builder.json +0 -1
  299. package/required-pages/pages.json +0 -1
  300. package/required-pages/settings.json +0 -1
  301. package/required-pages/synthos_apis.html +0 -327
  302. package/required-pages/synthos_apis.json +0 -1
  303. package/required-pages/synthos_scripts.json +0 -1
  304. package/src/connectors/airtable/connector.json +0 -27
  305. package/src/connectors/alpha-vantage/connector.json +0 -26
  306. package/src/connectors/brave-search/connector.json +0 -26
  307. package/src/connectors/cloudinary/connector.json +0 -27
  308. package/src/connectors/deepl/connector.json +0 -28
  309. package/src/connectors/elevenlabs/connector.json +0 -30
  310. package/src/connectors/giphy/connector.json +0 -27
  311. package/src/connectors/github/connector.json +0 -29
  312. package/src/connectors/huggingface/connector.json +0 -27
  313. package/src/connectors/imgur/connector.json +0 -29
  314. package/src/connectors/instagram/connector.json +0 -43
  315. package/src/connectors/jira/connector.json +0 -28
  316. package/src/connectors/mapbox/connector.json +0 -26
  317. package/src/connectors/nasa/connector.json +0 -27
  318. package/src/connectors/newsapi/connector.json +0 -27
  319. package/src/connectors/notion/connector.json +0 -28
  320. package/src/connectors/open-exchange-rates/connector.json +0 -27
  321. package/src/connectors/openweathermap/connector.json +0 -26
  322. package/src/connectors/pexels/connector.json +0 -27
  323. package/src/connectors/resend/connector.json +0 -29
  324. package/src/connectors/rss2json/connector.json +0 -27
  325. package/src/connectors/sendgrid/connector.json +0 -27
  326. package/src/connectors/spoonacular/connector.json +0 -28
  327. package/src/connectors/stability-ai/connector.json +0 -27
  328. package/src/connectors/twilio/connector.json +0 -28
  329. package/src/connectors/unsplash/connector.json +0 -27
  330. package/src/connectors/wolfram-alpha/connector.json +0 -26
  331. package/src/connectors/youtube-data/connector.json +0 -30
  332. /package/{dist/connectors → service-connectors}/airtable/connector.json +0 -0
  333. /package/{dist/connectors → service-connectors}/alpha-vantage/connector.json +0 -0
  334. /package/{dist/connectors → service-connectors}/brave-search/connector.json +0 -0
  335. /package/{dist/connectors → service-connectors}/cloudinary/connector.json +0 -0
  336. /package/{dist/connectors → service-connectors}/deepl/connector.json +0 -0
  337. /package/{dist/connectors → service-connectors}/elevenlabs/connector.json +0 -0
  338. /package/{dist/connectors → service-connectors}/giphy/connector.json +0 -0
  339. /package/{dist/connectors → service-connectors}/github/connector.json +0 -0
  340. /package/{dist/connectors → service-connectors}/huggingface/connector.json +0 -0
  341. /package/{dist/connectors → service-connectors}/imgur/connector.json +0 -0
  342. /package/{dist/connectors → service-connectors}/instagram/connector.json +0 -0
  343. /package/{dist/connectors → service-connectors}/jira/connector.json +0 -0
  344. /package/{dist/connectors → service-connectors}/mapbox/connector.json +0 -0
  345. /package/{dist/connectors → service-connectors}/nasa/connector.json +0 -0
  346. /package/{dist/connectors → service-connectors}/newsapi/connector.json +0 -0
  347. /package/{dist/connectors → service-connectors}/notion/connector.json +0 -0
  348. /package/{dist/connectors → service-connectors}/open-exchange-rates/connector.json +0 -0
  349. /package/{dist/connectors → service-connectors}/openweathermap/connector.json +0 -0
  350. /package/{dist/connectors → service-connectors}/pexels/connector.json +0 -0
  351. /package/{dist/connectors → service-connectors}/resend/connector.json +0 -0
  352. /package/{dist/connectors → service-connectors}/rss2json/connector.json +0 -0
  353. /package/{dist/connectors → service-connectors}/sendgrid/connector.json +0 -0
  354. /package/{dist/connectors → service-connectors}/spoonacular/connector.json +0 -0
  355. /package/{dist/connectors → service-connectors}/stability-ai/connector.json +0 -0
  356. /package/{dist/connectors → service-connectors}/twilio/connector.json +0 -0
  357. /package/{dist/connectors → service-connectors}/unsplash/connector.json +0 -0
  358. /package/{dist/connectors → service-connectors}/wolfram-alpha/connector.json +0 -0
  359. /package/{dist/connectors → service-connectors}/youtube-data/connector.json +0 -0
@@ -0,0 +1,211 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OPENAI_CHANGE_OPS_SCHEMA = exports.CHANGE_OPS_FORMAT_INSTRUCTION_NO_RANGED = exports.CHANGE_OPS_SCHEMA_NO_RANGED = exports.CHANGE_OPS_SCHEMA = exports.CHANGE_OPS_FORMAT_INSTRUCTION = void 0;
4
+ // ---------------------------------------------------------------------------
5
+ // Change operations output format — text instruction for non-structured builders
6
+ // ---------------------------------------------------------------------------
7
+ /**
8
+ * Text instruction that tells the model to return a JSON array of change operations.
9
+ * Append this to <INSTRUCTIONS> for builders that don't support structured outputs.
10
+ */
11
+ exports.CHANGE_OPS_FORMAT_INSTRUCTION = `Return a JSON array of change operations to apply to the page. Do NOT return the full HTML page.
12
+
13
+ Each operation must be one of:
14
+ { "op": "update", "nodeId": "<data-node-id>", "html": "<new innerHTML>" }
15
+ — replaces the innerHTML of the target element
16
+
17
+ { "op": "replace", "nodeId": "<data-node-id>", "html": "<new outerHTML>" }
18
+ — replaces the entire element (outerHTML) with new markup
19
+
20
+ { "op": "delete", "nodeId": "<data-node-id>" }
21
+ — removes the element from the page
22
+
23
+ { "op": "insert", "parentId": "<data-node-id>", "position": "prepend"|"append"|"before"|"after", "html": "<new element HTML>" }
24
+ — inserts new HTML relative to the parent element
25
+
26
+ { "op": "style-element", "nodeId": "<data-node-id>", "style": "<css style string>" }
27
+ — sets the style attribute of the target element (must be unlocked)
28
+
29
+ { "op": "search-replace", "nodeId": "<data-node-id>", "search": "<exact text to find>", "replace": "<replacement text>" }
30
+ — finds exact text within a script/style block and replaces it. Use empty string for replace to delete.
31
+
32
+ { "op": "search-insert", "nodeId": "<data-node-id>", "after": "<exact text to find>", "content": "<new lines to insert>" }
33
+ — inserts new content immediately after the matched text in a script/style block.
34
+
35
+ For partial edits to large scripts/styles, use search-replace or search-insert instead of
36
+ replacing the entire block with update.
37
+ Copy the search/after text exactly as it appears in the source.
38
+ When making multiple edits to the same block, ensure each search string targets distinct text.
39
+ To delete code, use search-replace with an empty replace string.
40
+
41
+ Return ONLY the JSON array. Example:
42
+ [
43
+ { "op": "update", "nodeId": "5", "html": "<p>Hello world</p>" },
44
+ { "op": "insert", "parentId": "3", "position": "append", "html": "<div class=\\"msg\\">New message</div>" }
45
+ ]`;
46
+ // ---------------------------------------------------------------------------
47
+ // Change operations JSON schema — for structured output (constrained decoding)
48
+ // ---------------------------------------------------------------------------
49
+ /**
50
+ * JSON schema matching the ChangeOp union type for Anthropic structured outputs.
51
+ * The top-level schema is an array of change operations.
52
+ */
53
+ exports.CHANGE_OPS_SCHEMA = {
54
+ type: 'array',
55
+ items: {
56
+ anyOf: [
57
+ {
58
+ type: 'object',
59
+ properties: {
60
+ op: { type: 'string', const: 'update' },
61
+ nodeId: { type: 'string' },
62
+ html: { type: 'string' },
63
+ },
64
+ required: ['op', 'nodeId', 'html'],
65
+ additionalProperties: false,
66
+ },
67
+ {
68
+ type: 'object',
69
+ properties: {
70
+ op: { type: 'string', const: 'replace' },
71
+ nodeId: { type: 'string' },
72
+ html: { type: 'string' },
73
+ },
74
+ required: ['op', 'nodeId', 'html'],
75
+ additionalProperties: false,
76
+ },
77
+ {
78
+ type: 'object',
79
+ properties: {
80
+ op: { type: 'string', const: 'delete' },
81
+ nodeId: { type: 'string' },
82
+ },
83
+ required: ['op', 'nodeId'],
84
+ additionalProperties: false,
85
+ },
86
+ {
87
+ type: 'object',
88
+ properties: {
89
+ op: { type: 'string', const: 'insert' },
90
+ parentId: { type: 'string' },
91
+ position: { type: 'string', enum: ['prepend', 'append', 'before', 'after'] },
92
+ html: { type: 'string' },
93
+ },
94
+ required: ['op', 'parentId', 'position', 'html'],
95
+ additionalProperties: false,
96
+ },
97
+ {
98
+ type: 'object',
99
+ properties: {
100
+ op: { type: 'string', const: 'style-element' },
101
+ nodeId: { type: 'string' },
102
+ style: { type: 'string' },
103
+ },
104
+ required: ['op', 'nodeId', 'style'],
105
+ additionalProperties: false,
106
+ },
107
+ {
108
+ type: 'object',
109
+ properties: {
110
+ op: { type: 'string', const: 'search-replace' },
111
+ nodeId: { type: 'string' },
112
+ search: { type: 'string' },
113
+ replace: { type: 'string' },
114
+ },
115
+ required: ['op', 'nodeId', 'search', 'replace'],
116
+ additionalProperties: false,
117
+ },
118
+ {
119
+ type: 'object',
120
+ properties: {
121
+ op: { type: 'string', const: 'search-insert' },
122
+ nodeId: { type: 'string' },
123
+ after: { type: 'string' },
124
+ content: { type: 'string' },
125
+ },
126
+ required: ['op', 'nodeId', 'after', 'content'],
127
+ additionalProperties: false,
128
+ },
129
+ ],
130
+ },
131
+ };
132
+ /**
133
+ * Variant of CHANGE_OPS_SCHEMA that omits ranged write operations (search-replace, search-insert).
134
+ * Used for medium/hard/re-write changes where the model should replace full blocks instead of
135
+ * attempting partial edits.
136
+ */
137
+ exports.CHANGE_OPS_SCHEMA_NO_RANGED = {
138
+ type: 'array',
139
+ items: {
140
+ anyOf: [
141
+ {
142
+ type: 'object',
143
+ properties: {
144
+ op: { type: 'string', const: 'update' },
145
+ nodeId: { type: 'string' },
146
+ html: { type: 'string' },
147
+ },
148
+ required: ['op', 'nodeId', 'html'],
149
+ additionalProperties: false,
150
+ },
151
+ {
152
+ type: 'object',
153
+ properties: {
154
+ op: { type: 'string', const: 'replace' },
155
+ nodeId: { type: 'string' },
156
+ html: { type: 'string' },
157
+ },
158
+ required: ['op', 'nodeId', 'html'],
159
+ additionalProperties: false,
160
+ },
161
+ {
162
+ type: 'object',
163
+ properties: {
164
+ op: { type: 'string', const: 'delete' },
165
+ nodeId: { type: 'string' },
166
+ },
167
+ required: ['op', 'nodeId'],
168
+ additionalProperties: false,
169
+ },
170
+ {
171
+ type: 'object',
172
+ properties: {
173
+ op: { type: 'string', const: 'insert' },
174
+ parentId: { type: 'string' },
175
+ position: { type: 'string', enum: ['prepend', 'append', 'before', 'after'] },
176
+ html: { type: 'string' },
177
+ },
178
+ required: ['op', 'parentId', 'position', 'html'],
179
+ additionalProperties: false,
180
+ },
181
+ {
182
+ type: 'object',
183
+ properties: {
184
+ op: { type: 'string', const: 'style-element' },
185
+ nodeId: { type: 'string' },
186
+ style: { type: 'string' },
187
+ },
188
+ required: ['op', 'nodeId', 'style'],
189
+ additionalProperties: false,
190
+ },
191
+ ],
192
+ },
193
+ };
194
+ /**
195
+ * Text instruction variant for no-ranged-writes mode.
196
+ * Tells the model to use `update` for full innerHTML replacement instead of partial edits.
197
+ */
198
+ exports.CHANGE_OPS_FORMAT_INSTRUCTION_NO_RANGED = `For script and style blocks, use "update" to replace the full innerHTML or "replace" to replace the full outerHTML. Do NOT use partial search-replace edits.`;
199
+ /**
200
+ * OpenAI structured outputs require a root-level object.
201
+ * This wraps CHANGE_OPS_SCHEMA in { changes: [...] }.
202
+ */
203
+ exports.OPENAI_CHANGE_OPS_SCHEMA = {
204
+ type: 'object',
205
+ properties: {
206
+ changes: exports.CHANGE_OPS_SCHEMA,
207
+ },
208
+ required: ['changes'],
209
+ additionalProperties: false,
210
+ };
211
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/builders/types.ts"],"names":[],"mappings":";;;AAEA,8EAA8E;AAC9E,iFAAiF;AACjF,8EAA8E;AAE9E;;;GAGG;AACU,QAAA,6BAA6B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkC3C,CAAC;AAEH,8EAA8E;AAC9E,+EAA+E;AAC/E,8EAA8E;AAE9E;;;GAGG;AACU,QAAA,iBAAiB,GAA4B;IACtD,IAAI,EAAE,OAAO;IACb,KAAK,EAAE;QACH,KAAK,EAAE;YACH;gBACI,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACR,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;oBACvC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC1B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC3B;gBACD,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC;gBAClC,oBAAoB,EAAE,KAAK;aAC9B;YACD;gBACI,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACR,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;oBACxC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC1B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC3B;gBACD,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC;gBAClC,oBAAoB,EAAE,KAAK;aAC9B;YACD;gBACI,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACR,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;oBACvC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC7B;gBACD,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC;gBAC1B,oBAAoB,EAAE,KAAK;aAC9B;YACD;gBACI,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACR,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;oBACvC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC5B,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE;oBAC5E,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC3B;gBACD,QAAQ,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC;gBAChD,oBAAoB,EAAE,KAAK;aAC9B;YACD;gBACI,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACR,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,EAAE;oBAC9C,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC1B,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC5B;gBACD,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC;gBACnC,oBAAoB,EAAE,KAAK;aAC9B;YACD;gBACI,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACR,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE;oBAC/C,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC1B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC1B,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC9B;gBACD,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC;gBAC/C,oBAAoB,EAAE,KAAK;aAC9B;YACD;gBACI,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACR,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,EAAE;oBAC9C,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC1B,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACzB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC9B;gBACD,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC;gBAC9C,oBAAoB,EAAE,KAAK;aAC9B;SACJ;KACJ;CACJ,CAAC;AAEF;;;;GAIG;AACU,QAAA,2BAA2B,GAA4B;IAChE,IAAI,EAAE,OAAO;IACb,KAAK,EAAE;QACH,KAAK,EAAE;YACH;gBACI,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACR,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;oBACvC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC1B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC3B;gBACD,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC;gBAClC,oBAAoB,EAAE,KAAK;aAC9B;YACD;gBACI,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACR,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;oBACxC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC1B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC3B;gBACD,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC;gBAClC,oBAAoB,EAAE,KAAK;aAC9B;YACD;gBACI,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACR,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;oBACvC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC7B;gBACD,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC;gBAC1B,oBAAoB,EAAE,KAAK;aAC9B;YACD;gBACI,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACR,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;oBACvC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC5B,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE;oBAC5E,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC3B;gBACD,QAAQ,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC;gBAChD,oBAAoB,EAAE,KAAK;aAC9B;YACD;gBACI,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACR,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,EAAE;oBAC9C,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC1B,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC5B;gBACD,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC;gBACnC,oBAAoB,EAAE,KAAK;aAC9B;SACJ;KACJ;CACJ,CAAC;AAEF;;;GAGG;AACU,QAAA,uCAAuC,GAAG,8JAA8J,CAAC;AAEtN;;;GAGG;AACU,QAAA,wBAAwB,GAA4B;IAC7D,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACR,OAAO,EAAE,yBAAiB;KAC7B;IACD,QAAQ,EAAE,CAAC,SAAS,CAAC;IACrB,oBAAoB,EAAE,KAAK;CAC9B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/connectors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,YAAY,EACR,YAAY,EACZ,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACvB,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/connectors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACzE,YAAY,EACR,YAAY,EACZ,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACvB,MAAM,SAAS,CAAC"}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CONNECTOR_REGISTRY = void 0;
3
+ exports.getConnectorRegistry = exports.loadConnectorRegistry = void 0;
4
4
  var registry_1 = require("./registry");
5
- Object.defineProperty(exports, "CONNECTOR_REGISTRY", { enumerable: true, get: function () { return registry_1.CONNECTOR_REGISTRY; } });
5
+ Object.defineProperty(exports, "loadConnectorRegistry", { enumerable: true, get: function () { return registry_1.loadConnectorRegistry; } });
6
+ Object.defineProperty(exports, "getConnectorRegistry", { enumerable: true, get: function () { return registry_1.getConnectorRegistry; } });
6
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/connectors/index.ts"],"names":[],"mappings":";;;AAAA,uCAAgD;AAAvC,8GAAA,kBAAkB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/connectors/index.ts"],"names":[],"mappings":";;;AAAA,uCAAyE;AAAhE,iHAAA,qBAAqB,OAAA;AAAE,gHAAA,oBAAoB,OAAA"}
@@ -1,3 +1,4 @@
1
1
  import { ConnectorDefinition } from './types';
2
- export declare const CONNECTOR_REGISTRY: ConnectorDefinition[];
2
+ export declare function loadConnectorRegistry(connectorsDirs: string[]): ConnectorDefinition[];
3
+ export declare function getConnectorRegistry(connectorsDirs?: string[]): ConnectorDefinition[];
3
4
  //# sourceMappingURL=registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/connectors/registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAiB,MAAM,SAAS,CAAC;AAc7D,eAAO,MAAM,kBAAkB,EAAE,mBAAmB,EAKH,CAAC"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/connectors/registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAiB,MAAM,SAAS,CAAC;AAY7D,wBAAgB,qBAAqB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,mBAAmB,EAAE,CAgBrF;AAID,wBAAgB,oBAAoB,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,mBAAmB,EAAE,CAOrF"}
@@ -23,10 +23,9 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.CONNECTOR_REGISTRY = void 0;
26
+ exports.getConnectorRegistry = exports.loadConnectorRegistry = void 0;
27
27
  const fs = __importStar(require("fs"));
28
28
  const path = __importStar(require("path"));
29
- const connectorsDir = __dirname;
30
29
  function loadConnectorJson(dir) {
31
30
  const file = path.join(dir, 'connector.json');
32
31
  if (!fs.existsSync(file))
@@ -37,10 +36,34 @@ function loadConnectorJson(dir) {
37
36
  hints: raw.hints ? raw.hints.join('\n') : undefined
38
37
  };
39
38
  }
40
- exports.CONNECTOR_REGISTRY = fs
41
- .readdirSync(connectorsDir, { withFileTypes: true })
42
- .filter(d => d.isDirectory())
43
- .map(d => loadConnectorJson(path.join(connectorsDir, d.name)))
44
- .filter((d) => d !== null)
45
- .sort((a, b) => a.name.localeCompare(b.name));
39
+ function loadConnectorRegistry(connectorsDirs) {
40
+ const seen = new Set();
41
+ const results = [];
42
+ for (const dir of connectorsDirs) {
43
+ if (!fs.existsSync(dir))
44
+ continue;
45
+ const entries = fs.readdirSync(dir, { withFileTypes: true })
46
+ .filter(d => d.isDirectory());
47
+ for (const d of entries) {
48
+ const def = loadConnectorJson(path.join(dir, d.name));
49
+ if (def && !seen.has(def.id)) {
50
+ seen.add(def.id);
51
+ results.push(def);
52
+ }
53
+ }
54
+ }
55
+ return results.sort((a, b) => a.name.localeCompare(b.name));
56
+ }
57
+ exports.loadConnectorRegistry = loadConnectorRegistry;
58
+ let _registry;
59
+ let _registryKey;
60
+ function getConnectorRegistry(connectorsDirs) {
61
+ const key = connectorsDirs ? connectorsDirs.join('|') : undefined;
62
+ if (!_registry || (connectorsDirs && key !== _registryKey)) {
63
+ _registry = loadConnectorRegistry(connectorsDirs ?? [path.join(__dirname, '../../service-connectors')]);
64
+ _registryKey = key;
65
+ }
66
+ return _registry;
67
+ }
68
+ exports.getConnectorRegistry = getConnectorRegistry;
46
69
  //# sourceMappingURL=registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/connectors/registry.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAG7B,MAAM,aAAa,GAAG,SAAS,CAAC;AAEhC,SAAS,iBAAiB,CAAC,GAAW;IAClC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAC9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,GAAG,GAAkB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACtE,OAAO;QACH,GAAG,GAAG;QACN,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KACtD,CAAC;AACN,CAAC;AAEY,QAAA,kBAAkB,GAA0B,EAAE;KACtD,WAAW,CAAC,aAAa,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;KACnD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;KAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;KAC7D,MAAM,CAAC,CAAC,CAAC,EAA4B,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;KACnD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/connectors/registry.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAG7B,SAAS,iBAAiB,CAAC,GAAW;IAClC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAC9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,GAAG,GAAkB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACtE,OAAO;QACH,GAAG,GAAG;QACN,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KACtD,CAAC;AACN,CAAC;AAED,SAAgB,qBAAqB,CAAC,cAAwB;IAC1D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,OAAO,GAA0B,EAAE,CAAC;IAC1C,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE;QAC9B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAClC,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;aACvD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;YACrB,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACtD,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACjB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aACrB;SACJ;KACJ;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAChE,CAAC;AAhBD,sDAgBC;AAED,IAAI,SAA4C,CAAC;AACjD,IAAI,YAAgC,CAAC;AACrC,SAAgB,oBAAoB,CAAC,cAAyB;IAC1D,MAAM,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAClE,IAAI,CAAC,SAAS,IAAI,CAAC,cAAc,IAAI,GAAG,KAAK,YAAY,CAAC,EAAE;QACxD,SAAS,GAAG,qBAAqB,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,0BAA0B,CAAC,CAAC,CAAC,CAAC;QACxG,YAAY,GAAG,GAAG,CAAC;KACtB;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAPD,oDAOC"}
@@ -0,0 +1,57 @@
1
+ import { Application } from 'express';
2
+ import { SynthOSConfig } from '../init';
3
+ import { ContextSection } from '../builders/types';
4
+ export type RouteInstaller = (config: SynthOSConfig, app: Application) => void;
5
+ export declare class Customizer {
6
+ protected disabled: Set<string>;
7
+ protected extraRoutes: RouteInstaller[];
8
+ /** Route hints for the LLM prompt (fork developers can add custom hints). */
9
+ protected routeHintEntries: {
10
+ hints: string;
11
+ }[];
12
+ /** Custom instructions appended to transformPage's instruction block. */
13
+ protected customTransformInstructions: string[];
14
+ /** Custom context sections appended to the builder's additional sections. */
15
+ protected customContextSections: ContextSection[];
16
+ /** Name of the local data folder created in the user's project directory. */
17
+ get localFolder(): string;
18
+ /** Folders containing built-in system pages (builder, settings, etc.) */
19
+ get requiredPagesFolders(): string[];
20
+ /** Folders containing starter page templates copied on init */
21
+ get defaultPagesFolders(): string[];
22
+ /** Folders containing theme CSS/JSON files */
23
+ get defaultThemesFolders(): string[];
24
+ /** Folders containing versioned static files (page-v2.js, helpers-v2.js, etc.) */
25
+ get staticFilesFolders(): string[];
26
+ /** Folders containing connector JSON definitions */
27
+ get serviceConnectorsFolders(): string[];
28
+ /** Folders containing default scripts copied on init */
29
+ get defaultScriptsFolders(): string[];
30
+ /** Route path for the "browse all pages/tabs" listing page.
31
+ * Override in a derived class to change the redirect target for outdated pages. */
32
+ get tabsListRoute(): string;
33
+ /** Product name used in LLM prompts and branding strings.
34
+ * Override in a derived class for white-labeling. */
35
+ get productName(): string;
36
+ disable(...groups: string[]): this;
37
+ enable(...groups: string[]): this;
38
+ isEnabled(group: string): boolean;
39
+ addRoutes(...installers: (RouteInstaller | {
40
+ installer: RouteInstaller;
41
+ hints: string;
42
+ })[]): this;
43
+ getExtraRoutes(): RouteInstaller[];
44
+ /** Add route hints that will be shown to the LLM in transformPage. */
45
+ addRouteHints(...hints: string[]): this;
46
+ /** Get all custom route hints. */
47
+ getRouteHints(): string[];
48
+ /** Add custom instructions for the transformPage LLM prompt. */
49
+ addTransformInstructions(...instructions: string[]): this;
50
+ /** Get custom transform instructions. */
51
+ getTransformInstructions(): string[];
52
+ /** Add custom context sections for the builder. */
53
+ addContextSections(...sections: ContextSection[]): this;
54
+ /** Get custom context sections. */
55
+ getContextSections(): ContextSection[];
56
+ }
57
+ //# sourceMappingURL=Customizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Customizer.d.ts","sourceRoot":"","sources":["../../src/customizer/Customizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;AAE/E,qBAAa,UAAU;IACnB,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IAC5C,SAAS,CAAC,WAAW,EAAE,cAAc,EAAE,CAAM;IAE7C,6EAA6E;IAC7E,SAAS,CAAC,gBAAgB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAM;IAErD,yEAAyE;IACzE,SAAS,CAAC,2BAA2B,EAAE,MAAM,EAAE,CAAM;IAErD,6EAA6E;IAC7E,SAAS,CAAC,qBAAqB,EAAE,cAAc,EAAE,CAAM;IAKvD,6EAA6E;IAC7E,IAAI,WAAW,IAAI,MAAM,CAExB;IASD,yEAAyE;IACzE,IAAI,oBAAoB,IAAI,MAAM,EAAE,CAEnC;IAED,+DAA+D;IAC/D,IAAI,mBAAmB,IAAI,MAAM,EAAE,CAElC;IAED,8CAA8C;IAC9C,IAAI,oBAAoB,IAAI,MAAM,EAAE,CAEnC;IAED,kFAAkF;IAClF,IAAI,kBAAkB,IAAI,MAAM,EAAE,CAEjC;IAED,oDAAoD;IACpD,IAAI,wBAAwB,IAAI,MAAM,EAAE,CAEvC;IAED,wDAAwD;IACxD,IAAI,qBAAqB,IAAI,MAAM,EAAE,CAEpC;IAED;wFACoF;IACpF,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED;0DACsD;IACtD,IAAI,WAAW,IAAI,MAAM,CAExB;IAMD,OAAO,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAKlC,MAAM,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAKjC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAMjC,SAAS,CAAC,GAAG,UAAU,EAAE,CAAC,cAAc,GAAG;QAAE,SAAS,EAAE,cAAc,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,GAAG,IAAI;IAYjG,cAAc,IAAI,cAAc,EAAE;IAMlC,sEAAsE;IACtE,aAAa,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAKvC,kCAAkC;IAClC,aAAa,IAAI,MAAM,EAAE;IAMzB,gEAAgE;IAChE,wBAAwB,CAAC,GAAG,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI;IAKzD,yCAAyC;IACzC,wBAAwB,IAAI,MAAM,EAAE;IAMpC,mDAAmD;IACnD,kBAAkB,CAAC,GAAG,QAAQ,EAAE,cAAc,EAAE,GAAG,IAAI;IAKvD,mCAAmC;IACnC,kBAAkB,IAAI,cAAc,EAAE;CAGzC"}
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Customizer = void 0;
4
+ class Customizer {
5
+ disabled = new Set();
6
+ extraRoutes = [];
7
+ /** Route hints for the LLM prompt (fork developers can add custom hints). */
8
+ routeHintEntries = [];
9
+ /** Custom instructions appended to transformPage's instruction block. */
10
+ customTransformInstructions = [];
11
+ /** Custom context sections appended to the builder's additional sections. */
12
+ customContextSections = [];
13
+ // --- Local data folder ---
14
+ // Override in a derived class to change the local project folder name.
15
+ /** Name of the local data folder created in the user's project directory. */
16
+ get localFolder() {
17
+ return '.synthos';
18
+ }
19
+ // --- Content folder paths ---
20
+ // Override these in a derived class to point to your fork's folders.
21
+ // Each getter returns `string[]`. The sentinel value `'default'` is
22
+ // resolved by `createConfig()` to the built-in SynthOS folder for that
23
+ // getter. Forks can return additional paths alongside (or instead of)
24
+ // `'default'` to layer custom folders.
25
+ /** Folders containing built-in system pages (builder, settings, etc.) */
26
+ get requiredPagesFolders() {
27
+ return ['default'];
28
+ }
29
+ /** Folders containing starter page templates copied on init */
30
+ get defaultPagesFolders() {
31
+ return ['default'];
32
+ }
33
+ /** Folders containing theme CSS/JSON files */
34
+ get defaultThemesFolders() {
35
+ return ['default'];
36
+ }
37
+ /** Folders containing versioned static files (page-v2.js, helpers-v2.js, etc.) */
38
+ get staticFilesFolders() {
39
+ return ['default'];
40
+ }
41
+ /** Folders containing connector JSON definitions */
42
+ get serviceConnectorsFolders() {
43
+ return ['default'];
44
+ }
45
+ /** Folders containing default scripts copied on init */
46
+ get defaultScriptsFolders() {
47
+ return ['default'];
48
+ }
49
+ /** Route path for the "browse all pages/tabs" listing page.
50
+ * Override in a derived class to change the redirect target for outdated pages. */
51
+ get tabsListRoute() {
52
+ return '/pages';
53
+ }
54
+ /** Product name used in LLM prompts and branding strings.
55
+ * Override in a derived class for white-labeling. */
56
+ get productName() {
57
+ return 'SynthOS';
58
+ }
59
+ // --- Feature group control ---
60
+ // Built-in groups: 'pages', 'api', 'connectors', 'agents',
61
+ // 'data', 'brainstorm', 'search', 'scripts'
62
+ disable(...groups) {
63
+ for (const g of groups)
64
+ this.disabled.add(g);
65
+ return this;
66
+ }
67
+ enable(...groups) {
68
+ for (const g of groups)
69
+ this.disabled.delete(g);
70
+ return this;
71
+ }
72
+ isEnabled(group) {
73
+ return !this.disabled.has(group);
74
+ }
75
+ // --- Custom routes ---
76
+ addRoutes(...installers) {
77
+ for (const entry of installers) {
78
+ if (typeof entry === 'function') {
79
+ this.extraRoutes.push(entry);
80
+ }
81
+ else {
82
+ this.extraRoutes.push(entry.installer);
83
+ this.routeHintEntries.push({ hints: entry.hints });
84
+ }
85
+ }
86
+ return this;
87
+ }
88
+ getExtraRoutes() {
89
+ return this.extraRoutes;
90
+ }
91
+ // --- Route hints ---
92
+ /** Add route hints that will be shown to the LLM in transformPage. */
93
+ addRouteHints(...hints) {
94
+ for (const h of hints)
95
+ this.routeHintEntries.push({ hints: h });
96
+ return this;
97
+ }
98
+ /** Get all custom route hints. */
99
+ getRouteHints() {
100
+ return this.routeHintEntries.map(e => e.hints);
101
+ }
102
+ // --- Custom transform instructions ---
103
+ /** Add custom instructions for the transformPage LLM prompt. */
104
+ addTransformInstructions(...instructions) {
105
+ this.customTransformInstructions.push(...instructions);
106
+ return this;
107
+ }
108
+ /** Get custom transform instructions. */
109
+ getTransformInstructions() {
110
+ return this.customTransformInstructions;
111
+ }
112
+ // --- Custom context sections ---
113
+ /** Add custom context sections for the builder. */
114
+ addContextSections(...sections) {
115
+ this.customContextSections.push(...sections);
116
+ return this;
117
+ }
118
+ /** Get custom context sections. */
119
+ getContextSections() {
120
+ return this.customContextSections;
121
+ }
122
+ }
123
+ exports.Customizer = Customizer;
124
+ //# sourceMappingURL=Customizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Customizer.js","sourceRoot":"","sources":["../../src/customizer/Customizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/customizer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,eAAO,MAAM,UAAU,YAAmB,CAAC"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.customizer = exports.Customizer = void 0;
4
+ var Customizer_1 = require("./Customizer");
5
+ Object.defineProperty(exports, "Customizer", { enumerable: true, get: function () { return Customizer_1.Customizer; } });
6
+ const Customizer_2 = require("./Customizer");
7
+ // Default instance — replace with an App specific customizer
8
+ exports.customizer = new Customizer_2.Customizer();
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/customizer/index.ts"],"names":[],"mappings":";;;AAAA,2CAA0D;AAAjD,wGAAA,UAAU,OAAA;AACnB,6CAA0C;AAE1C,6DAA6D;AAChD,QAAA,UAAU,GAAG,IAAI,uBAAU,EAAE,CAAC"}
package/dist/files.d.ts CHANGED
@@ -9,4 +9,20 @@ export declare function saveFile(path: string, content: string): Promise<void>;
9
9
  export declare function deleteFile(path: string): Promise<void>;
10
10
  export declare function copyFolderRecursive(srcFolder: string, destFolder: string): Promise<void>;
11
11
  export declare function deleteFolder(dirPath: string): Promise<void>;
12
+ /**
13
+ * Search folders in order, return the full path to the first existing match
14
+ * for the given filename.
15
+ */
16
+ export declare function findFileInFolders(folders: string[], filename: string): Promise<string | undefined>;
17
+ /**
18
+ * Merge file listings from multiple folders. First folder takes priority on
19
+ * name collisions (earlier occurrence wins).
20
+ */
21
+ export declare function listFilesFromFolders(folders: string[]): Promise<string[]>;
22
+ /**
23
+ * Copy files from multiple source folders into a single destination.
24
+ * First folder takes priority on duplicate filenames (copy is skipped
25
+ * if the file already exists in dest from an earlier folder).
26
+ */
27
+ export declare function copyFilesFromFolders(folders: string[], destFolder: string): Promise<void>;
12
28
  //# sourceMappingURL=files.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOlE;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKjF;AAED,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASpF;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpE;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAE/D;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAKpE;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE5D;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3E;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5D;AAED,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY9F;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjE"}
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOlE;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKjF;AAED,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASpF;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpE;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAE/D;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAKpE;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE5D;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3E;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5D;AAED,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY9F;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjE;AAID;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAQxG;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAc/E;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAc/F"}
package/dist/files.js CHANGED
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.deleteFolder = exports.copyFolderRecursive = exports.deleteFile = exports.saveFile = exports.loadFile = exports.listFolders = exports.listFiles = exports.ensureFolderExists = exports.copyFiles = exports.copyFile = exports.checkIfExists = void 0;
29
+ exports.copyFilesFromFolders = exports.listFilesFromFolders = exports.findFileInFolders = exports.deleteFolder = exports.copyFolderRecursive = exports.deleteFile = exports.saveFile = exports.loadFile = exports.listFolders = exports.listFiles = exports.ensureFolderExists = exports.copyFiles = exports.copyFile = exports.checkIfExists = void 0;
30
30
  const fs = __importStar(require("fs/promises"));
31
31
  const path_1 = __importDefault(require("path"));
32
32
  async function checkIfExists(path) {
@@ -102,4 +102,63 @@ async function deleteFolder(dirPath) {
102
102
  await fs.rm(dirPath, { recursive: true });
103
103
  }
104
104
  exports.deleteFolder = deleteFolder;
105
+ // --- Multi-folder helpers ---
106
+ /**
107
+ * Search folders in order, return the full path to the first existing match
108
+ * for the given filename.
109
+ */
110
+ async function findFileInFolders(folders, filename) {
111
+ for (const folder of folders) {
112
+ const candidate = path_1.default.join(folder, filename);
113
+ if (await checkIfExists(candidate)) {
114
+ return candidate;
115
+ }
116
+ }
117
+ return undefined;
118
+ }
119
+ exports.findFileInFolders = findFileInFolders;
120
+ /**
121
+ * Merge file listings from multiple folders. First folder takes priority on
122
+ * name collisions (earlier occurrence wins).
123
+ */
124
+ async function listFilesFromFolders(folders) {
125
+ const seen = new Set();
126
+ const result = [];
127
+ for (const folder of folders) {
128
+ if (!await checkIfExists(folder))
129
+ continue;
130
+ const files = await listFiles(folder);
131
+ for (const f of files) {
132
+ if (!seen.has(f)) {
133
+ seen.add(f);
134
+ result.push(f);
135
+ }
136
+ }
137
+ }
138
+ return result;
139
+ }
140
+ exports.listFilesFromFolders = listFilesFromFolders;
141
+ /**
142
+ * Copy files from multiple source folders into a single destination.
143
+ * First folder takes priority on duplicate filenames (copy is skipped
144
+ * if the file already exists in dest from an earlier folder).
145
+ */
146
+ async function copyFilesFromFolders(folders, destFolder) {
147
+ await ensureFolderExists(destFolder);
148
+ const copied = new Set();
149
+ for (const folder of folders) {
150
+ if (!await checkIfExists(folder))
151
+ continue;
152
+ const files = await fs.readdir(folder);
153
+ for (const file of files) {
154
+ if (copied.has(file))
155
+ continue;
156
+ copied.add(file);
157
+ const srcPath = path_1.default.join(folder, file);
158
+ const destPath = path_1.default.join(destFolder, file);
159
+ await fs.copyFile(srcPath, destPath);
160
+ }
161
+ }
162
+ }
163
+ exports.copyFilesFromFolders = copyFilesFromFolders;
105
164
  //# sourceMappingURL=files.js.map