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,152 +1,152 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Get Corrections Handler
|
|
3
|
-
* Retrieves corrections and lessons learned from ChromaDB semantic memory
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import type { Logger } from 'pino'
|
|
7
|
-
import type { GetCorrectionsInput, ToolResponse } from '@/tools/types'
|
|
8
|
-
import { getMemoryService, isServicesInitialized } from '@/server/services'
|
|
9
|
-
import { ResponseFormatter } from '@/server/utils/response-formatter'
|
|
10
|
-
import { withMemoryIndicator, formatMemoryStats } from '@/server/utils/memory-indicator'
|
|
11
|
-
import { ErrorHandler } from '@/server/utils/error-handler'
|
|
12
|
-
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js'
|
|
13
|
-
|
|
14
|
-
export async function handleGetCorrections(
|
|
15
|
-
args: unknown,
|
|
16
|
-
logger: Logger
|
|
17
|
-
): Promise<ToolResponse> {
|
|
18
|
-
try {
|
|
19
|
-
const input = args as GetCorrectionsInput
|
|
20
|
-
const {
|
|
21
|
-
project_name,
|
|
22
|
-
limit = 10,
|
|
23
|
-
query
|
|
24
|
-
} = input
|
|
25
|
-
|
|
26
|
-
logger.debug(
|
|
27
|
-
{ project_name, limit, has_query: !!query },
|
|
28
|
-
'Getting corrections'
|
|
29
|
-
)
|
|
30
|
-
|
|
31
|
-
if (!isServicesInitialized()) {
|
|
32
|
-
throw new McpError(
|
|
33
|
-
ErrorCode.InternalError,
|
|
34
|
-
'Memory service not initialized. The server may still be starting up.'
|
|
35
|
-
)
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const memory = getMemoryService()
|
|
39
|
-
|
|
40
|
-
let results:
|
|
41
|
-
|
|
42
|
-
if (query) {
|
|
43
|
-
results = await memory.searchCorrections(query, {
|
|
44
|
-
project: project_name,
|
|
45
|
-
limit,
|
|
46
|
-
minSimilarity: 0.5
|
|
47
|
-
})
|
|
48
|
-
} else {
|
|
49
|
-
results = await memory.getCorrections(project_name, {
|
|
50
|
-
limit
|
|
51
|
-
})
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
if (results.length === 0) {
|
|
55
|
-
const message = project_name
|
|
56
|
-
? `No corrections found for project "${project_name}".`
|
|
57
|
-
: 'No corrections found.'
|
|
58
|
-
|
|
59
|
-
logger.warn({ project_name }, 'No corrections found')
|
|
60
|
-
|
|
61
|
-
return ResponseFormatter.text(
|
|
62
|
-
`No corrections found.\n\n${message}\n\nTips:\n` +
|
|
63
|
-
`- Use \`record_correction\` to document mistakes and lessons learned\n` +
|
|
64
|
-
`- Review past corrections to avoid repeating mistakes\n` +
|
|
65
|
-
`- Check project documentation for best practices\n`
|
|
66
|
-
)
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
logger.info(
|
|
70
|
-
{ project_name, count: results.length },
|
|
71
|
-
'Corrections retrieved successfully'
|
|
72
|
-
)
|
|
73
|
-
|
|
74
|
-
const projectInfo = project_name ? ` for **${project_name}**` : ''
|
|
75
|
-
|
|
76
|
-
let response = `Found **${results.length} correction(s)${projectInfo}:\n\n`
|
|
77
|
-
|
|
78
|
-
results.forEach((correction:
|
|
79
|
-
const num = index + 1
|
|
80
|
-
const metadata = correction.metadata
|
|
81
|
-
|
|
82
|
-
response += `## ${num}. What went wrong\n\n`
|
|
83
|
-
response += `**ID:** ${correction.id}\n`
|
|
84
|
-
response += `**Confidence:** ${metadata.confidence.toFixed(2)}\n`
|
|
85
|
-
response += `**Project:** ${metadata.project}\n\n`
|
|
86
|
-
response += `**Original:** ${metadata.original}\n\n`
|
|
87
|
-
response += `**Correction:** ${metadata.correction}\n\n`
|
|
88
|
-
|
|
89
|
-
if (metadata.reasoning) {
|
|
90
|
-
response += `**Reasoning:** ${metadata.reasoning}\n\n`
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
if (metadata.context) {
|
|
94
|
-
response += `**Context:** ${metadata.context}\n\n`
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
response += `**Recorded:** ${new Date(metadata.created_at).toLocaleDateString()}\n\n`
|
|
98
|
-
|
|
99
|
-
if (index < results.length) {
|
|
100
|
-
response += `---\n\n`
|
|
101
|
-
}
|
|
102
|
-
})
|
|
103
|
-
|
|
104
|
-
if (results.length === 0) {
|
|
105
|
-
response += `No corrections documented yet.\n\n` +
|
|
106
|
-
`Use \`record_correction\` to document mistakes and lessons learned.\n`
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
response += `\n**Next Steps:**\n`
|
|
110
|
-
response += `- Learn from these corrections to avoid mistakes\n`
|
|
111
|
-
response += `- Document new lessons as you discover them\n`
|
|
112
|
-
|
|
113
|
-
// Add memory indicator to show Claude Brain helped
|
|
114
|
-
const statsLine = formatMemoryStats({ corrections: results.length })
|
|
115
|
-
return ResponseFormatter.text(withMemoryIndicator(response, results.length) + '\n\n' + statsLine)
|
|
116
|
-
} catch (error) {
|
|
117
|
-
ErrorHandler.logError(logger, error, { tool: 'get_corrections', args })
|
|
118
|
-
|
|
119
|
-
// Provide detailed error messages based on error type
|
|
120
|
-
if (error instanceof Error) {
|
|
121
|
-
if (error.message.includes('ChromaDB') || error.message.includes('collection')) {
|
|
122
|
-
throw new McpError(
|
|
123
|
-
ErrorCode.InternalError,
|
|
124
|
-
`ChromaDB correction retrieval failed: ${error.message}\n\n` +
|
|
125
|
-
`This may be caused by:\n` +
|
|
126
|
-
`- ChromaDB not running (check if ChromaDB server is started)\n` +
|
|
127
|
-
`- Collections not initialized (try restarting the MCP server)\n` +
|
|
128
|
-
`- Connection issues (verify ChromaDB configuration)\n\n` +
|
|
129
|
-
`Error details: ${error.stack || error.message}`
|
|
130
|
-
)
|
|
131
|
-
}
|
|
132
|
-
if (error.message.includes('not initialized')) {
|
|
133
|
-
throw new McpError(
|
|
134
|
-
ErrorCode.InternalError,
|
|
135
|
-
`Memory service not initialized properly.\n\n` +
|
|
136
|
-
`The server may still be starting up. Please wait a moment and try again.\n` +
|
|
137
|
-
`If the issue persists, restart the MCP server.`
|
|
138
|
-
)
|
|
139
|
-
}
|
|
140
|
-
if (error.message.includes('requires ChromaDB')) {
|
|
141
|
-
throw new McpError(
|
|
142
|
-
ErrorCode.InternalError,
|
|
143
|
-
`Correction retrieval requires ChromaDB backend.\n\n` +
|
|
144
|
-
`ChromaDB may not be enabled or may have failed to initialize.\n` +
|
|
145
|
-
`Check your configuration and ensure ChromaDB is running.`
|
|
146
|
-
)
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
throw error
|
|
151
|
-
}
|
|
152
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Get Corrections Handler
|
|
3
|
+
* Retrieves corrections and lessons learned from ChromaDB semantic memory
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { Logger } from 'pino'
|
|
7
|
+
import type { GetCorrectionsInput, ToolResponse } from '@/tools/types'
|
|
8
|
+
import { getMemoryService, isServicesInitialized } from '@/server/services'
|
|
9
|
+
import { ResponseFormatter } from '@/server/utils/response-formatter'
|
|
10
|
+
import { withMemoryIndicator, formatMemoryStats } from '@/server/utils/memory-indicator'
|
|
11
|
+
import { ErrorHandler } from '@/server/utils/error-handler'
|
|
12
|
+
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js'
|
|
13
|
+
|
|
14
|
+
export async function handleGetCorrections(
|
|
15
|
+
args: unknown,
|
|
16
|
+
logger: Logger
|
|
17
|
+
): Promise<ToolResponse> {
|
|
18
|
+
try {
|
|
19
|
+
const input = args as GetCorrectionsInput
|
|
20
|
+
const {
|
|
21
|
+
project_name,
|
|
22
|
+
limit = 10,
|
|
23
|
+
query
|
|
24
|
+
} = input
|
|
25
|
+
|
|
26
|
+
logger.debug(
|
|
27
|
+
{ project_name, limit, has_query: !!query },
|
|
28
|
+
'Getting corrections'
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
if (!isServicesInitialized()) {
|
|
32
|
+
throw new McpError(
|
|
33
|
+
ErrorCode.InternalError,
|
|
34
|
+
'Memory service not initialized. The server may still be starting up.'
|
|
35
|
+
)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const memory = getMemoryService()
|
|
39
|
+
|
|
40
|
+
let results: Record<string, unknown>[]
|
|
41
|
+
|
|
42
|
+
if (query) {
|
|
43
|
+
results = await memory.searchCorrections(query, {
|
|
44
|
+
project: project_name,
|
|
45
|
+
limit,
|
|
46
|
+
minSimilarity: 0.5
|
|
47
|
+
})
|
|
48
|
+
} else {
|
|
49
|
+
results = await memory.getCorrections(project_name, {
|
|
50
|
+
limit
|
|
51
|
+
})
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (results.length === 0) {
|
|
55
|
+
const message = project_name
|
|
56
|
+
? `No corrections found for project "${project_name}".`
|
|
57
|
+
: 'No corrections found.'
|
|
58
|
+
|
|
59
|
+
logger.warn({ project_name }, 'No corrections found')
|
|
60
|
+
|
|
61
|
+
return ResponseFormatter.text(
|
|
62
|
+
`No corrections found.\n\n${message}\n\nTips:\n` +
|
|
63
|
+
`- Use \`record_correction\` to document mistakes and lessons learned\n` +
|
|
64
|
+
`- Review past corrections to avoid repeating mistakes\n` +
|
|
65
|
+
`- Check project documentation for best practices\n`
|
|
66
|
+
)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
logger.info(
|
|
70
|
+
{ project_name, count: results.length },
|
|
71
|
+
'Corrections retrieved successfully'
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
const projectInfo = project_name ? ` for **${project_name}**` : ''
|
|
75
|
+
|
|
76
|
+
let response = `Found **${results.length} correction(s)${projectInfo}:\n\n`
|
|
77
|
+
|
|
78
|
+
results.forEach((correction: Record<string, unknown>, index: number) => {
|
|
79
|
+
const num = index + 1
|
|
80
|
+
const metadata = (correction.metadata || {}) as Record<string, unknown>
|
|
81
|
+
|
|
82
|
+
response += `## ${num}. What went wrong\n\n`
|
|
83
|
+
response += `**ID:** ${correction.id}\n`
|
|
84
|
+
response += `**Confidence:** ${Number(metadata.confidence || 0).toFixed(2)}\n`
|
|
85
|
+
response += `**Project:** ${metadata.project}\n\n`
|
|
86
|
+
response += `**Original:** ${metadata.original}\n\n`
|
|
87
|
+
response += `**Correction:** ${metadata.correction}\n\n`
|
|
88
|
+
|
|
89
|
+
if (metadata.reasoning) {
|
|
90
|
+
response += `**Reasoning:** ${metadata.reasoning}\n\n`
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (metadata.context) {
|
|
94
|
+
response += `**Context:** ${metadata.context}\n\n`
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
response += `**Recorded:** ${new Date(metadata.created_at as string).toLocaleDateString()}\n\n`
|
|
98
|
+
|
|
99
|
+
if (index < results.length) {
|
|
100
|
+
response += `---\n\n`
|
|
101
|
+
}
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
if (results.length === 0) {
|
|
105
|
+
response += `No corrections documented yet.\n\n` +
|
|
106
|
+
`Use \`record_correction\` to document mistakes and lessons learned.\n`
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
response += `\n**Next Steps:**\n`
|
|
110
|
+
response += `- Learn from these corrections to avoid mistakes\n`
|
|
111
|
+
response += `- Document new lessons as you discover them\n`
|
|
112
|
+
|
|
113
|
+
// Add memory indicator to show Claude Brain helped
|
|
114
|
+
const statsLine = formatMemoryStats({ corrections: results.length })
|
|
115
|
+
return ResponseFormatter.text(withMemoryIndicator(response, results.length) + '\n\n' + statsLine)
|
|
116
|
+
} catch (error) {
|
|
117
|
+
ErrorHandler.logError(logger, error, { tool: 'get_corrections', args })
|
|
118
|
+
|
|
119
|
+
// Provide detailed error messages based on error type
|
|
120
|
+
if (error instanceof Error) {
|
|
121
|
+
if (error.message.includes('ChromaDB') || error.message.includes('collection')) {
|
|
122
|
+
throw new McpError(
|
|
123
|
+
ErrorCode.InternalError,
|
|
124
|
+
`ChromaDB correction retrieval failed: ${error.message}\n\n` +
|
|
125
|
+
`This may be caused by:\n` +
|
|
126
|
+
`- ChromaDB not running (check if ChromaDB server is started)\n` +
|
|
127
|
+
`- Collections not initialized (try restarting the MCP server)\n` +
|
|
128
|
+
`- Connection issues (verify ChromaDB configuration)\n\n` +
|
|
129
|
+
`Error details: ${error.stack || error.message}`
|
|
130
|
+
)
|
|
131
|
+
}
|
|
132
|
+
if (error.message.includes('not initialized')) {
|
|
133
|
+
throw new McpError(
|
|
134
|
+
ErrorCode.InternalError,
|
|
135
|
+
`Memory service not initialized properly.\n\n` +
|
|
136
|
+
`The server may still be starting up. Please wait a moment and try again.\n` +
|
|
137
|
+
`If the issue persists, restart the MCP server.`
|
|
138
|
+
)
|
|
139
|
+
}
|
|
140
|
+
if (error.message.includes('requires ChromaDB')) {
|
|
141
|
+
throw new McpError(
|
|
142
|
+
ErrorCode.InternalError,
|
|
143
|
+
`Correction retrieval requires ChromaDB backend.\n\n` +
|
|
144
|
+
`ChromaDB may not be enabled or may have failed to initialize.\n` +
|
|
145
|
+
`Check your configuration and ensure ChromaDB is running.`
|
|
146
|
+
)
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
throw error
|
|
151
|
+
}
|
|
152
|
+
}
|
|
@@ -1,156 +1,156 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Get Patterns Handler
|
|
3
|
-
* Retrieves recognized patterns from ChromaDB semantic memory
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import type { Logger } from 'pino'
|
|
7
|
-
import type { GetPatternsInput, ToolResponse } from '@/tools/types'
|
|
8
|
-
import { getMemoryService, isServicesInitialized } from '@/server/services'
|
|
9
|
-
import { ResponseFormatter } from '@/server/utils/response-formatter'
|
|
10
|
-
import { withMemoryIndicator, formatMemoryStats } from '@/server/utils/memory-indicator'
|
|
11
|
-
import { ErrorHandler } from '@/server/utils/error-handler'
|
|
12
|
-
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js'
|
|
13
|
-
|
|
14
|
-
export async function handleGetPatterns(
|
|
15
|
-
args: unknown,
|
|
16
|
-
logger: Logger
|
|
17
|
-
): Promise<ToolResponse> {
|
|
18
|
-
try {
|
|
19
|
-
const input = args as GetPatternsInput
|
|
20
|
-
const {
|
|
21
|
-
project_name,
|
|
22
|
-
pattern_type,
|
|
23
|
-
limit = 10,
|
|
24
|
-
query
|
|
25
|
-
} = input
|
|
26
|
-
|
|
27
|
-
logger.debug(
|
|
28
|
-
{ project_name, pattern_type, limit, has_query: !!query },
|
|
29
|
-
'Getting patterns'
|
|
30
|
-
)
|
|
31
|
-
|
|
32
|
-
if (!isServicesInitialized()) {
|
|
33
|
-
throw new McpError(
|
|
34
|
-
ErrorCode.InternalError,
|
|
35
|
-
'Memory service not initialized. The server may still be starting up.'
|
|
36
|
-
)
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const memory = getMemoryService()
|
|
40
|
-
|
|
41
|
-
let results:
|
|
42
|
-
|
|
43
|
-
if (query) {
|
|
44
|
-
results = await memory.searchPatterns(query, {
|
|
45
|
-
project: project_name,
|
|
46
|
-
limit,
|
|
47
|
-
minSimilarity: 0.5
|
|
48
|
-
})
|
|
49
|
-
} else {
|
|
50
|
-
results = await memory.getPatterns(project_name, {
|
|
51
|
-
limit,
|
|
52
|
-
pattern_type
|
|
53
|
-
})
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
if (results.length === 0) {
|
|
57
|
-
const message = pattern_type
|
|
58
|
-
? `No patterns of type "${pattern_type}" found${project_name ? ` for project "${project_name}"` : ''}.`
|
|
59
|
-
: `No patterns found${project_name ? ` for project "${project_name}"` : ''}.`
|
|
60
|
-
|
|
61
|
-
logger.warn({ project_name, pattern_type }, 'No patterns found')
|
|
62
|
-
|
|
63
|
-
return ResponseFormatter.text(
|
|
64
|
-
`No patterns found.\n\n${message}\n\nTips:\n` +
|
|
65
|
-
`- Use \`recognize_pattern\` to document patterns you discover\n` +
|
|
66
|
-
`- Review project documentation for documented solutions\n` +
|
|
67
|
-
`- Check project standards for best practices\n`
|
|
68
|
-
)
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
logger.info(
|
|
72
|
-
{ project_name, pattern_type, count: results.length },
|
|
73
|
-
'Patterns retrieved successfully'
|
|
74
|
-
)
|
|
75
|
-
|
|
76
|
-
const projectInfo = project_name ? ` for **${project_name}**` : ''
|
|
77
|
-
const typeInfo = pattern_type ? ` of type **${pattern_type}**` : ''
|
|
78
|
-
|
|
79
|
-
let response = `Found **${results.length} pattern(s)${projectInfo}${typeInfo}:\n\n`
|
|
80
|
-
|
|
81
|
-
results.forEach((pattern:
|
|
82
|
-
const num = index + 1
|
|
83
|
-
const metadata = pattern.metadata
|
|
84
|
-
|
|
85
|
-
response += `## ${num}. ${metadata.pattern_type}\n\n`
|
|
86
|
-
response += `**ID:** ${pattern.id}\n`
|
|
87
|
-
response += `**Confidence:** ${metadata.confidence.toFixed(2)}\n`
|
|
88
|
-
response += `**Project:** ${metadata.project}\n\n`
|
|
89
|
-
response += `**Description:** ${
|
|
90
|
-
|
|
91
|
-
if (
|
|
92
|
-
response += `**Example:**\n\`\`\`\n${
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
if (
|
|
96
|
-
response += `**Context:** ${
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
response += `**First Seen:** ${new Date(metadata.first_seen).toLocaleDateString()}\n`
|
|
100
|
-
response += `**Last Seen:** ${new Date(metadata.last_seen).toLocaleDateString()}\n\n`
|
|
101
|
-
response += `**Occurrences:** ${metadata.occurrences}\n\n`
|
|
102
|
-
|
|
103
|
-
if (index < results.length) {
|
|
104
|
-
response += `---\n\n`
|
|
105
|
-
}
|
|
106
|
-
})
|
|
107
|
-
|
|
108
|
-
if (results.length === 0) {
|
|
109
|
-
response += `No patterns documented yet.\n\n` +
|
|
110
|
-
`Use \`recognize_pattern\` to document patterns as you discover them.\n`
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
response += `\n**Next Steps:**\n`
|
|
114
|
-
response += `- Apply these patterns to your current work\n`
|
|
115
|
-
response += `- Recognize new patterns as you discover solutions\n`
|
|
116
|
-
|
|
117
|
-
// Add memory indicator to show Claude Brain helped
|
|
118
|
-
const statsLine = formatMemoryStats({ patterns: results.length })
|
|
119
|
-
return ResponseFormatter.text(withMemoryIndicator(response, results.length) + '\n\n' + statsLine)
|
|
120
|
-
} catch (error) {
|
|
121
|
-
ErrorHandler.logError(logger, error, { tool: 'get_patterns', args })
|
|
122
|
-
|
|
123
|
-
// Provide detailed error messages based on error type
|
|
124
|
-
if (error instanceof Error) {
|
|
125
|
-
if (error.message.includes('ChromaDB') || error.message.includes('collection')) {
|
|
126
|
-
throw new McpError(
|
|
127
|
-
ErrorCode.InternalError,
|
|
128
|
-
`ChromaDB pattern retrieval failed: ${error.message}\n\n` +
|
|
129
|
-
`This may be caused by:\n` +
|
|
130
|
-
`- ChromaDB not running (check if ChromaDB server is started)\n` +
|
|
131
|
-
`- Collections not initialized (try restarting the MCP server)\n` +
|
|
132
|
-
`- Connection issues (verify ChromaDB configuration)\n\n` +
|
|
133
|
-
`Error details: ${error.stack || error.message}`
|
|
134
|
-
)
|
|
135
|
-
}
|
|
136
|
-
if (error.message.includes('not initialized')) {
|
|
137
|
-
throw new McpError(
|
|
138
|
-
ErrorCode.InternalError,
|
|
139
|
-
`Memory service not initialized properly.\n\n` +
|
|
140
|
-
`The server may still be starting up. Please wait a moment and try again.\n` +
|
|
141
|
-
`If the issue persists, restart the MCP server.`
|
|
142
|
-
)
|
|
143
|
-
}
|
|
144
|
-
if (error.message.includes('requires ChromaDB')) {
|
|
145
|
-
throw new McpError(
|
|
146
|
-
ErrorCode.InternalError,
|
|
147
|
-
`Pattern retrieval requires ChromaDB backend.\n\n` +
|
|
148
|
-
`ChromaDB may not be enabled or may have failed to initialize.\n` +
|
|
149
|
-
`Check your configuration and ensure ChromaDB is running.`
|
|
150
|
-
)
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
throw error
|
|
155
|
-
}
|
|
156
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Get Patterns Handler
|
|
3
|
+
* Retrieves recognized patterns from ChromaDB semantic memory
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { Logger } from 'pino'
|
|
7
|
+
import type { GetPatternsInput, ToolResponse } from '@/tools/types'
|
|
8
|
+
import { getMemoryService, isServicesInitialized } from '@/server/services'
|
|
9
|
+
import { ResponseFormatter } from '@/server/utils/response-formatter'
|
|
10
|
+
import { withMemoryIndicator, formatMemoryStats } from '@/server/utils/memory-indicator'
|
|
11
|
+
import { ErrorHandler } from '@/server/utils/error-handler'
|
|
12
|
+
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js'
|
|
13
|
+
|
|
14
|
+
export async function handleGetPatterns(
|
|
15
|
+
args: unknown,
|
|
16
|
+
logger: Logger
|
|
17
|
+
): Promise<ToolResponse> {
|
|
18
|
+
try {
|
|
19
|
+
const input = args as GetPatternsInput
|
|
20
|
+
const {
|
|
21
|
+
project_name,
|
|
22
|
+
pattern_type,
|
|
23
|
+
limit = 10,
|
|
24
|
+
query
|
|
25
|
+
} = input
|
|
26
|
+
|
|
27
|
+
logger.debug(
|
|
28
|
+
{ project_name, pattern_type, limit, has_query: !!query },
|
|
29
|
+
'Getting patterns'
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
if (!isServicesInitialized()) {
|
|
33
|
+
throw new McpError(
|
|
34
|
+
ErrorCode.InternalError,
|
|
35
|
+
'Memory service not initialized. The server may still be starting up.'
|
|
36
|
+
)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const memory = getMemoryService()
|
|
40
|
+
|
|
41
|
+
let results: Record<string, unknown>[]
|
|
42
|
+
|
|
43
|
+
if (query) {
|
|
44
|
+
results = await memory.searchPatterns(query, {
|
|
45
|
+
project: project_name,
|
|
46
|
+
limit,
|
|
47
|
+
minSimilarity: 0.5
|
|
48
|
+
})
|
|
49
|
+
} else {
|
|
50
|
+
results = await memory.getPatterns(project_name, {
|
|
51
|
+
limit,
|
|
52
|
+
pattern_type
|
|
53
|
+
})
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (results.length === 0) {
|
|
57
|
+
const message = pattern_type
|
|
58
|
+
? `No patterns of type "${pattern_type}" found${project_name ? ` for project "${project_name}"` : ''}.`
|
|
59
|
+
: `No patterns found${project_name ? ` for project "${project_name}"` : ''}.`
|
|
60
|
+
|
|
61
|
+
logger.warn({ project_name, pattern_type }, 'No patterns found')
|
|
62
|
+
|
|
63
|
+
return ResponseFormatter.text(
|
|
64
|
+
`No patterns found.\n\n${message}\n\nTips:\n` +
|
|
65
|
+
`- Use \`recognize_pattern\` to document patterns you discover\n` +
|
|
66
|
+
`- Review project documentation for documented solutions\n` +
|
|
67
|
+
`- Check project standards for best practices\n`
|
|
68
|
+
)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
logger.info(
|
|
72
|
+
{ project_name, pattern_type, count: results.length },
|
|
73
|
+
'Patterns retrieved successfully'
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
const projectInfo = project_name ? ` for **${project_name}**` : ''
|
|
77
|
+
const typeInfo = pattern_type ? ` of type **${pattern_type}**` : ''
|
|
78
|
+
|
|
79
|
+
let response = `Found **${results.length} pattern(s)${projectInfo}${typeInfo}:\n\n`
|
|
80
|
+
|
|
81
|
+
results.forEach((pattern: Record<string, unknown>, index: number) => {
|
|
82
|
+
const num = index + 1
|
|
83
|
+
const metadata = (pattern.metadata || {}) as Record<string, unknown>
|
|
84
|
+
|
|
85
|
+
response += `## ${num}. ${metadata.pattern_type}\n\n`
|
|
86
|
+
response += `**ID:** ${pattern.id}\n`
|
|
87
|
+
response += `**Confidence:** ${Number(metadata.confidence || 0).toFixed(2)}\n`
|
|
88
|
+
response += `**Project:** ${metadata.project}\n\n`
|
|
89
|
+
response += `**Description:** ${metadata.description}\n\n`
|
|
90
|
+
|
|
91
|
+
if (metadata.example) {
|
|
92
|
+
response += `**Example:**\n\`\`\`\n${metadata.example}\n\`\`\`\n\n`
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (metadata.context) {
|
|
96
|
+
response += `**Context:** ${metadata.context}\n\n`
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
response += `**First Seen:** ${new Date(metadata.first_seen as string).toLocaleDateString()}\n`
|
|
100
|
+
response += `**Last Seen:** ${new Date(metadata.last_seen as string).toLocaleDateString()}\n\n`
|
|
101
|
+
response += `**Occurrences:** ${metadata.occurrences}\n\n`
|
|
102
|
+
|
|
103
|
+
if (index < results.length) {
|
|
104
|
+
response += `---\n\n`
|
|
105
|
+
}
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
if (results.length === 0) {
|
|
109
|
+
response += `No patterns documented yet.\n\n` +
|
|
110
|
+
`Use \`recognize_pattern\` to document patterns as you discover them.\n`
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
response += `\n**Next Steps:**\n`
|
|
114
|
+
response += `- Apply these patterns to your current work\n`
|
|
115
|
+
response += `- Recognize new patterns as you discover solutions\n`
|
|
116
|
+
|
|
117
|
+
// Add memory indicator to show Claude Brain helped
|
|
118
|
+
const statsLine = formatMemoryStats({ patterns: results.length })
|
|
119
|
+
return ResponseFormatter.text(withMemoryIndicator(response, results.length) + '\n\n' + statsLine)
|
|
120
|
+
} catch (error) {
|
|
121
|
+
ErrorHandler.logError(logger, error, { tool: 'get_patterns', args })
|
|
122
|
+
|
|
123
|
+
// Provide detailed error messages based on error type
|
|
124
|
+
if (error instanceof Error) {
|
|
125
|
+
if (error.message.includes('ChromaDB') || error.message.includes('collection')) {
|
|
126
|
+
throw new McpError(
|
|
127
|
+
ErrorCode.InternalError,
|
|
128
|
+
`ChromaDB pattern retrieval failed: ${error.message}\n\n` +
|
|
129
|
+
`This may be caused by:\n` +
|
|
130
|
+
`- ChromaDB not running (check if ChromaDB server is started)\n` +
|
|
131
|
+
`- Collections not initialized (try restarting the MCP server)\n` +
|
|
132
|
+
`- Connection issues (verify ChromaDB configuration)\n\n` +
|
|
133
|
+
`Error details: ${error.stack || error.message}`
|
|
134
|
+
)
|
|
135
|
+
}
|
|
136
|
+
if (error.message.includes('not initialized')) {
|
|
137
|
+
throw new McpError(
|
|
138
|
+
ErrorCode.InternalError,
|
|
139
|
+
`Memory service not initialized properly.\n\n` +
|
|
140
|
+
`The server may still be starting up. Please wait a moment and try again.\n` +
|
|
141
|
+
`If the issue persists, restart the MCP server.`
|
|
142
|
+
)
|
|
143
|
+
}
|
|
144
|
+
if (error.message.includes('requires ChromaDB')) {
|
|
145
|
+
throw new McpError(
|
|
146
|
+
ErrorCode.InternalError,
|
|
147
|
+
`Pattern retrieval requires ChromaDB backend.\n\n` +
|
|
148
|
+
`ChromaDB may not be enabled or may have failed to initialize.\n` +
|
|
149
|
+
`Check your configuration and ensure ChromaDB is running.`
|
|
150
|
+
)
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
throw error
|
|
155
|
+
}
|
|
156
|
+
}
|