@minicor/mcp-server 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +169 -0
- package/dist/__tests__/diff.test.d.ts +2 -0
- package/dist/__tests__/diff.test.d.ts.map +1 -0
- package/dist/__tests__/diff.test.js +23 -0
- package/dist/__tests__/diff.test.js.map +1 -0
- package/dist/__tests__/helpers.test.d.ts +2 -0
- package/dist/__tests__/helpers.test.d.ts.map +1 -0
- package/dist/__tests__/helpers.test.js +70 -0
- package/dist/__tests__/helpers.test.js.map +1 -0
- package/dist/__tests__/inspect-scripts.test.d.ts +2 -0
- package/dist/__tests__/inspect-scripts.test.d.ts.map +1 -0
- package/dist/__tests__/inspect-scripts.test.js +66 -0
- package/dist/__tests__/inspect-scripts.test.js.map +1 -0
- package/dist/browser-client.d.ts +42 -0
- package/dist/browser-client.d.ts.map +1 -0
- package/dist/browser-client.js +66 -0
- package/dist/browser-client.js.map +1 -0
- package/dist/cli.d.ts +14 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +256 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +21 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +57 -0
- package/dist/config.js.map +1 -0
- package/dist/diff.d.ts +7 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +97 -0
- package/dist/diff.js.map +1 -0
- package/dist/helpers.d.ts +28 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +91 -0
- package/dist/helpers.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +193 -0
- package/dist/index.js.map +1 -0
- package/dist/inspect-scripts.d.ts +18 -0
- package/dist/inspect-scripts.d.ts.map +1 -0
- package/dist/inspect-scripts.js +572 -0
- package/dist/inspect-scripts.js.map +1 -0
- package/dist/laminar-client.d.ts +160 -0
- package/dist/laminar-client.d.ts.map +1 -0
- package/dist/laminar-client.js +237 -0
- package/dist/laminar-client.js.map +1 -0
- package/dist/lds-client.d.ts +107 -0
- package/dist/lds-client.d.ts.map +1 -0
- package/dist/lds-client.js +81 -0
- package/dist/lds-client.js.map +1 -0
- package/dist/paths.d.ts +17 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +46 -0
- package/dist/paths.js.map +1 -0
- package/dist/prompts/build-browser-rpa.d.ts +3 -0
- package/dist/prompts/build-browser-rpa.d.ts.map +1 -0
- package/dist/prompts/build-browser-rpa.js +90 -0
- package/dist/prompts/build-browser-rpa.js.map +1 -0
- package/dist/prompts/build-rpa.d.ts +3 -0
- package/dist/prompts/build-rpa.d.ts.map +1 -0
- package/dist/prompts/build-rpa.js +168 -0
- package/dist/prompts/build-rpa.js.map +1 -0
- package/dist/prompts/debug-execution.d.ts +3 -0
- package/dist/prompts/debug-execution.d.ts.map +1 -0
- package/dist/prompts/debug-execution.js +50 -0
- package/dist/prompts/debug-execution.js.map +1 -0
- package/dist/prompts/workflow-guide.d.ts +3 -0
- package/dist/prompts/workflow-guide.d.ts.map +1 -0
- package/dist/prompts/workflow-guide.js +175 -0
- package/dist/prompts/workflow-guide.js.map +1 -0
- package/dist/services.d.ts +61 -0
- package/dist/services.d.ts.map +1 -0
- package/dist/services.js +249 -0
- package/dist/services.js.map +1 -0
- package/dist/setup.d.ts +11 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +790 -0
- package/dist/setup.js.map +1 -0
- package/dist/state.d.ts +23 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +24 -0
- package/dist/state.js.map +1 -0
- package/dist/sync.d.ts +86 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +394 -0
- package/dist/sync.js.map +1 -0
- package/dist/tools/browser.d.ts +3 -0
- package/dist/tools/browser.d.ts.map +1 -0
- package/dist/tools/browser.js +254 -0
- package/dist/tools/browser.js.map +1 -0
- package/dist/tools/config-stores.d.ts +3 -0
- package/dist/tools/config-stores.d.ts.map +1 -0
- package/dist/tools/config-stores.js +54 -0
- package/dist/tools/config-stores.js.map +1 -0
- package/dist/tools/core.d.ts +3 -0
- package/dist/tools/core.d.ts.map +1 -0
- package/dist/tools/core.js +202 -0
- package/dist/tools/core.js.map +1 -0
- package/dist/tools/cron.d.ts +3 -0
- package/dist/tools/cron.d.ts.map +1 -0
- package/dist/tools/cron.js +168 -0
- package/dist/tools/cron.js.map +1 -0
- package/dist/tools/elasticsearch.d.ts +3 -0
- package/dist/tools/elasticsearch.d.ts.map +1 -0
- package/dist/tools/elasticsearch.js +248 -0
- package/dist/tools/elasticsearch.js.map +1 -0
- package/dist/tools/issues.d.ts +3 -0
- package/dist/tools/issues.d.ts.map +1 -0
- package/dist/tools/issues.js +39 -0
- package/dist/tools/issues.js.map +1 -0
- package/dist/tools/stats.d.ts +3 -0
- package/dist/tools/stats.d.ts.map +1 -0
- package/dist/tools/stats.js +18 -0
- package/dist/tools/stats.js.map +1 -0
- package/dist/tools/sync-tools.d.ts +3 -0
- package/dist/tools/sync-tools.d.ts.map +1 -0
- package/dist/tools/sync-tools.js +121 -0
- package/dist/tools/sync-tools.js.map +1 -0
- package/dist/tools/vm-rpa.d.ts +3 -0
- package/dist/tools/vm-rpa.d.ts.map +1 -0
- package/dist/tools/vm-rpa.js +281 -0
- package/dist/tools/vm-rpa.js.map +1 -0
- package/dist/tools/vm.d.ts +3 -0
- package/dist/tools/vm.d.ts.map +1 -0
- package/dist/tools/vm.js +280 -0
- package/dist/tools/vm.js.map +1 -0
- package/dist/tools/workflow-ops.d.ts +3 -0
- package/dist/tools/workflow-ops.d.ts.map +1 -0
- package/dist/tools/workflow-ops.js +313 -0
- package/dist/tools/workflow-ops.js.map +1 -0
- package/dist/types.d.ts +14 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +58 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Laminar CLI — manage workflows from the terminal or CI/CD pipelines.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* laminar init --workspace <id> [--output <dir>]
|
|
7
|
+
* laminar pull [--all | --workflow <id> --output <dir>]
|
|
8
|
+
* laminar push [--changed | --workflow <dir>]
|
|
9
|
+
* laminar diff [--all | --workflow <dir>]
|
|
10
|
+
*
|
|
11
|
+
* Auth: Set LAMINAR_API_KEY env var, or run `laminar-mcp-setup` first.
|
|
12
|
+
*/
|
|
13
|
+
import path from "node:path";
|
|
14
|
+
import fs from "node:fs";
|
|
15
|
+
import os from "node:os";
|
|
16
|
+
import { LaminarClient } from "./laminar-client.js";
|
|
17
|
+
import { initProject, pullWorkflow, pullAll, pushWorkflow, pushChanged, syncStatus, readManifest, } from "./sync.js";
|
|
18
|
+
const TOKEN_PATH = path.join(os.homedir(), ".laminar", "tokens.json");
|
|
19
|
+
const CONFIG_PATH = path.join(os.homedir(), ".laminar", "config.json");
|
|
20
|
+
// ── Auth ─────────────────────────────────────────────────────
|
|
21
|
+
function resolveAuth() {
|
|
22
|
+
const apiKey = process.env.LAMINAR_API_KEY;
|
|
23
|
+
if (apiKey) {
|
|
24
|
+
const base = process.env.LAMINAR_API_BASE || "https://api.laminar.run";
|
|
25
|
+
return { auth: { type: "apiKey", token: apiKey }, baseUrl: base };
|
|
26
|
+
}
|
|
27
|
+
const accessToken = process.env.LAMINAR_ACCESS_TOKEN;
|
|
28
|
+
if (accessToken) {
|
|
29
|
+
const base = process.env.LAMINAR_API_BASE || "https://api.laminar.run";
|
|
30
|
+
return { auth: { type: "bearer", token: accessToken }, baseUrl: base };
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
if (fs.existsSync(TOKEN_PATH)) {
|
|
34
|
+
const tokens = JSON.parse(fs.readFileSync(TOKEN_PATH, "utf-8"));
|
|
35
|
+
return {
|
|
36
|
+
auth: { type: "bearer", token: tokens.access_token },
|
|
37
|
+
baseUrl: tokens.api_base || "https://api.laminar.run",
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch { }
|
|
42
|
+
console.error("No auth found. Set LAMINAR_API_KEY or run: laminar-mcp-setup");
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
// ── Arg parsing ──────────────────────────────────────────────
|
|
46
|
+
function parseArgs(args) {
|
|
47
|
+
const command = args[0] || "help";
|
|
48
|
+
const flags = {};
|
|
49
|
+
for (let i = 1; i < args.length; i++) {
|
|
50
|
+
const arg = args[i];
|
|
51
|
+
if (arg.startsWith("--")) {
|
|
52
|
+
const key = arg.slice(2);
|
|
53
|
+
const next = args[i + 1];
|
|
54
|
+
if (next && !next.startsWith("--")) {
|
|
55
|
+
flags[key] = next;
|
|
56
|
+
i++;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
flags[key] = true;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return { command, flags };
|
|
64
|
+
}
|
|
65
|
+
function flag(flags, key) {
|
|
66
|
+
const v = flags[key];
|
|
67
|
+
return typeof v === "string" ? v : undefined;
|
|
68
|
+
}
|
|
69
|
+
function requireFlag(flags, key, desc) {
|
|
70
|
+
const v = flag(flags, key);
|
|
71
|
+
if (!v) {
|
|
72
|
+
console.error(`Missing required flag: --${key} (${desc})`);
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
return v;
|
|
76
|
+
}
|
|
77
|
+
// ── Commands ─────────────────────────────────────────────────
|
|
78
|
+
async function cmdInit(client, flags) {
|
|
79
|
+
const workspaceId = parseInt(requireFlag(flags, "workspace", "Workspace ID"));
|
|
80
|
+
const outputDir = path.resolve(flag(flags, "output") || ".");
|
|
81
|
+
console.log(`Initializing project from workspace ${workspaceId}...`);
|
|
82
|
+
const result = await initProject(client, workspaceId, outputDir);
|
|
83
|
+
console.log(`\nPulled ${result.workflowsPulled} workflows to ${result.projectDir}`);
|
|
84
|
+
console.log("\nNext steps:");
|
|
85
|
+
console.log(" git init && git add . && git commit -m 'Initial Laminar workflow sync'");
|
|
86
|
+
console.log(" git remote add origin <your-github-repo-url>");
|
|
87
|
+
console.log(" git push -u origin main");
|
|
88
|
+
console.log(" Add LAMINAR_API_KEY as a GitHub repo secret");
|
|
89
|
+
}
|
|
90
|
+
async function cmdPull(client, flags) {
|
|
91
|
+
if (flags.all) {
|
|
92
|
+
const projectDir = path.resolve(flag(flags, "project") || ".");
|
|
93
|
+
console.log(`Pulling all workflows from manifest...`);
|
|
94
|
+
const result = await pullAll(client, projectDir);
|
|
95
|
+
for (const p of result.pulled) {
|
|
96
|
+
console.log(` ✓ ${p.workflow}: ${p.steps} steps`);
|
|
97
|
+
}
|
|
98
|
+
for (const e of result.errors) {
|
|
99
|
+
console.error(` ✗ ${e.workflow}: ${e.error}`);
|
|
100
|
+
}
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const workflowId = parseInt(requireFlag(flags, "workflow", "Workflow ID"));
|
|
104
|
+
const outputDir = path.resolve(requireFlag(flags, "output", "Output directory"));
|
|
105
|
+
console.log(`Pulling workflow ${workflowId}...`);
|
|
106
|
+
const result = await pullWorkflow(client, workflowId, outputDir);
|
|
107
|
+
console.log(` ✓ ${result.stepsWritten} steps → ${result.directory}`);
|
|
108
|
+
}
|
|
109
|
+
async function cmdPush(client, flags) {
|
|
110
|
+
if (flags.changed) {
|
|
111
|
+
const projectDir = path.resolve(flag(flags, "project") || ".");
|
|
112
|
+
console.log("Pushing changed workflows...");
|
|
113
|
+
const result = await pushChanged(client, projectDir);
|
|
114
|
+
for (const p of result.pushed) {
|
|
115
|
+
console.log(` ✓ ${p.workflow}: deployed ${p.steps} steps`);
|
|
116
|
+
for (const d of p.details) {
|
|
117
|
+
console.log(` ${d.step} → ${d.action}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
for (const u of result.unchanged) {
|
|
121
|
+
console.log(` - ${u}: no changes`);
|
|
122
|
+
}
|
|
123
|
+
for (const e of result.errors) {
|
|
124
|
+
console.error(` ✗ ${e.workflow}: ${e.error}`);
|
|
125
|
+
}
|
|
126
|
+
console.log(`\nDone: ${result.pushed.length} deployed, ${result.unchanged.length} unchanged, ${result.errors.length} errors`);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const workflowDir = path.resolve(requireFlag(flags, "workflow", "Workflow directory"));
|
|
130
|
+
console.log(`Pushing workflow from ${workflowDir}...`);
|
|
131
|
+
const result = await pushWorkflow(client, workflowDir);
|
|
132
|
+
console.log(` ✓ ${result.stepsPushed} steps deployed to workflow ${result.workflowId}`);
|
|
133
|
+
}
|
|
134
|
+
async function cmdDiff(client, flags) {
|
|
135
|
+
if (flags.all || flags.json) {
|
|
136
|
+
const projectDir = path.resolve(flag(flags, "project") || ".");
|
|
137
|
+
const manifest = readManifest(projectDir);
|
|
138
|
+
const workflowsDir = path.join(projectDir, "workflows");
|
|
139
|
+
const allDiffs = {};
|
|
140
|
+
for (const [dirName, wf] of Object.entries(manifest.workflows)) {
|
|
141
|
+
const wfDir = path.join(workflowsDir, dirName);
|
|
142
|
+
try {
|
|
143
|
+
const status = await syncStatus(client, wfDir, wf.id);
|
|
144
|
+
allDiffs[`${wf.name} (${wf.id})`] = status.changes;
|
|
145
|
+
}
|
|
146
|
+
catch (e) {
|
|
147
|
+
allDiffs[`${wf.name} (${wf.id})`] = [
|
|
148
|
+
{ step: "error", status: "error", diff: e.message },
|
|
149
|
+
];
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (flags.json) {
|
|
153
|
+
console.log(JSON.stringify(allDiffs, null, 2));
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
for (const [wfName, changes] of Object.entries(allDiffs)) {
|
|
157
|
+
const modified = changes.filter((c) => c.status !== "unchanged");
|
|
158
|
+
if (modified.length === 0) {
|
|
159
|
+
console.log(`${wfName}: no changes`);
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
console.log(`\n${wfName}:`);
|
|
163
|
+
for (const c of changes) {
|
|
164
|
+
if (c.status === "unchanged")
|
|
165
|
+
continue;
|
|
166
|
+
console.log(` ${c.status.toUpperCase()} ${c.step}`);
|
|
167
|
+
if (c.diff) {
|
|
168
|
+
for (const line of c.diff.split("\n").slice(0, 20)) {
|
|
169
|
+
console.log(` ${line}`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
const workflowDir = path.resolve(requireFlag(flags, "workflow", "Workflow directory"));
|
|
177
|
+
const result = await syncStatus(client, workflowDir);
|
|
178
|
+
for (const c of result.changes) {
|
|
179
|
+
const icon = c.status === "unchanged" ? "-" : c.status === "modified" ? "M" : "+";
|
|
180
|
+
console.log(` ${icon} ${c.step}`);
|
|
181
|
+
if (c.diff) {
|
|
182
|
+
for (const line of c.diff.split("\n").slice(0, 20)) {
|
|
183
|
+
console.log(` ${line}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function showHelp() {
|
|
189
|
+
console.log(`
|
|
190
|
+
Laminar CLI — manage workflows from the terminal
|
|
191
|
+
|
|
192
|
+
Usage:
|
|
193
|
+
laminar <command> [flags]
|
|
194
|
+
|
|
195
|
+
Commands:
|
|
196
|
+
init Scaffold a project from a Laminar workspace
|
|
197
|
+
--workspace <id> Workspace ID (required)
|
|
198
|
+
--output <dir> Output directory (default: .)
|
|
199
|
+
|
|
200
|
+
pull Download workflows from Laminar
|
|
201
|
+
--all Pull all workflows in laminar.json
|
|
202
|
+
--workflow <id> Pull a specific workflow ID
|
|
203
|
+
--output <dir> Output directory (with --workflow)
|
|
204
|
+
--project <dir> Project root (with --all, default: .)
|
|
205
|
+
|
|
206
|
+
push Deploy workflows to Laminar
|
|
207
|
+
--changed Push only modified workflows from laminar.json
|
|
208
|
+
--workflow <dir> Push a specific workflow directory
|
|
209
|
+
--project <dir> Project root (with --changed, default: .)
|
|
210
|
+
|
|
211
|
+
diff Compare local files against deployed
|
|
212
|
+
--all Diff all workflows in laminar.json
|
|
213
|
+
--json Output as JSON (for CI)
|
|
214
|
+
--workflow <dir> Diff a specific workflow directory
|
|
215
|
+
--project <dir> Project root (with --all, default: .)
|
|
216
|
+
|
|
217
|
+
help Show this message
|
|
218
|
+
|
|
219
|
+
Auth:
|
|
220
|
+
Set LAMINAR_API_KEY env var, or run laminar-mcp-setup first.
|
|
221
|
+
`);
|
|
222
|
+
}
|
|
223
|
+
// ── Main ─────────────────────────────────────────────────────
|
|
224
|
+
async function main() {
|
|
225
|
+
const { command, flags } = parseArgs(process.argv.slice(2));
|
|
226
|
+
if (command === "help" || flags.help) {
|
|
227
|
+
showHelp();
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
const { auth, baseUrl } = resolveAuth();
|
|
231
|
+
const client = new LaminarClient(auth, baseUrl);
|
|
232
|
+
switch (command) {
|
|
233
|
+
case "init":
|
|
234
|
+
await cmdInit(client, flags);
|
|
235
|
+
break;
|
|
236
|
+
case "pull":
|
|
237
|
+
await cmdPull(client, flags);
|
|
238
|
+
break;
|
|
239
|
+
case "push":
|
|
240
|
+
await cmdPush(client, flags);
|
|
241
|
+
break;
|
|
242
|
+
case "diff":
|
|
243
|
+
case "status":
|
|
244
|
+
await cmdDiff(client, flags);
|
|
245
|
+
break;
|
|
246
|
+
default:
|
|
247
|
+
console.error(`Unknown command: ${command}`);
|
|
248
|
+
showHelp();
|
|
249
|
+
process.exit(1);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
main().catch((err) => {
|
|
253
|
+
console.error(`Error: ${err.message}`);
|
|
254
|
+
process.exit(1);
|
|
255
|
+
});
|
|
256
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optional service configuration for Minicor MCP.
|
|
3
|
+
*
|
|
4
|
+
* Priority: env vars > config file (~/.minicor/config.json, falls back to ~/.laminar/config.json)
|
|
5
|
+
*/
|
|
6
|
+
export interface ElasticsearchConfig {
|
|
7
|
+
endpoint: string;
|
|
8
|
+
apiKey: string;
|
|
9
|
+
indexName?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface CronConfig {
|
|
12
|
+
apiBase?: string;
|
|
13
|
+
apiKey: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ServiceConfig {
|
|
16
|
+
elasticsearch?: ElasticsearchConfig;
|
|
17
|
+
cron?: CronConfig;
|
|
18
|
+
}
|
|
19
|
+
export declare function loadServiceConfig(): ServiceConfig;
|
|
20
|
+
export declare function saveServiceConfig(update: ServiceConfig): void;
|
|
21
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED,wBAAgB,iBAAiB,IAAI,aAAa,CAkCjD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,QAiBtD"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optional service configuration for Minicor MCP.
|
|
3
|
+
*
|
|
4
|
+
* Priority: env vars > config file (~/.minicor/config.json, falls back to ~/.laminar/config.json)
|
|
5
|
+
*/
|
|
6
|
+
import fs from "node:fs";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import { getConfigPath, getWriteConfigPath } from "./paths.js";
|
|
9
|
+
export function loadServiceConfig() {
|
|
10
|
+
const config = {};
|
|
11
|
+
if (process.env.ELASTICSEARCH_ENDPOINT && process.env.ELASTICSEARCH_API_KEY) {
|
|
12
|
+
config.elasticsearch = {
|
|
13
|
+
endpoint: process.env.ELASTICSEARCH_ENDPOINT,
|
|
14
|
+
apiKey: process.env.ELASTICSEARCH_API_KEY,
|
|
15
|
+
indexName: process.env.ELASTICSEARCH_INDEX_NAME,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
if (process.env.CRON_API_KEY) {
|
|
19
|
+
config.cron = {
|
|
20
|
+
apiBase: process.env.CRON_API_BASE,
|
|
21
|
+
apiKey: process.env.CRON_API_KEY,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
const cfgPath = getConfigPath();
|
|
26
|
+
if (fs.existsSync(cfgPath)) {
|
|
27
|
+
const file = JSON.parse(fs.readFileSync(cfgPath, "utf-8"));
|
|
28
|
+
if (!config.elasticsearch && file.elasticsearch) {
|
|
29
|
+
config.elasticsearch = file.elasticsearch;
|
|
30
|
+
}
|
|
31
|
+
if (!config.cron && file.cron) {
|
|
32
|
+
config.cron = file.cron;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch { }
|
|
37
|
+
return config;
|
|
38
|
+
}
|
|
39
|
+
export function saveServiceConfig(update) {
|
|
40
|
+
const writePath = getWriteConfigPath();
|
|
41
|
+
const dir = path.dirname(writePath);
|
|
42
|
+
if (!fs.existsSync(dir))
|
|
43
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
44
|
+
let existing = {};
|
|
45
|
+
try {
|
|
46
|
+
const readPath = getConfigPath();
|
|
47
|
+
if (fs.existsSync(readPath)) {
|
|
48
|
+
existing = JSON.parse(fs.readFileSync(readPath, "utf-8"));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch { }
|
|
52
|
+
const merged = { ...existing, ...update };
|
|
53
|
+
fs.writeFileSync(writePath, JSON.stringify(merged, null, 2) + "\n", {
|
|
54
|
+
mode: 0o600,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAkB/D,MAAM,UAAU,iBAAiB;IAC/B,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;QAC5E,MAAM,CAAC,aAAa,GAAG;YACrB,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB;YAC5C,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB;YACzC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB;SAChD,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,GAAG;YACZ,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa;YAClC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;SACjC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;QAChC,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAkB,IAAI,CAAC,KAAK,CACpC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAClC,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBAChD,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;YAC5C,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC9B,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACpC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEhE,IAAI,QAAQ,GAAkB,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAC;QACjC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1C,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;QAClE,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;AACL,CAAC"}
|
package/dist/diff.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple line-by-line diff using LCS.
|
|
3
|
+
* No external dependencies — good enough for workflow step sizes (< 500 lines).
|
|
4
|
+
* Outputs a context-limited diff (3 lines of context around changes).
|
|
5
|
+
*/
|
|
6
|
+
export declare function computeDiff(a: string, b: string, labelA?: string, labelB?: string): string;
|
|
7
|
+
//# sourceMappingURL=diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAyCH,wBAAgB,WAAW,CACzB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,MAAM,SAAY,EAClB,MAAM,SAAa,GAClB,MAAM,CAuER"}
|
package/dist/diff.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple line-by-line diff using LCS.
|
|
3
|
+
* No external dependencies — good enough for workflow step sizes (< 500 lines).
|
|
4
|
+
* Outputs a context-limited diff (3 lines of context around changes).
|
|
5
|
+
*/
|
|
6
|
+
const CONTEXT = 3;
|
|
7
|
+
function lcs(a, b) {
|
|
8
|
+
const n = a.length;
|
|
9
|
+
const m = b.length;
|
|
10
|
+
const dp = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0));
|
|
11
|
+
for (let i = 1; i <= n; i++) {
|
|
12
|
+
for (let j = 1; j <= m; j++) {
|
|
13
|
+
dp[i][j] =
|
|
14
|
+
a[i - 1] === b[j - 1]
|
|
15
|
+
? dp[i - 1][j - 1] + 1
|
|
16
|
+
: Math.max(dp[i - 1][j], dp[i][j - 1]);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const result = [];
|
|
20
|
+
let i = n, j = m;
|
|
21
|
+
while (i > 0 && j > 0) {
|
|
22
|
+
if (a[i - 1] === b[j - 1]) {
|
|
23
|
+
result.unshift(a[--i]);
|
|
24
|
+
j--;
|
|
25
|
+
}
|
|
26
|
+
else if (dp[i - 1][j] > dp[i][j - 1]) {
|
|
27
|
+
i--;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
j--;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
export function computeDiff(a, b, labelA = "current", labelB = "proposed") {
|
|
36
|
+
if (a === b)
|
|
37
|
+
return "No differences found.";
|
|
38
|
+
const linesA = a.split("\n");
|
|
39
|
+
const linesB = b.split("\n");
|
|
40
|
+
const common = lcs(linesA, linesB);
|
|
41
|
+
// Build full diff ops list
|
|
42
|
+
const ops = [];
|
|
43
|
+
let iA = 0, iB = 0, iC = 0;
|
|
44
|
+
while (iA < linesA.length || iB < linesB.length) {
|
|
45
|
+
if (iC < common.length) {
|
|
46
|
+
while (iA < linesA.length && linesA[iA] !== common[iC]) {
|
|
47
|
+
ops.push({ type: "del", text: linesA[iA++] });
|
|
48
|
+
}
|
|
49
|
+
while (iB < linesB.length && linesB[iB] !== common[iC]) {
|
|
50
|
+
ops.push({ type: "add", text: linesB[iB++] });
|
|
51
|
+
}
|
|
52
|
+
ops.push({ type: "keep", text: common[iC] });
|
|
53
|
+
iA++;
|
|
54
|
+
iB++;
|
|
55
|
+
iC++;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
while (iA < linesA.length)
|
|
59
|
+
ops.push({ type: "del", text: linesA[iA++] });
|
|
60
|
+
while (iB < linesB.length)
|
|
61
|
+
ops.push({ type: "add", text: linesB[iB++] });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Now emit only changes with CONTEXT lines of surrounding context.
|
|
65
|
+
// Find indices of change lines, then include nearby keep lines.
|
|
66
|
+
const changeIndices = new Set();
|
|
67
|
+
for (let i = 0; i < ops.length; i++) {
|
|
68
|
+
if (ops[i].type !== "keep") {
|
|
69
|
+
for (let j = Math.max(0, i - CONTEXT); j <= Math.min(ops.length - 1, i + CONTEXT); j++) {
|
|
70
|
+
changeIndices.add(j);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const out = [`--- ${labelA}`, `+++ ${labelB}`];
|
|
75
|
+
let lastEmitted = -2;
|
|
76
|
+
for (let i = 0; i < ops.length; i++) {
|
|
77
|
+
if (!changeIndices.has(i))
|
|
78
|
+
continue;
|
|
79
|
+
if (i > lastEmitted + 1) {
|
|
80
|
+
out.push("...");
|
|
81
|
+
}
|
|
82
|
+
const op = ops[i];
|
|
83
|
+
if (op.type === "keep")
|
|
84
|
+
out.push(` ${op.text}`);
|
|
85
|
+
else if (op.type === "del")
|
|
86
|
+
out.push(`- ${op.text}`);
|
|
87
|
+
else
|
|
88
|
+
out.push(`+ ${op.text}`);
|
|
89
|
+
lastEmitted = i;
|
|
90
|
+
}
|
|
91
|
+
const added = ops.filter((o) => o.type === "add").length;
|
|
92
|
+
const removed = ops.filter((o) => o.type === "del").length;
|
|
93
|
+
out.push("");
|
|
94
|
+
out.push(`Summary: +${added} -${removed} lines changed`);
|
|
95
|
+
return out.join("\n");
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=diff.js.map
|
package/dist/diff.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared MCP response helpers and error message constants.
|
|
3
|
+
*/
|
|
4
|
+
export declare function json(data: unknown): string;
|
|
5
|
+
export declare function ok(data: unknown): {
|
|
6
|
+
content: {
|
|
7
|
+
type: "text";
|
|
8
|
+
text: string;
|
|
9
|
+
}[];
|
|
10
|
+
};
|
|
11
|
+
export declare function text(msg: string): {
|
|
12
|
+
content: {
|
|
13
|
+
type: "text";
|
|
14
|
+
text: string;
|
|
15
|
+
}[];
|
|
16
|
+
};
|
|
17
|
+
export declare function safe<T>(fn: () => Promise<T>): Promise<{
|
|
18
|
+
content: {
|
|
19
|
+
type: "text";
|
|
20
|
+
text: string;
|
|
21
|
+
}[];
|
|
22
|
+
}>;
|
|
23
|
+
export declare const NOT_CONFIGURED_ES = "Elasticsearch is not configured. Log search requires ES credentials.\n\n**Option 1 \u2014 Environment variables:**\n ELASTICSEARCH_ENDPOINT=https://your-es-cluster\n ELASTICSEARCH_API_KEY=your-api-key\n ELASTICSEARCH_INDEX_NAME=search-workflow-executions (optional)\n\n**Option 2 \u2014 Config file** (~/.laminar/config.json):\n {\n \"elasticsearch\": {\n \"endpoint\": \"https://your-es-cluster\",\n \"apiKey\": \"your-api-key\"\n }\n }\n\n**Option 3 \u2014 Run setup:** laminar-mcp-setup \u2192 Advanced Settings";
|
|
24
|
+
export declare const NOT_CONFIGURED_CRON = "CRON service is not configured. Scheduling requires CRON credentials.\n\n**Option 1 \u2014 Environment variables:**\n CRON_API_KEY=your-cron-api-key\n CRON_API_BASE=https://cron.laminar.run (optional)\n\n**Option 2 \u2014 Config file** (~/.laminar/config.json):\n {\n \"cron\": {\n \"apiKey\": \"your-cron-api-key\"\n }\n }\n\n**Option 3 \u2014 Run setup:** laminar-mcp-setup \u2192 Advanced Settings";
|
|
25
|
+
export declare const NOT_CONNECTED_VM = "No VM connected. Ask the user for their Cloudflare Tunnel URL for the Laminar Desktop Service, then call vm_connect.";
|
|
26
|
+
export declare const NOT_CONNECTED_BROWSER = "No browser RPA service connected. Call browser_connect with the service base URL and bearer token first.";
|
|
27
|
+
export declare function buildRpaProgram(pythonScript: string, pattern: "cloudflare_tunnel" | "channel", flowId: string, stepName: string, stepDescription: string): string;
|
|
28
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAE1C;AAED,wBAAgB,EAAE,CAAC,IAAI,EAAE,OAAO;;;;;EAE/B;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM;;;;;EAE/B;AAED,wBAAsB,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC;;;;;GAMjD;AAED,eAAO,MAAM,iBAAiB,4hBAekC,CAAC;AAEjE,eAAO,MAAM,mBAAmB,oaAagC,CAAC;AAEjE,eAAO,MAAM,gBAAgB,yHAAyH,CAAC;AAEvJ,eAAO,MAAM,qBAAqB,6GAA6G,CAAC;AAEhJ,wBAAgB,eAAe,CAC7B,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,mBAAmB,GAAG,SAAS,EACxC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,GACtB,MAAM,CAqCR"}
|
package/dist/helpers.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared MCP response helpers and error message constants.
|
|
3
|
+
*/
|
|
4
|
+
export function json(data) {
|
|
5
|
+
return JSON.stringify(data, null, 2);
|
|
6
|
+
}
|
|
7
|
+
export function ok(data) {
|
|
8
|
+
return { content: [{ type: "text", text: json(data) }] };
|
|
9
|
+
}
|
|
10
|
+
export function text(msg) {
|
|
11
|
+
return { content: [{ type: "text", text: msg }] };
|
|
12
|
+
}
|
|
13
|
+
export async function safe(fn) {
|
|
14
|
+
try {
|
|
15
|
+
return ok(await fn());
|
|
16
|
+
}
|
|
17
|
+
catch (e) {
|
|
18
|
+
return text(`Error: ${e.message}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export const NOT_CONFIGURED_ES = `Elasticsearch is not configured. Log search requires ES credentials.
|
|
22
|
+
|
|
23
|
+
**Option 1 — Environment variables:**
|
|
24
|
+
ELASTICSEARCH_ENDPOINT=https://your-es-cluster
|
|
25
|
+
ELASTICSEARCH_API_KEY=your-api-key
|
|
26
|
+
ELASTICSEARCH_INDEX_NAME=search-workflow-executions (optional)
|
|
27
|
+
|
|
28
|
+
**Option 2 — Config file** (~/.laminar/config.json):
|
|
29
|
+
{
|
|
30
|
+
"elasticsearch": {
|
|
31
|
+
"endpoint": "https://your-es-cluster",
|
|
32
|
+
"apiKey": "your-api-key"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
**Option 3 — Run setup:** laminar-mcp-setup → Advanced Settings`;
|
|
37
|
+
export const NOT_CONFIGURED_CRON = `CRON service is not configured. Scheduling requires CRON credentials.
|
|
38
|
+
|
|
39
|
+
**Option 1 — Environment variables:**
|
|
40
|
+
CRON_API_KEY=your-cron-api-key
|
|
41
|
+
CRON_API_BASE=https://cron.laminar.run (optional)
|
|
42
|
+
|
|
43
|
+
**Option 2 — Config file** (~/.laminar/config.json):
|
|
44
|
+
{
|
|
45
|
+
"cron": {
|
|
46
|
+
"apiKey": "your-cron-api-key"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
**Option 3 — Run setup:** laminar-mcp-setup → Advanced Settings`;
|
|
51
|
+
export const NOT_CONNECTED_VM = `No VM connected. Ask the user for their Cloudflare Tunnel URL for the Laminar Desktop Service, then call vm_connect.`;
|
|
52
|
+
export const NOT_CONNECTED_BROWSER = `No browser RPA service connected. Call browser_connect with the service base URL and bearer token first.`;
|
|
53
|
+
export function buildRpaProgram(pythonScript, pattern, flowId, stepName, stepDescription) {
|
|
54
|
+
const escaped = pythonScript.replace(/`/g, "\\`").replace(/\$/g, "\\$");
|
|
55
|
+
if (pattern === "channel") {
|
|
56
|
+
return `(data) => {
|
|
57
|
+
const pythonScript = \`
|
|
58
|
+
${escaped}
|
|
59
|
+
\`;
|
|
60
|
+
return {
|
|
61
|
+
"lam.rpa": {
|
|
62
|
+
"script": pythonScript,
|
|
63
|
+
"channelId": "{{config.channelId}}"
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
}`;
|
|
67
|
+
}
|
|
68
|
+
return `(data) => {
|
|
69
|
+
const pythonScript = \`
|
|
70
|
+
${escaped}
|
|
71
|
+
\`;
|
|
72
|
+
return {
|
|
73
|
+
"lam.httpRequest": {
|
|
74
|
+
"method": "POST",
|
|
75
|
+
"url": "{{config.laminar_desktop_service_url}}/execute",
|
|
76
|
+
"headers": {
|
|
77
|
+
"Content-Type": "application/json",
|
|
78
|
+
"X-API-Key": "{{config.laminar_desktop_service_api_key}}",
|
|
79
|
+
"X-Service-ID": "{{config.laminar_desktop_service_id}}"
|
|
80
|
+
},
|
|
81
|
+
"body": {
|
|
82
|
+
"flowId": "${flowId}",
|
|
83
|
+
"script": pythonScript,
|
|
84
|
+
"executionId": "1",
|
|
85
|
+
"step": { "id": "${flowId}", "name": "${stepName.replace(/"/g, '\\"')}", "description": "${stepDescription.replace(/"/g, '\\"')}", "versionId": "v1.0" }
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
}`;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,IAAI,CAAC,IAAa;IAChC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,EAAE,CAAC,IAAa;IAC9B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAW;IAC9B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAI,EAAoB;IAChD,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;gEAe+B,CAAC;AAEjE,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;gEAa6B,CAAC;AAEjE,MAAM,CAAC,MAAM,gBAAgB,GAAG,sHAAsH,CAAC;AAEvJ,MAAM,CAAC,MAAM,qBAAqB,GAAG,0GAA0G,CAAC;AAEhJ,MAAM,UAAU,eAAe,CAC7B,YAAoB,EACpB,OAAwC,EACxC,MAAc,EACd,QAAgB,EAChB,eAAuB;IAEvB,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACxE,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO;;EAET,OAAO;;;;;;;;EAQP,CAAC;IACD,CAAC;IACD,OAAO;;EAEP,OAAO;;;;;;;;;;;;qBAYY,MAAM;;;2BAGA,MAAM,eAAe,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,sBAAsB,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;;;;EAIrI,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Minicor MCP Server (formerly Laminar)
|
|
4
|
+
*
|
|
5
|
+
* Brings your Minicor workspace into Cursor / Claude Code.
|
|
6
|
+
* Core tools always available; Elasticsearch + CRON unlock with advanced setup.
|
|
7
|
+
*/
|
|
8
|
+
export declare function getApiBase(): string;
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAkEH,wBAAgB,UAAU,IAAI,MAAM,CAKnC"}
|