leedab 0.7.1 → 0.7.2

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 (140) hide show
  1. package/README.md +4 -7
  2. package/apps/console/.next/standalone/.next/BUILD_ID +1 -1
  3. package/apps/console/.next/standalone/.next/app-build-manifest.json +151 -151
  4. package/apps/console/.next/standalone/.next/app-path-routes-manifest.json +51 -51
  5. package/apps/console/.next/standalone/.next/build-manifest.json +2 -2
  6. package/apps/console/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  7. package/apps/console/.next/standalone/.next/server/app/_not-found.html +1 -1
  8. package/apps/console/.next/standalone/.next/server/app/_not-found.rsc +1 -1
  9. package/apps/console/.next/standalone/.next/server/app/api/agent/route_client-reference-manifest.js +1 -1
  10. package/apps/console/.next/standalone/.next/server/app/api/approvals/route_client-reference-manifest.js +1 -1
  11. package/apps/console/.next/standalone/.next/server/app/api/approvals/stream/route_client-reference-manifest.js +1 -1
  12. package/apps/console/.next/standalone/.next/server/app/api/automation/workflow-blueprint/route_client-reference-manifest.js +1 -1
  13. package/apps/console/.next/standalone/.next/server/app/api/backend/endpoint-spec/route_client-reference-manifest.js +1 -1
  14. package/apps/console/.next/standalone/.next/server/app/api/bootstrap-admin-token/route_client-reference-manifest.js +1 -1
  15. package/apps/console/.next/standalone/.next/server/app/api/brand/brand-audit/route_client-reference-manifest.js +1 -1
  16. package/apps/console/.next/standalone/.next/server/app/api/campaigns/campaign-brief/route_client-reference-manifest.js +1 -1
  17. package/apps/console/.next/standalone/.next/server/app/api/champion/confidence/route_client-reference-manifest.js +1 -1
  18. package/apps/console/.next/standalone/.next/server/app/api/champion/customer/route_client-reference-manifest.js +1 -1
  19. package/apps/console/.next/standalone/.next/server/app/api/champion/dispatches/route_client-reference-manifest.js +1 -1
  20. package/apps/console/.next/standalone/.next/server/app/api/champion/engagement/route_client-reference-manifest.js +1 -1
  21. package/apps/console/.next/standalone/.next/server/app/api/champion/escalate/route_client-reference-manifest.js +1 -1
  22. package/apps/console/.next/standalone/.next/server/app/api/champion/profile/route_client-reference-manifest.js +1 -1
  23. package/apps/console/.next/standalone/.next/server/app/api/champion/screenshare/route_client-reference-manifest.js +1 -1
  24. package/apps/console/.next/standalone/.next/server/app/api/champion/track-question/route_client-reference-manifest.js +1 -1
  25. package/apps/console/.next/standalone/.next/server/app/api/champion/use-case-wiki/route_client-reference-manifest.js +1 -1
  26. package/apps/console/.next/standalone/.next/server/app/api/chat/route_client-reference-manifest.js +1 -1
  27. package/apps/console/.next/standalone/.next/server/app/api/compliance/risk-register-seed/route_client-reference-manifest.js +1 -1
  28. package/apps/console/.next/standalone/.next/server/app/api/computer-use/[id]/route_client-reference-manifest.js +1 -1
  29. package/apps/console/.next/standalone/.next/server/app/api/computer-use/route_client-reference-manifest.js +1 -1
  30. package/apps/console/.next/standalone/.next/server/app/api/concierge/morning-brief/route_client-reference-manifest.js +1 -1
  31. package/apps/console/.next/standalone/.next/server/app/api/contacts/route_client-reference-manifest.js +1 -1
  32. package/apps/console/.next/standalone/.next/server/app/api/content/seo-brief/route_client-reference-manifest.js +1 -1
  33. package/apps/console/.next/standalone/.next/server/app/api/conversations/route_client-reference-manifest.js +1 -1
  34. package/apps/console/.next/standalone/.next/server/app/api/coo/route_client-reference-manifest.js +1 -1
  35. package/apps/console/.next/standalone/.next/server/app/api/cx/escalation-triage/route_client-reference-manifest.js +1 -1
  36. package/apps/console/.next/standalone/.next/server/app/api/cx/health-score/route_client-reference-manifest.js +1 -1
  37. package/apps/console/.next/standalone/.next/server/app/api/data/cohort-brief/route_client-reference-manifest.js +1 -1
  38. package/apps/console/.next/standalone/.next/server/app/api/delivery/qbr-brief/route_client-reference-manifest.js +1 -1
  39. package/apps/console/.next/standalone/.next/server/app/api/delivery/weekly-brief/route_client-reference-manifest.js +1 -1
  40. package/apps/console/.next/standalone/.next/server/app/api/dev/invalidate-cache/route_client-reference-manifest.js +1 -1
  41. package/apps/console/.next/standalone/.next/server/app/api/devops/runbook/route_client-reference-manifest.js +1 -1
  42. package/apps/console/.next/standalone/.next/server/app/api/email/sequence-brief/route_client-reference-manifest.js +1 -1
  43. package/apps/console/.next/standalone/.next/server/app/api/engineering/adr-draft/route_client-reference-manifest.js +1 -1
  44. package/apps/console/.next/standalone/.next/server/app/api/finance/runway-snapshot/route_client-reference-manifest.js +1 -1
  45. package/apps/console/.next/standalone/.next/server/app/api/frontend/component-spec/route_client-reference-manifest.js +1 -1
  46. package/apps/console/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  47. package/apps/console/.next/standalone/.next/server/app/api/implementation/brief/route_client-reference-manifest.js +1 -1
  48. package/apps/console/.next/standalone/.next/server/app/api/implementation/scaffold-migration-script/route_client-reference-manifest.js +1 -1
  49. package/apps/console/.next/standalone/.next/server/app/api/implementation/scaffold-n8n-workflow/route_client-reference-manifest.js +1 -1
  50. package/apps/console/.next/standalone/.next/server/app/api/implementation/scaffold-skill-override/route_client-reference-manifest.js +1 -1
  51. package/apps/console/.next/standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
  52. package/apps/console/.next/standalone/.next/server/app/api/inbox/stream/route_client-reference-manifest.js +1 -1
  53. package/apps/console/.next/standalone/.next/server/app/api/investor/kpi-tracker/route_client-reference-manifest.js +1 -1
  54. package/apps/console/.next/standalone/.next/server/app/api/leedab/channels/status/route_client-reference-manifest.js +1 -1
  55. package/apps/console/.next/standalone/.next/server/app/api/leedab/channels/telegram/connect/route_client-reference-manifest.js +1 -1
  56. package/apps/console/.next/standalone/.next/server/app/api/leedab/channels/whatsapp/connect/route_client-reference-manifest.js +1 -1
  57. package/apps/console/.next/standalone/.next/server/app/api/leedab/gtm/leads/[id]/route_client-reference-manifest.js +1 -1
  58. package/apps/console/.next/standalone/.next/server/app/api/leedab/gtm/leads/[id]/status/route_client-reference-manifest.js +1 -1
  59. package/apps/console/.next/standalone/.next/server/app/api/leedab/gtm/templates/[name]/route_client-reference-manifest.js +1 -1
  60. package/apps/console/.next/standalone/.next/server/app/api/leedab/license/route.js +1 -1
  61. package/apps/console/.next/standalone/.next/server/app/api/leedab/license/route_client-reference-manifest.js +1 -1
  62. package/apps/console/.next/standalone/.next/server/app/api/leedab/models/route_client-reference-manifest.js +1 -1
  63. package/apps/console/.next/standalone/.next/server/app/api/leedab/providers/route_client-reference-manifest.js +1 -1
  64. package/apps/console/.next/standalone/.next/server/app/api/leedab/sessions/[id]/route_client-reference-manifest.js +1 -1
  65. package/apps/console/.next/standalone/.next/server/app/api/leedab/sessions/route_client-reference-manifest.js +1 -1
  66. package/apps/console/.next/standalone/.next/server/app/api/leedab/team/[id]/route_client-reference-manifest.js +1 -1
  67. package/apps/console/.next/standalone/.next/server/app/api/leedab/team/route_client-reference-manifest.js +1 -1
  68. package/apps/console/.next/standalone/.next/server/app/api/leedab/vault/route_client-reference-manifest.js +1 -1
  69. package/apps/console/.next/standalone/.next/server/app/api/leedab/workflows/route_client-reference-manifest.js +1 -1
  70. package/apps/console/.next/standalone/.next/server/app/api/legal/clause-template/route_client-reference-manifest.js +1 -1
  71. package/apps/console/.next/standalone/.next/server/app/api/manifest/agents/custom/draft/route_client-reference-manifest.js +1 -1
  72. package/apps/console/.next/standalone/.next/server/app/api/manifest/agents/custom/route.js +1 -1
  73. package/apps/console/.next/standalone/.next/server/app/api/manifest/agents/custom/route_client-reference-manifest.js +1 -1
  74. package/apps/console/.next/standalone/.next/server/app/api/manifest/agents/route.js +1 -1
  75. package/apps/console/.next/standalone/.next/server/app/api/manifest/agents/route_client-reference-manifest.js +1 -1
  76. package/apps/console/.next/standalone/.next/server/app/api/marketing/cadence-planner/route_client-reference-manifest.js +1 -1
  77. package/apps/console/.next/standalone/.next/server/app/api/marketing/competitive-snapshot/route_client-reference-manifest.js +1 -1
  78. package/apps/console/.next/standalone/.next/server/app/api/marketplace/catalogue/route_client-reference-manifest.js +1 -1
  79. package/apps/console/.next/standalone/.next/server/app/api/onboarding/engagement-plan/route_client-reference-manifest.js +1 -1
  80. package/apps/console/.next/standalone/.next/server/app/api/onboarding/kickoff-brief/route_client-reference-manifest.js +1 -1
  81. package/apps/console/.next/standalone/.next/server/app/api/openclaw/status/route_client-reference-manifest.js +1 -1
  82. package/apps/console/.next/standalone/.next/server/app/api/ops/dispatch-brief/route_client-reference-manifest.js +1 -1
  83. package/apps/console/.next/standalone/.next/server/app/api/pack/route_client-reference-manifest.js +1 -1
  84. package/apps/console/.next/standalone/.next/server/app/api/people/job-brief/route_client-reference-manifest.js +1 -1
  85. package/apps/console/.next/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  86. package/apps/console/.next/standalone/.next/server/app/api/procurement/po-brief/route_client-reference-manifest.js +1 -1
  87. package/apps/console/.next/standalone/.next/server/app/api/product/prd-draft/route_client-reference-manifest.js +1 -1
  88. package/apps/console/.next/standalone/.next/server/app/api/research/prospect-intel/route_client-reference-manifest.js +1 -1
  89. package/apps/console/.next/standalone/.next/server/app/api/research/search/route_client-reference-manifest.js +1 -1
  90. package/apps/console/.next/standalone/.next/server/app/api/routing/route_client-reference-manifest.js +1 -1
  91. package/apps/console/.next/standalone/.next/server/app/api/runs/route_client-reference-manifest.js +1 -1
  92. package/apps/console/.next/standalone/.next/server/app/api/sales/pipeline-summary/route_client-reference-manifest.js +1 -1
  93. package/apps/console/.next/standalone/.next/server/app/api/sales/prospect-brief/route_client-reference-manifest.js +1 -1
  94. package/apps/console/.next/standalone/.next/server/app/api/solutions/build/route_client-reference-manifest.js +1 -1
  95. package/apps/console/.next/standalone/.next/server/app/api/solutions/quickstart-regenerate/route_client-reference-manifest.js +1 -1
  96. package/apps/console/.next/standalone/.next/server/app/api/solutions/refine/route_client-reference-manifest.js +1 -1
  97. package/apps/console/.next/standalone/.next/server/app/api/strategy/market-pulse/route_client-reference-manifest.js +1 -1
  98. package/apps/console/.next/standalone/.next/server/app/api/telegram/[customerId]/route_client-reference-manifest.js +1 -1
  99. package/apps/console/.next/standalone/.next/server/app/api/templates/regenerate/route_client-reference-manifest.js +1 -1
  100. package/apps/console/.next/standalone/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  101. package/apps/console/.next/standalone/.next/server/app/api/uploads/[id]/route_client-reference-manifest.js +1 -1
  102. package/apps/console/.next/standalone/.next/server/app/api/uploads/route_client-reference-manifest.js +1 -1
  103. package/apps/console/.next/standalone/.next/server/app/api/usage/route_client-reference-manifest.js +1 -1
  104. package/apps/console/.next/standalone/.next/server/app/api/video/video-script/route_client-reference-manifest.js +1 -1
  105. package/apps/console/.next/standalone/.next/server/app/api/webhooks/workflow/[id]/route_client-reference-manifest.js +1 -1
  106. package/apps/console/.next/standalone/.next/server/app/api/workflows/[id]/history/[runId]/route_client-reference-manifest.js +1 -1
  107. package/apps/console/.next/standalone/.next/server/app/api/workflows/[id]/history/route_client-reference-manifest.js +1 -1
  108. package/apps/console/.next/standalone/.next/server/app/api/workflows/[id]/route_client-reference-manifest.js +1 -1
  109. package/apps/console/.next/standalone/.next/server/app/api/workflows/[id]/run/route_client-reference-manifest.js +1 -1
  110. package/apps/console/.next/standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
  111. package/apps/console/.next/standalone/.next/server/app/gtm/page_client-reference-manifest.js +1 -1
  112. package/apps/console/.next/standalone/.next/server/app/index.html +1 -1
  113. package/apps/console/.next/standalone/.next/server/app/index.rsc +2 -2
  114. package/apps/console/.next/standalone/.next/server/app/page.js +10 -2
  115. package/apps/console/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  116. package/apps/console/.next/standalone/.next/server/app-paths-manifest.json +51 -51
  117. package/apps/console/.next/standalone/.next/server/chunks/381.js +1 -1
  118. package/apps/console/.next/standalone/.next/server/chunks/4768.js +1 -1
  119. package/apps/console/.next/standalone/.next/server/chunks/7907.js +1 -1
  120. package/apps/console/.next/standalone/.next/server/functions-config-manifest.json +42 -42
  121. package/apps/console/.next/standalone/.next/server/pages/404.html +1 -1
  122. package/apps/console/.next/standalone/.next/server/pages/500.html +1 -1
  123. package/apps/console/.next/standalone/.next/server/pages-manifest.json +1 -1
  124. package/apps/console/.next/standalone/.next/static/chunks/3395-dff1a405a54e72f2.js +1 -0
  125. package/apps/console/.next/standalone/.next/static/chunks/app/page-efaf5b25f1b4bcdf.js +1 -0
  126. package/apps/console/.next/static/chunks/3395-dff1a405a54e72f2.js +1 -0
  127. package/apps/console/.next/static/chunks/app/page-efaf5b25f1b4bcdf.js +1 -0
  128. package/bin/leedab.js +23 -8
  129. package/dist/first-run/ensure.d.ts +1 -0
  130. package/dist/first-run/ensure.js +132 -0
  131. package/dist/onboard/index.js +11 -64
  132. package/package.json +1 -1
  133. package/apps/console/.next/standalone/.next/static/chunks/7973-072db1a3857a8fe9.js +0 -1
  134. package/apps/console/.next/standalone/.next/static/chunks/app/page-bdfdbf7b657f4722.js +0 -1
  135. package/apps/console/.next/static/chunks/7973-072db1a3857a8fe9.js +0 -1
  136. package/apps/console/.next/static/chunks/app/page-bdfdbf7b657f4722.js +0 -1
  137. /package/apps/console/.next/standalone/.next/static/{B4g4e91OJP29sEqgIs76V → CLtH7rcbrrXTBpzawMULl}/_buildManifest.js +0 -0
  138. /package/apps/console/.next/standalone/.next/static/{B4g4e91OJP29sEqgIs76V → CLtH7rcbrrXTBpzawMULl}/_ssgManifest.js +0 -0
  139. /package/apps/console/.next/static/{B4g4e91OJP29sEqgIs76V → CLtH7rcbrrXTBpzawMULl}/_buildManifest.js +0 -0
  140. /package/apps/console/.next/static/{B4g4e91OJP29sEqgIs76V → CLtH7rcbrrXTBpzawMULl}/_ssgManifest.js +0 -0
