@engram-mem/supabase 0.3.7 → 0.4.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.
@@ -1,197 +0,0 @@
1
- import { generateId } from '@engram-mem/core';
2
- import { sanitizeIlike } from './search.js';
3
- export class SupabaseProceduralStorage {
4
- client;
5
- constructor(client) {
6
- this.client = client;
7
- }
8
- async insert(memory) {
9
- const id = generateId();
10
- // Insert into memories table first (FK requirement)
11
- const { error: memErr } = await this.client
12
- .from('memories')
13
- .insert({ id, type: 'procedural' });
14
- if (memErr)
15
- throw new Error(`Procedural memory insert failed: ${memErr.message}`);
16
- const { data, error } = await this.client
17
- .from('memory_procedural')
18
- .insert({
19
- id,
20
- category: memory.category,
21
- trigger_text: memory.trigger,
22
- procedure: memory.procedure,
23
- confidence: memory.confidence,
24
- observation_count: memory.observationCount,
25
- last_observed: memory.lastObserved.toISOString(),
26
- first_observed: memory.firstObserved.toISOString(),
27
- decay_rate: memory.decayRate,
28
- source_episode_ids: memory.sourceEpisodeIds,
29
- embedding: memory.embedding ?? null,
30
- metadata: memory.metadata,
31
- })
32
- .select()
33
- .single();
34
- if (error)
35
- throw new Error(`Procedural insert failed: ${error.message}`);
36
- return rowToProcedural(data);
37
- }
38
- async search(query, opts) {
39
- const limit = opts?.limit ?? 10;
40
- const embedding = opts?.embedding;
41
- if (embedding) {
42
- // Prefer hybrid RRF search when query text is also available
43
- if (query) {
44
- const { data, error } = await this.client.rpc('engram_hybrid_recall', {
45
- p_query_text: query,
46
- p_query_embedding: JSON.stringify(embedding),
47
- p_match_count: limit,
48
- p_include_episodes: false,
49
- p_include_digests: false,
50
- p_include_semantic: false,
51
- p_include_procedural: true,
52
- });
53
- if (error)
54
- throw new Error(`Procedural search (hybrid) failed: ${error.message}`);
55
- const rows = (data ?? []);
56
- const RRF_MAX = 2.0 / 61.0;
57
- return rows.map((r) => ({
58
- item: recallRowToProcedural(r),
59
- similarity: Math.min(1.0, (r.similarity || 0) / RRF_MAX),
60
- }));
61
- }
62
- // Embedding only — fall back to pure vector search
63
- const { data, error } = await this.client.rpc('engram_recall', {
64
- p_query_embedding: embedding,
65
- p_session_id: null,
66
- p_match_count: limit,
67
- p_min_similarity: opts?.minScore ?? 0.15,
68
- p_include_episodes: false,
69
- p_include_digests: false,
70
- p_include_semantic: false,
71
- p_include_procedural: true,
72
- });
73
- if (error)
74
- throw new Error(`Procedural search (vector) failed: ${error.message}`);
75
- const rows = (data ?? []);
76
- return rows.map((r) => ({
77
- item: recallRowToProcedural(r),
78
- similarity: r.similarity,
79
- }));
80
- }
81
- // Text fallback
82
- const { data, error } = await this.client
83
- .from('memory_procedural')
84
- .select('*')
85
- .or(`trigger_text.ilike.%${sanitizeIlike(query)}%,procedure.ilike.%${sanitizeIlike(query)}%`)
86
- .limit(limit);
87
- if (error)
88
- throw new Error(`Procedural search (text) failed: ${error.message}`);
89
- return (data ?? []).map((r) => ({
90
- item: rowToProcedural(r),
91
- similarity: 0.5,
92
- }));
93
- }
94
- async searchByTrigger(activity, opts) {
95
- const limit = opts?.limit ?? 10;
96
- const embedding = opts?.embedding;
97
- if (embedding) {
98
- // Reuse vector search — procedural table indexed on trigger+procedure combined
99
- return this.search(activity, opts);
100
- }
101
- const { data, error } = await this.client
102
- .from('memory_procedural')
103
- .select('*')
104
- .ilike('trigger_text', `%${sanitizeIlike(activity)}%`)
105
- .limit(limit);
106
- if (error)
107
- throw new Error(`Procedural searchByTrigger failed: ${error.message}`);
108
- return (data ?? []).map((r) => ({
109
- item: rowToProcedural(r),
110
- similarity: 0.5,
111
- }));
112
- }
113
- async recordAccess(id) {
114
- const { error } = await this.client.rpc('engram_record_access', {
115
- p_id: id,
116
- p_memory_type: 'procedural',
117
- });
118
- if (error)
119
- throw new Error(`Procedural recordAccess failed: ${error.message}`);
120
- }
121
- async incrementObservation(id) {
122
- const { data: current, error: fetchErr } = await this.client
123
- .from('memory_procedural')
124
- .select('observation_count')
125
- .eq('id', id)
126
- .single();
127
- if (fetchErr)
128
- throw new Error(`Procedural incrementObservation fetch failed: ${fetchErr.message}`);
129
- const row = current;
130
- const { error } = await this.client
131
- .from('memory_procedural')
132
- .update({
133
- observation_count: row.observation_count + 1,
134
- last_observed: new Date().toISOString(),
135
- })
136
- .eq('id', id);
137
- if (error)
138
- throw new Error(`Procedural incrementObservation update failed: ${error.message}`);
139
- }
140
- async batchDecay(opts) {
141
- const { data, error } = await this.client.rpc('engram_decay_pass', {
142
- p_semantic_decay_rate: 0,
143
- p_procedural_decay_rate: opts.decayRate,
144
- p_semantic_days: 999999,
145
- p_procedural_days: opts.daysThreshold,
146
- p_edge_prune_strength: 0,
147
- p_edge_prune_days: 999999,
148
- });
149
- if (error)
150
- throw new Error(`Procedural batchDecay failed: ${error.message}`);
151
- const rows = data;
152
- return rows?.[0]?.procedural_decayed ?? 0;
153
- }
154
- }
155
- function rowToProcedural(row) {
156
- return {
157
- id: row.id,
158
- category: row.category,
159
- trigger: row.trigger_text,
160
- procedure: row.procedure,
161
- confidence: row.confidence,
162
- observationCount: row.observation_count,
163
- lastObserved: new Date(row.last_observed),
164
- firstObserved: new Date(row.first_observed),
165
- accessCount: row.access_count,
166
- lastAccessed: row.last_accessed ? new Date(row.last_accessed) : null,
167
- decayRate: row.decay_rate,
168
- sourceEpisodeIds: row.source_episode_ids ?? [],
169
- embedding: row.embedding ?? null,
170
- metadata: row.metadata ?? {},
171
- createdAt: new Date(row.created_at),
172
- updatedAt: new Date(row.updated_at),
173
- projectId: null,
174
- };
175
- }
176
- function recallRowToProcedural(row) {
177
- return {
178
- id: row.id,
179
- category: 'workflow',
180
- trigger: '',
181
- procedure: row.content,
182
- confidence: row.salience,
183
- observationCount: 1,
184
- lastObserved: new Date(row.created_at),
185
- firstObserved: new Date(row.created_at),
186
- accessCount: row.access_count,
187
- lastAccessed: null,
188
- decayRate: 0.01,
189
- sourceEpisodeIds: [],
190
- embedding: null,
191
- metadata: {},
192
- createdAt: new Date(row.created_at),
193
- updatedAt: new Date(row.created_at),
194
- projectId: null,
195
- };
196
- }
197
- //# sourceMappingURL=procedural.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"procedural.js","sourceRoot":"","sources":["../src/procedural.ts"],"names":[],"mappings":"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"}
package/dist/search.d.ts DELETED
@@ -1,10 +0,0 @@
1
- /**
2
- * Sanitize a query string for use inside a PostgREST ilike pattern.
3
- *
4
- * ilike uses SQL LIKE semantics where `%` matches any sequence of characters,
5
- * `_` matches any single character. PostgREST's `.or()` filter also treats
6
- * `.` and `,` as field/value separators in the filter DSL. Escape all four
7
- * to prevent filter injection.
8
- */
9
- export declare function sanitizeIlike(query: string): string;
10
- //# sourceMappingURL=search.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMnD"}
package/dist/search.js DELETED
@@ -1,16 +0,0 @@
1
- /**
2
- * Sanitize a query string for use inside a PostgREST ilike pattern.
3
- *
4
- * ilike uses SQL LIKE semantics where `%` matches any sequence of characters,
5
- * `_` matches any single character. PostgREST's `.or()` filter also treats
6
- * `.` and `,` as field/value separators in the filter DSL. Escape all four
7
- * to prevent filter injection.
8
- */
9
- export function sanitizeIlike(query) {
10
- return query
11
- .replace(/%/g, '\\%')
12
- .replace(/_/g, '\\_')
13
- .replace(/\./g, '\\.')
14
- .replace(/,/g, '\\,');
15
- }
16
- //# sourceMappingURL=search.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,KAAK;SACT,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;AACzB,CAAC"}
@@ -1,30 +0,0 @@
1
- import type { SupabaseClient } from '@supabase/supabase-js';
2
- import type { SemanticMemory, SearchOptions, SearchResult } from '@engram-mem/core';
3
- import type { SemanticStorage } from '@engram-mem/core';
4
- export declare class SupabaseSemanticStorage implements SemanticStorage {
5
- private readonly client;
6
- constructor(client: SupabaseClient);
7
- insert(memory: Omit<SemanticMemory, 'id' | 'createdAt' | 'updatedAt' | 'accessCount' | 'lastAccessed'>): Promise<SemanticMemory>;
8
- search(query: string, opts?: SearchOptions): Promise<SearchResult<SemanticMemory>[]>;
9
- getUnaccessed(days: number): Promise<SemanticMemory[]>;
10
- recordAccessAndBoost(id: string, confidenceBoost: number): Promise<void>;
11
- markSuperseded(id: string, supersededBy: string): Promise<void>;
12
- batchDecay(opts: {
13
- daysThreshold: number;
14
- decayRate: number;
15
- }): Promise<number>;
16
- batchDecayGradient(updates: Array<{
17
- id: string;
18
- effectiveDecayRate: number;
19
- daysThreshold: number;
20
- }>): Promise<number>;
21
- searchAtTime(query: string, asOf: Date, opts?: {
22
- limit?: number;
23
- embedding?: number[];
24
- }): Promise<SearchResult<SemanticMemory>[]>;
25
- getTopicTimeline(topic: string, opts?: {
26
- fromDate?: Date;
27
- toDate?: Date;
28
- }): Promise<SemanticMemory[]>;
29
- }
30
- //# sourceMappingURL=semantic.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"semantic.d.ts","sourceRoot":"","sources":["../src/semantic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAGvD,qBAAa,uBAAwB,YAAW,eAAe;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc;IAE7C,MAAM,CACV,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,GAAG,aAAa,GAAG,cAAc,CAAC,GAC9F,OAAO,CAAC,cAAc,CAAC;IA+BpB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,CAAC;IA+DpF,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAWtD,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASxE,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB/D,UAAU,CAAC,IAAI,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAe/E,kBAAkB,CACtB,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,kBAAkB,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,GAChF,OAAO,CAAC,MAAM,CAAC;IAwBZ,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,IAAI,EACV,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAC9C,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,CAAC;IAepC,gBAAgB,CACpB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,IAAI,CAAA;KAAE,GACxC,OAAO,CAAC,cAAc,EAAE,CAAC;CAkB7B"}
package/dist/semantic.js DELETED
@@ -1,244 +0,0 @@
1
- import { generateId } from '@engram-mem/core';
2
- import { sanitizeIlike } from './search.js';
3
- export class SupabaseSemanticStorage {
4
- client;
5
- constructor(client) {
6
- this.client = client;
7
- }
8
- async insert(memory) {
9
- const id = generateId();
10
- // Insert into memories table first (FK requirement)
11
- const { error: memErr } = await this.client
12
- .from('memories')
13
- .insert({ id, type: 'semantic' });
14
- if (memErr)
15
- throw new Error(`Semantic memory insert failed: ${memErr.message}`);
16
- const { data, error } = await this.client
17
- .from('memory_semantic')
18
- .insert({
19
- id,
20
- topic: memory.topic,
21
- content: memory.content,
22
- confidence: memory.confidence,
23
- source_digest_ids: memory.sourceDigestIds,
24
- source_episode_ids: memory.sourceEpisodeIds,
25
- decay_rate: memory.decayRate,
26
- supersedes: memory.supersedes ?? null,
27
- superseded_by: memory.supersededBy ?? null,
28
- embedding: memory.embedding ?? null,
29
- metadata: memory.metadata,
30
- })
31
- .select()
32
- .single();
33
- if (error)
34
- throw new Error(`Semantic insert failed: ${error.message}`);
35
- return rowToSemantic(data);
36
- }
37
- async search(query, opts) {
38
- const limit = opts?.limit ?? 10;
39
- const embedding = opts?.embedding;
40
- if (embedding) {
41
- // Prefer hybrid RRF search when query text is also available
42
- if (query) {
43
- const { data, error } = await this.client.rpc('engram_hybrid_recall', {
44
- p_query_text: query,
45
- p_query_embedding: JSON.stringify(embedding),
46
- p_match_count: limit,
47
- p_include_episodes: false,
48
- p_include_digests: false,
49
- p_include_semantic: true,
50
- p_include_procedural: false,
51
- });
52
- if (error)
53
- throw new Error(`Semantic search (hybrid) failed: ${error.message}`);
54
- const rows = (data ?? []);
55
- const RRF_MAX = 2.0 / 61.0;
56
- return rows.map((r) => ({
57
- item: recallRowToSemantic(r),
58
- similarity: Math.min(1.0, (r.similarity || 0) / RRF_MAX),
59
- }));
60
- }
61
- // Embedding only — fall back to pure vector search
62
- const { data, error } = await this.client.rpc('engram_recall', {
63
- p_query_embedding: embedding,
64
- p_session_id: null,
65
- p_match_count: limit,
66
- p_min_similarity: opts?.minScore ?? 0.15,
67
- p_include_episodes: false,
68
- p_include_digests: false,
69
- p_include_semantic: true,
70
- p_include_procedural: false,
71
- });
72
- if (error)
73
- throw new Error(`Semantic search (vector) failed: ${error.message}`);
74
- const rows = (data ?? []);
75
- return rows.map((r) => ({
76
- item: recallRowToSemantic(r),
77
- similarity: r.similarity,
78
- }));
79
- }
80
- // Text fallback — strip all non-alphanumeric chars to avoid PostgREST .or()
81
- // parser failures (commas, parens, periods are structural in PostgREST filters)
82
- const safe = query.replace(/[^a-zA-Z0-9\s]/g, '').split(/\s+/).slice(0, 5).join(' ');
83
- const { data, error } = await this.client
84
- .from('memory_semantic')
85
- .select('*')
86
- .or(`topic.ilike.%${safe}%,content.ilike.%${safe}%`)
87
- .is('superseded_by', null)
88
- .limit(limit);
89
- if (error)
90
- throw new Error(`Semantic search (text) failed: ${error.message}`);
91
- return (data ?? []).map((r) => ({
92
- item: rowToSemantic(r),
93
- similarity: 0.5,
94
- }));
95
- }
96
- async getUnaccessed(days) {
97
- const cutoff = new Date(Date.now() - days * 86400000).toISOString();
98
- const { data, error } = await this.client
99
- .from('memory_semantic')
100
- .select('*')
101
- .gt('confidence', 0.05)
102
- .or(`last_accessed.is.null,last_accessed.lt.${cutoff}`);
103
- if (error)
104
- throw new Error(`Semantic getUnaccessed failed: ${error.message}`);
105
- return (data ?? []).map(rowToSemantic);
106
- }
107
- async recordAccessAndBoost(id, confidenceBoost) {
108
- const { error } = await this.client.rpc('engram_record_access', {
109
- p_id: id,
110
- p_memory_type: 'semantic',
111
- p_conf_boost: confidenceBoost,
112
- });
113
- if (error)
114
- throw new Error(`Semantic recordAccessAndBoost failed: ${error.message}`);
115
- }
116
- async markSuperseded(id, supersededBy) {
117
- // Update the old memory to point to its replacement
118
- const { error: err1 } = await this.client
119
- .from('memory_semantic')
120
- .update({ superseded_by: supersededBy })
121
- .eq('id', id);
122
- if (err1)
123
- throw new Error(`Semantic markSuperseded (old) failed: ${err1.message}`);
124
- // Update the new memory to record what it supersedes
125
- const { error: err2 } = await this.client
126
- .from('memory_semantic')
127
- .update({ supersedes: id })
128
- .eq('id', supersededBy);
129
- if (err2)
130
- throw new Error(`Semantic markSuperseded (new) failed: ${err2.message}`);
131
- }
132
- async batchDecay(opts) {
133
- // Call engram_decay_pass and extract semantic_decayed count
134
- const { data, error } = await this.client.rpc('engram_decay_pass', {
135
- p_semantic_decay_rate: opts.decayRate,
136
- p_procedural_decay_rate: 0,
137
- p_semantic_days: opts.daysThreshold,
138
- p_procedural_days: 999999,
139
- p_edge_prune_strength: 0,
140
- p_edge_prune_days: 999999,
141
- });
142
- if (error)
143
- throw new Error(`Semantic batchDecay failed: ${error.message}`);
144
- const rows = data;
145
- return rows?.[0]?.semantic_decayed ?? 0;
146
- }
147
- async batchDecayGradient(updates) {
148
- let total = 0;
149
- for (const u of updates) {
150
- const { error } = await this.client.rpc('engram_decay_semantic_single', {
151
- p_id: u.id,
152
- p_decay_rate: u.effectiveDecayRate,
153
- p_days_threshold: u.daysThreshold,
154
- });
155
- // RPC may not exist yet — fall back silently
156
- if (error) {
157
- // If the RPC doesn't exist, do a direct update
158
- const { count } = await this.client
159
- .from('memory_semantic')
160
- .update({ confidence: 0.05 }) // floor — can't do math in Supabase client
161
- .eq('id', u.id)
162
- .is('superseded_by', null);
163
- total += count ?? 0;
164
- continue;
165
- }
166
- total++;
167
- }
168
- return total;
169
- }
170
- async searchAtTime(query, asOf, opts) {
171
- // Get broader results then filter by temporal validity
172
- const results = await this.search(query, { limit: (opts?.limit ?? 10) * 3, embedding: opts?.embedding });
173
- const asOfIso = asOf.toISOString();
174
- return results.filter(r => {
175
- const meta = r.item.metadata;
176
- // Use valid_from/valid_until from the item if available, else fall back
177
- const validFrom = meta?.valid_from ?? r.item.createdAt.toISOString();
178
- const validUntil = meta?.valid_until;
179
- if (validFrom > asOfIso)
180
- return false;
181
- if (validUntil && validUntil <= asOfIso)
182
- return false;
183
- return true;
184
- }).slice(0, opts?.limit ?? 10);
185
- }
186
- async getTopicTimeline(topic, opts) {
187
- let query = this.client
188
- .from('memory_semantic')
189
- .select('*')
190
- .or(`topic.eq.${sanitizeIlike(topic)},topic.ilike.%${sanitizeIlike(topic)}%`)
191
- .order('created_at', { ascending: true });
192
- if (opts?.fromDate) {
193
- query = query.gte('created_at', opts.fromDate.toISOString());
194
- }
195
- if (opts?.toDate) {
196
- query = query.lte('created_at', opts.toDate.toISOString());
197
- }
198
- const { data, error } = await query;
199
- if (error)
200
- throw new Error(`Semantic getTopicTimeline failed: ${error.message}`);
201
- return (data ?? []).map(rowToSemantic);
202
- }
203
- }
204
- function rowToSemantic(row) {
205
- return {
206
- id: row.id,
207
- topic: row.topic,
208
- content: row.content,
209
- confidence: row.confidence,
210
- sourceDigestIds: row.source_digest_ids ?? [],
211
- sourceEpisodeIds: row.source_episode_ids ?? [],
212
- accessCount: row.access_count,
213
- lastAccessed: row.last_accessed ? new Date(row.last_accessed) : null,
214
- decayRate: row.decay_rate,
215
- supersedes: row.supersedes ?? null,
216
- supersededBy: row.superseded_by ?? null,
217
- embedding: row.embedding ?? null,
218
- metadata: row.metadata ?? {},
219
- createdAt: new Date(row.created_at),
220
- updatedAt: new Date(row.updated_at),
221
- projectId: null,
222
- };
223
- }
224
- function recallRowToSemantic(row) {
225
- return {
226
- id: row.id,
227
- topic: '',
228
- content: row.content,
229
- confidence: row.salience,
230
- sourceDigestIds: [],
231
- sourceEpisodeIds: [],
232
- accessCount: row.access_count,
233
- lastAccessed: null,
234
- decayRate: 0.02,
235
- supersedes: null,
236
- supersededBy: null,
237
- embedding: null,
238
- metadata: {},
239
- createdAt: new Date(row.created_at),
240
- updatedAt: new Date(row.created_at),
241
- projectId: null,
242
- };
243
- }
244
- //# sourceMappingURL=semantic.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"semantic.js","sourceRoot":"","sources":["../src/semantic.ts"],"names":[],"mappings":"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"}