synthos 0.8.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +1803 -0
- package/default-pages/{neon_asteroids.json → neon_asteroids/page.json} +3 -3
- package/default-pages/{oregon_trail.html → oregon_trail/page.html} +16 -30
- 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} +15 -12
- 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 +1 -1
- 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 +62 -0
- package/dist/customizer/Customizer.d.ts.map +1 -0
- package/dist/customizer/Customizer.js +134 -0
- package/dist/customizer/Customizer.js.map +1 -0
- package/dist/customizer/index.d.ts +4 -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 +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +12 -6
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +150 -133
- 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 +34 -10
- package/dist/pages.d.ts.map +1 -1
- package/dist/pages.js +229 -79
- package/dist/pages.js.map +1 -1
- package/dist/service/createCompletePrompt.d.ts +2 -1
- package/dist/service/createCompletePrompt.d.ts.map +1 -1
- package/dist/service/createCompletePrompt.js +2 -2
- package/dist/service/createCompletePrompt.js.map +1 -1
- package/dist/service/requiresSettings.d.ts +2 -1
- package/dist/service/requiresSettings.d.ts.map +1 -1
- package/dist/service/requiresSettings.js +3 -3
- package/dist/service/requiresSettings.js.map +1 -1
- package/dist/service/server.d.ts +2 -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 +17 -14
- package/dist/service/useAgentRoutes.js.map +1 -1
- package/dist/service/useApiRoutes.d.ts +2 -1
- package/dist/service/useApiRoutes.d.ts.map +1 -1
- package/dist/service/useApiRoutes.js +287 -172
- package/dist/service/useApiRoutes.js.map +1 -1
- package/dist/service/useConnectorRoutes.js +17 -17
- package/dist/service/useConnectorRoutes.js.map +1 -1
- package/dist/service/useDataRoutes.d.ts.map +1 -1
- package/dist/service/useDataRoutes.js +13 -10
- package/dist/service/useDataRoutes.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 +2 -1
- package/dist/service/usePageRoutes.d.ts.map +1 -1
- package/dist/service/usePageRoutes.js +671 -74
- 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 +107 -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 +5 -3
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +12 -10
- package/dist/settings.js.map +1 -1
- package/dist/storage/FsStorageProvider.d.ts +25 -0
- package/dist/storage/FsStorageProvider.d.ts.map +1 -0
- package/dist/storage/FsStorageProvider.js +103 -0
- package/dist/storage/FsStorageProvider.js.map +1 -0
- package/dist/storage/StorageProvider.d.ts +31 -0
- package/dist/storage/StorageProvider.d.ts.map +1 -0
- package/dist/storage/StorageProvider.js +3 -0
- package/dist/storage/StorageProvider.js.map +1 -0
- package/dist/storage/index.d.ts +3 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +6 -0
- package/dist/storage/index.js.map +1 -0
- 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 +65 -28
- 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 +163 -0
- package/src/customizer/index.ts +5 -0
- package/src/files.ts +57 -0
- package/src/index.ts +3 -1
- package/src/init.ts +195 -145
- 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 +230 -77
- package/src/service/createCompletePrompt.ts +3 -2
- package/src/service/requiresSettings.ts +4 -3
- package/src/service/server.ts +36 -9
- package/src/service/transformPage.ts +557 -326
- package/src/service/useAgentRoutes.ts +19 -14
- package/src/service/useApiRoutes.ts +208 -84
- package/src/service/useConnectorRoutes.ts +18 -18
- package/src/service/useDataRoutes.ts +13 -10
- package/src/service/useFileRoutes.ts +128 -0
- package/src/service/usePageRoutes.ts +730 -81
- package/src/service/useSharedDataRoutes.ts +109 -0
- package/src/service/useSharedFileRoutes.ts +127 -0
- package/src/settings.ts +14 -10
- package/src/storage/FsStorageProvider.ts +87 -0
- package/src/storage/StorageProvider.ts +34 -0
- package/src/storage/index.ts +2 -0
- package/src/synthos-cli.ts +4 -3
- package/src/themes.ts +64 -27
- 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 +54 -84
- 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/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/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
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head>
|
|
2
|
-
<meta charset="UTF-8">
|
|
3
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
4
|
-
<title>SynthOS - {Application Title}</title>
|
|
5
|
-
<script id="theme-info" src="/api/theme-info.js" data-locked="true"></script>
|
|
6
|
-
<link id="theme-css" rel="stylesheet" href="/api/theme.css" data-locked="true">
|
|
7
|
-
<style>.application-title{font-size:22px;font-weight:700;min-height:var(--header-min-height);padding:var(--header-padding-vertical) var(--header-padding-horizontal);line-height:var(--header-line-height);display:flex;align-items:center;justify-content:center;box-sizing:border-box;background:linear-gradient(135deg,var(--accent-primary),var(--accent-secondary));color:#fff;border-radius:12px 12px 0 0;width:100%;max-width:800px;box-shadow:0 6px 25px var(--accent-glow)}.application-content{font-size:14px;color:rgba(224,224,224,.8);padding:20px;flex-grow:1;width:100%;max-width:800px;background:rgba(15,15,35,.8);border-radius:0 0 12px 12px;border:1px solid rgba(138,43,226,.2);border-top:none}.light-mode .application-content{color:rgba(45,38,64,.8);background:rgba(255,255,255,.8)}</style>
|
|
8
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/7.9.0/d3.min.js"></script>
|
|
9
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/marked/14.1.1/marked.min.js"></script>
|
|
10
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/mermaid/11.1.0/mermaid.min.js"></script>
|
|
11
|
-
</head>
|
|
12
|
-
|
|
13
|
-
<body>
|
|
14
|
-
<div class="chat-panel" data-locked="true">
|
|
15
|
-
<div class="chat-header" data-locked="true">SynthOS</div>
|
|
16
|
-
<div class="chat-messages" id="chatMessages" data-locked="true">
|
|
17
|
-
<div class="chat-message">
|
|
18
|
-
<p><strong>SynthOS:</strong> what kind of application would you like?</p>
|
|
19
|
-
</div>
|
|
20
|
-
</div>
|
|
21
|
-
<div class="link-group" data-locked="true">
|
|
22
|
-
<a href="#" id="saveLink" data-locked="true">Save</a>
|
|
23
|
-
<a href="/pages" id="pagesLink" data-locked="true">Pages</a>
|
|
24
|
-
<a href="#" id="resetLink" data-locked="true">Reset</a>
|
|
25
|
-
</div>
|
|
26
|
-
<form action="/" method="POST" id="chatForm" data-locked="true">
|
|
27
|
-
<input type="text" class="chat-input" id="chatInput" name="message" placeholder="Type a message..." data-locked="true">
|
|
28
|
-
<button type="submit" class="chat-submit" data-locked="true">Send</button>
|
|
29
|
-
</form>
|
|
30
|
-
</div>
|
|
31
|
-
<div class="viewer-panel" id="viewerPanel">
|
|
32
|
-
<div class="application-title" style="max-width: none;">{Application Title}</div>
|
|
33
|
-
<div class="application-content" style="max-width: none;">{Application Content}</div>
|
|
34
|
-
<div id="loadingOverlay" class="loading-overlay"><div class="spinner"></div></div>
|
|
35
|
-
</div>
|
|
36
|
-
<div id="instructions" style="display: none;" data-locked="true"></div>
|
|
37
|
-
<div id="thoughts" style="display: none;" data-locked="true"></div>
|
|
38
|
-
<script id="page-helpers" src="/api/page-helpers.js?v=2" data-locked="true"></script>
|
|
39
|
-
<script id="page-script" src="/api/page-script.js?v=2" data-locked="true"></script>
|
|
40
|
-
</body></html>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{ "title": "Application", "categories": ["Starters"], "pinned": false, "showInAll": false, "pageVersion": 2, "mode": "unlocked" }
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{ "title": "JSON Tools", "categories": ["Tools"], "pinned": false, "showInAll": false, "pageVersion": 2, "mode": "unlocked" }
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head>
|
|
2
|
-
<meta charset="UTF-8">
|
|
3
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
4
|
-
<title>SynthOS - Notes</title>
|
|
5
|
-
<script id="theme-info" src="/api/theme-info.js" data-locked="true"></script>
|
|
6
|
-
<link id="theme-css" rel="stylesheet" href="/api/theme.css" data-locked="true">
|
|
7
|
-
<style>.application-title{font-size:22px;font-weight:700;min-height:var(--header-min-height);padding:var(--header-padding-vertical) var(--header-padding-horizontal);line-height:var(--header-line-height);display:flex;align-items:center;justify-content:center;box-sizing:border-box;background:linear-gradient(135deg,var(--accent-primary),var(--accent-secondary));color:#fff;border-radius:12px 12px 0 0;width:100%;max-width:800px;box-shadow:0 6px 25px var(--accent-glow)}.application-content{font-size:14px;color:rgba(224,224,224,.8);padding:20px;flex-grow:1;width:100%;max-width:800px;background:rgba(15,15,35,.8);border-radius:0 0 12px 12px;border:1px solid rgba(138,43,226,.2);border-top:none}.light-mode .application-content{color:rgba(45,38,64,.8);background:rgba(255,255,255,.8)}</style>
|
|
8
|
-
<link rel="stylesheet" href="https://uicdn.toast.com/editor/latest/toastui-editor.min.css">
|
|
9
|
-
<link rel="stylesheet" href="https://uicdn.toast.com/editor/latest/theme/toastui-editor-dark.min.css">
|
|
10
|
-
<script src="https://uicdn.toast.com/editor/latest/toastui-editor-all.min.js"></script>
|
|
11
|
-
<style>.notes-app{display:flex;height:100%;width:100%;background:var(--bg-tertiary);border-radius:12px;overflow:hidden;border:1px solid var(--border-color)}.notes-sidebar{width:280px;min-width:280px;background:var(--bg-secondary);border-right:1px solid var(--border-color);display:flex;flex-direction:column}.notes-sidebar-header{padding:16px;border-bottom:1px solid var(--border-color);display:flex;justify-content:space-between;align-items:center}.notes-sidebar-header h3{margin:0;font-size:18px;font-weight:600;color:var(--text-primary)}.add-note-btn{background:linear-gradient(135deg,var(--accent-primary),var(--accent-secondary));color:#fff;border:none;padding:8px 14px;border-radius:8px;cursor:pointer;font-size:13px;font-weight:500;transition:transform .2s,box-shadow .2s}.add-note-btn:hover{transform:translateY(-1px);box-shadow:0 4px 12px var(--accent-glow)}.notes-list{flex:1;overflow-y:auto;padding:8px}.note-item{padding:12px 14px;margin-bottom:6px;background:var(--bg-tertiary);border-radius:8px;cursor:pointer;transition:.2s;border:2px solid transparent}.note-item:hover{background:var(--bg-primary)}.note-item.active{border-color:var(--accent-primary);background:var(--bg-primary)}.note-item-title{font-weight:600;color:var(--text-primary);font-size:14px;margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.note-item-preview{font-size:12px;color:var(--text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.notes-main{flex:1;display:flex;flex-direction:column;background:var(--bg-tertiary)}.notes-instructions{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--text-secondary);text-align:center;padding:40px}.instructions-icon{font-size:64px;margin-bottom:20px;opacity:.6}.notes-instructions h2{margin:0 0 12px;color:var(--text-primary);font-size:24px}.notes-instructions p{margin:0;font-size:15px;max-width:300px;line-height:1.5}.notes-editor{flex:1;display:flex;flex-direction:column;padding:20px}.note-title-input{font-size:24px;font-weight:600;border:none;background:0 0;color:var(--text-primary);padding:12px 0;margin-bottom:12px;border-bottom:2px solid var(--border-color);outline:0}.note-title-input:focus{border-bottom-color:var(--accent-primary)}.note-title-input::placeholder{color:var(--text-secondary);opacity:.6}.note-content-input{flex:1;font-size:15px;line-height:1.6;border:none;background:var(--bg-secondary);color:var(--text-primary);padding:16px;border-radius:10px;resize:none;outline:0;font-family:inherit}.note-content-input:focus{box-shadow:0 0 0 2px var(--accent-primary)}.note-content-input::placeholder{color:var(--text-secondary);opacity:.6}.note-actions{display:flex;gap:12px;margin-top:16px;justify-content:flex-end}.note-delete-btn,.note-save-btn{padding:10px 20px;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;transition:.2s;border:none}.note-save-btn{background:linear-gradient(135deg,var(--accent-primary),var(--accent-secondary));color:#fff}.note-save-btn:hover{transform:translateY(-1px);box-shadow:0 4px 12px var(--accent-glow)}.note-delete-btn{background:var(--bg-secondary);color:#e74c3c;border:1px solid #e74c3c}.note-delete-btn:hover{background:#e74c3c;color:#fff}.light-mode .note-content-input{background:rgba(255,255,255,.7)}</style><style id="notes-styles">.notes-app{display:flex;height:100%;width:100%;background:var(--bg-tertiary);border-radius:12px;overflow:hidden;border:1px solid var(--border-color)}.notes-sidebar{width:280px;min-width:280px;background:var(--bg-secondary);border-right:1px solid var(--border-color);display:flex;flex-direction:column}.notes-sidebar-header{padding:16px;border-bottom:1px solid var(--border-color);display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px}.notes-sidebar-header h3{margin:0;font-size:18px;font-weight:600;color:var(--text-primary)}.add-note-btn{background:linear-gradient(135deg,var(--accent-primary),var(--accent-secondary));color:#fff;border:none;padding:8px 14px;border-radius:8px;cursor:pointer;font-size:13px;font-weight:500;transition:transform .2s,box-shadow .2s}.add-note-btn:hover{transform:translateY(-1px);box-shadow:0 4px 12px var(--accent-glow)}.notes-filter-input{width:100%;padding:8px 12px;border:1px solid var(--border-color);border-radius:8px;background:var(--bg-tertiary);color:var(--text-primary);font-size:13px;outline:0;margin-top:8px;box-sizing:border-box}.notes-filter-input:focus{border-color:var(--accent-primary);box-shadow:0 0 0 2px var(--accent-glow)}.notes-filter-input::placeholder{color:var(--text-secondary);opacity:.6}.notes-list{flex:1;overflow-y:auto;padding:8px}.note-item{padding:12px 14px;margin-bottom:6px;background:var(--bg-tertiary);border-radius:8px;cursor:pointer;transition:.2s;border:2px solid transparent}.note-item:hover{background:var(--bg-primary)}.note-item.active{border-color:var(--accent-primary);background:var(--bg-primary)}.note-item-title{font-weight:600;color:var(--text-primary);font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.notes-main{flex:1;display:flex;flex-direction:column;background:var(--bg-tertiary);min-width:0;overflow:hidden}.notes-instructions{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--text-secondary);text-align:center;padding:40px}.instructions-icon{font-size:64px;margin-bottom:20px;opacity:.6}.notes-instructions h2{margin:0 0 12px;color:var(--text-primary);font-size:24px}.notes-instructions p{margin:0;font-size:15px;max-width:300px;line-height:1.5}.notes-editor{flex:1;display:flex;flex-direction:column;padding:20px;min-width:0;overflow:hidden}.note-title-input{font-size:24px;font-weight:600;border:none;background:0 0;color:var(--text-primary);padding:12px 0;margin-bottom:12px;border-bottom:2px solid var(--border-color);outline:0}.note-title-input:focus{border-bottom-color:var(--accent-primary)}.note-title-input::placeholder{color:var(--text-secondary);opacity:.6}.note-content-input{flex:1;font-size:15px;line-height:1.6;border:none;background:var(--bg-secondary);color:var(--text-primary);padding:16px;border-radius:10px;resize:none;outline:0;font-family:inherit}.note-content-input:focus{box-shadow:0 0 0 2px var(--accent-primary)}.note-content-input::placeholder{color:var(--text-secondary);opacity:.6}.note-actions{display:flex;gap:12px;margin-top:16px;justify-content:flex-end}.note-delete-btn,.note-save-btn{padding:10px 20px;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;transition:.2s;border:none}.note-save-btn{background:linear-gradient(135deg,var(--accent-primary),var(--accent-secondary));color:#fff}.note-save-btn:hover{transform:translateY(-1px);box-shadow:0 4px 12px var(--accent-glow)}.note-delete-btn{background:var(--bg-secondary);color:#e74c3c;border:1px solid #e74c3c}.note-delete-btn:hover{background:#e74c3c;color:#fff}.light-mode .note-content-input,.light-mode .notes-filter-input{background:rgba(255,255,255,.7)}</style><style id="toastui-theme-overrides">.toastui-editor-defaultUI{border:none!important;border-radius:10px!important;overflow:hidden}.toastui-editor-mode-switch{display:none!important}#editor-container{flex:1;display:flex;flex-direction:column;min-height:0}#editor-container .toastui-editor-defaultUI{flex:1;display:flex;flex-direction:column}#editor-container .toastui-editor-main{flex:1}</style></head>
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
<body><div class="chat-panel" data-locked="true">
|
|
15
|
-
<div class="chat-header" data-locked="true">SynthOS</div>
|
|
16
|
-
<div class="chat-messages" id="chatMessages" data-locked="true"><div class="chat-message"><p><strong>SynthOS:</strong> Welcome to <strong>My Notes</strong> — a simple note-taking app! Your notes are listed in the sidebar on the left. Click any note to view or edit it, or tap "+ New Note" to create a fresh one. Each note has a rich text editor with formatting tools, and you can save or delete notes using the buttons below the editor. Use the search box to filter notes by title or content. What would you like to do?</p></div></div>
|
|
17
|
-
<div class="link-group" data-locked="true">
|
|
18
|
-
<a href="#" id="saveLink" data-locked="true">Save</a>
|
|
19
|
-
<a href="/pages" id="pagesLink" data-locked="true">Pages</a>
|
|
20
|
-
<a href="#" id="resetLink" data-locked="true">Reset</a>
|
|
21
|
-
</div>
|
|
22
|
-
<form action="/" method="POST" id="chatForm" data-locked="true">
|
|
23
|
-
<input type="text" class="chat-input" id="chatInput" name="message" placeholder="Type a message..." data-locked="true">
|
|
24
|
-
<button type="submit" class="chat-submit" data-locked="true">Send</button>
|
|
25
|
-
</form>
|
|
26
|
-
</div>
|
|
27
|
-
<div class="viewer-panel" id="viewerPanel"><div class="notes-app"><div class="notes-sidebar"><div class="notes-sidebar-header"><h3>My Notes</h3><button class="add-note-btn" id="addNoteBtn">+ New Note</button><input type="text" class="notes-filter-input" id="notesFilterInput" placeholder="Search notes..."></div><div class="notes-list" id="notesList"></div></div><div class="notes-main"><div class="notes-instructions" id="notesInstructions"><div class="instructions-icon">📝</div><h2>Welcome to Notes</h2><p>Select a note from the sidebar to view or edit it, or click "+ New Note" to create a new one.</p></div><div class="notes-editor" id="notesEditor" style="display: none;"><input type="text" class="note-title-input" id="noteTitleInput" placeholder="Note title..."><div id="editor-container"></div><div class="note-actions"><button class="note-save-btn" id="noteSaveBtn">💾 Save</button><button class="note-delete-btn" id="noteDeleteBtn">🗑️ Delete</button></div></div></div></div><div id="loadingOverlay" class="loading-overlay"><div class="spinner"></div></div></div>
|
|
28
|
-
<div id="instructions" style="display: none;" data-locked="true"></div>
|
|
29
|
-
<div id="thoughts" style="display: none;" data-locked="true"></div>
|
|
30
|
-
<script id="notes-app-logic">let currentNoteId=null,notes=[],editor=null;function initEditor(){editor=new toastui.Editor({el:document.querySelector("#editor-container"),height:"100%",initialEditType:"wysiwyg",previewStyle:"vertical",theme:"light"===window.themeInfo.mode?"light":"dark",placeholder:"Start writing your note...",toolbarItems:[["heading","bold","italic","strike"],["hr","quote"],["ul","ol","task","indent","outdent"],["table","link","image"],["code","codeblock"]]})}async function loadNotes(){try{notes=await synthos.data.list("notes"),renderNotesList()}catch(e){console.error("Failed to load notes:",e),notes=[],renderNotesList()}}function renderNotesList(){const list=document.getElementById("notesList"),filter=(document.getElementById("notesFilterInput").value||"").toLowerCase();list.innerHTML="";const filtered=filter?notes.filter(n=>(n.title||"").toLowerCase().includes(filter)):notes;0!==filtered.length?filtered.forEach(note=>{const item=document.createElement("div");item.className="note-item"+(currentNoteId===note.id?" active":""),item.innerHTML=`<div class="note-item-title">${escapeHtml(note.title||"Untitled")}</div>`,item.onclick=()=>selectNote(note.id),list.appendChild(item)}):list.innerHTML='<div style="padding:20px;text-align:center;color:var(--text-secondary);font-size:13px;">'+(filter?"No matching notes.":'No notes yet.<br>Click "+ New Note" to create one.')+"</div>"}function escapeHtml(text){const div=document.createElement("div");return div.textContent=text,div.innerHTML}function selectNote(id){currentNoteId=id;const note=notes.find(n=>n.id===id);note&&(document.getElementById("notesInstructions").style.display="none",document.getElementById("notesEditor").style.display="flex",document.getElementById("noteTitleInput").value=note.title||"",editor&&editor.setMarkdown(note.content||""),renderNotesList())}function showInstructions(){currentNoteId=null,document.getElementById("notesInstructions").style.display="flex",document.getElementById("notesEditor").style.display="none",renderNotesList()}document.getElementById("addNoteBtn").onclick=async function(){const newNote={id:crypto.randomUUID(),title:"",content:""};try{const saved=await synthos.data.save("notes",newNote);notes.unshift(saved),selectNote(saved.id)}catch(e){console.error("Failed to create note:",e)}},document.getElementById("noteSaveBtn").onclick=async function(){if(!currentNoteId)return;const title=document.getElementById("noteTitleInput").value,content=editor?editor.getMarkdown():"";try{const updated=await synthos.data.save("notes",{id:currentNoteId,title:title,content:content}),idx=notes.findIndex(n=>n.id===currentNoteId);idx>=0&&(notes[idx]=updated),renderNotesList()}catch(e){console.error("Failed to save note:",e)}},document.getElementById("noteDeleteBtn").onclick=async function(){if(currentNoteId&&confirm("Are you sure you want to delete this note?"))try{await synthos.data.remove("notes",currentNoteId),notes=notes.filter(n=>n.id!==currentNoteId),showInstructions()}catch(e){console.error("Failed to delete note:",e)}},document.getElementById("notesFilterInput").addEventListener("input",renderNotesList),initEditor(),loadNotes();</script>
|
|
31
|
-
<script id="page-helpers" src="/api/page-helpers.js?v=2" data-locked="true"></script>
|
|
32
|
-
<script id="page-script" src="/api/page-script.js?v=2" data-locked="true"></script>
|
|
33
|
-
</body></html>
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head>
|
|
2
|
-
<meta charset="UTF-8">
|
|
3
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
4
|
-
<title>SynthOS</title>
|
|
5
|
-
<script id="theme-info" src="/api/theme-info.js" data-locked="true"></script>
|
|
6
|
-
<link id="theme-css" rel="stylesheet" href="/api/theme.css" data-locked="true">
|
|
7
|
-
<style>#gameCanvas{display:block}.game-ui{position:absolute;top:20px;left:20px;right:20px;display:flex;justify-content:space-between;pointer-events:none;z-index:10}.level-display,.lives-display,.score-display{font-family:Orbitron,'Segoe UI',sans-serif;font-size:18px;color:#0ff;text-shadow:0 0 10px #0ff,0 0 20px #0ff;letter-spacing:2px}.game-over-screen,.start-screen{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;z-index:20}.game-over-screen h1,.start-screen h1{font-family:Orbitron,'Segoe UI',sans-serif;font-size:48px;color:#f0f;text-shadow:0 0 20px #f0f,0 0 40px #f0f,0 0 60px #f0f;margin-bottom:20px;letter-spacing:5px}.game-over-screen p,.start-screen p{font-size:18px;color:#0ff;text-shadow:0 0 10px #0ff;margin-bottom:30px}.restart-btn,.start-btn{padding:15px 40px;font-size:18px;font-family:Orbitron,'Segoe UI',sans-serif;background:0 0;border:2px solid #0ff;color:#0ff;cursor:pointer;text-transform:uppercase;letter-spacing:3px;transition:.3s;box-shadow:0 0 20px rgba(0,255,255,.3),inset 0 0 20px rgba(0,255,255,.1)}.restart-btn:hover,.start-btn:hover{background:rgba(0,255,255,.2);box-shadow:0 0 30px rgba(0,255,255,.5),inset 0 0 30px rgba(0,255,255,.2);transform:scale(1.05)}.controls-info{position:absolute;bottom:20px;left:50%;transform:translateX(-50%);font-size:14px;color:rgba(0,255,255,.6);text-align:center;letter-spacing:1px}</style>
|
|
8
|
-
<link href="https://fonts.googleapis.com/css2?family=Orbitron:wght@400;700&display=swap" rel="stylesheet">
|
|
9
|
-
</head>
|
|
10
|
-
|
|
11
|
-
<body>
|
|
12
|
-
<div class="chat-panel" data-locked="true">
|
|
13
|
-
<div class="chat-header" data-locked="true">SynthOS</div>
|
|
14
|
-
<div class="chat-messages" id="chatMessages" data-locked="true">
|
|
15
|
-
<div class="chat-message">
|
|
16
|
-
<p><strong>SynthOS:</strong> What can I create for you?</p>
|
|
17
|
-
</div>
|
|
18
|
-
<div class="chat-message">
|
|
19
|
-
<p><strong>You:</strong> create super cool version of astroids...</p>
|
|
20
|
-
</div>
|
|
21
|
-
<div class="chat-message">
|
|
22
|
-
<p><strong>SynthOS:</strong> 🚀 Launching NEON ASTEROIDS! A synthwave-styled space shooter with glowing
|
|
23
|
-
neon graphics, particle explosions, screen shake effects, and progressive difficulty. Use WASD or
|
|
24
|
-
Arrow keys to move, SPACE to shoot. Destroy asteroids, survive, and chase that high score!</p>
|
|
25
|
-
</div>
|
|
26
|
-
<div class="chat-message">
|
|
27
|
-
<p><strong>You:</strong> great game but a couple of things missing... the rocks should progressively
|
|
28
|
-
speed up as the level increases. dropping power ups that are extra lives should be rare. it's also
|
|
29
|
-
missing the saucers that fly across the screen and shoot at you starting on level 2</p>
|
|
30
|
-
</div>
|
|
31
|
-
<div class="chat-message">
|
|
32
|
-
<p><strong>SynthOS:</strong> 🛸 Updated! Added: 1) Asteroids now speed up with each level (+15% per
|
|
33
|
-
level), 2) Extra life power-ups are now rare (5% chance vs 15% for others), 3) Enemy UFO saucers
|
|
34
|
-
appear starting Level 2 - they fly across the screen, track you, and shoot back! Small saucers are
|
|
35
|
-
faster and more accurate. Watch out for those glowing red menaces! 👾</p>
|
|
36
|
-
</div>
|
|
37
|
-
</div>
|
|
38
|
-
<div class="link-group" data-locked="true">
|
|
39
|
-
<a href="#" id="saveLink" data-locked="true">Save</a>
|
|
40
|
-
<a href="/pages" id="pagesLink" data-locked="true">Pages</a>
|
|
41
|
-
<a href="#" id="resetLink" data-locked="true">Reset</a>
|
|
42
|
-
</div>
|
|
43
|
-
<form action="/" method="POST" id="chatForm" data-locked="true">
|
|
44
|
-
<input type="text" class="chat-input" id="chatInput" name="message" placeholder="Type a message..." data-locked="true">
|
|
45
|
-
<button type="submit" class="chat-submit" data-locked="true">Send</button>
|
|
46
|
-
</form>
|
|
47
|
-
</div>
|
|
48
|
-
<div class="viewer-panel" id="viewerPanel">
|
|
49
|
-
<canvas id="gameCanvas"></canvas>
|
|
50
|
-
<div class="game-ui">
|
|
51
|
-
<div class="score-display">SCORE: <span id="score">0</span></div>
|
|
52
|
-
<div class="level-display">LEVEL: <span id="level">1</span></div>
|
|
53
|
-
<div class="lives-display">LIVES: <span id="lives">3</span></div>
|
|
54
|
-
</div>
|
|
55
|
-
<div class="start-screen" id="startScreen">
|
|
56
|
-
<h1>NEON ASTEROIDS</h1>
|
|
57
|
-
<p>Navigate the cosmic void. Destroy all asteroids. Beware the saucers!</p>
|
|
58
|
-
<button class="start-btn" id="startBtn">START MISSION</button>
|
|
59
|
-
</div>
|
|
60
|
-
<div class="game-over-screen" id="gameOverScreen" style="display: none;">
|
|
61
|
-
<h1>GAME OVER</h1>
|
|
62
|
-
<p>Final Score: <span id="finalScore">0</span></p>
|
|
63
|
-
<button class="restart-btn" id="restartBtn">TRY AGAIN</button>
|
|
64
|
-
</div>
|
|
65
|
-
<div class="controls-info">WASD / ARROWS to move • SPACE to fire • P to pause</div>
|
|
66
|
-
<div id="loadingOverlay" class="loading-overlay">
|
|
67
|
-
<div class="spinner"></div>
|
|
68
|
-
</div>
|
|
69
|
-
</div>
|
|
70
|
-
<div id="instructions" style="display: none;" data-locked="true"></div>
|
|
71
|
-
<div id="thoughts" style="display: none;" data-locked="true"></div>
|
|
72
|
-
<script id="asteroids-game">const canvas=document.getElementById("gameCanvas"),ctx=canvas.getContext("2d"),viewerPanel=document.getElementById("viewerPanel");function resizeCanvas(){canvas.width=viewerPanel.clientWidth,canvas.height=viewerPanel.clientHeight}resizeCanvas(),window.addEventListener("resize",resizeCanvas);let gameRunning=!1,gamePaused=!1,score=0,lives=3,level=1,screenShake=0;const ship={x:0,y:0,vx:0,vy:0,angle:-Math.PI/2,radius:15,thrust:0,rotationSpeed:0,invincible:0,shield:0,rapidFire:0,multiShot:0};let bullets=[],asteroids=[],particles=[],powerUps=[],stars=[],saucers=[],saucerBullets=[],saucerSpawnTimer=0;const keys={};function initStars(){stars=[];for(let i=0;i<150;i++)stars.push({x:Math.random()*canvas.width,y:Math.random()*canvas.height,size:2*Math.random()+.5,speed:.5*Math.random()+.1,brightness:Math.random()})}function initGame(){ship.x=canvas.width/2,ship.y=canvas.height/2,ship.vx=0,ship.vy=0,ship.angle=-Math.PI/2,ship.invincible=180,ship.shield=0,ship.rapidFire=0,ship.multiShot=0,bullets=[],asteroids=[],particles=[],powerUps=[],saucers=[],saucerBullets=[],saucerSpawnTimer=0,score=0,lives=3,level=1,initStars(),spawnAsteroids(4),updateUI()}function getLevelSpeedMultiplier(){return 1+.15*(level-1)}function spawnAsteroids(count){for(let i=0;i<count;i++){let x,y;do{x=Math.random()*canvas.width,y=Math.random()*canvas.height}while(distance(x,y,ship.x,ship.y)<150);asteroids.push(createAsteroid(x,y,3))}}function createAsteroid(x,y,size){const speed=(.5*(4-size)+1.5*Math.random())*getLevelSpeedMultiplier(),angle=Math.random()*Math.PI*2,radii=[],points=8+Math.floor(5*Math.random()),baseRadius=15*size+10;for(let i=0;i<points;i++)radii.push(baseRadius*(.7+.6*Math.random()));return{x:x,y:y,vx:Math.cos(angle)*speed,vy:Math.sin(angle)*speed,size:size,radii:radii,points:points,rotation:0,rotationSpeed:.03*(Math.random()-.5),color:3===size?"#ff00ff":2===size?"#ffff00":"#00ffff"}}function createSaucer(){const isSmall=Math.random()>.5,fromLeft=Math.random()>.5,y=Math.random()*(canvas.height-100)+50;return{x:fromLeft?-30:canvas.width+30,y:y,vx:(fromLeft?1:-1)*(isSmall?3:2)*getLevelSpeedMultiplier(),vy:0,isSmall:isSmall,radius:isSmall?15:25,shootTimer:60+60*Math.random(),directionChangeTimer:60+120*Math.random(),points:isSmall?1e3:500}}function distance(x1,y1,x2,y2){return Math.sqrt((x2-x1)**2+(y2-y1)**2)}function wrap(obj){obj.x<-50&&(obj.x=canvas.width+50),obj.x>canvas.width+50&&(obj.x=-50),obj.y<-50&&(obj.y=canvas.height+50),obj.y>canvas.height+50&&(obj.y=-50)}function createExplosion(x,y,color,count=20){for(let i=0;i<count;i++){const angle=Math.random()*Math.PI*2,speed=5*Math.random()+2;particles.push({x:x,y:y,vx:Math.cos(angle)*speed,vy:Math.sin(angle)*speed,life:60+30*Math.random(),maxLife:90,color:color,size:3*Math.random()+1})}screenShake=10}let shootCooldown=0;function shoot(){if(shootCooldown>0)return;const cooldown=ship.rapidFire>0?5:15;shootCooldown=cooldown,(ship.multiShot>0?[-.2,0,.2]:[0]).forEach(offset=>{const angle=ship.angle+offset;bullets.push({x:ship.x+20*Math.cos(angle),y:ship.y+20*Math.sin(angle),vx:10*Math.cos(angle)+.5*ship.vx,vy:10*Math.sin(angle)+.5*ship.vy,life:60})})}function saucerShoot(saucer){let angle=Math.atan2(ship.y-saucer.y,ship.x-saucer.x);saucer.isSmall?angle+=.2*(Math.random()-.5):angle+=.5*(Math.random()-.5),saucerBullets.push({x:saucer.x,y:saucer.y,vx:6*Math.cos(angle),vy:6*Math.sin(angle),life:90})}function spawnPowerUp(x,y){if(Math.random()>.15)return;let type;const rand=Math.random();type=rand<.05?"life":rand<.38?"shield":rand<.71?"rapid":"multi",powerUps.push({x:x,y:y,type:type,life:600,pulse:0})}function updateUI(){document.getElementById("score").textContent=score,document.getElementById("level").textContent=level,document.getElementById("lives").textContent=lives}function update(){if(!gameRunning||gamePaused)return;(keys.ArrowLeft||keys.KeyA)&&(ship.angle-=.08),(keys.ArrowRight||keys.KeyD)&&(ship.angle+=.08),keys.ArrowUp||keys.KeyW?(ship.vx+=.15*Math.cos(ship.angle),ship.vy+=.15*Math.sin(ship.angle),ship.thrust=1):ship.thrust*=.95,keys.Space&&shoot(),ship.vx*=.99,ship.vy*=.99;const speed=Math.sqrt(ship.vx**2+ship.vy**2);if(speed>8&&(ship.vx=ship.vx/speed*8,ship.vy=ship.vy/speed*8),ship.x+=ship.vx,ship.y+=ship.vy,wrap(ship),ship.invincible>0&&ship.invincible--,ship.shield>0&&ship.shield--,ship.rapidFire>0&&ship.rapidFire--,ship.multiShot>0&&ship.multiShot--,shootCooldown>0&&shootCooldown--,level>=2){saucerSpawnTimer++;const spawnInterval=Math.max(300,600-30*level);saucerSpawnTimer>=spawnInterval&&saucers.length<2&&(saucers.push(createSaucer()),saucerSpawnTimer=0)}saucers=saucers.filter(s=>(s.x+=s.vx,s.y+=s.vy,s.directionChangeTimer--,s.directionChangeTimer<=0&&(s.vy=2*(Math.random()-.5),s.directionChangeTimer=60+120*Math.random()),s.y<50&&(s.vy=Math.abs(s.vy)),s.y>canvas.height-50&&(s.vy=-Math.abs(s.vy)),s.shootTimer--,s.shootTimer<=0&&(saucerShoot(s),s.shootTimer=s.isSmall?40+40*Math.random():60+60*Math.random()),s.x>-50&&s.x<canvas.width+50)),saucerBullets=saucerBullets.filter(b=>(b.x+=b.vx,b.y+=b.vy,b.life--,b.life>0&&b.x>-10&&b.x<canvas.width+10&&b.y>-10&&b.y<canvas.height+10)),bullets=bullets.filter(b=>(b.x+=b.vx,b.y+=b.vy,b.life--,wrap(b),b.life>0)),asteroids.forEach(a=>{a.x+=a.vx,a.y+=a.vy,a.rotation+=a.rotationSpeed,wrap(a)}),particles=particles.filter(p=>(p.x+=p.vx,p.y+=p.vy,p.vx*=.98,p.vy*=.98,p.life--,p.life>0)),powerUps=powerUps.filter(p=>(p.life--,p.pulse+=.1,p.life>0)),stars.forEach(s=>{s.y+=s.speed,s.y>canvas.height&&(s.y=0,s.x=Math.random()*canvas.width),s.brightness=.3+.3*Math.sin(.003*Date.now()+s.x)}),bullets.forEach((b,bi)=>{asteroids.forEach((a,ai)=>{const avgRadius=a.radii.reduce((sum,r)=>sum+r,0)/a.radii.length;if(distance(b.x,b.y,a.x,a.y)<avgRadius){if(bullets.splice(bi,1),createExplosion(a.x,a.y,a.color,15),a.size>1)for(let i=0;i<2;i++)asteroids.push(createAsteroid(a.x,a.y,a.size-1));spawnPowerUp(a.x,a.y),asteroids.splice(ai,1),score+=100*(4-a.size),updateUI()}})}),bullets.forEach((b,bi)=>{saucers.forEach((s,si)=>{distance(b.x,b.y,s.x,s.y)<s.radius&&(bullets.splice(bi,1),createExplosion(s.x,s.y,"#ff6600",25),score+=s.points,saucers.splice(si,1),updateUI())})}),ship.invincible<=0&&ship.shield<=0&&asteroids.forEach((a,ai)=>{const avgRadius=a.radii.reduce((sum,r)=>sum+r,0)/a.radii.length;distance(ship.x,ship.y,a.x,a.y)<avgRadius+ship.radius&&(createExplosion(ship.x,ship.y,"#00ffff",30),lives--,updateUI(),lives<=0?gameOver():(ship.x=canvas.width/2,ship.y=canvas.height/2,ship.vx=0,ship.vy=0,ship.invincible=180))}),ship.invincible<=0&&ship.shield<=0&&saucers.forEach((s,si)=>{distance(ship.x,ship.y,s.x,s.y)<s.radius+ship.radius&&(createExplosion(ship.x,ship.y,"#00ffff",30),createExplosion(s.x,s.y,"#ff6600",25),saucers.splice(si,1),lives--,updateUI(),lives<=0?gameOver():(ship.x=canvas.width/2,ship.y=canvas.height/2,ship.vx=0,ship.vy=0,ship.invincible=180))}),ship.invincible<=0&&ship.shield<=0&&saucerBullets.forEach((b,bi)=>{distance(ship.x,ship.y,b.x,b.y)<ship.radius+5&&(createExplosion(ship.x,ship.y,"#00ffff",30),saucerBullets.splice(bi,1),lives--,updateUI(),lives<=0?gameOver():(ship.x=canvas.width/2,ship.y=canvas.height/2,ship.vx=0,ship.vy=0,ship.invincible=180))}),powerUps.forEach((p,pi)=>{if(distance(ship.x,ship.y,p.x,p.y)<30)switch(powerUps.splice(pi,1),createExplosion(p.x,p.y,"#00ff00",10),p.type){case"shield":ship.shield=600;break;case"rapid":ship.rapidFire=600;break;case"multi":ship.multiShot=600;break;case"life":lives=Math.min(lives+1,5),updateUI()}}),0===asteroids.length&&(level++,updateUI(),spawnAsteroids(3+level),saucerSpawnTimer=0),screenShake>0&&(screenShake*=.9)}function draw(){ctx.save(),screenShake>.5&&ctx.translate((Math.random()-.5)*screenShake,(Math.random()-.5)*screenShake),ctx.fillStyle="#000",ctx.fillRect(0,0,canvas.width,canvas.height),stars.forEach(s=>{ctx.fillStyle=`rgba(255, 255, 255, ${s.brightness})`,ctx.beginPath(),ctx.arc(s.x,s.y,s.size,0,2*Math.PI),ctx.fill()}),particles.forEach(p=>{const alpha=p.life/p.maxLife;ctx.fillStyle=p.color,ctx.globalAlpha=alpha,ctx.beginPath(),ctx.arc(p.x,p.y,p.size,0,2*Math.PI),ctx.fill(),ctx.globalAlpha=1}),powerUps.forEach(p=>{const pulse=5*Math.sin(p.pulse);ctx.strokeStyle="shield"===p.type?"#00ffff":"rapid"===p.type?"#ff0000":"multi"===p.type?"#ffff00":"#00ff00",ctx.lineWidth=2,ctx.shadowColor=ctx.strokeStyle,ctx.shadowBlur=15,ctx.beginPath(),ctx.arc(p.x,p.y,15+pulse,0,2*Math.PI),ctx.stroke(),ctx.fillStyle=ctx.strokeStyle,ctx.font="12px Arial",ctx.textAlign="center",ctx.textBaseline="middle";const icon="shield"===p.type?"S":"rapid"===p.type?"R":"multi"===p.type?"M":"+";ctx.fillText(icon,p.x,p.y),ctx.shadowBlur=0}),asteroids.forEach(a=>{ctx.save(),ctx.translate(a.x,a.y),ctx.rotate(a.rotation),ctx.strokeStyle=a.color,ctx.lineWidth=2,ctx.shadowColor=a.color,ctx.shadowBlur=20,ctx.beginPath();for(let i=0;i<a.points;i++){const angle=i/a.points*Math.PI*2,r=a.radii[i],x=Math.cos(angle)*r,y=Math.sin(angle)*r;0===i?ctx.moveTo(x,y):ctx.lineTo(x,y)}ctx.closePath(),ctx.stroke(),ctx.restore()}),saucers.forEach(s=>{ctx.save(),ctx.translate(s.x,s.y),ctx.strokeStyle="#ff6600",ctx.lineWidth=2,ctx.shadowColor="#ff6600",ctx.shadowBlur=20;const r=s.radius;ctx.beginPath(),ctx.ellipse(0,.2*-r,.4*r,.3*r,0,Math.PI,0),ctx.stroke(),ctx.beginPath(),ctx.ellipse(0,0,r,.35*r,0,0,2*Math.PI),ctx.stroke(),ctx.beginPath(),ctx.ellipse(0,.15*r,.5*r,.2*r,0,0,Math.PI),ctx.stroke(),ctx.fillStyle="#ff6600";for(let i=0;i<3;i++){const lx=(i-1)*r*.5;ctx.beginPath(),ctx.arc(lx,0,3,0,2*Math.PI),ctx.fill()}ctx.restore()}),saucerBullets.forEach(b=>{ctx.fillStyle="#ff6600",ctx.shadowColor="#ff6600",ctx.shadowBlur=15,ctx.beginPath(),ctx.arc(b.x,b.y,4,0,2*Math.PI),ctx.fill()}),bullets.forEach(b=>{ctx.fillStyle="#00ffff",ctx.shadowColor="#00ffff",ctx.shadowBlur=15,ctx.beginPath(),ctx.arc(b.x,b.y,3,0,2*Math.PI),ctx.fill(),ctx.strokeStyle="rgba(0, 255, 255, 0.5)",ctx.lineWidth=2,ctx.beginPath(),ctx.moveTo(b.x,b.y),ctx.lineTo(b.x-2*b.vx,b.y-2*b.vy),ctx.stroke()}),gameRunning&&(ship.invincible<=0||Math.floor(ship.invincible/5)%2==0)&&(ctx.save(),ctx.translate(ship.x,ship.y),ctx.rotate(ship.angle),ship.shield>0&&(ctx.strokeStyle="rgba(0, 255, 255, 0.5)",ctx.lineWidth=2,ctx.shadowColor="#00ffff",ctx.shadowBlur=20,ctx.beginPath(),ctx.arc(0,0,25,0,2*Math.PI),ctx.stroke()),ctx.strokeStyle="#00ffff",ctx.lineWidth=2,ctx.shadowColor="#00ffff",ctx.shadowBlur=15,ctx.beginPath(),ctx.moveTo(20,0),ctx.lineTo(-15,-12),ctx.lineTo(-8,0),ctx.lineTo(-15,12),ctx.closePath(),ctx.stroke(),ship.thrust>.1&&(ctx.strokeStyle="#ff6600",ctx.shadowColor="#ff6600",ctx.beginPath(),ctx.moveTo(-8,-5),ctx.lineTo(-20-10*Math.random()*ship.thrust,0),ctx.lineTo(-8,5),ctx.stroke()),ctx.restore()),ctx.shadowBlur=0,ctx.restore()}function gameOver(){gameRunning=!1,document.getElementById("finalScore").textContent=score,document.getElementById("gameOverScreen").style.display="block"}function gameLoop(){update(),draw(),requestAnimationFrame(gameLoop)}document.addEventListener("keydown",e=>{keys[e.code]=!0,"KeyP"===e.code&&gameRunning&&(gamePaused=!gamePaused),["Space","ArrowUp","ArrowDown","ArrowLeft","ArrowRight"].includes(e.code)&&e.preventDefault()}),document.addEventListener("keyup",e=>{keys[e.code]=!1}),document.getElementById("startBtn").addEventListener("click",()=>{document.getElementById("startScreen").style.display="none",initGame(),gameRunning=!0}),document.getElementById("restartBtn").addEventListener("click",()=>{document.getElementById("gameOverScreen").style.display="none",initGame(),gameRunning=!0}),initStars(),gameLoop();</script>
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
<script id="page-helpers" src="/api/page-helpers.js?v=2" data-locked="true"></script>
|
|
76
|
-
<script id="page-script" src="/api/page-script.js?v=2" data-locked="true"></script>
|
|
77
|
-
</body></html>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{ "title": "Sidebar Page", "categories": ["Starters"], "pinned": false, "showInAll": false, "pageVersion": 2, "mode": "unlocked" }
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{ "title": "Solar Tutorial", "categories": ["Tutorials"], "pinned": false, "showInAll": true, "pageVersion": 2, "mode": "unlocked" }
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{ "title": "Two-Panel Page", "categories": ["Starters"], "pinned": false, "showInAll": false, "pageVersion": 2, "mode": "unlocked" }
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useGatewayRoutes.d.ts","sourceRoot":"","sources":["../../src/service/useGatewayRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAWxC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CA0K9E"}
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.useGatewayRoutes = void 0;
|
|
4
|
-
const settings_1 = require("../settings");
|
|
5
|
-
const agents_1 = require("../agents");
|
|
6
|
-
const uuid_1 = require("uuid");
|
|
7
|
-
function useGatewayRoutes(config, app) {
|
|
8
|
-
// GET /api/gateways — List configured gateways with connection status
|
|
9
|
-
app.get('/api/gateways', async (_req, res) => {
|
|
10
|
-
try {
|
|
11
|
-
const settings = await (0, settings_1.loadSettings)(config.pagesFolder);
|
|
12
|
-
const gateways = settings.gateways ?? [];
|
|
13
|
-
const result = gateways.map(gw => ({
|
|
14
|
-
...gw,
|
|
15
|
-
token: undefined,
|
|
16
|
-
...(0, agents_1.getConnectionStatus)(gw.id),
|
|
17
|
-
}));
|
|
18
|
-
res.json(result);
|
|
19
|
-
}
|
|
20
|
-
catch (err) {
|
|
21
|
-
console.error(err);
|
|
22
|
-
res.status(500).json({ error: err.message });
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
// POST /api/gateways — Add or update a gateway config
|
|
26
|
-
app.post('/api/gateways', async (req, res) => {
|
|
27
|
-
try {
|
|
28
|
-
const body = req.body;
|
|
29
|
-
if (!body.url || !body.name) {
|
|
30
|
-
res.status(400).json({ error: 'url and name are required' });
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
if (!body.token) {
|
|
34
|
-
res.status(400).json({ error: 'token is required' });
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
const settings = await (0, settings_1.loadSettings)(config.pagesFolder);
|
|
38
|
-
const gateways = settings.gateways ? [...settings.gateways] : [];
|
|
39
|
-
const gwConfig = {
|
|
40
|
-
id: body.id || (0, uuid_1.v4)(),
|
|
41
|
-
name: body.name,
|
|
42
|
-
url: body.url,
|
|
43
|
-
token: body.token,
|
|
44
|
-
enabled: body.enabled ?? true,
|
|
45
|
-
role: 'operator',
|
|
46
|
-
scopes: body.scopes ?? ['operator.read', 'operator.write'],
|
|
47
|
-
};
|
|
48
|
-
// Upsert
|
|
49
|
-
const idx = gateways.findIndex(g => g.id === gwConfig.id);
|
|
50
|
-
if (idx !== -1) {
|
|
51
|
-
// Preserve token if not provided in update
|
|
52
|
-
if (!body.token && gateways[idx].token) {
|
|
53
|
-
gwConfig.token = gateways[idx].token;
|
|
54
|
-
}
|
|
55
|
-
gateways[idx] = gwConfig;
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
gateways.push(gwConfig);
|
|
59
|
-
}
|
|
60
|
-
await (0, settings_1.saveSettings)(config.pagesFolder, { gateways });
|
|
61
|
-
res.json({ ...gwConfig, token: undefined });
|
|
62
|
-
}
|
|
63
|
-
catch (err) {
|
|
64
|
-
console.error(err);
|
|
65
|
-
res.status(500).json({ error: err.message });
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
// DELETE /api/gateways/:id — Remove gateway and its agents
|
|
69
|
-
app.delete('/api/gateways/:id', async (req, res) => {
|
|
70
|
-
try {
|
|
71
|
-
const { id } = req.params;
|
|
72
|
-
const settings = await (0, settings_1.loadSettings)(config.pagesFolder);
|
|
73
|
-
// Remove gateway
|
|
74
|
-
const gateways = (settings.gateways ?? []).filter(g => g.id !== id);
|
|
75
|
-
// Remove all agents that belong to this gateway
|
|
76
|
-
const agents = (settings.agents ?? []).filter(a => a.gatewayId !== id);
|
|
77
|
-
// Disconnect the WebSocket
|
|
78
|
-
(0, agents_1.disconnectGateway)(id);
|
|
79
|
-
await (0, settings_1.saveSettings)(config.pagesFolder, { gateways, agents });
|
|
80
|
-
res.json({ deleted: true });
|
|
81
|
-
}
|
|
82
|
-
catch (err) {
|
|
83
|
-
console.error(err);
|
|
84
|
-
res.status(500).json({ error: err.message });
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
// POST /api/gateways/:id/connect — Connect to gateway and discover agents
|
|
88
|
-
app.post('/api/gateways/:id/connect', async (req, res) => {
|
|
89
|
-
try {
|
|
90
|
-
const { id } = req.params;
|
|
91
|
-
const settings = await (0, settings_1.loadSettings)(config.pagesFolder);
|
|
92
|
-
const gateway = (settings.gateways ?? []).find(g => g.id === id);
|
|
93
|
-
if (!gateway) {
|
|
94
|
-
res.status(404).json({ error: `Gateway "${id}" not found` });
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
// Connect to gateway
|
|
98
|
-
await (0, agents_1.connectGateway)(gateway);
|
|
99
|
-
// Discover agents
|
|
100
|
-
const discovered = await (0, agents_1.discoverOpenClawAgents)(gateway);
|
|
101
|
-
// Merge discovered agents into settings (upsert by id)
|
|
102
|
-
const agents = settings.agents ? [...settings.agents] : [];
|
|
103
|
-
for (const disc of discovered) {
|
|
104
|
-
const existing = agents.findIndex(a => a.id === disc.id && a.gatewayId === gateway.id);
|
|
105
|
-
if (existing !== -1) {
|
|
106
|
-
// Update name/description but preserve enabled state
|
|
107
|
-
agents[existing].name = disc.name;
|
|
108
|
-
agents[existing].description = disc.description;
|
|
109
|
-
agents[existing].capabilities = disc.capabilities;
|
|
110
|
-
agents[existing].skills = disc.skills;
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
113
|
-
agents.push(disc);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
await (0, settings_1.saveSettings)(config.pagesFolder, { agents });
|
|
117
|
-
res.json({
|
|
118
|
-
connected: true,
|
|
119
|
-
agents: discovered.map(a => ({
|
|
120
|
-
id: a.id,
|
|
121
|
-
name: a.name,
|
|
122
|
-
description: a.description,
|
|
123
|
-
enabled: a.enabled,
|
|
124
|
-
})),
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
catch (err) {
|
|
128
|
-
console.error(err);
|
|
129
|
-
res.status(500).json({ error: err.message });
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
// POST /api/gateways/:id/disconnect — Disconnect WebSocket
|
|
133
|
-
app.post('/api/gateways/:id/disconnect', async (req, res) => {
|
|
134
|
-
try {
|
|
135
|
-
const { id } = req.params;
|
|
136
|
-
(0, agents_1.disconnectGateway)(id);
|
|
137
|
-
res.json({ disconnected: true });
|
|
138
|
-
}
|
|
139
|
-
catch (err) {
|
|
140
|
-
console.error(err);
|
|
141
|
-
res.status(500).json({ error: err.message });
|
|
142
|
-
}
|
|
143
|
-
});
|
|
144
|
-
// GET /api/gateways/:id/agents — List agents discovered on this gateway
|
|
145
|
-
app.get('/api/gateways/:id/agents', async (req, res) => {
|
|
146
|
-
try {
|
|
147
|
-
const { id } = req.params;
|
|
148
|
-
const settings = await (0, settings_1.loadSettings)(config.pagesFolder);
|
|
149
|
-
const agents = (settings.agents ?? []).filter(a => a.gatewayId === id);
|
|
150
|
-
res.json(agents.map(a => ({
|
|
151
|
-
id: a.id,
|
|
152
|
-
name: a.name,
|
|
153
|
-
description: a.description,
|
|
154
|
-
url: a.url,
|
|
155
|
-
enabled: a.enabled,
|
|
156
|
-
provider: a.provider,
|
|
157
|
-
gatewayId: a.gatewayId,
|
|
158
|
-
capabilities: a.capabilities,
|
|
159
|
-
})));
|
|
160
|
-
}
|
|
161
|
-
catch (err) {
|
|
162
|
-
console.error(err);
|
|
163
|
-
res.status(500).json({ error: err.message });
|
|
164
|
-
}
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
exports.useGatewayRoutes = useGatewayRoutes;
|
|
168
|
-
//# sourceMappingURL=useGatewayRoutes.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useGatewayRoutes.js","sourceRoot":"","sources":["../../src/service/useGatewayRoutes.ts"],"names":[],"mappings":"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"}
|