@lobu/cli 4.2.0 → 5.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/dist/commands/connections/platforms.d.ts +2 -1
- package/dist/commands/connections/platforms.d.ts.map +1 -1
- package/dist/commands/connections/platforms.js +47 -77
- package/dist/commands/connections/platforms.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +102 -159
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +6 -12
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/providers/add.d.ts.map +1 -1
- package/dist/commands/providers/add.js +5 -9
- package/dist/commands/providers/add.js.map +1 -1
- package/dist/commands/skills/registry.d.ts +2 -3
- package/dist/commands/skills/registry.d.ts.map +1 -1
- package/dist/commands/skills/registry.js +1 -1
- package/dist/commands/skills/registry.js.map +1 -1
- package/dist/config/agent-helpers.d.ts +2 -1
- package/dist/config/agent-helpers.d.ts.map +1 -1
- package/dist/config/loader.d.ts +3 -2
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/eval/client.d.ts +0 -13
- package/dist/eval/client.d.ts.map +1 -1
- package/dist/eval/client.js +2 -2
- package/dist/eval/client.js.map +1 -1
- package/dist/eval/grader.d.ts +2 -1
- package/dist/eval/grader.d.ts.map +1 -1
- package/dist/eval/reporter.d.ts +0 -2
- package/dist/eval/reporter.d.ts.map +1 -1
- package/dist/eval/reporter.js +2 -2
- package/dist/eval/reporter.js.map +1 -1
- package/dist/eval/runner.d.ts +2 -1
- package/dist/eval/runner.d.ts.map +1 -1
- package/dist/eval/runner.js +1 -2
- package/dist/eval/runner.js.map +1 -1
- package/dist/eval/types.d.ts +0 -16
- package/dist/eval/types.d.ts.map +1 -1
- package/dist/internal/context.d.ts +4 -3
- package/dist/internal/context.d.ts.map +1 -1
- package/dist/internal/credentials.d.ts +2 -1
- package/dist/internal/credentials.d.ts.map +1 -1
- package/dist/internal/gateway-url.d.ts +2 -1
- package/dist/internal/gateway-url.d.ts.map +1 -1
- package/dist/internal/index.d.ts +3 -3
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +1 -1
- package/dist/internal/index.js.map +1 -1
- package/dist/providers.json +0 -17
- package/package.json +3 -4
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Shared platform connection prompt/config logic.
|
|
3
3
|
* Used by both `lobu init` and `lobu connections add <platform>`.
|
|
4
4
|
*/
|
|
5
|
-
|
|
5
|
+
interface PlatformPromptResult {
|
|
6
6
|
connectionConfig: Record<string, string>;
|
|
7
7
|
connectionSecrets: Array<{
|
|
8
8
|
envVar: string;
|
|
@@ -11,4 +11,5 @@ export interface PlatformPromptResult {
|
|
|
11
11
|
}
|
|
12
12
|
export declare const PLATFORM_LABELS: Record<string, string>;
|
|
13
13
|
export declare function promptPlatformConfig(platform: string): Promise<PlatformPromptResult>;
|
|
14
|
+
export {};
|
|
14
15
|
//# sourceMappingURL=platforms.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platforms.d.ts","sourceRoot":"","sources":["../../../src/commands/connections/platforms.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,
|
|
1
|
+
{"version":3,"file":"platforms.d.ts","sourceRoot":"","sources":["../../../src/commands/connections/platforms.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,UAAU,oBAAoB;IAC5B,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,iBAAiB,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7D;AAED,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAOlD,CAAC;AAEF,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,CAAC,CAgI/B"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Shared platform connection prompt/config logic.
|
|
3
3
|
* Used by both `lobu init` and `lobu connections add <platform>`.
|
|
4
4
|
*/
|
|
5
|
-
import
|
|
5
|
+
import { input, password } from "@inquirer/prompts";
|
|
6
6
|
export const PLATFORM_LABELS = {
|
|
7
7
|
telegram: "Telegram",
|
|
8
8
|
slack: "Slack",
|
|
@@ -15,14 +15,10 @@ export async function promptPlatformConfig(platform) {
|
|
|
15
15
|
const connectionConfig = {};
|
|
16
16
|
const connectionSecrets = [];
|
|
17
17
|
if (platform === "telegram") {
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
message: "Telegram bot token (from @BotFather):",
|
|
23
|
-
mask: "*",
|
|
24
|
-
},
|
|
25
|
-
]);
|
|
18
|
+
const botToken = await password({
|
|
19
|
+
message: "Telegram bot token (from @BotFather):",
|
|
20
|
+
mask: true,
|
|
21
|
+
});
|
|
26
22
|
if (botToken) {
|
|
27
23
|
connectionConfig.botToken = "$TELEGRAM_BOT_TOKEN";
|
|
28
24
|
connectionSecrets.push({ envVar: "TELEGRAM_BOT_TOKEN", value: botToken });
|
|
@@ -39,116 +35,90 @@ export async function promptPlatformConfig(platform) {
|
|
|
39
35
|
console.log(" bun run scripts/slack-manifest.ts print)");
|
|
40
36
|
console.log(" 3. In the manifest, replace the request URLs with https://<gateway>/api/v1/webhooks/<agent>-slack");
|
|
41
37
|
console.log(" 4. Install the app to your workspace to mint the bot token.\n");
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
name: "signingSecret",
|
|
52
|
-
message: "Slack signing secret:",
|
|
53
|
-
mask: "*",
|
|
54
|
-
},
|
|
55
|
-
]);
|
|
56
|
-
if (slackAnswers.botToken) {
|
|
38
|
+
const slackBotToken = await password({
|
|
39
|
+
message: "Slack bot token (xoxb-...):",
|
|
40
|
+
mask: true,
|
|
41
|
+
});
|
|
42
|
+
const slackSigningSecret = await password({
|
|
43
|
+
message: "Slack signing secret:",
|
|
44
|
+
mask: true,
|
|
45
|
+
});
|
|
46
|
+
if (slackBotToken) {
|
|
57
47
|
connectionConfig.botToken = "$SLACK_BOT_TOKEN";
|
|
58
48
|
connectionSecrets.push({
|
|
59
49
|
envVar: "SLACK_BOT_TOKEN",
|
|
60
|
-
value:
|
|
50
|
+
value: slackBotToken,
|
|
61
51
|
});
|
|
62
52
|
}
|
|
63
|
-
if (
|
|
53
|
+
if (slackSigningSecret) {
|
|
64
54
|
connectionConfig.signingSecret = "$SLACK_SIGNING_SECRET";
|
|
65
55
|
connectionSecrets.push({
|
|
66
56
|
envVar: "SLACK_SIGNING_SECRET",
|
|
67
|
-
value:
|
|
57
|
+
value: slackSigningSecret,
|
|
68
58
|
});
|
|
69
59
|
}
|
|
70
60
|
}
|
|
71
61
|
else if (platform === "discord") {
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
message: "Discord bot token:",
|
|
77
|
-
mask: "*",
|
|
78
|
-
},
|
|
79
|
-
]);
|
|
62
|
+
const botToken = await password({
|
|
63
|
+
message: "Discord bot token:",
|
|
64
|
+
mask: true,
|
|
65
|
+
});
|
|
80
66
|
if (botToken) {
|
|
81
67
|
connectionConfig.botToken = "$DISCORD_BOT_TOKEN";
|
|
82
68
|
connectionSecrets.push({ envVar: "DISCORD_BOT_TOKEN", value: botToken });
|
|
83
69
|
}
|
|
84
70
|
}
|
|
85
71
|
else if (platform === "whatsapp") {
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
type: "input",
|
|
95
|
-
name: "phoneNumberId",
|
|
96
|
-
message: "WhatsApp phone number ID:",
|
|
97
|
-
},
|
|
98
|
-
]);
|
|
99
|
-
if (whatsappAnswers.accessToken) {
|
|
72
|
+
const accessToken = await password({
|
|
73
|
+
message: "WhatsApp Business access token:",
|
|
74
|
+
mask: true,
|
|
75
|
+
});
|
|
76
|
+
const phoneNumberId = await input({
|
|
77
|
+
message: "WhatsApp phone number ID:",
|
|
78
|
+
});
|
|
79
|
+
if (accessToken) {
|
|
100
80
|
connectionConfig.accessToken = "$WHATSAPP_ACCESS_TOKEN";
|
|
101
81
|
connectionSecrets.push({
|
|
102
82
|
envVar: "WHATSAPP_ACCESS_TOKEN",
|
|
103
|
-
value:
|
|
83
|
+
value: accessToken,
|
|
104
84
|
});
|
|
105
85
|
}
|
|
106
|
-
if (
|
|
86
|
+
if (phoneNumberId) {
|
|
107
87
|
connectionConfig.phoneNumberId = "$WHATSAPP_PHONE_NUMBER_ID";
|
|
108
88
|
connectionSecrets.push({
|
|
109
89
|
envVar: "WHATSAPP_PHONE_NUMBER_ID",
|
|
110
|
-
value:
|
|
90
|
+
value: phoneNumberId,
|
|
111
91
|
});
|
|
112
92
|
}
|
|
113
93
|
}
|
|
114
94
|
else if (platform === "teams") {
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
name: "appPassword",
|
|
124
|
-
message: "Teams App Password (client secret):",
|
|
125
|
-
mask: "*",
|
|
126
|
-
},
|
|
127
|
-
]);
|
|
128
|
-
if (teamsAnswers.appId) {
|
|
95
|
+
const appId = await input({
|
|
96
|
+
message: "Teams App ID (from Azure Bot):",
|
|
97
|
+
});
|
|
98
|
+
const appPassword = await password({
|
|
99
|
+
message: "Teams App Password (client secret):",
|
|
100
|
+
mask: true,
|
|
101
|
+
});
|
|
102
|
+
if (appId) {
|
|
129
103
|
connectionConfig.appId = "$TEAMS_APP_ID";
|
|
130
104
|
connectionSecrets.push({
|
|
131
105
|
envVar: "TEAMS_APP_ID",
|
|
132
|
-
value:
|
|
106
|
+
value: appId,
|
|
133
107
|
});
|
|
134
108
|
}
|
|
135
|
-
if (
|
|
109
|
+
if (appPassword) {
|
|
136
110
|
connectionConfig.appPassword = "$TEAMS_APP_PASSWORD";
|
|
137
111
|
connectionSecrets.push({
|
|
138
112
|
envVar: "TEAMS_APP_PASSWORD",
|
|
139
|
-
value:
|
|
113
|
+
value: appPassword,
|
|
140
114
|
});
|
|
141
115
|
}
|
|
142
116
|
}
|
|
143
117
|
else if (platform === "gchat") {
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
message: "Google Chat service account JSON:",
|
|
149
|
-
mask: "*",
|
|
150
|
-
},
|
|
151
|
-
]);
|
|
118
|
+
const credentials = await password({
|
|
119
|
+
message: "Google Chat service account JSON:",
|
|
120
|
+
mask: true,
|
|
121
|
+
});
|
|
152
122
|
if (credentials) {
|
|
153
123
|
connectionConfig.credentials = "$GOOGLE_CHAT_CREDENTIALS";
|
|
154
124
|
connectionSecrets.push({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platforms.js","sourceRoot":"","sources":["../../../src/commands/connections/platforms.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,QAAQ,MAAM,
|
|
1
|
+
{"version":3,"file":"platforms.js","sourceRoot":"","sources":["../../../src/commands/connections/platforms.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAmBA,wBAAsB,WAAW,CAC/B,GAAG,GAAE,MAAsB,EAC3B,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAmBA,wBAAsB,WAAW,CAC/B,GAAG,GAAE,MAAsB,EAC3B,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC,CA4gBf;AAUD,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE;IACP,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,GACA,OAAO,CAAC,IAAI,CAAC,CAqGf;AASD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,UAAU,GAAG,QAAQ,CAAC;IACtC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B,GAAG,MAAM,CAwJT"}
|
package/dist/commands/init.js
CHANGED
|
@@ -2,14 +2,14 @@ import { randomBytes } from "node:crypto";
|
|
|
2
2
|
import { constants } from "node:fs";
|
|
3
3
|
import { access, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
4
4
|
import { join } from "node:path";
|
|
5
|
+
import { confirm, input, password, select } from "@inquirer/prompts";
|
|
5
6
|
import chalk from "chalk";
|
|
6
|
-
import inquirer from "inquirer";
|
|
7
7
|
import ora from "ora";
|
|
8
8
|
import { promptPlatformConfig } from "../commands/connections/platforms.js";
|
|
9
9
|
import { secretsSetCommand } from "../commands/secrets.js";
|
|
10
10
|
import { getProviderById, loadProviderRegistry, } from "../commands/providers/registry.js";
|
|
11
11
|
import { renderTemplate } from "../utils/template.js";
|
|
12
|
-
const DEFAULT_OWLETTO_MCP_URL = "https://
|
|
12
|
+
const DEFAULT_OWLETTO_MCP_URL = "https://lobu.ai/mcp";
|
|
13
13
|
const LOCAL_OWLETTO_MCP_URL = "http://owletto:8787/mcp";
|
|
14
14
|
export async function initCommand(cwd = process.cwd(), projectNameArg) {
|
|
15
15
|
console.log(chalk.bold.cyan("\n🤖 Welcome to Lobu!\n"));
|
|
@@ -21,23 +21,17 @@ export async function initCommand(cwd = process.cwd(), projectNameArg) {
|
|
|
21
21
|
process.exit(1);
|
|
22
22
|
}
|
|
23
23
|
// Interactive prompts - basic setup
|
|
24
|
-
const
|
|
25
|
-
{
|
|
26
|
-
type: "input",
|
|
27
|
-
name: "projectName",
|
|
24
|
+
const projectName = projectNameArg ||
|
|
25
|
+
(await input({
|
|
28
26
|
message: "Project name?",
|
|
29
|
-
default:
|
|
30
|
-
validate: (
|
|
31
|
-
if (!/^[a-z0-9-]+$/.test(
|
|
27
|
+
default: "my-lobu",
|
|
28
|
+
validate: (value) => {
|
|
29
|
+
if (!/^[a-z0-9-]+$/.test(value)) {
|
|
32
30
|
return "Project name must be lowercase alphanumeric with hyphens only";
|
|
33
31
|
}
|
|
34
32
|
return true;
|
|
35
33
|
},
|
|
36
|
-
|
|
37
|
-
},
|
|
38
|
-
]);
|
|
39
|
-
// Use project name from argument or prompt
|
|
40
|
-
const projectName = projectNameArg || baseAnswers.projectName;
|
|
34
|
+
}));
|
|
41
35
|
const projectDir = join(cwd, projectName);
|
|
42
36
|
try {
|
|
43
37
|
await access(projectDir, constants.F_OK);
|
|
@@ -50,87 +44,67 @@ export async function initCommand(cwd = process.cwd(), projectNameArg) {
|
|
|
50
44
|
console.log(chalk.dim(`\nCreating project in: ${chalk.cyan(projectDir)}\n`));
|
|
51
45
|
}
|
|
52
46
|
// Deployment mode selection
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
{
|
|
64
|
-
name: "Docker — isolated containers per user, full OS access, heavier but more capable",
|
|
65
|
-
value: "docker",
|
|
66
|
-
},
|
|
67
|
-
],
|
|
68
|
-
default: "embedded",
|
|
69
|
-
},
|
|
70
|
-
]);
|
|
71
|
-
// Gateway port selection
|
|
72
|
-
const { gatewayPort } = await inquirer.prompt([
|
|
73
|
-
{
|
|
74
|
-
type: "input",
|
|
75
|
-
name: "gatewayPort",
|
|
76
|
-
message: "Gateway port?",
|
|
77
|
-
default: "8080",
|
|
78
|
-
validate: (input) => {
|
|
79
|
-
const port = Number(input);
|
|
80
|
-
if (!Number.isInteger(port) || port < 1 || port > 65535) {
|
|
81
|
-
return "Please enter a valid port number (1-65535)";
|
|
82
|
-
}
|
|
83
|
-
return true;
|
|
47
|
+
const deploymentMode = await select({
|
|
48
|
+
message: "How should workers run?",
|
|
49
|
+
choices: [
|
|
50
|
+
{
|
|
51
|
+
name: "Embedded — virtual bash & filesystem, no package installs, lower resource usage",
|
|
52
|
+
value: "embedded",
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: "Docker — isolated containers per user, full OS access, heavier but more capable",
|
|
56
|
+
value: "docker",
|
|
84
57
|
},
|
|
58
|
+
],
|
|
59
|
+
default: "embedded",
|
|
60
|
+
});
|
|
61
|
+
// Gateway port selection
|
|
62
|
+
const gatewayPort = await input({
|
|
63
|
+
message: "Gateway port?",
|
|
64
|
+
default: "8080",
|
|
65
|
+
validate: (value) => {
|
|
66
|
+
const port = Number(value);
|
|
67
|
+
if (!Number.isInteger(port) || port < 1 || port > 65535) {
|
|
68
|
+
return "Please enter a valid port number (1-65535)";
|
|
69
|
+
}
|
|
70
|
+
return true;
|
|
85
71
|
},
|
|
86
|
-
|
|
72
|
+
});
|
|
87
73
|
// Public gateway URL (optional — only needed for OAuth callbacks and external webhooks)
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
message: "Public gateway URL? (leave empty for local dev, set for OAuth/webhooks)",
|
|
93
|
-
default: "",
|
|
94
|
-
},
|
|
95
|
-
]);
|
|
74
|
+
const publicGatewayUrl = await input({
|
|
75
|
+
message: "Public gateway URL? (leave empty for local dev, set for OAuth/webhooks)",
|
|
76
|
+
default: "",
|
|
77
|
+
});
|
|
96
78
|
// Admin password
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
return "Password must be at least 4 characters";
|
|
106
|
-
}
|
|
107
|
-
return true;
|
|
108
|
-
},
|
|
79
|
+
const adminPassword = await password({
|
|
80
|
+
message: "Admin password?",
|
|
81
|
+
mask: true,
|
|
82
|
+
validate: (value) => {
|
|
83
|
+
if (!value || value.length < 4) {
|
|
84
|
+
return "Password must be at least 4 characters";
|
|
85
|
+
}
|
|
86
|
+
return true;
|
|
109
87
|
},
|
|
110
|
-
|
|
88
|
+
});
|
|
111
89
|
// Worker network access policy
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
],
|
|
131
|
-
default: "restricted",
|
|
132
|
-
},
|
|
133
|
-
]);
|
|
90
|
+
const networkPolicy = await select({
|
|
91
|
+
message: "Worker network access?",
|
|
92
|
+
choices: [
|
|
93
|
+
{
|
|
94
|
+
name: "Restricted (recommended) — common registries only (npm, GitHub, PyPI)",
|
|
95
|
+
value: "restricted",
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
name: "Open — workers can access any domain",
|
|
99
|
+
value: "open",
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
name: "Isolated — workers have no internet access",
|
|
103
|
+
value: "isolated",
|
|
104
|
+
},
|
|
105
|
+
],
|
|
106
|
+
default: "restricted",
|
|
107
|
+
});
|
|
134
108
|
// Provider selection (from the bundled providers registry)
|
|
135
109
|
const providerSkills = loadProviderRegistry();
|
|
136
110
|
const providerChoices = [
|
|
@@ -140,30 +114,21 @@ export async function initCommand(cwd = process.cwd(), projectNameArg) {
|
|
|
140
114
|
value: s.id,
|
|
141
115
|
})),
|
|
142
116
|
];
|
|
143
|
-
const
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
choices: providerChoices,
|
|
149
|
-
default: "",
|
|
150
|
-
},
|
|
151
|
-
]);
|
|
117
|
+
const providerId = await select({
|
|
118
|
+
message: "AI provider?",
|
|
119
|
+
choices: providerChoices,
|
|
120
|
+
default: "",
|
|
121
|
+
});
|
|
152
122
|
let providerApiKey = "";
|
|
153
123
|
let selectedProvider;
|
|
154
124
|
if (providerId) {
|
|
155
125
|
selectedProvider = getProviderById(providerId);
|
|
156
126
|
const p = selectedProvider?.providers?.[0];
|
|
157
127
|
if (p) {
|
|
158
|
-
|
|
159
|
-
{
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
message: `${p.displayName} API key:`,
|
|
163
|
-
mask: "*",
|
|
164
|
-
},
|
|
165
|
-
]);
|
|
166
|
-
providerApiKey = apiKey || "";
|
|
128
|
+
providerApiKey = await password({
|
|
129
|
+
message: `${p.displayName} API key:`,
|
|
130
|
+
mask: true,
|
|
131
|
+
});
|
|
167
132
|
}
|
|
168
133
|
}
|
|
169
134
|
// Define skills locally via skills/<name>/SKILL.md or
|
|
@@ -178,36 +143,28 @@ export async function initCommand(cwd = process.cwd(), projectNameArg) {
|
|
|
178
143
|
{ name: "Microsoft Teams", value: "teams" },
|
|
179
144
|
{ name: "Google Chat", value: "gchat" },
|
|
180
145
|
];
|
|
181
|
-
const
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
choices: platformChoices,
|
|
187
|
-
default: "",
|
|
188
|
-
},
|
|
189
|
-
]);
|
|
146
|
+
const platformType = await select({
|
|
147
|
+
message: "Connect a messaging platform?",
|
|
148
|
+
choices: platformChoices,
|
|
149
|
+
default: "",
|
|
150
|
+
});
|
|
190
151
|
const { connectionConfig, connectionSecrets } = platformType
|
|
191
152
|
? await promptPlatformConfig(platformType)
|
|
192
153
|
: { connectionConfig: {}, connectionSecrets: [] };
|
|
193
154
|
// Memory
|
|
194
|
-
const
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
name: "
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
],
|
|
208
|
-
default: "none",
|
|
209
|
-
},
|
|
210
|
-
]);
|
|
155
|
+
const memoryChoice = await select({
|
|
156
|
+
message: "Memory:",
|
|
157
|
+
choices: [
|
|
158
|
+
{ name: "None (filesystem memory)", value: "none" },
|
|
159
|
+
{ name: "Lobu Cloud (app.lobu.ai)", value: "owletto-cloud" },
|
|
160
|
+
{
|
|
161
|
+
name: "Lobu memory Local (runs alongside gateway)",
|
|
162
|
+
value: "owletto-local",
|
|
163
|
+
},
|
|
164
|
+
{ name: "Custom Lobu memory URL", value: "owletto-custom" },
|
|
165
|
+
],
|
|
166
|
+
default: "none",
|
|
167
|
+
});
|
|
211
168
|
const envSecrets = [];
|
|
212
169
|
const includeOwlettoMemory = memoryChoice !== "none";
|
|
213
170
|
let includeOwlettoLocal = false;
|
|
@@ -229,27 +186,18 @@ export async function initCommand(cwd = process.cwd(), projectNameArg) {
|
|
|
229
186
|
});
|
|
230
187
|
}
|
|
231
188
|
else if (memoryChoice === "owletto-custom") {
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
message: "Lobu memory MCP URL:",
|
|
237
|
-
validate: (v) => (v ? true : "URL is required"),
|
|
238
|
-
},
|
|
239
|
-
]);
|
|
240
|
-
owlettoUrl = customOwlettoUrl;
|
|
189
|
+
owlettoUrl = await input({
|
|
190
|
+
message: "Lobu memory MCP URL:",
|
|
191
|
+
validate: (v) => (v ? true : "URL is required"),
|
|
192
|
+
});
|
|
241
193
|
envSecrets.push({ envVar: "MEMORY_URL", value: owlettoUrl });
|
|
242
194
|
}
|
|
243
195
|
// "none" — no Owletto scaffold, gateway defaults to filesystem memory
|
|
244
196
|
// Observability — OTEL tracing endpoint
|
|
245
|
-
const
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
message: "OpenTelemetry collector endpoint? (leave empty to disable tracing)",
|
|
250
|
-
default: "",
|
|
251
|
-
},
|
|
252
|
-
]);
|
|
197
|
+
const otelEndpoint = await input({
|
|
198
|
+
message: "OpenTelemetry collector endpoint? (leave empty to disable tracing)",
|
|
199
|
+
default: "",
|
|
200
|
+
});
|
|
253
201
|
if (otelEndpoint) {
|
|
254
202
|
envSecrets.push({
|
|
255
203
|
envVar: "OTEL_EXPORTER_OTLP_ENDPOINT",
|
|
@@ -257,14 +205,10 @@ export async function initCommand(cwd = process.cwd(), projectNameArg) {
|
|
|
257
205
|
});
|
|
258
206
|
}
|
|
259
207
|
// Observability — Sentry error reporting
|
|
260
|
-
const
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
message: "Help improve Lobu by sharing anonymous error reports with Sentry?",
|
|
265
|
-
default: true,
|
|
266
|
-
},
|
|
267
|
-
]);
|
|
208
|
+
const enableSentry = await confirm({
|
|
209
|
+
message: "Help improve Lobu by sharing anonymous error reports with Sentry?",
|
|
210
|
+
default: true,
|
|
211
|
+
});
|
|
268
212
|
if (enableSentry) {
|
|
269
213
|
envSecrets.push({
|
|
270
214
|
envVar: "SENTRY_DSN",
|
|
@@ -299,7 +243,6 @@ export async function initCommand(cwd = process.cwd(), projectNameArg) {
|
|
|
299
243
|
}
|
|
300
244
|
const encryptionKey = randomBytes(32).toString("hex");
|
|
301
245
|
const answers = {
|
|
302
|
-
...baseAnswers,
|
|
303
246
|
deploymentMode: deploymentMode,
|
|
304
247
|
encryptionKey,
|
|
305
248
|
allowedDomains,
|