moltbot-dingtalk-stream 1.0.8 → 1.0.9

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/CHANGELOG.md ADDED
@@ -0,0 +1,20 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [1.0.8] - 2026-01-29
9
+
10
+ ### Changed
11
+ - All Chinese comments and log messages converted to English for better international support
12
+ - Improved code organization and readability
13
+ - Updated README with comprehensive documentation
14
+ - Added CHANGELOG
15
+
16
+ ## [1.0.7] - 2026-01-29
17
+
18
+ ### Fixed
19
+ - Fixed webhook lookup issue where reply messages couldn't find the correct session webhook
20
+ - Webhook is now stored with multiple keys (conversationId, senderId, prefixed formats) for flexible lookup
package/README.md CHANGED
@@ -1,61 +1,134 @@
1
- # DingTalk Channel for Moltbot
1
+ # DingTalk Channel for Clawdbot
2
2
 
3
- A Moltbot channel plugin for DingTalk (钉钉) using **Stream Mode** for seamless integration.
3
+ A Clawdbot channel plugin for DingTalk (钉钉) using **Stream Mode** for seamless integration.
4
4
 
5
5
  ## Features
6
6
 
7
- - **Stream Mode**: Uses WebSocket for receiving messages (no public IP required)
7
+ - **Stream Mode**: Uses WebSocket for real-time message receiving (no public IP required)
8
8
  - **Zero Configuration**: No webhook setup, ngrok, or firewall configuration needed
9
9
  - **Single/Group Chat**: Supports both direct messages and group mentions
10
10
  - **Easy Setup**: Just configure your DingTalk app credentials
