@soimy/dingtalk 3.6.0 → 3.6.2-beta.1

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 (174) hide show
  1. package/README.md +4 -1
  2. package/dist/index.d.ts +14 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +14443 -0
  5. package/dist/index.js.map +7 -0
  6. package/dist/src/access-control.d.ts +43 -0
  7. package/dist/src/access-control.d.ts.map +1 -0
  8. package/dist/src/ack-reaction/dynamic-ack-reaction-controller.d.ts +22 -0
  9. package/dist/src/ack-reaction/dynamic-ack-reaction-controller.d.ts.map +1 -0
  10. package/dist/src/ack-reaction/dynamic-ack-reaction-events.d.ts +36 -0
  11. package/dist/src/ack-reaction/dynamic-ack-reaction-events.d.ts.map +1 -0
  12. package/dist/src/ack-reaction/dynamic-ack-reaction-progress.d.ts +7 -0
  13. package/dist/src/ack-reaction/dynamic-ack-reaction-progress.d.ts.map +1 -0
  14. package/dist/src/ack-reaction-classifier.d.ts +8 -0
  15. package/dist/src/ack-reaction-classifier.d.ts.map +1 -0
  16. package/dist/src/ack-reaction-service.d.ts +15 -0
  17. package/dist/src/ack-reaction-service.d.ts.map +1 -0
  18. package/dist/src/auth.d.ts +7 -0
  19. package/dist/src/auth.d.ts.map +1 -0
  20. package/dist/src/card/card-action-handler.d.ts +14 -0
  21. package/dist/src/card/card-action-handler.d.ts.map +1 -0
  22. package/dist/src/card/card-markdown-image-reroute.d.ts +16 -0
  23. package/dist/src/card/card-markdown-image-reroute.d.ts.map +1 -0
  24. package/dist/src/card/card-run-registry.d.ts +60 -0
  25. package/dist/src/card/card-run-registry.d.ts.map +1 -0
  26. package/dist/src/card/card-stop-handler.d.ts +18 -0
  27. package/dist/src/card/card-stop-handler.d.ts.map +1 -0
  28. package/dist/src/card/card-streaming-mode.d.ts +8 -0
  29. package/dist/src/card/card-streaming-mode.d.ts.map +1 -0
  30. package/dist/src/card/card-template.d.ts +21 -0
  31. package/dist/src/card/card-template.d.ts.map +1 -0
  32. package/dist/src/card/reasoning-answer-split.d.ts +6 -0
  33. package/dist/src/card/reasoning-answer-split.d.ts.map +1 -0
  34. package/dist/src/card/reasoning-block-assembler.d.ts +7 -0
  35. package/dist/src/card/reasoning-block-assembler.d.ts.map +1 -0
  36. package/dist/src/card/statusline-renderer.d.ts +24 -0
  37. package/dist/src/card/statusline-renderer.d.ts.map +1 -0
  38. package/dist/src/card-callback-service.d.ts +23 -0
  39. package/dist/src/card-callback-service.d.ts.map +1 -0
  40. package/dist/src/card-draft-controller.d.ts +75 -0
  41. package/dist/src/card-draft-controller.d.ts.map +1 -0
  42. package/dist/src/card-service.d.ts +99 -0
  43. package/dist/src/card-service.d.ts.map +1 -0
  44. package/dist/src/channel.d.ts +10 -0
  45. package/dist/src/channel.d.ts.map +1 -0
  46. package/dist/src/command/card-stop-command.d.ts +30 -0
  47. package/dist/src/command/card-stop-command.d.ts.map +1 -0
  48. package/dist/src/command/inbound-command-dispatch-service.d.ts +40 -0
  49. package/dist/src/command/inbound-command-dispatch-service.d.ts.map +1 -0
  50. package/dist/src/config-schema.d.ts +8 -0
  51. package/dist/src/config-schema.d.ts.map +1 -0
  52. package/dist/src/config.d.ts +60 -0
  53. package/dist/src/config.d.ts.map +1 -0
  54. package/dist/src/connection-manager.d.ts +148 -0
  55. package/dist/src/connection-manager.d.ts.map +1 -0
  56. package/dist/src/dedup.d.ts +4 -0
  57. package/dist/src/dedup.d.ts.map +1 -0
  58. package/dist/src/device-registration.d.ts +16 -0
  59. package/dist/src/device-registration.d.ts.map +1 -0
  60. package/dist/src/docs-service.d.ts +12 -0
  61. package/dist/src/docs-service.d.ts.map +1 -0
  62. package/dist/src/draft-stream-loop.d.ts +28 -0
  63. package/dist/src/draft-stream-loop.d.ts.map +1 -0
  64. package/dist/src/feedback-learning-service.d.ts +123 -0
  65. package/dist/src/feedback-learning-service.d.ts.map +1 -0
  66. package/dist/src/feedback-learning-store.d.ts +181 -0
  67. package/dist/src/feedback-learning-store.d.ts.map +1 -0
  68. package/dist/src/gateway/channel-gateway.d.ts +4 -0
  69. package/dist/src/gateway/channel-gateway.d.ts.map +1 -0
  70. package/dist/src/http-client.d.ts +9 -0
  71. package/dist/src/http-client.d.ts.map +1 -0
  72. package/dist/src/inbound-handler.d.ts +9 -0
  73. package/dist/src/inbound-handler.d.ts.map +1 -0
  74. package/dist/src/learning-command-service.d.ts +64 -0
  75. package/dist/src/learning-command-service.d.ts.map +1 -0
  76. package/dist/src/logger-context.d.ts +10 -0
  77. package/dist/src/logger-context.d.ts.map +1 -0
  78. package/dist/src/media-utils.d.ts +63 -0
  79. package/dist/src/media-utils.d.ts.map +1 -0
  80. package/dist/src/message-context-store.d.ts +126 -0
  81. package/dist/src/message-context-store.d.ts.map +1 -0
  82. package/dist/src/message-utils.d.ts +12 -0
  83. package/dist/src/message-utils.d.ts.map +1 -0
  84. package/dist/src/messaging/attachment-text-extractor.d.ts +13 -0
  85. package/dist/src/messaging/attachment-text-extractor.d.ts.map +1 -0
  86. package/dist/src/messaging/btw-deliver.d.ts +42 -0
  87. package/dist/src/messaging/btw-deliver.d.ts.map +1 -0
  88. package/dist/src/messaging/channel-actions.d.ts +3 -0
  89. package/dist/src/messaging/channel-actions.d.ts.map +1 -0
  90. package/dist/src/messaging/channel-outbound.d.ts +3 -0
  91. package/dist/src/messaging/channel-outbound.d.ts.map +1 -0
  92. package/dist/src/messaging/quoted-context.d.ts +36 -0
  93. package/dist/src/messaging/quoted-context.d.ts.map +1 -0
  94. package/dist/src/messaging/quoted-file-service.d.ts +25 -0
  95. package/dist/src/messaging/quoted-file-service.d.ts.map +1 -0
  96. package/dist/src/messaging/quoted-ref.d.ts +12 -0
  97. package/dist/src/messaging/quoted-ref.d.ts.map +1 -0
  98. package/dist/src/onboarding.d.ts +4 -0
  99. package/dist/src/onboarding.d.ts.map +1 -0
  100. package/dist/src/path-utils.d.ts +3 -0
  101. package/dist/src/path-utils.d.ts.map +1 -0
  102. package/dist/src/peer-id-registry.d.ts +35 -0
  103. package/dist/src/peer-id-registry.d.ts.map +1 -0
  104. package/dist/src/persistence-store.d.ts +27 -0
  105. package/dist/src/persistence-store.d.ts.map +1 -0
  106. package/dist/src/platform/channel-status.d.ts +3 -0
  107. package/dist/src/platform/channel-status.d.ts.map +1 -0
  108. package/dist/src/plugin-sdk-channel-actions-augment.d.ts +7 -0
  109. package/dist/src/plugin-sdk-channel-actions-augment.d.ts.map +1 -0
  110. package/dist/src/proactive-risk-registry.d.ts +22 -0
  111. package/dist/src/proactive-risk-registry.d.ts.map +1 -0
  112. package/dist/src/reply-strategy-card.d.ts +14 -0
  113. package/dist/src/reply-strategy-card.d.ts.map +1 -0
  114. package/dist/src/reply-strategy-markdown.d.ts +10 -0
  115. package/dist/src/reply-strategy-markdown.d.ts.map +1 -0
  116. package/dist/src/reply-strategy-types.d.ts +85 -0
  117. package/dist/src/reply-strategy-types.d.ts.map +1 -0
  118. package/dist/src/reply-strategy-with-reaction.d.ts +47 -0
  119. package/dist/src/reply-strategy-with-reaction.d.ts.map +1 -0
  120. package/dist/src/reply-strategy.d.ts +14 -0
  121. package/dist/src/reply-strategy.d.ts.map +1 -0
  122. package/dist/src/run-usage-store.d.ts +15 -0
  123. package/dist/src/run-usage-store.d.ts.map +1 -0
  124. package/dist/src/runtime.d.ts +4 -0
  125. package/dist/src/runtime.d.ts.map +1 -0
  126. package/dist/src/secret-input.d.ts +42 -0
  127. package/dist/src/secret-input.d.ts.map +1 -0
  128. package/dist/src/send-service.d.ts +46 -0
  129. package/dist/src/send-service.d.ts.map +1 -0
  130. package/dist/src/session-command-service.d.ts +35 -0
  131. package/dist/src/session-command-service.d.ts.map +1 -0
  132. package/dist/src/session-lock.d.ts +11 -0
  133. package/dist/src/session-lock.d.ts.map +1 -0
  134. package/dist/src/session-peer-store.d.ts +21 -0
  135. package/dist/src/session-peer-store.d.ts.map +1 -0
  136. package/dist/src/session-routing.d.ts +14 -0
  137. package/dist/src/session-routing.d.ts.map +1 -0
  138. package/dist/src/session-state.d.ts +13 -0
  139. package/dist/src/session-state.d.ts.map +1 -0
  140. package/dist/src/signature.d.ts +6 -0
  141. package/dist/src/signature.d.ts.map +1 -0
  142. package/dist/src/targeting/agent-name-matcher.d.ts +63 -0
  143. package/dist/src/targeting/agent-name-matcher.d.ts.map +1 -0
  144. package/dist/src/targeting/agent-routing.d.ts +72 -0
  145. package/dist/src/targeting/agent-routing.d.ts.map +1 -0
  146. package/dist/src/targeting/group-members-store.d.ts +3 -0
  147. package/dist/src/targeting/group-members-store.d.ts.map +1 -0
  148. package/dist/src/targeting/target-directory-adapter.d.ts +13 -0
  149. package/dist/src/targeting/target-directory-adapter.d.ts.map +1 -0
  150. package/dist/src/targeting/target-directory-store.d.ts +45 -0
  151. package/dist/src/targeting/target-directory-store.d.ts.map +1 -0
  152. package/dist/src/targeting/target-input.d.ts +3 -0
  153. package/dist/src/targeting/target-input.d.ts.map +1 -0
  154. package/dist/src/types.d.ts +730 -0
  155. package/dist/src/types.d.ts.map +1 -0
  156. package/dist/src/utils.d.ts +54 -0
  157. package/dist/src/utils.d.ts.map +1 -0
  158. package/openclaw.plugin.json +49 -5
  159. package/package.json +26 -5
  160. package/src/auth.ts +5 -2
  161. package/src/card-service.ts +41 -16
  162. package/src/channel.ts +5 -2
  163. package/src/config-schema.ts +2 -1
  164. package/src/config.ts +24 -67
  165. package/src/device-registration.ts +0 -32
  166. package/src/gateway/channel-gateway.ts +9 -8
  167. package/src/inbound-handler.ts +1239 -1061
  168. package/src/message-context-store.ts +183 -85
  169. package/src/messaging/channel-actions.ts +2 -1
  170. package/src/onboarding.ts +18 -13
  171. package/src/path-utils.ts +49 -0
  172. package/src/secret-input.ts +182 -0
  173. package/src/targeting/agent-routing.ts +30 -5
  174. package/src/types.ts +25 -10
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import * as dns from "node:dns";
2
+ import * as fs from "node:fs";
3
+ import * as net from "node:net";
4
+ import type { Logger, RetryOptions } from "./types";
5
+ type PluginDebugLogParams = {
6
+ accountId: string;
7
+ storePath?: string;
8
+ debug?: boolean;
9
+ baseLog?: Logger;
10
+ now?: () => Date;
11
+ fsImpl?: Pick<typeof fs, "appendFileSync" | "mkdirSync">;
12
+ };
13
+ export declare function resolvePluginDebugLog(params: PluginDebugLogParams): Logger;
14
+ export declare function closePluginDebugLog(params: {
15
+ accountId: string;
16
+ storePath?: string;
17
+ }): void;
18
+ /**
19
+ * Mask sensitive fields in data for safe logging
20
+ * Prevents PII leakage in debug logs
21
+ */
22
+ export declare function maskSensitiveData(data: unknown): any;
23
+ export declare function stringifyUnknown(value: unknown): string;
24
+ export declare function parseBooleanLike(value: unknown): boolean | undefined;
25
+ export declare function getErrorMessage(err: unknown): string;
26
+ export declare function getErrorResponseData(err: unknown): unknown;
27
+ export declare function formatDingTalkErrorPayload(payload: unknown): string;
28
+ export declare function formatDingTalkErrorPayloadLog(scope: string, payload: unknown, prefix?: "[DingTalk]" | "[DingTalk][AICard]"): string;
29
+ export declare function getProxyBypassOption(config?: {
30
+ bypassProxyForSend?: boolean;
31
+ }): {
32
+ proxy: false;
33
+ } | Record<string, never>;
34
+ type LookupCallback = (err: NodeJS.ErrnoException | null, address: string | dns.LookupAddress[], family?: number) => void;
35
+ type LookupOptions = dns.LookupOneOptions | dns.LookupAllOptions;
36
+ export declare function createResolve4FallbackLookup(log?: Logger, accountId?: string): (hostname: string, options: LookupOptions, callback: LookupCallback) => void;
37
+ export declare function createResolve4FallbackLookupWithDeps(log: Logger | undefined, accountId: string | undefined, dnsImpl: Pick<typeof dns, "lookup" | "resolve4">, netImpl: Pick<typeof net, "isIP">): (hostname: string, options: LookupOptions, callback: LookupCallback) => void;
38
+ export declare function formatDingTalkConnectionErrorLog(scope: string, err: unknown, baseMessage: string): string | null;
39
+ /**
40
+ * Cleanup orphaned temp files from dingtalk media
41
+ * Run at startup to clean up files from crashed processes
42
+ */
43
+ export declare function cleanupOrphanedTempFiles(log?: Logger): number;
44
+ /**
45
+ * Retry logic for API calls with exponential backoff
46
+ * Handles transient failures like 401 token expiry
47
+ */
48
+ export declare function retryWithBackoff<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
49
+ /**
50
+ * Get current timestamp in ISO-compatible epoch milliseconds for status tracking.
51
+ */
52
+ export declare function getCurrentTimestamp(): number;
53
+ export {};
54
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
@@ -36,8 +36,30 @@
36
36
  "description": "DingTalk App Key (Client ID) used to authenticate API and Stream connections."
