openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
78 lines (77 loc) • 2.34 kB
JavaScript
import { c as isRecord } from "./record-coerce-DItp3I4t.js";
import "./utils-P__uGsPB.js";
//#region scripts/lib/recommended-tool-installs.json
var entries = [
{
"id": "ollama",
"brandId": "ollama",
"label": "Ollama",
"hint": "Run open models locally",
"website": "https://ollama.com/download",
"icon": "https://cdn.simpleicons.org/ollama"
},
{
"id": "lmstudio",
"label": "LM Studio",
"hint": "Local model desktop app",
"website": "https://lmstudio.ai/download",
"icon": "https://cdn.simpleicons.org/lmstudio"
},
{
"id": "claude-code",
"brandId": "claude",
"label": "Claude Code",
"hint": "Anthropic's coding agent CLI",
"website": "https://code.claude.com/docs/en/quickstart",
"icon": "https://cdn.simpleicons.org/claudecode"
},
{
"id": "codex-cli",
"brandId": "openai",
"label": "Codex CLI",
"hint": "OpenAI's coding agent CLI",
"website": "https://developers.openai.com/codex/cli/",
"icon": "https://github.com/openai.png"
}
];
//#endregion
//#region src/plugins/recommended-tool-installs.ts
function normalizeHttpsUrl(value) {
if (typeof value !== "string" || !value.trim()) return;
const normalized = value.trim();
try {
const url = new URL(normalized);
const canonical = url.toString();
return url.protocol === "https:" && url.hostname && !url.username && !url.password && canonical.length <= 2048 ? canonical : void 0;
} catch {
return;
}
}
function listRecommendedToolInstalls() {
const entries$1 = entries;
if (!Array.isArray(entries$1)) return [];
const seenIds = /* @__PURE__ */ new Set();
const installs = [];
for (const entry of entries$1) {
if (!isRecord(entry)) continue;
const id = typeof entry.id === "string" ? entry.id.trim() : "";
const brandId = typeof entry.brandId === "string" ? entry.brandId.trim() : "";
const label = typeof entry.label === "string" ? entry.label.trim() : "";
const hint = typeof entry.hint === "string" ? entry.hint.trim() : "";
const website = normalizeHttpsUrl(entry.website);
const icon = normalizeHttpsUrl(entry.icon);
if (!id || seenIds.has(id) || !label || !hint || !website || !icon) continue;
seenIds.add(id);
installs.push({
id,
...brandId ? { brandId } : {},
label,
hint,
website,
icon
});
}
return installs;
}
//#endregion
export { listRecommendedToolInstalls as t };