<retrieval_status>not_ready</retrieval_status>

<task_id>brvw09cjd</task_id>

<task_type>local_bash</task_type>

<status>running</status>

<output>
Log file: /tmp/openclaw/openclaw-2026-03-10.log
2026-03-10T05:42:45.452Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Starting gateway
2026-03-10T05:42:45.453Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] API config: markdownSupport=true
2026-03-10T05:42:45.454Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Image server disabled (no imageServerBaseUrl configured)
2026-03-10T05:42:45.456Z info [session-store] Loaded session for default: sessionId=3bd0ccb9-0788-4916-b68a-b523d1fb8c63, lastSeq=11, age=4s
2026-03-10T05:42:45.458Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Restored session from storage: sessionId=3bd0ccb9-0788-4916-b68a-b523d1fb8c63, lastSeq=11, intentLevel=0
2026-03-10T05:42:45.459Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] ✅ Access token obtained successfully
2026-03-10T05:42:45.460Z info [qqbot-api] >>> GET https://api.sgroup.qq.com/gateway (timeout: 30000ms)
2026-03-10T05:42:45.461Z info [qqbot-api] >>> Headers: {
  "Authorization": "QQBot 2BmW7jZDOfAdAwc3aSxlfC-BN0O323Mz2VzOabnhaLkpi4n8-5gNNW3D9Kvq-2lpoinyP5fkLFD2fEw",
  "Content-Type": "application/json"
}
2026-03-10T05:42:45.464Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Message processor stopped
2026-03-10T05:42:45.489Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] WebSocket closed: 1005
2026-03-10T05:42:45.650Z info [qqbot-api] <<< Status: 200 OK
2026-03-10T05:42:45.652Z info [qqbot-api] <<< Headers: {
  "access-control-allow-credentials": "true",
  "access-control-allow-headers": "DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,authorization",
  "access-control-allow-methods": "GET, POST, OPTIONS",
  "connection": "keep-alive",
  "content-encoding": "gzip",
  "content-type": "application/json",
  "date": "Tue, 10 Mar 2026 05:42:45 GMT",
  "server": "TAPISIX/2.2.2",
  "transfer-encoding": "chunked",
  "trpc-trans-info": "{\"CallerMethod\":\"R0VUfC9nYXRld2F5\",\"oidb_head\":\"CIW77fwOSlkILBJPMkJtVzdqWkRPZkFkQXdjM2FTeGxmQy1CTjBPMzIzTXoyVnpPYWJuaGFMa3BpNG44LTVnTk5XM0Q5S3ZxLTJscG9pbnlQNWZrTEZEMmZFdxiJ2ryLBw==\",\"traceparent\":\"MDAtNzY1ZDg2MWEyMWI5ODMyMmY4NjU1MTVmY2JjNzIyNzMtNmJlYzUzYzY2YjQyYTU0OS0wMQ==\"}",
  "vary": "Accept-Encoding",
  "x-content-type-options": "nosniff",
  "x-tps-trace-id": "765d861a21b98322f865515fcbc72273"
}
2026-03-10T05:42:45.654Z info [qqbot-api] <<< Body: {"url":"wss://api.sgroup.qq.com/websocket"}
2026-03-10T05:42:45.655Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Connecting to wss://api.sgroup.qq.com/websocket
2026-03-10T05:42:45.710Z debug cron {"module":"cron","storePath":"/root/.openclaw/cron/jobs.json"} {"nextAt":1773154800000,"delayMs":60000,"clamped":true} cron: timer armed
2026-03-10T05:42:45.806Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] WebSocket connected
2026-03-10T05:42:45.808Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Message processor started
2026-03-10T05:42:45.809Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot-api] Background token refresh started
2026-03-10T05:42:45.810Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot-api] Token valid, next refresh in 5250s
2026-03-10T05:42:45.812Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=10 t=undefined
2026-03-10T05:42:45.813Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Hello received
2026-03-10T05:42:45.814Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Attempting to resume session 3bd0ccb9-0788-4916-b68a-b523d1fb8c63
2026-03-10T05:42:45.893Z info [session-store] Saved session for default: sessionId=3bd0ccb9-0788-4916-b68a-b523d1fb8c63, lastSeq=12
2026-03-10T05:42:45.894Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=0 t=RESUMED
2026-03-10T05:42:45.895Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Session resumed
2026-03-10T05:42:46.892Z info [session-store] Saved session for default: sessionId=3bd0ccb9-0788-4916-b68a-b523d1fb8c63, lastSeq=12
2026-03-10T05:43:27.066Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:43:27.423Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:43:27.425Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:43:45.738Z debug cron {"module":"cron","storePath":"/root/.openclaw/cron/jobs.json"} {"nextAt":1773154800000,"delayMs":60000,"clamped":true} cron: timer armed
2026-03-10T05:44:08.315Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:44:08.367Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:44:08.368Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:44:45.742Z debug cron {"module":"cron","storePath":"/root/.openclaw/cron/jobs.json"} {"nextAt":1773154800000,"delayMs":60000,"clamped":true} cron: timer armed
2026-03-10T05:44:49.567Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:44:49.649Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:44:49.651Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:45:30.816Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:45:30.879Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:45:30.881Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:45:45.744Z debug cron {"module":"cron","storePath":"/root/.openclaw/cron/jobs.json"} {"nextAt":1773154800000,"delayMs":60000,"clamped":true} cron: timer armed
2026-03-10T05:46:12.066Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:46:12.137Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:46:12.138Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:46:45.748Z debug cron {"module":"cron","storePath":"/root/.openclaw/cron/jobs.json"} {"nextAt":1773154800000,"delayMs":60000,"clamped":true} cron: timer armed
2026-03-10T05:46:53.317Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:46:53.372Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:46:53.374Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:47:34.567Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:47:34.646Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:47:34.648Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:47:45.751Z debug cron {"module":"cron","storePath":"/root/.openclaw/cron/jobs.json"} {"nextAt":1773154800000,"delayMs":60000,"clamped":true} cron: timer armed
2026-03-10T05:48:15.817Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:48:15.867Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:48:15.868Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:48:45.785Z debug cron {"module":"cron","storePath":"/root/.openclaw/cron/jobs.json"} {"nextAt":1773154800000,"delayMs":60000,"clamped":true} cron: timer armed
2026-03-10T05:48:57.067Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:48:57.181Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:48:57.183Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:49:38.318Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:49:38.389Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:49:38.390Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:49:45.788Z debug cron {"module":"cron","storePath":"/root/.openclaw/cron/jobs.json"} {"nextAt":1773154800000,"delayMs":60000,"clamped":true} cron: timer armed
2026-03-10T05:50:19.568Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:50:19.617Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:50:19.618Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:50:45.790Z debug cron {"module":"cron","storePath":"/root/.openclaw/cron/jobs.json"} {"nextAt":1773154800000,"delayMs":60000,"clamped":true} cron: timer armed
2026-03-10T05:51:00.819Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:51:00.881Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:51:00.883Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:51:42.070Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:51:42.125Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:51:42.126Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:51:45.792Z debug cron {"module":"cron","storePath":"/root/.openclaw/cron/jobs.json"} {"nextAt":1773154800000,"delayMs":60000,"clamped":true} cron: timer armed
2026-03-10T05:52:15.197Z info gateway/channels/feishu {"subsystem":"gateway/channels/feishu"} feishu[default]: received message from ou_8ca9ac9fe1a34d3b8b0ecd90127565cc in oc_e55560217ad628cc5e539e1885b883be (p2p)
2026-03-10T05:52:15.209Z info gateway/channels/feishu {"subsystem":"gateway/channels/feishu"} feishu[default]: dispatching to agent (session=agent:main:feishu:direct:ou_8ca9ac9fe1a34d3b8b0ecd90127565cc)
2026-03-10T05:52:15.252Z warn skills {"subsystem":"skills"} plugin skill path not found (qqbot): /root/.openclaw/extensions/qqbot/skills/qqbot-cron
2026-03-10T05:52:15.253Z warn skills {"subsystem":"skills"} plugin skill path not found (qqbot): /root/.openclaw/extensions/qqbot/skills/qqbot-media
2026-03-10T05:52:15.375Z debug skills {"subsystem":"skills"} {"rawName":"coding-agent","sanitized":"/coding_agent"} Sanitized skill command name "coding-agent" to "/coding_agent".
2026-03-10T05:52:15.377Z debug skills {"subsystem":"skills"} {"rawName":"openai-whisper","sanitized":"/openai_whisper"} Sanitized skill command name "openai-whisper" to "/openai_whisper".
2026-03-10T05:52:15.378Z debug skills {"subsystem":"skills"} {"rawName":"skill-creator","sanitized":"/skill_creator"} Sanitized skill command name "skill-creator" to "/skill_creator".
2026-03-10T05:52:15.379Z debug skills {"subsystem":"skills"} {"rawName":"video-frames","sanitized":"/video_frames"} Sanitized skill command name "video-frames" to "/video_frames".
2026-03-10T05:52:15.381Z debug skills {"subsystem":"skills"} {"rawName":"knowledge-management","sanitized":"/knowledge_management"} Sanitized skill command name "knowledge-management" to "/knowledge_management".
2026-03-10T05:52:15.382Z debug skills {"subsystem":"skills"} {"rawName":"memory-management","sanitized":"/memory_management"} Sanitized skill command name "memory-management" to "/memory_management".
2026-03-10T05:52:15.383Z debug skills {"subsystem":"skills"} {"rawName":"find-skills","sanitized":"/find_skills"} Sanitized skill command name "find-skills" to "/find_skills".
2026-03-10T05:52:15.384Z debug skills {"subsystem":"skills"} {"rawName":"proactive-agent","sanitized":"/proactive_agent"} Sanitized skill command name "proactive-agent" to "/proactive_agent".
2026-03-10T05:52:15.385Z debug skills {"subsystem":"skills"} {"rawName":"self-improvement","sanitized":"/self_improvement"} Sanitized skill command name "self-improvement" to "/self_improvement".
2026-03-10T05:52:15.459Z warn skills {"subsystem":"skills"} plugin skill path not found (qqbot): /root/.openclaw/extensions/qqbot/skills/qqbot-cron
2026-03-10T05:52:15.460Z warn skills {"subsystem":"skills"} plugin skill path not found (qqbot): /root/.openclaw/extensions/qqbot/skills/qqbot-media
2026-03-10T05:52:15.472Z debug diagnostic {"subsystem":"diagnostic"} lane enqueue: lane=session:agent:main:feishu:direct:ou_8ca9ac9fe1a34d3b8b0ecd90127565cc queueSize=1
2026-03-10T05:52:15.473Z debug diagnostic {"subsystem":"diagnostic"} lane dequeue: lane=session:agent:main:feishu:direct:ou_8ca9ac9fe1a34d3b8b0ecd90127565cc waitMs=2 queueSize=0
2026-03-10T05:52:15.475Z debug diagnostic {"subsystem":"diagnostic"} lane enqueue: lane=main queueSize=1
2026-03-10T05:52:15.476Z debug diagnostic {"subsystem":"diagnostic"} lane dequeue: lane=main waitMs=1 queueSize=0
2026-03-10T05:52:15.541Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run start: runId=c159dd75-324a-4b0c-a716-193d08c50737 sessionId=0a8a41eb-47d4-42d2-80c9-e8f3b0443f3a provider=volcengine model=glm-4.7 thinking=off messageChannel=feishu
2026-03-10T05:52:15.611Z info web_search: no provider configured, auto-detected "perplexity" from available API keys
2026-03-10T05:52:15.646Z debug diagnostic {"subsystem":"diagnostic"} run registered: sessionId=0a8a41eb-47d4-42d2-80c9-e8f3b0443f3a totalActive=1
2026-03-10T05:52:15.647Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run prompt start: runId=c159dd75-324a-4b0c-a716-193d08c50737 sessionId=0a8a41eb-47d4-42d2-80c9-e8f3b0443f3a
2026-03-10T05:52:15.653Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run agent start: runId=c159dd75-324a-4b0c-a716-193d08c50737
2026-03-10T05:52:23.319Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:52:23.375Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:52:23.376Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:52:35.207Z info gateway/channels/feishu {"subsystem":"gateway/channels/feishu"} feishu: skipping duplicate message om_x100b55cf562c78a0c44365e53c2bf8b
2026-03-10T05:52:36.227Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run agent end: runId=c159dd75-324a-4b0c-a716-193d08c50737 isError=false
2026-03-10T05:52:36.229Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run prompt end: runId=c159dd75-324a-4b0c-a716-193d08c50737 sessionId=0a8a41eb-47d4-42d2-80c9-e8f3b0443f3a durationMs=20582
2026-03-10T05:52:36.232Z debug diagnostic {"subsystem":"diagnostic"} run cleared: sessionId=0a8a41eb-47d4-42d2-80c9-e8f3b0443f3a totalActive=0
2026-03-10T05:52:36.236Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run done: runId=c159dd75-324a-4b0c-a716-193d08c50737 sessionId=0a8a41eb-47d4-42d2-80c9-e8f3b0443f3a durationMs=20757 aborted=false
2026-03-10T05:52:36.237Z debug diagnostic {"subsystem":"diagnostic"} lane task done: lane=main durationMs=20760 active=0 queued=0
2026-03-10T05:52:36.238Z debug diagnostic {"subsystem":"diagnostic"} lane task done: lane=session:agent:main:feishu:direct:ou_8ca9ac9fe1a34d3b8b0ecd90127565cc durationMs=20764 active=0 queued=0
2026-03-10T05:52:37.911Z info gateway/channels/feishu {"subsystem":"gateway/channels/feishu"} feishu[default]: dispatch complete (queuedFinal=true, replies=1)
2026-03-10T05:52:45.456Z info gateway/health-monitor {"subsystem":"gateway/health-monitor"} [qqbot:default] health-monitor: restarting (reason: stuck)
2026-03-10T05:52:45.460Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot-api] Background token refresh stopped
2026-03-10T05:52:45.462Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Starting gateway
2026-03-10T05:52:45.464Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] API config: markdownSupport=true
2026-03-10T05:52:45.467Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Image server disabled (no imageServerBaseUrl configured)
2026-03-10T05:52:45.469Z info [session-store] Session expired for default, age: 599s
2026-03-10T05:52:45.471Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] ✅ Access token obtained successfully
2026-03-10T05:52:45.474Z info [qqbot-api] >>> GET https://api.sgroup.qq.com/gateway (timeout: 30000ms)
2026-03-10T05:52:45.475Z info [qqbot-api] >>> Headers: {
  "Authorization": "QQBot 2BmW7jZDOfAdAwc3aSxlfC-BN0O323Mz2VzOabnhaLkpi4n8-5gNNW3D9Kvq-2lpoinyP5fkLFD2fEw",
  "Content-Type": "application/json"
}
2026-03-10T05:52:45.479Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Message processor stopped
2026-03-10T05:52:45.497Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] WebSocket closed: 1005
2026-03-10T05:52:45.700Z info [qqbot-api] <<< Status: 200 OK
2026-03-10T05:52:45.702Z info [qqbot-api] <<< Headers: {
  "access-control-allow-credentials": "true",
  "access-control-allow-headers": "DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,authorization",
  "access-control-allow-methods": "GET, POST, OPTIONS",
  "connection": "keep-alive",
  "content-encoding": "gzip",
  "content-type": "application/json",
  "date": "Tue, 10 Mar 2026 05:52:45 GMT",
  "server": "TAPISIX/2.2.2",
  "transfer-encoding": "chunked",
  "trpc-trans-info": "{\"CallerMethod\":\"R0VUfC9nYXRld2F5\",\"oidb_head\":\"CIW77fwOSlkILBJPMkJtVzdqWkRPZkFkQXdjM2FTeGxmQy1CTjBPMzIzTXoyVnpPYWJuaGFMa3BpNG44LTVnTk5XM0Q5S3ZxLTJscG9pbnlQNWZrTEZEMmZFdxiJ2ryLBw==\",\"traceparent\":\"MDAtNDkzY2I2YWRjNWM2ODgxNWQzNjQ1MGYyYzZmNzNhZWUtM2Y3MDg0YjI5MmZmYzFmOC0wMQ==\"}",
  "vary": "Accept-Encoding",
  "x-content-type-options": "nosniff",
  "x-tps-trace-id": "493cb6adc5c68815d36450f2c6f73aee"
}
2026-03-10T05:52:45.704Z info [qqbot-api] <<< Body: {"url":"wss://api.sgroup.qq.com/websocket"}
2026-03-10T05:52:45.705Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Connecting to wss://api.sgroup.qq.com/websocket
2026-03-10T05:52:45.795Z debug cron {"module":"cron","storePath":"/root/.openclaw/cron/jobs.json"} {"nextAt":1773154800000,"delayMs":60000,"clamped":true} cron: timer armed
2026-03-10T05:52:45.888Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] WebSocket connected
2026-03-10T05:52:45.890Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Message processor started
2026-03-10T05:52:45.891Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot-api] Background token refresh started
2026-03-10T05:52:45.893Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot-api] Token valid, next refresh in 4641s
2026-03-10T05:52:45.895Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=10 t=undefined
2026-03-10T05:52:45.897Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Hello received
2026-03-10T05:52:45.898Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Sending identify with intents: 1107300352 (群聊+私信+频道)
2026-03-10T05:52:46.020Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=0 t=READY
2026-03-10T05:52:46.022Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Ready with 群聊+私信+频道, session: 04baa4f0-76e7-45e1-8a8b-d17ac54c55af
2026-03-10T05:52:46.023Z info [session-store] Saved session for default: sessionId=04baa4f0-76e7-45e1-8a8b-d17ac54c55af, lastSeq=1
2026-03-10T05:52:46.024Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Gateway ready
2026-03-10T05:53:15.184Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] WebSocket closed: 1006
2026-03-10T05:53:15.185Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Reconnecting in 1000ms (attempt 1)
2026-03-10T05:53:16.186Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] ✅ Access token obtained successfully
2026-03-10T05:53:16.188Z info [qqbot-api] >>> GET https://api.sgroup.qq.com/gateway (timeout: 30000ms)
2026-03-10T05:53:16.189Z info [qqbot-api] >>> Headers: {
  "Authorization": "QQBot 2BmW7jZDOfAdAwc3aSxlfC-BN0O323Mz2VzOabnhaLkpi4n8-5gNNW3D9Kvq-2lpoinyP5fkLFD2fEw",
  "Content-Type": "application/json"
}
2026-03-10T05:53:16.405Z info [qqbot-api] <<< Status: 200 OK
2026-03-10T05:53:16.407Z info [qqbot-api] <<< Headers: {
  "access-control-allow-credentials": "true",
  "access-control-allow-headers": "DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,authorization",
  "access-control-allow-methods": "GET, POST, OPTIONS",
  "connection": "keep-alive",
  "content-encoding": "gzip",
  "content-type": "application/json",
  "date": "Tue, 10 Mar 2026 05:53:16 GMT",
  "server": "TAPISIX/2.2.2",
  "transfer-encoding": "chunked",
  "trpc-trans-info": "{\"CallerMethod\":\"R0VUfC9nYXRld2F5\",\"oidb_head\":\"CIW77fwOSlkILBJPMkJtVzdqWkRPZkFkQXdjM2FTeGxmQy1CTjBPMzIzTXoyVnpPYWJuaGFMa3BpNG44LTVnTk5XM0Q5S3ZxLTJscG9pbnlQNWZrTEZEMmZFdxiJ2ryLBw==\",\"traceparent\":\"MDAtYWQ3NTMwMzM4N2ZiZWU2MDgzZDdhY2RlZDQ0ZjJiNDEtNTc2NjZhYWE5OTQyMDBkMi0wMQ==\"}",
  "vary": "Accept-Encoding",
  "x-content-type-options": "nosniff",
  "x-tps-trace-id": "ad75303387fbee6083d7acded44f2b41"
}
2026-03-10T05:53:16.408Z info [qqbot-api] <<< Body: {"url":"wss://api.sgroup.qq.com/websocket"}
2026-03-10T05:53:16.409Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Connecting to wss://api.sgroup.qq.com/websocket
2026-03-10T05:53:16.561Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] WebSocket connected
2026-03-10T05:53:16.562Z info [qqbot-api] Background token refresh already running
2026-03-10T05:53:16.563Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=10 t=undefined
2026-03-10T05:53:16.564Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Hello received
2026-03-10T05:53:16.566Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Attempting to resume session 04baa4f0-76e7-45e1-8a8b-d17ac54c55af
2026-03-10T05:53:16.631Z info [session-store] Saved session for default: sessionId=04baa4f0-76e7-45e1-8a8b-d17ac54c55af, lastSeq=2
2026-03-10T05:53:16.632Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=0 t=RESUMED
2026-03-10T05:53:16.633Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Session resumed
2026-03-10T05:53:17.630Z info [session-store] Saved session for default: sessionId=04baa4f0-76e7-45e1-8a8b-d17ac54c55af, lastSeq=2
2026-03-10T05:53:20.698Z info gateway/channels/feishu {"subsystem":"gateway/channels/feishu"} feishu[default]: received message from ou_8ca9ac9fe1a34d3b8b0ecd90127565cc in oc_e55560217ad628cc5e539e1885b883be (p2p)
2026-03-10T05:53:20.701Z info gateway/channels/feishu {"subsystem":"gateway/channels/feishu"} feishu[default]: dispatching to agent (session=agent:main:feishu:direct:ou_8ca9ac9fe1a34d3b8b0ecd90127565cc)
2026-03-10T05:53:20.733Z warn skills {"subsystem":"skills"} plugin skill path not found (qqbot): /root/.openclaw/extensions/qqbot/skills/qqbot-cron
2026-03-10T05:53:20.735Z warn skills {"subsystem":"skills"} plugin skill path not found (qqbot): /root/.openclaw/extensions/qqbot/skills/qqbot-media
2026-03-10T05:53:20.799Z warn skills {"subsystem":"skills"} plugin skill path not found (qqbot): /root/.openclaw/extensions/qqbot/skills/qqbot-cron
2026-03-10T05:53:20.800Z warn skills {"subsystem":"skills"} plugin skill path not found (qqbot): /root/.openclaw/extensions/qqbot/skills/qqbot-media
2026-03-10T05:53:20.803Z debug diagnostic {"subsystem":"diagnostic"} lane enqueue: lane=session:agent:main:feishu:direct:ou_8ca9ac9fe1a34d3b8b0ecd90127565cc queueSize=1
2026-03-10T05:53:20.804Z debug diagnostic {"subsystem":"diagnostic"} lane dequeue: lane=session:agent:main:feishu:direct:ou_8ca9ac9fe1a34d3b8b0ecd90127565cc waitMs=1 queueSize=0
2026-03-10T05:53:20.806Z debug diagnostic {"subsystem":"diagnostic"} lane enqueue: lane=main queueSize=1
2026-03-10T05:53:20.807Z debug diagnostic {"subsystem":"diagnostic"} lane dequeue: lane=main waitMs=1 queueSize=0
2026-03-10T05:53:20.832Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run start: runId=477af092-9c18-4310-8fa2-a56335971893 sessionId=0a8a41eb-47d4-42d2-80c9-e8f3b0443f3a provider=volcengine model=glm-4.7 thinking=off messageChannel=feishu
2026-03-10T05:53:20.844Z info web_search: no provider configured, auto-detected "perplexity" from available API keys
2026-03-10T05:53:20.892Z debug diagnostic {"subsystem":"diagnostic"} run registered: sessionId=0a8a41eb-47d4-42d2-80c9-e8f3b0443f3a totalActive=1
2026-03-10T05:53:20.894Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run prompt start: runId=477af092-9c18-4310-8fa2-a56335971893 sessionId=0a8a41eb-47d4-42d2-80c9-e8f3b0443f3a
2026-03-10T05:53:20.899Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run agent start: runId=477af092-9c18-4310-8fa2-a56335971893
2026-03-10T05:53:25.163Z warn plugins {"subsystem":"plugins"} [plugins] plugins.allow is empty; discovered non-bundled plugins may auto-load: adp-openclaw (/root/.openclaw/extensions/adp-openclaw/index.ts), ddingtalk (/root/.openclaw/extensions/ddingtalk/index.ts), qqbot (/root/.openclaw/extensions/qqbot/index.ts), wecom (/root/.openclaw/extensions/wecom/index.ts). Set plugins.allow to explicit trusted ids.
2026-03-10T05:53:27.602Z info plugins {"subsystem":"plugins"} feishu_doc: Registered feishu_doc, feishu_app_scopes
2026-03-10T05:53:27.604Z info plugins {"subsystem":"plugins"} feishu_wiki: Registered feishu_wiki tool
2026-03-10T05:53:27.606Z info plugins {"subsystem":"plugins"} feishu_drive: Registered feishu_drive tool
2026-03-10T05:53:27.607Z debug plugins {"subsystem":"plugins"} feishu_perm: perm tool disabled in config (default: false)
2026-03-10T05:53:27.609Z info plugins {"subsystem":"plugins"} feishu_bitable: Registered bitable tools
2026-03-10T05:53:27.641Z warn plugins {"subsystem":"plugins"} [plugins] qqbot: loaded without install/load-path provenance; treat as untracked local code and pin trust via plugins.allow or install records (/root/.openclaw/extensions/qqbot/index.ts)
2026-03-10T05:53:28.335Z info gateway/ws {"subsystem":"gateway/ws"} ⇄ res ✓ health 367ms conn=ce70f5ea…ecf8 id=8e8fc485…90ae
2026-03-10T05:53:34.075Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run tool start: runId=477af092-9c18-4310-8fa2-a56335971893 tool=read toolCallId=call_li1aj42a068btqzo43pffebs
2026-03-10T05:53:34.088Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run tool end: runId=477af092-9c18-4310-8fa2-a56335971893 tool=read toolCallId=call_li1aj42a068btqzo43pffebs
2026-03-10T05:53:39.183Z info gateway/channels/feishu {"subsystem":"gateway/channels/feishu"} feishu: skipping duplicate message om_x100b55cf53cfacb0c31beb7a958b488
2026-03-10T05:53:45.819Z debug cron {"module":"cron","storePath":"/root/.openclaw/cron/jobs.json"} {"nextAt":1773154800000,"delayMs":60000,"clamped":true} cron: timer armed
2026-03-10T05:53:53.659Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run tool start: runId=477af092-9c18-4310-8fa2-a56335971893 tool=read toolCallId=call_rxihxak2m3u2oq62alnnhk8u
2026-03-10T05:53:53.663Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run tool end: runId=477af092-9c18-4310-8fa2-a56335971893 tool=read toolCallId=call_rxihxak2m3u2oq62alnnhk8u
2026-03-10T05:53:57.817Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:53:57.891Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:53:57.892Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:54:31.690Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run tool st
</output>

