@dlnk/cli 0.3.0 → 0.5.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/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/index.js +161 -0
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +2 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +131 -0
- package/dist/init.js.map +1 -0
- package/dist/license.d.ts +8 -12
- package/dist/license.d.ts.map +1 -1
- package/dist/license.js +186 -121
- package/dist/license.js.map +1 -1
- package/dist/mcp.d.ts +31 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +159 -0
- package/dist/mcp.js.map +1 -0
- package/dist/subagent.d.ts +37 -0
- package/dist/subagent.d.ts.map +1 -0
- package/dist/subagent.js +128 -0
- package/dist/subagent.js.map +1 -0
- package/dlnk-release.sh +87 -0
- package/package.json +1 -1
package/dist/license.js
CHANGED
|
@@ -1,165 +1,230 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
5
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.generateLicenseKey = generateLicenseKey;
|
|
7
|
-
exports.isValidKeyFormat = isValidKeyFormat;
|
|
8
36
|
exports.loadLicense = loadLicense;
|
|
9
|
-
exports.saveLicense = saveLicense;
|
|
10
|
-
exports.activateLicense = activateLicense;
|
|
11
37
|
exports.validateLicense = validateLicense;
|
|
12
|
-
exports.
|
|
13
|
-
exports.trackUsage = trackUsage;
|
|
38
|
+
exports.activateLicense = activateLicense;
|
|
14
39
|
exports.getUsageSummary = getUsageSummary;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
.
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
.toUpperCase()
|
|
37
|
-
.slice(0, 20);
|
|
38
|
-
// Format: DLNK-PRO-XXXX-XXXX-XXXX
|
|
39
|
-
const parts = hash.match(/.{4}/g).slice(0, 4);
|
|
40
|
-
return `DLNK-${prefix}-${parts.join('-')}`;
|
|
40
|
+
exports.trackUsage = trackUsage;
|
|
41
|
+
exports.generateLicenseKey = generateLicenseKey;
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const os = __importStar(require("os"));
|
|
45
|
+
const crypto = __importStar(require("crypto"));
|
|
46
|
+
const CONFIG_DIR = path.join(os.homedir(), '.dlnk');
|
|
47
|
+
const LICENSE_FILE = path.join(CONFIG_DIR, 'license.json');
|
|
48
|
+
const USAGE_FILE = path.join(CONFIG_DIR, 'usage.json');
|
|
49
|
+
const LICENSE_SERVER = 'https://dlnk-license.dlnkai.workers.dev';
|
|
50
|
+
const HMAC_SECRET = 'dlnk-hmac-secret-change-in-production'; // same as worker
|
|
51
|
+
// ── Defaults ───────────────────────────────────────────────────
|
|
52
|
+
function defaultLicense() {
|
|
53
|
+
return {
|
|
54
|
+
key: 'trial',
|
|
55
|
+
tier: 'trial',
|
|
56
|
+
maxAgents: 3,
|
|
57
|
+
maxReqPerDay: 50,
|
|
58
|
+
activatedAt: Date.now(),
|
|
59
|
+
offline: false,
|
|
60
|
+
};
|
|
41
61
|
}
|
|
42
|
-
//
|
|
43
|
-
function
|
|
44
|
-
|
|
62
|
+
// ── Device ID ──────────────────────────────────────────────────
|
|
63
|
+
function getDeviceId() {
|
|
64
|
+
const idFile = path.join(CONFIG_DIR, 'device.id');
|
|
65
|
+
if (!fs.existsSync(idFile)) {
|
|
66
|
+
const id = crypto.randomBytes(16).toString('hex');
|
|
67
|
+
if (!fs.existsSync(CONFIG_DIR))
|
|
68
|
+
fs.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
69
|
+
fs.writeFileSync(idFile, id);
|
|
70
|
+
return id;
|
|
71
|
+
}
|
|
72
|
+
return fs.readFileSync(idFile, 'utf-8').trim();
|
|
45
73
|
}
|
|
46
|
-
//
|
|
47
|
-
function
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
return 'free';
|
|
74
|
+
// ── HMAC local verify ──────────────────────────────────────────
|
|
75
|
+
function verifyKeyLocally(key) {
|
|
76
|
+
const parts = key.split('-');
|
|
77
|
+
if (parts.length < 4 || parts[0] !== 'DLNK')
|
|
78
|
+
return false;
|
|
79
|
+
const sigHex = parts[parts.length - 1];
|
|
80
|
+
const payload = parts.slice(1, -1).join('-');
|
|
81
|
+
const expected = crypto.createHmac('sha256', HMAC_SECRET)
|
|
82
|
+
.update(payload).digest('hex').slice(0, 8).toUpperCase();
|
|
83
|
+
return sigHex === expected;
|
|
57
84
|
}
|
|
58
|
-
// Load
|
|
85
|
+
// ── Load / Save ────────────────────────────────────────────────
|
|
59
86
|
function loadLicense() {
|
|
60
87
|
try {
|
|
61
|
-
if (
|
|
62
|
-
return JSON.parse(
|
|
88
|
+
if (fs.existsSync(LICENSE_FILE)) {
|
|
89
|
+
return JSON.parse(fs.readFileSync(LICENSE_FILE, 'utf-8'));
|
|
63
90
|
}
|
|
64
91
|
}
|
|
65
92
|
catch { }
|
|
66
|
-
return
|
|
93
|
+
return defaultLicense();
|
|
67
94
|
}
|
|
68
|
-
function getTrialLicense() {
|
|
69
|
-
return {
|
|
70
|
-
key: 'trial',
|
|
71
|
-
tier: 'trial',
|
|
72
|
-
maxAgents: TIER_LIMITS.trial.maxAgents,
|
|
73
|
-
maxReqPerDay: TIER_LIMITS.trial.maxReqPerDay,
|
|
74
|
-
activatedAt: Date.now(),
|
|
75
|
-
offline: false,
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
// Save license to disk
|
|
79
95
|
function saveLicense(info) {
|
|
80
|
-
if (!
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}
|
|
84
|
-
// Activate a license key
|
|
85
|
-
async function activateLicense(key) {
|
|
86
|
-
if (key === 'trial') {
|
|
87
|
-
const info = getTrialLicense();
|
|
88
|
-
saveLicense(info);
|
|
89
|
-
return { ok: true, info };
|
|
90
|
-
}
|
|
91
|
-
const tier = tierFromKey(key);
|
|
92
|
-
const limits = TIER_LIMITS[tier];
|
|
93
|
-
const info = {
|
|
94
|
-
key,
|
|
95
|
-
tier,
|
|
96
|
-
maxAgents: limits.maxAgents,
|
|
97
|
-
maxReqPerDay: limits.maxReqPerDay,
|
|
98
|
-
activatedAt: Date.now(),
|
|
99
|
-
lastValidated: Date.now(),
|
|
100
|
-
offline: false,
|
|
101
|
-
};
|
|
102
|
-
saveLicense(info);
|
|
103
|
-
return { ok: true, info };
|
|
96
|
+
if (!fs.existsSync(CONFIG_DIR))
|
|
97
|
+
fs.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
98
|
+
fs.writeFileSync(LICENSE_FILE, JSON.stringify(info, null, 2));
|
|
104
99
|
}
|
|
105
|
-
// Validate
|
|
100
|
+
// ── Validate ───────────────────────────────────────────────────
|
|
106
101
|
function validateLicense() {
|
|
107
102
|
const info = loadLicense();
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
103
|
+
if (info.tier === 'trial') {
|
|
104
|
+
return { valid: true, info };
|
|
105
|
+
}
|
|
106
|
+
// HMAC quick check (offline)
|
|
107
|
+
if (!verifyKeyLocally(info.key)) {
|
|
108
|
+
return { valid: false, reason: 'Invalid key format', info };
|
|
111
109
|
}
|
|
112
|
-
//
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
return { valid: false, reason: 'License validation required (offline grace period expired)', info };
|
|
110
|
+
// Expiry
|
|
111
|
+
if (info.expiresAt && info.expiresAt < Date.now()) {
|
|
112
|
+
return { valid: false, reason: 'License expired', info };
|
|
116
113
|
}
|
|
117
114
|
return { valid: true, info };
|
|
118
115
|
}
|
|
119
|
-
//
|
|
120
|
-
function
|
|
121
|
-
|
|
122
|
-
}
|
|
123
|
-
|
|
116
|
+
// ── Activate (online) ──────────────────────────────────────────
|
|
117
|
+
async function activateLicense(key) {
|
|
118
|
+
if (!verifyKeyLocally(key)) {
|
|
119
|
+
return { ok: false, error: 'Invalid key format — check your key and try again' };
|
|
120
|
+
}
|
|
124
121
|
try {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
122
|
+
const deviceId = getDeviceId();
|
|
123
|
+
const res = await fetchJSON(`${LICENSE_SERVER}/activate`, {
|
|
124
|
+
method: 'POST',
|
|
125
|
+
body: JSON.stringify({ key, deviceId }),
|
|
126
|
+
});
|
|
127
|
+
if (!res.ok) {
|
|
128
|
+
return { ok: false, error: res.error || 'Activation failed' };
|
|
129
129
|
}
|
|
130
|
+
const { info: serverInfo } = res;
|
|
131
|
+
const licenseInfo = {
|
|
132
|
+
key,
|
|
133
|
+
tier: serverInfo.tier,
|
|
134
|
+
email: serverInfo.email,
|
|
135
|
+
expiresAt: serverInfo.expiresAt ? new Date(serverInfo.expiresAt).getTime() : undefined,
|
|
136
|
+
maxAgents: serverInfo.maxAgents,
|
|
137
|
+
maxReqPerDay: serverInfo.maxReqPerDay,
|
|
138
|
+
activatedAt: Date.now(),
|
|
139
|
+
lastValidated: Date.now(),
|
|
140
|
+
offline: false,
|
|
141
|
+
};
|
|
142
|
+
saveLicense(licenseInfo);
|
|
143
|
+
return { ok: true, info: licenseInfo };
|
|
130
144
|
}
|
|
131
|
-
catch {
|
|
132
|
-
|
|
145
|
+
catch (e) {
|
|
146
|
+
// Offline fallback — save locally with HMAC verification only
|
|
147
|
+
const tier = key.includes('-PRO-') ? 'pro' : key.includes('-ENT-') ? 'enterprise' : 'free';
|
|
148
|
+
const tierMap = {
|
|
149
|
+
pro: { maxAgents: 12, maxReqPerDay: 99999 },
|
|
150
|
+
enterprise: { maxAgents: 12, maxReqPerDay: 99999 },
|
|
151
|
+
free: { maxAgents: 3, maxReqPerDay: 50 },
|
|
152
|
+
};
|
|
153
|
+
const info = {
|
|
154
|
+
key,
|
|
155
|
+
tier: tier,
|
|
156
|
+
maxAgents: tierMap[tier]?.maxAgents || 3,
|
|
157
|
+
maxReqPerDay: tierMap[tier]?.maxReqPerDay || 50,
|
|
158
|
+
activatedAt: Date.now(),
|
|
159
|
+
offline: true,
|
|
160
|
+
};
|
|
161
|
+
saveLicense(info);
|
|
162
|
+
return { ok: true, info };
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// ── Usage tracking ─────────────────────────────────────────────
|
|
166
|
+
function getUsageSummary() {
|
|
167
|
+
const usage = loadUsage();
|
|
168
|
+
const info = loadLicense();
|
|
169
|
+
const max = info.maxReqPerDay === 99999 ? '∞' : String(info.maxReqPerDay);
|
|
170
|
+
return `${usage.requests}/${max} requests today`;
|
|
133
171
|
}
|
|
134
|
-
function trackUsage(
|
|
172
|
+
function trackUsage(agentCount) {
|
|
135
173
|
const { valid, reason, info } = validateLicense();
|
|
136
174
|
if (!valid)
|
|
137
175
|
return { allowed: false, reason };
|
|
138
176
|
const usage = loadUsage();
|
|
139
|
-
if (usage.requests >= info.maxReqPerDay) {
|
|
177
|
+
if (info.maxReqPerDay !== 99999 && usage.requests >= info.maxReqPerDay) {
|
|
140
178
|
return {
|
|
141
179
|
allowed: false,
|
|
142
|
-
reason: `Daily limit reached (${info.maxReqPerDay} req/day). Upgrade to Pro
|
|
180
|
+
reason: `Daily limit reached (${info.maxReqPerDay} req/day). Upgrade to Pro: dlnk license --activate <key>`
|
|
143
181
|
};
|
|
144
182
|
}
|
|
145
|
-
if (
|
|
183
|
+
if (agentCount > info.maxAgents) {
|
|
146
184
|
return {
|
|
147
185
|
allowed: false,
|
|
148
|
-
reason: `
|
|
186
|
+
reason: `Your tier allows max ${info.maxAgents} agents. Upgrade to Pro for all 12.`
|
|
149
187
|
};
|
|
150
188
|
}
|
|
151
189
|
// Increment
|
|
152
190
|
usage.requests += 1;
|
|
153
|
-
|
|
154
|
-
if (!fs_1.default.existsSync(CONFIG_DIR))
|
|
155
|
-
fs_1.default.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
156
|
-
fs_1.default.writeFileSync(USAGE_FILE, JSON.stringify(usage, null, 2));
|
|
191
|
+
saveUsage(usage);
|
|
157
192
|
return { allowed: true };
|
|
158
193
|
}
|
|
159
|
-
function
|
|
160
|
-
const
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
194
|
+
function loadUsage() {
|
|
195
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
196
|
+
try {
|
|
197
|
+
if (fs.existsSync(USAGE_FILE)) {
|
|
198
|
+
const u = JSON.parse(fs.readFileSync(USAGE_FILE, 'utf-8'));
|
|
199
|
+
if (u.date === today)
|
|
200
|
+
return u;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
catch { }
|
|
204
|
+
return { date: today, requests: 0 };
|
|
205
|
+
}
|
|
206
|
+
function saveUsage(u) {
|
|
207
|
+
if (!fs.existsSync(CONFIG_DIR))
|
|
208
|
+
fs.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
209
|
+
fs.writeFileSync(USAGE_FILE, JSON.stringify(u, null, 2));
|
|
210
|
+
}
|
|
211
|
+
// ── Deprecated exports kept for compatibility ──────────────────
|
|
212
|
+
function generateLicenseKey(tier) {
|
|
213
|
+
const prefix = tier === 'enterprise' ? 'ENT' : tier === 'pro' ? 'PRO' : 'FREE';
|
|
214
|
+
const random = crypto.randomBytes(8).toString('hex').toUpperCase();
|
|
215
|
+
const payload = `${prefix}-${random}`;
|
|
216
|
+
const sig = crypto.createHmac('sha256', HMAC_SECRET)
|
|
217
|
+
.update(payload).digest('hex').slice(0, 8).toUpperCase();
|
|
218
|
+
return `DLNK-${payload}-${sig}`;
|
|
219
|
+
}
|
|
220
|
+
// ── HTTP helper ────────────────────────────────────────────────
|
|
221
|
+
async function fetchJSON(url, opts = {}) {
|
|
222
|
+
const fetch = (await Promise.resolve().then(() => __importStar(require('node-fetch')))).default;
|
|
223
|
+
const res = await fetch(url, {
|
|
224
|
+
...opts,
|
|
225
|
+
headers: { 'Content-Type': 'application/json', ...(opts.headers || {}) },
|
|
226
|
+
timeout: 10000,
|
|
227
|
+
});
|
|
228
|
+
return res.json();
|
|
164
229
|
}
|
|
165
230
|
//# sourceMappingURL=license.js.map
|
package/dist/license.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"license.js","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"license.js","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export interface MCPServer {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
command: string;
|
|
5
|
+
args?: string[];
|
|
6
|
+
env?: Record<string, string>;
|
|
7
|
+
enabled: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface MCPTool {
|
|
10
|
+
name: string;
|
|
11
|
+
description: string;
|
|
12
|
+
serverId: string;
|
|
13
|
+
inputSchema: Record<string, any>;
|
|
14
|
+
}
|
|
15
|
+
export interface MCPCallResult {
|
|
16
|
+
success: boolean;
|
|
17
|
+
output: string;
|
|
18
|
+
error?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare const BUILTIN_MCP_SERVERS: MCPServer[];
|
|
21
|
+
export interface MCPConfig {
|
|
22
|
+
servers: Record<string, MCPServer>;
|
|
23
|
+
}
|
|
24
|
+
export declare function loadMCPConfig(): MCPConfig;
|
|
25
|
+
export declare function saveMCPConfig(config: MCPConfig): void;
|
|
26
|
+
export declare function addMCPServer(server: MCPServer): void;
|
|
27
|
+
export declare function removeMCPServer(name: string): void;
|
|
28
|
+
export declare function listMCPServers(): MCPServer[];
|
|
29
|
+
export declare function getMCPToolsSystemPrompt(servers: MCPServer[]): string;
|
|
30
|
+
export declare function callMCPTool(server: MCPServer, toolName: string, args: Record<string, unknown>): Promise<MCPCallResult>;
|
|
31
|
+
//# sourceMappingURL=mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAGD,eAAO,MAAM,mBAAmB,EAAE,SAAS,EAgC1C,CAAC;AAKF,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACpC;AAED,wBAAgB,aAAa,IAAI,SAAS,CAOzC;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAIrD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAIpD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAIlD;AAED,wBAAgB,cAAc,IAAI,SAAS,EAAE,CAU5C;AAID,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,CASpE;AAGD,wBAAsB,WAAW,CAC/B,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,aAAa,CAAC,CA6BxB"}
|
package/dist/mcp.js
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.BUILTIN_MCP_SERVERS = void 0;
|
|
37
|
+
exports.loadMCPConfig = loadMCPConfig;
|
|
38
|
+
exports.saveMCPConfig = saveMCPConfig;
|
|
39
|
+
exports.addMCPServer = addMCPServer;
|
|
40
|
+
exports.removeMCPServer = removeMCPServer;
|
|
41
|
+
exports.listMCPServers = listMCPServers;
|
|
42
|
+
exports.getMCPToolsSystemPrompt = getMCPToolsSystemPrompt;
|
|
43
|
+
exports.callMCPTool = callMCPTool;
|
|
44
|
+
const fs = __importStar(require("fs"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
const os = __importStar(require("os"));
|
|
47
|
+
const child_process_1 = require("child_process");
|
|
48
|
+
// ── Built-in MCP Server configs ────────────────────────────────
|
|
49
|
+
exports.BUILTIN_MCP_SERVERS = [
|
|
50
|
+
{
|
|
51
|
+
name: 'filesystem',
|
|
52
|
+
description: 'Extended file system operations via MCP',
|
|
53
|
+
command: 'npx',
|
|
54
|
+
args: ['-y', '@modelcontextprotocol/server-filesystem', process.cwd()],
|
|
55
|
+
enabled: false,
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
name: 'github',
|
|
59
|
+
description: 'GitHub API — repos, issues, PRs',
|
|
60
|
+
command: 'npx',
|
|
61
|
+
args: ['-y', '@modelcontextprotocol/server-github'],
|
|
62
|
+
env: { GITHUB_PERSONAL_ACCESS_TOKEN: '' },
|
|
63
|
+
enabled: false,
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: 'brave-search',
|
|
67
|
+
description: 'Web search via Brave Search API',
|
|
68
|
+
command: 'npx',
|
|
69
|
+
args: ['-y', '@modelcontextprotocol/server-brave-search'],
|
|
70
|
+
env: { BRAVE_API_KEY: '' },
|
|
71
|
+
enabled: false,
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: 'postgres',
|
|
75
|
+
description: 'PostgreSQL database queries',
|
|
76
|
+
command: 'npx',
|
|
77
|
+
args: ['-y', '@modelcontextprotocol/server-postgres'],
|
|
78
|
+
env: { POSTGRES_CONNECTION_STRING: '' },
|
|
79
|
+
enabled: false,
|
|
80
|
+
},
|
|
81
|
+
];
|
|
82
|
+
// ── MCP Config Manager ─────────────────────────────────────────
|
|
83
|
+
const MCP_CONFIG_FILE = path.join(os.homedir(), '.dlnk', 'mcp.json');
|
|
84
|
+
function loadMCPConfig() {
|
|
85
|
+
try {
|
|
86
|
+
if (fs.existsSync(MCP_CONFIG_FILE)) {
|
|
87
|
+
return JSON.parse(fs.readFileSync(MCP_CONFIG_FILE, 'utf-8'));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch { }
|
|
91
|
+
return { servers: {} };
|
|
92
|
+
}
|
|
93
|
+
function saveMCPConfig(config) {
|
|
94
|
+
const dir = path.dirname(MCP_CONFIG_FILE);
|
|
95
|
+
if (!fs.existsSync(dir))
|
|
96
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
97
|
+
fs.writeFileSync(MCP_CONFIG_FILE, JSON.stringify(config, null, 2));
|
|
98
|
+
}
|
|
99
|
+
function addMCPServer(server) {
|
|
100
|
+
const config = loadMCPConfig();
|
|
101
|
+
config.servers[server.name] = server;
|
|
102
|
+
saveMCPConfig(config);
|
|
103
|
+
}
|
|
104
|
+
function removeMCPServer(name) {
|
|
105
|
+
const config = loadMCPConfig();
|
|
106
|
+
delete config.servers[name];
|
|
107
|
+
saveMCPConfig(config);
|
|
108
|
+
}
|
|
109
|
+
function listMCPServers() {
|
|
110
|
+
const config = loadMCPConfig();
|
|
111
|
+
const custom = Object.values(config.servers);
|
|
112
|
+
const builtins = exports.BUILTIN_MCP_SERVERS.map(s => ({
|
|
113
|
+
...s,
|
|
114
|
+
...(config.servers[s.name] || {}),
|
|
115
|
+
}));
|
|
116
|
+
const customNames = new Set(builtins.map(s => s.name));
|
|
117
|
+
const extraCustom = custom.filter(s => !customNames.has(s.name));
|
|
118
|
+
return [...builtins, ...extraCustom];
|
|
119
|
+
}
|
|
120
|
+
// ── MCP Tool Adapter ───────────────────────────────────────────
|
|
121
|
+
// Converts MCP server tools into dlnk tool format for ReAct engine
|
|
122
|
+
function getMCPToolsSystemPrompt(servers) {
|
|
123
|
+
const enabled = servers.filter(s => s.enabled);
|
|
124
|
+
if (enabled.length === 0)
|
|
125
|
+
return '';
|
|
126
|
+
const lines = enabled.map(s => `- ${s.name}: ${s.description} (MCP server)`).join('\n');
|
|
127
|
+
return `\n\n## MCP Servers (external tools)\n${lines}\nTo call an MCP tool:\n\`\`\`tool\n{"tool": "mcp_call", "params": {"server": "name", "tool": "tool_name", "arguments": {}}}\n\`\`\``;
|
|
128
|
+
}
|
|
129
|
+
// ── Simple MCP stdio runner (no full MCP SDK needed) ──────────
|
|
130
|
+
async function callMCPTool(server, toolName, args) {
|
|
131
|
+
try {
|
|
132
|
+
const cmd = `${server.command} ${(server.args || []).join(' ')}`;
|
|
133
|
+
const input = JSON.stringify({
|
|
134
|
+
jsonrpc: '2.0',
|
|
135
|
+
id: 1,
|
|
136
|
+
method: 'tools/call',
|
|
137
|
+
params: { name: toolName, arguments: args }
|
|
138
|
+
});
|
|
139
|
+
const env = { ...process.env, ...(server.env || {}) };
|
|
140
|
+
const result = (0, child_process_1.execSync)(`echo '${input}' | ${cmd}`, {
|
|
141
|
+
env,
|
|
142
|
+
encoding: 'utf-8',
|
|
143
|
+
timeout: 30000,
|
|
144
|
+
});
|
|
145
|
+
const parsed = JSON.parse(result.trim().split('\n').pop() || '{}');
|
|
146
|
+
if (parsed.result) {
|
|
147
|
+
const content = parsed.result.content?.[0]?.text || JSON.stringify(parsed.result);
|
|
148
|
+
return { success: true, output: content };
|
|
149
|
+
}
|
|
150
|
+
if (parsed.error) {
|
|
151
|
+
return { success: false, output: '', error: parsed.error.message };
|
|
152
|
+
}
|
|
153
|
+
return { success: true, output: result.trim() };
|
|
154
|
+
}
|
|
155
|
+
catch (e) {
|
|
156
|
+
return { success: false, output: '', error: e.message };
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=mcp.js.map
|
package/dist/mcp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { AgentResult } from './engine.js';
|
|
2
|
+
import { MemoryManager } from './memory.js';
|
|
3
|
+
export interface SubAgentDef {
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
role: string;
|
|
7
|
+
emoji: string;
|
|
8
|
+
systemContext?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const SUB_AGENTS: Record<string, SubAgentDef>;
|
|
11
|
+
export interface OrchestratorResult {
|
|
12
|
+
plan: string;
|
|
13
|
+
agentResults: {
|
|
14
|
+
agentId: string;
|
|
15
|
+
task: string;
|
|
16
|
+
result: AgentResult;
|
|
17
|
+
}[];
|
|
18
|
+
summary: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function runPipeline(masterTask: string, agentIds: string[], options?: {
|
|
21
|
+
cwd?: string;
|
|
22
|
+
onAgentStart?: (agent: SubAgentDef, task: string) => void;
|
|
23
|
+
onStep?: (agentId: string, stepType: string, content: string) => void;
|
|
24
|
+
sharedMemory?: MemoryManager;
|
|
25
|
+
}): Promise<OrchestratorResult>;
|
|
26
|
+
export declare function runSwarm(tasks: {
|
|
27
|
+
agentId: string;
|
|
28
|
+
task: string;
|
|
29
|
+
}[], options?: {
|
|
30
|
+
cwd?: string;
|
|
31
|
+
onStep?: (agentId: string, stepType: string, content: string) => void;
|
|
32
|
+
}): Promise<{
|
|
33
|
+
agentId: string;
|
|
34
|
+
task: string;
|
|
35
|
+
result: AgentResult;
|
|
36
|
+
}[]>;
|
|
37
|
+
//# sourceMappingURL=subagent.d.ts.map
|