neoagent 2.2.1-beta.6 → 2.2.1-beta.8

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 (68) hide show
  1. package/docs/automation.md +2 -2
  2. package/docs/capabilities.md +7 -10
  3. package/docs/hardware.md +4 -7
  4. package/docs/index.md +7 -7
  5. package/docs/integrations.md +1 -1
  6. package/docs/migration.md +238 -0
  7. package/docs/operations.md +1 -1
  8. package/docs/why-neoagent.md +2 -2
  9. package/lib/manager.js +99 -2
  10. package/lib/migrations.js +409 -0
  11. package/package.json +1 -1
  12. package/server/catalog_sources/store-bundles/skills/productivity/migration/SKILL.md +173 -0
  13. package/server/db/database.js +76 -61
  14. package/server/http/routes.js +1 -2
  15. package/server/public/assets/AssetManifest.json +1 -1
  16. package/server/public/assets/fonts/MaterialIcons-Regular.otf +0 -0
  17. package/server/public/flutter_bootstrap.js +1 -1
  18. package/server/public/main.dart.js +75830 -74189
  19. package/server/routes/auth.js +13 -5
  20. package/server/routes/integrations.js +22 -0
  21. package/server/routes/messaging.js +41 -5
  22. package/server/routes/settings.js +1 -0
  23. package/server/routes/{scheduler.js → tasks.js} +31 -29
  24. package/server/routes/widgets.js +7 -7
  25. package/server/services/ai/capabilityHealth.js +4 -4
  26. package/server/services/ai/engine.js +9 -9
  27. package/server/services/ai/systemPrompt.js +7 -7
  28. package/server/services/ai/taskAnalysis.js +3 -3
  29. package/server/services/ai/toolResult.js +6 -8
  30. package/server/services/ai/tools.js +62 -95
  31. package/server/services/commands/router.js +14 -6
  32. package/server/services/integrations/google/provider.js +20 -2
  33. package/server/services/integrations/manager.js +79 -8
  34. package/server/services/integrations/whatsapp/provider.js +23 -1
  35. package/server/services/manager.js +14 -14
  36. package/server/services/memory/manager.js +7 -7
  37. package/server/services/memory/policy.js +1 -1
  38. package/server/services/messaging/access_policy.js +703 -0
  39. package/server/services/messaging/access_policy.test.js +228 -0
  40. package/server/services/messaging/automation.js +32 -95
  41. package/server/services/messaging/base.js +39 -0
  42. package/server/services/messaging/discord.js +61 -46
  43. package/server/services/messaging/formatting_guides.js +0 -4
  44. package/server/services/messaging/http_platforms.js +178 -15
  45. package/server/services/messaging/manager.js +136 -71
  46. package/server/services/messaging/telegram.js +54 -40
  47. package/server/services/messaging/telnyx.js +43 -14
  48. package/server/services/messaging/whatsapp.js +27 -0
  49. package/server/services/tasks/adapters/gmail_message_received.js +36 -0
  50. package/server/services/tasks/adapters/index.js +10 -0
  51. package/server/services/tasks/adapters/outlook_email_received.js +38 -0
  52. package/server/services/tasks/adapters/schedule.js +57 -0
  53. package/server/services/tasks/adapters/slack_message_received.js +39 -0
  54. package/server/services/tasks/adapters/teams_message_received.js +39 -0
  55. package/server/services/tasks/adapters/whatsapp_personal_message_received.js +42 -0
  56. package/server/services/tasks/integration_runtime.js +260 -0
  57. package/server/services/tasks/runtime.js +539 -0
  58. package/server/services/{scheduler/cron_utils.js → tasks/schedule_utils.js} +2 -0
  59. package/server/services/tasks/security.js +60 -0
  60. package/server/services/tasks/task_repository.js +162 -0
  61. package/server/services/tasks/trigger_registry.js +29 -0
  62. package/server/services/tasks/utils.js +45 -0
  63. package/server/services/websocket.js +1 -1
  64. package/server/services/widgets/service.js +37 -25
  65. package/server/routes/wearable_device.js +0 -147
  66. package/server/services/messaging/waveshare_wearable.js +0 -40
  67. package/server/services/scheduler/cron.js +0 -580
  68. package/server/services/wearables/device_auth.js +0 -228
