@ebowwa/crm 0.1.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 (187) hide show
  1. package/README.md +174 -0
  2. package/dist/cli/commands/activities.d.ts +11 -0
  3. package/dist/cli/commands/activities.d.ts.map +1 -0
  4. package/dist/cli/commands/activities.js +427 -0
  5. package/dist/cli/commands/activities.js.map +1 -0
  6. package/dist/cli/commands/contacts.d.ts +11 -0
  7. package/dist/cli/commands/contacts.d.ts.map +1 -0
  8. package/dist/cli/commands/contacts.js +458 -0
  9. package/dist/cli/commands/contacts.js.map +1 -0
  10. package/dist/cli/commands/deals.d.ts +11 -0
  11. package/dist/cli/commands/deals.d.ts.map +1 -0
  12. package/dist/cli/commands/deals.js +498 -0
  13. package/dist/cli/commands/deals.js.map +1 -0
  14. package/dist/cli/commands/media.d.ts +11 -0
  15. package/dist/cli/commands/media.d.ts.map +1 -0
  16. package/dist/cli/commands/media.js +417 -0
  17. package/dist/cli/commands/media.js.map +1 -0
  18. package/dist/cli/commands/search.d.ts +11 -0
  19. package/dist/cli/commands/search.d.ts.map +1 -0
  20. package/dist/cli/commands/search.js +346 -0
  21. package/dist/cli/commands/search.js.map +1 -0
  22. package/dist/cli/index.d.ts +13 -0
  23. package/dist/cli/index.d.ts.map +1 -0
  24. package/dist/cli/index.js +173 -0
  25. package/dist/cli/index.js.map +1 -0
  26. package/dist/cli/repl.d.ts +15 -0
  27. package/dist/cli/repl.d.ts.map +1 -0
  28. package/dist/cli/repl.js +318 -0
  29. package/dist/cli/repl.js.map +1 -0
  30. package/dist/cli/utils/config.d.ts +91 -0
  31. package/dist/cli/utils/config.d.ts.map +1 -0
  32. package/dist/cli/utils/config.js +212 -0
  33. package/dist/cli/utils/config.js.map +1 -0
  34. package/dist/cli/utils/output.d.ts +136 -0
  35. package/dist/cli/utils/output.d.ts.map +1 -0
  36. package/dist/cli/utils/output.js +323 -0
  37. package/dist/cli/utils/output.js.map +1 -0
  38. package/dist/cli/utils/prompt.d.ts +81 -0
  39. package/dist/cli/utils/prompt.d.ts.map +1 -0
  40. package/dist/cli/utils/prompt.js +341 -0
  41. package/dist/cli/utils/prompt.js.map +1 -0
  42. package/dist/cli.d.ts +3 -0
  43. package/dist/cli.d.ts.map +1 -0
  44. package/dist/cli.js +8 -0
  45. package/dist/cli.js.map +1 -0
  46. package/dist/core/index.d.ts +6 -0
  47. package/dist/core/index.d.ts.map +1 -0
  48. package/dist/core/index.js +32 -0
  49. package/dist/core/index.js.map +1 -0
  50. package/dist/core/schemas.d.ts +3050 -0
  51. package/dist/core/schemas.d.ts.map +1 -0
  52. package/dist/core/schemas.js +667 -0
  53. package/dist/core/schemas.js.map +1 -0
  54. package/dist/core/types.d.ts +597 -0
  55. package/dist/core/types.d.ts.map +1 -0
  56. package/dist/core/types.js +8 -0
  57. package/dist/core/types.js.map +1 -0
  58. package/dist/index.d.ts +7 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +8 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/mcp/index.d.ts +14 -0
  63. package/dist/mcp/index.d.ts.map +1 -0
  64. package/dist/mcp/index.js +11 -0
  65. package/dist/mcp/index.js.map +1 -0
  66. package/dist/mcp/server.d.ts +13 -0
  67. package/dist/mcp/server.d.ts.map +1 -0
  68. package/dist/mcp/server.js +18 -0
  69. package/dist/mcp/server.js.map +1 -0
  70. package/dist/mcp/storage/client.d.ts +109 -0
  71. package/dist/mcp/storage/client.d.ts.map +1 -0
  72. package/dist/mcp/storage/client.js +355 -0
  73. package/dist/mcp/storage/client.js.map +1 -0
  74. package/dist/mcp/storage/index.d.ts +7 -0
  75. package/dist/mcp/storage/index.d.ts.map +1 -0
  76. package/dist/mcp/storage/index.js +6 -0
  77. package/dist/mcp/storage/index.js.map +1 -0
  78. package/dist/mcp/storage/types.d.ts +44 -0
  79. package/dist/mcp/storage/types.d.ts.map +1 -0
  80. package/dist/mcp/storage/types.js +35 -0
  81. package/dist/mcp/storage/types.js.map +1 -0
  82. package/dist/mcp/tools/definitions.d.ts +16 -0
  83. package/dist/mcp/tools/definitions.d.ts.map +1 -0
  84. package/dist/mcp/tools/definitions.js +914 -0
  85. package/dist/mcp/tools/definitions.js.map +1 -0
  86. package/dist/mcp/tools/handlers.d.ts +50 -0
  87. package/dist/mcp/tools/handlers.d.ts.map +1 -0
  88. package/dist/mcp/tools/handlers.js +760 -0
  89. package/dist/mcp/tools/handlers.js.map +1 -0
  90. package/dist/mcp/tools/index.d.ts +7 -0
  91. package/dist/mcp/tools/index.d.ts.map +1 -0
  92. package/dist/mcp/tools/index.js +6 -0
  93. package/dist/mcp/tools/index.js.map +1 -0
  94. package/dist/mcp/tools/types.d.ts +314 -0
  95. package/dist/mcp/tools/types.d.ts.map +1 -0
  96. package/dist/mcp/tools/types.js +5 -0
  97. package/dist/mcp/tools/types.js.map +1 -0
  98. package/dist/mcp/transports/stdio.d.ts +27 -0
  99. package/dist/mcp/transports/stdio.d.ts.map +1 -0
  100. package/dist/mcp/transports/stdio.js +237 -0
  101. package/dist/mcp/transports/stdio.js.map +1 -0
  102. package/dist/telemetry/index.d.ts +58 -0
  103. package/dist/telemetry/index.d.ts.map +1 -0
  104. package/dist/telemetry/index.js +109 -0
  105. package/dist/telemetry/index.js.map +1 -0
  106. package/dist/telemetry/logger.d.ts +116 -0
  107. package/dist/telemetry/logger.d.ts.map +1 -0
  108. package/dist/telemetry/logger.js +256 -0
  109. package/dist/telemetry/logger.js.map +1 -0
  110. package/dist/telemetry/metrics.d.ts +115 -0
  111. package/dist/telemetry/metrics.d.ts.map +1 -0
  112. package/dist/telemetry/metrics.js +292 -0
  113. package/dist/telemetry/metrics.js.map +1 -0
  114. package/dist/telemetry/tracer.d.ts +227 -0
  115. package/dist/telemetry/tracer.d.ts.map +1 -0
  116. package/dist/telemetry/tracer.js +355 -0
  117. package/dist/telemetry/tracer.js.map +1 -0
  118. package/dist/web/app.d.ts +2 -0
  119. package/dist/web/app.d.ts.map +1 -0
  120. package/dist/web/app.js +115 -0
  121. package/dist/web/app.js.map +1 -0
  122. package/dist/web/components/ContactList.d.ts +3 -0
  123. package/dist/web/components/ContactList.d.ts.map +1 -0
  124. package/dist/web/components/ContactList.js +262 -0
  125. package/dist/web/components/ContactList.js.map +1 -0
  126. package/dist/web/components/Dashboard.d.ts +3 -0
  127. package/dist/web/components/Dashboard.d.ts.map +1 -0
  128. package/dist/web/components/Dashboard.js +158 -0
  129. package/dist/web/components/Dashboard.js.map +1 -0
  130. package/dist/web/components/DealPipeline.d.ts +3 -0
  131. package/dist/web/components/DealPipeline.d.ts.map +1 -0
  132. package/dist/web/components/DealPipeline.js +306 -0
  133. package/dist/web/components/DealPipeline.js.map +1 -0
  134. package/dist/web/index.d.ts +2 -0
  135. package/dist/web/index.d.ts.map +1 -0
  136. package/dist/web/index.js +269 -0
  137. package/dist/web/index.js.map +1 -0
  138. package/dist/web/types.d.ts +75 -0
  139. package/dist/web/types.d.ts.map +1 -0
  140. package/dist/web/types.js +3 -0
  141. package/dist/web/types.js.map +1 -0
  142. package/native/index.d.ts +571 -0
  143. package/native/index.js +687 -0
  144. package/package.json +105 -0
  145. package/src/cli/commands/activities.ts +543 -0
  146. package/src/cli/commands/contacts.ts +563 -0
  147. package/src/cli/commands/deals.ts +637 -0
  148. package/src/cli/commands/media.ts +521 -0
  149. package/src/cli/commands/search.ts +426 -0
  150. package/src/cli/index.ts +203 -0
  151. package/src/cli/repl.ts +379 -0
  152. package/src/cli/utils/config.ts +299 -0
  153. package/src/cli/utils/output.ts +386 -0
  154. package/src/cli/utils/prompt.ts +444 -0
  155. package/src/cli.ts +11 -0
  156. package/src/core/index.ts +184 -0
  157. package/src/core/schemas.ts +770 -0
  158. package/src/core/types.ts +969 -0
  159. package/src/index.ts +8 -0
  160. package/src/mcp/index.ts +17 -0
  161. package/src/mcp/server.ts +26 -0
  162. package/src/mcp/storage/client.ts +408 -0
  163. package/src/mcp/storage/index.ts +7 -0
  164. package/src/mcp/storage/types.ts +72 -0
  165. package/src/mcp/tools/definitions.ts +961 -0
  166. package/src/mcp/tools/handlers.ts +805 -0
  167. package/src/mcp/tools/index.ts +7 -0
  168. package/src/mcp/tools/types.ts +390 -0
  169. package/src/mcp/transports/stdio.ts +225 -0
  170. package/src/telemetry/index.ts +131 -0
  171. package/src/telemetry/logger.ts +318 -0
  172. package/src/telemetry/metrics.ts +393 -0
  173. package/src/telemetry/tracer.ts +487 -0
  174. package/src/web/api/activities.ts +41 -0
  175. package/src/web/api/contacts.ts +114 -0
  176. package/src/web/api/deals.ts +108 -0
  177. package/src/web/api/media.ts +98 -0
  178. package/src/web/app.tsx +143 -0
  179. package/src/web/components/ActivityFeed.tsx +195 -0
  180. package/src/web/components/ContactList.tsx +340 -0
  181. package/src/web/components/Dashboard.tsx +214 -0
  182. package/src/web/components/DealPipeline.tsx +405 -0
  183. package/src/web/components/MediaGallery.tsx +334 -0
  184. package/src/web/index.html +14 -0
  185. package/src/web/index.ts +326 -0
  186. package/src/web/styles/main.css +180 -0
  187. package/src/web/types.ts +311 -0
