@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
package/README.md ADDED
@@ -0,0 +1,174 @@
1
+ # @ebowwa/crm
2
+
3
+ MCP server, CRM types, schemas, CLI, web interface, and native Rust module for high-performance search.
4
+
5
+ ## Features
6
+
7
+ - **MCP Server** - Model Context Protocol server for AI integration
8
+ - **CLI Tool** - Interactive command-line interface with persistent storage
9
+ - **Web Interface** - Bun.serve() with React frontend
10
+ - **LMDB Storage** - High-performance persistent key-value storage
11
+ - **Native Module** - Rust-based search with Tantivy (optional)
12
+ - **TypeScript Types** - Full type definitions with Zod validation
13
+
14
+ ## Installation
15
+
16
+ ```bash
17
+ bun add @ebowwa/crm
18
+ ```
19
+
20
+ ## Usage
21
+
22
+ ### MCP Server
23
+
24
+ ```bash
25
+ # Run the MCP server
26
+ bunx crm-mcp
27
+
28
+ # Or programmatically
29
+ import { startMcpServer } from '@ebowwa/crm';
30
+ await startMcpServer();
31
+ ```
32
+
33
+ ### CLI Tool
34
+
35
+ ```bash
36
+ # Interactive mode
37
+ bunx crm-mcp --interactive
38
+
39
+ # Direct commands
40
+ bunx crm-mcp contact list
41
+ bunx crm-mcp deal create --title "New Deal" --value 10000
42
+ ```
43
+
44
+ ### Web Interface
45
+
46
+ ```bash
47
+ # Start web server (default: http://localhost:3001)
48
+ bunx crm-mcp --web
49
+
50
+ # Custom port
51
+ bunx crm-mcp --web --port 8080
52
+ ```
53
+
54
+ ### Types & Schemas
55
+
56
+ ```typescript
57
+ import {
58
+ Contact,
59
+ contactSchema,
60
+ Deal,
61
+ dealSchema,
62
+ Activity,
63
+ activitySchema
64
+ } from '@ebowwa/crm/core';
65
+
66
+ // Validation
67
+ const result = contactSchema.safeParse(data);
68
+ if (result.success) {
69
+ console.log('Valid contact:', result.data);
70
+ }
71
+ ```
72
+
73
+ ### Native Search Module
74
+
75
+ ```typescript
76
+ import {
77
+ CrmSearchIndex,
78
+ CrmIndexManager,
79
+ isNativeAvailable
80
+ } from '@ebowwa/crm/native';
81
+
82
+ // Check if native module is available
83
+ if (isNativeAvailable()) {
84
+ const index = new CrmSearchIndex('/path/to/index');
85
+
86
+ // Add documents
87
+ index.addDocument({
88
+ id: 'contact-1',
89
+ entityType: 'contact',
90
+ name: 'John Doe',
91
+ email: 'john@example.com',
92
+ tags: ['vip'],
93
+ });
94
+
95
+ index.commit();
96
+
97
+ // Search
98
+ const results = index.search({
99
+ query: 'john',
100
+ entityTypes: ['contact'],
101
+ limit: 10,
102
+ });
103
+ }
104
+ ```
105
+
106
+ ## API Endpoints
107
+
108
+ | Endpoint | Method | Description |
109
+ |----------|--------|-------------|
110
+ | `/api/dashboard/stats` | GET | Dashboard statistics |
111
+ | `/api/contacts` | GET/POST | Contact CRUD |
112
+ | `/api/deals` | GET/POST | Deal CRUD |
113
+ | `/api/activities` | GET/POST | Activity CRUD |
114
+ | `/api/companies` | GET/POST | Company CRUD |
115
+
116
+ ## Project Structure
117
+
118
+ ```
119
+ crm/
120
+ ├── src/
121
+ │ ├── core/ # Types and schemas
122
+ │ ├── mcp/ # MCP server implementation
123
+ │ │ └── storage/ # LMDB storage client
124
+ │ ├── cli/ # CLI commands
125
+ │ └── web/ # Web interface
126
+ ├── native/ # Native module loader + fallbacks
127
+ ├── rust/ # Rust native module source
128
+ ├── tests/ # Test files
129
+ └── dist/ # Compiled output
130
+ ```
131
+
132
+ ## Storage
133
+
134
+ This package uses **LMDB** for persistent storage:
135
+ - High-performance key-value store
136
+ - Automatic indexing for fast lookups
137
+ - Data persists between sessions
138
+ - Storage location: `./data/crm-cli` (configurable via `CRM_DB_PATH`)
139
+
140
+ ### Supported Collections
141
+
142
+ | Collection | Description |
143
+ |------------|-------------|
144
+ | `contacts` | Contact entities |
145
+ | `deals` | Deal/opportunity entities |
146
+ | `activities` | Activity/timeline entries |
147
+ | `media` | File attachments |
148
+ | `notes` | Freeform notes |
149
+ | `tags` | Tag definitions |
150
+ | `companies` | Company entities |
151
+ | `pipelines` | Pipeline configurations |
152
+
153
+ ## Development
154
+
155
+ ```bash
156
+ # Install dependencies
157
+ bun install
158
+
159
+ # Build TypeScript
160
+ bun run build
161
+
162
+ # Build native module (optional)
163
+ bun run build:native
164
+
165
+ # Run tests
166
+ bun test
167
+
168
+ # Start development server
169
+ bun run dev
170
+ ```
171
+
172
+ ## License
173
+
174
+ MIT
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Activity Commands
3
+ *
4
+ * CLI commands for managing activities in the CRM.
5
+ */
6
+ import { Command } from 'commander';
7
+ /**
8
+ * Register activity commands
9
+ */
10
+ export declare function registerActivityCommands(program: Command): void;
11
+ //# sourceMappingURL=activities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activities.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/activities.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkKpC;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmX/D"}
@@ -0,0 +1,427 @@
1
+ /**
2
+ * Activity Commands
3
+ *
4
+ * CLI commands for managing activities in the CRM.
5
+ */
6
+ import { printSuccess, printError, printWarning, printTable, printJSON, printHeader, printDivider, formatStatus, formatRelativeTime, formatDateTime, truncate, output, } from '../utils/output.js';
7
+ import { prompt, promptRequired, promptMultiline, confirm, select, previewAndConfirm, Spinner, } from '../utils/prompt.js';
8
+ import { CRMStorageClient } from '../../mcp/storage/client.js';
9
+ // Activity types
10
+ const ACTIVITY_TYPES = [
11
+ 'call',
12
+ 'email',
13
+ 'meeting',
14
+ 'task',
15
+ 'note',
16
+ 'sms',
17
+ 'video_call',
18
+ 'demo',
19
+ 'proposal_sent',
20
+ 'contract_sent',
21
+ 'follow_up',
22
+ 'social_media',
23
+ 'event',
24
+ 'other',
25
+ ];
26
+ // Call outcomes
27
+ const CALL_OUTCOMES = [
28
+ 'connected',
29
+ 'voicemail',
30
+ 'no_answer',
31
+ 'busy',
32
+ 'wrong_number',
33
+ 'disconnected',
34
+ ];
35
+ // Meeting outcomes
36
+ const MEETING_OUTCOMES = [
37
+ 'completed',
38
+ 'rescheduled',
39
+ 'cancelled',
40
+ 'no_show',
41
+ ];
42
+ // Activity type icons
43
+ const ACTIVITY_ICONS = {
44
+ call: '\u260E',
45
+ email: '\u2709',
46
+ meeting: '\u{1F3D7}',
47
+ task: '\u2713',
48
+ note: '\u{1F4DD}',
49
+ sms: '\u{1F4AC}',
50
+ video_call: '\u{1F4F7}',
51
+ demo: '\u{1F4BB}',
52
+ proposal_sent: '\u{1F4C4}',
53
+ contract_sent: '\u{1F4DD}',
54
+ follow_up: '\u23F0',
55
+ social_media: '\u{1F310}',
56
+ event: '\u{1F3AD}',
57
+ other: '\u2022',
58
+ };
59
+ // Storage client singleton
60
+ let _storage = null;
61
+ /**
62
+ * Get storage client (lazy initialization)
63
+ */
64
+ async function getStorage() {
65
+ if (!_storage) {
66
+ _storage = new CRMStorageClient({
67
+ path: process.env.CRM_DB_PATH || './data/crm-cli',
68
+ mapSize: 256 * 1024 * 1024, // 256MB
69
+ maxDbs: 20,
70
+ });
71
+ await _storage.initialize();
72
+ }
73
+ return _storage;
74
+ }
75
+ /**
76
+ * Get all activities
77
+ */
78
+ async function getActivities() {
79
+ const storage = await getStorage();
80
+ return storage.list('activities');
81
+ }
82
+ /**
83
+ * Get activity by ID
84
+ */
85
+ async function getActivity(id) {
86
+ const storage = await getStorage();
87
+ return storage.get('activities', id);
88
+ }
89
+ /**
90
+ * Create activity
91
+ */
92
+ async function createActivity(data) {
93
+ const storage = await getStorage();
94
+ return storage.insert('activities', {
95
+ contactId: data.contactId,
96
+ dealId: data.dealId,
97
+ type: data.type || 'note',
98
+ title: data.title || '',
99
+ description: data.description || '',
100
+ timestamp: data.timestamp || new Date().toISOString(),
101
+ duration: data.duration,
102
+ metadata: data.metadata || {},
103
+ createdBy: data.createdBy,
104
+ tags: data.tags || [],
105
+ customFields: data.customFields || [],
106
+ });
107
+ }
108
+ /**
109
+ * Delete activity
110
+ */
111
+ async function deleteActivity(id) {
112
+ const storage = await getStorage();
113
+ const existing = await storage.get('activities', id);
114
+ if (!existing)
115
+ return false;
116
+ await storage.delete('activities', id);
117
+ return true;
118
+ }
119
+ /**
120
+ * Filter activities by contact
121
+ */
122
+ async function filterByContact(contactId) {
123
+ const activities = await getActivities();
124
+ return activities.filter((a) => a.contactId === contactId);
125
+ }
126
+ /**
127
+ * Filter activities by deal
128
+ */
129
+ async function filterByDeal(dealId) {
130
+ const activities = await getActivities();
131
+ return activities.filter((a) => a.dealId === dealId);
132
+ }
133
+ /**
134
+ * Register activity commands
135
+ */
136
+ export function registerActivityCommands(program) {
137
+ const activities = program.command('activities').alias('activity').description('Manage activities');
138
+ // List activities
139
+ activities
140
+ .command('list')
141
+ .description('List activities')
142
+ .option('-c, --contact <id>', 'Filter by contact ID')
143
+ .option('-d, --deal <id>', 'Filter by deal ID')
144
+ .option('-t, --type <type>', 'Filter by type')
145
+ .option('--json', 'Output as JSON')
146
+ .option('--limit <number>', 'Limit results', '20')
147
+ .action(async (options) => {
148
+ let activities = await getActivities();
149
+ if (options.contact) {
150
+ activities = await filterByContact(options.contact);
151
+ }
152
+ if (options.deal) {
153
+ activities = await filterByDeal(options.deal);
154
+ }
155
+ if (options.type) {
156
+ activities = activities.filter((a) => a.type.toLowerCase() === options.type.toLowerCase());
157
+ }
158
+ // Sort by timestamp descending
159
+ activities.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
160
+ const limit = parseInt(options.limit);
161
+ activities = activities.slice(0, limit);
162
+ if (options.json) {
163
+ printJSON(activities);
164
+ return;
165
+ }
166
+ if (activities.length === 0) {
167
+ printWarning('No activities found');
168
+ return;
169
+ }
170
+ printHeader(`Activities (${activities.length})`);
171
+ printTable(activities, [
172
+ {
173
+ key: 'type',
174
+ header: 'Type',
175
+ width: 6,
176
+ format: (v) => ACTIVITY_ICONS[v] || '\u2022',
177
+ },
178
+ { key: 'title', header: 'Title', width: 30, format: (v) => truncate(String(v), 30) },
179
+ {
180
+ key: 'type',
181
+ header: 'Activity',
182
+ width: 12,
183
+ format: (v) => String(v).replace('_', ' '),
184
+ },
185
+ {
186
+ key: 'timestamp',
187
+ header: 'When',
188
+ format: (v) => formatRelativeTime(String(v)),
189
+ },
190
+ {
191
+ key: 'contactId',
192
+ header: 'Contact',
193
+ width: 8,
194
+ format: (v) => (v ? truncate(String(v), 8) : '-'),
195
+ },
196
+ ]);
197
+ });
198
+ // Log activity (quick create)
199
+ activities
200
+ .command('log <contactId> <type> <description>')
201
+ .description('Log a new activity')
202
+ .option('-d, --deal <id>', 'Associated deal ID')
203
+ .option('--duration <minutes>', 'Duration in minutes')
204
+ .action(async (contactId, typeStr, description, options) => {
205
+ const type = typeStr.toLowerCase();
206
+ if (!ACTIVITY_TYPES.includes(type)) {
207
+ printError(`Invalid activity type: ${typeStr}`);
208
+ console.log(`Valid types: ${ACTIVITY_TYPES.join(', ')}`);
209
+ process.exit(1);
210
+ }
211
+ const spinner = new Spinner('Logging activity...').start();
212
+ await new Promise((r) => setTimeout(r, 300));
213
+ const activity = await createActivity({
214
+ contactId,
215
+ dealId: options.deal,
216
+ type,
217
+ title: description.slice(0, 50),
218
+ description,
219
+ duration: options.duration ? parseInt(options.duration) * 60 : undefined,
220
+ });
221
+ spinner.succeed('Activity logged');
222
+ printSuccess(`${ACTIVITY_ICONS[type]} ${type}: ${truncate(description, 50)}`);
223
+ console.log(`ID: ${activity.id}`);
224
+ });
225
+ // Create activity (interactive)
226
+ activities
227
+ .command('create')
228
+ .description('Create a new activity interactively')
229
+ .option('-c, --contact <id>', 'Contact ID')
230
+ .option('-d, --deal <id>', 'Deal ID')
231
+ .action(async (options) => {
232
+ printHeader('Create Activity');
233
+ // Contact ID
234
+ const contactId = options.contact || (await promptRequired('Contact ID'));
235
+ // Activity type
236
+ const type = await select('Activity Type', ACTIVITY_TYPES, 'note');
237
+ // Title
238
+ const title = await promptRequired('Title');
239
+ // Description
240
+ const description = await promptMultiline('Description');
241
+ // Deal ID
242
+ let dealId = options.deal;
243
+ if (!dealId) {
244
+ const hasDeal = await confirm('Associate with a deal?');
245
+ if (hasDeal) {
246
+ dealId = await promptRequired('Deal ID');
247
+ }
248
+ }
249
+ // Duration (for calls/meetings)
250
+ let duration;
251
+ if (['call', 'meeting', 'video_call', 'demo'].includes(type)) {
252
+ const durationStr = await prompt('Duration (minutes)');
253
+ if (durationStr) {
254
+ duration = parseInt(durationStr) * 60;
255
+ }
256
+ }
257
+ // Type-specific metadata
258
+ let metadata = {};
259
+ if (type === 'call') {
260
+ const outcome = await select('Call Outcome', CALL_OUTCOMES, 'connected');
261
+ metadata = {
262
+ outcome,
263
+ direction: 'outbound',
264
+ };
265
+ }
266
+ else if (type === 'meeting') {
267
+ const outcome = await select('Meeting Outcome', MEETING_OUTCOMES, 'completed');
268
+ metadata = {
269
+ outcome,
270
+ };
271
+ }
272
+ // Preview
273
+ const confirmed = await previewAndConfirm('Activity Preview', {
274
+ Type: type,
275
+ Title: title,
276
+ Description: truncate(description, 50),
277
+ Contact: contactId,
278
+ Deal: dealId || '(none)',
279
+ Duration: duration ? `${Math.floor(duration / 60)} min` : '(none)',
280
+ });
281
+ if (!confirmed) {
282
+ printWarning('Activity creation cancelled');
283
+ return;
284
+ }
285
+ const spinner = new Spinner('Creating activity...').start();
286
+ await new Promise((r) => setTimeout(r, 500));
287
+ const activity = await createActivity({
288
+ contactId,
289
+ dealId,
290
+ type,
291
+ title,
292
+ description,
293
+ duration,
294
+ metadata: metadata,
295
+ });
296
+ spinner.succeed('Activity created successfully');
297
+ printSuccess(`Activity ID: ${activity.id}`);
298
+ });
299
+ // Get activity details
300
+ activities
301
+ .command('get <id>')
302
+ .description('Get activity details')
303
+ .option('--json', 'Output as JSON')
304
+ .action(async (id, options) => {
305
+ const activity = await getActivity(id);
306
+ if (!activity) {
307
+ printError(`Activity not found: ${id}`);
308
+ process.exit(1);
309
+ }
310
+ if (options.json) {
311
+ printJSON(activity);
312
+ return;
313
+ }
314
+ printHeader(`${ACTIVITY_ICONS[activity.type]} ${activity.title}`);
315
+ console.log(`${output.dim('ID:')} ${activity.id}`);
316
+ console.log(`${output.dim('Type:')} ${formatStatus(activity.type)}`);
317
+ console.log();
318
+ // Details
319
+ console.log(output.bold('Details'));
320
+ printDivider('-');
321
+ console.log(`${output.dim('Contact ID:')} ${activity.contactId || '(none)'}`);
322
+ console.log(`${output.dim('Deal ID:')} ${activity.dealId || '(none)'}`);
323
+ console.log(`${output.dim('Timestamp:')} ${formatDateTime(activity.timestamp)}`);
324
+ if (activity.duration) {
325
+ console.log(`${output.dim('Duration:')} ${Math.floor(activity.duration / 60)} min`);
326
+ }
327
+ console.log();
328
+ // Description
329
+ if (activity.description) {
330
+ console.log(output.bold('Description'));
331
+ printDivider('-');
332
+ console.log(activity.description);
333
+ console.log();
334
+ }
335
+ // Metadata
336
+ if (Object.keys(activity.metadata).length > 0) {
337
+ console.log(output.bold('Metadata'));
338
+ printDivider('-');
339
+ for (const [key, value] of Object.entries(activity.metadata)) {
340
+ console.log(`${output.dim(key)}: ${value}`);
341
+ }
342
+ console.log();
343
+ }
344
+ // Timestamps
345
+ console.log(output.bold('Timestamps'));
346
+ printDivider('-');
347
+ console.log(`${output.dim('Created:')} ${new Date(activity.createdAt).toLocaleString()}`);
348
+ console.log(`${output.dim('Updated:')} ${new Date(activity.updatedAt).toLocaleString()}`);
349
+ console.log();
350
+ });
351
+ // Delete activity
352
+ activities
353
+ .command('delete <id>')
354
+ .description('Delete an activity')
355
+ .option('-f, --force', 'Skip confirmation')
356
+ .action(async (id, options) => {
357
+ const activity = await getActivity(id);
358
+ if (!activity) {
359
+ printError(`Activity not found: ${id}`);
360
+ process.exit(1);
361
+ }
362
+ if (!options.force) {
363
+ console.log(`\nActivity: ${output.bold(activity.title)}`);
364
+ console.log(`Type: ${activity.type}`);
365
+ console.log(`Date: ${formatDateTime(activity.timestamp)}\n`);
366
+ const confirmed = await confirm('Are you sure you want to delete this activity?');
367
+ if (!confirmed) {
368
+ printWarning('Deletion cancelled');
369
+ return;
370
+ }
371
+ }
372
+ const spinner = new Spinner('Deleting activity...').start();
373
+ await new Promise((r) => setTimeout(r, 300));
374
+ await deleteActivity(id);
375
+ spinner.succeed('Activity deleted successfully');
376
+ });
377
+ // Timeline (show activities in timeline view)
378
+ activities
379
+ .command('timeline')
380
+ .description('Show activity timeline')
381
+ .option('-c, --contact <id>', 'Filter by contact ID')
382
+ .option('-d, --deal <id>', 'Filter by deal ID')
383
+ .option('--days <number>', 'Days to show', '7')
384
+ .action(async (options) => {
385
+ let activities = await getActivities();
386
+ if (options.contact) {
387
+ activities = await filterByContact(options.contact);
388
+ }
389
+ if (options.deal) {
390
+ activities = await filterByDeal(options.deal);
391
+ }
392
+ // Filter by date range
393
+ const days = parseInt(options.days);
394
+ const cutoff = new Date();
395
+ cutoff.setDate(cutoff.getDate() - days);
396
+ activities = activities.filter((a) => new Date(a.timestamp) >= cutoff);
397
+ // Sort by timestamp descending
398
+ activities.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
399
+ if (activities.length === 0) {
400
+ printWarning('No activities in the specified time range');
401
+ return;
402
+ }
403
+ printHeader(`Activity Timeline (Last ${days} Days)`);
404
+ let currentDate = '';
405
+ for (const activity of activities) {
406
+ const date = new Date(activity.timestamp).toLocaleDateString('en-US', {
407
+ weekday: 'long',
408
+ month: 'long',
409
+ day: 'numeric',
410
+ });
411
+ if (date !== currentDate) {
412
+ console.log();
413
+ console.log(output.bold(date));
414
+ printDivider('\u2500');
415
+ currentDate = date;
416
+ }
417
+ const time = new Date(activity.timestamp).toLocaleTimeString('en-US', {
418
+ hour: '2-digit',
419
+ minute: '2-digit',
420
+ });
421
+ const icon = ACTIVITY_ICONS[activity.type];
422
+ console.log(` ${output.dim(time)} ${icon} ${activity.title} ${output.dim(`(${activity.type})`)}`);
423
+ }
424
+ console.log();
425
+ });
426
+ }
427
+ //# sourceMappingURL=activities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activities.js","sourceRoot":"","sources":["../../../src/cli/commands/activities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Contact Commands
3
+ *
4
+ * CLI commands for managing contacts in the CRM.
5
+ */
6
+ import { Command } from 'commander';
7
+ /**
8
+ * Register contact commands
9
+ */
10
+ export declare function registerContactCommands(program: Command): void;
11
+ //# sourceMappingURL=contacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contacts.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/contacts.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwKpC;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiY9D"}