@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.
- package/README.md +174 -0
- package/dist/cli/commands/activities.d.ts +11 -0
- package/dist/cli/commands/activities.d.ts.map +1 -0
- package/dist/cli/commands/activities.js +427 -0
- package/dist/cli/commands/activities.js.map +1 -0
- package/dist/cli/commands/contacts.d.ts +11 -0
- package/dist/cli/commands/contacts.d.ts.map +1 -0
- package/dist/cli/commands/contacts.js +458 -0
- package/dist/cli/commands/contacts.js.map +1 -0
- package/dist/cli/commands/deals.d.ts +11 -0
- package/dist/cli/commands/deals.d.ts.map +1 -0
- package/dist/cli/commands/deals.js +498 -0
- package/dist/cli/commands/deals.js.map +1 -0
- package/dist/cli/commands/media.d.ts +11 -0
- package/dist/cli/commands/media.d.ts.map +1 -0
- package/dist/cli/commands/media.js +417 -0
- package/dist/cli/commands/media.js.map +1 -0
- package/dist/cli/commands/search.d.ts +11 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +346 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/index.d.ts +13 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +173 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/repl.d.ts +15 -0
- package/dist/cli/repl.d.ts.map +1 -0
- package/dist/cli/repl.js +318 -0
- package/dist/cli/repl.js.map +1 -0
- package/dist/cli/utils/config.d.ts +91 -0
- package/dist/cli/utils/config.d.ts.map +1 -0
- package/dist/cli/utils/config.js +212 -0
- package/dist/cli/utils/config.js.map +1 -0
- package/dist/cli/utils/output.d.ts +136 -0
- package/dist/cli/utils/output.d.ts.map +1 -0
- package/dist/cli/utils/output.js +323 -0
- package/dist/cli/utils/output.js.map +1 -0
- package/dist/cli/utils/prompt.d.ts +81 -0
- package/dist/cli/utils/prompt.d.ts.map +1 -0
- package/dist/cli/utils/prompt.js +341 -0
- package/dist/cli/utils/prompt.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +8 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +32 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/schemas.d.ts +3050 -0
- package/dist/core/schemas.d.ts.map +1 -0
- package/dist/core/schemas.js +667 -0
- package/dist/core/schemas.js.map +1 -0
- package/dist/core/types.d.ts +597 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +8 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +14 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +11 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +13 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +18 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/storage/client.d.ts +109 -0
- package/dist/mcp/storage/client.d.ts.map +1 -0
- package/dist/mcp/storage/client.js +355 -0
- package/dist/mcp/storage/client.js.map +1 -0
- package/dist/mcp/storage/index.d.ts +7 -0
- package/dist/mcp/storage/index.d.ts.map +1 -0
- package/dist/mcp/storage/index.js +6 -0
- package/dist/mcp/storage/index.js.map +1 -0
- package/dist/mcp/storage/types.d.ts +44 -0
- package/dist/mcp/storage/types.d.ts.map +1 -0
- package/dist/mcp/storage/types.js +35 -0
- package/dist/mcp/storage/types.js.map +1 -0
- package/dist/mcp/tools/definitions.d.ts +16 -0
- package/dist/mcp/tools/definitions.d.ts.map +1 -0
- package/dist/mcp/tools/definitions.js +914 -0
- package/dist/mcp/tools/definitions.js.map +1 -0
- package/dist/mcp/tools/handlers.d.ts +50 -0
- package/dist/mcp/tools/handlers.d.ts.map +1 -0
- package/dist/mcp/tools/handlers.js +760 -0
- package/dist/mcp/tools/handlers.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +7 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +6 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/types.d.ts +314 -0
- package/dist/mcp/tools/types.d.ts.map +1 -0
- package/dist/mcp/tools/types.js +5 -0
- package/dist/mcp/tools/types.js.map +1 -0
- package/dist/mcp/transports/stdio.d.ts +27 -0
- package/dist/mcp/transports/stdio.d.ts.map +1 -0
- package/dist/mcp/transports/stdio.js +237 -0
- package/dist/mcp/transports/stdio.js.map +1 -0
- package/dist/telemetry/index.d.ts +58 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +109 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/logger.d.ts +116 -0
- package/dist/telemetry/logger.d.ts.map +1 -0
- package/dist/telemetry/logger.js +256 -0
- package/dist/telemetry/logger.js.map +1 -0
- package/dist/telemetry/metrics.d.ts +115 -0
- package/dist/telemetry/metrics.d.ts.map +1 -0
- package/dist/telemetry/metrics.js +292 -0
- package/dist/telemetry/metrics.js.map +1 -0
- package/dist/telemetry/tracer.d.ts +227 -0
- package/dist/telemetry/tracer.d.ts.map +1 -0
- package/dist/telemetry/tracer.js +355 -0
- package/dist/telemetry/tracer.js.map +1 -0
- package/dist/web/app.d.ts +2 -0
- package/dist/web/app.d.ts.map +1 -0
- package/dist/web/app.js +115 -0
- package/dist/web/app.js.map +1 -0
- package/dist/web/components/ContactList.d.ts +3 -0
- package/dist/web/components/ContactList.d.ts.map +1 -0
- package/dist/web/components/ContactList.js +262 -0
- package/dist/web/components/ContactList.js.map +1 -0
- package/dist/web/components/Dashboard.d.ts +3 -0
- package/dist/web/components/Dashboard.d.ts.map +1 -0
- package/dist/web/components/Dashboard.js +158 -0
- package/dist/web/components/Dashboard.js.map +1 -0
- package/dist/web/components/DealPipeline.d.ts +3 -0
- package/dist/web/components/DealPipeline.d.ts.map +1 -0
- package/dist/web/components/DealPipeline.js +306 -0
- package/dist/web/components/DealPipeline.js.map +1 -0
- package/dist/web/index.d.ts +2 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +269 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/types.d.ts +75 -0
- package/dist/web/types.d.ts.map +1 -0
- package/dist/web/types.js +3 -0
- package/dist/web/types.js.map +1 -0
- package/native/index.d.ts +571 -0
- package/native/index.js +687 -0
- package/package.json +105 -0
- package/src/cli/commands/activities.ts +543 -0
- package/src/cli/commands/contacts.ts +563 -0
- package/src/cli/commands/deals.ts +637 -0
- package/src/cli/commands/media.ts +521 -0
- package/src/cli/commands/search.ts +426 -0
- package/src/cli/index.ts +203 -0
- package/src/cli/repl.ts +379 -0
- package/src/cli/utils/config.ts +299 -0
- package/src/cli/utils/output.ts +386 -0
- package/src/cli/utils/prompt.ts +444 -0
- package/src/cli.ts +11 -0
- package/src/core/index.ts +184 -0
- package/src/core/schemas.ts +770 -0
- package/src/core/types.ts +969 -0
- package/src/index.ts +8 -0
- package/src/mcp/index.ts +17 -0
- package/src/mcp/server.ts +26 -0
- package/src/mcp/storage/client.ts +408 -0
- package/src/mcp/storage/index.ts +7 -0
- package/src/mcp/storage/types.ts +72 -0
- package/src/mcp/tools/definitions.ts +961 -0
- package/src/mcp/tools/handlers.ts +805 -0
- package/src/mcp/tools/index.ts +7 -0
- package/src/mcp/tools/types.ts +390 -0
- package/src/mcp/transports/stdio.ts +225 -0
- package/src/telemetry/index.ts +131 -0
- package/src/telemetry/logger.ts +318 -0
- package/src/telemetry/metrics.ts +393 -0
- package/src/telemetry/tracer.ts +487 -0
- package/src/web/api/activities.ts +41 -0
- package/src/web/api/contacts.ts +114 -0
- package/src/web/api/deals.ts +108 -0
- package/src/web/api/media.ts +98 -0
- package/src/web/app.tsx +143 -0
- package/src/web/components/ActivityFeed.tsx +195 -0
- package/src/web/components/ContactList.tsx +340 -0
- package/src/web/components/Dashboard.tsx +214 -0
- package/src/web/components/DealPipeline.tsx +405 -0
- package/src/web/components/MediaGallery.tsx +334 -0
- package/src/web/index.html +14 -0
- package/src/web/index.ts +326 -0
- package/src/web/styles/main.css +180 -0
- 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"}
|