@@ -0,0 +1,306 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ const pipelineColumns = [
3
+ { id: 'early', title: 'Early Stage', stages: ['discovery', 'qualification'], color: 'border-blue-500' },
4
+ { id: 'middle', title: 'Middle Stage', stages: ['proposal'], color: 'border-yellow-500' },
5
+ { id: 'late', title: 'Late Stage', stages: ['negotiation'], color: 'border-purple-500' },
6
+ { id: 'closed', title: 'Closed', stages: ['closed_won', 'closed_lost'], color: 'border-green-500' },
7
+ ];
8
+ const stageLabels = {
9
+ discovery: 'Discovery',
10
+ qualification: 'Qualification',
11
+ proposal: 'Proposal',
12
+ negotiation: 'Negotiation',
13
+ closed_won: 'Won',
14
+ closed_lost: 'Lost',
15
+ };
16
+ export default function DealPipeline() {
17
+ const [deals, setDeals] = useState([]);
18
+ const [contacts, setContacts] = useState([]);
19
+ const [loading, setLoading] = useState(true);
20
+ const [showModal, setShowModal] = useState(false);
21
+ const [selectedDeal, setSelectedDeal] = useState(null);
22
+ const [draggedDeal, setDraggedDeal] = useState(null);
23
+ const [formData, setFormData] = useState({
24
+ title: '',
25
+ contactId: '',
26
+ value: 0,
27
+ currency: 'USD',
28
+ stage: 'discovery',
29
+ probability: 10,
30
+ expectedCloseDate: '',
31
+ description: '',
32
+ });
33
+ const fetchData = async () => {
34
+ try {
35
+ const [dealsRes, contactsRes] = await Promise.all([
36
+ fetch('/api/deals'),
37
+ fetch('/api/contacts'),
38
+ ]);
39
+ const dealsData = await dealsRes.json();
40
+ const contactsData = await contactsRes.json();
41
+ if (dealsData.success)
42
+ setDeals(dealsData.data || []);
43
+ if (contactsData.success)
44
+ setContacts(contactsData.data || []);
45
+ }
46
+ catch (error) {
47
+ console.error('Failed to fetch data:', error);
48
+ }
49
+ finally {
50
+ setLoading(false);
51
+ }
52
+ };
53
+ useEffect(() => {
54
+ fetchData();
55
+ }, []);
56
+ const handleCreate = () => {
57
+ setSelectedDeal(null);
58
+ setFormData({
59
+ title: '',
60
+ contactId: '',
61
+ value: 0,
62
+ currency: 'USD',
63
+ stage: 'discovery',
64
+ probability: 10,
65
+ expectedCloseDate: '',
66
+ description: '',
67
+ });
68
+ setShowModal(true);
69
+ };
70
+ const handleEdit = (deal) => {
71
+ setSelectedDeal(deal);
72
+ setFormData({
73
+ title: deal.title,
74
+ contactId: deal.contactId,
75
+ value: deal.value,
76
+ currency: deal.currency,
77
+ stage: deal.stage,
78
+ probability: deal.probability,
79
+ expectedCloseDate: deal.expectedCloseDate || '',
80
+ description: deal.description || '',
81
+ });
82
+ setShowModal(true);
83
+ };
84
+ const handleSubmit = async (e) => {
85
+ e.preventDefault();
86
+ try {
87
+ const url = selectedDeal ? `/api/deals/${selectedDeal.id}` : '/api/deals';
88
+ const method = selectedDeal ? 'PUT' : 'POST';
89
+ const response = await fetch(url, {
90
+ method,
91
+ headers: { 'Content-Type': 'application/json' },
92
+ body: JSON.stringify(formData),
93
+ });
94
+ const data = await response.json();
95
+ if (data.success && data.data) {
96
+ if (selectedDeal) {
97
+ setDeals(deals.map(d => d.id === data.data.id ? data.data : d));
98
+ }
99
+ else {
100
+ setDeals([...deals, data.data]);
101
+ }
102
+ setShowModal(false);
103
+ }
104
+ }
105
+ catch (error) {
106
+ console.error('Failed to save deal:', error);
107
+ }
108
+ };
109
+ const handleDragStart = (deal) => {
110
+ setDraggedDeal(deal);
111
+ };
112
+ const handleDragOver = (e) => {
113
+ e.preventDefault();
114
+ };
115
+ const handleDrop = async (e, newStage) => {
116
+ e.preventDefault();
117
+ if (!draggedDeal || draggedDeal.stage === newStage) {
118
+ setDraggedDeal(null);
119
+ return;
120
+ }
121
+ try {
122
+ const response = await fetch(`/api/deals/${draggedDeal.id}`, {
123
+ method: 'PUT',
124
+ headers: { 'Content-Type': 'application/json' },
125
+ body: JSON.stringify({ ...draggedDeal, stage: newStage }),
126
+ });
127
+ const data = await response.json();
128
+ if (data.success && data.data) {
129
+ setDeals(deals.map(d => d.id === data.data.id ? data.data : d));
130
+ }
131
+ }
132
+ catch (error) {
133
+ console.error('Failed to update deal stage:', error);
134
+ }
135
+ finally {
136
+ setDraggedDeal(null);
137
+ }
138
+ };
139
+ const getContactName = (contactId) => {
140
+ const contact = contacts.find(c => c.id === contactId);
141
+ return contact?.name || 'Unknown';
142
+ };
143
+ const formatCurrency = (value, currency = 'USD') => {
144
+ return new Intl.NumberFormat('en-US', {
145
+ style: 'currency',
146
+ currency,
147
+ minimumFractionDigits: 0,
148
+ maximumFractionDigits: 0,
149
+ }).format(value);
150
+ };
151
+ const getDealsByStage = (stage) => {
152
+ return deals.filter(d => d.stage === stage);
153
+ };
154
+ const getColumnTotal = (column) => {
155
+ return column.stages.reduce((sum, stage) => {
156
+ return sum + getDealsByStage(stage).reduce((s, d) => s + d.value, 0);
157
+ }, 0);
158
+ };
159
+ if (loading) {
160
+ return (<div className="flex items-center justify-center h-64">
161
+ <div className="crm-spinner"/>
162
+ </div>);
163
+ }
164
+ return (<div className="space-y-6">
165
+ {/* Header */}
166
+ <div className="flex items-center justify-between">
167
+ <div>
168
+ <h2 className="text-2xl font-bold">Deal Pipeline</h2>
169
+ <p className="text-gray-400">
170
+ Total Pipeline: {formatCurrency(deals.reduce((sum, d) => sum + d.value, 0))}
171
+ </p>
172
+ </div>
173
+ <button onClick={handleCreate} className="crm-btn crm-btn-primary">
174
+ + Add Deal
175
+ </button>
176
+ </div>
177
+
178
+ {/* Pipeline Board */}
179
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 overflow-x-auto">
180
+ {pipelineColumns.map(column => (<div key={column.id} className="pipeline-column">
181
+ <div className={`border-t-4 ${column.color} rounded-t-lg pt-3 mb-3`}>
182
+ <div className="flex items-center justify-between px-2">
183
+ <h3 className="font-semibold">{column.title}</h3>
184
+ <span className="text-sm text-gray-400">
185
+ {formatCurrency(getColumnTotal(column))}
186
+ </span>
187
+ </div>
188
+ </div>
189
+
190
+ {column.stages.map(stage => (<div key={stage} className="mb-4" onDragOver={handleDragOver} onDrop={(e) => handleDrop(e, stage)}>
191
+ <div className="flex items-center gap-2 mb-2 px-2">
192
+ <span className="text-sm text-gray-400">{stageLabels[stage]}</span>
193
+ <span className="text-xs bg-gray-700 px-2 py-0.5 rounded-full">
194
+ {getDealsByStage(stage).length}
195
+ </span>
196
+ </div>
197
+
198
+ <div className="space-y-2">
199
+ {getDealsByStage(stage).map(deal => (<div key={deal.id} draggable onDragStart={() => handleDragStart(deal)} onClick={() => handleEdit(deal)} className={`pipeline-card ${draggedDeal?.id === deal.id ? 'dragging' : ''}`}>
200
+ <h4 className="font-medium mb-2">{deal.title}</h4>
201
+ <p className="text-sm text-gray-400 mb-2">
202
+ {getContactName(deal.contactId)}
203
+ </p>
204
+ <div className="flex items-center justify-between">
205
+ <span className="text-lg font-bold text-green-400">
206
+ {formatCurrency(deal.value, deal.currency)}
207
+ </span>
208
+ <span className="text-xs bg-gray-700 px-2 py-1 rounded">
209
+ {deal.probability}%
210
+ </span>
211
+ </div>
212
+ </div>))}
213
+ </div>
214
+ </div>))}
215
+ </div>))}
216
+ </div>
217
+
218
+ {/* Modal */}
219
+ {showModal && (<div className="crm-modal-backdrop" onClick={() => setShowModal(false)}>
220
+ <div className="crm-modal max-w-2xl" onClick={(e) => e.stopPropagation()}>
221
+ <h3 className="text-xl font-bold mb-4">
222
+ {selectedDeal ? 'Edit Deal' : 'Add Deal'}
223
+ </h3>
224
+ <form onSubmit={handleSubmit} className="space-y-4">
225
+ <div>
226
+ <label className="block text-sm font-medium text-gray-400 mb-1">
227
+ Title *
228
+ </label>
229
+ <input type="text" required value={formData.title} onChange={(e) => setFormData({ ...formData, title: e.target.value })} className="crm-input"/>
230
+ </div>
231
+
232
+ <div className="grid grid-cols-2 gap-4">
233
+ <div>
234
+ <label className="block text-sm font-medium text-gray-400 mb-1">
235
+ Contact
236
+ </label>
237
+ <select value={formData.contactId} onChange={(e) => setFormData({ ...formData, contactId: e.target.value })} className="crm-input">
238
+ <option value="">Select contact...</option>
239
+ {contacts.map(contact => (<option key={contact.id} value={contact.id}>
240
+ {contact.name} ({contact.company || 'No company'})
241
+ </option>))}
242
+ </select>
243
+ </div>
244
+ <div>
245
+ <label className="block text-sm font-medium text-gray-400 mb-1">
246
+ Stage
247
+ </label>
248
+ <select value={formData.stage} onChange={(e) => setFormData({ ...formData, stage: e.target.value })} className="crm-input">
249
+ {Object.entries(stageLabels).map(([value, label]) => (<option key={value} value={value}>{label}</option>))}
250
+ </select>
251
+ </div>
252
+ </div>
253
+
254
+ <div className="grid grid-cols-3 gap-4">
255
+ <div>
256
+ <label className="block text-sm font-medium text-gray-400 mb-1">
257
+ Value *
258
+ </label>
259
+ <input type="number" required min="0" value={formData.value} onChange={(e) => setFormData({ ...formData, value: parseFloat(e.target.value) })} className="crm-input"/>
260
+ </div>
261
+ <div>
262
+ <label className="block text-sm font-medium text-gray-400 mb-1">
263
+ Currency
264
+ </label>
265
+ <select value={formData.currency} onChange={(e) => setFormData({ ...formData, currency: e.target.value })} className="crm-input">
266
+ <option value="USD">USD</option>
267
+ <option value="EUR">EUR</option>
268
+ <option value="GBP">GBP</option>
269
+ </select>
270
+ </div>
271
+ <div>
272
+ <label className="block text-sm font-medium text-gray-400 mb-1">
273
+ Probability (%)
274
+ </label>
275
+ <input type="number" min="0" max="100" value={formData.probability} onChange={(e) => setFormData({ ...formData, probability: parseInt(e.target.value) })} className="crm-input"/>
276
+ </div>
277
+ </div>
278
+
279
+ <div>
280
+ <label className="block text-sm font-medium text-gray-400 mb-1">
281
+ Expected Close Date
282
+ </label>
283
+ <input type="date" value={formData.expectedCloseDate} onChange={(e) => setFormData({ ...formData, expectedCloseDate: e.target.value })} className="crm-input"/>
284
+ </div>
285
+
286
+ <div>
287
+ <label className="block text-sm font-medium text-gray-400 mb-1">
288
+ Description
289
+ </label>
290
+ <textarea value={formData.description} onChange={(e) => setFormData({ ...formData, description: e.target.value })} className="crm-input h-24 resize-none"/>
291
+ </div>
292
+
293
+ <div className="flex gap-3 pt-4">
294
+ <button type="submit" className="crm-btn crm-btn-primary flex-1">
295
+ {selectedDeal ? 'Update' : 'Create'}
296
+ </button>
297
+ <button type="button" onClick={() => setShowModal(false)} className="crm-btn crm-btn-secondary flex-1">
298
+ Cancel
299
+ </button>
300
+ </div>
301
+ </form>
302
+ </div>
303
+ </div>)}
304
+ </div>);
305
+ }
306
+ //# sourceMappingURL=DealPipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DealPipeline.js","sourceRoot":"","sources":["../../../src/web/components/DealPipeline.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAUnD,MAAM,eAAe,GAAqB;IACxC,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,WAAW,EAAE,eAAe,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE;IACvG,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE;IACzF,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE;IACxF,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,YAAY,EAAE,aAAa,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE;CACpG,CAAC;AAEF,MAAM,WAAW,GAA2B;IAC1C,SAAS,EAAE,WAAW;IACtB,aAAa,EAAE,eAAe;IAC9B,QAAQ,EAAE,UAAU;IACpB,WAAW,EAAE,aAAa;IAC1B,UAAU,EAAE,KAAK;IACjB,WAAW,EAAE,MAAM;CACpB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,YAAY;IAClC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAY,EAAE,CAAC,CAAC;IACxD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAc,IAAI,CAAC,CAAC;IACpE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAc,IAAI,CAAC,CAAC;IAClE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC;QACvC,KAAK,EAAE,EAAE;QACT,SAAS,EAAE,EAAE;QACb,KAAK,EAAE,CAAC;QACR,QAAQ,EAAE,KAAK;QACf,KAAK,EAAE,WAA4B;QACnC,WAAW,EAAE,EAAE;QACf,iBAAiB,EAAE,EAAE;QACrB,WAAW,EAAE,EAAE;KAChB,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;QAC3B,IAAI,CAAC;YACH,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAChD,KAAK,CAAC,YAAY,CAAC;gBACnB,KAAK,CAAC,eAAe,CAAC;aACvB,CAAC,CAAC;YAEH,MAAM,SAAS,GAAwB,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC7D,MAAM,YAAY,GAA2B,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;YAEtE,IAAI,SAAS,CAAC,OAAO;gBAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YACtD,IAAI,YAAY,CAAC,OAAO;gBAAE,WAAW,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACjE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,SAAS,EAAE,CAAC;IACd,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,eAAe,CAAC,IAAI,CAAC,CAAC;QACtB,WAAW,CAAC;YACV,KAAK,EAAE,EAAE;YACT,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,CAAC;YACR,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,WAAW;YAClB,WAAW,EAAE,EAAE;YACf,iBAAiB,EAAE,EAAE;YACrB,WAAW,EAAE,EAAE;SAChB,CAAC,CAAC;QACH,YAAY,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,IAAU,EAAE,EAAE;QAChC,eAAe,CAAC,IAAI,CAAC,CAAC;QACtB,WAAW,CAAC;YACV,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,IAAI,EAAE;YAC/C,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;SACpC,CAAC,CAAC;QACH,YAAY,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,KAAK,EAAE,CAAkB,EAAE,EAAE;QAChD,CAAC,CAAC,cAAc,EAAE,CAAC;QAEnB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,cAAc,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;YAC1E,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;YAE7C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,MAAM;gBACN,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;aAC/B,CAAC,CAAC;YAEH,MAAM,IAAI,GAAsB,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAEtD,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC9B,IAAI,YAAY,EAAE,CAAC;oBACjB,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,IAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpE,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAClC,CAAC;gBACD,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,CAAC,IAAU,EAAE,EAAE;QACrC,cAAc,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,CAAC,CAAkB,EAAE,EAAE;QAC5C,CAAC,CAAC,cAAc,EAAE,CAAC;IACrB,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,KAAK,EAAE,CAAkB,EAAE,QAAuB,EAAE,EAAE;QACvE,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnD,cAAc,CAAC,IAAI,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,cAAc,WAAW,CAAC,EAAE,EAAE,EAAE;gBAC3D,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;aAC1D,CAAC,CAAC;YAEH,MAAM,IAAI,GAAsB,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAEtD,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC9B,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,IAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;gBAAS,CAAC;YACT,cAAc,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,CAAC,SAAiB,EAAE,EAAE;QAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QACvD,OAAO,OAAO,EAAE,IAAI,IAAI,SAAS,CAAC;IACpC,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,CAAC,KAAa,EAAE,WAAmB,KAAK,EAAE,EAAE;QACjE,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;YACpC,KAAK,EAAE,UAAU;YACjB,QAAQ;YACR,qBAAqB,EAAE,CAAC;YACxB,qBAAqB,EAAE,CAAC;SACzB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,CAAC,KAAa,EAAE,EAAE;QACxC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IAC9C,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,CAAC,MAAsB,EAAE,EAAE;QAChD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACzC,OAAO,GAAG,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACvE,CAAC,EAAE,CAAC,CAAC,CAAC;IACR,CAAC,CAAC;IAEF,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CACL,CAAC,GAAG,CAAC,SAAS,CAAC,uCAAuC,CACpD;QAAA,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,EAC9B;MAAA,EAAE,GAAG,CAAC,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CACxB;MAAA,CAAC,YAAY,CACb;MAAA,CAAC,GAAG,CAAC,SAAS,CAAC,mCAAmC,CAChD;QAAA,CAAC,GAAG,CACF;UAAA,CAAC,EAAE,CAAC,SAAS,CAAC,oBAAoB,CAAC,aAAa,EAAE,EAAE,CACpD;UAAA,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAC1B;4BAAgB,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAC7E;UAAA,EAAE,CAAC,CACL;QAAA,EAAE,GAAG,CACL;QAAA,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAChE;;QACF,EAAE,MAAM,CACV;MAAA,EAAE,GAAG,CAEL;;MAAA,CAAC,oBAAoB,CACrB;MAAA,CAAC,GAAG,CAAC,SAAS,CAAC,sEAAsE,CACnF;QAAA,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAC7B,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAC9C;YAAA,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,cAAc,MAAM,CAAC,KAAK,yBAAyB,CAAC,CAClE;cAAA,CAAC,GAAG,CAAC,SAAS,CAAC,wCAAwC,CACrD;gBAAA,CAAC,EAAE,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAChD;gBAAA,CAAC,IAAI,CAAC,SAAS,CAAC,uBAAuB,CACrC;kBAAA,CAAC,cAAc,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CACzC;gBAAA,EAAE,IAAI,CACR;cAAA,EAAE,GAAG,CACP;YAAA,EAAE,GAAG,CAEL;;YAAA,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAC1B,CAAC,GAAG,CACF,GAAG,CAAC,CAAC,KAAK,CAAC,CACX,SAAS,CAAC,MAAM,CAChB,UAAU,CAAC,CAAC,cAAc,CAAC,CAC3B,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAsB,CAAC,CAAC,CAErD;gBAAA,CAAC,GAAG,CAAC,SAAS,CAAC,mCAAmC,CAChD;kBAAA,CAAC,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAClE;kBAAA,CAAC,IAAI,CAAC,SAAS,CAAC,8CAA8C,CAC5D;oBAAA,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,MAAM,CAChC;kBAAA,EAAE,IAAI,CACR;gBAAA,EAAE,GAAG,CAEL;;gBAAA,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CACxB;kBAAA,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAClC,CAAC,GAAG,CACF,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CACb,SAAS,CACT,WAAW,CAAC,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CACzC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAChC,SAAS,CAAC,CAAC,iBACT,WAAW,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAC7C,EAAE,CAAC,CAEH;sBAAA,CAAC,EAAE,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CACjD;sBAAA,CAAC,CAAC,CAAC,SAAS,CAAC,4BAA4B,CACvC;wBAAA,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CACjC;sBAAA,EAAE,CAAC,CACH;sBAAA,CAAC,GAAG,CAAC,SAAS,CAAC,mCAAmC,CAChD;wBAAA,CAAC,IAAI,CAAC,SAAS,CAAC,kCAAkC,CAChD;0BAAA,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAC5C;wBAAA,EAAE,IAAI,CACN;wBAAA,CAAC,IAAI,CAAC,SAAS,CAAC,uCAAuC,CACrD;0BAAA,CAAC,IAAI,CAAC,WAAW,CAAC;wBACpB,EAAE,IAAI,CACR;sBAAA,EAAE,GAAG,CACP;oBAAA,EAAE,GAAG,CAAC,CACP,CAAC,CACJ;gBAAA,EAAE,GAAG,CACP;cAAA,EAAE,GAAG,CAAC,CACP,CAAC,CACJ;UAAA,EAAE,GAAG,CAAC,CACP,CAAC,CACJ;MAAA,EAAE,GAAG,CAEL;;MAAA,CAAC,WAAW,CACZ;MAAA,CAAC,SAAS,IAAI,CACZ,CAAC,GAAG,CAAC,SAAS,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CACrE;UAAA,CAAC,GAAG,CAAC,SAAS,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CACvE;YAAA,CAAC,EAAE,CAAC,SAAS,CAAC,wBAAwB,CACpC;cAAA,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAC1C;YAAA,EAAE,EAAE,CACJ;YAAA,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,WAAW,CACjD;cAAA,CAAC,GAAG,CACF;gBAAA,CAAC,KAAK,CAAC,SAAS,CAAC,8CAA8C,CAC7D;;gBACF,EAAE,KAAK,CACP;gBAAA,CAAC,KAAK,CACJ,IAAI,CAAC,MAAM,CACX,QAAQ,CACR,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CACtB,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CACrE,SAAS,CAAC,WAAW,EAEzB;cAAA,EAAE,GAAG,CAEL;;cAAA,CAAC,GAAG,CAAC,SAAS,CAAC,wBAAwB,CACrC;gBAAA,CAAC,GAAG,CACF;kBAAA,CAAC,KAAK,CAAC,SAAS,CAAC,8CAA8C,CAC7D;;kBACF,EAAE,KAAK,CACP;kBAAA,CAAC,MAAM,CACL,KAAK,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAC1B,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CACzE,SAAS,CAAC,WAAW,CAErB;oBAAA,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,iBAAiB,EAAE,MAAM,CAC1C;oBAAA,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CACvB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CACzC;wBAAA,CAAC,OAAO,CAAC,IAAI,CAAE,EAAC,CAAC,OAAO,CAAC,OAAO,IAAI,YAAY,CAAC;sBACnD,EAAE,MAAM,CAAC,CACV,CAAC,CACJ;kBAAA,EAAE,MAAM,CACV;gBAAA,EAAE,GAAG,CACL;gBAAA,CAAC,GAAG,CACF;kBAAA,CAAC,KAAK,CAAC,SAAS,CAAC,8CAA8C,CAC7D;;kBACF,EAAE,KAAK,CACP;kBAAA,CAAC,MAAM,CACL,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CACtB,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAsB,EAAE,CAAC,CAAC,CACtF,SAAS,CAAC,WAAW,CAErB;oBAAA,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CACnD,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CACnD,CAAC,CACJ;kBAAA,EAAE,MAAM,CACV;gBAAA,EAAE,GAAG,CACP;cAAA,EAAE,GAAG,CAEL;;cAAA,CAAC,GAAG,CAAC,SAAS,CAAC,wBAAwB,CACrC;gBAAA,CAAC,GAAG,CACF;kBAAA,CAAC,KAAK,CAAC,SAAS,CAAC,8CAA8C,CAC7D;;kBACF,EAAE,KAAK,CACP;kBAAA,CAAC,KAAK,CACJ,IAAI,CAAC,QAAQ,CACb,QAAQ,CACR,GAAG,CAAC,GAAG,CACP,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CACtB,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CACjF,SAAS,CAAC,WAAW,EAEzB;gBAAA,EAAE,GAAG,CACL;gBAAA,CAAC,GAAG,CACF;kBAAA,CAAC,KAAK,CAAC,SAAS,CAAC,8CAA8C,CAC7D;;kBACF,EAAE,KAAK,CACP;kBAAA,CAAC,MAAM,CACL,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CACzB,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,GAAG,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CACxE,SAAS,CAAC,WAAW,CAErB;oBAAA,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAC/B;oBAAA,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAC/B;oBAAA,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CACjC;kBAAA,EAAE,MAAM,CACV;gBAAA,EAAE,GAAG,CACL;gBAAA,CAAC,GAAG,CACF;kBAAA,CAAC,KAAK,CAAC,SAAS,CAAC,8CAA8C,CAC7D;;kBACF,EAAE,KAAK,CACP;kBAAA,CAAC,KAAK,CACJ,IAAI,CAAC,QAAQ,CACb,GAAG,CAAC,GAAG,CACP,GAAG,CAAC,KAAK,CACT,KAAK,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC5B,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,GAAG,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CACrF,SAAS,CAAC,WAAW,EAEzB;gBAAA,EAAE,GAAG,CACP;cAAA,EAAE,GAAG,CAEL;;cAAA,CAAC,GAAG,CACF;gBAAA,CAAC,KAAK,CAAC,SAAS,CAAC,8CAA8C,CAC7D;;gBACF,EAAE,KAAK,CACP;gBAAA,CAAC,KAAK,CACJ,IAAI,CAAC,MAAM,CACX,KAAK,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAClC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,GAAG,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CACjF,SAAS,CAAC,WAAW,EAEzB;cAAA,EAAE,GAAG,CAEL;;cAAA,CAAC,GAAG,CACF;gBAAA,CAAC,KAAK,CAAC,SAAS,CAAC,8CAA8C,CAC7D;;gBACF,EAAE,KAAK,CACP;gBAAA,CAAC,QAAQ,CACP,KAAK,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC5B,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,GAAG,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAC3E,SAAS,CAAC,4BAA4B,EAE1C;cAAA,EAAE,GAAG,CAEL;;cAAA,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAC9B;gBAAA,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,gCAAgC,CAC9D;kBAAA,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CACrC;gBAAA,EAAE,MAAM,CACR;gBAAA,CAAC,MAAM,CACL,IAAI,CAAC,QAAQ,CACb,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CACnC,SAAS,CAAC,kCAAkC,CAE5C;;gBACF,EAAE,MAAM,CACV;cAAA,EAAE,GAAG,CACP;YAAA,EAAE,IAAI,CACR;UAAA,EAAE,GAAG,CACP;QAAA,EAAE,GAAG,CAAC,CACP,CACH;IAAA,EAAE,GAAG,CAAC,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/web/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,269 @@
1
+ import index from "./index.html";
2
+ // In-memory storage (would be replaced with database)
3
+ const contacts = new Map();
4
+ const deals = new Map();
5
+ const activities = [];
6
+ const mediaFiles = new Map();
7
+ const connectedClients = new Set();
8
+ // WebSocket message broadcasting
9
+ function broadcast(message) {
10
+ const payload = JSON.stringify({ ...message, timestamp: new Date().toISOString() });
11
+ for (const client of connectedClients) {
12
+ client.send(payload);
13
+ }
14
+ }
15
+ // Helper to generate IDs
16
+ function generateId() {
17
+ return crypto.randomUUID();
18
+ }
19
+ // API Handlers
20
+ async function listContacts(request) {
21
+ const url = new URL(request.url);
22
+ const search = url.searchParams.get('search') || '';
23
+ const status = url.searchParams.get('status') || '';
24
+ let results = Array.from(contacts.values());
25
+ if (search) {
26
+ const searchLower = search.toLowerCase();
27
+ results = results.filter(c => c.name.toLowerCase().includes(searchLower) ||
28
+ c.email.toLowerCase().includes(searchLower) ||
29
+ c.company?.toLowerCase().includes(searchLower));
30
+ }
31
+ if (status) {
32
+ results = results.filter(c => c.status === status);
33
+ }
34
+ return Response.json({ success: true, data: results });
35
+ }
36
+ async function createContact(request) {
37
+ const body = await request.json();
38
+ const id = generateId();
39
+ const now = new Date().toISOString();
40
+ const contact = {
41
+ id,
42
+ name: body.name,
43
+ email: body.email,
44
+ phone: body.phone,
45
+ company: body.company,
46
+ title: body.title,
47
+ status: body.status || 'lead',
48
+ tags: body.tags || [],
49
+ notes: body.notes,
50
+ createdAt: now,
51
+ updatedAt: now,
52
+ };
53
+ contacts.set(id, contact);
54
+ // Create activity
55
+ const activity = {
56
+ id: generateId(),
57
+ type: 'contact',
58
+ description: `New contact created: ${contact.name}`,
59
+ contactId: id,
60
+ userId: 'system',
61
+ timestamp: now,
62
+ };
63
+ activities.unshift(activity);
64
+ broadcast({ type: 'contact_update', payload: contact });
65
+ return Response.json({ success: true, data: contact });
66
+ }
67
+ async function getContact(request, params) {
68
+ const contact = contacts.get(params.id);
69
+ if (!contact) {
70
+ return Response.json({ success: false, error: 'Contact not found' }, { status: 404 });
71
+ }
72
+ return Response.json({ success: true, data: contact });
73
+ }
74
+ async function updateContact(request, params) {
75
+ const contact = contacts.get(params.id);
76
+ if (!contact) {
77
+ return Response.json({ success: false, error: 'Contact not found' }, { status: 404 });
78
+ }
79
+ const body = await request.json();
80
+ const updated = {
81
+ ...contact,
82
+ ...body,
83
+ id: contact.id,
84
+ createdAt: contact.createdAt,
85
+ updatedAt: new Date().toISOString(),
86
+ };
87
+ contacts.set(params.id, updated);
88
+ const activity = {
89
+ id: generateId(),
90
+ type: 'contact',
91
+ description: `Contact updated: ${updated.name}`,
92
+ contactId: updated.id,
93
+ userId: 'system',
94
+ timestamp: updated.updatedAt,
95
+ };
96
+ activities.unshift(activity);
97
+ broadcast({ type: 'contact_update', payload: updated });
98
+ return Response.json({ success: true, data: updated });
99
+ }
100
+ async function deleteContact(request, params) {
101
+ const contact = contacts.get(params.id);
102
+ if (!contact) {
103
+ return Response.json({ success: false, error: 'Contact not found' }, { status: 404 });
104
+ }
105
+ contacts.delete(params.id);
106
+ broadcast({ type: 'contact_update', payload: { id: params.id, deleted: true } });
107
+ return Response.json({ success: true });
108
+ }
109
+ async function listDeals(request) {
110
+ const url = new URL(request.url);
111
+ const stage = url.searchParams.get('stage') || '';
112
+ let results = Array.from(deals.values());
113
+ if (stage) {
114
+ results = results.filter(d => d.stage === stage);
115
+ }
116
+ return Response.json({ success: true, data: results });
117
+ }
118
+ async function createDeal(request) {
119
+ const body = await request.json();
120
+ const id = generateId();
121
+ const now = new Date().toISOString();
122
+ const deal = {
123
+ id,
124
+ contactId: body.contactId,
125
+ title: body.title,
126
+ value: body.value,
127
+ currency: body.currency || 'USD',
128
+ stage: body.stage || 'discovery',
129
+ probability: body.probability || 10,
130
+ expectedCloseDate: body.expectedCloseDate,
131
+ description: body.description,
132
+ createdAt: now,
133
+ updatedAt: now,
134
+ };
135
+ deals.set(id, deal);
136
+ const activity = {
137
+ id: generateId(),
138
+ type: 'deal',
139
+ description: `New deal created: ${deal.title}`,
140
+ dealId: id,
141
+ userId: 'system',
142
+ timestamp: now,
143
+ };
144
+ activities.unshift(activity);
145
+ broadcast({ type: 'deal_update', payload: deal });
146
+ return Response.json({ success: true, data: deal });
147
+ }
148
+ async function listActivities(request) {
149
+ const url = new URL(request.url);
150
+ const limit = parseInt(url.searchParams.get('limit') || '50');
151
+ return Response.json({
152
+ success: true,
153
+ data: activities.slice(0, limit)
154
+ });
155
+ }
156
+ async function uploadMedia(request) {
157
+ const formData = await request.formData();
158
+ const file = formData.get('file');
159
+ if (!file) {
160
+ return Response.json({ success: false, error: 'No file provided' }, { status: 400 });
161
+ }
162
+ const id = generateId();
163
+ const now = new Date().toISOString();
164
+ // Store file (in production, this would go to S3, etc.)
165
+ const buffer = await file.arrayBuffer();
166
+ const uploadsDir = './uploads';
167
+ await Bun.write(`${uploadsDir}/${id}-${file.name}`, buffer);
168
+ const media = {
169
+ id,
170
+ filename: file.name,
171
+ mimetype: file.type,
172
+ size: file.size,
173
+ url: `/media/${id}`,
174
+ contactId: formData.get('contactId') || undefined,
175
+ dealId: formData.get('dealId') || undefined,
176
+ uploadedBy: 'system',
177
+ uploadedAt: now,
178
+ };
179
+ mediaFiles.set(id, media);
180
+ broadcast({ type: 'media_upload', payload: media });
181
+ return Response.json({ success: true, data: media });
182
+ }
183
+ async function getDashboardStats() {
184
+ const totalContacts = contacts.size;
185
+ const activeDeals = Array.from(deals.values()).filter(d => !d.stage.startsWith('closed_')).length;
186
+ const pipelineValue = Array.from(deals.values())
187
+ .filter(d => !d.stage.startsWith('closed_'))
188
+ .reduce((sum, d) => sum + d.value, 0);
189
+ const wonThisMonth = Array.from(deals.values())
190
+ .filter(d => d.stage === 'closed_won')
191
+ .reduce((sum, d) => sum + d.value, 0);
192
+ return Response.json({
193
+ success: true,
194
+ data: {
195
+ totalContacts,
196
+ activeDeals,
197
+ pipelineValue,
198
+ wonThisMonth,
199
+ activitiesToday: activities.filter(a => new Date(a.timestamp).toDateString() === new Date().toDateString()).length,
200
+ conversionRate: totalContacts > 0 ? (activeDeals / totalContacts) * 100 : 0,
201
+ }
202
+ });
203
+ }
204
+ // WebSocket handler
205
+ const websocketHandler = {
206
+ open(ws) {
207
+ connectedClients.add(ws);
208
+ ws.send(JSON.stringify({ type: 'connected', timestamp: new Date().toISOString() }));
209
+ console.log('WebSocket client connected');
210
+ },
211
+ message(ws, message) {
212
+ // Handle incoming WebSocket messages
213
+ try {
214
+ const data = JSON.parse(message.toString());
215
+ console.log('WebSocket message:', data);
216
+ // Echo back or broadcast as needed
217
+ }
218
+ catch (e) {
219
+ console.error('Invalid WebSocket message:', e);
220
+ }
221
+ },
222
+ close(ws) {
223
+ connectedClients.delete(ws);
224
+ console.log('WebSocket client disconnected');
225
+ },
226
+ };
227
+ // Server
228
+ const server = Bun.serve({
229
+ port: 3001,
230
+ routes: {
231
+ "/": index,
232
+ "/api/contacts": {
233
+ GET: listContacts,
234
+ POST: createContact,
235
+ },
236
+ "/api/contacts/:id": {
237
+ GET: getContact,
238
+ PUT: updateContact,
239
+ DELETE: deleteContact,
240
+ },
241
+ "/api/deals": {
242
+ GET: listDeals,
243
+ POST: createDeal,
244
+ },
245
+ "/api/activities": {
246
+ GET: listActivities,
247
+ },
248
+ "/api/media": {
249
+ POST: uploadMedia,
250
+ },
251
+ "/api/dashboard/stats": {
252
+ GET: getDashboardStats,
253
+ },
254
+ },
255
+ websocket: websocketHandler,
256
+ development: {
257
+ hmr: true,
258
+ console: true,
259
+ },
260
+ });
261
+ // Ensure uploads directory exists
262
+ Bun.file('./uploads').exists().then(async (exists) => {
263
+ if (!exists) {
264
+ await Bun.write('./uploads/.gitkeep', '');
265
+ }
266
+ });
267
+ console.log(`CRM Web Interface running at http://localhost:${server.port}`);
268
+ console.log('WebSocket endpoint: ws://localhost:3001/ws');
269
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/web/index.ts"],"names":[],"mappings":"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"}