@jamesaphoenix/tx-core 0.5.10 → 0.6.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.
Files changed (103) hide show
  1. package/README.md +47 -4
  2. package/dist/errors.d.ts +25 -1
  3. package/dist/errors.d.ts.map +1 -1
  4. package/dist/errors.js +16 -0
  5. package/dist/errors.js.map +1 -1
  6. package/dist/index.d.ts +6 -5
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +7 -4
  9. package/dist/index.js.map +1 -1
  10. package/dist/layer.d.ts +8 -4
  11. package/dist/layer.d.ts.map +1 -1
  12. package/dist/layer.js +25 -4
  13. package/dist/layer.js.map +1 -1
  14. package/dist/mappers/index.d.ts +1 -0
  15. package/dist/mappers/index.d.ts.map +1 -1
  16. package/dist/mappers/index.js +2 -0
  17. package/dist/mappers/index.js.map +1 -1
  18. package/dist/mappers/memory.d.ts +34 -0
  19. package/dist/mappers/memory.d.ts.map +1 -0
  20. package/dist/mappers/memory.js +135 -0
  21. package/dist/mappers/memory.js.map +1 -0
  22. package/dist/mappers/pin.d.ts +6 -0
  23. package/dist/mappers/pin.d.ts.map +1 -0
  24. package/dist/mappers/pin.js +10 -0
  25. package/dist/mappers/pin.js.map +1 -0
  26. package/dist/migrations-embedded.d.ts.map +1 -1
  27. package/dist/migrations-embedded.js +10 -0
  28. package/dist/migrations-embedded.js.map +1 -1
  29. package/dist/repo/index.d.ts +2 -0
  30. package/dist/repo/index.d.ts.map +1 -1
  31. package/dist/repo/index.js +2 -0
  32. package/dist/repo/index.js.map +1 -1
  33. package/dist/repo/memory-repo.d.ts +88 -0
  34. package/dist/repo/memory-repo.d.ts.map +1 -0
  35. package/dist/repo/memory-repo.js +556 -0
  36. package/dist/repo/memory-repo.js.map +1 -0
  37. package/dist/repo/pin-repo.d.ts +29 -0
  38. package/dist/repo/pin-repo.d.ts.map +1 -0
  39. package/dist/repo/pin-repo.js +79 -0
  40. package/dist/repo/pin-repo.js.map +1 -0
  41. package/dist/schemas/index.d.ts +2 -2
  42. package/dist/schemas/index.d.ts.map +1 -1
  43. package/dist/schemas/index.js +1 -1
  44. package/dist/schemas/index.js.map +1 -1
  45. package/dist/schemas/sync.d.ts +598 -3
  46. package/dist/schemas/sync.d.ts.map +1 -1
  47. package/dist/schemas/sync.js +280 -6
  48. package/dist/schemas/sync.js.map +1 -1
  49. package/dist/services/agent-service.d.ts +2 -0
  50. package/dist/services/agent-service.d.ts.map +1 -1
  51. package/dist/services/agent-service.js +15 -1
  52. package/dist/services/agent-service.js.map +1 -1
  53. package/dist/services/cycle-scan-service.d.ts.map +1 -1
  54. package/dist/services/cycle-scan-service.js +11 -7
  55. package/dist/services/cycle-scan-service.js.map +1 -1
  56. package/dist/services/diversifier-service.d.ts +2 -2
  57. package/dist/services/diversifier-service.d.ts.map +1 -1
  58. package/dist/services/diversifier-service.js.map +1 -1
  59. package/dist/services/index.d.ts +3 -1
  60. package/dist/services/index.d.ts.map +1 -1
  61. package/dist/services/index.js +2 -0
  62. package/dist/services/index.js.map +1 -1
  63. package/dist/services/learning-service.d.ts +3 -2
  64. package/dist/services/learning-service.d.ts.map +1 -1
  65. package/dist/services/learning-service.js.map +1 -1
  66. package/dist/services/memory-retriever-service.d.ts +48 -0
  67. package/dist/services/memory-retriever-service.d.ts.map +1 -0
  68. package/dist/services/memory-retriever-service.js +332 -0
  69. package/dist/services/memory-retriever-service.js.map +1 -0
  70. package/dist/services/memory-service.d.ts +49 -0
  71. package/dist/services/memory-service.d.ts.map +1 -0
  72. package/dist/services/memory-service.js +1061 -0
  73. package/dist/services/memory-service.js.map +1 -0
  74. package/dist/services/pin-service.d.ts +33 -0
  75. package/dist/services/pin-service.d.ts.map +1 -0
  76. package/dist/services/pin-service.js +140 -0
  77. package/dist/services/pin-service.js.map +1 -0
  78. package/dist/services/ready-service.js +1 -1
  79. package/dist/services/ready-service.js.map +1 -1
  80. package/dist/services/retriever-service.d.ts +2 -2
  81. package/dist/services/retriever-service.d.ts.map +1 -1
  82. package/dist/services/retriever-service.js.map +1 -1
  83. package/dist/services/sync-service.d.ts +123 -4
  84. package/dist/services/sync-service.d.ts.map +1 -1
  85. package/dist/services/sync-service.js +1099 -11
  86. package/dist/services/sync-service.js.map +1 -1
  87. package/dist/services/task-service.js +2 -2
  88. package/dist/services/task-service.js.map +1 -1
  89. package/dist/utils/math.d.ts +4 -3
  90. package/dist/utils/math.d.ts.map +1 -1
  91. package/dist/utils/math.js +9 -4
  92. package/dist/utils/math.js.map +1 -1
  93. package/dist/utils/pin-file.d.ts +33 -0
  94. package/dist/utils/pin-file.d.ts.map +1 -0
  95. package/dist/utils/pin-file.js +87 -0
  96. package/dist/utils/pin-file.js.map +1 -0
  97. package/dist/utils/toml-config.d.ts +12 -0
  98. package/dist/utils/toml-config.d.ts.map +1 -1
  99. package/dist/utils/toml-config.js +111 -1
  100. package/dist/utils/toml-config.js.map +1 -1
  101. package/migrations/029_memory.sql +83 -0
  102. package/migrations/030_context_pins.sql +24 -0
  103. package/package.json +1 -1
