@softtechai/quickmcp 1.0.16 → 1.1.1
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 +3 -3
- package/dist/auth/auth-utils.d.ts +130 -0
- package/dist/auth/auth-utils.d.ts.map +1 -0
- package/dist/auth/auth-utils.js +600 -0
- package/dist/auth/auth-utils.js.map +1 -0
- package/dist/auth/jwks-provider.d.ts +9 -0
- package/dist/auth/jwks-provider.d.ts.map +1 -0
- package/dist/auth/jwks-provider.js +56 -0
- package/dist/auth/jwks-provider.js.map +1 -0
- package/dist/auth/token-utils.d.ts +40 -0
- package/dist/auth/token-utils.d.ts.map +1 -0
- package/dist/auth/token-utils.js +162 -0
- package/dist/auth/token-utils.js.map +1 -0
- package/dist/client/MCPClient.js +5 -4
- package/dist/client/MCPClient.js.map +1 -1
- package/dist/config/auth-config.d.ts +16 -0
- package/dist/config/auth-config.d.ts.map +1 -0
- package/dist/config/auth-config.js +107 -0
- package/dist/config/auth-config.js.map +1 -0
- package/dist/constant/constant.d.ts +20 -0
- package/dist/constant/constant.d.ts.map +1 -0
- package/dist/constant/constant.js +24 -0
- package/dist/constant/constant.js.map +1 -0
- package/dist/database/async-datastore.d.ts +6 -0
- package/dist/database/async-datastore.d.ts.map +1 -0
- package/dist/database/async-datastore.js +15 -0
- package/dist/database/async-datastore.js.map +1 -0
- package/dist/database/database-utils.d.ts +6 -0
- package/dist/database/database-utils.d.ts.map +1 -0
- package/dist/database/database-utils.js +29 -0
- package/dist/database/database-utils.js.map +1 -0
- package/dist/database/datastore.d.ts +164 -0
- package/dist/database/datastore.d.ts.map +1 -0
- package/dist/{parsers/types/index.js → database/datastore.js} +1 -0
- package/dist/database/datastore.js.map +1 -0
- package/dist/database/factory.d.ts +4 -0
- package/dist/database/factory.d.ts.map +1 -0
- package/dist/database/factory.js +32 -0
- package/dist/database/factory.js.map +1 -0
- package/dist/database/jdbc-manager.d.ts +49 -0
- package/dist/database/jdbc-manager.d.ts.map +1 -0
- package/dist/database/jdbc-manager.js +50 -0
- package/dist/database/jdbc-manager.js.map +1 -0
- package/dist/database/sqlite-manager.d.ts +46 -44
- package/dist/database/sqlite-manager.d.ts.map +1 -1
- package/dist/database/sqlite-manager.js +492 -42
- package/dist/database/sqlite-manager.js.map +1 -1
- package/dist/database/supabase-manager.d.ts +58 -0
- package/dist/database/supabase-manager.d.ts.map +1 -0
- package/dist/database/supabase-manager.js +432 -0
- package/dist/database/supabase-manager.js.map +1 -0
- package/dist/generators/MCPServerGenerator.d.ts +103 -20
- package/dist/generators/MCPServerGenerator.d.ts.map +1 -1
- package/dist/generators/MCPServerGenerator.js +6930 -128
- package/dist/generators/MCPServerGenerator.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/integrated-mcp-server-new.d.ts +14 -2
- package/dist/integrated-mcp-server-new.d.ts.map +1 -1
- package/dist/integrated-mcp-server-new.js +270 -180
- package/dist/integrated-mcp-server-new.js.map +1 -1
- package/dist/mcp-core/McpCoreService.d.ts +63 -0
- package/dist/mcp-core/McpCoreService.d.ts.map +1 -0
- package/dist/mcp-core/McpCoreService.js +492 -0
- package/dist/mcp-core/McpCoreService.js.map +1 -0
- package/dist/parsers/CsvParser.d.ts +1 -1
- package/dist/parsers/CsvParser.d.ts.map +1 -1
- package/dist/parsers/CsvParser.js +3 -2
- package/dist/parsers/CsvParser.js.map +1 -1
- package/dist/parsers/DatabaseParser.d.ts.map +1 -1
- package/dist/parsers/DatabaseParser.js +9 -8
- package/dist/parsers/DatabaseParser.js.map +1 -1
- package/dist/parsers/ExcelParser.d.ts +15 -0
- package/dist/parsers/ExcelParser.d.ts.map +1 -1
- package/dist/parsers/ExcelParser.js +287 -21
- package/dist/parsers/ExcelParser.js.map +1 -1
- package/dist/parsers/WebPageParser.d.ts +5 -0
- package/dist/parsers/WebPageParser.d.ts.map +1 -0
- package/dist/parsers/WebPageParser.js +35 -0
- package/dist/parsers/WebPageParser.js.map +1 -0
- package/dist/parsers/index.d.ts +3 -2
- package/dist/parsers/index.d.ts.map +1 -1
- package/dist/parsers/index.js +19 -16
- package/dist/parsers/index.js.map +1 -1
- package/dist/server/api/askApi.d.ts +41 -0
- package/dist/server/api/askApi.d.ts.map +1 -0
- package/dist/server/api/askApi.js +479 -0
- package/dist/server/api/askApi.js.map +1 -0
- package/dist/server/api/authApi.d.ts +101 -0
- package/dist/server/api/authApi.d.ts.map +1 -0
- package/dist/server/api/authApi.js +1472 -0
- package/dist/server/api/authApi.js.map +1 -0
- package/dist/server/api/authProperty.d.ts +18 -0
- package/dist/server/api/authProperty.d.ts.map +1 -0
- package/dist/server/api/authProperty.js +41 -0
- package/dist/server/api/authProperty.js.map +1 -0
- package/dist/server/api/configApi.d.ts +15 -0
- package/dist/server/api/configApi.d.ts.map +1 -0
- package/dist/server/api/configApi.js +42 -0
- package/dist/server/api/configApi.js.map +1 -0
- package/dist/server/api/databaseApi.d.ts +14 -0
- package/dist/server/api/databaseApi.d.ts.map +1 -0
- package/dist/server/api/databaseApi.js +111 -0
- package/dist/server/api/databaseApi.js.map +1 -0
- package/dist/server/api/directoryApi.d.ts +9 -0
- package/dist/server/api/directoryApi.d.ts.map +1 -0
- package/dist/server/api/directoryApi.js +103 -0
- package/dist/server/api/directoryApi.js.map +1 -0
- package/dist/server/api/generateApi.d.ts +24 -0
- package/dist/server/api/generateApi.d.ts.map +1 -0
- package/dist/server/api/generateApi.js +457 -0
- package/dist/server/api/generateApi.js.map +1 -0
- package/dist/server/api/healthApi.d.ts +9 -0
- package/dist/server/api/healthApi.d.ts.map +1 -0
- package/dist/server/api/healthApi.js +15 -0
- package/dist/server/api/healthApi.js.map +1 -0
- package/dist/server/api/indexApi.d.ts +21 -0
- package/dist/server/api/indexApi.d.ts.map +1 -0
- package/dist/server/api/indexApi.js +61 -0
- package/dist/server/api/indexApi.js.map +1 -0
- package/dist/server/api/logsApi.d.ts +12 -0
- package/dist/server/api/logsApi.d.ts.map +1 -0
- package/dist/server/api/logsApi.js +37 -0
- package/dist/server/api/logsApi.js.map +1 -0
- package/dist/server/api/mcpApi.d.ts +20 -0
- package/dist/server/api/mcpApi.d.ts.map +1 -0
- package/dist/server/api/mcpApi.js +120 -0
- package/dist/server/api/mcpApi.js.map +1 -0
- package/dist/server/api/nameApi.d.ts +21 -0
- package/dist/server/api/nameApi.d.ts.map +1 -0
- package/dist/server/api/nameApi.js +42 -0
- package/dist/server/api/nameApi.js.map +1 -0
- package/dist/server/api/parseApi.d.ts +9 -0
- package/dist/server/api/parseApi.d.ts.map +1 -0
- package/dist/server/api/parseApi.js +3245 -0
- package/dist/server/api/parseApi.js.map +1 -0
- package/dist/server/api/serverApi.d.ts +44 -0
- package/dist/server/api/serverApi.d.ts.map +1 -0
- package/dist/server/api/serverApi.js +417 -0
- package/dist/server/api/serverApi.js.map +1 -0
- package/dist/{dynamic-mcp-executor.d.ts → server/dynamic-mcp-executor.d.ts} +4 -5
- package/dist/server/dynamic-mcp-executor.d.ts.map +1 -0
- package/dist/server/dynamic-mcp-executor.js +62 -0
- package/dist/server/dynamic-mcp-executor.js.map +1 -0
- package/dist/server/port-utils.d.ts +14 -0
- package/dist/server/port-utils.d.ts.map +1 -0
- package/dist/server/port-utils.js +31 -0
- package/dist/server/port-utils.js.map +1 -0
- package/dist/server/server-utils.d.ts +13 -0
- package/dist/server/server-utils.d.ts.map +1 -0
- package/dist/server/server-utils.js +72 -0
- package/dist/server/server-utils.js.map +1 -0
- package/dist/{web → server}/server.d.ts +1 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +535 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/tool-executer.d.ts +101 -0
- package/dist/server/tool-executer.d.ts.map +1 -0
- package/dist/server/tool-executer.js +6198 -0
- package/dist/server/tool-executer.js.map +1 -0
- package/dist/types/index.d.ts +1197 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1028 -0
- package/dist/types/index.js.map +1 -1
- package/dist/upload/upload-utils.d.ts +4 -0
- package/dist/upload/upload-utils.d.ts.map +1 -0
- package/dist/upload/upload-utils.js +29 -0
- package/dist/upload/upload-utils.js.map +1 -0
- package/dist/utils/deployment-util.d.ts +14 -0
- package/dist/utils/deployment-util.d.ts.map +1 -0
- package/dist/utils/deployment-util.js +46 -0
- package/dist/utils/deployment-util.js.map +1 -0
- package/dist/utils/logger.d.ts +15 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +56 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +18 -6
- package/quickmcp-direct-stdio.js +183 -187
- package/src/web/public/app.js +15370 -1471
- package/src/web/public/authorization.html +868 -0
- package/src/web/public/database-tables.html +283 -547
- package/src/web/public/how-to-use.html +446 -462
- package/src/web/public/how-to-use.js +4 -4
- package/src/web/public/images/app/activepieces.png +0 -0
- package/src/web/public/images/app/airtable.png +0 -0
- package/src/web/public/images/app/androidstudio.png +0 -0
- package/src/web/public/images/app/antigravity.png +0 -0
- package/src/web/public/images/app/applenotes.png +0 -0
- package/src/web/public/images/app/applereminders.png +0 -0
- package/src/web/public/images/app/asana.png +0 -0
- package/src/web/public/images/app/azureai.png +0 -0
- package/src/web/public/images/app/bash.png +0 -0
- package/src/web/public/images/app/bearnotes.png +0 -0
- package/src/web/public/images/app/bitbucket.png +0 -0
- package/src/web/public/images/app/claude.png +0 -0
- package/src/web/public/images/app/cli.png +0 -0
- package/src/web/public/images/app/clickup.png +0 -0
- package/src/web/public/images/app/cohere.png +0 -0
- package/src/web/public/images/app/confluence.png +0 -0
- package/src/web/public/images/app/confluence2.png +0 -0
- package/src/web/public/images/app/curl.png +0 -0
- package/src/web/public/images/app/curl_mini.png +0 -0
- package/src/web/public/images/app/cursor.png +0 -0
- package/src/web/public/images/app/db2.png +0 -0
- package/src/web/public/images/app/deepseek.png +0 -0
- package/src/web/public/images/app/discord.png +0 -0
- package/src/web/public/images/app/docker.png +0 -0
- package/src/web/public/images/app/dockerhub.png +0 -0
- package/src/web/public/images/app/dropbox.png +0 -0
- package/src/web/public/images/app/elasticsearch.png +0 -0
- package/src/web/public/images/app/facebook.png +0 -0
- package/src/web/public/images/app/falai.png +0 -0
- package/src/web/public/images/app/fireworks.png +0 -0
- package/src/web/public/images/app/gdrive.png +0 -0
- package/src/web/public/images/app/gemini.png +0 -0
- package/src/web/public/images/app/github.png +0 -0
- package/src/web/public/images/app/githubcopilot.png +0 -0
- package/src/web/public/images/app/gitlab.png +0 -0
- package/src/web/public/images/app/gmail.png +0 -0
- package/src/web/public/images/app/googlecalender.png +0 -0
- package/src/web/public/images/app/googledocs.png +0 -0
- package/src/web/public/images/app/googlesheets.png +0 -0
- package/src/web/public/images/app/gradle.png +0 -0
- package/src/web/public/images/app/grafana.png +0 -0
- package/src/web/public/images/app/graphql.png +0 -0
- package/src/web/public/images/app/grok.png +0 -0
- package/src/web/public/images/app/groq.png +0 -0
- package/src/web/public/images/app/hazelcast.png +0 -0
- package/src/web/public/images/app/huggingface.png +0 -0
- package/src/web/public/images/app/imessage.png +0 -0
- package/src/web/public/images/app/instagram.png +0 -0
- package/src/web/public/images/app/intellij.png +0 -0
- package/src/web/public/images/app/jenkins.png +0 -0
- package/src/web/public/images/app/jira.png +0 -0
- package/src/web/public/images/app/kafka.png +0 -0
- package/src/web/public/images/app/kubernetes.png +0 -0
- package/src/web/public/images/app/linear.png +0 -0
- package/src/web/public/images/app/linkedin.png +0 -0
- package/src/web/public/images/app/llama.png +0 -0
- package/src/web/public/images/app/make.png +0 -0
- package/src/web/public/images/app/maven.png +0 -0
- package/src/web/public/images/app/mcp.png +0 -0
- package/src/web/public/images/app/microsoftteams.png +0 -0
- package/src/web/public/images/app/mistral.png +0 -0
- package/src/web/public/images/app/monday.png +0 -0
- package/src/web/public/images/app/mongodb.png +0 -0
- package/src/web/public/images/app/mssql.png +0 -0
- package/src/web/public/images/app/mysql.png +0 -0
- package/src/web/public/images/app/n8n.png +0 -0
- package/src/web/public/images/app/notion.png +0 -0
- package/src/web/public/images/app/npm.png +0 -0
- package/src/web/public/images/app/nuget.png +0 -0
- package/src/web/public/images/app/obsidian.png +0 -0
- package/src/web/public/images/app/openai.png +0 -0
- package/src/web/public/images/app/openrouter.png +0 -0
- package/src/web/public/images/app/opensearch.png +0 -0
- package/src/web/public/images/app/openshift.png +0 -0
- package/src/web/public/images/app/oracle.png +0 -0
- package/src/web/public/images/app/perplexity.png +0 -0
- package/src/web/public/images/app/pipedream.png +0 -0
- package/src/web/public/images/app/postgresql.png +0 -0
- package/src/web/public/images/app/powershell.png +0 -0
- package/src/web/public/images/app/prometheus.png +0 -0
- package/src/web/public/images/app/reddit.png +0 -0
- package/src/web/public/images/app/redis.png +0 -0
- package/src/web/public/images/app/rss.png +0 -0
- package/src/web/public/images/app/signal.png +0 -0
- package/src/web/public/images/app/slack.png +0 -0
- package/src/web/public/images/app/soap.png +0 -0
- package/src/web/public/images/app/sqlite.png +0 -0
- package/src/web/public/images/app/supabase.png +0 -0
- package/src/web/public/images/app/telegram.png +0 -0
- package/src/web/public/images/app/things3.png +0 -0
- package/src/web/public/images/app/threads.png +0 -0
- package/src/web/public/images/app/tiktok.png +0 -0
- package/src/web/public/images/app/together.png +0 -0
- package/src/web/public/images/app/trello.png +0 -0
- package/src/web/public/images/app/vscode.png +0 -0
- package/src/web/public/images/app/webhook.png +0 -0
- package/src/web/public/images/app/webpage.png +0 -0
- package/src/web/public/images/app/whatsappbusiness.png +0 -0
- package/src/web/public/images/app/windsorf.png +0 -0
- package/src/web/public/images/app/x.png +0 -0
- package/src/web/public/images/app/youtube.png +0 -0
- package/src/web/public/images/app/zapier.png +0 -0
- package/src/web/public/images/app/zededitor.png +0 -0
- package/src/web/public/images/app/zoom.png +0 -0
- package/src/web/public/images/avatar-anon.svg +4 -0
- package/src/web/public/images/favicon.png +0 -0
- package/src/web/public/images/install/chatgpt-web/step0.png +0 -0
- package/src/web/public/images/install/chatgpt-web/step1.png +0 -0
- package/src/web/public/images/install/chatgpt-web/step2.png +0 -0
- package/src/web/public/images/install/chatgpt-web/step3.png +0 -0
- package/src/web/public/images/install/chatgpt-web/step4.png +0 -0
- package/src/web/public/images/install/chatgpt-web/step5.png +0 -0
- package/src/web/public/images/readme/1-generate-servers.png +0 -0
- package/src/web/public/images/readme/2-database-connection.png +0 -0
- package/src/web/public/images/readme/2-file-upload.png +0 -0
- package/src/web/public/images/readme/3-data-preview.png +0 -0
- package/src/web/public/images/readme/4-data-preview2.png +0 -0
- package/src/web/public/images/readme/5-server-configuration.png +0 -0
- package/src/web/public/images/readme/6-server-generated-modal.png +0 -0
- package/src/web/public/images/readme/7-generated-servers.png +0 -0
- package/src/web/public/images/readme/8-generated-servers-view-details.png +0 -0
- package/src/web/public/images/readme/Screenshot 2025-10-09 at 20.23.51.png +0 -0
- package/src/web/public/images/readme/Screenshot 2025-10-09 at 20.24.59.png +0 -0
- package/src/web/public/images/readme/Screenshot 2025-10-09 at 20.25.05.png +0 -0
- package/src/web/public/images/readme/Screenshot 2025-10-09 at 20.25.14.png +0 -0
- package/src/web/public/images/readme/Screenshot 2025-10-09 at 20.25.21.png +0 -0
- package/src/web/public/images/readme/Screenshot 2025-10-09 at 20.25.36.png +0 -0
- package/src/web/public/index.html +4685 -488
- package/src/web/public/landing.html +1638 -0
- package/src/web/public/logger.js +31 -0
- package/src/web/public/login.html +372 -0
- package/src/web/public/manage-servers.html +121 -188
- package/src/web/public/pricing.html +537 -0
- package/src/web/public/quick-ask.html +133 -0
- package/src/web/public/quickmcp-styles.css +708 -0
- package/src/web/public/roles.html +177 -0
- package/src/web/public/shared.js +736 -3
- package/src/web/public/sidebar.js +414 -0
- package/src/web/public/test-servers.html +605 -221
- package/src/web/public/users.html +191 -0
- package/dist/client/MCPClientUnified.d.ts +0 -31
- package/dist/client/MCPClientUnified.d.ts.map +0 -1
- package/dist/client/MCPClientUnified.js +0 -275
- package/dist/client/MCPClientUnified.js.map +0 -1
- package/dist/client/MCPTestRunnerUnified.d.ts +0 -48
- package/dist/client/MCPTestRunnerUnified.d.ts.map +0 -1
- package/dist/client/MCPTestRunnerUnified.js +0 -183
- package/dist/client/MCPTestRunnerUnified.js.map +0 -1
- package/dist/database/json-manager.d.ts +0 -55
- package/dist/database/json-manager.d.ts.map +0 -1
- package/dist/database/json-manager.js +0 -128
- package/dist/database/json-manager.js.map +0 -1
- package/dist/dynamic-mcp-executor.d.ts.map +0 -1
- package/dist/dynamic-mcp-executor.js +0 -274
- package/dist/dynamic-mcp-executor.js.map +0 -1
- package/dist/generators/MCPServerGenerator-new.d.ts +0 -37
- package/dist/generators/MCPServerGenerator-new.d.ts.map +0 -1
- package/dist/generators/MCPServerGenerator-new.js +0 -287
- package/dist/generators/MCPServerGenerator-new.js.map +0 -1
- package/dist/generators/database/sqlite-manager.d.ts +0 -52
- package/dist/generators/database/sqlite-manager.js +0 -143
- package/dist/generators/generators/MCPServerGenerator.d.ts +0 -37
- package/dist/generators/generators/MCPServerGenerator.js +0 -396
- package/dist/integrated-mcp-server.d.ts +0 -25
- package/dist/integrated-mcp-server.d.ts.map +0 -1
- package/dist/integrated-mcp-server.js +0 -541
- package/dist/integrated-mcp-server.js.map +0 -1
- package/dist/mcp-inspector-server.d.ts +0 -3
- package/dist/mcp-inspector-server.d.ts.map +0 -1
- package/dist/mcp-inspector-server.js +0 -119
- package/dist/mcp-inspector-server.js.map +0 -1
- package/dist/mcp-sdk-server.d.ts +0 -3
- package/dist/mcp-sdk-server.d.ts.map +0 -1
- package/dist/mcp-sdk-server.js +0 -90
- package/dist/mcp-sdk-server.js.map +0 -1
- package/dist/mcp-server.d.ts +0 -3
- package/dist/mcp-server.d.ts.map +0 -1
- package/dist/mcp-server.js +0 -300
- package/dist/mcp-server.js.map +0 -1
- package/dist/parsers/parsers/ExcelParser.js +0 -118
- package/dist/quickmcp-unified-bridge.d.ts +0 -13
- package/dist/quickmcp-unified-bridge.d.ts.map +0 -1
- package/dist/quickmcp-unified-bridge.js +0 -176
- package/dist/quickmcp-unified-bridge.js.map +0 -1
- package/dist/sqlite-manager.js +0 -145
- package/dist/test-app.d.ts +0 -2
- package/dist/test-app.d.ts.map +0 -1
- package/dist/test-app.js +0 -119
- package/dist/test-app.js.map +0 -1
- package/dist/transport/base-transport.d.ts +0 -21
- package/dist/transport/base-transport.d.ts.map +0 -1
- package/dist/transport/base-transport.js +0 -16
- package/dist/transport/base-transport.js.map +0 -1
- package/dist/transport/index.d.ts +0 -10
- package/dist/transport/index.d.ts.map +0 -1
- package/dist/transport/index.js +0 -12
- package/dist/transport/index.js.map +0 -1
- package/dist/transport/sse-transport.d.ts +0 -13
- package/dist/transport/sse-transport.d.ts.map +0 -1
- package/dist/transport/sse-transport.js +0 -106
- package/dist/transport/sse-transport.js.map +0 -1
- package/dist/transport/stdio-transport.d.ts +0 -8
- package/dist/transport/stdio-transport.d.ts.map +0 -1
- package/dist/transport/stdio-transport.js +0 -53
- package/dist/transport/stdio-transport.js.map +0 -1
- package/dist/transport/streamable-http-transport.d.ts +0 -15
- package/dist/transport/streamable-http-transport.d.ts.map +0 -1
- package/dist/transport/streamable-http-transport.js +0 -151
- package/dist/transport/streamable-http-transport.js.map +0 -1
- package/dist/web/client/MCPClient.js +0 -348
- package/dist/web/client/MCPTestRunner.js +0 -317
- package/dist/web/database/json-manager.js +0 -124
- package/dist/web/database/sqlite-manager.js +0 -146
- package/dist/web/dynamic-mcp-executor.js +0 -443
- package/dist/web/generators/MCPServerGenerator-new.js +0 -284
- package/dist/web/generators/MCPServerGenerator.js +0 -566
- package/dist/web/integrated-mcp-server-new.js +0 -394
- package/dist/web/parsers/CsvParser.js +0 -144
- package/dist/web/parsers/DatabaseParser.js +0 -637
- package/dist/web/parsers/ExcelParser.js +0 -180
- package/dist/web/parsers/index.js +0 -152
- package/dist/web/server.d.ts.map +0 -1
- package/dist/web/server.js +0 -790
- package/dist/web/server.js.map +0 -1
- package/dist/web/types/index.js +0 -2
- package/dist/web/web/server.js +0 -860
- package/src/web/public/modern-styles.css +0 -946
- package/src/web/public/shared-styles.css +0 -2091
- /package/src/web/public/images/{1-claude-quickmcp-stdio.png → readme/1-claude-quickmcp-stdio.png} +0 -0
- /package/src/web/public/images/{2-claude-tools.png → readme/2-claude-tools.png} +0 -0
- /package/src/web/public/images/{3-claude-developer-settings.png → readme/3-claude-developer-settings.png} +0 -0
- /package/src/web/public/images/{4-claude-config.png → readme/4-claude-config.png} +0 -0
- /package/src/web/public/images/{5-claude-config-edit.png → readme/5-claude-config-edit.png} +0 -0
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
// Renders the shared sidebar into the #sidebar element on each page
|
|
2
|
+
(function () {
|
|
3
|
+
async function resolveAuthMode() {
|
|
4
|
+
try {
|
|
5
|
+
const response = await fetch('/api/auth/config');
|
|
6
|
+
if (!response.ok) return null;
|
|
7
|
+
const payload = await response.json();
|
|
8
|
+
const mode = payload?.data?.authMode;
|
|
9
|
+
const deployMode = payload?.data?.deployMode;
|
|
10
|
+
const usersEnabled = payload?.data?.usersEnabled;
|
|
11
|
+
return {
|
|
12
|
+
authMode: typeof mode === 'string' ? mode : null,
|
|
13
|
+
deployMode: typeof deployMode === 'string' ? deployMode : '',
|
|
14
|
+
usersEnabled: usersEnabled !== false
|
|
15
|
+
};
|
|
16
|
+
} catch {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function isActive(path) {
|
|
22
|
+
const p = window.location.pathname.replace(/\/$/, '');
|
|
23
|
+
if (p === '' || p === '/') return path === '/';
|
|
24
|
+
if (p === '/quick-ask' && path === '/') return true;
|
|
25
|
+
return p === path;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function navItem(href, icon, title, subtitle, active, iconClass = '') {
|
|
29
|
+
const base = "nav-item group relative flex items-center gap-3 px-3 py-2.5 rounded-lg transition-colors";
|
|
30
|
+
const activeCls = active
|
|
31
|
+
? " active bg-slate-100 text-slate-900"
|
|
32
|
+
: "";
|
|
33
|
+
const iconBase = iconClass || "bg-transparent text-slate-500";
|
|
34
|
+
const currentAttr = active ? ' aria-current="page"' : '';
|
|
35
|
+
return `
|
|
36
|
+
<a href="${href}" class="${base}${activeCls}"${currentAttr}>
|
|
37
|
+
<div class="relative">
|
|
38
|
+
<div class="w-8 h-8 flex items-center justify-center rounded-md transition-colors ${iconBase}">
|
|
39
|
+
<i class="fas ${icon}"></i>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
<div class="flex-1 min-w-0">
|
|
43
|
+
<span class="text-slate-700 font-medium text-sm block">${title}</span>
|
|
44
|
+
<span class="text-slate-500 text-xs mt-0.5 block">${subtitle}</span>
|
|
45
|
+
</div>
|
|
46
|
+
</a>
|
|
47
|
+
`;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function escapeHtml(value) {
|
|
51
|
+
return String(value || '')
|
|
52
|
+
.replace(/&/g, '&')
|
|
53
|
+
.replace(/</g, '<')
|
|
54
|
+
.replace(/>/g, '>')
|
|
55
|
+
.replace(/"/g, '"')
|
|
56
|
+
.replace(/'/g, ''');
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function normalizeChatTitle(chat) {
|
|
60
|
+
const directTitle = String(chat?.title || '').trim();
|
|
61
|
+
if (directTitle) return directTitle;
|
|
62
|
+
const firstUserMessage = Array.isArray(chat?.messages)
|
|
63
|
+
? chat.messages.find((msg) => msg?.role === 'user' && String(msg?.content || '').trim())
|
|
64
|
+
: null;
|
|
65
|
+
const base = firstUserMessage ? String(firstUserMessage.content || '').trim() : '';
|
|
66
|
+
return base ? base.slice(0, 80) : 'New chat';
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function normalizeChatPreview(chat) {
|
|
70
|
+
const messages = Array.isArray(chat?.messages) ? chat.messages : [];
|
|
71
|
+
for (let i = messages.length - 1; i >= 0; i -= 1) {
|
|
72
|
+
const text = String(messages[i]?.content || '').trim();
|
|
73
|
+
if (text) return text.slice(0, 96);
|
|
74
|
+
}
|
|
75
|
+
return 'No messages yet';
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
async function mountSharedQuickAskSidebar() {
|
|
79
|
+
// Quick Ask page (and pages embedding full Quick Ask UI) use app.js native sidebar logic.
|
|
80
|
+
if (document.getElementById('quickAskSection')) return;
|
|
81
|
+
|
|
82
|
+
const navList = document.getElementById('sidebarNavList');
|
|
83
|
+
if (!navList) return;
|
|
84
|
+
|
|
85
|
+
let section = document.getElementById('sharedQuickAskSidebarChats');
|
|
86
|
+
if (!section) {
|
|
87
|
+
section = document.createElement('div');
|
|
88
|
+
section.id = 'sharedQuickAskSidebarChats';
|
|
89
|
+
section.className = 'mt-3 pt-3 border-t border-slate-200/60 space-y-2';
|
|
90
|
+
navList.appendChild(section);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
section.innerHTML = `
|
|
94
|
+
<div class="pt-1 flex items-center justify-between gap-2">
|
|
95
|
+
<p class="text-[11px] tracking-[0.14em] uppercase text-slate-500 font-semibold">Your Chats</p>
|
|
96
|
+
<a href="/quick-ask?new=1" class="inline-flex items-center gap-1 rounded-md border border-slate-200 px-2 py-1 text-[11px] font-semibold text-slate-700 hover:bg-slate-100">
|
|
97
|
+
<i class="fas fa-plus text-[10px]"></i>
|
|
98
|
+
New
|
|
99
|
+
</a>
|
|
100
|
+
</div>
|
|
101
|
+
<div id="sharedQuickAskSidebarChatList" class="space-y-1">
|
|
102
|
+
<p class="px-2 py-2 text-xs text-slate-500">Loading chats...</p>
|
|
103
|
+
</div>
|
|
104
|
+
<a href="/quick-ask?new=1" class="quick-ask-collapsed-add w-9 h-9 items-center justify-center rounded-lg border border-slate-200 bg-white text-slate-600 hover:bg-slate-100 hover:text-blue-600" title="New chat" aria-label="New chat">
|
|
105
|
+
<i class="fas fa-plus text-[12px]"></i>
|
|
106
|
+
</a>
|
|
107
|
+
`;
|
|
108
|
+
|
|
109
|
+
const list = section.querySelector('#sharedQuickAskSidebarChatList');
|
|
110
|
+
if (!list) return;
|
|
111
|
+
|
|
112
|
+
try {
|
|
113
|
+
const response = await fetch('/api/ask/chats');
|
|
114
|
+
const payload = await response.json().catch(() => ({}));
|
|
115
|
+
const chatsRaw = (response.ok && payload?.success && Array.isArray(payload?.data?.chats))
|
|
116
|
+
? payload.data.chats
|
|
117
|
+
: [];
|
|
118
|
+
const chats = chatsRaw
|
|
119
|
+
.map((chat) => ({
|
|
120
|
+
id: String(chat?.id || '').trim(),
|
|
121
|
+
title: normalizeChatTitle(chat),
|
|
122
|
+
preview: normalizeChatPreview(chat),
|
|
123
|
+
updatedAt: String(chat?.updatedAt || chat?.createdAt || '')
|
|
124
|
+
}))
|
|
125
|
+
.filter((chat) => chat.id)
|
|
126
|
+
.sort((a, b) => new Date(b.updatedAt || 0).getTime() - new Date(a.updatedAt || 0).getTime())
|
|
127
|
+
.slice(0, 8);
|
|
128
|
+
|
|
129
|
+
if (chats.length === 0) {
|
|
130
|
+
list.innerHTML = '<p class="px-2 py-2 text-xs text-slate-500">No chats yet.</p>';
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
list.innerHTML = chats.map((chat) => `
|
|
135
|
+
<a href="/quick-ask?chat=${encodeURIComponent(chat.id)}" class="group block rounded-lg border border-slate-200 bg-white px-2 py-2 hover:bg-slate-50">
|
|
136
|
+
<p class="text-xs font-semibold text-slate-800 truncate">${escapeHtml(chat.title)}</p>
|
|
137
|
+
<p class="mt-0.5 text-[11px] text-slate-500 truncate">${escapeHtml(chat.preview)}</p>
|
|
138
|
+
</a>
|
|
139
|
+
`).join('');
|
|
140
|
+
} catch {
|
|
141
|
+
list.innerHTML = '<p class="px-2 py-2 text-xs text-slate-500">Unable to load chats.</p>';
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function getSidebarPanelIconSvg() {
|
|
146
|
+
return `
|
|
147
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="h-5 w-5 flex-shrink-0" aria-hidden="true">
|
|
148
|
+
<rect width="18" height="18" x="3" y="3" rx="2"></rect>
|
|
149
|
+
<path d="M9 3v18"></path>
|
|
150
|
+
</svg>
|
|
151
|
+
`;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function setSidebarCollapseIcon() {
|
|
155
|
+
const iconWrap = document.getElementById('sidebarCollapseIcon');
|
|
156
|
+
if (!iconWrap) return;
|
|
157
|
+
iconWrap.innerHTML = getSidebarPanelIconSvg();
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function normalizeSidebarWidth(value, fallback = '18rem') {
|
|
161
|
+
const raw = String(value || '').trim();
|
|
162
|
+
if (!raw) return fallback;
|
|
163
|
+
if (raw.endsWith('px') || raw.endsWith('rem')) return raw;
|
|
164
|
+
const num = Number(raw);
|
|
165
|
+
if (Number.isFinite(num) && num > 0) return `${num}px`;
|
|
166
|
+
return fallback;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function syncDesktopLayoutOffset(sidebar) {
|
|
170
|
+
if (!sidebar) return;
|
|
171
|
+
const collapsed = sidebar.classList.contains('collapsed');
|
|
172
|
+
const measuredWidth = Math.round(sidebar.getBoundingClientRect().width || 0);
|
|
173
|
+
const expanded = measuredWidth > 0 && !collapsed
|
|
174
|
+
? `${measuredWidth}px`
|
|
175
|
+
: normalizeSidebarWidth(
|
|
176
|
+
sidebar.style.width
|
|
177
|
+
|| (function(){ try { return localStorage.getItem('sidebarWidth'); } catch { return null; } })(),
|
|
178
|
+
'18rem'
|
|
179
|
+
);
|
|
180
|
+
const offset = collapsed ? '3rem' : expanded;
|
|
181
|
+
document.documentElement.style.setProperty('--sidebar-offset', offset);
|
|
182
|
+
if (document.body) document.body.setAttribute('data-has-sidebar', '1');
|
|
183
|
+
|
|
184
|
+
// Force layout sync to prevent header/sidebar overlap during collapse/expand transitions.
|
|
185
|
+
const isDesktop = window.matchMedia('(min-width: 1024px)').matches;
|
|
186
|
+
const header = document.querySelector('body > header');
|
|
187
|
+
const layouts = document.querySelectorAll('.app-main-layout');
|
|
188
|
+
if (isDesktop) {
|
|
189
|
+
if (header instanceof HTMLElement) {
|
|
190
|
+
header.style.marginLeft = offset;
|
|
191
|
+
header.style.width = `calc(100% - ${offset})`;
|
|
192
|
+
}
|
|
193
|
+
layouts.forEach((layout) => {
|
|
194
|
+
if (layout instanceof HTMLElement) {
|
|
195
|
+
layout.style.paddingLeft = `calc(${offset} + var(--sidebar-gutter, 0px))`;
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
} else {
|
|
199
|
+
if (header instanceof HTMLElement) {
|
|
200
|
+
header.style.marginLeft = '';
|
|
201
|
+
header.style.width = '';
|
|
202
|
+
}
|
|
203
|
+
layouts.forEach((layout) => {
|
|
204
|
+
if (layout instanceof HTMLElement) {
|
|
205
|
+
layout.style.paddingLeft = '';
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function applySidebarCollapsedState() {
|
|
212
|
+
const sidebar = document.getElementById('sidebar');
|
|
213
|
+
if (!sidebar) return;
|
|
214
|
+
const collapseBtn = document.getElementById('sidebarCollapseBtn');
|
|
215
|
+
const collapsed = (function(){ try { return localStorage.getItem('sidebarCollapsed') === 'true'; } catch { return false; } })();
|
|
216
|
+
if (collapsed) {
|
|
217
|
+
sidebar.classList.add('collapsed');
|
|
218
|
+
sidebar.style.width = '3rem';
|
|
219
|
+
setSidebarCollapseIcon();
|
|
220
|
+
if (collapseBtn) collapseBtn.title = 'Expand sidebar';
|
|
221
|
+
} else {
|
|
222
|
+
sidebar.classList.remove('collapsed');
|
|
223
|
+
const savedWidth = (function(){ try { return localStorage.getItem('sidebarWidth'); } catch { return null; } })();
|
|
224
|
+
sidebar.style.width = normalizeSidebarWidth(savedWidth, '');
|
|
225
|
+
setSidebarCollapseIcon();
|
|
226
|
+
if (collapseBtn) collapseBtn.title = 'Collapse sidebar';
|
|
227
|
+
}
|
|
228
|
+
syncDesktopLayoutOffset(sidebar);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function initSidebarResizer() {
|
|
232
|
+
const sidebar = document.getElementById('sidebar');
|
|
233
|
+
const resizer = document.getElementById('sidebarResizer');
|
|
234
|
+
if (!sidebar || !resizer) return;
|
|
235
|
+
if (resizer.dataset.bound === 'true') return;
|
|
236
|
+
resizer.dataset.bound = 'true';
|
|
237
|
+
|
|
238
|
+
let isResizing = false;
|
|
239
|
+
let startX = 0;
|
|
240
|
+
let startWidth = 0;
|
|
241
|
+
|
|
242
|
+
const onMove = (event) => {
|
|
243
|
+
if (!isResizing) return;
|
|
244
|
+
const delta = event.clientX - startX;
|
|
245
|
+
const next = Math.max(180, Math.min(420, startWidth + delta));
|
|
246
|
+
sidebar.style.width = `${next}px`;
|
|
247
|
+
syncDesktopLayoutOffset(sidebar);
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
const onUp = () => {
|
|
251
|
+
if (!isResizing) return;
|
|
252
|
+
isResizing = false;
|
|
253
|
+
document.body.style.userSelect = '';
|
|
254
|
+
window.removeEventListener('mousemove', onMove);
|
|
255
|
+
window.removeEventListener('mouseup', onUp);
|
|
256
|
+
try { localStorage.setItem('sidebarWidth', sidebar.style.width || ''); } catch {}
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
resizer.addEventListener('mousedown', (event) => {
|
|
260
|
+
if (sidebar.classList.contains('collapsed')) return;
|
|
261
|
+
isResizing = true;
|
|
262
|
+
startX = event.clientX;
|
|
263
|
+
startWidth = sidebar.getBoundingClientRect().width;
|
|
264
|
+
document.body.style.userSelect = 'none';
|
|
265
|
+
window.addEventListener('mousemove', onMove);
|
|
266
|
+
window.addEventListener('mouseup', onUp);
|
|
267
|
+
event.preventDefault();
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
const savedWidth = (function(){ try { return localStorage.getItem('sidebarWidth'); } catch { return null; } })();
|
|
271
|
+
if (savedWidth && !sidebar.classList.contains('collapsed')) {
|
|
272
|
+
sidebar.style.width = savedWidth;
|
|
273
|
+
}
|
|
274
|
+
syncDesktopLayoutOffset(sidebar);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
function wireSidebarInteractions() {
|
|
278
|
+
const sidebar = document.getElementById('sidebar');
|
|
279
|
+
const collapseBtn = document.getElementById('sidebarCollapseBtn');
|
|
280
|
+
const headerToggleBtn = document.getElementById('sidebarHeaderToggle');
|
|
281
|
+
const headerRow = document.getElementById('sidebarHeaderRow');
|
|
282
|
+
if (!sidebar) return;
|
|
283
|
+
|
|
284
|
+
if (collapseBtn && collapseBtn.dataset.bound !== 'true') {
|
|
285
|
+
collapseBtn.dataset.bound = 'true';
|
|
286
|
+
collapseBtn.addEventListener('click', (event) => {
|
|
287
|
+
event.preventDefault();
|
|
288
|
+
event.stopPropagation();
|
|
289
|
+
const current = (function(){ try { return localStorage.getItem('sidebarCollapsed') === 'true'; } catch { return false; } })();
|
|
290
|
+
try { localStorage.setItem('sidebarCollapsed', (!current).toString()); } catch {}
|
|
291
|
+
applySidebarCollapsedState();
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
if (headerRow && headerRow.dataset.bound !== 'true') {
|
|
296
|
+
headerRow.dataset.bound = 'true';
|
|
297
|
+
headerRow.addEventListener('click', (event) => {
|
|
298
|
+
if (!sidebar.classList.contains('collapsed')) return;
|
|
299
|
+
const clickedToggle = Array.isArray(event.composedPath?.())
|
|
300
|
+
? event.composedPath().some((el) => el && (el.id === 'sidebarCollapseBtn' || el.id === 'sidebarHeaderToggle'))
|
|
301
|
+
: !!(event.target?.closest && (event.target.closest('#sidebarCollapseBtn') || event.target.closest('#sidebarHeaderToggle')));
|
|
302
|
+
if (clickedToggle) return;
|
|
303
|
+
try { localStorage.setItem('sidebarCollapsed', 'false'); } catch {}
|
|
304
|
+
applySidebarCollapsedState();
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
if (headerToggleBtn && headerToggleBtn.dataset.bound !== 'true') {
|
|
309
|
+
headerToggleBtn.dataset.bound = 'true';
|
|
310
|
+
headerToggleBtn.addEventListener('click', (event) => {
|
|
311
|
+
event.preventDefault();
|
|
312
|
+
event.stopPropagation();
|
|
313
|
+
const current = (function(){ try { return localStorage.getItem('sidebarCollapsed') === 'true'; } catch { return false; } })();
|
|
314
|
+
try { localStorage.setItem('sidebarCollapsed', (!current).toString()); } catch {}
|
|
315
|
+
applySidebarCollapsedState();
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
applySidebarCollapsedState();
|
|
320
|
+
initSidebarResizer();
|
|
321
|
+
if (!window.__quickmcpSidebarResizeBound) {
|
|
322
|
+
window.__quickmcpSidebarResizeBound = true;
|
|
323
|
+
window.addEventListener('resize', () => syncDesktopLayoutOffset(document.getElementById('sidebar')));
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
async function renderSidebar() {
|
|
328
|
+
const root = document.getElementById('sidebar');
|
|
329
|
+
if (!root) return;
|
|
330
|
+
root.setAttribute('data-ready', '0');
|
|
331
|
+
|
|
332
|
+
// Ensure base container classes exist (for pages that only mount an empty div)
|
|
333
|
+
if (!root.className) {
|
|
334
|
+
root.className = 'w-72 bg-white/95 backdrop-blur-sm border-r border-slate-200/60 flex flex-col flex-shrink-0 z-40 fixed inset-y-0 left-0 transform -translate-x-full lg:translate-x-0 lg:top-0 lg:h-screen transition-transform duration-300 ease-in-out h-full pt-16 lg:pt-0';
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// Respect saved collapsed state before any async work
|
|
338
|
+
const preferCollapsed = (function(){ try { return localStorage.getItem('sidebarCollapsed') === 'true'; } catch { return false; } })();
|
|
339
|
+
if (preferCollapsed) {
|
|
340
|
+
root.classList.add('collapsed');
|
|
341
|
+
root.style.width = '3rem';
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
const authCfg = await resolveAuthMode();
|
|
345
|
+
const authMode = authCfg?.authMode || null;
|
|
346
|
+
const deployMode = (authCfg?.deployMode || '').toUpperCase();
|
|
347
|
+
const showAuthManagement = authMode !== 'NONE';
|
|
348
|
+
const showUsers = showAuthManagement && authCfg?.usersEnabled !== false && deployMode !== 'SAAS';
|
|
349
|
+
|
|
350
|
+
const html = `
|
|
351
|
+
<div class="p-4 bg-white">
|
|
352
|
+
<div id="sidebarHeaderRow" class="flex items-center justify-start gap-2 mb-2">
|
|
353
|
+
<div id="sidebarHeaderMain" class="flex items-center gap-3">
|
|
354
|
+
<div class="w-8 h-8 rounded-lg bg-blue-600 text-white flex items-center justify-center shadow-lg shadow-blue-500/20">
|
|
355
|
+
<i class="fas fa-rocket text-sm"></i>
|
|
356
|
+
</div>
|
|
357
|
+
</div>
|
|
358
|
+
<div id="sidebarHeaderToggleWrap" class="flex items-center ml-auto">
|
|
359
|
+
<button id="sidebarHeaderToggle" type="button" class="w-8 h-8 flex items-center justify-center rounded-md bg-slate-100 text-slate-600 hover:bg-slate-200 hover:text-blue-600 hover:shadow-sm transition-all" title="Toggle sidebar">
|
|
360
|
+
<span id="sidebarCollapseIcon" class="inline-flex items-center justify-center"></span>
|
|
361
|
+
</button>
|
|
362
|
+
</div>
|
|
363
|
+
<div id="sidebarHeaderActions" class="flex items-center gap-2">
|
|
364
|
+
<button id="closeSidebar" class="lg:hidden text-slate-400 hover:text-slate-600">
|
|
365
|
+
<i class="fas fa-times"></i>
|
|
366
|
+
</button>
|
|
367
|
+
</div>
|
|
368
|
+
</div>
|
|
369
|
+
</div>
|
|
370
|
+
|
|
371
|
+
<div id="sidebarNavList" class="p-3 overflow-y-auto flex-1 scrollbar-modern space-y-1.5">
|
|
372
|
+
${navItem('/', 'fa-comment-dots', 'Quick Ask', 'Ask Aria with MCP tools', isActive('/'))}
|
|
373
|
+
${navItem('/generate', 'fa-magic', 'Generate Server', 'Create new MCP servers', isActive('/generate'))}
|
|
374
|
+
${navItem('/manage-servers', 'fa-server', 'Manage Servers', 'Edit & Control', isActive('/manage-servers'))}
|
|
375
|
+
${navItem('/test-servers', 'fa-vial', 'Test Servers', 'Verify functionality', isActive('/test-servers'))}
|
|
376
|
+
${showAuthManagement ? navItem('/authorization', 'fa-key', 'Authorization', 'MCP token policy', isActive('/authorization'), 'bg-amber-100 text-amber-700 group-hover:bg-amber-200') : ''}
|
|
377
|
+
${showUsers ? navItem('/users', 'fa-users', 'Users', 'User management', isActive('/users'), 'bg-emerald-100 text-emerald-700 group-hover:bg-emerald-200') : ''}
|
|
378
|
+
${navItem('/how-to-use', 'fa-book', 'How to Use', 'Documentation & Guide', isActive('/how-to-use'))}
|
|
379
|
+
</div>
|
|
380
|
+
|
|
381
|
+
<div id="sidebarUserSection" class="p-3 border-t border-slate-200/60 bg-white">
|
|
382
|
+
<button id="sidebarUserButton" data-user-menu-anchor="true" type="button" class="w-full flex items-center gap-3 px-2 py-2 rounded-lg hover:bg-slate-100 transition-colors text-left">
|
|
383
|
+
<div class="w-8 h-8 rounded-full bg-gradient-to-tr from-blue-500 to-purple-500 text-white flex items-center justify-center text-sm font-bold shadow-md flex-shrink-0" data-user-avatar>G</div>
|
|
384
|
+
<div id="sidebarUserMeta" class="min-w-0">
|
|
385
|
+
<div id="sidebarUserName" class="text-sm font-semibold text-slate-800 truncate">Guest</div>
|
|
386
|
+
<div id="sidebarUserEmail" class="text-xs text-slate-500 truncate">Not signed in</div>
|
|
387
|
+
</div>
|
|
388
|
+
</button>
|
|
389
|
+
</div>
|
|
390
|
+
|
|
391
|
+
<div id="sidebarResizer" class="hidden lg:block absolute top-0 right-0 h-full w-1 cursor-col-resize bg-transparent"></div>
|
|
392
|
+
`;
|
|
393
|
+
|
|
394
|
+
root.innerHTML = html;
|
|
395
|
+
setSidebarCollapseIcon();
|
|
396
|
+
wireSidebarInteractions();
|
|
397
|
+
syncDesktopLayoutOffset(root);
|
|
398
|
+
if (typeof window.updateUserAvatar === 'function') {
|
|
399
|
+
window.updateUserAvatar();
|
|
400
|
+
}
|
|
401
|
+
await mountSharedQuickAskSidebar();
|
|
402
|
+
root.setAttribute('data-ready', '1');
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
// auto-render (works both before and after DOMContentLoaded)
|
|
406
|
+
if (document.readyState === 'loading') {
|
|
407
|
+
document.addEventListener('DOMContentLoaded', renderSidebar);
|
|
408
|
+
} else {
|
|
409
|
+
renderSidebar();
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
// expose for manual calls if needed
|
|
413
|
+
window.renderSidebar = renderSidebar;
|
|
414
|
+
})();
|