@zhin.js/core 1.3.1 → 1.3.2

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 (135) hide show
  1. package/README.md +59 -4
  2. package/lib/adapter.d.ts +19 -1
  3. package/lib/adapter.d.ts.map +1 -1
  4. package/lib/adapter.js +39 -5
  5. package/lib/adapter.js.map +1 -1
  6. package/lib/built/adapter-process.d.ts +11 -1
  7. package/lib/built/adapter-process.d.ts.map +1 -1
  8. package/lib/built/adapter-process.js +43 -1
  9. package/lib/built/adapter-process.js.map +1 -1
  10. package/lib/built/command.d.ts +2 -0
  11. package/lib/built/command.d.ts.map +1 -1
  12. package/lib/built/command.js +13 -1
  13. package/lib/built/command.js.map +1 -1
  14. package/lib/built/endpoint-commands.d.ts +4 -0
  15. package/lib/built/endpoint-commands.d.ts.map +1 -0
  16. package/lib/built/endpoint-commands.js +102 -0
  17. package/lib/built/endpoint-commands.js.map +1 -0
  18. package/lib/built/endpoint-lifecycle-service.d.ts +27 -0
  19. package/lib/built/endpoint-lifecycle-service.d.ts.map +1 -0
  20. package/lib/built/endpoint-lifecycle-service.js +219 -0
  21. package/lib/built/endpoint-lifecycle-service.js.map +1 -0
  22. package/lib/built/endpoint-manager.d.ts +35 -0
  23. package/lib/built/endpoint-manager.d.ts.map +1 -0
  24. package/lib/built/endpoint-manager.js +2 -0
  25. package/lib/built/endpoint-manager.js.map +1 -0
  26. package/lib/built/generated-qrcode.d.ts +25 -0
  27. package/lib/built/generated-qrcode.d.ts.map +1 -0
  28. package/lib/built/generated-qrcode.js +46 -0
  29. package/lib/built/generated-qrcode.js.map +1 -0
  30. package/lib/built/html-renderer-loader.d.ts +12 -0
  31. package/lib/built/html-renderer-loader.d.ts.map +1 -0
  32. package/lib/built/html-renderer-loader.js +29 -0
  33. package/lib/built/html-renderer-loader.js.map +1 -0
  34. package/lib/built/html-segment-fallback.d.ts +2 -1
  35. package/lib/built/html-segment-fallback.d.ts.map +1 -1
  36. package/lib/built/html-segment-fallback.js.map +1 -1
  37. package/lib/built/introspection-format.d.ts +11 -0
  38. package/lib/built/introspection-format.d.ts.map +1 -0
  39. package/lib/built/introspection-format.js +28 -0
  40. package/lib/built/introspection-format.js.map +1 -0
  41. package/lib/built/login-assist.d.ts +1 -1
  42. package/lib/built/login-assist.d.ts.map +1 -1
  43. package/lib/built/management-command-guard.d.ts +11 -0
  44. package/lib/built/management-command-guard.d.ts.map +1 -0
  45. package/lib/built/management-command-guard.js +21 -0
  46. package/lib/built/management-command-guard.js.map +1 -0
  47. package/lib/built/outbound-media-contract.d.ts +23 -0
  48. package/lib/built/outbound-media-contract.d.ts.map +1 -0
  49. package/lib/built/outbound-media-contract.js +11 -0
  50. package/lib/built/outbound-media-contract.js.map +1 -0
  51. package/lib/built/outbound-media-utils.d.ts +10 -0
  52. package/lib/built/outbound-media-utils.d.ts.map +1 -0
  53. package/lib/built/outbound-media-utils.js +63 -0
  54. package/lib/built/outbound-media-utils.js.map +1 -0
  55. package/lib/built/qrcode-segment.d.ts +19 -0
  56. package/lib/built/qrcode-segment.d.ts.map +1 -0
  57. package/lib/built/qrcode-segment.js +79 -0
  58. package/lib/built/qrcode-segment.js.map +1 -0
  59. package/lib/built/rich-segments/adapter-policies.d.ts +10 -0
  60. package/lib/built/rich-segments/adapter-policies.d.ts.map +1 -0
  61. package/lib/built/rich-segments/adapter-policies.js +28 -0
  62. package/lib/built/rich-segments/adapter-policies.js.map +1 -0
  63. package/lib/built/rich-segments/base.d.ts +12 -0
  64. package/lib/built/rich-segments/base.d.ts.map +1 -0
  65. package/lib/built/rich-segments/base.js +25 -0
  66. package/lib/built/rich-segments/base.js.map +1 -0
  67. package/lib/built/rich-segments/builtins.d.ts +5 -0
  68. package/lib/built/rich-segments/builtins.d.ts.map +1 -0
  69. package/lib/built/rich-segments/builtins.js +41 -0
  70. package/lib/built/rich-segments/builtins.js.map +1 -0
  71. package/lib/built/rich-segments/capabilities.d.ts +7 -0
  72. package/lib/built/rich-segments/capabilities.d.ts.map +1 -0
  73. package/lib/built/rich-segments/capabilities.js +40 -0
  74. package/lib/built/rich-segments/capabilities.js.map +1 -0
  75. package/lib/built/rich-segments/html-segment.d.ts +16 -0
  76. package/lib/built/rich-segments/html-segment.d.ts.map +1 -0
  77. package/lib/built/rich-segments/html-segment.js +66 -0
  78. package/lib/built/rich-segments/html-segment.js.map +1 -0
  79. package/lib/built/rich-segments/index.d.ts +14 -0
  80. package/lib/built/rich-segments/index.d.ts.map +1 -0
  81. package/lib/built/rich-segments/index.js +14 -0
  82. package/lib/built/rich-segments/index.js.map +1 -0
  83. package/lib/built/rich-segments/markdown-segment.d.ts +15 -0
  84. package/lib/built/rich-segments/markdown-segment.d.ts.map +1 -0
  85. package/lib/built/rich-segments/markdown-segment.js +62 -0
  86. package/lib/built/rich-segments/markdown-segment.js.map +1 -0
  87. package/lib/built/rich-segments/markdown-to-text.d.ts +4 -0
  88. package/lib/built/rich-segments/markdown-to-text.d.ts.map +1 -0
  89. package/lib/built/rich-segments/markdown-to-text.js +28 -0
  90. package/lib/built/rich-segments/markdown-to-text.js.map +1 -0
  91. package/lib/built/rich-segments/qrcode-segment.d.ts +19 -0
  92. package/lib/built/rich-segments/qrcode-segment.d.ts.map +1 -0
  93. package/lib/built/rich-segments/qrcode-segment.js +74 -0
  94. package/lib/built/rich-segments/qrcode-segment.js.map +1 -0
  95. package/lib/built/rich-segments/registry.d.ts +17 -0
  96. package/lib/built/rich-segments/registry.d.ts.map +1 -0
  97. package/lib/built/rich-segments/registry.js +53 -0
  98. package/lib/built/rich-segments/registry.js.map +1 -0
  99. package/lib/built/rich-segments/resolve.d.ts +6 -0
  100. package/lib/built/rich-segments/resolve.d.ts.map +1 -0
  101. package/lib/built/rich-segments/resolve.js +88 -0
  102. package/lib/built/rich-segments/resolve.js.map +1 -0
  103. package/lib/built/rich-segments/tts-segment.d.ts +14 -0
  104. package/lib/built/rich-segments/tts-segment.d.ts.map +1 -0
  105. package/lib/built/rich-segments/tts-segment.js +52 -0
  106. package/lib/built/rich-segments/tts-segment.js.map +1 -0
  107. package/lib/built/rich-segments/types.d.ts +85 -0
  108. package/lib/built/rich-segments/types.d.ts.map +1 -0
  109. package/lib/built/rich-segments/types.js +18 -0
  110. package/lib/built/rich-segments/types.js.map +1 -0
  111. package/lib/built/schema-endpoint-manager.d.ts +18 -0
  112. package/lib/built/schema-endpoint-manager.d.ts.map +1 -0
  113. package/lib/built/schema-endpoint-manager.js +74 -0
  114. package/lib/built/schema-endpoint-manager.js.map +1 -0
  115. package/lib/built/speech-loader.d.ts +13 -0
  116. package/lib/built/speech-loader.d.ts.map +1 -0
  117. package/lib/built/speech-loader.js +28 -0
  118. package/lib/built/speech-loader.js.map +1 -0
  119. package/lib/index.d.ts +14 -0
  120. package/lib/index.d.ts.map +1 -1
  121. package/lib/index.js +13 -0
  122. package/lib/index.js.map +1 -1
  123. package/lib/message.d.ts +8 -0
  124. package/lib/message.d.ts.map +1 -1
  125. package/lib/message.js.map +1 -1
  126. package/lib/plugin.d.ts.map +1 -1
  127. package/lib/plugin.js +3 -16
  128. package/lib/plugin.js.map +1 -1
  129. package/lib/prompt.js +1 -1
  130. package/lib/prompt.js.map +1 -1
  131. package/lib/utils.d.ts +21 -11
  132. package/lib/utils.d.ts.map +1 -1
  133. package/lib/utils.js +29 -2
  134. package/lib/utils.js.map +1 -1
  135. package/package.json +8 -6