37
37
  },
38
38
  "clientSecret": {
39
- "type": "string",
40
- "description": "DingTalk App Secret (Client Secret) used to obtain DingTalk access tokens."
39
+ "anyOf": [
40
+ { "type": "string" },
41
+ {
42
+ "type": "object",
43
+ "additionalProperties": false,
44
+ "required": ["source", "provider", "id"],
45
+ "properties": {
46
+ "source": { "type": "string", "enum": ["env", "file"] },
47
+ "provider": {
48
+ "type": "string",
49
+ "minLength": 1,
50
+ "maxLength": 1024,
51
+ "pattern": "^[^:>]+$"
52
+ },
53
+ "id": {
54
+ "type": "string",
55
+ "minLength": 1,
56
+ "maxLength": 1024,
57
+ "pattern": "^[^>]+$"
58
+ }
59
+ }
60
+ }
61
+ ],
62
+ "description": "DingTalk App Secret (Client Secret) used to obtain DingTalk access tokens. Supports SecretInput references such as env/file. Security boundary: file reads the configured local path; use file only with trusted plugin configuration."
41
63
  },
42
64
  "dmPolicy": {
43
65
  "type": "string",
@@ -320,8 +342,30 @@
320
342
  "description": "DingTalk App Key (Client ID) used to authenticate API and Stream connections."
321
343
  },
