skillscript-runtime 0.2.4

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 (132) hide show
  1. package/ARCHITECTURE.md +70 -0
  2. package/LICENSE +21 -0
  3. package/README.md +346 -0
  4. package/dist/audit.d.ts +33 -0
  5. package/dist/audit.d.ts.map +1 -0
  6. package/dist/audit.js +76 -0
  7. package/dist/audit.js.map +1 -0
  8. package/dist/bootstrap.d.ts +69 -0
  9. package/dist/bootstrap.d.ts.map +1 -0
  10. package/dist/bootstrap.js +117 -0
  11. package/dist/bootstrap.js.map +1 -0
  12. package/dist/cli.d.ts +3 -0
  13. package/dist/cli.d.ts.map +1 -0
  14. package/dist/cli.js +805 -0
  15. package/dist/cli.js.map +1 -0
  16. package/dist/compile.d.ts +88 -0
  17. package/dist/compile.d.ts.map +1 -0
  18. package/dist/compile.js +544 -0
  19. package/dist/compile.js.map +1 -0
  20. package/dist/connectors/agent-noop.d.ts +23 -0
  21. package/dist/connectors/agent-noop.d.ts.map +1 -0
  22. package/dist/connectors/agent-noop.js +43 -0
  23. package/dist/connectors/agent-noop.js.map +1 -0
  24. package/dist/connectors/agent.d.ts +54 -0
  25. package/dist/connectors/agent.d.ts.map +1 -0
  26. package/dist/connectors/agent.js +21 -0
  27. package/dist/connectors/agent.js.map +1 -0
  28. package/dist/connectors/index.d.ts +13 -0
  29. package/dist/connectors/index.d.ts.map +1 -0
  30. package/dist/connectors/index.js +17 -0
  31. package/dist/connectors/index.js.map +1 -0
  32. package/dist/connectors/local-model.d.ts +41 -0
  33. package/dist/connectors/local-model.d.ts.map +1 -0
  34. package/dist/connectors/local-model.js +106 -0
  35. package/dist/connectors/local-model.js.map +1 -0
  36. package/dist/connectors/mcp.d.ts +22 -0
  37. package/dist/connectors/mcp.d.ts.map +1 -0
  38. package/dist/connectors/mcp.js +31 -0
  39. package/dist/connectors/mcp.js.map +1 -0
  40. package/dist/connectors/memory-store.d.ts +53 -0
  41. package/dist/connectors/memory-store.d.ts.map +1 -0
  42. package/dist/connectors/memory-store.js +169 -0
  43. package/dist/connectors/memory-store.js.map +1 -0
  44. package/dist/connectors/registry.d.ts +74 -0
  45. package/dist/connectors/registry.d.ts.map +1 -0
  46. package/dist/connectors/registry.js +127 -0
  47. package/dist/connectors/registry.js.map +1 -0
  48. package/dist/connectors/skill-store.d.ts +38 -0
  49. package/dist/connectors/skill-store.d.ts.map +1 -0
  50. package/dist/connectors/skill-store.js +314 -0
  51. package/dist/connectors/skill-store.js.map +1 -0
  52. package/dist/connectors/types.d.ts +188 -0
  53. package/dist/connectors/types.d.ts.map +1 -0
  54. package/dist/connectors/types.js +35 -0
  55. package/dist/connectors/types.js.map +1 -0
  56. package/dist/dashboard/server.d.ts +40 -0
  57. package/dist/dashboard/server.d.ts.map +1 -0
  58. package/dist/dashboard/server.js +122 -0
  59. package/dist/dashboard/server.js.map +1 -0
  60. package/dist/dashboard/spa/app.js +375 -0
  61. package/dist/dashboard/spa/index.html +26 -0
  62. package/dist/dashboard/spa/styles.css +99 -0
  63. package/dist/errors.d.ts +111 -0
  64. package/dist/errors.d.ts.map +1 -0
  65. package/dist/errors.js +187 -0
  66. package/dist/errors.js.map +1 -0
  67. package/dist/filters.d.ts +17 -0
  68. package/dist/filters.d.ts.map +1 -0
  69. package/dist/filters.js +40 -0
  70. package/dist/filters.js.map +1 -0
  71. package/dist/index.d.ts +41 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +33 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/lint.d.ts +97 -0
  76. package/dist/lint.d.ts.map +1 -0
  77. package/dist/lint.js +990 -0
  78. package/dist/lint.js.map +1 -0
  79. package/dist/mcp-server.d.ts +93 -0
  80. package/dist/mcp-server.d.ts.map +1 -0
  81. package/dist/mcp-server.js +505 -0
  82. package/dist/mcp-server.js.map +1 -0
  83. package/dist/metrics.d.ts +51 -0
  84. package/dist/metrics.d.ts.map +1 -0
  85. package/dist/metrics.js +107 -0
  86. package/dist/metrics.js.map +1 -0
  87. package/dist/parser.d.ts +160 -0
  88. package/dist/parser.d.ts.map +1 -0
  89. package/dist/parser.js +991 -0
  90. package/dist/parser.js.map +1 -0
  91. package/dist/provenance.d.ts +43 -0
  92. package/dist/provenance.d.ts.map +1 -0
  93. package/dist/provenance.js +58 -0
  94. package/dist/provenance.js.map +1 -0
  95. package/dist/runtime.d.ts +145 -0
  96. package/dist/runtime.d.ts.map +1 -0
  97. package/dist/runtime.js +1071 -0
  98. package/dist/runtime.js.map +1 -0
  99. package/dist/scheduler.d.ts +121 -0
  100. package/dist/scheduler.d.ts.map +1 -0
  101. package/dist/scheduler.js +271 -0
  102. package/dist/scheduler.js.map +1 -0
  103. package/dist/skill-manager.d.ts +121 -0
  104. package/dist/skill-manager.d.ts.map +1 -0
  105. package/dist/skill-manager.js +251 -0
  106. package/dist/skill-manager.js.map +1 -0
  107. package/dist/testing/conformance.d.ts +57 -0
  108. package/dist/testing/conformance.d.ts.map +1 -0
  109. package/dist/testing/conformance.js +365 -0
  110. package/dist/testing/conformance.js.map +1 -0
  111. package/dist/testing/index.d.ts +3 -0
  112. package/dist/testing/index.d.ts.map +1 -0
  113. package/dist/testing/index.js +5 -0
  114. package/dist/testing/index.js.map +1 -0
  115. package/dist/trace.d.ts +141 -0
  116. package/dist/trace.d.ts.map +1 -0
  117. package/dist/trace.js +226 -0
  118. package/dist/trace.js.map +1 -0
  119. package/examples/README.md +56 -0
  120. package/examples/classify-support-ticket.skill.md +30 -0
  121. package/examples/cut-release-tag.skill.md +40 -0
  122. package/examples/doc-qa-with-citations.skill.md +12 -0
  123. package/examples/feedback-sentiment-scan.skill.md +29 -0
  124. package/examples/hello.skill.md +9 -0
  125. package/examples/hello.skill.provenance.json +10 -0
  126. package/examples/morning-brief.skill.md +24 -0
  127. package/examples/programmatic-trace-demo.mjs +89 -0
  128. package/examples/service-health-watch.skill.md +18 -0
  129. package/package.json +100 -0
  130. package/scaffold/config.toml +35 -0
  131. package/scaffold/connectors.json +19 -0
  132. package/scaffold/examples/hello.skill.md +9 -0
