weflow-cli 1.5.0 → 1.6.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/ARCHITECTURE.md +105 -0
- package/CHANGELOG.md +121 -0
- package/CONTRIBUTING.md +45 -0
- package/LICENSE +21 -21
- package/OPERATIONS.md +272 -0
- package/README.en.md +281 -0
- package/README.md +334 -149
- package/SECURITY.md +47 -0
- package/bin/weflow-cli.ts +4050 -581
- package/dist/bin/weflow-cli.js +4310 -588
- package/dist/bin/weflow-cli.js.map +1 -1
- package/dist/mcp-server/index.js +178 -236
- package/dist/mcp-server/index.js.map +1 -1
- package/dist/src/core/dbPathService.d.ts +15 -1
- package/dist/src/core/dbPathService.d.ts.map +1 -1
- package/dist/src/core/dbPathService.js +177 -19
- package/dist/src/core/dbPathService.js.map +1 -1
- package/dist/src/core/keyService.d.ts +8 -0
- package/dist/src/core/keyService.d.ts.map +1 -1
- package/dist/src/core/keyService.js +127 -22
- package/dist/src/core/keyService.js.map +1 -1
- package/dist/src/core/ntCore.d.ts +59 -1
- package/dist/src/core/ntCore.d.ts.map +1 -1
- package/dist/src/core/ntCore.js +201 -65
- package/dist/src/core/ntCore.js.map +1 -1
- package/dist/src/core/sqlcipherCore.d.ts.map +1 -1
- package/dist/src/core/sqlcipherCore.js +18 -1
- package/dist/src/core/sqlcipherCore.js.map +1 -1
- package/dist/src/core/wcdbCore.d.ts.map +1 -1
- package/dist/src/core/wcdbCore.js +3 -6
- package/dist/src/core/wcdbCore.js.map +1 -1
- package/dist/src/services/assistantDaemon.d.ts +19 -0
- package/dist/src/services/assistantDaemon.d.ts.map +1 -0
- package/dist/src/services/assistantDaemon.js +117 -0
- package/dist/src/services/assistantDaemon.js.map +1 -0
- package/dist/src/services/assistantMemory.d.ts +36 -0
- package/dist/src/services/assistantMemory.d.ts.map +1 -0
- package/dist/src/services/assistantMemory.js +182 -0
- package/dist/src/services/assistantMemory.js.map +1 -0
- package/dist/src/services/assistantPrivacy.d.ts +25 -0
- package/dist/src/services/assistantPrivacy.d.ts.map +1 -0
- package/dist/src/services/assistantPrivacy.js +77 -0
- package/dist/src/services/assistantPrivacy.js.map +1 -0
- package/dist/src/services/assistantRouting.d.ts +18 -0
- package/dist/src/services/assistantRouting.d.ts.map +1 -0
- package/dist/src/services/assistantRouting.js +68 -0
- package/dist/src/services/assistantRouting.js.map +1 -0
- package/dist/src/services/assistantService.d.ts +37 -0
- package/dist/src/services/assistantService.d.ts.map +1 -0
- package/dist/src/services/assistantService.js +284 -0
- package/dist/src/services/assistantService.js.map +1 -0
- package/dist/src/services/assistantTools.d.ts +24 -0
- package/dist/src/services/assistantTools.d.ts.map +1 -0
- package/dist/src/services/assistantTools.js +582 -0
- package/dist/src/services/assistantTools.js.map +1 -0
- package/dist/src/services/chatService.d.ts +44 -0
- package/dist/src/services/chatService.d.ts.map +1 -1
- package/dist/src/services/chatService.js +105 -4
- package/dist/src/services/chatService.js.map +1 -1
- package/dist/src/services/configService.d.ts +55 -0
- package/dist/src/services/configService.d.ts.map +1 -1
- package/dist/src/services/configService.js +147 -6
- package/dist/src/services/configService.js.map +1 -1
- package/dist/src/services/evidenceService.d.ts +30 -0
- package/dist/src/services/evidenceService.d.ts.map +1 -0
- package/dist/src/services/evidenceService.js +98 -0
- package/dist/src/services/evidenceService.js.map +1 -0
- package/dist/src/services/exportService.d.ts +13 -20
- package/dist/src/services/exportService.d.ts.map +1 -1
- package/dist/src/services/exportService.js +113 -47
- package/dist/src/services/exportService.js.map +1 -1
- package/dist/src/services/initKeyService.d.ts +19 -0
- package/dist/src/services/initKeyService.d.ts.map +1 -0
- package/dist/src/services/initKeyService.js +80 -0
- package/dist/src/services/initKeyService.js.map +1 -0
- package/dist/src/services/messageContract.d.ts +23 -0
- package/dist/src/services/messageContract.d.ts.map +1 -0
- package/dist/src/services/messageContract.js +49 -0
- package/dist/src/services/messageContract.js.map +1 -0
- package/dist/src/services/messageQuery.d.ts +7 -0
- package/dist/src/services/messageQuery.d.ts.map +1 -0
- package/dist/src/services/messageQuery.js +30 -0
- package/dist/src/services/messageQuery.js.map +1 -0
- package/dist/src/services/wechat-formatter.js +14 -14
- package/dist/src/services/wechatMessageService.d.ts.map +1 -1
- package/dist/src/services/wechatMessageService.js +31 -3
- package/dist/src/services/wechatMessageService.js.map +1 -1
- package/dist/src/services/whitelistService.d.ts +52 -4
- package/dist/src/services/whitelistService.d.ts.map +1 -1
- package/dist/src/services/whitelistService.js +183 -17
- package/dist/src/services/whitelistService.js.map +1 -1
- package/dist/src/types.d.ts +20 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/dateRange.d.ts +15 -0
- package/dist/src/utils/dateRange.d.ts.map +1 -0
- package/dist/src/utils/dateRange.js +48 -0
- package/dist/src/utils/dateRange.js.map +1 -0
- package/dist/src/utils/mcpSecurity.d.ts +5 -0
- package/dist/src/utils/mcpSecurity.d.ts.map +1 -0
- package/dist/src/utils/mcpSecurity.js +39 -0
- package/dist/src/utils/mcpSecurity.js.map +1 -0
- package/dist/src/utils/packageRoot.d.ts +2 -0
- package/dist/src/utils/packageRoot.d.ts.map +1 -0
- package/dist/src/utils/packageRoot.js +16 -0
- package/dist/src/utils/packageRoot.js.map +1 -0
- package/dist/src/utils/python.d.ts +2 -0
- package/dist/src/utils/python.d.ts.map +1 -0
- package/dist/src/utils/python.js +72 -0
- package/dist/src/utils/python.js.map +1 -0
- package/dist/src/utils/pythonProcessEnv.d.ts +3 -0
- package/dist/src/utils/pythonProcessEnv.d.ts.map +1 -0
- package/dist/src/utils/pythonProcessEnv.js +46 -0
- package/dist/src/utils/pythonProcessEnv.js.map +1 -0
- package/dist/src/utils/talkerUtils.d.ts +4 -1
- package/dist/src/utils/talkerUtils.d.ts.map +1 -1
- package/dist/src/utils/talkerUtils.js +9 -9
- package/dist/src/utils/talkerUtils.js.map +1 -1
- package/dist/src/utils/wechatEmoji.d.ts +5 -0
- package/dist/src/utils/wechatEmoji.d.ts.map +1 -0
- package/dist/src/utils/wechatEmoji.js +35 -0
- package/dist/src/utils/wechatEmoji.js.map +1 -0
- package/docs/AI_INTERFACE.md +189 -0
- package/docs/BRANCHES.md +87 -0
- package/docs/DATA_CONTRACT.md +74 -0
- package/docs/DECISIONS.md +270 -0
- package/docs/DEEPSEEK_V4_FLASH/346/226/275/345/267/245/346/226/207/346/241/243.md +234 -0
- package/docs/EVIDENCE_GUIDE.md +96 -0
- package/docs/MCP.md +95 -0
- package/docs/PARTNERS.md +41 -0
- package/docs/PROJECT_STATE.md +96 -0
- package/docs/RELEASING.md +124 -0
- package/docs/ROADMAP.md +191 -0
- package/docs/SETUP.md +103 -0
- package/docs/images/weflow-architecture-gpt-image-2.png +0 -0
- package/docs/images/weflow-architecture.png +0 -0
- package/docs/images/weflow-architecture.svg +65 -0
- package/mcp-server/index.ts +169 -269
- package/package.json +81 -72
- package/requirements-3x.txt +4 -0
- package/requirements-voice.txt +15 -0
- package/requirements.txt +9 -0
- package/resources/js/marked.min.js +69 -0
- package/resources/wechat-emoji/666.png +0 -0
- package/resources/wechat-emoji/Awesome.png +0 -0
- package/resources/wechat-emoji/Concerned.png +0 -0
- package/resources/wechat-emoji/Cry.png +0 -0
- package/resources/wechat-emoji/Emm.png +0 -0
- package/resources/wechat-emoji/Facepalm.png +0 -0
- package/resources/wechat-emoji/Grin.png +0 -0
- package/resources/wechat-emoji/OK.png +0 -0
- package/resources/wechat-emoji/Respect.png +0 -0
- package/resources/wechat-emoji/Sick.png +0 -0
- package/resources/wechat-emoji/Sleep.png +0 -0
- package/resources/wechat-emoji/Smile.png +0 -0
- package/resources/wechat-emoji//344/272/262/344/272/262.png +0 -0
- package/resources/wechat-emoji//344/276/277/344/276/277.png +0 -0
- package/resources/wechat-emoji//345/201/267/347/254/221.png +0 -0
- package/resources/wechat-emoji//345/202/262/346/205/242.png +0 -0
- package/resources/wechat-emoji//345/206/215/350/247/201.png +0 -0
- package/resources/wechat-emoji//345/207/213/350/260/242.png +0 -0
- package/resources/wechat-emoji//345/212/240/346/262/271.png +0 -0
- package/resources/wechat-emoji//345/213/276/345/274/225.png +0 -0
- package/resources/wechat-emoji//345/217/221/345/221/206.png +0 -0
- package/resources/wechat-emoji//345/217/221/346/200/222.png +0 -0
- package/resources/wechat-emoji//345/217/221/346/212/226.png +0 -0
- package/resources/wechat-emoji//345/217/257/346/200/234.png +0 -0
- package/resources/wechat-emoji//345/217/263/345/223/274/345/223/274.png +0 -0
- package/resources/wechat-emoji//345/217/271/346/260/224.png +0 -0
- package/resources/wechat-emoji//345/220/203/347/223/234.png +0 -0
- package/resources/wechat-emoji//345/220/210/345/215/201.png +0 -0
- package/resources/wechat-emoji//345/220/220.png +0 -0
- package/resources/wechat-emoji//345/221/262/347/211/231.png +0 -0
- package/resources/wechat-emoji//345/222/222/351/252/202.png +0 -0
- package/resources/wechat-emoji//345/222/226/345/225/241.png +0 -0
- package/resources/wechat-emoji//345/223/207.png +0 -0
- package/resources/wechat-emoji//345/225/244/351/205/222.png +0 -0
- package/resources/wechat-emoji//345/230/230.png +0 -0
- package/resources/wechat-emoji//345/230/264/345/224/207.png +0 -0
- package/resources/wechat-emoji//345/230/277/345/223/210.png +0 -0
- package/resources/wechat-emoji//345/233/247.png +0 -0
- package/resources/wechat-emoji//345/233/260.png +0 -0
- package/resources/wechat-emoji//345/235/217/347/254/221.png +0 -0
- package/resources/wechat-emoji//345/244/247/345/223/255.png +0 -0
- package/resources/wechat-emoji//345/244/251/345/225/212.png +0 -0
- package/resources/wechat-emoji//345/244/252/351/230/263.png +0 -0
- package/resources/wechat-emoji//345/244/261/346/234/233.png +0 -0
- package/resources/wechat-emoji//345/245/270/347/254/221.png +0 -0
- package/resources/wechat-emoji//345/245/275/347/232/204.png +0 -0
- package/resources/wechat-emoji//345/247/224/345/261/210.png +0 -0
- package/resources/wechat-emoji//345/256/263/347/276/236.png +0 -0
- package/resources/wechat-emoji//345/260/264/345/260/254.png +0 -0
- package/resources/wechat-emoji//345/272/206/347/245/235.png +0 -0
- package/resources/wechat-emoji//345/274/261.png +0 -0
- package/resources/wechat-emoji//345/274/272.png +0 -0
- package/resources/wechat-emoji//345/276/227/346/204/217.png +0 -0
- package/resources/wechat-emoji//345/276/256/347/254/221.png +0 -0
- package/resources/wechat-emoji//345/277/203/347/242/216.png +0 -0
- package/resources/wechat-emoji//345/277/253/345/223/255/344/272/206.png +0 -0
- package/resources/wechat-emoji//346/201/220/346/203/247.png +0 -0
- package/resources/wechat-emoji//346/202/240/351/227/262.png +0 -0
- package/resources/wechat-emoji//346/203/212/346/201/220.png +0 -0
- package/resources/wechat-emoji//346/203/212/350/256/266.png +0 -0
- package/resources/wechat-emoji//346/204/211/345/277/253.png +0 -0
- package/resources/wechat-emoji//346/206/250/347/254/221.png +0 -0
- package/resources/wechat-emoji//346/211/223/350/204/270.png +0 -0
- package/resources/wechat-emoji//346/212/223/347/213/202.png +0 -0
- package/resources/wechat-emoji//346/212/240/351/274/273.png +0 -0
- package/resources/wechat-emoji//346/212/261/346/213/263.png +0 -0
- package/resources/wechat-emoji//346/213/245/346/212/261.png +0 -0
- package/resources/wechat-emoji//346/213/263/345/244/264.png +0 -0
- package/resources/wechat-emoji//346/215/202/350/204/270.png +0 -0
- package/resources/wechat-emoji//346/217/241/346/211/213.png +0 -0
- package/resources/wechat-emoji//346/222/207/345/230/264.png +0 -0
- package/resources/wechat-emoji//346/223/246/346/261/227.png +0 -0
- package/resources/wechat-emoji//346/225/262/346/211/223.png +0 -0
- package/resources/wechat-emoji//346/227/240/350/257/255.png +0 -0
- package/resources/wechat-emoji//346/227/272/346/237/264.png +0 -0
- package/resources/wechat-emoji//346/231/225.png +0 -0
- package/resources/wechat-emoji//346/234/210/344/272/256.png +0 -0
- package/resources/wechat-emoji//346/234/272/346/231/272.png +0 -0
- package/resources/wechat-emoji//346/261/227.png +0 -0
- package/resources/wechat-emoji//346/265/201/346/263/252.png +0 -0
- package/resources/wechat-emoji//347/202/270/345/274/271.png +0 -0
- package/resources/wechat-emoji//347/203/237/350/212/261.png +0 -0
- package/resources/wechat-emoji//347/210/206/347/253/271.png +0 -0
- package/resources/wechat-emoji//347/210/261/345/277/203.png +0 -0
- package/resources/wechat-emoji//347/214/252/345/244/264.png +0 -0
- package/resources/wechat-emoji//347/216/253/347/221/260.png +0 -0
- package/resources/wechat-emoji//347/224/237/347/227/205.png +0 -0
- package/resources/wechat-emoji//347/226/221/351/227/256.png +0 -0
- package/resources/wechat-emoji//347/231/274.png +0 -0
- package/resources/wechat-emoji//347/231/275/347/234/274.png +0 -0
- package/resources/wechat-emoji//347/232/261/347/234/211.png +0 -0
- package/resources/wechat-emoji//347/235/241.png +0 -0
- package/resources/wechat-emoji//347/240/264/346/266/225/344/270/272/347/254/221.png +0 -0
- package/resources/wechat-emoji//347/244/274/347/211/251.png +0 -0
- package/resources/wechat-emoji//347/244/276/344/274/232/347/244/276/344/274/232.png +0 -0
- package/resources/wechat-emoji//347/246/217.png +0 -0
- package/resources/wechat-emoji//347/254/221/350/204/270.png +0 -0
- package/resources/wechat-emoji//347/272/242/345/214/205.png +0 -0
- package/resources/wechat-emoji//347/277/273/347/231/275/347/234/274.png +0 -0
- package/resources/wechat-emoji//350/200/266.png +0 -0
- package/resources/wechat-emoji//350/203/234/345/210/251.png +0 -0
- package/resources/wechat-emoji//350/204/270/347/272/242.png +0 -0
- package/resources/wechat-emoji//350/211/262.png +0 -0
- package/resources/wechat-emoji//350/213/246/346/266/251.png +0 -0
- package/resources/wechat-emoji//350/217/234/345/210/200.png +0 -0
- package/resources/wechat-emoji//350/233/213/347/263/225.png +0 -0
- package/resources/wechat-emoji//350/241/260.png +0 -0
- package/resources/wechat-emoji//350/243/202/345/274/200.png +0 -0
- package/resources/wechat-emoji//350/256/251/346/210/221/347/234/213/347/234/213.png +0 -0
- package/resources/wechat-emoji//350/260/203/347/232/256.png +0 -0
- package/resources/wechat-emoji//350/267/263/350/267/263.png +0 -0
- package/resources/wechat-emoji//350/275/254/345/234/210.png +0 -0
- package/resources/wechat-emoji//351/204/231/350/247/206.png +0 -0
- package/resources/wechat-emoji//351/227/255/345/230/264.png +0 -0
- package/resources/wechat-emoji//351/230/264/351/231/251.png +0 -0
- package/resources/wechat-emoji//351/232/276/350/277/207.png +0 -0
- package/resources/wechat-emoji//351/252/267/351/253/205.png +0 -0
- package/resources/wechat-emoji//351/274/223/346/216/214.png +0 -0
- package/scripts/_batch_link_sources.py +73 -73
- package/scripts/_utils.py +29 -0
- package/scripts/annual_report.py +796 -796
- package/scripts/auto_tag.py +128 -128
- package/scripts/biz_daily.py +210 -53
- package/scripts/chat_report.py +10 -0
- package/scripts/chat_stats.py +702 -702
- package/scripts/classify_daily.py +17 -11
- package/scripts/create_reading_notes.py +370 -370
- package/scripts/daily_stats.py +132 -0
- package/scripts/enrich_backlinks.py +163 -163
- package/scripts/export_chat_html.py +1704 -107
- package/scripts/extract_todos.py +445 -404
- package/scripts/fav_server.py +119 -12
- package/scripts/fix_topics.py +111 -111
- package/scripts/generate_ai_report.py +1 -1
- package/scripts/generate_html.py +597 -277
- package/scripts/inspection_records.py +354 -0
- package/scripts/mcp_bridge.py +398 -398
- package/scripts/nt_decrypt.py +702 -48
- package/scripts/pipeline.py +27 -19
- package/scripts/promote_all.py +312 -310
- package/scripts/promote_ideas.py +299 -297
- package/scripts/rag_chat.py +194 -191
- package/scripts/semantic_search.py +435 -431
- package/scripts/sync_fav.py +201 -146
- package/scripts/sync_weread.py +192 -192
- package/scripts/vault_rag.py +140 -139
- package/scripts/vault_search.py +141 -141
- package/scripts/wechat_emoji.py +132 -0
- package/scripts/wechat_emoticon.py +433 -0
- package/scripts/wechat_image.py +258 -0
- package/scripts/wechat_voice.py +327 -0
- package/src/core/dbPathService.ts +163 -18
- package/src/core/keyService.ts +137 -25
- package/src/core/ntCore.ts +215 -62
- package/src/core/sqlcipherCore.ts +17 -1
- package/src/core/wcdbCore.ts +3 -7
- package/src/services/assistantDaemon.ts +111 -0
- package/src/services/assistantMemory.ts +193 -0
- package/src/services/assistantPrivacy.ts +87 -0
- package/src/services/assistantRouting.ts +92 -0
- package/src/services/assistantService.ts +295 -0
- package/src/services/assistantTools.ts +549 -0
- package/src/services/chatService.ts +133 -4
- package/src/services/configService.ts +194 -6
- package/src/services/evidenceService.ts +129 -0
- package/src/services/exportService.ts +113 -48
- package/src/services/initKeyService.ts +83 -0
- package/src/services/messageContract.ts +77 -0
- package/src/services/messageQuery.ts +38 -0
- package/src/services/wechat-formatter.ts +348 -348
- package/src/services/wechatMessageService.ts +25 -3
- package/src/services/wereadService.ts +308 -308
- package/src/services/whitelistService.ts +209 -22
- package/src/types.ts +20 -0
- package/src/utils/dateRange.ts +58 -0
- package/src/utils/mcpSecurity.ts +39 -0
- package/src/utils/packageRoot.ts +14 -0
- package/src/utils/python.ts +73 -0
- package/src/utils/pythonProcessEnv.ts +45 -0
- package/src/utils/talkerUtils.ts +14 -2
- package/dist/src/utils/errors.d.ts +0 -25
- package/dist/src/utils/errors.d.ts.map +0 -1
- package/dist/src/utils/errors.js +0 -43
- package/dist/src/utils/errors.js.map +0 -1
- package/dist/src/utils/pythonRunner.d.ts +0 -27
- package/dist/src/utils/pythonRunner.d.ts.map +0 -1
- package/dist/src/utils/pythonRunner.js +0 -62
- package/dist/src/utils/pythonRunner.js.map +0 -1
- package/src/utils/errors.ts +0 -42
- package/src/utils/pythonRunner.ts +0 -81
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assistantService.d.ts","sourceRoot":"","sources":["../../../src/services/assistantService.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,OAAO,EAAwB,MAAM,aAAa,CAAA;AAyBhE,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,GAAG,CAAoC;IAC/C,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,OAAO,CAAQ;IACvB,+CAA+C;IAC/C,OAAO,CAAC,KAAK,CAAmC;IAChD,2CAA2C;IAC3C,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,SAAS,CAA4B;IAE7C,OAAO,CAAC,YAAY;IAgBpB;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,cAAc;IAMtB,wBAAwB;YACV,OAAO;IA0BrB,iCAAiC;IAC3B,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,UAAU,UAAQ,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IA8BrJ,mCAAmC;IACnC,OAAO,CAAC,iBAAiB;IAWzB,qCAAqC;IAC/B,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiFhF,aAAa;IACP,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAiD1D,IAAI,IAAI,IAAI;IAKZ,SAAS,IAAI,OAAO;IACpB,eAAe,IAAI,MAAM;CAC1B"}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 第二大脑助手 — 持久化 Agent (主流框架标准架构)。
|
|
3
|
+
*
|
|
4
|
+
* 架构 (参考 LangGraph Agent Loop + Mem0 三层记忆):
|
|
5
|
+
* 微信(iLink) ⇄ 常驻进程
|
|
6
|
+
* ├─ ReAct 循环: LLM 决策 → 本地工具执行 → 观察回填 → 直到产出回答
|
|
7
|
+
* ├─ 三层记忆: L1 工作窗口 / L2 滚动摘要 / L3 长期事实 (本地 JSON)
|
|
8
|
+
* └─ 隐私关卡: 工具结果脱敏后才出境到云端 LLM (本地引擎则完全不出境)
|
|
9
|
+
*/
|
|
10
|
+
import { WechatMessageService } from './wechatMessageService.js';
|
|
11
|
+
import { configService } from './configService.js';
|
|
12
|
+
import { AssistantMemory } from './assistantMemory.js';
|
|
13
|
+
import { privacyGate } from './assistantPrivacy.js';
|
|
14
|
+
import { TOOL_DEFS, executeTool } from './assistantTools.js';
|
|
15
|
+
import { appendLog } from './assistantDaemon.js';
|
|
16
|
+
import { buildEvidenceReviewInput } from './evidenceService.js';
|
|
17
|
+
import { evaluateAssistantAccess } from './assistantRouting.js';
|
|
18
|
+
const MAX_TOOL_ROUNDS = 6;
|
|
19
|
+
/** 每日 LLM 处理上限 (护栏: 防 bug 死循环/异常流量烧钱; 0 = 不限制) */
|
|
20
|
+
const DAILY_LIMIT = 100;
|
|
21
|
+
const BASE_PROMPT = `你是"第二大脑", 运行在用户自己的电脑上, 通过微信与用户对话。
|
|
22
|
+
你可以调用工具查询用户本地微信数据(会话/聊天记录/收藏), 以及读写关于用户的长期记忆。
|
|
23
|
+
|
|
24
|
+
行为准则:
|
|
25
|
+
- 涉及用户数据的问题, 先调工具查证再回答, 不要编造
|
|
26
|
+
- 用户让你记住某事时, 用 save_memory 工具保存
|
|
27
|
+
- 回复用微信聊天风格, 简洁, 不用 markdown 符号
|
|
28
|
+
- 数据不足时直说需要什么, 不要瞎猜
|
|
29
|
+
- 回复控制在 300 字内, 列表类可放宽`;
|
|
30
|
+
export class AssistantService {
|
|
31
|
+
svc = null;
|
|
32
|
+
memory = new AssistantMemory();
|
|
33
|
+
running = false;
|
|
34
|
+
/** 消息串行队列: 保证 handleMessage 不并发交错 (记忆窗口一致性) */
|
|
35
|
+
queue = Promise.resolve();
|
|
36
|
+
/** 每日用量计数 (内存态, 重启重置 — 配额护栏防烧钱, 无需持久精确) */
|
|
37
|
+
dailyCount = 0;
|
|
38
|
+
dailyDate = new Date().toDateString();
|
|
39
|
+
engineConfig() {
|
|
40
|
+
const engine = String(configService.get('aiEngine') || 'deepseek');
|
|
41
|
+
if (engine === 'ollama' || engine === 'lmstudio') {
|
|
42
|
+
const port = engine === 'lmstudio' ? 1234 : 11434;
|
|
43
|
+
const model = String(configService.get('localModel') || 'llama3');
|
|
44
|
+
return { url: `http://localhost:${port}/v1`, model, key: null, local: true };
|
|
45
|
+
}
|
|
46
|
+
// 自定义 OpenAI 兼容端点 (中转站) 优先
|
|
47
|
+
const baseUrl = String(configService.get('aiBaseUrl') || '').trim().replace(/\/+$/, '');
|
|
48
|
+
if (baseUrl) {
|
|
49
|
+
const model = String(configService.get('aiModel') || 'deepseek-chat');
|
|
50
|
+
return { url: baseUrl, model, key: configService.get('deepseekApiKey'), local: false };
|
|
51
|
+
}
|
|
52
|
+
return { url: 'https://api.deepseek.com/v1', model: 'deepseek-chat', key: configService.get('deepseekApiKey'), local: false };
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Direct messages require an explicit sender allowlist. Groups are disabled
|
|
56
|
+
* until the upstream provides an explicit group ID, and then require all
|
|
57
|
+
* three controls: group allowlist, sender allowlist, and an @ mention.
|
|
58
|
+
*/
|
|
59
|
+
accessDecision(message) {
|
|
60
|
+
return evaluateAssistantAccess(message, {
|
|
61
|
+
directWhitelist: String(configService.get('assistantWhitelist') || ''),
|
|
62
|
+
groupWhitelist: String(configService.get('assistantGroupWhitelist') || ''),
|
|
63
|
+
requireGroupMention: configService.get('assistantGroupRequireMention') !== 'false',
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
dailyQuotaLeft() {
|
|
67
|
+
const today = new Date().toDateString();
|
|
68
|
+
if (today !== this.dailyDate) {
|
|
69
|
+
this.dailyDate = today;
|
|
70
|
+
this.dailyCount = 0;
|
|
71
|
+
}
|
|
72
|
+
return DAILY_LIMIT - this.dailyCount;
|
|
73
|
+
}
|
|
74
|
+
/** 底层 LLM 调用 (含出境审计) */
|
|
75
|
+
async callLLM(messages, tools, maxTokens = 800) {
|
|
76
|
+
const { url, model, key, local } = this.engineConfig();
|
|
77
|
+
if (!key && !local) {
|
|
78
|
+
throw new Error('未配置 LLM (config set deepseekApiKey 或切换 ollama)');
|
|
79
|
+
}
|
|
80
|
+
const body = { model, messages, max_tokens: maxTokens, temperature: 0.4 };
|
|
81
|
+
if (tools?.length) {
|
|
82
|
+
body.tools = tools;
|
|
83
|
+
body.tool_choice = 'auto';
|
|
84
|
+
}
|
|
85
|
+
const res = await fetch(`${url}/chat/completions`, {
|
|
86
|
+
method: 'POST',
|
|
87
|
+
headers: {
|
|
88
|
+
'Content-Type': 'application/json',
|
|
89
|
+
...(key ? { Authorization: `Bearer ${key}` } : {}),
|
|
90
|
+
},
|
|
91
|
+
body: JSON.stringify(body),
|
|
92
|
+
signal: AbortSignal.timeout(120_000),
|
|
93
|
+
});
|
|
94
|
+
privacyGate.audit('CLOUD_CALL', JSON.stringify(body).length, local ? 'local' : `${url.split('//')[1].split('/')[0]}`);
|
|
95
|
+
if (!res.ok) {
|
|
96
|
+
const t = await res.text().catch(() => '');
|
|
97
|
+
throw new Error(`LLM ${res.status}: ${t.slice(0, 120)}`);
|
|
98
|
+
}
|
|
99
|
+
return res.json();
|
|
100
|
+
}
|
|
101
|
+
/** 在明确授权后分析本地聊天,输出证据线索而非法律结论。 */
|
|
102
|
+
async reviewEvidence(talker, messages, allowCloud = false) {
|
|
103
|
+
const { local } = this.engineConfig();
|
|
104
|
+
if (!local && !allowCloud) {
|
|
105
|
+
throw new Error('默认禁止将聊天正文发送到云端;请切换本地模型,或明确使用 --allow-cloud');
|
|
106
|
+
}
|
|
107
|
+
const input = buildEvidenceReviewInput(talker, messages, privacyGate.mode(), local);
|
|
108
|
+
const response = await this.callLLM([
|
|
109
|
+
{
|
|
110
|
+
role: 'system',
|
|
111
|
+
content: `你是电子数据整理助手,不是律师。只根据提供的聊天原文进行线索整理,不判断“必然违法”、不判断法院必然采信,也不编造法律条文或事实。
|
|
112
|
+
请用中文输出以下结构:
|
|
113
|
+
## 疑似争议线索
|
|
114
|
+
逐项引用消息ID,区分原文事实和你的待核查推测。
|
|
115
|
+
## 可能涉及的法律主题
|
|
116
|
+
只写宽泛主题,例如合同履行、借贷、劳动争议、名誉侵权、隐私或个人信息;不作定性结论。
|
|
117
|
+
## 还需要核验的材料
|
|
118
|
+
列出原设备、完整上下文、转账/合同/平台记录、身份归属等缺口。
|
|
119
|
+
## 保全建议
|
|
120
|
+
提醒保留原始设备、原始数据、完整对话和导出记录。
|
|
121
|
+
如果信息不足,明确写“信息不足”,不要补全。${local ? '' : '\n当前不是本地推理:不要复述已被隐私模式屏蔽的聊天正文。'}`,
|
|
122
|
+
},
|
|
123
|
+
{ role: 'user', content: input.transcript },
|
|
124
|
+
], undefined, 1800);
|
|
125
|
+
return {
|
|
126
|
+
text: (response.choices?.[0]?.message?.content || '信息不足,未生成分析。').trim(),
|
|
127
|
+
localInference: local,
|
|
128
|
+
redactions: input.redactions,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/** 组装系统提示: 基础人格 + L2 摘要 + L3 事实 */
|
|
132
|
+
buildSystemPrompt(userId) {
|
|
133
|
+
const parts = [BASE_PROMPT];
|
|
134
|
+
const summary = this.memory.summary(userId);
|
|
135
|
+
if (summary)
|
|
136
|
+
parts.push(`\n[此前对话摘要]\n${summary}`);
|
|
137
|
+
const facts = this.memory.facts(userId);
|
|
138
|
+
if (facts.length) {
|
|
139
|
+
parts.push(`\n[关于用户的长期记忆]\n${facts.map(f => `· ${f.content}`).join('\n')}`);
|
|
140
|
+
}
|
|
141
|
+
return parts.join('\n');
|
|
142
|
+
}
|
|
143
|
+
/** 单条消息处理: 指令路由 → ReAct 循环 → 记忆更新 */
|
|
144
|
+
async handleMessage(userId, text, kind) {
|
|
145
|
+
if (kind !== 'text')
|
|
146
|
+
return '目前只支持文字消息哦';
|
|
147
|
+
const t = text.trim();
|
|
148
|
+
if (t === '帮助' || t.toLowerCase() === 'help') {
|
|
149
|
+
return ['🧠 第二大脑 Agent', '',
|
|
150
|
+
'直接用自然语言问, 我会自动查本地数据回答:',
|
|
151
|
+
'「我最近都在忙什么?」',
|
|
152
|
+
'「总结我和XX的聊天」',
|
|
153
|
+
'「收藏里有哪些AI文章?」',
|
|
154
|
+
'「记住: 我的项目叫weflow-cli」',
|
|
155
|
+
'', '记忆: 三层 (窗口/摘要/长期事实), 重启不丢',
|
|
156
|
+
'隐私: 数据库不出本机, 出境内容自动脱敏',
|
|
157
|
+
'', '指令: 记忆 | 清空记忆'].join('\n');
|
|
158
|
+
}
|
|
159
|
+
if (t === '清空记忆' || t === '重置') {
|
|
160
|
+
this.memory.reset(userId);
|
|
161
|
+
privacyGate.audit('MEMORY_RESET', 0, userId.slice(0, 8));
|
|
162
|
+
return '✓ 对话记忆已清空, 重新开始';
|
|
163
|
+
}
|
|
164
|
+
if (t === '记忆') {
|
|
165
|
+
const facts = this.memory.facts(userId);
|
|
166
|
+
const s = this.memory.summary(userId);
|
|
167
|
+
const lines = [`工作窗口: ${this.memory.workingWindow(userId).length} 条`];
|
|
168
|
+
lines.push(`滚动摘要: ${s ? `${s.length}字` : '无'}`);
|
|
169
|
+
lines.push(`长期事实: ${facts.length} 条`);
|
|
170
|
+
if (facts.length)
|
|
171
|
+
lines.push(facts.slice(-5).map(f => `· ${f.content}`).join('\n'));
|
|
172
|
+
lines.push(`隐私模式: ${privacyGate.mode()}${privacyGate.isLocalInference() ? ' (本地推理, 不出境)' : ''}`);
|
|
173
|
+
lines.push(`今日用量: ${this.dailyCount}/${DAILY_LIMIT}`);
|
|
174
|
+
return lines.join('\n');
|
|
175
|
+
}
|
|
176
|
+
// === ReAct 主循环 ===
|
|
177
|
+
this.memory.addTurn(userId, 'user', t);
|
|
178
|
+
const messages = [
|
|
179
|
+
{ role: 'system', content: this.buildSystemPrompt(userId) },
|
|
180
|
+
...this.memory.workingWindow(userId).map(turn => ({ role: turn.role, content: turn.content })),
|
|
181
|
+
];
|
|
182
|
+
let reply = '';
|
|
183
|
+
let toolCalls = 0;
|
|
184
|
+
try {
|
|
185
|
+
for (let round = 0; round < MAX_TOOL_ROUNDS; round++) {
|
|
186
|
+
const data = await this.callLLM(messages, TOOL_DEFS);
|
|
187
|
+
const msg = data.choices?.[0]?.message;
|
|
188
|
+
if (!msg)
|
|
189
|
+
throw new Error('LLM 返回为空');
|
|
190
|
+
if (msg.tool_calls?.length) {
|
|
191
|
+
messages.push({ role: 'assistant', content: msg.content || '', tool_calls: msg.tool_calls });
|
|
192
|
+
for (const tc of msg.tool_calls) {
|
|
193
|
+
toolCalls++;
|
|
194
|
+
let args = {};
|
|
195
|
+
try {
|
|
196
|
+
args = JSON.parse(tc.function?.arguments || '{}');
|
|
197
|
+
}
|
|
198
|
+
catch { /* 参数容错 */ }
|
|
199
|
+
const raw = await executeTool(tc.function?.name || '', args, { userId, memory: this.memory });
|
|
200
|
+
const { safe, redactions } = privacyGate.redact(raw);
|
|
201
|
+
privacyGate.audit(`TOOL:${tc.function?.name}`, raw.length, redactions ? `redacted=${redactions}` : '');
|
|
202
|
+
messages.push({ role: 'tool', tool_call_id: tc.id, content: safe });
|
|
203
|
+
}
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
reply = (msg.content || '').trim() || '(空回复)';
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
if (!reply)
|
|
210
|
+
reply = '(这轮处理太复杂了, 换个问法试试?)';
|
|
211
|
+
}
|
|
212
|
+
catch (e) {
|
|
213
|
+
reply = `❌ 大脑暂时离线: ${e.message?.slice(0, 100)}\n(本地指令仍可用: 发「帮助」)`;
|
|
214
|
+
}
|
|
215
|
+
// === 记忆更新 (L2 压缩 + L3 提取) ===
|
|
216
|
+
this.memory.addTurn(userId, 'assistant', reply);
|
|
217
|
+
const llm = (msgs, maxTokens) => this.callLLM(msgs, undefined, maxTokens).then((d) => d.choices?.[0]?.message?.content || '');
|
|
218
|
+
try {
|
|
219
|
+
await this.memory.compressIfNeeded(userId, llm);
|
|
220
|
+
}
|
|
221
|
+
catch { /* 压缩失败不阻断 */ }
|
|
222
|
+
try {
|
|
223
|
+
await this.memory.extractFactsIfNeeded(userId, llm);
|
|
224
|
+
}
|
|
225
|
+
catch { /* 提取失败不阻断 */ }
|
|
226
|
+
this.memory.save();
|
|
227
|
+
privacyGate.audit('TURN_DONE', reply.length, `tools=${toolCalls}`);
|
|
228
|
+
return reply;
|
|
229
|
+
}
|
|
230
|
+
/** 启动常驻监听 */
|
|
231
|
+
async start(onLog) {
|
|
232
|
+
const token = configService.get('wechatOcToken');
|
|
233
|
+
if (!token)
|
|
234
|
+
throw new Error('未登录消息通道, 先运行 weflow-cli login-wechat');
|
|
235
|
+
this.svc = new WechatMessageService({ token });
|
|
236
|
+
this.running = true;
|
|
237
|
+
const { local } = this.engineConfig();
|
|
238
|
+
onLog?.(`助手已启动 (bot: ${configService.get('wechatOcAccountId')}, ` +
|
|
239
|
+
`引擎: ${local ? '本地' : '云端'}, 记忆用户数: ${this.memory.userCount()})`);
|
|
240
|
+
this.svc.onMessage((msg) => {
|
|
241
|
+
// 串行入队: 并发到达的消息按顺序处理, 记忆窗口不交错
|
|
242
|
+
this.queue = this.queue.then(async () => {
|
|
243
|
+
if (!this.running)
|
|
244
|
+
return;
|
|
245
|
+
const access = this.accessDecision(msg);
|
|
246
|
+
const sessionId = msg.conversationId;
|
|
247
|
+
if (!access.allowed) {
|
|
248
|
+
privacyGate.audit(`DENY_${access.reason.toUpperCase().replace(/-/g, '_')}`, 0, sessionId.slice(0, 12));
|
|
249
|
+
onLog?.(` → 拒绝: ${sessionId.slice(0, 12)}… ${access.reason} (未回复, 不耗 LLM)`);
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
if (msg.messageKind !== 'text') {
|
|
253
|
+
onLog?.(` → 忽略非文本消息 (${msg.messageKind})`);
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
if (this.dailyQuotaLeft() <= 0) {
|
|
257
|
+
privacyGate.audit('DENY_DAILY_LIMIT', this.dailyCount);
|
|
258
|
+
appendLog(`[配额] 今日 ${DAILY_LIMIT} 条上限已用尽, 拒绝: ${msg.messageStr.slice(0, 30)}`);
|
|
259
|
+
await this.svc.sendText(sessionId, '今日额度已用完, 明天再来吧').catch(() => { });
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
onLog?.(`[${new Date().toLocaleTimeString('zh-CN')}] ${sessionId.slice(0, 12)}…: ${msg.messageStr.slice(0, 40)}`);
|
|
263
|
+
try {
|
|
264
|
+
const reply = await this.handleMessage(sessionId, msg.messageStr, msg.messageKind);
|
|
265
|
+
this.dailyCount++;
|
|
266
|
+
const ok = await this.svc.sendText(sessionId, reply);
|
|
267
|
+
onLog?.(` → ${ok ? `已回复 (${reply.length}字, 今日 ${this.dailyCount}/${DAILY_LIMIT})` : '回复失败'}`);
|
|
268
|
+
}
|
|
269
|
+
catch (e) {
|
|
270
|
+
onLog?.(` → 处理异常: ${e.message}`);
|
|
271
|
+
appendLog(`[${new Date().toLocaleTimeString('zh-CN')}] 异常: ${e.message}`);
|
|
272
|
+
}
|
|
273
|
+
}).catch((e) => appendLog(`队列异常: ${e.message}`));
|
|
274
|
+
});
|
|
275
|
+
await this.svc.startPolling();
|
|
276
|
+
}
|
|
277
|
+
stop() {
|
|
278
|
+
this.running = false;
|
|
279
|
+
this.svc?.stop();
|
|
280
|
+
}
|
|
281
|
+
isRunning() { return this.running; }
|
|
282
|
+
memoryUserCount() { return this.memory.userCount(); }
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=assistantService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assistantService.js","sourceRoot":"","sources":["../../../src/services/assistantService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AssistantMemory } from './assistantMemory.js';
|
|
2
|
+
export interface ToolDef {
|
|
3
|
+
type: 'function';
|
|
4
|
+
function: {
|
|
5
|
+
name: string;
|
|
6
|
+
description: string;
|
|
7
|
+
parameters: Record<string, unknown>;
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export interface ToolContext {
|
|
11
|
+
userId: string;
|
|
12
|
+
memory: AssistantMemory;
|
|
13
|
+
}
|
|
14
|
+
interface TalkerCandidate {
|
|
15
|
+
username: string;
|
|
16
|
+
displayName?: string | null;
|
|
17
|
+
}
|
|
18
|
+
export declare function boundedToolInteger(value: unknown, fallback: number, maximum: number, field?: string): number;
|
|
19
|
+
export declare function resolveUniqueTalker(name: string, sessions: TalkerCandidate[]): string;
|
|
20
|
+
export declare const TOOL_DEFS: ToolDef[];
|
|
21
|
+
export declare const MCP_READ_ONLY_TOOL_DEFS: ToolDef[];
|
|
22
|
+
export declare function executeTool(name: string, args: Record<string, any>, ctx: ToolContext): Promise<string>;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=assistantTools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assistantTools.d.ts","sourceRoot":"","sources":["../../../src/services/assistantTools.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAc3D,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,UAAU,CAAA;IAChB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAA;QACZ,WAAW,EAAE,MAAM,CAAA;QACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KACpC,CAAA;CACF;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,eAAe,CAAA;CACxB;AAqFD,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B;AAID,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,SAAU,GAAG,MAAM,CAO7G;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,CAoBrF;AAQD,eAAO,MAAM,SAAS,EAAE,OAAO,EAsK9B,CAAA;AAED,eAAO,MAAM,uBAAuB,WAAiE,CAAA;AAErG,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CA0N5G"}
|