@scitrera/memorylayer-cc-plugin 0.1.22 → 0.2.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 (53) hide show
  1. package/LICENSE +177 -0
  2. package/README.md +11 -4
  3. package/dist/bin/memorylayer-hook.js +27 -9
  4. package/dist/bin/memorylayer-hook.js.map +1 -1
  5. package/dist/src/hooks/client.d.ts +21 -0
  6. package/dist/src/hooks/client.d.ts.map +1 -0
  7. package/dist/src/hooks/client.js +57 -0
  8. package/dist/src/hooks/client.js.map +1 -0
  9. package/dist/src/hooks/formatters.d.ts +33 -0
  10. package/dist/src/hooks/formatters.d.ts.map +1 -0
  11. package/dist/src/hooks/formatters.js +187 -0
  12. package/dist/src/hooks/formatters.js.map +1 -0
  13. package/dist/src/hooks/handlers/post-tool.d.ts +10 -0
  14. package/dist/src/hooks/handlers/post-tool.d.ts.map +1 -0
  15. package/dist/src/hooks/handlers/post-tool.js +98 -0
  16. package/dist/src/hooks/handlers/post-tool.js.map +1 -0
  17. package/dist/src/hooks/handlers/pre-compact.d.ts +5 -0
  18. package/dist/src/hooks/handlers/pre-compact.d.ts.map +1 -0
  19. package/dist/src/hooks/handlers/pre-compact.js +117 -0
  20. package/dist/src/hooks/handlers/pre-compact.js.map +1 -0
  21. package/dist/src/hooks/handlers/pre-tool.d.ts +10 -0
  22. package/dist/src/hooks/handlers/pre-tool.d.ts.map +1 -0
  23. package/dist/src/hooks/handlers/pre-tool.js +114 -0
  24. package/dist/src/hooks/handlers/pre-tool.js.map +1 -0
  25. package/dist/src/hooks/handlers/session-start.d.ts +10 -0
  26. package/dist/src/hooks/handlers/session-start.d.ts.map +1 -0
  27. package/dist/src/hooks/handlers/session-start.js +111 -0
  28. package/dist/src/hooks/handlers/session-start.js.map +1 -0
  29. package/dist/src/hooks/handlers/stop.d.ts +14 -0
  30. package/dist/src/hooks/handlers/stop.d.ts.map +1 -0
  31. package/dist/src/hooks/handlers/stop.js +49 -0
  32. package/dist/src/hooks/handlers/stop.js.map +1 -0
  33. package/dist/src/hooks/handlers/user-prompt.d.ts +10 -0
  34. package/dist/src/hooks/handlers/user-prompt.d.ts.map +1 -0
  35. package/dist/src/hooks/handlers/user-prompt.js +128 -0
  36. package/dist/src/hooks/handlers/user-prompt.js.map +1 -0
  37. package/dist/src/hooks/index.d.ts +18 -0
  38. package/dist/src/hooks/index.d.ts.map +1 -0
  39. package/dist/src/hooks/index.js +23 -0
  40. package/dist/src/hooks/index.js.map +1 -0
  41. package/dist/src/hooks/observation.d.ts +59 -0
  42. package/dist/src/hooks/observation.d.ts.map +1 -0
  43. package/dist/src/hooks/observation.js +421 -0
  44. package/dist/src/hooks/observation.js.map +1 -0
  45. package/dist/src/hooks/state.d.ts +73 -0
  46. package/dist/src/hooks/state.d.ts.map +1 -0
  47. package/dist/src/hooks/state.js +168 -0
  48. package/dist/src/hooks/state.js.map +1 -0
  49. package/dist/src/hooks/types.d.ts +86 -0
  50. package/dist/src/hooks/types.d.ts.map +1 -0
  51. package/dist/src/hooks/types.js +14 -0
  52. package/dist/src/hooks/types.js.map +1 -0
  53. package/package.json +9 -5