查看 OpenClaw 实时日志

Output:
Log file: /tmp/openclaw/openclaw-2026-03-10.log
2026-03-10T05:42:45.452Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Starting gateway
2026-03-10T05:42:45.453Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] API config: markdownSupport=true
2026-03-10T05:42:45.454Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Image server disabled (no imageServerBaseUrl configured)
2026-03-10T05:42:45.456Z info [session-store] Loaded session for default: sessionId=3bd0ccb9-0788-4916-b68a-b523d1fb8c63, lastSeq=11, age=4s
2026-03-10T05:42:45.458Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Restored session from storage: sessionId=3bd0ccb9-0788-4916-b68a-b523d1fb8c63, lastSeq=11, intentLevel=0
2026-03-10T05:42:45.459Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] ✅ Access token obtained successfully
2026-03-10T05:42:45.460Z info [qqbot-api] >>> GET https://api.sgroup.qq.com/gateway (timeout: 30000ms)
2026-03-10T05:42:45.461Z info [qqbot-api] >>> Headers: {
  "Authorization": "QQBot 2BmW7jZDOfAdAwc3aSxlfC-BN0O323Mz2VzOabnhaLkpi4n8-5gNNW3D9Kvq-2lpoinyP5fkLFD2fEw",
  "Content-Type": "application/json"
}
2026-03-10T05:42:45.464Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Message processor stopped
2026-03-10T05:42:45.489Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] WebSocket closed: 1005
2026-03-10T05:42:45.650Z info [qqbot-api] <<< Status: 200 OK
2026-03-10T05:42:45.652Z info [qqbot-api] <<< Headers: {
  "access-control-allow-credentials": "true",
  "access-control-allow-headers": "DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,authorization",
  "access-control-allow-methods": "GET, POST, OPTIONS",
  "connection": "keep-alive",
  "content-encoding": "gzip",
  "content-type": "application/json",
  "date": "Tue, 10 Mar 2026 05:42:45 GMT",
  "server": "TAPISIX/2.2.2",
  "transfer-encoding": "chunked",
  "trpc-trans-info": "{\"CallerMethod\":\"R0VUfC9nYXRld2F5\",\"oidb_head\":\"CIW77fwOSlkILBJPMkJtVzdqWkRPZkFkQXdjM2FTeGxmQy1CTjBPMzIzTXoyVnpPYWJuaGFMa3BpNG44LTVnTk5XM0Q5S3ZxLTJscG9pbnlQNWZrTEZEMmZFdxiJ2ryLBw==\",\"traceparent\":\"MDAtNzY1ZDg2MWEyMWI5ODMyMmY4NjU1MTVmY2JjNzIyNzMtNmJlYzUzYzY2YjQyYTU0OS0wMQ==\"}",
  "vary": "Accept-Encoding",
  "x-content-type-options": "nosniff",
  "x-tps-trace-id": "765d861a21b98322f865515fcbc72273"
}
2026-03-10T05:42:45.654Z info [qqbot-api] <<< Body: {"url":"wss://api.sgroup.qq.com/websocket"}
2026-03-10T05:42:45.655Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Connecting to wss://api.sgroup.qq.com/websocket
2026-03-10T05:42:45.710Z debug cron {"module":"cron","storePath":"/root/.openclaw/cron/jobs.json"} {"nextAt":1773154800000,"delayMs":60000,"clamped":true} cron: timer armed
2026-03-10T05:42:45.806Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] WebSocket connected
2026-03-10T05:42:45.808Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Message processor started
2026-03-10T05:42:45.809Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot-api] Background token refresh started
2026-03-10T05:42:45.810Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot-api] Token valid, next refresh in 5250s
2026-03-10T05:42:45.812Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=10 t=undefined
2026-03-10T05:42:45.813Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Hello received
2026-03-10T05:42:45.814Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Attempting to resume session 3bd0ccb9-0788-4916-b68a-b523d1fb8c63
2026-03-10T05:42:45.893Z info [session-store] Saved session for default: sessionId=3bd0ccb9-0788-4916-b68a-b523d1fb8c63, lastSeq=12
2026-03-10T05:42:45.894Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=0 t=RESUMED
2026-03-10T05:42:45.895Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Session resumed
2026-03-10T05:42:46.892Z info [session-store] Saved session for default: sessionId=3bd0ccb9-0788-4916-b68a-b523d1fb8c63, lastSeq=12
2026-03-10T05:43:27.066Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:43:27.423Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:43:27.425Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:43:45.738Z debug cron {"module":"cron","storePath":"/root/.openclaw/cron/jobs.json"} {"nextAt":1773154800000,"delayMs":60000,"clamped":true} cron: timer armed
2026-03-10T05:44:08.315Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:44:08.367Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:44:08.368Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:44:45.742Z debug cron {"module":"cron","storePath":"/root/.openclaw/cron/jobs.json"} {"nextAt":1773154800000,"delayMs":60000,"clamped":true} cron: timer armed
2026-03-10T05:44:49.567Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:44:49.649Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:44:49.651Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:45:30.816Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:45:30.879Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:45:30.881Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:45:45.744Z debug cron {"module":"cron","storePath":"/root/.openclaw/cron/jobs.json"} {"nextAt":1773154800000,"delayMs":60000,"clamped":true} cron: timer armed
2026-03-10T05:46:12.066Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:46:12.137Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:46:12.138Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:46:45.748Z debug cron {"module":"cron","storePath":"/root/.openclaw/cron/jobs.json"} {"nextAt":1773154800000,"delayMs":60000,"clamped":true} cron: timer armed
2026-03-10T05:46:53.317Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:46:53.372Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:46:53.374Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:47:34.567Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:47:34.646Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:47:34.648Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:47:45.751Z debug cron {"module":"cron","storePath":"/root/.openclaw/cron/jobs.json"} {"nextAt":1773154800000,"delayMs":60000,"clamped":true} cron: timer armed
2026-03-10T05:48:15.817Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:48:15.867Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:48:15.868Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:48:45.785Z debug cron {"module":"cron","storePath":"/root/.openclaw/cron/jobs.json"} {"nextAt":1773154800000,"delayMs":60000,"clamped":true} cron: timer armed
2026-03-10T05:48:57.067Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:48:57.181Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:48:57.183Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:49:38.318Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:49:38.389Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:49:38.390Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:49:45.788Z debug cron {"module":"cron","storePath":"/root/.openclaw/cron/jobs.json"} {"nextAt":1773154800000,"delayMs":60000,"clamped":true} cron: timer armed
2026-03-10T05:50:19.568Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:50:19.617Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:50:19.618Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:50:45.790Z debug cron {"module":"cron","storePath":"/root/.openclaw/cron/jobs.json"} {"nextAt":1773154800000,"delayMs":60000,"clamped":true} cron: timer armed
2026-03-10T05:51:00.819Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:51:00.881Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:51:00.883Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:51:42.070Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:51:42.125Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:51:42.126Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:51:45.792Z debug cron {"module":"cron","storePath":"/root/.openclaw/cron/jobs.json"} {"nextAt":1773154800000,"delayMs":60000,"clamped":true} cron: timer armed
2026-03-10T05:52:15.197Z info gateway/channels/feishu {"subsystem":"gateway/channels/feishu"} feishu[default]: received message from ou_8ca9ac9fe1a34d3b8b0ecd90127565cc in oc_e55560217ad628cc5e539e1885b883be (p2p)
2026-03-10T05:52:15.209Z info gateway/channels/feishu {"subsystem":"gateway/channels/feishu"} feishu[default]: dispatching to agent (session=agent:main:feishu:direct:ou_8ca9ac9fe1a34d3b8b0ecd90127565cc)
2026-03-10T05:52:15.252Z warn skills {"subsystem":"skills"} plugin skill path not found (qqbot): /root/.openclaw/extensions/qqbot/skills/qqbot-cron
2026-03-10T05:52:15.253Z warn skills {"subsystem":"skills"} plugin skill path not found (qqbot): /root/.openclaw/extensions/qqbot/skills/qqbot-media
2026-03-10T05:52:15.375Z debug skills {"subsystem":"skills"} {"rawName":"coding-agent","sanitized":"/coding_agent"} Sanitized skill command name "coding-agent" to "/coding_agent".
2026-03-10T05:52:15.377Z debug skills {"subsystem":"skills"} {"rawName":"openai-whisper","sanitized":"/openai_whisper"} Sanitized skill command name "openai-whisper" to "/openai_whisper".
2026-03-10T05:52:15.378Z debug skills {"subsystem":"skills"} {"rawName":"skill-creator","sanitized":"/skill_creator"} Sanitized skill command name "skill-creator" to "/skill_creator".
2026-03-10T05:52:15.379Z debug skills {"subsystem":"skills"} {"rawName":"video-frames","sanitized":"/video_frames"} Sanitized skill command name "video-frames" to "/video_frames".
2026-03-10T05:52:15.381Z debug skills {"subsystem":"skills"} {"rawName":"knowledge-management","sanitized":"/knowledge_management"} Sanitized skill command name "knowledge-management" to "/knowledge_management".
2026-03-10T05:52:15.382Z debug skills {"subsystem":"skills"} {"rawName":"memory-management","sanitized":"/memory_management"} Sanitized skill command name "memory-management" to "/memory_management".
2026-03-10T05:52:15.383Z debug skills {"subsystem":"skills"} {"rawName":"find-skills","sanitized":"/find_skills"} Sanitized skill command name "find-skills" to "/find_skills".
2026-03-10T05:52:15.384Z debug skills {"subsystem":"skills"} {"rawName":"proactive-agent","sanitized":"/proactive_agent"} Sanitized skill command name "proactive-agent" to "/proactive_agent".
2026-03-10T05:52:15.385Z debug skills {"subsystem":"skills"} {"rawName":"self-improvement","sanitized":"/self_improvement"} Sanitized skill command name "self-improvement" to "/self_improvement".
2026-03-10T05:52:15.459Z warn skills {"subsystem":"skills"} plugin skill path not found (qqbot): /root/.openclaw/extensions/qqbot/skills/qqbot-cron
2026-03-10T05:52:15.460Z warn skills {"subsystem":"skills"} plugin skill path not found (qqbot): /root/.openclaw/extensions/qqbot/skills/qqbot-media
2026-03-10T05:52:15.472Z debug diagnostic {"subsystem":"diagnostic"} lane enqueue: lane=session:agent:main:feishu:direct:ou_8ca9ac9fe1a34d3b8b0ecd90127565cc queueSize=1
2026-03-10T05:52:15.473Z debug diagnostic {"subsystem":"diagnostic"} lane dequeue: lane=session:agent:main:feishu:direct:ou_8ca9ac9fe1a34d3b8b0ecd90127565cc waitMs=2 queueSize=0
2026-03-10T05:52:15.475Z debug diagnostic {"subsystem":"diagnostic"} lane enqueue: lane=main queueSize=1
2026-03-10T05:52:15.476Z debug diagnostic {"subsystem":"diagnostic"} lane dequeue: lane=main waitMs=1 queueSize=0
2026-03-10T05:52:15.541Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run start: runId=c159dd75-324a-4b0c-a716-193d08c50737 sessionId=0a8a41eb-47d4-42d2-80c9-e8f3b0443f3a provider=volcengine model=glm-4.7 thinking=off messageChannel=feishu
2026-03-10T05:52:15.611Z info web_search: no provider configured, auto-detected "perplexity" from available API keys
2026-03-10T05:52:15.646Z debug diagnostic {"subsystem":"diagnostic"} run registered: sessionId=0a8a41eb-47d4-42d2-80c9-e8f3b0443f3a totalActive=1
2026-03-10T05:52:15.647Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run prompt start: runId=c159dd75-324a-4b0c-a716-193d08c50737 sessionId=0a8a41eb-47d4-42d2-80c9-e8f3b0443f3a
2026-03-10T05:52:15.653Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run agent start: runId=c159dd75-324a-4b0c-a716-193d08c50737
2026-03-10T05:52:23.319Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:52:23.375Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:52:23.376Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:52:35.207Z info gateway/channels/feishu {"subsystem":"gateway/channels/feishu"} feishu: skipping duplicate message om_x100b55cf562c78a0c44365e53c2bf8b
2026-03-10T05:52:36.227Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run agent end: runId=c159dd75-324a-4b0c-a716-193d08c50737 isError=false
2026-03-10T05:52:36.229Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run prompt end: runId=c159dd75-324a-4b0c-a716-193d08c50737 sessionId=0a8a41eb-47d4-42d2-80c9-e8f3b0443f3a durationMs=20582
2026-03-10T05:52:36.232Z debug diagnostic {"subsystem":"diagnostic"} run cleared: sessionId=0a8a41eb-47d4-42d2-80c9-e8f3b0443f3a totalActive=0
2026-03-10T05:52:36.236Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run done: runId=c159dd75-324a-4b0c-a716-193d08c50737 sessionId=0a8a41eb-47d4-42d2-80c9-e8f3b0443f3a durationMs=20757 aborted=false
2026-03-10T05:52:36.237Z debug diagnostic {"subsystem":"diagnostic"} lane task done: lane=main durationMs=20760 active=0 queued=0
2026-03-10T05:52:36.238Z debug diagnostic {"subsystem":"diagnostic"} lane task done: lane=session:agent:main:feishu:direct:ou_8ca9ac9fe1a34d3b8b0ecd90127565cc durationMs=20764 active=0 queued=0
2026-03-10T05:52:37.911Z info gateway/channels/feishu {"subsystem":"gateway/channels/feishu"} feishu[default]: dispatch complete (queuedFinal=true, replies=1)
2026-03-10T05:52:45.456Z info gateway/health-monitor {"subsystem":"gateway/health-monitor"} [qqbot:default] health-monitor: restarting (reason: stuck)
2026-03-10T05:52:45.460Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot-api] Background token refresh stopped
2026-03-10T05:52:45.462Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Starting gateway
2026-03-10T05:52:45.464Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] API config: markdownSupport=true
2026-03-10T05:52:45.467Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Image server disabled (no imageServerBaseUrl configured)
2026-03-10T05:52:45.469Z info [session-store] Session expired for default, age: 599s
2026-03-10T05:52:45.471Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] ✅ Access token obtained successfully
2026-03-10T05:52:45.474Z info [qqbot-api] >>> GET https://api.sgroup.qq.com/gateway (timeout: 30000ms)
2026-03-10T05:52:45.475Z info [qqbot-api] >>> Headers: {
  "Authorization": "QQBot 2BmW7jZDOfAdAwc3aSxlfC-BN0O323Mz2VzOabnhaLkpi4n8-5gNNW3D9Kvq-2lpoinyP5fkLFD2fEw",
  "Content-Type": "application/json"
}
2026-03-10T05:52:45.479Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Message processor stopped
2026-03-10T05:52:45.497Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] WebSocket closed: 1005
2026-03-10T05:52:45.700Z info [qqbot-api] <<< Status: 200 OK
2026-03-10T05:52:45.702Z info [qqbot-api] <<< Headers: {
  "access-control-allow-credentials": "true",
  "access-control-allow-headers": "DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,authorization",
  "access-control-allow-methods": "GET, POST, OPTIONS",
  "connection": "keep-alive",
  "content-encoding": "gzip",
  "content-type": "application/json",
  "date": "Tue, 10 Mar 2026 05:52:45 GMT",
  "server": "TAPISIX/2.2.2",
  "transfer-encoding": "chunked",
  "trpc-trans-info": "{\"CallerMethod\":\"R0VUfC9nYXRld2F5\",\"oidb_head\":\"CIW77fwOSlkILBJPMkJtVzdqWkRPZkFkQXdjM2FTeGxmQy1CTjBPMzIzTXoyVnpPYWJuaGFMa3BpNG44LTVnTk5XM0Q5S3ZxLTJscG9pbnlQNWZrTEZEMmZFdxiJ2ryLBw==\",\"traceparent\":\"MDAtNDkzY2I2YWRjNWM2ODgxNWQzNjQ1MGYyYzZmNzNhZWUtM2Y3MDg0YjI5MmZmYzFmOC0wMQ==\"}",
  "vary": "Accept-Encoding",
  "x-content-type-options": "nosniff",
  "x-tps-trace-id": "493cb6adc5c68815d36450f2c6f73aee"
}
2026-03-10T05:52:45.704Z info [qqbot-api] <<< Body: {"url":"wss://api.sgroup.qq.com/websocket"}
2026-03-10T05:52:45.705Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Connecting to wss://api.sgroup.qq.com/websocket
2026-03-10T05:52:45.795Z debug cron {"module":"cron","storePath":"/root/.openclaw/cron/jobs.json"} {"nextAt":1773154800000,"delayMs":60000,"clamped":true} cron: timer armed
2026-03-10T05:52:45.888Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] WebSocket connected
2026-03-10T05:52:45.890Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Message processor started
2026-03-10T05:52:45.891Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot-api] Background token refresh started
2026-03-10T05:52:45.893Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot-api] Token valid, next refresh in 4641s
2026-03-10T05:52:45.895Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=10 t=undefined
2026-03-10T05:52:45.897Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Hello received
2026-03-10T05:52:45.898Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Sending identify with intents: 1107300352 (群聊+私信+频道)
2026-03-10T05:52:46.020Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=0 t=READY
2026-03-10T05:52:46.022Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Ready with 群聊+私信+频道, session: 04baa4f0-76e7-45e1-8a8b-d17ac54c55af
2026-03-10T05:52:46.023Z info [session-store] Saved session for default: sessionId=04baa4f0-76e7-45e1-8a8b-d17ac54c55af, lastSeq=1
2026-03-10T05:52:46.024Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Gateway ready
2026-03-10T05:53:15.184Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] WebSocket closed: 1006
2026-03-10T05:53:15.185Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Reconnecting in 1000ms (attempt 1)
2026-03-10T05:53:16.186Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] ✅ Access token obtained successfully
2026-03-10T05:53:16.188Z info [qqbot-api] >>> GET https://api.sgroup.qq.com/gateway (timeout: 30000ms)
2026-03-10T05:53:16.189Z info [qqbot-api] >>> Headers: {
  "Authorization": "QQBot 2BmW7jZDOfAdAwc3aSxlfC-BN0O323Mz2VzOabnhaLkpi4n8-5gNNW3D9Kvq-2lpoinyP5fkLFD2fEw",
  "Content-Type": "application/json"
}
2026-03-10T05:53:16.405Z info [qqbot-api] <<< Status: 200 OK
2026-03-10T05:53:16.407Z info [qqbot-api] <<< Headers: {
  "access-control-allow-credentials": "true",
  "access-control-allow-headers": "DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,authorization",
  "access-control-allow-methods": "GET, POST, OPTIONS",
  "connection": "keep-alive",
  "content-encoding": "gzip",
  "content-type": "application/json",
  "date": "Tue, 10 Mar 2026 05:53:16 GMT",
  "server": "TAPISIX/2.2.2",
  "transfer-encoding": "chunked",
  "trpc-trans-info": "{\"CallerMethod\":\"R0VUfC9nYXRld2F5\",\"oidb_head\":\"CIW77fwOSlkILBJPMkJtVzdqWkRPZkFkQXdjM2FTeGxmQy1CTjBPMzIzTXoyVnpPYWJuaGFMa3BpNG44LTVnTk5XM0Q5S3ZxLTJscG9pbnlQNWZrTEZEMmZFdxiJ2ryLBw==\",\"traceparent\":\"MDAtYWQ3NTMwMzM4N2ZiZWU2MDgzZDdhY2RlZDQ0ZjJiNDEtNTc2NjZhYWE5OTQyMDBkMi0wMQ==\"}",
  "vary": "Accept-Encoding",
  "x-content-type-options": "nosniff",
  "x-tps-trace-id": "ad75303387fbee6083d7acded44f2b41"
}
2026-03-10T05:53:16.408Z info [qqbot-api] <<< Body: {"url":"wss://api.sgroup.qq.com/websocket"}
2026-03-10T05:53:16.409Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Connecting to wss://api.sgroup.qq.com/websocket
2026-03-10T05:53:16.561Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] WebSocket connected
2026-03-10T05:53:16.562Z info [qqbot-api] Background token refresh already running
2026-03-10T05:53:16.563Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=10 t=undefined
2026-03-10T05:53:16.564Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Hello received
2026-03-10T05:53:16.566Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Attempting to resume session 04baa4f0-76e7-45e1-8a8b-d17ac54c55af
2026-03-10T05:53:16.631Z info [session-store] Saved session for default: sessionId=04baa4f0-76e7-45e1-8a8b-d17ac54c55af, lastSeq=2
2026-03-10T05:53:16.632Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=0 t=RESUMED
2026-03-10T05:53:16.633Z info gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Session resumed
2026-03-10T05:53:17.630Z info [session-store] Saved session for default: sessionId=04baa4f0-76e7-45e1-8a8b-d17ac54c55af, lastSeq=2
2026-03-10T05:53:20.698Z info gateway/channels/feishu {"subsystem":"gateway/channels/feishu"} feishu[default]: received message from ou_8ca9ac9fe1a34d3b8b0ecd90127565cc in oc_e55560217ad628cc5e539e1885b883be (p2p)
2026-03-10T05:53:20.701Z info gateway/channels/feishu {"subsystem":"gateway/channels/feishu"} feishu[default]: dispatching to agent (session=agent:main:feishu:direct:ou_8ca9ac9fe1a34d3b8b0ecd90127565cc)
2026-03-10T05:53:20.733Z warn skills {"subsystem":"skills"} plugin skill path not found (qqbot): /root/.openclaw/extensions/qqbot/skills/qqbot-cron
2026-03-10T05:53:20.735Z warn skills {"subsystem":"skills"} plugin skill path not found (qqbot): /root/.openclaw/extensions/qqbot/skills/qqbot-media
2026-03-10T05:53:20.799Z warn skills {"subsystem":"skills"} plugin skill path not found (qqbot): /root/.openclaw/extensions/qqbot/skills/qqbot-cron
2026-03-10T05:53:20.800Z warn skills {"subsystem":"skills"} plugin skill path not found (qqbot): /root/.openclaw/extensions/qqbot/skills/qqbot-media
2026-03-10T05:53:20.803Z debug diagnostic {"subsystem":"diagnostic"} lane enqueue: lane=session:agent:main:feishu:direct:ou_8ca9ac9fe1a34d3b8b0ecd90127565cc queueSize=1
2026-03-10T05:53:20.804Z debug diagnostic {"subsystem":"diagnostic"} lane dequeue: lane=session:agent:main:feishu:direct:ou_8ca9ac9fe1a34d3b8b0ecd90127565cc waitMs=1 queueSize=0
2026-03-10T05:53:20.806Z debug diagnostic {"subsystem":"diagnostic"} lane enqueue: lane=main queueSize=1
2026-03-10T05:53:20.807Z debug diagnostic {"subsystem":"diagnostic"} lane dequeue: lane=main waitMs=1 queueSize=0
2026-03-10T05:53:20.832Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run start: runId=477af092-9c18-4310-8fa2-a56335971893 sessionId=0a8a41eb-47d4-42d2-80c9-e8f3b0443f3a provider=volcengine model=glm-4.7 thinking=off messageChannel=feishu
2026-03-10T05:53:20.844Z info web_search: no provider configured, auto-detected "perplexity" from available API keys
2026-03-10T05:53:20.892Z debug diagnostic {"subsystem":"diagnostic"} run registered: sessionId=0a8a41eb-47d4-42d2-80c9-e8f3b0443f3a totalActive=1
2026-03-10T05:53:20.894Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run prompt start: runId=477af092-9c18-4310-8fa2-a56335971893 sessionId=0a8a41eb-47d4-42d2-80c9-e8f3b0443f3a
2026-03-10T05:53:20.899Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run agent start: runId=477af092-9c18-4310-8fa2-a56335971893
2026-03-10T05:53:25.163Z warn plugins {"subsystem":"plugins"} [plugins] plugins.allow is empty; discovered non-bundled plugins may auto-load: adp-openclaw (/root/.openclaw/extensions/adp-openclaw/index.ts), ddingtalk (/root/.openclaw/extensions/ddingtalk/index.ts), qqbot (/root/.openclaw/extensions/qqbot/index.ts), wecom (/root/.openclaw/extensions/wecom/index.ts). Set plugins.allow to explicit trusted ids.
2026-03-10T05:53:27.602Z info plugins {"subsystem":"plugins"} feishu_doc: Registered feishu_doc, feishu_app_scopes
2026-03-10T05:53:27.604Z info plugins {"subsystem":"plugins"} feishu_wiki: Registered feishu_wiki tool
2026-03-10T05:53:27.606Z info plugins {"subsystem":"plugins"} feishu_drive: Registered feishu_drive tool
2026-03-10T05:53:27.607Z debug plugins {"subsystem":"plugins"} feishu_perm: perm tool disabled in config (default: false)
2026-03-10T05:53:27.609Z info plugins {"subsystem":"plugins"} feishu_bitable: Registered bitable tools
2026-03-10T05:53:27.641Z warn plugins {"subsystem":"plugins"} [plugins] qqbot: loaded without install/load-path provenance; treat as untracked local code and pin trust via plugins.allow or install records (/root/.openclaw/extensions/qqbot/index.ts)
2026-03-10T05:53:28.335Z info gateway/ws {"subsystem":"gateway/ws"} ⇄ res ✓ health 367ms conn=ce70f5ea…ecf8 id=8e8fc485…90ae
2026-03-10T05:53:34.075Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run tool start: runId=477af092-9c18-4310-8fa2-a56335971893 tool=read toolCallId=call_li1aj42a068btqzo43pffebs
2026-03-10T05:53:34.088Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run tool end: runId=477af092-9c18-4310-8fa2-a56335971893 tool=read toolCallId=call_li1aj42a068btqzo43pffebs
2026-03-10T05:53:39.183Z info gateway/channels/feishu {"subsystem":"gateway/channels/feishu"} feishu: skipping duplicate message om_x100b55cf53cfacb0c31beb7a958b488
2026-03-10T05:53:45.819Z debug cron {"module":"cron","storePath":"/root/.openclaw/cron/jobs.json"} {"nextAt":1773154800000,"delayMs":60000,"clamped":true} cron: timer armed
2026-03-10T05:53:53.659Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run tool start: runId=477af092-9c18-4310-8fa2-a56335971893 tool=read toolCallId=call_rxihxak2m3u2oq62alnnhk8u
2026-03-10T05:53:53.663Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run tool end: runId=477af092-9c18-4310-8fa2-a56335971893 tool=read toolCallId=call_rxihxak2m3u2oq62alnnhk8u
2026-03-10T05:53:57.817Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat sent
2026-03-10T05:53:57.891Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Received op=11 t=undefined
2026-03-10T05:53:57.892Z debug gateway/channels/qqbot {"subsystem":"gateway/channels/qqbot"} [qqbot:default] Heartbeat ACK
2026-03-10T05:54:31.690Z debug agent/embedded {"subsystem":"agent/embedded"} embedded run tool st


