Compare commits

...

2 Commits

Author SHA1 Message Date
renovate[bot]
3e053bc904 fix(deps): update dependency zod to v4 2026-01-01 05:46:19 +00:00
Dayuan Jiang
037f32973a fix: resolve biome lint errors blocking CI (#480)
- Update biome schema version from 2.3.8 to 2.3.10
- Add radix parameter to parseInt in mcp-server
- Remove unnecessary React fragment in model-config-dialog
- Fix unused variable errors (err -> _err)
- Auto-format code with biome
2026-01-01 14:45:46 +09:00
9 changed files with 806 additions and 841 deletions

View File

@@ -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",

View File

@@ -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

View File

@@ -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">

View File

@@ -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"

View File

@@ -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(

View File

@@ -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": {

View File

@@ -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",

View File

@@ -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)

View File

@@ -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)
} }