@lobu/cli 3.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 (116) hide show
  1. package/README.md +276 -0
  2. package/bin/create-lobu.js +5 -0
  3. package/bin/lobu.js +5 -0
  4. package/dist/api/client.d.ts +11 -0
  5. package/dist/api/client.d.ts.map +1 -0
  6. package/dist/api/client.js +35 -0
  7. package/dist/api/client.js.map +1 -0
  8. package/dist/api/credentials.d.ts +13 -0
  9. package/dist/api/credentials.d.ts.map +1 -0
  10. package/dist/api/credentials.js +39 -0
  11. package/dist/api/credentials.js.map +1 -0
  12. package/dist/commands/dev.d.ts +13 -0
  13. package/dist/commands/dev.d.ts.map +1 -0
  14. package/dist/commands/dev.js +128 -0
  15. package/dist/commands/dev.js.map +1 -0
  16. package/dist/commands/init.d.ts +2 -0
  17. package/dist/commands/init.d.ts.map +1 -0
  18. package/dist/commands/init.js +905 -0
  19. package/dist/commands/init.js.map +1 -0
  20. package/dist/commands/launch.d.ts +6 -0
  21. package/dist/commands/launch.d.ts.map +1 -0
  22. package/dist/commands/launch.js +32 -0
  23. package/dist/commands/launch.js.map +1 -0
  24. package/dist/commands/login.d.ts +4 -0
  25. package/dist/commands/login.d.ts.map +1 -0
  26. package/dist/commands/login.js +29 -0
  27. package/dist/commands/login.js.map +1 -0
  28. package/dist/commands/logout.d.ts +2 -0
  29. package/dist/commands/logout.d.ts.map +1 -0
  30. package/dist/commands/logout.js +7 -0
  31. package/dist/commands/logout.js.map +1 -0
  32. package/dist/commands/providers/add.d.ts +2 -0
  33. package/dist/commands/providers/add.d.ts.map +1 -0
  34. package/dist/commands/providers/add.js +51 -0
  35. package/dist/commands/providers/add.js.map +1 -0
  36. package/dist/commands/providers/list.d.ts +2 -0
  37. package/dist/commands/providers/list.d.ts.map +1 -0
  38. package/dist/commands/providers/list.js +21 -0
  39. package/dist/commands/providers/list.js.map +1 -0
  40. package/dist/commands/secrets.d.ts +8 -0
  41. package/dist/commands/secrets.d.ts.map +1 -0
  42. package/dist/commands/secrets.js +98 -0
  43. package/dist/commands/secrets.js.map +1 -0
  44. package/dist/commands/skills/add.d.ts +2 -0
  45. package/dist/commands/skills/add.d.ts.map +1 -0
  46. package/dist/commands/skills/add.js +47 -0
  47. package/dist/commands/skills/add.js.map +1 -0
  48. package/dist/commands/skills/info.d.ts +2 -0
  49. package/dist/commands/skills/info.d.ts.map +1 -0
  50. package/dist/commands/skills/info.js +45 -0
  51. package/dist/commands/skills/info.js.map +1 -0
  52. package/dist/commands/skills/list.d.ts +2 -0
  53. package/dist/commands/skills/list.d.ts.map +1 -0
  54. package/dist/commands/skills/list.js +30 -0
  55. package/dist/commands/skills/list.js.map +1 -0
  56. package/dist/commands/skills/registry.d.ts +34 -0
  57. package/dist/commands/skills/registry.d.ts.map +1 -0
  58. package/dist/commands/skills/registry.js +38 -0
  59. package/dist/commands/skills/registry.js.map +1 -0
  60. package/dist/commands/skills/search.d.ts +2 -0
  61. package/dist/commands/skills/search.d.ts.map +1 -0
  62. package/dist/commands/skills/search.js +21 -0
  63. package/dist/commands/skills/search.js.map +1 -0
  64. package/dist/commands/status.d.ts +2 -0
  65. package/dist/commands/status.d.ts.map +1 -0
  66. package/dist/commands/status.js +7 -0
  67. package/dist/commands/status.js.map +1 -0
  68. package/dist/commands/validate.d.ts +2 -0
  69. package/dist/commands/validate.d.ts.map +1 -0
  70. package/dist/commands/validate.js +73 -0
  71. package/dist/commands/validate.js.map +1 -0
  72. package/dist/commands/whoami.d.ts +2 -0
  73. package/dist/commands/whoami.d.ts.map +1 -0
  74. package/dist/commands/whoami.js +25 -0
  75. package/dist/commands/whoami.js.map +1 -0
  76. package/dist/config/loader.d.ts +16 -0
  77. package/dist/config/loader.d.ts.map +1 -0
  78. package/dist/config/loader.js +41 -0
  79. package/dist/config/loader.js.map +1 -0
  80. package/dist/config/schema.d.ts +279 -0
  81. package/dist/config/schema.d.ts.map +1 -0
  82. package/dist/config/schema.js +52 -0
  83. package/dist/config/schema.js.map +1 -0
  84. package/dist/config/transformer.d.ts +11 -0
  85. package/dist/config/transformer.d.ts.map +1 -0
  86. package/dist/config/transformer.js +49 -0
  87. package/dist/config/transformer.js.map +1 -0
  88. package/dist/index.d.ts +6 -0
  89. package/dist/index.d.ts.map +1 -0
  90. package/dist/index.js +183 -0
  91. package/dist/index.js.map +1 -0
  92. package/dist/mcp-servers.d.ts +11 -0
  93. package/dist/mcp-servers.d.ts.map +1 -0
  94. package/dist/mcp-servers.js +27 -0
  95. package/dist/mcp-servers.js.map +1 -0
  96. package/dist/mcp-servers.json +216 -0
  97. package/dist/templates/.env.tmpl +29 -0
  98. package/dist/templates/.gitignore.tmpl +32 -0
  99. package/dist/templates/AGENTS.md.tmpl +1 -0
  100. package/dist/templates/Dockerfile.worker.tmpl +29 -0
  101. package/dist/templates/README.md.tmpl +95 -0
  102. package/dist/templates/TESTING.md.tmpl +225 -0
  103. package/dist/templates/lobu.toml.tmpl +44 -0
  104. package/dist/types.d.ts +76 -0
  105. package/dist/types.d.ts.map +1 -0
  106. package/dist/types.js +2 -0
  107. package/dist/types.js.map +1 -0
  108. package/dist/utils/config.d.ts +2 -0
  109. package/dist/utils/config.d.ts.map +1 -0
  110. package/dist/utils/config.js +13 -0
  111. package/dist/utils/config.js.map +1 -0
  112. package/dist/utils/template.d.ts +2 -0
  113. package/dist/utils/template.d.ts.map +1 -0
  114. package/dist/utils/template.js +19 -0
  115. package/dist/utils/template.js.map +1 -0
  116. package/package.json +48 -0