当前模型 claude-sonnet-4-6 负载已经达到上限，请稍后重试 (request id: 20260310135718155629701pRXgVHgb)


从日志中可以看出，QQ Bot 实际上是在正常连接和工作的！WebSocket 连接成功，发送了 identify 消息，然后收到了 READY 响应。但在之后，它断开连接了（code 1006），然后重连并恢复了会话。

日志显示：
1. ✅ Access token 获取成功
2. ✅ WebSocket 连接成功
3. ✅ 发送 identify 消息，监听群聊+私信+频道
4. ✅ 收到 READY 响应，gateway 准备好了
5. 然后 WebSocket 断开（code 1006），重连成功
6. 会话恢复成功

从当前状态来看，QQ Bot 正在运行。让我停止日志查看并检查一下目录信息，看看 qqbot 插件的配置。


Successfully stopped task: brvw09cjd (openclaw logs --follow 2>&1)


当前模型 claude-sonnet-4-6 负载已经达到上限，请稍后重试 (request id: 20260310135751989931924dY1Jkx5T)


从刚才的日志分析来看，QQ Bot 实际上在网络层面是正常连接和运行的，但是可能没有正确地处理消息或者没有正确地发送回复。我注意到有几个问题：

1. QQ Bot 插件没有安装信息，显示为 "loaded without install/load-path provenance"
2. 日志中有 warning 说找不到 qqbot-cron 和 qqbot-media 技能路径
3. 虽然连接成功，但可能没有正确配置或者技能缺失导致没有回复