322
344
  "clientSecret": {
323
- "type": "string",
324
- "description": "DingTalk App Secret (Client Secret) used to obtain DingTalk access tokens."
345
+ "anyOf": [
346
+ { "type": "string" },
347
+ {
348
+ "type": "object",
349
+ "additionalProperties": false,
350
+ "required": ["source", "provider", "id"],
351
+ "properties": {
352
+ "source": { "type": "string", "enum": ["env", "file"] },
353
+ "provider": {
354
+ "type": "string",
355
+ "minLength": 1,
356
+ "maxLength": 1024,
357
+ "pattern": "^[^:>]+$"
358
+ },
359
+ "id": {
360
+ "type": "string",
361
+ "minLength": 1,
362
+ "maxLength": 1024,
363
+ "pattern": "^[^>]+$"
364
+ }
365
+ }
366
+ }
367
+ ],
368
+ "description": "DingTalk App Secret (Client Secret) used to obtain DingTalk access tokens. Supports SecretInput references such as env/file. Security boundary: file reads the configured local path; use file only with trusted plugin configuration."
325
369
  },
326
370
  "dmPolicy": {
327
371
  "type": "string",
@@ -607,7 +651,7 @@
607
651
  },
608
652
  "clientSecret": {
609
653
  "label": "DingTalk Client Secret",
610
- "help": "App Secret used to obtain DingTalk access tokens.",
654
+ "help": "App Secret used to obtain DingTalk access tokens. SecretInput file references are for trusted plugin configuration because file reads a local path.",
611
655
  "sensitive": true
612
656
  },
