@elizaos/plugin-knowledge 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.html CHANGED
@@ -1,12 +1,12 @@
1
1
  <!doctype html>
2
- <html lang="en">
2
+ <html lang="en" class="dark">
3
3
  <head>
4
4
  <meta charset="UTF-8" />
5
5
  <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
7
  <title>Agent Plugin View</title>
8
- <script type="module" crossorigin src="./assets/index-BRhhNXdt.js"></script>
9
- <link rel="stylesheet" crossorigin href="./assets/index-Clk6Xgn1.css">
8
+ <script type="module" crossorigin src="./assets/index-BwFQYb4z.js"></script>
9
+ <link rel="stylesheet" crossorigin href="./assets/index-Bjc7mMWy.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="root"></div>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@elizaos/plugin-knowledge",
3
3
  "description": "Plugin for Knowledge",
4
- "version": "1.0.2",
4
+ "version": "1.0.4",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.js",
@@ -31,7 +31,6 @@
31
31
  "@ai-sdk/google": "^1.2.18",
32
32
  "@ai-sdk/openai": "^1.3.22",
33
33
  "@elizaos/core": "^1.0.0",
34
- "@elizaos/plugin-sql": "^1.0.0-beta",
35
34
  "@openrouter/ai-sdk-provider": "^0.4.5",
36
35
  "@tanstack/react-query": "^5.51.1",
37
36
  "@vitejs/plugin-react-swc": "^3.10.0",
@@ -54,9 +53,10 @@
54
53
  "tsup": "8.5.0",
55
54
  "typescript": "5.8.3",
56
55
  "prettier": "3.5.3",
57
- "tailwindcss": "^3.4.4",
56
+ "@tailwindcss/vite": "^4.1.0",
57
+ "tailwindcss": "^4.1.0",
58
58
  "tailwindcss-animate": "^1.0.7",
59
- "postcss": "^8.4.39",
59
+ "postcss": "^8.5.3",
60
60
  "autoprefixer": "^10.4.19"
61
61
  },