让我检查一下 QQ Bot 插件的目录结构。


我来检查一下 QQ Bot 插件的目录结构和技能配置：


Bash

ls -la /root/.openclaw/extensions/qqbot/ 2>&1

查看 QQ Bot 插件目录


total 484
drwxr-xr-x   6 root root   4096 Feb 24 18:19 .
drwxr-xr-x   6 root root     69 Feb 24 18:20 ..
drwxr-xr-x   2 root root     26 Feb 24 18:19 bin
-rw-r--r--   1 root root    410 Feb 24 18:19 clawdbot.plugin.json
-rw-r--r--   1 root root    857 Feb 24 18:19 index.ts
-rw-r--r--   1 root root    410 Feb 24 18:19 moltbot.plugin.json
drwxr-xr-x 440 root root  12288 Feb 24 18:19 node_modules
-rw-r--r--   1 root root    410 Feb 24 18:19 openclaw.plugin.json
-rw-r--r--   1 root root   1115 Feb 24 18:19 package.json
-rw-r--r--   1 root root 421102 Feb 24 18:19 package-lock.json
-rw-r--r--   1 root root   5831 Feb 24 18:19 README.bak.md
-rw-r--r--   1 root root   7231 Feb 24 18:19 README.md
-rw-r--r--   1 root root   5962 Feb 24 18:19 README.zh.md
drwxr-xr-x   2 root root      6 Feb 28 21:10 skills
drwxr-xr-x   3 root root   4096 Feb 24 18:19 src
-rw-r--r--   1 root root    372 Feb 24 18:19 tsconfig.json


