@vainplex/openclaw-leuko 0.1.0
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/CHANGELOG.md +25 -0
- package/LICENSE +21 -0
- package/README.md +160 -0
- package/dist/src/check-runner.d.ts +65 -0
- package/dist/src/check-runner.d.ts.map +1 -0
- package/dist/src/check-runner.js +40 -0
- package/dist/src/check-runner.js.map +1 -0
- package/dist/src/check-utils.d.ts +21 -0
- package/dist/src/check-utils.d.ts.map +1 -0
- package/dist/src/check-utils.js +39 -0
- package/dist/src/check-utils.js.map +1 -0
- package/dist/src/checks/anomaly-detection.d.ts +3 -0
- package/dist/src/checks/anomaly-detection.d.ts.map +1 -0
- package/dist/src/checks/anomaly-detection.js +127 -0
- package/dist/src/checks/anomaly-detection.js.map +1 -0
- package/dist/src/checks/bootstrap-integrity.d.ts +3 -0
- package/dist/src/checks/bootstrap-integrity.d.ts.map +1 -0
- package/dist/src/checks/bootstrap-integrity.js +107 -0
- package/dist/src/checks/bootstrap-integrity.js.map +1 -0
- package/dist/src/checks/goal-quality.d.ts +3 -0
- package/dist/src/checks/goal-quality.d.ts.map +1 -0
- package/dist/src/checks/goal-quality.js +143 -0
- package/dist/src/checks/goal-quality.js.map +1 -0
- package/dist/src/checks/pipeline-correlation.d.ts +7 -0
- package/dist/src/checks/pipeline-correlation.d.ts.map +1 -0
- package/dist/src/checks/pipeline-correlation.js +118 -0
- package/dist/src/checks/pipeline-correlation.js.map +1 -0
- package/dist/src/checks/recommendations.d.ts +3 -0
- package/dist/src/checks/recommendations.d.ts.map +1 -0
- package/dist/src/checks/recommendations.js +132 -0
- package/dist/src/checks/recommendations.js.map +1 -0
- package/dist/src/checks/thread-health.d.ts +3 -0
- package/dist/src/checks/thread-health.d.ts.map +1 -0
- package/dist/src/checks/thread-health.js +129 -0
- package/dist/src/checks/thread-health.js.map +1 -0
- package/dist/src/config.d.ts +10 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +301 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/index.d.ts +27 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +198 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/llm-client.d.ts +7 -0
- package/dist/src/llm-client.d.ts.map +1 -0
- package/dist/src/llm-client.js +111 -0
- package/dist/src/llm-client.js.map +1 -0
- package/dist/src/status-reader.d.ts +6 -0
- package/dist/src/status-reader.d.ts.map +1 -0
- package/dist/src/status-reader.js +156 -0
- package/dist/src/status-reader.js.map +1 -0
- package/dist/src/status-writer.d.ts +14 -0
- package/dist/src/status-writer.d.ts.map +1 -0
- package/dist/src/status-writer.js +52 -0
- package/dist/src/status-writer.js.map +1 -0
- package/dist/src/tool.d.ts +9 -0
- package/dist/src/tool.d.ts.map +1 -0
- package/dist/src/tool.js +129 -0
- package/dist/src/tool.js.map +1 -0
- package/dist/src/types.d.ts +261 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +5 -0
- package/dist/src/types.js.map +1 -0
- package/openclaw.plugin.json +22 -0
- package/package.json +51 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { request as httpRequest } from "node:http";
|
|
2
|
+
import { request as httpsRequest } from "node:https";
|
|
3
|
+
import { URL } from "node:url";
|
|
4
|
+
function buildEndpoint(baseUrl) {
|
|
5
|
+
const base = baseUrl.replace(/\/+$/, "");
|
|
6
|
+
return base.endsWith("/v1") ? `${base}/chat/completions` : `${base}/v1/chat/completions`;
|
|
7
|
+
}
|
|
8
|
+
function buildRequestBody(model, system, user) {
|
|
9
|
+
return JSON.stringify({
|
|
10
|
+
model,
|
|
11
|
+
messages: [{ role: "system", content: system }, { role: "user", content: user }],
|
|
12
|
+
temperature: 0.1,
|
|
13
|
+
max_tokens: 2048,
|
|
14
|
+
response_format: { type: "json_object" },
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
function parseCompletionResponse(data) {
|
|
18
|
+
const parsed = JSON.parse(data);
|
|
19
|
+
if (typeof parsed !== "object" || parsed === null) {
|
|
20
|
+
return { content: null, tokens: 0, error: "Invalid response structure" };
|
|
21
|
+
}
|
|
22
|
+
const obj = parsed;
|
|
23
|
+
const choices = obj["choices"];
|
|
24
|
+
if (!Array.isArray(choices) || choices.length === 0) {
|
|
25
|
+
return { content: null, tokens: 0, error: "Invalid response structure" };
|
|
26
|
+
}
|
|
27
|
+
const msg = choices[0]?.["message"];
|
|
28
|
+
const content = msg?.["content"];
|
|
29
|
+
const usage = obj["usage"];
|
|
30
|
+
const tokens = typeof usage?.["total_tokens"] === "number" ? usage["total_tokens"] : 0;
|
|
31
|
+
return { content: typeof content === "string" ? content : null, tokens };
|
|
32
|
+
}
|
|
33
|
+
function sendHttpRequest(config, systemPrompt, userPrompt, timeoutMs, logger) {
|
|
34
|
+
return new Promise((resolve) => {
|
|
35
|
+
const startMs = Date.now();
|
|
36
|
+
try {
|
|
37
|
+
const url = new URL(buildEndpoint(config.baseUrl));
|
|
38
|
+
const body = buildRequestBody(config.model, systemPrompt, userPrompt);
|
|
39
|
+
const headers = {
|
|
40
|
+
"Content-Type": "application/json",
|
|
41
|
+
"Content-Length": String(Buffer.byteLength(body)),
|
|
42
|
+
};
|
|
43
|
+
if (config.apiKey)
|
|
44
|
+
headers["Authorization"] = `Bearer ${config.apiKey}`;
|
|
45
|
+
const proto = url.protocol === "https:" ? httpsRequest : httpRequest;
|
|
46
|
+
const req = proto({
|
|
47
|
+
hostname: url.hostname,
|
|
48
|
+
port: url.port || (url.protocol === "https:" ? 443 : 80),
|
|
49
|
+
path: url.pathname,
|
|
50
|
+
method: "POST",
|
|
51
|
+
headers,
|
|
52
|
+
timeout: timeoutMs,
|
|
53
|
+
}, (res) => {
|
|
54
|
+
let data = "";
|
|
55
|
+
res.on("data", (chunk) => (data += chunk.toString()));
|
|
56
|
+
res.on("end", () => {
|
|
57
|
+
try {
|
|
58
|
+
resolve(parseCompletionResponse(data));
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
resolve({ content: null, tokens: 0, error: "Failed to parse LLM response JSON" });
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
req.on("error", (err) => {
|
|
66
|
+
logger.debug(`[leuko-llm] Request error: ${err.message}`);
|
|
67
|
+
resolve({ content: null, tokens: 0, error: err.message });
|
|
68
|
+
});
|
|
69
|
+
req.on("timeout", () => {
|
|
70
|
+
req.destroy();
|
|
71
|
+
const elapsed = Date.now() - startMs;
|
|
72
|
+
logger.debug(`[leuko-llm] Timeout after ${elapsed}ms`);
|
|
73
|
+
resolve({ content: null, tokens: 0, error: `Timeout after ${elapsed}ms` });
|
|
74
|
+
});
|
|
75
|
+
req.write(body);
|
|
76
|
+
req.end();
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
resolve({ content: null, tokens: 0, error: err instanceof Error ? err.message : String(err) });
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Creates an LlmClient that tries the primary provider first,
|
|
85
|
+
* then falls back to the fallback provider.
|
|
86
|
+
*/
|
|
87
|
+
export function createLlmClient(primary, fallback, logger) {
|
|
88
|
+
return {
|
|
89
|
+
async generate(systemPrompt, userPrompt, timeoutMs) {
|
|
90
|
+
const startMs = Date.now();
|
|
91
|
+
const prim = await sendHttpRequest(primary, systemPrompt, userPrompt, timeoutMs, logger);
|
|
92
|
+
if (prim.content !== null) {
|
|
93
|
+
return { content: prim.content, model: `${primary.provider}/${primary.model}`, tokens: prim.tokens, durationMs: Date.now() - startMs };
|
|
94
|
+
}
|
|
95
|
+
logger.warn(`[leuko-llm] Primary (${primary.provider}/${primary.model}) failed: ${prim.error ?? "unknown"} — trying fallback`);
|
|
96
|
+
const fb = await sendHttpRequest(fallback, systemPrompt, userPrompt, timeoutMs, logger);
|
|
97
|
+
if (fb.content !== null) {
|
|
98
|
+
return { content: fb.content, model: `${fallback.provider}/${fallback.model}`, tokens: fb.tokens, durationMs: Date.now() - startMs };
|
|
99
|
+
}
|
|
100
|
+
logger.warn(`[leuko-llm] Fallback (${fallback.provider}/${fallback.model}) also failed: ${fb.error ?? "unknown"}`);
|
|
101
|
+
return {
|
|
102
|
+
content: null,
|
|
103
|
+
model: `${primary.provider}/${primary.model}`,
|
|
104
|
+
tokens: 0,
|
|
105
|
+
durationMs: Date.now() - startMs,
|
|
106
|
+
error: `Both providers failed. Primary: ${prim.error ?? "unknown"}; Fallback: ${fb.error ?? "unknown"}`,
|
|
107
|
+
};
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=llm-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-client.js","sourceRoot":"","sources":["../../src/llm-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { LeukoStatus, PluginLogger, LeukoHistory } from "./types.js";
|
|
2
|
+
export declare function readStatusFile(path: string, logger?: PluginLogger): LeukoStatus | null;
|
|
3
|
+
export declare function readHistoryFile(path: string, logger?: PluginLogger): LeukoHistory | null;
|
|
4
|
+
export declare function readJsonInput<T>(path: string, logger?: PluginLogger): T | null;
|
|
5
|
+
export declare function readTextInput(path: string, maxChars?: number, logger?: PluginLogger): string | null;
|
|
6
|
+
//# sourceMappingURL=status-reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-reader.d.ts","sourceRoot":"","sources":["../../src/status-reader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EAMZ,YAAY,EAEb,MAAM,YAAY,CAAC;AAqFpB,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,WAAW,GAAG,IAAI,CAiBtF;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,YAAY,GAAG,IAAI,CA2BxF;AAED,wBAAgB,aAAa,CAAC,CAAC,EAC7B,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,YAAY,GACpB,CAAC,GAAG,IAAI,CAcV;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAa,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAczG"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
2
|
+
import { isRecord } from "./check-utils.js";
|
|
3
|
+
function parseSeverity(v) {
|
|
4
|
+
if (v === "ok" || v === "warn" || v === "critical")
|
|
5
|
+
return v;
|
|
6
|
+
return "ok";
|
|
7
|
+
}
|
|
8
|
+
function parseDaemonCheck(raw) {
|
|
9
|
+
if (!isRecord(raw))
|
|
10
|
+
return null;
|
|
11
|
+
return {
|
|
12
|
+
check_name: typeof raw["check_name"] === "string" ? raw["check_name"] : "",
|
|
13
|
+
severity: parseSeverity(raw["severity"]),
|
|
14
|
+
detail: typeof raw["detail"] === "string" ? raw["detail"] : "",
|
|
15
|
+
auto_healed: typeof raw["auto_healed"] === "boolean" ? raw["auto_healed"] : false,
|
|
16
|
+
timestamp: typeof raw["timestamp"] === "string" ? raw["timestamp"] : "",
|
|
17
|
+
heal_action: typeof raw["heal_action"] === "string" ? raw["heal_action"] : null,
|
|
18
|
+
heal_key: typeof raw["heal_key"] === "string" ? raw["heal_key"] : null,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function parseCognitiveCheck(raw) {
|
|
22
|
+
if (!isRecord(raw))
|
|
23
|
+
return null;
|
|
24
|
+
return {
|
|
25
|
+
check_name: typeof raw["check_name"] === "string" ? raw["check_name"] : "",
|
|
26
|
+
severity: parseSeverity(raw["severity"]),
|
|
27
|
+
detail: typeof raw["detail"] === "string" ? raw["detail"] : "",
|
|
28
|
+
findings: Array.isArray(raw["findings"]) ? raw["findings"] : undefined,
|
|
29
|
+
correlations: Array.isArray(raw["correlations"]) ? raw["correlations"] : undefined,
|
|
30
|
+
anomalies: Array.isArray(raw["anomalies"]) ? raw["anomalies"] : undefined,
|
|
31
|
+
baselines: isRecord(raw["baselines"]) ? raw["baselines"] : undefined,
|
|
32
|
+
recommendations: Array.isArray(raw["recommendations"]) ? raw["recommendations"] : undefined,
|
|
33
|
+
escalation_needed: typeof raw["escalation_needed"] === "boolean" ? raw["escalation_needed"] : undefined,
|
|
34
|
+
consecutive_critical_count: typeof raw["consecutive_critical_count"] === "number" ? raw["consecutive_critical_count"] : undefined,
|
|
35
|
+
first_critical_at: typeof raw["first_critical_at"] === "string" ? raw["first_critical_at"] : undefined,
|
|
36
|
+
timestamp: typeof raw["timestamp"] === "string" ? raw["timestamp"] : new Date().toISOString(),
|
|
37
|
+
model_used: typeof raw["model_used"] === "string" ? raw["model_used"] : undefined,
|
|
38
|
+
tokens_used: typeof raw["tokens_used"] === "number" ? raw["tokens_used"] : undefined,
|
|
39
|
+
duration_ms: typeof raw["duration_ms"] === "number" ? raw["duration_ms"] : 0,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function parseCognitiveMeta(raw) {
|
|
43
|
+
if (!isRecord(raw))
|
|
44
|
+
return undefined;
|
|
45
|
+
return {
|
|
46
|
+
last_run: typeof raw["last_run"] === "string" ? raw["last_run"] : "",
|
|
47
|
+
total_duration_ms: typeof raw["total_duration_ms"] === "number" ? raw["total_duration_ms"] : 0,
|
|
48
|
+
total_tokens: typeof raw["total_tokens"] === "number" ? raw["total_tokens"] : 0,
|
|
49
|
+
total_cost_usd: typeof raw["total_cost_usd"] === "number" ? raw["total_cost_usd"] : 0,
|
|
50
|
+
model: typeof raw["model"] === "string" ? raw["model"] : "",
|
|
51
|
+
checks_completed: typeof raw["checks_completed"] === "number" ? raw["checks_completed"] : 0,
|
|
52
|
+
checks_failed: typeof raw["checks_failed"] === "number" ? raw["checks_failed"] : 0,
|
|
53
|
+
plugin_version: typeof raw["plugin_version"] === "string" ? raw["plugin_version"] : "",
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function parseSitrepCollector(raw) {
|
|
57
|
+
if (!isRecord(raw))
|
|
58
|
+
return null;
|
|
59
|
+
return {
|
|
60
|
+
collector_name: typeof raw["collector_name"] === "string" ? raw["collector_name"] : "",
|
|
61
|
+
status: parseSeverity(raw["status"]),
|
|
62
|
+
items: Array.isArray(raw["items"]) ? raw["items"] : [],
|
|
63
|
+
summary: typeof raw["summary"] === "string" ? raw["summary"] : "",
|
|
64
|
+
duration_ms: typeof raw["duration_ms"] === "number" ? raw["duration_ms"] : 0,
|
|
65
|
+
timestamp: typeof raw["timestamp"] === "string" ? raw["timestamp"] : "",
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function parseFilteredArray(arr, parser) {
|
|
69
|
+
if (!Array.isArray(arr))
|
|
70
|
+
return undefined;
|
|
71
|
+
return arr.map(parser).filter((x) => x !== null);
|
|
72
|
+
}
|
|
73
|
+
function parseStatusObject(raw) {
|
|
74
|
+
return {
|
|
75
|
+
last_check: typeof raw["last_check"] === "string" ? raw["last_check"] : "",
|
|
76
|
+
overall_severity: parseSeverity(raw["overall_severity"]),
|
|
77
|
+
daemon_checks: parseFilteredArray(raw["daemon_checks"], parseDaemonCheck) ?? [],
|
|
78
|
+
auto_heal_history: Array.isArray(raw["auto_heal_history"]) ? raw["auto_heal_history"] : undefined,
|
|
79
|
+
cognitive_checks: parseFilteredArray(raw["cognitive_checks"], parseCognitiveCheck),
|
|
80
|
+
cognitive_meta: parseCognitiveMeta(raw["cognitive_meta"]),
|
|
81
|
+
sitrep_collectors: parseFilteredArray(raw["sitrep_collectors"], parseSitrepCollector),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export function readStatusFile(path, logger) {
|
|
85
|
+
try {
|
|
86
|
+
if (!existsSync(path)) {
|
|
87
|
+
logger?.debug(`[leuko] Status file not found: ${path}`);
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
const content = readFileSync(path, "utf-8");
|
|
91
|
+
const raw = JSON.parse(content);
|
|
92
|
+
if (!isRecord(raw)) {
|
|
93
|
+
logger?.warn(`[leuko] Status file is not an object: ${path}`);
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
return parseStatusObject(raw);
|
|
97
|
+
}
|
|
98
|
+
catch (e) {
|
|
99
|
+
logger?.warn(`[leuko] Failed to read status file: ${e instanceof Error ? e.message : String(e)}`);
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
export function readHistoryFile(path, logger) {
|
|
104
|
+
try {
|
|
105
|
+
if (!existsSync(path))
|
|
106
|
+
return null;
|
|
107
|
+
const content = readFileSync(path, "utf-8");
|
|
108
|
+
const raw = JSON.parse(content);
|
|
109
|
+
if (!isRecord(raw))
|
|
110
|
+
return null;
|
|
111
|
+
const snapshots = Array.isArray(raw["snapshots"])
|
|
112
|
+
? raw["snapshots"]
|
|
113
|
+
.filter(isRecord)
|
|
114
|
+
.map((s) => ({
|
|
115
|
+
timestamp: typeof s["timestamp"] === "string" ? s["timestamp"] : "",
|
|
116
|
+
metrics: isRecord(s["metrics"])
|
|
117
|
+
? Object.fromEntries(Object.entries(s["metrics"]).filter((kv) => typeof kv[1] === "number"))
|
|
118
|
+
: {},
|
|
119
|
+
}))
|
|
120
|
+
: [];
|
|
121
|
+
return { snapshots };
|
|
122
|
+
}
|
|
123
|
+
catch (e) {
|
|
124
|
+
logger?.debug(`[leuko] Failed to read history file: ${e instanceof Error ? e.message : String(e)}`);
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
export function readJsonInput(path, logger) {
|
|
129
|
+
try {
|
|
130
|
+
if (!existsSync(path)) {
|
|
131
|
+
logger?.debug(`[leuko] Input file not found: ${path}`);
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
const content = readFileSync(path, "utf-8");
|
|
135
|
+
return JSON.parse(content);
|
|
136
|
+
}
|
|
137
|
+
catch (e) {
|
|
138
|
+
logger?.warn(`[leuko] Failed to read input: ${e instanceof Error ? e.message : String(e)}`);
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
export function readTextInput(path, maxChars = 4000, logger) {
|
|
143
|
+
try {
|
|
144
|
+
if (!existsSync(path)) {
|
|
145
|
+
logger?.debug(`[leuko] Input file not found: ${path}`);
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
const content = readFileSync(path, "utf-8");
|
|
149
|
+
return content.substring(0, maxChars);
|
|
150
|
+
}
|
|
151
|
+
catch (e) {
|
|
152
|
+
logger?.warn(`[leuko] Failed to read text input: ${e instanceof Error ? e.message : String(e)}`);
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=status-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-reader.js","sourceRoot":"","sources":["../../src/status-reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CognitiveCheckResult, CognitiveMeta, SitrepCollectorResult, PluginLogger } from "./types.js";
|
|
2
|
+
export interface WritePayload {
|
|
3
|
+
cognitive_checks: CognitiveCheckResult[];
|
|
4
|
+
cognitive_meta: CognitiveMeta;
|
|
5
|
+
sitrep_collectors?: SitrepCollectorResult[];
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Atomic write of cognitive check results to leuko-status.json.
|
|
9
|
+
*
|
|
10
|
+
* Preserves daemon_checks and auto_heal_history (L1 fields).
|
|
11
|
+
* Uses write-to-tmp-then-rename for atomicity.
|
|
12
|
+
*/
|
|
13
|
+
export declare function writeCognitiveResults(statusPath: string, payload: WritePayload, logger?: PluginLogger): boolean;
|
|
14
|
+
//# sourceMappingURL=status-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-writer.d.ts","sourceRoot":"","sources":["../../src/status-writer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,qBAAqB,EACrB,YAAY,EACb,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,YAAY;IAC3B,gBAAgB,EAAE,oBAAoB,EAAE,CAAC;IACzC,cAAc,EAAE,aAAa,CAAC;IAC9B,iBAAiB,CAAC,EAAE,qBAAqB,EAAE,CAAC;CAC7C;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,YAAY,EACrB,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CA8CT"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, renameSync, existsSync } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { isRecord } from "./check-utils.js";
|
|
4
|
+
/**
|
|
5
|
+
* Atomic write of cognitive check results to leuko-status.json.
|
|
6
|
+
*
|
|
7
|
+
* Preserves daemon_checks and auto_heal_history (L1 fields).
|
|
8
|
+
* Uses write-to-tmp-then-rename for atomicity.
|
|
9
|
+
*/
|
|
10
|
+
export function writeCognitiveResults(statusPath, payload, logger) {
|
|
11
|
+
try {
|
|
12
|
+
// Read existing status to preserve daemon fields
|
|
13
|
+
let existing = {};
|
|
14
|
+
if (existsSync(statusPath)) {
|
|
15
|
+
try {
|
|
16
|
+
const content = readFileSync(statusPath, "utf-8");
|
|
17
|
+
const parsed = JSON.parse(content);
|
|
18
|
+
if (isRecord(parsed)) {
|
|
19
|
+
existing = parsed;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
logger?.warn("[leuko] Could not read existing status file — will overwrite cognitive fields only");
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// Merge: preserve daemon fields, replace cognitive fields
|
|
27
|
+
const merged = {
|
|
28
|
+
...existing,
|
|
29
|
+
cognitive_checks: payload.cognitive_checks,
|
|
30
|
+
cognitive_meta: payload.cognitive_meta,
|
|
31
|
+
};
|
|
32
|
+
if (payload.sitrep_collectors) {
|
|
33
|
+
merged["sitrep_collectors"] = payload.sitrep_collectors;
|
|
34
|
+
}
|
|
35
|
+
// Atomic write via temp file
|
|
36
|
+
const tmpPath = statusPath + ".l2tmp";
|
|
37
|
+
const dir = dirname(statusPath);
|
|
38
|
+
if (!existsSync(dir)) {
|
|
39
|
+
logger?.warn(`[leuko] Status directory does not exist: ${dir}`);
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
writeFileSync(tmpPath, JSON.stringify(merged, null, 2) + "\n", "utf-8");
|
|
43
|
+
renameSync(tmpPath, statusPath);
|
|
44
|
+
logger?.info(`[leuko] Wrote ${payload.cognitive_checks.length} cognitive checks to ${statusPath}`);
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
catch (e) {
|
|
48
|
+
logger?.error(`[leuko] Failed to write status: ${e instanceof Error ? e.message : String(e)}`);
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=status-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-writer.js","sourceRoot":"","sources":["../../src/status-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAQ5C;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,UAAkB,EAClB,OAAqB,EACrB,MAAqB;IAErB,IAAI,CAAC;QACH,iDAAiD;QACjD,IAAI,QAAQ,GAA4B,EAAE,CAAC;QAC3C,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBAClD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC5C,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBACrB,QAAQ,GAAG,MAAM,CAAC;gBACpB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,EAAE,IAAI,CAAC,oFAAoF,CAAC,CAAC;YACrG,CAAC;QACH,CAAC;QAED,0DAA0D;QAC1D,MAAM,MAAM,GAA4B;YACtC,GAAG,QAAQ;YACX,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,cAAc,EAAE,OAAO,CAAC,cAAc;SACvC,CAAC;QAEF,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAC9B,MAAM,CAAC,mBAAmB,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC;QAC1D,CAAC;QAED,6BAA6B;QAC7B,MAAM,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;QACtC,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QAChC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,EAAE,IAAI,CAAC,4CAA4C,GAAG,EAAE,CAAC,CAAC;YAChE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;QACxE,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAEhC,MAAM,EAAE,IAAI,CAAC,iBAAiB,OAAO,CAAC,gBAAgB,CAAC,MAAM,wBAAwB,UAAU,EAAE,CAAC,CAAC;QACnG,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,EAAE,KAAK,CACX,mCAAmC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAChF,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { PluginApi, LeukoConfig, LeukoStatus, ToolResult } from "./types.js";
|
|
2
|
+
interface ToolParams {
|
|
3
|
+
section?: string;
|
|
4
|
+
severity_filter?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function formatToolResponse(status: LeukoStatus | null, params: ToolParams): ToolResult;
|
|
7
|
+
export declare function registerLeukoTool(api: PluginApi, config: LeukoConfig): void;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,WAAW,EAEX,UAAU,EACX,MAAM,YAAY,CAAC;AAGpB,UAAU,UAAU;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAmGD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,EAAE,MAAM,EAAE,UAAU,GAAG,UAAU,CAO7F;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CA2B3E"}
|
package/dist/src/tool.js
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { readStatusFile } from "./status-reader.js";
|
|
2
|
+
function computeOverallSeverity(status) {
|
|
3
|
+
const all = [
|
|
4
|
+
...status.daemon_checks.map((c) => c.severity),
|
|
5
|
+
...(status.cognitive_checks ?? []).map((c) => c.severity),
|
|
6
|
+
];
|
|
7
|
+
if (all.includes("critical"))
|
|
8
|
+
return "critical";
|
|
9
|
+
if (all.includes("warn"))
|
|
10
|
+
return "warn";
|
|
11
|
+
return "ok";
|
|
12
|
+
}
|
|
13
|
+
function countBySeverity(checks) {
|
|
14
|
+
let ok = 0, warn = 0, critical = 0;
|
|
15
|
+
for (const c of checks) {
|
|
16
|
+
if (c.severity === "ok")
|
|
17
|
+
ok++;
|
|
18
|
+
else if (c.severity === "warn")
|
|
19
|
+
warn++;
|
|
20
|
+
else if (c.severity === "critical")
|
|
21
|
+
critical++;
|
|
22
|
+
}
|
|
23
|
+
return { total: checks.length, ok, warn, critical };
|
|
24
|
+
}
|
|
25
|
+
function filterBySeverity(items, filter) {
|
|
26
|
+
if (!filter || filter === "all")
|
|
27
|
+
return items;
|
|
28
|
+
if (filter === "critical")
|
|
29
|
+
return items.filter((i) => i.severity === "critical");
|
|
30
|
+
if (filter === "warn")
|
|
31
|
+
return items.filter((i) => i.severity !== "ok");
|
|
32
|
+
return items;
|
|
33
|
+
}
|
|
34
|
+
function getTopIssues(status) {
|
|
35
|
+
const issues = [];
|
|
36
|
+
for (const c of status.daemon_checks) {
|
|
37
|
+
if (c.severity !== "ok")
|
|
38
|
+
issues.push({ source: c.check_name, severity: c.severity, detail: c.detail });
|
|
39
|
+
}
|
|
40
|
+
for (const c of status.cognitive_checks ?? []) {
|
|
41
|
+
if (c.severity !== "ok")
|
|
42
|
+
issues.push({ source: c.check_name, severity: c.severity, detail: c.detail });
|
|
43
|
+
}
|
|
44
|
+
const order = { critical: 0, warn: 1, ok: 2 };
|
|
45
|
+
issues.sort((a, b) => order[a.severity] - order[b.severity]);
|
|
46
|
+
return issues.slice(0, 10);
|
|
47
|
+
}
|
|
48
|
+
function formatSummary(status) {
|
|
49
|
+
return {
|
|
50
|
+
overall: computeOverallSeverity(status),
|
|
51
|
+
daemon_summary: countBySeverity(status.daemon_checks),
|
|
52
|
+
cognitive_summary: countBySeverity(status.cognitive_checks ?? []),
|
|
53
|
+
top_issues: getTopIssues(status),
|
|
54
|
+
recommendations: (status.cognitive_checks ?? [])
|
|
55
|
+
.filter((c) => c.check_name === "cognitive:recommendations")
|
|
56
|
+
.flatMap((c) => c.recommendations ?? []).length,
|
|
57
|
+
last_l1_run: status.last_check,
|
|
58
|
+
last_l2_run: status.cognitive_meta?.last_run ?? null,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function handleSummary(status) {
|
|
62
|
+
return formatSummary(status);
|
|
63
|
+
}
|
|
64
|
+
function handleDaemon(status, filter) {
|
|
65
|
+
return { daemon_checks: filterBySeverity(status.daemon_checks, filter), last_check: status.last_check };
|
|
66
|
+
}
|
|
67
|
+
function handleCognitive(status, filter) {
|
|
68
|
+
return { cognitive_checks: filterBySeverity(status.cognitive_checks ?? [], filter), cognitive_meta: status.cognitive_meta };
|
|
69
|
+
}
|
|
70
|
+
function handleRecommendations(status) {
|
|
71
|
+
return {
|
|
72
|
+
recommendations: (status.cognitive_checks ?? [])
|
|
73
|
+
.filter((c) => c.check_name === "cognitive:recommendations")
|
|
74
|
+
.flatMap((c) => c.recommendations ?? []),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
function handleAll(status, filter) {
|
|
78
|
+
return {
|
|
79
|
+
...formatSummary(status),
|
|
80
|
+
daemon_checks: filterBySeverity(status.daemon_checks, filter),
|
|
81
|
+
cognitive_checks: filterBySeverity(status.cognitive_checks ?? [], filter),
|
|
82
|
+
sitrep_collectors: status.sitrep_collectors,
|
|
83
|
+
cognitive_meta: status.cognitive_meta,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
const sectionHandlers = {
|
|
87
|
+
summary: (s) => handleSummary(s),
|
|
88
|
+
daemon: (s, f) => handleDaemon(s, f),
|
|
89
|
+
cognitive: (s, f) => handleCognitive(s, f),
|
|
90
|
+
recommendations: (s) => handleRecommendations(s),
|
|
91
|
+
all: (s, f) => handleAll(s, f),
|
|
92
|
+
};
|
|
93
|
+
export function formatToolResponse(status, params) {
|
|
94
|
+
if (!status) {
|
|
95
|
+
return { content: [{ type: "text", text: JSON.stringify({ error: "Status file not available" }) }] };
|
|
96
|
+
}
|
|
97
|
+
const handler = sectionHandlers[params.section ?? "summary"] ?? sectionHandlers["summary"];
|
|
98
|
+
const result = handler(status, params.severity_filter);
|
|
99
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
100
|
+
}
|
|
101
|
+
export function registerLeukoTool(api, config) {
|
|
102
|
+
api.registerTool({
|
|
103
|
+
name: "leuko_status",
|
|
104
|
+
description: "Get current system health status from Leuko (L1 heuristic + L2 cognitive checks)",
|
|
105
|
+
parameters: {
|
|
106
|
+
type: "object",
|
|
107
|
+
properties: {
|
|
108
|
+
section: {
|
|
109
|
+
type: "string",
|
|
110
|
+
enum: ["all", "daemon", "cognitive", "summary", "recommendations"],
|
|
111
|
+
description: "Which section of health data to return (default: summary)",
|
|
112
|
+
},
|
|
113
|
+
severity_filter: {
|
|
114
|
+
type: "string",
|
|
115
|
+
enum: ["all", "warn", "critical"],
|
|
116
|
+
description: "Filter results by minimum severity (default: all)",
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
execute: async (_toolCallId, params) => {
|
|
121
|
+
const status = readStatusFile(config.statusPath, api.logger);
|
|
122
|
+
return formatToolResponse(status, {
|
|
123
|
+
section: typeof params["section"] === "string" ? params["section"] : undefined,
|
|
124
|
+
severity_filter: typeof params["severity_filter"] === "string" ? params["severity_filter"] : undefined,
|
|
125
|
+
});
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/tool.ts"],"names":[],"mappings":"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"}
|