UNPKG

roam-research-mcp

Version:
51 lines (50 loc) • 2.46 kB
import { q } from '@roam-research/roam-api-sdk'; import { BaseSearchHandler } from './types.js'; import { SearchUtils } from './utils.js'; export class StatusSearchHandler extends BaseSearchHandler { constructor(graph, params) { super(graph); this.params = params; } async execute() { const { status, page_title_uid } = this.params; // Get target page UID if provided let targetPageUid; if (page_title_uid) { targetPageUid = await SearchUtils.findPageByTitleOrUid(this.graph, page_title_uid); } // Build query based on whether we're searching in a specific page let queryStr; let queryParams; // Search for "{{TODO" or "{{DONE" which matches both {{[[TODO]]}} and {{TODO}} formats if (targetPageUid) { queryStr = `[:find ?block-uid ?block-str ?page-title ?block-create-time ?block-edit-time :in $ ?status ?page-uid :where [?p :block/uid ?page-uid] [?p :node/title ?page-title] [?b :block/page ?p] [?b :block/string ?block-str] [?b :block/uid ?block-uid] [(clojure.string/includes? ?block-str (str "{{" ?status))] [(get-else $ ?b :create/time 0) ?block-create-time] [(get-else $ ?b :edit/time 0) ?block-edit-time]]`; queryParams = [status, targetPageUid]; } else { queryStr = `[:find ?block-uid ?block-str ?page-title ?block-create-time ?block-edit-time :in $ ?status :where [?b :block/string ?block-str] [?b :block/uid ?block-uid] [?b :block/page ?p] [?p :node/title ?page-title] [(clojure.string/includes? ?block-str (str "{{" ?status))] [(get-else $ ?b :create/time 0) ?block-create-time] [(get-else $ ?b :edit/time 0) ?block-edit-time]]`; queryParams = [status]; } const rawResults = await q(this.graph, queryStr, queryParams); // Resolve block references in content const resolvedResults = await this.resolveBlockRefs(rawResults); return SearchUtils.formatSearchResults(resolvedResults, `with status ${status}`, !targetPageUid); } }