@elvatis_com/elvatis-mcp 0.2.0 → 0.4.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 (42) hide show
  1. package/dist/index.js +20 -0
  2. package/dist/index.js.map +1 -1
  3. package/dist/spawn.d.ts +1 -1
  4. package/dist/spawn.d.ts.map +1 -1
  5. package/dist/spawn.js +67 -3
  6. package/dist/spawn.js.map +1 -1
  7. package/dist/ssh.d.ts.map +1 -1
  8. package/dist/ssh.js +2 -1
  9. package/dist/ssh.js.map +1 -1
  10. package/dist/tools/cron-manage.d.ts +160 -0
  11. package/dist/tools/cron-manage.d.ts.map +1 -0
  12. package/dist/tools/cron-manage.js +152 -0
  13. package/dist/tools/cron-manage.js.map +1 -0
  14. package/dist/tools/file-transfer.d.ts +69 -0
  15. package/dist/tools/file-transfer.d.ts.map +1 -0
  16. package/dist/tools/file-transfer.js +131 -0
  17. package/dist/tools/file-transfer.js.map +1 -0
  18. package/dist/tools/home-automation.d.ts +50 -0
  19. package/dist/tools/home-automation.d.ts.map +1 -0
  20. package/dist/tools/home-automation.js +72 -0
  21. package/dist/tools/home-automation.js.map +1 -0
  22. package/dist/tools/local-llm-models.d.ts +81 -0
  23. package/dist/tools/local-llm-models.d.ts.map +1 -0
  24. package/dist/tools/local-llm-models.js +95 -0
  25. package/dist/tools/local-llm-models.js.map +1 -0
  26. package/dist/tools/local-llm.d.ts +2 -2
  27. package/dist/tools/notify.d.ts +51 -0
  28. package/dist/tools/notify.d.ts.map +1 -0
  29. package/dist/tools/notify.js +69 -0
  30. package/dist/tools/notify.js.map +1 -0
  31. package/dist/tools/openclaw-logs.d.ts +42 -0
  32. package/dist/tools/openclaw-logs.d.ts.map +1 -0
  33. package/dist/tools/openclaw-logs.js +71 -0
  34. package/dist/tools/openclaw-logs.js.map +1 -0
  35. package/dist/tools/routing-rules.d.ts.map +1 -1
  36. package/dist/tools/routing-rules.js +2 -1
  37. package/dist/tools/routing-rules.js.map +1 -1
  38. package/dist/tools/system-status.d.ts +21 -0
  39. package/dist/tools/system-status.d.ts.map +1 -0
  40. package/dist/tools/system-status.js +84 -0
  41. package/dist/tools/system-status.js.map +1 -0
  42. package/package.json +1 -1
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ /**
3
+ * file_transfer — upload/download files between local machine and OpenClaw server.
4
+ *
5
+ * Uses SSH (cat + base64) for transfer. No scp/sftp dependency needed.
6
+ * Files are base64-encoded to survive shell escaping.
7
+ *
8
+ * Size limit: ~10MB per transfer (base64 overhead + SSH buffer limits).
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.fileTransferSchema = void 0;
45
+ exports.handleFileTransfer = handleFileTransfer;
46
+ const zod_1 = require("zod");
47
+ const fs = __importStar(require("fs"));
48
+ const path = __importStar(require("path"));
49
+ const ssh_js_1 = require("../ssh.js");
50
+ exports.fileTransferSchema = zod_1.z.object({
51
+ action: zod_1.z.enum(['upload', 'download', 'list']).describe('"upload": local -> server, "download": server -> local, "list": list files in a server directory.'),
52
+ remote_path: zod_1.z.string().describe('Path on the OpenClaw server (e.g. "~/scripts/backup.sh" or "~/.openclaw/workspace/trading/").'),
53
+ local_path: zod_1.z.string().optional().describe('Path on the local machine. Required for upload (source) and download (destination). '
54
+ + 'For download, if omitted, file content is returned in the response instead of saved to disk.'),
55
+ });
56
+ function toSshCfg(config) {
57
+ return { host: config.sshHost, port: config.sshPort, username: config.sshUser, keyPath: config.sshKeyPath };
58
+ }
59
+ const MAX_SIZE = 10 * 1024 * 1024; // 10MB
60
+ async function handleFileTransfer(args, config) {
61
+ const cfg = toSshCfg(config);
62
+ switch (args.action) {
63
+ case 'list': {
64
+ const output = await (0, ssh_js_1.sshExec)(cfg, `ls -lah '${args.remote_path.replace(/'/g, "'\\''")}' 2>/dev/null || echo "(directory not found: ${args.remote_path})"`, 10000);
65
+ return { success: true, path: args.remote_path, listing: output.trim() };
66
+ }
67
+ case 'download': {
68
+ // Get file size first
69
+ const sizeOut = await (0, ssh_js_1.sshExec)(cfg, `stat -c%s '${args.remote_path.replace(/'/g, "'\\''")}' 2>/dev/null || echo -1`, 5000);
70
+ const size = parseInt(sizeOut.trim(), 10);
71
+ if (size < 0) {
72
+ return { success: false, error: `File not found: ${args.remote_path}` };
73
+ }
74
+ if (size > MAX_SIZE) {
75
+ return { success: false, error: `File too large (${(size / 1024 / 1024).toFixed(1)}MB). Max is 10MB.` };
76
+ }
77
+ // Read file as base64
78
+ const b64 = await (0, ssh_js_1.sshExec)(cfg, `base64 '${args.remote_path.replace(/'/g, "'\\''")}'`, 30000);
79
+ const content = Buffer.from(b64.trim(), 'base64');
80
+ if (args.local_path) {
81
+ // Save to local disk
82
+ const dir = path.dirname(args.local_path);
83
+ if (!fs.existsSync(dir))
84
+ fs.mkdirSync(dir, { recursive: true });
85
+ fs.writeFileSync(args.local_path, content);
86
+ return {
87
+ success: true,
88
+ action: 'download',
89
+ remote_path: args.remote_path,
90
+ local_path: args.local_path,
91
+ size_bytes: content.length,
92
+ };
93
+ }
94
+ // Return content as text (for small text files)
95
+ const text = content.toString('utf-8');
96
+ return {
97
+ success: true,
98
+ action: 'download',
99
+ remote_path: args.remote_path,
100
+ size_bytes: content.length,
101
+ content: text.length < 50000 ? text : text.substring(0, 50000) + '\n... (truncated)',
102
+ };
103
+ }
104
+ case 'upload': {
105
+ if (!args.local_path) {
106
+ return { success: false, error: '"local_path" is required for upload.' };
107
+ }
108
+ if (!fs.existsSync(args.local_path)) {
109
+ return { success: false, error: `Local file not found: ${args.local_path}` };
110
+ }
111
+ const stat = fs.statSync(args.local_path);
112
+ if (stat.size > MAX_SIZE) {
113
+ return { success: false, error: `File too large (${(stat.size / 1024 / 1024).toFixed(1)}MB). Max is 10MB.` };
114
+ }
115
+ const content = fs.readFileSync(args.local_path);
116
+ const b64 = content.toString('base64');
117
+ const remoteDir = args.remote_path.replace(/\/[^/]+$/, '');
118
+ await (0, ssh_js_1.sshExec)(cfg, `mkdir -p '${remoteDir.replace(/'/g, "'\\''")}' && echo '${b64}' | base64 -d > '${args.remote_path.replace(/'/g, "'\\''")}'`, 30000);
119
+ return {
120
+ success: true,
121
+ action: 'upload',
122
+ local_path: args.local_path,
123
+ remote_path: args.remote_path,
124
+ size_bytes: stat.size,
125
+ };
126
+ }
127
+ default:
128
+ return { success: false, error: `Unknown action: ${args.action}` };
129
+ }
130
+ }
131
+ //# sourceMappingURL=file-transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-transfer.js","sourceRoot":"","sources":["../../src/tools/file-transfer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * home_automation — list, trigger, and toggle Home Assistant automations.
3
+ *
4
+ * Uses the HA REST API to manage automations without editing YAML.
5
+ * Creating new automations is complex (requires HA YAML knowledge),
6
+ * so this tool focuses on listing, triggering, and enabling/disabling.
7
+ */
8
+ import { z } from 'zod';
9
+ import { Config } from '../config.js';
10
+ export declare const homeAutomationSchema: z.ZodObject<{
11
+ action: z.ZodEnum<["list", "trigger", "enable", "disable"]>;
12
+ entity_id: z.ZodOptional<z.ZodString>;
13
+ }, "strip", z.ZodTypeAny, {
14
+ action: "trigger" | "list" | "enable" | "disable";
15
+ entity_id?: string | undefined;
16
+ }, {
17
+ action: "trigger" | "list" | "enable" | "disable";
18
+ entity_id?: string | undefined;
19
+ }>;
20
+ export declare function handleHomeAutomation(args: {
21
+ action: string;
22
+ entity_id?: string;
23
+ }, config: Config): Promise<{
24
+ success: boolean;
25
+ count: number;
26
+ automations: {
27
+ entity_id: string;
28
+ name: string;
29
+ state: string;
30
+ last_triggered: string;
31
+ }[];
32
+ error?: undefined;
33
+ action?: undefined;
34
+ entity_id?: undefined;
35
+ } | {
36
+ success: boolean;
37
+ error: string;
38
+ count?: undefined;
39
+ automations?: undefined;
40
+ action?: undefined;
41
+ entity_id?: undefined;
42
+ } | {
43
+ success: boolean;
44
+ action: string;
45
+ entity_id: string;
46
+ count?: undefined;
47
+ automations?: undefined;
48
+ error?: undefined;
49
+ }>;
50
+ //# sourceMappingURL=home-automation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"home-automation.d.ts","sourceRoot":"","sources":["../../src/tools/home-automation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,eAAO,MAAM,oBAAoB;;;;;;;;;EAQ/B,CAAC;AA+BH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAC5C,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;GA2Cf"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ /**
3
+ * home_automation — list, trigger, and toggle Home Assistant automations.
4
+ *
5
+ * Uses the HA REST API to manage automations without editing YAML.
6
+ * Creating new automations is complex (requires HA YAML knowledge),
7
+ * so this tool focuses on listing, triggering, and enabling/disabling.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.homeAutomationSchema = void 0;
11
+ exports.handleHomeAutomation = handleHomeAutomation;
12
+ const zod_1 = require("zod");
13
+ exports.homeAutomationSchema = zod_1.z.object({
14
+ action: zod_1.z.enum(['list', 'trigger', 'enable', 'disable']).describe('Action: "list" shows all automations, "trigger" fires one immediately, '
15
+ + '"enable"/"disable" toggles an automation on or off.'),
16
+ entity_id: zod_1.z.string().optional().describe('Automation entity ID (e.g. "automation.lights_off_at_night"). Required for trigger/enable/disable.'),
17
+ });
18
+ async function haRequest(config, method, path, body) {
19
+ if (!config.haToken)
20
+ throw new Error('HA_TOKEN not configured');
21
+ const res = await fetch(`${config.haUrl}${path}`, {
22
+ method,
23
+ headers: {
24
+ Authorization: `Bearer ${config.haToken}`,
25
+ 'Content-Type': 'application/json',
26
+ },
27
+ body: body ? JSON.stringify(body) : undefined,
28
+ signal: AbortSignal.timeout(10000),
29
+ });
30
+ if (!res.ok) {
31
+ const text = await res.text().catch(() => '');
32
+ throw new Error(`HA API ${res.status}: ${text.substring(0, 300)}`);
33
+ }
34
+ return res.json();
35
+ }
36
+ async function handleHomeAutomation(args, config) {
37
+ if (args.action === 'list') {
38
+ const states = await haRequest(config, 'GET', '/api/states');
39
+ const automations = states
40
+ .filter(s => s.entity_id.startsWith('automation.'))
41
+ .map(s => ({
42
+ entity_id: s.entity_id,
43
+ name: s.attributes.friendly_name ?? s.entity_id,
44
+ state: s.state, // 'on' = enabled, 'off' = disabled
45
+ last_triggered: s.attributes.last_triggered ?? 'never',
46
+ }));
47
+ return {
48
+ success: true,
49
+ count: automations.length,
50
+ automations,
51
+ };
52
+ }
53
+ // All other actions require entity_id
54
+ if (!args.entity_id) {
55
+ return { success: false, error: '"entity_id" is required for trigger/enable/disable.' };
56
+ }
57
+ const id = args.entity_id;
58
+ switch (args.action) {
59
+ case 'trigger':
60
+ await haRequest(config, 'POST', '/api/services/automation/trigger', { entity_id: id });
61
+ return { success: true, action: 'trigger', entity_id: id };
62
+ case 'enable':
63
+ await haRequest(config, 'POST', '/api/services/automation/turn_on', { entity_id: id });
64
+ return { success: true, action: 'enable', entity_id: id };
65
+ case 'disable':
66
+ await haRequest(config, 'POST', '/api/services/automation/turn_off', { entity_id: id });
67
+ return { success: true, action: 'disable', entity_id: id };
68
+ default:
69
+ return { success: false, error: `Unknown action: ${args.action}` };
70
+ }
71
+ }
72
+ //# sourceMappingURL=home-automation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"home-automation.js","sourceRoot":"","sources":["../../src/tools/home-automation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * local_llm_models — list and manage models on the local LLM server.
3
+ *
4
+ * Works with any OpenAI-compatible server that exposes GET /v1/models.
5
+ * LM Studio also supports POST /v1/models/load and POST /v1/models/unload
6
+ * for switching models without opening the GUI.
7
+ */
8
+ import { z } from 'zod';
9
+ import { Config } from '../config.js';
10
+ export declare const localLlmModelsSchema: z.ZodObject<{
11
+ action: z.ZodDefault<z.ZodEnum<["list", "load", "unload"]>>;
12
+ model: z.ZodOptional<z.ZodString>;
13
+ endpoint: z.ZodOptional<z.ZodString>;
14
+ }, "strip", z.ZodTypeAny, {
15
+ action: "list" | "load" | "unload";
16
+ model?: string | undefined;
17
+ endpoint?: string | undefined;
18
+ }, {
19
+ action?: "list" | "load" | "unload" | undefined;
20
+ model?: string | undefined;
21
+ endpoint?: string | undefined;
22
+ }>;
23
+ export declare function handleLocalLlmModels(args: {
24
+ action: string;
25
+ model?: string;
26
+ endpoint?: string;
27
+ }, config: Config): Promise<{
28
+ success: boolean;
29
+ error: string;
30
+ hint: string;
31
+ detail: string;
32
+ endpoint?: undefined;
33
+ count?: undefined;
34
+ models?: undefined;
35
+ action?: undefined;
36
+ model?: undefined;
37
+ } | {
38
+ success: boolean;
39
+ error: string;
40
+ hint?: undefined;
41
+ detail?: undefined;
42
+ endpoint?: undefined;
43
+ count?: undefined;
44
+ models?: undefined;
45
+ action?: undefined;
46
+ model?: undefined;
47
+ } | {
48
+ success: boolean;
49
+ endpoint: string;
50
+ count: number;
51
+ models: {
52
+ id: string;
53
+ owned_by: string | undefined;
54
+ }[];
55
+ error?: undefined;
56
+ hint?: undefined;
57
+ detail?: undefined;
58
+ action?: undefined;
59
+ model?: undefined;
60
+ } | {
61
+ success: boolean;
62
+ error: string;
63
+ hint: string;
64
+ detail?: undefined;
65
+ endpoint?: undefined;
66
+ count?: undefined;
67
+ models?: undefined;
68
+ action?: undefined;
69
+ model?: undefined;
70
+ } | {
71
+ success: boolean;
72
+ action: string;
73
+ model: string;
74
+ detail: Record<string, unknown>;
75
+ error?: undefined;
76
+ hint?: undefined;
77
+ endpoint?: undefined;
78
+ count?: undefined;
79
+ models?: undefined;
80
+ }>;
81
+ //# sourceMappingURL=local-llm-models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-llm-models.d.ts","sourceRoot":"","sources":["../../src/tools/local-llm-models.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,eAAO,MAAM,oBAAoB;;;;;;;;;;;;EAW/B,CAAC;AAQH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,EAC3D,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoFf"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ /**
3
+ * local_llm_models — list and manage models on the local LLM server.
4
+ *
5
+ * Works with any OpenAI-compatible server that exposes GET /v1/models.
6
+ * LM Studio also supports POST /v1/models/load and POST /v1/models/unload
7
+ * for switching models without opening the GUI.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.localLlmModelsSchema = void 0;
11
+ exports.handleLocalLlmModels = handleLocalLlmModels;
12
+ const zod_1 = require("zod");
13
+ exports.localLlmModelsSchema = zod_1.z.object({
14
+ action: zod_1.z.enum(['list', 'load', 'unload']).default('list').describe('Action: "list" shows available models, "load" loads a model, "unload" unloads a model. '
15
+ + 'Load/unload requires LM Studio (not supported by all servers).'),
16
+ model: zod_1.z.string().optional().describe('Model identifier for load/unload (e.g. "microsoft/phi-4-mini-reasoning"). Required for load/unload.'),
17
+ endpoint: zod_1.z.string().optional().describe('Override the local LLM endpoint URL. Omit to use LOCAL_LLM_ENDPOINT env var or default.'),
18
+ });
19
+ async function handleLocalLlmModels(args, config) {
20
+ const endpoint = args.endpoint
21
+ ?? config.localLlmEndpoint
22
+ ?? 'http://localhost:1234/v1';
23
+ const baseUrl = endpoint.replace(/\/+$/, '');
24
+ if (args.action === 'list') {
25
+ let res;
26
+ try {
27
+ res = await fetch(`${baseUrl}/models`, {
28
+ signal: AbortSignal.timeout(5000),
29
+ });
30
+ }
31
+ catch (err) {
32
+ const msg = err instanceof Error ? err.message : String(err);
33
+ return {
34
+ success: false,
35
+ error: `Could not connect to local LLM at ${baseUrl}/models`,
36
+ hint: 'Start your local LLM server (LM Studio, Ollama, llama.cpp).',
37
+ detail: msg,
38
+ };
39
+ }
40
+ if (!res.ok) {
41
+ return { success: false, error: `HTTP ${res.status}: ${await res.text().catch(() => '')}` };
42
+ }
43
+ const data = await res.json();
44
+ const models = data.data ?? [];
45
+ return {
46
+ success: true,
47
+ endpoint: baseUrl,
48
+ count: models.length,
49
+ models: models.map(m => ({ id: m.id, owned_by: m.owned_by })),
50
+ };
51
+ }
52
+ // Load / Unload (LM Studio specific)
53
+ if (!args.model) {
54
+ return { success: false, error: `"model" parameter is required for ${args.action}` };
55
+ }
56
+ const url = args.action === 'load'
57
+ ? `${baseUrl}/models/load`
58
+ : `${baseUrl}/models/unload`;
59
+ let res;
60
+ try {
61
+ res = await fetch(url, {
62
+ method: 'POST',
63
+ headers: { 'Content-Type': 'application/json' },
64
+ body: JSON.stringify({ model: args.model }),
65
+ signal: AbortSignal.timeout(60000), // loading a model can take a while
66
+ });
67
+ }
68
+ catch (err) {
69
+ const msg = err instanceof Error ? err.message : String(err);
70
+ if (msg.includes('ECONNREFUSED')) {
71
+ return { success: false, error: 'Local LLM server not running.', hint: 'Start LM Studio.' };
72
+ }
73
+ return { success: false, error: msg };
74
+ }
75
+ if (!res.ok) {
76
+ const text = await res.text().catch(() => '');
77
+ // 404 means the server doesn't support load/unload (not LM Studio)
78
+ if (res.status === 404) {
79
+ return {
80
+ success: false,
81
+ error: `${args.action} is not supported by this server.`,
82
+ hint: 'Model load/unload requires LM Studio. Ollama uses "ollama run <model>" instead.',
83
+ };
84
+ }
85
+ return { success: false, error: `HTTP ${res.status}: ${text.substring(0, 300)}` };
86
+ }
87
+ const data = await res.json().catch(() => ({}));
88
+ return {
89
+ success: true,
90
+ action: args.action,
91
+ model: args.model,
92
+ detail: data,
93
+ };
94
+ }
95
+ //# sourceMappingURL=local-llm-models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-llm-models.js","sourceRoot":"","sources":["../../src/tools/local-llm-models.ts"],"names":[],"mappings":"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"}
@@ -30,16 +30,16 @@ export declare const localLlmRunSchema: z.ZodObject<{
30
30
  timeout_seconds: number;
31
31
  temperature?: number | undefined;
32
32
  model?: string | undefined;
33
- system?: string | undefined;
34
33
  endpoint?: string | undefined;
34
+ system?: string | undefined;
35
35
  max_tokens?: number | undefined;
36
36
  }, {
37
37
  prompt: string;
38
38
  temperature?: number | undefined;
39
39
  timeout_seconds?: number | undefined;
40
40
  model?: string | undefined;
41
- system?: string | undefined;
42
41
  endpoint?: string | undefined;
42
+ system?: string | undefined;
43
43
  max_tokens?: number | undefined;
44
44
  }>;
