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.
- package/README.md +4 -7
- package/apps/console/.next/standalone/.next/BUILD_ID +1 -1
- package/apps/console/.next/standalone/.next/app-build-manifest.json +151 -151
- package/apps/console/.next/standalone/.next/app-path-routes-manifest.json +51 -51
- package/apps/console/.next/standalone/.next/build-manifest.json +2 -2
- package/apps/console/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/apps/console/.next/standalone/.next/server/app/_not-found.rsc +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/agent/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/approvals/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/approvals/stream/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/automation/workflow-blueprint/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/backend/endpoint-spec/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/bootstrap-admin-token/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/brand/brand-audit/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/campaigns/campaign-brief/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/champion/confidence/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/champion/customer/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/champion/dispatches/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/champion/engagement/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/champion/escalate/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/champion/profile/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/champion/screenshare/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/champion/track-question/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/champion/use-case-wiki/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/chat/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/compliance/risk-register-seed/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/computer-use/[id]/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/computer-use/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/concierge/morning-brief/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/contacts/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/content/seo-brief/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/conversations/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/coo/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/cx/escalation-triage/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/cx/health-score/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/data/cohort-brief/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/delivery/qbr-brief/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/delivery/weekly-brief/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/dev/invalidate-cache/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/devops/runbook/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/email/sequence-brief/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/engineering/adr-draft/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/finance/runway-snapshot/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/frontend/component-spec/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/implementation/brief/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/implementation/scaffold-migration-script/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/implementation/scaffold-n8n-workflow/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/implementation/scaffold-skill-override/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/inbox/stream/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/investor/kpi-tracker/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/leedab/channels/status/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/leedab/channels/telegram/connect/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/leedab/channels/whatsapp/connect/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/leedab/gtm/leads/[id]/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/leedab/gtm/leads/[id]/status/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/leedab/gtm/templates/[name]/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/leedab/license/route.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/leedab/license/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/leedab/models/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/leedab/providers/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/leedab/sessions/[id]/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/leedab/sessions/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/leedab/team/[id]/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/leedab/team/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/leedab/vault/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/leedab/workflows/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/legal/clause-template/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/manifest/agents/custom/draft/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/manifest/agents/custom/route.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/manifest/agents/custom/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/manifest/agents/route.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/manifest/agents/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/marketing/cadence-planner/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/marketing/competitive-snapshot/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/marketplace/catalogue/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/onboarding/engagement-plan/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/onboarding/kickoff-brief/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/openclaw/status/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/ops/dispatch-brief/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/pack/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/people/job-brief/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/procurement/po-brief/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/product/prd-draft/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/research/prospect-intel/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/research/search/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/routing/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/runs/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/sales/pipeline-summary/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/sales/prospect-brief/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/solutions/build/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/solutions/quickstart-regenerate/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/solutions/refine/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/strategy/market-pulse/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/telegram/[customerId]/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/templates/regenerate/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/uploads/[id]/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/uploads/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/usage/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/video/video-script/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/webhooks/workflow/[id]/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/workflows/[id]/history/[runId]/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/workflows/[id]/history/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/workflows/[id]/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/workflows/[id]/run/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/gtm/page_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app/index.html +1 -1
- package/apps/console/.next/standalone/.next/server/app/index.rsc +2 -2
- package/apps/console/.next/standalone/.next/server/app/page.js +10 -2
- package/apps/console/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/apps/console/.next/standalone/.next/server/app-paths-manifest.json +51 -51
- package/apps/console/.next/standalone/.next/server/chunks/381.js +1 -1
- package/apps/console/.next/standalone/.next/server/chunks/4768.js +1 -1
- package/apps/console/.next/standalone/.next/server/chunks/7907.js +1 -1
- package/apps/console/.next/standalone/.next/server/functions-config-manifest.json +42 -42
- package/apps/console/.next/standalone/.next/server/pages/404.html +1 -1
- package/apps/console/.next/standalone/.next/server/pages/500.html +1 -1
- package/apps/console/.next/standalone/.next/server/pages-manifest.json +1 -1
- package/apps/console/.next/standalone/.next/static/chunks/3395-dff1a405a54e72f2.js +1 -0
- package/apps/console/.next/standalone/.next/static/chunks/app/page-efaf5b25f1b4bcdf.js +1 -0
- package/apps/console/.next/static/chunks/3395-dff1a405a54e72f2.js +1 -0
- package/apps/console/.next/static/chunks/app/page-efaf5b25f1b4bcdf.js +1 -0
- package/bin/leedab.js +23 -8
- package/dist/first-run/ensure.d.ts +1 -0
- package/dist/first-run/ensure.js +132 -0
- package/dist/onboard/index.js +11 -64
- package/package.json +1 -1
- package/apps/console/.next/standalone/.next/static/chunks/7973-072db1a3857a8fe9.js +0 -1
- package/apps/console/.next/standalone/.next/static/chunks/app/page-bdfdbf7b657f4722.js +0 -1
- package/apps/console/.next/static/chunks/7973-072db1a3857a8fe9.js +0 -1
- package/apps/console/.next/static/chunks/app/page-bdfdbf7b657f4722.js +0 -1
- /package/apps/console/.next/standalone/.next/static/{B4g4e91OJP29sEqgIs76V → CLtH7rcbrrXTBpzawMULl}/_buildManifest.js +0 -0
- /package/apps/console/.next/standalone/.next/static/{B4g4e91OJP29sEqgIs76V → CLtH7rcbrrXTBpzawMULl}/_ssgManifest.js +0 -0
- /package/apps/console/.next/static/{B4g4e91OJP29sEqgIs76V → CLtH7rcbrrXTBpzawMULl}/_buildManifest.js +0 -0
- /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
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
|
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
|
|
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("
|
|
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
|
|
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
|
|
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
|
+
}
|
package/dist/onboard/index.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { writeFile,
|
|
2
|
-
import { resolve
|
|
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
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
|
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.
|
|
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>",
|