@numa-tech/numa 1.14.31 → 1.14.33
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.md +67 -1
- package/dist/cli.js +65 -22
- package/dist/cli.js.map +1 -1
- package/dist/command-catalog.js +76 -0
- package/dist/command-catalog.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.js +15 -1
- package/dist/config.js.map +1 -1
- package/dist/oss/client.d.ts +18 -0
- package/dist/oss/client.js +90 -0
- package/dist/oss/client.js.map +1 -0
- package/dist/oss/commands.d.ts +2 -0
- package/dist/oss/commands.js +137 -0
- package/dist/oss/commands.js.map +1 -0
- package/dist/oss/errors.d.ts +15 -0
- package/dist/oss/errors.js +42 -0
- package/dist/oss/errors.js.map +1 -0
- package/dist/oss/schemas.d.ts +74 -0
- package/dist/oss/schemas.js +53 -0
- package/dist/oss/schemas.js.map +1 -0
- package/dist/oss/transfers.d.ts +36 -0
- package/dist/oss/transfers.js +261 -0
- package/dist/oss/transfers.js.map +1 -0
- package/dist/server.d.ts +4 -1
- package/dist/server.js +3 -1
- package/dist/server.js.map +1 -1
- package/dist/wecom/client.d.ts +120 -0
- package/dist/wecom/client.js +143 -0
- package/dist/wecom/client.js.map +1 -0
- package/dist/wecom/commands.d.ts +8 -0
- package/dist/wecom/commands.js +153 -0
- package/dist/wecom/commands.js.map +1 -0
- package/dist/wecom/errors.d.ts +7 -0
- package/dist/wecom/errors.js +27 -0
- package/dist/wecom/errors.js.map +1 -0
- package/dist/wecom/schemas.d.ts +109 -0
- package/dist/wecom/schemas.js +49 -0
- package/dist/wecom/schemas.js.map +1 -0
- package/dist/wecom/tools.d.ts +6 -0
- package/dist/wecom/tools.js +65 -0
- package/dist/wecom/tools.js.map +1 -0
- package/docs/wecom-messaging.md +81 -0
- package/package.json +7 -4
- package/skills/numa-cli/SKILL.md +1 -0
- package/skills/numa-oss-access/SKILL.md +86 -0
- package/skills/numa-oss-access/agents/openai.yaml +4 -0
- package/skills/numa-oss-access/evals/evals.json +35 -0
- package/skills/numa-oss-access/references/local-development.md +40 -0
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { createWriteStream } from "node:fs";
|
|
3
|
+
import { access, link, mkdir, rm, stat } from "node:fs/promises";
|
|
4
|
+
import { dirname, resolve } from "node:path";
|
|
5
|
+
import { pipeline } from "node:stream/promises";
|
|
6
|
+
import OSS from "ali-oss";
|
|
7
|
+
import { OssError } from "./errors.js";
|
|
8
|
+
function normalizedPrefix(prefix) {
|
|
9
|
+
let value = prefix?.trim() ?? "";
|
|
10
|
+
// The platform policy service canonicalizes prefixes by removing leading
|
|
11
|
+
// and trailing slashes. Mirror that representation so a malformed or
|
|
12
|
+
// legacy session cannot accidentally widen a prefix check.
|
|
13
|
+
while (value.startsWith("/"))
|
|
14
|
+
value = value.slice(1);
|
|
15
|
+
while (value.endsWith("/"))
|
|
16
|
+
value = value.slice(0, -1);
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
function validateKey(key, prefix, label, allowExactPrefix = false) {
|
|
20
|
+
const value = key.trim();
|
|
21
|
+
if (!value || value.length > 1024 || /[\\\u0000-\u001f\u007f]/u.test(value)) {
|
|
22
|
+
throw new OssError(`${label} is empty or contains invalid path characters.`, "oss_input_invalid");
|
|
23
|
+
}
|
|
24
|
+
const segments = value.split("/");
|
|
25
|
+
if (segments.some((segment) => segment === "." || segment === "..")) {
|
|
26
|
+
throw new OssError(`${label} must not contain path traversal segments.`, "oss_input_invalid");
|
|
27
|
+
}
|
|
28
|
+
if (prefix && !(allowExactPrefix && value === prefix)
|
|
29
|
+
&& !value.startsWith(prefix.endsWith("/") ? prefix : `${prefix}/`)) {
|
|
30
|
+
throw new OssError(`${label} must stay inside the authorized prefix ${prefix}.`, "oss_scope_violation");
|
|
31
|
+
}
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
function requirePermission(session, operation) {
|
|
35
|
+
if (typeof session.permissionLevel !== "string" || !session.permissionLevel.trim()) {
|
|
36
|
+
throw new OssError("The OSS session has no permission level.", "oss_session_invalid", 502);
|
|
37
|
+
}
|
|
38
|
+
const permission = session.permissionLevel.trim().toUpperCase();
|
|
39
|
+
const allowed = operation === "read"
|
|
40
|
+
? ["ADMIN", "READ_ONLY", "READ_WRITE", "READ_WRITE_NO_DELETE"].includes(permission)
|
|
41
|
+
: operation === "write"
|
|
42
|
+
? ["ADMIN", "WRITE_ONLY", "READ_WRITE", "READ_WRITE_NO_DELETE"].includes(permission)
|
|
43
|
+
: ["ADMIN", "READ_WRITE"].includes(permission);
|
|
44
|
+
if (!allowed)
|
|
45
|
+
throw new OssError(`The OSS policy does not allow ${operation}.`, "oss_operation_forbidden", 403);
|
|
46
|
+
}
|
|
47
|
+
function effectivePrefix(session) {
|
|
48
|
+
if (typeof session.scopeType !== "string" || !session.scopeType.trim()) {
|
|
49
|
+
throw new OssError("The OSS session has no scope type.", "oss_session_invalid", 502);
|
|
50
|
+
}
|
|
51
|
+
const scopeType = session.scopeType.trim().toUpperCase().replace(/^OSS_/u, "");
|
|
52
|
+
const prefix = normalizedPrefix(session.objectPrefix);
|
|
53
|
+
if (scopeType !== "BUCKET" && scopeType !== "PREFIX") {
|
|
54
|
+
throw new OssError(`Unsupported OSS scope type: ${session.scopeType}`, "oss_scope_invalid", 502);
|
|
55
|
+
}
|
|
56
|
+
if (scopeType === "PREFIX" && !prefix) {
|
|
57
|
+
throw new OssError("The OSS session has an empty authorized prefix.", "oss_scope_invalid", 502);
|
|
58
|
+
}
|
|
59
|
+
if (prefix && prefix.split("/").some((segment) => segment === "." || segment === "..")) {
|
|
60
|
+
throw new OssError("The OSS session contains an invalid authorized prefix.", "oss_scope_invalid", 502);
|
|
61
|
+
}
|
|
62
|
+
return prefix;
|
|
63
|
+
}
|
|
64
|
+
function clientOptions(session) {
|
|
65
|
+
if (typeof session.region !== "string" || !session.region.trim()) {
|
|
66
|
+
throw new OssError("The OSS session has no region.", "oss_session_invalid", 502);
|
|
67
|
+
}
|
|
68
|
+
if (typeof session.bucketName !== "string" || !session.bucketName.trim()) {
|
|
69
|
+
throw new OssError("The OSS session has no bucket.", "oss_session_invalid", 502);
|
|
70
|
+
}
|
|
71
|
+
if (!session.credentials || typeof session.credentials.accessKeyId !== "string"
|
|
72
|
+
|| typeof session.credentials.accessKeySecret !== "string"
|
|
73
|
+
|| typeof session.credentials.securityToken !== "string"
|
|
74
|
+
|| !session.credentials.accessKeyId
|
|
75
|
+
|| !session.credentials.accessKeySecret
|
|
76
|
+
|| !session.credentials.securityToken) {
|
|
77
|
+
throw new OssError("The OSS session has invalid temporary credentials.", "oss_session_invalid", 502);
|
|
78
|
+
}
|
|
79
|
+
const rawRegion = session.region.trim().toLowerCase();
|
|
80
|
+
const region = rawRegion.startsWith("oss-") ? rawRegion : `oss-${rawRegion}`;
|
|
81
|
+
if (!/^oss-[a-z0-9][a-z0-9-]*$/u.test(region)) {
|
|
82
|
+
throw new OssError("The OSS session has an invalid region.", "oss_session_invalid", 502);
|
|
83
|
+
}
|
|
84
|
+
const bucket = session.bucketName.trim();
|
|
85
|
+
if (!/^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$/u.test(bucket)) {
|
|
86
|
+
throw new OssError("The OSS session has an invalid bucket.", "oss_session_invalid", 502);
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
region,
|
|
90
|
+
endpoint: `https://${region}.aliyuncs.com`,
|
|
91
|
+
secure: true,
|
|
92
|
+
bucket,
|
|
93
|
+
accessKeyId: session.credentials.accessKeyId,
|
|
94
|
+
accessKeySecret: session.credentials.accessKeySecret,
|
|
95
|
+
stsToken: session.credentials.securityToken,
|
|
96
|
+
timeout: 60_000
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function defaultClientFactory(options) {
|
|
100
|
+
return new OSS(options);
|
|
101
|
+
}
|
|
102
|
+
async function pathExists(path) {
|
|
103
|
+
try {
|
|
104
|
+
await access(path);
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function transferError(operation, error) {
|
|
112
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
113
|
+
const status = typeof error === "object" && error !== null && "status" in error && typeof error.status === "number"
|
|
114
|
+
? error.status : undefined;
|
|
115
|
+
const requestId = typeof error === "object" && error !== null && "requestId" in error && typeof error.requestId === "string"
|
|
116
|
+
? error.requestId : undefined;
|
|
117
|
+
return new OssError(`OSS ${operation} failed: ${message}`, "oss_transfer_failed", status, requestId);
|
|
118
|
+
}
|
|
119
|
+
export class OssTransferClient {
|
|
120
|
+
clientFactory;
|
|
121
|
+
constructor(dependencies = {}) {
|
|
122
|
+
this.clientFactory = dependencies.clientFactory ?? defaultClientFactory;
|
|
123
|
+
}
|
|
124
|
+
client(session) {
|
|
125
|
+
return this.clientFactory(clientOptions(session));
|
|
126
|
+
}
|
|
127
|
+
async list(session, requestedPrefix, limit = 100) {
|
|
128
|
+
requirePermission(session, "read");
|
|
129
|
+
if (!Number.isSafeInteger(limit) || limit < 1 || limit > 1000) {
|
|
130
|
+
throw new OssError("List limit must be an integer between 1 and 1000.", "oss_input_invalid");
|
|
131
|
+
}
|
|
132
|
+
const prefix = effectivePrefix(session);
|
|
133
|
+
const listPrefix = requestedPrefix == null || requestedPrefix.trim() === ""
|
|
134
|
+
? prefix
|
|
135
|
+
: validateKey(requestedPrefix, prefix, "prefix", true);
|
|
136
|
+
try {
|
|
137
|
+
const result = await this.client(session).list({ prefix: listPrefix, "max-keys": limit }, {});
|
|
138
|
+
return {
|
|
139
|
+
prefix: listPrefix,
|
|
140
|
+
objects: (result.objects ?? []).map((object) => ({
|
|
141
|
+
key: object.name,
|
|
142
|
+
sizeBytes: Number(object.size ?? 0),
|
|
143
|
+
lastModified: object.lastModified,
|
|
144
|
+
etag: object.etag,
|
|
145
|
+
type: object.type
|
|
146
|
+
})),
|
|
147
|
+
truncated: Boolean(result.isTruncated),
|
|
148
|
+
...(result.nextMarker ? { nextMarker: result.nextMarker } : {})
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
throw transferError("list", error);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
async stat(session, key) {
|
|
156
|
+
requirePermission(session, "read");
|
|
157
|
+
const objectKey = validateKey(key, effectivePrefix(session), "object key");
|
|
158
|
+
try {
|
|
159
|
+
const result = await this.client(session).head(objectKey);
|
|
160
|
+
const meta = result.meta ?? {};
|
|
161
|
+
return {
|
|
162
|
+
key: objectKey,
|
|
163
|
+
status: result.status,
|
|
164
|
+
contentType: typeof meta["content-type"] === "string" ? meta["content-type"] : undefined,
|
|
165
|
+
contentLength: typeof meta["content-length"] === "string" ? Number(meta["content-length"]) : undefined,
|
|
166
|
+
etag: typeof meta.etag === "string" ? meta.etag : undefined,
|
|
167
|
+
lastModified: typeof meta["last-modified"] === "string" ? meta["last-modified"] : undefined
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
throw transferError("stat", error);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
async download(session, key, outputPath) {
|
|
175
|
+
requirePermission(session, "read");
|
|
176
|
+
const objectKey = validateKey(key, effectivePrefix(session), "object key");
|
|
177
|
+
if (!outputPath.trim())
|
|
178
|
+
throw new OssError("Download output path is required.", "oss_input_invalid");
|
|
179
|
+
const destination = resolve(outputPath);
|
|
180
|
+
if (await pathExists(destination))
|
|
181
|
+
throw new OssError(`Output already exists: ${destination}`, "oss_output_exists");
|
|
182
|
+
await mkdir(dirname(destination), { recursive: true });
|
|
183
|
+
const temporaryPath = `${destination}.${randomUUID()}.part`;
|
|
184
|
+
let linking = false;
|
|
185
|
+
try {
|
|
186
|
+
const result = await this.client(session).getStream(objectKey);
|
|
187
|
+
if (!result.stream)
|
|
188
|
+
throw new OssError("OSS returned no object stream.", "oss_download_failed");
|
|
189
|
+
await pipeline(result.stream, createWriteStream(temporaryPath, { flags: "wx", mode: 0o600 }));
|
|
190
|
+
// `rename` replaces an existing destination on POSIX. Check-then-rename
|
|
191
|
+
// would therefore still permit a concurrent invocation to overwrite a
|
|
192
|
+
// file. Linking the completed temporary file into place is atomic and
|
|
193
|
+
// fails with EEXIST if another process won the destination race.
|
|
194
|
+
linking = true;
|
|
195
|
+
await link(temporaryPath, destination);
|
|
196
|
+
await rm(temporaryPath, { force: true }).catch(() => undefined);
|
|
197
|
+
return { key: objectKey, outputPath: destination };
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
await rm(temporaryPath, { force: true }).catch(() => undefined);
|
|
201
|
+
if (linking && typeof error === "object" && error !== null
|
|
202
|
+
&& "code" in error && error.code === "EEXIST") {
|
|
203
|
+
throw new OssError(`Output already exists: ${destination}`, "oss_output_exists");
|
|
204
|
+
}
|
|
205
|
+
if (error instanceof OssError)
|
|
206
|
+
throw error;
|
|
207
|
+
throw transferError("download", error);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
async upload(session, key, inputPath, overwrite = false) {
|
|
211
|
+
requirePermission(session, "write");
|
|
212
|
+
const objectKey = validateKey(key, effectivePrefix(session), "object key");
|
|
213
|
+
const source = resolve(inputPath);
|
|
214
|
+
let sourceStat;
|
|
215
|
+
try {
|
|
216
|
+
sourceStat = await stat(source);
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
throw new OssError(`Cannot read upload file ${source}: ${error instanceof Error ? error.message : String(error)}`, "oss_input_invalid");
|
|
220
|
+
}
|
|
221
|
+
if (!sourceStat.isFile())
|
|
222
|
+
throw new OssError(`Upload source is not a regular file: ${source}`, "oss_input_invalid");
|
|
223
|
+
try {
|
|
224
|
+
await this.client(session).put(objectKey, source, overwrite ? undefined : { headers: { "x-oss-forbid-overwrite": "true" } });
|
|
225
|
+
return { key: objectKey, sizeBytes: sourceStat.size };
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
throw transferError("upload", error);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
async remove(session, key) {
|
|
232
|
+
requirePermission(session, "delete");
|
|
233
|
+
const objectKey = validateKey(key, effectivePrefix(session), "object key");
|
|
234
|
+
try {
|
|
235
|
+
await this.client(session).delete(objectKey);
|
|
236
|
+
return { key: objectKey };
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
throw transferError("delete", error);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
export function sessionMetadata(session) {
|
|
244
|
+
return {
|
|
245
|
+
session_id: session.sessionId,
|
|
246
|
+
grant_id: session.grantId,
|
|
247
|
+
account_code: session.accountCode,
|
|
248
|
+
role_name: session.roleName,
|
|
249
|
+
role_arn: session.roleArn,
|
|
250
|
+
policy_code: session.policyCode,
|
|
251
|
+
region: session.region,
|
|
252
|
+
bucket: session.bucketName,
|
|
253
|
+
scope_type: session.scopeType,
|
|
254
|
+
object_prefix: session.objectPrefix ?? "",
|
|
255
|
+
permission_level: session.permissionLevel,
|
|
256
|
+
role_session_name: session.roleSessionName,
|
|
257
|
+
source_identity: session.sourceIdentity,
|
|
258
|
+
expires_at: session.expiration
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=transfers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfers.js","sourceRoot":"","sources":["../../src/oss/transfers.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,2 +1,5 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
-
|
|
2
|
+
import { type WecomToolDependencies } from "./wecom/tools.js";
|
|
3
|
+
export declare function createServer(dependencies?: {
|
|
4
|
+
wecom?: WecomToolDependencies;
|
|
5
|
+
}): McpServer;
|
package/dist/server.js
CHANGED
|
@@ -6,6 +6,7 @@ import { COMMAND_CATALOG } from "./command-catalog.js";
|
|
|
6
6
|
import { loadConfig } from "./config.js";
|
|
7
7
|
import { currentIdentity, requireAnyRole, RoleRequiredError } from "./identity.js";
|
|
8
8
|
import { AuthError, completeBrowserLogin, deleteTokenCache, readTokenCache, startBrowserLogin } from "./oauth.js";
|
|
9
|
+
import { registerWecomTools } from "./wecom/tools.js";
|
|
9
10
|
const sessions = new Map();
|
|
10
11
|
function textResult(text, structuredContent, isError = false) {
|
|
11
12
|
return {
|
|
@@ -22,7 +23,7 @@ function errorResult(error) {
|
|
|
22
23
|
const code = error instanceof AuthError || error instanceof RoleRequiredError ? error.code : "error";
|
|
23
24
|
return textResult(`Error: ${message}`, { ok: false, code, message }, true);
|
|
24
25
|
}
|
|
25
|
-
export function createServer() {
|
|
26
|
+
export function createServer(dependencies = {}) {
|
|
26
27
|
const server = new McpServer({
|
|
27
28
|
name: `${CLI_NAME}-platform-cli`,
|
|
28
29
|
version: PACKAGE_VERSION
|
|
@@ -192,6 +193,7 @@ export function createServer() {
|
|
|
192
193
|
return errorResult(error);
|
|
193
194
|
}
|
|
194
195
|
});
|
|
196
|
+
registerWecomTools(server, dependencies.wecom);
|
|
195
197
|
return server;
|
|
196
198
|
}
|
|
197
199
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EACL,SAAS,EACT,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EAClB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import type { AuthConfig } from "../config.js";
|
|
2
|
+
import { type KeycloakTokenProvider } from "../oauth.js";
|
|
3
|
+
import { type SendMessageInput } from "./schemas.js";
|
|
4
|
+
export declare const WECOM_MAPPING_ROOT = "/api/v1/admin/notifications/wecom/mappings";
|
|
5
|
+
export declare const WECOM_API_ROOT = "/api/v1/notifications/wecom";
|
|
6
|
+
export interface WecomClientDependencies {
|
|
7
|
+
fetch?: typeof fetch;
|
|
8
|
+
tokenProvider?: KeycloakTokenProvider;
|
|
9
|
+
}
|
|
10
|
+
export declare class WecomClient {
|
|
11
|
+
private readonly config;
|
|
12
|
+
private readonly dependencies;
|
|
13
|
+
constructor(config: AuthConfig, dependencies?: WecomClientDependencies);
|
|
14
|
+
private json;
|
|
15
|
+
private mappingUnknown;
|
|
16
|
+
private unknown;
|
|
17
|
+
mappings(query?: string, limit?: number): Promise<{
|
|
18
|
+
items: {
|
|
19
|
+
subject: string;
|
|
20
|
+
username: string | null;
|
|
21
|
+
status: string;
|
|
22
|
+
source: "AUTO_EMAIL" | "MANUAL";
|
|
23
|
+
wecomUserId: string | null;
|
|
24
|
+
candidateUserIds: string[];
|
|
25
|
+
maskedEmail: string | null;
|
|
26
|
+
updatedAt: string | null;
|
|
27
|
+
}[];
|
|
28
|
+
hasMore: boolean;
|
|
29
|
+
}>;
|
|
30
|
+
syncMappings(dryRun?: boolean): Promise<{
|
|
31
|
+
dryRun: boolean;
|
|
32
|
+
items: {
|
|
33
|
+
subject: string;
|
|
34
|
+
username: string | null;
|
|
35
|
+
status: string;
|
|
36
|
+
source: "AUTO_EMAIL" | "MANUAL";
|
|
37
|
+
wecomUserId: string | null;
|
|
38
|
+
candidateUserIds: string[];
|
|
39
|
+
maskedEmail: string | null;
|
|
40
|
+
updatedAt: string | null;
|
|
41
|
+
}[];
|
|
42
|
+
mappedCount: number;
|
|
43
|
+
reviewCount: number;
|
|
44
|
+
}>;
|
|
45
|
+
bindMapping(subject: string, userId: string): Promise<{
|
|
46
|
+
subject: string;
|
|
47
|
+
username: string | null;
|
|
48
|
+
status: string;
|
|
49
|
+
source: "AUTO_EMAIL" | "MANUAL";
|
|
50
|
+
wecomUserId: string | null;
|
|
51
|
+
candidateUserIds: string[];
|
|
52
|
+
maskedEmail: string | null;
|
|
53
|
+
updatedAt: string | null;
|
|
54
|
+
}>;
|
|
55
|
+
unbindMapping(subject: string): Promise<{
|
|
56
|
+
subject: string;
|
|
57
|
+
username: string | null;
|
|
58
|
+
status: string;
|
|
59
|
+
source: "AUTO_EMAIL" | "MANUAL";
|
|
60
|
+
wecomUserId: string | null;
|
|
61
|
+
candidateUserIds: string[];
|
|
62
|
+
maskedEmail: string | null;
|
|
63
|
+
updatedAt: string | null;
|
|
64
|
+
}>;
|
|
65
|
+
capabilities(): Promise<{
|
|
66
|
+
enabled: boolean;
|
|
67
|
+
configured: boolean;
|
|
68
|
+
messageTypes: ("markdown" | "text")[];
|
|
69
|
+
maxRecipients: number;
|
|
70
|
+
maxTextBytes: number;
|
|
71
|
+
maxMarkdownBytes: number;
|
|
72
|
+
}>;
|
|
73
|
+
recipients(query: string, limit?: number): Promise<{
|
|
74
|
+
items: {
|
|
75
|
+
userId: string;
|
|
76
|
+
name: string;
|
|
77
|
+
departmentIds: number[];
|
|
78
|
+
}[];
|
|
79
|
+
hasMore: boolean;
|
|
80
|
+
}>;
|
|
81
|
+
send(input: SendMessageInput, requestId: string): Promise<{
|
|
82
|
+
id: string;
|
|
83
|
+
requestId: string;
|
|
84
|
+
status: "ACCEPTED" | "FAILED" | "PARTIAL" | "SENDING" | "UNKNOWN";
|
|
85
|
+
recipientUserIds: string[];
|
|
86
|
+
messageType: "markdown" | "text";
|
|
87
|
+
safe: boolean;
|
|
88
|
+
providerMessageId?: string | null | undefined;
|
|
89
|
+
invalidUserIds: string[];
|
|
90
|
+
errorCode?: string | null | undefined;
|
|
91
|
+
createdAt: string;
|
|
92
|
+
updatedAt: string;
|
|
93
|
+
}>;
|
|
94
|
+
status(id: string): Promise<{
|
|
95
|
+
id: string;
|
|
96
|
+
requestId: string;
|
|
97
|
+
status: "ACCEPTED" | "FAILED" | "PARTIAL" | "SENDING" | "UNKNOWN";
|
|
98
|
+
recipientUserIds: string[];
|
|
99
|
+
messageType: "markdown" | "text";
|
|
100
|
+
safe: boolean;
|
|
101
|
+
providerMessageId?: string | null | undefined;
|
|
102
|
+
invalidUserIds: string[];
|
|
103
|
+
errorCode?: string | null | undefined;
|
|
104
|
+
createdAt: string;
|
|
105
|
+
updatedAt: string;
|
|
106
|
+
}>;
|
|
107
|
+
statusByRequest(requestId: string): Promise<{
|
|
108
|
+
id: string;
|
|
109
|
+
requestId: string;
|
|
110
|
+
status: "ACCEPTED" | "FAILED" | "PARTIAL" | "SENDING" | "UNKNOWN";
|
|
111
|
+
recipientUserIds: string[];
|
|
112
|
+
messageType: "markdown" | "text";
|
|
113
|
+
safe: boolean;
|
|
114
|
+
providerMessageId?: string | null | undefined;
|
|
115
|
+
invalidUserIds: string[];
|
|
116
|
+
errorCode?: string | null | undefined;
|
|
117
|
+
createdAt: string;
|
|
118
|
+
updatedAt: string;
|
|
119
|
+
}>;
|
|
120
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { resolveBackendUrl } from "../backend.js";
|
|
2
|
+
import { ensureAccessToken, fetchWithKeycloakIdentity } from "../oauth.js";
|
|
3
|
+
import { WecomError } from "./errors.js";
|
|
4
|
+
import { CapabilitiesSchema, MessageSchema, RecipientQuerySchema, RecipientsSchema, RequestIdSchema, SendMessageSchema, MappingListSchema, MappingSchema, MappingSyncSchema, PlatformUserIdSchema, UserIdSchema } from "./schemas.js";
|
|
5
|
+
export const WECOM_MAPPING_ROOT = "/api/v1/admin/notifications/wecom/mappings";
|
|
6
|
+
export const WECOM_API_ROOT = "/api/v1/notifications/wecom";
|
|
7
|
+
// Full-directory mapping sync can return 9,999 rows; ordinary message APIs stay small.
|
|
8
|
+
const MESSAGE_RESPONSE_LIMIT = 1024 * 1024;
|
|
9
|
+
const MAPPING_RESPONSE_LIMIT = 32 * 1024 * 1024;
|
|
10
|
+
async function boundedResponseText(response, maximumBytes) {
|
|
11
|
+
if (!response.body)
|
|
12
|
+
return "";
|
|
13
|
+
const reader = response.body.getReader();
|
|
14
|
+
const chunks = [];
|
|
15
|
+
let bytes = 0;
|
|
16
|
+
let completed = false;
|
|
17
|
+
try {
|
|
18
|
+
while (true) {
|
|
19
|
+
const chunk = await reader.read();
|
|
20
|
+
if (chunk.done) {
|
|
21
|
+
completed = true;
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
bytes += chunk.value.byteLength;
|
|
25
|
+
if (bytes > maximumBytes)
|
|
26
|
+
throw new Error("Response exceeds the bounded read limit");
|
|
27
|
+
chunks.push(chunk.value);
|
|
28
|
+
}
|
|
29
|
+
return new TextDecoder("utf-8", { fatal: true }).decode(Buffer.concat(chunks, bytes));
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
if (!completed)
|
|
33
|
+
await reader.cancel().catch(() => undefined);
|
|
34
|
+
reader.releaseLock();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function validate(schema, input, label) {
|
|
38
|
+
const result = schema.safeParse(input);
|
|
39
|
+
if (!result.success)
|
|
40
|
+
throw new WecomError(`Invalid ${label}. Check numa wecom help; message content is never included in errors.`, "WECOM_INPUT_INVALID");
|
|
41
|
+
return result.data;
|
|
42
|
+
}
|
|
43
|
+
export class WecomClient {
|
|
44
|
+
config;
|
|
45
|
+
dependencies;
|
|
46
|
+
constructor(config, dependencies = {}) {
|
|
47
|
+
this.config = config;
|
|
48
|
+
this.dependencies = dependencies;
|
|
49
|
+
}
|
|
50
|
+
async json(path, schema, body, requestId, method = body == null ? "GET" : "POST") {
|
|
51
|
+
const url = resolveBackendUrl(this.config, { method, path });
|
|
52
|
+
let response;
|
|
53
|
+
try {
|
|
54
|
+
response = await fetchWithKeycloakIdentity(this.config, url, () => ({
|
|
55
|
+
method, redirect: "error", signal: AbortSignal.timeout(30_000),
|
|
56
|
+
headers: { Accept: "application/json", ...(body == null ? {} : { "Content-Type": "application/json", ...(requestId ? { "Idempotency-Key": requestId } : {}) }) },
|
|
57
|
+
...(body == null ? {} : { body: JSON.stringify(body) })
|
|
58
|
+
}), { fetch: this.dependencies.fetch ?? fetch, tokenProvider: this.dependencies.tokenProvider ?? ensureAccessToken });
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
// Authentication errors occur before sending and retain their login recovery code.
|
|
62
|
+
if (error instanceof Error && error.name === "AuthError")
|
|
63
|
+
throw error;
|
|
64
|
+
if (requestId)
|
|
65
|
+
throw this.unknown(requestId);
|
|
66
|
+
if (method !== "GET")
|
|
67
|
+
throw this.mappingUnknown();
|
|
68
|
+
throw new WecomError("WeCom platform request failed. Check the platform connection and authentication.", "WECOM_NETWORK_ERROR");
|
|
69
|
+
}
|
|
70
|
+
if (!response.ok) {
|
|
71
|
+
await response.body?.cancel().catch(() => undefined);
|
|
72
|
+
if (requestId && response.status >= 500)
|
|
73
|
+
throw this.unknown(requestId, response.status);
|
|
74
|
+
if (method !== "GET" && response.status >= 500)
|
|
75
|
+
throw this.mappingUnknown(response.status);
|
|
76
|
+
throw new WecomError(`WeCom platform API returned HTTP ${response.status}.`, "WECOM_API_ERROR", response.status, requestId);
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
const raw = await boundedResponseText(response, path.startsWith(WECOM_MAPPING_ROOT) ? MAPPING_RESPONSE_LIMIT : MESSAGE_RESPONSE_LIMIT);
|
|
80
|
+
const result = schema.safeParse(JSON.parse(raw));
|
|
81
|
+
if (!result.success)
|
|
82
|
+
throw new Error("invalid response");
|
|
83
|
+
return result.data;
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
if (requestId)
|
|
87
|
+
throw this.unknown(requestId, response.status);
|
|
88
|
+
if (method !== "GET")
|
|
89
|
+
throw this.mappingUnknown(response.status);
|
|
90
|
+
throw new WecomError("WeCom platform returned an invalid response.", "WECOM_INVALID_RESPONSE", response.status);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
mappingUnknown(status) {
|
|
94
|
+
return new WecomError("Mapping operation result is unknown. Run numa wecom mappings list to inspect current state before retrying.", "WECOM_MAPPING_RESULT_UNKNOWN", status);
|
|
95
|
+
}
|
|
96
|
+
unknown(requestId, status) {
|
|
97
|
+
return new WecomError(`Send result is unknown. Run numa wecom status --request-id ${requestId}; do not send again with a new request ID.`, "WECOM_RESULT_UNKNOWN", status, requestId);
|
|
98
|
+
}
|
|
99
|
+
mappings(query, limit = 100) {
|
|
100
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > 1000)
|
|
101
|
+
throw new WecomError("Mapping limit must be between 1 and 1000.", "WECOM_INPUT_INVALID");
|
|
102
|
+
if (query != null && query.length > 256)
|
|
103
|
+
throw new WecomError("Mapping query is too long.", "WECOM_INPUT_INVALID");
|
|
104
|
+
const params = new URLSearchParams({ limit: String(limit) });
|
|
105
|
+
if (query?.trim())
|
|
106
|
+
params.set("query", query.trim());
|
|
107
|
+
return this.json(`${WECOM_MAPPING_ROOT}?${params}`, MappingListSchema);
|
|
108
|
+
}
|
|
109
|
+
syncMappings(dryRun = true) {
|
|
110
|
+
return this.json(`${WECOM_MAPPING_ROOT}/sync`, MappingSyncSchema, { dryRun });
|
|
111
|
+
}
|
|
112
|
+
bindMapping(subject, userId) {
|
|
113
|
+
const id = validate(PlatformUserIdSchema, subject, "Keycloak subject");
|
|
114
|
+
const wecomUserId = validate(UserIdSchema, userId, "WeCom userid");
|
|
115
|
+
return this.json(`${WECOM_MAPPING_ROOT}/${encodeURIComponent(id)}`, MappingSchema, { wecomUserId }, undefined, "PUT");
|
|
116
|
+
}
|
|
117
|
+
unbindMapping(subject) {
|
|
118
|
+
const id = validate(PlatformUserIdSchema, subject, "Keycloak subject");
|
|
119
|
+
return this.json(`${WECOM_MAPPING_ROOT}/${encodeURIComponent(id)}`, MappingSchema, undefined, undefined, "DELETE");
|
|
120
|
+
}
|
|
121
|
+
capabilities() { return this.json(`${WECOM_API_ROOT}/capabilities`, CapabilitiesSchema); }
|
|
122
|
+
recipients(query, limit = 20) {
|
|
123
|
+
const validated = validate(RecipientQuerySchema, query, "recipient query (2-100 characters)");
|
|
124
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > 50)
|
|
125
|
+
throw new WecomError("limit must be between 1 and 50.", "WECOM_INPUT_INVALID");
|
|
126
|
+
return this.json(`${WECOM_API_ROOT}/recipients?${new URLSearchParams({ query: validated, limit: String(limit) })}`, RecipientsSchema);
|
|
127
|
+
}
|
|
128
|
+
send(input, requestId) {
|
|
129
|
+
const key = validate(RequestIdSchema, requestId, "request ID (8-128 safe ASCII characters)");
|
|
130
|
+
const body = validate(SendMessageSchema, input, "message or recipients");
|
|
131
|
+
return this.json(`${WECOM_API_ROOT}/messages`, MessageSchema, body, key);
|
|
132
|
+
}
|
|
133
|
+
status(id) {
|
|
134
|
+
if (!/^[A-Za-z0-9_-]{1,128}$/u.test(id))
|
|
135
|
+
throw new WecomError("Invalid message ID.", "WECOM_INPUT_INVALID");
|
|
136
|
+
return this.json(`${WECOM_API_ROOT}/messages/${encodeURIComponent(id)}`, MessageSchema);
|
|
137
|
+
}
|
|
138
|
+
statusByRequest(requestId) {
|
|
139
|
+
const key = validate(RequestIdSchema, requestId, "request ID");
|
|
140
|
+
return this.json(`${WECOM_API_ROOT}/messages/by-request/${encodeURIComponent(key)}`, MessageSchema);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/wecom/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import { WecomClient } from "./client.js";
|
|
3
|
+
export interface WecomCommandDependencies {
|
|
4
|
+
clientFactory?: () => WecomClient;
|
|
5
|
+
stdin?: AsyncIterable<Uint8Array | string>;
|
|
6
|
+
}
|
|
7
|
+
export declare function readMessageContent(file: string | undefined, inline: string | undefined, stdin: AsyncIterable<Uint8Array | string>): Promise<string>;
|
|
8
|
+
export declare function registerWecomCommands(program: Command, dependencies?: WecomCommandDependencies): void;
|