@mrc2204/agent-smart-memo 5.0.0 → 5.0.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.
package/README.md CHANGED
@@ -1,115 +1,264 @@
1
1
  # Agent Smart Memo
2
2
 
3
- > **Shared Agent Memory Platform** with runtime adapters for **OpenClaw**, **Paperclip**, and future agent systems.
3
+ > **ASM v5.1 super memory platform for OpenClaw agents** unified memory for **conversation memory**, **project memory**, semantic retrieval, structured slots, graph knowledge, onboarding, and engineering context assembly.
4
4
 
5
- `agent-smart-memo` started as an OpenClaw memory plugin. It is now evolving into a **moduleized memory platform**:
5
+ Originally built as an OpenClaw memory plugin for conversation/runtime memory, `agent-smart-memo` has evolved into a broader **agent memory platform**:
6
6
 
7
- - **core** contracts, use-cases, namespace policy, error model
8
- - **adapter-openclaw** plugin entry, tool registration, hook wiring, runtime bridge
9
- - **adapter-paperclip** runtime wrapper, caller integration, compatibility mapping
10
- - **shared infra** Qdrant, embeddings, SlotDB, GraphDB, packaging scripts
7
+ - **conversation memory** for agent runtime continuity
8
+ - **project memory** for repo-aware engineering context
9
+ - **semantic memory** via vector retrieval
10
+ - **structured slot memory** via SQLite
11
+ - **graph memory** for entities/relationships
12
+ - **operator onboarding** for project registration + Jira mapping + indexing
13
+ - **CLI/setup flows** for OpenClaw installation and bootstrap
11
14
 
12
- That means this repository should no longer be understood as *only* an OpenClaw plugin repo.
13
- It is a **shared memory engine with target-specific artifacts**.
15
+ This repo is still packaged for **OpenClaw first**, but its practical role is now:
16
+
17
+ - a **super memory layer** for agents
18
+ - a **project-aware engineering memory system**
19
+ - an **operator-friendly onboarding/runtime package**
20
+
21
+ It is no longer accurate to describe ASM as only a small conversation-memory plugin.
22
+
23
+ ---
24
+
25
+ ## 1) What ASM v5.1 is
26
+
27
+ ASM v5.1 combines two big memory domains.
28
+
29
+ ### A. Conversation memory
30
+ Used for ongoing agent continuity and runtime recall:
31
+ - semantic memory (`memory_search`, `memory_store`)
32
+ - structured slot memory (`memory_slot_*`)
33
+ - graph memory (`memory_graph_*`)
34
+ - auto-capture / auto-recall support
35
+ - namespace-aware memory behavior
36
+
37
+ ### B. Project memory
38
+ Used for engineering/project-aware workflows:
39
+ - project registry and aliasing
40
+ - repo root / repo remote identity
41
+ - Jira mapping and tracker linkage
42
+ - onboarding flows for new repos
43
+ - project indexing / reindexing
44
+ - hybrid retrieval with file / symbol / task lineage
45
+
46
+ That is why ASM now acts as:
47
+
48
+ > **conversation memory + project memory + retrieval/control plane in one agent-facing platform**
49
+
50
+ ---
51
+
52
+ ## 2) What ASM v5.1 provides today
53
+
54
+ ASM-69 and follow-up waves expanded the system from memory-only into project-aware memory orchestration.
55
+
56
+ ### Project-aware memory model
57
+ Agents can now reason about:
58
+ - `project_id`
59
+ - project alias
60
+ - `repo_root`
61
+ - `repo_remote`
62
+ - Jira space / epic mapping
63
+ - registration / validation state
64
+
65
+ ### Ingest + semantic block extraction
66
+ Codebases can be transformed into retrievable structures using:
67
+ - file planning
68
+ - semantic block extraction
69
+ - deterministic file/chunk/symbol IDs
70
+ - diff-aware indexing primitives
71
+
72
+ ### Incremental reindex
73
+ Instead of rebuilding everything blindly, ASM now supports:
74
+ - changed / unchanged / deleted diffing
75
+ - watch-state snapshotting
76
+ - checksum-driven reindex control
77
+ - background-friendly trigger flow
78
+
79
+ ### Hybrid retrieval + task lineage
80
+ ASM is not just vector search anymore.
81
+ It can combine:
82
+ - semantic recall
83
+ - lexical/project filters
84
+ - file/symbol/task context
85
+ - parent/related/touched lineage context
86
+
87
+ ### Operator onboarding
88
+ Operators can onboard a project with repo + alias + Jira mapping + optional index trigger using project-aware command flows.
89
+
90
+ ### Setup CLI
91
+ OpenClaw setup is now easier through the global CLI:
92
+ - `asm setup-openclaw`
93
+ - `asm setup openclaw`
94
+ - legacy-compatible `npm run init-openclaw`
14
95
 
