


























@@ -256,6 +256,11 @@ class MemoryDB {
256256await this.ensureInitialized();
257257return this.table!.countRows();
258258}
259+260+async getTable(): Promise<LanceDB.Table> {
261+await this.ensureInitialized();
262+return this.table!;
263+}
259264}
260265261266// ============================================================================
@@ -815,6 +820,74 @@ export default definePluginEntry({
815820console.log(JSON.stringify(output, null, 2));
816821});
817822823+memory
824+.command("query")
825+.description("Query memories (non-vector search)")
826+.option("--cols <columns>", "Columns to select, comma-separated")
827+.option("--filter <condition>", "Filter condition")
828+.option("--limit <n>", "Limit number of results", "10")
829+.option("--order-by <order>", "Order by column and direction (e.g., createdAt:desc)")
830+.action(async (opts) => {
831+const table = await db.getTable();
832+let query = table.query();
833+let sortColAdded = false;
834+let sortColName: string | undefined;
835+if (opts.cols) {
836+const columns = (opts.cols as string).split(",").map((c: string) => c.trim());
837+if (opts.orderBy) {
838+const [sortCol] = opts.orderBy.split(":");
839+sortColName = sortCol;
840+if (!columns.includes(sortCol)) {
841+columns.push(sortCol);
842+sortColAdded = true;
843+}
844+}
845+query = query.select(columns);
846+} else {
847+query = query.select(["id", "text", "importance", "category", "createdAt"]);
848+}
849+if (opts.filter) {
850+const filterCondition = String(opts.filter);
851+if (filterCondition.length > 200) {
852+throw new Error("Filter condition exceeds maximum length of 200 characters");
853+}
854+if (!/^[a-zA-Z0-9_\-\s='"><!.,()%*]+$/.test(filterCondition)) {
855+throw new Error("Filter condition contains invalid characters");
856+}
857+query = query.where(filterCondition);
858+}
859+const limit = Number.parseInt(opts.limit, 10);
860+if (Number.isNaN(limit) || limit <= 0) {
861+throw new Error("Invalid limit: must be a positive integer");
862+}
863+864+// Fetch all filtered rows first if we need to order them in memory
865+if (!opts.orderBy) {
866+query = query.limit(limit);
867+}
868+let rows = await query.toArray();
869+if (opts.orderBy) {
870+const [col, dir] = opts.orderBy.split(":");
871+const direction = dir?.toLowerCase() === "desc" ? -1 : 1;
872+rows.sort((a, b) => {
873+if (a[col] < b[col]) {
874+return -1 * direction;
875+}
876+if (a[col] > b[col]) {
877+return 1 * direction;
878+}
879+return 0;
880+});
881+rows = rows.slice(0, limit);
882+if (sortColAdded && sortColName) {
883+for (const row of rows) {
884+delete row[sortColName];
885+}
886+}
887+}
888+console.log(JSON.stringify(rows, null, 2));
889+});
890+818891memory
819892.command("stats")
820893.description("Show memory statistics")
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。