decibel-tools-mcp 1.0.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/LICENSE +21 -0
- package/README.md +335 -0
- package/dist/agentic/compiler.d.ts +21 -0
- package/dist/agentic/compiler.d.ts.map +1 -0
- package/dist/agentic/compiler.js +267 -0
- package/dist/agentic/compiler.js.map +1 -0
- package/dist/agentic/golden.d.ts +25 -0
- package/dist/agentic/golden.d.ts.map +1 -0
- package/dist/agentic/golden.js +255 -0
- package/dist/agentic/golden.js.map +1 -0
- package/dist/agentic/index.d.ts +17 -0
- package/dist/agentic/index.d.ts.map +1 -0
- package/dist/agentic/index.js +153 -0
- package/dist/agentic/index.js.map +1 -0
- package/dist/agentic/linter.d.ts +20 -0
- package/dist/agentic/linter.d.ts.map +1 -0
- package/dist/agentic/linter.js +340 -0
- package/dist/agentic/linter.js.map +1 -0
- package/dist/agentic/renderer.d.ts +17 -0
- package/dist/agentic/renderer.d.ts.map +1 -0
- package/dist/agentic/renderer.js +277 -0
- package/dist/agentic/renderer.js.map +1 -0
- package/dist/agentic/types.d.ts +199 -0
- package/dist/agentic/types.d.ts.map +1 -0
- package/dist/agentic/types.js +8 -0
- package/dist/agentic/types.js.map +1 -0
- package/dist/architectAdrs.d.ts +19 -0
- package/dist/architectAdrs.d.ts.map +1 -0
- package/dist/architectAdrs.js +123 -0
- package/dist/architectAdrs.js.map +1 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +19 -0
- package/dist/config.js.map +1 -0
- package/dist/dataRoot.d.ts +45 -0
- package/dist/dataRoot.d.ts.map +1 -0
- package/dist/dataRoot.js +201 -0
- package/dist/dataRoot.js.map +1 -0
- package/dist/decibelPaths.d.ts +42 -0
- package/dist/decibelPaths.d.ts.map +1 -0
- package/dist/decibelPaths.js +150 -0
- package/dist/decibelPaths.js.map +1 -0
- package/dist/httpServer.d.ts +49 -0
- package/dist/httpServer.d.ts.map +1 -0
- package/dist/httpServer.js +1472 -0
- package/dist/httpServer.js.map +1 -0
- package/dist/lib/benchmark.d.ts +110 -0
- package/dist/lib/benchmark.d.ts.map +1 -0
- package/dist/lib/benchmark.js +338 -0
- package/dist/lib/benchmark.js.map +1 -0
- package/dist/lib/supabase.d.ts +123 -0
- package/dist/lib/supabase.d.ts.map +1 -0
- package/dist/lib/supabase.js +91 -0
- package/dist/lib/supabase.js.map +1 -0
- package/dist/projectPaths.d.ts +27 -0
- package/dist/projectPaths.d.ts.map +1 -0
- package/dist/projectPaths.js +86 -0
- package/dist/projectPaths.js.map +1 -0
- package/dist/projectRegistry.d.ts +97 -0
- package/dist/projectRegistry.d.ts.map +1 -0
- package/dist/projectRegistry.js +362 -0
- package/dist/projectRegistry.js.map +1 -0
- package/dist/sentinelIssues.d.ts +44 -0
- package/dist/sentinelIssues.d.ts.map +1 -0
- package/dist/sentinelIssues.js +213 -0
- package/dist/sentinelIssues.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +93 -0
- package/dist/server.js.map +1 -0
- package/dist/test.d.ts +7 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +77 -0
- package/dist/test.js.map +1 -0
- package/dist/tools/agentic/index.d.ts +7 -0
- package/dist/tools/agentic/index.d.ts.map +1 -0
- package/dist/tools/agentic/index.js +180 -0
- package/dist/tools/agentic/index.js.map +1 -0
- package/dist/tools/architect/index.d.ts +9 -0
- package/dist/tools/architect/index.d.ts.map +1 -0
- package/dist/tools/architect/index.js +383 -0
- package/dist/tools/architect/index.js.map +1 -0
- package/dist/tools/architect.d.ts +19 -0
- package/dist/tools/architect.d.ts.map +1 -0
- package/dist/tools/architect.js +88 -0
- package/dist/tools/architect.js.map +1 -0
- package/dist/tools/bench.d.ts +89 -0
- package/dist/tools/bench.d.ts.map +1 -0
- package/dist/tools/bench.js +826 -0
- package/dist/tools/bench.js.map +1 -0
- package/dist/tools/context/index.d.ts +11 -0
- package/dist/tools/context/index.d.ts.map +1 -0
- package/dist/tools/context/index.js +439 -0
- package/dist/tools/context/index.js.map +1 -0
- package/dist/tools/context.d.ts +146 -0
- package/dist/tools/context.d.ts.map +1 -0
- package/dist/tools/context.js +481 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/crit.d.ts +63 -0
- package/dist/tools/crit.d.ts.map +1 -0
- package/dist/tools/crit.js +159 -0
- package/dist/tools/crit.js.map +1 -0
- package/dist/tools/data-inspector.d.ts +188 -0
- package/dist/tools/data-inspector.d.ts.map +1 -0
- package/dist/tools/data-inspector.js +650 -0
- package/dist/tools/data-inspector.js.map +1 -0
- package/dist/tools/deck.d.ts +11 -0
- package/dist/tools/deck.d.ts.map +1 -0
- package/dist/tools/deck.js +170 -0
- package/dist/tools/deck.js.map +1 -0
- package/dist/tools/designer/index.d.ts +6 -0
- package/dist/tools/designer/index.d.ts.map +1 -0
- package/dist/tools/designer/index.js +177 -0
- package/dist/tools/designer/index.js.map +1 -0
- package/dist/tools/designer.d.ts +20 -0
- package/dist/tools/designer.d.ts.map +1 -0
- package/dist/tools/designer.js +75 -0
- package/dist/tools/designer.js.map +1 -0
- package/dist/tools/dojo/index.d.ts +13 -0
- package/dist/tools/dojo/index.d.ts.map +1 -0
- package/dist/tools/dojo/index.js +547 -0
- package/dist/tools/dojo/index.js.map +1 -0
- package/dist/tools/dojo.d.ts +254 -0
- package/dist/tools/dojo.d.ts.map +1 -0
- package/dist/tools/dojo.js +933 -0
- package/dist/tools/dojo.js.map +1 -0
- package/dist/tools/dojoBench.d.ts +49 -0
- package/dist/tools/dojoBench.d.ts.map +1 -0
- package/dist/tools/dojoBench.js +205 -0
- package/dist/tools/dojoBench.js.map +1 -0
- package/dist/tools/dojoGraduated.d.ts +50 -0
- package/dist/tools/dojoGraduated.d.ts.map +1 -0
- package/dist/tools/dojoGraduated.js +174 -0
- package/dist/tools/dojoGraduated.js.map +1 -0
- package/dist/tools/dojoPolicy.d.ts +65 -0
- package/dist/tools/dojoPolicy.d.ts.map +1 -0
- package/dist/tools/dojoPolicy.js +263 -0
- package/dist/tools/dojoPolicy.js.map +1 -0
- package/dist/tools/friction/index.d.ts +7 -0
- package/dist/tools/friction/index.d.ts.map +1 -0
- package/dist/tools/friction/index.js +239 -0
- package/dist/tools/friction/index.js.map +1 -0
- package/dist/tools/friction.d.ts +82 -0
- package/dist/tools/friction.d.ts.map +1 -0
- package/dist/tools/friction.js +331 -0
- package/dist/tools/friction.js.map +1 -0
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +52 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/learnings/index.d.ts +5 -0
- package/dist/tools/learnings/index.d.ts.map +1 -0
- package/dist/tools/learnings/index.js +123 -0
- package/dist/tools/learnings/index.js.map +1 -0
- package/dist/tools/learnings.d.ts +41 -0
- package/dist/tools/learnings.d.ts.map +1 -0
- package/dist/tools/learnings.js +149 -0
- package/dist/tools/learnings.js.map +1 -0
- package/dist/tools/oracle/index.d.ts +5 -0
- package/dist/tools/oracle/index.d.ts.map +1 -0
- package/dist/tools/oracle/index.js +97 -0
- package/dist/tools/oracle/index.js.map +1 -0
- package/dist/tools/oracle.d.ts +90 -0
- package/dist/tools/oracle.d.ts.map +1 -0
- package/dist/tools/oracle.js +529 -0
- package/dist/tools/oracle.js.map +1 -0
- package/dist/tools/policy.d.ts +119 -0
- package/dist/tools/policy.d.ts.map +1 -0
- package/dist/tools/policy.js +406 -0
- package/dist/tools/policy.js.map +1 -0
- package/dist/tools/provenance/index.d.ts +4 -0
- package/dist/tools/provenance/index.d.ts.map +1 -0
- package/dist/tools/provenance/index.js +58 -0
- package/dist/tools/provenance/index.js.map +1 -0
- package/dist/tools/provenance.d.ts +75 -0
- package/dist/tools/provenance.d.ts.map +1 -0
- package/dist/tools/provenance.js +197 -0
- package/dist/tools/provenance.js.map +1 -0
- package/dist/tools/rateLimiter.d.ts +45 -0
- package/dist/tools/rateLimiter.d.ts.map +1 -0
- package/dist/tools/rateLimiter.js +91 -0
- package/dist/tools/rateLimiter.js.map +1 -0
- package/dist/tools/registry/index.d.ts +10 -0
- package/dist/tools/registry/index.d.ts.map +1 -0
- package/dist/tools/registry/index.js +467 -0
- package/dist/tools/registry/index.js.map +1 -0
- package/dist/tools/registry.d.ts +3 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +189 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/roadmap/index.d.ts +9 -0
- package/dist/tools/roadmap/index.d.ts.map +1 -0
- package/dist/tools/roadmap/index.js +250 -0
- package/dist/tools/roadmap/index.js.map +1 -0
- package/dist/tools/roadmap.d.ts +88 -0
- package/dist/tools/roadmap.d.ts.map +1 -0
- package/dist/tools/roadmap.js +365 -0
- package/dist/tools/roadmap.js.map +1 -0
- package/dist/tools/sentinel/index.d.ts +19 -0
- package/dist/tools/sentinel/index.d.ts.map +1 -0
- package/dist/tools/sentinel/index.js +832 -0
- package/dist/tools/sentinel/index.js.map +1 -0
- package/dist/tools/sentinel-scan-data.d.ts +90 -0
- package/dist/tools/sentinel-scan-data.d.ts.map +1 -0
- package/dist/tools/sentinel-scan-data.js +122 -0
- package/dist/tools/sentinel-scan-data.js.map +1 -0
- package/dist/tools/sentinel.d.ts +156 -0
- package/dist/tools/sentinel.d.ts.map +1 -0
- package/dist/tools/sentinel.js +603 -0
- package/dist/tools/sentinel.js.map +1 -0
- package/dist/tools/shared/index.d.ts +4 -0
- package/dist/tools/shared/index.d.ts.map +1 -0
- package/dist/tools/shared/index.js +7 -0
- package/dist/tools/shared/index.js.map +1 -0
- package/dist/tools/shared/project.d.ts +17 -0
- package/dist/tools/shared/project.d.ts.map +1 -0
- package/dist/tools/shared/project.js +36 -0
- package/dist/tools/shared/project.js.map +1 -0
- package/dist/tools/shared/response.d.ts +10 -0
- package/dist/tools/shared/response.d.ts.map +1 -0
- package/dist/tools/shared/response.js +36 -0
- package/dist/tools/shared/response.js.map +1 -0
- package/dist/tools/shared/validation.d.ts +10 -0
- package/dist/tools/shared/validation.d.ts.map +1 -0
- package/dist/tools/shared/validation.js +26 -0
- package/dist/tools/shared/validation.js.map +1 -0
- package/dist/tools/studio/cloud-spine.d.ts +27 -0
- package/dist/tools/studio/cloud-spine.d.ts.map +1 -0
- package/dist/tools/studio/cloud-spine.js +773 -0
- package/dist/tools/studio/cloud-spine.js.map +1 -0
- package/dist/tools/studio/index.d.ts +154 -0
- package/dist/tools/studio/index.d.ts.map +1 -0
- package/dist/tools/studio/index.js +525 -0
- package/dist/tools/studio/index.js.map +1 -0
- package/dist/tools/testSpec.d.ts +122 -0
- package/dist/tools/testSpec.d.ts.map +1 -0
- package/dist/tools/testSpec.js +525 -0
- package/dist/tools/testSpec.js.map +1 -0
- package/dist/tools/toolsIndex.d.ts +5 -0
- package/dist/tools/toolsIndex.d.ts.map +1 -0
- package/dist/tools/toolsIndex.js +37 -0
- package/dist/tools/toolsIndex.js.map +1 -0
- package/dist/tools/types.d.ts +30 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +7 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/voice/index.d.ts +8 -0
- package/dist/tools/voice/index.d.ts.map +1 -0
- package/dist/tools/voice/index.js +176 -0
- package/dist/tools/voice/index.js.map +1 -0
- package/dist/tools/voice.d.ts +291 -0
- package/dist/tools/voice.d.ts.map +1 -0
- package/dist/tools/voice.js +734 -0
- package/dist/tools/voice.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supabase Client
|
|
3
|
+
*
|
|
4
|
+
* Connects to senken.pro Supabase for Decibel Studio Cloud Spine.
|
|
5
|
+
* Uses environment variables for configuration.
|
|
6
|
+
*
|
|
7
|
+
* Environment:
|
|
8
|
+
* SUPABASE_URL - Supabase project URL
|
|
9
|
+
* SUPABASE_ANON_KEY - Supabase anon/public key
|
|
10
|
+
* SUPABASE_SERVICE_KEY - Optional service role key for admin operations
|
|
11
|
+
*/
|
|
12
|
+
import { SupabaseClient } from '@supabase/supabase-js';
|
|
13
|
+
export interface Project {
|
|
14
|
+
id: string;
|
|
15
|
+
owner_id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
description: string | null;
|
|
18
|
+
created_at: string;
|
|
19
|
+
updated_at: string;
|
|
20
|
+
deleted_at: string | null;
|
|
21
|
+
}
|
|
22
|
+
export interface Artifact {
|
|
23
|
+
id: string;
|
|
24
|
+
project_id: string;
|
|
25
|
+
schema_version: string;
|
|
26
|
+
type: 'image' | 'video' | '3d' | 'audio' | 'text';
|
|
27
|
+
status: 'generating' | 'partial' | 'complete' | 'failed';
|
|
28
|
+
progress: number | null;
|
|
29
|
+
platform: 'ios' | 'web' | 'claude-code' | 'macos' | 'android';
|
|
30
|
+
app_version: string;
|
|
31
|
+
package_url: string | null;
|
|
32
|
+
package_sha256: string | null;
|
|
33
|
+
prompt: string | null;
|
|
34
|
+
model: string | null;
|
|
35
|
+
provider: string | null;
|
|
36
|
+
parent_artifact_id: string | null;
|
|
37
|
+
workflow_id: string | null;
|
|
38
|
+
workflow_step_id: string | null;
|
|
39
|
+
tags: string[];
|
|
40
|
+
is_pinned: boolean;
|
|
41
|
+
rating: number | null;
|
|
42
|
+
created_at: string;
|
|
43
|
+
updated_at: string;
|
|
44
|
+
deleted_at: string | null;
|
|
45
|
+
}
|
|
46
|
+
export interface ArtifactFile {
|
|
47
|
+
id: string;
|
|
48
|
+
artifact_id: string;
|
|
49
|
+
path: string;
|
|
50
|
+
role: 'preview' | 'render' | 'variant' | 'thumbnail';
|
|
51
|
+
mime_type: string;
|
|
52
|
+
bytes: number;
|
|
53
|
+
sha256: string;
|
|
54
|
+
width: number | null;
|
|
55
|
+
height: number | null;
|
|
56
|
+
storage_url: string | null;
|
|
57
|
+
created_at: string;
|
|
58
|
+
}
|
|
59
|
+
export interface Device {
|
|
60
|
+
id: string;
|
|
61
|
+
user_id: string;
|
|
62
|
+
name: string;
|
|
63
|
+
platform: 'ios' | 'web' | 'claude-code' | 'macos' | 'android';
|
|
64
|
+
capabilities: Record<string, unknown>;
|
|
65
|
+
push_token: string | null;
|
|
66
|
+
last_seen_at: string;
|
|
67
|
+
created_at: string;
|
|
68
|
+
}
|
|
69
|
+
export interface Event {
|
|
70
|
+
seq: number;
|
|
71
|
+
project_id: string;
|
|
72
|
+
type: string;
|
|
73
|
+
payload: Record<string, unknown>;
|
|
74
|
+
device_id: string | null;
|
|
75
|
+
created_at: string;
|
|
76
|
+
}
|
|
77
|
+
export interface Job {
|
|
78
|
+
id: string;
|
|
79
|
+
owner_id: string;
|
|
80
|
+
target_device_id: string | null;
|
|
81
|
+
claimed_by_device_id: string | null;
|
|
82
|
+
workflow_id: string | null;
|
|
83
|
+
project_id: string | null;
|
|
84
|
+
inputs: Record<string, unknown>;
|
|
85
|
+
status: 'pending' | 'claimed' | 'running' | 'complete' | 'failed' | 'cancelled';
|
|
86
|
+
progress: number | null;
|
|
87
|
+
error_message: string | null;
|
|
88
|
+
result_artifact_id: string | null;
|
|
89
|
+
created_at: string;
|
|
90
|
+
updated_at: string;
|
|
91
|
+
claimed_at: string | null;
|
|
92
|
+
completed_at: string | null;
|
|
93
|
+
expires_at: string | null;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get the Supabase client (anon key - respects RLS)
|
|
97
|
+
*/
|
|
98
|
+
export declare function getSupabaseClient(): SupabaseClient<any>;
|
|
99
|
+
/**
|
|
100
|
+
* Get the Supabase service client (service role key - bypasses RLS)
|
|
101
|
+
* Use only for admin operations that require elevated privileges.
|
|
102
|
+
*/
|
|
103
|
+
export declare function getSupabaseServiceClient(): SupabaseClient<any>;
|
|
104
|
+
/**
|
|
105
|
+
* Check if Supabase is configured (for service-level operations like voice inbox)
|
|
106
|
+
* Requires URL and SERVICE_KEY for server-side writes
|
|
107
|
+
*/
|
|
108
|
+
export declare function isSupabaseConfigured(): boolean;
|
|
109
|
+
/**
|
|
110
|
+
* Set access token for user-scoped requests
|
|
111
|
+
*/
|
|
112
|
+
export declare function setAccessToken(token: string): Promise<void>;
|
|
113
|
+
export interface SupabaseError {
|
|
114
|
+
error: string;
|
|
115
|
+
code: string;
|
|
116
|
+
details?: string;
|
|
117
|
+
}
|
|
118
|
+
export declare function isSupabaseError(result: unknown): result is SupabaseError;
|
|
119
|
+
export declare function formatSupabaseError(error: {
|
|
120
|
+
message: string;
|
|
121
|
+
code?: string;
|
|
122
|
+
}): SupabaseError;
|
|
123
|
+
//# sourceMappingURL=supabase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../src/lib/supabase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supabase Client
|
|
3
|
+
*
|
|
4
|
+
* Connects to senken.pro Supabase for Decibel Studio Cloud Spine.
|
|
5
|
+
* Uses environment variables for configuration.
|
|
6
|
+
*
|
|
7
|
+
* Environment:
|
|
8
|
+
* SUPABASE_URL - Supabase project URL
|
|
9
|
+
* SUPABASE_ANON_KEY - Supabase anon/public key
|
|
10
|
+
* SUPABASE_SERVICE_KEY - Optional service role key for admin operations
|
|
11
|
+
*/
|
|
12
|
+
import { createClient } from '@supabase/supabase-js';
|
|
13
|
+
import { log } from '../config.js';
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// Client Singleton
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
18
|
+
let _client = null;
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
20
|
+
let _serviceClient = null;
|
|
21
|
+
/**
|
|
22
|
+
* Get the Supabase client (anon key - respects RLS)
|
|
23
|
+
*/
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
25
|
+
export function getSupabaseClient() {
|
|
26
|
+
if (_client)
|
|
27
|
+
return _client;
|
|
28
|
+
const url = process.env.SUPABASE_URL;
|
|
29
|
+
const anonKey = process.env.SUPABASE_ANON_KEY;
|
|
30
|
+
if (!url || !anonKey) {
|
|
31
|
+
throw new Error('Supabase not configured. Set SUPABASE_URL and SUPABASE_ANON_KEY environment variables.');
|
|
32
|
+
}
|
|
33
|
+
log('[Supabase] Initializing client');
|
|
34
|
+
_client = createClient(url, anonKey, {
|
|
35
|
+
auth: {
|
|
36
|
+
persistSession: false,
|
|
37
|
+
autoRefreshToken: false,
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
return _client;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get the Supabase service client (service role key - bypasses RLS)
|
|
44
|
+
* Use only for admin operations that require elevated privileges.
|
|
45
|
+
*/
|
|
46
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
47
|
+
export function getSupabaseServiceClient() {
|
|
48
|
+
if (_serviceClient)
|
|
49
|
+
return _serviceClient;
|
|
50
|
+
const url = process.env.SUPABASE_URL;
|
|
51
|
+
const serviceKey = process.env.SUPABASE_SERVICE_KEY;
|
|
52
|
+
if (!url || !serviceKey) {
|
|
53
|
+
throw new Error('Supabase service client not configured. Set SUPABASE_URL and SUPABASE_SERVICE_KEY.');
|
|
54
|
+
}
|
|
55
|
+
log('[Supabase] Initializing service client');
|
|
56
|
+
_serviceClient = createClient(url, serviceKey, {
|
|
57
|
+
auth: {
|
|
58
|
+
persistSession: false,
|
|
59
|
+
autoRefreshToken: false,
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
return _serviceClient;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Check if Supabase is configured (for service-level operations like voice inbox)
|
|
66
|
+
* Requires URL and SERVICE_KEY for server-side writes
|
|
67
|
+
*/
|
|
68
|
+
export function isSupabaseConfigured() {
|
|
69
|
+
return !!(process.env.SUPABASE_URL && process.env.SUPABASE_SERVICE_KEY);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Set access token for user-scoped requests
|
|
73
|
+
*/
|
|
74
|
+
export async function setAccessToken(token) {
|
|
75
|
+
const client = getSupabaseClient();
|
|
76
|
+
await client.auth.setSession({
|
|
77
|
+
access_token: token,
|
|
78
|
+
refresh_token: '',
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
export function isSupabaseError(result) {
|
|
82
|
+
return typeof result === 'object' && result !== null && 'error' in result && 'code' in result;
|
|
83
|
+
}
|
|
84
|
+
export function formatSupabaseError(error) {
|
|
85
|
+
return {
|
|
86
|
+
error: error.message,
|
|
87
|
+
code: error.code || 'SUPABASE_ERROR',
|
|
88
|
+
details: JSON.stringify(error),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=supabase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase.js","sourceRoot":"","sources":["../../src/lib/supabase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAkB,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AA8FnC,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,8DAA8D;AAC9D,IAAI,OAAO,GAA+B,IAAI,CAAC;AAC/C,8DAA8D;AAC9D,IAAI,cAAc,GAA+B,IAAI,CAAC;AAEtD;;GAEG;AACH,8DAA8D;AAC9D,MAAM,UAAU,iBAAiB;IAC/B,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAE5B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACrC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAE9C,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,wFAAwF,CACzF,CAAC;IACJ,CAAC;IAED,GAAG,CAAC,gCAAgC,CAAC,CAAC;IACtC,OAAO,GAAG,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE;QACnC,IAAI,EAAE;YACJ,cAAc,EAAE,KAAK;YACrB,gBAAgB,EAAE,KAAK;SACxB;KACF,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,8DAA8D;AAC9D,MAAM,UAAU,wBAAwB;IACtC,IAAI,cAAc;QAAE,OAAO,cAAc,CAAC;IAE1C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACrC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAEpD,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,oFAAoF,CACrF,CAAC;IACJ,CAAC;IAED,GAAG,CAAC,wCAAwC,CAAC,CAAC;IAC9C,cAAc,GAAG,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE;QAC7C,IAAI,EAAE;YACJ,cAAc,EAAE,KAAK;YACrB,gBAAgB,EAAE,KAAK;SACxB;KACF,CAAC,CAAC;IAEH,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AAC1E,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAa;IAChD,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;QAC3B,YAAY,EAAE,KAAK;QACnB,aAAa,EAAE,EAAE;KAClB,CAAC,CAAC;AACL,CAAC;AAYD,MAAM,UAAU,eAAe,CAAC,MAAe;IAC7C,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC;AAChG,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAyC;IAC3E,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,OAAO;QACpB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,gBAAgB;QACpC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;KAC/B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface ProjectConfig {
|
|
2
|
+
projectId: string;
|
|
3
|
+
projectName?: string;
|
|
4
|
+
root: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Resolve project configuration from a project ID.
|
|
8
|
+
*
|
|
9
|
+
* Resolution strategy (via projectRegistry):
|
|
10
|
+
* 1. Check registry for exact ID or alias match
|
|
11
|
+
* 2. Check DECIBEL_PROJECT_ROOT env var
|
|
12
|
+
* 3. Check if projectId is a valid absolute path
|
|
13
|
+
* 4. Walk up from cwd looking for matching project
|
|
14
|
+
*
|
|
15
|
+
* @param projectId - The unique identifier for the project (ID, alias, or path)
|
|
16
|
+
* @returns The project configuration including root path
|
|
17
|
+
* @throws Error if the project cannot be resolved
|
|
18
|
+
*/
|
|
19
|
+
export declare function resolveProjectRoot(projectId: string): Promise<ProjectConfig>;
|
|
20
|
+
/**
|
|
21
|
+
* List all known project IDs.
|
|
22
|
+
* Returns projects from the registry plus any discovered from cwd.
|
|
23
|
+
*
|
|
24
|
+
* @returns Array of discovered project IDs
|
|
25
|
+
*/
|
|
26
|
+
export declare function listProjectIds(): string[];
|
|
27
|
+
//# sourceMappingURL=projectPaths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectPaths.d.ts","sourceRoot":"","sources":["../src/projectPaths.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAkCD;;;;;;;;;;;;GAYG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,CAAC,CAYxB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAezC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Project Path Resolution
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// Helps MCP tools resolve project roots from project IDs.
|
|
5
|
+
// Uses registry-based resolution with fallback to dynamic discovery.
|
|
6
|
+
// ============================================================================
|
|
7
|
+
import fs from 'fs';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
import { resolveProject, listProjects } from './projectRegistry.js';
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Path Resolution Helpers
|
|
12
|
+
// ============================================================================
|
|
13
|
+
/**
|
|
14
|
+
* Walk up directory tree looking for a .decibel folder
|
|
15
|
+
*/
|
|
16
|
+
function findDecibelDir(start) {
|
|
17
|
+
let current = path.resolve(start);
|
|
18
|
+
while (true) {
|
|
19
|
+
const candidate = path.join(current, '.decibel');
|
|
20
|
+
if (fs.existsSync(candidate) && fs.statSync(candidate).isDirectory()) {
|
|
21
|
+
return current; // Return the project root, not the .decibel folder
|
|
22
|
+
}
|
|
23
|
+
const parent = path.dirname(current);
|
|
24
|
+
if (parent === current)
|
|
25
|
+
break;
|
|
26
|
+
current = parent;
|
|
27
|
+
}
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get the project name from a project root directory
|
|
32
|
+
*/
|
|
33
|
+
function getProjectNameFromDir(projectRoot) {
|
|
34
|
+
return path.basename(projectRoot);
|
|
35
|
+
}
|
|
36
|
+
// ============================================================================
|
|
37
|
+
// Public API
|
|
38
|
+
// ============================================================================
|
|
39
|
+
/**
|
|
40
|
+
* Resolve project configuration from a project ID.
|
|
41
|
+
*
|
|
42
|
+
* Resolution strategy (via projectRegistry):
|
|
43
|
+
* 1. Check registry for exact ID or alias match
|
|
44
|
+
* 2. Check DECIBEL_PROJECT_ROOT env var
|
|
45
|
+
* 3. Check if projectId is a valid absolute path
|
|
46
|
+
* 4. Walk up from cwd looking for matching project
|
|
47
|
+
*
|
|
48
|
+
* @param projectId - The unique identifier for the project (ID, alias, or path)
|
|
49
|
+
* @returns The project configuration including root path
|
|
50
|
+
* @throws Error if the project cannot be resolved
|
|
51
|
+
*/
|
|
52
|
+
export async function resolveProjectRoot(projectId) {
|
|
53
|
+
try {
|
|
54
|
+
const entry = resolveProject(projectId);
|
|
55
|
+
return {
|
|
56
|
+
projectId: entry.id,
|
|
57
|
+
projectName: entry.name || entry.id,
|
|
58
|
+
root: entry.path,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
// Re-throw with the helpful error message from registry
|
|
63
|
+
throw err;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* List all known project IDs.
|
|
68
|
+
* Returns projects from the registry plus any discovered from cwd.
|
|
69
|
+
*
|
|
70
|
+
* @returns Array of discovered project IDs
|
|
71
|
+
*/
|
|
72
|
+
export function listProjectIds() {
|
|
73
|
+
const registeredProjects = listProjects();
|
|
74
|
+
const ids = registeredProjects.map((p) => p.id);
|
|
75
|
+
// Also check cwd for a local project not in registry
|
|
76
|
+
const currentProjectRoot = process.env.DECIBEL_PROJECT_ROOT || process.cwd();
|
|
77
|
+
const discoveredRoot = findDecibelDir(currentProjectRoot);
|
|
78
|
+
if (discoveredRoot) {
|
|
79
|
+
const localId = getProjectNameFromDir(discoveredRoot);
|
|
80
|
+
if (!ids.includes(localId)) {
|
|
81
|
+
ids.push(localId);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return ids;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=projectPaths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectPaths.js","sourceRoot":"","sources":["../src/projectPaths.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,0BAA0B;AAC1B,+EAA+E;AAC/E,0DAA0D;AAC1D,qEAAqE;AACrE,+EAA+E;AAE/E,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,cAAc,EAAgB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAYlF,+EAA+E;AAC/E,0BAA0B;AAC1B,+EAA+E;AAE/E;;GAEG;AACH,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAClC,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACjD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACrE,OAAO,OAAO,CAAC,CAAC,mDAAmD;QACrE,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,OAAO;YAAE,MAAM;QAC9B,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,WAAmB;IAChD,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC;AAED,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAAiB;IAEjB,IAAI,CAAC;QACH,MAAM,KAAK,GAAiB,cAAc,CAAC,SAAS,CAAC,CAAC;QACtD,OAAO;YACL,SAAS,EAAE,KAAK,CAAC,EAAE;YACnB,WAAW,EAAE,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE;YACnC,IAAI,EAAE,KAAK,CAAC,IAAI;SACjB,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,wDAAwD;QACxD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,kBAAkB,GAAG,YAAY,EAAE,CAAC;IAC1C,MAAM,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAe,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAE9D,qDAAqD;IACrD,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC7E,MAAM,cAAc,GAAG,cAAc,CAAC,kBAAkB,CAAC,CAAC;IAC1D,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,qBAAqB,CAAC,cAAc,CAAC,CAAC;QACtD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
export interface ProjectEntry {
|
|
2
|
+
/** Primary ID (usually directory name) */
|
|
3
|
+
id: string;
|
|
4
|
+
/** Human-readable name */
|
|
5
|
+
name?: string;
|
|
6
|
+
/** Absolute path to project root (contains .decibel/) */
|
|
7
|
+
path: string;
|
|
8
|
+
/** Optional aliases (e.g., "senken" -> "senken-trading-agent") */
|
|
9
|
+
aliases?: string[];
|
|
10
|
+
/** If true, this is the default project when none specified */
|
|
11
|
+
default?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface ProjectRegistry {
|
|
14
|
+
version: 1;
|
|
15
|
+
projects: ProjectEntry[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Resolve a project ID or alias to its filesystem path.
|
|
19
|
+
*
|
|
20
|
+
* Resolution order:
|
|
21
|
+
* 1. Check registry for exact ID match
|
|
22
|
+
* 2. Check registry for alias match
|
|
23
|
+
* 3. Check DECIBEL_PROJECT_ROOT env var (if ID matches basename)
|
|
24
|
+
* 4. Check if ID is an absolute path with .decibel
|
|
25
|
+
* 5. Walk up from cwd looking for .decibel (if ID matches discovered project)
|
|
26
|
+
*
|
|
27
|
+
* @param projectId - Project ID, alias, or path
|
|
28
|
+
* @returns Absolute path to the project root
|
|
29
|
+
* @throws Error if project cannot be resolved
|
|
30
|
+
*/
|
|
31
|
+
export declare function resolveProject(projectId: string): ProjectEntry;
|
|
32
|
+
/**
|
|
33
|
+
* List all registered projects
|
|
34
|
+
*/
|
|
35
|
+
export declare function listProjects(): ProjectEntry[];
|
|
36
|
+
/**
|
|
37
|
+
* Register a new project or update an existing one
|
|
38
|
+
*/
|
|
39
|
+
export declare function registerProject(entry: ProjectEntry): void;
|
|
40
|
+
/**
|
|
41
|
+
* Remove a project from the registry
|
|
42
|
+
*/
|
|
43
|
+
export declare function unregisterProject(projectId: string): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Add an alias to an existing project
|
|
46
|
+
*/
|
|
47
|
+
export declare function addProjectAlias(projectId: string, alias: string): void;
|
|
48
|
+
/**
|
|
49
|
+
* Get the registry file path (for display/debugging)
|
|
50
|
+
*/
|
|
51
|
+
export declare function getRegistryFilePath(): string;
|
|
52
|
+
/**
|
|
53
|
+
* Get the default project.
|
|
54
|
+
* Resolution order:
|
|
55
|
+
* 1. Project explicitly marked as default
|
|
56
|
+
* 2. DECIBEL_DEFAULT_PROJECT env var
|
|
57
|
+
* 3. If only one project registered, use it
|
|
58
|
+
* 4. Discover from cwd
|
|
59
|
+
*
|
|
60
|
+
* @returns The default project entry or undefined if none can be determined
|
|
61
|
+
*/
|
|
62
|
+
export declare function getDefaultProject(): ProjectEntry | undefined;
|
|
63
|
+
/**
|
|
64
|
+
* Set a project as the default
|
|
65
|
+
*/
|
|
66
|
+
export declare function setDefaultProject(projectId: string): void;
|
|
67
|
+
/**
|
|
68
|
+
* Normalize projectId from various input formats.
|
|
69
|
+
* Handles both camelCase (projectId) and snake_case (project_id).
|
|
70
|
+
* This allows tools to accept inputs from Claude regardless of which format it uses.
|
|
71
|
+
*/
|
|
72
|
+
export declare function normalizeProjectId(input: Record<string, unknown>): string | undefined;
|
|
73
|
+
export interface ResolvedProjectPaths {
|
|
74
|
+
/** Project ID */
|
|
75
|
+
id: string;
|
|
76
|
+
/** Absolute path to project root */
|
|
77
|
+
projectPath: string;
|
|
78
|
+
/** Absolute path to .decibel folder */
|
|
79
|
+
decibelPath: string;
|
|
80
|
+
/** Helper to get a subdirectory under .decibel */
|
|
81
|
+
subPath: (...segments: string[]) => string;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Resolve project and return useful paths.
|
|
85
|
+
* This is the primary helper for tools to get project paths.
|
|
86
|
+
*
|
|
87
|
+
* @param projectId - Project ID, alias, or path (optional, uses default if not provided)
|
|
88
|
+
* @returns Resolved project paths
|
|
89
|
+
* @throws Error if project cannot be resolved
|
|
90
|
+
*/
|
|
91
|
+
export declare function resolveProjectPaths(projectId?: string): ResolvedProjectPaths;
|
|
92
|
+
/**
|
|
93
|
+
* Validate that a write path is within the project's .decibel folder.
|
|
94
|
+
* Call this before any file write to prevent escaping project boundaries.
|
|
95
|
+
*/
|
|
96
|
+
export declare function validateWritePath(targetPath: string, resolved: ResolvedProjectPaths): void;
|
|
97
|
+
//# sourceMappingURL=projectRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectRegistry.d.ts","sourceRoot":"","sources":["../src/projectRegistry.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,YAAY;IAC3B,0CAA0C;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,CAAC,CAAC;IACX,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AA2FD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAyE9D;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,YAAY,EAAE,CAG7C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CA8BzD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAa5D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CActE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,IAAI,YAAY,GAAG,SAAS,CA8C5D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAiBzD;AAMD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAErF;AAMD,MAAM,WAAW,oBAAoB;IACnC,iBAAiB;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,OAAO,EAAE,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;CAC5C;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,oBAAoB,CAwB5E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,GAAG,IAAI,CAQ1F"}
|