15
96
  ---
16
97
 
17
- ## 1) What this project does
98
+ ## 3) Scope of this repository
18
99
 
19
- Agent Smart Memo provides a unified memory stack for AI agents:
100
+ This repository now spans multiple practical layers.
20
101
 
21
- - **Semantic memory** via Qdrant (`memory_search`, `memory_store`)
22
- - **Structured slot memory** via SQLite (`memory_slot_*`)
23
- - **Graph memory** for entity/relationship retrieval (`memory_graph_*`)
24
- - **Auto-capture / auto-recall** for OpenClaw runtime
25
- - **Shared runtime contracts** for multi-system memory callers
26
- - **Target-based packaging** so each runtime only consumes the artifact it needs
102
+ ### OpenClaw runtime/plugin layer
103
+ Includes:
104
+ - plugin entry
105
+ - tool registration
106
+ - runtime hooks
107
+ - OpenClaw packaging/build flow
108
+ - setup/bootstrap CLI flow
109
+
110
+ ### Shared memory platform layer
111
+ Includes:
112
+ - SlotDB
113
+ - semantic memory use-cases
114
+ - graph/registry logic
115
+ - shared contracts and runtime abstractions
116
+
117
+ ### Project-aware engineering memory layer
118
+ Includes:
119
+ - project registry
120
+ - onboarding use-cases
121
+ - tracker mapping
122
+ - indexing/reindexing primitives
123
+ - lineage-aware retrieval
124
+
125
+ So the best mental model is:
126
+
127
+ > **an OpenClaw-delivered super memory platform with both conversation memory and project memory**
27
128
 
28
129
  ---
29
130
 
30
- ## 2) Runtime targets
131
+ ## 4) Runtime targets
31
132
 
32
133
  ### OpenClaw target
33
- Use this when you want Agent Smart Memo as an OpenClaw memory plugin.
134
+ Use this when you want ASM as the main OpenClaw memory/runtime plugin.
34
135
 
35
136
  Contains:
36
- - core
37
- - required infra
137
+ - core memory platform
38
138
  - OpenClaw adapter
39
139
  - plugin entry / hooks / tool registration
140
+ - operator onboarding command surfaces
40
141
 
41
142
  Artifact intent:
42
143
  - **OpenClaw plugin artifact**
43
144
 
44
145
  ### Paperclip target
45
- Use this when you want a Paperclip runtime caller over the same memory core.
146
+ Use this when you want Paperclip to consume the same shared memory core/runtime behavior.
46
147
 
47
148
  Contains:
48
- - core
49
- - required infra
50
- - Paperclip adapter
51
- - runtime wrapper / compatibility mapper
149
+ - core memory platform
150
+ - Paperclip adapter/runtime wrapper
151
+ - compatibility mapping
52
152
 
53
153
  Artifact intent:
54
154
  - **Paperclip runtime package**
55
155
 
56
156
  ### Core target
57
- Use this when you only want shared contracts/use-cases for future systems.
157
+ Use this when you want the shared contracts/use-cases without OpenClaw/Paperclip-specific delivery.
58
158
 
59
159
  Contains:
