@jamesaphoenix/tx-core 0.4.1
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/dist/db.d.ts +42 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +46 -0
- package/dist/db.js.map +1 -0
- package/dist/errors.d.ts +231 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +139 -0
- package/dist/errors.js.map +1 -0
- package/dist/id.d.ts +6 -0
- package/dist/id.d.ts.map +1 -0
- package/dist/id.js +21 -0
- package/dist/id.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/layer.d.ts +50 -0
- package/dist/layer.d.ts.map +1 -0
- package/dist/layer.js +155 -0
- package/dist/layer.js.map +1 -0
- package/dist/mappers/anchor.d.ts +14 -0
- package/dist/mappers/anchor.d.ts.map +1 -0
- package/dist/mappers/anchor.js +38 -0
- package/dist/mappers/anchor.js.map +1 -0
- package/dist/mappers/attempt.d.ts +15 -0
- package/dist/mappers/attempt.d.ts.map +1 -0
- package/dist/mappers/attempt.js +23 -0
- package/dist/mappers/attempt.js.map +1 -0
- package/dist/mappers/candidate.d.ts +23 -0
- package/dist/mappers/candidate.d.ts.map +1 -0
- package/dist/mappers/candidate.js +53 -0
- package/dist/mappers/candidate.js.map +1 -0
- package/dist/mappers/claim.d.ts +30 -0
- package/dist/mappers/claim.d.ts.map +1 -0
- package/dist/mappers/claim.js +32 -0
- package/dist/mappers/claim.js.map +1 -0
- package/dist/mappers/deduplication.d.ts +39 -0
- package/dist/mappers/deduplication.d.ts.map +1 -0
- package/dist/mappers/deduplication.js +53 -0
- package/dist/mappers/deduplication.js.map +1 -0
- package/dist/mappers/edge.d.ts +10 -0
- package/dist/mappers/edge.d.ts.map +1 -0
- package/dist/mappers/edge.js +19 -0
- package/dist/mappers/edge.js.map +1 -0
- package/dist/mappers/file-learning.d.ts +14 -0
- package/dist/mappers/file-learning.d.ts.map +1 -0
- package/dist/mappers/file-learning.js +75 -0
- package/dist/mappers/file-learning.js.map +1 -0
- package/dist/mappers/index.d.ts +17 -0
- package/dist/mappers/index.d.ts.map +1 -0
- package/dist/mappers/index.js +30 -0
- package/dist/mappers/index.js.map +1 -0
- package/dist/mappers/learning.d.ts +19 -0
- package/dist/mappers/learning.d.ts.map +1 -0
- package/dist/mappers/learning.js +41 -0
- package/dist/mappers/learning.js.map +1 -0
- package/dist/mappers/orchestrator-state.d.ts +33 -0
- package/dist/mappers/orchestrator-state.d.ts.map +1 -0
- package/dist/mappers/orchestrator-state.js +34 -0
- package/dist/mappers/orchestrator-state.js.map +1 -0
- package/dist/mappers/run.d.ts +32 -0
- package/dist/mappers/run.d.ts.map +1 -0
- package/dist/mappers/run.js +64 -0
- package/dist/mappers/run.js.map +1 -0
- package/dist/mappers/task.d.ts +23 -0
- package/dist/mappers/task.d.ts.map +1 -0
- package/dist/mappers/task.js +54 -0
- package/dist/mappers/task.js.map +1 -0
- package/dist/mappers/tracked-project.d.ts +15 -0
- package/dist/mappers/tracked-project.d.ts.map +1 -0
- package/dist/mappers/tracked-project.js +23 -0
- package/dist/mappers/tracked-project.js.map +1 -0
- package/dist/mappers/worker.d.ts +33 -0
- package/dist/mappers/worker.d.ts.map +1 -0
- package/dist/mappers/worker.js +35 -0
- package/dist/mappers/worker.js.map +1 -0
- package/dist/repo/anchor-repo.d.ts +52 -0
- package/dist/repo/anchor-repo.d.ts.map +1 -0
- package/dist/repo/anchor-repo.js +204 -0
- package/dist/repo/anchor-repo.js.map +1 -0
- package/dist/repo/attempt-repo.d.ts +25 -0
- package/dist/repo/attempt-repo.d.ts.map +1 -0
- package/dist/repo/attempt-repo.js +78 -0
- package/dist/repo/attempt-repo.js.map +1 -0
- package/dist/repo/candidate-repo.d.ts +16 -0
- package/dist/repo/candidate-repo.d.ts.map +1 -0
- package/dist/repo/candidate-repo.js +143 -0
- package/dist/repo/candidate-repo.js.map +1 -0
- package/dist/repo/claim-repo.d.ts +17 -0
- package/dist/repo/claim-repo.d.ts.map +1 -0
- package/dist/repo/claim-repo.js +62 -0
- package/dist/repo/claim-repo.js.map +1 -0
- package/dist/repo/deduplication-repo.d.ts +37 -0
- package/dist/repo/deduplication-repo.d.ts.map +1 -0
- package/dist/repo/deduplication-repo.js +133 -0
- package/dist/repo/deduplication-repo.js.map +1 -0
- package/dist/repo/dep-repo.d.ts +19 -0
- package/dist/repo/dep-repo.d.ts.map +1 -0
- package/dist/repo/dep-repo.js +104 -0
- package/dist/repo/dep-repo.js.map +1 -0
- package/dist/repo/edge-repo.d.ts +26 -0
- package/dist/repo/edge-repo.d.ts.map +1 -0
- package/dist/repo/edge-repo.js +227 -0
- package/dist/repo/edge-repo.js.map +1 -0
- package/dist/repo/file-learning-repo.d.ts +17 -0
- package/dist/repo/file-learning-repo.d.ts.map +1 -0
- package/dist/repo/file-learning-repo.js +60 -0
- package/dist/repo/file-learning-repo.js.map +1 -0
- package/dist/repo/index.d.ts +18 -0
- package/dist/repo/index.d.ts.map +1 -0
- package/dist/repo/index.js +18 -0
- package/dist/repo/index.js.map +1 -0
- package/dist/repo/learning-repo.d.ts +31 -0
- package/dist/repo/learning-repo.d.ts.map +1 -0
- package/dist/repo/learning-repo.js +165 -0
- package/dist/repo/learning-repo.js.map +1 -0
- package/dist/repo/orchestrator-state-repo.d.ts +27 -0
- package/dist/repo/orchestrator-state-repo.d.ts.map +1 -0
- package/dist/repo/orchestrator-state-repo.js +96 -0
- package/dist/repo/orchestrator-state-repo.js.map +1 -0
- package/dist/repo/run-repo.d.ts +31 -0
- package/dist/repo/run-repo.d.ts.map +1 -0
- package/dist/repo/run-repo.js +132 -0
- package/dist/repo/run-repo.js.map +1 -0
- package/dist/repo/task-repo.d.ts +21 -0
- package/dist/repo/task-repo.d.ts.map +1 -0
- package/dist/repo/task-repo.js +169 -0
- package/dist/repo/task-repo.js.map +1 -0
- package/dist/repo/tracked-project-repo.d.ts +16 -0
- package/dist/repo/tracked-project-repo.d.ts.map +1 -0
- package/dist/repo/tracked-project-repo.js +54 -0
- package/dist/repo/tracked-project-repo.js.map +1 -0
- package/dist/repo/worker-repo.d.ts +19 -0
- package/dist/repo/worker-repo.d.ts.map +1 -0
- package/dist/repo/worker-repo.js +72 -0
- package/dist/repo/worker-repo.js.map +1 -0
- package/dist/schemas/index.d.ts +8 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +7 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/sync.d.ts +296 -0
- package/dist/schemas/sync.d.ts.map +1 -0
- package/dist/schemas/sync.js +146 -0
- package/dist/schemas/sync.js.map +1 -0
- package/dist/schemas/worker.d.ts +77 -0
- package/dist/schemas/worker.d.ts.map +1 -0
- package/dist/schemas/worker.js +80 -0
- package/dist/schemas/worker.js.map +1 -0
- package/dist/services/anchor-service.d.ts +147 -0
- package/dist/services/anchor-service.d.ts.map +1 -0
- package/dist/services/anchor-service.js +540 -0
- package/dist/services/anchor-service.js.map +1 -0
- package/dist/services/anchor-verification.d.ts +94 -0
- package/dist/services/anchor-verification.d.ts.map +1 -0
- package/dist/services/anchor-verification.js +617 -0
- package/dist/services/anchor-verification.js.map +1 -0
- package/dist/services/ast-grep-service.d.ts +58 -0
- package/dist/services/ast-grep-service.d.ts.map +1 -0
- package/dist/services/ast-grep-service.js +356 -0
- package/dist/services/ast-grep-service.js.map +1 -0
- package/dist/services/attempt-service.d.ts +24 -0
- package/dist/services/attempt-service.d.ts.map +1 -0
- package/dist/services/attempt-service.js +55 -0
- package/dist/services/attempt-service.js.map +1 -0
- package/dist/services/auto-sync-service.d.ts +56 -0
- package/dist/services/auto-sync-service.d.ts.map +1 -0
- package/dist/services/auto-sync-service.js +66 -0
- package/dist/services/auto-sync-service.js.map +1 -0
- package/dist/services/candidate-extractor-service.d.ts +56 -0
- package/dist/services/candidate-extractor-service.d.ts.map +1 -0
- package/dist/services/candidate-extractor-service.js +365 -0
- package/dist/services/candidate-extractor-service.js.map +1 -0
- package/dist/services/claim-service.d.ts +52 -0
- package/dist/services/claim-service.d.ts.map +1 -0
- package/dist/services/claim-service.js +134 -0
- package/dist/services/claim-service.js.map +1 -0
- package/dist/services/daemon-service.d.ts +214 -0
- package/dist/services/daemon-service.d.ts.map +1 -0
- package/dist/services/daemon-service.js +522 -0
- package/dist/services/daemon-service.js.map +1 -0
- package/dist/services/deduplication-service.d.ts +67 -0
- package/dist/services/deduplication-service.d.ts.map +1 -0
- package/dist/services/deduplication-service.js +145 -0
- package/dist/services/deduplication-service.js.map +1 -0
- package/dist/services/dep-service.d.ts +14 -0
- package/dist/services/dep-service.d.ts.map +1 -0
- package/dist/services/dep-service.js +34 -0
- package/dist/services/dep-service.js.map +1 -0
- package/dist/services/diversifier-service.d.ts +46 -0
- package/dist/services/diversifier-service.d.ts.map +1 -0
- package/dist/services/diversifier-service.js +197 -0
- package/dist/services/diversifier-service.js.map +1 -0
- package/dist/services/edge-service.d.ts +78 -0
- package/dist/services/edge-service.d.ts.map +1 -0
- package/dist/services/edge-service.js +158 -0
- package/dist/services/edge-service.js.map +1 -0
- package/dist/services/embedding-service.d.ts +138 -0
- package/dist/services/embedding-service.d.ts.map +1 -0
- package/dist/services/embedding-service.js +318 -0
- package/dist/services/embedding-service.js.map +1 -0
- package/dist/services/feedback-tracker.d.ts +64 -0
- package/dist/services/feedback-tracker.d.ts.map +1 -0
- package/dist/services/feedback-tracker.js +110 -0
- package/dist/services/feedback-tracker.js.map +1 -0
- package/dist/services/file-learning-service.d.ts +17 -0
- package/dist/services/file-learning-service.d.ts.map +1 -0
- package/dist/services/file-learning-service.js +41 -0
- package/dist/services/file-learning-service.js.map +1 -0
- package/dist/services/file-watcher-service.d.ts +141 -0
- package/dist/services/file-watcher-service.d.ts.map +1 -0
- package/dist/services/file-watcher-service.js +278 -0
- package/dist/services/file-watcher-service.js.map +1 -0
- package/dist/services/graph-expansion.d.ts +155 -0
- package/dist/services/graph-expansion.d.ts.map +1 -0
- package/dist/services/graph-expansion.js +466 -0
- package/dist/services/graph-expansion.js.map +1 -0
- package/dist/services/hierarchy-service.d.ts +16 -0
- package/dist/services/hierarchy-service.d.ts.map +1 -0
- package/dist/services/hierarchy-service.js +66 -0
- package/dist/services/hierarchy-service.js.map +1 -0
- package/dist/services/index.d.ts +36 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +36 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/learning-service.d.ts +39 -0
- package/dist/services/learning-service.d.ts.map +1 -0
- package/dist/services/learning-service.js +151 -0
- package/dist/services/learning-service.js.map +1 -0
- package/dist/services/migration-service.d.ts +67 -0
- package/dist/services/migration-service.d.ts.map +1 -0
- package/dist/services/migration-service.js +144 -0
- package/dist/services/migration-service.js.map +1 -0
- package/dist/services/orchestrator-service.d.ts +52 -0
- package/dist/services/orchestrator-service.d.ts.map +1 -0
- package/dist/services/orchestrator-service.js +203 -0
- package/dist/services/orchestrator-service.js.map +1 -0
- package/dist/services/promotion-service.d.ts +67 -0
- package/dist/services/promotion-service.d.ts.map +1 -0
- package/dist/services/promotion-service.js +151 -0
- package/dist/services/promotion-service.js.map +1 -0
- package/dist/services/query-expansion-service.d.ts +55 -0
- package/dist/services/query-expansion-service.d.ts.map +1 -0
- package/dist/services/query-expansion-service.js +174 -0
- package/dist/services/query-expansion-service.js.map +1 -0
- package/dist/services/ready-service.d.ts +16 -0
- package/dist/services/ready-service.d.ts.map +1 -0
- package/dist/services/ready-service.js +70 -0
- package/dist/services/ready-service.js.map +1 -0
- package/dist/services/reranker-service.d.ts +51 -0
- package/dist/services/reranker-service.d.ts.map +1 -0
- package/dist/services/reranker-service.js +128 -0
- package/dist/services/reranker-service.js.map +1 -0
- package/dist/services/retriever-service.d.ts +49 -0
- package/dist/services/retriever-service.d.ts.map +1 -0
- package/dist/services/retriever-service.js +419 -0
- package/dist/services/retriever-service.js.map +1 -0
- package/dist/services/score-service.d.ts +43 -0
- package/dist/services/score-service.d.ts.map +1 -0
- package/dist/services/score-service.js +82 -0
- package/dist/services/score-service.js.map +1 -0
- package/dist/services/swarm-verification.d.ts +104 -0
- package/dist/services/swarm-verification.d.ts.map +1 -0
- package/dist/services/swarm-verification.js +400 -0
- package/dist/services/swarm-verification.js.map +1 -0
- package/dist/services/sync-service.d.ts +115 -0
- package/dist/services/sync-service.d.ts.map +1 -0
- package/dist/services/sync-service.js +350 -0
- package/dist/services/sync-service.js.map +1 -0
- package/dist/services/task-service.d.ts +22 -0
- package/dist/services/task-service.d.ts.map +1 -0
- package/dist/services/task-service.js +221 -0
- package/dist/services/task-service.js.map +1 -0
- package/dist/services/worker-process.d.ts +41 -0
- package/dist/services/worker-process.d.ts.map +1 -0
- package/dist/services/worker-process.js +280 -0
- package/dist/services/worker-process.js.map +1 -0
- package/dist/services/worker-service.d.ts +74 -0
- package/dist/services/worker-service.d.ts.map +1 -0
- package/dist/services/worker-service.js +148 -0
- package/dist/services/worker-service.js.map +1 -0
- package/dist/utils/glob.d.ts +15 -0
- package/dist/utils/glob.d.ts.map +1 -0
- package/dist/utils/glob.js +27 -0
- package/dist/utils/glob.js.map +1 -0
- package/dist/utils/math.d.ts +6 -0
- package/dist/utils/math.d.ts.map +1 -0
- package/dist/utils/math.js +21 -0
- package/dist/utils/math.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { EdgeService } from "./edge-service.js";
|
|
3
|
+
import { LearningRepository } from "../repo/learning-repo.js";
|
|
4
|
+
import { AnchorRepository } from "../repo/anchor-repo.js";
|
|
5
|
+
import { ValidationError } from "../errors.js";
|
|
6
|
+
import { EDGE_TYPES } from "@jamesaphoenix/tx-types";
|
|
7
|
+
export class GraphExpansionService extends Context.Tag("GraphExpansionService")() {
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Noop implementation that returns seeds without expansion.
|
|
11
|
+
* Used when graph expansion is disabled or for testing.
|
|
12
|
+
*/
|
|
13
|
+
export const GraphExpansionServiceNoop = Layer.succeed(GraphExpansionService, {
|
|
14
|
+
expand: (seeds) => Effect.succeed({
|
|
15
|
+
seeds: seeds.map(s => ({
|
|
16
|
+
learning: s.learning,
|
|
17
|
+
hops: 0,
|
|
18
|
+
decayedScore: s.score,
|
|
19
|
+
path: [s.learning.id],
|
|
20
|
+
sourceEdge: null,
|
|
21
|
+
edgeWeight: null
|
|
22
|
+
})),
|
|
23
|
+
expanded: [],
|
|
24
|
+
all: seeds.map(s => ({
|
|
25
|
+
learning: s.learning,
|
|
26
|
+
hops: 0,
|
|
27
|
+
decayedScore: s.score,
|
|
28
|
+
path: [s.learning.id],
|
|
29
|
+
sourceEdge: null,
|
|
30
|
+
edgeWeight: null
|
|
31
|
+
})),
|
|
32
|
+
stats: {
|
|
33
|
+
seedCount: seeds.length,
|
|
34
|
+
expandedCount: 0,
|
|
35
|
+
maxDepthReached: 0,
|
|
36
|
+
nodesVisited: seeds.length
|
|
37
|
+
}
|
|
38
|
+
}),
|
|
39
|
+
expandFromFiles: (files) => Effect.succeed({
|
|
40
|
+
anchored: [],
|
|
41
|
+
expanded: [],
|
|
42
|
+
all: [],
|
|
43
|
+
stats: {
|
|
44
|
+
inputFileCount: files.length,
|
|
45
|
+
anchoredCount: 0,
|
|
46
|
+
expandedCount: 0,
|
|
47
|
+
maxDepthReached: 0,
|
|
48
|
+
filesVisited: files.length
|
|
49
|
+
}
|
|
50
|
+
})
|
|
51
|
+
});
|
|
52
|
+
/**
|
|
53
|
+
* Default expansion options.
|
|
54
|
+
*/
|
|
55
|
+
const DEFAULT_OPTIONS = {
|
|
56
|
+
depth: 2,
|
|
57
|
+
decayFactor: 0.7,
|
|
58
|
+
maxNodes: 100,
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Type guard to check if edgeTypes is a simple array (backwards compatibility).
|
|
62
|
+
*/
|
|
63
|
+
const isSimpleEdgeTypeArray = (edgeTypes) => {
|
|
64
|
+
if (edgeTypes === undefined)
|
|
65
|
+
return true;
|
|
66
|
+
return Array.isArray(edgeTypes);
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Validate an EdgeTypeFilter for conflicting include/exclude entries.
|
|
70
|
+
* Returns a ValidationError if the same edge type appears in both include and exclude.
|
|
71
|
+
*/
|
|
72
|
+
const validateEdgeTypeFilter = (filter, context = "edgeTypes") => Effect.gen(function* () {
|
|
73
|
+
const { include, exclude, perHop } = filter;
|
|
74
|
+
// Check for overlapping types in include and exclude
|
|
75
|
+
if (include && exclude) {
|
|
76
|
+
const includeSet = new Set(include);
|
|
77
|
+
const overlap = exclude.filter(t => includeSet.has(t));
|
|
78
|
+
if (overlap.length > 0) {
|
|
79
|
+
return yield* Effect.fail(new ValidationError({
|
|
80
|
+
reason: `${context}: conflicting filters - edge types appear in both include and exclude: ${overlap.join(", ")}`
|
|
81
|
+
}));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Recursively validate perHop filters
|
|
85
|
+
if (perHop) {
|
|
86
|
+
for (const [hop, hopFilter] of Object.entries(perHop)) {
|
|
87
|
+
yield* validateEdgeTypeFilter(hopFilter, `${context}.perHop[${hop}]`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
/**
|
|
92
|
+
* Resolve EdgeTypeFilter to an array of edge types for a specific hop.
|
|
93
|
+
* Returns undefined if all edge types should be traversed.
|
|
94
|
+
*/
|
|
95
|
+
const resolveEdgeTypesForHop = (filter, hop) => {
|
|
96
|
+
// Simple array or undefined - pass through
|
|
97
|
+
if (isSimpleEdgeTypeArray(filter)) {
|
|
98
|
+
return filter;
|
|
99
|
+
}
|
|
100
|
+
// Check for hop-specific override
|
|
101
|
+
const hopFilter = filter.perHop?.[hop];
|
|
102
|
+
if (hopFilter) {
|
|
103
|
+
// Recursively resolve (perHop filters don't have perHop themselves typically)
|
|
104
|
+
return resolveEdgeTypesForHop(hopFilter, hop);
|
|
105
|
+
}
|
|
106
|
+
// Apply include/exclude from base filter
|
|
107
|
+
const { include, exclude } = filter;
|
|
108
|
+
if (include && include.length > 0) {
|
|
109
|
+
return include;
|
|
110
|
+
}
|
|
111
|
+
if (exclude && exclude.length > 0) {
|
|
112
|
+
// Return all edge types except excluded ones
|
|
113
|
+
return EDGE_TYPES.filter(t => !exclude.includes(t));
|
|
114
|
+
}
|
|
115
|
+
// No filtering - return undefined to traverse all
|
|
116
|
+
return undefined;
|
|
117
|
+
};
|
|
118
|
+
/**
|
|
119
|
+
* Validate expansion options.
|
|
120
|
+
*/
|
|
121
|
+
const validateOptions = (options) => Effect.gen(function* () {
|
|
122
|
+
const depth = options.depth ?? DEFAULT_OPTIONS.depth;
|
|
123
|
+
const decayFactor = options.decayFactor ?? DEFAULT_OPTIONS.decayFactor;
|
|
124
|
+
const maxNodes = options.maxNodes ?? DEFAULT_OPTIONS.maxNodes;
|
|
125
|
+
if (depth < 0) {
|
|
126
|
+
return yield* Effect.fail(new ValidationError({
|
|
127
|
+
reason: `Expansion depth must be >= 0, got: ${depth}`
|
|
128
|
+
}));
|
|
129
|
+
}
|
|
130
|
+
if (depth > 10) {
|
|
131
|
+
return yield* Effect.fail(new ValidationError({
|
|
132
|
+
reason: `Expansion depth must be <= 10, got: ${depth}`
|
|
133
|
+
}));
|
|
134
|
+
}
|
|
135
|
+
if (decayFactor <= 0 || decayFactor > 1) {
|
|
136
|
+
return yield* Effect.fail(new ValidationError({
|
|
137
|
+
reason: `Decay factor must be in (0, 1], got: ${decayFactor}`
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
140
|
+
if (maxNodes < 1) {
|
|
141
|
+
return yield* Effect.fail(new ValidationError({
|
|
142
|
+
reason: `Max nodes must be >= 1, got: ${maxNodes}`
|
|
143
|
+
}));
|
|
144
|
+
}
|
|
145
|
+
// Validate EdgeTypeFilter if provided
|
|
146
|
+
if (options.edgeTypes && !isSimpleEdgeTypeArray(options.edgeTypes)) {
|
|
147
|
+
yield* validateEdgeTypeFilter(options.edgeTypes);
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
export const GraphExpansionServiceLive = Layer.effect(GraphExpansionService, Effect.gen(function* () {
|
|
151
|
+
const edgeService = yield* EdgeService;
|
|
152
|
+
const learningRepo = yield* LearningRepository;
|
|
153
|
+
const anchorRepo = yield* AnchorRepository;
|
|
154
|
+
return {
|
|
155
|
+
expand: (seeds, options = {}) => Effect.gen(function* () {
|
|
156
|
+
// Validate options
|
|
157
|
+
yield* validateOptions(options);
|
|
158
|
+
const depth = options.depth ?? DEFAULT_OPTIONS.depth;
|
|
159
|
+
const decayFactor = options.decayFactor ?? DEFAULT_OPTIONS.decayFactor;
|
|
160
|
+
const maxNodes = options.maxNodes ?? DEFAULT_OPTIONS.maxNodes;
|
|
161
|
+
const edgeTypeFilter = options.edgeTypes;
|
|
162
|
+
// Handle empty seeds
|
|
163
|
+
if (seeds.length === 0) {
|
|
164
|
+
return {
|
|
165
|
+
seeds: [],
|
|
166
|
+
expanded: [],
|
|
167
|
+
all: [],
|
|
168
|
+
stats: {
|
|
169
|
+
seedCount: 0,
|
|
170
|
+
expandedCount: 0,
|
|
171
|
+
maxDepthReached: 0,
|
|
172
|
+
nodesVisited: 0,
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
// Track visited learning IDs to prevent cycles
|
|
177
|
+
const visited = new Set();
|
|
178
|
+
// Convert seeds to ExpandedLearning format
|
|
179
|
+
const seedLearnings = seeds.map((seed) => {
|
|
180
|
+
visited.add(seed.learning.id);
|
|
181
|
+
return {
|
|
182
|
+
learning: seed.learning,
|
|
183
|
+
hops: 0,
|
|
184
|
+
decayedScore: seed.score,
|
|
185
|
+
path: [seed.learning.id],
|
|
186
|
+
sourceEdge: null,
|
|
187
|
+
edgeWeight: null,
|
|
188
|
+
};
|
|
189
|
+
});
|
|
190
|
+
// If depth is 0, just return seeds
|
|
191
|
+
if (depth === 0) {
|
|
192
|
+
return {
|
|
193
|
+
seeds: seedLearnings,
|
|
194
|
+
expanded: [],
|
|
195
|
+
all: seedLearnings,
|
|
196
|
+
stats: {
|
|
197
|
+
seedCount: seedLearnings.length,
|
|
198
|
+
expandedCount: 0,
|
|
199
|
+
maxDepthReached: 0,
|
|
200
|
+
nodesVisited: seedLearnings.length,
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
let frontier = seeds.map((seed) => ({
|
|
205
|
+
learningId: seed.learning.id,
|
|
206
|
+
score: seed.score,
|
|
207
|
+
path: [seed.learning.id],
|
|
208
|
+
}));
|
|
209
|
+
const expanded = [];
|
|
210
|
+
let maxDepthReached = 0;
|
|
211
|
+
// BFS traversal
|
|
212
|
+
for (let currentHop = 1; currentHop <= depth; currentHop++) {
|
|
213
|
+
if (frontier.length === 0)
|
|
214
|
+
break;
|
|
215
|
+
if (expanded.length >= maxNodes)
|
|
216
|
+
break;
|
|
217
|
+
const nextFrontier = [];
|
|
218
|
+
for (const node of frontier) {
|
|
219
|
+
if (expanded.length >= maxNodes)
|
|
220
|
+
break;
|
|
221
|
+
// Find neighbors bidirectionally (per PRD-016 resolved question #1)
|
|
222
|
+
// Resolve edge types for this specific hop (supports per-hop overrides)
|
|
223
|
+
const edgeTypesForHop = resolveEdgeTypesForHop(edgeTypeFilter, currentHop);
|
|
224
|
+
const neighbors = yield* edgeService.findNeighbors("learning", String(node.learningId), {
|
|
225
|
+
depth: 1,
|
|
226
|
+
direction: "both",
|
|
227
|
+
edgeTypes: edgeTypesForHop,
|
|
228
|
+
});
|
|
229
|
+
// Filter to only learning neighbors and process
|
|
230
|
+
const learningNeighbors = neighbors.filter((n) => n.nodeType === "learning");
|
|
231
|
+
for (const neighbor of learningNeighbors) {
|
|
232
|
+
if (expanded.length >= maxNodes)
|
|
233
|
+
break;
|
|
234
|
+
const neighborId = parseInt(neighbor.nodeId, 10);
|
|
235
|
+
if (isNaN(neighborId))
|
|
236
|
+
continue;
|
|
237
|
+
if (visited.has(neighborId))
|
|
238
|
+
continue;
|
|
239
|
+
visited.add(neighborId);
|
|
240
|
+
// Fetch the learning to include in results
|
|
241
|
+
const learning = yield* learningRepo.findById(neighborId);
|
|
242
|
+
if (!learning)
|
|
243
|
+
continue;
|
|
244
|
+
// Calculate decayed score: parentScore * edgeWeight * decayFactor
|
|
245
|
+
const newScore = node.score * neighbor.weight * decayFactor;
|
|
246
|
+
const newPath = [...node.path, learning.id];
|
|
247
|
+
expanded.push({
|
|
248
|
+
learning,
|
|
249
|
+
hops: currentHop,
|
|
250
|
+
decayedScore: newScore,
|
|
251
|
+
path: newPath,
|
|
252
|
+
sourceEdge: neighbor.edgeType,
|
|
253
|
+
edgeWeight: neighbor.weight,
|
|
254
|
+
});
|
|
255
|
+
maxDepthReached = currentHop;
|
|
256
|
+
// Add to next frontier for further expansion
|
|
257
|
+
nextFrontier.push({
|
|
258
|
+
learningId: learning.id,
|
|
259
|
+
score: newScore,
|
|
260
|
+
path: newPath,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
frontier = nextFrontier;
|
|
265
|
+
}
|
|
266
|
+
// Sort expanded by decayed score (highest first)
|
|
267
|
+
expanded.sort((a, b) => b.decayedScore - a.decayedScore);
|
|
268
|
+
// Enforce maxNodes limit on expanded
|
|
269
|
+
const limitedExpanded = expanded.slice(0, maxNodes);
|
|
270
|
+
const all = [...seedLearnings, ...limitedExpanded];
|
|
271
|
+
return {
|
|
272
|
+
seeds: seedLearnings,
|
|
273
|
+
expanded: limitedExpanded,
|
|
274
|
+
all,
|
|
275
|
+
stats: {
|
|
276
|
+
seedCount: seedLearnings.length,
|
|
277
|
+
expandedCount: limitedExpanded.length,
|
|
278
|
+
maxDepthReached,
|
|
279
|
+
nodesVisited: visited.size,
|
|
280
|
+
},
|
|
281
|
+
};
|
|
282
|
+
}),
|
|
283
|
+
expandFromFiles: (files, options = {}) => Effect.gen(function* () {
|
|
284
|
+
// Validate options
|
|
285
|
+
const depth = options.depth ?? DEFAULT_OPTIONS.depth;
|
|
286
|
+
const decayFactor = options.decayFactor ?? DEFAULT_OPTIONS.decayFactor;
|
|
287
|
+
const maxNodes = options.maxNodes ?? DEFAULT_OPTIONS.maxNodes;
|
|
288
|
+
if (depth < 0) {
|
|
289
|
+
return yield* Effect.fail(new ValidationError({
|
|
290
|
+
reason: `Expansion depth must be >= 0, got: ${depth}`
|
|
291
|
+
}));
|
|
292
|
+
}
|
|
293
|
+
if (depth > 10) {
|
|
294
|
+
return yield* Effect.fail(new ValidationError({
|
|
295
|
+
reason: `Expansion depth must be <= 10, got: ${depth}`
|
|
296
|
+
}));
|
|
297
|
+
}
|
|
298
|
+
if (decayFactor <= 0 || decayFactor > 1) {
|
|
299
|
+
return yield* Effect.fail(new ValidationError({
|
|
300
|
+
reason: `Decay factor must be in (0, 1], got: ${decayFactor}`
|
|
301
|
+
}));
|
|
302
|
+
}
|
|
303
|
+
if (maxNodes < 1) {
|
|
304
|
+
return yield* Effect.fail(new ValidationError({
|
|
305
|
+
reason: `Max nodes must be >= 1, got: ${maxNodes}`
|
|
306
|
+
}));
|
|
307
|
+
}
|
|
308
|
+
// Handle empty files input
|
|
309
|
+
if (files.length === 0) {
|
|
310
|
+
return {
|
|
311
|
+
anchored: [],
|
|
312
|
+
expanded: [],
|
|
313
|
+
all: [],
|
|
314
|
+
stats: {
|
|
315
|
+
inputFileCount: 0,
|
|
316
|
+
anchoredCount: 0,
|
|
317
|
+
expandedCount: 0,
|
|
318
|
+
maxDepthReached: 0,
|
|
319
|
+
filesVisited: 0,
|
|
320
|
+
},
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
// Track visited files and learnings to prevent duplicates
|
|
324
|
+
const visitedFiles = new Set(files);
|
|
325
|
+
const visitedLearningIds = new Set();
|
|
326
|
+
// Step 1: Find learnings ANCHORED_TO the input files (hop 0)
|
|
327
|
+
const anchoredLearnings = [];
|
|
328
|
+
for (const filePath of files) {
|
|
329
|
+
const anchors = yield* anchorRepo.findByFilePath(filePath);
|
|
330
|
+
// Filter to only valid anchors
|
|
331
|
+
const validAnchors = anchors.filter(a => a.status === "valid");
|
|
332
|
+
for (const anchor of validAnchors) {
|
|
333
|
+
if (visitedLearningIds.has(anchor.learningId))
|
|
334
|
+
continue;
|
|
335
|
+
visitedLearningIds.add(anchor.learningId);
|
|
336
|
+
const learning = yield* learningRepo.findById(anchor.learningId);
|
|
337
|
+
if (!learning)
|
|
338
|
+
continue;
|
|
339
|
+
anchoredLearnings.push({
|
|
340
|
+
learning,
|
|
341
|
+
sourceFile: filePath,
|
|
342
|
+
hops: 0,
|
|
343
|
+
decayedScore: 1.0, // Base score for directly anchored learnings
|
|
344
|
+
sourceEdge: "ANCHORED_TO",
|
|
345
|
+
edgeWeight: null,
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
// If depth is 0, just return anchored learnings
|
|
350
|
+
if (depth === 0) {
|
|
351
|
+
const limitedAnchored = anchoredLearnings.slice(0, maxNodes);
|
|
352
|
+
return {
|
|
353
|
+
anchored: limitedAnchored,
|
|
354
|
+
expanded: [],
|
|
355
|
+
all: limitedAnchored,
|
|
356
|
+
stats: {
|
|
357
|
+
inputFileCount: files.length,
|
|
358
|
+
anchoredCount: limitedAnchored.length,
|
|
359
|
+
expandedCount: 0,
|
|
360
|
+
maxDepthReached: 0,
|
|
361
|
+
filesVisited: files.length,
|
|
362
|
+
},
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
let frontier = files.map(f => ({
|
|
366
|
+
filePath: f,
|
|
367
|
+
score: 1.0,
|
|
368
|
+
}));
|
|
369
|
+
const expandedLearnings = [];
|
|
370
|
+
let maxDepthReached = 0;
|
|
371
|
+
const totalLearnings = () => anchoredLearnings.length + expandedLearnings.length;
|
|
372
|
+
// BFS traversal through file relationships
|
|
373
|
+
for (let currentHop = 1; currentHop <= depth; currentHop++) {
|
|
374
|
+
if (frontier.length === 0)
|
|
375
|
+
break;
|
|
376
|
+
if (totalLearnings() >= maxNodes)
|
|
377
|
+
break;
|
|
378
|
+
const nextFrontier = [];
|
|
379
|
+
for (const node of frontier) {
|
|
380
|
+
if (totalLearnings() >= maxNodes)
|
|
381
|
+
break;
|
|
382
|
+
// Find related files via IMPORTS and CO_CHANGES_WITH edges
|
|
383
|
+
// Note: For file nodes, nodeType is "file" and nodeId is the file path
|
|
384
|
+
const neighbors = yield* edgeService.findNeighbors("file", node.filePath, {
|
|
385
|
+
depth: 1,
|
|
386
|
+
direction: "both",
|
|
387
|
+
edgeTypes: ["IMPORTS", "CO_CHANGES_WITH"],
|
|
388
|
+
});
|
|
389
|
+
// Filter to only file neighbors
|
|
390
|
+
const fileNeighbors = neighbors.filter((n) => n.nodeType === "file");
|
|
391
|
+
for (const neighbor of fileNeighbors) {
|
|
392
|
+
if (totalLearnings() >= maxNodes)
|
|
393
|
+
break;
|
|
394
|
+
const relatedFilePath = neighbor.nodeId;
|
|
395
|
+
if (visitedFiles.has(relatedFilePath))
|
|
396
|
+
continue;
|
|
397
|
+
visitedFiles.add(relatedFilePath);
|
|
398
|
+
// Calculate decayed score for this hop
|
|
399
|
+
const hopScore = node.score * neighbor.weight * decayFactor;
|
|
400
|
+
// Find learnings anchored to this related file
|
|
401
|
+
const anchors = yield* anchorRepo.findByFilePath(relatedFilePath);
|
|
402
|
+
const validAnchors = anchors.filter(a => a.status === "valid");
|
|
403
|
+
for (const anchor of validAnchors) {
|
|
404
|
+
if (totalLearnings() >= maxNodes)
|
|
405
|
+
break;
|
|
406
|
+
if (visitedLearningIds.has(anchor.learningId))
|
|
407
|
+
continue;
|
|
408
|
+
visitedLearningIds.add(anchor.learningId);
|
|
409
|
+
const learning = yield* learningRepo.findById(anchor.learningId);
|
|
410
|
+
if (!learning)
|
|
411
|
+
continue;
|
|
412
|
+
expandedLearnings.push({
|
|
413
|
+
learning,
|
|
414
|
+
sourceFile: relatedFilePath,
|
|
415
|
+
hops: currentHop,
|
|
416
|
+
decayedScore: hopScore,
|
|
417
|
+
sourceEdge: neighbor.edgeType,
|
|
418
|
+
edgeWeight: neighbor.weight,
|
|
419
|
+
});
|
|
420
|
+
maxDepthReached = currentHop;
|
|
421
|
+
}
|
|
422
|
+
// Add to next frontier for further expansion
|
|
423
|
+
nextFrontier.push({
|
|
424
|
+
filePath: relatedFilePath,
|
|
425
|
+
score: hopScore,
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
frontier = nextFrontier;
|
|
430
|
+
}
|
|
431
|
+
// Sort expanded by decayed score (highest first)
|
|
432
|
+
expandedLearnings.sort((a, b) => b.decayedScore - a.decayedScore);
|
|
433
|
+
// Enforce maxNodes limit
|
|
434
|
+
const totalAvailable = anchoredLearnings.length + expandedLearnings.length;
|
|
435
|
+
let limitedAnchored = anchoredLearnings;
|
|
436
|
+
let limitedExpanded = expandedLearnings;
|
|
437
|
+
if (totalAvailable > maxNodes) {
|
|
438
|
+
// Prioritize anchored learnings, then fill with expanded
|
|
439
|
+
if (anchoredLearnings.length >= maxNodes) {
|
|
440
|
+
limitedAnchored = anchoredLearnings.slice(0, maxNodes);
|
|
441
|
+
limitedExpanded = [];
|
|
442
|
+
}
|
|
443
|
+
else {
|
|
444
|
+
const remainingSlots = maxNodes - anchoredLearnings.length;
|
|
445
|
+
limitedExpanded = expandedLearnings.slice(0, remainingSlots);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
// Combine all and sort by decayedScore
|
|
449
|
+
const all = [...limitedAnchored, ...limitedExpanded];
|
|
450
|
+
all.sort((a, b) => b.decayedScore - a.decayedScore);
|
|
451
|
+
return {
|
|
452
|
+
anchored: limitedAnchored,
|
|
453
|
+
expanded: limitedExpanded,
|
|
454
|
+
all,
|
|
455
|
+
stats: {
|
|
456
|
+
inputFileCount: files.length,
|
|
457
|
+
anchoredCount: limitedAnchored.length,
|
|
458
|
+
expandedCount: limitedExpanded.length,
|
|
459
|
+
maxDepthReached,
|
|
460
|
+
filesVisited: visitedFiles.size,
|
|
461
|
+
},
|
|
462
|
+
};
|
|
463
|
+
}),
|
|
464
|
+
};
|
|
465
|
+
}));
|
|
466
|
+
//# sourceMappingURL=graph-expansion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-expansion.js","sourceRoot":"","sources":["../../src/services/graph-expansion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { TaskRepository } from "../repo/task-repo.js";
|
|
3
|
+
import { TaskNotFoundError, DatabaseError } from "../errors.js";
|
|
4
|
+
import type { Task, TaskId, TaskTree } from "@jamesaphoenix/tx-types";
|
|
5
|
+
declare const HierarchyService_base: Context.TagClass<HierarchyService, "HierarchyService", {
|
|
6
|
+
readonly getChildren: (id: TaskId) => Effect.Effect<readonly Task[], TaskNotFoundError | DatabaseError>;
|
|
7
|
+
readonly getAncestors: (id: TaskId) => Effect.Effect<readonly Task[], TaskNotFoundError | DatabaseError>;
|
|
8
|
+
readonly getTree: (id: TaskId) => Effect.Effect<TaskTree, TaskNotFoundError | DatabaseError>;
|
|
9
|
+
readonly getDepth: (id: TaskId) => Effect.Effect<number, TaskNotFoundError | DatabaseError>;
|
|
10
|
+
readonly getRoots: () => Effect.Effect<readonly Task[], DatabaseError>;
|
|
11
|
+
}>;
|
|
12
|
+
export declare class HierarchyService extends HierarchyService_base {
|
|
13
|
+
}
|
|
14
|
+
export declare const HierarchyServiceLive: Layer.Layer<HierarchyService, never, TaskRepository>;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=hierarchy-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hierarchy-service.d.ts","sourceRoot":"","sources":["../../src/services/hierarchy-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;;0BAK3C,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,iBAAiB,GAAG,aAAa,CAAC;2BAChF,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,iBAAiB,GAAG,aAAa,CAAC;sBACtF,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,iBAAiB,GAAG,aAAa,CAAC;uBACzE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,aAAa,CAAC;uBACxE,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,aAAa,CAAC;;AAP1E,qBAAa,gBAAiB,SAAQ,qBASnC;CAAG;AAEN,eAAO,MAAM,oBAAoB,sDAyEhC,CAAA"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { TaskRepository } from "../repo/task-repo.js";
|
|
3
|
+
import { TaskNotFoundError } from "../errors.js";
|
|
4
|
+
export class HierarchyService extends Context.Tag("HierarchyService")() {
|
|
5
|
+
}
|
|
6
|
+
export const HierarchyServiceLive = Layer.effect(HierarchyService, Effect.gen(function* () {
|
|
7
|
+
const taskRepo = yield* TaskRepository;
|
|
8
|
+
const buildTree = (task) => Effect.gen(function* () {
|
|
9
|
+
const childTasks = yield* taskRepo.findByParent(task.id);
|
|
10
|
+
const childTrees = [];
|
|
11
|
+
for (const child of childTasks) {
|
|
12
|
+
childTrees.push(yield* buildTree(child));
|
|
13
|
+
}
|
|
14
|
+
return { task, children: childTrees };
|
|
15
|
+
});
|
|
16
|
+
return {
|
|
17
|
+
getChildren: (id) => Effect.gen(function* () {
|
|
18
|
+
const task = yield* taskRepo.findById(id);
|
|
19
|
+
if (!task) {
|
|
20
|
+
return yield* Effect.fail(new TaskNotFoundError({ id }));
|
|
21
|
+
}
|
|
22
|
+
return yield* taskRepo.findByParent(id);
|
|
23
|
+
}),
|
|
24
|
+
getAncestors: (id) => Effect.gen(function* () {
|
|
25
|
+
const task = yield* taskRepo.findById(id);
|
|
26
|
+
if (!task) {
|
|
27
|
+
return yield* Effect.fail(new TaskNotFoundError({ id }));
|
|
28
|
+
}
|
|
29
|
+
const ancestors = [];
|
|
30
|
+
let currentId = task.parentId;
|
|
31
|
+
while (currentId !== null) {
|
|
32
|
+
const parent = yield* taskRepo.findById(currentId);
|
|
33
|
+
if (!parent)
|
|
34
|
+
break;
|
|
35
|
+
ancestors.push(parent);
|
|
36
|
+
currentId = parent.parentId;
|
|
37
|
+
}
|
|
38
|
+
return ancestors;
|
|
39
|
+
}),
|
|
40
|
+
getTree: (id) => Effect.gen(function* () {
|
|
41
|
+
const task = yield* taskRepo.findById(id);
|
|
42
|
+
if (!task) {
|
|
43
|
+
return yield* Effect.fail(new TaskNotFoundError({ id }));
|
|
44
|
+
}
|
|
45
|
+
return yield* buildTree(task);
|
|
46
|
+
}),
|
|
47
|
+
getDepth: (id) => Effect.gen(function* () {
|
|
48
|
+
const task = yield* taskRepo.findById(id);
|
|
49
|
+
if (!task) {
|
|
50
|
+
return yield* Effect.fail(new TaskNotFoundError({ id }));
|
|
51
|
+
}
|
|
52
|
+
let depth = 0;
|
|
53
|
+
let currentId = task.parentId;
|
|
54
|
+
while (currentId !== null) {
|
|
55
|
+
const parent = yield* taskRepo.findById(currentId);
|
|
56
|
+
if (!parent)
|
|
57
|
+
break;
|
|
58
|
+
depth++;
|
|
59
|
+
currentId = parent.parentId;
|
|
60
|
+
}
|
|
61
|
+
return depth;
|
|
62
|
+
}),
|
|
63
|
+
getRoots: () => taskRepo.findByParent(null)
|
|
64
|
+
};
|
|
65
|
+
}));
|
|
66
|
+
//# sourceMappingURL=hierarchy-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hierarchy-service.js","sourceRoot":"","sources":["../../src/services/hierarchy-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @tx/core/services - Service exports
|
|
3
|
+
*/
|
|
4
|
+
export { TaskService, TaskServiceLive } from "./task-service.js";
|
|
5
|
+
export { DependencyService, DependencyServiceLive } from "./dep-service.js";
|
|
6
|
+
export { ReadyService, ReadyServiceLive } from "./ready-service.js";
|
|
7
|
+
export { HierarchyService, HierarchyServiceLive } from "./hierarchy-service.js";
|
|
8
|
+
export { ScoreService, ScoreServiceLive, type ScoreBreakdown } from "./score-service.js";
|
|
9
|
+
export { LearningService, LearningServiceLive } from "./learning-service.js";
|
|
10
|
+
export { FileLearningService, FileLearningServiceLive } from "./file-learning-service.js";
|
|
11
|
+
export { AttemptService, AttemptServiceLive } from "./attempt-service.js";
|
|
12
|
+
export { EmbeddingService, EmbeddingServiceNoop, EmbeddingServiceLive, EmbeddingServiceOpenAI, EmbeddingServiceAuto, createEmbedderLayer, type EmbedderConfig } from "./embedding-service.js";
|
|
13
|
+
export { QueryExpansionService, QueryExpansionServiceNoop, QueryExpansionServiceLive, QueryExpansionServiceAuto, QueryExpansionUnavailableError, type QueryExpansionResult } from "./query-expansion-service.js";
|
|
14
|
+
export { RerankerService, RerankerServiceNoop, RerankerServiceLive, RerankerServiceAuto, type RerankerResult } from "./reranker-service.js";
|
|
15
|
+
export { SyncService, SyncServiceLive, type ExportResult, type ImportResult, type SyncStatus, type CompactResult, type ExportOptions, type ExportAllResult, type ImportAllResult } from "./sync-service.js";
|
|
16
|
+
export { MigrationService, MigrationServiceLive, MIGRATIONS, getLatestVersion, type Migration, type AppliedMigration, type MigrationStatus } from "./migration-service.js";
|
|
17
|
+
export { AutoSyncService, AutoSyncServiceLive, AutoSyncServiceNoop, type AutoSyncEntity } from "./auto-sync-service.js";
|
|
18
|
+
export { AnchorService, AnchorServiceLive, type AnchorVerificationResult, type BatchVerificationResult, type TypedAnchorInput, type GraphStatusResult, type PruneResult } from "./anchor-service.js";
|
|
19
|
+
export { EdgeService, EdgeServiceLive, type NeighborWithDepth, type NeighborWithPath, type FindNeighborsOptions } from "./edge-service.js";
|
|
20
|
+
export { DeduplicationService, DeduplicationServiceLive } from "./deduplication-service.js";
|
|
21
|
+
export { CandidateExtractorService, CandidateExtractorServiceNoop, CandidateExtractorServiceAnthropic, CandidateExtractorServiceOpenAI, CandidateExtractorServiceAuto } from "./candidate-extractor-service.js";
|
|
22
|
+
export { RetrieverService, RetrieverServiceNoop, RetrieverServiceLive, RetrieverServiceAuto } from "./retriever-service.js";
|
|
23
|
+
export { GraphExpansionService, GraphExpansionServiceNoop, GraphExpansionServiceLive, type SeedLearning, type ExpandedLearning, type EdgeTypeFilter, type GraphExpansionOptions, type GraphExpansionResult } from "./graph-expansion.js";
|
|
24
|
+
export { AnchorVerificationService, AnchorVerificationServiceLive, getAnchorTTL, isStale, DEFAULT_ANCHOR_CACHE_TTL, type VerificationResult, type VerificationSummary, type VerifyOptions } from "./anchor-verification.js";
|
|
25
|
+
export { SwarmVerificationService, SwarmVerificationServiceLive, calculateMajorityVote, type VerificationBatch, type BatchResult, type SwarmMetrics, type SwarmVerificationResult, type SwarmVerifyOptions, type VoteResult } from "./swarm-verification.js";
|
|
26
|
+
export { AstGrepService, AstGrepServiceLive, AstGrepServiceNoop, AstGrepServiceAuto, EXT_TO_LANGUAGE, DEFAULT_SYMBOL_PATTERNS } from "./ast-grep-service.js";
|
|
27
|
+
export { DaemonService, DaemonServiceLive, DaemonServiceNoop, PID_FILE_PATH, LAUNCHD_PLIST_PATH, writePid, readPid, removePid, isProcessRunning, defaultDaemonConfig, generateLaunchdPlist, generateSystemdService, SYSTEMD_SERVICE_PATH, type DaemonStatus, type DaemonConfig, type LaunchdPlistOptions, type SystemdServiceOptions } from "./daemon-service.js";
|
|
28
|
+
export { FileWatcherService, FileWatcherServiceLive, FileWatcherServiceNoop, type FileEvent, type FileEventType, type FileWatcherConfig, type FileWatcherStatus } from "./file-watcher-service.js";
|
|
29
|
+
export { PromotionService, PromotionServiceLive, type PromotionResult, type AutoPromoteResult } from "./promotion-service.js";
|
|
30
|
+
export { DiversifierService, DiversifierServiceNoop, DiversifierServiceLive, DiversifierServiceAuto } from "./diversifier-service.js";
|
|
31
|
+
export { FeedbackTrackerService, FeedbackTrackerServiceNoop, FeedbackTrackerServiceLive, type LearningUsageFeedback } from "./feedback-tracker.js";
|
|
32
|
+
export { WorkerService, WorkerServiceLive, type WorkerRegistration, type WorkerFilter, type FindDeadConfig } from "./worker-service.js";
|
|
33
|
+
export { ClaimService, ClaimServiceLive } from "./claim-service.js";
|
|
34
|
+
export { OrchestratorService, OrchestratorServiceLive, type OrchestratorConfig } from "./orchestrator-service.js";
|
|
35
|
+
export { runWorkerProcess, type WorkerProcessConfig } from "./worker-process.js";
|
|
36
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"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"}
|