MCPcopy Create free account
hub / github.com/MemTensor/MemOS / skillFtsSearch

Method skillFtsSearch

packages/memos-core/src/storage/sqlite.ts:1850–1886  ·  view source on GitHub ↗
(query: string, limit: number, scope: "self" | "public" | "mix", currentOwner: string)

Source from the content-addressed store, hash-verified

1848 }
1849
1850 skillFtsSearch(query: string, limit: number, scope: "self" | "public" | "mix", currentOwner: string): Array<{ skillId: string; score: number }> {
1851 const sanitized = sanitizeFtsQuery(query);
1852 if (!sanitized) return [];
1853
1854 try {
1855 let sql = `
1856 SELECT s.id as skill_id, rank
1857 FROM skills_fts f
1858 JOIN skills s ON s.rowid = f.rowid
1859 WHERE skills_fts MATCH ? AND s.status = 'active'`;
1860 const params: any[] = [sanitized];
1861
1862 if (scope === "self") {
1863 sql += ` AND s.owner = ?`;
1864 params.push(currentOwner);
1865 } else if (scope === "public") {
1866 sql += ` AND s.visibility = 'public'`;
1867 } else {
1868 sql += ` AND (s.owner = ? OR s.visibility = 'public')`;
1869 params.push(currentOwner);
1870 }
1871
1872 sql += ` ORDER BY rank LIMIT ?`;
1873 params.push(limit);
1874
1875 const rows = this.db.prepare(sql).all(...params) as Array<{ skill_id: string; rank: number }>;
1876 if (rows.length === 0) return [];
1877 const maxAbsRank = Math.max(...rows.map((r) => Math.abs(r.rank)));
1878 return rows.map((r) => ({
1879 skillId: r.skill_id,
1880 score: maxAbsRank > 0 ? Math.abs(r.rank) / maxAbsRank : 0,
1881 }));
1882 } catch {
1883 this.log.warn(`Skill FTS query failed for: "${sanitized}", returning empty`);
1884 return [];
1885 }
1886 }
1887
1888 // ─── Task Embeddings & Search ───
1889

Callers 3

searchSkillsMethod · 0.45
findRelatedSkillMethod · 0.45

Calls 5

allMethod · 0.80
prepareMethod · 0.80
mapMethod · 0.80
sanitizeFtsQueryFunction · 0.70
warnMethod · 0.65

Tested by

no test coverage detected