@zintrust/core 0.4.75 → 0.4.77
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/bin/zintrust-main.d.ts +12 -0
- package/bin/zintrust-main.d.ts.map +1 -1
- package/bin/zintrust-main.js +149 -54
- package/package.json +1 -1
- package/src/boot/registry/runtime.d.ts.map +1 -1
- package/src/boot/registry/runtime.js +60 -25
- package/src/cache/Cache.d.ts.map +1 -1
- package/src/cache/Cache.js +11 -11
- package/src/cli/BaseCommand.js +3 -3
- package/src/cli/OptionalCliExtensions.js +8 -8
- package/src/cli/commands/MigrateCommand.js +1 -1
- package/src/cli/commands/TraceCommand.d.ts +18 -0
- package/src/cli/commands/TraceCommand.d.ts.map +1 -0
- package/src/cli/commands/TraceCommand.js +6 -0
- package/src/cli/commands/TraceCommands.d.ts +25 -0
- package/src/cli/commands/TraceCommands.d.ts.map +1 -0
- package/src/cli/commands/{DebuggerCommands.js → TraceCommands.js} +112 -120
- package/src/cli/commands/index.d.ts +1 -1
- package/src/cli/commands/index.d.ts.map +1 -1
- package/src/cli/commands/index.js +1 -1
- package/src/cli/index.d.ts +2 -2
- package/src/cli/index.d.ts.map +1 -1
- package/src/cli/index.js +2 -2
- package/src/cli.d.ts +1 -1
- package/src/cli.d.ts.map +1 -1
- package/src/cli.js +1 -1
- package/src/config/logging/KvLogger.d.ts.map +1 -1
- package/src/config/logging/KvLogger.js +18 -6
- package/src/events/EventDispatcher.js +3 -3
- package/src/functions/cloudflare.d.ts.map +1 -1
- package/src/functions/cloudflare.js +8 -0
- package/src/http/RequestContext.d.ts.map +1 -1
- package/src/http/RequestContext.js +5 -6
- package/src/index.d.ts +2 -1
- package/src/index.d.ts.map +1 -1
- package/src/index.js +5 -4
- package/src/middleware/ErrorHandlerMiddleware.d.ts.map +1 -1
- package/src/middleware/ErrorHandlerMiddleware.js +2 -0
- package/src/orm/adapters/SQLiteAdapter.d.ts.map +1 -1
- package/src/orm/adapters/SQLiteAdapter.js +2 -1
- package/src/orm/migrations/MigrationStore.d.ts.map +1 -1
- package/src/orm/migrations/MigrationStore.js +352 -16
- package/src/runtime/StartupConfigFileRegistry.d.ts +2 -1
- package/src/runtime/StartupConfigFileRegistry.d.ts.map +1 -1
- package/src/runtime/StartupConfigFileRegistry.js +1 -0
- package/src/runtime/plugins/trace-runtime.d.ts +24 -0
- package/src/runtime/plugins/trace-runtime.d.ts.map +1 -0
- package/src/runtime/plugins/trace-runtime.js +63 -0
- package/src/runtime/plugins/trace.d.ts +2 -0
- package/src/runtime/plugins/trace.d.ts.map +1 -0
- package/src/runtime/plugins/{system-debugger.js → trace.js} +2 -2
- package/src/security/JwtManager.js +4 -4
- package/src/templates/project/basic/tsconfig.json.tpl +11 -12
- package/src/tools/http/Http.js +2 -2
- package/src/tools/mail/index.js +2 -2
- package/src/tools/notification/Service.js +6 -6
- package/src/tools/queue/Queue.d.ts +1 -2
- package/src/tools/queue/Queue.d.ts.map +1 -1
- package/src/tools/queue/Queue.js +3 -4
- package/src/{debugger/SystemDebuggerBridge.d.ts → trace/SystemTraceBridge.d.ts} +3 -3
- package/src/trace/SystemTraceBridge.d.ts.map +1 -0
- package/src/{debugger/SystemDebuggerBridge.js → trace/SystemTraceBridge.js} +20 -20
- package/src/zintrust.comon.d.ts +11 -0
- package/src/zintrust.comon.d.ts.map +1 -0
- package/src/zintrust.comon.js +17 -0
- package/src/zintrust.plugins.d.ts +7 -3
- package/src/zintrust.plugins.d.ts.map +1 -1
- package/src/zintrust.plugins.js +9 -3
- package/src/zintrust.plugins.wg.d.ts +1 -0
- package/src/zintrust.plugins.wg.d.ts.map +1 -1
- package/src/zintrust.plugins.wg.js +3 -0
- package/src/cli/commands/DebuggerCommand.d.ts +0 -18
- package/src/cli/commands/DebuggerCommand.d.ts.map +0 -1
- package/src/cli/commands/DebuggerCommand.js +0 -6
- package/src/cli/commands/DebuggerCommands.d.ts +0 -25
- package/src/cli/commands/DebuggerCommands.d.ts.map +0 -1
- package/src/debugger/SystemDebuggerBridge.d.ts.map +0 -1
- package/src/runtime/plugins/system-debugger-runtime.d.ts +0 -19
- package/src/runtime/plugins/system-debugger-runtime.d.ts.map +0 -1
- package/src/runtime/plugins/system-debugger-runtime.js +0 -19
- package/src/runtime/plugins/system-debugger.d.ts +0 -2
- package/src/runtime/plugins/system-debugger.d.ts.map +0 -1
package/bin/zintrust-main.d.ts
CHANGED
|
@@ -4,6 +4,18 @@
|
|
|
4
4
|
* This module contains the CLI implementation without a hashbang so that it can
|
|
5
5
|
* be imported by other bin shortcuts (zin/z/zt) without parse errors.
|
|
6
6
|
*/
|
|
7
|
+
type ProjectLocalCliTarget = {
|
|
8
|
+
binPath: string;
|
|
9
|
+
packageRoot: string;
|
|
10
|
+
};
|
|
7
11
|
export declare function run(): Promise<void>;
|
|
12
|
+
export declare const CliLauncherInternal: Readonly<{
|
|
13
|
+
CLI_HANDOFF_ENV_KEY: "ZINTRUST_CLI_HANDOFF";
|
|
14
|
+
findProjectLocalCliTarget: (cwd: string) => ProjectLocalCliTarget | undefined;
|
|
15
|
+
getCurrentPackageRoot: () => string;
|
|
16
|
+
getRealPath: (targetPath: string) => string;
|
|
17
|
+
isWithinDirectory: (targetPath: string, possibleParentPath: string) => boolean;
|
|
18
|
+
resolveProjectLocalCliHandoff: (cwd: string, currentPackageRoot: string, env?: NodeJS.ProcessEnv) => ProjectLocalCliTarget | undefined;
|
|
19
|
+
}>;
|
|
8
20
|
export {};
|
|
9
21
|
//# sourceMappingURL=zintrust-main.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zintrust-main.d.ts","sourceRoot":"","sources":["../../bin/zintrust-main.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"zintrust-main.d.ts","sourceRoot":"","sources":["../../bin/zintrust-main.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,KAAK,qBAAqB,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAmTF,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAMzC;AAED,eAAO,MAAM,mBAAmB;;qCAjSQ,MAAM,KAAG,qBAAqB,GAAG,SAAS;iCAtBhD,MAAM;8BAIP,MAAM,KAAG,MAAM;oCAQT,MAAM,sBAAsB,MAAM,KAAG,OAAO;yCAqC5E,MAAM,sBACS,MAAM,QACrB,MAAM,CAAC,UAAU,KACrB,qBAAqB,GAAG,SAAS;EA0QlC,CAAC;AAEH,OAAO,EAAE,CAAC"}
|
package/bin/zintrust-main.js
CHANGED
|
@@ -5,9 +5,86 @@
|
|
|
5
5
|
* be imported by other bin shortcuts (zin/z/zt) without parse errors.
|
|
6
6
|
*/
|
|
7
7
|
import { Logger } from '../src/config/logger.js';
|
|
8
|
+
import { spawnSync } from 'node:child_process';
|
|
8
9
|
import fs from 'node:fs';
|
|
9
10
|
import path from 'node:path';
|
|
10
11
|
import { fileURLToPath } from 'node:url';
|
|
12
|
+
const CLI_HANDOFF_ENV_KEY = 'ZINTRUST_CLI_HANDOFF';
|
|
13
|
+
const getCurrentPackageRoot = () => {
|
|
14
|
+
return path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
15
|
+
};
|
|
16
|
+
const getRealPath = (targetPath) => {
|
|
17
|
+
try {
|
|
18
|
+
return fs.realpathSync(targetPath);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return path.resolve(targetPath);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
const isWithinDirectory = (targetPath, possibleParentPath) => {
|
|
25
|
+
const normalizedTarget = getRealPath(targetPath);
|
|
26
|
+
const normalizedParent = getRealPath(possibleParentPath);
|
|
27
|
+
if (normalizedTarget === normalizedParent)
|
|
28
|
+
return true;
|
|
29
|
+
const relativePath = path.relative(normalizedParent, normalizedTarget);
|
|
30
|
+
return relativePath !== '' && !relativePath.startsWith('..') && !path.isAbsolute(relativePath);
|
|
31
|
+
};
|
|
32
|
+
const findProjectLocalCliTarget = (cwd) => {
|
|
33
|
+
let currentDir = path.resolve(cwd);
|
|
34
|
+
while (true) {
|
|
35
|
+
const packageRoot = path.join(currentDir, 'node_modules', '@zintrust', 'core');
|
|
36
|
+
const packageJsonPath = path.join(packageRoot, 'package.json');
|
|
37
|
+
const binCandidates = [
|
|
38
|
+
path.join(packageRoot, 'bin', 'zin.js'),
|
|
39
|
+
path.join(packageRoot, 'bin', 'zin.mjs'),
|
|
40
|
+
path.join(packageRoot, 'bin', 'zin.cjs'),
|
|
41
|
+
path.join(packageRoot, 'bin', 'zin.ts'),
|
|
42
|
+
];
|
|
43
|
+
if (fs.existsSync(packageJsonPath)) {
|
|
44
|
+
const binPath = binCandidates.find((candidate) => fs.existsSync(candidate));
|
|
45
|
+
if (binPath !== undefined) {
|
|
46
|
+
return { binPath, packageRoot };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const parentDir = path.dirname(currentDir);
|
|
50
|
+
if (parentDir === currentDir)
|
|
51
|
+
return undefined;
|
|
52
|
+
currentDir = parentDir;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
const resolveProjectLocalCliHandoff = (cwd, currentPackageRoot, env = process.env) => {
|
|
56
|
+
if (env[CLI_HANDOFF_ENV_KEY] === '1')
|
|
57
|
+
return undefined;
|
|
58
|
+
if (isWithinDirectory(cwd, currentPackageRoot))
|
|
59
|
+
return undefined;
|
|
60
|
+
const target = findProjectLocalCliTarget(cwd);
|
|
61
|
+
if (target === undefined)
|
|
62
|
+
return undefined;
|
|
63
|
+
if (getRealPath(target.packageRoot) === getRealPath(currentPackageRoot)) {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
return target;
|
|
67
|
+
};
|
|
68
|
+
const handoffToProjectLocalCli = (target, rawArgs) => {
|
|
69
|
+
const result = spawnSync(process.execPath, [target.binPath, ...rawArgs], {
|
|
70
|
+
stdio: 'inherit',
|
|
71
|
+
env: {
|
|
72
|
+
...process.env,
|
|
73
|
+
[CLI_HANDOFF_ENV_KEY]: '1',
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
if (result.error !== undefined) {
|
|
77
|
+
throw result.error;
|
|
78
|
+
}
|
|
79
|
+
process.exit(typeof result.status === 'number' ? result.status : 1);
|
|
80
|
+
};
|
|
81
|
+
const maybeHandoffToProjectLocalCli = (rawArgs) => {
|
|
82
|
+
const localCliTarget = resolveProjectLocalCliHandoff(process.cwd(), getCurrentPackageRoot());
|
|
83
|
+
if (localCliTarget === undefined)
|
|
84
|
+
return false;
|
|
85
|
+
handoffToProjectLocalCli(localCliTarget, rawArgs);
|
|
86
|
+
return true;
|
|
87
|
+
};
|
|
11
88
|
const loadPackageVersionFast = () => {
|
|
12
89
|
try {
|
|
13
90
|
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
@@ -33,6 +110,12 @@ const getArgsFromProcess = () => {
|
|
|
33
110
|
const isVersionRequest = (args) => {
|
|
34
111
|
return args.includes('-v') || args.includes('--version');
|
|
35
112
|
};
|
|
113
|
+
const maybePrintVersionAndExit = (args) => {
|
|
114
|
+
if (!isVersionRequest(args))
|
|
115
|
+
return false;
|
|
116
|
+
printFancyVersion(loadPackageVersionFast());
|
|
117
|
+
return true;
|
|
118
|
+
};
|
|
36
119
|
const printFancyVersion = (version) => {
|
|
37
120
|
const framework = 'ZinTrust Framework';
|
|
38
121
|
const bannerWidth = 46;
|
|
@@ -110,69 +193,81 @@ const handleCliFatal = async (error, context) => {
|
|
|
110
193
|
}
|
|
111
194
|
process.exit(1);
|
|
112
195
|
};
|
|
113
|
-
|
|
196
|
+
const runCliInternal = async () => {
|
|
197
|
+
const { rawArgs: rawArgs0, args: args0 } = getArgsFromProcess();
|
|
198
|
+
if (maybeHandoffToProjectLocalCli(rawArgs0)) {
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
// Fast path: print version and exit without bootstrapping the CLI.
|
|
202
|
+
// This keeps `zin -v` / `zin --version` snappy and avoids any debug output.
|
|
203
|
+
if (maybePrintVersionAndExit(args0)) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
const { EnvFileLoader } = await import('../src/cli/utils/EnvFileLoader.js');
|
|
207
|
+
EnvFileLoader.ensureLoaded();
|
|
208
|
+
// Auto-load install-only CLI extension packages that self-register commands.
|
|
209
|
+
let optionalCliExtensions;
|
|
210
|
+
let optionalCliStatuses = [];
|
|
114
211
|
try {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
212
|
+
({ OptionalCliExtensions: optionalCliExtensions } = await import('../src/cli/OptionalCliExtensions.js'));
|
|
213
|
+
optionalCliStatuses = await optionalCliExtensions.loadForArgs(args0);
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
// best-effort; missing optional extensions must not block the CLI
|
|
217
|
+
}
|
|
218
|
+
const missingOptionalExtension = optionalCliExtensions?.findMissingExtensionForArgs(args0, optionalCliStatuses);
|
|
219
|
+
if (missingOptionalExtension !== undefined) {
|
|
220
|
+
const { ErrorFactory } = await import('../src/exceptions/ZintrustError.js');
|
|
221
|
+
throw ErrorFactory.createCliError(optionalCliExtensions?.getMissingExtensionMessage(missingOptionalExtension) ??
|
|
222
|
+
`Missing optional CLI package: ${missingOptionalExtension.packageName}`);
|
|
223
|
+
}
|
|
224
|
+
// Ensure project-installed adapters/drivers are registered for CLI commands.
|
|
225
|
+
// (This is driven by src/zintrust.plugins.ts generated by `zin plugin install`.)
|
|
226
|
+
try {
|
|
227
|
+
const { PluginAutoImports } = await import('../src/runtime/PluginAutoImports.js');
|
|
228
|
+
const runtimeImportMode = process.env['DOCKER_WORKER'] === 'true' ? 'worker' : 'base';
|
|
229
|
+
const officialImports = await PluginAutoImports.tryImportRuntimeAutoImports(runtimeImportMode);
|
|
230
|
+
if (!officialImports.ok) {
|
|
231
|
+
logPluginAutoImportFailure(args0, 'Official', officialImports.errorMessage);
|
|
134
232
|
}
|
|
135
|
-
const
|
|
136
|
-
if (
|
|
137
|
-
|
|
138
|
-
throw ErrorFactory.createCliError(optionalCliExtensions?.getMissingExtensionMessage(missingOptionalExtension) ??
|
|
139
|
-
`Missing optional CLI package: ${missingOptionalExtension.packageName}`);
|
|
233
|
+
const projectImports = await PluginAutoImports.tryImportProjectAutoImports();
|
|
234
|
+
if (!projectImports.ok && projectImports.reason !== 'not-found') {
|
|
235
|
+
logPluginAutoImportFailure(args0, 'Project', projectImports.errorMessage);
|
|
140
236
|
}
|
|
141
|
-
|
|
142
|
-
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
// best-effort; CLI should still run even if plugins file is missing
|
|
240
|
+
}
|
|
241
|
+
const { CLI } = await import('../src/cli/CLI.js');
|
|
242
|
+
const cli = CLI.create();
|
|
243
|
+
// When executing via tsx (e.g. `npx tsx bin/zin.ts ...`), the script path can
|
|
244
|
+
// appear as the first element of `process.argv.slice(2)`. Commander expects
|
|
245
|
+
// args to start at the command name, so we strip a leading script path if present.
|
|
246
|
+
const { rawArgs, args } = getArgsFromProcess();
|
|
247
|
+
if (shouldDebugArgs(rawArgs)) {
|
|
143
248
|
try {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
const officialImports = await PluginAutoImports.tryImportRuntimeAutoImports(runtimeImportMode);
|
|
147
|
-
if (!officialImports.ok) {
|
|
148
|
-
logPluginAutoImportFailure(args0, 'Official', officialImports.errorMessage);
|
|
149
|
-
}
|
|
150
|
-
const projectImports = await PluginAutoImports.tryImportProjectAutoImports();
|
|
151
|
-
if (!projectImports.ok && projectImports.reason !== 'not-found') {
|
|
152
|
-
logPluginAutoImportFailure(args0, 'Project', projectImports.errorMessage);
|
|
153
|
-
}
|
|
249
|
+
process.stderr.write(`[zintrust-cli] process.argv=${JSON.stringify(process.argv)}\n`);
|
|
250
|
+
process.stderr.write(`[zintrust-cli] rawArgs=${JSON.stringify(rawArgs)}\n`);
|
|
154
251
|
}
|
|
155
252
|
catch {
|
|
156
|
-
//
|
|
157
|
-
}
|
|
158
|
-
const { CLI } = await import('../src/cli/CLI.js');
|
|
159
|
-
const cli = CLI.create();
|
|
160
|
-
// When executing via tsx (e.g. `npx tsx bin/zin.ts ...`), the script path can
|
|
161
|
-
// appear as the first element of `process.argv.slice(2)`. Commander expects
|
|
162
|
-
// args to start at the command name, so we strip a leading script path if present.
|
|
163
|
-
const { rawArgs, args } = getArgsFromProcess();
|
|
164
|
-
if (shouldDebugArgs(rawArgs)) {
|
|
165
|
-
try {
|
|
166
|
-
process.stderr.write(`[zintrust-cli] process.argv=${JSON.stringify(process.argv)}\n`);
|
|
167
|
-
process.stderr.write(`[zintrust-cli] rawArgs=${JSON.stringify(rawArgs)}\n`);
|
|
168
|
-
}
|
|
169
|
-
catch {
|
|
170
|
-
// ignore
|
|
171
|
-
}
|
|
253
|
+
// ignore
|
|
172
254
|
}
|
|
173
|
-
|
|
255
|
+
}
|
|
256
|
+
await cli.run(normalizeProxyTargetArgs(args));
|
|
257
|
+
};
|
|
258
|
+
export async function run() {
|
|
259
|
+
try {
|
|
260
|
+
await runCliInternal();
|
|
174
261
|
}
|
|
175
262
|
catch (error) {
|
|
176
263
|
await handleCliFatal(error, 'CLI execution failed');
|
|
177
264
|
}
|
|
178
265
|
}
|
|
266
|
+
export const CliLauncherInternal = Object.freeze({
|
|
267
|
+
CLI_HANDOFF_ENV_KEY,
|
|
268
|
+
findProjectLocalCliTarget,
|
|
269
|
+
getCurrentPackageRoot,
|
|
270
|
+
getRealPath,
|
|
271
|
+
isWithinDirectory,
|
|
272
|
+
resolveProjectLocalCliHandoff,
|
|
273
|
+
});
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../src/boot/registry/runtime.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AASvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../src/boot/registry/runtime.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AASvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AA2O9C,eAAO,MAAM,8BAA8B,GAAI,iBAAiB,gBAAgB,KAAG,IA6BlF,CAAC;AAqUF,eAAO,MAAM,eAAe,GAAI,QAAQ;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,eAAe,EAAE,gBAAgB,CAAC;IAClC,SAAS,EAAE,MAAM,OAAO,CAAC;IACzB,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACrC,KAAG;IAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CA0F7D,CAAC"}
|
|
@@ -40,18 +40,18 @@ const importFromExistingCandidates = async (moduleCandidates) => {
|
|
|
40
40
|
}
|
|
41
41
|
return undefined;
|
|
42
42
|
};
|
|
43
|
-
const
|
|
44
|
-
const
|
|
45
|
-
if (
|
|
46
|
-
return
|
|
43
|
+
const loadLocalSystemTraceModule = async () => {
|
|
44
|
+
const globalTracePluginState = globalThis;
|
|
45
|
+
if (globalTracePluginState.__zintrust_system_trace_runtime__ !== undefined) {
|
|
46
|
+
return globalTracePluginState.__zintrust_system_trace_runtime__;
|
|
47
47
|
}
|
|
48
48
|
const projectRoot = typeof process !== 'undefined' && typeof process.cwd === 'function' ? process.cwd() : '';
|
|
49
49
|
if (projectRoot !== '') {
|
|
50
50
|
const moduleCandidates = [
|
|
51
|
-
path.join(projectRoot, 'src', 'runtime', 'plugins', '
|
|
52
|
-
path.join(projectRoot, 'src', 'runtime', 'plugins', '
|
|
53
|
-
path.join(projectRoot, 'dist', 'runtime', 'plugins', '
|
|
54
|
-
path.join(projectRoot, 'dist', 'src', 'runtime', 'plugins', '
|
|
51
|
+
path.join(projectRoot, 'src', 'runtime', 'plugins', 'trace-runtime.ts'),
|
|
52
|
+
path.join(projectRoot, 'src', 'runtime', 'plugins', 'trace-runtime.js'),
|
|
53
|
+
path.join(projectRoot, 'dist', 'runtime', 'plugins', 'trace-runtime.js'),
|
|
54
|
+
path.join(projectRoot, 'dist', 'src', 'runtime', 'plugins', 'trace-runtime.js'),
|
|
55
55
|
];
|
|
56
56
|
const localModule = await importFromExistingCandidates(moduleCandidates);
|
|
57
57
|
if (localModule !== undefined) {
|
|
@@ -61,7 +61,7 @@ const loadLocalSystemDebuggerModule = async () => {
|
|
|
61
61
|
return localModule;
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
|
-
return tryImportOptional('@runtime/plugins/
|
|
64
|
+
return tryImportOptional('@runtime/plugins/trace-runtime');
|
|
65
65
|
};
|
|
66
66
|
const loadRuntimeQueueConfig = async () => {
|
|
67
67
|
const startupQueueConfig = getStartupQueueConfig();
|
|
@@ -380,32 +380,67 @@ const initializeScheduleHttpGateway = async (router) => {
|
|
|
380
380
|
Logger.warn('Failed to register Schedule HTTP gateway routes', error);
|
|
381
381
|
}
|
|
382
382
|
};
|
|
383
|
-
const
|
|
384
|
-
const raw = readEnvString('
|
|
383
|
+
const isTraceEnabled = () => {
|
|
384
|
+
const raw = readEnvString('TRACE_ENABLED').trim().toLowerCase();
|
|
385
385
|
return raw === '1' || raw === 'true';
|
|
386
386
|
};
|
|
387
|
-
const
|
|
388
|
-
const
|
|
389
|
-
return
|
|
387
|
+
const isTraceDashboardAutoMountEnabled = () => {
|
|
388
|
+
const raw = readEnvString('TRACE_AUTO_MOUNT').trim().toLowerCase();
|
|
389
|
+
return raw === '1' || raw === 'true';
|
|
390
|
+
};
|
|
391
|
+
const resolveTraceDashboardBasePath = () => {
|
|
392
|
+
const raw = readEnvString('TRACE_BASE_PATH').trim();
|
|
393
|
+
if (raw === '')
|
|
394
|
+
return '/trace';
|
|
395
|
+
return raw.startsWith('/') ? raw : `/${raw}`;
|
|
396
|
+
};
|
|
397
|
+
const resolveTraceDashboardMiddleware = () => {
|
|
398
|
+
return readEnvString('TRACE_MIDDLEWARE')
|
|
399
|
+
.split(',')
|
|
400
|
+
.map((value) => value.trim())
|
|
401
|
+
.filter(isNonEmptyString);
|
|
390
402
|
};
|
|
391
|
-
const
|
|
392
|
-
|
|
393
|
-
|
|
403
|
+
const isSystemTracePluginRequested = () => {
|
|
404
|
+
const globalTracePluginState = globalThis;
|
|
405
|
+
return globalTracePluginState.__zintrust_system_trace_plugin_requested__ === true;
|
|
406
|
+
};
|
|
407
|
+
const initializeSystemTrace = async (router) => {
|
|
408
|
+
if (!isSystemTracePluginRequested()) {
|
|
409
|
+
Logger.debug('System Trace plugin is not enabled in zintrust.plugins.*. Skipping init.');
|
|
394
410
|
return;
|
|
395
411
|
}
|
|
396
|
-
if (!
|
|
412
|
+
if (!isTraceEnabled())
|
|
397
413
|
return;
|
|
398
|
-
const
|
|
399
|
-
|
|
400
|
-
|
|
414
|
+
const traceModule = (await tryImportOptional('@runtime/plugins/trace-runtime')) ??
|
|
415
|
+
(await loadLocalSystemTraceModule());
|
|
416
|
+
if (traceModule === undefined) {
|
|
417
|
+
Logger.debug('System Trace is enabled but the optional package is unavailable.');
|
|
401
418
|
return;
|
|
402
419
|
}
|
|
403
420
|
try {
|
|
404
|
-
await
|
|
405
|
-
|
|
421
|
+
await traceModule.ensureSystemTraceRegistered();
|
|
422
|
+
if (traceModule.isAvailable?.() === false) {
|
|
423
|
+
Logger.debug('System Trace is enabled but the optional package is unavailable.');
|
|
424
|
+
return;
|
|
425
|
+
}
|
|
426
|
+
if (!isTraceDashboardAutoMountEnabled()) {
|
|
427
|
+
Logger.info('System Trace runtime activated. Set TRACE_AUTO_MOUNT=true or register dashboard routes manually if needed.');
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
if (typeof traceModule.registerTraceDashboard !== 'function') {
|
|
431
|
+
Logger.warn('System Trace auto-mount requested but the optional package does not expose registerTraceDashboard.');
|
|
432
|
+
return;
|
|
433
|
+
}
|
|
434
|
+
const basePath = resolveTraceDashboardBasePath();
|
|
435
|
+
const middleware = resolveTraceDashboardMiddleware();
|
|
436
|
+
traceModule.registerTraceDashboard(router, {
|
|
437
|
+
basePath,
|
|
438
|
+
...(middleware.length > 0 ? { middleware } : {}),
|
|
439
|
+
});
|
|
440
|
+
Logger.info(`System Trace dashboard auto-mounted at ${basePath}.`);
|
|
406
441
|
}
|
|
407
442
|
catch (error) {
|
|
408
|
-
Logger.warn('Failed to initialize System
|
|
443
|
+
Logger.warn('Failed to initialize System Trace runtime', error);
|
|
409
444
|
}
|
|
410
445
|
};
|
|
411
446
|
const initializeSockets = (router) => {
|
|
@@ -473,7 +508,7 @@ export const createLifecycle = (params) => {
|
|
|
473
508
|
await initializeArtifactDirectories(params.resolvedBasePath);
|
|
474
509
|
await registerMasterRoutes(params.resolvedBasePath, params.router);
|
|
475
510
|
initializeSockets(params.router);
|
|
476
|
-
await
|
|
511
|
+
await initializeSystemTrace(params.router);
|
|
477
512
|
if (Cloudflare.getWorkersEnv() === null && appConfig.dockerWorker === false) {
|
|
478
513
|
await initializeWorkers(params.router);
|
|
479
514
|
await initializeQueueMonitor(params.router);
|
package/src/cache/Cache.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cache.d.ts","sourceRoot":"","sources":["../../../src/cache/Cache.ts"],"names":[],"mappings":"AACA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"Cache.d.ts","sourceRoot":"","sources":["../../../src/cache/Cache.ts"],"names":[],"mappings":"AACA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AA6JtD,KAAK,UAAU,GAAG,QAAQ,CAAC;IACzB,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3C,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,SAAS,EAAE,MAAM,WAAW,CAAC;CAC9B,CAAC,CAAC;AA8DH,eAAO,MAAM,KAAK;UA5HC,CAAC,OAAO,MAAM,KAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;UAWlC,CAAC,OAAO,MAAM,SAAS,CAAC,QAAQ,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;kBAUjD,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;iBAUtB,OAAO,CAAC,IAAI,CAAC;eASb,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;qBAW3B,WAAW;mBAaX,MAAM,KAAG,UAAU;iBAuDvB,IAAI;EAcpB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,KAAK;UA1IC,CAAC,OAAO,MAAM,KAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;UAWlC,CAAC,OAAO,MAAM,SAAS,CAAC,QAAQ,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;kBAUjD,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;iBAUtB,OAAO,CAAC,IAAI,CAAC;eASb,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;qBAW3B,WAAW;mBAaX,MAAM,KAAG,UAAU;iBAuDvB,IAAI;EAmBI,CAAC"}
|
package/src/cache/Cache.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Central cache management and driver resolution
|
|
5
5
|
* Sealed namespace pattern - all exports through Cache namespace
|
|
6
6
|
*/
|
|
7
|
+
import { SystemTraceBridge } from '../trace/SystemTraceBridge.js';
|
|
7
8
|
import { CacheDriverRegistry } from './CacheDriverRegistry.js';
|
|
8
9
|
import { KVDriver } from './drivers/KVDriver.js';
|
|
9
10
|
import { KVRemoteDriver } from './drivers/KVRemoteDriver.js';
|
|
@@ -11,7 +12,6 @@ import { MemoryDriver } from './drivers/MemoryDriver.js';
|
|
|
11
12
|
import { MongoDriver } from './drivers/MongoDriver.js';
|
|
12
13
|
import { RedisDriver } from './drivers/RedisDriver.js';
|
|
13
14
|
import { cacheConfig } from '../config/cache.js';
|
|
14
|
-
import { SystemDebuggerBridge } from '../debugger/SystemDebuggerBridge.js';
|
|
15
15
|
import { Env } from '../config/env.js';
|
|
16
16
|
import { ErrorFactory } from '../exceptions/ZintrustError.js';
|
|
17
17
|
const instances = new Map();
|
|
@@ -88,7 +88,7 @@ const get = async (key) => {
|
|
|
88
88
|
const prefixedKey = autoPrefixKey(key);
|
|
89
89
|
const startedAt = Date.now();
|
|
90
90
|
const value = await getDriverInstance().get(prefixedKey);
|
|
91
|
-
|
|
91
|
+
SystemTraceBridge.emitCache('get', prefixedKey, Date.now() - startedAt, value !== null);
|
|
92
92
|
return value;
|
|
93
93
|
};
|
|
94
94
|
/**
|
|
@@ -98,7 +98,7 @@ const set = async (key, value, ttl) => {
|
|
|
98
98
|
const prefixedKey = autoPrefixKey(key);
|
|
99
99
|
const startedAt = Date.now();
|
|
100
100
|
await getDriverInstance().set(prefixedKey, value, ttl);
|
|
101
|
-
|
|
101
|
+
SystemTraceBridge.emitCache('set', prefixedKey, Date.now() - startedAt);
|
|
102
102
|
};
|
|
103
103
|
/**
|
|
104
104
|
* Remove an item from the cache
|
|
@@ -107,7 +107,7 @@ const del = async (key) => {
|
|
|
107
107
|
const prefixedKey = autoPrefixKey(key);
|
|
108
108
|
const startedAt = Date.now();
|
|
109
109
|
await getDriverInstance().delete(prefixedKey);
|
|
110
|
-
|
|
110
|
+
SystemTraceBridge.emitCache('delete', prefixedKey, Date.now() - startedAt);
|
|
111
111
|
};
|
|
112
112
|
/**
|
|
113
113
|
* Clear all items from the cache
|
|
@@ -115,7 +115,7 @@ const del = async (key) => {
|
|
|
115
115
|
const clear = async () => {
|
|
116
116
|
const startedAt = Date.now();
|
|
117
117
|
await getDriverInstance().clear();
|
|
118
|
-
|
|
118
|
+
SystemTraceBridge.emitCache('clear', 'zt:*', Date.now() - startedAt);
|
|
119
119
|
};
|
|
120
120
|
/**
|
|
121
121
|
* Check if an item exists in the cache
|
|
@@ -124,7 +124,7 @@ const has = async (key) => {
|
|
|
124
124
|
const prefixedKey = autoPrefixKey(key);
|
|
125
125
|
const startedAt = Date.now();
|
|
126
126
|
const exists = await getDriverInstance().has(prefixedKey);
|
|
127
|
-
|
|
127
|
+
SystemTraceBridge.emitCache('has', prefixedKey, Date.now() - startedAt, exists);
|
|
128
128
|
return exists;
|
|
129
129
|
};
|
|
130
130
|
/**
|
|
@@ -138,31 +138,31 @@ const store = (name) => {
|
|
|
138
138
|
const prefixedKey = autoPrefixKey(key);
|
|
139
139
|
const startedAt = Date.now();
|
|
140
140
|
const value = await getDriverInstance(name).get(prefixedKey);
|
|
141
|
-
|
|
141
|
+
SystemTraceBridge.emitCache('get', prefixedKey, Date.now() - startedAt, value !== null);
|
|
142
142
|
return value;
|
|
143
143
|
};
|
|
144
144
|
const setInStore = async (key, value, ttl) => {
|
|
145
145
|
const prefixedKey = autoPrefixKey(key);
|
|
146
146
|
const startedAt = Date.now();
|
|
147
147
|
await getDriverInstance(name).set(prefixedKey, value, ttl);
|
|
148
|
-
|
|
148
|
+
SystemTraceBridge.emitCache('set', prefixedKey, Date.now() - startedAt);
|
|
149
149
|
};
|
|
150
150
|
const delFromStore = async (key) => {
|
|
151
151
|
const prefixedKey = autoPrefixKey(key);
|
|
152
152
|
const startedAt = Date.now();
|
|
153
153
|
await getDriverInstance(name).delete(prefixedKey);
|
|
154
|
-
|
|
154
|
+
SystemTraceBridge.emitCache('delete', prefixedKey, Date.now() - startedAt);
|
|
155
155
|
};
|
|
156
156
|
const clearStore = async () => {
|
|
157
157
|
const startedAt = Date.now();
|
|
158
158
|
await getDriverInstance(name).clear();
|
|
159
|
-
|
|
159
|
+
SystemTraceBridge.emitCache('clear', `store:${String(name ?? 'default')}`, Date.now() - startedAt);
|
|
160
160
|
};
|
|
161
161
|
const hasInStore = async (key) => {
|
|
162
162
|
const prefixedKey = autoPrefixKey(key);
|
|
163
163
|
const startedAt = Date.now();
|
|
164
164
|
const exists = await getDriverInstance(name).has(prefixedKey);
|
|
165
|
-
|
|
165
|
+
SystemTraceBridge.emitCache('has', prefixedKey, Date.now() - startedAt, exists);
|
|
166
166
|
return exists;
|
|
167
167
|
};
|
|
168
168
|
const getStoreDriver = () => {
|
package/src/cli/BaseCommand.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Base Command - Abstract Command Class
|
|
3
3
|
* All CLI commands extend this class
|
|
4
4
|
*/
|
|
5
|
-
import {
|
|
5
|
+
import { SystemTraceBridge } from '../trace/SystemTraceBridge.js';
|
|
6
6
|
import { ErrorHandler } from './ErrorHandler.js';
|
|
7
7
|
import { ErrorFactory } from '../exceptions/ZintrustError.js';
|
|
8
8
|
import { Command } from 'commander';
|
|
@@ -44,11 +44,11 @@ export const BaseCommand = Object.freeze({
|
|
|
44
44
|
const startedAt = Date.now();
|
|
45
45
|
try {
|
|
46
46
|
await config.execute(options);
|
|
47
|
-
|
|
47
|
+
SystemTraceBridge.emitCommand(config.name, toCommandArguments(options), 0, Date.now() - startedAt);
|
|
48
48
|
}
|
|
49
49
|
catch (error) {
|
|
50
50
|
const message = error instanceof Error ? error.message : String(error);
|
|
51
|
-
|
|
51
|
+
SystemTraceBridge.emitCommand(config.name, toCommandArguments(options), 1, Date.now() - startedAt, message);
|
|
52
52
|
if (error instanceof Error) {
|
|
53
53
|
ErrorFactory.createTryCatchError('Command execution failed', error);
|
|
54
54
|
ErrorHandler.handle(error, undefined, false);
|
|
@@ -64,15 +64,15 @@ const OPTIONAL_CLI_EXTENSIONS = Object.freeze([
|
|
|
64
64
|
],
|
|
65
65
|
},
|
|
66
66
|
{
|
|
67
|
-
packageName: '@zintrust/
|
|
68
|
-
specifier: '@zintrust/
|
|
69
|
-
commands: ['
|
|
70
|
-
installCommand: 'npm install @zintrust/
|
|
67
|
+
packageName: '@zintrust/trace',
|
|
68
|
+
specifier: '@zintrust/trace/cli-register',
|
|
69
|
+
commands: ['trace:prune', 'trace:clear', 'trace:status', 'migrate:trace'],
|
|
70
|
+
installCommand: 'npm install @zintrust/trace',
|
|
71
71
|
localCandidates: [
|
|
72
|
-
path.join(packageRoot, 'packages', '
|
|
73
|
-
path.join(packageRoot, 'packages', '
|
|
74
|
-
path.join(packageRoot, 'packages', '
|
|
75
|
-
path.join(packageRoot, 'dist', 'packages', '
|
|
72
|
+
path.join(packageRoot, 'packages', 'trace', 'src', 'cli-register.ts'),
|
|
73
|
+
path.join(packageRoot, 'packages', 'trace', 'src', 'cli-register.js'),
|
|
74
|
+
path.join(packageRoot, 'packages', 'trace', 'dist', 'cli-register.js'),
|
|
75
|
+
path.join(packageRoot, 'dist', 'packages', 'trace', 'src', 'cli-register.js'),
|
|
76
76
|
],
|
|
77
77
|
},
|
|
78
78
|
{
|
|
@@ -215,7 +215,7 @@ const warnIfAdapterMissing = (cmd, conn) => {
|
|
|
215
215
|
if (conn.driver === 'mysql' && DatabaseAdapterRegistry.get('mysql') === undefined) {
|
|
216
216
|
cmd.warn('MySQL adapter is not installed/registered; migrations may not hit a real MySQL DB.');
|
|
217
217
|
cmd.warn('Install via `zin plugin install adapter:mysql` (or `zin add db:mysql`).');
|
|
218
|
-
cmd.debug('[debug] Expected a side-effect import in src/zintrust.plugins.ts like: import "
|
|
218
|
+
cmd.debug('[debug] Expected a side-effect import in src/zintrust.plugins.ts like: import "../../../packages/db-mysql/src/register";');
|
|
219
219
|
}
|
|
220
220
|
if (conn.driver === 'postgresql' && DatabaseAdapterRegistry.get('postgresql') === undefined) {
|
|
221
221
|
cmd.warn('PostgreSQL adapter is not installed/registered; migrations may not hit a real PostgreSQL DB.');
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export { TraceCommands } from '../commands/TraceCommands';
|
|
2
|
+
export declare const TracePruneCommand: Readonly<{
|
|
3
|
+
name: string;
|
|
4
|
+
getCommand: () => import("commander").Command;
|
|
5
|
+
}>;
|
|
6
|
+
export declare const TraceClearCommand: Readonly<{
|
|
7
|
+
name: string;
|
|
8
|
+
getCommand: () => import("commander").Command;
|
|
9
|
+
}>;
|
|
10
|
+
export declare const TraceStatusCommand: Readonly<{
|
|
11
|
+
name: string;
|
|
12
|
+
getCommand: () => import("commander").Command;
|
|
13
|
+
}>;
|
|
14
|
+
export declare const TraceMigrateCommand: Readonly<{
|
|
15
|
+
name: string;
|
|
16
|
+
getCommand: () => import("commander").Command;
|
|
17
|
+
}>;
|
|
18
|
+
//# sourceMappingURL=TraceCommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TraceCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/TraceCommand.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,eAAO,MAAM,iBAAiB;;;EAA2C,CAAC;AAE1E,eAAO,MAAM,iBAAiB;;;EAA2C,CAAC;AAE1E,eAAO,MAAM,kBAAkB;;;EAA4C,CAAC;AAE5E,eAAO,MAAM,mBAAmB;;;EAA6C,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { TraceCommands } from '../commands/TraceCommands.js';
|
|
2
|
+
export { TraceCommands } from '../commands/TraceCommands.js';
|
|
3
|
+
export const TracePruneCommand = TraceCommands.createTracePruneProvider();
|
|
4
|
+
export const TraceClearCommand = TraceCommands.createTraceClearProvider();
|
|
5
|
+
export const TraceStatusCommand = TraceCommands.createTraceStatusProvider();
|
|
6
|
+
export const TraceMigrateCommand = TraceCommands.createTraceMigrateProvider();
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { IBaseCommand } from '../BaseCommand';
|
|
2
|
+
import type { Command } from 'commander';
|
|
3
|
+
export declare const TraceCommands: Readonly<{
|
|
4
|
+
createTracePruneCommand: () => IBaseCommand;
|
|
5
|
+
createTraceClearCommand: () => IBaseCommand;
|
|
6
|
+
createTraceStatusCommand: () => IBaseCommand;
|
|
7
|
+
createTraceMigrateCommand: () => IBaseCommand;
|
|
8
|
+
createTracePruneProvider: () => Readonly<{
|
|
9
|
+
name: string;
|
|
10
|
+
getCommand: () => Command;
|
|
11
|
+
}>;
|
|
12
|
+
createTraceClearProvider: () => Readonly<{
|
|
13
|
+
name: string;
|
|
14
|
+
getCommand: () => Command;
|
|
15
|
+
}>;
|
|
16
|
+
createTraceStatusProvider: () => Readonly<{
|
|
17
|
+
name: string;
|
|
18
|
+
getCommand: () => Command;
|
|
19
|
+
}>;
|
|
20
|
+
createTraceMigrateProvider: () => Readonly<{
|
|
21
|
+
name: string;
|
|
22
|
+
getCommand: () => Command;
|
|
23
|
+
}>;
|
|
24
|
+
}>;
|
|
25
|
+
//# sourceMappingURL=TraceCommands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TraceCommands.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/TraceCommands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAsBrE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgqBzC,eAAO,MAAM,aAAa;mCACK,YAAY;mCAQZ,YAAY;oCAQX,YAAY;qCAQX,YAAY;;cAhCzB,MAAM;oBAAc,MAAM,OAAO;;;cAAjC,MAAM;oBAAc,MAAM,OAAO;;;cAAjC,MAAM;oBAAc,MAAM,OAAO;;;cAAjC,MAAM;oBAAc,MAAM,OAAO;;EAmDnD,CAAC"}
|