@elvatis_com/elvatis-mcp 0.2.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 (60) hide show
  1. package/.env.example +61 -0
  2. package/LICENSE +190 -0
  3. package/README.md +471 -0
  4. package/dist/config.d.ts +39 -0
  5. package/dist/config.d.ts.map +1 -0
  6. package/dist/config.js +45 -0
  7. package/dist/config.js.map +1 -0
  8. package/dist/index.d.ts +18 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +146 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/spawn.d.ts +12 -0
  13. package/dist/spawn.d.ts.map +1 -0
  14. package/dist/spawn.js +55 -0
  15. package/dist/spawn.js.map +1 -0
  16. package/dist/ssh.d.ts +28 -0
  17. package/dist/ssh.d.ts.map +1 -0
  18. package/dist/ssh.js +171 -0
  19. package/dist/ssh.js.map +1 -0
  20. package/dist/tools/codex.d.ts +61 -0
  21. package/dist/tools/codex.d.ts.map +1 -0
  22. package/dist/tools/codex.js +63 -0
  23. package/dist/tools/codex.js.map +1 -0
  24. package/dist/tools/cron.d.ts +58 -0
  25. package/dist/tools/cron.d.ts.map +1 -0
  26. package/dist/tools/cron.js +88 -0
  27. package/dist/tools/cron.js.map +1 -0
  28. package/dist/tools/gemini.d.ts +75 -0
  29. package/dist/tools/gemini.d.ts.map +1 -0
  30. package/dist/tools/gemini.js +72 -0
  31. package/dist/tools/gemini.js.map +1 -0
  32. package/dist/tools/help.d.ts +31 -0
  33. package/dist/tools/help.d.ts.map +1 -0
  34. package/dist/tools/help.js +39 -0
  35. package/dist/tools/help.js.map +1 -0
  36. package/dist/tools/home.d.ts +108 -0
  37. package/dist/tools/home.d.ts.map +1 -0
  38. package/dist/tools/home.js +141 -0
  39. package/dist/tools/home.js.map +1 -0
  40. package/dist/tools/local-llm.d.ts +115 -0
  41. package/dist/tools/local-llm.d.ts.map +1 -0
  42. package/dist/tools/local-llm.js +123 -0
  43. package/dist/tools/local-llm.js.map +1 -0
  44. package/dist/tools/memory.d.ts +52 -0
  45. package/dist/tools/memory.d.ts.map +1 -0
  46. package/dist/tools/memory.js +92 -0
  47. package/dist/tools/memory.js.map +1 -0
  48. package/dist/tools/openclaw.d.ts +88 -0
  49. package/dist/tools/openclaw.d.ts.map +1 -0
  50. package/dist/tools/openclaw.js +119 -0
  51. package/dist/tools/openclaw.js.map +1 -0
  52. package/dist/tools/routing-rules.d.ts +21 -0
  53. package/dist/tools/routing-rules.d.ts.map +1 -0
  54. package/dist/tools/routing-rules.js +149 -0
  55. package/dist/tools/routing-rules.js.map +1 -0
  56. package/dist/tools/splitter.d.ts +49 -0
  57. package/dist/tools/splitter.d.ts.map +1 -0
  58. package/dist/tools/splitter.js +375 -0
  59. package/dist/tools/splitter.js.map +1 -0
  60. package/package.json +54 -0
