oceanbus 0.3.4 → 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.
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.addToIndexes = addToIndexes;
4
+ exports.removeFromIndexes = removeFromIndexes;
5
+ exports.updateTagsInIndexes = updateTagsInIndexes;
6
+ exports.updateAgentsInIndexes = updateAgentsInIndexes;
7
+ function addToIndexes(indexes, contact) {
8
+ for (const tag of contact.tags) {
9
+ if (!indexes.byTag[tag])
10
+ indexes.byTag[tag] = [];
11
+ if (!indexes.byTag[tag].includes(contact.id))
12
+ indexes.byTag[tag].push(contact.id);
13
+ }
14
+ for (const a of contact.agents) {
15
+ // OpenID is always known (it's the public address). agentId is only known for our own identities.
16
+ indexes.byOpenId[a.openId] = contact.id;
17
+ if (a.agentId)
18
+ indexes.byAgentId[a.agentId] = contact.id;
19
+ }
20
+ }
21
+ function removeFromIndexes(indexes, contact) {
22
+ for (const tag of contact.tags) {
23
+ const list = indexes.byTag[tag];
24
+ if (list) {
25
+ indexes.byTag[tag] = list.filter(id => id !== contact.id);
26
+ if (indexes.byTag[tag].length === 0)
27
+ delete indexes.byTag[tag];
28
+ }
29
+ }
30
+ for (const a of contact.agents) {
31
+ if (indexes.byOpenId[a.openId] === contact.id)
32
+ delete indexes.byOpenId[a.openId];
33
+ if (a.agentId && indexes.byAgentId[a.agentId] === contact.id)
34
+ delete indexes.byAgentId[a.agentId];
35
+ }
36
+ }
37
+ function updateTagsInIndexes(indexes, contact, oldTags, newTags) {
38
+ const added = newTags.filter(t => !oldTags.includes(t));
39
+ const removed = oldTags.filter(t => !newTags.includes(t));
40
+ for (const tag of added) {
41
+ if (!indexes.byTag[tag])
42
+ indexes.byTag[tag] = [];
43
+ if (!indexes.byTag[tag].includes(contact.id))
44
+ indexes.byTag[tag].push(contact.id);
45
+ }
46
+ for (const tag of removed) {
47
+ const list = indexes.byTag[tag];
48
+ if (list) {
49
+ indexes.byTag[tag] = list.filter(id => id !== contact.id);
50
+ if (indexes.byTag[tag].length === 0)
51
+ delete indexes.byTag[tag];
52
+ }
53
+ }
54
+ }
55
+ function updateAgentsInIndexes(indexes, contactId, oldAgentIds, oldOpenIds, newAgentIds, newOpenIds) {
56
+ for (const aid of oldAgentIds) {
57
+ if (indexes.byAgentId[aid] === contactId)
58
+ delete indexes.byAgentId[aid];
59
+ }
60
+ for (const oid of oldOpenIds) {
61
+ if (indexes.byOpenId[oid] === contactId)
62
+ delete indexes.byOpenId[oid];
63
+ }
64
+ for (let i = 0; i < newAgentIds.length; i++) {
65
+ indexes.byOpenId[newOpenIds[i]] = contactId;
66
+ if (newAgentIds[i])
67
+ indexes.byAgentId[newAgentIds[i]] = contactId;
68
+ }
69
+ }
70
+ //# sourceMappingURL=indexes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexes.js","sourceRoot":"","sources":["../../src/roster/indexes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { Contact, SearchResult, RosterFilter, DuplicateHint } from '../types/roster';
2
+ /**
3
+ * Search contacts with conservative fuzzy matching.
4
+ * Exact: query matches id, name, or any alias exactly (case-insensitive).
5
+ * Fuzzy: query is a substring of name or alias (after normalizing spaces/punctuation).
6
+ * byTag: query matches any tag.
7
+ * byNote: query appears in notes.
8
+ *
9
+ * The result is a structured candidate set — disambiguation is the LLM's job.
10
+ */
11
+ export declare function search(contacts: Contact[], query: string): SearchResult;
12
+ export declare function getById(contacts: Contact[], id: string): Contact | null;
13
+ export declare function findByAgentId(contacts: Contact[], indexes: {
14
+ byAgentId: Record<string, string>;
15
+ }, agentId: string): Contact | null;
16
+ export declare function findByOpenId(contacts: Contact[], indexes: {
17
+ byOpenId: Record<string, string>;
18
+ }, openId: string): Contact | null;
19
+ export declare function list(contacts: Contact[], filter?: RosterFilter): Contact[];
20
+ /** Generate a slug from a Chinese or English name */
21
+ export declare function slugFromName(name: string): string;
22
+ /**
23
+ * Check if a new or updated contact looks like a duplicate of an existing one.
24
+ * Rules (in priority order):
25
+ * 1. Same OpenID — high confidence (0.95)
26
+ * 2. Same AgentID — high confidence (0.90)
27
+ * 3. Name highly similar — medium confidence (0.60–0.85)
28
+ *
29
+ * Returns hints for NEW potential duplicates not already in existingHints.
30
+ */
31
+ export declare function findDuplicates(incoming: Contact, existingContacts: Contact[], existingHints: DuplicateHint[], now: string): DuplicateHint[];
32
+ /** Dismiss a hint (called after user decides keep-separate or after merge) */
33
+ export declare function dismissHintsForContact(hints: DuplicateHint[], contactId: string): DuplicateHint[];
34
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/roster/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAc,YAAY,EAAE,YAAY,EAAE,aAAa,EAAmB,MAAM,iBAAiB,CAAC;AA4BvH;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,CAuEvE;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAEvE;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAIlI;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAI/H;AAED,wBAAgB,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,EAAE,CA4B1E;AAED,qDAAqD;AACrD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQjD;AAID;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,OAAO,EACjB,gBAAgB,EAAE,OAAO,EAAE,EAC3B,aAAa,EAAE,aAAa,EAAE,EAC9B,GAAG,EAAE,MAAM,GACV,aAAa,EAAE,CA0DjB;AAED,8EAA8E;AAC9E,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,aAAa,EAAE,CAEjG"}
@@ -0,0 +1,272 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.search = search;
4
+ exports.getById = getById;
5
+ exports.findByAgentId = findByAgentId;
6
+ exports.findByOpenId = findByOpenId;
7
+ exports.list = list;
8
+ exports.slugFromName = slugFromName;
9
+ exports.findDuplicates = findDuplicates;
10
+ exports.dismissHintsForContact = dismissHintsForContact;
11
+ function toMatchEntry(c, field, highlight) {
12
+ return {
13
+ id: c.id,
14
+ name: c.name,
15
+ matchField: field,
16
+ highlight,
17
+ tags: c.tags,
18
+ notes: c.notes.slice(0, 80),
19
+ agents: c.agents,
20
+ source: c.source,
21
+ };
22
+ }
23
+ /** Normalize a string for fuzzy matching: lowercase, remove spaces and punctuation */
24
+ function normalize(s) {
25
+ return s
26
+ .toLowerCase()
27
+ .replace(/[\s\-_.,;:!?()()【】《》""'·•]+/g, '')
28
+ .trim();
29
+ }
30
+ /** Check if target contains query as a substring (after normalization) */
31
+ function containsNormalized(target, query) {
32
+ return normalize(target).includes(normalize(query));
33
+ }
34
+ /**
35
+ * Search contacts with conservative fuzzy matching.
36
+ * Exact: query matches id, name, or any alias exactly (case-insensitive).
37
+ * Fuzzy: query is a substring of name or alias (after normalizing spaces/punctuation).
38
+ * byTag: query matches any tag.
39
+ * byNote: query appears in notes.
40
+ *
41
+ * The result is a structured candidate set — disambiguation is the LLM's job.
42
+ */
43
+ function search(contacts, query) {
44
+ const trimmed = query.trim();
45
+ if (!trimmed) {
46
+ return { query, exact: [], fuzzy: [], byTag: [], byNote: [] };
47
+ }
48
+ const qLower = trimmed.toLowerCase();
49
+ const exactIds = new Set();
50
+ const fuzzyIds = new Set();
51
+ const byTagIds = new Set();
52
+ const byNoteIds = new Set();
53
+ const active = contacts.filter(c => c.status === 'active' || c.status === 'pending');
54
+ for (const c of active) {
55
+ // Exact: id, name, aliases
56
+ if (c.id.toLowerCase() === qLower) {
57
+ exactIds.add(c.id);
58
+ continue;
59
+ }
60
+ if (c.name.toLowerCase() === qLower) {
61
+ exactIds.add(c.id);
62
+ continue;
63
+ }
64
+ if (c.aliases.some(a => a.toLowerCase() === qLower)) {
65
+ exactIds.add(c.id);
66
+ continue;
67
+ }
68
+ // Fuzzy: name or alias contains query after normalization
69
+ if (containsNormalized(c.name, trimmed)) {
70
+ fuzzyIds.add(c.id);
71
+ continue;
72
+ }
73
+ if (c.aliases.some(a => containsNormalized(a, trimmed))) {
74
+ fuzzyIds.add(c.id);
75
+ continue;
76
+ }
77
+ // By tag
78
+ if (c.tags.some(t => t.toLowerCase().includes(qLower))) {
79
+ byTagIds.add(c.id);
80
+ }
81
+ // By note
82
+ if (c.notes.toLowerCase().includes(qLower)) {
83
+ byNoteIds.add(c.id);
84
+ }
85
+ }
86
+ const contactMap = new Map(active.map(c => [c.id, c]));
87
+ const build = (ids, field, getHighlight) => Array.from(ids)
88
+ .map(id => contactMap.get(id))
89
+ .filter(Boolean)
90
+ .map(c => toMatchEntry(c, field, getHighlight(c)))
91
+ .sort((a, b) => a.name.localeCompare(b.name));
92
+ return {
93
+ query: trimmed,
94
+ exact: build(exactIds, 'name', c => c.name),
95
+ fuzzy: build(fuzzyIds, 'name', c => c.name),
96
+ byTag: build(byTagIds, 'tag', c => c.tags.find(t => t.toLowerCase().includes(qLower)) || ''),
97
+ byNote: build(byNoteIds, 'note', c => {
98
+ const idx = c.notes.toLowerCase().indexOf(qLower);
99
+ const start = Math.max(0, idx - 10);
100
+ const end = Math.min(c.notes.length, idx + qLower.length + 30);
101
+ return (start > 0 ? '…' : '') + c.notes.slice(start, end) + (end < c.notes.length ? '…' : '');
102
+ }),
103
+ };
104
+ }
105
+ function getById(contacts, id) {
106
+ return contacts.find(c => c.id === id && c.status !== 'archived') || null;
107
+ }
108
+ function findByAgentId(contacts, indexes, agentId) {
109
+ const contactId = indexes.byAgentId[agentId];
110
+ if (!contactId)
111
+ return null;
112
+ return getById(contacts, contactId);
113
+ }
114
+ function findByOpenId(contacts, indexes, openId) {
115
+ const contactId = indexes.byOpenId[openId];
116
+ if (!contactId)
117
+ return null;
118
+ return getById(contacts, contactId);
119
+ }
120
+ function list(contacts, filter) {
121
+ let result = contacts.filter(c => c.status !== 'archived');
122
+ if (filter?.status) {
123
+ result = result.filter(c => c.status === filter.status);
124
+ }
125
+ if (filter?.source) {
126
+ result = result.filter(c => c.source === filter.source);
127
+ }
128
+ if (filter?.tags && filter.tags.length > 0) {
129
+ result = result.filter(c => filter.tags.some(t => c.tags.includes(t)));
130
+ }
131
+ const sortBy = filter?.sortBy || 'name';
132
+ const order = filter?.order || 'asc';
133
+ result.sort((a, b) => {
134
+ const cmp = sortBy === 'name'
135
+ ? a.name.localeCompare(b.name)
136
+ : new Date(b[sortBy]).getTime() - new Date(a[sortBy]).getTime();
137
+ return order === 'asc' ? cmp : -cmp;
138
+ });
139
+ const offset = filter?.offset || 0;
140
+ const limit = filter?.limit;
141
+ if (offset > 0)
142
+ result = result.slice(offset);
143
+ if (limit !== undefined)
144
+ result = result.slice(0, limit);
145
+ return result;
146
+ }
147
+ /** Generate a slug from a Chinese or English name */
148
+ function slugFromName(name) {
149
+ // Keep alphanumeric, Chinese chars, hyphens; replace spaces with hyphens
150
+ return name
151
+ .trim()
152
+ .replace(/\s+/g, '-')
153
+ .replace(/[^a-zA-Z0-9一-鿿\-_]/g, '')
154
+ .toLowerCase()
155
+ || `contact_${Date.now()}`;
156
+ }
157
+ // ── Duplicate detection ──
158
+ /**
159
+ * Check if a new or updated contact looks like a duplicate of an existing one.
160
+ * Rules (in priority order):
161
+ * 1. Same OpenID — high confidence (0.95)
162
+ * 2. Same AgentID — high confidence (0.90)
163
+ * 3. Name highly similar — medium confidence (0.60–0.85)
164
+ *
165
+ * Returns hints for NEW potential duplicates not already in existingHints.
166
+ */
167
+ function findDuplicates(incoming, existingContacts, existingHints, now) {
168
+ const newHints = [];
169
+ const active = existingContacts.filter(c => c.status === 'active' && c.id !== incoming.id);
170
+ const hintedThisCall = new Set();
171
+ for (const c of active) {
172
+ // Already has a hint for this pair (from existing or this call)?
173
+ const pairKey = incoming.id < c.id ? `${incoming.id}|${c.id}` : `${c.id}|${incoming.id}`;
174
+ const alreadyHinted = existingHints.some(h => (h.contactA === incoming.id && h.contactB === c.id) ||
175
+ (h.contactA === c.id && h.contactB === incoming.id)) || hintedThisCall.has(pairKey);
176
+ if (alreadyHinted)
177
+ continue;
178
+ let matched = false;
179
+ // Rule 1: Same OpenID
180
+ for (const a of incoming.agents) {
181
+ if (!a.openId || matched)
182
+ break;
183
+ for (const b of c.agents) {
184
+ if (!b.openId)
185
+ continue;
186
+ if (a.openId === b.openId) {
187
+ newHints.push(makeHint(incoming.id, c.id, 'same_openid', `Both have OpenID ${a.openId.slice(0, 16)}...`, 0.95, now));
188
+ hintedThisCall.add(pairKey);
189
+ matched = true;
190
+ break;
191
+ }
192
+ }
193
+ }
194
+ // Rule 2: Same AgentID
195
+ if (!matched) {
196
+ for (const a of incoming.agents) {
197
+ if (!a.agentId || matched)
198
+ break;
199
+ for (const b of c.agents) {
200
+ if (!b.agentId)
201
+ continue;
202
+ if (a.agentId === b.agentId) {
203
+ newHints.push(makeHint(incoming.id, c.id, 'same_agentId', `Both have Agent ID ${a.agentId.slice(0, 12)}...`, 0.90, now));
204
+ hintedThisCall.add(pairKey);
205
+ matched = true;
206
+ break;
207
+ }
208
+ }
209
+ }
210
+ }
211
+ // Rule 3: Name similarity (after normalization)
212
+ if (!matched) {
213
+ const sim = nameSimilarity(incoming.name, c.name);
214
+ if (sim >= 0.75 && !hasSameOpenIdOrAgentId(incoming, c)) {
215
+ newHints.push(makeHint(incoming.id, c.id, 'name_similarity', `Names similar (score ${sim.toFixed(2)}): "${incoming.name}" ≈ "${c.name}"`, sim, now));
216
+ hintedThisCall.add(pairKey);
217
+ }
218
+ }
219
+ }
220
+ return newHints;
221
+ }
222
+ /** Dismiss a hint (called after user decides keep-separate or after merge) */
223
+ function dismissHintsForContact(hints, contactId) {
224
+ return hints.filter(h => h.contactA !== contactId && h.contactB !== contactId);
225
+ }
226
+ function makeHint(a, b, reason, detail, confidence, now) {
227
+ // Canonical order: smaller id first
228
+ const [contactA, contactB] = a < b ? [a, b] : [b, a];
229
+ return { contactA, contactB, reason, detail, confidence, createdAt: now };
230
+ }
231
+ function hasSameOpenIdOrAgentId(a, b) {
232
+ const aOpenIds = new Set(a.agents.map(x => x.openId).filter(Boolean));
233
+ const bOpenIds = new Set(b.agents.map(x => x.openId).filter(Boolean));
234
+ for (const oid of aOpenIds) {
235
+ if (bOpenIds.has(oid))
236
+ return true;
237
+ }
238
+ const aAgentIds = new Set(a.agents.map(x => x.agentId).filter(Boolean));
239
+ const bAgentIds = new Set(b.agents.map(x => x.agentId).filter(Boolean));
240
+ for (const aid of aAgentIds) {
241
+ if (bAgentIds.has(aid))
242
+ return true;
243
+ }
244
+ return false;
245
+ }
246
+ function nameSimilarity(a, b) {
247
+ const na = normalize(a);
248
+ const nb = normalize(b);
249
+ if (na === nb)
250
+ return 1.0;
251
+ if (na.length === 0 || nb.length === 0)
252
+ return 0;
253
+ // Simple edit distance normalized
254
+ const dist = editDistance(na, nb);
255
+ const maxLen = Math.max(na.length, nb.length);
256
+ return 1 - dist / maxLen;
257
+ }
258
+ function editDistance(a, b) {
259
+ const m = a.length, n = b.length;
260
+ const dp = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));
261
+ for (let i = 0; i <= m; i++)
262
+ dp[i][0] = i;
263
+ for (let j = 0; j <= n; j++)
264
+ dp[0][j] = j;
265
+ for (let i = 1; i <= m; i++) {
266
+ for (let j = 1; j <= n; j++) {
267
+ dp[i][j] = a[i - 1] === b[j - 1] ? dp[i - 1][j - 1] : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
268
+ }
269
+ }
270
+ return dp[m][n];
271
+ }
272
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/roster/search.ts"],"names":[],"mappings":";;AAqCA,wBAuEC;AAED,0BAEC;AAED,sCAIC;AAED,oCAIC;AAED,oBA4BC;AAGD,oCAQC;AAaD,wCA+DC;AAGD,wDAEC;AApPD,SAAS,YAAY,CAAC,CAAU,EAAE,KAA+B,EAAE,SAAiB;IAClF,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,UAAU,EAAE,KAAK;QACjB,SAAS;QACT,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,MAAM,EAAE,CAAC,CAAC,MAAM;KACjB,CAAC;AACJ,CAAC;AAED,sFAAsF;AACtF,SAAS,SAAS,CAAC,CAAS;IAC1B,OAAO,CAAC;SACL,WAAW,EAAE;SACb,OAAO,CAAC,8BAA8B,EAAE,EAAE,CAAC;SAC3C,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,0EAA0E;AAC1E,SAAS,kBAAkB,CAAC,MAAc,EAAE,KAAa;IACvD,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AACtD,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,MAAM,CAAC,QAAmB,EAAE,KAAa;IACvD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAChE,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAEpC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IAErF,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,2BAA2B;QAC3B,IAAI,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;YAClC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACnB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;YACpC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACnB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC;YACpD,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACnB,SAAS;QACX,CAAC;QAED,0DAA0D;QAC1D,IAAI,kBAAkB,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;YACxC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACnB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;YACxD,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACnB,SAAS;QACX,CAAC;QAED,SAAS;QACT,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YACvD,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACrB,CAAC;QAED,UAAU;QACV,IAAI,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3C,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvD,MAAM,KAAK,GAAG,CAAC,GAAgB,EAAE,KAA+B,EAAE,YAAoC,EAAgB,EAAE,CACtH,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;SACZ,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;SAC9B,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;SACjD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAElD,OAAO;QACL,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3C,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3C,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5F,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE;YACnC,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAClD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;YACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;YAC/D,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChG,CAAC,CAAC;KACH,CAAC;AACJ,CAAC;AAED,SAAgB,OAAO,CAAC,QAAmB,EAAE,EAAU;IACrD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,IAAI,IAAI,CAAC;AAC5E,CAAC;AAED,SAAgB,aAAa,CAAC,QAAmB,EAAE,OAA8C,EAAE,OAAe;IAChH,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,OAAO,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AACtC,CAAC;AAED,SAAgB,YAAY,CAAC,QAAmB,EAAE,OAA6C,EAAE,MAAc;IAC7G,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,OAAO,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AACtC,CAAC;AAED,SAAgB,IAAI,CAAC,QAAmB,EAAE,MAAqB;IAC7D,IAAI,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;IAE3D,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;QACnB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;QACnB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,MAAM,EAAE,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,IAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,IAAI,KAAK,CAAC;IACrC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACnB,MAAM,GAAG,GAAG,MAAM,KAAK,MAAM;YAC3B,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9B,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAClE,OAAO,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,CAAC;IAC5B,IAAI,MAAM,GAAG,CAAC;QAAE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,KAAK,KAAK,SAAS;QAAE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAEzD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,qDAAqD;AACrD,SAAgB,YAAY,CAAC,IAAY;IACvC,yEAAyE;IACzE,OAAO,IAAI;SACR,IAAI,EAAE;SACN,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC;SAClC,WAAW,EAAE;WACX,WAAW,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AAC/B,CAAC;AAED,4BAA4B;AAE5B;;;;;;;;GAQG;AACH,SAAgB,cAAc,CAC5B,QAAiB,EACjB,gBAA2B,EAC3B,aAA8B,EAC9B,GAAW;IAEX,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAC,CAAC;IAE3F,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAEzC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,iEAAiE;QACjE,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;QACzF,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAC3C,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;YACnD,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAAE,CAAC,CACpD,IAAI,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,aAAa;YAAE,SAAS;QAE5B,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,sBAAsB;QACtB,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YAChC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,OAAO;gBAAE,MAAM;YAChC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;gBACzB,IAAI,CAAC,CAAC,CAAC,MAAM;oBAAE,SAAS;gBACxB,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;oBAC1B,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,aAAa,EAAE,oBAAoB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;oBACrH,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBAC5B,OAAO,GAAG,IAAI,CAAC;oBACf,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAED,uBAAuB;QACvB,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAChC,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,OAAO;oBAAE,MAAM;gBACjC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;oBACzB,IAAI,CAAC,CAAC,CAAC,OAAO;wBAAE,SAAS;oBACzB,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;wBAC5B,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,cAAc,EAAE,sBAAsB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;wBACzH,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;wBAC5B,OAAO,GAAG,IAAI,CAAC;wBACf,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,gDAAgD;QAChD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAClD,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC;gBACxD,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,iBAAiB,EAAE,wBAAwB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;gBACrJ,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,8EAA8E;AAC9E,SAAgB,sBAAsB,CAAC,KAAsB,EAAE,SAAiB;IAC9E,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,MAAuB,EAAE,MAAc,EAAE,UAAkB,EAAE,GAAW;IAC9G,oCAAoC;IACpC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;AAC5E,CAAC;AAED,SAAS,sBAAsB,CAAC,CAAU,EAAE,CAAU;IACpD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACtE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACtE,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;IAAC,CAAC;IACnE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACxE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACxE,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAAC,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;IAAC,CAAC;IACrE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,CAAS,EAAE,CAAS;IAC1C,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,GAAG,CAAC;IAC1B,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAEjD,kCAAkC;IAClC,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,IAAI,GAAG,MAAM,CAAC;AAC3B,CAAC;AAED,SAAS,YAAY,CAAC,CAAS,EAAE,CAAS;IACxC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,MAAM,EAAE,GAAe,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACrF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;QAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;QAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { RosterData } from '../types/roster';
2
+ export declare class RosterStore {
3
+ private filePath;
4
+ private data;
5
+ constructor(filePath?: string);
6
+ getPath(): string;
7
+ load(): Promise<RosterData>;
8
+ save(data: RosterData): Promise<void>;
9
+ private flush;
10
+ /** Clear in-memory cache (force re-read on next load) */
11
+ invalidate(): void;
12
+ delete(): Promise<void>;
13
+ }
14
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/roster/store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AA8BlD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,IAAI,CAA2B;gBAE3B,QAAQ,CAAC,EAAE,MAAM;IAI7B,OAAO,IAAI,MAAM;IAIX,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC;IAc3B,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;YAM7B,KAAK;IAOnB,yDAAyD;IACzD,UAAU,IAAI,IAAI;IAIZ,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAM9B"}
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.RosterStore = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const os = __importStar(require("os"));
40
+ const CURRENT_VERSION = 2;
41
+ function getDefaultRosterDir() {
42
+ return path.join(os.homedir(), '.oceanbus');
43
+ }
44
+ function emptyRoster() {
45
+ return {
46
+ version: CURRENT_VERSION,
47
+ updatedAt: new Date().toISOString(),
48
+ contacts: [],
49
+ identities: [],
50
+ autoDiscovery: {
51
+ enabled: true,
52
+ minMentions: 3,
53
+ sources: ['chat.log', 'user-messages'],
54
+ ignoreList: ['我', '你', '他', '她', '它', '我们', '你们', '他们', '她们', '大家', '自己', '别人', '谁', '什么', '怎么'],
55
+ pending: [],
56
+ },
57
+ indexes: {
58
+ byTag: {},
59
+ byAgentId: {},
60
+ byOpenId: {},
61
+ },
62
+ duplicateHints: [],
63
+ };
64
+ }
65
+ class RosterStore {
66
+ filePath;
67
+ data = null;
68
+ constructor(filePath) {
69
+ this.filePath = filePath || path.join(getDefaultRosterDir(), 'roster.json');
70
+ }
71
+ getPath() {
72
+ return this.filePath;
73
+ }
74
+ async load() {
75
+ if (this.data)
76
+ return this.data;
77
+ try {
78
+ const raw = await fs.promises.readFile(this.filePath, 'utf-8');
79
+ const parsed = JSON.parse(raw);
80
+ this.data = migrate(parsed);
81
+ return this.data;
82
+ }
83
+ catch {
84
+ this.data = emptyRoster();
85
+ await this.flush();
86
+ return this.data;
87
+ }
88
+ }
89
+ async save(data) {
90
+ data.updatedAt = new Date().toISOString();
91
+ this.data = data;
92
+ await this.flush();
93
+ }
94
+ async flush() {
95
+ const dir = path.dirname(this.filePath);
96
+ await fs.promises.mkdir(dir, { recursive: true });
97
+ const content = JSON.stringify(this.data, null, 2);
98
+ await fs.promises.writeFile(this.filePath, content, { mode: 0o600 });
99
+ }
100
+ /** Clear in-memory cache (force re-read on next load) */
101
+ invalidate() {
102
+ this.data = null;
103
+ }
104
+ async delete() {
105
+ try {
106
+ await fs.promises.unlink(this.filePath);
107
+ }
108
+ catch { /* already gone */ }
109
+ this.data = null;
110
+ }
111
+ }
112
+ exports.RosterStore = RosterStore;
113
+ function migrate(data) {
114
+ if (!data.version || data.version < 2) {
115
+ return migrateV1toV2(data);
116
+ }
117
+ return data;
118
+ }
119
+ function migrateV1toV2(data) {
120
+ const now = new Date().toISOString();
121
+ // v1→v2: ensure indexes, autoDiscovery, identities, provenance, duplicateHints exist
122
+ return {
123
+ version: 2,
124
+ updatedAt: data.updatedAt || now,
125
+ contacts: (data.contacts || []).map(c => ({
126
+ ...c,
127
+ status: c.status || 'active',
128
+ apps: c.apps || {},
129
+ aliases: c.aliases || [],
130
+ provenance: c.provenance || { account: c.source || 'manual', sourceId: null, firstSeenAt: c.createdAt || now, lastVerifiedAt: c.createdAt || now },
131
+ })),
132
+ identities: data.identities || [],
133
+ autoDiscovery: data.autoDiscovery || emptyRoster().autoDiscovery,
134
+ indexes: data.indexes || rebuildIndexes(data.contacts || []),
135
+ duplicateHints: data.duplicateHints || [],
136
+ };
137
+ }
138
+ function rebuildIndexes(contacts) {
139
+ const indexes = { byTag: {}, byAgentId: {}, byOpenId: {} };
140
+ for (const c of contacts) {
141
+ for (const tag of c.tags) {
142
+ if (!indexes.byTag[tag])
143
+ indexes.byTag[tag] = [];
144
+ if (!indexes.byTag[tag].includes(c.id))
145
+ indexes.byTag[tag].push(c.id);
146
+ }
147
+ for (const a of c.agents) {
148
+ indexes.byAgentId[a.agentId] = c.id;
149
+ indexes.byOpenId[a.openId] = c.id;
150
+ }
151
+ }
152
+ return indexes;
153
+ }
154
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/roster/store.ts"],"names":[],"mappings":"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"}
@@ -4,4 +4,5 @@ export * from './messaging';
4
4
  export * from './crypto';
5
5
  export * from './l1';
6
6
  export * from './config';
7
+ export * from './roster';
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,MAAM,CAAC;AACrB,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,MAAM,CAAC;AACrB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC"}
@@ -20,4 +20,5 @@ __exportStar(require("./messaging"), exports);
20
20
  __exportStar(require("./crypto"), exports);
21
21
  __exportStar(require("./l1"), exports);
22
22
  __exportStar(require("./config"), exports);
23
+ __exportStar(require("./roster"), exports);
23
24
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wCAAsB;AACtB,0CAAwB;AACxB,8CAA4B;AAC5B,2CAAyB;AACzB,uCAAqB;AACrB,2CAAyB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wCAAsB;AACtB,0CAAwB;AACxB,8CAA4B;AAC5B,2CAAyB;AACzB,uCAAqB;AACrB,2CAAyB;AACzB,2CAAyB"}