@lobu/cli 5.0.0 → 6.0.1
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/README.md +11 -26
- package/dist/__tests__/chat.integration.test.js +19 -19
- package/dist/__tests__/chat.integration.test.js.map +1 -1
- package/dist/__tests__/dev.test.d.ts +2 -0
- package/dist/__tests__/dev.test.d.ts.map +1 -0
- package/dist/__tests__/dev.test.js +25 -0
- package/dist/__tests__/dev.test.js.map +1 -0
- package/dist/__tests__/init-memory.test.js +1 -14
- package/dist/__tests__/init-memory.test.js.map +1 -1
- package/dist/__tests__/token.test.d.ts +2 -0
- package/dist/__tests__/token.test.d.ts.map +1 -0
- package/dist/__tests__/token.test.js +52 -0
- package/dist/__tests__/token.test.js.map +1 -0
- package/dist/bundled-skills/lobu/SKILL.md +95 -7
- package/dist/commands/_lib/apply/__tests__/client.test.d.ts +2 -0
- package/dist/commands/_lib/apply/__tests__/client.test.d.ts.map +1 -0
- package/dist/commands/_lib/apply/__tests__/client.test.js +23 -0
- package/dist/commands/_lib/apply/__tests__/client.test.js.map +1 -0
- package/dist/commands/_lib/apply/__tests__/desired-state.test.d.ts +2 -0
- package/dist/commands/_lib/apply/__tests__/desired-state.test.d.ts.map +1 -0
- package/dist/commands/_lib/apply/__tests__/desired-state.test.js +140 -0
- package/dist/commands/_lib/apply/__tests__/desired-state.test.js.map +1 -0
- package/dist/commands/_lib/apply/__tests__/diff.test.d.ts +2 -0
- package/dist/commands/_lib/apply/__tests__/diff.test.d.ts.map +1 -0
- package/dist/commands/_lib/apply/__tests__/diff.test.js +378 -0
- package/dist/commands/_lib/apply/__tests__/diff.test.js.map +1 -0
- package/dist/commands/_lib/apply/apply-cmd.d.ts +12 -0
- package/dist/commands/_lib/apply/apply-cmd.d.ts.map +1 -0
- package/dist/commands/_lib/apply/apply-cmd.js +183 -0
- package/dist/commands/_lib/apply/apply-cmd.js.map +1 -0
- package/dist/commands/_lib/apply/client.d.ts +130 -0
- package/dist/commands/_lib/apply/client.d.ts.map +1 -0
- package/dist/commands/_lib/apply/client.js +243 -0
- package/dist/commands/_lib/apply/client.js.map +1 -0
- package/dist/commands/_lib/apply/desired-state.d.ts +71 -0
- package/dist/commands/_lib/apply/desired-state.d.ts.map +1 -0
- package/dist/commands/_lib/apply/desired-state.js +600 -0
- package/dist/commands/_lib/apply/desired-state.js.map +1 -0
- package/dist/commands/_lib/apply/diff.d.ts +76 -0
- package/dist/commands/_lib/apply/diff.d.ts.map +1 -0
- package/dist/commands/_lib/apply/diff.js +323 -0
- package/dist/commands/_lib/apply/diff.js.map +1 -0
- package/dist/commands/_lib/apply/prompt.d.ts +13 -0
- package/dist/commands/_lib/apply/prompt.d.ts.map +1 -0
- package/dist/commands/_lib/apply/prompt.js +19 -0
- package/dist/commands/_lib/apply/prompt.js.map +1 -0
- package/dist/commands/_lib/apply/render.d.ts +9 -0
- package/dist/commands/_lib/apply/render.d.ts.map +1 -0
- package/dist/commands/_lib/apply/render.js +92 -0
- package/dist/commands/_lib/apply/render.js.map +1 -0
- package/dist/commands/agent.d.ts +27 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +111 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/apply.d.ts +3 -0
- package/dist/commands/apply.d.ts.map +1 -0
- package/dist/commands/apply.js +5 -0
- package/dist/commands/apply.js.map +1 -0
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +5 -5
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/dev.d.ts +8 -3
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +128 -124
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/doctor.d.ts +6 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +75 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/eval.d.ts +1 -0
- package/dist/commands/eval.d.ts.map +1 -1
- package/dist/commands/eval.js +7 -4
- package/dist/commands/eval.js.map +1 -1
- package/dist/commands/init.d.ts +2 -9
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +34 -248
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts +11 -3
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +109 -251
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts.map +1 -1
- package/dist/commands/logout.js +12 -11
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/memory/_lib/agent-detect.d.ts +9 -0
- package/dist/commands/memory/_lib/agent-detect.d.ts.map +1 -0
- package/dist/commands/memory/_lib/agent-detect.js +82 -0
- package/dist/commands/memory/_lib/agent-detect.js.map +1 -0
- package/dist/commands/memory/_lib/browser-auth-cmd.d.ts +19 -0
- package/dist/commands/memory/_lib/browser-auth-cmd.d.ts.map +1 -0
- package/dist/commands/memory/_lib/browser-auth-cmd.js +635 -0
- package/dist/commands/memory/_lib/browser-auth-cmd.js.map +1 -0
- package/dist/commands/memory/_lib/browser.d.ts +2 -0
- package/dist/commands/memory/_lib/browser.d.ts.map +1 -0
- package/dist/commands/memory/_lib/browser.js +26 -0
- package/dist/commands/memory/_lib/browser.js.map +1 -0
- package/dist/commands/memory/_lib/errors.d.ts +13 -0
- package/dist/commands/memory/_lib/errors.d.ts.map +1 -0
- package/dist/commands/memory/_lib/errors.js +23 -0
- package/dist/commands/memory/_lib/errors.js.map +1 -0
- package/dist/commands/memory/_lib/init-wizard.d.ts +12 -0
- package/dist/commands/memory/_lib/init-wizard.d.ts.map +1 -0
- package/dist/commands/memory/_lib/init-wizard.js +182 -0
- package/dist/commands/memory/_lib/init-wizard.js.map +1 -0
- package/dist/commands/memory/_lib/install-targets.d.ts +15 -0
- package/dist/commands/memory/_lib/install-targets.d.ts.map +1 -0
- package/dist/commands/memory/_lib/install-targets.js +205 -0
- package/dist/commands/memory/_lib/install-targets.js.map +1 -0
- package/dist/commands/memory/_lib/mcp.d.ts +20 -0
- package/dist/commands/memory/_lib/mcp.d.ts.map +1 -0
- package/dist/commands/memory/_lib/mcp.js +182 -0
- package/dist/commands/memory/_lib/mcp.js.map +1 -0
- package/dist/commands/memory/_lib/openclaw-auth.d.ts +41 -0
- package/dist/commands/memory/_lib/openclaw-auth.d.ts.map +1 -0
- package/dist/commands/memory/_lib/openclaw-auth.js +133 -0
- package/dist/commands/memory/_lib/openclaw-auth.js.map +1 -0
- package/dist/commands/memory/_lib/openclaw-auth.test.d.ts +2 -0
- package/dist/commands/memory/_lib/openclaw-auth.test.d.ts.map +1 -0
- package/dist/commands/memory/_lib/openclaw-auth.test.js +9 -0
- package/dist/commands/memory/_lib/openclaw-auth.test.js.map +1 -0
- package/dist/commands/memory/_lib/openclaw-cmd.d.ts +15 -0
- package/dist/commands/memory/_lib/openclaw-cmd.d.ts.map +1 -0
- package/dist/commands/memory/_lib/openclaw-cmd.js +208 -0
- package/dist/commands/memory/_lib/openclaw-cmd.js.map +1 -0
- package/dist/commands/memory/_lib/output.d.ts +5 -0
- package/dist/commands/memory/_lib/output.d.ts.map +1 -0
- package/dist/commands/memory/_lib/output.js +17 -0
- package/dist/commands/memory/_lib/output.js.map +1 -0
- package/dist/commands/memory/_lib/schema.d.ts +93 -0
- package/dist/commands/memory/_lib/schema.d.ts.map +1 -0
- package/dist/commands/memory/_lib/schema.js +192 -0
- package/dist/commands/memory/_lib/schema.js.map +1 -0
- package/dist/commands/memory/_lib/seed-cmd.d.ts +9 -0
- package/dist/commands/memory/_lib/seed-cmd.d.ts.map +1 -0
- package/dist/commands/memory/_lib/seed-cmd.js +516 -0
- package/dist/commands/memory/_lib/seed-cmd.js.map +1 -0
- package/dist/commands/memory/browser-auth.d.ts +3 -0
- package/dist/commands/memory/browser-auth.d.ts.map +1 -0
- package/dist/commands/memory/browser-auth.js +5 -0
- package/dist/commands/memory/browser-auth.js.map +1 -0
- package/dist/commands/memory/configure.d.ts +3 -0
- package/dist/commands/memory/configure.d.ts.map +1 -0
- package/dist/commands/memory/configure.js +5 -0
- package/dist/commands/memory/configure.js.map +1 -0
- package/dist/commands/memory/health.d.ts +3 -0
- package/dist/commands/memory/health.d.ts.map +1 -0
- package/dist/commands/memory/health.js +5 -0
- package/dist/commands/memory/health.js.map +1 -0
- package/dist/commands/memory/init.d.ts +8 -0
- package/dist/commands/memory/init.d.ts.map +1 -0
- package/dist/commands/memory/init.js +65 -0
- package/dist/commands/memory/init.js.map +1 -0
- package/dist/commands/memory/org.d.ts +7 -0
- package/dist/commands/memory/org.d.ts.map +1 -0
- package/dist/commands/memory/org.js +22 -0
- package/dist/commands/memory/org.js.map +1 -0
- package/dist/commands/memory/run.d.ts +8 -0
- package/dist/commands/memory/run.d.ts.map +1 -0
- package/dist/commands/memory/run.js +58 -0
- package/dist/commands/memory/run.js.map +1 -0
- package/dist/commands/memory/seed.d.ts +3 -0
- package/dist/commands/memory/seed.d.ts.map +1 -0
- package/dist/commands/memory/seed.js +5 -0
- package/dist/commands/memory/seed.js.map +1 -0
- package/dist/commands/org.d.ts +10 -0
- package/dist/commands/org.d.ts.map +1 -0
- package/dist/commands/org.js +34 -0
- package/dist/commands/org.js.map +1 -0
- package/dist/commands/{connections/platforms.d.ts → platforms/platform-prompts.d.ts} +5 -5
- package/dist/commands/platforms/platform-prompts.d.ts.map +1 -0
- package/dist/commands/{connections/platforms.js → platforms/platform-prompts.js} +24 -24
- package/dist/commands/platforms/platform-prompts.js.map +1 -0
- package/dist/commands/status.d.ts +4 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +15 -84
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/token.d.ts +17 -0
- package/dist/commands/token.d.ts.map +1 -0
- package/dist/commands/token.js +55 -0
- package/dist/commands/token.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +303 -88
- package/dist/index.js.map +1 -1
- package/dist/internal/__tests__/api-client.test.d.ts +2 -0
- package/dist/internal/__tests__/api-client.test.d.ts.map +1 -0
- package/dist/internal/__tests__/api-client.test.js +95 -0
- package/dist/internal/__tests__/api-client.test.js.map +1 -0
- package/dist/internal/__tests__/context.test.d.ts +2 -0
- package/dist/internal/__tests__/context.test.d.ts.map +1 -0
- package/dist/internal/__tests__/context.test.js +77 -0
- package/dist/internal/__tests__/context.test.js.map +1 -0
- package/dist/internal/api-client.d.ts +39 -0
- package/dist/internal/api-client.d.ts.map +1 -0
- package/dist/internal/api-client.js +217 -0
- package/dist/internal/api-client.js.map +1 -0
- package/dist/internal/context.d.ts +10 -1
- package/dist/internal/context.d.ts.map +1 -1
- package/dist/internal/context.js +109 -2
- package/dist/internal/context.js.map +1 -1
- package/dist/internal/credentials.d.ts +12 -2
- package/dist/internal/credentials.d.ts.map +1 -1
- package/dist/internal/credentials.js +47 -54
- package/dist/internal/credentials.js.map +1 -1
- package/dist/internal/gateway-url.d.ts +4 -4
- package/dist/internal/gateway-url.d.ts.map +1 -1
- package/dist/internal/gateway-url.js +6 -5
- package/dist/internal/gateway-url.js.map +1 -1
- package/dist/internal/index.d.ts +5 -3
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +3 -2
- package/dist/internal/index.js.map +1 -1
- package/dist/internal/local-env.d.ts +2 -0
- package/dist/internal/local-env.d.ts.map +1 -0
- package/dist/internal/local-env.js +32 -0
- package/dist/internal/local-env.js.map +1 -0
- package/dist/internal/oauth.d.ts +82 -0
- package/dist/internal/oauth.d.ts.map +1 -0
- package/dist/internal/oauth.js +234 -0
- package/dist/internal/oauth.js.map +1 -0
- package/dist/server.bundle.mjs +72219 -0
- package/dist/templates/.env.tmpl +7 -3
- package/dist/templates/README.md.tmpl +20 -53
- package/package.json +60 -6
- package/dist/__tests__/skills.test.d.ts +0 -2
- package/dist/__tests__/skills.test.d.ts.map +0 -1
- package/dist/__tests__/skills.test.js +0 -33
- package/dist/__tests__/skills.test.js.map +0 -1
- package/dist/commands/connections/add.d.ts +0 -2
- package/dist/commands/connections/add.d.ts.map +0 -1
- package/dist/commands/connections/add.js +0 -46
- package/dist/commands/connections/add.js.map +0 -1
- package/dist/commands/connections/list.d.ts +0 -2
- package/dist/commands/connections/list.d.ts.map +0 -1
- package/dist/commands/connections/list.js +0 -25
- package/dist/commands/connections/list.js.map +0 -1
- package/dist/commands/connections/platforms.d.ts.map +0 -1
- package/dist/commands/connections/platforms.js.map +0 -1
- package/dist/commands/providers/add.d.ts +0 -2
- package/dist/commands/providers/add.d.ts.map +0 -1
- package/dist/commands/providers/add.js +0 -50
- package/dist/commands/providers/add.js.map +0 -1
- package/dist/commands/providers/list.d.ts +0 -2
- package/dist/commands/providers/list.d.ts.map +0 -1
- package/dist/commands/providers/list.js +0 -22
- package/dist/commands/providers/list.js.map +0 -1
- package/dist/commands/secrets.d.ts +0 -8
- package/dist/commands/secrets.d.ts.map +0 -1
- package/dist/commands/secrets.js +0 -98
- package/dist/commands/secrets.js.map +0 -1
- package/dist/commands/skills/add.d.ts +0 -5
- package/dist/commands/skills/add.d.ts.map +0 -1
- package/dist/commands/skills/add.js +0 -27
- package/dist/commands/skills/add.js.map +0 -1
- package/dist/commands/skills/list.d.ts +0 -2
- package/dist/commands/skills/list.d.ts.map +0 -1
- package/dist/commands/skills/list.js +0 -19
- package/dist/commands/skills/list.js.map +0 -1
- package/dist/commands/skills/registry.d.ts +0 -19
- package/dist/commands/skills/registry.d.ts.map +0 -1
- package/dist/commands/skills/registry.js +0 -76
- package/dist/commands/skills/registry.js.map +0 -1
- package/dist/config/agent-helpers.d.ts +0 -38
- package/dist/config/agent-helpers.d.ts.map +0 -1
- package/dist/config/agent-helpers.js +0 -58
- package/dist/config/agent-helpers.js.map +0 -1
- package/dist/templates/Dockerfile.worker.tmpl +0 -29
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { ApiError } from "./errors.js";
|
|
2
|
+
import { getUsableToken, orgFromMcpUrl, resolveServerUrl, } from "./openclaw-auth.js";
|
|
3
|
+
const JSON_MCP_ACCEPT = "application/json";
|
|
4
|
+
function uniqueStrings(values) {
|
|
5
|
+
const seen = new Set();
|
|
6
|
+
const result = [];
|
|
7
|
+
for (const value of values) {
|
|
8
|
+
if (seen.has(value))
|
|
9
|
+
continue;
|
|
10
|
+
seen.add(value);
|
|
11
|
+
result.push(value);
|
|
12
|
+
}
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
function getMcpUrlCandidates(rawUrl) {
|
|
16
|
+
let parsed;
|
|
17
|
+
try {
|
|
18
|
+
parsed = new URL(rawUrl);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return [rawUrl];
|
|
22
|
+
}
|
|
23
|
+
const candidates = [parsed.toString()];
|
|
24
|
+
const hostname = parsed.hostname.toLowerCase();
|
|
25
|
+
if (hostname === "localhost" || hostname === "::1" || hostname === "[::1]") {
|
|
26
|
+
const ipv4 = new URL(parsed.toString());
|
|
27
|
+
ipv4.hostname = "127.0.0.1";
|
|
28
|
+
candidates.push(ipv4.toString());
|
|
29
|
+
const dockerHost = new URL(parsed.toString());
|
|
30
|
+
dockerHost.hostname = "host.docker.internal";
|
|
31
|
+
candidates.push(dockerHost.toString());
|
|
32
|
+
}
|
|
33
|
+
return uniqueStrings(candidates);
|
|
34
|
+
}
|
|
35
|
+
function formatNetworkErrorMessage(error, triedUrls) {
|
|
36
|
+
const baseMessage = error instanceof Error ? error.message : String(error);
|
|
37
|
+
return `MCP fetch failed (${baseMessage}). Tried: ${triedUrls.join(", ")}`;
|
|
38
|
+
}
|
|
39
|
+
async function fetchMcpWithFallback(mcpUrl, init) {
|
|
40
|
+
const candidates = getMcpUrlCandidates(mcpUrl);
|
|
41
|
+
let lastError = null;
|
|
42
|
+
for (const candidate of candidates) {
|
|
43
|
+
try {
|
|
44
|
+
const response = await fetch(candidate, init);
|
|
45
|
+
return { response, usedUrl: candidate };
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
lastError = error;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
throw new Error(formatNetworkErrorMessage(lastError, candidates));
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Resolve the MCP endpoint URL.
|
|
55
|
+
* Priority: explicit config > LOBU_MEMORY_URL env > saved memory server > default cloud server.
|
|
56
|
+
*/
|
|
57
|
+
export async function resolveMcpEndpoint(config) {
|
|
58
|
+
// Explicit config should win over ambient auth/session state so callers can
|
|
59
|
+
// deterministically target a specific server.
|
|
60
|
+
if (config) {
|
|
61
|
+
if (typeof config.mcpUrl === "string" && config.mcpUrl.trim().length > 0) {
|
|
62
|
+
return config.mcpUrl;
|
|
63
|
+
}
|
|
64
|
+
if (typeof config.url === "string" && config.url.trim().length > 0) {
|
|
65
|
+
const url = config.url;
|
|
66
|
+
return url.includes("/mcp") ? url : `${url.replace(/\/+$/, "")}/mcp`;
|
|
67
|
+
}
|
|
68
|
+
if (typeof config.apiUrl === "string" && config.apiUrl.trim().length > 0) {
|
|
69
|
+
return `${config.apiUrl.replace(/\/+$/, "")}/mcp`;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Fall back to auth store / env when no explicit target was provided.
|
|
73
|
+
return resolveServerUrl();
|
|
74
|
+
}
|
|
75
|
+
async function mcpFetch(mcpUrl, body, sessionId) {
|
|
76
|
+
const headers = {
|
|
77
|
+
"Content-Type": "application/json",
|
|
78
|
+
};
|
|
79
|
+
const tokenResult = await getUsableToken(mcpUrl);
|
|
80
|
+
if (tokenResult) {
|
|
81
|
+
headers.Authorization = `Bearer ${tokenResult.token}`;
|
|
82
|
+
}
|
|
83
|
+
headers.Accept = JSON_MCP_ACCEPT;
|
|
84
|
+
if (sessionId) {
|
|
85
|
+
headers["mcp-session-id"] = sessionId;
|
|
86
|
+
}
|
|
87
|
+
const { response: res, usedUrl } = await fetchMcpWithFallback(mcpUrl, {
|
|
88
|
+
method: "POST",
|
|
89
|
+
headers,
|
|
90
|
+
body: JSON.stringify(body),
|
|
91
|
+
});
|
|
92
|
+
if (!res.ok) {
|
|
93
|
+
throw new ApiError(`MCP request failed via ${usedUrl}: ${res.status} ${res.statusText}`, res.status);
|
|
94
|
+
}
|
|
95
|
+
const raw = await res.text();
|
|
96
|
+
const data = raw.length > 0 ? JSON.parse(raw) : {};
|
|
97
|
+
return { data, usedUrl, response: res };
|
|
98
|
+
}
|
|
99
|
+
async function initializeMcpSession(mcpUrl) {
|
|
100
|
+
const { data, usedUrl, response } = await mcpFetch(mcpUrl, {
|
|
101
|
+
jsonrpc: "2.0",
|
|
102
|
+
id: "__init__",
|
|
103
|
+
method: "initialize",
|
|
104
|
+
params: {
|
|
105
|
+
protocolVersion: "2025-03-26",
|
|
106
|
+
capabilities: {},
|
|
107
|
+
clientInfo: { name: "lobu-memory", version: "1.0.0" },
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
if (data.error) {
|
|
111
|
+
throw new ApiError(`MCP error: ${data.error.message} (code ${data.error.code})`);
|
|
112
|
+
}
|
|
113
|
+
const sessionId = response.headers.get("mcp-session-id");
|
|
114
|
+
if (!sessionId) {
|
|
115
|
+
throw new ApiError(`MCP initialize via ${usedUrl} did not return an mcp-session-id header`);
|
|
116
|
+
}
|
|
117
|
+
await mcpFetch(mcpUrl, {
|
|
118
|
+
jsonrpc: "2.0",
|
|
119
|
+
method: "notifications/initialized",
|
|
120
|
+
}, sessionId);
|
|
121
|
+
return { sessionId, usedUrl };
|
|
122
|
+
}
|
|
123
|
+
export async function mcpRpc(mcpUrl, method, params) {
|
|
124
|
+
const { sessionId } = await initializeMcpSession(mcpUrl);
|
|
125
|
+
const { data } = await mcpFetch(mcpUrl, {
|
|
126
|
+
jsonrpc: "2.0",
|
|
127
|
+
id: 1,
|
|
128
|
+
method,
|
|
129
|
+
params: params || {},
|
|
130
|
+
}, sessionId);
|
|
131
|
+
if (data.error) {
|
|
132
|
+
throw new ApiError(`MCP error: ${data.error.message} (code ${data.error.code})`);
|
|
133
|
+
}
|
|
134
|
+
return data.result;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Call a Lobu memory tool over the REST proxy at `POST /api/{orgSlug}/{toolName}`.
|
|
138
|
+
*
|
|
139
|
+
* Reuses the same auth resolution and localhost/docker-host fallback as
|
|
140
|
+
* `mcpRpc`. Returns the raw handler result as parsed JSON (no MCP envelope).
|
|
141
|
+
* Throws `ApiError` on non-2xx, surfacing the server's `{ error }` message
|
|
142
|
+
* when present.
|
|
143
|
+
*/
|
|
144
|
+
export async function restToolCall(mcpUrl, toolName, args) {
|
|
145
|
+
const headers = {
|
|
146
|
+
"Content-Type": "application/json",
|
|
147
|
+
};
|
|
148
|
+
const tokenResult = await getUsableToken(mcpUrl);
|
|
149
|
+
if (tokenResult) {
|
|
150
|
+
headers.Authorization = `Bearer ${tokenResult.token}`;
|
|
151
|
+
}
|
|
152
|
+
// Prefer the org slug pinned in the URL (`/mcp/{slug}`). Fall back to the
|
|
153
|
+
// session's bound org so callers using a bare `/mcp` URL still resolve.
|
|
154
|
+
const orgSlug = orgFromMcpUrl(mcpUrl) ?? tokenResult?.session.org ?? null;
|
|
155
|
+
if (!orgSlug) {
|
|
156
|
+
throw new ApiError(`Cannot call ${toolName}: no org slug on MCP URL ${mcpUrl}. Use --org or run: lobu memory org set <org>`);
|
|
157
|
+
}
|
|
158
|
+
const baseUrl = new URL(mcpUrl).origin;
|
|
159
|
+
const endpoint = `${baseUrl}/api/${orgSlug}/${toolName}`;
|
|
160
|
+
const { response: res, usedUrl } = await fetchMcpWithFallback(endpoint, {
|
|
161
|
+
method: "POST",
|
|
162
|
+
headers,
|
|
163
|
+
body: JSON.stringify(args),
|
|
164
|
+
});
|
|
165
|
+
const raw = await res.text();
|
|
166
|
+
if (!res.ok) {
|
|
167
|
+
let message = `${res.status} ${res.statusText}`;
|
|
168
|
+
if (raw) {
|
|
169
|
+
try {
|
|
170
|
+
const body = JSON.parse(raw);
|
|
171
|
+
if (body?.error)
|
|
172
|
+
message = body.error;
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
message = raw;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
throw new ApiError(`${toolName} failed via ${usedUrl}: ${message}`, res.status);
|
|
179
|
+
}
|
|
180
|
+
return (raw.length > 0 ? JSON.parse(raw) : {});
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../../src/commands/memory/_lib/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export interface MemorySession {
|
|
2
|
+
mcpUrl: string;
|
|
3
|
+
org?: string;
|
|
4
|
+
tokenType?: string;
|
|
5
|
+
updatedAt?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function normalizeMcpUrl(input: string): string;
|
|
8
|
+
/** Strip org suffix from an MCP URL for server-level defaults: /mcp/acme → /mcp */
|
|
9
|
+
export declare function baseMcpUrl(input: string): string;
|
|
10
|
+
/** Build an org-scoped MCP URL: `https://host/mcp/{org}` */
|
|
11
|
+
export declare function mcpUrlForOrg(baseUrl: string, org: string): string;
|
|
12
|
+
/** Extract org slug from a /mcp/{org} URL, or null if bare /mcp */
|
|
13
|
+
export declare function orgFromMcpUrl(mcpUrl: string): string | null;
|
|
14
|
+
export declare function setActiveOrg(orgSlug: string, context?: string): Promise<void>;
|
|
15
|
+
export declare function setActiveMcpUrl(mcpUrl: string, context?: string): Promise<void>;
|
|
16
|
+
export declare function getActiveSession(context?: string): Promise<{
|
|
17
|
+
session: MemorySession | null;
|
|
18
|
+
key: string | null;
|
|
19
|
+
}>;
|
|
20
|
+
export declare function getSessionForOrg(orgSlug: string, context?: string, urlFlag?: string): Promise<{
|
|
21
|
+
session: MemorySession;
|
|
22
|
+
key: string;
|
|
23
|
+
} | null>;
|
|
24
|
+
/**
|
|
25
|
+
* Resolve which server URL to use.
|
|
26
|
+
* Priority: explicit url arg > LOBU_MEMORY_URL > context preference > cloud default.
|
|
27
|
+
*/
|
|
28
|
+
export declare function resolveServerUrl(urlFlag?: string, context?: string): Promise<string>;
|
|
29
|
+
/**
|
|
30
|
+
* Resolve which org to use.
|
|
31
|
+
* Priority: explicit org arg > LOBU_MEMORY_ORG > session > context preference.
|
|
32
|
+
*/
|
|
33
|
+
export declare function resolveOrg(orgFlag?: string, session?: MemorySession | null, context?: string): Promise<string | undefined>;
|
|
34
|
+
/**
|
|
35
|
+
* Resolve a usable bearer token from top-level `lobu login` credentials.
|
|
36
|
+
*/
|
|
37
|
+
export declare function getUsableToken(mcpUrl?: string, contextName?: string): Promise<{
|
|
38
|
+
token: string;
|
|
39
|
+
session: MemorySession;
|
|
40
|
+
} | null>;
|
|
41
|
+
//# sourceMappingURL=openclaw-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-auth.d.ts","sourceRoot":"","sources":["../../../../src/commands/memory/_lib/openclaw-auth.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUrD;AAED,mFAAmF;AACnF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMhD;AAED,4DAA4D;AAC5D,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIjE;AAED,mEAAmE;AACnE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ3D;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,iBAEnE;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,iBAErE;AAED,wBAAsB,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAChE,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB,CAAC,CAaD;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,aAAa,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAYzD;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,EAC9B,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAK7B;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,CAAC,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,aAAa,CAAC;CACxB,GAAG,IAAI,CAAC,CA0CR"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { findContextByMemoryUrl, getActiveOrg, getMemoryUrl, getToken, resolveContext, setActiveOrg as setContextActiveOrg, setMemoryUrl as setContextMemoryUrl, } from "../../../internal/index.js";
|
|
2
|
+
export function normalizeMcpUrl(input) {
|
|
3
|
+
const url = new URL(input);
|
|
4
|
+
url.hash = "";
|
|
5
|
+
url.search = "";
|
|
6
|
+
if (!url.pathname || url.pathname === "/") {
|
|
7
|
+
url.pathname = "/mcp";
|
|
8
|
+
}
|
|
9
|
+
else if (!url.pathname.startsWith("/mcp")) {
|
|
10
|
+
url.pathname = `${url.pathname.replace(/\/+$/, "")}/mcp`;
|
|
11
|
+
}
|
|
12
|
+
return url.toString().replace(/\/+$/, "");
|
|
13
|
+
}
|
|
14
|
+
/** Strip org suffix from an MCP URL for server-level defaults: /mcp/acme → /mcp */
|
|
15
|
+
export function baseMcpUrl(input) {
|
|
16
|
+
const url = new URL(normalizeMcpUrl(input));
|
|
17
|
+
url.hash = "";
|
|
18
|
+
url.search = "";
|
|
19
|
+
url.pathname = "/mcp";
|
|
20
|
+
return url.toString().replace(/\/+$/, "");
|
|
21
|
+
}
|
|
22
|
+
/** Build an org-scoped MCP URL: `https://host/mcp/{org}` */
|
|
23
|
+
export function mcpUrlForOrg(baseUrl, org) {
|
|
24
|
+
const url = new URL(normalizeMcpUrl(baseUrl));
|
|
25
|
+
url.pathname = `/mcp/${org}`;
|
|
26
|
+
return url.toString().replace(/\/+$/, "");
|
|
27
|
+
}
|
|
28
|
+
/** Extract org slug from a /mcp/{org} URL, or null if bare /mcp */
|
|
29
|
+
export function orgFromMcpUrl(mcpUrl) {
|
|
30
|
+
try {
|
|
31
|
+
const { pathname } = new URL(mcpUrl);
|
|
32
|
+
const match = pathname.match(/^\/mcp\/([^/]+)/);
|
|
33
|
+
return match?.[1] ?? null;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export async function setActiveOrg(orgSlug, context) {
|
|
40
|
+
await setContextActiveOrg(orgSlug, context);
|
|
41
|
+
}
|
|
42
|
+
export async function setActiveMcpUrl(mcpUrl, context) {
|
|
43
|
+
await setContextMemoryUrl(mcpUrl, context);
|
|
44
|
+
}
|
|
45
|
+
export async function getActiveSession(context) {
|
|
46
|
+
const base = await resolveServerUrl(undefined, context);
|
|
47
|
+
const org = await resolveOrg(undefined, undefined, context);
|
|
48
|
+
const key = org ? mcpUrlForOrg(base, org) : base;
|
|
49
|
+
return {
|
|
50
|
+
session: {
|
|
51
|
+
mcpUrl: key,
|
|
52
|
+
org,
|
|
53
|
+
tokenType: "Bearer",
|
|
54
|
+
updatedAt: new Date().toISOString(),
|
|
55
|
+
},
|
|
56
|
+
key,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export async function getSessionForOrg(orgSlug, context, urlFlag) {
|
|
60
|
+
const base = await resolveServerUrl(urlFlag, context);
|
|
61
|
+
const key = mcpUrlForOrg(base, orgSlug);
|
|
62
|
+
return {
|
|
63
|
+
session: {
|
|
64
|
+
mcpUrl: key,
|
|
65
|
+
org: orgSlug,
|
|
66
|
+
tokenType: "Bearer",
|
|
67
|
+
updatedAt: new Date().toISOString(),
|
|
68
|
+
},
|
|
69
|
+
key,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Resolve which server URL to use.
|
|
74
|
+
* Priority: explicit url arg > LOBU_MEMORY_URL > context preference > cloud default.
|
|
75
|
+
*/
|
|
76
|
+
export async function resolveServerUrl(urlFlag, context) {
|
|
77
|
+
if (urlFlag)
|
|
78
|
+
return normalizeMcpUrl(urlFlag);
|
|
79
|
+
return normalizeMcpUrl(await getMemoryUrl(context));
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Resolve which org to use.
|
|
83
|
+
* Priority: explicit org arg > LOBU_MEMORY_ORG > session > context preference.
|
|
84
|
+
*/
|
|
85
|
+
export async function resolveOrg(orgFlag, session, context) {
|
|
86
|
+
if (orgFlag)
|
|
87
|
+
return orgFlag;
|
|
88
|
+
if (process.env.LOBU_MEMORY_ORG)
|
|
89
|
+
return process.env.LOBU_MEMORY_ORG;
|
|
90
|
+
if (session?.org)
|
|
91
|
+
return session.org;
|
|
92
|
+
return getActiveOrg(context);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Resolve a usable bearer token from top-level `lobu login` credentials.
|
|
96
|
+
*/
|
|
97
|
+
export async function getUsableToken(mcpUrl, contextName) {
|
|
98
|
+
let target = await resolveContext(contextName);
|
|
99
|
+
const resolvedUrl = mcpUrl
|
|
100
|
+
? normalizeMcpUrl(mcpUrl)
|
|
101
|
+
: await resolveServerUrl(undefined, target.name);
|
|
102
|
+
if (mcpUrl && !contextName) {
|
|
103
|
+
const matched = await findContextByMemoryUrl(resolvedUrl);
|
|
104
|
+
if (matched)
|
|
105
|
+
target = matched;
|
|
106
|
+
}
|
|
107
|
+
if (mcpUrl && !process.env.LOBU_API_TOKEN) {
|
|
108
|
+
const contextUrl = await resolveServerUrl(undefined, target.name);
|
|
109
|
+
const requestedBase = baseMcpUrl(resolvedUrl);
|
|
110
|
+
const contextBase = baseMcpUrl(contextUrl);
|
|
111
|
+
if (requestedBase !== contextBase) {
|
|
112
|
+
throw new Error(`Refusing to send stored context credentials for "${target.name}" to ${requestedBase}. Configure that context's memory URL or set LOBU_API_TOKEN explicitly.`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const token = await getToken(target.name);
|
|
116
|
+
if (!token)
|
|
117
|
+
return null;
|
|
118
|
+
const org = orgFromMcpUrl(resolvedUrl) ??
|
|
119
|
+
(await resolveOrg(undefined, undefined, target.name));
|
|
120
|
+
const sessionUrl = org && !orgFromMcpUrl(resolvedUrl)
|
|
121
|
+
? mcpUrlForOrg(resolvedUrl, org)
|
|
122
|
+
: resolvedUrl;
|
|
123
|
+
return {
|
|
124
|
+
token,
|
|
125
|
+
session: {
|
|
126
|
+
mcpUrl: sessionUrl,
|
|
127
|
+
org,
|
|
128
|
+
tokenType: "Bearer",
|
|
129
|
+
updatedAt: new Date().toISOString(),
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=openclaw-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-auth.js","sourceRoot":"","sources":["../../../../src/commands/memory/_lib/openclaw-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-auth.test.d.ts","sourceRoot":"","sources":["../../../../src/commands/memory/_lib/openclaw-auth.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import { getSessionForOrg } from "./openclaw-auth.js";
|
|
3
|
+
describe("memory auth URL resolution", () => {
|
|
4
|
+
test("getSessionForOrg honors an explicit --url", async () => {
|
|
5
|
+
const session = await getSessionForOrg("dev", undefined, "http://localhost:8801");
|
|
6
|
+
expect(session?.key).toBe("http://localhost:8801/mcp/dev");
|
|
7
|
+
});
|
|
8
|
+
});
|
|
9
|
+
//# sourceMappingURL=openclaw-auth.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-auth.test.js","sourceRoot":"","sources":["../../../../src/commands/memory/_lib/openclaw-auth.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACpC,KAAK,EACL,SAAS,EACT,uBAAuB,CACxB,CAAC;QACF,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface HealthOptions {
|
|
2
|
+
url?: string;
|
|
3
|
+
org?: string;
|
|
4
|
+
context?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function checkMemoryHealth(opts?: HealthOptions): Promise<void>;
|
|
7
|
+
export interface ConfigureOptions {
|
|
8
|
+
url?: string;
|
|
9
|
+
org?: string;
|
|
10
|
+
context?: string;
|
|
11
|
+
configPath?: string;
|
|
12
|
+
tokenCommand?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function configureMemoryPlugin(opts?: ConfigureOptions): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=openclaw-cmd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-cmd.d.ts","sourceRoot":"","sources":["../../../../src/commands/memory/_lib/openclaw-cmd.ts"],"names":[],"mappings":"AAqLA,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,iBAAiB,CACrC,IAAI,GAAE,aAAkB,GACvB,OAAO,CAAC,IAAI,CAAC,CAyCf;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,qBAAqB,CACzC,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,IAAI,CAAC,CA8Df"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { dirname, resolve } from "node:path";
|
|
4
|
+
import { ApiError, ValidationError } from "./errors.js";
|
|
5
|
+
import { getUsableToken, mcpUrlForOrg, normalizeMcpUrl, resolveOrg, resolveServerUrl, setActiveMcpUrl, setActiveOrg, } from "./openclaw-auth.js";
|
|
6
|
+
import { isJson, printJson, printText } from "./output.js";
|
|
7
|
+
const MCP_PROTOCOL_VERSION = "2025-03-26";
|
|
8
|
+
function isRecord(value) {
|
|
9
|
+
return typeof value === "object" && value !== null;
|
|
10
|
+
}
|
|
11
|
+
function extractErrorMessage(parsed, status, statusText) {
|
|
12
|
+
if (isRecord(parsed.error) && typeof parsed.error.message === "string") {
|
|
13
|
+
return parsed.error.message;
|
|
14
|
+
}
|
|
15
|
+
if (typeof parsed.error_description === "string") {
|
|
16
|
+
return parsed.error_description;
|
|
17
|
+
}
|
|
18
|
+
if (typeof parsed.error === "string")
|
|
19
|
+
return parsed.error;
|
|
20
|
+
return `HTTP ${status} ${statusText}`;
|
|
21
|
+
}
|
|
22
|
+
function parseJsonWithError(text, fallbackMessage) {
|
|
23
|
+
try {
|
|
24
|
+
return JSON.parse(text);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
throw new ApiError(fallbackMessage);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async function postJson(url, body, headers = {}) {
|
|
31
|
+
const res = await fetch(url, {
|
|
32
|
+
method: "POST",
|
|
33
|
+
headers: {
|
|
34
|
+
"Content-Type": "application/json",
|
|
35
|
+
...headers,
|
|
36
|
+
},
|
|
37
|
+
body: JSON.stringify(body),
|
|
38
|
+
});
|
|
39
|
+
const raw = await res.text();
|
|
40
|
+
const parsed = raw
|
|
41
|
+
? parseJsonWithError(raw, `Invalid JSON from ${url}`)
|
|
42
|
+
: {};
|
|
43
|
+
if (!res.ok) {
|
|
44
|
+
throw new ApiError(`Request failed: ${extractErrorMessage(parsed, res.status, res.statusText)}`, res.status);
|
|
45
|
+
}
|
|
46
|
+
return parsed;
|
|
47
|
+
}
|
|
48
|
+
async function initializeMcpSession(url, accessToken) {
|
|
49
|
+
const response = await fetch(url, {
|
|
50
|
+
method: "POST",
|
|
51
|
+
headers: {
|
|
52
|
+
"Content-Type": "application/json",
|
|
53
|
+
Authorization: `Bearer ${accessToken}`,
|
|
54
|
+
},
|
|
55
|
+
body: JSON.stringify({
|
|
56
|
+
jsonrpc: "2.0",
|
|
57
|
+
id: "__init__",
|
|
58
|
+
method: "initialize",
|
|
59
|
+
params: {
|
|
60
|
+
protocolVersion: MCP_PROTOCOL_VERSION,
|
|
61
|
+
capabilities: {},
|
|
62
|
+
clientInfo: { name: "lobu", version: "1.0.0" },
|
|
63
|
+
},
|
|
64
|
+
}),
|
|
65
|
+
});
|
|
66
|
+
const raw = await response.text();
|
|
67
|
+
const parsed = raw
|
|
68
|
+
? parseJsonWithError(raw, `Invalid JSON from ${url}`)
|
|
69
|
+
: {};
|
|
70
|
+
if (!response.ok) {
|
|
71
|
+
throw new ApiError(`Request failed: ${extractErrorMessage(parsed, response.status, response.statusText)}`, response.status);
|
|
72
|
+
}
|
|
73
|
+
const sessionId = response.headers.get("mcp-session-id");
|
|
74
|
+
if (!sessionId) {
|
|
75
|
+
throw new ApiError("MCP initialize did not return an mcp-session-id header");
|
|
76
|
+
}
|
|
77
|
+
await postJson(url, {
|
|
78
|
+
jsonrpc: "2.0",
|
|
79
|
+
method: "notifications/initialized",
|
|
80
|
+
}, {
|
|
81
|
+
Authorization: `Bearer ${accessToken}`,
|
|
82
|
+
"mcp-session-id": sessionId,
|
|
83
|
+
});
|
|
84
|
+
return sessionId;
|
|
85
|
+
}
|
|
86
|
+
async function resolveSessionAndUrl(urlFlag, orgFlag, context) {
|
|
87
|
+
const org = await resolveOrg(orgFlag, undefined, context);
|
|
88
|
+
const serverUrl = await resolveServerUrl(urlFlag, context);
|
|
89
|
+
if (!serverUrl) {
|
|
90
|
+
throw new ValidationError("Memory MCP URL could not be resolved.");
|
|
91
|
+
}
|
|
92
|
+
const mcpUrl = org ? mcpUrlForOrg(serverUrl, org) : serverUrl;
|
|
93
|
+
const result = await getUsableToken(mcpUrl, context);
|
|
94
|
+
if (!result) {
|
|
95
|
+
throw new ValidationError("Not logged in. Run: lobu login");
|
|
96
|
+
}
|
|
97
|
+
return { token: result.token, session: result.session, mcpUrl };
|
|
98
|
+
}
|
|
99
|
+
function readJsonObject(filePath) {
|
|
100
|
+
try {
|
|
101
|
+
const raw = readFileSync(filePath, "utf-8");
|
|
102
|
+
const parsed = JSON.parse(raw);
|
|
103
|
+
if (isRecord(parsed))
|
|
104
|
+
return parsed;
|
|
105
|
+
return {};
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return {};
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function writeJsonObject(filePath, payload) {
|
|
112
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
113
|
+
writeFileSync(filePath, `${JSON.stringify(payload, null, 2)}\n`);
|
|
114
|
+
}
|
|
115
|
+
function defaultTokenCommand(context) {
|
|
116
|
+
return context
|
|
117
|
+
? `lobu token --raw --context ${shellQuote(context)}`
|
|
118
|
+
: "lobu token --raw";
|
|
119
|
+
}
|
|
120
|
+
function shellQuote(value) {
|
|
121
|
+
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
122
|
+
}
|
|
123
|
+
export async function checkMemoryHealth(opts = {}) {
|
|
124
|
+
const { token: accessToken, session, mcpUrl: targetMcpUrl, } = await resolveSessionAndUrl(opts.url, opts.org, opts.context);
|
|
125
|
+
const org = await resolveOrg(opts.org, session, opts.context);
|
|
126
|
+
const sessionId = await initializeMcpSession(targetMcpUrl, accessToken);
|
|
127
|
+
const result = await postJson(targetMcpUrl, {
|
|
128
|
+
jsonrpc: "2.0",
|
|
129
|
+
id: 1,
|
|
130
|
+
method: "tools/list",
|
|
131
|
+
params: {},
|
|
132
|
+
}, {
|
|
133
|
+
Authorization: `Bearer ${accessToken}`,
|
|
134
|
+
"mcp-session-id": sessionId,
|
|
135
|
+
});
|
|
136
|
+
const toolsCount = Array.isArray(result.result?.tools)
|
|
137
|
+
? result.result?.tools.length
|
|
138
|
+
: 0;
|
|
139
|
+
if (isJson()) {
|
|
140
|
+
printJson({
|
|
141
|
+
ok: true,
|
|
142
|
+
mcpUrl: targetMcpUrl,
|
|
143
|
+
org: org || null,
|
|
144
|
+
toolsCount,
|
|
145
|
+
});
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
printText("ok: true");
|
|
149
|
+
printText(`mcpUrl: ${targetMcpUrl}`);
|
|
150
|
+
printText(`org: ${org || "(none)"}`);
|
|
151
|
+
printText(`tools: ${toolsCount}`);
|
|
152
|
+
}
|
|
153
|
+
export async function configureMemoryPlugin(opts = {}) {
|
|
154
|
+
const org = await resolveOrg(opts.org, undefined, opts.context);
|
|
155
|
+
const baseMcpUrl = await resolveServerUrl(opts.url, opts.context);
|
|
156
|
+
if (!baseMcpUrl) {
|
|
157
|
+
throw new ValidationError("Memory MCP URL could not be resolved.");
|
|
158
|
+
}
|
|
159
|
+
const resolvedMcpUrl = org
|
|
160
|
+
? mcpUrlForOrg(baseMcpUrl, org)
|
|
161
|
+
: normalizeMcpUrl(baseMcpUrl);
|
|
162
|
+
await setActiveMcpUrl(resolvedMcpUrl, opts.context);
|
|
163
|
+
if (org)
|
|
164
|
+
await setActiveOrg(org, opts.context);
|
|
165
|
+
const configPath = resolve(opts.configPath || resolve(homedir(), ".openclaw", "openclaw.json"));
|
|
166
|
+
const config = readJsonObject(configPath);
|
|
167
|
+
if (!isRecord(config.plugins)) {
|
|
168
|
+
config.plugins = {};
|
|
169
|
+
}
|
|
170
|
+
const plugins = config.plugins;
|
|
171
|
+
if (!isRecord(plugins.entries)) {
|
|
172
|
+
plugins.entries = {};
|
|
173
|
+
}
|
|
174
|
+
const entries = plugins.entries;
|
|
175
|
+
const pluginId = "openclaw-owletto";
|
|
176
|
+
const existingEntry = isRecord(entries[pluginId])
|
|
177
|
+
? entries[pluginId]
|
|
178
|
+
: {};
|
|
179
|
+
const existingConfig = isRecord(existingEntry.config)
|
|
180
|
+
? existingEntry.config
|
|
181
|
+
: {};
|
|
182
|
+
const tokenCommand = opts.tokenCommand || defaultTokenCommand(opts.context);
|
|
183
|
+
entries[pluginId] = {
|
|
184
|
+
...existingEntry,
|
|
185
|
+
enabled: true,
|
|
186
|
+
config: {
|
|
187
|
+
...existingConfig,
|
|
188
|
+
mcpUrl: resolvedMcpUrl,
|
|
189
|
+
tokenCommand,
|
|
190
|
+
},
|
|
191
|
+
};
|
|
192
|
+
writeJsonObject(configPath, config);
|
|
193
|
+
if (isJson()) {
|
|
194
|
+
printJson({
|
|
195
|
+
updated: true,
|
|
196
|
+
configPath,
|
|
197
|
+
pluginId,
|
|
198
|
+
mcpUrl: resolvedMcpUrl,
|
|
199
|
+
tokenCommand,
|
|
200
|
+
});
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
printText(`Updated ${configPath}`);
|
|
204
|
+
printText(`Plugin: ${pluginId}`);
|
|
205
|
+
printText(`mcpUrl: ${resolvedMcpUrl}`);
|
|
206
|
+
printText(`tokenCommand: ${tokenCommand}`);
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=openclaw-cmd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-cmd.js","sourceRoot":"","sources":["../../../../src/commands/memory/_lib/openclaw-cmd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../../src/commands/memory/_lib/output.ts"],"names":[],"mappings":"AAKA,wBAAgB,MAAM,YAErB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,QAEtC;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,QAErC;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,QAEzC"}
|