weflow-cli 1.6.4 → 1.8.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 (205) hide show
  1. package/ARCHITECTURE.md +3 -2
  2. package/CHANGELOG.md +1966 -0
  3. package/OPERATIONS.md +808 -0
  4. package/README.en.md +93 -7
  5. package/README.md +31 -6
  6. package/bin/weflow-cli.ts +1245 -26
  7. package/dist/bin/weflow-cli.js +1349 -72
  8. package/dist/bin/weflow-cli.js.map +1 -1
  9. package/dist/mcp-server/index.js +39 -13
  10. package/dist/mcp-server/index.js.map +1 -1
  11. package/dist/src/core/appMsgFormat.d.ts +37 -0
  12. package/dist/src/core/appMsgFormat.d.ts.map +1 -0
  13. package/dist/src/core/appMsgFormat.js +106 -0
  14. package/dist/src/core/appMsgFormat.js.map +1 -0
  15. package/dist/src/core/ntCore.d.ts +43 -0
  16. package/dist/src/core/ntCore.d.ts.map +1 -1
  17. package/dist/src/core/ntCore.js +31 -0
  18. package/dist/src/core/ntCore.js.map +1 -1
  19. package/dist/src/core/sqlcipherCore.d.ts +0 -12
  20. package/dist/src/core/sqlcipherCore.d.ts.map +1 -1
  21. package/dist/src/core/sqlcipherCore.js +5 -64
  22. package/dist/src/core/sqlcipherCore.js.map +1 -1
  23. package/dist/src/core/wcdbCore.d.ts +1 -1
  24. package/dist/src/core/wcdbCore.d.ts.map +1 -1
  25. package/dist/src/core/wcdbCore.js +5 -1
  26. package/dist/src/core/wcdbCore.js.map +1 -1
  27. package/dist/src/panel/client.d.ts +25 -0
  28. package/dist/src/panel/client.d.ts.map +1 -0
  29. package/dist/src/panel/client.js +34 -0
  30. package/dist/src/panel/client.js.map +1 -0
  31. package/dist/src/panel/endpoint.d.ts +45 -0
  32. package/dist/src/panel/endpoint.d.ts.map +1 -0
  33. package/dist/src/panel/endpoint.js +132 -0
  34. package/dist/src/panel/endpoint.js.map +1 -0
  35. package/dist/src/panel/launch.d.ts +50 -0
  36. package/dist/src/panel/launch.d.ts.map +1 -0
  37. package/dist/src/panel/launch.js +74 -0
  38. package/dist/src/panel/launch.js.map +1 -0
  39. package/dist/src/panel/server.d.ts +23 -0
  40. package/dist/src/panel/server.d.ts.map +1 -0
  41. package/dist/src/panel/server.js +413 -0
  42. package/dist/src/panel/server.js.map +1 -0
  43. package/dist/src/panel/userId.d.ts +37 -0
  44. package/dist/src/panel/userId.d.ts.map +1 -0
  45. package/dist/src/panel/userId.js +56 -0
  46. package/dist/src/panel/userId.js.map +1 -0
  47. package/dist/src/services/assistantDaemon.d.ts +20 -3
  48. package/dist/src/services/assistantDaemon.d.ts.map +1 -1
  49. package/dist/src/services/assistantDaemon.js +46 -9
  50. package/dist/src/services/assistantDaemon.js.map +1 -1
  51. package/dist/src/services/assistantEval.d.ts +141 -0
  52. package/dist/src/services/assistantEval.d.ts.map +1 -0
  53. package/dist/src/services/assistantEval.js +497 -0
  54. package/dist/src/services/assistantEval.js.map +1 -0
  55. package/dist/src/services/assistantMemory.d.ts +106 -4
  56. package/dist/src/services/assistantMemory.d.ts.map +1 -1
  57. package/dist/src/services/assistantMemory.js +396 -61
  58. package/dist/src/services/assistantMemory.js.map +1 -1
  59. package/dist/src/services/assistantPrivacy.d.ts +15 -2
  60. package/dist/src/services/assistantPrivacy.d.ts.map +1 -1
  61. package/dist/src/services/assistantPrivacy.js +18 -4
  62. package/dist/src/services/assistantPrivacy.js.map +1 -1
  63. package/dist/src/services/assistantRouter.d.ts +41 -0
  64. package/dist/src/services/assistantRouter.d.ts.map +1 -0
  65. package/dist/src/services/assistantRouter.js +151 -0
  66. package/dist/src/services/assistantRouter.js.map +1 -0
  67. package/dist/src/services/assistantService.d.ts +209 -3
  68. package/dist/src/services/assistantService.d.ts.map +1 -1
  69. package/dist/src/services/assistantService.js +590 -75
  70. package/dist/src/services/assistantService.js.map +1 -1
  71. package/dist/src/services/assistantTools.d.ts +205 -1
  72. package/dist/src/services/assistantTools.d.ts.map +1 -1
  73. package/dist/src/services/assistantTools.js +1089 -58
  74. package/dist/src/services/assistantTools.js.map +1 -1
  75. package/dist/src/services/assistantTrace.d.ts +47 -0
  76. package/dist/src/services/assistantTrace.d.ts.map +1 -0
  77. package/dist/src/services/assistantTrace.js +150 -0
  78. package/dist/src/services/assistantTrace.js.map +1 -0
  79. package/dist/src/services/chatService.d.ts +13 -0
  80. package/dist/src/services/chatService.d.ts.map +1 -1
  81. package/dist/src/services/chatService.js +23 -0
  82. package/dist/src/services/chatService.js.map +1 -1
  83. package/dist/src/services/configService.d.ts +9 -0
  84. package/dist/src/services/configService.d.ts.map +1 -1
  85. package/dist/src/services/configService.js +15 -8
  86. package/dist/src/services/configService.js.map +1 -1
  87. package/dist/src/services/messageQuery.d.ts +35 -0
  88. package/dist/src/services/messageQuery.d.ts.map +1 -1
  89. package/dist/src/services/messageQuery.js +61 -0
  90. package/dist/src/services/messageQuery.js.map +1 -1
  91. package/dist/src/services/pythonBridge.d.ts +41 -0
  92. package/dist/src/services/pythonBridge.d.ts.map +1 -0
  93. package/dist/src/services/pythonBridge.js +119 -0
  94. package/dist/src/services/pythonBridge.js.map +1 -0
  95. package/dist/src/services/syncService.d.ts +127 -0
  96. package/dist/src/services/syncService.d.ts.map +1 -0
  97. package/dist/src/services/syncService.js +263 -0
  98. package/dist/src/services/syncService.js.map +1 -0
  99. package/dist/src/services/syncState.d.ts +113 -0
  100. package/dist/src/services/syncState.d.ts.map +1 -0
  101. package/dist/src/services/syncState.js +214 -0
  102. package/dist/src/services/syncState.js.map +1 -0
  103. package/dist/src/services/wechatMessageService.d.ts +25 -0
  104. package/dist/src/services/wechatMessageService.d.ts.map +1 -1
  105. package/dist/src/services/wechatMessageService.js +69 -7
  106. package/dist/src/services/wechatMessageService.js.map +1 -1
  107. package/dist/src/utils/atomicWrite.d.ts +4 -0
  108. package/dist/src/utils/atomicWrite.d.ts.map +1 -0
  109. package/dist/src/utils/atomicWrite.js +60 -0
  110. package/dist/src/utils/atomicWrite.js.map +1 -0
  111. package/dist/src/utils/dateRange.d.ts +15 -0
  112. package/dist/src/utils/dateRange.d.ts.map +1 -1
  113. package/dist/src/utils/dateRange.js +47 -0
  114. package/dist/src/utils/dateRange.js.map +1 -1
  115. package/dist/src/utils/text.d.ts +18 -0
  116. package/dist/src/utils/text.d.ts.map +1 -0
  117. package/dist/src/utils/text.js +20 -0
  118. package/dist/src/utils/text.js.map +1 -0
  119. package/docs/AI_INTERFACE.md +2 -0
  120. package/docs/DECISIONS.md +1484 -20
  121. package/docs/EXTENDING.md +187 -0
  122. package/docs/FUNCTIONAL-IMPROVEMENT-SPEC.md +338 -0
  123. package/docs/JEV/345/272/224/347/224/250/346/226/275/345/267/245/346/226/207/346/241/243.md +310 -0
  124. package/docs/MCP.md +23 -4
  125. package/docs/PROJECT_STATE.md +299 -96
  126. package/docs/SETUP.md +22 -0
  127. package/docs/SYNC_CONTRACT.md +180 -0
  128. package/mcp-server/index.ts +681 -657
  129. package/package.json +84 -83
  130. package/resources/panel/ball-position.cjs +153 -0
  131. package/resources/panel/index.html +46 -0
  132. package/resources/panel/main.cjs +447 -0
  133. package/resources/panel/mascot-focus.png +0 -0
  134. package/resources/panel/mascot-happy.png +0 -0
  135. package/resources/panel/mascot-sorry.png +0 -0
  136. package/resources/panel/mascot-tired.png +0 -0
  137. package/resources/panel/mascot.png +0 -0
  138. package/resources/panel/package.json +7 -0
  139. package/resources/panel/panel.css +407 -0
  140. package/resources/panel/preload.cjs +72 -0
  141. package/resources/panel/quick-menu.cjs +197 -0
  142. package/resources/panel/renderer.js +441 -0
  143. package/resources/panel/tray-menu.cjs +40 -0
  144. package/resources/panel/tray.png +0 -0
  145. package/scripts/_utils.py +403 -54
  146. package/scripts/annual_report.py +4 -2
  147. package/scripts/article_notes.py +423 -0
  148. package/scripts/backfill_articles.py +438 -0
  149. package/scripts/biz_daily.py +590 -105
  150. package/scripts/chat_notes.py +470 -0
  151. package/scripts/classify_daily.py +10 -18
  152. package/scripts/compile_wiki.py +1059 -46
  153. package/scripts/create_reading_notes.py +199 -14
  154. package/scripts/decide.py +253 -0
  155. package/scripts/draft_reply.py +671 -0
  156. package/scripts/export_chat_html.py +212 -46
  157. package/scripts/extract_todos.py +31 -5
  158. package/scripts/fav_notes.py +318 -0
  159. package/scripts/fix_topics.py +2 -1
  160. package/scripts/generate_ai_report.py +214 -9
  161. package/scripts/generate_html.py +18 -3
  162. package/scripts/generate_review.py +2 -2
  163. package/scripts/jev_client.py +294 -0
  164. package/scripts/jev_probe.py +440 -0
  165. package/scripts/nt_common.py +82 -0
  166. package/scripts/nt_decrypt.py +1755 -1352
  167. package/scripts/pipeline.py +27 -2
  168. package/scripts/promote_ideas.py +19 -4
  169. package/scripts/quality_eval.py +707 -0
  170. package/scripts/rag_chat.py +4 -4
  171. package/scripts/read_image.py +187 -0
  172. package/scripts/reply_debt.py +488 -0
  173. package/scripts/route_cards.py +453 -0
  174. package/scripts/semantic_search.py +208 -49
  175. package/scripts/user_notes.py +315 -0
  176. package/scripts/vault_rag.py +13 -7
  177. package/scripts/vault_search.py +21 -4
  178. package/scripts/wiki_lint.py +397 -0
  179. package/src/core/appMsgFormat.ts +117 -0
  180. package/src/core/ntCore.ts +67 -0
  181. package/src/core/sqlcipherCore.ts +5 -61
  182. package/src/core/wcdbCore.ts +6 -2
  183. package/src/panel/client.ts +49 -0
  184. package/src/panel/endpoint.ts +144 -0
  185. package/src/panel/launch.ts +101 -0
  186. package/src/panel/server.ts +424 -0
  187. package/src/panel/userId.ts +72 -0
  188. package/src/services/assistantDaemon.ts +57 -9
  189. package/src/services/assistantEval.ts +611 -0
  190. package/src/services/assistantMemory.ts +413 -57
  191. package/src/services/assistantPrivacy.ts +18 -4
  192. package/src/services/assistantRouter.ts +191 -0
  193. package/src/services/assistantService.ts +671 -74
  194. package/src/services/assistantTools.ts +1118 -57
  195. package/src/services/assistantTrace.ts +175 -0
  196. package/src/services/chatService.ts +30 -0
  197. package/src/services/configService.ts +403 -385
  198. package/src/services/messageQuery.ts +97 -0
  199. package/src/services/pythonBridge.ts +139 -0
  200. package/src/services/syncService.ts +363 -0
  201. package/src/services/syncState.ts +275 -0
  202. package/src/services/wechatMessageService.ts +73 -7
  203. package/src/utils/atomicWrite.ts +56 -0
  204. package/src/utils/dateRange.ts +46 -0
  205. package/src/utils/text.ts +20 -0
