weflow-cli 1.8.2 → 1.10.0

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 (185) hide show
  1. package/ARCHITECTURE.md +62 -26
  2. package/CHANGELOG.md +1290 -0
  3. package/OPERATIONS.md +144 -11
  4. package/README.en.md +20 -4
  5. package/README.md +30 -5
  6. package/bin/weflow-cli-electron.cjs +2 -0
  7. package/bin/weflow-cli.ts +996 -118
  8. package/dist/bin/weflow-cli.js +1038 -146
  9. package/dist/bin/weflow-cli.js.map +1 -1
  10. package/dist/mcp-server/http.d.ts +14 -0
  11. package/dist/mcp-server/http.d.ts.map +1 -0
  12. package/dist/mcp-server/http.js +84 -0
  13. package/dist/mcp-server/http.js.map +1 -0
  14. package/dist/mcp-server/httpConfig.d.ts +50 -0
  15. package/dist/mcp-server/httpConfig.d.ts.map +1 -0
  16. package/dist/mcp-server/httpConfig.js +104 -0
  17. package/dist/mcp-server/httpConfig.js.map +1 -0
  18. package/dist/mcp-server/index.d.ts +13 -1
  19. package/dist/mcp-server/index.d.ts.map +1 -1
  20. package/dist/mcp-server/index.js +58 -374
  21. package/dist/mcp-server/index.js.map +1 -1
  22. package/dist/src/core/dbPathService.d.ts +12 -0
  23. package/dist/src/core/dbPathService.d.ts.map +1 -1
  24. package/dist/src/core/dbPathService.js +20 -3
  25. package/dist/src/core/dbPathService.js.map +1 -1
  26. package/dist/src/panel/server.d.ts.map +1 -1
  27. package/dist/src/panel/server.js +61 -1
  28. package/dist/src/panel/server.js.map +1 -1
  29. package/dist/src/services/assistantEval.d.ts +69 -0
  30. package/dist/src/services/assistantEval.d.ts.map +1 -1
  31. package/dist/src/services/assistantEval.js +270 -8
  32. package/dist/src/services/assistantEval.js.map +1 -1
  33. package/dist/src/services/assistantScenes.d.ts +81 -0
  34. package/dist/src/services/assistantScenes.d.ts.map +1 -0
  35. package/dist/src/services/assistantScenes.js +322 -0
  36. package/dist/src/services/assistantScenes.js.map +1 -0
  37. package/dist/src/services/assistantService.d.ts +33 -4
  38. package/dist/src/services/assistantService.d.ts.map +1 -1
  39. package/dist/src/services/assistantService.js +102 -6
  40. package/dist/src/services/assistantService.js.map +1 -1
  41. package/dist/src/services/assistantSkills.d.ts +94 -0
  42. package/dist/src/services/assistantSkills.d.ts.map +1 -0
  43. package/dist/src/services/assistantSkills.js +330 -0
  44. package/dist/src/services/assistantSkills.js.map +1 -0
  45. package/dist/src/services/assistantTools.d.ts +34 -1
  46. package/dist/src/services/assistantTools.d.ts.map +1 -1
  47. package/dist/src/services/assistantTools.js +931 -88
  48. package/dist/src/services/assistantTools.js.map +1 -1
  49. package/dist/src/services/assistantTrace.d.ts +4 -0
  50. package/dist/src/services/assistantTrace.d.ts.map +1 -1
  51. package/dist/src/services/assistantTrace.js +9 -0
  52. package/dist/src/services/assistantTrace.js.map +1 -1
  53. package/dist/src/services/configService.d.ts +9 -0
  54. package/dist/src/services/configService.d.ts.map +1 -1
  55. package/dist/src/services/configService.js +5 -2
  56. package/dist/src/services/configService.js.map +1 -1
  57. package/dist/src/services/messageQuery.d.ts +18 -0
  58. package/dist/src/services/messageQuery.d.ts.map +1 -1
  59. package/dist/src/services/messageQuery.js +29 -0
  60. package/dist/src/services/messageQuery.js.map +1 -1
  61. package/dist/src/services/outboundSend.d.ts +53 -0
  62. package/dist/src/services/outboundSend.d.ts.map +1 -0
  63. package/dist/src/services/outboundSend.js +90 -0
  64. package/dist/src/services/outboundSend.js.map +1 -0
  65. package/dist/src/services/pythonBridge.d.ts.map +1 -1
  66. package/dist/src/services/pythonBridge.js +1 -0
  67. package/dist/src/services/pythonBridge.js.map +1 -1
  68. package/dist/src/services/wechatClient.d.ts +125 -0
  69. package/dist/src/services/wechatClient.d.ts.map +1 -0
  70. package/dist/src/services/wechatClient.js +344 -0
  71. package/dist/src/services/wechatClient.js.map +1 -0
  72. package/dist/src/services/wechatMedia.d.ts +44 -0
  73. package/dist/src/services/wechatMedia.d.ts.map +1 -0
  74. package/dist/src/services/wechatMedia.js +155 -0
  75. package/dist/src/services/wechatMedia.js.map +1 -0
  76. package/dist/src/services/wechatMessageService.d.ts +11 -0
  77. package/dist/src/services/wechatMessageService.d.ts.map +1 -1
  78. package/dist/src/services/wechatMessageService.js +55 -11
  79. package/dist/src/services/wechatMessageService.js.map +1 -1
  80. package/dist/src/types.d.ts +4 -0
  81. package/dist/src/types.d.ts.map +1 -1
  82. package/dist/src/utils/python.js +2 -2
  83. package/dist/src/utils/python.js.map +1 -1
  84. package/docs/BRANCHES.md +37 -0
  85. package/docs/CONTACT_DB_SCHEMA.md +1085 -0
  86. package/docs/DECISIONS.md +1624 -0
  87. package/docs/EXTENDING.md +98 -10
  88. package/docs/FUNCTIONAL-IMPROVEMENT-SPEC.md +6 -0
  89. package/docs/HEALTH-CHECK.md +12 -7
  90. package/docs/JEV/345/272/224/347/224/250/346/226/275/345/267/245/346/226/207/346/241/243.md +2 -2
  91. package/docs/MCP.md +58 -4
  92. package/docs/PROJECT_STATE.md +180 -11
  93. package/docs/RELEASING.md +115 -1
  94. package/docs/images/weflow-architecture-gpt-image-2.png +0 -0
  95. package/logo.png +0 -0
  96. package/mcp-server/http.ts +108 -0
  97. package/mcp-server/httpConfig.ts +126 -0
  98. package/mcp-server/index.ts +359 -681
  99. package/package.json +5 -3
  100. package/resources/js/graph3d/NOTICE.txt +35 -0
  101. package/resources/js/graph3d/d3-binarytree.min.js +2 -0
  102. package/resources/js/graph3d/d3-dispatch.min.js +2 -0
  103. package/resources/js/graph3d/d3-force-3d.min.js +2 -0
  104. package/resources/js/graph3d/d3-octree.min.js +2 -0
  105. package/resources/js/graph3d/d3-quadtree.min.js +2 -0
  106. package/resources/js/graph3d/d3-timer.min.js +2 -0
  107. package/resources/js/graph3d/layout.mjs +63 -0
  108. package/resources/js/graph3d/three.min.js +6 -0
  109. package/resources/js/graph3d/viewer2d.js +448 -0
  110. package/resources/panel/ball-position.cjs +48 -2
  111. package/resources/panel/index.html +18 -4
  112. package/resources/panel/main.cjs +137 -5
  113. package/resources/panel/mascot-base.png +0 -0
  114. package/resources/panel/mascot-blink-1.png +0 -0
  115. package/resources/panel/mascot-blink-2.png +0 -0
  116. package/resources/panel/mascot-iris.png +0 -0
  117. package/resources/panel/mascot-lift-down-1.png +0 -0
  118. package/resources/panel/mascot-lift-down-2.png +0 -0
  119. package/resources/panel/mascot-lift-down-3.png +0 -0
  120. package/resources/panel/mascot-lift-down-4.png +0 -0
  121. package/resources/panel/mascot-lift-down-5.png +0 -0
  122. package/resources/panel/mascot-lift-down-6.png +0 -0
  123. package/resources/panel/mascot-lift-up-1.png +0 -0
  124. package/resources/panel/mascot-lift-up-2.png +0 -0
  125. package/resources/panel/mascot-lift-up-3.png +0 -0
  126. package/resources/panel/mascot-lift-up-4.png +0 -0
  127. package/resources/panel/mascot-lift-up-5.png +0 -0
  128. package/resources/panel/mascot-lift-up-6.png +0 -0
  129. package/resources/panel/mascot-peek.png +0 -0
  130. package/resources/panel/mascot-tickle-1.png +0 -0
  131. package/resources/panel/mascot-tickle-2.png +0 -0
  132. package/resources/panel/mascot-tickle-3.png +0 -0
  133. package/resources/panel/mascot-tickle-4.png +0 -0
  134. package/resources/panel/panel.css +205 -59
  135. package/resources/panel/preload.cjs +26 -0
  136. package/resources/panel/renderer.js +646 -17
  137. package/scripts/_utils.py +1203 -931
  138. package/scripts/backfill_articles.py +202 -21
  139. package/scripts/biz_daily.py +26 -34
  140. package/scripts/bonds.py +331 -0
  141. package/scripts/chat_notes.py +561 -470
  142. package/scripts/chat_stats.py +8 -7
  143. package/scripts/check_readme_commands.py +426 -0
  144. package/scripts/compile_wiki.py +187 -59
  145. package/scripts/contact_schema.py +339 -0
  146. package/scripts/data/wechat_emoji.json +225 -0
  147. package/scripts/export_chat_html.py +3 -1
  148. package/scripts/fav_notes.py +4 -1
  149. package/scripts/graph_2d.py +151 -0
  150. package/scripts/graph_3d.py +646 -0
  151. package/scripts/health_check.py +163 -26
  152. package/scripts/mcp_bridge.py +6 -7
  153. package/scripts/nt_decrypt.py +3 -3
  154. package/scripts/panel_frames.py +683 -0
  155. package/scripts/pipeline.py +21 -10
  156. package/scripts/quality_eval.py +5 -0
  157. package/scripts/rag_chat.py +33 -16
  158. package/scripts/reply_debt.py +26 -6
  159. package/scripts/semantic_search.py +130 -22
  160. package/scripts/vault_rag.py +42 -16
  161. package/scripts/vault_search.py +44 -8
  162. package/scripts/wechat_emoticon.py +6 -0
  163. package/scripts/wechat_voice.py +9 -0
  164. package/scripts/wiki_lint.py +124 -24
  165. package/src/core/dbPathService.ts +22 -4
  166. package/src/panel/server.ts +58 -1
  167. package/src/services/assistantEval.ts +323 -12
  168. package/src/services/assistantScenes.ts +342 -0
  169. package/src/services/assistantService.ts +107 -6
  170. package/src/services/assistantSkills.ts +364 -0
  171. package/src/services/assistantTools.ts +2452 -1640
  172. package/src/services/assistantTrace.ts +9 -0
  173. package/src/services/configService.ts +415 -403
  174. package/src/services/messageQuery.ts +29 -0
  175. package/src/services/outboundSend.ts +126 -0
  176. package/src/services/pythonBridge.ts +1 -0
  177. package/src/services/wechatClient.ts +380 -0
  178. package/src/services/wechatMedia.ts +166 -0
  179. package/src/services/wechatMessageService.ts +62 -11
  180. package/src/types.ts +4 -0
  181. package/src/utils/python.ts +2 -2
  182. package/dist/src/utils/wechatEmoji.d.ts +0 -5
  183. package/dist/src/utils/wechatEmoji.d.ts.map +0 -1
  184. package/dist/src/utils/wechatEmoji.js +0 -35
  185. package/dist/src/utils/wechatEmoji.js.map +0 -1
