mirror of
https://github.com/DayuanJiang/next-ai-draw-io.git
synced 2026-01-02 22:32:27 +08:00
Compare commits
2 Commits
3df60ad81d
...
3e053bc904
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3e053bc904 | ||
|
|
037f32973a |
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://biomejs.dev/schemas/2.3.8/schema.json",
|
"$schema": "https://biomejs.dev/schemas/2.3.10/schema.json",
|
||||||
"vcs": {
|
"vcs": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"clientKind": "git",
|
"clientKind": "git",
|
||||||
|
|||||||
@@ -283,7 +283,7 @@ export function ChatMessageDisplay({
|
|||||||
try {
|
try {
|
||||||
await navigator.clipboard.writeText(text)
|
await navigator.clipboard.writeText(text)
|
||||||
setCopyState(messageId, isToolCall, true)
|
setCopyState(messageId, isToolCall, true)
|
||||||
} catch (err) {
|
} catch (_err) {
|
||||||
// Fallback for non-secure contexts (HTTP) or permission denied
|
// Fallback for non-secure contexts (HTTP) or permission denied
|
||||||
const textarea = document.createElement("textarea")
|
const textarea = document.createElement("textarea")
|
||||||
textarea.value = text
|
textarea.value = text
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import {
|
|||||||
Zap,
|
Zap,
|
||||||
} from "lucide-react"
|
} from "lucide-react"
|
||||||
import { useCallback, useEffect, useRef, useState } from "react"
|
import { useCallback, useEffect, useRef, useState } from "react"
|
||||||
import { toast } from "sonner"
|
|
||||||
import {
|
import {
|
||||||
AlertDialog,
|
AlertDialog,
|
||||||
AlertDialogAction,
|
AlertDialogAction,
|
||||||
@@ -517,7 +516,6 @@ export function ModelConfigDialog({
|
|||||||
{/* Provider Details (Right Panel) */}
|
{/* Provider Details (Right Panel) */}
|
||||||
<div className="flex-1 min-w-0 flex flex-col overflow-auto [&::-webkit-scrollbar]:hidden ">
|
<div className="flex-1 min-w-0 flex flex-col overflow-auto [&::-webkit-scrollbar]:hidden ">
|
||||||
{selectedProvider ? (
|
{selectedProvider ? (
|
||||||
<>
|
|
||||||
<ScrollArea className="flex-1" ref={scrollRef}>
|
<ScrollArea className="flex-1" ref={scrollRef}>
|
||||||
<div className="p-6 space-y-8">
|
<div className="p-6 space-y-8">
|
||||||
{/* Provider Header */}
|
{/* Provider Header */}
|
||||||
@@ -559,10 +557,7 @@ export function ModelConfigDialog({
|
|||||||
<div className="flex items-center gap-1.5 px-3 py-1.5 rounded-full bg-success-muted text-success">
|
<div className="flex items-center gap-1.5 px-3 py-1.5 rounded-full bg-success-muted text-success">
|
||||||
<Check className="h-3.5 w-3.5 animate-check-pop" />
|
<Check className="h-3.5 w-3.5 animate-check-pop" />
|
||||||
<span className="text-xs font-medium">
|
<span className="text-xs font-medium">
|
||||||
{
|
{dict.modelConfig.verified}
|
||||||
dict.modelConfig
|
|
||||||
.verified
|
|
||||||
}
|
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
@@ -575,18 +570,13 @@ export function ModelConfigDialog({
|
|||||||
className="text-destructive hover:text-destructive hover:bg-destructive/10"
|
className="text-destructive hover:text-destructive hover:bg-destructive/10"
|
||||||
>
|
>
|
||||||
<Trash2 className="h-4 w-4 mr-1.5" />
|
<Trash2 className="h-4 w-4 mr-1.5" />
|
||||||
{
|
{dict.modelConfig.deleteProvider}
|
||||||
dict.modelConfig
|
|
||||||
.deleteProvider
|
|
||||||
}
|
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Configuration Section */}
|
{/* Configuration Section */}
|
||||||
<ConfigSection
|
<ConfigSection
|
||||||
title={
|
title={dict.modelConfig.configuration}
|
||||||
dict.modelConfig.configuration
|
|
||||||
}
|
|
||||||
icon={Settings2}
|
icon={Settings2}
|
||||||
>
|
>
|
||||||
<ConfigCard>
|
<ConfigCard>
|
||||||
@@ -636,8 +626,7 @@ export function ModelConfigDialog({
|
|||||||
>
|
>
|
||||||
<Key className="h-3.5 w-3.5 text-muted-foreground" />
|
<Key className="h-3.5 w-3.5 text-muted-foreground" />
|
||||||
{
|
{
|
||||||
dict
|
dict.modelConfig
|
||||||
.modelConfig
|
|
||||||
.awsAccessKeyId
|
.awsAccessKeyId
|
||||||
}
|
}
|
||||||
</Label>
|
</Label>
|
||||||
@@ -672,8 +661,7 @@ export function ModelConfigDialog({
|
|||||||
>
|
>
|
||||||
<Key className="h-3.5 w-3.5 text-muted-foreground" />
|
<Key className="h-3.5 w-3.5 text-muted-foreground" />
|
||||||
{
|
{
|
||||||
dict
|
dict.modelConfig
|
||||||
.modelConfig
|
|
||||||
.awsSecretAccessKey
|
.awsSecretAccessKey
|
||||||
}
|
}
|
||||||
</Label>
|
</Label>
|
||||||
@@ -689,13 +677,10 @@ export function ModelConfigDialog({
|
|||||||
selectedProvider.awsSecretAccessKey ||
|
selectedProvider.awsSecretAccessKey ||
|
||||||
""
|
""
|
||||||
}
|
}
|
||||||
onChange={(
|
onChange={(e) =>
|
||||||
e,
|
|
||||||
) =>
|
|
||||||
handleProviderUpdate(
|
handleProviderUpdate(
|
||||||
"awsSecretAccessKey",
|
"awsSecretAccessKey",
|
||||||
e
|
e.target
|
||||||
.target
|
|
||||||
.value,
|
.value,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -737,8 +722,7 @@ export function ModelConfigDialog({
|
|||||||
>
|
>
|
||||||
<Link2 className="h-3.5 w-3.5 text-muted-foreground" />
|
<Link2 className="h-3.5 w-3.5 text-muted-foreground" />
|
||||||
{
|
{
|
||||||
dict
|
dict.modelConfig
|
||||||
.modelConfig
|
|
||||||
.awsRegion
|
.awsRegion
|
||||||
}
|
}
|
||||||
</Label>
|
</Label>
|
||||||
@@ -817,8 +801,7 @@ export function ModelConfigDialog({
|
|||||||
</SelectItem>
|
</SelectItem>
|
||||||
<SelectItem value="sa-east-1">
|
<SelectItem value="sa-east-1">
|
||||||
sa-east-1
|
sa-east-1
|
||||||
(São
|
(São Paulo)
|
||||||
Paulo)
|
|
||||||
</SelectItem>
|
</SelectItem>
|
||||||
</SelectContent>
|
</SelectContent>
|
||||||
</Select>
|
</Select>
|
||||||
@@ -865,8 +848,7 @@ export function ModelConfigDialog({
|
|||||||
}
|
}
|
||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
dict
|
dict.modelConfig
|
||||||
.modelConfig
|
|
||||||
.test
|
.test
|
||||||
)}
|
)}
|
||||||
</Button>
|
</Button>
|
||||||
@@ -922,8 +904,7 @@ export function ModelConfigDialog({
|
|||||||
}
|
}
|
||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
dict
|
dict.modelConfig
|
||||||
.modelConfig
|
|
||||||
.test
|
.test
|
||||||
)}
|
)}
|
||||||
</Button>
|
</Button>
|
||||||
@@ -949,8 +930,7 @@ export function ModelConfigDialog({
|
|||||||
>
|
>
|
||||||
<Key className="h-3.5 w-3.5 text-muted-foreground" />
|
<Key className="h-3.5 w-3.5 text-muted-foreground" />
|
||||||
{
|
{
|
||||||
dict
|
dict.modelConfig
|
||||||
.modelConfig
|
|
||||||
.apiKey
|
.apiKey
|
||||||
}
|
}
|
||||||
</Label>
|
</Label>
|
||||||
@@ -1067,8 +1047,7 @@ export function ModelConfigDialog({
|
|||||||
>
|
>
|
||||||
<Link2 className="h-3.5 w-3.5 text-muted-foreground" />
|
<Link2 className="h-3.5 w-3.5 text-muted-foreground" />
|
||||||
{
|
{
|
||||||
dict
|
dict.modelConfig
|
||||||
.modelConfig
|
|
||||||
.baseUrl
|
.baseUrl
|
||||||
}
|
}
|
||||||
<span className="text-muted-foreground font-normal">
|
<span className="text-muted-foreground font-normal">
|
||||||
@@ -1098,8 +1077,7 @@ export function ModelConfigDialog({
|
|||||||
.provider
|
.provider
|
||||||
]
|
]
|
||||||
.defaultBaseUrl ||
|
.defaultBaseUrl ||
|
||||||
dict
|
dict.modelConfig
|
||||||
.modelConfig
|
|
||||||
.customEndpoint
|
.customEndpoint
|
||||||
}
|
}
|
||||||
className="h-9 rounded-xl font-mono text-xs"
|
className="h-9 rounded-xl font-mono text-xs"
|
||||||
@@ -1122,13 +1100,10 @@ export function ModelConfigDialog({
|
|||||||
dict.modelConfig
|
dict.modelConfig
|
||||||
.customModelId
|
.customModelId
|
||||||
}
|
}
|
||||||
value={
|
value={customModelInput}
|
||||||
customModelInput
|
|
||||||
}
|
|
||||||
onChange={(e) => {
|
onChange={(e) => {
|
||||||
setCustomModelInput(
|
setCustomModelInput(
|
||||||
e.target
|
e.target.value,
|
||||||
.value,
|
|
||||||
)
|
)
|
||||||
if (
|
if (
|
||||||
duplicateError
|
duplicateError
|
||||||
@@ -1148,9 +1123,7 @@ export function ModelConfigDialog({
|
|||||||
handleAddModel(
|
handleAddModel(
|
||||||
customModelInput.trim(),
|
customModelInput.trim(),
|
||||||
)
|
)
|
||||||
if (
|
if (success) {
|
||||||
success
|
|
||||||
) {
|
|
||||||
setCustomModelInput(
|
setCustomModelInput(
|
||||||
"",
|
"",
|
||||||
)
|
)
|
||||||
@@ -1195,9 +1168,7 @@ export function ModelConfigDialog({
|
|||||||
<Plus className="h-3.5 w-3.5" />
|
<Plus className="h-3.5 w-3.5" />
|
||||||
</Button>
|
</Button>
|
||||||
<Select
|
<Select
|
||||||
onValueChange={(
|
onValueChange={(value) => {
|
||||||
value,
|
|
||||||
) => {
|
|
||||||
if (value) {
|
if (value) {
|
||||||
handleAddModel(
|
handleAddModel(
|
||||||
value,
|
value,
|
||||||
@@ -1233,9 +1204,7 @@ export function ModelConfigDialog({
|
|||||||
}
|
}
|
||||||
className="font-mono text-xs"
|
className="font-mono text-xs"
|
||||||
>
|
>
|
||||||
{
|
{modelId}
|
||||||
modelId
|
|
||||||
}
|
|
||||||
</SelectItem>
|
</SelectItem>
|
||||||
),
|
),
|
||||||
)}
|
)}
|
||||||
@@ -1246,8 +1215,8 @@ export function ModelConfigDialog({
|
|||||||
>
|
>
|
||||||
{/* Model List */}
|
{/* Model List */}
|
||||||
<div className="rounded-2xl border border-border-subtle bg-surface-2/30 overflow-hidden min-h-[120px]">
|
<div className="rounded-2xl border border-border-subtle bg-surface-2/30 overflow-hidden min-h-[120px]">
|
||||||
{selectedProvider.models
|
{selectedProvider.models.length ===
|
||||||
.length === 0 ? (
|
0 ? (
|
||||||
<div className="p-6 text-center h-full flex flex-col items-center justify-center">
|
<div className="p-6 text-center h-full flex flex-col items-center justify-center">
|
||||||
<div className="inline-flex items-center justify-center w-10 h-10 rounded-full bg-surface-2 mb-3">
|
<div className="inline-flex items-center justify-center w-10 h-10 rounded-full bg-surface-2 mb-3">
|
||||||
<Sparkles className="h-5 w-5 text-muted-foreground" />
|
<Sparkles className="h-5 w-5 text-muted-foreground" />
|
||||||
@@ -1264,9 +1233,7 @@ export function ModelConfigDialog({
|
|||||||
{selectedProvider.models.map(
|
{selectedProvider.models.map(
|
||||||
(model, index) => (
|
(model, index) => (
|
||||||
<div
|
<div
|
||||||
key={
|
key={model.id}
|
||||||
model.id
|
|
||||||
}
|
|
||||||
className={cn(
|
className={cn(
|
||||||
"transition-colors duration-150 hover:bg-interactive-hover/50",
|
"transition-colors duration-150 hover:bg-interactive-hover/50",
|
||||||
)}
|
)}
|
||||||
@@ -1500,7 +1467,6 @@ export function ModelConfigDialog({
|
|||||||
</ConfigSection>
|
</ConfigSection>
|
||||||
</div>
|
</div>
|
||||||
</ScrollArea>
|
</ScrollArea>
|
||||||
</>
|
|
||||||
) : (
|
) : (
|
||||||
<div className="h-full flex flex-col items-center justify-center p-8 text-center">
|
<div className="h-full flex flex-col items-center justify-center p-8 text-center">
|
||||||
<div className="inline-flex items-center justify-center w-16 h-16 rounded-2xl bg-surface-2 mb-4">
|
<div className="inline-flex items-center justify-center w-16 h-16 rounded-2xl bg-surface-2 mb-4">
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import {
|
|||||||
flattenModels,
|
flattenModels,
|
||||||
type ModelConfig,
|
type ModelConfig,
|
||||||
type MultiModelConfig,
|
type MultiModelConfig,
|
||||||
PROVIDER_INFO,
|
|
||||||
type ProviderConfig,
|
type ProviderConfig,
|
||||||
type ProviderName,
|
type ProviderName,
|
||||||
} from "@/lib/types/model-config"
|
} from "@/lib/types/model-config"
|
||||||
|
|||||||
@@ -786,7 +786,7 @@ export function getAIModel(overrides?: ClientOverrides): ModelConfig {
|
|||||||
`data: ${JSON.stringify(data)}\n\n`,
|
`data: ${JSON.stringify(data)}\n\n`,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
} catch (e) {
|
} catch (_e) {
|
||||||
// If parsing fails, forward the original message to avoid breaking the stream.
|
// If parsing fails, forward the original message to avoid breaking the stream.
|
||||||
controller.enqueue(
|
controller.enqueue(
|
||||||
new TextEncoder().encode(
|
new TextEncoder().encode(
|
||||||
|
|||||||
12
packages/mcp-server/package-lock.json
generated
12
packages/mcp-server/package-lock.json
generated
@@ -1,18 +1,18 @@
|
|||||||
{
|
{
|
||||||
"name": "@next-ai-drawio/mcp-server",
|
"name": "@next-ai-drawio/mcp-server",
|
||||||
"version": "0.1.6",
|
"version": "0.1.11",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "@next-ai-drawio/mcp-server",
|
"name": "@next-ai-drawio/mcp-server",
|
||||||
"version": "0.1.6",
|
"version": "0.1.11",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@modelcontextprotocol/sdk": "^1.0.4",
|
"@modelcontextprotocol/sdk": "^1.0.4",
|
||||||
"linkedom": "^0.18.0",
|
"linkedom": "^0.18.0",
|
||||||
"open": "^11.0.0",
|
"open": "^11.0.0",
|
||||||
"zod": "^3.24.0"
|
"zod": "^4.0.0"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"next-ai-drawio-mcp": "dist/index.js"
|
"next-ai-drawio-mcp": "dist/index.js"
|
||||||
@@ -2051,9 +2051,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/zod": {
|
"node_modules/zod": {
|
||||||
"version": "3.25.76",
|
"version": "4.3.4",
|
||||||
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
|
"resolved": "https://registry.npmjs.org/zod/-/zod-4.3.4.tgz",
|
||||||
"integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
|
"integrity": "sha512-Zw/uYiiyF6pUT1qmKbZziChgNPRu+ZRneAsMUDU6IwmXdWt5JwcUfy2bvLOCUtz5UniaN/Zx5aFttZYbYc7O/A==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
"peer": true,
|
||||||
"funding": {
|
"funding": {
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
"@modelcontextprotocol/sdk": "^1.0.4",
|
"@modelcontextprotocol/sdk": "^1.0.4",
|
||||||
"linkedom": "^0.18.0",
|
"linkedom": "^0.18.0",
|
||||||
"open": "^11.0.0",
|
"open": "^11.0.0",
|
||||||
"zod": "^3.24.0"
|
"zod": "^4.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "^24.0.0",
|
"@types/node": "^24.0.0",
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ import { validateAndFixXml } from "./xml-validation.js"
|
|||||||
|
|
||||||
// Server configuration
|
// Server configuration
|
||||||
const config = {
|
const config = {
|
||||||
port: parseInt(process.env.PORT || "6002"),
|
port: parseInt(process.env.PORT || "6002", 10),
|
||||||
}
|
}
|
||||||
|
|
||||||
// Session state (single session for simplicity)
|
// Session state (single session for simplicity)
|
||||||
|
|||||||
@@ -253,7 +253,7 @@ async function main() {
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
console.log("👀 Watching for preset configuration changes...")
|
console.log("👀 Watching for preset configuration changes...")
|
||||||
} catch (err) {
|
} catch (_err) {
|
||||||
// File might not exist yet, that's ok
|
// File might not exist yet, that's ok
|
||||||
setTimeout(setupConfigWatcher, 5000)
|
setTimeout(setupConfigWatcher, 5000)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user