@zlooks.cn/global-config-server 1.0.0

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.
Files changed (73) hide show
  1. package/dist/command/index.d.ts +3 -0
  2. package/dist/command/index.d.ts.map +1 -0
  3. package/dist/command/index.js +24 -0
  4. package/dist/command/index.js.map +1 -0
  5. package/dist/config/global-config-revision-conflict-error.d.ts +5 -0
  6. package/dist/config/global-config-revision-conflict-error.d.ts.map +1 -0
  7. package/dist/config/global-config-revision-conflict-error.js +9 -0
  8. package/dist/config/global-config-revision-conflict-error.js.map +1 -0
  9. package/dist/config/schema.d.ts +14 -0
  10. package/dist/config/schema.d.ts.map +1 -0
  11. package/dist/config/schema.js +8 -0
  12. package/dist/config/schema.js.map +1 -0
  13. package/dist/config/typeorm-site-presentation-store.d.ts +17 -0
  14. package/dist/config/typeorm-site-presentation-store.d.ts.map +1 -0
  15. package/dist/config/typeorm-site-presentation-store.js +131 -0
  16. package/dist/config/typeorm-site-presentation-store.js.map +1 -0
  17. package/dist/config/typeorm-site-profile-store.d.ts +16 -0
  18. package/dist/config/typeorm-site-profile-store.d.ts.map +1 -0
  19. package/dist/config/typeorm-site-profile-store.js +74 -0
  20. package/dist/config/typeorm-site-profile-store.js.map +1 -0
  21. package/dist/mcp/global-config-provider.d.ts +10 -0
  22. package/dist/mcp/global-config-provider.d.ts.map +1 -0
  23. package/dist/mcp/global-config-provider.js +160 -0
  24. package/dist/mcp/global-config-provider.js.map +1 -0
  25. package/dist/migrations/index.d.ts +3 -0
  26. package/dist/migrations/index.d.ts.map +1 -0
  27. package/dist/migrations/index.js +2 -0
  28. package/dist/migrations/index.js.map +1 -0
  29. package/dist/persistence/entities.d.ts +21 -0
  30. package/dist/persistence/entities.d.ts.map +1 -0
  31. package/dist/persistence/entities.js +26 -0
  32. package/dist/persistence/entities.js.map +1 -0
  33. package/dist/runtime/config-snapshot-publisher.d.ts +22 -0
  34. package/dist/runtime/config-snapshot-publisher.d.ts.map +1 -0
  35. package/dist/runtime/config-snapshot-publisher.js +92 -0
  36. package/dist/runtime/config-snapshot-publisher.js.map +1 -0
  37. package/dist/runtime/site-presentation-publisher.d.ts +9 -0
  38. package/dist/runtime/site-presentation-publisher.d.ts.map +1 -0
  39. package/dist/runtime/site-presentation-publisher.js +8 -0
  40. package/dist/runtime/site-presentation-publisher.js.map +1 -0
  41. package/dist/runtime/site-profile-publisher.d.ts +9 -0
  42. package/dist/runtime/site-profile-publisher.d.ts.map +1 -0
  43. package/dist/runtime/site-profile-publisher.js +8 -0
  44. package/dist/runtime/site-profile-publisher.js.map +1 -0
  45. package/dist/services/application.service.d.ts +4 -0
  46. package/dist/services/application.service.d.ts.map +1 -0
  47. package/dist/services/application.service.js +21 -0
  48. package/dist/services/application.service.js.map +1 -0
  49. package/dist/services/config.service.d.ts +3 -0
  50. package/dist/services/config.service.d.ts.map +1 -0
  51. package/dist/services/config.service.js +17 -0
  52. package/dist/services/config.service.js.map +1 -0
  53. package/dist/services/database.service.d.ts +3 -0
  54. package/dist/services/database.service.d.ts.map +1 -0
  55. package/dist/services/database.service.js +23 -0
  56. package/dist/services/database.service.js.map +1 -0
  57. package/dist/services/global-config-runtime.service.d.ts +152 -0
  58. package/dist/services/global-config-runtime.service.d.ts.map +1 -0
  59. package/dist/services/global-config-runtime.service.js +63 -0
  60. package/dist/services/global-config-runtime.service.js.map +1 -0
  61. package/dist/services/global-config.boot.d.ts +3 -0
  62. package/dist/services/global-config.boot.d.ts.map +1 -0
  63. package/dist/services/global-config.boot.js +8 -0
  64. package/dist/services/global-config.boot.js.map +1 -0
  65. package/dist/services/logger.service.d.ts +4 -0
  66. package/dist/services/logger.service.d.ts.map +1 -0
  67. package/dist/services/logger.service.js +8 -0
  68. package/dist/services/logger.service.js.map +1 -0
  69. package/dist/services/mcp-provider.service.d.ts +3 -0
  70. package/dist/services/mcp-provider.service.d.ts.map +1 -0
  71. package/dist/services/mcp-provider.service.js +19 -0
  72. package/dist/services/mcp-provider.service.js.map +1 -0
  73. package/package.json +59 -0
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/command/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ import { fileURLToPath } from 'node:url';
3
+ import { createRegistryDatabaseDataSource, registerDatabaseCommands, } from '@zlooks.cn/database-command';
4
+ import { runServiceCommand } from '@zlooks.cn/service-command';
5
+ import { globalConfigMigrations } from '../migrations/index.js';
6
+ import { SitePresentationEntity, SiteProfileEntity } from '../persistence/entities.js';
7
+ await runServiceCommand({
8
+ packageRoot: fileURLToPath(new URL('../../', import.meta.url)),
9
+ requiresReactServer: false,
10
+ configure(program) {
11
+ registerDatabaseCommands(program, {
12
+ createDataSource: (envFile) => createRegistryDatabaseDataSource(envFile, {
13
+ commandNamespace: 'cn.zlooks.global.config.db.command',
14
+ entities: [SitePresentationEntity, SiteProfileEntity],
15
+ }),
16
+ migrations: globalConfigMigrations,
17
+ });
18
+ },
19
+ }).catch(reportStartupFailure);
20
+ function reportStartupFailure(error) {
21
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
22
+ process.exitCode = 1;
23
+ }
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/command/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACL,gCAAgC,EAChC,wBAAwB,GACzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEvF,MAAM,iBAAiB,CAAC;IACtB,WAAW,EAAE,aAAa,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9D,mBAAmB,EAAE,KAAK;IAC1B,SAAS,CAAC,OAAO;QACf,wBAAwB,CAAC,OAAO,EAAE;YAChC,gBAAgB,EAAE,CAAC,OAAO,EAAE,EAAE,CAC5B,gCAAgC,CAAC,OAAO,EAAE;gBACxC,gBAAgB,EAAE,oCAAoC;gBACtD,QAAQ,EAAE,CAAC,sBAAsB,EAAE,iBAAiB,CAAC;aACtD,CAAC;YACJ,UAAU,EAAE,sBAAsB;SACnC,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;AAE/B,SAAS,oBAAoB,CAAC,KAAc;IAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare class GlobalConfigRevisionConflictError extends Error {
2
+ readonly currentRevision: number;
3
+ constructor(currentRevision: number);
4
+ }
5
+ //# sourceMappingURL=global-config-revision-conflict-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-config-revision-conflict-error.d.ts","sourceRoot":"","sources":["../../src/config/global-config-revision-conflict-error.ts"],"names":[],"mappings":"AAAA,qBAAa,iCAAkC,SAAQ,KAAK;aACvB,eAAe,EAAE,MAAM;IAA1D,YAAmC,eAAe,EAAE,MAAM,EAGzD;CACF"}
@@ -0,0 +1,9 @@
1
+ export class GlobalConfigRevisionConflictError extends Error {
2
+ currentRevision;
3
+ constructor(currentRevision) {
4
+ super(`Global configuration revision conflict; current revision is ${currentRevision}`);
5
+ this.currentRevision = currentRevision;
6
+ this.name = 'GlobalConfigRevisionConflictError';
7
+ }
8
+ }
9
+ //# sourceMappingURL=global-config-revision-conflict-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-config-revision-conflict-error.js","sourceRoot":"","sources":["../../src/config/global-config-revision-conflict-error.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,iCAAkC,SAAQ,KAAK;IACvB,eAAe;IAAlD,YAAmC,eAAuB;QACxD,KAAK,CAAC,+DAA+D,eAAe,EAAE,CAAC,CAAC;+BADvD,eAAe;QAEhD,IAAI,CAAC,IAAI,GAAG,mCAAmC,CAAC;IAClD,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import { type PostgresConfig } from '@zlooks.cn/infrastructure';
2
+ export interface GlobalConfigServerConfigSources {
3
+ readonly postgres: unknown;
4
+ }
5
+ export interface GlobalConfigServerConfig {
6
+ readonly infrastructure: {
7
+ readonly postgres: PostgresConfig;
8
+ };
9
+ readonly publisher: {
10
+ readonly refreshIntervalMs: number;
11
+ };
12
+ }
13
+ export declare function parseGlobalConfigServerConfig(input: GlobalConfigServerConfigSources): GlobalConfigServerConfig;
14
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAErF,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,cAAc,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAA;KAAE,CAAC;IAC/D,QAAQ,CAAC,SAAS,EAAE;QAAE,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5D;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,+BAA+B,GACrC,wBAAwB,CAK1B"}
@@ -0,0 +1,8 @@
1
+ import { parsePostgresConfig } from '@zlooks.cn/infrastructure';
2
+ export function parseGlobalConfigServerConfig(input) {
3
+ return Object.freeze({
4
+ infrastructure: Object.freeze({ postgres: parsePostgresConfig(input.postgres) }),
5
+ publisher: Object.freeze({ refreshIntervalMs: 1_000 }),
6
+ });
7
+ }
8
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAuB,MAAM,2BAA2B,CAAC;AAWrF,MAAM,UAAU,6BAA6B,CAC3C,KAAsC;IAEtC,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChF,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC;KACvD,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { type SitePresentation, type SitePresentationSnapshot } from '@zlooks.cn/global-config-shared';
2
+ import type { DataSource } from 'typeorm';
3
+ export { GlobalConfigRevisionConflictError } from './global-config-revision-conflict-error.js';
4
+ export declare class TypeOrmSitePresentationStore {
5
+ #private;
6
+ private readonly dataSource;
7
+ constructor(dataSource: DataSource, options?: {
8
+ readonly clock?: () => Date;
9
+ });
10
+ read(): Promise<SitePresentationSnapshot>;
11
+ update(input: {
12
+ readonly expectedRevision: number;
13
+ readonly updatedBy: string;
14
+ readonly value: SitePresentation;
15
+ }): Promise<SitePresentationSnapshot>;
16
+ }
17
+ //# sourceMappingURL=typeorm-site-presentation-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeorm-site-presentation-store.d.ts","sourceRoot":"","sources":["../../src/config/typeorm-site-presentation-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC9B,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAkB1C,OAAO,EAAE,iCAAiC,EAAE,MAAM,4CAA4C,CAAC;AAiB/F,qBAAa,4BAA4B;;IAIrC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAD7B,YACmB,UAAU,EAAE,UAAU,EACvC,OAAO,GAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAA;KAAO,EAG9C;IAEY,IAAI,IAAI,OAAO,CAAC,wBAAwB,CAAC,CAGrD;IAEY,MAAM,CAAC,KAAK,EAAE;QACzB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;KAClC,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAiBpC;CA+EF"}
@@ -0,0 +1,131 @@
1
+ import { parseSitePresentation, parseSitePresentationSnapshot, } from '@zlooks.cn/global-config-shared';
2
+ import { z } from 'zod';
3
+ import { SitePresentationEntity } from '../persistence/entities.js';
4
+ import { GlobalConfigRevisionConflictError } from './global-config-revision-conflict-error.js';
5
+ const DOCUMENT_ID = 'site.presentation';
6
+ const DEFAULT_BACKGROUND_VIDEO_URL = 'https://assets.mixkit.co/videos/47650/47650-720.mp4';
7
+ const DEFAULT_SITE_PRESENTATION = parseSitePresentation({
8
+ identity: {
9
+ name: 'ZLOOKS',
10
+ homeHref: '/',
11
+ backgroundVideoUrl: DEFAULT_BACKGROUND_VIDEO_URL,
12
+ description: '让服务独立演进,让体验自然汇聚。',
13
+ },
14
+ linkGroups: [],
15
+ legal: { copyright: '© Zlooks.cn', registrations: [] },
16
+ });
17
+ export { GlobalConfigRevisionConflictError } from './global-config-revision-conflict-error.js';
18
+ const legacyPresentationSchema = z.strictObject({
19
+ identity: z.strictObject({
20
+ name: z.string(),
21
+ homeHref: z.string(),
22
+ logoUrl: z.string().optional(),
23
+ description: z.string().optional(),
24
+ }),
25
+ linkGroups: z.array(z.unknown()),
26
+ legal: z.strictObject({
27
+ copyright: z.string().optional(),
28
+ registration: z.string().optional(),
29
+ registrationHref: z.string().optional(),
30
+ }),
31
+ });
32
+ export class TypeOrmSitePresentationStore {
33
+ dataSource;
34
+ #clock;
35
+ constructor(dataSource, options = {}) {
36
+ this.dataSource = dataSource;
37
+ this.#clock = options.clock ?? (() => new Date());
38
+ }
39
+ async read() {
40
+ await this.#ensureInitialDocument();
41
+ return this.#readExisting();
42
+ }
43
+ async update(input) {
44
+ const value = parseSitePresentation(input.value);
45
+ await this.#ensureInitialDocument();
46
+ const updatedAt = this.#clock();
47
+ const result = await this.dataSource.getRepository(SitePresentationEntity).update({ id: DOCUMENT_ID, revision: input.expectedRevision }, {
48
+ revision: input.expectedRevision + 1,
49
+ value,
50
+ updatedAt,
51
+ updatedBy: input.updatedBy,
52
+ });
53
+ if (result.affected !== 1) {
54
+ throw new GlobalConfigRevisionConflictError((await this.#readExisting()).revision);
55
+ }
56
+ return this.#readExisting();
57
+ }
58
+ async #ensureInitialDocument() {
59
+ const now = this.#clock();
60
+ await this.dataSource.getRepository(SitePresentationEntity)
61
+ .createQueryBuilder()
62
+ .insert()
63
+ .into(SitePresentationEntity)
64
+ .values({
65
+ id: DOCUMENT_ID,
66
+ schemaVersion: 2,
67
+ revision: 0,
68
+ value: DEFAULT_SITE_PRESENTATION,
69
+ updatedAt: now,
70
+ updatedBy: 'bootstrap',
71
+ })
72
+ .orIgnore()
73
+ .execute();
74
+ }
75
+ async #readExisting() {
76
+ const row = await this.dataSource.getRepository(SitePresentationEntity).findOneByOrFail({
77
+ id: DOCUMENT_ID,
78
+ });
79
+ if (row.schemaVersion === 1)
80
+ return this.#migrateLegacy(row);
81
+ const snapshot = parseSitePresentationSnapshot({
82
+ schemaVersion: row.schemaVersion,
83
+ revision: row.revision,
84
+ value: row.value,
85
+ updatedAt: row.updatedAt.toISOString(),
86
+ updatedBy: row.updatedBy,
87
+ });
88
+ if (snapshot.value.identity.backgroundVideoUrl !== undefined)
89
+ return snapshot;
90
+ return parseSitePresentationSnapshot({
91
+ ...snapshot,
92
+ value: {
93
+ ...snapshot.value,
94
+ identity: {
95
+ ...snapshot.value.identity,
96
+ backgroundVideoUrl: DEFAULT_BACKGROUND_VIDEO_URL,
97
+ },
98
+ },
99
+ });
100
+ }
101
+ async #migrateLegacy(row) {
102
+ const legacy = legacyPresentationSchema.parse(row.value);
103
+ const registrationNumber = legacy.legal.registration ?? legacy.legal.registrationHref;
104
+ const value = parseSitePresentation({
105
+ identity: { ...legacy.identity, backgroundVideoUrl: DEFAULT_BACKGROUND_VIDEO_URL },
106
+ linkGroups: legacy.linkGroups,
107
+ legal: {
108
+ ...(legacy.legal.copyright ? { copyright: legacy.legal.copyright } : {}),
109
+ registrations: registrationNumber ? [{
110
+ id: 'legacy-registration',
111
+ kind: 'other',
112
+ number: registrationNumber,
113
+ ...(legacy.legal.registration && legacy.legal.registrationHref
114
+ ? { verificationUrl: legacy.legal.registrationHref }
115
+ : {}),
116
+ }] : [],
117
+ },
118
+ });
119
+ const result = await this.dataSource.getRepository(SitePresentationEntity).update({ id: DOCUMENT_ID, schemaVersion: 1, revision: row.revision }, {
120
+ schemaVersion: 2,
121
+ revision: row.revision + 1,
122
+ value,
123
+ updatedAt: this.#clock(),
124
+ updatedBy: 'migration:v2',
125
+ });
126
+ if (result.affected !== 1)
127
+ return this.#readExisting();
128
+ return this.#readExisting();
129
+ }
130
+ }
131
+ //# sourceMappingURL=typeorm-site-presentation-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeorm-site-presentation-store.js","sourceRoot":"","sources":["../../src/config/typeorm-site-presentation-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type SiteProfile, type SiteProfileSnapshot } from '@zlooks.cn/global-config-shared';
2
+ import type { DataSource } from 'typeorm';
3
+ export declare class TypeOrmSiteProfileStore {
4
+ #private;
5
+ private readonly dataSource;
6
+ constructor(dataSource: DataSource, options?: {
7
+ readonly clock?: () => Date;
8
+ });
9
+ read(): Promise<SiteProfileSnapshot>;
10
+ update(input: {
11
+ readonly expectedRevision: number;
12
+ readonly updatedBy: string;
13
+ readonly value: SiteProfile;
14
+ }): Promise<SiteProfileSnapshot>;
15
+ }
16
+ //# sourceMappingURL=typeorm-site-profile-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeorm-site-profile-store.d.ts","sourceRoot":"","sources":["../../src/config/typeorm-site-profile-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACzB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAoB1C,qBAAa,uBAAuB;;IAIhC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAD7B,YACmB,UAAU,EAAE,UAAU,EACvC,OAAO,GAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAA;KAAO,EAG9C;IAEY,IAAI,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAGhD;IAEY,MAAM,CAAC,KAAK,EAAE;QACzB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;KAC7B,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAgB/B;CAgCF"}
@@ -0,0 +1,74 @@
1
+ import { parseSiteProfile, parseSiteProfileSnapshot, } from '@zlooks.cn/global-config-shared';
2
+ import { SiteProfileEntity } from '../persistence/entities.js';
3
+ import { GlobalConfigRevisionConflictError } from './global-config-revision-conflict-error.js';
4
+ const DOCUMENT_ID = 'site.profile';
5
+ const DEFAULT_SITE_PROFILE = parseSiteProfile({
6
+ profile: {
7
+ displayName: 'ZLOOKS',
8
+ headline: '保持好奇,认真生活。',
9
+ biography: '这里是我的个人网站。我把值得记住的想法、作品与生活片刻留在这里,不急着更新,也不急着给每件事情下结论。',
10
+ },
11
+ topics: [
12
+ { id: 'thoughts', name: '想法', summary: '观察、记录与继续思考' },
13
+ { id: 'works', name: '作品', summary: '完成的作品与进行中的尝试' },
14
+ { id: 'life', name: '生活', summary: '普通但值得记住的片刻' },
15
+ { id: 'travel', name: '远方', summary: '旅行、见闻与仍在保持的好奇' },
16
+ ],
17
+ featuredLinks: [{ id: 'blog', label: '阅读文章', href: '/blog', external: false }],
18
+ });
19
+ export class TypeOrmSiteProfileStore {
20
+ dataSource;
21
+ #clock;
22
+ constructor(dataSource, options = {}) {
23
+ this.dataSource = dataSource;
24
+ this.#clock = options.clock ?? (() => new Date());
25
+ }
26
+ async read() {
27
+ await this.#ensureInitialDocument();
28
+ return this.#readExisting();
29
+ }
30
+ async update(input) {
31
+ const value = parseSiteProfile(input.value);
32
+ await this.#ensureInitialDocument();
33
+ const result = await this.dataSource.getRepository(SiteProfileEntity).update({ id: DOCUMENT_ID, revision: input.expectedRevision }, {
34
+ revision: input.expectedRevision + 1,
35
+ value,
36
+ updatedAt: this.#clock(),
37
+ updatedBy: input.updatedBy,
38
+ });
39
+ if (result.affected !== 1) {
40
+ throw new GlobalConfigRevisionConflictError((await this.#readExisting()).revision);
41
+ }
42
+ return this.#readExisting();
43
+ }
44
+ async #ensureInitialDocument() {
45
+ const now = this.#clock();
46
+ await this.dataSource.getRepository(SiteProfileEntity)
47
+ .createQueryBuilder()
48
+ .insert()
49
+ .into(SiteProfileEntity)
50
+ .values({
51
+ id: DOCUMENT_ID,
52
+ schemaVersion: 1,
53
+ revision: 0,
54
+ value: DEFAULT_SITE_PROFILE,
55
+ updatedAt: now,
56
+ updatedBy: 'bootstrap',
57
+ })
58
+ .orIgnore()
59
+ .execute();
60
+ }
61
+ async #readExisting() {
62
+ const row = await this.dataSource.getRepository(SiteProfileEntity).findOneByOrFail({
63
+ id: DOCUMENT_ID,
64
+ });
65
+ return parseSiteProfileSnapshot({
66
+ schemaVersion: row.schemaVersion,
67
+ revision: row.revision,
68
+ value: row.value,
69
+ updatedAt: row.updatedAt.toISOString(),
70
+ updatedBy: row.updatedBy,
71
+ });
72
+ }
73
+ }
74
+ //# sourceMappingURL=typeorm-site-profile-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeorm-site-profile-store.js","sourceRoot":"","sources":["../../src/config/typeorm-site-profile-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type SitePresentationSnapshot, type SiteProfileSnapshot } from '@zlooks.cn/global-config-shared';
2
+ interface GlobalConfigMcpOperations {
3
+ readPresentation(): Promise<SitePresentationSnapshot>;
4
+ updatePresentationFromMcp(input: unknown): Promise<SitePresentationSnapshot>;
5
+ readProfile(): Promise<SiteProfileSnapshot>;
6
+ updateProfileFromMcp(input: unknown): Promise<SiteProfileSnapshot>;
7
+ }
8
+ export declare function createGlobalConfigMcpProvider(operations: GlobalConfigMcpOperations): import("@hile/mcp").McpProviderDefinition;
9
+ export {};
10
+ //# sourceMappingURL=global-config-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-config-provider.d.ts","sourceRoot":"","sources":["../../src/mcp/global-config-provider.ts"],"names":[],"mappings":"AAOA,OAAO,EAeL,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACzB,MAAM,iCAAiC,CAAC;AAGzC,UAAU,yBAAyB;IACjC,gBAAgB,IAAI,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACtD,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAC7E,WAAW,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC5C,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACpE;AAED,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,yBAAyB,6CAyGlF"}
@@ -0,0 +1,160 @@
1
+ import { defineMcpPrompt, defineMcpProvider, defineMcpTool, } from '@hile/mcp';
2
+ import { GLOBAL_CONFIG_MCP_EDIT_PROFILE_PROMPT, GLOBAL_CONFIG_MCP_EDIT_PROMPT, GLOBAL_CONFIG_MCP_PROVIDER_ID, GLOBAL_CONFIG_MCP_READ_PROFILE_TOOL, GLOBAL_CONFIG_MCP_READ_SCOPE, GLOBAL_CONFIG_MCP_READ_TOOL, GLOBAL_CONFIG_MCP_UPDATE_PROFILE_TOOL, GLOBAL_CONFIG_MCP_UPDATE_TOOL, GLOBAL_CONFIG_MCP_WRITE_SCOPE, globalConfigMcpEditPromptSchema, globalConfigMcpProfileUpdateSchema, globalConfigMcpUpdateSchema, sitePresentationSnapshotSchema, siteProfileSnapshotSchema, } from '@zlooks.cn/global-config-shared';
3
+ import { z } from 'zod';
4
+ export function createGlobalConfigMcpProvider(operations) {
5
+ const readPresentation = defineMcpTool({
6
+ name: GLOBAL_CONFIG_MCP_READ_TOOL,
7
+ title: '读取站点展示配置',
8
+ description: '读取当前完整的站点展示配置快照及 revision,包括站点身份、链接分组、版权、备案和背景资源等公开字段。此工具只读且不会修改配置;执行更新前应先调用它,以最新快照为基础保留未要求变更的字段并取得 expectedRevision。',
9
+ inputSchema: z.strictObject({}),
10
+ outputSchema: sitePresentationSnapshotSchema,
11
+ annotations: { readOnlyHint: true, idempotentHint: true, destructiveHint: false },
12
+ access: { scopes: [GLOBAL_CONFIG_MCP_READ_SCOPE] },
13
+ execution: { timeoutMs: 10_000, retry: 'idempotent-failover' },
14
+ }, async (_input, context) => cancellableRead(context.signal, operations.readPresentation));
15
+ const updatePresentation = defineMcpTool({
16
+ name: GLOBAL_CONFIG_MCP_UPDATE_TOOL,
17
+ title: '修改站点展示配置',
18
+ description: '使用完整 value 替换站点身份、链接分组、版权、备案和背景资源配置,成功后返回新的完整快照与 revision。该操作不是局部补丁,会影响首页及博客页脚等读取这些投影的位置;必须传入刚读取的 expectedRevision,写入前确认完整内容,版本冲突时重新读取且不得自动重试覆盖。',
19
+ inputSchema: globalConfigMcpUpdateSchema,
20
+ outputSchema: sitePresentationSnapshotSchema,
21
+ annotations: { readOnlyHint: false, idempotentHint: false, destructiveHint: true },
22
+ access: { scopes: [GLOBAL_CONFIG_MCP_WRITE_SCOPE] },
23
+ execution: { timeoutMs: 10_000, retry: 'never' },
24
+ }, async (input, context) => {
25
+ context.signal.throwIfAborted();
26
+ const snapshot = await operations.updatePresentationFromMcp({
27
+ ...input,
28
+ updatedBy: actorFrom(context.principal),
29
+ });
30
+ await bestEffortUpdateNotice(context.emit, {
31
+ event: 'global-config.site-presentation.updated',
32
+ revision: snapshot.revision,
33
+ updatedBy: snapshot.updatedBy,
34
+ });
35
+ return result(snapshot, `站点展示配置已更新到 revision ${snapshot.revision}`);
36
+ });
37
+ const readProfile = defineMcpTool({
38
+ name: GLOBAL_CONFIG_MCP_READ_PROFILE_TOOL,
39
+ title: '读取站点资料',
40
+ description: '读取当前完整的语义站点资料快照及 revision,包括主体资料、长期关注主题、重点链接和审计信息。此工具只读且不包含页面布局、样式或组件配置;执行资料更新前应先调用它,以最新快照保留未要求变更的字段并取得 expectedRevision。',
41
+ inputSchema: z.strictObject({}),
42
+ outputSchema: siteProfileSnapshotSchema,
43
+ annotations: { readOnlyHint: true, idempotentHint: true, destructiveHint: false },
44
+ access: { scopes: [GLOBAL_CONFIG_MCP_READ_SCOPE] },
45
+ execution: { timeoutMs: 10_000, retry: 'idempotent-failover' },
46
+ }, async (_input, context) => cancellableRead(context.signal, operations.readProfile));
47
+ const updateProfile = defineMcpTool({
48
+ name: GLOBAL_CONFIG_MCP_UPDATE_PROFILE_TOOL,
49
+ title: '修改站点资料',
50
+ description: '使用完整 value 替换主体资料、长期关注主题和重点链接,成功后返回新的完整快照与 revision。该操作不是局部补丁,也不接受 hero、布局、样式或组件字段;必须传入刚读取的 expectedRevision,写入前确认完整内容,版本冲突时重新读取且不得自动重试覆盖。',
51
+ inputSchema: globalConfigMcpProfileUpdateSchema,
52
+ outputSchema: siteProfileSnapshotSchema,
53
+ annotations: { readOnlyHint: false, idempotentHint: false, destructiveHint: true },
54
+ access: { scopes: [GLOBAL_CONFIG_MCP_WRITE_SCOPE] },
55
+ execution: { timeoutMs: 10_000, retry: 'never' },
56
+ }, async (input, context) => {
57
+ context.signal.throwIfAborted();
58
+ const snapshot = await operations.updateProfileFromMcp({
59
+ ...input,
60
+ updatedBy: actorFrom(context.principal),
61
+ });
62
+ await bestEffortUpdateNotice(context.emit, {
63
+ event: 'global-config.site-profile.updated',
64
+ revision: snapshot.revision,
65
+ updatedBy: snapshot.updatedBy,
66
+ });
67
+ return result(snapshot, `站点资料已更新到 revision ${snapshot.revision}`);
68
+ });
69
+ const editPresentation = defineMcpPrompt({
70
+ name: GLOBAL_CONFIG_MCP_EDIT_PROMPT,
71
+ title: '修改站点展示配置',
72
+ description: '读取当前快照,安全修改站点身份、favicon、链接、版权或备案,经确认后提交并验证。',
73
+ argsSchema: globalConfigMcpEditPromptSchema,
74
+ access: { scopes: [GLOBAL_CONFIG_MCP_READ_SCOPE, GLOBAL_CONFIG_MCP_WRITE_SCOPE] },
75
+ }, ({ changeRequest }, context) => {
76
+ context.signal.throwIfAborted();
77
+ return promptResult('安全修改站点展示配置', editPresentationMessage(changeRequest));
78
+ });
79
+ const editProfile = defineMcpPrompt({
80
+ name: GLOBAL_CONFIG_MCP_EDIT_PROFILE_PROMPT,
81
+ title: '修改站点资料',
82
+ description: '读取当前快照,安全修改主体资料、关注主题或重点链接,经确认后提交并验证。',
83
+ argsSchema: globalConfigMcpEditPromptSchema,
84
+ access: { scopes: [GLOBAL_CONFIG_MCP_READ_SCOPE, GLOBAL_CONFIG_MCP_WRITE_SCOPE] },
85
+ }, ({ changeRequest }, context) => {
86
+ context.signal.throwIfAborted();
87
+ return promptResult('安全修改站点资料', editProfileMessage(changeRequest));
88
+ });
89
+ return defineMcpProvider({
90
+ id: GLOBAL_CONFIG_MCP_PROVIDER_ID,
91
+ displayName: '全局配置',
92
+ tools: {
93
+ [GLOBAL_CONFIG_MCP_READ_TOOL]: readPresentation,
94
+ [GLOBAL_CONFIG_MCP_UPDATE_TOOL]: updatePresentation,
95
+ [GLOBAL_CONFIG_MCP_READ_PROFILE_TOOL]: readProfile,
96
+ [GLOBAL_CONFIG_MCP_UPDATE_PROFILE_TOOL]: updateProfile,
97
+ },
98
+ prompts: {
99
+ [GLOBAL_CONFIG_MCP_EDIT_PROMPT]: editPresentation,
100
+ [GLOBAL_CONFIG_MCP_EDIT_PROFILE_PROMPT]: editProfile,
101
+ },
102
+ });
103
+ }
104
+ async function bestEffortUpdateNotice(emit, data) {
105
+ try {
106
+ await emit.log('notice', data);
107
+ }
108
+ catch {
109
+ // Observability must not turn a committed configuration update into a reported failure.
110
+ }
111
+ }
112
+ async function cancellableRead(signal, read) {
113
+ signal.throwIfAborted();
114
+ const snapshot = await read();
115
+ signal.throwIfAborted();
116
+ return result(snapshot);
117
+ }
118
+ function result(snapshot, message) {
119
+ return {
120
+ content: [{ type: 'text', text: message ?? JSON.stringify(snapshot) }],
121
+ structuredContent: snapshot,
122
+ };
123
+ }
124
+ function promptResult(description, text) {
125
+ return {
126
+ description,
127
+ messages: [{ role: 'user', content: { type: 'text', text } }],
128
+ };
129
+ }
130
+ function editPresentationMessage(changeRequest) {
131
+ return `请按以下要求修改站点展示配置:${changeRequest}
132
+ 1. 先调用 global-config.${GLOBAL_CONFIG_MCP_READ_TOOL} 获取当前完整配置和 revision;不得凭旧上下文构造更新。
133
+ 2. 只修改 identity、linkGroups、legal 中用户明确要求的字段,保留所有未提及字段。backgroundVideoUrl、logoUrl、faviconUrl 只能是站内绝对路径或 HTTP/HTTPS URL;backgroundVideoUrl 设为 null 表示关闭动态背景。legal 会同步投影到首页和博客页脚;registrations 必须使用 id、kind、number、可选 verificationUrl/iconUrl 的结构。
134
+ 3. 修改备案信息时,number、kind 和 verificationUrl 必须来自用户提供或已核验的权威来源;缺失的事实不得推断、猜测或编造。
135
+ 4. 不得加入密钥、令牌、任意 HTML、脚本或未经核验的法律登记信息。
136
+ 5. 向用户展示字段级变更摘要和即将提交的完整配置,并在写入前取得明确确认。
137
+ 6. 确认后调用 global-config.${GLOBAL_CONFIG_MCP_UPDATE_TOOL},传入完整 value 和刚读取到的 expectedRevision。
138
+ 7. 若版本冲突,重新读取最新快照,只重新应用原始变更要求并再次确认;不得覆盖并发修改。
139
+ 8. 更新成功后再次调用 global-config.${GLOBAL_CONFIG_MCP_READ_TOOL},核对 revision 和目标字段,再报告结果。`;
140
+ }
141
+ function editProfileMessage(changeRequest) {
142
+ return `请按以下要求修改站点资料:${changeRequest}
143
+ 1. 先调用 global-config.${GLOBAL_CONFIG_MCP_READ_PROFILE_TOOL} 获取当前完整配置和 revision;不得凭旧上下文构造更新。
144
+ 2. 只修改用户明确要求的 profile、topics、featuredLinks,保留所有未提及字段。profile 表达主体资料,topics 表达长期关注主题,featuredLinks 表达重点目的地;不得加入 hero、orbit、card、布局、样式或组件配置。
145
+ 3. 不得加入密钥、令牌、任意 HTML、脚本或未经用户提供的个人资料。
146
+ 4. 向用户展示字段级变更摘要和即将提交的完整配置,并在写入前取得明确确认。
147
+ 5. 确认后调用 global-config.${GLOBAL_CONFIG_MCP_UPDATE_PROFILE_TOOL},传入完整 value 和刚读取到的 expectedRevision。
148
+ 6. 若版本冲突,重新读取最新快照,只重新应用原始变更要求并再次确认;不得覆盖并发修改。
149
+ 7. 更新成功后再次调用 global-config.${GLOBAL_CONFIG_MCP_READ_PROFILE_TOOL},核对 revision 和目标字段,再报告结果。`;
150
+ }
151
+ function actorFrom(principal) {
152
+ if (!principal)
153
+ throw new Error('Verified MCP principal is required');
154
+ const identity = principal.clientId ?? principal.subject;
155
+ const actor = `mcp:${identity}`;
156
+ if (actor.length > 256)
157
+ throw new Error('MCP principal identity is too long');
158
+ return actor;
159
+ }
160
+ //# sourceMappingURL=global-config-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-config-provider.js","sourceRoot":"","sources":["../../src/mcp/global-config-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { DatabaseMigration } from '@zlooks.cn/database-command';
2
+ export declare const globalConfigMigrations: readonly DatabaseMigration[];
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,eAAO,MAAM,sBAAsB,EAAE,SAAS,iBAAiB,EAAO,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const globalConfigMigrations = [];
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,sBAAsB,GAAiC,EAAE,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { SiteProfile, SitePresentation } from '@zlooks.cn/global-config-shared';
2
+ import { EntitySchema } from 'typeorm';
3
+ export interface SitePresentationRow {
4
+ id: 'site.presentation';
5
+ schemaVersion: number;
6
+ revision: number;
7
+ value: SitePresentation | unknown;
8
+ updatedAt: Date;
9
+ updatedBy: string;
10
+ }
11
+ export declare const SitePresentationEntity: EntitySchema<SitePresentationRow>;
12
+ export interface SiteProfileRow {
13
+ id: 'site.profile';
14
+ schemaVersion: 1;
15
+ revision: number;
16
+ value: SiteProfile;
17
+ updatedAt: Date;
18
+ updatedBy: string;
19
+ }
20
+ export declare const SiteProfileEntity: EntitySchema<SiteProfileRow>;
21
+ //# sourceMappingURL=entities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entities.d.ts","sourceRoot":"","sources":["../../src/persistence/entities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,mBAAmB,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC;IAClC,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,sBAAsB,mCAWjC,CAAC;AAEH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,cAAc,CAAC;IACnB,aAAa,EAAE,CAAC,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,iBAAiB,8BAW5B,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { EntitySchema } from 'typeorm';
2
+ export const SitePresentationEntity = new EntitySchema({
3
+ name: 'SitePresentation',
4
+ tableName: 'global_config_site_presentation',
5
+ columns: {
6
+ id: { type: 'varchar', length: 64, primary: true },
7
+ schemaVersion: { name: 'schema_version', type: 'integer' },
8
+ revision: { type: 'integer' },
9
+ value: { type: 'jsonb' },
10
+ updatedAt: { name: 'updated_at', type: 'timestamptz' },
11
+ updatedBy: { name: 'updated_by', type: 'varchar', length: 256 },
12
+ },
13
+ });
14
+ export const SiteProfileEntity = new EntitySchema({
15
+ name: 'SiteProfile',
16
+ tableName: 'global_config_site_profile',
17
+ columns: {
18
+ id: { type: 'varchar', length: 64, primary: true },
19
+ schemaVersion: { name: 'schema_version', type: 'integer' },
20
+ revision: { type: 'integer' },
21
+ value: { type: 'jsonb' },
22
+ updatedAt: { name: 'updated_at', type: 'timestamptz' },
23
+ updatedBy: { name: 'updated_by', type: 'varchar', length: 256 },
24
+ },
25
+ });
26
+ //# sourceMappingURL=entities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entities.js","sourceRoot":"","sources":["../../src/persistence/entities.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAWvC,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,YAAY,CAAsB;IAC1E,IAAI,EAAE,kBAAkB;IACxB,SAAS,EAAE,iCAAiC;IAC5C,OAAO,EAAE;QACP,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QAClD,aAAa,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,EAAE;QAC1D,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QAC7B,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;QACxB,SAAS,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE;QACtD,SAAS,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE;KAChE;CACF,CAAC,CAAC;AAWH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,YAAY,CAAiB;IAChE,IAAI,EAAE,aAAa;IACnB,SAAS,EAAE,4BAA4B;IACvC,OAAO,EAAE;QACP,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QAClD,aAAa,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,EAAE;QAC1D,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QAC7B,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;QACxB,SAAS,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE;QACtD,SAAS,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE;KAChE;CACF,CAAC,CAAC"}