@@ -1,4 +1,25 @@
1
1
  import type { WechatOCConfig, WechatLoginSession, WechatInboundMessage } from '../types.js';
2
+ /**
3
+ * 长轮询失败的分类。
4
+ *
5
+ * **`-14` 才是"token 已失效"**——这是厂商实现里写死的(`third-party/WeKnora/internal/im/wechat/longpoll.go:10,151`
6
+ * `if result.ErrCode == -14 { return ErrTokenExpired }`),而本仓原来只查 `-1 || 401`。
7
+ * 查错码的后果**不是报错**,而是把"过期"当成普通错误:每 5 秒重试一次,永远重试下去,
8
+ * 而用户那边看不到任何异常(`channelActive` 只表示"配了 token",不表示轮询是活的)。
9
+ *
10
+ * 三分类的用意:
11
+ * - `ok`:正常(长轮询空响应会带 0,或干脆没有这两个字段——见下面的调用处注释);
12
+ * - `token-expired`:`-14` 或 HTTP 401。**重试不可能成功**,所以它的待遇与别的失败不同;
13
+ * - `retryable`:其余(网络抖动、`-1` 这类语义不明的码)。仍然重试,但**退避**,
14
+ * 免得把日志刷成噪音——噪音等于没说。
15
+ */
16
+ export declare function classifyPollResult(data: {
17
+ ret?: number | null;
18
+ errcode?: number | null;
19
+ } | null | undefined, httpStatus?: number): 'ok' | 'token-expired' | 'retryable';
20
+ /** 重试间隔:1s 起、翻倍、封顶 30s(厂商那边是 1s→30s 指数退避,同一条路数) */
21
+ export declare const POLL_BACKOFF_MS: number[];
22
+ export declare function nextPollDelay(failures: number): number;
2
23
  export declare class WechatMessageService {
3
24
  private client;
4
25
  private config;
@@ -7,6 +28,8 @@ export declare class WechatMessageService {
7
28
  private contextTokens;
8
29
  private syncBuf;
9
30
  private messageCallbacks;
31
+ /** 服务端说过 token 失效了。**只由长轮询置位**(见 `classifyPollResult`),恢复时清掉 */
32
+ private tokenExpired;
10
33
  constructor(config?: WechatOCConfig);
11
34
  startLogin(): Promise<{
12
35
  qrcodeUrl: string;
@@ -15,6 +38,8 @@ export declare class WechatMessageService {
15
38
  pollQrStatus(): Promise<WechatLoginSession>;
16
39
  waitForLogin(pollIntervalMs?: number): Promise<WechatLoginSession>;
17
40
  startPolling(): Promise<void>;
41
+ /** token 是否已被服务端判为失效(面板/状态用它来说实话,见 `isChannelActive`) */
42
+ isTokenExpired(): boolean;
18
43
  stop(): Promise<void>;
19
44
  sendText(userId: string, text: string): Promise<boolean>;
20
45
  sendMedia(userId: string, filePath: string, mediaType: 'image' | 'video' | 'file'): Promise<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"wechatMessageService.d.ts","sourceRoot":"","sources":["../../../src/services/wechatMessageService.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,oBAAoB,EAA0B,MAAM,aAAa,CAAA;AAUnH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,aAAa,CAAiC;IACtD,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,gBAAgB,CAAiD;gBAE7D,MAAM,GAAE,cAAmB;IAyBjC,UAAU,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IAmBnE,YAAY,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAkC3C,YAAY,CAAC,cAAc,SAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAkChE,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAkD7B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAMrB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4BxD,SAAS,CACb,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GACpC,OAAO,CAAC,OAAO,CAAC;IA0Fb,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI9D,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMtF,SAAS,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,oBAAoB,KAAK,IAAI,GAAG,IAAI;IAM9D,UAAU,IAAI,OAAO;IAIrB,YAAY,IAAI,MAAM,GAAG,IAAI;IAM7B,OAAO,CAAC,mBAAmB;CA2D5B"}
1
+ {"version":3,"file":"wechatMessageService.d.ts","sourceRoot":"","sources":["../../../src/services/wechatMessageService.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,oBAAoB,EAA0B,MAAM,aAAa,CAAA;AAUnH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,EACzE,UAAU,CAAC,EAAE,MAAM,GAClB,IAAI,GAAG,eAAe,GAAG,WAAW,CAStC;AAED,mDAAmD;AACnD,eAAO,MAAM,eAAe,UAAyC,CAAA;AAErE,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,aAAa,CAAiC;IACtD,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,gBAAgB,CAAiD;IACzE,gEAAgE;IAChE,OAAO,CAAC,YAAY,CAAQ;gBAEhB,MAAM,GAAE,cAAmB;IAyBjC,UAAU,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IAmBnE,YAAY,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAkC3C,YAAY,CAAC,cAAc,SAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAkChE,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAyEnC,yDAAyD;IACzD,cAAc,IAAI,OAAO;IAInB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAMrB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4BxD,SAAS,CACb,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GACpC,OAAO,CAAC,OAAO,CAAC;IA0Fb,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI9D,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMtF,SAAS,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,oBAAoB,KAAK,IAAI,GAAG,IAAI;IAM9D,UAAU,IAAI,OAAO;IAIrB,YAAY,IAAI,MAAM,GAAG,IAAI;IAM7B,OAAO,CAAC,mBAAmB;CA2D5B"}
@@ -14,6 +14,39 @@ function sleep(ms) {
14
14
  function uuidHex() {
15
15
  return crypto.randomUUID().replace(/-/g, '');
16
16
  }
17
+ /**
18
+ * 长轮询失败的分类。
19
+ *
20
+ * **`-14` 才是"token 已失效"**——这是厂商实现里写死的(`third-party/WeKnora/internal/im/wechat/longpoll.go:10,151`
21
+ * `if result.ErrCode == -14 { return ErrTokenExpired }`),而本仓原来只查 `-1 || 401`。
22
+ * 查错码的后果**不是报错**,而是把"过期"当成普通错误:每 5 秒重试一次,永远重试下去,
23
+ * 而用户那边看不到任何异常(`channelActive` 只表示"配了 token",不表示轮询是活的)。
24
+ *
25
+ * 三分类的用意:
26
+ * - `ok`:正常(长轮询空响应会带 0,或干脆没有这两个字段——见下面的调用处注释);
27
+ * - `token-expired`:`-14` 或 HTTP 401。**重试不可能成功**,所以它的待遇与别的失败不同;
28
+ * - `retryable`:其余(网络抖动、`-1` 这类语义不明的码)。仍然重试,但**退避**,
29
+ * 免得把日志刷成噪音——噪音等于没说。
30
+ */
31
+ export function classifyPollResult(data, httpStatus) {
32
+ if (httpStatus === 401)
33
+ return 'token-expired';
34
+ const errcode = data?.errcode;
35
+ if (errcode === -14)
36
+ return 'token-expired';
37
+ const ret = data?.ret;
38
+ const badRet = ret != null && ret !== 0;
39
+ const badCode = errcode != null && errcode !== 0;
40
+ if (badRet || badCode)
41
+ return 'retryable';
42
+ return 'ok';
43
+ }
44
+ /** 重试间隔:1s 起、翻倍、封顶 30s(厂商那边是 1s→30s 指数退避,同一条路数) */
45
+ export const POLL_BACKOFF_MS = [1000, 2000, 4000, 8000, 16000, 30000];
46
+ export function nextPollDelay(failures) {
47
+ const index = Math.min(Math.max(failures - 1, 0), POLL_BACKOFF_MS.length - 1);
48
+ return POLL_BACKOFF_MS[index];
49
+ }
17
50
  export class WechatMessageService {
18
51
  client;
19
52
  config;
@@ -22,6 +55,8 @@ export class WechatMessageService {
22
55
  contextTokens = new Map();
23
56
  syncBuf;
24
57
  messageCallbacks = [];
58
+ /** 服务端说过 token 失效了。**只由长轮询置位**(见 `classifyPollResult`),恢复时清掉 */
59
+ tokenExpired = false;
25
60
  constructor(config = {}) {
26
61
  this.config = config;
27
62
  this.syncBuf = config.syncBuf || '';
@@ -124,6 +159,8 @@ export class WechatMessageService {
124
159
  }
125
160
  // ====== Message Polling ======
126
161
  async startPolling() {
162
+ let failures = 0;
163
+ let expiryReported = false;
127
164
  while (!this.shutdownFlag) {
128
165
  try {
129
166
  const data = await this.client.requestJson('POST', 'ilink/bot/getupdates', {
@@ -135,14 +172,30 @@ export class WechatMessageService {
135
172
  timeoutMs: 40_000, // Long-poll: server will hold until message arrives
136
173
  });
137
174
  // ret/errcode may be absent on empty response (normal for long-poll timeout)
138
- if (data.ret != null && data.ret !== 0 || data.errcode != null && data.errcode !== 0) {
139
- console.error(`getupdates error: ret=${data.ret} errcode=${data.errcode} errmsg=${data.errmsg || 'unknown'}`);
140
- if (data.errcode === -1 || data.errcode === 401) {
141
- console.error('Token may have expired, please login again');
175
+ const kind = classifyPollResult(data);
176
+ if (kind !== 'ok') {
177
+ failures += 1;
178
+ const detail = `ret=${data.ret} errcode=${data.errcode} errmsg=${data.errmsg || 'unknown'}`;
179
+ if (kind === 'token-expired') {
180
+ this.tokenExpired = true;
181
+ // **只在状态翻过去时喊一次**:每 5 秒刷一行会被当成噪音,而噪音等于没说
182
+ if (!expiryReported) {
183
+ expiryReported = true;
184
+ console.error(`微信通道的 token 已失效(${detail})——重试不会成功。`
185
+ + '重新登录:weflow-cli login-wechat,之后重启助手(weflow-cli assistant stop/start)'
186
+ + ';在此之前本机面板那条入口照常可用。');
187
+ }
188
+ }
189
+ else {
190
+ console.error(`getupdates error: ${detail}`);
142
191
  }
143
- await sleep(5000);
192
+ await sleep(nextPollDelay(failures));
144
193
  continue;
145
194
  }
195
+ // 这一轮是通的:清掉失败计数与"说过一次"的标记(恢复了就该重新能喊)
196
+ failures = 0;
197
+ expiryReported = false;
198
+ this.tokenExpired = false;
146
199
  if (data.get_updates_buf) {
147
200
  this.syncBuf = data.get_updates_buf;
148
201
  configService.set('wechatOcSyncBuf', this.syncBuf);
@@ -157,7 +210,11 @@ export class WechatMessageService {
157
210
  try {
158
211
  cb(inbound);
159
212
  }
160
- catch { }
213
+ catch (error) {
214
+ // **不许吞**:这里进的是助手处理消息的入口。吞掉的话,用户发了消息、
215
+ // 助手什么都没发生、日志里一个字都没有——三种证据全无,最难查的一种坏法。
216
+ console.error(`消息回调异常(这条消息没有被处理):${error?.message || error}`);
217
+ }
161
218
  }
162
219
  }
163
220
  }
@@ -170,11 +227,16 @@ export class WechatMessageService {
170
227
  // Restart poll immediately
171
228
  continue;
172
229
  }
230
+ failures += 1;
173
231
  console.error(`Polling error: ${e.message}`);
174
- await sleep(5000);
232
+ await sleep(nextPollDelay(failures));
175
233
  }
176
234
  }
177
235
  }
236
+ /** token 是否已被服务端判为失效(面板/状态用它来说实话,见 `isChannelActive`) */
237
+ isTokenExpired() {
238
+ return this.tokenExpired;
239
+ }
178
240
  async stop() {
179
241
  this.shutdownFlag = true;
180
242
  }
@@ -1 +1 @@
1
- {"version":3,"file":"wechatMessageService.js","sourceRoot":"","sources":["../../../src/services/wechatMessageService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wechatMessageService.js","sourceRoot":"","sources":["../../../src/services/wechatMessageService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function writeFileAtomic(target: string, data: string, options?: {
2
+ mode?: number;
3
+ }): void;
4
+ //# sourceMappingURL=atomicWrite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomicWrite.d.ts","sourceRoot":"","sources":["../../../src/utils/atomicWrite.ts"],"names":[],"mappings":"AAmCA,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,IAAI,CAoBnG"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * 原子写:先写 `.tmp`,再 `rename` 覆盖目标。
3
+ *
4
+ * ## 为什么不能直接 `renameSync`
5
+ *
6
+ * **Windows 上 rename 覆盖一个正被别的句柄打开的文件会失败(EPERM)**——只读打开就够触发。
7
+ * 实测:另一个句柄 `openSync(target, 'r')` 拿着时 `renameSync` 报 EPERM,句柄一关就成功。
8
+ * 杀毒、搜索索引器、另一个进程的读者都会短暂造成这个状态。
9
+ *
10
+ * 后果是**静默丢写入**:调用方(`AssistantMemory.save()`、`configService.save()`)都是
11
+ * catch 掉、只记一个原因,于是"保存成功"与"保存没发生"在界面上看不出区别。
12
+ * 这不是理论风险——本仓库一次全量测试里,记忆文件那次保存之后就真的没写进去
13
+ * (`save()` 之后文件里没有 `version`,而那条用例本身是绿的)。
14
+ *
15
+ * ## 所以
16
+ *
17
+ * 忙就重试几次(同步 sleep:调用方是同步的 `save()`,不值得为它把整条链改成异步),
18
+ * 仍然忙就**直接覆盖写目标**——保住这份数据,比保住"原子"这个性质更重要。
19
+ *
20
+ * 落盘的字节与原子写一致(都是同一份字符串),所以读者不会看到半截内容;
21
+ * 退化的那一次只失去"改名是瞬时"这一点。留给同机的读者一个真实边界:
22
+ * 若那个句柄是以拒绝写入的方式打开的,直接写也会失败,这时照旧抛给调用方。
23
+ */
24
+ import { writeFileSync, renameSync, rmSync } from 'node:fs';
25
+ /** 忙等。`Atomics.wait` 是标准库里的同步睡眠,不用引第三方包 */
26
+ function sleepSync(ms) {
27
+ try {
28
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
29
+ }
30
+ catch { /* 不支持就干脆不等,直接重试 */ }
31
+ }
32
+ /** 这些是"文件正忙"的形态,值得重试;别的错误(权限、路径不存在)立刻抛 */
33
+ const BUSY_CODES = new Set(['EPERM', 'EACCES', 'EBUSY']);
34
+ export function writeFileAtomic(target, data, options = {}) {
35
+ const tmp = `${target}.tmp`;
36
+ writeFileSync(tmp, data, { encoding: 'utf8', mode: options.mode });
37
+ for (let attempt = 0; attempt < 5; attempt++) {
38
+ try {
39
+ renameSync(tmp, target);
40
+ return;
41
+ }
42
+ catch (error) {
43
+ if (!BUSY_CODES.has(error?.code)) {
44
+ try {
45
+ rmSync(tmp, { force: true });
46
+ }
47
+ catch { /* 清理失败不掩盖原错误 */ }
48
+ throw error;
49
+ }
50
+ sleepSync(10 * (attempt + 1));
51
+ }
52
+ }
53
+ // 还在忙:直接覆盖。数据不丢,只是不再"原子"
54
+ writeFileSync(target, data, { encoding: 'utf8', mode: options.mode });
55
+ try {
56
+ rmSync(tmp, { force: true });
57
+ }
58
+ catch { /* 见上 */ }
59
+ }
60
+ //# sourceMappingURL=atomicWrite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomicWrite.js","sourceRoot":"","sources":["../../../src/utils/atomicWrite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAE3D,2CAA2C;AAC3C,SAAS,SAAS,CAAC,EAAU;IAC3B,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IAClE,CAAC;IAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC;AACjC,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;AAExD,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,IAAY,EAAE,UAA6B,EAAE;IAC3F,MAAM,GAAG,GAAG,GAAG,MAAM,MAAM,CAAA;IAC3B,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;IAElE,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;YACvB,OAAM;QACR,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;gBACjC,IAAI,CAAC;oBAAC,MAAM,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC;gBAC/D,MAAM,KAAK,CAAA;YACb,CAAC;YACD,SAAS,CAAC,EAAE,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;IACrE,IAAI,CAAC;QAAC,MAAM,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;AACzD,CAAC"}
@@ -12,4 +12,19 @@ export declare function resolveExportDateRange(options: {
12
12
  from?: number;
13
13
  to?: number;
14
14
  };
15
+ /**
16
+ * 助手工具用的时间表达式:`2026-09-16`(本地零点)、`3d` / `2w` / `12h`、以及裸数字(= 天数)。
17
+ * 回**秒**——与消息里的 `createTime` 同一单位。
18
+ *
19
+ * 为什么允许相对写法:模型没法可靠地把"上周三"算成日期(系统提示里给了当前时间也只是够用),
20
+ * 而"过去三天"这种说法只要一个 `3d` 就表达了,不用它自己数日子。
21
+ *
22
+ * 日/周**按当天零点**而不是精确 24 小时前:人说的"三天"指的是那三天,不是一个瞬时。
23
+ * 给不出明确的窗口就抛——**猜一个比报错更糟**,模型会以为它查的正是自己说的那段时间。
24
+ */
25
+ export declare function resolveSince(value: unknown, nowMs?: number): number | undefined;
26
+ /** 上界:`2026-09-16` 指**含当天**(当天 23:59:59),因为"到那天为止"总是指一整天。 */
27
+ export declare function resolveUntil(value: unknown): number | undefined;
28
+ /** 给系统提示/工具输出用的一行当前时间。测试要能固定它,所以 `now` 可注入。 */
29
+ export declare function nowLine(now?: Date): string;
15
30
  //# sourceMappingURL=dateRange.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dateRange.d.ts","sourceRoot":"","sources":["../../../src/utils/dateRange.ts"],"names":[],"mappings":"AAAA,qBAAa,cAAe,SAAQ,KAAK;aACX,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAG1D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,UAAQ,GAAG,MAAM,GAAG,SAAS,CAyBnG;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAClC,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,CAmBjC"}
1
+ {"version":3,"file":"dateRange.d.ts","sourceRoot":"","sources":["../../../src/utils/dateRange.ts"],"names":[],"mappings":"AAAA,qBAAa,cAAe,SAAQ,KAAK;aACX,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAG1D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,UAAQ,GAAG,MAAM,GAAG,SAAS,CAyBnG;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAClC,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,CAmBjC;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,SAAa,GAAG,MAAM,GAAG,SAAS,CAYnF;AAED,6DAA6D;AAC7D,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAK/D;AAQD,+CAA+C;AAC/C,wBAAgB,OAAO,CAAC,GAAG,OAAa,GAAG,MAAM,CAKhD"}
@@ -45,4 +45,51 @@ export function resolveExportDateRange(options) {
45
45
  }
46
46
  return { from, to };
47
47
  }
48
+ /**
49
+ * 助手工具用的时间表达式:`2026-09-16`(本地零点)、`3d` / `2w` / `12h`、以及裸数字(= 天数)。
50
+ * 回**秒**——与消息里的 `createTime` 同一单位。
51
+ *
52
+ * 为什么允许相对写法:模型没法可靠地把"上周三"算成日期(系统提示里给了当前时间也只是够用),
53
+ * 而"过去三天"这种说法只要一个 `3d` 就表达了,不用它自己数日子。
54
+ *
55
+ * 日/周**按当天零点**而不是精确 24 小时前:人说的"三天"指的是那三天,不是一个瞬时。
56
+ * 给不出明确的窗口就抛——**猜一个比报错更糟**,模型会以为它查的正是自己说的那段时间。
57
+ */
58
+ export function resolveSince(value, nowMs = Date.now()) {
59
+ const text = String(value ?? '').trim();
60
+ if (!text)
61
+ return undefined;
62
+ const relative = text.match(/^(\d+)\s*([dhw])$/i);
63
+ if (relative) {
64
+ const amount = Number(relative[1]);
65
+ const unit = relative[2].toLowerCase();
66
+ if (unit === 'h')
67
+ return Math.floor((nowMs - amount * 3_600_000) / 1000);
68
+ return startOfDayMs(nowMs - amount * (unit === 'w' ? 7 : 1) * 86_400_000);
69
+ }
70
+ if (/^\d+$/.test(text))
71
+ return startOfDayMs(nowMs - Number(text) * 86_400_000);
72
+ return parseLocalDateOrIso(text);
73
+ }
74
+ /** 上界:`2026-09-16` 指**含当天**(当天 23:59:59),因为"到那天为止"总是指一整天。 */
75
+ export function resolveUntil(value) {
76
+ const text = String(value ?? '').trim();
77
+ if (!text)
78
+ return undefined;
79
+ if (/^\d{4}-\d{2}-\d{2}$/.test(text))
80
+ return parseLocalDateOrIso(text, true);
81
+ return parseLocalDateOrIso(text);
82
+ }
83
+ function startOfDayMs(ms) {
84
+ const date = new Date(ms);
85
+ date.setHours(0, 0, 0, 0);
86
+ return Math.floor(date.getTime() / 1000);
87
+ }
88
+ /** 给系统提示/工具输出用的一行当前时间。测试要能固定它,所以 `now` 可注入。 */
89
+ export function nowLine(now = new Date()) {
90
+ const pad = (n) => String(n).padStart(2, '0');
91
+ const week = ['日', '一', '二', '三', '四', '五', '六'][now.getDay()];
92
+ return `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}(星期${week})`
93
+ + `${pad(now.getHours())}:${pad(now.getMinutes())}`;
94
+ }
48
95
  //# sourceMappingURL=dateRange.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dateRange.js","sourceRoot":"","sources":["../../../src/utils/dateRange.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,cAAe,SAAQ,KAAK;IACX;IAA5B,YAA4B,IAAY,EAAE,OAAe;QACvD,KAAK,CAAC,OAAO,CAAC,CAAA;QADY,SAAI,GAAJ,IAAI,CAAQ;IAExC,CAAC;CACF;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAyB,EAAE,QAAQ,GAAG,KAAK;IAC7E,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAA;IAC5B,IAAI,SAAiB,CAAA;IACrB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAA;IACtD,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,KAAK,CAAA;QAClC,MAAM,IAAI,GAAG,IAAI,IAAI,CACnB,MAAM,CAAC,IAAI,CAAC,EACZ,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EACjB,MAAM,CAAC,GAAG,CAAC,EACX,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EACjB,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EACjB,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EACjB,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACnB,CAAA;QACD,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,IAAI,CAAC;YAC7C,IAAI,CAAC,QAAQ,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;YACrC,IAAI,CAAC,OAAO,EAAE,KAAK,MAAM,CAAC,GAAG,CAAC;YAC9B,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE;YAChB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAA;IAChB,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAC/B,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;QAAE,MAAM,IAAI,cAAc,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAA;IAC/E,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAA;AACrC,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAKtC;IACC,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,cAAc,CAAC,0BAA0B,EAAE,6BAA6B,CAAC,CAAA;IACrF,CAAC;IAED,IAAI,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5C,IAAI,EAAE,GAAG,mBAAmB,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;IAC9C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACnD,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACvD,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC;YACrC,IAAI,GAAG,SAAS,CAAA;YAChB,EAAE,GAAG,OAAO,CAAA;QACd,CAAC;IACH,CAAC;IACD,IAAI,IAAI,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC;QACxD,MAAM,IAAI,cAAc,CAAC,oBAAoB,EAAE,cAAc,CAAC,CAAA;IAChE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;AACrB,CAAC"}
1
+ {"version":3,"file":"dateRange.js","sourceRoot":"","sources":["../../../src/utils/dateRange.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * 显示形态里的小工具。
3
+ *
4
+ * 只放跨模块共用的:`clipWithMarker` 有两处需要——AppMsg 的显示形态
5
+ * (`core/appMsgFormat.ts`,引用消息的正文与被引原文各截一次)和助手读聊天记录时
6
+ * 每条消息的字数上限(`services/assistantTools.ts`)。
7
+ *
8
+ * Python 侧有一份同义的实现(`nt_decrypt.py` 的 `_clip`),做的是同一件事。
9
+ */
10
+ /**
11
+ * 超长截断并**留下省略号**。
12
+ *
13
+ * 不标记的截断读起来像一句说完的话:被引原文最长的 12733 字(引用了一整篇公众号文章),
14
+ * 切完看着像"这就是全部";助手把一条 300 字的聊天记录切到 160,模型会以为对方就说完了
15
+ * 这半句。标记只花一个字符,换来的是"这里被切过"这个事实没有丢。
16
+ */
17
+ export declare function clipWithMarker(text: string, limit: number): string;
18
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/utils/text.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAElE"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * 显示形态里的小工具。
3
+ *
4
+ * 只放跨模块共用的:`clipWithMarker` 有两处需要——AppMsg 的显示形态
5
+ * (`core/appMsgFormat.ts`,引用消息的正文与被引原文各截一次)和助手读聊天记录时
6
+ * 每条消息的字数上限(`services/assistantTools.ts`)。
7
+ *
8
+ * Python 侧有一份同义的实现(`nt_decrypt.py` 的 `_clip`),做的是同一件事。
9
+ */
10
+ /**
11
+ * 超长截断并**留下省略号**。
12
+ *
13
+ * 不标记的截断读起来像一句说完的话:被引原文最长的 12733 字(引用了一整篇公众号文章),
14
+ * 切完看着像"这就是全部";助手把一条 300 字的聊天记录切到 160,模型会以为对方就说完了
15
+ * 这半句。标记只花一个字符,换来的是"这里被切过"这个事实没有丢。
16
+ */
17
+ export function clipWithMarker(text, limit) {
18
+ return text.length <= limit ? text : text.slice(0, limit) + '…';
19
+ }
20
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../../src/utils/text.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,KAAa;IACxD,OAAO,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,GAAG,CAAA;AACjE,CAAC"}
@@ -70,6 +70,8 @@ Image and file previews contain only the base file name and byte size, not the f
70
70
 
71
71
  Starting the assistant may create a background process, handle incoming Bot-channel messages, and consume AI quota. Agents must use `assistant start --dry-run --json` before a user-approved `assistant start --yes --json`. Stopping follows the same protocol. Status remains read-only through `assistant status --json`.
72
72
 
73
+ The local panel follows that lifecycle too, with one extra consequence to state: `panel --dry-run --json` reports `willStartDaemon` and `keepsRunningAfterClose` before anything happens, and `panel --yes --json` may start the assistant daemon and open a local window. Closing that window does **not** stop the daemon, so an agent that opened it must not report the assistant as stopped. `panel --status --json` is read-only and does not open a window; it returns the loopback port, the quota used, and the **memory bucket** the panel is writing to. `panel --ask "<text>" --yes --json` sends one real turn through the same endpoint as the window: it consumes quota, may call a cloud model, and must be treated as user-approved work rather than a status check. The panel writes nothing to a command line: the endpoint token is stored in `~/.weflow-cli/assistant_endpoint.json` and must never be echoed, copied into a reply, or passed as an argument.
74
+
73
75
  The local daily reader follows the same lifecycle pattern. `daily-server --status --json` only checks loopback status. Starting it requires `daily-server --dry-run --json` followed by user-approved `daily-server --yes --json`; the confirmed JSON startup waits for the loopback service to report the requested date and returns a failure code if the date output is missing or the process does not become ready. Add `--open` only when the user also wants a browser window opened. Human-oriented non-JSON startup remains compatible. The older `fav-server` command is a compatibility entry and applies the same machine-mode confirmation rule.
74
76
 
75
77
  Message-channel authentication is human-gated. Agents may inspect `login-wechat --dry-run --json`, but actual login uses `login-wechat --yes` in an interactive terminal because the user must scan a QR code. `login-wechat --yes --json` returns `INTERACTIVE_REQUIRED` without starting login. Logout uses `logout-wechat --dry-run --json` followed by user-approved `logout-wechat --yes --json`.