odai-dsh-agent 0.2.5 → 0.2.7
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 +3 -3
- package/build/bin/odai-dsh-agent.d.mts +3 -0
- package/build/bin/odai-dsh-agent.d.mts.map +1 -0
- package/build/bin/odai-dsh-agent.mjs +114 -0
- package/build/bin/odai-dsh-agent.mjs.map +1 -0
- package/build/src/dsh-version.d.mts +16 -0
- package/build/src/dsh-version.d.mts.map +1 -0
- package/build/src/dsh-version.mjs +20 -0
- package/build/src/dsh-version.mjs.map +1 -0
- package/build/src/installer.d.mts +46 -0
- package/build/src/installer.d.mts.map +1 -0
- package/build/src/installer.mjs +398 -0
- package/build/src/installer.mjs.map +1 -0
- package/package.json +13 -12
- package/preset/odai/runtime/compaction-config.d.mts +66 -0
- package/preset/odai/runtime/compaction-config.d.mts.map +1 -0
- package/preset/odai/runtime/compaction-config.mjs +320 -342
- package/preset/odai/runtime/compaction-config.mjs.map +1 -0
- package/preset/odai/runtime/compaction-runtime.d.mts +68 -0
- package/preset/odai/runtime/compaction-runtime.d.mts.map +1 -0
- package/preset/odai/runtime/compaction-runtime.mjs +157 -0
- package/preset/odai/runtime/compaction-runtime.mjs.map +1 -0
- package/preset/odai/runtime/context-activation.d.mts +31 -0
- package/preset/odai/runtime/context-activation.d.mts.map +1 -0
- package/preset/odai/runtime/context-activation.mjs +55 -49
- package/preset/odai/runtime/context-activation.mjs.map +1 -0
- package/preset/odai/runtime/context-capability.d.mts +16 -0
- package/preset/odai/runtime/context-capability.d.mts.map +1 -0
- package/preset/odai/runtime/context-capability.mjs +79 -74
- package/preset/odai/runtime/context-capability.mjs.map +1 -0
- package/preset/odai/runtime/governance.d.mts +30 -0
- package/preset/odai/runtime/governance.d.mts.map +1 -0
- package/preset/odai/runtime/governance.mjs +126 -113
- package/preset/odai/runtime/governance.mjs.map +1 -0
- package/preset/odai/runtime/human-care.d.mts +13 -0
- package/preset/odai/runtime/human-care.d.mts.map +1 -0
- package/preset/odai/runtime/human-care.mjs +45 -42
- package/preset/odai/runtime/human-care.mjs.map +1 -0
- package/preset/odai/runtime/human-safety-continuity-store.d.mts +43 -0
- package/preset/odai/runtime/human-safety-continuity-store.d.mts.map +1 -0
- package/preset/odai/runtime/human-safety-continuity-store.mjs +193 -215
- package/preset/odai/runtime/human-safety-continuity-store.mjs.map +1 -0
- package/preset/odai/runtime/human-safety-continuity.d.mts +27 -0
- package/preset/odai/runtime/human-safety-continuity.d.mts.map +1 -0
- package/preset/odai/runtime/human-safety-continuity.mjs +205 -216
- package/preset/odai/runtime/human-safety-continuity.mjs.map +1 -0
- package/preset/odai/runtime/human-safety.d.mts +14 -0
- package/preset/odai/runtime/human-safety.d.mts.map +1 -0
- package/preset/odai/runtime/human-safety.mjs +50 -47
- package/preset/odai/runtime/human-safety.mjs.map +1 -0
- package/preset/odai/runtime/index.d.mts +8 -0
- package/preset/odai/runtime/index.d.mts.map +1 -0
- package/preset/odai/runtime/index.mjs +190 -2473
- package/preset/odai/runtime/index.mjs.map +1 -0
- package/preset/odai/runtime/lifecycle-runtime.d.mts +83 -0
- package/preset/odai/runtime/lifecycle-runtime.d.mts.map +1 -0
- package/preset/odai/runtime/lifecycle-runtime.mjs +1140 -0
- package/preset/odai/runtime/lifecycle-runtime.mjs.map +1 -0
- package/preset/odai/runtime/model-route.d.mts +22 -0
- package/preset/odai/runtime/model-route.d.mts.map +1 -0
- package/preset/odai/runtime/model-route.mjs +68 -60
- package/preset/odai/runtime/model-route.mjs.map +1 -0
- package/preset/odai/runtime/output-config.d.mts +54 -0
- package/preset/odai/runtime/output-config.d.mts.map +1 -0
- package/preset/odai/runtime/output-config.mjs +289 -315
- package/preset/odai/runtime/output-config.mjs.map +1 -0
- package/preset/odai/runtime/output-policy-state.d.mts +3 -0
- package/preset/odai/runtime/output-policy-state.d.mts.map +1 -0
- package/preset/odai/runtime/output-policy-state.mjs +41 -29
- package/preset/odai/runtime/output-policy-state.mjs.map +1 -0
- package/preset/odai/runtime/prompt-runtime.d.mts +55 -0
- package/preset/odai/runtime/prompt-runtime.d.mts.map +1 -0
- package/preset/odai/runtime/prompt-runtime.mjs +303 -0
- package/preset/odai/runtime/prompt-runtime.mjs.map +1 -0
- package/preset/odai/runtime/research-packet.d.mts +30 -0
- package/preset/odai/runtime/research-packet.d.mts.map +1 -0
- package/preset/odai/runtime/research-packet.mjs +116 -117
- package/preset/odai/runtime/research-packet.mjs.map +1 -0
- package/preset/odai/runtime/responsibility-gap.d.mts +26 -0
- package/preset/odai/runtime/responsibility-gap.d.mts.map +1 -0
- package/preset/odai/runtime/responsibility-gap.mjs +93 -85
- package/preset/odai/runtime/responsibility-gap.mjs.map +1 -0
- package/preset/odai/runtime/responsibility-scope.d.mts +69 -0
- package/preset/odai/runtime/responsibility-scope.d.mts.map +1 -0
- package/preset/odai/runtime/responsibility-scope.mjs +199 -171
- package/preset/odai/runtime/responsibility-scope.mjs.map +1 -0
- package/preset/odai/runtime/role-overlays.d.mts +5 -0
- package/preset/odai/runtime/role-overlays.d.mts.map +1 -0
- package/preset/odai/runtime/role-overlays.mjs +15 -14
- package/preset/odai/runtime/role-overlays.mjs.map +1 -0
- package/preset/odai/runtime/route-card.d.mts +42 -0
- package/preset/odai/runtime/route-card.d.mts.map +1 -0
- package/preset/odai/runtime/route-card.mjs +158 -146
- package/preset/odai/runtime/route-card.mjs.map +1 -0
- package/preset/odai/runtime/router.d.mts +80 -0
- package/preset/odai/runtime/router.d.mts.map +1 -0
- package/preset/odai/runtime/router.mjs +509 -559
- package/preset/odai/runtime/router.mjs.map +1 -0
- package/preset/odai/runtime/routing-config.d.mts +76 -0
- package/preset/odai/runtime/routing-config.d.mts.map +1 -0
- package/preset/odai/runtime/routing-config.mjs +373 -438
- package/preset/odai/runtime/routing-config.mjs.map +1 -0
- package/preset/odai/runtime/routing-context.d.mts +64 -0
- package/preset/odai/runtime/routing-context.d.mts.map +1 -0
- package/preset/odai/runtime/routing-context.mjs +398 -277
- package/preset/odai/runtime/routing-context.mjs.map +1 -0
- package/preset/odai/runtime/runtime-config.d.mts +24 -0
- package/preset/odai/runtime/runtime-config.d.mts.map +1 -0
- package/preset/odai/runtime/runtime-config.mjs +181 -0
- package/preset/odai/runtime/runtime-config.mjs.map +1 -0
- package/preset/odai/runtime/runtime-support.d.mts +91 -0
- package/preset/odai/runtime/runtime-support.d.mts.map +1 -0
- package/preset/odai/runtime/runtime-support.mjs +371 -0
- package/preset/odai/runtime/runtime-support.mjs.map +1 -0
- package/preset/odai/runtime/runtime-types.d.mts +237 -0
- package/preset/odai/runtime/runtime-types.d.mts.map +1 -0
- package/preset/odai/runtime/runtime-types.mjs +4 -0
- package/preset/odai/runtime/runtime-types.mjs.map +1 -0
- package/preset/odai/runtime/semantic-memory-store.d.mts +110 -0
- package/preset/odai/runtime/semantic-memory-store.d.mts.map +1 -0
- package/preset/odai/runtime/semantic-memory-store.mjs +271 -385
- package/preset/odai/runtime/semantic-memory-store.mjs.map +1 -0
- package/preset/odai/runtime/semantic-memory.d.mts +88 -0
- package/preset/odai/runtime/semantic-memory.d.mts.map +1 -0
- package/preset/odai/runtime/semantic-memory.mjs +790 -750
- package/preset/odai/runtime/semantic-memory.mjs.map +1 -0
- package/preset/odai/runtime/session-compat.d.mts +31 -0
- package/preset/odai/runtime/session-compat.d.mts.map +1 -0
- package/preset/odai/runtime/session-compat.mjs +301 -328
- package/preset/odai/runtime/session-compat.mjs.map +1 -0
- package/preset/odai/runtime/session-evidence.d.mts +25 -0
- package/preset/odai/runtime/session-evidence.d.mts.map +1 -0
- package/preset/odai/runtime/session-evidence.mjs +309 -287
- package/preset/odai/runtime/session-evidence.mjs.map +1 -0
- package/preset/odai/runtime/skill-bundle.d.mts +53 -0
- package/preset/odai/runtime/skill-bundle.d.mts.map +1 -0
- package/preset/odai/runtime/skill-bundle.mjs +286 -276
- package/preset/odai/runtime/skill-bundle.mjs.map +1 -0
- package/preset/odai/runtime/skill-evolution.d.mts +112 -0
- package/preset/odai/runtime/skill-evolution.d.mts.map +1 -0
- package/preset/odai/runtime/skill-evolution.mjs +1287 -1261
- package/preset/odai/runtime/skill-evolution.mjs.map +1 -0
- package/preset/odai/runtime/skill-selection-state.d.mts +5 -0
- package/preset/odai/runtime/skill-selection-state.d.mts.map +1 -0
- package/preset/odai/runtime/skill-selection-state.mjs +59 -43
- package/preset/odai/runtime/skill-selection-state.mjs.map +1 -0
- package/preset/odai/runtime/skill-selector.d.mts +28 -0
- package/preset/odai/runtime/skill-selector.d.mts.map +1 -0
- package/preset/odai/runtime/skill-selector.mjs +100 -109
- package/preset/odai/runtime/skill-selector.mjs.map +1 -0
- package/preset/odai/runtime/skill-source-config.d.mts +32 -0
- package/preset/odai/runtime/skill-source-config.d.mts.map +1 -0
- package/preset/odai/runtime/skill-source-config.mjs +200 -210
- package/preset/odai/runtime/skill-source-config.mjs.map +1 -0
- package/preset/odai/runtime/store-lock.d.mts +2 -0
- package/preset/odai/runtime/store-lock.d.mts.map +1 -0
- package/preset/odai/runtime/store-lock.mjs +92 -87
- package/preset/odai/runtime/store-lock.mjs.map +1 -0
- package/preset/odai/runtime/tool-runtime.d.mts +43 -0
- package/preset/odai/runtime/tool-runtime.d.mts.map +1 -0
- package/preset/odai/runtime/tool-runtime.mjs +221 -0
- package/preset/odai/runtime/tool-runtime.mjs.map +1 -0
- package/bin/odai-dsh-agent.mjs +0 -108
- package/scripts/verify-agent-load.mjs +0 -260
- package/src/dsh-version.mjs +0 -24
- package/src/installer.mjs +0 -385
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { chmod, cp, lstat, mkdir, readFile, readdir, rename, rm, writeFile, } from "node:fs/promises";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { dirname, resolve, sep } from "node:path";
|
|
5
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
6
|
+
import { parse as parseYaml } from "yaml";
|
|
7
|
+
function isRecord(value) {
|
|
8
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
9
|
+
}
|
|
10
|
+
function errorMessage(error) {
|
|
11
|
+
return error instanceof Error ? error.message : String(error);
|
|
12
|
+
}
|
|
13
|
+
function errorCode(error) {
|
|
14
|
+
return isRecord(error) && typeof error.code === "string" ? error.code : undefined;
|
|
15
|
+
}
|
|
16
|
+
export const DEFAULT_PRESET_ID = "odai";
|
|
17
|
+
export const MANIFEST_FILE = ".odai-agent.json";
|
|
18
|
+
const moduleDirectory = dirname(fileURLToPath(import.meta.url));
|
|
19
|
+
const packageRoot = resolve(moduleDirectory, moduleDirectory.endsWith(`${sep}build${sep}src`) ? "../.." : "..");
|
|
20
|
+
const defaultSourceRoot = resolve(packageRoot, "preset/odai");
|
|
21
|
+
const parsedPackageMetadata = JSON.parse(await readFile(resolve(packageRoot, "package.json"), "utf8"));
|
|
22
|
+
if (!isRecord(parsedPackageMetadata) || typeof parsedPackageMetadata.name !== "string"
|
|
23
|
+
|| typeof parsedPackageMetadata.version !== "string" || !isRecord(parsedPackageMetadata.peerDependencies)) {
|
|
24
|
+
throw new Error("odai-dsh-agent package metadata is invalid");
|
|
25
|
+
}
|
|
26
|
+
const peerDependencies = Object.fromEntries(Object.entries(parsedPackageMetadata.peerDependencies).filter((entry) => typeof entry[1] === "string"));
|
|
27
|
+
const packageMetadata = {
|
|
28
|
+
name: parsedPackageMetadata.name,
|
|
29
|
+
version: parsedPackageMetadata.version,
|
|
30
|
+
peerDependencies,
|
|
31
|
+
};
|
|
32
|
+
const DSH_VERSION_PATTERN = /^(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/u;
|
|
33
|
+
const peerRange = packageMetadata.peerDependencies["@deepseek-ai/dsh"];
|
|
34
|
+
if (!peerRange)
|
|
35
|
+
throw new Error("odai-dsh-agent peer dependency is missing @deepseek-ai/dsh");
|
|
36
|
+
export const SUPPORTED_DSH_VERSIONS = Object.freeze(peerRange.split(/\s*\|\|\s*/u).filter(Boolean));
|
|
37
|
+
if (SUPPORTED_DSH_VERSIONS.length === 0 || SUPPORTED_DSH_VERSIONS.some((version) => !DSH_VERSION_PATTERN.test(version))) {
|
|
38
|
+
throw new Error("odai-dsh-agent peer dependency must list exact supported DSH versions");
|
|
39
|
+
}
|
|
40
|
+
const SOURCE_DSH_VERSION = "0.1.1-rc.2";
|
|
41
|
+
const OPTIONAL_PROVIDER_COMMENTS = Object.freeze({
|
|
42
|
+
"0.1.0-rc.7": " # Production dsh does not install these optional providers. An opting-in\n # Profile mounts each provider once on the host plane; copy this preset,\n # then remove `disabled` from the matching tool row.",
|
|
43
|
+
"0.1.1-rc.1": " # Production dsh does not install these optional providers. Install the\n # matching Bundle in this Profile and restart the Host, then copy this\n # preset and remove `disabled` from the matching tool row. Host availability\n # alone grants no tool.",
|
|
44
|
+
"0.1.1-rc.2": " # Production dsh does not install these optional providers. Install the\n # matching Bundle in this Profile and restart the Host, then copy this\n # preset and remove `disabled` from the matching tool row. Host availability\n # alone grants no tool.",
|
|
45
|
+
});
|
|
46
|
+
const compositionVersions = Object.keys(OPTIONAL_PROVIDER_COMMENTS);
|
|
47
|
+
if (JSON.stringify(SUPPORTED_DSH_VERSIONS) !== JSON.stringify(compositionVersions)) {
|
|
48
|
+
throw new Error(`Odai Agent peer versions ${SUPPORTED_DSH_VERSIONS.join(", ")} must exactly match composition contracts ${compositionVersions.join(", ")}`);
|
|
49
|
+
}
|
|
50
|
+
if (compositionVersions.at(-1) !== SOURCE_DSH_VERSION) {
|
|
51
|
+
throw new Error(`Odai Agent source composition targets ${SOURCE_DSH_VERSION}, not contract baseline ${compositionVersions.at(-1)}`);
|
|
52
|
+
}
|
|
53
|
+
export const SUPPORTED_DSH_VERSION = SOURCE_DSH_VERSION;
|
|
54
|
+
const requiredFiles = Object.freeze([
|
|
55
|
+
"agent.cordis.yml",
|
|
56
|
+
"preset.yml",
|
|
57
|
+
"runtime/index.mjs",
|
|
58
|
+
"runtime/session-compat.mjs",
|
|
59
|
+
"runtime/session-evidence.mjs",
|
|
60
|
+
"runtime/skill-bundle.mjs",
|
|
61
|
+
"runtime/skill-evolution.mjs",
|
|
62
|
+
"runtime/skill-selection-state.mjs",
|
|
63
|
+
"runtime/skill-selector.mjs",
|
|
64
|
+
"runtime/skill-source-config.mjs",
|
|
65
|
+
"skills/odai/SKILL.md",
|
|
66
|
+
"skills/odai/manifest.json",
|
|
67
|
+
]);
|
|
68
|
+
function replaceCompositionContract(composition, before, after, label) {
|
|
69
|
+
const first = composition.indexOf(before);
|
|
70
|
+
if (first < 0 || composition.indexOf(before, first + before.length) >= 0) {
|
|
71
|
+
throw new Error(`Odai Agent source composition does not contain exactly one ${label} contract`);
|
|
72
|
+
}
|
|
73
|
+
return `${composition.slice(0, first)}${after}${composition.slice(first + before.length)}`;
|
|
74
|
+
}
|
|
75
|
+
export function renderAgentCompositionForDsh(composition, dshVersion = SUPPORTED_DSH_VERSION) {
|
|
76
|
+
if (typeof composition !== "string" || composition.trim() === "") {
|
|
77
|
+
throw new TypeError("agent composition must be a non-empty string");
|
|
78
|
+
}
|
|
79
|
+
if (!SUPPORTED_DSH_VERSIONS.includes(dshVersion)) {
|
|
80
|
+
throw new Error(`unsupported DSH version ${dshVersion || "<empty>"}; expected one of ${SUPPORTED_DSH_VERSIONS.join(", ")}`);
|
|
81
|
+
}
|
|
82
|
+
let rendered = composition.replace(/\r\n/gu, "\n");
|
|
83
|
+
if (dshVersion === SOURCE_DSH_VERSION)
|
|
84
|
+
return rendered;
|
|
85
|
+
const targetComment = OPTIONAL_PROVIDER_COMMENTS[dshVersion];
|
|
86
|
+
if (!targetComment)
|
|
87
|
+
throw new Error(`missing Agent composition contract for DSH ${dshVersion}`);
|
|
88
|
+
rendered = replaceCompositionContract(rendered, OPTIONAL_PROVIDER_COMMENTS[SOURCE_DSH_VERSION] ?? (() => { throw new Error("missing source composition contract"); })(), targetComment, "optional-provider comment");
|
|
89
|
+
return rendered;
|
|
90
|
+
}
|
|
91
|
+
export function resolveDshHome(configured, env = process.env) {
|
|
92
|
+
const value = configured ?? env.DSH_HOME ?? resolve(homedir(), ".dsh");
|
|
93
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
94
|
+
throw new TypeError("DSH home must be a non-empty path");
|
|
95
|
+
}
|
|
96
|
+
const trimmed = value.trim();
|
|
97
|
+
if (trimmed === "~")
|
|
98
|
+
return homedir();
|
|
99
|
+
if (trimmed.startsWith(`~${sep}`))
|
|
100
|
+
return resolve(homedir(), trimmed.slice(2));
|
|
101
|
+
return resolve(trimmed);
|
|
102
|
+
}
|
|
103
|
+
export async function inspectAgentInstallation(options = {}) {
|
|
104
|
+
const presetId = assertPresetId(options.presetId ?? DEFAULT_PRESET_ID);
|
|
105
|
+
const dshHome = resolveDshHome(options.dshHome);
|
|
106
|
+
const target = resolve(dshHome, ".agent-presets", presetId);
|
|
107
|
+
const state = await inspectTarget(target, presetId);
|
|
108
|
+
return Object.freeze({ dshHome, presetId, target, ...state });
|
|
109
|
+
}
|
|
110
|
+
export async function installAgentPreset(options = {}) {
|
|
111
|
+
const presetId = assertPresetId(options.presetId ?? DEFAULT_PRESET_ID);
|
|
112
|
+
const dshHome = resolveDshHome(options.dshHome);
|
|
113
|
+
const sourceRoot = resolve(options.sourceRoot ?? defaultSourceRoot);
|
|
114
|
+
const dshVersion = options.dshVersion ?? SUPPORTED_DSH_VERSION;
|
|
115
|
+
if (!SUPPORTED_DSH_VERSIONS.includes(dshVersion)) {
|
|
116
|
+
throw new Error(`unsupported DSH version ${dshVersion || "<empty>"}; expected one of ${SUPPORTED_DSH_VERSIONS.join(", ")}`);
|
|
117
|
+
}
|
|
118
|
+
const targetRoot = resolve(dshHome, ".agent-presets");
|
|
119
|
+
const target = resolve(targetRoot, presetId);
|
|
120
|
+
const current = await inspectTarget(target, presetId);
|
|
121
|
+
const previousCompositionSize = current.status === "installed"
|
|
122
|
+
? Buffer.byteLength(await readFile(resolve(target, "agent.cordis.yml")))
|
|
123
|
+
: undefined;
|
|
124
|
+
if (current.status === "drifted") {
|
|
125
|
+
throw new Error(`refusing to replace modified preset at ${target}: ${current.issues.join("; ")}`);
|
|
126
|
+
}
|
|
127
|
+
await assertSource(sourceRoot);
|
|
128
|
+
const sessionCompatibility = await repairSessionCompatibility(dshHome, [sourceRoot], options.confirmDshStopped === true, options.processScanner);
|
|
129
|
+
await mkdir(targetRoot, { recursive: true, mode: 0o700 });
|
|
130
|
+
const staging = resolve(targetRoot, `.${presetId}.tmp-${process.pid}-${randomUUID()}`);
|
|
131
|
+
const backup = resolve(targetRoot, `.${presetId}.backup-${process.pid}-${randomUUID()}`);
|
|
132
|
+
let backupCreated = false;
|
|
133
|
+
try {
|
|
134
|
+
await cp(sourceRoot, staging, { recursive: true, errorOnExist: true });
|
|
135
|
+
await tightenTree(staging);
|
|
136
|
+
const compositionPath = resolve(staging, "agent.cordis.yml");
|
|
137
|
+
const composition = renderAgentCompositionForDsh(await readFile(compositionPath, "utf8"), dshVersion);
|
|
138
|
+
let stampedComposition = `${composition.trimEnd()}\n# odai-dsh-agent generation ${packageMetadata.version}:${randomUUID()}\n`;
|
|
139
|
+
// Supported DSH releases key standing generations by mtime and size, so size must change even on same-tick updates.
|
|
140
|
+
if (previousCompositionSize === Buffer.byteLength(stampedComposition)) {
|
|
141
|
+
stampedComposition += "# odai-dsh-agent generation size bump\n";
|
|
142
|
+
}
|
|
143
|
+
await writeFile(compositionPath, stampedComposition, "utf8");
|
|
144
|
+
const files = await hashTree(staging);
|
|
145
|
+
const manifest = {
|
|
146
|
+
schemaVersion: 1,
|
|
147
|
+
package: packageMetadata.name,
|
|
148
|
+
version: packageMetadata.version,
|
|
149
|
+
dshVersion,
|
|
150
|
+
presetId,
|
|
151
|
+
files,
|
|
152
|
+
};
|
|
153
|
+
const manifestPath = resolve(staging, MANIFEST_FILE);
|
|
154
|
+
await writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
|
|
155
|
+
await chmod(manifestPath, 0o600);
|
|
156
|
+
if (current.status === "installed") {
|
|
157
|
+
await rename(target, backup);
|
|
158
|
+
backupCreated = true;
|
|
159
|
+
}
|
|
160
|
+
await rename(staging, target);
|
|
161
|
+
if (backupCreated) {
|
|
162
|
+
await rm(backup, { recursive: true, force: true });
|
|
163
|
+
backupCreated = false;
|
|
164
|
+
}
|
|
165
|
+
return Object.freeze({
|
|
166
|
+
operation: current.status === "installed" ? "updated" : "installed",
|
|
167
|
+
dshHome,
|
|
168
|
+
presetId,
|
|
169
|
+
target,
|
|
170
|
+
version: packageMetadata.version,
|
|
171
|
+
dshVersion,
|
|
172
|
+
trust: "user",
|
|
173
|
+
security: "DSH user presets have the same privileges as shell access; install only reviewed preset code.",
|
|
174
|
+
sessionCompatibility,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
await rm(staging, { recursive: true, force: true });
|
|
179
|
+
if (backupCreated) {
|
|
180
|
+
const targetState = await pathState(target);
|
|
181
|
+
if (targetState === "missing")
|
|
182
|
+
await rename(backup, target);
|
|
183
|
+
}
|
|
184
|
+
throw error;
|
|
185
|
+
}
|
|
186
|
+
finally {
|
|
187
|
+
await rm(backup, { recursive: true, force: true });
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
export async function uninstallAgentPreset(options = {}) {
|
|
191
|
+
const inspected = await inspectAgentInstallation(options);
|
|
192
|
+
if (inspected.status === "absent") {
|
|
193
|
+
return Object.freeze({ operation: "absent", target: inspected.target, presetId: inspected.presetId });
|
|
194
|
+
}
|
|
195
|
+
if (inspected.status === "drifted") {
|
|
196
|
+
throw new Error(`refusing to remove modified preset at ${inspected.target}: ${inspected.issues.join("; ")}`);
|
|
197
|
+
}
|
|
198
|
+
await assertPresetIsNotDefault(inspected.dshHome, inspected.presetId);
|
|
199
|
+
const sessionCompatibility = await repairSessionCompatibility(inspected.dshHome, [defaultSourceRoot, inspected.target], options.confirmDshStopped === true, options.processScanner);
|
|
200
|
+
if (sessionCompatibility.failures.length > 0) {
|
|
201
|
+
throw new Error(`refusing to uninstall before legacy Odai session evidence is made ignorable: ${sessionCompatibility.failures.map((failure) => `${failure.path}: ${failure.error}`).join("; ")}`);
|
|
202
|
+
}
|
|
203
|
+
await rm(inspected.target, { recursive: true, force: true });
|
|
204
|
+
return Object.freeze({
|
|
205
|
+
operation: "uninstalled",
|
|
206
|
+
target: inspected.target,
|
|
207
|
+
presetId: inspected.presetId,
|
|
208
|
+
sessionCompatibility,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
async function assertPresetIsNotDefault(dshHome, presetId) {
|
|
212
|
+
const settingsPath = resolve(dshHome, "settings.yaml");
|
|
213
|
+
let text;
|
|
214
|
+
try {
|
|
215
|
+
text = await readFile(settingsPath, "utf8");
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
if (errorCode(error) === "ENOENT")
|
|
219
|
+
return;
|
|
220
|
+
throw error;
|
|
221
|
+
}
|
|
222
|
+
let settings;
|
|
223
|
+
try {
|
|
224
|
+
settings = parseYaml(text) ?? {};
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
throw new Error(`cannot verify the default agent preset in ${settingsPath}: ${errorMessage(error)}`);
|
|
228
|
+
}
|
|
229
|
+
const presets = isRecord(settings) ? settings["agent-presets"] : undefined;
|
|
230
|
+
if (isRecord(presets) && presets.default === presetId) {
|
|
231
|
+
throw new Error(`refusing to uninstall the default preset ${presetId}; select another agent-presets.default first`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
async function inspectTarget(target, presetId) {
|
|
235
|
+
const state = await pathState(target);
|
|
236
|
+
if (state === "missing")
|
|
237
|
+
return { status: "absent", issues: [] };
|
|
238
|
+
if (state !== "directory")
|
|
239
|
+
return { status: "drifted", issues: ["target is not a regular directory"] };
|
|
240
|
+
let manifest;
|
|
241
|
+
try {
|
|
242
|
+
manifest = JSON.parse(await readFile(resolve(target, MANIFEST_FILE), "utf8"));
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
return { status: "drifted", issues: [`managed manifest is unavailable: ${errorMessage(error)}`] };
|
|
246
|
+
}
|
|
247
|
+
const issues = validateManifest(manifest, presetId);
|
|
248
|
+
let actualFiles = {};
|
|
249
|
+
try {
|
|
250
|
+
actualFiles = await hashTree(target, { exclude: new Set([MANIFEST_FILE]) });
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
issues.push(errorMessage(error));
|
|
254
|
+
}
|
|
255
|
+
if (issues.length === 0 && isManagedManifest(manifest)) {
|
|
256
|
+
const expectedFiles = manifest.files;
|
|
257
|
+
for (const [path, hash] of Object.entries(expectedFiles)) {
|
|
258
|
+
if (!(path in actualFiles))
|
|
259
|
+
issues.push(`missing managed file ${path}`);
|
|
260
|
+
else if (actualFiles[path] !== hash)
|
|
261
|
+
issues.push(`modified managed file ${path}`);
|
|
262
|
+
}
|
|
263
|
+
for (const path of Object.keys(actualFiles)) {
|
|
264
|
+
if (!(path in expectedFiles))
|
|
265
|
+
issues.push(`unmanaged file ${path}`);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return {
|
|
269
|
+
status: issues.length === 0 ? "installed" : "drifted",
|
|
270
|
+
issues,
|
|
271
|
+
version: isRecord(manifest) && typeof manifest.version === "string" ? manifest.version : undefined,
|
|
272
|
+
dshVersion: isRecord(manifest) && typeof manifest.dshVersion === "string" ? manifest.dshVersion : undefined,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
function isManagedManifest(manifest) {
|
|
276
|
+
if (!isRecord(manifest) || manifest.schemaVersion !== 1 || typeof manifest.package !== "string"
|
|
277
|
+
|| typeof manifest.version !== "string" || typeof manifest.dshVersion !== "string"
|
|
278
|
+
|| typeof manifest.presetId !== "string" || !isRecord(manifest.files))
|
|
279
|
+
return false;
|
|
280
|
+
return Object.values(manifest.files).every((value) => typeof value === "string");
|
|
281
|
+
}
|
|
282
|
+
function validateManifest(manifest, presetId) {
|
|
283
|
+
const issues = [];
|
|
284
|
+
if (!isRecord(manifest) || manifest.schemaVersion !== 1)
|
|
285
|
+
issues.push("unsupported managed manifest schema");
|
|
286
|
+
if (!isRecord(manifest) || manifest.package !== packageMetadata.name)
|
|
287
|
+
issues.push("managed manifest package mismatch");
|
|
288
|
+
if (!isRecord(manifest) || manifest.presetId !== presetId)
|
|
289
|
+
issues.push("managed manifest preset id mismatch");
|
|
290
|
+
if (!isRecord(manifest) || !isRecord(manifest.files)
|
|
291
|
+
|| !Object.values(manifest.files).every((value) => typeof value === "string")) {
|
|
292
|
+
issues.push("managed manifest file map is invalid");
|
|
293
|
+
}
|
|
294
|
+
return issues;
|
|
295
|
+
}
|
|
296
|
+
async function repairSessionCompatibility(dshHome, sourceRoots, confirmDshStopped, processScanner) {
|
|
297
|
+
for (const sourceRoot of sourceRoots) {
|
|
298
|
+
const modulePath = resolve(sourceRoot, "runtime/session-compat.mjs");
|
|
299
|
+
if (await pathState(modulePath) !== "file")
|
|
300
|
+
continue;
|
|
301
|
+
const compatibility = await import(pathToFileURL(modulePath).href);
|
|
302
|
+
if (typeof compatibility.inspectLegacySessionLogs !== "function"
|
|
303
|
+
|| typeof compatibility.repairLegacySessionLogs !== "function") {
|
|
304
|
+
throw new Error(`agent package session compatibility module is invalid: ${modulePath}`);
|
|
305
|
+
}
|
|
306
|
+
const inspected = compatibility.inspectLegacySessionLogs({ dshHome });
|
|
307
|
+
if (inspected.failures.length > 0) {
|
|
308
|
+
throw new Error(`cannot inspect legacy Odai session evidence safely: ${inspected.failures.map((failure) => `${failure.path}: ${failure.error}`).join("; ")}`);
|
|
309
|
+
}
|
|
310
|
+
if (inspected.matchedEvents === 0)
|
|
311
|
+
return inspected;
|
|
312
|
+
if (!confirmDshStopped) {
|
|
313
|
+
throw new Error(`found ${inspected.matchedEvents} legacy Odai session event(s); stop every DSH process and rerun with --yes before changing the Agent preset`);
|
|
314
|
+
}
|
|
315
|
+
const repaired = compatibility.repairLegacySessionLogs({
|
|
316
|
+
dshHome,
|
|
317
|
+
confirmDshStopped: true,
|
|
318
|
+
processScanner,
|
|
319
|
+
});
|
|
320
|
+
if (repaired.failures.length > 0) {
|
|
321
|
+
throw new Error(`cannot repair legacy Odai session evidence safely: ${repaired.failures.map((failure) => `${failure.path}: ${failure.error}`).join("; ")}`);
|
|
322
|
+
}
|
|
323
|
+
return repaired;
|
|
324
|
+
}
|
|
325
|
+
throw new Error("agent package is incomplete: missing runtime/session-compat.mjs");
|
|
326
|
+
}
|
|
327
|
+
async function assertSource(sourceRoot) {
|
|
328
|
+
for (const path of requiredFiles) {
|
|
329
|
+
const state = await pathState(resolve(sourceRoot, path));
|
|
330
|
+
if (state !== "file")
|
|
331
|
+
throw new Error(`agent package is incomplete: missing ${path}`);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
async function tightenTree(root) {
|
|
335
|
+
await chmod(root, 0o700);
|
|
336
|
+
const entries = await readdir(root, { withFileTypes: true });
|
|
337
|
+
for (const entry of entries) {
|
|
338
|
+
const path = resolve(root, entry.name);
|
|
339
|
+
if (entry.isSymbolicLink())
|
|
340
|
+
throw new Error(`symbolic link is not allowed in managed preset: ${entry.name}`);
|
|
341
|
+
if (entry.isDirectory())
|
|
342
|
+
await tightenTree(path);
|
|
343
|
+
else if (entry.isFile())
|
|
344
|
+
await chmod(path, 0o600);
|
|
345
|
+
else
|
|
346
|
+
throw new Error(`unsupported filesystem entry in managed preset: ${entry.name}`);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
async function hashTree(root, options = {}) {
|
|
350
|
+
const found = {};
|
|
351
|
+
await walk(root, "");
|
|
352
|
+
return Object.fromEntries(Object.entries(found).sort(([left], [right]) => left.localeCompare(right)));
|
|
353
|
+
async function walk(base, prefix) {
|
|
354
|
+
const entries = await readdir(base, { withFileTypes: true });
|
|
355
|
+
entries.sort((left, right) => left.name.localeCompare(right.name));
|
|
356
|
+
for (const entry of entries) {
|
|
357
|
+
const relativePath = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
358
|
+
if (options.exclude?.has(relativePath))
|
|
359
|
+
continue;
|
|
360
|
+
const absolutePath = resolve(base, entry.name);
|
|
361
|
+
if (entry.isSymbolicLink())
|
|
362
|
+
throw new Error(`symbolic link is not allowed in managed preset: ${relativePath}`);
|
|
363
|
+
if (entry.isDirectory())
|
|
364
|
+
await walk(absolutePath, relativePath);
|
|
365
|
+
else if (entry.isFile())
|
|
366
|
+
found[relativePath] = await hashFile(absolutePath);
|
|
367
|
+
else
|
|
368
|
+
throw new Error(`unsupported filesystem entry in managed preset: ${relativePath}`);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
async function hashFile(path) {
|
|
373
|
+
return createHash("sha256").update(await readFile(path)).digest("hex");
|
|
374
|
+
}
|
|
375
|
+
async function pathState(path) {
|
|
376
|
+
try {
|
|
377
|
+
const stats = await lstat(path);
|
|
378
|
+
if (stats.isSymbolicLink())
|
|
379
|
+
return "symlink";
|
|
380
|
+
if (stats.isDirectory())
|
|
381
|
+
return "directory";
|
|
382
|
+
if (stats.isFile())
|
|
383
|
+
return "file";
|
|
384
|
+
return "other";
|
|
385
|
+
}
|
|
386
|
+
catch (error) {
|
|
387
|
+
if (errorCode(error) === "ENOENT")
|
|
388
|
+
return "missing";
|
|
389
|
+
throw error;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
function assertPresetId(value) {
|
|
393
|
+
if (typeof value !== "string" || !/^[A-Za-z0-9][A-Za-z0-9._-]*$/u.test(value)) {
|
|
394
|
+
throw new TypeError("preset id must contain only letters, digits, dots, underscores, or hyphens");
|
|
395
|
+
}
|
|
396
|
+
return value;
|
|
397
|
+
}
|
|
398
|
+
//# sourceMappingURL=installer.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.mjs","sourceRoot":"","sources":["../../src/installer.mts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "odai-dsh-agent",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.7",
|
|
4
4
|
"description": "完整继承 DSH 标准模式 全部能力的 Odai Agent preset。主要用于治理、规划、测试、验证 等,可当成默认总控使用。",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -13,43 +13,44 @@
|
|
|
13
13
|
"url": "https://github.com/orziz/odai/issues"
|
|
14
14
|
},
|
|
15
15
|
"type": "module",
|
|
16
|
-
"main": "./src/installer.mjs",
|
|
16
|
+
"main": "./build/src/installer.mjs",
|
|
17
17
|
"exports": {
|
|
18
|
-
".": "./src/installer.mjs",
|
|
18
|
+
".": "./build/src/installer.mjs",
|
|
19
19
|
"./package.json": "./package.json"
|
|
20
20
|
},
|
|
21
21
|
"bin": {
|
|
22
|
-
"odai-dsh-agent": "./bin/odai-dsh-agent.mjs"
|
|
22
|
+
"odai-dsh-agent": "./build/bin/odai-dsh-agent.mjs"
|
|
23
23
|
},
|
|
24
24
|
"publishConfig": {
|
|
25
25
|
"registry": "https://registry.npmjs.org/",
|
|
26
26
|
"access": "public"
|
|
27
27
|
},
|
|
28
28
|
"files": [
|
|
29
|
-
"bin",
|
|
30
|
-
"src",
|
|
31
|
-
"scripts/verify-agent-load.mjs",
|
|
29
|
+
"build/bin",
|
|
30
|
+
"build/src",
|
|
32
31
|
"preset",
|
|
33
32
|
"README.md",
|
|
34
33
|
"LICENSE"
|
|
35
34
|
],
|
|
36
35
|
"scripts": {
|
|
37
|
-
"
|
|
38
|
-
"
|
|
36
|
+
"build:dsh": "npm --prefix ../.. run build:dsh",
|
|
37
|
+
"typecheck:dsh": "npm --prefix ../.. run typecheck:dsh",
|
|
38
|
+
"check": "npm run typecheck:dsh && npm run build:dsh && find ../runtime/build build/bin build/src -name '*.mjs' -print0 | xargs -0 -n1 node --check",
|
|
39
|
+
"prepare:artifact": "npm run build:dsh && node ../../scripts/package-odai-artifact.mjs prepare --skill-root preset/odai/skills --runtime-root preset/odai/runtime",
|
|
39
40
|
"clean:artifact": "node ../../scripts/package-odai-artifact.mjs clean --skill-root preset/odai/skills --runtime-root preset/odai/runtime",
|
|
40
41
|
"prepare": "npm run prepare:artifact",
|
|
41
42
|
"verify:version": "node ../../scripts/verify-dsh-package-versions.mjs",
|
|
42
43
|
"prepack": "npm run verify:version && node ../../scripts/validate-odai-skill.mjs",
|
|
43
44
|
"postpack": "npm run clean:artifact",
|
|
44
45
|
"pack:dry-run": "node ../../scripts/run-package-pack.mjs --clean preset/odai/runtime --clean preset/odai/skills -- --dry-run",
|
|
45
|
-
"test": "npm run verify:version &&
|
|
46
|
-
"verify:dsh": "
|
|
46
|
+
"test": "npm run verify:version && npm run build:dsh && npm --prefix ../.. exec -- tsx --test ./tests/*.test.mts",
|
|
47
|
+
"verify:dsh": "npm run build:dsh && npm --prefix ../.. exec -- tsx ./tests/verify-agent-load.mts"
|
|
47
48
|
},
|
|
48
49
|
"dependencies": {
|
|
49
50
|
"yaml": "^2.8.1"
|
|
50
51
|
},
|
|
51
52
|
"peerDependencies": {
|
|
52
|
-
"@deepseek-ai/dsh": "0.1.0-rc.7 || 0.1.0-rc.
|
|
53
|
+
"@deepseek-ai/dsh": "0.1.0-rc.7 || 0.1.1-rc.1 || 0.1.1-rc.2"
|
|
53
54
|
},
|
|
54
55
|
"peerDependenciesMeta": {
|
|
55
56
|
"@deepseek-ai/dsh": {
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { type ResolveCallConfig } from "./model-route.mjs";
|
|
2
|
+
import type { DshAgent, DshMessage, DshSessionsService, ModelRoute, RuntimeTool, UnknownRecord } from "./runtime-types.mjs";
|
|
3
|
+
export interface CompactionTarget extends ModelRoute {
|
|
4
|
+
provider: string;
|
|
5
|
+
model: string;
|
|
6
|
+
reasoningEffort?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface CompactionModelStore {
|
|
9
|
+
readonly schemaVersion: 1;
|
|
10
|
+
readonly target?: CompactionTarget;
|
|
11
|
+
}
|
|
12
|
+
export interface CompactionSelection {
|
|
13
|
+
readonly source: "inherit" | "persisted";
|
|
14
|
+
readonly target?: CompactionTarget;
|
|
15
|
+
readonly invalidStore?: true;
|
|
16
|
+
}
|
|
17
|
+
export interface CompactionRequestOptions extends UnknownRecord {
|
|
18
|
+
purpose?: string;
|
|
19
|
+
sessionId?: string;
|
|
20
|
+
provider?: string;
|
|
21
|
+
model?: string;
|
|
22
|
+
reasoningEffort?: string;
|
|
23
|
+
messages?: DshMessage[];
|
|
24
|
+
}
|
|
25
|
+
export declare const COMPACTION_STATE_PROTOCOL: string;
|
|
26
|
+
export declare const COMPACTION_CONFIG_PROMPT: string;
|
|
27
|
+
export declare class CompactionModelStoreValidationError extends Error {
|
|
28
|
+
}
|
|
29
|
+
export declare function resolveCompactionTarget(value: unknown, field?: string): Readonly<CompactionTarget>;
|
|
30
|
+
export declare function resolveCompactionConfigPath(configuredPath: unknown, env?: Readonly<Record<string, string | undefined>>): string;
|
|
31
|
+
export declare function readCompactionModelStore(configPath: string): Readonly<CompactionModelStore>;
|
|
32
|
+
export declare function effectiveCompactionTarget(configPath: string): Readonly<CompactionSelection>;
|
|
33
|
+
export declare function applyCompactionTarget(options: CompactionRequestOptions | undefined, target: CompactionTarget | undefined, sessions?: DshSessionsService): boolean;
|
|
34
|
+
export declare function applyCompactionStateProtocol(options: CompactionRequestOptions | undefined, target: CompactionTarget | undefined): boolean;
|
|
35
|
+
export type CompactionInvalidationResult = {
|
|
36
|
+
readonly invalidated: false;
|
|
37
|
+
readonly reason: "target-changed-or-not-persisted";
|
|
38
|
+
} | {
|
|
39
|
+
readonly invalidated: true;
|
|
40
|
+
readonly backupPath: string;
|
|
41
|
+
readonly target: CompactionTarget;
|
|
42
|
+
};
|
|
43
|
+
export declare function invalidatePersistedCompactionTarget(configPath: string, expectedTarget: CompactionTarget): CompactionInvalidationResult;
|
|
44
|
+
export type CompactionConfigAction = "show" | "set" | "remove";
|
|
45
|
+
export interface CompactionConfigResult {
|
|
46
|
+
action: CompactionConfigAction;
|
|
47
|
+
configPath: string;
|
|
48
|
+
source: "inherit" | "persisted";
|
|
49
|
+
target?: CompactionTarget;
|
|
50
|
+
requiresNextCompaction: boolean;
|
|
51
|
+
invalidStore?: true;
|
|
52
|
+
recoveredInvalidStore?: true;
|
|
53
|
+
}
|
|
54
|
+
export interface CompactionConfiguredEvent {
|
|
55
|
+
action: "set" | "remove";
|
|
56
|
+
target?: CompactionTarget;
|
|
57
|
+
validationStatus?: "verified";
|
|
58
|
+
recoveredInvalidStore?: true;
|
|
59
|
+
}
|
|
60
|
+
export interface CompactionConfigToolOptions {
|
|
61
|
+
onConfigured?(agent: DshAgent, event: CompactionConfiguredEvent): void;
|
|
62
|
+
resolveCallConfig?: ResolveCallConfig;
|
|
63
|
+
isChild?(agent: DshAgent): boolean;
|
|
64
|
+
}
|
|
65
|
+
export declare function createCompactionConfigTool(configPath: string, options?: CompactionConfigToolOptions): RuntimeTool<unknown, CompactionConfigResult>;
|
|
66
|
+
//# sourceMappingURL=compaction-config.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compaction-config.d.mts","sourceRoot":"","sources":["../src/compaction-config.mts"],"names":[],"mappings":"AAYA,OAAO,EAAqC,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE9F,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAW5H,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;CACpC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,wBAAyB,SAAQ,aAAa;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;CACzB;AAED,eAAO,MAAM,yBAAyB,QAM1B,CAAC;AAEb,eAAO,MAAM,wBAAwB,QAQzB,CAAC;AAEb,qBAAa,mCAAoC,SAAQ,KAAK;CAAG;AAOjE,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,SAAiC,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAmB1H;AAED,wBAAgB,2BAA2B,CACzC,cAAc,EAAE,OAAO,EACvB,GAAG,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAe,GAC9D,MAAM,CAWR;AAED,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,CAAC,oBAAoB,CAAC,CAmC3F;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,CAAC,mBAAmB,CAAC,CAM3F;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,wBAAwB,GAAG,SAAS,EAC7C,MAAM,EAAE,gBAAgB,GAAG,SAAS,EACpC,QAAQ,CAAC,EAAE,kBAAkB,GAC5B,OAAO,CA8BT;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,wBAAwB,GAAG,SAAS,EAC7C,MAAM,EAAE,gBAAgB,GAAG,SAAS,GACnC,OAAO,CAoBT;AAwBD,MAAM,MAAM,4BAA4B,GACpC;IAAE,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,iCAAiC,CAAA;CAAE,GACnF;IAAE,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAEnG,wBAAgB,mCAAmC,CACjD,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,gBAAgB,GAC/B,4BAA4B,CAe9B;AAED,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;AAE/D,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,sBAAsB,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;IAChC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,sBAAsB,EAAE,OAAO,CAAC;IAChC,YAAY,CAAC,EAAE,IAAI,CAAC;IACpB,qBAAqB,CAAC,EAAE,IAAI,CAAC;CAC9B;AAmBD,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,KAAK,GAAG,QAAQ,CAAC;IACzB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,gBAAgB,CAAC,EAAE,UAAU,CAAC;IAC9B,qBAAqB,CAAC,EAAE,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,2BAA2B;IAC1C,YAAY,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,yBAAyB,GAAG,IAAI,CAAC;IACvE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,OAAO,CAAC,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC;CACpC;AAED,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,2BAAgC,GACxC,WAAW,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAsI9C"}
|