@@ -2,9 +2,9 @@
2
2
 
3
3
  NeoAgent is built for proactive work: tasks that run later, repeat on a schedule, use tools, and notify you when there is something useful to report.
4
4
 
5
- ## Scheduler
5
+ ## Tasks
6
6
 
7
- Use the **Scheduler** section in the UI to create recurring tasks. A scheduled task has:
7
+ Use the **Tasks** section in the UI to create scheduled automations. These tasks use Cron expressions for time-based scheduling. A task has:
8
8
 
9
9
  | Field | Purpose |
10
10
  |---|---|
@@ -9,9 +9,9 @@ The Flutter client exposes the main operator surfaces:
9
9
  | Section | What it is for |
10
10
  |---|---|
11
11
  | Chat | Normal agent runs with tools, memory, integrations, and messaging |
12
- | Runs | Live and historical run steps, including browser, Android, CLI, messaging, scheduler, MCP, and subagent work |
12
+ | Runs | Live and historical run steps, including browser, Android, CLI, messaging, tasks, MCP, and subagent work |
13
13
  | Logs | Service logs and diagnostics from the server you are connected to |
14
- | Scheduler | Recurring cron tasks and one-time future runs |
14
+ | Tasks | Schedule-triggered and integration-triggered automations |
15
15
  | Skills | Built-in and custom reusable workflows |
16
16
  | Integrations | OAuth account connections for structured app tools |
17
17
  | MCP | Remote MCP server registration and tool discovery |
@@ -19,12 +19,11 @@ The Flutter client exposes the main operator surfaces:
19
19
  | Devices | Server-side browser and Android runtime controls |
20
20
  | Recordings | Recording sessions, transcripts, segments, and playback |
21
21
  | Health | Android Health Connect sync status and synced metrics |
22
- | Wearables | Supported Bluetooth recording devices and audio upload status |
23
22
  | Settings | AI providers, model routing, runtime settings, messaging, and service controls |
24
23
 
25
24
  ## Recordings
26
25
 
27
- NeoAgent records audio as server-side sessions with one or more sources. The web client can record browser microphone and screen audio, the Android app can record phone microphone audio through a foreground service, and the wearable bridge can upload audio chunks from supported Bluetooth devices.
26
+ NeoAgent records audio as server-side sessions with one or more sources. The web client can record browser microphone and screen audio, and the Android app can record phone microphone audio through a foreground service.
28
27
 
29
28
  Recording sessions support:
30
29
 
@@ -55,18 +54,16 @@ Android control supports:
55
54
 
56
55
  These actions run where the NeoAgent backend is running. If NeoAgent is deployed on a remote server, the AI controls the Android runtime attached to that server, not the laptop where you are reading the docs.
57
56
 
58
- ## Android App, Health, And Wearables
57
+ ## Android App And Health
59
58
 
60
- The Flutter Android app is still useful as a client. It can sign in to the same self-hosted backend, run chat and operator UI flows, sync Health Connect data, record audio locally, and bridge supported wearables.
59
+ The Flutter Android app is still useful as a client. It can sign in to the same self-hosted backend, run chat and operator UI flows, sync Health Connect data, and record audio locally.
61
60
 
62
61
  Android app capabilities include:
63
62
 
64
63
  - `NEOAGENT_BACKEND_URL` build/run configuration for real devices.
65
64
  - Health Connect permission flow and background sync.
66
65
  - Microphone recording through an Android foreground service.
67
- - Boot restore hooks for recording and wearable services when Android allows them.
68
- - Bluetooth wearable bridge support for HeyPocket-style devices.
69
- - Upload of wearable chunks and synchronization state to the backend.
66
+ - Boot restore hooks for recording services when Android allows them.
70
67
 
71
68
  ## Health Data
72
69
 
@@ -99,7 +96,7 @@ NeoAgent's agent tool surface includes more than basic chat:
99
96
  | HTTP | Direct HTTP requests |
100
97
  | Memory | Semantic memory, session search, daily logs, API key name reads, and core memory |
101
98
  | Skills | Create, list, update, and delete persistent skills |
