@numa-tech/numa 1.26.8 → 1.26.10
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 +14 -2
- package/dist/ai-registry/commands.js +192 -129
- package/dist/ai-registry/commands.js.map +1 -1
- package/dist/ai-registry/install-conflicts.d.ts +9 -0
- package/dist/ai-registry/install-conflicts.js +59 -0
- package/dist/ai-registry/install-conflicts.js.map +1 -0
- package/dist/ai-registry/install-defaults.js +3 -2
- package/dist/ai-registry/install-defaults.js.map +1 -1
- package/dist/cli.js +39 -28
- package/dist/cli.js.map +1 -1
- package/dist/command-catalog.js +10 -3
- package/dist/command-catalog.js.map +1 -1
- package/dist/interactive/entry.js +1 -1
- package/dist/interactive/entry.js.map +1 -1
- package/dist/interactive/prompts.d.ts +2 -1
- package/dist/interactive/prompts.js +13 -5
- package/dist/interactive/prompts.js.map +1 -1
- package/dist/interactive/registry.d.ts +15 -0
- package/dist/interactive/registry.js +62 -3
- package/dist/interactive/registry.js.map +1 -1
- package/dist/jev/client.d.ts +17 -0
- package/dist/jev/client.js +127 -0
- package/dist/jev/client.js.map +1 -0
- package/dist/jev/commands.d.ts +8 -0
- package/dist/jev/commands.js +40 -0
- package/dist/jev/commands.js.map +1 -0
- package/dist/jev/errors.d.ts +39 -0
- package/dist/jev/errors.js +48 -0
- package/dist/jev/errors.js.map +1 -0
- package/dist/jev/input.d.ts +11 -0
- package/dist/jev/input.js +126 -0
- package/dist/jev/input.js.map +1 -0
- package/dist/jev/profile.d.ts +3 -0
- package/dist/jev/profile.js +26 -0
- package/dist/jev/profile.js.map +1 -0
- package/dist/jev/response.d.ts +3 -0
- package/dist/jev/response.js +38 -0
- package/dist/jev/response.js.map +1 -0
- package/dist/kb/web-page.js +70 -13
- package/dist/kb/web-page.js.map +1 -1
- package/dist/kb/web-queue.d.ts +3 -0
- package/dist/kb/web-queue.js +21 -1
- package/dist/kb/web-queue.js.map +1 -1
- package/dist/kb/web.js +12 -0
- package/dist/kb/web.js.map +1 -1
- package/dist/mcp-gateway/runtime.d.ts +95 -0
- package/dist/mcp-gateway/runtime.js +25 -3
- package/dist/mcp-gateway/runtime.js.map +1 -1
- package/docs/design/kb-web-workspace.md +19 -1
- package/docs/module-maintenance-and-skills-updates.md +18 -0
- package/examples/jev/README.md +6 -2
- package/examples/oss/__pycache__/roundtrip.cpython-314.pyc +0 -0
- package/examples/oss/__pycache__/test_roundtrip.cpython-314.pyc +0 -0
- package/package.json +4 -4
- package/skills/numa-cli/SKILL.md +10 -6
- package/skills/numa-cli/evals/evals.json +27 -0
- package/skills/numa-cli/numa-skill.json +1 -1
- package/skills/numa-cli/references/authoring.md +29 -0
- package/skills/numa-cli/references/cli-bootstrap.md +3 -3
- package/skills/numa-jev/SKILL.md +11 -9
- package/skills/numa-jev/numa-skill.json +5 -2
- package/skills/numa-jev/references/application-integration.md +2 -2
- package/skills/numa-jev/references/cli-usage.md +62 -0
- package/skills/numa-jev/references/mcp-usage.md +3 -1
|
@@ -6,7 +6,7 @@ export async function completeRegistryInstall(kind, name, input, client, ui) {
|
|
|
6
6
|
const options = { ...input };
|
|
7
7
|
const selection = { ...input, requiredAction: "install" };
|
|
8
8
|
let context = await initialRegistryNamespace(client, selection, ui);
|
|
9
|
-
if (name && !input.namespace && context.source !== "cli") {
|
|
9
|
+
if (kind === "mcp" && name && !input.namespace && context.source !== "cli") {
|
|
10
10
|
const choice = await ui.choose("来源 namespace", [
|
|
11
11
|
{ value: "@continue", label: `使用 ${context.namespace.namespaceKey}`, hint: context.namespace.instanceCode },
|
|
12
12
|
{ value: "@namespace", label: "更换 namespace" },
|
|
@@ -132,7 +132,12 @@ export async function completeRegistryInstall(kind, name, input, client, ui) {
|
|
|
132
132
|
"openclaw",
|
|
133
133
|
"custom",
|
|
134
134
|
];
|
|
135
|
-
options.agent
|
|
135
|
+
if (!options.agent) {
|
|
136
|
+
options.agent = kind === "skill"
|
|
137
|
+
? (await ui.multiple("安装到哪些 Agents?(空格勾选,回车确认)", agents.map(value => ({ value, label: value })), ["workbuddy"])).join(",")
|
|
138
|
+
: await ui.choose("安装到哪个 Agent?", agents.map(value => ({ value, label: value })), "workbuddy");
|
|
139
|
+
requireInput(options.agent, "请至少选择一个 Agent");
|
|
140
|
+
}
|
|
136
141
|
options.scope ??=
|
|
137
142
|
kind === "mcp" && ["codex", "openclaw", "chatgpt"].includes(options.agent)
|
|
138
143
|
? "user"
|
|
@@ -142,7 +147,7 @@ export async function completeRegistryInstall(kind, name, input, client, ui) {
|
|
|
142
147
|
], "user");
|
|
143
148
|
if (options.scope === "project")
|
|
144
149
|
options.workspace ||= await ui.text("项目目录", process.cwd());
|
|
145
|
-
if (options.agent
|
|
150
|
+
if (options.agent.split(",").map(value => value.trim()).includes("custom")) {
|
|
146
151
|
if (kind === "skill")
|
|
147
152
|
options.customRoot ||= await ui.text("Skills 根目录");
|
|
148
153
|
else
|
|
@@ -153,4 +158,58 @@ export async function completeRegistryInstall(kind, name, input, client, ui) {
|
|
|
153
158
|
.slice(0, 2000)}`, "已选择资源");
|
|
154
159
|
return { name, options };
|
|
155
160
|
}
|
|
161
|
+
/** Collect the complete authorized catalog before choosing, so selection spans pages. */
|
|
162
|
+
export async function completeSkillBatchInstall(names, input, client, ui) {
|
|
163
|
+
let shared = { ...input };
|
|
164
|
+
if (!names.length) {
|
|
165
|
+
const selection = { ...input, requiredAction: "install" };
|
|
166
|
+
let context = await initialRegistryNamespace(client, selection, ui);
|
|
167
|
+
while (!names.length) {
|
|
168
|
+
const choices = new Map();
|
|
169
|
+
for (let page = 1;; page++) {
|
|
170
|
+
const result = await client.listSkills(context.namespace.id, { pageNo: page, pageSize: 100 });
|
|
171
|
+
const raw = result.pageItems ?? result.items;
|
|
172
|
+
if (!Array.isArray(raw))
|
|
173
|
+
throw new AiRegistryError("资源列表缺少有效分页数据。", "ai_registry_invalid_response");
|
|
174
|
+
for (const item of raw) {
|
|
175
|
+
if (item && typeof item === "object" && typeof item.name === "string" && item.enable !== false)
|
|
176
|
+
choices.set(item.name, { value: item.name, label: item.name, hint: String(item.description ?? "") });
|
|
177
|
+
}
|
|
178
|
+
const total = Number(result.totalCount);
|
|
179
|
+
const more = Number.isFinite(total) ? page * 100 < total : raw.length === 100;
|
|
180
|
+
if (!more)
|
|
181
|
+
break;
|
|
182
|
+
if (!raw.length || page >= 100)
|
|
183
|
+
throw new AiRegistryError("Skills 列表过大或分页异常;请用 skills install NAME... 指定名称。", "ai_registry_invalid_response");
|
|
184
|
+
}
|
|
185
|
+
const shortcut = { value: "@namespace", label: "更换来源" };
|
|
186
|
+
const message = `${context.namespace.instanceCode} / ${context.namespace.namespaceKey} · 选择要安装的 Skills(可搜索,空格勾选,回车确认)`;
|
|
187
|
+
const picked = choices.size
|
|
188
|
+
? await ui.multiple(message, [...choices.values()], [], shortcut)
|
|
189
|
+
: [await ui.choose(`${message} · 当前来源没有可安装的 Skills`, [shortcut], undefined, shortcut)];
|
|
190
|
+
if (picked.includes(shortcut.value)) {
|
|
191
|
+
context = await chooseRegistryNamespace(client, selection, ui);
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
names = picked;
|
|
195
|
+
requireInput(names.length && names.every(name => choices.has(name)), "请至少选择一个有效的 Skill");
|
|
196
|
+
}
|
|
197
|
+
shared = { ...shared, namespace: context.namespace.namespaceKey, instance: context.namespace.instanceCode };
|
|
198
|
+
}
|
|
199
|
+
const uniqueNames = [...new Set(names)];
|
|
200
|
+
if (uniqueNames.length > 1 && !shared.version && !shared.label) {
|
|
201
|
+
shared.label = "latest";
|
|
202
|
+
ui.note("已选择多个 Skills,将直接使用各自已发布的 latest 版本,无需逐个选择版本。", "安装版本");
|
|
203
|
+
}
|
|
204
|
+
const selected = [];
|
|
205
|
+
for (const name of uniqueNames) {
|
|
206
|
+
const item = await completeRegistryInstall("skill", name, shared, client, ui);
|
|
207
|
+
selected.push(item);
|
|
208
|
+
// Resolve each Skill's version independently; share only source and destinations.
|
|
209
|
+
shared = { ...shared, namespace: item.options.namespace, instance: item.options.instance,
|
|
210
|
+
agent: item.options.agent, scope: item.options.scope, workspace: item.options.workspace,
|
|
211
|
+
customRoot: item.options.customRoot };
|
|
212
|
+
}
|
|
213
|
+
return selected;
|
|
214
|
+
}
|
|
156
215
|
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/interactive/registry.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/interactive/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AuthConfig } from "../config.js";
|
|
2
|
+
import { type KeycloakTokenProvider } from "../oauth.js";
|
|
3
|
+
import { type JevInput, type JsonObject } from "./input.js";
|
|
4
|
+
export interface JevDependencies {
|
|
5
|
+
config?: () => AuthConfig;
|
|
6
|
+
initializeProfile?: () => Promise<void>;
|
|
7
|
+
fetch?: typeof fetch;
|
|
8
|
+
tokenProvider?: KeycloakTokenProvider;
|
|
9
|
+
}
|
|
10
|
+
/** A decision is one platform HTTP POST. Availability and authorization are reported by that request. */
|
|
11
|
+
export declare class JevClient {
|
|
12
|
+
private readonly dependencies;
|
|
13
|
+
constructor(dependencies?: JevDependencies);
|
|
14
|
+
private request;
|
|
15
|
+
capabilities(): Promise<JsonObject>;
|
|
16
|
+
decide(input: JevInput): Promise<JsonObject>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { resolveBackendUrl } from "../backend.js";
|
|
2
|
+
import { ensureAccessToken, fetchWithKeycloakIdentity } from "../oauth.js";
|
|
3
|
+
import { initializePlatformProfile } from "../platform-profile.js";
|
|
4
|
+
import { platformJevTarget } from "./profile.js";
|
|
5
|
+
import { JevError } from "./errors.js";
|
|
6
|
+
import { object, parseJevInput } from "./input.js";
|
|
7
|
+
import { validateJevResponse } from "./response.js";
|
|
8
|
+
const knownCodes = new Set([
|
|
9
|
+
"JEV_ACCESS_DENIED", "JEV_AUTHENTICATION_REQUIRED", "JEV_PERMISSION_UNAVAILABLE", "JEV_INVALID_REQUEST",
|
|
10
|
+
"JEV_REQUEST_TOO_LARGE", "JEV_INVALID_RESPONSE", "JEV_NOT_CONFIGURED", "JEV_BUSY", "JEV_AUDIT_UNAVAILABLE",
|
|
11
|
+
"JEV_BALANCE_INSUFFICIENT", "JEV_RATE_LIMITED", "JEV_PROXY_AUTH_REQUIRED", "JEV_UPSTREAM_FORBIDDEN",
|
|
12
|
+
"JEV_UPSTREAM_REJECTED", "JEV_UPSTREAM_TIMEOUT", "JEV_UPSTREAM_UNAUTHORIZED", "JEV_UPSTREAM_UNAVAILABLE", "JEV_UNAVAILABLE",
|
|
13
|
+
"OUTBOUND_PROXY_REQUIRED", "OUTBOUND_PROXY_UNAVAILABLE", "OUTBOUND_PROXY_AUTH_REQUIRED", "OUTBOUND_CONNECT_FAILED",
|
|
14
|
+
"OUTBOUND_CREDENTIAL_UNAVAILABLE", "OUTBOUND_INVALID_CONFIGURATION",
|
|
15
|
+
]);
|
|
16
|
+
const uncertainCodes = new Set(["JEV_AUDIT_UNAVAILABLE", "JEV_UNAVAILABLE", "JEV_UPSTREAM_UNAVAILABLE", "JEV_UPSTREAM_TIMEOUT", "JEV_INVALID_RESPONSE"]);
|
|
17
|
+
async function readBounded(response, limit) {
|
|
18
|
+
const reader = response.body?.getReader();
|
|
19
|
+
if (!reader)
|
|
20
|
+
throw new Error("empty response");
|
|
21
|
+
const chunks = [];
|
|
22
|
+
let size = 0;
|
|
23
|
+
try {
|
|
24
|
+
while (true) {
|
|
25
|
+
const { value, done } = await reader.read();
|
|
26
|
+
if (done)
|
|
27
|
+
break;
|
|
28
|
+
size += value.length;
|
|
29
|
+
if (size > limit)
|
|
30
|
+
throw new Error("response limit");
|
|
31
|
+
chunks.push(value);
|
|
32
|
+
}
|
|
33
|
+
return JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(Buffer.concat(chunks)));
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
await reader.cancel().catch(() => undefined);
|
|
37
|
+
reader.releaseLock();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** A decision is one platform HTTP POST. Availability and authorization are reported by that request. */
|
|
41
|
+
export class JevClient {
|
|
42
|
+
dependencies;
|
|
43
|
+
constructor(dependencies = {}) {
|
|
44
|
+
this.dependencies = dependencies;
|
|
45
|
+
}
|
|
46
|
+
async request(path, body) {
|
|
47
|
+
let auth;
|
|
48
|
+
try {
|
|
49
|
+
if (this.dependencies.initializeProfile)
|
|
50
|
+
await this.dependencies.initializeProfile();
|
|
51
|
+
else if (!this.dependencies.config)
|
|
52
|
+
await initializePlatformProfile({ warn: message => process.stderr.write(`警告: ${message}\n`) });
|
|
53
|
+
auth = (this.dependencies.config ?? platformJevTarget)();
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
if (error instanceof JevError)
|
|
57
|
+
throw error;
|
|
58
|
+
throw new JevError("无法加载当前平台配置;请求尚未发送。", "JEV_CONFIGURATION_REQUIRED");
|
|
59
|
+
}
|
|
60
|
+
const method = body ? "POST" : "GET";
|
|
61
|
+
let url;
|
|
62
|
+
try {
|
|
63
|
+
url = resolveBackendUrl(auth, { method, path });
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
throw new JevError("平台 API 地址配置无效;请求尚未发送。", "JEV_CONFIGURATION_REQUIRED");
|
|
67
|
+
}
|
|
68
|
+
let sent = false, token = "", response;
|
|
69
|
+
try {
|
|
70
|
+
response = await fetchWithKeycloakIdentity(auth, url, () => ({
|
|
71
|
+
method, redirect: "error", signal: AbortSignal.timeout(60_000),
|
|
72
|
+
headers: { Accept: "application/json", ...(body ? { "Content-Type": "application/json" } : {}) },
|
|
73
|
+
...(body ? { body: JSON.stringify(body) } : {}),
|
|
74
|
+
}), {
|
|
75
|
+
tokenProvider: async (config, refresh) => { token = await (this.dependencies.tokenProvider ?? ensureAccessToken)(config, refresh); return token; },
|
|
76
|
+
fetch: async (target, init) => { sent = true; return (this.dependencies.fetch ?? fetch)(target, init); },
|
|
77
|
+
retryUnauthorized: false,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
if (!sent) {
|
|
82
|
+
if (auth.authenticationMode !== "client_credentials" && error instanceof Error && "code" in error && error.code === "login_required")
|
|
83
|
+
throw new JevError("当前平台身份需要登录;请求尚未发送。", "login_required", 401);
|
|
84
|
+
throw new JevError("当前平台身份无法获取访问凭据;请求尚未发送。", "JEV_IDENTITY_UNAVAILABLE");
|
|
85
|
+
}
|
|
86
|
+
throw new JevError(body ? "Jev 请求中断,结果可能未知且可能已计费;未自动重试。" : "无法读取 Jev 可用性;未自动重试。", body ? "JEV_RESULT_UNKNOWN" : "JEV_NETWORK_ERROR", undefined, body ? "unknown" : "rejected");
|
|
87
|
+
}
|
|
88
|
+
let value;
|
|
89
|
+
try {
|
|
90
|
+
value = await readBounded(response, response.ok ? 1024 * 1024 : 16 * 1024);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
if (response.ok)
|
|
94
|
+
throw new JevError("Jev 响应格式无效或超过大小限制;未自动重试。", "JEV_INVALID_RESPONSE", 502, body ? "unknown" : "rejected");
|
|
95
|
+
}
|
|
96
|
+
if (!response.ok) {
|
|
97
|
+
const code = response.status === 401 && auth.authenticationMode === "client_credentials" ? "JEV_MACHINE_AUTHENTICATION_REQUIRED"
|
|
98
|
+
: object(value) && typeof value.code === "string" && knownCodes.has(value.code) ? value.code
|
|
99
|
+
: response.status === 401 ? "login_required" : response.status === 403 ? "JEV_ACCESS_DENIED" : "JEV_HTTP_ERROR";
|
|
100
|
+
const unknown = Boolean(body && (uncertainCodes.has(code) || code === "JEV_HTTP_ERROR" && (response.status >= 500 || response.status === 408)));
|
|
101
|
+
throw new JevError(`Jev API 调用失败(HTTP ${response.status},${code});未自动重试。`, code, response.status, unknown ? "unknown" : "rejected");
|
|
102
|
+
}
|
|
103
|
+
if (!object(value))
|
|
104
|
+
throw new JevError("Jev 响应不是有效对象;未自动重试。", "JEV_INVALID_RESPONSE", 502, body ? "unknown" : "rejected");
|
|
105
|
+
try {
|
|
106
|
+
// Redact JSON string tokens, including keys, without rewriting numeric answers/usage.
|
|
107
|
+
const secrets = [token, auth.clientSecret].filter((secret) => Boolean(secret));
|
|
108
|
+
const serialized = JSON.stringify(value).replace(/"(?:\\[\s\S]|[^"\\])*"/gu, literal => JSON.stringify(secrets.reduce((text, secret) => text.split(secret).join("[REDACTED]"), JSON.parse(literal))));
|
|
109
|
+
return JSON.parse(serialized);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
throw new JevError("Jev 响应无法安全解析;未自动重试。", "JEV_INVALID_RESPONSE", 502, body ? "unknown" : "rejected");
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async capabilities() {
|
|
116
|
+
const value = await this.request("/api/v1/jev/capabilities");
|
|
117
|
+
if (typeof value.enabled !== "boolean" || typeof value.configured !== "boolean")
|
|
118
|
+
throw new JevError("Jev 可用性响应格式无效。", "JEV_INVALID_RESPONSE", 502, "rejected");
|
|
119
|
+
return Object.fromEntries(["enabled", "configured", "models", "defaultModel", "questionTypes", "maxRequestBytes", "maxQuestions", "maxChoiceOptions", "maxScoreLevels"]
|
|
120
|
+
.filter(k => Object.hasOwn(value, k)).map(k => [k, value[k]]));
|
|
121
|
+
}
|
|
122
|
+
async decide(input) {
|
|
123
|
+
const body = parseJevInput(JSON.stringify(input));
|
|
124
|
+
return validateJevResponse(await this.request("/api/v1/jev/decisions", body), body);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/jev/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import { JevClient } from "./client.js";
|
|
3
|
+
export interface JevCommandDependencies {
|
|
4
|
+
clientFactory?: () => Pick<JevClient, "capabilities" | "decide">;
|
|
5
|
+
write?: (text: string) => void;
|
|
6
|
+
stdin?: AsyncIterable<Uint8Array | string>;
|
|
7
|
+
}
|
|
8
|
+
export declare function registerJevCommands(program: Command, dependencies?: JevCommandDependencies): void;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { JevClient } from "./client.js";
|
|
2
|
+
import { JevError, jevExitCode, jevFailure } from "./errors.js";
|
|
3
|
+
import { readJevInput } from "./input.js";
|
|
4
|
+
export function registerJevCommands(program, dependencies = {}) {
|
|
5
|
+
const client = () => dependencies.clientFactory?.() ?? new JevClient();
|
|
6
|
+
const output = (data) => (dependencies.write ?? (text => process.stdout.write(text)))(`${JSON.stringify(data, null, 2)}\n`);
|
|
7
|
+
async function run(action) {
|
|
8
|
+
try {
|
|
9
|
+
output(await action());
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
if (!(error instanceof JevError))
|
|
13
|
+
throw error;
|
|
14
|
+
output(jevFailure(error));
|
|
15
|
+
process.exitCode = jevExitCode(error);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const jev = program.command("jev").description("通过平台 HTTP API 直接调用 Jev;CLI 完成校验并返回可用性与下一步")
|
|
19
|
+
.addHelpText("after", "\nnuma jev decide --file request.json --json\ncat request.json | numa jev decide --file - --json\n直接提交业务请求,无需先调用 capabilities、--check 或 MCP 探测。\n沿用当前平台配置和 numa login --platform 身份;不使用 MCP namespace/endpoint 参数。\ncapabilities 和 --check 仅供主动诊断,不自动重试付费推理,不接收 OpenRouter Key。\n");
|
|
20
|
+
jev.command("capabilities").description("可选诊断:读取 Jev 启用状态、模型和限制(view 权限)")
|
|
21
|
+
.action(async () => run(async () => {
|
|
22
|
+
const data = await client().capabilities();
|
|
23
|
+
return { ok: true, status: "succeeded", data,
|
|
24
|
+
availability: { state: data.enabled && data.configured ? "configured" : "not_configured", source: "capabilities", inference_verified: false } };
|
|
25
|
+
}));
|
|
26
|
+
jev.command("decide").description("一次提交业务判断并返回结果或可执行诊断(edit 权限,可能计费)")
|
|
27
|
+
.option("-f, --file <path|->", "UTF-8 JSON 文件;- 从标准输入读取,最大 256 KiB(必填)")
|
|
28
|
+
.option("--check", "可选离线校验;正常调用已包含此校验,不登录、不联网")
|
|
29
|
+
.action(async (options) => run(async () => {
|
|
30
|
+
if (!options.file)
|
|
31
|
+
throw new JevError("缺少 --file;提供 JSON 文件路径或使用 --file - 读取标准输入。", "JEV_INPUT_INVALID", undefined, "not_sent", { issues: [{ path: "file", message: "需要 --file <path|->。" }] });
|
|
32
|
+
const input = await readJevInput(options.file, dependencies.stdin);
|
|
33
|
+
if (options.check)
|
|
34
|
+
return { ok: true, status: "succeeded", data: { valid: true, questions: Object.keys(input.questions).length, sent: false }, availability: { state: "not_checked", source: "local_validation" } };
|
|
35
|
+
const data = await client().decide(input);
|
|
36
|
+
return { ok: true, status: "succeeded", data, availability: { state: "available", source: "decision" },
|
|
37
|
+
validation: { input: "passed", response: "passed" }, execution: { state: "completed", automatic_retry: false } };
|
|
38
|
+
}));
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/jev/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export type JevExecution = "not_sent" | "rejected" | "unknown";
|
|
2
|
+
export declare class JevError extends Error {
|
|
3
|
+
readonly code: string;
|
|
4
|
+
readonly status?: number | undefined;
|
|
5
|
+
readonly execution: JevExecution;
|
|
6
|
+
readonly details?: unknown;
|
|
7
|
+
readonly requestId?: string | undefined;
|
|
8
|
+
constructor(message: string, code: string, status?: number | undefined, execution?: JevExecution, details?: unknown, requestId?: string | undefined);
|
|
9
|
+
}
|
|
10
|
+
export declare function jevExitCode(error: JevError): number;
|
|
11
|
+
/** Stable remediation is owned by the CLI, never copied from an upstream error body. */
|
|
12
|
+
export declare function jevFailure(error: JevError): {
|
|
13
|
+
ok: boolean;
|
|
14
|
+
status: string;
|
|
15
|
+
availability: {
|
|
16
|
+
state: string;
|
|
17
|
+
source: string;
|
|
18
|
+
};
|
|
19
|
+
execution: {
|
|
20
|
+
state: JevExecution;
|
|
21
|
+
automatic_retry: boolean;
|
|
22
|
+
};
|
|
23
|
+
error: {
|
|
24
|
+
code: string;
|
|
25
|
+
message: string;
|
|
26
|
+
status: number | null;
|
|
27
|
+
details?: {} | null | undefined;
|
|
28
|
+
request_id?: string | undefined;
|
|
29
|
+
};
|
|
30
|
+
next_action: {
|
|
31
|
+
type: string;
|
|
32
|
+
message: string;
|
|
33
|
+
command?: undefined;
|
|
34
|
+
} | {
|
|
35
|
+
type: string;
|
|
36
|
+
command: string;
|
|
37
|
+
message: string;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export class JevError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
status;
|
|
4
|
+
execution;
|
|
5
|
+
details;
|
|
6
|
+
requestId;
|
|
7
|
+
constructor(message, code, status, execution = "not_sent", details, requestId) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.code = code;
|
|
10
|
+
this.status = status;
|
|
11
|
+
this.execution = execution;
|
|
12
|
+
this.details = details;
|
|
13
|
+
this.requestId = requestId;
|
|
14
|
+
this.name = "JevError";
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function jevExitCode(error) {
|
|
18
|
+
return error.status === 401 ? 3 : error.status === 403 && error.code !== "JEV_UPSTREAM_FORBIDDEN" ? 4
|
|
19
|
+
: ["JEV_INPUT_INVALID", "JEV_INVALID_REQUEST", "JEV_REQUEST_TOO_LARGE", "JEV_UPSTREAM_REJECTED"].includes(error.code) ? 2 : 1;
|
|
20
|
+
}
|
|
21
|
+
/** Stable remediation is owned by the CLI, never copied from an upstream error body. */
|
|
22
|
+
export function jevFailure(error) {
|
|
23
|
+
const input = ["JEV_INPUT_INVALID", "JEV_INVALID_REQUEST", "JEV_REQUEST_TOO_LARGE", "JEV_UPSTREAM_REJECTED"].includes(error.code);
|
|
24
|
+
const machine = error.code === "JEV_MACHINE_AUTHENTICATION_REQUIRED";
|
|
25
|
+
const login = !machine && (error.code === "login_required" || error.status === 401);
|
|
26
|
+
const permission = error.status === 403 && error.code !== "JEV_UPSTREAM_FORBIDDEN";
|
|
27
|
+
const configuration = ["JEV_CONFIGURATION_REQUIRED", "JEV_IDENTITY_CONFIGURATION_INVALID"].includes(error.code);
|
|
28
|
+
const unknown = error.execution === "unknown";
|
|
29
|
+
return {
|
|
30
|
+
ok: false, status: unknown ? "pending" : input ? "needs_input" : "blocked",
|
|
31
|
+
availability: { state: input ? "not_checked" : login || machine ? "authentication_required" : permission ? "authorization_required"
|
|
32
|
+
: configuration ? "configuration_required" : error.code === "JEV_NOT_CONFIGURED" ? "not_configured"
|
|
33
|
+
: unknown ? "unknown" : "unavailable", source: "command" },
|
|
34
|
+
execution: { state: error.execution, automatic_retry: false },
|
|
35
|
+
error: { code: error.code, message: error.message, status: error.status ?? null,
|
|
36
|
+
...(error.details === undefined ? {} : { details: error.details }),
|
|
37
|
+
...(error.requestId ? { request_id: error.requestId } : {}) },
|
|
38
|
+
next_action: unknown ? { type: "review_unknown_result", message: "请求可能已计费;保留错误码和请求号,核对结果后再决定是否重新调用,不自动重放。" }
|
|
39
|
+
: input ? { type: "correct_input", message: "按字段诊断修正请求后直接重试,无需另做可用性测试。" }
|
|
40
|
+
: login ? { type: "login", command: "numa login --platform", message: "使用当前平台身份登录后重试。" }
|
|
41
|
+
: permission ? { type: "request_access", message: "请管理员授予当前身份 Jev 功能权限;不要更换身份或反复登录。" }
|
|
42
|
+
: configuration ? { type: "configure_platform", message: "修正当前平台 Profile/API 或进程身份配置后重试。" }
|
|
43
|
+
: machine || error.code === "JEV_IDENTITY_UNAVAILABLE" ? { type: "inspect_identity", message: "当前身份无法获取或使用凭据;核对受管身份配置与认证服务,不切换用户、读取秘密或改用浏览器登录。" }
|
|
44
|
+
: ["JEV_BUSY", "JEV_RATE_LIMITED"].includes(error.code) || error.status === 429 ? { type: "wait", message: "平台或上游限流;稍后按业务需要重新调用,CLI 未自动重试。" }
|
|
45
|
+
: { type: "contact_platform_admin", message: "将错误码交给平台管理员处理服务配置、代理或上游可用性;不要改走 MCP 或直连供应商。" },
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/jev/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const MAX_REQUEST_BYTES: number;
|
|
2
|
+
export type JsonObject = Record<string, unknown>;
|
|
3
|
+
export interface JevInput extends JsonObject {
|
|
4
|
+
state: string | JsonObject | unknown[];
|
|
5
|
+
questions: Record<string, JsonObject>;
|
|
6
|
+
model?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function object(value: unknown): value is JsonObject;
|
|
9
|
+
/** Parse strictly before transport so duplicate question IDs cannot silently disappear. */
|
|
10
|
+
export declare function parseJevInput(text: string): JevInput;
|
|
11
|
+
export declare function readJevInput(path: string, stdin?: AsyncIterable<Uint8Array | string>): Promise<JevInput>;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { open } from "node:fs/promises";
|
|
2
|
+
import { JevError } from "./errors.js";
|
|
3
|
+
export const MAX_REQUEST_BYTES = 256 * 1024;
|
|
4
|
+
export function object(value) { return value != null && typeof value === "object" && !Array.isArray(value); }
|
|
5
|
+
const invalid = (path = "input", message = "输入须为有效 UTF-8 JSON,且只包含 state、questions 和可选 model。") => new JevError("Jev 输入未通过校验;请求尚未发送。", "JEV_INPUT_INVALID", undefined, "not_sent", {
|
|
6
|
+
issues: [{ path, message }], limits: { maxRequestBytes: MAX_REQUEST_BYTES, maxQuestions: 16, maxChoiceOptions: 32, maxScoreLevels: 10 },
|
|
7
|
+
});
|
|
8
|
+
const id = (value) => value.trim().length > 0 && value.length <= 80 && !/[\p{Cc}]/u.test(value);
|
|
9
|
+
function description(value, nullable = false) {
|
|
10
|
+
return (nullable && value === null) || ((typeof value === "string" ? !!value.trim() : object(value) || Array.isArray(value))
|
|
11
|
+
&& Buffer.byteLength(JSON.stringify(value)) <= 8192);
|
|
12
|
+
}
|
|
13
|
+
/** Parse strictly before transport so duplicate question IDs cannot silently disappear. */
|
|
14
|
+
export function parseJevInput(text) {
|
|
15
|
+
try {
|
|
16
|
+
if (Buffer.byteLength(text) > MAX_REQUEST_BYTES)
|
|
17
|
+
throw invalid("input", "请求不能超过 256 KiB。");
|
|
18
|
+
const value = JSON.parse(text);
|
|
19
|
+
const stack = [];
|
|
20
|
+
for (const token of text.matchAll(/"(?:\\[\s\S]|[^"\\])*"|[{}\[\],:]/gu)) {
|
|
21
|
+
const t = token[0];
|
|
22
|
+
const frame = stack.at(-1);
|
|
23
|
+
if (t === "{" || t === "[") {
|
|
24
|
+
stack.push({ keys: t === "{" ? new Set() : undefined, expectingKey: true });
|
|
25
|
+
if (stack.length > 64)
|
|
26
|
+
throw invalid("input", "JSON 嵌套不能超过 64 层。");
|
|
27
|
+
}
|
|
28
|
+
else if (t === "}" || t === "]")
|
|
29
|
+
stack.pop();
|
|
30
|
+
else if (t === "," && frame)
|
|
31
|
+
frame.expectingKey = true;
|
|
32
|
+
else if (t === ":" && frame)
|
|
33
|
+
frame.expectingKey = false;
|
|
34
|
+
else if (t.startsWith('"') && frame?.keys && frame.expectingKey) {
|
|
35
|
+
const key = JSON.parse(t);
|
|
36
|
+
if (frame.keys.has(key))
|
|
37
|
+
throw invalid("input", "JSON 存在重复字段,不能静默覆盖。");
|
|
38
|
+
frame.keys.add(key);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (!object(value) || Object.keys(value).some(k => !["state", "questions", "model"].includes(k)))
|
|
42
|
+
throw invalid();
|
|
43
|
+
if (!(typeof value.state === "string" && !!value.state.trim()) && !object(value.state) && !Array.isArray(value.state))
|
|
44
|
+
throw invalid("state", "state 须为非空字符串、对象或数组。");
|
|
45
|
+
if (Object.hasOwn(value, "model") && (typeof value.model !== "string" || !["typesafe/jev-1.13", "~typesafe/jev-latest"].includes(value.model)))
|
|
46
|
+
throw invalid("model", "省略 model 使用平台默认值;显式模型须为 typesafe/jev-1.13 或 ~typesafe/jev-latest。");
|
|
47
|
+
if (!object(value.questions) || Object.keys(value.questions).length < 1 || Object.keys(value.questions).length > 16)
|
|
48
|
+
throw invalid("questions", "须包含 1–16 个独立问题。");
|
|
49
|
+
for (const [index, [key, q]] of Object.entries(value.questions).entries()) {
|
|
50
|
+
const field = `questions[${index}]`;
|
|
51
|
+
if (!id(key) || !object(q) || Object.keys(q).some(k => !["type", "instructions", "criteria"].includes(k)) || !description(q.instructions))
|
|
52
|
+
throw invalid(field, "问题 ID、字段或 instructions 无效;instructions 最多 8 KiB。");
|
|
53
|
+
if (q.type === "noul") {
|
|
54
|
+
if (Object.hasOwn(q, "criteria") && (!object(q.criteria) || Object.keys(q.criteria).some(k => !["true", "false"].includes(k)) || !Object.values(q.criteria).every(v => description(v, true))))
|
|
55
|
+
throw invalid(`${field}.criteria`, "noul criteria 只允许 true/false 描述。");
|
|
56
|
+
}
|
|
57
|
+
else if (q.type === "choice") {
|
|
58
|
+
if (!object(q.criteria) || Object.keys(q.criteria).length < 2 || Object.keys(q.criteria).length > 32
|
|
59
|
+
|| !Object.keys(q.criteria).every(id) || !Object.values(q.criteria).every(v => description(v, true)))
|
|
60
|
+
throw invalid(`${field}.criteria`, "choice 须包含 2–32 个有效候选。");
|
|
61
|
+
}
|
|
62
|
+
else if (q.type === "score") {
|
|
63
|
+
if (!Array.isArray(q.criteria) || q.criteria.length < 2 || q.criteria.length > 10 || !q.criteria.every(v => description(v, true)))
|
|
64
|
+
throw invalid(`${field}.criteria`, "score 须包含 2–10 个有序等级。");
|
|
65
|
+
}
|
|
66
|
+
else
|
|
67
|
+
throw invalid(`${field}.type`, "问题类型须为 noul、choice 或 score。");
|
|
68
|
+
}
|
|
69
|
+
return value;
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
if (error instanceof JevError)
|
|
73
|
+
throw error;
|
|
74
|
+
throw invalid();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export async function readJevInput(path, stdin = process.stdin) {
|
|
78
|
+
try {
|
|
79
|
+
let bytes;
|
|
80
|
+
if (path === "-") {
|
|
81
|
+
if (stdin === process.stdin && process.stdin.isTTY)
|
|
82
|
+
throw invalid("file", "--file - 需要通过管道提供 JSON 标准输入。");
|
|
83
|
+
const chunks = [];
|
|
84
|
+
let size = 0;
|
|
85
|
+
for await (const chunk of stdin) {
|
|
86
|
+
const b = Buffer.from(chunk);
|
|
87
|
+
size += b.length;
|
|
88
|
+
if (size > MAX_REQUEST_BYTES)
|
|
89
|
+
throw invalid("input", "请求不能超过 256 KiB。");
|
|
90
|
+
chunks.push(b);
|
|
91
|
+
}
|
|
92
|
+
bytes = Buffer.concat(chunks);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
const file = await open(path, "r");
|
|
96
|
+
try {
|
|
97
|
+
const stat = await file.stat();
|
|
98
|
+
if (!stat.isFile())
|
|
99
|
+
throw invalid("file", "输入路径须为普通文件。");
|
|
100
|
+
if (stat.size > MAX_REQUEST_BYTES)
|
|
101
|
+
throw invalid("input", "请求不能超过 256 KiB。");
|
|
102
|
+
bytes = Buffer.alloc(MAX_REQUEST_BYTES + 1);
|
|
103
|
+
let size = 0;
|
|
104
|
+
while (size < bytes.length) {
|
|
105
|
+
const read = await file.read(bytes, size, bytes.length - size, null);
|
|
106
|
+
if (!read.bytesRead)
|
|
107
|
+
break;
|
|
108
|
+
size += read.bytesRead;
|
|
109
|
+
}
|
|
110
|
+
if (size > MAX_REQUEST_BYTES)
|
|
111
|
+
throw invalid("input", "请求不能超过 256 KiB。");
|
|
112
|
+
bytes = bytes.subarray(0, size);
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
await file.close();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return parseJevInput(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
if (error instanceof JevError)
|
|
122
|
+
throw error;
|
|
123
|
+
throw invalid("file", "无法读取 UTF-8 JSON 文件或标准输入;仅接受最多 256 KiB 的普通文件。");
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/jev/input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,GAAG,IAAI,CAAC;AAG5C,MAAM,UAAU,MAAM,CAAC,KAAc,IAAyB,OAAO,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC3I,MAAM,OAAO,GAAG,CAAC,IAAI,GAAG,OAAO,EAAE,OAAO,GAAG,mDAAmD,EAAE,EAAE,CAChG,IAAI,QAAQ,CAAC,qBAAqB,EAAE,mBAAmB,EAAE,SAAS,EAAE,UAAU,EAAE;IAC9E,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,eAAe,EAAE,iBAAiB,EAAE,YAAY,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE;CACxI,CAAC,CAAC;AACL,MAAM,EAAE,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACxG,SAAS,WAAW,CAAC,KAAc,EAAE,QAAQ,GAAG,KAAK;IACnD,OAAO,CAAC,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;WACvH,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;AACzD,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,CAAC;QACH,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,iBAAiB;YAAE,MAAM,OAAO,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAC3F,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,KAAK,GAAyD,EAAE,CAAC;QACvE,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,qCAAqC,CAAC,EAAE,CAAC;YACzE,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAAC,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;gBAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;gBAAC,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE;oBAAE,MAAM,OAAO,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;YAAC,CAAC;iBAC3K,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG;gBAAE,KAAK,CAAC,GAAG,EAAE,CAAC;iBACxC,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK;gBAAE,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;iBAClD,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK;gBAAE,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC;iBACnD,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;gBAChE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAW,CAAC;gBACpC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,MAAM,OAAO,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;gBACvE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAAE,MAAM,OAAO,EAAE,CAAC;QAClH,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;YAAE,MAAM,OAAO,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;QACtK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAAE,MAAM,OAAO,CAAC,OAAO,EAAE,mEAAmE,CAAC,CAAC;QAC5O,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,EAAE;YAAE,MAAM,OAAO,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;QACnK,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;YAC1E,MAAM,KAAK,GAAG,aAAa,KAAK,GAAG,CAAC;YACpC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC;gBAAE,MAAM,OAAO,CAAC,KAAK,EAAE,kDAAkD,CAAC,CAAC;YACpN,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACtB,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;oBAAE,MAAM,OAAO,CAAC,GAAG,KAAK,WAAW,EAAE,kCAAkC,CAAC,CAAC;YACxQ,CAAC;iBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC/B,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,EAAE;uBAC/F,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;oBAAE,MAAM,OAAO,CAAC,GAAG,KAAK,WAAW,EAAE,wBAAwB,CAAC,CAAC;YACvK,CAAC;iBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;oBAAE,MAAM,OAAO,CAAC,GAAG,KAAK,WAAW,EAAE,uBAAuB,CAAC,CAAC;YACjM,CAAC;;gBAAM,MAAM,OAAO,CAAC,GAAG,KAAK,OAAO,EAAE,6BAA6B,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,KAAiB,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,IAAI,KAAK,YAAY,QAAQ;YAAE,MAAM,KAAK,CAAC;QAAC,MAAM,OAAO,EAAE,CAAC;IAAC,CAAC;AAClF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,KAAK,GAAuC,OAAO,CAAC,KAAK;IACxG,IAAI,CAAC;QACH,IAAI,KAAa,CAAC;QAClB,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,IAAI,KAAK,KAAK,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;gBAAE,MAAM,OAAO,CAAC,MAAM,EAAE,8BAA8B,CAAC,CAAC;YAC1G,MAAM,MAAM,GAAa,EAAE,CAAC;YAAC,IAAI,IAAI,GAAG,CAAC,CAAC;YAC1C,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;gBAAC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAAC,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC;gBAAC,IAAI,IAAI,GAAG,iBAAiB;oBAAE,MAAM,OAAO,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;gBAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YAC7K,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;gBAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;oBAAE,MAAM,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;gBACzF,IAAI,IAAI,CAAC,IAAI,GAAG,iBAAiB;oBAAE,MAAM,OAAO,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;gBAC7E,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC;gBAAC,IAAI,IAAI,GAAG,CAAC,CAAC;gBAC1D,OAAO,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;oBAAC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC;oBAAC,IAAI,CAAC,IAAI,CAAC,SAAS;wBAAE,MAAM;oBAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC;gBAAC,CAAC;gBACzJ,IAAI,IAAI,GAAG,iBAAiB;oBAAE,MAAM,OAAO,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;gBAAC,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAC3G,CAAC;oBAAS,CAAC;gBAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,CAAC;QACnC,CAAC;QACD,OAAO,aAAa,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAChF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,IAAI,KAAK,YAAY,QAAQ;YAAE,MAAM,KAAK,CAAC;QAAC,MAAM,OAAO,CAAC,MAAM,EAAE,8CAA8C,CAAC,CAAC;IAAC,CAAC;AACxI,CAAC"}
|