UNPKG

logseq-mcp

Version:
47 lines (38 loc) 94.1 kB
#!/usr/bin/env node import Q0 from"node:process";import k from"node:process";import{McpServer as b4}from"@modelcontextprotocol/sdk/server/mcp.js";import{StdioServerTransport as k4}from"@modelcontextprotocol/sdk/server/stdio.js";import b from"node:process";import{config as S0}from"dotenv";S0();var z0=()=>{let Z=b.env.LOGSEQ_TOKEN||"",$=b.env.LOGSEQ_API_TOKEN||"",J=b.env.LOGSEQ_MCP_TOKEN||"",Y=(X)=>X==="your-logseq-token-here";if(!Y(Z)&&Z)return Z;if(!Y($)&&$)return $;if(!Y(J)&&J)return J;if(Z)return Z;if($)return $;if(J)return J;return""},s=()=>z0(),C0=s();if(!C0&&b.env.TEST_TYPE!=="unit"&&b.env.MOCK_LOGSEQ_API!=="true")console.error("Error: No Logseq API token found. Please set LOGSEQ_TOKEN, LOGSEQ_API_TOKEN, or LOGSEQ_MCP_TOKEN environment variable."),b.exit(1);var x0=b.env.LOGSEQ_PORT||"12315",A0=b.env.LOGSEQ_HOST||"127.0.0.1";var JZ=`http://${A0}:${x0}/api`,qZ=b.env.LIST_ALL_PAGES_AS_RESOURCES==="true",Q=(...Z)=>{console.error(...Z)};import{z as r}from"zod";function M0(Z){Z.prompt("create-daily-note",{sections:r.string().optional()},($)=>{return{messages:[{role:"user",content:{type:"text",text:`Create a daily note for today with the following sections: ${($.sections||"Tasks,Notes,Journal").split(",").map((V)=>V.trim()).map((V)=>`## ${V} `).join("")} This will help me organize my day and keep track of important information.`}}]}})}function I0(Z){Z.prompt("search-knowledge",{query:r.string().optional()},($)=>({messages:[{role:"user",content:{type:"text",text:`Search my Logseq knowledge base for information about "${$.query||""}". Use the search-blocks tool with the query parameter set to "${$.query||""}" to find relevant blocks, then summarize the findings.`}}]}))}function B0(Z){Z.prompt("summarize-page",{pageName:r.string()},($)=>({messages:[{role:"user",content:{type:"text",text:`Create a concise summary of the "${$.pageName}" page. First get the full page content, analyze it, and then generate a summary that captures the main points, key insights, and important details.`}}]}))}function E0(Z){Z.prompt("create-nested-content",{pageName:r.string(),content:r.string()},($)=>({messages:[{role:"user",content:{type:"text",text:`Create a well-structured nested hierarchy of blocks in page "${$.pageName}" from the following content: ${$.content} Please organize this content with all section headers at the same level (as siblings) and nest related content as children underneath them. Use the create-nested-blocks tool since it's specifically designed for hierarchical content. Use page properties for page metadata instead of creating an overall page header. Never use bullet points (dashes) at the beginning of blocks.`}}]}))}function LZ(Z){M0(Z),I0(Z),B0(Z),E0(Z)}import{z as p}from"zod";function D0(Z){Z.prompt("organize-blocks",{pageOrBlockId:p.string(),criteria:p.string().optional()},($)=>{let J="Organize the blocks";if($.pageOrBlockId)J+=` in ${$.pageOrBlockId}`;if($.criteria)J+=` by ${$.criteria}`;return J+=". First get the blocks, then analyze them, and finally create a structured hierarchy by moving blocks appropriately.",{messages:[{role:"user",content:{type:"text",text:J}}]}})}function O0(Z){Z.prompt("organize-blocks-as-nested",{pageName:p.string(),structure:p.string().optional()},($)=>{let J=`Analyze the page "${$.pageName}" and reorganize its content into a well-structured nested hierarchy of blocks.`;if($.structure)J+=` Use the following structure as a guide: ${$.structure}`;return J+=` Always use the create-nested-blocks tool which is specifically designed for hierarchical content. Keep all section headers at the same level (as siblings) and nest related content as children underneath these headers. Use page properties for page metadata instead of creating an overall page header. Never use bullet points (dashes) at the beginning of blocks.`,{messages:[{role:"user",content:{type:"text",text:J}}]}})}function N0(){return` Please follow these guidelines: 1. Use the get-full-page tool to retrieve all content from the page 2. Analyze the content to identify logical hierarchy and grouping 3. Keep all section headers at the same level (as siblings) 4. Nest related content as children underneath these headers 5. Use page properties for page metadata instead of creating an overall page header 6. Break down long paragraphs into shorter, focused blocks 7. Never use bullet points (dashes) at the beginning of blocks 8. Always use the create-nested-blocks tool which is specifically designed for hierarchical content Focus on creating a clear hierarchical structure that enhances readability and navigation.`}function q0(Z){Z.prompt("convert-flat-to-nested",{pageName:p.string(),structureCriteria:p.string().optional()},($)=>{let J=`Convert the flat content of page "${$.pageName}" into a proper nested structure.`;if($.structureCriteria)J+=` Use ${$.structureCriteria} as the criteria for organizing the content.`;return J+=N0(),{messages:[{role:"user",content:{type:"text",text:J}}]}})}function PZ(Z){D0(Z),O0(Z),q0(Z)}import{z as SZ}from"zod";function vZ(Z){Z.prompt("query-tasks",{status:SZ.string().optional()},($)=>({messages:[{role:"user",content:{type:"text",text:`Find all tasks with status ${$.status||"TODO"} in my Logseq graph. Here's the Datalog query to use: \`\`\`clojure {:title "Tasks with status ${$.status||"TODO"}" :query [:find (pull ?b [*]) :where (task ?b #{"${$.status||"TODO"}"})] } \`\`\``}}]})),Z.prompt("extract-tasks",{source:SZ.string().optional(),status:SZ.string().optional()},($)=>({messages:[{role:"user",content:{type:"text",text:`Extract all ${$.status||""} tasks from ${$.source||"my notes"} and organize them into a structured list. First search for task blocks, then analyze and group them by project, priority, or other relevant criteria.`}}]}))}function TZ(Z){vZ(Z),LZ(Z),PZ(Z)}import{ResourceTemplate as T1}from"@modelcontextprotocol/sdk/server/mcp.js";import YZ from"node:process";var L0=200,P0=/#\{([^}]+)\}/,v0=/includes\?\s+\?\w+\s+"((?:\\.|[^"])*)"/,T0=/:block\/parent\s+(\d+)/,h0=/:limit\s+(\d+)/,R0=/:offset\s+(\d+)/,y0=/\s+/,f0=30000,b0=60000,k0=1000,m0=4,d0=new Set(["logseq.Editor.renamePage"]);function i(Z,$){if(!Z)return!1;let J=Z.tags;if(Array.isArray(J))return J.includes($);return!1}var u0=()=>{let Z=YZ.env.MOCK_LOGSEQ_API==="true";return Q(`Mock mode check: MOCK_LOGSEQ_API=${YZ.env.MOCK_LOGSEQ_API}, isMockMode=${Z}`),Z};function g0(Z){if(Z.includes("getBlockProperty"))return!0;if(Z.includes("getProperty"))return!0;if(Z.includes("removeBlockProperty"))return!0;return!1}function c0(Z,$){if(!$||$.trim()==="")return Q(`Empty response from Logseq API (${Z})`),null;try{let J=JSON.parse($);return Q("Logseq API response:",`${JSON.stringify(J).substring(0,L0)}...`),J}catch(J){if(Z.includes("checkEditing"))return $.trim();let Y;if(J instanceof Error)Y=J.message;else Y=String(J);if(Q(`JSON parse error for ${Z}:`,J),g0(Z))return null;throw Error(`Failed to parse JSON response: ${Y}`)}}var w={pages:[{id:1,name:"MCP-Test-Page",uuid:"mock-page-1",properties:{"test-property":"test-value"}},{id:2,name:"Current-Test-Page",uuid:"mock-page-2",properties:{}},{id:3,name:"Reference-Test-Page",uuid:"mock-page-3",properties:{}},{id:4,name:"Recipe Page",uuid:"mock-page-4",properties:{tags:["recipe"]}},{id:5,name:"Tasks-Page",uuid:"mock-page-5",properties:{}}],blocks:[{id:101,uuid:"mock-block-uuid",content:"This is a test block created by MCP integration test",page:{id:"MCP-Test-Page"},parent:{id:1},order:"0000"},{id:102,uuid:"task-todo",content:"TODO This is a todo task",page:{id:"Tasks-Page"},parent:{id:5},order:"0000",marker:"TODO"},{id:103,uuid:"task-doing",content:"DOING This is a doing task",page:{id:"Tasks-Page"},parent:{id:5},order:"0001",marker:"DOING"},{id:104,uuid:"task-done",content:"DONE This is a done task",page:{id:"Tasks-Page"},parent:{id:5},order:"0002",marker:"DONE"},{id:105,uuid:"recipe-block",content:"This is a recipe block",page:{id:"Recipe Page"},properties:{tags:["recipe"]},parent:{id:4},order:"0000"}],currentPage:{name:"Current-Test-Page",uuid:"mock-page-2"}},hZ=1000,RZ=new Map;function m(){return hZ+=1,hZ}function XZ(Z){return Z.trim().toLowerCase().replace(/\s*-\s*/g,"-").replace(/\s+/g,"-")}function n(Z){let $=XZ(Z);return w.pages.find((J)=>J.name.toLowerCase()===Z.toLowerCase()||XZ(J.name)===$)}function zZ(Z){return w.blocks.find(($)=>$.uuid===Z)}function e(Z){let $=zZ(Z);if($)return{pageName:$.page.id,parentId:$.id};let J=n(Z);if(J)return{pageName:J.name,parentId:J.id};let Y=RZ.get(Z);if(!Y)Y=m(),RZ.set(Z,Y);return{pageName:Z,parentId:Y}}function VZ(Z){let $=w.blocks.filter((Y)=>Y.parent?.id===Z).map((Y)=>Number.parseInt(Y.order,10)).filter((Y)=>Number.isFinite(Y)),J=0;if($.length>0)J=Math.max(...$)+1;return String(J).padStart(m0,"0")}async function p0(Z,$,J){let Y=new AbortController,X=setTimeout(()=>Y.abort(),J);try{return await fetch(JZ,{method:"POST",headers:{Authorization:`Bearer ${s()}`,"Content-Type":"application/json"},body:JSON.stringify({method:Z,args:$}),signal:Y.signal})}catch(V){if(V instanceof Error&&V.name==="AbortError"){let W=J/k0;throw Error(`Logseq API timeout after ${W}s calling ${Z}`)}throw V}finally{clearTimeout(X)}}async function K(Z,$=[]){if(u0())return v1(Z,$);Q(`Calling Logseq API: ${Z} with args:`,JSON.stringify($));let J=f0;if(d0.has(Z))J=b0;let Y=await p0(Z,$,J);if(!Y.ok)throw Error(`Logseq API error: ${Y.status} ${Y.statusText}`);try{return c0(Z,await Y.text())}catch(X){let V;if(X instanceof Error)V=X.message;else V=String(X);throw Error(`Failed to parse JSON response: ${V}`)}}async function i0(Z,$){let J;for(let Y of Z)try{return await K(Y,$)}catch(X){J=X,Q(`Failed calling ${Y}, trying next fallback`,X)}if(J instanceof Error)throw J;throw Error("All Logseq API methods failed")}async function u(Z){return i0(["logseq.db.datascript_query","logseq.DB.datascriptQuery","logseq.DB.q"],[Z])}function yZ(Z){let $=Z[0],J=Z[1]||{},Y=Z[2],X={id:m(),name:$,uuid:`page-${m()}`,properties:J};if(w.pages.push(X),Y?.redirect)w.currentPage={name:$,uuid:X.uuid||"mock-page-2"};return{name:$,uuid:X.uuid||"mock-page-2",properties:J,id:X.id}}function n0(Z){let $=Z[0],J=n($);if(!J)return null;return{name:J.name.toLowerCase().replace(/\s/g,"-"),originalName:J.name,uuid:J.uuid||"mock-page-2",properties:J.properties,id:J.id}}function l0(){return{name:w.currentPage.name.toLowerCase().replace(/\s/g,"-"),originalName:w.currentPage.name,uuid:w.currentPage.uuid||"mock-page-2",id:n(w.currentPage.name)?.id||2}}function o0(){return w.pages.map((Z)=>({name:Z.name.toLowerCase().replace(/\s/g,"-"),originalName:Z.name,uuid:Z.uuid||"mock-page-2",id:Z.id,journal:!1}))}function a0(Z){let $=Z[0],J=n($),Y=XZ($);return w.blocks.filter((X)=>X.page.id.toLowerCase()===$.toLowerCase()||XZ(X.page.id)===Y||J!==void 0&&X.page.id===J.name)}function t0(Z){return[{from:{name:"Another-Page",uuid:"mock-page-ref"},to:{name:Z[0],uuid:"mock-page-target"},content:"Reference content"}]}var d=0;function s0(Z){let $=Z[0],J=Z[1],Y=Z[2];d+=1;let X=e($),V={id:m(),uuid:`mock-block-${Date.now()}-${d}`,content:J,page:{id:X.pageName},properties:Y?.properties||{},parent:{id:X.parentId},order:VZ(X.parentId)};return w.blocks.push(V),V}function r0(Z){let $=Z[0],J=Z[1],Y=Z[2];if(Y&&typeof Y==="object"&&"keepId"in Y)throw Error("insertBlock does not accept the legacy keepId option");d+=1;let X=`mock-block-${Date.now()}-${d}`,V=e($),W={id:m(),uuid:X,content:J,page:{id:V.pageName},properties:Y?.properties||{},parent:{id:V.parentId},order:VZ(V.parentId)};return w.blocks.push(W),W}function e0(Z){let $=Z[0],J=Z[1],Y=zZ($);if(!Y)return null;if(J?.includeChildren)return{...Y,children:w.blocks.filter((X)=>X.parent?.id===Y.id)};return Y}function Z1(Z){let $=Z[1];if($!==void 0){if(!$||typeof $!=="object"||Array.isArray($))throw Error("editBlock expects an options object");if(typeof $.pos!=="number")throw Error("editBlock options must include numeric pos")}return null}function $1(Z){if(Z[0]!=="page")throw Error("pushState requires the page route");let $=Z[1],J=Z[2];if(!$||typeof $!=="object"||typeof $.name!=="string")throw Error("pushState requires a page name");if(J!==void 0){if(!J||typeof J!=="object"||typeof J.anchor!=="string")throw Error("pushState query must include a block anchor")}return null}function J1(Z){let $=Z[0],J=Z[1],Y=Z[2],X=w.blocks.find((V)=>V.uuid===$);if(X){if(X.content=J,Y?.properties)X.properties={...X.properties,...Y.properties};return X}return null}function Y1(Z){let $=Z[0],J=w.blocks.findIndex((Y)=>Y.uuid===$);if(J>=0)w.blocks.splice(J,1);return null}function X1(Z){let $=Z[0],J=Z[1],Y=w.blocks.find((V)=>V.uuid===$);if(!Y?.properties)return null;let X=Y.properties[J];if(X!==void 0)return X;return null}function V1(Z){let $=Z[0],J=w.blocks.find((Y)=>Y.uuid===$);if(!J)return null;return J.properties||{}}function fZ(Z){let $=Z[0],J=Z[1],Y=Z[2],X=w.blocks.find((V)=>V.uuid===$);if(!X)return null;if(!X.properties)X.properties={};return X.properties[J]=Y,{"db/id":Date.now()}}function W1(Z){let $=Z[0],J=Z[1],Y=w.blocks.find((X)=>X.uuid===$);if(!Y?.properties)return null;return delete Y.properties[J],{success:!0}}function K1(Z){let $=Z[0],J=Z[1],Y=Z[2];if(Y&&typeof Y==="object"&&"keepId"in Y)throw Error("insertBatchBlock does not accept the legacy keepId option");let X=[],V=e($),W=(H,G)=>H.map((U)=>{let j=m(),x={id:j,uuid:`mock-block-${Date.now()}-${j}`,content:U.content||"",page:{id:V.pageName},parent:{id:G},order:VZ(G),properties:U.properties||{}};if(w.blocks.push(x),X.push(x),U.children&&Array.isArray(U.children))x.children=W(U.children,x.id);return x});if(W(J,V.parentId),X[0])return X[0];return null}function H1(Z){let $=Z[0],J=w.blocks.findIndex((Y)=>Y.uuid===$);if(J>=0&&J<w.blocks.length-1){let Y=w.blocks[J];if(Y)for(let X=J+1;X<w.blocks.length;X+=1){let V=w.blocks[X];if(V&&V.parent?.id===Y.parent?.id)return V}}return null}function G1(Z){let $=Z[0],J=Z[1],Y=Z[2];if(Y&&typeof Y==="object"&&"sibling"in Y)throw Error("moveBlock does not accept the sibling option");let X=w.blocks.find((V)=>V.uuid===$);if(X){if(Y?.children){let V=zZ(J);if(V)X.parent={id:V.id};else X.parent=null}else X.parent=null;return{success:!0,uuid:$}}return null}function w1(){if(w.blocks.length>0)return w.blocks[0];return null}function U1(){if(w.blocks.length>=2)return[w.blocks[0],w.blocks[1]];if(w.blocks.length===1)return[w.blocks[0]];return[]}function _1(Z){let $=Z[0],J=w.pages.indexOf(n($));if(J>=0){let Y=w.pages[J];w.pages.splice(J,1),w.blocks=w.blocks.filter((X)=>X.page.id!==Y?.name)}return null}function F1(Z){let $=Z[0],J=Z[1],Y=n($);if(Y){let X=Y.name;Y.name=J;for(let V of w.blocks)if(V.page.id===$||V.page.id===X)V.page.id=J;return{success:!0}}return null}function j1(Z){let $=Z[0],J=Z[1],Y=Z[2]||{};d+=1;let X=e($),V={id:m(),uuid:`mock-block-${Date.now()}-${d}`,content:J,page:{id:X.pageName},properties:Y,parent:{id:X.parentId},order:VZ(X.parentId)};return w.blocks.push(V),V}function Q1(Z){let $=Z[0],J=Z[1],Y=Z[2]||{};d+=1;let X=e($),V={id:m(),uuid:`mock-block-${Date.now()}-${d}`,content:J,page:{id:X.pageName},properties:Y,parent:{id:X.parentId},order:"0000"};return w.blocks.unshift(V),V}function S1(Z){let $=Z[0],J=Z[1],Y=w.blocks.find((X)=>X.uuid===$);if(Y){if(!Y.properties)Y.properties={};let X=Y.properties.tags;if(Array.isArray(X)){if(!X.includes(J))X.push(J)}else Y.properties.tags=[J];return{"db/id":Date.now()}}return null}function z1(Z){let $=Z[0],J=Z[1],Y=w.blocks.find((X)=>X.uuid===$);if(Y?.properties){let X=Y.properties.tags;if(Array.isArray(X)){let V=X.indexOf(J);if(V>=0)X.splice(V,1)}return{"db/id":Date.now()}}return null}function C1(Z){if(Z.includes("TODO"))return["TODO"];if(Z.includes("DOING"))return["DOING"];if(Z.includes("DONE"))return["DONE"];return["TODO","DOING","DONE"]}function x1(Z){if(!Z.includes("This is a test block created by MCP integration test"))return null;let $=w.blocks.filter((J)=>J.content.includes("This is a test block created by MCP integration test"));if($.length>0)return $.map((J)=>[J]);return null}function A1(Z){if(!Z.includes("clojure.string/includes?"))return null;let $=Z.match(v0);if(!$?.[1])return[];let J=$[1].replace(/\\"/g,'"').replace(/\\\\/g,"\\");if(J.length===0)return[];let Y=w.blocks.filter((G)=>G.content.includes(J)).map((G)=>[G]),X=Z.match(h0),V=Z.match(R0),W;if(X?.[1])W=Number.parseInt(X[1],10);let H=0;if(V?.[1])H=Number.parseInt(V[1],10);if(W===void 0)return Y.slice(H);return Y.slice(H,H+W)}function M1(Z){let $=Z.match(P0);if($?.[1])return $[1].split(y0).map((J)=>J.replace(/"/g,"").trim()).filter(Boolean);return["TODO","DOING","DONE"]}function I1(Z){if(!Z.includes(":block/marker"))return null;if(YZ.env.MOCK_LOGSEQ_CURRENT_DB==="true")return[];let $=M1(Z);return w.blocks.filter((J)=>{let Y=J.marker,X=J.properties?.marker,V=J.content?.split(" ")?.[0],W=Y||X||V;return W!==void 0&&$.includes(W.toUpperCase())}).map((J)=>[J])}function B1(Z){if(!Z.includes(":logseq.property/status"))return null;let $=[];if(Z.includes(":logseq.property/status.todo"))$.push("TODO");if(Z.includes(":logseq.property/status.doing"))$.push("DOING");if(Z.includes(":logseq.property/status.done"))$.push("DONE");if(Z.includes(":logseq.property/status.backlog"))$.push("LATER");return w.blocks.filter((J)=>{let Y=J.marker||J.content.split(" ")[0];return Boolean(Y&&$.includes(Y.toUpperCase()))}).map((J)=>[J])}function E1(Z){if(!Z.includes(":block/marker"))return null;let $=C1(Z);return w.blocks.filter((J)=>{let Y=J.content.split(" ")[0];if(!Y)return!1;return $.includes(Y)}).map((J)=>[J])}function D1(Z){let $=Z.match(T0);if(!$?.[1])return null;let J=Number.parseInt($[1],10);return w.blocks.filter((Y)=>Y.parent?.id===J).sort((Y,X)=>Y.order.localeCompare(X.order)).map((Y)=>[Y])}function O1(Z){if(!Z.includes("recipe"))return null;let $=w.blocks.filter((J)=>i(J.properties,"recipe")||J.content.includes("#recipe")||J.content.includes("recipe"));if($.length>0){let J=$.map((Y)=>[Y]);if(Z.includes(":page/properties")){let Y=w.pages.filter((X)=>i(X.properties,"recipe"));J.push(...Y.map((X)=>[{name:X.name,originalName:X.name,uuid:X.uuid,properties:X.properties,":page/properties":X.properties}]))}return J}return null}function N1(Z){if(Z.includes(':block/type "class"'))return[[{uuid:"mock-tag-uuid",name:"mock-tag",":block/name":"mock-tag"}]];if(Z.includes(':block/type "property"'))return[[{uuid:"mock-property-uuid",name:"mock-property",":block/name":"mock-property",type:"default"}]];if(Z.includes(":block/tags")&&Z.includes(":block/name"))return[[w.blocks.find(($)=>$.uuid==="recipe-block")]];return null}function bZ(Z){let $=Z[0];if(!$||typeof $!=="string")return[[{uuid:"mock-query-result",content:"Mock query result",properties:{}}]];let J=x1($);if(J)return J;let Y=D1($);if(Y)return Y;let X=B1($);if(X)return X;let V=A1($);if(V)return V;let W=I1($);if(W)return W;let H=E1($);if(H)return H;let G=O1($);if(G)return G;let U=N1($);if(U)return U;return[[{uuid:"mock-query-result",content:"Mock query result",properties:{}}]]}function kZ(Z){let $=Z[0];if(YZ.env.MOCK_LOGSEQ_CURRENT_DB==="true"&&$&&($.includes(":block/marker")||$.includes(":logseq.property/status")))throw Error("Legacy task DB.q fallback should not be used for current DB graphs");if($&&typeof $==="string"){if($.includes("This is a test block created by MCP integration test")){let Y=w.blocks.find((X)=>X.content.includes("This is a test block created by MCP integration test"));if(Y)return[[Y]]}let J=w.blocks.filter((Y)=>Y.content.includes($)).map((Y)=>[Y]);if(J.length>0)return J;return[[{uuid:"search-result",content:`Search result for: ${$}`,properties:{}}]]}return[[{uuid:"default-search-result",content:"Default search result",properties:{}}]]}function q1(Z){let $=Z[0];if($&&typeof $==="string"&&$.includes("block/marker"))return w.blocks.filter((J)=>J.content.startsWith("TODO")||J.content.startsWith("DOING")||J.content.startsWith("DONE")).map((J)=>[J.uuid,J.content.split(" ")[0]]);if($&&typeof $==="string"&&$.includes(":block/content"))return w.blocks.map((J)=>[{uuid:J.uuid,content:J.content,":block/content":J.content,page:J.page}]);if($&&typeof $==="string"&&$.includes(":block/_refs"))return[["mock-reference-uuid"]];if($&&typeof $==="string"&&$.includes(":block/properties")&&$.includes("recipe"))return w.blocks.filter((J)=>i(J.properties,"recipe")).map((J)=>[J.uuid]);if($&&typeof $==="string"&&$.includes(":page/properties")&&$.includes("recipe"))return w.pages.filter((J)=>i(J.properties,"recipe")).map((J)=>[J.name]);return w.blocks.map((J)=>[{uuid:J.uuid,content:J.content}])}function L1(){return{blocks:w.blocks.filter((Z)=>i(Z.properties,"recipe")).map((Z)=>({uuid:Z.uuid,content:Z.content})),pages:w.pages.filter((Z)=>i(Z.properties,"recipe")).map((Z)=>({name:Z.name}))}}var P1={"logseq.Editor.createPage":yZ,"logseq.Editor.createTag":yZ,"logseq.Editor.getPage":n0,"logseq.Editor.getCurrentPage":()=>l0(),"logseq.Editor.getAllPages":()=>o0(),"logseq.Editor.getPageBlocksTree":a0,"logseq.Editor.getPageLinkedReferences":t0,"logseq.Editor.deletePage":_1,"logseq.Editor.renamePage":F1,"logseq.Editor.appendBlockInPage":j1,"logseq.Editor.prependBlockInPage":Q1,"logseq.Editor.createBlock":s0,"logseq.Editor.insertBlock":r0,"logseq.Editor.getBlock":e0,"logseq.Editor.updateBlock":J1,"logseq.Editor.removeBlock":Y1,"logseq.Editor.insertBatchBlock":K1,"logseq.Editor.getNextSiblingBlock":H1,"logseq.Editor.moveBlock":G1,"logseq.Editor.getBlockProperty":X1,"logseq.Editor.getBlockProperties":V1,"logseq.Editor.setBlockProperty":fZ,"logseq.Editor.upsertBlockProperty":fZ,"logseq.Editor.removeBlockProperty":W1,"logseq.Editor.addBlockTag":S1,"logseq.Editor.removeBlockTag":z1,"logseq.Editor.setBlockCollapsed":()=>null,"logseq.Editor.selectBlock":()=>null,"logseq.Editor.editBlock":Z1,"logseq.Editor.getCurrentBlock":()=>w1(),"logseq.Editor.getSelectedBlocks":()=>U1(),"logseq.Editor.clearSelectedBlocks":()=>null,"logseq.Editor.checkEditing":()=>null,"logseq.Editor.insertAtEditingCursor":()=>null,"logseq.Editor.exitEditingMode":()=>null,"logseq.Editor.openInRightSidebar":()=>null,"logseq.App.pushState":$1,"logseq.db.datascript_query":bZ,"logseq.db.q":kZ,"logseq.DB.datascriptQuery":bZ,"logseq.DB.q":kZ,"logseq.Datascript.q":q1,"logseq.Datascript.qUpsert":()=>L1()};function v1(Z,$=[]){Q(`[MOCK] Calling Logseq API: ${Z} with args:`,JSON.stringify($));let J=P1[Z];if(J)return J($);return Q(`[MOCK] Unhandled method: ${Z}`),null}function mZ(Z){Z.resource("blocks",new T1("logseq:block:{uuid}",{list:void 0}),async($,{uuid:J})=>{try{let Y=await K("logseq.Editor.getBlock",[J]);if(Y)return{contents:[{uri:$.href,mimeType:"application/json",text:JSON.stringify(Y,null,2)}]};return{contents:[]}}catch{return{contents:[]}}})}import{ResourceTemplate as h1}from"@modelcontextprotocol/sdk/server/mcp.js";async function R1(){if(!qZ)return Q("LIST_ALL_PAGES_AS_RESOURCES is disabled. Pages can still be accessed via direct URI (e.g., logseq:page:MyPage)"),{resources:[]};try{return Q("LIST_ALL_PAGES_AS_RESOURCES is enabled. Listing all pages..."),{resources:(await K("logseq.Editor.getAllPages",[])).map(($)=>{let J=String($.originalName||$.name||"Untitled");return{uri:`logseq:page:${encodeURIComponent(J)}`,name:J,description:`Page: ${J}`,mimeType:"application/json"}})}}catch{return{resources:[]}}}async function y1(Z,$){try{let J=decodeURIComponent($.pageName);Q(`Reading page resource for: "${J}"`);let Y=await K("logseq.Editor.getPage",[J]);if(!Y)return Q(`Page not found: "${J}"`),f1(Z,J);return await b1(Z,J,Y)}catch(J){return k1(Z,J)}}function f1(Z,$){return{contents:[{uri:Z.href,mimeType:"text/plain",text:`Page "${$}" not found`}]}}async function b1(Z,$,J){Q(`Getting blocks for page: "${$}"`);let Y=await K("logseq.Editor.getPageBlocksTree",[$]),X={...J,blocks:Y};return Q(`Successfully retrieved page resource: "${$}"`),{contents:[{uri:Z.href,mimeType:"application/json",text:JSON.stringify(X,null,2)}]}}function k1(Z,$){return{contents:[{uri:Z.href,mimeType:"text/plain",text:`Error reading page: ${$}`}]}}function dZ(Z){Z.resource("pages",new h1("logseq:page:{pageName}",{list:R1}),y1)}import{ResourceTemplate as m1}from"@modelcontextprotocol/sdk/server/mcp.js";function uZ(Z){Z.resource("query",new m1("logseq:query:{query}",{list:void 0}),async($,{query:J})=>{try{let Y=decodeURIComponent(J),X=await K("logseq.DB.q",[Y]);return{contents:[{uri:$.href,mimeType:"application/json",text:JSON.stringify(X,null,2)}]}}catch(Y){return console.error("Failed to execute query resource:",Y),{contents:[]}}})}function gZ(Z){dZ(Z),mZ(Z),uZ(Z)}import{z as A}from"zod";import{z as h}from"zod";var cZ={maxContentLength:80,showProperties:!0,showMarker:!0,indent:" "},WZ={branch:"├─",last:"└─",pipe:"│ ",space:" "};function pZ(Z,$){let J=Z.replace(/\n/g," ").replace(/\s+/g," ").trim();if(J.length<=$)return J;return`${J.substring(0,$-3)}...`}function d1(Z,$,J){if(J&&$.marker)Z.push(String($.marker))}function u1(Z,$){if($.priority)Z.push(`#${$.priority}`)}function g1(Z,$,J){if(!J||!$.properties)return;let Y=$.properties;for(let[X,V]of Object.entries(Y)){if(X.startsWith(":")||X.startsWith("logseq."))continue;let W;if(typeof V==="string")W=V;else W=JSON.stringify(V);Z.push(`${X}:${W}`)}}function c1(Z,$){if($.scheduled){let J=new Date($.scheduled).toISOString().split("T")[0];Z.push(`scheduled:${J}`)}if($.deadline){let J=new Date($.deadline).toISOString().split("T")[0];Z.push(`deadline:${J}`)}}function p1(Z,$){let J=[];if(d1(J,Z,$.showMarker),u1(J,Z),g1(J,Z,$.showProperties),c1(J,Z),J.length>0)return` [${J.join(", ")}]`;return""}function iZ(Z,$,J,Y){let X=Z.uuid,V=pZ(String(Z.content||""),Y.maxContentLength),W=p1(Z,Y);return`${$}${J} ${X} "${V}"${W}`}function HZ(Z,$,J){let Y=[];for(let X=0;X<Z.length;X+=1){let V=Z[X];if(!V?.uuid)continue;let W=X===Z.length-1,H;if(W)H=WZ.last;else H=WZ.branch;Y.push(iZ(V,$,H,J));let G=V.children;if(G&&G.length>0){let U;if(W)U=$+WZ.space;else U=$+WZ.pipe;Y.push(...HZ(G,U,J))}}return Y}function i1(Z,$){let J=[],Y=new Map;for(let X of Z){let W=X.page?.name||"Unknown";if(!Y.has(W))Y.set(W,[]);Y.get(W)?.push(X)}for(let[X,V]of Y){if(Y.size>1)J.push(`page: ${X}`),J.push("─".repeat(25));if(J.push(...HZ(V,"",$)),Y.size>1)J.push("")}return J.join(` `)}function n1(Z){let $=[];for(let J of Z){let{uuid:Y,name:X}=J,V=[];if(J.journal)V.push("journal");if(J.properties){let H=J.properties;for(let[G,U]of Object.entries(H))if(!G.startsWith(":"))V.push(`${G}:${U}`)}let W="";if(V.length>0)W=` [${V.join(", ")}]`;$.push(`${Y} "${X}"${W}`)}return $.join(` `)}function l1(Z,$){let J=[],Y=Z.uuid,X=Z.name||Z.content||"";J.push(`${Y} "${X}"`);let V=Z.blocks;if(V&&V.length>0)J.push("─".repeat(25)),J.push(...HZ(V,"",$));return J.join(` `)}function o1(Z,$){let J=[],Y=Z.page;if(Y?.name)J.push(`page: ${Y.name}`),J.push("─".repeat(25));J.push(iZ(Z,"","",$).trim());let X=Z.children;if(X&&X.length>0)J.push(...HZ(X,"",$));return J.join(` `)}function nZ(Z){return typeof Z==="object"&&Z!==null&&"uuid"in Z}function lZ(Z){return typeof Z==="object"&&Z!==null&&"name"in Z&&!("content"in Z)}function a1(Z,$){if(Z.length===0)return"[]";let J=Z[0];if(nZ(J))return i1(Z,$);if(lZ(J))return n1(Z);return JSON.stringify(Z,null,2)}function t1(Z,$){if("uuid"in Z&&"name"in Z&&"blocks"in Z)return l1(Z,$);if("uuid"in Z&&"name"in Z&&!("children"in Z)&&!("content"in Z)){let{uuid:J,name:Y}=Z;return`${J} "${Y}"`}if("uuid"in Z&&"content"in Z)return o1(Z,$);return JSON.stringify(Z,null,2)}function s1(Z,$={}){let J={...cZ,...$};if(Z===null||Z===void 0)return"[]";if(Array.isArray(Z))return a1(Z,J);if(typeof Z==="object")return t1(Z,J);return String(Z)}function KZ(Z,$,J){for(let Y of Z){let X=Y.uuid,V=pZ(String(Y.content||""),J.maxContentLength),W="";if(Y.marker)W=` [${Y.marker}]`;$.push(`${X}: ${V}${W}`);let H=Y.children;if(H)KZ(H,$,J)}}function r1(Z,$){if(Z.length===0)return"[]";let J=[],Y=Z[0];if(nZ(Y))return KZ(Z,J,$),J.join(` `);if(lZ(Y)){for(let X of Z){let{uuid:V,name:W}=X;J.push(`${V}: ${W}`)}return J.join(` `)}return JSON.stringify(Z,null,2)}function e1(Z,$){let J=[];if("uuid"in Z&&"content"in Z)return KZ([Z],J,$),J.join(` `);if("uuid"in Z&&"name"in Z){J.push(`${Z.uuid}: ${Z.name}`);let Y=Z.blocks;if(Y)KZ(Y,J,$);return J.join(` `)}return JSON.stringify(Z,null,2)}function Z2(Z,$={}){let J={...cZ,...$};if(Z===null||Z===void 0)return"[]";if(Array.isArray(Z))return r1(Z,J);if(typeof Z==="object")return e1(Z,J);return JSON.stringify(Z,null,2)}function oZ(Z,$,J={}){switch($){case"compact":return s1(Z,J);case"minimal":return Z2(Z,J);default:if(typeof Z==="string")return Z;return JSON.stringify(Z,null,2)}}var $2=50,J2=100,Y2=946684800000,X2=4102444800000,v={format:h.enum(["compact","json","minimal"]).optional().default("compact").describe('Output format: "compact" (indented tree - default), "json" (full JSON), "minimal" (UUID + content only)'),filterInternalProps:h.boolean().optional().default(!0).describe("Filter out internal Logseq properties (e.g., :plugin.property.*, :logseq.property.*)"),fields:h.array(h.string()).optional().describe('Only return these fields. Example: ["uuid", "content", "createdAt"]'),expandRefs:h.boolean().optional().default(!1).describe("Expand reference IDs to include name/uuid (requires additional API calls)"),expandParent:h.boolean().optional().default(!1).describe("Expand parent ID to include uuid/content"),expandPage:h.boolean().optional().default(!1).describe("Expand page ID to include name/uuid"),timestampFormat:h.enum(["ms","iso"]).optional().default("ms").describe('Timestamp format: "ms" (milliseconds) or "iso" (ISO 8601)'),deduplicateFields:h.boolean().optional().default(!0).describe("Remove redundant fields (title/fullTitle when same as content)"),resolveWikilinks:h.boolean().optional().default(!0).describe("Resolve UUID wikilinks in content to markdown links with page titles (e.g., [[uuid]] becomes [Page Title](uuid))")},CZ={format:"compact",filterInternalProps:!0,fields:[],expandRefs:!1,expandParent:!1,expandPage:!1,timestampFormat:"ms",deduplicateFields:!0,resolveWikilinks:!0},V2=[/^:plugin\.property\./,/^:logseq\.property\./,/^:block\//,/^:db\//,/^:logseq\.property\//],W2=new Set(["id","left","level","order","pathRefs","file"]),K2=["createdAt","updatedAt","scheduled","deadline"],H2=[{primary:"content",duplicates:["title","fullTitle"]}];function G2(Z){if(W2.has(Z))return!0;return V2.some(($)=>$.test(Z))}function w2(Z){let $={};for(let[J,Y]of Object.entries(Z)){if(J==="id")continue;$[J]=Y}return $}function U2(Z,$){if((Z==="page"||Z==="parent")&&"id"in $)return w2($);return UZ($)}function _2(Z){return Z.map(($)=>{if($&&typeof $==="object")return UZ($);return $})}function UZ(Z){if(!Z||typeof Z!=="object")return Z;let $={};for(let[J,Y]of Object.entries(Z)){if(G2(J))continue;if(Y&&typeof Y==="object"&&!Array.isArray(Y))$[J]=U2(J,Y);else if(Array.isArray(Y))$[J]=_2(Y);else $[J]=Y}return $}function F2(Z,$,J){let[Y,...X]=J.split(".");if(!Y||!(Y in Z))return;let V=Z[Y];if(!V||typeof V!=="object")return;if(!$[Y])$[Y]={};let W=xZ(V,[X.join(".")]);$[Y]={...$[Y],...W}}function xZ(Z,$){if(!Z||typeof Z!=="object")return Z;if(!$||$.length===0)return Z;let J={};for(let Y of $)if(Y.includes("."))F2(Z,J,Y);else if(Y in Z)J[Y]=Z[Y];return J}function j2(Z){return Z>Y2&&Z<X2}function Q2(Z){for(let $ of K2){if(!($ in Z))continue;if(typeof Z[$]!=="number")continue;let J=Z[$];if(j2(J))Z[$]=new Date(J).toISOString()}}function S2(Z,$){for(let[J,Y]of Object.entries(Z))if(Y&&typeof Y==="object"&&!Array.isArray(Y))Z[J]=GZ(Y,$);else if(Array.isArray(Y))Z[J]=Y.map((X)=>{if(X&&typeof X==="object")return GZ(X,$);return X})}function GZ(Z,$){if(!Z||typeof Z!=="object")return Z;if($==="ms")return Z;let J={...Z};return Q2(J),S2(J,$),J}function z2(Z){for(let{primary:$,duplicates:J}of H2){if(!($ in Z))continue;let Y=Z[$];for(let X of J)if(X in Z&&Z[X]===Y)delete Z[X]}delete Z.order}function C2(Z){for(let[$,J]of Object.entries(Z))if(J&&typeof J==="object"&&!Array.isArray(J))Z[$]=wZ(J);else if(Array.isArray(J))Z[$]=J.map((Y)=>{if(Y&&typeof Y==="object")return wZ(Y);return Y})}function wZ(Z){if(!Z||typeof Z!=="object")return Z;let $={...Z};return z2($),C2($),$}async function x2(Z,$){if(!(Z&&Array.isArray(Z))||Z.length===0)return[];return await Promise.all(Z.map(async(Y)=>{let X;if(typeof Y==="number")X=Y;else X=Y.id;try{let V=await $("logseq.Editor.getBlock",[X]);if(V?.uuid)return{id:X,uuid:V.uuid,content:(V.content||"").substring(0,$2),type:"block"}}catch{}try{let V=await $("logseq.Editor.getPage",[X]);if(V?.name)return{id:X,name:V.name,uuid:V.uuid,type:"page"}}catch{}return{id:X}}))}async function A2(Z,$){if(!Z)return;let J;if(typeof Z==="number")J=Z;else J=Z.id;try{let Y=await $("logseq.Editor.getBlock",[J]);if(Y)return{id:J,uuid:Y.uuid,content:(Y.content||"").substring(0,J2)}}catch{}return{id:J}}async function M2(Z,$){if(!Z)return;let J;if(typeof Z==="number")J=Z;else J=Z.id;try{let Y=await $("logseq.Editor.getPage",[J]);if(Y)return{id:J,name:Y.name||Y.originalName,uuid:Y.uuid}}catch{}return{id:J}}var I2=50,aZ=/\[\[([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\]\]/gi;function B2(Z){if(!Z||typeof Z!=="string")return[];let $=Z.matchAll(aZ),J=new Set;for(let Y of $)if(Y[1])J.add(Y[1].toLowerCase());return Array.from(J)}var ZZ=new Map;async function E2(Z,$){let J=Z.toLowerCase();if(ZZ.has(J))return ZZ.get(J)??null;try{let Y=await $("logseq.Editor.getPage",[Z]);if(Y?.name||Y?.originalName){let X=Y.originalName||Y.name;return ZZ.set(J,X),X}}catch{}try{let Y=await $("logseq.Editor.getBlock",[Z]);if(Y?.content){let X=Y.content,W=(X.split(` `)[0]??X).substring(0,I2);return ZZ.set(J,W),W}}catch{}return ZZ.set(J,null),null}async function D2(Z,$){if(!Z||typeof Z!=="string")return Z;let J=B2(Z);if(J.length===0)return Z;let Y=await Promise.all(J.map(async(V)=>({uuid:V,name:await E2(V,$)}))),X=new Map;for(let{uuid:V,name:W}of Y)if(W)X.set(V.toLowerCase(),W);return Z.replace(aZ,(V,W)=>{let H=X.get(W.toLowerCase());if(H)return`[${H}](${W})`;return V})}function O2(Z,$){let J=Z;if($.filterInternalProps)J=UZ(J);if($.deduplicateFields)J=wZ(J);return J}async function N2(Z,$,J){if($.expandRefs&&Z.refs)Z.refs=await x2(Z.refs,J);if($.expandParent&&Z.parent)Z.parent=await A2(Z.parent,J);if($.expandPage&&Z.page)Z.page=await M2(Z.page,J);if($.resolveWikilinks&&Z.content&&typeof Z.content==="string")Z.content=await D2(Z.content,J)}function q2(Z,$){let J=Z;if($.timestampFormat==="iso")J=GZ(J,"iso");if($.fields&&$.fields.length>0)J=xZ(J,$.fields);return J}async function L2(Z,$,J){if(Z.children&&Array.isArray(Z.children))Z.children=await Promise.all(Z.children.map((Y)=>c(Y,$,J)));if(Z.blocks&&Array.isArray(Z.blocks))Z.blocks=await Promise.all(Z.blocks.map((Y)=>c(Y,$,J)))}async function c(Z,$={},J){let Y={...CZ,...$};if(Array.isArray(Z))return await Promise.all(Z.map((W)=>c(W,$,J)));if(!Z||typeof Z!=="object")return Z;let X=O2({...Z},Y);if(J)await N2(X,Y,J);return X=q2(X,Y),await L2(X,$,J),X}function g(Z,$={}){let J={...CZ,...$};if(Array.isArray(Z))return Z.map((X)=>g(X,$));if(!Z||typeof Z!=="object")return Z;let Y={...Z};if(J.filterInternalProps)Y=UZ(Y);if(J.deduplicateFields)Y=wZ(Y);if(J.timestampFormat==="iso")Y=GZ(Y,"iso");if(J.fields&&J.fields.length>0)Y=xZ(Y,J.fields);if(Y.children&&Array.isArray(Y.children))Y.children=Y.children.map((X)=>g(X,$));if(Y.blocks&&Array.isArray(Y.blocks))Y.blocks=Y.blocks.map((X)=>g(X,$));return Y}function _Z(Z){let $=Z.resolveWikilinks!==!1;return Boolean(Z.expandRefs||Z.expandParent||Z.expandPage||$)}function tZ(Z,$={}){let J=$.format??CZ.format;return oZ(Z,J)}function B(Z){return{format:Z.format??"compact",filterInternalProps:Z.filterInternalProps??!0,fields:Z.fields,expandRefs:Z.expandRefs??!1,expandParent:Z.expandParent??!1,expandPage:Z.expandPage??!1,timestampFormat:Z.timestampFormat??"ms",deduplicateFields:Z.deduplicateFields??!0,resolveWikilinks:Z.resolveWikilinks??!0}}async function E(Z,$,J){if(_Z($))return await c(Z,$,J);return g(Z,$)}function S(Z,$){let J=$?.format??"compact",Y;if(typeof Z==="string")Y=Z;else if(J==="json")Y=JSON.stringify(Z,null,2);else Y=tZ(Z,$);return{isError:!1,content:[{type:"text",text:Y}]}}function D(Z){return{isError:!1,content:[{type:"text",text:Z}]}}function _(Z){return{isError:!0,content:[{type:"text",text:Z}]}}function L(Z){if(Z instanceof Error)return Z.message;return String(Z)}function F(Z){return{content:Z.content,isError:Z.isError}}function l(Z,$,J=0){if(J>=$){let{children:Y,...X}=Z;return X}if(Z.children&&Array.isArray(Z.children))return{...Z,children:Z.children.map((Y)=>l(Y,$,J+1))};return Z}function FZ(Z,$){if($===void 0)return Z;return Z.map((J)=>l(J,$))}function R(Z){if(Array.isArray(Z))return Z;if(Z)return[Z];return[]}function o(Z){return Z.map(($)=>{if(Array.isArray($)&&$.length===1){let J=$[0];if(J&&typeof J==="object"&&!Array.isArray(J))return J}return $})}function O(Z,$,J){if(!Array.isArray(Z))return[];let Y=0;if($&&$>0)Y=$;if(!J||J<=0)return Z.slice(Y);return Z.slice(Y,Y+J)}function sZ(Z){return Z.some(($)=>{if(Array.isArray($)&&$.length===1){let Y=$[0];return Y?.uuid||Y?.["block/uuid"]}let J=$;return J?.uuid||J?.["block/uuid"]})}async function jZ(Z,$){if(Z.length===0)return Z;return await Promise.all(Z.map(async(Y)=>{let X=Y,V=X.uuid??X["block/uuid"];if(!V)return Y;try{let W=await $("logseq.Editor.getBlock",[V,{includeChildren:!0}]);if(W)return W}catch{}return Y}))}var rZ=50,P2=/^\s*-\s+/;function AZ(Z,$=!0){if(!$)return Z;return Z.split(` `).map((J)=>J.replace(P2,"")).join(` `)}function Z0(Z,$=!0){return Z.map((J)=>{if(typeof J==="string")return{content:AZ(J,$)};if(J&&typeof J==="object"){let Y={...J};if(J.content)Y.content=AZ(J.content,$);if("children"in J&&Array.isArray(J.children)&&J.children.length>0)Y.children=Z0(J.children,$);return Y}return J})}async function v2(Z){let{uuid:$,includeChildren:J=!0,nestingDepth:Y}=Z;if(!$)return _("UUID is required for get operation");let X=await K("logseq.Editor.getBlock",[$,{includeChildren:J}]);if(!X)return _(`Block with UUID "${$}" not found`);let V=X;if(Y!==void 0&&J)V=l(X,Y);let W=B(Z),H=await E(V,W,K);return S(H,W)}async function T2(Z){let{includeChildren:$=!0,nestingDepth:J}=Z,Y=await K("logseq.Editor.getCurrentBlock",[]);if(!Y)return _("No block is currently focused");let X=Y,V=Y;if($&&V.uuid){let G=await K("logseq.Editor.getBlock",[V.uuid,{includeChildren:!0}]);if(G){if(X=G,J!==void 0)X=l(X,J)}}let W=B(Z),H=await E(X,W,K);return S(H,W)}async function h2(Z){let $=await K("logseq.Editor.getSelectedBlocks",[]);if(!($&&Array.isArray($))||$.length===0)return _("No blocks are currently selected");let J=B(Z),Y=await E($,J,K);return S(Y,J)}function R2(Z,$,J){let Y=Z.filter((X)=>{let V=X.order;if(J==="previous")return V<$;return V>$});return Y.sort((X,V)=>{let W=X.order,H=V.order;if(J==="previous")return H.localeCompare(W);return W.localeCompare(H)}),Y}async function y2(Z,$){return Promise.all(Z.map(async(J)=>{let Y=await K("logseq.Editor.getBlock",[J.uuid,{includeChildren:!0}]);if(!Y)return J;let X=Y;if($!==void 0)X=l(X,$);return X}))}async function f2(Z){let{uuid:$,direction:J="next",includeChildren:Y=!0,nestingDepth:X,limit:V=1,offset:W=0}=Z;if(!$)return _("UUID is required for get-siblings operation");let H=await K("logseq.Editor.getBlock",[$]);if(!H)return _(`Block not found: ${$}`);let G=H,U=G.parent,j=G.order;if(!U?.id||!j)return _("Block has no parent or order information");let x=`[:find (pull ?b [*]) :where [?b :block/parent ${U.id}]]`,z=await K("logseq.DB.datascriptQuery",[x]);if(!z||!Array.isArray(z))return _(`No siblings found for block "${$}"`);let M=R2(z.map((f)=>f[0]),j,J),q=V;if(V===0)q=void 0;if(M=O(M,W,q),M.length===0)return _(`No ${J} sibling found for block "${$}" (after applying offset/limit)`);if(Y)M=await y2(M,X);let y=M;if(M.length===1&&q===1)y=M[0];let T=B(Z);return S(await E(y,T,K),T)}async function b2(Z,$,J,Y){let X=Z0($,Y);return await K("logseq.Editor.insertBatchBlock",[Z,X,{sibling:J==="before"||J==="after",before:J==="before"}])}async function k2(Z,$,J,Y){let X=AZ($,Y);if(J==="first")return await K("logseq.Editor.insertBlock",[Z,X,{isPageBlock:!0}]);return await K("logseq.Editor.insertBlock",[Z,X,{before:J==="before",sibling:J==="before"||J==="after",isPageBlock:J==="child"}])}async function m2(Z){let{target:$,content:J,blocks:Y,position:X="child",stripLeadingHyphen:V=!0}=Z;if(!$)return _("Target (page name or block UUID) is required for create operation");if(!(J||Y))return _("Content or blocks array is required for create operation");let W;if(Y)W=await b2($,Y,X,V);else if(J)W=await k2($,J,X,V);if(!W)return _("Failed to create block");let H=B(Z),G=await E(W,H,K);return S(G,H)}async function d2(Z){let{uuid:$,content:J,properties:Y}=Z;if(!$)return _("UUID is required for update operation");if(!(J||Y))return _("Content or properties is required for update operation");try{if(J)await K("logseq.Editor.updateBlock",[$,J]);if(Y&&Object.keys(Y).length>0)for(let[X,V]of Object.entries(Y))await K("logseq.Editor.upsertBlockProperty",[$,X,V]);try{let X=await K("logseq.Editor.getBlock",[$,{includeChildren:!0}]);if(X){let V=B(Z),W=await E(X,V,K);return S(W,V)}}catch{}return D(`Block "${$}" updated successfully`)}catch(X){return _(`Failed to update block "${$}": ${X}`)}}async function u2(Z){let{uuid:$,target:J,position:Y="child"}=Z;if(!$)return _("UUID is required for move operation");if(!J)return _("Target is required for move operation");let X;if(Y==="first")X="before";else if(Y==="last")X="after";else X=Y;let V={before:X==="before",children:X==="child"};try{return await K("logseq.Editor.moveBlock",[$,J,V]),D(`Block "${$}" moved successfully`)}catch(W){return _(`Failed to move block "${$}" to "${J}": ${L(W)}`)}}async function g2(Z){let{uuid:$,uuids:J}=Z;if(!($||J))return _("UUID or uuids array is required for remove operation");if(J&&Array.isArray(J))return await c2(J);try{return await K("logseq.Editor.removeBlock",[$]),D(`Block "${$}" removed successfully`)}catch(Y){return _(`Failed to remove block "${$}": ${Y}`)}}async function c2(Z){let $=await Promise.all(Z.map(async(X)=>{try{return await K("logseq.Editor.removeBlock",[X]),{uuid:X,success:!0}}catch(V){return{uuid:X,success:!1,error:V}}})),J=$.filter((X)=>X.success).length,Y=$.filter((X)=>!X.success);if(Y.length===0)return D(`Successfully removed ${J} blocks`);return _(`Removed ${J} blocks, failed to remove ${Y.length}: ${Y.map((X)=>X.uuid).join(", ")}`)}function $0(Z){if(typeof Z!=="string")return;return Z.trim()||void 0}function eZ(Z,$){for(let J of $){let Y=$0(Z[J]);if(Y)return Y}return}function p2(Z){if(!Z||typeof Z!=="object")return;let $=Z,J=$.page,Y=$0(J);if(Y)return Y;if(J&&typeof J==="object")return eZ(J,["originalName","name","id"]);return eZ($,["pageName","page/name"])}async function i2(Z){let{uuid:$,collapsed:J}=Z;if(!$)return _("UUID is required for toggle-collapse operation");try{return await K("logseq.Editor.setBlockCollapsed",[$,J??"toggle"]),D(`Block "${$}" collapse state toggled successfully`)}catch(Y){return _(`Failed to toggle collapse for block "${$}": ${L(Y)}`)}}async function n2(Z){let{uuid:$}=Z;if(!$)return _("UUID is required for select operation");try{return await K("logseq.Editor.selectBlock",[$]),D(`Block "${$}" selected successfully`)}catch(J){return _(`Failed to select block "${$}": ${L(J)}`)}}async function l2(Z){let{uuid:$,pos:J}=Z;if(!$)return _("UUID is required for edit operation");try{let Y=[$];if(J!==void 0)Y.push({pos:J});return await K("logseq.Editor.editBlock",Y),D(`Block "${$}" is now in edit mode`)}catch(Y){return _(`Failed to edit block "${$}": ${L(Y)}`)}}async function o2(Z){let{uuid:$}=Z;if(!$)return _("UUID is required for open-sidebar operation");try{return await K("logseq.Editor.openInRightSidebar",[$]),D(`Block "${$}" opened in right sidebar`)}catch(J){return _(`Failed to open block "${$}" in sidebar: ${L(J)}`)}}async function a2(Z){let{uuid:$,pageName:J}=Z;if(!$)return _("UUID is required for scroll-to operation");try{let Y=J?.trim();if(!Y){let V=await K("logseq.Editor.getBlock",[$]);Y=p2(V)}if(!Y)return _(`Could not determine the page for block "${$}"; provide pageName explicitly`);await K("logseq.App.pushState",["page",{name:Y},{anchor:`block-content-${$}`}]);let X=`Scrolled to block "${$}"`;return X+=` in page "${Y}"`,D(X)}catch(Y){return _(`Failed to scroll to block "${$}": ${L(Y)}`)}}async function t2(){try{return await K("logseq.Editor.clearSelectedBlocks",[]),D("Selected blocks cleared successfully")}catch(Z){return _(`Failed to clear selected blocks: ${L(Z)}`)}}async function s2(){try{let Z=await K("logseq.Editor.checkEditing",[]);if(Z)return D(`Currently editing block: ${JSON.stringify(Z)}`);return D("Not currently editing any block")}catch(Z){return _(`Failed to check editing state: ${L(Z)}`)}}async function r2(Z){let{text:$}=Z;if(!$)return _("Text is required for insert-at-cursor operation");try{await K("logseq.Editor.insertAtEditingCursor",[$]);let J=$.substring(0,rZ);if($.length>rZ)J=`${J}...`;return D(`Text inserted at cursor: "${J}"`)}catch(J){return _(`Failed to insert text at cursor: ${L(J)}`)}}async function e2(){try{return await K("logseq.Editor.exitEditingMode",[]),D("Exited editing mode successfully")}catch(Z){return _(`Failed to exit editing mode: ${L(Z)}`)}}async function Z3(Z){let{uuid:$,propertyKey:J}=Z;if(!$)return _("UUID is required for get-property operation");if(!J)return _("Property key is required for get-property operation");let Y=await K("logseq.Editor.getBlockProperty",[$,J]),X=B(Z);return S(Y,X)}async function $3(Z){let{uuid:$}=Z;if(!$)return _("UUID is required for get-properties operation");let J=await K("logseq.Editor.getBlockProperties",[$]),Y=B(Z),X=await E(J,Y,K);return S(X,Y)}async function J3(Z){let{uuid:$,propertyKey:J,propertyValue:Y}=Z;if(!$)return _("UUID is required for set-property operation");if(!J)return _("Property key is required for set-property operation");try{return await K("logseq.Editor.upsertBlockProperty",[$,J,Y]),D(`Property "${J}" set successfully for block "${$}"`)}catch(X){return _(`Failed to set property "${J}" for block "${$}": ${X}`)}}async function Y3(Z){let{uuid:$,propertyKey:J}=Z;if(!$)return _("UUID is required for remove-property operation");if(!J)return _("Property key is required for remove-property operation");try{return await K("logseq.Editor.removeBlockProperty",[$,J]),D(`Property "${J}" removed successfully from block "${$}"`)}catch(Y){return _(`Failed to remove property "${J}" from block "${$}": ${L(Y)}`)}}async function X3(Z){let{uuid:$,tagId:J}=Z;if(!$)return _("UUID is required for add-tag operation");if(!J)return _("Tag ID/name is required for add-tag operation");try{return await K("logseq.Editor.addBlockTag",[$,J]),D(`Tag "${J}" added successfully to block "${$}"`)}catch(Y){return _(`Failed to add tag "${J}" to block "${$}": ${L(Y)}`)}}async function V3(Z){let{uuid:$,tagId:J}=Z;if(!$)return _("UUID is required for remove-tag operation");if(!J)return _("Tag ID/name is required for remove-tag operation");try{return await K("logseq.Editor.removeBlockTag",[$,J]),D(`Tag "${J}" removed successfully from block "${$}"`)}catch(Y){return _(`Failed to remove tag "${J}" from block "${$}": ${L(Y)}`)}}async function W3(Z){switch(Z.operation){case"get":return await v2(Z);case"get-current":return await T2(Z);case"get-selected":return await h2(Z);case"get-siblings":return await f2(Z);default:return null}}async function K3(Z){switch(Z.operation){case"create":return await m2(Z);case"update":return await d2(Z);case"move":return await u2(Z);case"remove":return await g2(Z);default:return null}}async function H3(Z){switch(Z.operation){case"toggle-collapse":return await i2(Z);case"select":return await n2(Z);case"edit":return await l2(Z);case"open-sidebar":return await o2(Z);case"scroll-to":return await a2(Z);case"clear-selected":return await t2();case"check-editing":return await s2();case"insert-at-cursor":return await r2(Z);case"exit-editing":return await e2();default:return null}}async function G3(Z){switch(Z.operation){case"get-property":return await Z3(Z);case"get-properties":return await $3(Z);case"set-property":return await J3(Z);case"remove-property":return await Y3(Z);default:return null}}async function w3(Z){switch(Z.operation){case"add-tag":return await X3(Z);case"remove-tag":return await V3(Z);default:return null}}var U3=async(Z)=>{let $=Z.operation;try{let J=await W3(Z);if(J)return J;let Y=await K3(Z);if(Y)return Y;let X=await H3(Z);if(X)return X;let V=await G3(Z);if(V)return V;let W=await w3(Z);if(W)return W;return _(`Unknown operation: ${$}`)}catch(J){return _(`Error in block operation (${$}): ${J}`)}},_3=["get","get-current","get-selected","get-siblings","create","update","move","remove","toggle-collapse","select","edit","open-sidebar","scroll-to","get-property","get-properties","set-property","remove-property","add-tag","remove-tag","clear-selected","check-editing","insert-at-cursor","exit-editing"],F3=["previous","next"],j3=["child","before","after","first","last"],Q3={operation:A.enum(_3).describe("Operation to perform on blocks"),uuid:A.string().optional().describe("UUID of the block (required for most operations)"),includeChildren:A.boolean().optional().default(!0).describe("Include child blocks in results (default: true)"),nestingDepth:A.number().int().nonnegative().optional().describe("Maximum nesting depth for children (0 = no children, 1 = direct children only, 2 = children and grandchildren, etc.)"),direction:A.enum(F3).optional().default("next").describe("Direction for sibling navigation (default: next)"),limit:A.number().int().nonnegative().optional().default(1).describe("Number of siblings to return: 1 (default) = single sibling, 0 = all siblings, N = up to N siblings"),offset:A.number().int().nonnegative().optional().default(0).describe("Number of siblings to skip before returning results (useful for pagination)"),content:A.string().min(1).optional().describe("Block content for create/update operations"),properties:A.record(A.string(),A.unknown()).optional().describe("Block properties as key-value pairs"),target:A.string().optional().describe("Target block UUID or page name for create/move operations"),position:A.enum(j3).optional().default("child").describe("Position for create/move operations (default: child)"),stripLeadingHyphen:A.boolean().optional().default(!0).describe("Remove leading hyphens from content (defau