@@ -0,0 +1,151 @@
1
+ # -*- coding: utf-8 -*-
2
+ """把知识库导成一张**2D** 图谱页面(更像 Obsidian 那种平面图;同样自包含、不联网)。
3
+
4
+ 与 3D 那份(`graph_3d.py`)的分工:**图怎么建**是同一套(点 = 概念页,边 = 正文里的 `[[链接]]`,
5
+ 排除 `## 来源` 那一段,也共用 `--min-degree` / `--line` 的过滤),直接 import 过来;
6
+ 这里只换两件事:
7
+
8
+ 1. **布局按 2D 算** —— 不是把 3D 的 x/y 拍扁。z 那一维也承载结构,拍扁会把两团本不相干的点叠在一起;
9
+ 2D 的解也快得多,所以同一张图重算得起。
10
+ 2. **渲染换成 canvas**(`resources/js/graph3d/viewer2d.js`)——不需要 three.js,这页一张图都不引。
11
+
12
+ 为什么单独一个文件、而不是给 3D 那份加个开关:两套渲染器各两百来行,塞进一个文件就没人看得完了;
13
+ 共用的部分留在 `graph_3d.py`,两个入口都从那里取。
14
+ """
15
+ import argparse
16
+ import hashlib
17
+ import json
18
+ import os
19
+ import subprocess
20
+ import sys
21
+ from pathlib import Path
22
+
23
+ REPO = Path(__file__).resolve().parent.parent
24
+ sys.path.insert(0, str(REPO / 'scripts'))
25
+ sys.path.insert(0, str(REPO))
26
+ # 先切到仓库根(`wiki_lint.CARD_DIRS` 是导入时按 cwd 算的,见 graph_3d.py 里那段)
27
+ os.chdir(REPO)
28
+ import graph_3d as g # noqa: E402
29
+
30
+ VIEWER2D = g.LIB_DIR / 'viewer2d.js'
31
+ LAYOUT = g.LIB_DIR / 'layout.mjs'
32
+ DEFAULT_OUT = REPO / 'output' / 'knowledge-graph-2d.html'
33
+
34
+
35
+ def _parse_args(argv):
36
+ ap = argparse.ArgumentParser(description='把知识库导成一张自包含的 2D 图谱页面(只读本地、不联网)')
37
+ ap.add_argument('--vault', default=str(g.DEFAULT_VAULT), help='Vault 根目录(默认 output/wechat-vault)')
38
+ ap.add_argument('--out', default=str(DEFAULT_OUT), help='页面写到哪(默认 output/knowledge-graph-2d.html)')
39
+ ap.add_argument('--min-degree', dest='min_degree', metavar='N', type=int, default=0,
40
+ help='只画在原图里连接数 ≥N 的概念(去掉细枝,看骨架);0 = 全画')
41
+ ap.add_argument('--line', dest='line', metavar='WHICH', choices=['all', 'wiki', 'chat'], default='all',
42
+ help='只画某一条线:文章线的概念页 / 聊天线的概念页 / 两条都画')
43
+ ap.add_argument('--ticks', type=int, default=250, help='力导向迭代次数(2D 比 3D 快得多)')
44
+ ap.add_argument('--cache', default=str(g.CACHE_DIR), help='布局缓存目录(派生数据;测试请指到临时目录)')
45
+ ap.add_argument('--dry-run', action='store_true', help='只报概念与链接数:不写文件、也不算布局')
46
+ ap.add_argument('--json', action='store_true', help='输出机器可读结果')
47
+ return ap.parse_args(argv)
48
+
49
+
50
+ def _missing():
51
+ # 2D 页面**不需要 three.js**:布局用 d3,渲染是裸 canvas。缺件要在跑布局之前说清楚,
52
+ # 否则报错会长得像"库坏了"。
53
+ wanted = [VIEWER2D, LAYOUT] + [g.LIB_DIR / f for f in g.LIB_D3]
54
+ return [p.name for p in wanted if not p.exists()]
55
+
56
+
57
+ def main(argv=None):
58
+ # 手跑时 stdout 是本机编码(这台机器是 GBK),中文会乱码、非 GBK 字符直接崩掉整次生成
59
+ sys.stdout.reconfigure(encoding='utf-8', errors='replace')
60
+ args = _parse_args(sys.argv[1:] if argv is None else argv)
61
+ vault = Path(args.vault)
62
+ # 与 `graph_3d.build_graph` 一样,清单从 `_utils.KNOWLEDGE_LINES` 读(经 `wiki_lint` 透出),
63
+ # 不在这里硬编码——硬编码的地方不会跟着清单变,只会静默少算。
64
+ if not any((vault / concepts).is_dir() for _line, _root, concepts in g.wl.KNOWLEDGE_LINES):
65
+ return g._fail('Vault 里没有概念目录:%s(先跑 `wiki compile`,或用 --vault 指定)' % vault, args.json)
66
+
67
+ nodes, links = g.build_graph(vault, min_degree=args.min_degree, line=args.line)
68
+ if args.dry_run:
69
+ if args.json:
70
+ print(json.dumps({'success': True, 'action': 'graph-2d', 'dryRun': True, 'dims': 2,
71
+ 'nodes': len(nodes), 'links': len(links), 'vault': str(vault),
72
+ 'minDegree': args.min_degree, 'line': args.line,
73
+ 'readsLocalData': True, 'invokesAI': False, 'sendsNothing': True},
74
+ ensure_ascii=False))
75
+ else:
76
+ print('概念 %d 个、链接 %d 条(--dry-run:没有写文件)' % (len(nodes), len(links)))
77
+ return 0
78
+
79
+ missing = _missing()
80
+ if missing:
81
+ return g._fail('缺件:%s(应当在 %s 下随包发)' % ('、'.join(missing), g.LIB_DIR), args.json)
82
+
83
+ data = json.dumps({'nodes': nodes, 'links': links}, ensure_ascii=False, separators=(',', ':'))
84
+ # 页面数据一份(含线的展示名),缓存键用抽掉展示名的那一份 —— 理由见 graph_3d.py
85
+ html_data = json.dumps({'nodes': nodes, 'links': links, 'lineLabels': g._utils.LINE_LABELS},
86
+ ensure_ascii=False, separators=(',', ':'))
87
+ # 与 3D 分开分槽:同一张图的 2D 与 3D 坐标不通用,各存一份(见 graph_3d.py 里那段注释)
88
+ digest = g.layout_key(data, 2, args.ticks)
89
+ cache = Path(args.cache)
90
+ cache.mkdir(parents=True, exist_ok=True)
91
+ graph_file = cache / ('graph-%s.json' % digest)
92
+ pos_file = cache / ('positions-%s.json' % digest)
93
+ same = graph_file.exists() and graph_file.read_text(encoding='utf-8') == data
94
+ if same and pos_file.exists():
95
+ print('图没变,沿用已有布局')
96
+ else:
97
+ graph_file.write_text(data, encoding='utf-8')
98
+ g.run_layout(cache, digest, 2, args.ticks)
99
+ pos = pos_file.read_text(encoding='utf-8')
100
+
101
+ viewer = VIEWER2D.read_text(encoding='utf-8')
102
+ page = f"""<!doctype html>
103
+ <html lang="zh"><head><meta charset="utf-8">
104
+ <title>知识库 2D({len(nodes)} 个概念)</title>
105
+ <style>
106
+ html,body {{ margin:0; height:100%; background:#05070e; color:#c9d3e6;
107
+ font:13px/1.5 -apple-system,"Segoe UI","Microsoft YaHei",system-ui,sans-serif;
108
+ overflow:hidden; user-select:none; }}
109
+ /* canvas 是**替换元素**:`inset:0` 不会让它铺满(right/bottom 被忽略,它保持固有的 300x150),
110
+ 所以必须显式给 width/height。少了这一条,视图按 300x150 算,整张图画在左上角一小块里。 */
111
+ #cv {{ position:fixed; inset:0; width:100%; height:100%; display:block; cursor:grab; touch-action:none; }}
112
+ #hud {{ position:fixed; left:14px; top:12px; pointer-events:none; max-width:62vw; }}
113
+ #stats {{ color:#6d7a93; }}
114
+ #info {{ margin-top:6px; font-size:15px; min-height:22px; }}
115
+ #q {{ position:fixed; right:14px; top:12px; width:220px; padding:6px 10px;
116
+ background:#121826; color:#c9d3e6; border:1px solid #26304a; border-radius:8px; outline:none; }}
117
+ #q:focus {{ border-color:#3f6ad8; }}
118
+ #tag {{ position:fixed; right:14px; bottom:10px; color:#4d5a72; text-align:right; }}
119
+ #boot {{ position:fixed; inset:0; display:flex; align-items:center; justify-content:center;
120
+ background:#05070e; color:#6d7a93; }}
121
+ </style></head>
122
+ <body>
123
+ <canvas id="cv"></canvas>
124
+ <div id="hud"><div id="stats"></div><div id="info">点一个概念看它连着谁 · 拖动平移 · 滚轮缩放</div></div>
125
+ <input id="q" placeholder="搜概念,回车跳过去">
126
+ <div id="tag">2D · 坐标构建期算好 · 双击空白复位</div>
127
+ <div id="boot">正在画…</div>
128
+ <script>window.__DATA__ = {html_data};</script>
129
+ <script>window.__POS__ = "{pos}";</script>
130
+ <script>{viewer}</script>
131
+ </body></html>
132
+ """
133
+ out = Path(args.out)
134
+ out.parent.mkdir(parents=True, exist_ok=True)
135
+ out.write_text(page, encoding='utf-8')
136
+ mb = out.stat().st_size / 1048576
137
+ if args.json:
138
+ print(json.dumps({'success': True, 'action': 'graph-2d', 'dims': 2,
139
+ 'nodes': len(nodes), 'links': len(links), 'out': str(out),
140
+ 'vault': str(vault), 'mb': round(mb, 2),
141
+ 'minDegree': args.min_degree, 'line': args.line,
142
+ 'selfContained': True, 'readsLocalData': True, 'invokesAI': False,
143
+ 'sendsNothing': True}, ensure_ascii=False))
144
+ else:
145
+ print('已生成 %s' % out)
146
+ print(' 概念 %d / 链接 %d / 文件 %.1f MB · 2D' % (len(nodes), len(links), mb))
147
+ return 0
148
+
149
+
150
+ if __name__ == '__main__':
151
+ sys.exit(main())