60
- - core contracts
61
- - use-case abstractions
62
- - shared platform rules
160
+ - shared contracts
161
+ - shared use-cases
162
+ - shared memory/platform rules
63
163
 
64
164
  Artifact intent:
65
165
  - **runtime-agnostic shared memory core**
66
166
 
67
167
  ---
68
168
 
69
- ## 3) Architecture principles
169
+ ## 5) Main capability areas
70
170
 
71
- ### Compatibility-first
72
- Current OpenClaw behavior must not break while module boundaries are extracted.
171
+ ### Conversation memory capabilities
172
+ - `memory_search`
173
+ - `memory_store`
174
+ - `memory_slot_get`
175
+ - `memory_slot_set`
176
+ - `memory_slot_delete`
177
+ - `memory_slot_list`
178
+ - `memory_graph_*`
179
+ - auto-capture / auto-recall
180
+
181
+ ### Project memory capabilities
182
+ - `project.register`
183
+ - `project.get`
184
+ - `project.list`
185
+ - `project.link_tracker`
186
+ - `project.trigger_index`
187
+ - `project.reindex_diff`
188
+ - `project.index_watch_get`
189
+ - `project.legacy_backfill`
190
+ - Telegram/operator onboarding surfaces
191
+
192
+ ### Retrieval/engineering context capabilities
193
+ - semantic retrieval
194
+ - lexical/project filtering
195
+ - project-aware context assembly
196
+ - file / symbol / task lineage
197
+ - repo-aware indexing and reindexing
73
198
 
74
- ### Target-based packaging
75
- Do **not** treat the whole repository output as one OpenClaw-only artifact.
199
+ ---
76
200
 
77
- - OpenClaw artifact should contain only what OpenClaw needs
78
- - Paperclip artifact should contain only what Paperclip needs
79
- - Core artifact should stay reusable for future systems
201
+ ## 6) CLI / setup UX
80
202
 
81
- ### Shared contracts
82
- The following should be shared across runtimes:
83
- - namespace policy
84
- - actor context contract
85
- - error model
86
- - use-case interfaces
87
- - rollout guardrails
203
+ The preferred setup path is the global CLI.
88
204
 
89
- ---
205
+ ### Install globally
206
+ ```bash
207
+ npm install -g @mrc2204/agent-smart-memo
208
+ ```
209
+
210
+ ### Preferred setup flow
211
+ ```bash
212
+ asm setup-openclaw
213
+ ```
214
+
215
+ Also supported:
216
+ ```bash
217
+ asm setup openclaw
218
+ ```
90
219
 
91
- ## 4) Quick start for OpenClaw
220
+ Legacy-compatible flow:
221
+ ```bash
222
+ npm run init-openclaw
223
+ ```
224
+
225
+ ### What `asm setup-openclaw` does
226
+ 1. checks that `openclaw` CLI exists
227
+ 2. installs `@mrc2204/agent-smart-memo` if missing
228
+ 3. runs OpenClaw bootstrap/init flow
229
+ 4. patches config with preview + backup behavior
230
+ 5. prints next-step verification guidance
231
+
232
+ This is the fastest path for operators who want ASM enabled in OpenClaw without manual config editing first.
233
+
234
+ ---
92
235
 
93
- If your current goal is still **“install the memory plugin into OpenClaw”**, use this section.
236
+ ## 7) Quick start for OpenClaw
94
237
 
95
- ### Install
238
+ If your current goal is still “install and run ASM in OpenClaw”, use this section.
96
239
 
240
+ ### Install plugin directly
97
241
  ```bash
98
242
  openclaw plugins install @mrc2204/agent-smart-memo
99
243
  ```
100
244
 
101
- ### Prerequisites
245
+ ### Or install locally from source
246
+ ```bash
247
+ npm install
248
+ npm run build
249
+ openclaw plugins install -l .
250
+ ```
102
251
 
103
- You need these services running:
252
+ ### Prerequisites
253
+ You typically need:
104
254
 
105
255
  | Service | Purpose | Example |
106
256
  |---|---|---|