@@ -0,0 +1,219 @@
1
+ import { Adapter } from '../adapter.js';
2
+ import { segment } from '../utils.js';
3
+ import { connectEndpointInstance, disconnectEndpointInstance } from './connect-endpoint-instance.js';
4
+ import { adapterSupportsProvision, resolveEndpointManager } from './schema-endpoint-manager.js';
5
+ function getConfigService(root) {
6
+ const configService = root.inject('config');
7
+ if (!configService?.primaryFile) {
8
+ throw new Error('配置服务不可用');
9
+ }
10
+ const loader = configService.configs.get(configService.primaryFile);
11
+ if (!loader) {
12
+ throw new Error('配置文件未加载');
13
+ }
14
+ return configService;
15
+ }
16
+ function readAllEndpoints(root) {
17
+ const configService = getConfigService(root);
18
+ const raw = configService.getRaw(configService.primaryFile);
19
+ return [...(raw?.endpoints ?? [])];
20
+ }
21
+ function assertUniqueName(endpoints, context, name, replaceIndex) {
22
+ const conflict = endpoints.findIndex((e) => e.context === context && e.name === name);
23
+ if (conflict >= 0 && conflict !== replaceIndex) {
24
+ throw new Error(`zhin.config 中已存在 ${context}/${name}`);
25
+ }
26
+ }
27
+ function buildProvisionContext(root, message) {
28
+ return {
29
+ message,
30
+ root,
31
+ onStatusUpdate: async (status, extra) => {
32
+ if (message.$reply) {
33
+ let content = status;
34
+ if (extra?.qrcode && typeof extra.qrcode === 'string') {
35
+ content = [segment.qrcode(extra.qrcode), segment.text(status)];
36
+ }
37
+ await message.$reply(content);
38
+ }
39
+ },
40
+ };
41
+ }
42
+ export class EndpointLifecycleService {
43
+ root;
44
+ constructor(root) {
45
+ this.root = root;
46
+ }
47
+ resolveAdapter(adapterKey) {
48
+ const adapter = this.root.inject(adapterKey);
49
+ if (!(adapter instanceof Adapter)) {
50
+ throw new Error(`适配器 ${adapterKey} 未安装或未就绪`);
51
+ }
52
+ return adapter;
53
+ }
54
+ resolveManager(adapterKey) {
55
+ const adapter = this.resolveAdapter(adapterKey);
56
+ const manager = resolveEndpointManager(adapter);
57
+ if (!manager) {
58
+ throw new Error(`适配器 ${adapterKey} 不支持运行时 Endpoint 管理(无 EndpointManager 且未声明 endpointConfigSchema)`);
59
+ }
60
+ return manager;
61
+ }
62
+ listProvisionableAdapters() {
63
+ return this.root.adapters.filter((name) => {
64
+ try {
65
+ const adapter = this.resolveAdapter(String(name));
66
+ return adapterSupportsProvision(adapter);
67
+ }
68
+ catch {
69
+ return false;
70
+ }
71
+ });
72
+ }
73
+ async persistEndpoints(endpoints) {
74
+ const configService = getConfigService(this.root);
75
+ const loader = configService.configs.get(configService.primaryFile);
76
+ loader.patchKey('endpoints', endpoints);
77
+ loader.load();
78
+ }
79
+ async connectConfig(adapter, config) {
80
+ const name = config.name;
81
+ if (adapter.endpoints.has(name)) {
82
+ throw new Error(`Endpoint ${name} 已在线,请先 /endpoint stop ${String(adapter.name)} ${name}`);
83
+ }
84
+ const endpoint = await connectEndpointInstance({
85
+ plugin: this.root,
86
+ adapter,
87
+ config: config,
88
+ });
89
+ adapter.endpoints.set(endpoint.$id, endpoint);
90
+ return endpoint;
91
+ }
92
+ async disconnectRuntime(adapter, name) {
93
+ const endpoint = adapter.endpoints.get(name);
94
+ if (!endpoint)
95
+ return false;
96
+ if (endpoint.$connected) {
97
+ await disconnectEndpointInstance(this.root, adapter, endpoint);
98
+ }
99
+ adapter.endpoints.delete(name);
100
+ return true;
101
+ }
102
+ async add(adapterKey, message, initialReply) {
103
+ const adapter = this.resolveAdapter(adapterKey);
104
+ const manager = this.resolveManager(adapterKey);
105
+ const ctx = buildProvisionContext(this.root, message);
106
+ const config = await manager.addEndpoint(ctx);
107
+ if (!config.context)
108
+ config.context = adapterKey;
109
+ if (!config.name?.trim()) {
110
+ throw new Error('Endpoint 名称不能为空');
111
+ }
112
+ const endpoints = readAllEndpoints(this.root);
113
+ assertUniqueName(endpoints, config.context, config.name);
114
+ endpoints.push(config);
115
+ await this.persistEndpoints(endpoints);
116
+ try {
117
+ await this.connectConfig(adapter, config);
118
+ }
119
+ catch (err) {
120
+ const needsRestart = adapter.getEndpointNeedsRestart?.() ??
121
+ adapter.constructor.endpointNeedsRestart;
122
+ const hint = needsRestart
123
+ ? '配置已写入,请重启进程后连接。'
124
+ : `配置已写入,可用 /endpoint start ${adapterKey} ${config.name} 重试。`;
125
+ throw new Error(`${err instanceof Error ? err.message : String(err)}(${hint})`);
126
+ }
127
+ const prefix = initialReply ? `${initialReply}\n` : '';
128
+ return {
129
+ message: `${prefix}✅ 已添加并连接 endpoint \`${config.name}\`(${adapterKey}),已写入 zhin.config。`,
130
+ config,
131
+ };
132
+ }
133
+ async edit(adapterKey, name, message) {
134
+ const adapter = this.resolveAdapter(adapterKey);
135
+ const manager = this.resolveManager(adapterKey);
136
+ const endpoints = readAllEndpoints(this.root);
137
+ const index = endpoints.findIndex((e) => e.context === adapterKey && e.name === name);
138
+ if (index < 0) {
139
+ throw new Error(`zhin.config 中不存在 ${adapterKey}/${name}`);
140
+ }
141
+ if (adapter.endpoints.has(name)) {
142
+ await this.disconnectRuntime(adapter, name);
143
+ }
144
+ const ctx = buildProvisionContext(this.root, message);
145
+ const updated = await manager.editEndpoint(name, ctx);
146
+ updated.context = adapterKey;
147
+ updated.name = name;
148
+ endpoints[index] = updated;
149
+ await this.persistEndpoints(endpoints);
150
+ try {
151
+ await this.connectConfig(adapter, updated);
152
+ }
153
+ catch (err) {
154
+ throw new Error(`配置已更新,但连接失败:${err instanceof Error ? err.message : String(err)}。` +
155
+ `可用 /endpoint start ${adapterKey} ${name} 重试。`);
156
+ }
157
+ return {
158
+ message: `✅ 已更新并连接 endpoint \`${name}\`(${adapterKey})。`,
159
+ config: updated,
160
+ };
161
+ }
162
+ async remove(adapterKey, name) {
163
+ const adapter = this.resolveAdapter(adapterKey);
164
+ const manager = this.resolveManager(adapterKey);
165
+ await this.stop(adapterKey, name);
166
+ const ok = await manager.removeEndpoint(name);
167
+ if (!ok) {
168
+ throw new Error(`无法移除 ${adapterKey}/${name}`);
169
+ }
170
+ const endpoints = readAllEndpoints(this.root);
171
+ const next = endpoints.filter((e) => !(e.context === adapterKey && e.name === name));
172
+ if (next.length === endpoints.length) {
173
+ throw new Error(`zhin.config 中不存在 ${adapterKey}/${name}`);
174
+ }
175
+ await this.persistEndpoints(next);
176
+ return { message: `✅ 已从配置移除 endpoint \`${name}\`(${adapterKey})。` };
177
+ }
178
+ async start(adapterKey, name, message) {
179
+ const adapter = this.resolveAdapter(adapterKey);
180
+ const manager = this.resolveManager(adapterKey);
181
+ const endpoints = readAllEndpoints(this.root);
182
+ const config = endpoints.find((e) => e.context === adapterKey && e.name === name);
183
+ if (!config) {
184
+ throw new Error(`zhin.config 中不存在 ${adapterKey}/${name}`);
185
+ }
186
+ if (adapter.endpoints.has(name)) {
187
+ return { message: `Endpoint ${adapterKey}/${name} 已在线。` };
188
+ }
189
+ const ctx = buildProvisionContext(this.root, message);
190
+ await manager.startEndpoint(name, ctx);
191
+ await this.connectConfig(adapter, config);
192
+ return { message: `✅ 已连接 endpoint \`${name}\`(${adapterKey})。`, config };
193
+ }
194
+ async stop(adapterKey, name) {
195
+ const adapter = this.resolveAdapter(adapterKey);
196
+ const manager = this.resolveManager(adapterKey);
197
+ const stopped = await this.disconnectRuntime(adapter, name);
198
+ await manager.stopEndpoint(name);
199
+ if (!stopped) {
200
+ return { message: `Endpoint ${adapterKey}/${name} 当前未在线。` };
201
+ }
202
+ return { message: `✅ 已断开 endpoint \`${name}\`(${adapterKey}),配置仍保留。` };
203
+ }
204
+ cancelProvision() {
205
+ for (const adapterName of this.root.adapters) {
206
+ const adapter = this.root.inject(adapterName);
207
+ if (!(adapter instanceof Adapter))
208
+ continue;
209
+ const manager = resolveEndpointManager(adapter);
210
+ if (manager?.cancelProvision?.())
211
+ return true;
212
+ }
213
+ return false;
214
+ }
215
+ }
216
+ export function createEndpointLifecycleService(root) {
217
+ return new EndpointLifecycleService(root);
218
+ }
219
+ //# sourceMappingURL=endpoint-lifecycle-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint-lifecycle-service.js","sourceRoot":"","sources":["../../src/built/endpoint-lifecycle-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAIxC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAMrG,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAOhG,SAAS,gBAAgB,CAAC,IAAY;IACpC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAA8B,CAAC;IACzE,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IACpE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAyC,aAAa,CAAC,WAAW,CAAC,CAAC;IACpG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,gBAAgB,CACvB,SAAiC,EACjC,OAAe,EACf,IAAY,EACZ,YAAqB;IAErB,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAClC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAChD,CAAC;IACF,IAAI,QAAQ,IAAI,CAAC,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY,EAAE,OAAgB;IAC3D,OAAO;QACL,OAAO;QACP,IAAI;QACJ,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;YACtC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,IAAI,OAAO,GAAgB,MAAM,CAAC;gBAClC,IAAI,KAAK,EAAE,MAAM,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACtD,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;gBACjE,CAAC;gBACD,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,wBAAwB;IACN;IAA7B,YAA6B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;IAE7C,cAAc,CAAC,UAAkB;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC7C,IAAI,CAAC,CAAC,OAAO,YAAY,OAAO,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,OAAO,UAAU,UAAU,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,cAAc,CAAC,UAAkB;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,OAAO,UAAU,kEAAkE,CACpF,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,yBAAyB;QACvB,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YACxC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBAClD,OAAO,wBAAwB,CAAC,OAAO,CAAC,CAAC;YAC3C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,SAAiC;QACtD,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,WAAW,CAAE,CAAC;QACrE,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,EAAE,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAgB,EAAE,MAA4B;QAChE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,IAAI,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,0BAA0B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAAC;YAC7C,MAAM,EAAE,IAAI,CAAC,IAAI;YACjB,OAAO;YACP,MAAM,EAAE,MAAiC;SAC1C,CAAC,CAAC;QACH,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAiB,CAAC,CAAC;QACvD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,OAAgB,EAAE,IAAY;QACpD,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC5B,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YACxB,MAAM,0BAA0B,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,UAAkB,EAAE,OAAgB,EAAE,YAAqB;QACnE,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,qBAAqB,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAEtD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,CAAC,OAAO,GAAG,UAAU,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACrC,CAAC;QAED,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACzD,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAEvC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,YAAY,GAAG,OAAO,CAAC,uBAAuB,EAAE,EAAE;gBACrD,OAAO,CAAC,WAAmE,CAAC,oBAAoB,CAAC;YACpG,MAAM,IAAI,GAAG,YAAY;gBACvB,CAAC,CAAC,iBAAiB;gBACnB,CAAC,CAAC,4BAA4B,UAAU,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC;YAChE,MAAM,IAAI,KAAK,CACb,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAC/D,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,OAAO;YACL,OAAO,EACL,GAAG,MAAM,uBAAuB,MAAM,CAAC,IAAI,MAAM,UAAU,oBAAoB;YACjF,MAAM;SACP,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,UAAkB,EAAE,IAAY,EAAE,OAAgB;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACtF,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,oBAAoB,UAAU,IAAI,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,GAAG,GAAG,qBAAqB,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACtD,OAAO,CAAC,OAAO,GAAG,UAAU,CAAC;QAC7B,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QACpB,SAAS,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;QAC3B,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAEvC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,eAAe,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG;gBAChE,sBAAsB,UAAU,IAAI,IAAI,MAAM,CACjD,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,uBAAuB,IAAI,MAAM,UAAU,IAAI;YACxD,MAAM,EAAE,OAAO;SAChB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,UAAkB,EAAE,IAAY;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAEhD,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAElC,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,QAAQ,UAAU,IAAI,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC;QACrF,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,oBAAoB,UAAU,IAAI,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAElC,OAAO,EAAE,OAAO,EAAE,uBAAuB,IAAI,MAAM,UAAU,IAAI,EAAE,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,UAAkB,EAAE,IAAY,EAAE,OAAgB;QAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAClF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,oBAAoB,UAAU,IAAI,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,OAAO,EAAE,OAAO,EAAE,YAAY,UAAU,IAAI,IAAI,OAAO,EAAE,CAAC;QAC5D,CAAC;QAED,MAAM,GAAG,GAAG,qBAAqB,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACvC,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAE1C,OAAO,EAAE,OAAO,EAAE,oBAAoB,IAAI,MAAM,UAAU,IAAI,EAAE,MAAM,EAAE,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,UAAkB,EAAE,IAAY;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC5D,MAAM,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,YAAY,UAAU,IAAI,IAAI,SAAS,EAAE,CAAC;QAC9D,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,oBAAoB,IAAI,MAAM,UAAU,UAAU,EAAE,CAAC;IACzE,CAAC;IAED,eAAe;QACb,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAC9C,IAAI,CAAC,CAAC,OAAO,YAAY,OAAO,CAAC;gBAAE,SAAS;YAC5C,MAAM,OAAO,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;YAChD,IAAI,OAAO,EAAE,eAAe,EAAE,EAAE;gBAAE,OAAO,IAAI,CAAC;QAChD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAED,MAAM,UAAU,8BAA8B,CAAC,IAAY;IACzD,OAAO,IAAI,wBAAwB,CAAC,IAAI,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { Schema } from '@zhin.js/schema';
2
+ import type { Message } from '../message.js';
3
+ import type { Plugin } from '../plugin.js';
4
+ /** zhin.config.endpoints[] 单条记录 */
5
+ export type EndpointConfigRecord = Record<string, unknown> & {
6
+ context: string;
7
+ name: string;
8
+ };
9
+ export type EndpointStatusExtra = Record<string, unknown>;
10
+ export interface ProvisionContext {
11
+ message: Message;
12
+ root: Plugin;
13
+ /** 长连接 / 扫码 / 登录进度回调(由 core 转发到 message.$reply) */
14
+ onStatusUpdate: (status: string, extra?: EndpointStatusExtra) => void | Promise<void>;
15
+ }
16
+ export interface EndpointManager {
17
+ /** 是否支持运行时 add(含 schema 通用或自定义) */
18
+ supportsProvision(): boolean;
19
+ listEndpoints(): EndpointConfigRecord[];
20
+ addEndpoint(ctx: ProvisionContext): Promise<EndpointConfigRecord>;
21
+ editEndpoint(name: string, ctx: ProvisionContext): Promise<EndpointConfigRecord>;
22
+ removeEndpoint(name: string): Promise<boolean>;
23
+ startEndpoint(name: string, ctx: ProvisionContext): Promise<void>;
24
+ stopEndpoint(name: string): Promise<boolean>;
25
+ /** 取消进行中的 add/edit 交互(如 QQ 扫码);无则返回 false */
26
+ cancelProvision?(): boolean;
27
+ }
28
+ export interface EndpointManagerClass {
29
+ new (adapter: import('../adapter.js').Adapter): EndpointManager;
30
+ /** 热连接失败时是否建议重启进程 */
31
+ readonly needsRestart?: boolean;
32
+ /** 通用 schema 驱动 add/edit 时使用 */
33
+ readonly endpointConfigSchema?: Schema;
34
+ }
35
+ //# sourceMappingURL=endpoint-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint-manager.d.ts","sourceRoot":"","sources":["../../src/built/endpoint-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,mCAAmC;AACnC,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,mBAAmB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvF;AAED,MAAM,WAAW,eAAe;IAC9B,mCAAmC;IACnC,iBAAiB,IAAI,OAAO,CAAC;IAC7B,aAAa,IAAI,oBAAoB,EAAE,CAAC;IACxC,WAAW,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAClE,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACjF,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,6CAA6C;IAC7C,eAAe,CAAC,IAAI,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,OAAO,EAAE,OAAO,eAAe,EAAE,OAAO,GAAG,eAAe,CAAC;IAChE,qBAAqB;IACrB,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,gCAAgC;IAChC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACxC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=endpoint-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint-manager.js","sourceRoot":"","sources":["../../src/built/endpoint-manager.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ export interface GenerateQrCodeOptions {
2
+ width?: number;
3
+ margin?: number;
4
+ errorCorrectionLevel?: 'L' | 'M' | 'Q' | 'H';
5
+ }
6
+ export interface PrintQrCodeTerminalOptions {
7
+ small?: boolean;
8
+ }
9
+ /** 二维码实例:一次 generate,多种输出 */
10
+ export declare class GeneratedQrCode {
11
+ #private;
12
+ private constructor();
13
+ static generate(text: string, options?: GenerateQrCodeOptions): Promise<GeneratedQrCode>;
14
+ /** data URL,含 `data:image/png;base64,...` 前缀 */
15
+ toDataUrl(): string;
16
+ /**
17
+ * encoding === 'base64' → 纯 base64 载荷(无 data: 前缀)
18
+ */
19
+ toString(encoding: 'base64'): string;
20
+ /** 输出 ASCII 二维码到 process.stdout */
21
+ printToTerminal(options?: PrintQrCodeTerminalOptions): Promise<void>;
22
+ }
23
+ /** 便捷别名 */
24
+ export declare const generateQrCode: typeof GeneratedQrCode.generate;
25
+ //# sourceMappingURL=generated-qrcode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generated-qrcode.d.ts","sourceRoot":"","sources":["../../src/built/generated-qrcode.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oBAAoB,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAC9C;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,6BAA6B;AAC7B,qBAAa,eAAe;;IAI1B,OAAO;WAKM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,eAAe,CAAC;IASlG,gDAAgD;IAChD,SAAS,IAAI,MAAM;IAInB;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM;IAWpC,mCAAmC;IAC7B,eAAe,CAAC,OAAO,GAAE,0BAA+B,GAAG,OAAO,CAAC,IAAI,CAAC;CAO/E;AAED,WAAW;AACX,eAAO,MAAM,cAAc,iCAAiD,CAAC"}
@@ -0,0 +1,46 @@
1
+ import QRCode from 'qrcode';
2
+ /** 二维码实例:一次 generate,多种输出 */
3
+ export class GeneratedQrCode {
4
+ #text;
5
+ #dataUrl;
6
+ constructor(text, dataUrl) {
7
+ this.#text = text;
8
+ this.#dataUrl = dataUrl;
9
+ }
10
+ static async generate(text, options = {}) {
11
+ const dataUrl = await QRCode.toDataURL(text, {
12
+ width: options.width ?? 280,
13
+ margin: options.margin ?? 2,
14
+ errorCorrectionLevel: options.errorCorrectionLevel ?? 'M',
15
+ });
16
+ return new GeneratedQrCode(text, dataUrl);
17
+ }
18
+ /** data URL,含 `data:image/png;base64,...` 前缀 */
19
+ toDataUrl() {
20
+ return this.#dataUrl;
21
+ }
22
+ /**
23
+ * encoding === 'base64' → 纯 base64 载荷(无 data: 前缀)
24
+ */
25
+ toString(encoding) {
26
+ if (encoding !== 'base64') {
27
+ throw new Error(`GeneratedQrCode.toString: unsupported encoding "${encoding}"`);
28
+ }
29
+ const prefix = 'data:image/png;base64,';
30
+ if (!this.#dataUrl.startsWith(prefix)) {
31
+ throw new Error('GeneratedQrCode.toString: unexpected data URL format');
32
+ }
33
+ return this.#dataUrl.slice(prefix.length);
34
+ }
35
+ /** 输出 ASCII 二维码到 process.stdout */
36
+ async printToTerminal(options = {}) {
37
+ const terminalText = await QRCode.toString(this.#text, {
38
+ type: 'terminal',
39
+ small: options.small ?? true,
40
+ });
41
+ process.stdout.write(`${terminalText}\n`);
42
+ }
43
+ }
44
+ /** 便捷别名 */
45
+ export const generateQrCode = GeneratedQrCode.generate.bind(GeneratedQrCode);
46
+ //# sourceMappingURL=generated-qrcode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generated-qrcode.js","sourceRoot":"","sources":["../../src/built/generated-qrcode.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAY5B,6BAA6B;AAC7B,MAAM,OAAO,eAAe;IACjB,KAAK,CAAS;IACd,QAAQ,CAAS;IAE1B,YAAoB,IAAY,EAAE,OAAe;QAC/C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,UAAiC,EAAE;QACrE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE;YAC3C,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG;YAC3B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,CAAC;YAC3B,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,IAAI,GAAG;SAC1D,CAAC,CAAC;QACH,OAAO,IAAI,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,gDAAgD;IAChD,SAAS;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,QAAkB;QACzB,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,mDAAmD,QAAQ,GAAG,CAAC,CAAC;QAClF,CAAC;QACD,MAAM,MAAM,GAAG,wBAAwB,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED,mCAAmC;IACnC,KAAK,CAAC,eAAe,CAAC,UAAsC,EAAE;QAC5D,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE;YACrD,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI;SAC7B,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,IAAI,CAAC,CAAC;IAC5C,CAAC;CACF;AAED,WAAW;AACX,MAAM,CAAC,MAAM,cAAc,GAAG,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { HtmlRendererForRichSegment } from './rich-segments/types.js';
2
+ /** 动态 import 时使用的包名(与 @zhin.js/html-renderer package.json 一致) */
3
+ export declare const HTML_RENDERER_PACKAGE = "@zhin.js/html-renderer";
4
+ export interface LoadHtmlRendererOptions {
5
+ getConfig?: () => Record<string, unknown> | undefined;
6
+ warn?: (message: string) => void;
7
+ }
8
+ /** 动态加载 @zhin.js/html-renderer;未安装时 warn 一次并返回 undefined */
9
+ export declare function loadHtmlRenderer(opts?: LoadHtmlRendererOptions): Promise<HtmlRendererForRichSegment | undefined>;
10
+ /** 测试用:重置加载缓存 */
11
+ export declare function resetHtmlRendererLoaderForTests(): void;
12
+ //# sourceMappingURL=html-renderer-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-renderer-loader.d.ts","sourceRoot":"","sources":["../../src/built/html-renderer-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAE3E,iEAAiE;AACjE,eAAO,MAAM,qBAAqB,2BAA2B,CAAC;AAE9D,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACtD,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAKD,4DAA4D;AAC5D,wBAAsB,gBAAgB,CACpC,IAAI,CAAC,EAAE,uBAAuB,GAC7B,OAAO,CAAC,0BAA0B,GAAG,SAAS,CAAC,CAmBjD;AAED,iBAAiB;AACjB,wBAAgB,+BAA+B,IAAI,IAAI,CAGtD"}
@@ -0,0 +1,29 @@
1
+ /** 动态 import 时使用的包名(与 @zhin.js/html-renderer package.json 一致) */
2
+ export const HTML_RENDERER_PACKAGE = '@zhin.js/html-renderer';
3
+ let cached;
4
+ let warned = false;
5
+ /** 动态加载 @zhin.js/html-renderer;未安装时 warn 一次并返回 undefined */
6
+ export async function loadHtmlRenderer(opts) {
7
+ if (cached !== undefined) {
8
+ return cached ?? undefined;
9
+ }
10
+ try {
11
+ const mod = await import(HTML_RENDERER_PACKAGE);
12
+ cached = mod.createHtmlRenderer(opts?.getConfig?.() ?? {});
13
+ return cached;
14
+ }
15
+ catch {
16
+ if (!warned) {
17
+ warned = true;
18
+ opts?.warn?.(`未安装 ${HTML_RENDERER_PACKAGE},html/markdown=>image 已降级为 text。安装: pnpm add ${HTML_RENDERER_PACKAGE}`);
19
+ }
20
+ cached = null;
21
+ return undefined;
22
+ }
23
+ }
24
+ /** 测试用:重置加载缓存 */
25
+ export function resetHtmlRendererLoaderForTests() {
26
+ cached = undefined;
27
+ warned = false;
28
+ }
29
+ //# sourceMappingURL=html-renderer-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-renderer-loader.js","sourceRoot":"","sources":["../../src/built/html-renderer-loader.ts"],"names":[],"mappings":"AAEA,iEAAiE;AACjE,MAAM,CAAC,MAAM,qBAAqB,GAAG,wBAAwB,CAAC;AAO9D,IAAI,MAAqD,CAAC;AAC1D,IAAI,MAAM,GAAG,KAAK,CAAC;AAEnB,4DAA4D;AAC5D,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAA8B;IAE9B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,MAAM,IAAI,SAAS,CAAC;IAC7B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,CAA+B,CAAC;QACzF,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,IAAI,CAAC;YACd,IAAI,EAAE,IAAI,EAAE,CACV,OAAO,qBAAqB,gDAAgD,qBAAqB,EAAE,CACpG,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,IAAI,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,iBAAiB;AACjB,MAAM,UAAU,+BAA+B;IAC7C,MAAM,GAAG,SAAS,CAAC;IACnB,MAAM,GAAG,KAAK,CAAC;AACjB,CAAC"}
@@ -1,5 +1,6 @@
1
1
  /**
2
- * 出站 `html` 消息段兜底:未装 html-renderer 或转图失败时,自动剥离为 text 段。
2
+ * 出站 `html` 消息段兜底:等价于 Adapter policy `html:'text'`。
3
+ * 出站渲染首选 `resolveRichSegments`(renderSendMessage 首步)。
3
4
  */
