@zhin.js/core 1.3.0 → 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 (159) hide show
  1. package/README.md +60 -5
  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/agent-prompt.d.ts +6 -2
  7. package/lib/agent-prompt.d.ts.map +1 -1
  8. package/lib/built/adapter-process.d.ts +11 -1
  9. package/lib/built/adapter-process.d.ts.map +1 -1
  10. package/lib/built/adapter-process.js +43 -1
  11. package/lib/built/adapter-process.js.map +1 -1
  12. package/lib/built/ai-trigger.d.ts +0 -2
  13. package/lib/built/ai-trigger.d.ts.map +1 -1
  14. package/lib/built/ai-trigger.js +0 -14
  15. package/lib/built/ai-trigger.js.map +1 -1
  16. package/lib/built/command.d.ts +2 -0
  17. package/lib/built/command.d.ts.map +1 -1
  18. package/lib/built/command.js +13 -1
  19. package/lib/built/command.js.map +1 -1
  20. package/lib/built/endpoint-commands.d.ts +4 -0
  21. package/lib/built/endpoint-commands.d.ts.map +1 -0
  22. package/lib/built/endpoint-commands.js +102 -0
  23. package/lib/built/endpoint-commands.js.map +1 -0
  24. package/lib/built/endpoint-lifecycle-service.d.ts +27 -0
  25. package/lib/built/endpoint-lifecycle-service.d.ts.map +1 -0
  26. package/lib/built/endpoint-lifecycle-service.js +219 -0
  27. package/lib/built/endpoint-lifecycle-service.js.map +1 -0
  28. package/lib/built/endpoint-manager.d.ts +35 -0
  29. package/lib/built/endpoint-manager.d.ts.map +1 -0
  30. package/lib/built/endpoint-manager.js +2 -0
  31. package/lib/built/endpoint-manager.js.map +1 -0
  32. package/lib/built/generated-qrcode.d.ts +25 -0
  33. package/lib/built/generated-qrcode.d.ts.map +1 -0
  34. package/lib/built/generated-qrcode.js +46 -0
  35. package/lib/built/generated-qrcode.js.map +1 -0
  36. package/lib/built/html-renderer-loader.d.ts +12 -0
  37. package/lib/built/html-renderer-loader.d.ts.map +1 -0
  38. package/lib/built/html-renderer-loader.js +29 -0
  39. package/lib/built/html-renderer-loader.js.map +1 -0
  40. package/lib/built/html-segment-fallback.d.ts +2 -1
  41. package/lib/built/html-segment-fallback.d.ts.map +1 -1
  42. package/lib/built/html-segment-fallback.js.map +1 -1
  43. package/lib/built/introspection-format.d.ts +11 -0
  44. package/lib/built/introspection-format.d.ts.map +1 -0
  45. package/lib/built/introspection-format.js +28 -0
  46. package/lib/built/introspection-format.js.map +1 -0
  47. package/lib/built/login-assist.d.ts +1 -1
  48. package/lib/built/login-assist.d.ts.map +1 -1
  49. package/lib/built/management-command-guard.d.ts +11 -0
  50. package/lib/built/management-command-guard.d.ts.map +1 -0
  51. package/lib/built/management-command-guard.js +21 -0
  52. package/lib/built/management-command-guard.js.map +1 -0
  53. package/lib/built/message-enrich.d.ts.map +1 -1
  54. package/lib/built/message-enrich.js +5 -7
  55. package/lib/built/message-enrich.js.map +1 -1
  56. package/lib/built/outbound-media-contract.d.ts +23 -0
  57. package/lib/built/outbound-media-contract.d.ts.map +1 -0
  58. package/lib/built/outbound-media-contract.js +11 -0
  59. package/lib/built/outbound-media-contract.js.map +1 -0
  60. package/lib/built/outbound-media-utils.d.ts +10 -0
  61. package/lib/built/outbound-media-utils.d.ts.map +1 -0
  62. package/lib/built/outbound-media-utils.js +63 -0
  63. package/lib/built/outbound-media-utils.js.map +1 -0
  64. package/lib/built/qrcode-segment.d.ts +19 -0
  65. package/lib/built/qrcode-segment.d.ts.map +1 -0
  66. package/lib/built/qrcode-segment.js +79 -0
  67. package/lib/built/qrcode-segment.js.map +1 -0
  68. package/lib/built/rich-segments/adapter-policies.d.ts +10 -0
  69. package/lib/built/rich-segments/adapter-policies.d.ts.map +1 -0
  70. package/lib/built/rich-segments/adapter-policies.js +28 -0
  71. package/lib/built/rich-segments/adapter-policies.js.map +1 -0
  72. package/lib/built/rich-segments/base.d.ts +12 -0
  73. package/lib/built/rich-segments/base.d.ts.map +1 -0
  74. package/lib/built/rich-segments/base.js +25 -0
  75. package/lib/built/rich-segments/base.js.map +1 -0
  76. package/lib/built/rich-segments/builtins.d.ts +5 -0
  77. package/lib/built/rich-segments/builtins.d.ts.map +1 -0
  78. package/lib/built/rich-segments/builtins.js +41 -0
  79. package/lib/built/rich-segments/builtins.js.map +1 -0
  80. package/lib/built/rich-segments/capabilities.d.ts +7 -0
  81. package/lib/built/rich-segments/capabilities.d.ts.map +1 -0
  82. package/lib/built/rich-segments/capabilities.js +40 -0
  83. package/lib/built/rich-segments/capabilities.js.map +1 -0
  84. package/lib/built/rich-segments/html-segment.d.ts +16 -0
  85. package/lib/built/rich-segments/html-segment.d.ts.map +1 -0
  86. package/lib/built/rich-segments/html-segment.js +66 -0
  87. package/lib/built/rich-segments/html-segment.js.map +1 -0
  88. package/lib/built/rich-segments/index.d.ts +14 -0
  89. package/lib/built/rich-segments/index.d.ts.map +1 -0
  90. package/lib/built/rich-segments/index.js +14 -0
  91. package/lib/built/rich-segments/index.js.map +1 -0
  92. package/lib/built/rich-segments/markdown-segment.d.ts +15 -0
  93. package/lib/built/rich-segments/markdown-segment.d.ts.map +1 -0
  94. package/lib/built/rich-segments/markdown-segment.js +62 -0
  95. package/lib/built/rich-segments/markdown-segment.js.map +1 -0
  96. package/lib/built/rich-segments/markdown-to-text.d.ts +4 -0
  97. package/lib/built/rich-segments/markdown-to-text.d.ts.map +1 -0
  98. package/lib/built/rich-segments/markdown-to-text.js +28 -0
  99. package/lib/built/rich-segments/markdown-to-text.js.map +1 -0
  100. package/lib/built/rich-segments/qrcode-segment.d.ts +19 -0
  101. package/lib/built/rich-segments/qrcode-segment.d.ts.map +1 -0
  102. package/lib/built/rich-segments/qrcode-segment.js +74 -0
  103. package/lib/built/rich-segments/qrcode-segment.js.map +1 -0
  104. package/lib/built/rich-segments/registry.d.ts +17 -0
  105. package/lib/built/rich-segments/registry.d.ts.map +1 -0
  106. package/lib/built/rich-segments/registry.js +53 -0
  107. package/lib/built/rich-segments/registry.js.map +1 -0
  108. package/lib/built/rich-segments/resolve.d.ts +6 -0
  109. package/lib/built/rich-segments/resolve.d.ts.map +1 -0
  110. package/lib/built/rich-segments/resolve.js +88 -0
  111. package/lib/built/rich-segments/resolve.js.map +1 -0
  112. package/lib/built/rich-segments/tts-segment.d.ts +14 -0
  113. package/lib/built/rich-segments/tts-segment.d.ts.map +1 -0
  114. package/lib/built/rich-segments/tts-segment.js +52 -0
  115. package/lib/built/rich-segments/tts-segment.js.map +1 -0
  116. package/lib/built/rich-segments/types.d.ts +85 -0
  117. package/lib/built/rich-segments/types.d.ts.map +1 -0
  118. package/lib/built/rich-segments/types.js +18 -0
  119. package/lib/built/rich-segments/types.js.map +1 -0
  120. package/lib/built/schema-endpoint-manager.d.ts +18 -0
  121. package/lib/built/schema-endpoint-manager.d.ts.map +1 -0
  122. package/lib/built/schema-endpoint-manager.js +74 -0
  123. package/lib/built/schema-endpoint-manager.js.map +1 -0
  124. package/lib/built/speech-loader.d.ts +13 -0
  125. package/lib/built/speech-loader.d.ts.map +1 -0
  126. package/lib/built/speech-loader.js +28 -0
  127. package/lib/built/speech-loader.js.map +1 -0
  128. package/lib/host-plugin-registry.d.ts +8 -0
  129. package/lib/host-plugin-registry.d.ts.map +1 -0
  130. package/lib/host-plugin-registry.js +8 -0
  131. package/lib/host-plugin-registry.js.map +1 -0
  132. package/lib/im-session-id.d.ts +26 -0
  133. package/lib/im-session-id.d.ts.map +1 -0
  134. package/lib/im-session-id.js +29 -0
  135. package/lib/im-session-id.js.map +1 -0
  136. package/lib/index.d.ts +36 -21
  137. package/lib/index.d.ts.map +1 -1
  138. package/lib/index.js +37 -28
  139. package/lib/index.js.map +1 -1
  140. package/lib/message.d.ts +8 -0
  141. package/lib/message.d.ts.map +1 -1
  142. package/lib/message.js.map +1 -1
  143. package/lib/plugin-context.d.ts +12 -1
  144. package/lib/plugin-context.d.ts.map +1 -1
  145. package/lib/plugin-context.js +12 -1
  146. package/lib/plugin-context.js.map +1 -1
  147. package/lib/plugin.d.ts +1 -0
  148. package/lib/plugin.d.ts.map +1 -1
  149. package/lib/plugin.js +8 -16
  150. package/lib/plugin.js.map +1 -1
  151. package/lib/prompt.js +1 -1
  152. package/lib/prompt.js.map +1 -1
  153. package/lib/types.d.ts +0 -10
  154. package/lib/types.d.ts.map +1 -1
  155. package/lib/utils.d.ts +21 -11
  156. package/lib/utils.d.ts.map +1 -1
  157. package/lib/utils.js +29 -2
  158. package/lib/utils.js.map +1 -1
  159. package/package.json +18 -7