102
- | Scheduler | Recurring tasks, one-time runs, model overrides, and optional Telnyx call delivery |
99
+ | Tasks | Schedule-triggered and integration-triggered automations, one-time runs, model overrides, and optional Telnyx call delivery |
103
100
  | MCP | Add, list, and remove MCP servers, plus dynamic MCP tool use |
104
101
  | Subagents | Spawn, list, wait for, and cancel async subagents inside a run |
105
102
  | Output | Generate markdown tables and Mermaid graphs |
package/docs/hardware.md CHANGED
@@ -1,11 +1,8 @@
1
1
  ---
2
- title: Waveshare ESP32-S3 1.8inch AMOLED Setup
3
- sidebar_label: Waveshare 1.8inch AMOLED
2
+ title: Hardware
3
+ sidebar_label: Hardware
4
4
  ---
5
5
 
6
- # Waveshare ESP32-S3 1.8inch AMOLED Setup
7
-
8
- Use this only if you want to build or flash this board:
9
-
10
- Waveshare ESP32-S3 1.8inch AMOLED Touch Display Dev Board
6
+ # Hardware
11
7
 
8
+ There is no dedicated hardware or wearable firmware bundled with NeoAgent.
package/docs/index.md CHANGED
@@ -6,9 +6,9 @@ sidebar_label: Overview
6
6
 
7
7
  # NeoAgent
8
8
 
9
- NeoAgent is a self-hosted proactive AI agent with a bundled Flutter client for web and Android. It runs on your server, keeps credentials server-side, and gives you an operator UI for chat, runs, logs, scheduler tasks, skills, integrations, MCP, memory, Android control, recordings, Health Connect data, wearables, and settings.
9
+ NeoAgent is a self-hosted proactive AI agent with a bundled Flutter client for web and Android. It runs on your server, keeps credentials server-side, and gives you an operator UI for chat, runs, logs, tasks, skills, integrations, MCP, memory, Android control, recordings, Health Connect data, and settings.
10
10
 
11
- It is designed for people who want a focused personal automation server rather than a broad gateway platform. NeoAgent can run scheduled tasks, control a browser, operate a server-attached Android emulator or device, manage files, remember long-term context, connect to hosted AI providers or local Ollama, search recordings, read synced health summaries, and send results through Telegram, Discord, WhatsApp, or Telnyx Voice.
11
+ It is designed for people who want a focused personal automation server rather than a broad gateway platform. NeoAgent can run triggered tasks, control a browser, operate a server-attached Android emulator or device, manage files, remember long-term context, connect to hosted AI providers or local Ollama, search recordings, read synced health summaries, and send results through Telegram, Discord, WhatsApp, or Telnyx Voice.
12
12
 
13
13
  ## Quick Start
14
14
 
@@ -17,17 +17,17 @@ npm install -g neoagent
17
17
  neoagent install
