@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.
Files changed (65) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/LICENSE +21 -0
  3. package/README.md +160 -0
  4. package/dist/src/check-runner.d.ts +65 -0
  5. package/dist/src/check-runner.d.ts.map +1 -0
  6. package/dist/src/check-runner.js +40 -0
  7. package/dist/src/check-runner.js.map +1 -0
  8. package/dist/src/check-utils.d.ts +21 -0
  9. package/dist/src/check-utils.d.ts.map +1 -0
  10. package/dist/src/check-utils.js +39 -0
  11. package/dist/src/check-utils.js.map +1 -0
  12. package/dist/src/checks/anomaly-detection.d.ts +3 -0
  13. package/dist/src/checks/anomaly-detection.d.ts.map +1 -0
  14. package/dist/src/checks/anomaly-detection.js +127 -0
  15. package/dist/src/checks/anomaly-detection.js.map +1 -0
  16. package/dist/src/checks/bootstrap-integrity.d.ts +3 -0
  17. package/dist/src/checks/bootstrap-integrity.d.ts.map +1 -0
  18. package/dist/src/checks/bootstrap-integrity.js +107 -0
  19. package/dist/src/checks/bootstrap-integrity.js.map +1 -0
  20. package/dist/src/checks/goal-quality.d.ts +3 -0
  21. package/dist/src/checks/goal-quality.d.ts.map +1 -0
  22. package/dist/src/checks/goal-quality.js +143 -0
  23. package/dist/src/checks/goal-quality.js.map +1 -0
  24. package/dist/src/checks/pipeline-correlation.d.ts +7 -0
  25. package/dist/src/checks/pipeline-correlation.d.ts.map +1 -0
  26. package/dist/src/checks/pipeline-correlation.js +118 -0
  27. package/dist/src/checks/pipeline-correlation.js.map +1 -0
  28. package/dist/src/checks/recommendations.d.ts +3 -0
  29. package/dist/src/checks/recommendations.d.ts.map +1 -0
  30. package/dist/src/checks/recommendations.js +132 -0
  31. package/dist/src/checks/recommendations.js.map +1 -0
  32. package/dist/src/checks/thread-health.d.ts +3 -0
  33. package/dist/src/checks/thread-health.d.ts.map +1 -0
  34. package/dist/src/checks/thread-health.js +129 -0
  35. package/dist/src/checks/thread-health.js.map +1 -0
  36. package/dist/src/config.d.ts +10 -0
  37. package/dist/src/config.d.ts.map +1 -0
  38. package/dist/src/config.js +301 -0
  39. package/dist/src/config.js.map +1 -0
  40. package/dist/src/index.d.ts +27 -0
  41. package/dist/src/index.d.ts.map +1 -0
  42. package/dist/src/index.js +198 -0
  43. package/dist/src/index.js.map +1 -0
  44. package/dist/src/llm-client.d.ts +7 -0
  45. package/dist/src/llm-client.d.ts.map +1 -0
  46. package/dist/src/llm-client.js +111 -0
  47. package/dist/src/llm-client.js.map +1 -0
  48. package/dist/src/status-reader.d.ts +6 -0
  49. package/dist/src/status-reader.d.ts.map +1 -0
  50. package/dist/src/status-reader.js +156 -0
  51. package/dist/src/status-reader.js.map +1 -0
  52. package/dist/src/status-writer.d.ts +14 -0
  53. package/dist/src/status-writer.d.ts.map +1 -0
  54. package/dist/src/status-writer.js +52 -0
  55. package/dist/src/status-writer.js.map +1 -0
  56. package/dist/src/tool.d.ts +9 -0
  57. package/dist/src/tool.d.ts.map +1 -0
  58. package/dist/src/tool.js +129 -0
  59. package/dist/src/tool.js.map +1 -0
  60. package/dist/src/types.d.ts +261 -0
  61. package/dist/src/types.d.ts.map +1 -0
  62. package/dist/src/types.js +5 -0
  63. package/dist/src/types.js.map +1 -0
  64. package/openclaw.plugin.json +22 -0
  65. 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"}
@@ -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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"}