@metaobjectsdev/sdk 0.5.0-rc.1

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 (118) hide show
  1. package/LICENSE +189 -0
  2. package/README.md +32 -0
  3. package/dist/agent-docs/body.d.ts +2 -0
  4. package/dist/agent-docs/body.d.ts.map +1 -0
  5. package/dist/agent-docs/body.js +563 -0
  6. package/dist/agent-docs/body.js.map +1 -0
  7. package/dist/agent-docs/content-hash.d.ts +8 -0
  8. package/dist/agent-docs/content-hash.d.ts.map +1 -0
  9. package/dist/agent-docs/content-hash.js +23 -0
  10. package/dist/agent-docs/content-hash.js.map +1 -0
  11. package/dist/agent-docs/index.d.ts +3 -0
  12. package/dist/agent-docs/index.d.ts.map +1 -0
  13. package/dist/agent-docs/index.js +4 -0
  14. package/dist/agent-docs/index.js.map +1 -0
  15. package/dist/config.d.ts +113 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/config.js +53 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/forge-types.d.ts +47 -0
  20. package/dist/forge-types.d.ts.map +1 -0
  21. package/dist/forge-types.js +133 -0
  22. package/dist/forge-types.js.map +1 -0
  23. package/dist/index.d.ts +20 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +39 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/memory.d.ts +30 -0
  28. package/dist/memory.d.ts.map +1 -0
  29. package/dist/memory.js +105 -0
  30. package/dist/memory.js.map +1 -0
  31. package/dist/package.d.ts +65 -0
  32. package/dist/package.d.ts.map +1 -0
  33. package/dist/package.js +105 -0
  34. package/dist/package.js.map +1 -0
  35. package/dist/paths.d.ts +5 -0
  36. package/dist/paths.d.ts.map +1 -0
  37. package/dist/paths.js +26 -0
  38. package/dist/paths.js.map +1 -0
  39. package/dist/records/any.d.ts +467 -0
  40. package/dist/records/any.d.ts.map +1 -0
  41. package/dist/records/any.js +14 -0
  42. package/dist/records/any.js.map +1 -0
  43. package/dist/records/convention.d.ts +90 -0
  44. package/dist/records/convention.d.ts.map +1 -0
  45. package/dist/records/convention.js +9 -0
  46. package/dist/records/convention.js.map +1 -0
  47. package/dist/records/core.d.ts +84 -0
  48. package/dist/records/core.d.ts.map +1 -0
  49. package/dist/records/core.js +47 -0
  50. package/dist/records/core.js.map +1 -0
  51. package/dist/records/decision.d.ts +90 -0
  52. package/dist/records/decision.d.ts.map +1 -0
  53. package/dist/records/decision.js +9 -0
  54. package/dist/records/decision.js.map +1 -0
  55. package/dist/records/failure.d.ts +93 -0
  56. package/dist/records/failure.d.ts.map +1 -0
  57. package/dist/records/failure.js +10 -0
  58. package/dist/records/failure.js.map +1 -0
  59. package/dist/records/glossary.d.ts +111 -0
  60. package/dist/records/glossary.d.ts.map +1 -0
  61. package/dist/records/glossary.js +14 -0
  62. package/dist/records/glossary.js.map +1 -0
  63. package/dist/records/principle.d.ts +99 -0
  64. package/dist/records/principle.d.ts.map +1 -0
  65. package/dist/records/principle.js +12 -0
  66. package/dist/records/principle.js.map +1 -0
  67. package/dist/storage/errors.d.ts +14 -0
  68. package/dist/storage/errors.d.ts.map +1 -0
  69. package/dist/storage/errors.js +27 -0
  70. package/dist/storage/errors.js.map +1 -0
  71. package/dist/storage/index.d.ts +7 -0
  72. package/dist/storage/index.d.ts.map +1 -0
  73. package/dist/storage/index.js +6 -0
  74. package/dist/storage/index.js.map +1 -0
  75. package/dist/storage/lifecycle.d.ts +5 -0
  76. package/dist/storage/lifecycle.d.ts.map +1 -0
  77. package/dist/storage/lifecycle.js +27 -0
  78. package/dist/storage/lifecycle.js.map +1 -0
  79. package/dist/storage/list.d.ts +8 -0
  80. package/dist/storage/list.d.ts.map +1 -0
  81. package/dist/storage/list.js +42 -0
  82. package/dist/storage/list.js.map +1 -0
  83. package/dist/storage/read.d.ts +9 -0
  84. package/dist/storage/read.d.ts.map +1 -0
  85. package/dist/storage/read.js +43 -0
  86. package/dist/storage/read.js.map +1 -0
  87. package/dist/storage/write.d.ts +8 -0
  88. package/dist/storage/write.d.ts.map +1 -0
  89. package/dist/storage/write.js +20 -0
  90. package/dist/storage/write.js.map +1 -0
  91. package/dist/workspace.d.ts +49 -0
  92. package/dist/workspace.d.ts.map +1 -0
  93. package/dist/workspace.js +280 -0
  94. package/dist/workspace.js.map +1 -0
  95. package/package.json +48 -0
  96. package/src/agent-docs/body.ts +562 -0
  97. package/src/agent-docs/content-hash.ts +25 -0
  98. package/src/agent-docs/index.ts +8 -0
  99. package/src/config.ts +69 -0
  100. package/src/forge-types.ts +167 -0
  101. package/src/index.ts +98 -0
  102. package/src/memory.ts +116 -0
  103. package/src/package.ts +120 -0
  104. package/src/paths.ts +30 -0
  105. package/src/records/any.ts +15 -0
  106. package/src/records/convention.ts +10 -0
  107. package/src/records/core.ts +55 -0
  108. package/src/records/decision.ts +10 -0
  109. package/src/records/failure.ts +11 -0
  110. package/src/records/glossary.ts +15 -0
  111. package/src/records/principle.ts +13 -0
  112. package/src/storage/errors.ts +23 -0
  113. package/src/storage/index.ts +10 -0
  114. package/src/storage/lifecycle.ts +38 -0
  115. package/src/storage/list.ts +53 -0
  116. package/src/storage/read.ts +54 -0
  117. package/src/storage/write.ts +32 -0
  118. package/src/workspace.ts +342 -0
