fix: read tools should always get correct data

via db-worker thread. Also fix getPageData returning
some temp and untranslated attributes
This commit is contained in:
Gabriel Horner
2025-09-25 13:22:06 -04:00
parent 5b919bd7a7
commit 917df54d74
2 changed files with 57 additions and 30 deletions

View File

@@ -37,6 +37,7 @@
[goog.object :as gobj]
[lambdaisland.glogi :as log]
[lambdaisland.glogi.console :as glogi-console]
[logseq.cli.common.mcp.tools :as cli-common-mcp-tools]
[logseq.common.util :as common-util]
[logseq.db :as ldb]
[logseq.db.common.entity-plus :as entity-plus]
@@ -482,18 +483,18 @@
(def-thread-api :thread-api/block-refs-check
[repo id {:keys [unlinked?]}]
(m/sp
(when-let [conn (worker-state/get-datascript-conn repo)]
(let [db @conn
block (d/entity db id)]
(if unlinked?
(let [title (string/lower-case (:block/title block))
result (m/? (search-blocks repo title {:limit 100}))]
(boolean (some (fn [b]
(let [block (d/entity db (:db/id b))]
(and (not= id (:db/id block))
(not ((set (map :db/id (:block/refs block))) id))
(string/includes? (string/lower-case (:block/title block)) title)))) result)))
(some? (first (common-initial-data/get-block-refs db (:db/id block)))))))))
(when-let [conn (worker-state/get-datascript-conn repo)]
(let [db @conn
block (d/entity db id)]
(if unlinked?
(let [title (string/lower-case (:block/title block))
result (m/? (search-blocks repo title {:limit 100}))]
(boolean (some (fn [b]
(let [block (d/entity db (:db/id b))]
(and (not= id (:db/id block))
(not ((set (map :db/id (:block/refs block))) id))
(string/includes? (string/lower-case (:block/title block)) title)))) result)))
(some? (first (common-initial-data/get-block-refs db (:db/id block)))))))))
(def-thread-api :thread-api/get-block-parents
[repo id depth]
@@ -782,6 +783,26 @@
(when-let [conn (worker-state/get-datascript-conn repo)]
(ldb/get-graph-rtc-uuid @conn)))
(def-thread-api :thread-api/api-get-page-data
[repo page-title]
(let [conn (worker-state/get-datascript-conn repo)]
(cli-common-mcp-tools/get-page-blocks @conn page-title)))
(def-thread-api :thread-api/api-list-properties
[repo]
(let [conn (worker-state/get-datascript-conn repo)]
(cli-common-mcp-tools/list-properties @conn)))
(def-thread-api :thread-api/api-list-tags
[repo]
(let [conn (worker-state/get-datascript-conn repo)]
(cli-common-mcp-tools/list-tags @conn)))
(def-thread-api :thread-api/api-list-pages
[repo]
(let [conn (worker-state/get-datascript-conn repo)]
(cli-common-mcp-tools/list-pages @conn)))
(comment
(def-thread-api :general/dangerousRemoveAllDbs
[]
@@ -835,14 +856,14 @@
[repo start-opts]
(js/Promise.
(m/sp
(c.m/<? (init-sqlite-module!))
(when-not (:import-type start-opts)
(c.m/<? (start-db! repo start-opts))
(assert (some? (worker-state/get-datascript-conn repo))))
(c.m/<? (init-sqlite-module!))
(when-not (:import-type start-opts)
(c.m/<? (start-db! repo start-opts))
(assert (some? (worker-state/get-datascript-conn repo))))
;; Don't wait for rtc started because the app will be slow to be ready
;; for users.
(when @worker-state/*rtc-ws-url
(rtc.core/new-task--rtc-start true)))))
(when @worker-state/*rtc-ws-url
(rtc.core/new-task--rtc-start true)))))
(def broadcast-data-types
(set (map

View File

@@ -48,7 +48,6 @@
[goog.object :as gobj]
[lambdaisland.glogi :as log]
[logseq.api.block :as api-block]
[logseq.cli.common.mcp.tools :as cli-common-mcp-tools]
[logseq.common.util :as common-util]
[logseq.common.util.date-time :as date-time-util]
[logseq.db :as ldb]
@@ -1178,24 +1177,31 @@
;; TODO: Use transit for internal APIs
(defn ^:export list_tags
[]
(clj->js (cli-common-mcp-tools/list-tags (db/get-db))))
(p/let [resp (state/<invoke-db-worker :thread-api/api-list-tags (state/get-current-repo))]
(clj->js resp)))
(defn ^:export list_properties
[]
(clj->js (cli-common-mcp-tools/list-properties (db/get-db))))
(p/let [resp (state/<invoke-db-worker :thread-api/api-list-properties (state/get-current-repo))]
(clj->js resp)))
(defn ^:export list_pages
[]
(p/let [resp (state/<invoke-db-worker :thread-api/api-list-pages (state/get-current-repo))]
(clj->js resp)))
(defn ^:export get_page_data
"Like get_page_blocks_tree but for MCP tools"
[page-title]
(if-let [tools (cli-common-mcp-tools/get-page-blocks (db/get-db) page-title)]
(->> tools
(map #(dissoc % :block.temp/has-children? :block.temp/load-status))
clj->js)
#js {:error (str "Page " (pr-str page-title) " not found")}))
(defn ^:export list_pages
[]
(clj->js (cli-common-mcp-tools/list-pages (db/get-db))))
(p/let [tools (state/<invoke-db-worker :thread-api/api-get-page-data (state/get-current-repo) page-title)]
(if tools
(->> tools
(map #(-> %
sdk-utils/remove-hidden-properties
;; remove unused and untranslated attrs
(dissoc :block/children :block/page)))
clj->js)
#js {:error (str "Page " (pr-str page-title) " not found")})))
;; ui
(def ^:export show_msg sdk-ui/-show_msg)