package/bin/leedab.js CHANGED
@@ -14,6 +14,7 @@ import { startGateway, stopGateway } from "../dist/gateway.js";
14
14
  import { loadConfig, initConfig } from "../dist/config/index.js";
15
15
  import { setupChannels } from "../dist/channels/index.js";
16
16
  import { runOnboard } from "../dist/onboard/index.js";
17
+ import { ensureFirstRun } from "../dist/first-run/ensure.js";
17
18
  import { startConsole, stopConsole } from "../dist/console-launcher.js";
18
19
  import { execBranded } from "../dist/brand.js";
19
20
  import { resolveOpenClawBin, openclawArgs, openclawEnv } from "../dist/openclaw.js";
@@ -135,9 +136,12 @@ function ensureAdminToken() {
135
136
  }
136
137
 
137
138
  /** Commands that don't require an existing project directory or license. */
138
- const NO_PROJECT_REQUIRED = new Set(["onboard", "init", "help"]);
139
- /** Commands that need a project but not a license (onboard handles its own license check). */
140
- const NO_LICENSE_REQUIRED = new Set(["onboard", "init", "help", "stop"]);
139
+ // `start` is intentionally listed here. The action runs ensureFirstRun()
140
+ // inline before any operations that depend on a configured workspace or
141
+ // license; the project + license guards would bail too eagerly on a fresh
142
+ // install otherwise.
143
+ const NO_PROJECT_REQUIRED = new Set(["onboard", "init", "help", "start"]);
144
+ const NO_LICENSE_REQUIRED = new Set(["onboard", "init", "help", "stop", "start"]);
141
145
 
