sophhub 0.4.6 → 0.4.8

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.
@@ -6,7 +6,7 @@
6
6
  |------|------|------|
7
7
  | `read` | 读取知识库文档、图片 | knowledge/ 只读 |
8
8
  | `image` | 调用 VLM 识别用户发来的图片 | 只读 |
9
- | `write` | 写入自己的实例记忆(日志、反馈、画像、摘要等) | 仅限本实例 `memory/` 下允许的文件与根目录 `MEMORY.md`(不得写入 `knowledge/`;具体以 `runtime/agent-binding.json` 的 `allowedWritePatterns` 为准) |
9
+ | `write` | 写入自己的实例记忆(日志、反馈、画像、摘要等) | 仅限本实例 `memory/` 下允许的文件与根目录 `MEMORY.md`;不得写入 `knowledge/` |
10
10
  | `grep` | 搜索知识库文档内容 | knowledge/ 只读 |
11
11
 
12
12
  ## 禁用工具
@@ -29,7 +29,7 @@
29
29
  - **长期记忆:** `MEMORY.md`(可写,仅限已确认画像和稳定偏好)
30
30
  - **用户反馈:** `memory/feedback-YYYY-MM-DD.md`(可写)
31
31
  - **安全日志:** `memory/security-log.md`(可写)
32
- - **FAQ 建议:** `memory/faq-suggestions.md`(可写)
32
+ - **FAQ 建议:** `memory/faq-suggestions.md`(可写;由本 Agent 按 `AGENTS.md` 3.2 维护,非用户手填)
33
33
 
34
34
  ## 注意事项
35
35
 
@@ -38,4 +38,4 @@
38
38
  - 不要尝试对 `knowledge/` 目录执行任何写入操作
39
39
  - 不要尝试对 `knowledge/` 或系统配置文件执行任何写入操作
40
40
  - 写 `MEMORY.md` 时仅允许记录已确认偏好和稳定服务风格,禁止写入知识库事实与安全策略
41
- - `runtime/agent-binding.json` 属于运行时约束文件,**不要**通过对话尝试修改;若确需调整权限边界,走运维流程
41
+ - 若运行环境对可写路径另有平台层限制,以实际策略为准;**不要**通过对话尝试扩大写权限;确需改边界走运维
@@ -1,6 +1,6 @@
1
1
  # USER.md - 使用者信息
2
2
 
3
- 本助手面向**潜在客户**,通过 API 接口提供问答服务。
3
+ 本助手以**{{vip客服}}**这一对外身份,面向**潜在客户**通过 API 接口提供问答服务(安装/部署时与 bot 展示名、IDENTITY 中的 Name 一致)。
4
4
 
5
5
  ## 典型用户
6
6
 
@@ -13,4 +13,4 @@
13
13
  - 不同用户的业务熟练度不同,回答时注意判断对方的经验水平
14
14
  - 涉及具体系统操作的问题,尽量给出步骤说明
15
15
  - 如果用户提到的流程与知识库文档有出入,提醒用户以最新版本文档为准
16
- - 用户无法直接修改知识库,反馈记录后由管理员处理
16
+ - 用户无法直接修改知识库,反馈记录后由 **{{vip客服管理员}}** 侧处理
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sophhub",
3
- "version": "0.4.6",
3
+ "version": "0.4.8",
4
4
  "description": "SophHub CLI - Manage and download AI Agent skills",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,12 +1,20 @@
