@stigmer/cli 3.19.0 → 3.20.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 (106) hide show
  1. package/commands/apply.d.ts.map +1 -1
  2. package/commands/apply.js +42 -100
  3. package/commands/apply.js.map +1 -1
  4. package/commands/validate.js +3 -4
  5. package/commands/validate.js.map +1 -1
  6. package/local/bootstrap.d.ts +1 -2
  7. package/local/bootstrap.d.ts.map +1 -1
  8. package/local/bootstrap.js +13 -41
  9. package/local/bootstrap.js.map +1 -1
  10. package/local/daemon/launch.d.ts +2 -2
  11. package/local/daemon/launch.d.ts.map +1 -1
  12. package/local/daemon/launch.js +2 -2
  13. package/local/daemon/launch.js.map +1 -1
  14. package/local/plugins/defaults.js +2 -2
  15. package/local/plugins/defaults.js.map +1 -1
  16. package/package.json +7 -7
  17. package/registry/index.d.ts +2 -2
  18. package/registry/index.d.ts.map +1 -1
  19. package/registry/index.js +2 -2
  20. package/registry/index.js.map +1 -1
  21. package/registry/metadata.d.ts +9 -0
  22. package/registry/metadata.d.ts.map +1 -1
  23. package/registry/metadata.js +14 -5
  24. package/registry/metadata.js.map +1 -1
  25. package/registry/registry.d.ts +9 -0
  26. package/registry/registry.d.ts.map +1 -1
  27. package/registry/registry.js +16 -1
  28. package/registry/registry.js.map +1 -1
  29. package/registry/verb-support.d.ts.map +1 -1
  30. package/registry/verb-support.js +0 -13
  31. package/registry/verb-support.js.map +1 -1
  32. package/resources/apply/apply.d.ts +11 -12
  33. package/resources/apply/apply.d.ts.map +1 -1
  34. package/resources/apply/apply.js +12 -21
  35. package/resources/apply/apply.js.map +1 -1
  36. package/resources/apply/handlers.js +2 -2
  37. package/resources/apply/handlers.js.map +1 -1
  38. package/resources/delete.d.ts.map +1 -1
  39. package/resources/delete.js +0 -1
  40. package/resources/delete.js.map +1 -1
  41. package/resources/get-bindings.d.ts.map +1 -1
  42. package/resources/get-bindings.js +0 -5
  43. package/resources/get-bindings.js.map +1 -1
  44. package/resources/list.d.ts.map +1 -1
  45. package/resources/list.js +0 -1
  46. package/resources/list.js.map +1 -1
  47. package/resources/validate.d.ts.map +1 -1
  48. package/resources/validate.js +0 -2
  49. package/resources/validate.js.map +1 -1
  50. package/src/commands/apply.ts +35 -150
  51. package/src/commands/validate.ts +2 -4
  52. package/src/local/bootstrap.test.ts +15 -59
  53. package/src/local/bootstrap.ts +12 -53
  54. package/src/local/daemon/launch.ts +4 -4
  55. package/src/local/plugins/defaults.ts +2 -2
  56. package/src/registry/index.ts +7 -1
  57. package/src/registry/metadata.ts +15 -5
  58. package/src/registry/registry.test.ts +1 -7
  59. package/src/registry/registry.ts +17 -1
  60. package/src/registry/verb-support.ts +0 -13
  61. package/src/resources/apply/apply.integration.test.ts +15 -3
  62. package/src/resources/apply/apply.ts +15 -26
  63. package/src/resources/apply/handlers.ts +2 -2
  64. package/src/resources/delete.ts +0 -1
  65. package/src/resources/get-bindings.ts +0 -5
  66. package/src/resources/list.ts +0 -1
  67. package/src/resources/validate.test.ts +0 -1
  68. package/src/resources/validate.ts +0 -2
  69. package/local/seedpack-retire.d.ts +0 -63
  70. package/local/seedpack-retire.d.ts.map +0 -1
  71. package/local/seedpack-retire.js +0 -361
  72. package/local/seedpack-retire.js.map +0 -1
  73. package/resources/apply/declarative.d.ts +0 -106
  74. package/resources/apply/declarative.d.ts.map +0 -1
  75. package/resources/apply/declarative.js +0 -397
  76. package/resources/apply/declarative.js.map +0 -1
  77. package/resources/apply/synth/project-track.d.ts +0 -21
  78. package/resources/apply/synth/project-track.d.ts.map +0 -1
  79. package/resources/apply/synth/project-track.js +0 -102
  80. package/resources/apply/synth/project-track.js.map +0 -1
  81. package/resources/apply/synth/reader.d.ts +0 -18
  82. package/resources/apply/synth/reader.d.ts.map +0 -1
  83. package/resources/apply/synth/reader.js +0 -55
  84. package/resources/apply/synth/reader.js.map +0 -1
  85. package/resources/apply/synth/runtime.d.ts +0 -8
  86. package/resources/apply/synth/runtime.d.ts.map +0 -1
  87. package/resources/apply/synth/runtime.js +0 -32
  88. package/resources/apply/synth/runtime.js.map +0 -1
  89. package/resources/apply/synth/synthesize.d.ts +0 -43
  90. package/resources/apply/synth/synthesize.d.ts.map +0 -1
  91. package/resources/apply/synth/synthesize.js +0 -115
  92. package/resources/apply/synth/synthesize.js.map +0 -1
  93. package/src/local/seedpack-retire.test.ts +0 -499
  94. package/src/local/seedpack-retire.ts +0 -474
  95. package/src/resources/apply/declarative.integration.test.ts +0 -204
  96. package/src/resources/apply/declarative.test.ts +0 -132
  97. package/src/resources/apply/declarative.ts +0 -491
  98. package/src/resources/apply/synth/capstone.integration.test.ts +0 -134
  99. package/src/resources/apply/synth/project-track.integration.test.ts +0 -194
  100. package/src/resources/apply/synth/project-track.ts +0 -126
  101. package/src/resources/apply/synth/reader.test.ts +0 -90
  102. package/src/resources/apply/synth/reader.ts +0 -68
  103. package/src/resources/apply/synth/runtime.test.ts +0 -29
  104. package/src/resources/apply/synth/runtime.ts +0 -39
  105. package/src/resources/apply/synth/synthesize.test.ts +0 -109
  106. package/src/resources/apply/synth/synthesize.ts +0 -161
