bobo-ai-cli 2.1.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/README.md +52 -9
  2. package/dist/agent.js +66 -45
  3. package/dist/agent.js.map +1 -1
  4. package/dist/agents/catalog.d.ts +40 -0
  5. package/dist/agents/catalog.js +172 -0
  6. package/dist/agents/catalog.js.map +1 -0
  7. package/dist/agents/index.d.ts +6 -0
  8. package/dist/agents/index.js +4 -0
  9. package/dist/agents/index.js.map +1 -0
  10. package/dist/agents/router.d.ts +43 -0
  11. package/dist/agents/router.js +87 -0
  12. package/dist/agents/router.js.map +1 -0
  13. package/dist/agents/spawn.d.ts +46 -0
  14. package/dist/agents/spawn.js +91 -0
  15. package/dist/agents/spawn.js.map +1 -0
  16. package/dist/autonomous.js +41 -1
  17. package/dist/autonomous.js.map +1 -1
  18. package/dist/cli.d.ts +8 -0
  19. package/dist/cli.js +667 -0
  20. package/dist/cli.js.map +1 -0
  21. package/dist/compactor.d.ts +49 -4
  22. package/dist/compactor.js +164 -17
  23. package/dist/compactor.js.map +1 -1
  24. package/dist/completer.js +2 -0
  25. package/dist/completer.js.map +1 -1
  26. package/dist/cost-tracker.js +35 -2
  27. package/dist/cost-tracker.js.map +1 -1
  28. package/dist/dream.d.ts +42 -0
  29. package/dist/dream.js +321 -0
  30. package/dist/dream.js.map +1 -0
  31. package/dist/hooks.d.ts +1 -1
  32. package/dist/hooks.js +4 -0
  33. package/dist/hooks.js.map +1 -1
  34. package/dist/index.js +8 -1134
  35. package/dist/index.js.map +1 -1
  36. package/dist/insight.js +4 -11
  37. package/dist/insight.js.map +1 -1
  38. package/dist/knowledge.d.ts +13 -0
  39. package/dist/knowledge.js +13 -2
  40. package/dist/knowledge.js.map +1 -1
  41. package/dist/memory.d.ts +4 -0
  42. package/dist/memory.js +6 -0
  43. package/dist/memory.js.map +1 -1
  44. package/dist/repl.d.ts +16 -0
  45. package/dist/repl.js +702 -0
  46. package/dist/repl.js.map +1 -0
  47. package/dist/sessions.js +23 -0
  48. package/dist/sessions.js.map +1 -1
  49. package/dist/skills/composer.d.ts +18 -0
  50. package/dist/skills/composer.js +59 -0
  51. package/dist/skills/composer.js.map +1 -0
  52. package/dist/skills/index.d.ts +3 -0
  53. package/dist/skills/index.js +3 -0
  54. package/dist/skills/index.js.map +1 -0
  55. package/dist/skills/loader.d.ts +12 -0
  56. package/dist/skills/loader.js +150 -0
  57. package/dist/skills/loader.js.map +1 -0
  58. package/dist/skills/types.d.ts +28 -0
  59. package/dist/skills/types.js +9 -0
  60. package/dist/skills/types.js.map +1 -0
  61. package/dist/skills.d.ts +1 -0
  62. package/dist/skills.js +1 -0
  63. package/dist/skills.js.map +1 -1
  64. package/dist/state/artifacts.d.ts +71 -0
  65. package/dist/state/artifacts.js +131 -0
  66. package/dist/state/artifacts.js.map +1 -0
  67. package/dist/state/index.d.ts +9 -0
  68. package/dist/state/index.js +7 -0
  69. package/dist/state/index.js.map +1 -0
  70. package/dist/state/manager.d.ts +89 -0
  71. package/dist/state/manager.js +130 -0
  72. package/dist/state/manager.js.map +1 -0
  73. package/dist/state/project-memory.d.ts +24 -0
  74. package/dist/state/project-memory.js +81 -0
  75. package/dist/state/project-memory.js.map +1 -0
  76. package/dist/state/recovery.d.ts +24 -0
  77. package/dist/state/recovery.js +94 -0
  78. package/dist/state/recovery.js.map +1 -0
  79. package/dist/statusbar.d.ts +1 -0
  80. package/dist/statusbar.js +12 -1
  81. package/dist/statusbar.js.map +1 -1
  82. package/dist/sub-agent-runner.d.ts +1 -0
  83. package/dist/sub-agent-runner.js +29 -3
  84. package/dist/sub-agent-runner.js.map +1 -1
  85. package/dist/sub-agents.d.ts +19 -1
  86. package/dist/sub-agents.js +137 -2
  87. package/dist/sub-agents.js.map +1 -1
  88. package/dist/tool-governance.d.ts +77 -0
  89. package/dist/tool-governance.js +335 -0
  90. package/dist/tool-governance.js.map +1 -0
  91. package/dist/ui/hud.d.ts +25 -0
  92. package/dist/ui/hud.js +67 -0
  93. package/dist/ui/hud.js.map +1 -0
  94. package/dist/verification-agent.d.ts +46 -0
  95. package/dist/verification-agent.js +528 -0
  96. package/dist/verification-agent.js.map +1 -0
  97. package/dist/workflows/ask.d.ts +13 -0
  98. package/dist/workflows/ask.js +66 -0
  99. package/dist/workflows/ask.js.map +1 -0
  100. package/dist/workflows/index.d.ts +5 -0
  101. package/dist/workflows/index.js +6 -0
  102. package/dist/workflows/index.js.map +1 -0
  103. package/dist/workflows/interview.d.ts +11 -0
  104. package/dist/workflows/interview.js +36 -0
  105. package/dist/workflows/interview.js.map +1 -0
  106. package/dist/workflows/plan.d.ts +13 -0
  107. package/dist/workflows/plan.js +34 -0
  108. package/dist/workflows/plan.js.map +1 -0
  109. package/dist/workflows/team.d.ts +17 -0
  110. package/dist/workflows/team.js +86 -0
  111. package/dist/workflows/team.js.map +1 -0
  112. package/dist/workflows/verify.d.ts +11 -0
  113. package/dist/workflows/verify.js +21 -0
  114. package/dist/workflows/verify.js.map +1 -0
  115. package/package.json +2 -4
