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.
- package/README.md +1 -1
- package/default-pages/application/page.html +42 -0
- package/default-pages/application/page.json +10 -0
- package/default-pages/elevenlabs_effects_studio/page.html +1363 -0
- package/default-pages/elevenlabs_effects_studio/page.json +11 -0
- package/default-pages/elevenlabs_voice_studio/page.html +801 -0
- package/default-pages/elevenlabs_voice_studio/page.json +11 -0
- package/default-pages/{json_tools.html → json_tools/page.html} +13 -11
- package/default-pages/json_tools/page.json +10 -0
- package/default-pages/my_notes/notes/a1b2c3d4-e5f6-7890-abcd-ef1234567890.json +5 -0
- package/default-pages/my_notes/page.html +132 -0
- package/default-pages/{my_notes.json → my_notes/page.json} +2 -2
- package/default-pages/neon_asteroids/files/Ambient_Space.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Ambient_Space2.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Ambient_Space3.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Asteroid_Explosion.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Hyperspace_Jump.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Laser_Fire.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Menu_Navigate.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Power_Up_Collect.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Saucer_Alert.mp3 +0 -0
- package/default-pages/neon_asteroids/files/Ship_Thrust.mp3 +0 -0
- package/default-pages/neon_asteroids/files/effects.json +74 -0
- package/default-pages/neon_asteroids/page.html +1822 -0
- package/default-pages/{neon_asteroids.json → neon_asteroids/page.json} +3 -3
- package/default-pages/{oregon_trail.html → oregon_trail/page.html} +14 -12
- package/default-pages/{oregon_trail.json → oregon_trail/page.json} +2 -2
- package/default-pages/retro_game_starter/page.html +1308 -0
- package/default-pages/retro_game_starter/page.json +12 -0
- package/default-pages/{sidebar_page.html → sidebar_page/page.html} +12 -10
- package/default-pages/sidebar_page/page.json +10 -0
- package/default-pages/{solar_explorer.html → solar_explorer/page.html} +14 -11
- package/default-pages/{solar_explorer.json → solar_explorer/page.json} +2 -2
- package/default-pages/{solar_tutorial.html → solar_tutorial/page.html} +12 -10
- package/default-pages/solar_tutorial/page.json +10 -0
- package/default-pages/{two-panel_page.html → two-panel_page/page.html} +13 -11
- package/default-pages/two-panel_page/page.json +10 -0
- package/default-pages/{us_map.html → us_map/page.html} +193 -192
- package/default-pages/{us_map.json → us_map/page.json} +12 -12
- package/default-pages/{us_map_1850.html → us_map_1850/page.html} +326 -325
- package/default-pages/{us_map_1850.json → us_map_1850/page.json} +12 -12
- package/default-pages/{western_cities_1850.html → western_cities_1850/page.html} +527 -526
- package/default-pages/{western_cities_1850.json → western_cities_1850/page.json} +12 -12
- package/default-themes/aurora-dawn.json +19 -0
- package/default-themes/aurora-dawn.v3.css +198 -0
- package/default-themes/aurora-dusk.json +19 -0
- package/default-themes/aurora-dusk.v3.css +200 -0
- package/default-themes/cosmos-dawn.json +19 -0
- package/default-themes/cosmos-dawn.v3.css +198 -0
- package/default-themes/cosmos-dusk.json +19 -0
- package/default-themes/cosmos-dusk.v3.css +200 -0
- package/default-themes/high-contrast-dark.json +19 -0
- package/default-themes/high-contrast-dark.v3.css +200 -0
- package/default-themes/high-contrast-light.json +19 -0
- package/default-themes/high-contrast-light.v3.css +198 -0
- package/default-themes/nebula-dawn.v2.css +110 -0
- package/default-themes/nebula-dawn.v3.css +199 -0
- package/default-themes/nebula-dusk.v2.css +104 -0
- package/default-themes/nebula-dusk.v3.css +201 -0
- package/default-themes/solar-flare-dawn.json +19 -0
- package/default-themes/solar-flare-dawn.v3.css +198 -0
- package/default-themes/solar-flare-dusk.json +19 -0
- package/default-themes/solar-flare-dusk.v3.css +200 -0
- package/dist/agents/index.d.ts +1 -1
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +2 -1
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/openclaw/gatewayManager.d.ts +4 -0
- package/dist/agents/openclaw/gatewayManager.d.ts.map +1 -1
- package/dist/agents/openclaw/gatewayManager.js +27 -11
- package/dist/agents/openclaw/gatewayManager.js.map +1 -1
- package/dist/agents/openclaw/openclawProvider.d.ts.map +1 -1
- package/dist/agents/openclaw/openclawProvider.js +2 -4
- package/dist/agents/openclaw/openclawProvider.js.map +1 -1
- package/dist/agents/openclaw/sshTunnelManager.d.ts +2 -0
- package/dist/agents/openclaw/sshTunnelManager.d.ts.map +1 -1
- package/dist/agents/openclaw/sshTunnelManager.js +31 -12
- package/dist/agents/openclaw/sshTunnelManager.js.map +1 -1
- package/dist/builders/anthropic.d.ts +31 -0
- package/dist/builders/anthropic.d.ts.map +1 -0
- package/dist/builders/anthropic.js +227 -0
- package/dist/builders/anthropic.js.map +1 -0
- package/dist/builders/fireworksai.d.ts +9 -0
- package/dist/builders/fireworksai.d.ts.map +1 -0
- package/dist/builders/fireworksai.js +57 -0
- package/dist/builders/fireworksai.js.map +1 -0
- package/dist/builders/index.d.ts +13 -0
- package/dist/builders/index.d.ts.map +1 -0
- package/dist/builders/index.js +31 -0
- package/dist/builders/index.js.map +1 -0
- package/dist/builders/openai.d.ts +8 -0
- package/dist/builders/openai.d.ts.map +1 -0
- package/dist/builders/openai.js +87 -0
- package/dist/builders/openai.js.map +1 -0
- package/dist/builders/types.d.ts +54 -0
- package/dist/builders/types.d.ts.map +1 -0
- package/dist/builders/types.js +211 -0
- package/dist/builders/types.js.map +1 -0
- package/dist/connectors/index.d.ts.map +1 -1
- package/dist/connectors/index.js +3 -2
- package/dist/connectors/index.js.map +1 -1
- package/dist/connectors/registry.d.ts +2 -1
- package/dist/connectors/registry.d.ts.map +1 -1
- package/dist/connectors/registry.js +31 -8
- package/dist/connectors/registry.js.map +1 -1
- package/dist/customizer/Customizer.d.ts +57 -0
- package/dist/customizer/Customizer.d.ts.map +1 -0
- package/dist/customizer/Customizer.js +124 -0
- package/dist/customizer/Customizer.js.map +1 -0
- package/dist/customizer/index.d.ts.map +1 -0
- package/dist/customizer/index.js +9 -0
- package/dist/customizer/index.js.map +1 -0
- package/dist/files.d.ts +16 -0
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +60 -1
- package/dist/files.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +10 -6
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +96 -113
- package/dist/init.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +23 -10
- package/dist/migrations.js.map +1 -1
- package/dist/models/anthropic.d.ts +4 -2
- package/dist/models/anthropic.d.ts.map +1 -1
- package/dist/models/anthropic.js +33 -6
- package/dist/models/anthropic.js.map +1 -1
- package/dist/models/fireworksai.d.ts.map +1 -1
- package/dist/models/fireworksai.js +9 -1
- package/dist/models/fireworksai.js.map +1 -1
- package/dist/models/index.d.ts +1 -1
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +2 -1
- package/dist/models/index.js.map +1 -1
- package/dist/models/openai.d.ts +1 -1
- package/dist/models/openai.d.ts.map +1 -1
- package/dist/models/openai.js +24 -3
- package/dist/models/openai.js.map +1 -1
- package/dist/models/types.d.ts +20 -1
- package/dist/models/types.d.ts.map +1 -1
- package/dist/models/types.js +6 -1
- package/dist/models/types.js.map +1 -1
- package/dist/pages.d.ts +30 -7
- package/dist/pages.d.ts.map +1 -1
- package/dist/pages.js +177 -55
- package/dist/pages.js.map +1 -1
- package/dist/service/server.d.ts.map +1 -1
- package/dist/service/server.js +37 -8
- package/dist/service/server.js.map +1 -1
- package/dist/service/transformPage.d.ts +47 -20
- package/dist/service/transformPage.d.ts.map +1 -1
- package/dist/service/transformPage.js +514 -293
- package/dist/service/transformPage.js.map +1 -1
- package/dist/service/useAgentRoutes.d.ts +2 -1
- package/dist/service/useAgentRoutes.d.ts.map +1 -1
- package/dist/service/useAgentRoutes.js +5 -2
- package/dist/service/useAgentRoutes.js.map +1 -1
- package/dist/service/useApiRoutes.d.ts.map +1 -1
- package/dist/service/useApiRoutes.js +237 -136
- package/dist/service/useApiRoutes.js.map +1 -1
- package/dist/service/useConnectorRoutes.js +6 -6
- package/dist/service/useConnectorRoutes.js.map +1 -1
- package/dist/service/useFileRoutes.d.ts +4 -0
- package/dist/service/useFileRoutes.d.ts.map +1 -0
- package/dist/service/useFileRoutes.js +122 -0
- package/dist/service/useFileRoutes.js.map +1 -0
- package/dist/service/usePageRoutes.d.ts.map +1 -1
- package/dist/service/usePageRoutes.js +648 -67
- package/dist/service/usePageRoutes.js.map +1 -1
- package/dist/service/useSharedDataRoutes.d.ts +4 -0
- package/dist/service/useSharedDataRoutes.d.ts.map +1 -0
- package/dist/service/useSharedDataRoutes.js +104 -0
- package/dist/service/useSharedDataRoutes.js.map +1 -0
- package/dist/service/useSharedFileRoutes.d.ts +4 -0
- package/dist/service/useSharedFileRoutes.d.ts.map +1 -0
- package/dist/service/useSharedFileRoutes.js +121 -0
- package/dist/service/useSharedFileRoutes.js.map +1 -0
- package/dist/settings.d.ts +1 -0
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +1 -0
- package/dist/settings.js.map +1 -1
- package/dist/synthos-cli.d.ts.map +1 -1
- package/dist/synthos-cli.js +4 -3
- package/dist/synthos-cli.js.map +1 -1
- package/dist/themes.d.ts +1 -0
- package/dist/themes.d.ts.map +1 -1
- package/dist/themes.js +28 -15
- package/dist/themes.js.map +1 -1
- package/migration-rules/v1-to-v2.md +193 -0
- package/migration-rules/v2-to-v3.md +481 -0
- package/package.json +11 -10
- package/required-pages/builder/page.html +43 -0
- package/required-pages/builder/page.json +10 -0
- package/required-pages/{pages.html → pages/page.html} +238 -233
- package/required-pages/pages/page.json +10 -0
- package/required-pages/{settings.html → settings/page.html} +389 -275
- package/required-pages/settings/page.json +10 -0
- package/required-pages/synthos_apis/page.html +846 -0
- package/required-pages/synthos_apis/page.json +10 -0
- package/required-pages/{synthos_scripts.html → synthos_scripts/page.html} +13 -11
- package/required-pages/synthos_scripts/page.json +10 -0
- package/src/agents/index.ts +1 -1
- package/src/agents/openclaw/gatewayManager.ts +22 -11
- package/src/agents/openclaw/openclawProvider.ts +2 -4
- package/src/agents/openclaw/sshTunnelManager.ts +19 -11
- package/src/builders/anthropic.ts +283 -0
- package/src/builders/fireworksai.ts +59 -0
- package/src/builders/index.ts +33 -0
- package/src/builders/openai.ts +89 -0
- package/src/builders/types.ts +261 -0
- package/src/connectors/index.ts +1 -1
- package/src/connectors/registry.ts +28 -8
- package/src/customizer/Customizer.ts +151 -0
- package/src/customizer/index.ts +5 -0
- package/src/files.ts +57 -0
- package/src/index.ts +2 -1
- package/src/init.ts +137 -123
- package/src/migrations.ts +30 -10
- package/src/models/anthropic.ts +40 -10
- package/src/models/fireworksai.ts +9 -2
- package/src/models/index.ts +1 -1
- package/src/models/openai.ts +26 -6
- package/src/models/types.ts +31 -1
- package/src/pages.ts +176 -54
- package/src/service/server.ts +36 -9
- package/src/service/transformPage.ts +557 -326
- package/src/service/useAgentRoutes.ts +7 -2
- package/src/service/useApiRoutes.ts +150 -41
- package/src/service/useConnectorRoutes.ts +7 -7
- package/src/service/useFileRoutes.ts +127 -0
- package/src/service/usePageRoutes.ts +720 -73
- package/src/service/useSharedDataRoutes.ts +106 -0
- package/src/service/useSharedFileRoutes.ts +126 -0
- package/src/settings.ts +2 -0
- package/src/synthos-cli.ts +4 -3
- package/src/themes.ts +25 -14
- package/static-files/favicon.svg +12 -0
- package/static-files/fluentlm-instructions.llmd +868 -0
- package/static-files/fluentlm-instructions.md +1595 -0
- package/static-files/fluentlm.css +4844 -0
- package/static-files/fluentlm.js +3602 -0
- package/static-files/fluentlm.min.css +1 -0
- package/static-files/fluentlm.min.js +1 -0
- package/{page-scripts/helpers-v2.js → static-files/helpers.v3.js} +82 -0
- package/static-files/page.v3.js +1290 -0
- package/static-files/recommended-frameworks.llmd +81 -0
- package/static-files/recommended-frameworks.md +137 -0
- package/static-files/retro-game.js +877 -0
- package/static-files/shell.css +797 -0
- package/static-files/theme-dark.css +169 -0
- package/static-files/theme-light.css +169 -0
- package/tests/builders.spec.ts +139 -0
- package/tests/pages.spec.ts +8 -8
- package/tests/transformPage.spec.ts +299 -360
- package/default-pages/application.html +0 -40
- package/default-pages/application.json +0 -1
- package/default-pages/json_tools.json +0 -1
- package/default-pages/my_notes.html +0 -33
- package/default-pages/neon_asteroids.html +0 -77
- package/default-pages/sidebar_page.json +0 -1
- package/default-pages/solar_tutorial.json +0 -1
- package/default-pages/two-panel_page.json +0 -1
- package/dist/agents/a2a/a2aProvider.d.ts +0 -3
- package/dist/agents/discovery.d.ts +0 -30
- package/dist/agents/openclaw/openclawProvider.d.ts +0 -3
- package/dist/agents/types.d.ts +0 -64
- package/dist/connectors/index.d.ts +0 -3
- package/dist/connectors/types.d.ts +0 -84
- package/dist/index.d.ts +0 -7
- package/dist/migrations.d.ts +0 -12
- package/dist/models/chainOfThought.d.ts +0 -12
- package/dist/models/fireworksai.d.ts +0 -30
- package/dist/models/logCompletePrompt.d.ts +0 -3
- package/dist/models/providers.d.ts +0 -8
- package/dist/models/utils.d.ts +0 -6
- package/dist/scripts.d.ts +0 -15
- package/dist/service/createCompletePrompt.d.ts +0 -5
- package/dist/service/debugLog.d.ts +0 -11
- package/dist/service/generateImage.d.ts +0 -32
- package/dist/service/index.d.ts +0 -8
- package/dist/service/modelInstructions.d.ts +0 -7
- package/dist/service/requiresSettings.d.ts +0 -3
- package/dist/service/server.d.ts +0 -4
- package/dist/service/useApiRoutes.d.ts +0 -4
- package/dist/service/useConnectorRoutes.d.ts +0 -4
- package/dist/service/useDataRoutes.d.ts +0 -4
- package/dist/service/useGatewayRoutes.d.ts +0 -4
- package/dist/service/useGatewayRoutes.d.ts.map +0 -1
- package/dist/service/useGatewayRoutes.js +0 -168
- package/dist/service/useGatewayRoutes.js.map +0 -1
- package/dist/service/usePageRoutes.d.ts +0 -5
- package/dist/synthos-cli.d.ts +0 -2
- package/page-scripts/page-v2.js +0 -656
- package/required-pages/builder.html +0 -48
- package/required-pages/builder.json +0 -1
- package/required-pages/pages.json +0 -1
- package/required-pages/settings.json +0 -1
- package/required-pages/synthos_apis.html +0 -327
- package/required-pages/synthos_apis.json +0 -1
- package/required-pages/synthos_scripts.json +0 -1
- package/src/connectors/airtable/connector.json +0 -27
- package/src/connectors/alpha-vantage/connector.json +0 -26
- package/src/connectors/brave-search/connector.json +0 -26
- package/src/connectors/cloudinary/connector.json +0 -27
- package/src/connectors/deepl/connector.json +0 -28
- package/src/connectors/elevenlabs/connector.json +0 -30
- package/src/connectors/giphy/connector.json +0 -27
- package/src/connectors/github/connector.json +0 -29
- package/src/connectors/huggingface/connector.json +0 -27
- package/src/connectors/imgur/connector.json +0 -29
- package/src/connectors/instagram/connector.json +0 -43
- package/src/connectors/jira/connector.json +0 -28
- package/src/connectors/mapbox/connector.json +0 -26
- package/src/connectors/nasa/connector.json +0 -27
- package/src/connectors/newsapi/connector.json +0 -27
- package/src/connectors/notion/connector.json +0 -28
- package/src/connectors/open-exchange-rates/connector.json +0 -27
- package/src/connectors/openweathermap/connector.json +0 -26
- package/src/connectors/pexels/connector.json +0 -27
- package/src/connectors/resend/connector.json +0 -29
- package/src/connectors/rss2json/connector.json +0 -27
- package/src/connectors/sendgrid/connector.json +0 -27
- package/src/connectors/spoonacular/connector.json +0 -28
- package/src/connectors/stability-ai/connector.json +0 -27
- package/src/connectors/twilio/connector.json +0 -28
- package/src/connectors/unsplash/connector.json +0 -27
- package/src/connectors/wolfram-alpha/connector.json +0 -26
- package/src/connectors/youtube-data/connector.json +0 -30
- /package/{dist/connectors → service-connectors}/airtable/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/alpha-vantage/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/brave-search/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/cloudinary/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/deepl/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/elevenlabs/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/giphy/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/github/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/huggingface/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/imgur/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/instagram/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/jira/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/mapbox/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/nasa/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/newsapi/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/notion/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/open-exchange-rates/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/openweathermap/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/pexels/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/resend/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/rss2json/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/sendgrid/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/spoonacular/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/stability-ai/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/twilio/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/unsplash/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/wolfram-alpha/connector.json +0 -0
- /package/{dist/connectors → service-connectors}/youtube-data/connector.json +0 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/* ==========================================================================
|
|
2
|
+
FluentLM — Dark Theme
|
|
3
|
+
Semantic color tokens mapped to the inverted palette.
|
|
4
|
+
Applied when <html class="fluent-dark">.
|
|
5
|
+
========================================================================== */
|
|
6
|
+
|
|
7
|
+
.fluent-dark {
|
|
8
|
+
/* -----------------------------------------------------------------------
|
|
9
|
+
BODY / BACKGROUND
|
|
10
|
+
----------------------------------------------------------------------- */
|
|
11
|
+
--bodyBackground: var(--neutralPrimary);
|
|
12
|
+
--bodyBackgroundHovered: var(--neutralPrimaryAlt);
|
|
13
|
+
--bodyBackgroundChecked: var(--neutralSecondary);
|
|
14
|
+
--bodyStandoutBackground: var(--neutralDark);
|
|
15
|
+
--bodyFrameBackground: var(--neutralPrimary);
|
|
16
|
+
--bodyFrameDivider: var(--neutralSecondary);
|
|
17
|
+
--bodyDivider: var(--neutralSecondary);
|
|
18
|
+
|
|
19
|
+
/* -----------------------------------------------------------------------
|
|
20
|
+
TEXT
|
|
21
|
+
----------------------------------------------------------------------- */
|
|
22
|
+
--bodyText: var(--neutralLighter);
|
|
23
|
+
--bodyTextChecked: var(--white);
|
|
24
|
+
--bodySubtext: var(--neutralTertiaryAlt);
|
|
25
|
+
--disabledText: var(--neutralSecondary);
|
|
26
|
+
--disabledBodyText: var(--neutralSecondary);
|
|
27
|
+
--disabledSubtext: var(--neutralSecondaryAlt);
|
|
28
|
+
--disabledBodySubtext: var(--neutralSecondary);
|
|
29
|
+
|
|
30
|
+
/* -----------------------------------------------------------------------
|
|
31
|
+
LINKS
|
|
32
|
+
----------------------------------------------------------------------- */
|
|
33
|
+
--link: #6CB8F6;
|
|
34
|
+
--linkHovered: #82C7FF;
|
|
35
|
+
--actionLink: var(--neutralLighter);
|
|
36
|
+
--actionLinkHovered: var(--white);
|
|
37
|
+
|
|
38
|
+
/* -----------------------------------------------------------------------
|
|
39
|
+
BUTTONS — Default
|
|
40
|
+
----------------------------------------------------------------------- */
|
|
41
|
+
--buttonBackground: var(--neutralPrimary);
|
|
42
|
+
--buttonBackgroundHovered: var(--neutralPrimaryAlt);
|
|
43
|
+
--buttonBackgroundChecked: var(--neutralSecondary);
|
|
44
|
+
--buttonBackgroundCheckedHovered: var(--neutralSecondaryAlt);
|
|
45
|
+
--buttonBackgroundPressed: var(--neutralSecondary);
|
|
46
|
+
--buttonBackgroundDisabled: var(--neutralDark);
|
|
47
|
+
--buttonBorder: var(--neutralSecondaryAlt);
|
|
48
|
+
--buttonBorderDisabled: var(--neutralDark);
|
|
49
|
+
--buttonText: var(--neutralLighter);
|
|
50
|
+
--buttonTextHovered: var(--white);
|
|
51
|
+
--buttonTextChecked: var(--white);
|
|
52
|
+
--buttonTextCheckedHovered: var(--white);
|
|
53
|
+
--buttonTextPressed: var(--white);
|
|
54
|
+
--buttonTextDisabled: var(--neutralSecondary);
|
|
55
|
+
|
|
56
|
+
/* -----------------------------------------------------------------------
|
|
57
|
+
BUTTONS — Primary
|
|
58
|
+
----------------------------------------------------------------------- */
|
|
59
|
+
--primaryButtonBackground: var(--themePrimary);
|
|
60
|
+
--primaryButtonBackgroundHovered: var(--themeDarkAlt);
|
|
61
|
+
--primaryButtonBackgroundPressed: var(--themeDark);
|
|
62
|
+
--primaryButtonBackgroundDisabled: var(--neutralDark);
|
|
63
|
+
--primaryButtonBorder: transparent;
|
|
64
|
+
--primaryButtonText: var(--white);
|
|
65
|
+
--primaryButtonTextHovered: var(--white);
|
|
66
|
+
--primaryButtonTextPressed: var(--white);
|
|
67
|
+
--primaryButtonTextDisabled: var(--neutralSecondary);
|
|
68
|
+
|
|
69
|
+
/* -----------------------------------------------------------------------
|
|
70
|
+
BUTTONS — Accent
|
|
71
|
+
----------------------------------------------------------------------- */
|
|
72
|
+
--accentButtonBackground: var(--themePrimary);
|
|
73
|
+
--accentButtonText: var(--white);
|
|
74
|
+
|
|
75
|
+
/* -----------------------------------------------------------------------
|
|
76
|
+
INPUTS
|
|
77
|
+
----------------------------------------------------------------------- */
|
|
78
|
+
--inputBackground: var(--neutralPrimary);
|
|
79
|
+
--inputBackgroundChecked: var(--themePrimary);
|
|
80
|
+
--inputBackgroundCheckedHovered: var(--themeDarkAlt);
|
|
81
|
+
--inputPlaceholderBackgroundChecked: var(--themeDark);
|
|
82
|
+
--inputForegroundChecked: var(--white);
|
|
83
|
+
--inputBorder: var(--neutralTertiary);
|
|
84
|
+
--smallInputBorder: var(--neutralTertiary);
|
|
85
|
+
--inputBorderHovered: var(--neutralLighter);
|
|
86
|
+
--inputFocusBorderAlt: var(--themeSecondary);
|
|
87
|
+
--inputText: var(--neutralLighter);
|
|
88
|
+
--inputTextHovered: var(--white);
|
|
89
|
+
--inputPlaceholderText: var(--neutralTertiaryAlt);
|
|
90
|
+
--inputIcon: var(--themeSecondary);
|
|
91
|
+
--inputIconHovered: var(--themePrimary);
|
|
92
|
+
--inputIconDisabled: var(--neutralSecondary);
|
|
93
|
+
|
|
94
|
+
/* -----------------------------------------------------------------------
|
|
95
|
+
LISTS
|
|
96
|
+
----------------------------------------------------------------------- */
|
|
97
|
+
--listBackground: var(--neutralPrimary);
|
|
98
|
+
--listText: var(--neutralLighter);
|
|
99
|
+
--listItemBackgroundHovered: var(--neutralPrimaryAlt);
|
|
100
|
+
--listItemBackgroundChecked: var(--neutralSecondary);
|
|
101
|
+
--listItemBackgroundCheckedHovered: var(--neutralSecondaryAlt);
|
|
102
|
+
--listHeaderBackgroundHovered: var(--neutralPrimaryAlt);
|
|
103
|
+
--listHeaderBackgroundPressed: var(--neutralSecondary);
|
|
104
|
+
|
|
105
|
+
/* -----------------------------------------------------------------------
|
|
106
|
+
MENUS
|
|
107
|
+
----------------------------------------------------------------------- */
|
|
108
|
+
--menuBackground: var(--neutralPrimary);
|
|
109
|
+
--menuDivider: var(--neutralSecondary);
|
|
110
|
+
--menuIcon: var(--themeSecondary);
|
|
111
|
+
--menuHeader: var(--themeSecondary);
|
|
112
|
+
--menuItemBackgroundHovered: var(--neutralPrimaryAlt);
|
|
113
|
+
--menuItemBackgroundPressed: var(--neutralSecondary);
|
|
114
|
+
--menuItemText: var(--neutralLighter);
|
|
115
|
+
--menuItemTextHovered: var(--white);
|
|
116
|
+
|
|
117
|
+
/* -----------------------------------------------------------------------
|
|
118
|
+
CARDS
|
|
119
|
+
In dark themes Fluent v8 drops shadows and uses borders instead.
|
|
120
|
+
----------------------------------------------------------------------- */
|
|
121
|
+
--cardStandoutBackground: var(--neutralDark);
|
|
122
|
+
--cardShadow: none;
|
|
123
|
+
--cardShadowHovered: none;
|
|
124
|
+
--variantBorder: var(--neutralSecondary);
|
|
125
|
+
--variantBorderHovered: var(--neutralTertiary);
|
|
126
|
+
|
|
127
|
+
/* -----------------------------------------------------------------------
|
|
128
|
+
DISABLED / FOCUS
|
|
129
|
+
----------------------------------------------------------------------- */
|
|
130
|
+
--disabledBackground: var(--neutralDark);
|
|
131
|
+
--disabledBorder: var(--neutralDark);
|
|
132
|
+
--focusBorder: var(--neutralTertiaryAlt);
|
|
133
|
+
|
|
134
|
+
/* -----------------------------------------------------------------------
|
|
135
|
+
STATUS — Backgrounds
|
|
136
|
+
----------------------------------------------------------------------- */
|
|
137
|
+
--infoBackground: var(--neutralPrimary);
|
|
138
|
+
--errorBackground: #442726;
|
|
139
|
+
--blockingBackground: #442726;
|
|
140
|
+
--warningBackground: #433519;
|
|
141
|
+
--severeWarningBackground: #4F2A0F;
|
|
142
|
+
--successBackground: #393D1B;
|
|
143
|
+
|
|
144
|
+
/* -----------------------------------------------------------------------
|
|
145
|
+
STATUS — Icons
|
|
146
|
+
----------------------------------------------------------------------- */
|
|
147
|
+
--infoIcon: var(--neutralTertiaryAlt);
|
|
148
|
+
--errorIcon: #F1707B;
|
|
149
|
+
--blockingIcon: #442726;
|
|
150
|
+
--warningIcon: var(--neutralTertiaryAlt);
|
|
151
|
+
--severeWarningIcon: #FCE100;
|
|
152
|
+
--successIcon: #92C353;
|
|
153
|
+
|
|
154
|
+
/* -----------------------------------------------------------------------
|
|
155
|
+
STATUS — Text
|
|
156
|
+
----------------------------------------------------------------------- */
|
|
157
|
+
--errorText: #F1707B;
|
|
158
|
+
--messageText: var(--neutralLighter);
|
|
159
|
+
--messageLink: #6CB8F6;
|
|
160
|
+
--messageLinkHovered: #82C7FF;
|
|
161
|
+
--warningText: var(--neutralLighter);
|
|
162
|
+
--successText: #92C353;
|
|
163
|
+
|
|
164
|
+
/* -----------------------------------------------------------------------
|
|
165
|
+
MISC
|
|
166
|
+
----------------------------------------------------------------------- */
|
|
167
|
+
--defaultStateBackground: var(--neutralDark);
|
|
168
|
+
--overlayBackground: rgba(0, 0, 0, 0.6);
|
|
169
|
+
}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/* ==========================================================================
|
|
2
|
+
FluentLM — Light Theme
|
|
3
|
+
Semantic color tokens mapped to the default (non-inverted) palette.
|
|
4
|
+
Applied when <html class="fluentlm"> or as the default.
|
|
5
|
+
========================================================================== */
|
|
6
|
+
|
|
7
|
+
:root,
|
|
8
|
+
.fluentlm {
|
|
9
|
+
/* -----------------------------------------------------------------------
|
|
10
|
+
BODY / BACKGROUND
|
|
11
|
+
----------------------------------------------------------------------- */
|
|
12
|
+
--bodyBackground: var(--white);
|
|
13
|
+
--bodyBackgroundHovered: var(--neutralLighter);
|
|
14
|
+
--bodyBackgroundChecked: var(--neutralLight);
|
|
15
|
+
--bodyStandoutBackground: var(--neutralLighterAlt);
|
|
16
|
+
--bodyFrameBackground: var(--white);
|
|
17
|
+
--bodyFrameDivider: var(--neutralLight);
|
|
18
|
+
--bodyDivider: var(--neutralLight);
|
|
19
|
+
|
|
20
|
+
/* -----------------------------------------------------------------------
|
|
21
|
+
TEXT
|
|
22
|
+
----------------------------------------------------------------------- */
|
|
23
|
+
--bodyText: var(--neutralPrimary);
|
|
24
|
+
--bodyTextChecked: var(--neutralDark);
|
|
25
|
+
--bodySubtext: var(--neutralSecondary);
|
|
26
|
+
--disabledText: var(--neutralTertiary);
|
|
27
|
+
--disabledBodyText: var(--neutralTertiary);
|
|
28
|
+
--disabledSubtext: var(--neutralQuaternary);
|
|
29
|
+
--disabledBodySubtext: var(--neutralTertiaryAlt);
|
|
30
|
+
|
|
31
|
+
/* -----------------------------------------------------------------------
|
|
32
|
+
LINKS
|
|
33
|
+
----------------------------------------------------------------------- */
|
|
34
|
+
--link: var(--themePrimary);
|
|
35
|
+
--linkHovered: var(--themeDarker);
|
|
36
|
+
--actionLink: var(--neutralPrimary);
|
|
37
|
+
--actionLinkHovered: var(--neutralDark);
|
|
38
|
+
|
|
39
|
+
/* -----------------------------------------------------------------------
|
|
40
|
+
BUTTONS — Default
|
|
41
|
+
----------------------------------------------------------------------- */
|
|
42
|
+
--buttonBackground: var(--white);
|
|
43
|
+
--buttonBackgroundHovered: var(--neutralLighter);
|
|
44
|
+
--buttonBackgroundChecked: var(--neutralLight);
|
|
45
|
+
--buttonBackgroundCheckedHovered: var(--neutralQuaternaryAlt);
|
|
46
|
+
--buttonBackgroundPressed: var(--neutralLight);
|
|
47
|
+
--buttonBackgroundDisabled: var(--neutralLighter);
|
|
48
|
+
--buttonBorder: var(--neutralSecondaryAlt);
|
|
49
|
+
--buttonBorderDisabled: var(--neutralLighter);
|
|
50
|
+
--buttonText: var(--neutralPrimary);
|
|
51
|
+
--buttonTextHovered: var(--neutralDark);
|
|
52
|
+
--buttonTextChecked: var(--neutralDark);
|
|
53
|
+
--buttonTextCheckedHovered: var(--black);
|
|
54
|
+
--buttonTextPressed: var(--neutralDark);
|
|
55
|
+
--buttonTextDisabled: var(--neutralTertiary);
|
|
56
|
+
|
|
57
|
+
/* -----------------------------------------------------------------------
|
|
58
|
+
BUTTONS — Primary
|
|
59
|
+
----------------------------------------------------------------------- */
|
|
60
|
+
--primaryButtonBackground: var(--themePrimary);
|
|
61
|
+
--primaryButtonBackgroundHovered: var(--themeDarkAlt);
|
|
62
|
+
--primaryButtonBackgroundPressed: var(--themeDark);
|
|
63
|
+
--primaryButtonBackgroundDisabled: var(--neutralLighter);
|
|
64
|
+
--primaryButtonBorder: transparent;
|
|
65
|
+
--primaryButtonText: var(--white);
|
|
66
|
+
--primaryButtonTextHovered: var(--white);
|
|
67
|
+
--primaryButtonTextPressed: var(--white);
|
|
68
|
+
--primaryButtonTextDisabled: var(--neutralQuaternary);
|
|
69
|
+
|
|
70
|
+
/* -----------------------------------------------------------------------
|
|
71
|
+
BUTTONS — Accent
|
|
72
|
+
----------------------------------------------------------------------- */
|
|
73
|
+
--accentButtonBackground: var(--themePrimary);
|
|
74
|
+
--accentButtonText: var(--white);
|
|
75
|
+
|
|
76
|
+
/* -----------------------------------------------------------------------
|
|
77
|
+
INPUTS
|
|
78
|
+
----------------------------------------------------------------------- */
|
|
79
|
+
--inputBackground: var(--white);
|
|
80
|
+
--inputBackgroundChecked: var(--themePrimary);
|
|
81
|
+
--inputBackgroundCheckedHovered: var(--themeDarkAlt);
|
|
82
|
+
--inputPlaceholderBackgroundChecked: var(--themeLighter);
|
|
83
|
+
--inputForegroundChecked: var(--white);
|
|
84
|
+
--inputBorder: var(--neutralSecondary);
|
|
85
|
+
--smallInputBorder: var(--neutralSecondary);
|
|
86
|
+
--inputBorderHovered: var(--neutralPrimary);
|
|
87
|
+
--inputFocusBorderAlt: var(--themePrimary);
|
|
88
|
+
--inputText: var(--neutralPrimary);
|
|
89
|
+
--inputTextHovered: var(--neutralDark);
|
|
90
|
+
--inputPlaceholderText: var(--neutralSecondary);
|
|
91
|
+
--inputIcon: var(--themePrimary);
|
|
92
|
+
--inputIconHovered: var(--themeDark);
|
|
93
|
+
--inputIconDisabled: var(--neutralTertiary);
|
|
94
|
+
|
|
95
|
+
/* -----------------------------------------------------------------------
|
|
96
|
+
LISTS
|
|
97
|
+
----------------------------------------------------------------------- */
|
|
98
|
+
--listBackground: var(--white);
|
|
99
|
+
--listText: var(--neutralPrimary);
|
|
100
|
+
--listItemBackgroundHovered: var(--neutralLighter);
|
|
101
|
+
--listItemBackgroundChecked: var(--neutralLight);
|
|
102
|
+
--listItemBackgroundCheckedHovered: var(--neutralQuaternaryAlt);
|
|
103
|
+
--listHeaderBackgroundHovered: var(--neutralLighter);
|
|
104
|
+
--listHeaderBackgroundPressed: var(--neutralLight);
|
|
105
|
+
|
|
106
|
+
/* -----------------------------------------------------------------------
|
|
107
|
+
MENUS
|
|
108
|
+
----------------------------------------------------------------------- */
|
|
109
|
+
--menuBackground: var(--white);
|
|
110
|
+
--menuDivider: var(--neutralTertiaryAlt);
|
|
111
|
+
--menuIcon: var(--themePrimary);
|
|
112
|
+
--menuHeader: var(--themePrimary);
|
|
113
|
+
--menuItemBackgroundHovered: var(--neutralLighter);
|
|
114
|
+
--menuItemBackgroundPressed: var(--neutralLight);
|
|
115
|
+
--menuItemText: var(--neutralPrimary);
|
|
116
|
+
--menuItemTextHovered: var(--neutralDark);
|
|
117
|
+
|
|
118
|
+
/* -----------------------------------------------------------------------
|
|
119
|
+
CARDS
|
|
120
|
+
----------------------------------------------------------------------- */
|
|
121
|
+
--cardStandoutBackground: var(--white);
|
|
122
|
+
--cardShadow: var(--elevation4);
|
|
123
|
+
--cardShadowHovered: var(--elevation8);
|
|
124
|
+
--variantBorder: var(--neutralLight);
|
|
125
|
+
--variantBorderHovered: var(--neutralTertiaryAlt);
|
|
126
|
+
|
|
127
|
+
/* -----------------------------------------------------------------------
|
|
128
|
+
DISABLED / FOCUS
|
|
129
|
+
----------------------------------------------------------------------- */
|
|
130
|
+
--disabledBackground: var(--neutralLighter);
|
|
131
|
+
--disabledBorder: var(--neutralLighter);
|
|
132
|
+
--focusBorder: var(--neutralSecondary);
|
|
133
|
+
|
|
134
|
+
/* -----------------------------------------------------------------------
|
|
135
|
+
STATUS — Backgrounds
|
|
136
|
+
----------------------------------------------------------------------- */
|
|
137
|
+
--infoBackground: var(--neutralLighter);
|
|
138
|
+
--errorBackground: #FDE7E9;
|
|
139
|
+
--blockingBackground: #FDE7E9;
|
|
140
|
+
--warningBackground: #FFF4CE;
|
|
141
|
+
--severeWarningBackground: #FED9CC;
|
|
142
|
+
--successBackground: #DFF6DD;
|
|
143
|
+
|
|
144
|
+
/* -----------------------------------------------------------------------
|
|
145
|
+
STATUS — Icons
|
|
146
|
+
----------------------------------------------------------------------- */
|
|
147
|
+
--infoIcon: var(--neutralSecondary);
|
|
148
|
+
--errorIcon: #A80000;
|
|
149
|
+
--blockingIcon: #FDE7E9;
|
|
150
|
+
--warningIcon: #797775;
|
|
151
|
+
--severeWarningIcon: var(--orange);
|
|
152
|
+
--successIcon: var(--green);
|
|
153
|
+
|
|
154
|
+
/* -----------------------------------------------------------------------
|
|
155
|
+
STATUS — Text
|
|
156
|
+
----------------------------------------------------------------------- */
|
|
157
|
+
--errorText: var(--redDark);
|
|
158
|
+
--messageText: var(--neutralPrimary);
|
|
159
|
+
--messageLink: var(--themeDark);
|
|
160
|
+
--messageLinkHovered: var(--themeDarker);
|
|
161
|
+
--warningText: var(--neutralPrimary);
|
|
162
|
+
--successText: var(--green);
|
|
163
|
+
|
|
164
|
+
/* -----------------------------------------------------------------------
|
|
165
|
+
MISC
|
|
166
|
+
----------------------------------------------------------------------- */
|
|
167
|
+
--defaultStateBackground: var(--neutralLighterAlt);
|
|
168
|
+
--overlayBackground: var(--blackTranslucent40);
|
|
169
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import assert from 'assert';
|
|
2
|
+
import { createAnthropicBuilder, classifyRequest, buildWithModel } from '../src/builders/anthropic';
|
|
3
|
+
import { createBuilder } from '../src/builders/index';
|
|
4
|
+
import { ContextSection, BuilderResult } from '../src/builders/types';
|
|
5
|
+
import { completePrompt, AgentCompletion } from '../src/models/types';
|
|
6
|
+
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Helpers
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
|
|
11
|
+
const PAGE_HTML = '<html><body><h1>Hello</h1></body></html>';
|
|
12
|
+
|
|
13
|
+
const currentPage: ContextSection = {
|
|
14
|
+
title: '<CURRENT_PAGE>',
|
|
15
|
+
content: PAGE_HTML,
|
|
16
|
+
instructions: '',
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const additionalSections: ContextSection[] = [];
|
|
20
|
+
|
|
21
|
+
/** Creates a stub completePrompt that returns the given raw string. */
|
|
22
|
+
function stubComplete(raw: string): completePrompt {
|
|
23
|
+
return async () => ({ completed: true, value: raw } as AgentCompletion<string>);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Creates a stub completePrompt that records calls and returns a value. */
|
|
27
|
+
function trackingComplete(raw: string): { fn: completePrompt; calls: number } {
|
|
28
|
+
const tracker = { fn: null as unknown as completePrompt, calls: 0 };
|
|
29
|
+
tracker.fn = async () => {
|
|
30
|
+
tracker.calls++;
|
|
31
|
+
return { completed: true, value: raw } as AgentCompletion<string>;
|
|
32
|
+
};
|
|
33
|
+
return tracker;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// Tests
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
|
|
40
|
+
describe('Anthropic Builder — Haiku Classifier Routing', () => {
|
|
41
|
+
|
|
42
|
+
describe('Non-Opus model → no classification', () => {
|
|
43
|
+
it('calls the provided complete function directly for non-Opus models', async () => {
|
|
44
|
+
const changes = JSON.stringify([{ op: 'replace', nodeId: '1', html: '<h1>Hi</h1>' }]);
|
|
45
|
+
const tracker = trackingComplete(changes);
|
|
46
|
+
|
|
47
|
+
const builder = createAnthropicBuilder(tracker.fn, undefined, 'SynthOS', {
|
|
48
|
+
apiKey: 'test-key',
|
|
49
|
+
model: 'claude-sonnet-4-5-20250514',
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
const result = await builder.run(currentPage, additionalSections, 'change heading', false);
|
|
53
|
+
assert.strictEqual(result.kind, 'transforms');
|
|
54
|
+
assert.strictEqual(tracker.calls, 1);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
describe('No apiKey → skip classification', () => {
|
|
59
|
+
it('uses existing behavior when options.apiKey is undefined', async () => {
|
|
60
|
+
const changes = JSON.stringify([{ op: 'replace', nodeId: '1', html: '<h1>Hi</h1>' }]);
|
|
61
|
+
const tracker = trackingComplete(changes);
|
|
62
|
+
|
|
63
|
+
const builder = createAnthropicBuilder(tracker.fn, undefined, 'SynthOS', {
|
|
64
|
+
model: 'claude-opus-4-20250514',
|
|
65
|
+
// no apiKey
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
const result = await builder.run(currentPage, additionalSections, 'change heading', false);
|
|
69
|
+
assert.strictEqual(result.kind, 'transforms');
|
|
70
|
+
assert.strictEqual(tracker.calls, 1);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
describe('buildWithModel', () => {
|
|
75
|
+
it('constructs the prompt and parses a transforms response', async () => {
|
|
76
|
+
const changes = [{ op: 'replace', nodeId: '1', html: '<h1>Updated</h1>' }];
|
|
77
|
+
const complete = stubComplete(JSON.stringify(changes));
|
|
78
|
+
|
|
79
|
+
const result = await buildWithModel(complete, currentPage, additionalSections, 'update heading', undefined, 'SynthOS');
|
|
80
|
+
assert.strictEqual(result.kind, 'transforms');
|
|
81
|
+
if (result.kind === 'transforms') {
|
|
82
|
+
assert.strictEqual(result.changes.length, 1);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it('returns error when model call fails', async () => {
|
|
87
|
+
const complete: completePrompt = async () => ({
|
|
88
|
+
completed: false,
|
|
89
|
+
error: new Error('API error'),
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
const result = await buildWithModel(complete, currentPage, additionalSections, 'test', undefined, 'SynthOS');
|
|
93
|
+
assert.strictEqual(result.kind, 'error');
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it('returns a reply result for { kind: "reply" } responses', async () => {
|
|
97
|
+
const reply = JSON.stringify({ kind: 'reply', text: 'The heading says Hello.' });
|
|
98
|
+
const complete = stubComplete(reply);
|
|
99
|
+
|
|
100
|
+
const result = await buildWithModel(complete, currentPage, additionalSections, 'what does the heading say?', undefined, 'SynthOS');
|
|
101
|
+
assert.strictEqual(result.kind, 'reply');
|
|
102
|
+
if (result.kind === 'reply') {
|
|
103
|
+
assert.strictEqual(result.text, 'The heading says Hello.');
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
describe('createBuilder factory', () => {
|
|
109
|
+
it('passes options through to Anthropic builder', async () => {
|
|
110
|
+
const changes = JSON.stringify([{ op: 'replace', nodeId: '1', html: '<p>test</p>' }]);
|
|
111
|
+
const tracker = trackingComplete(changes);
|
|
112
|
+
|
|
113
|
+
// Non-Opus model should just work without classification
|
|
114
|
+
const builder = createBuilder('Anthropic', tracker.fn, undefined, 'SynthOS', {
|
|
115
|
+
apiKey: 'key',
|
|
116
|
+
model: 'claude-sonnet-4-5-20250514',
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
const result = await builder.run(currentPage, additionalSections, 'test', false);
|
|
120
|
+
assert.strictEqual(result.kind, 'transforms');
|
|
121
|
+
assert.strictEqual(tracker.calls, 1);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it('does not pass options to non-Anthropic builders', async () => {
|
|
125
|
+
const changes = JSON.stringify([{ op: 'replace', nodeId: '1', html: '<p>test</p>' }]);
|
|
126
|
+
const tracker = trackingComplete(changes);
|
|
127
|
+
|
|
128
|
+
// OpenAI builder should work fine (options ignored)
|
|
129
|
+
const builder = createBuilder('OpenAI', tracker.fn, undefined, 'SynthOS', {
|
|
130
|
+
apiKey: 'key',
|
|
131
|
+
model: 'gpt-4o',
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
const result = await builder.run(currentPage, additionalSections, 'test', false);
|
|
135
|
+
assert.strictEqual(result.kind, 'transforms');
|
|
136
|
+
assert.strictEqual(tracker.calls, 1);
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
});
|
package/tests/pages.spec.ts
CHANGED
|
@@ -173,7 +173,7 @@ describe('page I/O', () => {
|
|
|
173
173
|
path.join(fallbackFolder, 'system-page.json'),
|
|
174
174
|
JSON.stringify({ title: 'System', categories: ['System'], pinned: true, pageVersion: 2, mode: 'locked' }),
|
|
175
175
|
);
|
|
176
|
-
const loaded = await loadPageMetadata(pagesFolder, 'system-page', fallbackFolder);
|
|
176
|
+
const loaded = await loadPageMetadata(pagesFolder, 'system-page', [fallbackFolder]);
|
|
177
177
|
assert.ok(loaded);
|
|
178
178
|
assert.strictEqual(loaded.title, 'System');
|
|
179
179
|
});
|
|
@@ -242,7 +242,7 @@ describe('page I/O', () => {
|
|
|
242
242
|
it('lists folder-based pages', async () => {
|
|
243
243
|
await savePageState(pagesFolder, 'alpha', '<html>A</html>');
|
|
244
244
|
await savePageState(pagesFolder, 'beta', '<html>B</html>');
|
|
245
|
-
const pages = await listPages(pagesFolder, fallbackFolder);
|
|
245
|
+
const pages = await listPages(pagesFolder, [fallbackFolder]);
|
|
246
246
|
const names = pages.map(p => p.name);
|
|
247
247
|
assert.ok(names.includes('alpha'));
|
|
248
248
|
assert.ok(names.includes('beta'));
|
|
@@ -250,7 +250,7 @@ describe('page I/O', () => {
|
|
|
250
250
|
|
|
251
251
|
it('lists legacy flat HTML files', async () => {
|
|
252
252
|
await fs.writeFile(path.join(pagesFolder, 'legacy.html'), '<html>Legacy</html>');
|
|
253
|
-
const pages = await listPages(pagesFolder, fallbackFolder);
|
|
253
|
+
const pages = await listPages(pagesFolder, [fallbackFolder]);
|
|
254
254
|
const legacy = pages.find(p => p.name === 'legacy');
|
|
255
255
|
assert.ok(legacy);
|
|
256
256
|
assert.strictEqual(legacy.pageVersion, 1);
|
|
@@ -258,7 +258,7 @@ describe('page I/O', () => {
|
|
|
258
258
|
|
|
259
259
|
it('lists fallback (required) pages', async () => {
|
|
260
260
|
await fs.writeFile(path.join(fallbackFolder, 'builder.html'), '<html>Builder</html>');
|
|
261
|
-
const pages = await listPages(pagesFolder, fallbackFolder);
|
|
261
|
+
const pages = await listPages(pagesFolder, [fallbackFolder]);
|
|
262
262
|
const builder = pages.find(p => p.name === 'builder');
|
|
263
263
|
assert.ok(builder);
|
|
264
264
|
});
|
|
@@ -266,7 +266,7 @@ describe('page I/O', () => {
|
|
|
266
266
|
it('returns pages sorted alphabetically', async () => {
|
|
267
267
|
await savePageState(pagesFolder, 'zebra', '<html></html>');
|
|
268
268
|
await savePageState(pagesFolder, 'apple', '<html></html>');
|
|
269
|
-
const pages = await listPages(pagesFolder, fallbackFolder);
|
|
269
|
+
const pages = await listPages(pagesFolder, [fallbackFolder]);
|
|
270
270
|
const names = pages.map(p => p.name);
|
|
271
271
|
const sortedNames = [...names].sort();
|
|
272
272
|
assert.deepStrictEqual(names, sortedNames);
|
|
@@ -298,7 +298,7 @@ describe('page I/O', () => {
|
|
|
298
298
|
describe('copyPage', () => {
|
|
299
299
|
it('copies HTML and creates metadata with correct title/categories', async () => {
|
|
300
300
|
await savePageState(pagesFolder, 'source', '<html>Source</html>');
|
|
301
|
-
await copyPage(pagesFolder, 'source', 'target', 'Copied Page', ['Copy'], fallbackFolder);
|
|
301
|
+
await copyPage(pagesFolder, 'source', 'target', 'Copied Page', ['Copy'], [fallbackFolder]);
|
|
302
302
|
|
|
303
303
|
const html = await loadPageState(pagesFolder, 'target', true);
|
|
304
304
|
assert.strictEqual(html, '<html>Source</html>');
|
|
@@ -312,14 +312,14 @@ describe('page I/O', () => {
|
|
|
312
312
|
|
|
313
313
|
it('throws when source page does not exist', async () => {
|
|
314
314
|
await assert.rejects(
|
|
315
|
-
() => copyPage(pagesFolder, 'ghost', 'target', 'T', [], fallbackFolder),
|
|
315
|
+
() => copyPage(pagesFolder, 'ghost', 'target', 'T', [], [fallbackFolder]),
|
|
316
316
|
/Source page "ghost" not found/,
|
|
317
317
|
);
|
|
318
318
|
});
|
|
319
319
|
|
|
320
320
|
it('copies from required pages folder as fallback', async () => {
|
|
321
321
|
await fs.writeFile(path.join(fallbackFolder, 'system.html'), '<html>System</html>');
|
|
322
|
-
await copyPage(pagesFolder, 'system', 'mycopy', 'My Copy', ['User'], fallbackFolder);
|
|
322
|
+
await copyPage(pagesFolder, 'system', 'mycopy', 'My Copy', ['User'], [fallbackFolder]);
|
|
323
323
|
|
|
324
324
|
const html = await loadPageState(pagesFolder, 'mycopy', true);
|
|
325
325
|
assert.strictEqual(html, '<html>System</html>');
|