11
+ - **Media Support**: Send images via markdown format
12
+ - **Auto Chunking**: Automatically splits long messages (2000 char limit)
13
+
14
+ ## Installation
15
+
16
+ ### Option 1: From npm (recommended)
17
+ ```bash
18
+ clawdbot plugins install moltbot-dingtalk-stream
19
+ ```
20
+
21
+ ### Option 2: Manual installation
22
+ ```bash
23
+ git clone https://github.com/your-repo/moltbot-dingtalk-stream.git
24
+ cd moltbot-dingtalk-stream
25
+ npm install && npm run build
26
+ cp -r . ~/.clawdbot/extensions/moltbot-dingtalk-stream
27
+ clawdbot gateway restart
28
+ ```
29
+
30
+ ## Configuration
31
+
32
+ Configure in your `~/.clawdbot/clawdbot.json`:
33
+
34
+ ```json
35
+ {
36
+ "channels": {
37
+ "moltbot-dingtalk-stream": {
38
+ "enabled": true,
39
+ "clientId": "YOUR_APP_KEY",
40
+ "clientSecret": "YOUR_APP_SECRET"
41
+ }
42
+ }
43
+ }
44
+ ```
45
+
46
+ Or use environment variables:
47
+ ```bash
48
+ export DINGTALK_CLIENT_ID="YOUR_APP_KEY"
49
+ export DINGTALK_CLIENT_SECRET="YOUR_APP_SECRET"
50
+ ```
51
+
52
+ ### Multi-Account Setup
53
+
54
+ ```json
55
+ {
56
+ "channels": {
57
+ "moltbot-dingtalk-stream": {
58
+ "enabled": true,
59
+ "accounts": {
60
+ "default": {
61
+ "enabled": true,
62
+ "clientId": "APP_KEY_1",
63
+ "clientSecret": "APP_SECRET_1"
64
+ },
65
+ "work": {
66
+ "enabled": true,
67
+ "clientId": "APP_KEY_2",
68
+ "clientSecret": "APP_SECRET_2"
69
+ }
70
+ }
71
+ }
72
+ }
73
+ }
74
+ ```
75
+
76
+ ## DingTalk App Setup
77
+
78
+ 1. Go to [DingTalk Developer Console](https://open.dingtalk.com/)
79
+ 2. Create an **Enterprise Internal Application**
80
+ 3. Add **Robot** capability
81
+ 4. Enable **Stream Mode** (消息接收模式 → Stream模式)
82
+ 5. Copy the **AppKey** (as `clientId`) and **AppSecret** (as `clientSecret`)
83
+ 6. Publish and deploy the application
11
84
 
12
85
  ## Proactive Messaging (CLI)
13
86
 
14
- You can send messages to DingTalk conversations using the Clawdbot CLI. You need the `conversationId` (which you can find in the logs when a message is received).
87
+ Send messages to DingTalk conversations using the Clawdbot CLI:
15
88
 
16
89
  ```bash
90
+ # Send to a specific conversation
17
91
  clawdbot send --channel moltbot-dingtalk-stream --to <conversationId> "Hello from CLI"
92
+
93
+ # The conversationId can be found in logs when a message is received
18
94
  ```
19
95
 
20
96
  ## Troubleshooting
21
97
 
22
- - **Logs**: Check `~/.clawdbot/logs/gateway.log` for debug information.
23
- - **Connection**: Ensure your server has outbound internet access to DingTalk servers.
24
- - **Permissions**: Verify your DingTalk app has the necessary robot permissions.
25
-
26
- ## Quick Start
27
-
28
- 1. Install the plugin:
29
- ```bash
30
- moltbot plugins install moltbot-dingtalk-stream
31
- ```
32
-
33
- 2. Configure in your moltbot config:
34
- ```json
35
- {
36
- "channels": {
37
- "moltbot-dingtalk-stream": {
38
- "accounts": {
39
- "default": {
40
- "enabled": true,
41
- "clientId": "YOUR_APP_KEY",
42
- "clientSecret": "YOUR_APP_SECRET"
43
- }
44
- }
45
- }
46
- }
47
- }
48
- ```
49
-
50
- 3. Set up your DingTalk app:
51
- - Create an enterprise internal app at [DingTalk Developer Console](https://open.dingtalk.com/)
52
- - Add Robot capability with **Stream Mode** enabled
53
- - Use the AppKey as `clientId` and AppSecret as `clientSecret`
54
-
55
- ## Documentation
56
-
57
- See [DEVELOPMENT.md](./DEVELOPMENT.md) for detailed setup and configuration.
98
+ | Issue | Solution |
99
+ |-------|----------|
100
+ | No messages received | Check if Stream Mode is enabled in DingTalk app settings |
101
+ | Connection failed | Verify `clientId` and `clientSecret` are correct |
102
+ | Reply not sent | Ensure the bot has been messaged first (webhook is per-session) |
103
+ | Permission denied | Check app permissions in DingTalk Developer Console |
104
+
105
+ ### Debug Logs
106
+
107
+ ```bash
108
+ clawdbot logs --follow
109
+ ```
110
+
111
+ Look for `[default] DingTalk Stream client connected` to confirm connection.
112
+
113
+ ## Architecture
114
+
115
+ ```
116
+ ┌─────────────────┐ WebSocket ┌──────────────────┐
117
+ │ DingTalk API │ ◄─────────────────► │ Clawdbot Plugin │
118
+ │ (Stream Mode) │ │ (This Plugin) │
119
+ └─────────────────┘ └──────────────────┘
120
+
121
+
122
+ ┌──────────────────┐
123
+ │ Clawdbot Agent │
124
+ │ (AI Processing) │
125
+ └──────────────────┘
126
+ ```
58
127
 
59
128
  ## License
60
129
 
61
- MIT
130
+ MIT
131
+
132
+ ## Changelog
133
+
134
+ See [CHANGELOG.md](./CHANGELOG.md) for release history.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "moltbot-dingtalk-stream",
3
3
  "name": "DingTalk Stream Channel",
4
- "version": "1.0.8",
4
+ "version": "1.0.0",
5
5
  "description": "Custom channel for integrating Moltbot with DingTalk (Stream Mode)",
6
6
  "author": "Jack",
7
7
  "license": "MIT",
package/dist/index.d.ts CHANGED
@@ -1,38 +1,179 @@
1
+ import { type ClawdbotCoreRuntime } from "./runtime.js";
2
+ import { DingTalkConfigSchema, type ClawdbotConfig, type ResolvedDingTalkAccount } from "./schema.js";
1
3
  interface ClawdbotPluginApi {
2
4
  config: ClawdbotConfig;
3
- logger: any;
4
- runtime: any;
5
- postMessage(params: any): Promise<void>;
5
+ logger: Console;
6
+ runtime: ClawdbotCoreRuntime;
6
7
  registerChannel(opts: {
7
- plugin: any;
8
+ plugin: ChannelPlugin;
8
9
  }): void;
9
- registerService(service: any): void;
10
+ registerService?(service: unknown): void;
10
11
  }
11
- interface ClawdbotConfig {
12
- channels?: {
13
- 'moltbot-dingtalk-stream'?: {
14
- accounts?: {
15
- [key: string]: DingTalkAccountConfig;
16
- };
12
+ interface GatewayContext {
13
+ account: ResolvedDingTalkAccount;
14
+ cfg: ClawdbotConfig;
15
+ runtime: ClawdbotCoreRuntime;
16
+ abortSignal?: AbortSignal;
17
+ log?: {
18
+ info: (msg: string) => void;
19
+ warn: (msg: string) => void;
20
+ error: (msg: string) => void;
21
+ debug?: (msg: string) => void;
22
+ };
23
+ setStatus?: (status: Record<string, unknown>) => void;
24
+ statusSink?: (patch: {
25
+ lastInboundAt?: number;
26
+ lastOutboundAt?: number;
27
+ }) => void;
28
+ }
29
+ interface ChannelPlugin {
30
+ id: string;
31
+ meta: {
32
+ id: string;
33
+ label: string;
34
+ selectionLabel: string;
35
+ docsPath: string;
36
+ docsLabel: string;
37
+ blurb: string;
38
+ order: number;
39
+ aliases: string[];
40
+ };
41
+ capabilities: {
42
+ chatTypes: readonly string[];
43
+ media?: boolean;
44
+ threads?: boolean;
45
+ };
46
+ reload: {
47
+ configPrefixes: string[];
48
+ };
49
+ configSchema: typeof DingTalkConfigSchema;
50
+ config: {
51
+ listAccountIds: (cfg: ClawdbotConfig) => string[];
52
+ resolveAccount: (cfg: ClawdbotConfig, accountId?: string) => ResolvedDingTalkAccount;
53
+ defaultAccountId: (cfg: ClawdbotConfig) => string;
54
+ setAccountEnabled: (opts: {
55
+ cfg: ClawdbotConfig;
56
+ accountId: string;
57
+ enabled: boolean;
58
+ }) => ClawdbotConfig;
59
+ deleteAccount: (opts: {
60
+ cfg: ClawdbotConfig;
61
+ accountId: string;
62
+ }) => ClawdbotConfig;
63
+ isConfigured: (account: ResolvedDingTalkAccount) => boolean;
64
+ describeAccount: (account: ResolvedDingTalkAccount) => Record<string, unknown>;
65
+ };
66
+ security?: {
67
+ resolveDmPolicy: (opts: {
68
+ cfg: ClawdbotConfig;
69
+ accountId?: string;
70
+ account: ResolvedDingTalkAccount;
71
+ }) => {
72
+ policy: string;
73
+ allowFrom: string[];
74
+ allowFromPath: string;
75
+ normalizeEntry: (raw: string) => string;
17
76
  };
18
- [key: string]: any;
77
+ };
78
+ mentions?: {
79
+ stripPatterns: () => string[];
80
+ };
81
+ groups?: {
82
+ resolveRequireMention: (opts: {
83
+ cfg: ClawdbotConfig;
84
+ accountId?: string;
85
+ }) => boolean;
86
+ };
87
+ messaging?: {
88
+ normalizeTarget: (target: string) => string;
89
+ targetResolver?: {
90
+ looksLikeId: (id: string) => boolean;
91
+ hint: string;
92
+ };
93
+ };
94
+ setup?: {
95
+ resolveAccountId: (opts: {
96
+ accountId?: string;
97
+ }) => string;
98
+ applyAccountName: (opts: {
99
+ cfg: ClawdbotConfig;
100
+ accountId: string;
101
+ name?: string;
102
+ }) => ClawdbotConfig;
103
+ validateInput: (opts: {
104
+ accountId: string;
105
+ input: SetupInput;
106
+ }) => string | null;
107
+ applyAccountConfig: (opts: {
108
+ cfg: ClawdbotConfig;
109
+ accountId: string;
110
+ input: SetupInput;
111
+ }) => ClawdbotConfig;
112
+ };
113
+ outbound: {
114
+ deliveryMode: "direct";
115
+ textChunkLimit?: number;
116
+ sendText: (opts: {
117
+ to: string;
118
+ text: string;
119
+ accountId?: string;
120
+ deps?: Record<string, unknown>;
121
+ replyToId?: string;
122
+ }) => Promise<{
123
+ channel: string;
124
+ ok: boolean;
125
+ error?: string;
126
+ }>;
127
+ sendMedia?: (opts: {
128
+ to: string;
129
+ text: string;
130
+ mediaUrl: string;
131
+ accountId?: string;
132
+ }) => Promise<{
133
+ channel: string;
134
+ ok: boolean;
135
+ error?: string;
136
+ }>;
137
+ };
138
+ status?: {
139
+ defaultRuntime: {
140
+ accountId: string;
141
+ running: boolean;
142
+ lastStartAt: null;
143
+ lastStopAt: null;
144
+ lastError: null;
145
+ };
146
+ probeAccount: (opts: {
147
+ account: ResolvedDingTalkAccount;
148
+ timeoutMs?: number;
149
+ }) => Promise<{
150
+ ok: boolean;
151
+ error?: string;
152
+ bot?: {
153
+ name?: string;
154
+ };
155
+ }>;
156
+ buildAccountSnapshot: (opts: {
157
+ account: ResolvedDingTalkAccount;
158
+ runtime?: Record<string, unknown>;
159
+ probe?: Record<string, unknown>;
160
+ }) => Record<string, unknown>;
161
+ };
162
+ gateway: {
163
+ startAccount: (ctx: GatewayContext) => Promise<void>;
19
164
  };
20
165
  }
21
- interface DingTalkAccountConfig {
22
- enabled?: boolean;
23
- clientId: string;
24
- clientSecret: string;
25
- webhookUrl?: string;
166
+ interface SetupInput {
26
167
  name?: string;
168
+ clientId?: string;
169
+ clientSecret?: string;
170
+ useEnv?: boolean;
27
171
  }
172
+ export declare const dingtalkPlugin: ChannelPlugin;
28
173
  declare const plugin: {
29
174
  id: string;
30
175
  name: string;
31
176
  description: string;
32
- configSchema: {
33
- type: "object";
34
- properties: {};
35
- };
36
177
  register(api: ClawdbotPluginApi): void;
37
178
  };
38
179
  export default plugin;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,UAAU,iBAAiB;IACzB,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,GAAG,CAAC;IACZ,OAAO,EAAE,GAAG,CAAC;IACb,WAAW,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,eAAe,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,GAAG,CAAA;KAAE,GAAG,IAAI,CAAC;IAC7C,eAAe,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC;CACrC;AAED,UAAU,cAAc;IACtB,QAAQ,CAAC,EAAE;QACT,yBAAyB,CAAC,EAAE;YAC1B,QAAQ,CAAC,EAAE;gBACT,CAAC,GAAG,EAAE,MAAM,GAAG,qBAAqB,CAAC;aACtC,CAAC;SACH,CAAC;QACF,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,CAAC;CACH;AAED,UAAU,qBAAqB;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAiVD,QAAA,MAAM,MAAM;;;;;;;;kBAQI,iBAAiB;CAIhC,CAAC;AAEF,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}