midas-mcp 5.5.0 → 5.15.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/dist/context.js CHANGED
@@ -1,433 +1,14 @@
1
1
  /**
2
- * Context Compression and Management for Midas
2
+ * Context Utilities for Midas
3
3
  *
4
- * Implements the "Lost in the Middle" principle:
5
- * - BEGINNING: Stable context (methodology, current phase)
6
- * - MIDDLE: Project context (summarized)
7
- * - END: Recent context (full detail)
4
+ * Token estimation for prompt building.
5
+ *
6
+ * Note: Context compression via system/user prompt split is handled in analyzer.ts.
7
+ * The system prompt contains stable methodology (cached by Claude API).
8
+ * The user prompt contains dynamic project state (not cached).
8
9
  */
9
- import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
10
- import { join } from 'path';
11
- import { loadState } from './state/phase.js';
12
- import { loadTracker, getGatesStatus, getUnresolvedErrors } from './tracker.js';
13
- import { getJournalEntries } from './tools/journal.js';
14
- import { sanitizePath } from './security.js';
15
- const MIDAS_DIR = '.midas';
16
- const CACHE_FILE = 'context-cache.json';
17
10
  // Token estimation (rough: 1 token ≈ 4 chars for English)
18
11
  export function estimateTokens(text) {
19
12
  return Math.ceil(text.length / 4);
20
13
  }
