claude-brain 0.14.2 → 0.14.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +191 -191
- package/VERSION +1 -1
- package/assets/CLAUDE-unified.md +11 -11
- package/assets/CLAUDE.md +11 -11
- package/bunfig.toml +8 -8
- package/package.json +80 -80
- package/packs/backend/node.json +173 -173
- package/packs/core/javascript.json +176 -176
- package/packs/core/typescript.json +222 -222
- package/packs/frontend/react.json +254 -254
- package/packs/meta/testing.json +172 -172
- package/src/automation/auto-context.ts +240 -240
- package/src/automation/decision-detector.ts +452 -452
- package/src/automation/index.ts +11 -11
- package/src/automation/phase12-manager.ts +456 -456
- package/src/automation/proactive-recall.ts +373 -373
- package/src/automation/project-detector.ts +310 -310
- package/src/automation/repo-scanner.ts +205 -205
- package/src/cli/auto-setup.ts +82 -82
- package/src/cli/bin.ts +202 -202
- package/src/cli/commands/chroma.ts +573 -573
- package/src/cli/commands/git-hook.ts +189 -189
- package/src/cli/commands/hooks.ts +213 -213
- package/src/cli/commands/init.ts +122 -122
- package/src/cli/commands/install-mcp.ts +92 -92
- package/src/cli/commands/pack.ts +197 -197
- package/src/cli/commands/serve.ts +167 -167
- package/src/cli/commands/start.ts +42 -42
- package/src/cli/commands/uninstall-mcp.ts +41 -41
- package/src/cli/commands/update.ts +121 -121
- package/src/cli/diagnose.ts +4 -4
- package/src/cli/health-check.ts +4 -4
- package/src/cli/migrate-chroma.ts +106 -106
- package/src/cli/setup.ts +4 -4
- package/src/cli/ui/animations.ts +80 -80
- package/src/cli/ui/components.ts +82 -82
- package/src/cli/ui/index.ts +4 -4
- package/src/cli/ui/logo.ts +36 -36
- package/src/cli/ui/theme.ts +55 -55
- package/src/config/defaults.ts +50 -50
- package/src/config/home.ts +55 -55
- package/src/config/index.ts +7 -7
- package/src/config/loader.ts +166 -166
- package/src/config/migration.ts +76 -76
- package/src/config/schema.ts +360 -360
- package/src/config/validator.ts +184 -184
- package/src/config/watcher.ts +86 -86
- package/src/context/assembler.ts +398 -398
- package/src/context/cache-manager.ts +101 -101
- package/src/context/formatter.ts +84 -84
- package/src/context/hierarchy.ts +85 -85
- package/src/context/index.ts +83 -83
- package/src/context/progress-tracker.ts +174 -174
- package/src/context/standards-manager.ts +287 -287
- package/src/context/types.ts +252 -252
- package/src/context/validator.ts +58 -58
- package/src/diagnostics/index.ts +123 -123
- package/src/health/index.ts +229 -229
- package/src/hooks/brain-hook.ts +112 -112
- package/src/hooks/capture.ts +168 -168
- package/src/hooks/deduplicator.ts +72 -72
- package/src/hooks/git-capture.ts +109 -109
- package/src/hooks/git-hook-installer.ts +207 -207
- package/src/hooks/index.ts +20 -20
- package/src/hooks/installer.ts +191 -194
- package/src/hooks/passive-classifier.ts +366 -366
- package/src/hooks/queue.ts +129 -129
- package/src/hooks/session-tracker.ts +275 -275
- package/src/hooks/types.ts +47 -47
- package/src/index.ts +7 -7
- package/src/intelligence/cross-project/affinity.ts +162 -162
- package/src/intelligence/cross-project/generalizer.ts +283 -283
- package/src/intelligence/cross-project/index.ts +13 -13
- package/src/intelligence/cross-project/transfer.ts +201 -201
- package/src/intelligence/index.ts +24 -24
- package/src/intelligence/optimization/index.ts +10 -10
- package/src/intelligence/optimization/precompute.ts +202 -202
- package/src/intelligence/optimization/semantic-cache.ts +207 -207
- package/src/intelligence/prediction/context-anticipator.ts +198 -198
- package/src/intelligence/prediction/decision-predictor.ts +184 -184
- package/src/intelligence/prediction/index.ts +13 -13
- package/src/intelligence/prediction/recommender.ts +268 -268
- package/src/intelligence/reasoning/chain-retrieval.ts +247 -247
- package/src/intelligence/reasoning/counterfactual.ts +248 -248
- package/src/intelligence/reasoning/index.ts +13 -13
- package/src/intelligence/reasoning/synthesizer.ts +169 -169
- package/src/intelligence/temporal/evolution.ts +197 -197
- package/src/intelligence/temporal/index.ts +16 -16
- package/src/intelligence/temporal/query-processor.ts +190 -190
- package/src/intelligence/temporal/timeline.ts +259 -259
- package/src/intelligence/temporal/trends.ts +263 -263
- package/src/knowledge/entity-extractor.ts +416 -416
- package/src/knowledge/graph/builder.ts +185 -185
- package/src/knowledge/graph/linker.ts +201 -201
- package/src/knowledge/graph/memory-graph.ts +359 -359
- package/src/knowledge/graph/schema.ts +99 -99
- package/src/knowledge/graph/search.ts +168 -168
- package/src/knowledge/relationship-extractor.ts +108 -108
- package/src/memory/chroma/client.ts +174 -174
- package/src/memory/chroma/collection-manager.ts +94 -94
- package/src/memory/chroma/config.ts +57 -57
- package/src/memory/chroma/embeddings.ts +153 -153
- package/src/memory/chroma/index.ts +82 -82
- package/src/memory/chroma/migration.ts +270 -270
- package/src/memory/chroma/schemas.ts +69 -69
- package/src/memory/chroma/search.ts +315 -315
- package/src/memory/chroma/store.ts +741 -741
- package/src/memory/consolidation/archiver.ts +164 -164
- package/src/memory/consolidation/merger.ts +186 -186
- package/src/memory/consolidation/scorer.ts +138 -138
- package/src/memory/context-builder.ts +236 -236
- package/src/memory/database.ts +169 -169
- package/src/memory/embedding-utils.ts +156 -156
- package/src/memory/embeddings.ts +226 -226
- package/src/memory/episodic/detector.ts +108 -108
- package/src/memory/episodic/manager.ts +351 -351
- package/src/memory/episodic/summarizer.ts +179 -179
- package/src/memory/episodic/types.ts +52 -52
- package/src/memory/index.ts +582 -582
- package/src/memory/knowledge-extractor.ts +455 -455
- package/src/memory/learning.ts +378 -378
- package/src/memory/patterns.ts +396 -396
- package/src/memory/schema.ts +88 -88
- package/src/memory/search.ts +309 -309
- package/src/memory/store.ts +787 -787
- package/src/memory/types.ts +121 -121
- package/src/orchestrator/coordinator.ts +272 -272
- package/src/orchestrator/decision-logger.ts +228 -228
- package/src/orchestrator/event-emitter.ts +198 -198
- package/src/orchestrator/event-queue.ts +184 -184
- package/src/orchestrator/handlers/base-handler.ts +70 -70
- package/src/orchestrator/handlers/context-handler.ts +73 -73
- package/src/orchestrator/handlers/decision-handler.ts +204 -204
- package/src/orchestrator/handlers/index.ts +10 -10
- package/src/orchestrator/handlers/status-handler.ts +131 -131
- package/src/orchestrator/handlers/task-handler.ts +171 -171
- package/src/orchestrator/index.ts +275 -275
- package/src/orchestrator/task-parser.ts +284 -284
- package/src/orchestrator/types.ts +98 -98
- package/src/packs/index.ts +9 -9
- package/src/packs/loader.ts +134 -134
- package/src/packs/manager.ts +204 -204
- package/src/packs/ranker.ts +78 -78
- package/src/packs/types.ts +81 -81
- package/src/phase12/index.ts +5 -5
- package/src/retrieval/bm25/index.ts +300 -300
- package/src/retrieval/bm25/tokenizer.ts +184 -184
- package/src/retrieval/feedback/adaptive.ts +223 -223
- package/src/retrieval/feedback/index.ts +16 -16
- package/src/retrieval/feedback/metrics.ts +223 -223
- package/src/retrieval/feedback/store.ts +283 -283
- package/src/retrieval/fusion/index.ts +194 -194
- package/src/retrieval/fusion/rrf.ts +163 -163
- package/src/retrieval/index.ts +12 -12
- package/src/retrieval/pipeline.ts +375 -375
- package/src/retrieval/query/expander.ts +198 -198
- package/src/retrieval/query/index.ts +27 -27
- package/src/retrieval/query/intent-classifier.ts +236 -236
- package/src/retrieval/query/temporal-parser.ts +295 -295
- package/src/retrieval/reranker/index.ts +188 -188
- package/src/retrieval/reranker/model.ts +95 -95
- package/src/retrieval/service.ts +125 -125
- package/src/retrieval/types.ts +162 -162
- package/src/routing/entity-extractor.ts +428 -428
- package/src/routing/intent-classifier.ts +436 -436
- package/src/routing/response-filter.ts +258 -254
- package/src/routing/router.ts +1322 -1314
- package/src/routing/search-engine.ts +475 -475
- package/src/routing/types.ts +94 -84
- package/src/scripts/health-check.ts +118 -118
- package/src/scripts/setup.ts +122 -122
- package/src/server/handlers/call-tool.ts +156 -156
- package/src/server/handlers/index.ts +9 -9
- package/src/server/handlers/list-tools.ts +35 -35
- package/src/server/handlers/tools/analyze-decision-evolution.ts +151 -151
- package/src/server/handlers/tools/auto-remember.ts +200 -200
- package/src/server/handlers/tools/brain.ts +85 -85
- package/src/server/handlers/tools/create-project.ts +135 -135
- package/src/server/handlers/tools/detect-trends.ts +144 -144
- package/src/server/handlers/tools/find-cross-project-patterns.ts +168 -168
- package/src/server/handlers/tools/get-activity-log.ts +194 -194
- package/src/server/handlers/tools/get-code-standards.ts +124 -124
- package/src/server/handlers/tools/get-corrections.ts +154 -154
- package/src/server/handlers/tools/get-decision-timeline.ts +172 -172
- package/src/server/handlers/tools/get-episode.ts +103 -103
- package/src/server/handlers/tools/get-patterns.ts +158 -158
- package/src/server/handlers/tools/get-phase12-status.ts +63 -63
- package/src/server/handlers/tools/get-project-context.ts +75 -75
- package/src/server/handlers/tools/get-recommendations.ts +145 -145
- package/src/server/handlers/tools/index.ts +31 -31
- package/src/server/handlers/tools/init-project.ts +757 -757
- package/src/server/handlers/tools/list-episodes.ts +90 -90
- package/src/server/handlers/tools/list-projects.ts +125 -125
- package/src/server/handlers/tools/rate-memory.ts +101 -101
- package/src/server/handlers/tools/recall-similar.ts +87 -87
- package/src/server/handlers/tools/recognize-pattern.ts +126 -126
- package/src/server/handlers/tools/record-correction.ts +125 -125
- package/src/server/handlers/tools/remember-decision.ts +153 -153
- package/src/server/handlers/tools/schemas.ts +253 -253
- package/src/server/handlers/tools/search-knowledge-graph.ts +102 -102
- package/src/server/handlers/tools/smart-context.ts +146 -146
- package/src/server/handlers/tools/update-progress.ts +131 -131
- package/src/server/handlers/tools/what-if-analysis.ts +135 -135
- package/src/server/http-api.ts +693 -693
- package/src/server/index.ts +40 -40
- package/src/server/mcp-server.ts +283 -283
- package/src/server/providers/index.ts +7 -7
- package/src/server/providers/prompts.ts +327 -327
- package/src/server/providers/resources.ts +622 -622
- package/src/server/services.ts +468 -468
- package/src/server/types.ts +39 -39
- package/src/server/utils/error-handler.ts +155 -155
- package/src/server/utils/index.ts +13 -13
- package/src/server/utils/memory-indicator.ts +83 -83
- package/src/server/utils/request-context.ts +122 -122
- package/src/server/utils/response-formatter.ts +129 -124
- package/src/server/utils/validators.ts +210 -210
- package/src/setup/index.ts +48 -48
- package/src/setup/wizard.ts +461 -461
- package/src/tools/index.ts +24 -24
- package/src/tools/registry.ts +115 -115
- package/src/tools/schemas.test.ts +30 -30
- package/src/tools/schemas.ts +617 -617
- package/src/tools/types.ts +412 -412
- package/src/utils/circuit-breaker.ts +130 -130
- package/src/utils/cleanup.ts +34 -34
- package/src/utils/error-handler.ts +132 -132
- package/src/utils/error-messages.ts +60 -60
- package/src/utils/fallback.ts +45 -45
- package/src/utils/index.ts +54 -54
- package/src/utils/logger-utils.ts +80 -80
- package/src/utils/logger.ts +88 -88
- package/src/utils/phase12-helper.ts +56 -56
- package/src/utils/retry.ts +94 -94
- package/src/utils/timing.ts +47 -47
- package/src/utils/transaction.ts +63 -63
- package/src/vault/frontmatter.ts +264 -264
- package/src/vault/index.ts +318 -318
- package/src/vault/paths.ts +106 -106
- package/src/vault/query.ts +422 -422
- package/src/vault/reader.ts +264 -264
- package/src/vault/templates.ts +186 -186
- package/src/vault/types.ts +73 -73
- package/src/vault/watcher.ts +277 -277
- package/src/vault/writer.ts +413 -413
- package/tsconfig.json +30 -30
|
@@ -1,275 +1,275 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Orchestration Engine - Main Module
|
|
3
|
-
* Phase 4: Event-driven coordination system for Claude Brain
|
|
4
|
-
*
|
|
5
|
-
* This module provides:
|
|
6
|
-
* - Event-driven architecture for component communication
|
|
7
|
-
* - Automatic file change handling from Obsidian vault
|
|
8
|
-
* - Task extraction and tracking
|
|
9
|
-
* - Automatic decision logging
|
|
10
|
-
* - Operation coordination
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import type { Logger } from 'pino'
|
|
14
|
-
import type { VaultManager } from '@/vault'
|
|
15
|
-
import type { MemoryManager } from '@/memory'
|
|
16
|
-
import { EventBus } from './event-emitter'
|
|
17
|
-
import { AgentCoordinator } from './coordinator'
|
|
18
|
-
import { DecisionLogger } from './decision-logger'
|
|
19
|
-
import type { OrchestratorStats } from './types'
|
|
20
|
-
|
|
21
|
-
// Import handlers
|
|
22
|
-
import {
|
|
23
|
-
TaskHandler,
|
|
24
|
-
StatusChangeHandler,
|
|
25
|
-
DecisionDetectionHandler,
|
|
26
|
-
ContextUpdateHandler
|
|
27
|
-
} from './handlers'
|
|
28
|
-
|
|
29
|
-
// Re-export all types and classes
|
|
30
|
-
export * from './types'
|
|
31
|
-
export { EventBus } from './event-emitter'
|
|
32
|
-
export { EventQueue } from './event-queue'
|
|
33
|
-
export { AgentCoordinator } from './coordinator'
|
|
34
|
-
export { DecisionLogger, type DecisionEntry } from './decision-logger'
|
|
35
|
-
export { TaskParser, type Task, type TaskStatus, type TaskPriority } from './task-parser'
|
|
36
|
-
export * from './handlers'
|
|
37
|
-
|
|
38
|
-
export interface OrchestratorConfig {
|
|
39
|
-
maxConcurrentOperations?: number
|
|
40
|
-
debounceMs?: number
|
|
41
|
-
maxHistorySize?: number
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Main Orchestrator class that coordinates all event-driven operations
|
|
46
|
-
*/
|
|
47
|
-
export class Orchestrator {
|
|
48
|
-
readonly eventBus: EventBus
|
|
49
|
-
readonly coordinator: AgentCoordinator
|
|
50
|
-
readonly decisionLogger: DecisionLogger
|
|
51
|
-
|
|
52
|
-
private logger: Logger
|
|
53
|
-
private vault: VaultManager
|
|
54
|
-
private memory: MemoryManager
|
|
55
|
-
private config: OrchestratorConfig
|
|
56
|
-
private initialized: boolean = false
|
|
57
|
-
|
|
58
|
-
// Handler instances
|
|
59
|
-
private taskHandler: TaskHandler
|
|
60
|
-
private statusHandler: StatusChangeHandler
|
|
61
|
-
private decisionHandler: DecisionDetectionHandler
|
|
62
|
-
private contextHandler: ContextUpdateHandler
|
|
63
|
-
|
|
64
|
-
constructor(
|
|
65
|
-
logger: Logger,
|
|
66
|
-
vault: VaultManager,
|
|
67
|
-
memory: MemoryManager,
|
|
68
|
-
config: OrchestratorConfig = {}
|
|
69
|
-
) {
|
|
70
|
-
this.logger = logger.child({ component: 'orchestrator' })
|
|
71
|
-
this.vault = vault
|
|
72
|
-
this.memory = memory
|
|
73
|
-
this.config = {
|
|
74
|
-
maxConcurrentOperations: config.maxConcurrentOperations ?? 5,
|
|
75
|
-
debounceMs: config.debounceMs ?? 5000,
|
|
76
|
-
maxHistorySize: config.maxHistorySize ?? 1000
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// Initialize core components
|
|
80
|
-
this.eventBus = new EventBus(logger, this.config.maxHistorySize)
|
|
81
|
-
this.coordinator = new AgentCoordinator(
|
|
82
|
-
logger,
|
|
83
|
-
this.eventBus,
|
|
84
|
-
this.config.maxConcurrentOperations
|
|
85
|
-
)
|
|
86
|
-
this.decisionLogger = new DecisionLogger(
|
|
87
|
-
logger,
|
|
88
|
-
memory,
|
|
89
|
-
vault.writer
|
|
90
|
-
)
|
|
91
|
-
|
|
92
|
-
// Initialize handlers
|
|
93
|
-
this.taskHandler = new TaskHandler(logger, vault.reader)
|
|
94
|
-
this.statusHandler = new StatusChangeHandler(logger, vault.reader)
|
|
95
|
-
this.decisionHandler = new DecisionDetectionHandler(
|
|
96
|
-
logger,
|
|
97
|
-
vault.reader,
|
|
98
|
-
memory,
|
|
99
|
-
this.config.debounceMs
|
|
100
|
-
)
|
|
101
|
-
this.contextHandler = new ContextUpdateHandler(logger, vault.reader)
|
|
102
|
-
|
|
103
|
-
// Give handlers access to event bus for emitting events
|
|
104
|
-
this.taskHandler.setEventBus(this.eventBus)
|
|
105
|
-
this.statusHandler.setEventBus(this.eventBus)
|
|
106
|
-
this.decisionHandler.setEventBus(this.eventBus)
|
|
107
|
-
this.contextHandler.setEventBus(this.eventBus)
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Initialize orchestrator and register handlers
|
|
112
|
-
*/
|
|
113
|
-
async initialize(): Promise<void> {
|
|
114
|
-
if (this.initialized) {
|
|
115
|
-
this.logger.warn('Orchestrator already initialized')
|
|
116
|
-
return
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
try {
|
|
120
|
-
this.logger.info('Initializing orchestrator...')
|
|
121
|
-
|
|
122
|
-
// Register handlers
|
|
123
|
-
this.registerHandlers()
|
|
124
|
-
|
|
125
|
-
// Setup vault watcher integration
|
|
126
|
-
this.setupVaultWatcher()
|
|
127
|
-
|
|
128
|
-
// Emit system ready event
|
|
129
|
-
this.eventBus.emitEvent(
|
|
130
|
-
'system:ready',
|
|
131
|
-
{ timestamp: new Date() },
|
|
132
|
-
'orchestrator'
|
|
133
|
-
)
|
|
134
|
-
|
|
135
|
-
this.initialized = true
|
|
136
|
-
this.logger.info('Orchestrator initialized')
|
|
137
|
-
} catch (error) {
|
|
138
|
-
this.logger.error({ error }, 'Failed to initialize orchestrator')
|
|
139
|
-
throw error
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* Register all event handlers
|
|
145
|
-
*/
|
|
146
|
-
private registerHandlers(): void {
|
|
147
|
-
const handlers = [
|
|
148
|
-
this.taskHandler,
|
|
149
|
-
this.statusHandler,
|
|
150
|
-
this.decisionHandler,
|
|
151
|
-
this.contextHandler
|
|
152
|
-
]
|
|
153
|
-
|
|
154
|
-
for (const handler of handlers) {
|
|
155
|
-
this.eventBus.registerHandler(handler)
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
this.logger.info({ count: handlers.length }, 'Handlers registered')
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* Setup vault watcher to emit file events
|
|
163
|
-
*/
|
|
164
|
-
private setupVaultWatcher(): void {
|
|
165
|
-
// Handle file changes
|
|
166
|
-
this.vault.watcher.on('change', (event) => {
|
|
167
|
-
this.eventBus.emitEvent(
|
|
168
|
-
'file:modified',
|
|
169
|
-
{ path: event.path, type: event.type },
|
|
170
|
-
'vault-watcher',
|
|
171
|
-
'normal'
|
|
172
|
-
)
|
|
173
|
-
})
|
|
174
|
-
|
|
175
|
-
// Handle new files
|
|
176
|
-
this.vault.watcher.on('created', (event) => {
|
|
177
|
-
this.eventBus.emitEvent(
|
|
178
|
-
'file:created',
|
|
179
|
-
{ path: event.path, type: event.type },
|
|
180
|
-
'vault-watcher',
|
|
181
|
-
'normal'
|
|
182
|
-
)
|
|
183
|
-
})
|
|
184
|
-
|
|
185
|
-
// Handle deleted files
|
|
186
|
-
this.vault.watcher.on('deleted', (event) => {
|
|
187
|
-
this.eventBus.emitEvent(
|
|
188
|
-
'file:deleted',
|
|
189
|
-
{ path: event.path, type: event.type },
|
|
190
|
-
'vault-watcher',
|
|
191
|
-
'normal'
|
|
192
|
-
)
|
|
193
|
-
})
|
|
194
|
-
|
|
195
|
-
this.logger.info('Vault watcher integrated')
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
/**
|
|
199
|
-
* Get orchestrator statistics
|
|
200
|
-
*/
|
|
201
|
-
getStats(): OrchestratorStats {
|
|
202
|
-
return {
|
|
203
|
-
eventBus: this.eventBus.getStats(),
|
|
204
|
-
coordinator: this.coordinator.getStats()
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
/**
|
|
209
|
-
* Check if orchestrator is initialized
|
|
210
|
-
*/
|
|
211
|
-
isInitialized(): boolean {
|
|
212
|
-
return this.initialized
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
/**
|
|
216
|
-
* Get the memory manager
|
|
217
|
-
*/
|
|
218
|
-
getMemory(): MemoryManager {
|
|
219
|
-
return this.memory
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
* Get the vault manager
|
|
224
|
-
*/
|
|
225
|
-
getVault(): VaultManager {
|
|
226
|
-
return this.vault
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
/**
|
|
230
|
-
* Get handler instances for testing
|
|
231
|
-
*/
|
|
232
|
-
getHandlers() {
|
|
233
|
-
return {
|
|
234
|
-
task: this.taskHandler,
|
|
235
|
-
status: this.statusHandler,
|
|
236
|
-
decision: this.decisionHandler,
|
|
237
|
-
context: this.contextHandler
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
/**
|
|
242
|
-
* Shutdown orchestrator
|
|
243
|
-
*/
|
|
244
|
-
shutdown(): void {
|
|
245
|
-
this.logger.info('Shutting down orchestrator')
|
|
246
|
-
|
|
247
|
-
// Emit shutdown event
|
|
248
|
-
this.eventBus.emitEvent(
|
|
249
|
-
'system:shutdown',
|
|
250
|
-
{ timestamp: new Date() },
|
|
251
|
-
'orchestrator'
|
|
252
|
-
)
|
|
253
|
-
|
|
254
|
-
// Stop coordinator
|
|
255
|
-
this.coordinator.stop()
|
|
256
|
-
|
|
257
|
-
// Remove all listeners
|
|
258
|
-
this.eventBus.removeAllListeners()
|
|
259
|
-
|
|
260
|
-
this.initialized = false
|
|
261
|
-
this.logger.info('Orchestrator shut down')
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
/**
|
|
266
|
-
* Create an orchestrator instance
|
|
267
|
-
*/
|
|
268
|
-
export function createOrchestrator(
|
|
269
|
-
logger: Logger,
|
|
270
|
-
vault: VaultManager,
|
|
271
|
-
memory: MemoryManager,
|
|
272
|
-
config?: OrchestratorConfig
|
|
273
|
-
): Orchestrator {
|
|
274
|
-
return new Orchestrator(logger, vault, memory, config)
|
|
275
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Orchestration Engine - Main Module
|
|
3
|
+
* Phase 4: Event-driven coordination system for Claude Brain
|
|
4
|
+
*
|
|
5
|
+
* This module provides:
|
|
6
|
+
* - Event-driven architecture for component communication
|
|
7
|
+
* - Automatic file change handling from Obsidian vault
|
|
8
|
+
* - Task extraction and tracking
|
|
9
|
+
* - Automatic decision logging
|
|
10
|
+
* - Operation coordination
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type { Logger } from 'pino'
|
|
14
|
+
import type { VaultManager } from '@/vault'
|
|
15
|
+
import type { MemoryManager } from '@/memory'
|
|
16
|
+
import { EventBus } from './event-emitter'
|
|
17
|
+
import { AgentCoordinator } from './coordinator'
|
|
18
|
+
import { DecisionLogger } from './decision-logger'
|
|
19
|
+
import type { OrchestratorStats } from './types'
|
|
20
|
+
|
|
21
|
+
// Import handlers
|
|
22
|
+
import {
|
|
23
|
+
TaskHandler,
|
|
24
|
+
StatusChangeHandler,
|
|
25
|
+
DecisionDetectionHandler,
|
|
26
|
+
ContextUpdateHandler
|
|
27
|
+
} from './handlers'
|
|
28
|
+
|
|
29
|
+
// Re-export all types and classes
|
|
30
|
+
export * from './types'
|
|
31
|
+
export { EventBus } from './event-emitter'
|
|
32
|
+
export { EventQueue } from './event-queue'
|
|
33
|
+
export { AgentCoordinator } from './coordinator'
|
|
34
|
+
export { DecisionLogger, type DecisionEntry } from './decision-logger'
|
|
35
|
+
export { TaskParser, type Task, type TaskStatus, type TaskPriority } from './task-parser'
|
|
36
|
+
export * from './handlers'
|
|
37
|
+
|
|
38
|
+
export interface OrchestratorConfig {
|
|
39
|
+
maxConcurrentOperations?: number
|
|
40
|
+
debounceMs?: number
|
|
41
|
+
maxHistorySize?: number
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Main Orchestrator class that coordinates all event-driven operations
|
|
46
|
+
*/
|
|
47
|
+
export class Orchestrator {
|
|
48
|
+
readonly eventBus: EventBus
|
|
49
|
+
readonly coordinator: AgentCoordinator
|
|
50
|
+
readonly decisionLogger: DecisionLogger
|
|
51
|
+
|
|
52
|
+
private logger: Logger
|
|
53
|
+
private vault: VaultManager
|
|
54
|
+
private memory: MemoryManager
|
|
55
|
+
private config: OrchestratorConfig
|
|
56
|
+
private initialized: boolean = false
|
|
57
|
+
|
|
58
|
+
// Handler instances
|
|
59
|
+
private taskHandler: TaskHandler
|
|
60
|
+
private statusHandler: StatusChangeHandler
|
|
61
|
+
private decisionHandler: DecisionDetectionHandler
|
|
62
|
+
private contextHandler: ContextUpdateHandler
|
|
63
|
+
|
|
64
|
+
constructor(
|
|
65
|
+
logger: Logger,
|
|
66
|
+
vault: VaultManager,
|
|
67
|
+
memory: MemoryManager,
|
|
68
|
+
config: OrchestratorConfig = {}
|
|
69
|
+
) {
|
|
70
|
+
this.logger = logger.child({ component: 'orchestrator' })
|
|
71
|
+
this.vault = vault
|
|
72
|
+
this.memory = memory
|
|
73
|
+
this.config = {
|
|
74
|
+
maxConcurrentOperations: config.maxConcurrentOperations ?? 5,
|
|
75
|
+
debounceMs: config.debounceMs ?? 5000,
|
|
76
|
+
maxHistorySize: config.maxHistorySize ?? 1000
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Initialize core components
|
|
80
|
+
this.eventBus = new EventBus(logger, this.config.maxHistorySize)
|
|
81
|
+
this.coordinator = new AgentCoordinator(
|
|
82
|
+
logger,
|
|
83
|
+
this.eventBus,
|
|
84
|
+
this.config.maxConcurrentOperations
|
|
85
|
+
)
|
|
86
|
+
this.decisionLogger = new DecisionLogger(
|
|
87
|
+
logger,
|
|
88
|
+
memory,
|
|
89
|
+
vault.writer
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
// Initialize handlers
|
|
93
|
+
this.taskHandler = new TaskHandler(logger, vault.reader)
|
|
94
|
+
this.statusHandler = new StatusChangeHandler(logger, vault.reader)
|
|
95
|
+
this.decisionHandler = new DecisionDetectionHandler(
|
|
96
|
+
logger,
|
|
97
|
+
vault.reader,
|
|
98
|
+
memory,
|
|
99
|
+
this.config.debounceMs
|
|
100
|
+
)
|
|
101
|
+
this.contextHandler = new ContextUpdateHandler(logger, vault.reader)
|
|
102
|
+
|
|
103
|
+
// Give handlers access to event bus for emitting events
|
|
104
|
+
this.taskHandler.setEventBus(this.eventBus)
|
|
105
|
+
this.statusHandler.setEventBus(this.eventBus)
|
|
106
|
+
this.decisionHandler.setEventBus(this.eventBus)
|
|
107
|
+
this.contextHandler.setEventBus(this.eventBus)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Initialize orchestrator and register handlers
|
|
112
|
+
*/
|
|
113
|
+
async initialize(): Promise<void> {
|
|
114
|
+
if (this.initialized) {
|
|
115
|
+
this.logger.warn('Orchestrator already initialized')
|
|
116
|
+
return
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
try {
|
|
120
|
+
this.logger.info('Initializing orchestrator...')
|
|
121
|
+
|
|
122
|
+
// Register handlers
|
|
123
|
+
this.registerHandlers()
|
|
124
|
+
|
|
125
|
+
// Setup vault watcher integration
|
|
126
|
+
this.setupVaultWatcher()
|
|
127
|
+
|
|
128
|
+
// Emit system ready event
|
|
129
|
+
this.eventBus.emitEvent(
|
|
130
|
+
'system:ready',
|
|
131
|
+
{ timestamp: new Date() },
|
|
132
|
+
'orchestrator'
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
this.initialized = true
|
|
136
|
+
this.logger.info('Orchestrator initialized')
|
|
137
|
+
} catch (error) {
|
|
138
|
+
this.logger.error({ error }, 'Failed to initialize orchestrator')
|
|
139
|
+
throw error
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Register all event handlers
|
|
145
|
+
*/
|
|
146
|
+
private registerHandlers(): void {
|
|
147
|
+
const handlers = [
|
|
148
|
+
this.taskHandler,
|
|
149
|
+
this.statusHandler,
|
|
150
|
+
this.decisionHandler,
|
|
151
|
+
this.contextHandler
|
|
152
|
+
]
|
|
153
|
+
|
|
154
|
+
for (const handler of handlers) {
|
|
155
|
+
this.eventBus.registerHandler(handler)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
this.logger.info({ count: handlers.length }, 'Handlers registered')
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Setup vault watcher to emit file events
|
|
163
|
+
*/
|
|
164
|
+
private setupVaultWatcher(): void {
|
|
165
|
+
// Handle file changes
|
|
166
|
+
this.vault.watcher.on('change', (event) => {
|
|
167
|
+
this.eventBus.emitEvent(
|
|
168
|
+
'file:modified',
|
|
169
|
+
{ path: event.path, type: event.type },
|
|
170
|
+
'vault-watcher',
|
|
171
|
+
'normal'
|
|
172
|
+
)
|
|
173
|
+
})
|
|
174
|
+
|
|
175
|
+
// Handle new files
|
|
176
|
+
this.vault.watcher.on('created', (event) => {
|
|
177
|
+
this.eventBus.emitEvent(
|
|
178
|
+
'file:created',
|
|
179
|
+
{ path: event.path, type: event.type },
|
|
180
|
+
'vault-watcher',
|
|
181
|
+
'normal'
|
|
182
|
+
)
|
|
183
|
+
})
|
|
184
|
+
|
|
185
|
+
// Handle deleted files
|
|
186
|
+
this.vault.watcher.on('deleted', (event) => {
|
|
187
|
+
this.eventBus.emitEvent(
|
|
188
|
+
'file:deleted',
|
|
189
|
+
{ path: event.path, type: event.type },
|
|
190
|
+
'vault-watcher',
|
|
191
|
+
'normal'
|
|
192
|
+
)
|
|
193
|
+
})
|
|
194
|
+
|
|
195
|
+
this.logger.info('Vault watcher integrated')
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Get orchestrator statistics
|
|
200
|
+
*/
|
|
201
|
+
getStats(): OrchestratorStats {
|
|
202
|
+
return {
|
|
203
|
+
eventBus: this.eventBus.getStats(),
|
|
204
|
+
coordinator: this.coordinator.getStats()
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Check if orchestrator is initialized
|
|
210
|
+
*/
|
|
211
|
+
isInitialized(): boolean {
|
|
212
|
+
return this.initialized
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Get the memory manager
|
|
217
|
+
*/
|
|
218
|
+
getMemory(): MemoryManager {
|
|
219
|
+
return this.memory
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Get the vault manager
|
|
224
|
+
*/
|
|
225
|
+
getVault(): VaultManager {
|
|
226
|
+
return this.vault
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Get handler instances for testing
|
|
231
|
+
*/
|
|
232
|
+
getHandlers() {
|
|
233
|
+
return {
|
|
234
|
+
task: this.taskHandler,
|
|
235
|
+
status: this.statusHandler,
|
|
236
|
+
decision: this.decisionHandler,
|
|
237
|
+
context: this.contextHandler
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Shutdown orchestrator
|
|
243
|
+
*/
|
|
244
|
+
shutdown(): void {
|
|
245
|
+
this.logger.info('Shutting down orchestrator')
|
|
246
|
+
|
|
247
|
+
// Emit shutdown event
|
|
248
|
+
this.eventBus.emitEvent(
|
|
249
|
+
'system:shutdown',
|
|
250
|
+
{ timestamp: new Date() },
|
|
251
|
+
'orchestrator'
|
|
252
|
+
)
|
|
253
|
+
|
|
254
|
+
// Stop coordinator
|
|
255
|
+
this.coordinator.stop()
|
|
256
|
+
|
|
257
|
+
// Remove all listeners
|
|
258
|
+
this.eventBus.removeAllListeners()
|
|
259
|
+
|
|
260
|
+
this.initialized = false
|
|
261
|
+
this.logger.info('Orchestrator shut down')
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Create an orchestrator instance
|
|
267
|
+
*/
|
|
268
|
+
export function createOrchestrator(
|
|
269
|
+
logger: Logger,
|
|
270
|
+
vault: VaultManager,
|
|
271
|
+
memory: MemoryManager,
|
|
272
|
+
config?: OrchestratorConfig
|
|
273
|
+
): Orchestrator {
|
|
274
|
+
return new Orchestrator(logger, vault, memory, config)
|
|
275
|
+
}
|