@vibescope/mcp-server 0.4.4 → 0.4.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/api-client/bodies-of-work.d.ts +125 -0
- package/dist/api-client/bodies-of-work.js +78 -0
- package/dist/api-client/chat.d.ts +26 -0
- package/dist/api-client/chat.js +20 -0
- package/dist/api-client/connectors.d.ts +104 -0
- package/dist/api-client/connectors.js +46 -0
- package/dist/api-client/deployment.d.ts +190 -0
- package/dist/api-client/deployment.js +113 -0
- package/dist/api-client/file-checkouts.d.ts +71 -0
- package/dist/api-client/file-checkouts.js +43 -0
- package/dist/api-client/git-issues.d.ts +55 -0
- package/dist/api-client/git-issues.js +34 -0
- package/dist/api-client/index.d.ts +619 -1
- package/dist/api-client/index.js +148 -0
- package/dist/api-client/organizations.d.ts +101 -0
- package/dist/api-client/organizations.js +86 -0
- package/dist/api-client/progress.d.ts +61 -0
- package/dist/api-client/progress.js +34 -0
- package/dist/api-client/project.d.ts +1 -0
- package/dist/api-client/requests.d.ts +28 -0
- package/dist/api-client/requests.js +28 -0
- package/dist/api-client/sprints.d.ts +153 -0
- package/dist/api-client/sprints.js +82 -0
- package/dist/api-client/subtasks.d.ts +37 -0
- package/dist/api-client/subtasks.js +23 -0
- package/dist/api-client.d.ts +23 -0
- package/dist/api-client.js +15 -0
- package/dist/cli-init.js +21 -21
- package/dist/cli.js +26 -26
- package/dist/handlers/blockers.js +4 -0
- package/dist/handlers/chat.d.ts +23 -0
- package/dist/handlers/chat.js +84 -0
- package/dist/handlers/deployment.d.ts +3 -0
- package/dist/handlers/deployment.js +23 -0
- package/dist/handlers/discovery.js +13 -0
- package/dist/handlers/index.d.ts +1 -0
- package/dist/handlers/index.js +3 -0
- package/dist/handlers/project.js +4 -2
- package/dist/handlers/session.js +7 -0
- package/dist/handlers/tasks.js +7 -0
- package/dist/handlers/tool-docs.js +1204 -1131
- package/dist/index.js +73 -73
- package/dist/templates/agent-guidelines.d.ts +1 -1
- package/dist/templates/agent-guidelines.js +205 -187
- package/dist/templates/help-content.js +1621 -1621
- package/dist/tools/bodies-of-work.js +6 -6
- package/dist/tools/chat.d.ts +1 -0
- package/dist/tools/chat.js +24 -0
- package/dist/tools/cloud-agents.js +22 -22
- package/dist/tools/deployment.js +13 -0
- package/dist/tools/features.d.ts +13 -0
- package/dist/tools/features.js +151 -0
- package/dist/tools/index.d.ts +3 -1
- package/dist/tools/index.js +4 -1
- package/dist/tools/milestones.js +2 -2
- package/dist/tools/project.js +4 -0
- package/dist/tools/requests.js +1 -1
- package/dist/tools/session.js +11 -11
- package/dist/tools/sprints.js +9 -9
- package/dist/tools/tasks.js +35 -35
- package/dist/tools/worktrees.js +14 -14
- package/dist/tools.d.ts +2 -0
- package/dist/tools.js +3602 -0
- package/dist/utils.js +11 -11
- package/docs/TOOLS.md +2663 -2545
- package/package.json +53 -53
- package/scripts/generate-docs.ts +212 -212
- package/scripts/version-bump.ts +203 -203
- package/src/api-client/blockers.ts +86 -86
- package/src/api-client/bodies-of-work.ts +194 -0
- package/src/api-client/chat.ts +50 -0
- package/src/api-client/connectors.ts +152 -0
- package/src/api-client/cost.ts +185 -185
- package/src/api-client/decisions.ts +87 -87
- package/src/api-client/deployment.ts +313 -0
- package/src/api-client/discovery.ts +81 -81
- package/src/api-client/fallback.ts +52 -52
- package/src/api-client/file-checkouts.ts +115 -0
- package/src/api-client/findings.ts +100 -100
- package/src/api-client/git-issues.ts +88 -0
- package/src/api-client/ideas.ts +112 -112
- package/src/api-client/index.ts +592 -426
- package/src/api-client/milestones.ts +83 -83
- package/src/api-client/organizations.ts +185 -0
- package/src/api-client/progress.ts +94 -0
- package/src/api-client/project.ts +180 -179
- package/src/api-client/requests.ts +54 -0
- package/src/api-client/session.ts +220 -220
- package/src/api-client/sprints.ts +227 -0
- package/src/api-client/subtasks.ts +57 -0
- package/src/api-client/tasks.ts +450 -450
- package/src/api-client/types.ts +32 -32
- package/src/api-client/validation.ts +60 -60
- package/src/api-client/worktrees.ts +53 -53
- package/src/api-client.test.ts +847 -850
- package/src/api-client.ts +2707 -2672
- package/src/cli-init.ts +557 -557
- package/src/cli.test.ts +284 -284
- package/src/cli.ts +204 -204
- package/src/handlers/__test-setup__.ts +240 -236
- package/src/handlers/__test-utils__.ts +89 -89
- package/src/handlers/blockers.test.ts +468 -468
- package/src/handlers/blockers.ts +172 -163
- package/src/handlers/bodies-of-work.test.ts +704 -704
- package/src/handlers/bodies-of-work.ts +526 -526
- package/src/handlers/chat.test.ts +185 -0
- package/src/handlers/chat.ts +101 -0
- package/src/handlers/cloud-agents.test.ts +438 -438
- package/src/handlers/cloud-agents.ts +156 -156
- 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 +570 -541
- package/src/handlers/discovery.test.ts +206 -206
- package/src/handlers/discovery.ts +427 -414
- 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 +93 -90
- 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 +242 -239
- package/src/handlers/requests.test.ts +303 -303
- package/src/handlers/requests.ts +99 -99
- package/src/handlers/roles.test.ts +305 -305
- package/src/handlers/roles.ts +219 -219
- package/src/handlers/session.test.ts +998 -998
- package/src/handlers/session.ts +1105 -1093
- package/src/handlers/sprints.test.ts +732 -732
- package/src/handlers/sprints.ts +537 -537
- package/src/handlers/tasks.test.ts +931 -931
- package/src/handlers/tasks.ts +1133 -1121
- package/src/handlers/tool-categories.test.ts +66 -66
- package/src/handlers/tool-docs.test.ts +511 -511
- package/src/handlers/tool-docs.ts +1571 -1491
- package/src/handlers/types.test.ts +259 -259
- package/src/handlers/types.ts +176 -176
- package/src/handlers/validation.test.ts +582 -582
- package/src/handlers/validation.ts +164 -164
- package/src/handlers/version.ts +63 -63
- package/src/index.test.ts +674 -674
- package/src/index.ts +807 -807
- package/src/setup.test.ts +233 -233
- package/src/setup.ts +404 -404
- package/src/templates/agent-guidelines.ts +233 -215
- package/src/templates/help-content.ts +1751 -1751
- package/src/token-tracking.test.ts +463 -463
- package/src/token-tracking.ts +167 -167
- package/src/tools/blockers.ts +122 -122
- package/src/tools/bodies-of-work.ts +283 -283
- package/src/tools/chat.ts +72 -46
- package/src/tools/cloud-agents.ts +101 -101
- package/src/tools/connectors.ts +191 -191
- package/src/tools/cost.ts +111 -111
- package/src/tools/decisions.ts +111 -111
- package/src/tools/deployment.ts +455 -442
- package/src/tools/discovery.ts +76 -76
- package/src/tools/fallback.ts +111 -111
- package/src/tools/features.ts +154 -0
- package/src/tools/file-checkouts.ts +145 -145
- package/src/tools/findings.ts +101 -101
- package/src/tools/git-issues.ts +130 -130
- package/src/tools/ideas.ts +162 -162
- package/src/tools/index.ts +141 -137
- package/src/tools/milestones.ts +118 -118
- package/src/tools/organizations.ts +224 -224
- package/src/tools/progress.ts +73 -73
- package/src/tools/project.ts +206 -202
- package/src/tools/requests.ts +68 -68
- package/src/tools/roles.ts +112 -112
- package/src/tools/session.ts +181 -181
- package/src/tools/sprints.ts +298 -298
- package/src/tools/tasks.ts +550 -550
- package/src/tools/tools.test.ts +222 -222
- package/src/tools/types.ts +9 -9
- package/src/tools/validation.ts +75 -75
- package/src/tools/version.ts +34 -34
- package/src/tools/worktrees.ts +66 -66
- package/src/tools.test.ts +416 -416
- package/src/utils.test.ts +1014 -1014
- package/src/utils.ts +586 -586
- package/src/validators.test.ts +223 -223
- package/src/validators.ts +249 -249
- package/src/version.ts +109 -109
- package/tsconfig.json +16 -16
- package/vitest.config.ts +14 -14
package/src/handlers/types.ts
CHANGED
|
@@ -1,176 +1,176 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Authentication context from API key validation
|
|
3
|
-
*/
|
|
4
|
-
export interface AuthContext {
|
|
5
|
-
userId: string;
|
|
6
|
-
apiKeyId: string;
|
|
7
|
-
organizationId?: string;
|
|
8
|
-
scope: 'personal' | 'organization';
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Model-specific token tracking
|
|
13
|
-
*/
|
|
14
|
-
export interface ModelTokens {
|
|
15
|
-
input: number;
|
|
16
|
-
output: number;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Token usage tracking for the session
|
|
21
|
-
*/
|
|
22
|
-
export interface TokenUsage {
|
|
23
|
-
callCount: number;
|
|
24
|
-
totalTokens: number;
|
|
25
|
-
byTool: Record<string, { calls: number; tokens: number }>;
|
|
26
|
-
byModel: Record<string, ModelTokens>;
|
|
27
|
-
currentModel: string | null; // 'opus' | 'sonnet' | 'haiku' | null
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Agent role for specialized work routing
|
|
32
|
-
* - developer: General development work, picks up any available task (default)
|
|
33
|
-
* - validator: Focuses on validating completed tasks
|
|
34
|
-
* - deployer: Handles deployment coordination and monitoring
|
|
35
|
-
* - reviewer: Code review and quality checks
|
|
36
|
-
* - maintainer: Task management, git orchestration, housekeeping
|
|
37
|
-
*/
|
|
38
|
-
export type AgentRole = 'developer' | 'validator' | 'deployer' | 'reviewer' | 'maintainer';
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Session state that persists across tool calls
|
|
42
|
-
*/
|
|
43
|
-
export interface SessionState {
|
|
44
|
-
instanceId: string;
|
|
45
|
-
currentSessionId: string | null;
|
|
46
|
-
currentPersona: string | null;
|
|
47
|
-
currentRole: AgentRole | null;
|
|
48
|
-
currentProjectId: string | null;
|
|
49
|
-
tokenUsage: TokenUsage;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* User updates since last sync (for start_work_session full mode)
|
|
54
|
-
*/
|
|
55
|
-
export interface UserUpdates {
|
|
56
|
-
tasks?: Array<{ id: string; title: string; created_at: string }>;
|
|
57
|
-
blockers?: Array<{ id: string; description: string; created_at: string }>;
|
|
58
|
-
ideas?: Array<{ id: string; title: string; created_at: string }>;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Context passed to all handlers
|
|
63
|
-
*/
|
|
64
|
-
export interface HandlerContext {
|
|
65
|
-
auth: AuthContext;
|
|
66
|
-
session: SessionState;
|
|
67
|
-
/** Update session state (for handlers that modify session) */
|
|
68
|
-
updateSession: (updates: Partial<Pick<SessionState, 'currentSessionId' | 'currentPersona' | 'currentRole' | 'currentProjectId' | 'tokenUsage'>>) => void;
|
|
69
|
-
/** Get user updates since last sync (for session handlers) */
|
|
70
|
-
getUserUpdates?: (projectId: string) => Promise<UserUpdates | undefined>;
|
|
71
|
-
/** Select an available persona for the agent */
|
|
72
|
-
selectPersona?: (usedPersonas: Set<string>, instanceId: string) => string;
|
|
73
|
-
/** Extract project name from git URL */
|
|
74
|
-
extractProjectNameFromGitUrl?: (gitUrl: string) => string;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Success result with typed data
|
|
79
|
-
*/
|
|
80
|
-
export interface SuccessResult<T = unknown> {
|
|
81
|
-
result: T;
|
|
82
|
-
content?: Array<{ type: string; text: string }>;
|
|
83
|
-
isError?: false;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Error result with error information
|
|
88
|
-
*/
|
|
89
|
-
export interface ErrorResult {
|
|
90
|
-
result: { error: string; [key: string]: unknown };
|
|
91
|
-
content?: Array<{ type: string; text: string }>;
|
|
92
|
-
isError: true;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Result returned by handlers - discriminated union for type safety
|
|
97
|
-
* Use the helper functions success() and error() to create properly typed results.
|
|
98
|
-
*/
|
|
99
|
-
export type HandlerResult<T = unknown> = SuccessResult<T> | ErrorResult;
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Legacy HandlerResult interface for backward compatibility
|
|
103
|
-
* @deprecated Use HandlerResult<T> discriminated union instead
|
|
104
|
-
*/
|
|
105
|
-
export interface LegacyHandlerResult {
|
|
106
|
-
result?: unknown;
|
|
107
|
-
content?: Array<{ type: string; text: string }>;
|
|
108
|
-
isError?: boolean;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// ============================================================================
|
|
112
|
-
// Result Factory Functions - use these for type-safe handler results
|
|
113
|
-
// ============================================================================
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Create a success result with typed data
|
|
117
|
-
* @example
|
|
118
|
-
* return success({ tasks: data, total_count: count });
|
|
119
|
-
*/
|
|
120
|
-
export function success<T>(data: T): SuccessResult<T> {
|
|
121
|
-
return { result: data };
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Create an error result
|
|
126
|
-
* @example
|
|
127
|
-
* return error('Task not found');
|
|
128
|
-
* return error('Validation failed', { field: 'title', reason: 'too long' });
|
|
129
|
-
*/
|
|
130
|
-
export function error(message: string, details?: Record<string, unknown>): ErrorResult {
|
|
131
|
-
return {
|
|
132
|
-
result: { error: message, ...details },
|
|
133
|
-
isError: true
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// ============================================================================
|
|
138
|
-
// Type Predicates - use for runtime type narrowing
|
|
139
|
-
// ============================================================================
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Check if a handler result is a success (not an error)
|
|
143
|
-
* @example
|
|
144
|
-
* const result = await handler(args, ctx);
|
|
145
|
-
* if (isSuccess(result)) {
|
|
146
|
-
* console.log(result.result); // typed as T
|
|
147
|
-
* }
|
|
148
|
-
*/
|
|
149
|
-
export function isSuccess<T>(result: HandlerResult<T>): result is SuccessResult<T> {
|
|
150
|
-
return !result.isError;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/**
|
|
154
|
-
* Check if a handler result is an error
|
|
155
|
-
* @example
|
|
156
|
-
* const result = await handler(args, ctx);
|
|
157
|
-
* if (isError(result)) {
|
|
158
|
-
* console.log(result.result.error); // string
|
|
159
|
-
* }
|
|
160
|
-
*/
|
|
161
|
-
export function isError(result: HandlerResult<unknown>): result is ErrorResult {
|
|
162
|
-
return result.isError === true;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/**
|
|
166
|
-
* Handler function type
|
|
167
|
-
*/
|
|
168
|
-
export type Handler = (
|
|
169
|
-
args: Record<string, unknown>,
|
|
170
|
-
ctx: HandlerContext
|
|
171
|
-
) => Promise<HandlerResult>;
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Handler registry - maps tool names to handler functions
|
|
175
|
-
*/
|
|
176
|
-
export type HandlerRegistry = Record<string, Handler>;
|
|
1
|
+
/**
|
|
2
|
+
* Authentication context from API key validation
|
|
3
|
+
*/
|
|
4
|
+
export interface AuthContext {
|
|
5
|
+
userId: string;
|
|
6
|
+
apiKeyId: string;
|
|
7
|
+
organizationId?: string;
|
|
8
|
+
scope: 'personal' | 'organization';
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Model-specific token tracking
|
|
13
|
+
*/
|
|
14
|
+
export interface ModelTokens {
|
|
15
|
+
input: number;
|
|
16
|
+
output: number;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Token usage tracking for the session
|
|
21
|
+
*/
|
|
22
|
+
export interface TokenUsage {
|
|
23
|
+
callCount: number;
|
|
24
|
+
totalTokens: number;
|
|
25
|
+
byTool: Record<string, { calls: number; tokens: number }>;
|
|
26
|
+
byModel: Record<string, ModelTokens>;
|
|
27
|
+
currentModel: string | null; // 'opus' | 'sonnet' | 'haiku' | null
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Agent role for specialized work routing
|
|
32
|
+
* - developer: General development work, picks up any available task (default)
|
|
33
|
+
* - validator: Focuses on validating completed tasks
|
|
34
|
+
* - deployer: Handles deployment coordination and monitoring
|
|
35
|
+
* - reviewer: Code review and quality checks
|
|
36
|
+
* - maintainer: Task management, git orchestration, housekeeping
|
|
37
|
+
*/
|
|
38
|
+
export type AgentRole = 'developer' | 'validator' | 'deployer' | 'reviewer' | 'maintainer';
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Session state that persists across tool calls
|
|
42
|
+
*/
|
|
43
|
+
export interface SessionState {
|
|
44
|
+
instanceId: string;
|
|
45
|
+
currentSessionId: string | null;
|
|
46
|
+
currentPersona: string | null;
|
|
47
|
+
currentRole: AgentRole | null;
|
|
48
|
+
currentProjectId: string | null;
|
|
49
|
+
tokenUsage: TokenUsage;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* User updates since last sync (for start_work_session full mode)
|
|
54
|
+
*/
|
|
55
|
+
export interface UserUpdates {
|
|
56
|
+
tasks?: Array<{ id: string; title: string; created_at: string }>;
|
|
57
|
+
blockers?: Array<{ id: string; description: string; created_at: string }>;
|
|
58
|
+
ideas?: Array<{ id: string; title: string; created_at: string }>;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Context passed to all handlers
|
|
63
|
+
*/
|
|
64
|
+
export interface HandlerContext {
|
|
65
|
+
auth: AuthContext;
|
|
66
|
+
session: SessionState;
|
|
67
|
+
/** Update session state (for handlers that modify session) */
|
|
68
|
+
updateSession: (updates: Partial<Pick<SessionState, 'currentSessionId' | 'currentPersona' | 'currentRole' | 'currentProjectId' | 'tokenUsage'>>) => void;
|
|
69
|
+
/** Get user updates since last sync (for session handlers) */
|
|
70
|
+
getUserUpdates?: (projectId: string) => Promise<UserUpdates | undefined>;
|
|
71
|
+
/** Select an available persona for the agent */
|
|
72
|
+
selectPersona?: (usedPersonas: Set<string>, instanceId: string) => string;
|
|
73
|
+
/** Extract project name from git URL */
|
|
74
|
+
extractProjectNameFromGitUrl?: (gitUrl: string) => string;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Success result with typed data
|
|
79
|
+
*/
|
|
80
|
+
export interface SuccessResult<T = unknown> {
|
|
81
|
+
result: T;
|
|
82
|
+
content?: Array<{ type: string; text: string }>;
|
|
83
|
+
isError?: false;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Error result with error information
|
|
88
|
+
*/
|
|
89
|
+
export interface ErrorResult {
|
|
90
|
+
result: { error: string; [key: string]: unknown };
|
|
91
|
+
content?: Array<{ type: string; text: string }>;
|
|
92
|
+
isError: true;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Result returned by handlers - discriminated union for type safety
|
|
97
|
+
* Use the helper functions success() and error() to create properly typed results.
|
|
98
|
+
*/
|
|
99
|
+
export type HandlerResult<T = unknown> = SuccessResult<T> | ErrorResult;
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Legacy HandlerResult interface for backward compatibility
|
|
103
|
+
* @deprecated Use HandlerResult<T> discriminated union instead
|
|
104
|
+
*/
|
|
105
|
+
export interface LegacyHandlerResult {
|
|
106
|
+
result?: unknown;
|
|
107
|
+
content?: Array<{ type: string; text: string }>;
|
|
108
|
+
isError?: boolean;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// ============================================================================
|
|
112
|
+
// Result Factory Functions - use these for type-safe handler results
|
|
113
|
+
// ============================================================================
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Create a success result with typed data
|
|
117
|
+
* @example
|
|
118
|
+
* return success({ tasks: data, total_count: count });
|
|
119
|
+
*/
|
|
120
|
+
export function success<T>(data: T): SuccessResult<T> {
|
|
121
|
+
return { result: data };
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Create an error result
|
|
126
|
+
* @example
|
|
127
|
+
* return error('Task not found');
|
|
128
|
+
* return error('Validation failed', { field: 'title', reason: 'too long' });
|
|
129
|
+
*/
|
|
130
|
+
export function error(message: string, details?: Record<string, unknown>): ErrorResult {
|
|
131
|
+
return {
|
|
132
|
+
result: { error: message, ...details },
|
|
133
|
+
isError: true
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// ============================================================================
|
|
138
|
+
// Type Predicates - use for runtime type narrowing
|
|
139
|
+
// ============================================================================
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Check if a handler result is a success (not an error)
|
|
143
|
+
* @example
|
|
144
|
+
* const result = await handler(args, ctx);
|
|
145
|
+
* if (isSuccess(result)) {
|
|
146
|
+
* console.log(result.result); // typed as T
|
|
147
|
+
* }
|
|
148
|
+
*/
|
|
149
|
+
export function isSuccess<T>(result: HandlerResult<T>): result is SuccessResult<T> {
|
|
150
|
+
return !result.isError;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Check if a handler result is an error
|
|
155
|
+
* @example
|
|
156
|
+
* const result = await handler(args, ctx);
|
|
157
|
+
* if (isError(result)) {
|
|
158
|
+
* console.log(result.result.error); // string
|
|
159
|
+
* }
|
|
160
|
+
*/
|
|
161
|
+
export function isError(result: HandlerResult<unknown>): result is ErrorResult {
|
|
162
|
+
return result.isError === true;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Handler function type
|
|
167
|
+
*/
|
|
168
|
+
export type Handler = (
|
|
169
|
+
args: Record<string, unknown>,
|
|
170
|
+
ctx: HandlerContext
|
|
171
|
+
) => Promise<HandlerResult>;
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Handler registry - maps tool names to handler functions
|
|
175
|
+
*/
|
|
176
|
+
export type HandlerRegistry = Record<string, Handler>;
|