21
- function getCachePath(projectPath) {
22
- return join(projectPath, MIDAS_DIR, CACHE_FILE);
23
- }
24
- function loadCache(projectPath) {
25
- const path = getCachePath(projectPath);
26
- if (existsSync(path)) {
27
- try {
28
- return JSON.parse(readFileSync(path, 'utf-8'));
29
- }
30
- catch {
31
- return {};
32
- }
33
- }
34
- return {};
35
- }
36
- function saveCache(projectPath, cache) {
37
- const dir = join(projectPath, MIDAS_DIR);
38
- if (!existsSync(dir)) {
39
- mkdirSync(dir, { recursive: true });
40
- }
41
- writeFileSync(getCachePath(projectPath), JSON.stringify(cache, null, 2));
42
- }
43
- export function getCachedSummary(projectPath, content, maxTokens) {
44
- const cache = loadCache(projectPath);
45
- const key = `${simpleHash(content)}-${maxTokens}`;
46
- const entry = cache[key];
47
- if (entry && Date.now() - entry.timestamp < 3600000) { // 1 hour cache
48
- return entry.summary;
49
- }
50
- return null;
51
- }
52
- export function setCachedSummary(projectPath, content, maxTokens, summary) {
53
- const cache = loadCache(projectPath);
54
- const key = `${simpleHash(content)}-${maxTokens}`;
55
- cache[key] = {
56
- summary,
57
- timestamp: Date.now(),
58
- originalTokens: estimateTokens(content),
59
- summaryTokens: estimateTokens(summary),
60
- };
61
- // Keep cache size reasonable (max 100 entries)
62
- const keys = Object.keys(cache);
63
- if (keys.length > 100) {
64
- const oldest = keys
65
- .sort((a, b) => cache[a].timestamp - cache[b].timestamp)
66
- .slice(0, 20);
67
- oldest.forEach(k => delete cache[k]);
68
- }
69
- saveCache(projectPath, cache);
70
- }
71
- /**
72
- * Get cache statistics for monitoring
73
- */
74
- export function getCacheStats(projectPath) {
75
- const cache = loadCache(projectPath);
76
- const entries = Object.values(cache);
77
- const totalOriginal = entries.reduce((sum, e) => sum + e.originalTokens, 0);
78
- const totalSummary = entries.reduce((sum, e) => sum + e.summaryTokens, 0);
79
- return {
80
- entries: entries.length,
81
- totalOriginalTokens: totalOriginal,
82
- totalSummaryTokens: totalSummary,
83
- tokensSaved: totalOriginal - totalSummary,
84
- };
85
- }
86
- function simpleHash(str) {
87
- let hash = 0;
88
- for (let i = 0; i < str.length; i++) {
89
- const char = str.charCodeAt(i);
90
- hash = ((hash << 5) - hash) + char;
91
- hash = hash & hash;
92
- }
93
- return Math.abs(hash).toString(36);
94
- }
95
- // ============================================================================
96
- // COMPRESSION STRATEGIES
97
- // ============================================================================
98
- /**
99
- * Truncate text to approximate token limit, preferring sentence boundaries
100
- */
101
- export function truncateToTokens(text, maxTokens) {
102
- const currentTokens = estimateTokens(text);
103
- if (currentTokens <= maxTokens)
104
- return text;
105
- const targetChars = maxTokens * 4;
106
- let truncated = text.slice(0, targetChars);
107
- // Try to end at sentence boundary
108
- const lastPeriod = truncated.lastIndexOf('. ');
109
- const lastNewline = truncated.lastIndexOf('\n');
110
- const boundary = Math.max(lastPeriod, lastNewline);
111
- if (boundary > targetChars * 0.7) {
112
- truncated = truncated.slice(0, boundary + 1);
113
- }
114
- return truncated + '...';
115
- }
116
- /**
117
- * Extract key points from text (simple keyword-based)
118
- */
119
- export function extractKeyPoints(text, maxPoints = 5) {
120
- const lines = text.split('\n').filter(l => l.trim());
121
- const points = [];
122
- // Prioritize lines with key indicators
123
- const keyIndicators = ['error', 'fix', 'implement', 'test', 'build', 'deploy', 'decision', 'chose', 'because'];
124
- for (const line of lines) {
125
- if (points.length >= maxPoints)
126
- break;
127
- const lower = line.toLowerCase();
128
- if (keyIndicators.some(k => lower.includes(k))) {
129
- points.push(line.trim().slice(0, 100));
130
- }
131
- }
132
- // Fill with first lines if not enough
133
- for (const line of lines) {
134
- if (points.length >= maxPoints)
135
- break;
136
- if (!points.includes(line.trim().slice(0, 100))) {
137
- points.push(line.trim().slice(0, 100));
138
- }
139
- }
140
- return points;
141
- }
142
- /**
143
- * Hierarchical summarization - more detail for recent, less for old
144
- * Level 1 (most recent): Title + 3 key points
145
- * Level 2 (recent): Title + 1 key point
146
- * Level 3 (older): Just title
147
- */
148
- export function summarizeJournalEntries(entries) {
149
- if (entries.length === 0)
150
- return 'No journal entries.';
151
- const lines = [];
152
- for (let i = 0; i < entries.length && i < 7; i++) {
153
- const entry = entries[i];
154
- const date = entry.timestamp.slice(0, 10);
155
- if (i === 0) {
156
- // Most recent: full detail
157
- const keyPoints = extractKeyPoints(entry.conversation, 3);
158
- lines.push(`- ${date}: ${entry.title}`);
159
- keyPoints.forEach(p => lines.push(` > ${p.slice(0, 100)}`));
160
- }
161
- else if (i < 3) {
162
- // Recent: title + 1 key point
163
- const keyPoints = extractKeyPoints(entry.conversation, 1);
164
- lines.push(`- ${date}: ${entry.title}`);
165
- if (keyPoints.length > 0) {
166
- lines.push(` > ${keyPoints[0].slice(0, 80)}`);
167
- }
168
- }
169
- else {
170
- // Older: just title
171
- lines.push(`- ${date}: ${entry.title}`);
172
- }
173
- }
174
- return lines.join('\n');
175
- }
176
- /**
177
- * Get code snippets from recently modified files.
178
- * Read substantially more context for accurate analysis.
179
- */
180
- export function getCodeSnippets(projectPath, maxFiles = 15, maxLinesPerFile = 100) {
181
- const tracker = loadTracker(projectPath);
182
- const snippets = [];
183
- const codeExtensions = ['.ts', '.tsx', '.js', '.jsx', '.py', '.go', '.rs', '.swift'];
184
- // Prioritize test files and key entry points
185
- const allCodeFiles = tracker.recentFiles.filter(f => codeExtensions.some(ext => f.path.endsWith(ext)));
186
- const priorityPatterns = ['.test.', '.spec.', 'index.', 'main.', 'app.', 'server.'];
187
- const priorityFiles = allCodeFiles.filter(f => priorityPatterns.some(p => f.path.includes(p)));
188
- const otherFiles = allCodeFiles.filter(f => !priorityPatterns.some(p => f.path.includes(p)));
189
- const recentCodeFiles = [...priorityFiles, ...otherFiles].slice(0, maxFiles);
190
- for (const file of recentCodeFiles) {
191
- try {
192
- const fullPath = join(projectPath, file.path);
193
- if (!existsSync(fullPath))
194
- continue;
195
- const content = readFileSync(fullPath, 'utf-8');
196
- const lines = content.split('\n');
197
- // For large files, take beginning + end (important context at both ends)
198
- let snippet;
199
- if (lines.length <= maxLinesPerFile) {
200
- snippet = content;
201
- }
202
- else {
203
- const head = lines.slice(0, Math.floor(maxLinesPerFile * 0.7));
204
- const tail = lines.slice(-Math.floor(maxLinesPerFile * 0.3));
205
- snippet = [...head, '\n// ... middle truncated ...\n', ...tail].join('\n');
206
- }
207
- snippets.push(`--- ${file.path} ---\n${snippet}`);
208
- }
209
- catch {
210
- // Skip files we can't read
211
- }
212
- }
213
- return snippets.join('\n\n');
214
- }
215
- // ============================================================================
216
- // CONTEXT BUILDING
217
- // ============================================================================
218
- const METHODOLOGY_COMPRESSED = `Golden Code: PLAN (plan) → BUILD (code) → SHIP (deploy) → GROW (iterate)
219
- BUILD cycle: RULES → INDEX → READ → RESEARCH → IMPLEMENT → TEST → DEBUG
220
- If stuck: Tornado (research + logs + tests). If output doesn't fit: Horizon (expand context).
221
- Gates must pass (build/test/lint) before advancing.`;
222
- export function buildCompressedContext(projectPath, options = {}) {
223
- const safePath = sanitizePath(projectPath);
224
- // Dynamic budget: increase when errors present
225
- const errors = getUnresolvedErrors(safePath);
226
- const hasErrors = errors.length > 0;
227
- const baseTokens = options.maxTokens || 4000;
228
- // Give 50% more budget when debugging errors
229
- const maxTokens = hasErrors ? Math.floor(baseTokens * 1.5) : baseTokens;
230
- const includeCode = options.includeCode ?? true; // Default to including code
231
- const layers = [];
232
- let totalTokens = 0;
233
- // ─────────────────────────────────────────────────────────────────────────
234
- // BEGINNING: Stable context (high attention)
235
- // ─────────────────────────────────────────────────────────────────────────
236
- // Layer 1: Methodology (always, ~100 tokens)
237
- layers.push({
238
- name: 'methodology',
239
- priority: 'critical',
240
- position: 'beginning',
241
- content: METHODOLOGY_COMPRESSED,
242
- tokens: estimateTokens(METHODOLOGY_COMPRESSED),
243
- });
244
- // Layer 2: Current state
245
- const state = loadState(safePath);
246
- const tracker = loadTracker(safePath);
247
- const gatesStatus = getGatesStatus(safePath);
248
- const stateContent = [
249
- `Phase: ${state.current.phase}${'step' in state.current ? ` → ${state.current.step}` : ''}`,
250
- `Gates: ${gatesStatus.allPass ? 'ALL PASS' : gatesStatus.failing.length > 0 ? `FAILING: ${gatesStatus.failing.join(', ')}` : 'not run'}`,
251
- tracker.currentTask ? `Task: ${tracker.currentTask.description}` : '',
252
- ].filter(Boolean).join('\n');
253
- layers.push({
254
- name: 'current_state',
255
- priority: 'critical',
256
- position: 'beginning',
257
- content: stateContent,
258
- tokens: estimateTokens(stateContent),
259
- });
260
- // ─────────────────────────────────────────────────────────────────────────
261
- // MIDDLE: Project context (lower attention, summarized)
262
- // ─────────────────────────────────────────────────────────────────────────
263
- // Layer 3: Journal summaries
264
- const journalEntries = getJournalEntries({ projectPath: safePath, limit: 5 });
265
- const journalSummary = summarizeJournalEntries(journalEntries);
266
- layers.push({
267
- name: 'journal_summary',
268
- priority: 'medium',
269
- position: 'middle',
270
- content: `Past sessions:\n${journalSummary}`,
271
- tokens: estimateTokens(journalSummary),
272
- });
273
- // Layer 4: Recent files (just names)
274
- if (tracker.recentFiles.length > 0) {
275
- const fileList = tracker.recentFiles.slice(0, 10).map(f => f.path).join(', ');
276
- layers.push({
277
- name: 'recent_files',
278
- priority: 'low',
279
- position: 'middle',
280
- content: `Recently modified: ${fileList}`,
281
- tokens: estimateTokens(fileList) + 20,
282
- });
283
- }
284
- // Layer 4b: Code snippets (if enabled and budget allows)
285
- if (includeCode && tracker.recentFiles.length > 0) {
286
- const snippets = getCodeSnippets(safePath, 3, 15);
287
- if (snippets.length > 0) {
288
- const snippetTokens = estimateTokens(snippets);
289
- // Only include if it fits in 20% of budget
290
- if (snippetTokens < maxTokens * 0.2) {
291
- layers.push({
292
- name: 'code_snippets',
293
- priority: 'medium',
294
- position: 'middle',
295
- content: `Recent code:\n${snippets}`,
296
- tokens: snippetTokens + 20,
297
- });
298
- }
299
- }
300
- }
301
- // ─────────────────────────────────────────────────────────────────────────
302
- // END: Recent context (high attention, full detail)
303
- // ─────────────────────────────────────────────────────────────────────────
304
- // Layer 5: Unresolved errors (ALL - critical for debugging)
305
- // Note: 'errors' already loaded at top for dynamic budget calculation
306
- if (errors.length > 0) {
307
- const errorContent = errors.slice(0, 10).map(e => {
308
- const attempts = e.fixAttempts.length > 0
309
- ? ` (tried ${e.fixAttempts.length}x: ${e.fixAttempts.map(a => a.approach).join(', ')})`
310
- : '';
311
- const location = e.file ? ` [${e.file}${e.line ? `:${e.line}` : ''}]` : '';
312
- return `ERROR${location}: ${e.error}${attempts}`;
313
- }).join('\n\n');
314
- layers.push({
315
- name: 'errors',
316
- priority: 'high',
317
- position: 'end',
318
- content: errorContent,
319
- tokens: estimateTokens(errorContent),
320
- });
321
- }
322
- // Layer 6: Recent tool calls (more context for understanding workflow)
323
- if (tracker.recentToolCalls.length > 0) {
324
- const toolContent = tracker.recentToolCalls.slice(0, 15).map(t => {
325
- const ago = Math.round((Date.now() - t.timestamp) / 60000);
326
- return `${t.tool} (${ago}m ago)`;
327
- }).join('\n');
328
- layers.push({
329
- name: 'recent_tools',
330
- priority: 'medium',
331
- position: 'end',
332
- content: `Recent actions:\n${toolContent}`,
333
- tokens: estimateTokens(toolContent) + 20,
334
- });
335
- }
336
- // Layer 7: Current task (if set)
337
- if (options.taskDescription) {
338
- layers.push({
339
- name: 'current_task',
340
- priority: 'critical',
341
- position: 'end',
342
- content: `CURRENT TASK: ${options.taskDescription}`,
343
- tokens: estimateTokens(options.taskDescription) + 20,
344
- });
345
- }
346
- // ─────────────────────────────────────────────────────────────────────────
347
- // ASSEMBLE: Fit within token budget
348
- // ─────────────────────────────────────────────────────────────────────────
349
- // Sort by priority and position
350
- const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 };
351
- const positionOrder = { beginning: 0, end: 1, middle: 2 };
352
- layers.sort((a, b) => {
353
- const priorityDiff = priorityOrder[a.priority] - priorityOrder[b.priority];
354
- if (priorityDiff !== 0)
355
- return priorityDiff;
356
- return positionOrder[a.position] - positionOrder[b.position];
357
- });
358
- // Include layers until token limit
359
- const included = [];
360
- let usedTokens = 0;
361
- let truncated = false;
362
- for (const layer of layers) {
363
- if (usedTokens + layer.tokens <= maxTokens) {
364
- included.push(layer);
365
- usedTokens += layer.tokens;
366
- }
367
- else if (layer.priority === 'critical') {
368
- // Always include critical, even if truncated
369
- const available = maxTokens - usedTokens;
370
- if (available > 100) {
371
- const truncatedContent = truncateToTokens(layer.content, available);
372
- included.push({
373
- ...layer,
374
- content: truncatedContent,
375
- tokens: estimateTokens(truncatedContent),
376
- });
377
- usedTokens += estimateTokens(truncatedContent);
378
- truncated = true;
379
- }
380
- }
381
- else {
382
- truncated = true;
383
- }
384
- }
385
- // Re-sort by position for final output
386
- included.sort((a, b) => positionOrder[a.position] - positionOrder[b.position]);
387
- return {
388
- layers: included,
389
- totalTokens: usedTokens,
390
- truncated,
391
- };
392
- }
393
- /**
394
- * Convert compressed context to a single string for the API
395
- */
396
- export function contextToString(context) {
397
- const sections = [];
398
- const beginning = context.layers.filter(l => l.position === 'beginning');
399
- const middle = context.layers.filter(l => l.position === 'middle');
400
- const end = context.layers.filter(l => l.position === 'end');
401
- if (beginning.length > 0) {
402
- sections.push('# METHODOLOGY & STATE\n' + beginning.map(l => l.content).join('\n\n'));
403
- }
404
- if (middle.length > 0) {
405
- sections.push('# PROJECT CONTEXT\n' + middle.map(l => l.content).join('\n\n'));
406
- }
407
- if (end.length > 0) {
408
- sections.push('# CURRENT SITUATION\n' + end.map(l => l.content).join('\n\n'));
409
- }
410
- return sections.join('\n\n---\n\n');
411
- }
412
- /**
413
- * Get context stats for debugging/monitoring
414
- */
415
- export function getContextStats(projectPath) {
416
- const context = buildCompressedContext(projectPath);
417
- const layerBreakdown = {};
418
- for (const layer of context.layers) {
419
- layerBreakdown[layer.name] = layer.tokens;
420
- }
421
- // Estimate what full context would be
422
- const tracker = loadTracker(projectPath);
423
- const journal = getJournalEntries({ projectPath, limit: 10 });
424
- const fullEstimate = estimateTokens(METHODOLOGY_COMPRESSED) * 5 + // Full methodology
425
- tracker.recentFiles.length * 500 + // File contents
426
- journal.reduce((sum, j) => sum + estimateTokens(j.conversation), 0);
427
- return {
428
- estimatedTokens: context.totalTokens,
429
- layerBreakdown,
430
- compressionRatio: fullEstimate > 0 ? context.totalTokens / fullEstimate : 1,
431
- };
432
- }
433
14
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,0DAA0D;AAC1D,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC"}
package/dist/docs/prd.md CHANGED
@@ -13,6 +13,11 @@
13
13
  ## User Stories