当前模型 claude-sonnet-4-6 负载已经达到上限，请稍后重试 (request id: 20260310135827496477584bR23NmyJ)


好的，我看到了 QQ Bot 插件目录，但是 `skills` 目录是空的（只有6字节）。让我检查一下 skills 目录里有什么，以及查看 QQ Bot 的主要代码。


ls -la /root/.openclaw/extensions/qqbot/skills/ 2>&1

查看 QQ Bot skills 目录


total 4
drwxr-xr-x 2 root root    6 Feb 28 21:10 .
drwxr-xr-x 6 root root 4096 Feb 24 18:19 ..


API Error: 500 {"error":{"type":"new_api_error","message":"当前模型 claude-sonnet-4-6 负载已经达到上限，请稍后重试 (request id: 20260310135902214872968pVeFAWRo)"},"type":"error"}


QQ Bot 的 skills 目录是空的！这就是为什么日志中会有 `plugin skill path not found (qqbot)` 的警告。让我查看一下 QQ Bot 的源代码，了解它应该需要什么。


     1→import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
     2→import { emptyPluginConfigSchema } from "openclaw/plugin-sdk";
     3→
     4→import { qqbotPlugin } from "./src/channel.js";
     5→import { setQQBotRuntime } from "./src/runtime.js";
     6→
     7→const plugin = {
     8→  id: "qqbot",
     9→  name: "QQ Bot",
    10→  description: "QQ Bot channel plugin",
    11→  configSchema: emptyPluginConfigSchema(),
    12→  register(api: OpenClawPluginApi) {
    13→    setQQBotRuntime(api.runtime);
    14→    api.registerChannel({ plugin: qqbotPlugin });
    15→  },
    16→};
    17→
    18→export default plugin;
    19→
    20→export { qqbotPlugin } from "./src/channel.js";
    21→export { setQQBotRuntime, getQQBotRuntime } from "./src/runtime.js";
    22→export { qqbotOnboardingAdapter } from "./src/onboarding.js";
    23→export * from "./src/types.js";
    24→export * from "./src/api.js";
    25→export * from "./src/config.js";
    26→export * from "./src/gateway.js";
    27→export * from "./src/outbound.js";
    28→

