dsh-connect 0.7.2 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/README.i18n.yaml +2 -2
  2. package/README.md +196 -43
  3. package/README.zh.md +171 -42
  4. package/client/client.js +817 -0
  5. package/client/client.js.map +7 -0
  6. package/client/locale.mjs +227 -0
  7. package/client/panel-state.mjs +54 -0
  8. package/client/settings-client.mjs +389 -0
  9. package/docs/images/settings-advanced-en.png +0 -0
  10. package/docs/images/settings-advanced-zh.png +0 -0
  11. package/docs/images/settings-defaults-en.png +0 -0
  12. package/docs/images/settings-defaults-zh.png +0 -0
  13. package/docs/images/settings-overview-en.png +0 -0
  14. package/docs/images/settings-overview-zh.png +0 -0
  15. package/examples/minimal.config.json +16 -0
  16. package/lib/binding.d.ts.map +1 -1
  17. package/lib/binding.js +2 -2
  18. package/lib/binding.js.map +1 -1
  19. package/lib/channels/dingtalk/adapter.d.ts +59 -0
  20. package/lib/channels/dingtalk/adapter.d.ts.map +1 -0
  21. package/lib/channels/dingtalk/adapter.js +123 -0
  22. package/lib/channels/dingtalk/adapter.js.map +1 -0
  23. package/lib/channels/dingtalk/i18n.d.ts +14 -0
  24. package/lib/channels/dingtalk/i18n.d.ts.map +1 -0
  25. package/lib/channels/dingtalk/i18n.js +16 -0
  26. package/lib/channels/dingtalk/i18n.js.map +1 -0
  27. package/lib/channels/dingtalk/index.d.ts +127 -0
  28. package/lib/channels/dingtalk/index.d.ts.map +1 -0
  29. package/lib/channels/dingtalk/index.js +144 -0
  30. package/lib/channels/dingtalk/index.js.map +1 -0
  31. package/lib/channels/dingtalk/message.d.ts +49 -0
  32. package/lib/channels/dingtalk/message.d.ts.map +1 -0
  33. package/lib/channels/dingtalk/message.js +50 -0
  34. package/lib/channels/dingtalk/message.js.map +1 -0
  35. package/lib/channels/dingtalk/stomp.d.ts +36 -0
  36. package/lib/channels/dingtalk/stomp.d.ts.map +1 -0
  37. package/lib/channels/dingtalk/stomp.js +107 -0
  38. package/lib/channels/dingtalk/stomp.js.map +1 -0
  39. package/lib/channels/dingtalk/stream.d.ts +53 -0
  40. package/lib/channels/dingtalk/stream.d.ts.map +1 -0
  41. package/lib/channels/dingtalk/stream.js +199 -0
  42. package/lib/channels/dingtalk/stream.js.map +1 -0
  43. package/lib/channels/dingtalk/webhook.d.ts +84 -0
  44. package/lib/channels/dingtalk/webhook.d.ts.map +1 -0
  45. package/lib/channels/dingtalk/webhook.js +143 -0
  46. package/lib/channels/dingtalk/webhook.js.map +1 -0
  47. package/lib/channels/feishu/adapter.d.ts +133 -0
  48. package/lib/channels/feishu/adapter.d.ts.map +1 -0
  49. package/lib/channels/feishu/adapter.js +662 -0
  50. package/lib/channels/feishu/adapter.js.map +1 -0
  51. package/lib/channels/feishu/i18n.d.ts +30 -0
  52. package/lib/channels/feishu/i18n.d.ts.map +1 -0
  53. package/lib/channels/feishu/i18n.js +42 -0
  54. package/lib/channels/feishu/i18n.js.map +1 -0
  55. package/lib/channels/feishu/index.d.ts +82 -0
  56. package/lib/channels/feishu/index.d.ts.map +1 -0
  57. package/lib/channels/feishu/index.js +103 -0
  58. package/lib/channels/feishu/index.js.map +1 -0
  59. package/lib/channels/feishu/onboard.d.ts +16 -0
  60. package/lib/channels/feishu/onboard.d.ts.map +1 -0
  61. package/lib/channels/feishu/onboard.js +86 -0
  62. package/lib/channels/feishu/onboard.js.map +1 -0
  63. package/lib/channels/telegram/adapter.d.ts +70 -0
  64. package/lib/channels/telegram/adapter.d.ts.map +1 -0
  65. package/lib/channels/telegram/adapter.js +460 -0
  66. package/lib/channels/telegram/adapter.js.map +1 -0
  67. package/lib/channels/telegram/client.d.ts +115 -0
  68. package/lib/channels/telegram/client.d.ts.map +1 -0
  69. package/lib/channels/telegram/client.js +198 -0
  70. package/lib/channels/telegram/client.js.map +1 -0
  71. package/lib/channels/telegram/i18n.d.ts +14 -0
  72. package/lib/channels/telegram/i18n.d.ts.map +1 -0
  73. package/lib/channels/telegram/i18n.js +18 -0
  74. package/lib/channels/telegram/i18n.js.map +1 -0
  75. package/lib/channels/telegram/index.d.ts +46 -0
  76. package/lib/channels/telegram/index.d.ts.map +1 -0
  77. package/lib/channels/telegram/index.js +54 -0
  78. package/lib/channels/telegram/index.js.map +1 -0
  79. package/lib/channels/web/adapter.d.ts +103 -0
  80. package/lib/channels/web/adapter.d.ts.map +1 -0
  81. package/lib/channels/web/adapter.js +161 -0
  82. package/lib/channels/web/adapter.js.map +1 -0
  83. package/lib/channels/web/index.d.ts +47 -0
  84. package/lib/channels/web/index.d.ts.map +1 -0
  85. package/lib/channels/web/index.js +59 -0
  86. package/lib/channels/web/index.js.map +1 -0
  87. package/lib/chat-key.d.ts +29 -0
  88. package/lib/chat-key.d.ts.map +1 -0
  89. package/lib/chat-key.js +38 -0
  90. package/lib/chat-key.js.map +1 -0
  91. package/lib/index.d.ts +78 -11
  92. package/lib/index.d.ts.map +1 -1
  93. package/lib/index.js +312 -9
  94. package/lib/index.js.map +1 -1
  95. package/lib/runner.d.ts +55 -2
  96. package/lib/runner.d.ts.map +1 -1
  97. package/lib/runner.js +158 -23
  98. package/lib/runner.js.map +1 -1
  99. package/lib/scheduler.d.ts.map +1 -1
  100. package/lib/scheduler.js +2 -2
  101. package/lib/scheduler.js.map +1 -1
  102. package/lib/service.d.ts +17 -1
  103. package/lib/service.d.ts.map +1 -1
  104. package/lib/service.js +47 -3
  105. package/lib/service.js.map +1 -1
  106. package/lib/settings/channel-runtime.d.ts +75 -0
  107. package/lib/settings/channel-runtime.d.ts.map +1 -0
  108. package/lib/settings/channel-runtime.js +165 -0
  109. package/lib/settings/channel-runtime.js.map +1 -0
  110. package/lib/settings/channels.d.ts +62 -0
  111. package/lib/settings/channels.d.ts.map +1 -0
  112. package/lib/settings/channels.js +132 -0
  113. package/lib/settings/channels.js.map +1 -0
  114. package/lib/settings/credential-store.d.ts +85 -0
  115. package/lib/settings/credential-store.d.ts.map +1 -0
  116. package/lib/settings/credential-store.js +142 -0
  117. package/lib/settings/credential-store.js.map +1 -0
  118. package/lib/settings/index.d.ts +14 -0
  119. package/lib/settings/index.d.ts.map +1 -0
  120. package/lib/settings/index.js +14 -0
  121. package/lib/settings/index.js.map +1 -0
  122. package/lib/settings/namespace.d.ts +175 -0
  123. package/lib/settings/namespace.d.ts.map +1 -0
  124. package/lib/settings/namespace.js +200 -0
  125. package/lib/settings/namespace.js.map +1 -0
  126. package/lib/settings/rpc-client.d.ts +36 -0
  127. package/lib/settings/rpc-client.d.ts.map +1 -0
  128. package/lib/settings/rpc-client.js +45 -0
  129. package/lib/settings/rpc-client.js.map +1 -0
  130. package/lib/settings/secret-disclosure.d.ts +50 -0
  131. package/lib/settings/secret-disclosure.d.ts.map +1 -0
  132. package/lib/settings/secret-disclosure.js +132 -0
  133. package/lib/settings/secret-disclosure.js.map +1 -0
  134. package/lib/settings/settings-model.d.ts +124 -0
  135. package/lib/settings/settings-model.d.ts.map +1 -0
  136. package/lib/settings/settings-model.js +118 -0
  137. package/lib/settings/settings-model.js.map +1 -0
  138. package/lib/settings/settings-rpc.d.ts +130 -0
  139. package/lib/settings/settings-rpc.d.ts.map +1 -0
  140. package/lib/settings/settings-rpc.js +233 -0
  141. package/lib/settings/settings-rpc.js.map +1 -0
  142. package/lib/settings/settings-service.d.ts +35 -0
  143. package/lib/settings/settings-service.d.ts.map +1 -0
  144. package/lib/settings/settings-service.js +171 -0
  145. package/lib/settings/settings-service.js.map +1 -0
  146. package/lib/state-dir.d.ts +28 -0
  147. package/lib/state-dir.d.ts.map +1 -0
  148. package/lib/state-dir.js +33 -0
  149. package/lib/state-dir.js.map +1 -0
  150. package/lib/stream.d.ts.map +1 -1
  151. package/lib/stream.js +3 -2
  152. package/lib/stream.js.map +1 -1
  153. package/package.json +56 -12
