@mclawnet/agent 0.6.1 → 0.6.3
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/dist/chunk-CBZIH6FY.js +93 -0
- package/dist/chunk-CBZIH6FY.js.map +1 -0
- package/dist/{chunk-KITKMSBE.js → chunk-GLO5OZAY.js} +136 -222
- package/dist/chunk-GLO5OZAY.js.map +1 -0
- package/dist/{chunk-W3LSW4XY.js → chunk-RO47ET27.js} +14 -21
- package/dist/chunk-RO47ET27.js.map +1 -0
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/{linux-5KQ4SCAA.js → linux-6AR7SXHW.js} +3 -2
- package/dist/{linux-5KQ4SCAA.js.map → linux-6AR7SXHW.js.map} +1 -1
- package/dist/{macos-FGY546NC.js → macos-XVPWIH4C.js} +3 -2
- package/dist/{macos-FGY546NC.js.map → macos-XVPWIH4C.js.map} +1 -1
- package/dist/service/config.d.ts.map +1 -1
- package/dist/service/index.js +5 -4
- package/dist/service/index.js.map +1 -1
- package/dist/start.js +2 -1
- package/dist/{windows-PIJ4CMWX.js → windows-NLONSCDA.js} +3 -2
- package/dist/{windows-PIJ4CMWX.js.map → windows-NLONSCDA.js.map} +1 -1
- package/package.json +6 -6
- package/dist/chunk-KITKMSBE.js.map +0 -1
- package/dist/chunk-W3LSW4XY.js.map +0 -1
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// src/config.ts
|
|
2
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync } from "fs";
|
|
3
|
+
import { join } from "path";
|
|
4
|
+
import { homedir, hostname } from "os";
|
|
5
|
+
import { createLogger } from "@mclawnet/logger";
|
|
6
|
+
var log = createLogger({ module: "config" });
|
|
7
|
+
var CONFIG_DIR = join(homedir(), ".clawnet");
|
|
8
|
+
var SETTINGS_FILE = join(CONFIG_DIR, "settings.json");
|
|
9
|
+
var DEFAULT_HUB_URL = process.env.CLAWNET_DEFAULT_HUB_URL || "ws://localhost:3000/ws/agent";
|
|
10
|
+
var DEFAULTS = {
|
|
11
|
+
hubUrl: DEFAULT_HUB_URL,
|
|
12
|
+
token: "",
|
|
13
|
+
name: hostname(),
|
|
14
|
+
backendType: "claude-code"
|
|
15
|
+
};
|
|
16
|
+
function normalizeHubUrl(url) {
|
|
17
|
+
url = url.replace(/^https:\/\//, "wss://").replace(/^http:\/\//, "ws://");
|
|
18
|
+
if (!/^wss?:\/\//.test(url)) url = "wss://" + url;
|
|
19
|
+
if (url.endsWith("/ws/agent")) return url;
|
|
20
|
+
return url.replace(/\/+$/, "") + "/ws/agent";
|
|
21
|
+
}
|
|
22
|
+
function applyEmbeddingConfig(embedding) {
|
|
23
|
+
const mapping = [
|
|
24
|
+
["provider", "CLAWNET_EMBEDDING_PROVIDER"],
|
|
25
|
+
["openaiBaseUrl", "CLAWNET_OPENAI_BASE_URL"],
|
|
26
|
+
["openaiApiKey", "CLAWNET_OPENAI_API_KEY"],
|
|
27
|
+
["openaiModel", "CLAWNET_OPENAI_EMBEDDING_MODEL"],
|
|
28
|
+
["ollamaUrl", "CLAWNET_OLLAMA_URL"],
|
|
29
|
+
["ollamaModel", "CLAWNET_OLLAMA_MODEL"]
|
|
30
|
+
];
|
|
31
|
+
for (const [configKey, envKey] of mapping) {
|
|
32
|
+
const value = embedding[configKey];
|
|
33
|
+
if (value !== void 0 && process.env[envKey] === void 0) {
|
|
34
|
+
process.env[envKey] = value;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function loadConfig(cliOpts = {}) {
|
|
39
|
+
let fileConfig = {};
|
|
40
|
+
log.info({ path: SETTINGS_FILE }, "loading config");
|
|
41
|
+
if (existsSync(SETTINGS_FILE)) {
|
|
42
|
+
try {
|
|
43
|
+
fileConfig = JSON.parse(readFileSync(SETTINGS_FILE, "utf-8"));
|
|
44
|
+
log.info(
|
|
45
|
+
{ hubUrl: fileConfig.hubUrl, hasToken: !!fileConfig.token, name: fileConfig.name },
|
|
46
|
+
"settings.json loaded"
|
|
47
|
+
);
|
|
48
|
+
} catch (e) {
|
|
49
|
+
log.warn({ err: e }, "failed to parse settings.json");
|
|
50
|
+
}
|
|
51
|
+
} else {
|
|
52
|
+
log.warn("settings.json not found");
|
|
53
|
+
}
|
|
54
|
+
if (fileConfig.embedding) {
|
|
55
|
+
applyEmbeddingConfig(fileConfig.embedding);
|
|
56
|
+
}
|
|
57
|
+
const hubUrl = cliOpts.hubUrl ?? process.env.CLAWNET_HUB_URL ?? fileConfig.hubUrl ?? DEFAULTS.hubUrl;
|
|
58
|
+
const resolved = {
|
|
59
|
+
hubUrl: normalizeHubUrl(hubUrl),
|
|
60
|
+
token: cliOpts.token ?? process.env.CLAWNET_TOKEN ?? fileConfig.token ?? DEFAULTS.token,
|
|
61
|
+
name: cliOpts.name ?? process.env.CLAWNET_NAME ?? fileConfig.name ?? DEFAULTS.name,
|
|
62
|
+
backendType: cliOpts.backendType ?? process.env.CLAWNET_BACKEND_TYPE ?? fileConfig.backendType ?? DEFAULTS.backendType,
|
|
63
|
+
embedding: fileConfig.embedding
|
|
64
|
+
};
|
|
65
|
+
log.info(
|
|
66
|
+
{
|
|
67
|
+
hubUrl: resolved.hubUrl,
|
|
68
|
+
hubUrlSource: cliOpts.hubUrl ? "cli" : process.env.CLAWNET_HUB_URL ? "env" : fileConfig.hubUrl ? "file" : "default",
|
|
69
|
+
tokenSource: cliOpts.token ? "cli" : process.env.CLAWNET_TOKEN ? "env" : fileConfig.token ? "file" : "default",
|
|
70
|
+
hasToken: !!resolved.token
|
|
71
|
+
},
|
|
72
|
+
"config resolved"
|
|
73
|
+
);
|
|
74
|
+
return resolved;
|
|
75
|
+
}
|
|
76
|
+
function saveConfig(config) {
|
|
77
|
+
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
78
|
+
let existing = {};
|
|
79
|
+
if (existsSync(SETTINGS_FILE)) {
|
|
80
|
+
try {
|
|
81
|
+
existing = JSON.parse(readFileSync(SETTINGS_FILE, "utf-8"));
|
|
82
|
+
} catch {
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const merged = { ...existing, ...config };
|
|
86
|
+
writeFileSync(SETTINGS_FILE, JSON.stringify(merged, null, 2) + "\n");
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export {
|
|
90
|
+
loadConfig,
|
|
91
|
+
saveConfig
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=chunk-CBZIH6FY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config.ts"],"sourcesContent":["import { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir, hostname } from \"node:os\";\nimport type { BackendType } from \"@mclawnet/shared\";\nimport { createLogger } from \"@mclawnet/logger\";\n\nconst log = createLogger({ module: \"config\" });\n\nexport interface EmbeddingConfig {\n /** Embedding provider mode: auto / openai / ollama / hash */\n provider?: string;\n /** OpenAI-compatible API base URL (e.g. http://localhost:4141/v1 for copilot proxy) */\n openaiBaseUrl?: string;\n /** OpenAI API key (use \"dummy\" for copilot proxy) */\n openaiApiKey?: string;\n /** OpenAI embedding model name */\n openaiModel?: string;\n /** Ollama server URL */\n ollamaUrl?: string;\n /** Ollama embedding model name */\n ollamaModel?: string;\n}\n\nexport interface AgentConfig {\n hubUrl: string;\n token: string;\n name: string;\n backendType: BackendType;\n embedding?: EmbeddingConfig;\n}\n\nconst CONFIG_DIR = join(homedir(), \".clawnet\");\nconst SETTINGS_FILE = join(CONFIG_DIR, \"settings.json\");\n\nconst DEFAULT_HUB_URL = process.env.CLAWNET_DEFAULT_HUB_URL || \"ws://localhost:3000/ws/agent\";\n\nconst DEFAULTS: AgentConfig = {\n hubUrl: DEFAULT_HUB_URL,\n token: \"\",\n name: hostname(),\n backendType: \"claude-code\",\n};\n\n/** Ensure hubUrl uses ws(s):// protocol and ends with /ws/agent */\nfunction normalizeHubUrl(url: string): string {\n // Convert http(s):// to ws(s)://\n url = url.replace(/^https:\\/\\//, \"wss://\").replace(/^http:\\/\\//, \"ws://\");\n // Default to wss:// if no protocol\n if (!/^wss?:\\/\\//.test(url)) url = \"wss://\" + url;\n if (url.endsWith(\"/ws/agent\")) return url;\n return url.replace(/\\/+$/, \"\") + \"/ws/agent\";\n}\n\n/**\n * Map structured embedding config to CLAWNET_* env vars.\n * Only sets vars that are not already defined in process.env.\n */\nfunction applyEmbeddingConfig(embedding: EmbeddingConfig): void {\n const mapping: Array<[keyof EmbeddingConfig, string]> = [\n [\"provider\", \"CLAWNET_EMBEDDING_PROVIDER\"],\n [\"openaiBaseUrl\", \"CLAWNET_OPENAI_BASE_URL\"],\n [\"openaiApiKey\", \"CLAWNET_OPENAI_API_KEY\"],\n [\"openaiModel\", \"CLAWNET_OPENAI_EMBEDDING_MODEL\"],\n [\"ollamaUrl\", \"CLAWNET_OLLAMA_URL\"],\n [\"ollamaModel\", \"CLAWNET_OLLAMA_MODEL\"],\n ];\n\n for (const [configKey, envKey] of mapping) {\n const value = embedding[configKey];\n if (value !== undefined && process.env[envKey] === undefined) {\n process.env[envKey] = value;\n }\n }\n}\n\n/** Load config: CLI opts > env vars > settings file > defaults */\nexport function loadConfig(cliOpts: Partial<AgentConfig> = {}): AgentConfig {\n let fileConfig: Partial<AgentConfig> = {};\n\n log.info({ path: SETTINGS_FILE }, \"loading config\");\n\n if (existsSync(SETTINGS_FILE)) {\n try {\n fileConfig = JSON.parse(readFileSync(SETTINGS_FILE, \"utf-8\"));\n log.info(\n { hubUrl: fileConfig.hubUrl, hasToken: !!fileConfig.token, name: fileConfig.name },\n \"settings.json loaded\"\n );\n } catch (e) {\n log.warn({ err: e }, \"failed to parse settings.json\");\n }\n } else {\n log.warn(\"settings.json not found\");\n }\n\n // Apply structured embedding config to process.env\n if (fileConfig.embedding) {\n applyEmbeddingConfig(fileConfig.embedding);\n }\n\n const hubUrl =\n cliOpts.hubUrl ??\n process.env.CLAWNET_HUB_URL ??\n fileConfig.hubUrl ??\n DEFAULTS.hubUrl;\n\n const resolved = {\n hubUrl: normalizeHubUrl(hubUrl),\n token:\n cliOpts.token ??\n process.env.CLAWNET_TOKEN ??\n fileConfig.token ??\n DEFAULTS.token,\n name:\n cliOpts.name ??\n process.env.CLAWNET_NAME ??\n fileConfig.name ??\n DEFAULTS.name,\n backendType:\n (cliOpts.backendType as BackendType) ??\n (process.env.CLAWNET_BACKEND_TYPE as BackendType) ??\n (fileConfig.backendType as BackendType) ??\n DEFAULTS.backendType,\n embedding: fileConfig.embedding,\n };\n\n log.info(\n {\n hubUrl: resolved.hubUrl,\n hubUrlSource: cliOpts.hubUrl ? \"cli\" : process.env.CLAWNET_HUB_URL ? \"env\" : fileConfig.hubUrl ? \"file\" : \"default\",\n tokenSource: cliOpts.token ? \"cli\" : process.env.CLAWNET_TOKEN ? \"env\" : fileConfig.token ? \"file\" : \"default\",\n hasToken: !!resolved.token,\n },\n \"config resolved\"\n );\n\n return resolved;\n}\n\n/** Save config to ~/.clawnet/settings.json */\nexport function saveConfig(config: Partial<AgentConfig>): void {\n mkdirSync(CONFIG_DIR, { recursive: true });\n\n let existing: Partial<AgentConfig> = {};\n if (existsSync(SETTINGS_FILE)) {\n try {\n existing = JSON.parse(readFileSync(SETTINGS_FILE, \"utf-8\"));\n } catch {\n // ignore\n }\n }\n\n const merged = { ...existing, ...config };\n writeFileSync(SETTINGS_FILE, JSON.stringify(merged, null, 2) + \"\\n\");\n}\n"],"mappings":"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","names":[]}
|