<system-reminder>
Whenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.
</system-reminder>

import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
import { emptyPluginConfigSchema } from "openclaw/plugin-sdk";

import { qqbotPlugin } from "./src/channel.js";
import { setQQBotRuntime } from "./src/runtime.js";

const plugin = {
  id: "qqbot",
  name: "QQ Bot",
  description: "QQ Bot channel plugin",
  configSchema: emptyPluginConfigSchema(),
  register(api: OpenClawPluginApi) {
    setQQBotRuntime(api.runtime);
    api.registerChannel({ plugin: qqbotPlugin });
  },
};

export default plugin;

export { qqbotPlugin } from "./src/channel.js";
export { setQQBotRuntime, getQQBotRuntime } from "./src/runtime.js";
export { qqbotOnboardingAdapter } from "./src/onboarding.js";
export * from "./src/types.js";
export * from "./src/api.js";
export * from "./src/config.js";
export * from "./src/gateway.js";
export * from "./src/outbound.js";


好的，让我看看 src 目录下的代码，了解 QQ Bot 是怎么工作的。


/root/.openclaw/extensions/qqbot/src/api.ts
/root/.openclaw/extensions/qqbot/src/utils/audio-convert.ts
/root/.openclaw/extensions/qqbot/src/utils/image-size.ts
/root/.openclaw/extensions/qqbot/src/utils/payload.ts
/root/.openclaw/extensions/qqbot/src/channel.ts
/root/.openclaw/extensions/qqbot/src/config.ts
/root/.openclaw/extensions/qqbot/src/gateway.ts
/root/.openclaw/extensions/qqbot/src/image-server.ts
/root/.openclaw/extensions/qqbot/src/known-users.ts
/root/.openclaw/extensions/qqbot/src/onboarding.ts
/root/.openclaw/extensions/qqbot/src/openclaw-plugin-sdk.d.ts
/root/.openclaw/extensions/qqbot/src/outbound.ts
/root/.openclaw/extensions/qqbot/src/proactive.ts
/root/.openclaw/extensions/qqbot/src/runtime.ts
/root/.openclaw/extensions/qqbot/src/session-store.ts
/root/.openclaw/extensions/qqbot/src/types.ts


