cmp-memory-system 1.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 (161) hide show
  1. package/README.md +541 -0
  2. package/dist/analytics/index.d.ts +5 -0
  3. package/dist/analytics/index.d.ts.map +1 -0
  4. package/dist/analytics/index.js +5 -0
  5. package/dist/analytics/index.js.map +1 -0
  6. package/dist/analytics/tracker.d.ts +107 -0
  7. package/dist/analytics/tracker.d.ts.map +1 -0
  8. package/dist/analytics/tracker.js +333 -0
  9. package/dist/analytics/tracker.js.map +1 -0
  10. package/dist/auto-improve/eslint-generator.d.ts +36 -0
  11. package/dist/auto-improve/eslint-generator.d.ts.map +1 -0
  12. package/dist/auto-improve/eslint-generator.js +280 -0
  13. package/dist/auto-improve/eslint-generator.js.map +1 -0
  14. package/dist/auto-improve/index.d.ts +6 -0
  15. package/dist/auto-improve/index.d.ts.map +1 -0
  16. package/dist/auto-improve/index.js +6 -0
  17. package/dist/auto-improve/index.js.map +1 -0
  18. package/dist/auto-improve/pattern-detector.d.ts +92 -0
  19. package/dist/auto-improve/pattern-detector.d.ts.map +1 -0
  20. package/dist/auto-improve/pattern-detector.js +231 -0
  21. package/dist/auto-improve/pattern-detector.js.map +1 -0
  22. package/dist/cli/index.d.ts +16 -0
  23. package/dist/cli/index.d.ts.map +1 -0
  24. package/dist/cli/index.js +636 -0
  25. package/dist/cli/index.js.map +1 -0
  26. package/dist/dashboard/index.d.ts +6 -0
  27. package/dist/dashboard/index.d.ts.map +1 -0
  28. package/dist/dashboard/index.js +6 -0
  29. package/dist/dashboard/index.js.map +1 -0
  30. package/dist/dashboard/server.d.ts +15 -0
  31. package/dist/dashboard/server.d.ts.map +1 -0
  32. package/dist/dashboard/server.js +373 -0
  33. package/dist/dashboard/server.js.map +1 -0
  34. package/dist/dashboard/ui.d.ts +9 -0
  35. package/dist/dashboard/ui.d.ts.map +1 -0
  36. package/dist/dashboard/ui.js +530 -0
  37. package/dist/dashboard/ui.js.map +1 -0
  38. package/dist/db/client.d.ts +66 -0
  39. package/dist/db/client.d.ts.map +1 -0
  40. package/dist/db/client.js +159 -0
  41. package/dist/db/client.js.map +1 -0
  42. package/dist/db/drizzle-client.d.ts +302 -0
  43. package/dist/db/drizzle-client.d.ts.map +1 -0
  44. package/dist/db/drizzle-client.js +404 -0
  45. package/dist/db/drizzle-client.js.map +1 -0
  46. package/dist/db/index.d.ts +5 -0
  47. package/dist/db/index.d.ts.map +1 -0
  48. package/dist/db/index.js +5 -0
  49. package/dist/db/index.js.map +1 -0
  50. package/dist/feedback/collector.d.ts +74 -0
  51. package/dist/feedback/collector.d.ts.map +1 -0
  52. package/dist/feedback/collector.js +231 -0
  53. package/dist/feedback/collector.js.map +1 -0
  54. package/dist/feedback/index.d.ts +5 -0
  55. package/dist/feedback/index.d.ts.map +1 -0
  56. package/dist/feedback/index.js +5 -0
  57. package/dist/feedback/index.js.map +1 -0
  58. package/dist/hooks/index.d.ts +8 -0
  59. package/dist/hooks/index.d.ts.map +1 -0
  60. package/dist/hooks/index.js +8 -0
  61. package/dist/hooks/index.js.map +1 -0
  62. package/dist/hooks/memory-checkpoint.d.ts +43 -0
  63. package/dist/hooks/memory-checkpoint.d.ts.map +1 -0
  64. package/dist/hooks/memory-checkpoint.js +257 -0
  65. package/dist/hooks/memory-checkpoint.js.map +1 -0
  66. package/dist/hooks/post-tool-use.d.ts +61 -0
  67. package/dist/hooks/post-tool-use.d.ts.map +1 -0
  68. package/dist/hooks/post-tool-use.js +262 -0
  69. package/dist/hooks/post-tool-use.js.map +1 -0
  70. package/dist/hooks/pre-tool-use.d.ts +34 -0
  71. package/dist/hooks/pre-tool-use.d.ts.map +1 -0
  72. package/dist/hooks/pre-tool-use.js +358 -0
  73. package/dist/hooks/pre-tool-use.js.map +1 -0
  74. package/dist/hooks/session-start.d.ts +38 -0
  75. package/dist/hooks/session-start.d.ts.map +1 -0
  76. package/dist/hooks/session-start.js +274 -0
  77. package/dist/hooks/session-start.js.map +1 -0
  78. package/dist/index.d.ts +29 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +39 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/mcp/index.d.ts +5 -0
  83. package/dist/mcp/index.d.ts.map +1 -0
  84. package/dist/mcp/index.js +5 -0
  85. package/dist/mcp/index.js.map +1 -0
  86. package/dist/mcp/server.d.ts +42 -0
  87. package/dist/mcp/server.d.ts.map +1 -0
  88. package/dist/mcp/server.js +599 -0
  89. package/dist/mcp/server.js.map +1 -0
  90. package/dist/registry/embeddings.d.ts +38 -0
  91. package/dist/registry/embeddings.d.ts.map +1 -0
  92. package/dist/registry/embeddings.js +110 -0
  93. package/dist/registry/embeddings.js.map +1 -0
  94. package/dist/registry/generator.d.ts +41 -0
  95. package/dist/registry/generator.d.ts.map +1 -0
  96. package/dist/registry/generator.js +323 -0
  97. package/dist/registry/generator.js.map +1 -0
  98. package/dist/registry/index.d.ts +6 -0
  99. package/dist/registry/index.d.ts.map +1 -0
  100. package/dist/registry/index.js +6 -0
  101. package/dist/registry/index.js.map +1 -0
  102. package/dist/services/IdeaCollector.d.ts +103 -0
  103. package/dist/services/IdeaCollector.d.ts.map +1 -0
  104. package/dist/services/IdeaCollector.js +371 -0
  105. package/dist/services/IdeaCollector.js.map +1 -0
  106. package/dist/services/TaskTracker.d.ts +89 -0
  107. package/dist/services/TaskTracker.d.ts.map +1 -0
  108. package/dist/services/TaskTracker.js +324 -0
  109. package/dist/services/TaskTracker.js.map +1 -0
  110. package/dist/services/WorkPlanManager.d.ts +107 -0
  111. package/dist/services/WorkPlanManager.d.ts.map +1 -0
  112. package/dist/services/WorkPlanManager.js +440 -0
  113. package/dist/services/WorkPlanManager.js.map +1 -0
  114. package/dist/services/auto-inject.d.ts +77 -0
  115. package/dist/services/auto-inject.d.ts.map +1 -0
  116. package/dist/services/auto-inject.js +289 -0
  117. package/dist/services/auto-inject.js.map +1 -0
  118. package/dist/services/auto-tag.d.ts +61 -0
  119. package/dist/services/auto-tag.d.ts.map +1 -0
  120. package/dist/services/auto-tag.js +203 -0
  121. package/dist/services/auto-tag.js.map +1 -0
  122. package/dist/services/cross-project-sync.d.ts +76 -0
  123. package/dist/services/cross-project-sync.d.ts.map +1 -0
  124. package/dist/services/cross-project-sync.js +235 -0
  125. package/dist/services/cross-project-sync.js.map +1 -0
  126. package/dist/services/index.d.ts +15 -0
  127. package/dist/services/index.d.ts.map +1 -0
  128. package/dist/services/index.js +18 -0
  129. package/dist/services/index.js.map +1 -0
  130. package/dist/services/memory-consolidation.d.ts +77 -0
  131. package/dist/services/memory-consolidation.d.ts.map +1 -0
  132. package/dist/services/memory-consolidation.js +298 -0
  133. package/dist/services/memory-consolidation.js.map +1 -0
  134. package/dist/services/semantic-search.d.ts +93 -0
  135. package/dist/services/semantic-search.d.ts.map +1 -0
  136. package/dist/services/semantic-search.js +278 -0
  137. package/dist/services/semantic-search.js.map +1 -0
  138. package/dist/services/weekly-digest.d.ts +105 -0
  139. package/dist/services/weekly-digest.d.ts.map +1 -0
  140. package/dist/services/weekly-digest.js +292 -0
  141. package/dist/services/weekly-digest.js.map +1 -0
  142. package/dist/types/index.d.ts +274 -0
  143. package/dist/types/index.d.ts.map +1 -0
  144. package/dist/types/index.js +84 -0
  145. package/dist/types/index.js.map +1 -0
  146. package/dist/utils/config.d.ts +21 -0
  147. package/dist/utils/config.d.ts.map +1 -0
  148. package/dist/utils/config.js +89 -0
  149. package/dist/utils/config.js.map +1 -0
  150. package/dist/utils/index.d.ts +6 -0
  151. package/dist/utils/index.d.ts.map +1 -0
  152. package/dist/utils/index.js +6 -0
  153. package/dist/utils/index.js.map +1 -0
  154. package/dist/utils/paths.d.ts +28 -0
  155. package/dist/utils/paths.d.ts.map +1 -0
  156. package/dist/utils/paths.js +80 -0
  157. package/dist/utils/paths.js.map +1 -0
  158. package/package.json +89 -0
  159. package/templates/memory-config.json +82 -0
  160. package/templates/memory-config.schema.json +212 -0
  161. package/templates/settings.json +58 -0