@@ -0,0 +1,102 @@
1
+ /**
2
+ * IM Endpoint 管理与 /endpoints 内省命令(@zhin.js/core)
3
+ */
4
+ import { Adapter } from '../adapter.js';
5
+ import { MessageCommand } from '../command.js';
6
+ import { rejectUnlessManagementOperator } from './management-command-guard.js';
7
+ import { createEndpointLifecycleService } from './endpoint-lifecycle-service.js';
8
+ import { endpointHelpText, formatEndpointsList } from './introspection-format.js';
9
+ function collectRuntimeEndpoints(root) {
10
+ const rows = [];
11
+ for (const adapterName of root.adapters) {
12
+ const adapter = root.inject(adapterName);
13
+ if (!(adapter instanceof Adapter))
14
+ continue;
15
+ for (const [endpointId, endpoint] of adapter.endpoints.entries()) {
16
+ rows.push({
17
+ adapter: String(adapterName),
18
+ name: endpointId,
19
+ online: !!endpoint.$connected,
20
+ });
21
+ }
22
+ }
23
+ return rows;
24
+ }
25
+ export function registerEndpointManagementCommands(plugin, commandService) {
26
+ const root = plugin.root;
27
+ const disposers = [];
28
+ const service = () => createEndpointLifecycleService(root);
29
+ const guard = (message) => {
30
+ const ai = root.inject('ai');
31
+ return rejectUnlessManagementOperator(message, root, ai?.getTriggerConfig?.());
32
+ };
33
+ const register = (pattern, desc, handler) => {
34
+ const cmd = new MessageCommand(pattern)
35
+ .desc(desc)
36
+ .action(async (message, match) => {
37
+ const denied = guard(message);
38
+ if (denied)
39
+ return denied;
40
+ try {
41
+ return await handler(message, match);
42
+ }
43
+ catch (err) {
44
+ return `❌ ${err instanceof Error ? err.message : String(err)}`;
45
+ }
46
+ });
47
+ commandService.add(cmd, plugin.name);
48
+ disposers.push(() => commandService.remove(cmd));
49
+ };
50
+ register('/endpoint help', 'Endpoint 管理帮助', () => endpointHelpText());
51
+ register('/endpoint add [adapter:word]', '添加 Endpoint', async (message, match) => {
52
+ const adapterKey = typeof match?.params?.adapter === 'string' ? match.params.adapter.trim() : '';
53
+ if (!adapterKey) {
54
+ const list = service().listProvisionableAdapters();
55
+ if (list.length === 0) {
56
+ return '当前没有支持运行时添加的适配器(需 EndpointManager 或 endpointConfigSchema)。';
57
+ }
58
+ return [
59
+ '可用适配器:',
60
+ ...list.map((a) => ` • ${a} — /endpoint add ${a}`),
61
+ ].join('\n');
62
+ }
63
+ const result = await service().add(adapterKey, message);
64
+ return result.message;
65
+ });
66
+ register('/endpoint remove <adapter:word> <name:word>', '从配置移除 Endpoint', async (_message, match) => {
67
+ const adapterKey = String(match?.params?.adapter ?? '');
68
+ const name = String(match?.params?.name ?? '');
69
+ const result = await service().remove(adapterKey, name);
70
+ return result.message;
71
+ });
72
+ register('/endpoint edit <adapter:word> <name:word>', '编辑 Endpoint 配置', async (message, match) => {
73
+ const adapterKey = String(match?.params?.adapter ?? '');
74
+ const name = String(match?.params?.name ?? '');
75
+ const result = await service().edit(adapterKey, name, message);
76
+ return result.message;
77
+ });
78
+ register('/endpoint start <adapter:word> <name:word>', '连接 Endpoint', async (message, match) => {
79
+ const adapterKey = String(match?.params?.adapter ?? '');
80
+ const name = String(match?.params?.name ?? '');
81
+ const result = await service().start(adapterKey, name, message);
82
+ return result.message;
83
+ });
84
+ register('/endpoint stop <adapter:word> <name:word>', '断开 Endpoint(保留配置)', async (_message, match) => {
85
+ const adapterKey = String(match?.params?.adapter ?? '');
86
+ const name = String(match?.params?.name ?? '');
87
+ const result = await service().stop(adapterKey, name);
88
+ return result.message;
89
+ });
90
+ register('/endpoint cancel', '取消进行中的 Endpoint 添加/绑定', () => {
91
+ if (!service().cancelProvision()) {
92
+ return '当前没有进行中的 Endpoint 绑定流程。';
93
+ }
94
+ return '已取消 Endpoint 绑定流程。';
95
+ });
96
+ register('/endpoints', '列出各适配器下的 Endpoint 及在线状态', () => formatEndpointsList(collectRuntimeEndpoints(root)));
97
+ return () => {
98
+ for (const d of disposers)
99
+ d();
100
+ };
101
+ }
102
+ //# sourceMappingURL=endpoint-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint-commands.js","sourceRoot":"","sources":["../../src/built/endpoint-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { Adapter } from '../adapter.js';
2
+ import type { Endpoint } from '../endpoint.js';
3
+ import type { Message } from '../message.js';
4
+ import type { Plugin } from '../plugin.js';
5
+ import type { EndpointConfigRecord, EndpointManager } from './endpoint-manager.js';
6
+ export interface EndpointLifecycleResult {
7
+ message: string;
8
+ config?: EndpointConfigRecord;
9
+ }
10
+ export declare class EndpointLifecycleService {
11
+ private readonly root;
12
+ constructor(root: Plugin);
13
+ resolveAdapter(adapterKey: string): Adapter;
14
+ resolveManager(adapterKey: string): EndpointManager;
15
+ listProvisionableAdapters(): string[];
16
+ persistEndpoints(endpoints: EndpointConfigRecord[]): Promise<void>;
17
+ connectConfig(adapter: Adapter, config: EndpointConfigRecord): Promise<Endpoint>;
18
+ disconnectRuntime(adapter: Adapter, name: string): Promise<boolean>;
19
+ add(adapterKey: string, message: Message, initialReply?: string): Promise<EndpointLifecycleResult>;
20
+ edit(adapterKey: string, name: string, message: Message): Promise<EndpointLifecycleResult>;
21
+ remove(adapterKey: string, name: string): Promise<EndpointLifecycleResult>;
22
+ start(adapterKey: string, name: string, message: Message): Promise<EndpointLifecycleResult>;
23
+ stop(adapterKey: string, name: string): Promise<EndpointLifecycleResult>;
24
+ cancelProvision(): boolean;
25
+ }
26
+ export declare function createEndpointLifecycleService(root: Plugin): EndpointLifecycleService;
27
+ //# sourceMappingURL=endpoint-lifecycle-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint-lifecycle-service.d.ts","sourceRoot":"","sources":["../../src/built/endpoint-lifecycle-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C,OAAO,KAAK,EACV,oBAAoB,EACpB,eAAe,EAEhB,MAAM,uBAAuB,CAAC;AAG/B,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,oBAAoB,CAAC;CAC/B;AAkDD,qBAAa,wBAAwB;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,MAAM;IAEzC,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAQ3C,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe;IAWnD,yBAAyB,IAAI,MAAM,EAAE;IAW/B,gBAAgB,CAAC,SAAS,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAOlE,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAchF,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUnE,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAqClG,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAmC1F,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAqB1E,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAmB3F,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAW9E,eAAe,IAAI,OAAO;CAS3B;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,GAAG,wBAAwB,CAErF"}
@@ -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":"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"}
@@ -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