mirror of
https://github.com/DayuanJiang/next-ai-draw-io.git
synced 2026-10-09 19:19:50 +08:00
- Bedrock: a user's AWS keys no longer go to an endpoint the server sets in AWS_ENDPOINT_URL_BEDROCK_RUNTIME / AWS_ENDPOINT_URL (read by the upgraded SDK), and admin panel keys win over AWS_BEARER_TOKEN_BEDROCK, as the Test button checks them. Checked with Bedrock. - Ollama: a server key without a base URL (admin panel, OLLAMA_API_KEY) goes to Ollama Cloud, as env.example says, instead of 127.0.0.1. - Quota: EdgeOne counts whatever key header comes along, keyless Ollama at a private address counts, and their provider texts stay in the log. - An EdgeOne server model (admin panel, ai-models.json) works: the route checked the raw provider header, which holds the name's slug. - parse-url ends downloads it does not read (too large, PDF, errors). - Desktop app: the port follows where the chats are (IndexedDB per origin) instead of a remembered port, which could hide them for good; a same-port restart tells the page to refetch the server models; a failed preset switch no longer undoes a newer choice; a presets file removed after a failed read can be saved again; .env values quoted from start to end keep their inner quotes, as dotenv reads them.
76 lines
2.6 KiB
TypeScript
76 lines
2.6 KiB
TypeScript
import fs from "node:fs"
|
|
import path from "node:path"
|
|
import { app } from "electron"
|
|
|
|
/**
|
|
* Load environment variables from .env file
|
|
* Searches multiple locations in priority order
|
|
*/
|
|
export function loadEnvFile(): void {
|
|
const possiblePaths = [
|
|
// Next to the executable (for portable installations)
|
|
path.join(path.dirname(app.getPath("exe")), ".env"),
|
|
// User data directory (persists across updates)
|
|
path.join(app.getPath("userData"), ".env"),
|
|
// Development: project root
|
|
path.join(app.getAppPath(), ".env.local"),
|
|
path.join(app.getAppPath(), ".env"),
|
|
]
|
|
|
|
for (const envPath of possiblePaths) {
|
|
if (fs.existsSync(envPath)) {
|
|
console.log(`Loading environment from: ${envPath}`)
|
|
loadEnvFromFile(envPath)
|
|
return
|
|
}
|
|
}
|
|
|
|
console.log("No .env file found, using system environment variables")
|
|
}
|
|
|
|
/**
|
|
* Parse and load environment variables from a file
|
|
*/
|
|
function loadEnvFromFile(filePath: string): void {
|
|
try {
|
|
const content = fs.readFileSync(filePath, "utf-8")
|
|
const lines = content.split("\n")
|
|
|
|
for (const line of lines) {
|
|
const trimmed = line.trim()
|
|
|
|
// Skip comments and empty lines
|
|
if (!trimmed || trimmed.startsWith("#")) continue
|
|
|
|
const equalIndex = trimmed.indexOf("=")
|
|
if (equalIndex === -1) continue
|
|
|
|
const key = trimmed.slice(0, equalIndex).trim()
|
|
let value = trimmed.slice(equalIndex + 1).trim()
|
|
|
|
const quote = value[0]
|
|
const closingQuote =
|
|
quote === '"' || quote === "'" ? value.indexOf(quote, 1) : -1
|
|
if (value.length > 1 && value.endsWith(quote) && closingQuote > 0) {
|
|
// Quoted from start to end: the quotes inside belong to the
|
|
// value (JSON with an apostrophe), as dotenv reads it
|
|
value = value.slice(1, -1)
|
|
} else if (closingQuote > 0) {
|
|
// Quoted value: keep what's inside the quotes and drop
|
|
// anything after them (e.g. a comment)
|
|
value = value.slice(1, closingQuote)
|
|
} else {
|
|
// Unquoted value: drop an inline comment ("value # comment")
|
|
value = value.replace(/\s+#.*$/, "")
|
|
}
|
|
|
|
// Don't override existing environment variables
|
|
if (!(key in process.env)) {
|
|
process.env[key] = value
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.error(`Failed to load env file ${filePath}:`, error)
|
|
}
|
|
}
|