@codemieai/code 0.0.11 → 0.0.13
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 +70 -861
- package/dist/agents/codemie-code/agent.d.ts.map +1 -1
- package/dist/agents/codemie-code/agent.js +35 -4
- package/dist/agents/codemie-code/agent.js.map +1 -1
- package/dist/agents/codemie-code/tools/index.d.ts.map +1 -1
- package/dist/agents/codemie-code/tools/index.js +5 -3
- package/dist/agents/codemie-code/tools/index.js.map +1 -1
- package/dist/agents/core/AgentCLI.d.ts.map +1 -1
- package/dist/agents/core/AgentCLI.js +57 -11
- package/dist/agents/core/AgentCLI.js.map +1 -1
- package/dist/agents/core/BaseAgentAdapter.d.ts +4 -4
- package/dist/agents/core/BaseAgentAdapter.d.ts.map +1 -1
- package/dist/agents/core/BaseAgentAdapter.js +59 -23
- package/dist/agents/core/BaseAgentAdapter.js.map +1 -1
- package/dist/agents/core/types.d.ts +18 -0
- package/dist/agents/core/types.d.ts.map +1 -1
- package/dist/agents/plugins/claude.plugin.d.ts +0 -3
- package/dist/agents/plugins/claude.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/claude.plugin.js +12 -1
- package/dist/agents/plugins/claude.plugin.js.map +1 -1
- package/dist/agents/plugins/codemie-code.plugin.js +1 -1
- package/dist/agents/plugins/codemie-code.plugin.js.map +1 -1
- package/dist/agents/plugins/codex.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/codex.plugin.js +40 -4
- package/dist/agents/plugins/codex.plugin.js.map +1 -1
- package/dist/agents/plugins/gemini.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/gemini.plugin.js +51 -6
- package/dist/agents/plugins/gemini.plugin.js.map +1 -1
- package/dist/agents/registry.d.ts +15 -2
- package/dist/agents/registry.d.ts.map +1 -1
- package/dist/agents/registry.js +30 -6
- package/dist/agents/registry.js.map +1 -1
- package/dist/analytics/aggregation/adapters/claude.adapter.d.ts +37 -0
- package/dist/analytics/aggregation/adapters/claude.adapter.d.ts.map +1 -0
- package/dist/analytics/aggregation/adapters/claude.adapter.js +471 -0
- package/dist/analytics/aggregation/adapters/claude.adapter.js.map +1 -0
- package/dist/analytics/aggregation/adapters/codex.adapter.d.ts +25 -0
- package/dist/analytics/aggregation/adapters/codex.adapter.d.ts.map +1 -0
- package/dist/analytics/aggregation/adapters/codex.adapter.js +376 -0
- package/dist/analytics/aggregation/adapters/codex.adapter.js.map +1 -0
- package/dist/analytics/aggregation/adapters/gemini.adapter.d.ts +28 -0
- package/dist/analytics/aggregation/adapters/gemini.adapter.d.ts.map +1 -0
- package/dist/analytics/aggregation/adapters/gemini.adapter.js +320 -0
- package/dist/analytics/aggregation/adapters/gemini.adapter.js.map +1 -0
- package/dist/analytics/aggregation/adapters/index.d.ts +7 -0
- package/dist/analytics/aggregation/adapters/index.d.ts.map +1 -0
- package/dist/analytics/aggregation/adapters/index.js +7 -0
- package/dist/analytics/aggregation/adapters/index.js.map +1 -0
- package/dist/analytics/aggregation/aggregator.d.ts +49 -0
- package/dist/analytics/aggregation/aggregator.d.ts.map +1 -0
- package/dist/analytics/aggregation/aggregator.js +239 -0
- package/dist/analytics/aggregation/aggregator.js.map +1 -0
- package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.d.ts +63 -0
- package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.d.ts.map +1 -0
- package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.js +58 -0
- package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.js.map +1 -0
- package/dist/analytics/aggregation/core/adapter.interface.d.ts +65 -0
- package/dist/analytics/aggregation/core/adapter.interface.d.ts.map +1 -0
- package/dist/analytics/aggregation/core/adapter.interface.js +9 -0
- package/dist/analytics/aggregation/core/adapter.interface.js.map +1 -0
- package/dist/analytics/aggregation/core/aggregation-utils.d.ts +66 -0
- package/dist/analytics/aggregation/core/aggregation-utils.d.ts.map +1 -0
- package/dist/analytics/aggregation/core/aggregation-utils.js +83 -0
- package/dist/analytics/aggregation/core/aggregation-utils.js.map +1 -0
- package/dist/analytics/aggregation/core/discovery.d.ts +40 -0
- package/dist/analytics/aggregation/core/discovery.d.ts.map +1 -0
- package/dist/analytics/aggregation/core/discovery.js +132 -0
- package/dist/analytics/aggregation/core/discovery.js.map +1 -0
- package/dist/analytics/aggregation/core/file-utils.d.ts +23 -0
- package/dist/analytics/aggregation/core/file-utils.d.ts.map +1 -0
- package/dist/analytics/aggregation/core/file-utils.js +208 -0
- package/dist/analytics/aggregation/core/file-utils.js.map +1 -0
- package/dist/analytics/aggregation/core/index.d.ts +11 -0
- package/dist/analytics/aggregation/core/index.d.ts.map +1 -0
- package/dist/analytics/aggregation/core/index.js +11 -0
- package/dist/analytics/aggregation/core/index.js.map +1 -0
- package/dist/analytics/aggregation/core/project-mapping.d.ts +50 -0
- package/dist/analytics/aggregation/core/project-mapping.d.ts.map +1 -0
- package/dist/analytics/aggregation/core/project-mapping.js +102 -0
- package/dist/analytics/aggregation/core/project-mapping.js.map +1 -0
- package/dist/analytics/aggregation/core/streaming.d.ts +26 -0
- package/dist/analytics/aggregation/core/streaming.d.ts.map +1 -0
- package/dist/analytics/aggregation/core/streaming.js +58 -0
- package/dist/analytics/aggregation/core/streaming.js.map +1 -0
- package/dist/analytics/aggregation/index.d.ts +8 -0
- package/dist/analytics/aggregation/index.d.ts.map +1 -0
- package/dist/analytics/aggregation/index.js +8 -0
- package/dist/analytics/aggregation/index.js.map +1 -0
- package/dist/analytics/aggregation/types.d.ts +258 -0
- package/dist/analytics/aggregation/types.d.ts.map +1 -0
- package/dist/analytics/aggregation/types.js +8 -0
- package/dist/analytics/aggregation/types.js.map +1 -0
- package/dist/analytics/collector.d.ts +46 -0
- package/dist/analytics/collector.d.ts.map +1 -0
- package/dist/analytics/collector.js +83 -0
- package/dist/analytics/collector.js.map +1 -0
- package/dist/analytics/config.d.ts +15 -0
- package/dist/analytics/config.d.ts.map +1 -0
- package/dist/analytics/config.js +65 -0
- package/dist/analytics/config.js.map +1 -0
- package/dist/analytics/index.d.ts +99 -0
- package/dist/analytics/index.d.ts.map +1 -0
- package/dist/analytics/index.js +288 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/plugins/api-metrics.plugin.d.ts +26 -0
- package/dist/analytics/plugins/api-metrics.plugin.d.ts.map +1 -0
- package/dist/analytics/plugins/api-metrics.plugin.js +97 -0
- package/dist/analytics/plugins/api-metrics.plugin.js.map +1 -0
- package/dist/analytics/plugins/index.d.ts +15 -0
- package/dist/analytics/plugins/index.d.ts.map +1 -0
- package/dist/analytics/plugins/index.js +15 -0
- package/dist/analytics/plugins/index.js.map +1 -0
- package/dist/analytics/plugins/model-metrics.plugin.d.ts +39 -0
- package/dist/analytics/plugins/model-metrics.plugin.d.ts.map +1 -0
- package/dist/analytics/plugins/model-metrics.plugin.js +105 -0
- package/dist/analytics/plugins/model-metrics.plugin.js.map +1 -0
- package/dist/analytics/plugins/provider-metrics.plugin.d.ts +41 -0
- package/dist/analytics/plugins/provider-metrics.plugin.d.ts.map +1 -0
- package/dist/analytics/plugins/provider-metrics.plugin.js +123 -0
- package/dist/analytics/plugins/provider-metrics.plugin.js.map +1 -0
- package/dist/analytics/plugins/types.d.ts +61 -0
- package/dist/analytics/plugins/types.d.ts.map +1 -0
- package/dist/analytics/plugins/types.js +54 -0
- package/dist/analytics/plugins/types.js.map +1 -0
- package/dist/analytics/privacy.d.ts +10 -0
- package/dist/analytics/privacy.d.ts.map +1 -0
- package/dist/analytics/privacy.js +20 -0
- package/dist/analytics/privacy.js.map +1 -0
- package/dist/analytics/session.d.ts +56 -0
- package/dist/analytics/session.d.ts.map +1 -0
- package/dist/analytics/session.js +95 -0
- package/dist/analytics/session.js.map +1 -0
- package/dist/analytics/types.d.ts +104 -0
- package/dist/analytics/types.d.ts.map +1 -0
- package/dist/analytics/types.js +15 -0
- package/dist/analytics/types.js.map +1 -0
- package/dist/analytics/writer.d.ts +18 -0
- package/dist/analytics/writer.d.ts.map +1 -0
- package/dist/analytics/writer.js +44 -0
- package/dist/analytics/writer.js.map +1 -0
- package/dist/cli/commands/analytics.d.ts +3 -0
- package/dist/cli/commands/analytics.d.ts.map +1 -0
- package/dist/cli/commands/analytics.js +579 -0
- package/dist/cli/commands/analytics.js.map +1 -0
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/config.js +14 -0
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/profile.d.ts.map +1 -1
- package/dist/cli/commands/profile.js +41 -0
- package/dist/cli/commands/profile.js.map +1 -1
- package/dist/cli/commands/setup.js +70 -1
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/env/types.d.ts +2 -0
- package/dist/env/types.d.ts.map +1 -1
- package/dist/env/types.js.map +1 -1
- package/dist/utils/analytics-reader.d.ts +117 -0
- package/dist/utils/analytics-reader.d.ts.map +1 -0
- package/dist/utils/analytics-reader.js +421 -0
- package/dist/utils/analytics-reader.js.map +1 -0
- package/dist/utils/codemie-integration-validator.d.ts.map +1 -1
- package/dist/utils/codemie-integration-validator.js +3 -16
- package/dist/utils/codemie-integration-validator.js.map +1 -1
- package/dist/utils/codemie-proxy.d.ts +80 -0
- package/dist/utils/codemie-proxy.d.ts.map +1 -0
- package/dist/utils/codemie-proxy.js +348 -0
- package/dist/utils/codemie-proxy.js.map +1 -0
- package/dist/utils/config-loader.d.ts +7 -0
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-loader.js +18 -0
- package/dist/utils/config-loader.js.map +1 -1
- package/dist/utils/date-formatter.d.ts +88 -0
- package/dist/utils/date-formatter.d.ts.map +1 -0
- package/dist/utils/date-formatter.js +133 -0
- package/dist/utils/date-formatter.js.map +1 -0
- package/dist/utils/installation-id.d.ts +10 -0
- package/dist/utils/installation-id.d.ts.map +1 -0
- package/dist/utils/installation-id.js +30 -0
- package/dist/utils/installation-id.js.map +1 -0
- package/dist/utils/logger.d.ts +1 -15
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +5 -86
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/proxy/errors.d.ts +45 -0
- package/dist/utils/proxy/errors.d.ts.map +1 -0
- package/dist/utils/proxy/errors.js +103 -0
- package/dist/utils/proxy/errors.js.map +1 -0
- package/dist/utils/proxy/http-client.d.ts +46 -0
- package/dist/utils/proxy/http-client.d.ts.map +1 -0
- package/dist/utils/proxy/http-client.js +139 -0
- package/dist/utils/proxy/http-client.js.map +1 -0
- package/dist/utils/proxy/interceptors.d.ts +69 -0
- package/dist/utils/proxy/interceptors.d.ts.map +1 -0
- package/dist/utils/proxy/interceptors.js +308 -0
- package/dist/utils/proxy/interceptors.js.map +1 -0
- package/dist/utils/proxy/types.d.ts +45 -0
- package/dist/utils/proxy/types.d.ts.map +1 -0
- package/dist/utils/proxy/types.js +7 -0
- package/dist/utils/proxy/types.js.map +1 -0
- package/package.json +43 -6
- package/dist/utils/sso-gateway.d.ts +0 -75
- package/dist/utils/sso-gateway.d.ts.map +0 -1
- package/dist/utils/sso-gateway.js +0 -453
- package/dist/utils/sso-gateway.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-metrics.plugin.d.ts","sourceRoot":"","sources":["../../../src/analytics/plugins/provider-metrics.plugin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,UAAU,aAAa;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,qBAAsB,YAAW,eAAe;IAC3D,IAAI,SAAsB;IAC1B,OAAO,SAAW;IAGlB,OAAO,CAAC,eAAe,CAAoC;IAE3D;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAoEzE;;OAEG;IACH,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAmCrC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;;OAGG;IACH,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;CAOvD"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider Metrics Plugin
|
|
3
|
+
*
|
|
4
|
+
* Tracks metrics per provider (ai-run-sso, litellm, openai, azure, bedrock).
|
|
5
|
+
* Helps compare provider reliability and performance.
|
|
6
|
+
*/
|
|
7
|
+
export class ProviderMetricsPlugin {
|
|
8
|
+
name = 'provider-metrics';
|
|
9
|
+
version = '1.0.0';
|
|
10
|
+
// Track metrics per provider
|
|
11
|
+
providerMetrics = new Map();
|
|
12
|
+
/**
|
|
13
|
+
* Process events to track metrics (no enrichment to individual events)
|
|
14
|
+
*/
|
|
15
|
+
async processEvent(event) {
|
|
16
|
+
// Extract provider from event
|
|
17
|
+
const provider = event.provider || event.attributes.provider;
|
|
18
|
+
if (!provider) {
|
|
19
|
+
return event;
|
|
20
|
+
}
|
|
21
|
+
// Initialize provider stats if needed
|
|
22
|
+
if (!this.providerMetrics.has(provider)) {
|
|
23
|
+
this.providerMetrics.set(provider, {
|
|
24
|
+
requestCount: 0,
|
|
25
|
+
successCount: 0,
|
|
26
|
+
failureCount: 0,
|
|
27
|
+
totalLatency: 0,
|
|
28
|
+
timeouts: 0,
|
|
29
|
+
networkErrors: 0,
|
|
30
|
+
authErrors: 0
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
const stats = this.providerMetrics.get(provider);
|
|
34
|
+
// Track API requests
|
|
35
|
+
if (event.eventType === 'api_request') {
|
|
36
|
+
stats.requestCount++;
|
|
37
|
+
}
|
|
38
|
+
// Track API responses
|
|
39
|
+
if (event.eventType === 'api_response') {
|
|
40
|
+
const statusCode = event.attributes.statusCode;
|
|
41
|
+
const latency = event.metrics?.latencyMs;
|
|
42
|
+
if (statusCode >= 200 && statusCode < 400) {
|
|
43
|
+
stats.successCount++;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
stats.failureCount++;
|
|
47
|
+
// Track specific error types
|
|
48
|
+
if (statusCode === 401 || statusCode === 403) {
|
|
49
|
+
stats.authErrors++;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (latency) {
|
|
53
|
+
stats.totalLatency += latency;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Track proxy errors
|
|
57
|
+
if (event.eventType === 'proxy_error') {
|
|
58
|
+
const errorType = event.attributes.errorType;
|
|
59
|
+
if (errorType === 'TimeoutError') {
|
|
60
|
+
stats.timeouts++;
|
|
61
|
+
}
|
|
62
|
+
else if (errorType === 'NetworkError') {
|
|
63
|
+
stats.networkErrors++;
|
|
64
|
+
}
|
|
65
|
+
else if (errorType === 'AuthenticationError') {
|
|
66
|
+
stats.authErrors++;
|
|
67
|
+
}
|
|
68
|
+
stats.failureCount++;
|
|
69
|
+
}
|
|
70
|
+
// Return event unchanged (no enrichment)
|
|
71
|
+
return event;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get current aggregated metrics for all providers
|
|
75
|
+
*/
|
|
76
|
+
getMetrics() {
|
|
77
|
+
const providerMetrics = {};
|
|
78
|
+
for (const [provider, stats] of this.providerMetrics.entries()) {
|
|
79
|
+
const successRate = stats.requestCount > 0
|
|
80
|
+
? stats.successCount / stats.requestCount
|
|
81
|
+
: 0;
|
|
82
|
+
const errorRate = stats.requestCount > 0
|
|
83
|
+
? stats.failureCount / stats.requestCount
|
|
84
|
+
: 0;
|
|
85
|
+
const avgLatency = stats.successCount > 0
|
|
86
|
+
? stats.totalLatency / stats.successCount
|
|
87
|
+
: 0;
|
|
88
|
+
providerMetrics[provider] = {
|
|
89
|
+
requestCount: stats.requestCount,
|
|
90
|
+
successCount: stats.successCount,
|
|
91
|
+
failureCount: stats.failureCount,
|
|
92
|
+
successRate: Math.round(successRate * 100) / 100,
|
|
93
|
+
errorRate: Math.round(errorRate * 100) / 100,
|
|
94
|
+
averageLatencyMs: Math.round(avgLatency),
|
|
95
|
+
timeouts: stats.timeouts,
|
|
96
|
+
networkErrors: stats.networkErrors,
|
|
97
|
+
authErrors: stats.authErrors
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
providers: providerMetrics,
|
|
102
|
+
providerCount: this.providerMetrics.size
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Reset metrics (useful for new sessions)
|
|
107
|
+
*/
|
|
108
|
+
reset() {
|
|
109
|
+
this.providerMetrics.clear();
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get all provider metrics (useful for session end reporting)
|
|
113
|
+
* @deprecated Use getMetrics() instead
|
|
114
|
+
*/
|
|
115
|
+
getAllProviderMetrics() {
|
|
116
|
+
const result = {};
|
|
117
|
+
for (const [provider, stats] of this.providerMetrics.entries()) {
|
|
118
|
+
result[provider] = { ...stats };
|
|
119
|
+
}
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=provider-metrics.plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-metrics.plugin.js","sourceRoot":"","sources":["../../../src/analytics/plugins/provider-metrics.plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics Plugin System
|
|
3
|
+
*
|
|
4
|
+
* Extensible architecture for adding custom metrics without modifying core.
|
|
5
|
+
* SOLID: Open/Closed - extend analytics via plugins, don't modify core.
|
|
6
|
+
*/
|
|
7
|
+
import { Analytics } from '../index.js';
|
|
8
|
+
import { AnalyticsEvent } from '../types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Analytics Plugin Interface
|
|
11
|
+
* Allows extending analytics without modifying core
|
|
12
|
+
*/
|
|
13
|
+
export interface AnalyticsPlugin {
|
|
14
|
+
/** Plugin name (must be unique) */
|
|
15
|
+
name: string;
|
|
16
|
+
/** Plugin version */
|
|
17
|
+
version: string;
|
|
18
|
+
/** Called when plugin is registered */
|
|
19
|
+
initialize?(analytics: Analytics): Promise<void>;
|
|
20
|
+
/** Transform/enrich events before writing */
|
|
21
|
+
processEvent?(event: AnalyticsEvent): Promise<AnalyticsEvent | null>;
|
|
22
|
+
/** Get current aggregated metrics snapshot (for reporting) */
|
|
23
|
+
getMetrics?(): Record<string, unknown>;
|
|
24
|
+
/** Reset plugin metrics (useful for new sessions) */
|
|
25
|
+
reset?(): void;
|
|
26
|
+
/** Custom event types this plugin handles (optional) */
|
|
27
|
+
customEventTypes?: string[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Plugin Registry
|
|
31
|
+
* Central place for all analytics plugins
|
|
32
|
+
*/
|
|
33
|
+
export declare class AnalyticsPluginRegistry {
|
|
34
|
+
private plugins;
|
|
35
|
+
/**
|
|
36
|
+
* Register a plugin
|
|
37
|
+
* @throws Error if plugin name already registered
|
|
38
|
+
*/
|
|
39
|
+
register(plugin: AnalyticsPlugin): void;
|
|
40
|
+
/**
|
|
41
|
+
* Get all registered plugins
|
|
42
|
+
*/
|
|
43
|
+
getAll(): AnalyticsPlugin[];
|
|
44
|
+
/**
|
|
45
|
+
* Get plugin by name
|
|
46
|
+
*/
|
|
47
|
+
getByName(name: string): AnalyticsPlugin | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* Check if plugin is registered
|
|
50
|
+
*/
|
|
51
|
+
has(name: string): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Unregister plugin
|
|
54
|
+
*/
|
|
55
|
+
unregister(name: string): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Clear all plugins
|
|
58
|
+
*/
|
|
59
|
+
clear(): void;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/analytics/plugins/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IAEb,qBAAqB;IACrB,OAAO,EAAE,MAAM,CAAC;IAEhB,uCAAuC;IACvC,UAAU,CAAC,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjD,6CAA6C;IAC7C,YAAY,CAAC,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAErE,8DAA8D;IAC9D,UAAU,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEvC,qDAAqD;IACrD,KAAK,CAAC,IAAI,IAAI,CAAC;IAEf,wDAAwD;IACxD,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED;;;GAGG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,OAAO,CAAsC;IAErD;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAQvC;;OAEG;IACH,MAAM,IAAI,eAAe,EAAE;IAI3B;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIpD;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics Plugin System
|
|
3
|
+
*
|
|
4
|
+
* Extensible architecture for adding custom metrics without modifying core.
|
|
5
|
+
* SOLID: Open/Closed - extend analytics via plugins, don't modify core.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Plugin Registry
|
|
9
|
+
* Central place for all analytics plugins
|
|
10
|
+
*/
|
|
11
|
+
export class AnalyticsPluginRegistry {
|
|
12
|
+
plugins = new Map();
|
|
13
|
+
/**
|
|
14
|
+
* Register a plugin
|
|
15
|
+
* @throws Error if plugin name already registered
|
|
16
|
+
*/
|
|
17
|
+
register(plugin) {
|
|
18
|
+
if (this.plugins.has(plugin.name)) {
|
|
19
|
+
throw new Error(`Analytics plugin "${plugin.name}" is already registered`);
|
|
20
|
+
}
|
|
21
|
+
this.plugins.set(plugin.name, plugin);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get all registered plugins
|
|
25
|
+
*/
|
|
26
|
+
getAll() {
|
|
27
|
+
return Array.from(this.plugins.values());
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get plugin by name
|
|
31
|
+
*/
|
|
32
|
+
getByName(name) {
|
|
33
|
+
return this.plugins.get(name);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Check if plugin is registered
|
|
37
|
+
*/
|
|
38
|
+
has(name) {
|
|
39
|
+
return this.plugins.has(name);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Unregister plugin
|
|
43
|
+
*/
|
|
44
|
+
unregister(name) {
|
|
45
|
+
return this.plugins.delete(name);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Clear all plugins
|
|
49
|
+
*/
|
|
50
|
+
clear() {
|
|
51
|
+
this.plugins.clear();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/analytics/plugins/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgCH;;;GAGG;AACH,MAAM,OAAO,uBAAuB;IAC1B,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;IAErD;;;OAGG;IACH,QAAQ,CAAC,MAAuB;QAC9B,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,CAAC,IAAI,yBAAyB,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Privacy utilities for analytics
|
|
3
|
+
* Handles sensitive data redaction
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Redact sensitive data from parameters
|
|
7
|
+
* Removes API keys, tokens, passwords, secrets
|
|
8
|
+
*/
|
|
9
|
+
export declare function redactSensitive(params: Record<string, unknown>): Record<string, unknown>;
|
|
10
|
+
//# sourceMappingURL=privacy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"privacy.d.ts","sourceRoot":"","sources":["../../src/analytics/privacy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAYzB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Privacy utilities for analytics
|
|
3
|
+
* Handles sensitive data redaction
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Redact sensitive data from parameters
|
|
7
|
+
* Removes API keys, tokens, passwords, secrets
|
|
8
|
+
*/
|
|
9
|
+
export function redactSensitive(params) {
|
|
10
|
+
const sensitive = ['apikey', 'api_key', 'token', 'password', 'secret', 'auth'];
|
|
11
|
+
const result = { ...params };
|
|
12
|
+
for (const key of Object.keys(result)) {
|
|
13
|
+
const lowerKey = key.toLowerCase();
|
|
14
|
+
if (sensitive.some((s) => lowerKey.includes(s))) {
|
|
15
|
+
result[key] = '[REDACTED]';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return result;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=privacy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"privacy.js","sourceRoot":"","sources":["../../src/analytics/privacy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,MAA+B;IAE/B,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC/E,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IAE7B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QACnC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session management for analytics
|
|
3
|
+
* Tracks session lifecycle and metadata
|
|
4
|
+
*/
|
|
5
|
+
import type { SessionConfig } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Manages analytics session lifecycle
|
|
8
|
+
*/
|
|
9
|
+
export declare class SessionManager {
|
|
10
|
+
private session;
|
|
11
|
+
/**
|
|
12
|
+
* Start a new session
|
|
13
|
+
*/
|
|
14
|
+
start(config: SessionConfig): void;
|
|
15
|
+
/**
|
|
16
|
+
* Get current session ID
|
|
17
|
+
*/
|
|
18
|
+
get id(): string;
|
|
19
|
+
/**
|
|
20
|
+
* Get session duration in milliseconds
|
|
21
|
+
*/
|
|
22
|
+
get durationMs(): number;
|
|
23
|
+
/**
|
|
24
|
+
* Get session agent name
|
|
25
|
+
*/
|
|
26
|
+
get agent(): string;
|
|
27
|
+
/**
|
|
28
|
+
* Get session agent version
|
|
29
|
+
*/
|
|
30
|
+
get agentVersion(): string;
|
|
31
|
+
/**
|
|
32
|
+
* Get session CLI version
|
|
33
|
+
*/
|
|
34
|
+
get cliVersion(): string;
|
|
35
|
+
/**
|
|
36
|
+
* Get session profile
|
|
37
|
+
*/
|
|
38
|
+
get profile(): string;
|
|
39
|
+
/**
|
|
40
|
+
* Get session provider
|
|
41
|
+
*/
|
|
42
|
+
get provider(): string;
|
|
43
|
+
/**
|
|
44
|
+
* Get session model
|
|
45
|
+
*/
|
|
46
|
+
get model(): string;
|
|
47
|
+
/**
|
|
48
|
+
* Check if session is active
|
|
49
|
+
*/
|
|
50
|
+
get isActive(): boolean;
|
|
51
|
+
/**
|
|
52
|
+
* End the current session
|
|
53
|
+
*/
|
|
54
|
+
end(): void;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/analytics/session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,YAAY,CAAC;AAEjE;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAgC;IAE/C;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAelC;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,CAKf;IAED;;OAEG;IACH,IAAI,UAAU,IAAI,MAAM,CAKvB;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAElB;IAED;;OAEG;IACH,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED;;OAEG;IACH,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAElB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;OAEG;IACH,GAAG,IAAI,IAAI;CAGZ"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session management for analytics
|
|
3
|
+
* Tracks session lifecycle and metadata
|
|
4
|
+
*/
|
|
5
|
+
import { randomUUID } from 'node:crypto';
|
|
6
|
+
/**
|
|
7
|
+
* Manages analytics session lifecycle
|
|
8
|
+
*/
|
|
9
|
+
export class SessionManager {
|
|
10
|
+
session = null;
|
|
11
|
+
/**
|
|
12
|
+
* Start a new session
|
|
13
|
+
*/
|
|
14
|
+
start(config) {
|
|
15
|
+
this.session = {
|
|
16
|
+
id: randomUUID(),
|
|
17
|
+
startTime: Date.now(),
|
|
18
|
+
agent: config.agent,
|
|
19
|
+
agentVersion: config.agentVersion,
|
|
20
|
+
cliVersion: config.cliVersion,
|
|
21
|
+
profile: config.profile,
|
|
22
|
+
provider: config.provider,
|
|
23
|
+
model: config.model,
|
|
24
|
+
workingDir: config.workingDir,
|
|
25
|
+
interactive: config.interactive,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get current session ID
|
|
30
|
+
*/
|
|
31
|
+
get id() {
|
|
32
|
+
if (!this.session) {
|
|
33
|
+
throw new Error('No active session');
|
|
34
|
+
}
|
|
35
|
+
return this.session.id;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get session duration in milliseconds
|
|
39
|
+
*/
|
|
40
|
+
get durationMs() {
|
|
41
|
+
if (!this.session) {
|
|
42
|
+
return 0;
|
|
43
|
+
}
|
|
44
|
+
return Date.now() - this.session.startTime;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get session agent name
|
|
48
|
+
*/
|
|
49
|
+
get agent() {
|
|
50
|
+
return this.session?.agent || 'unknown';
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get session agent version
|
|
54
|
+
*/
|
|
55
|
+
get agentVersion() {
|
|
56
|
+
return this.session?.agentVersion || 'unknown';
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Get session CLI version
|
|
60
|
+
*/
|
|
61
|
+
get cliVersion() {
|
|
62
|
+
return this.session?.cliVersion || 'unknown';
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get session profile
|
|
66
|
+
*/
|
|
67
|
+
get profile() {
|
|
68
|
+
return this.session?.profile || 'unknown';
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get session provider
|
|
72
|
+
*/
|
|
73
|
+
get provider() {
|
|
74
|
+
return this.session?.provider || 'unknown';
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get session model
|
|
78
|
+
*/
|
|
79
|
+
get model() {
|
|
80
|
+
return this.session?.model || 'unknown';
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Check if session is active
|
|
84
|
+
*/
|
|
85
|
+
get isActive() {
|
|
86
|
+
return this.session !== null;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* End the current session
|
|
90
|
+
*/
|
|
91
|
+
end() {
|
|
92
|
+
this.session = null;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/analytics/session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC;;GAEG;AACH,MAAM,OAAO,cAAc;IACjB,OAAO,GAA2B,IAAI,CAAC;IAE/C;;OAEG;IACH,KAAK,CAAC,MAAqB;QACzB,IAAI,CAAC,OAAO,GAAG;YACb,EAAE,EAAE,UAAU,EAAE;YAChB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,WAAW,EAAE,MAAM,CAAC,WAAW;SAChC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,IAAI,EAAE;QACJ,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,IAAI,UAAU;QACZ,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,SAAS,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,OAAO,EAAE,YAAY,IAAI,SAAS,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,OAAO,EAAE,UAAU,IAAI,SAAS,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,OAAO,EAAE,OAAO,IAAI,SAAS,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,OAAO,EAAE,QAAQ,IAAI,SAAS,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,SAAS,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,GAAG;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;CACF"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics types and interfaces for CodeMie CLI
|
|
3
|
+
* Provides unified analytics across all agents with minimal overhead
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Analytics configuration
|
|
7
|
+
*/
|
|
8
|
+
export interface AnalyticsConfig {
|
|
9
|
+
/** Enable/disable analytics collection */
|
|
10
|
+
enabled: boolean;
|
|
11
|
+
/** Storage target: local file, remote endpoint, or both */
|
|
12
|
+
target: 'local' | 'remote' | 'both';
|
|
13
|
+
/** Local storage path for JSONL files */
|
|
14
|
+
localPath: string;
|
|
15
|
+
/** Remote endpoint URL (optional) */
|
|
16
|
+
remoteEndpoint?: string;
|
|
17
|
+
/** Buffer flush interval in milliseconds */
|
|
18
|
+
flushInterval: number;
|
|
19
|
+
/** Maximum events to buffer before auto-flush */
|
|
20
|
+
maxBufferSize: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Default analytics configuration
|
|
24
|
+
*/
|
|
25
|
+
export declare const DEFAULT_ANALYTICS_CONFIG: AnalyticsConfig;
|
|
26
|
+
/**
|
|
27
|
+
* Event types tracked across all agents
|
|
28
|
+
*/
|
|
29
|
+
export type EventType = 'session_start' | 'session_end' | 'session_error' | 'api_request' | 'api_response' | 'api_error' | 'proxy_error' | 'config_change' | 'profile_switch' | 'latency_measurement';
|
|
30
|
+
/**
|
|
31
|
+
* Core analytics event structure
|
|
32
|
+
* OpenTelemetry-inspired format for consistency
|
|
33
|
+
*/
|
|
34
|
+
export interface AnalyticsEvent {
|
|
35
|
+
timestamp: string;
|
|
36
|
+
eventType: EventType;
|
|
37
|
+
sessionId: string;
|
|
38
|
+
installationId: string;
|
|
39
|
+
agent: string;
|
|
40
|
+
agentVersion: string;
|
|
41
|
+
cliVersion: string;
|
|
42
|
+
profile: string;
|
|
43
|
+
provider: string;
|
|
44
|
+
model: string;
|
|
45
|
+
attributes: Record<string, unknown>;
|
|
46
|
+
metrics?: Record<string, number>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Session configuration
|
|
50
|
+
*/
|
|
51
|
+
export interface SessionConfig {
|
|
52
|
+
agent: string;
|
|
53
|
+
agentVersion: string;
|
|
54
|
+
cliVersion: string;
|
|
55
|
+
profile: string;
|
|
56
|
+
provider: string;
|
|
57
|
+
model: string;
|
|
58
|
+
workingDir: string;
|
|
59
|
+
interactive: boolean;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Session metadata
|
|
63
|
+
*/
|
|
64
|
+
export interface SessionMetadata {
|
|
65
|
+
id: string;
|
|
66
|
+
startTime: number;
|
|
67
|
+
agent: string;
|
|
68
|
+
agentVersion: string;
|
|
69
|
+
cliVersion: string;
|
|
70
|
+
profile: string;
|
|
71
|
+
provider: string;
|
|
72
|
+
model: string;
|
|
73
|
+
workingDir: string;
|
|
74
|
+
interactive: boolean;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Collector configuration
|
|
78
|
+
*/
|
|
79
|
+
export interface CollectorConfig {
|
|
80
|
+
maxBufferSize: number;
|
|
81
|
+
flushInterval: number;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Analytics writer interface
|
|
85
|
+
*/
|
|
86
|
+
export interface IAnalyticsWriter {
|
|
87
|
+
write(events: AnalyticsEvent[]): Promise<void>;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Remote analytics interface
|
|
91
|
+
*/
|
|
92
|
+
export interface IRemoteAnalytics {
|
|
93
|
+
send(events: AnalyticsEvent[]): Promise<void>;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Comprehensive session metrics
|
|
97
|
+
*/
|
|
98
|
+
export interface SessionMetrics {
|
|
99
|
+
apiRequestCount: number;
|
|
100
|
+
totalLatencyMs: number;
|
|
101
|
+
averageLatencyMs: number;
|
|
102
|
+
durationSeconds: number;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/analytics/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,2DAA2D;IAC3D,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4CAA4C;IAC5C,aAAa,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,eAAO,MAAM,wBAAwB,EAAE,eAMtC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,SAAS,GAEjB,eAAe,GACf,aAAa,GACb,eAAe,GAEf,aAAa,GACb,cAAc,GACd,WAAW,GAEX,aAAa,GAEb,eAAe,GACf,gBAAgB,GAEhB,qBAAqB,CAAC;AAE1B;;;GAGG;AACH,MAAM,WAAW,cAAc;IAE7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IAGvB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IAGnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IAGd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAE7B,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IAGzB,eAAe,EAAE,MAAM,CAAC;CACzB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics types and interfaces for CodeMie CLI
|
|
3
|
+
* Provides unified analytics across all agents with minimal overhead
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Default analytics configuration
|
|
7
|
+
*/
|
|
8
|
+
export const DEFAULT_ANALYTICS_CONFIG = {
|
|
9
|
+
enabled: false,
|
|
10
|
+
target: 'local',
|
|
11
|
+
localPath: '~/.codemie/analytics',
|
|
12
|
+
flushInterval: 5000, // 5 seconds
|
|
13
|
+
maxBufferSize: 100,
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/analytics/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAoBH;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAoB;IACvD,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,OAAO;IACf,SAAS,EAAE,sBAAsB;IACjC,aAAa,EAAE,IAAI,EAAE,YAAY;IACjC,aAAa,EAAE,GAAG;CACnB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local JSONL writer for analytics
|
|
3
|
+
* Writes events to daily log files in JSONL format
|
|
4
|
+
*/
|
|
5
|
+
import type { AnalyticsEvent, IAnalyticsWriter } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Writes analytics events to local JSONL files
|
|
8
|
+
* One file per day: ~/.codemie/analytics/YYYY-MM-DD.jsonl
|
|
9
|
+
*/
|
|
10
|
+
export declare class AnalyticsWriter implements IAnalyticsWriter {
|
|
11
|
+
private basePath;
|
|
12
|
+
constructor(basePath?: string);
|
|
13
|
+
/**
|
|
14
|
+
* Write events to daily log file
|
|
15
|
+
*/
|
|
16
|
+
write(events: AnalyticsEvent[]): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../src/analytics/writer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnE;;;GAGG;AACH,qBAAa,eAAgB,YAAW,gBAAgB;IACtD,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,CAAC,EAAE,MAAM;IAO7B;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAuBrD"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local JSONL writer for analytics
|
|
3
|
+
* Writes events to daily log files in JSONL format
|
|
4
|
+
*/
|
|
5
|
+
import { appendFile, mkdir } from 'node:fs/promises';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
import { homedir } from 'node:os';
|
|
8
|
+
/**
|
|
9
|
+
* Writes analytics events to local JSONL files
|
|
10
|
+
* One file per day: ~/.codemie/analytics/YYYY-MM-DD.jsonl
|
|
11
|
+
*/
|
|
12
|
+
export class AnalyticsWriter {
|
|
13
|
+
basePath;
|
|
14
|
+
constructor(basePath) {
|
|
15
|
+
// Expand ~ to home directory
|
|
16
|
+
this.basePath = basePath
|
|
17
|
+
? basePath.replace(/^~/, homedir())
|
|
18
|
+
: join(homedir(), '.codemie', 'analytics');
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Write events to daily log file
|
|
22
|
+
*/
|
|
23
|
+
async write(events) {
|
|
24
|
+
if (events.length === 0) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
// Get current date for filename
|
|
29
|
+
const date = new Date().toISOString().split('T')[0];
|
|
30
|
+
const filePath = join(this.basePath, `${date}.jsonl`);
|
|
31
|
+
// Ensure directory exists
|
|
32
|
+
await mkdir(this.basePath, { recursive: true });
|
|
33
|
+
// Convert events to JSONL (one JSON per line)
|
|
34
|
+
const lines = events.map((event) => JSON.stringify(event)).join('\n') + '\n';
|
|
35
|
+
// Append to file (non-blocking)
|
|
36
|
+
await appendFile(filePath, lines, 'utf-8');
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
// Silently fail - don't block agent execution
|
|
40
|
+
console.error('Analytics write error:', error);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/analytics/writer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGlC;;;GAGG;AACH,MAAM,OAAO,eAAe;IAClB,QAAQ,CAAS;IAEzB,YAAY,QAAiB;QAC3B,6BAA6B;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ;YACtB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;YACnC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,MAAwB;QAClC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,gCAAgC;YAChC,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,QAAQ,CAAC,CAAC;YAEtD,0BAA0B;YAC1B,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEhD,8CAA8C;YAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;YAE7E,gCAAgC;YAChC,MAAM,UAAU,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,8CAA8C;YAC9C,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;CACF"}
|