613
657
  "dmPolicy": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@soimy/dingtalk",
3
- "version": "3.6.0",
3
+ "version": "3.6.2-beta.1",
4
4
  "description": "DingTalk (钉钉) channel plugin for OpenClaw",
5
5
  "keywords": [
6
6
  "bot",
@@ -19,19 +19,34 @@
19
19
  "url": "git+https://github.com/soimy/openclaw-channel-dingtalk.git"
20
20
  },
21
21
  "files": [
22
+ "dist/**/*.js",
23
+ "dist/**/*.js.map",
24
+ "dist/**/*.d.ts",
25
+ "dist/**/*.d.ts.map",
22
26
  "index.ts",
23
27
  "src/**/*.ts",
24
28
  "openclaw.plugin.json",
25
- "clawbot.plugin.json"
29
+ "README.md",
30
+ "LICENSE"
26
31
  ],
27
32
  "type": "module",
28
33
  "packageManager": "pnpm@10.33.0",
29
- "main": "index.ts",
34
+ "main": "./dist/index.js",
35
+ "types": "./dist/index.d.ts",
36
+ "exports": {
37
+ ".": {
38
+ "types": "./dist/index.d.ts",
39
+ "default": "./dist/index.js"
40
+ }
41
+ },
30
42
  "publishConfig": {
31
43
  "access": "public",
32
44
  "registry": "https://registry.npmjs.org/"
33
45
  },
