@fantasticit/sumi 0.9.0 → 0.9.2
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/dist/adapters.js +70 -3
- package/dist/adapters.js.map +1 -1
- package/dist/fix.js +10 -3
- package/dist/fix.js.map +1 -1
- package/node_modules/@sumi/create/package.json +1 -1
- package/node_modules/@sumi/create/template/control/flows/check.flow.yaml +12 -0
- package/node_modules/@sumi/create/template/control/rubrics/behavior.yaml +5 -5
- package/node_modules/@sumi/create/template/control/rubrics/clean-code.yaml +9 -0
- package/node_modules/@sumi/create/template/control/rubrics/device-acceptance.yaml +10 -0
- package/node_modules/@sumi/create/template/control/rubrics/domain.yaml +9 -0
- package/node_modules/@sumi/create/template/control/rubrics/omission.yaml +3 -3
- package/node_modules/@sumi/kernel/dist/brief.d.ts +2 -0
- package/node_modules/@sumi/kernel/dist/brief.js.map +1 -1
- package/node_modules/@sumi/kernel/dist/engine.js +29 -13
- package/node_modules/@sumi/kernel/dist/engine.js.map +1 -1
- package/node_modules/@sumi/kernel/dist/registry.d.ts +6 -0
- package/node_modules/@sumi/kernel/dist/registry.js +7 -1
- package/node_modules/@sumi/kernel/dist/registry.js.map +1 -1
- package/node_modules/@sumi/kernel/dist/scope.d.ts +4 -2
- package/node_modules/@sumi/kernel/dist/scope.js +12 -39
- package/node_modules/@sumi/kernel/dist/scope.js.map +1 -1
- package/node_modules/@sumi/kernel/dist/step-cache.d.ts +19 -0
- package/node_modules/@sumi/kernel/dist/step-cache.js +185 -0
- package/node_modules/@sumi/kernel/dist/step-cache.js.map +1 -0
- package/node_modules/@sumi/kernel/package.json +2 -2
- package/node_modules/@sumi/plugin-sdk/README.md +2 -0
- package/node_modules/@sumi/plugin-sdk/dist/git.d.ts +16 -1
- package/node_modules/@sumi/plugin-sdk/dist/git.js +45 -5
- package/node_modules/@sumi/plugin-sdk/dist/git.js.map +1 -1
- package/node_modules/@sumi/plugin-sdk/dist/index.d.ts +1 -0
- package/node_modules/@sumi/plugin-sdk/dist/index.js +1 -0
- package/node_modules/@sumi/plugin-sdk/dist/index.js.map +1 -1
- package/node_modules/@sumi/plugin-sdk/dist/protocol.d.ts +5 -0
- package/node_modules/@sumi/plugin-sdk/dist/protocol.js.map +1 -1
- package/node_modules/@sumi/plugin-sdk/dist/snapshot.d.ts +2 -0
- package/node_modules/@sumi/plugin-sdk/dist/snapshot.js +60 -0
- package/node_modules/@sumi/plugin-sdk/dist/snapshot.js.map +1 -0
- package/node_modules/@sumi/plugin-sdk/dist/validate.js +9 -0
- package/node_modules/@sumi/plugin-sdk/dist/validate.js.map +1 -1
- package/node_modules/@sumi/plugin-sdk/package.json +1 -1
- package/node_modules/@sumi/plugins-core/README.md +14 -10
- package/node_modules/@sumi/plugins-core/dist/fix/lint.js +3 -3
- package/node_modules/@sumi/plugins-core/dist/fix/lint.js.map +1 -1
- package/node_modules/@sumi/plugins-core/dist/lib.d.ts +6 -2
- package/node_modules/@sumi/plugins-core/dist/lib.js +12 -7
- package/node_modules/@sumi/plugins-core/dist/lib.js.map +1 -1
- package/node_modules/@sumi/plugins-core/dist/plugins/test-affected.js +105 -28
- package/node_modules/@sumi/plugins-core/dist/plugins/test-affected.js.map +1 -1
- package/node_modules/@sumi/plugins-core/dist/test-batches.d.ts +16 -0
- package/node_modules/@sumi/plugins-core/dist/test-batches.js +83 -0
- package/node_modules/@sumi/plugins-core/dist/test-batches.js.map +1 -0
- package/node_modules/@sumi/plugins-core/dist/test-checkpoints.d.ts +27 -0
- package/node_modules/@sumi/plugins-core/dist/test-checkpoints.js +121 -0
- package/node_modules/@sumi/plugins-core/dist/test-checkpoints.js.map +1 -0
- package/node_modules/@sumi/plugins-core/dist/vitest-runner.js +20 -4
- package/node_modules/@sumi/plugins-core/dist/vitest-runner.js.map +1 -1
- package/node_modules/@sumi/plugins-core/package.json +2 -2
- package/node_modules/@sumi/plugins-core/sumi-plugins.yaml +4 -0
- package/node_modules/@sumi/plugins-governance/README.md +9 -6
- package/node_modules/@sumi/plugins-governance/dist/checkout.d.ts +1 -2
- package/node_modules/@sumi/plugins-governance/dist/checkout.js +6 -6
- package/node_modules/@sumi/plugins-governance/dist/checkout.js.map +1 -1
- package/node_modules/@sumi/plugins-governance/dist/commands/gate.js +61 -5
- package/node_modules/@sumi/plugins-governance/dist/commands/gate.js.map +1 -1
- package/node_modules/@sumi/plugins-governance/dist/commands/pr-report.js +19 -11
- package/node_modules/@sumi/plugins-governance/dist/commands/pr-report.js.map +1 -1
- package/node_modules/@sumi/plugins-governance/dist/gate-cache.js +42 -5
- package/node_modules/@sumi/plugins-governance/dist/gate-cache.js.map +1 -1
- package/node_modules/@sumi/plugins-governance/dist/plugins/protected-paths.js +7 -4
- package/node_modules/@sumi/plugins-governance/dist/plugins/protected-paths.js.map +1 -1
- package/node_modules/@sumi/plugins-governance/dist/pr-base.d.ts +9 -0
- package/node_modules/@sumi/plugins-governance/dist/pr-base.js +28 -0
- package/node_modules/@sumi/plugins-governance/dist/pr-base.js.map +1 -1
- package/node_modules/@sumi/plugins-governance/dist/pr-report-publish.d.ts +16 -4
- package/node_modules/@sumi/plugins-governance/dist/pr-report-publish.js +47 -9
- package/node_modules/@sumi/plugins-governance/dist/pr-report-publish.js.map +1 -1
- package/node_modules/@sumi/plugins-governance/dist/protected.js +7 -9
- package/node_modules/@sumi/plugins-governance/dist/protected.js.map +1 -1
- package/node_modules/@sumi/plugins-governance/dist/semantic.js +2 -17
- package/node_modules/@sumi/plugins-governance/dist/semantic.js.map +1 -1
- package/node_modules/@sumi/plugins-governance/instructions/push.md +6 -4
- package/node_modules/@sumi/plugins-governance/package.json +2 -2
- package/node_modules/@sumi/plugins-openspec/package.json +4 -4
- package/node_modules/@sumi/plugins-precedent/dist/model.js +2 -15
- package/node_modules/@sumi/plugins-precedent/dist/model.js.map +1 -1
- package/node_modules/@sumi/plugins-precedent/dist/plugins/harvest.js +28 -3
- package/node_modules/@sumi/plugins-precedent/dist/plugins/harvest.js.map +1 -1
- package/node_modules/@sumi/plugins-precedent/package.json +3 -3
- package/node_modules/@sumi/plugins-review/README.md +1 -1
- package/node_modules/@sumi/plugins-review/dist/dispute.d.ts +9 -0
- package/node_modules/@sumi/plugins-review/dist/dispute.js +91 -0
- package/node_modules/@sumi/plugins-review/dist/dispute.js.map +1 -0
- package/node_modules/@sumi/plugins-review/dist/index.d.ts +1 -0
- package/node_modules/@sumi/plugins-review/dist/index.js +1 -0
- package/node_modules/@sumi/plugins-review/dist/index.js.map +1 -1
- package/node_modules/@sumi/plugins-review/dist/plugins/independent-recheck.js +45 -8
- package/node_modules/@sumi/plugins-review/dist/plugins/independent-recheck.js.map +1 -1
- package/node_modules/@sumi/plugins-review/dist/plugins/rubric.js +56 -21
- package/node_modules/@sumi/plugins-review/dist/plugins/rubric.js.map +1 -1
- package/node_modules/@sumi/plugins-review/dist/recheck.d.ts +1 -0
- package/node_modules/@sumi/plugins-review/dist/recheck.js +21 -4
- package/node_modules/@sumi/plugins-review/dist/recheck.js.map +1 -1
- package/node_modules/@sumi/plugins-review/dist/review.d.ts +29 -0
- package/node_modules/@sumi/plugins-review/dist/review.js +215 -3
- package/node_modules/@sumi/plugins-review/dist/review.js.map +1 -1
- package/node_modules/@sumi/plugins-review/dist/submission.js +5 -1
- package/node_modules/@sumi/plugins-review/dist/submission.js.map +1 -1
- package/node_modules/@sumi/plugins-review/dist/upgrade-command.d.ts +1 -0
- package/node_modules/@sumi/plugins-review/dist/upgrade-command.js +14 -0
- package/node_modules/@sumi/plugins-review/dist/upgrade-command.js.map +1 -0
- package/node_modules/@sumi/plugins-review/dist/upgrade-flow-plan.d.ts +13 -0
- package/node_modules/@sumi/plugins-review/dist/upgrade-flow-plan.js +531 -0
- package/node_modules/@sumi/plugins-review/dist/upgrade-flow-plan.js.map +1 -0
- package/node_modules/@sumi/plugins-review/dist/upgrade-flow-render.d.ts +33 -0
- package/node_modules/@sumi/plugins-review/dist/upgrade-flow-render.js +187 -0
- package/node_modules/@sumi/plugins-review/dist/upgrade-flow-render.js.map +1 -0
- package/node_modules/@sumi/plugins-review/dist/upgrade.d.ts +26 -0
- package/node_modules/@sumi/plugins-review/dist/upgrade.js +68 -0
- package/node_modules/@sumi/plugins-review/dist/upgrade.js.map +1 -0
- package/node_modules/@sumi/plugins-review/dist/validation-receipt.js +105 -5
- package/node_modules/@sumi/plugins-review/dist/validation-receipt.js.map +1 -1
- package/node_modules/@sumi/plugins-review/package.json +5 -4
- package/node_modules/@sumi/plugins-review/sumi-plugins.yaml +1 -0
- package/package.json +10 -10
|
@@ -22,6 +22,12 @@ export interface RegisteredCommand extends CommandDeclaration {
|
|
|
22
22
|
export interface Registry {
|
|
23
23
|
plugins: Map<string, RegisteredPlugin>;
|
|
24
24
|
commands: Map<string, RegisteredCommand>;
|
|
25
|
+
/** 插件包声明的升级规划命令;内核只负责发现,不解释输出策略。 */
|
|
26
|
+
upgrades: {
|
|
27
|
+
argv: string[];
|
|
28
|
+
dir: string;
|
|
29
|
+
source: string;
|
|
30
|
+
}[];
|
|
25
31
|
/** 已启用插件包声明并经项目配置增删的通用路径提示。 */
|
|
26
32
|
pathHints: Record<string, string[]>;
|
|
27
33
|
}
|
|
@@ -46,6 +46,7 @@ export function resolvePackageDir(root, name) {
|
|
|
46
46
|
}
|
|
47
47
|
export function loadRegistry(root, config) {
|
|
48
48
|
const entries = [];
|
|
49
|
+
const upgrades = [];
|
|
49
50
|
const pathHints = {};
|
|
50
51
|
/** 已启用插件包的真实包名(按路径启用时读取其 package.json),用于依赖检查。 */
|
|
51
52
|
const enabled = new Set(config.packages);
|
|
@@ -61,6 +62,11 @@ export function loadRegistry(root, config) {
|
|
|
61
62
|
if (!existsSync(manifest))
|
|
62
63
|
throw new KernelError(`插件包 ${name} 缺少 ${PACKAGE_MANIFEST}`);
|
|
63
64
|
const raw = readYaml(manifest);
|
|
65
|
+
if (raw?.upgrade !== undefined) {
|
|
66
|
+
if (!Array.isArray(raw.upgrade) || !raw.upgrade.length || !raw.upgrade.every((part) => typeof part === 'string' && part))
|
|
67
|
+
throw new KernelError(`${manifest} 的 upgrade 必须是非空命令数组`);
|
|
68
|
+
upgrades.push({ argv: raw.upgrade, dir, source: manifest });
|
|
69
|
+
}
|
|
64
70
|
if (raw?.pathHints !== undefined) {
|
|
65
71
|
if (!raw.pathHints || typeof raw.pathHints !== 'object' || Array.isArray(raw.pathHints))
|
|
66
72
|
throw new KernelError(`${manifest} 的 pathHints 必须是对象`);
|
|
@@ -135,6 +141,6 @@ export function loadRegistry(root, config) {
|
|
|
135
141
|
commands.set(command.name, { ...command, pluginId: decl.id, dir: entry.dir });
|
|
136
142
|
}
|
|
137
143
|
}
|
|
138
|
-
return { plugins, commands, pathHints };
|
|
144
|
+
return { plugins, commands, upgrades, pathHints };
|
|
139
145
|
}
|
|
140
146
|
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAmD,MAAM,kBAAkB,CAAC;AACxG,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,yBAAyB;AACzB,MAAM,CAAC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AACpD,wBAAwB;AACxB,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,9 +20,11 @@ export declare function listFiles(root: string): string[];
|
|
|
20
20
|
export declare function changedFiles(root: string, base: string | null): string[];
|
|
21
21
|
/** 固定提交模式的改动文件。 */
|
|
22
22
|
export declare function changedFilesAtCommit(root: string, base: string | null, commit: string): string[];
|
|
23
|
-
/**
|
|
24
|
-
export declare function contentDigest(root: string
|
|
23
|
+
/** 工作区内容摘要由 SDK 的唯一实现计算。 */
|
|
24
|
+
export declare function contentDigest(root: string): string;
|
|
25
25
|
export declare function matches(globs: string[] | undefined, file: string): boolean;
|
|
26
|
+
/** 步骤可见的文件:去掉项目 exclude,声明了 triggers 时只保留命中的文件。运行与修复共用这一规则。 */
|
|
27
|
+
export declare function stepFiles(files: string[], exclude: string[] | undefined, triggers: string[] | undefined): string[];
|
|
26
28
|
export interface TierInfo {
|
|
27
29
|
tier: string;
|
|
28
30
|
reasons: string[];
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { execFileSync } from 'node:child_process';
|
|
2
|
-
import {
|
|
3
|
-
import { existsSync, lstatSync, readFileSync, readlinkSync } from 'node:fs';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
4
3
|
import { join } from 'node:path';
|
|
5
|
-
import { GIT_MAX_BUFFER, gitPaths } from '@sumi/plugin-sdk';
|
|
4
|
+
import { GIT_MAX_BUFFER, gitPaths, repositorySnapshot } from '@sumi/plugin-sdk';
|
|
6
5
|
import picomatch from 'picomatch';
|
|
7
6
|
import { tierIndex } from './config.js';
|
|
8
7
|
import { KernelError } from './errors.js';
|
|
@@ -68,57 +67,31 @@ export function listFiles(root) {
|
|
|
68
67
|
export function changedFiles(root, base) {
|
|
69
68
|
if (base === null)
|
|
70
69
|
return listFiles(root);
|
|
71
|
-
const diff = gitPaths(root, ['diff', '--name-only', base]);
|
|
70
|
+
const diff = gitPaths(root, ['diff', '--name-only', '--no-renames', base]);
|
|
72
71
|
const untracked = gitPaths(root, ['ls-files', '--others', '--exclude-standard']);
|
|
73
72
|
return [...new Set([...diff, ...untracked])].filter((f) => !f.startsWith(`${RUN_DIR}/`) && existsSync(join(root, f))).sort();
|
|
74
73
|
}
|
|
75
74
|
/** 固定提交模式的改动文件。 */
|
|
76
75
|
export function changedFilesAtCommit(root, base, commit) {
|
|
77
|
-
const args = base === null ? ['ls-tree', '-r', '--name-only', commit] : ['diff', '--name-only', base, commit];
|
|
76
|
+
const args = base === null ? ['ls-tree', '-r', '--name-only', commit] : ['diff', '--name-only', '--no-renames', base, commit];
|
|
78
77
|
return gitPaths(root, args)
|
|
79
78
|
.filter((f) => existsSync(join(root, f)))
|
|
80
79
|
.sort();
|
|
81
80
|
}
|
|
82
|
-
/**
|
|
83
|
-
export function contentDigest(root
|
|
84
|
-
|
|
85
|
-
// Windows 文件系统不提供 Unix 执行位,Git 索引保存提交所用的模式。
|
|
86
|
-
const indexedModes = new Map();
|
|
87
|
-
if (process.platform === 'win32') {
|
|
88
|
-
for (const entry of gitPaths(root, ['ls-files', '--stage'])) {
|
|
89
|
-
const match = /^(\d+) [0-9a-f]+ 0\t([\s\S]+)$/.exec(entry);
|
|
90
|
-
if (match)
|
|
91
|
-
indexedModes.set(match[2], match[1]);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
for (const file of files) {
|
|
95
|
-
const full = join(root, file);
|
|
96
|
-
const stat = lstatSync(full);
|
|
97
|
-
// 子模块在工作区中是目录,git 只记录其提交,不纳入内容摘要。
|
|
98
|
-
if (stat.isDirectory())
|
|
99
|
-
continue;
|
|
100
|
-
let mode = '100644';
|
|
101
|
-
let body;
|
|
102
|
-
if (stat.isSymbolicLink()) {
|
|
103
|
-
mode = '120000';
|
|
104
|
-
body = Buffer.from(readlinkSync(full));
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
if (process.platform === 'win32')
|
|
108
|
-
mode = indexedModes.get(file) ?? mode;
|
|
109
|
-
else if (stat.mode & 0o111)
|
|
110
|
-
mode = '100755';
|
|
111
|
-
body = readFileSync(full);
|
|
112
|
-
}
|
|
113
|
-
hash.update(`${file}\0${mode}\0${createHash('sha256').update(body).digest('hex')}\n`);
|
|
114
|
-
}
|
|
115
|
-
return hash.digest('hex');
|
|
81
|
+
/** 工作区内容摘要由 SDK 的唯一实现计算。 */
|
|
82
|
+
export function contentDigest(root) {
|
|
83
|
+
return repositorySnapshot(root);
|
|
116
84
|
}
|
|
117
85
|
export function matches(globs, file) {
|
|
118
86
|
if (!globs || globs.length === 0)
|
|
119
87
|
return false;
|
|
120
88
|
return picomatch(globs, { dot: true })(file);
|
|
121
89
|
}
|
|
90
|
+
/** 步骤可见的文件:去掉项目 exclude,声明了 triggers 时只保留命中的文件。运行与修复共用这一规则。 */
|
|
91
|
+
export function stepFiles(files, exclude, triggers) {
|
|
92
|
+
const pool = files.filter((f) => !matches(exclude, f));
|
|
93
|
+
return triggers ? pool.filter((f) => matches(triggers, f)) : pool;
|
|
94
|
+
}
|
|
122
95
|
/** 档位:调用者指定或最低档位;升档规则命中时取较高者。 */
|
|
123
96
|
export function deriveTier(config, files, requested) {
|
|
124
97
|
let tier = requested ?? config.tiers[0];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { PluginContext } from '@sumi/plugin-sdk';
|
|
2
|
+
import type { StepRecord } from './brief.js';
|
|
3
|
+
import { type RegisteredPlugin } from './registry.js';
|
|
4
|
+
/** 未知工具或命令实现时不猜测缓存有效性。 */
|
|
5
|
+
export declare function stepCacheKey(root: string, snapshot: string, plugin: RegisteredPlugin, ctx: PluginContext): string | null;
|
|
6
|
+
interface Entry {
|
|
7
|
+
key: string;
|
|
8
|
+
runId: string;
|
|
9
|
+
record: StepRecord;
|
|
10
|
+
recordDigest: string;
|
|
11
|
+
evidence: {
|
|
12
|
+
path: string;
|
|
13
|
+
digest: string;
|
|
14
|
+
}[];
|
|
15
|
+
}
|
|
16
|
+
export declare function restoreStep(root: string, key: string, evidenceDir: string): Entry | null;
|
|
17
|
+
/** 每步结束即发布,可用于进程在后续步骤被中断的重入。 */
|
|
18
|
+
export declare function saveStep(root: string, key: string, runId: string, record: StepRecord, evidenceDir: string): void;
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { createHash, randomBytes } from 'node:crypto';
|
|
2
|
+
import { cpSync, existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, realpathSync, renameSync, rmSync, writeFileSync, } from 'node:fs';
|
|
3
|
+
import { dirname, join, resolve, sep } from 'node:path';
|
|
4
|
+
import { resolveArgv } from './registry.js';
|
|
5
|
+
import { RUN_DIR } from './scope.js';
|
|
6
|
+
const hash = (value) => createHash('sha256').update(value).digest('hex');
|
|
7
|
+
function files(dir, prefix = '') {
|
|
8
|
+
const found = [];
|
|
9
|
+
try {
|
|
10
|
+
for (const name of readdirSync(dir).sort()) {
|
|
11
|
+
const path = join(dir, name);
|
|
12
|
+
const rel = prefix ? `${prefix}/${name}` : name;
|
|
13
|
+
const stat = lstatSync(path);
|
|
14
|
+
if (stat.isDirectory()) {
|
|
15
|
+
const nested = files(path, rel);
|
|
16
|
+
if (!nested)
|
|
17
|
+
return null;
|
|
18
|
+
found.push(...nested);
|
|
19
|
+
}
|
|
20
|
+
else if (stat.isFile())
|
|
21
|
+
found.push({ path: rel, digest: hash(readFileSync(path)) });
|
|
22
|
+
else
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
return found;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function toolIdentity(root, name) {
|
|
32
|
+
const manifest = join(root, 'node_modules', name, 'package.json');
|
|
33
|
+
try {
|
|
34
|
+
const packageDigest = hash(readFileSync(realpathSync(manifest)));
|
|
35
|
+
const state = [
|
|
36
|
+
join(root, 'node_modules', '.modules.yaml'),
|
|
37
|
+
join(root, 'node_modules', '.package-lock.json'),
|
|
38
|
+
join(root, '.yarn', 'install-state.gz'),
|
|
39
|
+
].find(existsSync);
|
|
40
|
+
if (!state)
|
|
41
|
+
return null;
|
|
42
|
+
return hash(JSON.stringify([packageDigest, hash(readFileSync(state))]));
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/** 未知工具或命令实现时不猜测缓存有效性。 */
|
|
49
|
+
export function stepCacheKey(root, snapshot, plugin, ctx) {
|
|
50
|
+
const cache = plugin.decl.cache;
|
|
51
|
+
if (!cache || plugin.decl.kind !== 'check')
|
|
52
|
+
return null;
|
|
53
|
+
const tools = (cache.tools ?? []).map((name) => [name, toolIdentity(root, name)]);
|
|
54
|
+
if (tools.some(([, identity]) => !identity))
|
|
55
|
+
return null;
|
|
56
|
+
const argv = resolveArgv(plugin.decl.command, plugin.commandDir);
|
|
57
|
+
const implementation = argv
|
|
58
|
+
.filter((arg) => arg.startsWith('/') || /^[A-Za-z]:[\\/]/.test(arg))
|
|
59
|
+
.map((path) => {
|
|
60
|
+
try {
|
|
61
|
+
return hash(readFileSync(path));
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
if (implementation.includes(null))
|
|
68
|
+
return null;
|
|
69
|
+
const dist = join(plugin.commandDir, 'dist');
|
|
70
|
+
const packageFiles = existsSync(dist) ? files(dist) : [];
|
|
71
|
+
if (!packageFiles)
|
|
72
|
+
return null;
|
|
73
|
+
let declaration;
|
|
74
|
+
try {
|
|
75
|
+
declaration = hash(readFileSync(plugin.source));
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
return hash(JSON.stringify({
|
|
81
|
+
version: 2,
|
|
82
|
+
root: resolve(root),
|
|
83
|
+
snapshot,
|
|
84
|
+
plugin: plugin.decl.id,
|
|
85
|
+
pluginVersion: plugin.decl.version,
|
|
86
|
+
declaration,
|
|
87
|
+
implementation,
|
|
88
|
+
packageFiles,
|
|
89
|
+
tools,
|
|
90
|
+
runtime: [process.version, process.platform, process.arch],
|
|
91
|
+
env: (cache.env ?? []).map((name) => [name, process.env[name] ?? null]),
|
|
92
|
+
context: {
|
|
93
|
+
pathHints: ctx.pathHints,
|
|
94
|
+
base: ctx.base,
|
|
95
|
+
mode: ctx.mode,
|
|
96
|
+
tier: ctx.tier,
|
|
97
|
+
tiers: ctx.tiers,
|
|
98
|
+
stepId: ctx.stepId,
|
|
99
|
+
config: ctx.config,
|
|
100
|
+
files: ctx.files,
|
|
101
|
+
all: ctx.all,
|
|
102
|
+
obligations: ctx.obligations,
|
|
103
|
+
labels: ctx.labels,
|
|
104
|
+
},
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
function cacheDir(root, key) {
|
|
108
|
+
return join(root, RUN_DIR, 'cache', 'steps', key);
|
|
109
|
+
}
|
|
110
|
+
function sourceEvidence(root, entry) {
|
|
111
|
+
try {
|
|
112
|
+
const runs = realpathSync(join(root, RUN_DIR, 'runs'));
|
|
113
|
+
const sourceRun = realpathSync(join(runs, entry.runId));
|
|
114
|
+
if (dirname(sourceRun) !== runs)
|
|
115
|
+
return false;
|
|
116
|
+
const sourceDir = realpathSync(join(sourceRun, entry.record.id));
|
|
117
|
+
if (!sourceDir.startsWith(`${sourceRun}${sep}`))
|
|
118
|
+
return false;
|
|
119
|
+
return JSON.stringify(files(sourceDir)) === JSON.stringify(entry.evidence);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
export function restoreStep(root, key, evidenceDir) {
|
|
126
|
+
const dir = cacheDir(root, key);
|
|
127
|
+
try {
|
|
128
|
+
const entry = JSON.parse(readFileSync(join(dir, 'cache.json'), 'utf8'));
|
|
129
|
+
if (entry.key !== key ||
|
|
130
|
+
entry.record.state !== 'pass' ||
|
|
131
|
+
entry.record.next.length ||
|
|
132
|
+
!entry.runId ||
|
|
133
|
+
entry.recordDigest !== hash(JSON.stringify(entry.record)))
|
|
134
|
+
return null;
|
|
135
|
+
const actual = files(join(dir, 'evidence'));
|
|
136
|
+
if (!actual || JSON.stringify(actual) !== JSON.stringify(entry.evidence) || !sourceEvidence(root, entry))
|
|
137
|
+
return null;
|
|
138
|
+
mkdirSync(evidenceDir, { recursive: true });
|
|
139
|
+
cpSync(join(dir, 'evidence'), evidenceDir, { recursive: true, force: true });
|
|
140
|
+
return entry;
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
rmSync(evidenceDir, { recursive: true, force: true });
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/** 每步结束即发布,可用于进程在后续步骤被中断的重入。 */
|
|
148
|
+
export function saveStep(root, key, runId, record, evidenceDir) {
|
|
149
|
+
if (record.state !== 'pass' || record.next.length)
|
|
150
|
+
return;
|
|
151
|
+
const target = cacheDir(root, key);
|
|
152
|
+
if (existsSync(target)) {
|
|
153
|
+
try {
|
|
154
|
+
const existing = JSON.parse(readFileSync(join(target, 'cache.json'), 'utf8'));
|
|
155
|
+
if (existing.key === key &&
|
|
156
|
+
existing.recordDigest === hash(JSON.stringify(existing.record)) &&
|
|
157
|
+
JSON.stringify(files(join(target, 'evidence'))) === JSON.stringify(existing.evidence) &&
|
|
158
|
+
sourceEvidence(root, existing))
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
// 损坏的缓存用新证据替换。
|
|
163
|
+
}
|
|
164
|
+
rmSync(target, { recursive: true, force: true });
|
|
165
|
+
}
|
|
166
|
+
const parent = join(root, RUN_DIR, 'cache', 'steps');
|
|
167
|
+
mkdirSync(parent, { recursive: true });
|
|
168
|
+
const temp = join(parent, `.tmp-${randomBytes(8).toString('hex')}`);
|
|
169
|
+
try {
|
|
170
|
+
mkdirSync(temp, { recursive: true });
|
|
171
|
+
cpSync(evidenceDir, join(temp, 'evidence'), { recursive: true });
|
|
172
|
+
const evidence = files(join(temp, 'evidence'));
|
|
173
|
+
if (!evidence)
|
|
174
|
+
return;
|
|
175
|
+
writeFileSync(join(temp, 'cache.json'), JSON.stringify({ key, runId, record, recordDigest: hash(JSON.stringify(record)), evidence }));
|
|
176
|
+
renameSync(temp, target);
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
// 缓存失败不能改变检查结论,下一次会正常执行。
|
|
180
|
+
}
|
|
181
|
+
finally {
|
|
182
|
+
rmSync(temp, { recursive: true, force: true });
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=step-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-cache.js","sourceRoot":"","sources":["../src/step-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sumi/kernel",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.2",
|
|
4
4
|
"description": "策略中立的编排内核",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"./package.json": "./package.json"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@sumi/plugin-sdk": "0.9.
|
|
16
|
+
"@sumi/plugin-sdk": "0.9.2",
|
|
17
17
|
"yaml": "2.9.1",
|
|
18
18
|
"picomatch": "4.0.7"
|
|
19
19
|
}
|
|
@@ -54,6 +54,8 @@
|
|
|
54
54
|
|
|
55
55
|
插件包在包根的 `sumi-plugins.yaml` 中以 `plugins:` 列出声明;项目插件每个目录一个 `plugin.yaml`。声明有三种形态:可执行插件(`command`)、派生插件(`base`)、只提供命令与 hook 的插件(不声明 `command`,但声明 `commands` 或 `hooks`)。
|
|
56
56
|
|
|
57
|
+
纯本地 `check` 插件可以声明 `cache: { env: ['CI'], tools: ['typescript'] }`。默认不缓存;声明后,内核在完整工作区快照、步骤上下文、插件实现、指定环境变量和工具安装标识一致时验证并复用通过证据。依赖外部服务或未列出的隐藏输入的检查不应声明缓存。
|
|
58
|
+
|
|
57
59
|
包清单还可在顶层声明 `pathHints: { testNeutral: ['openspec/**'] }`。只有启用的包参与汇总;项目配置 `pathHints.testNeutral.add/remove` 可按 glob 增删,结果在每个插件上下文的 `pathHints.testNeutral` 中。内核只汇总传递;`core/test-affected` 用它选择测试,`core/exec` 将其作为 JSON 数组 `SUMI_TEST_NEUTRAL` 传给项目脚本。它不改变其他插件收到的 `files`。这些 glob 使用 picomatch 语义并开启 `dot: true`;自定义脚本消费 `SUMI_TEST_NEUTRAL` 时也必须开启 dot,才能让 `openspec/**` 匹配 `.openspec.yaml` 等点文件。
|
|
58
60
|
|
|
59
61
|
### 编辑后补充上下文回执
|
|
@@ -1,7 +1,22 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* git 同步调用的输出上限:大仓库的完整文件列表可达数十 MB,受保护文件(锁文件、快照)单个可达数 MB。
|
|
3
|
+
* 子进程默认上限只有 1MB,超出时抛 ENOBUFS;凡是输出随仓库规模增长的 git 调用都应使用本上限。
|
|
4
|
+
*/
|
|
2
5
|
export declare const GIT_MAX_BUFFER: number;
|
|
6
|
+
/** 输出超过 GIT_MAX_BUFFER 时的说明性错误,取代难以定位的 spawnSync ENOBUFS。 */
|
|
7
|
+
export declare function gitOutputTooLarge(args: string[]): Error;
|
|
8
|
+
/**
|
|
9
|
+
* 运行 git 并返回完整标准输出(不 trim)。失败照常抛出 execFileSync 的错误;仅输出超限时改抛说明性错误。
|
|
10
|
+
* 只用于输出随文件数或文件大小增长的子命令;读取整份 diff 内容前先考虑能否改用 --raw、--name-only 等摘要形式。
|
|
11
|
+
*/
|
|
12
|
+
export declare function gitOutput(cwd: string, args: string[]): string;
|
|
3
13
|
/**
|
|
4
14
|
* 运行 git 的列文件命令(args[0] 为子命令,如 ls-files、diff --name-only、ls-tree --name-only),返回原始路径。
|
|
5
15
|
* 以 -z 输出、按 \0 切分:默认输出会把非 ASCII 文件名转义为带引号的八进制串,路径对不上真实文件。
|
|
6
16
|
*/
|
|
7
17
|
export declare function gitPaths(cwd: string, args: string[]): string[];
|
|
18
|
+
/**
|
|
19
|
+
* 读取某个提交中的文件内容(git show <ref>:<path>)。对象不存在或 git 失败时返回 null;
|
|
20
|
+
* 输出超限时抛出说明性错误,不把过大的文件静默当作不存在。
|
|
21
|
+
*/
|
|
22
|
+
export declare function gitShowFile(cwd: string, ref: string, path: string): string | null;
|
|
@@ -1,19 +1,59 @@
|
|
|
1
|
-
import { execFileSync } from 'node:child_process';
|
|
2
|
-
/**
|
|
1
|
+
import { execFileSync, spawnSync } from 'node:child_process';
|
|
2
|
+
/**
|
|
3
|
+
* git 同步调用的输出上限:大仓库的完整文件列表可达数十 MB,受保护文件(锁文件、快照)单个可达数 MB。
|
|
4
|
+
* 子进程默认上限只有 1MB,超出时抛 ENOBUFS;凡是输出随仓库规模增长的 git 调用都应使用本上限。
|
|
5
|
+
*/
|
|
3
6
|
export const GIT_MAX_BUFFER = 512 * 1024 * 1024;
|
|
7
|
+
const overflowed = (error) => error?.code === 'ENOBUFS';
|
|
8
|
+
/** 输出超过 GIT_MAX_BUFFER 时的说明性错误,取代难以定位的 spawnSync ENOBUFS。 */
|
|
9
|
+
export function gitOutputTooLarge(args) {
|
|
10
|
+
return new Error(`git ${args.join(' ')} 的输出超过 ${GIT_MAX_BUFFER / 1024 / 1024}MB 上限,无法在内存中处理`);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* 运行 git 并返回完整标准输出(不 trim)。失败照常抛出 execFileSync 的错误;仅输出超限时改抛说明性错误。
|
|
14
|
+
* 只用于输出随文件数或文件大小增长的子命令;读取整份 diff 内容前先考虑能否改用 --raw、--name-only 等摘要形式。
|
|
15
|
+
*/
|
|
16
|
+
export function gitOutput(cwd, args) {
|
|
17
|
+
try {
|
|
18
|
+
return execFileSync('git', args, {
|
|
19
|
+
cwd,
|
|
20
|
+
encoding: 'utf8',
|
|
21
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
22
|
+
windowsHide: true,
|
|
23
|
+
maxBuffer: GIT_MAX_BUFFER,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
if (overflowed(error))
|
|
28
|
+
throw gitOutputTooLarge(args);
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
4
32
|
/**
|
|
5
33
|
* 运行 git 的列文件命令(args[0] 为子命令,如 ls-files、diff --name-only、ls-tree --name-only),返回原始路径。
|
|
6
34
|
* 以 -z 输出、按 \0 切分:默认输出会把非 ASCII 文件名转义为带引号的八进制串,路径对不上真实文件。
|
|
7
35
|
*/
|
|
8
36
|
export function gitPaths(cwd, args) {
|
|
9
37
|
const [subcommand, ...rest] = args;
|
|
10
|
-
|
|
38
|
+
return gitOutput(cwd, [subcommand, '-z', ...rest])
|
|
39
|
+
.split('\0')
|
|
40
|
+
.filter(Boolean);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 读取某个提交中的文件内容(git show <ref>:<path>)。对象不存在或 git 失败时返回 null;
|
|
44
|
+
* 输出超限时抛出说明性错误,不把过大的文件静默当作不存在。
|
|
45
|
+
*/
|
|
46
|
+
export function gitShowFile(cwd, ref, path) {
|
|
47
|
+
const args = ['show', `${ref}:${path}`];
|
|
48
|
+
const r = spawnSync('git', args, {
|
|
11
49
|
cwd,
|
|
12
50
|
encoding: 'utf8',
|
|
13
|
-
stdio: ['ignore', 'pipe', '
|
|
51
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
14
52
|
windowsHide: true,
|
|
15
53
|
maxBuffer: GIT_MAX_BUFFER,
|
|
16
54
|
});
|
|
17
|
-
|
|
55
|
+
if (overflowed(r.error))
|
|
56
|
+
throw gitOutputTooLarge(args);
|
|
57
|
+
return r.status === 0 && !r.error ? r.stdout : null;
|
|
18
58
|
}
|
|
19
59
|
//# sourceMappingURL=git.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE7D;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAEhD,MAAM,UAAU,GAAG,CAAC,KAAc,EAAW,EAAE,CAAE,KAA2C,EAAE,IAAI,KAAK,SAAS,CAAC;AAEjH,6DAA6D;AAC7D,MAAM,UAAU,iBAAiB,CAAC,IAAc;IAC9C,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,cAAc,GAAG,IAAI,GAAG,IAAI,gBAAgB,CAAC,CAAC;AAChG,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,IAAc;IACnD,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE;YAC/B,GAAG;YACH,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,cAAc;SAC1B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,UAAU,CAAC,KAAK,CAAC;YAAE,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,IAAc;IAClD,MAAM,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACnC,OAAO,SAAS,CAAC,GAAG,EAAE,CAAC,UAAW,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;SAChD,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,GAAW,EAAE,IAAY;IAChE,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE;QAC/B,GAAG;QACH,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;QACnC,WAAW,EAAE,IAAI;QACjB,SAAS,EAAE,cAAc;KAC1B,CAAC,CAAC;IACH,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;QAAE,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACvD,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACtD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC"}
|
|
@@ -70,6 +70,11 @@ export interface PluginDeclaration {
|
|
|
70
70
|
with?: Record<string, unknown>;
|
|
71
71
|
/** 超时,单位秒。 */
|
|
72
72
|
timeout: number;
|
|
73
|
+
/** 显式声明本地检查可复用及额外的执行环境输入;未声明时内核始终执行。 */
|
|
74
|
+
cache?: {
|
|
75
|
+
env?: string[];
|
|
76
|
+
tools?: string[];
|
|
77
|
+
};
|
|
73
78
|
triggers?: string[];
|
|
74
79
|
minTier?: string;
|
|
75
80
|
fix?: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,yBAAyB;AAUzB,MAAM,CAAC,MAAM,QAAQ,GAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAC7F,MAAM,CAAC,MAAM,OAAO,GAAsB,CAAC,MAAM,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAC9G,MAAM,CAAC,MAAM,gBAAgB,GAA8B,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;AAE3G,qCAAqC;AACrC,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,CAAC,CAAC;IAChC,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,CAAC;AACX,CAAC;AASD,4CAA4C;AAC5C,MAAM,UAAU,aAAa,CAAC,IAAuB,EAAE,KAAa,EAAE,IAAY;IAChF,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,KAAK,iBAAiB,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC;IACjF,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,GAAG,GAAG,EAAE,CAAC;AACtD,CAAC;
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
|