62
62
  "scripts": {
@@ -78,128 +78,155 @@
78
78
  "agentConfig": {
79
79
  "pluginType": "elizaos:plugin:1.0.0",
80
80
  "pluginParameters": {
81
- "OPENAI_API_KEY": {
82
- "type": "string",
83
- "description": "API key for authenticating requests to OpenAI services used by the Knowledge plugin.",
84
- "required": false
85
- },
86
- "OPENAI_EMBEDDING_MODEL": {
87
- "type": "string",
88
- "description": "Specifies the OpenAI embedding model to use when generating vector embeddings.",
89
- "required": false
90
- },
91
81
  "CTX_KNOWLEDGE_ENABLED": {
92
82
  "type": "boolean",
93
- "description": "Enables contextual knowledge functionality with enriched embeddings.",
94
- "required": false
95
- },
96
- "TEXT_PROVIDER": {
97
- "type": "string",
98
- "description": "LLM provider for text generation (e.g., openai, anthropic, openrouter, google).",
99
- "required": false
100
- },
101
- "TEXT_MODEL": {
102
- "type": "string",
103
- "description": "Name of the text generation model to use with the selected provider.",
104
- "required": false
105
- },
106
- "OPENROUTER_API_KEY": {
107
- "type": "string",
108
- "description": "API key for authenticating with the OpenRouter service when TEXT_PROVIDER=openrouter.",
109
- "required": false
83
+ "description": "Enables or disables contextual knowledge functionality; when set to 'true' additional text-generation settings are validated.",
84
+ "required": false,
85
+ "default": "false",
86
+ "sensitive": false
110
87
  },
111
- "ANTHROPIC_API_KEY": {
88
+ "EMBEDDING_PROVIDER": {
112
89
  "type": "string",
113
- "description": "API key for Anthropic models when TEXT_PROVIDER=anthropic.",
114
- "required": false
90
+ "description": "Specifies which provider to use for generating embeddings (e.g., openai, google). If omitted the code assumes 'openai' through plugin-openai.",
91
+ "required": false,
92
+ "default": "openai",
93
+ "sensitive": false
115
94
  },
116
- "GOOGLE_API_KEY": {
95
+ "OPENAI_API_KEY": {
117
96
  "type": "string",
118
- "description": "API key for Google AI models when TEXT_PROVIDER=google or EMBEDDING_PROVIDER=google.",
119
- "required": false
97
+ "description": "API key used to authenticate requests to OpenAI services for embeddings or text generation.",
98
+ "required": false,
99
+ "sensitive": true
120
100
  },
121
- "EMBEDDING_PROVIDER": {
101
+ "OPENAI_EMBEDDING_MODEL": {
122
102
  "type": "string",
123
- "description": "Provider to use for generating embeddings (e.g., openai, google).",
124
- "required": false
103
+ "description": "Name of the OpenAI embedding model; also used as a fallback for TEXT_EMBEDDING_MODEL when EMBEDDING_PROVIDER defaults to openai.",
104
+ "required": false,
105
+ "sensitive": false
125
106
  },
126
107
  "TEXT_EMBEDDING_MODEL": {
127
108
  "type": "string",
128
- "description": "Embedding model name to use with the selected EMBEDDING_PROVIDER.",
129
- "required": false
109
+ "description": "Embedding model name to use with the configured EMBEDDING_PROVIDER.",
110
+ "required": false,
111
+ "default": "text-embedding-3-small",
112
+ "sensitive": false
130
113
  },
131
114
  "EMBEDDING_DIMENSION": {
132
115
  "type": "number",
133
- "description": "Custom dimension size for generated embeddings.",
134
- "required": false
116
+ "description": "Custom embedding dimension size.",
117
+ "required": false,
118
+ "default": 1536,
119
+ "sensitive": false
135
120
  },
136
- "MAX_CONCURRENT_REQUESTS": {
121
+ "OPENAI_EMBEDDING_DIMENSIONS": {
137
122
  "type": "number",
138
- "description": "Maximum number of concurrent API requests allowed for rate limiting.",
123
+ "description": "Alternative variable to supply embedding dimension when using OpenAI.",
139
124
  "required": false,
140
- "default": 30
125
+ "default": 1536,
126
+ "sensitive": false
141
127
  },
142
- "REQUESTS_PER_MINUTE": {
143
- "type": "number",
144
- "description": "Maximum number of API requests permitted per minute.",
128
+ "TEXT_PROVIDER": {
129
+ "type": "string",
130
+ "description": "Provider to use for text generation when contextual knowledge is enabled (e.g., openai, anthropic, openrouter, google).",
145
131
  "required": false,
146
- "default": 60
132
+ "sensitive": false
147
133
  },
148
- "TOKENS_PER_MINUTE": {
149
- "type": "number",
150
- "description": "Maximum number of tokens that can be processed per minute.",
134
+ "ANTHROPIC_API_KEY": {
135
+ "type": "string",
136
+ "description": "API key for Anthropic text generation models.",
151
137
  "required": false,
152
- "default": 150000
138
+ "sensitive": true
139
+ },
140
+ "OPENROUTER_API_KEY": {
141
+ "type": "string",
142
+ "description": "API key for OpenRouter when using it as a text provider.",
143
+ "required": false,
144
+ "sensitive": true
145
+ },
146
+ "GOOGLE_API_KEY": {
147
+ "type": "string",
148
+ "description": "API key for Google AI services used for embeddings or text generation.",
149
+ "required": false,
150
+ "sensitive": true
153
151
  },
154
152
  "OPENAI_BASE_URL": {
155
153
  "type": "string",
156
154
  "description": "Custom base URL for routing OpenAI API requests (useful for proxies).",
157
- "required": false
155
+ "required": false,
156
+ "sensitive": false
158
157
  },
159
158
  "ANTHROPIC_BASE_URL": {
160
159
  "type": "string",
161
160
  "description": "Custom base URL for Anthropic API requests.",
162
- "required": false
161
+ "required": false,
162
+ "sensitive": false
163
163
  },
164
164
  "OPENROUTER_BASE_URL": {
165
165
  "type": "string",
166
166
  "description": "Custom base URL for OpenRouter API requests.",
167
- "required": false
167
+ "required": false,
168
+ "sensitive": false
168
169
  },
169
170
  "GOOGLE_BASE_URL": {
170
171
  "type": "string",
171
172
  "description": "Custom base URL for Google AI API requests.",
172
- "required": false
173
+ "required": false,
174
+ "sensitive": false
173
175
  },
174
- "KNOWLEDGE_PATH": {
176
+ "TEXT_MODEL": {
175
177
  "type": "string",
176
- "description": "Filesystem path where the plugin should look for knowledge documents.",
178
+ "description": "The specific text generation model to use with the selected TEXT_PROVIDER.",
177
179
  "required": false,
178
- "default": "./docs"
180
+ "sensitive": false
179
181
  },
180
182
  "MAX_INPUT_TOKENS": {
181
183
  "type": "number",
182
- "description": "Maximum number of input tokens allowed per request.",
184
+ "description": "Maximum number of input tokens permitted per request.",
183
185
  "required": false,
184
- "default": 4000
186
+ "default": 4000,
187
+ "sensitive": false
185
188
  },
186
189
  "MAX_OUTPUT_TOKENS": {
187
190
  "type": "number",
188
- "description": "Maximum number of output tokens that the model can generate.",
191
+ "description": "Maximum number of output tokens that can be generated.",
189
192
  "required": false,
190
- "default": 4096
193
+ "default": 4096,
194
+ "sensitive": false
191
195
  },
192
- "OPENAI_EMBEDDING_DIMENSIONS": {
196
+ "MAX_CONCURRENT_REQUESTS": {
197
+ "type": "number",
198
+ "description": "Upper bound on concurrent API requests for rate limiting.",
199
+ "required": false,
200
+ "default": 30,
201
+ "sensitive": false
202
+ },
203
+ "REQUESTS_PER_MINUTE": {
204
+ "type": "number",
205
+ "description": "Maximum number of API requests allowed per minute.",
206
+ "required": false,
207
+ "default": 60,
208
+ "sensitive": false
209
+ },
210
+ "TOKENS_PER_MINUTE": {
193
211
  "type": "number",
194
- "description": "Alternative environment variable for embedding dimension when using OpenAI.",
212
+ "description": "Maximum number of tokens that can be processed per minute.",
213
+ "required": false,
214
+ "default": 150000,
215
+ "sensitive": false
216
+ },
217
+ "KNOWLEDGE_PATH": {
218
+ "type": "string",
219
+ "description": "Filesystem path where the knowledge loader searches for documents. Overrides the default ./docs directory.",
195
220
  "required": false,
196
- "default": 1536
221
+ "default": "./docs",
222
+ "sensitive": false
197
223
  },
198
224
  "LOAD_DOCS_ON_STARTUP": {
199
225
  "type": "boolean",
200
- "description": "Determines whether documents should be automatically loaded from the docs folder when the plugin starts. Any value other than the string 'false' enables loading.",
226
+ "description": "Controls whether the plugin should automatically load documents from the docs folder when the agent starts. Any value other than the string 'false' enables loading.",
201
227
  "required": false,
202
- "default": true
228
+ "default": true,
229
+ "sensitive": false
203
230
  }
204
231
  }
205
232
  }
@@ -1 +0,0 @@
1
- *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background: 0 0% 97.65%;--foreground: 0 0% 12.55%;--muted: 0 0% 93.73%;--muted-foreground: 0 0% 39.22%;--popover: 0 0% 98.82%;--popover-foreground: 0 0% 12.55%;--card: 0 0% 98.82%;--card-foreground: 0 0% 12.55%;--border: 0 0% 84.71%;--input: 0 0% 94.12%;--primary: 22.93 92.59% 52.35%;--primary-foreground: 44 0% 100%;--secondary: 34.05 100% 85.49%;--secondary-foreground: 16.27 50.43% 22.94%;--accent: 0 0% 90.98%;--accent-foreground: 0 0% 12.55%;--destructive: 10.16 77.87% 53.92%;--destructive-foreground: 0 0% 100%;--ring: 24.8 79.79% 63.14%;--chart-1: 22.93 92.59% 52.35%;--chart-2: 34.05 100% 85.49%;--chart-3: 0 0% 90.98%;--chart-4: 34.05 100% 88.49%;--chart-5: 22.93 95.59% 52.35%;--radius: .5rem}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground))}.container{width:100%;margin-right:auto;margin-left:auto}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.visible{visibility:visible}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.left-3{left:.75rem}.left-4{left:1rem}.right-4{right:1rem}.top-16{top:4rem}.top-3{top:.75rem}.top-4{top:1rem}.z-50{z-index:50}.col-span-2{grid-column:span 2 / span 2}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.line-clamp-1{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.size-6{width:1.5rem;height:1.5rem}.h-1\/3{height:33.333333%}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-2\/3{height:66.666667%}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-40{height:10rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-9{height:2.25rem}.h-full{height:100%}.max-h-40{max-height:10rem}.max-h-\[95vh\]{max-height:95vh}.max-h-full{max-height:100%}.w-10{width:2.5rem}.w-12{width:3rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-6{width:1.5rem}.w-full{width:100%}.min-w-\[60px\]{min-width:60px}.min-w-full{min-width:100%}.max-w-\[95vw\]{max-width:95vw}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.resize{resize:both}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-1{row-gap:.25rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.border{border-width:1px}.border-0{border-width:0px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-border{border-color:hsl(var(--border))}.border-gray-500\/60{border-color:#6b728099}.border-input{border-color:hsl(var(--input))}.border-orange-600\/60{border-color:#ea580c99}.bg-accent{background-color:hsl(var(--accent))}.bg-accent\/20{background-color:hsl(var(--accent) / .2)}.bg-background{background-color:hsl(var(--background))}.bg-background\/80{background-color:hsl(var(--background) / .8)}.bg-card{background-color:hsl(var(--card))}.bg-card\/50{background-color:hsl(var(--card) / .5)}.bg-card\/90{background-color:hsl(var(--card) / .9)}.bg-destructive{background-color:hsl(var(--destructive))}.bg-destructive\/10{background-color:hsl(var(--destructive) / .1)}.bg-gray-400\/90{background-color:#9ca3afe6}.bg-muted{background-color:hsl(var(--muted))}.bg-muted\/30{background-color:hsl(var(--muted) / .3)}.bg-muted\/50{background-color:hsl(var(--muted) / .5)}.bg-orange-500\/90{background-color:#f97316e6}.bg-primary{background-color:hsl(var(--primary))}.bg-secondary{background-color:hsl(var(--secondary))}.p-0{padding:0}.p-1{padding:.25rem}.p-12{padding:3rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.pb-2{padding-bottom:.5rem}.pb-4{padding-bottom:1rem}.pl-10{padding-left:2.5rem}.pt-0{padding-top:0}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.tracking-tight{letter-spacing:-.025em}.text-accent-foreground{color:hsl(var(--accent-foreground))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-card-foreground{color:hsl(var(--card-foreground))}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-foreground{color:hsl(var(--foreground))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-primary\/80{color:hsl(var(--primary) / .8)}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-yellow-500{--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.opacity-0{opacity:0}.opacity-20{opacity:.2}.opacity-70{opacity:.7}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.duration-300{animation-duration:.3s}*{--background: 0 0% 6.67%;--foreground: 0 0% 93.33%;--muted: 0 0% 13.33%;--muted-foreground: 0 0% 70.59%;--popover: 0 0% 9.8%;--popover-foreground: 0 0% 93.33%;--card: 0 0% 9.8%;--card-foreground: 0 0% 93.33%;--border: 44 14% 11%;--input: 0 0% 28.24%;--primary: 22.93 92.59% 52.35%;--primary-foreground: 29.51 0% 100%;--secondary: 28.5 64.52% 12.16%;--secondary-foreground: 29.51 100% 88.04%;--accent: 0 0% 16.47%;--accent-foreground: 0 0% 93.33%;--destructive: 10.16 77.87% 53.92%;--destructive-foreground: 0 0% 100%;--ring: 23.11 59.8% 40%;--chart-1: 22.93 92.59% 52.35%;--chart-2: 28.5 64.52% 12.16%;--chart-3: 0 0% 16.47%;--chart-4: 28.5 64.52% 15.16%;--chart-5: 22.93 95.59% 52.35%;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.file\:border-0::file-selector-button{border-width:0px}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-accent\/10:hover{background-color:hsl(var(--accent) / .1)}.hover\:bg-destructive\/10:hover{background-color:hsl(var(--destructive) / .1)}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive) / .9)}.hover\:bg-muted\/50:hover{background-color:hsl(var(--muted) / .5)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary) / .9)}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-destructive:hover{color:hsl(var(--destructive))}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:opacity-100{opacity:1}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:hsl(var(--background))}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:hsl(var(--muted))}.data-\[state\=active\]\:text-foreground[data-state=active]{color:hsl(var(--foreground))}.data-\[state\=active\]\:shadow[data-state=active]{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\&\>\[role\=checkbox\]\]\:translate-y-\[2px\]>[role=checkbox]{--tw-translate-y: 2px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\[\&\>tr\]\:last\:border-b-0:last-child>tr{border-bottom-width:0px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-width:0px}.\[\&_tr\]\:border-b tr{border-bottom-width:1px}