@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.
Files changed (49) hide show
  1. package/dist/commands/connections/platforms.d.ts +2 -1
  2. package/dist/commands/connections/platforms.d.ts.map +1 -1
  3. package/dist/commands/connections/platforms.js +47 -77
  4. package/dist/commands/connections/platforms.js.map +1 -1
  5. package/dist/commands/init.d.ts.map +1 -1
  6. package/dist/commands/init.js +102 -159
  7. package/dist/commands/init.js.map +1 -1
  8. package/dist/commands/login.d.ts.map +1 -1
  9. package/dist/commands/login.js +6 -12
  10. package/dist/commands/login.js.map +1 -1
  11. package/dist/commands/providers/add.d.ts.map +1 -1
  12. package/dist/commands/providers/add.js +5 -9
  13. package/dist/commands/providers/add.js.map +1 -1
  14. package/dist/commands/skills/registry.d.ts +2 -3
  15. package/dist/commands/skills/registry.d.ts.map +1 -1
  16. package/dist/commands/skills/registry.js +1 -1
  17. package/dist/commands/skills/registry.js.map +1 -1
  18. package/dist/config/agent-helpers.d.ts +2 -1
  19. package/dist/config/agent-helpers.d.ts.map +1 -1
  20. package/dist/config/loader.d.ts +3 -2
  21. package/dist/config/loader.d.ts.map +1 -1
  22. package/dist/eval/client.d.ts +0 -13
  23. package/dist/eval/client.d.ts.map +1 -1
  24. package/dist/eval/client.js +2 -2
  25. package/dist/eval/client.js.map +1 -1
  26. package/dist/eval/grader.d.ts +2 -1
  27. package/dist/eval/grader.d.ts.map +1 -1
  28. package/dist/eval/reporter.d.ts +0 -2
  29. package/dist/eval/reporter.d.ts.map +1 -1
  30. package/dist/eval/reporter.js +2 -2
  31. package/dist/eval/reporter.js.map +1 -1
  32. package/dist/eval/runner.d.ts +2 -1
  33. package/dist/eval/runner.d.ts.map +1 -1
  34. package/dist/eval/runner.js +1 -2
  35. package/dist/eval/runner.js.map +1 -1
  36. package/dist/eval/types.d.ts +0 -16
  37. package/dist/eval/types.d.ts.map +1 -1
  38. package/dist/internal/context.d.ts +4 -3
  39. package/dist/internal/context.d.ts.map +1 -1
  40. package/dist/internal/credentials.d.ts +2 -1
  41. package/dist/internal/credentials.d.ts.map +1 -1
  42. package/dist/internal/gateway-url.d.ts +2 -1
  43. package/dist/internal/gateway-url.d.ts.map +1 -1
  44. package/dist/internal/index.d.ts +3 -3
  45. package/dist/internal/index.d.ts.map +1 -1
  46. package/dist/internal/index.js +1 -1
  47. package/dist/internal/index.js.map +1 -1
  48. package/dist/providers.json +0 -17
  49. 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
