@zaofan/dsh-qqbot 0.6.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 (227) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +308 -0
  3. package/README_EN.md +273 -0
  4. package/client/qqbot-settings.js +1463 -0
  5. package/cordis.patch.yml +36 -0
  6. package/dist/api/group-admin.d.ts +112 -0
  7. package/dist/api/group-admin.d.ts.map +1 -0
  8. package/dist/api/group-admin.js +179 -0
  9. package/dist/api/group-admin.js.map +1 -0
  10. package/dist/channel-tools.d.ts +14 -0
  11. package/dist/channel-tools.d.ts.map +1 -0
  12. package/dist/channel-tools.js +880 -0
  13. package/dist/channel-tools.js.map +1 -0
  14. package/dist/commands/help.d.ts +11 -0
  15. package/dist/commands/help.d.ts.map +1 -0
  16. package/dist/commands/help.js +21 -0
  17. package/dist/commands/help.js.map +1 -0
  18. package/dist/commands/index.d.ts +13 -0
  19. package/dist/commands/index.d.ts.map +1 -0
  20. package/dist/commands/index.js +29 -0
  21. package/dist/commands/index.js.map +1 -0
  22. package/dist/commands/misc.d.ts +14 -0
  23. package/dist/commands/misc.d.ts.map +1 -0
  24. package/dist/commands/misc.js +39 -0
  25. package/dist/commands/misc.js.map +1 -0
  26. package/dist/commands/model.d.ts +7 -0
  27. package/dist/commands/model.d.ts.map +1 -0
  28. package/dist/commands/model.js +58 -0
  29. package/dist/commands/model.js.map +1 -0
  30. package/dist/commands/session.d.ts +10 -0
  31. package/dist/commands/session.d.ts.map +1 -0
  32. package/dist/commands/session.js +26 -0
  33. package/dist/commands/session.js.map +1 -0
  34. package/dist/commands/status.d.ts +8 -0
  35. package/dist/commands/status.d.ts.map +1 -0
  36. package/dist/commands/status.js +24 -0
  37. package/dist/commands/status.js.map +1 -0
  38. package/dist/commands/types.d.ts +12 -0
  39. package/dist/commands/types.d.ts.map +1 -0
  40. package/dist/commands/types.js +2 -0
  41. package/dist/commands/types.js.map +1 -0
  42. package/dist/config.d.ts +205 -0
  43. package/dist/config.d.ts.map +1 -0
  44. package/dist/config.js +203 -0
  45. package/dist/config.js.map +1 -0
  46. package/dist/features/chat-ledger.d.ts +53 -0
  47. package/dist/features/chat-ledger.d.ts.map +1 -0
  48. package/dist/features/chat-ledger.js +185 -0
  49. package/dist/features/chat-ledger.js.map +1 -0
  50. package/dist/features/face-tags.d.ts +17 -0
  51. package/dist/features/face-tags.d.ts.map +1 -0
  52. package/dist/features/face-tags.js +79 -0
  53. package/dist/features/face-tags.js.map +1 -0
  54. package/dist/features/group-join-request.d.ts +65 -0
  55. package/dist/features/group-join-request.d.ts.map +1 -0
  56. package/dist/features/group-join-request.js +190 -0
  57. package/dist/features/group-join-request.js.map +1 -0
  58. package/dist/features/history-store.d.ts +8 -0
  59. package/dist/features/history-store.d.ts.map +1 -0
  60. package/dist/features/history-store.js +24 -0
  61. package/dist/features/history-store.js.map +1 -0
  62. package/dist/features/qq-approval.d.ts +78 -0
  63. package/dist/features/qq-approval.d.ts.map +1 -0
  64. package/dist/features/qq-approval.js +165 -0
  65. package/dist/features/qq-approval.js.map +1 -0
  66. package/dist/features/schedule-store.d.ts +62 -0
  67. package/dist/features/schedule-store.d.ts.map +1 -0
  68. package/dist/features/schedule-store.js +253 -0
  69. package/dist/features/schedule-store.js.map +1 -0
  70. package/dist/features/scheduler.d.ts +9 -0
  71. package/dist/features/scheduler.d.ts.map +1 -0
  72. package/dist/features/scheduler.js +146 -0
  73. package/dist/features/scheduler.js.map +1 -0
  74. package/dist/features/sticker-gate.d.ts +90 -0
  75. package/dist/features/sticker-gate.d.ts.map +1 -0
  76. package/dist/features/sticker-gate.js +391 -0
  77. package/dist/features/sticker-gate.js.map +1 -0
  78. package/dist/features/sticker-store.d.ts +158 -0
  79. package/dist/features/sticker-store.d.ts.map +1 -0
  80. package/dist/features/sticker-store.js +676 -0
  81. package/dist/features/sticker-store.js.map +1 -0
  82. package/dist/features/sticker-tagger.d.ts +10 -0
  83. package/dist/features/sticker-tagger.d.ts.map +1 -0
  84. package/dist/features/sticker-tagger.js +139 -0
  85. package/dist/features/sticker-tagger.js.map +1 -0
  86. package/dist/gateway/bootstrap.d.ts +12 -0
  87. package/dist/gateway/bootstrap.d.ts.map +1 -0
  88. package/dist/gateway/bootstrap.js +346 -0
  89. package/dist/gateway/bootstrap.js.map +1 -0
  90. package/dist/gateway/debounce.d.ts +40 -0
  91. package/dist/gateway/debounce.d.ts.map +1 -0
  92. package/dist/gateway/debounce.js +262 -0
  93. package/dist/gateway/debounce.js.map +1 -0
  94. package/dist/gateway/index.d.ts +3 -0
  95. package/dist/gateway/index.d.ts.map +1 -0
  96. package/dist/gateway/index.js +3 -0
  97. package/dist/gateway/index.js.map +1 -0
  98. package/dist/gateway/middleware-setup.d.ts +12 -0
  99. package/dist/gateway/middleware-setup.d.ts.map +1 -0
  100. package/dist/gateway/middleware-setup.js +156 -0
  101. package/dist/gateway/middleware-setup.js.map +1 -0
  102. package/dist/index.d.ts +14 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +187 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/middleware/attachment.d.ts +11 -0
  107. package/dist/middleware/attachment.d.ts.map +1 -0
  108. package/dist/middleware/attachment.js +17 -0
  109. package/dist/middleware/attachment.js.map +1 -0
  110. package/dist/middleware/media-history.d.ts +30 -0
  111. package/dist/middleware/media-history.d.ts.map +1 -0
  112. package/dist/middleware/media-history.js +54 -0
  113. package/dist/middleware/media-history.js.map +1 -0
  114. package/dist/middleware/sticker-capture.d.ts +17 -0
  115. package/dist/middleware/sticker-capture.d.ts.map +1 -0
  116. package/dist/middleware/sticker-capture.js +97 -0
  117. package/dist/middleware/sticker-capture.js.map +1 -0
  118. package/dist/model/index.d.ts +10 -0
  119. package/dist/model/index.d.ts.map +1 -0
  120. package/dist/model/index.js +9 -0
  121. package/dist/model/index.js.map +1 -0
  122. package/dist/model/model-resolver.d.ts +88 -0
  123. package/dist/model/model-resolver.d.ts.map +1 -0
  124. package/dist/model/model-resolver.js +151 -0
  125. package/dist/model/model-resolver.js.map +1 -0
  126. package/dist/model/prefs-store.d.ts +24 -0
  127. package/dist/model/prefs-store.d.ts.map +1 -0
  128. package/dist/model/prefs-store.js +126 -0
  129. package/dist/model/prefs-store.js.map +1 -0
  130. package/dist/model/settings-reader.d.ts +19 -0
  131. package/dist/model/settings-reader.d.ts.map +1 -0
  132. package/dist/model/settings-reader.js +76 -0
  133. package/dist/model/settings-reader.js.map +1 -0
  134. package/dist/model/types.d.ts +15 -0
  135. package/dist/model/types.d.ts.map +1 -0
  136. package/dist/model/types.js +5 -0
  137. package/dist/model/types.js.map +1 -0
  138. package/dist/session/idle-evictor.d.ts +18 -0
  139. package/dist/session/idle-evictor.d.ts.map +1 -0
  140. package/dist/session/idle-evictor.js +31 -0
  141. package/dist/session/idle-evictor.js.map +1 -0
  142. package/dist/session/index.d.ts +9 -0
  143. package/dist/session/index.d.ts.map +1 -0
  144. package/dist/session/index.js +8 -0
  145. package/dist/session/index.js.map +1 -0
  146. package/dist/session/session-manager.d.ts +97 -0
  147. package/dist/session/session-manager.d.ts.map +1 -0
  148. package/dist/session/session-manager.js +624 -0
  149. package/dist/session/session-manager.js.map +1 -0
  150. package/dist/session/types.d.ts +130 -0
  151. package/dist/session/types.d.ts.map +1 -0
  152. package/dist/session/types.js +2 -0
  153. package/dist/session/types.js.map +1 -0
  154. package/dist/session/workspace-attach.d.ts +22 -0
  155. package/dist/session/workspace-attach.d.ts.map +1 -0
  156. package/dist/session/workspace-attach.js +21 -0
  157. package/dist/session/workspace-attach.js.map +1 -0
  158. package/dist/setup.d.ts +25 -0
  159. package/dist/setup.d.ts.map +1 -0
  160. package/dist/setup.js +198 -0
  161. package/dist/setup.js.map +1 -0
  162. package/dist/shared/index.d.ts +7 -0
  163. package/dist/shared/index.d.ts.map +1 -0
  164. package/dist/shared/index.js +7 -0
  165. package/dist/shared/index.js.map +1 -0
  166. package/dist/shared/scope.d.ts +14 -0
  167. package/dist/shared/scope.d.ts.map +1 -0
  168. package/dist/shared/scope.js +12 -0
  169. package/dist/shared/scope.js.map +1 -0
  170. package/dist/shared/send-helper.d.ts +11 -0
  171. package/dist/shared/send-helper.d.ts.map +1 -0
  172. package/dist/shared/send-helper.js +13 -0
  173. package/dist/shared/send-helper.js.map +1 -0
  174. package/dist/shared/utils.d.ts +28 -0
  175. package/dist/shared/utils.d.ts.map +1 -0
  176. package/dist/shared/utils.js +143 -0
  177. package/dist/shared/utils.js.map +1 -0
  178. package/dist/transport/attachment.d.ts +18 -0
  179. package/dist/transport/attachment.d.ts.map +1 -0
  180. package/dist/transport/attachment.js +106 -0
  181. package/dist/transport/attachment.js.map +1 -0
  182. package/dist/transport/chunker.d.ts +14 -0
  183. package/dist/transport/chunker.d.ts.map +1 -0
  184. package/dist/transport/chunker.js +78 -0
  185. package/dist/transport/chunker.js.map +1 -0
  186. package/dist/transport/events.d.ts +80 -0
  187. package/dist/transport/events.d.ts.map +1 -0
  188. package/dist/transport/events.js +62 -0
  189. package/dist/transport/events.js.map +1 -0
  190. package/dist/transport/inbound.d.ts +8 -0
  191. package/dist/transport/inbound.d.ts.map +1 -0
  192. package/dist/transport/inbound.js +292 -0
  193. package/dist/transport/inbound.js.map +1 -0
  194. package/dist/transport/index.d.ts +10 -0
  195. package/dist/transport/index.d.ts.map +1 -0
  196. package/dist/transport/index.js +10 -0
  197. package/dist/transport/index.js.map +1 -0
  198. package/dist/transport/inject-rules.d.ts +24 -0
  199. package/dist/transport/inject-rules.d.ts.map +1 -0
  200. package/dist/transport/inject-rules.js +72 -0
  201. package/dist/transport/inject-rules.js.map +1 -0
  202. package/dist/transport/outbound-buffer.d.ts +56 -0
  203. package/dist/transport/outbound-buffer.d.ts.map +1 -0
  204. package/dist/transport/outbound-buffer.js +131 -0
  205. package/dist/transport/outbound-buffer.js.map +1 -0
  206. package/dist/transport/outbound.d.ts +30 -0
  207. package/dist/transport/outbound.d.ts.map +1 -0
  208. package/dist/transport/outbound.js +139 -0
  209. package/dist/transport/outbound.js.map +1 -0
  210. package/dist/transport/rich-media.d.ts +41 -0
  211. package/dist/transport/rich-media.d.ts.map +1 -0
  212. package/dist/transport/rich-media.js +104 -0
  213. package/dist/transport/rich-media.js.map +1 -0
  214. package/dist/transport/streaming-writer.d.ts +47 -0
  215. package/dist/transport/streaming-writer.d.ts.map +1 -0
  216. package/dist/transport/streaming-writer.js +110 -0
  217. package/dist/transport/streaming-writer.js.map +1 -0
  218. package/dist/transport/tool-presenter.d.ts +38 -0
  219. package/dist/transport/tool-presenter.d.ts.map +1 -0
  220. package/dist/transport/tool-presenter.js +121 -0
  221. package/dist/transport/tool-presenter.js.map +1 -0
  222. package/dist/types.d.ts +45 -0
  223. package/dist/types.d.ts.map +1 -0
  224. package/dist/types.js +5 -0
  225. package/dist/types.js.map +1 -0
  226. package/package.json +106 -0
  227. package/settings-host.js +927 -0
