@robbiesrobotics/alice-agents 1.5.4 → 1.5.6
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 +7 -7
- package/bin/alice-install.mjs +10 -10
- package/lib/doctor.mjs +5 -5
- package/lib/installer.mjs +64 -20
- package/lib/license.mjs +4 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -18,10 +18,10 @@ That's it. The installer detects your runtime (NemoClaw or OpenClaw) and sets ev
|
|
|
18
18
|
|
|
19
19
|
**Starter** includes 10 agents. **Pro** unlocks 21 more — [sign up at getalice.av3.ai](https://getalice.av3.ai/signup?plan=pro)
|
|
20
20
|
|
|
21
|
-
**
|
|
21
|
+
**A.L.I.C.E. | Control Cloud** is available as a Pro add-on. If enabled during install, the package now:
|
|
22
22
|
- installs the `mission-control-bridge` plugin into your OpenClaw home
|
|
23
|
-
- writes a portable local
|
|
24
|
-
- enables the bridge in `openclaw.json` so your runtime can forward live telemetry to
|
|
23
|
+
- writes a portable local A.L.I.C.E. | Control config at `~/.openclaw/.alice-mission-control.json`
|
|
24
|
+
- enables the bridge in `openclaw.json` so your runtime can forward live telemetry to A.L.I.C.E. | Control
|
|
25
25
|
- installs a bundled `coding-agent` skill that prefers Codex for OpenAI defaults and Claude Code for Anthropic defaults
|
|
26
26
|
|
|
27
27
|
An orchestrator (A.L.I.C.E., also addressable as Alice or Olivia) backed by specialist agents across every domain:
|
|
@@ -85,7 +85,7 @@ npx @robbiesrobotics/alice-agents
|
|
|
85
85
|
# Non-interactive with defaults (detected model if available, otherwise Sonnet; Starter tier unless --tier pro)
|
|
86
86
|
npx @robbiesrobotics/alice-agents --yes
|
|
87
87
|
|
|
88
|
-
# Non-interactive Pro install with
|
|
88
|
+
# Non-interactive Pro install with A.L.I.C.E. | Control Cloud enabled
|
|
89
89
|
npx @robbiesrobotics/alice-agents --yes --tier pro --license-key YOUR_KEY --cloud --cloud-token YOUR_TOKEN
|
|
90
90
|
|
|
91
91
|
# Force the coding tool preference for this install
|
|
@@ -101,11 +101,11 @@ npx @robbiesrobotics/alice-agents --help
|
|
|
101
101
|
- **Merge** — Adds A.L.I.C.E. agents alongside your existing agents
|
|
102
102
|
- **Upgrade** — Updates product files (SOUL.md, AGENTS.md, etc.) without touching user customizations
|
|
103
103
|
|
|
104
|
-
###
|
|
104
|
+
### A.L.I.C.E. | Control Cloud
|
|
105
105
|
|
|
106
|
-
If you're a Pro user with the cloud add-on, the installer can configure your local runtime for
|
|
106
|
+
If you're a Pro user with the cloud add-on, the installer can configure your local runtime for A.L.I.C.E. | Control in the same pass.
|
|
107
107
|
|
|
108
|
-
- Interactive install: choose `Pro`, validate your license, then enable the
|
|
108
|
+
- Interactive install: choose `Pro`, validate your license, then enable the A.L.I.C.E. | Control Cloud add-on when prompted
|
|
109
109
|
- Non-interactive install: pass `--tier pro --license-key YOUR_KEY --cloud`
|
|
110
110
|
- Optional flags:
|
|
111
111
|
- `--cloud-token <token>` — access or ingest token for authenticated telemetry
|
package/bin/alice-install.mjs
CHANGED
|
@@ -32,7 +32,7 @@ if (flags.has('--help') || flags.has('-h')) {
|
|
|
32
32
|
npx @robbiesrobotics/alice-agents --uninstall Remove A.L.I.C.E. agents from config
|
|
33
33
|
npx @robbiesrobotics/alice-agents --doctor Run diagnostics on your A.L.I.C.E. install
|
|
34
34
|
npx @robbiesrobotics/alice-agents --skills Manage skills (install, remove, browse)
|
|
35
|
-
npx @robbiesrobotics/alice-agents --cloud Enable
|
|
35
|
+
npx @robbiesrobotics/alice-agents --cloud Enable A.L.I.C.E. | Control Cloud during install
|
|
36
36
|
npx @robbiesrobotics/alice-agents --version Show version
|
|
37
37
|
npx @robbiesrobotics/alice-agents --help Show this help
|
|
38
38
|
|
|
@@ -41,18 +41,18 @@ if (flags.has('--help') || flags.has('-h')) {
|
|
|
41
41
|
--update Non-interactive upgrade (alias for --yes with upgrade mode)
|
|
42
42
|
--uninstall Remove A.L.I.C.E. agents (preserves non-ALICE agents)
|
|
43
43
|
--doctor Run diagnostics and check install health
|
|
44
|
-
--cloud Enable
|
|
45
|
-
--no-cloud Skip
|
|
44
|
+
--cloud Enable A.L.I.C.E. | Control Cloud setup during install
|
|
45
|
+
--no-cloud Skip A.L.I.C.E. | Control Cloud setup during install
|
|
46
46
|
--tier <starter|pro> Force the install tier
|
|
47
47
|
--license-key <key> Provide a Pro license key for automation
|
|
48
48
|
--coding-tool <auto|claude|codex> Override the preferred coding CLI
|
|
49
|
-
--cloud-token <token>
|
|
50
|
-
--cloud-dashboard-url <url>
|
|
51
|
-
--cloud-ingest-url <url>
|
|
52
|
-
--cloud-team-id <id>
|
|
53
|
-
--cloud-team-slug <slug>
|
|
54
|
-
--cloud-team-name <name>
|
|
55
|
-
--cloud-team-plan <plan>
|
|
49
|
+
--cloud-token <token> A.L.I.C.E. | Control ingest/access token
|
|
50
|
+
--cloud-dashboard-url <url> A.L.I.C.E. | Control dashboard URL
|
|
51
|
+
--cloud-ingest-url <url> A.L.I.C.E. | Control ingest endpoint
|
|
52
|
+
--cloud-team-id <id> A.L.I.C.E. | Control team UUID
|
|
53
|
+
--cloud-team-slug <slug> A.L.I.C.E. | Control team slug
|
|
54
|
+
--cloud-team-name <name> A.L.I.C.E. | Control team name
|
|
55
|
+
--cloud-team-plan <plan> A.L.I.C.E. | Control team plan
|
|
56
56
|
--version Print package version
|
|
57
57
|
`);
|
|
58
58
|
process.exit(0);
|
package/lib/doctor.mjs
CHANGED
|
@@ -353,22 +353,22 @@ export async function runDoctor() {
|
|
|
353
353
|
|
|
354
354
|
check(
|
|
355
355
|
cloudOk
|
|
356
|
-
? `
|
|
357
|
-
: '
|
|
356
|
+
? `A.L.I.C.E. | Control cloud configured (${cloud.dashboardUrl})`
|
|
357
|
+
: 'A.L.I.C.E. | Control cloud config incomplete',
|
|
358
358
|
cloudOk,
|
|
359
359
|
'Run: npx @robbiesrobotics/alice-agents --cloud to repair cloud settings'
|
|
360
360
|
);
|
|
361
361
|
allOk = allOk && cloudOk;
|
|
362
362
|
} catch {
|
|
363
363
|
check(
|
|
364
|
-
'
|
|
364
|
+
'A.L.I.C.E. | Control cloud config invalid',
|
|
365
365
|
false,
|
|
366
|
-
'Repair
|
|
366
|
+
'Repair config or rerun the installer with --cloud'
|
|
367
367
|
);
|
|
368
368
|
allOk = false;
|
|
369
369
|
}
|
|
370
370
|
} else {
|
|
371
|
-
console.log(` ${dim('–')} ${dim('
|
|
371
|
+
console.log(` ${dim('–')} ${dim('A.L.I.C.E. | Control cloud not configured (optional)')}`);
|
|
372
372
|
}
|
|
373
373
|
|
|
374
374
|
// 9. Skills disk check
|
package/lib/installer.mjs
CHANGED
|
@@ -499,48 +499,92 @@ function printSummaryWithOptions(mode, tier, agents, preset, userInfo, detectedM
|
|
|
499
499
|
* Uses alice-cloud CLI spawned as a child process (CJS ↔ ESM boundary).
|
|
500
500
|
*/
|
|
501
501
|
async function _runCloudOnboarding(auto, options, existingMissionControl) {
|
|
502
|
-
const {
|
|
502
|
+
const { execFileSync } = await import('node:child_process');
|
|
503
|
+
const { mkdirSync, readFileSync, writeFileSync, existsSync: fsExists } = await import('node:fs');
|
|
503
504
|
const aliceCloudBin = join(__dirname, '..', 'bin', 'alice-cloud.cjs');
|
|
504
505
|
const defaults = getDefaultMissionControlSettings();
|
|
506
|
+
const cloudConfigPath = join(homedir(), '.openclaw', 'alice-cloud.json');
|
|
507
|
+
|
|
508
|
+
function readCloudJson() {
|
|
509
|
+
try { return JSON.parse(readFileSync(cloudConfigPath, 'utf8')); } catch { return {}; }
|
|
510
|
+
}
|
|
511
|
+
function writeCloudJson(data) {
|
|
512
|
+
mkdirSync(join(homedir(), '.openclaw'), { recursive: true });
|
|
513
|
+
writeFileSync(cloudConfigPath, JSON.stringify(data, null, 2));
|
|
514
|
+
}
|
|
505
515
|
|
|
506
516
|
try {
|
|
507
|
-
// Step 1: Login
|
|
517
|
+
// Step 1: Login
|
|
508
518
|
console.log('');
|
|
509
519
|
console.log(` ${icons.pkg} ${bold('Setting up A.L.I.C.E. Cloud...')}`);
|
|
510
|
-
console.log(` Opening your browser to sign in with GitHub...`);
|
|
511
520
|
console.log('');
|
|
512
521
|
|
|
513
|
-
// Spawn alice-cloud login as a child process
|
|
514
|
-
// In non-interactive mode, use env var for token
|
|
515
522
|
if (auto && options.cloudSupabaseToken) {
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
}
|
|
522
|
-
);
|
|
523
|
+
// Non-interactive: use provided token
|
|
524
|
+
const cloudData = readCloudJson();
|
|
525
|
+
cloudData.supabaseToken = options.cloudSupabaseToken;
|
|
526
|
+
writeCloudJson(cloudData);
|
|
527
|
+
printStepDone('Cloud token saved');
|
|
523
528
|
} else if (!auto) {
|
|
524
|
-
// Interactive:
|
|
525
|
-
|
|
529
|
+
// Interactive: open browser and prompt for token using our own readline
|
|
530
|
+
console.log(` ${dim('A.L.I.C.E. Cloud uses your GitHub account for authentication.')}`);
|
|
531
|
+
console.log(` ${dim('We\'ll open your browser to sign in, then you\'ll paste a token back here.')}`);
|
|
532
|
+
console.log('');
|
|
533
|
+
|
|
534
|
+
try {
|
|
535
|
+
const open = (await import('open')).default;
|
|
536
|
+
const supabaseUrl = 'https://xxxgvtwnlbtdgmlgccee.supabase.co';
|
|
537
|
+
const oauthUrl = `${supabaseUrl}/auth/v1/authorize?provider=github&redirect_to=${encodeURIComponent('https://alice.av3.ai/api/cloud/auth/callback')}`;
|
|
538
|
+
await open(oauthUrl);
|
|
539
|
+
console.log(` ${green('Browser opened!')} Sign in with GitHub and copy the token shown.`);
|
|
540
|
+
} catch {
|
|
541
|
+
console.log(` ${yellow('Could not open browser.')} Visit this URL to sign in:`);
|
|
542
|
+
console.log(` ${cyan('https://alice.av3.ai/login')}`);
|
|
543
|
+
}
|
|
544
|
+
console.log('');
|
|
545
|
+
|
|
546
|
+
const token = await promptCloudToken();
|
|
547
|
+
|
|
548
|
+
if (token) {
|
|
549
|
+
const cloudData = readCloudJson();
|
|
550
|
+
cloudData.supabaseToken = token;
|
|
551
|
+
writeCloudJson(cloudData);
|
|
552
|
+
printStepDone('Cloud token saved');
|
|
553
|
+
} else {
|
|
554
|
+
console.log(` ${dim('Skipped — you can authenticate later with:')} ${cyan('alice-cloud login')}`);
|
|
555
|
+
}
|
|
526
556
|
}
|
|
527
557
|
|
|
528
|
-
// Step 2: Register gateway
|
|
558
|
+
// Step 2: Register gateway (use child process for this — no stdin needed)
|
|
529
559
|
if (isCloudAuthenticated()) {
|
|
530
560
|
console.log('');
|
|
531
561
|
console.log(` ${icons.pkg} ${bold('Registering gateway with A.L.I.C.E. Cloud...')}`);
|
|
532
|
-
|
|
533
|
-
|
|
562
|
+
try {
|
|
563
|
+
execFileSync(process.execPath, [aliceCloudBin, 'register'], {
|
|
564
|
+
stdio: ['ignore', 'inherit', 'inherit'],
|
|
565
|
+
timeout: 15000,
|
|
566
|
+
});
|
|
567
|
+
printStepDone('Gateway registered with A.L.I.C.E. Cloud');
|
|
568
|
+
} catch {
|
|
569
|
+
console.log(` ${yellow('Gateway registration failed — you can retry later with:')} ${cyan('alice-cloud register')}`);
|
|
570
|
+
}
|
|
534
571
|
|
|
535
572
|
// Step 3: Ask about heartbeat daemon
|
|
536
573
|
const startHeartbeat = auto ? false : await promptCloudHeartbeat();
|
|
537
574
|
if (startHeartbeat) {
|
|
538
575
|
console.log(` ${dim('Starting heartbeat daemon...')}`);
|
|
539
|
-
|
|
540
|
-
|
|
576
|
+
try {
|
|
577
|
+
execFileSync(process.execPath, [aliceCloudBin, 'watch', '--daemon'], {
|
|
578
|
+
stdio: ['ignore', 'inherit', 'inherit'],
|
|
579
|
+
timeout: 10000,
|
|
580
|
+
});
|
|
581
|
+
printStepDone('Heartbeat daemon started');
|
|
582
|
+
} catch {
|
|
583
|
+
console.log(` ${dim('Could not start daemon — run:')} ${cyan('alice-cloud watch --daemon')}`);
|
|
584
|
+
}
|
|
541
585
|
}
|
|
542
586
|
} else {
|
|
543
|
-
printStepSkip('
|
|
587
|
+
printStepSkip('A.L.I.C.E. | Control', 'no token provided — run `alice-cloud login` later');
|
|
544
588
|
}
|
|
545
589
|
} catch (err) {
|
|
546
590
|
console.log(` ${icons.warn} ${yellow('Cloud setup encountered an issue: ' + (err.message || 'unknown error'))}`);
|
package/lib/license.mjs
CHANGED
|
@@ -168,7 +168,10 @@ export async function checkProLicense(options = {}) {
|
|
|
168
168
|
};
|
|
169
169
|
}
|
|
170
170
|
|
|
171
|
-
if
|
|
171
|
+
// Revalidation failed — but if the license was previously validated successfully,
|
|
172
|
+
// honor it with a grace period rather than immediately invalidating.
|
|
173
|
+
// This prevents API outages or temporary endpoint issues from breaking existing installs.
|
|
174
|
+
if (refreshed.transient || record.status === 'validated') {
|
|
172
175
|
return {
|
|
173
176
|
licensed: true,
|
|
174
177
|
key: record.key,
|