142
146
  /**
143
147
  * Auto-recover from the "two-state-dirs" footgun. If the current working
@@ -269,7 +273,7 @@ function requireProject(command) {
269
273
 
270
274
  if (!existsSync(STATE_DIR)) {
271
275
  console.error(chalk.red("\n LeedAB is not set up yet.\n"));
272
- console.error(chalk.dim(" Run ") + chalk.cyan("leedab onboard") + chalk.dim(" to get started.\n"));
276
+ console.error(chalk.dim(" Run ") + chalk.cyan("leedab start") + chalk.dim(" to get started — it'll prompt for what's missing.\n"));
273
277
  process.exit(1);
274
278
  }
275
279
  }
@@ -289,7 +293,7 @@ async function requireLicense(command) {
289
293
  const license = await ensureLicense();
290
294
  if (!license) {
291
295
  console.error(chalk.red("\n Invalid or expired license.\n"));
292
- console.error(chalk.dim(" Re-enter your key: ") + chalk.cyan("leedab onboard"));
296
+ console.error(chalk.dim(" Re-enter your key: ") + chalk.cyan("leedab start"));
293
297
  console.error(chalk.dim(" Get a key at: ") + chalk.cyan("https://leedab.com\n"));
294
298
  process.exit(1);
295
299
  }
@@ -311,7 +315,7 @@ program
311
315
 
312
316
  program
313
317
  .command("onboard")
314
- .description("Interactive setup wizard connect channels and set up credential vault")
318
+ .description("Optional. Walks the full setup wizard including channels and the vault. `leedab start` covers the basics inline.")
315
319
  .action(async () => {
316
320
  try {
317
321
  // Provision the writable workspace + admin token before runOnboard
@@ -333,14 +337,14 @@ program
333
337
  const { loadLicense, validateLicenseKey, saveLicense } = await import("../dist/license.js");
334
338
  const cached = await loadLicense();
335
339
  if (!cached?.key) {
336
- console.log(chalk.red("\n No valid license found. Run `leedab onboard` to enter your key.\n"));
340
+ console.log(chalk.red("\n No valid license found. Run `leedab start` to enter your key.\n"));
337
341
  process.exit(1);
338
342
  }
339
343
  // Always fetch live
340
344
  const license = await validateLicenseKey(cached.key);
341
345
  await saveLicense(license);
342
346
  if (!license) {
343
- console.log(chalk.red("\n No valid license found. Run `leedab onboard` to enter your key.\n"));
347
+ console.log(chalk.red("\n No valid license found. Run `leedab start` to enter your key.\n"));
344
348
  process.exit(1);
345
349
  }
346
350
  console.log("");
@@ -426,6 +430,17 @@ program
426
430
  "Pouring the coffee...",
427
431
  "Almost there...",
428
432
  ];
433
+ // First-run gate. Quietly returns when license + provider are already
434
+ // set; prompts inline for what's missing on a fresh install. Replaces
435
+ // the standalone `leedab onboard` wizard as the entry path so the
436
+ // operator never has to know about a separate setup command.
437
+ try {
438
+ await ensureFirstRun();
439
+ } catch (err) {
440
+ console.error(chalk.red(`\n Setup failed: ${err.message}\n`));
441
+ process.exit(1);
442
+ }
443
+
429
444
  const spinner = ora("Starting LeedAB agent...").start();
430
445
  let lastIdx = -1;
431
446
  const rotate = setInterval(() => {
@@ -0,0 +1 @@
1
+ export declare function ensureFirstRun(): Promise<void>;
@@ -0,0 +1,132 @@
1
+ import { writeFile, mkdir, readFile, access } from "node:fs/promises";
2
+ import { resolve } from "node:path";
3
+ import chalk from "chalk";
4
+ import inquirer from "inquirer";
5
+ import { onboardProvider } from "../onboard/steps/provider.js";
6
+ import { DEFAULT_CONFIG } from "../config/schema.js";
7
+ import { loadConfig } from "../config/index.js";
8
+ import { initMemory } from "../memory/index.js";
9
+ import { validateLicenseKey, saveLicense, loadLicense } from "../license.js";
10
+ import { STATE_DIR } from "../paths.js";
11
+ // First-run gate for `leedab start`. Idempotent: returns silently when
12
+ // the license + LLM provider are already configured; prompts inline for
13
+ // whatever's missing, persists results, and returns. Replaces the older
14
+ // standalone `leedab onboard` wizard for the load-bearing setup so the
15
+ // operator doesn't have to remember a separate command before they can
16
+ // run the agent. Channel and vault setup remain accessible via
17
+ // `leedab configure` / the admin panel.
18
+ export async function ensureFirstRun() {
19
+ // Banner only when something is actually missing — quiet on re-runs.
20
+ let printed = false;
21
+ const banner = () => {
22
+ if (printed)
23
+ return;
24
+ console.log();
25
+ console.log(chalk.bold(" Welcome to LeedAB."));
26
+ console.log(chalk.dim(" A local AI OS that learns your operations."));
27
+ console.log();
28
+ printed = true;
29
+ };
30
+ // 1. License
31
+ const existingLicense = await loadLicense();
32
+ if (!existingLicense?.valid) {
33
+ banner();
34
+ await promptForLicense();
35
+ }
36
+ // 2. Provider (auth profile in openclaw.json)
37
+ const hasProvider = await openClawHasProfile();
38
+ if (!hasProvider) {
39
+ banner();
40
+ console.log(chalk.bold(" Pick a model"));
41
+ console.log(chalk.dim(" Your key stays local. Switch any time with ") + chalk.cyan("leedab configure model") + chalk.dim("."));
42
+ console.log();
43
+ const provider = await onboardProvider();
44
+ // Materialise leedab config.json with the chosen model so subsequent
45
+ // commands have a config to read. We don't write a model value when
46
+ // the provider step bailed (operator hit Ctrl-C inside the picker);
47
+ // they'll be re-prompted next start.
48
+ if (provider) {
49
+ const existing = await loadExistingConfig();
50
+ const next = {
51
+ ...(existing ?? DEFAULT_CONFIG),
52
+ agent: {
53
+ ...((existing ?? DEFAULT_CONFIG).agent),
54
+ model: provider.model,
55
+ },
56
+ };
57
+ await mkdir(STATE_DIR, { recursive: true });
58
+ await writeFile(resolve(STATE_DIR, "config.json"), JSON.stringify(next, null, 2) + "\n");
59
+ // Memory dir on first run.
60
+ next.memory.dir = resolve(STATE_DIR, "memory");
61
+ await initMemory(next.memory.dir);
62
+ }
63
+ }
64
+ if (printed) {
65
+ console.log();
66
+ console.log(chalk.green(" You're set."));
67
+ console.log();
68
+ }
69
+ }
70
+ async function loadExistingConfig() {
71
+ const path = resolve(STATE_DIR, "config.json");
72
+ try {
73
+ await access(path);
74
+ }
75
+ catch {
76
+ return null;
77
+ }
78
+ // loadConfig logs a warning when the file is missing; we already
79
+ // gated above so this read is safe.
80
+ return loadConfig(path);
81
+ }
82
+ async function openClawHasProfile() {
83
+ try {
84
+ const raw = await readFile(resolve(STATE_DIR, "openclaw.json"), "utf-8");
85
+ const cfg = JSON.parse(raw);
86
+ return Object.keys(cfg.auth?.profiles ?? {}).length > 0;
87
+ }
88
+ catch {
89
+ return false;
90
+ }
91
+ }
92
+ async function promptForLicense() {
93
+ console.log(chalk.bold(" License key"));
94
+ console.log(chalk.dim(" Buy at ") + chalk.cyan("https://leedab.com") + chalk.dim(" — key is sent to your email."));
95
+ console.log();
96
+ while (true) {
97
+ let key;
98
+ try {
99
+ const answers = await inquirer.prompt([
100
+ {
101
+ type: "password",
102
+ name: "key",
103
+ message: "License key:",
104
+ mask: "*",
105
+ validate: (v) => v.trim().startsWith("am_live_") || "Key should start with am_live_",
106
+ },
107
+ ]);
108
+ key = answers.key;
109
+ }
110
+ catch {
111
+ console.log(chalk.dim("\n\n Exiting. Run `leedab start` again when you have your key.\n"));
112
+ process.exit(0);
113
+ }
114
+ process.stdout.write(chalk.dim(" Validating..."));
115
+ const result = await validateLicenseKey(key.trim());
116
+ if (result.valid) {
117
+ await saveLicense(result);
118
+ console.log(chalk.green(` valid (${result.tier} plan)`));
119
+ console.log();
120
+ return;
121
+ }
122
+ console.log(chalk.red(" invalid key."));
123
+ const { retry } = await inquirer.prompt([
124
+ { type: "confirm", name: "retry", message: "Try again?", default: true },
125
+ ]);
126
+ if (!retry) {
127
+ console.log(chalk.red("\n A valid license key is required to use LeedAB."));
128
+ console.log(chalk.dim(" Get one at ") + chalk.cyan("https://leedab.com\n"));
129
+ process.exit(1);
130
+ }
131
+ }
132
+ }
@@ -1,6 +1,5 @@
1
- import { writeFile, readFile, mkdir, readdir, copyFile } from "node:fs/promises";
2
- import { resolve, join, dirname } from "node:path";
3
- import { fileURLToPath } from "node:url";
1
+ import { writeFile, mkdir } from "node:fs/promises";
2
+ import { resolve } from "node:path";
4
3
  import chalk from "chalk";
5
4
  import inquirer from "inquirer";
6
5
  import { printWelcome } from "./steps/welcome.js";
@@ -72,7 +71,8 @@ export async function runOnboard() {
72
71
  }
73
72
  }
74
73
  }
75
- // Agent name
74
+ // Agent name. Kept as a single quick prompt so the operator can rebrand
75
+ // the assistant if they want; defaults to LeedAB.
76
76
  const { agentName } = await inquirer.prompt([
77
77
  {
78
78
  type: "input",
@@ -81,30 +81,18 @@ export async function runOnboard() {
81
81
  default: "LeedAB",
82
82
  },
83
83
  ]);
84
- // Vertical selection
85
- const { vertical } = await inquirer.prompt([
86
- {
87
- type: "list",
88
- name: "vertical",
89
- message: "What type of operations?",
90
- choices: [
91
- { name: "General purpose", value: "general" },
92
- { name: "Supply chain & logistics", value: "supply-chain" },
93
- ],
94
- },
95
- ]);
84
+ // Vertical / industry presets used to live here — dropped 2026-05.
85
+ // The brain learns the operation from real signals; pre-categorising
86
+ // at setup contradicts the closed-loop positioning and forces a
87
+ // self-categorisation decision before the brain has seen any data.
88
+ // Same call killed the vertical-specific template + vault seeding;
89
+ // the marketplace is the pull model for additional operators now.
96
90
  const config = {
97
91
  ...DEFAULT_CONFIG,
98
- agent: { ...DEFAULT_CONFIG.agent, name: agentName, vertical },
92
+ agent: { ...DEFAULT_CONFIG.agent, name: agentName },
99
93
  };
100
94
  // Secrets go to .leedab/secrets.json (gitignored)
101
95
  const secrets = {};
102
- // --- Seed vertical templates ---
103
- if (vertical !== "general") {
104
- await seedVerticalTemplates(vertical);
105
- await seedVerticalVault(vertical);
106
- console.log(chalk.green(`\n Loaded ${vertical} templates and vault entries.`));
107
- }
108
96
  // --- LLM Provider ---
109
97
  const provider = await onboardProvider();
110
98
  if (provider) {
@@ -237,44 +225,3 @@ export async function runOnboard() {
237
225
  console.log(chalk.dim(` Memory: ~/.leedab/memory/`));
238
226
  console.log(chalk.bold(`\n Start your agent: ${chalk.cyan("leedab start")}\n`));
239
227
  }
240
- /**
241
- * Copy vertical-specific workspace templates (SOUL.md, HEARTBEAT.md, etc.)
242
- * into workspace/, overwriting defaults.
243
- */
244
- async function seedVerticalTemplates(vertical) {
245
- const srcDir = join(dirname(fileURLToPath(import.meta.url)), "..", "templates", "verticals", vertical);
246
- const destDir = resolve("workspace");
247
- await mkdir(destDir, { recursive: true });
248
- try {
249
- const files = await readdir(srcDir);
250
- for (const file of files) {
251
- if (file.endsWith(".json"))
252
- continue; // Skip vault-template.json
253
- await copyFile(join(srcDir, file), join(destDir, file));
254
- }
255
- }
256
- catch {
257
- // Templates directory may not exist for this vertical
258
- }
259
- }
260
- /**
261
- * Pre-populate vault with entries from the vertical's vault-template.json.
262
- * Only adds entries that don't already exist (won't overwrite user credentials).
263
- */
264
- async function seedVerticalVault(vertical) {
265
- const templatePath = join(dirname(fileURLToPath(import.meta.url)), "..", "templates", "verticals", vertical, "vault-template.json");
266
- try {
267
- const raw = await readFile(templatePath, "utf-8");
268
- const template = JSON.parse(raw);
269
- for (const [service, entry] of Object.entries(template)) {
270
- // Only add if service doesn't already exist in vault
271
- const existing = await listEntries();
272
- if (!existing.some((e) => e.service === service)) {
273
- await addEntry(service, entry);
274
- }
275
- }
276
- }
277
- catch {
278
- // No vault template for this vertical
279
- }
280
- }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leedab",
3
- "version": "0.7.1",
3
+ "version": "0.7.2",
4
4
  "description": "A local AI operating system that learns your operations and runs them with Artificial Beings. Across portals, ERPs, dashboards, inboxes, spreadsheets, and PDFs. On your hardware. Your data. No APIs.",
5
5
  "license": "UNLICENSED",
6
6
  "author": "LeedAB <hello@leedab.com>",