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.
- package/ARCHITECTURE.md +62 -26
- package/CHANGELOG.md +1290 -0
- package/OPERATIONS.md +144 -11
- package/README.en.md +20 -4
- package/README.md +30 -5
- package/bin/weflow-cli-electron.cjs +2 -0
- package/bin/weflow-cli.ts +996 -118
- package/dist/bin/weflow-cli.js +1038 -146
- package/dist/bin/weflow-cli.js.map +1 -1
- package/dist/mcp-server/http.d.ts +14 -0
- package/dist/mcp-server/http.d.ts.map +1 -0
- package/dist/mcp-server/http.js +84 -0
- package/dist/mcp-server/http.js.map +1 -0
- package/dist/mcp-server/httpConfig.d.ts +50 -0
- package/dist/mcp-server/httpConfig.d.ts.map +1 -0
- package/dist/mcp-server/httpConfig.js +104 -0
- package/dist/mcp-server/httpConfig.js.map +1 -0
- package/dist/mcp-server/index.d.ts +13 -1
- package/dist/mcp-server/index.d.ts.map +1 -1
- package/dist/mcp-server/index.js +58 -374
- package/dist/mcp-server/index.js.map +1 -1
- package/dist/src/core/dbPathService.d.ts +12 -0
- package/dist/src/core/dbPathService.d.ts.map +1 -1
- package/dist/src/core/dbPathService.js +20 -3
- package/dist/src/core/dbPathService.js.map +1 -1
- package/dist/src/panel/server.d.ts.map +1 -1
- package/dist/src/panel/server.js +61 -1
- package/dist/src/panel/server.js.map +1 -1
- package/dist/src/services/assistantEval.d.ts +69 -0
- package/dist/src/services/assistantEval.d.ts.map +1 -1
- package/dist/src/services/assistantEval.js +270 -8
- package/dist/src/services/assistantEval.js.map +1 -1
- package/dist/src/services/assistantScenes.d.ts +81 -0
- package/dist/src/services/assistantScenes.d.ts.map +1 -0
- package/dist/src/services/assistantScenes.js +322 -0
- package/dist/src/services/assistantScenes.js.map +1 -0
- package/dist/src/services/assistantService.d.ts +33 -4
- package/dist/src/services/assistantService.d.ts.map +1 -1
- package/dist/src/services/assistantService.js +102 -6
- package/dist/src/services/assistantService.js.map +1 -1
- package/dist/src/services/assistantSkills.d.ts +94 -0
- package/dist/src/services/assistantSkills.d.ts.map +1 -0
- package/dist/src/services/assistantSkills.js +330 -0
- package/dist/src/services/assistantSkills.js.map +1 -0
- package/dist/src/services/assistantTools.d.ts +34 -1
- package/dist/src/services/assistantTools.d.ts.map +1 -1
- package/dist/src/services/assistantTools.js +931 -88
- package/dist/src/services/assistantTools.js.map +1 -1
- package/dist/src/services/assistantTrace.d.ts +4 -0
- package/dist/src/services/assistantTrace.d.ts.map +1 -1
- package/dist/src/services/assistantTrace.js +9 -0
- package/dist/src/services/assistantTrace.js.map +1 -1
- package/dist/src/services/configService.d.ts +9 -0
- package/dist/src/services/configService.d.ts.map +1 -1
- package/dist/src/services/configService.js +5 -2
- package/dist/src/services/configService.js.map +1 -1
- package/dist/src/services/messageQuery.d.ts +18 -0
- package/dist/src/services/messageQuery.d.ts.map +1 -1
- package/dist/src/services/messageQuery.js +29 -0
- package/dist/src/services/messageQuery.js.map +1 -1
- package/dist/src/services/outboundSend.d.ts +53 -0
- package/dist/src/services/outboundSend.d.ts.map +1 -0
- package/dist/src/services/outboundSend.js +90 -0
- package/dist/src/services/outboundSend.js.map +1 -0
- package/dist/src/services/pythonBridge.d.ts.map +1 -1
- package/dist/src/services/pythonBridge.js +1 -0
- package/dist/src/services/pythonBridge.js.map +1 -1
- package/dist/src/services/wechatClient.d.ts +125 -0
- package/dist/src/services/wechatClient.d.ts.map +1 -0
- package/dist/src/services/wechatClient.js +344 -0
- package/dist/src/services/wechatClient.js.map +1 -0
- package/dist/src/services/wechatMedia.d.ts +44 -0
- package/dist/src/services/wechatMedia.d.ts.map +1 -0
- package/dist/src/services/wechatMedia.js +155 -0
- package/dist/src/services/wechatMedia.js.map +1 -0
- package/dist/src/services/wechatMessageService.d.ts +11 -0
- package/dist/src/services/wechatMessageService.d.ts.map +1 -1
- package/dist/src/services/wechatMessageService.js +55 -11
- package/dist/src/services/wechatMessageService.js.map +1 -1
- package/dist/src/types.d.ts +4 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/python.js +2 -2
- package/dist/src/utils/python.js.map +1 -1
- package/docs/BRANCHES.md +37 -0
- package/docs/CONTACT_DB_SCHEMA.md +1085 -0
- package/docs/DECISIONS.md +1624 -0
- package/docs/EXTENDING.md +98 -10
- package/docs/FUNCTIONAL-IMPROVEMENT-SPEC.md +6 -0
- package/docs/HEALTH-CHECK.md +12 -7
- package/docs/JEV/345/272/224/347/224/250/346/226/275/345/267/245/346/226/207/346/241/243.md +2 -2
- package/docs/MCP.md +58 -4
- package/docs/PROJECT_STATE.md +180 -11
- package/docs/RELEASING.md +115 -1
- package/docs/images/weflow-architecture-gpt-image-2.png +0 -0
- package/logo.png +0 -0
- package/mcp-server/http.ts +108 -0
- package/mcp-server/httpConfig.ts +126 -0
- package/mcp-server/index.ts +359 -681
- package/package.json +5 -3
- package/resources/js/graph3d/NOTICE.txt +35 -0
- package/resources/js/graph3d/d3-binarytree.min.js +2 -0
- package/resources/js/graph3d/d3-dispatch.min.js +2 -0
- package/resources/js/graph3d/d3-force-3d.min.js +2 -0
- package/resources/js/graph3d/d3-octree.min.js +2 -0
- package/resources/js/graph3d/d3-quadtree.min.js +2 -0
- package/resources/js/graph3d/d3-timer.min.js +2 -0
- package/resources/js/graph3d/layout.mjs +63 -0
- package/resources/js/graph3d/three.min.js +6 -0
- package/resources/js/graph3d/viewer2d.js +448 -0
- package/resources/panel/ball-position.cjs +48 -2
- package/resources/panel/index.html +18 -4
- package/resources/panel/main.cjs +137 -5
- package/resources/panel/mascot-base.png +0 -0
- package/resources/panel/mascot-blink-1.png +0 -0
- package/resources/panel/mascot-blink-2.png +0 -0
- package/resources/panel/mascot-iris.png +0 -0
- package/resources/panel/mascot-lift-down-1.png +0 -0
- package/resources/panel/mascot-lift-down-2.png +0 -0
- package/resources/panel/mascot-lift-down-3.png +0 -0
- package/resources/panel/mascot-lift-down-4.png +0 -0
- package/resources/panel/mascot-lift-down-5.png +0 -0
- package/resources/panel/mascot-lift-down-6.png +0 -0
- package/resources/panel/mascot-lift-up-1.png +0 -0
- package/resources/panel/mascot-lift-up-2.png +0 -0
- package/resources/panel/mascot-lift-up-3.png +0 -0
- package/resources/panel/mascot-lift-up-4.png +0 -0
- package/resources/panel/mascot-lift-up-5.png +0 -0
- package/resources/panel/mascot-lift-up-6.png +0 -0
- package/resources/panel/mascot-peek.png +0 -0
- package/resources/panel/mascot-tickle-1.png +0 -0
- package/resources/panel/mascot-tickle-2.png +0 -0
- package/resources/panel/mascot-tickle-3.png +0 -0
- package/resources/panel/mascot-tickle-4.png +0 -0
- package/resources/panel/panel.css +205 -59
- package/resources/panel/preload.cjs +26 -0
- package/resources/panel/renderer.js +646 -17
- package/scripts/_utils.py +1203 -931
- package/scripts/backfill_articles.py +202 -21
- package/scripts/biz_daily.py +26 -34
- package/scripts/bonds.py +331 -0
- package/scripts/chat_notes.py +561 -470
- package/scripts/chat_stats.py +8 -7
- package/scripts/check_readme_commands.py +426 -0
- package/scripts/compile_wiki.py +187 -59
- package/scripts/contact_schema.py +339 -0
- package/scripts/data/wechat_emoji.json +225 -0
- package/scripts/export_chat_html.py +3 -1
- package/scripts/fav_notes.py +4 -1
- package/scripts/graph_2d.py +151 -0
- package/scripts/graph_3d.py +646 -0
- package/scripts/health_check.py +163 -26
- package/scripts/mcp_bridge.py +6 -7
- package/scripts/nt_decrypt.py +3 -3
- package/scripts/panel_frames.py +683 -0
- package/scripts/pipeline.py +21 -10
- package/scripts/quality_eval.py +5 -0
- package/scripts/rag_chat.py +33 -16
- package/scripts/reply_debt.py +26 -6
- package/scripts/semantic_search.py +130 -22
- package/scripts/vault_rag.py +42 -16
- package/scripts/vault_search.py +44 -8
- package/scripts/wechat_emoticon.py +6 -0
- package/scripts/wechat_voice.py +9 -0
- package/scripts/wiki_lint.py +124 -24
- package/src/core/dbPathService.ts +22 -4
- package/src/panel/server.ts +58 -1
- package/src/services/assistantEval.ts +323 -12
- package/src/services/assistantScenes.ts +342 -0
- package/src/services/assistantService.ts +107 -6
- package/src/services/assistantSkills.ts +364 -0
- package/src/services/assistantTools.ts +2452 -1640
- package/src/services/assistantTrace.ts +9 -0
- package/src/services/configService.ts +415 -403
- package/src/services/messageQuery.ts +29 -0
- package/src/services/outboundSend.ts +126 -0
- package/src/services/pythonBridge.ts +1 -0
- package/src/services/wechatClient.ts +380 -0
- package/src/services/wechatMedia.ts +166 -0
- package/src/services/wechatMessageService.ts +62 -11
- package/src/types.ts +4 -0
- package/src/utils/python.ts +2 -2
- package/dist/src/utils/wechatEmoji.d.ts +0 -5
- package/dist/src/utils/wechatEmoji.d.ts.map +0 -1
- package/dist/src/utils/wechatEmoji.js +0 -35
- 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())
|