@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,149 @@
1
+ "use strict";
2
+ /**
3
+ * Shared routing rules and constants used by mcp_help and prompt_split.
4
+ *
5
+ * Extracted so both tools operate from the same knowledge base.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.ROUTING_GUIDE = exports.KNOWN_AGENTS = exports.ROUTING_RULES = void 0;
9
+ exports.matchRules = matchRules;
10
+ exports.ROUTING_RULES = [
11
+ {
12
+ tool: 'codex_run',
13
+ keywords: [
14
+ 'code', 'debug', 'refactor', 'function', 'class', 'bug', 'test', 'script',
15
+ 'typescript', 'javascript', 'python', 'error', 'compile', 'build', 'lint',
16
+ 'implement', 'write a', 'fix the', 'generate code', 'shell', 'bash',
17
+ ],
18
+ reason: 'Coding and file-editing tasks are Codex\'s specialty.',
19
+ },
20
+ {
21
+ tool: 'gemini_run',
22
+ keywords: [
23
+ 'summarize', 'explain', 'analyze', 'what is', 'describe', 'translate',
24
+ 'image', 'photo', 'screenshot', 'long', 'document', 'pdf', 'compare',
25
+ 'research', 'overview', 'draft', 'write an email', 'second opinion',
26
+ ],
27
+ reason: 'Gemini excels at analysis, long-context tasks (1M tokens), and multimodal input.',
28
+ },
29
+ {
30
+ tool: 'openclaw_run',
31
+ keywords: [
32
+ 'trade', 'trading', 'portfolio', 'stock', 'position', 'pnl', 'market',
33
+ 'plugin', 'automation', 'workflow', 'whatsapp',
34
+ 'telegram', 'notify', 'alert', 'openclaw',
35
+ ],
36
+ reason: 'OpenClaw has all trading plugins and custom workflows installed.',
37
+ },
38
+ {
39
+ tool: 'local_llm_run',
40
+ keywords: [
41
+ 'quick', 'simple', 'local', 'offline', 'private', 'classify', 'label',
42
+ 'rewrite', 'format', 'short answer', 'yes or no', 'extract', 'parse',
43
+ 'convert', 'json', 'csv', 'rephrase', 'proofread', 'grammar',
44
+ ],
45
+ reason: 'Local LLM is free, fast, and private. Best for simple classification, formatting, and extraction tasks.',
46
+ },
47
+ {
48
+ tool: 'home_light / home_scene / home_sensors / home_climate / home_vacuum',
49
+ keywords: [
50
+ 'light', 'lamp', 'bright', 'scene', 'temperature', 'thermostat',
51
+ 'vacuum', 'sensor', 'humidity', 'co2', 'room', 'living room', 'bedroom',
52
+ 'kitchen', 'home assistant', 'smart home',
53
+ ],
54
+ reason: 'Home tools connect directly to Home Assistant.',
55
+ },
56
+ {
57
+ tool: 'openclaw_memory_write / openclaw_memory_read_today / openclaw_memory_search',
58
+ keywords: [
59
+ 'remember', 'note', 'memory', 'log', 'record', 'save this', 'remind',
60
+ 'what did i', 'yesterday', 'last week', 'wrote down',
61
+ ],
62
+ reason: 'Memory tools read and write the daily log on the OpenClaw server.',
63
+ },
64
+ {
65
+ tool: 'openclaw_cron_list / openclaw_cron_run / openclaw_cron_status',
66
+ keywords: [
67
+ 'cron', 'scheduled', 'job', 'task', 'trigger', 'run now', 'schedule',
68
+ ],
69
+ reason: 'Cron tools manage and trigger OpenClaw scheduled jobs.',
70
+ },
71
+ ];
72
+ /** Score routing rules against a text. Returns matches sorted by score (highest first). */
73
+ function matchRules(text) {
74
+ const lower = text.toLowerCase();
75
+ const matches = [];
76
+ for (const rule of exports.ROUTING_RULES) {
77
+ const score = rule.keywords.filter(kw => lower.includes(kw)).length;
78
+ if (score > 0) {
79
+ matches.push({ tool: rule.tool, reason: rule.reason, score });
80
+ }
81
+ }
82
+ matches.sort((a, b) => b.score - a.score);
83
+ return matches;
84
+ }
85
+ /** Known single-call tool names (for validation in prompt_split). */
86
+ exports.KNOWN_AGENTS = new Set([
87
+ 'codex_run', 'gemini_run', 'openclaw_run', 'local_llm_run',
88
+ 'home_light', 'home_scene', 'home_sensors', 'home_climate',
89
+ 'home_vacuum', 'home_get_state',
90
+ 'openclaw_memory_write', 'openclaw_memory_read_today', 'openclaw_memory_search',
91
+ 'openclaw_cron_list', 'openclaw_cron_run', 'openclaw_cron_status',
92
+ ]);
93
+ exports.ROUTING_GUIDE = `
94
+ # elvatis-mcp: Sub-Agent Routing Guide
95
+
96
+ ## Sub-Agents (spawn a separate AI to handle a task)
97
+
98
+ | Tool | Backend | Auth | Strengths |
99
+ |------|---------|------|-----------|
100
+ | \`openclaw_run\` | OpenClaw (claude/gpt/gemini + plugins) | SSH key | Trading plugins, automations, custom workflows, multi-step tasks |
101
+ | \`gemini_run\` | Google Gemini | Google login (cached) | Long context (1M tokens), multimodal, fast analysis, second opinions |
102
+ | \`codex_run\` | OpenAI Codex | OpenAI login (cached) | Coding, debugging, refactoring, file editing, shell scripting |
103
+ | \`local_llm_run\` | Local LLM (Ollama/LM Studio/llama.cpp) | None | Free, private, fast for simple tasks (classify, format, extract, rewrite) |
104
+
105
+ ## Home Automation Tools (direct Home Assistant calls)
106
+
107
+ | Tool | What it does |
108
+ |------|-------------|
109
+ | \`home_light\` | Control any light (on/off/brightness/color) |
110
+ | \`home_climate\` | Set thermostat temperature and HVAC mode |
111
+ | \`home_scene\` | Activate a Hue scene in a room |
112
+ | \`home_vacuum\` | Start, stop, or dock the robot vacuum |
113
+ | \`home_sensors\` | Read all temp/humidity/CO2 sensors |
114
+ | \`home_get_state\` | Read any Home Assistant entity |
115
+
116
+ ## Memory Tools (OpenClaw server)
117
+
118
+ | Tool | What it does |
119
+ |------|-------------|
120
+ | \`openclaw_memory_write\` | Write a note to today's log |
121
+ | \`openclaw_memory_read_today\` | Read today's memory log |
122
+ | \`openclaw_memory_search\` | Search memory across past N days |
123
+
124
+ ## Cron Tools (OpenClaw server)
125
+
126
+ | Tool | What it does |
127
+ |------|-------------|
128
+ | \`openclaw_cron_list\` | List all scheduled cron jobs |
129
+ | \`openclaw_cron_run\` | Trigger a job immediately |
130
+ | \`openclaw_cron_status\` | Get scheduler status and recent runs |
131
+
132
+ ## Prompt Splitting
133
+
134
+ | Tool | What it does |
135
+ |------|-------------|
136
+ | \`prompt_split\` | Analyze a complex prompt and split into sub-tasks with agent assignments |
137
+
138
+ ## Decision Guide
139
+
140
+ - **Coding task** (write/fix/refactor code, shell scripts) -> \`codex_run\`
141
+ - **Trading/portfolio/market task** -> \`openclaw_run\`
142
+ - **Long document, image, or analysis** -> \`gemini_run\`
143
+ - **Simple formatting, extraction, classification** -> \`local_llm_run\`
144
+ - **Smart home control** -> appropriate \`home_*\` tool (no sub-agent needed)
145
+ - **Cross-check / second opinion** -> run both \`gemini_run\` and compare
146
+ - **Complex multi-step task** -> \`prompt_split\` first, then execute the plan
147
+ - **Coding task that also needs context** -> \`codex_run\` first, then \`gemini_run\` to review
148
+ `.trim();
149
+ //# sourceMappingURL=routing-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing-rules.js","sourceRoot":"","sources":["../../src/tools/routing-rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * prompt_split — analyze a complex prompt and split it into sub-tasks.
3
+ *
4
+ * Returns a structured plan showing which sub-agent handles each part,
5
+ * dependency ordering, and the actual prompts to send. The LLM client
6
+ * (Claude) then decides whether to execute them.
7
+ *
8
+ * Strategies:
9
+ * - "auto": short-circuit for single-domain, then try gemini -> local -> heuristic
10
+ * - "gemini": use Gemini CLI for analysis
11
+ * - "local": use local LLM for analysis
12
+ * - "heuristic": pure keyword-based splitting (no LLM call)
13
+ */
14
+ import { z } from 'zod';
15
+ import { Config } from '../config.js';
16
+ export declare const promptSplitSchema: z.ZodObject<{
17
+ prompt: z.ZodString;
18
+ strategy: z.ZodDefault<z.ZodEnum<["auto", "gemini", "local", "heuristic"]>>;
19
+ }, "strip", z.ZodTypeAny, {
20
+ prompt: string;
21
+ strategy: "auto" | "gemini" | "local" | "heuristic";
22
+ }, {
23
+ prompt: string;
24
+ strategy?: "auto" | "gemini" | "local" | "heuristic" | undefined;
25
+ }>;
26
+ export interface Subtask {
27
+ id: string;
28
+ summary: string;
29
+ agent: string;
30
+ /** Suggested model for this subtask. User can override before execution. */
31
+ model: string;
32
+ prompt: string;
33
+ depends_on: string[];
34
+ reason: string;
35
+ }
36
+ export interface SplitPlan {
37
+ original_prompt: string;
38
+ subtasks: Subtask[];
39
+ parallelizable_groups: string[][];
40
+ estimated_total_seconds: number;
41
+ strategy_used: string;
42
+ /** Instructions for the LLM client on how to present and execute this plan. */
43
+ note: string;
44
+ }
45
+ export declare function handlePromptSplit(args: {
46
+ prompt: string;
47
+ strategy: string;
48
+ }, config: Config): Promise<SplitPlan>;
49
+ //# sourceMappingURL=splitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"splitter.d.ts","sourceRoot":"","sources":["../../src/tools/splitter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAMtC,eAAO,MAAM,iBAAiB;;;;;;;;;EAW5B,CAAC;AAIH,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,qBAAqB,EAAE,MAAM,EAAE,EAAE,CAAC;IAClC,uBAAuB,EAAE,MAAM,CAAC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;CACd;AAsUD,wBAAsB,iBAAiB,CACrC,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAC1C,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,SAAS,CAAC,CA6DpB"}
@@ -0,0 +1,375 @@
1
+ "use strict";
2
+ /**
3
+ * prompt_split — analyze a complex prompt and split it into sub-tasks.
4
+ *
5
+ * Returns a structured plan showing which sub-agent handles each part,
6
+ * dependency ordering, and the actual prompts to send. The LLM client
7
+ * (Claude) then decides whether to execute them.
8
+ *
9
+ * Strategies:
10
+ * - "auto": short-circuit for single-domain, then try gemini -> local -> heuristic
11
+ * - "gemini": use Gemini CLI for analysis
12
+ * - "local": use local LLM for analysis
13
+ * - "heuristic": pure keyword-based splitting (no LLM call)
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.promptSplitSchema = void 0;
17
+ exports.handlePromptSplit = handlePromptSplit;
18
+ const zod_1 = require("zod");
19
+ const spawn_js_1 = require("../spawn.js");
20
+ const routing_rules_js_1 = require("./routing-rules.js");
21
+ // --- Schema ---
22
+ exports.promptSplitSchema = zod_1.z.object({
23
+ prompt: zod_1.z.string().describe('The complex prompt to analyze and split into sub-tasks.'),
24
+ strategy: zod_1.z.enum(['auto', 'gemini', 'local', 'heuristic']).default('auto').describe('How to analyze the prompt:\n'
25
+ + ' "auto" (default): tries gemini, then local LLM, then heuristic\n'
26
+ + ' "gemini": use Gemini CLI for smart analysis\n'
27
+ + ' "local": use local LLM (LM Studio/Ollama) for analysis\n'
28
+ + ' "heuristic": pure keyword splitting (no LLM, instant)'),
29
+ });
30
+ /** Default model suggestions per agent. The user can override any of these. */
31
+ const DEFAULT_MODELS = {
32
+ codex_run: 'gpt-5-codex',
33
+ gemini_run: 'gemini-2.5-flash',
34
+ openclaw_run: 'default (server-side)',
35
+ local_llm_run: 'currently loaded model',
36
+ home_light: 'n/a (direct API call)',
37
+ home_scene: 'n/a (direct API call)',
38
+ home_climate: 'n/a (direct API call)',
39
+ home_vacuum: 'n/a (direct API call)',
40
+ home_sensors: 'n/a (direct API call)',
41
+ home_get_state: 'n/a (direct API call)',
42
+ openclaw_memory_write: 'n/a (direct SSH call)',
43
+ openclaw_memory_read_today: 'n/a (direct SSH call)',
44
+ openclaw_memory_search: 'n/a (direct SSH call)',
45
+ openclaw_cron_list: 'n/a (direct SSH call)',
46
+ openclaw_cron_run: 'n/a (direct SSH call)',
47
+ openclaw_cron_status: 'n/a (direct SSH call)',
48
+ };
49
+ // --- LLM analysis prompt ---
50
+ function buildAnalysisPrompt(userPrompt) {
51
+ const agentList = routing_rules_js_1.ROUTING_RULES.map(r => `- ${r.tool}: ${r.reason}`).join('\n');
52
+ return `You are a task planner. Analyze the user's prompt and split it into sub-tasks.
53
+
54
+ Available agents:
55
+ ${agentList}
56
+
57
+ Rules:
58
+ - Each sub-task gets exactly one agent
59
+ - Use depends_on to express ordering (task IDs like "t1", "t2")
60
+ - Tasks with no dependencies can run in parallel
61
+ - Keep prompts self-contained (include necessary context in each)
62
+ - For simple single-agent prompts, return just one task
63
+ - Use local_llm_run for simple formatting, extraction, or classification
64
+ - Use codex_run for coding tasks, gemini_run for analysis, openclaw_run for trading/automation
65
+
66
+ Available models per agent:
67
+ - codex_run: gpt-5-codex, gpt-5.4, o3
68
+ - gemini_run: gemini-2.5-flash, gemini-2.5-pro, gemini-3-pro
69
+ - local_llm_run: phi-4-mini (fast/simple), deepseek-r1-0528-qwen3-8b (reasoning), phi-4-reasoning-plus (quality)
70
+ - openclaw_run: default (uses server-side model selection)
71
+
72
+ Respond with ONLY valid JSON (no markdown fences, no explanation):
73
+ {
74
+ "subtasks": [
75
+ {
76
+ "id": "t1",
77
+ "summary": "short description",
78
+ "agent": "agent_name",
79
+ "model": "suggested model name",
80
+ "prompt": "the actual prompt to send to this agent",
81
+ "depends_on": [],
82
+ "reason": "why this agent and model"
83
+ }
84
+ ]
85
+ }
86
+
87
+ User's prompt:
88
+ ${userPrompt}`;
89
+ }
90
+ // --- Gemini-based analysis ---
91
+ async function splitViaGemini(prompt, config) {
92
+ const analysisPrompt = buildAnalysisPrompt(prompt);
93
+ const model = config.geminiModel ?? 'gemini-2.5-flash';
94
+ const cliArgs = ['-p', analysisPrompt, '--output-format', 'json'];
95
+ cliArgs.push('--model', model);
96
+ let raw;
97
+ try {
98
+ raw = await (0, spawn_js_1.spawnLocal)('gemini', cliArgs, 30000);
99
+ }
100
+ catch {
101
+ return null;
102
+ }
103
+ return parseSubtasksFromJson(raw);
104
+ }
105
+ // --- Local LLM-based analysis ---
106
+ async function splitViaLocalLlm(prompt, config) {
107
+ const endpoint = config.localLlmEndpoint ?? 'http://localhost:1234/v1';
108
+ const model = config.localLlmModel ?? '';
109
+ const url = `${endpoint.replace(/\/+$/, '')}/chat/completions`;
110
+ const body = {
111
+ messages: [
112
+ { role: 'system', content: 'You are a task planner. Respond with ONLY valid JSON, no markdown fences.' },
113
+ { role: 'user', content: buildAnalysisPrompt(prompt) },
114
+ ],
115
+ temperature: 0.1,
116
+ };
117
+ if (model)
118
+ body['model'] = model;
119
+ let response;
120
+ try {
121
+ response = await fetch(url, {
122
+ method: 'POST',
123
+ headers: { 'Content-Type': 'application/json' },
124
+ body: JSON.stringify(body),
125
+ signal: AbortSignal.timeout(60000),
126
+ });
127
+ }
128
+ catch {
129
+ return null;
130
+ }
131
+ if (!response.ok)
132
+ return null;
133
+ try {
134
+ const data = (await response.json());
135
+ const content = data.choices?.[0]?.message?.content ?? '';
136
+ return parseSubtasksFromJson(content);
137
+ }
138
+ catch {
139
+ return null;
140
+ }
141
+ }
142
+ // --- JSON parsing helper ---
143
+ function parseSubtasksFromJson(raw) {
144
+ // Try to extract JSON from the response (handle markdown fences, Gemini envelope, etc.)
145
+ let text = raw.trim();
146
+ // Gemini CLI --output-format json wraps in { response: "..." }
147
+ try {
148
+ const envelope = JSON.parse(text);
149
+ if (envelope.response) {
150
+ text = envelope.response;
151
+ }
152
+ }
153
+ catch {
154
+ // Not a Gemini envelope, use raw text
155
+ }
156
+ // Strip <think>...</think> blocks from reasoning models (Deepseek R1, Phi 4 Reasoning, etc.)
157
+ text = text.replace(/<think>[\s\S]*?<\/think>/g, '').trim();
158
+ // Strip markdown fences
159
+ text = text.replace(/^```(?:json)?\s*/m, '').replace(/\s*```$/m, '').trim();
160
+ try {
161
+ const parsed = JSON.parse(text);
162
+ if (!Array.isArray(parsed.subtasks) || parsed.subtasks.length === 0)
163
+ return null;
164
+ const tasks = parsed.subtasks;
165
+ // Validate and sanitize
166
+ for (const task of tasks) {
167
+ if (!task.id || !task.agent || !task.prompt)
168
+ return null;
169
+ // Remap unknown agents to gemini_run
170
+ if (!routing_rules_js_1.KNOWN_AGENTS.has(task.agent)) {
171
+ task.agent = 'gemini_run';
172
+ task.reason = (task.reason || '') + ' (agent remapped: original not recognized)';
173
+ }
174
+ if (!Array.isArray(task.depends_on))
175
+ task.depends_on = [];
176
+ // Ensure model field exists
177
+ if (!task.model)
178
+ task.model = DEFAULT_MODELS[task.agent] ?? 'default';
179
+ }
180
+ // Validate dependency references
181
+ const ids = new Set(tasks.map(t => t.id));
182
+ for (const task of tasks) {
183
+ task.depends_on = task.depends_on.filter(dep => ids.has(dep));
184
+ }
185
+ return tasks;
186
+ }
187
+ catch {
188
+ return null;
189
+ }
190
+ }
191
+ // --- Heuristic-based splitting ---
192
+ // Patterns that signal sequential ordering
193
+ const SEQUENTIAL_MARKERS = /\b(then|after that|next|finally|once done|when that's done|afterwards|subsequently)\b/i;
194
+ // Patterns that signal parallel/independent tasks
195
+ const PARALLEL_MARKERS = /\b(also|and also|additionally|plus|meanwhile|at the same time|separately)\b/i;
196
+ function splitViaHeuristic(prompt) {
197
+ // Split on sentence boundaries that follow logical connectors
198
+ const fragments = prompt
199
+ .split(/(?<=[.!?])\s+|(?:,?\s*(?:then|after that|next|finally|also|additionally|and then|plus)\s+)/i)
200
+ .map(f => f.trim())
201
+ .filter(f => f.length > 5);
202
+ if (fragments.length <= 1) {
203
+ // Single task, pick best agent
204
+ const matches = (0, routing_rules_js_1.matchRules)(prompt);
205
+ const agent = matches[0]?.tool.split(' / ')[0] ?? 'gemini_run';
206
+ return [{
207
+ id: 't1',
208
+ summary: prompt.substring(0, 80),
209
+ agent,
210
+ model: DEFAULT_MODELS[agent] ?? 'default',
211
+ prompt,
212
+ depends_on: [],
213
+ reason: matches[0]?.reason ?? 'Default to Gemini for general tasks.',
214
+ }];
215
+ }
216
+ const tasks = [];
217
+ let prevId = null;
218
+ for (let i = 0; i < fragments.length; i++) {
219
+ const frag = fragments[i];
220
+ const id = `t${i + 1}`;
221
+ const matches = (0, routing_rules_js_1.matchRules)(frag);
222
+ const agent = matches[0]?.tool.split(' / ')[0] ?? 'gemini_run';
223
+ // Check if this fragment follows a sequential marker in the original prompt
224
+ const beforeFrag = prompt.substring(0, prompt.indexOf(frag));
225
+ const isSequential = SEQUENTIAL_MARKERS.test(beforeFrag.slice(-50));
226
+ const isParallel = PARALLEL_MARKERS.test(beforeFrag.slice(-50));
227
+ const depends_on = [];
228
+ if (prevId && isSequential && !isParallel) {
229
+ depends_on.push(prevId);
230
+ }
231
+ tasks.push({
232
+ id,
233
+ summary: frag.substring(0, 80),
234
+ agent,
235
+ model: DEFAULT_MODELS[agent] ?? 'default',
236
+ prompt: frag,
237
+ depends_on,
238
+ reason: matches[0]?.reason ?? 'Default to Gemini for general tasks.',
239
+ });
240
+ prevId = id;
241
+ }
242
+ return tasks;
243
+ }
244
+ // --- Parallelizable groups computation ---
245
+ function computeGroups(tasks) {
246
+ // Topological sort into execution levels
247
+ const deps = new Map();
248
+ const levels = new Map();
249
+ for (const t of tasks) {
250
+ deps.set(t.id, new Set(t.depends_on));
251
+ }
252
+ // Compute level for each task (max dependency level + 1)
253
+ function getLevel(id, visited) {
254
+ if (levels.has(id))
255
+ return levels.get(id);
256
+ if (visited.has(id))
257
+ return 0; // Break circular dependency
258
+ visited.add(id);
259
+ const taskDeps = deps.get(id);
260
+ if (!taskDeps || taskDeps.size === 0) {
261
+ levels.set(id, 0);
262
+ return 0;
263
+ }
264
+ let maxDep = 0;
265
+ for (const dep of taskDeps) {
266
+ maxDep = Math.max(maxDep, getLevel(dep, visited) + 1);
267
+ }
268
+ levels.set(id, maxDep);
269
+ return maxDep;
270
+ }
271
+ for (const t of tasks) {
272
+ getLevel(t.id, new Set());
273
+ }
274
+ // Group by level
275
+ const groupMap = new Map();
276
+ for (const t of tasks) {
277
+ const level = levels.get(t.id) ?? 0;
278
+ if (!groupMap.has(level))
279
+ groupMap.set(level, []);
280
+ groupMap.get(level).push(t.id);
281
+ }
282
+ return Array.from(groupMap.entries())
283
+ .sort(([a], [b]) => a - b)
284
+ .map(([, ids]) => ids);
285
+ }
286
+ // --- Time estimates ---
287
+ const TIME_ESTIMATES = {
288
+ codex_run: 30,
289
+ gemini_run: 15,
290
+ openclaw_run: 60,
291
+ local_llm_run: 10,
292
+ };
293
+ function estimateTime(tasks, groups) {
294
+ // Sum the max time of each parallel group (sequential execution of groups)
295
+ let total = 0;
296
+ const taskMap = new Map(tasks.map(t => [t.id, t]));
297
+ for (const group of groups) {
298
+ let maxInGroup = 0;
299
+ for (const id of group) {
300
+ const task = taskMap.get(id);
301
+ const agentBase = task?.agent.split('_')[0] ?? '';
302
+ const est = TIME_ESTIMATES[task?.agent ?? ''] ?? (agentBase === 'home' ? 3 : 15);
303
+ maxInGroup = Math.max(maxInGroup, est);
304
+ }
305
+ total += maxInGroup;
306
+ }
307
+ return total;
308
+ }
309
+ // --- Main handler ---
310
+ async function handlePromptSplit(args, config) {
311
+ const { prompt, strategy } = args;
312
+ // Short-circuit: if keyword check shows single domain, skip LLM analysis
313
+ if (strategy === 'auto') {
314
+ const matches = (0, routing_rules_js_1.matchRules)(prompt);
315
+ if (matches.length > 0) {
316
+ const topTool = matches[0].tool;
317
+ const secondScore = matches[1]?.score ?? 0;
318
+ // If top match has 2x the score of second, it's clearly single-domain
319
+ if (matches[0].score >= 2 && matches[0].score > secondScore * 2) {
320
+ const agent = topTool.split(' / ')[0];
321
+ const tasks = [{
322
+ id: 't1',
323
+ summary: prompt.substring(0, 80),
324
+ agent,
325
+ model: DEFAULT_MODELS[agent] ?? 'default',
326
+ prompt,
327
+ depends_on: [],
328
+ reason: matches[0].reason,
329
+ }];
330
+ return buildPlan(prompt, tasks, 'short-circuit', 'Single-domain prompt detected. No splitting needed. Call the suggested agent directly.');
331
+ }
332
+ }
333
+ }
334
+ // Try strategies in order
335
+ let subtasks = null;
336
+ let strategyUsed = strategy;
337
+ if (strategy === 'gemini' || strategy === 'auto') {
338
+ subtasks = await splitViaGemini(prompt, config);
339
+ if (subtasks) {
340
+ strategyUsed = 'gemini';
341
+ }
342
+ }
343
+ if (!subtasks && (strategy === 'local' || strategy === 'auto')) {
344
+ subtasks = await splitViaLocalLlm(prompt, config);
345
+ if (subtasks) {
346
+ strategyUsed = 'local';
347
+ }
348
+ }
349
+ if (!subtasks) {
350
+ subtasks = splitViaHeuristic(prompt);
351
+ strategyUsed = strategy === 'heuristic' ? 'heuristic' : `${strategy}->heuristic (fallback)`;
352
+ }
353
+ const note = subtasks.length === 1
354
+ ? 'This prompt maps to a single agent. No splitting required. '
355
+ + 'Present the suggested agent and model to the user. They can confirm, change the model, or pick a different agent before you execute.'
356
+ : 'IMPORTANT: Present this plan to the user BEFORE executing. Show each subtask with its agent and model. '
357
+ + 'The user may want to: (1) change the model for a specific task (e.g. "use gemini-2.5-pro for t2 instead of flash"), '
358
+ + '(2) swap the agent entirely (e.g. "use local_llm_run for t3 instead of gemini"), '
359
+ + '(3) skip or remove a subtask, (4) adjust dependencies or ordering. '
360
+ + 'Once the user approves (or modifies) the plan, execute sub-tasks in dependency order. '
361
+ + 'Tasks in the same parallelizable_group can be called concurrently.';
362
+ return buildPlan(prompt, subtasks, strategyUsed, note);
363
+ }
364
+ function buildPlan(prompt, subtasks, strategyUsed, note) {
365
+ const groups = computeGroups(subtasks);
366
+ return {
367
+ original_prompt: prompt,
368
+ subtasks,
369
+ parallelizable_groups: groups,
370
+ estimated_total_seconds: estimateTime(subtasks, groups),
371
+ strategy_used: strategyUsed,
372
+ note,
373
+ };
374
+ }
375
+ //# sourceMappingURL=splitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"splitter.js","sourceRoot":"","sources":["../../src/tools/splitter.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;AAiXH,8CAgEC;AA/aD,6BAAwB;AAExB,0CAAyC;AACzC,yDAA6E;AAE7E,iBAAiB;AAEJ,QAAA,iBAAiB,GAAG,OAAC,CAAC,MAAM,CAAC;IACxC,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CACzB,yDAAyD,CAC1D;IACD,QAAQ,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CACjF,8BAA8B;UAC5B,oEAAoE;UACpE,iDAAiD;UACjD,4DAA4D;UAC5D,yDAAyD,CAC5D;CACF,CAAC,CAAC;AAyBH,+EAA+E;AAC/E,MAAM,cAAc,GAA2B;IAC7C,SAAS,EAAE,aAAa;IACxB,UAAU,EAAE,kBAAkB;IAC9B,YAAY,EAAE,uBAAuB;IACrC,aAAa,EAAE,wBAAwB;IACvC,UAAU,EAAE,uBAAuB;IACnC,UAAU,EAAE,uBAAuB;IACnC,YAAY,EAAE,uBAAuB;IACrC,WAAW,EAAE,uBAAuB;IACpC,YAAY,EAAE,uBAAuB;IACrC,cAAc,EAAE,uBAAuB;IACvC,qBAAqB,EAAE,uBAAuB;IAC9C,0BAA0B,EAAE,uBAAuB;IACnD,sBAAsB,EAAE,uBAAuB;IAC/C,kBAAkB,EAAE,uBAAuB;IAC3C,iBAAiB,EAAE,uBAAuB;IAC1C,oBAAoB,EAAE,uBAAuB;CAC9C,CAAC;AAEF,8BAA8B;AAE9B,SAAS,mBAAmB,CAAC,UAAkB;IAC7C,MAAM,SAAS,GAAG,gCAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEhF,OAAO;;;EAGP,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiCT,UAAU,EAAE,CAAC;AACf,CAAC;AAED,gCAAgC;AAEhC,KAAK,UAAU,cAAc,CAC3B,MAAc,EACd,MAAc;IAEd,MAAM,cAAc,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,IAAI,kBAAkB,CAAC;IACvD,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,CAAC,CAAC;IAClE,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAE/B,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,IAAA,qBAAU,EAAC,QAAQ,EAAE,OAAO,EAAE,KAAM,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,qBAAqB,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,mCAAmC;AAEnC,KAAK,UAAU,gBAAgB,CAC7B,MAAc,EACd,MAAc;IAEd,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,IAAI,0BAA0B,CAAC;IACvE,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC;IACzC,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,mBAAmB,CAAC;IAE/D,MAAM,IAAI,GAA4B;QACpC,QAAQ,EAAE;YACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,2EAA2E,EAAE;YACxG,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,CAAC,MAAM,CAAC,EAAE;SACvD;QACD,WAAW,EAAE,GAAG;KACjB,CAAC;IACF,IAAI,KAAK;QAAE,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;IAEjC,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC1B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAM,CAAC;SACpC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAElC,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;QAC1D,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,8BAA8B;AAE9B,SAAS,qBAAqB,CAAC,GAAW;IACxC,wFAAwF;IACxF,IAAI,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAEtB,+DAA+D;IAC/D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA0B,CAAC;QAC3D,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACtB,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAC3B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;IAED,6FAA6F;IAC7F,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAE5D,wBAAwB;IACxB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAE5E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA6B,CAAC;QAC5D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEjF,MAAM,KAAK,GAAG,MAAM,CAAC,QAAqB,CAAC;QAE3C,wBAAwB;QACxB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YACzD,qCAAqC;YACrC,IAAI,CAAC,+BAAY,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClC,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC;gBAC1B,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,4CAA4C,CAAC;YACnF,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;gBAAE,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;YAC1D,4BAA4B;YAC5B,IAAI,CAAC,IAAI,CAAC,KAAK;gBAAE,IAAI,CAAC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC;QACxE,CAAC;QAED,iCAAiC;QACjC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,oCAAoC;AAEpC,2CAA2C;AAC3C,MAAM,kBAAkB,GAAG,wFAAwF,CAAC;AACpH,kDAAkD;AAClD,MAAM,gBAAgB,GAAG,8EAA8E,CAAC;AAExG,SAAS,iBAAiB,CAAC,MAAc;IACvC,8DAA8D;IAC9D,MAAM,SAAS,GAAG,MAAM;SACrB,KAAK,CAAC,6FAA6F,CAAC;SACpG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SAClB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE7B,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC1B,+BAA+B;QAC/B,MAAM,OAAO,GAAG,IAAA,6BAAU,EAAC,MAAM,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC;QAC/D,OAAO,CAAC;gBACN,EAAE,EAAE,IAAI;gBACR,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;gBAChC,KAAK;gBACL,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,IAAI,SAAS;gBACzC,MAAM;gBACN,UAAU,EAAE,EAAE;gBACd,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,sCAAsC;aACrE,CAAC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,IAAI,MAAM,GAAkB,IAAI,CAAC;IAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;QAC3B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAA,6BAAU,EAAC,IAAI,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC;QAE/D,4EAA4E;QAC5E,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7D,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpE,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEhE,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,IAAI,MAAM,IAAI,YAAY,IAAI,CAAC,UAAU,EAAE,CAAC;YAC1C,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;QAED,KAAK,CAAC,IAAI,CAAC;YACT,EAAE;YACF,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;YAC9B,KAAK;YACL,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,IAAI,SAAS;YACzC,MAAM,EAAE,IAAI;YACZ,UAAU;YACV,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,sCAAsC;SACrE,CAAC,CAAC;QAEH,MAAM,GAAG,EAAE,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,4CAA4C;AAE5C,SAAS,aAAa,CAAC,KAAgB;IACrC,yCAAyC;IACzC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEzC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,yDAAyD;IACzD,SAAS,QAAQ,CAAC,EAAU,EAAE,OAAoB;QAChD,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,MAAM,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;QAC3C,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC,4BAA4B;QAC3D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAClB,OAAO,CAAC,CAAC;QACX,CAAC;QAED,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,iBAAiB;IACjB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAClD,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;SAClC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;SACzB,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,yBAAyB;AAEzB,MAAM,cAAc,GAA2B;IAC7C,SAAS,EAAE,EAAE;IACb,UAAU,EAAE,EAAE;IACd,YAAY,EAAE,EAAE;IAChB,aAAa,EAAE,EAAE;CAClB,CAAC;AAEF,SAAS,YAAY,CAAC,KAAgB,EAAE,MAAkB;IACxD,2EAA2E;IAC3E,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7B,MAAM,SAAS,GAAG,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAClD,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACjF,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACzC,CAAC;QACD,KAAK,IAAI,UAAU,CAAC;IACtB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,uBAAuB;AAEhB,KAAK,UAAU,iBAAiB,CACrC,IAA0C,EAC1C,MAAc;IAEd,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAElC,yEAAyE;IACzE,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,IAAA,6BAAU,EAAC,MAAM,CAAC,CAAC;QACnC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;YACjC,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;YAC3C,sEAAsE;YACtE,IAAI,OAAO,CAAC,CAAC,CAAE,CAAC,KAAK,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,CAAE,CAAC,KAAK,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC;gBAClE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,CAAC;gBACvC,MAAM,KAAK,GAAc,CAAC;wBACxB,EAAE,EAAE,IAAI;wBACR,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;wBAChC,KAAK;wBACL,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,IAAI,SAAS;wBACzC,MAAM;wBACN,UAAU,EAAE,EAAE;wBACd,MAAM,EAAE,OAAO,CAAC,CAAC,CAAE,CAAC,MAAM;qBAC3B,CAAC,CAAC;gBACH,OAAO,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,eAAe,EAC7C,wFAAwF,CAAC,CAAC;YAC9F,CAAC;QACH,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,IAAI,QAAQ,GAAqB,IAAI,CAAC;IACtC,IAAI,YAAY,GAAG,QAAQ,CAAC;IAE5B,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACjD,QAAQ,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChD,IAAI,QAAQ,EAAE,CAAC;YACb,YAAY,GAAG,QAAQ,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,MAAM,CAAC,EAAE,CAAC;QAC/D,QAAQ,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAClD,IAAI,QAAQ,EAAE,CAAC;YACb,YAAY,GAAG,OAAO,CAAC;QACzB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACrC,YAAY,GAAG,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,QAAQ,wBAAwB,CAAC;IAC9F,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC;QAChC,CAAC,CAAC,6DAA6D;cAC3D,sIAAsI;QAC1I,CAAC,CAAC,yGAAyG;cACvG,sHAAsH;cACtH,mFAAmF;cACnF,qEAAqE;cACrE,wFAAwF;cACxF,oEAAoE,CAAC;IAE3E,OAAO,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,SAAS,CAChB,MAAc,EACd,QAAmB,EACnB,YAAoB,EACpB,IAAY;IAEZ,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvC,OAAO;QACL,eAAe,EAAE,MAAM;QACvB,QAAQ;QACR,qBAAqB,EAAE,MAAM;QAC7B,uBAAuB,EAAE,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC;QACvD,aAAa,EAAE,YAAY;QAC3B,IAAI;KACL,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@elvatis_com/elvatis-mcp",
3
+ "version": "0.2.0",
4
+ "description": "MCP server for OpenClaw — expose smart home, memory, cron, and more to Claude Desktop, Cursor, Windsurf, and any MCP client",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "elvatis-mcp": "dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsc --watch",
13
+ "start": "node dist/index.js",
14
+ "typecheck": "tsc --noEmit",
15
+ "prepare": "npm run build",
16
+ "prepublishOnly": "npm run typecheck && npm run build"
17
+ },
18
+ "keywords": [
19
+ "mcp",
20
+ "model-context-protocol",
21
+ "openclaw",
22
+ "elvatis",
23
+ "home-assistant",
24
+ "ai",
25
+ "claude"
26
+ ],
27
+ "author": "Elvatis <emre.kohler@elvatis.com>",
28
+ "license": "Apache-2.0",
29
+ "dependencies": {
30
+ "@modelcontextprotocol/sdk": "^1.10.2",
31
+ "dotenv": "^16.4.7",
32
+ "zod": "^3.24.2"
33
+ },
34
+ "devDependencies": {
35
+ "@types/node": "^22.0.0",
36
+ "typescript": "^5.9.3"
37
+ },
38
+ "engines": {
39
+ "node": ">=18"
40
+ },
41
+ "files": [
42
+ "dist",
43
+ "README.md",
44
+ "LICENSE",
45
+ ".env.example"
46
+ ],
47
+ "repository": {
48
+ "type": "git",
49
+ "url": "https://github.com/elvatis/elvatis-mcp.git"
50
+ },
51
+ "publishConfig": {
52
+ "access": "public"
53
+ }
54
+ }