14
14
  - As a [user type], I want to [action] so that [benefit]
15
15
 
16
+ ## Target Geography
17
+ - Primary markets: [US, EU, Global, etc.]
18
+ - Data storage region: [AWS us-east-1, etc.]
19
+ - Regulatory considerations: [GDPR, CCPA, none, etc.]
20
+
16
21
  ## Technical Requirements
17
22
  - [Performance, security, integration requirements]
18
23
 
package/dist/reality.d.ts CHANGED
@@ -5,13 +5,39 @@
5
5
  * categorizes them by what AI can/cannot do,
6
6
  * and generates context-aware prompts for Cursor.
7
7
  */
8
+ export type RealityCheckStatus = 'pending' | 'completed' | 'skipped';
9
+ export interface PersistedCheckState {
10
+ status: RealityCheckStatus;
11
+ updatedAt: string;
12
+ skippedReason?: string;
13
+ }
14
+ /**
15
+ * Update the status of a reality check
16
+ */
17
+ export declare function updateCheckStatus(projectPath: string, checkKey: string, status: RealityCheckStatus, skippedReason?: string): void;
18
+ /**
19
+ * Get the persisted status for a check
20
+ */
21
+ export declare function getCheckStatus(projectPath: string, checkKey: string): PersistedCheckState | undefined;
22
+ /**
23
+ * Get all check statuses
24
+ */
25
+ export declare function getAllCheckStatuses(projectPath: string): Record<string, PersistedCheckState>;
26
+ /**
27
+ * Reset all check statuses (e.g., when profile changes significantly)
28
+ */
29
+ export declare function resetCheckStatuses(projectPath: string): void;
30
+ /**
31
+ * Detect if any expected output files exist and auto-complete checks
32
+ * Returns array of check keys that were auto-completed
33
+ */
34
+ export declare function detectGeneratedDocs(projectPath: string): string[];
8
35
  /**
9
- * Three tiers of AI capability:
10
- * - generatable: AI can draft the document, just needs human review
11
- * - assistable: AI can help with checklist/guide, but needs professional verification
12
- * - human_only: Requires real-world action (signup, purchase, certification)
36
+ * Two tiers of AI capability:
37
+ * - ai_assisted: AI can help (draft docs, create checklists, generate code)
38
+ * - manual: Requires real-world action (signup, purchase, certification)
13
39
  */