@@ -0,0 +1,130 @@
1
+ /**
2
+ * 会话管理层类型定义
3
+ */
4
+ import type { Context } from '@deepseek-ai/cordis';
5
+ import type { ChatScope, ReplyTarget } from '../types.js';
6
+ /** AgentSetup hook 类型 */
7
+ export type AgentSetup = (agentCtx: Context) => Promise<void> | void;
8
+ /** dsh SessionEvent 简化类型(用于统计 token 用量 / 导出) */
9
+ export interface SessionEventLike {
10
+ type: string;
11
+ seq?: number;
12
+ usage?: {
13
+ input?: number;
14
+ output?: number;
15
+ cacheRead?: number;
16
+ cacheWrite?: number;
17
+ };
18
+ message?: {
19
+ content?: Array<{
20
+ type: string;
21
+ text?: string;
22
+ }>;
23
+ [key: string]: unknown;
24
+ };
25
+ [key: string]: unknown;
26
+ }
27
+ /** dsh Agent 简化接口 */
28
+ export interface DshAgent {
29
+ readonly id: string;
30
+ readonly ctx: Context;
31
+ /** 底层 session(fork 时作为 source,events 用于统计/导出) */
32
+ readonly session: {
33
+ readonly id: string;
34
+ readonly events?: readonly SessionEventLike[];
35
+ };
36
+ cancel(cause: {
37
+ kind: string;
38
+ }): void;
39
+ followup(message: unknown): void;
40
+ /** 宿主实例能力(可选探测): 注入消息不唤醒 agent, 排队到下个 step 组包(事件通知用) */
41
+ inject?(message: unknown): void;
42
+ whenIdle(): Promise<void>;
43
+ }
44
+ export interface DshAgentHandle {
45
+ agent: DshAgent;
46
+ dispose(): Promise<void>;
47
+ }
48
+ /** sessions 服务(fork 能力) */
49
+ export interface SessionsService {
50
+ fork(source: unknown, boundary?: number): {
51
+ events: readonly unknown[];
52
+ };
53
+ }
54
+ export interface DshAgentRegistry {
55
+ /** 获取进程内已存活的 agent */
56
+ get(sessionId: string): DshAgent | undefined;
57
+ /** 从持久化存储恢复 session */
58
+ resume(options: {
59
+ resumeSessionId: string;
60
+ agentOptions?: {
61
+ provider?: string;
62
+ model?: string;
63
+ };
64
+ setup?: AgentSetup;
65
+ }): Promise<DshAgentHandle>;
66
+ /** 创建全新 session */
67
+ create(options: {
68
+ sessionId: string;
69
+ meta?: {
70
+ cwd?: string;
71
+ parentSession?: string;
72
+ seedLength?: number;
73
+ agentPreset?: string;
74
+ };
75
+ seed?: readonly unknown[];
76
+ agentOptions?: {
77
+ provider?: string;
78
+ model?: string;
79
+ };
80
+ setup?: AgentSetup;
81
+ }): Promise<DshAgentHandle>;
82
+ }
83
+ /** agent-presets 服务接口(可选,部署中可能没有) */
84
+ export interface AgentPresetsLike {
85
+ readonly defaultId: string;
86
+ resolve(id?: string): Promise<{
87
+ id: string;
88
+ }>;
89
+ mount(agentCtx: Context, id?: string): Promise<unknown>;
90
+ }
91
+ /** preset 组合结果 */
92
+ export interface PresetComposition {
93
+ agentPreset?: string;
94
+ setup?: AgentSetup;
95
+ }
96
+ /** 单个会话记录 */
97
+ export interface SessionRecord {
98
+ sessionKey: string;
99
+ sessionId: string;
100
+ agent: DshAgent;
101
+ handle: DshAgentHandle;
102
+ replyTarget: ReplyTarget;
103
+ scope: ChatScope;
104
+ peerId: string;
105
+ senderId: string;
106
+ lastActivity: number;
107
+ agentPreset?: string;
108
+ /** setup 收到的 agent ctx(工具自愈用;setup 竞态失败时可能缺) */
109
+ agentCtx?: unknown;
110
+ /** 通道工具是否已确认装载(自愈幂等标记) */
111
+ channelToolsReady?: boolean;
112
+ }
113
+ /** 会话状态信息(/status 用) */
114
+ export interface SessionStatus {
115
+ active: boolean;
116
+ sessionId?: string;
117
+ provider?: string;
118
+ model?: string;
119
+ preset?: string;
120
+ lastActivity?: number;
121
+ messageCount?: number;
122
+ }
123
+ /** token 用量统计(/cost 用) */
124
+ export interface TokenUsageStats {
125
+ input: number;
126
+ output: number;
127
+ cacheRead: number;
128
+ cacheWrite: number;
129
+ }
130
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/session/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/session/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * workspace-attach.ts — 把 QQ 会话挂到其 cwd 对应的工作区分组(修复侧边栏归属)
3
+ *
4
+ * 移植自上游 PR tencent-connect/dsh-qqbot#21(workspace-attach)。
5
+ * 问题: Web 侧边栏按工作区成员列表展示会话, 宿主只在客户端 session.create
6
+ * RPC 路径调用 workspace.attachSession(dsh-host-apiproxy), dsh-workspace 的
7
+ * "认领遗漏会话"(bootstrap) 仅在首次初始化执行——插件创建的 QQ 会话两条路径
8
+ * 都不经过 → 不在任何工作区成员列表, 刷新后只能落 Ungrouped(且闲置回收后
9
+ * 从侧边栏消失的另一主因是宿主帧语义, 见 deepseek-harness#4045, 本文件不处理)。
10
+ *
11
+ * 做法: 在 SessionManager.getOrCreate 创建/恢复会话后调用, 把会话挂到其 cwd
12
+ * 对应的 workspace(registry.create(cwd) 幂等取回 → workspace.attachSession 幂等)。
13
+ * - 幂等: 创建与恢复路径都安全调用; 老会话在下一次消息恢复时自动补挂。
14
+ * - 全 fail-soft: workspaceRegistry 未挂载(如 headless)或任何一步失败 →
15
+ * 静默降级(仅日志), 绝不影响消息处理主链。
16
+ *
17
+ * ⚠️ 本地手改功能(fork 新增, 移植上游): 维护清单见工作区根《插件改动维护注意事项.md》。
18
+ */
19
+ import type { Context } from '@deepseek-ai/cordis';
20
+ import type { Logger } from '../types.js';
21
+ export declare function attachSessionToWorkspace(ctx: Context, cwd: string | undefined, sessionId: string, logger: Logger): Promise<void>;
22
+ //# sourceMappingURL=workspace-attach.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-attach.d.ts","sourceRoot":"","sources":["../../src/session/workspace-attach.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAO1C,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAiBf"}
@@ -0,0 +1,21 @@
1
+ export async function attachSessionToWorkspace(ctx, cwd, sessionId, logger) {
2
+ if (!cwd)
3
+ return;
4
+ try {
5
+ const registry = ctx.get?.('workspaceRegistry');
6
+ if (!registry?.create) {
7
+ // workspaceRegistry 未挂载(如 headless profile) → 静默跳过
8
+ return;
9
+ }
10
+ const workspace = await registry.create(cwd);
11
+ if (workspace?.attachSession) {
12
+ await workspace.attachSession(sessionId);
13
+ logger.info(`[workspace-attach] session ${sessionId} → workspace ${cwd}`);
14
+ }
15
+ }
16
+ catch (err) {
17
+ // fail-soft: 挂载失败绝不影响会话使用; 留 warn 便于主人查(无 workspaceRegistry 时宿主会抛)
18
+ logger.warn?.(`[workspace-attach] skipped: ${err instanceof Error ? err.message : String(err)}`);
19
+ }
20
+ }
21
+ //# sourceMappingURL=workspace-attach.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-attach.js","sourceRoot":"","sources":["../../src/session/workspace-attach.ts"],"names":[],"mappings":"AA0BA,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,GAAY,EACZ,GAAuB,EACvB,SAAiB,EACjB,MAAc;IAEd,IAAI,CAAC,GAAG;QAAE,OAAO;IACjB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAI,GAA2C,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAsC,CAAC;QAC9H,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;YACtB,mDAAmD;YACnD,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,SAAS,EAAE,aAAa,EAAE,CAAC;YAC7B,MAAM,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,8BAA8B,SAAS,gBAAgB,GAAG,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,mEAAmE;QACnE,MAAM,CAAC,IAAI,EAAE,CAAC,+BAA+B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnG,CAAC;AACH,CAAC"}
@@ -0,0 +1,25 @@
1
+ /** 凭据结果 */
2
+ export interface SetupCredentials {
3
+ appId: string;
4
+ appSecret: string;
5
+ }
6
+ /**
7
+ * 执行 QR 扫码绑定,获取 QQ Bot 凭据
8
+ *
9
+ * 在终端打印二维码等待用户扫码;同时输出扫码 URL,
10
+ * 供二维码因系统字符问题渲染错位时点击/复制到浏览器打开扫码。
11
+ */
12
+ export declare function runQrSetup(source?: string): Promise<SetupCredentials | null>;
13
+ /**
14
+ * 将凭据写入 dsh profile 的 cordis.patch.yml
15
+ *
16
+ * 行级编辑(不再整文件 YAML 解析)——cordis.patch.yml 常含宿主 `!!js` 自定义标签,
17
+ * js-yaml 无法解析会抛错导致自动保存失败(实测线上文件即因此走到手动引导)。
18
+ * 只定位/更新顶层 `- id: im-qqbot` 条目块中的 appId/appSecret 行,
19
+ * 文件其它内容(含 !!js、其它实例、insert 包装)原样保留。文件不存在时安全重建。
20
+ */
21
+ export declare function persistCredentialsToProfile(credentials: SetupCredentials, profileDir?: string, logger?: {
22
+ info(msg: string, ...args: unknown[]): void;
23
+ warn(msg: string, ...args: unknown[]): void;
24
+ }): boolean;
25
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAWA,WAAW;AACX,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAOD;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,MAAM,SAAc,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAyDvF;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,gBAAgB,EAC7B,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE;IAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;CAAE,GACpG,OAAO,CA2FT"}
package/dist/setup.js ADDED
@@ -0,0 +1,198 @@
1
+ /**
2
+ * QQ Bot 凭据初始化 — 扫码绑定
3
+ *
4
+ * 当 appId/appSecret 未配置时,通过 @tencent-connect/qqbot-connector
5
+ * 唤起终端扫码流程获取凭据,并写入 dsh profile 配置。
6
+ */
7
+ import { resolve } from 'node:path';
8
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
9
+ import { startQrConnect } from '@tencent-connect/qqbot-connector';
10
+ /** 终端可点击的 OSC 8 超链接(不支持 OSC 8 的终端会忽略控制序列,退化为纯 URL 文本) */
11
+ function clickableLink(url) {
12
+ return `\u001b]8;;${url}\u001b\\${url}\u001b]8;;\u001b\\`;
13
+ }
14
+ /**
15
+ * 执行 QR 扫码绑定,获取 QQ Bot 凭据
16
+ *
17
+ * 在终端打印二维码等待用户扫码;同时输出扫码 URL,
18
+ * 供二维码因系统字符问题渲染错位时点击/复制到浏览器打开扫码。
19
+ */
20
+ export async function runQrSetup(source = 'dsh-qqbot') {
21
+ console.log('\n══════════════════════════════════════════════════════');
22
+ console.log(' QQ Bot 凭据未配置,启动扫码绑定');
23
+ console.log('══════════════════════════════════════════════════════\n');
24
+ try {
25
+ console.log('请使用手机 QQ 扫描下方二维码完成绑定...\n');
26
+ // 回调风格:onQrDisplayed 会在二维码打印后、轮询开始前回调扫码 URL,
27
+ // 让用户在二维码错位时也能通过链接打开扫码页(二维码过期刷新会再次触发)。
28
+ const credentials = await new Promise((resolve, reject) => {
29
+ startQrConnect({
30
+ onSuccess: resolve,
31
+ onFailure: reject,
32
+ onQrDisplayed: (url) => {
33
+ console.log('二维码显示异常?点击下方链接,用浏览器打开即可完成扫码:');
34
+ console.log(` ${clickableLink(url)}\n`);
35
+ },
36
+ onQrExpired: () => {
37
+ console.log('二维码已过期,正在刷新…\n');
38
+ },
39
+ }, { source });
40
+ });
41
+ if (!credentials || credentials.length === 0) {
42
+ console.error('[im-qqbot] 扫码未返回凭据');
43
+ return null;
44
+ }
45
+ const cred = credentials[0];
46
+ if (!cred) {
47
+ console.error('[im-qqbot] 扫码未返回有效凭据');
48
+ return null;
49
+ }
50
+ console.log(`\n✔ 绑定成功!AppID: ${cred.appId}\n`);
51
+ return {
52
+ appId: cred.appId,
53
+ appSecret: cred.appSecret,
54
+ };
55
+ }
56
+ catch (err) {
57
+ const msg = err instanceof Error ? err.message : String(err);
58
+ if (msg.includes('Cannot find') || msg.includes('ERR_MODULE_NOT_FOUND')) {
59
+ console.error('[im-qqbot] @tencent-connect/qqbot-connector 未安装,无法扫码绑定');
60
+ console.error('[im-qqbot] 请通过环境变量配置:');
61
+ console.error(' export QQBOT_APPID="你的AppID"');
62
+ console.error(' export QQBOT_SECRET="你的AppSecret"');
63
+ }
64
+ else {
65
+ console.error(`[im-qqbot] 扫码绑定失败: ${msg}`);
66
+ }
67
+ return null;
68
+ }
69
+ }
70
+ /**
71
+ * 将凭据写入 dsh profile 的 cordis.patch.yml
72
+ *
73
+ * 行级编辑(不再整文件 YAML 解析)——cordis.patch.yml 常含宿主 `!!js` 自定义标签,
74
+ * js-yaml 无法解析会抛错导致自动保存失败(实测线上文件即因此走到手动引导)。
75
+ * 只定位/更新顶层 `- id: im-qqbot` 条目块中的 appId/appSecret 行,
76
+ * 文件其它内容(含 !!js、其它实例、insert 包装)原样保留。文件不存在时安全重建。
77
+ */
78
+ export function persistCredentialsToProfile(credentials, profileDir, logger) {
79
+ const log = logger ?? console;
80
+ const dir = profileDir;
81
+ if (!dir) {
82
+ // 开发模式:插件从源码加载、不在 node_modules 下,无法定位 profile 目录
83
+ printEnvInstructions(credentials);
84
+ return false;
85
+ }
86
+ const patchPath = resolve(dir, 'cordis.patch.yml');
87
+ try {
88
+ // 1. 读原文(可能含 !!js 等宿主标签, 绝不做整文件 YAML 解析)
89
+ let text = '';
90
+ if (existsSync(patchPath))
91
+ text = readFileSync(patchPath, 'utf8');
92
+ const eol = text.includes('\r\n') ? '\r\n' : '\n';
93
+ const lines = text.length ? text.split(/\r\n|\n/) : [];
94
+ const yq = (v) => {
95
+ // YAML 值引号化: 纯安全字符可不加引号; 否则单引号包裹(内部单引号翻倍)
96
+ return /^[A-Za-z0-9_./:\-]+$/.test(v) ? v : `'${v.replace(/'/g, "''")}'`;
97
+ };
98
+ // 顶层条目行 "- id: im-qqbot"(允许引号包裹的 id)
99
+ const HEAD_RE = /^-\s*id:\s*['"]?im-qqbot['"]?\s*$/;
100
+ const headIdx = lines.findIndex((l) => HEAD_RE.test(l));
101
+ let outLines;
102
+ if (headIdx >= 0) {
103
+ // 2a. 已有 im-qqbot 顶层块: 块结束 = 下一个"顶格 - "条目行(或文件尾)
104
+ let blockEnd = lines.length;
105
+ for (let i = headIdx + 1; i < lines.length; i++) {
106
+ const li = lines[i];
107
+ if (/^\s*-\s/.test(li) && !/^\s+/.test(li)) {
108
+ blockEnd = i;
109
+ break;
110
+ }
111
+ }
112
+ const block = lines.slice(headIdx, blockEnd);
113
+ // config 字段缩进: 找块内 `config:` 行缩进; 默认 2
114
+ let cfgIndent = 2;
115
+ const cfgLine = block.findIndex((l) => /^\s*config:\s*$/.test(l));
116
+ if (cfgLine >= 0) {
117
+ cfgIndent = (block[cfgLine].match(/^\s*/) ?? [''])[0].length;
118
+ }
119
+ const valIndent = cfgIndent + 2;
120
+ const upsertKey = (key, value, arr) => {
121
+ const re = new RegExp(`^(\\s*)${key}:\\s*.*$`);
122
+ const hit = arr.findIndex((l) => re.test(l));
123
+ if (hit >= 0) {
124
+ const indent = (arr[hit].match(/^\s*/) ?? [''])[0];
125
+ arr[hit] = `${indent}${key}: ${yq(value)}`;
126
+ return arr;
127
+ }
128
+ // 无该键: config: 行后插入; 无 config: 则在 id 行后补 config + 键
129
+ const insertAt = cfgLine >= 0 ? cfgLine + 1 : 1;
130
+ const pad = ' '.repeat(valIndent);
131
+ if (cfgLine < 0) {
132
+ arr.splice(1, 0, ' '.repeat(cfgIndent) + 'config:', `${pad}${key}: ${yq(value)}`);
133
+ }
134
+ else {
135
+ // 找同 key 族(appId 先于 appSecret 落位; 插入到已有 appId/其它 config 键之前保持整洁)
136
+ arr.splice(insertAt, 0, `${pad}${key}: ${yq(value)}`);
137
+ }
138
+ return arr;
139
+ };
140
+ const nb = upsertKey('appId', credentials.appId, block.slice());
141
+ upsertKey('appSecret', credentials.appSecret, nb);
142
+ outLines = lines.slice(0, headIdx).concat(nb, lines.slice(blockEnd));
143
+ }
144
+ else {
145
+ // 2b. 没有 im-qqbot 顶层块: 文件末尾追加新条目(顶格 "- id:" 形态; 保留原有内容)
146
+ const tail = lines.slice();
147
+ while (tail.length > 0 && tail[tail.length - 1] === '')
148
+ tail.pop();
149
+ outLines = tail.concat([
150
+ '',
151
+ '# QQ Bot 凭据(扫码绑定自动生成)',
152
+ '- id: im-qqbot',
153
+ ' config:',
154
+ ` appId: ${yq(credentials.appId)}`,
155
+ ` appSecret: ${yq(credentials.appSecret)}`,
156
+ ]);
157
+ }
158
+ mkdirSync(dir, { recursive: true });
159
+ const finalText = (outLines.join(eol)).replace(/\n{3,}/g, '\n\n').trimEnd() + eol;
160
+ writeFileSync(patchPath, finalText, 'utf8');
161
+ log.info(`✔ 凭据已写入: ${patchPath}`);
162
+ log.info(` 下次启动将自动使用保存的凭据`);
163
+ return true;
164
+ }
165
+ catch (err) {
166
+ log.warn(`写入配置失败: ${err instanceof Error ? err.message : String(err)}`);
167
+ printYamlInstructions(credentials, patchPath);
168
+ return false;
169
+ }
170
+ }
171
+ /** 开发模式引导:未定位到 profile 目录,引导用环境变量配置(console.log 确保可见) */
172
+ function printEnvInstructions(credentials) {
173
+ console.log('未检测到 profile 目录(开发模式),请通过环境变量配置凭据:');
174
+ if (process.platform === 'win32') {
175
+ // CMD 语法
176
+ console.log(` set QQBOT_APPID=${credentials.appId}`);
177
+ console.log(` set QQBOT_SECRET=${credentials.appSecret}`);
178
+ // PowerShell 语法(dsh 默认 shell 是 pwsh)
179
+ console.log('PowerShell 用户请用:');
180
+ console.log(` $env:QQBOT_APPID="${credentials.appId}"`);
181
+ console.log(` $env:QQBOT_SECRET="${credentials.appSecret}"`);
182
+ }
183
+ else {
184
+ console.log(` export QQBOT_APPID="${credentials.appId}"`);
185
+ console.log(` export QQBOT_SECRET="${credentials.appSecret}"`);
186
+ }
187
+ }
188
+ /** 正式安装引导:自动写入失败,引导手动在 cordis.patch.yml 配置(console.log 确保可见) */
189
+ function printYamlInstructions(credentials, patchPath) {
190
+ console.log('无法自动保存凭据,请手动打开以下文件添加配置:');
191
+ console.log(` ${patchPath}`);
192
+ console.log('');
193
+ console.log(' - id: im-qqbot');
194
+ console.log(' config:');
195
+ console.log(` appId: "${credentials.appId}"`);
196
+ console.log(` appSecret: "${credentials.appSecret}"`);
197
+ }
198
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * 共享工具层
3
+ */
4
+ export { getProfileDir, resolveEnv, formatRelativeTime, buildUserAgent } from './utils.js';
5
+ export { getScopePeer } from './scope.js';
6
+ export { sendMarkdownChunked } from './send-helper.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * 共享工具层
3
+ */
4
+ export { getProfileDir, resolveEnv, formatRelativeTime, buildUserAgent } from './utils.js';
5
+ export { getScopePeer } from './scope.js';
6
+ export { sendMarkdownChunked } from './send-helper.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * scope 提取工具
3
+ *
4
+ * 从 SDK 命令上下文中提取 scope + peerId。
5
+ */
6
+ import type { SlashCommandHandlerContext } from '@tencent-connect/qqbot-nodejs';
7
+ /**
8
+ * 从命令上下文提取 scope + peerId
9
+ */
10
+ export declare function getScopePeer(cmdCtx: SlashCommandHandlerContext): {
11
+ scope: 'c2c' | 'group';
12
+ peerId: string;
13
+ };
14
+ //# sourceMappingURL=scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/shared/scope.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAEhF;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,0BAA0B,GAAG;IAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAO3G"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * 从命令上下文提取 scope + peerId
3
+ */
4
+ export function getScopePeer(cmdCtx) {
5
+ const msg = cmdCtx.message;
6
+ const scope = msg.kind === 'group' ? 'group' : 'c2c';
7
+ const peerId = scope === 'group'
8
+ ? (msg.groupOpenid ?? msg.senderId)
9
+ : msg.senderId;
10
+ return { scope, peerId };
11
+ }
12
+ //# sourceMappingURL=scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/shared/scope.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAkC;IAC7D,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC;IAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IACrD,MAAM,MAAM,GAAG,KAAK,KAAK,OAAO;QAC9B,CAAC,CAAC,CAAE,GAA0C,CAAC,WAAqB,IAAI,GAAG,CAAC,QAAQ,CAAC;QACrF,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;IACjB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * 分块发送 markdown 工具
3
+ *
4
+ * 长内容自动按 QQ 消息限制切分后逐条发送。
5
+ */
6
+ import type { SlashCommandHandlerContext } from '@tencent-connect/qqbot-nodejs';
7
+ /**
8
+ * 分块发送 markdown(长内容自动切分)
9
+ */
10
+ export declare function sendMarkdownChunked(cmdCtx: SlashCommandHandlerContext, content: string, chunkLimit: number): Promise<void>;
11
+ //# sourceMappingURL=send-helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-helper.d.ts","sourceRoot":"","sources":["../../src/shared/send-helper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAGhF;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,0BAA0B,EAClC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAOf"}
@@ -0,0 +1,13 @@
1
+ import { chunkMarkdownText } from '../transport/chunker.js';
2
+ /**
3
+ * 分块发送 markdown(长内容自动切分)
4
+ */
5
+ export async function sendMarkdownChunked(cmdCtx, content, chunkLimit) {
6
+ const bot = cmdCtx.bot;
7
+ const replyTarget = cmdCtx.replyTarget;
8
+ const chunks = chunkMarkdownText(content, chunkLimit);
9
+ for (const chunk of chunks) {
10
+ await bot.sendMarkdown(replyTarget, chunk);
11
+ }
12
+ }
13
+ //# sourceMappingURL=send-helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-helper.js","sourceRoot":"","sources":["../../src/shared/send-helper.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAkC,EAClC,OAAe,EACf,UAAkB;IAElB,MAAM,GAAG,GAAI,MAA6C,CAAC,GAA2E,CAAC;IACvI,MAAM,WAAW,GAAI,MAA6C,CAAC,WAAW,CAAC;IAC/E,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACtD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,GAAG,CAAC,YAAY,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * 构造 User-Agent 头
3
+ *
4
+ * 格式: dsh-qqbot/{version} (Node/{nodeVersion}; {platform})
5
+ */
6
+ export declare function buildUserAgent(): string;
7
+ /**
8
+ * 定位当前 dsh profile 目录(装本插件的那个 profile 根,如 …/profiles/web)
9
+ *
10
+ * 探测链(前两级对 pnpm link:/symlink/isolated 等任意安装形态都可靠,不依赖代码文件位置):
11
+ * 0) 环境变量 QQBOT_PROFILE_DIR 显式指定(安装脚本/高级用户);
12
+ * 1) 宿主扫描:遍历 ~/.dsh/profiles/<name>,找到「装着本插件」的 profile
13
+ * (node_modules/<scope>/<name> 存在,或 package.json 的 bundles/dependencies 提及本包名);
14
+ * 2) 兜底:从代码安装路径逐级向上找名为 node_modules 的目录并返回其父目录
15
+ * (仅实体安装/hoisted 布局有效)。
16
+ *
17
+ * @param baseDir - 起始目录,缺省为插件根(可注入便于测试)
18
+ */
19
+ export declare function getProfileDir(baseDir?: string): string | null;
20
+ /**
21
+ * 解析环境变量占位配置
22
+ */
23
+ export declare function resolveEnv(configValue: string, envKey: string): string;
24
+ /**
25
+ * 格式化相对时间
26
+ */
27
+ export declare function formatRelativeTime(ts?: number): string;
28
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/shared/utils.ts"],"names":[],"mappings":"AAuCA;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,MAAoB,GAAG,MAAM,GAAG,IAAI,CAkB1E;AAyCD;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAKtE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAOtD"}