@deepagents/context 0.10.2 → 0.11.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/README.md +114 -119
- package/dist/example-error-recovery.d.ts +2 -0
- package/dist/example-error-recovery.d.ts.map +1 -0
- package/dist/index.d.ts +16 -388
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2391 -1062
- package/dist/index.js.map +4 -4
- package/dist/lib/agent.d.ts +86 -12
- package/dist/lib/agent.d.ts.map +1 -1
- package/dist/lib/engine.d.ts +323 -0
- package/dist/lib/engine.d.ts.map +1 -0
- package/dist/lib/estimate.d.ts +1 -1
- package/dist/lib/estimate.d.ts.map +1 -1
- package/dist/lib/fragments/domain.d.ts +440 -0
- package/dist/lib/fragments/domain.d.ts.map +1 -0
- package/dist/lib/fragments/user.d.ts +122 -0
- package/dist/lib/fragments/user.d.ts.map +1 -0
- package/dist/lib/fragments.d.ts +107 -0
- package/dist/lib/fragments.d.ts.map +1 -0
- package/dist/lib/guardrail.d.ts +138 -0
- package/dist/lib/guardrail.d.ts.map +1 -0
- package/dist/lib/renderers/abstract.renderer.d.ts +1 -1
- package/dist/lib/renderers/abstract.renderer.d.ts.map +1 -1
- package/dist/lib/sandbox/binary-bridges.d.ts +31 -0
- package/dist/lib/sandbox/binary-bridges.d.ts.map +1 -0
- package/dist/lib/sandbox/container-tool.d.ts +134 -0
- package/dist/lib/sandbox/container-tool.d.ts.map +1 -0
- package/dist/lib/sandbox/docker-sandbox.d.ts +471 -0
- package/dist/lib/sandbox/docker-sandbox.d.ts.map +1 -0
- package/dist/lib/sandbox/index.d.ts +4 -0
- package/dist/lib/sandbox/index.d.ts.map +1 -0
- package/dist/lib/skills/fragments.d.ts +24 -0
- package/dist/lib/skills/fragments.d.ts.map +1 -0
- package/dist/lib/skills/index.d.ts +31 -0
- package/dist/lib/skills/index.d.ts.map +1 -0
- package/dist/lib/skills/loader.d.ts +28 -0
- package/dist/lib/skills/loader.d.ts.map +1 -0
- package/dist/lib/skills/types.d.ts +40 -0
- package/dist/lib/skills/types.d.ts.map +1 -0
- package/package.json +7 -3
- package/dist/lib/context.d.ts +0 -56
- package/dist/lib/context.d.ts.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,389 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export
|
|
8
|
-
export
|
|
9
|
-
export
|
|
10
|
-
export
|
|
11
|
-
export
|
|
12
|
-
export
|
|
13
|
-
export
|
|
14
|
-
|
|
15
|
-
*
|
|
16
|
-
|
|
17
|
-
export interface ResolveResult {
|
|
18
|
-
/** Rendered non-message fragments for system prompt */
|
|
19
|
-
systemPrompt: string;
|
|
20
|
-
/** Message fragments decoded to AI SDK format */
|
|
21
|
-
messages: unknown[];
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Options for resolve().
|
|
25
|
-
*/
|
|
26
|
-
export interface ResolveOptions {
|
|
27
|
-
/** Renderer to use for system prompt (defaults to XmlRenderer) */
|
|
28
|
-
renderer: ContextRenderer;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Options for creating a ContextEngine.
|
|
32
|
-
*/
|
|
33
|
-
export interface ContextEngineOptions {
|
|
34
|
-
/** Store for persisting fragments (required) */
|
|
35
|
-
store: ContextStore;
|
|
36
|
-
/** Unique identifier for this chat (required) */
|
|
37
|
-
chatId: string;
|
|
38
|
-
/** Branch name (defaults to 'main') */
|
|
39
|
-
branch?: string;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Options for creating message fragments.
|
|
43
|
-
*/
|
|
44
|
-
export interface MessageOptions {
|
|
45
|
-
/** Custom ID for the fragment. If not provided, auto-generates UUID. */
|
|
46
|
-
id?: string;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Metadata about a chat.
|
|
50
|
-
*/
|
|
51
|
-
export interface ChatMeta {
|
|
52
|
-
/** Unique chat identifier */
|
|
53
|
-
id: string;
|
|
54
|
-
/** When the chat was created */
|
|
55
|
-
createdAt: number;
|
|
56
|
-
/** When the chat was last updated */
|
|
57
|
-
updatedAt: number;
|
|
58
|
-
/** Optional user-provided title */
|
|
59
|
-
title?: string;
|
|
60
|
-
/** Optional custom metadata */
|
|
61
|
-
metadata?: Record<string, unknown>;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Options for context inspection.
|
|
65
|
-
*/
|
|
66
|
-
export interface InspectOptions {
|
|
67
|
-
/** Model ID for cost estimation (required) */
|
|
68
|
-
modelId: Models;
|
|
69
|
-
/** Renderer for estimation (required) */
|
|
70
|
-
renderer: ContextRenderer;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Result of inspecting context state.
|
|
74
|
-
* Provides a comprehensive JSON-serializable snapshot for debugging.
|
|
75
|
-
*/
|
|
76
|
-
export interface InspectResult {
|
|
77
|
-
/** Token usage and cost estimation */
|
|
78
|
-
estimate: EstimateResult;
|
|
79
|
-
/** Rendered output using the provided renderer */
|
|
80
|
-
rendered: string;
|
|
81
|
-
/** Fragment structure breakdown */
|
|
82
|
-
fragments: {
|
|
83
|
-
/** Non-message fragments (role, hints, etc.) */
|
|
84
|
-
context: ContextFragment[];
|
|
85
|
-
/** Pending messages not yet saved to store */
|
|
86
|
-
pending: ContextFragment[];
|
|
87
|
-
/** Persisted messages from the store */
|
|
88
|
-
persisted: MessageData[];
|
|
89
|
-
};
|
|
90
|
-
/** Conversation graph with branches and checkpoints */
|
|
91
|
-
graph: GraphData;
|
|
92
|
-
/** Inspection metadata */
|
|
93
|
-
meta: {
|
|
94
|
-
chatId: string;
|
|
95
|
-
branch: string;
|
|
96
|
-
timestamp: number;
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
export { ModelsRegistry, defaultTokenizer, estimate, getModelsRegistry, type EstimateResult, type FragmentEstimate, type ModelCost, type ModelInfo, type Tokenizer, } from './lib/estimate.ts';
|
|
100
|
-
export type { KnownModels, Models } from './lib/models.generated.ts';
|
|
101
|
-
export { MarkdownRenderer, TomlRenderer, ToonRenderer, XmlRenderer, type ContextRenderer, type RendererOptions, } from './lib/renderers/abstract.renderer.ts';
|
|
102
|
-
/**
|
|
103
|
-
* Context engine for managing AI conversation context with graph-based storage.
|
|
104
|
-
*
|
|
105
|
-
* The engine uses a DAG (Directed Acyclic Graph) model for messages:
|
|
106
|
-
* - Messages are immutable nodes with parentId forming the graph
|
|
107
|
-
* - Branches are pointers to head (tip) messages
|
|
108
|
-
* - Checkpoints are pointers to specific messages
|
|
109
|
-
* - History is preserved through branching (rewind creates new branch)
|
|
110
|
-
*/
|
|
111
|
-
export declare class ContextEngine {
|
|
112
|
-
#private;
|
|
113
|
-
constructor(options: ContextEngineOptions);
|
|
114
|
-
/**
|
|
115
|
-
* Get the current chat ID.
|
|
116
|
-
*/
|
|
117
|
-
get chatId(): string;
|
|
118
|
-
/**
|
|
119
|
-
* Get the current branch name.
|
|
120
|
-
*/
|
|
121
|
-
get branch(): string;
|
|
122
|
-
/**
|
|
123
|
-
* Get metadata for the current chat.
|
|
124
|
-
* Returns null if the chat hasn't been initialized yet.
|
|
125
|
-
*/
|
|
126
|
-
get chat(): ChatMeta | null;
|
|
127
|
-
/**
|
|
128
|
-
* Add fragments to the context.
|
|
129
|
-
*
|
|
130
|
-
* - Message fragments (user/assistant) are queued for persistence
|
|
131
|
-
* - Non-message fragments (role/hint) are kept in memory for system prompt
|
|
132
|
-
*/
|
|
133
|
-
set(...fragments: ContextFragment[]): this;
|
|
134
|
-
/**
|
|
135
|
-
* Render all fragments using the provided renderer.
|
|
136
|
-
* @internal Use resolve() instead for public API.
|
|
137
|
-
*/
|
|
138
|
-
render(renderer: ContextRenderer): string;
|
|
139
|
-
/**
|
|
140
|
-
* Resolve context into AI SDK-ready format.
|
|
141
|
-
*
|
|
142
|
-
* - Initializes chat and branch if needed
|
|
143
|
-
* - Loads message history from the graph (walking parent chain)
|
|
144
|
-
* - Separates context fragments for system prompt
|
|
145
|
-
* - Combines with pending messages
|
|
146
|
-
*
|
|
147
|
-
* @example
|
|
148
|
-
* ```ts
|
|
149
|
-
* const context = new ContextEngine({ store, chatId: 'chat-1' })
|
|
150
|
-
* .set(role('You are helpful'), user('Hello'));
|
|
151
|
-
*
|
|
152
|
-
* const { systemPrompt, messages } = await context.resolve();
|
|
153
|
-
* await generateText({ system: systemPrompt, messages });
|
|
154
|
-
* ```
|
|
155
|
-
*/
|
|
156
|
-
resolve(options: ResolveOptions): Promise<ResolveResult>;
|
|
157
|
-
/**
|
|
158
|
-
* Save pending messages to the graph.
|
|
159
|
-
*
|
|
160
|
-
* Each message is added as a node with parentId pointing to the previous message.
|
|
161
|
-
* The branch head is updated to point to the last message.
|
|
162
|
-
*
|
|
163
|
-
* @example
|
|
164
|
-
* ```ts
|
|
165
|
-
* context.set(user('Hello'));
|
|
166
|
-
* // AI responds...
|
|
167
|
-
* context.set(assistant('Hi there!'));
|
|
168
|
-
* await context.save(); // Persist to graph
|
|
169
|
-
* ```
|
|
170
|
-
*/
|
|
171
|
-
save(): Promise<void>;
|
|
172
|
-
/**
|
|
173
|
-
* Estimate token count and cost for the full context.
|
|
174
|
-
*
|
|
175
|
-
* Includes:
|
|
176
|
-
* - System prompt fragments (role, hints, etc.)
|
|
177
|
-
* - Persisted chat messages (from store)
|
|
178
|
-
* - Pending messages (not yet saved)
|
|
179
|
-
*
|
|
180
|
-
* @param modelId - Model ID (e.g., "openai:gpt-4o", "anthropic:claude-3-5-sonnet")
|
|
181
|
-
* @param options - Optional settings
|
|
182
|
-
* @returns Estimate result with token counts, costs, and per-fragment breakdown
|
|
183
|
-
*/
|
|
184
|
-
estimate(modelId: Models, options?: {
|
|
185
|
-
renderer?: ContextRenderer;
|
|
186
|
-
}): Promise<EstimateResult>;
|
|
187
|
-
/**
|
|
188
|
-
* Rewind to a specific message by ID.
|
|
189
|
-
*
|
|
190
|
-
* Creates a new branch from that message, preserving the original branch.
|
|
191
|
-
* The new branch becomes active.
|
|
192
|
-
*
|
|
193
|
-
* @param messageId - The message ID to rewind to
|
|
194
|
-
* @returns The new branch info
|
|
195
|
-
*
|
|
196
|
-
* @example
|
|
197
|
-
* ```ts
|
|
198
|
-
* context.set(user('What is 2 + 2?', { id: 'q1' }));
|
|
199
|
-
* context.set(assistant('The answer is 5.', { id: 'wrong' })); // Oops!
|
|
200
|
-
* await context.save();
|
|
201
|
-
*
|
|
202
|
-
* // Rewind to the question, creates new branch
|
|
203
|
-
* const newBranch = await context.rewind('q1');
|
|
204
|
-
*
|
|
205
|
-
* // Now add correct answer on new branch
|
|
206
|
-
* context.set(assistant('The answer is 4.'));
|
|
207
|
-
* await context.save();
|
|
208
|
-
* ```
|
|
209
|
-
*/
|
|
210
|
-
rewind(messageId: string): Promise<BranchInfo>;
|
|
211
|
-
/**
|
|
212
|
-
* Create a checkpoint at the current position.
|
|
213
|
-
*
|
|
214
|
-
* A checkpoint is a named pointer to the current branch head.
|
|
215
|
-
* Use restore() to return to this point later.
|
|
216
|
-
*
|
|
217
|
-
* @param name - Name for the checkpoint
|
|
218
|
-
* @returns The checkpoint info
|
|
219
|
-
*
|
|
220
|
-
* @example
|
|
221
|
-
* ```ts
|
|
222
|
-
* context.set(user('I want to learn a new skill.'));
|
|
223
|
-
* context.set(assistant('Would you like coding or cooking?'));
|
|
224
|
-
* await context.save();
|
|
225
|
-
*
|
|
226
|
-
* // Save checkpoint before user's choice
|
|
227
|
-
* const cp = await context.checkpoint('before-choice');
|
|
228
|
-
* ```
|
|
229
|
-
*/
|
|
230
|
-
checkpoint(name: string): Promise<CheckpointInfo>;
|
|
231
|
-
/**
|
|
232
|
-
* Restore to a checkpoint by creating a new branch from that point.
|
|
233
|
-
*
|
|
234
|
-
* @param name - Name of the checkpoint to restore
|
|
235
|
-
* @returns The new branch info
|
|
236
|
-
*
|
|
237
|
-
* @example
|
|
238
|
-
* ```ts
|
|
239
|
-
* // User chose cooking, but wants to try coding path
|
|
240
|
-
* await context.restore('before-choice');
|
|
241
|
-
*
|
|
242
|
-
* context.set(user('I want to learn coding.'));
|
|
243
|
-
* context.set(assistant('Python is a great starting language!'));
|
|
244
|
-
* await context.save();
|
|
245
|
-
* ```
|
|
246
|
-
*/
|
|
247
|
-
restore(name: string): Promise<BranchInfo>;
|
|
248
|
-
/**
|
|
249
|
-
* Switch to a different branch by name.
|
|
250
|
-
*
|
|
251
|
-
* @param name - Branch name to switch to
|
|
252
|
-
*
|
|
253
|
-
* @example
|
|
254
|
-
* ```ts
|
|
255
|
-
* // List branches (via store)
|
|
256
|
-
* const branches = await store.listBranches(context.chatId);
|
|
257
|
-
* console.log(branches); // [{name: 'main', ...}, {name: 'main-v2', ...}]
|
|
258
|
-
*
|
|
259
|
-
* // Switch to original branch
|
|
260
|
-
* await context.switchBranch('main');
|
|
261
|
-
* ```
|
|
262
|
-
*/
|
|
263
|
-
switchBranch(name: string): Promise<void>;
|
|
264
|
-
/**
|
|
265
|
-
* Create a parallel branch from the current position ("by the way").
|
|
266
|
-
*
|
|
267
|
-
* Use this when you want to fork the conversation without leaving
|
|
268
|
-
* the current branch. Common use case: user wants to ask another
|
|
269
|
-
* question while waiting for the model to respond.
|
|
270
|
-
*
|
|
271
|
-
* Unlike rewind(), this method:
|
|
272
|
-
* - Uses the current HEAD (no messageId needed)
|
|
273
|
-
* - Does NOT switch to the new branch
|
|
274
|
-
* - Keeps pending messages intact
|
|
275
|
-
*
|
|
276
|
-
* @returns The new branch info (does not switch to it)
|
|
277
|
-
* @throws Error if no messages exist in the conversation
|
|
278
|
-
*
|
|
279
|
-
* @example
|
|
280
|
-
* ```ts
|
|
281
|
-
* // User asked a question, model is generating...
|
|
282
|
-
* context.set(user('What is the weather?'));
|
|
283
|
-
* await context.save();
|
|
284
|
-
*
|
|
285
|
-
* // User wants to ask something else without waiting
|
|
286
|
-
* const newBranch = await context.btw();
|
|
287
|
-
* // newBranch = { name: 'main-v2', ... }
|
|
288
|
-
*
|
|
289
|
-
* // Later, switch to the new branch and add the question
|
|
290
|
-
* await context.switchBranch(newBranch.name);
|
|
291
|
-
* context.set(user('Also, what time is it?'));
|
|
292
|
-
* await context.save();
|
|
293
|
-
* ```
|
|
294
|
-
*/
|
|
295
|
-
btw(): Promise<BranchInfo>;
|
|
296
|
-
/**
|
|
297
|
-
* Update metadata for the current chat.
|
|
298
|
-
*
|
|
299
|
-
* @param updates - Partial metadata to merge (title, metadata)
|
|
300
|
-
*
|
|
301
|
-
* @example
|
|
302
|
-
* ```ts
|
|
303
|
-
* await context.updateChat({
|
|
304
|
-
* title: 'Coding Help Session',
|
|
305
|
-
* metadata: { tags: ['python', 'debugging'] }
|
|
306
|
-
* });
|
|
307
|
-
* ```
|
|
308
|
-
*/
|
|
309
|
-
updateChat(updates: Partial<Pick<ChatMeta, 'title' | 'metadata'>>): Promise<void>;
|
|
310
|
-
/**
|
|
311
|
-
* Consolidate context fragments (no-op for now).
|
|
312
|
-
*
|
|
313
|
-
* This is a placeholder for future functionality that merges context fragments
|
|
314
|
-
* using specific rules. Currently, it does nothing.
|
|
315
|
-
*
|
|
316
|
-
* @experimental
|
|
317
|
-
*/
|
|
318
|
-
consolidate(): void;
|
|
319
|
-
/**
|
|
320
|
-
* Inspect the full context state for debugging.
|
|
321
|
-
* Returns a comprehensive JSON-serializable object with all context information.
|
|
322
|
-
*
|
|
323
|
-
* @param options - Inspection options (modelId and renderer required)
|
|
324
|
-
* @returns Complete inspection data including estimates, rendered output, fragments, and graph
|
|
325
|
-
*
|
|
326
|
-
* @example
|
|
327
|
-
* ```ts
|
|
328
|
-
* const inspection = await context.inspect({
|
|
329
|
-
* modelId: 'openai:gpt-4o',
|
|
330
|
-
* renderer: new XmlRenderer(),
|
|
331
|
-
* });
|
|
332
|
-
* console.log(JSON.stringify(inspection, null, 2));
|
|
333
|
-
*
|
|
334
|
-
* // Or write to file for analysis
|
|
335
|
-
* await fs.writeFile('context-debug.json', JSON.stringify(inspection, null, 2));
|
|
336
|
-
* ```
|
|
337
|
-
*/
|
|
338
|
-
inspect(options: InspectOptions): Promise<InspectResult>;
|
|
339
|
-
}
|
|
340
|
-
export declare function hint(text: string): ContextFragment;
|
|
341
|
-
export declare function fragment(name: string, ...children: ContextFragment[]): ContextFragment;
|
|
342
|
-
/**
|
|
343
|
-
* Create a role fragment for system prompt instructions.
|
|
344
|
-
*/
|
|
345
|
-
export declare function role(content: string): ContextFragment;
|
|
346
|
-
/**
|
|
347
|
-
* Create a user message fragment.
|
|
348
|
-
* Message fragments are separated from regular fragments during resolve().
|
|
349
|
-
*
|
|
350
|
-
* @param content - The message content
|
|
351
|
-
* @param options - Optional settings (id)
|
|
352
|
-
*
|
|
353
|
-
* @example
|
|
354
|
-
* ```ts
|
|
355
|
-
* context.set(user('Hello')); // Auto-generated ID
|
|
356
|
-
* context.set(user('Hello', { id: 'msg-1' })); // Custom ID
|
|
357
|
-
* ```
|
|
358
|
-
*/
|
|
359
|
-
export declare function user(content: string | UIMessage): ContextFragment;
|
|
360
|
-
/**
|
|
361
|
-
* Create an assistant message fragment.
|
|
362
|
-
* Message fragments are separated from regular fragments during resolve().
|
|
363
|
-
*
|
|
364
|
-
* @param message - The message content
|
|
365
|
-
* @param options - Optional settings (id)
|
|
366
|
-
*
|
|
367
|
-
* @example
|
|
368
|
-
* ```ts
|
|
369
|
-
* context.set(assistant('Hi there!')); // Auto-generated ID
|
|
370
|
-
* context.set(assistant('Hi there!', { id: 'resp-1' })); // Custom ID
|
|
371
|
-
* ```
|
|
372
|
-
*/
|
|
373
|
-
export declare function assistant(message: UIMessage): ContextFragment;
|
|
374
|
-
export declare function message(content: string | UIMessage): ContextFragment;
|
|
375
|
-
/**
|
|
376
|
-
* Create an assistant message fragment from text content.
|
|
377
|
-
* Convenience wrapper that creates a UIMessage internally.
|
|
378
|
-
*
|
|
379
|
-
* @param content - The message text content
|
|
380
|
-
* @param options - Optional settings (id)
|
|
381
|
-
*
|
|
382
|
-
* @example
|
|
383
|
-
* ```ts
|
|
384
|
-
* context.set(assistantText('Hi there!')); // Auto-generated ID
|
|
385
|
-
* context.set(assistantText('Hi there!', { id: 'resp-1' })); // Custom ID
|
|
386
|
-
* ```
|
|
387
|
-
*/
|
|
388
|
-
export declare function assistantText(content: string, options?: MessageOptions): ContextFragment;
|
|
1
|
+
export * from './lib/engine.ts';
|
|
2
|
+
export * from './lib/codec.ts';
|
|
3
|
+
export * from './lib/estimate.ts';
|
|
4
|
+
export * from './lib/fragments.ts';
|
|
5
|
+
export * from './lib/fragments/domain.ts';
|
|
6
|
+
export * from './lib/fragments/user.ts';
|
|
7
|
+
export * from './lib/guardrail.ts';
|
|
8
|
+
export * from './lib/models.generated.ts';
|
|
9
|
+
export * from './lib/renderers/abstract.renderer.ts';
|
|
10
|
+
export * from './lib/sandbox/index.ts';
|
|
11
|
+
export * from './lib/skills/index.ts';
|
|
12
|
+
export * from './lib/store/memory.store.ts';
|
|
13
|
+
export * from './lib/store/sqlite.store.ts';
|
|
14
|
+
export * from './lib/store/store.ts';
|
|
15
|
+
export * from './lib/visualize.ts';
|
|
16
|
+
export * from './lib/agent.ts';
|
|
389
17
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sCAAsC,CAAC;AACrD,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC"}
|