@@ -5,8 +5,9 @@
5
5
  // removed in the TypeScript migration — stigmer/stigmer#203.)
6
6
 
7
7
  import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
8
+ import { UsageError } from "../errors/index.js";
8
9
  import { generateAliases, normalizeAlias } from "./aliases.js";
9
- import { CLI_RELEVANT_KINDS, KIND_META } from "./metadata.js";
10
+ import { CLI_RELEVANT_KINDS, KIND_META, RETIRED_KINDS } from "./metadata.js";
10
11
  import { Verb } from "./verbs.js";
11
12
  import { verbsForKind } from "./verb-support.js";
12
13
 
@@ -34,6 +35,21 @@ export function supportsVerb(info: TypeInfo, verb: Verb): boolean {
34
35
  return info.supportedVerbs.has(verb);
35
36
  }
36
37
 
38
+ /**
39
+ * The one refusal for a YAML `kind` the registry does not know, shared by
40
+ * every path that reads a kind from a file (`apply -f`, `validate -f`) so
41
+ * the wording lives in one place. A kind the platform retired gets its own
42
+ * sentence (RETIRED_KINDS): the file is old, not wrong, and the user
43
+ * deserves the reason and the way. `where` names the file for the message.
44
+ */
45
+ export function unknownKindError(yamlKind: string, where: string): UsageError {
46
+ const retired = RETIRED_KINDS.get(yamlKind);
47
+ if (retired !== undefined) {
48
+ return new UsageError(`kind '${yamlKind}' in ${where} ${retired}`);
49
+ }
50
+ return new UsageError(`unknown resource kind '${yamlKind}' in ${where}`);
51
+ }
52
+
37
53
  export interface Registry {
38
54
  /** Look up a type by its proto kind. */
39
55
  getByKind(kind: ApiResourceKind): TypeInfo | undefined;
@@ -66,19 +66,6 @@ export const VERB_SUPPORT: ReadonlyMap<
66
66
  Verb.Delete,
67
67
  ]),