107
- | Qdrant | Semantic vector memory | `docker run -d -p 6333:6333 qdrant/qdrant` |
108
- | Embedding backend | Embeddings for semantic memory | Ollama / OpenAI-compatible / docker adapter |
109
- | LLM endpoint | Fact extraction / auto-capture | Any OpenAI-compatible API |
110
-
111
- ### OpenClaw config example
257
+ | Qdrant | Semantic/vector memory | `docker run -d -p 6333:6333 qdrant/qdrant` |
258
+ | Embedding backend | Embeddings for semantic recall | Ollama / OpenAI-compatible / docker adapter |
259
+ | LLM endpoint | Fact extraction / auto-capture | OpenAI-compatible API |
112
260
 
261
+ ### Example OpenClaw config
113
262
  Add to `~/.openclaw/openclaw.json`:
114
263
 
115
264
  ```json5
@@ -144,22 +293,48 @@ Add to `~/.openclaw/openclaw.json`:
144
293
  }
145
294
  ```
146
295
 
147
- ### OpenClaw target commands
296
+ ---
148
297
 
149
- ```bash
150
- npm install
151
- npm run build
152
- openclaw plugins install -l .
298
+ ## 8) Project onboarding flow
299
+
300
+ For project-aware onboarding in OpenClaw/Telegram flows, the current slash command is:
301
+
302
+ ```text
303
+ /project <repo_url>
153
304
  ```
154
305
 
306
+ ### Current behavior summary
307
+ - onboarding preview exposes resolved `repo_root` when derivable
308
+ - preview/commit can report `repo_resolution` and `clone_policy`
309
+ - if `repo_url` matches an already-registered remote, registration reuses the existing project identity / `repo_root`
310
+ - if `repo_url` is a local path, it is treated as import without `git clone`
311
+ - `project.trigger_index` is background-friendly and reports:
312
+ - `accepted`
313
+ - `enqueued`
314
+ - `detached`
315
+ - `job_id`
316
+
317
+ ### Typical onboarding path
318
+ 1. operator starts with `/project <repo_url>`
319
+ 2. bot prepares preview
320
+ 3. preview shows alias/Jira/index choices and repo resolution hints
321
+ 4. operator confirms
322
+ 5. flow bridges into:
323
+ - `project_register_command`
324
+ - `project_link_tracker`
325
+ - `project_trigger_index`
326
+
327
+ See also:
328
+ - `docs/architecture/ASM-74-master-project-registration-ux-command-contract-jira-mapping-v5.1.md`
329
+ - `tests/test-project-registry.ts`
330
+
155
331
  ---
156
332
 
157
- ## 5) Quick start for Paperclip
333
+ ## 9) Quick start for Paperclip
158
334
 
159
335
  If your goal is to let **Paperclip** consume the same memory core:
160
336
 
161
337
  ### Build the Paperclip target
162
-
163
338
  ```bash
164
339
  npm install
165
340
  npm run build:paperclip
@@ -184,10 +359,9 @@ But README intentionally does **not** overclaim this as full production-grade mu
184
359
 
185
360
  ---
186
361
 
187
- ## 6) Build targets
362
+ ## 10) Build targets
188
363
 
189
364
  ### Default build
190
-
191
365
  ```bash
192
366
  npm run build
193
367
  ```
@@ -195,7 +369,6 @@ npm run build
195
369
  Default build remains **OpenClaw-compatible** for backward compatibility.
196
370
 
197
371
  ### Explicit targets
198
-
199
372
  ```bash
200
373
  npm run build:openclaw
201
374
  npm run build:paperclip
@@ -204,7 +377,6 @@ npm run build:all
204
377
  ```
205
378
 
206
379
  ### Packaging
207
-
208
380
  ```bash
209
381
  npm run package:openclaw
210
382
  npm run package:paperclip
@@ -212,7 +384,6 @@ npm run package:core
212
384
  ```
213
385
 
214
386
  ### Pack tarballs
