@shulex/cxclawctl 0.1.2 → 0.1.4

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.
Files changed (208) hide show
  1. package/README.md +25 -22
  2. package/capabilities.lock.json +535 -131
  3. package/dist/cli.js +2203 -127
  4. package/dist/cli.js.map +1 -1
  5. package/package.json +20 -6
  6. package/requirements-cli.txt +0 -2
  7. package/skills/__lib__/__init__.py +0 -0
  8. package/skills/__lib__/skill-runtime/bootstrap.py +0 -134
  9. package/skills/__lib__/solvea-api/__init__.py +0 -0
  10. package/skills/__lib__/solvea-api/client.py +0 -1944
  11. package/skills/__lib__/solvea-api/dashboard.py +0 -100
  12. package/skills/__lib__/solvea-api/solvea_api.py +0 -1341
  13. package/skills/agent-analytics/SKILL.md +0 -74
  14. package/skills/agent-analytics/references/chat-report-fields.md +0 -36
  15. package/skills/agent-analytics/references/report-fields.md +0 -130
  16. package/skills/agent-analytics/references/transcript.md +0 -110
  17. package/skills/agent-builder/SKILL.md +0 -42
  18. package/skills/agent-builder/interfaces/fallback-chatflow.md +0 -47
  19. package/skills/agent-builder/references/chatflow/graph-spec.md +0 -259
  20. package/skills/agent-builder/references/chatflow/node-selection.md +0 -89
  21. package/skills/agent-builder/references/chatflow/nodes/agent.md +0 -350
  22. package/skills/agent-builder/references/chatflow/nodes/business-track.md +0 -43
  23. package/skills/agent-builder/references/chatflow/nodes/code.md +0 -157
  24. package/skills/agent-builder/references/chatflow/nodes/collect-order.md +0 -47
  25. package/skills/agent-builder/references/chatflow/nodes/finish.md +0 -34
  26. package/skills/agent-builder/references/chatflow/nodes/human-review.md +0 -60
  27. package/skills/agent-builder/references/chatflow/nodes/if-else.md +0 -100
  28. package/skills/agent-builder/references/chatflow/nodes/intent.md +0 -79
  29. package/skills/agent-builder/references/chatflow/nodes/knowledge-reply.md +0 -43
  30. package/skills/agent-builder/references/chatflow/nodes/llm.md +0 -117
  31. package/skills/agent-builder/references/chatflow/nodes/note.md +0 -38
  32. package/skills/agent-builder/references/chatflow/nodes/question.md +0 -97
  33. package/skills/agent-builder/references/chatflow/nodes/rag-reply.md +0 -68
  34. package/skills/agent-builder/references/chatflow/nodes/reply.md +0 -97
  35. package/skills/agent-builder/references/chatflow/nodes/start.md +0 -35
  36. package/skills/agent-builder/references/chatflow/nodes/sub-graph.md +0 -48
  37. package/skills/agent-builder/references/chatflow/nodes/tool.md +0 -138
  38. package/skills/agent-builder/references/chatflow/nodes/transfer-to-human.md +0 -63
  39. package/skills/agent-builder/references/chatflow/nodes/variable-assignment.md +0 -52
  40. package/skills/agent-builder/references/chatflow/nodes/variable-extract.md +0 -50
  41. package/skills/agent-builder/references/chatflow/nodes/variable-process.md +0 -70
  42. package/skills/agent-builder/references/chatflow/overview.md +0 -53
  43. package/skills/agent-builder/references/chatflow/visual-translation.md +0 -64
  44. package/skills/agent-builder/references/chatflow/workflow.md +0 -134
  45. package/skills/agent-builder/references/multi-agent/create-update.md +0 -185
  46. package/skills/agent-builder/references/multi-agent/graph-spec.md +0 -246
  47. package/skills/agent-builder/references/multi-agent/graph-structure.md +0 -12
  48. package/skills/agent-builder/references/multi-agent/migrate-to-chatflow.md +0 -13
  49. package/skills/agent-builder/references/multi-agent/migration/large.md +0 -554
  50. package/skills/agent-builder/references/multi-agent/migration/principles.md +0 -446
  51. package/skills/agent-builder/references/multi-agent/migration/small.md +0 -225
  52. package/skills/agent-builder/references/multi-agent/orchestration.md +0 -11
  53. package/skills/agent-builder/references/multi-agent/overview.md +0 -48
  54. package/skills/agent-builder/references/multi-agent/update.md +0 -128
  55. package/skills/agent-builder/references/multi-agent/workflow.md +0 -87
  56. package/skills/agent-builder/references/single-agent/overview.md +0 -48
  57. package/skills/agent-builder/references/single-agent/prompt.md +0 -16
  58. package/skills/agent-builder/references/single-agent/tools.md +0 -36
  59. package/skills/agent-builder/references/single-agent/voice.md +0 -46
  60. package/skills/agent-builder/references/tools/http-tool.md +0 -315
  61. package/skills/agent-builder/references/tools/mock-tool.md +0 -279
  62. package/skills/agent-builder/references/tools/overview.md +0 -46
  63. package/skills/agent-builder/references/tools/tool-config.md +0 -43
  64. package/skills/agent-builder/references/tools/x-token.md +0 -34
  65. package/skills/agent-builder/scripts/chatflow/chatflow_builder.py +0 -3458
  66. package/skills/agent-builder/scripts/chatflow/validate_graph.py +0 -1697
  67. package/skills/agent-builder/scripts/copy_marketplace_agent.py +0 -61
  68. package/skills/agent-builder/scripts/multi-agent/legacy_graph_analyzer.py +0 -5974
  69. package/skills/agent-builder/scripts/multi-agent/replay_compare.py +0 -679
  70. package/skills/agent-builder/scripts/patch_agent_tools.py +0 -135
  71. package/skills/agent-builder/scripts/tools/validate_tool_config.py +0 -384
  72. package/skills/agent-tester/SKILL.md +0 -35
  73. package/skills/agent-tester/batch-test/overview.md +0 -86
  74. package/skills/agent-tester/scripts/batch_test_sheet.py +0 -213
  75. package/skills/agent-tester/single-test/badcase-retest.md +0 -85
  76. package/skills/agent-tester/single-test/direct-test.md +0 -24
  77. package/skills/agent-tester/single-test/overview.md +0 -142
  78. package/skills/delivery/SKILL.md +0 -112
  79. package/skills/delivery/interfaces/classify.md +0 -38
  80. package/skills/delivery/interfaces/create-agents.md +0 -89
  81. package/skills/delivery/interfaces/delivery-test.md +0 -67
  82. package/skills/delivery/references/flow.md +0 -40
  83. package/skills/delivery/references/validation.md +0 -15
  84. package/skills/delivery/scripts/batch_test.py +0 -704
  85. package/skills/delivery/scripts/classify.py +0 -22
  86. package/skills/delivery/scripts/create_agents.py +0 -695
  87. package/skills/delivery/scripts/gen_delivery_report.py +0 -335
  88. package/skills/delivery/scripts/gen_excel.py +0 -234
  89. package/skills/delivery/scripts/gen_report.py +0 -208
  90. package/skills/delivery/scripts/plan.py +0 -163
  91. package/skills/delivery/scripts/render.py +0 -713
  92. package/skills/delivery/scripts/render_summary.py +0 -38
  93. package/skills/delivery/scripts/sample_history_cases.py +0 -109
  94. package/skills/kb-builder/SKILL.md +0 -80
  95. package/skills/kb-builder/interfaces/qa-upload.md +0 -55
  96. package/skills/kb-builder/interfaces/web-kb.md +0 -84
  97. package/skills/kb-builder/references/directory.md +0 -373
  98. package/skills/kb-builder/references/export.md +0 -282
  99. package/skills/kb-builder/references/isolation-keywords.md +0 -113
  100. package/skills/kb-builder/references/knowledge.md +0 -153
  101. package/skills/kb-builder/references/product.md +0 -52
  102. package/skills/kb-builder/references/qa-from-help-center.md +0 -58
  103. package/skills/kb-builder/references/qa-from-pdf.md +0 -94
  104. package/skills/kb-builder/references/qa-from-tickets.md +0 -168
  105. package/skills/kb-builder/references/qa-from-web.md +0 -98
  106. package/skills/kb-builder/references/qa-quality.md +0 -73
  107. package/skills/kb-builder/references/reply-template.md +0 -237
  108. package/skills/kb-builder/references/tag-isolation-migration.md +0 -61
  109. package/skills/kb-builder/references/tags.md +0 -45
  110. package/skills/kb-builder/references/upload.md +0 -130
  111. package/skills/kb-builder/scripts/batch_extract_ticket_qa.py +0 -333
  112. package/skills/kb-builder/scripts/build_directory_plan.py +0 -144
  113. package/skills/kb-builder/scripts/crawl_site.py +0 -433
  114. package/skills/kb-builder/scripts/create_dirs.py +0 -146
  115. package/skills/kb-builder/scripts/export_knowledge.py +0 -454
  116. package/skills/kb-builder/scripts/extract_ticket_qa.py +0 -441
  117. package/skills/kb-builder/scripts/extract_web_qa.py +0 -118
  118. package/skills/kb-builder/scripts/import_qa.py +0 -219
  119. package/skills/kb-builder/scripts/import_source_documents.py +0 -143
  120. package/skills/kb-builder/scripts/import_templates.py +0 -409
  121. package/skills/poc/SKILL.md +0 -125
  122. package/skills/poc/assets/default_manual.css +0 -279
  123. package/skills/poc/assets/notice_escalate.png +0 -0
  124. package/skills/poc/assets/notice_escalate2.png +0 -0
  125. package/skills/poc/assets/notice_new_chat.png +0 -0
  126. package/skills/poc/assets/poc_test_template.html +0 -645
  127. package/skills/poc/assets/poc_test_template.md +0 -104
  128. package/skills/poc/assets/step3_preview.png +0 -0
  129. package/skills/poc/assets/step4_order_note.png +0 -0
  130. package/skills/poc/interfaces/classify.md +0 -38
  131. package/skills/poc/interfaces/create-agents.md +0 -108
  132. package/skills/poc/interfaces/poc-test.md +0 -94
  133. package/skills/poc/references/flow.md +0 -47
  134. package/skills/poc/references/kb-directory.md +0 -22
  135. package/skills/poc/references/validation.md +0 -17
  136. package/skills/poc/scripts/classify.py +0 -22
  137. package/skills/poc/scripts/create_agents.py +0 -818
  138. package/skills/poc/scripts/gen_excel.py +0 -234
  139. package/skills/poc/scripts/gen_poc_manual.py +0 -249
  140. package/skills/poc/scripts/gen_report.py +0 -208
  141. package/skills/poc/scripts/inspect_chatflow.py +0 -209
  142. package/skills/poc/scripts/plan.py +0 -178
  143. package/skills/poc/scripts/poc_test.py +0 -495
  144. package/skills/poc/scripts/render.py +0 -713
  145. package/skills/poc/scripts/render_summary.py +0 -41
  146. package/skills/runtime-inspector/SKILL.md +0 -51
  147. package/skills/runtime-inspector/references/frontend-rendering.md +0 -126
  148. package/skills/runtime-inspector/references/model.md +0 -59
  149. package/skills/runtime-inspector/references/sandbox.md +0 -131
  150. package/skills/runtime-inspector/scripts/model_inspect.py +0 -68
  151. package/skills/runtime-inspector/scripts/prepare.py +0 -98
  152. package/skills/runtime-inspector/scripts/process.py +0 -84
  153. package/skills/runtime-inspector/scripts/read_state.py +0 -32
  154. package/skills/runtime-inspector/scripts/sandbox_inspect.py +0 -463
  155. package/skills/runtime-inspector/scripts/test_claude_proxy.py +0 -49
  156. package/skills/runtime-inspector/scripts/test_openai_proxy.py +0 -41
  157. package/skills/runtime-inspector/scripts/verify_persistence.py +0 -101
  158. package/skills/runtime-inspector/scripts/write_test.py +0 -41
  159. package/skills/setup/SKILL.md +0 -17
  160. package/skills/shulex-support/SKILL.md +0 -39
  161. package/skills/shulex-support/references/badcase-analysis/overview.md +0 -34
  162. package/skills/shulex-support/references/badcase-analysis/text/conversation-record.md +0 -105
  163. package/skills/shulex-support/references/badcase-analysis/text/core-flow.md +0 -89
  164. package/skills/shulex-support/references/badcase-analysis/text/log-query-rules.md +0 -36
  165. package/skills/shulex-support/references/badcase-analysis/text/m1-entry.md +0 -53
  166. package/skills/shulex-support/references/badcase-analysis/text/m10-chatflow-service.md +0 -259
  167. package/skills/shulex-support/references/badcase-analysis/text/m11-algorithm-service.md +0 -148
  168. package/skills/shulex-support/references/badcase-analysis/text/m12-quality-inspection.md +0 -57
  169. package/skills/shulex-support/references/badcase-analysis/text/m2-intent.md +0 -120
  170. package/skills/shulex-support/references/badcase-analysis/text/m3-strategy.md +0 -126
  171. package/skills/shulex-support/references/badcase-analysis/text/m4-aifield.md +0 -121
  172. package/skills/shulex-support/references/badcase-analysis/text/m5-agent.md +0 -208
  173. package/skills/shulex-support/references/badcase-analysis/text/m6-tool.md +0 -115
  174. package/skills/shulex-support/references/badcase-analysis/text/m7-reply.md +0 -72
  175. package/skills/shulex-support/references/badcase-analysis/text/m8-error.md +0 -92
  176. package/skills/shulex-support/references/badcase-analysis/text/m9-knowledge-search.md +0 -147
  177. package/skills/shulex-support/references/badcase-analysis/text/sls-query.md +0 -283
  178. package/skills/shulex-support/references/badcase-analysis/voice/core-flow.md +0 -77
  179. package/skills/shulex-support/references/badcase-analysis/voice/dependencies.md +0 -19
  180. package/skills/shulex-support/references/badcase-analysis/voice/platform-api.md +0 -23
  181. package/skills/shulex-support/references/badcase-analysis/voice/sls-playbook.md +0 -31
  182. package/skills/shulex-support/references/product-docs.md +0 -70
  183. package/skills/shulex-support/references/tickets.md +0 -184
  184. package/skills/shulex-support/scripts/support.py +0 -427
  185. package/skills/solvea-desk/SKILL.md +0 -39
  186. package/skills/solvea-desk/references/report/fields.md +0 -82
  187. package/skills/solvea-desk/references/report/report-design.md +0 -200
  188. package/skills/solvea-desk/references/report/report-template.html +0 -44
  189. package/skills/solvea-desk/references/report/report.css +0 -517
  190. package/skills/solvea-desk/references/report/workflow.md +0 -464
  191. package/skills/solvea-desk/references/tickets/query.md +0 -103
  192. package/skills/solvea-desk/references/tickets/tags.md +0 -83
  193. package/skills/solvea-desk/scripts/report/fetch_sources.py +0 -580
  194. package/skills/solvea-desk/scripts/report/render_report.py +0 -763
  195. package/skills/solvea-desk/scripts/tickets/desk_api.py +0 -73
  196. package/skills/solvea-desk/scripts/tickets/fetch_tickets.py +0 -403
  197. package/skills/solvea-desk/scripts/tickets/ticket_tags.py +0 -305
  198. package/skills/solvea-kit/SKILL.md +0 -84
  199. package/skills/solvea-kit/references/agent.md +0 -145
  200. package/skills/solvea-kit/references/chat.md +0 -244
  201. package/skills/solvea-kit/references/intent.md +0 -69
  202. package/skills/solvea-kit/references/plugin.md +0 -53
  203. package/skills/solvea-kit/references/quality-inspection.md +0 -75
  204. package/skills/solvea-kit/references/strategy.md +0 -62
  205. package/skills/solvea-kit/references/tagging.md +0 -231
  206. package/skills/solvea-kit/references/variables.md +0 -53
  207. package/skills/solvea-kit/scripts/generate_label_import_file.py +0 -151
  208. package/skills/solvea-kit/scripts/intent_classify.py +0 -843
