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.
- package/README.i18n.yaml +2 -2
- package/README.md +196 -43
- package/README.zh.md +171 -42
- package/client/client.js +817 -0
- package/client/client.js.map +7 -0
- package/client/locale.mjs +227 -0
- package/client/panel-state.mjs +54 -0
- package/client/settings-client.mjs +389 -0
- package/docs/images/settings-advanced-en.png +0 -0
- package/docs/images/settings-advanced-zh.png +0 -0
- package/docs/images/settings-defaults-en.png +0 -0
- package/docs/images/settings-defaults-zh.png +0 -0
- package/docs/images/settings-overview-en.png +0 -0
- package/docs/images/settings-overview-zh.png +0 -0
- package/examples/minimal.config.json +16 -0
- package/lib/binding.d.ts.map +1 -1
- package/lib/binding.js +2 -2
- package/lib/binding.js.map +1 -1
- package/lib/channels/dingtalk/adapter.d.ts +59 -0
- package/lib/channels/dingtalk/adapter.d.ts.map +1 -0
- package/lib/channels/dingtalk/adapter.js +123 -0
- package/lib/channels/dingtalk/adapter.js.map +1 -0
- package/lib/channels/dingtalk/i18n.d.ts +14 -0
- package/lib/channels/dingtalk/i18n.d.ts.map +1 -0
- package/lib/channels/dingtalk/i18n.js +16 -0
- package/lib/channels/dingtalk/i18n.js.map +1 -0
- package/lib/channels/dingtalk/index.d.ts +127 -0
- package/lib/channels/dingtalk/index.d.ts.map +1 -0
- package/lib/channels/dingtalk/index.js +144 -0
- package/lib/channels/dingtalk/index.js.map +1 -0
- package/lib/channels/dingtalk/message.d.ts +49 -0
- package/lib/channels/dingtalk/message.d.ts.map +1 -0
- package/lib/channels/dingtalk/message.js +50 -0
- package/lib/channels/dingtalk/message.js.map +1 -0
- package/lib/channels/dingtalk/stomp.d.ts +36 -0
- package/lib/channels/dingtalk/stomp.d.ts.map +1 -0
- package/lib/channels/dingtalk/stomp.js +107 -0
- package/lib/channels/dingtalk/stomp.js.map +1 -0
- package/lib/channels/dingtalk/stream.d.ts +53 -0
- package/lib/channels/dingtalk/stream.d.ts.map +1 -0
- package/lib/channels/dingtalk/stream.js +199 -0
- package/lib/channels/dingtalk/stream.js.map +1 -0
- package/lib/channels/dingtalk/webhook.d.ts +84 -0
- package/lib/channels/dingtalk/webhook.d.ts.map +1 -0
- package/lib/channels/dingtalk/webhook.js +143 -0
- package/lib/channels/dingtalk/webhook.js.map +1 -0
- package/lib/channels/feishu/adapter.d.ts +133 -0
- package/lib/channels/feishu/adapter.d.ts.map +1 -0
- package/lib/channels/feishu/adapter.js +662 -0
- package/lib/channels/feishu/adapter.js.map +1 -0
- package/lib/channels/feishu/i18n.d.ts +30 -0
- package/lib/channels/feishu/i18n.d.ts.map +1 -0
- package/lib/channels/feishu/i18n.js +42 -0
- package/lib/channels/feishu/i18n.js.map +1 -0
- package/lib/channels/feishu/index.d.ts +82 -0
- package/lib/channels/feishu/index.d.ts.map +1 -0
- package/lib/channels/feishu/index.js +103 -0
- package/lib/channels/feishu/index.js.map +1 -0
- package/lib/channels/feishu/onboard.d.ts +16 -0
- package/lib/channels/feishu/onboard.d.ts.map +1 -0
- package/lib/channels/feishu/onboard.js +86 -0
- package/lib/channels/feishu/onboard.js.map +1 -0
- package/lib/channels/telegram/adapter.d.ts +70 -0
- package/lib/channels/telegram/adapter.d.ts.map +1 -0
- package/lib/channels/telegram/adapter.js +460 -0
- package/lib/channels/telegram/adapter.js.map +1 -0
- package/lib/channels/telegram/client.d.ts +115 -0
- package/lib/channels/telegram/client.d.ts.map +1 -0
- package/lib/channels/telegram/client.js +198 -0
- package/lib/channels/telegram/client.js.map +1 -0
- package/lib/channels/telegram/i18n.d.ts +14 -0
- package/lib/channels/telegram/i18n.d.ts.map +1 -0
- package/lib/channels/telegram/i18n.js +18 -0
- package/lib/channels/telegram/i18n.js.map +1 -0
- package/lib/channels/telegram/index.d.ts +46 -0
- package/lib/channels/telegram/index.d.ts.map +1 -0
- package/lib/channels/telegram/index.js +54 -0
- package/lib/channels/telegram/index.js.map +1 -0
- package/lib/channels/web/adapter.d.ts +103 -0
- package/lib/channels/web/adapter.d.ts.map +1 -0
- package/lib/channels/web/adapter.js +161 -0
- package/lib/channels/web/adapter.js.map +1 -0
- package/lib/channels/web/index.d.ts +47 -0
- package/lib/channels/web/index.d.ts.map +1 -0
- package/lib/channels/web/index.js +59 -0
- package/lib/channels/web/index.js.map +1 -0
- package/lib/chat-key.d.ts +29 -0
- package/lib/chat-key.d.ts.map +1 -0
- package/lib/chat-key.js +38 -0
- package/lib/chat-key.js.map +1 -0
- package/lib/index.d.ts +78 -11
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +312 -9
- package/lib/index.js.map +1 -1
- package/lib/runner.d.ts +55 -2
- package/lib/runner.d.ts.map +1 -1
- package/lib/runner.js +158 -23
- package/lib/runner.js.map +1 -1
- package/lib/scheduler.d.ts.map +1 -1
- package/lib/scheduler.js +2 -2
- package/lib/scheduler.js.map +1 -1
- package/lib/service.d.ts +17 -1
- package/lib/service.d.ts.map +1 -1
- package/lib/service.js +47 -3
- package/lib/service.js.map +1 -1
- package/lib/settings/channel-runtime.d.ts +75 -0
- package/lib/settings/channel-runtime.d.ts.map +1 -0
- package/lib/settings/channel-runtime.js +165 -0
- package/lib/settings/channel-runtime.js.map +1 -0
- package/lib/settings/channels.d.ts +62 -0
- package/lib/settings/channels.d.ts.map +1 -0
- package/lib/settings/channels.js +132 -0
- package/lib/settings/channels.js.map +1 -0
- package/lib/settings/credential-store.d.ts +85 -0
- package/lib/settings/credential-store.d.ts.map +1 -0
- package/lib/settings/credential-store.js +142 -0
- package/lib/settings/credential-store.js.map +1 -0
- package/lib/settings/index.d.ts +14 -0
- package/lib/settings/index.d.ts.map +1 -0
- package/lib/settings/index.js +14 -0
- package/lib/settings/index.js.map +1 -0
- package/lib/settings/namespace.d.ts +175 -0
- package/lib/settings/namespace.d.ts.map +1 -0
- package/lib/settings/namespace.js +200 -0
- package/lib/settings/namespace.js.map +1 -0
- package/lib/settings/rpc-client.d.ts +36 -0
- package/lib/settings/rpc-client.d.ts.map +1 -0
- package/lib/settings/rpc-client.js +45 -0
- package/lib/settings/rpc-client.js.map +1 -0
- package/lib/settings/secret-disclosure.d.ts +50 -0
- package/lib/settings/secret-disclosure.d.ts.map +1 -0
- package/lib/settings/secret-disclosure.js +132 -0
- package/lib/settings/secret-disclosure.js.map +1 -0
- package/lib/settings/settings-model.d.ts +124 -0
- package/lib/settings/settings-model.d.ts.map +1 -0
- package/lib/settings/settings-model.js +118 -0
- package/lib/settings/settings-model.js.map +1 -0
- package/lib/settings/settings-rpc.d.ts +130 -0
- package/lib/settings/settings-rpc.d.ts.map +1 -0
- package/lib/settings/settings-rpc.js +233 -0
- package/lib/settings/settings-rpc.js.map +1 -0
- package/lib/settings/settings-service.d.ts +35 -0
- package/lib/settings/settings-service.d.ts.map +1 -0
- package/lib/settings/settings-service.js +171 -0
- package/lib/settings/settings-service.js.map +1 -0
- package/lib/state-dir.d.ts +28 -0
- package/lib/state-dir.d.ts.map +1 -0
- package/lib/state-dir.js +33 -0
- package/lib/state-dir.js.map +1 -0
- package/lib/stream.d.ts.map +1 -1
- package/lib/stream.js +3 -2
- package/lib/stream.js.map +1 -1
- package/package.json +56 -12
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/** RPC channel the settings pane calls. */
|
|
2
|
+
export const SETTINGS_RPC_CHANNEL = "/dsh-connect";
|
|
3
|
+
/** Endpoints the settings pane can invoke on the channel. */
|
|
4
|
+
export const SETTINGS_ENDPOINTS = Object.freeze(["settings.get", "settings.save", "credentials.save", "settings.status"]);
|
|
5
|
+
/** Error codes considered safe to surface verbatim to the browser. */
|
|
6
|
+
const PUBLIC_ERRORS = new Set([
|
|
7
|
+
"settings-failed", "bad-request", "cancelled", "invalid-payload", "unknown-profile",
|
|
8
|
+
"unsupported-runtime", "not-configured", "credential-missing", "credential-invalid",
|
|
9
|
+
"channel-disabled", "save-failed", "state-unavailable", "disposed", "interrupted",
|
|
10
|
+
"unsupported", "invalid-channel", "invalid-credentials",
|
|
11
|
+
]);
|
|
12
|
+
function validPayload(endpoint, payload) {
|
|
13
|
+
if (payload === null || typeof payload !== "object" || Array.isArray(payload))
|
|
14
|
+
return false;
|
|
15
|
+
const keys = Object.keys(payload);
|
|
16
|
+
if (endpoint === "settings.save")
|
|
17
|
+
return keys.length > 0;
|
|
18
|
+
if (endpoint === "credentials.save") {
|
|
19
|
+
return keys.length > 0 && typeof payload.channel === "string"
|
|
20
|
+
&& payload.values !== null && typeof payload.values === "object"
|
|
21
|
+
&& !Array.isArray(payload.values);
|
|
22
|
+
}
|
|
23
|
+
// The reads carry no payload.
|
|
24
|
+
return keys.length === 0;
|
|
25
|
+
}
|
|
26
|
+
/** Build the channel handler for a settings service. */
|
|
27
|
+
export function createSettingsRpcHandler(service) {
|
|
28
|
+
return async (endpoint, payload, signal) => {
|
|
29
|
+
if (!SETTINGS_ENDPOINTS.includes(endpoint) || !validPayload(endpoint, payload)) {
|
|
30
|
+
return { ok: false, error: { code: "bad-request", message: "Invalid settings request." } };
|
|
31
|
+
}
|
|
32
|
+
if (signal?.aborted)
|
|
33
|
+
return { ok: false, error: { code: "cancelled", message: "Request cancelled." } };
|
|
34
|
+
try {
|
|
35
|
+
const record = (payload ?? {});
|
|
36
|
+
const value = endpoint === "settings.get"
|
|
37
|
+
? await service.get()
|
|
38
|
+
: endpoint === "settings.save"
|
|
39
|
+
? await service.save(record)
|
|
40
|
+
: endpoint === "credentials.save"
|
|
41
|
+
? await saveCredentialsP(service, record)
|
|
42
|
+
: await service.status();
|
|
43
|
+
return { ok: true, value };
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
const code = PUBLIC_ERRORS.has(error?.code) ? error.code : "settings-failed";
|
|
47
|
+
return { ok: false, error: { code, message: code } };
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
async function saveCredentialsP(service, record) {
|
|
52
|
+
if (typeof service.saveCredentials !== "function") {
|
|
53
|
+
const err = new Error("unsupported");
|
|
54
|
+
err.code = "unsupported";
|
|
55
|
+
throw err;
|
|
56
|
+
}
|
|
57
|
+
const channel = record.channel;
|
|
58
|
+
const values = (record.values ?? {});
|
|
59
|
+
return service.saveCredentials(channel, values);
|
|
60
|
+
}
|
|
61
|
+
/** Endpoint segment accepted by a Connection RPC path (host-compatible). */
|
|
62
|
+
const ENDPOINT_SEGMENT_PATTERN = /^[A-Za-z0-9_$.-]+$/;
|
|
63
|
+
/** Upper bound on an accepted settings request body; settings payloads are tiny. */
|
|
64
|
+
const MAX_BODY_BYTES = 1024 * 1024;
|
|
65
|
+
/**
|
|
66
|
+
* Derive the endpoint from a request path, exactly like the host's own
|
|
67
|
+
* Connection router: the remainder of `channel/` must be non-empty segments
|
|
68
|
+
* matching {@link ENDPOINT_SEGMENT_PATTERN}.
|
|
69
|
+
*/
|
|
70
|
+
function endpointFromPath(channel, pathname) {
|
|
71
|
+
if (!pathname.startsWith(`${channel}/`))
|
|
72
|
+
return undefined;
|
|
73
|
+
const endpoint = pathname.slice(channel.length + 1);
|
|
74
|
+
const segments = endpoint.split("/");
|
|
75
|
+
if (segments.some((segment) => segment === "" || segment === "." || segment === ".." || !ENDPOINT_SEGMENT_PATTERN.test(segment)))
|
|
76
|
+
return undefined;
|
|
77
|
+
return endpoint;
|
|
78
|
+
}
|
|
79
|
+
/** Read a request body as UTF-8 text, rejecting past {@link MAX_BODY_BYTES}. */
|
|
80
|
+
function readBody(req, limit = MAX_BODY_BYTES) {
|
|
81
|
+
return new Promise((resolve, reject) => {
|
|
82
|
+
const chunks = [];
|
|
83
|
+
let size = 0;
|
|
84
|
+
let overLimit = false;
|
|
85
|
+
req.on("data", (chunk) => {
|
|
86
|
+
if (overLimit)
|
|
87
|
+
return;
|
|
88
|
+
size += chunk.length;
|
|
89
|
+
if (size > limit) {
|
|
90
|
+
overLimit = true;
|
|
91
|
+
chunks.length = 0;
|
|
92
|
+
reject(new Error("body exceeds limit"));
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
chunks.push(chunk);
|
|
96
|
+
});
|
|
97
|
+
req.on("end", () => resolve(Buffer.concat(chunks).toString("utf8")));
|
|
98
|
+
req.on("error", reject);
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
/** Write a JSON response with an accurate content length. */
|
|
102
|
+
function sendJson(res, status, body) {
|
|
103
|
+
const text = JSON.stringify(body);
|
|
104
|
+
res.writeHead(status, { "content-type": "application/json", "content-length": String(Buffer.byteLength(text)) });
|
|
105
|
+
res.end(text);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Coerce a handler result into the Connection response envelope the browser
|
|
109
|
+
* client validates. `error.details` must always be an object — the client's
|
|
110
|
+
* `parseConnectionResponse` throws on a missing one.
|
|
111
|
+
*/
|
|
112
|
+
function responseEnvelope(rpcId, result) {
|
|
113
|
+
if (result?.ok === true)
|
|
114
|
+
return { type: "server-response", rpcId, result: { ok: true, value: result.value } };
|
|
115
|
+
const error = (result?.error ?? {});
|
|
116
|
+
const details = error.details !== null && typeof error.details === "object" ? error.details : {};
|
|
117
|
+
return {
|
|
118
|
+
type: "server-response",
|
|
119
|
+
rpcId,
|
|
120
|
+
result: { ok: false, error: { code: String(error.code ?? "settings-failed"), message: String(error.message ?? ""), details } },
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Build the raw HTTP handler for {@link SETTINGS_RPC_CHANNEL}. Mirrors the
|
|
125
|
+
* host's own Connection RPC adapter (method/content-type/envelope checks plus
|
|
126
|
+
* the Host/Origin and browser-auth fence) so the pane sees the same protocol
|
|
127
|
+
* and the same failure codes as a first-party channel.
|
|
128
|
+
*/
|
|
129
|
+
export function createSettingsHttpHandler(service, connection) {
|
|
130
|
+
const handle = createSettingsRpcHandler(service);
|
|
131
|
+
return async function settingsHttpHandler(req, res) {
|
|
132
|
+
// Same fence the host applies to `/api`: trusted Host/Origin, then browser auth.
|
|
133
|
+
const rejection = connection?.requestRejection?.(req);
|
|
134
|
+
if (rejection !== undefined) {
|
|
135
|
+
res.writeHead(rejection, { "content-type": "text/plain" });
|
|
136
|
+
res.end(rejection === 401 ? "unauthorized" : "forbidden");
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const endpoint = endpointFromPath(SETTINGS_RPC_CHANNEL, new URL(req.url ?? "/", "http://dsh.internal").pathname);
|
|
140
|
+
if (req.method !== "POST" || endpoint === undefined) {
|
|
141
|
+
res.writeHead(404);
|
|
142
|
+
res.end();
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const contentType = String(req.headers["content-type"] ?? "").split(";", 1)[0]?.trim().toLowerCase();
|
|
146
|
+
if (contentType !== "application/json") {
|
|
147
|
+
res.writeHead(415);
|
|
148
|
+
res.end("content type must be application/json");
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
let raw;
|
|
152
|
+
try {
|
|
153
|
+
raw = await readBody(req);
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
res.writeHead(400);
|
|
157
|
+
res.end("body is not JSON");
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
let body;
|
|
161
|
+
try {
|
|
162
|
+
body = JSON.parse(raw);
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
res.writeHead(400);
|
|
166
|
+
res.end("body is not JSON");
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const envelope = (body ?? {});
|
|
170
|
+
const rpcId = typeof envelope.rpcId === "string" ? envelope.rpcId : "invalid-request";
|
|
171
|
+
if (envelope.type !== "client-request" || typeof envelope.rpcId !== "string" || typeof envelope.method !== "string") {
|
|
172
|
+
sendJson(res, 200, responseEnvelope(rpcId, { ok: false, error: { code: "bad-request", message: "invalid client-request message" } }));
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
if (envelope.method !== endpoint) {
|
|
176
|
+
sendJson(res, 200, responseEnvelope(rpcId, {
|
|
177
|
+
ok: false,
|
|
178
|
+
error: { code: "bad-request", message: `method ${JSON.stringify(envelope.method)} does not match endpoint ${JSON.stringify(endpoint)}` },
|
|
179
|
+
}));
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
// Abort the caller's signal when the browser goes away before we answer.
|
|
183
|
+
const aborter = new AbortController();
|
|
184
|
+
res.on("close", () => {
|
|
185
|
+
if (!res.writableEnded)
|
|
186
|
+
aborter.abort();
|
|
187
|
+
});
|
|
188
|
+
const result = await handle(endpoint, envelope.payload, aborter.signal);
|
|
189
|
+
sendJson(res, 200, responseEnvelope(rpcId, result));
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Mount the settings RPC channel on the host webserver.
|
|
194
|
+
*
|
|
195
|
+
* Mounts a `prefix` route for {@link SETTINGS_RPC_CHANNEL} directly on the
|
|
196
|
+
* `webServer` host service — the same thing the host's own
|
|
197
|
+
* `connection.rpc.handle()` does internally (`owner.webServer.register(route)`
|
|
198
|
+
* with the `/api` fence), and the same thing `dsh-api-gateway` does for its
|
|
199
|
+
* WebSocket route.
|
|
200
|
+
*
|
|
201
|
+
* Why not `connection.rpc.handle()`: the host's `HostConnectionService` is
|
|
202
|
+
* context-tracked, so its `get rpc()` captures `this.ctx`. cordis resolves that
|
|
203
|
+
* read to a *shadow* of the service's construction context, and service
|
|
204
|
+
* resolution then walks **that** fiber chain — which never contains the
|
|
205
|
+
* `webServer` provider (a sibling fiber). The call therefore dies with
|
|
206
|
+
* `cannot get property "webServer" without inject`, the route is never mounted,
|
|
207
|
+
* and every `settings.*` call falls through to the static fallback (HTTP 405),
|
|
208
|
+
* leaving the pane stuck on "加载中". Injecting `webServer` into the calling
|
|
209
|
+
* scope — or declaring it in the plugin's `inject` — does not help, because the
|
|
210
|
+
* shadow overrides the caller's fiber.
|
|
211
|
+
*
|
|
212
|
+
* @param ctx - an injection scope holding `connection` and `webServer`.
|
|
213
|
+
* @param options - the settings service backing the channel.
|
|
214
|
+
* @returns a disposer removing the route (no-op if the host has no webserver).
|
|
215
|
+
*/
|
|
216
|
+
export function installSettingsRpc(ctx, options) {
|
|
217
|
+
const scope = (ctx ?? {});
|
|
218
|
+
const register = scope.webServer?.register;
|
|
219
|
+
if (typeof register !== "function")
|
|
220
|
+
return () => { };
|
|
221
|
+
const route = {
|
|
222
|
+
kind: "prefix",
|
|
223
|
+
path: SETTINGS_RPC_CHANNEL,
|
|
224
|
+
handler: createSettingsHttpHandler(options.service, scope.connection),
|
|
225
|
+
};
|
|
226
|
+
// Register through the scope's effect so the route is torn down with the fiber.
|
|
227
|
+
if (typeof scope.effect === "function") {
|
|
228
|
+
const disposed = scope.effect(() => register.call(scope.webServer, route), `dsh-connect: ${SETTINGS_RPC_CHANNEL} settings rpc`);
|
|
229
|
+
return typeof disposed === "function" ? disposed : () => { };
|
|
230
|
+
}
|
|
231
|
+
return register.call(scope.webServer, route);
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=settings-rpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-rpc.js","sourceRoot":"","sources":["../../src/settings/settings-rpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type ChannelName } from "./channels.js";
|
|
2
|
+
import type { SettingsService } from "./settings-rpc.js";
|
|
3
|
+
import { type CredentialStore } from "./credential-store.js";
|
|
4
|
+
import type { LiveConnectSection } from "./namespace.js";
|
|
5
|
+
export interface SettingsServiceOptions {
|
|
6
|
+
/** JSON file to persist non-secret settings when no namespace is live (omit = in-memory only). */
|
|
7
|
+
statePath?: string;
|
|
8
|
+
/** Known channel names (default: built-in channels). */
|
|
9
|
+
channelNames?: readonly ChannelName[];
|
|
10
|
+
/** Report credential presence per channel (optional; default: all false). */
|
|
11
|
+
credentialStore?: CredentialStore;
|
|
12
|
+
/** Error sink (default: console.error). */
|
|
13
|
+
log?: (msg: string) => void;
|
|
14
|
+
/**
|
|
15
|
+
* Seed config used when no state file exists (or `statePath` is unset), so the
|
|
16
|
+
* pane reflects the plugin's live config rather than an empty default. The
|
|
17
|
+
* live config carries only the settings-shape keys (`channels`, `channelDefaults`,
|
|
18
|
+
* per-channel) that the pane edits.
|
|
19
|
+
*/
|
|
20
|
+
initialConfig?: Record<string, unknown>;
|
|
21
|
+
/**
|
|
22
|
+
* The live settings namespace, if one is installed. A **getter**, not a value:
|
|
23
|
+
* this service is built during the plugin's `apply`, while the namespace is
|
|
24
|
+
* registered later (the `settings` service is a `dsh-base` row that loads
|
|
25
|
+
* after a user plugin), so the handle does not exist yet at construction time.
|
|
26
|
+
*/
|
|
27
|
+
live?: () => LiveConnectSection | undefined;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Build a settings service backed by a JSON state file. `get`/`status` read the
|
|
31
|
+
* current state; `save` merges and persists. A missing/corrupt state file is
|
|
32
|
+
* treated as an empty config (never throws on read).
|
|
33
|
+
*/
|
|
34
|
+
export declare function createSettingsService(options?: SettingsServiceOptions): SettingsService;
|
|
35
|
+
//# sourceMappingURL=settings-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-service.d.ts","sourceRoot":"","sources":["../../src/settings/settings-service.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAElF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,MAAM,WAAW,sBAAsB;IACrC,kGAAkG;IAClG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,YAAY,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IACtC,6EAA6E;IAC7E,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,2CAA2C;IAC3C,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,kBAAkB,GAAG,SAAS,CAAC;CAC7C;AAMD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,sBAA2B,GAAG,eAAe,CAmI3F"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backend for the dsh-connect web settings pane.
|
|
3
|
+
*
|
|
4
|
+
* A host-side service that reads/writes the non-secret plugin settings (the
|
|
5
|
+
* `dsh-connect` config: `channels`, `channelDefaults`, per-channel fields),
|
|
6
|
+
* and reports per-channel credential presence via an optional DSH credential
|
|
7
|
+
* store. Secrets (appSecret/botToken) live in the DSH credentials store, never
|
|
8
|
+
* in the section this service writes.
|
|
9
|
+
*
|
|
10
|
+
* **Two data planes, one interface.** When the `dsh-connect` settings namespace
|
|
11
|
+
* is installed (`namespace.ts`), that *is* the store: reads come from the
|
|
12
|
+
* provider's resolved section and writes go back through it, which is what makes
|
|
13
|
+
* a pane save land in `$DSH_HOME/settings.yaml`, take effect immediately (the
|
|
14
|
+
* namespace's `onChange` reconciles the running adapters) and survive a restart.
|
|
15
|
+
* The JSON state file is the fallback for hosts without a settings service, and
|
|
16
|
+
* is written only when no namespace is live.
|
|
17
|
+
*
|
|
18
|
+
* @module dsh-connect/settings/settings-service
|
|
19
|
+
*/
|
|
20
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
21
|
+
import { dirname } from "node:path";
|
|
22
|
+
import { CHANNELS } from "./channels.js";
|
|
23
|
+
import { CHANNEL_SECRET_KEYS } from "./credential-store.js";
|
|
24
|
+
import { maskSecret } from "./secret-disclosure.js";
|
|
25
|
+
function logError(msg) {
|
|
26
|
+
if (typeof console !== "undefined")
|
|
27
|
+
console.error?.("[dsh-connect/settings] " + msg);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Build a settings service backed by a JSON state file. `get`/`status` read the
|
|
31
|
+
* current state; `save` merges and persists. A missing/corrupt state file is
|
|
32
|
+
* treated as an empty config (never throws on read).
|
|
33
|
+
*/
|
|
34
|
+
export function createSettingsService(options = {}) {
|
|
35
|
+
const channels = options.channelNames ?? CHANNELS;
|
|
36
|
+
const statePath = options.statePath;
|
|
37
|
+
const log = options.log ?? logError;
|
|
38
|
+
const credentialStore = options.credentialStore;
|
|
39
|
+
const initialConfig = options.initialConfig ?? {};
|
|
40
|
+
/** The live namespace handle, or undefined when the provider isn't there yet. */
|
|
41
|
+
function liveHandle() {
|
|
42
|
+
try {
|
|
43
|
+
return options.live?.();
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
log(`failed to resolve the live settings section: ${String(error)}`);
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function readConfig() {
|
|
51
|
+
const live = liveHandle();
|
|
52
|
+
if (live) {
|
|
53
|
+
// The *resolved* section (plugin config layered under the user's), which
|
|
54
|
+
// is what the host's own `describe()` reports: the pane edits the config
|
|
55
|
+
// in force, not a diff against it.
|
|
56
|
+
try {
|
|
57
|
+
return { ...live.read() };
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
// Do not fall through to the state file: it is stale by definition once
|
|
61
|
+
// a namespace is live, and resurrecting it would be worse than empty.
|
|
62
|
+
log(`failed to read the live settings section: ${String(error)}`);
|
|
63
|
+
return { ...initialConfig };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (!statePath || !existsSync(statePath))
|
|
67
|
+
return { ...initialConfig };
|
|
68
|
+
try {
|
|
69
|
+
const value = JSON.parse(readFileSync(statePath, "utf8"));
|
|
70
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
log(`failed to read settings state: ${String(error)}`);
|
|
74
|
+
return {};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function persist(config) {
|
|
78
|
+
if (!statePath)
|
|
79
|
+
return;
|
|
80
|
+
try {
|
|
81
|
+
mkdirSync(dirname(statePath), { recursive: true });
|
|
82
|
+
writeFileSync(statePath, JSON.stringify(config, null, 2) + "\n");
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
log(`failed to write settings state: ${String(error)}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async function snapshot(config) {
|
|
89
|
+
const enabled = (Array.isArray(config.channels) ? config.channels : [...channels])
|
|
90
|
+
.filter((name) => channels.includes(name));
|
|
91
|
+
const credentials = {};
|
|
92
|
+
// One `get()` per channel, projected two ways: presence (a boolean) and a
|
|
93
|
+
// host-masked preview (a lossy string). Neither is a usable secret — the
|
|
94
|
+
// masking happens here, before the value can cross the wire, so no browser
|
|
95
|
+
// tab (or screenshot of one) ever holds an appSecret. See
|
|
96
|
+
// `SettingsSnapshot.secretPreviews` in settings-rpc.ts.
|
|
97
|
+
const secrets = {};
|
|
98
|
+
const secretPreviews = {};
|
|
99
|
+
for (const name of channels) {
|
|
100
|
+
if (credentialStore) {
|
|
101
|
+
try {
|
|
102
|
+
credentials[name] = await credentialStore.configured(name);
|
|
103
|
+
const values = await credentialStore.get(name);
|
|
104
|
+
const presence = {};
|
|
105
|
+
const previews = {};
|
|
106
|
+
for (const key of Object.keys(CHANNEL_SECRET_KEYS[name] ?? {})) {
|
|
107
|
+
const value = values[key] ?? "";
|
|
108
|
+
presence[key] = value.length > 0;
|
|
109
|
+
// An unset key is absent from `previews` rather than present-but-
|
|
110
|
+
// empty, so "no entry" and "not configured" are the same statement.
|
|
111
|
+
if (value.length > 0)
|
|
112
|
+
previews[key] = maskSecret(key, value);
|
|
113
|
+
}
|
|
114
|
+
secrets[name] = presence;
|
|
115
|
+
secretPreviews[name] = previews;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
credentials[name] = false;
|
|
119
|
+
secrets[name] = {};
|
|
120
|
+
secretPreviews[name] = {};
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
credentials[name] = false;
|
|
125
|
+
secrets[name] = {};
|
|
126
|
+
secretPreviews[name] = {};
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return { config, enabled, credentials, secrets, secretPreviews, live: liveHandle() !== undefined };
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
async get() { return snapshot(readConfig()); },
|
|
133
|
+
async status() { return snapshot(readConfig()); },
|
|
134
|
+
async saveCredentials(channel, values) {
|
|
135
|
+
if (!credentialStore) {
|
|
136
|
+
const err = new Error("not-configured");
|
|
137
|
+
err.code = "not-configured";
|
|
138
|
+
throw err;
|
|
139
|
+
}
|
|
140
|
+
const map = CHANNEL_SECRET_KEYS[channel] ?? {};
|
|
141
|
+
const refValues = {};
|
|
142
|
+
for (const [configKey, ref] of Object.entries(map)) {
|
|
143
|
+
if (values[configKey] !== undefined)
|
|
144
|
+
refValues[ref] = values[configKey];
|
|
145
|
+
}
|
|
146
|
+
if (Object.keys(refValues).length === 0) {
|
|
147
|
+
const err = new Error("invalid-credentials");
|
|
148
|
+
err.code = "invalid-credentials";
|
|
149
|
+
throw err;
|
|
150
|
+
}
|
|
151
|
+
await credentialStore.save(channel, refValues);
|
|
152
|
+
return snapshot(readConfig());
|
|
153
|
+
},
|
|
154
|
+
async save(config) {
|
|
155
|
+
const live = liveHandle();
|
|
156
|
+
if (live) {
|
|
157
|
+
// The payload is browser input, so it is projected onto the namespace's
|
|
158
|
+
// declared keys inside `write` before it can reach the document. A
|
|
159
|
+
// rejection (schema violation) propagates to the pane as a failed save.
|
|
160
|
+
await live.write(config);
|
|
161
|
+
// `replace` resolves after the provider committed the new value, so this
|
|
162
|
+
// read is already fresh — no waiting on the file watcher's debounce.
|
|
163
|
+
return snapshot(readConfig());
|
|
164
|
+
}
|
|
165
|
+
const next = { ...readConfig(), ...config };
|
|
166
|
+
persist(next);
|
|
167
|
+
return snapshot(next);
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=settings-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-service.js","sourceRoot":"","sources":["../../src/settings/settings-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The single definition of where dsh-connect keeps its state.
|
|
3
|
+
*
|
|
4
|
+
* `bindings.json`, `reminders.json` and the settings document all live in one
|
|
5
|
+
* directory, and every writer must agree on it — otherwise a store silently
|
|
6
|
+
* reads a different file than the one that was written. That agreement used to
|
|
7
|
+
* be maintained by copying the same `stateDir ?? process.env… ?? ".dsh-connect"`
|
|
8
|
+
* expression into each store, and one copy had already drifted (the settings
|
|
9
|
+
* path consulted neither the environment variable nor the default). This module
|
|
10
|
+
* is now the only copy.
|
|
11
|
+
* @module dsh-connect/state-dir
|
|
12
|
+
*/
|
|
13
|
+
/** Fallback directory, relative to the process cwd. */
|
|
14
|
+
export declare const DEFAULT_STATE_DIR = ".dsh-connect";
|
|
15
|
+
/** The part of a plugin config that selects the state directory. */
|
|
16
|
+
export interface StateDirConfig {
|
|
17
|
+
/** Explicit directory from the plugin config; wins over everything. */
|
|
18
|
+
stateDir?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Resolve the state directory: plugin config, then `DSH_CONNECT_STATE_DIR`,
|
|
22
|
+
* then {@link DEFAULT_STATE_DIR}.
|
|
23
|
+
*
|
|
24
|
+
* A blank `stateDir: ""` is treated as unset rather than honoured — resolving
|
|
25
|
+
* it would drop `bindings.json` into whatever cwd the host happened to boot in.
|
|
26
|
+
*/
|
|
27
|
+
export declare function resolveStateDir(config?: StateDirConfig): string;
|
|
28
|
+
//# sourceMappingURL=state-dir.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-dir.d.ts","sourceRoot":"","sources":["../src/state-dir.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,uDAAuD;AACvD,eAAO,MAAM,iBAAiB,iBAAiB,CAAC;AAEhD,oEAAoE;AACpE,MAAM,WAAW,cAAc;IAC7B,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAOD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,MAAM,CAI/D"}
|
package/lib/state-dir.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The single definition of where dsh-connect keeps its state.
|
|
3
|
+
*
|
|
4
|
+
* `bindings.json`, `reminders.json` and the settings document all live in one
|
|
5
|
+
* directory, and every writer must agree on it — otherwise a store silently
|
|
6
|
+
* reads a different file than the one that was written. That agreement used to
|
|
7
|
+
* be maintained by copying the same `stateDir ?? process.env… ?? ".dsh-connect"`
|
|
8
|
+
* expression into each store, and one copy had already drifted (the settings
|
|
9
|
+
* path consulted neither the environment variable nor the default). This module
|
|
10
|
+
* is now the only copy.
|
|
11
|
+
* @module dsh-connect/state-dir
|
|
12
|
+
*/
|
|
13
|
+
/** Fallback directory, relative to the process cwd. */
|
|
14
|
+
export const DEFAULT_STATE_DIR = ".dsh-connect";
|
|
15
|
+
/** A usable path is a non-empty string; a blank YAML value means "unset". */
|
|
16
|
+
function usable(value) {
|
|
17
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Resolve the state directory: plugin config, then `DSH_CONNECT_STATE_DIR`,
|
|
21
|
+
* then {@link DEFAULT_STATE_DIR}.
|
|
22
|
+
*
|
|
23
|
+
* A blank `stateDir: ""` is treated as unset rather than honoured — resolving
|
|
24
|
+
* it would drop `bindings.json` into whatever cwd the host happened to boot in.
|
|
25
|
+
*/
|
|
26
|
+
export function resolveStateDir(config) {
|
|
27
|
+
if (usable(config?.stateDir))
|
|
28
|
+
return config.stateDir;
|
|
29
|
+
if (usable(process.env.DSH_CONNECT_STATE_DIR))
|
|
30
|
+
return process.env.DSH_CONNECT_STATE_DIR;
|
|
31
|
+
return DEFAULT_STATE_DIR;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=state-dir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-dir.js","sourceRoot":"","sources":["../src/state-dir.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,uDAAuD;AACvD,MAAM,CAAC,MAAM,iBAAiB,GAAG,cAAc,CAAC;AAQhD,6EAA6E;AAC7E,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,MAAuB;IACrD,IAAI,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC;IACrD,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACxF,OAAO,iBAAiB,CAAC;AAC3B,CAAC"}
|
package/lib/stream.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,wBAAgB,gBAAgB,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAoCnD;AAED,6EAA6E;AAC7E,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE;QAAE,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE1D,qEAAqE;AACrE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1C;
|
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,wBAAgB,gBAAgB,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAoCnD;AAED,6EAA6E;AAC7E,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE;QAAE,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE1D,qEAAqE;AACrE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1C;AAsBD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,GAAE,WAAoB,GAAG,IAAI,CAyEpI;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAMrE;AAED,wGAAwG;AACxG,wBAAgB,eAAe,CAAC,aAAa,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAqB1E;AAED,mHAAmH;AACnH,wBAAgB,cAAc,CAAC,aAAa,EAAE,OAAO,GAAG,MAAM,CAY7D;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAYlD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAsE5F;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAM,GAAG,MAAM,CAExD;AAED,kEAAkE;AAClE,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAE3E,oFAAoF;AACpF,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAM3D;AAED,mDAAmD;AACnD,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE;IAAE,OAAO,EAAE,SAAS;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,GAAG,SAAS,GAAG,MAAM,CAM5G"}
|
package/lib/stream.js
CHANGED
|
@@ -36,7 +36,7 @@ export function createAsyncQueue() {
|
|
|
36
36
|
return queue;
|
|
37
37
|
}
|
|
38
38
|
/**
|
|
39
|
-
* Assemble one
|
|
39
|
+
* Assemble one streamed chunk into the streaming queue with visible
|
|
40
40
|
* structure. DSH streams one block per LLM content block and block boundaries
|
|
41
41
|
* carry no newline of their own, so without separators every block (and the
|
|
42
42
|
* reasoning phase vs the final answer) would be glued together in the chat
|
|
@@ -47,7 +47,8 @@ export function createAsyncQueue() {
|
|
|
47
47
|
* `lastPushAt` so the liveness heartbeat knows the card is still moving.
|
|
48
48
|
* @param state - the turn's mutable assembly state.
|
|
49
49
|
* @param thinkingHint - localized hint text pushed at the first reasoning delta.
|
|
50
|
-
* @param chunk -
|
|
50
|
+
* @param chunk - one `agent/assistant-stream` `chunk` frame's `chunk` payload
|
|
51
|
+
* (or an equivalent chunk replayed from a settled `assistant/message`).
|
|
51
52
|
*/
|
|
52
53
|
/** Every line-break run becomes a paragraph break (Feishu's streaming card collapses single `\n`). */
|
|
53
54
|
function expandLineBreaks(text) {
|
package/lib/stream.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"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"}
|