@@ -0,0 +1,38 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ const __dirname = dirname(fileURLToPath(import.meta.url));
5
+ let _cache = null;
6
+ export function loadSkillsRegistry() {
7
+ if (_cache)
8
+ return _cache;
9
+ try {
10
+ // Try loading from the monorepo config directory
11
+ const raw = readFileSync(join(__dirname, "..", "..", "..", "..", "..", "config", "system-skills.json"), "utf-8");
12
+ const data = JSON.parse(raw);
13
+ _cache = data.skills;
14
+ return _cache;
15
+ }
16
+ catch {
17
+ // Fallback: try relative to dist
18
+ try {
19
+ const raw = readFileSync(join(__dirname, "..", "..", "system-skills.json"), "utf-8");
20
+ const data = JSON.parse(raw);
21
+ _cache = data.skills;
22
+ return _cache;
23
+ }
24
+ catch {
25
+ return [];
26
+ }
27
+ }
28
+ }
29
+ export function getSkillById(id) {
30
+ return loadSkillsRegistry().find((s) => s.id === id);
31
+ }
32
+ export function isProviderSkill(skill) {
33
+ return !!(skill.providers && skill.providers.length > 0);
34
+ }
35
+ export function isIntegrationSkill(skill) {
36
+ return !!(skill.integrations && skill.integrations.length > 0);
37
+ }
38
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/commands/skills/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AA6B1D,IAAI,MAAM,GAA2B,IAAI,CAAC;AAE1C,MAAM,UAAU,kBAAkB;IAChC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,IAAI,CAAC;QACH,iDAAiD;QACjD,MAAM,GAAG,GAAG,YAAY,CACtB,IAAI,CACF,SAAS,EACT,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,oBAAoB,CACrB,EACD,OAAO,CACR,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgC,CAAC;QAC5D,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QACrB,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,iCAAiC;QACjC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CACtB,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,oBAAoB,CAAC,EACjD,OAAO,CACR,CAAC;YACF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgC,CAAC;YAC5D,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YACrB,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,EAAU;IACrC,OAAO,kBAAkB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAoB;IAClD,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAoB;IACrD,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function skillsSearchCommand(query: string): Promise<void>;
2
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/commands/skills/search.ts"],"names":[],"mappings":"AAGA,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBtE"}
@@ -0,0 +1,21 @@
1
+ import chalk from "chalk";
2
+ import { isProviderSkill, loadSkillsRegistry } from "./registry.js";
3
+ export async function skillsSearchCommand(query) {
4
+ const skills = loadSkillsRegistry();
5
+ const q = query.toLowerCase();
6
+ const matches = skills.filter((s) => s.id.toLowerCase().includes(q) ||
7
+ s.name.toLowerCase().includes(q) ||
8
+ s.description.toLowerCase().includes(q));
9
+ if (matches.length === 0) {
10
+ console.log(chalk.yellow(`\n No skills matching "${query}".\n`));
11
+ return;
12
+ }
13
+ console.log(chalk.bold(`\n Skills matching "${query}":\n`));
14
+ const maxIdLen = Math.max(...matches.map((s) => s.id.length));
15
+ for (const skill of matches) {
16
+ const type = isProviderSkill(skill) ? chalk.dim("[provider]") : chalk.dim("[integration]");
17
+ console.log(` ${chalk.cyan(skill.id.padEnd(maxIdLen))} ${chalk.dim(skill.description)} ${type}`);
18
+ }
19
+ console.log();
20
+ }
21
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/commands/skills/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAAa;IACrD,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;IACpC,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAE9B,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAC3B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9B,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAC1C,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,2BAA2B,KAAK,MAAM,CAAC,CAAC,CAAC;QAClE,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,KAAK,MAAM,CAAC,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC3F,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE,CACvF,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function statusCommand(): Promise<void>;
2
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAEA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAUnD"}
@@ -0,0 +1,7 @@
1
+ import chalk from "chalk";
2
+ export async function statusCommand() {
3
+ console.log(chalk.bold.cyan("\n Lobu Cloud is in early access.\n"));
4
+ console.log(chalk.dim(" Agent status will be available when you deploy to Lobu Cloud."));
5
+ console.log(chalk.dim(" For local dev, use `docker compose ps` in your project.\n"));
6
+ }
7
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,iEAAiE,CAClE,CACF,CAAC;IACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,6DAA6D,CAAC,CACzE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function validateCommand(cwd: string): Promise<boolean>;
2
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AA2BA,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA8EnE"}
@@ -0,0 +1,73 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import chalk from "chalk";
5
+ import { isLoadError, loadConfig } from "../config/loader.js";
6
+ const __dirname = dirname(fileURLToPath(import.meta.url));
7
+ function loadSystemSkills() {
8
+ try {
9
+ const raw = readFileSync(join(__dirname, "..", "..", "..", "..", "config", "system-skills.json"), "utf-8");
10
+ const data = JSON.parse(raw);
11
+ return data.skills;
12
+ }
13
+ catch {
14
+ return [];
15
+ }
16
+ }
17
+ export async function validateCommand(cwd) {
18
+ const result = await loadConfig(cwd);
19
+ if (isLoadError(result)) {
20
+ console.error(chalk.red(`\n ${result.error}`));
21
+ if (result.details) {
22
+ for (const detail of result.details) {
23
+ console.error(chalk.dim(` ${detail}`));
24
+ }
25
+ }
26
+ console.log();
27
+ return false;
28
+ }
29
+ const { config } = result;
30
+ const warnings = [];
31
+ const errors = [];
32
+ // Validate skill IDs against system-skills.json
33
+ const systemSkills = loadSystemSkills();
34
+ const skillIds = new Set(systemSkills.map((s) => s.id));
35
+ for (const skillId of config.skills.enabled) {
36
+ if (!skillIds.has(skillId)) {
37
+ errors.push(`Unknown skill "${skillId}". Run \`lobu skills list\` to see available skills.`);
38
+ }
39
+ }
40
+ // Validate provider IDs
41
+ const providerSkills = systemSkills.filter((s) => s.providers && s.providers.length > 0);
42
+ const providerIds = new Set(providerSkills.map((s) => s.id));
43
+ for (const provider of config.providers) {
44
+ if (!providerIds.has(provider.id)) {
45
+ warnings.push(`Provider "${provider.id}" not found in registry. It may require manual configuration.`);
46
+ }
47
+ if (!provider.model) {
48
+ warnings.push(`Provider "${provider.id}" has no model specified.`);
49
+ }
50
+ }
51
+ // Check for empty providers
52
+ if (config.providers.length === 0) {
53
+ warnings.push("No providers configured. Agent will need provider keys at runtime.");
54
+ }
55
+ // Print results
56
+ console.log();
57
+ if (errors.length === 0) {
58
+ console.log(chalk.green(` lobu.toml is valid`));
59
+ console.log(chalk.dim(` Agent: ${config.agent.name} (${config.providers.length} providers, ${config.skills.enabled.length} skills)`));
60
+ }
61
+ else {
62
+ console.log(chalk.red(` Validation failed`));
63
+ }
64
+ for (const err of errors) {
65
+ console.log(chalk.red(` ${err}`));
66
+ }
67
+ for (const warn of warnings) {
68
+ console.log(chalk.yellow(` ${warn}`));
69
+ }
70
+ console.log();
71
+ return errors.length === 0;
72
+ }
73
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function whoamiCommand(): Promise<void>;
2
+ //# sourceMappingURL=whoami.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAuBnD"}
@@ -0,0 +1,25 @@
1
+ import chalk from "chalk";
2
+ import { loadCredentials } from "../api/credentials.js";
3
+ export async function whoamiCommand() {
4
+ const creds = await loadCredentials();
5
+ if (!creds) {
6
+ const envToken = process.env.LOBU_API_TOKEN;
7
+ if (envToken) {
8
+ console.log(chalk.dim("\n Authenticated via LOBU_API_TOKEN environment variable."));
9
+ console.log(chalk.dim(" Lobu Cloud is in early access.\n"));
10
+ return;
11
+ }
12
+ console.log(chalk.dim("\n Not logged in."));
13
+ console.log(chalk.dim(" Run `lobu login` to authenticate.\n"));
14
+ return;
15
+ }
16
+ console.log(chalk.bold("\n Lobu CLI"));
17
+ if (creds.email) {
18
+ console.log(chalk.dim(` User: ${creds.email}`));
19
+ }
20
+ if (creds.agentId) {
21
+ console.log(chalk.dim(` Linked agent: ${creds.agentId}`));
22
+ }
23
+ console.log();
24
+ }
25
+ //# sourceMappingURL=whoami.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;IAEtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QAC5C,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC,CAAC;YACrF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IACxC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type LobuTomlConfig } from "./schema.js";
2
+ export declare const CONFIG_FILENAME = "lobu.toml";
3
+ export interface LoadResult {
4
+ config: LobuTomlConfig;
5
+ path: string;
6
+ }
7
+ export interface LoadError {
8
+ error: string;
9
+ details?: string[];
10
+ }
11
+ /**
12
+ * Load and validate lobu.toml from a directory.
13
+ */
14
+ export declare function loadConfig(cwd: string): Promise<LoadResult | LoadError>;
15
+ export declare function isLoadError(result: LoadResult | LoadError): result is LoadError;
16
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAEpE,eAAO,MAAM,eAAe,cAAc,CAAC;AAE3C,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAgCjC;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,IAAI,SAAS,CAE/E"}
@@ -0,0 +1,41 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { parse as parseToml } from "smol-toml";
4
+ import { lobuConfigSchema } from "./schema.js";
5
+ export const CONFIG_FILENAME = "lobu.toml";
6
+ /**
7
+ * Load and validate lobu.toml from a directory.
8
+ */
9
+ export async function loadConfig(cwd) {
10
+ const configPath = join(cwd, CONFIG_FILENAME);
11
+ let raw;
12
+ try {
13
+ raw = await readFile(configPath, "utf-8");
14
+ }
15
+ catch {
16
+ return {
17
+ error: `No ${CONFIG_FILENAME} found in ${cwd}`,
18
+ details: ["Run `lobu init` to create one."],
19
+ };
20
+ }
21
+ let parsed;
22
+ try {
23
+ parsed = parseToml(raw);
24
+ }
25
+ catch (err) {
26
+ return {
27
+ error: `Invalid TOML syntax in ${CONFIG_FILENAME}`,
28
+ details: [err instanceof Error ? err.message : String(err)],
29
+ };
30
+ }
31
+ const result = lobuConfigSchema.safeParse(parsed);
32
+ if (!result.success) {
33
+ const details = result.error.issues.map((issue) => `${issue.path.join(".")}: ${issue.message}`);
34
+ return { error: `Invalid ${CONFIG_FILENAME}`, details };
35
+ }
36
+ return { config: result.data, path: configPath };
37
+ }
38
+ export function isLoadError(result) {
39
+ return "error" in result;
40
+ }
41
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAuB,MAAM,aAAa,CAAC;AAEpE,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC;AAY3C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAW;IAEX,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAE9C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,KAAK,EAAE,MAAM,eAAe,aAAa,GAAG,EAAE;YAC9C,OAAO,EAAE,CAAC,gCAAgC,CAAC;SAC5C,CAAC;IACJ,CAAC;IAED,IAAI,MAA+B,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,GAAG,SAAS,CAAC,GAAG,CAA4B,CAAC;IACrD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,KAAK,EAAE,0BAA0B,eAAe,EAAE;YAClD,OAAO,EAAE,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;SAC5D,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAClD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CACrC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CACvD,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,WAAW,eAAe,EAAE,EAAE,OAAO,EAAE,CAAC;IAC1D,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAA8B;IACxD,OAAO,OAAO,IAAI,MAAM,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,279 @@
1
+ import { z } from "zod";
2
+ declare const providerSchema: z.ZodObject<{
3
+ id: z.ZodString;
4
+ model: z.ZodOptional<z.ZodString>;
5
+ }, "strip", z.ZodTypeAny, {
6
+ id: string;
7
+ model?: string | undefined;
8
+ }, {
9
+ id: string;
10
+ model?: string | undefined;
11
+ }>;
12
+ declare const mcpServerSchema: z.ZodObject<{
13
+ url: z.ZodOptional<z.ZodString>;
14
+ command: z.ZodOptional<z.ZodString>;
15
+ args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
16
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
17
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
18
+ }, "strip", z.ZodTypeAny, {
19
+ command?: string | undefined;
20
+ url?: string | undefined;
21
+ args?: string[] | undefined;
22
+ env?: Record<string, string> | undefined;
23
+ headers?: Record<string, string> | undefined;
24
+ }, {
25
+ command?: string | undefined;
26
+ url?: string | undefined;
27
+ args?: string[] | undefined;
28
+ env?: Record<string, string> | undefined;
29
+ headers?: Record<string, string> | undefined;
30
+ }>;
31
+ declare const skillsSchema: z.ZodObject<{
32
+ enabled: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
33
+ mcp: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
34
+ url: z.ZodOptional<z.ZodString>;
35
+ command: z.ZodOptional<z.ZodString>;
36
+ args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
37
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
38
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
39
+ }, "strip", z.ZodTypeAny, {
40
+ command?: string | undefined;
41
+ url?: string | undefined;
42
+ args?: string[] | undefined;
43
+ env?: Record<string, string> | undefined;
44
+ headers?: Record<string, string> | undefined;
45
+ }, {
46
+ command?: string | undefined;
47
+ url?: string | undefined;
48
+ args?: string[] | undefined;
49
+ env?: Record<string, string> | undefined;
50
+ headers?: Record<string, string> | undefined;
51
+ }>>>;
52
+ }, "strip", z.ZodTypeAny, {
53
+ enabled: string[];
54
+ mcp?: Record<string, {
55
+ command?: string | undefined;
56
+ url?: string | undefined;
57
+ args?: string[] | undefined;
58
+ env?: Record<string, string> | undefined;
59
+ headers?: Record<string, string> | undefined;
60
+ }> | undefined;
61
+ }, {
62
+ enabled?: string[] | undefined;
63
+ mcp?: Record<string, {
64
+ command?: string | undefined;
65
+ url?: string | undefined;
66
+ args?: string[] | undefined;
67
+ env?: Record<string, string> | undefined;
68
+ headers?: Record<string, string> | undefined;
69
+ }> | undefined;
70
+ }>;
71
+ declare const networkSchema: z.ZodObject<{
72
+ allowed: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
73
+ denied: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
74
+ }, "strip", z.ZodTypeAny, {
75
+ allowed?: string[] | undefined;
76
+ denied?: string[] | undefined;
77
+ }, {
78
+ allowed?: string[] | undefined;
79
+ denied?: string[] | undefined;
80
+ }>;
81
+ declare const workerSchema: z.ZodObject<{
82
+ nix_packages: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
83
+ timeout_minutes: z.ZodOptional<z.ZodNumber>;
84
+ }, "strip", z.ZodTypeAny, {
85
+ nix_packages?: string[] | undefined;
86
+ timeout_minutes?: number | undefined;
87
+ }, {
88
+ nix_packages?: string[] | undefined;
89
+ timeout_minutes?: number | undefined;
90
+ }>;
91
+ declare const platformsSchema: z.ZodObject<{
92
+ telegram: z.ZodOptional<z.ZodBoolean>;
93
+ slack: z.ZodOptional<z.ZodBoolean>;
94
+ whatsapp: z.ZodOptional<z.ZodBoolean>;
95
+ api: z.ZodOptional<z.ZodBoolean>;
96
+ }, "strip", z.ZodTypeAny, {
97
+ telegram?: boolean | undefined;
98
+ slack?: boolean | undefined;
99
+ api?: boolean | undefined;
100
+ whatsapp?: boolean | undefined;
101
+ }, {
102
+ telegram?: boolean | undefined;
103
+ slack?: boolean | undefined;
104
+ api?: boolean | undefined;
105
+ whatsapp?: boolean | undefined;
106
+ }>;
107
+ export declare const lobuConfigSchema: z.ZodObject<{
108
+ agent: z.ZodObject<{
109
+ name: z.ZodString;
110
+ description: z.ZodOptional<z.ZodString>;
111
+ }, "strip", z.ZodTypeAny, {
112
+ name: string;
113
+ description?: string | undefined;
114
+ }, {
115
+ name: string;
116
+ description?: string | undefined;
117
+ }>;
118
+ providers: z.ZodDefault<z.ZodArray<z.ZodObject<{
119
+ id: z.ZodString;
120
+ model: z.ZodOptional<z.ZodString>;
121
+ }, "strip", z.ZodTypeAny, {
122
+ id: string;
123
+ model?: string | undefined;
124
+ }, {
125
+ id: string;
126
+ model?: string | undefined;
127
+ }>, "many">>;
128
+ skills: z.ZodDefault<z.ZodObject<{
129
+ enabled: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
130
+ mcp: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
131
+ url: z.ZodOptional<z.ZodString>;
132
+ command: z.ZodOptional<z.ZodString>;
133
+ args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
134
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
135
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
136
+ }, "strip", z.ZodTypeAny, {
137
+ command?: string | undefined;
138
+ url?: string | undefined;
139
+ args?: string[] | undefined;
140
+ env?: Record<string, string> | undefined;
141
+ headers?: Record<string, string> | undefined;
142
+ }, {
143
+ command?: string | undefined;
144
+ url?: string | undefined;
145
+ args?: string[] | undefined;
146
+ env?: Record<string, string> | undefined;
147
+ headers?: Record<string, string> | undefined;
148
+ }>>>;
149
+ }, "strip", z.ZodTypeAny, {
150
+ enabled: string[];
151
+ mcp?: Record<string, {
152
+ command?: string | undefined;
153
+ url?: string | undefined;
154
+ args?: string[] | undefined;
155
+ env?: Record<string, string> | undefined;
156
+ headers?: Record<string, string> | undefined;
157
+ }> | undefined;
158
+ }, {
159
+ enabled?: string[] | undefined;
160
+ mcp?: Record<string, {
161
+ command?: string | undefined;
162
+ url?: string | undefined;
163
+ args?: string[] | undefined;
164
+ env?: Record<string, string> | undefined;
165
+ headers?: Record<string, string> | undefined;
166
+ }> | undefined;
167
+ }>>;
168
+ network: z.ZodOptional<z.ZodObject<{
169
+ allowed: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
170
+ denied: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
171
+ }, "strip", z.ZodTypeAny, {
172
+ allowed?: string[] | undefined;
173
+ denied?: string[] | undefined;
174
+ }, {
175
+ allowed?: string[] | undefined;
176
+ denied?: string[] | undefined;
177
+ }>>;
178
+ worker: z.ZodOptional<z.ZodObject<{
179
+ nix_packages: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
180
+ timeout_minutes: z.ZodOptional<z.ZodNumber>;
181
+ }, "strip", z.ZodTypeAny, {
182
+ nix_packages?: string[] | undefined;
183
+ timeout_minutes?: number | undefined;
184
+ }, {
185
+ nix_packages?: string[] | undefined;
186
+ timeout_minutes?: number | undefined;
187
+ }>>;
188
+ platforms: z.ZodOptional<z.ZodObject<{
189
+ telegram: z.ZodOptional<z.ZodBoolean>;
190
+ slack: z.ZodOptional<z.ZodBoolean>;
191
+ whatsapp: z.ZodOptional<z.ZodBoolean>;
192
+ api: z.ZodOptional<z.ZodBoolean>;
193
+ }, "strip", z.ZodTypeAny, {
194
+ telegram?: boolean | undefined;
195
+ slack?: boolean | undefined;
196
+ api?: boolean | undefined;
197
+ whatsapp?: boolean | undefined;
198
+ }, {
199
+ telegram?: boolean | undefined;
200
+ slack?: boolean | undefined;
201
+ api?: boolean | undefined;
202
+ whatsapp?: boolean | undefined;
203
+ }>>;
204
+ }, "strip", z.ZodTypeAny, {
205
+ skills: {
206
+ enabled: string[];
207
+ mcp?: Record<string, {
208
+ command?: string | undefined;
209
+ url?: string | undefined;
210
+ args?: string[] | undefined;
211
+ env?: Record<string, string> | undefined;
212
+ headers?: Record<string, string> | undefined;
213
+ }> | undefined;
214
+ };
215
+ agent: {
216
+ name: string;
217
+ description?: string | undefined;
218
+ };
219
+ providers: {
220
+ id: string;
221
+ model?: string | undefined;
222
+ }[];
223
+ platforms?: {
224
+ telegram?: boolean | undefined;
225
+ slack?: boolean | undefined;
226
+ api?: boolean | undefined;
227
+ whatsapp?: boolean | undefined;
228
+ } | undefined;
229
+ network?: {
230
+ allowed?: string[] | undefined;
231
+ denied?: string[] | undefined;
232
+ } | undefined;
233
+ worker?: {
234
+ nix_packages?: string[] | undefined;
235
+ timeout_minutes?: number | undefined;
236
+ } | undefined;
237
+ }, {
238
+ agent: {
239
+ name: string;
240
+ description?: string | undefined;
241
+ };
242
+ skills?: {
243
+ enabled?: string[] | undefined;
244
+ mcp?: Record<string, {
245
+ command?: string | undefined;
246
+ url?: string | undefined;
247
+ args?: string[] | undefined;
248
+ env?: Record<string, string> | undefined;
249
+ headers?: Record<string, string> | undefined;
250
+ }> | undefined;
251
+ } | undefined;
252
+ platforms?: {
253
+ telegram?: boolean | undefined;
254
+ slack?: boolean | undefined;
255
+ api?: boolean | undefined;
256
+ whatsapp?: boolean | undefined;
257
+ } | undefined;
258
+ providers?: {
259
+ id: string;
260
+ model?: string | undefined;
261
+ }[] | undefined;
262
+ network?: {
263
+ allowed?: string[] | undefined;
264
+ denied?: string[] | undefined;
265
+ } | undefined;
266
+ worker?: {
267
+ nix_packages?: string[] | undefined;
268
+ timeout_minutes?: number | undefined;
269
+ } | undefined;
270
+ }>;
271
+ export type LobuTomlConfig = z.infer<typeof lobuConfigSchema>;
272
+ export type ProviderEntry = z.infer<typeof providerSchema>;
273
+ export type McpServerEntry = z.infer<typeof mcpServerSchema>;
274
+ export type SkillsEntry = z.infer<typeof skillsSchema>;
275
+ export type NetworkEntry = z.infer<typeof networkSchema>;
276
+ export type WorkerEntry = z.infer<typeof workerSchema>;
277
+ export type PlatformsEntry = z.infer<typeof platformsSchema>;
278
+ export {};
279
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAcxB,QAAA,MAAM,cAAc;;;;;;;;;EAGlB,CAAC;AAGH,QAAA,MAAM,eAAe;;;;;;;;;;;;;;;;;;EAMnB,CAAC;AAEH,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGhB,CAAC;AAGH,QAAA,MAAM,aAAa;;;;;;;;;EAGjB,CAAC;AAGH,QAAA,MAAM,YAAY;;;;;;;;;EAGhB,CAAC;AAGH,QAAA,MAAM,eAAe;;;;;;;;;;;;;;;EAKnB,CAAC;AAGH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAO3B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE9D,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAC3D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAC7D,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AACvD,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AACzD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AACvD,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { z } from "zod";
2
+ // Agent section — identity lives in IDENTITY.md, SOUL.md, USER.md files
3
+ const agentSchema = z.object({
4
+ name: z
5
+ .string()
6
+ .regex(/^[a-z0-9][a-z0-9-]*$/, "Agent name must be lowercase alphanumeric with hyphens, starting with alphanumeric"),
7
+ description: z.string().optional(),
8
+ });
9
+ // Provider entry
10
+ const providerSchema = z.object({
11
+ id: z.string(),
12
+ model: z.string().optional(),
13
+ });
14
+ // Skills section
15
+ const mcpServerSchema = z.object({
16
+ url: z.string().optional(),
17
+ command: z.string().optional(),
18
+ args: z.array(z.string()).optional(),
19
+ env: z.record(z.string()).optional(),
20
+ headers: z.record(z.string()).optional(),
21
+ });
22
+ const skillsSchema = z.object({
23
+ enabled: z.array(z.string()).default([]),
24
+ mcp: z.record(mcpServerSchema).optional(),
25
+ });
26
+ // Network section
27
+ const networkSchema = z.object({
28
+ allowed: z.array(z.string()).optional(),
29
+ denied: z.array(z.string()).optional(),
30
+ });
31
+ // Worker section
32
+ const workerSchema = z.object({
33
+ nix_packages: z.array(z.string()).optional(),
34
+ timeout_minutes: z.number().positive().optional(),
35
+ });
36
+ // Platforms section
37
+ const platformsSchema = z.object({
38
+ telegram: z.boolean().optional(),
39
+ slack: z.boolean().optional(),
40
+ whatsapp: z.boolean().optional(),
41
+ api: z.boolean().optional(),
42
+ });
43
+ // Full lobu.toml schema
44
+ export const lobuConfigSchema = z.object({
45
+ agent: agentSchema,
46
+ providers: z.array(providerSchema).default([]),
47
+ skills: skillsSchema.default({ enabled: [] }),
48
+ network: networkSchema.optional(),
49
+ worker: workerSchema.optional(),
50
+ platforms: platformsSchema.optional(),
51
+ });
52
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { LobuTomlConfig, McpServerEntry } from "./schema.js";
2
+ export interface TransformResult {
3
+ envVars: Record<string, string>;
4
+ mcpConfig: Record<string, McpServerEntry> | null;
5
+ }
6
+ /**
7
+ * Transform lobu.toml config into docker-compose environment variables
8
+ * and MCP config JSON for local dev mode.
9
+ */
10
+ export declare function transformConfig(config: LobuTomlConfig): TransformResult;
11
+ //# sourceMappingURL=transformer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformer.d.ts","sourceRoot":"","sources":["../../src/config/transformer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElE,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,IAAI,CAAC;CAClD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,eAAe,CAsDvE"}