@@ -0,0 +1,530 @@
1
+ /**
2
+ * Dashboard UI Generator
3
+ *
4
+ * Generates a self-contained React dashboard as HTML string.
5
+ * No build step required - uses CDN for React.
6
+ */
7
+ export function generateDashboardHTML(system) {
8
+ return `<!DOCTYPE html>
9
+ <html lang="en">
10
+ <head>
11
+ <meta charset="UTF-8">
12
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
13
+ <title>Memory Dashboard - ${system}</title>
14
+ <script src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
15
+ <script src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
16
+ <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
17
+ <link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
18
+ <style>
19
+ body { background: #0f172a; color: #e2e8f0; font-family: system-ui, -apple-system, sans-serif; }
20
+ .card { background: #1e293b; border: 1px solid #334155; border-radius: 0.5rem; }
21
+ .badge { padding: 0.25rem 0.5rem; border-radius: 0.25rem; font-size: 0.75rem; font-weight: 500; }
22
+ .badge-critical { background: #991b1b; color: #fecaca; }
23
+ .badge-high { background: #9a3412; color: #fed7aa; }
24
+ .badge-medium { background: #854d0e; color: #fef08a; }
25
+ .badge-low { background: #166534; color: #bbf7d0; }
26
+ .stat-card { background: linear-gradient(135deg, #1e293b 0%, #0f172a 100%); }
27
+ .tab-active { border-bottom: 2px solid #3b82f6; color: #3b82f6; }
28
+ .scrollbar-thin::-webkit-scrollbar { width: 6px; }
29
+ .scrollbar-thin::-webkit-scrollbar-track { background: #1e293b; }
30
+ .scrollbar-thin::-webkit-scrollbar-thumb { background: #475569; border-radius: 3px; }
31
+ </style>
32
+ </head>
33
+ <body>
34
+ <div id="root"></div>
35
+
36
+ <script type="text/babel">
37
+ const { useState, useEffect, useCallback } = React;
38
+
39
+ // ==========================================================================
40
+ // API Client
41
+ // ==========================================================================
42
+
43
+ const api = {
44
+ async getStats() {
45
+ const res = await fetch('/api/stats');
46
+ return res.json();
47
+ },
48
+ async getMemories(domain, limit = 50) {
49
+ const params = new URLSearchParams();
50
+ if (domain) params.set('domain', domain);
51
+ params.set('limit', String(limit));
52
+ const res = await fetch('/api/memories?' + params);
53
+ return res.json();
54
+ },
55
+ async searchMemories(query) {
56
+ const res = await fetch('/api/search?q=' + encodeURIComponent(query));
57
+ return res.json();
58
+ },
59
+ async getPatterns(threshold = 1) {
60
+ const res = await fetch('/api/patterns?threshold=' + threshold);
61
+ return res.json();
62
+ },
63
+ async getSessions(limit = 20) {
64
+ const res = await fetch('/api/sessions?limit=' + limit);
65
+ return res.json();
66
+ },
67
+ async createMemory(data) {
68
+ const res = await fetch('/api/memories', {
69
+ method: 'POST',
70
+ headers: { 'Content-Type': 'application/json' },
71
+ body: JSON.stringify(data),
72
+ });
73
+ return res.json();
74
+ },
75
+ async deleteMemory(id) {
76
+ const res = await fetch('/api/memories/' + id, { method: 'DELETE' });
77
+ return res.json();
78
+ },
79
+ async submitFeedback(memoryId, helpful, comment) {
80
+ const res = await fetch('/api/feedback', {
81
+ method: 'POST',
82
+ headers: { 'Content-Type': 'application/json' },
83
+ body: JSON.stringify({ memoryId, helpful, comment }),
84
+ });
85
+ return res.json();
86
+ },
87
+ };
88
+
89
+ // ==========================================================================
90
+ // Components
91
+ // ==========================================================================
92
+
93
+ function StatCard({ label, value, icon, color }) {
94
+ return (
95
+ <div className="stat-card card p-4">
96
+ <div className="flex items-center justify-between">
97
+ <div>
98
+ <p className="text-gray-400 text-sm">{label}</p>
99
+ <p className="text-2xl font-bold mt-1" style={{ color }}>{value}</p>
100
+ </div>
101
+ <div className="text-3xl opacity-50">{icon}</div>
102
+ </div>
103
+ </div>
104
+ );
105
+ }
106
+
107
+ function MemoryCard({ memory, onFeedback, onDelete }) {
108
+ const [expanded, setExpanded] = useState(false);
109
+
110
+ return (
111
+ <div className="card p-4 mb-3">
112
+ <div className="flex items-start justify-between">
113
+ <div className="flex-1">
114
+ <h3 className="font-semibold text-blue-400">{memory.title}</h3>
115
+ <div className="flex items-center gap-2 mt-1">
116
+ {memory.domain && (
117
+ <span className="badge bg-blue-900 text-blue-300">{memory.domain}</span>
118
+ )}
119
+ {memory.source && (
120
+ <span className="badge bg-gray-700 text-gray-300">{memory.source}</span>
121
+ )}
122
+ </div>
123
+ </div>
124
+ <button
125
+ onClick={() => setExpanded(!expanded)}
126
+ className="text-gray-400 hover:text-white"
127
+ >
128
+ {expanded ? '▲' : '▼'}
129
+ </button>
130
+ </div>
131
+
132
+ {expanded && (
133
+ <div className="mt-3 pt-3 border-t border-gray-700">
134
+ <p className="text-gray-300 whitespace-pre-wrap text-sm">{memory.body}</p>
135
+
136
+ {memory.tags && memory.tags.length > 0 && (
137
+ <div className="flex flex-wrap gap-1 mt-3">
138
+ {memory.tags.map((tag, i) => (
139
+ <span key={i} className="badge bg-gray-700 text-gray-300">{tag}</span>
140
+ ))}
141
+ </div>
142
+ )}
143
+
144
+ <div className="flex items-center gap-2 mt-3">
145
+ <button
146
+ onClick={() => onFeedback(memory.id, true)}
147
+ className="px-3 py-1 bg-green-900 text-green-300 rounded text-sm hover:bg-green-800"
148
+ >
149
+ Helpful
150
+ </button>
151
+ <button
152
+ onClick={() => onFeedback(memory.id, false)}
153
+ className="px-3 py-1 bg-red-900 text-red-300 rounded text-sm hover:bg-red-800"
154
+ >
155
+ Not Helpful
156
+ </button>
157
+ <button
158
+ onClick={() => onDelete(memory.id)}
159
+ className="px-3 py-1 bg-gray-700 text-gray-300 rounded text-sm hover:bg-gray-600 ml-auto"
160
+ >
161
+ Delete
162
+ </button>
163
+ </div>
164
+
165
+ <p className="text-gray-500 text-xs mt-2">
166
+ Created: {new Date(memory.createdAt).toLocaleString()}
167
+ </p>
168
+ </div>
169
+ )}
170
+ </div>
171
+ );
172
+ }
173
+
174
+ function PatternCard({ pattern }) {
175
+ const severityClass = {
176
+ critical: 'badge-critical',
177
+ high: 'badge-high',
178
+ medium: 'badge-medium',
179
+ low: 'badge-low',
180
+ }[pattern.severity] || 'badge-medium';
181
+
182
+ return (
183
+ <div className="card p-4 mb-3">
184
+ <div className="flex items-center justify-between">
185
+ <div>
186
+ <h3 className="font-semibold text-orange-400">{pattern.patternId}</h3>
187
+ <p className="text-gray-400 text-sm mt-1">{pattern.description}</p>
188
+ </div>
189
+ <div className="text-right">
190
+ <span className={"badge " + severityClass}>{pattern.severity}</span>
191
+ <p className="text-2xl font-bold text-white mt-1">{pattern.occurrences}x</p>
192
+ </div>
193
+ </div>
194
+
195
+ {pattern.files && pattern.files.length > 0 && (
196
+ <div className="mt-3 pt-3 border-t border-gray-700">
197
+ <p className="text-gray-400 text-xs mb-2">Affected files:</p>
198
+ <div className="space-y-1">
199
+ {pattern.files.slice(0, 3).map((f, i) => (
200
+ <p key={i} className="text-gray-300 text-sm font-mono truncate">
201
+ {f.path}:{f.line}
202
+ </p>
203
+ ))}
204
+ {pattern.files.length > 3 && (
205
+ <p className="text-gray-500 text-sm">+{pattern.files.length - 3} more</p>
206
+ )}
207
+ </div>
208
+ </div>
209
+ )}
210
+ </div>
211
+ );
212
+ }
213
+
214
+ function SessionCard({ session }) {
215
+ const isActive = session.status === 'active';
216
+
217
+ return (
218
+ <div className="card p-4 mb-3">
219
+ <div className="flex items-center justify-between">
220
+ <div>
221
+ <div className="flex items-center gap-2">
222
+ <span className={"w-2 h-2 rounded-full " + (isActive ? "bg-green-500" : "bg-gray-500")}></span>
223
+ <span className="text-gray-300">Session</span>
224
+ {session.module && (
225
+ <span className="badge bg-purple-900 text-purple-300">{session.module}</span>
226
+ )}
227
+ </div>
228
+ {session.summary && (
229
+ <p className="text-gray-400 text-sm mt-1">{session.summary}</p>
230
+ )}
231
+ </div>
232
+ <div className="text-right text-xs text-gray-500">
233
+ {session.startedAt && <p>Started: {new Date(session.startedAt).toLocaleString()}</p>}
234
+ {session.endedAt && <p>Ended: {new Date(session.endedAt).toLocaleString()}</p>}
235
+ </div>
236
+ </div>
237
+ </div>
238
+ );
239
+ }
240
+
241
+ function NewMemoryForm({ onSubmit, onCancel }) {
242
+ const [title, setTitle] = useState('');
243
+ const [body, setBody] = useState('');
244
+ const [domain, setDomain] = useState('');
245
+
246
+ const handleSubmit = (e) => {
247
+ e.preventDefault();
248
+ onSubmit({ title, body, domain: domain || undefined });
249
+ };
250
+
251
+ return (
252
+ <form onSubmit={handleSubmit} className="card p-4 mb-4">
253
+ <h3 className="font-semibold text-blue-400 mb-3">New Memory</h3>
254
+
255
+ <div className="space-y-3">
256
+ <input
257
+ type="text"
258
+ value={title}
259
+ onChange={(e) => setTitle(e.target.value)}
260
+ placeholder="Title"
261
+ className="w-full p-2 bg-gray-800 border border-gray-600 rounded text-white"
262
+ required
263
+ />
264
+
265
+ <textarea
266
+ value={body}
267
+ onChange={(e) => setBody(e.target.value)}
268
+ placeholder="Content..."
269
+ rows={4}
270
+ className="w-full p-2 bg-gray-800 border border-gray-600 rounded text-white"
271
+ required
272
+ />
273
+
274
+ <input
275
+ type="text"
276
+ value={domain}
277
+ onChange={(e) => setDomain(e.target.value)}
278
+ placeholder="Domain (optional)"
279
+ className="w-full p-2 bg-gray-800 border border-gray-600 rounded text-white"
280
+ />
281
+ </div>
282
+
283
+ <div className="flex gap-2 mt-4">
284
+ <button
285
+ type="submit"
286
+ className="px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-500"
287
+ >
288
+ Save Memory
289
+ </button>
290
+ <button
291
+ type="button"
292
+ onClick={onCancel}
293
+ className="px-4 py-2 bg-gray-700 text-white rounded hover:bg-gray-600"
294
+ >
295
+ Cancel
296
+ </button>
297
+ </div>
298
+ </form>
299
+ );
300
+ }
301
+
302
+ // ==========================================================================
303
+ // Main App
304
+ // ==========================================================================
305
+
306
+ function App() {
307
+ const [activeTab, setActiveTab] = useState('memories');
308
+ const [stats, setStats] = useState(null);
309
+ const [memories, setMemories] = useState([]);
310
+ const [patterns, setPatterns] = useState([]);
311
+ const [sessions, setSessions] = useState([]);
312
+ const [searchQuery, setSearchQuery] = useState('');
313
+ const [searchResults, setSearchResults] = useState(null);
314
+ const [showNewMemory, setShowNewMemory] = useState(false);
315
+ const [loading, setLoading] = useState(true);
316
+
317
+ const loadData = useCallback(async () => {
318
+ setLoading(true);
319
+ try {
320
+ const [statsData, memoriesData, patternsData, sessionsData] = await Promise.all([
321
+ api.getStats(),
322
+ api.getMemories(),
323
+ api.getPatterns(),
324
+ api.getSessions(),
325
+ ]);
326
+ setStats(statsData);
327
+ setMemories(memoriesData.memories || []);
328
+ setPatterns(patternsData.patterns || []);
329
+ setSessions(sessionsData.sessions || []);
330
+ } catch (error) {
331
+ console.error('Failed to load data:', error);
332
+ }
333
+ setLoading(false);
334
+ }, []);
335
+
336
+ useEffect(() => {
337
+ loadData();
338
+ // Refresh every 30 seconds
339
+ const interval = setInterval(loadData, 30000);
340
+ return () => clearInterval(interval);
341
+ }, [loadData]);
342
+
343
+ const handleSearch = async () => {
344
+ if (!searchQuery.trim()) {
345
+ setSearchResults(null);
346
+ return;
347
+ }
348
+ const results = await api.searchMemories(searchQuery);
349
+ setSearchResults(results);
350
+ };
351
+
352
+ const handleFeedback = async (memoryId, helpful) => {
353
+ await api.submitFeedback(memoryId, helpful);
354
+ loadData();
355
+ };
356
+
357
+ const handleDelete = async (memoryId) => {
358
+ if (confirm('Delete this memory?')) {
359
+ await api.deleteMemory(memoryId);
360
+ loadData();
361
+ }
362
+ };
363
+
364
+ const handleNewMemory = async (data) => {
365
+ await api.createMemory(data);
366
+ setShowNewMemory(false);
367
+ loadData();
368
+ };
369
+
370
+ if (loading && !stats) {
371
+ return (
372
+ <div className="min-h-screen flex items-center justify-center">
373
+ <div className="text-xl text-gray-400">Loading...</div>
374
+ </div>
375
+ );
376
+ }
377
+
378
+ const displayMemories = searchResults ? searchResults.results : memories;
379
+
380
+ return (
381
+ <div className="min-h-screen p-6">
382
+ {/* Header */}
383
+ <div className="flex items-center justify-between mb-6">
384
+ <div>
385
+ <h1 className="text-2xl font-bold text-white">Memory Dashboard</h1>
386
+ <p className="text-gray-400 text-sm">System: ${system}</p>
387
+ </div>
388
+ <button
389
+ onClick={loadData}
390
+ className="px-4 py-2 bg-gray-700 text-white rounded hover:bg-gray-600"
391
+ >
392
+ Refresh
393
+ </button>
394
+ </div>
395
+
396
+ {/* Stats */}
397
+ {stats && (
398
+ <div className="grid grid-cols-2 md:grid-cols-4 gap-4 mb-6">
399
+ <StatCard label="Memories" value={stats.totalMemories} icon="brain" color="#60a5fa" />
400
+ <StatCard label="Patterns" value={stats.totalPatterns} icon="pattern" color="#f97316" />
401
+ <StatCard label="Triggered" value={stats.triggeredPatterns} icon="alert" color="#ef4444" />
402
+ <StatCard label="Sessions (24h)" value={stats.recentSessions} icon="session" color="#a855f7" />
403
+ </div>
404
+ )}
405
+
406
+ {/* Search */}
407
+ <div className="flex gap-2 mb-6">
408
+ <input
409
+ type="text"
410
+ value={searchQuery}
411
+ onChange={(e) => setSearchQuery(e.target.value)}
412
+ onKeyDown={(e) => e.key === 'Enter' && handleSearch()}
413
+ placeholder="Search memories..."
414
+ className="flex-1 p-3 bg-gray-800 border border-gray-600 rounded text-white"
415
+ />
416
+ <button
417
+ onClick={handleSearch}
418
+ className="px-6 py-3 bg-blue-600 text-white rounded hover:bg-blue-500"
419
+ >
420
+ Search
421
+ </button>
422
+ {searchResults && (
423
+ <button
424
+ onClick={() => { setSearchQuery(''); setSearchResults(null); }}
425
+ className="px-6 py-3 bg-gray-700 text-white rounded hover:bg-gray-600"
426
+ >
427
+ Clear
428
+ </button>
429
+ )}
430
+ </div>
431
+
432
+ {/* Tabs */}
433
+ <div className="flex border-b border-gray-700 mb-6">
434
+ {['memories', 'patterns', 'sessions'].map((tab) => (
435
+ <button
436
+ key={tab}
437
+ onClick={() => setActiveTab(tab)}
438
+ className={"px-4 py-2 -mb-px capitalize " + (activeTab === tab ? 'tab-active' : 'text-gray-400 hover:text-white')}
439
+ >
440
+ {tab}
441
+ </button>
442
+ ))}
443
+ </div>
444
+
445
+ {/* Content */}
446
+ <div className="max-h-[60vh] overflow-y-auto scrollbar-thin">
447
+ {activeTab === 'memories' && (
448
+ <div>
449
+ <div className="flex justify-between items-center mb-4">
450
+ <h2 className="text-lg font-semibold">
451
+ {searchResults ? 'Search Results' : 'Recent Memories'}
452
+ <span className="text-gray-500 text-sm ml-2">({displayMemories.length})</span>
453
+ </h2>
454
+ <button
455
+ onClick={() => setShowNewMemory(true)}
456
+ className="px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-500"
457
+ >
458
+ + New Memory
459
+ </button>
460
+ </div>
461
+
462
+ {showNewMemory && (
463
+ <NewMemoryForm
464
+ onSubmit={handleNewMemory}
465
+ onCancel={() => setShowNewMemory(false)}
466
+ />
467
+ )}
468
+
469
+ {displayMemories.length === 0 ? (
470
+ <p className="text-gray-500 text-center py-8">No memories found</p>
471
+ ) : (
472
+ displayMemories.map((m) => (
473
+ <MemoryCard
474
+ key={m.id}
475
+ memory={m}
476
+ onFeedback={handleFeedback}
477
+ onDelete={handleDelete}
478
+ />
479
+ ))
480
+ )}
481
+ </div>
482
+ )}
483
+
484
+ {activeTab === 'patterns' && (
485
+ <div>
486
+ <h2 className="text-lg font-semibold mb-4">
487
+ Detected Patterns
488
+ <span className="text-gray-500 text-sm ml-2">({patterns.length})</span>
489
+ </h2>
490
+
491
+ {patterns.length === 0 ? (
492
+ <p className="text-gray-500 text-center py-8">No patterns detected</p>
493
+ ) : (
494
+ patterns.map((p) => <PatternCard key={p.id} pattern={p} />)
495
+ )}
496
+ </div>
497
+ )}
498
+
499
+ {activeTab === 'sessions' && (
500
+ <div>
501
+ <h2 className="text-lg font-semibold mb-4">
502
+ Recent Sessions
503
+ <span className="text-gray-500 text-sm ml-2">({sessions.length})</span>
504
+ </h2>
505
+
506
+ {sessions.length === 0 ? (
507
+ <p className="text-gray-500 text-center py-8">No sessions found</p>
508
+ ) : (
509
+ sessions.map((s) => <SessionCard key={s.id} session={s} />)
510
+ )}
511
+ </div>
512
+ )}
513
+ </div>
514
+
515
+ {/* Footer */}
516
+ <div className="mt-6 pt-4 border-t border-gray-700 text-center text-gray-500 text-sm">
517
+ MetaNautical Memory System v1.0.0
518
+ </div>
519
+ </div>
520
+ );
521
+ }
522
+
523
+ // Render
524
+ const root = ReactDOM.createRoot(document.getElementById('root'));
525
+ root.render(<App />);
526
+ </script>
527
+ </body>
528
+ </html>`;
529
+ }
530
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/dashboard/ui.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,OAAO;;;;;8BAKqB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6DAqXyB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA8I3D,CAAC;AACT,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Database client for memory operations
3
+ *
4
+ * Provides a lightweight client for DEV_Items operations.
5
+ * Can work with Drizzle ORM or direct MySQL queries.
6
+ */
7
+ import type { DevItem, DevSystem, MemoryContent, PatternContent } from '../types/index.js';
8
+ export interface MemoryClientConfig {
9
+ /** Database connection (Drizzle db instance) */
10
+ db: unknown;
11
+ /** System identifier for data isolation */
12
+ system: DevSystem;
13
+ /** DEV_Items table reference */
14
+ table: unknown;
15
+ }
16
+ export interface QueryOptions {
17
+ type?: string;
18
+ status?: string;
19
+ limit?: number;
20
+ offset?: number;
21
+ tags?: string[];
22
+ search?: string;
23
+ }
24
+ export interface MemoryClient {
25
+ list(options?: QueryOptions): Promise<DevItem[]>;
26
+ get(id: string): Promise<DevItem | null>;
27
+ search(query: string, options?: QueryOptions): Promise<DevItem[]>;
28
+ create(data: CreateItemData): Promise<{
29
+ id: string;
30
+ }>;
31
+ update(id: string, data: Partial<CreateItemData>): Promise<void>;
32
+ delete(id: string): Promise<void>;
33
+ createMemory(content: MemoryContent, tags?: string[]): Promise<{
34
+ id: string;
35
+ }>;
36
+ getMemories(domain?: string, limit?: number): Promise<DevItem[]>;
37
+ createPattern(content: PatternContent): Promise<{
38
+ id: string;
39
+ }>;
40
+ getPatterns(threshold?: number): Promise<DevItem[]>;
41
+ incrementPattern(patternId: string): Promise<number>;
42
+ }
43
+ export interface CreateItemData {
44
+ type: string;
45
+ status?: string;
46
+ priority?: string;
47
+ content: Record<string, unknown>;
48
+ tags?: string[];
49
+ }
50
+ /**
51
+ * Create a memory client with Drizzle ORM
52
+ */
53
+ export declare function createMemoryClient(config: MemoryClientConfig): MemoryClient;
54
+ /**
55
+ * Generate a new ULID for items
56
+ */
57
+ export declare function generateId(): string;
58
+ /**
59
+ * Create memory content object
60
+ */
61
+ export declare function createMemoryContent(title: string, body: string, options?: Partial<MemoryContent>): MemoryContent;
62
+ /**
63
+ * Create pattern content object
64
+ */
65
+ export declare function createPatternContent(patternId: string, description: string, options?: Partial<PatternContent>): PatternContent;
66
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EAGT,aAAa,EACb,cAAc,EAGf,MAAM,mBAAmB,CAAA;AAM1B,MAAM,WAAW,kBAAkB;IACjC,gDAAgD;IAChD,EAAE,EAAE,OAAO,CAAA;IACX,2CAA2C;IAC3C,MAAM,EAAE,SAAS,CAAA;IACjB,gCAAgC;IAChC,KAAK,EAAE,OAAO,CAAA;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,YAAY;IAE3B,IAAI,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;IAChD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;IACxC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;IAGjE,MAAM,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACrD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAChE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAGjC,YAAY,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC9E,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;IAGhE,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC/D,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;IACnD,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CACrD;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAChB;AAMD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY,CAyJ3E;AAMD;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAC/B,aAAa,CAOf;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAChC,cAAc,CAYhB"}