4
5
  import type { Plugin } from '../plugin.js';
5
6
  import type { SendContent } from '../types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"html-segment-fallback.d.ts","sourceRoot":"","sources":["../../src/built/html-segment-fallback.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAkB,WAAW,EAAe,MAAM,aAAa,CAAC;AAc5E,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,CAkB1E;AAED,mDAAmD;AACnD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,IAAI,CAYtE"}
1
+ {"version":3,"file":"html-segment-fallback.d.ts","sourceRoot":"","sources":["../../src/built/html-segment-fallback.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAkB,WAAW,EAAe,MAAM,aAAa,CAAC;AAc5E,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,CAkB1E;AAED,mDAAmD;AACnD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,IAAI,CAYtE"}
@@ -1 +1 @@
1
- {"version":3,"file":"html-segment-fallback.js","sourceRoot":"","sources":["../../src/built/html-segment-fallback.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,SAAS,OAAO,CAAC,OAAoB;IACnC,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,sBAAsB,CAAC,IAA6B;IAC3D,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IAC5E,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxE,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAoB;IAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAgC,EAAE,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACf,SAAS;QACX,CAAC;QACD,IAAI,IAAI,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,sBAAsB,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YACrD,IAAI,IAAI;gBAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACvC,SAAS;QACX,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9C,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC,CAAC,CAAE,CAAC;IACrC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,2BAA2B,CAAC,MAAc;IACxD,MAAM,OAAO,GAAG,CAAC,OAAoB,EAAe,EAAE;QACpD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,IAAI,OAAO,IAAI,IAAI;YAAE,OAAO,OAAO,CAAC;QACpC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,EAAE,CAAC;YAC7E,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,wBAAwB,CAAC,OAAO,CAAC,EAAE,CAAC;IACpE,CAAC,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;IAC9C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;AAC9D,CAAC"}
1
+ {"version":3,"file":"html-segment-fallback.js","sourceRoot":"","sources":["../../src/built/html-segment-fallback.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,SAAS,OAAO,CAAC,OAAoB;IACnC,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,sBAAsB,CAAC,IAA6B;IAC3D,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IAC5E,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxE,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAoB;IAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAgC,EAAE,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACf,SAAS;QACX,CAAC;QACD,IAAI,IAAI,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,sBAAsB,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YACrD,IAAI,IAAI;gBAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACvC,SAAS;QACX,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9C,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC,CAAC,CAAE,CAAC;IACrC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,2BAA2B,CAAC,MAAc;IACxD,MAAM,OAAO,GAAG,CAAC,OAAoB,EAAe,EAAE;QACpD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,IAAI,OAAO,IAAI,IAAI;YAAE,OAAO,OAAO,CAAC;QACpC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,EAAE,CAAC;YAC7E,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,wBAAwB,CAAC,OAAO,CAAC,EAAE,CAAC;IACpE,CAAC,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;IAC9C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * IM 内省指令格式化(/cmd、/endpoints 等)
3
+ */
4
+ export interface EndpointRow {
5
+ adapter: string;
6
+ name: string;
7
+ online: boolean;
8
+ }
9
+ export declare function formatEndpointsList(endpoints: EndpointRow[]): string;
10
+ export declare function endpointHelpText(): string;
11
+ //# sourceMappingURL=introspection-format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"introspection-format.d.ts","sourceRoot":"","sources":["../../src/built/introspection-format.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,MAAM,CAQpE;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAazC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * IM 内省指令格式化(/cmd、/endpoints 等)
3
+ */
4
+ export function formatEndpointsList(endpoints) {
5
+ if (endpoints.length === 0)
6
+ return '🤖 暂无 Endpoint 实例';
7
+ const lines = ['🤖 Endpoint 列表 (' + endpoints.length + ')', ''];
8
+ for (const b of [...endpoints].sort((a, c) => a.adapter.localeCompare(c.adapter) || a.name.localeCompare(c.name))) {
9
+ const mark = b.online ? '● online' : '○ offline';
10
+ lines.push(` ${mark} ${b.adapter}/${b.name}`);
11
+ }
12
+ return lines.join('\n');
13
+ }
14
+ export function endpointHelpText() {
15
+ return [
16
+ 'Endpoint 运行时管理:',
17
+ '',
18
+ ' /endpoint add [adapter] — 添加 endpoint(adapter 交互或 schema 向导)',
19
+ ' /endpoint remove <adapter> <name>',
20
+ ' /endpoint edit <adapter> <name>',
21
+ ' /endpoint start <adapter> <name>',
22
+ ' /endpoint stop <adapter> <name>',
23
+ ' /endpoint cancel — 取消进行中的添加/绑定',
24
+ ' /endpoint help',
25
+ ' /endpoints — 查看运行时在线状态',
26
+ ].join('\n');
27
+ }
28
+ //# sourceMappingURL=introspection-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"introspection-format.js","sourceRoot":"","sources":["../../src/built/introspection-format.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,UAAU,mBAAmB,CAAC,SAAwB;IAC1D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,mBAAmB,CAAC;IACvD,MAAM,KAAK,GAAG,CAAC,kBAAkB,GAAG,SAAS,CAAC,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC;IAChE,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAClH,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,iBAAiB;QACjB,EAAE;QACF,kEAAkE;QAClE,qCAAqC;QACrC,mCAAmC;QACnC,oCAAoC;QACpC,mCAAmC;QACnC,2CAA2C;QAC3C,kBAAkB;QAClB,yCAAyC;KAC1C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -9,7 +9,7 @@
9
9
  * endpoint.login.pending — 有新待办时触发,payload: PendingLoginTask
10
10
  */
11
11
  import type { Plugin } from '../plugin.js';
12
- export type LoginAssistType = 'qrcode' | 'sms' | 'slider' | 'device' | 'other';
12
+ export type LoginAssistType = 'qrcode' | 'sms' | 'slider' | 'device' | 'auth' | 'other';
13
13
  export interface PendingLoginTaskPayload {
14
14
  /** 说明文案(如「请扫码登录」) */
15
15
  message?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"login-assist.d.ts","sourceRoot":"","sources":["../../src/built/login-assist.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAM3C,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE/E,MAAM,WAAW,uBAAuB;IACtC,qBAAqB;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,aAAa;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,uBAAuB,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB;AAYD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAC3D,OAAO,CAAC,KAAK,CAAK;gBAEN,MAAM,EAAE,MAAM;IAI1B;;OAEG;IACH,YAAY,CACV,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,eAAe,EACrB,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAiB5C;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;IAQpE;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,SAAc,GAAG,OAAO;IAQjD;;OAEG;IACH,WAAW,IAAI,gBAAgB,EAAE;IAIjC,OAAO,IAAI,IAAI;CAMhB;AAMD,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,MAAM,CAAC;QACf,UAAU,QAAQ;YAChB,WAAW,EAAE,WAAW,CAAC;SAC1B;KACF;CACF"}
1
+ {"version":3,"file":"login-assist.d.ts","sourceRoot":"","sources":["../../src/built/login-assist.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAM3C,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAExF,MAAM,WAAW,uBAAuB;IACtC,qBAAqB;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,aAAa;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,uBAAuB,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB;AAYD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAC3D,OAAO,CAAC,KAAK,CAAK;gBAEN,MAAM,EAAE,MAAM;IAI1B;;OAEG;IACH,YAAY,CACV,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,eAAe,EACrB,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAiB5C;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;IAQpE;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,SAAc,GAAG,OAAO;IAQjD;;OAEG;IACH,WAAW,IAAI,gBAAgB,EAAE;IAIjC,OAAO,IAAI,IAAI;CAMhB;AAMD,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,MAAM,CAAC;QACf,UAAU,QAAQ;YAChB,WAAW,EAAE,WAAW,CAAC;SAC1B;KACF;CACF"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * IM 运维 / Endpoint 管理斜杠命令:仅 master 或 trusted 可执行。
3
+ */
4
+ import { resolveSenderRoles, type AITriggerConfig } from './ai-trigger.js';
5
+ import type { Message } from '../message.js';
6
+ import type { Plugin } from '../plugin.js';
7
+ export declare const MANAGEMENT_COMMAND_DENIED = "\u26A0\uFE0F \u8BE5\u547D\u4EE4\u4EC5 Endpoint Owner\uFF08master\uFF09\u6216 trusted \u64CD\u4F5C\u5458\u53EF\u7528\u3002";
8
+ export declare function resolveManagementCommandRoles(message: Message, root: Plugin, triggerConfig?: AITriggerConfig): ReturnType<typeof resolveSenderRoles>['roles'];
9
+ /** 通过返回 null;拒绝返回用户可见提示文案 */
10
+ export declare function rejectUnlessManagementOperator(message: Message, root: Plugin, triggerConfig?: AITriggerConfig): string | null;
11
+ //# sourceMappingURL=management-command-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"management-command-guard.d.ts","sourceRoot":"","sources":["../../src/built/management-command-guard.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAEL,kBAAkB,EAClB,KAAK,eAAe,EACrB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,eAAO,MAAM,yBAAyB,8HACY,CAAC;AAEnD,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,EACZ,aAAa,CAAC,EAAE,eAAe,GAC9B,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,OAAO,CAAC,CAOhD;AAED,6BAA6B;AAC7B,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,EACZ,aAAa,CAAC,EAAE,eAAe,GAC9B,MAAM,GAAG,IAAI,CAMf"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * IM 运维 / Endpoint 管理斜杠命令:仅 master 或 trusted 可执行。
3
+ */
4
+ import { mergeAITriggerConfig, resolveSenderRoles, } from './ai-trigger.js';
5
+ import { hasSenderRole } from './roles.js';
6
+ export const MANAGEMENT_COMMAND_DENIED = '⚠️ 该命令仅 Endpoint Owner(master)或 trusted 操作员可用。';
7
+ export function resolveManagementCommandRoles(message, root, triggerConfig) {
8
+ const cfg = mergeAITriggerConfig(triggerConfig ?? {});
9
+ const adapterInstance = root.inject(message.$adapter);
10
+ const endpointConfig = adapterInstance?.endpoints?.get(message.$endpoint)?.$config;
11
+ return resolveSenderRoles(message, cfg, endpointConfig).roles;
12
+ }
13
+ /** 通过返回 null;拒绝返回用户可见提示文案 */
14
+ export function rejectUnlessManagementOperator(message, root, triggerConfig) {
15
+ const roles = resolveManagementCommandRoles(message, root, triggerConfig);
16
+ if (hasSenderRole(roles, 'trusted')) {
17
+ return null;
18
+ }
19
+ return MANAGEMENT_COMMAND_DENIED;
20
+ }
21
+ //# sourceMappingURL=management-command-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"management-command-guard.js","sourceRoot":"","sources":["../../src/built/management-command-guard.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,oBAAoB,EACpB,kBAAkB,GAEnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAI3C,MAAM,CAAC,MAAM,yBAAyB,GACpC,gDAAgD,CAAC;AAEnD,MAAM,UAAU,6BAA6B,CAC3C,OAAgB,EAChB,IAAY,EACZ,aAA+B;IAE/B,MAAM,GAAG,GAAG,oBAAoB,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;IACtD,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAEvC,CAAC;IACd,MAAM,cAAc,GAAG,eAAe,EAAE,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IACnF,OAAO,kBAAkB,CAAC,OAAO,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC,KAAK,CAAC;AAChE,CAAC;AAED,6BAA6B;AAC7B,MAAM,UAAU,8BAA8B,CAC5C,OAAgB,EAChB,IAAY,EACZ,aAA+B;IAE/B,MAAM,KAAK,GAAG,6BAA6B,CAAC,OAAO,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;IAC1E,IAAI,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,yBAAyB,CAAC;AACnC,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { SendContent } from '../types.js';
2
+ /**
3
+ * 出站两阶段契约(Adapter 实现参考):
4
+ *
5
+ * 1. **resolveRichSegments**(Adapter.renderSendMessage 首步)
6
+ * 语义段(html / tts / qrcode / markdown)→ 标准 IM 段(image / audio / text)
7
+ *
8
+ * 2. **materializeOutboundMedia**(Endpoint.$sendMessage 前,各 adapter 可选)
9
+ * 标准段中的 base64 / 本地路径 → 平台 URL 或上传后的引用
10
+ */
11
+ export interface OutboundMediaUploadContext {
12
+ /** 上传二进制,返回平台可发送的 URL */
13
+ uploadBuffer?(buffer: Buffer, mimeHint?: string): Promise<string>;
14
+ /** 上传本地文件路径 */
15
+ uploadFile?(filePath: string): Promise<string>;
16
+ outboundDir?: string;
17
+ }
18
+ export type OutboundMediaMaterializer = (content: SendContent, ctx: OutboundMediaUploadContext) => Promise<SendContent>;
19
+ /** 契约测试:adapter 须声明 outboundRichSegmentPolicy */
20
+ export declare function assertAdapterDeclaresRichSegmentPolicy(adapterClass: {
21
+ outboundRichSegmentPolicy?: Record<string, string>;
22
+ }): void;
23
+ //# sourceMappingURL=outbound-media-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbound-media-contract.d.ts","sourceRoot":"","sources":["../../src/built/outbound-media-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;;;GAQG;AAEH,MAAM,WAAW,0BAA0B;IACzC,yBAAyB;IACzB,YAAY,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClE,eAAe;IACf,UAAU,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,yBAAyB,GAAG,CACtC,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,0BAA0B,KAC5B,OAAO,CAAC,WAAW,CAAC,CAAC;AAE1B,iDAAiD;AACjD,wBAAgB,sCAAsC,CACpD,YAAY,EAAE;IAAE,yBAAyB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GACnE,IAAI,CAQN"}
@@ -0,0 +1,11 @@
1
+ /** 契约测试:adapter 须声明 outboundRichSegmentPolicy */
2
+ export function assertAdapterDeclaresRichSegmentPolicy(adapterClass) {
3
+ if (!adapterClass.outboundRichSegmentPolicy) {
4
+ throw new Error('Adapter must declare static outboundRichSegmentPolicy');
5
+ }
6
+ const policy = adapterClass.outboundRichSegmentPolicy;
7
+ if (typeof policy !== 'object' || Object.keys(policy).length === 0) {
8
+ throw new Error('outboundRichSegmentPolicy must be a non-empty object');
9
+ }
10
+ }
11
+ //# sourceMappingURL=outbound-media-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbound-media-contract.js","sourceRoot":"","sources":["../../src/built/outbound-media-contract.ts"],"names":[],"mappings":"AAyBA,iDAAiD;AACjD,MAAM,UAAU,sCAAsC,CACpD,YAAoE;IAEpE,IAAI,CAAC,YAAY,CAAC,yBAAyB,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,MAAM,GAAG,YAAY,CAAC,yBAAyB,CAAC;IACtD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { MessageElement, SendContent } from '../types.js';
2
+ export declare function isRemoteUrl(value: string): boolean;
3
+ /** 从 message 段 data 提取 base64 Buffer(data: URL / base64:// / raw base64) */
4
+ export declare function extractBase64Buffer(data: Record<string, unknown>): Buffer | undefined;
5
+ /** 解析本地文件路径(非 http(s) / base64) */
6
+ export declare function resolveLocalMediaPath(data: Record<string, unknown>): string | undefined;
7
+ export declare function asMessageElements(content: SendContent): MessageElement[];
8
+ export declare function isMediaSegmentType(type: string): boolean;
9
+ export declare function collectOutboundMediaKinds(content: SendContent | undefined): string[];
10
+ //# sourceMappingURL=outbound-media-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbound-media-utils.d.ts","sourceRoot":"","sources":["../../src/built/outbound-media-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI/D,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAmBrF;AAED,mCAAmC;AACnC,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAUvF;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,EAAE,CAUxE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,EAAE,CAUpF"}