215
-
216
387
  ```bash
217
388
  npm run pack:openclaw
218
389
  npm run pack:paperclip
@@ -220,7 +391,6 @@ npm run pack:core
220
391
  ```
221
392
 
222
393
  ### Publish targets
223
-
224
394
  ```bash
225
395
  npm run publish:openclaw
226
396
  npm run publish:paperclip
@@ -231,7 +401,7 @@ npm run publish:core
231
401
 
232
402
  ---
233
403
 
234
- ## 7) CI/CD model
404
+ ## 11) CI/CD model
235
405
 
236
406
  GitHub Actions workflow: `.github/workflows/publish.yml`
237
407
 
@@ -245,9 +415,9 @@ Current flow:
245
415
 
246
416
  ### Important distinction
247
417
  A `work/...` branch is for:
248
- - **CI checks**
249
- - **PR review**
250
- - **dry-run readiness**
418
+ - CI checks
419
+ - PR review
420
+ - dry-run readiness
251
421
 
252
422
  It is **not** the same as:
253
423
  - production deploy
@@ -262,34 +432,7 @@ work/... push -> CI checks -> PR review -> approve -> merge default branch -> pu
262
432
 
263
433
  ---
264
434
 
265
- ## 8) Memory capabilities
266
-
267
- ### Semantic memory
268
- - `memory_search`
269
- - `memory_store`
270
- - namespace-aware retrieval
271
- - registry-aware alias normalization
272
- - explicit unknown namespace validation
273
-
274
- ### Slot memory
275
- - `memory_slot_get`
276
- - `memory_slot_set`
277
- - `memory_slot_delete`
278
- - `memory_slot_list`
279
-
280
- ### Graph memory
281
- - entity create/get/search
282
- - relationship add/remove
283
- - scoped traversal
284
-
285
- ### Runtime automation
286
- - auto-capture
287
- - auto-recall
288
- - runtime identity injection where supported
289
-
290
- ---
291
-
292
- ## 9) Configuration notes
435
+ ## 12) Configuration notes
293
436
 
294
437
  ### Embedding backend mapping
295
438
  When `embedBackend` is set:
@@ -307,7 +450,7 @@ Resolution order:
307
450
 
308
451
  ---
309
452
 
310
- ## 10) Verification levels
453
+ ## 13) Verification levels
311
454
 
312
455
  ### Build level
313
456
  Confirms code compiles:
@@ -318,30 +461,36 @@ npm run build:all
318
461
  ```
319
462
 
320
463
  ### Contract / integration level
321
-
322
464
  ```bash
323
465
  npm test
324
466
  npm run test:openclaw
325
467
  npm run test:paperclip
326
468
  ```
327
469
 
470
+ ### Project-aware targeted verification
471
+ ```bash
472
+ npx tsx tests/test-project-registry.ts
473
+ npx tsx tests/test-project-reindex-diff.ts
474
+ npx tsx tests/test-project-hybrid-lineage.ts
475
+ npx tsx tests/test-project-legacy-backfill.ts
476
+ ```
477
+
328
478
  ### Production-like runtime verification
329
479
  Examples already added in this repo include:
330
480
  - Paperclip runtime E2E
331
481
  - OpenClaw anti-regression integration
332
482
  - production-like smoke parity harness
333
483
 
334
- This is stronger than mock-only testing, but still distinct from a full production deployment.
335
-
336
484
  ---
337
485
 
338
- ## 11) Repository layout (high level)
486
+ ## 14) Repository layout (high level)
339
487
 
