DotCraft Weixin Channel Adapter
@dotcraft/channel-weixin connects Tencent iLink (WeChat bot API) to DotCraft via the external channel protocol over WebSocket.
Feature Summary
- WebSocket transport to DotCraft AppServer
- QR-based interactive setup for first login
- Session persistence under module-scoped state directory
- Streaming turn delivery and approval handling
/newcommand support to start a fresh conversation- Real file/image tools:
WeixinSendFileToCurrentChat,WeixinSendImageToCurrentChat - Structured
file/imagedelivery with local path or base64 sources - Weixin iLink does not expose a Markdown rendering entry, so regular replies and media captions are flattened to plain text
Installation
bash
cd sdk/typescript
npm install
npm run build:all1) Workspace Config (.craft/config.json)
Merge config.example.json into workspace .craft/config.json to enable the weixin external channel:
json
{
"AppServer": {
"Mode": "stdioAndWebSocket",
"WebSocket": {
"Host": "127.0.0.1",
"Port": 9100,
"Token": ""
}
},
"ExternalChannels": {
"weixin": {
"enabled": true,
"transport": "websocket"
}
}
}2) Adapter Config (.craft/weixin.json)
Create .craft/weixin.json in your target workspace:
json
{
"dotcraft": {
"wsUrl": "ws://127.0.0.1:9100/ws",
"token": ""
},
"weixin": {
"apiBaseUrl": "https://ilinkai.weixin.qq.com",
"pollIntervalMs": 3000,
"pollTimeoutMs": 30000,
"approvalTimeoutMs": 120000,
"botType": "3"
}
}Field notes:
dotcraft.wsUrl: DotCraft AppServer WebSocket endpointdotcraft.token: optional AppServer tokenweixin.apiBaseUrl: iLink API base URLweixin.pollIntervalMs: optional interval between polling cyclesweixin.pollTimeoutMs: optional long-poll timeoutweixin.approvalTimeoutMs: optional approval timeoutweixin.botType: optional bot type for QR login API
3) CLI Usage
Primary mode:
bash
npx dotcraft-channel-weixin --workspace /path/to/workspaceOptional config override:
bash
npx dotcraft-channel-weixin --workspace /path/to/workspace --config /custom/weixin.json4) Interactive Setup (QR Login)
- First run with no saved session transitions to
authRequired - In terminal mode, QR is rendered in the terminal
- After scan confirmation, adapter transitions to
ready - When session expires, lifecycle transitions
authExpired -> authRequired, then QR login is required again
5) State and Temp Layout
The module stores data under workspace .craft/:
- Persistent state:
.craft/state/weixin-standard/- credentials, sync cursor, context tokens
- Temporary artifacts:
.craft/tmp/weixin-standard/- QR URL and QR image artifacts
6) Host Integration
Hosts should import module contract exports and observe lifecycle:
typescript
import { manifest, createModule } from "@dotcraft/channel-weixin";
const instance = createModule({
workspaceRoot: "/path/to/workspace",
craftPath: "/path/to/workspace/.craft",
channelName: "weixin",
moduleId: "weixin-standard",
});
instance.onStatusChange((status, error) => {
// status: configMissing | configInvalid | starting | authRequired | authExpired | ready | stopped
});
await instance.start();Development Notes
- Build all TypeScript packages:
cd sdk/typescript && npm run build:all
- Run all tests:
cd sdk/typescript && npm run test:all
- Run this package tests only:
npm run test --workspace @dotcraft/channel-weixin
- Dry-run package contents:
cd sdk/typescript/packages/channel-weixin && npm pack --dry-run