@vibescope/mcp-server 0.2.5 → 0.2.6
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/CHANGELOG.md +84 -84
- package/README.md +194 -194
- package/dist/cli.js +26 -26
- package/dist/handlers/tool-docs.js +828 -828
- package/dist/index.js +73 -73
- package/dist/templates/agent-guidelines.js +185 -185
- package/dist/token-tracking.js +4 -2
- package/dist/tools.js +65 -65
- package/dist/utils.js +11 -11
- package/docs/TOOLS.md +2053 -2053
- package/package.json +1 -1
- package/scripts/generate-docs.ts +212 -212
- package/scripts/version-bump.ts +203 -203
- package/src/api-client.test.ts +723 -723
- package/src/api-client.ts +2499 -2499
- package/src/cli.ts +212 -212
- package/src/handlers/__test-setup__.ts +236 -236
- package/src/handlers/__test-utils__.ts +87 -87
- package/src/handlers/blockers.test.ts +468 -468
- package/src/handlers/blockers.ts +163 -163
- package/src/handlers/bodies-of-work.test.ts +704 -704
- package/src/handlers/bodies-of-work.ts +526 -526
- package/src/handlers/connectors.test.ts +834 -834
- package/src/handlers/connectors.ts +229 -229
- package/src/handlers/cost.test.ts +462 -462
- package/src/handlers/cost.ts +285 -285
- package/src/handlers/decisions.test.ts +382 -382
- package/src/handlers/decisions.ts +153 -153
- package/src/handlers/deployment.test.ts +551 -551
- package/src/handlers/deployment.ts +541 -541
- package/src/handlers/discovery.test.ts +206 -206
- package/src/handlers/discovery.ts +390 -390
- package/src/handlers/fallback.test.ts +537 -537
- package/src/handlers/fallback.ts +194 -194
- package/src/handlers/file-checkouts.test.ts +750 -750
- package/src/handlers/file-checkouts.ts +185 -185
- package/src/handlers/findings.test.ts +633 -633
- package/src/handlers/findings.ts +239 -239
- package/src/handlers/git-issues.test.ts +631 -631
- package/src/handlers/git-issues.ts +136 -136
- package/src/handlers/ideas.test.ts +644 -644
- package/src/handlers/ideas.ts +207 -207
- package/src/handlers/index.ts +84 -84
- package/src/handlers/milestones.test.ts +475 -475
- package/src/handlers/milestones.ts +180 -180
- package/src/handlers/organizations.test.ts +826 -826
- package/src/handlers/organizations.ts +315 -315
- package/src/handlers/progress.test.ts +269 -269
- package/src/handlers/progress.ts +77 -77
- package/src/handlers/project.test.ts +546 -546
- package/src/handlers/project.ts +239 -239
- package/src/handlers/requests.test.ts +303 -303
- package/src/handlers/requests.ts +99 -99
- package/src/handlers/roles.test.ts +303 -303
- package/src/handlers/roles.ts +226 -226
- package/src/handlers/session.test.ts +875 -875
- package/src/handlers/session.ts +738 -738
- package/src/handlers/sprints.test.ts +732 -732
- package/src/handlers/sprints.ts +537 -537
- package/src/handlers/tasks.test.ts +907 -907
- package/src/handlers/tasks.ts +945 -945
- package/src/handlers/tool-categories.test.ts +66 -66
- package/src/handlers/tool-docs.ts +1096 -1096
- package/src/handlers/types.test.ts +259 -259
- package/src/handlers/types.ts +175 -175
- package/src/handlers/validation.test.ts +582 -582
- package/src/handlers/validation.ts +97 -97
- package/src/index.ts +792 -792
- package/src/setup.test.ts +233 -231
- package/src/setup.ts +370 -370
- package/src/templates/agent-guidelines.ts +210 -210
- package/src/token-tracking.test.ts +463 -453
- package/src/token-tracking.ts +166 -164
- package/src/tools.ts +3562 -3562
- package/src/utils.test.ts +683 -683
- package/src/utils.ts +436 -436
- package/src/validators.test.ts +223 -223
- package/src/validators.ts +249 -249
- package/tsconfig.json +16 -16
- package/vitest.config.ts +14 -14
- package/dist/knowledge.d.ts +0 -6
- package/dist/knowledge.js +0 -218
package/src/token-tracking.ts
CHANGED
|
@@ -1,164 +1,166 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Token Tracking Utilities
|
|
3
|
-
*
|
|
4
|
-
* Functions for estimating and tracking token usage across MCP tool calls.
|
|
5
|
-
* Extracted from index.ts to enable unit testing.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
// ============================================================================
|
|
9
|
-
// Types
|
|
10
|
-
// ============================================================================
|
|
11
|
-
|
|
12
|
-
export interface ModelTokens {
|
|
13
|
-
input: number;
|
|
14
|
-
output: number;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export interface TokenUsage {
|
|
18
|
-
callCount: number;
|
|
19
|
-
totalTokens: number;
|
|
20
|
-
byTool: Record<string, { calls: number; tokens: number }>;
|
|
21
|
-
byModel: Record<string, ModelTokens>;
|
|
22
|
-
currentModel: string | null;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// ============================================================================
|
|
26
|
-
// Token Estimation
|
|
27
|
-
// ============================================================================
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Estimate tokens from a JSON-serializable object.
|
|
31
|
-
* Uses a rough heuristic of ~4 characters per token.
|
|
32
|
-
*
|
|
33
|
-
* @param obj - Any JSON-serializable object
|
|
34
|
-
* @returns Estimated token count (always >= 1)
|
|
35
|
-
*/
|
|
36
|
-
export function estimateTokens(obj: unknown): number {
|
|
37
|
-
try {
|
|
38
|
-
const json = JSON.stringify(obj);
|
|
39
|
-
return Math.max(1, Math.ceil(json.length / 4));
|
|
40
|
-
} catch {
|
|
41
|
-
//
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
// ============================================================================
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* @param
|
|
70
|
-
* @param
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
if
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
*
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
*
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
usage.
|
|
122
|
-
usage.
|
|
123
|
-
usage.
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
*
|
|
130
|
-
*
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Token Tracking Utilities
|
|
3
|
+
*
|
|
4
|
+
* Functions for estimating and tracking token usage across MCP tool calls.
|
|
5
|
+
* Extracted from index.ts to enable unit testing.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Types
|
|
10
|
+
// ============================================================================
|
|
11
|
+
|
|
12
|
+
export interface ModelTokens {
|
|
13
|
+
input: number;
|
|
14
|
+
output: number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface TokenUsage {
|
|
18
|
+
callCount: number;
|
|
19
|
+
totalTokens: number;
|
|
20
|
+
byTool: Record<string, { calls: number; tokens: number }>;
|
|
21
|
+
byModel: Record<string, ModelTokens>;
|
|
22
|
+
currentModel: string | null;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// ============================================================================
|
|
26
|
+
// Token Estimation
|
|
27
|
+
// ============================================================================
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Estimate tokens from a JSON-serializable object.
|
|
31
|
+
* Uses a rough heuristic of ~4 characters per token.
|
|
32
|
+
*
|
|
33
|
+
* @param obj - Any JSON-serializable object
|
|
34
|
+
* @returns Estimated token count (always >= 1)
|
|
35
|
+
*/
|
|
36
|
+
export function estimateTokens(obj: unknown): number {
|
|
37
|
+
try {
|
|
38
|
+
const json = JSON.stringify(obj);
|
|
39
|
+
return Math.max(1, Math.ceil(json.length / 4));
|
|
40
|
+
} catch (error) {
|
|
41
|
+
// Log warning when serialization fails (e.g., circular references, BigInt)
|
|
42
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
43
|
+
console.warn(`[Vibescope] Token estimation failed: ${errorMessage}. Returning minimal estimate of 1 token.`);
|
|
44
|
+
return 1;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// ============================================================================
|
|
49
|
+
// Token Usage Tracking
|
|
50
|
+
// ============================================================================
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Create a fresh token usage tracker.
|
|
54
|
+
*/
|
|
55
|
+
export function createTokenUsage(): TokenUsage {
|
|
56
|
+
return {
|
|
57
|
+
callCount: 0,
|
|
58
|
+
totalTokens: 0,
|
|
59
|
+
byTool: {},
|
|
60
|
+
byModel: {},
|
|
61
|
+
currentModel: null,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Track token usage for a tool call.
|
|
67
|
+
* Updates the usage object in-place with input/output token estimates.
|
|
68
|
+
*
|
|
69
|
+
* @param usage - The token usage object to update
|
|
70
|
+
* @param toolName - Name of the tool being called
|
|
71
|
+
* @param args - Input arguments to the tool
|
|
72
|
+
* @param response - Response from the tool
|
|
73
|
+
*/
|
|
74
|
+
export function trackTokenUsage(
|
|
75
|
+
usage: TokenUsage,
|
|
76
|
+
toolName: string,
|
|
77
|
+
args: unknown,
|
|
78
|
+
response: unknown
|
|
79
|
+
): void {
|
|
80
|
+
const inputTokens = estimateTokens(args);
|
|
81
|
+
const outputTokens = estimateTokens(response);
|
|
82
|
+
const totalTokens = inputTokens + outputTokens;
|
|
83
|
+
|
|
84
|
+
usage.callCount++;
|
|
85
|
+
usage.totalTokens += totalTokens;
|
|
86
|
+
|
|
87
|
+
if (!usage.byTool[toolName]) {
|
|
88
|
+
usage.byTool[toolName] = { calls: 0, tokens: 0 };
|
|
89
|
+
}
|
|
90
|
+
usage.byTool[toolName].calls++;
|
|
91
|
+
usage.byTool[toolName].tokens += totalTokens;
|
|
92
|
+
|
|
93
|
+
// Track by model if a model is set
|
|
94
|
+
const model = usage.currentModel;
|
|
95
|
+
if (model) {
|
|
96
|
+
if (!usage.byModel[model]) {
|
|
97
|
+
usage.byModel[model] = { input: 0, output: 0 };
|
|
98
|
+
}
|
|
99
|
+
usage.byModel[model].input += inputTokens;
|
|
100
|
+
usage.byModel[model].output += outputTokens;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Set the current model for token tracking.
|
|
106
|
+
* Subsequent calls to trackTokenUsage will be attributed to this model.
|
|
107
|
+
*
|
|
108
|
+
* @param usage - The token usage object to update
|
|
109
|
+
* @param model - Model name (e.g., "opus", "sonnet", "haiku")
|
|
110
|
+
*/
|
|
111
|
+
export function setCurrentModel(usage: TokenUsage, model: string | null): void {
|
|
112
|
+
usage.currentModel = model;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Reset token usage tracking to initial state.
|
|
117
|
+
*
|
|
118
|
+
* @param usage - The token usage object to reset
|
|
119
|
+
*/
|
|
120
|
+
export function resetTokenUsage(usage: TokenUsage): void {
|
|
121
|
+
usage.callCount = 0;
|
|
122
|
+
usage.totalTokens = 0;
|
|
123
|
+
usage.byTool = {};
|
|
124
|
+
usage.byModel = {};
|
|
125
|
+
usage.currentModel = null;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Get a summary of token usage for reporting.
|
|
130
|
+
*
|
|
131
|
+
* @param usage - The token usage object
|
|
132
|
+
* @returns Summary object with stats
|
|
133
|
+
*/
|
|
134
|
+
export function getTokenUsageSummary(usage: TokenUsage): {
|
|
135
|
+
total_calls: number;
|
|
136
|
+
total_tokens: number;
|
|
137
|
+
average_tokens_per_call: number;
|
|
138
|
+
by_tool: Record<string, { calls: number; tokens: number; avg: number }>;
|
|
139
|
+
by_model: Record<string, ModelTokens>;
|
|
140
|
+
current_model: string | null;
|
|
141
|
+
} {
|
|
142
|
+
const byTool: Record<string, { calls: number; tokens: number; avg: number }> = {};
|
|
143
|
+
|
|
144
|
+
for (const [tool, stats] of Object.entries(usage.byTool)) {
|
|
145
|
+
byTool[tool] = {
|
|
146
|
+
calls: stats.calls,
|
|
147
|
+
tokens: stats.tokens,
|
|
148
|
+
avg: stats.calls > 0 ? Math.round(stats.tokens / stats.calls) : 0,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Deep copy byModel to prevent mutation
|
|
153
|
+
const byModel: Record<string, ModelTokens> = {};
|
|
154
|
+
for (const [model, tokens] of Object.entries(usage.byModel)) {
|
|
155
|
+
byModel[model] = { input: tokens.input, output: tokens.output };
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return {
|
|
159
|
+
total_calls: usage.callCount,
|
|
160
|
+
total_tokens: usage.totalTokens,
|
|
161
|
+
average_tokens_per_call: usage.callCount > 0 ? Math.round(usage.totalTokens / usage.callCount) : 0,
|
|
162
|
+
by_tool: byTool,
|
|
163
|
+
by_model: byModel,
|
|
164
|
+
current_model: usage.currentModel,
|
|
165
|
+
};
|
|
166
|
+
}
|