@openconductor/mcp-sdk 1.3.2 → 1.4.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 +57 -11
- package/dist/config/index.d.mts +70 -0
- package/dist/config/index.d.ts +70 -0
- package/dist/config/index.js +80 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/index.mjs +74 -0
- package/dist/config/index.mjs.map +1 -0
- package/dist/demo/index.d.mts +27 -0
- package/dist/demo/index.d.ts +27 -0
- package/dist/demo/index.js +136 -0
- package/dist/demo/index.js.map +1 -0
- package/dist/demo/index.mjs +129 -0
- package/dist/demo/index.mjs.map +1 -0
- package/dist/index.d.mts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +288 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +278 -1
- package/dist/index.mjs.map +1 -1
- package/dist/payment/index.d.mts +3 -1
- package/dist/payment/index.d.ts +3 -1
- package/dist/payment/index.js +205 -0
- package/dist/payment/index.js.map +1 -1
- package/dist/payment/index.mjs +205 -0
- package/dist/payment/index.mjs.map +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs.map +1 -1
- package/dist/telemetry/index.d.mts +34 -6
- package/dist/telemetry/index.d.ts +34 -6
- package/dist/telemetry/index.js +143 -0
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/index.mjs +143 -1
- package/dist/telemetry/index.mjs.map +1 -1
- package/package.json +12 -2
package/README.md
CHANGED
|
@@ -32,10 +32,41 @@ npm install @openconductor/mcp-sdk
|
|
|
32
32
|
|
|
33
33
|
**Requirements:** Node.js 18+
|
|
34
34
|
|
|
35
|
+
## 🎮 Zero-Config Demo Mode
|
|
36
|
+
|
|
37
|
+
**New in v1.4:** Start building immediately with no API key required!
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
import { initOpenConductor, initTelemetry, requirePayment } from '@openconductor/mcp-sdk'
|
|
41
|
+
|
|
42
|
+
// That's it! Demo mode activates automatically
|
|
43
|
+
initOpenConductor({ serverName: 'my-server' })
|
|
44
|
+
|
|
45
|
+
// All features work - telemetry logs to console, payments are mocked
|
|
46
|
+
const telemetry = initTelemetry() // Logs to console in demo mode
|
|
47
|
+
const paidTool = requirePayment({ credits: 10 })(myHandler) // Always allows, 9999 mock credits
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Demo mode provides:
|
|
51
|
+
- ✅ **Mock billing** — Always allowed, 9999 credits, no real charges
|
|
52
|
+
- ✅ **Console telemetry** — All metrics logged locally for debugging
|
|
53
|
+
- ✅ **Full type safety** — Same types and interfaces as production
|
|
54
|
+
- ✅ **Zero setup** — Just import and go
|
|
55
|
+
|
|
56
|
+
When you're ready for production, just add your API key:
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
initOpenConductor({
|
|
60
|
+
apiKey: process.env.OPENCONDUCTOR_API_KEY,
|
|
61
|
+
serverName: 'my-server'
|
|
62
|
+
})
|
|
63
|
+
```
|
|
64
|
+
|
|
35
65
|
## Quick Start
|
|
36
66
|
|
|
37
67
|
```typescript
|
|
38
68
|
import {
|
|
69
|
+
initOpenConductor,
|
|
39
70
|
wrapTool,
|
|
40
71
|
validateInput,
|
|
41
72
|
z,
|
|
@@ -43,13 +74,16 @@ import {
|
|
|
43
74
|
initTelemetry
|
|
44
75
|
} from '@openconductor/mcp-sdk'
|
|
45
76
|
|
|
46
|
-
//
|
|
47
|
-
|
|
48
|
-
apiKey: 'oc_xxx', // Get free key at openconductor.ai
|
|
77
|
+
// Initialize the SDK (demo mode if no API key)
|
|
78
|
+
initOpenConductor({
|
|
49
79
|
serverName: 'my-server',
|
|
50
|
-
serverVersion: '1.0.0'
|
|
80
|
+
serverVersion: '1.0.0',
|
|
81
|
+
// apiKey: 'oc_xxx' // Add for production
|
|
51
82
|
})
|
|
52
83
|
|
|
84
|
+
// Enable observability (console in demo, API in production)
|
|
85
|
+
initTelemetry()
|
|
86
|
+
|
|
53
87
|
// Create a validated, wrapped tool in seconds
|
|
54
88
|
const searchTool = wrapTool(
|
|
55
89
|
validateInput(
|
|
@@ -148,16 +182,22 @@ const safeTool = wrapTool(myHandler, {
|
|
|
148
182
|
|
|
149
183
|
### 📊 Telemetry
|
|
150
184
|
|
|
151
|
-
Optional observability for production:
|
|
185
|
+
Optional observability for production (console logging in demo mode):
|
|
152
186
|
|
|
153
187
|
```typescript
|
|
154
|
-
import { initTelemetry } from '@openconductor/mcp-sdk
|
|
188
|
+
import { initOpenConductor, initTelemetry } from '@openconductor/mcp-sdk'
|
|
189
|
+
|
|
190
|
+
// Demo mode - logs to console
|
|
191
|
+
initOpenConductor({ serverName: 'my-server' })
|
|
192
|
+
initTelemetry()
|
|
193
|
+
// [🎮 DEMO] Telemetry track: { tool: "search", duration: "45ms", success: true }
|
|
155
194
|
|
|
156
|
-
|
|
157
|
-
|
|
195
|
+
// Production mode - sends to OpenConductor
|
|
196
|
+
initOpenConductor({
|
|
197
|
+
apiKey: 'oc_xxx',
|
|
158
198
|
serverName: 'my-server',
|
|
159
|
-
serverVersion: '1.0.0',
|
|
160
199
|
})
|
|
200
|
+
initTelemetry()
|
|
161
201
|
|
|
162
202
|
// All wrapped tools automatically report:
|
|
163
203
|
// ✓ Invocation counts
|
|
@@ -175,9 +215,15 @@ initTelemetry({
|
|
|
175
215
|
Charge for your MCP tools with credits, subscriptions, or per-call:
|
|
176
216
|
|
|
177
217
|
```typescript
|
|
178
|
-
import { initPayment, requirePayment } from '@openconductor/mcp-sdk
|
|
218
|
+
import { initOpenConductor, initPayment, requirePayment } from '@openconductor/mcp-sdk'
|
|
219
|
+
|
|
220
|
+
// Demo mode - mock billing (always allowed, 9999 credits)
|
|
221
|
+
initOpenConductor({ serverName: 'my-server' })
|
|
222
|
+
initPayment() // Auto-configures for demo mode
|
|
179
223
|
|
|
180
|
-
|
|
224
|
+
// Production mode
|
|
225
|
+
initOpenConductor({ apiKey: 'oc_xxx', serverName: 'my-server' })
|
|
226
|
+
initPayment()
|
|
181
227
|
|
|
182
228
|
// Credits-based
|
|
183
229
|
const paidTool = requirePayment({ credits: 10 })(myHandler)
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @openconductor/mcp-sdk - Global Configuration
|
|
3
|
+
*
|
|
4
|
+
* Single source of truth for SDK mode (demo vs production)
|
|
5
|
+
*/
|
|
6
|
+
interface OpenConductorConfig {
|
|
7
|
+
/** OpenConductor API key (optional in demo mode) */
|
|
8
|
+
apiKey?: string;
|
|
9
|
+
/** Force demo mode even if API key is provided */
|
|
10
|
+
demoMode?: boolean;
|
|
11
|
+
/** Server name for telemetry */
|
|
12
|
+
serverName?: string;
|
|
13
|
+
/** Server version */
|
|
14
|
+
serverVersion?: string;
|
|
15
|
+
/** Suppress demo mode banner */
|
|
16
|
+
quiet?: boolean;
|
|
17
|
+
}
|
|
18
|
+
interface ResolvedConfig {
|
|
19
|
+
apiKey: string | null;
|
|
20
|
+
demoMode: boolean;
|
|
21
|
+
serverName: string;
|
|
22
|
+
serverVersion: string;
|
|
23
|
+
initialized: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Initialize the OpenConductor SDK
|
|
27
|
+
*
|
|
28
|
+
* Call this once at startup. If no API key is provided (via config or
|
|
29
|
+
* OPENCONDUCTOR_API_KEY env var), the SDK automatically enables Demo Mode.
|
|
30
|
+
*
|
|
31
|
+
* @example Production mode
|
|
32
|
+
* ```typescript
|
|
33
|
+
* initOpenConductor({
|
|
34
|
+
* apiKey: process.env.OPENCONDUCTOR_API_KEY,
|
|
35
|
+
* serverName: 'my-server',
|
|
36
|
+
* serverVersion: '1.0.0'
|
|
37
|
+
* })
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* @example Demo mode (explicit)
|
|
41
|
+
* ```typescript
|
|
42
|
+
* initOpenConductor({ demoMode: true })
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* @example Demo mode (auto-detected)
|
|
46
|
+
* ```typescript
|
|
47
|
+
* // No API key? Demo mode activates automatically
|
|
48
|
+
* initOpenConductor({ serverName: 'my-server' })
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
declare function initOpenConductor(config?: OpenConductorConfig): ResolvedConfig;
|
|
52
|
+
/**
|
|
53
|
+
* Get current SDK configuration
|
|
54
|
+
* Auto-initializes in demo mode if not already initialized
|
|
55
|
+
*/
|
|
56
|
+
declare function getConfig(): ResolvedConfig;
|
|
57
|
+
/**
|
|
58
|
+
* Check if SDK is in demo mode
|
|
59
|
+
*/
|
|
60
|
+
declare function isDemoMode(): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Check if SDK is initialized
|
|
63
|
+
*/
|
|
64
|
+
declare function isInitialized(): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Reset configuration (mainly for testing)
|
|
67
|
+
*/
|
|
68
|
+
declare function resetConfig(): void;
|
|
69
|
+
|
|
70
|
+
export { type OpenConductorConfig, type ResolvedConfig, getConfig, initOpenConductor, isDemoMode, isInitialized, resetConfig };
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @openconductor/mcp-sdk - Global Configuration
|
|
3
|
+
*
|
|
4
|
+
* Single source of truth for SDK mode (demo vs production)
|
|
5
|
+
*/
|
|
6
|
+
interface OpenConductorConfig {
|
|
7
|
+
/** OpenConductor API key (optional in demo mode) */
|
|
8
|
+
apiKey?: string;
|
|
9
|
+
/** Force demo mode even if API key is provided */
|
|
10
|
+
demoMode?: boolean;
|
|
11
|
+
/** Server name for telemetry */
|
|
12
|
+
serverName?: string;
|
|
13
|
+
/** Server version */
|
|
14
|
+
serverVersion?: string;
|
|
15
|
+
/** Suppress demo mode banner */
|
|
16
|
+
quiet?: boolean;
|
|
17
|
+
}
|
|
18
|
+
interface ResolvedConfig {
|
|
19
|
+
apiKey: string | null;
|
|
20
|
+
demoMode: boolean;
|
|
21
|
+
serverName: string;
|
|
22
|
+
serverVersion: string;
|
|
23
|
+
initialized: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Initialize the OpenConductor SDK
|
|
27
|
+
*
|
|
28
|
+
* Call this once at startup. If no API key is provided (via config or
|
|
29
|
+
* OPENCONDUCTOR_API_KEY env var), the SDK automatically enables Demo Mode.
|
|
30
|
+
*
|
|
31
|
+
* @example Production mode
|
|
32
|
+
* ```typescript
|
|
33
|
+
* initOpenConductor({
|
|
34
|
+
* apiKey: process.env.OPENCONDUCTOR_API_KEY,
|
|
35
|
+
* serverName: 'my-server',
|
|
36
|
+
* serverVersion: '1.0.0'
|
|
37
|
+
* })
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* @example Demo mode (explicit)
|
|
41
|
+
* ```typescript
|
|
42
|
+
* initOpenConductor({ demoMode: true })
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* @example Demo mode (auto-detected)
|
|
46
|
+
* ```typescript
|
|
47
|
+
* // No API key? Demo mode activates automatically
|
|
48
|
+
* initOpenConductor({ serverName: 'my-server' })
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
declare function initOpenConductor(config?: OpenConductorConfig): ResolvedConfig;
|
|
52
|
+
/**
|
|
53
|
+
* Get current SDK configuration
|
|
54
|
+
* Auto-initializes in demo mode if not already initialized
|
|
55
|
+
*/
|
|
56
|
+
declare function getConfig(): ResolvedConfig;
|
|
57
|
+
/**
|
|
58
|
+
* Check if SDK is in demo mode
|
|
59
|
+
*/
|
|
60
|
+
declare function isDemoMode(): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Check if SDK is initialized
|
|
63
|
+
*/
|
|
64
|
+
declare function isInitialized(): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Reset configuration (mainly for testing)
|
|
67
|
+
*/
|
|
68
|
+
declare function resetConfig(): void;
|
|
69
|
+
|
|
70
|
+
export { type OpenConductorConfig, type ResolvedConfig, getConfig, initOpenConductor, isDemoMode, isInitialized, resetConfig };
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/config/index.ts
|
|
4
|
+
var globalConfig = {
|
|
5
|
+
apiKey: null,
|
|
6
|
+
demoMode: false,
|
|
7
|
+
serverName: "mcp-server",
|
|
8
|
+
serverVersion: "0.0.0",
|
|
9
|
+
initialized: false
|
|
10
|
+
};
|
|
11
|
+
var DEMO_BANNER = `
|
|
12
|
+
\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510
|
|
13
|
+
\u2502 \u2502
|
|
14
|
+
\u2502 \u{1F3AE} DEMO MODE ACTIVE \u2502
|
|
15
|
+
\u2502 \u2502
|
|
16
|
+
\u2502 The SDK is running without an API key. \u2502
|
|
17
|
+
\u2502 \u2022 Payment: Mock billing (always allowed, 9999 credits) \u2502
|
|
18
|
+
\u2502 \u2022 Telemetry: Logging to console only \u2502
|
|
19
|
+
\u2502 \u2022 All features work - no data sent to OpenConductor \u2502
|
|
20
|
+
\u2502 \u2502
|
|
21
|
+
\u2502 To enable production mode: \u2502
|
|
22
|
+
\u2502 1. Get a free API key at https://openconductor.ai \u2502
|
|
23
|
+
\u2502 2. Set OPENCONDUCTOR_API_KEY environment variable \u2502
|
|
24
|
+
\u2502 or pass apiKey to initOpenConductor() \u2502
|
|
25
|
+
\u2502 \u2502
|
|
26
|
+
\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518
|
|
27
|
+
`;
|
|
28
|
+
var PRODUCTION_BANNER = `
|
|
29
|
+
\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510
|
|
30
|
+
\u2502 \u2705 OpenConductor SDK initialized (production mode) \u2502
|
|
31
|
+
\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518
|
|
32
|
+
`;
|
|
33
|
+
function initOpenConductor(config = {}) {
|
|
34
|
+
const apiKey = config.apiKey ?? process.env.OPENCONDUCTOR_API_KEY ?? null;
|
|
35
|
+
const demoMode = config.demoMode === true || !apiKey;
|
|
36
|
+
globalConfig = {
|
|
37
|
+
apiKey: demoMode ? null : apiKey,
|
|
38
|
+
demoMode,
|
|
39
|
+
serverName: config.serverName ?? process.env.OPENCONDUCTOR_SERVER_NAME ?? "mcp-server",
|
|
40
|
+
serverVersion: config.serverVersion ?? process.env.npm_package_version ?? "0.0.0",
|
|
41
|
+
initialized: true
|
|
42
|
+
};
|
|
43
|
+
if (!config.quiet) {
|
|
44
|
+
if (demoMode) {
|
|
45
|
+
console.log(DEMO_BANNER);
|
|
46
|
+
} else {
|
|
47
|
+
console.log(PRODUCTION_BANNER);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return globalConfig;
|
|
51
|
+
}
|
|
52
|
+
function getConfig() {
|
|
53
|
+
if (!globalConfig.initialized) {
|
|
54
|
+
return initOpenConductor({ quiet: true });
|
|
55
|
+
}
|
|
56
|
+
return globalConfig;
|
|
57
|
+
}
|
|
58
|
+
function isDemoMode() {
|
|
59
|
+
return getConfig().demoMode;
|
|
60
|
+
}
|
|
61
|
+
function isInitialized() {
|
|
62
|
+
return globalConfig.initialized;
|
|
63
|
+
}
|
|
64
|
+
function resetConfig() {
|
|
65
|
+
globalConfig = {
|
|
66
|
+
apiKey: null,
|
|
67
|
+
demoMode: false,
|
|
68
|
+
serverName: "mcp-server",
|
|
69
|
+
serverVersion: "0.0.0",
|
|
70
|
+
initialized: false
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
exports.getConfig = getConfig;
|
|
75
|
+
exports.initOpenConductor = initOpenConductor;
|
|
76
|
+
exports.isDemoMode = isDemoMode;
|
|
77
|
+
exports.isInitialized = isInitialized;
|
|
78
|
+
exports.resetConfig = resetConfig;
|
|
79
|
+
//# sourceMappingURL=index.js.map
|
|
80
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/config/index.ts"],"names":[],"mappings":";;;AAmCA,IAAI,YAAA,GAA+B;AAAA,EACjC,MAAA,EAAQ,IAAA;AAAA,EACR,QAAA,EAAU,KAAA;AAAA,EACV,UAAA,EAAY,YAAA;AAAA,EACZ,aAAA,EAAe,OAAA;AAAA,EACf,WAAA,EAAa;AACf,CAAA;AAMA,IAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAkBpB,IAAM,iBAAA,GAAoB;AAAA;AAAA;AAAA;AAAA,CAAA;AAoCnB,SAAS,iBAAA,CAAkB,MAAA,GAA8B,EAAC,EAAmB;AAElF,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,OAAA,CAAQ,IAAI,qBAAA,IAAyB,IAAA;AAIrE,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,KAAa,IAAA,IAAQ,CAAC,MAAA;AAE9C,EAAA,YAAA,GAAe;AAAA,IACb,MAAA,EAAQ,WAAW,IAAA,GAAO,MAAA;AAAA,IAC1B,QAAA;AAAA,IACA,UAAA,EAAY,MAAA,CAAO,UAAA,IAAc,OAAA,CAAQ,IAAI,yBAAA,IAA6B,YAAA;AAAA,IAC1E,aAAA,EAAe,MAAA,CAAO,aAAA,IAAiB,OAAA,CAAQ,IAAI,mBAAA,IAAuB,OAAA;AAAA,IAC1E,WAAA,EAAa;AAAA,GACf;AAGA,EAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAA,CAAQ,IAAI,WAAW,CAAA;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAI,iBAAiB,CAAA;AAAA,IAC/B;AAAA,EACF;AAEA,EAAA,OAAO,YAAA;AACT;AAMO,SAAS,SAAA,GAA4B;AAC1C,EAAA,IAAI,CAAC,aAAa,WAAA,EAAa;AAE7B,IAAA,OAAO,iBAAA,CAAkB,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,YAAA;AACT;AAKO,SAAS,UAAA,GAAsB;AACpC,EAAA,OAAO,WAAU,CAAE,QAAA;AACrB;AAKO,SAAS,aAAA,GAAyB;AACvC,EAAA,OAAO,YAAA,CAAa,WAAA;AACtB;AAKO,SAAS,WAAA,GAAoB;AAClC,EAAA,YAAA,GAAe;AAAA,IACb,MAAA,EAAQ,IAAA;AAAA,IACR,QAAA,EAAU,KAAA;AAAA,IACV,UAAA,EAAY,YAAA;AAAA,IACZ,aAAA,EAAe,OAAA;AAAA,IACf,WAAA,EAAa;AAAA,GACf;AACF","file":"index.js","sourcesContent":["/**\n * @openconductor/mcp-sdk - Global Configuration\n * \n * Single source of truth for SDK mode (demo vs production)\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface OpenConductorConfig {\n /** OpenConductor API key (optional in demo mode) */\n apiKey?: string\n /** Force demo mode even if API key is provided */\n demoMode?: boolean\n /** Server name for telemetry */\n serverName?: string\n /** Server version */\n serverVersion?: string\n /** Suppress demo mode banner */\n quiet?: boolean\n}\n\nexport interface ResolvedConfig {\n apiKey: string | null\n demoMode: boolean\n serverName: string\n serverVersion: string\n initialized: boolean\n}\n\n// ============================================================================\n// State\n// ============================================================================\n\nlet globalConfig: ResolvedConfig = {\n apiKey: null,\n demoMode: false,\n serverName: 'mcp-server',\n serverVersion: '0.0.0',\n initialized: false,\n}\n\n// ============================================================================\n// Demo Mode Banner\n// ============================================================================\n\nconst DEMO_BANNER = `\n┌─────────────────────────────────────────────────────────────────┐\n│ │\n│ 🎮 DEMO MODE ACTIVE │\n│ │\n│ The SDK is running without an API key. │\n│ • Payment: Mock billing (always allowed, 9999 credits) │\n│ • Telemetry: Logging to console only │\n│ • All features work - no data sent to OpenConductor │\n│ │\n│ To enable production mode: │\n│ 1. Get a free API key at https://openconductor.ai │\n│ 2. Set OPENCONDUCTOR_API_KEY environment variable │\n│ or pass apiKey to initOpenConductor() │\n│ │\n└─────────────────────────────────────────────────────────────────┘\n`\n\nconst PRODUCTION_BANNER = `\n┌─────────────────────────────────────────────────────────────────┐\n│ ✅ OpenConductor SDK initialized (production mode) │\n└─────────────────────────────────────────────────────────────────┘\n`\n\n// ============================================================================\n// Initialization\n// ============================================================================\n\n/**\n * Initialize the OpenConductor SDK\n * \n * Call this once at startup. If no API key is provided (via config or \n * OPENCONDUCTOR_API_KEY env var), the SDK automatically enables Demo Mode.\n * \n * @example Production mode\n * ```typescript\n * initOpenConductor({\n * apiKey: process.env.OPENCONDUCTOR_API_KEY,\n * serverName: 'my-server',\n * serverVersion: '1.0.0'\n * })\n * ```\n * \n * @example Demo mode (explicit)\n * ```typescript\n * initOpenConductor({ demoMode: true })\n * ```\n * \n * @example Demo mode (auto-detected)\n * ```typescript\n * // No API key? Demo mode activates automatically\n * initOpenConductor({ serverName: 'my-server' })\n * ```\n */\nexport function initOpenConductor(config: OpenConductorConfig = {}): ResolvedConfig {\n // Resolve API key from config or environment\n const apiKey = config.apiKey ?? process.env.OPENCONDUCTOR_API_KEY ?? null\n \n // Determine demo mode\n // Demo if: explicitly set OR no API key provided\n const demoMode = config.demoMode === true || !apiKey\n \n globalConfig = {\n apiKey: demoMode ? null : apiKey,\n demoMode,\n serverName: config.serverName ?? process.env.OPENCONDUCTOR_SERVER_NAME ?? 'mcp-server',\n serverVersion: config.serverVersion ?? process.env.npm_package_version ?? '0.0.0',\n initialized: true,\n }\n \n // Print banner unless quiet\n if (!config.quiet) {\n if (demoMode) {\n console.log(DEMO_BANNER)\n } else {\n console.log(PRODUCTION_BANNER)\n }\n }\n \n return globalConfig\n}\n\n/**\n * Get current SDK configuration\n * Auto-initializes in demo mode if not already initialized\n */\nexport function getConfig(): ResolvedConfig {\n if (!globalConfig.initialized) {\n // Auto-init in demo mode for zero-config experience\n return initOpenConductor({ quiet: true })\n }\n return globalConfig\n}\n\n/**\n * Check if SDK is in demo mode\n */\nexport function isDemoMode(): boolean {\n return getConfig().demoMode\n}\n\n/**\n * Check if SDK is initialized\n */\nexport function isInitialized(): boolean {\n return globalConfig.initialized\n}\n\n/**\n * Reset configuration (mainly for testing)\n */\nexport function resetConfig(): void {\n globalConfig = {\n apiKey: null,\n demoMode: false,\n serverName: 'mcp-server',\n serverVersion: '0.0.0',\n initialized: false,\n }\n}\n"]}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// src/config/index.ts
|
|
2
|
+
var globalConfig = {
|
|
3
|
+
apiKey: null,
|
|
4
|
+
demoMode: false,
|
|
5
|
+
serverName: "mcp-server",
|
|
6
|
+
serverVersion: "0.0.0",
|
|
7
|
+
initialized: false
|
|
8
|
+
};
|
|
9
|
+
var DEMO_BANNER = `
|
|
10
|
+
\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510
|
|
11
|
+
\u2502 \u2502
|
|
12
|
+
\u2502 \u{1F3AE} DEMO MODE ACTIVE \u2502
|
|
13
|
+
\u2502 \u2502
|
|
14
|
+
\u2502 The SDK is running without an API key. \u2502
|
|
15
|
+
\u2502 \u2022 Payment: Mock billing (always allowed, 9999 credits) \u2502
|
|
16
|
+
\u2502 \u2022 Telemetry: Logging to console only \u2502
|
|
17
|
+
\u2502 \u2022 All features work - no data sent to OpenConductor \u2502
|
|
18
|
+
\u2502 \u2502
|
|
19
|
+
\u2502 To enable production mode: \u2502
|
|
20
|
+
\u2502 1. Get a free API key at https://openconductor.ai \u2502
|
|
21
|
+
\u2502 2. Set OPENCONDUCTOR_API_KEY environment variable \u2502
|
|
22
|
+
\u2502 or pass apiKey to initOpenConductor() \u2502
|
|
23
|
+
\u2502 \u2502
|
|
24
|
+
\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518
|
|
25
|
+
`;
|
|
26
|
+
var PRODUCTION_BANNER = `
|
|
27
|
+
\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510
|
|
28
|
+
\u2502 \u2705 OpenConductor SDK initialized (production mode) \u2502
|
|
29
|
+
\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518
|
|
30
|
+
`;
|
|
31
|
+
function initOpenConductor(config = {}) {
|
|
32
|
+
const apiKey = config.apiKey ?? process.env.OPENCONDUCTOR_API_KEY ?? null;
|
|
33
|
+
const demoMode = config.demoMode === true || !apiKey;
|
|
34
|
+
globalConfig = {
|
|
35
|
+
apiKey: demoMode ? null : apiKey,
|
|
36
|
+
demoMode,
|
|
37
|
+
serverName: config.serverName ?? process.env.OPENCONDUCTOR_SERVER_NAME ?? "mcp-server",
|
|
38
|
+
serverVersion: config.serverVersion ?? process.env.npm_package_version ?? "0.0.0",
|
|
39
|
+
initialized: true
|
|
40
|
+
};
|
|
41
|
+
if (!config.quiet) {
|
|
42
|
+
if (demoMode) {
|
|
43
|
+
console.log(DEMO_BANNER);
|
|
44
|
+
} else {
|
|
45
|
+
console.log(PRODUCTION_BANNER);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return globalConfig;
|
|
49
|
+
}
|
|
50
|
+
function getConfig() {
|
|
51
|
+
if (!globalConfig.initialized) {
|
|
52
|
+
return initOpenConductor({ quiet: true });
|
|
53
|
+
}
|
|
54
|
+
return globalConfig;
|
|
55
|
+
}
|
|
56
|
+
function isDemoMode() {
|
|
57
|
+
return getConfig().demoMode;
|
|
58
|
+
}
|
|
59
|
+
function isInitialized() {
|
|
60
|
+
return globalConfig.initialized;
|
|
61
|
+
}
|
|
62
|
+
function resetConfig() {
|
|
63
|
+
globalConfig = {
|
|
64
|
+
apiKey: null,
|
|
65
|
+
demoMode: false,
|
|
66
|
+
serverName: "mcp-server",
|
|
67
|
+
serverVersion: "0.0.0",
|
|
68
|
+
initialized: false
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export { getConfig, initOpenConductor, isDemoMode, isInitialized, resetConfig };
|
|
73
|
+
//# sourceMappingURL=index.mjs.map
|
|
74
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/config/index.ts"],"names":[],"mappings":";AAmCA,IAAI,YAAA,GAA+B;AAAA,EACjC,MAAA,EAAQ,IAAA;AAAA,EACR,QAAA,EAAU,KAAA;AAAA,EACV,UAAA,EAAY,YAAA;AAAA,EACZ,aAAA,EAAe,OAAA;AAAA,EACf,WAAA,EAAa;AACf,CAAA;AAMA,IAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAkBpB,IAAM,iBAAA,GAAoB;AAAA;AAAA;AAAA;AAAA,CAAA;AAoCnB,SAAS,iBAAA,CAAkB,MAAA,GAA8B,EAAC,EAAmB;AAElF,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,OAAA,CAAQ,IAAI,qBAAA,IAAyB,IAAA;AAIrE,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,KAAa,IAAA,IAAQ,CAAC,MAAA;AAE9C,EAAA,YAAA,GAAe;AAAA,IACb,MAAA,EAAQ,WAAW,IAAA,GAAO,MAAA;AAAA,IAC1B,QAAA;AAAA,IACA,UAAA,EAAY,MAAA,CAAO,UAAA,IAAc,OAAA,CAAQ,IAAI,yBAAA,IAA6B,YAAA;AAAA,IAC1E,aAAA,EAAe,MAAA,CAAO,aAAA,IAAiB,OAAA,CAAQ,IAAI,mBAAA,IAAuB,OAAA;AAAA,IAC1E,WAAA,EAAa;AAAA,GACf;AAGA,EAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAA,CAAQ,IAAI,WAAW,CAAA;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAI,iBAAiB,CAAA;AAAA,IAC/B;AAAA,EACF;AAEA,EAAA,OAAO,YAAA;AACT;AAMO,SAAS,SAAA,GAA4B;AAC1C,EAAA,IAAI,CAAC,aAAa,WAAA,EAAa;AAE7B,IAAA,OAAO,iBAAA,CAAkB,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,YAAA;AACT;AAKO,SAAS,UAAA,GAAsB;AACpC,EAAA,OAAO,WAAU,CAAE,QAAA;AACrB;AAKO,SAAS,aAAA,GAAyB;AACvC,EAAA,OAAO,YAAA,CAAa,WAAA;AACtB;AAKO,SAAS,WAAA,GAAoB;AAClC,EAAA,YAAA,GAAe;AAAA,IACb,MAAA,EAAQ,IAAA;AAAA,IACR,QAAA,EAAU,KAAA;AAAA,IACV,UAAA,EAAY,YAAA;AAAA,IACZ,aAAA,EAAe,OAAA;AAAA,IACf,WAAA,EAAa;AAAA,GACf;AACF","file":"index.mjs","sourcesContent":["/**\n * @openconductor/mcp-sdk - Global Configuration\n * \n * Single source of truth for SDK mode (demo vs production)\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface OpenConductorConfig {\n /** OpenConductor API key (optional in demo mode) */\n apiKey?: string\n /** Force demo mode even if API key is provided */\n demoMode?: boolean\n /** Server name for telemetry */\n serverName?: string\n /** Server version */\n serverVersion?: string\n /** Suppress demo mode banner */\n quiet?: boolean\n}\n\nexport interface ResolvedConfig {\n apiKey: string | null\n demoMode: boolean\n serverName: string\n serverVersion: string\n initialized: boolean\n}\n\n// ============================================================================\n// State\n// ============================================================================\n\nlet globalConfig: ResolvedConfig = {\n apiKey: null,\n demoMode: false,\n serverName: 'mcp-server',\n serverVersion: '0.0.0',\n initialized: false,\n}\n\n// ============================================================================\n// Demo Mode Banner\n// ============================================================================\n\nconst DEMO_BANNER = `\n┌─────────────────────────────────────────────────────────────────┐\n│ │\n│ 🎮 DEMO MODE ACTIVE │\n│ │\n│ The SDK is running without an API key. │\n│ • Payment: Mock billing (always allowed, 9999 credits) │\n│ • Telemetry: Logging to console only │\n│ • All features work - no data sent to OpenConductor │\n│ │\n│ To enable production mode: │\n│ 1. Get a free API key at https://openconductor.ai │\n│ 2. Set OPENCONDUCTOR_API_KEY environment variable │\n│ or pass apiKey to initOpenConductor() │\n│ │\n└─────────────────────────────────────────────────────────────────┘\n`\n\nconst PRODUCTION_BANNER = `\n┌─────────────────────────────────────────────────────────────────┐\n│ ✅ OpenConductor SDK initialized (production mode) │\n└─────────────────────────────────────────────────────────────────┘\n`\n\n// ============================================================================\n// Initialization\n// ============================================================================\n\n/**\n * Initialize the OpenConductor SDK\n * \n * Call this once at startup. If no API key is provided (via config or \n * OPENCONDUCTOR_API_KEY env var), the SDK automatically enables Demo Mode.\n * \n * @example Production mode\n * ```typescript\n * initOpenConductor({\n * apiKey: process.env.OPENCONDUCTOR_API_KEY,\n * serverName: 'my-server',\n * serverVersion: '1.0.0'\n * })\n * ```\n * \n * @example Demo mode (explicit)\n * ```typescript\n * initOpenConductor({ demoMode: true })\n * ```\n * \n * @example Demo mode (auto-detected)\n * ```typescript\n * // No API key? Demo mode activates automatically\n * initOpenConductor({ serverName: 'my-server' })\n * ```\n */\nexport function initOpenConductor(config: OpenConductorConfig = {}): ResolvedConfig {\n // Resolve API key from config or environment\n const apiKey = config.apiKey ?? process.env.OPENCONDUCTOR_API_KEY ?? null\n \n // Determine demo mode\n // Demo if: explicitly set OR no API key provided\n const demoMode = config.demoMode === true || !apiKey\n \n globalConfig = {\n apiKey: demoMode ? null : apiKey,\n demoMode,\n serverName: config.serverName ?? process.env.OPENCONDUCTOR_SERVER_NAME ?? 'mcp-server',\n serverVersion: config.serverVersion ?? process.env.npm_package_version ?? '0.0.0',\n initialized: true,\n }\n \n // Print banner unless quiet\n if (!config.quiet) {\n if (demoMode) {\n console.log(DEMO_BANNER)\n } else {\n console.log(PRODUCTION_BANNER)\n }\n }\n \n return globalConfig\n}\n\n/**\n * Get current SDK configuration\n * Auto-initializes in demo mode if not already initialized\n */\nexport function getConfig(): ResolvedConfig {\n if (!globalConfig.initialized) {\n // Auto-init in demo mode for zero-config experience\n return initOpenConductor({ quiet: true })\n }\n return globalConfig\n}\n\n/**\n * Check if SDK is in demo mode\n */\nexport function isDemoMode(): boolean {\n return getConfig().demoMode\n}\n\n/**\n * Check if SDK is initialized\n */\nexport function isInitialized(): boolean {\n return globalConfig.initialized\n}\n\n/**\n * Reset configuration (mainly for testing)\n */\nexport function resetConfig(): void {\n globalConfig = {\n apiKey: null,\n demoMode: false,\n serverName: 'mcp-server',\n serverVersion: '0.0.0',\n initialized: false,\n }\n}\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { BillingStatus, CreditPack, CreditPackInfo, UsageAnalytics } from '../payment/index.mjs';
|
|
2
|
+
import { ToolMetric } from '../telemetry/index.mjs';
|
|
3
|
+
import '../errors/index.mjs';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @openconductor/mcp-sdk - Demo Mode Mock Data
|
|
7
|
+
*
|
|
8
|
+
* Realistic sample data for zero-config demo experience
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
declare const MOCK_BILLING_STATUS: BillingStatus;
|
|
12
|
+
declare const MOCK_USER_BILLING: {
|
|
13
|
+
credits: number;
|
|
14
|
+
tier: string;
|
|
15
|
+
active: boolean;
|
|
16
|
+
};
|
|
17
|
+
declare const MOCK_CREDIT_PACKS: Record<CreditPack, CreditPackInfo>;
|
|
18
|
+
declare function getMockAnalytics(period: '24h' | '7d' | '30d' | 'all'): UsageAnalytics;
|
|
19
|
+
declare function createMockMetric(tool: string, duration: number, success: boolean): ToolMetric;
|
|
20
|
+
declare const demoLogger: {
|
|
21
|
+
telemetry: (action: string, data: Record<string, unknown>) => void;
|
|
22
|
+
payment: (action: string, data: Record<string, unknown>) => void;
|
|
23
|
+
billing: (userId: string, result: BillingStatus) => void;
|
|
24
|
+
deduct: (userId: string, credits: number, tool: string) => void;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export { MOCK_BILLING_STATUS, MOCK_CREDIT_PACKS, MOCK_USER_BILLING, createMockMetric, demoLogger, getMockAnalytics };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { BillingStatus, CreditPack, CreditPackInfo, UsageAnalytics } from '../payment/index.js';
|
|
2
|
+
import { ToolMetric } from '../telemetry/index.js';
|
|
3
|
+
import '../errors/index.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @openconductor/mcp-sdk - Demo Mode Mock Data
|
|
7
|
+
*
|
|
8
|
+
* Realistic sample data for zero-config demo experience
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
declare const MOCK_BILLING_STATUS: BillingStatus;
|
|
12
|
+
declare const MOCK_USER_BILLING: {
|
|
13
|
+
credits: number;
|
|
14
|
+
tier: string;
|
|
15
|
+
active: boolean;
|
|
16
|
+
};
|
|
17
|
+
declare const MOCK_CREDIT_PACKS: Record<CreditPack, CreditPackInfo>;
|
|
18
|
+
declare function getMockAnalytics(period: '24h' | '7d' | '30d' | 'all'): UsageAnalytics;
|
|
19
|
+
declare function createMockMetric(tool: string, duration: number, success: boolean): ToolMetric;
|
|
20
|
+
declare const demoLogger: {
|
|
21
|
+
telemetry: (action: string, data: Record<string, unknown>) => void;
|
|
22
|
+
payment: (action: string, data: Record<string, unknown>) => void;
|
|
23
|
+
billing: (userId: string, result: BillingStatus) => void;
|
|
24
|
+
deduct: (userId: string, credits: number, tool: string) => void;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export { MOCK_BILLING_STATUS, MOCK_CREDIT_PACKS, MOCK_USER_BILLING, createMockMetric, demoLogger, getMockAnalytics };
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/demo/index.ts
|
|
4
|
+
var MOCK_BILLING_STATUS = {
|
|
5
|
+
allowed: true,
|
|
6
|
+
credits: 9999,
|
|
7
|
+
tier: "demo",
|
|
8
|
+
reason: void 0,
|
|
9
|
+
actionUrl: "https://openconductor.ai/pricing"
|
|
10
|
+
};
|
|
11
|
+
var MOCK_USER_BILLING = {
|
|
12
|
+
credits: 9999,
|
|
13
|
+
tier: "demo",
|
|
14
|
+
active: true
|
|
15
|
+
};
|
|
16
|
+
var MOCK_CREDIT_PACKS = {
|
|
17
|
+
starter: {
|
|
18
|
+
name: "Starter Pack",
|
|
19
|
+
credits: 100,
|
|
20
|
+
price: 9.99,
|
|
21
|
+
perCredit: 0.0999,
|
|
22
|
+
savings: 0,
|
|
23
|
+
bestFor: "Testing and small projects"
|
|
24
|
+
},
|
|
25
|
+
pro: {
|
|
26
|
+
name: "Pro Pack",
|
|
27
|
+
credits: 500,
|
|
28
|
+
price: 39.99,
|
|
29
|
+
perCredit: 0.0799,
|
|
30
|
+
savings: 20,
|
|
31
|
+
bestFor: "Growing projects",
|
|
32
|
+
popular: true
|
|
33
|
+
},
|
|
34
|
+
business: {
|
|
35
|
+
name: "Business Pack",
|
|
36
|
+
credits: 2e3,
|
|
37
|
+
price: 119.99,
|
|
38
|
+
perCredit: 0.0599,
|
|
39
|
+
savings: 40,
|
|
40
|
+
bestFor: "Production workloads"
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
function generateMockTimeline(days) {
|
|
44
|
+
const timeline = [];
|
|
45
|
+
const now = /* @__PURE__ */ new Date();
|
|
46
|
+
for (let i = days - 1; i >= 0; i--) {
|
|
47
|
+
const date = new Date(now);
|
|
48
|
+
date.setDate(date.getDate() - i);
|
|
49
|
+
timeline.push({
|
|
50
|
+
date: date.toISOString().split("T")[0],
|
|
51
|
+
used: Math.floor(Math.random() * 50) + 10,
|
|
52
|
+
purchased: i % 7 === 0 ? 500 : 0
|
|
53
|
+
// Weekly purchases
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return timeline;
|
|
57
|
+
}
|
|
58
|
+
function generateMockTransactions(count) {
|
|
59
|
+
const tools = ["analyze-data", "generate-report", "search-docs", "summarize", "translate"];
|
|
60
|
+
const transactions = [];
|
|
61
|
+
const now = /* @__PURE__ */ new Date();
|
|
62
|
+
for (let i = 0; i < count; i++) {
|
|
63
|
+
const isDebit = Math.random() > 0.2;
|
|
64
|
+
const date = new Date(now);
|
|
65
|
+
date.setHours(date.getHours() - i * 2);
|
|
66
|
+
transactions.push({
|
|
67
|
+
id: `txn_demo_${i}`,
|
|
68
|
+
amount: isDebit ? -(Math.floor(Math.random() * 20) + 1) : 500,
|
|
69
|
+
type: isDebit ? "usage" : "purchase",
|
|
70
|
+
tool: isDebit ? tools[Math.floor(Math.random() * tools.length)] : null,
|
|
71
|
+
createdAt: date.toISOString()
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return transactions;
|
|
75
|
+
}
|
|
76
|
+
function getMockAnalytics(period) {
|
|
77
|
+
const days = period === "24h" ? 1 : period === "7d" ? 7 : period === "30d" ? 30 : 90;
|
|
78
|
+
const timeline = generateMockTimeline(days);
|
|
79
|
+
const totalUsed = timeline.reduce((sum, d) => sum + d.used, 0);
|
|
80
|
+
const totalPurchased = timeline.reduce((sum, d) => sum + d.purchased, 0);
|
|
81
|
+
return {
|
|
82
|
+
period,
|
|
83
|
+
balance: 9999,
|
|
84
|
+
summary: {
|
|
85
|
+
totalUsed,
|
|
86
|
+
totalPurchased,
|
|
87
|
+
netChange: totalPurchased - totalUsed,
|
|
88
|
+
burnRate: totalUsed / days,
|
|
89
|
+
daysRemaining: Math.floor(9999 / (totalUsed / days)),
|
|
90
|
+
toolCount: 5,
|
|
91
|
+
transactionCount: days * 3
|
|
92
|
+
},
|
|
93
|
+
topTools: [
|
|
94
|
+
{ tool: "analyze-data", calls: 156, credits: 780 },
|
|
95
|
+
{ tool: "generate-report", calls: 89, credits: 445 },
|
|
96
|
+
{ tool: "search-docs", calls: 234, credits: 234 },
|
|
97
|
+
{ tool: "summarize", calls: 67, credits: 335 },
|
|
98
|
+
{ tool: "translate", calls: 45, credits: 90 }
|
|
99
|
+
],
|
|
100
|
+
usageTimeline: timeline,
|
|
101
|
+
recentTransactions: generateMockTransactions(10)
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function createMockMetric(tool, duration, success) {
|
|
105
|
+
return {
|
|
106
|
+
tool,
|
|
107
|
+
duration,
|
|
108
|
+
success,
|
|
109
|
+
error: success ? void 0 : "Mock error for demo",
|
|
110
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
var DEMO_PREFIX = "[\u{1F3AE} DEMO]";
|
|
114
|
+
var demoLogger = {
|
|
115
|
+
telemetry: (action, data) => {
|
|
116
|
+
console.log(`${DEMO_PREFIX} Telemetry ${action}:`, JSON.stringify(data, null, 2));
|
|
117
|
+
},
|
|
118
|
+
payment: (action, data) => {
|
|
119
|
+
console.log(`${DEMO_PREFIX} Payment ${action}:`, JSON.stringify(data, null, 2));
|
|
120
|
+
},
|
|
121
|
+
billing: (userId, result) => {
|
|
122
|
+
console.log(`${DEMO_PREFIX} Billing check for ${userId}: ALLOWED (demo mode)`);
|
|
123
|
+
},
|
|
124
|
+
deduct: (userId, credits, tool) => {
|
|
125
|
+
console.log(`${DEMO_PREFIX} Would deduct ${credits} credits from ${userId} for ${tool} (skipped in demo)`);
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
exports.MOCK_BILLING_STATUS = MOCK_BILLING_STATUS;
|
|
130
|
+
exports.MOCK_CREDIT_PACKS = MOCK_CREDIT_PACKS;
|
|
131
|
+
exports.MOCK_USER_BILLING = MOCK_USER_BILLING;
|
|
132
|
+
exports.createMockMetric = createMockMetric;
|
|
133
|
+
exports.demoLogger = demoLogger;
|
|
134
|
+
exports.getMockAnalytics = getMockAnalytics;
|
|
135
|
+
//# sourceMappingURL=index.js.map
|
|
136
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/demo/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @openconductor/mcp-sdk - Demo Mode Mock Data\n * \n * Realistic sample data for zero-config demo experience\n */\n\nimport type { BillingStatus, UsageAnalytics, CreditPackInfo, CreditPack } from '../payment'\nimport type { ToolMetric } from '../telemetry'\n\n// ============================================================================\n// Mock Billing Data\n// ============================================================================\n\nexport const MOCK_BILLING_STATUS: BillingStatus = {\n allowed: true,\n credits: 9999,\n tier: 'demo',\n reason: undefined,\n actionUrl: 'https://openconductor.ai/pricing',\n}\n\nexport const MOCK_USER_BILLING = {\n credits: 9999,\n tier: 'demo',\n active: true,\n}\n\nexport const MOCK_CREDIT_PACKS: Record<CreditPack, CreditPackInfo> = {\n starter: {\n name: 'Starter Pack',\n credits: 100,\n price: 9.99,\n perCredit: 0.0999,\n savings: 0,\n bestFor: 'Testing and small projects',\n },\n pro: {\n name: 'Pro Pack',\n credits: 500,\n price: 39.99,\n perCredit: 0.0799,\n savings: 20,\n bestFor: 'Growing projects',\n popular: true,\n },\n business: {\n name: 'Business Pack',\n credits: 2000,\n price: 119.99,\n perCredit: 0.0599,\n savings: 40,\n bestFor: 'Production workloads',\n },\n}\n\n// ============================================================================\n// Mock Analytics Data\n// ============================================================================\n\nfunction generateMockTimeline(days: number): Array<{ date: string; used: number; purchased: number }> {\n const timeline: Array<{ date: string; used: number; purchased: number }> = []\n const now = new Date()\n \n for (let i = days - 1; i >= 0; i--) {\n const date = new Date(now)\n date.setDate(date.getDate() - i)\n timeline.push({\n date: date.toISOString().split('T')[0],\n used: Math.floor(Math.random() * 50) + 10,\n purchased: i % 7 === 0 ? 500 : 0, // Weekly purchases\n })\n }\n \n return timeline\n}\n\nfunction generateMockTransactions(count: number): UsageAnalytics['recentTransactions'] {\n const tools = ['analyze-data', 'generate-report', 'search-docs', 'summarize', 'translate']\n const transactions: UsageAnalytics['recentTransactions'] = []\n const now = new Date()\n \n for (let i = 0; i < count; i++) {\n const isDebit = Math.random() > 0.2\n const date = new Date(now)\n date.setHours(date.getHours() - i * 2)\n \n transactions.push({\n id: `txn_demo_${i}`,\n amount: isDebit ? -(Math.floor(Math.random() * 20) + 1) : 500,\n type: isDebit ? 'usage' : 'purchase',\n tool: isDebit ? tools[Math.floor(Math.random() * tools.length)] : null,\n createdAt: date.toISOString(),\n })\n }\n \n return transactions\n}\n\nexport function getMockAnalytics(period: '24h' | '7d' | '30d' | 'all'): UsageAnalytics {\n const days = period === '24h' ? 1 : period === '7d' ? 7 : period === '30d' ? 30 : 90\n const timeline = generateMockTimeline(days)\n const totalUsed = timeline.reduce((sum, d) => sum + d.used, 0)\n const totalPurchased = timeline.reduce((sum, d) => sum + d.purchased, 0)\n \n return {\n period,\n balance: 9999,\n summary: {\n totalUsed,\n totalPurchased,\n netChange: totalPurchased - totalUsed,\n burnRate: totalUsed / days,\n daysRemaining: Math.floor(9999 / (totalUsed / days)),\n toolCount: 5,\n transactionCount: days * 3,\n },\n topTools: [\n { tool: 'analyze-data', calls: 156, credits: 780 },\n { tool: 'generate-report', calls: 89, credits: 445 },\n { tool: 'search-docs', calls: 234, credits: 234 },\n { tool: 'summarize', calls: 67, credits: 335 },\n { tool: 'translate', calls: 45, credits: 90 },\n ],\n usageTimeline: timeline,\n recentTransactions: generateMockTransactions(10),\n }\n}\n\n// ============================================================================\n// Mock Telemetry Data\n// ============================================================================\n\nexport function createMockMetric(tool: string, duration: number, success: boolean): ToolMetric {\n return {\n tool,\n duration,\n success,\n error: success ? undefined : 'Mock error for demo',\n timestamp: new Date().toISOString(),\n }\n}\n\n// ============================================================================\n// Demo Console Logger\n// ============================================================================\n\nconst DEMO_PREFIX = '[🎮 DEMO]'\n\nexport const demoLogger = {\n telemetry: (action: string, data: Record<string, unknown>) => {\n console.log(`${DEMO_PREFIX} Telemetry ${action}:`, JSON.stringify(data, null, 2))\n },\n \n payment: (action: string, data: Record<string, unknown>) => {\n console.log(`${DEMO_PREFIX} Payment ${action}:`, JSON.stringify(data, null, 2))\n },\n \n billing: (userId: string, result: BillingStatus) => {\n console.log(`${DEMO_PREFIX} Billing check for ${userId}: ALLOWED (demo mode)`)\n },\n \n deduct: (userId: string, credits: number, tool: string) => {\n console.log(`${DEMO_PREFIX} Would deduct ${credits} credits from ${userId} for ${tool} (skipped in demo)`)\n },\n}\n"]}
|