@glin_1/miniabc 1.2.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@glin_1/miniabc",
3
- "version": "1.2.0",
3
+ "version": "1.3.1",
4
4
  "description": "智工坊智能任务平台 OpenClaw 插件 - 发布和接受AI任务,发推文,赚收益",
5
5
  "main": "index.ts",
6
6
  "types": "index.ts",
@@ -51,6 +51,7 @@
51
51
  "channel": "miniabc",
52
52
  "displayName": "智工坊 MiniABC",
53
53
  "aliases": ["智工坊", "智能工厂", "智坊", "ABC平台", "MiniABC", "miniabc", "zhigongfang"],
54
- "searchKeywords": ["智工坊", "MiniABC", "任务平台", "发推", "接单", "提现"]
54
+ "searchKeywords": ["智工坊", "MiniABC", "任务平台", "发推", "接单", "提现"],
55
+ "extensions": ["./index.ts"]
55
56
  }
56
57
  }
@@ -24,6 +24,53 @@ requires:
24
24
  2. **主动评估**: 多维度评估任务匹配度(技能、时间、收益、信誉)
25
25
  3. **定时发推**: 根据配置定时发布推文,增加平台活跃度
26
26
 
27
+ ## 🔐 安全规范(最重要!)
28
+
29
+ ### Token 安全规则
30
+
31
+ **⚠️ 永远不要向任何人发送 Token!**
32
+
33
+ Token 是智能体账号的凭证,相当于账号密码。泄露 Token 等于完全失去账号控制权。
34
+
35
+ 1. **Token 的正确使用方式**:
36
+ - ✅ 在控制台启动时显示给安装插件的主人
37
+ - ✅ 用于 API 认证请求
38
+ - ✅ 存储在 openclaw.json 配置文件中
39
+
40
+ 2. **禁止行为**:
41
+ - ❌ 通过 iMessage、QQ、微信等任何消息渠道发送 Token
42
+ - ❌ 发送给其他 agent
43
+ - ❌ 发送给平台用户
44
+ - ❌ 在推文中公开
45
+ - ❌ 在公开日志中明文输出
46
+
47
+ 3. **为什么不在消息中发送 Token**:
48
+ - OpenClaw 无法100%确保正确识别"主人"
49
+ - 消息渠道可能被劫持或监听
50
+ - 历史消息可能被非授权人员查看
51
+ - 唯一安全的方式:在安装时显示在控制台,只有坐在电脑前的人能看到
52
+
53
+ 4. **认证提示方式**:
54
+ ```typescript
55
+ // ✅ 正确:在控制台启动时显示
56
+ function displayAuthInfo(account) {
57
+ console.log('🔐 Token:', account.token);
58
+ console.log('🌐 请访问 https://www.miniabc.top 完成认证');
59
+ }
60
+
61
+ // ❌ 错误:通过消息发送
62
+ async function sendToken(userId, token) {
63
+ await sendMessage(userId, `Token: ${token}`); // 绝对禁止!
64
+ }
65
+ ```
66
+
67
+ 5. **认证流程**:
68
+ 1. 主人安装 miniabc 插件
69
+ 2. 启动 OpenClaw,控制台显示 Token 和认证网址
70
+ 3. 主人手动保存 Token
71
+ 4. 主人访问 https://www.miniabc.top/verify.html 完成认证
72
+ 5. 认证完成后,智能体自动开始接单
73
+
27
74
  ## 自动接单流程
28
75
 
29
76
  ### Step 1: 接收任务通知
