claude-brain 0.14.1 → 0.14.2
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 +194 -191
- 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 +254 -254
- package/src/routing/router.ts +1314 -1314
- package/src/routing/search-engine.ts +475 -475
- package/src/routing/types.ts +84 -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 +124 -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
|
@@ -1,103 +1,103 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Get Episode Handler
|
|
3
|
-
* Retrieves an episode by ID or the active episode for a project
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import type { Logger } from 'pino'
|
|
7
|
-
import type { ToolResponse } from '@/tools/types'
|
|
8
|
-
import { getEpisodeService, isServicesInitialized } from '@/server/services'
|
|
9
|
-
import { ToolValidator } from '@/server/utils/validators'
|
|
10
|
-
import { ResponseFormatter } from '@/server/utils/response-formatter'
|
|
11
|
-
import { ErrorHandler } from '@/server/utils/error-handler'
|
|
12
|
-
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js'
|
|
13
|
-
import { GetEpisodeSchema } from './schemas'
|
|
14
|
-
|
|
15
|
-
export async function handleGetEpisode(
|
|
16
|
-
args: unknown,
|
|
17
|
-
logger: Logger
|
|
18
|
-
): Promise<ToolResponse> {
|
|
19
|
-
try {
|
|
20
|
-
const input = ToolValidator.validate(args, GetEpisodeSchema)
|
|
21
|
-
const { episode_id, project_name } = input
|
|
22
|
-
|
|
23
|
-
logger.debug({ episodeId: episode_id, projectName: project_name }, 'Getting episode')
|
|
24
|
-
|
|
25
|
-
if (!isServicesInitialized()) {
|
|
26
|
-
throw new McpError(
|
|
27
|
-
ErrorCode.InternalError,
|
|
28
|
-
'Services not initialized. The server may still be starting up.'
|
|
29
|
-
)
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const episodeService = getEpisodeService()
|
|
33
|
-
if (!episodeService) {
|
|
34
|
-
return ResponseFormatter.text(
|
|
35
|
-
'## Episodic Memory Not Available\n\n' +
|
|
36
|
-
'Episodic memory requires ChromaDB to track conversation sessions.\n\n' +
|
|
37
|
-
'**To enable:**\n' +
|
|
38
|
-
'- Start a ChromaDB server: `chroma run --path /path/to/data`\n' +
|
|
39
|
-
'- Set `CHROMA_URL=http://localhost:8000` in your environment\n' +
|
|
40
|
-
'- Set `knowledge.episodic.enabled=true` in config\n\n' +
|
|
41
|
-
'**Alternative tools that work without ChromaDB:**\n' +
|
|
42
|
-
'- `recall_similar` — search past decisions by semantic similarity\n' +
|
|
43
|
-
'- `get_patterns` — retrieve recognized patterns\n' +
|
|
44
|
-
'- `get_corrections` — retrieve lessons learned\n' +
|
|
45
|
-
'- `smart_context` — get full project context with memory recall'
|
|
46
|
-
)
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
if (episode_id) {
|
|
50
|
-
const episode = await episodeService.getEpisode(episode_id)
|
|
51
|
-
if (!episode) {
|
|
52
|
-
return ResponseFormatter.text(`Episode ${episode_id} not found.`)
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
return ResponseFormatter.json({
|
|
56
|
-
id: episode.id,
|
|
57
|
-
project: episode.project,
|
|
58
|
-
status: episode.status,
|
|
59
|
-
started_at: episode.started_at,
|
|
60
|
-
ended_at: episode.ended_at,
|
|
61
|
-
message_count: episode.message_count,
|
|
62
|
-
token_count: episode.token_count,
|
|
63
|
-
summary: episode.summary,
|
|
64
|
-
related_decisions: episode.related_decisions,
|
|
65
|
-
related_patterns: episode.related_patterns,
|
|
66
|
-
related_corrections: episode.related_corrections
|
|
67
|
-
}, 'Episode')
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
if (project_name) {
|
|
71
|
-
const active = episodeService.getActiveEpisode(project_name)
|
|
72
|
-
if (!active) {
|
|
73
|
-
return ResponseFormatter.text(`No active episode for project "${project_name}".`)
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
return ResponseFormatter.json({
|
|
77
|
-
id: active.id,
|
|
78
|
-
project: active.project,
|
|
79
|
-
status: active.status,
|
|
80
|
-
started_at: active.started_at,
|
|
81
|
-
message_count: active.message_count,
|
|
82
|
-
token_count: active.token_count,
|
|
83
|
-
related_decisions: active.related_decisions,
|
|
84
|
-
related_patterns: active.related_patterns,
|
|
85
|
-
related_corrections: active.related_corrections
|
|
86
|
-
}, 'Active Episode')
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
return ResponseFormatter.text('Provide either episode_id or project_name to get an episode.')
|
|
90
|
-
|
|
91
|
-
} catch (error) {
|
|
92
|
-
ErrorHandler.logError(logger, error, { tool: 'get_episode', args })
|
|
93
|
-
|
|
94
|
-
if (error instanceof McpError) {
|
|
95
|
-
throw error
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
throw new McpError(
|
|
99
|
-
ErrorCode.InternalError,
|
|
100
|
-
`Failed to get episode: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
101
|
-
)
|
|
102
|
-
}
|
|
103
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Get Episode Handler
|
|
3
|
+
* Retrieves an episode by ID or the active episode for a project
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { Logger } from 'pino'
|
|
7
|
+
import type { ToolResponse } from '@/tools/types'
|
|
8
|
+
import { getEpisodeService, isServicesInitialized } from '@/server/services'
|
|
9
|
+
import { ToolValidator } from '@/server/utils/validators'
|
|
10
|
+
import { ResponseFormatter } from '@/server/utils/response-formatter'
|
|
11
|
+
import { ErrorHandler } from '@/server/utils/error-handler'
|
|
12
|
+
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js'
|
|
13
|
+
import { GetEpisodeSchema } from './schemas'
|
|
14
|
+
|
|
15
|
+
export async function handleGetEpisode(
|
|
16
|
+
args: unknown,
|
|
17
|
+
logger: Logger
|
|
18
|
+
): Promise<ToolResponse> {
|
|
19
|
+
try {
|
|
20
|
+
const input = ToolValidator.validate(args, GetEpisodeSchema)
|
|
21
|
+
const { episode_id, project_name } = input
|
|
22
|
+
|
|
23
|
+
logger.debug({ episodeId: episode_id, projectName: project_name }, 'Getting episode')
|
|
24
|
+
|
|
25
|
+
if (!isServicesInitialized()) {
|
|
26
|
+
throw new McpError(
|
|
27
|
+
ErrorCode.InternalError,
|
|
28
|
+
'Services not initialized. The server may still be starting up.'
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const episodeService = getEpisodeService()
|
|
33
|
+
if (!episodeService) {
|
|
34
|
+
return ResponseFormatter.text(
|
|
35
|
+
'## Episodic Memory Not Available\n\n' +
|
|
36
|
+
'Episodic memory requires ChromaDB to track conversation sessions.\n\n' +
|
|
37
|
+
'**To enable:**\n' +
|
|
38
|
+
'- Start a ChromaDB server: `chroma run --path /path/to/data`\n' +
|
|
39
|
+
'- Set `CHROMA_URL=http://localhost:8000` in your environment\n' +
|
|
40
|
+
'- Set `knowledge.episodic.enabled=true` in config\n\n' +
|
|
41
|
+
'**Alternative tools that work without ChromaDB:**\n' +
|
|
42
|
+
'- `recall_similar` — search past decisions by semantic similarity\n' +
|
|
43
|
+
'- `get_patterns` — retrieve recognized patterns\n' +
|
|
44
|
+
'- `get_corrections` — retrieve lessons learned\n' +
|
|
45
|
+
'- `smart_context` — get full project context with memory recall'
|
|
46
|
+
)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (episode_id) {
|
|
50
|
+
const episode = await episodeService.getEpisode(episode_id)
|
|
51
|
+
if (!episode) {
|
|
52
|
+
return ResponseFormatter.text(`Episode ${episode_id} not found.`)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return ResponseFormatter.json({
|
|
56
|
+
id: episode.id,
|
|
57
|
+
project: episode.project,
|
|
58
|
+
status: episode.status,
|
|
59
|
+
started_at: episode.started_at,
|
|
60
|
+
ended_at: episode.ended_at,
|
|
61
|
+
message_count: episode.message_count,
|
|
62
|
+
token_count: episode.token_count,
|
|
63
|
+
summary: episode.summary,
|
|
64
|
+
related_decisions: episode.related_decisions,
|
|
65
|
+
related_patterns: episode.related_patterns,
|
|
66
|
+
related_corrections: episode.related_corrections
|
|
67
|
+
}, 'Episode')
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (project_name) {
|
|
71
|
+
const active = episodeService.getActiveEpisode(project_name)
|
|
72
|
+
if (!active) {
|
|
73
|
+
return ResponseFormatter.text(`No active episode for project "${project_name}".`)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return ResponseFormatter.json({
|
|
77
|
+
id: active.id,
|
|
78
|
+
project: active.project,
|
|
79
|
+
status: active.status,
|
|
80
|
+
started_at: active.started_at,
|
|
81
|
+
message_count: active.message_count,
|
|
82
|
+
token_count: active.token_count,
|
|
83
|
+
related_decisions: active.related_decisions,
|
|
84
|
+
related_patterns: active.related_patterns,
|
|
85
|
+
related_corrections: active.related_corrections
|
|
86
|
+
}, 'Active Episode')
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return ResponseFormatter.text('Provide either episode_id or project_name to get an episode.')
|
|
90
|
+
|
|
91
|
+
} catch (error) {
|
|
92
|
+
ErrorHandler.logError(logger, error, { tool: 'get_episode', args })
|
|
93
|
+
|
|
94
|
+
if (error instanceof McpError) {
|
|
95
|
+
throw error
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
throw new McpError(
|
|
99
|
+
ErrorCode.InternalError,
|
|
100
|
+
`Failed to get episode: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
101
|
+
)
|
|
102
|
+
}
|
|
103
|
+
}
|
|
@@ -1,158 +1,158 @@
|
|
|
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, getVaultService, isServicesInitialized } from '@/server/services'
|
|
9
|
-
import { ToolValidator } from '@/server/utils/validators'
|
|
10
|
-
import { ResponseFormatter } from '@/server/utils/response-formatter'
|
|
11
|
-
import { withMemoryIndicator, formatMemoryStats } from '@/server/utils/memory-indicator'
|
|
12
|
-
import { ErrorHandler } from '@/server/utils/error-handler'
|
|
13
|
-
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js'
|
|
14
|
-
|
|
15
|
-
export async function handleGetPatterns(
|
|
16
|
-
args: unknown,
|
|
17
|
-
logger: Logger
|
|
18
|
-
): Promise<ToolResponse> {
|
|
19
|
-
try {
|
|
20
|
-
const input = args as GetPatternsInput
|
|
21
|
-
const {
|
|
22
|
-
project_name,
|
|
23
|
-
pattern_type,
|
|
24
|
-
limit = 10,
|
|
25
|
-
query
|
|
26
|
-
} = input
|
|
27
|
-
|
|
28
|
-
logger.debug(
|
|
29
|
-
{ project_name, pattern_type, limit, has_query: !!query },
|
|
30
|
-
'Getting patterns'
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
if (!isServicesInitialized()) {
|
|
34
|
-
throw new McpError(
|
|
35
|
-
ErrorCode.InternalError,
|
|
36
|
-
'Memory service not initialized. The server may still be starting up.'
|
|
37
|
-
)
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const memory = getMemoryService()
|
|
41
|
-
const vault = getVaultService()
|
|
42
|
-
|
|
43
|
-
let results: any[]
|
|
44
|
-
|
|
45
|
-
if (query) {
|
|
46
|
-
results = await memory.searchPatterns(query, {
|
|
47
|
-
project: project_name,
|
|
48
|
-
limit,
|
|
49
|
-
minSimilarity: 0.5
|
|
50
|
-
})
|
|
51
|
-
} else {
|
|
52
|
-
results = await memory.getPatterns(project_name, {
|
|
53
|
-
limit,
|
|
54
|
-
pattern_type
|
|
55
|
-
})
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
if (results.length === 0) {
|
|
59
|
-
const message = pattern_type
|
|
60
|
-
? `No patterns of type "${pattern_type}" found${project_name ? ` for project "${project_name}"` : ''}.`
|
|
61
|
-
: `No patterns found${project_name ? ` for project "${project_name}"` : ''}.`
|
|
62
|
-
|
|
63
|
-
logger.warn({ project_name, pattern_type }, 'No patterns found')
|
|
64
|
-
|
|
65
|
-
return ResponseFormatter.text(
|
|
66
|
-
`No patterns found.\n\n${message}\n\nTips:\n` +
|
|
67
|
-
`- Use \`recognize_pattern\` to document patterns you discover\n` +
|
|
68
|
-
`- Review project documentation for documented solutions\n` +
|
|
69
|
-
`- Check project standards for best practices\n`
|
|
70
|
-
)
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
logger.info(
|
|
74
|
-
{ project_name, pattern_type, count: results.length },
|
|
75
|
-
'Patterns retrieved successfully'
|
|
76
|
-
)
|
|
77
|
-
|
|
78
|
-
const projectInfo = project_name ? ` for **${project_name}**` : ''
|
|
79
|
-
const typeInfo = pattern_type ? ` of type **${pattern_type}**` : ''
|
|
80
|
-
|
|
81
|
-
let response = `Found **${results.length} pattern(s)${projectInfo}${typeInfo}:\n\n`
|
|
82
|
-
|
|
83
|
-
results.forEach((pattern: any, index: number) => {
|
|
84
|
-
const num = index + 1
|
|
85
|
-
const metadata = pattern.metadata
|
|
86
|
-
|
|
87
|
-
response += `## ${num}. ${metadata.pattern_type}\n\n`
|
|
88
|
-
response += `**ID:** ${pattern.id}\n`
|
|
89
|
-
response += `**Confidence:** ${metadata.confidence.toFixed(2)}\n`
|
|
90
|
-
response += `**Project:** ${metadata.project}\n\n`
|
|
91
|
-
response += `**Description:** ${pattern.metadata.description}\n\n`
|
|
92
|
-
|
|
93
|
-
if (pattern.metadata.example) {
|
|
94
|
-
response += `**Example:**\n\`\`\`\n${pattern.metadata.example}\n\`\`\`\n\n`
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
if (pattern.metadata.context) {
|
|
98
|
-
response += `**Context:** ${pattern.metadata.context}\n\n`
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
response += `**First Seen:** ${new Date(metadata.first_seen).toLocaleDateString()}\n`
|
|
102
|
-
response += `**Last Seen:** ${new Date(metadata.last_seen).toLocaleDateString()}\n\n`
|
|
103
|
-
response += `**Occurrences:** ${metadata.occurrences}\n\n`
|
|
104
|
-
|
|
105
|
-
if (index < results.length) {
|
|
106
|
-
response += `---\n\n`
|
|
107
|
-
}
|
|
108
|
-
})
|
|
109
|
-
|
|
110
|
-
if (results.length === 0) {
|
|
111
|
-
response += `No patterns documented yet.\n\n` +
|
|
112
|
-
`Use \`recognize_pattern\` to document patterns as you discover them.\n`
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
response += `\n**Next Steps:**\n`
|
|
116
|
-
response += `- Apply these patterns to your current work\n`
|
|
117
|
-
response += `- Recognize new patterns as you discover solutions\n`
|
|
118
|
-
|
|
119
|
-
// Add memory indicator to show Claude Brain helped
|
|
120
|
-
const statsLine = formatMemoryStats({ patterns: results.length })
|
|
121
|
-
return ResponseFormatter.text(withMemoryIndicator(response, results.length) + '\n\n' + statsLine)
|
|
122
|
-
} catch (error) {
|
|
123
|
-
ErrorHandler.logError(logger, error, { tool: 'get_patterns', args })
|
|
124
|
-
|
|
125
|
-
// Provide detailed error messages based on error type
|
|
126
|
-
if (error instanceof Error) {
|
|
127
|
-
if (error.message.includes('ChromaDB') || error.message.includes('collection')) {
|
|
128
|
-
throw new McpError(
|
|
129
|
-
ErrorCode.InternalError,
|
|
130
|
-
`ChromaDB pattern retrieval failed: ${error.message}\n\n` +
|
|
131
|
-
`This may be caused by:\n` +
|
|
132
|
-
`- ChromaDB not running (check if ChromaDB server is started)\n` +
|
|
133
|
-
`- Collections not initialized (try restarting the MCP server)\n` +
|
|
134
|
-
`- Connection issues (verify ChromaDB configuration)\n\n` +
|
|
135
|
-
`Error details: ${error.stack || error.message}`
|
|
136
|
-
)
|
|
137
|
-
}
|
|
138
|
-
if (error.message.includes('not initialized')) {
|
|
139
|
-
throw new McpError(
|
|
140
|
-
ErrorCode.InternalError,
|
|
141
|
-
`Memory service not initialized properly.\n\n` +
|
|
142
|
-
`The server may still be starting up. Please wait a moment and try again.\n` +
|
|
143
|
-
`If the issue persists, restart the MCP server.`
|
|
144
|
-
)
|
|
145
|
-
}
|
|
146
|
-
if (error.message.includes('requires ChromaDB')) {
|
|
147
|
-
throw new McpError(
|
|
148
|
-
ErrorCode.InternalError,
|
|
149
|
-
`Pattern retrieval requires ChromaDB backend.\n\n` +
|
|
150
|
-
`ChromaDB may not be enabled or may have failed to initialize.\n` +
|
|
151
|
-
`Check your configuration and ensure ChromaDB is running.`
|
|
152
|
-
)
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
throw error
|
|
157
|
-
}
|
|
158
|
-
}
|
|
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, getVaultService, isServicesInitialized } from '@/server/services'
|
|
9
|
+
import { ToolValidator } from '@/server/utils/validators'
|
|
10
|
+
import { ResponseFormatter } from '@/server/utils/response-formatter'
|
|
11
|
+
import { withMemoryIndicator, formatMemoryStats } from '@/server/utils/memory-indicator'
|
|
12
|
+
import { ErrorHandler } from '@/server/utils/error-handler'
|
|
13
|
+
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js'
|
|
14
|
+
|
|
15
|
+
export async function handleGetPatterns(
|
|
16
|
+
args: unknown,
|
|
17
|
+
logger: Logger
|
|
18
|
+
): Promise<ToolResponse> {
|
|
19
|
+
try {
|
|
20
|
+
const input = args as GetPatternsInput
|
|
21
|
+
const {
|
|
22
|
+
project_name,
|
|
23
|
+
pattern_type,
|
|
24
|
+
limit = 10,
|
|
25
|
+
query
|
|
26
|
+
} = input
|
|
27
|
+
|
|
28
|
+
logger.debug(
|
|
29
|
+
{ project_name, pattern_type, limit, has_query: !!query },
|
|
30
|
+
'Getting patterns'
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
if (!isServicesInitialized()) {
|
|
34
|
+
throw new McpError(
|
|
35
|
+
ErrorCode.InternalError,
|
|
36
|
+
'Memory service not initialized. The server may still be starting up.'
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const memory = getMemoryService()
|
|
41
|
+
const vault = getVaultService()
|
|
42
|
+
|
|
43
|
+
let results: any[]
|
|
44
|
+
|
|
45
|
+
if (query) {
|
|
46
|
+
results = await memory.searchPatterns(query, {
|
|
47
|
+
project: project_name,
|
|
48
|
+
limit,
|
|
49
|
+
minSimilarity: 0.5
|
|
50
|
+
})
|
|
51
|
+
} else {
|
|
52
|
+
results = await memory.getPatterns(project_name, {
|
|
53
|
+
limit,
|
|
54
|
+
pattern_type
|
|
55
|
+
})
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (results.length === 0) {
|
|
59
|
+
const message = pattern_type
|
|
60
|
+
? `No patterns of type "${pattern_type}" found${project_name ? ` for project "${project_name}"` : ''}.`
|
|
61
|
+
: `No patterns found${project_name ? ` for project "${project_name}"` : ''}.`
|
|
62
|
+
|
|
63
|
+
logger.warn({ project_name, pattern_type }, 'No patterns found')
|
|
64
|
+
|
|
65
|
+
return ResponseFormatter.text(
|
|
66
|
+
`No patterns found.\n\n${message}\n\nTips:\n` +
|
|
67
|
+
`- Use \`recognize_pattern\` to document patterns you discover\n` +
|
|
68
|
+
`- Review project documentation for documented solutions\n` +
|
|
69
|
+
`- Check project standards for best practices\n`
|
|
70
|
+
)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
logger.info(
|
|
74
|
+
{ project_name, pattern_type, count: results.length },
|
|
75
|
+
'Patterns retrieved successfully'
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
const projectInfo = project_name ? ` for **${project_name}**` : ''
|
|
79
|
+
const typeInfo = pattern_type ? ` of type **${pattern_type}**` : ''
|
|
80
|
+
|
|
81
|
+
let response = `Found **${results.length} pattern(s)${projectInfo}${typeInfo}:\n\n`
|
|
82
|
+
|
|
83
|
+
results.forEach((pattern: any, index: number) => {
|
|
84
|
+
const num = index + 1
|
|
85
|
+
const metadata = pattern.metadata
|
|
86
|
+
|
|
87
|
+
response += `## ${num}. ${metadata.pattern_type}\n\n`
|
|
88
|
+
response += `**ID:** ${pattern.id}\n`
|
|
89
|
+
response += `**Confidence:** ${metadata.confidence.toFixed(2)}\n`
|
|
90
|
+
response += `**Project:** ${metadata.project}\n\n`
|
|
91
|
+
response += `**Description:** ${pattern.metadata.description}\n\n`
|
|
92
|
+
|
|
93
|
+
if (pattern.metadata.example) {
|
|
94
|
+
response += `**Example:**\n\`\`\`\n${pattern.metadata.example}\n\`\`\`\n\n`
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (pattern.metadata.context) {
|
|
98
|
+
response += `**Context:** ${pattern.metadata.context}\n\n`
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
response += `**First Seen:** ${new Date(metadata.first_seen).toLocaleDateString()}\n`
|
|
102
|
+
response += `**Last Seen:** ${new Date(metadata.last_seen).toLocaleDateString()}\n\n`
|
|
103
|
+
response += `**Occurrences:** ${metadata.occurrences}\n\n`
|
|
104
|
+
|
|
105
|
+
if (index < results.length) {
|
|
106
|
+
response += `---\n\n`
|
|
107
|
+
}
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
if (results.length === 0) {
|
|
111
|
+
response += `No patterns documented yet.\n\n` +
|
|
112
|
+
`Use \`recognize_pattern\` to document patterns as you discover them.\n`
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
response += `\n**Next Steps:**\n`
|
|
116
|
+
response += `- Apply these patterns to your current work\n`
|
|
117
|
+
response += `- Recognize new patterns as you discover solutions\n`
|
|
118
|
+
|
|
119
|
+
// Add memory indicator to show Claude Brain helped
|
|
120
|
+
const statsLine = formatMemoryStats({ patterns: results.length })
|
|
121
|
+
return ResponseFormatter.text(withMemoryIndicator(response, results.length) + '\n\n' + statsLine)
|
|
122
|
+
} catch (error) {
|
|
123
|
+
ErrorHandler.logError(logger, error, { tool: 'get_patterns', args })
|
|
124
|
+
|
|
125
|
+
// Provide detailed error messages based on error type
|
|
126
|
+
if (error instanceof Error) {
|
|
127
|
+
if (error.message.includes('ChromaDB') || error.message.includes('collection')) {
|
|
128
|
+
throw new McpError(
|
|
129
|
+
ErrorCode.InternalError,
|
|
130
|
+
`ChromaDB pattern retrieval failed: ${error.message}\n\n` +
|
|
131
|
+
`This may be caused by:\n` +
|
|
132
|
+
`- ChromaDB not running (check if ChromaDB server is started)\n` +
|
|
133
|
+
`- Collections not initialized (try restarting the MCP server)\n` +
|
|
134
|
+
`- Connection issues (verify ChromaDB configuration)\n\n` +
|
|
135
|
+
`Error details: ${error.stack || error.message}`
|
|
136
|
+
)
|
|
137
|
+
}
|
|
138
|
+
if (error.message.includes('not initialized')) {
|
|
139
|
+
throw new McpError(
|
|
140
|
+
ErrorCode.InternalError,
|
|
141
|
+
`Memory service not initialized properly.\n\n` +
|
|
142
|
+
`The server may still be starting up. Please wait a moment and try again.\n` +
|
|
143
|
+
`If the issue persists, restart the MCP server.`
|
|
144
|
+
)
|
|
145
|
+
}
|
|
146
|
+
if (error.message.includes('requires ChromaDB')) {
|
|
147
|
+
throw new McpError(
|
|
148
|
+
ErrorCode.InternalError,
|
|
149
|
+
`Pattern retrieval requires ChromaDB backend.\n\n` +
|
|
150
|
+
`ChromaDB may not be enabled or may have failed to initialize.\n` +
|
|
151
|
+
`Check your configuration and ensure ChromaDB is running.`
|
|
152
|
+
)
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
throw error
|
|
157
|
+
}
|
|
158
|
+
}
|
|
@@ -1,63 +1,63 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Get Phase 12 Status Handler
|
|
3
|
-
* Shows status of intelligent automation features
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import type { Logger } from 'pino'
|
|
7
|
-
import type { ToolResponse } from '@/tools/types'
|
|
8
|
-
import { getPhase12Service, isServicesInitialized } from '@/server/services'
|
|
9
|
-
import { ResponseFormatter } from '@/server/utils/response-formatter'
|
|
10
|
-
import { ErrorHandler } from '@/server/utils/error-handler'
|
|
11
|
-
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js'
|
|
12
|
-
|
|
13
|
-
export async function handleGetPhase12Status(
|
|
14
|
-
args: unknown,
|
|
15
|
-
logger: Logger
|
|
16
|
-
): Promise<ToolResponse> {
|
|
17
|
-
try {
|
|
18
|
-
if (!isServicesInitialized()) {
|
|
19
|
-
throw new McpError(
|
|
20
|
-
ErrorCode.InternalError,
|
|
21
|
-
'Services not initialized'
|
|
22
|
-
)
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const phase12 = getPhase12Service()
|
|
26
|
-
|
|
27
|
-
// Get status report
|
|
28
|
-
const report = phase12.getStatusReport()
|
|
29
|
-
|
|
30
|
-
// Add feature status
|
|
31
|
-
const parts: string[] = []
|
|
32
|
-
parts.push(report)
|
|
33
|
-
parts.push('\n---\n')
|
|
34
|
-
parts.push('## Available Phase 12 Tools\n')
|
|
35
|
-
parts.push('| Tool | Description |')
|
|
36
|
-
parts.push('|------|-------------|')
|
|
37
|
-
parts.push('| `smart_context` | Get context + auto-recall relevant memories |')
|
|
38
|
-
parts.push('| `auto_remember` | Auto-detect and save decisions from text |')
|
|
39
|
-
parts.push('| `get_phase12_status` | This status report |')
|
|
40
|
-
parts.push('\n')
|
|
41
|
-
parts.push('## How Automation Works\n')
|
|
42
|
-
parts.push('1. **Proactive Recall**: Questions trigger automatic memory search')
|
|
43
|
-
parts.push('2. **Decision Detection**: Phrases like "I recommend X because Y" are detected')
|
|
44
|
-
parts.push('3. **Auto-Save**: Decisions with >70% confidence are saved automatically')
|
|
45
|
-
parts.push('4. **Pattern Learning**: Your decision patterns are analyzed over time')
|
|
46
|
-
|
|
47
|
-
logger.info('Phase 12 status retrieved')
|
|
48
|
-
|
|
49
|
-
return ResponseFormatter.text(parts.join('\n'))
|
|
50
|
-
|
|
51
|
-
} catch (error) {
|
|
52
|
-
ErrorHandler.logError(logger, error, { tool: 'get_phase12_status', args })
|
|
53
|
-
|
|
54
|
-
if (error instanceof McpError) {
|
|
55
|
-
throw error
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
throw new McpError(
|
|
59
|
-
ErrorCode.InternalError,
|
|
60
|
-
`Failed to get Phase 12 status: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
61
|
-
)
|
|
62
|
-
}
|
|
63
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Get Phase 12 Status Handler
|
|
3
|
+
* Shows status of intelligent automation features
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { Logger } from 'pino'
|
|
7
|
+
import type { ToolResponse } from '@/tools/types'
|
|
8
|
+
import { getPhase12Service, isServicesInitialized } from '@/server/services'
|
|
9
|
+
import { ResponseFormatter } from '@/server/utils/response-formatter'
|
|
10
|
+
import { ErrorHandler } from '@/server/utils/error-handler'
|
|
11
|
+
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js'
|
|
12
|
+
|
|
13
|
+
export async function handleGetPhase12Status(
|
|
14
|
+
args: unknown,
|
|
15
|
+
logger: Logger
|
|
16
|
+
): Promise<ToolResponse> {
|
|
17
|
+
try {
|
|
18
|
+
if (!isServicesInitialized()) {
|
|
19
|
+
throw new McpError(
|
|
20
|
+
ErrorCode.InternalError,
|
|
21
|
+
'Services not initialized'
|
|
22
|
+
)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const phase12 = getPhase12Service()
|
|
26
|
+
|
|
27
|
+
// Get status report
|
|
28
|
+
const report = phase12.getStatusReport()
|
|
29
|
+
|
|
30
|
+
// Add feature status
|
|
31
|
+
const parts: string[] = []
|
|
32
|
+
parts.push(report)
|
|
33
|
+
parts.push('\n---\n')
|
|
34
|
+
parts.push('## Available Phase 12 Tools\n')
|
|
35
|
+
parts.push('| Tool | Description |')
|
|
36
|
+
parts.push('|------|-------------|')
|
|
37
|
+
parts.push('| `smart_context` | Get context + auto-recall relevant memories |')
|
|
38
|
+
parts.push('| `auto_remember` | Auto-detect and save decisions from text |')
|
|
39
|
+
parts.push('| `get_phase12_status` | This status report |')
|
|
40
|
+
parts.push('\n')
|
|
41
|
+
parts.push('## How Automation Works\n')
|
|
42
|
+
parts.push('1. **Proactive Recall**: Questions trigger automatic memory search')
|
|
43
|
+
parts.push('2. **Decision Detection**: Phrases like "I recommend X because Y" are detected')
|
|
44
|
+
parts.push('3. **Auto-Save**: Decisions with >70% confidence are saved automatically')
|
|
45
|
+
parts.push('4. **Pattern Learning**: Your decision patterns are analyzed over time')
|
|
46
|
+
|
|
47
|
+
logger.info('Phase 12 status retrieved')
|
|
48
|
+
|
|
49
|
+
return ResponseFormatter.text(parts.join('\n'))
|
|
50
|
+
|
|
51
|
+
} catch (error) {
|
|
52
|
+
ErrorHandler.logError(logger, error, { tool: 'get_phase12_status', args })
|
|
53
|
+
|
|
54
|
+
if (error instanceof McpError) {
|
|
55
|
+
throw error
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
throw new McpError(
|
|
59
|
+
ErrorCode.InternalError,
|
|
60
|
+
`Failed to get Phase 12 status: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
}
|