1
1
  {
2
2
  "name": "bot-api-status",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "types": [
5
5
  "store"
6
6
  ],
7
7
  "displayName": "BOT-API",
8
8
  "description": "查看当前 Agent 的 bot api 状态,同时也支持开启、关闭、重置密钥",
9
9
  "changelog": [
10
+ {
11
+ "changes": [
12
+ "非 --json 输出补充 Agent 名字与 source_agent_id,与 SKILL 输出模板一致",
13
+ "修正 SKILL 页眉为合法 YAML frontmatter"
14
+ ],
15
+ "date": "2026-04-28",
16
+ "version": "1.0.3"
17
+ },
10
18
  {
11
19
  "changes": [
12
20
  "修正 SKILL 中 bot-api 链接路径说明(account_id 占位,与脚本一致)",
@@ -32,5 +40,5 @@
32
40
  }
33
41
  ],
34
42
  "createdAt": "2026-04-22",
35
- "updatedAt": "2026-04-22"
43
+ "updatedAt": "2026-04-28"
36
44
  }
@@ -45,6 +45,9 @@ uv run {baseDir}/scripts/secret.py reset --json
45
45
  ```text
46
46
  📋 🤖 bot-api 状态:<🟢 开启 / ⚪ 关闭>
47
47
 
48
+ 📛 Agent 名字:<display_name>
49
+ 🆔 Agent ID:<source_agent_id>
50
+
48
51
  🔗 非流式链接:{{BASEURL}}/bot-api/v2/<account_id>/chat
49
52
  🔗 流式链接:{{BASEURL}}/bot-api/v2/<account_id>/chat-stream
50
53
  🔑 密钥:<api_secret 或 📭 暂无>
@@ -55,6 +58,9 @@ uv run {baseDir}/scripts/secret.py reset --json
55
58
  ```text
56
59
  ✨ 🤖 bot-api 已创建
57
60
 
61
+ 📛 Agent 名字:<display_name>
62
+ 🆔 Agent ID:<source_agent_id>
63
+
58
64
  🔗 非流式链接:{{BASEURL}}/bot-api/v2/<account_id>/chat
59
65
  🔗 流式链接:{{BASEURL}}/bot-api/v2/<account_id>/chat-stream
60
66
  🔑 密钥:<api_secret>
@@ -75,9 +81,12 @@ uv run {baseDir}/scripts/secret.py reset --json
75
81
  ```text
76
82
  🔄 🤖 bot-api 密钥已更新
77
83
 
78
- 🔑 新密钥:<new_secret>
84
+ 📛 Agent 名字:<display_name>
85
+ 🆔 Agent ID:<source_agent_id>
86
+
79
87
  🔗 非流式链接:{{BASEURL}}/bot-api/v2/<account_id>/chat
80
88
  🔗 流式链接:{{BASEURL}}/bot-api/v2/<account_id>/chat-stream
89
+ 🔑 新密钥:<new_secret>
81
90
 
82
91
  🔒 请妥善保管,勿对外转发或截图。
83
92
  ```
@@ -87,3 +96,4 @@ uv run {baseDir}/scripts/secret.py reset --json
87
96
  ```text
88
97
  ⚠️ 获取BASEURL失败,刷新页面或者重新登录后重试。
89
98
  ```
99
+
@@ -1,5 +1,5 @@
1
1
  [project]
2
2
  name = "bot-api-status"
3
- version = "1.0.2"
3
+ version = "1.0.3"
4
4
  description = "Manage bot-api lifecycle and secret for the current Agent"
5
5
  requires-python = ">=3.10"
@@ -365,6 +365,17 @@ def _fmt_url(value: object) -> str:
365
365
  return "📭 暂无"
366
366
 
367
367
 
368
+ def _fmt_identity(value: object) -> str:
369
+ if isinstance(value, str) and value.strip():
370
+ return value.strip()
371
+ return "📭 暂无"
372
+
373
+
374
+ def _print_agent_identity(display_name: object, source_agent_id: object) -> None:
375
+ print(f"📛 名字:{_fmt_identity(display_name)}")
376
+ print(f"🆔 source_agent_id:{_fmt_identity(source_agent_id)}")
377
+
378
+
368
379
  def _print_link_block(url: str, stream_url: str, baseurl_note: str) -> None:
369
380
  if url != "📭 暂无":
370
381
  print(f"🔗 非流式链接:{url}")
@@ -384,6 +395,8 @@ def print_human_response(command: str, payload: dict[str, Any]) -> int:
384
395
  state = "🟢 开启" if enabled else "⚪ 关闭"
385
396
  print(f"📋 🤖 bot-api 状态:{state}")
386
397
  print()
398
+ _print_agent_identity(payload.get("display_name"), payload.get("source_agent_id"))
399
+ print()
387
400
  _print_link_block(url, stream_url, "")
388
401
  print(f"🔑 密钥:{secret}")
389
402
  return 0
@@ -393,6 +406,8 @@ def print_human_response(command: str, payload: dict[str, Any]) -> int:
393
406
  prefix = "📝" if action == "updated" else "✨"
394
407
  print(f"{prefix} 🤖 bot-api {title}")
395
408
  print()
409
+ _print_agent_identity(payload.get("display_name"), payload.get("source_agent_id"))
410
+ print()
396
411
  _print_link_block(url, stream_url, "")
397
412
  print(f"🔑 密钥:{secret}")
398
413
  print()
@@ -411,9 +426,10 @@ def print_human_response(command: str, payload: dict[str, Any]) -> int:
411
426
  return 1
412
427
  print("🔄 🤖 bot-api 密钥已更新")
413
428
  print()
414
- print(f"🔑 新密钥:{secret}")
429
+ _print_agent_identity(payload.get("display_name"), payload.get("source_agent_id"))
415
430
  print()
416
431
  _print_link_block(url, stream_url, "")
432
+ print(f"🔑 新密钥:{secret}")
417
433
  print()
418
434
  print("🔒 请妥善保管,勿对外转发或截图。")
419
435
  return 0
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "claw-agent-get-send",
3
+ "version": "1.0.0",
4
+ "types": ["store"],
5
+ "displayName": "Claw Agent Get/Send",
6
+ "description": "Appia claw.agent.groups.get / claw.agent.message.send:脚本封装 + HTTP/curl 参考(JWT、msg/md 负载、错误码)",
7
+ "changelog": [
8
+ {
9
+ "version": "1.0.0",
10
+ "date": "2026-04-28",
11
+ "changes": [
12
+ "groups / verify-target / send 分片子命令",
13
+ "reference-http.md:合并 claw.agent.groups.get / message.send curl 文档",
14
+ "skill 标识 claw-agent-get-send(原 appia-claw)",
15
+ "send-md 命令支持 Markdown AST 发送"
16
+ ]
17
+ }
18
+ ],
19
+ "createdAt": "2026-04-28",
20
+ "updatedAt": "2026-04-28"
21
+ }
@@ -0,0 +1,72 @@
1
+ ---
2
+ name: claw-agent-get-send
3
+ description: >-
4
+ Call Appia Claw HTTP APIs (agent.groups.get, agent.message.send) using env vars or curl.
5
+ Use when querying bot group memberships, verifying rid+group name, sending plaintext or Markdown AST to Appia rooms,
6
+ or when the user needs JWT auth rules, curl examples, or md payload shape for agent.message.send.
7
+ ---
8
+
9
+ # Claw Agent(groups.get / message.send)
10
+
11
+ 使用 **环境变量** 鉴权,**不向仓库提交** JWT、`APP_AGENT_ID` 等明文。
12
+
13
+ ## 环境变量
14
+
15
+ | 变量 | 必填 | 说明 |
16
+ |------|------|------|
17
+ | `APPIA_BASE_URL` | 是 | 根地址,例如 `https://sophgo.appia.cn` |
18
+ | `CLAW_JWT` | 是 | `Authorization: Bearer` 的值 |
19
+ | `APP_AGENT_ID` | 是 | SophClaw 机器人 Agent ID(与 `AGENT_ID` 二选一) |
20
+ | `TARGET_RID` | send / verify | 目标群 `rid` |
21
+ | `TARGET_GROUP_NAME` | verify | 群展示名,`verify-target` 双因子校验用 |
22
+ | `TARGET_GROUP_MATCH` | 否 | `exact`(默认)或 `contains` |
23
+
24
+ | 可选 | 说明 |
25
+ |------|------|
26
+ | `APPIA_MSG_CHUNK_SIZE` | 单条 `msg` 最大字符数,超出则拆分多次发送(默认 3500) |
27
+
28
+ ## 用法
29
+
30
+ `{baseDir}` 为与本 `SKILL.md` 同级的安装根(通常含 `scripts/`)。
31
+
32
+ ### 查询群列表
33
+
34
+ ```bash
35
+ uv run {baseDir}/scripts/appia_claw.py groups --json
36
+ ```
37
+
38
+ ### 校验目标群
39
+
40
+ ```bash
41
+ uv run {baseDir}/scripts/appia_claw.py verify-target
42
+ ```
43
+
44
+ ### 发送纯文本(支持分段)
45
+
46
+ ```bash
47
+ uv run {baseDir}/scripts/appia_claw.py send --file /tmp/brief.txt
48
+ uv run {baseDir}/scripts/appia_claw.py send --text "hello" --rid <rid>
49
+ ```
50
+
51
+ ### 发送 Markdown AST
52
+
53
+ ```bash
54
+ # 从 JSON 字符串
55
+ uv run {baseDir}/scripts/appia_claw.py send-md --md-json '[{"type":"PARAGRAPH","value":[{"type":"PLAIN_TEXT","value":"**粗体** 文本"}]}]'
56
+
57
+ # 从 JSON 文件
58
+ uv run {baseDir}/scripts/appia_claw.py send-md --md-file /tmp/md.json
59
+
60
+ # 纯文本自动转 md 结构
61
+ uv run {baseDir}/scripts/appia_claw.py send-md --text "简单文本"
62
+ ```
63
+
64
+ ## 说明
65
+
66
+ - `send` 命令使用 **`msg` 纯文本**;极长正文按 `APPIA_MSG_CHUNK_SIZE` **分多条**发送。
67
+ - `send-md` 命令使用 **`md` Markdown AST** 结构,支持 Rocket.Chat 富文本格式。
68
+ - 请避免与业务侧「同 Sender 并发冲突」同时使用(串行调用本脚本即可)。
69
+
70
+ ## HTTP / curl 参考
71
+
72
+ 仓库根目录的 `claw.agent.groups.get.curl.md` 与 `claw.agent.message.send.curl.md` 已并入本 skill 的 [reference-http.md](reference-http.md)(鉴权说明、完整 curl、`md` 示例、常见错误码)。需要手写请求或排查 401 / 参数错误时优先读该文件。
@@ -0,0 +1,5 @@
1
+ [project]
2
+ name = "claw-agent-get-send"
3
+ version = "1.0.0"
4
+ description = "Appia Claw groups.get / message.send helper"
5
+ requires-python = ">=3.10"
@@ -0,0 +1,149 @@
1
+ # Claw HTTP API(curl 参考)
2
+
3
+ 与仓库根目录 `claw.agent.groups.get.curl.md`、`claw.agent.message.send.curl.md` 同源;集成在 skill 内便于离线查阅。
4
+
5
+ ---
6
+
7
+ ## `GET /api/v1/claw/agent.groups.get`
8
+
9
+ 用于按 `agentId` 查询该机器人所在的所有群聊,返回 `rid` 和群名称。
10
+
11
+ ### 鉴权方式
12
+
13
+ 与 `mcpToDos` 一致:
14
+
15
+ - `authRequired: false`
16
+ - 通过请求头 `Authorization: Bearer <JWT>` 校验
17
+ - 校验规则受以下设置控制:
18
+ - `Appia_Antagent_JWT_Enable`
19
+ - `APPIA_JWT_SECRET`
20
+
21
+ ### 请求示例
22
+
23
+ ```bash
24
+ curl -sS -G 'https://YOUR_ROCKETCHAT_HOST/api/v1/claw/agent.groups.get' \
25
+ -H 'Authorization: Bearer YOUR_MCP_JWT_TOKEN' \
26
+ --data-urlencode 'agentId=AGENT_BOT_USER_ID'
27
+ ```
28
+
29
+ ### 参数
30
+
31
+ - `agentId`(query,必填):OpenClaw 侧 Agent ID(会映射到机器人用户)
32
+
33
+ ### 成功返回示例
34
+
35
+ ```json
36
+ {
37
+ "success": true,
38
+ "data": {
39
+ "agentId": "AGENT_BOT_USER_ID",
40
+ "groups": [
41
+ {
42
+ "rid": "ROOM_ID_1",
43
+ "name": "群聊A"
44
+ },
45
+ {
46
+ "rid": "ROOM_ID_2",
47
+ "name": "群聊B"
48
+ }
49
+ ],
50
+ "total": 2
51
+ }
52
+ }
53
+ ```
54
+
55
+ ### 常见失败
56
+
57
+ - `{"success":false,"message":"401"}`:JWT 无效或过期
58
+ - `{"success":false,"message":"agentId is required"}`:缺少 `agentId`
59
+ - `{"success":false,"message":"agent not found by agentId"}`:找不到对应 agentId 的机器人
60
+
61
+ ---
62
+
63
+ ## `POST /api/v1/claw/agent.message.send`
64
+
65
+ 用于根据 `rid + agentId` 向指定群聊发送消息。
66
+
67
+ 接口会校验:
68
+
69
+ 1. `rid` 对应房间存在
70
+ 2. `agentId` 对应用户存在、为 bot、且 active
71
+ 3. 该 `agentId` 确实在该 `rid` 的订阅列表里
72
+
73
+ 满足后,走后端正常发消息逻辑(`executeSendMessage`)。
74
+
75
+ ### 鉴权方式
76
+
77
+ 与 `mcpToDos` 一致:
78
+
79
+ - `authRequired: false`
80
+ - 通过请求头 `Authorization: Bearer <JWT>` 校验
81
+ - 校验规则受以下设置控制:
82
+ - `Appia_Antagent_JWT_Enable`
83
+ - `APPIA_JWT_SECRET`
84
+
85
+ ### 请求示例
86
+
87
+ #### 示例一:发送纯文本
88
+
89
+ ```bash
90
+ curl -sS -X POST 'https://YOUR_ROCKETCHAT_HOST/api/v1/claw/agent.message.send' \
91
+ -H 'Content-Type: application/json' \
92
+ -H 'Authorization: Bearer YOUR_MCP_JWT_TOKEN' \
93
+ -d '{
94
+ "rid": "TARGET_ROOM_RID",
95
+ "agentId": "AGENT_BOT_USER_ID",
96
+ "msg": "这是一条由 Claw 机器人发送的消息"
97
+ }'
98
+ ```
99
+
100
+ #### 示例二:发送 Markdown(`md`)
101
+
102
+ ```bash
103
+ curl -sS -X POST 'https://YOUR_ROCKETCHAT_HOST/api/v1/claw/agent.message.send' \
104
+ -H 'Content-Type: application/json' \
105
+ -H 'Authorization: Bearer YOUR_MCP_JWT_TOKEN' \
106
+ -d '{
107
+ "rid": "TARGET_ROOM_RID",
108
+ "agentId": "OPENCLAW_AGENT_ID",
109
+ "md": [
110
+ {
111
+ "type": "PARAGRAPH",
112
+ "value": [
113
+ { "type": "PLAIN_TEXT", "value": "这是一条 *Markdown* 消息" }
114
+ ]
115
+ }
116
+ ]
117
+ }'
118
+ ```
119
+
120
+ ### 参数
121
+
122
+ - `rid`(body,必填):目标群聊房间 ID
123
+ - `agentId`(body,必填):OpenClaw 侧 Agent ID(会映射到机器人用户)
124
+ - `msg`(body,可选):消息文本
125
+ - `md`(body,可选):Markdown AST(Rocket.Chat `md` 结构)
126
+ - 约束:`msg` 和 `md` 至少提供一个
127
+
128
+ ### 成功返回示例
129
+
130
+ ```json
131
+ {
132
+ "success": true,
133
+ "data": {
134
+ "rid": "TARGET_ROOM_RID",
135
+ "agentId": "AGENT_BOT_USER_ID",
136
+ "status": "sent"
137
+ }
138
+ }
139
+ ```
140
+
141
+ ### 常见失败
142
+
143
+ - `{"success":false,"message":"401"}`:JWT 无效或过期
144
+ - `{"success":false,"message":"rid and agentId are required, and either msg or md must be provided"}`:参数缺失
145
+ - `{"success":false,"message":"room not found"}`:房间不存在
146
+ - `{"success":false,"message":"agent not found by agentId"}`:找不到对应 agentId 的机器人
147
+ - `{"success":false,"message":"agent must be a bot user"}`:agent 不是 bot
148
+ - `{"success":false,"message":"agent is inactive"}`:机器人未激活
149
+ - `{"success":false,"message":"agent is not in this room"}`:机器人不在该群里