@@ -0,0 +1,332 @@
1
+ /**
2
+ * MemoryRetrieverService — Retrieval pipeline for memory documents
3
+ *
4
+ * Provides BM25 + vector + graph (via memory_links) search with RRF fusion.
5
+ * Follows the same architecture as RetrieverService for learnings.
6
+ *
7
+ * Pipeline:
8
+ * 1. BM25 via memory_fts (three-tier FTS5 query)
9
+ * 2. Vector similarity (when embeddings available)
10
+ * 3. RRF fusion (k=60)
11
+ * 4. Recency boost (30-day decay on file mtime)
12
+ * 5. Tag filter (case-insensitive, when specified)
13
+ * 6. Property filter (key=value or key-exists, when specified)
14
+ * 7. Graph expansion via memory_links (BFS with decay, when --expand)
15
+ * 8. Re-filter expanded docs against tag/prop filters
16
+ * 9. Sort + filter by minScore + limit
17
+ */
18
+ import { Context, Effect, Layer, Option } from "effect";
19
+ import { MemoryDocumentRepository, MemoryLinkRepository, MemoryPropertyRepository } from "../repo/memory-repo.js";
20
+ import { EmbeddingService } from "./embedding-service.js";
21
+ import { cosineSimilarity } from "../utils/math.js";
22
+ /** RRF constant — standard value from the original paper */
23
+ const RRF_K = 60;
24
+ /** Default weight for recency boost */
25
+ const DEFAULT_RECENCY_WEIGHT = 0.1;
26
+ const MAX_AGE_DAYS = 30;
27
+ /** Cap on embeddings fetched for vector similarity scan */
28
+ const MAX_VECTOR_CANDIDATES = 500;
29
+ /** Floor on vector candidates to prevent tiny pools when limit is small */
30
+ const MIN_VECTOR_CANDIDATES = 50;
31
+ /** Graph expansion defaults */
32
+ const DEFAULT_EXPANSION_DEPTH = 2;
33
+ const DEFAULT_DECAY_FACTOR = 0.5;
34
+ const MAX_EXPANSION_NODES = 50;
35
+ /**
36
+ * MemoryRetrieverService provides pluggable retrieval for memory documents.
37
+ */
38
+ export class MemoryRetrieverService extends Context.Tag("MemoryRetrieverService")() {
39
+ }
40
+ /**
41
+ * Calculate recency score (0-1) based on file modification time.
42
+ * More recently modified files get higher scores.
43
+ */
44
+ const calculateRecencyScore = (fileMtime) => {
45
+ const mtimeMs = new Date(fileMtime).getTime();
46
+ // Guard against invalid/empty fileMtime producing NaN (propagates through all arithmetic)
47
+ if (isNaN(mtimeMs))
48
+ return 0;
49
+ const nowMs = Date.now();
50
+ // Clamp future-dated files to now (prevents score > 1)
51
+ const ageMs = Math.max(0, nowMs - Math.min(mtimeMs, nowMs));
52
+ const ageDays = ageMs / (1000 * 60 * 60 * 24);
53
+ return Math.max(0, 1 - ageDays / MAX_AGE_DAYS);
54
+ };
55
+ /**
56
+ * Compute vector similarity scores and return ranked results.
57
+ * Dimension mismatches are skipped gracefully.
58
+ */
59
+ const computeVectorRanking = (documents, queryEmbedding) => {
60
+ if (!queryEmbedding) {
61
+ return Effect.succeed([]);
62
+ }
63
+ const docsWithEmbeddings = documents.filter((d) => d.embedding !== null);
64
+ // Skip per-document dimension mismatches gracefully (e.g., stale embeddings from a different model)
65
+ return Effect.forEach(docsWithEmbeddings, document => cosineSimilarity(queryEmbedding, document.embedding).pipe(Effect.map(similarity => {
66
+ // Normalize cosine similarity from [-1, 1] to [0, 1]
67
+ const score = (similarity + 1) / 2;
68
+ return Option.some({ document, score });
69
+ }), Effect.catchTag("EmbeddingDimensionMismatchError", () => Effect.succeed(Option.none())), Effect.catchTag("ZeroMagnitudeVectorError", () => Effect.succeed(Option.none())))).pipe(Effect.map(results => {
70
+ const withScores = results.filter(Option.isSome).map(o => o.value);
71
+ const sorted = [...withScores].sort((a, b) => b.score - a.score);
72
+ return sorted.map((item, idx) => ({
73
+ ...item,
74
+ rank: idx + 1
75
+ }));
76
+ }));
77
+ };
78
+ /**
79
+ * RRF score calculation.
80
+ * Formula: RRF(d) = Σ 1/(k + rank_i(d))
81
+ */
82
+ const rrfScore = (k, ...ranks) => {
83
+ return ranks.reduce((sum, rank) => {
84
+ if (rank === 0)
85
+ return sum; // Not present in this list
86
+ return sum + 1 / (k + rank);
87
+ }, 0);
88
+ };
89
+ /**
90
+ * Combine BM25 and vector results using RRF.
91
+ */
92
+ const computeRRFScoring = (bm25Results, vectorRanking) => {
93
+ const bm25Map = new Map();
94
+ bm25Results.forEach((result, idx) => {
95
+ bm25Map.set(result.document.id, { score: result.score, rank: idx + 1 });
96
+ });
97
+ const vectorMap = new Map();
98
+ vectorRanking.forEach(item => {
99
+ vectorMap.set(item.document.id, { score: item.score, rank: item.rank });
100
+ });
101
+ // Collect all unique documents
102
+ const allDocuments = new Map();
103
+ for (const result of bm25Results) {
104
+ allDocuments.set(result.document.id, result.document);
105
+ }
106
+ for (const item of vectorRanking) {
107
+ allDocuments.set(item.document.id, item.document);
108
+ }
109
+ const candidates = [];
110
+ for (const [id, document] of allDocuments) {
111
+ const bm25Info = bm25Map.get(id);
112
+ const vectorInfo = vectorMap.get(id);
113
+ const bm25Rank = bm25Info?.rank ?? 0;
114
+ const vectorRank = vectorInfo?.rank ?? 0;
115
+ const bm25Score = bm25Info?.score ?? 0;
116
+ const vectorScore = vectorInfo?.score ?? 0;
117
+ const recencyScore = calculateRecencyScore(document.fileMtime);
118
+ const rrf = rrfScore(RRF_K, bm25Rank, vectorRank);
119
+ candidates.push({
120
+ document,
121
+ bm25Score,
122
+ bm25Rank,
123
+ vectorScore,
124
+ vectorRank,
125
+ rrfScore: rrf,
126
+ recencyScore
127
+ });
128
+ }
129
+ return candidates.sort((a, b) => b.rrfScore - a.rrfScore);
130
+ };
131
+ /**
132
+ * Apply final scoring: RRF + recency boost.
133
+ */
134
+ const applyFinalScoring = (candidates, recencyWeight, activeLists) => {
135
+ // Dynamically normalize based on how many ranking lists contributed (1 or 2).
136
+ // Max RRF = activeLists * 1/(k+1). Without this, BM25-only mode caps at ~0.5.
137
+ const rrfMax = activeLists > 0 ? activeLists / (RRF_K + 1) : 1;
138
+ return candidates.map(candidate => {
139
+ const { document, bm25Score, bm25Rank, vectorScore, vectorRank, rrfScore: rrf, recencyScore } = candidate;
140
+ const normalizedRRF = Math.min(1.0, rrf / rrfMax);
141
+ // Weighted blend (not additive) to preserve rank differentiation.
142
+ // Additive formula would clamp top-ranked recent docs to 1.0, destroying ordering.
143
+ const relevanceScore = (1 - recencyWeight) * normalizedRRF + recencyWeight * recencyScore;
144
+ return {
145
+ ...document,
146
+ relevanceScore,
147
+ bm25Score,
148
+ vectorScore,
149
+ recencyScore,
150
+ rrfScore: rrf,
151
+ bm25Rank,
152
+ vectorRank,
153
+ };
154
+ }).sort((a, b) => b.relevanceScore - a.relevanceScore);
155
+ };
156
+ /**
157
+ * Noop fallback — returns empty results.
158
+ */
159
+ export const MemoryRetrieverServiceNoop = Layer.succeed(MemoryRetrieverService, {
160
+ search: (_query, _options) => Effect.succeed([]),
161
+ isAvailable: () => Effect.succeed(false)
162
+ });
163
+ /**
164
+ * Live implementation with BM25 + vector + RRF + graph expansion pipeline.
165
+ *
166
+ * Graph expansion uses memory_links (wikilinks, frontmatter.related, explicit)
167
+ * to find related documents via BFS traversal with score decay.
168
+ */
169
+ export const MemoryRetrieverServiceLive = Layer.effect(MemoryRetrieverService, Effect.gen(function* () {
170
+ const docRepo = yield* MemoryDocumentRepository;
171
+ const linkRepo = yield* MemoryLinkRepository;
172
+ const propRepo = yield* MemoryPropertyRepository;
173
+ // EmbeddingService is optional — graceful degradation when unavailable
174
+ const embeddingServiceOption = yield* Effect.serviceOption(EmbeddingService);
175
+ const embeddingService = Option.getOrNull(embeddingServiceOption);
176
+ /**
177
+ * Expand search results through memory_links graph.
178
+ * BFS traversal: follow outgoing links from seed documents.
179
+ */
180
+ const expandViaGraph = (seeds, depth, decayFactor, maxNodes) => Effect.gen(function* () {
181
+ if (seeds.length === 0 || depth === 0)
182
+ return seeds.map(s => ({ ...s, expansionHops: 0 }));
183
+ const visited = new Set(seeds.map(s => s.id));
184
+ const expanded = [];
185
+ // BFS frontier: documents to expand from
186
+ let frontier = seeds.map(s => ({ docId: s.id, score: s.relevanceScore, hops: 0 }));
187
+ for (let hop = 1; hop <= depth; hop++) {
188
+ if (frontier.length === 0)
189
+ break;
190
+ if (seeds.length + expanded.length >= maxNodes)
191
+ break;
192
+ const nextFrontier = [];
193
+ for (const node of frontier) {
194
+ if (seeds.length + expanded.length >= maxNodes)
195
+ break;
196
+ // Get outgoing links from this document
197
+ const links = yield* linkRepo.findOutgoing(node.docId);
198
+ for (const link of links) {
199
+ if (seeds.length + expanded.length >= maxNodes)
200
+ break;
201
+ if (!link.targetDocId)
202
+ continue; // Unresolved link
203
+ if (visited.has(link.targetDocId))
204
+ continue;
205
+ visited.add(link.targetDocId);
206
+ // Fetch the document
207
+ const doc = yield* docRepo.findById(link.targetDocId);
208
+ if (!doc)
209
+ continue;
210
+ const decayedScore = node.score * decayFactor;
211
+ const recencyScore = calculateRecencyScore(doc.fileMtime);
212
+ expanded.push({
213
+ ...doc,
214
+ relevanceScore: decayedScore,
215
+ bm25Score: 0,
216
+ vectorScore: 0,
217
+ rrfScore: 0,
218
+ recencyScore,
219
+ bm25Rank: 0,
220
+ vectorRank: 0,
221
+ expansionHops: hop,
222
+ });
223
+ nextFrontier.push({
224
+ docId: link.targetDocId,
225
+ score: decayedScore,
226
+ hops: hop,
227
+ });
228
+ }
229
+ }
230
+ frontier = nextFrontier;
231
+ }
232
+ // Merge seeds and expanded, sort by relevance
233
+ const merged = [
234
+ ...seeds.map(s => ({ ...s, expansionHops: 0 })),
235
+ ...expanded,
236
+ ];
237
+ return merged.sort((a, b) => b.relevanceScore - a.relevanceScore);
238
+ });
239
+ return {
240
+ search: (query, options) => Effect.gen(function* () {
241
+ const limit = Math.max(1, options?.limit ?? 10);
242
+ const minScore = options?.minScore ?? 0;
243
+ const useSemantic = options?.semantic ?? false;
244
+ const useExpand = options?.expand ?? false;
245
+ // Over-fetch when filters are present: tag/prop filters reduce the
246
+ // scored pool before graph expansion. A larger BM25/vector candidate pool
247
+ // ensures enough documents survive filtering to produce quality expansion
248
+ // seeds and to deliver the requested limit.
249
+ const hasFilters = (options?.tags && options.tags.length > 0) ||
250
+ (options?.props && options.props.length > 0);
251
+ const fetchMultiplier = hasFilters ? 10 : 3;
252
+ // 1. BM25 search (always available)
253
+ const bm25Results = yield* docRepo.searchBM25(query, limit * fetchMultiplier);
254
+ // 2. Vector search (when --semantic and embeddings available)
255
+ let vectorRanking = [];
256
+ if (useSemantic && embeddingService) {
257
+ const queryEmbedding = yield* Effect.option(embeddingService.embed(query));
258
+ const queryEmbeddingValue = Option.getOrNull(queryEmbedding);
259
+ if (queryEmbeddingValue) {
260
+ const vectorCandidateLimit = Math.min(Math.max(MIN_VECTOR_CANDIDATES, limit * fetchMultiplier), MAX_VECTOR_CANDIDATES);
261
+ const docsWithEmbeddings = yield* docRepo.findWithEmbeddings(vectorCandidateLimit);
262
+ vectorRanking = yield* computeVectorRanking(docsWithEmbeddings, queryEmbeddingValue);
263
+ }
264
+ }
265
+ // 3. RRF fusion
266
+ const candidates = computeRRFScoring(bm25Results, vectorRanking);
267
+ // 4. Final scoring with recency boost
268
+ // Count active ranking lists for correct RRF normalization
269
+ const activeLists = (bm25Results.length > 0 ? 1 : 0) + (vectorRanking.length > 0 ? 1 : 0);
270
+ let scored = applyFinalScoring(candidates, DEFAULT_RECENCY_WEIGHT, activeLists);
271
+ // 5. Filter by tags if specified (case-insensitive)
272
+ // Applied BEFORE graph expansion so seeds are relevant to the filter,
273
+ // preventing expansion from irrelevant pre-filter documents.
274
+ if (options?.tags && options.tags.length > 0) {
275
+ const tagFilterLower = options.tags.map((t) => t.toLowerCase());
276
+ scored = scored.filter(r => tagFilterLower.every((t) => r.tags.some((rt) => String(rt).toLowerCase() === t)));
277
+ }
278
+ // 6. Filter by properties if specified
279
+ // Prop filter sets are computed once and cached for reuse in step 8 (post-expansion re-filter)
280
+ // to avoid duplicate DB queries when both --expand and --prop are active.
281
+ const propFilterSets = [];
282
+ if (options?.props && options.props.length > 0) {
283
+ for (const propFilter of options.props) {
284
+ const eqIdx = propFilter.indexOf("=");
285
+ const key = eqIdx >= 0 ? propFilter.slice(0, eqIdx) : propFilter;
286
+ const value = eqIdx >= 0 ? propFilter.slice(eqIdx + 1) : undefined;
287
+ if (!key || key.trim().length === 0)
288
+ continue;
289
+ const matchingDocIds = new Set(yield* propRepo.findByProperty(key.trim(), value));
290
+ propFilterSets.push(matchingDocIds);
291
+ scored = scored.filter(r => matchingDocIds.has(r.id));
292
+ }
293
+ }
294
+ // 7. Graph expansion (when --expand)
295
+ // Runs AFTER tag/prop filtering so seeds are already relevant.
296
+ // Uses a fixed seed count independent of limit so expansion can contribute
297
+ // new documents even when limit is small (e.g. default 10).
298
+ // After expansion, re-merge with non-seed results to avoid silently
299
+ // dropping documents ranked 11+ from the original scored list.
300
+ if (useExpand) {
301
+ const EXPANSION_SEED_COUNT = 10;
302
+ const seedIds = new Set(scored.slice(0, Math.min(EXPANSION_SEED_COUNT, scored.length)).map(s => s.id));
303
+ const topSeeds = scored.slice(0, Math.min(EXPANSION_SEED_COUNT, scored.length));
304
+ const expandedResults = yield* expandViaGraph(topSeeds, DEFAULT_EXPANSION_DEPTH, DEFAULT_DECAY_FACTOR, MAX_EXPANSION_NODES);
305
+ // 8. Re-filter expanded documents against tag/prop filters.
306
+ // Seeds already passed filters; only newly discovered docs need checking.
307
+ // Reuses cached propFilterSets from step 6 to avoid duplicate DB queries.
308
+ let filtered = expandedResults;
309
+ if (options?.tags && options.tags.length > 0) {
310
+ const tagFilterLower = options.tags.map((t) => t.toLowerCase());
311
+ filtered = filtered.filter(r => seedIds.has(r.id) ||
312
+ tagFilterLower.every((t) => r.tags.some((rt) => String(rt).toLowerCase() === t)));
313
+ }
314
+ for (const matchingDocIds of propFilterSets) {
315
+ filtered = filtered.filter(r => seedIds.has(r.id) || matchingDocIds.has(r.id));
316
+ }
317
+ // Re-merge: add back non-seed original results that weren't already included via expansion
318
+ const expandedIds = new Set(filtered.map(r => r.id));
319
+ const nonSeedRemainder = scored.slice(EXPANSION_SEED_COUNT)
320
+ .filter(r => !expandedIds.has(r.id));
321
+ scored = [...filtered, ...nonSeedRemainder]
322
+ .sort((a, b) => b.relevanceScore - a.relevanceScore);
323
+ }
324
+ // 9. Filter by minScore and limit
325
+ return scored
326
+ .filter(r => r.relevanceScore >= minScore)
327
+ .slice(0, limit);
328
+ }),
329
+ isAvailable: () => Effect.succeed(true)
330
+ };
331
+ }));
332
+ //# sourceMappingURL=memory-retriever-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-retriever-service.js","sourceRoot":"","sources":["../../src/services/memory-retriever-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * MemoryService - Core service for filesystem-backed memory
3
+ *
4
+ * Manages indexing, searching, and CRUD operations on markdown files.
5
+ * Filesystem is the source of truth; SQLite is a derived index.
6
+ */
7
+ import { Context, Effect, Layer } from "effect";
8
+ import { MemoryDocumentRepository } from "../repo/memory-repo.js";
9
+ import { MemoryLinkRepository } from "../repo/memory-repo.js";
10
+ import { MemoryPropertyRepository } from "../repo/memory-repo.js";
11
+ import { MemorySourceRepository } from "../repo/memory-repo.js";
12
+ import { DatabaseError, MemoryDocumentNotFoundError, MemorySourceNotFoundError, ValidationError } from "../errors.js";
13
+ import type { MemoryDocument, MemoryDocumentWithScore, MemoryLink, MemorySource, MemoryProperty, MemoryIndexStatus, MemorySearchOptions, CreateMemoryDocumentInput } from "@jamesaphoenix/tx-types";
14
+ declare const MemoryService_base: Context.TagClass<MemoryService, "MemoryService", {
15
+ readonly addSource: (dir: string, label?: string) => Effect.Effect<MemorySource, DatabaseError | ValidationError>;
16
+ readonly removeSource: (dir: string) => Effect.Effect<void, DatabaseError | MemorySourceNotFoundError>;
17
+ readonly listSources: () => Effect.Effect<readonly MemorySource[], DatabaseError>;
18
+ readonly createDocument: (input: CreateMemoryDocumentInput) => Effect.Effect<MemoryDocument, DatabaseError | ValidationError>;
19
+ readonly updateFrontmatter: (id: string, updates: {
20
+ addTags?: readonly string[];
21
+ removeTags?: readonly string[];
22
+ addRelated?: readonly string[];
23
+ }) => Effect.Effect<MemoryDocument, DatabaseError | MemoryDocumentNotFoundError | ValidationError>;
24
+ readonly setProperty: (id: string, key: string, value: string) => Effect.Effect<void, DatabaseError | MemoryDocumentNotFoundError | ValidationError>;
25
+ readonly getProperties: (id: string) => Effect.Effect<readonly MemoryProperty[], DatabaseError>;
26
+ readonly removeProperty: (id: string, key: string) => Effect.Effect<void, DatabaseError | MemoryDocumentNotFoundError | ValidationError>;
27
+ readonly index: (options?: {
28
+ incremental?: boolean;
29
+ }) => Effect.Effect<{
30
+ indexed: number;
31
+ skipped: number;
32
+ removed: number;
33
+ }, DatabaseError>;
34
+ readonly indexStatus: () => Effect.Effect<MemoryIndexStatus, DatabaseError>;
35
+ readonly search: (query: string, options?: MemorySearchOptions) => Effect.Effect<readonly MemoryDocumentWithScore[], DatabaseError>;
36
+ readonly getDocument: (id: string) => Effect.Effect<MemoryDocument, DatabaseError | MemoryDocumentNotFoundError>;
37
+ readonly getLinks: (id: string) => Effect.Effect<readonly MemoryLink[], DatabaseError>;
38
+ readonly getBacklinks: (id: string) => Effect.Effect<readonly MemoryLink[], DatabaseError>;
39
+ readonly addLink: (sourceId: string, targetRef: string) => Effect.Effect<void, DatabaseError | MemoryDocumentNotFoundError>;
40
+ readonly listDocuments: (filter?: {
41
+ source?: string;
42
+ tags?: readonly string[];
43
+ }) => Effect.Effect<readonly MemoryDocument[], DatabaseError>;
44
+ }>;
45
+ export declare class MemoryService extends MemoryService_base {
46
+ }
47
+ export declare const MemoryServiceLive: Layer.Layer<MemoryService, never, MemoryDocumentRepository | MemoryLinkRepository | MemoryPropertyRepository | MemorySourceRepository>;
48
+ export {};
49
+ //# sourceMappingURL=memory-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-service.d.ts","sourceRoot":"","sources":["../../src/services/memory-service.ts"],"names":[],"mappings":"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"}