@@ -0,0 +1,65 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * The package.meta.json schema. Authoring this is the one-time cost of
4
+ * defining a metadata package; subsequent edits should be rare.
5
+ */
6
+ export declare const PackageManifestSchema: z.ZodObject<{
7
+ /**
8
+ * Canonical name of the package in the language's native package manager.
9
+ * Conventionally `@scope/name` (npm-style) for TS, but bare names also
10
+ * work. Each language's package config (pom.xml, .csproj, pyproject.toml)
11
+ * uses its own native field for this — only TS uses `name` here.
12
+ */
13
+ name: z.ZodString;
14
+ /** Semver version of this package. */
15
+ version: z.ZodString;
16
+ /**
17
+ * Optional cross-language canonical ref for this package, used inside
18
+ * metadata files (extends:, super:) and for cross-language consumption.
19
+ * If omitted, derived from `name` via a simple rule: `@scope/name` →
20
+ * `scope::name` (strip @, replace `/` with `::`). Hyphens stay as-is in
21
+ * the auto-derived form — for hierarchical naming users declare this
22
+ * field explicitly.
23
+ *
24
+ * Per v0.3 strategy doc §8.2.
25
+ */
26
+ metaobjectsPackage: z.ZodOptional<z.ZodString>;
27
+ /**
28
+ * Other packages whose metadata trees this package extends. Each entry is
29
+ * a package name; the loader resolves it to the matching peer package.
30
+ * Empty/omitted means this package has no upstream dependencies.
31
+ */
32
+ extends: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
33
+ }, "strip", z.ZodTypeAny, {
34
+ name: string;
35
+ version: string;
36
+ extends: string[];
37
+ metaobjectsPackage?: string | undefined;
38
+ }, {
39
+ name: string;
40
+ version: string;
41
+ metaobjectsPackage?: string | undefined;
42
+ extends?: string[] | undefined;
43
+ }>;
44
+ export type PackageManifest = z.infer<typeof PackageManifestSchema>;
45
+ export declare const PACKAGE_MANIFEST_FILE = "package.meta.json";
46
+ /**
47
+ * Read a package.meta.json from a given .meta/ root, if present.
48
+ * Returns undefined when the file isn't there — packages are optional in
49
+ * v0.3 v0.1 (loadMemory still works for single-package usage without one,
50
+ * and forge init scaffolds one but doesn't enforce its presence).
51
+ */
52
+ export declare function readPackageManifest(metaDir: string): Promise<PackageManifest | undefined>;
53
+ /**
54
+ * Return the canonical metaobjects package ref for a manifest. Uses the
55
+ * explicit `metaobjectsPackage` field if set; otherwise derives from `name`
56
+ * via the simple rule: `@scope/foo-bar` → `scope::foo-bar` (strip @,
57
+ * replace `/` with `::`, leave hyphens). For hierarchical or non-trivial
58
+ * naming users declare `metaobjectsPackage` explicitly.
59
+ *
60
+ * Returns undefined if `name` itself isn't a valid bare name (e.g. has
61
+ * uppercase chars) and no explicit ref is set — the caller should treat
62
+ * this as an authoring error.
63
+ */
64
+ export declare function resolveMetaobjectsPackage(manifest: PackageManifest): string | undefined;
65
+ //# sourceMappingURL=package.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.d.ts","sourceRoot":"","sources":["../src/package.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAsCxB;;;GAGG;AACH,eAAO,MAAM,qBAAqB;IAChC;;;;;OAKG;;IAGH,sCAAsC;;IAGtC;;;;;;;;;OASG;;IAGH;;;;OAIG;;;;;;;;;;;;EAEH,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,qBAAqB,sBAAsB,CAAC;AAEzD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAU/F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,GAAG,SAAS,CAYvF"}
@@ -0,0 +1,105 @@
1
+ import { z } from "zod";
2
+ import { readFile, stat } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ // Per the v0.3 AI-first metadata loading strategy: a package.meta.json is the
5
+ // boundary between metadata bundles. Three fields total — name, version,
6
+ // extends. No exports list; no @private. The package's metadata tree IS its
7
+ // public API. See docs/strategy/2026-05-12-v0.3-ai-first-metadata-loading.md
8
+ // §4.3.
9
+ /**
10
+ * Validates a package version string. npm-compatible: semver basics
11
+ * (major.minor.patch with optional prerelease/build). Not a full semver
12
+ * parser — strict-enough for now.
13
+ */
14
+ const VersionStringSchema = z.string().regex(/^\d+\.\d+\.\d+(-[0-9A-Za-z.-]+)?(\+[0-9A-Za-z.-]+)?$/, "package version must follow semver (e.g. 1.2.0 or 1.2.0-alpha.1)");
15
+ /**
16
+ * Validates a package extends entry. Either a bare package name or
17
+ * a name with a semver range — npm-style. Range parsing is shallow
18
+ * for v0.3 v0.1; full range resolution lands when multi-package
19
+ * loading actually ships.
20
+ */
21
+ const ExtendsEntrySchema = z.string().min(1);
22
+ /**
23
+ * Validates a canonical metaobjects package ref: snake_case segments
24
+ * separated by `::`. Examples: `trainer_website`, `acme::common::user_mgmt`.
25
+ * Used in metadata file refs (extends:, super:) cross-language.
26
+ */
27
+ const MetaobjectsPackageSchema = z.string().regex(/^[a-z][a-z0-9_]*(::[a-z][a-z0-9_]*)*$/, "metaobjectsPackage must be snake_case segments separated by :: (e.g. acme::common::user_mgmt)");
28
+ /**
29
+ * The package.meta.json schema. Authoring this is the one-time cost of
30
+ * defining a metadata package; subsequent edits should be rare.
31
+ */
32
+ export const PackageManifestSchema = z.object({
33
+ /**
34
+ * Canonical name of the package in the language's native package manager.
35
+ * Conventionally `@scope/name` (npm-style) for TS, but bare names also
36
+ * work. Each language's package config (pom.xml, .csproj, pyproject.toml)
37
+ * uses its own native field for this — only TS uses `name` here.
38
+ */
39
+ name: z.string().min(1),
40
+ /** Semver version of this package. */
41
+ version: VersionStringSchema,
42
+ /**
43
+ * Optional cross-language canonical ref for this package, used inside
44
+ * metadata files (extends:, super:) and for cross-language consumption.
45
+ * If omitted, derived from `name` via a simple rule: `@scope/name` →
46
+ * `scope::name` (strip @, replace `/` with `::`). Hyphens stay as-is in
47
+ * the auto-derived form — for hierarchical naming users declare this
48
+ * field explicitly.
49
+ *
50
+ * Per v0.3 strategy doc §8.2.
51
+ */
52
+ metaobjectsPackage: MetaobjectsPackageSchema.optional(),
53
+ /**
54
+ * Other packages whose metadata trees this package extends. Each entry is
55
+ * a package name; the loader resolves it to the matching peer package.
56
+ * Empty/omitted means this package has no upstream dependencies.
57
+ */
58
+ extends: z.array(ExtendsEntrySchema).default([]),
59
+ });
60
+ export const PACKAGE_MANIFEST_FILE = "package.meta.json";
61
+ /**
62
+ * Read a package.meta.json from a given .meta/ root, if present.
63
+ * Returns undefined when the file isn't there — packages are optional in
64
+ * v0.3 v0.1 (loadMemory still works for single-package usage without one,
65
+ * and forge init scaffolds one but doesn't enforce its presence).
66
+ */
67
+ export async function readPackageManifest(metaDir) {
68
+ const path = join(metaDir, PACKAGE_MANIFEST_FILE);
69
+ try {
70
+ const s = await stat(path);
71
+ if (!s.isFile())
72
+ return undefined;
73
+ }
74
+ catch {
75
+ return undefined;
76
+ }
77
+ const raw = await readFile(path, "utf8");
78
+ return PackageManifestSchema.parse(JSON.parse(raw));
79
+ }
80
+ /**
81
+ * Return the canonical metaobjects package ref for a manifest. Uses the
82
+ * explicit `metaobjectsPackage` field if set; otherwise derives from `name`
83
+ * via the simple rule: `@scope/foo-bar` → `scope::foo-bar` (strip @,
84
+ * replace `/` with `::`, leave hyphens). For hierarchical or non-trivial
85
+ * naming users declare `metaobjectsPackage` explicitly.
86
+ *
87
+ * Returns undefined if `name` itself isn't a valid bare name (e.g. has
88
+ * uppercase chars) and no explicit ref is set — the caller should treat
89
+ * this as an authoring error.
90
+ */
91
+ export function resolveMetaobjectsPackage(manifest) {
92
+ if (manifest.metaobjectsPackage !== undefined)
93
+ return manifest.metaobjectsPackage;
94
+ // Auto-derive from name: strip leading @, replace / with ::, lowercase
95
+ // remains untouched — npm names are already lowercase per registry rules.
96
+ const stripped = manifest.name.replace(/^@/, "");
97
+ const derived = stripped.replace(/\//g, "::");
98
+ // Validate that the derived form is a legal canonical ref. If not,
99
+ // return undefined so the caller can surface a clear error.
100
+ if (!/^[a-z][a-z0-9_-]*(::[a-z][a-z0-9_-]*)*$/.test(derived)) {
101
+ return undefined;
102
+ }
103
+ return derived;
104
+ }
105
+ //# sourceMappingURL=package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.js","sourceRoot":"","sources":["../src/package.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,8EAA8E;AAC9E,yEAAyE;AACzE,4EAA4E;AAC5E,6EAA6E;AAC7E,QAAQ;AAER;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAC1C,sDAAsD,EACtD,kEAAkE,CACnE,CAAC;AAEF;;;;;GAKG;AACH,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAE7C;;;;GAIG;AACH,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAC/C,uCAAuC,EACvC,+FAA+F,CAChG,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C;;;;;OAKG;IACH,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAEvB,sCAAsC;IACtC,OAAO,EAAE,mBAAmB;IAE5B;;;;;;;;;OASG;IACH,kBAAkB,EAAE,wBAAwB,CAAC,QAAQ,EAAE;IAEvD;;;;OAIG;IACH,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACjD,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,qBAAqB,GAAG,mBAAmB,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAAe;IACvD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE;YAAE,OAAO,SAAS,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,OAAO,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AACtD,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,yBAAyB,CAAC,QAAyB;IACjE,IAAI,QAAQ,CAAC,kBAAkB,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC,kBAAkB,CAAC;IAClF,uEAAuE;IACvE,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC9C,mEAAmE;IACnE,4DAA4D;IAC5D,IAAI,CAAC,yCAAyC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7D,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function recordPath(metaRoot: string, type: string, id: string, opts?: {
2
+ pending?: boolean;
3
+ }): string;
4
+ export declare function resolveMetaRoot(startDir: string): Promise<string>;
5
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAGA,wBAAgB,UAAU,CACxB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/B,MAAM,CAKR;AAED,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAcvE"}
package/dist/paths.js ADDED
@@ -0,0 +1,26 @@
1
+ import { stat } from "node:fs/promises";
2
+ import { join, dirname, resolve, parse } from "node:path";
3
+ export function recordPath(metaRoot, type, id, opts = {}) {
4
+ const segments = opts.pending
5
+ ? ["memory", "_pending", type, `${id}.json`]
6
+ : ["memory", type, `${id}.json`];
7
+ return join(metaRoot, ...segments);
8
+ }
9
+ export async function resolveMetaRoot(startDir) {
10
+ let current = resolve(startDir);
11
+ const root = parse(current).root;
12
+ while (current !== root) {
13
+ const candidate = join(current, ".meta");
14
+ try {
15
+ const s = await stat(candidate);
16
+ if (s.isDirectory())
17
+ return candidate;
18
+ }
19
+ catch {
20
+ // not present at this level
21
+ }
22
+ current = dirname(current);
23
+ }
24
+ throw new Error(`no .meta directory found walking up from ${startDir}`);
25
+ }
26
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAE1D,MAAM,UAAU,UAAU,CACxB,QAAgB,EAChB,IAAY,EACZ,EAAU,EACV,OAA8B,EAAE;IAEhC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO;QAC3B,CAAC,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC;QAC5C,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACnC,OAAO,IAAI,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB;IACpD,IAAI,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;IACjC,OAAO,OAAO,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC;YAChC,IAAI,CAAC,CAAC,WAAW,EAAE;gBAAE,OAAO,SAAS,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,4BAA4B;QAC9B,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,4CAA4C,QAAQ,EAAE,CAAC,CAAC;AAC1E,CAAC"}