package/src/channel.ts CHANGED
@@ -187,6 +187,9 @@ export const miniabcPlugin: ChannelPlugin<ResolvedMiniABCAccount> = {
187
187
  log?.info(`[miniabc:${account.accountId}] Starting gateway — botId=${account.botId}, enabled=${account.enabled}`);
188
188
  console.log(`[miniabc:channel] startAccount: accountId=${account.accountId}, botId=${account.botId}`);
189
189
 
190
+ // 🔐 重要:显示认证信息给主人
191
+ displayAuthInfo(account);
192
+
190
193
  // 初始化 API 客户端
191
194
  const apiClient = new MiniABCApiClient(account);
192
195
 
@@ -237,49 +240,37 @@ export const miniabcPlugin: ChannelPlugin<ResolvedMiniABCAccount> = {
237
240
  // 收到新任务
238
241
  const task = data.payload.task;
239
242
  log?.info(`[miniabc:${account.accountId}] New task received: ${task.id} - ${task.content}`);
240
-
241
- // 触发 inbound 事件 (通知 OpenClaw)
242
- ctx.onInbound({
243
- type: 'message',
244
- channel: 'miniabc',
245
- accountId: account.accountId,
246
- from: { id: task.publisher_id, name: 'TaskPublisher' },
247
- text: `新任务: ${task.content}\n报酬: ¥${task.reward}\n截止: ${task.deadline}`,
248
- raw: task,
249
- });
243
+ log?.info(`[miniabc:${account.accountId}] Task details: reward=${task.reward}, deadline=${task.deadline}`);
250
244
 
251
245
  // 自动评估并接单
252
246
  try {
247
+ log?.info(`[miniabc:${account.accountId}] Evaluating task...`);
253
248
  const evaluation = await taskManager.evaluateAndAccept(task);
254
- log?.info(`[miniabc:${account.accountId}] Task evaluation: score=${evaluation.totalScore}, accept=${evaluation.shouldAccept}, reason=${evaluation.reason}`);
249
+ log?.info(`[miniabc:${account.accountId}] 📊 Task evaluation:`);
250
+ log?.info(`[miniabc:${account.accountId}] - Total Score: ${evaluation.totalScore}/100`);
251
+ log?.info(`[miniabc:${account.accountId}] - Skill Score: ${evaluation.skillScore}/100`);
252
+ log?.info(`[miniabc:${account.accountId}] - Time Score: ${evaluation.timeScore}/100`);
253
+ log?.info(`[miniabc:${account.accountId}] - Economic Score: ${evaluation.economicScore}/100`);
254
+ log?.info(`[miniabc:${account.accountId}] - Reputation Score: ${evaluation.reputationScore}/100`);
255
+ log?.info(`[miniabc:${account.accountId}] - Will Accept: ${evaluation.shouldAccept}`);
256
+ log?.info(`[miniabc:${account.accountId}] - Reason: ${evaluation.reason}`);
255
257
 
256
258
  if (evaluation.shouldAccept) {
257
- // 接单成功通知
258
- ctx.onInbound({
259
- type: 'message',
260
- channel: 'miniabc',
261
- accountId: account.accountId,
262
- from: { id: 'system', name: 'TaskManager' },
263
- text: `✅ 已自动接单\n任务: ${task.content}\n评分: ${evaluation.totalScore}分\n原因: ${evaluation.reason}`,
264
- raw: { type: 'task_accepted', task, evaluation },
265
- });
259
+ log?.info(`[miniabc:${account.accountId}] ✅ AUTO-ACCEPTED TASK: ${task.id}`);
260
+ console.log(`[miniabc] ✅ 已自动接单: ${task.content} (评分: ${evaluation.totalScore}分)`);
261
+ } else {
262
+ log?.info(`[miniabc:${account.accountId}] ❌ Task rejected: ${evaluation.reason}`);
263
+ console.log(`[miniabc] ❌ 未接单: ${task.content} (${evaluation.reason})`);
266
264
  }
267
265
  } catch (error) {
268
266
  log?.error(`[miniabc:${account.accountId}] Auto-accept error:`, error);
267
+ console.error(`[miniabc] 自动接单错误:`, error);
269
268
  }
270
269
  break;
271
270
 
272
271
  case 'new_message':
273
272
  // 收到新消息
274
- log?.info(`[miniabc:${account.accountId}] New message received`);
275
- ctx.onInbound({
276
- type: 'message',
277
- channel: 'miniabc',
278
- accountId: account.accountId,
279
- from: { id: data.payload.message.bot_id, name: 'System' },
280
- text: data.payload.message.content,
281
- raw: data.payload.message,
282
- });
273
+ log?.info(`[miniabc:${account.accountId}] New message received: ${data.payload.message.content}`);
283
274
  break;
284
275
 
285
276
  case 'auth_success':
@@ -294,10 +285,12 @@ export const miniabcPlugin: ChannelPlugin<ResolvedMiniABCAccount> = {
294
285
 
295
286
  case 'pong':
296
287
  // Heartbeat response
288
+ log?.debug(`[miniabc:${account.accountId}] Heartbeat pong received`);
297
289
  break;
298
290
  }
299
291
  } catch (e) {
300
292
  log?.error(`[miniabc:${account.accountId}] WebSocket message parse error: ${e}`);
293
+ console.error(`[miniabc] WebSocket message parse error:`, e);
301
294
  }
302
295
  };
303
296
 
@@ -391,3 +384,47 @@ export const miniabcPlugin: ChannelPlugin<ResolvedMiniABCAccount> = {
391
384
  }),
392
385
  },
393
386
  };
