snow-flow 8.5.7 → 8.6.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 (69) hide show
  1. package/.mcp.json.template +8 -0
  2. package/CLAUDE.md +52 -4
  3. package/README.md +99 -30
  4. package/{OPENCODE-SETUP.md → SNOWCODE-SETUP.md} +47 -21
  5. package/{OPENCODE-TROUBLESHOOTING.md → SNOWCODE-TROUBLESHOOTING.md} +18 -18
  6. package/dist/cli/auth.d.ts.map +1 -1
  7. package/dist/cli/auth.js +526 -280
  8. package/dist/cli/auth.js.map +1 -1
  9. package/dist/cli/enterprise.d.ts +36 -0
  10. package/dist/cli/enterprise.d.ts.map +1 -0
  11. package/dist/cli/enterprise.js +231 -0
  12. package/dist/cli/enterprise.js.map +1 -0
  13. package/dist/cli.d.ts +1 -1
  14. package/dist/cli.d.ts.map +1 -1
  15. package/dist/cli.js +544 -250
  16. package/dist/cli.js.map +1 -1
  17. package/dist/index.d.ts +1 -1
  18. package/dist/index.js +1 -1
  19. package/dist/mcp/clients/enterprise-remote-client.d.ts +78 -0
  20. package/dist/mcp/clients/enterprise-remote-client.d.ts.map +1 -0
  21. package/dist/mcp/clients/enterprise-remote-client.js +221 -0
  22. package/dist/mcp/clients/enterprise-remote-client.js.map +1 -0
  23. package/dist/mcp/servicenow-mcp-unified/tools/adapters/index.d.ts +0 -5
  24. package/dist/mcp/servicenow-mcp-unified/tools/adapters/index.d.ts.map +1 -1
  25. package/dist/mcp/servicenow-mcp-unified/tools/adapters/index.js +2 -18
  26. package/dist/mcp/servicenow-mcp-unified/tools/adapters/index.js.map +1 -1
  27. package/dist/templates/claude-md-template.d.ts +1 -1
  28. package/dist/templates/claude-md-template.js +1 -1
  29. package/dist/templates/readme-template.d.ts +1 -1
  30. package/dist/templates/readme-template.js +18 -18
  31. package/dist/utils/artifact-local-sync.d.ts +1 -1
  32. package/dist/utils/artifact-local-sync.js +4 -4
  33. package/dist/utils/snow-oauth.d.ts +11 -5
  34. package/dist/utils/snow-oauth.d.ts.map +1 -1
  35. package/dist/utils/snow-oauth.js +337 -90
  36. package/dist/utils/snow-oauth.js.map +1 -1
  37. package/dist/utils/{opencode-output-interceptor.d.ts → snowcode-output-interceptor.d.ts} +7 -7
  38. package/dist/utils/{opencode-output-interceptor.d.ts.map → snowcode-output-interceptor.d.ts.map} +1 -1
  39. package/dist/utils/{opencode-output-interceptor.js → snowcode-output-interceptor.js} +10 -10
  40. package/dist/utils/{opencode-output-interceptor.js.map → snowcode-output-interceptor.js.map} +1 -1
  41. package/package.json +20 -9
  42. package/scripts/{start-opencode.sh → start-snowcode.sh} +28 -28
  43. package/scripts/verify-snowcode-fork.sh +141 -0
  44. package/templates/snowcode-package.json +5 -0
  45. package/THEMES.md +0 -223
  46. package/bin/opencode +0 -17
  47. package/dist/mcp/servicenow-mcp-unified/config/tool-definitions.json +0 -3935
  48. package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_automation_discover.js +0 -164
  49. package/dist/mcp/servicenow-mcp-unified/tools/deployment/snow_artifact_transfer.js +0 -282
  50. package/dist/mcp/servicenow-mcp-unified/tools/filters/snow_build_filter.js +0 -171
  51. package/dist/mcp/servicenow-mcp-unified/tools/formatters/snow_format_value.js +0 -164
  52. package/dist/mcp/servicenow-mcp-unified/tools/knowledge/index.js.bak +0 -45
  53. package/dist/mcp/servicenow-mcp-unified/tools/local-sync/snow_artifact_sync.js +0 -172
  54. package/dist/mcp/servicenow-mcp-unified/tools/system-properties/index.js +0 -36
  55. package/dist/mcp/servicenow-mcp-unified/tools/ui-builder/snow_discover_uib.js +0 -296
  56. package/dist/mcp/servicenow-mcp-unified/tools/workspace/snow_create_ux_component.js +0 -292
  57. package/dist/memory/session-memory.d.ts +0 -80
  58. package/dist/memory/session-memory.d.ts.map +0 -1
  59. package/dist/memory/session-memory.js +0 -468
  60. package/dist/memory/session-memory.js.map +0 -1
  61. package/dist/templates/opencode-agents-template.d.ts +0 -2
  62. package/dist/templates/opencode-agents-template.d.ts.map +0 -1
  63. package/dist/templates/opencode-agents-template.js +0 -469
  64. package/dist/templates/opencode-agents-template.js.map +0 -1
  65. package/scripts/bulk-optimize-tools.js +0 -486
  66. package/scripts/optimize-mcp-tools.ts +0 -410
  67. package/themes/README.md +0 -83
  68. package/themes/servicenow.json +0 -117
  69. /package/{opencode-config.example.json → snowcode-config.example.json} +0 -0
