@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 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
- // Optional: Enable observability
47
- initTelemetry({
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/telemetry'
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
- initTelemetry({
157
- apiKey: 'oc_xxx', // Free tier at openconductor.ai
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/payment'
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
- initPayment({ apiKey: 'oc_xxx' })
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"]}