claude-brain 0.30.2 → 0.30.3
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 +241 -191
- package/VERSION +1 -1
- package/assets/CLAUDE-unified.md +11 -11
- package/assets/CLAUDE.md +29 -29
- package/package.json +7 -3
- 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/scripts/postinstall.mjs +531 -531
- package/src/automation/decision-detector.ts +452 -452
- 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 +210 -205
- package/src/cli/auto-setup.ts +75 -75
- package/src/cli/auto-start.ts +266 -266
- package/src/cli/bin.ts +264 -264
- package/src/cli/commands/autostart.ts +90 -90
- package/src/cli/commands/chroma.ts +578 -577
- package/src/cli/commands/export-training.ts +70 -70
- package/src/cli/commands/export.ts +130 -130
- package/src/cli/commands/git-hook.ts +183 -183
- package/src/cli/commands/hooks.ts +217 -217
- package/src/cli/commands/init.ts +123 -123
- package/src/cli/commands/install-mcp.ts +122 -111
- package/src/cli/commands/models.ts +979 -979
- package/src/cli/commands/pack.ts +200 -200
- package/src/cli/commands/refresh.ts +344 -339
- package/src/cli/commands/reindex.ts +120 -120
- package/src/cli/commands/serve.ts +466 -463
- package/src/cli/commands/start.ts +44 -44
- package/src/cli/commands/status.ts +220 -203
- package/src/cli/commands/uninstall-mcp.ts +45 -41
- package/src/cli/commands/update.ts +130 -124
- package/src/cli/migrate-chroma.ts +106 -106
- 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/code-intelligence/indexer.ts +352 -352
- package/src/code-intelligence/linker.ts +178 -178
- package/src/code-intelligence/parser.ts +484 -484
- package/src/code-intelligence/query.ts +291 -291
- package/src/code-intelligence/schema.ts +83 -83
- package/src/code-intelligence/types.ts +95 -95
- package/src/config/defaults.ts +52 -52
- package/src/config/home.ts +56 -56
- package/src/config/index.ts +5 -5
- package/src/config/loader.ts +192 -192
- package/src/config/schema.ts +446 -415
- package/src/config/validator.ts +182 -182
- package/src/context/assembler.ts +407 -400
- package/src/context/index.ts +79 -79
- package/src/context/progress-tracker.ts +174 -174
- package/src/context/standards-manager.ts +287 -287
- package/src/context/validator.ts +58 -58
- package/src/diagnostics/index.ts +122 -121
- package/src/health/index.ts +233 -232
- package/src/hooks/brain-hook.ts +134 -131
- package/src/hooks/capture.ts +168 -168
- package/src/hooks/claude-code-mastery.md +112 -112
- package/src/hooks/context-hook.ts +260 -245
- package/src/hooks/deduplicator.ts +72 -72
- package/src/hooks/git-capture.ts +109 -109
- package/src/hooks/git-hook-installer.ts +211 -207
- package/src/hooks/index.ts +20 -20
- package/src/hooks/installer.ts +306 -288
- package/src/hooks/interceptor-hook.ts +204 -201
- package/src/hooks/passive-classifier.ts +397 -397
- package/src/hooks/queue.ts +160 -129
- package/src/hooks/session-tracker.ts +312 -312
- package/src/hooks/types.ts +52 -52
- package/src/index.ts +7 -7
- package/src/intelligence/cross-project/generalizer.ts +283 -283
- package/src/intelligence/cross-project/index.ts +7 -7
- package/src/intelligence/hf-downloader.ts +222 -222
- package/src/intelligence/hf-manifest.json +78 -78
- package/src/intelligence/index.ts +24 -24
- package/src/intelligence/inference-router.ts +762 -762
- package/src/intelligence/model-manager.ts +263 -245
- package/src/intelligence/optimization/index.ts +10 -10
- package/src/intelligence/optimization/precompute.ts +202 -202
- package/src/intelligence/optimization/semantic-cache.ts +213 -207
- package/src/intelligence/prediction/index.ts +7 -7
- package/src/intelligence/prediction/recommender.ts +276 -268
- package/src/intelligence/reasoning/chain-retrieval.ts +243 -247
- package/src/intelligence/reasoning/index.ts +7 -7
- package/src/intelligence/temporal/evolution.ts +193 -197
- package/src/intelligence/temporal/index.ts +16 -16
- package/src/intelligence/temporal/query-processor.ts +190 -190
- package/src/intelligence/temporal/timeline.ts +272 -259
- package/src/intelligence/temporal/trends.ts +263 -263
- package/src/intelligence/tokenizer.ts +118 -118
- package/src/knowledge/entity-extractor.ts +447 -443
- 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 +166 -166
- package/src/knowledge/relationship-extractor.ts +108 -108
- package/src/memory/chroma/client.ts +211 -192
- package/src/memory/chroma/collection-manager.ts +92 -92
- package/src/memory/chroma/config.ts +57 -57
- package/src/memory/chroma/embeddings.ts +177 -175
- 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 +319 -315
- package/src/memory/chroma/store.ts +755 -747
- package/src/memory/compression.ts +121 -121
- package/src/memory/consolidation/archiver.ts +162 -165
- package/src/memory/consolidation/merger.ts +182 -186
- package/src/memory/consolidation/scorer.ts +136 -136
- package/src/memory/database.ts +9 -0
- package/src/memory/dual-write.ts +145 -0
- package/src/memory/embeddings.ts +226 -226
- package/src/memory/episodic/detector.ts +108 -108
- package/src/memory/episodic/manager.ts +347 -351
- package/src/memory/episodic/summarizer.ts +179 -179
- package/src/memory/episodic/types.ts +52 -52
- package/src/memory/fts5-search.ts +692 -633
- package/src/memory/index.ts +943 -1060
- package/src/memory/migrations/add-fts5.ts +118 -108
- package/src/memory/patterns.ts +438 -438
- package/src/memory/pruning.ts +60 -60
- package/src/memory/schema.ts +88 -88
- package/src/memory/store.ts +911 -787
- package/src/orchestrator/handlers/decision-handler.ts +204 -204
- 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 -297
- package/src/retrieval/bm25/tokenizer.ts +184 -184
- package/src/retrieval/feedback/adaptive.ts +221 -221
- package/src/retrieval/feedback/index.ts +16 -16
- package/src/retrieval/feedback/metrics.ts +221 -221
- package/src/retrieval/feedback/store.ts +283 -283
- package/src/retrieval/fusion/index.ts +194 -194
- package/src/retrieval/fusion/rrf.ts +165 -165
- package/src/retrieval/index.ts +12 -12
- package/src/retrieval/pipeline.ts +375 -375
- package/src/retrieval/query/expander.ts +203 -203
- package/src/retrieval/query/index.ts +27 -27
- package/src/retrieval/query/intent-classifier.ts +252 -252
- package/src/retrieval/query/temporal-parser.ts +295 -295
- package/src/retrieval/reranker/index.ts +189 -188
- package/src/retrieval/reranker/model.ts +99 -95
- package/src/retrieval/service.ts +125 -125
- package/src/retrieval/types.ts +162 -162
- package/src/routing/entity-extractor.ts +454 -454
- package/src/routing/handlers/exploration-handler.ts +369 -0
- package/src/routing/handlers/index.ts +19 -0
- package/src/routing/handlers/memory-handler.ts +273 -0
- package/src/routing/handlers/mutation-handler.ts +241 -0
- package/src/routing/handlers/recall-handler.ts +642 -0
- package/src/routing/handlers/shared.ts +515 -0
- package/src/routing/handlers/types.ts +48 -0
- package/src/routing/intent-classifier.ts +552 -552
- package/src/routing/response-filter.ts +399 -391
- package/src/routing/router.ts +245 -2193
- package/src/routing/search-engine.ts +521 -514
- package/src/routing/types.ts +104 -94
- package/src/scripts/health-check.ts +118 -118
- package/src/scripts/setup.ts +122 -122
- package/src/server/auto-updater.ts +283 -276
- package/src/server/handlers/call-tool.ts +159 -159
- package/src/server/handlers/list-tools.ts +35 -35
- package/src/server/handlers/tools/auto-remember.ts +165 -165
- package/src/server/handlers/tools/brain.ts +86 -86
- package/src/server/handlers/tools/create-project.ts +135 -135
- package/src/server/handlers/tools/get-code-standards.ts +123 -123
- package/src/server/handlers/tools/get-corrections.ts +152 -152
- package/src/server/handlers/tools/get-patterns.ts +156 -156
- package/src/server/handlers/tools/get-project-context.ts +75 -75
- package/src/server/handlers/tools/index.ts +30 -30
- package/src/server/handlers/tools/init-project.ts +756 -756
- package/src/server/handlers/tools/list-projects.ts +126 -126
- package/src/server/handlers/tools/recall-similar.ts +87 -87
- package/src/server/handlers/tools/recognize-pattern.ts +132 -132
- package/src/server/handlers/tools/record-correction.ts +131 -131
- package/src/server/handlers/tools/remember-decision.ts +168 -168
- package/src/server/handlers/tools/schemas.ts +179 -179
- package/src/server/handlers/tools/search-code.ts +122 -122
- package/src/server/handlers/tools/smart-context.ts +146 -146
- package/src/server/handlers/tools/update-progress.ts +131 -131
- package/src/server/http-api.ts +215 -1229
- package/src/server/mcp-proxy.ts +85 -84
- package/src/server/mcp-server.ts +285 -284
- package/src/server/middleware/auth.ts +39 -0
- package/src/server/middleware/error-handler.ts +37 -0
- package/src/server/middleware/rate-limit.ts +53 -0
- package/src/server/middleware/validate.ts +42 -0
- package/src/server/pid-manager.ts +137 -136
- package/src/server/providers/resources.ts +581 -581
- package/src/server/routes/code.ts +228 -0
- package/src/server/routes/context.ts +26 -0
- package/src/server/routes/health.ts +19 -0
- package/src/server/routes/helpers.ts +100 -0
- package/src/server/routes/hooks.ts +197 -0
- package/src/server/routes/mcp.ts +47 -0
- package/src/server/routes/memory.ts +397 -0
- package/src/server/routes/models.ts +96 -0
- package/src/server/routes/projects.ts +89 -0
- package/src/server/routes/types.ts +21 -0
- package/src/server/schemas/api-schemas.ts +202 -0
- package/src/server/services.ts +720 -720
- package/src/server/utils/memory-indicator.ts +84 -84
- package/src/server/utils/response-formatter.ts +129 -129
- package/src/server/web-viewer.ts +1145 -1115
- package/src/setup/index.ts +38 -38
- package/src/tools/registry.ts +115 -115
- package/src/tools/schemas.ts +666 -666
- package/src/tools/types.ts +412 -412
- package/src/training/data-store.ts +320 -298
- package/src/training/retrain-pipeline.ts +399 -394
- package/src/utils/error-handler.ts +136 -136
- package/src/utils/index.ts +58 -58
- package/src/utils/kill-port.ts +55 -53
- package/src/utils/phase12-helper.ts +56 -56
- package/src/utils/safe-path.ts +43 -0
- package/src/utils/timing.ts +47 -47
- package/src/utils/transaction.ts +63 -63
- package/src/vault/index.ts +4 -3
- package/src/vault/paths.ts +106 -106
- package/src/vault/query.ts +4 -1
- package/src/vault/reader.ts +44 -1
- package/src/vault/watcher.ts +24 -1
- package/src/vault/writer.ts +487 -413
- package/skills/persistent-memory/SKILL.md +0 -148
- package/skills/persistent-memory/references/tool-reference.md +0 -90
|
@@ -1,84 +1,84 @@
|
|
|
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
|
-
* Note: No ANSI codes — MCP tool responses should be plain text/markdown
|
|
20
|
-
*/
|
|
21
|
-
export const MEMORY_HELPED_BANNER = '🧠 MEMORY ASSISTED'
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Alternative shorter indicator
|
|
25
|
-
*/
|
|
26
|
-
export const MEMORY_HELPED_SHORT = '[memory-assisted]'
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Wrap content with the memory helped indicator
|
|
30
|
-
* @param content - The content to wrap
|
|
31
|
-
* @param count - Optional count of items found
|
|
32
|
-
* @returns Content with the indicator prepended
|
|
33
|
-
*/
|
|
34
|
-
export function withMemoryIndicator(content: string, count?: number): string {
|
|
35
|
-
const countText = count !== undefined ? ` (${count} item${count !== 1 ? 's' : ''})` : ''
|
|
36
|
-
return `${MEMORY_HELPED_BANNER}${countText}\n\n${content}`
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Create a memory stats line
|
|
41
|
-
* @param stats - Object with retrieval statistics
|
|
42
|
-
* @returns Formatted stats line in red
|
|
43
|
-
*/
|
|
44
|
-
export function formatMemoryStats(stats: {
|
|
45
|
-
recalled?: number
|
|
46
|
-
patterns?: number
|
|
47
|
-
corrections?: number
|
|
48
|
-
similarity?: number
|
|
49
|
-
}): string {
|
|
50
|
-
const parts: string[] = []
|
|
51
|
-
|
|
52
|
-
if (stats.recalled !== undefined && stats.recalled > 0) {
|
|
53
|
-
parts.push(`${stats.recalled} memories`)
|
|
54
|
-
}
|
|
55
|
-
if (stats.patterns !== undefined && stats.patterns > 0) {
|
|
56
|
-
parts.push(`${stats.patterns} patterns`)
|
|
57
|
-
}
|
|
58
|
-
if (stats.corrections !== undefined && stats.corrections > 0) {
|
|
59
|
-
parts.push(`${stats.corrections} corrections`)
|
|
60
|
-
}
|
|
61
|
-
if (stats.similarity !== undefined) {
|
|
62
|
-
parts.push(`${Math.round(stats.similarity * 100)}% match`)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
if (parts.length === 0) return ''
|
|
66
|
-
|
|
67
|
-
return `📊 Retrieved: ${parts.join(', ')}`
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Check if this is a "helpful" response (has actual data, not just errors/suggestions)
|
|
72
|
-
*/
|
|
73
|
-
export function isHelpfulResponse(content: string): boolean {
|
|
74
|
-
const unhelpfulIndicators = [
|
|
75
|
-
'No similar memories found',
|
|
76
|
-
'No relevant past decisions found',
|
|
77
|
-
'No patterns found',
|
|
78
|
-
'No corrections found',
|
|
79
|
-
'not initialized',
|
|
80
|
-
'Error:',
|
|
81
|
-
]
|
|
82
|
-
|
|
83
|
-
return !unhelpfulIndicators.some(indicator => content.includes(indicator))
|
|
84
|
-
}
|
|
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
|
+
* Note: No ANSI codes — MCP tool responses should be plain text/markdown
|
|
20
|
+
*/
|
|
21
|
+
export const MEMORY_HELPED_BANNER = '🧠 MEMORY ASSISTED'
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Alternative shorter indicator
|
|
25
|
+
*/
|
|
26
|
+
export const MEMORY_HELPED_SHORT = '[memory-assisted]'
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Wrap content with the memory helped indicator
|
|
30
|
+
* @param content - The content to wrap
|
|
31
|
+
* @param count - Optional count of items found
|
|
32
|
+
* @returns Content with the indicator prepended
|
|
33
|
+
*/
|
|
34
|
+
export function withMemoryIndicator(content: string, count?: number): string {
|
|
35
|
+
const countText = count !== undefined ? ` (${count} item${count !== 1 ? 's' : ''})` : ''
|
|
36
|
+
return `${MEMORY_HELPED_BANNER}${countText}\n\n${content}`
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Create a memory stats line
|
|
41
|
+
* @param stats - Object with retrieval statistics
|
|
42
|
+
* @returns Formatted stats line in red
|
|
43
|
+
*/
|
|
44
|
+
export function formatMemoryStats(stats: {
|
|
45
|
+
recalled?: number
|
|
46
|
+
patterns?: number
|
|
47
|
+
corrections?: number
|
|
48
|
+
similarity?: number
|
|
49
|
+
}): string {
|
|
50
|
+
const parts: string[] = []
|
|
51
|
+
|
|
52
|
+
if (stats.recalled !== undefined && stats.recalled > 0) {
|
|
53
|
+
parts.push(`${stats.recalled} memories`)
|
|
54
|
+
}
|
|
55
|
+
if (stats.patterns !== undefined && stats.patterns > 0) {
|
|
56
|
+
parts.push(`${stats.patterns} patterns`)
|
|
57
|
+
}
|
|
58
|
+
if (stats.corrections !== undefined && stats.corrections > 0) {
|
|
59
|
+
parts.push(`${stats.corrections} corrections`)
|
|
60
|
+
}
|
|
61
|
+
if (stats.similarity !== undefined) {
|
|
62
|
+
parts.push(`${Math.round(stats.similarity * 100)}% match`)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (parts.length === 0) return ''
|
|
66
|
+
|
|
67
|
+
return `📊 Retrieved: ${parts.join(', ')}`
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Check if this is a "helpful" response (has actual data, not just errors/suggestions)
|
|
72
|
+
*/
|
|
73
|
+
export function isHelpfulResponse(content: string): boolean {
|
|
74
|
+
const unhelpfulIndicators = [
|
|
75
|
+
'No similar memories found',
|
|
76
|
+
'No relevant past decisions found',
|
|
77
|
+
'No patterns found',
|
|
78
|
+
'No corrections found',
|
|
79
|
+
'not initialized',
|
|
80
|
+
'Error:',
|
|
81
|
+
]
|
|
82
|
+
|
|
83
|
+
return !unhelpfulIndicators.some(indicator => content.includes(indicator))
|
|
84
|
+
}
|
|
@@ -1,129 +1,129 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Response Formatter
|
|
3
|
-
* Utilities for formatting MCP tool responses
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js'
|
|
7
|
-
import type { ToolResponse } from '@/tools/types'
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* ResponseFormatter provides methods for creating properly formatted MCP responses
|
|
11
|
-
*/
|
|
12
|
-
export class ResponseFormatter {
|
|
13
|
-
/**
|
|
14
|
-
* Format text content for MCP response
|
|
15
|
-
* @param content - Text content to include in response
|
|
16
|
-
* @returns Properly formatted ToolResponse
|
|
17
|
-
*/
|
|
18
|
-
static text(content: string): ToolResponse {
|
|
19
|
-
return {
|
|
20
|
-
content: [{
|
|
21
|
-
type: 'text',
|
|
22
|
-
text: content
|
|
23
|
-
}]
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Format multiple text blocks for MCP response
|
|
29
|
-
* @param contents - Array of text content
|
|
30
|
-
* @returns Properly formatted ToolResponse with multiple content blocks
|
|
31
|
-
*/
|
|
32
|
-
static multiText(contents: string[]): ToolResponse {
|
|
33
|
-
return {
|
|
34
|
-
content: contents.map(text => ({
|
|
35
|
-
type: 'text' as const,
|
|
36
|
-
text
|
|
37
|
-
}))
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Format error as MCP error (throws)
|
|
43
|
-
* @param message - Error message
|
|
44
|
-
* @param code - MCP error code
|
|
45
|
-
* @throws McpError
|
|
46
|
-
*/
|
|
47
|
-
static error(message: string, code: ErrorCode = ErrorCode.InternalError): never {
|
|
48
|
-
throw new McpError(code, message)
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Format error response (returns response with isError flag)
|
|
53
|
-
* @param message - Error message
|
|
54
|
-
* @returns ToolResponse with error flag
|
|
55
|
-
*/
|
|
56
|
-
static errorResponse(message: string): ToolResponse {
|
|
57
|
-
return {
|
|
58
|
-
content: [{
|
|
59
|
-
type: 'text',
|
|
60
|
-
text: `Error: ${message}`
|
|
61
|
-
}],
|
|
62
|
-
isError: true
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Format structured data as formatted text
|
|
68
|
-
* @param data - Object to format
|
|
69
|
-
* @returns Properly formatted ToolResponse
|
|
70
|
-
*/
|
|
71
|
-
static structured(data: Record<string, unknown>): ToolResponse {
|
|
72
|
-
const formatted = Object.entries(data)
|
|
73
|
-
.map(([key, value]) => {
|
|
74
|
-
const formattedValue = typeof value === 'object'
|
|
75
|
-
? JSON.stringify(value, null, 2)
|
|
76
|
-
: String(value)
|
|
77
|
-
return `${key}: ${formattedValue}`
|
|
78
|
-
})
|
|
79
|
-
.join('\n\n')
|
|
80
|
-
|
|
81
|
-
return this.text(formatted)
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Format JSON data as pretty-printed text
|
|
86
|
-
* @param data - Data to serialize as JSON
|
|
87
|
-
* @param label - Optional label to prefix the JSON
|
|
88
|
-
* @returns Properly formatted ToolResponse
|
|
89
|
-
*/
|
|
90
|
-
static json(data: unknown, label?: string): ToolResponse {
|
|
91
|
-
const jsonStr = JSON.stringify(data, null, 2)
|
|
92
|
-
const content = label ? `${label}:\n${jsonStr}` : jsonStr
|
|
93
|
-
return this.text(content)
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Format a list of items
|
|
98
|
-
* @param items - Array of items to format
|
|
99
|
-
* @param title - Optional title for the list
|
|
100
|
-
* @returns Properly formatted ToolResponse
|
|
101
|
-
*/
|
|
102
|
-
static list(items: string[], title?: string): ToolResponse {
|
|
103
|
-
const listContent = items.map((item, i) => `${i + 1}. ${item}`).join('\n')
|
|
104
|
-
const content = title ? `${title}:\n${listContent}` : listContent
|
|
105
|
-
return this.text(content)
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Format a success message
|
|
110
|
-
* @param message - Success message
|
|
111
|
-
* @param details - Optional additional details
|
|
112
|
-
* @returns Properly formatted ToolResponse
|
|
113
|
-
*/
|
|
114
|
-
static success(message: string, details?: Record<string, unknown>): ToolResponse {
|
|
115
|
-
let content = `✓ ${message}`
|
|
116
|
-
if (details) {
|
|
117
|
-
const detailsStr = Object.entries(details)
|
|
118
|
-
.map(([k, v]) => {
|
|
119
|
-
const formatted = (v !== null && typeof v === 'object')
|
|
120
|
-
? JSON.stringify(v)
|
|
121
|
-
: String(v ?? '')
|
|
122
|
-
return ` ${k}: ${formatted}`
|
|
123
|
-
})
|
|
124
|
-
.join('\n')
|
|
125
|
-
content += `\n\nDetails:\n${detailsStr}`
|
|
126
|
-
}
|
|
127
|
-
return this.text(content)
|
|
128
|
-
}
|
|
129
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Response Formatter
|
|
3
|
+
* Utilities for formatting MCP tool responses
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js'
|
|
7
|
+
import type { ToolResponse } from '@/tools/types'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* ResponseFormatter provides methods for creating properly formatted MCP responses
|
|
11
|
+
*/
|
|
12
|
+
export class ResponseFormatter {
|
|
13
|
+
/**
|
|
14
|
+
* Format text content for MCP response
|
|
15
|
+
* @param content - Text content to include in response
|
|
16
|
+
* @returns Properly formatted ToolResponse
|
|
17
|
+
*/
|
|
18
|
+
static text(content: string): ToolResponse {
|
|
19
|
+
return {
|
|
20
|
+
content: [{
|
|
21
|
+
type: 'text',
|
|
22
|
+
text: content
|
|
23
|
+
}]
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Format multiple text blocks for MCP response
|
|
29
|
+
* @param contents - Array of text content
|
|
30
|
+
* @returns Properly formatted ToolResponse with multiple content blocks
|
|
31
|
+
*/
|
|
32
|
+
static multiText(contents: string[]): ToolResponse {
|
|
33
|
+
return {
|
|
34
|
+
content: contents.map(text => ({
|
|
35
|
+
type: 'text' as const,
|
|
36
|
+
text
|
|
37
|
+
}))
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Format error as MCP error (throws)
|
|
43
|
+
* @param message - Error message
|
|
44
|
+
* @param code - MCP error code
|
|
45
|
+
* @throws McpError
|
|
46
|
+
*/
|
|
47
|
+
static error(message: string, code: ErrorCode = ErrorCode.InternalError): never {
|
|
48
|
+
throw new McpError(code, message)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Format error response (returns response with isError flag)
|
|
53
|
+
* @param message - Error message
|
|
54
|
+
* @returns ToolResponse with error flag
|
|
55
|
+
*/
|
|
56
|
+
static errorResponse(message: string): ToolResponse {
|
|
57
|
+
return {
|
|
58
|
+
content: [{
|
|
59
|
+
type: 'text',
|
|
60
|
+
text: `Error: ${message}`
|
|
61
|
+
}],
|
|
62
|
+
isError: true
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Format structured data as formatted text
|
|
68
|
+
* @param data - Object to format
|
|
69
|
+
* @returns Properly formatted ToolResponse
|
|
70
|
+
*/
|
|
71
|
+
static structured(data: Record<string, unknown>): ToolResponse {
|
|
72
|
+
const formatted = Object.entries(data)
|
|
73
|
+
.map(([key, value]) => {
|
|
74
|
+
const formattedValue = typeof value === 'object'
|
|
75
|
+
? JSON.stringify(value, null, 2)
|
|
76
|
+
: String(value)
|
|
77
|
+
return `${key}: ${formattedValue}`
|
|
78
|
+
})
|
|
79
|
+
.join('\n\n')
|
|
80
|
+
|
|
81
|
+
return this.text(formatted)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Format JSON data as pretty-printed text
|
|
86
|
+
* @param data - Data to serialize as JSON
|
|
87
|
+
* @param label - Optional label to prefix the JSON
|
|
88
|
+
* @returns Properly formatted ToolResponse
|
|
89
|
+
*/
|
|
90
|
+
static json(data: unknown, label?: string): ToolResponse {
|
|
91
|
+
const jsonStr = JSON.stringify(data, null, 2)
|
|
92
|
+
const content = label ? `${label}:\n${jsonStr}` : jsonStr
|
|
93
|
+
return this.text(content)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Format a list of items
|
|
98
|
+
* @param items - Array of items to format
|
|
99
|
+
* @param title - Optional title for the list
|
|
100
|
+
* @returns Properly formatted ToolResponse
|
|
101
|
+
*/
|
|
102
|
+
static list(items: string[], title?: string): ToolResponse {
|
|
103
|
+
const listContent = items.map((item, i) => `${i + 1}. ${item}`).join('\n')
|
|
104
|
+
const content = title ? `${title}:\n${listContent}` : listContent
|
|
105
|
+
return this.text(content)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Format a success message
|
|
110
|
+
* @param message - Success message
|
|
111
|
+
* @param details - Optional additional details
|
|
112
|
+
* @returns Properly formatted ToolResponse
|
|
113
|
+
*/
|
|
114
|
+
static success(message: string, details?: Record<string, unknown>): ToolResponse {
|
|
115
|
+
let content = `✓ ${message}`
|
|
116
|
+
if (details) {
|
|
117
|
+
const detailsStr = Object.entries(details)
|
|
118
|
+
.map(([k, v]) => {
|
|
119
|
+
const formatted = (v !== null && typeof v === 'object')
|
|
120
|
+
? JSON.stringify(v)
|
|
121
|
+
: String(v ?? '')
|
|
122
|
+
return ` ${k}: ${formatted}`
|
|
123
|
+
})
|
|
124
|
+
.join('\n')
|
|
125
|
+
content += `\n\nDetails:\n${detailsStr}`
|
|
126
|
+
}
|
|
127
|
+
return this.text(content)
|
|
128
|
+
}
|
|
129
|
+
}
|