@@ -0,0 +1,58 @@
1
+ /**
2
+ * OpenClaw cron tools — reads from ~/.openclaw/cron/jobs.json via SSH.
3
+ *
4
+ * OpenClaw uses a WebSocket gateway (not REST), so we access cron state
5
+ * directly from the server's filesystem over SSH.
6
+ */
7
+ import { z } from 'zod';
8
+ import { Config } from '../config.js';
9
+ export declare const cronListSchema: z.ZodObject<{
10
+ include_disabled: z.ZodDefault<z.ZodBoolean>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ include_disabled: boolean;
13
+ }, {
14
+ include_disabled?: boolean | undefined;
15
+ }>;
16
+ export declare const cronRunSchema: z.ZodObject<{
17
+ job_id: z.ZodString;
18
+ }, "strip", z.ZodTypeAny, {
19
+ job_id: string;
20
+ }, {
21
+ job_id: string;
22
+ }>;
23
+ export declare const cronStatusSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
24
+ export declare function handleCronList(args: {
25
+ include_disabled: boolean;
26
+ }, config: Config): Promise<{
27
+ jobs: Record<string, unknown>[];
28
+ total: number;
29
+ }>;
30
+ export declare function handleCronRun(args: {
31
+ job_id: string;
32
+ }, config: Config): Promise<{
33
+ success: boolean;
34
+ job_id: string;
35
+ output: string;
36
+ error?: undefined;
37
+ note?: undefined;
38
+ job?: undefined;
39
+ } | {
40
+ success: boolean;
41
+ job_id: string;
42
+ error: string;
43
+ note: string;
44
+ job: Record<string, unknown>;
45
+ output?: undefined;
46
+ }>;
47
+ export declare function handleCronStatus(_args: Record<string, never>, config: Config): Promise<{
48
+ total: number;
49
+ enabled: number;
50
+ disabled: number;
51
+ recentRuns: {
52
+ id: unknown;
53
+ name: unknown;
54
+ lastRun: unknown;
55
+ }[];
56
+ source: string;
57
+ }>;
58
+ //# sourceMappingURL=cron.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron.d.ts","sourceRoot":"","sources":["../../src/tools/cron.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAOtC,eAAO,MAAM,cAAc;;;;;;EAEzB,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;EAExB,CAAC;AAEH,eAAO,MAAM,gBAAgB,gDAAe,CAAC;AAyB7C,wBAAsB,cAAc,CAAC,IAAI,EAAE;IAAE,gBAAgB,EAAE,OAAO,CAAA;CAAE,EAAE,MAAM,EAAE,MAAM;;;GAMvF;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,EAAE,MAAM;;;;;;;;;;;;;;GAwB3E;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM;;;;;;;;;;GAYlF"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ /**
3
+ * OpenClaw cron tools — reads from ~/.openclaw/cron/jobs.json via SSH.
4
+ *
5
+ * OpenClaw uses a WebSocket gateway (not REST), so we access cron state
6
+ * directly from the server's filesystem over SSH.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.cronStatusSchema = exports.cronRunSchema = exports.cronListSchema = void 0;
10
+ exports.handleCronList = handleCronList;
11
+ exports.handleCronRun = handleCronRun;
12
+ exports.handleCronStatus = handleCronStatus;
13
+ const zod_1 = require("zod");
14
+ const ssh_js_1 = require("../ssh.js");
15
+ const CRON_JOBS_FILE = '~/.openclaw/cron/jobs.json';
16
+ // --- Schemas ---
17
+ exports.cronListSchema = zod_1.z.object({
18
+ include_disabled: zod_1.z.boolean().default(false).describe('Include disabled jobs'),
19
+ });
20
+ exports.cronRunSchema = zod_1.z.object({
21
+ job_id: zod_1.z.string().describe('Cron job ID (UUID)'),
22
+ });
23
+ exports.cronStatusSchema = zod_1.z.object({});
24
+ // --- Helpers ---
25
+ function toSshCfg(config) {
26
+ return {
27
+ host: config.sshHost,
28
+ port: config.sshPort,
29
+ username: config.sshUser,
30
+ keyPath: config.sshKeyPath,
31
+ };
32
+ }
33
+ async function readJobs(config) {
34
+ const raw = await (0, ssh_js_1.sshReadFile)(toSshCfg(config), CRON_JOBS_FILE);
35
+ if (!raw.trim())
36
+ return [];
37
+ try {
38
+ return JSON.parse(raw);
39
+ }
40
+ catch (e) {
41
+ throw new Error(`Failed to parse ${CRON_JOBS_FILE}: ${e}`);
42
+ }
43
+ }
44
+ // --- Handlers ---
45
+ async function handleCronList(args, config) {
46
+ const jobs = await readJobs(config);
47
+ const filtered = args.include_disabled
48
+ ? jobs
49
+ : jobs.filter(j => j['enabled'] !== false);
50
+ return { jobs: filtered, total: filtered.length };
51
+ }
52
+ async function handleCronRun(args, config) {
53
+ // Try the OpenClaw CLI to trigger the job.
54
+ // Command: openclaw cron run <id>
55
+ // Adjust OPENCLAW_CLI_CMD in env if the CLI syntax differs on your server.
56
+ try {
57
+ const output = await (0, ssh_js_1.sshExec)(toSshCfg(config), `openclaw cron run ${args.job_id}`, 30000);
58
+ return { success: true, job_id: args.job_id, output: output.trim() };
59
+ }
60
+ catch (err) {
61
+ // Fallback: find the job in jobs.json and report the command that would run
62
+ const jobs = await readJobs(config);
63
+ const job = jobs.find(j => j['id'] === args.job_id);
64
+ if (!job)
65
+ throw new Error(`Job ${args.job_id} not found`);
66
+ return {
67
+ success: false,
68
+ job_id: args.job_id,
69
+ error: String(err),
70
+ note: 'CLI trigger failed. Set OPENCLAW_CLI_CMD env var to the correct command.',
71
+ job,
72
+ };
73
+ }
74
+ }
75
+ async function handleCronStatus(_args, config) {
76
+ const jobs = await readJobs(config);
77
+ const total = jobs.length;
78
+ const enabled = jobs.filter(j => j['enabled'] !== false).length;
79
+ const disabled = total - enabled;
80
+ // Summarize recent runs if the jobs have lastRun fields
81
+ const recentRuns = jobs
82
+ .filter(j => j['lastRun'])
83
+ .sort((a, b) => String(b['lastRun']).localeCompare(String(a['lastRun'])))
84
+ .slice(0, 5)
85
+ .map(j => ({ id: j['id'], name: j['name'], lastRun: j['lastRun'] }));
86
+ return { total, enabled, disabled, recentRuns, source: CRON_JOBS_FILE };
87
+ }
88
+ //# sourceMappingURL=cron.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron.js","sourceRoot":"","sources":["../../src/tools/cron.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Gemini sub-agent tool.
3
+ *
4
+ * Uses the @google/gemini-cli package in headless mode:
5
+ * gemini -p "<prompt>" --model <model> --output-format json
6
+ *
7
+ * Authentication: the CLI uses locally cached Google credentials
8
+ * (from `gemini auth login`). No API key env var required.
9
+ *
10
+ * Output format (--output-format json):
11
+ * { "response": "...", "stats": { ... }, "error": null }
12
+ *
13
+ * Use cases vs openclaw_run:
14
+ * - Direct, fast Gemini call with no OpenClaw overhead
15
+ * - Works even when the OpenClaw server is unreachable
16
+ * - Gemini-specific capabilities: 1M token context, multimodal, etc.
17
+ * - Second opinion / cross-validation of an openclaw_run result
18
+ */
19
+ import { z } from 'zod';
20
+ import { Config } from '../config.js';
21
+ export declare const geminiRunSchema: z.ZodObject<{
22
+ prompt: z.ZodString;
23
+ model: z.ZodOptional<z.ZodString>;
24
+ timeout_seconds: z.ZodDefault<z.ZodNumber>;
25
+ }, "strip", z.ZodTypeAny, {
26
+ prompt: string;
27
+ timeout_seconds: number;
28
+ model?: string | undefined;
29
+ }, {
30
+ prompt: string;
31
+ timeout_seconds?: number | undefined;
32
+ model?: string | undefined;
33
+ }>;
34
+ export declare function handleGeminiRun(args: {
35
+ prompt: string;
36
+ model?: string;
37
+ timeout_seconds: number;
38
+ }, config: Config): Promise<{
39
+ success: boolean;
40
+ error: string;
41
+ hint: string;
42
+ raw?: undefined;
43
+ response?: undefined;
44
+ model?: undefined;
45
+ stats?: undefined;
46
+ note?: undefined;
47
+ } | {
48
+ success: boolean;
49
+ error: string;
50
+ raw: string;
51
+ hint?: undefined;
52
+ response?: undefined;
53
+ model?: undefined;
54
+ stats?: undefined;
55
+ note?: undefined;
56
+ } | {
57
+ success: boolean;
58
+ response: string;
59
+ model: string;
60
+ stats: Record<string, unknown> | undefined;
61
+ error?: undefined;
62
+ hint?: undefined;
63
+ raw?: undefined;
64
+ note?: undefined;
65
+ } | {
66
+ success: boolean;
67
+ response: string;
68
+ model: string;
69
+ note: string;
70
+ error?: undefined;
71
+ hint?: undefined;
72
+ raw?: undefined;
73
+ stats?: undefined;
74
+ }>;
75
+ //# sourceMappingURL=gemini.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/tools/gemini.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAKtC,eAAO,MAAM,eAAe;;;;;;;;;;;;EAW1B,CAAC;AAIH,wBAAsB,eAAe,CACnC,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,EACjE,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4Cf"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ /**
3
+ * Gemini sub-agent tool.
4
+ *
5
+ * Uses the @google/gemini-cli package in headless mode:
6
+ * gemini -p "<prompt>" --model <model> --output-format json
7
+ *
8
+ * Authentication: the CLI uses locally cached Google credentials
9
+ * (from `gemini auth login`). No API key env var required.
10
+ *
11
+ * Output format (--output-format json):
12
+ * { "response": "...", "stats": { ... }, "error": null }
13
+ *
14
+ * Use cases vs openclaw_run:
15
+ * - Direct, fast Gemini call with no OpenClaw overhead
16
+ * - Works even when the OpenClaw server is unreachable
17
+ * - Gemini-specific capabilities: 1M token context, multimodal, etc.
18
+ * - Second opinion / cross-validation of an openclaw_run result
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.geminiRunSchema = void 0;
22
+ exports.handleGeminiRun = handleGeminiRun;
23
+ const zod_1 = require("zod");
24
+ const spawn_js_1 = require("../spawn.js");
25
+ // --- Schemas ---
26
+ exports.geminiRunSchema = zod_1.z.object({
27
+ prompt: zod_1.z.string().describe('Prompt or question to send to the Gemini AI model.'),
28
+ model: zod_1.z.string().optional().describe('Gemini model to use, e.g. "gemini-2.5-pro" or "gemini-2.5-flash". ' +
29
+ 'Omit to use the configured default (GEMINI_MODEL env var).'),
30
+ timeout_seconds: zod_1.z.number().min(5).max(300).default(60).describe('Max seconds to wait for a response.'),
31
+ });
32
+ // --- Handler ---
33
+ async function handleGeminiRun(args, config) {
34
+ const model = args.model ?? config.geminiModel;
35
+ const cliArgs = ['-p', args.prompt, '--output-format', 'json'];
36
+ if (model)
37
+ cliArgs.push('--model', model);
38
+ let raw;
39
+ try {
40
+ raw = await (0, spawn_js_1.spawnLocal)('gemini', cliArgs, args.timeout_seconds * 1000);
41
+ }
42
+ catch (err) {
43
+ return {
44
+ success: false,
45
+ error: String(err),
46
+ hint: 'Run `gemini auth login` to authenticate, or check `gemini --version` to confirm the CLI is installed.',
47
+ };
48
+ }
49
+ // Parse the JSON envelope and extract the response text
50
+ try {
51
+ const parsed = JSON.parse(raw.trim());
52
+ if (parsed.error) {
53
+ return { success: false, error: parsed.error.message, raw };
54
+ }
55
+ return {
56
+ success: true,
57
+ response: parsed.response ?? '(empty response)',
58
+ model: model ?? 'default',
59
+ stats: parsed.stats,
60
+ };
61
+ }
62
+ catch {
63
+ // CLI returned plain text instead of JSON (can happen with some versions)
64
+ return {
65
+ success: true,
66
+ response: raw.trim(),
67
+ model: model ?? 'default',
68
+ note: 'Response was plain text, not JSON — consider upgrading @google/gemini-cli',
69
+ };
70
+ }
71
+ }
72
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/tools/gemini.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;AAuBH,0CA8CC;AAnED,6BAAwB;AAExB,0CAAyC;AAEzC,kBAAkB;AAEL,QAAA,eAAe,GAAG,OAAC,CAAC,MAAM,CAAC;IACtC,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CACzB,oDAAoD,CACrD;IACD,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACnC,oEAAoE;QACpE,4DAA4D,CAC7D;IACD,eAAe,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAC9D,qCAAqC,CACtC;CACF,CAAC,CAAC;AAEH,kBAAkB;AAEX,KAAK,UAAU,eAAe,CACnC,IAAiE,EACjE,MAAc;IAEd,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,WAAW,CAAC;IAC/C,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,CAAC,CAAC;IAC/D,IAAI,KAAK;QAAE,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAE1C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,IAAA,qBAAU,EAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IACzE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;YAClB,IAAI,EAAE,uGAAuG;SAC9G,CAAC;IACJ,CAAC;IAED,wDAAwD;IACxD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAInC,CAAC;QAEF,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;QAC9D,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,kBAAkB;YAC/C,KAAK,EAAE,KAAK,IAAI,SAAS;YACzB,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,0EAA0E;QAC1E,OAAO;YACL,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE;YACpB,KAAK,EAAE,KAAK,IAAI,SAAS;YACzB,IAAI,EAAE,2EAA2E;SAClF,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * mcp_help — routing guide and task-to-tool recommender.
3
+ *
4
+ * Returns a structured guide of all available sub-agents and their strengths.
5
+ * When a task description is provided, analyzes it and recommends the best tool(s).
6
+ *
7
+ * This tool is intended for:
8
+ * - Users who want to know what sub-agents are available
9
+ * - Claude itself, to auto-route complex tasks to the right backend
10
+ * - The /mcp-help slash command in Claude Code and Cowork
11
+ */
12
+ import { z } from 'zod';
13
+ export declare const mcpHelpSchema: z.ZodObject<{
14
+ task: z.ZodOptional<z.ZodString>;
15
+ }, "strip", z.ZodTypeAny, {
16
+ task?: string | undefined;
17
+ }, {
18
+ task?: string | undefined;
19
+ }>;
20
+ export declare function handleMcpHelp(args: {
21
+ task?: string;
22
+ }): Promise<{
23
+ guide: string;
24
+ task?: undefined;
25
+ recommendation?: undefined;
26
+ } | {
27
+ task: string;
28
+ recommendation: string;
29
+ guide: string;
30
+ }>;
31
+ //# sourceMappingURL=help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/tools/help.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,aAAa;;;;;;EAKxB,CAAC;AAIH,wBAAsB,aAAa,CAAC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;;;;GAiB1D"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ /**
3
+ * mcp_help — routing guide and task-to-tool recommender.
4
+ *
5
+ * Returns a structured guide of all available sub-agents and their strengths.
6
+ * When a task description is provided, analyzes it and recommends the best tool(s).
7
+ *
8
+ * This tool is intended for:
9
+ * - Users who want to know what sub-agents are available
10
+ * - Claude itself, to auto-route complex tasks to the right backend
11
+ * - The /mcp-help slash command in Claude Code and Cowork
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.mcpHelpSchema = void 0;
15
+ exports.handleMcpHelp = handleMcpHelp;
16
+ const zod_1 = require("zod");
17
+ const routing_rules_js_1 = require("./routing-rules.js");
18
+ // --- Schema ---
19
+ exports.mcpHelpSchema = zod_1.z.object({
20
+ task: zod_1.z.string().optional().describe('Optional: describe your task or question. If provided, returns a specific ' +
21
+ 'routing recommendation for which tool(s) to use.'),
22
+ });
23
+ // --- Handler ---
24
+ async function handleMcpHelp(args) {
25
+ if (!args.task) {
26
+ return { guide: routing_rules_js_1.ROUTING_GUIDE };
27
+ }
28
+ // Analyze the task and recommend tools
29
+ const matches = (0, routing_rules_js_1.matchRules)(args.task);
30
+ const recommendation = matches.length > 0
31
+ ? matches.slice(0, 2).map(m => `- **${m.tool}**: ${m.reason}`).join('\n')
32
+ : '- No strong signal. Consider `gemini_run` for general questions or `openclaw_run` for complex multi-step tasks.';
33
+ return {
34
+ task: args.task,
35
+ recommendation,
36
+ guide: routing_rules_js_1.ROUTING_GUIDE,
37
+ };
38
+ }
39
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/tools/help.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAgBH,sCAiBC;AA/BD,6BAAwB;AACxB,yDAA+D;AAE/D,iBAAiB;AAEJ,QAAA,aAAa,GAAG,OAAC,CAAC,MAAM,CAAC;IACpC,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAClC,4EAA4E;QAC5E,kDAAkD,CACnD;CACF,CAAC,CAAC;AAEH,kBAAkB;AAEX,KAAK,UAAU,aAAa,CAAC,IAAuB;IACzD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,EAAE,KAAK,EAAE,gCAAa,EAAE,CAAC;IAClC,CAAC;IAED,uCAAuC;IACvC,MAAM,OAAO,GAAG,IAAA,6BAAU,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEtC,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC;QACvC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACzE,CAAC,CAAC,iHAAiH,CAAC;IAEtH,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,cAAc;QACd,KAAK,EAAE,gCAAa;KACrB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,108 @@
1
+ import { z } from 'zod';
2
+ import { Config } from '../config.js';
3
+ export declare const getStateSchema: z.ZodObject<{
4
+ entity_id: z.ZodString;
5
+ }, "strip", z.ZodTypeAny, {
6
+ entity_id: string;
7
+ }, {
8
+ entity_id: string;
9
+ }>;
10
+ export declare const lightSchema: z.ZodObject<{
11
+ entity_id: z.ZodString;
12
+ action: z.ZodEnum<["on", "off", "toggle"]>;
13
+ brightness_pct: z.ZodOptional<z.ZodNumber>;
14
+ color_temp_kelvin: z.ZodOptional<z.ZodNumber>;
15
+ rgb_color: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
16
+ }, "strip", z.ZodTypeAny, {
17
+ entity_id: string;
18
+ action: "on" | "off" | "toggle";
19
+ brightness_pct?: number | undefined;
20
+ color_temp_kelvin?: number | undefined;
21
+ rgb_color?: [number, number, number] | undefined;
22
+ }, {
23
+ entity_id: string;
24
+ action: "on" | "off" | "toggle";
25
+ brightness_pct?: number | undefined;
26
+ color_temp_kelvin?: number | undefined;
27
+ rgb_color?: [number, number, number] | undefined;
28
+ }>;
29
+ export declare const climateSchema: z.ZodObject<{
30
+ entity_id: z.ZodString;
31
+ temperature: z.ZodOptional<z.ZodNumber>;
32
+ hvac_mode: z.ZodOptional<z.ZodEnum<["heat", "auto", "off"]>>;
33
+ }, "strip", z.ZodTypeAny, {
34
+ entity_id: string;
35
+ temperature?: number | undefined;
36
+ hvac_mode?: "off" | "heat" | "auto" | undefined;
37
+ }, {
38
+ entity_id: string;
39
+ temperature?: number | undefined;
40
+ hvac_mode?: "off" | "heat" | "auto" | undefined;
41
+ }>;
42
+ export declare const sceneSchema: z.ZodObject<{
43
+ room: z.ZodEnum<["wohnzimmer", "flur", "kuche", "schlafzimmer", "home"]>;
44
+ scene: z.ZodString;
45
+ }, "strip", z.ZodTypeAny, {
46
+ room: "wohnzimmer" | "flur" | "kuche" | "schlafzimmer" | "home";
47
+ scene: string;
48
+ }, {
49
+ room: "wohnzimmer" | "flur" | "kuche" | "schlafzimmer" | "home";
50
+ scene: string;
51
+ }>;
52
+ export declare const vacuumSchema: z.ZodObject<{
53
+ action: z.ZodEnum<["start", "stop", "return_to_base", "status"]>;
54
+ }, "strip", z.ZodTypeAny, {
55
+ action: "status" | "start" | "stop" | "return_to_base";
56
+ }, {
57
+ action: "status" | "start" | "stop" | "return_to_base";
58
+ }>;
59
+ export declare const sensorsSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
60
+ export declare function handleGetState(args: {
61
+ entity_id: string;
62
+ }, config: Config): Promise<{
63
+ entity_id: unknown;
64
+ state: unknown;
65
+ attributes: unknown;
66
+ last_changed: unknown;
67
+ }>;
68
+ export declare function handleLight(args: {
69
+ entity_id: string;
70
+ action: 'on' | 'off' | 'toggle';
71
+ brightness_pct?: number;
72
+ color_temp_kelvin?: number;
73
+ rgb_color?: [number, number, number];
74
+ }, config: Config): Promise<{
75
+ success: boolean;
76
+ entity_id: string;
77
+ action: "on" | "off" | "toggle";
78
+ }>;
79
+ export declare function handleClimate(args: {
80
+ entity_id: string;
81
+ temperature?: number;
82
+ hvac_mode?: 'heat' | 'auto' | 'off';
83
+ }, config: Config): Promise<{
84
+ success: boolean;
85
+ entity_id: string;
86
+ }>;
87
+ export declare function handleScene(args: {
88
+ room: string;
89
+ scene: string;
90
+ }, config: Config): Promise<{
91
+ success: boolean;
92
+ scene: string;
93
+ }>;
94
+ export declare function handleVacuum(args: {
95
+ action: string;
96
+ }, config: Config): Promise<{
97
+ state: unknown;
98
+ attributes: unknown;
99
+ success?: undefined;
100
+ action?: undefined;
101
+ } | {
102
+ success: boolean;
103
+ action: string;
104
+ state?: undefined;
105
+ attributes?: undefined;
106
+ }>;
107
+ export declare function handleSensors(_args: Record<string, never>, config: Config): Promise<Record<string, string>>;
108
+ //# sourceMappingURL=home.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../../src/tools/home.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAkBtC,eAAO,MAAM,cAAc;;;;;;EAEzB,CAAC;AAEH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;EAMtB,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;;;;;EAIxB,CAAC;AAEH,eAAO,MAAM,WAAW;;;;;;;;;EAGtB,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;EAEvB,CAAC;AAEH,eAAO,MAAM,aAAa,gDAAe,CAAC;AAI1C,wBAAsB,cAAc,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,EAAE,MAAM;;;;;GAQ/E;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,IAAI,GAAG,KAAK,GAAG,QAAQ,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC,EAAE,MAAM,EAAE,MAAM;;;;GAUhB;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;CACrC,EAAE,MAAM,EAAE,MAAM;;;GAchB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,EAAE,MAAM;;;GAItF;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,EAAE,MAAM;;;;;;;;;;GAmB1E;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,mCAyB/E"}
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sensorsSchema = exports.vacuumSchema = exports.sceneSchema = exports.climateSchema = exports.lightSchema = exports.getStateSchema = void 0;
4
+ exports.handleGetState = handleGetState;
5
+ exports.handleLight = handleLight;
6
+ exports.handleClimate = handleClimate;
7
+ exports.handleScene = handleScene;
8
+ exports.handleVacuum = handleVacuum;
9
+ exports.handleSensors = handleSensors;
10
+ const zod_1 = require("zod");
11
+ async function haRequest(config, method, path, body) {
12
+ if (!config.haToken)
13
+ throw new Error('HA_TOKEN not configured');
14
+ const res = await fetch(`${config.haUrl}${path}`, {
15
+ method,
16
+ headers: {
17
+ Authorization: `Bearer ${config.haToken}`,
18
+ 'Content-Type': 'application/json',
19
+ },
20
+ body: body ? JSON.stringify(body) : undefined,
21
+ });
22
+ if (!res.ok)
23
+ throw new Error(`HA API error ${res.status}: ${await res.text()}`);
24
+ return res.json();
25
+ }
26
+ // --- Schemas (exported so index.ts can use them directly) ---
27
+ exports.getStateSchema = zod_1.z.object({
28
+ entity_id: zod_1.z.string().describe('Entity ID, e.g. light.wohnzimmer or climate.wohnzimmer'),
29
+ });
30
+ exports.lightSchema = zod_1.z.object({
31
+ entity_id: zod_1.z.string().describe('Light entity ID, e.g. light.wohnzimmer'),
32
+ action: zod_1.z.enum(['on', 'off', 'toggle']),
33
+ brightness_pct: zod_1.z.number().min(0).max(100).optional().describe('Brightness in percent (0-100)'),
34
+ color_temp_kelvin: zod_1.z.number().optional().describe('Color temperature in Kelvin (2000-6500)'),
35
+ rgb_color: zod_1.z.tuple([zod_1.z.number(), zod_1.z.number(), zod_1.z.number()]).optional().describe('RGB color as [r, g, b]'),
36
+ });
37
+ exports.climateSchema = zod_1.z.object({
38
+ entity_id: zod_1.z.string().describe('Climate entity, e.g. climate.wohnzimmer'),
39
+ temperature: zod_1.z.number().min(5).max(30).optional().describe('Target temperature in °C'),
40
+ hvac_mode: zod_1.z.enum(['heat', 'auto', 'off']).optional().describe('HVAC mode'),
41
+ });
42
+ exports.sceneSchema = zod_1.z.object({
43
+ room: zod_1.z.enum(['wohnzimmer', 'flur', 'kuche', 'schlafzimmer', 'home']).describe('Room name'),
44
+ scene: zod_1.z.string().describe('Scene name, e.g. entspannen, konzentrieren, lesen, nachtlicht, hell, gedimmt'),
45
+ });
46
+ exports.vacuumSchema = zod_1.z.object({
47
+ action: zod_1.z.enum(['start', 'stop', 'return_to_base', 'status']),
48
+ });
49
+ exports.sensorsSchema = zod_1.z.object({});
50
+ // --- Handlers ---
51
+ async function handleGetState(args, config) {
52
+ const state = await haRequest(config, 'GET', `/api/states/${args.entity_id}`);
53
+ return {
54
+ entity_id: state['entity_id'],
55
+ state: state['state'],
56
+ attributes: state['attributes'],
57
+ last_changed: state['last_changed'],
58
+ };
59
+ }
60
+ async function handleLight(args, config) {
61
+ const service = args.action === 'toggle' ? 'toggle' : `turn_${args.action}`;
62
+ const data = { entity_id: args.entity_id };
63
+ if (args.action === 'on') {
64
+ if (args.brightness_pct !== undefined)
65
+ data['brightness_pct'] = args.brightness_pct;
66
+ if (args.color_temp_kelvin !== undefined)
67
+ data['color_temp_kelvin'] = args.color_temp_kelvin;
68
+ if (args.rgb_color !== undefined)
69
+ data['rgb_color'] = args.rgb_color;
70
+ }
71
+ await haRequest(config, 'POST', `/api/services/light/${service}`, data);
72
+ return { success: true, entity_id: args.entity_id, action: args.action };
73
+ }
74
+ async function handleClimate(args, config) {
75
+ if (args.temperature !== undefined) {
76
+ await haRequest(config, 'POST', '/api/services/climate/set_temperature', {
77
+ entity_id: args.entity_id,
78
+ temperature: args.temperature,
79
+ });
80
+ }
81
+ if (args.hvac_mode !== undefined) {
82
+ await haRequest(config, 'POST', '/api/services/climate/set_hvac_mode', {
83
+ entity_id: args.entity_id,
84
+ hvac_mode: args.hvac_mode,
85
+ });
86
+ }
87
+ return { success: true, entity_id: args.entity_id };
88
+ }
89
+ async function handleScene(args, config) {
90
+ const sceneId = `scene.${args.room}_${args.scene}`;
91
+ await haRequest(config, 'POST', '/api/services/scene/turn_on', { entity_id: sceneId });
92
+ return { success: true, scene: sceneId };
93
+ }
94
+ async function handleVacuum(args, config) {
95
+ if (args.action === 'status') {
96
+ const state = await haRequest(config, 'GET', '/api/states/vacuum.roborock_qv_35s');
97
+ return { state: state['state'], attributes: state['attributes'] };
98
+ }
99
+ if (args.action === 'start') {
100
+ await haRequest(config, 'POST', '/api/services/button/press', {
101
+ entity_id: 'button.roborock_qv_35s_saugen_komplett',
102
+ });
103
+ }
104
+ else if (args.action === 'stop') {
105
+ await haRequest(config, 'POST', '/api/services/vacuum/stop', {
106
+ entity_id: 'vacuum.roborock_qv_35s',
107
+ });
108
+ }
109
+ else if (args.action === 'return_to_base') {
110
+ await haRequest(config, 'POST', '/api/services/vacuum/return_to_base', {
111
+ entity_id: 'vacuum.roborock_qv_35s',
112
+ });
113
+ }
114
+ return { success: true, action: args.action };
115
+ }
116
+ async function handleSensors(_args, config) {
117
+ const sensorIds = [
118
+ 'sensor.wohnzimmer_temperatur',
119
+ 'sensor.wohnzimmer_luftfeuchtigkeit',
120
+ 'sensor.kuche_temperatur',
121
+ 'sensor.kuche_luftfeuchtigkeit',
122
+ 'sensor.badezimmer_temperatur',
123
+ 'sensor.badezimmer_luftfeuchtigkeit',
124
+ 'sensor.indoormodul_co2',
125
+ 'sensor.emre_kohler_aussentemperatur',
126
+ ];
127
+ const results = {};
128
+ await Promise.all(sensorIds.map(async (id) => {
129
+ try {
130
+ const s = await haRequest(config, 'GET', `/api/states/${id}`);
131
+ const attrs = s['attributes'];
132
+ const unit = attrs?.['unit_of_measurement'] ?? '';
133
+ results[id] = `${s['state']} ${unit}`.trim();
134
+ }
135
+ catch {
136
+ results[id] = 'unavailable';
137
+ }
138
+ }));
139
+ return results;
140
+ }
141
+ //# sourceMappingURL=home.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"home.js","sourceRoot":"","sources":["../../src/tools/home.ts"],"names":[],"mappings":"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"}