68
68
  ],
69
- // Project apply is the stigmer.yaml declarative/synthesis track, not
70
- // `apply -f project.yaml` — resolveHandlerForKind carries the teaching
71
- // refusal, and the conformance test documents it as a special case.
72
- [
73
- ApiResourceKind.project,
74
- new Set<Verb>([
75
- Verb.Apply,
76
- Verb.Validate,
77
- Verb.Get,
78
- Verb.List,
79
- Verb.Delete,
80
- ]),
81
- ],
82
69
  [ApiResourceKind.api_key, new Set<Verb>([Verb.Get, Verb.List, Verb.Delete])],
83
70
  // agent_execution is special — uses dedicated AgentExecutionQueryController
84
71
  // RPCs, not the unified SearchService. delete maps to cancel.
@@ -268,12 +268,24 @@ describe("file-mode apply — channel app (#353)", () => {
268
268
  });
269
269
  });
270
270
 
271
- describe("file-mode apply — project special case", () => {
272
- it("refuses a Project manifest with a pointer to the stigmer.yaml flow", () => {
271
+ describe("file-mode apply — kinds the registry does not know", () => {
272
+ it("refuses a retired kind with what happened and what to run instead", () => {
273
273
  const dir = mkdtempSync(join(tmpdir(), "apply-it-"));
274
274
  try {
275
275
  writeYaml(dir, "project.yaml", ["kind: Project", "metadata:", " name: Demo", " slug: demo", ""].join("\n"));
276
- expect(() => resolveApplyItems(dir)).toThrow(/stigmer\.yaml/);
276
+ expect(() => resolveApplyItems(dir)).toThrow(
277
+ /kind 'Project' in .*project\.yaml is no longer a Stigmer resource.*stigmer push plugin <dir>/,
278
+ );
279
+ } finally {
280
+ rmSync(dir, { recursive: true, force: true });
281
+ }
282
+ });
283
+
284
+ it("refuses a kind that never existed with the plain unknown-kind sentence", () => {
285
+ const dir = mkdtempSync(join(tmpdir(), "apply-it-"));
286
+ try {
287
+ writeYaml(dir, "thing.yaml", ["kind: Widget", "metadata:", " name: Demo", ""].join("\n"));
288
+ expect(() => resolveApplyItems(dir)).toThrow(/^unknown resource kind 'Widget' in .*thing\.yaml$/);
277
289
  } finally {
278
290
  rmSync(dir, { recursive: true, force: true });
279
291
  }
@@ -18,7 +18,7 @@ import {
18
18
  } from "@stigmer/protos/ai/stigmer/commons/apiresource/metadata_pb";
19
19
  import { UsageError } from "../../errors/index.js";
20
20
  import { CommandResult } from "../../output/index.js";
21
- import { defaultRegistry, Verb } from "../../registry/index.js";
21
+ import { defaultRegistry, unknownKindError, Verb } from "../../registry/index.js";
22
22
  import { loadDocuments, resolveYamlFiles } from "../documents.js";
23
23
  import { decodeWorkflowTaskConfigs } from "../task-configs.js";
24
24
  import { type ApplyHandler, APPLY_HANDLERS, type ControllerFn } from "./handlers.js";
@@ -36,9 +36,9 @@ export interface ApplyOutcome {
36
36
  /** Optional org-mismatch warning to surface on stderr. */
37
37
  readonly warning?: string;
38
38
  /**
39
- * The applied resource message (absent in dry-run). Carries the server's
40
- * authoritative metadata (id/slug) — the reconciler reads this to register
41
- * project membership, so membership matches what the backend stored.
39
+ * The applied resource message (absent in dry-run), as the server stored
40
+ * it: authoritative metadata (id, slug, visibility) for anything that
41
+ * runs after the apply.
42
42
  */
43
43
  readonly applied?: Message;
44
44
  }
@@ -60,22 +60,14 @@ export function resolveApplyItems(path: string): ApplyItem[] {
60
60
 
61
61
  /**
62
62
  * Resolve a YAML `kind` to its apply handler, enforcing the verb-support gate.
63
- * Shared by file mode and declarative mode so the lookup + error wording lives
64
- * in exactly one place. `where` is woven into errors for a precise location.
63
+ * The unknown-kind wording is the registry's (`unknownKindError`), shared
64
+ * with `validate -f`, so a retired kind is refused with the same sentence on
65
+ * both paths. `where` is woven into errors for a precise location.
65
66
  */
66
67
  export function resolveHandlerForKind(kind: string, where: string): ApplyHandler {
67
68
  const info = defaultRegistry().getByYamlKind(kind);
68
- if (info === undefined) throw new UsageError(`unknown resource kind '${kind}' in ${where}`);
69
+ if (info === undefined) throw unknownKindError(kind, where);
69
70
  if (!info.supportedVerbs.has(Verb.Apply)) throw new UsageError(`${info.displayName} does not support 'apply'`);
70
- if (info.kind === ApiResourceKind.project) {
71
- // Project's Apply verb is the stigmer.yaml track, deliberately not a
72
- // manifest handler: a file-mode apply would create a second, member-less
73
- // way to apply a project, bypassing the membership reconciler.
74
- throw new UsageError(
75
- `a Project is not applied from a resource manifest (${where}): ` +
76
- "run `stigmer apply` in the directory containing stigmer.yaml and the project is reconciled from its members",
77
- );
78
- }
79
71
  const handler = APPLY_HANDLERS.get(info.kind);
80
72
  if (handler === undefined) throw new UsageError(`apply not implemented for ${info.displayName}`);
81
73
  return handler;
@@ -109,16 +101,15 @@ export async function applyItem(
109
101
 
110
102
  /**
111
103
  * Strict YAML→proto marshal for one item, with a precise location in the error.
112
- * Split out from {@link applyItem} so the declarative reconciler can marshal
113
- * without immediately applying (it batches messages, then reconciles).
104
+ * Split out from {@link applyItem} so marshalling can be exercised and reused
105
+ * apart from the apply it feeds.
114
106
  */
115
107
  export function marshalItem(item: ApplyItem): Message {
116
108
  try {
117
109
  const message = fromJson(item.handler.schema, item.document, { ignoreUnknownFields: false });
118
110
  // Workflow task_config blocks live inside an open Struct the top-level
119
- // decode cannot see into; decode them per kind so a dry-run (and the
120
- // reconciler's marshal) rejects exactly what a real apply rejects
121
- // (stigmer/stigmer#778).
111
+ // decode cannot see into; decode them per kind so a dry-run rejects
112
+ // exactly what a real apply rejects (stigmer/stigmer#778).
122
113
  if (item.handler.kind === ApiResourceKind.workflow) {
123
114
  decodeWorkflowTaskConfigs(message as Workflow);
124
115
  }
@@ -130,11 +121,9 @@ export function marshalItem(item: ApplyItem): Message {
130
121
 
131
122
  /**
132
123
  * Apply a fully-marshalled resource message: inject org, then dry-run preview or
133
- * drive the controller's `apply` RPC. This is the single apply core shared by
134
- * both tracks — the declarative/file track feeds messages marshalled from YAML
135
- * (`marshalItem`), the synthesis track feeds messages decoded from `.pb`
136
- * (`fromBinary`). One core means one place where org injection, create/update
137
- * detection, and result shaping live (DD-009 §6).
124
+ * drive the controller's `apply` RPC. The single apply core behind file mode,
125
+ * taking the message rather than the YAML so org injection, create/update
126
+ * detection and result shaping live in one place whatever produced the message.
138
127
  */
139
128
  export async function applyMessage(
140
129
  controller: ControllerFn,
@@ -1,6 +1,6 @@
1
- // Apply-handler registry for `apply -f` (file mode) and the synthesis track.
1
+ // Apply-handler registry for `apply -f` (file mode).
2
2
  //
3
- // The declarative manifest kinds come from the SDK's manifest registry
3
+ // The manifest kinds come from the SDK's manifest registry
4
4
  // (`manifestKinds()` in @stigmer/sdk) — the one table binding a kind to its
5
5
  // proto schema, its raw command-controller `apply` RPC, and its dependency
6
6
  // apply order. The CLI consumes that table instead of keeping a copy: the
@@ -82,7 +82,6 @@ export const DELETE_HANDLERS: ReadonlyMap<ApiResourceKind, DeleteFn> = new Map<
82
82
  ApiResourceKind.mcp_server,
83
83
  (c, id, force) => c.mcpServer.delete({ resourceId: id, force }),
84
84
  ],
85
- [ApiResourceKind.project, (c, id) => c.project.delete(id)],
86
85
  [
87
86
  ApiResourceKind.environment,
88
87
  (c, id, force) => c.environment.delete({ resourceId: id, force }),
@@ -17,7 +17,6 @@ import { WorkflowSchema } from "@stigmer/protos/ai/stigmer/agentic/workflow/v1/a
17
17
  import { WorkflowInstanceSchema } from "@stigmer/protos/ai/stigmer/agentic/workflowinstance/v1/api_pb";
18
18
  import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
19
19
  import { ApiKeySchema } from "@stigmer/protos/ai/stigmer/iam/apikey/v1/api_pb";
20
- import { ProjectSchema } from "@stigmer/protos/ai/stigmer/tenancy/project/v1/api_pb";
21
20
  import type { Stigmer } from "@stigmer/sdk";
22
21
  import { UsageError } from "../errors/index.js";
23
22
  import type { ParsedReference } from "./reference.js";
@@ -64,10 +63,6 @@ export const GET_BINDINGS: ReadonlyMap<ApiResourceKind, Getter> = new Map([
64
63
  ApiResourceKind.mcp_server,
65
64
  refGetter(ApiResourceKind.mcp_server, McpServerSchema, (c) => c.mcpServer),
66
65
  ],
67
- [
68
- ApiResourceKind.project,
69
- refGetter(ApiResourceKind.project, ProjectSchema, (c) => c.project),
70
- ],
71
66
  [
72
67
  ApiResourceKind.environment,
73
68
  refGetter(
@@ -55,7 +55,6 @@ export const SEARCH_KINDS: ReadonlySet<ApiResourceKind> =
55
55
  ApiResourceKind.agent,
56
56
  ApiResourceKind.workflow,
57
57
  ApiResourceKind.mcp_server,
58
- ApiResourceKind.project,
59
58
  ApiResourceKind.skill,
60
59
  ApiResourceKind.plugin,
61
60
  ApiResourceKind.environment,
@@ -8,7 +8,6 @@ describe("schemaForValidate", () => {
8
8
  expect(schemaForValidate(ApiResourceKind.agent)).toBeDefined();
9
9
  expect(schemaForValidate(ApiResourceKind.workflow)).toBeDefined();
10
10
  expect(schemaForValidate(ApiResourceKind.mcp_server)).toBeDefined();
11
- expect(schemaForValidate(ApiResourceKind.project)).toBeDefined();
12
11
  });
13
12
 
14
13
  it("returns undefined for non-file-based kinds", () => {
@@ -10,7 +10,6 @@ import { AgentSchema } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb"
10
10
  import { McpServerSchema } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/api_pb";
11
11
  import { type Workflow, WorkflowSchema } from "@stigmer/protos/ai/stigmer/agentic/workflow/v1/api_pb";
12
12
  import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
13
- import { ProjectSchema } from "@stigmer/protos/ai/stigmer/tenancy/project/v1/api_pb";
14
13
  import { decodeWorkflowTaskConfigs } from "./task-configs.js";
15
14
 
16
15
  // Exported for the verb/dispatch conformance suite (registry/registry.test.ts),
@@ -21,7 +20,6 @@ export const VALIDATE_SCHEMAS: ReadonlyMap<ApiResourceKind, DescMessage> = new M
21
20
  [ApiResourceKind.agent, AgentSchema],
22
21
  [ApiResourceKind.workflow, WorkflowSchema],
23
22
  [ApiResourceKind.mcp_server, McpServerSchema],
24
- [ApiResourceKind.project, ProjectSchema],
25
23
  ]);
26
24
 
27
25
  export function schemaForValidate(kind: ApiResourceKind): DescMessage | undefined {
@@ -1,63 +0,0 @@
1
- import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
2
- import { type Stigmer } from "@stigmer/sdk";
3
- /**
4
- * The seedpack Project's slug, as every release before this one wrote it
5
- * (the server derived it from `metadata.name` in the seedpack's manifest).
6
- * Pinned bytes of installs that predate this release.
7
- */
8
- export declare const SEEDPACK_PROJECT_SLUG = "stigmer-seedpack";
9
- /**
10
- * The marker older releases wrote in the data dir to skip an unchanged
11
- * seedpack. Nothing reads it any more; the retire removes it so a data dir
12
- * carries no trace of a mechanism that no longer exists.
13
- */
14
- export declare const SEEDPACK_MARKER_FILE = ".seedpack-bootstrapped";
15
- /** A member of the seedpack Project, addressed the way the Project stored it. */
16
- export interface SeedpackMember {
17
- readonly kind: ApiResourceKind;
18
- readonly org: string;
19
- readonly slug: string;
20
- }
21
- export type MemberOutcome = {
22
- readonly action: "removed";
23
- readonly member: SeedpackMember;
24
- } | {
25
- readonly action: "already-gone";
26
- readonly member: SeedpackMember;
27
- } | {
28
- readonly action: "adopted";
29
- readonly member: SeedpackMember;
30
- /** The plugin that now manages the row: its slug, or its id when the plugin row is gone. */
31
- readonly byPlugin: string;
32
- } | {
33
- readonly action: "kept-referenced";
34
- readonly member: SeedpackMember;
35
- /** The referrers, as "agent 'org/slug'". */
36
- readonly by: readonly string[];
37
- } | {
38
- readonly action: "kept-refused";
39
- readonly member: SeedpackMember;
40
- /** The server's sentence. */
41
- readonly reason: string;
42
- };
43
- export type RetireResult = {
44
- readonly present: false;
45
- } | {
46
- readonly present: true;
47
- readonly outcomes: readonly MemberOutcome[];
48
- /** False when the Project row itself could not be deleted; the reason is reported. */
49
- readonly projectRemoved: boolean;
50
- readonly projectRefusal?: string;
51
- };
52
- export interface RetireOptions {
53
- /** The local data dir holding the marker file. */
54
- readonly markerDir: string;
55
- }
56
- /**
57
- * Retire the seedpack Project the system org may hold. Idempotent: no
58
- * Project, no work beyond one read and a stale marker's removal.
59
- */
60
- export declare function retireSeedpack(stigmer: Stigmer, options: RetireOptions): Promise<RetireResult>;
61
- /** The report `stigmer up` prints, one block on stderr through `say`. */
62
- export declare function renderRetireReport(result: RetireResult, say: (line: string) => void): void;
63
- //# sourceMappingURL=seedpack-retire.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"seedpack-retire.d.ts","sourceRoot":"","sources":["../../src/local/seedpack-retire.ts"],"names":[],"mappings":"AAyCA,OAAO,EAAE,eAAe,EAAE,MAAM,qFAAqF,CAAC;AAEtH,OAAO,EAAE,KAAK,OAAO,EAAc,MAAM,cAAc,CAAC;AAOxD;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,qBAAqB,CAAC;AAExD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,2BAA2B,CAAC;AAY7D,iFAAiF;AACjF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GAC/D;IAAE,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GACpE;IACE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,4FAA4F;IAC5F,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,GACD;IACE,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC,GACD;IACE,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,6BAA6B;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEN,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAA;CAAE,GAC3B;IACE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;IAC5C,sFAAsF;IACtF,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC,CAAC;AAEN,MAAM,WAAW,aAAa;IAC5B,kDAAkD;IAClD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CAmCvB;AAED,yEAAyE;AACzE,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC1B,IAAI,CAwDN"}