340
488
  ```text
341
489
  src/
342
490
  core/
343
491
  contracts/
344
492
  usecases/
493
+ ingest/
345
494
  adapters/
346
495
  openclaw/
347
496
  paperclip/
@@ -359,50 +508,23 @@ docs/architecture/
359
508
 
360
509
  ---
361
510
 
362
- ## 12) Current project status
511
+ ## 15) Current mental model
363
512
 
364
- Current repo status after ASM-43 work:
365
- - architecture pack completed
366
- - implementation pack substantially advanced
367
- - runtime wiring exists for OpenClaw and Paperclip paths
368
- - production-like smoke parity evidence exists
369
- - target-based packaging/build pipeline exists
370
-
371
- Still be precise about claims:
372
- - strong progress beyond scaffold ✅
373
- - compatibility-first runtime wiring ✅
374
- - full production-grade multi-runtime completion should only be claimed with full runtime-host evidence and approved release flow
375
-
376
- ---
513
+ If you only remember one thing, remember this:
377
514
 
378
- ## 13) Useful commands
515
+ > **ASM v5.1 is a super memory platform for agents: conversation memory + project memory + retrieval/control-plane capabilities.**
379
516
 
380
- ```bash
381
- # install dependencies
382
- npm install
383
-
384
- # default build (OpenClaw target)
385
- npm run build
386
-
387
- # build all targets
388
- npm run build:all
389
-
390
- # test
391
- npm test
392
- npm run test:openclaw
393
- npm run test:paperclip
394
-
395
- # package / pack
396
- npm run package:openclaw
397
- npm run package:paperclip
398
- npm run package:core
399
- npm run pack:openclaw
400
- npm run pack:paperclip
401
- npm run pack:core
402
- ```
517
+ It helps agents:
518
+ - remember ongoing runtime/conversation context
519
+ - store/retrieve structured and semantic knowledge
520
+ - register and map projects
521
+ - index and reindex repos
522
+ - retrieve engineering context with lineage
523
+ - onboard projects with operator-friendly flows
524
+ - bootstrap OpenClaw faster through the CLI
403
525
 
404
526
  ---
405
527
 
406
- ## 14) License
528
+ ## 16) License
407
529
 
408
530
  MIT © [mrc2204](https://github.com/cong91)
@@ -0,0 +1,33 @@
1
+ import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
2
+ import { getMemoryUseCasePortForContext } from "../adapters/openclaw/tool-runtime.js";
3
+ export interface AddProjectCommandPayload {
4
+ mode: "preview" | "confirm";
5
+ repo_url?: string;
6
+ project_alias?: string;
7
+ jira_space_key?: string;
8
+ default_epic_key?: string;
9
+ index_now?: boolean;
10
+ project_name?: string;
11
+ repo_root?: string;
12
+ active_version?: string;
13
+ }
14
+ export interface AddProjectCommandDependencies {
15
+ getUseCasePortForContext?: typeof getMemoryUseCasePortForContext;
16
+ now?: () => number;
17
+ }
18
+ export declare function parseAddProjectCommandArgs(args?: string): AddProjectCommandPayload | {
19
+ help: true;
20
+ };
21
+ type AddProjectCommandContext = {
22
+ senderId?: string;
23
+ channel: string;
24
+ accountId?: string;
25
+ from?: string;
26
+ messageThreadId?: number;
27
+ };
28
+ export declare function composeAddProjectScopeUserId(ctx: AddProjectCommandContext): string;
29
+ export declare function formatAddProjectUsage(): string;
30
+ export declare function formatAddProjectResult(result: any): string;
31
+ export declare function registerTelegramAddProjectCommand(api: OpenClawPluginApi, deps?: AddProjectCommandDependencies): void;
32
+ export {};
33
+ //# sourceMappingURL=telegram-addproject-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram-addproject-command.d.ts","sourceRoot":"","sources":["../../src/commands/telegram-addproject-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,8BAA8B,EAAE,MAAM,sCAAsC,CAAC;AAEtF,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,6BAA6B;IAC5C,wBAAwB,CAAC,EAAE,OAAO,8BAA8B,CAAC;IACjE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAgCD,wBAAgB,0BAA0B,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,wBAAwB,GAAG;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CAkFnG;AAED,KAAK,wBAAwB,GAAG;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,wBAAwB,GAAG,MAAM,CAMlF;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAU9C;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CAyC1D;AAED,wBAAgB,iCAAiC,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,CAAC,EAAE,6BAA6B,GAAG,IAAI,CA4CpH"}