claude-brain 0.14.2 → 0.14.4
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 +191 -191
- package/VERSION +1 -1
- package/assets/CLAUDE-unified.md +11 -11
- package/assets/CLAUDE.md +11 -11
- package/bunfig.toml +8 -8
- package/package.json +80 -80
- package/packs/backend/node.json +173 -173
- package/packs/core/javascript.json +176 -176
- package/packs/core/typescript.json +222 -222
- package/packs/frontend/react.json +254 -254
- package/packs/meta/testing.json +172 -172
- package/src/automation/auto-context.ts +240 -240
- package/src/automation/decision-detector.ts +452 -452
- package/src/automation/index.ts +11 -11
- package/src/automation/phase12-manager.ts +456 -456
- package/src/automation/proactive-recall.ts +373 -373
- package/src/automation/project-detector.ts +310 -310
- package/src/automation/repo-scanner.ts +205 -205
- package/src/cli/auto-setup.ts +82 -82
- package/src/cli/bin.ts +202 -202
- package/src/cli/commands/chroma.ts +573 -573
- package/src/cli/commands/git-hook.ts +189 -189
- package/src/cli/commands/hooks.ts +213 -213
- package/src/cli/commands/init.ts +122 -122
- package/src/cli/commands/install-mcp.ts +92 -92
- package/src/cli/commands/pack.ts +197 -197
- package/src/cli/commands/serve.ts +167 -167
- package/src/cli/commands/start.ts +42 -42
- package/src/cli/commands/uninstall-mcp.ts +41 -41
- package/src/cli/commands/update.ts +121 -121
- package/src/cli/diagnose.ts +4 -4
- package/src/cli/health-check.ts +4 -4
- package/src/cli/migrate-chroma.ts +106 -106
- package/src/cli/setup.ts +4 -4
- package/src/cli/ui/animations.ts +80 -80
- package/src/cli/ui/components.ts +82 -82
- package/src/cli/ui/index.ts +4 -4
- package/src/cli/ui/logo.ts +36 -36
- package/src/cli/ui/theme.ts +55 -55
- package/src/config/defaults.ts +50 -50
- package/src/config/home.ts +55 -55
- package/src/config/index.ts +7 -7
- package/src/config/loader.ts +166 -166
- package/src/config/migration.ts +76 -76
- package/src/config/schema.ts +360 -360
- package/src/config/validator.ts +184 -184
- package/src/config/watcher.ts +86 -86
- package/src/context/assembler.ts +398 -398
- package/src/context/cache-manager.ts +101 -101
- package/src/context/formatter.ts +84 -84
- package/src/context/hierarchy.ts +85 -85
- package/src/context/index.ts +83 -83
- package/src/context/progress-tracker.ts +174 -174
- package/src/context/standards-manager.ts +287 -287
- package/src/context/types.ts +252 -252
- package/src/context/validator.ts +58 -58
- package/src/diagnostics/index.ts +123 -123
- package/src/health/index.ts +229 -229
- package/src/hooks/brain-hook.ts +112 -112
- package/src/hooks/capture.ts +168 -168
- package/src/hooks/deduplicator.ts +72 -72
- package/src/hooks/git-capture.ts +109 -109
- package/src/hooks/git-hook-installer.ts +207 -207
- package/src/hooks/index.ts +20 -20
- package/src/hooks/installer.ts +191 -194
- package/src/hooks/passive-classifier.ts +366 -366
- package/src/hooks/queue.ts +129 -129
- package/src/hooks/session-tracker.ts +275 -275
- package/src/hooks/types.ts +47 -47
- package/src/index.ts +7 -7
- package/src/intelligence/cross-project/affinity.ts +162 -162
- package/src/intelligence/cross-project/generalizer.ts +283 -283
- package/src/intelligence/cross-project/index.ts +13 -13
- package/src/intelligence/cross-project/transfer.ts +201 -201
- package/src/intelligence/index.ts +24 -24
- package/src/intelligence/optimization/index.ts +10 -10
- package/src/intelligence/optimization/precompute.ts +202 -202
- package/src/intelligence/optimization/semantic-cache.ts +207 -207
- package/src/intelligence/prediction/context-anticipator.ts +198 -198
- package/src/intelligence/prediction/decision-predictor.ts +184 -184
- package/src/intelligence/prediction/index.ts +13 -13
- package/src/intelligence/prediction/recommender.ts +268 -268
- package/src/intelligence/reasoning/chain-retrieval.ts +247 -247
- package/src/intelligence/reasoning/counterfactual.ts +248 -248
- package/src/intelligence/reasoning/index.ts +13 -13
- package/src/intelligence/reasoning/synthesizer.ts +169 -169
- package/src/intelligence/temporal/evolution.ts +197 -197
- package/src/intelligence/temporal/index.ts +16 -16
- package/src/intelligence/temporal/query-processor.ts +190 -190
- package/src/intelligence/temporal/timeline.ts +259 -259
- package/src/intelligence/temporal/trends.ts +263 -263
- package/src/knowledge/entity-extractor.ts +416 -416
- package/src/knowledge/graph/builder.ts +185 -185
- package/src/knowledge/graph/linker.ts +201 -201
- package/src/knowledge/graph/memory-graph.ts +359 -359
- package/src/knowledge/graph/schema.ts +99 -99
- package/src/knowledge/graph/search.ts +168 -168
- package/src/knowledge/relationship-extractor.ts +108 -108
- package/src/memory/chroma/client.ts +174 -174
- package/src/memory/chroma/collection-manager.ts +94 -94
- package/src/memory/chroma/config.ts +57 -57
- package/src/memory/chroma/embeddings.ts +153 -153
- package/src/memory/chroma/index.ts +82 -82
- package/src/memory/chroma/migration.ts +270 -270
- package/src/memory/chroma/schemas.ts +69 -69
- package/src/memory/chroma/search.ts +315 -315
- package/src/memory/chroma/store.ts +741 -741
- package/src/memory/consolidation/archiver.ts +164 -164
- package/src/memory/consolidation/merger.ts +186 -186
- package/src/memory/consolidation/scorer.ts +138 -138
- package/src/memory/context-builder.ts +236 -236
- package/src/memory/database.ts +169 -169
- package/src/memory/embedding-utils.ts +156 -156
- package/src/memory/embeddings.ts +226 -226
- package/src/memory/episodic/detector.ts +108 -108
- package/src/memory/episodic/manager.ts +351 -351
- package/src/memory/episodic/summarizer.ts +179 -179
- package/src/memory/episodic/types.ts +52 -52
- package/src/memory/index.ts +582 -582
- package/src/memory/knowledge-extractor.ts +455 -455
- package/src/memory/learning.ts +378 -378
- package/src/memory/patterns.ts +396 -396
- package/src/memory/schema.ts +88 -88
- package/src/memory/search.ts +309 -309
- package/src/memory/store.ts +787 -787
- package/src/memory/types.ts +121 -121
- package/src/orchestrator/coordinator.ts +272 -272
- package/src/orchestrator/decision-logger.ts +228 -228
- package/src/orchestrator/event-emitter.ts +198 -198
- package/src/orchestrator/event-queue.ts +184 -184
- package/src/orchestrator/handlers/base-handler.ts +70 -70
- package/src/orchestrator/handlers/context-handler.ts +73 -73
- package/src/orchestrator/handlers/decision-handler.ts +204 -204
- package/src/orchestrator/handlers/index.ts +10 -10
- package/src/orchestrator/handlers/status-handler.ts +131 -131
- package/src/orchestrator/handlers/task-handler.ts +171 -171
- package/src/orchestrator/index.ts +275 -275
- package/src/orchestrator/task-parser.ts +284 -284
- package/src/orchestrator/types.ts +98 -98
- package/src/packs/index.ts +9 -9
- package/src/packs/loader.ts +134 -134
- package/src/packs/manager.ts +204 -204
- package/src/packs/ranker.ts +78 -78
- package/src/packs/types.ts +81 -81
- package/src/phase12/index.ts +5 -5
- package/src/retrieval/bm25/index.ts +300 -300
- package/src/retrieval/bm25/tokenizer.ts +184 -184
- package/src/retrieval/feedback/adaptive.ts +223 -223
- package/src/retrieval/feedback/index.ts +16 -16
- package/src/retrieval/feedback/metrics.ts +223 -223
- package/src/retrieval/feedback/store.ts +283 -283
- package/src/retrieval/fusion/index.ts +194 -194
- package/src/retrieval/fusion/rrf.ts +163 -163
- package/src/retrieval/index.ts +12 -12
- package/src/retrieval/pipeline.ts +375 -375
- package/src/retrieval/query/expander.ts +198 -198
- package/src/retrieval/query/index.ts +27 -27
- package/src/retrieval/query/intent-classifier.ts +236 -236
- package/src/retrieval/query/temporal-parser.ts +295 -295
- package/src/retrieval/reranker/index.ts +188 -188
- package/src/retrieval/reranker/model.ts +95 -95
- package/src/retrieval/service.ts +125 -125
- package/src/retrieval/types.ts +162 -162
- package/src/routing/entity-extractor.ts +428 -428
- package/src/routing/intent-classifier.ts +436 -436
- package/src/routing/response-filter.ts +258 -254
- package/src/routing/router.ts +1322 -1314
- package/src/routing/search-engine.ts +475 -475
- package/src/routing/types.ts +94 -84
- package/src/scripts/health-check.ts +118 -118
- package/src/scripts/setup.ts +122 -122
- package/src/server/handlers/call-tool.ts +156 -156
- package/src/server/handlers/index.ts +9 -9
- package/src/server/handlers/list-tools.ts +35 -35
- package/src/server/handlers/tools/analyze-decision-evolution.ts +151 -151
- package/src/server/handlers/tools/auto-remember.ts +200 -200
- package/src/server/handlers/tools/brain.ts +85 -85
- package/src/server/handlers/tools/create-project.ts +135 -135
- package/src/server/handlers/tools/detect-trends.ts +144 -144
- package/src/server/handlers/tools/find-cross-project-patterns.ts +168 -168
- package/src/server/handlers/tools/get-activity-log.ts +194 -194
- package/src/server/handlers/tools/get-code-standards.ts +124 -124
- package/src/server/handlers/tools/get-corrections.ts +154 -154
- package/src/server/handlers/tools/get-decision-timeline.ts +172 -172
- package/src/server/handlers/tools/get-episode.ts +103 -103
- package/src/server/handlers/tools/get-patterns.ts +158 -158
- package/src/server/handlers/tools/get-phase12-status.ts +63 -63
- package/src/server/handlers/tools/get-project-context.ts +75 -75
- package/src/server/handlers/tools/get-recommendations.ts +145 -145
- package/src/server/handlers/tools/index.ts +31 -31
- package/src/server/handlers/tools/init-project.ts +757 -757
- package/src/server/handlers/tools/list-episodes.ts +90 -90
- package/src/server/handlers/tools/list-projects.ts +125 -125
- package/src/server/handlers/tools/rate-memory.ts +101 -101
- package/src/server/handlers/tools/recall-similar.ts +87 -87
- package/src/server/handlers/tools/recognize-pattern.ts +126 -126
- package/src/server/handlers/tools/record-correction.ts +125 -125
- package/src/server/handlers/tools/remember-decision.ts +153 -153
- package/src/server/handlers/tools/schemas.ts +253 -253
- package/src/server/handlers/tools/search-knowledge-graph.ts +102 -102
- package/src/server/handlers/tools/smart-context.ts +146 -146
- package/src/server/handlers/tools/update-progress.ts +131 -131
- package/src/server/handlers/tools/what-if-analysis.ts +135 -135
- package/src/server/http-api.ts +693 -693
- package/src/server/index.ts +40 -40
- package/src/server/mcp-server.ts +283 -283
- package/src/server/providers/index.ts +7 -7
- package/src/server/providers/prompts.ts +327 -327
- package/src/server/providers/resources.ts +622 -622
- package/src/server/services.ts +468 -468
- package/src/server/types.ts +39 -39
- package/src/server/utils/error-handler.ts +155 -155
- package/src/server/utils/index.ts +13 -13
- package/src/server/utils/memory-indicator.ts +83 -83
- package/src/server/utils/request-context.ts +122 -122
- package/src/server/utils/response-formatter.ts +129 -124
- package/src/server/utils/validators.ts +210 -210
- package/src/setup/index.ts +48 -48
- package/src/setup/wizard.ts +461 -461
- package/src/tools/index.ts +24 -24
- package/src/tools/registry.ts +115 -115
- package/src/tools/schemas.test.ts +30 -30
- package/src/tools/schemas.ts +617 -617
- package/src/tools/types.ts +412 -412
- package/src/utils/circuit-breaker.ts +130 -130
- package/src/utils/cleanup.ts +34 -34
- package/src/utils/error-handler.ts +132 -132
- package/src/utils/error-messages.ts +60 -60
- package/src/utils/fallback.ts +45 -45
- package/src/utils/index.ts +54 -54
- package/src/utils/logger-utils.ts +80 -80
- package/src/utils/logger.ts +88 -88
- package/src/utils/phase12-helper.ts +56 -56
- package/src/utils/retry.ts +94 -94
- package/src/utils/timing.ts +47 -47
- package/src/utils/transaction.ts +63 -63
- package/src/vault/frontmatter.ts +264 -264
- package/src/vault/index.ts +318 -318
- package/src/vault/paths.ts +106 -106
- package/src/vault/query.ts +422 -422
- package/src/vault/reader.ts +264 -264
- package/src/vault/templates.ts +186 -186
- package/src/vault/types.ts +73 -73
- package/src/vault/watcher.ts +277 -277
- package/src/vault/writer.ts +413 -413
- package/tsconfig.json +30 -30
package/src/server/types.ts
CHANGED
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP Server Types
|
|
3
|
-
* Type definitions specific to the MCP server implementation
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
/** Server connection states */
|
|
7
|
-
export type ConnectionState = 'disconnected' | 'connecting' | 'connected'
|
|
8
|
-
|
|
9
|
-
/** Server status information */
|
|
10
|
-
export interface ServerStatus {
|
|
11
|
-
/** Whether the server is currently running */
|
|
12
|
-
running: boolean
|
|
13
|
-
/** Server name from config */
|
|
14
|
-
name: string
|
|
15
|
-
/** Server version from config */
|
|
16
|
-
version: string
|
|
17
|
-
/** Current connection state */
|
|
18
|
-
connectionState: ConnectionState
|
|
19
|
-
/** Timestamp when server started */
|
|
20
|
-
startedAt?: Date
|
|
21
|
-
/** Number of requests processed */
|
|
22
|
-
requestCount: number
|
|
23
|
-
/** Phase 6.5: Server capabilities */
|
|
24
|
-
capabilities?: string[]
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/** Server events for lifecycle monitoring */
|
|
28
|
-
export interface ServerEvents {
|
|
29
|
-
onConnectionStateChange?: (state: ConnectionState) => void
|
|
30
|
-
onError?: (error: Error) => void
|
|
31
|
-
onRequest?: (toolName: string, requestId: string) => void
|
|
32
|
-
onResponse?: (toolName: string, requestId: string, durationMs: number) => void
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/** Options for server initialization */
|
|
36
|
-
export interface ServerOptions {
|
|
37
|
-
/** Event handlers for server lifecycle */
|
|
38
|
-
events?: ServerEvents
|
|
39
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server Types
|
|
3
|
+
* Type definitions specific to the MCP server implementation
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/** Server connection states */
|
|
7
|
+
export type ConnectionState = 'disconnected' | 'connecting' | 'connected'
|
|
8
|
+
|
|
9
|
+
/** Server status information */
|
|
10
|
+
export interface ServerStatus {
|
|
11
|
+
/** Whether the server is currently running */
|
|
12
|
+
running: boolean
|
|
13
|
+
/** Server name from config */
|
|
14
|
+
name: string
|
|
15
|
+
/** Server version from config */
|
|
16
|
+
version: string
|
|
17
|
+
/** Current connection state */
|
|
18
|
+
connectionState: ConnectionState
|
|
19
|
+
/** Timestamp when server started */
|
|
20
|
+
startedAt?: Date
|
|
21
|
+
/** Number of requests processed */
|
|
22
|
+
requestCount: number
|
|
23
|
+
/** Phase 6.5: Server capabilities */
|
|
24
|
+
capabilities?: string[]
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Server events for lifecycle monitoring */
|
|
28
|
+
export interface ServerEvents {
|
|
29
|
+
onConnectionStateChange?: (state: ConnectionState) => void
|
|
30
|
+
onError?: (error: Error) => void
|
|
31
|
+
onRequest?: (toolName: string, requestId: string) => void
|
|
32
|
+
onResponse?: (toolName: string, requestId: string, durationMs: number) => void
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Options for server initialization */
|
|
36
|
+
export interface ServerOptions {
|
|
37
|
+
/** Event handlers for server lifecycle */
|
|
38
|
+
events?: ServerEvents
|
|
39
|
+
}
|
|
@@ -1,155 +1,155 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Error Handler
|
|
3
|
-
* Utilities for handling and converting errors
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js'
|
|
7
|
-
import type { Logger } from 'pino'
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Structured error information for logging
|
|
11
|
-
*/
|
|
12
|
-
export interface ErrorInfo {
|
|
13
|
-
message: string
|
|
14
|
-
name: string
|
|
15
|
-
code?: string | number
|
|
16
|
-
stack?: string
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* ErrorHandler provides methods for error handling and conversion
|
|
21
|
-
*/
|
|
22
|
-
export class ErrorHandler {
|
|
23
|
-
/**
|
|
24
|
-
* Convert any error to MCP error format
|
|
25
|
-
* @param error - Error to convert
|
|
26
|
-
* @returns McpError instance
|
|
27
|
-
*/
|
|
28
|
-
static toMcpError(error: unknown): McpError {
|
|
29
|
-
if (error instanceof McpError) {
|
|
30
|
-
return error
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
if (error instanceof Error) {
|
|
34
|
-
// Check for common error types and map to appropriate codes
|
|
35
|
-
const message = error.message.toLowerCase()
|
|
36
|
-
|
|
37
|
-
if (message.includes('not found') || message.includes('does not exist')) {
|
|
38
|
-
return new McpError(ErrorCode.InvalidParams, error.message)
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
if (message.includes('permission') || message.includes('unauthorized')) {
|
|
42
|
-
return new McpError(ErrorCode.InvalidRequest, error.message)
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
if (message.includes('timeout')) {
|
|
46
|
-
return new McpError(ErrorCode.InternalError, `Operation timed out: ${error.message}`)
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return new McpError(ErrorCode.InternalError, error.message)
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
if (typeof error === 'string') {
|
|
53
|
-
return new McpError(ErrorCode.InternalError, error)
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
return new McpError(ErrorCode.InternalError, 'An unknown error occurred')
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Extract error information for logging
|
|
61
|
-
* @param error - Error to extract info from
|
|
62
|
-
* @returns Structured error information
|
|
63
|
-
*/
|
|
64
|
-
static getErrorInfo(error: unknown): ErrorInfo {
|
|
65
|
-
if (error instanceof McpError) {
|
|
66
|
-
return {
|
|
67
|
-
message: error.message,
|
|
68
|
-
name: 'McpError',
|
|
69
|
-
code: error.code,
|
|
70
|
-
stack: error.stack
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
if (error instanceof Error) {
|
|
75
|
-
return {
|
|
76
|
-
message: error.message,
|
|
77
|
-
name: error.name,
|
|
78
|
-
stack: error.stack
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
return {
|
|
83
|
-
message: String(error),
|
|
84
|
-
name: 'UnknownError'
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Log error with context
|
|
90
|
-
* @param logger - Logger instance
|
|
91
|
-
* @param error - Error to log
|
|
92
|
-
* @param context - Additional context for the log
|
|
93
|
-
*/
|
|
94
|
-
static logError(
|
|
95
|
-
logger: Logger,
|
|
96
|
-
error: unknown,
|
|
97
|
-
context: Record<string, unknown> = {}
|
|
98
|
-
): void {
|
|
99
|
-
const errorInfo = this.getErrorInfo(error)
|
|
100
|
-
|
|
101
|
-
logger.error({
|
|
102
|
-
error: errorInfo,
|
|
103
|
-
...context
|
|
104
|
-
}, errorInfo.message)
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Create an MCP error for invalid parameters
|
|
109
|
-
* @param message - Error message
|
|
110
|
-
* @returns McpError with InvalidParams code
|
|
111
|
-
*/
|
|
112
|
-
static invalidParams(message: string): McpError {
|
|
113
|
-
return new McpError(ErrorCode.InvalidParams, message)
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Create an MCP error for method not found
|
|
118
|
-
* @param method - Method name that was not found
|
|
119
|
-
* @returns McpError with MethodNotFound code
|
|
120
|
-
*/
|
|
121
|
-
static methodNotFound(method: string): McpError {
|
|
122
|
-
return new McpError(ErrorCode.MethodNotFound, `Method not found: ${method}`)
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* Create an MCP error for internal errors
|
|
127
|
-
* @param message - Error message
|
|
128
|
-
* @returns McpError with InternalError code
|
|
129
|
-
*/
|
|
130
|
-
static internalError(message: string): McpError {
|
|
131
|
-
return new McpError(ErrorCode.InternalError, message)
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Wrap an async function with error handling
|
|
136
|
-
* @param fn - Async function to wrap
|
|
137
|
-
* @param logger - Logger for error logging
|
|
138
|
-
* @param context - Context for error logging
|
|
139
|
-
* @returns Wrapped function that converts errors to McpError
|
|
140
|
-
*/
|
|
141
|
-
static wrapAsync<T extends unknown[], R>(
|
|
142
|
-
fn: (...args: T) => Promise<R>,
|
|
143
|
-
logger: Logger,
|
|
144
|
-
context: Record<string, unknown> = {}
|
|
145
|
-
): (...args: T) => Promise<R> {
|
|
146
|
-
return async (...args: T): Promise<R> => {
|
|
147
|
-
try {
|
|
148
|
-
return await fn(...args)
|
|
149
|
-
} catch (error) {
|
|
150
|
-
this.logError(logger, error, context)
|
|
151
|
-
throw this.toMcpError(error)
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Error Handler
|
|
3
|
+
* Utilities for handling and converting errors
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js'
|
|
7
|
+
import type { Logger } from 'pino'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Structured error information for logging
|
|
11
|
+
*/
|
|
12
|
+
export interface ErrorInfo {
|
|
13
|
+
message: string
|
|
14
|
+
name: string
|
|
15
|
+
code?: string | number
|
|
16
|
+
stack?: string
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* ErrorHandler provides methods for error handling and conversion
|
|
21
|
+
*/
|
|
22
|
+
export class ErrorHandler {
|
|
23
|
+
/**
|
|
24
|
+
* Convert any error to MCP error format
|
|
25
|
+
* @param error - Error to convert
|
|
26
|
+
* @returns McpError instance
|
|
27
|
+
*/
|
|
28
|
+
static toMcpError(error: unknown): McpError {
|
|
29
|
+
if (error instanceof McpError) {
|
|
30
|
+
return error
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (error instanceof Error) {
|
|
34
|
+
// Check for common error types and map to appropriate codes
|
|
35
|
+
const message = error.message.toLowerCase()
|
|
36
|
+
|
|
37
|
+
if (message.includes('not found') || message.includes('does not exist')) {
|
|
38
|
+
return new McpError(ErrorCode.InvalidParams, error.message)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (message.includes('permission') || message.includes('unauthorized')) {
|
|
42
|
+
return new McpError(ErrorCode.InvalidRequest, error.message)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (message.includes('timeout')) {
|
|
46
|
+
return new McpError(ErrorCode.InternalError, `Operation timed out: ${error.message}`)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return new McpError(ErrorCode.InternalError, error.message)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (typeof error === 'string') {
|
|
53
|
+
return new McpError(ErrorCode.InternalError, error)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return new McpError(ErrorCode.InternalError, 'An unknown error occurred')
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Extract error information for logging
|
|
61
|
+
* @param error - Error to extract info from
|
|
62
|
+
* @returns Structured error information
|
|
63
|
+
*/
|
|
64
|
+
static getErrorInfo(error: unknown): ErrorInfo {
|
|
65
|
+
if (error instanceof McpError) {
|
|
66
|
+
return {
|
|
67
|
+
message: error.message,
|
|
68
|
+
name: 'McpError',
|
|
69
|
+
code: error.code,
|
|
70
|
+
stack: error.stack
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (error instanceof Error) {
|
|
75
|
+
return {
|
|
76
|
+
message: error.message,
|
|
77
|
+
name: error.name,
|
|
78
|
+
stack: error.stack
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return {
|
|
83
|
+
message: String(error),
|
|
84
|
+
name: 'UnknownError'
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Log error with context
|
|
90
|
+
* @param logger - Logger instance
|
|
91
|
+
* @param error - Error to log
|
|
92
|
+
* @param context - Additional context for the log
|
|
93
|
+
*/
|
|
94
|
+
static logError(
|
|
95
|
+
logger: Logger,
|
|
96
|
+
error: unknown,
|
|
97
|
+
context: Record<string, unknown> = {}
|
|
98
|
+
): void {
|
|
99
|
+
const errorInfo = this.getErrorInfo(error)
|
|
100
|
+
|
|
101
|
+
logger.error({
|
|
102
|
+
error: errorInfo,
|
|
103
|
+
...context
|
|
104
|
+
}, errorInfo.message)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Create an MCP error for invalid parameters
|
|
109
|
+
* @param message - Error message
|
|
110
|
+
* @returns McpError with InvalidParams code
|
|
111
|
+
*/
|
|
112
|
+
static invalidParams(message: string): McpError {
|
|
113
|
+
return new McpError(ErrorCode.InvalidParams, message)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Create an MCP error for method not found
|
|
118
|
+
* @param method - Method name that was not found
|
|
119
|
+
* @returns McpError with MethodNotFound code
|
|
120
|
+
*/
|
|
121
|
+
static methodNotFound(method: string): McpError {
|
|
122
|
+
return new McpError(ErrorCode.MethodNotFound, `Method not found: ${method}`)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Create an MCP error for internal errors
|
|
127
|
+
* @param message - Error message
|
|
128
|
+
* @returns McpError with InternalError code
|
|
129
|
+
*/
|
|
130
|
+
static internalError(message: string): McpError {
|
|
131
|
+
return new McpError(ErrorCode.InternalError, message)
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Wrap an async function with error handling
|
|
136
|
+
* @param fn - Async function to wrap
|
|
137
|
+
* @param logger - Logger for error logging
|
|
138
|
+
* @param context - Context for error logging
|
|
139
|
+
* @returns Wrapped function that converts errors to McpError
|
|
140
|
+
*/
|
|
141
|
+
static wrapAsync<T extends unknown[], R>(
|
|
142
|
+
fn: (...args: T) => Promise<R>,
|
|
143
|
+
logger: Logger,
|
|
144
|
+
context: Record<string, unknown> = {}
|
|
145
|
+
): (...args: T) => Promise<R> {
|
|
146
|
+
return async (...args: T): Promise<R> => {
|
|
147
|
+
try {
|
|
148
|
+
return await fn(...args)
|
|
149
|
+
} catch (error) {
|
|
150
|
+
this.logError(logger, error, context)
|
|
151
|
+
throw this.toMcpError(error)
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Server Utilities Exports
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
export { ResponseFormatter } from './response-formatter'
|
|
6
|
-
export { ToolValidator } from './validators'
|
|
7
|
-
export { ErrorHandler, type ErrorInfo } from './error-handler'
|
|
8
|
-
export {
|
|
9
|
-
RequestContext,
|
|
10
|
-
Timer,
|
|
11
|
-
createTimer,
|
|
12
|
-
generateShortId
|
|
13
|
-
} from './request-context'
|
|
1
|
+
/**
|
|
2
|
+
* Server Utilities Exports
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export { ResponseFormatter } from './response-formatter'
|
|
6
|
+
export { ToolValidator } from './validators'
|
|
7
|
+
export { ErrorHandler, type ErrorInfo } from './error-handler'
|
|
8
|
+
export {
|
|
9
|
+
RequestContext,
|
|
10
|
+
Timer,
|
|
11
|
+
createTimer,
|
|
12
|
+
generateShortId
|
|
13
|
+
} from './request-context'
|
|
@@ -1,83 +1,83 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Memory Indicator
|
|
3
|
-
* Shows a visual indicator when Claude Brain provides helpful data
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
// ANSI color codes for terminal output
|
|
7
|
-
const ANSI = {
|
|
8
|
-
reset: '\x1b[0m',
|
|
9
|
-
red: '\x1b[31m',
|
|
10
|
-
brightRed: '\x1b[91m',
|
|
11
|
-
bold: '\x1b[1m',
|
|
12
|
-
dim: '\x1b[2m',
|
|
13
|
-
bgRed: '\x1b[41m',
|
|
14
|
-
white: '\x1b[37m',
|
|
15
|
-
} as const
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Memory indicator banner shown when Claude Brain provides helpful data
|
|
19
|
-
*/
|
|
20
|
-
export const MEMORY_HELPED_BANNER = `${ANSI.brightRed}${ANSI.bold}🧠 MEMORY ASSISTED${ANSI.reset}`
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Alternative shorter indicator
|
|
24
|
-
*/
|
|
25
|
-
export const MEMORY_HELPED_SHORT = `${ANSI.brightRed}[memory-assisted]${ANSI.reset}`
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Wrap content with the memory helped indicator
|
|
29
|
-
* @param content - The content to wrap
|
|
30
|
-
* @param count - Optional count of items found
|
|
31
|
-
* @returns Content with the indicator prepended
|
|
32
|
-
*/
|
|
33
|
-
export function withMemoryIndicator(content: string, count?: number): string {
|
|
34
|
-
const countText = count !== undefined ? ` (${count} item${count !== 1 ? 's' : ''})` : ''
|
|
35
|
-
return `${MEMORY_HELPED_BANNER}${countText}\n\n${content}`
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Create a memory stats line
|
|
40
|
-
* @param stats - Object with retrieval statistics
|
|
41
|
-
* @returns Formatted stats line in red
|
|
42
|
-
*/
|
|
43
|
-
export function formatMemoryStats(stats: {
|
|
44
|
-
recalled?: number
|
|
45
|
-
patterns?: number
|
|
46
|
-
corrections?: number
|
|
47
|
-
similarity?: number
|
|
48
|
-
}): string {
|
|
49
|
-
const parts: string[] = []
|
|
50
|
-
|
|
51
|
-
if (stats.recalled !== undefined && stats.recalled > 0) {
|
|
52
|
-
parts.push(`${stats.recalled} memories`)
|
|
53
|
-
}
|
|
54
|
-
if (stats.patterns !== undefined && stats.patterns > 0) {
|
|
55
|
-
parts.push(`${stats.patterns} patterns`)
|
|
56
|
-
}
|
|
57
|
-
if (stats.corrections !== undefined && stats.corrections > 0) {
|
|
58
|
-
parts.push(`${stats.corrections} corrections`)
|
|
59
|
-
}
|
|
60
|
-
if (stats.similarity !== undefined) {
|
|
61
|
-
parts.push(`${Math.round(stats.similarity * 100)}% match`)
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (parts.length === 0) return ''
|
|
65
|
-
|
|
66
|
-
return `${ANSI.red}📊 Retrieved: ${parts.join(', ')}${ANSI.reset}`
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Check if this is a "helpful" response (has actual data, not just errors/suggestions)
|
|
71
|
-
*/
|
|
72
|
-
export function isHelpfulResponse(content: string): boolean {
|
|
73
|
-
const unhelpfulIndicators = [
|
|
74
|
-
'No similar memories found',
|
|
75
|
-
'No relevant past decisions found',
|
|
76
|
-
'No patterns found',
|
|
77
|
-
'No corrections found',
|
|
78
|
-
'not initialized',
|
|
79
|
-
'Error:',
|
|
80
|
-
]
|
|
81
|
-
|
|
82
|
-
return !unhelpfulIndicators.some(indicator => content.includes(indicator))
|
|
83
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Memory Indicator
|
|
3
|
+
* Shows a visual indicator when Claude Brain provides helpful data
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
// ANSI color codes for terminal output
|
|
7
|
+
const ANSI = {
|
|
8
|
+
reset: '\x1b[0m',
|
|
9
|
+
red: '\x1b[31m',
|
|
10
|
+
brightRed: '\x1b[91m',
|
|
11
|
+
bold: '\x1b[1m',
|
|
12
|
+
dim: '\x1b[2m',
|
|
13
|
+
bgRed: '\x1b[41m',
|
|
14
|
+
white: '\x1b[37m',
|
|
15
|
+
} as const
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Memory indicator banner shown when Claude Brain provides helpful data
|
|
19
|
+
*/
|
|
20
|
+
export const MEMORY_HELPED_BANNER = `${ANSI.brightRed}${ANSI.bold}🧠 MEMORY ASSISTED${ANSI.reset}`
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Alternative shorter indicator
|
|
24
|
+
*/
|
|
25
|
+
export const MEMORY_HELPED_SHORT = `${ANSI.brightRed}[memory-assisted]${ANSI.reset}`
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Wrap content with the memory helped indicator
|
|
29
|
+
* @param content - The content to wrap
|
|
30
|
+
* @param count - Optional count of items found
|
|
31
|
+
* @returns Content with the indicator prepended
|
|
32
|
+
*/
|
|
33
|
+
export function withMemoryIndicator(content: string, count?: number): string {
|
|
34
|
+
const countText = count !== undefined ? ` (${count} item${count !== 1 ? 's' : ''})` : ''
|
|
35
|
+
return `${MEMORY_HELPED_BANNER}${countText}\n\n${content}`
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Create a memory stats line
|
|
40
|
+
* @param stats - Object with retrieval statistics
|
|
41
|
+
* @returns Formatted stats line in red
|
|
42
|
+
*/
|
|
43
|
+
export function formatMemoryStats(stats: {
|
|
44
|
+
recalled?: number
|
|
45
|
+
patterns?: number
|
|
46
|
+
corrections?: number
|
|
47
|
+
similarity?: number
|
|
48
|
+
}): string {
|
|
49
|
+
const parts: string[] = []
|
|
50
|
+
|
|
51
|
+
if (stats.recalled !== undefined && stats.recalled > 0) {
|
|
52
|
+
parts.push(`${stats.recalled} memories`)
|
|
53
|
+
}
|
|
54
|
+
if (stats.patterns !== undefined && stats.patterns > 0) {
|
|
55
|
+
parts.push(`${stats.patterns} patterns`)
|
|
56
|
+
}
|
|
57
|
+
if (stats.corrections !== undefined && stats.corrections > 0) {
|
|
58
|
+
parts.push(`${stats.corrections} corrections`)
|
|
59
|
+
}
|
|
60
|
+
if (stats.similarity !== undefined) {
|
|
61
|
+
parts.push(`${Math.round(stats.similarity * 100)}% match`)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (parts.length === 0) return ''
|
|
65
|
+
|
|
66
|
+
return `${ANSI.red}📊 Retrieved: ${parts.join(', ')}${ANSI.reset}`
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Check if this is a "helpful" response (has actual data, not just errors/suggestions)
|
|
71
|
+
*/
|
|
72
|
+
export function isHelpfulResponse(content: string): boolean {
|
|
73
|
+
const unhelpfulIndicators = [
|
|
74
|
+
'No similar memories found',
|
|
75
|
+
'No relevant past decisions found',
|
|
76
|
+
'No patterns found',
|
|
77
|
+
'No corrections found',
|
|
78
|
+
'not initialized',
|
|
79
|
+
'Error:',
|
|
80
|
+
]
|
|
81
|
+
|
|
82
|
+
return !unhelpfulIndicators.some(indicator => content.includes(indicator))
|
|
83
|
+
}
|