@timmeck/brain 1.9.0 → 2.1.0
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 +33 -0
- package/brain.log +3876 -0
- package/{src/cli/commands/dashboard.ts → dashboard.html} +694 -807
- package/dist/api/server.d.ts +4 -18
- package/dist/api/server.js +4 -173
- package/dist/api/server.js.map +1 -1
- package/dist/brain.d.ts +2 -0
- package/dist/brain.js +15 -4
- package/dist/brain.js.map +1 -1
- package/dist/cli/colors.d.ts +4 -25
- package/dist/cli/colors.js +3 -89
- package/dist/cli/colors.js.map +1 -1
- package/dist/cli/commands/dashboard.js +21 -2
- package/dist/cli/commands/dashboard.js.map +1 -1
- package/dist/cli/commands/peers.d.ts +2 -0
- package/dist/cli/commands/peers.js +38 -0
- package/dist/cli/commands/peers.js.map +1 -0
- package/dist/cli/commands/status.js +0 -1
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/config.js +2 -29
- package/dist/config.js.map +1 -1
- package/dist/db/connection.d.ts +1 -2
- package/dist/db/connection.js +1 -18
- package/dist/db/connection.js.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/ipc/__tests__/protocol.test.d.ts +1 -0
- package/dist/ipc/__tests__/protocol.test.js +117 -0
- package/dist/ipc/__tests__/protocol.test.js.map +1 -0
- package/dist/ipc/client.d.ts +1 -16
- package/dist/ipc/client.js +1 -100
- package/dist/ipc/client.js.map +1 -1
- package/dist/ipc/protocol.d.ts +1 -8
- package/dist/ipc/protocol.js +1 -28
- package/dist/ipc/protocol.js.map +1 -1
- package/dist/ipc/router.d.ts +2 -0
- package/dist/ipc/router.js +30 -0
- package/dist/ipc/router.js.map +1 -1
- package/dist/ipc/server.d.ts +1 -22
- package/dist/ipc/server.js +1 -163
- package/dist/ipc/server.js.map +1 -1
- package/dist/learning/confidence-scorer.d.ts +2 -5
- package/dist/learning/confidence-scorer.js +4 -19
- package/dist/learning/confidence-scorer.js.map +1 -1
- package/dist/learning/decay.js +2 -3
- package/dist/learning/decay.js.map +1 -1
- package/dist/learning/learning-engine.d.ts +2 -5
- package/dist/learning/learning-engine.js +3 -15
- package/dist/learning/learning-engine.js.map +1 -1
- package/dist/mcp/http-server.d.ts +1 -7
- package/dist/mcp/http-server.js +6 -117
- package/dist/mcp/http-server.js.map +1 -1
- package/dist/mcp/server.js +5 -61
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.js +36 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/parsing/parsers/compiler.js +1 -1
- package/dist/parsing/parsers/compiler.js.map +1 -1
- package/dist/research/research-engine.d.ts +2 -6
- package/dist/research/research-engine.js +3 -23
- package/dist/research/research-engine.js.map +1 -1
- package/dist/services/synapse.service.d.ts +3 -3
- package/dist/signals/__tests__/fingerprint.test.d.ts +1 -0
- package/dist/signals/__tests__/fingerprint.test.js +118 -0
- package/dist/signals/__tests__/fingerprint.test.js.map +1 -0
- package/dist/synapses/activation.d.ts +3 -13
- package/dist/synapses/activation.js +2 -49
- package/dist/synapses/activation.js.map +1 -1
- package/dist/synapses/decay.d.ts +2 -11
- package/dist/synapses/decay.js +2 -26
- package/dist/synapses/decay.js.map +1 -1
- package/dist/synapses/hebbian.d.ts +2 -13
- package/dist/synapses/hebbian.js +2 -35
- package/dist/synapses/hebbian.js.map +1 -1
- package/dist/synapses/pathfinder.d.ts +2 -14
- package/dist/synapses/pathfinder.js +2 -49
- package/dist/synapses/pathfinder.js.map +1 -1
- package/dist/synapses/synapse-manager.d.ts +7 -23
- package/dist/synapses/synapse-manager.js +6 -63
- package/dist/synapses/synapse-manager.js.map +1 -1
- package/dist/types/ipc.types.d.ts +1 -11
- package/dist/utils/__tests__/hash.test.d.ts +1 -0
- package/dist/utils/__tests__/hash.test.js +32 -0
- package/dist/utils/__tests__/hash.test.js.map +1 -0
- package/dist/utils/__tests__/paths.test.d.ts +1 -0
- package/dist/utils/__tests__/paths.test.js +75 -0
- package/dist/utils/__tests__/paths.test.js.map +1 -0
- package/dist/utils/events.d.ts +4 -8
- package/dist/utils/events.js +2 -14
- package/dist/utils/events.js.map +1 -1
- package/dist/utils/hash.d.ts +1 -1
- package/dist/utils/hash.js +1 -4
- package/dist/utils/hash.js.map +1 -1
- package/dist/utils/logger.d.ts +3 -2
- package/dist/utils/logger.js +8 -35
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/paths.d.ts +2 -1
- package/dist/utils/paths.js +4 -13
- package/dist/utils/paths.js.map +1 -1
- package/eslint.config.js +14 -0
- package/package.json +56 -49
- package/BRAIN_PLAN.md +0 -3324
- package/reddit_post.md +0 -45
- package/src/api/server.ts +0 -395
- package/src/brain.ts +0 -313
- package/src/cli/colors.ts +0 -116
- package/src/cli/commands/config.ts +0 -169
- package/src/cli/commands/doctor.ts +0 -124
- package/src/cli/commands/explain.ts +0 -83
- package/src/cli/commands/export.ts +0 -31
- package/src/cli/commands/import.ts +0 -199
- package/src/cli/commands/insights.ts +0 -65
- package/src/cli/commands/learn.ts +0 -24
- package/src/cli/commands/modules.ts +0 -53
- package/src/cli/commands/network.ts +0 -67
- package/src/cli/commands/projects.ts +0 -42
- package/src/cli/commands/query.ts +0 -120
- package/src/cli/commands/start.ts +0 -105
- package/src/cli/commands/status.ts +0 -75
- package/src/cli/commands/stop.ts +0 -34
- package/src/cli/ipc-helper.ts +0 -22
- package/src/cli/update-check.ts +0 -63
- package/src/code/analyzer.ts +0 -117
- package/src/code/fingerprint.ts +0 -87
- package/src/code/matcher.ts +0 -129
- package/src/code/parsers/generic.ts +0 -29
- package/src/code/parsers/python.ts +0 -54
- package/src/code/parsers/typescript.ts +0 -65
- package/src/code/registry.ts +0 -60
- package/src/code/scorer.ts +0 -120
- package/src/config.ts +0 -135
- package/src/dashboard/server.ts +0 -142
- package/src/db/connection.ts +0 -22
- package/src/db/migrations/001_core_schema.ts +0 -120
- package/src/db/migrations/002_learning_schema.ts +0 -38
- package/src/db/migrations/003_code_schema.ts +0 -53
- package/src/db/migrations/004_synapses_schema.ts +0 -57
- package/src/db/migrations/005_fts_indexes.ts +0 -78
- package/src/db/migrations/006_synapses_phase3.ts +0 -17
- package/src/db/migrations/007_feedback.ts +0 -13
- package/src/db/migrations/008_git_integration.ts +0 -38
- package/src/db/migrations/009_embeddings.ts +0 -8
- package/src/db/migrations/index.ts +0 -70
- package/src/db/repositories/antipattern.repository.ts +0 -66
- package/src/db/repositories/code-module.repository.ts +0 -142
- package/src/db/repositories/error.repository.ts +0 -189
- package/src/db/repositories/insight.repository.ts +0 -99
- package/src/db/repositories/notification.repository.ts +0 -66
- package/src/db/repositories/project.repository.ts +0 -93
- package/src/db/repositories/rule.repository.ts +0 -108
- package/src/db/repositories/solution.repository.ts +0 -154
- package/src/db/repositories/synapse.repository.ts +0 -163
- package/src/db/repositories/terminal.repository.ts +0 -101
- package/src/embeddings/engine.ts +0 -238
- package/src/hooks/post-tool-use.ts +0 -92
- package/src/hooks/post-write.ts +0 -129
- package/src/index.ts +0 -63
- package/src/ipc/client.ts +0 -118
- package/src/ipc/protocol.ts +0 -35
- package/src/ipc/router.ts +0 -133
- package/src/ipc/server.ts +0 -176
- package/src/learning/confidence-scorer.ts +0 -80
- package/src/learning/decay.ts +0 -46
- package/src/learning/learning-engine.ts +0 -170
- package/src/learning/pattern-extractor.ts +0 -90
- package/src/learning/rule-generator.ts +0 -74
- package/src/main.rs:10:5 +0 -0
- package/src/matching/error-matcher.ts +0 -166
- package/src/matching/fingerprint.ts +0 -34
- package/src/matching/similarity.ts +0 -61
- package/src/matching/tfidf.ts +0 -74
- package/src/matching/tokenizer.ts +0 -41
- package/src/mcp/auto-detect.ts +0 -93
- package/src/mcp/http-server.ts +0 -140
- package/src/mcp/server.ts +0 -73
- package/src/mcp/tools.ts +0 -328
- package/src/parsing/error-parser.ts +0 -28
- package/src/parsing/parsers/compiler.ts +0 -93
- package/src/parsing/parsers/generic.ts +0 -28
- package/src/parsing/parsers/go.ts +0 -97
- package/src/parsing/parsers/node.ts +0 -69
- package/src/parsing/parsers/python.ts +0 -62
- package/src/parsing/parsers/rust.ts +0 -50
- package/src/parsing/parsers/shell.ts +0 -42
- package/src/parsing/types.ts +0 -47
- package/src/research/gap-analyzer.ts +0 -135
- package/src/research/insight-generator.ts +0 -123
- package/src/research/research-engine.ts +0 -116
- package/src/research/synergy-detector.ts +0 -126
- package/src/research/template-extractor.ts +0 -130
- package/src/research/trend-analyzer.ts +0 -127
- package/src/services/analytics.service.ts +0 -226
- package/src/services/code.service.ts +0 -271
- package/src/services/error.service.ts +0 -266
- package/src/services/git.service.ts +0 -132
- package/src/services/notification.service.ts +0 -41
- package/src/services/prevention.service.ts +0 -159
- package/src/services/research.service.ts +0 -98
- package/src/services/solution.service.ts +0 -174
- package/src/services/synapse.service.ts +0 -59
- package/src/services/terminal.service.ts +0 -81
- package/src/synapses/activation.ts +0 -80
- package/src/synapses/decay.ts +0 -38
- package/src/synapses/hebbian.ts +0 -69
- package/src/synapses/pathfinder.ts +0 -81
- package/src/synapses/synapse-manager.ts +0 -113
- package/src/types/code.types.ts +0 -52
- package/src/types/config.types.ts +0 -103
- package/src/types/error.types.ts +0 -67
- package/src/types/ipc.types.ts +0 -8
- package/src/types/mcp.types.ts +0 -53
- package/src/types/research.types.ts +0 -28
- package/src/types/solution.types.ts +0 -30
- package/src/types/synapse.types.ts +0 -50
- package/src/utils/events.ts +0 -45
- package/src/utils/hash.ts +0 -5
- package/src/utils/logger.ts +0 -48
- package/src/utils/paths.ts +0 -19
- package/tests/e2e/test_code_intelligence.py +0 -1015
- package/tests/e2e/test_error_memory.py +0 -451
- package/tests/e2e/test_full_integration.py +0 -534
- package/tests/fixtures/code-modules/modules.ts +0 -83
- package/tests/fixtures/errors/go.ts +0 -9
- package/tests/fixtures/errors/node.ts +0 -24
- package/tests/fixtures/errors/python.ts +0 -21
- package/tests/fixtures/errors/rust.ts +0 -25
- package/tests/fixtures/errors/shell.ts +0 -15
- package/tests/fixtures/solutions/solutions.ts +0 -27
- package/tests/helpers/setup-db.ts +0 -52
- package/tests/integration/code-flow.test.ts +0 -86
- package/tests/integration/error-flow.test.ts +0 -83
- package/tests/integration/ipc-flow.test.ts +0 -166
- package/tests/integration/learning-cycle.test.ts +0 -82
- package/tests/integration/synapse-flow.test.ts +0 -117
- package/tests/unit/code/analyzer.test.ts +0 -58
- package/tests/unit/code/fingerprint.test.ts +0 -51
- package/tests/unit/code/scorer.test.ts +0 -55
- package/tests/unit/learning/confidence-scorer.test.ts +0 -60
- package/tests/unit/learning/decay.test.ts +0 -45
- package/tests/unit/learning/pattern-extractor.test.ts +0 -50
- package/tests/unit/matching/error-matcher.test.ts +0 -69
- package/tests/unit/matching/fingerprint.test.ts +0 -47
- package/tests/unit/matching/similarity.test.ts +0 -65
- package/tests/unit/matching/tfidf.test.ts +0 -71
- package/tests/unit/matching/tokenizer.test.ts +0 -83
- package/tests/unit/parsing/parsers.test.ts +0 -113
- package/tests/unit/research/gap-analyzer.test.ts +0 -45
- package/tests/unit/research/trend-analyzer.test.ts +0 -45
- package/tests/unit/synapses/activation.test.ts +0 -80
- package/tests/unit/synapses/decay.test.ts +0 -27
- package/tests/unit/synapses/hebbian.test.ts +0 -96
- package/tests/unit/synapses/pathfinder.test.ts +0 -72
- package/tsconfig.json +0 -18
package/dist/synapses/hebbian.js
CHANGED
|
@@ -1,36 +1,3 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
if (existing) {
|
|
4
|
-
// Hebbian: weight grows logarithmically, saturates at 1.0
|
|
5
|
-
const newWeight = Math.min(1.0, existing.weight + (1.0 - existing.weight) * config.learningRate);
|
|
6
|
-
repo.update(existing.id, {
|
|
7
|
-
weight: newWeight,
|
|
8
|
-
activation_count: existing.activation_count + 1,
|
|
9
|
-
last_activated_at: new Date().toISOString(),
|
|
10
|
-
});
|
|
11
|
-
return { ...existing, weight: newWeight, activation_count: existing.activation_count + 1 };
|
|
12
|
-
}
|
|
13
|
-
const id = repo.create({
|
|
14
|
-
source_type: source.type,
|
|
15
|
-
source_id: source.id,
|
|
16
|
-
target_type: target.type,
|
|
17
|
-
target_id: target.id,
|
|
18
|
-
synapse_type: synapseType,
|
|
19
|
-
weight: config.initialWeight,
|
|
20
|
-
metadata: context ? JSON.stringify(context) : null,
|
|
21
|
-
});
|
|
22
|
-
return repo.getById(id);
|
|
23
|
-
}
|
|
24
|
-
export function weaken(repo, synapseId, config, factor = 0.5) {
|
|
25
|
-
const synapse = repo.getById(synapseId);
|
|
26
|
-
if (!synapse)
|
|
27
|
-
return;
|
|
28
|
-
const newWeight = synapse.weight * factor;
|
|
29
|
-
if (newWeight < config.pruneThreshold) {
|
|
30
|
-
repo.delete(synapseId);
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
repo.update(synapseId, { weight: newWeight });
|
|
34
|
-
}
|
|
35
|
-
}
|
|
1
|
+
// Re-export from brain-core
|
|
2
|
+
export { strengthen, weaken } from '@timmeck/brain-core';
|
|
36
3
|
//# sourceMappingURL=hebbian.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hebbian.js","sourceRoot":"","sources":["../../src/synapses/hebbian.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hebbian.js","sourceRoot":"","sources":["../../src/synapses/hebbian.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -1,14 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export interface PathNode {
|
|
4
|
-
type: NodeType;
|
|
5
|
-
id: number;
|
|
6
|
-
}
|
|
7
|
-
export interface SynapsePath {
|
|
8
|
-
from: PathNode;
|
|
9
|
-
to: PathNode;
|
|
10
|
-
synapses: SynapseRecord[];
|
|
11
|
-
totalWeight: number;
|
|
12
|
-
hops: number;
|
|
13
|
-
}
|
|
14
|
-
export declare function findPath(repo: SynapseRepository, from: PathNode, to: PathNode, maxDepth?: number): SynapsePath | null;
|
|
1
|
+
export { findPath } from '@timmeck/brain-core';
|
|
2
|
+
export type { PathNode, SynapsePath } from '@timmeck/brain-core';
|
|
@@ -1,50 +1,3 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
const queue = [{ node: from, path: [], totalWeight: 1.0 }];
|
|
4
|
-
let bestPath = null;
|
|
5
|
-
while (queue.length > 0) {
|
|
6
|
-
const current = queue.shift();
|
|
7
|
-
const key = `${current.node.type}:${current.node.id}`;
|
|
8
|
-
if (visited.has(key))
|
|
9
|
-
continue;
|
|
10
|
-
visited.add(key);
|
|
11
|
-
if (current.node.type === to.type && current.node.id === to.id) {
|
|
12
|
-
if (!bestPath || current.totalWeight > bestPath.totalWeight) {
|
|
13
|
-
bestPath = {
|
|
14
|
-
from,
|
|
15
|
-
to,
|
|
16
|
-
synapses: current.path,
|
|
17
|
-
totalWeight: current.totalWeight,
|
|
18
|
-
hops: current.path.length,
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
continue;
|
|
22
|
-
}
|
|
23
|
-
if (current.path.length >= maxDepth)
|
|
24
|
-
continue;
|
|
25
|
-
const outgoing = repo.getOutgoing(current.node.type, current.node.id);
|
|
26
|
-
for (const synapse of outgoing) {
|
|
27
|
-
const targetKey = `${synapse.target_type}:${synapse.target_id}`;
|
|
28
|
-
if (!visited.has(targetKey)) {
|
|
29
|
-
queue.push({
|
|
30
|
-
node: { type: synapse.target_type, id: synapse.target_id },
|
|
31
|
-
path: [...current.path, synapse],
|
|
32
|
-
totalWeight: current.totalWeight * synapse.weight,
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
const incoming = repo.getIncoming(current.node.type, current.node.id);
|
|
37
|
-
for (const synapse of incoming) {
|
|
38
|
-
const sourceKey = `${synapse.source_type}:${synapse.source_id}`;
|
|
39
|
-
if (!visited.has(sourceKey)) {
|
|
40
|
-
queue.push({
|
|
41
|
-
node: { type: synapse.source_type, id: synapse.source_id },
|
|
42
|
-
path: [...current.path, synapse],
|
|
43
|
-
totalWeight: current.totalWeight * synapse.weight,
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return bestPath;
|
|
49
|
-
}
|
|
1
|
+
// Re-export from brain-core
|
|
2
|
+
export { findPath } from '@timmeck/brain-core';
|
|
50
3
|
//# sourceMappingURL=pathfinder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pathfinder.js","sourceRoot":"","sources":["../../src/synapses/pathfinder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pathfinder.js","sourceRoot":"","sources":["../../src/synapses/pathfinder.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -1,23 +1,10 @@
|
|
|
1
|
-
import
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export declare class SynapseManager {
|
|
8
|
-
private repo;
|
|
9
|
-
private config;
|
|
10
|
-
private logger;
|
|
11
|
-
constructor(repo: SynapseRepository, config: SynapsesConfig);
|
|
12
|
-
strengthen(source: NodeRef, target: NodeRef, synapseType: SynapseType, context?: Record<string, unknown>): SynapseRecord;
|
|
13
|
-
weaken(synapseId: number, factor?: number): void;
|
|
14
|
-
find(source: NodeRef, target: NodeRef, synapseType: SynapseType): SynapseRecord | undefined;
|
|
15
|
-
activate(startNode: NodeRef, maxDepth?: number, minWeight?: number): ActivationResult[];
|
|
16
|
-
findPath(from: NodeRef, to: NodeRef, maxDepth?: number): SynapsePath | null;
|
|
17
|
-
runDecay(): {
|
|
18
|
-
decayed: number;
|
|
19
|
-
pruned: number;
|
|
20
|
-
};
|
|
1
|
+
import { BaseSynapseManager } from '@timmeck/brain-core';
|
|
2
|
+
import type { ActivationResult } from '@timmeck/brain-core';
|
|
3
|
+
/**
|
|
4
|
+
* Brain-specific SynapseManager.
|
|
5
|
+
* Extends BaseSynapseManager with error-context domain methods.
|
|
6
|
+
*/
|
|
7
|
+
export declare class SynapseManager extends BaseSynapseManager {
|
|
21
8
|
getErrorContext(errorId: number): {
|
|
22
9
|
solutions: ActivationResult[];
|
|
23
10
|
relatedErrors: ActivationResult[];
|
|
@@ -25,7 +12,4 @@ export declare class SynapseManager {
|
|
|
25
12
|
preventionRules: ActivationResult[];
|
|
26
13
|
insights: ActivationResult[];
|
|
27
14
|
};
|
|
28
|
-
getStrongestSynapses(limit?: number): SynapseRecord[];
|
|
29
|
-
getDiverseSynapses(perType?: number): SynapseRecord[];
|
|
30
|
-
getNetworkStats(): NetworkStats;
|
|
31
15
|
}
|
|
@@ -1,51 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export class SynapseManager {
|
|
7
|
-
repo;
|
|
8
|
-
config;
|
|
9
|
-
logger = getLogger();
|
|
10
|
-
constructor(repo, config) {
|
|
11
|
-
this.repo = repo;
|
|
12
|
-
this.config = config;
|
|
13
|
-
}
|
|
14
|
-
strengthen(source, target, synapseType, context) {
|
|
15
|
-
this.logger.debug(`Strengthening synapse ${source.type}:${source.id} --${synapseType}--> ${target.type}:${target.id}`);
|
|
16
|
-
return strengthen(this.repo, source, target, synapseType, {
|
|
17
|
-
initialWeight: this.config.initialWeight,
|
|
18
|
-
learningRate: this.config.learningRate,
|
|
19
|
-
pruneThreshold: this.config.pruneThreshold,
|
|
20
|
-
}, context);
|
|
21
|
-
}
|
|
22
|
-
weaken(synapseId, factor = 0.5) {
|
|
23
|
-
this.logger.debug(`Weakening synapse ${synapseId} by factor ${factor}`);
|
|
24
|
-
weaken(this.repo, synapseId, {
|
|
25
|
-
initialWeight: this.config.initialWeight,
|
|
26
|
-
learningRate: this.config.learningRate,
|
|
27
|
-
pruneThreshold: this.config.pruneThreshold,
|
|
28
|
-
}, factor);
|
|
29
|
-
}
|
|
30
|
-
find(source, target, synapseType) {
|
|
31
|
-
return this.repo.findBySourceTarget(source.type, source.id, target.type, target.id, synapseType);
|
|
32
|
-
}
|
|
33
|
-
activate(startNode, maxDepth, minWeight) {
|
|
34
|
-
return spreadingActivation(this.repo, startNode, maxDepth ?? this.config.maxDepth, minWeight ?? this.config.minActivationWeight);
|
|
35
|
-
}
|
|
36
|
-
findPath(from, to, maxDepth) {
|
|
37
|
-
return findPath(this.repo, from, to, maxDepth ?? this.config.maxDepth + 2);
|
|
38
|
-
}
|
|
39
|
-
runDecay() {
|
|
40
|
-
this.logger.info('Running synapse decay cycle');
|
|
41
|
-
const result = decayAll(this.repo, {
|
|
42
|
-
decayHalfLifeDays: this.config.decayHalfLifeDays,
|
|
43
|
-
decayAfterDays: this.config.decayAfterDays,
|
|
44
|
-
pruneThreshold: this.config.pruneThreshold,
|
|
45
|
-
});
|
|
46
|
-
this.logger.info(`Decay complete: ${result.decayed} decayed, ${result.pruned} pruned`);
|
|
47
|
-
return result;
|
|
48
|
-
}
|
|
1
|
+
import { BaseSynapseManager } from '@timmeck/brain-core';
|
|
2
|
+
/**
|
|
3
|
+
* Brain-specific SynapseManager.
|
|
4
|
+
* Extends BaseSynapseManager with error-context domain methods.
|
|
5
|
+
*/
|
|
6
|
+
export class SynapseManager extends BaseSynapseManager {
|
|
49
7
|
getErrorContext(errorId) {
|
|
50
8
|
const all = this.activate({ type: 'error', id: errorId });
|
|
51
9
|
return {
|
|
@@ -56,20 +14,5 @@ export class SynapseManager {
|
|
|
56
14
|
insights: all.filter(a => a.node.type === 'insight'),
|
|
57
15
|
};
|
|
58
16
|
}
|
|
59
|
-
getStrongestSynapses(limit = 20) {
|
|
60
|
-
return this.repo.topByWeight(limit);
|
|
61
|
-
}
|
|
62
|
-
getDiverseSynapses(perType = 25) {
|
|
63
|
-
return this.repo.topDiverse(perType);
|
|
64
|
-
}
|
|
65
|
-
getNetworkStats() {
|
|
66
|
-
return {
|
|
67
|
-
totalNodes: this.repo.countNodes(),
|
|
68
|
-
totalSynapses: this.repo.totalCount(),
|
|
69
|
-
avgWeight: this.repo.avgWeight(),
|
|
70
|
-
nodesByType: {},
|
|
71
|
-
synapsesByType: this.repo.countByType(),
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
17
|
}
|
|
75
18
|
//# sourceMappingURL=synapse-manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"synapse-manager.js","sourceRoot":"","sources":["../../src/synapses/synapse-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"synapse-manager.js","sourceRoot":"","sources":["../../src/synapses/synapse-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAGzD;;;GAGG;AACH,MAAM,OAAO,cAAe,SAAQ,kBAAkB;IACpD,eAAe,CAAC,OAAe;QAO7B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1D,OAAO;YACL,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC;YACtD,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC;YACvD,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC;YAC/D,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC;YACxD,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC;SACrD,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -1,11 +1 @@
|
|
|
1
|
-
export
|
|
2
|
-
id: string;
|
|
3
|
-
type: 'request' | 'response' | 'notification';
|
|
4
|
-
method?: string;
|
|
5
|
-
params?: unknown;
|
|
6
|
-
result?: unknown;
|
|
7
|
-
error?: {
|
|
8
|
-
code: number;
|
|
9
|
-
message: string;
|
|
10
|
-
};
|
|
11
|
-
}
|
|
1
|
+
export type { IpcMessage } from '@timmeck/brain-core';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { sha256 } from '../hash.js';
|
|
3
|
+
describe('sha256', () => {
|
|
4
|
+
it('returns a 64-character hex string', () => {
|
|
5
|
+
const hash = sha256('hello');
|
|
6
|
+
expect(hash).toHaveLength(64);
|
|
7
|
+
expect(hash).toMatch(/^[a-f0-9]{64}$/);
|
|
8
|
+
});
|
|
9
|
+
it('produces consistent output for same input', () => {
|
|
10
|
+
expect(sha256('test')).toBe(sha256('test'));
|
|
11
|
+
});
|
|
12
|
+
it('produces different output for different inputs', () => {
|
|
13
|
+
expect(sha256('a')).not.toBe(sha256('b'));
|
|
14
|
+
});
|
|
15
|
+
it('matches known SHA-256 digest for empty string', () => {
|
|
16
|
+
// SHA-256 of "" is well-known
|
|
17
|
+
expect(sha256('')).toBe('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855');
|
|
18
|
+
});
|
|
19
|
+
it('matches known SHA-256 digest for "hello"', () => {
|
|
20
|
+
expect(sha256('hello')).toBe('2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824');
|
|
21
|
+
});
|
|
22
|
+
it('handles unicode input', () => {
|
|
23
|
+
const hash = sha256('\u00fc\u00f6\u00e4');
|
|
24
|
+
expect(hash).toMatch(/^[a-f0-9]{64}$/);
|
|
25
|
+
});
|
|
26
|
+
it('handles long input', () => {
|
|
27
|
+
const long = 'x'.repeat(10_000);
|
|
28
|
+
const hash = sha256(long);
|
|
29
|
+
expect(hash).toMatch(/^[a-f0-9]{64}$/);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=hash.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/hash.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,8BAA8B;QAC9B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CACrB,kEAAkE,CACnE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAC1B,kEAAkE,CACnE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { describe, it, expect, afterEach } from 'vitest';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { normalizePath, getDataDir, getPipeName } from '../paths.js';
|
|
5
|
+
describe('normalizePath', () => {
|
|
6
|
+
it('converts backslashes to forward slashes', () => {
|
|
7
|
+
expect(normalizePath('C:\\Users\\test\\file.ts')).toBe('C:/Users/test/file.ts');
|
|
8
|
+
});
|
|
9
|
+
it('leaves forward slashes unchanged', () => {
|
|
10
|
+
expect(normalizePath('/home/user/file.ts')).toBe('/home/user/file.ts');
|
|
11
|
+
});
|
|
12
|
+
it('handles mixed slashes', () => {
|
|
13
|
+
expect(normalizePath('src\\utils/hash.ts')).toBe('src/utils/hash.ts');
|
|
14
|
+
});
|
|
15
|
+
it('handles empty string', () => {
|
|
16
|
+
expect(normalizePath('')).toBe('');
|
|
17
|
+
});
|
|
18
|
+
it('handles path with no slashes', () => {
|
|
19
|
+
expect(normalizePath('file.ts')).toBe('file.ts');
|
|
20
|
+
});
|
|
21
|
+
it('handles multiple consecutive backslashes', () => {
|
|
22
|
+
expect(normalizePath('a\\\\b\\\\c')).toBe('a//b//c');
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
describe('getDataDir', () => {
|
|
26
|
+
const originalEnv = process.env['BRAIN_DATA_DIR'];
|
|
27
|
+
afterEach(() => {
|
|
28
|
+
if (originalEnv !== undefined) {
|
|
29
|
+
process.env['BRAIN_DATA_DIR'] = originalEnv;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
delete process.env['BRAIN_DATA_DIR'];
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
it('returns BRAIN_DATA_DIR when env variable is set', () => {
|
|
36
|
+
process.env['BRAIN_DATA_DIR'] = '/tmp/brain-test';
|
|
37
|
+
const dir = getDataDir();
|
|
38
|
+
expect(dir).toBe(path.resolve('/tmp/brain-test'));
|
|
39
|
+
});
|
|
40
|
+
it('resolves relative BRAIN_DATA_DIR to absolute path', () => {
|
|
41
|
+
process.env['BRAIN_DATA_DIR'] = './data';
|
|
42
|
+
const dir = getDataDir();
|
|
43
|
+
expect(path.isAbsolute(dir)).toBe(true);
|
|
44
|
+
});
|
|
45
|
+
it('returns ~/.brain when env variable is not set', () => {
|
|
46
|
+
delete process.env['BRAIN_DATA_DIR'];
|
|
47
|
+
const dir = getDataDir();
|
|
48
|
+
expect(dir).toBe(path.join(os.homedir(), '.brain'));
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe('getPipeName', () => {
|
|
52
|
+
it('uses default name "brain"', () => {
|
|
53
|
+
const pipe = getPipeName();
|
|
54
|
+
if (process.platform === 'win32') {
|
|
55
|
+
expect(pipe).toBe('\\\\.\\pipe\\brain');
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
expect(pipe).toBe(path.join(os.tmpdir(), 'brain.sock'));
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
it('accepts a custom name', () => {
|
|
62
|
+
const pipe = getPipeName('custom');
|
|
63
|
+
if (process.platform === 'win32') {
|
|
64
|
+
expect(pipe).toBe('\\\\.\\pipe\\custom');
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
expect(pipe).toBe(path.join(os.tmpdir(), 'custom.sock'));
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
it('returns a string containing the name', () => {
|
|
71
|
+
const pipe = getPipeName('myservice');
|
|
72
|
+
expect(pipe).toContain('myservice');
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
//# sourceMappingURL=paths.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/paths.test.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/events.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export
|
|
1
|
+
import { TypedEventBus as GenericEventBus } from '@timmeck/brain-core';
|
|
2
|
+
export type BrainEvents = {
|
|
3
3
|
'error:reported': {
|
|
4
4
|
errorId: number;
|
|
5
5
|
projectId: number;
|
|
@@ -48,12 +48,8 @@ export interface BrainEvents {
|
|
|
48
48
|
'terminal:disconnected': {
|
|
49
49
|
terminalId: number;
|
|
50
50
|
};
|
|
51
|
-
}
|
|
51
|
+
};
|
|
52
52
|
export type BrainEventName = keyof BrainEvents;
|
|
53
|
-
export declare class TypedEventBus extends
|
|
54
|
-
emit<K extends BrainEventName>(event: K, data: BrainEvents[K]): boolean;
|
|
55
|
-
on<K extends BrainEventName>(event: K, listener: (data: BrainEvents[K]) => void): this;
|
|
56
|
-
once<K extends BrainEventName>(event: K, listener: (data: BrainEvents[K]) => void): this;
|
|
57
|
-
off<K extends BrainEventName>(event: K, listener: (data: BrainEvents[K]) => void): this;
|
|
53
|
+
export declare class TypedEventBus extends GenericEventBus<BrainEvents> {
|
|
58
54
|
}
|
|
59
55
|
export declare function getEventBus(): TypedEventBus;
|
package/dist/utils/events.js
CHANGED
|
@@ -1,17 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export class TypedEventBus extends
|
|
3
|
-
emit(event, data) {
|
|
4
|
-
return super.emit(event, data);
|
|
5
|
-
}
|
|
6
|
-
on(event, listener) {
|
|
7
|
-
return super.on(event, listener);
|
|
8
|
-
}
|
|
9
|
-
once(event, listener) {
|
|
10
|
-
return super.once(event, listener);
|
|
11
|
-
}
|
|
12
|
-
off(event, listener) {
|
|
13
|
-
return super.off(event, listener);
|
|
14
|
-
}
|
|
1
|
+
import { TypedEventBus as GenericEventBus } from '@timmeck/brain-core';
|
|
2
|
+
export class TypedEventBus extends GenericEventBus {
|
|
15
3
|
}
|
|
16
4
|
let busInstance = null;
|
|
17
5
|
export function getEventBus() {
|
package/dist/utils/events.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/utils/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/utils/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,IAAI,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAmBvE,MAAM,OAAO,aAAc,SAAQ,eAA4B;CAAG;AAElE,IAAI,WAAW,GAAyB,IAAI,CAAC;AAE7C,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,WAAW,GAAG,IAAI,aAAa,EAAE,CAAC;IACpC,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
package/dist/utils/hash.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export
|
|
1
|
+
export { sha256 } from '@timmeck/brain-core';
|
package/dist/utils/hash.js
CHANGED
package/dist/utils/hash.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/utils/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/utils/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/utils/logger.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { getLogger, resetLogger } from '@timmeck/brain-core';
|
|
2
|
+
import type winston from 'winston';
|
|
2
3
|
export declare function createLogger(opts?: {
|
|
3
4
|
level?: string;
|
|
4
5
|
file?: string;
|
|
5
6
|
maxSize?: number;
|
|
6
7
|
maxFiles?: number;
|
|
7
8
|
}): winston.Logger;
|
|
8
|
-
export
|
|
9
|
+
export { getLogger, resetLogger };
|
package/dist/utils/logger.js
CHANGED
|
@@ -1,39 +1,12 @@
|
|
|
1
|
-
import
|
|
2
|
-
import path from 'node:path';
|
|
1
|
+
import { createLogger as coreCreateLogger, getLogger, resetLogger } from '@timmeck/brain-core';
|
|
3
2
|
import { getDataDir } from './paths.js';
|
|
4
|
-
const { combine, timestamp, printf, colorize } = winston.format;
|
|
5
|
-
const logFormat = printf(({ level, message, timestamp, ...meta }) => {
|
|
6
|
-
const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : '';
|
|
7
|
-
return `${timestamp} [${level}]${metaStr} ${message}`;
|
|
8
|
-
});
|
|
9
|
-
let loggerInstance = null;
|
|
10
3
|
export function createLogger(opts) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const transports = [
|
|
18
|
-
new winston.transports.File({
|
|
19
|
-
filename: logFile,
|
|
20
|
-
maxsize: maxSize,
|
|
21
|
-
maxFiles,
|
|
22
|
-
format: combine(timestamp(), logFormat),
|
|
23
|
-
}),
|
|
24
|
-
];
|
|
25
|
-
if (process.env['NODE_ENV'] !== 'production') {
|
|
26
|
-
transports.push(new winston.transports.Console({
|
|
27
|
-
format: combine(colorize(), timestamp(), logFormat),
|
|
28
|
-
}));
|
|
29
|
-
}
|
|
30
|
-
loggerInstance = winston.createLogger({ level, transports });
|
|
31
|
-
return loggerInstance;
|
|
32
|
-
}
|
|
33
|
-
export function getLogger() {
|
|
34
|
-
if (!loggerInstance) {
|
|
35
|
-
return createLogger();
|
|
36
|
-
}
|
|
37
|
-
return loggerInstance;
|
|
4
|
+
return coreCreateLogger({
|
|
5
|
+
...opts,
|
|
6
|
+
envVar: 'BRAIN_LOG_LEVEL',
|
|
7
|
+
defaultFilename: 'brain.log',
|
|
8
|
+
dataDir: opts?.file ? undefined : getDataDir(),
|
|
9
|
+
});
|
|
38
10
|
}
|
|
11
|
+
export { getLogger, resetLogger };
|
|
39
12
|
//# sourceMappingURL=logger.js.map
|
package/dist/utils/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAE/F,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,UAAU,YAAY,CAAC,IAA6E;IACxG,OAAO,gBAAgB,CAAC;QACtB,GAAG,IAAI;QACP,MAAM,EAAE,iBAAiB;QACzB,eAAe,EAAE,WAAW;QAC5B,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE;KAC/C,CAAC,CAAC;AACL,CAAC;AAED,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC"}
|
package/dist/utils/paths.d.ts
CHANGED
package/dist/utils/paths.js
CHANGED
|
@@ -1,18 +1,9 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
export function normalizePath(filePath) {
|
|
4
|
-
return filePath.replace(/\\/g, '/');
|
|
5
|
-
}
|
|
1
|
+
import { normalizePath, getDataDir as coreGetDataDir, getPipeName as coreGetPipeName } from '@timmeck/brain-core';
|
|
2
|
+
export { normalizePath };
|
|
6
3
|
export function getDataDir() {
|
|
7
|
-
|
|
8
|
-
if (envDir)
|
|
9
|
-
return path.resolve(envDir);
|
|
10
|
-
return path.join(os.homedir(), '.brain');
|
|
4
|
+
return coreGetDataDir('BRAIN_DATA_DIR', '.brain');
|
|
11
5
|
}
|
|
12
6
|
export function getPipeName(name = 'brain') {
|
|
13
|
-
|
|
14
|
-
return `\\\\.\\pipe\\${name}`;
|
|
15
|
-
}
|
|
16
|
-
return path.join(os.tmpdir(), `${name}.sock`);
|
|
7
|
+
return coreGetPipeName(name);
|
|
17
8
|
}
|
|
18
9
|
//# sourceMappingURL=paths.js.map
|
package/dist/utils/paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,IAAI,cAAc,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAElH,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB,MAAM,UAAU,UAAU;IACxB,OAAO,cAAc,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe,OAAO;IAChD,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC"}
|
package/eslint.config.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import tseslint from 'typescript-eslint';
|
|
2
|
+
|
|
3
|
+
export default tseslint.config(
|
|
4
|
+
...tseslint.configs.recommended,
|
|
5
|
+
{
|
|
6
|
+
ignores: ['dist/', 'node_modules/', '**/*.js', '**/*.d.ts'],
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
rules: {
|
|
10
|
+
'@typescript-eslint/no-explicit-any': 'warn',
|
|
11
|
+
'@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_' }],
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
);
|