- export interface PlatformPromptResult {
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,MAAM,WAAW,oBAAoB;IACnC,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,CA8J/B"}
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 inquirer from "inquirer";
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 { botToken } = await inquirer.prompt([
19
- {
20
- type: "password",
21
- name: "botToken",
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 slackAnswers = await inquirer.prompt([
43
- {
44
- type: "password",
45
- name: "botToken",
46
- message: "Slack bot token (xoxb-...):",
47
- mask: "*",
48
- },
49
- {
50
- type: "password",
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: slackAnswers.botToken,
50
+ value: slackBotToken,
61
51
  });
62
52
  }
63
- if (slackAnswers.signingSecret) {
53
+ if (slackSigningSecret) {
64
54
  connectionConfig.signingSecret = "$SLACK_SIGNING_SECRET";
65
55
  connectionSecrets.push({
66
56
  envVar: "SLACK_SIGNING_SECRET",
67
- value: slackAnswers.signingSecret,
57
+ value: slackSigningSecret,
68
58
  });
69
59
  }
70
60
  }
71
61
  else if (platform === "discord") {
72
- const { botToken } = await inquirer.prompt([
73
- {
74
- type: "password",
75
- name: "botToken",
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 whatsappAnswers = await inquirer.prompt([
87
- {
88
- type: "password",
89
- name: "accessToken",
90
- message: "WhatsApp Business access token:",
91
- mask: "*",
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: whatsappAnswers.accessToken,
83
+ value: accessToken,
104
84
  });
105
85
  }
106
- if (whatsappAnswers.phoneNumberId) {
86
+ if (phoneNumberId) {
107
87
  connectionConfig.phoneNumberId = "$WHATSAPP_PHONE_NUMBER_ID";
108
88
  connectionSecrets.push({
109
89
  envVar: "WHATSAPP_PHONE_NUMBER_ID",
110
- value: whatsappAnswers.phoneNumberId,
90
+ value: phoneNumberId,
111
91
  });
112
92
  }
113
93
  }
114
94
  else if (platform === "teams") {
115
- const teamsAnswers = await inquirer.prompt([
116
- {
117
- type: "input",
118
- name: "appId",
119
- message: "Teams App ID (from Azure Bot):",
120
- },
121
- {
122
- type: "password",
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: teamsAnswers.appId,
106
+ value: appId,
133
107
  });
134
108
  }
135
- if (teamsAnswers.appPassword) {
109
+ if (appPassword) {
136
110
  connectionConfig.appPassword = "$TEAMS_APP_PASSWORD";
137
111
  connectionSecrets.push({
138
112
  envVar: "TEAMS_APP_PASSWORD",
139
- value: teamsAnswers.appPassword,
113
+ value: appPassword,
140
114
  });
141
115
  }
142
116
  }
143
117
  else if (platform === "gchat") {
144
- const { credentials } = await inquirer.prompt([
145
- {
146
- type: "password",
147
- name: "credentials",
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":"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"}
1
+ {"version":3,"file":"platforms.js","sourceRoot":"","sources":["../../../src/commands/connections/platforms.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAOpD,MAAM,CAAC,MAAM,eAAe,GAA2B;IACrD,QAAQ,EAAE,UAAU;IACpB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,UAAU;IACpB,KAAK,EAAE,iBAAiB;IACxB,KAAK,EAAE,aAAa;CACrB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,QAAgB;IAEhB,MAAM,gBAAgB,GAA2B,EAAE,CAAC;IACpD,MAAM,iBAAiB,GAA6C,EAAE,CAAC;IAEvE,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC;YAC9B,OAAO,EAAE,uCAAuC;YAChD,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QACH,IAAI,QAAQ,EAAE,CAAC;YACb,gBAAgB,CAAC,QAAQ,GAAG,qBAAqB,CAAC;YAClD,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,oBAAoB,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CACT,uFAAuF,CACxF,CAAC;QACF,OAAO,CAAC,GAAG,CACT,mFAAmF,CACpF,CAAC;QACF,OAAO,CAAC,GAAG,CACT,0EAA0E,CAC3E,CAAC;QACF,OAAO,CAAC,GAAG,CACT,4FAA4F,CAC7F,CAAC;QACF,OAAO,CAAC,GAAG,CACT,kFAAkF,CACnF,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CACT,qGAAqG,CACtG,CAAC;QACF,OAAO,CAAC,GAAG,CACT,iEAAiE,CAClE,CAAC;QACF,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC;YACnC,OAAO,EAAE,6BAA6B;YACtC,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QACH,MAAM,kBAAkB,GAAG,MAAM,QAAQ,CAAC;YACxC,OAAO,EAAE,uBAAuB;YAChC,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QACH,IAAI,aAAa,EAAE,CAAC;YAClB,gBAAgB,CAAC,QAAQ,GAAG,kBAAkB,CAAC;YAC/C,iBAAiB,CAAC,IAAI,CAAC;gBACrB,MAAM,EAAE,iBAAiB;gBACzB,KAAK,EAAE,aAAa;aACrB,CAAC,CAAC;QACL,CAAC;QACD,IAAI,kBAAkB,EAAE,CAAC;YACvB,gBAAgB,CAAC,aAAa,GAAG,uBAAuB,CAAC;YACzD,iBAAiB,CAAC,IAAI,CAAC;gBACrB,MAAM,EAAE,sBAAsB;gBAC9B,KAAK,EAAE,kBAAkB;aAC1B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;SAAM,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC;YAC9B,OAAO,EAAE,oBAAoB;YAC7B,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QACH,IAAI,QAAQ,EAAE,CAAC;YACb,gBAAgB,CAAC,QAAQ,GAAG,oBAAoB,CAAC;YACjD,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,mBAAmB,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;SAAM,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QACnC,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC;YACjC,OAAO,EAAE,iCAAiC;YAC1C,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC;YAChC,OAAO,EAAE,2BAA2B;SACrC,CAAC,CAAC;QACH,IAAI,WAAW,EAAE,CAAC;YAChB,gBAAgB,CAAC,WAAW,GAAG,wBAAwB,CAAC;YACxD,iBAAiB,CAAC,IAAI,CAAC;gBACrB,MAAM,EAAE,uBAAuB;gBAC/B,KAAK,EAAE,WAAW;aACnB,CAAC,CAAC;QACL,CAAC;QACD,IAAI,aAAa,EAAE,CAAC;YAClB,gBAAgB,CAAC,aAAa,GAAG,2BAA2B,CAAC;YAC7D,iBAAiB,CAAC,IAAI,CAAC;gBACrB,MAAM,EAAE,0BAA0B;gBAClC,KAAK,EAAE,aAAa;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC;YACxB,OAAO,EAAE,gCAAgC;SAC1C,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC;YACjC,OAAO,EAAE,qCAAqC;YAC9C,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QACH,IAAI,KAAK,EAAE,CAAC;YACV,gBAAgB,CAAC,KAAK,GAAG,eAAe,CAAC;YACzC,iBAAiB,CAAC,IAAI,CAAC;gBACrB,MAAM,EAAE,cAAc;gBACtB,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;QACL,CAAC;QACD,IAAI,WAAW,EAAE,CAAC;YAChB,gBAAgB,CAAC,WAAW,GAAG,qBAAqB,CAAC;YACrD,iBAAiB,CAAC,IAAI,CAAC;gBACrB,MAAM,EAAE,oBAAoB;gBAC5B,KAAK,EAAE,WAAW;aACnB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC;YACjC,OAAO,EAAE,mCAAmC;YAC5C,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QACH,IAAI,WAAW,EAAE,CAAC;YAChB,gBAAgB,CAAC,WAAW,GAAG,0BAA0B,CAAC;YAC1D,iBAAiB,CAAC,IAAI,CAAC;gBACrB,MAAM,EAAE,yBAAyB;gBACjC,KAAK,EAAE,WAAW;aACnB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,CAAC;AACjD,CAAC"}
@@ -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,CAmkBf;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"}
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"}
@@ -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://app.lobu.ai/mcp";
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 baseAnswers = await inquirer.prompt([
25
- {
26
- type: "input",
27
- name: "projectName",
24
+ const projectName = projectNameArg ||
25
+ (await input({
28
26
  message: "Project name?",
29
- default: projectNameArg || "my-lobu",
30
- validate: (input) => {
31
- if (!/^[a-z0-9-]+$/.test(input)) {
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
- when: !projectNameArg, // Skip prompt if project name provided as argument
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 { deploymentMode } = await inquirer.prompt([
54
- {
55
- type: "list",
56
- name: "deploymentMode",
57
- message: "How should workers run?",
58
- choices: [
59
- {
60
- name: "Embedded — virtual bash & filesystem, no package installs, lower resource usage",
61
- value: "embedded",
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 { publicGatewayUrl } = await inquirer.prompt([
89
- {
90
- type: "input",
91
- name: "publicGatewayUrl",
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 { adminPassword } = await inquirer.prompt([
98
- {
99
- type: "password",
100
- name: "adminPassword",
101
- message: "Admin password?",
102
- mask: "*",
103
- validate: (input) => {
104
- if (!input || input.length < 4) {
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 { networkPolicy } = await inquirer.prompt([
113
- {
114
- type: "list",
115
- name: "networkPolicy",
116
- message: "Worker network access?",
117
- choices: [
118
- {
119
- name: "Restricted (recommended) — common registries only (npm, GitHub, PyPI)",
120
- value: "restricted",
121
- },
122
- {
123
- name: "Open — workers can access any domain",
124
- value: "open",
125
- },
126
- {
127
- name: "Isolated — workers have no internet access",
128
- value: "isolated",
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 { providerId } = await inquirer.prompt([
144
- {
145
- type: "list",
146
- name: "providerId",
147
- message: "AI provider?",
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
- const { apiKey } = await inquirer.prompt([
159
- {
160
- type: "password",
161
- name: "apiKey",
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 { platformType } = await inquirer.prompt([
182
- {
183
- type: "list",
184
- name: "platformType",
185
- message: "Connect a messaging platform?",
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 { memoryChoice } = await inquirer.prompt([
195
- {
196
- type: "list",
197
- name: "memoryChoice",
198
- message: "Memory:",
199
- choices: [
200
- { name: "None (filesystem memory)", value: "none" },
201
- { name: "Lobu Cloud (app.lobu.ai)", value: "owletto-cloud" },
202
- {
203
- name: "Lobu memory Local (runs alongside gateway)",
204
- value: "owletto-local",
205
- },
206
- { name: "Custom Lobu memory URL", value: "owletto-custom" },
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
- const { customOwlettoUrl } = await inquirer.prompt([
233
- {
234
- type: "input",
235
- name: "customOwlettoUrl",
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 { otelEndpoint } = await inquirer.prompt([
246
- {
247
- type: "input",
248
- name: "otelEndpoint",
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 { enableSentry } = await inquirer.prompt([
261
- {
262
- type: "confirm",
263
- name: "enableSentry",
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,