@@ -0,0 +1,251 @@
1
+ // Runtime-layer skill management API. User-facing surface for storing and
2
+ // deleting skills with referential-integrity guarantees that the connector
3
+ // contract intentionally delegates to this layer.
4
+ //
5
+ // `ReferentialIntegrityError` is a runtime-layer error class — NOT a
6
+ // `ConnectorError` subclass. The distinction matters: the executor's
7
+ // `else:` / `# OnError:` machinery catches `ConnectorError`s thrown
8
+ // inside skill execution and routes them through the recovery chain.
9
+ // `ReferentialIntegrityError` is thrown by `deleteSkill()`, which is a
10
+ // user-facing management API — not a skill-execution op — so it surfaces
11
+ // directly to the caller and bypasses recovery routing.
12
+ import { parse } from "./parser.js";
13
+ /**
14
+ * Thrown by `deleteSkill()` when the target skill is referenced by other
15
+ * skills and `opts.force` is not set. Runtime-layer error, distinct from
16
+ * the `ConnectorError` hierarchy in `src/errors.ts`.
17
+ */
18
+ export class ReferentialIntegrityError extends Error {
19
+ skill_name;
20
+ referenced_by;
21
+ constructor(skill_name, referenced_by) {
22
+ super(`Cannot delete skill '${skill_name}' — referenced by: ${referenced_by.join(", ")}. ` +
23
+ `Pass { force: true } to delete anyway.`);
24
+ this.skill_name = skill_name;
25
+ this.referenced_by = referenced_by;
26
+ this.name = "ReferentialIntegrityError";
27
+ }
28
+ }
29
+ /**
30
+ * Runtime reference index. Maps `referencedSkill → set of skills that
31
+ * reference it`. Bidirectional bookkeeping lets storeSkill/delete updates
32
+ * stay O(refs) instead of O(N) scans.
33
+ *
34
+ * **Out-of-band edit tolerance.** If someone edits a `.skill` file directly
35
+ * (bypassing storeSkill), the index goes stale until the runtime restarts
36
+ * or `runtime.invalidateConnector()` triggers a rebuild. Not a correctness
37
+ * issue — the next startup scan re-derives — but operators editing files
38
+ * by hand will see incorrect referential-integrity checks until they
39
+ * either restart or invalidate.
40
+ *
41
+ * The runtime ships an explicit `rebuildIndex()` escape hatch for live
42
+ * recovery without restart.
43
+ */
44
+ export class ReferenceIndex {
45
+ /** `name → skills that reference name` (deleteSkill consumes this). */
46
+ referencedBy = new Map();
47
+ /** `name → skills that name references` (storeSkill bookkeeping). */
48
+ referencing = new Map();
49
+ /** Skills that reference the given target. Empty array if none. */
50
+ referencesTo(name) {
51
+ const set = this.referencedBy.get(name);
52
+ return set ? Array.from(set).sort() : [];
53
+ }
54
+ /** Skills that the given source references. Empty array if none. */
55
+ referencesFrom(name) {
56
+ const set = this.referencing.get(name);
57
+ return set ? Array.from(set).sort() : [];
58
+ }
59
+ /** Update edges for one skill — replaces its outgoing edges. Used after storeSkill. */
60
+ setOutgoing(name, targets) {
61
+ // Drop old outgoing edges from referencedBy.
62
+ const oldTargets = this.referencing.get(name);
63
+ if (oldTargets !== undefined) {
64
+ for (const t of oldTargets) {
65
+ const set = this.referencedBy.get(t);
66
+ if (set !== undefined) {
67
+ set.delete(name);
68
+ if (set.size === 0)
69
+ this.referencedBy.delete(t);
70
+ }
71
+ }
72
+ }
73
+ if (targets.length === 0) {
74
+ this.referencing.delete(name);
75
+ }
76
+ else {
77
+ this.referencing.set(name, new Set(targets));
78
+ for (const t of targets) {
79
+ let set = this.referencedBy.get(t);
80
+ if (set === undefined) {
81
+ set = new Set();
82
+ this.referencedBy.set(t, set);
83
+ }
84
+ set.add(name);
85
+ }
86
+ }
87
+ }
88
+ /** Drop all edges originating from `name`. Used after deleteSkill. */
89
+ drop(name) {
90
+ this.setOutgoing(name, []);
91
+ }
92
+ /** Total edge count — for tests + diagnostics. */
93
+ size() {
94
+ let n = 0;
95
+ for (const set of this.referencing.values())
96
+ n += set.size;
97
+ return n;
98
+ }
99
+ /**
100
+ * Replace this index's edges with another's. Used by
101
+ * `invalidateConnector()` when rebuilding from disk — the caller passes
102
+ * the long-lived index, we rebuild a fresh one off the store, then
103
+ * atomically swap the edges.
104
+ */
105
+ replaceAll(other) {
106
+ this.referencedBy.clear();
107
+ this.referencing.clear();
108
+ for (const [name, targets] of other.referencing) {
109
+ this.setOutgoing(name, Array.from(targets));
110
+ }
111
+ }
112
+ }
113
+ /**
114
+ * Walk a skill's parsed AST and extract names of skills it references via
115
+ * the `&` op. Returns a deduplicated, sorted list. Includes references to
116
+ * both data-skills (which inline at compile time) and procedural skills
117
+ * (which compile to runtime invocations) — the integrity check should fire
118
+ * for either, since deleting any referenced skill breaks the source.
119
+ *
120
+ * Walks foreach + if bodies recursively. T3+ grammar; T1 returns empty.
121
+ */
122
+ export function extractReferences(source) {
123
+ const parsed = parse(source);
124
+ const refs = new Set();
125
+ for (const target of parsed.targets.values()) {
126
+ collectAmpRefs(target.ops, refs);
127
+ if (target.elseBlock !== undefined)
128
+ collectAmpRefs(target.elseBlock, refs);
129
+ }
130
+ return Array.from(refs).sort();
131
+ }
132
+ function collectAmpRefs(ops, out) {
133
+ for (const op of ops) {
134
+ if (op.kind === "&" && op.ampParams !== undefined) {
135
+ out.add(op.ampParams.skillName);
136
+ }
137
+ if (op.foreachBody !== undefined)
138
+ collectAmpRefs(op.foreachBody, out);
139
+ if (op.ifBranches !== undefined) {
140
+ for (const branch of op.ifBranches)
141
+ collectAmpRefs(branch.body, out);
142
+ }
143
+ if (op.ifElseBody !== undefined)
144
+ collectAmpRefs(op.ifElseBody, out);
145
+ }
146
+ }
147
+ /**
148
+ * Build a fresh reference index from a SkillStore by scanning every skill.
149
+ * Called once at runtime startup; subsequent storeSkill/deleteSkill calls
150
+ * maintain incrementally.
151
+ */
152
+ export async function buildReferenceIndex(store) {
153
+ const index = new ReferenceIndex();
154
+ const metas = await store.query();
155
+ for (const meta of metas) {
156
+ try {
157
+ const source = await store.load(meta.name);
158
+ const refs = extractReferences(source.source);
159
+ if (refs.length > 0)
160
+ index.setOutgoing(meta.name, refs);
161
+ }
162
+ catch {
163
+ // Skip unreadable entries; query returned them but load failed.
164
+ }
165
+ }
166
+ return index;
167
+ }
168
+ /**
169
+ * Store (create or update) a skill, then update the reference index for
170
+ * its outgoing edges. Returns the substrate's `VersionInfo`.
171
+ */
172
+ export async function storeSkill(name, source, options) {
173
+ const store = options.registry.getSkillStore(options.storeName);
174
+ const info = await store.store(name, source, options.metadata);
175
+ options.index.setOutgoing(name, extractReferences(source));
176
+ return info;
177
+ }
178
+ /**
179
+ * Delete a skill. Default behavior: index lookup; if any skill references
180
+ * the target, throw `ReferentialIntegrityError`. With `opts.force`, skip
181
+ * the check and dispatch directly to the substrate (which may still
182
+ * refuse for its own reasons, e.g., a signed-artifact store).
183
+ */
184
+ export async function deleteSkill(name, options) {
185
+ if (options.force !== true) {
186
+ const referencedBy = options.index.referencesTo(name);
187
+ if (referencedBy.length > 0) {
188
+ throw new ReferentialIntegrityError(name, referencedBy);
189
+ }
190
+ }
191
+ const store = options.registry.getSkillStore(options.storeName);
192
+ await store.delete(name);
193
+ options.index.drop(name);
194
+ }
195
+ /**
196
+ * Invalidate a connector's cached state. **"Refresh everything dependent
197
+ * on this connector."** Type-aware behavior:
198
+ *
199
+ * - Any connector kind: calls `instance.invalidateManifest()` if defined.
200
+ * Triggers a refresh on the next `manifest()` call.
201
+ * - SkillStore (when an `index` is passed in `options`): also rebuilds
202
+ * the reference index by re-scanning the store. The recovery path for
203
+ * stale reference state after operators edit `.skill` files directly
204
+ * without going through `storeSkill()`.
205
+ *
206
+ * Used in dev/hot-reload loops and after operators change connector state
207
+ * out-of-band (new Ollama model loaded, new MCP server wired, manual
208
+ * .skill file edit).
209
+ *
210
+ * Convention reminder: connectors bump their internal `capabilities_version`
211
+ * on schema/structural changes, NOT on every query. This invalidate hook
212
+ * is the explicit escape valve for cases where the version-bump didn't
213
+ * fire (e.g., live model installation that the connector didn't observe,
214
+ * or out-of-band .skill file edits the runtime didn't mediate).
215
+ *
216
+ * Returns `Promise<void>` because the SkillStore reference-index rebuild
217
+ * is async. Non-SkillStore invalidations complete synchronously but the
218
+ * surface is uniform.
219
+ */
220
+ export async function invalidateConnector(name, registry, options = {}) {
221
+ let matchedSkillStore = null;
222
+ for (const lookup of [
223
+ () => registry.hasLocalModel(name) ? registry.getLocalModel(name) : null,
224
+ () => registry.hasMemoryStore(name) ? registry.getMemoryStore(name) : null,
225
+ () => registry.hasSkillStore(name) ? registry.getSkillStore(name) : null,
226
+ () => registry.hasMcpConnector(name) ? registry.getMcpConnector(name) : null,
227
+ ]) {
228
+ const instance = lookup();
229
+ if (instance === null)
230
+ continue;
231
+ const maybe = instance;
232
+ if (typeof maybe.invalidateManifest === "function") {
233
+ maybe.invalidateManifest();
234
+ }
235
+ }
236
+ // Reference-index rebuild for SkillStore invalidations. Out-of-band
237
+ // .skill file edits (vim, direct disk writes) leave the in-memory
238
+ // reference index stale — incremental updates only fire through
239
+ // storeSkill(). A SkillStore invalidate is the explicit recovery.
240
+ if (registry.hasSkillStore(name)) {
241
+ matchedSkillStore = registry.getSkillStore(name);
242
+ if (options.index !== undefined) {
243
+ const fresh = await buildReferenceIndex(matchedSkillStore);
244
+ // Replace this index's edges with the rebuilt set. We do it by
245
+ // walking known edges + clearing them, then applying the fresh
246
+ // edges — cheaper than mutating private state from outside.
247
+ options.index.replaceAll(fresh);
248
+ }
249
+ }
250
+ }
251
+ //# sourceMappingURL=skill-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-manager.js","sourceRoot":"","sources":["../src/skill-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { SkillStore, SkillStoreClass, MemoryStore, MemoryStoreClass, PortableMemory, LocalModel, LocalModelClass, McpConnector, McpConnectorClass } from "../connectors/types.js";
2
+ import type { AgentConnector, AgentConnectorClass } from "../connectors/agent.js";
3
+ export interface ConformanceTest {
4
+ category: ConformanceCategory;
5
+ name: string;
6
+ run(): Promise<void>;
7
+ }
8
+ export type ConformanceCategory = "method-existence" | "return-type" | "error-contract" | "static-capabilities" | "feature-behavior";
9
+ export interface SkillStoreFixture {
10
+ build(): SkillStore;
11
+ ctor: SkillStoreClass;
12
+ teardown?(instance: SkillStore): Promise<void>;
13
+ }
14
+ export declare const SkillStoreConformance: {
15
+ buildTests(fixture: SkillStoreFixture): ConformanceTest[];
16
+ };
17
+ export interface MemoryStoreFixture {
18
+ build(): MemoryStore;
19
+ ctor: MemoryStoreClass;
20
+ seed?(instance: MemoryStore, memories: Partial<PortableMemory>[]): Promise<void>;
21
+ teardown?(instance: MemoryStore): Promise<void>;
22
+ }
23
+ export declare const MemoryStoreConformance: {
24
+ buildTests(fixture: MemoryStoreFixture): ConformanceTest[];
25
+ };
26
+ export interface LocalModelFixture {
27
+ build(): LocalModel;
28
+ ctor: LocalModelClass;
29
+ /** Set true if the model is reachable in the test environment. Default false. */
30
+ liveDispatch?: boolean;
31
+ teardown?(instance: LocalModel): Promise<void>;
32
+ }
33
+ export declare const LocalModelConformance: {
34
+ buildTests(fixture: LocalModelFixture): ConformanceTest[];
35
+ };
36
+ export interface McpConnectorFixture {
37
+ build(): McpConnector;
38
+ ctor: McpConnectorClass;
39
+ /** A tool name the connector should handle; used in the dispatch test. */
40
+ testToolName?: string;
41
+ teardown?(instance: McpConnector): Promise<void>;
42
+ }
43
+ export declare const McpConnectorConformance: {
44
+ buildTests(fixture: McpConnectorFixture): ConformanceTest[];
45
+ };
46
+ export interface AgentConnectorFixture {
47
+ build(): AgentConnector;
48
+ ctor: AgentConnectorClass;
49
+ /** Optional id the connector treats as reachable; used in deliver/wake tests. */
50
+ testAgentId?: string;
51
+ teardown?(instance: AgentConnector): Promise<void>;
52
+ }
53
+ export declare const AgentConnectorConformance: {
54
+ buildTests(fixture: AgentConnectorFixture): ConformanceTest[];
55
+ };
56
+ export type { SkillMeta } from "../connectors/types.js";
57
+ //# sourceMappingURL=conformance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conformance.d.ts","sourceRoot":"","sources":["../../src/testing/conformance.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EAEf,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,eAAe,EACf,YAAY,EACZ,iBAAiB,EAGlB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAGlF,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACtB;AAED,MAAM,MAAM,mBAAmB,GAC3B,kBAAkB,GAClB,aAAa,GACb,gBAAgB,GAChB,qBAAqB,GACrB,kBAAkB,CAAC;AAIvB,MAAM,WAAW,iBAAiB;IAChC,KAAK,IAAI,UAAU,CAAC;IACpB,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,CAAC,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAED,eAAO,MAAM,qBAAqB;wBACZ,iBAAiB,GAAG,eAAe,EAAE;CAyG1D,CAAC;AAIF,MAAM,WAAW,kBAAkB;IACjC,KAAK,IAAI,WAAW,CAAC;IACrB,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF,QAAQ,CAAC,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED,eAAO,MAAM,sBAAsB;wBACb,kBAAkB,GAAG,eAAe,EAAE;CAmC3D,CAAC;AAIF,MAAM,WAAW,iBAAiB;IAChC,KAAK,IAAI,UAAU,CAAC;IACpB,IAAI,EAAE,eAAe,CAAC;IACtB,iFAAiF;IACjF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAED,eAAO,MAAM,qBAAqB;wBACZ,iBAAiB,GAAG,eAAe,EAAE;CAyB1D,CAAC;AAIF,MAAM,WAAW,mBAAmB;IAClC,KAAK,IAAI,YAAY,CAAC;IACtB,IAAI,EAAE,iBAAiB,CAAC;IACxB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClD;AAED,eAAO,MAAM,uBAAuB;wBACd,mBAAmB,GAAG,eAAe,EAAE;CAe5D,CAAC;AAIF,MAAM,WAAW,qBAAqB;IACpC,KAAK,IAAI,cAAc,CAAC;IACxB,IAAI,EAAE,mBAAmB,CAAC;IAC1B,iFAAiF;IACjF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpD;AAED,eAAO,MAAM,yBAAyB;wBAChB,qBAAqB,GAAG,eAAe,EAAE;CAqD9D,CAAC;AAsHF,YAAY,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC"}