@@ -1,101 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- 跨轮持久化断言脚本。
4
-
5
- eager 模型下 workspace/state/ 与 workspace/outputs/ 都由运行时在 build 时
6
- 自动 eager 还原到原路径,脚本直接读即可,无需 read_file 物化。
7
- """
8
- import os, sys
9
- sys.path.insert(0, os.path.join(os.environ["SOLVEA_LIB_DIR"], "skill-runtime"))
10
- from bootstrap import *
11
- import json
12
-
13
- _SECTION = "=" * 64
14
- _failures: list[str] = []
15
-
16
-
17
- def check(label: str, condition: bool, detail: str = "") -> None:
18
- if condition:
19
- print(f" ✅ {label}")
20
- else:
21
- msg = f"{label}" + (f" — {detail}" if detail else "")
22
- print(f" ❌ {msg}")
23
- _failures.append(msg)
24
-
25
-
26
- print(_SECTION)
27
- print("VERIFY PERSISTENCE — 跨轮持久化断言")
28
- print(_SECTION)
29
-
30
- # ── 1. 上一轮 state 是否还原到 workspace ─────────────────────────────────────
31
- print("\n[1] 上一轮 state 还原(workspace/state/)")
32
- state_path = STATE_DIR / "inspect.json"
33
- check("state 文件已还原", state_path.exists(), str(state_path))
34
-
35
- if state_path.exists():
36
- try:
37
- prev_state = json.loads(state_path.read_text(encoding="utf-8"))
38
- check("status == 'done'", prev_state.get("status") == "done",
39
- f"actual status={prev_state.get('status')!r}")
40
- check("total_processed > 0", (prev_state.get("total_processed") or 0) > 0,
41
- f"total_processed={prev_state.get('total_processed')}")
42
- check("results_path 字段存在", bool(prev_state.get("results_path")))
43
- except Exception as e:
44
- check("state 文件可解析", False, str(e))
45
-
46
- # ── 2. 上一轮 outputs 是否还原(workspace/outputs/,eager 模型) ──────────
47
- # 关键断言:脚本直接通过绝对路径 open() 就能读到,**没有任何 read_file 物化操作**。
48
- # 如果还原走的是 lazy(旧模型),这里会失败 —— 这就是 eager 模型的保障验证点。
49
- print("\n[2] 上一轮 outputs eager 还原(workspace/outputs/)")
50
- check("outputs 目录已落盘", OUTPUTS_DIR.exists(), str(OUTPUTS_DIR))
51
-
52
- if OUTPUTS_DIR.exists():
53
- result_files = sorted(OUTPUTS_DIR.glob("results_*.json"))
54
- check("至少一个 results 文件存在", len(result_files) > 0)
55
-
56
- if result_files:
57
- latest = result_files[-1]
58
- # 直接用 open()/read_text,不经任何工具,等价于 bash 脚本里 cat / Path.read_text
59
- try:
60
- data = json.loads(latest.read_text(encoding="utf-8"))
61
- total = data.get("total", 0)
62
- check("records 数量 > 0", total > 0, f"total={total}")
63
- check("records 字段存在", "records" in data)
64
- check("脚本直接 open() 可读(eager 还原已就位)", True,
65
- f"{latest.name} {latest.stat().st_size}B")
66
- except FileNotFoundError as e:
67
- check("脚本直接 open() 可读(eager 还原已就位)", False,
68
- f"FileNotFoundError —— eager 还原可能未生效: {e}")
69
- except Exception as e:
70
- check(f"{latest.name} 可解析", False, str(e))
71
-
72
- # ── 3. SKILL_NAME 推断正确 ────────────────────────────────────────────────────
73
- print("\n[3] SKILL_NAME 推断")
74
- check("SKILL_NAME == 'runtime-inspector'", SKILL_NAME == "runtime-inspector",
75
- f"actual={SKILL_NAME!r}")
76
-
77
- # 写一个带 SKILL_NAME 的标记文件,验证 OUTPUTS_DIR 路径包含正确的 skill 名
78
- OUTPUTS_DIR.mkdir(parents=True, exist_ok=True)
79
- marker = OUTPUTS_DIR / f"skill_name_check_{timestamp()}.txt"
80
- marker.write_text(SKILL_NAME, encoding="utf-8")
81
- check("OUTPUTS_DIR 包含正确 skill 名",
82
- "runtime-inspector" in str(marker),
83
- f"actual path={marker}")
84
-
85
- # ── 4. lib 可 import ──────────────────────────────────────────────────────────
86
- print("\n[4] lib 可 import")
87
- try:
88
- import client as _solvea_client # solvea-api/client.py
89
- check("solvea-api client 可 import", True)
90
- except ImportError as e:
91
- check("solvea-api client 可 import", False, str(e))
92
-
93
- # ── 结果汇总 ──────────────────────────────────────────────────────────────────
94
- print(f"\n{_SECTION}")
95
- if _failures:
96
- print(f"RESULT: ❌ FAIL ({len(_failures)} 项断言失败)")
97
- for f in _failures:
98
- print(f" - {f}")
99
- else:
100
- print("RESULT: ✅ PASS 所有断言通过")
101
- print(_SECTION)
@@ -1,41 +0,0 @@
1
- #!/usr/bin/env python3
2
- """向 workspace/outputs 和 workspace/state 写入测试文件,验证写入机制和 S3 上传路径。"""
3
- import os, sys
4
- sys.path.insert(0, os.path.join(os.environ["SOLVEA_LIB_DIR"], "skill-runtime"))
5
- from bootstrap import *
6
- import json
7
- from datetime import datetime, timezone
8
-
9
- now = datetime.now(timezone.utc).isoformat()
10
-
11
- # 1. outputs — 每轮不同文件名(模拟 run_id 命名)
12
- run_id = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
13
- out_dir = OUTPUTS_DIR
14
- out_dir.mkdir(parents=True, exist_ok=True)
15
- out_file = out_dir / f"{run_id}_test.json"
16
- out_file.write_text(json.dumps({
17
- "run_id": run_id,
18
- "written_at": now,
19
- "note": "此文件每轮新建,S3 上累积保留",
20
- }, indent=2))
21
- print(f"[outputs] Written: {out_file}")
22
-
23
- # 2. state — 固定文件名(模拟跨轮状态覆盖)
24
- state_file = STATE_DIR / "inspect.json"
25
- existing = {}
26
- if state_file.exists():
27
- try:
28
- existing = json.loads(state_file.read_text(encoding="utf-8"))
29
- except Exception:
30
- pass
31
- existing.update({
32
- "last_run_id": run_id,
33
- "last_written_at": now,
34
- "write_count": existing.get("write_count", 0) + 1,
35
- "note": "固定文件名,S3 上传时覆盖旧版本",
36
- })
37
- state_file.parent.mkdir(parents=True, exist_ok=True)
38
- state_file.write_text(json.dumps(existing, ensure_ascii=False, indent=2), encoding="utf-8")
39
- print(f"[state] Written: {state_file} (write_count={existing['write_count']})")
40
-
41
- print("\n✅ 写入完成。下一轮运行 read_state.py 验证跨轮持久化。")
@@ -1,17 +0,0 @@
1
- ---
2
- name: setup
3
- description: 安装 CXClaw 后完成钉钉登录、租户选择和本地环境自检。
4
- ---
5
-
6
- # CXClaw Setup
7
-
8
- 1. 后续命令统一使用 `npx --yes @shulex/cxclawctl@latest`。运行
9
- `npx --yes @shulex/cxclawctl@latest auth status`;已经登录时不要重复授权,未登录再运行
10
- `npx --yes @shulex/cxclawctl@latest auth login --server <公司提供的 shulex-cloud 授权地址>`。
11
- 2. 请用户在钉钉授权页完成验证。不要代替用户授权,也不要展示或记录 token。
12
- 3. 用户要求测试环境时运行 `npx --yes @shulex/cxclawctl@latest tenant search <租户名称> --env test`;生产环境必须明确使用 `--env prod`,不能自行推断。
13
- 4. 用户确认目标租户后,运行 `npx --yes @shulex/cxclawctl@latest tenant use <accountId> --env <test|prod> --purpose <用途>`。
14
- 5. 运行 `npx --yes @shulex/cxclawctl@latest doctor` 和
15
- `npx --yes @shulex/cxclawctl@latest update --install-scheduler`。只有两步都成功才报告安装完成。
16
-
17
- 写操作必须先调用同一业务命令的 `--phase preview` 并展示结果;等待用户明确确认后,使用 `--phase commit --confirmation-token-stdin --idempotency-key <key>` 提交。不得把确认凭证写入命令参数、文件或日志。
@@ -1,39 +0,0 @@
1
- ---
2
- name: shulex-support
3
- description: Shulex 产品支持统一入口。凡用户提到 badcase、异常回复、失败节点、报错、卡住、排查,或提供 ChatId / 会话 ID / External ID 要求定位会话,优先使用本 skill;也用于产品咨询、功能需求和售后工单。
4
- requires:
5
- libs:
6
- - solvea-api
7
- ---
8
-
9
- # Shulex Support
10
-
11
- 处理 Shulex 产品咨询、Agent 会话诊断和售后工单。先判断用户属于哪一种场景,只进入对应流程;不要先把三套材料全部读完。
12
-
13
- ## 入口优先级
14
-
15
- **Agent 会话诊断优先于运营分析。** 用户只要描述异常、badcase、错误、失败、卡住、答非所问,或要求根据 ChatId / 会话 ID / External ID 查原因,主流程先进入本 skill 的 Agent 会话诊断场景,读取 `references/badcase-analysis/overview.md`。如需整体指标或样本统计,可再调用 `agent-analytics` 提供辅助证据,不要因此改变 badcase 的主责入口。
16
-
17
- 只有用户明确要统计指标、趋势、排行、分页列表或运营报表,且不要求解释某次会话异常时,才使用 `agent-analytics`。
18
-
19
- ## 场景分流
20
-
21
- | 用户意图 | 处理方式 |
22
- |---|---|
23
- | 咨询产品使用、配置、排障、售后政策 | 读取 `references/product-docs.md`,基于产品文档回答 |
24
- | 提出功能需求、产品改进建议,或明确说“提个需求/希望支持/能不能增加” | 读取 `references/tickets.md`,按 `ticket_feature` 整理需求工单;先确认明细再创建 |
25
- | 提供 ChatId / 会话 ID / 外部会话 ID,要求分析 badcase、异常回复、失败节点或语音通话问题 | 读取 `references/badcase-analysis/overview.md`,按文本 / 语音流程诊断 |
26
- | 明确要提交工单,或文档查询无法解决 | 读取 `references/tickets.md`,收集必要信息并确认后创建 |
27
- | 查询某个工单怎么样了 | 读取 `references/tickets.md`,根据工单号查询状态和最新消息 |
28
- | 继续补充某个工单的问题 | 读取 `references/tickets.md`,根据工单号追加用户消息 |
29
- | 只提供任意 ID,未说明目的 | 默认按会话 ID 进入 Agent 会话诊断;只有 `ST...` 开头或用户明确说“售后工单/查询工单/追加工单”时才走售后工单 |
30
- | 只说"售后""工单"但目标不清楚 | 先问用户目标;确认后再读取 `references/tickets.md` |
31
-
32
- ## 处理原则
33
-
34
- 1. **先分流再处理**:ChatId 会话异常直接诊断;普通产品问题先查文档;用户提出功能需求/改进建议,或明确要提单、诊断后需要人工跟进时,进入工单流程。
35
- 2. **不伪造工单状态**:没有查到工单或当前运行时没有可用接口时,直接说明无法确认,不要编造状态、客服回复或预计处理时间。
36
- 3. **区分会话 ID 与售后工单号**:ChatId、会话 ID、外部会话 ID用于 Agent 会话诊断,也可作为 `agent_badcase` 工单的扩展字段;孤立 ID 默认视为会话 ID。只有 `ST...` 开头的 ID,或用户明确提到售后工单、查询工单、追加工单时,才把 ID 当售后工单号处理。
37
- 4. **信息最小化**:提交工单只收集当前问题需要的信息,不主动索要无关隐私。
38
- 5. **邮箱可选**:有邮箱时可用于后续通知;没有邮箱也不阻塞工单链路。
39
- 6. **先确认后提交**:调用 `create-ticket` 之前,必须先把整理好的工单明细列给用户,得到用户明确确认后才提交,绝不能直接创建。
@@ -1,34 +0,0 @@
1
- # Agent 会话诊断入口
2
-
3
- **原则**:本文件只做信息收集和文本/语音Agent会话分流。不要在入口文件里展开完整分析流程,不要预加载全部 references。
4
-
5
- ## 启动时必须收集信息
6
-
7
- 先从当前消息和会话上下文提取会话标识与问题描述。用户已经给出 ChatId、会话 ID 或外部会话 ID 时直接开始,不要重复询问;缺少会话标识时只补问缺失信息。
8
-
9
- 用户只提供一个 ID、或明确说这是 chatId / 会话 ID 时,默认进入本流程。只有 `ST...` 开头的 ID,或用户明确提到售后工单、查询工单、追加工单时,才切到售后工单流程。
10
-
11
- ```text
12
- 需要以下信息来帮你诊断这条会话:
13
-
14
- 1. **chatId / 会话 ID / 外部会话 ID**(必填):请提供要诊断的会话标识
15
- 2. **问题描述**(选填):这条会话哪里有问题?如果是语音/电话问题,请说明是否有 callId、callSid、VAPI/Twilio 信息。
16
-
17
- 请提供以上信息后我开始分析。
18
- ```
19
-
20
- 收到会话标识后才执行后续诊断流程。若用户未提供会话标识,不得开始任何数据拉取。
21
-
22
- ## 分流规则
23
-
24
- 1. 用户明确提到语音、电话、VAPI、Twilio、callId、callSid、断音、延迟、STT、TTS、录音、webhook:读取 `/skills/shulex-support/references/badcase-analysis/voice/core-flow.md`。
25
- 2. 用户描述普通 AI 客服文本回复问题:读取 `/skills/shulex-support/references/badcase-analysis/text/core-flow.md`。
26
- 3. 不确定时先按文本流程走:读取 `/skills/shulex-support/references/badcase-analysis/text/core-flow.md`。
27
- 4. 文本流程中 `get-transcript --chat-id` 查不到、返回空或 404:停止文本流程,读取 `/skills/shulex-support/references/badcase-analysis/voice/core-flow.md` 做语音兜底排查。
28
-
29
- ## 读取规则
30
-
31
- - 只先读取对应的 `core-flow.md`。
32
- - 其它 references 由 core-flow 指引按需读取。
33
- - 不要使用 `cat` 读取 `/workspace` 或 `/skills` 路径;单纯读文件统一用 read_file 工具。
34
- - 语音排查不生成独立报告模板,最终仍按 badcase 风格说明发生了什么、为什么、关键证据和建议。
@@ -1,105 +0,0 @@
1
- # 会话记录读取
2
-
3
- `get-transcript` 获取单条会话记录详情。后端对象名为 `Transcript`,诊断说明统一称“会话记录”。
4
-
5
- ## 基本原则
6
-
7
- 始终结合用户的问题描述读取会话记录。先定位用户认为有问题的目标轮次、实际结果和预期结果,再查看影响该问题的字段及必要的前置轮次。不要脱离问题描述扫描所有字段,也不要从单个字段直接跳到根因。
8
-
9
- ```bash
10
- npx --yes @shulex/cxclawctl@latest api get-transcript --chat-id <chatId> --pretty
11
- ```
12
-
13
- CLI 默认请求 `isCompare=true`,因此每条消息通常同时返回保存的 `context` 和根据当前资源生成的 `contextComparison`。
14
-
15
- ## 读取顺序
16
-
17
- 1. 从用户描述提取异常现象、目标轮次、实际结果和预期结果。
18
- 2. 在 `messages[]` 中定位目标用户消息和对应回复。
19
- 3. 多轮上下文可能影响结果时,再向前读取必要轮次,不默认分析整段会话。
20
- 4. 读取目标回复的 `context`,还原意图、策略、Agent、知识、工具和流程信号。
21
- 5. 读取 `contextComparison` 判断历史资源后来是否被修改或删除。
22
- 6. 将直接事实、当前状态和推断分开记录,再进入对应模块。
23
-
24
- ## 四层结构
25
-
26
- ### 会话层
27
-
28
- | 字段 | 用途 |
29
- |------|------|
30
- | `chatId` | 会话标识 |
31
- | `touchPoint` | email、livechat 等入口,会影响检索和回复链路 |
32
- | `subject` / `snippet` | 邮件主题和摘要,只作上下文,不能代替原始消息 |
33
- | `createdAt` | 会话开始时间,查询日志的时间基准 |
34
- | `handoff` / `handoffAt` / `takeoverAt` | 是否转人工及人工介入情况 |
35
- | `stat` / `error` / `debug` | 会话状态、顶层错误和调试标记 |
36
- | `metadata.__bot_id` | Bot ID;不是稳定的顶层 `botId` 字段 |
37
- | `messages[]` | 原始用户、AI、人工和流程消息 |
38
-
39
- ### 消息层 `messages[]`
40
-
41
- | 字段 | 用途 |
42
- |------|------|
43
- | `id` / `turn` / `createdAt` | 定位目标消息、轮次和时间 |
44
- | `role` / `messageRole` | USER、ASSISTANT、人工等角色 |
45
- | `content` / `attachments` | 原始消息和附件,优先于摘要 |
46
- | `type` | MESSAGE、TO_AGENT、STOPPED、CONFUSED、HUMAN_REVIEW 等动作结果 |
47
- | `handoff` / `reason` / `reasonDesc` | 本条消息是否转人工及原因 |
48
- | `reasonList` / `reasonsDescList` | 同一回复的多个原因 |
49
- | `filteredContent` | 回复被检查或拦截时的原始候选内容 |
50
- | `context` | 该轮保存的执行上下文 |
51
- | `contextComparison` | 保存上下文与当前资源的比较结果 |
52
-
53
- `type`、`reason`、意图、策略等通常属于目标回复,不要误当成会话顶层字段。
54
-
55
- ### 执行上下文 `messages[].context`
56
-
57
- 按问题读取,不要求每次全部展开:
58
-
59
- | 字段 | 用途 |
60
- |------|------|
61
- | `mixedQuery` | 原始问题、用户 query、知识 query 及翻译/改写结果 |
62
- | `intents[]` / `intent` / `originIntent` | 候选意图及兼容字段;值不同是排查信号,不自动等于意图漂移 |
63
- | `strategyId` / `strategyName` / `strategyAction` | 命中策略及动作 |
64
- | `metadata` | 变量系统字段和运行元数据;`ai_fields` 等值位于此层 |
65
- | `retrievedKus` | 历史召回的 QA 候选、分数、排名及是否实际生效 |
66
- | `directoryIds` | 本轮知识检索范围 |
67
- | `documentQaContext` / `recommendProductContext` | 实际使用的文档、chunk 和商品上下文 |
68
- | `toolCalls` | 工具名、参数和错误信息 |
69
- | `aiContent` / `filteredContent` | LLM 原始回复及后处理前后的差异线索 |
70
- | `metadata.real_time_inspection_tags` | 实时质检命中的标签;是本轮送检结果的首要事实证据 |
71
- | `currentPrompt` | Prompt 线索,注意下面的历史快照限制 |
72
- | `context.timing.__stage_time_total` | 本轮总耗时;不要使用不存在的 `perf.total` |
73
- | `ext` | Agent/ChatFlow 执行信息,如 `invoke_agent_id`、`chatflow_run_info`、`graph_finished`、`ai_agent_history_msg` |
74
-
75
- ### 当前状态比较 `messages[].contextComparison`
76
-
77
- | 字段 | 用途 |
78
- |------|------|
79
- | `chatContext` | 用当前资源信息补充后的上下文 |
80
- | `contextModifiedList` | 历史使用的知识、意图或策略后来被修改/删除 |
81
- | `unusedKus` | 历史候选全部未生效时展示的知识 |
82
- | `kuFolderCount` | 历史知识涉及的目录数量 |
83
- | `entities` / `strategyAction` | 当前可展示的实体与策略动作 |
84
-
85
- `contextComparison` 不是重新执行目标轮次,也不会重新跑意图、知识召回、工具或 Agent。
86
-
87
- ## 历史与当前状态边界
88
-
89
- - `context` 主要来自当次保存的执行上下文,可作为历史事实来源。
90
- - `contextComparison` 是读取时与当前资源的比较结果,不能当成当次运行配置。
91
- - 当历史 `currentPrompt` 为空时,后端可能用当前 Agent Prompt 补填;因此它不一定是历史运行快照。
92
- - 当前 Agent、意图、策略、知识或 ChatFlow 图只能说明现在的配置。要证明历史运行时配置,需结合保存的版本、`contextModifiedList` 或日志。
93
-
94
- ## 常见路由
95
-
96
- | 会话记录信号 | 下一步 |
97
- |--------------|--------|
98
- | 意图、策略与预期不符 | M2 / M3 |
99
- | 变量系统字段缺失或错误 | M4 |
100
- | Agent 类型、调用轮次或工具循环异常 | M5 / M6 |
101
- | 召回内容正确但 `aiContent` 或最终回复错误 | M7 |
102
- | `retrievedKus`、query、目录、排序或使用知识异常 | M9 |
103
- | `metadata.real_time_inspection_tags` 有值,或回复被合规原因拦截/转人工 | M12 |
104
- | `ext.chatflow_run_info` 出现节点执行或路由问题 | M10 |
105
- | 算法 rewrite / NER / reply / check 异常 | M11 |
@@ -1,89 +0,0 @@
1
- # 文本 badcase 核心流程
2
-
3
- 本文件只负责编排。字段解释、配置检查和日志查询由会话记录说明及对应模块文档负责。
4
-
5
- ## 1. 理解问题并获取会话记录
6
-
7
- 始终围绕用户的问题描述排查。先明确用户指出的异常、实际结果、预期结果和可能的目标轮次;信息已经给出时不要重复询问。
8
-
9
- 所有用户提供的会话标识都先按内部 `chatId` 查询,包括看起来像外部系统 ID 的值:
10
-
11
- ```bash
12
- npx --yes @shulex/cxclawctl@latest api get-transcript --chat-id <用户提供的会话标识> --pretty
13
- ```
14
-
15
- 只有 `get-transcript --chat-id` 查不到、返回空或 404 时,才把同一个值作为外部会话 ID 走 Inbox 同源搜索解析内部 chatId,再拉详情:
16
-
17
- ```bash
18
- npx --yes @shulex/cxclawctl@latest api resolve-transcript-chat-id --external-id <用户提供的会话标识> --page-size 10 --pretty
19
- npx --yes @shulex/cxclawctl@latest api get-transcript --chat-id <resolvedChatId> --pretty
20
- ```
21
-
22
- 解析返回多个候选时,优先使用 `matchedBy=exactExternalId` 的结果;没有精确匹配时,先向用户说明候选并确认目标会话,不要随意拿 keyword 首条继续诊断。
23
-
24
- 命令默认携带 `isCompare=true`。返回的是会话记录详情,`Transcript` 只是后端对象和命令中的技术名称。
25
-
26
- ## 2. 定位目标事实
27
-
28
- 读取 `/skills/shulex-support/references/badcase-analysis/text/conversation-record.md`,定位目标消息及必要的前置轮次,先回答:
29
-
30
- - 用户实际说了什么,系统实际回复或执行了什么。
31
- - 目标轮次经过了哪些与问题相关的模块。
32
- - 会话记录直接证明了什么,哪些只是当前状态或推断。
33
-
34
- 不要脱离用户描述遍历全部字段,也不要因为看到某个异常信号就擅自改变排查目标。
35
-
36
- ## 3. 进入对应模块排查
37
-
38
- 根据目标事实按需读取模块文档。配置、图和日志的检查规则由模块文档决定,不在本文件重复。
39
-
40
- | 主要信号 | 模块 |
41
- |----------|------|
42
- | 请求入口、HumanReview 旁路 | M1 入口:`m1-entry.md` |
43
- | 意图识别或改写错误 | M2 意图识别:`m2-intent.md` |
44
- | 策略未命中或命中错误 | M3 策略匹配:`m3-strategy.md` |
45
- | 变量系统字段缺失或值错误 | M4 变量系统:`m4-aifield.md` |
46
- | Agent 类型选择、调用次数或 SINGLE_AGENT / MULTI_AGENT 执行异常 | M5 Agent 执行:`m5-agent.md` |
47
- | 外部工具请求、响应或状态异常 | M6 工具调用:`m6-tool.md` |
48
- | 召回正确但回复生成、Prompt 或后处理异常 | M7 回复生成:`m7-reply.md` |
49
- | 系统错误、超时、空回复 | M8 系统异常:`m8-error.md` |
50
- | 回复后被质检标记、拦截或因合规原因转人工 | M12 质检:`m12-quality-inspection.md` |
51
- | query、检索范围、召回、排序、过滤或知识内容异常 | M9 知识召回:`m9-knowledge-search.md` |
52
- | ChatFlow 图、节点、边、变量或节点内知识/工具异常 | M10 ChatFlow 服务:`m10-chatflow-service.md` |
53
- | ShulexService 的 intent / NER / classify / rewrite / reply / check 异常 | M11 算法服务:`m11-algorithm-service.md` |
54
-
55
- 一个 badcase 可以涉及多个模块,但报告要指出主根因和上游诱因。现有证据不足以确认根因时,按模块文档查询当前配置或聚焦日志;不要无差别拉取所有资源和日志。
56
-
57
- ## 4. 输出结论和建议
58
-
59
- 先写发生了什么,再写为什么。明确区分:
60
-
61
- - **已确认**:会话记录、配置或日志直接证明。
62
- - **当前状态**:读取时的当前配置或知识状态,不一定是历史运行快照。
63
- - **待确认**:证据不足的推断及缺失证据。
64
-
65
- 建议必须对应已确认根因,保持用户给出的业务口径,不得把“可能”“不建议”等表述擅自加强为确定承诺或禁止规则。
66
-
67
- ### 排查不清或用户无法理解时
68
-
69
- - 完成必要的会话、配置或日志检查后根因仍不清晰,必须如实说明缺少什么证据,不要用推测填满结论。
70
- - 用户表示不理解当前结论、不知道如何处理,或希望由售后继续跟进时,切换到本 skill 的售后工单流程。
71
- - 转入售后前先整理 ChatId、问题现象、已确认事实、待确认项、失败节点以及 trace / armsTrace(如有),减少用户重复描述。
72
- - 这里只整理提单信息并征得用户确认,不得直接创建工单;创建、查询或追加工单必须读取 `/skills/shulex-support/references/tickets.md`,并遵守“先确认后提交”。
73
-
74
- ```markdown
75
- ## 会话诊断:chatId=<chatId>
76
-
77
- ### 结论
78
- <发生了什么,主根因是什么>
79
-
80
- ### 实际执行链路
81
- <只列与目标问题相关的关键步骤>
82
-
83
- ### 根因与证据
84
- <区分已确认、当前状态、待确认>
85
-
86
- ### 建议
87
- 1. [可自行调整] <准确的配置或内容建议>
88
- 2. [需联系研发] <代码、服务或运行时问题>
89
- ```
@@ -1,36 +0,0 @@
1
- # 日志查询约束
2
-
3
- 统一证据收集阶段调用 `npx --yes @shulex/cxclawctl@latest sls query` 时必须遵守以下规则,避免无节制地查日志。
4
-
5
- ## 硬上限
6
-
7
- - **单轮诊断最多 20 次 SLS 查询**(含 Step 1 定位 trace 的查询)
8
- - 达到上限即停止查询,在报告中写明:「当前日志层面已分析到位,建议联系研发团队进一步排查。」
9
-
10
- ## 连续空结果止损
11
-
12
- - 连续 3 次查询返回 `count=0` → **停止继续扩词或换关键字**
13
- - 优先自查:
14
- 1. trace 是否定位到了?Step 1 的 `rest:"<chatId>"` 和入口路径是否写对?
15
- 2. query DSL 字段名是否拼错(`rest` / `trace` / `severity`)?
16
- 3. 时间窗是否包含了会话记录的 `createdAt`?
17
- - 若三项自查后仍无结果,停止继续查日志,用已收集到的会话记录、配置和手册证据出报告,并说明日志未能确认。
18
-
19
- ## 查询策略
20
-
21
- - **必须先定位 trace 再查模块日志**:不允许无 trace 的全库检索。
22
- - 模块日志严格按会话记录、配置和模块手册信号选择,不要批量拉所有模块。
23
- - 同一模块先用 `"line": 20`,定位到关键行再决定是否扩量;禁止一次请求 `"line": 500`。
24
-
25
- ## DSL 写法规范
26
-
27
- - 字段名不带引号:`rest` / `trace` / `severity` / `ext_2` 等
28
- - 字符串值必须加双引号:`rest:"HTTP_ASPECT"`(不是 `rest:HTTP_ASPECT`)
29
- - 关键字大写:`AND` / `OR` / `NOT`
30
- - 多条件用括号分组:`trace:"xxx" AND (rest:"A" OR rest:"B")`
31
-
32
- ## 时间窗
33
-
34
- - 应用日志保留一个月;带上 trace 后时间窗放宽到 ±30min 甚至更宽都安全
35
- - 默认先用 `createdAt ± 5~10min`,漏查再扩到 ±30min
36
- - **禁止反复拉取相同 trace + 相同 query + 相同时间窗**,这是浪费配额
@@ -1,53 +0,0 @@
1
- # M1:入口模块
2
-
3
- **职责**:`BotController` 接收外部请求,统一转发到核心 chat 方法。
4
-
5
- ---
6
-
7
- ## 三条 HTTP 入口
8
-
9
- 所有入口最终汇聚至同一个核心方法:
10
- `BotController.chat(Bot, Cactus, BotChatRequest, Consumer<StreamChatResponse>)`
11
-
12
- | 入口 | 路径 | 触发方式 | Consumer |
13
- |------|------|----------|---------|
14
- | 同步 | `POST /bot/{botId}/chat` | 直接 HTTP | null |
15
- | 流式 | `POST /bot/{botId}/chat/stream` / `chatStream` | SSE | lambda 写 SSE |
16
- | 异步 | `POST /bot/{botId}/chat/async` | Kafka `@KafkaListener` | null |
17
-
18
- 异步路径:请求写 Kafka → `@KafkaListener` 消费 `BotChatAsyncTask` → 解包 → 调用同一 `chat()` 方法。
19
-
20
- ---
21
-
22
- ## 核心 chat() 方法
23
-
24
- ```
25
- chat(Bot, Cactus, BotChatRequest, Consumer)
26
- → 初始化 thread context、chatAliveKey、performance profile
27
- → beforeChat() ← 前置处理(权限、限流等)
28
- → bot.chat() ← DefaultChatbot.chat()(主逻辑)
29
- → afterChat() ← 同步票据、inbox、Prometheus 指标、perf 对象
30
- ```
31
-
32
- **日志**:`CHAT[{}]: botId = {}, tenantId = {}, userId = {}, request = {}`
33
-
34
- ---
35
-
36
- ## HumanReview 旁路
37
-
38
- 在 `DefaultChatbot.chat()` 内,某些场景会跳过意图识别 + 策略匹配,**直接**进入 `agentService.executeAgent()`:
39
-
40
- - **HumanReview 通过**:上一轮人工审核通过后,下一轮直接继续 Agent 执行
41
- - **多轮 Agent 对话**:`useLastTurnParseResult=true` 时跳过 intent parse,复用上轮结果
42
-
43
- HumanReview 旁路时,会话记录中无 `strategyName`,意图识别相关字段也不更新。
44
-
45
- ---
46
-
47
- ## 分析要点
48
-
49
- - `HTTP_ASPECT` 是 SLS 中标记入口请求的关键字,用于定位 trace(见 `sls-query.md`)
50
- - chatId 在 `rest` 字段里(不是 `ext_2`)
51
- - **异步的 trace 在 Kafka 处断开**:生产端 trace_A 与消费端 trace_B 是两条独立 trace,但日志里有 `span` 字段可以跨 Kafka 串联(入口日志里的 span 值 = 消费端日志的 span 值)。M2~M8 的日志落在消费端 trace_B 下。详见 `sls-query.md` 的「异步路径」小节。
52
- - `trace_A.timestamp` 与 `trace_B.timestamp` 差值 ≈ 消息排队时间,可用于判断消费积压
53
- - `context.timing.__stage_time_total` 在 `afterChat()` 后保存,覆盖消费端端到端时间(异步时不含排队)