@@ -1,410 +0,0 @@
1
- #!/usr/bin/env ts-node
2
- /**
3
- * MCP Tool Optimization Script
4
- *
5
- * Systematically optimizes all MCP tool definitions:
6
- * 1. Compress verbose descriptions
7
- * 2. Add categorization metadata
8
- * 3. Calculate token savings
9
- * 4. Validate all changes
10
- */
11
-
12
- import * as fs from 'fs';
13
- import * as path from 'path';
14
-
15
- // ============================================================================
16
- // CONFIGURATION
17
- // ============================================================================
18
-
19
- const TOOL_DIRS = [
20
- 'dist/mcp/servicenow-mcp-unified/tools',
21
- 'dist/mcp/snow-flow/tools'
22
- ];
23
-
24
- const OPTIMIZATION_RULES = {
25
- maxDescriptionWords: 8,
26
- maxPropertyDescWords: 5,
27
- removePatterns: [
28
- /Executes all \d+ steps automatically:/,
29
- /with automatic/,
30
- /comprehensive/,
31
- /advanced/,
32
- /flexible/,
33
- /powerful/,
34
- /complete/,
35
- /full support for/,
36
- /provides capability to/,
37
- /allows you to/,
38
- /enables/
39
- ],
40
- replacements: {
41
- 'Create a new': 'Create',
42
- 'Update an existing': 'Update',
43
- 'Delete an existing': 'Delete',
44
- 'Query for': 'Query',
45
- 'Search for': 'Search',
46
- 'Retrieve information about': 'Get',
47
- 'with filtering and pagination': ': filter, paginate',
48
- 'with role-based access control': 'with RBAC',
49
- 'Now Experience Framework': 'UX',
50
- 'UI Builder': 'UIB',
51
- 'Service Portal': 'SP',
52
- 'Configuration Management Database': 'CMDB'
53
- }
54
- };
55
-
56
- // ============================================================================
57
- // METADATA TAXONOMY
58
- // ============================================================================
59
-
60
- interface ToolMetadata {
61
- category: string;
62
- subcategory: string;
63
- use_cases: string[];
64
- complexity: 'beginner' | 'intermediate' | 'advanced' | 'expert';
65
- frequency: 'very-high' | 'high' | 'medium' | 'low';
66
- related_tools?: string[];
67
- }
68
-
69
- const CATEGORY_MAPPING: Record<string, ToolMetadata> = {
70
- // Core Operations
71
- 'operations/snow_query_table': {
72
- category: 'core-operations',
73
- subcategory: 'query',
74
- use_cases: ['data-retrieval', 'reporting', 'analysis'],
75
- complexity: 'beginner',
76
- frequency: 'very-high'
77
- },
78
- 'operations/snow_create_record': {
79
- category: 'core-operations',
80
- subcategory: 'crud',
81
- use_cases: ['data-creation', 'automation'],
82
- complexity: 'beginner',
83
- frequency: 'very-high'
84
- },
85
- 'operations/snow_update_record': {
86
- category: 'core-operations',
87
- subcategory: 'crud',
88
- use_cases: ['data-modification', 'automation'],
89
- complexity: 'beginner',
90
- frequency: 'very-high'
91
- },
92
- 'operations/snow_delete_record': {
93
- category: 'core-operations',
94
- subcategory: 'crud',
95
- use_cases: ['data-cleanup', 'maintenance'],
96
- complexity: 'intermediate',
97
- frequency: 'high'
98
- },
99
-
100
- // UI Builder
101
- 'ui-builder/snow_create_uib_page': {
102
- category: 'ui-frameworks',
103
- subcategory: 'ui-builder-pages',
104
- use_cases: ['workspace', 'portal', 'app-development'],
105
- complexity: 'intermediate',
106
- frequency: 'high',
107
- related_tools: ['snow_add_uib_page_element', 'snow_create_uib_data_broker']
108
- },
109
- 'ui-builder/snow_add_uib_page_element': {
110
- category: 'ui-frameworks',
111
- subcategory: 'ui-builder-components',
112
- use_cases: ['ui-composition', 'layout'],
113
- complexity: 'intermediate',
114
- frequency: 'high'
115
- },
116
-
117
- // Workspace
118
- 'workspace/snow_create_complete_workspace': {
119
- category: 'ui-frameworks',
120
- subcategory: 'workspace',
121
- use_cases: ['agent-workspace', 'ux-framework'],
122
- complexity: 'intermediate',
123
- frequency: 'high',
124
- related_tools: ['snow_create_uib_page', 'snow_create_ux_app_route']
125
- },
126
-
127
- // Update Sets
128
- 'update-sets/snow_update_set_create': {
129
- category: 'development',
130
- subcategory: 'update-sets',
131
- use_cases: ['change-tracking', 'deployment'],
132
- complexity: 'beginner',
133
- frequency: 'very-high'
134
- },
135
-
136
- // Automation
137
- 'automation/snow_execute_script_with_output': {
138
- category: 'automation',
139
- subcategory: 'script-execution',
140
- use_cases: ['testing', 'debugging', 'automation'],
141
- complexity: 'intermediate',
142
- frequency: 'very-high'
143
- }
144
- };
145
-
146
- // Auto-infer metadata from directory structure
147
- function inferMetadata(toolPath: string): ToolMetadata {
148
- const dirName = path.dirname(toolPath).split('/').pop() || '';
149
- const fileName = path.basename(toolPath, '.js');
150
-
151
- // Try exact match first
152
- const key = `${dirName}/${fileName}`;
153
- if (CATEGORY_MAPPING[key]) {
154
- return CATEGORY_MAPPING[key];
155
- }
156
-
157
- // Infer from directory name
158
- const categoryMap: Record<string, { category: string, subcategory: string, complexity: ToolMetadata['complexity'], frequency: ToolMetadata['frequency'] }> = {
159
- 'operations': { category: 'core-operations', subcategory: 'general', complexity: 'beginner', frequency: 'very-high' },
160
- 'ui-builder': { category: 'ui-frameworks', subcategory: 'ui-builder', complexity: 'intermediate', frequency: 'high' },
161
- 'workspace': { category: 'ui-frameworks', subcategory: 'workspace', complexity: 'intermediate', frequency: 'high' },
162
- 'service-portal': { category: 'ui-frameworks', subcategory: 'service-portal', complexity: 'intermediate', frequency: 'medium' },
163
- 'update-sets': { category: 'development', subcategory: 'update-sets', complexity: 'beginner', frequency: 'very-high' },
164
- 'deployment': { category: 'development', subcategory: 'deployment', complexity: 'intermediate', frequency: 'high' },
165
- 'automation': { category: 'automation', subcategory: 'script-execution', complexity: 'intermediate', frequency: 'high' },
166
- 'integration': { category: 'integration', subcategory: 'rest-soap', complexity: 'advanced', frequency: 'medium' },
167
- 'cmdb': { category: 'cmdb', subcategory: 'ci-management', complexity: 'intermediate', frequency: 'medium' },
168
- 'knowledge': { category: 'itsm', subcategory: 'knowledge', complexity: 'beginner', frequency: 'medium' },
169
- 'change': { category: 'itsm', subcategory: 'change', complexity: 'intermediate', frequency: 'high' },
170
- 'predictive-intelligence': { category: 'ml-analytics', subcategory: 'predictive-intelligence', complexity: 'advanced', frequency: 'medium' },
171
- 'performance-analytics': { category: 'ml-analytics', subcategory: 'performance-analytics', complexity: 'intermediate', frequency: 'medium' },
172
- 'flow-designer': { category: 'automation', subcategory: 'flow-designer', complexity: 'intermediate', frequency: 'medium' },
173
- 'local-sync': { category: 'development', subcategory: 'local-sync', complexity: 'intermediate', frequency: 'high' },
174
- 'system-properties': { category: 'core-operations', subcategory: 'properties', complexity: 'beginner', frequency: 'high' }
175
- };
176
-
177
- const inferred = categoryMap[dirName] || {
178
- category: 'advanced',
179
- subcategory: 'specialized',
180
- complexity: 'intermediate',
181
- frequency: 'low'
182
- };
183
-
184
- return {
185
- ...inferred,
186
- use_cases: [dirName.replace(/-/g, '_')]
187
- };
188
- }
189
-
190
- // ============================================================================
191
- // DESCRIPTION OPTIMIZATION
192
- // ============================================================================
193
-
194
- function optimizeDescription(description: string): string {
195
- let optimized = description;
196
-
197
- // Apply removal patterns
198
- OPTIMIZATION_RULES.removePatterns.forEach(pattern => {
199
- optimized = optimized.replace(pattern, '');
200
- });
201
-
202
- // Apply replacements
203
- Object.entries(OPTIMIZATION_RULES.replacements).forEach(([from, to]) => {
204
- optimized = optimized.replace(new RegExp(from, 'g'), to);
205
- });
206
-
207
- // Remove redundant whitespace
208
- optimized = optimized.replace(/\s+/g, ' ').trim();
209
-
210
- // Truncate to max words if needed
211
- const words = optimized.split(' ');
212
- if (words.length > OPTIMIZATION_RULES.maxDescriptionWords) {
213
- optimized = words.slice(0, OPTIMIZATION_RULES.maxDescriptionWords).join(' ');
214
- }
215
-
216
- return optimized;
217
- }
218
-
219
- function optimizePropertyDescription(description: string): string {
220
- let optimized = description;
221
-
222
- // Remove common redundant phrases
223
- optimized = optimized
224
- .replace(/^The /, '')
225
- .replace(/ \(optional\)$/, '')
226
- .replace(/ to use$/, '')
227
- .replace(/ for the /, ' for ')
228
- .replace(/ of the /, ' of ');
229
-
230
- // Truncate to max words
231
- const words = optimized.split(' ');
232
- if (words.length > OPTIMIZATION_RULES.maxPropertyDescWords) {
233
- optimized = words.slice(0, OPTIMIZATION_RULES.maxPropertyDescWords).join(' ');
234
- }
235
-
236
- return optimized;
237
- }
238
-
239
- // ============================================================================
240
- // TOKEN ESTIMATION
241
- // ============================================================================
242
-
243
- function estimateTokens(text: string): number {
244
- // Rough estimation: 1 token ≈ 4 characters for English
245
- return Math.ceil(text.length / 4);
246
- }
247
-
248
- function estimateToolTokens(toolDef: any): number {
249
- let total = 0;
250
-
251
- // Name
252
- total += estimateTokens(toolDef.name);
253
-
254
- // Description
255
- total += estimateTokens(toolDef.description);
256
-
257
- // Input schema
258
- if (toolDef.inputSchema) {
259
- total += estimateTokens(JSON.stringify(toolDef.inputSchema));
260
- }
261
-
262
- return total;
263
- }
264
-
265
- // ============================================================================
266
- // FILE PROCESSING
267
- // ============================================================================
268
-
269
- interface OptimizationResult {
270
- file: string;
271
- originalTokens: number;
272
- optimizedTokens: number;
273
- savings: number;
274
- metadata: ToolMetadata;
275
- changes: string[];
276
- }
277
-
278
- async function processToolFile(filePath: string): Promise<OptimizationResult | null> {
279
- try {
280
- const content = fs.readFileSync(filePath, 'utf-8');
281
-
282
- // Skip if not a tool file
283
- if (!content.includes('toolDefinition') || content.includes('index.js')) {
284
- return null;
285
- }
286
-
287
- // Extract current tool definition (regex-based parsing)
288
- const toolDefMatch = content.match(/exports\.toolDefinition\s*=\s*({[\s\S]*?});/);
289
- if (!toolDefMatch) {
290
- console.warn(`⚠️ Could not parse toolDefinition in ${filePath}`);
291
- return null;
292
- }
293
-
294
- // This is a simplified approach - in real implementation we'd use proper AST parsing
295
- // For now, we'll return a placeholder result
296
- const relativePath = path.relative(process.cwd(), filePath);
297
- const metadata = inferMetadata(relativePath);
298
-
299
- const result: OptimizationResult = {
300
- file: relativePath,
301
- originalTokens: 60, // Will calculate properly
302
- optimizedTokens: 35, // Will calculate properly
303
- savings: 25,
304
- metadata,
305
- changes: [
306
- 'Description optimized',
307
- 'Metadata added',
308
- 'Property descriptions compressed'
309
- ]
310
- };
311
-
312
- return result;
313
-
314
- } catch (error) {
315
- console.error(`❌ Error processing ${filePath}:`, error);
316
- return null;
317
- }
318
- }
319
-
320
- // ============================================================================
321
- // MAIN EXECUTION
322
- // ============================================================================
323
-
324
- async function main() {
325
- console.log('🚀 Starting MCP Tool Optimization...\n');
326
-
327
- const allResults: OptimizationResult[] = [];
328
- let totalOriginalTokens = 0;
329
- let totalOptimizedTokens = 0;
330
-
331
- for (const toolDir of TOOL_DIRS) {
332
- const fullPath = path.join(process.cwd(), toolDir);
333
-
334
- if (!fs.existsSync(fullPath)) {
335
- console.warn(`⚠️ Directory not found: ${toolDir}`);
336
- continue;
337
- }
338
-
339
- console.log(`📁 Processing: ${toolDir}`);
340
-
341
- // Recursively find all .js files
342
- const files = findJsFiles(fullPath);
343
- console.log(` Found ${files.length} tool files\n`);
344
-
345
- for (const file of files) {
346
- const result = await processToolFile(file);
347
- if (result) {
348
- allResults.push(result);
349
- totalOriginalTokens += result.originalTokens;
350
- totalOptimizedTokens += result.optimizedTokens;
351
- }
352
- }
353
- }
354
-
355
- // Print summary
356
- console.log('\n' + '='.repeat(80));
357
- console.log('📊 OPTIMIZATION SUMMARY');
358
- console.log('='.repeat(80));
359
- console.log(`Total tools processed: ${allResults.length}`);
360
- console.log(`Original tokens: ${totalOriginalTokens.toLocaleString()}`);
361
- console.log(`Optimized tokens: ${totalOptimizedTokens.toLocaleString()}`);
362
- console.log(`Total savings: ${(totalOriginalTokens - totalOptimizedTokens).toLocaleString()} tokens`);
363
- console.log(`Reduction: ${((1 - totalOptimizedTokens / totalOriginalTokens) * 100).toFixed(1)}%`);
364
- console.log('='.repeat(80));
365
-
366
- // Save detailed report
367
- const report = {
368
- timestamp: new Date().toISOString(),
369
- summary: {
370
- totalTools: allResults.length,
371
- originalTokens: totalOriginalTokens,
372
- optimizedTokens: totalOptimizedTokens,
373
- savings: totalOriginalTokens - totalOptimizedTokens,
374
- reductionPercent: ((1 - totalOptimizedTokens / totalOriginalTokens) * 100).toFixed(1)
375
- },
376
- results: allResults
377
- };
378
-
379
- const reportPath = path.join(process.cwd(), 'docs/optimization-report.json');
380
- fs.writeFileSync(reportPath, JSON.stringify(report, null, 2));
381
- console.log(`\n✅ Detailed report saved to: ${reportPath}`);
382
- }
383
-
384
- function findJsFiles(dir: string): string[] {
385
- const files: string[] = [];
386
-
387
- function traverse(currentDir: string) {
388
- const entries = fs.readdirSync(currentDir, { withFileTypes: true });
389
-
390
- for (const entry of entries) {
391
- const fullPath = path.join(currentDir, entry.name);
392
-
393
- if (entry.isDirectory()) {
394
- traverse(fullPath);
395
- } else if (entry.isFile() && entry.name.endsWith('.js') && !entry.name.endsWith('.map')) {
396
- files.push(fullPath);
397
- }
398
- }
399
- }
400
-
401
- traverse(dir);
402
- return files;
403
- }
404
-
405
- // Run if executed directly
406
- if (require.main === module) {
407
- main().catch(console.error);
408
- }
409
-
410
- export { optimizeDescription, optimizePropertyDescription, estimateTokens, inferMetadata };
package/themes/README.md DELETED
@@ -1,83 +0,0 @@
1
- # OpenCode Themes for Snow-Flow
2
-
3
- ## 🎨 ServiceNow Theme
4
-
5
- The **servicenow.json** theme provides an authentic ServiceNow Now Platform experience with official color schemes.
6
-
7
- ### Features
8
-
9
- - **Official ServiceNow Colors**: Uses the authentic ServiceNow blue (#0073CF) as primary color
10
- - **Dark & Light Mode Support**: Automatically adapts to your system preferences
11
- - **Optimized Syntax Highlighting**: ServiceNow-inspired colors for JavaScript, JSON, and other languages
12
- - **Professional UI**: Clean, modern interface matching ServiceNow's design language
13
-
14
- ### Color Palette
15
-
16
- | Color | Hex | Usage |
17
- |-------|-----|-------|
18
- | ServiceNow Blue | `#0073CF` | Primary actions, links, focus states |
19
- | Teal | `#00B0B9` | Secondary actions, info states |
20
- | Green | `#5BB85C` | Success states, added lines |
21
- | Orange | `#FF8C2B` | Warnings, modified lines |
22
- | Red | `#E53935` | Errors, removed lines |
23
- | Purple | `#7E57C2` | Keywords, operators |
24
-
25
- ### Activation
26
-
27
- The theme is automatically activated when you run OpenCode in the snow-flow-test-run directory.
28
-
29
- To manually switch themes:
30
- ```bash
31
- # Via OpenCode CLI
32
- opencode --theme servicenow
33
-
34
- # Or via config.json
35
- {
36
- "theme": "servicenow"
37
- }
38
- ```
39
-
40
- ### Customization
41
-
42
- To customize the theme, edit `servicenow.json`:
43
-
44
- ```json
45
- {
46
- "defs": {
47
- "my_custom_color": "#FF6B6B"
48
- },
49
- "theme": {
50
- "primary": "my_custom_color"
51
- }
52
- }
53
- ```
54
-
55
- ### Creating Your Own Theme
56
-
57
- 1. Create a new JSON file in `.opencode/themes/`
58
- 2. Copy the structure from `servicenow.json`
59
- 3. Customize colors in the `defs` and `theme` sections
60
- 4. Set `"theme": "your-theme-name"` in `.opencode/config.json`
61
-
62
- ## Available Themes
63
-
64
- - **servicenow** - Official ServiceNow Now Platform theme (default)
65
-
66
- ## Theme Schema
67
-
68
- For full theme documentation, see:
69
- - [OpenCode Theme Documentation](https://opencode.ai/docs/themes/)
70
- - [Theme JSON Schema](https://opencode.ai/theme.json)
71
-
72
- ## Contributing
73
-
74
- Want to create more themes for Snow-Flow? Submit a PR with:
75
- - Theme JSON file in this directory
76
- - Update this README with theme description
77
- - Screenshot of the theme in action
78
-
79
- Suggested themes:
80
- - **servicenow-dark** - Pure dark mode variant
81
- - **servicenow-light** - Pure light mode variant
82
- - **servicenow-high-contrast** - Accessibility-focused theme
83
- - **servicenow-retro** - Classic ServiceNow colors from early versions
@@ -1,117 +0,0 @@
1
- {
2
- "$schema": "https://opencode.ai/theme.json",
3
- "name": "ServiceNow",
4
- "description": "Official ServiceNow color scheme - inspired by the Now Platform",
5
- "author": "Snow-Flow Team",
6
- "version": "1.0.0",
7
- "defs": {
8
- "snow_blue": "#0073CF",
9
- "snow_blue_light": "#1E90FF",
10
- "snow_blue_dark": "#005BA1",
11
- "snow_teal": "#00B0B9",
12
- "snow_green": "#5BB85C",
13
- "snow_orange": "#FF8C2B",
14
- "snow_red": "#E53935",
15
- "snow_purple": "#7E57C2",
16
- "snow_gray_darker": "#1A1A1A",
17
- "snow_gray_dark": "#2B2F33",
18
- "snow_gray_medium": "#3E4345",
19
- "snow_gray": "#5F6D7E",
20
- "snow_gray_light": "#8B95A5",
21
- "snow_gray_lighter": "#D1D8DD",
22
- "snow_white": "#FFFFFF",
23
- "snow_off_white": "#F4F6F8",
24
- "snow_code_bg": "#282C34",
25
- "snow_selection": "#264F78"
26
- },
27
- "theme": {
28
- "primary": "snow_blue",
29
- "secondary": "snow_teal",
30
- "accent": "snow_blue_light",
31
- "error": "snow_red",
32
- "warning": "snow_orange",
33
- "success": "snow_green",
34
- "info": "snow_teal",
35
- "text": {
36
- "dark": "snow_white",
37
- "light": "snow_gray_darker"
38
- },
39
- "textMuted": {
40
- "dark": "snow_gray_light",
41
- "light": "snow_gray"
42
- },
43
- "background": {
44
- "dark": "snow_gray_dark",
45
- "light": "snow_white"
46
- },
47
- "backgroundAlt": {
48
- "dark": "snow_gray_medium",
49
- "light": "snow_off_white"
50
- },
51
- "border": {
52
- "dark": "snow_gray_medium",
53
- "light": "snow_gray_lighter"
54
- },
55
- "borderActive": "snow_blue",
56
- "selection": "snow_selection",
57
- "cursor": "snow_blue_light",
58
- "diffAdded": "snow_green",
59
- "diffRemoved": "snow_red",
60
- "diffModified": "snow_orange",
61
- "syntaxComment": {
62
- "dark": "snow_gray_light",
63
- "light": "snow_gray"
64
- },
65
- "syntaxKeyword": "snow_purple",
66
- "syntaxString": "snow_green",
67
- "syntaxNumber": "snow_orange",
68
- "syntaxFunction": "snow_blue_light",
69
- "syntaxVariable": {
70
- "dark": "snow_white",
71
- "light": "snow_gray_darker"
72
- },
73
- "syntaxType": "snow_teal",
74
- "syntaxConstant": "snow_orange",
75
- "syntaxOperator": "snow_purple",
76
- "syntaxPunctuation": {
77
- "dark": "snow_gray_light",
78
- "light": "snow_gray"
79
- },
80
- "syntaxAttribute": "snow_teal",
81
- "syntaxTag": "snow_red",
82
- "syntaxError": "snow_red",
83
- "linkText": "snow_blue",
84
- "linkUnderline": "snow_blue",
85
- "codeBackground": {
86
- "dark": "snow_code_bg",
87
- "light": "snow_off_white"
88
- },
89
- "codeBlockBackground": {
90
- "dark": "snow_gray_darker",
91
- "light": "snow_off_white"
92
- },
93
- "promptBackground": {
94
- "dark": "snow_gray_medium",
95
- "light": "snow_off_white"
96
- },
97
- "toolCallBackground": {
98
- "dark": "snow_gray_medium",
99
- "light": "snow_off_white"
100
- },
101
- "headerBackground": {
102
- "dark": "snow_gray_darker",
103
- "light": "snow_blue"
104
- },
105
- "headerText": "snow_white",
106
- "spinnerPrimary": "snow_blue",
107
- "spinnerSecondary": "snow_teal",
108
- "scrollbarThumb": {
109
- "dark": "snow_gray",
110
- "light": "snow_gray_light"
111
- },
112
- "scrollbarTrack": {
113
- "dark": "snow_gray_dark",
114
- "light": "snow_gray_lighter"
115
- }
116
- }
117
- }