@@ -0,0 +1,421 @@
1
+ /**
2
+ * Observation extraction for auto-capture hooks.
3
+ * Extracts structured observation data from tool usage.
4
+ */
5
+ import { createHash } from 'crypto';
6
+ // Tools to skip (internal/noisy/self-referential)
7
+ const SKIP_TOOLS = new Set([
8
+ 'TodoWrite', 'TodoRead',
9
+ 'AskFollowupQuestion', 'AskUserQuestion',
10
+ 'AttemptCompletion',
11
+ 'LS', // Low signal
12
+ ]);
13
+ // Also skip any tool matching these prefixes (memory tools)
14
+ const SKIP_PREFIXES = [
15
+ 'mcp__memorylayer',
16
+ 'mcp__memory',
17
+ 'memory_',
18
+ ];
19
+ export function shouldSkipTool(toolName) {
20
+ if (SKIP_TOOLS.has(toolName))
21
+ return true;
22
+ return SKIP_PREFIXES.some(prefix => toolName.startsWith(prefix));
23
+ }
24
+ /**
25
+ * Classify tool as read/write/execute/search/other
26
+ */
27
+ export function getObservationType(toolName) {
28
+ const readTools = ['Read', 'Glob', 'Grep', 'LS'];
29
+ const writeTools = ['Write', 'Edit', 'MultiEdit', 'NotebookEdit'];
30
+ const executeTools = ['Bash', 'Task', 'Skill'];
31
+ const searchTools = ['WebSearch', 'WebFetch'];
32
+ if (readTools.includes(toolName))
33
+ return 'read';
34
+ if (writeTools.includes(toolName))
35
+ return 'write';
36
+ if (executeTools.includes(toolName))
37
+ return 'execute';
38
+ if (searchTools.includes(toolName))
39
+ return 'search';
40
+ return 'other';
41
+ }
42
+ /**
43
+ * Extract file paths from tool input, classified as read or modified
44
+ */
45
+ export function extractFilePaths(toolName, toolInput) {
46
+ const filesRead = [];
47
+ const filesModified = [];
48
+ try {
49
+ const input = typeof toolInput === 'object' && toolInput !== null ? toolInput : {};
50
+ const filePath = input?.file_path || input?.path || '';
51
+ if (!filePath) {
52
+ // Try to extract paths from bash commands
53
+ if (toolName === 'Bash') {
54
+ const command = input?.command || '';
55
+ const pathMatches = command.match(/(?:^|\s)([^\s]+\.(ts|js|py|json|yaml|yml|md|txt|go|rs|java|c|cpp|h))\b/gi);
56
+ if (pathMatches) {
57
+ filesRead.push(...pathMatches.map((p) => p.trim()));
58
+ }
59
+ }
60
+ return { filesRead, filesModified };
61
+ }
62
+ const type = getObservationType(toolName);
63
+ if (type === 'write') {
64
+ filesModified.push(filePath);
65
+ }
66
+ else if (type === 'read') {
67
+ filesRead.push(filePath);
68
+ }
69
+ }
70
+ catch {
71
+ // Ignore parse errors
72
+ }
73
+ return { filesRead, filesModified };
74
+ }
75
+ /**
76
+ * Generate observation title from tool usage
77
+ */
78
+ export function generateTitle(toolName, toolInput) {
79
+ try {
80
+ const input = typeof toolInput === 'object' && toolInput !== null ? toolInput : {};
81
+ switch (toolName) {
82
+ case 'Read':
83
+ return `Read ${input?.file_path || input?.path || 'file'}`;
84
+ case 'Write':
85
+ return `Write ${input?.file_path || input?.path || 'file'}`;
86
+ case 'Edit':
87
+ case 'MultiEdit':
88
+ return `Edit ${input?.file_path || input?.path || 'file'}`;
89
+ case 'Bash': {
90
+ const cmd = input?.command || '';
91
+ return `Run: ${cmd.substring(0, 50)}${cmd.length > 50 ? '...' : ''}`;
92
+ }
93
+ case 'Glob':
94
+ return `Find ${input?.pattern || 'files'}`;
95
+ case 'Grep':
96
+ return `Search "${input?.pattern || ''}"`;
97
+ case 'Task':
98
+ return `Task: ${input?.description || 'agent'}`;
99
+ case 'WebSearch':
100
+ return `Search: ${input?.query || ''}`;
101
+ case 'WebFetch':
102
+ return `Fetch: ${input?.url || ''}`;
103
+ default:
104
+ return `${toolName}`;
105
+ }
106
+ }
107
+ catch {
108
+ return toolName;
109
+ }
110
+ }
111
+ /**
112
+ * Extract facts from tool input/response
113
+ */
114
+ export function extractFacts(toolName, toolInput, toolOutput) {
115
+ const facts = [];
116
+ try {
117
+ const input = typeof toolInput === 'object' && toolInput !== null ? toolInput : {};
118
+ const filePath = input?.file_path || input?.path || '';
119
+ switch (toolName) {
120
+ case 'Read':
121
+ if (filePath)
122
+ facts.push(`File read: ${filePath}`);
123
+ break;
124
+ case 'Write':
125
+ if (filePath)
126
+ facts.push(`File created/updated: ${filePath}`);
127
+ break;
128
+ case 'Edit':
129
+ case 'MultiEdit':
130
+ if (filePath)
131
+ facts.push(`File modified: ${filePath}`);
132
+ if (input?.old_string) {
133
+ facts.push(`Code replaced in ${filePath.split(/[/\\]/).pop() || 'file'}`);
134
+ }
135
+ break;
136
+ case 'Bash': {
137
+ const cmd = input?.command || '';
138
+ facts.push(`Command executed: ${cmd.substring(0, 100)}`);
139
+ // Extract test results
140
+ if (toolOutput) {
141
+ if (toolOutput.includes('passed') || toolOutput.includes('\u2713'))
142
+ facts.push('Tests passed');
143
+ if (toolOutput.includes('failed') || toolOutput.includes('\u2717'))
144
+ facts.push('Tests failed');
145
+ if (toolOutput.includes('error') || toolOutput.includes('Error'))
146
+ facts.push('Errors encountered');
147
+ }
148
+ break;
149
+ }
150
+ case 'Glob':
151
+ if (input?.pattern)
152
+ facts.push(`Pattern searched: ${input.pattern}`);
153
+ break;
154
+ case 'Grep':
155
+ if (input?.pattern)
156
+ facts.push(`Code pattern searched: ${input.pattern}`);
157
+ if (input?.path)
158
+ facts.push(`Search scope: ${input.path}`);
159
+ break;
160
+ case 'WebSearch':
161
+ if (input?.query)
162
+ facts.push(`Web search: ${input.query}`);
163
+ break;
164
+ case 'WebFetch':
165
+ if (input?.url)
166
+ facts.push(`URL fetched: ${input.url}`);
167
+ break;
168
+ case 'Task':
169
+ if (input?.description)
170
+ facts.push(`Sub-task: ${input.description}`);
171
+ if (input?.subagent_type)
172
+ facts.push(`Agent type: ${input.subagent_type}`);
173
+ break;
174
+ }
175
+ }
176
+ catch {
177
+ // Ignore parse errors
178
+ }
179
+ return facts;
180
+ }
181
+ /**
182
+ * Extract concepts/topics from tool usage
183
+ */
184
+ export function extractConcepts(toolName, toolInput) {
185
+ const concepts = new Set();
186
+ try {
187
+ const input = typeof toolInput === 'object' && toolInput !== null ? toolInput : {};
188
+ const filePath = (input?.file_path || input?.path || '');
189
+ // Extract concepts from file paths
190
+ if (filePath) {
191
+ // Directory-based concepts
192
+ const parts = filePath.split(/[/\\]/);
193
+ for (const part of parts) {
194
+ if (['src', 'lib', 'dist', 'node_modules', '.', '..'].includes(part))
195
+ continue;
196
+ if (part.includes('.')) {
197
+ // File extension concepts
198
+ const ext = part.split('.').pop();
199
+ const extMap = {
200
+ ts: 'typescript', tsx: 'react', js: 'javascript', jsx: 'react',
201
+ py: 'python', rs: 'rust', go: 'golang', css: 'styling', scss: 'styling',
202
+ html: 'html', json: 'configuration', yaml: 'configuration', yml: 'configuration',
203
+ md: 'documentation', test: 'testing', spec: 'testing', sql: 'database',
204
+ };
205
+ if (ext && extMap[ext])
206
+ concepts.add(extMap[ext]);
207
+ }
208
+ // Directory-based concepts
209
+ const dirMap = {
210
+ tests: 'testing', __tests__: 'testing', test: 'testing', spec: 'testing',
211
+ hooks: 'hooks', api: 'api', auth: 'authentication', db: 'database',
212
+ components: 'components', pages: 'pages', routes: 'routing', utils: 'utilities',
213
+ services: 'services', middleware: 'middleware', models: 'models', types: 'types',
214
+ cli: 'cli', config: 'configuration', migrations: 'database', schemas: 'schemas',
215
+ };
216
+ if (dirMap[part])
217
+ concepts.add(dirMap[part]);
218
+ }
219
+ }
220
+ // Extract function/class names from Edit/MultiEdit for code-specific searchability
221
+ if (toolName === 'Edit' || toolName === 'MultiEdit') {
222
+ const oldStr = (input?.old_string || '');
223
+ const newStr = (input?.new_string || '');
224
+ const combined = oldStr + '\n' + newStr;
225
+ // Extract function names
226
+ const funcMatches = combined.match(/(?:function|async function|const|let|var)\s+(\w{3,})/g);
227
+ if (funcMatches) {
228
+ for (const m of funcMatches.slice(0, 3)) {
229
+ const name = m.replace(/(?:function|async function|const|let|var)\s+/, '');
230
+ concepts.add(`fn:${name}`);
231
+ }
232
+ }
233
+ // Extract class names
234
+ const classMatches = combined.match(/class\s+(\w{3,})/g);
235
+ if (classMatches) {
236
+ for (const m of classMatches.slice(0, 2)) {
237
+ concepts.add(`class:${m.replace('class ', '')}`);
238
+ }
239
+ }
240
+ // Extract patterns: import, export, interface, type, enum
241
+ if (/\bimport\b/.test(combined))
242
+ concepts.add('pattern:import');
243
+ if (/\bexport\b/.test(combined))
244
+ concepts.add('pattern:export');
245
+ if (/\binterface\b/.test(combined))
246
+ concepts.add('pattern:interface');
247
+ if (/\benum\b/.test(combined))
248
+ concepts.add('pattern:enum');
249
+ if (/\btry\s*\{/.test(combined))
250
+ concepts.add('pattern:error-handling');
251
+ if (/\basync\b/.test(combined))
252
+ concepts.add('pattern:async');
253
+ }
254
+ // Tool-based concepts
255
+ switch (toolName) {
256
+ case 'Bash': {
257
+ const cmd = (input?.command || '');
258
+ if (cmd.includes('test') || cmd.includes('vitest') || cmd.includes('jest'))
259
+ concepts.add('testing');
260
+ if (cmd.includes('build') || cmd.includes('tsc'))
261
+ concepts.add('build');
262
+ if (cmd.includes('git'))
263
+ concepts.add('version-control');
264
+ if (cmd.includes('npm') || cmd.includes('yarn') || cmd.includes('pnpm'))
265
+ concepts.add('package-management');
266
+ if (cmd.includes('docker'))
267
+ concepts.add('containerization');
268
+ if (cmd.includes('lint') || cmd.includes('eslint'))
269
+ concepts.add('linting');
270
+ break;
271
+ }
272
+ case 'WebSearch':
273
+ concepts.add('research');
274
+ break;
275
+ case 'WebFetch':
276
+ concepts.add('web-content');
277
+ break;
278
+ case 'Task':
279
+ concepts.add('delegation');
280
+ if (input?.subagent_type)
281
+ concepts.add(input.subagent_type);
282
+ break;
283
+ }
284
+ }
285
+ catch {
286
+ // Ignore parse errors
287
+ }
288
+ return Array.from(concepts);
289
+ }
290
+ /**
291
+ * Detect intent from tool usage and user prompt
292
+ */
293
+ export function detectIntent(toolName, toolInput, prompt) {
294
+ const intentPatterns = {
295
+ bugfix: /fix|bug|error|issue|broken|crash|repair/i,
296
+ feature: /add|feature|implement|create|new|build/i,
297
+ refactor: /refactor|clean|rename|reorganize|restructure/i,
298
+ testing: /test|spec|coverage|verify/i,
299
+ investigation: /find|search|investigate|debug|analyze|explore/i,
300
+ documentation: /document|comment|readme|doc|explain/i,
301
+ };
302
+ // Check user prompt first (if available)
303
+ if (prompt) {
304
+ for (const [intent, pattern] of Object.entries(intentPatterns)) {
305
+ if (pattern.test(prompt)) {
306
+ return intent;
307
+ }
308
+ }
309
+ }
310
+ // Check tool input
311
+ try {
312
+ const input = typeof toolInput === 'object' && toolInput !== null ? toolInput : {};
313
+ const inputStr = JSON.stringify(input);
314
+ for (const [intent, pattern] of Object.entries(intentPatterns)) {
315
+ if (pattern.test(inputStr)) {
316
+ return intent;
317
+ }
318
+ }
319
+ }
320
+ catch {
321
+ // Ignore parse errors
322
+ }
323
+ // Tool-based intent detection
324
+ switch (toolName) {
325
+ case 'Read':
326
+ case 'Glob':
327
+ case 'Grep':
328
+ return 'investigation';
329
+ case 'Write':
330
+ return 'feature';
331
+ case 'Edit':
332
+ return null; // Too ambiguous without context
333
+ default:
334
+ return null;
335
+ }
336
+ }
337
+ /**
338
+ * Compute content hash for deduplication
339
+ */
340
+ export function computeContentHash(...parts) {
341
+ return createHash('sha256')
342
+ .update(parts.join('|'))
343
+ .digest('hex')
344
+ .slice(0, 16);
345
+ }
346
+ /**
347
+ * Truncate string to max length
348
+ */
349
+ export function truncate(str, maxLen = 500) {
350
+ if (str.length <= maxLen)
351
+ return str;
352
+ return str.substring(0, maxLen) + '...';
353
+ }
354
+ /**
355
+ * Build observation from hook input
356
+ */
357
+ export function buildObservation(input, currentPrompt) {
358
+ const toolName = input.tool_name;
359
+ if (!toolName)
360
+ return null;
361
+ // Extract all components
362
+ const type = getObservationType(toolName);
363
+ const title = generateTitle(toolName, input.tool_input);
364
+ const { filesRead, filesModified } = extractFilePaths(toolName, input.tool_input);
365
+ const facts = extractFacts(toolName, input.tool_input, input.tool_output);
366
+ const concepts = extractConcepts(toolName, input.tool_input);
367
+ const intent = detectIntent(toolName, input.tool_input, currentPrompt);
368
+ // Build summary
369
+ const summary = buildSummary(toolName, input.tool_input, input.tool_output, filesRead, filesModified);
370
+ // Compute content hash for dedup
371
+ const contentHash = computeContentHash(toolName, JSON.stringify(input.tool_input || {}), summary);
372
+ // Skip if empty observation (no meaningful data extracted)
373
+ if (filesRead.length === 0 && filesModified.length === 0 && facts.length === 0 && concepts.length === 0) {
374
+ return null;
375
+ }
376
+ return {
377
+ type,
378
+ title,
379
+ toolName,
380
+ filesRead,
381
+ filesModified,
382
+ facts,
383
+ concepts,
384
+ intent,
385
+ contentHash,
386
+ summary,
387
+ };
388
+ }
389
+ /**
390
+ * Build human-readable summary
391
+ */
392
+ function buildSummary(toolName, toolInput, _toolOutput, filesRead, filesModified) {
393
+ const parts = [];
394
+ if (filesRead.length > 0) {
395
+ parts.push(`Read: ${filesRead.join(', ')}`);
396
+ }
397
+ if (filesModified.length > 0) {
398
+ parts.push(`Modified: ${filesModified.join(', ')}`);
399
+ }
400
+ // Add tool-specific context
401
+ try {
402
+ const input = typeof toolInput === 'object' && toolInput !== null ? toolInput : {};
403
+ if (toolName === 'Bash') {
404
+ const cmd = input?.command || '';
405
+ parts.push(`Command: ${truncate(cmd, 100)}`);
406
+ }
407
+ else if (toolName === 'Grep') {
408
+ const pattern = input?.pattern || '';
409
+ parts.push(`Pattern: ${pattern}`);
410
+ }
411
+ else if (toolName === 'Task') {
412
+ const desc = input?.description || '';
413
+ parts.push(`Task: ${truncate(desc, 100)}`);
414
+ }
415
+ }
416
+ catch {
417
+ // Ignore
418
+ }
419
+ return parts.length > 0 ? parts.join('; ') : `Used ${toolName}`;
420
+ }
421
+ //# sourceMappingURL=observation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observation.js","sourceRoot":"","sources":["../../../src/hooks/observation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Hook state management - persists state between hook invocations
3
+ */
4
+ import type { HookState } from "./types.js";
5
+ /**
6
+ * Read current hook state from disk
7
+ */
8
+ export declare function readHookState(): HookState;
9
+ /**
10
+ * Write hook state to disk
11
+ */
12
+ export declare function writeHookState(state: HookState): void;
13
+ /**
14
+ * Mark that recall has been done this turn for a specific query
15
+ */
16
+ export declare function markRecallDone(query: string): void;
17
+ /**
18
+ * Check if recall was already done this turn (any query)
19
+ */
20
+ export declare function wasRecallDoneThisTurn(): boolean;
21
+ /**
22
+ * Check if a specific query (or similar) was already recalled this turn.
23
+ * Allows different queries to proceed even if a recall was already done.
24
+ */
25
+ export declare function wasQueryRecalledThisTurn(query: string): boolean;
26
+ /**
27
+ * Reset recall status for new turn
28
+ */
29
+ export declare function resetRecallStatus(): void;
30
+ /**
31
+ * Store the user's current topic for cross-hook context
32
+ */
33
+ export declare function setCurrentTopic(topic: string): void;
34
+ /**
35
+ * Get the user's current topic (set by UserPromptSubmit)
36
+ */
37
+ export declare function getCurrentTopic(): string | undefined;
38
+ /**
39
+ * Store the user's current prompt for cross-hook context
40
+ */
41
+ export declare function setCurrentPrompt(prompt: string): void;
42
+ /**
43
+ * Get the user's current prompt (set by UserPromptSubmit)
44
+ */
45
+ export declare function getCurrentPrompt(): string | undefined;
46
+ /**
47
+ * Update workspace/session info
48
+ */
49
+ export declare function updateSessionInfo(workspaceId: string, sessionId?: string): void;
50
+ /** Return the last durably acknowledged byte boundary for this transcript. */
51
+ export declare function getCheckpointBoundary(sessionId: string, transcriptPath: string): number;
52
+ /** Advance a transcript boundary only after the server acknowledges raw capture. */
53
+ export declare function acknowledgeCheckpointBoundary(sessionId: string, transcriptPath: string, boundary: number): void;
54
+ /**
55
+ * Get current workspace ID from state
56
+ */
57
+ export declare function getWorkspaceId(): string | undefined;
58
+ /**
59
+ * Get current session ID from hook-state.json (disk read, singleton).
60
+ * Prefer resolveSessionId() which checks env first and avoids disk I/O.
61
+ */
62
+ export declare function getSessionIdFromHookState(): string | undefined;
63
+ /**
64
+ * Resolve session ID with env-first strategy.
65
+ *
66
+ * Prefers process.env.MEMORYLAYER_SESSION_ID (session-scoped via CLAUDE_ENV_FILE)
67
+ * over hook-state.json (singleton, shared across concurrent sessions).
68
+ * Only falls back to disk read if env var is not set.
69
+ *
70
+ * @param caller - label for diagnostic logging (e.g. "post-tool", "stop")
71
+ */
72
+ export declare function resolveSessionId(caller: string): string | undefined;
73
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/hooks/state.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAU5C;;GAEG;AACH,wBAAgB,aAAa,IAAI,SAAS,CAUzC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CASrD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CASlD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAG/C;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAK/D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAInD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,SAAS,CAEpD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAIrD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAErD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAK/E;AAED,8EAA8E;AAC9E,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAGvF;AAED,oFAAoF;AACpF,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAO/G;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,GAAG,SAAS,CAEnD;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,GAAG,SAAS,CAE9D;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAenE"}