@cat-factory/contracts 0.154.2 → 0.156.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.
- package/dist/agent-presentation.d.ts +2 -2
- package/dist/agent-presentation.d.ts.map +1 -1
- package/dist/agent-presentation.js +3 -11
- package/dist/agent-presentation.js.map +1 -1
- package/dist/entities.d.ts +2 -1
- package/dist/entities.d.ts.map +1 -1
- package/dist/environments.d.ts +65 -2
- package/dist/environments.d.ts.map +1 -1
- package/dist/environments.js +49 -2
- package/dist/environments.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/initiative.d.ts +10 -5
- package/dist/initiative.d.ts.map +1 -1
- package/dist/primitives.d.ts +41 -2
- package/dist/primitives.d.ts.map +1 -1
- package/dist/primitives.js +58 -13
- package/dist/primitives.js.map +1 -1
- package/dist/public-api.d.ts +3 -3
- package/dist/requests.d.ts +2 -1
- package/dist/requests.d.ts.map +1 -1
- package/dist/result-views.d.ts +5 -5
- package/dist/result-views.d.ts.map +1 -1
- package/dist/result-views.js +8 -7
- package/dist/result-views.js.map +1 -1
- package/dist/routes/board.d.ts +26 -13
- package/dist/routes/board.d.ts.map +1 -1
- package/dist/routes/environments.d.ts +11 -0
- package/dist/routes/environments.d.ts.map +1 -1
- package/dist/routes/execution.d.ts +4 -2
- package/dist/routes/execution.d.ts.map +1 -1
- package/dist/routes/initiative.d.ts +34 -17
- package/dist/routes/initiative.d.ts.map +1 -1
- package/dist/routes/public-api.d.ts +8 -8
- package/dist/routes/tasks.d.ts +6 -3
- package/dist/routes/tasks.d.ts.map +1 -1
- package/dist/routes/workspace-settings.d.ts +3 -3
- package/dist/routes/workspaces.d.ts +64 -10
- package/dist/routes/workspaces.d.ts.map +1 -1
- package/dist/snapshot.d.ts +40 -5
- package/dist/snapshot.d.ts.map +1 -1
- package/dist/snapshot.js +10 -0
- package/dist/snapshot.js.map +1 -1
- package/dist/task-types.d.ts +103 -0
- package/dist/task-types.d.ts.map +1 -0
- package/dist/task-types.js +82 -0
- package/dist/task-types.js.map +1 -0
- package/dist/workspace-settings.d.ts +3 -3
- package/dist/workspace-settings.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import * as v from 'valibot';
|
|
2
|
+
import { namespacedIdSchema } from './primitives.js';
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// The wire projection of a CUSTOM (deployment-registered) task type — the frontend analogue
|
|
5
|
+
// of `customAgentKindSchema` (`agent-presentation.ts`). A deployment registers a task type on
|
|
6
|
+
// its app-owned `TaskTypeRegistry`; the server serialises each registration's presentation +
|
|
7
|
+
// create-form fields into the workspace snapshot (`customTaskTypes`), and the SPA merges them
|
|
8
|
+
// into one task-type catalog so a proprietary work item (an "incident", "pentest",
|
|
9
|
+
// "compliance-audit") becomes a first-class create-task choice + card badge instead of the
|
|
10
|
+
// generic fallback — symmetric with agent kinds.
|
|
11
|
+
//
|
|
12
|
+
// The task type id itself widens `taskTypeSchema` (`primitives.ts`) from a closed picklist to
|
|
13
|
+
// `picklist ∪ namespaced`, exactly the shape `presentation.resultView` uses. An UNREGISTERED
|
|
14
|
+
// namespaced type (stale data after an extension was removed) degrades to the `feature`
|
|
15
|
+
// presentation on the frontend, so a leftover string never breaks a card.
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
/** Card-badge + create-form presentation for a custom task type (mirrors `agentPresentationSchema`). */
|
|
18
|
+
export const taskTypePresentationSchema = v.object({
|
|
19
|
+
/** Human label, e.g. `Incident`. */
|
|
20
|
+
label: v.pipe(v.string(), v.trim(), v.minLength(1), v.maxLength(80)),
|
|
21
|
+
/** Icon id (e.g. an `i-lucide-*` name). */
|
|
22
|
+
icon: v.pipe(v.string(), v.minLength(1), v.maxLength(120)),
|
|
23
|
+
/** Accent colour (CSS hex/keyword). */
|
|
24
|
+
color: v.pipe(v.string(), v.minLength(1), v.maxLength(40)),
|
|
25
|
+
/** One-line description shown in the create-task type picker. */
|
|
26
|
+
description: v.pipe(v.string(), v.trim(), v.minLength(1), v.maxLength(500)),
|
|
27
|
+
});
|
|
28
|
+
/** One choice of a `select` {@link taskTypeFieldDescriptorSchema}. */
|
|
29
|
+
export const taskTypeFieldOptionSchema = v.object({
|
|
30
|
+
value: v.pipe(v.string(), v.minLength(1), v.maxLength(120)),
|
|
31
|
+
label: v.pipe(v.string(), v.minLength(1), v.maxLength(120)),
|
|
32
|
+
});
|
|
33
|
+
/**
|
|
34
|
+
* One data-driven field on a custom task type's create-form — the descriptor-driven form
|
|
35
|
+
* vocabulary (the `credentialFieldSchema` / `agentConfigDescriptorSchema` shape generalized):
|
|
36
|
+
* a label + input kind + options. Its value lands in the sparse `taskTypeFields.custom` bag
|
|
37
|
+
* keyed by {@link key}, so adding a field never needs a schema migration.
|
|
38
|
+
*/
|
|
39
|
+
export const taskTypeFieldDescriptorSchema = v.object({
|
|
40
|
+
/** Stable key the collected value is stored under in `taskTypeFields.custom`. */
|
|
41
|
+
key: v.pipe(v.string(), v.minLength(1), v.maxLength(80)),
|
|
42
|
+
/** Human label shown next to the field. */
|
|
43
|
+
label: v.pipe(v.string(), v.minLength(1), v.maxLength(120)),
|
|
44
|
+
/** The control type: free text, multi-line text, a number, or one of {@link options}. */
|
|
45
|
+
type: v.picklist(['text', 'textarea', 'number', 'select']),
|
|
46
|
+
/** One-line helper text shown under the field. */
|
|
47
|
+
help: v.optional(v.pipe(v.string(), v.maxLength(300))),
|
|
48
|
+
/** Placeholder shown in an empty `text`/`textarea`/`number` input. */
|
|
49
|
+
placeholder: v.optional(v.pipe(v.string(), v.maxLength(200))),
|
|
50
|
+
/** The choices for a `select` descriptor; absent (and ignored) for the other types. */
|
|
51
|
+
options: v.optional(v.array(taskTypeFieldOptionSchema)),
|
|
52
|
+
/** Whether the field must be filled before the task can be created. */
|
|
53
|
+
required: v.optional(v.boolean()),
|
|
54
|
+
/** Max length for a `text`/`textarea` value (characters). */
|
|
55
|
+
maxLength: v.optional(v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(10000))),
|
|
56
|
+
});
|
|
57
|
+
/**
|
|
58
|
+
* A registered custom task type's wire projection — the snapshot entry the SPA merges into its
|
|
59
|
+
* task-type catalog. Its `taskType` is ALWAYS namespaced ({@link namespacedIdSchema}); a
|
|
60
|
+
* built-in type is never delivered this way.
|
|
61
|
+
*/
|
|
62
|
+
export const customTaskTypeSchema = v.object({
|
|
63
|
+
/** The namespaced task type id (`<ns>:<name>`, e.g. `acme:incident`). */
|
|
64
|
+
taskType: namespacedIdSchema,
|
|
65
|
+
/** Card badge + create-form presentation. */
|
|
66
|
+
presentation: taskTypePresentationSchema,
|
|
67
|
+
/** Data-driven create-form fields (optional; none ⇒ title + description only). */
|
|
68
|
+
fields: v.optional(v.array(taskTypeFieldDescriptorSchema)),
|
|
69
|
+
/**
|
|
70
|
+
* The pipeline a task of this type defaults to when the creator pins none — pairs with a
|
|
71
|
+
* pipeline the deployment also registered (validated at boot). Absent ⇒ the workspace's
|
|
72
|
+
* positional default, exactly like an unmapped built-in type.
|
|
73
|
+
*/
|
|
74
|
+
defaultPipelineId: v.optional(v.string()),
|
|
75
|
+
/**
|
|
76
|
+
* Optional id of a bespoke create-form section component (`<ns>:<name>`) the deployment
|
|
77
|
+
* contributes to the frontend `taskTypeFormPanels` slot, shown INSTEAD of the descriptor
|
|
78
|
+
* `fields` above. Unpaired ⇒ the descriptor fields render (degrade, never crash).
|
|
79
|
+
*/
|
|
80
|
+
formPanel: v.optional(namespacedIdSchema),
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=task-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-types.js","sourceRoot":"","sources":["../src/task-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAEpD,8EAA8E;AAC9E,4FAA4F;AAC5F,8FAA8F;AAC9F,6FAA6F;AAC7F,8FAA8F;AAC9F,mFAAmF;AACnF,2FAA2F;AAC3F,iDAAiD;AACjD,EAAE;AACF,8FAA8F;AAC9F,6FAA6F;AAC7F,wFAAwF;AACxF,0EAA0E;AAC1E,8EAA8E;AAE9E,wGAAwG;AACxG,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,oCAAoC;IACpC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACpE,2CAA2C;IAC3C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC1D,uCAAuC;IACvC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC1D,iEAAiE;IACjE,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;CAC5E,CAAC,CAAA;AAGF,sEAAsE;AACtE,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC3D,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;CAC5D,CAAC,CAAA;AAGF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAAC;IACpD,iFAAiF;IACjF,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACxD,2CAA2C;IAC3C,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC3D,yFAAyF;IACzF,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC1D,kDAAkD;IAClD,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACtD,sEAAsE;IACtE,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,uFAAuF;IACvF,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACvD,uEAAuE;IACvE,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACjC,6DAA6D;IAC7D,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;CACzF,CAAC,CAAA;AAGF;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,yEAAyE;IACzE,QAAQ,EAAE,kBAAkB;IAC5B,6CAA6C;IAC7C,YAAY,EAAE,0BAA0B;IACxC,kFAAkF;IAClF,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC1D;;;;OAIG;IACH,iBAAiB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACzC;;;;OAIG;IACH,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;CAC1C,CAAC,CAAA"}
|
|
@@ -8,7 +8,7 @@ import * as v from 'valibot';
|
|
|
8
8
|
export declare const taskLimitModeSchema: v.PicklistSchema<["off", "shared", "per_type"], undefined>;
|
|
9
9
|
export type TaskLimitMode = v.InferOutput<typeof taskLimitModeSchema>;
|
|
10
10
|
/** Per-task-type running-task caps (used when {@link taskLimitModeSchema} is `per_type`). */
|
|
11
|
-
export declare const taskLimitPerTypeSchema: v.RecordSchema<v.PicklistSchema<["feature", "bug", "document", "spike", "review", "ralph"], undefined>, v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 1000, undefined>]>, undefined>;
|
|
11
|
+
export declare const taskLimitPerTypeSchema: v.RecordSchema<v.UnionSchema<[v.PicklistSchema<readonly ["feature", "bug", "document", "spike", "review", "ralph"], undefined>, v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "Consumer id must be <namespace>:<name> (lowercase a-z0-9, dash-separated)">]>], undefined>, v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 1000, undefined>]>, undefined>;
|
|
12
12
|
export type TaskLimitPerType = v.InferOutput<typeof taskLimitPerTypeSchema>;
|
|
13
13
|
/** A workspace's runtime settings. */
|
|
14
14
|
export declare const workspaceSettingsSchema: v.ObjectSchema<{
|
|
@@ -22,7 +22,7 @@ export declare const workspaceSettingsSchema: v.ObjectSchema<{
|
|
|
22
22
|
/** The shared cap, when {@link taskLimitMode} is `shared`. Null otherwise. */
|
|
23
23
|
readonly taskLimitShared: v.NullableSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 1000, undefined>]>, undefined>;
|
|
24
24
|
/** The per-type caps, when {@link taskLimitMode} is `per_type`. Null otherwise. */
|
|
25
|
-
readonly taskLimitPerType: v.NullableSchema<v.RecordSchema<v.PicklistSchema<["feature", "bug", "document", "spike", "review", "ralph"], undefined>, v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 1000, undefined>]>, undefined>, undefined>;
|
|
25
|
+
readonly taskLimitPerType: v.NullableSchema<v.RecordSchema<v.UnionSchema<[v.PicklistSchema<readonly ["feature", "bug", "document", "spike", "review", "ralph"], undefined>, v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "Consumer id must be <namespace>:<name> (lowercase a-z0-9, dash-separated)">]>], undefined>, v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 1000, undefined>]>, undefined>, undefined>;
|
|
26
26
|
/**
|
|
27
27
|
* Whether to store the complete context provided to each container agent (the
|
|
28
28
|
* fully composed system + user prompts, the best-practice fragment bodies folded
|
|
@@ -73,7 +73,7 @@ export declare const updateWorkspaceSettingsSchema: v.ObjectSchema<{
|
|
|
73
73
|
readonly waitingEscalationMinutes: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 100000, undefined>]>, undefined>;
|
|
74
74
|
readonly taskLimitMode: v.OptionalSchema<v.PicklistSchema<["off", "shared", "per_type"], undefined>, undefined>;
|
|
75
75
|
readonly taskLimitShared: v.OptionalSchema<v.NullableSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 1000, undefined>]>, undefined>, undefined>;
|
|
76
|
-
readonly taskLimitPerType: v.OptionalSchema<v.NullableSchema<v.RecordSchema<v.PicklistSchema<["feature", "bug", "document", "spike", "review", "ralph"], undefined>, v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 1000, undefined>]>, undefined>, undefined>, undefined>;
|
|
76
|
+
readonly taskLimitPerType: v.OptionalSchema<v.NullableSchema<v.RecordSchema<v.UnionSchema<[v.PicklistSchema<readonly ["feature", "bug", "document", "spike", "review", "ralph"], undefined>, v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "Consumer id must be <namespace>:<name> (lowercase a-z0-9, dash-separated)">]>], undefined>, v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 1000, undefined>]>, undefined>, undefined>, undefined>;
|
|
77
77
|
readonly storeAgentContext: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
|
|
78
78
|
readonly artifactRetentionDays: v.OptionalSchema<v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 1, undefined>, v.MaxValueAction<number, 3650, undefined>]>, undefined>;
|
|
79
79
|
readonly kaizenEnabled: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-settings.d.ts","sourceRoot":"","sources":["../src/workspace-settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAW5B;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,4DAA4C,CAAA;AAC5E,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAIrE,6FAA6F;AAC7F,eAAO,MAAM,sBAAsB,
|
|
1
|
+
{"version":3,"file":"workspace-settings.d.ts","sourceRoot":"","sources":["../src/workspace-settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAW5B;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,4DAA4C,CAAA;AAC5E,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAIrE,6FAA6F;AAC7F,eAAO,MAAM,sBAAsB,oeAA8C,CAAA;AACjF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAoB3E,sCAAsC;AACtC,eAAO,MAAM,uBAAuB;IAClC;;;OAGG;;IAEH,kEAAkE;;IAElE,8EAA8E;;IAE9E,mFAAmF;;IAEnF;;;;;;;OAOG;;IAEH;;;;OAIG;;IAEH;;;;OAIG;;IAEH;;;;;;OAMG;;IAEH,6EAA6E;;IAE7E;;;;;;;;;;OAUG;;aAEH,CAAA;AACF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAE7E,mFAAmF;AACnF,eAAO,MAAM,6BAA6B;;;;;;;;;;;aAexC,CAAA;AACF,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,6BAA6B,CAAC,CAAA"}
|