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,136 +1,136 @@
|
|
|
1
|
-
import type { Logger } from 'pino'
|
|
2
|
-
|
|
3
|
-
export class GlobalErrorHandler {
|
|
4
|
-
private logger: Logger
|
|
5
|
-
private isShuttingDown = false
|
|
6
|
-
|
|
7
|
-
constructor(logger: Logger) {
|
|
8
|
-
this.logger = logger.child({ component: 'error-handler' })
|
|
9
|
-
this.setupHandlers()
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
private setupHandlers(): void {
|
|
13
|
-
process.on('uncaughtException', (error: Error) => {
|
|
14
|
-
this.handleUncaughtException(error)
|
|
15
|
-
})
|
|
16
|
-
|
|
17
|
-
process.on('unhandledRejection', (reason: unknown, promise: Promise<unknown>) => {
|
|
18
|
-
this.handleUnhandledRejection(reason, promise)
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
process.on('warning', (warning: Error) => {
|
|
22
|
-
this.handleWarning(warning)
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
process.on('SIGTERM', () => {
|
|
26
|
-
this.handleShutdown('SIGTERM')
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
process.on('SIGINT', () => {
|
|
30
|
-
this.handleShutdown('SIGINT')
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
process.on('SIGHUP', () => {
|
|
34
|
-
this.handleShutdown('SIGHUP')
|
|
35
|
-
})
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
private handleUncaughtException(error: Error): void {
|
|
39
|
-
this.logger.fatal(
|
|
40
|
-
{
|
|
41
|
-
error: {
|
|
42
|
-
name: error.name,
|
|
43
|
-
message: error.message,
|
|
44
|
-
stack: error.stack
|
|
45
|
-
}
|
|
46
|
-
},
|
|
47
|
-
'Uncaught exception'
|
|
48
|
-
)
|
|
49
|
-
|
|
50
|
-
this.emergencyShutdown('uncaughtException')
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
private handleUnhandledRejection(reason: unknown, promise: Promise<unknown>): void {
|
|
54
|
-
this.logger.error(
|
|
55
|
-
{
|
|
56
|
-
reason: reason instanceof Error ? {
|
|
57
|
-
name: reason.name,
|
|
58
|
-
message: reason.message,
|
|
59
|
-
stack: reason.stack
|
|
60
|
-
} : reason,
|
|
61
|
-
promise: String(promise)
|
|
62
|
-
},
|
|
63
|
-
'Unhandled promise rejection'
|
|
64
|
-
)
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
private handleWarning(warning: Error): void {
|
|
68
|
-
this.logger.warn(
|
|
69
|
-
{
|
|
70
|
-
name: warning.name,
|
|
71
|
-
message: warning.message,
|
|
72
|
-
stack: warning.stack
|
|
73
|
-
},
|
|
74
|
-
'Process warning'
|
|
75
|
-
)
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
private handleShutdown(signal: string): void {
|
|
79
|
-
if (this.isShuttingDown) {
|
|
80
|
-
return
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
this.isShuttingDown = true
|
|
84
|
-
|
|
85
|
-
this.logger.info({ signal }, 'Received shutdown signal, closing gracefully...')
|
|
86
|
-
|
|
87
|
-
setTimeout(() => {
|
|
88
|
-
this.logger.info('Graceful shutdown complete')
|
|
89
|
-
process.exit(0)
|
|
90
|
-
}, 5000)
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
private emergencyShutdown(reason: string): void {
|
|
94
|
-
console.error(`FATAL: Emergency shutdown due to ${reason}`)
|
|
95
|
-
|
|
96
|
-
setTimeout(() => {
|
|
97
|
-
process.exit(1)
|
|
98
|
-
}, 1000)
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
static createError(
|
|
102
|
-
message: string,
|
|
103
|
-
code: string,
|
|
104
|
-
context?: Record<string, unknown>
|
|
105
|
-
): AppError {
|
|
106
|
-
return new AppError(message, code, context)
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
export class AppError extends Error {
|
|
111
|
-
code: string
|
|
112
|
-
context?: Record<string, unknown>
|
|
113
|
-
isOperational: boolean
|
|
114
|
-
|
|
115
|
-
constructor(
|
|
116
|
-
message: string,
|
|
117
|
-
code: string,
|
|
118
|
-
context?: Record<string, unknown>,
|
|
119
|
-
isOperational = true
|
|
120
|
-
) {
|
|
121
|
-
super(message)
|
|
122
|
-
this.name = 'AppError'
|
|
123
|
-
this.code = code
|
|
124
|
-
this.context = context
|
|
125
|
-
this.isOperational = isOperational
|
|
126
|
-
|
|
127
|
-
Error.captureStackTrace(this, this.constructor)
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
export function isOperationalError(error: Error): boolean {
|
|
132
|
-
if (error instanceof AppError) {
|
|
133
|
-
return error.isOperational
|
|
134
|
-
}
|
|
135
|
-
return false
|
|
136
|
-
}
|
|
1
|
+
import type { Logger } from 'pino'
|
|
2
|
+
|
|
3
|
+
export class GlobalErrorHandler {
|
|
4
|
+
private logger: Logger
|
|
5
|
+
private isShuttingDown = false
|
|
6
|
+
|
|
7
|
+
constructor(logger: Logger) {
|
|
8
|
+
this.logger = logger.child({ component: 'error-handler' })
|
|
9
|
+
this.setupHandlers()
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
private setupHandlers(): void {
|
|
13
|
+
process.on('uncaughtException', (error: Error) => {
|
|
14
|
+
this.handleUncaughtException(error)
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
process.on('unhandledRejection', (reason: unknown, promise: Promise<unknown>) => {
|
|
18
|
+
this.handleUnhandledRejection(reason, promise)
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
process.on('warning', (warning: Error) => {
|
|
22
|
+
this.handleWarning(warning)
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
process.on('SIGTERM', () => {
|
|
26
|
+
this.handleShutdown('SIGTERM')
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
process.on('SIGINT', () => {
|
|
30
|
+
this.handleShutdown('SIGINT')
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
process.on('SIGHUP', () => {
|
|
34
|
+
this.handleShutdown('SIGHUP')
|
|
35
|
+
})
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
private handleUncaughtException(error: Error): void {
|
|
39
|
+
this.logger.fatal(
|
|
40
|
+
{
|
|
41
|
+
error: {
|
|
42
|
+
name: error.name,
|
|
43
|
+
message: error.message,
|
|
44
|
+
stack: error.stack
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
'Uncaught exception'
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
this.emergencyShutdown('uncaughtException')
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
private handleUnhandledRejection(reason: unknown, promise: Promise<unknown>): void {
|
|
54
|
+
this.logger.error(
|
|
55
|
+
{
|
|
56
|
+
reason: reason instanceof Error ? {
|
|
57
|
+
name: reason.name,
|
|
58
|
+
message: reason.message,
|
|
59
|
+
stack: reason.stack
|
|
60
|
+
} : reason,
|
|
61
|
+
promise: String(promise)
|
|
62
|
+
},
|
|
63
|
+
'Unhandled promise rejection'
|
|
64
|
+
)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
private handleWarning(warning: Error): void {
|
|
68
|
+
this.logger.warn(
|
|
69
|
+
{
|
|
70
|
+
name: warning.name,
|
|
71
|
+
message: warning.message,
|
|
72
|
+
stack: warning.stack
|
|
73
|
+
},
|
|
74
|
+
'Process warning'
|
|
75
|
+
)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
private handleShutdown(signal: string): void {
|
|
79
|
+
if (this.isShuttingDown) {
|
|
80
|
+
return
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
this.isShuttingDown = true
|
|
84
|
+
|
|
85
|
+
this.logger.info({ signal }, 'Received shutdown signal, closing gracefully...')
|
|
86
|
+
|
|
87
|
+
setTimeout(() => {
|
|
88
|
+
this.logger.info('Graceful shutdown complete')
|
|
89
|
+
process.exit(0)
|
|
90
|
+
}, 5000)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
private emergencyShutdown(reason: string): void {
|
|
94
|
+
console.error(`FATAL: Emergency shutdown due to ${reason}`)
|
|
95
|
+
|
|
96
|
+
setTimeout(() => {
|
|
97
|
+
process.exit(1)
|
|
98
|
+
}, 1000)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
static createError(
|
|
102
|
+
message: string,
|
|
103
|
+
code: string,
|
|
104
|
+
context?: Record<string, unknown>
|
|
105
|
+
): AppError {
|
|
106
|
+
return new AppError(message, code, context)
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export class AppError extends Error {
|
|
111
|
+
code: string
|
|
112
|
+
context?: Record<string, unknown>
|
|
113
|
+
isOperational: boolean
|
|
114
|
+
|
|
115
|
+
constructor(
|
|
116
|
+
message: string,
|
|
117
|
+
code: string,
|
|
118
|
+
context?: Record<string, unknown>,
|
|
119
|
+
isOperational = true
|
|
120
|
+
) {
|
|
121
|
+
super(message)
|
|
122
|
+
this.name = 'AppError'
|
|
123
|
+
this.code = code
|
|
124
|
+
this.context = context
|
|
125
|
+
this.isOperational = isOperational
|
|
126
|
+
|
|
127
|
+
Error.captureStackTrace(this, this.constructor)
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export function isOperationalError(error: Error): boolean {
|
|
132
|
+
if (error instanceof AppError) {
|
|
133
|
+
return error.isOperational
|
|
134
|
+
}
|
|
135
|
+
return false
|
|
136
|
+
}
|
package/src/utils/index.ts
CHANGED
|
@@ -1,58 +1,58 @@
|
|
|
1
|
-
export {
|
|
2
|
-
createLogger,
|
|
3
|
-
createComponentLogger,
|
|
4
|
-
createRequestLogger,
|
|
5
|
-
generateRequestId
|
|
6
|
-
} from './logger'
|
|
7
|
-
|
|
8
|
-
export {
|
|
9
|
-
logToolCall,
|
|
10
|
-
logToolResult,
|
|
11
|
-
logAgentActivity,
|
|
12
|
-
logPerformance,
|
|
13
|
-
logError,
|
|
14
|
-
logVaultOperation,
|
|
15
|
-
logMemoryOperation,
|
|
16
|
-
createTimer
|
|
17
|
-
} from './logger-utils'
|
|
18
|
-
|
|
19
|
-
export {
|
|
20
|
-
GlobalErrorHandler,
|
|
21
|
-
AppError,
|
|
22
|
-
isOperationalError
|
|
23
|
-
} from './error-handler'
|
|
24
|
-
|
|
25
|
-
export {
|
|
26
|
-
RetryManager
|
|
27
|
-
} from './retry'
|
|
28
|
-
|
|
29
|
-
export {
|
|
30
|
-
CircuitBreaker,
|
|
31
|
-
CircuitState
|
|
32
|
-
} from './circuit-breaker'
|
|
33
|
-
|
|
34
|
-
export {
|
|
35
|
-
FallbackManager
|
|
36
|
-
} from './fallback'
|
|
37
|
-
|
|
38
|
-
export {
|
|
39
|
-
TransactionManager
|
|
40
|
-
} from './transaction'
|
|
41
|
-
|
|
42
|
-
export {
|
|
43
|
-
CleanupManager
|
|
44
|
-
} from './cleanup'
|
|
45
|
-
|
|
46
|
-
export {
|
|
47
|
-
ErrorMessages
|
|
48
|
-
} from './error-messages'
|
|
49
|
-
|
|
50
|
-
export {
|
|
51
|
-
isPhase12Available,
|
|
52
|
-
getPhase12Instance,
|
|
53
|
-
resetPhase12Cache
|
|
54
|
-
} from './phase12-helper'
|
|
55
|
-
|
|
56
|
-
export {
|
|
57
|
-
killProcessOnPort
|
|
58
|
-
} from './kill-port'
|
|
1
|
+
export {
|
|
2
|
+
createLogger,
|
|
3
|
+
createComponentLogger,
|
|
4
|
+
createRequestLogger,
|
|
5
|
+
generateRequestId
|
|
6
|
+
} from './logger'
|
|
7
|
+
|
|
8
|
+
export {
|
|
9
|
+
logToolCall,
|
|
10
|
+
logToolResult,
|
|
11
|
+
logAgentActivity,
|
|
12
|
+
logPerformance,
|
|
13
|
+
logError,
|
|
14
|
+
logVaultOperation,
|
|
15
|
+
logMemoryOperation,
|
|
16
|
+
createTimer
|
|
17
|
+
} from './logger-utils'
|
|
18
|
+
|
|
19
|
+
export {
|
|
20
|
+
GlobalErrorHandler,
|
|
21
|
+
AppError,
|
|
22
|
+
isOperationalError
|
|
23
|
+
} from './error-handler'
|
|
24
|
+
|
|
25
|
+
export {
|
|
26
|
+
RetryManager
|
|
27
|
+
} from './retry'
|
|
28
|
+
|
|
29
|
+
export {
|
|
30
|
+
CircuitBreaker,
|
|
31
|
+
CircuitState
|
|
32
|
+
} from './circuit-breaker'
|
|
33
|
+
|
|
34
|
+
export {
|
|
35
|
+
FallbackManager
|
|
36
|
+
} from './fallback'
|
|
37
|
+
|
|
38
|
+
export {
|
|
39
|
+
TransactionManager
|
|
40
|
+
} from './transaction'
|
|
41
|
+
|
|
42
|
+
export {
|
|
43
|
+
CleanupManager
|
|
44
|
+
} from './cleanup'
|
|
45
|
+
|
|
46
|
+
export {
|
|
47
|
+
ErrorMessages
|
|
48
|
+
} from './error-messages'
|
|
49
|
+
|
|
50
|
+
export {
|
|
51
|
+
isPhase12Available,
|
|
52
|
+
getPhase12Instance,
|
|
53
|
+
resetPhase12Cache
|
|
54
|
+
} from './phase12-helper'
|
|
55
|
+
|
|
56
|
+
export {
|
|
57
|
+
killProcessOnPort
|
|
58
|
+
} from './kill-port'
|
package/src/utils/kill-port.ts
CHANGED
|
@@ -1,53 +1,55 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cross-platform utility to kill the process holding a specific port.
|
|
3
|
-
* Used by serve.ts (EADDRINUSE recovery) and auto-updater.ts (ghost cleanup).
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
const isWindows = process.platform === 'win32'
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Kill the process listening on the given port.
|
|
12
|
-
* Skips the current process (myPid) to avoid self-termination.
|
|
13
|
-
* Returns the PIDs that were killed, or an empty array if none found.
|
|
14
|
-
*/
|
|
15
|
-
export function killProcessOnPort(port: number, myPid: number = process.pid): number[] {
|
|
16
|
-
const killed: number[] = []
|
|
17
|
-
|
|
18
|
-
try {
|
|
19
|
-
if (isWindows) {
|
|
20
|
-
const result =
|
|
21
|
-
encoding: 'utf-8', stdio: 'pipe', timeout: 5000,
|
|
22
|
-
})
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
.
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Cross-platform utility to kill the process holding a specific port.
|
|
3
|
+
* Used by serve.ts (EADDRINUSE recovery) and auto-updater.ts (ghost cleanup).
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { spawnSync } from 'node:child_process'
|
|
7
|
+
|
|
8
|
+
const isWindows = process.platform === 'win32'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Kill the process listening on the given port.
|
|
12
|
+
* Skips the current process (myPid) to avoid self-termination.
|
|
13
|
+
* Returns the PIDs that were killed, or an empty array if none found.
|
|
14
|
+
*/
|
|
15
|
+
export function killProcessOnPort(port: number, myPid: number = process.pid): number[] {
|
|
16
|
+
const killed: number[] = []
|
|
17
|
+
|
|
18
|
+
try {
|
|
19
|
+
if (isWindows) {
|
|
20
|
+
const result = spawnSync('cmd', ['/c', `netstat -ano | findstr :${port} | findstr LISTENING`], {
|
|
21
|
+
encoding: 'utf-8', stdio: 'pipe', timeout: 5000,
|
|
22
|
+
})
|
|
23
|
+
const output = result.stdout || ''
|
|
24
|
+
const pids = new Set(
|
|
25
|
+
output.split('\n')
|
|
26
|
+
.map(line => line.trim().split(/\s+/).pop())
|
|
27
|
+
.filter((p): p is string => !!p && Number(p) !== myPid && !isNaN(Number(p)))
|
|
28
|
+
)
|
|
29
|
+
for (const pid of pids) {
|
|
30
|
+
try {
|
|
31
|
+
spawnSync('taskkill', ['/F', '/PID', pid], { stdio: 'pipe', timeout: 5000 })
|
|
32
|
+
killed.push(Number(pid))
|
|
33
|
+
} catch {}
|
|
34
|
+
}
|
|
35
|
+
} else {
|
|
36
|
+
const result = spawnSync('lsof', ['-ti', `:${port}`], {
|
|
37
|
+
encoding: 'utf-8', stdio: 'pipe', timeout: 5000,
|
|
38
|
+
})
|
|
39
|
+
const raw = result.stdout?.trim() || ''
|
|
40
|
+
if (raw) {
|
|
41
|
+
const pids = raw.split('\n').filter(p => p && Number(p) !== myPid)
|
|
42
|
+
for (const pid of pids) {
|
|
43
|
+
try {
|
|
44
|
+
process.kill(Number(pid), 'SIGKILL')
|
|
45
|
+
killed.push(Number(pid))
|
|
46
|
+
} catch {}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
} catch {
|
|
51
|
+
// No process on port — that's fine
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return killed
|
|
55
|
+
}
|
|
@@ -1,56 +1,56 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Phase 12 Helper
|
|
3
|
-
* Utilities for checking Phase 12 availability
|
|
4
|
-
* Allows Phase 6.5 to gracefully degrade if Phase 12 isn't fully implemented
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import type { Phase12Manager } from '@/automation/phase12-manager'
|
|
8
|
-
|
|
9
|
-
// Cache for Phase 12 availability check
|
|
10
|
-
let phase12Available: boolean | null = null
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Check if Phase 12 features are available
|
|
14
|
-
*/
|
|
15
|
-
export function isPhase12Available(): boolean {
|
|
16
|
-
if (phase12Available !== null) {
|
|
17
|
-
return phase12Available
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
try {
|
|
21
|
-
// Check if the module can be loaded
|
|
22
|
-
require('@/automation/phase12-manager')
|
|
23
|
-
phase12Available = true
|
|
24
|
-
return true
|
|
25
|
-
} catch {
|
|
26
|
-
phase12Available = false
|
|
27
|
-
return false
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Get Phase 12 instance if available
|
|
33
|
-
* Returns null if Phase 12 is not available or not initialized
|
|
34
|
-
*/
|
|
35
|
-
export function getPhase12Instance(): Phase12Manager | null {
|
|
36
|
-
try {
|
|
37
|
-
// Import the service getter
|
|
38
|
-
const { getPhase12Service, isServicesInitialized } = require('@/server/services')
|
|
39
|
-
|
|
40
|
-
if (!isServicesInitialized()) {
|
|
41
|
-
return null
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
return getPhase12Service()
|
|
45
|
-
} catch {
|
|
46
|
-
return null
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Reset the Phase 12 availability cache
|
|
52
|
-
* Useful for testing
|
|
53
|
-
*/
|
|
54
|
-
export function resetPhase12Cache(): void {
|
|
55
|
-
phase12Available = null
|
|
56
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Phase 12 Helper
|
|
3
|
+
* Utilities for checking Phase 12 availability
|
|
4
|
+
* Allows Phase 6.5 to gracefully degrade if Phase 12 isn't fully implemented
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { Phase12Manager } from '@/automation/phase12-manager'
|
|
8
|
+
|
|
9
|
+
// Cache for Phase 12 availability check
|
|
10
|
+
let phase12Available: boolean | null = null
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Check if Phase 12 features are available
|
|
14
|
+
*/
|
|
15
|
+
export function isPhase12Available(): boolean {
|
|
16
|
+
if (phase12Available !== null) {
|
|
17
|
+
return phase12Available
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
// Check if the module can be loaded
|
|
22
|
+
require('@/automation/phase12-manager')
|
|
23
|
+
phase12Available = true
|
|
24
|
+
return true
|
|
25
|
+
} catch {
|
|
26
|
+
phase12Available = false
|
|
27
|
+
return false
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Get Phase 12 instance if available
|
|
33
|
+
* Returns null if Phase 12 is not available or not initialized
|
|
34
|
+
*/
|
|
35
|
+
export function getPhase12Instance(): Phase12Manager | null {
|
|
36
|
+
try {
|
|
37
|
+
// Import the service getter
|
|
38
|
+
const { getPhase12Service, isServicesInitialized } = require('@/server/services')
|
|
39
|
+
|
|
40
|
+
if (!isServicesInitialized()) {
|
|
41
|
+
return null
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return getPhase12Service()
|
|
45
|
+
} catch {
|
|
46
|
+
return null
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Reset the Phase 12 availability cache
|
|
52
|
+
* Useful for testing
|
|
53
|
+
*/
|
|
54
|
+
export function resetPhase12Cache(): void {
|
|
55
|
+
phase12Available = null
|
|
56
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path Traversal Protection Utility
|
|
3
|
+
* Phase 1: Security Hardening
|
|
4
|
+
*
|
|
5
|
+
* Validates that file paths are within allowed base directories.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import path from 'path'
|
|
9
|
+
import fs from 'fs'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Validate that a file path is within the allowed base directory.
|
|
13
|
+
* Resolves symlinks to prevent traversal via symlinked directories.
|
|
14
|
+
*
|
|
15
|
+
* @throws Error if path escapes the base directory
|
|
16
|
+
*/
|
|
17
|
+
export function validatePath(filePath: string, baseDir: string): string {
|
|
18
|
+
// Resolve to absolute paths
|
|
19
|
+
const resolvedBase = fs.realpathSync(baseDir)
|
|
20
|
+
const resolvedPath = path.resolve(resolvedBase, filePath)
|
|
21
|
+
|
|
22
|
+
// For existing files, resolve symlinks
|
|
23
|
+
let canonicalPath: string
|
|
24
|
+
try {
|
|
25
|
+
canonicalPath = fs.realpathSync(resolvedPath)
|
|
26
|
+
} catch {
|
|
27
|
+
// File doesn't exist yet — check the parent directory
|
|
28
|
+
const parentDir = path.dirname(resolvedPath)
|
|
29
|
+
try {
|
|
30
|
+
const canonicalParent = fs.realpathSync(parentDir)
|
|
31
|
+
canonicalPath = path.join(canonicalParent, path.basename(resolvedPath))
|
|
32
|
+
} catch {
|
|
33
|
+
canonicalPath = resolvedPath
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Verify the canonical path starts with the base
|
|
38
|
+
if (!canonicalPath.startsWith(resolvedBase + path.sep) && canonicalPath !== resolvedBase) {
|
|
39
|
+
throw new Error(`Path traversal detected: ${filePath} resolves outside ${baseDir}`)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return canonicalPath
|
|
43
|
+
}
|