@robbiesrobotics/alice-agents 1.4.2 → 1.4.4

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 (47) hide show
  1. package/README.md +27 -6
  2. package/bin/alice-install.mjs +27 -2
  3. package/lib/installer.mjs +69 -3
  4. package/lib/manifest.mjs +1 -0
  5. package/lib/mission-control.mjs +150 -0
  6. package/lib/prompter.mjs +16 -0
  7. package/package.json +2 -1
  8. package/templates/agents-starter.json +8 -6
  9. package/templates/mission-control-bridge/index.ts +233 -0
  10. package/templates/mission-control-bridge/openclaw.plugin.json +8 -0
  11. package/templates/mission-control-bridge/package.json +11 -0
  12. package/templates/skills/claude-code/SKILL.md +2 -2
  13. package/templates/workspaces/_shared/AGENTS-coding.md +1 -1
  14. package/templates/workspaces/_shared/AGENTS-orchestrator.md +4 -3
  15. package/templates/workspaces/_shared/AGENTS.md +1 -1
  16. package/templates/workspaces/_shared/SOUL-coding.md +2 -2
  17. package/templates/workspaces/_shared/SOUL-orchestrator.md +3 -1
  18. package/templates/workspaces/_shared/SOUL.md +2 -2
  19. package/templates/workspaces/aiden/SOUL.md +1 -1
  20. package/templates/workspaces/alex/SOUL.md +1 -1
  21. package/templates/workspaces/audrey/SOUL.md +1 -1
  22. package/templates/workspaces/avery/SOUL.md +1 -1
  23. package/templates/workspaces/caleb/SOUL.md +1 -1
  24. package/templates/workspaces/clara/SOUL.md +1 -1
  25. package/templates/workspaces/daphne/SOUL.md +1 -1
  26. package/templates/workspaces/darius/SOUL.md +1 -1
  27. package/templates/workspaces/devon/SOUL.md +1 -1
  28. package/templates/workspaces/dylan/SOUL.md +1 -1
  29. package/templates/workspaces/dylan/TOOLS.md +1 -1
  30. package/templates/workspaces/elena/SOUL.md +1 -1
  31. package/templates/workspaces/eva/SOUL.md +1 -1
  32. package/templates/workspaces/felix/SOUL.md +1 -1
  33. package/templates/workspaces/hannah/SOUL.md +1 -1
  34. package/templates/workspaces/isaac/SOUL.md +1 -1
  35. package/templates/workspaces/logan/SOUL.md +1 -1
  36. package/templates/workspaces/morgan/SOUL.md +1 -1
  37. package/templates/workspaces/nadia/SOUL.md +1 -1
  38. package/templates/workspaces/olivia/SOUL.md +5 -3
  39. package/templates/workspaces/owen/SOUL.md +1 -1
  40. package/templates/workspaces/parker/SOUL.md +1 -1
  41. package/templates/workspaces/quinn/SOUL.md +1 -1
  42. package/templates/workspaces/rowan/SOUL.md +1 -1
  43. package/templates/workspaces/selena/SOUL.md +1 -1
  44. package/templates/workspaces/sloane/SOUL.md +1 -1
  45. package/templates/workspaces/sophie/SOUL.md +1 -1
  46. package/templates/workspaces/tommy/SOUL.md +1 -1
  47. package/templates/workspaces/uma/SOUL.md +1 -1
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  **Adaptive Learning & Intelligent Coordination Engine**
4
4
 
5
- One conversation. One orchestrator. Ten starter agents — with 18 more in Pro. A.L.I.C.E. turns your agent runtime into a full AI team — talk to Olivia, and she routes your request to the right expert.
5
+ One conversation. One orchestrator. Ten starter agents — with 18 more in Pro. A.L.I.C.E. turns your agent runtime into a full AI team — talk to A.L.I.C.E. (or just Alice), and she routes your request to the right expert.
6
6
 
7
7
  **NemoClaw compatible** — A.L.I.C.E. v1.2.7+ runs natively on [NVIDIA NemoClaw](https://nvidia.com/nemoclaw), the secure open-source agent runtime. Agents execute inside the OpenShell sandbox for enterprise-grade security.
8
8
 
@@ -18,11 +18,16 @@ That's it. The installer detects your runtime (NemoClaw or OpenClaw) and sets ev
18
18
 
19
19
  **Starter** includes 10 agents. **Pro** unlocks 18 more — [sign up at getalice.av3.ai](https://getalice.av3.ai/signup?plan=pro)
20
20
 
21
- An orchestrator (Olivia) backed by specialist agents across every domain:
21
+ **Mission Control Cloud** is available as a Pro add-on. If enabled during install, the package now:
22
+ - installs the `mission-control-bridge` plugin into your OpenClaw home
23
+ - writes a portable local Mission Control config at `~/.openclaw/.alice-mission-control.json`
24
+ - enables the bridge in `openclaw.json` so your runtime can forward live telemetry to Mission Control
25
+
26
+ An orchestrator (A.L.I.C.E., also addressable as Alice or Olivia) backed by specialist agents across every domain:
22
27
 
23
28
  | Agent | Domain | Emoji | Tier |
24
29
  |-------|--------|-------|------|
25
- | **Olivia** | Orchestration | 🧠 | Starter |
30
+ | **A.L.I.C.E.** | Orchestration | 🧠 | Starter |
26
31
  | **Dylan** | Development | 💻 | Starter |
27
32
  | **Selena** | Security | 🛡️ | Starter |
28
33
  | **Devon** | DevOps | 🚀 | Starter |
@@ -77,6 +82,9 @@ npx @robbiesrobotics/alice-agents
77
82
  # Non-interactive with defaults (detected model if available, otherwise Sonnet; Starter tier)
78
83
  npx @robbiesrobotics/alice-agents --yes
79
84
 
85
+ # Non-interactive Pro install with Mission Control Cloud enabled
86
+ npx @robbiesrobotics/alice-agents --cloud --cloud-token YOUR_TOKEN
87
+
80
88
  # Show help
81
89
  npx @robbiesrobotics/alice-agents --help
82
90
  ```
@@ -87,6 +95,19 @@ npx @robbiesrobotics/alice-agents --help
87
95
  - **Merge** — Adds A.L.I.C.E. agents alongside your existing agents
88
96
  - **Upgrade** — Updates product files (SOUL.md, AGENTS.md, etc.) without touching user customizations
89
97
 
98
+ ### Mission Control Cloud
99
+
100
+ If you're a Pro user with the cloud add-on, the installer can configure your local runtime for Mission Control in the same pass.
101
+
102
+ - Interactive install: choose `Pro`, validate your license, then enable the Mission Control Cloud add-on when prompted
103
+ - Non-interactive install: pass `--cloud`
104
+ - Optional flags:
105
+ - `--cloud-token <token>` — access or ingest token for authenticated telemetry
106
+ - `--cloud-dashboard-url <url>` — defaults to `https://alice.av3.ai`
107
+ - `--cloud-ingest-url <url>` — defaults to `<dashboard-url>/api/v1/ingest`
108
+
109
+ The cloud config is stored in `~/.openclaw/.alice-mission-control.json`, and the bundled bridge plugin reads from that file so the setup remains portable across macOS, Linux, and Windows.
110
+
90
111
  ## Upgrade
91
112
 
92
113
  Re-run the installer and choose "Upgrade":
@@ -108,10 +129,10 @@ Removes A.L.I.C.E. agents from `openclaw.json` while preserving any non-ALICE ag
108
129
 
109
130
  ## How It Works
110
131
 
111
- 1. **You talk to Olivia** — she's your single point of contact
112
- 2. **Olivia routes to specialists** — "Build me an API" → Dylan (Development)
132
+ 1. **You talk to A.L.I.C.E.** — she's your single point of contact
133
+ 2. **A.L.I.C.E. routes to specialists** — "Build me an API" → Dylan (Development)
113
134
  3. **Specialists do the work** — using their domain-specific tools and expertise
114
- 4. **Olivia synthesizes** — combines results and presents them to you
135
+ 4. **A.L.I.C.E. synthesizes** — combines results and presents them to you
115
136
 
116
137
  Each agent has its own workspace with:
117
138
  - `SOUL.md` — personality and values
@@ -9,6 +9,12 @@ import { runSkillsManager } from '../lib/skills.mjs';
9
9
  const args = process.argv.slice(2);
10
10
  const flags = new Set(args);
11
11
 
12
+ function getFlagValue(name) {
13
+ const idx = args.indexOf(name);
14
+ if (idx === -1) return undefined;
15
+ return args[idx + 1];
16
+ }
17
+
12
18
  if (flags.has('--version') || flags.has('-v')) {
13
19
  const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url)));