45
45
  interface ChatCompletionResponse {
@@ -0,0 +1,51 @@
1
+ /**
2
+ * openclaw_notify — send notifications via OpenClaw channels (WhatsApp, Telegram, etc.)
3
+ *
4
+ * Uses `openclaw message send` to deliver messages through configured channels.
5
+ * WhatsApp is the primary channel (loaded by default on the server).
6
+ */
7
+ import { z } from 'zod';
8
+ import { Config } from '../config.js';
9
+ export declare const openclawNotifySchema: z.ZodObject<{
10
+ message: z.ZodString;
11
+ channel: z.ZodDefault<z.ZodEnum<["whatsapp", "telegram", "last"]>>;
12
+ target: z.ZodOptional<z.ZodString>;
13
+ }, "strip", z.ZodTypeAny, {
14
+ message: string;
15
+ channel: "whatsapp" | "telegram" | "last";
16
+ target?: string | undefined;
17
+ }, {
18
+ message: string;
19
+ channel?: "whatsapp" | "telegram" | "last" | undefined;
20
+ target?: string | undefined;
21
+ }>;
22
+ export declare function handleOpenclawNotify(args: {
23
+ message: string;
24
+ channel: string;
25
+ target?: string;
26
+ }, config: Config): Promise<{
27
+ success: boolean;
28
+ channel: string;
29
+ target: string;
30
+ detail: any;
31
+ response?: undefined;
32
+ error?: undefined;
33
+ hint?: undefined;
34
+ } | {
35
+ success: boolean;
36
+ channel: string;
37
+ target: string;
38
+ response: string;
39
+ detail?: undefined;
40
+ error?: undefined;
41
+ hint?: undefined;
42
+ } | {
43
+ success: boolean;
44
+ error: string;
45
+ hint: string;
46
+ channel?: undefined;
47
+ target?: undefined;
48
+ detail?: undefined;
49
+ response?: undefined;
50
+ }>;
51
+ //# sourceMappingURL=notify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../src/tools/notify.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAGtC,eAAO,MAAM,oBAAoB;;;;;;;;;;;;EAW/B,CAAC;AAMH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EAC3D,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;GAmDf"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ /**
3
+ * openclaw_notify — send notifications via OpenClaw channels (WhatsApp, Telegram, etc.)
4
+ *
5
+ * Uses `openclaw message send` to deliver messages through configured channels.
6
+ * WhatsApp is the primary channel (loaded by default on the server).
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.openclawNotifySchema = void 0;
10
+ exports.handleOpenclawNotify = handleOpenclawNotify;
11
+ const zod_1 = require("zod");
12
+ const ssh_js_1 = require("../ssh.js");
13
+ exports.openclawNotifySchema = zod_1.z.object({
14
+ message: zod_1.z.string().describe('The message to send.'),
15
+ channel: zod_1.z.enum(['whatsapp', 'telegram', 'last']).default('last').describe('Channel to send through: "whatsapp", "telegram", or "last" (most recently used channel).'),
16
+ target: zod_1.z.string().optional().describe('Delivery target: phone number (E.164 format, e.g. "+491234567890") for WhatsApp, '
17
+ + 'chat ID for Telegram. Omit to send to the default/last conversation.'),
18
+ });
19
+ function toSshCfg(config) {
20
+ return { host: config.sshHost, port: config.sshPort, username: config.sshUser, keyPath: config.sshKeyPath };
21
+ }
22
+ async function handleOpenclawNotify(args, config) {
23
+ const cfg = toSshCfg(config);
24
+ // Build the openclaw message send command
25
+ const escapedMsg = args.message.replace(/'/g, "'\\''");
26
+ const parts = [
27
+ 'openclaw', 'message', 'send',
28
+ '--channel', args.channel,
29
+ '--message', `'${escapedMsg}'`,
30
+ ];
31
+ if (args.target) {
32
+ parts.push('--target', `'${args.target.replace(/'/g, "'\\''")}'`);
33
+ }
34
+ parts.push('--json');
35
+ const cmd = parts.join(' ');
36
+ try {
37
+ const output = await (0, ssh_js_1.sshExec)(cfg, cmd, 30000);
38
+ // Try to parse JSON response
39
+ try {
40
+ const result = JSON.parse(output.trim());
41
+ return {
42
+ success: true,
43
+ channel: args.channel,
44
+ target: args.target ?? 'default',
45
+ detail: result,
46
+ };
47
+ }
48
+ catch {
49
+ // Non-JSON output (older OpenClaw versions)
50
+ return {
51
+ success: true,
52
+ channel: args.channel,
53
+ target: args.target ?? 'default',
54
+ response: output.trim(),
55
+ };
56
+ }
57
+ }
58
+ catch (err) {
59
+ const msg = err instanceof Error ? err.message : String(err);
60
+ return {
61
+ success: false,
62
+ error: msg,
63
+ hint: args.channel === 'whatsapp'
64
+ ? 'Ensure WhatsApp is linked: `openclaw channels login` on the server.'
65
+ : 'Check channel status: `openclaw status` on the server.',
66
+ };
67
+ }
68
+ }
69
+ //# sourceMappingURL=notify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/tools/notify.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAuBH,oDAqDC;AA1ED,6BAAwB;AAExB,sCAA+C;AAElC,QAAA,oBAAoB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC3C,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAC1B,sBAAsB,CACvB;IACD,OAAO,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CACxE,0FAA0F,CAC3F;IACD,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACpC,mFAAmF;UACjF,sEAAsE,CACzE;CACF,CAAC,CAAC;AAEH,SAAS,QAAQ,CAAC,MAAc;IAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;AAC9G,CAAC;AAEM,KAAK,UAAU,oBAAoB,CACxC,IAA2D,EAC3D,MAAc;IAEd,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE7B,0CAA0C;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG;QACZ,UAAU,EAAE,SAAS,EAAE,MAAM;QAC7B,WAAW,EAAE,IAAI,CAAC,OAAO;QACzB,WAAW,EAAE,IAAI,UAAU,GAAG;KAC/B,CAAC;IAEF,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAErB,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE5B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAA,gBAAO,EAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAE9C,6BAA6B;QAC7B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACzC,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,SAAS;gBAChC,MAAM,EAAE,MAAM;aACf,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,4CAA4C;YAC5C,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,SAAS;gBAChC,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE;aACxB,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,GAAG;YACV,IAAI,EAAE,IAAI,CAAC,OAAO,KAAK,UAAU;gBAC/B,CAAC,CAAC,qEAAqE;gBACvE,CAAC,CAAC,wDAAwD;SAC7D,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * openclaw_logs — view recent logs from the OpenClaw server via SSH.
3
+ *
4
+ * Reads systemd journal, OpenClaw workspace logs, or arbitrary log files.
5
+ */
6
+ import { z } from 'zod';
7
+ import { Config } from '../config.js';
8
+ export declare const openclawLogsSchema: z.ZodObject<{
9
+ source: z.ZodDefault<z.ZodEnum<["gateway", "agent", "system", "custom"]>>;
10
+ lines: z.ZodDefault<z.ZodNumber>;
11
+ filter: z.ZodOptional<z.ZodString>;
12
+ path: z.ZodOptional<z.ZodString>;
13
+ }, "strip", z.ZodTypeAny, {
14
+ source: "custom" | "agent" | "gateway" | "system";
15
+ lines: number;
16
+ path?: string | undefined;
17
+ filter?: string | undefined;
18
+ }, {
19
+ path?: string | undefined;
20
+ filter?: string | undefined;
21
+ source?: "custom" | "agent" | "gateway" | "system" | undefined;
22
+ lines?: number | undefined;
23
+ }>;
24
+ export declare function handleOpenclawLogs(args: {
25
+ source: string;
26
+ lines: number;
27
+ filter?: string;
28
+ path?: string;
29
+ }, config: Config): Promise<{
30
+ success: boolean;
31
+ error: string;
32
+ source?: undefined;
33
+ line_count?: undefined;
34
+ logs?: undefined;
35
+ } | {
36
+ success: boolean;
37
+ source: "custom" | "agent" | "gateway" | "system";
38
+ line_count: number;
39
+ logs: string;
40
+ error?: undefined;
41
+ }>;
42
+ //# sourceMappingURL=openclaw-logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-logs.d.ts","sourceRoot":"","sources":["../../src/tools/openclaw-logs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAGtC,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;EAc7B,CAAC;AAMH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EACvE,MAAM,EAAE,MAAM;;;;;;;;;;;;GAsDf"}