package/dist/dream.js ADDED
@@ -0,0 +1,321 @@
1
+ /**
2
+ * KAIROS Dream Mode — Memory consolidation and insight extraction
3
+ *
4
+ * Inspired by biological memory consolidation during sleep, this module
5
+ * processes accumulated experiences and distills them into structured knowledge.
6
+ *
7
+ * Features:
8
+ * - /dream command to manually trigger consolidation
9
+ * - Auto-trigger on session-end if sufficient new experiences
10
+ * - LLM-powered distillation of logs → structured preferences & learnings
11
+ * - Deduplication and organization of memory entries
12
+ */
13
+ import { readFileSync, writeFileSync, readdirSync, existsSync } from 'node:fs';
14
+ import { join } from 'node:path';
15
+ import OpenAI from 'openai';
16
+ import { loadConfig } from './config.js';
17
+ import { getMemoryDir } from './memory.js';
18
+ /**
19
+ * Determine if dream mode should be triggered automatically.
20
+ * Criteria:
21
+ * - More than 50 new memory entries since last consolidation
22
+ * - Last consolidation was more than 24 hours ago
23
+ */
24
+ export function shouldAutoDream() {
25
+ const memoryDir = getMemoryDir();
26
+ if (!existsSync(memoryDir))
27
+ return false;
28
+ const lastDreamPath = join(memoryDir, '.last-dream');
29
+ let lastDreamTime = 0;
30
+ if (existsSync(lastDreamPath)) {
31
+ try {
32
+ lastDreamTime = parseInt(readFileSync(lastDreamPath, 'utf-8'), 10);
33
+ }
34
+ catch {
35
+ // Invalid timestamp, treat as never dreamed
36
+ }
37
+ }
38
+ const now = Date.now();
39
+ const hoursSinceLastDream = (now - lastDreamTime) / (1000 * 60 * 60);
40
+ // Check if more than 24 hours since last dream
41
+ if (hoursSinceLastDream < 24)
42
+ return false;
43
+ // Count memory entries
44
+ const files = readdirSync(memoryDir).filter(f => f.endsWith('.md') || f.endsWith('.txt'));
45
+ let entryCount = 0;
46
+ for (const file of files) {
47
+ try {
48
+ const content = readFileSync(join(memoryDir, file), 'utf-8');
49
+ // Count entries (rough heuristic: lines starting with - or ##)
50
+ entryCount += (content.match(/^[-#]/gm) || []).length;
51
+ }
52
+ catch {
53
+ // Skip unreadable files
54
+ }
55
+ }
56
+ return entryCount > 50;
57
+ }
58
+ /**
59
+ * Run dream mode consolidation.
60
+ */
61
+ export async function runDream(options = {}) {
62
+ const config = loadConfig();
63
+ const memoryDir = getMemoryDir();
64
+ if (!existsSync(memoryDir)) {
65
+ return {
66
+ insights: [],
67
+ preferencesUpdated: 0,
68
+ duplicatesRemoved: 0,
69
+ summary: 'No memory directory found. Nothing to consolidate.',
70
+ };
71
+ }
72
+ // Step 1: Load all memory files
73
+ const memoryContent = loadAllMemories(memoryDir);
74
+ if (memoryContent.length === 0) {
75
+ return {
76
+ insights: [],
77
+ preferencesUpdated: 0,
78
+ duplicatesRemoved: 0,
79
+ summary: 'No memory content found.',
80
+ };
81
+ }
82
+ // Step 2: Use LLM to distill insights
83
+ const insights = await distillInsights(memoryContent, config);
84
+ // Step 3: Deduplicate and organize
85
+ const { preferencesUpdated, duplicatesRemoved } = options.dryRun
86
+ ? { preferencesUpdated: 0, duplicatesRemoved: 0 }
87
+ : consolidateMemories(insights, memoryDir);
88
+ // Step 4: Record dream timestamp
89
+ if (!options.dryRun) {
90
+ writeFileSync(join(memoryDir, '.last-dream'), Date.now().toString());
91
+ }
92
+ const summary = generateDreamSummary(insights, preferencesUpdated, duplicatesRemoved);
93
+ return {
94
+ insights,
95
+ preferencesUpdated,
96
+ duplicatesRemoved,
97
+ summary,
98
+ };
99
+ }
100
+ /**
101
+ * Load all memory files into a single text blob.
102
+ */
103
+ function loadAllMemories(memoryDir) {
104
+ const files = readdirSync(memoryDir).filter(f => (f.endsWith('.md') || f.endsWith('.txt')) && !f.startsWith('.'));
105
+ const sections = [];
106
+ for (const file of files) {
107
+ try {
108
+ const content = readFileSync(join(memoryDir, file), 'utf-8');
109
+ if (content.trim()) {
110
+ sections.push(`## Source: ${file}\n\n${content}`);
111
+ }
112
+ }
113
+ catch {
114
+ // Skip unreadable files
115
+ }
116
+ }
117
+ return sections.join('\n\n---\n\n');
118
+ }
119
+ /**
120
+ * Use LLM to distill insights from memory content.
121
+ */
122
+ async function distillInsights(memoryContent, config) {
123
+ if (!config.apiKey) {
124
+ throw new Error('API key not configured');
125
+ }
126
+ const client = new OpenAI({
127
+ apiKey: config.apiKey,
128
+ baseURL: config.baseUrl,
129
+ });
130
+ const prompt = `You are analyzing accumulated memory logs to extract structured insights.
131
+
132
+ Memory Content:
133
+ ${memoryContent.slice(0, 20000)} ${memoryContent.length > 20000 ? '\n\n[... truncated ...]' : ''}
134
+
135
+ Task: Extract and categorize insights from these memories.
136
+
137
+ Categories:
138
+ 1. user-preference: User's explicit preferences, habits, or corrections
139
+ 2. technical-pattern: Code patterns, architectural decisions, or technical learnings
140
+ 3. project-context: Project-specific knowledge, file structure, or domain concepts
141
+ 4. workflow-optimization: Process improvements, shortcuts, or efficiency tips
142
+
143
+ For each insight:
144
+ - Provide clear, actionable content
145
+ - Assign confidence level (high/medium/low)
146
+ - Note which source it came from
147
+
148
+ Output format (JSON array):
149
+ [
150
+ {
151
+ "category": "user-preference",
152
+ "content": "User prefers TypeScript strict mode and explicit type annotations",
153
+ "confidence": "high",
154
+ "source": "user.md"
155
+ },
156
+ ...
157
+ ]
158
+
159
+ Output ONLY the JSON array, no explanation:`;
160
+ try {
161
+ const completion = await client.chat.completions.create({
162
+ model: config.model,
163
+ messages: [{ role: 'user', content: prompt }],
164
+ temperature: 0.3, // Lower temperature for consistent extraction
165
+ max_tokens: 2000,
166
+ });
167
+ const response = completion.choices[0]?.message?.content || '[]';
168
+ // Extract JSON from response (might be wrapped in code blocks)
169
+ const jsonMatch = response.match(/\[[\s\S]*\]/);
170
+ const jsonText = jsonMatch ? jsonMatch[0] : '[]';
171
+ const insights = JSON.parse(jsonText);
172
+ return insights;
173
+ }
174
+ catch (e) {
175
+ console.error('Failed to distill insights:', e.message);
176
+ return [];
177
+ }
178
+ }
179
+ /**
180
+ * Consolidate insights into memory files, removing duplicates.
181
+ */
182
+ function consolidateMemories(insights, memoryDir) {
183
+ let preferencesUpdated = 0;
184
+ let duplicatesRemoved = 0;
185
+ // Group insights by category
186
+ const grouped = new Map();
187
+ for (const insight of insights) {
188
+ const category = insight.category;
189
+ if (!grouped.has(category)) {
190
+ grouped.set(category, []);
191
+ }
192
+ grouped.get(category).push(insight);
193
+ }
194
+ // Write consolidated insights to category files
195
+ for (const [category, categoryInsights] of grouped.entries()) {
196
+ const fileName = categoryToCategoryFile(category);
197
+ const filePath = join(memoryDir, fileName);
198
+ // Load existing content
199
+ let existingContent = '';
200
+ if (existsSync(filePath)) {
201
+ existingContent = readFileSync(filePath, 'utf-8');
202
+ }
203
+ // Deduplicate: only add insights that aren't already present
204
+ const newInsights = [];
205
+ for (const insight of categoryInsights) {
206
+ if (!existingContent.includes(insight.content)) {
207
+ newInsights.push(`- ${insight.content} (confidence: ${insight.confidence})`);
208
+ preferencesUpdated++;
209
+ }
210
+ else {
211
+ duplicatesRemoved++;
212
+ }
213
+ }
214
+ // Append new insights
215
+ if (newInsights.length > 0) {
216
+ const timestamp = new Date().toISOString().split('T')[0];
217
+ const newSection = `\n\n## Consolidated: ${timestamp}\n\n${newInsights.join('\n')}`;
218
+ writeFileSync(filePath, existingContent + newSection);
219
+ }
220
+ }
221
+ return { preferencesUpdated, duplicatesRemoved };
222
+ }
223
+ /**
224
+ * Map insight category to memory file name.
225
+ */
226
+ function categoryToCategoryFile(category) {
227
+ switch (category) {
228
+ case 'user-preference':
229
+ return 'user.md';
230
+ case 'technical-pattern':
231
+ return 'experience.md';
232
+ case 'project-context':
233
+ return 'project.md';
234
+ case 'workflow-optimization':
235
+ return 'reference.md';
236
+ default:
237
+ return 'feedback.md';
238
+ }
239
+ }
240
+ /**
241
+ * Generate human-readable dream summary.
242
+ */
243
+ function generateDreamSummary(insights, preferencesUpdated, duplicatesRemoved) {
244
+ const lines = [];
245
+ lines.push('🌙 Dream Mode Consolidation Complete');
246
+ lines.push('');
247
+ lines.push(`✨ Extracted ${insights.length} insights from memory logs`);
248
+ lines.push(`📝 Updated ${preferencesUpdated} preferences`);
249
+ lines.push(`🗑️ Removed ${duplicatesRemoved} duplicate entries`);
250
+ lines.push('');
251
+ // Group by category
252
+ const grouped = new Map();
253
+ for (const insight of insights) {
254
+ if (!grouped.has(insight.category)) {
255
+ grouped.set(insight.category, []);
256
+ }
257
+ grouped.get(insight.category).push(insight);
258
+ }
259
+ lines.push('Insights by category:');
260
+ for (const [category, categoryInsights] of grouped.entries()) {
261
+ const highConf = categoryInsights.filter(i => i.confidence === 'high').length;
262
+ lines.push(` • ${category}: ${categoryInsights.length} insights (${highConf} high confidence)`);
263
+ }
264
+ lines.push('');
265
+ lines.push('Memory has been consolidated and organized. 💤');
266
+ return lines.join('\n');
267
+ }
268
+ /**
269
+ * Format dream result for user display.
270
+ */
271
+ export function formatDreamResult(result) {
272
+ const lines = [];
273
+ lines.push('');
274
+ lines.push('╔═══════════════════════════════════════════════════════════════');
275
+ lines.push('║ 🌙 KAIROS DREAM MODE — Memory Consolidation');
276
+ lines.push('╠═══════════════════════════════════════════════════════════════');
277
+ lines.push(`║ ${result.summary.split('\n')[0]}`);
278
+ lines.push('╠═══════════════════════════════════════════════════════════════');
279
+ if (result.insights.length > 0) {
280
+ lines.push('║ TOP INSIGHTS:');
281
+ lines.push('║');
282
+ // Show top 5 high-confidence insights
283
+ const topInsights = result.insights
284
+ .filter(i => i.confidence === 'high')
285
+ .slice(0, 5);
286
+ for (const insight of topInsights) {
287
+ const icon = getCategoryIcon(insight.category);
288
+ lines.push(`║ ${icon} ${insight.content.slice(0, 55)}`);
289
+ if (insight.content.length > 55) {
290
+ lines.push(`║ ${insight.content.slice(55, 110)}`);
291
+ }
292
+ lines.push('║');
293
+ }
294
+ }
295
+ lines.push('╠═══════════════════════════════════════════════════════════════');
296
+ lines.push(`║ Statistics:`);
297
+ lines.push(`║ • ${result.insights.length} insights extracted`);
298
+ lines.push(`║ • ${result.preferencesUpdated} new entries added`);
299
+ lines.push(`║ • ${result.duplicatesRemoved} duplicates removed`);
300
+ lines.push('╚═══════════════════════════════════════════════════════════════');
301
+ lines.push('');
302
+ return lines.join('\n');
303
+ }
304
+ /**
305
+ * Get icon for insight category.
306
+ */
307
+ function getCategoryIcon(category) {
308
+ switch (category) {
309
+ case 'user-preference':
310
+ return '👤';
311
+ case 'technical-pattern':
312
+ return '🔧';
313
+ case 'project-context':
314
+ return '📁';
315
+ case 'workflow-optimization':
316
+ return '⚡';
317
+ default:
318
+ return '💡';
319
+ }
320
+ }
321
+ //# sourceMappingURL=dream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dream.js","sourceRoot":"","sources":["../src/dream.ts"],"names":[],"mappings":"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"}
package/dist/hooks.d.ts CHANGED
@@ -11,7 +11,7 @@
11
11
  * post-commit — after git commit
12
12
  * session-end — when REPL exits
13
13
  */
14
- export type HookEvent = 'pre-edit' | 'post-edit' | 'pre-shell' | 'post-shell' | 'pre-commit' | 'post-commit' | 'session-end';
14
+ export type HookEvent = 'pre-edit' | 'post-edit' | 'pre-shell' | 'post-shell' | 'pre-commit' | 'post-commit' | 'pre-tool-use' | 'post-tool-use' | 'session-end';
15
15
  interface HookConfig {
16
16
  [event: string]: string[];
17
17
  }
package/dist/hooks.js CHANGED
@@ -89,6 +89,8 @@ export function initHooksTemplate() {
89
89
  'post-shell': [],
90
90
  'pre-commit': [],
91
91
  'post-commit': [],
92
+ 'pre-tool-use': [],
93
+ 'post-tool-use': [],
92
94
  'session-end': [],
93
95
  '_examples': {
94
96
  'pre-edit': ['echo "Editing: $BOBO_FILE"'],
@@ -96,6 +98,8 @@ export function initHooksTemplate() {
96
98
  'pre-shell': ['echo "Running: $BOBO_COMMAND"'],
97
99
  'pre-commit': ['npm run lint'],
98
100
  'post-commit': ['echo "Committed: $BOBO_COMMIT_MSG"'],
101
+ 'pre-tool-use': ['echo "Tool: $BOBO_TOOL_NAME (risk: $BOBO_TOOL_RISK)"'],
102
+ 'post-tool-use': ['echo "Tool completed: $BOBO_TOOL_NAME"'],
99
103
  },
100
104
  }, null, 2);
101
105
  }
package/dist/hooks.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAe3C,IAAI,WAAW,GAAsB,IAAI,CAAC;AAE1C;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC;IAEpC,MAAM,OAAO,GAAG;QACd,IAAI,CAAC,YAAY,EAAE,EAAE,YAAY,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC;KAC3C,CAAC;IAEF,MAAM,MAAM,GAAe,EAAE,CAAC;IAE9B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;gBACtD,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;oBAChD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;wBACxB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,GAAI,IAAiB,CAAC,CAAC;oBACpE,CAAC;yBAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;wBACpC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;oBACnD,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,WAAW,GAAG,MAAM,CAAC;IACrB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CACtB,KAAgB,EAChB,OAAgC;IAEhC,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5C,MAAM,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;IAEnE,IAAI,KAAK,GAAG,IAAI,CAAC;IACjB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,QAAQ,CAAC,GAAG,EAAE;gBACZ,GAAG;gBACH,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,MAAM;gBACb,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;aACnB,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,GAAG,KAAK,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,WAAW,GAAG,IAAI,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,UAAU,EAAE,EAAE;QACd,WAAW,EAAE,EAAE;QACf,WAAW,EAAE,EAAE;QACf,YAAY,EAAE,EAAE;QAChB,YAAY,EAAE,EAAE;QAChB,aAAa,EAAE,EAAE;QACjB,aAAa,EAAE,EAAE;QACjB,WAAW,EAAE;YACX,UAAU,EAAE,CAAC,4BAA4B,CAAC;YAC1C,WAAW,EAAE,CAAC,6BAA6B,CAAC;YAC5C,WAAW,EAAE,CAAC,+BAA+B,CAAC;YAC9C,YAAY,EAAE,CAAC,cAAc,CAAC;YAC9B,aAAa,EAAE,CAAC,oCAAoC,CAAC;SACtD;KACF,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}