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,133 @@
1
+ import type { ChannelAdapter, ChoiceOption, ChoicePrompt, ChoiceResult, InboundMessage, OutboundTarget, SummaryCard } from "../../types.js";
2
+ import type { Language } from "../../i18n.js";
3
+ /** Pad every label with trailing spaces up to the same display width. */
4
+ export declare function padLabels(options: readonly ChoiceOption[]): ChoiceOption[];
5
+ /**
6
+ * Render options as an equal-width button grid: 2 buttons per row via
7
+ * `column_set` (two weighted columns), padding the last row with empty
8
+ * columns so every row is a uniform 2-cell layout. Labels are padded to the
9
+ * same display width so the buttons themselves render uniformly. Destructive
10
+ * actions (labels starting with ❌) render as red danger buttons.
11
+ */
12
+ export declare function buildButtonGrid(options: readonly ChoiceOption[], columnsPerRow?: number): unknown[];
13
+ /**
14
+ * Render options as a single-select dropdown (`select_static`) inside an
15
+ * `action` container. Selecting an entry fires the card action with
16
+ * `action.tag === "select_static"` and the picked option id in `action.option`.
17
+ */
18
+ export declare function buildSelectMenu(options: readonly ChoiceOption[], placeholder?: string, initial?: string): unknown[];
19
+ /**
20
+ * Assemble the card elements for a choice prompt. When `sections` is given,
21
+ * the options are split into titled groups — each with a bold section caption
22
+ * and a divider before it — instead of one flat grid. Options not listed in
23
+ * any section (typically the trailing exit/back buttons) are rendered after
24
+ * the sections, separated by a divider.
25
+ *
26
+ * @param prompt - The choice prompt to render
27
+ * @param defaultColumns - Default number of columns per row (default: 2)
28
+ */
29
+ export declare function buildChoiceElements(prompt: ChoicePrompt, defaultColumns?: number): unknown[];
30
+ /** Classify a local file name for the Feishu upload API (image vs stream file). */
31
+ export declare function classifyFeishuFile(filename: string): "image" | "file";
32
+ /** Strip path separators / control chars from a downloaded file's name. */
33
+ export declare function sanitizeFileName(name: string): string;
34
+ /**
35
+ * Extract a human-readable error detail. Feishu business errors (missing
36
+ * permission, invalid resource, …) arrive as HTTP 200/400 with the real
37
+ * `{code, msg}` in the response body; prefer that over the axios fallback
38
+ * message like "Request failed with status code 400" that hides the cause.
39
+ */
40
+ export declare function extractErrorDetail(error: unknown): string;
41
+ export interface FeishuConfig {
42
+ appId?: string;
43
+ appSecret?: string;
44
+ transport?: "websocket" | "webhook";
45
+ verificationToken?: string;
46
+ encryptKey?: string;
47
+ /** HTTP port for `transport: "webhook"` (default 9000). */
48
+ webhookPort?: number;
49
+ /** HTTP path the Feishu event callback posts to (default "/"). */
50
+ webhookPath?: string;
51
+ /** Group messages must @-mention the bot (default true). */
52
+ requireMention?: boolean;
53
+ /** Single-chat policy (SDK values): open / allowlist / pair / disabled. */
54
+ dmMode?: "open" | "allowlist" | "pair" | "disabled";
55
+ /** Bind one DSH session per group thread instead of one per chat (default false). */
56
+ threadIsolation?: boolean;
57
+ /**
58
+ * Allow the interactive one-click onboarding flow when no credentials are
59
+ * configured (default true). Set `false` to never start it — the adapter then
60
+ * just warns, which is what a supervisor-managed deployment wants.
61
+ */
62
+ onboarding?: boolean;
63
+ /** User-facing message language: `zh` (default) or `en`. */
64
+ language?: Language;
65
+ }
66
+ export declare class FeishuAdapter implements ChannelAdapter {
67
+ private readonly logger?;
68
+ private readonly isChatAllowed?;
69
+ readonly id = "feishu";
70
+ private readonly channel;
71
+ private readonly pendingChoices;
72
+ /** Cards whose stale-button tap was already noticed (dedupe, self-clearing). */
73
+ private readonly staleNoticed;
74
+ private readonly staleTimers;
75
+ private readonly t;
76
+ private readonly transport;
77
+ private readonly webhookPort;
78
+ private readonly webhookPath;
79
+ private readonly threadIsolation;
80
+ private server?;
81
+ private handler?;
82
+ constructor(config: FeishuConfig, logger?: {
83
+ info?: (...args: unknown[]) => void;
84
+ warn?: (...args: unknown[]) => void;
85
+ error?: (...args: unknown[]) => void;
86
+ } | undefined, isChatAllowed?: ((channel: string, chatKey: string, senderKey: string) => boolean) | undefined);
87
+ onInbound(handler: (msg: InboundMessage) => void | Promise<void>): void;
88
+ /** Resource types downloadable via `im.v1.messageResource.get`. Stickers are not supported by the Feishu API. */
89
+ private static readonly DOWNLOADABLE_TYPES;
90
+ /** Download attached images / files into local temp dirs; return their paths (and any failures). */
91
+ private downloadResources;
92
+ /**
93
+ * Download a resource inside a user message.
94
+ *
95
+ * Note: do NOT use the SDK's `downloadResource(fileKey, type)` — it calls
96
+ * `im.v1.image.get` / `im.v1.file.get` (download image / download file), and
97
+ * per the Feishu docs those endpoints **can only download resources uploaded
98
+ * by the bot itself**. Resources inside user-sent messages must be fetched
99
+ * with "get resource file from message" `im.v1.messageResource.get` (with
100
+ * message_id + type=image/file/audio/video), otherwise it returns HTTP 400.
101
+ */
102
+ private downloadMessageResource;
103
+ /**
104
+ * Housekeeping for the per-channel temp dirs: remove downloads older than
105
+ * 24h so a busy bot doesn't fill the OS temp partition. Best-effort — a
106
+ * failure to clean is logged, never fatal.
107
+ */
108
+ private cleanupTempDirs;
109
+ start(): Promise<void>;
110
+ stop(): Promise<void>;
111
+ /** Base chat id for outbound sends (strips any `:thread=` suffix). */
112
+ private chatIdOf;
113
+ sendText(target: OutboundTarget, text: string): Promise<void>;
114
+ sendCard(target: OutboundTarget, card: SummaryCard): Promise<void>;
115
+ streamText(target: OutboundTarget, chunks: AsyncIterable<string>): Promise<void>;
116
+ /**
117
+ * Deliver a local file to the chat. The SDK uploads the source itself:
118
+ * images are sent inline, everything else as an attachment.
119
+ */
120
+ sendFile(target: OutboundTarget, filePath: string, options?: {
121
+ filename?: string;
122
+ }): Promise<void>;
123
+ /**
124
+ * Build the send options shared by text/markdown deliveries: an optional
125
+ * reply target and @-mentions (SDK renders `<at user_id=…>` prefixes for
126
+ * both text and post messages, so group completion cards can nudge the
127
+ * requester).
128
+ */
129
+ private sendOpts;
130
+ promptChoice(target: OutboundTarget, prompt: ChoicePrompt, updateMessageId?: string): Promise<ChoiceResult>;
131
+ closeMenu(messageId: string, summary: string): Promise<void>;
132
+ }
133
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/channels/feishu/adapter.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,cAAc,EACd,WAAW,EACZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAkB9C,yEAAyE;AACzE,wBAAgB,SAAS,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,YAAY,EAAE,CAc1E;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,EAAE,aAAa,GAAE,MAAU,GAAG,OAAO,EAAE,CA8BtG;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,EAAE,WAAW,SAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE,CAclH;AAkBD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,cAAc,GAAE,MAAU,GAAG,OAAO,EAAE,CAmC/F;AAoDD,mFAAmF;AACnF,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAGrE;AAED,2EAA2E;AAC3E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMrD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAczD;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IACpC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,CAAC;IACpD,qFAAqF;IACrF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAoBD,qBAAa,aAAc,YAAW,cAAc;IAiBhD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;IAjBjC,QAAQ,CAAC,EAAE,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAoC;IACnE,gFAAgF;IAChF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAiB;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAC1C,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,OAAO,CAAC,CAAgD;gBAG9D,MAAM,EAAE,YAAY,EACH,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;QAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;KAAE,YAAA,EAC3H,aAAa,CAAC,GAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,aAAA;IAiCnG,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIvE,iHAAiH;IACjH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAgD;IAE1F,oGAAoG;YACtF,iBAAiB;IA6D/B;;;;;;;;;OASG;YACW,uBAAuB;IAQrC;;;;OAIG;YACW,eAAe;IAuBvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA+GtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB3B,sEAAsE;IACtE,OAAO,CAAC,QAAQ;IAIV,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ7D,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlE,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IActF;;;OAGG;IACG,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IASxG;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;IASV,YAAY,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAgF3G,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAQnE"}