@elliotding/ai-agent-mcp 0.1.26 → 0.1.27
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/dist/api/cached-client.d.ts +48 -0
- package/dist/api/cached-client.d.ts.map +1 -0
- package/dist/api/cached-client.js +126 -0
- package/dist/api/cached-client.js.map +1 -0
- package/dist/api/client.d.ts +281 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +371 -0
- package/dist/api/client.js.map +1 -0
- package/dist/auth/index.d.ts +8 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +26 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/middleware.d.ts +36 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +194 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/auth/permissions.d.ts +60 -0
- package/dist/auth/permissions.d.ts.map +1 -0
- package/dist/auth/permissions.js +262 -0
- package/dist/auth/permissions.js.map +1 -0
- package/dist/auth/token-validator.d.ts +52 -0
- package/dist/auth/token-validator.d.ts.map +1 -0
- package/dist/auth/token-validator.js +215 -0
- package/dist/auth/token-validator.js.map +1 -0
- package/dist/cache/cache-manager.d.ts +49 -0
- package/dist/cache/cache-manager.d.ts.map +1 -0
- package/dist/cache/cache-manager.js +191 -0
- package/dist/cache/cache-manager.js.map +1 -0
- package/dist/cache/index.d.ts +6 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +12 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/redis-client.d.ts +45 -0
- package/dist/cache/redis-client.d.ts.map +1 -0
- package/dist/cache/redis-client.js +210 -0
- package/dist/cache/redis-client.js.map +1 -0
- package/dist/config/constants.d.ts +28 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +31 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/index.d.ts +71 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +190 -0
- package/dist/config/index.js.map +1 -0
- package/dist/filesystem/manager.d.ts +45 -0
- package/dist/filesystem/manager.d.ts.map +1 -0
- package/dist/filesystem/manager.js +246 -0
- package/dist/filesystem/manager.js.map +1 -0
- package/dist/git/multi-source-manager.d.ts +78 -0
- package/dist/git/multi-source-manager.d.ts.map +1 -0
- package/dist/git/multi-source-manager.js +577 -0
- package/dist/git/multi-source-manager.js.map +1 -0
- package/dist/git/operations.d.ts +27 -0
- package/dist/git/operations.d.ts.map +1 -0
- package/dist/git/operations.js +83 -0
- package/dist/git/operations.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +122 -0
- package/dist/index.js.map +1 -0
- package/dist/monitoring/health.d.ts +35 -0
- package/dist/monitoring/health.d.ts.map +1 -0
- package/dist/monitoring/health.js +105 -0
- package/dist/monitoring/health.js.map +1 -0
- package/dist/prompts/cache.d.ts +69 -0
- package/dist/prompts/cache.d.ts.map +1 -0
- package/dist/prompts/cache.js +163 -0
- package/dist/prompts/cache.js.map +1 -0
- package/dist/prompts/generator.d.ts +49 -0
- package/dist/prompts/generator.d.ts.map +1 -0
- package/dist/prompts/generator.js +160 -0
- package/dist/prompts/generator.js.map +1 -0
- package/dist/prompts/index.d.ts +13 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +24 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/manager.d.ts +207 -0
- package/dist/prompts/manager.d.ts.map +1 -0
- package/dist/prompts/manager.js +566 -0
- package/dist/prompts/manager.js.map +1 -0
- package/dist/resources/index.d.ts +6 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +10 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/loader.d.ts +88 -0
- package/dist/resources/loader.d.ts.map +1 -0
- package/dist/resources/loader.js +492 -0
- package/dist/resources/loader.js.map +1 -0
- package/dist/server/http.d.ts +57 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +435 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server.d.ts +13 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +201 -0
- package/dist/server.js.map +1 -0
- package/dist/session/manager.d.ts +91 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +251 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/telemetry/index.d.ts +3 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +7 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/manager.d.ts +151 -0
- package/dist/telemetry/manager.d.ts.map +1 -0
- package/dist/telemetry/manager.js +367 -0
- package/dist/telemetry/manager.js.map +1 -0
- package/dist/tools/index.d.ts +13 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +29 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/manage-subscription.d.ts +47 -0
- package/dist/tools/manage-subscription.d.ts.map +1 -0
- package/dist/tools/manage-subscription.js +317 -0
- package/dist/tools/manage-subscription.js.map +1 -0
- package/dist/tools/registry.d.ts +40 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +85 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/resolve-prompt-content.d.ts +35 -0
- package/dist/tools/resolve-prompt-content.d.ts.map +1 -0
- package/dist/tools/resolve-prompt-content.js +99 -0
- package/dist/tools/resolve-prompt-content.js.map +1 -0
- package/dist/tools/search-resources.d.ts +35 -0
- package/dist/tools/search-resources.d.ts.map +1 -0
- package/dist/tools/search-resources.js +159 -0
- package/dist/tools/search-resources.js.map +1 -0
- package/dist/tools/sync-resources.d.ts +54 -0
- package/dist/tools/sync-resources.d.ts.map +1 -0
- package/dist/tools/sync-resources.js +735 -0
- package/dist/tools/sync-resources.js.map +1 -0
- package/dist/tools/track-usage.d.ts +63 -0
- package/dist/tools/track-usage.d.ts.map +1 -0
- package/dist/tools/track-usage.js +90 -0
- package/dist/tools/track-usage.js.map +1 -0
- package/dist/tools/uninstall-resource.d.ts +30 -0
- package/dist/tools/uninstall-resource.d.ts.map +1 -0
- package/dist/tools/uninstall-resource.js +174 -0
- package/dist/tools/uninstall-resource.js.map +1 -0
- package/dist/tools/upload-resource.d.ts +81 -0
- package/dist/tools/upload-resource.d.ts.map +1 -0
- package/dist/tools/upload-resource.js +393 -0
- package/dist/tools/upload-resource.js.map +1 -0
- package/dist/transport/sse.d.ts +29 -0
- package/dist/transport/sse.d.ts.map +1 -0
- package/dist/transport/sse.js +271 -0
- package/dist/transport/sse.js.map +1 -0
- package/dist/types/errors.d.ts +60 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +112 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +23 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/mcp.d.ts +50 -0
- package/dist/types/mcp.d.ts.map +1 -0
- package/dist/types/mcp.js +6 -0
- package/dist/types/mcp.js.map +1 -0
- package/dist/types/resources.d.ts +109 -0
- package/dist/types/resources.d.ts.map +1 -0
- package/dist/types/resources.js +7 -0
- package/dist/types/resources.js.map +1 -0
- package/dist/types/tools.d.ts +253 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +6 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/utils/cursor-paths.d.ts +84 -0
- package/dist/utils/cursor-paths.d.ts.map +1 -0
- package/dist/utils/cursor-paths.js +166 -0
- package/dist/utils/cursor-paths.js.map +1 -0
- package/dist/utils/log-cleaner.d.ts +18 -0
- package/dist/utils/log-cleaner.d.ts.map +1 -0
- package/dist/utils/log-cleaner.js +112 -0
- package/dist/utils/log-cleaner.js.map +1 -0
- package/dist/utils/logger.d.ts +59 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +292 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/validation.d.ts +58 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +214 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TelemetryManager: records local AI resource invocation events and periodically
|
|
3
|
+
* flushes them to the remote telemetry API.
|
|
4
|
+
*
|
|
5
|
+
* Local storage: {MCP Server CWD}/ai-resource-telemetry.json
|
|
6
|
+
*
|
|
7
|
+
* Multi-user design:
|
|
8
|
+
* - The file is keyed by user token so that data for different users is stored
|
|
9
|
+
* and reported independently. Each top-level key in the `users` map is a
|
|
10
|
+
* user token; all events, rules and MCPs belong to that token's owner.
|
|
11
|
+
* - On flush, each user's data is sent with that user's own token, so the
|
|
12
|
+
* server can attribute the telemetry to the correct account.
|
|
13
|
+
*
|
|
14
|
+
* Other design notes:
|
|
15
|
+
* - File is stored in the MCP Server's runtime working directory (not ~/.cursor/).
|
|
16
|
+
* - Atomic write-then-rename pattern prevents file corruption on concurrent
|
|
17
|
+
* writes or unexpected process termination.
|
|
18
|
+
* - Periodic flush is fire-and-forget; failures retry up to MAX_RETRIES times
|
|
19
|
+
* with exponential back-off, then silently drop — main tool flow is never blocked.
|
|
20
|
+
* - Rules cannot track individual invocations (Cursor injects them silently).
|
|
21
|
+
* We report the subscribed list as a snapshot on every flush instead.
|
|
22
|
+
* - MCPs are tracked as a configured-list snapshot only.
|
|
23
|
+
* - jira_id is an optional per-invocation annotation stored separately per key.
|
|
24
|
+
*/
|
|
25
|
+
export type ResourceCategory = 'command' | 'skill' | 'mcp';
|
|
26
|
+
export interface InvocationEvent {
|
|
27
|
+
resource_id: string;
|
|
28
|
+
resource_type: ResourceCategory;
|
|
29
|
+
resource_name: string;
|
|
30
|
+
invocation_count: number;
|
|
31
|
+
first_invoked_at: string;
|
|
32
|
+
last_invoked_at: string;
|
|
33
|
+
/** Optional Jira Issue ID for usage correlation (e.g. "PROJ-12345"). */
|
|
34
|
+
jira_id?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface SubscribedRule {
|
|
37
|
+
resource_id: string;
|
|
38
|
+
resource_name: string;
|
|
39
|
+
subscribed_at: string;
|
|
40
|
+
}
|
|
41
|
+
export interface ConfiguredMcp {
|
|
42
|
+
resource_id: string;
|
|
43
|
+
resource_name: string;
|
|
44
|
+
configured_at: string;
|
|
45
|
+
}
|
|
46
|
+
/** Per-user telemetry data stored under `users[token]`. */
|
|
47
|
+
export interface UserTelemetry {
|
|
48
|
+
last_reported_at: string | null;
|
|
49
|
+
pending_events: InvocationEvent[];
|
|
50
|
+
subscribed_rules: SubscribedRule[];
|
|
51
|
+
configured_mcps: ConfiguredMcp[];
|
|
52
|
+
}
|
|
53
|
+
/** Top-level file structure (v2: multi-user). */
|
|
54
|
+
export interface TelemetryFile {
|
|
55
|
+
client_version: string;
|
|
56
|
+
/** Map of user token → per-user telemetry data. */
|
|
57
|
+
users: Record<string, UserTelemetry>;
|
|
58
|
+
}
|
|
59
|
+
export interface TelemetryReportPayload {
|
|
60
|
+
client_version: string;
|
|
61
|
+
reported_at: string;
|
|
62
|
+
events: InvocationEvent[];
|
|
63
|
+
subscribed_rules: SubscribedRule[];
|
|
64
|
+
configured_mcps: ConfiguredMcp[];
|
|
65
|
+
}
|
|
66
|
+
export type ReportFn = (payload: TelemetryReportPayload, userToken: string) => Promise<void>;
|
|
67
|
+
export declare class TelemetryManager {
|
|
68
|
+
private filePath;
|
|
69
|
+
private clientVersion;
|
|
70
|
+
private timer;
|
|
71
|
+
private reportFn;
|
|
72
|
+
/** Tracks all tokens seen from active SSE connections for multi-user flush. */
|
|
73
|
+
private activeTokens;
|
|
74
|
+
/** Simple mutex: true while a file write is in progress. */
|
|
75
|
+
private writing;
|
|
76
|
+
private writeQueue;
|
|
77
|
+
/**
|
|
78
|
+
* @param filePath Absolute path to the telemetry JSON file.
|
|
79
|
+
* Defaults to `{CWD}/ai-resource-telemetry.json`.
|
|
80
|
+
* @param clientVersion Reported client version string.
|
|
81
|
+
*/
|
|
82
|
+
constructor(filePath?: string, clientVersion?: string);
|
|
83
|
+
/**
|
|
84
|
+
* Configure the function used to send telemetry to the server.
|
|
85
|
+
* Called during server initialisation to inject the API client without
|
|
86
|
+
* creating a circular dependency.
|
|
87
|
+
*
|
|
88
|
+
* All user tokens must arrive via setUserToken() from authenticated SSE
|
|
89
|
+
* connections — no environment variable fallback.
|
|
90
|
+
*/
|
|
91
|
+
configure(reportFn: ReportFn): void;
|
|
92
|
+
/**
|
|
93
|
+
* Register a token from a newly authenticated SSE connection.
|
|
94
|
+
*
|
|
95
|
+
* - Adds the token to the active-token set (used for multi-user flush).
|
|
96
|
+
* - Initialises the per-user slot in the file if it does not yet exist.
|
|
97
|
+
*/
|
|
98
|
+
setUserToken(token: string): void;
|
|
99
|
+
/**
|
|
100
|
+
* Record one invocation of a Command or Skill resource for a specific user.
|
|
101
|
+
*
|
|
102
|
+
* Events are aggregated by (resource_id, jira_id) key — successive calls for
|
|
103
|
+
* the same key increment the counter rather than appending duplicate entries.
|
|
104
|
+
*
|
|
105
|
+
* @param resourceId Canonical resource ID.
|
|
106
|
+
* @param resourceType 'command' | 'skill'
|
|
107
|
+
* @param resourceName Human-readable name.
|
|
108
|
+
* @param userToken Token of the user who invoked the resource.
|
|
109
|
+
* @param jiraId Optional Jira Issue ID for correlation.
|
|
110
|
+
*/
|
|
111
|
+
recordInvocation(resourceId: string, resourceType: ResourceCategory, resourceName: string, userToken: string, jiraId?: string): Promise<void>;
|
|
112
|
+
/**
|
|
113
|
+
* Replace the full list of subscribed Rules for a specific user.
|
|
114
|
+
* Called after sync_resources or manage_subscription completes.
|
|
115
|
+
*/
|
|
116
|
+
updateSubscribedRules(rules: SubscribedRule[], userToken: string): Promise<void>;
|
|
117
|
+
/**
|
|
118
|
+
* Replace the full list of configured MCPs for a specific user.
|
|
119
|
+
* Called after sync_resources or manage_subscription completes for MCP resources.
|
|
120
|
+
*/
|
|
121
|
+
updateConfiguredMcps(mcps: ConfiguredMcp[], userToken: string): Promise<void>;
|
|
122
|
+
/**
|
|
123
|
+
* Flush pending telemetry for ALL active users.
|
|
124
|
+
*
|
|
125
|
+
* Each user's data is sent with that user's own token so the server can
|
|
126
|
+
* attribute it to the correct account. The periodic timer calls this so
|
|
127
|
+
* that all connected users are reported in the same tick.
|
|
128
|
+
*/
|
|
129
|
+
flush(): Promise<void>;
|
|
130
|
+
/** Start the periodic flush timer (flushes all active users each tick). */
|
|
131
|
+
startPeriodicFlush(intervalMs?: number): void;
|
|
132
|
+
/** Stop the periodic flush timer (call before final flush on shutdown). */
|
|
133
|
+
stopPeriodicFlush(): void;
|
|
134
|
+
/**
|
|
135
|
+
* Trigger an immediate flush when a client reconnects to the MCP server.
|
|
136
|
+
* Fire-and-forget — errors are already handled inside flush().
|
|
137
|
+
*/
|
|
138
|
+
flushOnReconnect(): void;
|
|
139
|
+
/** Flush one user's pending data using that user's own token. */
|
|
140
|
+
private flushUser;
|
|
141
|
+
/** Get or create the per-user slot, mutating `data.users` in place. */
|
|
142
|
+
private ensureUserSlot;
|
|
143
|
+
private readFile;
|
|
144
|
+
private writeFile;
|
|
145
|
+
/** Serialises file access to prevent concurrent write conflicts. */
|
|
146
|
+
private withFileLock;
|
|
147
|
+
private reportWithRetry;
|
|
148
|
+
}
|
|
149
|
+
/** Singleton instance shared across the server process. */
|
|
150
|
+
export declare const telemetry: TelemetryManager;
|
|
151
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/telemetry/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* TelemetryManager: records local AI resource invocation events and periodically
|
|
4
|
+
* flushes them to the remote telemetry API.
|
|
5
|
+
*
|
|
6
|
+
* Local storage: {MCP Server CWD}/ai-resource-telemetry.json
|
|
7
|
+
*
|
|
8
|
+
* Multi-user design:
|
|
9
|
+
* - The file is keyed by user token so that data for different users is stored
|
|
10
|
+
* and reported independently. Each top-level key in the `users` map is a
|
|
11
|
+
* user token; all events, rules and MCPs belong to that token's owner.
|
|
12
|
+
* - On flush, each user's data is sent with that user's own token, so the
|
|
13
|
+
* server can attribute the telemetry to the correct account.
|
|
14
|
+
*
|
|
15
|
+
* Other design notes:
|
|
16
|
+
* - File is stored in the MCP Server's runtime working directory (not ~/.cursor/).
|
|
17
|
+
* - Atomic write-then-rename pattern prevents file corruption on concurrent
|
|
18
|
+
* writes or unexpected process termination.
|
|
19
|
+
* - Periodic flush is fire-and-forget; failures retry up to MAX_RETRIES times
|
|
20
|
+
* with exponential back-off, then silently drop — main tool flow is never blocked.
|
|
21
|
+
* - Rules cannot track individual invocations (Cursor injects them silently).
|
|
22
|
+
* We report the subscribed list as a snapshot on every flush instead.
|
|
23
|
+
* - MCPs are tracked as a configured-list snapshot only.
|
|
24
|
+
* - jira_id is an optional per-invocation annotation stored separately per key.
|
|
25
|
+
*/
|
|
26
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
27
|
+
if (k2 === undefined) k2 = k;
|
|
28
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
29
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
30
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
31
|
+
}
|
|
32
|
+
Object.defineProperty(o, k2, desc);
|
|
33
|
+
}) : (function(o, m, k, k2) {
|
|
34
|
+
if (k2 === undefined) k2 = k;
|
|
35
|
+
o[k2] = m[k];
|
|
36
|
+
}));
|
|
37
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
38
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
39
|
+
}) : function(o, v) {
|
|
40
|
+
o["default"] = v;
|
|
41
|
+
});
|
|
42
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
43
|
+
var ownKeys = function(o) {
|
|
44
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
45
|
+
var ar = [];
|
|
46
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
47
|
+
return ar;
|
|
48
|
+
};
|
|
49
|
+
return ownKeys(o);
|
|
50
|
+
};
|
|
51
|
+
return function (mod) {
|
|
52
|
+
if (mod && mod.__esModule) return mod;
|
|
53
|
+
var result = {};
|
|
54
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
55
|
+
__setModuleDefault(result, mod);
|
|
56
|
+
return result;
|
|
57
|
+
};
|
|
58
|
+
})();
|
|
59
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
60
|
+
exports.telemetry = exports.TelemetryManager = void 0;
|
|
61
|
+
const fs = __importStar(require("fs"));
|
|
62
|
+
const path = __importStar(require("path"));
|
|
63
|
+
/** Default file name placed in the MCP Server's CWD. */
|
|
64
|
+
const DEFAULT_FILE_NAME = 'ai-resource-telemetry.json';
|
|
65
|
+
const DEFAULT_VERSION = '0.1.5';
|
|
66
|
+
const MAX_RETRIES = 3;
|
|
67
|
+
const RETRY_BASE_MS = 500;
|
|
68
|
+
/** Build the aggregation key for an invocation event. */
|
|
69
|
+
function aggregationKey(resourceId, jiraId) {
|
|
70
|
+
return jiraId ? `${resourceId}|${jiraId}` : resourceId;
|
|
71
|
+
}
|
|
72
|
+
/** Return an empty per-user telemetry record. */
|
|
73
|
+
function emptyUserTelemetry() {
|
|
74
|
+
return {
|
|
75
|
+
last_reported_at: null,
|
|
76
|
+
pending_events: [],
|
|
77
|
+
subscribed_rules: [],
|
|
78
|
+
configured_mcps: [],
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
class TelemetryManager {
|
|
82
|
+
filePath;
|
|
83
|
+
clientVersion;
|
|
84
|
+
timer = null;
|
|
85
|
+
reportFn = null;
|
|
86
|
+
/** Tracks all tokens seen from active SSE connections for multi-user flush. */
|
|
87
|
+
activeTokens = new Set();
|
|
88
|
+
/** Simple mutex: true while a file write is in progress. */
|
|
89
|
+
writing = false;
|
|
90
|
+
writeQueue = [];
|
|
91
|
+
/**
|
|
92
|
+
* @param filePath Absolute path to the telemetry JSON file.
|
|
93
|
+
* Defaults to `{CWD}/ai-resource-telemetry.json`.
|
|
94
|
+
* @param clientVersion Reported client version string.
|
|
95
|
+
*/
|
|
96
|
+
constructor(filePath, clientVersion) {
|
|
97
|
+
this.filePath = filePath ?? path.join(process.cwd(), DEFAULT_FILE_NAME);
|
|
98
|
+
this.clientVersion = clientVersion ?? DEFAULT_VERSION;
|
|
99
|
+
}
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
// Public API
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
/**
|
|
104
|
+
* Configure the function used to send telemetry to the server.
|
|
105
|
+
* Called during server initialisation to inject the API client without
|
|
106
|
+
* creating a circular dependency.
|
|
107
|
+
*
|
|
108
|
+
* All user tokens must arrive via setUserToken() from authenticated SSE
|
|
109
|
+
* connections — no environment variable fallback.
|
|
110
|
+
*/
|
|
111
|
+
configure(reportFn) {
|
|
112
|
+
this.reportFn = reportFn;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Register a token from a newly authenticated SSE connection.
|
|
116
|
+
*
|
|
117
|
+
* - Adds the token to the active-token set (used for multi-user flush).
|
|
118
|
+
* - Initialises the per-user slot in the file if it does not yet exist.
|
|
119
|
+
*/
|
|
120
|
+
setUserToken(token) {
|
|
121
|
+
this.activeTokens.add(token);
|
|
122
|
+
// Ensure the user slot exists without overwriting existing data.
|
|
123
|
+
this.withFileLock(async () => {
|
|
124
|
+
const data = this.readFile();
|
|
125
|
+
if (!data.users[token]) {
|
|
126
|
+
data.users[token] = emptyUserTelemetry();
|
|
127
|
+
this.writeFile(data);
|
|
128
|
+
}
|
|
129
|
+
}).catch(() => { });
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Record one invocation of a Command or Skill resource for a specific user.
|
|
133
|
+
*
|
|
134
|
+
* Events are aggregated by (resource_id, jira_id) key — successive calls for
|
|
135
|
+
* the same key increment the counter rather than appending duplicate entries.
|
|
136
|
+
*
|
|
137
|
+
* @param resourceId Canonical resource ID.
|
|
138
|
+
* @param resourceType 'command' | 'skill'
|
|
139
|
+
* @param resourceName Human-readable name.
|
|
140
|
+
* @param userToken Token of the user who invoked the resource.
|
|
141
|
+
* @param jiraId Optional Jira Issue ID for correlation.
|
|
142
|
+
*/
|
|
143
|
+
async recordInvocation(resourceId, resourceType, resourceName, userToken, jiraId) {
|
|
144
|
+
await this.withFileLock(async () => {
|
|
145
|
+
const data = this.readFile();
|
|
146
|
+
const user = this.ensureUserSlot(data, userToken);
|
|
147
|
+
const now = new Date().toISOString();
|
|
148
|
+
const key = aggregationKey(resourceId, jiraId);
|
|
149
|
+
const existing = user.pending_events.find((e) => aggregationKey(e.resource_id, e.jira_id) === key);
|
|
150
|
+
if (existing) {
|
|
151
|
+
existing.invocation_count += 1;
|
|
152
|
+
existing.last_invoked_at = now;
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
const event = {
|
|
156
|
+
resource_id: resourceId,
|
|
157
|
+
resource_type: resourceType,
|
|
158
|
+
resource_name: resourceName,
|
|
159
|
+
invocation_count: 1,
|
|
160
|
+
first_invoked_at: now,
|
|
161
|
+
last_invoked_at: now,
|
|
162
|
+
};
|
|
163
|
+
// Only attach jira_id when defined (field must be absent, not null).
|
|
164
|
+
if (jiraId)
|
|
165
|
+
event.jira_id = jiraId;
|
|
166
|
+
user.pending_events.push(event);
|
|
167
|
+
}
|
|
168
|
+
this.writeFile(data);
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Replace the full list of subscribed Rules for a specific user.
|
|
173
|
+
* Called after sync_resources or manage_subscription completes.
|
|
174
|
+
*/
|
|
175
|
+
async updateSubscribedRules(rules, userToken) {
|
|
176
|
+
await this.withFileLock(async () => {
|
|
177
|
+
const data = this.readFile();
|
|
178
|
+
this.ensureUserSlot(data, userToken).subscribed_rules = rules;
|
|
179
|
+
this.writeFile(data);
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Replace the full list of configured MCPs for a specific user.
|
|
184
|
+
* Called after sync_resources or manage_subscription completes for MCP resources.
|
|
185
|
+
*/
|
|
186
|
+
async updateConfiguredMcps(mcps, userToken) {
|
|
187
|
+
await this.withFileLock(async () => {
|
|
188
|
+
const data = this.readFile();
|
|
189
|
+
this.ensureUserSlot(data, userToken).configured_mcps = mcps;
|
|
190
|
+
this.writeFile(data);
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Flush pending telemetry for ALL active users.
|
|
195
|
+
*
|
|
196
|
+
* Each user's data is sent with that user's own token so the server can
|
|
197
|
+
* attribute it to the correct account. The periodic timer calls this so
|
|
198
|
+
* that all connected users are reported in the same tick.
|
|
199
|
+
*/
|
|
200
|
+
async flush() {
|
|
201
|
+
if (!this.reportFn)
|
|
202
|
+
return;
|
|
203
|
+
// Only flush tokens from authenticated SSE connections.
|
|
204
|
+
// No environment variable fallback — tokens must arrive via setUserToken().
|
|
205
|
+
const tokens = new Set(this.activeTokens);
|
|
206
|
+
if (tokens.size === 0)
|
|
207
|
+
return;
|
|
208
|
+
const data = await new Promise((resolve) => {
|
|
209
|
+
this.withFileLock(async () => {
|
|
210
|
+
resolve(this.readFile());
|
|
211
|
+
}).catch(() => resolve(this.readFile()));
|
|
212
|
+
});
|
|
213
|
+
await Promise.all(Array.from(tokens).map((token) => this.flushUser(token, data)));
|
|
214
|
+
}
|
|
215
|
+
/** Start the periodic flush timer (flushes all active users each tick). */
|
|
216
|
+
startPeriodicFlush(intervalMs = 10_000) {
|
|
217
|
+
if (this.timer)
|
|
218
|
+
return;
|
|
219
|
+
this.timer = setInterval(() => {
|
|
220
|
+
this.flush().catch(() => { });
|
|
221
|
+
}, intervalMs);
|
|
222
|
+
if (this.timer.unref)
|
|
223
|
+
this.timer.unref();
|
|
224
|
+
}
|
|
225
|
+
/** Stop the periodic flush timer (call before final flush on shutdown). */
|
|
226
|
+
stopPeriodicFlush() {
|
|
227
|
+
if (this.timer) {
|
|
228
|
+
clearInterval(this.timer);
|
|
229
|
+
this.timer = null;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Trigger an immediate flush when a client reconnects to the MCP server.
|
|
234
|
+
* Fire-and-forget — errors are already handled inside flush().
|
|
235
|
+
*/
|
|
236
|
+
flushOnReconnect() {
|
|
237
|
+
this.flush().catch(() => { });
|
|
238
|
+
}
|
|
239
|
+
// ---------------------------------------------------------------------------
|
|
240
|
+
// Private helpers
|
|
241
|
+
// ---------------------------------------------------------------------------
|
|
242
|
+
/** Flush one user's pending data using that user's own token. */
|
|
243
|
+
async flushUser(token, data) {
|
|
244
|
+
if (!this.reportFn)
|
|
245
|
+
return;
|
|
246
|
+
const user = data.users[token];
|
|
247
|
+
if (!user)
|
|
248
|
+
return;
|
|
249
|
+
const payload = {
|
|
250
|
+
client_version: this.clientVersion,
|
|
251
|
+
reported_at: new Date().toISOString(),
|
|
252
|
+
events: user.pending_events,
|
|
253
|
+
subscribed_rules: user.subscribed_rules,
|
|
254
|
+
configured_mcps: user.configured_mcps,
|
|
255
|
+
};
|
|
256
|
+
await this.reportWithRetry(payload, token);
|
|
257
|
+
}
|
|
258
|
+
/** Get or create the per-user slot, mutating `data.users` in place. */
|
|
259
|
+
ensureUserSlot(data, token) {
|
|
260
|
+
if (!data.users[token]) {
|
|
261
|
+
data.users[token] = emptyUserTelemetry();
|
|
262
|
+
}
|
|
263
|
+
return data.users[token];
|
|
264
|
+
}
|
|
265
|
+
readFile() {
|
|
266
|
+
try {
|
|
267
|
+
const raw = fs.readFileSync(this.filePath, 'utf8');
|
|
268
|
+
const parsed = JSON.parse(raw);
|
|
269
|
+
// Migrate v1 flat file to v2 multi-user structure.
|
|
270
|
+
// We cannot recover the original token, so v1 data is discarded.
|
|
271
|
+
if (!parsed.users) {
|
|
272
|
+
return { client_version: this.clientVersion, users: {} };
|
|
273
|
+
}
|
|
274
|
+
return {
|
|
275
|
+
client_version: parsed.client_version ?? this.clientVersion,
|
|
276
|
+
users: parsed.users,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
return { client_version: this.clientVersion, users: {} };
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
writeFile(data) {
|
|
284
|
+
const dir = path.dirname(this.filePath);
|
|
285
|
+
if (!fs.existsSync(dir))
|
|
286
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
287
|
+
const tmp = `${this.filePath}.${process.pid}.tmp`;
|
|
288
|
+
fs.writeFileSync(tmp, JSON.stringify(data, null, 2), 'utf8');
|
|
289
|
+
fs.renameSync(tmp, this.filePath);
|
|
290
|
+
}
|
|
291
|
+
/** Serialises file access to prevent concurrent write conflicts. */
|
|
292
|
+
async withFileLock(fn) {
|
|
293
|
+
return new Promise((resolve, reject) => {
|
|
294
|
+
const run = async () => {
|
|
295
|
+
this.writing = true;
|
|
296
|
+
try {
|
|
297
|
+
await fn();
|
|
298
|
+
resolve();
|
|
299
|
+
}
|
|
300
|
+
catch (err) {
|
|
301
|
+
reject(err);
|
|
302
|
+
}
|
|
303
|
+
finally {
|
|
304
|
+
this.writing = false;
|
|
305
|
+
const next = this.writeQueue.shift();
|
|
306
|
+
if (next)
|
|
307
|
+
next();
|
|
308
|
+
}
|
|
309
|
+
};
|
|
310
|
+
if (this.writing) {
|
|
311
|
+
this.writeQueue.push(run);
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
run();
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
async reportWithRetry(payload, token) {
|
|
319
|
+
let lastErr;
|
|
320
|
+
for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
|
|
321
|
+
try {
|
|
322
|
+
await this.reportFn(payload, token);
|
|
323
|
+
// Success — subtract only the events that were included in this payload.
|
|
324
|
+
// New events may have been appended to the file between the time we read
|
|
325
|
+
// the snapshot and now, so we must NOT blindly wipe pending_events=[].
|
|
326
|
+
// Instead, re-read the file under lock and decrement each reported
|
|
327
|
+
// event's invocation_count; remove it only when the count reaches zero.
|
|
328
|
+
await this.withFileLock(async () => {
|
|
329
|
+
const data = this.readFile();
|
|
330
|
+
const user = data.users[token];
|
|
331
|
+
if (!user)
|
|
332
|
+
return;
|
|
333
|
+
for (const reported of payload.events) {
|
|
334
|
+
const key = aggregationKey(reported.resource_id, reported.jira_id);
|
|
335
|
+
const idx = user.pending_events.findIndex((e) => aggregationKey(e.resource_id, e.jira_id) === key);
|
|
336
|
+
if (idx === -1)
|
|
337
|
+
continue;
|
|
338
|
+
const live = user.pending_events[idx];
|
|
339
|
+
live.invocation_count -= reported.invocation_count;
|
|
340
|
+
if (live.invocation_count <= 0) {
|
|
341
|
+
user.pending_events.splice(idx, 1);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
user.last_reported_at = payload.reported_at;
|
|
345
|
+
this.writeFile(data);
|
|
346
|
+
});
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
catch (err) {
|
|
350
|
+
lastErr = err;
|
|
351
|
+
if (attempt < MAX_RETRIES - 1) {
|
|
352
|
+
await sleep(RETRY_BASE_MS * Math.pow(2, attempt));
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
357
|
+
process.stderr.write(`[telemetry] flush failed after ${MAX_RETRIES} retries: ${lastErr}\n`);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
exports.TelemetryManager = TelemetryManager;
|
|
362
|
+
function sleep(ms) {
|
|
363
|
+
return new Promise((res) => setTimeout(res, ms));
|
|
364
|
+
}
|
|
365
|
+
/** Singleton instance shared across the server process. */
|
|
366
|
+
exports.telemetry = new TelemetryManager();
|
|
367
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/telemetry/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tools Index
|
|
3
|
+
* Exports all MCP tools
|
|
4
|
+
*/
|
|
5
|
+
export * from './sync-resources';
|
|
6
|
+
export * from './manage-subscription';
|
|
7
|
+
export * from './search-resources';
|
|
8
|
+
export * from './upload-resource';
|
|
9
|
+
export * from './uninstall-resource';
|
|
10
|
+
export * from './track-usage';
|
|
11
|
+
export * from './resolve-prompt-content';
|
|
12
|
+
export * from './registry';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,0BAA0B,CAAC;AACzC,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tools Index
|
|
4
|
+
* Exports all MCP tools
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
18
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
19
|
+
};
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
__exportStar(require("./sync-resources"), exports);
|
|
22
|
+
__exportStar(require("./manage-subscription"), exports);
|
|
23
|
+
__exportStar(require("./search-resources"), exports);
|
|
24
|
+
__exportStar(require("./upload-resource"), exports);
|
|
25
|
+
__exportStar(require("./uninstall-resource"), exports);
|
|
26
|
+
__exportStar(require("./track-usage"), exports);
|
|
27
|
+
__exportStar(require("./resolve-prompt-content"), exports);
|
|
28
|
+
__exportStar(require("./registry"), exports);
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;AAEH,mDAAiC;AACjC,wDAAsC;AACtC,qDAAmC;AACnC,oDAAkC;AAClC,uDAAqC;AACrC,gDAA8B;AAC9B,2DAAyC;AACzC,6CAA2B"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* manage_subscription Tool
|
|
3
|
+
* Manage resource subscriptions
|
|
4
|
+
*/
|
|
5
|
+
import type { ManageSubscriptionResult, ToolResult } from '../types/tools';
|
|
6
|
+
export declare function manageSubscription(params: unknown): Promise<ToolResult<ManageSubscriptionResult>>;
|
|
7
|
+
export declare const manageSubscriptionTool: {
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
inputSchema: {
|
|
11
|
+
type: "object";
|
|
12
|
+
properties: {
|
|
13
|
+
action: {
|
|
14
|
+
type: string;
|
|
15
|
+
description: string;
|
|
16
|
+
enum: string[];
|
|
17
|
+
};
|
|
18
|
+
resource_ids: {
|
|
19
|
+
type: string;
|
|
20
|
+
description: string;
|
|
21
|
+
};
|
|
22
|
+
auto_sync: {
|
|
23
|
+
type: string;
|
|
24
|
+
description: string;
|
|
25
|
+
default: boolean;
|
|
26
|
+
};
|
|
27
|
+
scope: {
|
|
28
|
+
type: string;
|
|
29
|
+
description: string;
|
|
30
|
+
enum: string[];
|
|
31
|
+
default: string;
|
|
32
|
+
};
|
|
33
|
+
notify: {
|
|
34
|
+
type: string;
|
|
35
|
+
description: string;
|
|
36
|
+
default: boolean;
|
|
37
|
+
};
|
|
38
|
+
user_token: {
|
|
39
|
+
type: string;
|
|
40
|
+
description: string;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
required: string[];
|
|
44
|
+
};
|
|
45
|
+
handler: typeof manageSubscription;
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=manage-subscription.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manage-subscription.d.ts","sourceRoot":"","sources":["../../src/tools/manage-subscription.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAA4B,wBAAwB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAKrG,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,wBAAwB,CAAC,CAAC,CAgUvG;AAGD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmDlC,CAAC"}
|