好的，让我查看一下 QQ Bot 插件的主要 channel.ts 文件，看看它是怎样处理消息的。


     1→import {
     2→  type ChannelPlugin,
     3→  type OpenClawConfig,
     4→  applyAccountNameToChannelSection,
     5→  deleteAccountFromConfigSection,
     6→  setAccountEnabledInConfigSection,
     7→} from "openclaw/plugin-sdk";
     8→
     9→import type { ResolvedQQBotAccount } from "./types.js";
    10→import { DEFAULT_ACCOUNT_ID, listQQBotAccountIds, resolveQQBotAccount, applyQQBotAccountConfig, resolveDefaultQQBotAccountId } from "./config.js";
    11→import { sendText, sendMedia } from "./outbound.js";
    12→import { startGateway } from "./gateway.js";
    13→import { qqbotOnboardingAdapter } from "./onboarding.js";
    14→import { getQQBotRuntime } from "./runtime.js";
    15→
    16→/**
    17→ * 简单的文本分块函数
    18→ * 用于预先分块长文本
    19→ */
    20→function chunkText(text: string, limit: number): string[] {
    21→  if (text.length <= limit) return [text];
    22→
    23→  const chunks: string[] = [];
    24→  let remaining = text;
    25→
    26→  while (remaining.length > 0) {
    27→    if (remaining.length <= limit) {
    28→      chunks.push(remaining);
    29→      break;
    30→    }
    31→
    32→    // 尝试在换行处分割
    33→    let splitAt = remaining.lastIndexOf("\n", limit);
    34→    if (splitAt <= 0 || splitAt < limit * 0.5) {
    35→      // 没找到合适的换行，尝试在空格处分割
    36→      splitAt = remaining.lastIndexOf(" ", limit);
    37→    }
    38→    if (splitAt <= 0 || splitAt < limit * 0.5) {
    39→      // 还是没找到，强制在 limit 处分割
    40→      splitAt = limit;
    41→    }
    42→
    43→    chunks.push(remaining.slice(0, splitAt));
    44→    remaining = remaining.slice(splitAt).trimStart();
    45→  }
    46→
    47→  return chunks;
    48→}
    49→
    50→export const qqbotPlugin: ChannelPlugin<ResolvedQQBotAccount> = {
    51→  id: "qqbot",
    52→  meta: {
    53→    id: "qqbot",
    54→    label: "QQ Bot",
    55→    selectionLabel: "QQ Bot",
    56→    docsPath: "/docs/channels/qqbot",
    57→    blurb: "Connect to QQ via official QQ Bot API",
    58→    order: 50,
    59→  },
    60→  capabilities: {
    61→    chatTypes: ["direct", "group"],
    62→    media: true,
    63→    reactions: false,
    64→    threads: false,
    65→    /**
    66→     * blockStreaming: true 表示该 Channel 支持块流式
    67→     * 框架会收集流式响应，然后通过 deliver 回调发送
    68→     */
    69→    blockStreaming: false,
    70→  },
    71→  reload: { configPrefixes: ["channels.qqbot"] },
    72→  // CLI onboarding wizard
    73→  onboarding: qqbotOnboardingAdapter,
    74→  // 消息目标解析
    75→  messaging: {
    76→    normalizeTarget: (target) => {
    77→      // 支持格式: qqbot:c2c:xxx, qqbot:group:xxx, c2c:xxx, group:xxx, openid
    78→      const normalized = target.replace(/^qqbot:/i, "");
    79→      return { ok: true, to: normalized };
    80→    },
    81→    targetResolver: {
    82→      looksLikeId: (id) => {
    83→        // 先去掉 qqbot: 前缀
    84→        const normalized = id.replace(/^qqbot:/i, "");
    85→        // 支持 c2c:xxx, group:xxx, channel:xxx 格式
    86→        if (normalized.startsWith("c2c:") || normalized.startsWith("group:") || normalized.startsWith("channel:")) return true;
    87→        // 支持纯 openid（32位十六进制）
    88→        if (/^[A-F0-9]{32}$/i.test(normalized)) return true;
    89→        return false;
    90→      },
    91→      hint: "c2c:<openid> or group:<groupOpenid>",
    92→    },
    93→  },
    94→  config: {
    95→    listAccountIds: (cfg) => listQQBotAccountIds(cfg),
    96→    resolveAccount: (cfg, accountId) => resolveQQBotAccount(cfg, accountId),
    97→    defaultAccountId: (cfg) => resolveDefaultQQBotAccountId(cfg),
    98→    // 新增：设置账户启用状态
    99→    setAccountEnabled: ({ cfg, accountId, enabled }) =>
   100→      setAccountEnabledInConfigSection({
   101→        cfg,
   102→        sectionKey: "qqbot",
   103→        accountId,
   104→        enabled,
   105→        allowTopLevel: true,
   106→      }),
   107→    // 新增：删除账户
   108→    deleteAccount: ({ cfg, accountId }) =>
   109→      deleteAccountFromConfigSection({
   110→        cfg,
   111→        sectionKey: "qqbot",
   112→        accountId,
   113→        clearBaseFields: ["appId", "clientSecret", "clientSecretFile", "name"],
   114→      }),
   115→    isConfigured: (account) => Boolean(account?.appId && account?.clientSecret),
   116→    describeAccount: (account) => ({
   117→      accountId: account?.accountId ?? DEFAULT_ACCOUNT_ID,
   118→      name: account?.name,
   119→      enabled: account?.enabled ?? false,
   120→      configured: Boolean(account?.appId && account?.clientSecret),
   121→      tokenSource: account?.secretSource,
   122→    }),
   123→    // 关键：解析 allowFrom 配置，用于命令授权
   124→    resolveAllowFrom: ({ cfg, accountId }: { cfg: OpenClawConfig; accountId?: string }) => {
   125→      const account = resolveQQBotAccount(cfg, accountId);
   126→      const allowFrom = account.config?.allowFrom ?? [];
   127→      console.log(`[qqbot] resolveAllowFrom: accountId=${accountId}, allowFrom=${JSON.stringify(allowFrom)}`);
   128→      return allowFrom.map((entry: string | number) => String(entry));
   129→    },
   130→    // 格式化 allowFrom 条目（移除 qqbot: 前缀，统一大写）
   131→    formatAllowFrom: ({ allowFrom }: { allowFrom: Array<string | number> }) =>
   132→      allowFrom
   133→        .map((entry: string | number) => String(entry).trim())
   134→        .filter(Boolean)
   135→        .map((entry: string) => entry.replace(/^qqbot:/i, ""))
   136→        .map((entry: string) => entry.toUpperCase()), // QQ openid 是大写的
   137→  },
   138→  setup: {
   139→    // 新增：规范化账户 ID
   140→    resolveAccountId: ({ accountId }) => accountId?.trim().toLowerCase() || DEFAULT_ACCOUNT_ID,
   141→    // 新增：应用账户名称
   142→    applyAccountName: ({ cfg, accountId, name }) =>
   143→      applyAccountNameToChannelSection({
   144→        cfg,
   145→        channelKey: "qqbot",
   146→        accountId,
   147→        name,
   148→      }),
   149→    validateInput: ({ input }) => {
   150→      if (!input.token && !input.tokenFile && !input.useEnv) {
   151→        return "QQBot requires --token (format: appId:clientSecret) or --use-env";
   152→      }
   153→      return null;
   154→    },
   155→    applyAccountConfig: ({ cfg, accountId, input }) => {
   156→      let appId = "";
   157→      let clientSecret = "";
   158→
   159→      if (input.token) {
   160→        const parts = input.token.split(":");
   161→        if (parts.length === 2) {
   162→          appId = parts[0];
   163→          clientSecret = parts[1];
   164→        }
   165→      }
   166→
   167→      return applyQQBotAccountConfig(cfg, accountId, {
   168→        appId,
   169→        clientSecret,
   170→        clientSecretFile: input.tokenFile,
   171→        name: input.name,
   172→        imageServerBaseUrl: input.imageServerBaseUrl,
   173→      });
   174→    },
   175→  },
   176→  // Messaging 配置：用于解析目标地址
   177→  messaging: {
   178→    /**
   179→     * 规范化目标地址
   180→     * 支持以下格式：
   181→     * - qqbot:c2c:openid -> 私聊
   182→     * - qqbot:group:groupid -> 群聊
   183→     * - qqbot:channel:channelid -> 频道
   184→     * - c2c:openid -> 私聊
   185→     * - group:groupid -> 群聊
   186→     * - channel:channelid -> 频道
   187→     * - 纯 openid（32位十六进制）-> 私聊
   188→     */
   189→    normalizeTarget: (target: string) => {
   190→      // 去掉 qqbot: 前缀（如果有）
   191→      let id = target.replace(/^qqbot:/i, "");
   192→
   193→      // 检查是否是已知格式
   194→      if (id.startsWith("c2c:") || id.startsWith("group:") || id.startsWith("channel:")) {
   195→        return { ok: true, to: `qqbot:${id}` };
   196→      }
   197→
   198→      // 检查是否是纯 openid（32位十六进制，带连字符）
   199→      // QQ Bot OpenID 格式类似: 207A5B8339D01F6582911C014668B77B
   200→      const openIdPattern = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;
   201→      if (openIdPattern.test(id)) {
   202→        return { ok: true, to: `qqbot:c2c:${id}` };
   203→      }
   204→
   205→      // 不认识的格式
   206→      return {
   207→        ok: false,
   208→        error: `Invalid QQ Bot target format: "${target}". Expected: qqbot:c2c:openid, qqbot:group:groupid, or openid (UUID format)`
   209→      };
   210→    },
   211→    /**
   212→     * 目标解析器配置
   213→     * 用于判断一个目标 ID 是否看起来像 QQ Bot 的格式
   214→     */
   215→    targetResolver: {
   216→      /**
   217→       * 判断目标 ID 是否可能是 QQ Bot 格式
   218→       * 支持以下格式：
   219→       * - qqbot:c2c:xxx
   220→       * - qqbot:group:xxx
   221→       * - qqbot:channel:xxx
   222→       * - c2c:xxx
   223→       * - group:xxx
   224→       * - channel:xxx
   225→       * - UUID 格式的 openid
   226→       */
   227→      looksLikeId: (id: string): boolean => {
   228→        // 带 qqbot: 前缀的格式
   229→        if (/^qqbot:(c2c|group|channel):/i.test(id)) {
   230→          return true;
   231→        }
   232→        // 不带前缀但有类型标识
   233→        if (/^(c2c|group|channel):/i.test(id)) {
   234→          return true;
   235→        }
   236→        // UUID 格式的 openid（QQ Bot 的用户/群 ID 格式）
   237→        const openIdPattern = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;
   238→        return openIdPattern.test(id);
   239→      },
   240→      hint: "QQ Bot 目标格式: qqbot:c2c:openid (私聊) 或 qqbot:group:groupid (群聊)",
   241→    },
   242→  },
   243→  outbound: {
   244→    deliveryMode: "direct",
   245→    chunker: chunkText,
   246→    chunkerMode: "markdown",
   247→    textChunkLimit: 2000,
   248→    sendText: async ({ to, text, accountId, replyToId, cfg }) => {
   249→      const account = resolveQQBotAccount(cfg, accountId);
   250→      const result = await sendText({ to, text, accountId, replyToId, account });
   251→      return {
   252→        channel: "qqbot",
   253→        messageId: result.messageId,
   254→        error: result.error ? new Error(result.error) : undefined,
   255→      };
   256→    },
   257→    sendMedia: async ({ to, text, mediaUrl, accountId, replyToId, cfg }) => {
   258→      const account = resolveQQBotAccount(cfg, accountId);
   259→      const result = await sendMedia({ to, text: text ?? "", mediaUrl: mediaUrl ?? "", accountId, replyToId, account });
   260→      return {
   261→        channel: "qqbot",
   262→        messageId: result.messageId,
   263→        error: result.error ? new Error(result.error) : undefined,
   264→      };
   265→    },
   266→  },
   267→  gateway: {
   268→    startAccount: async (ctx) => {
   269→      const { account, abortSignal, log, cfg } = ctx;
   270→
   271→      log?.info(`[qqbot:${account.accountId}] Starting gateway`);
   272→
   273→      await startGateway({
   274→        account,
   275→        abortSignal,
   276→        cfg,
   277→        log,
   278→        onReady: () => {
   279→          log?.info(`[qqbot:${account.accountId}] Gateway ready`);
   280→          ctx.setStatus({
   281→            ...ctx.getStatus(),
   282→            running: true,
   283→            connected: true,
   284→            lastConnectedAt: Date.now(),
   285→          });
   286→        },
   287→        onError: (error) => {
   288→          log?.error(`[qqbot:${account.accountId}] Gateway error: ${error.message}`);
   289→          ctx.setStatus({
   290→            ...ctx.getStatus(),
   291→            lastError: error.message,
   292→          });
   293→        },
   294→      });
   295→    },
   296→    // 新增：登出账户（清除配置中的凭证）
   297→    logoutAccount: async ({ accountId, cfg }) => {
   298→      const nextCfg = { ...cfg } as OpenClawConfig;
   299→      const nextQQBot = cfg.channels?.qqbot ? { ...cfg.channels.qqbot } : undefined;
   300→      let cleared = false;
   301→      let changed = false;
   302→
   303→      if (nextQQBot) {
   304→        const qqbot = nextQQBot as Record<string, unknown>;
   305→        if (accountId === DEFAULT_ACCOUNT_ID && qqbot.clientSecret) {
   306→          delete qqbot.clientSecret;
   307→          cleared = true;
   308→          changed = true;
   309→        }
   310→        const accounts = qqbot.accounts as Record<string, Record<string, unknown>> | undefined;
   311→        if (accounts && accountId in accounts) {
   312→          const entry = accounts[accountId] as Record<string, unknown> | undefined;
   313→          if (entry && "clientSecret" in entry) {
   314→            delete entry.clientSecret;
   315→            cleared = true;
   316→            changed = true;
   317→          }
   318→          if (entry && Object.keys(entry).length === 0) {
   319→            delete accounts[accountId];
   320→            changed = true;
   321→          }
   322→        }
   323→      }
   324→
   325→      if (changed && nextQQBot) {
   326→        nextCfg.channels = { ...nextCfg.channels, qqbot: nextQQBot };
   327→        const runtime = getQQBotRuntime();
   328→        const configApi = runtime.config as { writeConfigFile: (cfg: OpenClawConfig) => Promise<void> };
   329→        await configApi.writeConfigFile(nextCfg);
   330→      }
   331→
   332→      const resolved = resolveQQBotAccount(changed ? nextCfg : cfg, accountId);
   333→      const loggedOut = resolved.secretSource === "none";
   334→      const envToken = Boolean(process.env.QQBOT_CLIENT_SECRET);
   335→
   336→      return { ok: true, cleared, envToken, loggedOut };
   337→    },
   338→  },
   339→  status: {
   340→    defaultRuntime: {
   341→      accountId: DEFAULT_ACCOUNT_ID,
   342→      running: false,
   343→      connected: false,
   344→      lastConnectedAt: null,
   345→      lastError: null,
   346→      lastInboundAt: null,
   347→      lastOutboundAt: null,
   348→    },
   349→    // 新增：构建通道摘要
   350→    buildChannelSummary: ({ snapshot }: { snapshot: Record<string, unknown> }) => ({
   351→      configured: snapshot.configured ?? false,
   352→      tokenSource: snapshot.tokenSource ?? "none",
   353→      running: snapshot.running ?? false,
   354→      connected: snapshot.connected ?? false,
   355→      lastConnectedAt: snapshot.lastConnectedAt ?? null,
   356→      lastError: snapshot.lastError ?? null,
   357→    }),
   358→    buildAccountSnapshot: ({ account, runtime }: { account?: ResolvedQQBotAccount; runtime?: Record<string, unknown> }) => ({
   359→      accountId: account?.accountId ?? DEFAULT_ACCOUNT_ID,
   360→      name: account?.name,
   361→      enabled: account?.enabled ?? false,
   362→      configured: Boolean(account?.appId && account?.clientSecret),
   363→      tokenSource: account?.secretSource,
   364→      running: runtime?.running ?? false,
   365→      connected: runtime?.connected ?? false,
   366→      lastConnectedAt: runtime?.lastConnectedAt ?? null,
   367→      lastError: runtime?.lastError ?? null,
   368→      lastInboundAt: runtime?.lastInboundAt ?? null,
   369→      lastOutboundAt: runtime?.lastOutboundAt ?? null,
   370→    }),
   371→  },
   372→};
   373→

<system-reminder>
Whenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.
</system-reminder>

import {
  type ChannelPlugin,
  type OpenClawConfig,
  applyAccountNameToChannelSection,
  deleteAccountFromConfigSection,
  setAccountEnabledInConfigSection,
} from "openclaw/plugin-sdk";

import type { ResolvedQQBotAccount } from "./types.js";
import { DEFAULT_ACCOUNT_ID, listQQBotAccountIds, resolveQQBotAccount, applyQQBotAccountConfig, resolveDefaultQQBotAccountId } from "./config.js";
import { sendText, sendMedia } from "./outbound.js";
import { startGateway } from "./gateway.js";
import { qqbotOnboardingAdapter } from "./onboarding.js";
import { getQQBotRuntime } from "./runtime.js";

/**
 * 简单的文本分块函数
 * 用于预先分块长文本
 */
function chunkText(text: string, limit: number): string[] {
  if (text.length <= limit) return [text];

  const chunks: string[] = [];
  let remaining = text;

  while (remaining.length > 0) {
    if (remaining.length <= limit) {
      chunks.push(remaining);
      break;
    }

    // 尝试在换行处分割
    let splitAt = remaining.lastIndexOf("\n", limit);
    if (splitAt <= 0 || splitAt < limit * 0.5) {
      // 没找到合适的换行，尝试在空格处分割
      splitAt = remaining.lastIndexOf(" ", limit);
    }
    if (splitAt <= 0 || splitAt < limit * 0.5) {
      // 还是没找到，强制在 limit 处分割
      splitAt = limit;
    }

    chunks.push(remaining.slice(0, splitAt));
    remaining = remaining.slice(splitAt).trimStart();
  }

  return chunks;
}

