@lobu/cli 3.0.3 → 3.0.5
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 +18 -222
- package/dist/api/context.d.ts +20 -0
- package/dist/api/context.d.ts.map +1 -0
- package/dist/api/context.js +113 -0
- package/dist/api/context.js.map +1 -0
- package/dist/api/credentials.d.ts +9 -4
- package/dist/api/credentials.d.ts.map +1 -1
- package/dist/api/credentials.js +127 -15
- package/dist/api/credentials.js.map +1 -1
- package/dist/commands/chat.d.ts +16 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +281 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/context.d.ts +8 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +46 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/dev.d.ts +3 -9
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +95 -64
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +421 -673
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +283 -14
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts +3 -1
- package/dist/commands/logout.d.ts.map +1 -1
- package/dist/commands/logout.js +5 -3
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/providers/add.d.ts.map +1 -1
- package/dist/commands/providers/add.js +38 -14
- package/dist/commands/providers/add.js.map +1 -1
- package/dist/commands/providers/list.d.ts.map +1 -1
- package/dist/commands/providers/list.js +4 -2
- package/dist/commands/providers/list.js.map +1 -1
- package/dist/commands/skills/add.d.ts.map +1 -1
- package/dist/commands/skills/add.js +25 -7
- package/dist/commands/skills/add.js.map +1 -1
- package/dist/commands/skills/info.d.ts.map +1 -1
- package/dist/commands/skills/info.js +0 -9
- package/dist/commands/skills/info.js.map +1 -1
- package/dist/commands/skills/list.d.ts.map +1 -1
- package/dist/commands/skills/list.js +5 -6
- package/dist/commands/skills/list.js.map +1 -1
- package/dist/commands/skills/registry.d.ts +6 -11
- package/dist/commands/skills/registry.d.ts.map +1 -1
- package/dist/commands/skills/registry.js +0 -3
- package/dist/commands/skills/registry.js.map +1 -1
- package/dist/commands/skills/search.d.ts.map +1 -1
- package/dist/commands/skills/search.js +3 -1
- package/dist/commands/skills/search.js.map +1 -1
- package/dist/commands/status.d.ts +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +107 -4
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +9 -20
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/whoami.d.ts +3 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +17 -3
- package/dist/commands/whoami.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js.map +1 -1
- package/dist/config/schema.d.ts +546 -111
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +26 -19
- package/dist/config/schema.js.map +1 -1
- package/dist/index.d.ts +0 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +60 -25
- package/dist/index.js.map +1 -1
- package/dist/utils/markdown.d.ts +3 -0
- package/dist/utils/markdown.d.ts.map +1 -0
- package/dist/utils/markdown.js +10 -0
- package/dist/utils/markdown.js.map +1 -0
- package/package.json +4 -3
- package/dist/api/client.d.ts +0 -11
- package/dist/api/client.d.ts.map +0 -1
- package/dist/api/client.js +0 -35
- package/dist/api/client.js.map +0 -1
- package/dist/commands/launch.d.ts +0 -6
- package/dist/commands/launch.d.ts.map +0 -1
- package/dist/commands/launch.js +0 -32
- package/dist/commands/launch.js.map +0 -1
- package/dist/config/transformer.d.ts +0 -11
- package/dist/config/transformer.d.ts.map +0 -1
- package/dist/config/transformer.js +0 -49
- package/dist/config/transformer.js.map +0 -1
- package/dist/mcp-servers.d.ts +0 -11
- package/dist/mcp-servers.d.ts.map +0 -1
- package/dist/mcp-servers.js +0 -27
- package/dist/mcp-servers.js.map +0 -1
- package/dist/mcp-servers.json +0 -216
- package/dist/system-skills.json +0 -561
- package/dist/templates/.env.tmpl +0 -29
- package/dist/templates/.gitignore.tmpl +0 -32
- package/dist/templates/AGENTS.md.tmpl +0 -1
- package/dist/templates/Dockerfile.worker.tmpl +0 -29
- package/dist/templates/README.md.tmpl +0 -95
- package/dist/templates/TESTING.md.tmpl +0 -225
- package/dist/templates/lobu.toml.tmpl +0 -44
- package/dist/types.d.ts +0 -76
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/utils/config.d.ts +0 -2
- package/dist/utils/config.d.ts.map +0 -1
- package/dist/utils/config.js +0 -13
- package/dist/utils/config.js.map +0 -1
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { getToken } from "../api/credentials.js";
|
|
5
|
+
import { isLoadError, loadConfig } from "../config/loader.js";
|
|
6
|
+
import { renderMarkdown } from "../utils/markdown.js";
|
|
7
|
+
/**
|
|
8
|
+
* `lobu chat "prompt"` — send a prompt to an agent and stream the response.
|
|
9
|
+
*
|
|
10
|
+
* Without --user: API mode — creates a session, sends message, streams to terminal.
|
|
11
|
+
* With --user platform:id: Platform mode — sends through Telegram/Slack, response
|
|
12
|
+
* appears on the platform. Terminal shows the streamed response too.
|
|
13
|
+
*/
|
|
14
|
+
export async function chatCommand(cwd, prompt, options) {
|
|
15
|
+
const gatewayUrl = (options.gateway ?? (await resolveGatewayUrl(cwd))).replace(/\/$/, "");
|
|
16
|
+
const authToken = (await getToken()) ?? process.env.ADMIN_PASSWORD;
|
|
17
|
+
if (!authToken) {
|
|
18
|
+
console.error(chalk.red("\n Authentication required. Run `lobu login` or set ADMIN_PASSWORD.\n"));
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
const agentId = options.agent ?? (await resolveAgentId(cwd));
|
|
22
|
+
// Parse --user flag: "telegram:12345" → { platform: "telegram", userId: "12345" }
|
|
23
|
+
const platformUser = options.user ? parsePlatformUser(options.user) : null;
|
|
24
|
+
if (platformUser) {
|
|
25
|
+
// Platform mode: route through Telegram/Slack
|
|
26
|
+
await sendViaPlatform(gatewayUrl, authToken, {
|
|
27
|
+
agentId,
|
|
28
|
+
platform: platformUser.platform,
|
|
29
|
+
userId: platformUser.userId,
|
|
30
|
+
message: prompt,
|
|
31
|
+
thread: options.thread,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
// API mode: create session, send message, stream response
|
|
36
|
+
await sendViaApi(gatewayUrl, authToken, {
|
|
37
|
+
agentId,
|
|
38
|
+
message: prompt,
|
|
39
|
+
thread: options.thread,
|
|
40
|
+
dryRun: options.dryRun,
|
|
41
|
+
forceNew: options.new,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function parsePlatformUser(user) {
|
|
46
|
+
const colonIndex = user.indexOf(":");
|
|
47
|
+
if (colonIndex === -1) {
|
|
48
|
+
// No platform prefix — use as plain userId in API mode
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
platform: user.slice(0, colonIndex),
|
|
53
|
+
userId: user.slice(colonIndex + 1),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Platform mode: send message through Telegram/Slack via /api/v1/agents/{agentId}/messages.
|
|
58
|
+
* The response appears on the platform AND streams to terminal via eventsUrl.
|
|
59
|
+
*/
|
|
60
|
+
async function sendViaPlatform(gatewayUrl, authToken, opts) {
|
|
61
|
+
const agentId = opts.agentId || `test-${opts.platform}`;
|
|
62
|
+
const body = {
|
|
63
|
+
platform: opts.platform,
|
|
64
|
+
content: opts.message,
|
|
65
|
+
};
|
|
66
|
+
// Platform-specific routing
|
|
67
|
+
if (opts.platform === "telegram") {
|
|
68
|
+
body.telegram = { chatId: opts.userId };
|
|
69
|
+
}
|
|
70
|
+
else if (opts.platform === "slack") {
|
|
71
|
+
body.slack = {
|
|
72
|
+
channel: opts.userId,
|
|
73
|
+
thread: opts.thread,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
else if (opts.platform === "discord") {
|
|
77
|
+
body.discord = { channelId: opts.userId };
|
|
78
|
+
}
|
|
79
|
+
const res = await fetch(`${gatewayUrl}/api/v1/agents/${encodeURIComponent(agentId)}/messages`, {
|
|
80
|
+
method: "POST",
|
|
81
|
+
headers: {
|
|
82
|
+
"Content-Type": "application/json",
|
|
83
|
+
Authorization: `Bearer ${authToken}`,
|
|
84
|
+
},
|
|
85
|
+
body: JSON.stringify(body),
|
|
86
|
+
});
|
|
87
|
+
if (!res.ok) {
|
|
88
|
+
const resBody = await res.text().catch(() => "");
|
|
89
|
+
console.error(chalk.red(`\n Failed to send message (${res.status}): ${resBody}\n`));
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
const result = (await res.json());
|
|
93
|
+
if (result.eventsUrl) {
|
|
94
|
+
// Stream the response from the agent
|
|
95
|
+
const sseUrl = result.eventsUrl.startsWith("http")
|
|
96
|
+
? result.eventsUrl
|
|
97
|
+
: `${gatewayUrl}${result.eventsUrl}`;
|
|
98
|
+
const sseController = new AbortController();
|
|
99
|
+
await streamResponse(sseUrl, authToken, sseController);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
console.log(chalk.dim(` Message sent via ${opts.platform}. Response will appear on the platform.\n`));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* API mode: create session, send message, stream response to terminal.
|
|
107
|
+
*/
|
|
108
|
+
async function sendViaApi(gatewayUrl, authToken, opts) {
|
|
109
|
+
const createBody = {};
|
|
110
|
+
if (opts.agentId)
|
|
111
|
+
createBody.agentId = opts.agentId;
|
|
112
|
+
if (opts.thread)
|
|
113
|
+
createBody.thread = opts.thread;
|
|
114
|
+
if (opts.dryRun)
|
|
115
|
+
createBody.dryRun = true;
|
|
116
|
+
if (opts.forceNew)
|
|
117
|
+
createBody.forceNew = true;
|
|
118
|
+
const createRes = await fetch(`${gatewayUrl}/api/v1/agents`, {
|
|
119
|
+
method: "POST",
|
|
120
|
+
headers: {
|
|
121
|
+
"Content-Type": "application/json",
|
|
122
|
+
Authorization: `Bearer ${authToken}`,
|
|
123
|
+
},
|
|
124
|
+
body: JSON.stringify(createBody),
|
|
125
|
+
});
|
|
126
|
+
if (!createRes.ok) {
|
|
127
|
+
const body = await createRes.text().catch(() => "");
|
|
128
|
+
if (createRes.status === 401) {
|
|
129
|
+
console.error(chalk.red("\n Authentication required. Run `lobu login` or set ADMIN_PASSWORD.\n"));
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
console.error(chalk.red(`\n Failed to create session (${createRes.status}): ${body}\n`));
|
|
133
|
+
process.exit(1);
|
|
134
|
+
}
|
|
135
|
+
const session = (await createRes.json());
|
|
136
|
+
const base = `${gatewayUrl}/api/v1/agents/${session.agentId}`;
|
|
137
|
+
const sseUrl = `${base}/events`;
|
|
138
|
+
const messagesUrl = `${base}/messages`;
|
|
139
|
+
const sseController = new AbortController();
|
|
140
|
+
const streaming = streamResponse(sseUrl, session.token, sseController);
|
|
141
|
+
const msgRes = await fetch(messagesUrl, {
|
|
142
|
+
method: "POST",
|
|
143
|
+
headers: {
|
|
144
|
+
"Content-Type": "application/json",
|
|
145
|
+
Authorization: `Bearer ${session.token}`,
|
|
146
|
+
},
|
|
147
|
+
body: JSON.stringify({ content: opts.message }),
|
|
148
|
+
});
|
|
149
|
+
if (!msgRes.ok) {
|
|
150
|
+
sseController.abort();
|
|
151
|
+
const body = await msgRes.text().catch(() => "");
|
|
152
|
+
console.error(chalk.red(`\n Failed to send message (${msgRes.status}): ${body}\n`));
|
|
153
|
+
process.exit(1);
|
|
154
|
+
}
|
|
155
|
+
await streaming;
|
|
156
|
+
}
|
|
157
|
+
async function resolveAgentId(cwd) {
|
|
158
|
+
const result = await loadConfig(cwd);
|
|
159
|
+
if (isLoadError(result))
|
|
160
|
+
return undefined;
|
|
161
|
+
const ids = Object.keys(result.config.agents);
|
|
162
|
+
return ids[0];
|
|
163
|
+
}
|
|
164
|
+
async function streamResponse(sseUrl, token, controller) {
|
|
165
|
+
const OVERALL_TIMEOUT_MS = 5 * 60 * 1000;
|
|
166
|
+
const IDLE_TIMEOUT_MS = 60 * 1000;
|
|
167
|
+
const overallTimer = setTimeout(() => controller.abort(), OVERALL_TIMEOUT_MS);
|
|
168
|
+
let idleTimer = setTimeout(() => controller.abort(), IDLE_TIMEOUT_MS);
|
|
169
|
+
const resetIdleTimer = () => {
|
|
170
|
+
clearTimeout(idleTimer);
|
|
171
|
+
idleTimer = setTimeout(() => controller.abort(), IDLE_TIMEOUT_MS);
|
|
172
|
+
};
|
|
173
|
+
try {
|
|
174
|
+
const res = await fetch(sseUrl, {
|
|
175
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
176
|
+
signal: controller.signal,
|
|
177
|
+
});
|
|
178
|
+
if (!res.ok || !res.body) {
|
|
179
|
+
console.error(chalk.red(`\n SSE connection failed (${res.status})\n`));
|
|
180
|
+
process.exit(1);
|
|
181
|
+
}
|
|
182
|
+
const reader = res.body.getReader();
|
|
183
|
+
const decoder = new TextDecoder();
|
|
184
|
+
let buffer = "";
|
|
185
|
+
let currentEvent = "";
|
|
186
|
+
while (true) {
|
|
187
|
+
const { done, value } = await reader.read();
|
|
188
|
+
if (done)
|
|
189
|
+
break;
|
|
190
|
+
resetIdleTimer();
|
|
191
|
+
buffer += decoder.decode(value, { stream: true });
|
|
192
|
+
const lines = buffer.split("\n");
|
|
193
|
+
buffer = lines.pop() ?? "";
|
|
194
|
+
for (const line of lines) {
|
|
195
|
+
if (line.startsWith("event: ")) {
|
|
196
|
+
currentEvent = line.slice(7).trim();
|
|
197
|
+
}
|
|
198
|
+
else if (line.startsWith("data: ") && currentEvent) {
|
|
199
|
+
const data = parseJSON(line.slice(6));
|
|
200
|
+
if (!data)
|
|
201
|
+
continue;
|
|
202
|
+
switch (currentEvent) {
|
|
203
|
+
case "output":
|
|
204
|
+
if (typeof data.content === "string")
|
|
205
|
+
process.stdout.write(renderMarkdown(data.content));
|
|
206
|
+
break;
|
|
207
|
+
case "ephemeral":
|
|
208
|
+
if (typeof data.content === "string") {
|
|
209
|
+
console.error(`\n${renderMarkdown(data.content)}\n`);
|
|
210
|
+
}
|
|
211
|
+
controller.abort();
|
|
212
|
+
return;
|
|
213
|
+
case "link-button":
|
|
214
|
+
case "question":
|
|
215
|
+
case "grant-request":
|
|
216
|
+
case "package-request":
|
|
217
|
+
case "suggestion":
|
|
218
|
+
console.error(JSON.stringify({ event: currentEvent, ...data }));
|
|
219
|
+
break;
|
|
220
|
+
case "complete":
|
|
221
|
+
process.stdout.write("\n");
|
|
222
|
+
controller.abort();
|
|
223
|
+
return;
|
|
224
|
+
case "error":
|
|
225
|
+
process.stdout.write("\n");
|
|
226
|
+
console.error(chalk.red(`\n Agent error: ${String(data.error)}\n`));
|
|
227
|
+
controller.abort();
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
currentEvent = "";
|
|
231
|
+
}
|
|
232
|
+
else if (line === "") {
|
|
233
|
+
currentEvent = "";
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
if (err instanceof Error && err.name === "AbortError")
|
|
240
|
+
return;
|
|
241
|
+
throw err;
|
|
242
|
+
}
|
|
243
|
+
finally {
|
|
244
|
+
clearTimeout(overallTimer);
|
|
245
|
+
clearTimeout(idleTimer);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
function parseJSON(str) {
|
|
249
|
+
try {
|
|
250
|
+
const parsed = JSON.parse(str);
|
|
251
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
252
|
+
return parsed;
|
|
253
|
+
}
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
return null;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
async function resolveGatewayUrl(cwd) {
|
|
261
|
+
try {
|
|
262
|
+
const envContent = await readFile(join(cwd, ".env"), "utf-8");
|
|
263
|
+
for (const line of envContent.split("\n")) {
|
|
264
|
+
const trimmed = line.trim();
|
|
265
|
+
if (trimmed.startsWith("GATEWAY_PORT=")) {
|
|
266
|
+
let port = trimmed.slice("GATEWAY_PORT=".length);
|
|
267
|
+
if ((port.startsWith('"') && port.endsWith('"')) ||
|
|
268
|
+
(port.startsWith("'") && port.endsWith("'"))) {
|
|
269
|
+
port = port.slice(1, -1);
|
|
270
|
+
}
|
|
271
|
+
if (port)
|
|
272
|
+
return `http://localhost:${port}`;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
// No .env file
|
|
278
|
+
}
|
|
279
|
+
return "http://localhost:8080";
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function contextListCommand(): Promise<void>;
|
|
2
|
+
export declare function contextCurrentCommand(): Promise<void>;
|
|
3
|
+
export declare function contextAddCommand(options: {
|
|
4
|
+
name: string;
|
|
5
|
+
apiUrl: string;
|
|
6
|
+
}): Promise<void>;
|
|
7
|
+
export declare function contextUseCommand(name: string): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AASA,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAqBxD;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAU3D;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CAKhB;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWnE"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { addContext, getCurrentContextName, loadContextConfig, resolveContext, setCurrentContext, } from "../api/context.js";
|
|
3
|
+
export async function contextListCommand() {
|
|
4
|
+
const config = await loadContextConfig();
|
|
5
|
+
const currentContext = await getCurrentContextName();
|
|
6
|
+
console.log(chalk.bold("\n Lobu contexts"));
|
|
7
|
+
for (const [name, context] of Object.entries(config.contexts)) {
|
|
8
|
+
const marker = name === currentContext ? chalk.green(" *") : " ";
|
|
9
|
+
console.log(`${marker} ${name} ${chalk.dim(context.apiUrl)}`);
|
|
10
|
+
}
|
|
11
|
+
if (process.env.LOBU_CONTEXT || process.env.LOBU_API_URL) {
|
|
12
|
+
console.log(chalk.dim("\n Environment override is active."));
|
|
13
|
+
if (process.env.LOBU_CONTEXT) {
|
|
14
|
+
console.log(chalk.dim(` LOBU_CONTEXT=${process.env.LOBU_CONTEXT}`));
|
|
15
|
+
}
|
|
16
|
+
if (process.env.LOBU_API_URL) {
|
|
17
|
+
console.log(chalk.dim(` LOBU_API_URL=${process.env.LOBU_API_URL}`));
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
console.log();
|
|
21
|
+
}
|
|
22
|
+
export async function contextCurrentCommand() {
|
|
23
|
+
const context = await resolveContext();
|
|
24
|
+
console.log(chalk.bold("\n Current context"));
|
|
25
|
+
console.log(chalk.dim(` Name: ${context.name}`));
|
|
26
|
+
console.log(chalk.dim(` API URL: ${context.apiUrl}`));
|
|
27
|
+
if (context.source === "env") {
|
|
28
|
+
console.log(chalk.dim(" Source: environment override"));
|
|
29
|
+
}
|
|
30
|
+
console.log();
|
|
31
|
+
}
|
|
32
|
+
export async function contextAddCommand(options) {
|
|
33
|
+
await addContext(options.name, options.apiUrl);
|
|
34
|
+
console.log(chalk.green(`\n Saved context ${options.name} -> ${options.apiUrl}\n`));
|
|
35
|
+
}
|
|
36
|
+
export async function contextUseCommand(name) {
|
|
37
|
+
const trimmedName = name.trim();
|
|
38
|
+
const config = await setCurrentContext(trimmedName);
|
|
39
|
+
const context = config.contexts[trimmedName];
|
|
40
|
+
if (!context) {
|
|
41
|
+
throw new Error(`Context ${trimmedName} was not found after update.`);
|
|
42
|
+
}
|
|
43
|
+
console.log(chalk.green(`\n Switched to context ${trimmedName}`));
|
|
44
|
+
console.log(chalk.dim(` API URL: ${context.apiUrl}\n`));
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/dev.d.ts
CHANGED
|
@@ -1,13 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `lobu
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* Examples:
|
|
6
|
-
* lobu dev → docker compose up
|
|
7
|
-
* lobu dev -d → docker compose up -d
|
|
8
|
-
* lobu dev --build → docker compose up --build
|
|
9
|
-
* lobu dev -d --build → docker compose up -d --build
|
|
10
|
-
* lobu dev --force-recreate → docker compose up --force-recreate
|
|
2
|
+
* `lobu run` — smart wrapper around `docker compose up`.
|
|
3
|
+
* Validates lobu.toml, seeds .env, then starts docker compose.
|
|
4
|
+
* The gateway reads lobu.toml directly from the mounted workspace.
|
|
11
5
|
*/
|
|
12
6
|
export declare function devCommand(cwd: string, passthroughArgs: string[]): Promise<void>;
|
|
13
7
|
//# sourceMappingURL=dev.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAOA;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,eAAe,EAAE,MAAM,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC,CAoIf"}
|
package/dist/commands/dev.js
CHANGED
|
@@ -1,20 +1,13 @@
|
|
|
1
|
-
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
-
import { join } from "node:path";
|
|
3
1
|
import { spawn } from "node:child_process";
|
|
2
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { basename, join } from "node:path";
|
|
4
4
|
import chalk from "chalk";
|
|
5
5
|
import ora from "ora";
|
|
6
6
|
import { isLoadError, loadConfig } from "../config/loader.js";
|
|
7
|
-
import { transformConfig } from "../config/transformer.js";
|
|
8
7
|
/**
|
|
9
|
-
* `lobu
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* Examples:
|
|
13
|
-
* lobu dev → docker compose up
|
|
14
|
-
* lobu dev -d → docker compose up -d
|
|
15
|
-
* lobu dev --build → docker compose up --build
|
|
16
|
-
* lobu dev -d --build → docker compose up -d --build
|
|
17
|
-
* lobu dev --force-recreate → docker compose up --force-recreate
|
|
8
|
+
* `lobu run` — smart wrapper around `docker compose up`.
|
|
9
|
+
* Validates lobu.toml, seeds .env, then starts docker compose.
|
|
10
|
+
* The gateway reads lobu.toml directly from the mounted workspace.
|
|
18
11
|
*/
|
|
19
12
|
export async function devCommand(cwd, passthroughArgs) {
|
|
20
13
|
const result = await loadConfig(cwd);
|
|
@@ -31,8 +24,7 @@ export async function devCommand(cwd, passthroughArgs) {
|
|
|
31
24
|
const { config } = result;
|
|
32
25
|
const spinner = ora("Preparing local dev environment...").start();
|
|
33
26
|
try {
|
|
34
|
-
|
|
35
|
-
// Write .env from lobu.toml-derived vars (merge with existing .env to preserve secrets)
|
|
27
|
+
// Parse .env to merge derived vars
|
|
36
28
|
const envPath = join(cwd, ".env");
|
|
37
29
|
let existingEnv = "";
|
|
38
30
|
try {
|
|
@@ -41,45 +33,70 @@ export async function devCommand(cwd, passthroughArgs) {
|
|
|
41
33
|
catch {
|
|
42
34
|
// No existing .env, start fresh
|
|
43
35
|
}
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
await writeFile(join(lobuDir, "mcp.config.json"), JSON.stringify({ mcpServers: mcpConfig }, null, 2));
|
|
56
|
-
}
|
|
57
|
-
// Load IDENTITY.md, SOUL.md, USER.md if they exist
|
|
58
|
-
await seedMarkdownFiles(cwd, mergedVars);
|
|
36
|
+
const dotenvVars = parseEnvFile(existingEnv);
|
|
37
|
+
const agentCount = Object.keys(config.agents).length;
|
|
38
|
+
// Derive env vars (compose project name from first agent or directory name)
|
|
39
|
+
const firstAgent = Object.values(config.agents)[0];
|
|
40
|
+
const envVars = {
|
|
41
|
+
COMPOSE_PROJECT_NAME: firstAgent?.name
|
|
42
|
+
? firstAgent.name.toLowerCase().replace(/\s+/g, "-")
|
|
43
|
+
: basename(cwd),
|
|
44
|
+
};
|
|
45
|
+
// Merge derived vars into existing .env (preserves comments and formatting)
|
|
46
|
+
await mergeEnvFile(envPath, existingEnv, envVars);
|
|
59
47
|
spinner.succeed("Environment prepared from lobu.toml");
|
|
60
48
|
// Check for docker-compose.yml
|
|
61
|
-
const composePath = join(cwd, "docker-compose.yml");
|
|
62
49
|
try {
|
|
63
|
-
await readFile(
|
|
50
|
+
await readFile(join(cwd, "docker-compose.yml"), "utf-8");
|
|
64
51
|
}
|
|
65
52
|
catch {
|
|
66
53
|
console.log(chalk.yellow("\n No docker-compose.yml found. Run `lobu init` to generate one.\n"));
|
|
67
54
|
process.exit(1);
|
|
68
55
|
}
|
|
69
|
-
|
|
70
|
-
console.log(chalk.cyan(`\n Starting ${
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
56
|
+
const fallbackPort = dotenvVars.GATEWAY_PORT || "8080";
|
|
57
|
+
console.log(chalk.cyan(`\n Starting ${agentCount} agent(s)...\n`));
|
|
58
|
+
const explicitDetach = passthroughArgs.includes("-d") || passthroughArgs.includes("--detach");
|
|
59
|
+
// Always start detached so we can print the banner before logs
|
|
60
|
+
const upArgs = explicitDetach
|
|
61
|
+
? ["compose", "up", ...passthroughArgs]
|
|
62
|
+
: ["compose", "up", "-d", ...passthroughArgs];
|
|
63
|
+
const up = spawn("docker", upArgs, { cwd, stdio: "inherit" });
|
|
64
|
+
up.on("error", (err) => {
|
|
77
65
|
console.error(chalk.red(`\n Failed to start docker compose: ${err.message}`));
|
|
78
66
|
console.log(chalk.dim(" Make sure Docker Desktop is running.\n"));
|
|
79
67
|
process.exit(1);
|
|
80
68
|
});
|
|
81
|
-
|
|
82
|
-
|
|
69
|
+
up.on("exit", (code) => {
|
|
70
|
+
if (code !== 0) {
|
|
71
|
+
process.exit(code ?? 1);
|
|
72
|
+
}
|
|
73
|
+
// Detect actual host port from the running container
|
|
74
|
+
const portProbe = spawn("docker", ["compose", "port", "gateway", "8080"], { cwd, stdio: ["ignore", "pipe", "ignore"] });
|
|
75
|
+
let portOutput = "";
|
|
76
|
+
portProbe.stdout.on("data", (data) => {
|
|
77
|
+
portOutput += data.toString();
|
|
78
|
+
});
|
|
79
|
+
portProbe.on("exit", () => {
|
|
80
|
+
const match = portOutput.trim().match(/:(\d+)$/);
|
|
81
|
+
const port = match ? match[1] : fallbackPort;
|
|
82
|
+
const gatewayUrl = `http://localhost:${port}`;
|
|
83
|
+
console.log(chalk.green("\n Lobu is running!\n"));
|
|
84
|
+
console.log(chalk.cyan(` API docs: ${gatewayUrl}/api/docs`));
|
|
85
|
+
console.log(chalk.dim(`\n Stop: docker compose down`));
|
|
86
|
+
if (explicitDetach) {
|
|
87
|
+
console.log(chalk.dim(` View logs: docker compose logs -f gateway\n`));
|
|
88
|
+
process.exit(0);
|
|
89
|
+
}
|
|
90
|
+
console.log(chalk.dim(` Ctrl+C stops log tail, containers keep running.\n`));
|
|
91
|
+
// Tail only gateway logs (skip redis noise)
|
|
92
|
+
const logs = spawn("docker", ["compose", "logs", "-f", "gateway"], {
|
|
93
|
+
cwd,
|
|
94
|
+
stdio: "inherit",
|
|
95
|
+
});
|
|
96
|
+
logs.on("exit", (logCode) => {
|
|
97
|
+
process.exit(logCode ?? 0);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
83
100
|
});
|
|
84
101
|
}
|
|
85
102
|
catch (err) {
|
|
@@ -88,28 +105,6 @@ export async function devCommand(cwd, passthroughArgs) {
|
|
|
88
105
|
process.exit(1);
|
|
89
106
|
}
|
|
90
107
|
}
|
|
91
|
-
/**
|
|
92
|
-
* Read IDENTITY.md, SOUL.md, USER.md and add their content as env vars
|
|
93
|
-
* so the gateway can seed agent settings on startup.
|
|
94
|
-
*/
|
|
95
|
-
async function seedMarkdownFiles(cwd, envVars) {
|
|
96
|
-
const files = [
|
|
97
|
-
{ path: "IDENTITY.md", envKey: "AGENT_IDENTITY_MD" },
|
|
98
|
-
{ path: "SOUL.md", envKey: "AGENT_SOUL_MD" },
|
|
99
|
-
{ path: "USER.md", envKey: "AGENT_USER_MD" },
|
|
100
|
-
];
|
|
101
|
-
for (const { path, envKey } of files) {
|
|
102
|
-
try {
|
|
103
|
-
const content = await readFile(join(cwd, path), "utf-8");
|
|
104
|
-
if (content.trim()) {
|
|
105
|
-
envVars[envKey] = content.trim();
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
catch {
|
|
109
|
-
// File doesn't exist, skip
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
108
|
function parseEnvFile(content) {
|
|
114
109
|
const vars = {};
|
|
115
110
|
for (const line of content.split("\n")) {
|
|
@@ -120,9 +115,45 @@ function parseEnvFile(content) {
|
|
|
120
115
|
if (eqIdx === -1)
|
|
121
116
|
continue;
|
|
122
117
|
const key = trimmed.slice(0, eqIdx);
|
|
123
|
-
|
|
118
|
+
let value = trimmed.slice(eqIdx + 1);
|
|
119
|
+
// Strip surrounding quotes (double or single)
|
|
120
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
121
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
122
|
+
value = value.slice(1, -1);
|
|
123
|
+
}
|
|
124
124
|
vars[key] = value;
|
|
125
125
|
}
|
|
126
126
|
return vars;
|
|
127
127
|
}
|
|
128
|
+
/**
|
|
129
|
+
* Merge derived env vars into an existing .env file.
|
|
130
|
+
* Updates existing keys in-place and appends new ones at the end.
|
|
131
|
+
* Preserves comments, blank lines, and formatting.
|
|
132
|
+
*/
|
|
133
|
+
async function mergeEnvFile(envPath, existingContent, newVars) {
|
|
134
|
+
const remaining = { ...newVars };
|
|
135
|
+
const lines = existingContent.split("\n");
|
|
136
|
+
const updated = lines.map((line) => {
|
|
137
|
+
const trimmed = line.trim();
|
|
138
|
+
if (!trimmed || trimmed.startsWith("#"))
|
|
139
|
+
return line;
|
|
140
|
+
const eqIdx = trimmed.indexOf("=");
|
|
141
|
+
if (eqIdx === -1)
|
|
142
|
+
return line;
|
|
143
|
+
const key = trimmed.slice(0, eqIdx);
|
|
144
|
+
if (key in remaining) {
|
|
145
|
+
const val = remaining[key];
|
|
146
|
+
delete remaining[key];
|
|
147
|
+
return `${key}=${val}`;
|
|
148
|
+
}
|
|
149
|
+
return line;
|
|
150
|
+
});
|
|
151
|
+
// Append any new vars that weren't already in the file
|
|
152
|
+
for (const [key, value] of Object.entries(remaining)) {
|
|
153
|
+
updated.push(`${key}=${value}`);
|
|
154
|
+
}
|
|
155
|
+
// Ensure trailing newline
|
|
156
|
+
const content = `${updated.join("\n").trimEnd()}\n`;
|
|
157
|
+
await writeFile(envPath, content);
|
|
158
|
+
}
|
|
128
159
|
//# sourceMappingURL=dev.js.map
|
package/dist/commands/dev.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE9D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAW,EACX,eAAyB;IAEzB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;IAErC,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAChD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAC1B,MAAM,OAAO,GAAG,GAAG,CAAC,oCAAoC,CAAC,CAAC,KAAK,EAAE,CAAC;IAElE,IAAI,CAAC;QACH,mCAAmC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAClC,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,WAAW,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;QACD,MAAM,UAAU,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;QAE7C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;QAErD,4EAA4E;QAC5E,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,OAAO,GAA2B;YACtC,oBAAoB,EAAE,UAAU,EAAE,IAAI;gBACpC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;gBACpD,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;SAClB,CAAC;QAEF,4EAA4E;QAC5E,MAAM,YAAY,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QAElD,OAAO,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC;QAEvD,+BAA+B;QAC/B,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,qEAAqE,CACtE,CACF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,YAAY,GAAG,UAAU,CAAC,YAAY,IAAI,MAAM,CAAC;QAEvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,UAAU,gBAAgB,CAAC,CAAC,CAAC;QAEpE,MAAM,cAAc,GAClB,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAEzE,+DAA+D;QAC/D,MAAM,MAAM,GAAG,cAAc;YAC3B,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC;YACvC,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,CAAC;QAEhD,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAE9D,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACrB,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,uCAAuC,GAAG,CAAC,OAAO,EAAE,CAAC,CAChE,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAC;YACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACrB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;YAC1B,CAAC;YAED,qDAAqD;YACrD,MAAM,SAAS,GAAG,KAAK,CACrB,QAAQ,EACR,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EACtC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAC7C,CAAC;YAEF,IAAI,UAAU,GAAG,EAAE,CAAC;YACpB,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBAC3C,UAAU,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChC,CAAC,CAAC,CAAC;YAEH,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;gBACxB,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBACjD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;gBAC7C,MAAM,UAAU,GAAG,oBAAoB,IAAI,EAAE,CAAC;gBAE9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;gBACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,UAAU,WAAW,CAAC,CAAC,CAAC;gBACnE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC,CAAC;gBAEjE,IAAI,cAAc,EAAE,CAAC;oBACnB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAC/D,CAAC;oBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBAED,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,qDAAqD,CAAC,CACjE,CAAC;gBAEF,4CAA4C;gBAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE;oBACjE,GAAG;oBACH,KAAK,EAAE,SAAS;iBACjB,CAAC,CAAC;gBAEH,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;oBAC1B,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;gBAC7B,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC9C,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CACnE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACnC,MAAM,IAAI,GAA2B,EAAE,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAClD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,SAAS;QAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACpC,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACrC,8CAA8C;QAC9C,IACE,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9C,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAC9C,CAAC;YACD,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACpB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,YAAY,CACzB,OAAe,EACf,eAAuB,EACvB,OAA+B;IAE/B,MAAM,SAAS,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE1C,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACrD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACpC,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;YACrB,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAE,CAAC;YAC5B,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;QACzB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,uDAAuD;IACvD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,0BAA0B;IAC1B,MAAM,OAAO,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC;IACpD,MAAM,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAeA,wBAAsB,WAAW,CAC/B,GAAG,GAAE,MAAsB,EAC3B,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC,CA8iBf"}
|