18
18
  ```
19
19
 
20
- Open the server URL, sign in, configure providers and messaging, then create a scheduled task or chat run.
20
+ Open the server URL, sign in, configure providers and messaging, then create a task or chat run.
21
21
 
22
22
  ## What NeoAgent Does
23
23
 
24
24
  | Area | Capability |
25
25
  |---|---|
26
26
  | AI providers | OpenAI, Anthropic, xAI, Google, MiniMax Code, and local Ollama |
27
- | Operator UI | Chat, live runs, logs, scheduler, skills, integrations, MCP, memory, devices, recordings, health, wearables, settings |
28
- | Automation | Recurring scheduled tasks, one-time runs, browser control, file access, CLI skills, subagents, and messaging delivery |
27
+ | Operator UI | Chat, live runs, logs, tasks, skills, integrations, MCP, memory, devices, recordings, health, settings |
28
+ | Automation | Triggered tasks, one-time runs, browser control, file access, CLI skills, subagents, and messaging delivery |
29
29
  | Android control | AI control of a server-attached Android emulator or device: screenshots, UI dumps, taps, typing, intents, APK installs, and ADB shell |
30
- | Recordings | Web, Android, and wearable audio sessions with transcript search and AI insights |
30
+ | Recordings | Web and Android audio sessions with transcript search and AI insights |
31
31
  | Integrations | Google Workspace, Notion, Microsoft 365, Slack, Figma, and remote MCP servers |
32
32
  | Messaging | Telegram, Discord, WhatsApp text/media, and Telnyx Voice calls |
33
33
  | Outputs | Artifacts, Grok image generation, vision analysis, markdown tables, and Mermaid graphs |
@@ -46,5 +46,5 @@ Open the server URL, sign in, configure providers and messaging, then create a s
46
46
  | Skills and MCP | [Skills](skills.md) |
47
47
  | Secrets and runtime settings | [Configuration](configuration.md) |
48
48
  | Logs, updates, and repair | [Operations](operations.md) |
49
- | Want to flash a Waveshare ESP32-S3 1.8inch AMOLED | [Waveshare ESP32-S3 1.8inch AMOLED Setup](hardware.md) |
50
49
  | OpenClaw comparison | [Why NeoAgent](why-neoagent.md) |
50
+ | Migration from OpenClaw/Hermes | [Migration Guide](migration.md) |
@@ -53,7 +53,7 @@ NeoAgent can talk through:
53
53
  | IRC and Twitch | IRC-style channel connections |
54
54
  | LINE and Mattermost | Native send paths with webhook ingestion |
55
55
  | Feishu, Nextcloud Talk, Nostr, Synology Chat, Tlon, Zalo, Zalo Personal, WeChat, and WebChat | Configurable webhook bridges |
56
- | Telnyx Voice | Inbound and outbound calling with text-to-speech; scheduled tasks can call a number |
56
+ | Telnyx Voice | Inbound and outbound calling with text-to-speech; tasks can call a number |
57
57
 
58
58
  Messaging channel credentials are configured through the Flutter app messaging tab (not `.env`) for channel setup and inbound callback routing. The generic inbound callback path is:
59
59
 
@@ -0,0 +1,238 @@
1
+ ---
2
+ slug: /migration
3
+ title: Migration Guide
4
+ sidebar_label: Migration
5
+ ---
6
+
7
+ # Migration Guide
8
+
9
+ Migrate your existing agent setup from **OpenClaw** or **Hermes** to NeoAgent with a single command.
10
+
11
+ ## Quick Start
12
+
13
+ ```bash
14
+ # Detect existing installations and migrate
15
+ neoagent migrate
16
+
17
+ # Preview what would be migrated (dry run)
18
+ neoagent migrate dry-run
19
+
20
+ # Check migration status
21
+ neoagent migrate status
22
+ ```
23
+
24
+ ## What Gets Migrated
25
+
26
+ | Data Type | OpenClaw | Hermes | Destination |
27
+ |-----------|----------|--------|-------------|
28
+ | **Skills** | `~/.openclaw/skills/*.md` | `~/.hermes/skills/*.md` | `~/.neoagent/agent-data/skills/openclaw-imports/` or `hermes-imports/` |
29
+ | **Memory** | `SOUL.md`, `MEMORY.md`, `USER.md` | `MEMORY.md`, `USER.md` | `~/.neoagent/agent-data/memory/openclaw/` or `hermes/` |
30
+ | **API Keys** | From `.env` | From `.env` | `~/.neoagent/.env` (merged with prompts on conflict) |
31
+
32
+ ## Prerequisites
33
+
34
+ - NeoAgent installed (`npm install -g neoagent`)
35
+ - Existing OpenClaw (at `~/.openclaw/`) and/or Hermes (at `~/.hermes/`) installation
36
+
37
+ ## Step-by-Step Migration
38
+
39
+ ### 1. Run Migration Detection
40
+
41
+ ```bash
42
+ neoagent migrate status
43
+ ```
44
+
45
+ This will show:
46
+ ```
47
+ Source agents:
48
+ OpenClaw: FOUND
49
+ Hermes: FOUND
50
+
51
+ Run `neoagent migrate` to start migration.
52
+ ```
53
+
54
+ ### 2. Preview Migration (Optional)
55
+
56
+ ```bash
57
+ neoagent migrate dry-run
58
+ ```
59
+
60
+ Sample output:
61
+ ```
62
+ === Migration Dry Run ===
63
+
64
+ OpenClaw detection: FOUND
65
+ Skills: 5
66
+ Memories: 3
67
+ API keys: ANTHROPIC_API_KEY, OPENAI_API_KEY, TELEGRAM_BOT_TOKEN
68
+ Config: ~/.openclaw/openclaw.json
69
+
70
+ Hermes detection: FOUND
71
+ Skills: 3
72
+ Memories: 2
73
+ API keys: OPENAI_API_KEY, XAI_API_KEY
74
+ Config: ~/.hermes/config.yaml
75
+
76
+ Would migrate to:
77
+ Skills → ~/.neoagent/agent-data/skills/
78
+ Memories → ~/.neoagent/agent-data/memory/
79
+ API keys → ~/.neoagent/.env
80
+ ```
81
+
82
+ ### 3. Run Full Migration
83
+
84
+ ```bash
85
+ neoagent migrate
86
+ ```
87
+
88
+ Interactive prompts:
89
+ ```
90
+ === NeoAgent Migration ===
91
+
92
+ -> OpenClaw detected at ~/.openclaw/
93
+ -> Hermes detected at ~/.hermes/
94
+
95
+ What would you like to migrate?
96
+ [1] Migrate from all detected sources
97
+ [2] Migrate from OpenClaw only
98
+ [3] Migrate from Hermes only
99
+ [4] Cancel
100
+
101
+ Choice [1]: 1
102
+
103
+ Scanning sources...
104
+ OpenClaw: 5 skills, 3 memories, 3 API keys
105
+ Hermes: 3 skills, 2 memories, 2 API keys
106
+
107
+ Migrating skills and memories...
108
+ → Copied 5 skills to openclaw-imports/
109
+ → Copied 3 skills to hermes-imports/
110
+ → Copied 5 memory files
111
+
112
+ ⚠️ API Key conflicts detected:
113
+ OPENAI_API_KEY exists in both sources
114
+ Existing in: neoagent
115
+ Incoming from: openclaw
116
+ [1] Keep existing
117
+ [2] Overwrite with new
118
+ [3] Skip this key
119
+ Choice [1]: 1
120
+
121
+ Merging API keys...
122
+ → Merged 4 API keys
123
+
124
+ === Migration Complete ===
125
+
126
+ Skills migrated to:
127
+ openclaw-imports/
128
+ hermes-imports/
129
+
130
+ Memories migrated to:
131
+ memory/openclaw/
132
+ memory/hermes/
133
+
134
+ Run `neoagent status` to verify the installation.
135
+ Run `neoagent start` to start the server.
136
+ ```
137
+
138
+ ## Source Paths
139
+
140
+ ### OpenClaw
141
+
142
+ | Data | Path |
143
+ |------|------|
144
+ | Config | `~/.openclaw/openclaw.json` |
145
+ | Workspace | `~/.openclaw/workspace/` |
146
+ | Skills | `~/.openclaw/skills/` |
147
+ | Memories | `~/.openclaw/workspace/SOUL.md`, `MEMORY.md`, `USER.md` |
148
+ | Legacy | `~/.clawdbot/` |
149
+
150
+ ### Hermes
151
+
152
+ | Data | Path |
153
+ |------|------|
154
+ | Config | `~/.hermes/config.yaml` |
155
+ | Skills | `~/.hermes/skills/` |
156
+ | Memories | `~/.hermes/memories/MEMORY.md`, `USER.md` |
157
+ | API Keys | `~/.hermes/.env` |
158
+
159
+ ## Target Paths (NeoAgent)
160
+
161
+ | Data | Path |
162
+ |------|------|
163
+ | Config | `~/.neoagent/.env` |
164
+ | Skills | `~/.neoagent/agent-data/skills/` |
165
+ | Memory | `~/.neoagent/agent-data/memory/` |
166
+ | Database | `~/.neoagent/data/neoagent.db` |
167
+
168
+ ## API Keys Merged
169
+
170
+ The following API keys are automatically detected and merged:
171
+
172
+ - `ANTHROPIC_API_KEY`
173
+ - `OPENAI_API_KEY`
174
+ - `XAI_API_KEY`
175
+ - `GOOGLE_AI_KEY`
176
+ - `MINIMAX_API_KEY`
177
+ - `BRAVE_SEARCH_API_KEY`
178
+ - `DEEPGRAM_API_KEY`
179
+ - `TELEGRAM_BOT_TOKEN`
180
+ - `OPENROUTER_API_KEY`
181
+ - `ELEVENLABS_API_KEY`
182
+ - `SLACK_BOT_TOKEN`
183
+ - `DISCORD_BOT_TOKEN`
184
+
185
+ ## Conflict Resolution
186
+
187
+ When an API key exists in multiple sources (including your existing NeoAgent config), you'll be prompted:
188
+
189
+ ```
190
+ ⚠️ Conflict: OPENAI_API_KEY
191
+ Existing in: neoagent
192
+ Incoming from: openclaw
193
+ [1] Keep existing
194
+ [2] Overwrite with new
195
+ [3] Skip this key
196
+ ```
197
+
198
+ Choose `1` to keep the NeoAgent value, `2` to overwrite with the imported value, or `3` to skip entirely.
199
+
200
+ ## Post-Migration Steps
201
+
202
+ 1. **Verify installation**: `neoagent status`
203
+ 2. **Start server**: `neoagent start`
204
+ 3. **Review imported skills**: Check `~/.neoagent/agent-data/skills/openclaw-imports/` and `hermes-imports/`
205
+ 4. **Review imported memories**: Check `~/.neoagent/agent-data/memory/`
206
+ 5. **Configure messaging channels**: If you had Telegram/Discord configured, verify settings in the NeoAgent UI
207
+
208
+ ## Troubleshooting
209
+
210
+ ### "No OpenClaw or Hermes installation detected"
211
+
212
+ Ensure your existing installation is at the default path (`~/.openclaw/` or `~/.hermes/`). If it's at a custom path, you can manually copy the data:
213
+ - Skills: Copy `.md` files to `~/.neoagent/agent-data/skills/`
214
+ - Memories: Copy to `~/.neoagent/agent-data/memory/`
215
+ - API keys: Merge into `~/.neoagent/.env`
216
+
217
+ ### "Permission denied" errors
218
+
219
+ Ensure you have read permissions on the source directories and write permissions on `~/.neoagent/`.
220
+
221
+ ### Migration partially failed
222
+
223
+ The migration is designed to be idempotent - you can re-run it. Only new files are copied; existing files are not overwritten.
224
+
225
+ ## Manual Migration
226
+
227
+ If the automated migration doesn't work for your setup:
228
+
229
+ 1. **Skills**: Copy skill `.md` files from source `skills/` directory to `~/.neoagent/agent-data/skills/[source]-imports/`
230
+ 2. **Memory**: Copy `SOUL.md`, `MEMORY.md`, `USER.md` to `~/.neoagent/agent-data/memory/[source]/`
231
+ 3. **API Keys**: Edit `~/.neoagent/.env` and add keys from source `.env` file
232
+
233
+ ## Getting Help
234
+
235
+ If you encounter issues:
236
+ - Run `neoagent status` to check NeoAgent health
237
+ - Run `neoagent logs` to view logs
238
+ - Run `neoagent doctor` to diagnose issues
@@ -10,7 +10,7 @@ neoagent logs
10
10
  neoagent restart
11
11
  ```
12
12
 
13
- `neoagent status` reports the install root, config path, runtime data paths, release channel, and service state. `neoagent logs` is the first place to look when the service starts but the UI, messaging, OAuth, or scheduled tasks behave unexpectedly.
13
+ `neoagent status` reports the install root, config path, runtime data paths, release channel, and service state. `neoagent logs` is the first place to look when the service starts but the UI, messaging, OAuth, or tasks behave unexpectedly.
14
14
 
15
15
  ## Release Channels
16
16
 
@@ -11,9 +11,9 @@ This comparison is based on the public [OpenClaw README](https://raw.githubuserc
11
11
  | Architecture | Self-hosted Node server, SQLite runtime data, built-in web UI, Android client, server-side credentials. | Gateway control plane with channel connections, optional apps/nodes, and a much wider platform surface. |
12
12
  | Android control | AI control of a server-attached Android emulator or device: screenshots, UI dumps, visible node inspection, app launch, intent launch, taps, long press, typing, swipes, key presses, wait-for-element, APK installs, and `adb shell`. | Broader node/app ecosystem with Android node capabilities documented publicly. |
13
13
  | Messaging breadth | Broad built-in messaging tab coverage: WhatsApp, Telegram, Discord, Slack, Google Chat, Signal, iMessage/BlueBubbles, IRC, Teams, Matrix, LINE, Mattermost, Twitch, and configurable webhook bridges for Feishu, Nextcloud Talk, Nostr, Synology Chat, Tlon, Zalo, WeChat, and WebChat, plus Telnyx Voice. | Still broader as a gateway ecosystem: the public README lists the same major channels plus a larger channel/node/app surface around them. |
14
- | Operator UX | Built-in UI sections for chat, runs, logs, scheduler, skills, integrations, MCP, memory, devices, recordings, health, and settings. | Broader gateway, web, canvas, platform, node, and channel surfaces. |
14
+ | Operator UX | Built-in UI sections for chat, runs, logs, tasks, skills, integrations, MCP, memory, devices, recordings, health, and settings. | Broader gateway, web, canvas, platform, node, and channel surfaces. |
15
15
  | Credentials | AI provider keys and OAuth client secrets are server-side; channel settings are stored through the app where supported. | Public docs describe a broader config and auth surface across gateway, channels, nodes, and apps. |
16
- | Automation | Cron-style scheduled tasks, one-time runs, browser/file/CLI skills, MCP tools, official integrations, subagents, recording search, health summaries, and messaging delivery. | Broader automation platform including cron, webhooks, nodes, and channel-specific actions. |
16
+ | Automation | Trigger-based tasks, one-time runs, browser/file/CLI skills, MCP tools, official integrations, subagents, recording search, health summaries, and messaging delivery. | Broader automation platform including cron, webhooks, nodes, and channel-specific actions. |
17
17
  | Recovery | CLI-first service operations: `neoagent status`, `neoagent logs`, release channels, `neoagent update`, and `neoagent fix`. | Public README highlights onboarding, updating, and doctor-style diagnostics. |
18
18
 
19
19
  Choose NeoAgent when you want the shortest path to a self-hosted proactive agent with a practical operator UI. Choose OpenClaw when you need maximum channel coverage, gateway/node architecture, or the larger companion-app ecosystem.
package/lib/manager.js CHANGED
@@ -33,7 +33,14 @@ const {
33
33
  } = require('../runtime/release_channel');
34
34
  const { parseEnv } = require('../runtime/env');
35
35
  const { createGitHelpers } = require('../runtime/git_helpers');
36
- const { parseDeploymentMode } = require('../server/utils/deployment');
36
+ const {
37
+ parseDeploymentMode
38
+ } = require('../server/utils/deployment');
39
+ const {
40
+ detectSourceAgents,
41
+ cmdMigrateDryRun,
42
+ cmdMigrateRun
43
+ } = require('./migrations');
37
44
 
38
45
  const APP_NAME = 'NeoAgent';
39
46
  const SERVICE_LABEL = 'com.neoagent';
@@ -582,6 +589,91 @@ async function cmdSetup() {
582
589
  logOk(`Wrote ${ENV_FILE}`);
583
590
  }
584
591
 
592
+ async function cmdMigrate(args = []) {
593
+ const subcommand = args[0] || 'run';
594
+ const sources = detectSourceAgents();
595
+
596
+ if (subcommand === '--help' || subcommand === '-h' || subcommand === 'help') {
597
+ console.log('\nNeoAgent Migration');
598
+ console.log('Usage: neoagent migrate [subcommand]');
599
+ console.log('');
600
+ console.log('Subcommands:');
601
+ console.log(' neoagent migrate Interactive migration (select sources)');
602
+ console.log(' neoagent migrate dry-run Preview what would be migrated');
603
+ console.log(' neoagent migrate status Show detected source agents');
604
+ console.log(' neoagent migrate openclaw-only Migrate from OpenClaw only');
605
+ console.log(' neoagent migrate hermes-only Migrate from Hermes only');
606
+ console.log('');
607
+ console.log('Migration searches for:');
608
+ console.log(' - OpenClaw at ~/.openclaw/');
609
+ console.log(' - Hermes at ~/.hermes/');
610
+ console.log('');
611
+ return;
612
+ }
613
+
614
+ if (!sources.openclaw && !sources.hermes) {
615
+ logWarn('No OpenClaw or Hermes installation detected.');
616
+ logInfo('Migration searches for:');
617
+ logInfo(' - OpenClaw: ~/.openclaw/');
618
+ logInfo(' - Hermes: ~/.hermes/');
619
+ logInfo('\nIf you have an existing installation at a custom path,');
620
+ logInfo('please ensure the data is accessible and run this command again.');
621
+ logInfo('\nRun `neoagent migrate --help` for usage information.');
622
+ return;
623
+ }
624
+
625
+ console.log('\n=== NeoAgent Migration ===\n');
626
+ if (sources.openclaw) logInfo('OpenClaw detected at ~/.openclaw/');
627
+ if (sources.hermes) logInfo('Hermes detected at ~/.hermes/');
628
+
629
+ if (subcommand === 'dry-run' || subcommand === '--dry-run') {
630
+ await cmdMigrateDryRun(sources);
631
+ return;
632
+ }
633
+
634
+ if (subcommand === 'status') {
635
+ console.log('\nSource agents:');
636
+ console.log(` OpenClaw: ${sources.openclaw ? 'FOUND' : 'not found'}`);
637
+ console.log(` Hermes: ${sources.hermes ? 'FOUND' : 'not found'}`);
638
+ console.log('\nRun `neoagent migrate` to start migration.');
639
+ return;
640
+ }
641
+
642
+ if (subcommand === 'openclaw-only') {
643
+ await cmdMigrateRun({ openclaw: true, hermes: false });
644
+ return;
645
+ }
646
+
647
+ if (subcommand === 'hermes-only') {
648
+ await cmdMigrateRun({ openclaw: false, hermes: true });
649
+ return;
650
+ }
651
+
652
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
653
+ console.log('\nWhat would you like to migrate?');
654
+ console.log(' [1] Migrate from all detected sources');
655
+ console.log(' [2] Migrate from OpenClaw only');
656
+ console.log(' [3] Migrate from Hermes only');
657
+ console.log(' [4] Cancel');
658
+
659
+ await new Promise((resolve) => {
660
+ rl.question(' Choice [1]: ', async (answer) => {
661
+ rl.close();
662
+ const choice = answer.trim() || '1';
663
+
664
+ if (choice === '1') {
665
+ await cmdMigrateRun(sources);
666
+ } else if (choice === '2') {
667
+ await cmdMigrateRun({ openclaw: true, hermes: false });
668
+ } else if (choice === '3') {
669
+ await cmdMigrateRun({ openclaw: false, hermes: true });
670
+ } else {
671
+ console.log('Migration cancelled.');
672
+ }
673
+ });
674
+ });
675
+ }
676
+
585
677
  function installDependencies() {
586
678
  heading('Dependencies');
587
679
  runOrThrow('npm', ['install', '--omit=dev', '--no-audit', '--no-fund'], {
@@ -970,10 +1062,12 @@ async function cmdEnv(args = []) {
970
1062
  function printHelp() {
971
1063
  console.log(`${APP_NAME} manager`);
972
1064
  console.log('Usage: neoagent <command>');
973
- console.log('Commands: install | setup | env | channel | update | restart | start | stop | status | logs | uninstall');
1065
+ console.log('Commands: install | setup | env | channel | update | restart | start | stop | status | logs | uninstall | migrate');
974
1066
  console.log('Channel usage: neoagent channel | neoagent channel stable | neoagent channel beta');
975
1067
  console.log('Update usage: neoagent update | neoagent update stable | neoagent update beta');
976
1068
  console.log('Env usage: neoagent env list | neoagent env get PORT | neoagent env set PORT 3333 | neoagent env unset PORT');
1069
+ console.log('Migrate usage: neoagent migrate | neoagent migrate dry-run | neoagent migrate status');
1070
+ console.log(' neoagent migrate openclaw-only | neoagent migrate hermes-only');
977
1071
  }
978
1072
 
979
1073
  async function runCLI(argv) {
@@ -1015,6 +1109,9 @@ async function runCLI(argv) {
1015
1109
  case 'uninstall':
1016
1110
  cmdUninstall();
1017
1111
  break;
1112
+ case 'migrate':
1113
+ await cmdMigrate(argv.slice(1));
1114
+ break;
1018
1115
  case 'help':
1019
1116
  case '--help':
1020
1117
  case '-h':