14
20
  console.log(pkg.version);
@@ -26,6 +32,7 @@ if (flags.has('--help') || flags.has('-h')) {
26
32
  npx @robbiesrobotics/alice-agents --uninstall Remove A.L.I.C.E. agents from config
27
33
  npx @robbiesrobotics/alice-agents --doctor Run diagnostics on your A.L.I.C.E. install
28
34
  npx @robbiesrobotics/alice-agents --skills Manage skills (install, remove, browse)
35
+ npx @robbiesrobotics/alice-agents --cloud Enable Mission Control Cloud during install
29
36
  npx @robbiesrobotics/alice-agents --version Show version
30
37
  npx @robbiesrobotics/alice-agents --help Show this help
31
38
 
@@ -34,6 +41,11 @@ if (flags.has('--help') || flags.has('-h')) {
34
41
  --update Non-interactive upgrade (alias for --yes with upgrade mode)
35
42
  --uninstall Remove A.L.I.C.E. agents (preserves non-ALICE agents)
36
43
  --doctor Run diagnostics and check install health
44
+ --cloud Enable Mission Control Cloud setup during install
45
+ --no-cloud Skip Mission Control Cloud setup during install
46
+ --cloud-token <token> Mission Control ingest/access token
47
+ --cloud-dashboard-url <url> Mission Control dashboard URL
48
+ --cloud-ingest-url <url> Mission Control ingest endpoint
37
49
  --version Print package version
38
50
  `);
39
51
  process.exit(0);
@@ -45,7 +57,14 @@ if (flags.has('--doctor')) {
45
57
  process.exit(1);
46
58
  });
47
59
  } else if (flags.has('--update')) {
48
- runInstall({ yes: true, modeOverride: 'upgrade' }).catch((err) => {
60
+ runInstall({
61
+ yes: true,
62
+ modeOverride: 'upgrade',
63
+ cloud: flags.has('--cloud') ? true : flags.has('--no-cloud') ? false : undefined,
64
+ cloudToken: getFlagValue('--cloud-token'),
65
+ cloudDashboardUrl: getFlagValue('--cloud-dashboard-url'),
66
+ cloudIngestUrl: getFlagValue('--cloud-ingest-url'),
67
+ }).catch((err) => {
49
68
  console.error(' ❌ Update failed:', err.message);
50
69
  process.exit(1);
51
70
  });
@@ -60,7 +79,13 @@ if (flags.has('--doctor')) {
60
79
  process.exit(1);
61
80
  });
62
81
  } else {
63
- runInstall({ yes: flags.has('--yes') }).catch((err) => {
82
+ runInstall({
83
+ yes: flags.has('--yes'),
84
+ cloud: flags.has('--cloud') ? true : flags.has('--no-cloud') ? false : undefined,
85
+ cloudToken: getFlagValue('--cloud-token'),
86
+ cloudDashboardUrl: getFlagValue('--cloud-dashboard-url'),
87
+ cloudIngestUrl: getFlagValue('--cloud-ingest-url'),
88
+ }).catch((err) => {
64
89
  console.error(' ❌ Install failed:', err.message);
65
90
  process.exit(1);
66
91
  });
package/lib/installer.mjs CHANGED
@@ -6,6 +6,7 @@ import { homedir } from 'node:os';
6
6
  import { configExists, mergeConfig, removeAliceAgents, detectAvailableModels } from './config-merger.mjs';
7
7
  import { scaffoldAll } from './workspace-scaffolder.mjs';
8
8
  import { readManifest, writeManifest } from './manifest.mjs';
9
+ import { configureMissionControlCloud, getDefaultMissionControlSettings } from './mission-control.mjs';
9
10
  import {
10
11
  promptInstallMode,
11
12
  promptUserInfo,
@@ -13,6 +14,8 @@ import {
13
14
  promptCustomModel,
14
15
  promptTier,
15
16
  promptLicenseKey,
17
+ promptCloudAddon,
18
+ promptMissionControlToken,
16
19
  confirm,
17
20
  choose,
18
21
  input,
@@ -440,6 +443,10 @@ function printBanner() {
440
443
  }
441
444
 
442
445
  function printSummary(mode, tier, agents, preset, userInfo, detectedModels) {
446
+ return printSummaryWithOptions(mode, tier, agents, preset, userInfo, detectedModels, null);
447
+ }
448
+
449
+ function printSummaryWithOptions(mode, tier, agents, preset, userInfo, detectedModels, missionControl) {
443
450
  const modelLabel =
444
451
  preset === 'detected'
445
452
  ? `${detectedModels?.primary || 'your configured model'} ${dim('(detected)')}`
@@ -454,6 +461,13 @@ function printSummary(mode, tier, agents, preset, userInfo, detectedModels) {
454
461
  `${dim('Model:')} ${green(modelLabel)}`,
455
462
  `${dim('User:')} ${green(userInfo.name)}`,
456
463
  `${dim('Timezone:')} ${green(userInfo.timezone)}`,
464
+ `${dim('Mission Control:')} ${green(missionControl?.enabled ? 'cloud enabled' : 'local only')}`,
465
+ ...(missionControl?.enabled
466
+ ? [
467
+ `${dim('Dashboard:')} ${green(missionControl.dashboardUrl)}`,
468
+ `${dim('Ingest:')} ${green(missionControl.ingestUrl)}`,
469
+ ]
470
+ : []),
457
471
  '',
458
472
  `${dim('Agents:')}`,
459
473
  ...agents.map(a => ` ${icons.bullet} ${green(a.emoji)} ${bold(a.name.padEnd(10))} ${dim('─')} ${a.domain}`),
@@ -465,6 +479,7 @@ function printSummary(mode, tier, agents, preset, userInfo, detectedModels) {
465
479
 
466
480
  export async function runInstall(options = {}) {
467
481
  const auto = options.yes || false;
482
+ const manifest = readManifest();
468
483
 
469
484
  // Check health flag first (before banner)
470
485
  if (process.argv.includes('--health')) {
@@ -534,14 +549,12 @@ export async function runInstall(options = {}) {
534
549
  if (options.modeOverride) {
535
550
  mode = options.modeOverride;
536
551
  } else if (auto) {
537
- const manifest = readManifest();
538
552
  mode = manifest ? 'upgrade' : 'fresh';
539
553
  } else {
540
554
  mode = await promptInstallMode();
541
555
  }
542
556
 
543
557
  if (mode === 'upgrade') {
544
- const manifest = readManifest();
545
558
  if (!manifest) {
546
559
  console.log(` ${icons.warn} ${yellow('No previous install found. Switching to fresh install.')}\n`);
547
560
  mode = 'fresh';
@@ -644,10 +657,43 @@ export async function runInstall(options = {}) {
644
657
  }
645
658
  }
646
659
 
660
+ let missionControl = null;
661
+ const existingMissionControl = manifest?.missionControl;
662
+ if (tier === 'pro') {
663
+ const cloudFlag = options.cloud === true ? true : options.cloud === false ? false : null;
664
+ const enableCloud = auto
665
+ ? cloudFlag ?? existingMissionControl?.enabled ?? false
666
+ : cloudFlag ?? await promptCloudAddon();
667
+
668
+ if (enableCloud) {
669
+ const defaults = getDefaultMissionControlSettings();
670
+ const dashboardUrl =
671
+ String(options.cloudDashboardUrl || existingMissionControl?.dashboardUrl || defaults.dashboardUrl).trim();
672
+ const ingestUrl =
673
+ String(options.cloudIngestUrl || existingMissionControl?.ingestUrl || `${dashboardUrl}/api/v1/ingest`).trim();
674
+ const ingestToken =
675
+ auto
676
+ ? String(options.cloudToken || '').trim()
677
+ : String(options.cloudToken || await promptMissionControlToken()).trim();
678
+ const sourceNode =
679
+ String(options.cloudSourceNode || existingMissionControl?.sourceNode || defaults.sourceNode).trim();
680
+
681
+ missionControl = {
682
+ enabled: true,
683
+ provider: 'cloud',
684
+ dashboardUrl,
685
+ ingestUrl,
686
+ sourceNode,
687
+ hasIngestToken: !!ingestToken,
688
+ ingestToken,
689
+ };
690
+ }
691
+ }
692
+
647
693
  const agents = allAgents;
648
694
 
649
695
  // 6. Confirmation
650
- printSummary(mode, tier, agents, preset, userInfo, detectedModels);
696
+ printSummaryWithOptions(mode, tier, agents, preset, userInfo, detectedModels, missionControl);
651
697
 
652
698
  if (!auto) {
653
699
  const ok = await confirm(' Proceed with installation?');
@@ -676,6 +722,16 @@ export async function runInstall(options = {}) {
676
722
  console.log(` ${icons.warn} ${yellow(warning)}`);
677
723
  }
678
724
 
725
+ if (missionControl?.enabled) {
726
+ const missionControlResult = configureMissionControlCloud(missionControl);
727
+ printStepDone('Mission Control cloud', missionControlResult.summary.dashboardUrl);
728
+ if (!missionControlResult.summary.hasIngestToken) {
729
+ printStepSkip('Cloud access token not set', 'bridge installed; add token later to enable authenticated ingest');
730
+ }
731
+ } else {
732
+ printStepSkip('Mission Control cloud', 'not enabled for this install');
733
+ }
734
+
679
735
  // Scaffold workspaces
680
736
  const results = scaffoldAll(agents, userInfo);
681
737
  let newWorkspaces = 0;
@@ -706,6 +762,16 @@ export async function runInstall(options = {}) {
706
762
  userName: userInfo.name,
707
763
  userTimezone: userInfo.timezone,
708
764
  modelPreset: effectivePreset,
765
+ missionControl: missionControl
766
+ ? {
767
+ enabled: true,
768
+ provider: 'cloud',
769
+ dashboardUrl: missionControl.dashboardUrl,
770
+ ingestUrl: missionControl.ingestUrl,
771
+ sourceNode: missionControl.sourceNode,
772
+ bridgeInstalled: true,
773
+ }
774
+ : existing?.missionControl || null,
709
775
  });
710
776
  printStepDone('Manifest written');
711
777
 
package/lib/manifest.mjs CHANGED
@@ -27,6 +27,7 @@ export function writeManifest(data) {
27
27
  userName: data.userName,
28
28
  userTimezone: data.userTimezone,
29
29
  modelPreset: data.modelPreset,
30
+ missionControl: data.missionControl || null,
30
31
  };
31
32
  writeFileSync(getManifestPath(), JSON.stringify(manifest, null, 2) + '\n', 'utf8');
32
33
  return manifest;
@@ -0,0 +1,150 @@
1
+ import { cpSync, existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
2
+ import { homedir, hostname } from 'node:os';
3
+ import { dirname, join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+
6
+ const __dirname = dirname(fileURLToPath(import.meta.url));
7
+ const OPENCLAW_HOME = process.env.OPENCLAW_HOME || join(homedir(), '.openclaw');
8
+ const CONFIG_PATH = join(OPENCLAW_HOME, 'openclaw.json');
9
+ const MC_CONFIG_PATH = join(OPENCLAW_HOME, '.alice-mission-control.json');
10
+ const BRIDGE_ID = 'mission-control-bridge';
11
+ const DEFAULT_DASHBOARD_URL = 'https://alice.av3.ai';
12
+ const DEFAULT_INGEST_URL = `${DEFAULT_DASHBOARD_URL}/api/v1/ingest`;
13
+ const TEMPLATE_DIR = join(__dirname, '..', 'templates', 'mission-control-bridge');
14
+
15
+ function normalizeUrl(url, fallback) {
16
+ const value = String(url || fallback || '').trim();
17
+ if (!value) return '';
18
+ return value.replace(/\/+$/, '');
19
+ }
20
+
21
+ function atomicWriteJSON(targetPath, data) {
22
+ const tmpPath = `${targetPath}.tmp`;
23
+ writeFileSync(tmpPath, JSON.stringify(data, null, 2) + '\n', 'utf8');
24
+ renameSync(tmpPath, targetPath);
25
+ }
26
+
27
+ function readJsonFile(path) {
28
+ try {
29
+ return JSON.parse(readFileSync(path, 'utf8'));
30
+ } catch {
31
+ return null;
32
+ }
33
+ }
34
+
35
+ export function getMissionControlConfigPath() {
36
+ return MC_CONFIG_PATH;
37
+ }
38
+
39
+ export function readMissionControlConfig() {
40
+ return readJsonFile(MC_CONFIG_PATH);
41
+ }
42
+
43
+ export function buildMissionControlSettings(input = {}) {
44
+ const dashboardUrl = normalizeUrl(input.dashboardUrl, DEFAULT_DASHBOARD_URL);
45
+ const ingestUrl = normalizeUrl(input.ingestUrl, `${dashboardUrl}/api/v1/ingest`);
46
+ const sourceNode = String(input.sourceNode || hostname() || 'openclaw-local').trim();
47
+ const ingestToken = String(input.ingestToken || '').trim();
48
+
49
+ return {
50
+ enabled: input.enabled !== false,
51
+ provider: 'cloud',
52
+ dashboardUrl,
53
+ ingestUrl,
54
+ sourceNode,
55
+ ...(ingestToken ? { ingestToken } : {}),
56
+ };
57
+ }
58
+
59
+ export function writeMissionControlConfig(input = {}) {
60
+ mkdirSync(OPENCLAW_HOME, { recursive: true });
61
+
62
+ const existing = readMissionControlConfig();
63
+ const settings = buildMissionControlSettings({
64
+ ...existing?.cloud,
65
+ ...input,
66
+ });
67
+
68
+ const config = {
69
+ version: 1,
70
+ updatedAt: new Date().toISOString(),
71
+ cloud: settings,
72
+ };
73
+
74
+ atomicWriteJSON(MC_CONFIG_PATH, config);
75
+ return { path: MC_CONFIG_PATH, config };
76
+ }
77
+
78
+ function ensureBridgeFiles(targetPath) {
79
+ mkdirSync(dirname(targetPath), { recursive: true });
80
+ cpSync(TEMPLATE_DIR, targetPath, { recursive: true, force: true });
81
+ }
82
+
83
+ export function installMissionControlBridge() {
84
+ const sourcePath = join(OPENCLAW_HOME, 'plugins', BRIDGE_ID);
85
+ const installPath = join(OPENCLAW_HOME, 'extensions', BRIDGE_ID);
86
+
87
+ ensureBridgeFiles(sourcePath);
88
+ ensureBridgeFiles(installPath);
89
+
90
+ return { sourcePath, installPath };
91
+ }
92
+
93
+ export function enableMissionControlBridge() {
94
+ const config = readJsonFile(CONFIG_PATH);
95
+ if (!config) {
96
+ throw new Error('OpenClaw config not found. Run openclaw configure first.');
97
+ }
98
+
99
+ const existingInstall = config?.plugins?.installs?.[BRIDGE_ID] || {};
100
+ const { sourcePath, installPath } = installMissionControlBridge();
101
+ const pkg = readJsonFile(join(TEMPLATE_DIR, 'package.json')) || {};
102
+
103
+ config.plugins = config.plugins || {};
104
+ config.plugins.entries = config.plugins.entries || {};
105
+ config.plugins.installs = config.plugins.installs || {};
106
+
107
+ config.plugins.entries[BRIDGE_ID] = {
108
+ ...(config.plugins.entries[BRIDGE_ID] || {}),
109
+ enabled: true,
110
+ };
111
+
112
+ config.plugins.installs[BRIDGE_ID] = {
113
+ source: 'path',
114
+ sourcePath,
115
+ installPath,
116
+ version: pkg.version || existingInstall.version || '1.0.0',
117
+ installedAt: existingInstall.installedAt || new Date().toISOString(),
118
+ };
119
+
120
+ atomicWriteJSON(CONFIG_PATH, config);
121
+ return { configPath: CONFIG_PATH, sourcePath, installPath };
122
+ }
123
+
124
+ export function configureMissionControlCloud(input = {}) {
125
+ const configResult = writeMissionControlConfig(input);
126
+ const bridgeResult = enableMissionControlBridge();
127
+ const settings = configResult.config.cloud;
128
+
129
+ return {
130
+ configPath: configResult.path,
131
+ bridgeSourcePath: bridgeResult.sourcePath,
132
+ bridgeInstallPath: bridgeResult.installPath,
133
+ summary: {
134
+ enabled: settings.enabled,
135
+ provider: settings.provider,
136
+ dashboardUrl: settings.dashboardUrl,
137
+ ingestUrl: settings.ingestUrl,
138
+ sourceNode: settings.sourceNode,
139
+ hasIngestToken: !!settings.ingestToken,
140
+ },
141
+ };
142
+ }
143
+
144
+ export function getDefaultMissionControlSettings() {
145
+ return buildMissionControlSettings();
146
+ }
147
+
148
+ export function hasMissionControlBridgeInstalled() {
149
+ return existsSync(join(OPENCLAW_HOME, 'extensions', BRIDGE_ID));
150
+ }
package/lib/prompter.mjs CHANGED
@@ -125,3 +125,19 @@ export async function promptLicenseKey() {
125
125
  });
126
126
  });
127
127
  }
128
+
129
+ export async function promptCloudAddon() {
130
+ console.log('');
131
+ console.log(' Mission Control Cloud add-on');
132
+ console.log(' Hosted dashboard, telemetry sync, and cloud memory for Pro users.');
133
+ console.log('');
134
+ return confirm(' Enable the Mission Control Cloud add-on on this machine?', true);
135
+ }
136
+
137
+ export async function promptMissionControlToken() {
138
+ console.log('');
139
+ console.log(' Enter your Mission Control cloud access token if you have one.');
140
+ console.log(' Press Enter to skip for now — you can add it later without reinstalling.');
141
+ console.log('');
142
+ return input(' Mission Control access token', '');
143
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@robbiesrobotics/alice-agents",
3
- "version": "1.4.2",
3
+ "version": "1.4.4",
4
4
  "description": "A.L.I.C.E. — 28 AI agents for OpenClaw. One conversation, one team.",
5
5
  "bin": {
6
6
  "alice-agents": "bin/alice-install.mjs"
@@ -23,6 +23,7 @@
23
23
  "tools/",
24
24
  "snapshots/",
25
25
  "templates/agents-starter.json",
26
+ "templates/mission-control-bridge/",
26
27
  "templates/skills/",
27
28
  "templates/workspaces/",
28
29
  "SELF-HEALING-SPEC.md",
@@ -1,11 +1,11 @@
1
1
  [
2
2
  {
3
3
  "id": "olivia",
4
- "name": "Olivia",
4
+ "name": "A.L.I.C.E.",
5
5
  "domain": "Orchestration",
6
6
  "theme": "orchestrator of a 28-agent team",
7
7
  "emoji": "\ud83e\udde0",
8
- "description": "Routes tasks, coordinates specialists, manages conversations",
8
+ "description": "Routes tasks, coordinates specialists, manages conversations as A.L.I.C.E. (also responds to Alice)",
9
9
  "tier": "starter",
10
10
  "coding": false,
11
11
  "isOrchestrator": true,
@@ -34,10 +34,12 @@
34
34
  "default": true,
35
35
  "groupChat": {
36
36
  "mentionPatterns": [
37
- "@olivia",
38
37
  "@alice",
39
- "olivia",
40
- "alice"
38
+ "@a.l.i.c.e.",
39
+ "@olivia",
40
+ "alice",
41
+ "a.l.i.c.e.",
42
+ "olivia"
41
43
  ]
42
44
  },
43
45
  "subagents": {
@@ -284,4 +286,4 @@
284
286
  ]
285
287
  }
286
288
  }
287
- ]
289
+ ]
@@ -0,0 +1,233 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import type { OpenClawPluginApi } from "openclaw/plugin-sdk/diagnostics-otel";
5
+ import { emptyPluginConfigSchema, onDiagnosticEvent } from "openclaw/plugin-sdk/diagnostics-otel";
6
+ import type { DiagnosticEventPayload } from "openclaw/plugin-sdk/diagnostics-otel";
7
+
8
+ const OPENCLAW_HOME = process.env.OPENCLAW_HOME ?? join(homedir(), ".openclaw");
9
+ const MC_CONFIG_PATH = join(OPENCLAW_HOME, ".alice-mission-control.json");
10
+ const DEFAULT_INGEST_URL = "https://alice.av3.ai/api/v1/ingest";
11
+
12
+ function readMissionControlConfig(): Record<string, unknown> {
13
+ try {
14
+ if (!existsSync(MC_CONFIG_PATH)) return {};
15
+ return JSON.parse(readFileSync(MC_CONFIG_PATH, "utf8"));
16
+ } catch {
17
+ return {};
18
+ }
19
+ }
20
+
21
+ function getCloudConfig(): Record<string, unknown> {
22
+ const fileConfig = readMissionControlConfig();
23
+ return typeof fileConfig.cloud === "object" && fileConfig.cloud ? fileConfig.cloud as Record<string, unknown> : {};
24
+ }
25
+
26
+ function getString(value: unknown, fallback = ""): string {
27
+ return typeof value === "string" && value.trim() ? value.trim() : fallback;
28
+ }
29
+
30
+ const cloudConfig = getCloudConfig();
31
+ const INGEST_URL = getString(process.env.MC_INGEST_URL, getString(cloudConfig.ingestUrl, DEFAULT_INGEST_URL));
32
+ const INGEST_TOKEN = getString(process.env.MC_INGEST_TOKEN, getString(cloudConfig.ingestToken));
33
+ const SOURCE_NODE = getString(process.env.MC_SOURCE_NODE, getString(cloudConfig.sourceNode, "openclaw-local"));
34
+
35
+ function now(): string {
36
+ return new Date().toISOString();
37
+ }
38
+
39
+ function sessionKeyToAgentId(sessionKey?: string): string {
40
+ if (!sessionKey) return "unknown";
41
+ const parts = sessionKey.split(":");
42
+ return parts[1] ?? parts[0] ?? "unknown";
43
+ }
44
+
45
+ let seq = 0;
46
+ function nextEventId(): string {
47
+ return `mc-bridge-${Date.now()}-${++seq}`;
48
+ }
49
+
50
+ async function postToIngest(events: object[]): Promise<void> {
51
+ const headers: Record<string, string> = {
52
+ "Content-Type": "application/json",
53
+ };
54
+ if (INGEST_TOKEN) {
55
+ headers["Authorization"] = `Bearer ${INGEST_TOKEN}`;
56
+ }
57
+
58
+ try {
59
+ const res = await fetch(INGEST_URL, {
60
+ method: "POST",
61
+ headers,
62
+ body: JSON.stringify(events),
63
+ signal: AbortSignal.timeout(8000),
64
+ });
65
+ if (!res.ok) {
66
+ console.warn(`[mc-bridge] ingest HTTP ${res.status} — ${await res.text().catch(() => "")}`);
67
+ }
68
+ } catch (err) {
69
+ console.warn(`[mc-bridge] ingest post failed: ${String(err)}`);
70
+ }
71
+ }
72
+
73
+ function handleModelUsage(evt: Extract<DiagnosticEventPayload, { type: "model.usage" }>) {
74
+ const agentId = sessionKeyToAgentId(evt.sessionKey);
75
+ const totalTokens = evt.usage.total ?? (evt.usage.input ?? 0) + (evt.usage.output ?? 0);
76
+
77
+ const event = {
78
+ event_id: nextEventId(),
79
+ event_type: "agent.session.completed",
80
+ event_version: "1.0",
81
+ source_system: "openclaw",
82
+ source_node: SOURCE_NODE,
83
+ occurred_at: now(),
84
+ actor_id: agentId,
85
+ actor_type: "agent",
86
+ correlation_id: evt.sessionId ?? null,
87
+ payload: {
88
+ session_id: evt.sessionId ?? evt.sessionKey ?? nextEventId(),
89
+ agent_id: agentId,
90
+ model: evt.model ?? "unknown",
91
+ channel: evt.channel ?? "unknown",
92
+ total_tokens: totalTokens,
93
+ input_tokens: evt.usage.input ?? 0,
94
+ output_tokens: evt.usage.output ?? 0,
95
+ cache_read_tokens: evt.usage.cacheRead ?? 0,
96
+ cache_write_tokens: evt.usage.cacheWrite ?? 0,
97
+ cost_usd: evt.costUsd ?? 0,
98
+ duration_ms: evt.durationMs ?? 0,
99
+ context_limit: evt.context?.limit ?? 0,
100
+ context_used: evt.context?.used ?? 0,
101
+ status: "completed",
102
+ },
103
+ };
104
+
105
+ postToIngest([event]);
106
+ }
107
+
108
+ function handleMessageProcessed(evt: Extract<DiagnosticEventPayload, { type: "message.processed" }>) {
109
+ if (!evt.sessionKey && !evt.sessionId) return;
110
+ const agentId = sessionKeyToAgentId(evt.sessionKey);
111
+ const eventType =
112
+ evt.outcome === "completed"
113
+ ? "agent.session.completed"
114
+ : evt.outcome === "error"
115
+ ? "agent.session.completed"
116
+ : null;
117
+
118
+ if (!eventType) return;
119
+
120
+ const event = {
121
+ event_id: nextEventId(),
122
+ event_type: eventType,
123
+ event_version: "1.0",
124
+ source_system: "openclaw",
125
+ source_node: SOURCE_NODE,
126
+ occurred_at: now(),
127
+ actor_id: agentId,
128
+ actor_type: "agent",
129
+ correlation_id: evt.sessionId ?? null,
130
+ payload: {
131
+ session_id: evt.sessionId ?? evt.sessionKey ?? nextEventId(),
132
+ agent_id: agentId,
133
+ channel: evt.channel ?? "unknown",
134
+ status: evt.outcome === "error" ? "failed" : "completed",
135
+ duration_ms: evt.durationMs ?? 0,
136
+ ...(evt.error ? { error: evt.error } : {}),
137
+ },
138
+ };
139
+
140
+ postToIngest([event]);
141
+ }
142
+
143
+ function handleSessionState(evt: Extract<DiagnosticEventPayload, { type: "session.state" }>) {
144
+ if (!evt.sessionKey && !evt.sessionId) return;
145
+ const agentId = sessionKeyToAgentId(evt.sessionKey);
146
+ const stateToEventType: Record<string, string> = {
147
+ processing: "agent.session.started",
148
+ idle: "agent.session.completed",
149
+ };
150
+ const eventType = stateToEventType[evt.state];
151
+ if (!eventType) return;
152
+
153
+ const event = {
154
+ event_id: nextEventId(),
155
+ event_type: eventType,
156
+ event_version: "1.0",
157
+ source_system: "openclaw",
158
+ source_node: SOURCE_NODE,
159
+ occurred_at: now(),
160
+ actor_id: agentId,
161
+ actor_type: "agent",
162
+ correlation_id: evt.sessionId ?? null,
163
+ payload: {
164
+ session_id: evt.sessionId ?? evt.sessionKey ?? nextEventId(),
165
+ agent_id: agentId,
166
+ state: evt.state,
167
+ prev_state: evt.prevState ?? null,
168
+ },
169
+ };
170
+
171
+ postToIngest([event]);
172
+ }
173
+
174
+ const plugin = {
175
+ id: "mission-control-bridge",
176
+ name: "Mission Control Bridge",
177
+ description: "Forwards OpenClaw diagnostic events to the A.L.I.C.E. Mission Control ingest endpoint",
178
+ configSchema: emptyPluginConfigSchema(),
179
+
180
+ register(api: OpenClawPluginApi) {
181
+ api.registerService({
182
+ id: "mission-control-bridge",
183
+
184
+ async start(ctx) {
185
+ ctx.logger.info(`[mc-bridge] starting — ingest URL: ${INGEST_URL}`);
186
+
187
+ const unsubscribe = onDiagnosticEvent((evt: DiagnosticEventPayload) => {
188
+ try {
189
+ switch (evt.type) {
190
+ case "model.usage":
191
+ handleModelUsage(evt);
192
+ break;
193
+ case "message.processed":
194
+ handleMessageProcessed(evt);
195
+ break;
196
+ case "session.state":
197
+ handleSessionState(evt);
198
+ break;
199
+ }
200
+ } catch (err) {
201
+ ctx.logger.warn(`[mc-bridge] event handler error (${evt.type}): ${String(err)}`);
202
+ }
203
+ });
204
+
205
+ (this as { _unsub?: () => void })._unsub = unsubscribe;
206
+
207
+ await postToIngest([
208
+ {
209
+ event_id: nextEventId(),
210
+ event_type: "node.registered",
211
+ event_version: "1.0",
212
+ source_system: "openclaw",
213
+ source_node: SOURCE_NODE,
214
+ occurred_at: now(),
215
+ payload: {
216
+ node_name: SOURCE_NODE,
217
+ platform: process.platform,
218
+ node_version: process.version,
219
+ },
220
+ },
221
+ ]);
222
+ },
223
+
224
+ async stop() {
225
+ const self = this as { _unsub?: () => void };
226
+ self._unsub?.();
227
+ self._unsub = undefined;
228
+ },
229
+ });
230
+ },
231
+ };
232
+
233
+ export default plugin;
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "mission-control-bridge",
3
+ "configSchema": {
4
+ "type": "object",
5
+ "additionalProperties": false,
6
+ "properties": {}
7
+ }
8
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "@alice/mission-control-bridge",
3
+ "version": "1.0.0",
4
+ "description": "Bridges OpenClaw diagnostic events to Mission Control ingest endpoint",
5
+ "type": "module",
6
+ "openclaw": {
7
+ "extensions": [
8
+ "./index.ts"
9
+ ]
10
+ }
11
+ }
@@ -93,7 +93,7 @@ exec:
93
93
  2. **One task per invocation** — don't chain unrelated work in one prompt
94
94
  3. **Always verify** — ask Claude Code to run the build/tests before finishing
95
95
  4. **Background for >5min tasks** — use background:true and the notification line
96
- 5. **Report results** — after Claude Code finishes, summarize what changed to Olivia
96
+ 5. **Report results** — after Claude Code finishes, summarize what changed to A.L.I.C.E.
97
97
  6. **Never run in ~/.openclaw/ itself** — always in a project subdirectory
98
98
 
99
99
  ## Agents authorized to use this skill
@@ -108,4 +108,4 @@ exec:
108
108
  command: which claude && claude --version
109
109
  ```
110
110
 
111
- If not found, tell Olivia — she'll handle escalation.
111
+ If not found, tell A.L.I.C.E. — she'll handle escalation.
@@ -15,7 +15,7 @@ You are **{{agentName}}**, the **{{agentDomain}}** specialist. {{agentDescriptio
15
15
 
16
16
  ## How You Work
17
17
 
18
- - You receive tasks from Olivia (the orchestrator) via sessions_spawn
18
+ - You receive tasks from A.L.I.C.E. (the orchestrator, also called Alice) via sessions_spawn
19
19
  - **For coding tasks, use the `claude_code` skill** — it runs Claude Code CLI autonomously with full file editing, terminal, and search capabilities
20
20
  - Use `claude_code` for: writing code, debugging, refactoring, multi-file changes, test creation
21
21
  - Use regular tools (`exec`, `read`, `edit`) for: quick checks, simple reads, running test suites
@@ -11,6 +11,7 @@
11
11
  ## Your Role
12
12
 
13
13
  You are **{{agentName}}**, the **orchestrator** of the A.L.I.C.E. team. You coordinate {{agentCount}} specialist agents to deliver results for {{userName}}.
14
+ When users address you, they may say **A.L.I.C.E.**, **Alice**, or **Olivia**. In user-facing responses, identify yourself as **A.L.I.C.E.**
14
15
 
15
16
  ## Your Team
16
17
 
@@ -68,9 +69,9 @@ Before spawning Claude Code directly or writing implementation code yourself:
68
69
  2. Morgan provides product positioning and copy direction
69
70
  3. Felix implements using Claude Code with Nadia's spec as the brief
70
71
  4. Quinn does a visual/functional QA pass
71
- 5. Olivia synthesizes and presents to Rob
72
+ 5. A.L.I.C.E. synthesizes and presents to Rob
72
73
 
73
- **Wrong:** Olivia spawns Claude Code directly for UI without involving Nadia or Felix
74
- **Right:** Nadia → Felix → Claude Code → Quinn → Olivia
74
+ **Wrong:** A.L.I.C.E. spawns Claude Code directly for UI without involving Nadia or Felix
75
+ **Right:** Nadia → Felix → Claude Code → Quinn → A.L.I.C.E.
75
76
 
76
77
  This applies to every non-trivial request. Always ask: "who on the team owns this domain?"
@@ -15,7 +15,7 @@ You are **{{agentName}}**, the **{{agentDomain}}** specialist. {{agentDescriptio
15
15
 
16
16
  ## How You Work
17
17
 
18
- - You receive tasks from Olivia (the orchestrator) via sessions_spawn
18
+ - You receive tasks from A.L.I.C.E. (the orchestrator, also called Alice) via sessions_spawn
19
19
  - Do your work using your available tools
20
20
  - Return clear, structured results
21
21
  - If you need another specialist's help, say so explicitly (e.g., "This also needs Dylan for implementation")
@@ -10,7 +10,7 @@ _You are {{agentName}}, part of the A.L.I.C.E. multi-agent team._
10
10
 
11
11
  **Be resourceful.** Use your tools — read files, run commands, search the web. Come back with results, not questions.
12
12
 
13
- **Quality over speed.** {{userName}} (through Olivia) asked you for domain expertise. Deliver it.
13
+ **Quality over speed.** {{userName}} (through A.L.I.C.E.) asked you for domain expertise. Deliver it.
14
14
 
15
15
  ## Values
16
16
 
@@ -21,7 +21,7 @@ _You are {{agentName}}, part of the A.L.I.C.E. multi-agent team._
21
21
 
22
22
  ## Boundaries
23
23
 
24
- - You do NOT talk to {{userName}} directly — Olivia handles that
24
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
25
25
  - Stay within your {{agentDomain}} domain
26
26
  - If you need another specialist's input, say so in your response
27
27
  - Don't claim certainty without evidence
@@ -1,6 +1,6 @@
1
1
  # SOUL.md - {{agentName}}, Orchestrator
2
2
 
3
- _You are {{agentName}}, the brain of the A.L.I.C.E. multi-agent team._
3
+ _You are {{agentName}}, the brain of the A.L.I.C.E. multi-agent team. Users may also call you Alice._
4
4
 
5
5
  ## Core Truths
6
6
 
@@ -25,6 +25,8 @@ _You are {{agentName}}, the brain of the A.L.I.C.E. multi-agent team._
25
25
  - Don't do specialist work yourself — delegate it
26
26
  - If no specialist fits, say so honestly
27
27
  - Don't claim certainty without evidence
28
+ - When speaking to {{userName}}, sign your name as **A.L.I.C.E.**
29
+ - Treat **Alice**, **A.L.I.C.E.**, and **Olivia** as valid ways users may address you
28
30
 
29
31
  ## Vibe
30
32
 
@@ -10,7 +10,7 @@ _You are {{agentName}}, part of the A.L.I.C.E. multi-agent team._
10
10
 
11
11
  **Be resourceful.** Use your tools — read files, run commands, search the web. Come back with results, not questions.
12
12
 
13
- **Quality over speed.** {{userName}} (through Olivia) asked you for domain expertise. Deliver it.
13
+ **Quality over speed.** {{userName}} (through A.L.I.C.E.) asked you for domain expertise. Deliver it.
14
14
 
15
15
  ## Values
16
16
 
@@ -21,7 +21,7 @@ _You are {{agentName}}, part of the A.L.I.C.E. multi-agent team._
21
21
 
22
22
  ## Boundaries
23
23
 
24
- - You do NOT talk to {{userName}} directly — Olivia handles that
24
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
25
25
  - Stay within your {{agentDomain}} domain
26
26
  - If you need another specialist's input, say so in your response
27
27
  - Don't claim certainty without evidence
@@ -23,7 +23,7 @@ _You are Aiden, part of the A.L.I.C.E. multi-agent team._
23
23
 
24
24
  ## Boundaries
25
25
 
26
- - You do NOT talk to {{userName}} directly — Olivia handles that
26
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
27
27
  - Raw data pipelines and schema questions go to Darius
28
28
  - Financial reporting and P&L analysis goes through Audrey
29
29
  - Project metrics and delivery reporting goes to Parker
@@ -23,7 +23,7 @@ _You are Alex, part of the A.L.I.C.E. multi-agent team._
23
23
 
24
24
  ## Boundaries
25
25
 
26
- - You do NOT talk to {{userName}} directly — Olivia handles that
26
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
27
27
  - Downstream data pipeline ingestion goes to Darius
28
28
  - Complex integration architectures involving multiple APIs go to Isaac
29
29
  - Research use of scraped data feeds through Rowan
@@ -23,7 +23,7 @@ _You are Audrey, part of the A.L.I.C.E. multi-agent team._
23
23
 
24
24
  ## Boundaries
25
25
 
26
- - You do NOT talk to {{userName}} directly — Olivia handles that
26
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
27
27
  - Legal and regulatory compliance questions go to Logan
28
28
  - Operational spend decisions go through Owen
29
29
  - Budget allocation for projects involves Elena for scope alignment
@@ -23,7 +23,7 @@ _You are Avery, part of the A.L.I.C.E. multi-agent team._
23
23
 
24
24
  ## Boundaries
25
25
 
26
- - You do NOT talk to {{userName}} directly — Olivia handles that
26
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
27
27
  - Infrastructure-level automation goes through Devon
28
28
  - API integration design goes to Isaac
29
29
  - Operational process design (beyond automation) goes to Owen
@@ -23,7 +23,7 @@ _You are Caleb, part of the A.L.I.C.E. multi-agent team._
23
23
 
24
24
  ## Boundaries
25
25
 
26
- - You do NOT talk to {{userName}} directly — Olivia handles that
26
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
27
27
  - Sales pipeline strategy and deal management goes to Sloane
28
28
  - Customer support record handling goes through Sophie
29
29
  - Revenue analytics built on CRM data goes to Aiden
@@ -23,7 +23,7 @@ _You are Clara, part of the A.L.I.C.E. multi-agent team._
23
23
 
24
24
  ## Boundaries
25
25
 
26
- - You do NOT talk to {{userName}} directly — Olivia handles that
26
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
27
27
  - Marketing campaign strategy and channel distribution goes to Morgan
28
28
  - Executive scheduling and briefing materials go to Eva
29
29
  - Technical content accuracy gets reviewed by Daphne
@@ -23,7 +23,7 @@ _You are Daphne, part of the A.L.I.C.E. multi-agent team._
23
23
 
24
24
  ## Boundaries
25
25
 
26
- - You do NOT talk to {{userName}} directly — Olivia handles that
26
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
27
27
  - Technical accuracy of code samples goes through Dylan for review
28
28
  - Research for background content on unfamiliar topics goes to Rowan
29
29
  - Project-level documentation organization aligns with Parker
@@ -23,7 +23,7 @@ _You are Darius, part of the A.L.I.C.E. multi-agent team._
23
23
 
24
24
  ## Boundaries
25
25
 
26
- - You do NOT talk to {{userName}} directly — Olivia handles that
26
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
27
27
  - Business interpretation of data goes to Aiden — you provide clean data, they provide insight
28
28
  - Financial data analysis aligns with Audrey
29
29
  - Research data needs feed through Rowan
@@ -23,7 +23,7 @@ _You are Devon, part of the A.L.I.C.E. multi-agent team._
23
23
 
24
24
  ## Boundaries
25
25
 
26
- - You do NOT talk to {{userName}} directly — Olivia handles that
26
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
27
27
  - Security posture of infrastructure gets Selena's review
28
28
  - Code changes required for infra integration go through Dylan
29
29
  - Automation of business processes goes to Avery — you do technical infra automation
@@ -23,7 +23,7 @@ _You are Dylan, part of the A.L.I.C.E. multi-agent team._
23
23
 
24
24
  ## Boundaries
25
25
 
26
- - You do NOT talk to {{userName}} directly — Olivia handles that
26
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
27
27
  - When a task needs security review, flag it for Selena
28
28
  - When a task needs deployment, flag it for Devon
29
29
  - When a task needs testing, flag it for Quinn
@@ -20,7 +20,7 @@ exec workdir=/path/to/project background=true command="claude --permission-mode
20
20
 
21
21
  - Always set `workdir` to the project root
22
22
  - Use `max` effort for complex multi-file refactors
23
- - Review Claude Code's output before reporting to Olivia
23
+ - Review Claude Code's output before reporting to A.L.I.C.E.
24
24
 
25
25
  ## Other Tools
26
26
 
@@ -23,7 +23,7 @@ _You are Elena, part of the A.L.I.C.E. multi-agent team._
23
23
 
24
24
  ## Boundaries
25
25
 
26
- - You do NOT talk to {{userName}} directly — Olivia handles that
26
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
27
27
  - Technical implementation details that affect estimates go through Dylan
28
28
  - Budget implications of estimates go to Audrey
29
29
  - Project execution and delivery management goes to Parker
@@ -23,7 +23,7 @@ _You are Eva, part of the A.L.I.C.E. multi-agent team._
23
23
 
24
24
  ## Boundaries
25
25
 
26
- - You do NOT talk to {{userName}} directly — Olivia handles that
26
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
27
27
  - Travel logistics for executive trips go to Tommy
28
28
  - Operational process design goes to Owen
29
29
  - External communications go through Clara
@@ -23,7 +23,7 @@ _You are Felix, part of the A.L.I.C.E. multi-agent team._
23
23
 
24
24
  ## Boundaries
25
25
 
26
- - You do NOT talk to {{userName}} directly — Olivia handles that
26
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
27
27
  - Design questions and spec ambiguity go to Nadia
28
28
  - Backend API contracts go through Dylan
29
29
  - UI test coverage coordination with Quinn
@@ -23,7 +23,7 @@ _You are Hannah, part of the A.L.I.C.E. multi-agent team._
23
23
 
24
24
  ## Boundaries
25
25
 
26
- - You do NOT talk to {{userName}} directly — Olivia handles that
26
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
27
27
  - Legal questions about employment law and compliance go to Logan
28
28
  - Executive scheduling and coordination goes to Eva
29
29
  - Internal communications go through Clara
@@ -23,7 +23,7 @@ _You are Isaac, part of the A.L.I.C.E. multi-agent team._
23
23
 
24
24
  ## Boundaries
25
25
 
26
- - You do NOT talk to {{userName}} directly — Olivia handles that
26
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
27
27
  - Web scraping and data extraction at scale goes to Alex
28
28
  - Automation logic built on top of integrations goes to Avery
29
29
  - Custom backend services for integrations go through Dylan
@@ -23,7 +23,7 @@ _You are Logan, part of the A.L.I.C.E. multi-agent team._
23
23
 
24
24
  ## Boundaries
25
25
 
26
- - You do NOT talk to {{userName}} directly — Olivia handles that
26
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
27
27
  - Financial compliance and audit questions go through Audrey
28
28
  - HR policy and employment matters involve Hannah
29
29
  - Security and data protection implementation goes to Selena
@@ -23,7 +23,7 @@ _You are Morgan, part of the A.L.I.C.E. multi-agent team._
23
23
 
24
24
  ## Boundaries
25
25
 
26
- - You do NOT talk to {{userName}} directly — Olivia handles that
26
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
27
27
  - Content writing and editing goes through Clara for voice consistency
28
28
  - Sales pipeline alignment and outreach goes to Sloane
29
29
  - Campaign performance analytics goes through Aiden
@@ -23,7 +23,7 @@ _You are Nadia, part of the A.L.I.C.E. multi-agent team._
23
23
 
24
24
  ## Boundaries
25
25
 
26
- - You do NOT talk to {{userName}} directly — Olivia handles that
26
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
27
27
  - Implementation fidelity and frontend execution goes to Felix
28
28
  - User research and insight validation goes through Uma
29
29
  - Marketing design and brand expression aligns with Morgan
@@ -1,10 +1,10 @@
1
- # SOUL.md - Olivia, Chief Orchestration Officer
1
+ # SOUL.md - A.L.I.C.E., Chief Orchestration Officer
2
2
 
3
- _You are Olivia, the brain of the A.L.I.C.E. multi-agent team._
3
+ _You are A.L.I.C.E., the brain of the A.L.I.C.E. multi-agent team. Users may also call you Alice._
4
4
 
5
5
  ## Core Truths
6
6
 
7
- **You are Olivia, orchestrator of a {{agentCount}}-agent team.** You route tasks to the right specialist, synthesize their work, and present results to {{userName}}.
7
+ **You are A.L.I.C.E., orchestrator of a {{agentCount}}-agent team.** You route tasks to the right specialist, synthesize their work, and present results to {{userName}}.
8
8
 
9
9
  **You don't do the work yourself — you coordinate.** Your job is to understand the request, break it into specialist-sized tasks, dispatch them, and synthesize the results into something coherent and useful.
10
10
 
@@ -28,6 +28,8 @@ _You are Olivia, the brain of the A.L.I.C.E. multi-agent team._
28
28
  - Don't do specialist work yourself — delegate it
29
29
  - If no specialist fits, say so honestly and ask a targeted clarifying question
30
30
  - Don't claim certainty without evidence
31
+ - When speaking to {{userName}}, introduce or sign off as **A.L.I.C.E.**
32
+ - Treat **Alice**, **A.L.I.C.E.**, and **Olivia** as valid ways users may address you
31
33
 
32
34
  ## Vibe
33
35
 
@@ -23,7 +23,7 @@ _You are Owen, part of the A.L.I.C.E. multi-agent team._
23
23
 
24
24
  ## Boundaries
25
25
 
26
- - You do NOT talk to {{userName}} directly — Olivia handles that
26
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
27
27
  - Technical automation of processes goes to Avery
28
28
  - Tool procurement with technical requirements involves Devon
29
29
  - Financial controls and cost tracking goes to Audrey
@@ -23,7 +23,7 @@ _You are Parker, part of the A.L.I.C.E. multi-agent team._
23
23
 
24
24
  ## Boundaries
25
25
 
26
- - You do NOT talk to {{userName}} directly — Olivia handles that
26
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
27
27
  - Technical estimation and scoping goes to Elena
28
28
  - Operational process design goes to Owen
29
29
  - Financial tracking of project budgets goes to Audrey
@@ -23,7 +23,7 @@ _You are Quinn, part of the A.L.I.C.E. multi-agent team._
23
23
 
24
24
  ## Boundaries
25
25
 
26
- - You do NOT talk to {{userName}} directly — Olivia handles that
26
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
27
27
  - Bug fixes go to Dylan — you verify them, not implement them
28
28
  - UI-specific bugs may need Felix for reproduction and fix
29
29
  - Pipeline failures affecting test execution go to Devon
@@ -23,7 +23,7 @@ _You are Rowan, part of the A.L.I.C.E. multi-agent team._
23
23
 
24
24
  ## Boundaries
25
25
 
26
- - You do NOT talk to {{userName}} directly — Olivia handles that
26
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
27
27
  - Data analysis of large structured datasets goes to Darius
28
28
  - Market research with commercial strategy implications aligns with Morgan
29
29
  - Write-up of research into formal documents goes through Daphne
@@ -23,7 +23,7 @@ _You are Selena, part of the A.L.I.C.E. multi-agent team._
23
23
 
24
24
  ## Boundaries
25
25
 
26
- - You do NOT talk to {{userName}} directly — Olivia handles that
26
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
27
27
  - Security fixes that touch code go to Dylan for implementation — you specify, they build
28
28
  - Infrastructure hardening involves Devon — collaborate, don't override
29
29
  - Compliance questions that go beyond security posture involve Logan
@@ -23,7 +23,7 @@ _You are Sloane, part of the A.L.I.C.E. multi-agent team._
23
23
 
24
24
  ## Boundaries
25
25
 
26
- - You do NOT talk to {{userName}} directly — Olivia handles that
26
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
27
27
  - CRM data, pipeline hygiene, and record management goes to Caleb
28
28
  - Outreach copy and messaging alignment goes through Clara
29
29
  - Market positioning and campaign support aligns with Morgan
@@ -23,7 +23,7 @@ _You are Sophie, part of the A.L.I.C.E. multi-agent team._
23
23
 
24
24
  ## Boundaries
25
25
 
26
- - You do NOT talk to {{userName}} directly — Olivia handles that
26
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
27
27
  - Technical bugs go to Dylan for investigation — you triage and document, not diagnose
28
28
  - Documentation gaps go to Daphne — surface them with specifics
29
29
  - CRM record updates and customer lifecycle management go to Caleb
@@ -23,7 +23,7 @@ _You are Tommy, part of the A.L.I.C.E. multi-agent team._
23
23
 
24
24
  ## Boundaries
25
25
 
26
- - You do NOT talk to {{userName}} directly — Olivia handles that
26
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
27
27
  - Expense reconciliation and tracking goes to Audrey
28
28
  - Executive calendar coordination goes to Eva
29
29
  - Operational logistics beyond travel go to Owen
@@ -23,7 +23,7 @@ _You are Uma, part of the A.L.I.C.E. multi-agent team._
23
23
 
24
24
  ## Boundaries
25
25
 
26
- - You do NOT talk to {{userName}} directly — Olivia handles that
26
+ - You do NOT talk to {{userName}} directly — A.L.I.C.E. handles that
27
27
  - Design decisions based on research go to Nadia for implementation
28
28
  - Quantitative behavioral data analysis goes to Aiden
29
29
  - Positioning research that informs marketing goes through Morgan