@@ -0,0 +1,123 @@
1
+ import { DingtalkStreamClient } from "./stream.js";
2
+ import { buildMarkdownReplyBody, buildTextReplyBody, isAtMentioned, normalizeBotMessage, } from "./message.js";
3
+ import { dingtalkMessages } from "./i18n.js";
4
+ const CHOICE_TIMEOUT_MS = 60_000;
5
+ /**
6
+ * Bidirectional DingTalk adapter (stream mode). Deliberately text-forward:
7
+ * no card editing, no button callbacks — just normalized text both ways.
8
+ */
9
+ export class DingtalkStreamAdapter {
10
+ id = "dingtalk";
11
+ client;
12
+ t;
13
+ requireMention;
14
+ handler;
15
+ pendingMenus = new Map();
16
+ constructor(config, logger) {
17
+ this.requireMention = config.requireMention ?? true;
18
+ this.t = dingtalkMessages(config.language ?? "zh");
19
+ this.client = new DingtalkStreamClient({
20
+ clientId: config.clientId,
21
+ clientSecret: config.clientSecret,
22
+ url: config.url,
23
+ logger,
24
+ });
25
+ }
26
+ async start() {
27
+ this.client.onInbound((raw) => {
28
+ void this.dispatch(raw).catch(() => undefined);
29
+ });
30
+ await this.client.connect();
31
+ }
32
+ async stop() {
33
+ this.client.close();
34
+ }
35
+ onInbound(handler) {
36
+ this.handler = handler;
37
+ }
38
+ /** Gate + normalize + menu-answer routing, then hand to the core. */
39
+ async dispatch(raw) {
40
+ if (this.requireMention && raw.conversationType === "2" && !isAtMentioned(raw))
41
+ return;
42
+ const msg = normalizeBotMessage(raw);
43
+ if (msg === undefined)
44
+ return;
45
+ if (this.tryResolveMenu(msg.chatKey, msg.text))
46
+ return;
47
+ await this.handler?.(msg);
48
+ }
49
+ /**
50
+ * A pending text menu is answered when the user replies with a number.
51
+ * Returns true when the message was consumed as a menu answer.
52
+ */
53
+ tryResolveMenu(conversationId, text) {
54
+ if (this.pendingMenus.size === 0)
55
+ return false;
56
+ const index = Number(text.trim());
57
+ if (!Number.isFinite(index))
58
+ return false;
59
+ for (const [messageId, pending] of this.pendingMenus) {
60
+ if (pending.conversationId !== conversationId)
61
+ continue;
62
+ const option = pending.options[index - 1];
63
+ if (option === undefined)
64
+ return false;
65
+ clearTimeout(pending.timer);
66
+ this.pendingMenus.delete(messageId);
67
+ pending.resolve(option.id);
68
+ return true;
69
+ }
70
+ return false;
71
+ }
72
+ async sendText(target, text) {
73
+ if (target.replyRef === undefined)
74
+ return; // proactive push → webhook service
75
+ await this.client.sendReply(target.replyRef, buildTextReplyBody(target.replyRef, text));
76
+ }
77
+ async sendCard(target, card) {
78
+ if (target.replyRef === undefined)
79
+ return;
80
+ await this.client.sendReply(target.replyRef, buildMarkdownReplyBody(target.replyRef, this.t.cardTitle, card.markdown));
81
+ }
82
+ async streamText(target, chunks) {
83
+ let full = "";
84
+ for await (const chunk of chunks)
85
+ full += chunk;
86
+ if (full.trim() === "" || target.replyRef === undefined)
87
+ return;
88
+ await this.client.sendReply(target.replyRef, buildTextReplyBody(target.replyRef, full));
89
+ }
90
+ async promptChoice(target, prompt, _updateMessageId) {
91
+ const lines = [prompt.title, ""];
92
+ prompt.options.forEach((option, i) => lines.push(`${i + 1}. ${option.label}`));
93
+ if (prompt.footer !== undefined)
94
+ lines.push("", prompt.footer);
95
+ const text = lines.join("\n");
96
+ if (target.replyRef !== undefined) {
97
+ await this.client.sendReply(target.replyRef, buildTextReplyBody(target.replyRef, text));
98
+ }
99
+ const messageId = `${target.chatKey}:${Date.now()}`;
100
+ const result = await new Promise((resolve) => {
101
+ const timer = setTimeout(() => {
102
+ this.pendingMenus.delete(messageId);
103
+ resolve({ choice: undefined, messageId });
104
+ }, CHOICE_TIMEOUT_MS);
105
+ this.pendingMenus.set(messageId, {
106
+ conversationId: target.chatKey,
107
+ options: [...prompt.options],
108
+ timer,
109
+ resolve: (choice) => {
110
+ this.pendingMenus.delete(messageId);
111
+ clearTimeout(timer);
112
+ resolve({ choice, messageId });
113
+ },
114
+ });
115
+ });
116
+ return result;
117
+ }
118
+ async closeMenu(_messageId, _summary) {
119
+ // Text menus have no card to replace; a completion notice is unnecessary
120
+ // because the menu prompt is just a numbered list in the thread.
121
+ }
122
+ }
123
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/channels/dingtalk/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * DingTalk-adapter user-facing strings (zh/en).
3
+ * @module dsh-connect/channels/dingtalk/i18n
4
+ */
5
+ import type { Language } from "../../i18n.js";
6
+ export interface DingtalkMessages {
7
+ webhookMissing: string;
8
+ webhookInvalid: string;
9
+ sendFailed(error: string): string;
10
+ /** Title used by markdown replies (stream mode). */
11
+ cardTitle: string;
12
+ }
13
+ export declare function dingtalkMessages(lang: Language): DingtalkMessages;
14
+ //# sourceMappingURL=i18n.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../../src/channels/dingtalk/i18n.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAClC,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;CACnB;AAgBD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,gBAAgB,CAEjE"}
@@ -0,0 +1,16 @@
1
+ const zh = {
2
+ webhookMissing: "connect-dingtalk: 未配置 webhookUrl(钉钉群自定义机器人的 Webhook 地址),无法推送。",
3
+ webhookInvalid: "connect-dingtalk: webhookUrl 必须是 https:// 开头的钉钉机器人地址。",
4
+ sendFailed: (error) => `connect-dingtalk: 推送失败 — ${error}`,
5
+ cardTitle: "DSH 任务摘要",
6
+ };
7
+ const en = {
8
+ webhookMissing: "connect-dingtalk: webhookUrl is not configured (the DingTalk group custom robot's webhook URL) — nothing to push to.",
9
+ webhookInvalid: "connect-dingtalk: webhookUrl must be an https:// DingTalk robot URL.",
10
+ sendFailed: (error) => `connect-dingtalk: push failed — ${error}`,
11
+ cardTitle: "DSH Summary",
12
+ };
13
+ export function dingtalkMessages(lang) {
14
+ return lang === "en" ? en : zh;
15
+ }
16
+ //# sourceMappingURL=i18n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../../src/channels/dingtalk/i18n.ts"],"names":[],"mappings":"AAcA,MAAM,EAAE,GAAqB;IAC3B,cAAc,EAAE,+DAA+D;IAC/E,cAAc,EAAE,uDAAuD;IACvE,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,4BAA4B,KAAK,EAAE;IAC1D,SAAS,EAAE,UAAU;CACtB,CAAC;AAEF,MAAM,EAAE,GAAqB;IAC3B,cAAc,EAAE,sHAAsH;IACtI,cAAc,EAAE,sEAAsE;IACtF,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,mCAAmC,KAAK,EAAE;IACjE,SAAS,EAAE,aAAa;CACzB,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,IAAc;IAC7C,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACjC,CAAC"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * DingTalk channel for DeepSeek Harness — two modes:
3
+ *
4
+ * 1. Webhook push (one-way): the DingTalk group custom robot (群自定义机器人)
5
+ * webhook can send text / markdown / @mention messages into a group. This
6
+ * exposes a push service (`ctx.dingtalk`) for task progress, results and
7
+ * alerts.
8
+ * 2. Stream mode (bidirectional, zero dependencies): with `stream.clientId`
9
+ * / `stream.clientSecret` set, a STOMP-over-WebSocket adapter is
10
+ * registered into `dsh-connect`, so group @-mentions / DMs trigger the
11
+ * agent and replies stream back. Menus are numbered text lists (the user
12
+ * answers with a number); proactive pushes still use the webhook service.
13
+ *
14
+ * @module dsh-connect/dingtalk
15
+ */
16
+ import { Service, type Context } from "@deepseek-ai/cordis";
17
+ import z from "@deepseek-ai/schemastery";
18
+ import { type DingtalkAt } from "./webhook.js";
19
+ import { type DingtalkStreamAdapterConfig } from "./adapter.js";
20
+ export { DingtalkWebhook, signDingtalk, verifyDingtalkSignature } from "./webhook.js";
21
+ export type { DingtalkAt, DingtalkBody, DingtalkResponse, DingtalkWebhookConfig } from "./webhook.js";
22
+ export { dingtalkMessages } from "./i18n.js";
23
+ export type { DingtalkMessages } from "./i18n.js";
24
+ export { DingtalkStreamAdapter } from "./adapter.js";
25
+ export type { DingtalkStreamAdapterConfig } from "./adapter.js";
26
+ export { DingtalkStreamClient, DEFAULT_STREAM_URL } from "./stream.js";
27
+ export { encodeFrame, decodeFrames, escapeHeader, unescapeHeader } from "./stomp.js";
28
+ export type { StompFrame } from "./stomp.js";
29
+ export { buildConnectBody, buildMarkdownReplyBody, buildTextReplyBody, isAtMentioned, normalizeBotMessage, INBOUND_DESTINATION, REPLY_DESTINATION, } from "./message.js";
30
+ export type { DingtalkBotMessage } from "./message.js";
31
+ /** Plugin config; secrets may come from config or the DINGTALK_* environment. */
32
+ export declare const Config: z<Schemastery.ObjectS<{
33
+ webhookUrl: z<string, string>;
34
+ secret: z<string, string>;
35
+ language: z<"zh" | "en", "zh" | "en">;
36
+ /** Optional default @-mentions for every push (mobiles / user ids / all). */
37
+ defaultAt: z<Schemastery.ObjectS<{
38
+ mobiles: z<string[], string[]>;
39
+ userIds: z<string[], string[]>;
40
+ all: z<boolean, boolean>;
41
+ }>, Schemastery.ObjectT<{
42
+ mobiles: z<string[], string[]>;
43
+ userIds: z<string[], string[]>;
44
+ all: z<boolean, boolean>;
45
+ }>>;
46
+ /** Stream mode (bidirectional): the DingTalk app's Client ID / Client Secret. */
47
+ stream: z<Schemastery.ObjectS<{
48
+ clientId: z<string, string>;
49
+ clientSecret: z<string, string>;
50
+ url: z<string, string>;
51
+ requireMention: z<boolean, boolean>;
52
+ }>, Schemastery.ObjectT<{
53
+ clientId: z<string, string>;
54
+ clientSecret: z<string, string>;
55
+ url: z<string, string>;
56
+ requireMention: z<boolean, boolean>;
57
+ }>>;
58
+ }>, Schemastery.ObjectT<{
59
+ webhookUrl: z<string, string>;
60
+ secret: z<string, string>;
61
+ language: z<"zh" | "en", "zh" | "en">;
62
+ /** Optional default @-mentions for every push (mobiles / user ids / all). */
63
+ defaultAt: z<Schemastery.ObjectS<{
64
+ mobiles: z<string[], string[]>;
65
+ userIds: z<string[], string[]>;
66
+ all: z<boolean, boolean>;
67
+ }>, Schemastery.ObjectT<{
68
+ mobiles: z<string[], string[]>;
69
+ userIds: z<string[], string[]>;
70
+ all: z<boolean, boolean>;
71
+ }>>;
72
+ /** Stream mode (bidirectional): the DingTalk app's Client ID / Client Secret. */
73
+ stream: z<Schemastery.ObjectS<{
74
+ clientId: z<string, string>;
75
+ clientSecret: z<string, string>;
76
+ url: z<string, string>;
77
+ requireMention: z<boolean, boolean>;
78
+ }>, Schemastery.ObjectT<{
79
+ clientId: z<string, string>;
80
+ clientSecret: z<string, string>;
81
+ url: z<string, string>;
82
+ requireMention: z<boolean, boolean>;
83
+ }>>;
84
+ }>>;
85
+ export interface DingtalkConfig {
86
+ webhookUrl?: string;
87
+ secret?: string;
88
+ language?: "zh" | "en";
89
+ defaultAt?: Partial<DingtalkAt>;
90
+ /** Stream mode (bidirectional) credentials; secrets also via DINGTALK_STREAM_CLIENT_ID / _SECRET. */
91
+ stream?: Partial<DingtalkStreamAdapterConfig>;
92
+ }
93
+ /**
94
+ * The push service exposed on the Cordis context. Other plugins can inject
95
+ * `dingtalk` and call `sendMarkdown` / `sendText` to deliver into the group.
96
+ */
97
+ export declare class DingtalkService extends Service {
98
+ private readonly webhook;
99
+ private readonly t;
100
+ readonly defaultAt?: Partial<DingtalkAt>;
101
+ constructor(ctx: Context, config: DingtalkConfig, logger?: {
102
+ warn?: (...args: unknown[]) => void;
103
+ });
104
+ /** Push a markdown card into the DingTalk group. */
105
+ sendMarkdown(title: string, text: string, at?: DingtalkAt): Promise<void>;
106
+ /** Push plain text into the DingTalk group. */
107
+ sendText(content: string, at?: DingtalkAt): Promise<void>;
108
+ }
109
+ interface ConnectLike {
110
+ registerAdapter(adapter: unknown): void;
111
+ }
112
+ /**
113
+ * Register and start the DingTalk channel. `connect` may be undefined: when the
114
+ * stream credentials are absent, or when `connect` is not provided, DingTalk
115
+ * degrades to one-way webhook push (`ctx.dingtalk`). The webhook service is
116
+ * always constructed. `connect` is the already-constructed `ConnectService`
117
+ * instance (passed from the merged entry, not resolved via `ctx.get`).
118
+ */
119
+ export declare function register(connect: ConnectLike | undefined, config: (DingtalkConfig | null) | undefined, ctx: Context): void;
120
+ /**
121
+ * Compatibility shell for the old split-plugin registration path (when `connect`
122
+ * is an already-active, separate plugin). The merged entry calls `register`
123
+ * directly instead, because `ctx.get("connect")` returns undefined inside this
124
+ * plugin's own `apply`.
125
+ */
126
+ export declare function apply(ctx: Context, config?: DingtalkConfig | null): void;
127
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/channels/dingtalk/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * DingTalk channel for DeepSeek Harness — two modes:
3
+ *
4
+ * 1. Webhook push (one-way): the DingTalk group custom robot (群自定义机器人)
5
+ * webhook can send text / markdown / @mention messages into a group. This
6
+ * exposes a push service (`ctx.dingtalk`) for task progress, results and
7
+ * alerts.
8
+ * 2. Stream mode (bidirectional, zero dependencies): with `stream.clientId`
9
+ * / `stream.clientSecret` set, a STOMP-over-WebSocket adapter is
10
+ * registered into `dsh-connect`, so group @-mentions / DMs trigger the
11
+ * agent and replies stream back. Menus are numbered text lists (the user
12
+ * answers with a number); proactive pushes still use the webhook service.
13
+ *
14
+ * @module dsh-connect/dingtalk
15
+ */
16
+ import { Service } from "@deepseek-ai/cordis";
17
+ import z from "@deepseek-ai/schemastery";
18
+ import { DingtalkWebhook } from "./webhook.js";
19
+ import { dingtalkMessages } from "./i18n.js";
20
+ import { DingtalkStreamAdapter } from "./adapter.js";
21
+ export { DingtalkWebhook, signDingtalk, verifyDingtalkSignature } from "./webhook.js";
22
+ export { dingtalkMessages } from "./i18n.js";
23
+ export { DingtalkStreamAdapter } from "./adapter.js";
24
+ export { DingtalkStreamClient, DEFAULT_STREAM_URL } from "./stream.js";
25
+ export { encodeFrame, decodeFrames, escapeHeader, unescapeHeader } from "./stomp.js";
26
+ export { buildConnectBody, buildMarkdownReplyBody, buildTextReplyBody, isAtMentioned, normalizeBotMessage, INBOUND_DESTINATION, REPLY_DESTINATION, } from "./message.js";
27
+ /** Plugin config; secrets may come from config or the DINGTALK_* environment. */
28
+ export const Config = z.object({
29
+ webhookUrl: z.string().role("secret"),
30
+ secret: z.string().role("secret"),
31
+ language: z.union([z.const("zh"), z.const("en")]),
32
+ /** Optional default @-mentions for every push (mobiles / user ids / all). */
33
+ defaultAt: z.object({
34
+ mobiles: z.array(z.string()),
35
+ userIds: z.array(z.string()),
36
+ all: z.boolean(),
37
+ }),
38
+ /** Stream mode (bidirectional): the DingTalk app's Client ID / Client Secret. */
39
+ stream: z.object({
40
+ clientId: z.string().role("secret"),
41
+ clientSecret: z.string().role("secret"),
42
+ url: z.string(),
43
+ requireMention: z.boolean(),
44
+ }),
45
+ });
46
+ /**
47
+ * The push service exposed on the Cordis context. Other plugins can inject
48
+ * `dingtalk` and call `sendMarkdown` / `sendText` to deliver into the group.
49
+ */
50
+ export class DingtalkService extends Service {
51
+ webhook;
52
+ t;
53
+ defaultAt;
54
+ constructor(ctx, config, logger) {
55
+ super(ctx, "dingtalk");
56
+ const webhookUrl = config.webhookUrl ?? process.env.DINGTALK_WEBHOOK_URL;
57
+ if (!webhookUrl) {
58
+ throw new Error(dingtalkMessages(config.language ?? "zh").webhookMissing);
59
+ }
60
+ this.t = dingtalkMessages(config.language ?? "zh");
61
+ this.defaultAt = config.defaultAt;
62
+ try {
63
+ this.webhook = new DingtalkWebhook({
64
+ webhookUrl,
65
+ ...(config.secret ?? process.env.DINGTALK_WEBHOOK_SECRET ? { secret: config.secret ?? process.env.DINGTALK_WEBHOOK_SECRET } : {}),
66
+ });
67
+ }
68
+ catch (error) {
69
+ logger?.warn?.(this.t.webhookInvalid);
70
+ throw error;
71
+ }
72
+ }
73
+ /** Push a markdown card into the DingTalk group. */
74
+ async sendMarkdown(title, text, at) {
75
+ const merged = at === undefined ? this.defaultAt : { ...this.defaultAt, ...at };
76
+ try {
77
+ await this.webhook.sendMarkdown(title, text, merged);
78
+ }
79
+ catch (error) {
80
+ this.ctx.logger?.warn?.(this.t.sendFailed(error instanceof Error ? error.message : String(error)));
81
+ }
82
+ }
83
+ /** Push plain text into the DingTalk group. */
84
+ async sendText(content, at) {
85
+ const merged = at === undefined ? this.defaultAt : { ...this.defaultAt, ...at };
86
+ try {
87
+ await this.webhook.sendText(content, merged);
88
+ }
89
+ catch (error) {
90
+ this.ctx.logger?.warn?.(this.t.sendFailed(error instanceof Error ? error.message : String(error)));
91
+ }
92
+ }
93
+ }
94
+ /**
95
+ * Register and start the DingTalk channel. `connect` may be undefined: when the
96
+ * stream credentials are absent, or when `connect` is not provided, DingTalk
97
+ * degrades to one-way webhook push (`ctx.dingtalk`). The webhook service is
98
+ * always constructed. `connect` is the already-constructed `ConnectService`
99
+ * instance (passed from the merged entry, not resolved via `ctx.get`).
100
+ */
101
+ export function register(connect, config = {}, ctx) {
102
+ // The DSH loader passes `null` for entries without an explicit config.
103
+ config = config ?? {};
104
+ // Stream mode (bidirectional): register a ChannelAdapter into dsh-connect.
105
+ const stream = config.stream ?? {};
106
+ const clientId = stream.clientId ?? process.env.DINGTALK_STREAM_CLIENT_ID;
107
+ const clientSecret = stream.clientSecret ?? process.env.DINGTALK_STREAM_CLIENT_SECRET;
108
+ if (clientId !== undefined && clientSecret !== undefined) {
109
+ if (connect === undefined) {
110
+ ctx.logger?.warn?.("connect-dingtalk: stream mode requires the dsh-connect service; skipping adapter");
111
+ }
112
+ else {
113
+ try {
114
+ const adapter = new DingtalkStreamAdapter({ ...stream, clientId, clientSecret, language: config.language }, ctx.logger);
115
+ connect.registerAdapter(adapter);
116
+ void adapter.start().catch((error) => {
117
+ ctx.logger?.warn?.(`connect-dingtalk: stream adapter start failed: ${String(error)}`);
118
+ });
119
+ }
120
+ catch (error) {
121
+ ctx.logger?.warn?.(`connect-dingtalk: stream adapter init failed: ${String(error)}`);
122
+ }
123
+ }
124
+ }
125
+ // Webhook push service (one-way). `Service` construction registers
126
+ // `ctx.dingtalk` automatically; it throws when no webhookUrl is configured.
127
+ try {
128
+ void new DingtalkService(ctx, config, ctx.logger);
129
+ }
130
+ catch (error) {
131
+ ctx.logger?.warn?.(`connect-dingtalk: init failed: ${String(error)}`);
132
+ }
133
+ }
134
+ /**
135
+ * Compatibility shell for the old split-plugin registration path (when `connect`
136
+ * is an already-active, separate plugin). The merged entry calls `register`
137
+ * directly instead, because `ctx.get("connect")` returns undefined inside this
138
+ * plugin's own `apply`.
139
+ */
140
+ export function apply(ctx, config = {}) {
141
+ const connect = ctx.get("connect");
142
+ register(connect, config, ctx);
143
+ }
144
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/channels/dingtalk/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Pure message normalization for the DingTalk stream mode: raw gateway
3
+ * payloads → dsh-connect `InboundMessage`, and STOMP reply bodies for the
4
+ * reply destination. Kept free of sockets so every branch is unit-testable.
5
+ * @module dsh-connect/channels/dingtalk/message
6
+ */
7
+ import type { InboundMessage } from "../../types.js";
8
+ /** Raw inbound message payload pushed by the stream gateway. */
9
+ export interface DingtalkBotMessage {
10
+ senderStaffId?: string;
11
+ senderNick?: string;
12
+ /** Stable conversation id ("cid…"). */
13
+ conversationId?: string;
14
+ /** "1" = single chat, "2" = group chat. */
15
+ conversationType?: string;
16
+ msgId?: string;
17
+ msgType?: string;
18
+ text?: {
19
+ content?: string;
20
+ };
21
+ /** True when the message @-mentioned the bot (group chats). */
22
+ isInAtList?: boolean;
23
+ /** Mentioned users when `isInAtList` is true. */
24
+ atUsers?: Array<{
25
+ dingtalkId?: string;
26
+ staffId?: string;
27
+ }>;
28
+ }
29
+ /** STOMP destination the gateway pushes inbound bot messages on. */
30
+ export declare const INBOUND_DESTINATION = "/v1.0/im/bot/messages/get";
31
+ /** STOMP destination replies are SENT to. */
32
+ export declare const REPLY_DESTINATION = "/v1.0/im/bot/messages/reply";
33
+ /** STOMP subscription id used for the inbound topic. */
34
+ export declare const INBOUND_SUBSCRIPTION = "inbound";
35
+ /** True when the message @-mentioned the bot (used for group requireMention). */
36
+ export declare function isAtMentioned(msg: DingtalkBotMessage): boolean;
37
+ /**
38
+ * Normalize a gateway payload into an `InboundMessage`. Returns `undefined`
39
+ * for payloads that cannot be routed (missing conversation/sender) or that
40
+ * carry no usable text body.
41
+ */
42
+ export declare function normalizeBotMessage(raw: DingtalkBotMessage, channel?: string): InboundMessage | undefined;
43
+ /** JSON body for a plain-text reply to a message. */
44
+ export declare function buildTextReplyBody(msgId: string, content: string): string;
45
+ /** JSON body for a markdown reply to a message. */
46
+ export declare function buildMarkdownReplyBody(msgId: string, title: string, text: string): string;
47
+ /** JSON body for the STOMP CONNECT frame. */
48
+ export declare function buildConnectBody(clientId: string, clientSecret: string): string;
49
+ //# sourceMappingURL=message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../../src/channels/dingtalk/message.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,gEAAgE;AAChE,MAAM,WAAW,kBAAkB;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2CAA2C;IAC3C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5B,+DAA+D;IAC/D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iDAAiD;IACjD,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5D;AAED,oEAAoE;AACpE,eAAO,MAAM,mBAAmB,8BAA8B,CAAC;AAC/D,6CAA6C;AAC7C,eAAO,MAAM,iBAAiB,gCAAgC,CAAC;AAC/D,wDAAwD;AACxD,eAAO,MAAM,oBAAoB,YAAY,CAAC;AAE9C,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,kBAAkB,EAAE,OAAO,SAAa,GAAG,cAAc,GAAG,SAAS,CAkB7G;AAED,qDAAqD;AACrD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED,mDAAmD;AACnD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzF;AAED,6CAA6C;AAC7C,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAE/E"}
@@ -0,0 +1,50 @@
1
+ /** STOMP destination the gateway pushes inbound bot messages on. */
2
+ export const INBOUND_DESTINATION = "/v1.0/im/bot/messages/get";
3
+ /** STOMP destination replies are SENT to. */
4
+ export const REPLY_DESTINATION = "/v1.0/im/bot/messages/reply";
5
+ /** STOMP subscription id used for the inbound topic. */
6
+ export const INBOUND_SUBSCRIPTION = "inbound";
7
+ /** True when the message @-mentioned the bot (used for group requireMention). */
8
+ export function isAtMentioned(msg) {
9
+ return msg.isInAtList === true;
10
+ }
11
+ /**
12
+ * Normalize a gateway payload into an `InboundMessage`. Returns `undefined`
13
+ * for payloads that cannot be routed (missing conversation/sender) or that
14
+ * carry no usable text body.
15
+ */
16
+ export function normalizeBotMessage(raw, channel = "dingtalk") {
17
+ if (typeof raw.conversationId !== "string" || raw.conversationId === "")
18
+ return undefined;
19
+ if (typeof raw.senderStaffId !== "string" || raw.senderStaffId === "")
20
+ return undefined;
21
+ const text = raw.msgType === "text" ? (raw.text?.content ?? "") : "";
22
+ // Nothing for the agent to act on: a non-text payload (image, file, sticker,
23
+ // recall notice) normalizes to an empty body, and stream mode carries no
24
+ // attachment download. Running a turn on it would burn a model call and post
25
+ // a reply to a message the user never sent. Same guard the Telegram adapter
26
+ // applies when it has no media either.
27
+ if (text.trim() === "")
28
+ return undefined;
29
+ return {
30
+ channel,
31
+ chatKey: raw.conversationId,
32
+ chatType: raw.conversationType === "2" ? "group" : "p2p",
33
+ senderKey: raw.senderStaffId,
34
+ text,
35
+ ...(typeof raw.msgId === "string" && raw.msgId !== "" ? { replyRef: raw.msgId } : {}),
36
+ };
37
+ }
38
+ /** JSON body for a plain-text reply to a message. */
39
+ export function buildTextReplyBody(msgId, content) {
40
+ return JSON.stringify({ msgKey: "sampleText", msgParam: { content }, msgId });
41
+ }
42
+ /** JSON body for a markdown reply to a message. */
43
+ export function buildMarkdownReplyBody(msgId, title, text) {
44
+ return JSON.stringify({ msgKey: "sampleMarkdown", msgParam: { title, text }, msgId });
45
+ }
46
+ /** JSON body for the STOMP CONNECT frame. */
47
+ export function buildConnectBody(clientId, clientSecret) {
48
+ return JSON.stringify({ clientId, clientSecret, protocolVersion: "1.0" });
49
+ }
50
+ //# sourceMappingURL=message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../../../src/channels/dingtalk/message.ts"],"names":[],"mappings":"AAyBA,oEAAoE;AACpE,MAAM,CAAC,MAAM,mBAAmB,GAAG,2BAA2B,CAAC;AAC/D,6CAA6C;AAC7C,MAAM,CAAC,MAAM,iBAAiB,GAAG,6BAA6B,CAAC;AAC/D,wDAAwD;AACxD,MAAM,CAAC,MAAM,oBAAoB,GAAG,SAAS,CAAC;AAE9C,iFAAiF;AACjF,MAAM,UAAU,aAAa,CAAC,GAAuB;IACnD,OAAO,GAAG,CAAC,UAAU,KAAK,IAAI,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAuB,EAAE,OAAO,GAAG,UAAU;IAC/E,IAAI,OAAO,GAAG,CAAC,cAAc,KAAK,QAAQ,IAAI,GAAG,CAAC,cAAc,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAC1F,IAAI,OAAO,GAAG,CAAC,aAAa,KAAK,QAAQ,IAAI,GAAG,CAAC,aAAa,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACxF,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,6EAA6E;IAC7E,yEAAyE;IACzE,6EAA6E;IAC7E,4EAA4E;IAC5E,uCAAuC;IACvC,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACzC,OAAO;QACL,OAAO;QACP,OAAO,EAAE,GAAG,CAAC,cAAc;QAC3B,QAAQ,EAAE,GAAG,CAAC,gBAAgB,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;QACxD,SAAS,EAAE,GAAG,CAAC,aAAa;QAC5B,IAAI;QACJ,GAAG,CAAC,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtF,CAAC;AACJ,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,OAAe;IAC/D,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,sBAAsB,CAAC,KAAa,EAAE,KAAa,EAAE,IAAY;IAC/E,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;AACxF,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,YAAoB;IACrE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Minimal STOMP 1.x frame codec used by the DingTalk stream-mode gateway.
3
+ * Pure string logic (no sockets) so it can be unit-tested without a network:
4
+ * DingTalk's stream gateway speaks STOMP over WebSocket with JSON bodies —
5
+ * CONNECT / CONNECTED / SUBSCRIBE / MESSAGE / SEND / ERROR frames and bare
6
+ * newline heartbeats.
7
+ * @module dsh-connect/channels/dingtalk/stomp
8
+ */
9
+ /** One decoded STOMP frame. */
10
+ export interface StompFrame {
11
+ command: string;
12
+ headers: Record<string, string>;
13
+ body: string;
14
+ }
15
+ /**
16
+ * Escape a header value per STOMP rules: backslash, newline, carriage
17
+ * return and colon become \\, \n, \r, \c.
18
+ */
19
+ export declare function escapeHeader(value: string): string;
20
+ /** Reverse of {@link escapeHeader}. */
21
+ export declare function unescapeHeader(value: string): string;
22
+ /** Serialize one frame (command, header block, blank line, body, NUL). */
23
+ export declare function encodeFrame(command: string, headers: Record<string, string>, body?: string): string;
24
+ /** Result of feeding a chunk into the incremental decoder. */
25
+ export interface StompDecodeResult {
26
+ frames: StompFrame[];
27
+ /** Unconsumed tail (partial frame) to carry into the next feed. */
28
+ rest: string;
29
+ }
30
+ /**
31
+ * Incrementally decode STOMP frames from a string buffer. Frames are
32
+ * NUL-terminated; heartbeats (bare newlines) and other whitespace-only
33
+ * segments are skipped. Returns the decoded frames plus the leftover tail.
34
+ */
35
+ export declare function decodeFrames(buffer: string): StompDecodeResult;
36
+ //# sourceMappingURL=stomp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stomp.d.ts","sourceRoot":"","sources":["../../../src/channels/dingtalk/stomp.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,+BAA+B;AAC/B,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAYlD;AAED,uCAAuC;AACvC,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAepD;AAED,0EAA0E;AAC1E,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,SAAK,GAAG,MAAM,CAO/F;AAED,8DAA8D;AAC9D,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAkC9D"}