dsh-connect 0.8.0 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/README.i18n.yaml +2 -2
  2. package/README.md +236 -18
  3. package/README.zh.md +185 -18
  4. package/client/client.js +517 -84
  5. package/client/client.js.map +4 -4
  6. package/client/locale.mjs +227 -0
  7. package/client/panel-state.mjs +54 -0
  8. package/client/settings-client.mjs +282 -61
  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/lib/binding.d.ts.map +1 -1
  16. package/lib/binding.js +2 -2
  17. package/lib/binding.js.map +1 -1
  18. package/lib/channels/dingtalk/index.d.ts +49 -49
  19. package/lib/channels/dingtalk/index.d.ts.map +1 -1
  20. package/lib/channels/dingtalk/message.d.ts.map +1 -1
  21. package/lib/channels/dingtalk/message.js +7 -0
  22. package/lib/channels/dingtalk/message.js.map +1 -1
  23. package/lib/channels/feishu/adapter.d.ts +14 -13
  24. package/lib/channels/feishu/adapter.d.ts.map +1 -1
  25. package/lib/channels/feishu/adapter.js +122 -56
  26. package/lib/channels/feishu/adapter.js.map +1 -1
  27. package/lib/channels/feishu/i18n.d.ts +2 -0
  28. package/lib/channels/feishu/i18n.d.ts.map +1 -1
  29. package/lib/channels/feishu/i18n.js +2 -0
  30. package/lib/channels/feishu/i18n.js.map +1 -1
  31. package/lib/channels/feishu/index.d.ts +48 -27
  32. package/lib/channels/feishu/index.d.ts.map +1 -1
  33. package/lib/channels/feishu/index.js +32 -6
  34. package/lib/channels/feishu/index.js.map +1 -1
  35. package/lib/channels/telegram/adapter.d.ts.map +1 -1
  36. package/lib/channels/telegram/adapter.js +7 -1
  37. package/lib/channels/telegram/adapter.js.map +1 -1
  38. package/lib/channels/telegram/index.d.ts +13 -13
  39. package/lib/channels/telegram/index.d.ts.map +1 -1
  40. package/lib/channels/web/adapter.d.ts +3 -1
  41. package/lib/channels/web/adapter.d.ts.map +1 -1
  42. package/lib/channels/web/adapter.js +3 -1
  43. package/lib/channels/web/adapter.js.map +1 -1
  44. package/lib/channels/web/index.d.ts +5 -5
  45. package/lib/channels/web/index.d.ts.map +1 -1
  46. package/lib/chat-key.d.ts +29 -0
  47. package/lib/chat-key.d.ts.map +1 -0
  48. package/lib/chat-key.js +38 -0
  49. package/lib/chat-key.js.map +1 -0
  50. package/lib/index.d.ts +57 -63
  51. package/lib/index.d.ts.map +1 -1
  52. package/lib/index.js +330 -55
  53. package/lib/index.js.map +1 -1
  54. package/lib/interaction.d.ts +90 -50
  55. package/lib/interaction.d.ts.map +1 -1
  56. package/lib/interaction.js +233 -272
  57. package/lib/interaction.js.map +1 -1
  58. package/lib/retry.d.ts.map +1 -1
  59. package/lib/retry.js +7 -1
  60. package/lib/retry.js.map +1 -1
  61. package/lib/runner.d.ts +54 -0
  62. package/lib/runner.d.ts.map +1 -1
  63. package/lib/runner.js +158 -23
  64. package/lib/runner.js.map +1 -1
  65. package/lib/scheduler.d.ts.map +1 -1
  66. package/lib/scheduler.js +2 -2
  67. package/lib/scheduler.js.map +1 -1
  68. package/lib/service.d.ts +16 -0
  69. package/lib/service.d.ts.map +1 -1
  70. package/lib/service.js +46 -4
  71. package/lib/service.js.map +1 -1
  72. package/lib/settings/channel-runtime.d.ts +75 -0
  73. package/lib/settings/channel-runtime.d.ts.map +1 -0
  74. package/lib/settings/channel-runtime.js +165 -0
  75. package/lib/settings/channel-runtime.js.map +1 -0
  76. package/lib/settings/channels.d.ts +11 -0
  77. package/lib/settings/channels.d.ts.map +1 -1
  78. package/lib/settings/channels.js +31 -0
  79. package/lib/settings/channels.js.map +1 -1
  80. package/lib/settings/credential-store.d.ts +52 -6
  81. package/lib/settings/credential-store.d.ts.map +1 -1
  82. package/lib/settings/credential-store.js +92 -18
  83. package/lib/settings/credential-store.js.map +1 -1
  84. package/lib/settings/legacy-import.d.ts +190 -0
  85. package/lib/settings/legacy-import.d.ts.map +1 -0
  86. package/lib/settings/legacy-import.js +373 -0
  87. package/lib/settings/legacy-import.js.map +1 -0
  88. package/lib/settings/namespace.d.ts +263 -0
  89. package/lib/settings/namespace.d.ts.map +1 -0
  90. package/lib/settings/namespace.js +287 -0
  91. package/lib/settings/namespace.js.map +1 -0
  92. package/lib/settings/secret-disclosure.d.ts +50 -0
  93. package/lib/settings/secret-disclosure.d.ts.map +1 -0
  94. package/lib/settings/secret-disclosure.js +132 -0
  95. package/lib/settings/secret-disclosure.js.map +1 -0
  96. package/lib/settings/settings-model.d.ts +17 -0
  97. package/lib/settings/settings-model.d.ts.map +1 -1
  98. package/lib/settings/settings-model.js +18 -1
  99. package/lib/settings/settings-model.js.map +1 -1
  100. package/lib/settings/settings-rpc.d.ts +71 -3
  101. package/lib/settings/settings-rpc.d.ts.map +1 -1
  102. package/lib/settings/settings-rpc.js +167 -24
  103. package/lib/settings/settings-rpc.js.map +1 -1
  104. package/lib/settings/settings-service.d.ts +22 -1
  105. package/lib/settings/settings-service.d.ts.map +1 -1
  106. package/lib/settings/settings-service.js +145 -8
  107. package/lib/settings/settings-service.js.map +1 -1
  108. package/lib/state-dir.d.ts +28 -0
  109. package/lib/state-dir.d.ts.map +1 -0
  110. package/lib/state-dir.js +33 -0
  111. package/lib/state-dir.js.map +1 -0
  112. package/lib/stream.d.ts.map +1 -1
  113. package/lib/stream.js +3 -2
  114. package/lib/stream.js.map +1 -1
  115. package/lib/types.d.ts +14 -1
  116. package/lib/types.d.ts.map +1 -1
  117. package/package.json +13 -10
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Live channel lifecycle for dsh-connect.
3
+ *
4
+ * `activateChannels` starts a fixed set of adapters once, at load time. Once
5
+ * the channel list is user-editable (the `dsh-connect` settings namespace) the
6
+ * plugin needs the other half of that story: a channel removed from
7
+ * `channels[]` has to be *stopped*, and one whose config changed has to be
8
+ * restarted with the new values.
9
+ *
10
+ * Two properties this class exists to guarantee:
11
+ *
12
+ * - **Stop before start.** A reconfigured Feishu adapter must release its long
13
+ * connection before the replacement opens one. Two live connections for the
14
+ * same app deliver every event twice, which looks like the bot answering
15
+ * itself rather than like a crash.
16
+ * - **Serialised applies.** A settings edit can fire `onChange` more than once
17
+ * in a burst (and the provider's file watcher debounces on its own schedule).
18
+ * Applies are chained, so a stop can never interleave with the next start.
19
+ *
20
+ * Kept free of cordis and channel-SDK imports so it is unit-testable with fake
21
+ * adapters.
22
+ * @module dsh-connect/settings/channel-runtime
23
+ */
24
+ import { type ChannelApply, type ChannelName, type ChannelsConfig, type LoggerLike } from "./channels.js";
25
+ /** Why a channel was stopped — used only for the log line. */
26
+ export type StopReason = "disabled" | "reconfigured" | "shutdown";
27
+ export interface ChannelRuntimeOptions<Ctx extends LoggerLike> {
28
+ /** Context handed to each channel's `apply`. */
29
+ ctx: Ctx;
30
+ /** Channel name → its plugin `apply`, as in `activateChannels`. */
31
+ channels: Record<string, ChannelApply<Ctx>>;
32
+ /**
33
+ * Stop a channel that is running. Wired to `ConnectService.unregisterAdapter`
34
+ * so the adapter is dropped from the routing map *and* torn down; a runtime
35
+ * that only knew how to start would leak connections on every settings edit.
36
+ */
37
+ teardown: (name: ChannelName) => Promise<void>;
38
+ /**
39
+ * Refresh store-backed secrets before computing each channel's effective
40
+ * config (same source `apply` uses at boot). Optional so tests can skip it.
41
+ */
42
+ getSecrets?: (name: ChannelName) => Promise<Record<string, string>>;
43
+ }
44
+ /**
45
+ * Owns which channels are currently running and reconciles that set against a
46
+ * desired config on every change.
47
+ */
48
+ export declare class ChannelRuntime<Ctx extends LoggerLike = LoggerLike> {
49
+ private readonly opts;
50
+ /** Channel → the effective config it was started with. */
51
+ private readonly running;
52
+ /** Tail of the apply chain; see "Serialised applies" above. */
53
+ private chain;
54
+ private disposed;
55
+ constructor(options: ChannelRuntimeOptions<Ctx>);
56
+ /** Channels currently up, in activation order. */
57
+ active(): ChannelName[];
58
+ /**
59
+ * Bring the running set in line with `config`. Channels that are new start,
60
+ * channels that are gone or whose effective config changed restart.
61
+ *
62
+ * Never rejects: a channel that fails to start or stop is logged and the
63
+ * others still get their chance. A settings change should not be able to take
64
+ * the whole bridge down.
65
+ */
66
+ apply(config: ChannelsConfig | null | undefined): Promise<void>;
67
+ /** Stop every running channel. Waits for an in-flight apply first. */
68
+ dispose(): Promise<void>;
69
+ private log;
70
+ private reconcile;
71
+ /** Channel → effective config, mirroring `activateChannels`' merge exactly. */
72
+ private desired;
73
+ private stop;
74
+ }
75
+ //# sourceMappingURL=channel-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-runtime.d.ts","sourceRoot":"","sources":["../../src/settings/channel-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,UAAU,EAChB,MAAM,eAAe,CAAC;AAgCvB,8DAA8D;AAC9D,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,cAAc,GAAG,UAAU,CAAC;AAElE,MAAM,WAAW,qBAAqB,CAAC,GAAG,SAAS,UAAU;IAC3D,gDAAgD;IAChD,GAAG,EAAE,GAAG,CAAC;IACT,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C;;;;OAIG;IACH,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACrE;AAED;;;GAGG;AACH,qBAAa,cAAc,CAAC,GAAG,SAAS,UAAU,GAAG,UAAU;IAC7D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA6B;IAClD,0DAA0D;IAC1D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAC3D,+DAA+D;IAC/D,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,EAAE,qBAAqB,CAAC,GAAG,CAAC;IAI/C,kDAAkD;IAClD,MAAM,IAAI,WAAW,EAAE;IAIvB;;;;;;;OAOG;IACH,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAa/D,sEAAsE;IAChE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAM9B,OAAO,CAAC,GAAG;YAIG,SAAS;IA4BvB,+EAA+E;YACjE,OAAO;YA8BP,IAAI;CAWnB"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Live channel lifecycle for dsh-connect.
3
+ *
4
+ * `activateChannels` starts a fixed set of adapters once, at load time. Once
5
+ * the channel list is user-editable (the `dsh-connect` settings namespace) the
6
+ * plugin needs the other half of that story: a channel removed from
7
+ * `channels[]` has to be *stopped*, and one whose config changed has to be
8
+ * restarted with the new values.
9
+ *
10
+ * Two properties this class exists to guarantee:
11
+ *
12
+ * - **Stop before start.** A reconfigured Feishu adapter must release its long
13
+ * connection before the replacement opens one. Two live connections for the
14
+ * same app deliver every event twice, which looks like the bot answering
15
+ * itself rather than like a crash.
16
+ * - **Serialised applies.** A settings edit can fire `onChange` more than once
17
+ * in a burst (and the provider's file watcher debounces on its own schedule).
18
+ * Applies are chained, so a stop can never interleave with the next start.
19
+ *
20
+ * Kept free of cordis and channel-SDK imports so it is unit-testable with fake
21
+ * adapters.
22
+ * @module dsh-connect/settings/channel-runtime
23
+ */
24
+ import { CHANNELS, injectSecrets, } from "./channels.js";
25
+ /**
26
+ * Deterministically serialise a config value for comparison.
27
+ *
28
+ * `JSON.stringify` alone would be enough for values from one source, but the
29
+ * effective config is a spread of `channelDefaults` and per-channel overrides
30
+ * whose key order depends on how the user wrote the YAML. Sorting keys keeps a
31
+ * cosmetic reorder in `settings.yaml` from tearing down a healthy connection.
32
+ */
33
+ function stableStringify(value) {
34
+ if (value === null || typeof value !== "object")
35
+ return JSON.stringify(value) ?? "undefined";
36
+ if (Array.isArray(value))
37
+ return `[${value.map(stableStringify).join(",")}]`;
38
+ const entries = Object.entries(value)
39
+ .filter(([, v]) => v !== undefined)
40
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
41
+ return `{${entries.map(([k, v]) => `${JSON.stringify(k)}:${stableStringify(v)}`).join(",")}}`;
42
+ }
43
+ /**
44
+ * Deep-copy a plain config object, falling back to the original when it holds
45
+ * something `structuredClone` cannot carry (a function from a test fixture, or
46
+ * a class instance from a hand-written config).
47
+ */
48
+ function clone(value) {
49
+ try {
50
+ return structuredClone(value);
51
+ }
52
+ catch {
53
+ return value;
54
+ }
55
+ }
56
+ /**
57
+ * Owns which channels are currently running and reconciles that set against a
58
+ * desired config on every change.
59
+ */
60
+ export class ChannelRuntime {
61
+ opts;
62
+ /** Channel → the effective config it was started with. */
63
+ running = new Map();
64
+ /** Tail of the apply chain; see "Serialised applies" above. */
65
+ chain = Promise.resolve();
66
+ disposed = false;
67
+ constructor(options) {
68
+ this.opts = options;
69
+ }
70
+ /** Channels currently up, in activation order. */
71
+ active() {
72
+ return [...this.running.keys()];
73
+ }
74
+ /**
75
+ * Bring the running set in line with `config`. Channels that are new start,
76
+ * channels that are gone or whose effective config changed restart.
77
+ *
78
+ * Never rejects: a channel that fails to start or stop is logged and the
79
+ * others still get their chance. A settings change should not be able to take
80
+ * the whole bridge down.
81
+ */
82
+ apply(config) {
83
+ const run = this.chain.then(() => this.reconcile(config ?? {}), () => this.reconcile(config ?? {}));
84
+ // Keep the chain alive regardless of this apply's outcome.
85
+ this.chain = run.then(() => undefined, () => undefined);
86
+ return run;
87
+ }
88
+ /** Stop every running channel. Waits for an in-flight apply first. */
89
+ async dispose() {
90
+ this.disposed = true;
91
+ await this.chain;
92
+ for (const name of [...this.running.keys()])
93
+ await this.stop(name, "shutdown");
94
+ }
95
+ log(message) {
96
+ this.opts.ctx.logger?.warn?.(message);
97
+ }
98
+ async reconcile(config) {
99
+ if (this.disposed)
100
+ return;
101
+ const desired = await this.desired(config);
102
+ // Stop first, start second: see the module comment on double delivery.
103
+ for (const [name, current] of [...this.running]) {
104
+ const next = desired.get(name);
105
+ if (next === undefined) {
106
+ await this.stop(name, "disabled");
107
+ }
108
+ else if (stableStringify(current) !== stableStringify(next)) {
109
+ await this.stop(name, "reconfigured");
110
+ }
111
+ }
112
+ for (const [name, channelConfig] of desired) {
113
+ // Still running and unchanged (nothing above removed it).
114
+ if (this.running.has(name))
115
+ continue;
116
+ const apply = this.opts.channels[name];
117
+ if (apply === undefined)
118
+ continue;
119
+ try {
120
+ apply(this.opts.ctx, channelConfig);
121
+ this.running.set(name, channelConfig);
122
+ }
123
+ catch (error) {
124
+ this.log(`connect: channel "${name}" failed to start: ${String(error)}`);
125
+ }
126
+ }
127
+ }
128
+ /** Channel → effective config, mirroring `activateChannels`' merge exactly. */
129
+ async desired(config) {
130
+ const wanted = config.channels ?? CHANNELS;
131
+ const defaults = config.channelDefaults ?? {};
132
+ // Resolve secrets before the diff so a rotated credential counts as a
133
+ // change and restarts the channel that needs it.
134
+ const source = this.opts.getSecrets === undefined
135
+ ? config
136
+ : await injectSecrets(config, wanted.filter((name) => this.opts.channels[name] !== undefined), this.opts.getSecrets);
137
+ const out = new Map();
138
+ for (const name of wanted) {
139
+ if (this.opts.channels[name] === undefined) {
140
+ this.log(`connect: unknown channel "${name}"; skipped`);
141
+ continue;
142
+ }
143
+ const overrides = source[name] ?? {};
144
+ // Clone rather than alias: a config resolved from the settings namespace
145
+ // is deep-frozen by the provider, so handing an adapter a nested object
146
+ // it later writes to would throw in strict mode instead of quietly
147
+ // working the way it does for a YAML-sourced config.
148
+ out.set(name, { ...clone(defaults), ...clone(overrides) });
149
+ }
150
+ return out;
151
+ }
152
+ async stop(name, reason) {
153
+ // Drop it from the running set first: if teardown throws, the channel is
154
+ // still off the books, and the next apply will try to start it again
155
+ // rather than believing a half-stopped adapter is healthy.
156
+ this.running.delete(name);
157
+ try {
158
+ await this.opts.teardown(name);
159
+ }
160
+ catch (error) {
161
+ this.log(`connect: channel "${name}" failed to stop (${reason}): ${String(error)}`);
162
+ }
163
+ }
164
+ }
165
+ //# sourceMappingURL=channel-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-runtime.js","sourceRoot":"","sources":["../../src/settings/channel-runtime.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,8 @@
8
8
  export type ChannelName = "feishu" | "telegram" | "dingtalk" | "web";
9
9
  /** Config for the connect plugin: which channels + their per-channel config. */
10
10
  export interface ChannelsConfig {
11
+ /** Directory holding `bindings.json` / `reminders.json` / the settings document. */
12
+ stateDir?: string;
11
13
  /** Optional path to persist web-settings edits (non-secret). */
12
14
  settingsStatePath?: string;
13
15
  /** Keys applied to every channel that doesn't set its own (e.g. a shared `language`). */
@@ -39,6 +41,15 @@ export declare const CHANNELS: readonly ChannelName[];
39
41
  * @returns the channel names that were started.
40
42
  */
41
43
  export declare function activateChannels<Ctx extends LoggerLike>(ctx: Ctx, config: ChannelsConfig | null | undefined, channels: Record<string, ChannelApply<Ctx>>): string[];
44
+ /**
45
+ * Extract the build-time secret values (configKey → value) that a channel config
46
+ * carries for a given secret-key map, reading each key at its *actual* config
47
+ * location (flat at the channel root, or nested per `NESTED_SECRET_KEYS` — e.g.
48
+ * dingtalk's `stream.clientId`). Only non-empty string values are returned, so it
49
+ * doubles as the source for migrating config-file secrets into the credential
50
+ * store on boot. Read-only: never mutates `config`.
51
+ */
52
+ export declare function extractConfigSecrets(config: Record<string, unknown> | undefined, channel: ChannelName, secretKeys: Record<string, string>): Record<string, string>;
42
53
  /**
43
54
  * Return a shallow-cloned config whose enabled channels are enriched with the
44
55
  * secrets returned by `getSecrets` (stored secrets win over channel config).
@@ -1 +1 @@
1
- {"version":3,"file":"channels.d.ts","sourceRoot":"","sources":["../../src/settings/channels.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wDAAwD;AACxD,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,KAAK,CAAC;AAErE,gFAAgF;AAChF,MAAM,WAAW,cAAc;IAC7B,gEAAgE;IAChE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,yFAAyF;IACzF,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,iEAAiE;IACjE,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,yEAAyE;AACzE,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;KAAE,GAAG,SAAS,CAAC;CAC9D;AAED,+EAA+E;AAC/E,MAAM,MAAM,YAAY,CAAC,GAAG,SAAS,UAAU,GAAG,UAAU,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;AAEhG,gFAAgF;AAChF,eAAO,MAAM,QAAQ,EAAE,SAAS,WAAW,EAA8C,CAAC;AAE1F;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,SAAS,UAAU,EACrD,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,EACzC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,GAC1C,MAAM,EAAE,CAoBV;AAyCD;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,SAAS,WAAW,EAAE,EAC/B,UAAU,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACpE,OAAO,CAAC,cAAc,CAAC,CAiBzB"}
1
+ {"version":3,"file":"channels.d.ts","sourceRoot":"","sources":["../../src/settings/channels.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wDAAwD;AACxD,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,KAAK,CAAC;AAErE,gFAAgF;AAChF,MAAM,WAAW,cAAc;IAC7B,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,yFAAyF;IACzF,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,iEAAiE;IACjE,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,yEAAyE;AACzE,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;KAAE,GAAG,SAAS,CAAC;CAC9D;AAED,+EAA+E;AAC/E,MAAM,MAAM,YAAY,CAAC,GAAG,SAAS,UAAU,GAAG,UAAU,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;AAEhG,gFAAgF;AAChF,eAAO,MAAM,QAAQ,EAAE,SAAS,WAAW,EAA8C,CAAC;AAE1F;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,SAAS,UAAU,EACrD,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,EACzC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,GAC1C,MAAM,EAAE,CAoBV;AAwBD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC3C,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUxB;AA6BD;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,SAAS,WAAW,EAAE,EAC/B,UAAU,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACpE,OAAO,CAAC,cAAc,CAAC,CAiBzB"}
@@ -49,6 +49,37 @@ const NESTED_SECRET_KEYS = {
49
49
  dingtalk: { clientId: "stream.clientId", clientSecret: "stream.clientSecret" },
50
50
  web: {},
51
51
  };
52
+ /** Read a value at a dotted path (e.g. `"stream.clientId"`), undefined if absent. */
53
+ function readDotPath(obj, path) {
54
+ let node = obj;
55
+ for (const segment of path.split(".")) {
56
+ if (node === null || typeof node !== "object")
57
+ return undefined;
58
+ node = node[segment];
59
+ }
60
+ return node;
61
+ }
62
+ /**
63
+ * Extract the build-time secret values (configKey → value) that a channel config
64
+ * carries for a given secret-key map, reading each key at its *actual* config
65
+ * location (flat at the channel root, or nested per `NESTED_SECRET_KEYS` — e.g.
66
+ * dingtalk's `stream.clientId`). Only non-empty string values are returned, so it
67
+ * doubles as the source for migrating config-file secrets into the credential
68
+ * store on boot. Read-only: never mutates `config`.
69
+ */
70
+ export function extractConfigSecrets(config, channel, secretKeys) {
71
+ if (!config || typeof config !== "object")
72
+ return {};
73
+ const nested = NESTED_SECRET_KEYS[channel] ?? {};
74
+ const out = {};
75
+ for (const configKey of Object.keys(secretKeys)) {
76
+ const path = nested[configKey];
77
+ const value = path ? readDotPath(config, path) : config[configKey];
78
+ if (typeof value === "string" && value.length > 0)
79
+ out[configKey] = value;
80
+ }
81
+ return out;
82
+ }
52
83
  /** Copy `secrets` into `target`, writing nested keys at their dotted path. */
53
84
  function mergeSecrets(target, secrets, nested) {
54
85
  for (const [key, value] of Object.entries(secrets)) {
@@ -1 +1 @@
1
- {"version":3,"file":"channels.js","sourceRoot":"","sources":["../../src/settings/channels.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"channels.js","sourceRoot":"","sources":["../../src/settings/channels.ts"],"names":[],"mappings":"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"}
@@ -3,14 +3,34 @@
3
3
  * `credentials` provider (`resolve/describe/set/unset`, env-style refs) into a
4
4
  * per-channel interface, so secrets live in the DSH credential store instead of
5
5
  * the plugin config (mirroring dsh-im's `credential-store.mjs`). The web
6
- * settings pane only ever sees `configured` booleans, never secret values.
6
+ * settings pane reports `configured` booleans and may echo store-backed secret
7
+ * values (e.g. an appId) so an upgraded user can confirm them, but secrets
8
+ * never persist to the settings state file — the credential store is the only
9
+ * place secret values are held.
7
10
  *
8
11
  * @module dsh-connect/settings/credential-store
9
12
  */
10
13
  import { type ChannelName } from "./channels.js";
14
+ /**
15
+ * One resolved credential: the non-empty secret value plus the source layer
16
+ * that supplied it (`env`, `file`, `project-env`, `user-env`). Mirrors the
17
+ * host's `ResolvedCredential` from `@deepseek-ai/dsh-credentials`.
18
+ *
19
+ * `resolve` returns this *object*, not a bare string. Reading it as a string
20
+ * silently yields nothing — see `resolveValue`.
21
+ */
22
+ export interface ResolvedCredential {
23
+ value: string;
24
+ source: string;
25
+ }
11
26
  /** The seam the DSH host provides; `describe` reports source metadata. */
12
27
  export interface CredentialsProvider {
13
- resolve(ref: string): Promise<string | null | undefined>;
28
+ /**
29
+ * Resolve one ref to its value, or `undefined`/`null` while unconfigured.
30
+ * The host returns a `{value, source}` record; a plain string is also
31
+ * accepted so hand-written stubs stay valid.
32
+ */
33
+ resolve(ref: string): Promise<ResolvedCredential | string | null | undefined>;
14
34
  describe(ref: string): Promise<{
15
35
  configured: boolean;
16
36
  [k: string]: unknown;
@@ -18,14 +38,40 @@ export interface CredentialsProvider {
18
38
  set(ref: string, value: string): Promise<void>;
19
39
  unset(ref: string): Promise<void>;
20
40
  }
21
- /** Credential references owned by each channel (alphabetical, stable). */
22
- export declare const CREDENTIAL_REFS: Record<ChannelName, readonly string[]>;
23
41
  /** Maps each channel's secret *config key* to its credential ref, so the
24
- * settings service and activation can enrich a channel config from the store. */
42
+ * settings service and activation can enrich a channel config from the store.
43
+ *
44
+ * This is the **authoritative list of refs a channel owns**: every ref that
45
+ * `save` can write appears here. A ref reachable only through
46
+ * {@link CREDENTIAL_GROUPS} would be writable-but-unclearable — `save` and
47
+ * `clear` both derive from this table for exactly that reason. */
25
48
  export declare const CHANNEL_SECRET_KEYS: Record<ChannelName, Record<string, string>>;
49
+ /**
50
+ * Credential sets that satisfy a channel, as groups-of-refs.
51
+ *
52
+ * Within a group every ref must be configured; between groups any one group
53
+ * being complete is enough. The grouping exists for DingTalk, which has two
54
+ * mutually exclusive transports — webhook push (url + signing secret) and
55
+ * stream mode (client id + secret). A flat all-of list would report a
56
+ * webhook-only user as "未配置凭据" because their stream refs are empty.
57
+ *
58
+ * An empty group list means the channel needs no credentials at all, so it is
59
+ * always satisfied — `web` mirrors the DSH Web UI in-process and holds no
60
+ * secret. Reporting that as unconfigured was pure noise in the pane's badge.
61
+ */
62
+ export declare const CREDENTIAL_GROUPS: Record<ChannelName, readonly (readonly string[])[]>;
63
+ /**
64
+ * Flat, de-duplicated view of every ref named by {@link CREDENTIAL_GROUPS},
65
+ * in declaration order. Kept because existing callers and tests import it;
66
+ * new code should prefer `CHANNEL_SECRET_KEYS` for the refs a channel owns.
67
+ */
68
+ export declare const CREDENTIAL_REFS: Record<ChannelName, readonly string[]>;
26
69
  /** A channel credential store bound to a DSH provider. */
27
70
  export interface CredentialStore {
28
- /** Whether every ref for the channel is configured (secrets present). */
71
+ /**
72
+ * Whether the channel is usable, i.e. some group of {@link CREDENTIAL_GROUPS}
73
+ * is fully configured. A channel with no groups is always usable.
74
+ */
29
75
  configured(channel: ChannelName): Promise<boolean>;
30
76
  /** Persist a channel secret under its ref. */
31
77
  save(channel: ChannelName, values: Record<string, string>): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"credential-store.d.ts","sourceRoot":"","sources":["../../src/settings/credential-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE3D,0EAA0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACzD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,OAAO,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,CAAC;IAC9E,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC;AAED,0EAA0E;AAC1E,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAKvB,CAAC;AAE7C;iFACiF;AACjF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAU1E,CAAC;AAEH,0DAA0D;AAC1D,MAAM,WAAW,eAAe;IAC9B,yEAAyE;IACzE,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,8CAA8C;IAC9C,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,iEAAiE;IACjE,GAAG,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,wCAAwC;IACxC,KAAK,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C;AAUD,8EAA8E;AAC9E,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,eAAe,CAqCpF"}
1
+ {"version":3,"file":"credential-store.d.ts","sourceRoot":"","sources":["../../src/settings/credential-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE3D;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,0EAA0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IAC9E,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,OAAO,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,CAAC;IAC9E,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC;AAQD;;;;;;kEAMkE;AAClE,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAU1E,CAAC;AAEH;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAQzB,CAAC;AAE1D;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAIxB,CAAC;AAsB5C,0DAA0D;AAC1D,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,8CAA8C;IAC9C,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,iEAAiE;IACjE,GAAG,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,wCAAwC;IACxC,KAAK,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C;AAUD,8EAA8E;AAC9E,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,eAAe,CA8CpF"}
@@ -1,12 +1,28 @@
1
- /** Credential references owned by each channel (alphabetical, stable). */
2
- export const CREDENTIAL_REFS = Object.freeze({
3
- feishu: ["DSH_CONNECT_FEISHU_APP_ID", "DSH_CONNECT_FEISHU_APP_SECRET"],
4
- telegram: ["DSH_CONNECT_TELEGRAM_BOT_TOKEN"],
5
- dingtalk: ["DSH_CONNECT_DINGTALK_WEBHOOK_URL", "DSH_CONNECT_DINGTALK_SECRET"],
6
- web: [],
7
- });
1
+ /**
2
+ * Host-side credential store for dsh-connect channels. Adapts the DSH
3
+ * `credentials` provider (`resolve/describe/set/unset`, env-style refs) into a
4
+ * per-channel interface, so secrets live in the DSH credential store instead of
5
+ * the plugin config (mirroring dsh-im's `credential-store.mjs`). The web
6
+ * settings pane reports `configured` booleans and may echo store-backed secret
7
+ * values (e.g. an appId) so an upgraded user can confirm them, but secrets
8
+ * never persist to the settings state file — the credential store is the only
9
+ * place secret values are held.
10
+ *
11
+ * @module dsh-connect/settings/credential-store
12
+ */
13
+ import { CHANNELS } from "./channels.js";
14
+ /** Unwrap either resolution shape to a non-empty string, else undefined. */
15
+ function resolveValue(resolved) {
16
+ const value = typeof resolved === "string" ? resolved : resolved?.value;
17
+ return typeof value === "string" && value.length > 0 ? value : undefined;
18
+ }
8
19
  /** Maps each channel's secret *config key* to its credential ref, so the
9
- * settings service and activation can enrich a channel config from the store. */
20
+ * settings service and activation can enrich a channel config from the store.
21
+ *
22
+ * This is the **authoritative list of refs a channel owns**: every ref that
23
+ * `save` can write appears here. A ref reachable only through
24
+ * {@link CREDENTIAL_GROUPS} would be writable-but-unclearable — `save` and
25
+ * `clear` both derive from this table for exactly that reason. */
10
26
  export const CHANNEL_SECRET_KEYS = Object.freeze({
11
27
  feishu: { appId: "DSH_CONNECT_FEISHU_APP_ID", appSecret: "DSH_CONNECT_FEISHU_APP_SECRET" },
12
28
  telegram: { botToken: "DSH_CONNECT_TELEGRAM_BOT_TOKEN" },
@@ -18,6 +34,54 @@ export const CHANNEL_SECRET_KEYS = Object.freeze({
18
34
  },
19
35
  web: {},
20
36
  });
37
+ /**
38
+ * Credential sets that satisfy a channel, as groups-of-refs.
39
+ *
40
+ * Within a group every ref must be configured; between groups any one group
41
+ * being complete is enough. The grouping exists for DingTalk, which has two
42
+ * mutually exclusive transports — webhook push (url + signing secret) and
43
+ * stream mode (client id + secret). A flat all-of list would report a
44
+ * webhook-only user as "未配置凭据" because their stream refs are empty.
45
+ *
46
+ * An empty group list means the channel needs no credentials at all, so it is
47
+ * always satisfied — `web` mirrors the DSH Web UI in-process and holds no
48
+ * secret. Reporting that as unconfigured was pure noise in the pane's badge.
49
+ */
50
+ export const CREDENTIAL_GROUPS = Object.freeze({
51
+ feishu: [["DSH_CONNECT_FEISHU_APP_ID", "DSH_CONNECT_FEISHU_APP_SECRET"]],
52
+ telegram: [["DSH_CONNECT_TELEGRAM_BOT_TOKEN"]],
53
+ dingtalk: [
54
+ ["DSH_CONNECT_DINGTALK_WEBHOOK_URL", "DSH_CONNECT_DINGTALK_SECRET"],
55
+ ["DSH_CONNECT_DINGTALK_CLIENT_ID", "DSH_CONNECT_DINGTALK_CLIENT_SECRET"],
56
+ ],
57
+ web: [],
58
+ });
59
+ /**
60
+ * Flat, de-duplicated view of every ref named by {@link CREDENTIAL_GROUPS},
61
+ * in declaration order. Kept because existing callers and tests import it;
62
+ * new code should prefer `CHANNEL_SECRET_KEYS` for the refs a channel owns.
63
+ */
64
+ export const CREDENTIAL_REFS = Object.freeze(Object.fromEntries(CHANNELS.map((channel) => [channel, groupRefs(channel)])));
65
+ /** De-duplicated union of every ref named by a channel's groups. */
66
+ function groupRefs(channel) {
67
+ const seen = new Set();
68
+ for (const group of CREDENTIAL_GROUPS[channel] ?? []) {
69
+ for (const ref of group)
70
+ seen.add(ref);
71
+ }
72
+ return Object.freeze([...seen]);
73
+ }
74
+ /**
75
+ * Every ref a channel may have written, i.e. the union of the refs named by its
76
+ * groups and its config-key table. `clear` uses this so it cannot leave behind
77
+ * a ref that `save` was able to write.
78
+ */
79
+ function ownedRefs(channel) {
80
+ const seen = new Set(groupRefs(channel));
81
+ for (const ref of Object.values(CHANNEL_SECRET_KEYS[channel] ?? {}))
82
+ seen.add(ref);
83
+ return [...seen];
84
+ }
21
85
  function assertProvider(provider) {
22
86
  for (const method of ["resolve", "describe", "set", "unset"]) {
23
87
  if (typeof provider[method] !== "function") {
@@ -28,17 +92,27 @@ function assertProvider(provider) {
28
92
  /** Build a per-channel credential store over a DSH `credentials` provider. */
29
93
  export function createCredentialStore(provider) {
30
94
  assertProvider(provider);
31
- const refs = (channel) => CREDENTIAL_REFS[channel] ?? [];
32
95
  return Object.freeze({
33
96
  async configured(channel) {
34
- const list = refs(channel);
35
- if (list.length === 0)
36
- return false;
37
- const described = await Promise.all(list.map((ref) => provider.describe(ref)));
38
- return described.every((d) => d.configured === true);
97
+ const groups = CREDENTIAL_GROUPS[channel] ?? [];
98
+ // No credential requirement at all (e.g. the in-process Web mirror):
99
+ // nothing to be missing, so the channel counts as configured.
100
+ if (groups.length === 0)
101
+ return true;
102
+ for (const group of groups) {
103
+ const described = await Promise.all(group.map((ref) => provider.describe(ref)));
104
+ if (described.every((d) => d.configured === true))
105
+ return true;
106
+ }
107
+ return false;
39
108
  },
40
109
  async save(channel, values) {
41
- for (const ref of refs(channel)) {
110
+ // Iterate the config-key table, not the group union: it is the complete
111
+ // list of refs this channel owns. Deriving the write set from the groups
112
+ // silently dropped DingTalk's stream credentials, because only the
113
+ // webhook group was represented there — the pane reported `ok: true`
114
+ // while the clientId/clientSecret the user typed were never stored.
115
+ for (const ref of Object.values(CHANNEL_SECRET_KEYS[channel] ?? {})) {
42
116
  const value = values[ref];
43
117
  if (value !== undefined)
44
118
  await provider.set(ref, value);
@@ -47,18 +121,18 @@ export function createCredentialStore(provider) {
47
121
  async get(channel) {
48
122
  const map = CHANNEL_SECRET_KEYS[channel] ?? {};
49
123
  const entries = await Promise.all(Object.entries(map).map(async ([configKey, ref]) => {
50
- const value = await provider.resolve(ref);
124
+ const value = resolveValue(await provider.resolve(ref));
51
125
  return [configKey, value];
52
126
  }));
53
127
  const out = {};
54
128
  for (const [configKey, value] of entries) {
55
- if (typeof value === "string" && value.length > 0)
129
+ if (value !== undefined)
56
130
  out[configKey] = value;
57
131
  }
58
132
  return out;
59
133
  },
60
134
  async clear(channel) {
61
- const outcomes = await Promise.allSettled(refs(channel).map((ref) => provider.unset(ref)));
135
+ const outcomes = await Promise.allSettled(ownedRefs(channel).map((ref) => provider.unset(ref)));
62
136
  if (outcomes.some((o) => o.status === "rejected")) {
63
137
  throw new Error(`Unable to clear ${channel} credentials.`);
64
138
  }