34
46
  "scripts": {
47
+ "build": "pnpm run build:runtime && pnpm run build:types",
48
+ "build:runtime": "node scripts/build-runtime.mjs",
49
+ "build:types": "tsc -p tsconfig.build.json",
35
50
  "format": "oxfmt --write package.json tsconfig.json index.ts src/*.ts",
36
51
  "format:check": "oxfmt --check package.json tsconfig.json index.ts src/*.ts",
37
52
  "lint": "oxlint --type-aware index.ts src",
@@ -41,6 +56,8 @@
41
56
  "docs:build": "vitepress build docs",
42
57
  "docs:preview": "vitepress preview docs --host 127.0.0.1 --port 4173",
43
58
  "monitor:stream": "node scripts/dingtalk-stream-monitor.mjs",
59
+ "pack:check": "node scripts/verify-runtime-package.mjs",
60
+ "prepack": "pnpm run build",
44
61
  "test": "vitest run",
45
62
  "test:coverage": "vitest run --coverage",
46
63
  "type-check": "tsc -p tsconfig.json"
@@ -56,9 +73,10 @@
56
73
  "devDependencies": {
57
74
  "@types/node": "^25.2.0",
58
75
  "@vitest/coverage-v8": "^3.2.4",
76
+ "esbuild": "^0.27.3",
59
77
  "oxfmt": "0.34.0",
60
- "oxlint": "^1.49.0",
61
- "oxlint-tsgolint": "^0.18.0",
78
+ "oxlint": "1.49.0",
79
+ "oxlint-tsgolint": "0.18.1",
62
80
  "typescript": "^5.3.0",
63
81
  "vitepress": "1.6.4",
64
82
  "vitest": "^3.2.4"
@@ -81,6 +99,9 @@
81
99
  "extensions": [
82
100
  "./index.ts"
83
101
  ],
102
+ "runtimeExtensions": [
103
+ "./dist/index.js"
104
+ ],
84
105
  "channels": [
85
106
  "dingtalk"
86
107
  ],
package/src/auth.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { resolveRuntimeConfig } from "./config";
1
2
  import axios from "./http-client";
2
3
  import type { DingTalkConfig, Logger, TokenInfo } from "./types";
3
4
  import { retryWithBackoff } from "./utils";
@@ -23,13 +24,15 @@ export async function getAccessToken(config: DingTalkConfig, log?: Logger): Prom
23
24
  return cached.accessToken;
24
25
  }
25
26
 
27
+ const runtimeConfig = await resolveRuntimeConfig(config, log);
28
+
26
29
  const token = await retryWithBackoff(
27
30
  async () => {
28
31
  const response = await axios.post<TokenInfo>(
29
32
  "https://api.dingtalk.com/v1.0/oauth2/accessToken",
30
33
  {
31
- appKey: config.clientId,
32
- appSecret: config.clientSecret,
34
+ appKey: runtimeConfig.clientId,
35
+ appSecret: runtimeConfig.clientSecret,
33
36
  },
34
37
  );
35
38
 
@@ -216,6 +216,10 @@ export function incrementCardDapiCount(card: AICardInstance): number {
216
216
  return next;
217
217
  }
218
218
 
219
+ function markStreamingLifecycleAcknowledged(card: AICardInstance, finished: boolean): void {
220
+ card.streamLifecycleOpened = !finished;
221
+ }
222
+
219
223
  function extractCardProcessQueryKey(payload: unknown): string | undefined {
220
224
  if (!payload || typeof payload !== "object") {
221
225
  return undefined;
@@ -238,6 +242,7 @@ async function putAICardStreamingField(
238
242
  content: string,
239
243
  finished: boolean,
240
244
  log?: Logger,
245
+ options: { suppressDegrade?: boolean } = {},
241
246
  ): Promise<void> {
242
247
  const tokenAge = Date.now() - card.createdAt;
243
248
  const tokenRefreshThreshold = 90 * 60 * 1000;
@@ -283,6 +288,7 @@ async function putAICardStreamingField(
283
288
  );
284
289
  card.lastUpdated = Date.now();
285
290
  incrementCardDapiCount(card);
291
+ markStreamingLifecycleAcknowledged(card, finished);
286
292
  } catch (err: any) {
287
293
  if (err.response?.status === 401 && card.config && !tokenAlreadyRefreshed) {
288
294
  log?.warn?.("[DingTalk][AICard] Received 401 error, attempting token refresh and retry...");
@@ -300,6 +306,7 @@ async function putAICardStreamingField(
300
306
  );
301
307
  card.lastUpdated = Date.now();
302
308
  incrementCardDapiCount(card);
309
+ markStreamingLifecycleAcknowledged(card, finished);
303
310
  return;
304
311
  } catch (retryErr: any) {
305
312
  log?.error?.(`[DingTalk][AICard] Retry after token refresh failed: ${retryErr.message}`);
@@ -315,7 +322,7 @@ async function putAICardStreamingField(
315
322
  }
316
323
  }
317
324
 
318
- if (card.accountId && shouldTriggerAICardDegrade(err)) {
325
+ if (!options.suppressDegrade && card.accountId && shouldTriggerAICardDegrade(err)) {
319
326
  activateAICardDegrade(
320
327
  card.accountId,
321
328
  `card.stream:${err?.response?.status || "unknown"}`,
@@ -355,6 +362,7 @@ interface PendingCardRecord {
355
362
  state: string;
356
363
  lastContent?: string;
357
364
  lastBlockListJson?: string;
365
+ streamLifecycleOpened?: boolean;
358
366
  }
359
367
 
360
368
  interface PendingCardStateFile {
@@ -393,7 +401,8 @@ function normalizePendingState(parsed: Partial<PendingCardStateFile>): PendingCa
393
401
  (entry.outTrackId === undefined || typeof entry.outTrackId === "string") &&
394
402
  typeof entry.conversationId === "string" &&
395
403
  (entry.lastContent === undefined || typeof entry.lastContent === "string") &&
396
- (entry.lastBlockListJson === undefined || typeof entry.lastBlockListJson === "string"),
404
+ (entry.lastBlockListJson === undefined || typeof entry.lastBlockListJson === "string") &&
405
+ (entry.streamLifecycleOpened === undefined || typeof entry.streamLifecycleOpened === "boolean"),
397
406
  ),
398
407
  ),
399
408
  };
@@ -467,6 +476,7 @@ function upsertPendingCard(card: AICardInstance, storePath?: string, log?: Logge
467
476
  state: card.state,
468
477
  lastContent: card.lastStreamedContent,
469
478
  lastBlockListJson: card.lastBlockListJson,
479
+ streamLifecycleOpened: card.streamLifecycleOpened,
470
480
  };
471
481
  const index = state.pendingCards.findIndex((item) => item.cardInstanceId === card.cardInstanceId);
472
482
  if (index >= 0) {
@@ -647,7 +657,11 @@ export async function sendProactiveCardText(
647
657
  if (!card) {
648
658
  return { ok: false, error: "Failed to create AI card" };
649
659
  }
650
- await finishAICard(card, content, log);
660
+ const blockListJson = JSON.stringify([{ type: 0, markdown: content } satisfies CardBlock]);
661
+ await commitAICardBlocks(card, {
662
+ blockListJson,
663
+ content,
664
+ }, log);
651
665
  return {
652
666
  ok: true,
653
667
  processQueryKey: card.processQueryKey,
@@ -733,6 +747,7 @@ async function finalizePendingCardsByAccount(
733
747
  config,
734
748
  lastStreamedContent: entry.lastContent,
735
749
  lastBlockListJson: entry.lastBlockListJson,
750
+ streamLifecycleOpened: entry.streamLifecycleOpened,
736
751
  };
737
752
  try {
738
753
  await finalizeStoppedAICard(card, {
@@ -783,12 +798,13 @@ export async function createAICard(
783
798
  // DingTalk createAndDeliver API payload.
784
799
  // Note: do NOT include template.statusKey here — the createAndDeliver API may
785
800
  // reject unknown fields if the template variable is not yet provisioned.
786
- // Status is set to "streaming" via the streaming API immediately after creation.
801
+ // flowStatus=2 (INPUTING) is set directly so the card shows "输出中" immediately.
787
802
  const cardParamMap = {
788
803
  config: JSON.stringify({ autoLayout: true, enableForward: true }),
789
804
  [template.streamingKey]: "",
790
805
  quoteContent: options.quoteContent || "",
791
806
  ...(options.statusLine?.trim() ? { statusLine: options.statusLine } : {}),
807
+ flowStatus: AICardStatus.INPUTING,
792
808
  // V2 template uses hasAction (string), V1 uses stop_action (string)
793
809
  // DingTalk cardParamMap requires all values to be strings
794
810
  hasAction: String(STOP_ACTION_VISIBLE),
@@ -894,18 +910,6 @@ export async function createAICard(
894
910
 
895
911
  clearAICardDegrade(accountId, log);
896
912
 
897
- // Kick the card into streaming mode immediately so the UI shows "输出中" and the
898
- // stop button becomes visible. Without this, the card sits in "创建中" skeleton state
899
- // until the first real content arrives — which may never happen for non-streaming replies.
900
- // This sends an empty content stream (isFull=true, isFinalize=false) which transitions
901
- // the card from PROCESSING to INPUTING on the DingTalk side.
902
- try {
903
- await putAICardStreamingField(aiCardInstance, template.contentKey, "", false, log);
904
- aiCardInstance.state = AICardStatus.INPUTING;
905
- } catch (kickErr: any) {
906
- log?.debug?.(`[DingTalk][AICard] Non-critical: failed to kick card into streaming mode: ${kickErr.message}`);
907
- }
908
-
909
913
  return aiCardInstance;
910
914
  } catch (err: any) {
911
915
  log?.error?.(`[DingTalk][AICard] Create failed: ${err.message}`);
@@ -1043,6 +1047,25 @@ export async function clearAICardStreamingContent(
1043
1047
  }
1044
1048
  }
1045
1049
 
1050
+ async function finalizeAICardStreamingLifecycleIfNeeded(
1051
+ card: AICardInstance,
1052
+ content: string,
1053
+ log?: Logger,
1054
+ ): Promise<void> {
1055
+ if (!card.streamLifecycleOpened) {
1056
+ return;
1057
+ }
1058
+ const template = DINGTALK_CARD_TEMPLATE;
1059
+ try {
1060
+ await putAICardStreamingField(card, template.streamingKey, content, true, log, {
1061
+ suppressDegrade: true,
1062
+ });
1063
+ } catch (err: unknown) {
1064
+ const message = err instanceof Error ? err.message : String(err);
1065
+ log?.warn?.(`[DingTalk][AICard] Streaming lifecycle finalize failed; continuing instances finalize: ${message}`);
1066
+ }
1067
+ }
1068
+
1046
1069
  /**
1047
1070
  * Options for finalizing an AI Card via instances API.
1048
1071
  * All variables are written in a single API call for V2 template compatibility.
@@ -1078,6 +1101,7 @@ export async function commitAICardBlocks(
1078
1101
  }
1079
1102
 
1080
1103
  await ensureFreshToken(card, log);
1104
+ await finalizeAICardStreamingLifecycleIfNeeded(card, options.content, log);
1081
1105
 
1082
1106
  const template = DINGTALK_CARD_TEMPLATE;
1083
1107
  const updates: Record<string, unknown> = {
@@ -1371,6 +1395,7 @@ export async function finalizeStoppedAICard(
1371
1395
  await ensureFreshToken(card, log);
1372
1396
  const template = DINGTALK_CARD_TEMPLATE;
1373
1397
  const payload = buildStoppedCardFinalizePayload(options);
1398
+ await finalizeAICardStreamingLifecycleIfNeeded(card, payload.content, log);
1374
1399
  try {
1375
1400
  await updateCardVariables(
1376
1401
  card.outTrackId || card.cardInstanceId,
package/src/channel.ts CHANGED
@@ -9,6 +9,7 @@ import { dingtalkSetupAdapter, dingtalkSetupWizard } from "./onboarding.js";
9
9
  import { createDingTalkMessageActions } from "./messaging/channel-actions";
10
10
  import { createDingTalkOutbound } from "./messaging/channel-outbound";
11
11
  import { createDingTalkStatus } from "./platform/channel-status";
12
+ import { hasConfiguredSecretInput } from "./secret-input";
12
13
  import {
13
14
  listDingTalkDirectoryGroups,
14
15
  listDingTalkDirectoryUsers,
@@ -54,7 +55,9 @@ export const dingtalkPlugin: DingTalkChannelPlugin = {
54
55
  const id = accountId || "default";
55
56
  const account = config.accounts?.[id];
56
57
  const resolvedConfig = account ? mergeAccountWithDefaults(config, account) : config;
57
- const configured = Boolean(resolvedConfig.clientId && resolvedConfig.clientSecret);
58
+ const configured = Boolean(
59
+ resolvedConfig.clientId && hasConfiguredSecretInput(resolvedConfig.clientSecret),
60
+ );
58
61
  return {
59
62
  accountId: id,
60
63
  config: resolvedConfig,
@@ -65,7 +68,7 @@ export const dingtalkPlugin: DingTalkChannelPlugin = {
65
68
  },
66
69
  defaultAccountId: (): string => "default",
67
70
  isConfigured: (account: ResolvedAccount): boolean =>
68
- Boolean(account.config?.clientId && account.config?.clientSecret),
71
+ Boolean(account.config?.clientId && hasConfiguredSecretInput(account.config?.clientSecret)),
69
72
  describeAccount: (account: ResolvedAccount) => ({
70
73
  accountId: account.accountId,
71
74
  name: account.config?.name || "DingTalk",
@@ -1,5 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { DEFAULT_MESSAGE_CONTEXT_TTL_DAYS } from "./message-context-store";
3
+ import { buildSecretInputSchema } from "./secret-input";
3
4
 
4
5
  const AckReactionSchema = z.union([
5
6
  z.literal(""),
@@ -29,7 +30,7 @@ const DingTalkAccountConfigShape = {
29
30
  clientId: z.string().optional(),
30
31
 
31
32
  /** DingTalk App Secret (Client Secret) used to obtain DingTalk access tokens. */
32
- clientSecret: z.string().optional(),
33
+ clientSecret: buildSecretInputSchema().optional(),
33
34
 
34
35
  /** Direct-message access policy: open, pairing, or allowlist. */
35
36
  dmPolicy: z.enum(["open", "pairing", "allowlist"]).optional().default("open"),
package/src/config.ts CHANGED
@@ -1,17 +1,13 @@
1
- import * as os from "node:os";
2
- import * as path from "node:path";
3
1
  import type { OpenClawConfig } from "openclaw/plugin-sdk/core";
2
+ import {
3
+ formatSecretInputResolutionFailure,
4
+ hasConfiguredSecretInput,
5
+ resolveDingTalkSecretConfig,
6
+ } from "./secret-input";
4
7
  import type { DingTalkChannelConfig, DingTalkConfig } from "./types";
5
-
6
- const WINDOWS_ROOT_DIRECTORIES = new Set([
7
- "Users",
8
- "Program Files",
9
- "Program Files (x86)",
10
- "ProgramData",
11
- "Windows",
12
- "Documents and Settings",
13
- ]);
8
+ export { resolveRelativePath, resolveUserPath } from "./path-utils";
14
9
  const DEFAULT_LEARNING_NOTE_TTL_MS = 6 * 60 * 60 * 1000;
10
+ export type RuntimeDingTalkConfig = Omit<DingTalkConfig, "clientSecret"> & { clientSecret: string };
15
11
 
16
12
  function normalizeLearningConfig(
17
13
  config: DingTalkConfig,
@@ -114,65 +110,26 @@ export function getConfig(cfg: OpenClawConfig, accountId?: string): DingTalkConf
114
110
 
115
111
  export function isConfigured(cfg: OpenClawConfig, accountId?: string): boolean {
116
112
  const config = getConfig(cfg, accountId);
117
- return Boolean(config.clientId && config.clientSecret);
113
+ return Boolean(config.clientId && hasConfiguredSecretInput(config.clientSecret));
118
114
  }
119
115
 
120
- /**
121
- * Resolve relative paths against a base directory, with intelligent platform-specific handling.
122
- *
123
- * Supports:
124
- * - ~ and ~/ expansion to home directory
125
- * - Absolute paths (Unix: /path, Windows: \path or C:\path)
126
- * - Relative paths resolved against cwd
127
- * - Windows absolute paths without drive letters (e.g., Users\name\.openclaw\file.txt)
128
- * - Mixed path separators (/ and \)
129
- *
130
- * @param input - The path string to resolve
131
- * @returns The resolved absolute path
132
- */
133
- export function resolveRelativePath(input: string): string {
134
- const trimmed = input.trim();
135
- if (!trimmed) {
136
- return trimmed;
137
- }
138
-
139
- const segments = (value: string): string[] => value.split(/[\\/]+/).filter(Boolean);
140
- const pathSegments = segments(trimmed);
141
- const firstSegment = pathSegments[0];
142
-
143
- // Expand bare "~" and "~/" or "~\\" prefixes into the user home directory.
144
- if (trimmed === "~") {
145
- return path.resolve(os.homedir());
146
- }
147
- if (trimmed.startsWith("~/") || trimmed.startsWith("~\\")) {
148
- return path.resolve(os.homedir(), ...segments(trimmed.slice(2)));
149
- }
150
-
151
- if (process.platform === "win32") {
152
- // On Windows, OpenClaw may drop the leading "\" from root-based paths like
153
- // "Users\name\.openclaw\workspace\file.xlsx". Only recover paths that start
154
- // with well-known root directories to avoid misclassifying ordinary relative paths.
155
- if (/^[a-zA-Z]:[\\/]/.test(trimmed)) {
156
- return path.win32.normalize(trimmed);
157
- }
158
- if (firstSegment && /^[a-zA-Z]:$/.test(firstSegment)) {
159
- return path.win32.resolve(`${firstSegment}\\`, ...pathSegments.slice(1));
160
- }
161
- if (firstSegment && WINDOWS_ROOT_DIRECTORIES.has(firstSegment)) {
162
- return path.win32.resolve("\\", ...pathSegments);
163
- }
164
- }
165
- // Treat both "/" and "\\" as absolute root prefixes for cross-platform input.
166
- if (/^[\\/]/.test(trimmed)) {
167
- return path.resolve(path.sep, ...pathSegments);
116
+ export async function resolveRuntimeConfig(
117
+ config: DingTalkConfig,
118
+ log?: { warn?: (message: string, data?: unknown) => void },
119
+ ): Promise<RuntimeDingTalkConfig> {
120
+ const resolved = await resolveDingTalkSecretConfig(config, log);
121
+ if (!resolved.clientId || !resolved.clientSecret) {
122
+ const secretFailure = resolved.clientSecretResolutionFailure
123
+ ? `: clientSecret resolution failed for ${formatSecretInputResolutionFailure(resolved.clientSecretResolutionFailure)}`
124
+ : "";
125
+ throw new Error(`DingTalk clientId and resolved clientSecret are required${secretFailure}`);
168
126
  }
169
-
170
- // Resolve relative path against cwd; supports mixed separators and "..\\..".
171
- return path.resolve(process.cwd(), ...pathSegments);
127
+ return {
128
+ ...resolved,
129
+ clientSecret: resolved.clientSecret,
130
+ };
172
131
  }
173
132
 
174
- export const resolveUserPath = resolveRelativePath;
175
-
176
133
  /**
177
134
  * Resolve the robot code used by DingTalk APIs.
178
135
  * DingTalk robotCode is always equal to clientId; this helper trims whitespace.
@@ -363,7 +320,7 @@ export function resolveDingTalkAccount(
363
320
  return {
364
321
  ...config,
365
322
  accountId: id,
366
- configured: Boolean(config.clientId && config.clientSecret),
323
+ configured: Boolean(config.clientId && hasConfiguredSecretInput(config.clientSecret)),
367
324
  };
368
325
  }
369
326
 
@@ -377,7 +334,7 @@ export function resolveDingTalkAccount(
377
334
  return {
378
335
  ...publicMerged,
379
336
  accountId: id,
380
- configured: Boolean(merged.clientId && merged.clientSecret),
337
+ configured: Boolean(merged.clientId && hasConfiguredSecretInput(merged.clientSecret)),
381
338
  };
382
339
  }
383
340
 
@@ -1,4 +1,3 @@
1
- import { execFile } from "node:child_process";
2
1
  import httpClient from "./http-client.js";
3
2
 
4
3
  // ── Constants ──────────────────────────────────────────────────────────────
@@ -212,34 +211,3 @@ export async function beginDeviceRegistration(): Promise<DeviceRegistrationSessi
212
211
 
213
212
  return { verificationUrl, waitForResult };
214
213
  }
215
-
216
- // ── Browser helper ─────────────────────────────────────────────────────────
217
-
218
- export function openUrlInBrowser(url: string): void {
219
- // Validate URL before handing to OS launcher
220
- try {
221
- const parsed = new URL(url);
222
- if (parsed.protocol !== "https:" || !parsed.hostname.endsWith(".dingtalk.com")) {
223
- return;
224
- }
225
- } catch {
226
- return;
227
- }
228
-
229
- const platform = process.platform;
230
- let bin: string;
231
- let args: string[];
232
- if (platform === "darwin") {
233
- bin = "open";
234
- args = [url];
235
- } else if (platform === "win32") {
236
- bin = "cmd";
237
- args = ["/c", "start", "", url];
238
- } else {
239
- bin = "xdg-open";
240
- args = [url];
241
- }
242
- execFile(bin, args, (err) => {
243
- void err;
244
- });
245
- }