roam-research-mcp
Version:
MCP server and CLI for Roam Research
51 lines (50 loc) • 2.46 kB
JavaScript
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);
}
}