@eclaw/openclaw-channel 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,58 +1,58 @@
1
- # @eclaw/openclaw-channel
2
-
3
- OpenClaw channel plugin for [E-Claw](https://eclawbot.com) — an AI chat platform for live wallpaper entities on Android.
4
-
5
- This plugin enables OpenClaw bots to communicate with E-Claw users as a native channel, alongside Telegram, Discord, and Slack.
6
-
7
- ## Installation
8
-
9
- ```bash
10
- npm install @eclaw/openclaw-channel
11
- ```
12
-
13
- ## Configuration
14
-
15
- Add to your OpenClaw `config.yaml`:
16
-
17
- ```yaml
18
- plugins:
19
- - "@eclaw/openclaw-channel"
20
-
21
- channels:
22
- eclaw:
23
- accounts:
24
- default:
25
- apiKey: "eck_..." # From E-Claw Portal → Settings → Channel API
26
- apiSecret: "ecs_..." # From E-Claw Portal → Settings → Channel API
27
- apiBase: "https://eclawbot.com"
28
- entityId: 0 # Which entity slot to use (0-3)
29
- botName: "My Bot"
30
- ```
31
-
32
- ## Getting API Credentials
33
-
34
- 1. Log in to [E-Claw Portal](https://eclawbot.com/portal)
35
- 2. Go to **Settings → Channel API**
36
- 3. Copy your `API Key` and `API Secret`
37
-
38
- ## How It Works
39
-
40
- ```
41
- User (Android) ──speaks──▶ E-Claw Backend ──webhook──▶ OpenClaw Agent
42
- OpenClaw Agent ──replies──▶ POST /api/channel/message ──▶ User (Android)
43
- ```
44
-
45
- - **Inbound**: E-Claw POSTs structured JSON to a webhook URL registered by this plugin
46
- - **Outbound**: Plugin calls `POST /api/channel/message` with the bot reply
47
- - **Auth**: `eck_`/`ecs_` channel credentials for API auth, per-entity `botSecret` for message auth
48
-
49
- ## Environment Variables
50
-
51
- | Variable | Required | Description |
52
- |----------|----------|-------------|
53
- | `ECLAW_WEBHOOK_URL` | Production | Public URL for receiving inbound messages |
54
- | `ECLAW_WEBHOOK_PORT` | Optional | Webhook server port (default: random) |
55
-
56
- ## License
57
-
58
- MIT
1
+ # @eclaw/openclaw-channel
2
+
3
+ OpenClaw channel plugin for [E-Claw](https://eclawbot.com) — an AI chat platform for live wallpaper entities on Android.
4
+
5
+ This plugin enables OpenClaw bots to communicate with E-Claw users as a native channel, alongside Telegram, Discord, and Slack.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install @eclaw/openclaw-channel
11
+ ```
12
+
13
+ ## Configuration
14
+
15
+ Add to your OpenClaw `config.yaml`:
16
+
17
+ ```yaml
18
+ plugins:
19
+ - "@eclaw/openclaw-channel"
20
+
21
+ channels:
22
+ eclaw:
23
+ accounts:
24
+ default:
25
+ apiKey: "eck_..." # From E-Claw Portal → Settings → Channel API
26
+ apiSecret: "ecs_..." # From E-Claw Portal → Settings → Channel API
27
+ apiBase: "https://eclawbot.com"
28
+ entityId: 0 # Which entity slot to use (0-3)
29
+ botName: "My Bot"
30
+ ```
31
+
32
+ ## Getting API Credentials
33
+
34
+ 1. Log in to [E-Claw Portal](https://eclawbot.com/portal)
35
+ 2. Go to **Settings → Channel API**
36
+ 3. Copy your `API Key` and `API Secret`
37
+
38
+ ## How It Works
39
+
40
+ ```
41
+ User (Android) ──speaks──▶ E-Claw Backend ──webhook──▶ OpenClaw Agent
42
+ OpenClaw Agent ──replies──▶ POST /api/channel/message ──▶ User (Android)
43
+ ```
44
+
45
+ - **Inbound**: E-Claw POSTs structured JSON to a webhook URL registered by this plugin
46
+ - **Outbound**: Plugin calls `POST /api/channel/message` with the bot reply
47
+ - **Auth**: `eck_`/`ecs_` channel credentials for API auth, per-entity `botSecret` for message auth
48
+
49
+ ## Environment Variables
50
+
51
+ | Variable | Required | Description |
52
+ |----------|----------|-------------|
53
+ | `ECLAW_WEBHOOK_URL` | Production | Public URL for receiving inbound messages |
54
+ | `ECLAW_WEBHOOK_PORT` | Optional | Webhook server port (default: random) |
55
+
56
+ ## License
57
+
58
+ MIT
package/dist/channel.d.ts CHANGED
@@ -40,4 +40,23 @@ export declare const eclawChannel: {
40
40
  gateway: {
41
41
  startAccount: typeof startAccount;
42
42
  };
43
+ onboarding: {
44
+ channel: string;
45
+ getStatus: ({ cfg }: {
46
+ cfg: any;
47
+ }) => Promise<{
48
+ channel: string;
49
+ configured: boolean;
50
+ statusLines: string[];
51
+ selectionHint: string;
52
+ quickstartScore: number;
53
+ }>;
54
+ configure: ({ cfg, prompter }: {
55
+ cfg: any;
56
+ prompter: any;
57
+ }) => Promise<{
58
+ cfg: any;
59
+ accountId: string;
60
+ }>;
61
+ };
43
62
  };
package/dist/channel.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { listAccountIds, resolveAccount } from './config.js';
2
2
  import { sendText, sendMedia } from './outbound.js';
3
3
  import { startAccount } from './gateway.js';
4
+ import { eclawOnboardingAdapter } from './onboarding.js';
4
5
  /**
5
6
  * E-Claw ChannelPlugin definition.
6
7
  *
@@ -40,4 +41,5 @@ export const eclawChannel = {
40
41
  gateway: {
41
42
  startAccount,
42
43
  },
44
+ onboarding: eclawOnboardingAdapter,
43
45
  };
@@ -0,0 +1,19 @@
1
+ export declare const eclawOnboardingAdapter: {
2
+ channel: string;
3
+ getStatus: ({ cfg }: {
4
+ cfg: any;
5
+ }) => Promise<{
6
+ channel: string;
7
+ configured: boolean;
8
+ statusLines: string[];
9
+ selectionHint: string;
10
+ quickstartScore: number;
11
+ }>;
12
+ configure: ({ cfg, prompter }: {
13
+ cfg: any;
14
+ prompter: any;
15
+ }) => Promise<{
16
+ cfg: any;
17
+ accountId: string;
18
+ }>;
19
+ };
@@ -0,0 +1,78 @@
1
+ import { listAccountIds, resolveAccount } from './config.js';
2
+ const DEFAULT_ACCOUNT_ID = 'main';
3
+ export const eclawOnboardingAdapter = {
4
+ channel: 'eclaw',
5
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6
+ getStatus: async ({ cfg }) => {
7
+ const ids = listAccountIds(cfg);
8
+ const configured = ids.some((id) => {
9
+ const acc = resolveAccount(cfg, id);
10
+ return Boolean(acc.apiKey && acc.apiSecret);
11
+ });
12
+ return {
13
+ channel: 'eclaw',
14
+ configured,
15
+ statusLines: [`E-Claw: ${configured ? 'configured' : 'not configured'}`],
16
+ selectionHint: configured ? 'configured' : 'E-Claw (AI Live Wallpaper Chat)',
17
+ quickstartScore: configured ? 1 : 3,
18
+ };
19
+ },
20
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
+ configure: async ({ cfg, prompter }) => {
22
+ const accountId = DEFAULT_ACCOUNT_ID;
23
+ const resolved = resolveAccount(cfg, accountId);
24
+ await prompter.note([
25
+ '1. Log in to https://eclawbot.com',
26
+ '2. Go to Portal → Settings → Channel API',
27
+ '3. Create an API Key and API Secret',
28
+ '4. Enter the credentials below',
29
+ ].join('\n'), 'E-Claw Setup');
30
+ const apiKey = await prompter.text({
31
+ message: 'Channel API Key',
32
+ placeholder: 'eck_...',
33
+ initialValue: resolved.apiKey || '',
34
+ validate: (v) => (String(v ?? '').trim() ? undefined : 'Required'),
35
+ });
36
+ const apiSecret = await prompter.text({
37
+ message: 'Channel API Secret',
38
+ placeholder: 'ecs_...',
39
+ initialValue: resolved.apiSecret || '',
40
+ validate: (v) => (String(v ?? '').trim() ? undefined : 'Required'),
41
+ });
42
+ const entityIdStr = await prompter.text({
43
+ message: 'Entity ID (0–3)',
44
+ placeholder: '0',
45
+ initialValue: String(resolved.entityId ?? 0),
46
+ validate: (v) => {
47
+ const n = Number(v);
48
+ return Number.isInteger(n) && n >= 0 && n <= 3 ? undefined : 'Must be 0–3';
49
+ },
50
+ });
51
+ const botName = await prompter.text({
52
+ message: 'Bot display name (optional)',
53
+ placeholder: 'My Bot',
54
+ initialValue: resolved.botName ?? '',
55
+ });
56
+ const nextCfg = {
57
+ ...cfg,
58
+ channels: {
59
+ ...(cfg.channels ?? {}),
60
+ eclaw: {
61
+ ...(cfg.channels?.eclaw ?? {}),
62
+ accounts: {
63
+ ...(cfg.channels?.eclaw?.accounts ?? {}), // eslint-disable-line @typescript-eslint/no-explicit-any
64
+ [accountId]: {
65
+ apiKey: String(apiKey).trim(),
66
+ apiSecret: String(apiSecret).trim(),
67
+ apiBase: resolved.apiBase || 'https://eclawbot.com',
68
+ entityId: Number(entityIdStr),
69
+ botName: String(botName).trim() || undefined,
70
+ enabled: true,
71
+ },
72
+ },
73
+ },
74
+ },
75
+ };
76
+ return { cfg: nextCfg, accountId };
77
+ },
78
+ };
@@ -1,27 +1,27 @@
1
- {
2
- "id": "eclaw",
3
- "name": "E-Claw",
4
- "version": "1.0.0",
5
- "description": "E-Claw AI chat platform channel for OpenClaw",
6
- "channels": ["eclaw"],
7
- "configSchema": {
8
- "type": "object",
9
- "properties": {
10
- "accounts": {
11
- "type": "object",
12
- "additionalProperties": {
13
- "type": "object",
14
- "properties": {
15
- "enabled": { "type": "boolean", "default": true },
16
- "apiKey": { "type": "string", "description": "Channel API Key (eck_...)" },
17
- "apiSecret": { "type": "string", "description": "Channel API Secret (ecs_...)" },
18
- "apiBase": { "type": "string", "default": "https://eclawbot.com" },
19
- "entityId": { "type": "number", "default": 0, "minimum": 0, "maximum": 7 },
20
- "botName": { "type": "string", "maxLength": 20 }
21
- },
22
- "required": ["apiKey", "apiSecret"]
23
- }
24
- }
25
- }
26
- }
27
- }
1
+ {
2
+ "id": "eclaw",
3
+ "name": "E-Claw",
4
+ "version": "1.0.0",
5
+ "description": "E-Claw AI chat platform channel for OpenClaw",
6
+ "channels": ["eclaw"],
7
+ "configSchema": {
8
+ "type": "object",
9
+ "properties": {
10
+ "accounts": {
11
+ "type": "object",
12
+ "additionalProperties": {
13
+ "type": "object",
14
+ "properties": {
15
+ "enabled": { "type": "boolean", "default": true },
16
+ "apiKey": { "type": "string", "description": "Channel API Key (eck_...)" },
17
+ "apiSecret": { "type": "string", "description": "Channel API Secret (ecs_...)" },
18
+ "apiBase": { "type": "string", "default": "https://eclawbot.com" },
19
+ "entityId": { "type": "number", "default": 0, "minimum": 0, "maximum": 7 },
20
+ "botName": { "type": "string", "maxLength": 20 }
21
+ },
22
+ "required": ["apiKey", "apiSecret"]
23
+ }
24
+ }
25
+ }
26
+ }
27
+ }
package/package.json CHANGED
@@ -1,60 +1,60 @@
1
- {
2
- "name": "@eclaw/openclaw-channel",
3
- "version": "1.0.0",
4
- "description": "E-Claw channel plugin for OpenClaw — AI chat platform for live wallpaper entities",
5
- "type": "module",
6
- "main": "./dist/index.js",
7
- "types": "./dist/index.d.ts",
8
- "exports": {
9
- ".": {
10
- "import": "./dist/index.js",
11
- "types": "./dist/index.d.ts"
12
- }
13
- },
14
- "files": [
15
- "dist/",
16
- "openclaw.plugin.json",
17
- "README.md"
18
- ],
19
- "scripts": {
20
- "build": "tsc",
21
- "dev": "tsc --watch",
22
- "test": "vitest run",
23
- "lint": "tsc --noEmit",
24
- "prepublishOnly": "npm run build"
25
- },
26
- "openclaw": {
27
- "extensions": [
28
- "./dist/index.js"
29
- ],
30
- "channel": {
31
- "id": "eclaw",
32
- "label": "E-Claw",
33
- "selectionLabel": "E-Claw (AI Live Wallpaper Chat)",
34
- "docsPath": "https://github.com/HankHuang0516/openclaw-channel-eclaw#readme",
35
- "description": "Connect OpenClaw to E-Claw — an AI chat platform for live wallpaper entities on Android."
36
- },
37
- "install": {
38
- "npmSpec": "@eclaw/openclaw-channel"
39
- }
40
- },
41
- "keywords": [
42
- "openclaw",
43
- "openclaw-channel",
44
- "channel",
45
- "eclaw",
46
- "ai-agent",
47
- "live-wallpaper"
48
- ],
49
- "author": "HankHuang",
50
- "license": "MIT",
51
- "repository": {
52
- "type": "git",
53
- "url": "git+https://github.com/HankHuang0516/openclaw-channel-eclaw.git"
54
- },
55
- "devDependencies": {
56
- "typescript": "^5.4",
57
- "vitest": "^2.0",
58
- "@types/node": "^20"
59
- }
60
- }
1
+ {
2
+ "name": "@eclaw/openclaw-channel",
3
+ "version": "1.0.2",
4
+ "description": "E-Claw channel plugin for OpenClaw — AI chat platform for live wallpaper entities",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist/",
16
+ "openclaw.plugin.json",
17
+ "README.md"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsc",
21
+ "dev": "tsc --watch",
22
+ "test": "vitest run",
23
+ "lint": "tsc --noEmit",
24
+ "prepublishOnly": "npm run build"
25
+ },
26
+ "openclaw": {
27
+ "extensions": [
28
+ "./dist/index.js"
29
+ ],
30
+ "channel": {
31
+ "id": "eclaw",
32
+ "label": "E-Claw",
33
+ "selectionLabel": "E-Claw (AI Live Wallpaper Chat)",
34
+ "docsPath": "https://github.com/HankHuang0516/openclaw-channel-eclaw#readme",
35
+ "description": "Connect OpenClaw to E-Claw — an AI chat platform for live wallpaper entities on Android."
36
+ },
37
+ "install": {
38
+ "npmSpec": "@eclaw/openclaw-channel"
39
+ }
40
+ },
41
+ "keywords": [
42
+ "openclaw",
43
+ "openclaw-channel",
44
+ "channel",
45
+ "eclaw",
46
+ "ai-agent",
47
+ "live-wallpaper"
48
+ ],
49
+ "author": "HankHuang",
50
+ "license": "MIT",
51
+ "repository": {
52
+ "type": "git",
53
+ "url": "https://github.com/HankHuang0516/openclaw-channel-eclaw"
54
+ },
55
+ "devDependencies": {
56
+ "typescript": "^5.4",
57
+ "vitest": "^2.0",
58
+ "@types/node": "^20"
59
+ }
60
+ }