export const qqbotPlugin: ChannelPlugin<ResolvedQQBotAccount> = {
  id: "qqbot",
  meta: {
    id: "qqbot",
    label: "QQ Bot",
    selectionLabel: "QQ Bot",
    docsPath: "/docs/channels/qqbot",
    blurb: "Connect to QQ via official QQ Bot API",
    order: 50,
  },
  capabilities: {
    chatTypes: ["direct", "group"],
    media: true,
    reactions: false,
    threads: false,
    /**
     * blockStreaming: true 表示该 Channel 支持块流式
     * 框架会收集流式响应，然后通过 deliver 回调发送
     */
    blockStreaming: false,
  },
  reload: { configPrefixes: ["channels.qqbot"] },
  // CLI onboarding wizard
  onboarding: qqbotOnboardingAdapter,
  // 消息目标解析
  messaging: {
    normalizeTarget: (target) => {
      // 支持格式: qqbot:c2c:xxx, qqbot:group:xxx, c2c:xxx, group:xxx, openid
      const normalized = target.replace(/^qqbot:/i, "");
      return { ok: true, to: normalized };
    },
    targetResolver: {
      looksLikeId: (id) => {
        // 先去掉 qqbot: 前缀
        const normalized = id.replace(/^qqbot:/i, "");
        // 支持 c2c:xxx, group:xxx, channel:xxx 格式
        if (normalized.startsWith("c2c:") || normalized.startsWith("group:") || normalized.startsWith("channel:")) return true;
        // 支持纯 openid（32位十六进制）
        if (/^[A-F0-9]{32}$/i.test(normalized)) return true;
        return false;
      },
      hint: "c2c:<openid> or group:<groupOpenid>",
    },
  },
  config: {
    listAccountIds: (cfg) => listQQBotAccountIds(cfg),
    resolveAccount: (cfg, accountId) => resolveQQBotAccount(cfg, accountId),
    defaultAccountId: (cfg) => resolveDefaultQQBotAccountId(cfg),
    // 新增：设置账户启用状态
    setAccountEnabled: ({ cfg, accountId, enabled }) =>
      setAccountEnabledInConfigSection({
        cfg,
        sectionKey: "qqbot",
        accountId,
        enabled,
        allowTopLevel: true,
      }),
    // 新增：删除账户
    deleteAccount: ({ cfg, accountId }) =>
      deleteAccountFromConfigSection({
        cfg,
        sectionKey: "qqbot",
        accountId,
        clearBaseFields: ["appId", "clientSecret", "clientSecretFile", "name"],
      }),
    isConfigured: (account) => Boolean(account?.appId && account?.clientSecret),
    describeAccount: (account) => ({
      accountId: account?.accountId ?? DEFAULT_ACCOUNT_ID,
      name: account?.name,
      enabled: account?.enabled ?? false,
      configured: Boolean(account?.appId && account?.clientSecret),
      tokenSource: account?.secretSource,
    }),
    // 关键：解析 allowFrom 配置，用于命令授权
    resolveAllowFrom: ({ cfg, accountId }: { cfg: OpenClawConfig; accountId?: string }) => {
      const account = resolveQQBotAccount(cfg, accountId);
      const allowFrom = account.config?.allowFrom ?? [];
      console.log(`[qqbot] resolveAllowFrom: accountId=${accountId}, allowFrom=${JSON.stringify(allowFrom)}`);
      return allowFrom.map((entry: string | number) => String(entry));
    },
    // 格式化 allowFrom 条目（移除 qqbot: 前缀，统一大写）
    formatAllowFrom: ({ allowFrom }: { allowFrom: Array<string | number> }) =>
      allowFrom
        .map((entry: string | number) => String(entry).trim())
        .filter(Boolean)
        .map((entry: string) => entry.replace(/^qqbot:/i, ""))
        .map((entry: string) => entry.toUpperCase()), // QQ openid 是大写的
  },
  setup: {
    // 新增：规范化账户 ID
    resolveAccountId: ({ accountId }) => accountId?.trim().toLowerCase() || DEFAULT_ACCOUNT_ID,
    // 新增：应用账户名称
    applyAccountName: ({ cfg, accountId, name }) =>
      applyAccountNameToChannelSection({
        cfg,
        channelKey: "qqbot",
        accountId,
        name,
      }),
    validateInput: ({ input }) => {
      if (!input.token && !input.tokenFile && !input.useEnv) {
        return "QQBot requires --token (format: appId:clientSecret) or --use-env";
      }
      return null;
    },
    applyAccountConfig: ({ cfg, accountId, input }) => {
      let appId = "";
      let clientSecret = "";

      if (input.token) {
        const parts = input.token.split(":");
        if (parts.length === 2) {
          appId = parts[0];
          clientSecret = parts[1];
        }
      }

      return applyQQBotAccountConfig(cfg, accountId, {
        appId,
        clientSecret,
        clientSecretFile: input.tokenFile,
        name: input.name,
        imageServerBaseUrl: input.imageServerBaseUrl,
      });
    },
  },
  // Messaging 配置：用于解析目标地址
  messaging: {
    /**
     * 规范化目标地址
     * 支持以下格式：
     * - qqbot:c2c:openid -> 私聊
     * - qqbot:group:groupid -> 群聊
     * - qqbot:channel:channelid -> 频道
     * - c2c:openid -> 私聊
     * - group:groupid -> 群聊
     * - channel:channelid -> 频道
     * - 纯 openid（32位十六进制）-> 私聊
     */
    normalizeTarget: (target: string) => {
      // 去掉 qqbot: 前缀（如果有）
      let id = target.replace(/^qqbot:/i, "");

      // 检查是否是已知格式
      if (id.startsWith("c2c:") || id.startsWith("group:") || id.startsWith("channel:")) {
        return { ok: true, to: `qqbot:${id}` };
      }

      // 检查是否是纯 openid（32位十六进制，带连字符）
      // QQ Bot OpenID 格式类似: 207A5B8339D01F6582911C014668B77B
      const openIdPattern = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;
      if (openIdPattern.test(id)) {
        return { ok: true, to: `qqbot:c2c:${id}` };
      }

      // 不认识的格式
      return {
        ok: false,
        error: `Invalid QQ Bot target format: "${target}". Expected: qqbot:c2c:openid, qqbot:group:groupid, or openid (UUID format)`
      };
    },
    /**
     * 目标解析器配置
     * 用于判断一个目标 ID 是否看起来像 QQ Bot 的格式
     */
    targetResolver: {
      /**
       * 判断目标 ID 是否可能是 QQ Bot 格式
       * 支持以下格式：
       * - qqbot:c2c:xxx
       * - qqbot:group:xxx
       * - qqbot:channel:xxx
       * - c2c:xxx
       * - group:xxx
       * - channel:xxx
       * - UUID 格式的 openid
       */
      looksLikeId: (id: string): boolean => {
        // 带 qqbot: 前缀的格式
        if (/^qqbot:(c2c|group|channel):/i.test(id)) {
          return true;
        }
        // 不带前缀但有类型标识
        if (/^(c2c|group|channel):/i.test(id)) {
          return true;
        }
        // UUID 格式的 openid（QQ Bot 的用户/群 ID 格式）
        const openIdPattern = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;
        return openIdPattern.test(id);
      },
      hint: "QQ Bot 目标格式: qqbot:c2c:openid (私聊) 或 qqbot:group:groupid (群聊)",
    },
  },
  outbound: {
    deliveryMode: "direct",
    chunker: chunkText,
    chunkerMode: "markdown",
    textChunkLimit: 2000,
    sendText: async ({ to, text, accountId, replyToId, cfg }) => {
      const account = resolveQQBotAccount(cfg, accountId);
      const result = await sendText({ to, text, accountId, replyToId, account });
      return {
        channel: "qqbot",
        messageId: result.messageId,
        error: result.error ? new Error(result.error) : undefined,
      };
    },
    sendMedia: async ({ to, text, mediaUrl, accountId, replyToId, cfg }) => {
      const account = resolveQQBotAccount(cfg, accountId);
      const result = await sendMedia({ to, text: text ?? "", mediaUrl: mediaUrl ?? "", accountId, replyToId, account });
      return {
        channel: "qqbot",
        messageId: result.messageId,
        error: result.error ? new Error(result.error) : undefined,
      };
    },
  },
  gateway: {
    startAccount: async (ctx) => {
      const { account, abortSignal, log, cfg } = ctx;

      log?.info(`[qqbot:${account.accountId}] Starting gateway`);

      await startGateway({
        account,
        abortSignal,
        cfg,
        log,
        onReady: () => {
          log?.info(`[qqbot:${account.accountId}] Gateway ready`);
          ctx.setStatus({
            ...ctx.getStatus(),
            running: true,
            connected: true,
            lastConnectedAt: Date.now(),
          });
        },
        onError: (error) => {
          log?.error(`[qqbot:${account.accountId}] Gateway error: ${error.message}`);
          ctx.setStatus({
            ...ctx.getStatus(),
            lastError: error.message,
          });
        },
      });
    },
    // 新增：登出账户（清除配置中的凭证）
    logoutAccount: async ({ accountId, cfg }) => {
      const nextCfg = { ...cfg } as OpenClawConfig;
      const nextQQBot = cfg.channels?.qqbot ? { ...cfg.channels.qqbot } : undefined;
      let cleared = false;
      let changed = false;

      if (nextQQBot) {
        const qqbot = nextQQBot as Record<string, unknown>;
        if (accountId === DEFAULT_ACCOUNT_ID && qqbot.clientSecret) {
          delete qqbot.clientSecret;
          cleared = true;
          changed = true;
        }
        const accounts = qqbot.accounts as Record<string, Record<string, unknown>> | undefined;
        if (accounts && accountId in accounts) {
          const entry = accounts[accountId] as Record<string, unknown> | undefined;
          if (entry && "clientSecret" in entry) {
            delete entry.clientSecret;
            cleared = true;
            changed = true;
          }
          if (entry && Object.keys(entry).length === 0) {
            delete accounts[accountId];
            changed = true;
          }
        }
      }

      if (changed && nextQQBot) {
        nextCfg.channels = { ...nextCfg.channels, qqbot: nextQQBot };
        const runtime = getQQBotRuntime();
        const configApi = runtime.config as { writeConfigFile: (cfg: OpenClawConfig) => Promise<void> };
        await configApi.writeConfigFile(nextCfg);
      }

      const resolved = resolveQQBotAccount(changed ? nextCfg : cfg, accountId);
      const loggedOut = resolved.secretSource === "none";
      const envToken = Boolean(process.env.QQBOT_CLIENT_SECRET);

      return { ok: true, cleared, envToken, loggedOut };
    },
  },
  status: {
    defaultRuntime: {
      accountId: DEFAULT_ACCOUNT_ID,
      running: false,
      connected: false,
      lastConnectedAt: null,
      lastError: null,
      lastInboundAt: null,
      lastOutboundAt: null,
    },
    // 新增：构建通道摘要
    buildChannelSummary: ({ snapshot }: { snapshot: Record<string, unknown> }) => ({
      configured: snapshot.configured ?? false,
      tokenSource: snapshot.tokenSource ?? "none",
      running: snapshot.running ?? false,
      connected: snapshot.connected ?? false,
      lastConnectedAt: snapshot.lastConnectedAt ?? null,
      lastError: snapshot.lastError ?? null,
    }),
    buildAccountSnapshot: ({ account, runtime }: { account?: ResolvedQQBotAccount; runtime?: Record<string, unknown> }) => ({
      accountId: account?.accountId ?? DEFAULT_ACCOUNT_ID,
      name: account?.name,
      enabled: account?.enabled ?? false,
      configured: Boolean(account?.appId && account?.clientSecret),
      tokenSource: account?.secretSource,
      running: runtime?.running ?? false,
      connected: runtime?.connected ?? false,
      lastConnectedAt: runtime?.lastConnectedAt ?? null,
      lastError: runtime?.lastError ?? null,
      lastInboundAt: runtime?.lastInboundAt ?? null,
      lastOutboundAt: runtime?.lastOutboundAt ?? null,
    }),
  },
};


好的，现在让我查看一下 src/gateway.ts 文件，看看它是怎样处理消息的。这个文件应该包含消息接收的逻辑。