14
- export type RealityTier = 'generatable' | 'assistable' | 'human_only';
40
+ export type RealityTier = 'ai_assisted' | 'manual';
15
41
  export interface RealityCheck {
16
42
  key: string;
17
43
  category: string;
@@ -23,6 +49,10 @@ export interface RealityCheck {
23
49
  externalLinks?: string[];
24
50
  alsoNeeded?: string[];
25
51
  priority: 'critical' | 'high' | 'medium' | 'low';
52
+ triggeredBy: string;
53
+ status: RealityCheckStatus;
54
+ statusUpdatedAt?: string;
55
+ skippedReason?: string;
26
56
  }
27
57
  export interface ProjectProfile {
28
58
  collectsUserData: boolean;
@@ -46,10 +76,14 @@ export interface RealityCheckResult {
46
76
  summary: {
47
77
  total: number;
48
78
  critical: number;
49
- generatable: number;
50
- assistable: number;
51
- humanOnly: number;
79
+ aiAssisted: number;
80
+ manual: number;
81
+ pending: number;
82
+ completed: number;
83
+ skipped: number;
52
84
  };
85
+ totalAvailable?: number;
86
+ isFirstSession?: boolean;
53
87
  }
54
88
  /**
55
89
  * Infer project profile from brainlift, PRD, and package.json
@@ -1 +1 @@
1
- {"version":3,"file":"reality.d.ts","sourceRoot":"","sources":["../src/reality.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,YAAY,GAAG,YAAY,CAAC;AAEtE,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CAClD;AAED,MAAM,WAAW,cAAc;IAE7B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AA8aD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,CAsIvE;AAqDD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,CA2CxE;AAMD;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,YAAY,EAAE,EACtB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAsIhF;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG;IAAE,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC,CA0BvH;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAMvD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAM5D"}
1
+ {"version":3,"file":"reality.d.ts","sourceRoot":"","sources":["../src/reality.ts"],"names":[],"mappings":"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"}