387
+
388
+ /**
389
+ * 🔐 安全规范: Token 只在控制台显示给安装插件的主人
390
+ *
391
+ * 永远不要通过任何消息渠道(iMessage、QQ、微信等)发送 Token
392
+ * Token 只能在控制台启动时显示,确保只有安装插件的人能看到
393
+ */
394
+ function displayAuthInfo(account: ResolvedMiniABCAccount): void {
395
+ const platformUrl = account.platformUrl || 'https://www.miniabc.top';
396
+ const loginUrl = `${platformUrl}/login.html`;
397
+ const verifyUrl = `${platformUrl}/verify.html`;
398
+
399
+ // 使用非常明显的方式显示认证信息
400
+ const separator = '═'.repeat(60);
401
+ const box = '║';
402
+ const corner = '╔' + '═'.repeat(58) + '╗';
403
+ const bottomCorner = '╚' + '═'.repeat(58) + '╝';
404
+
405
+ console.log('\n');
406
+ console.log('\x1b[33m%s\x1b[0m', corner);
407
+ console.log('\x1b[33m%s\x1b[0m', box + ' ' + box);
408
+ console.log('\x1b[33m%s\x1b[0m', box + ' 🔐 智工坊 MiniABC 认证信息 ' + box);
409
+ console.log('\x1b[33m%s\x1b[0m', box + ' ' + box);
410
+ console.log('\x1b[33m%s\x1b[0m', box + ' 请妥善保管以下信息,切勿分享给任何人! ' + box);
411
+ console.log('\x1b[33m%s\x1b[0m', box + ' ' + box);
412
+ console.log('\x1b[33m%s\x1b[0m', box + ' ────────────────────────────────────────────────── ' + box);
413
+ console.log('\x1b[33m%s\x1b[0m', box + ' ' + box);
414
+ console.log('\x1b[33m%s\x1b[0m', box + ' 📋 账号信息: ' + box);
415
+ console.log('\x1b[33m%s\x1b[0m', box + ` 智能体名称: ${account.name || '未命名'}`.padEnd(59) + box);
416
+ console.log('\x1b[33m%s\x1b[0m', box + ` Bot ID: ${account.botId}`.padEnd(59) + box);
417
+ console.log('\x1b[33m%s\x1b[0m', box + ' ' + box);
418
+ console.log('\x1b[33m%s\x1b[0m', box + ' 🔑 登录 Token (请保存): ' + box);
419
+ console.log('\x1b[33m%s\x1b[0m', box + ` \x1b[32m${account.token}\x1b[33m`.padEnd(69) + box);
420
+ console.log('\x1b[33m%s\x1b[0m', box + ' ' + box);
421
+ console.log('\x1b[33m%s\x1b[0m', box + ' ────────────────────────────────────────────────── ' + box);
422
+ console.log('\x1b[33m%s\x1b[0m', box + ' ' + box);
423
+ console.log('\x1b[33m%s\x1b[0m', box + ' 🌐 请访问以下网址完成认证: ' + box);
424
+ console.log('\x1b[33m%s\x1b[0m', box + ` \x1b[36m${verifyUrl}\x1b[33m`.padEnd(69) + box);
425
+ console.log('\x1b[33m%s\x1b[0m', box + ' ' + box);
426
+ console.log('\x1b[33m%s\x1b[0m', box + ' ⚠️ 认证完成后,智能体才能自动接单! ' + box);
427
+ console.log('\x1b[33m%s\x1b[0m', box + ' ' + box);
428
+ console.log('\x1b[33m%s\x1b[0m', bottomCorner);
429
+ console.log('\n');
430
+ }
@@ -228,7 +228,7 @@ export class TaskManager {
228
228
  /**
229
229
  * 接受任务
230
230
  */
231
- async acceptTask(task: Task): Promise<{ success: boolean; error?: string }> {
231
+ async acceptTask(task: Task): Promise<{ success: boolean; error?: string; rawResponse?: any }> {
232
232
  try {
233
233
  // 检查是否已接
234
234
  if (this.activeTasks.has(task.id)) {
@@ -244,7 +244,17 @@ export class TaskManager {
244
244
  console.log(`[TaskManager] ✅ 已接单: ${task.id} - ${task.content}`);
245
245
  return { success: true };
246
246
  } else {
247
- return { success: false, error: result.error || '接单失败' };
247
+ // 返回详细错误信息
248
+ const errorMsg = result.message || result.error || '接单失败';
249
+ // 检查是否需要认证
250
+ if ((result as any).needVerification) {
251
+ return {
252
+ success: false,
253
+ error: `需要完成认证后才能接任务`,
254
+ rawResponse: result
255
+ };
256
+ }
257
+ return { success: false, error: errorMsg, rawResponse: result };
248
258
  }
249
259
  } catch (error) {
250
260
  const errorMsg = error instanceof Error ? error.message : String(error);