create-merlin-brain 3.8.1 → 3.9.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 (134) hide show
  1. package/bin/install.cjs +126 -21
  2. package/dist/server/api/client.d.ts.map +1 -1
  3. package/dist/server/api/client.js +11 -7
  4. package/dist/server/api/client.js.map +1 -1
  5. package/dist/server/cost/classifier.d.ts +22 -0
  6. package/dist/server/cost/classifier.d.ts.map +1 -0
  7. package/dist/server/cost/classifier.js +137 -0
  8. package/dist/server/cost/classifier.js.map +1 -0
  9. package/dist/server/cost/tracker.d.ts +34 -0
  10. package/dist/server/cost/tracker.d.ts.map +1 -0
  11. package/dist/server/cost/tracker.js +81 -0
  12. package/dist/server/cost/tracker.js.map +1 -0
  13. package/dist/server/lang/detector.d.ts +17 -0
  14. package/dist/server/lang/detector.d.ts.map +1 -0
  15. package/dist/server/lang/detector.js +144 -0
  16. package/dist/server/lang/detector.js.map +1 -0
  17. package/dist/server/lang/rules.d.ts +21 -0
  18. package/dist/server/lang/rules.d.ts.map +1 -0
  19. package/dist/server/lang/rules.js +70 -0
  20. package/dist/server/lang/rules.js.map +1 -0
  21. package/dist/server/server.d.ts.map +1 -1
  22. package/dist/server/server.js +69 -32
  23. package/dist/server/server.js.map +1 -1
  24. package/dist/server/tools/adaptive.d.ts.map +1 -1
  25. package/dist/server/tools/adaptive.js +2 -1
  26. package/dist/server/tools/adaptive.js.map +1 -1
  27. package/dist/server/tools/agents-index.d.ts.map +1 -1
  28. package/dist/server/tools/agents-index.js +6 -3
  29. package/dist/server/tools/agents-index.js.map +1 -1
  30. package/dist/server/tools/agents.d.ts.map +1 -1
  31. package/dist/server/tools/agents.js +10 -5
  32. package/dist/server/tools/agents.js.map +1 -1
  33. package/dist/server/tools/auto-teach.d.ts.map +1 -1
  34. package/dist/server/tools/auto-teach.js +2 -1
  35. package/dist/server/tools/auto-teach.js.map +1 -1
  36. package/dist/server/tools/behaviors.d.ts.map +1 -1
  37. package/dist/server/tools/behaviors.js +8 -4
  38. package/dist/server/tools/behaviors.js.map +1 -1
  39. package/dist/server/tools/config-sync.d.ts.map +1 -1
  40. package/dist/server/tools/config-sync.js +8 -4
  41. package/dist/server/tools/config-sync.js.map +1 -1
  42. package/dist/server/tools/context.d.ts.map +1 -1
  43. package/dist/server/tools/context.js +66 -7
  44. package/dist/server/tools/context.js.map +1 -1
  45. package/dist/server/tools/cost.d.ts +7 -0
  46. package/dist/server/tools/cost.d.ts.map +1 -0
  47. package/dist/server/tools/cost.js +53 -0
  48. package/dist/server/tools/cost.js.map +1 -0
  49. package/dist/server/tools/discoveries.d.ts.map +1 -1
  50. package/dist/server/tools/discoveries.js +8 -11
  51. package/dist/server/tools/discoveries.js.map +1 -1
  52. package/dist/server/tools/lite.d.ts.map +1 -1
  53. package/dist/server/tools/lite.js +8 -4
  54. package/dist/server/tools/lite.js.map +1 -1
  55. package/dist/server/tools/project.d.ts.map +1 -1
  56. package/dist/server/tools/project.js +14 -7
  57. package/dist/server/tools/project.js.map +1 -1
  58. package/dist/server/tools/route.d.ts.map +1 -1
  59. package/dist/server/tools/route.js +76 -13
  60. package/dist/server/tools/route.js.map +1 -1
  61. package/dist/server/tools/sights-index.d.ts.map +1 -1
  62. package/dist/server/tools/sights-index.js +4 -2
  63. package/dist/server/tools/sights-index.js.map +1 -1
  64. package/dist/server/tools/verification.d.ts.map +1 -1
  65. package/dist/server/tools/verification.js +2 -1
  66. package/dist/server/tools/verification.js.map +1 -1
  67. package/files/agents/code-organization-supervisor.md +1 -0
  68. package/files/agents/context-guardian.md +1 -0
  69. package/files/agents/docs-keeper.md +1 -0
  70. package/files/agents/dry-refactor.md +1 -0
  71. package/files/agents/elite-code-refactorer.md +1 -0
  72. package/files/agents/hardening-guard.md +1 -0
  73. package/files/agents/implementation-dev.md +1 -0
  74. package/files/agents/merlin-api-designer.md +1 -0
  75. package/files/agents/merlin-codebase-mapper.md +4 -0
  76. package/files/agents/merlin-debugger.md +1 -0
  77. package/files/agents/merlin-executor.md +1 -0
  78. package/files/agents/merlin-frontend.md +1 -0
  79. package/files/agents/merlin-integration-checker.md +1 -0
  80. package/files/agents/merlin-migrator.md +1 -0
  81. package/files/agents/merlin-milestone-auditor.md +1 -0
  82. package/files/agents/merlin-performance.md +1 -0
  83. package/files/agents/merlin-planner.md +1 -0
  84. package/files/agents/merlin-researcher.md +4 -0
  85. package/files/agents/merlin-reviewer.md +1 -0
  86. package/files/agents/merlin-security.md +1 -0
  87. package/files/agents/merlin-verifier.md +1 -0
  88. package/files/agents/merlin-work-verifier.md +1 -0
  89. package/files/agents/merlin.md +1 -0
  90. package/files/agents/ops-railway.md +1 -0
  91. package/files/agents/orchestrator-retrofit.md +1 -0
  92. package/files/agents/product-spec.md +1 -0
  93. package/files/agents/remotion.md +1 -0
  94. package/files/agents/system-architect.md +1 -0
  95. package/files/agents/tests-qa.md +1 -0
  96. package/files/commands/merlin/help.md +11 -0
  97. package/files/commands/merlin/loop-recipes.md +73 -0
  98. package/files/hooks/agent-sync.sh +3 -0
  99. package/files/hooks/check-file-size.sh +12 -0
  100. package/files/hooks/config-change.sh +43 -0
  101. package/files/hooks/instructions-loaded.sh +34 -0
  102. package/files/hooks/session-start.sh +5 -1
  103. package/files/hooks/worktree-create.sh +44 -0
  104. package/files/hooks/worktree-remove.sh +36 -0
  105. package/files/loop/lib/agents.sh +3 -0
  106. package/files/loop/lib/blend-handoff.sh +3 -0
  107. package/files/loop/lib/blend-learn.sh +3 -0
  108. package/files/loop/lib/blend-parallel.sh +3 -0
  109. package/files/loop/lib/blend-verify.sh +3 -0
  110. package/files/loop/lib/blend.sh +3 -0
  111. package/files/loop/lib/boot.sh +3 -0
  112. package/files/loop/lib/context.sh +3 -0
  113. package/files/loop/lib/discuss.sh +3 -0
  114. package/files/loop/lib/modes.sh +3 -0
  115. package/files/loop/lib/progress.sh +3 -0
  116. package/files/loop/lib/safety.sh +3 -0
  117. package/files/loop/lib/session-end.sh +3 -0
  118. package/files/loop/lib/sights.sh +3 -0
  119. package/files/loop/lib/state.sh +3 -0
  120. package/files/loop/lib/teams.sh +3 -0
  121. package/files/loop/lib/timeout.sh +3 -0
  122. package/files/loop/lib/tui.sh +3 -0
  123. package/files/loop/lib/workflow-gen.sh +3 -0
  124. package/files/loop/lib/workflow-run.sh +3 -0
  125. package/files/loop/lib/workflow.sh +3 -0
  126. package/files/loop/merlin-loop.sh +3 -0
  127. package/files/loop/merlin-session.sh +3 -0
  128. package/package.json +2 -1
  129. package/rules/go.md +38 -0
  130. package/rules/java.md +36 -0
  131. package/rules/python.md +38 -0
  132. package/rules/rust.md +34 -0
  133. package/rules/swift.md +35 -0
  134. package/rules/typescript.md +38 -0
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Session Cost Tracker (in-memory)
3
+ *
4
+ * Tracks routing decisions and estimates cost savings vs always using Opus.
5
+ * Resets on each MCP server restart (per session).
6
+ */
7
+ import { randomUUID } from 'crypto';
8
+ // Estimated cost per routing call (rough approximation)
9
+ // These are per-message estimates for a typical agentic task
10
+ const COST_PER_CALL = {
11
+ haiku: 0.003,
12
+ sonnet: 0.015,
13
+ opus: 0.075,
14
+ };
15
+ // Baseline: cost if every routing call used Opus
16
+ const OPUS_BASELINE_COST = COST_PER_CALL.opus;
17
+ /** Normalize model string to haiku | sonnet | opus key */
18
+ function normalizeModel(model) {
19
+ const lower = model.toLowerCase();
20
+ if (lower.includes('haiku'))
21
+ return 'haiku';
22
+ if (lower.includes('sonnet'))
23
+ return 'sonnet';
24
+ return 'opus';
25
+ }
26
+ // Singleton session state
27
+ const SESSION_ID = randomUUID();
28
+ const state = {
29
+ sessionId: SESSION_ID,
30
+ totalCalls: 0,
31
+ byModel: {
32
+ haiku: { calls: 0, estimatedCost: 0 },
33
+ sonnet: { calls: 0, estimatedCost: 0 },
34
+ opus: { calls: 0, estimatedCost: 0 },
35
+ },
36
+ savedVsBaseline: 0,
37
+ totalEstimatedCost: 0,
38
+ };
39
+ /**
40
+ * Record a routing decision. Call this each time a task is routed to an agent.
41
+ */
42
+ export function recordRouting(model, _taskComplexity) {
43
+ const key = normalizeModel(model);
44
+ const cost = COST_PER_CALL[key] ?? COST_PER_CALL.opus;
45
+ state.totalCalls += 1;
46
+ state.byModel[key].calls += 1;
47
+ state.byModel[key].estimatedCost = parseFloat((state.byModel[key].estimatedCost + cost).toFixed(6));
48
+ state.totalEstimatedCost = parseFloat((state.totalEstimatedCost + cost).toFixed(6));
49
+ // Savings: how much cheaper vs always using Opus
50
+ const baselineCostForThisCall = OPUS_BASELINE_COST;
51
+ const saved = baselineCostForThisCall - cost;
52
+ state.savedVsBaseline = parseFloat((state.savedVsBaseline + saved).toFixed(6));
53
+ }
54
+ /**
55
+ * Get a snapshot of current session costs.
56
+ */
57
+ export function getSessionCost() {
58
+ return {
59
+ sessionId: state.sessionId,
60
+ totalCalls: state.totalCalls,
61
+ byModel: {
62
+ haiku: { ...state.byModel.haiku },
63
+ sonnet: { ...state.byModel.sonnet },
64
+ opus: { ...state.byModel.opus },
65
+ },
66
+ savedVsBaseline: state.savedVsBaseline,
67
+ totalEstimatedCost: state.totalEstimatedCost,
68
+ };
69
+ }
70
+ /**
71
+ * Reset session counters (useful for testing or explicit reset).
72
+ */
73
+ export function resetSession() {
74
+ state.totalCalls = 0;
75
+ state.byModel.haiku = { calls: 0, estimatedCost: 0 };
76
+ state.byModel.sonnet = { calls: 0, estimatedCost: 0 };
77
+ state.byModel.opus = { calls: 0, estimatedCost: 0 };
78
+ state.savedVsBaseline = 0;
79
+ state.totalEstimatedCost = 0;
80
+ }
81
+ //# sourceMappingURL=tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracker.js","sourceRoot":"","sources":["../../../src/server/cost/tracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Language Detector
3
+ * Detects the primary programming language from Sights manifest data.
4
+ */
5
+ export type Language = 'typescript' | 'python' | 'go' | 'swift' | 'java' | 'rust' | 'unknown';
6
+ export interface LanguageProfile {
7
+ primary: Language;
8
+ secondary: Language[];
9
+ frameworks: string[];
10
+ confidence: number;
11
+ }
12
+ /**
13
+ * Detect primary language from Sights manifest data.
14
+ * Priority: techStack → package manager files → file extension counts
15
+ */
16
+ export declare function detectLanguage(manifest: Record<string, unknown>): LanguageProfile;
17
+ //# sourceMappingURL=detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../../src/server/lang/detector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,QAAQ,GAAG,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAE9F,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,QAAQ,CAAC;IAClB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AA6DD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,CAuDjF"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Language Detector
3
+ * Detects the primary programming language from Sights manifest data.
4
+ */
5
+ /** Map from Sights techStack name → Language */
6
+ const TECH_STACK_MAP = {
7
+ TypeScript: 'typescript',
8
+ JavaScript: 'typescript', // treat JS as TS family
9
+ 'Node.js': 'typescript',
10
+ Python: 'python',
11
+ Go: 'go',
12
+ Swift: 'swift',
13
+ Java: 'java',
14
+ Kotlin: 'java', // JVM family
15
+ Rust: 'rust',
16
+ };
17
+ /** Package manager filename → language (highest priority) */
18
+ const PACKAGE_MANAGER_MAP = {
19
+ 'package.json': 'typescript',
20
+ 'pyproject.toml': 'python',
21
+ 'requirements.txt': 'python',
22
+ 'setup.py': 'python',
23
+ 'go.mod': 'go',
24
+ 'Package.swift': 'swift',
25
+ 'pom.xml': 'java',
26
+ 'build.gradle': 'java',
27
+ 'build.gradle.kts': 'java',
28
+ 'Cargo.toml': 'rust',
29
+ };
30
+ /** File extension → language */
31
+ const EXTENSION_MAP = {
32
+ '.ts': 'typescript',
33
+ '.tsx': 'typescript',
34
+ '.js': 'typescript',
35
+ '.jsx': 'typescript',
36
+ '.mjs': 'typescript',
37
+ '.cjs': 'typescript',
38
+ '.py': 'python',
39
+ '.go': 'go',
40
+ '.swift': 'swift',
41
+ '.java': 'java',
42
+ '.kt': 'java',
43
+ '.kts': 'java',
44
+ '.rs': 'rust',
45
+ };
46
+ function countBy(arr, key) {
47
+ const counts = new Map();
48
+ for (const item of arr) {
49
+ const lang = key(item);
50
+ if (lang !== 'unknown')
51
+ counts.set(lang, (counts.get(lang) ?? 0) + 1);
52
+ }
53
+ return counts;
54
+ }
55
+ function topLanguages(counts) {
56
+ return [...counts.entries()]
57
+ .sort((a, b) => b[1] - a[1])
58
+ .map(([lang]) => lang);
59
+ }
60
+ /**
61
+ * Detect primary language from Sights manifest data.
62
+ * Priority: techStack → package manager files → file extension counts
63
+ */
64
+ export function detectLanguage(manifest) {
65
+ const project = manifest?.project;
66
+ const techStack = Array.isArray(project?.techStack)
67
+ ? project.techStack
68
+ : [];
69
+ const frameworks = Array.isArray(project?.frameworks)
70
+ ? project.frameworks
71
+ : [];
72
+ const fileList = extractFilePaths(manifest);
73
+ // --- Priority 1: Sights techStack field ---
74
+ const techHits = new Map();
75
+ for (const tech of techStack) {
76
+ const lang = TECH_STACK_MAP[tech];
77
+ if (lang)
78
+ techHits.set(lang, (techHits.get(lang) ?? 0) + 2); // weight 2
79
+ }
80
+ // --- Priority 2: Package manager detection from file list ---
81
+ const pmHits = new Map();
82
+ for (const filePath of fileList) {
83
+ const basename = filePath.split('/').pop() ?? '';
84
+ const lang = PACKAGE_MANAGER_MAP[basename];
85
+ if (lang)
86
+ pmHits.set(lang, (pmHits.get(lang) ?? 0) + 3); // weight 3
87
+ }
88
+ // --- Priority 3: File extension counts ---
89
+ const extCounts = countBy(fileList, (f) => {
90
+ const ext = '.' + (f.split('.').pop() ?? '');
91
+ return EXTENSION_MAP[ext] ?? 'unknown';
92
+ });
93
+ // Merge all scores
94
+ const scores = new Map();
95
+ const addAll = (m) => {
96
+ for (const [lang, score] of m) {
97
+ scores.set(lang, (scores.get(lang) ?? 0) + score);
98
+ }
99
+ };
100
+ addAll(techHits);
101
+ addAll(pmHits);
102
+ addAll(extCounts);
103
+ const ranked = topLanguages(scores);
104
+ const primary = ranked[0] ?? 'unknown';
105
+ const secondary = ranked.slice(1).filter(l => l !== primary);
106
+ // Confidence: high if techStack or pm gave a clear signal
107
+ const topScore = scores.get(primary) ?? 0;
108
+ const totalScore = [...scores.values()].reduce((a, b) => a + b, 0);
109
+ const confidence = totalScore === 0 ? 0 : Math.min(1, topScore / totalScore + (techHits.has(primary) ? 0.2 : 0));
110
+ return { primary, secondary, frameworks, confidence };
111
+ }
112
+ /** Extract all file paths from a Sights manifest (various schemas) */
113
+ function extractFilePaths(manifest) {
114
+ const paths = [];
115
+ // serviceMap contains files
116
+ const serviceMap = manifest?.serviceMap;
117
+ if (Array.isArray(serviceMap)) {
118
+ for (const service of serviceMap) {
119
+ if (service && typeof service === 'object') {
120
+ const files = service.files;
121
+ if (Array.isArray(files)) {
122
+ for (const f of files) {
123
+ if (typeof f === 'string')
124
+ paths.push(f);
125
+ else if (f && typeof f === 'object' && typeof f.path === 'string') {
126
+ paths.push(f.path);
127
+ }
128
+ }
129
+ }
130
+ }
131
+ }
132
+ }
133
+ // entryPoints
134
+ const entryPoints = manifest?.entryPoints;
135
+ if (Array.isArray(entryPoints)) {
136
+ for (const ep of entryPoints) {
137
+ if (ep && typeof ep === 'object' && typeof ep.path === 'string') {
138
+ paths.push(ep.path);
139
+ }
140
+ }
141
+ }
142
+ return paths;
143
+ }
144
+ //# sourceMappingURL=detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../../src/server/lang/detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Language Rule Loader & Composer
3
+ * Loads language-specific markdown rule files and composes them with project rules.
4
+ */
5
+ import type { LanguageProfile } from './detector.js';
6
+ /**
7
+ * Get the language rules markdown for the detected profile.
8
+ * Returns the primary language rules only (secondary languages are lower signal).
9
+ */
10
+ export declare function getLanguageRules(profile: LanguageProfile): string;
11
+ /**
12
+ * Compose final rules output in priority order:
13
+ * 1. Language defaults (lowest priority)
14
+ * 2. Project conventions from Sights
15
+ * 3. Custom user rules (merlin_save_rule)
16
+ *
17
+ * Later entries override earlier ones when conflicting.
18
+ * Returns a formatted markdown string ready for injection into context responses.
19
+ */
20
+ export declare function composeRules(langRules: string, projectRules: string[], customRules: string[]): string;
21
+ //# sourceMappingURL=rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../../src/server/lang/rules.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAY,eAAe,EAAE,MAAM,eAAe,CAAC;AAsC/D;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAEjE;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EAAE,EACtB,WAAW,EAAE,MAAM,EAAE,GACpB,MAAM,CAgBR"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Language Rule Loader & Composer
3
+ * Loads language-specific markdown rule files and composes them with project rules.
4
+ */
5
+ import { readFileSync } from 'fs';
6
+ import { fileURLToPath } from 'url';
7
+ import { join, dirname } from 'path';
8
+ // Resolve package root relative to compiled dist/server/lang/rules.js
9
+ // dist/server/lang → dist/server → dist → package root
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ const __dirname = dirname(__filename);
12
+ const RULES_DIR = join(__dirname, '..', '..', '..', 'rules');
13
+ const RULE_FILES = {
14
+ typescript: 'typescript.md',
15
+ python: 'python.md',
16
+ go: 'go.md',
17
+ swift: 'swift.md',
18
+ java: 'java.md',
19
+ rust: 'rust.md',
20
+ unknown: null,
21
+ };
22
+ /** Simple in-memory cache for loaded rule file contents */
23
+ const ruleCache = new Map();
24
+ /** Load rules markdown for a language (cached after first read) */
25
+ function loadRuleFile(language) {
26
+ if (ruleCache.has(language))
27
+ return ruleCache.get(language);
28
+ const filename = RULE_FILES[language];
29
+ if (!filename)
30
+ return '';
31
+ try {
32
+ const content = readFileSync(join(RULES_DIR, filename), 'utf-8');
33
+ ruleCache.set(language, content);
34
+ return content;
35
+ }
36
+ catch {
37
+ // Rule file not found — not a fatal error
38
+ return '';
39
+ }
40
+ }
41
+ /**
42
+ * Get the language rules markdown for the detected profile.
43
+ * Returns the primary language rules only (secondary languages are lower signal).
44
+ */
45
+ export function getLanguageRules(profile) {
46
+ return loadRuleFile(profile.primary);
47
+ }
48
+ /**
49
+ * Compose final rules output in priority order:
50
+ * 1. Language defaults (lowest priority)
51
+ * 2. Project conventions from Sights
52
+ * 3. Custom user rules (merlin_save_rule)
53
+ *
54
+ * Later entries override earlier ones when conflicting.
55
+ * Returns a formatted markdown string ready for injection into context responses.
56
+ */
57
+ export function composeRules(langRules, projectRules, customRules) {
58
+ const sections = [];
59
+ if (langRules) {
60
+ sections.push(langRules);
61
+ }
62
+ if (projectRules.length > 0) {
63
+ sections.push('## Project-Specific Rules\n' + projectRules.map(r => `- ${r}`).join('\n'));
64
+ }
65
+ if (customRules.length > 0) {
66
+ sections.push('## Your Custom Rules\n' + customRules.map(r => `- ${r}`).join('\n'));
67
+ }
68
+ return sections.join('\n\n');
69
+ }
70
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../../src/server/lang/rules.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGrC,sEAAsE;AACtE,uDAAuD;AACvD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAE7D,MAAM,UAAU,GAAoC;IAClD,UAAU,EAAE,eAAe;IAC3B,MAAM,EAAE,WAAW;IACnB,EAAE,EAAE,OAAO;IACX,KAAK,EAAE,UAAU;IACjB,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,IAAI;CACd,CAAC;AAEF,2DAA2D;AAC3D,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;AAE9C,mEAAmE;AACnE,SAAS,YAAY,CAAC,QAAkB;IACtC,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;IAE7D,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IAEzB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;QACjE,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjC,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,0CAA0C;QAC1C,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAwB;IACvD,OAAO,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACvC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAC1B,SAAiB,EACjB,YAAsB,EACtB,WAAqB;IAErB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,SAAS,EAAE,CAAC;QACd,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,QAAQ,CAAC,IAAI,CAAC,6BAA6B,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5F,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC,wBAAwB,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtF,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA4CpE,0CAA0C;AAC1C,wBAAgB,YAAY,IAAI,SAAS,CAs1FxC;AAED,gDAAgD;AAChD,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAoCjD"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA6CpE,0CAA0C;AAC1C,wBAAgB,YAAY,IAAI,SAAS,CA23FxC;AAED,gDAAgD;AAChD,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAoCjD"}