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,227 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseBuilderResponse = exports.buildWithModel = exports.createAnthropicBuilder = exports.classifyRequest = void 0;
4
+ const models_1 = require("../models");
5
+ const transformPage_1 = require("../service/transformPage");
6
+ const types_1 = require("./types");
7
+ const CLASSIFIER_SYSTEM_PROMPT = `You classify user messages for a web page builder. Default to a change request. Only classify as "question" when the user is purely asking for information with zero implication that anything should change.
8
+
9
+ <DECISION_RULES>
10
+ Step 1 — Is this a pure information question with zero change implication?
11
+ Examples: "What color is the header?", "How many sections are there?", "What font is the title using?"
12
+ Yes, and there is absolutely no suggestion that anything should change → "question"
13
+ No → go to step 2.
14
+
15
+ Step 2 — Classify complexity:
16
+ "easy-change": Text edits, color/style tweaks, toggling visibility, adding/removing a single element, minor CSS changes.
17
+ "medium-change": Modifying existing JS logic, updating event handlers, changing multiple related styles, adding a small feature to existing functionality, updating existing behavior.
18
+ "hard-change": Complex new features, significant new JS, games, animations, restructuring layout, forms with validation, multi-step work.
19
+ "re-write": Complete page overhaul, fundamental restructure, "start over", "rebuild", "redo the whole page".
20
+
21
+ <OUTPUT_FORMAT>
22
+ Return only JSON. No other text.
23
+ - Change: { "classification": "easy-change" } or { "classification": "medium-change" } or { "classification": "hard-change" } or { "classification": "re-write" }
24
+ - Question: { "classification": "question", "answer": "<brief answer>" }`;
25
+ async function classifyRequest(apiKey, pageHtml, userMessage) {
26
+ try {
27
+ const sonnet = (0, models_1.anthropic)({ apiKey, model: 'claude-sonnet-4-5' });
28
+ const result = await sonnet({
29
+ system: { role: 'system', content: CLASSIFIER_SYSTEM_PROMPT },
30
+ prompt: { role: 'user', content: `<PAGE_HTML>\n${pageHtml}\n\n<USER_MESSAGE>\n${userMessage}` },
31
+ jsonMode: true,
32
+ });
33
+ if (!result.completed || !result.value) {
34
+ return { classification: 'hard-change' };
35
+ }
36
+ const parsed = JSON.parse(result.value);
37
+ const c = parsed.classification;
38
+ if (c === 'question') {
39
+ return { classification: 'question', answer: typeof parsed.answer === 'string' ? parsed.answer : '' };
40
+ }
41
+ if (c === 'easy-change' || c === 'medium-change' || c === 'hard-change' || c === 're-write') {
42
+ return { classification: c };
43
+ }
44
+ return { classification: 'hard-change' };
45
+ }
46
+ catch {
47
+ return { classification: 'hard-change' };
48
+ }
49
+ }
50
+ exports.classifyRequest = classifyRequest;
51
+ // ---------------------------------------------------------------------------
52
+ // Anthropic builder factory
53
+ // ---------------------------------------------------------------------------
54
+ /**
55
+ * Create an Anthropic-tuned builder.
56
+ *
57
+ * @param complete The completePrompt function (already configured with API key / model).
58
+ * @param userInstructions Optional user-level instructions from settings.
59
+ * @param productName Product name for branding in prompts (defaults to 'SynthOS').
60
+ * @param options Optional API key and model name for classifier routing.
61
+ */
62
+ function createAnthropicBuilder(complete, userInstructions, productName, options) {
63
+ const name = productName ?? 'SynthOS';
64
+ return {
65
+ async run(currentPage, additionalSections, userMessage, newBuild, attachments) {
66
+ try {
67
+ const isOpus = options?.model?.startsWith('claude-opus-');
68
+ const noRanged = types_1.CHANGE_OPS_SCHEMA_NO_RANGED;
69
+ // Non-Opus models or missing apiKey: existing behavior
70
+ if (!isOpus || !options?.apiKey) {
71
+ return buildWithModel(complete, currentPage, additionalSections, userMessage, userInstructions, name, attachments);
72
+ }
73
+ // Console errors bypass classification — always route to Opus with no ranged writes
74
+ if (userMessage.includes('CONSOLE_ERRORS:')) {
75
+ console.log('classifyRequest: console errors detected → routing to ' + options.model + ' (no ranged)');
76
+ return buildWithModel(complete, currentPage, additionalSections, userMessage, userInstructions, name, attachments, noRanged);
77
+ }
78
+ // New builds always use Opus with no ranged writes
79
+ if (newBuild) {
80
+ console.log('classifyRequest: new build → routing to ' + options.model + ' (no ranged)');
81
+ return buildWithModel(complete, currentPage, additionalSections, userMessage, userInstructions, name, attachments, noRanged);
82
+ }
83
+ // First edit to a saved page (v0→v1) — force Opus with no ranged writes
84
+ if (options?.isFirstEdit) {
85
+ console.log('classifyRequest: first edit (v0→v1) → routing to ' + options.model + ' (no ranged)');
86
+ return buildWithModel(complete, currentPage, additionalSections, userMessage, userInstructions, name, attachments, noRanged);
87
+ }
88
+ // Try again — force Opus with no ranged writes, skip classification
89
+ if (options?.tryAgain) {
90
+ console.log('classifyRequest: try again → routing to claude-opus-4-6 (no ranged)');
91
+ let opus = (0, models_1.anthropic)({ apiKey: options.apiKey, model: 'claude-opus-4-6' });
92
+ if (options.wrapModel)
93
+ opus = options.wrapModel(opus);
94
+ return buildWithModel(opus, currentPage, additionalSections, userMessage, userInstructions, name, attachments, noRanged);
95
+ }
96
+ // Classify the request using Sonnet
97
+ const classifyResult = await classifyRequest(options.apiKey, currentPage.content, userMessage);
98
+ console.log(`classifyRequest: "${classifyResult.classification}" → routing to ${routeLabel(classifyResult.classification, options.model)}`);
99
+ // Questions — answer was already provided by the classifier
100
+ if (classifyResult.classification === 'question') {
101
+ return { kind: 'reply', text: classifyResult.answer ?? '' };
102
+ }
103
+ // Easy changes use Sonnet with default schema (ranged allowed)
104
+ if (classifyResult.classification === 'easy-change') {
105
+ let sonnet = (0, models_1.anthropic)({ apiKey: options.apiKey, model: 'claude-sonnet-4-5' });
106
+ if (options.wrapModel)
107
+ sonnet = options.wrapModel(sonnet);
108
+ return buildWithModel(sonnet, currentPage, additionalSections, userMessage, userInstructions, name, attachments);
109
+ }
110
+ // Medium changes use Sonnet with no ranged writes
111
+ if (classifyResult.classification === 'medium-change') {
112
+ let sonnet = (0, models_1.anthropic)({ apiKey: options.apiKey, model: 'claude-sonnet-4-5' });
113
+ if (options.wrapModel)
114
+ sonnet = options.wrapModel(sonnet);
115
+ return buildWithModel(sonnet, currentPage, additionalSections, userMessage, userInstructions, name, attachments, noRanged);
116
+ }
117
+ // Hard changes and re-writes use Opus with no ranged writes
118
+ return buildWithModel(complete, currentPage, additionalSections, userMessage, userInstructions, name, attachments, noRanged);
119
+ }
120
+ catch (err) {
121
+ return { kind: 'error', error: err instanceof Error ? err : new Error(String(err)) };
122
+ }
123
+ }
124
+ };
125
+ }
126
+ exports.createAnthropicBuilder = createAnthropicBuilder;
127
+ // ---------------------------------------------------------------------------
128
+ // Build flow — shared prompt construction + model call + parsing
129
+ // ---------------------------------------------------------------------------
130
+ async function buildWithModel(model, currentPage, additionalSections, userMessage, userInstructions, productName, attachments, outputSchema) {
131
+ // -- System message: all static content (cacheable) --
132
+ const systemParts = [];
133
+ for (const section of additionalSections) {
134
+ if (section.content) {
135
+ systemParts.push(`${section.title}\n${section.content}`);
136
+ }
137
+ }
138
+ const instructionParts = [];
139
+ if (userInstructions?.trim()) {
140
+ instructionParts.push(userInstructions);
141
+ }
142
+ for (const section of additionalSections) {
143
+ if (section.instructions?.trim()) {
144
+ instructionParts.push(section.instructions);
145
+ }
146
+ }
147
+ instructionParts.push((0, transformPage_1.getTransformInstr)(productName));
148
+ const instructions = instructionParts.filter(s => s.trim() !== '').join('\n');
149
+ systemParts.push(`<INSTRUCTIONS>\n${instructions}`);
150
+ const systemContent = systemParts.join('\n\n');
151
+ // -- User message: dynamic content only (current page + user message) --
152
+ const promptText = `${currentPage.title}\n${currentPage.content}\n\n<USER_MESSAGE>\n${userMessage}`;
153
+ // Build prompt content — multimodal when image attachments are present
154
+ const imageAttachments = (attachments ?? []).filter(a => a.mediaType.startsWith('image/'));
155
+ let promptContent;
156
+ if (imageAttachments.length > 0) {
157
+ const blocks = [{ type: 'text', text: promptText }];
158
+ for (const att of imageAttachments) {
159
+ blocks.push({ type: 'image', mediaType: att.mediaType, data: att.data });
160
+ }
161
+ promptContent = blocks;
162
+ }
163
+ else {
164
+ promptContent = promptText;
165
+ }
166
+ // -- Call model --
167
+ const result = await model({
168
+ system: { role: 'system', content: systemContent },
169
+ prompt: { role: 'user', content: promptContent },
170
+ cacheSystem: true,
171
+ outputSchema: outputSchema ?? types_1.CHANGE_OPS_SCHEMA,
172
+ });
173
+ if (!result.completed) {
174
+ return { kind: 'error', error: result.error ?? new Error('Model call failed') };
175
+ }
176
+ // -- Parse response --
177
+ return parseBuilderResponse(result.value);
178
+ }
179
+ exports.buildWithModel = buildWithModel;
180
+ // ---------------------------------------------------------------------------
181
+ // Route label for console logging
182
+ // ---------------------------------------------------------------------------
183
+ function routeLabel(classification, configuredModel) {
184
+ if (classification === 'question')
185
+ return 'classifier (answered inline)';
186
+ if (classification === 'easy-change')
187
+ return 'claude-sonnet-4-5';
188
+ if (classification === 'medium-change')
189
+ return 'claude-sonnet-4-5 (no ranged)';
190
+ if (classification === 're-write')
191
+ return configuredModel + ' (re-write)';
192
+ return configuredModel + ' (no ranged)';
193
+ }
194
+ // ---------------------------------------------------------------------------
195
+ // Response parsing — shared across builders
196
+ // ---------------------------------------------------------------------------
197
+ function parseBuilderResponse(raw) {
198
+ // Try parsing as a JSON object with a kind discriminator
199
+ try {
200
+ const parsed = JSON.parse(raw);
201
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
202
+ if (parsed.kind === 'transforms' && Array.isArray(parsed.changes)) {
203
+ return { kind: 'transforms', changes: parsed.changes };
204
+ }
205
+ if (parsed.kind === 'reply' && typeof parsed.text === 'string') {
206
+ return { kind: 'reply', text: parsed.text };
207
+ }
208
+ }
209
+ // Bare array — backward compat
210
+ if (Array.isArray(parsed)) {
211
+ return { kind: 'transforms', changes: parsed };
212
+ }
213
+ }
214
+ catch {
215
+ // fall through to parseChangeList extraction
216
+ }
217
+ // Fall back to extracting a JSON array from the response text
218
+ try {
219
+ const changes = (0, transformPage_1.parseChangeList)(raw);
220
+ return { kind: 'transforms', changes };
221
+ }
222
+ catch {
223
+ return { kind: 'error', error: new Error('Failed to parse model response as JSON') };
224
+ }
225
+ }
226
+ exports.parseBuilderResponse = parseBuilderResponse;
227
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/builders/anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { completePrompt } from '../models';
2
+ import { Builder } from './types';
3
+ /**
4
+ * Create a FireworksAI-tuned builder.
5
+ * Currently identical to the Anthropic builder — separate file enables
6
+ * future per-provider tuning.
7
+ */
8
+ export declare function createFireworksAIBuilder(complete: completePrompt, userInstructions?: string, productName?: string): Builder;
9
+ //# sourceMappingURL=fireworksai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fireworksai.d.ts","sourceRoot":"","sources":["../../src/builders/fireworksai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG3C,OAAO,EAAE,OAAO,EAAgD,MAAM,SAAS,CAAC;AAEhF;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,cAAc,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAgD3H"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createFireworksAIBuilder = void 0;
4
+ const transformPage_1 = require("../service/transformPage");
5
+ const anthropic_1 = require("./anthropic");
6
+ const types_1 = require("./types");
7
+ /**
8
+ * Create a FireworksAI-tuned builder.
9
+ * Currently identical to the Anthropic builder — separate file enables
10
+ * future per-provider tuning.
11
+ */
12
+ function createFireworksAIBuilder(complete, userInstructions, productName) {
13
+ const name = productName ?? 'SynthOS';
14
+ return {
15
+ async run(currentPage, additionalSections, userMessage, newBuild, _attachments) {
16
+ try {
17
+ // -- System message --
18
+ const systemParts = [
19
+ `${currentPage.title}\n${currentPage.content}`,
20
+ ];
21
+ for (const section of additionalSections) {
22
+ if (section.content) {
23
+ systemParts.push(`${section.title}\n${section.content}`);
24
+ }
25
+ }
26
+ const systemContent = systemParts.join('\n\n');
27
+ // -- User message --
28
+ const instructionParts = [];
29
+ if (userInstructions?.trim()) {
30
+ instructionParts.push(userInstructions);
31
+ }
32
+ for (const section of additionalSections) {
33
+ if (section.instructions?.trim()) {
34
+ instructionParts.push(section.instructions);
35
+ }
36
+ }
37
+ instructionParts.push((0, transformPage_1.getTransformInstr)(name));
38
+ instructionParts.push(types_1.CHANGE_OPS_FORMAT_INSTRUCTION);
39
+ const instructions = instructionParts.filter(s => s.trim() !== '').join('\n');
40
+ const promptContent = `<USER_MESSAGE>\n${userMessage}\n\n<INSTRUCTIONS>\n${instructions}`;
41
+ const result = await complete({
42
+ system: { role: 'system', content: systemContent },
43
+ prompt: { role: 'user', content: promptContent },
44
+ });
45
+ if (!result.completed) {
46
+ return { kind: 'error', error: result.error ?? new Error('Model call failed') };
47
+ }
48
+ return (0, anthropic_1.parseBuilderResponse)(result.value);
49
+ }
50
+ catch (err) {
51
+ return { kind: 'error', error: err instanceof Error ? err : new Error(String(err)) };
52
+ }
53
+ }
54
+ };
55
+ }
56
+ exports.createFireworksAIBuilder = createFireworksAIBuilder;
57
+ //# sourceMappingURL=fireworksai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fireworksai.js","sourceRoot":"","sources":["../../src/builders/fireworksai.ts"],"names":[],"mappings":";;;AACA,4DAA6D;AAC7D,2CAAmD;AACnD,mCAAgF;AAEhF;;;;GAIG;AACH,SAAgB,wBAAwB,CAAC,QAAwB,EAAE,gBAAyB,EAAE,WAAoB;IAC9G,MAAM,IAAI,GAAG,WAAW,IAAI,SAAS,CAAC;IAEtC,OAAO;QACH,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,kBAAkB,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAa;YAC3E,IAAI;gBACA,uBAAuB;gBACvB,MAAM,WAAW,GAAa;oBAC1B,GAAG,WAAW,CAAC,KAAK,KAAK,WAAW,CAAC,OAAO,EAAE;iBACjD,CAAC;gBACF,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE;oBACtC,IAAI,OAAO,CAAC,OAAO,EAAE;wBACjB,WAAW,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;qBAC5D;iBACJ;gBACD,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAE/C,qBAAqB;gBACrB,MAAM,gBAAgB,GAAa,EAAE,CAAC;gBACtC,IAAI,gBAAgB,EAAE,IAAI,EAAE,EAAE;oBAC1B,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;iBAC3C;gBACD,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE;oBACtC,IAAI,OAAO,CAAC,YAAY,EAAE,IAAI,EAAE,EAAE;wBAC9B,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;qBAC/C;iBACJ;gBACD,gBAAgB,CAAC,IAAI,CAAC,IAAA,iCAAiB,EAAC,IAAI,CAAC,CAAC,CAAC;gBAC/C,gBAAgB,CAAC,IAAI,CAAC,qCAA6B,CAAC,CAAC;gBAErD,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC9E,MAAM,aAAa,GAAG,mBAAmB,WAAW,uBAAuB,YAAY,EAAE,CAAC;gBAE1F,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC;oBAC1B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE;oBAClD,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE;iBACnD,CAAC,CAAC;gBAEH,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;oBACnB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC;iBACnF;gBAED,OAAO,IAAA,gCAAoB,EAAC,MAAM,CAAC,KAAM,CAAC,CAAC;aAC9C;YAAC,OAAO,GAAY,EAAE;gBACnB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;aACxF;QACL,CAAC;KACJ,CAAC;AACN,CAAC;AAhDD,4DAgDC"}
@@ -0,0 +1,13 @@
1
+ import { ProviderName, completePrompt } from '../models';
2
+ import { AnthropicBuilderOptions } from './anthropic';
3
+ import { Builder } from './types';
4
+ export { ContextSection, BuilderResult, Builder, Attachment } from './types';
5
+ export { createAnthropicBuilder, AnthropicBuilderOptions } from './anthropic';
6
+ export { createOpenAIBuilder } from './openai';
7
+ export { createFireworksAIBuilder } from './fireworksai';
8
+ export { parseBuilderResponse } from './anthropic';
9
+ /**
10
+ * Factory that creates a provider-specific builder.
11
+ */
12
+ export declare function createBuilder(provider: ProviderName, complete: completePrompt, userInstructions?: string, productName?: string, options?: AnthropicBuilderOptions): Builder;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/builders/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAA0B,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAG9E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD;;GAEG;AACH,wBAAgB,aAAa,CACzB,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,cAAc,EACxB,gBAAgB,CAAC,EAAE,MAAM,EACzB,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,uBAAuB,GAClC,OAAO,CAWT"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createBuilder = exports.parseBuilderResponse = exports.createFireworksAIBuilder = exports.createOpenAIBuilder = exports.createAnthropicBuilder = void 0;
4
+ const anthropic_1 = require("./anthropic");
5
+ const openai_1 = require("./openai");
6
+ const fireworksai_1 = require("./fireworksai");
7
+ var anthropic_2 = require("./anthropic");
8
+ Object.defineProperty(exports, "createAnthropicBuilder", { enumerable: true, get: function () { return anthropic_2.createAnthropicBuilder; } });
9
+ var openai_2 = require("./openai");
10
+ Object.defineProperty(exports, "createOpenAIBuilder", { enumerable: true, get: function () { return openai_2.createOpenAIBuilder; } });
11
+ var fireworksai_2 = require("./fireworksai");
12
+ Object.defineProperty(exports, "createFireworksAIBuilder", { enumerable: true, get: function () { return fireworksai_2.createFireworksAIBuilder; } });
13
+ var anthropic_3 = require("./anthropic");
14
+ Object.defineProperty(exports, "parseBuilderResponse", { enumerable: true, get: function () { return anthropic_3.parseBuilderResponse; } });
15
+ /**
16
+ * Factory that creates a provider-specific builder.
17
+ */
18
+ function createBuilder(provider, complete, userInstructions, productName, options) {
19
+ switch (provider) {
20
+ case 'Anthropic':
21
+ return (0, anthropic_1.createAnthropicBuilder)(complete, userInstructions, productName, options);
22
+ case 'OpenAI':
23
+ return (0, openai_1.createOpenAIBuilder)(complete, userInstructions, productName);
24
+ case 'FireworksAI':
25
+ return (0, fireworksai_1.createFireworksAIBuilder)(complete, userInstructions, productName);
26
+ default:
27
+ throw new Error(`Unknown provider: ${provider}`);
28
+ }
29
+ }
30
+ exports.createBuilder = createBuilder;
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/builders/index.ts"],"names":[],"mappings":";;;AACA,2CAA8E;AAC9E,qCAA+C;AAC/C,+CAAyD;AAIzD,yCAA8E;AAArE,mHAAA,sBAAsB,OAAA;AAC/B,mCAA+C;AAAtC,6GAAA,mBAAmB,OAAA;AAC5B,6CAAyD;AAAhD,uHAAA,wBAAwB,OAAA;AACjC,yCAAmD;AAA1C,iHAAA,oBAAoB,OAAA;AAE7B;;GAEG;AACH,SAAgB,aAAa,CACzB,QAAsB,EACtB,QAAwB,EACxB,gBAAyB,EACzB,WAAoB,EACpB,OAAiC;IAEjC,QAAQ,QAAQ,EAAE;QACd,KAAK,WAAW;YACZ,OAAO,IAAA,kCAAsB,EAAC,QAAQ,EAAE,gBAAgB,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QACpF,KAAK,QAAQ;YACT,OAAO,IAAA,4BAAmB,EAAC,QAAQ,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC;QACxE,KAAK,aAAa;YACd,OAAO,IAAA,sCAAwB,EAAC,QAAQ,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC;QAC7E;YACI,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;KACxD;AACL,CAAC;AAjBD,sCAiBC"}
@@ -0,0 +1,8 @@
1
+ import { completePrompt } from '../models';
2
+ import { Builder } from './types';
3
+ /**
4
+ * Create an OpenAI-tuned builder.
5
+ * Uses OpenAI structured outputs (json_schema) for reliable JSON responses.
6
+ */
7
+ export declare function createOpenAIBuilder(complete: completePrompt, userInstructions?: string, productName?: string): Builder;
8
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/builders/openai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAgB,MAAM,WAAW,CAAC;AAGzD,OAAO,EAAE,OAAO,EAA2C,MAAM,SAAS,CAAC;AAE3E;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CA8DtH"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createOpenAIBuilder = void 0;
4
+ const transformPage_1 = require("../service/transformPage");
5
+ const anthropic_1 = require("./anthropic");
6
+ const types_1 = require("./types");
7
+ /**
8
+ * Create an OpenAI-tuned builder.
9
+ * Uses OpenAI structured outputs (json_schema) for reliable JSON responses.
10
+ */
11
+ function createOpenAIBuilder(complete, userInstructions, productName) {
12
+ const name = productName ?? 'SynthOS';
13
+ return {
14
+ async run(currentPage, additionalSections, userMessage, newBuild, attachments) {
15
+ try {
16
+ // -- System message --
17
+ const systemParts = [
18
+ `${currentPage.title}\n${currentPage.content}`,
19
+ ];
20
+ for (const section of additionalSections) {
21
+ if (section.content) {
22
+ systemParts.push(`${section.title}\n${section.content}`);
23
+ }
24
+ }
25
+ const systemContent = systemParts.join('\n\n');
26
+ // -- User message --
27
+ const instructionParts = [];
28
+ if (userInstructions?.trim()) {
29
+ instructionParts.push(userInstructions);
30
+ }
31
+ for (const section of additionalSections) {
32
+ if (section.instructions?.trim()) {
33
+ instructionParts.push(section.instructions);
34
+ }
35
+ }
36
+ instructionParts.push((0, transformPage_1.getTransformInstr)(name));
37
+ const instructions = instructionParts.filter(s => s.trim() !== '').join('\n');
38
+ const promptText = `<USER_MESSAGE>\n${userMessage}\n\n<INSTRUCTIONS>\n${instructions}`;
39
+ // Build prompt content — multimodal when image attachments are present
40
+ const imageAttachments = (attachments ?? []).filter(a => a.mediaType.startsWith('image/'));
41
+ let promptContent;
42
+ if (imageAttachments.length > 0) {
43
+ const blocks = [{ type: 'text', text: promptText }];
44
+ for (const att of imageAttachments) {
45
+ blocks.push({ type: 'image', mediaType: att.mediaType, data: att.data });
46
+ }
47
+ promptContent = blocks;
48
+ }
49
+ else {
50
+ promptContent = promptText;
51
+ }
52
+ const result = await complete({
53
+ system: { role: 'system', content: systemContent },
54
+ prompt: { role: 'user', content: promptContent },
55
+ jsonSchema: types_1.OPENAI_CHANGE_OPS_SCHEMA,
56
+ });
57
+ if (!result.completed) {
58
+ return { kind: 'error', error: result.error ?? new Error('Model call failed') };
59
+ }
60
+ // Unwrap the { changes: [...] } envelope from structured output
61
+ return parseOpenAIResponse(result.value);
62
+ }
63
+ catch (err) {
64
+ return { kind: 'error', error: err instanceof Error ? err : new Error(String(err)) };
65
+ }
66
+ }
67
+ };
68
+ }
69
+ exports.createOpenAIBuilder = createOpenAIBuilder;
70
+ /**
71
+ * Parse the OpenAI structured output response.
72
+ * The schema wraps the array in { changes: [...] }, so unwrap before
73
+ * delegating to the shared parser.
74
+ */
75
+ function parseOpenAIResponse(raw) {
76
+ try {
77
+ const parsed = JSON.parse(raw);
78
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed) && Array.isArray(parsed.changes)) {
79
+ return { kind: 'transforms', changes: parsed.changes };
80
+ }
81
+ }
82
+ catch {
83
+ // fall through to shared parser
84
+ }
85
+ return (0, anthropic_1.parseBuilderResponse)(raw);
86
+ }
87
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/builders/openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { ChangeList } from '../service/transformPage';
2
+ /**
3
+ * Text instruction that tells the model to return a JSON array of change operations.
4
+ * Append this to <INSTRUCTIONS> for builders that don't support structured outputs.
5
+ */
6
+ export declare const CHANGE_OPS_FORMAT_INSTRUCTION = "Return a JSON array of change operations to apply to the page. Do NOT return the full HTML page.\n\nEach operation must be one of:\n{ \"op\": \"update\", \"nodeId\": \"<data-node-id>\", \"html\": \"<new innerHTML>\" }\n \u2014 replaces the innerHTML of the target element\n\n{ \"op\": \"replace\", \"nodeId\": \"<data-node-id>\", \"html\": \"<new outerHTML>\" }\n \u2014 replaces the entire element (outerHTML) with new markup\n\n{ \"op\": \"delete\", \"nodeId\": \"<data-node-id>\" }\n \u2014 removes the element from the page\n\n{ \"op\": \"insert\", \"parentId\": \"<data-node-id>\", \"position\": \"prepend\"|\"append\"|\"before\"|\"after\", \"html\": \"<new element HTML>\" }\n \u2014 inserts new HTML relative to the parent element\n\n{ \"op\": \"style-element\", \"nodeId\": \"<data-node-id>\", \"style\": \"<css style string>\" }\n \u2014 sets the style attribute of the target element (must be unlocked)\n\n{ \"op\": \"search-replace\", \"nodeId\": \"<data-node-id>\", \"search\": \"<exact text to find>\", \"replace\": \"<replacement text>\" }\n \u2014 finds exact text within a script/style block and replaces it. Use empty string for replace to delete.\n\n{ \"op\": \"search-insert\", \"nodeId\": \"<data-node-id>\", \"after\": \"<exact text to find>\", \"content\": \"<new lines to insert>\" }\n \u2014 inserts new content immediately after the matched text in a script/style block.\n\nFor partial edits to large scripts/styles, use search-replace or search-insert instead of\nreplacing the entire block with update.\nCopy the search/after text exactly as it appears in the source.\nWhen making multiple edits to the same block, ensure each search string targets distinct text.\nTo delete code, use search-replace with an empty replace string.\n\nReturn ONLY the JSON array. Example:\n[\n { \"op\": \"update\", \"nodeId\": \"5\", \"html\": \"<p>Hello world</p>\" },\n { \"op\": \"insert\", \"parentId\": \"3\", \"position\": \"append\", \"html\": \"<div class=\\\"msg\\\">New message</div>\" }\n]";
7
+ /**
8
+ * JSON schema matching the ChangeOp union type for Anthropic structured outputs.
9
+ * The top-level schema is an array of change operations.
10
+ */
11
+ export declare const CHANGE_OPS_SCHEMA: Record<string, unknown>;
12
+ /**
13
+ * Variant of CHANGE_OPS_SCHEMA that omits ranged write operations (search-replace, search-insert).
14
+ * Used for medium/hard/re-write changes where the model should replace full blocks instead of
15
+ * attempting partial edits.
16
+ */
17
+ export declare const CHANGE_OPS_SCHEMA_NO_RANGED: Record<string, unknown>;
18
+ /**
19
+ * Text instruction variant for no-ranged-writes mode.
20
+ * Tells the model to use `update` for full innerHTML replacement instead of partial edits.
21
+ */
22
+ export declare const 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.";
23
+ /**
24
+ * OpenAI structured outputs require a root-level object.
25
+ * This wraps CHANGE_OPS_SCHEMA in { changes: [...] }.
26
+ */
27
+ export declare const OPENAI_CHANGE_OPS_SCHEMA: Record<string, unknown>;
28
+ export interface ContextSection {
29
+ /** Section title, e.g. "<CURRENT_PAGE>", "<SERVER_SCRIPTS>" */
30
+ title: string;
31
+ /** The text body of this section */
32
+ content: string;
33
+ /** How the model should work with this section (appended to instructions) */
34
+ instructions: string;
35
+ }
36
+ export type BuilderResult = {
37
+ kind: 'transforms';
38
+ changes: ChangeList;
39
+ } | {
40
+ kind: 'reply';
41
+ text: string;
42
+ } | {
43
+ kind: 'error';
44
+ error: Error;
45
+ };
46
+ export interface Attachment {
47
+ mediaType: string;
48
+ data: string;
49
+ name?: string;
50
+ }
51
+ export interface Builder {
52
+ run(currentPage: ContextSection, additionalSections: ContextSection[], userMessage: string, newBuild: boolean, attachments?: Attachment[]): Promise<BuilderResult>;
53
+ }
54
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/builders/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAMtD;;;GAGG;AACH,eAAO,MAAM,6BAA6B,u+DAkCxC,CAAC;AAMH;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CA8ErD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAwD/D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uCAAuC,qKAAiK,CAAC;AAEtN;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAO5D,CAAC;AAMF,MAAM,WAAW,cAAc;IAC3B,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,YAAY,EAAE,MAAM,CAAC;CACxB;AAMD,MAAM,MAAM,aAAa,GACnB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC;AAMtC,MAAM,WAAW,UAAU;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAMD,MAAM,WAAW,OAAO;IACpB,GAAG,CACC,WAAW,EAAE,cAAc,EAC3B,kBAAkB,EAAE,cAAc,EAAE,EACpC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,OAAO,EACjB,WAAW,CAAC,EAAE,UAAU,EAAE,GAC3B,OAAO,CAAC,aAAa,CAAC,CAAC;CAC7B"}