@kitelev/exocortex-cli 16.96.9 → 16.96.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +4 -4
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
// @kitelev/exocortex-cli v16.96.
|
|
2
|
+
// @kitelev/exocortex-cli v16.96.11
|
|
3
3
|
// CLI tool for Exocortex knowledge management system - SPARQL queries, task management, and more
|
|
4
4
|
// License: MIT
|
|
5
5
|
|
|
@@ -67,7 +67,7 @@ ${r}}`}default:throw new Ll(`Unsupported operation type for SPARQL generation: $
|
|
|
67
67
|
`)}generateTriple(e){let t=this.generateElement(e.subject),r=this.generatePredicate(e.predicate),i=this.generateElement(e.object);return`${t} ${r} ${i}`}generatePredicate(e){return"pathType"in e?this.generatePropertyPath(e):this.generateElement(e)}generatePropertyPath(e){let t=e.items.map(r=>"pathType"in r?`(${this.generatePropertyPath(r)})`:`<${r.value}>`);switch(e.pathType){case"/":return t.join("/");case"|":return t.join("|");case"^":return`^${t[0]}`;case"+":return`${t[0]}+`;case"*":return`${t[0]}*`;case"?":return`${t[0]}?`}}generateElement(e){switch(e.type){case"variable":return`?${e.value}`;case"iri":return`<${e.value}>`;case"literal":{let r=`"${e.value.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t")}"`;return e.language?r+=`@${e.language}`:e.datatype&&(r+=`^^<${e.datatype}>`),r}case"blank":return`_:${e.value}`;default:throw new Ll(`Unknown element type: ${e.type}`)}}generateValues(e,t){let r=" ".repeat(t);if(e.variables.length===0||e.bindings.length===0)return"";if(e.variables.length===1){let o=e.variables[0],c=e.bindings.map(l=>{let u=l[o];return u?this.generateValuesTerm(u):"UNDEF"}).join(" ");return`${r}VALUES ?${o} { ${c} }`}let i=e.variables.map(o=>`?${o}`).join(" "),s=e.bindings.map(o=>`(${e.variables.map(l=>{let u=o[l];return u?this.generateValuesTerm(u):"UNDEF"}).join(" ")})`);return`${r}VALUES (${i}) {
|
|
68
68
|
${s.map(o=>`${r} ${o}`).join(`
|
|
69
69
|
`)}
|
|
70
|
-
${r}}`}generateValuesTerm(e){if(e.type==="iri")return`<${e.value}>`;let r=`"${e.value.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`;return e.language?r+=`@${e.language}`:e.datatype&&(r+=`^^<${e.datatype}>`),r}generateExpression(e){switch(e.type){case"variable":return`?${e.name}`;case"literal":return typeof e.value=="string"?`"${e.value.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`:typeof e.value=="boolean"?e.value?"true":"false":String(e.value);case"comparison":return`(${this.generateExpression(e.left)} ${e.operator} ${this.generateExpression(e.right)})`;case"logical":return e.operator==="!"?`!(${this.generateExpression(e.operands[0])})`:`(${e.operands.map(t=>this.generateExpression(t)).join(` ${e.operator} `)})`;case"arithmetic":return`(${this.generateExpression(e.left)} ${e.operator} ${this.generateExpression(e.right)})`;case"function":return`${e.function.toUpperCase()}(${e.args.map(t=>this.generateExpression(t)).join(", ")})`;case"functionCall":return`${(typeof e.function=="string"?e.function:e.function.value).toUpperCase()}(${e.args.map(r=>this.generateExpression(r)).join(", ")})`;case"exists":return`${e.negated?"NOT EXISTS":"EXISTS"} { ${this.generateWhereClause(e.pattern,0)} }`;case"in":{let t=this.generateExpression(e.expression),r=e.list.map(i=>this.generateExpression(i)).join(", ");return e.negated?`${t} NOT IN (${r})`:`${t} IN (${r})`}default:throw new Ll(`Unknown expression type: ${e.type}`)}}collectVariablesFromOperation(e,t){switch(e.type){case"bgp":for(let r of e.triples)this.collectVariablesFromTriple(r,t);break;case"filter":this.collectVariablesFromOperation(e.input,t),this.collectVariablesFromExpression(e.expression,t);break;case"join":case"leftjoin":case"union":case"minus":this.collectVariablesFromOperation(e.left,t),this.collectVariablesFromOperation(e.right,t);break;case"values":for(let r of e.variables)t.add(r);break;case"project":for(let r of e.variables)t.add(r);this.collectVariablesFromOperation(e.input,t);break;case"extend":t.add(e.variable),this.collectVariablesFromOperation(e.input,t);break;case"orderby":case"slice":case"distinct":case"reduced":this.collectVariablesFromOperation(e.input,t);break;case"group":for(let r of e.variables)t.add(r);for(let r of e.aggregates)t.add(r.variable);this.collectVariablesFromOperation(e.input,t);break;case"subquery":this.collectVariablesFromOperation(e.query,t);break}}collectVariablesFromTriple(e,t){e.subject.type==="variable"&&t.add(e.subject.value),"type"in e.predicate&&e.predicate.type==="variable"&&t.add(e.predicate.value),e.object.type==="variable"&&t.add(e.object.value)}collectVariablesFromExpression(e,t){switch(e.type){case"variable":t.add(e.name);break;case"comparison":case"arithmetic":this.collectVariablesFromExpression(e.left,t),this.collectVariablesFromExpression(e.right,t);break;case"logical":for(let r of e.operands)this.collectVariablesFromExpression(r,t);break;case"function":case"functionCall":for(let r of e.args)this.collectVariablesFromExpression(r,t);break;case"exists":this.collectVariablesFromOperation(e.pattern,t);break;case"in":this.collectVariablesFromExpression(e.expression,t);for(let r of e.list)this.collectVariablesFromExpression(r,t);break}}};Nl.SPARQLGenerator=Iw});var Ml=w(Nn=>{"use strict";var g7=Nn&&Nn.__createBinding||(Object.create?(function(n,e,t,r){r===void 0&&(r=t);var i=Object.getOwnPropertyDescriptor(e,t);(!i||("get"in i?!e.__esModule:i.writable||i.configurable))&&(i={enumerable:!0,get:a(function(){return e[t]},"get")}),Object.defineProperty(n,r,i)}):(function(n,e,t,r){r===void 0&&(r=t),n[r]=e[t]})),y7=Nn&&Nn.__setModuleDefault||(Object.create?(function(n,e){Object.defineProperty(n,"default",{enumerable:!0,value:e})}):function(n,e){n.default=e}),HR=Nn&&Nn.__importStar||(function(){var n=a(function(e){return n=Object.getOwnPropertyNames||function(t){var r=[];for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(r[r.length]=i);return r},n(e)},"ownKeys");return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r=n(e),i=0;i<r.length;i++)r[i]!=="default"&&g7(t,e,r[i]);return y7(t,e),t}})();Object.defineProperty(Nn,"__esModule",{value:!0});Nn.QueryExecutor=Nn.ExoQLQueryExecutor=Nn.QueryExecutorError=void 0;var b7=zS(),_7=bm(),S7=fw(),w7=hw(),v7=kR(),E7=jR(),T7=BR(),A7=Ew(),I7=GR(),x7=WR(),R7=zR(),P7=Oe(),C7=qe(),O7=fm(),Vr="http://www.w3.org/2001/XMLSchema#",D7=new Set([`${Vr}integer`,`${Vr}decimal`,`${Vr}float`,`${Vr}double`,`${Vr}nonPositiveInteger`,`${Vr}negativeInteger`,`${Vr}long`,`${Vr}int`,`${Vr}short`,`${Vr}byte`,`${Vr}nonNegativeInteger`,`${Vr}unsignedLong`,`${Vr}unsignedInt`,`${Vr}unsignedShort`,`${Vr}unsignedByte`,`${Vr}positiveInteger`]),kl=class extends Error{static{a(this,"QueryExecutorError")}constructor(e,t){super(e,t?{cause:t}:void 0),this.name="QueryExecutorError"}};Nn.QueryExecutorError=kl;var xm=class{static{a(this,"ExoQLQueryExecutor")}constructor(e,t={}){this.tripleStore=e,this.bgpExecutor=new b7.BGPExecutor(e),this.filterExecutor=new _7.FilterExecutor,this.optionalExecutor=new S7.OptionalExecutor,this.unionExecutor=new w7.UnionExecutor,this.minusExecutor=new v7.MinusExecutor,this.valuesExecutor=new E7.ValuesExecutor,this.aggregateExecutor=new T7.AggregateExecutor,this.constructExecutor=new A7.ConstructExecutor,this.serviceExecutor=new I7.ServiceExecutor(t.serviceConfig),this.graphExecutor=new x7.GraphExecutor(e),this.sparqlGenerator=new R7.SPARQLGenerator,this.filterExecutor.setExistsEvaluator(async(r,i)=>this.evaluateExistsPattern(r,i)),this.filterExecutor.setTripleStore(e)}async evaluateExistsPattern(e,t){for await(let r of this.execute(e))if(t.merge(r)!==null)return!0;return!1}async executeAll(e){let t=[];for await(let r of this.execute(e))t.push(r);return t}async*execute(e){switch(e.type){case"bgp":yield*this.executeBGP(e);break;case"filter":yield*this.executeFilter(e);break;case"join":yield*this.executeJoin(e);break;case"leftjoin":yield*this.executeLeftJoin(e);break;case"union":yield*this.executeUnion(e);break;case"minus":yield*this.executeMinus(e);break;case"values":yield*this.executeValues(e);break;case"project":yield*this.executeProject(e);break;case"orderby":yield*this.executeOrderBy(e);break;case"slice":yield*this.executeSlice(e);break;case"distinct":yield*this.executeDistinct(e);break;case"reduced":yield*this.executeReduced(e);break;case"group":yield*this.executeGroup(e);break;case"extend":yield*this.executeExtend(e);break;case"subquery":yield*this.executeSubquery(e);break;case"lateraljoin":yield*this.executeLateralJoin(e);break;case"service":yield*this.executeService(e);break;case"graph":yield*this.executeGraph(e);break;default:throw new kl(`Unknown operation type: ${e.type}`)}}async*executeBGP(e){yield*this.bgpExecutor.execute(e)}async*executeFilter(e){let t=this.execute(e.input);yield*this.filterExecutor.execute(e,t)}async*executeJoin(e){let t=[];for await(let o of this.execute(e.left))t.push(o);if(t.length===0)return;let r=new Set;for(let o of t)for(let c of o.variables())r.add(c);let i=this.collectOperationVariables(e.right);if([...r].some(o=>i.has(o)))for(let o of t){let c=this.substituteVariables(e.right,o);for await(let l of this.execute(c)){let u=o.merge(l);u!==null&&(yield u)}}else{let o=[];for await(let c of this.execute(e.right))o.push(c);for(let c of t)for(let l of o){let u=c.merge(l);u!==null&&(yield u)}}}async*executeLeftJoin(e){let t=[];for await(let o of this.execute(e.left))t.push(o);let r=[];for await(let o of this.execute(e.right))r.push(o);async function*i(){for(let o of t)yield o}a(i,"leftGen");async function*s(){for(let o of r)yield o}a(s,"rightGen"),yield*this.optionalExecutor.execute(i(),s())}async*executeUnion(e){let t=[];for await(let o of this.execute(e.left))t.push(o);let r=[];for await(let o of this.execute(e.right))r.push(o);async function*i(){for(let o of t)yield o}a(i,"leftGen");async function*s(){for(let o of r)yield o}a(s,"rightGen"),yield*this.unionExecutor.execute(i(),s())}async*executeMinus(e){let t=[];for await(let o of this.execute(e.left))t.push(o);let r=[];for await(let o of this.execute(e.right))r.push(o);async function*i(){for(let o of t)yield o}a(i,"leftGen");async function*s(){for(let o of r)yield o}a(s,"rightGen"),yield*this.minusExecutor.execute(i(),s())}async*executeValues(e){yield*this.valuesExecutor.execute(e)}async*executeProject(e){let{SolutionMapping:t}=await Promise.resolve().then(()=>HR(bs())),r=new Set(e.variables);for await(let i of this.execute(e.input)){let s=new t;for(let o of i.variables())if(r.has(o)){let c=i.get(o);c!==void 0&&s.set(o,c)}yield s}}async*executeOrderBy(e){let t=[];for await(let r of this.execute(e.input))t.push(r);t.sort((r,i)=>{for(let s of e.comparators){let o=this.getExpressionValue(s.expression,r),c=this.getExpressionValue(s.expression,i),l=0;if(o===void 0&&c===void 0?l=0:o===void 0?l=1:c===void 0?l=-1:typeof o=="number"&&typeof c=="number"?l=o-c:l=String(o).localeCompare(String(c)),s.descending&&(l=-l),l!==0)return l}return 0});for(let r of t)yield r}async*executeSlice(e){let t=0,r=e.offset??0,i=e.limit;for await(let s of this.execute(e.input)){if(t>=r){if(i!==void 0&&t-r>=i)break;yield s}t++}}async*executeDistinct(e){let t=new Set;for await(let r of this.execute(e.input)){let i=this.getSolutionKey(r);t.has(i)||(t.add(i),yield r)}}async*executeReduced(e){let t=new Set;for await(let r of this.execute(e.input)){let i=this.getSolutionKey(r);t.has(i)||(t.add(i),yield r)}}async*executeGroup(e){let t=[];for await(let i of this.execute(e.input))t.push(i);let r=this.aggregateExecutor.execute(e,t);if(e.having&&e.having.length>0)for(let i of r)e.having.every(o=>this.filterExecutor.evaluateExpression(o,i)===!0)&&(yield i);else for(let i of r)yield i}async*executeExtend(e){let t=e.expression.type!=="aggregate"&&this.filterExecutor.expressionContainsExists(e.expression);for await(let r of this.execute(e.input)){let i=r.clone(),s=t?await this.evaluateExtendExpressionAsync(e.expression,r):this.evaluateExtendExpression(e.expression,r);s!==void 0&&i.set(e.variable,s),yield i}}async*executeSubquery(e){yield*this.execute(e.query)}async*executeLateralJoin(e){let t=[];for await(let r of this.execute(e.left))t.push(r);for(let r of t){let i=this.substituteVariables(e.right,r);for await(let s of this.execute(i)){let o=r.merge(s);o!==null&&(yield o)}}}substituteVariables(e,t){let r=JSON.parse(JSON.stringify(e));return this.substituteInOperation(r,t)}substituteInOperation(e,t){if(!e||typeof e!="object")return e;let r=e;return e.type==="bgp"&&e.triples?(e.triples=e.triples.map(i=>this.substituteInTriple(i,t)),e):(r.input&&(r.input=this.substituteInOperation(r.input,t)),r.left&&(r.left=this.substituteInOperation(r.left,t)),r.right&&(r.right=this.substituteInOperation(r.right,t)),r.pattern&&(r.pattern=this.substituteInOperation(r.pattern,t)),r.query&&(r.query=this.substituteInOperation(r.query,t)),r.where&&(r.where=this.substituteInOperation(r.where,t)),r.expression&&this.substituteInExpression(r.expression,t),e)}substituteInExpression(e,t){if(!(!e||typeof e!="object")){if(e.type==="exists"&&e.pattern&&(e.pattern=this.substituteInOperation(e.pattern,t)),e.left&&this.substituteInExpression(e.left,t),e.right&&this.substituteInExpression(e.right,t),e.operands)for(let r of e.operands)this.substituteInExpression(r,t);if(e.args)for(let r of e.args)this.substituteInExpression(r,t);if(e.expression&&this.substituteInExpression(e.expression,t),e.list)for(let r of e.list)this.substituteInExpression(r,t)}}substituteInTriple(e,t){return{subject:this.substituteInTripleElement(e.subject,t),predicate:e.predicate,object:this.substituteInTripleElement(e.object,t)}}substituteInTripleElement(e,t){if(e&&e.type==="variable"){let r=t.get(e.value);if(r!=null){let i=r;if(r instanceof P7.IRI||i.termType==="NamedNode")return{type:"iri",value:r.value};if(i.termType==="Literal"||typeof i.value=="string")return{type:"literal",value:i.value,datatype:i.datatype?.value??i._datatype?.value,language:i.language??i._language}}}return e}async*executeService(e){yield*this.serviceExecutor.execute(e,t=>this.sparqlGenerator.generateSelect(t))}async*executeGraph(e){let t=async function*(r,i){let s=this.currentGraphContext;this.currentGraphContext=i;try{r.type==="bgp"&&i&&this.tripleStore.matchInGraph?yield*this.executeBGPInGraph(r,i):yield*this.execute(r)}finally{this.currentGraphContext=s}}.bind(this);yield*this.graphExecutor.execute(e,t)}async*executeBGPInGraph(e,t){if(e.triples.length===0){let{SolutionMapping:r}=await Promise.resolve().then(()=>HR(bs()));yield new r;return}yield*this.bgpExecutor.executeInGraph(e,t)}evaluateExtendExpression(e,t){if(e.type!=="aggregate")try{return this.filterExecutor.evaluateExpression(e,t)}catch{return}}async evaluateExtendExpressionAsync(e,t){if(e.type!=="aggregate")try{return await this.filterExecutor.evaluateExpressionAsync(e,t)}catch{return}}getExpressionValue(e,t){if(e.type==="variable"){let r=t.get(e.name);if(!r)return;if(r instanceof C7.Literal){let i=r.datatype?.value;if(i===`${Vr}dayTimeDuration`)try{return O7.DateTimeFunctions.parseDayTimeDuration(r.value)}catch{return r.value}if(i&&D7.has(i)){let s=parseFloat(r.value);if(!Number.isNaN(s))return s}return r.value}return r.value??r.id??String(r)}if(e.type==="literal")return e.value}collectOperationVariables(e){let t=new Set;return this.collectVarsFromOperation(e,t),t}collectVarsFromOperation(e,t){if(!e||typeof e!="object")return;let r=e;if(r.type==="bgp"&&r.triples)for(let i of r.triples)this.collectVarsFromElement(i.subject,t),i.predicate?.type!=="path"&&this.collectVarsFromElement(i.predicate,t),this.collectVarsFromElement(i.object,t);if(r.type==="values"&&r.variables)for(let i of r.variables)t.add(i);r.expression&&this.collectVarsFromExpressionTree(r.expression,t),r.type==="extend"&&r.variable&&t.add(r.variable),r.input&&this.collectVarsFromOperation(r.input,t),r.left&&this.collectVarsFromOperation(r.left,t),r.right&&this.collectVarsFromOperation(r.right,t),r.pattern&&this.collectVarsFromOperation(r.pattern,t),r.query&&this.collectVarsFromOperation(r.query,t),r.where&&this.collectVarsFromOperation(r.where,t)}collectVarsFromElement(e,t){if(!e||typeof e!="object")return;let r=e;r.type==="variable"&&t.add(r.value),r.type==="quoted"&&(this.collectVarsFromElement(r.subject,t),this.collectVarsFromElement(r.predicate,t),this.collectVarsFromElement(r.object,t))}collectVarsFromExpressionTree(e,t){if(!e||typeof e!="object")return;let r=e;if(r.type==="variable"&&r.name&&t.add(r.name),r.type==="exists"&&r.pattern&&this.collectVarsFromOperation(r.pattern,t),r.left&&this.collectVarsFromExpressionTree(r.left,t),r.right&&this.collectVarsFromExpressionTree(r.right,t),r.operands)for(let i of r.operands)this.collectVarsFromExpressionTree(i,t);if(r.args)for(let i of r.args)this.collectVarsFromExpressionTree(i,t);if(r.expression&&this.collectVarsFromExpressionTree(r.expression,t),r.list)for(let i of r.list)this.collectVarsFromExpressionTree(i,t)}getSolutionKey(e){let t=e.toJSON();return Object.keys(t).sort().map(i=>`${i}=${t[i]}`).join("|")}isConstructQuery(e){return e.type==="construct"}async executeConstruct(e){if(e.type!=="construct")throw new kl("executeConstruct requires a CONSTRUCT operation");let t=await this.executeAll(e.where);return this.constructExecutor.execute(e.template,t)}isAskQuery(e){return e.type==="ask"}async executeAsk(e){if(e.type!=="ask")throw new kl("executeAsk requires an ASK operation");for await(let t of this.execute(e.where))return!0;return!1}};Nn.ExoQLQueryExecutor=xm;Nn.QueryExecutor=xm});var tP=w(so=>{"use strict";var F7=so&&so.__decorate||function(n,e,t,r){var i=arguments.length,s=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,o;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(o=n[c])&&(s=(i<3?o(s):i>3?o(e,t,s):o(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s},L7=so&&so.__metadata||function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},xw;Object.defineProperty(so,"__esModule",{value:!0});so.CommandResolver=void 0;var N7=je(),k7=rl(),Zt=Oe(),Gt=qe(),V=Jt(),KR=Vo(),QR=pf(),M7=il(),j7=Rp(),jl=Bb(),Rm=Vx(),$7=pl(),U7=gl(),B7=Ml(),Gf=10,Pm="exo__Asset",V7=Gf+1,XR="08cec529-90eb-4d43-88de-ceecccea12b0",G7=V.Namespace.EXOCMD.term("SubstitutionToken").value,YR=new Set(["today","todayStart","targetFolder","target","randomUUIDv4","nowTimestamp","nowDate","nowYear","nowMonth","userInputLabel","userInput","targetProperty","labelAsArray","groundingTargetClass"]);function q7(n,e){return`__SUBSTITUTE__${n}__${e}__`}a(q7,"buildSubstitutionMarker");function W7(n,e,t){let r=(0,M7.utf8ToBase64)(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"");return`__SUBSTITUTE_P__${n}__${e}__${r}__`}a(W7,"buildParameterisedMarker");var JR="3f28af98-c031-4718-8ba2-44ad0b012c52",z7=V.Namespace.EXOCMD.term("TokenInvocation").value,ZR="29e2c8f8-2d27-4e58-b467-2e85d46f8122",eP="universal-default-template",H7=new Set(["today","todayStart","nowTimestamp","nowDate","nowYear","nowMonth"]),Rw=xw=class{static{a(this,"CommandResolver")}clearUniversalCache(){this._universalCacheReady=!1,this._universalCacheValue=null,(0,Rm.clearUniversalDefault)()}constructor(e,t=k7.NullLogger){this.tripleStore=e,this.logger=t,this.cache=new Map,this.multiCache=new Map,this._ancestorDepthCache=new Map,this._legacyPropertyDefaultsWarnedGroundings=new Set,this._universalCacheReady=!1,this._universalCacheValue=null}async resolveForAssetMulti(e,t,r){if(t.length===0)return[];let i=[...t].sort().join(","),s=`${e}::${i}::${r??""}`,o=this.multiCache.get(s);if(o)return o;let c=await this.expandClassHierarchy(t),l=new Map;for(let[h,p]of c){let y=await this.resolveForAsset(e,h,r);for(let g of y){let v=this.getBindingPriority(g.binding)===2?p:0,_=l.get(g.binding.id);(!_||v<_.depth)&&l.set(g.binding.id,{rc:g,depth:v})}}let u=new Set;for(let{rc:h}of l.values())if(h.binding.overrides)for(let p of h.binding.overrides)u.add(p);let f=Array.from(l.entries()).filter(([h])=>!u.has(h)).map(([,h])=>h);f.sort((h,p)=>{let y=this.getBindingPriority(h.rc.binding),g=this.getBindingPriority(p.rc.binding);return y!==g?y-g:h.depth!==p.depth?h.depth-p.depth:(h.rc.binding.order??100)-(p.rc.binding.order??100)});let d=f.map(h=>h.rc);return this.multiCache.set(s,d),d}async expandClassHierarchy(e){let t=new Map;for(let c of e){if(c===Pm){t.set(c,new Set);continue}let l=[];try{l=await this.getClassAncestors(c)}catch{l=[]}t.set(c,new Set(l))}let r=a(c=>{for(let l of e)if(l!==c&&t.get(l)?.has(c)&&!t.get(c)?.has(l))return!0;return!1},"isAncestorOfSibling"),i=e.filter(c=>!r(c)),s=new Map,o=a((c,l)=>{let u=s.get(c);(u===void 0||l<u)&&s.set(c,l)},"setMin");for(let c of i){if(o(c,0),this.looksLikeUUID(c))try{let u=await this.resolveLabelByUID(c);u&&o(u,0)}catch{}if(c===Pm)continue;let l=[];try{l=await this.getClassAncestorsWithDepth(c)}catch{l=[]}for(let{ref:u,depth:f}of l)o(u,f)}return s.has(Pm)||s.set(Pm,V7),s}async resolveForAsset(e,t,r){let i=`${e}:${t}:${r??""}`,s=this.cache.get(i);if(s)return s;let o=await this.findBindings(t,r,e),c=[];for(let l of o){let u=await this.loadCommand(l.commandRef,{targetClass:l.targetClass});if(!u)continue;let f=l.precondition?{...u,precondition:l.precondition}:u;c.push({command:f,binding:l})}return c.sort((l,u)=>{let f=this.getBindingPriority(l.binding),d=this.getBindingPriority(u.binding);return f!==d?f-d:(l.binding.order??100)-(u.binding.order??100)}),this.cache.set(i,c),c}async loadCommand(e,t){let r=await this.findSubjectByUID(e);if(!r||(await this.tripleStore.match(r,V.Namespace.RDF.term("type"),V.Namespace.EXOCMD.term("Command"))).length===0)return null;let s=await this.getLiteralValue(r,V.Namespace.EXO.term("Asset_label"))??"Unknown Command",o=await this.getLiteralValue(r,V.Namespace.EXOCMD.term("Command_labelTemplate")),c=await this.getLiteralValue(r,V.Namespace.EXOCMD.term("Command_icon")),l=await this.getLiteralValue(r,V.Namespace.EXOCMD.term("Command_confirmMessage")),u=await this.getLiteralValue(r,V.Namespace.EXOCMD.term("Command_successMessage")),f=await this.getLiteralValue(r,V.Namespace.EXOCMD.term("Command_category")),d=await this.getLiteralValue(r,V.Namespace.EXOCMD.term("Command_openInSameTab")),h=d!==null&&String(d).trim().toLowerCase()==="true",p=await this.loadLinkedPrecondition(r),y=await this.loadLinkedGrounding(r,0,t);return y?{id:e,name:s,labelTemplate:o??void 0,icon:c??void 0,precondition:p??void 0,grounding:y,confirmMessage:l??void 0,successMessage:u??void 0,category:f??void 0,openInSameTab:h||void 0}:null}async findBindings(e,t,r){let i=await this.tripleStore.match(void 0,V.Namespace.RDF.term("type"),V.Namespace.EXOCMD.term("CommandBinding")),s=[];for(let o of i){let c=o.subject,l=await this.loadBindingDefinition(c);l&&this.bindingMatches(l,e,t,r)&&s.push(l)}return s}async findPaletteEnabledCommands(){let e=await this.tripleStore.match(void 0,V.Namespace.RDF.term("type"),V.Namespace.EXOCMD.term("Command")),t=[],r=new Set;for(let i of e){let s=i.subject;if((await this.getLiteralValue(s,V.Namespace.EXOCMD.term("Command_paletteEnabled")))?.toLowerCase()!=="true")continue;let c=await this.getLiteralValue(s,V.Namespace.EXO.term("Asset_uid"));if(!c){this.logger.warn(`[CommandResolver] paletteEnabled command at ${s.value} has no exo__Asset_uid \u2014 skipped`);continue}let l=await this.loadCommand(c);if(!l){this.logger.warn(`[CommandResolver] paletteEnabled command ${c} could not be loaded (missing grounding?) \u2014 skipped`);continue}let u=await this.getLiteralValue(s,V.Namespace.EXOCMD.term("Command_paletteId")),f=await this.getLiteralValue(s,V.Namespace.EXOCMD.term("Command_cliName")),d=u??f??c;if(r.has(d)){this.logger.warn(`[CommandResolver] duplicate paletteId "${d}" \u2014 first registration wins, dropping ${c}`);continue}r.add(d),t.push({command:l,paletteId:d})}return t}invalidateCache(){this.cache.clear(),this.multiCache.clear(),this._ancestorDepthCache.clear()}async resolveLabel(e,t){if(!e.labelTemplate)return e.name;let r=e.labelTemplate,i=this.extractPlaceholders(e.labelTemplate);for(let{full:s,body:o}of i){let c=await this.evaluateSelectSnippet(o,t);r=r.replace(s,c)}return r}extractPlaceholders(e){let t=[],r=0;for(;r<e.length;)if(e[r]==="{"){let i=1,s=r+1;for(;s<e.length&&i>0;)e[s]==="{"?i++:e[s]==="}"&&i--,s++;if(i===0){let o=e.slice(r,s),c=e.slice(r+1,s-1);t.push({full:o,body:c})}r=s}else r++;return t}async evaluateSelectSnippet(e,t){try{let r=e.replace(/\$target/g,`<${t}>`),s=new $7.ExoQLParser().parse(r),c=new U7.ExoQLAlgebraTranslator().translate(s),u=await new B7.ExoQLQueryExecutor(this.tripleStore).executeAll(c);if(u.length===0)return"";let f=u[0],d=f.variables();if(d.length===0)return"";let h=f.get(d[0]);return h?h instanceof Gt.Literal||h instanceof Zt.IRI?h.value:String(h):""}catch{return""}}async loadBindingDefinition(e){let t=await this.getLiteralValue(e,V.Namespace.EXO.term("Asset_uid"));if(!t)return null;let r=await this.getLiteralValue(e,V.Namespace.EXO.term("Asset_label"))??"",i=await this.getLinkedUID(e,V.Namespace.EXOCMD.term("CommandBinding_command"));if(!i)return null;let s=await this.getLinkedValue(e,V.Namespace.EXOCMD.term("CommandBinding_targetClass")),o=await this.getLinkedValue(e,V.Namespace.EXOCMD.term("CommandBinding_targetPrototype")),c=await this.getLinkedValue(e,V.Namespace.EXOCMD.term("CommandBinding_targetAsset"));if(!s&&!o&&!c)return null;let l=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("CommandBinding_position")),u=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("CommandBinding_order")),f=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("CommandBinding_variant")),d=f!==null?this.coerceVariant(f,t):void 0,h=await this.loadLinkedPreconditionFromProperty(e,V.Namespace.EXOCMD.term("CommandBinding_precondition")),p=await this.loadLinkedStyle(e,t),y=await this.getLinkedUIDs(e,V.Namespace.EXOCMD.term("CommandBinding_overrides"));return{id:t,label:r,commandRef:i,targetClass:s??void 0,targetPrototype:o??void 0,targetAsset:c??void 0,position:l??void 0,order:u?parseInt(u,10):void 0,variant:d,precondition:h??void 0,style:p??void 0,overrides:y.length>0?y:void 0}}async loadLinkedStyle(e,t){let r=await this.tripleStore.match(e,V.Namespace.EXOCMD.term("CommandBinding_style"),void 0);if(r.length>0){let s=r[0].object,o=null;if(s instanceof Zt.IRI)o=s;else if(s instanceof Gt.Literal){let c=this.normalizeWikilink(s.value);o=await this.findSubjectByUID(c)}if(o){let c=await this.loadStyleAsset(o);if(c)return c}this.logger.warn(this.capWarning(`CommandBinding ${t}: style reference unresolved, falling back to inline variant`))}let i=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("CommandBinding_variant"));if(i!==null){let s=this.coerceVariant(i,t);if(s!==void 0)return{id:`inline:${t}`,label:"",variant:s,inline:!0}}return null}async loadStyleAsset(e){let t=await this.getLiteralValue(e,V.Namespace.EXO.term("Asset_uid"));if(!t)return null;let r=await this.getLiteralValue(e,V.Namespace.EXO.term("Asset_label"))??"",i=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("CommandBindingStyle_variant")),s=i!==null?this.coerceVariant(i,t):void 0,o=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("CommandBindingStyle_showIcon")),c=this.coerceBoolean(o),l=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("CommandBindingStyle_labelClass")),u=l!==null?this.coerceLabelClass(l,t):void 0,f=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("CommandBindingStyle_ariaLabel")),d=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("CommandBindingStyle_tooltip")),h=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("CommandBindingStyle_keyboardShortcut")),p=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("CommandBindingStyle_source")),y=p!==null?this.coerceStyleSource(p,t):void 0;return{id:t,label:r,variant:s,showIcon:c,labelClass:u,ariaLabel:f??void 0,tooltip:d??void 0,keyboardShortcut:h??void 0,source:y,inline:!1}}coerceVariant(e,t){if(e==null)return;let r=String(e).trim().toLowerCase();if(r!==""){if(jl.COMMAND_VARIANT_VALUES.includes(r))return r;this.logger.warn(this.capWarning(`CommandBindingStyle variant "${r}" not in whitelist [${jl.COMMAND_VARIANT_VALUES.join(",")}]; dropped (asset ${t})`))}}coerceLabelClass(e,t){if(e==null)return;let r=String(e).trim().toLowerCase();if(r!==""){if(jl.LABEL_CLASS_VALUES.includes(r))return r;this.logger.warn(this.capWarning(`CommandBindingStyle labelClass "${r}" not in whitelist [${jl.LABEL_CLASS_VALUES.join(",")}]; dropped (asset ${t})`))}}coerceStyleSource(e,t){if(e==null)return;let r=String(e).trim().toLowerCase();if(r!==""){if(jl.STYLE_SOURCE_VALUES.includes(r))return r;this.logger.warn(this.capWarning(`CommandBindingStyle source "${r}" not in whitelist [${jl.STYLE_SOURCE_VALUES.join(",")}]; dropped (asset ${t})`))}}coerceBoolean(e){if(e===null)return;let t=e.trim().toLowerCase();if(t==="true")return!0;if(t==="false")return!1}capWarning(e){return e.length<=200?e:e.slice(0,197)+"..."}bindingMatches(e,t,r,i){return!!(e.targetAsset&&i&&this.matchesReference(e.targetAsset,i)||e.targetPrototype&&r&&this.matchesReference(e.targetPrototype,r)||e.targetClass&&t&&this.matchesReference(e.targetClass,t))}matchesReference(e,t){let r=this.normalizeWikilink(e),i=this.normalizeWikilink(t);if(r===i)return!0;let s=this.extractPathBasename(i);if(s&&s===r)return!0;let o=this.extractPathBasename(r);if(o&&o===i)return!0;let c=this.extractAlias(t);if(c&&r===c)return!0;let l=this.extractAlias(e);return!!(l&&l===i)}extractPathBasename(e){let t=e.match(/\/([^/]+)\.md$/);return t?t[1]:null}extractAlias(e){let t=e.replace(/["'[\]]/g,"").trim(),r=t.indexOf("|");return r>=0?t.substring(r+1).trim():null}getBindingPriority(e){return e.targetAsset?0:e.targetPrototype?1:2}async loadLinkedPrecondition(e){return this.loadLinkedPreconditionFromProperty(e,V.Namespace.EXOCMD.term("Command_precondition"))}async loadLinkedPreconditionFromProperty(e,t){let r=await this.tripleStore.match(e,t,void 0);if(r.length===0)return null;let i=r[0].object,s=null;if(i instanceof Zt.IRI)s=i;else if(i instanceof Gt.Literal){let h=this.normalizeWikilink(i.value);s=await this.findSubjectByUID(h)}if(!s)return null;let o=await this.getLiteralValue(s,V.Namespace.EXO.term("Asset_uid")),c=await this.getLiteralValue(s,V.Namespace.EXO.term("Asset_label"))??"",l=await this.getLiteralValue(s,V.Namespace.EXOCMD.term("Precondition_sparqlAsk")),u=await this.getLiteralValue(s,V.Namespace.EXOCMD.term("Precondition_hostFunction")),f=await this.tripleStore.match(s,V.Namespace.EXOCMD.term("Precondition_query"),void 0),d;if(f.length>0){let h=f[0].object;if(h instanceof Zt.IRI){let p=await this.getLiteralValue(h,V.Namespace.EXO.term("Asset_uid"));p&&(d=p)}else h instanceof Gt.Literal&&(d=this.normalizeWikilink(h.value))}return!o||!l&&!u&&!d?null:{id:o,label:c,...l&&{sparqlAsk:l},...u&&{hostFunction:u},...d&&{query:d}}}async loadLinkedGrounding(e,t,r){if(t>=Gf)return null;let i=await this.tripleStore.match(e,V.Namespace.EXOCMD.term("Command_grounding"),void 0);if(i.length===0)return null;if(i.length===1||!r?.targetClass){let o=await this.resolveGroundingRef(i[0].object);return o?this.loadGroundingDefinition(o,t):null}for(let o of i){let c=await this.resolveGroundingRef(o.object);if(!c)continue;let l=await this.getObsidianName(c,V.Namespace.EXOCMD.term("Grounding_targetPrototype"));if(l&&this.matchesReference(l,r.targetClass))return this.loadGroundingDefinition(c,t)}this.logger.warn(`Command ${e.value}: ${i.length} groundings declared, none matched context.targetClass='${r.targetClass}' via Grounding_targetPrototype \u2014 falling back to first grounding by iteration order (legacy behaviour). Check that one grounding's Grounding_targetPrototype references this targetClass.`);let s=await this.resolveGroundingRef(i[0].object);return s?this.loadGroundingDefinition(s,t):null}async resolveGroundingRef(e){if(e instanceof Zt.IRI)return e;if(e instanceof Gt.Literal){let t=this.normalizeWikilink(e.value);return await this.findSubjectByUID(t)}return null}async loadGroundingByUid(e){let t=await this.findSubjectByUID(e);return t?this.loadGroundingDefinition(t,0):null}async loadGroundingDefinition(e,t){if(t>=Gf)return null;let r=await this.getLiteralValue(e,V.Namespace.EXO.term("Asset_uid"));if(!r)return null;let i=await this.getLiteralValue(e,V.Namespace.EXO.term("Asset_label"))??"",s=await this.resolveGroundingTypeReference(e);if(!s)return null;let o=await this.getObsidianName(e,V.Namespace.EXOCMD.term("Grounding_targetProperty"));if(o&&this.looksLikeUUID(o)){let j=await this.resolveLabelByUID(o);if(!j)return this.logger.warn(`Grounding ${r}: targetProperty wikilink UID '${o}' is not resolvable to exo__Asset_label \u2014 grounding skipped (would otherwise write a UUID-named frontmatter key).`),null;o=j}if(s===KR.GroundingType.SERVICE_CALL){let j=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("Grounding_serviceId"));j&&(o=j)}let c=await this.getObsidianName(e,V.Namespace.EXOCMD.term("Grounding_targetValueRef")),l=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("Grounding_targetValueLiteral")),u=await this.getObsidianName(e,V.Namespace.EXOCMD.term("Grounding_targetValueSubstitution")),f=null;if(u&&this.looksLikeUUID(u)){let j=await this.resolveLabelByUID(u);if(!j)return this.logger.warn(`Grounding ${r}: targetValueSubstitution UID '${u}' is not resolvable to exo__Asset_label (SubstitutionToken instance missing or unlabelled) \u2014 grounding skipped.`),null;f=j}else u&&(f=u);let d=await this.getObsidianName(e,V.Namespace.EXOCMD.term("Grounding_targetValueQuery")),h=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("Grounding_serviceCallPayload")),p=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("Grounding_appendExpression")),y=await this.getObsidianWikilinkValue(e,V.Namespace.EXOCMD.term("Grounding_isDefinedBy")),g=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("Grounding_sparqlUpdate")),v=await this.getObsidianName(e,V.Namespace.EXOCMD.term("Grounding_targetClass"));if(v&&!this.looksLikeUUID(v)){let j=await this.findUidByLabel(v);j&&(v=j)}let _=await this.getObsidianName(e,V.Namespace.EXOCMD.term("Grounding_targetPrototype")),S=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("Grounding_targetFolder")),T=await this.getObsidianName(e,V.Namespace.EXOCMD.term("Grounding_linkBackProperty")),I=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("Grounding_inputSchema")),A=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("Grounding_incrementBy")),R=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("Grounding_shiftDelta")),q;if(A!=null&&A!==""){let j=Number.parseInt(String(A),10);Number.isFinite(j)&&(q=j)}let Y=await this.resolvePropertyDefaults(e,r),C=await this.resolveInheritanceRules(e,r),O=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("Grounding_propertyDefaults"));O!==null&&O!==""&&!this._legacyPropertyDefaultsWarnedGroundings.has(r)&&(this.logger.warn(`Grounding ${r}: deprecated exocmd__Grounding_propertyDefaults (plural) JSON predicate detected \u2014 the parser was removed in RFC v2 Phase 5 (#3167); value is ignored. Migrate to ref-form exocmd__Grounding_propertyDefault (singular) pointing to exocmd__PropertyDefault assets. See vault TBox c8f87363-d39c-45cb-9d4d-1be96d70f892 for the canonical replacement.`),this._legacyPropertyDefaultsWarnedGroundings.add(r));let k;s===KR.GroundingType.COMPOSITE&&(k=await this.loadCompositeSteps(e,t+1));let H;if(I)try{let j=JSON.parse(I);j?.properties&&(H=Object.entries(j.properties).map(([se,be])=>{let W=be.type,Ee=W==="string"?"text":W,Ve=be.defaultValue!==void 0?be.defaultValue:be.default,ye={name:se,type:Ee,label:be.title??se,required:Array.isArray(j.required)&&j.required.includes(se)};return Ve!=null&&(ye.defaultValue=String(Ve)),ye}))}catch{}let G=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("Grounding_prefillLabelWithDate")),B=G!==null&&String(G).trim().toLowerCase()==="true",Z=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("Grounding_labelTemplate")),_e=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("Grounding_direction")),ie;if(_e!=null){let j=String(_e).trim().toLowerCase();j==="forward"||j==="rollback"?ie=j:j!==""&&this.logger.warn(`Grounding ${r}: exocmd__Grounding_direction value '${_e}' is not 'forward' or 'rollback' \u2014 treating as undefined (will default to 'forward' at dispatch).`)}let N={id:r,label:i,type:s,targetProperty:o??void 0,targetValueRef:c??void 0,targetValueLiteral:l??void 0,targetValueSubstitution:f??void 0,targetValueQuery:d??void 0,serviceCallPayload:h??void 0,appendExpression:p??void 0,sparqlUpdate:g??void 0,steps:k,targetClass:v??void 0,targetPrototype:_??void 0,targetFolder:S??void 0,linkBackProperty:T??void 0,incrementBy:q,shiftDelta:R??void 0,propertyDefault:Y.length>0?Y:void 0,inheritanceRule:C.length>0?C:void 0,isDefinedBy:y??void 0,prefillLabelWithDate:B||void 0,labelTemplate:Z??void 0,direction:ie};return H&&(N.inputSchema=H),N}async loadCompositeSteps(e,t){if(t>=Gf)return[];let r=await this.tripleStore.match(e,V.Namespace.EXOCMD.term("Grounding_steps"),void 0),i=[];for(let s of r){let o=null;if(s.object instanceof Zt.IRI)o=s.object;else if(s.object instanceof Gt.Literal){let l=this.normalizeWikilink(s.object.value);o=await this.findSubjectByUID(l)}if(!o)continue;let c=await this.loadGroundingDefinition(o,t);c&&i.push(c)}return i}async resolvePropertyDefaults(e,t){let r=await this.resolvePropertyDefaultsForSubject(e,t,V.Namespace.EXOCMD.term("Grounding_propertyDefault")),i=await this.getUniversalCache();return i&&i.propertyDefaults.length>0?(0,Rm.mergePropertyDefaults)(i.propertyDefaults,r):r}async resolvePropertyDefaultsForSubject(e,t,r){let i=await this.tripleStore.match(e,r,void 0),s=[];for(let o of i){let c=await this.resolveRefTripleObject(o.object);if(!c)continue;let l=await this.getObsidianName(c,V.Namespace.EXOCMD.term("PropertyDefault_property"));if(!l){this.logger.warn(`Grounding ${t}: PropertyDefault asset missing exocmd__PropertyDefault_property \u2014 entry skipped.`);continue}let u=this.looksLikeUUID(l)?await this.resolveLabelByUID(l):l;if(!u){this.logger.warn(`Grounding ${t}: PropertyDefault property UID '${l}' is not resolvable to exo__Asset_label \u2014 entry skipped.`);continue}let f=await this.getObsidianName(c,V.Namespace.EXOCMD.term("PropertyDefault_value"));if(!f){this.logger.warn(`Grounding ${t}: PropertyDefault '${u}' missing exocmd__PropertyDefault_value \u2014 entry skipped.`);continue}let d=await this.resolvePropertyDefaultValue(f,t,u);d!==null&&s.push({propertyName:u,value:d})}return s}async getUniversalCache(){if(this._universalCacheReady)return this._universalCacheValue;this._universalCacheReady=!0;let e=await(0,Rm.loadUniversalDefault)();if(e)return this._universalCacheValue=e,e;let t=await this.findUniversalSingleton();if(!t)return this._universalCacheValue=null,null;let r=await this.resolvePropertyDefaultsForSubject(t,eP,V.Namespace.EXOCMD.term("Template_propertyDefault")),i=await this.resolveInheritanceRulesForSubject(t,eP,V.Namespace.EXOCMD.term("Template_inheritanceRule"));return this._universalCacheValue={propertyDefaults:r,inheritanceRules:i},this._universalCacheValue}async findUniversalSingleton(){let e=V.Namespace.EXOCMD.term("UniversalDefaultTemplate").value,t=await this.tripleStore.match(void 0,V.Namespace.EXO.term("Instance_class"),void 0),r=[];for(let i of t){let s=!1;if(i.object instanceof Zt.IRI)s=i.object.value===e||i.object.value.includes(ZR);else if(i.object instanceof Gt.Literal){let o=this.unwrapWikilink(i.object.value);s=o==="exocmd__UniversalDefaultTemplate"||o===ZR}s&&i.subject instanceof Zt.IRI&&r.push(i.subject)}return r.length===0?null:(r.length===1||(r.sort((i,s)=>i.value.localeCompare(s.value)),this.logger.warn(`Multiple UniversalDefaultTemplate singletons found (${r.length}); selecting deterministically by lexicographic UID order: ${r[0].value}`)),r[0])}async resolveInheritanceRules(e,t){let r=await this.resolveInheritanceRulesForSubject(e,t,V.Namespace.EXOCMD.term("Grounding_inheritanceRule")),i=await this.getUniversalCache();return i&&i.inheritanceRules.length>0?(0,Rm.mergeInheritanceRules)(i.inheritanceRules,r):r}async resolveInheritanceRulesForSubject(e,t,r){let i=await this.tripleStore.match(e,r,void 0),s=[],o=t;for(let c of i){let l=await this.resolveRefTripleObject(c.object);if(!l)continue;let u=await this.resolveLabelRef(l,V.Namespace.EXOCMD.term("InheritanceRule_sourceProperty"));if(!u){this.logger.warn(`Grounding ${o}: InheritanceRule missing/unresolvable exocmd__InheritanceRule_sourceProperty \u2014 entry skipped.`);continue}let f=await this.resolveLabelRef(l,V.Namespace.EXOCMD.term("InheritanceRule_targetProperty"));if(!f){this.logger.warn(`Grounding ${o}: InheritanceRule missing/unresolvable exocmd__InheritanceRule_targetProperty \u2014 entry skipped.`);continue}let d=await this.tripleStore.match(l,V.Namespace.EXOCMD.term("InheritanceRule_targetClassCondition"),void 0),h;if(d.length>0){let S=await this.resolveLabelRef(l,V.Namespace.EXOCMD.term("InheritanceRule_targetClassCondition"));if(!S){this.logger.warn(`Grounding ${o}: InheritanceRule has exocmd__InheritanceRule_targetClassCondition triple but ref is unresolvable \u2014 entire rule skipped (would otherwise apply unconditionally, broadening scope).`);continue}h=S}let p=await this.tripleStore.match(l,V.Namespace.EXOCMD.term("InheritanceRule_targetClassExclusion"),void 0),y=[],g=!1;for(let S of p){let T=null;if(S.object instanceof Zt.IRI?T=this.iriToObsidianName(S.object.value)??S.object.value:S.object instanceof Gt.Literal&&(T=this.unwrapWikilink(S.object.value)),!T){g=!0;continue}let I=this.looksLikeUUID(T)?await this.resolveLabelByUID(T):T;if(!I){g=!0;continue}y.push(I)}if(g){this.logger.warn(`Grounding ${o}: InheritanceRule has unresolvable exocmd__InheritanceRule_targetClassExclusion entry \u2014 entire rule skipped (would otherwise expand scope by silently dropping the excluded class).`);continue}let v=await this.getLiteralValue(l,V.Namespace.EXOCMD.term("InheritanceRule_priority")),_=50;if(v!==null&&v!==""){let S=Number.parseInt(String(v),10);Number.isFinite(S)&&(_=S)}s.push({sourcePropertyName:u,targetPropertyName:f,targetClassCondition:h,targetClassExclusion:y,priority:_})}return s}async resolveRefTripleObject(e){if(e instanceof Zt.IRI)return e;if(e instanceof Gt.Literal){let t=this.normalizeWikilink(e.value);return t?this.findSubjectByUID(t):null}return null}async resolveLabelRef(e,t){let r=await this.getObsidianName(e,t);return r?this.looksLikeUUID(r)?this.resolveLabelByUID(r):r:null}async resolvePropertyDefaultValue(e,t,r){if(!this.looksLikeUUID(e))return`"[[${e}]]"`;let i=await this.findSubjectByUID(e);return i?await this.assetIsTokenInvocation(i)?this.resolveTokenInvocation(i,e,t,r):await this.assetIsSubstitutionToken(i)?this.dispatchSubstitutionToken(i,e,t,r,void 0):`"[[${e}]]"`:`"[[${e}]]"`}async dispatchSubstitutionToken(e,t,r,i,s){let o=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("SubstitutionToken_resolver"));if(!o||!o.trim())return this.logger.warn(`Grounding ${r}: PropertyDefault '${i}' references SubstitutionToken '${t}' with no exocmd__SubstitutionToken_resolver \u2014 falling back to wikilink form.`),`"[[${t}]]"`;let c=o.trim();return YR.has(c)?s!==void 0?W7(c,t,s):H7.has(c)?xw.parseTimeResolve(c):q7(c,t):(this.logger.warn(`Grounding ${r}: PropertyDefault '${i}' SubstitutionToken '${t}' declares unknown resolver-id '${c}' \u2014 falling back to wikilink form. Known ids: ${Array.from(YR).join(", ")}.`),`"[[${t}]]"`)}static parseTimeResolve(e){let t=new Date,r=a(i=>i<10?`0${i}`:String(i),"pad");switch(e){case"today":return t.toISOString().slice(0,10);case"todayStart":return new Date(new Date().setHours(0,0,0,0)).toISOString();case"nowTimestamp":return`${t.getFullYear()}-${r(t.getMonth()+1)}-${r(t.getDate())}T${r(t.getHours())}:${r(t.getMinutes())}:${r(t.getSeconds())}`;case"nowDate":return`${t.getFullYear()}-${r(t.getMonth()+1)}-${r(t.getDate())}`;case"nowYear":return String(t.getFullYear());case"nowMonth":return r(t.getMonth()+1);default:return""}}async resolveTokenInvocation(e,t,r,i){let s=await this.getObsidianName(e,V.Namespace.EXOCMD.term("TokenInvocation_token"));if(!s)return this.logger.warn(`Grounding ${r}: PropertyDefault '${i}' TokenInvocation '${t}' missing exocmd__TokenInvocation_token \u2014 entry skipped.`),null;let o=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("TokenInvocation_parameter"))??"";if(!this.looksLikeUUID(s))return this.logger.warn(`Grounding ${r}: PropertyDefault '${i}' TokenInvocation '${t}' references non-UUID token '${s}' \u2014 entry skipped.`),null;let c=await this.findSubjectByUID(s);return c?this.dispatchSubstitutionToken(c,s,r,i,o):(this.logger.warn(`Grounding ${r}: PropertyDefault '${i}' TokenInvocation '${t}' token ref '${s}' not found in store \u2014 entry skipped.`),null)}async assetIsTokenInvocation(e){let t=await this.tripleStore.match(e,V.Namespace.EXO.term("Instance_class"),void 0);for(let r of t)if(r.object instanceof Zt.IRI){if(r.object.value===z7||r.object.value.includes(JR))return!0}else if(r.object instanceof Gt.Literal){let i=this.unwrapWikilink(r.object.value);if(i==="exocmd__TokenInvocation"||i===JR)return!0}return!1}async assetIsSubstitutionToken(e){let t=await this.tripleStore.match(e,V.Namespace.EXO.term("Instance_class"),void 0);for(let r of t)if(r.object instanceof Zt.IRI){if(r.object.value===G7||r.object.value.includes(XR))return!0}else if(r.object instanceof Gt.Literal){let i=this.unwrapWikilink(r.object.value);if(i==="exocmd__SubstitutionToken"||i===XR)return!0}return!1}async resolveGroundingTypeReference(e){let t=await this.tripleStore.match(e,V.Namespace.EXOCMD.term("Grounding_type"),void 0);if(t.length===0)return null;let r=t[0].object;if(r instanceof Zt.IRI)return(0,QR.resolveGroundingTypeFromIRI)(r.value);if(r instanceof Gt.Literal){let i=r.value,s=i.match(/^\[\[([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})(?:\|[^\]]*)?\]\]$/i);return s?(0,QR.resolveGroundingTypeFromIRI)(`obsidian://vault/${s[1].toLowerCase()}.md`):(this.logger.warn(`[exocmd-grounding-type-literal-form] legacy literal-string form '${i}' for exocmd__Grounding_type on <${e.value}>. Migrate to wikilink form per RFC 9d20c91f Phase 3.`),null)}return null}async findSubjectByUID(e){if(this.tripleStore.findSubjectsByUUID){let r=await this.tripleStore.findSubjectsByUUID(e);if(r.length>0)return r[0]}let t=await this.tripleStore.match(void 0,V.Namespace.EXO.term("Asset_uid"),void 0);for(let r of t)if(r.object instanceof Gt.Literal&&r.object.value===e)return r.subject;return null}async getLiteralValue(e,t){let r=await this.tripleStore.match(e,t,void 0);if(r.length===0)return null;let i=r[0].object;return i instanceof Gt.Literal||i instanceof Zt.IRI?i.value:null}looksLikeUUID(e){return/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(e)}async resolveLabelByUID(e){let t=await this.findSubjectByUID(e);return t?this.getLiteralValue(t,V.Namespace.EXO.term("Asset_label")):null}async getClassAncestors(e){return(await this.getClassAncestorsWithDepth(e)).map(r=>r.ref)}async getClassAncestorsWithDepth(e){let t=this._ancestorDepthCache.get(e);if(t)return t;let r=new Map,i=new Set,s=await this.resolveClassFileIRI(e);if(!s)return[];let o=new Set([e]),c=await this.getLiteralValue(s,V.Namespace.EXO.term("Asset_uid"));c&&o.add(c);let l=await this.getLiteralValue(s,V.Namespace.EXO.term("Asset_label"));l&&o.add(l);let u=a((h,p)=>{if(o.has(h))return;let y=r.get(h);(y===void 0||p<y)&&r.set(h,p)},"setMin"),f=[{fileIRI:s,depth:0}];for(;f.length>0;){let h=f.shift();if(!h)break;let{fileIRI:p,depth:y}=h;if(y>=Gf||i.has(p.value))continue;i.add(p.value);let g=await this.tripleStore.match(p,V.Namespace.EXO.term("Class_superClass"),void 0);for(let v of g){let _=v.object;if(!(_ instanceof Zt.IRI))continue;let S=y+1,T=_.value.startsWith("obsidian://vault/"),I=this.iriToObsidianName(_.value);I&&u(I,S);let A=null;if(T?A=_:I&&(A=await this.resolveClassFileIRI(I)),!A)continue;let R=await this.getLiteralValue(A,V.Namespace.EXO.term("Asset_uid"));R&&u(R,S),i.has(A.value)||f.push({fileIRI:A,depth:S})}}let d=Array.from(r.entries()).map(([h,p])=>({ref:h,depth:p}));return this._ancestorDepthCache.set(e,d),d}async resolveClassFileIRI(e){if(this.looksLikeUUID(e))return this.findSubjectByUID(e);let t=await this.findUidByLabel(e);return t?this.findSubjectByUID(t):null}async findUidByLabel(e){let t=await this.tripleStore.match(void 0,V.Namespace.EXO.term("Asset_label"),void 0);for(let r of t)if(r.object instanceof Gt.Literal&&r.object.value===e&&r.subject instanceof Zt.IRI){let i=await this.tripleStore.match(r.subject,V.Namespace.EXO.term("Asset_uid"),void 0);if(i.length>0&&i[0].object instanceof Gt.Literal)return i[0].object.value}return null}async getLinkedUID(e,t){let r=await this.tripleStore.match(e,t,void 0);if(r.length===0)return null;let i=r[0].object;if(i instanceof Zt.IRI){let s=await this.tripleStore.match(i,V.Namespace.EXO.term("Asset_uid"),void 0);return s.length>0&&s[0].object instanceof Gt.Literal?s[0].object.value:i.value.split("/").pop()?.replace(".md","")??null}return i instanceof Gt.Literal?this.normalizeWikilink(i.value):null}async getLinkedUIDs(e,t){let r=await this.tripleStore.match(e,t,void 0),i=[];for(let s of r){let o=s.object;if(o instanceof Zt.IRI){let c=await this.tripleStore.match(o,V.Namespace.EXO.term("Asset_uid"),void 0);if(c.length>0&&c[0].object instanceof Gt.Literal)i.push(c[0].object.value);else{let l=o.value.split("/").pop()?.replace(".md","");l&&i.push(l)}}else if(o instanceof Gt.Literal){let c=this.normalizeWikilink(o.value);c&&i.push(c)}}return i}async getLinkedValue(e,t){let r=await this.tripleStore.match(e,t,void 0);if(r.length===0)return null;let i=r[0].object;return i instanceof Gt.Literal?this.normalizeWikilink(i.value):i instanceof Zt.IRI?this.iriToObsidianName(i.value)??i.value:null}async getObsidianName(e,t){let r=await this.tripleStore.match(e,t,void 0);if(r.length===0)return null;let i=r[0].object;return i instanceof Gt.Literal?this.unwrapWikilink(i.value):i instanceof Zt.IRI?this.iriToObsidianName(i.value)??i.value:null}unwrapWikilink(e){if(!e)return e;let t=e.trim().replace(/^"|"$/g,"");if(t.startsWith("http://")||t.startsWith("https://"))return this.iriToObsidianName(t)??t;let r=t.match(/^\[\[([^\]|]+)\|([^\]]+)\]\]$/);if(r)return r[2].trim();let i=t.match(/^\[\[([^\]|]+)\]\]$/);if(i){let s=i[1].trim();return s.startsWith("http://")||s.startsWith("https://")?this.iriToObsidianName(s)??s:s}return t}async getObsidianWikilinkValue(e,t){let r=await this.tripleStore.match(e,t,void 0);if(r.length===0)return null;let i=r[0].object;if(i instanceof Gt.Literal)return this.resolveWikilinkAlias(i.value);if(i instanceof Zt.IRI){let s=this.iriToObsidianName(i.value);return s?`"[[${s}]]"`:i.value}return null}async resolveWikilinkAlias(e){let t=e.match(/\[\[([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\]\]/);if(!t)return e;let r=t[1],i=await this.findSubjectByUID(r);if(!i)return e;let s=await this.getLiteralValue(i,V.Namespace.EXO.term("Asset_label"));return s?e.replace(`[[${r}]]`,`[[${r}|${s}]]`):e}iriToObsidianName(e){return(0,j7.iriToObsidianName)(e)}normalizeWikilink(e){let t=e.replace(/["'[\]]/g,"").trim(),r=t.indexOf("|");return r>=0?t.substring(0,r):t}};so.CommandResolver=Rw;so.CommandResolver=Rw=xw=F7([(0,N7.injectable)(),L7("design:paramtypes",[Object,Object])],Rw)});var Cw=w(Pw=>{"use strict";Object.defineProperty(Pw,"__esModule",{value:!0});Pw.validateExoQLAllowlist=K7;var Cm=Bf();function K7(n){if(!n||typeof n!="object")return;let e=n;if(e.type==="update"){let t=n.updates??[];for(let r of t)if(r?.type==="load")throw new Cm.ExoQLForbiddenKeywordError("LOAD");throw new Cm.ExoQLForbiddenKeywordError("UPDATE")}if(e.type==="query"){if(e.from){let t=Array.isArray(e.from.default)&&e.from.default.length>0,r=Array.isArray(e.from.named)&&e.from.named.length>0;if(t||r)throw new Cm.ExoQLForbiddenKeywordError("FROM")}if(Array.isArray(e.where))for(let t of e.where)Om(t);if(Array.isArray(e.template))for(let t of e.template)Om(t)}}a(K7,"validateExoQLAllowlist");function Om(n){if(!n||typeof n!="object")return;if(n.type==="service")throw new Cm.ExoQLForbiddenKeywordError("SERVICE");if(Array.isArray(n.patterns))for(let t of n.patterns)Om(t);let e=n.where;if(Array.isArray(e))for(let t of e)Om(t)}a(Om,"walkPatternForBannedKeywords")});var Ow=w(Dm=>{"use strict";Object.defineProperty(Dm,"__esModule",{value:!0});Dm.DEFAULT_EVAL_CONFIG=void 0;Dm.DEFAULT_EVAL_CONFIG=Object.freeze({enabled:!0,maxNestedEvalCount:100,maxAggregateEvalMillis:1e4})});var Fm=w(Dw=>{"use strict";Object.defineProperty(Dw,"__esModule",{value:!0});Dw.evaluateWithExoEval=t8;var Q7=pl(),X7=gl(),Y7=Ml(),J7=Cw(),Z7=Ow(),e8=Bf();async function t8(n,e={}){if(typeof n!="string")throw new TypeError("evaluateWithExoEval: sparql must be a string");let r=new Q7.ExoQLParser().parse(n);if((0,J7.validateExoQLAllowlist)(r),!{...Z7.DEFAULT_EVAL_CONFIG,...e.config??{}}.enabled)throw new e8.ExoQLEvalDisabledError;let s="queryType"in r&&typeof r.queryType=="string"?r.queryType:"SELECT";if(!e.store)return s==="ASK"?{kind:"ask",result:!1}:s==="CONSTRUCT"?{kind:"construct",triples:[]}:{kind:"select",rows:[]};let c=new X7.ExoQLAlgebraTranslator().translate(r),l=new Y7.ExoQLQueryExecutor(e.store);return l.isAskQuery(c)?{kind:"ask",result:await l.executeAsk(c)}:l.isConstructQuery(c)?{kind:"construct",triples:await l.executeConstruct(c)}:{kind:"select",rows:await l.executeAll(c)}}a(t8,"evaluateWithExoEval")});var qf=w(Lm=>{"use strict";Object.defineProperty(Lm,"__esModule",{value:!0});Lm.liveClock=r8;Lm.frozenClock=n8;function r8(){return{now:a(()=>new Date,"now")}}a(r8,"liveClock");function n8(n){let e=new Date(n);return{now:a(()=>new Date(e.getTime()),"now")}}a(n8,"frozenClock")});var nP=w(oo=>{"use strict";var i8=oo&&oo.__decorate||function(n,e,t,r){var i=arguments.length,s=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,o;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(o=n[c])&&(s=(i<3?o(s):i>3?o(e,t,s):o(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s},s8=oo&&oo.__metadata||function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Wf;Object.defineProperty(oo,"__esModule",{value:!0});oo.PreconditionEvaluator=void 0;var o8=je(),a8=pl(),c8=gl(),rP=Ml(),l8=Fm(),u8=qf(),zf=Wf=class{static{a(this,"PreconditionEvaluator")}constructor(e,t,r){this.hostFunctions=new Map,this.askCache=new Map,this.tripleStore=e,this.queryBodyResolver=t,this.clock=r?.clock??(0,u8.liveClock)()}async evaluate(e,t,r){return e?e.sparqlAsk?this.evaluateSparqlAsk(e.sparqlAsk,t):e.query?this.evaluateQueryRef(e.query,t):e.hostFunction?this.evaluateHostFunction(e.hostFunction,t,r):!0:!0}async evaluateQueryRef(e,t){if(!this.queryBodyResolver)return!1;try{let r=await this.queryBodyResolver.resolveSparql(e);if(!r)return!1;let i=this.substituteVariables(r,t),s=await(0,l8.evaluateWithExoEval)(i,{store:this.tripleStore});return s.kind!=="ask"?!1:s.result}catch{return!1}}registerHostFunction(e,t){this.hostFunctions.set(e,t)}hasHostFunction(e){return this.hostFunctions.has(e)}evaluateHostFunctionSync(e,t,r){return this.hostFunctions.has(e)?this.evaluateHostFunction(e,t,r):null}invalidateCache(){this.askCache.clear()}compileAsk(e){let t=this.substituteVariables(e,Wf.SENTINEL_IRI),i=new a8.ExoQLParser().parse(t),o=new c8.ExoQLAlgebraTranslator().translate(i);return new rP.ExoQLQueryExecutor(this.tripleStore).isAskQuery(o)?o:null}evaluateHostFunction(e,t,r){let i=this.hostFunctions.get(e);if(!i)return!0;let s=r?{...r,targetIRI:t}:{targetIRI:t};return i(s)}async evaluateSparqlAsk(e,t){try{let r=this.askCache.get(e);if(r===void 0){let o=this.compileAsk(e);if(!o)return!1;r=o,this.askCache.set(e,r)}let i=JSON.parse(JSON.stringify(r).replaceAll(Wf.SENTINEL_IRI,t));return await new rP.ExoQLQueryExecutor(this.tripleStore).executeAsk(i)}catch{return!1}}substituteVariables(e,t){let r=this.clock.now(),i=r.toISOString(),s=i.slice(0,10),o=new Date(r.getTime()+Wf.ALMATY_OFFSET_MS),c=o.getUTCFullYear(),l=o.getUTCMonth(),u=o.getUTCDate(),f=o.getUTCDay(),h=new Date(Date.UTC(c,l,u-1)).toISOString().slice(0,10),p=(f+6)%7,y=new Date(Date.UTC(c,l,u-p)),g=y.toISOString().slice(0,10),_=new Date(y.getTime()-10080*60*1e3).toISOString().slice(0,10),S=`${c}-${String(l+1).padStart(2,"0")}-01`,T=l===0?11:l-1,A=`${l===0?c-1:c}-${String(T+1).padStart(2,"0")}-01`,R=`${c}-01-01`;return e.replace(/\$target/g,`<${t}>`).replace(/\$now/g,`"${i}"^^xsd:dateTime`).replace(/\$yesterday/g,`"${h}"^^xsd:date`).replace(/\$thisWeekStart/g,`"${g}"^^xsd:date`).replace(/\$lastWeekStart/g,`"${_}"^^xsd:date`).replace(/\$thisMonthStart/g,`"${S}"^^xsd:date`).replace(/\$lastMonthStart/g,`"${A}"^^xsd:date`).replace(/\$thisYearStart/g,`"${R}"^^xsd:date`).replace(/\$today/g,`"${s}"^^xsd:date`)}};oo.PreconditionEvaluator=zf;zf.SENTINEL_IRI="urn:exocortex:cache-sentinel:target";zf.ALMATY_OFFSET_MS=300*60*1e3;oo.PreconditionEvaluator=zf=Wf=i8([(0,o8.injectable)(),s8("design:paramtypes",[Object,Object,Object])],zf)});var iP=w(ao=>{"use strict";Object.defineProperty(ao,"__esModule",{value:!0});ao.hasUidFilename=ao.hasNonUidFilename=void 0;ao.registerDefaultHostFunctions=h8;var f8=a(n=>{let e=n.assetUid;if(typeof e!="string"||e.trim()==="")return!1;let t=n.fileBasename;return typeof t!="string"?!1:t!==e},"hasNonUidFilename");ao.hasNonUidFilename=f8;var d8=a(n=>{let e=n.assetUid;if(typeof e!="string"||e.trim()==="")return!1;let t=n.fileBasename;return typeof t!="string"?!1:t===e},"hasUidFilename");ao.hasUidFilename=d8;function h8(n){n.registerHostFunction("hasNonUidFilename",ao.hasNonUidFilename),n.registerHostFunction("hasUidFilename",ao.hasUidFilename)}a(h8,"registerDefaultHostFunctions")});var km=w(Nm=>{"use strict";Object.defineProperty(Nm,"__esModule",{value:!0});Nm.liveUidGenerator=p8;Nm.seededUidGenerator=g8;var Fw=Ai();function p8(){return{next:a(()=>(0,Fw.v4)(),"next")}}a(p8,"liveUidGenerator");var m8="6ba7b810-9dad-11d1-80b4-00c04fd430c8";function g8(n){let e=0,t=(0,Fw.v5)(n,m8);return{next:a(()=>{let r=`${n}#${e}`;return e+=1,(0,Fw.v5)(r,t)},"next")}}a(g8,"seededUidGenerator")});var Hf=w($l=>{"use strict";Object.defineProperty($l,"__esModule",{value:!0});$l.registerOrderSpecLoader=y8;$l.clearOrderSpecLoader=b8;$l.loadDefaultSpec=_8;$l.orderProperties=S8;var Mm=null,ta,jm=!1;function y8(n){Mm=n,ta=void 0,jm=!1}a(y8,"registerOrderSpecLoader");function b8(){Mm=null,ta=void 0,jm=!1}a(b8,"clearOrderSpecLoader");function _8(){if(ta!==void 0)return ta;if(!Mm)return ta=null,null;try{ta=Mm()}catch(n){jm||(console.warn("[OrderSpecResolver] loader threw, falling back to insertion order:",n),jm=!0),ta=null}return ta}a(_8,"loadDefaultSpec");function S8(n,e){if(!e||e.head.length===0&&e.tail.length===0)return n;let t=Object.keys(n),r=new Set(e.head),i=new Set(e.tail),s=e.head.filter(u=>Object.prototype.hasOwnProperty.call(n,u)),o=e.tail.filter(u=>Object.prototype.hasOwnProperty.call(n,u)),c=t.filter(u=>!r.has(u)&&!i.has(u));e.middleStrategy==="alphabetical"&&c.sort((u,f)=>u.localeCompare(f));let l={};for(let u of s)l[u]=n[u];for(let u of c)l[u]=n[u];for(let u of o)l[u]=n[u];return l}a(S8,"orderProperties")});var vs=w($m=>{"use strict";Object.defineProperty($m,"__esModule",{value:!0});$m.FrontmatterService=void 0;var sP=Hf(),Kf=class n{static{a(this,"FrontmatterService")}parse(e){let t=e.match(n.FRONTMATTER_REGEX);return t?{exists:!0,content:t[1],originalContent:e}:{exists:!1,content:"",originalContent:e}}parseObject(e){let t=this.parse(e);if(!t.exists)return null;let r={},i=t.content.split(/\r?\n/),s=null,o=null,c=a(()=>{s!==null&&o!==null&&(r[s]=o),s=null,o=null},"flushArray");for(let l of i){let u=/^ {2}- (.*)$/.exec(l);if(u){s!==null&&o!==null&&o.push(u[1].trim());continue}c();let f=/^([^:\s][^:]*):\s*(.*)$/.exec(l);if(!f)continue;let d=f[1].trim(),h=f[2].trim();h===""?(s=d,o=[]):r[d]=h}return c(),r}updateProperty(e,t,r){t=n.normalizeIRI(t),typeof r=="string"&&(r=n.normalizeIRIValue(r));let i=this.parse(e),s=this.serializeValue(t,r);if(!i.exists)return`---
|
|
70
|
+
${r}}`}generateValuesTerm(e){if(e.type==="iri")return`<${e.value}>`;let r=`"${e.value.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`;return e.language?r+=`@${e.language}`:e.datatype&&(r+=`^^<${e.datatype}>`),r}generateExpression(e){switch(e.type){case"variable":return`?${e.name}`;case"literal":return typeof e.value=="string"?`"${e.value.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`:typeof e.value=="boolean"?e.value?"true":"false":String(e.value);case"comparison":return`(${this.generateExpression(e.left)} ${e.operator} ${this.generateExpression(e.right)})`;case"logical":return e.operator==="!"?`!(${this.generateExpression(e.operands[0])})`:`(${e.operands.map(t=>this.generateExpression(t)).join(` ${e.operator} `)})`;case"arithmetic":return`(${this.generateExpression(e.left)} ${e.operator} ${this.generateExpression(e.right)})`;case"function":return`${e.function.toUpperCase()}(${e.args.map(t=>this.generateExpression(t)).join(", ")})`;case"functionCall":return`${(typeof e.function=="string"?e.function:e.function.value).toUpperCase()}(${e.args.map(r=>this.generateExpression(r)).join(", ")})`;case"exists":return`${e.negated?"NOT EXISTS":"EXISTS"} { ${this.generateWhereClause(e.pattern,0)} }`;case"in":{let t=this.generateExpression(e.expression),r=e.list.map(i=>this.generateExpression(i)).join(", ");return e.negated?`${t} NOT IN (${r})`:`${t} IN (${r})`}default:throw new Ll(`Unknown expression type: ${e.type}`)}}collectVariablesFromOperation(e,t){switch(e.type){case"bgp":for(let r of e.triples)this.collectVariablesFromTriple(r,t);break;case"filter":this.collectVariablesFromOperation(e.input,t),this.collectVariablesFromExpression(e.expression,t);break;case"join":case"leftjoin":case"union":case"minus":this.collectVariablesFromOperation(e.left,t),this.collectVariablesFromOperation(e.right,t);break;case"values":for(let r of e.variables)t.add(r);break;case"project":for(let r of e.variables)t.add(r);this.collectVariablesFromOperation(e.input,t);break;case"extend":t.add(e.variable),this.collectVariablesFromOperation(e.input,t);break;case"orderby":case"slice":case"distinct":case"reduced":this.collectVariablesFromOperation(e.input,t);break;case"group":for(let r of e.variables)t.add(r);for(let r of e.aggregates)t.add(r.variable);this.collectVariablesFromOperation(e.input,t);break;case"subquery":this.collectVariablesFromOperation(e.query,t);break}}collectVariablesFromTriple(e,t){e.subject.type==="variable"&&t.add(e.subject.value),"type"in e.predicate&&e.predicate.type==="variable"&&t.add(e.predicate.value),e.object.type==="variable"&&t.add(e.object.value)}collectVariablesFromExpression(e,t){switch(e.type){case"variable":t.add(e.name);break;case"comparison":case"arithmetic":this.collectVariablesFromExpression(e.left,t),this.collectVariablesFromExpression(e.right,t);break;case"logical":for(let r of e.operands)this.collectVariablesFromExpression(r,t);break;case"function":case"functionCall":for(let r of e.args)this.collectVariablesFromExpression(r,t);break;case"exists":this.collectVariablesFromOperation(e.pattern,t);break;case"in":this.collectVariablesFromExpression(e.expression,t);for(let r of e.list)this.collectVariablesFromExpression(r,t);break}}};Nl.SPARQLGenerator=Iw});var Ml=w(Nn=>{"use strict";var g7=Nn&&Nn.__createBinding||(Object.create?(function(n,e,t,r){r===void 0&&(r=t);var i=Object.getOwnPropertyDescriptor(e,t);(!i||("get"in i?!e.__esModule:i.writable||i.configurable))&&(i={enumerable:!0,get:a(function(){return e[t]},"get")}),Object.defineProperty(n,r,i)}):(function(n,e,t,r){r===void 0&&(r=t),n[r]=e[t]})),y7=Nn&&Nn.__setModuleDefault||(Object.create?(function(n,e){Object.defineProperty(n,"default",{enumerable:!0,value:e})}):function(n,e){n.default=e}),HR=Nn&&Nn.__importStar||(function(){var n=a(function(e){return n=Object.getOwnPropertyNames||function(t){var r=[];for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(r[r.length]=i);return r},n(e)},"ownKeys");return function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r=n(e),i=0;i<r.length;i++)r[i]!=="default"&&g7(t,e,r[i]);return y7(t,e),t}})();Object.defineProperty(Nn,"__esModule",{value:!0});Nn.QueryExecutor=Nn.ExoQLQueryExecutor=Nn.QueryExecutorError=void 0;var b7=zS(),_7=bm(),S7=fw(),w7=hw(),v7=kR(),E7=jR(),T7=BR(),A7=Ew(),I7=GR(),x7=WR(),R7=zR(),P7=Oe(),C7=qe(),O7=fm(),Vr="http://www.w3.org/2001/XMLSchema#",D7=new Set([`${Vr}integer`,`${Vr}decimal`,`${Vr}float`,`${Vr}double`,`${Vr}nonPositiveInteger`,`${Vr}negativeInteger`,`${Vr}long`,`${Vr}int`,`${Vr}short`,`${Vr}byte`,`${Vr}nonNegativeInteger`,`${Vr}unsignedLong`,`${Vr}unsignedInt`,`${Vr}unsignedShort`,`${Vr}unsignedByte`,`${Vr}positiveInteger`]),kl=class extends Error{static{a(this,"QueryExecutorError")}constructor(e,t){super(e,t?{cause:t}:void 0),this.name="QueryExecutorError"}};Nn.QueryExecutorError=kl;var xm=class{static{a(this,"ExoQLQueryExecutor")}constructor(e,t={}){this.tripleStore=e,this.bgpExecutor=new b7.BGPExecutor(e),this.filterExecutor=new _7.FilterExecutor,this.optionalExecutor=new S7.OptionalExecutor,this.unionExecutor=new w7.UnionExecutor,this.minusExecutor=new v7.MinusExecutor,this.valuesExecutor=new E7.ValuesExecutor,this.aggregateExecutor=new T7.AggregateExecutor,this.constructExecutor=new A7.ConstructExecutor,this.serviceExecutor=new I7.ServiceExecutor(t.serviceConfig),this.graphExecutor=new x7.GraphExecutor(e),this.sparqlGenerator=new R7.SPARQLGenerator,this.filterExecutor.setExistsEvaluator(async(r,i)=>this.evaluateExistsPattern(r,i)),this.filterExecutor.setTripleStore(e)}async evaluateExistsPattern(e,t){for await(let r of this.execute(e))if(t.merge(r)!==null)return!0;return!1}async executeAll(e){let t=[];for await(let r of this.execute(e))t.push(r);return t}async*execute(e){switch(e.type){case"bgp":yield*this.executeBGP(e);break;case"filter":yield*this.executeFilter(e);break;case"join":yield*this.executeJoin(e);break;case"leftjoin":yield*this.executeLeftJoin(e);break;case"union":yield*this.executeUnion(e);break;case"minus":yield*this.executeMinus(e);break;case"values":yield*this.executeValues(e);break;case"project":yield*this.executeProject(e);break;case"orderby":yield*this.executeOrderBy(e);break;case"slice":yield*this.executeSlice(e);break;case"distinct":yield*this.executeDistinct(e);break;case"reduced":yield*this.executeReduced(e);break;case"group":yield*this.executeGroup(e);break;case"extend":yield*this.executeExtend(e);break;case"subquery":yield*this.executeSubquery(e);break;case"lateraljoin":yield*this.executeLateralJoin(e);break;case"service":yield*this.executeService(e);break;case"graph":yield*this.executeGraph(e);break;default:throw new kl(`Unknown operation type: ${e.type}`)}}async*executeBGP(e){yield*this.bgpExecutor.execute(e)}async*executeFilter(e){let t=this.execute(e.input);yield*this.filterExecutor.execute(e,t)}async*executeJoin(e){let t=[];for await(let o of this.execute(e.left))t.push(o);if(t.length===0)return;let r=new Set;for(let o of t)for(let c of o.variables())r.add(c);let i=this.collectOperationVariables(e.right);if([...r].some(o=>i.has(o)))for(let o of t){let c=this.substituteVariables(e.right,o);for await(let l of this.execute(c)){let u=o.merge(l);u!==null&&(yield u)}}else{let o=[];for await(let c of this.execute(e.right))o.push(c);for(let c of t)for(let l of o){let u=c.merge(l);u!==null&&(yield u)}}}async*executeLeftJoin(e){let t=[];for await(let o of this.execute(e.left))t.push(o);let r=[];for await(let o of this.execute(e.right))r.push(o);async function*i(){for(let o of t)yield o}a(i,"leftGen");async function*s(){for(let o of r)yield o}a(s,"rightGen"),yield*this.optionalExecutor.execute(i(),s())}async*executeUnion(e){let t=[];for await(let o of this.execute(e.left))t.push(o);let r=[];for await(let o of this.execute(e.right))r.push(o);async function*i(){for(let o of t)yield o}a(i,"leftGen");async function*s(){for(let o of r)yield o}a(s,"rightGen"),yield*this.unionExecutor.execute(i(),s())}async*executeMinus(e){let t=[];for await(let o of this.execute(e.left))t.push(o);let r=[];for await(let o of this.execute(e.right))r.push(o);async function*i(){for(let o of t)yield o}a(i,"leftGen");async function*s(){for(let o of r)yield o}a(s,"rightGen"),yield*this.minusExecutor.execute(i(),s())}async*executeValues(e){yield*this.valuesExecutor.execute(e)}async*executeProject(e){let{SolutionMapping:t}=await Promise.resolve().then(()=>HR(bs())),r=new Set(e.variables);for await(let i of this.execute(e.input)){let s=new t;for(let o of i.variables())if(r.has(o)){let c=i.get(o);c!==void 0&&s.set(o,c)}yield s}}async*executeOrderBy(e){let t=[];for await(let r of this.execute(e.input))t.push(r);t.sort((r,i)=>{for(let s of e.comparators){let o=this.getExpressionValue(s.expression,r),c=this.getExpressionValue(s.expression,i),l=0;if(o===void 0&&c===void 0?l=0:o===void 0?l=1:c===void 0?l=-1:typeof o=="number"&&typeof c=="number"?l=o-c:l=String(o).localeCompare(String(c)),s.descending&&(l=-l),l!==0)return l}return 0});for(let r of t)yield r}async*executeSlice(e){let t=0,r=e.offset??0,i=e.limit;for await(let s of this.execute(e.input)){if(t>=r){if(i!==void 0&&t-r>=i)break;yield s}t++}}async*executeDistinct(e){let t=new Set;for await(let r of this.execute(e.input)){let i=this.getSolutionKey(r);t.has(i)||(t.add(i),yield r)}}async*executeReduced(e){let t=new Set;for await(let r of this.execute(e.input)){let i=this.getSolutionKey(r);t.has(i)||(t.add(i),yield r)}}async*executeGroup(e){let t=[];for await(let i of this.execute(e.input))t.push(i);let r=this.aggregateExecutor.execute(e,t);if(e.having&&e.having.length>0)for(let i of r)e.having.every(o=>this.filterExecutor.evaluateExpression(o,i)===!0)&&(yield i);else for(let i of r)yield i}async*executeExtend(e){let t=e.expression.type!=="aggregate"&&this.filterExecutor.expressionContainsExists(e.expression);for await(let r of this.execute(e.input)){let i=r.clone(),s=t?await this.evaluateExtendExpressionAsync(e.expression,r):this.evaluateExtendExpression(e.expression,r);s!==void 0&&i.set(e.variable,s),yield i}}async*executeSubquery(e){yield*this.execute(e.query)}async*executeLateralJoin(e){let t=[];for await(let r of this.execute(e.left))t.push(r);for(let r of t){let i=this.substituteVariables(e.right,r);for await(let s of this.execute(i)){let o=r.merge(s);o!==null&&(yield o)}}}substituteVariables(e,t){let r=JSON.parse(JSON.stringify(e));return this.substituteInOperation(r,t)}substituteInOperation(e,t){if(!e||typeof e!="object")return e;let r=e;return e.type==="bgp"&&e.triples?(e.triples=e.triples.map(i=>this.substituteInTriple(i,t)),e):(r.input&&(r.input=this.substituteInOperation(r.input,t)),r.left&&(r.left=this.substituteInOperation(r.left,t)),r.right&&(r.right=this.substituteInOperation(r.right,t)),r.pattern&&(r.pattern=this.substituteInOperation(r.pattern,t)),r.query&&(r.query=this.substituteInOperation(r.query,t)),r.where&&(r.where=this.substituteInOperation(r.where,t)),r.expression&&this.substituteInExpression(r.expression,t),e)}substituteInExpression(e,t){if(!(!e||typeof e!="object")){if(e.type==="exists"&&e.pattern&&(e.pattern=this.substituteInOperation(e.pattern,t)),e.left&&this.substituteInExpression(e.left,t),e.right&&this.substituteInExpression(e.right,t),e.operands)for(let r of e.operands)this.substituteInExpression(r,t);if(e.args)for(let r of e.args)this.substituteInExpression(r,t);if(e.expression&&this.substituteInExpression(e.expression,t),e.list)for(let r of e.list)this.substituteInExpression(r,t)}}substituteInTriple(e,t){return{subject:this.substituteInTripleElement(e.subject,t),predicate:e.predicate,object:this.substituteInTripleElement(e.object,t)}}substituteInTripleElement(e,t){if(e&&e.type==="variable"){let r=t.get(e.value);if(r!=null){let i=r;if(r instanceof P7.IRI||i.termType==="NamedNode")return{type:"iri",value:r.value};if(i.termType==="Literal"||typeof i.value=="string")return{type:"literal",value:i.value,datatype:i.datatype?.value??i._datatype?.value,language:i.language??i._language}}}return e}async*executeService(e){yield*this.serviceExecutor.execute(e,t=>this.sparqlGenerator.generateSelect(t))}async*executeGraph(e){let t=async function*(r,i){let s=this.currentGraphContext;this.currentGraphContext=i;try{r.type==="bgp"&&i&&this.tripleStore.matchInGraph?yield*this.executeBGPInGraph(r,i):yield*this.execute(r)}finally{this.currentGraphContext=s}}.bind(this);yield*this.graphExecutor.execute(e,t)}async*executeBGPInGraph(e,t){if(e.triples.length===0){let{SolutionMapping:r}=await Promise.resolve().then(()=>HR(bs()));yield new r;return}yield*this.bgpExecutor.executeInGraph(e,t)}evaluateExtendExpression(e,t){if(e.type!=="aggregate")try{return this.filterExecutor.evaluateExpression(e,t)}catch{return}}async evaluateExtendExpressionAsync(e,t){if(e.type!=="aggregate")try{return await this.filterExecutor.evaluateExpressionAsync(e,t)}catch{return}}getExpressionValue(e,t){if(e.type==="variable"){let r=t.get(e.name);if(!r)return;if(r instanceof C7.Literal){let i=r.datatype?.value;if(i===`${Vr}dayTimeDuration`)try{return O7.DateTimeFunctions.parseDayTimeDuration(r.value)}catch{return r.value}if(i&&D7.has(i)){let s=parseFloat(r.value);if(!Number.isNaN(s))return s}return r.value}return r.value??r.id??String(r)}if(e.type==="literal")return e.value}collectOperationVariables(e){let t=new Set;return this.collectVarsFromOperation(e,t),t}collectVarsFromOperation(e,t){if(!e||typeof e!="object")return;let r=e;if(r.type==="bgp"&&r.triples)for(let i of r.triples)this.collectVarsFromElement(i.subject,t),i.predicate?.type!=="path"&&this.collectVarsFromElement(i.predicate,t),this.collectVarsFromElement(i.object,t);if(r.type==="values"&&r.variables)for(let i of r.variables)t.add(i);r.expression&&this.collectVarsFromExpressionTree(r.expression,t),r.type==="extend"&&r.variable&&t.add(r.variable),r.input&&this.collectVarsFromOperation(r.input,t),r.left&&this.collectVarsFromOperation(r.left,t),r.right&&this.collectVarsFromOperation(r.right,t),r.pattern&&this.collectVarsFromOperation(r.pattern,t),r.query&&this.collectVarsFromOperation(r.query,t),r.where&&this.collectVarsFromOperation(r.where,t)}collectVarsFromElement(e,t){if(!e||typeof e!="object")return;let r=e;r.type==="variable"&&t.add(r.value),r.type==="quoted"&&(this.collectVarsFromElement(r.subject,t),this.collectVarsFromElement(r.predicate,t),this.collectVarsFromElement(r.object,t))}collectVarsFromExpressionTree(e,t){if(!e||typeof e!="object")return;let r=e;if(r.type==="variable"&&r.name&&t.add(r.name),r.type==="exists"&&r.pattern&&this.collectVarsFromOperation(r.pattern,t),r.left&&this.collectVarsFromExpressionTree(r.left,t),r.right&&this.collectVarsFromExpressionTree(r.right,t),r.operands)for(let i of r.operands)this.collectVarsFromExpressionTree(i,t);if(r.args)for(let i of r.args)this.collectVarsFromExpressionTree(i,t);if(r.expression&&this.collectVarsFromExpressionTree(r.expression,t),r.list)for(let i of r.list)this.collectVarsFromExpressionTree(i,t)}getSolutionKey(e){let t=e.toJSON();return Object.keys(t).sort().map(i=>`${i}=${t[i]}`).join("|")}isConstructQuery(e){return e.type==="construct"}async executeConstruct(e){if(e.type!=="construct")throw new kl("executeConstruct requires a CONSTRUCT operation");let t=await this.executeAll(e.where);return this.constructExecutor.execute(e.template,t)}isAskQuery(e){return e.type==="ask"}async executeAsk(e){if(e.type!=="ask")throw new kl("executeAsk requires an ASK operation");for await(let t of this.execute(e.where))return!0;return!1}};Nn.ExoQLQueryExecutor=xm;Nn.QueryExecutor=xm});var tP=w(so=>{"use strict";var F7=so&&so.__decorate||function(n,e,t,r){var i=arguments.length,s=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,o;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(o=n[c])&&(s=(i<3?o(s):i>3?o(e,t,s):o(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s},L7=so&&so.__metadata||function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},xw;Object.defineProperty(so,"__esModule",{value:!0});so.CommandResolver=void 0;var N7=je(),k7=rl(),Zt=Oe(),Gt=qe(),V=Jt(),KR=Vo(),QR=pf(),M7=il(),j7=Rp(),jl=Bb(),Rm=Vx(),$7=pl(),U7=gl(),B7=Ml(),Gf=10,Pm="exo__Asset",V7=Gf+1,XR="08cec529-90eb-4d43-88de-ceecccea12b0",G7=V.Namespace.EXOCMD.term("SubstitutionToken").value,YR=new Set(["today","todayStart","targetFolder","target","randomUUIDv4","nowTimestamp","nowDate","nowYear","nowMonth","userInputLabel","userInput","targetProperty","labelAsArray","groundingTargetClass"]);function q7(n,e){return`__SUBSTITUTE__${n}__${e}__`}a(q7,"buildSubstitutionMarker");function W7(n,e,t){let r=(0,M7.utf8ToBase64)(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"");return`__SUBSTITUTE_P__${n}__${e}__${r}__`}a(W7,"buildParameterisedMarker");var JR="3f28af98-c031-4718-8ba2-44ad0b012c52",z7=V.Namespace.EXOCMD.term("TokenInvocation").value,ZR="29e2c8f8-2d27-4e58-b467-2e85d46f8122",eP="universal-default-template",H7=new Set(["today","todayStart","nowTimestamp","nowDate","nowYear","nowMonth"]),Rw=xw=class{static{a(this,"CommandResolver")}clearUniversalCache(){this._universalCacheReady=!1,this._universalCacheValue=null,(0,Rm.clearUniversalDefault)()}constructor(e,t=k7.NullLogger){this.tripleStore=e,this.logger=t,this.cache=new Map,this.multiCache=new Map,this._ancestorDepthCache=new Map,this._legacyPropertyDefaultsWarnedGroundings=new Set,this._universalCacheReady=!1,this._universalCacheValue=null}async resolveForAssetMulti(e,t,r){if(t.length===0)return[];let i=[...t].sort().join(","),s=`${e}::${i}::${r??""}`,o=this.multiCache.get(s);if(o)return o;let c=await this.expandClassHierarchy(t),l=new Map;for(let[h,p]of c){let y=await this.resolveForAsset(e,h,r);for(let g of y){let v=this.getBindingPriority(g.binding)===2?p:0,_=l.get(g.binding.id);(!_||v<_.depth)&&l.set(g.binding.id,{rc:g,depth:v})}}let u=new Set;for(let{rc:h}of l.values())if(h.binding.overrides)for(let p of h.binding.overrides)u.add(p);let f=Array.from(l.entries()).filter(([h])=>!u.has(h)).map(([,h])=>h);f.sort((h,p)=>{let y=this.getBindingPriority(h.rc.binding),g=this.getBindingPriority(p.rc.binding);return y!==g?y-g:h.depth!==p.depth?h.depth-p.depth:(h.rc.binding.order??100)-(p.rc.binding.order??100)});let d=f.map(h=>h.rc);return this.multiCache.set(s,d),d}async expandClassHierarchy(e){let t=new Map;for(let c of e){if(c===Pm){t.set(c,new Set);continue}let l=[];try{l=await this.getClassAncestors(c)}catch{l=[]}t.set(c,new Set(l))}let r=a(c=>{for(let l of e)if(l!==c&&t.get(l)?.has(c)&&!t.get(c)?.has(l))return!0;return!1},"isAncestorOfSibling"),i=e.filter(c=>!r(c)),s=new Map,o=a((c,l)=>{let u=s.get(c);(u===void 0||l<u)&&s.set(c,l)},"setMin");for(let c of i){if(o(c,0),this.looksLikeUUID(c))try{let u=await this.resolveLabelByUID(c);u&&o(u,0)}catch{}if(c===Pm)continue;let l=[];try{l=await this.getClassAncestorsWithDepth(c)}catch{l=[]}for(let{ref:u,depth:f}of l)o(u,f)}return s.has(Pm)||s.set(Pm,V7),s}async resolveForAsset(e,t,r){let i=`${e}:${t}:${r??""}`,s=this.cache.get(i);if(s)return s;let o=await this.findBindings(t,r,e),c=[];for(let l of o){let u=await this.loadCommand(l.commandRef,{targetClass:l.targetClass});if(!u)continue;let f=l.precondition?{...u,precondition:l.precondition}:u;c.push({command:f,binding:l})}return c.sort((l,u)=>{let f=this.getBindingPriority(l.binding),d=this.getBindingPriority(u.binding);return f!==d?f-d:(l.binding.order??100)-(u.binding.order??100)}),this.cache.set(i,c),c}async loadCommand(e,t){let r=await this.findSubjectByUID(e);if(!r||(await this.tripleStore.match(r,V.Namespace.RDF.term("type"),V.Namespace.EXOCMD.term("Command"))).length===0)return null;let s=await this.getLiteralValue(r,V.Namespace.EXO.term("Asset_label"))??"Unknown Command",o=await this.getLiteralValue(r,V.Namespace.EXOCMD.term("Command_labelTemplate")),c=await this.getLiteralValue(r,V.Namespace.EXOCMD.term("Command_icon")),l=await this.getLiteralValue(r,V.Namespace.EXOCMD.term("Command_confirmMessage")),u=await this.getLiteralValue(r,V.Namespace.EXOCMD.term("Command_successMessage")),f=await this.getLiteralValue(r,V.Namespace.EXOCMD.term("Command_category")),d=await this.getLiteralValue(r,V.Namespace.EXOCMD.term("Command_openInSameTab")),h=d!==null&&String(d).trim().toLowerCase()==="true",p=await this.loadLinkedPrecondition(r),y=await this.loadLinkedGrounding(r,0,t);return y?{id:e,name:s,labelTemplate:o??void 0,icon:c??void 0,precondition:p??void 0,grounding:y,confirmMessage:l??void 0,successMessage:u??void 0,category:f??void 0,openInSameTab:h||void 0}:null}async findBindings(e,t,r){let i=await this.tripleStore.match(void 0,V.Namespace.RDF.term("type"),V.Namespace.EXOCMD.term("CommandBinding")),s=[];for(let o of i){let c=o.subject,l=await this.loadBindingDefinition(c);l&&this.bindingMatches(l,e,t,r)&&s.push(l)}return s}async findPaletteEnabledCommands(){let e=await this.tripleStore.match(void 0,V.Namespace.RDF.term("type"),V.Namespace.EXOCMD.term("Command")),t=[],r=new Set;for(let i of e){let s=i.subject;if((await this.getLiteralValue(s,V.Namespace.EXOCMD.term("Command_paletteEnabled")))?.toLowerCase()!=="true")continue;let c=await this.getLiteralValue(s,V.Namespace.EXO.term("Asset_uid"));if(!c){this.logger.warn(`[CommandResolver] paletteEnabled command at ${s.value} has no exo__Asset_uid \u2014 skipped`);continue}let l=await this.loadCommand(c);if(!l){this.logger.warn(`[CommandResolver] paletteEnabled command ${c} could not be loaded (missing grounding?) \u2014 skipped`);continue}let u=await this.getLiteralValue(s,V.Namespace.EXOCMD.term("Command_paletteId")),f=await this.getLiteralValue(s,V.Namespace.EXOCMD.term("Command_cliName")),d=u??f??c;if(r.has(d)){this.logger.warn(`[CommandResolver] duplicate paletteId "${d}" \u2014 first registration wins, dropping ${c}`);continue}r.add(d),t.push({command:l,paletteId:d})}return t}invalidateCache(){this.cache.clear(),this.multiCache.clear(),this._ancestorDepthCache.clear()}async resolveLabel(e,t){if(!e.labelTemplate)return e.name;let r=e.labelTemplate,i=this.extractPlaceholders(e.labelTemplate);for(let{full:s,body:o}of i){let c=await this.evaluateSelectSnippet(o,t);r=r.replace(s,c)}return r}extractPlaceholders(e){let t=[],r=0;for(;r<e.length;)if(e[r]==="{"){let i=1,s=r+1;for(;s<e.length&&i>0;)e[s]==="{"?i++:e[s]==="}"&&i--,s++;if(i===0){let o=e.slice(r,s),c=e.slice(r+1,s-1);t.push({full:o,body:c})}r=s}else r++;return t}async evaluateSelectSnippet(e,t){try{let r=e.replace(/\$target/g,`<${t}>`),s=new $7.ExoQLParser().parse(r),c=new U7.ExoQLAlgebraTranslator().translate(s),u=await new B7.ExoQLQueryExecutor(this.tripleStore).executeAll(c);if(u.length===0)return"";let f=u[0],d=f.variables();if(d.length===0)return"";let h=f.get(d[0]);return h?h instanceof Gt.Literal||h instanceof Zt.IRI?h.value:String(h):""}catch{return""}}async loadBindingDefinition(e){let t=await this.getLiteralValue(e,V.Namespace.EXO.term("Asset_uid"));if(!t)return null;let r=await this.getLiteralValue(e,V.Namespace.EXO.term("Asset_label"))??"",i=await this.getLinkedUID(e,V.Namespace.EXOCMD.term("CommandBinding_command"));if(!i)return null;let s=await this.getLinkedValue(e,V.Namespace.EXOCMD.term("CommandBinding_targetClass")),o=await this.getLinkedValue(e,V.Namespace.EXOCMD.term("CommandBinding_targetPrototype")),c=await this.getLinkedValue(e,V.Namespace.EXOCMD.term("CommandBinding_targetAsset"));if(!s&&!o&&!c)return null;let l=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("CommandBinding_position")),u=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("CommandBinding_order")),f=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("CommandBinding_variant")),d=f!==null?this.coerceVariant(f,t):void 0,h=await this.loadLinkedPreconditionFromProperty(e,V.Namespace.EXOCMD.term("CommandBinding_precondition")),p=await this.loadLinkedStyle(e,t),y=await this.getLinkedUIDs(e,V.Namespace.EXOCMD.term("CommandBinding_overrides"));return{id:t,label:r,commandRef:i,targetClass:s??void 0,targetPrototype:o??void 0,targetAsset:c??void 0,position:l??void 0,order:u?parseInt(u,10):void 0,variant:d,precondition:h??void 0,style:p??void 0,overrides:y.length>0?y:void 0}}async loadLinkedStyle(e,t){let r=await this.tripleStore.match(e,V.Namespace.EXOCMD.term("CommandBinding_style"),void 0);if(r.length>0){let s=r[0].object,o=null;if(s instanceof Zt.IRI)o=s;else if(s instanceof Gt.Literal){let c=this.normalizeWikilink(s.value);o=await this.findSubjectByUID(c)}if(o){let c=await this.loadStyleAsset(o);if(c)return c}this.logger.warn(this.capWarning(`CommandBinding ${t}: style reference unresolved, falling back to inline variant`))}let i=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("CommandBinding_variant"));if(i!==null){let s=this.coerceVariant(i,t);if(s!==void 0)return{id:`inline:${t}`,label:"",variant:s,inline:!0}}return null}async loadStyleAsset(e){let t=await this.getLiteralValue(e,V.Namespace.EXO.term("Asset_uid"));if(!t)return null;let r=await this.getLiteralValue(e,V.Namespace.EXO.term("Asset_label"))??"",i=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("CommandBindingStyle_variant")),s=i!==null?this.coerceVariant(i,t):void 0,o=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("CommandBindingStyle_showIcon")),c=this.coerceBoolean(o),l=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("CommandBindingStyle_labelClass")),u=l!==null?this.coerceLabelClass(l,t):void 0,f=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("CommandBindingStyle_ariaLabel")),d=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("CommandBindingStyle_tooltip")),h=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("CommandBindingStyle_keyboardShortcut")),p=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("CommandBindingStyle_source")),y=p!==null?this.coerceStyleSource(p,t):void 0;return{id:t,label:r,variant:s,showIcon:c,labelClass:u,ariaLabel:f??void 0,tooltip:d??void 0,keyboardShortcut:h??void 0,source:y,inline:!1}}coerceVariant(e,t){if(e==null)return;let r=String(e).trim().toLowerCase();if(r!==""){if(jl.COMMAND_VARIANT_VALUES.includes(r))return r;this.logger.warn(this.capWarning(`CommandBindingStyle variant "${r}" not in whitelist [${jl.COMMAND_VARIANT_VALUES.join(",")}]; dropped (asset ${t})`))}}coerceLabelClass(e,t){if(e==null)return;let r=String(e).trim().toLowerCase();if(r!==""){if(jl.LABEL_CLASS_VALUES.includes(r))return r;this.logger.warn(this.capWarning(`CommandBindingStyle labelClass "${r}" not in whitelist [${jl.LABEL_CLASS_VALUES.join(",")}]; dropped (asset ${t})`))}}coerceStyleSource(e,t){if(e==null)return;let r=String(e).trim().toLowerCase();if(r!==""){if(jl.STYLE_SOURCE_VALUES.includes(r))return r;this.logger.warn(this.capWarning(`CommandBindingStyle source "${r}" not in whitelist [${jl.STYLE_SOURCE_VALUES.join(",")}]; dropped (asset ${t})`))}}coerceBoolean(e){if(e===null)return;let t=e.trim().toLowerCase();if(t==="true")return!0;if(t==="false")return!1}capWarning(e){return e.length<=200?e:e.slice(0,197)+"..."}bindingMatches(e,t,r,i){return!!(e.targetAsset&&i&&this.matchesReference(e.targetAsset,i)||e.targetPrototype&&r&&this.matchesReference(e.targetPrototype,r)||e.targetClass&&t&&this.matchesReference(e.targetClass,t))}matchesReference(e,t){let r=this.normalizeWikilink(e),i=this.normalizeWikilink(t);if(r===i)return!0;let s=this.extractPathBasename(i);if(s&&s===r)return!0;let o=this.extractPathBasename(r);if(o&&o===i)return!0;let c=this.extractAlias(t);if(c&&r===c)return!0;let l=this.extractAlias(e);return!!(l&&l===i)}extractPathBasename(e){let t=e.match(/\/([^/]+)\.md$/);return t?t[1]:null}extractAlias(e){let t=e.replace(/["'[\]]/g,"").trim(),r=t.indexOf("|");return r>=0?t.substring(r+1).trim():null}getBindingPriority(e){return e.targetAsset?0:e.targetPrototype?1:2}async loadLinkedPrecondition(e){return this.loadLinkedPreconditionFromProperty(e,V.Namespace.EXOCMD.term("Command_precondition"))}async loadLinkedPreconditionFromProperty(e,t){let r=await this.tripleStore.match(e,t,void 0);if(r.length===0)return null;let i=r[0].object,s=null;if(i instanceof Zt.IRI)s=i;else if(i instanceof Gt.Literal){let h=this.normalizeWikilink(i.value);s=await this.findSubjectByUID(h)}if(!s)return null;let o=await this.getLiteralValue(s,V.Namespace.EXO.term("Asset_uid")),c=await this.getLiteralValue(s,V.Namespace.EXO.term("Asset_label"))??"",l=await this.getLiteralValue(s,V.Namespace.EXOCMD.term("Precondition_sparqlAsk")),u=await this.getLiteralValue(s,V.Namespace.EXOCMD.term("Precondition_hostFunction")),f=await this.tripleStore.match(s,V.Namespace.EXOCMD.term("Precondition_query"),void 0),d;if(f.length>0){let h=f[0].object;if(h instanceof Zt.IRI){let p=await this.getLiteralValue(h,V.Namespace.EXO.term("Asset_uid"));p&&(d=p)}else h instanceof Gt.Literal&&(d=this.normalizeWikilink(h.value))}return!o||!l&&!u&&!d?null:{id:o,label:c,...l&&{sparqlAsk:l},...u&&{hostFunction:u},...d&&{query:d}}}async loadLinkedGrounding(e,t,r){if(t>=Gf)return null;let i=await this.tripleStore.match(e,V.Namespace.EXOCMD.term("Command_grounding"),void 0);if(i.length===0)return null;if(i.length===1||!r?.targetClass){let o=await this.resolveGroundingRef(i[0].object);return o?this.loadGroundingDefinition(o,t):null}for(let o of i){let c=await this.resolveGroundingRef(o.object);if(!c)continue;let l=await this.getObsidianName(c,V.Namespace.EXOCMD.term("Grounding_targetPrototype"));if(l&&this.matchesReference(l,r.targetClass))return this.loadGroundingDefinition(c,t)}this.logger.warn(`Command ${e.value}: ${i.length} groundings declared, none matched context.targetClass='${r.targetClass}' via Grounding_targetPrototype \u2014 falling back to first grounding by iteration order (legacy behaviour). Check that one grounding's Grounding_targetPrototype references this targetClass.`);let s=await this.resolveGroundingRef(i[0].object);return s?this.loadGroundingDefinition(s,t):null}async resolveGroundingRef(e){if(e instanceof Zt.IRI)return e;if(e instanceof Gt.Literal){let t=this.normalizeWikilink(e.value);return await this.findSubjectByUID(t)}return null}async loadGroundingByUid(e){let t=await this.findSubjectByUID(e);return t?this.loadGroundingDefinition(t,0):null}async loadGroundingDefinition(e,t){if(t>=Gf)return null;let r=await this.getLiteralValue(e,V.Namespace.EXO.term("Asset_uid"));if(!r)return null;let i=await this.getLiteralValue(e,V.Namespace.EXO.term("Asset_label"))??"",s=await this.resolveGroundingTypeReference(e);if(!s)return null;let o=await this.getObsidianName(e,V.Namespace.EXOCMD.term("Grounding_targetProperty"));if(o&&this.looksLikeUUID(o)){let j=await this.resolveLabelByUID(o);if(!j)return this.logger.warn(`Grounding ${r}: targetProperty wikilink UID '${o}' is not resolvable to exo__Asset_label \u2014 grounding skipped (would otherwise write a UUID-named frontmatter key).`),null;o=j}if(s===KR.GroundingType.SERVICE_CALL){let j=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("Grounding_serviceId"));j&&(o=j)}let c=await this.getObsidianName(e,V.Namespace.EXOCMD.term("Grounding_targetValueRef")),l=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("Grounding_targetValueLiteral")),u=await this.getObsidianName(e,V.Namespace.EXOCMD.term("Grounding_targetValueSubstitution")),f=null;if(u&&this.looksLikeUUID(u)){let j=await this.resolveLabelByUID(u);if(!j)return this.logger.warn(`Grounding ${r}: targetValueSubstitution UID '${u}' is not resolvable to exo__Asset_label (SubstitutionToken instance missing or unlabelled) \u2014 grounding skipped.`),null;f=j}else u&&(f=u);let d=await this.getObsidianName(e,V.Namespace.EXOCMD.term("Grounding_targetValueQuery")),h=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("Grounding_serviceCallPayload")),p=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("Grounding_appendExpression")),y=await this.getObsidianWikilinkValue(e,V.Namespace.EXOCMD.term("Grounding_isDefinedBy")),g=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("Grounding_sparqlUpdate")),v=await this.getObsidianName(e,V.Namespace.EXOCMD.term("Grounding_targetClass"));if(v&&!this.looksLikeUUID(v)){let j=await this.findUidByLabel(v);j&&(v=j)}let _=await this.getObsidianName(e,V.Namespace.EXOCMD.term("Grounding_targetPrototype")),S=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("Grounding_targetFolder")),T=await this.getObsidianName(e,V.Namespace.EXOCMD.term("Grounding_linkBackProperty")),I=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("Grounding_inputSchema")),A=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("Grounding_incrementBy")),R=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("Grounding_shiftDelta")),q;if(A!=null&&A!==""){let j=Number.parseInt(String(A),10);Number.isFinite(j)&&(q=j)}let Y=await this.resolvePropertyDefaults(e,r),C=await this.resolveInheritanceRules(e,r),O=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("Grounding_propertyDefaults"));O!==null&&O!==""&&!this._legacyPropertyDefaultsWarnedGroundings.has(r)&&(this.logger.warn(`Grounding ${r}: deprecated exocmd__Grounding_propertyDefaults (plural) JSON predicate detected \u2014 the parser was removed in RFC v2 Phase 5 (#3167); value is ignored. Migrate to ref-form exocmd__Grounding_propertyDefault (singular) pointing to exocmd__PropertyDefault assets. See vault TBox c8f87363-d39c-45cb-9d4d-1be96d70f892 for the canonical replacement.`),this._legacyPropertyDefaultsWarnedGroundings.add(r));let k;s===KR.GroundingType.COMPOSITE&&(k=await this.loadCompositeSteps(e,t+1));let H;if(I)try{let j=JSON.parse(I);j?.properties&&(H=Object.entries(j.properties).map(([se,be])=>{let W=be.type,Ee=W==="string"?"text":W,Ve=be.defaultValue!==void 0?be.defaultValue:be.default,ye={name:se,type:Ee,label:be.title??se,required:Array.isArray(j.required)&&j.required.includes(se)};return Ve!=null&&(ye.defaultValue=String(Ve)),ye}))}catch{}let G=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("Grounding_prefillLabelWithDate")),B=G!==null&&String(G).trim().toLowerCase()==="true",Z=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("Grounding_labelTemplate")),_e=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("Grounding_direction")),ie;if(_e!=null){let j=String(_e).trim().toLowerCase();j==="forward"||j==="rollback"?ie=j:j!==""&&this.logger.warn(`Grounding ${r}: exocmd__Grounding_direction value '${_e}' is not 'forward' or 'rollback' \u2014 treating as undefined (will default to 'forward' at dispatch).`)}let N={id:r,label:i,type:s,targetProperty:o??void 0,targetValueRef:c??void 0,targetValueLiteral:l??void 0,targetValueSubstitution:f??void 0,targetValueQuery:d??void 0,serviceCallPayload:h??void 0,appendExpression:p??void 0,sparqlUpdate:g??void 0,steps:k,targetClass:v??void 0,targetPrototype:_??void 0,targetFolder:S??void 0,linkBackProperty:T??void 0,incrementBy:q,shiftDelta:R??void 0,propertyDefault:Y.length>0?Y:void 0,inheritanceRule:C.length>0?C:void 0,isDefinedBy:y??void 0,prefillLabelWithDate:B||void 0,labelTemplate:Z??void 0,direction:ie};return H&&(N.inputSchema=H),N}async loadCompositeSteps(e,t){if(t>=Gf)return[];let r=await this.tripleStore.match(e,V.Namespace.EXOCMD.term("Grounding_steps"),void 0),i=[];for(let s of r){let o=null;if(s.object instanceof Zt.IRI)o=s.object;else if(s.object instanceof Gt.Literal){let l=this.normalizeWikilink(s.object.value);o=await this.findSubjectByUID(l)}if(!o)continue;let c=await this.loadGroundingDefinition(o,t);c&&i.push(c)}return i}async resolvePropertyDefaults(e,t){let r=await this.resolvePropertyDefaultsForSubject(e,t,V.Namespace.EXOCMD.term("Grounding_propertyDefault")),i=await this.getUniversalCache();return i&&i.propertyDefaults.length>0?(0,Rm.mergePropertyDefaults)(i.propertyDefaults,r):r}async resolvePropertyDefaultsForSubject(e,t,r){let i=await this.tripleStore.match(e,r,void 0),s=[];for(let o of i){let c=await this.resolveRefTripleObject(o.object);if(!c)continue;let l=await this.getObsidianName(c,V.Namespace.EXOCMD.term("PropertyDefault_property"));if(!l){this.logger.warn(`Grounding ${t}: PropertyDefault asset missing exocmd__PropertyDefault_property \u2014 entry skipped.`);continue}let u=this.looksLikeUUID(l)?await this.resolveLabelByUID(l):l;if(!u){this.logger.warn(`Grounding ${t}: PropertyDefault property UID '${l}' is not resolvable to exo__Asset_label \u2014 entry skipped.`);continue}let f=await this.getObsidianName(c,V.Namespace.EXOCMD.term("PropertyDefault_value"));if(!f){this.logger.warn(`Grounding ${t}: PropertyDefault '${u}' missing exocmd__PropertyDefault_value \u2014 entry skipped.`);continue}let d=await this.resolvePropertyDefaultValue(f,t,u);d!==null&&s.push({propertyName:u,value:d})}return s}async getUniversalCache(){if(this._universalCacheReady)return this._universalCacheValue;this._universalCacheReady=!0;let e=await(0,Rm.loadUniversalDefault)();if(e)return this._universalCacheValue=e,e;let t=await this.findUniversalSingleton();if(!t)return this._universalCacheValue=null,null;let r=await this.resolvePropertyDefaultsForSubject(t,eP,V.Namespace.EXOCMD.term("Template_propertyDefault")),i=await this.resolveInheritanceRulesForSubject(t,eP,V.Namespace.EXOCMD.term("Template_inheritanceRule"));return this._universalCacheValue={propertyDefaults:r,inheritanceRules:i},this._universalCacheValue}async findUniversalSingleton(){let e=V.Namespace.EXOCMD.term("UniversalDefaultTemplate").value,t=await this.tripleStore.match(void 0,V.Namespace.EXO.term("Instance_class"),void 0),r=[];for(let i of t){let s=!1;if(i.object instanceof Zt.IRI)s=i.object.value===e||i.object.value.includes(ZR);else if(i.object instanceof Gt.Literal){let o=this.unwrapWikilink(i.object.value);s=o==="exocmd__UniversalDefaultTemplate"||o===ZR}s&&i.subject instanceof Zt.IRI&&r.push(i.subject)}return r.length===0?null:(r.length===1||(r.sort((i,s)=>i.value.localeCompare(s.value)),this.logger.warn(`Multiple UniversalDefaultTemplate singletons found (${r.length}); selecting deterministically by lexicographic UID order: ${r[0].value}`)),r[0])}async resolveInheritanceRules(e,t){let r=await this.resolveInheritanceRulesForSubject(e,t,V.Namespace.EXOCMD.term("Grounding_inheritanceRule")),i=await this.getUniversalCache();return i&&i.inheritanceRules.length>0?(0,Rm.mergeInheritanceRules)(i.inheritanceRules,r):r}async resolveInheritanceRulesForSubject(e,t,r){let i=await this.tripleStore.match(e,r,void 0),s=[],o=t;for(let c of i){let l=await this.resolveRefTripleObject(c.object);if(!l)continue;let u=await this.resolveLabelRef(l,V.Namespace.EXOCMD.term("InheritanceRule_sourceProperty"));if(!u){this.logger.warn(`Grounding ${o}: InheritanceRule missing/unresolvable exocmd__InheritanceRule_sourceProperty \u2014 entry skipped.`);continue}let f=await this.resolveLabelRef(l,V.Namespace.EXOCMD.term("InheritanceRule_targetProperty"));if(!f){this.logger.warn(`Grounding ${o}: InheritanceRule missing/unresolvable exocmd__InheritanceRule_targetProperty \u2014 entry skipped.`);continue}let d=await this.tripleStore.match(l,V.Namespace.EXOCMD.term("InheritanceRule_targetClassCondition"),void 0),h,p;if(d.length>0){let I=await this.getObsidianName(l,V.Namespace.EXOCMD.term("InheritanceRule_targetClassCondition"));if(!I||!I.trim()){this.logger.warn(`Grounding ${o}: InheritanceRule has exocmd__InheritanceRule_targetClassCondition triple but ref is unresolvable \u2014 entire rule skipped (would otherwise apply unconditionally, broadening scope).`);continue}this.looksLikeUUID(I)?(p=I,h=await this.resolveLabelByUID(I)??void 0):h=I}let y=await this.tripleStore.match(l,V.Namespace.EXOCMD.term("InheritanceRule_targetClassExclusion"),void 0),g=[],v=[],_=!1;for(let I of y){let A=null;if(I.object instanceof Zt.IRI?A=this.iriToObsidianName(I.object.value)??I.object.value:I.object instanceof Gt.Literal&&(A=this.unwrapWikilink(I.object.value)),!A){_=!0;continue}if(this.looksLikeUUID(A)){v.push(A);let R=await this.resolveLabelByUID(A);R&&g.push(R)}else g.push(A)}if(_){this.logger.warn(`Grounding ${o}: InheritanceRule has unresolvable exocmd__InheritanceRule_targetClassExclusion entry \u2014 entire rule skipped (would otherwise expand scope by silently dropping the excluded class).`);continue}let S=await this.getLiteralValue(l,V.Namespace.EXOCMD.term("InheritanceRule_priority")),T=50;if(S!==null&&S!==""){let I=Number.parseInt(String(S),10);Number.isFinite(I)&&(T=I)}s.push({sourcePropertyName:u,targetPropertyName:f,targetClassCondition:h,targetClassConditionUid:p,targetClassExclusion:g,targetClassExclusionUids:v,priority:T})}return s}async resolveRefTripleObject(e){if(e instanceof Zt.IRI)return e;if(e instanceof Gt.Literal){let t=this.normalizeWikilink(e.value);return t?this.findSubjectByUID(t):null}return null}async resolveLabelRef(e,t){let r=await this.getObsidianName(e,t);return r?this.looksLikeUUID(r)?this.resolveLabelByUID(r):r:null}async resolvePropertyDefaultValue(e,t,r){if(!this.looksLikeUUID(e))return`"[[${e}]]"`;let i=await this.findSubjectByUID(e);return i?await this.assetIsTokenInvocation(i)?this.resolveTokenInvocation(i,e,t,r):await this.assetIsSubstitutionToken(i)?this.dispatchSubstitutionToken(i,e,t,r,void 0):`"[[${e}]]"`:`"[[${e}]]"`}async dispatchSubstitutionToken(e,t,r,i,s){let o=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("SubstitutionToken_resolver"));if(!o||!o.trim())return this.logger.warn(`Grounding ${r}: PropertyDefault '${i}' references SubstitutionToken '${t}' with no exocmd__SubstitutionToken_resolver \u2014 falling back to wikilink form.`),`"[[${t}]]"`;let c=o.trim();return YR.has(c)?s!==void 0?W7(c,t,s):H7.has(c)?xw.parseTimeResolve(c):q7(c,t):(this.logger.warn(`Grounding ${r}: PropertyDefault '${i}' SubstitutionToken '${t}' declares unknown resolver-id '${c}' \u2014 falling back to wikilink form. Known ids: ${Array.from(YR).join(", ")}.`),`"[[${t}]]"`)}static parseTimeResolve(e){let t=new Date,r=a(i=>i<10?`0${i}`:String(i),"pad");switch(e){case"today":return t.toISOString().slice(0,10);case"todayStart":return new Date(new Date().setHours(0,0,0,0)).toISOString();case"nowTimestamp":return`${t.getFullYear()}-${r(t.getMonth()+1)}-${r(t.getDate())}T${r(t.getHours())}:${r(t.getMinutes())}:${r(t.getSeconds())}`;case"nowDate":return`${t.getFullYear()}-${r(t.getMonth()+1)}-${r(t.getDate())}`;case"nowYear":return String(t.getFullYear());case"nowMonth":return r(t.getMonth()+1);default:return""}}async resolveTokenInvocation(e,t,r,i){let s=await this.getObsidianName(e,V.Namespace.EXOCMD.term("TokenInvocation_token"));if(!s)return this.logger.warn(`Grounding ${r}: PropertyDefault '${i}' TokenInvocation '${t}' missing exocmd__TokenInvocation_token \u2014 entry skipped.`),null;let o=await this.getLiteralValue(e,V.Namespace.EXOCMD.term("TokenInvocation_parameter"))??"";if(!this.looksLikeUUID(s))return this.logger.warn(`Grounding ${r}: PropertyDefault '${i}' TokenInvocation '${t}' references non-UUID token '${s}' \u2014 entry skipped.`),null;let c=await this.findSubjectByUID(s);return c?this.dispatchSubstitutionToken(c,s,r,i,o):(this.logger.warn(`Grounding ${r}: PropertyDefault '${i}' TokenInvocation '${t}' token ref '${s}' not found in store \u2014 entry skipped.`),null)}async assetIsTokenInvocation(e){let t=await this.tripleStore.match(e,V.Namespace.EXO.term("Instance_class"),void 0);for(let r of t)if(r.object instanceof Zt.IRI){if(r.object.value===z7||r.object.value.includes(JR))return!0}else if(r.object instanceof Gt.Literal){let i=this.unwrapWikilink(r.object.value);if(i==="exocmd__TokenInvocation"||i===JR)return!0}return!1}async assetIsSubstitutionToken(e){let t=await this.tripleStore.match(e,V.Namespace.EXO.term("Instance_class"),void 0);for(let r of t)if(r.object instanceof Zt.IRI){if(r.object.value===G7||r.object.value.includes(XR))return!0}else if(r.object instanceof Gt.Literal){let i=this.unwrapWikilink(r.object.value);if(i==="exocmd__SubstitutionToken"||i===XR)return!0}return!1}async resolveGroundingTypeReference(e){let t=await this.tripleStore.match(e,V.Namespace.EXOCMD.term("Grounding_type"),void 0);if(t.length===0)return null;let r=t[0].object;if(r instanceof Zt.IRI)return(0,QR.resolveGroundingTypeFromIRI)(r.value);if(r instanceof Gt.Literal){let i=r.value,s=i.match(/^\[\[([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})(?:\|[^\]]*)?\]\]$/i);return s?(0,QR.resolveGroundingTypeFromIRI)(`obsidian://vault/${s[1].toLowerCase()}.md`):(this.logger.warn(`[exocmd-grounding-type-literal-form] legacy literal-string form '${i}' for exocmd__Grounding_type on <${e.value}>. Migrate to wikilink form per RFC 9d20c91f Phase 3.`),null)}return null}async findSubjectByUID(e){if(this.tripleStore.findSubjectsByUUID){let r=await this.tripleStore.findSubjectsByUUID(e);if(r.length>0)return r[0]}let t=await this.tripleStore.match(void 0,V.Namespace.EXO.term("Asset_uid"),void 0);for(let r of t)if(r.object instanceof Gt.Literal&&r.object.value===e)return r.subject;return null}async getLiteralValue(e,t){let r=await this.tripleStore.match(e,t,void 0);if(r.length===0)return null;let i=r[0].object;return i instanceof Gt.Literal||i instanceof Zt.IRI?i.value:null}looksLikeUUID(e){return/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(e)}async resolveLabelByUID(e){let t=await this.findSubjectByUID(e);return t?this.getLiteralValue(t,V.Namespace.EXO.term("Asset_label")):null}async getClassAncestors(e){return(await this.getClassAncestorsWithDepth(e)).map(r=>r.ref)}async getClassAncestorsWithDepth(e){let t=this._ancestorDepthCache.get(e);if(t)return t;let r=new Map,i=new Set,s=await this.resolveClassFileIRI(e);if(!s)return[];let o=new Set([e]),c=await this.getLiteralValue(s,V.Namespace.EXO.term("Asset_uid"));c&&o.add(c);let l=await this.getLiteralValue(s,V.Namespace.EXO.term("Asset_label"));l&&o.add(l);let u=a((h,p)=>{if(o.has(h))return;let y=r.get(h);(y===void 0||p<y)&&r.set(h,p)},"setMin"),f=[{fileIRI:s,depth:0}];for(;f.length>0;){let h=f.shift();if(!h)break;let{fileIRI:p,depth:y}=h;if(y>=Gf||i.has(p.value))continue;i.add(p.value);let g=await this.tripleStore.match(p,V.Namespace.EXO.term("Class_superClass"),void 0);for(let v of g){let _=v.object;if(!(_ instanceof Zt.IRI))continue;let S=y+1,T=_.value.startsWith("obsidian://vault/"),I=this.iriToObsidianName(_.value);I&&u(I,S);let A=null;if(T?A=_:I&&(A=await this.resolveClassFileIRI(I)),!A)continue;let R=await this.getLiteralValue(A,V.Namespace.EXO.term("Asset_uid"));R&&u(R,S),i.has(A.value)||f.push({fileIRI:A,depth:S})}}let d=Array.from(r.entries()).map(([h,p])=>({ref:h,depth:p}));return this._ancestorDepthCache.set(e,d),d}async resolveClassFileIRI(e){if(this.looksLikeUUID(e))return this.findSubjectByUID(e);let t=await this.findUidByLabel(e);return t?this.findSubjectByUID(t):null}async findUidByLabel(e){let t=await this.tripleStore.match(void 0,V.Namespace.EXO.term("Asset_label"),void 0);for(let r of t)if(r.object instanceof Gt.Literal&&r.object.value===e&&r.subject instanceof Zt.IRI){let i=await this.tripleStore.match(r.subject,V.Namespace.EXO.term("Asset_uid"),void 0);if(i.length>0&&i[0].object instanceof Gt.Literal)return i[0].object.value}return null}async getLinkedUID(e,t){let r=await this.tripleStore.match(e,t,void 0);if(r.length===0)return null;let i=r[0].object;if(i instanceof Zt.IRI){let s=await this.tripleStore.match(i,V.Namespace.EXO.term("Asset_uid"),void 0);return s.length>0&&s[0].object instanceof Gt.Literal?s[0].object.value:i.value.split("/").pop()?.replace(".md","")??null}return i instanceof Gt.Literal?this.normalizeWikilink(i.value):null}async getLinkedUIDs(e,t){let r=await this.tripleStore.match(e,t,void 0),i=[];for(let s of r){let o=s.object;if(o instanceof Zt.IRI){let c=await this.tripleStore.match(o,V.Namespace.EXO.term("Asset_uid"),void 0);if(c.length>0&&c[0].object instanceof Gt.Literal)i.push(c[0].object.value);else{let l=o.value.split("/").pop()?.replace(".md","");l&&i.push(l)}}else if(o instanceof Gt.Literal){let c=this.normalizeWikilink(o.value);c&&i.push(c)}}return i}async getLinkedValue(e,t){let r=await this.tripleStore.match(e,t,void 0);if(r.length===0)return null;let i=r[0].object;return i instanceof Gt.Literal?this.normalizeWikilink(i.value):i instanceof Zt.IRI?this.iriToObsidianName(i.value)??i.value:null}async getObsidianName(e,t){let r=await this.tripleStore.match(e,t,void 0);if(r.length===0)return null;let i=r[0].object;return i instanceof Gt.Literal?this.unwrapWikilink(i.value):i instanceof Zt.IRI?this.iriToObsidianName(i.value)??i.value:null}unwrapWikilink(e){if(!e)return e;let t=e.trim().replace(/^"|"$/g,"");if(t.startsWith("http://")||t.startsWith("https://"))return this.iriToObsidianName(t)??t;let r=t.match(/^\[\[([^\]|]+)\|([^\]]+)\]\]$/);if(r)return r[2].trim();let i=t.match(/^\[\[([^\]|]+)\]\]$/);if(i){let s=i[1].trim();return s.startsWith("http://")||s.startsWith("https://")?this.iriToObsidianName(s)??s:s}return t}async getObsidianWikilinkValue(e,t){let r=await this.tripleStore.match(e,t,void 0);if(r.length===0)return null;let i=r[0].object;if(i instanceof Gt.Literal)return this.resolveWikilinkAlias(i.value);if(i instanceof Zt.IRI){let s=this.iriToObsidianName(i.value);return s?`"[[${s}]]"`:i.value}return null}async resolveWikilinkAlias(e){let t=e.match(/\[\[([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\]\]/);if(!t)return e;let r=t[1],i=await this.findSubjectByUID(r);if(!i)return e;let s=await this.getLiteralValue(i,V.Namespace.EXO.term("Asset_label"));return s?e.replace(`[[${r}]]`,`[[${r}|${s}]]`):e}iriToObsidianName(e){return(0,j7.iriToObsidianName)(e)}normalizeWikilink(e){let t=e.replace(/["'[\]]/g,"").trim(),r=t.indexOf("|");return r>=0?t.substring(0,r):t}};so.CommandResolver=Rw;so.CommandResolver=Rw=xw=F7([(0,N7.injectable)(),L7("design:paramtypes",[Object,Object])],Rw)});var Cw=w(Pw=>{"use strict";Object.defineProperty(Pw,"__esModule",{value:!0});Pw.validateExoQLAllowlist=K7;var Cm=Bf();function K7(n){if(!n||typeof n!="object")return;let e=n;if(e.type==="update"){let t=n.updates??[];for(let r of t)if(r?.type==="load")throw new Cm.ExoQLForbiddenKeywordError("LOAD");throw new Cm.ExoQLForbiddenKeywordError("UPDATE")}if(e.type==="query"){if(e.from){let t=Array.isArray(e.from.default)&&e.from.default.length>0,r=Array.isArray(e.from.named)&&e.from.named.length>0;if(t||r)throw new Cm.ExoQLForbiddenKeywordError("FROM")}if(Array.isArray(e.where))for(let t of e.where)Om(t);if(Array.isArray(e.template))for(let t of e.template)Om(t)}}a(K7,"validateExoQLAllowlist");function Om(n){if(!n||typeof n!="object")return;if(n.type==="service")throw new Cm.ExoQLForbiddenKeywordError("SERVICE");if(Array.isArray(n.patterns))for(let t of n.patterns)Om(t);let e=n.where;if(Array.isArray(e))for(let t of e)Om(t)}a(Om,"walkPatternForBannedKeywords")});var Ow=w(Dm=>{"use strict";Object.defineProperty(Dm,"__esModule",{value:!0});Dm.DEFAULT_EVAL_CONFIG=void 0;Dm.DEFAULT_EVAL_CONFIG=Object.freeze({enabled:!0,maxNestedEvalCount:100,maxAggregateEvalMillis:1e4})});var Fm=w(Dw=>{"use strict";Object.defineProperty(Dw,"__esModule",{value:!0});Dw.evaluateWithExoEval=t8;var Q7=pl(),X7=gl(),Y7=Ml(),J7=Cw(),Z7=Ow(),e8=Bf();async function t8(n,e={}){if(typeof n!="string")throw new TypeError("evaluateWithExoEval: sparql must be a string");let r=new Q7.ExoQLParser().parse(n);if((0,J7.validateExoQLAllowlist)(r),!{...Z7.DEFAULT_EVAL_CONFIG,...e.config??{}}.enabled)throw new e8.ExoQLEvalDisabledError;let s="queryType"in r&&typeof r.queryType=="string"?r.queryType:"SELECT";if(!e.store)return s==="ASK"?{kind:"ask",result:!1}:s==="CONSTRUCT"?{kind:"construct",triples:[]}:{kind:"select",rows:[]};let c=new X7.ExoQLAlgebraTranslator().translate(r),l=new Y7.ExoQLQueryExecutor(e.store);return l.isAskQuery(c)?{kind:"ask",result:await l.executeAsk(c)}:l.isConstructQuery(c)?{kind:"construct",triples:await l.executeConstruct(c)}:{kind:"select",rows:await l.executeAll(c)}}a(t8,"evaluateWithExoEval")});var qf=w(Lm=>{"use strict";Object.defineProperty(Lm,"__esModule",{value:!0});Lm.liveClock=r8;Lm.frozenClock=n8;function r8(){return{now:a(()=>new Date,"now")}}a(r8,"liveClock");function n8(n){let e=new Date(n);return{now:a(()=>new Date(e.getTime()),"now")}}a(n8,"frozenClock")});var nP=w(oo=>{"use strict";var i8=oo&&oo.__decorate||function(n,e,t,r){var i=arguments.length,s=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,o;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(o=n[c])&&(s=(i<3?o(s):i>3?o(e,t,s):o(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s},s8=oo&&oo.__metadata||function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Wf;Object.defineProperty(oo,"__esModule",{value:!0});oo.PreconditionEvaluator=void 0;var o8=je(),a8=pl(),c8=gl(),rP=Ml(),l8=Fm(),u8=qf(),zf=Wf=class{static{a(this,"PreconditionEvaluator")}constructor(e,t,r){this.hostFunctions=new Map,this.askCache=new Map,this.tripleStore=e,this.queryBodyResolver=t,this.clock=r?.clock??(0,u8.liveClock)()}async evaluate(e,t,r){return e?e.sparqlAsk?this.evaluateSparqlAsk(e.sparqlAsk,t):e.query?this.evaluateQueryRef(e.query,t):e.hostFunction?this.evaluateHostFunction(e.hostFunction,t,r):!0:!0}async evaluateQueryRef(e,t){if(!this.queryBodyResolver)return!1;try{let r=await this.queryBodyResolver.resolveSparql(e);if(!r)return!1;let i=this.substituteVariables(r,t),s=await(0,l8.evaluateWithExoEval)(i,{store:this.tripleStore});return s.kind!=="ask"?!1:s.result}catch{return!1}}registerHostFunction(e,t){this.hostFunctions.set(e,t)}hasHostFunction(e){return this.hostFunctions.has(e)}evaluateHostFunctionSync(e,t,r){return this.hostFunctions.has(e)?this.evaluateHostFunction(e,t,r):null}invalidateCache(){this.askCache.clear()}compileAsk(e){let t=this.substituteVariables(e,Wf.SENTINEL_IRI),i=new a8.ExoQLParser().parse(t),o=new c8.ExoQLAlgebraTranslator().translate(i);return new rP.ExoQLQueryExecutor(this.tripleStore).isAskQuery(o)?o:null}evaluateHostFunction(e,t,r){let i=this.hostFunctions.get(e);if(!i)return!0;let s=r?{...r,targetIRI:t}:{targetIRI:t};return i(s)}async evaluateSparqlAsk(e,t){try{let r=this.askCache.get(e);if(r===void 0){let o=this.compileAsk(e);if(!o)return!1;r=o,this.askCache.set(e,r)}let i=JSON.parse(JSON.stringify(r).replaceAll(Wf.SENTINEL_IRI,t));return await new rP.ExoQLQueryExecutor(this.tripleStore).executeAsk(i)}catch{return!1}}substituteVariables(e,t){let r=this.clock.now(),i=r.toISOString(),s=i.slice(0,10),o=new Date(r.getTime()+Wf.ALMATY_OFFSET_MS),c=o.getUTCFullYear(),l=o.getUTCMonth(),u=o.getUTCDate(),f=o.getUTCDay(),h=new Date(Date.UTC(c,l,u-1)).toISOString().slice(0,10),p=(f+6)%7,y=new Date(Date.UTC(c,l,u-p)),g=y.toISOString().slice(0,10),_=new Date(y.getTime()-10080*60*1e3).toISOString().slice(0,10),S=`${c}-${String(l+1).padStart(2,"0")}-01`,T=l===0?11:l-1,A=`${l===0?c-1:c}-${String(T+1).padStart(2,"0")}-01`,R=`${c}-01-01`;return e.replace(/\$target/g,`<${t}>`).replace(/\$now/g,`"${i}"^^xsd:dateTime`).replace(/\$yesterday/g,`"${h}"^^xsd:date`).replace(/\$thisWeekStart/g,`"${g}"^^xsd:date`).replace(/\$lastWeekStart/g,`"${_}"^^xsd:date`).replace(/\$thisMonthStart/g,`"${S}"^^xsd:date`).replace(/\$lastMonthStart/g,`"${A}"^^xsd:date`).replace(/\$thisYearStart/g,`"${R}"^^xsd:date`).replace(/\$today/g,`"${s}"^^xsd:date`)}};oo.PreconditionEvaluator=zf;zf.SENTINEL_IRI="urn:exocortex:cache-sentinel:target";zf.ALMATY_OFFSET_MS=300*60*1e3;oo.PreconditionEvaluator=zf=Wf=i8([(0,o8.injectable)(),s8("design:paramtypes",[Object,Object,Object])],zf)});var iP=w(ao=>{"use strict";Object.defineProperty(ao,"__esModule",{value:!0});ao.hasUidFilename=ao.hasNonUidFilename=void 0;ao.registerDefaultHostFunctions=h8;var f8=a(n=>{let e=n.assetUid;if(typeof e!="string"||e.trim()==="")return!1;let t=n.fileBasename;return typeof t!="string"?!1:t!==e},"hasNonUidFilename");ao.hasNonUidFilename=f8;var d8=a(n=>{let e=n.assetUid;if(typeof e!="string"||e.trim()==="")return!1;let t=n.fileBasename;return typeof t!="string"?!1:t===e},"hasUidFilename");ao.hasUidFilename=d8;function h8(n){n.registerHostFunction("hasNonUidFilename",ao.hasNonUidFilename),n.registerHostFunction("hasUidFilename",ao.hasUidFilename)}a(h8,"registerDefaultHostFunctions")});var km=w(Nm=>{"use strict";Object.defineProperty(Nm,"__esModule",{value:!0});Nm.liveUidGenerator=p8;Nm.seededUidGenerator=g8;var Fw=Ai();function p8(){return{next:a(()=>(0,Fw.v4)(),"next")}}a(p8,"liveUidGenerator");var m8="6ba7b810-9dad-11d1-80b4-00c04fd430c8";function g8(n){let e=0,t=(0,Fw.v5)(n,m8);return{next:a(()=>{let r=`${n}#${e}`;return e+=1,(0,Fw.v5)(r,t)},"next")}}a(g8,"seededUidGenerator")});var Hf=w($l=>{"use strict";Object.defineProperty($l,"__esModule",{value:!0});$l.registerOrderSpecLoader=y8;$l.clearOrderSpecLoader=b8;$l.loadDefaultSpec=_8;$l.orderProperties=S8;var Mm=null,ta,jm=!1;function y8(n){Mm=n,ta=void 0,jm=!1}a(y8,"registerOrderSpecLoader");function b8(){Mm=null,ta=void 0,jm=!1}a(b8,"clearOrderSpecLoader");function _8(){if(ta!==void 0)return ta;if(!Mm)return ta=null,null;try{ta=Mm()}catch(n){jm||(console.warn("[OrderSpecResolver] loader threw, falling back to insertion order:",n),jm=!0),ta=null}return ta}a(_8,"loadDefaultSpec");function S8(n,e){if(!e||e.head.length===0&&e.tail.length===0)return n;let t=Object.keys(n),r=new Set(e.head),i=new Set(e.tail),s=e.head.filter(u=>Object.prototype.hasOwnProperty.call(n,u)),o=e.tail.filter(u=>Object.prototype.hasOwnProperty.call(n,u)),c=t.filter(u=>!r.has(u)&&!i.has(u));e.middleStrategy==="alphabetical"&&c.sort((u,f)=>u.localeCompare(f));let l={};for(let u of s)l[u]=n[u];for(let u of c)l[u]=n[u];for(let u of o)l[u]=n[u];return l}a(S8,"orderProperties")});var vs=w($m=>{"use strict";Object.defineProperty($m,"__esModule",{value:!0});$m.FrontmatterService=void 0;var sP=Hf(),Kf=class n{static{a(this,"FrontmatterService")}parse(e){let t=e.match(n.FRONTMATTER_REGEX);return t?{exists:!0,content:t[1],originalContent:e}:{exists:!1,content:"",originalContent:e}}parseObject(e){let t=this.parse(e);if(!t.exists)return null;let r={},i=t.content.split(/\r?\n/),s=null,o=null,c=a(()=>{s!==null&&o!==null&&(r[s]=o),s=null,o=null},"flushArray");for(let l of i){let u=/^ {2}- (.*)$/.exec(l);if(u){s!==null&&o!==null&&o.push(u[1].trim());continue}c();let f=/^([^:\s][^:]*):\s*(.*)$/.exec(l);if(!f)continue;let d=f[1].trim(),h=f[2].trim();h===""?(s=d,o=[]):r[d]=h}return c(),r}updateProperty(e,t,r){t=n.normalizeIRI(t),typeof r=="string"&&(r=n.normalizeIRIValue(r));let i=this.parse(e),s=this.serializeValue(t,r);if(!i.exists)return`---
|
|
71
71
|
${s}
|
|
72
72
|
---
|
|
73
73
|
${e}`;let o=i.content;if(this.hasProperty(o,t)){let c=new RegExp(`${this.escapeRegex(t)}:.*(?:
|
|
@@ -88,7 +88,7 @@ ${Object.entries(r).map(([c,l])=>this.serializeValue(c,l)).join(`
|
|
|
88
88
|
${r}`}return`${e}: ${String(t)}`}escapeRegex(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}};$m.FrontmatterService=Kf;Kf.FRONTMATTER_REGEX=/^---\n([\s\S]*?)\n---/;Kf.IRI_PREFIX_MAP={"https://exocortex.my/ontology/ems#":"ems__","https://exocortex.my/ontology/exo#":"exo__","https://exocortex.my/ontology/exocmd#":"exocmd__","https://exocortex.my/ontology/ims#":"ims__","https://exocortex.my/ontology/ztlk#":"ztlk__","https://exocortex.my/ontology/ptms#":"ptms__","https://exocortex.my/ontology/lit#":"lit__","https://exocortex.my/ontology/inbox#":"inbox__","https://exocortex.my/ontology/pmbok#":"pmbok__"}});var kn=w(Um=>{"use strict";Object.defineProperty(Um,"__esModule",{value:!0});Um.DateFormatter=void 0;var Lw=class n{static{a(this,"DateFormatter")}static toISOTimestamp(e){return e.toISOString().replace(/\.\d{3}Z$/,"Z")}static toLocalTimestamp(e){let t=e.getFullYear(),r=String(e.getMonth()+1).padStart(2,"0"),i=String(e.getDate()).padStart(2,"0"),s=String(e.getHours()).padStart(2,"0"),o=String(e.getMinutes()).padStart(2,"0"),c=String(e.getSeconds()).padStart(2,"0");return`${t}-${r}-${i}T${s}:${o}:${c}`}static toDateWikilink(e){let t=e.getFullYear(),r=String(e.getMonth()+1).padStart(2,"0"),i=String(e.getDate()).padStart(2,"0");return`"[[${t}-${r}-${i}]]"`}static getTodayWikilink(){return n.toDateWikilink(new Date)}static toDateString(e){let t=e.getFullYear(),r=String(e.getMonth()+1).padStart(2,"0"),i=String(e.getDate()).padStart(2,"0");return`${t}-${r}-${i}`}static parseWikilink(e){let r=e.replace(/^["']|["']$/g,"").match(/\[\[(\d{4}-\d{2}-\d{2})\]\]/);return r?r[1]:null}static addDays(e,t){let r=new Date(e);return r.setDate(r.getDate()+t),r}static isSameDay(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}static getTodayStartTimestamp(){let e=new Date;return e.setHours(0,0,0,0),n.toLocalTimestamp(e)}static toTimestampAtStartOfDay(e){let t=e.split("-").map(Number);if(t.length!==3||t.some(isNaN))throw new Error(`Invalid date format: ${e}. Expected YYYY-MM-DD`);let[r,i,s]=t,o=new Date(r,i-1,s,0,0,0,0);if(isNaN(o.getTime()))throw new Error(`Invalid date values: ${e}`);return n.toLocalTimestamp(o)}static normalizeTimestamp(e){if(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/.test(e))return e;let t=new Date(e);if(isNaN(t.getTime()))throw new Error(`Invalid timestamp format: ${e}`);return n.toISOTimestamp(t)}static isISOTimestamp(e){return/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/.test(e)}};Um.DateFormatter=Lw});var ra=w(Bm=>{"use strict";Object.defineProperty(Bm,"__esModule",{value:!0});Bm.LoggingService=void 0;var Qf=class{static{a(this,"LoggingService")}static setVerbose(e){this.isVerbose=e}static setDevelopmentMode(e){this.isDevelopment=e}static checkIsDevelopment(){return this.isDevelopment!==void 0?this.isDevelopment:typeof process<"u"?(this.isDevelopment=!1,this.isDevelopment):(this.isDevelopment=!1,this.isDevelopment)}static debug(e,t){this.isVerbose&&console.debug(`[Exocortex] ${e}`,t??"")}static info(e,t){console.log(`[Exocortex] ${e}`,t??"")}static warn(e,t){console.warn(`[Exocortex] ${e}`,t??"")}static error(e,t,r){let i=this.checkIsDevelopment(),s=r?` [${r}]`:"";if(i){let o=t?.stack?`
|
|
89
89
|
Stack trace:
|
|
90
90
|
${t.stack}`:"";console.error(`[Exocortex ERROR]${s} ${e}${o}`,t??"")}else{let o=t?.message?`
|
|
91
|
-
Details: ${t.message}`:"";console.error(`[Exocortex ERROR]${s} ${e}${o}`)}}};Bm.LoggingService=Qf;Qf.isVerbose=!1;Qf.isDevelopment=void 0});var oP=w(lc=>{"use strict";Object.defineProperty(lc,"__esModule",{value:!0});lc.registerResolver=mn;lc.getResolver=w8;lc.getRegisteredResolverIds=v8;lc.clearResolvers=E8;lc.installDefaultResolvers=T8;var Vm=new Map;function mn(n,e){Vm.set(n,e)}a(mn,"registerResolver");function w8(n){return Vm.get(n)}a(w8,"getResolver");function v8(){return Array.from(Vm.keys())}a(v8,"getRegisteredResolverIds");function E8(){Vm.clear()}a(E8,"clearResolvers");function na(n){return n<10?`0${n}`:String(n)}a(na,"pad2");function T8(){mn("today",()=>new Date().toISOString().slice(0,10)),mn("todayStart",()=>new Date(new Date().setHours(0,0,0,0)).toISOString()),mn("target",n=>n.targetIRI?`"[[${n.targetIRI}]]"`:""),mn("targetFolder",n=>{if(!n.targetFilePath)return"";let e=n.targetFilePath.replace(/^\/+/,""),t=e.lastIndexOf("/");return t>=0?e.slice(0,t):""}),mn("randomUUIDv4",()=>{if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();throw new Error("randomUUIDv4 resolver requires crypto.randomUUID() \u2014 runtime is missing Node crypto / Web Crypto API.")}),mn("nowTimestamp",()=>{let n=new Date;return`${n.getFullYear()}-${na(n.getMonth()+1)}-${na(n.getDate())}T${na(n.getHours())}:${na(n.getMinutes())}:${na(n.getSeconds())}`}),mn("nowDate",()=>{let n=new Date;return`${n.getFullYear()}-${na(n.getMonth()+1)}-${na(n.getDate())}`}),mn("nowYear",()=>String(new Date().getFullYear())),mn("nowMonth",()=>na(new Date().getMonth()+1)),mn("userInputLabel",n=>{let e=n.userInput?.label;return typeof e=="string"?e:""}),mn("userInput",(n,e)=>{if(!e)return null;let t=n.userInput?.[e];return typeof t=="string"?t:t==null?null:String(t)}),mn("targetProperty",(n,e)=>{if(!e||!n.targetFm)return null;let t=n.targetFm[e];return t==null?null:Array.isArray(t)?t.map(String):String(t)}),mn("labelAsArray",n=>{let e=n.userInput?.label;return typeof e=="string"&&e.length>0?[e]:[]}),mn("groundingTargetClass",n=>n.groundingTargetClassUid?`"[[${n.groundingTargetClassUid}]]"`:null)}a(T8,"installDefaultResolvers")});var uP=w(vr=>{"use strict";var A8=vr&&vr.__decorate||function(n,e,t,r){var i=arguments.length,s=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,o;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(o=n[c])&&(s=(i<3?o(s):i>3?o(e,t,s):o(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s},I8=vr&&vr.__metadata||function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},co;Object.defineProperty(vr,"__esModule",{value:!0});vr.GroundingExecutor=vr.ServiceRegistry=vr.CLASS_UID_TO_LABEL=vr.STATUS_UID_BY_ENUM=void 0;var x8=je(),R8=qf(),P8=km(),ci=Vo(),Gm=Jc(),C8=il(),uc=Zc(),O8=Oe(),D8=vs(),Nw=kn(),aP=jf(),Ul=ra();vr.STATUS_UID_BY_ENUM={[uc.EffortStatus.DRAFT]:"c42245d0-01de-4c35-bfcf-d910445ea28e",[uc.EffortStatus.BACKLOG]:"753a44d5-846c-4b82-9196-4fd9a4d48777",[uc.EffortStatus.ANALYSIS]:"cde3525c-57ea-4efc-b477-2e7e7ccd3a1e",[uc.EffortStatus.TODO]:"6a0e933a-6653-46f4-95ae-ed7508177c73",[uc.EffortStatus.DOING]:"027e78f4-6e16-4b36-b8fb-5510507d5745",[uc.EffortStatus.DONE]:"7b9b3116-7c3c-438c-9618-94fe301320a6",[uc.EffortStatus.TRASHED]:"5d14f18d-db2b-4847-9ac1-144cb93b2541"};var F8=Object.freeze(Object.fromEntries(Object.entries(vr.STATUS_UID_BY_ENUM).map(([n,e])=>[e,n])));vr.CLASS_UID_TO_LABEL=Object.freeze({"1b20a8f0-d745-4e93-91db-4531b3df120e":Gm.AssetClass.TASK,"7db5eeff-718a-49b0-8d2b-39b084a356e3":Gm.AssetClass.PROJECT,"1b0a5e34-dd7f-4ead-b43a-6c7c5a5ecaca":Gm.AssetClass.MEETING});var kw=oP();(0,kw.installDefaultResolvers)();function L8(n){if(n){if(n==="1b20a8f0-d745-4e93-91db-4531b3df120e")return"ems__Task";if(n==="7db5eeff-718a-49b0-8d2b-39b084a356e3")return"ems__Project";if(n==="ems__Task"||n==="ems__Project")return n}}a(L8,"resolveClassFlipTarget");var cP=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,N8=/^__SUBSTITUTE__([a-zA-Z][a-zA-Z0-9_]*)__[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}__$/,k8=/^__SUBSTITUTE_P__([a-zA-Z][a-zA-Z0-9_]*)__[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}__([A-Za-z0-9_-]*)__$/,qm=class{static{a(this,"ServiceRegistry")}constructor(){this.services=new Map}register(e,t){this.services.set(e,t)}get(e){return this.services.get(e)}has(e){return this.services.has(e)}getRegisteredIds(){return Array.from(this.services.keys())}};vr.ServiceRegistry=qm;var lP=20,Wm=co=class{static{a(this,"GroundingExecutor")}constructor(e,t,r,i,s){this.frontmatterService=new D8.FrontmatterService,this.fileReader=e,this.fileWriter=t,this.serviceRegistry=r,this.classLabelToUid=i,this.workflowResolver=s?.workflowResolver,this.groundingLoader=s?.groundingLoader,this.namedQueryRunner=s?.namedQueryRunner,this.clock=s?.clock??(0,R8.liveClock)(),this.uidGen=s?.uidGenerator??(0,P8.liveUidGenerator)()}async execute(e,t,r,i){try{switch(e.type){case ci.GroundingType.PROPERTY_SET:return await this.executePropertySet(e,t,r,i);case ci.GroundingType.PROPERTY_DELETE:return await this.executePropertyDelete(e,r);case ci.GroundingType.COMPOSITE:return await this.executeComposite(e,t,r,i,0);case ci.GroundingType.SERVICE_CALL:return await this.executeServiceCall(e,t,r,i);case ci.GroundingType.CREATE_INSTANCE:return await this.executeCreateInstance(e,t,r,i);case ci.GroundingType.PROPERTY_APPEND:return await this.executePropertyAppend(e,t,r,i);case ci.GroundingType.PROPERTY_INCREMENT:return await this.executePropertyIncrement(e,r);case ci.GroundingType.PROPERTY_SHIFT:return await this.executePropertyShift(e,r);case ci.GroundingType.SPARQL_UPDATE:return{success:!1,error:"sparql_update grounding not yet implemented. Use property_set/property_delete instead."};case ci.GroundingType.WORKFLOW_TRANSITION:return await this.executeWorkflowTransition(e,t,r,i);default:return{success:!1,error:`Unknown grounding type: ${e.type}`}}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}async executePropertySet(e,t,r,i){if(!e.targetProperty)return{success:!1,error:"property_set requires targetProperty"};let s;if([e.targetValueRef!==void 0,e.targetValueLiteral!==void 0,e.targetValueSubstitution!==void 0,e.targetValueQuery!==void 0].filter(Boolean).length>1)return{success:!1,error:"property_set: more than one of targetValueRef/targetValueLiteral/targetValueSubstitution/targetValueQuery set (cardinality 0..1 each, mutually exclusive)"};if(e.targetValueRef!==void 0)s=`"[[${e.targetValueRef}]]"`;else if(e.targetValueLiteral!==void 0)s=e.targetValueLiteral;else if(e.targetValueSubstitution!==void 0)s=e.targetValueSubstitution;else if(e.targetValueQuery!==void 0){let d=await this.resolveTargetValueQuery(e.targetValueQuery,t);if(!d.success)return d;s=d.value}else return{success:!1,error:"property_set requires one of targetValueRef/targetValueLiteral/targetValueSubstitution/targetValueQuery"};if(/\$(input|value)\b/.test(s)&&(i===void 0||i.value===void 0||i.value===null))return{success:!1,error:"property_set: substituted value contains $input/$value placeholder but no userInput.value provided"};let l=this.substituteVariables(s,t,i),u=await this.fileReader.readFile(r),f=this.frontmatterService.updateProperty(u,e.targetProperty,l);return await this.fileWriter.updateFile(r,f),{success:!0}}async resolveTargetValueQuery(e,t){if(!this.namedQueryRunner)return{success:!1,error:"property_set targetValueQuery requires NamedQueryRunner injection (options.namedQueryRunner). Wire the plugin/CLI before using this value-source."};let r;try{r=await this.namedQueryRunner.runScalar(e,{currentAsset:t})}catch(s){return{success:!1,error:`property_set targetValueQuery: NamedQuery '${e}' failed \u2014 ${s instanceof Error?s.message:String(s)}`}}return r===null?{success:!1,error:`property_set targetValueQuery: NamedQuery '${e}' returned no scalar value (empty result set or non-scalar shape).`}:{success:!0,value:r.kind==="iri"?`"[[${r.value}]]"`:r.value}}async executePropertyDelete(e,t){if(!e.targetProperty)return{success:!1,error:"property_delete requires targetProperty"};let r=await this.fileReader.readFile(t),i=this.frontmatterService.removeProperty(r,e.targetProperty);return await this.fileWriter.updateFile(t,i),{success:!0}}async executeComposite(e,t,r,i,s){if(s>=lP)return{success:!1,error:`Composite grounding exceeded maximum depth of ${lP}`};let o=e.steps??[];if(o.length===0)return{success:!0};let c;try{c=await this.fileReader.readFile(r)}catch{}let l=[];try{for(let u=0;u<o.length;u++){let f=o[u],d=await this.executeStep(f,t,r,i,s+1);if(!d.success)return await this.rollback(c,r,l),{success:!1,error:`Composite step ${u} failed: ${d.error}`};l.push(u)}return{success:!0}}catch(u){return await this.rollback(c,r,l),{success:!1,error:`Composite execution failed: ${u instanceof Error?u.message:String(u)}`}}}async executeServiceCall(e,t,r,i){let s=e.targetProperty;if(!s)return{success:!1,error:"service_call requires targetProperty as serviceId"};if(s==="convertToTask")return await this.executeConvertToTask(r);if(s==="updateProperty"){let l=L8(e.targetValueRef);if(l==="ems__Task")return await this.executeConvertToTask(r);if(l==="ems__Project")return await this.executeConvertToProject(r)}let o=this.serviceRegistry.get(s);if(!o)return{success:!1,error:`Service not found: "${s}". Registered services: ${this.serviceRegistry.getRegisteredIds().join(", ")||"none"}`};let c=i;if(e.isDefinedBy&&(c={isDefinedBy:e.isDefinedBy,...c??{}}),e.serviceCallPayload)try{let l=this.substituteVariables(e.serviceCallPayload,t,i),u=JSON.parse(l);typeof u=="object"&&u!==null&&(c={...u,...c??{}})}catch{}return await o.execute(t,c),{success:!0}}async executeConvertToTask(e){let t=await this.fileReader.readFile(e),r=await this.resolveClassRefToUid("ems__Task"),i=this.frontmatterService.updateProperty(t,"exo__Instance_class",`["[[${r}]]"]`);return await this.fileWriter.updateFile(e,i),{success:!0}}async executeConvertToProject(e){let t=await this.fileReader.readFile(e),r=await this.resolveClassRefToUid("ems__Project"),i=this.frontmatterService.updateProperty(t,"exo__Instance_class",`["[[${r}]]"]`);return await this.fileWriter.updateFile(e,i),{success:!0}}async executeCreateInstance(e,t,r,i){if(!e.targetFolder)return{success:!1,error:"create_instance requires targetFolder"};let s={},o=null;if((e.inheritanceRule&&e.inheritanceRule.length>0||e.propertyDefault&&e.propertyDefault.some(y=>typeof y.value=="string"&&y.value.includes("__SUBSTITUTE"))||e.labelTemplate!==void 0&&/\$target\./.test(e.labelTemplate))&&t&&r){let y;try{y=await this.fileReader.readFile(r)}catch(g){return{success:!1,error:`create_instance: failed to read $target file "${r}": ${g instanceof Error?g.message:String(g)}`}}o=this.frontmatterService.parseObject(y)??null}let l;e.targetClass&&(l=await this.resolveClassRefToUid(e.targetClass));let u={userInput:i,targetIRI:t,targetFilePath:r,targetFm:o??void 0,groundingTargetClassUid:l};if(e.propertyDefault&&e.propertyDefault.length>0&&this.applyPropertyDefaultStep(s,e.propertyDefault,u),this.applyMissingScalarPrimitives(s,i,l,e,t,o,r),i)for(let[y,g]of Object.entries(i))y!=="label"&&g!=null&&(s[y]=g);if(e.inheritanceRule&&e.inheritanceRule.length>0&&o&&await this.applyInheritanceRuleStep(s,e.inheritanceRule,o),this.applyMissingBacklinkTopUp(s,e,t,r),t&&e.linkBackProperty&&s[e.linkBackProperty]===void 0){let y=co.extractBacklinkTarget(t,r);s[e.linkBackProperty]=`"[[${y}]]"`}let f=s.exo__Asset_uid,d=this.frontmatterService.createFrontmatter("",s),h=this.substituteVariables(e.targetFolder,t,i,void 0,r),p=h?`${h}/${f}.md`:`${f}.md`;return await this.fileWriter.createFile(p,d),{success:!0,openPath:p}}async resolveClassRefToUid(e){if(cP.test(e)||!this.classLabelToUid)return e;try{let t=await this.classLabelToUid(e);return t&&t.length>0?t:e}catch{return e}}applyPropertyDefaultStep(e,t,r){for(let{propertyName:i,value:s}of t){if(e[i]!==void 0)continue;let o=this.resolveSubstitutionMarker(s,r);if(o!=null){if(Array.isArray(o)){if(o.length===0)continue;e[i]=o;continue}if(i==="exo__Instance_class"&&typeof o=="string"){e[i]=[o];continue}e[i]=o}}}applyMissingScalarPrimitives(e,t,r,i,s,o,c){let l=[];e.exo__Asset_uid===void 0&&(e.exo__Asset_uid=this.uidGen.next(),l.push("exo__Asset_uid")),e.exo__Asset_createdAt===void 0&&(e.exo__Asset_createdAt=Nw.DateFormatter.toLocalTimestamp(this.clock.now()),l.push("exo__Asset_createdAt"));let u=typeof e.exo__Asset_label=="string"&&e.exo__Asset_label.trim().length===0;if(e.exo__Asset_label===void 0||u){let f=t?.label;if(f===void 0&&i?.labelTemplate)try{let h=this.substituteVariables(i.labelTemplate,s??"",t,o??void 0,c);h.trim().length>0&&(f=h)}catch(h){Ul.LoggingService.error(`[GroundingExecutor] labelTemplate substitution failed: ${h instanceof Error?h.message:String(h)}. Falling back to "Untitled".`)}let d=f??"Untitled";e.exo__Asset_label=d,d!=="Untitled"&&e.aliases===void 0&&(e.aliases=[d]),l.push("exo__Asset_label")}e.exo__Instance_class===void 0&&r&&(e.exo__Instance_class=[`"[[${r}]]"`],l.push("exo__Instance_class")),l.length>0&&Ul.LoggingService.error(`[GroundingExecutor] Universal Default Template did not cover essential scalar primitives: ${l.join(", ")}. Filled from legacy TS fallback. Vault may be in an unhealthy state \u2014 verify UniversalDefaultTemplate singleton is present and complete.`)}applyMissingBacklinkTopUp(e,t,r,i){if(!r||t.linkBackProperty||e.exo__Asset_prototype!==void 0||e.ems__Effort_parent!==void 0)return;let s=co.extractBacklinkTarget(r,i);e.exo__Asset_prototype=`"[[${s}]]"`,Ul.LoggingService.error("[GroundingExecutor] No backlink rule fired (Universal IRs absent or no class match). Falling back to legacy exo__Asset_prototype default. Bug #5 may surface if target is not a prototype-instance.")}resolveSubstitutionMarker(e,t){let r=e.match(k8);if(r){let c=r[1],l=r[2],u=co.decodeBase64UrlSafe(l),f=(0,kw.getResolver)(c);return f?f(t,u):(Ul.LoggingService.warn(`[GroundingExecutor] Parameterised marker references unknown resolver '${c}' \u2014 value left as marker.`),e)}let i=e.match(N8);if(!i)return e;let s=i[1];if(s==="target"){let c=t.targetIRI??"",l=t.targetFilePath??"";return`"[[${co.extractBacklinkTarget(c,l)}]]"`}if(s==="targetFolder"){let c=t.targetFilePath??"";if(!c)return"";let l=c.replace(/^\/+/,""),u=l.lastIndexOf("/");return u>=0?l.slice(0,u):""}let o=(0,kw.getResolver)(s);return o?o(t):(Ul.LoggingService.warn(`[GroundingExecutor] Marker references unknown resolver '${s}' \u2014 value left as marker.`),e)}static decodeBase64UrlSafe(e){return(0,C8.base64ToUtf8)(e.replace(/-/g,"+").replace(/_/g,"/"))}async applyInheritanceRuleStep(e,t,r){let i=this.extractTargetClassNames(r),s=[];for(let o of t)!await this.inheritanceConditionMatches(o.targetClassCondition,i)||await this.inheritanceExclusionMatches(o.targetClassExclusion,i)||s.push(o);s.sort((o,c)=>c.priority-o.priority);for(let o of s){if(e[o.targetPropertyName]!==void 0)continue;let c=r[o.sourcePropertyName];c!=null&&(e[o.targetPropertyName]=this.formatInheritedValue(c))}}async inheritanceConditionMatches(e,t){return e?this.classMatchesAny(e,t):!0}async inheritanceExclusionMatches(e,t){for(let r of e)if(await this.classMatchesAny(r,t))return!0;return!1}async classMatchesAny(e,t){if(t.includes(e))return!0;if(!this.classLabelToUid)return!1;try{let r=await this.classLabelToUid(e);if(r&&r.length>0&&t.includes(r))return!0}catch{}return!1}extractTargetClassNames(e){let t=e.exo__Instance_class;if(t==null)return[];let r=Array.isArray(t)?t:[t],i=[];for(let s of r){let o=this.extractWikilinkInner(String(s));o&&i.push(o)}return i}extractWikilinkInner(e){let t=e.match(/\[\[([^\]|]+)(?:\|[^\]]*)?\]\]/);return t?t[1].trim():e.replace(/^["']|["']$/g,"").trim()}formatInheritedValue(e){return Array.isArray(e)?e.map(t=>this.formatInheritedScalar(String(t))):this.formatInheritedScalar(String(e))}formatInheritedScalar(e){return/^"?\[\[.+\]\]"?$/.test(e)?this.reformatWikilink(e):cP.test(e)?`"[[${e}]]"`:e}reformatWikilink(e){return e.startsWith('"[[')&&e.endsWith(']]"')?e:e.startsWith("[[")&&e.endsWith("]]")?`"${e}"`:e}async executeStep(e,t,r,i,s){return e.type===ci.GroundingType.COMPOSITE?this.executeComposite(e,t,r,i,s):this.execute(e,t,r,i)}async rollback(e,t,r){if(e!==void 0)try{await this.fileWriter.updateFile(t,e)}catch(i){Ul.LoggingService.error(`[GroundingExecutor] Rollback failed for ${t}`,i instanceof Error?i:new Error(String(i)))}}substituteVariables(e,t,r,i,s){let o=this.clock.now(),c=o.toISOString(),l=Nw.DateFormatter.toLocalTimestamp(o),u=c.slice(0,10),f=`${u}T00:00:00`,d=`${l.slice(0,10)}-${l.slice(11,13)}-${l.slice(14,16)}`,h=e.replace(/\$target\.([A-Za-z_][\w]*)/g,(p,y)=>{if(!i)throw new Error(`$target.${y} substitution requires target frontmatter context; none was supplied (asset IRI: ${t})`);let g=i[y];if(g==null)throw new Error(`$target.${y} is undefined on asset ${t}`);if(Array.isArray(g))throw new Error(`$target.${y} resolved to an array on asset ${t}; only scalar properties are supported for substitution`);return String(g).replace(/^["'](.*)["']$/,"$1")});if(/\$targetFolder\b/.test(h)){if(!s)throw new Error("$targetFolder substitution requires targetFilePath context; none was supplied (asset IRI: "+t+")");let p=s.replace(/^\/+/,""),y=p.lastIndexOf("/"),g=y>=0?p.slice(0,y):"";h=h.replace(/\$targetFolder\b/g,g)}if(h=h.replace(/\$target/g,t).replace(/\$nowCompact\b/g,d).replace(/\$nowLocal/g,l).replace(/\$now/g,c).replace(/\$todayStart\b/g,f).replace(/\$today/g,u),r?.value!==void 0&&r.value!==null){let p=String(r.value);h=h.replace(/\$input\b/g,p).replace(/\$value\b/g,p)}return h}async executePropertyAppend(e,t,r,i){if(!e.targetProperty)return{success:!1,error:"property_append requires targetProperty"};if(e.appendExpression===void 0)return{success:!1,error:"property_append requires appendExpression"};let s=await this.fileReader.readFile(r),o=this.frontmatterService.parseObject(s)??{},c=this.substituteVariables(e.appendExpression,t,i,o),l=o[e.targetProperty],u=Array.isArray(l)?l:l!==void 0?[String(l)]:[],f=a(y=>y.replace(/^["'](.*)["']$/,"$1"),"stripQuotes"),d=new Set(u.map(f)),h;if(d.has(f(c)))h=u;else{let y=`"${f(c)}"`;h=[...u,y]}let p=this.frontmatterService.updateProperty(s,e.targetProperty,h);return await this.fileWriter.updateFile(r,p),{success:!0}}async executePropertyIncrement(e,t){if(!e.targetProperty)return{success:!1,error:"property_increment requires targetProperty"};let r=e.incrementBy??1;if(!Number.isFinite(r)||!Number.isInteger(r))return{success:!1,error:`property_increment: incrementBy must be an integer (got ${String(e.incrementBy)})`};let i=await this.fileReader.readFile(t),o=(this.frontmatterService.parseObject(i)??{})[e.targetProperty],c;if(o==null||o==="")c=0;else{if(Array.isArray(o))return{success:!1,error:`property_increment: targetProperty "${e.targetProperty}" is an array, expected integer`};{let f=String(o).replace(/^["'](.*)["']$/,"$1").trim();if(!/^-?\d+$/.test(f))return{success:!1,error:`property_increment: targetProperty "${e.targetProperty}" current value "${String(o)}" is not a valid integer`};c=Number.parseInt(f,10)}}let l=c+r,u=this.frontmatterService.updateProperty(i,e.targetProperty,l);return await this.fileWriter.updateFile(t,u),{success:!0}}async executePropertyShift(e,t){if(!e.targetProperty)return{success:!1,error:"property_shift requires targetProperty"};if(!e.shiftDelta)return{success:!1,error:"property_shift requires shiftDelta (ISO-8601 duration literal)"};let r=await this.fileReader.readFile(t),s=(this.frontmatterService.parseObject(r)??{})[e.targetProperty];if(s==null||s==="")return{success:!1,error:`property_shift: targetProperty "${e.targetProperty}" is not set on target asset`};if(Array.isArray(s))return{success:!1,error:`property_shift: targetProperty "${e.targetProperty}" is an array, expected single datetime`};let o=String(s).replace(/^["'](.*)["']$/,"$1").trim(),c=new Date(o);if(Number.isNaN(c.getTime()))return{success:!1,error:`property_shift: current value "${o}" is not a valid datetime`};let l;try{l=co.applyIsoDuration(c,e.shiftDelta)}catch(d){return{success:!1,error:`property_shift: invalid shiftDelta "${e.shiftDelta}": ${d instanceof Error?d.message:String(d)}`}}let u=Nw.DateFormatter.toLocalTimestamp(l),f=this.frontmatterService.updateProperty(r,e.targetProperty,u);return await this.fileWriter.updateFile(t,f),{success:!0}}async executeWorkflowTransition(e,t,r,i){if(!this.workflowResolver)return{success:!1,error:"workflow_transition requires WorkflowResolver injection (options.workflowResolver). Wire the plugin/CLI before using this grounding type."};let s=await this.fileReader.readFile(r),o=this.frontmatterService.parseObject(s)??{},c=this.resolveAssetClassFromFrontmatter(o);if(!c)return{success:!1,error:"workflow_transition: target asset has no recognised ems__* class in exo__Instance_class (cannot resolve workflow)."};let l=this.resolveStatusFromFrontmatter(o);if(!l)return{success:!1,error:"workflow_transition: target asset has no parseable ems__Effort_status value (need wikilink to an ems__EffortStatus* asset)."};let u;try{u=new O8.IRI(t)}catch(T){return{success:!1,error:`workflow_transition: invalid targetIRI "${t}" \u2014 ${T instanceof Error?T.message:String(T)}`}}let f=await this.workflowResolver.resolveForAsset(u,c),d=e.direction??"forward",h=d==="rollback",p=f.transitions.find(T=>T.from===l&&T.isRollback===h);if(!p)return{success:!1,error:`workflow_transition: no ${d} transition from "${l}" defined in workflow "${f.name}" (target class: ${c}).`};let y=vr.STATUS_UID_BY_ENUM[p.to];if(!y)return{success:!1,error:`workflow_transition: no UID mapping for destination status "${p.to}" (transition target unreachable).`};let g={id:`${e.id}.statusMutation`,label:`workflow_transition: ${p.from} \u2192 ${p.to}`,type:ci.GroundingType.PROPERTY_SET,targetProperty:"ems__Effort_status",targetValueRef:y},v=await this.executePropertySet(g,t,r,i);if(!v.success)return{success:!1,error:`workflow_transition: status mutation failed \u2014 ${v.error}`};let _=p.postActions??[],S=this.groundingLoader;if(_.length>0&&S===void 0)return{success:!1,error:"workflow_transition: transition has postActions but no GroundingLoader injected (options.groundingLoader). Wire commandResolver.loadGroundingByUid in plugin/CLI."};for(let T of _){if(S===void 0)break;let I=await S(T);if(!I)return{success:!1,error:`workflow_transition: postAction grounding UID "${T}" could not be loaded (asset missing or invalid Grounding shape).`};let A=await this.execute(I,t,r,i);if(!A.success)return{success:!1,error:`workflow_transition: postAction "${I.label}" (UID ${T}) failed \u2014 ${A.error}`}}return{success:!0}}resolveAssetClassFromFrontmatter(e){let t=e.exo__Instance_class;if(t==null)return null;let r=Array.isArray(t)?t:[t],i=new Set(Object.values(Gm.AssetClass));for(let s of r){if(typeof s!="string")continue;let o=s.replace(/^\s*"?\[\[/,"").replace(/\]\]"?\s*$/,""),l=(o.includes("|")?o.split("|")[1]:o).trim();if(i.has(l))return l;let u=o.match(/^([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/i);if(u){let f=vr.CLASS_UID_TO_LABEL[u[1].toLowerCase()];if(f&&i.has(f))return f}}return null}resolveStatusFromFrontmatter(e){let t=e.ems__Effort_status;if(t==null)return null;if(Array.isArray(t)){if(t.length!==1)return null;t=t[0]}let i=String(t).trim().replace(/^["']/,"").replace(/["']$/,"").replace(/^\[\[/,"").replace(/\]\]$/,"");if(/^ems__EffortStatus[A-Za-z]+$/.test(i))return i;if(i.includes("|")){let o=i.split("|")[1].trim();if(/^ems__EffortStatus[A-Za-z]+$/.test(o))return o}let s=i.match(/^([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/i);if(s){let o=F8[s[1].toLowerCase()];if(o)return o}return null}static applyIsoDuration(e,t){let r=t.trim();if(/^-?P(\d+Y)(\d+M)?$|^-?P\d+M$/.test(r)){let o=aP.DateTimeParsing.parseYearMonthDuration(r),c=new Date(e.getTime());return c.setMonth(c.getMonth()+o),c}let s=aP.DateTimeParsing.parseDayTimeDuration(r);return new Date(e.getTime()+s)}static extractBacklinkTarget(e,t){let r=co.resolveTargetPath(e,t),i=r.split("/").pop()??r;return co.UUID_BASENAME_RE.test(i)?i:r}static resolveTargetPath(e,t){if(t)return t.replace(/\.md$/i,"").replace(/^\/+/,"");if(e){let r=e.match(/^obsidian:\/\/vault\/(.+?)(?:\.md)?(?:\?|#|$)/i);if(r&&r[1])try{return decodeURIComponent(r[1])}catch{return r[1]}}return e}};vr.GroundingExecutor=Wm;Wm.UUID_BASENAME_RE=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;vr.GroundingExecutor=Wm=co=A8([(0,x8.injectable)(),I8("design:paramtypes",[Object,Object,qm,Function,Object])],Wm)});var fP=w(Mw=>{"use strict";Object.defineProperty(Mw,"__esModule",{value:!0});Mw.createVaultFrontmatterClassLabelResolver=M8;function M8(n){return async e=>{if(!e)return null;let t=await n.findFilesByMetadata({exo__Asset_label:e});if(t.length>0){let s=(await n.getFileMetadata(t[0])).exo__Asset_uid;if(typeof s=="string"&&s.length>0)return s}let r=await n.findFilesByMetadata({aliases:e});if(r.length>0){let s=(await n.getFileMetadata(r[0])).exo__Asset_uid;if(typeof s=="string"&&s.length>0)return s}return null}}a(M8,"createVaultFrontmatterClassLabelResolver")});var hP=w(lo=>{"use strict";var j8=lo&&lo.__decorate||function(n,e,t,r){var i=arguments.length,s=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,o;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(o=n[c])&&(s=(i<3?o(s):i>3?o(e,t,s):o(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s},$8=lo&&lo.__metadata||function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Bl;Object.defineProperty(lo,"__esModule",{value:!0});lo.NamedQueryRunner=void 0;var U8=je(),B8=Oe(),V8=qe(),dP=Fm(),G8=Rp(),jw=Bl=class{static{a(this,"NamedQueryRunner")}constructor(e,t){this.queryBodyResolver=e,this.tripleStore=t}async run(e,t={}){if(!e)return null;let r=await this.queryBodyResolver.resolveSparql(e);if(!r)return null;let i=this.substitute(r,t);return(0,dP.evaluateWithExoEval)(i,{store:this.tripleStore})}async runScalar(e,t={},r){if(!e)throw new Error("NamedQueryRunner.runScalar: empty queryUid");let i=await this.queryBodyResolver.resolveSparql(e);if(!i)throw new Error(`NamedQueryRunner: query__NamedQuery '${e}' has no resolvable SPARQL body (asset missing or no \`\`\`sparql block).`);let s=this.substitute(i,t),o=await(0,dP.evaluateWithExoEval)(s,{store:this.tripleStore});if(o.kind==="ask")return{value:o.result?"true":"false",kind:"literal"};if(o.kind==="construct")return null;let c=o.rows[0];if(!c)return null;let l=c.variables(),u=r??l[0];if(!u)return null;let f=c.get(u);return f===void 0?null:f instanceof B8.IRI?{value:(0,G8.iriToObsidianName)(f.value)??f.value,kind:"iri"}:f instanceof V8.Literal?{value:f.value,kind:"literal"}:null}substitute(e,t){let r=e;t.currentAsset&&(r=r.replace(/\$currentAsset\b/g,Bl.formatIri(t.currentAsset))),t.currentClass&&(r=r.replace(/\$currentClass\b/g,Bl.formatIri(t.currentClass)));let i=t.params;if(i){let s=Object.keys(i).sort((o,c)=>c.length-o.length);for(let o of s){let c=i[o],l=c.kind==="iri"?Bl.formatIri(c.value):`"${Bl.escapeLiteral(c.value)}"`,u=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");r=r.replace(new RegExp(`\\$${u}\\b`,"g"),l)}}return r}static formatIri(e){if(/[\s<>"{}|\\^`]/.test(e))throw new Error(`NamedQueryRunner: refusing to inject malformed IRI "${e}" \u2014 contains a character illegal in a SPARQL IRIREF (would break out of <...>). Pass a percent-encoded IRI.`);return`<${e}>`}static escapeLiteral(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t")}};lo.NamedQueryRunner=jw;lo.NamedQueryRunner=jw=Bl=j8([(0,U8.injectable)(),$8("design:paramtypes",[Object,Object])],jw)});var pP=w(zm=>{"use strict";Object.defineProperty(zm,"__esModule",{value:!0});zm.extractSparqlBlock=q8;zm.stripFrontmatter=W8;function q8(n){let e=n.match(/```sparql\s*\n([\s\S]*?)\n```/);if(!e)return null;let t=e[1].trim();return t.length>0?t:null}a(q8,"extractSparqlBlock");function W8(n){if(!n.startsWith("---"))return n;let e=n.indexOf(`
|
|
91
|
+
Details: ${t.message}`:"";console.error(`[Exocortex ERROR]${s} ${e}${o}`)}}};Bm.LoggingService=Qf;Qf.isVerbose=!1;Qf.isDevelopment=void 0});var oP=w(lc=>{"use strict";Object.defineProperty(lc,"__esModule",{value:!0});lc.registerResolver=mn;lc.getResolver=w8;lc.getRegisteredResolverIds=v8;lc.clearResolvers=E8;lc.installDefaultResolvers=T8;var Vm=new Map;function mn(n,e){Vm.set(n,e)}a(mn,"registerResolver");function w8(n){return Vm.get(n)}a(w8,"getResolver");function v8(){return Array.from(Vm.keys())}a(v8,"getRegisteredResolverIds");function E8(){Vm.clear()}a(E8,"clearResolvers");function na(n){return n<10?`0${n}`:String(n)}a(na,"pad2");function T8(){mn("today",()=>new Date().toISOString().slice(0,10)),mn("todayStart",()=>new Date(new Date().setHours(0,0,0,0)).toISOString()),mn("target",n=>n.targetIRI?`"[[${n.targetIRI}]]"`:""),mn("targetFolder",n=>{if(!n.targetFilePath)return"";let e=n.targetFilePath.replace(/^\/+/,""),t=e.lastIndexOf("/");return t>=0?e.slice(0,t):""}),mn("randomUUIDv4",()=>{if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();throw new Error("randomUUIDv4 resolver requires crypto.randomUUID() \u2014 runtime is missing Node crypto / Web Crypto API.")}),mn("nowTimestamp",()=>{let n=new Date;return`${n.getFullYear()}-${na(n.getMonth()+1)}-${na(n.getDate())}T${na(n.getHours())}:${na(n.getMinutes())}:${na(n.getSeconds())}`}),mn("nowDate",()=>{let n=new Date;return`${n.getFullYear()}-${na(n.getMonth()+1)}-${na(n.getDate())}`}),mn("nowYear",()=>String(new Date().getFullYear())),mn("nowMonth",()=>na(new Date().getMonth()+1)),mn("userInputLabel",n=>{let e=n.userInput?.label;return typeof e=="string"?e:""}),mn("userInput",(n,e)=>{if(!e)return null;let t=n.userInput?.[e];return typeof t=="string"?t:t==null?null:String(t)}),mn("targetProperty",(n,e)=>{if(!e||!n.targetFm)return null;let t=n.targetFm[e];return t==null?null:Array.isArray(t)?t.map(String):String(t)}),mn("labelAsArray",n=>{let e=n.userInput?.label;return typeof e=="string"&&e.length>0?[e]:[]}),mn("groundingTargetClass",n=>n.groundingTargetClassUid?`"[[${n.groundingTargetClassUid}]]"`:null)}a(T8,"installDefaultResolvers")});var uP=w(vr=>{"use strict";var A8=vr&&vr.__decorate||function(n,e,t,r){var i=arguments.length,s=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,o;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(o=n[c])&&(s=(i<3?o(s):i>3?o(e,t,s):o(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s},I8=vr&&vr.__metadata||function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},co;Object.defineProperty(vr,"__esModule",{value:!0});vr.GroundingExecutor=vr.ServiceRegistry=vr.CLASS_UID_TO_LABEL=vr.STATUS_UID_BY_ENUM=void 0;var x8=je(),R8=qf(),P8=km(),ci=Vo(),Gm=Jc(),C8=il(),uc=Zc(),O8=Oe(),D8=vs(),Nw=kn(),aP=jf(),Ul=ra();vr.STATUS_UID_BY_ENUM={[uc.EffortStatus.DRAFT]:"c42245d0-01de-4c35-bfcf-d910445ea28e",[uc.EffortStatus.BACKLOG]:"753a44d5-846c-4b82-9196-4fd9a4d48777",[uc.EffortStatus.ANALYSIS]:"cde3525c-57ea-4efc-b477-2e7e7ccd3a1e",[uc.EffortStatus.TODO]:"6a0e933a-6653-46f4-95ae-ed7508177c73",[uc.EffortStatus.DOING]:"027e78f4-6e16-4b36-b8fb-5510507d5745",[uc.EffortStatus.DONE]:"7b9b3116-7c3c-438c-9618-94fe301320a6",[uc.EffortStatus.TRASHED]:"5d14f18d-db2b-4847-9ac1-144cb93b2541"};var F8=Object.freeze(Object.fromEntries(Object.entries(vr.STATUS_UID_BY_ENUM).map(([n,e])=>[e,n])));vr.CLASS_UID_TO_LABEL=Object.freeze({"1b20a8f0-d745-4e93-91db-4531b3df120e":Gm.AssetClass.TASK,"7db5eeff-718a-49b0-8d2b-39b084a356e3":Gm.AssetClass.PROJECT,"1b0a5e34-dd7f-4ead-b43a-6c7c5a5ecaca":Gm.AssetClass.MEETING});var kw=oP();(0,kw.installDefaultResolvers)();function L8(n){if(n){if(n==="1b20a8f0-d745-4e93-91db-4531b3df120e")return"ems__Task";if(n==="7db5eeff-718a-49b0-8d2b-39b084a356e3")return"ems__Project";if(n==="ems__Task"||n==="ems__Project")return n}}a(L8,"resolveClassFlipTarget");var cP=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,N8=/^__SUBSTITUTE__([a-zA-Z][a-zA-Z0-9_]*)__[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}__$/,k8=/^__SUBSTITUTE_P__([a-zA-Z][a-zA-Z0-9_]*)__[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}__([A-Za-z0-9_-]*)__$/,qm=class{static{a(this,"ServiceRegistry")}constructor(){this.services=new Map}register(e,t){this.services.set(e,t)}get(e){return this.services.get(e)}has(e){return this.services.has(e)}getRegisteredIds(){return Array.from(this.services.keys())}};vr.ServiceRegistry=qm;var lP=20,Wm=co=class{static{a(this,"GroundingExecutor")}constructor(e,t,r,i,s){this.frontmatterService=new D8.FrontmatterService,this.fileReader=e,this.fileWriter=t,this.serviceRegistry=r,this.classLabelToUid=i,this.workflowResolver=s?.workflowResolver,this.groundingLoader=s?.groundingLoader,this.namedQueryRunner=s?.namedQueryRunner,this.clock=s?.clock??(0,R8.liveClock)(),this.uidGen=s?.uidGenerator??(0,P8.liveUidGenerator)()}async execute(e,t,r,i){try{switch(e.type){case ci.GroundingType.PROPERTY_SET:return await this.executePropertySet(e,t,r,i);case ci.GroundingType.PROPERTY_DELETE:return await this.executePropertyDelete(e,r);case ci.GroundingType.COMPOSITE:return await this.executeComposite(e,t,r,i,0);case ci.GroundingType.SERVICE_CALL:return await this.executeServiceCall(e,t,r,i);case ci.GroundingType.CREATE_INSTANCE:return await this.executeCreateInstance(e,t,r,i);case ci.GroundingType.PROPERTY_APPEND:return await this.executePropertyAppend(e,t,r,i);case ci.GroundingType.PROPERTY_INCREMENT:return await this.executePropertyIncrement(e,r);case ci.GroundingType.PROPERTY_SHIFT:return await this.executePropertyShift(e,r);case ci.GroundingType.SPARQL_UPDATE:return{success:!1,error:"sparql_update grounding not yet implemented. Use property_set/property_delete instead."};case ci.GroundingType.WORKFLOW_TRANSITION:return await this.executeWorkflowTransition(e,t,r,i);default:return{success:!1,error:`Unknown grounding type: ${e.type}`}}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}async executePropertySet(e,t,r,i){if(!e.targetProperty)return{success:!1,error:"property_set requires targetProperty"};let s;if([e.targetValueRef!==void 0,e.targetValueLiteral!==void 0,e.targetValueSubstitution!==void 0,e.targetValueQuery!==void 0].filter(Boolean).length>1)return{success:!1,error:"property_set: more than one of targetValueRef/targetValueLiteral/targetValueSubstitution/targetValueQuery set (cardinality 0..1 each, mutually exclusive)"};if(e.targetValueRef!==void 0)s=`"[[${e.targetValueRef}]]"`;else if(e.targetValueLiteral!==void 0)s=e.targetValueLiteral;else if(e.targetValueSubstitution!==void 0)s=e.targetValueSubstitution;else if(e.targetValueQuery!==void 0){let d=await this.resolveTargetValueQuery(e.targetValueQuery,t);if(!d.success)return d;s=d.value}else return{success:!1,error:"property_set requires one of targetValueRef/targetValueLiteral/targetValueSubstitution/targetValueQuery"};if(/\$(input|value)\b/.test(s)&&(i===void 0||i.value===void 0||i.value===null))return{success:!1,error:"property_set: substituted value contains $input/$value placeholder but no userInput.value provided"};let l=this.substituteVariables(s,t,i),u=await this.fileReader.readFile(r),f=this.frontmatterService.updateProperty(u,e.targetProperty,l);return await this.fileWriter.updateFile(r,f),{success:!0}}async resolveTargetValueQuery(e,t){if(!this.namedQueryRunner)return{success:!1,error:"property_set targetValueQuery requires NamedQueryRunner injection (options.namedQueryRunner). Wire the plugin/CLI before using this value-source."};let r;try{r=await this.namedQueryRunner.runScalar(e,{currentAsset:t})}catch(s){return{success:!1,error:`property_set targetValueQuery: NamedQuery '${e}' failed \u2014 ${s instanceof Error?s.message:String(s)}`}}return r===null?{success:!1,error:`property_set targetValueQuery: NamedQuery '${e}' returned no scalar value (empty result set or non-scalar shape).`}:{success:!0,value:r.kind==="iri"?`"[[${r.value}]]"`:r.value}}async executePropertyDelete(e,t){if(!e.targetProperty)return{success:!1,error:"property_delete requires targetProperty"};let r=await this.fileReader.readFile(t),i=this.frontmatterService.removeProperty(r,e.targetProperty);return await this.fileWriter.updateFile(t,i),{success:!0}}async executeComposite(e,t,r,i,s){if(s>=lP)return{success:!1,error:`Composite grounding exceeded maximum depth of ${lP}`};let o=e.steps??[];if(o.length===0)return{success:!0};let c;try{c=await this.fileReader.readFile(r)}catch{}let l=[];try{for(let u=0;u<o.length;u++){let f=o[u],d=await this.executeStep(f,t,r,i,s+1);if(!d.success)return await this.rollback(c,r,l),{success:!1,error:`Composite step ${u} failed: ${d.error}`};l.push(u)}return{success:!0}}catch(u){return await this.rollback(c,r,l),{success:!1,error:`Composite execution failed: ${u instanceof Error?u.message:String(u)}`}}}async executeServiceCall(e,t,r,i){let s=e.targetProperty;if(!s)return{success:!1,error:"service_call requires targetProperty as serviceId"};if(s==="convertToTask")return await this.executeConvertToTask(r);if(s==="updateProperty"){let l=L8(e.targetValueRef);if(l==="ems__Task")return await this.executeConvertToTask(r);if(l==="ems__Project")return await this.executeConvertToProject(r)}let o=this.serviceRegistry.get(s);if(!o)return{success:!1,error:`Service not found: "${s}". Registered services: ${this.serviceRegistry.getRegisteredIds().join(", ")||"none"}`};let c=i;if(e.isDefinedBy&&(c={isDefinedBy:e.isDefinedBy,...c??{}}),e.serviceCallPayload)try{let l=this.substituteVariables(e.serviceCallPayload,t,i),u=JSON.parse(l);typeof u=="object"&&u!==null&&(c={...u,...c??{}})}catch{}return await o.execute(t,c),{success:!0}}async executeConvertToTask(e){let t=await this.fileReader.readFile(e),r=await this.resolveClassRefToUid("ems__Task"),i=this.frontmatterService.updateProperty(t,"exo__Instance_class",`["[[${r}]]"]`);return await this.fileWriter.updateFile(e,i),{success:!0}}async executeConvertToProject(e){let t=await this.fileReader.readFile(e),r=await this.resolveClassRefToUid("ems__Project"),i=this.frontmatterService.updateProperty(t,"exo__Instance_class",`["[[${r}]]"]`);return await this.fileWriter.updateFile(e,i),{success:!0}}async executeCreateInstance(e,t,r,i){if(!e.targetFolder)return{success:!1,error:"create_instance requires targetFolder"};let s={},o=null;if((e.inheritanceRule&&e.inheritanceRule.length>0||e.propertyDefault&&e.propertyDefault.some(y=>typeof y.value=="string"&&y.value.includes("__SUBSTITUTE"))||e.labelTemplate!==void 0&&/\$target\./.test(e.labelTemplate))&&t&&r){let y;try{y=await this.fileReader.readFile(r)}catch(g){return{success:!1,error:`create_instance: failed to read $target file "${r}": ${g instanceof Error?g.message:String(g)}`}}o=this.frontmatterService.parseObject(y)??null}let l;e.targetClass&&(l=await this.resolveClassRefToUid(e.targetClass));let u={userInput:i,targetIRI:t,targetFilePath:r,targetFm:o??void 0,groundingTargetClassUid:l};if(e.propertyDefault&&e.propertyDefault.length>0&&this.applyPropertyDefaultStep(s,e.propertyDefault,u),this.applyMissingScalarPrimitives(s,i,l,e,t,o,r),i)for(let[y,g]of Object.entries(i))y!=="label"&&g!=null&&(s[y]=g);if(e.inheritanceRule&&e.inheritanceRule.length>0&&o&&await this.applyInheritanceRuleStep(s,e.inheritanceRule,o),this.applyMissingBacklinkTopUp(s,e,t,r),t&&e.linkBackProperty&&s[e.linkBackProperty]===void 0){let y=co.extractBacklinkTarget(t,r);s[e.linkBackProperty]=`"[[${y}]]"`}let f=s.exo__Asset_uid,d=this.frontmatterService.createFrontmatter("",s),h=this.substituteVariables(e.targetFolder,t,i,void 0,r),p=h?`${h}/${f}.md`:`${f}.md`;return await this.fileWriter.createFile(p,d),{success:!0,openPath:p}}async resolveClassRefToUid(e){if(cP.test(e)||!this.classLabelToUid)return e;try{let t=await this.classLabelToUid(e);return t&&t.length>0?t:e}catch{return e}}applyPropertyDefaultStep(e,t,r){for(let{propertyName:i,value:s}of t){if(e[i]!==void 0)continue;let o=this.resolveSubstitutionMarker(s,r);if(o!=null){if(Array.isArray(o)){if(o.length===0)continue;e[i]=o;continue}if(i==="exo__Instance_class"&&typeof o=="string"){e[i]=[o];continue}e[i]=o}}}applyMissingScalarPrimitives(e,t,r,i,s,o,c){let l=[];e.exo__Asset_uid===void 0&&(e.exo__Asset_uid=this.uidGen.next(),l.push("exo__Asset_uid")),e.exo__Asset_createdAt===void 0&&(e.exo__Asset_createdAt=Nw.DateFormatter.toLocalTimestamp(this.clock.now()),l.push("exo__Asset_createdAt"));let u=typeof e.exo__Asset_label=="string"&&e.exo__Asset_label.trim().length===0;if(e.exo__Asset_label===void 0||u){let f=t?.label;if(f===void 0&&i?.labelTemplate)try{let h=this.substituteVariables(i.labelTemplate,s??"",t,o??void 0,c);h.trim().length>0&&(f=h)}catch(h){Ul.LoggingService.error(`[GroundingExecutor] labelTemplate substitution failed: ${h instanceof Error?h.message:String(h)}. Falling back to "Untitled".`)}let d=f??"Untitled";e.exo__Asset_label=d,d!=="Untitled"&&e.aliases===void 0&&(e.aliases=[d]),l.push("exo__Asset_label")}e.exo__Instance_class===void 0&&r&&(e.exo__Instance_class=[`"[[${r}]]"`],l.push("exo__Instance_class")),l.length>0&&Ul.LoggingService.error(`[GroundingExecutor] Universal Default Template did not cover essential scalar primitives: ${l.join(", ")}. Filled from legacy TS fallback. Vault may be in an unhealthy state \u2014 verify UniversalDefaultTemplate singleton is present and complete.`)}applyMissingBacklinkTopUp(e,t,r,i){if(!r||t.linkBackProperty||e.exo__Asset_prototype!==void 0||e.ems__Effort_parent!==void 0)return;let s=co.extractBacklinkTarget(r,i);e.exo__Asset_prototype=`"[[${s}]]"`,Ul.LoggingService.error("[GroundingExecutor] No backlink rule fired (Universal IRs absent or no class match). Falling back to legacy exo__Asset_prototype default. Bug #5 may surface if target is not a prototype-instance.")}resolveSubstitutionMarker(e,t){let r=e.match(k8);if(r){let c=r[1],l=r[2],u=co.decodeBase64UrlSafe(l),f=(0,kw.getResolver)(c);return f?f(t,u):(Ul.LoggingService.warn(`[GroundingExecutor] Parameterised marker references unknown resolver '${c}' \u2014 value left as marker.`),e)}let i=e.match(N8);if(!i)return e;let s=i[1];if(s==="target"){let c=t.targetIRI??"",l=t.targetFilePath??"";return`"[[${co.extractBacklinkTarget(c,l)}]]"`}if(s==="targetFolder"){let c=t.targetFilePath??"";if(!c)return"";let l=c.replace(/^\/+/,""),u=l.lastIndexOf("/");return u>=0?l.slice(0,u):""}let o=(0,kw.getResolver)(s);return o?o(t):(Ul.LoggingService.warn(`[GroundingExecutor] Marker references unknown resolver '${s}' \u2014 value left as marker.`),e)}static decodeBase64UrlSafe(e){return(0,C8.base64ToUtf8)(e.replace(/-/g,"+").replace(/_/g,"/"))}async applyInheritanceRuleStep(e,t,r){let i=this.extractTargetClassNames(r),s=[];for(let o of t)!await this.inheritanceConditionMatches(o.targetClassCondition,o.targetClassConditionUid,i)||await this.inheritanceExclusionMatches(o.targetClassExclusion,o.targetClassExclusionUids,i)||s.push(o);s.sort((o,c)=>c.priority-o.priority);for(let o of s){if(e[o.targetPropertyName]!==void 0)continue;let c=r[o.sourcePropertyName];c!=null&&(e[o.targetPropertyName]=this.formatInheritedValue(c))}}async inheritanceConditionMatches(e,t,r){return!e&&!t?!0:this.classRefMatchesAny(e,t,r)}async inheritanceExclusionMatches(e,t,r){for(let i of t??[])if(i&&r.includes(i))return!0;for(let i of e)if(await this.classRefMatchesAny(i,void 0,r))return!0;return!1}async classRefMatchesAny(e,t,r){if(t&&r.includes(t)||e&&r.includes(e))return!0;if(e&&this.classLabelToUid)try{let i=await this.classLabelToUid(e);if(i&&i.length>0&&r.includes(i))return!0}catch{}return!1}extractTargetClassNames(e){let t=e.exo__Instance_class;if(t==null)return[];let r=Array.isArray(t)?t:[t],i=[];for(let s of r){let o=this.extractWikilinkInner(String(s));o&&i.push(o)}return i}extractWikilinkInner(e){let t=e.match(/\[\[([^\]|]+)(?:\|[^\]]*)?\]\]/);return t?t[1].trim():e.replace(/^["']|["']$/g,"").trim()}formatInheritedValue(e){return Array.isArray(e)?e.map(t=>this.formatInheritedScalar(String(t))):this.formatInheritedScalar(String(e))}formatInheritedScalar(e){return/^"?\[\[.+\]\]"?$/.test(e)?this.reformatWikilink(e):cP.test(e)?`"[[${e}]]"`:e}reformatWikilink(e){return e.startsWith('"[[')&&e.endsWith(']]"')?e:e.startsWith("[[")&&e.endsWith("]]")?`"${e}"`:e}async executeStep(e,t,r,i,s){return e.type===ci.GroundingType.COMPOSITE?this.executeComposite(e,t,r,i,s):this.execute(e,t,r,i)}async rollback(e,t,r){if(e!==void 0)try{await this.fileWriter.updateFile(t,e)}catch(i){Ul.LoggingService.error(`[GroundingExecutor] Rollback failed for ${t}`,i instanceof Error?i:new Error(String(i)))}}substituteVariables(e,t,r,i,s){let o=this.clock.now(),c=o.toISOString(),l=Nw.DateFormatter.toLocalTimestamp(o),u=c.slice(0,10),f=`${u}T00:00:00`,d=`${l.slice(0,10)}-${l.slice(11,13)}-${l.slice(14,16)}`,h=e.replace(/\$target\.([A-Za-z_][\w]*)/g,(p,y)=>{if(!i)throw new Error(`$target.${y} substitution requires target frontmatter context; none was supplied (asset IRI: ${t})`);let g=i[y];if(g==null)throw new Error(`$target.${y} is undefined on asset ${t}`);if(Array.isArray(g))throw new Error(`$target.${y} resolved to an array on asset ${t}; only scalar properties are supported for substitution`);return String(g).replace(/^["'](.*)["']$/,"$1")});if(/\$targetFolder\b/.test(h)){if(!s)throw new Error("$targetFolder substitution requires targetFilePath context; none was supplied (asset IRI: "+t+")");let p=s.replace(/^\/+/,""),y=p.lastIndexOf("/"),g=y>=0?p.slice(0,y):"";h=h.replace(/\$targetFolder\b/g,g)}if(h=h.replace(/\$target/g,t).replace(/\$nowCompact\b/g,d).replace(/\$nowLocal/g,l).replace(/\$now/g,c).replace(/\$todayStart\b/g,f).replace(/\$today/g,u),r?.value!==void 0&&r.value!==null){let p=String(r.value);h=h.replace(/\$input\b/g,p).replace(/\$value\b/g,p)}return h}async executePropertyAppend(e,t,r,i){if(!e.targetProperty)return{success:!1,error:"property_append requires targetProperty"};if(e.appendExpression===void 0)return{success:!1,error:"property_append requires appendExpression"};let s=await this.fileReader.readFile(r),o=this.frontmatterService.parseObject(s)??{},c=this.substituteVariables(e.appendExpression,t,i,o),l=o[e.targetProperty],u=Array.isArray(l)?l:l!==void 0?[String(l)]:[],f=a(y=>y.replace(/^["'](.*)["']$/,"$1"),"stripQuotes"),d=new Set(u.map(f)),h;if(d.has(f(c)))h=u;else{let y=`"${f(c)}"`;h=[...u,y]}let p=this.frontmatterService.updateProperty(s,e.targetProperty,h);return await this.fileWriter.updateFile(r,p),{success:!0}}async executePropertyIncrement(e,t){if(!e.targetProperty)return{success:!1,error:"property_increment requires targetProperty"};let r=e.incrementBy??1;if(!Number.isFinite(r)||!Number.isInteger(r))return{success:!1,error:`property_increment: incrementBy must be an integer (got ${String(e.incrementBy)})`};let i=await this.fileReader.readFile(t),o=(this.frontmatterService.parseObject(i)??{})[e.targetProperty],c;if(o==null||o==="")c=0;else{if(Array.isArray(o))return{success:!1,error:`property_increment: targetProperty "${e.targetProperty}" is an array, expected integer`};{let f=String(o).replace(/^["'](.*)["']$/,"$1").trim();if(!/^-?\d+$/.test(f))return{success:!1,error:`property_increment: targetProperty "${e.targetProperty}" current value "${String(o)}" is not a valid integer`};c=Number.parseInt(f,10)}}let l=c+r,u=this.frontmatterService.updateProperty(i,e.targetProperty,l);return await this.fileWriter.updateFile(t,u),{success:!0}}async executePropertyShift(e,t){if(!e.targetProperty)return{success:!1,error:"property_shift requires targetProperty"};if(!e.shiftDelta)return{success:!1,error:"property_shift requires shiftDelta (ISO-8601 duration literal)"};let r=await this.fileReader.readFile(t),s=(this.frontmatterService.parseObject(r)??{})[e.targetProperty];if(s==null||s==="")return{success:!1,error:`property_shift: targetProperty "${e.targetProperty}" is not set on target asset`};if(Array.isArray(s))return{success:!1,error:`property_shift: targetProperty "${e.targetProperty}" is an array, expected single datetime`};let o=String(s).replace(/^["'](.*)["']$/,"$1").trim(),c=new Date(o);if(Number.isNaN(c.getTime()))return{success:!1,error:`property_shift: current value "${o}" is not a valid datetime`};let l;try{l=co.applyIsoDuration(c,e.shiftDelta)}catch(d){return{success:!1,error:`property_shift: invalid shiftDelta "${e.shiftDelta}": ${d instanceof Error?d.message:String(d)}`}}let u=Nw.DateFormatter.toLocalTimestamp(l),f=this.frontmatterService.updateProperty(r,e.targetProperty,u);return await this.fileWriter.updateFile(t,f),{success:!0}}async executeWorkflowTransition(e,t,r,i){if(!this.workflowResolver)return{success:!1,error:"workflow_transition requires WorkflowResolver injection (options.workflowResolver). Wire the plugin/CLI before using this grounding type."};let s=await this.fileReader.readFile(r),o=this.frontmatterService.parseObject(s)??{},c=this.resolveAssetClassFromFrontmatter(o);if(!c)return{success:!1,error:"workflow_transition: target asset has no recognised ems__* class in exo__Instance_class (cannot resolve workflow)."};let l=this.resolveStatusFromFrontmatter(o);if(!l)return{success:!1,error:"workflow_transition: target asset has no parseable ems__Effort_status value (need wikilink to an ems__EffortStatus* asset)."};let u;try{u=new O8.IRI(t)}catch(T){return{success:!1,error:`workflow_transition: invalid targetIRI "${t}" \u2014 ${T instanceof Error?T.message:String(T)}`}}let f=await this.workflowResolver.resolveForAsset(u,c),d=e.direction??"forward",h=d==="rollback",p=f.transitions.find(T=>T.from===l&&T.isRollback===h);if(!p)return{success:!1,error:`workflow_transition: no ${d} transition from "${l}" defined in workflow "${f.name}" (target class: ${c}).`};let y=vr.STATUS_UID_BY_ENUM[p.to];if(!y)return{success:!1,error:`workflow_transition: no UID mapping for destination status "${p.to}" (transition target unreachable).`};let g={id:`${e.id}.statusMutation`,label:`workflow_transition: ${p.from} \u2192 ${p.to}`,type:ci.GroundingType.PROPERTY_SET,targetProperty:"ems__Effort_status",targetValueRef:y},v=await this.executePropertySet(g,t,r,i);if(!v.success)return{success:!1,error:`workflow_transition: status mutation failed \u2014 ${v.error}`};let _=p.postActions??[],S=this.groundingLoader;if(_.length>0&&S===void 0)return{success:!1,error:"workflow_transition: transition has postActions but no GroundingLoader injected (options.groundingLoader). Wire commandResolver.loadGroundingByUid in plugin/CLI."};for(let T of _){if(S===void 0)break;let I=await S(T);if(!I)return{success:!1,error:`workflow_transition: postAction grounding UID "${T}" could not be loaded (asset missing or invalid Grounding shape).`};let A=await this.execute(I,t,r,i);if(!A.success)return{success:!1,error:`workflow_transition: postAction "${I.label}" (UID ${T}) failed \u2014 ${A.error}`}}return{success:!0}}resolveAssetClassFromFrontmatter(e){let t=e.exo__Instance_class;if(t==null)return null;let r=Array.isArray(t)?t:[t],i=new Set(Object.values(Gm.AssetClass));for(let s of r){if(typeof s!="string")continue;let o=s.replace(/^\s*"?\[\[/,"").replace(/\]\]"?\s*$/,""),l=(o.includes("|")?o.split("|")[1]:o).trim();if(i.has(l))return l;let u=o.match(/^([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/i);if(u){let f=vr.CLASS_UID_TO_LABEL[u[1].toLowerCase()];if(f&&i.has(f))return f}}return null}resolveStatusFromFrontmatter(e){let t=e.ems__Effort_status;if(t==null)return null;if(Array.isArray(t)){if(t.length!==1)return null;t=t[0]}let i=String(t).trim().replace(/^["']/,"").replace(/["']$/,"").replace(/^\[\[/,"").replace(/\]\]$/,"");if(/^ems__EffortStatus[A-Za-z]+$/.test(i))return i;if(i.includes("|")){let o=i.split("|")[1].trim();if(/^ems__EffortStatus[A-Za-z]+$/.test(o))return o}let s=i.match(/^([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/i);if(s){let o=F8[s[1].toLowerCase()];if(o)return o}return null}static applyIsoDuration(e,t){let r=t.trim();if(/^-?P(\d+Y)(\d+M)?$|^-?P\d+M$/.test(r)){let o=aP.DateTimeParsing.parseYearMonthDuration(r),c=new Date(e.getTime());return c.setMonth(c.getMonth()+o),c}let s=aP.DateTimeParsing.parseDayTimeDuration(r);return new Date(e.getTime()+s)}static extractBacklinkTarget(e,t){let r=co.resolveTargetPath(e,t),i=r.split("/").pop()??r;return co.UUID_BASENAME_RE.test(i)?i:r}static resolveTargetPath(e,t){if(t)return t.replace(/\.md$/i,"").replace(/^\/+/,"");if(e){let r=e.match(/^obsidian:\/\/vault\/(.+?)(?:\.md)?(?:\?|#|$)/i);if(r&&r[1])try{return decodeURIComponent(r[1])}catch{return r[1]}}return e}};vr.GroundingExecutor=Wm;Wm.UUID_BASENAME_RE=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;vr.GroundingExecutor=Wm=co=A8([(0,x8.injectable)(),I8("design:paramtypes",[Object,Object,qm,Function,Object])],Wm)});var fP=w(Mw=>{"use strict";Object.defineProperty(Mw,"__esModule",{value:!0});Mw.createVaultFrontmatterClassLabelResolver=M8;function M8(n){return async e=>{if(!e)return null;let t=await n.findFilesByMetadata({exo__Asset_label:e});if(t.length>0){let s=(await n.getFileMetadata(t[0])).exo__Asset_uid;if(typeof s=="string"&&s.length>0)return s}let r=await n.findFilesByMetadata({aliases:e});if(r.length>0){let s=(await n.getFileMetadata(r[0])).exo__Asset_uid;if(typeof s=="string"&&s.length>0)return s}return null}}a(M8,"createVaultFrontmatterClassLabelResolver")});var hP=w(lo=>{"use strict";var j8=lo&&lo.__decorate||function(n,e,t,r){var i=arguments.length,s=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,o;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(o=n[c])&&(s=(i<3?o(s):i>3?o(e,t,s):o(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s},$8=lo&&lo.__metadata||function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Bl;Object.defineProperty(lo,"__esModule",{value:!0});lo.NamedQueryRunner=void 0;var U8=je(),B8=Oe(),V8=qe(),dP=Fm(),G8=Rp(),jw=Bl=class{static{a(this,"NamedQueryRunner")}constructor(e,t){this.queryBodyResolver=e,this.tripleStore=t}async run(e,t={}){if(!e)return null;let r=await this.queryBodyResolver.resolveSparql(e);if(!r)return null;let i=this.substitute(r,t);return(0,dP.evaluateWithExoEval)(i,{store:this.tripleStore})}async runScalar(e,t={},r){if(!e)throw new Error("NamedQueryRunner.runScalar: empty queryUid");let i=await this.queryBodyResolver.resolveSparql(e);if(!i)throw new Error(`NamedQueryRunner: query__NamedQuery '${e}' has no resolvable SPARQL body (asset missing or no \`\`\`sparql block).`);let s=this.substitute(i,t),o=await(0,dP.evaluateWithExoEval)(s,{store:this.tripleStore});if(o.kind==="ask")return{value:o.result?"true":"false",kind:"literal"};if(o.kind==="construct")return null;let c=o.rows[0];if(!c)return null;let l=c.variables(),u=r??l[0];if(!u)return null;let f=c.get(u);return f===void 0?null:f instanceof B8.IRI?{value:(0,G8.iriToObsidianName)(f.value)??f.value,kind:"iri"}:f instanceof V8.Literal?{value:f.value,kind:"literal"}:null}substitute(e,t){let r=e;t.currentAsset&&(r=r.replace(/\$currentAsset\b/g,Bl.formatIri(t.currentAsset))),t.currentClass&&(r=r.replace(/\$currentClass\b/g,Bl.formatIri(t.currentClass)));let i=t.params;if(i){let s=Object.keys(i).sort((o,c)=>c.length-o.length);for(let o of s){let c=i[o],l=c.kind==="iri"?Bl.formatIri(c.value):`"${Bl.escapeLiteral(c.value)}"`,u=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");r=r.replace(new RegExp(`\\$${u}\\b`,"g"),l)}}return r}static formatIri(e){if(/[\s<>"{}|\\^`]/.test(e))throw new Error(`NamedQueryRunner: refusing to inject malformed IRI "${e}" \u2014 contains a character illegal in a SPARQL IRIREF (would break out of <...>). Pass a percent-encoded IRI.`);return`<${e}>`}static escapeLiteral(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t")}};lo.NamedQueryRunner=jw;lo.NamedQueryRunner=jw=Bl=j8([(0,U8.injectable)(),$8("design:paramtypes",[Object,Object])],jw)});var pP=w(zm=>{"use strict";Object.defineProperty(zm,"__esModule",{value:!0});zm.extractSparqlBlock=q8;zm.stripFrontmatter=W8;function q8(n){let e=n.match(/```sparql\s*\n([\s\S]*?)\n```/);if(!e)return null;let t=e[1].trim();return t.length>0?t:null}a(q8,"extractSparqlBlock");function W8(n){if(!n.startsWith("---"))return n;let e=n.indexOf(`
|
|
92
92
|
---`,3);return e<0?n:n.slice(e+4)}a(W8,"stripFrontmatter")});var mP=w(uo=>{"use strict";var z8=uo&&uo.__decorate||function(n,e,t,r){var i=arguments.length,s=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,o;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(o=n[c])&&(s=(i<3?o(s):i>3?o(e,t,s):o(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s},H8=uo&&uo.__metadata||function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},$w;Object.defineProperty(uo,"__esModule",{value:!0});uo.CommandExecutionFlow=void 0;var K8=je(),Q8=Vo(),X8=Oe(),Y8=qe(),J8=Jt(),Z8=kn(),Uw=$w=class{static{a(this,"CommandExecutionFlow")}constructor(e,t,r,i,s,o){this.groundingExecutor=e,this.notificationService=t,this.logger=r,this.prompts=i,this.tripleStore=s,this.fileOpener=o}async run(e,t){let{command:r}=e;if(r.confirmMessage&&!await this.prompts.confirm(r.confirmMessage))return;let i=t.injectedUserInput,s=$w.extractInputSchema(e);if(s!==null&&s.length>0){let l=await this.applyLabelDatePrefill(s,r.grounding,t.targetIRI),u=await this.prompts.promptInputSchema(l);if(u===null)return;i={...t.injectedUserInput??{},...u}}let o=await this.groundingExecutor.execute(r.grounding,t.targetIRI??"",t.filePath??"",i),c=t.filePath??"<no-file>";if(o.success){if(r.successMessage&&this.notificationService.success(r.successMessage),await new Promise(l=>setTimeout(l,100)),t.onComplete&&await t.onComplete(),o.openPath&&this.fileOpener)try{await this.fileOpener.open(o.openPath,{sameTab:r.openInSameTab})}catch(l){this.logger.info(`[CommandExecutionFlow] Failed to open created file "${o.openPath}": ${l instanceof Error?l.message:String(l)}`)}this.logger.info(`[CommandExecutionFlow] Executed "${r.name}" on ${c}`)}else this.notificationService.error(`Command failed: ${o.error??"unknown error"}`),this.logger.info(`[CommandExecutionFlow] Failed "${r.name}": ${o.error}`)}static extractInputSchema(e){let r=e.command.grounding.inputSchema;return!r||!Array.isArray(r)?null:r}async applyLabelDatePrefill(e,t,r){if(t.type!==Q8.GroundingType.CREATE_INSTANCE||!t.prefillLabelWithDate||!r||!this.tripleStore)return e;let i=await this.resolveAssetLabel(r);if(!i)return e;let s=Z8.DateFormatter.toDateString(new Date),o=`${i} ${s}`;return e.map(c=>{if(typeof c!="object"||c===null)return c;let l=c;if(l.name!=="label")return c;let u=l.defaultValue;return typeof u=="string"&&u.length>0?c:{...l,defaultValue:o}})}async resolveAssetLabel(e){if(!this.tripleStore)return;let t=new X8.IRI(e),r=await this.tripleStore.match(t,J8.Namespace.EXO.term("Asset_label"),void 0);if(r.length===0)return;let i=r[0].object;if(i instanceof Y8.Literal)return i.value.length>0?i.value:void 0}};uo.CommandExecutionFlow=Uw;uo.CommandExecutionFlow=Uw=$w=z8([(0,K8.injectable)(),H8("design:paramtypes",[Function,Object,Object,Object,Object,Object])],Uw)});var Xf=w(fo=>{"use strict";var eU=fo&&fo.__decorate||function(n,e,t,r){var i=arguments.length,s=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,o;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(o=n[c])&&(s=(i<3?o(s):i>3?o(e,t,s):o(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s},tU=fo&&fo.__metadata||function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)};Object.defineProperty(fo,"__esModule",{value:!0});fo.WorkflowEngine=void 0;var rU=je(),Bw=class{static{a(this,"WorkflowEngine")}constructor(e){this.definition=e}getAvailableTransitions(e){return this.definition.transitions.filter(t=>t.from===e&&!t.isRollback)}getRollbackTransitions(e){return this.definition.transitions.filter(t=>t.from===e&&t.isRollback)}getAllTransitions(e){return this.definition.transitions.filter(t=>t.from===e)}canTransition(e,t){return this.definition.transitions.some(r=>r.from===e&&r.to===t)}getPreviousStatus(e){return this.definition.transitions.find(r=>r.from===e&&r.isRollback)?.to??null}getNextStates(e){return this.getAvailableTransitions(e).map(t=>t.to)}isTerminalState(e){return this.definition.terminalStates.includes(e)}isInitialState(e){return this.definition.initialState===e}getTimestampsForStatus(e){return this.definition.states.find(r=>r.status===e)?.timestampOnEnter??[]}getTransition(e,t){return this.definition.transitions.find(r=>r.from===e&&r.to===t)}getOrderedStates(){return this.definition.states.map(e=>e.status)}getDefinition(){return this.definition}validate(){let e=[],t=new Set(this.definition.states.map(i=>i.status));this.definition.states.length===0&&e.push("Workflow must have at least one state"),t.has(this.definition.initialState)||e.push(`Initial state "${this.definition.initialState}" is not in the states list`);for(let i of this.definition.terminalStates)t.has(i)||e.push(`Terminal state "${i}" is not in the states list`);for(let i of this.definition.transitions)t.has(i.from)||e.push(`Transition "${i.label}" references unknown source state "${i.from}"`),t.has(i.to)||e.push(`Transition "${i.label}" references unknown target state "${i.to}"`);for(let i of this.definition.states){if(this.definition.terminalStates.includes(i.status))continue;this.definition.transitions.filter(o=>o.from===i.status&&!o.isRollback).length===0&&e.push(`State "${i.status}" has no outgoing forward transitions (dead end)`)}let r=new Set;for(let i of this.definition.transitions){let s=`${i.from}\u2192${i.to}`;r.has(s)&&e.push(`Duplicate transition: ${s}`),r.add(s)}return{valid:e.length===0,errors:e}}};fo.WorkflowEngine=Bw;fo.WorkflowEngine=Bw=eU([(0,rU.injectable)(),tU("design:paramtypes",[Object])],Bw)});var gP=w(Es=>{"use strict";Object.defineProperty(Es,"__esModule",{value:!0});Es.EFFORT_WORKFLOW_PROPERTY=Es.WorkflowTransitionProperty=Es.WorkflowStateProperty=Es.WorkflowProperty=void 0;Es.WorkflowProperty={TARGET_CLASS:"ems__Workflow_targetClass",INITIAL_STATE:"ems__Workflow_initialState",TERMINAL_STATES:"ems__Workflow_terminalStates",IS_DEFAULT:"ems__Workflow_isDefault"};Es.WorkflowStateProperty={WORKFLOW:"ems__WorkflowState_workflow",STATUS:"ems__WorkflowState_status",ORDER:"ems__WorkflowState_order",OPTIONAL:"ems__WorkflowState_optional",TIMESTAMP_ON_ENTER:"ems__WorkflowState_timestampOnEnter",BADGE_COLOR:"ems__WorkflowState_badgeColor"};Es.WorkflowTransitionProperty={WORKFLOW:"ems__WorkflowTransition_workflow",FROM:"ems__WorkflowTransition_from",TO:"ems__WorkflowTransition_to",LABEL:"ems__WorkflowTransition_label",ICON:"ems__WorkflowTransition_icon",IS_ROLLBACK:"ems__WorkflowTransition_isRollback"};Es.EFFORT_WORKFLOW_PROPERTY="ems__Effort_workflow"});var ho=w(Hm=>{"use strict";Object.defineProperty(Hm,"__esModule",{value:!0});Hm.MetadataHelpers=void 0;var yP=Hf(),Vw=class{static{a(this,"MetadataHelpers")}static findAllReferencingProperties(e,t){let r=[];for(let[i,s]of Object.entries(e))this.containsReference(s,t)&&r.push(i);return r}static findReferencingProperty(e,t){for(let[r,i]of Object.entries(e))if(this.containsReference(i,t))return r}static containsReference(e,t){if(!e)return!1;let r=t.replace(/\.md$/,"");if(typeof e=="string"){let i=/\[\[([^[\]]+)\]\]/g,s;for(;(s=i.exec(e))!==null;){let c=s[1].split("|")[0].trim();if(c===r||c.endsWith(`/${r}`))return!0}return!1}return Array.isArray(e)?e.some(i=>this.containsReference(i,t)):!1}static isAssetArchived(e){let t=e?.exo__Asset_isArchived;if(t!=null){if(t===!0||t===1)return!0;if(typeof t=="string"){let i=t.toLowerCase().trim();if(i==="true"||i==="yes"||i==="1")return!0}if(typeof t=="boolean")return t}let r=e?.archived;if(r==null)return!1;if(typeof r=="boolean")return r;if(typeof r=="number")return r!==0;if(typeof r=="string"){let i=r.toLowerCase().trim();return i==="true"||i==="yes"||i==="1"}return!1}static getPropertyValue(e,t){return t==="Name"||t==="title"?e.title:t==="created"?e.created:t==="modified"?e.modified:t==="path"?e.path:e.metadata?.[t]}static ensureQuoted(e){return!e||e==='""'?'""':e.startsWith('"')&&e.endsWith('"')?e:`"${e}"`}static buildFileContent(e,t){let r=(0,yP.orderProperties)(e,(0,yP.loadDefaultSpec)()),i=Object.entries(r).map(([c,l])=>{if(Array.isArray(l)){let u=l.map(f=>` - ${String(f)}`).join(`
|
|
93
93
|
`);return`${c}:
|
|
94
94
|
${u}`}return`${c}: ${String(l)}`}).join(`
|
|
@@ -775,7 +775,7 @@ Next steps:
|
|
|
775
775
|
`),process.stdout.write(` File: ${e.file}
|
|
776
776
|
`),process.stdout.write(` Commit: ${e.sha}
|
|
777
777
|
`),process.stdout.write(` URL: ${e.url}
|
|
778
|
-
`)),process.exit(0)}catch(e){let t=e instanceof Error?e:new Error(String(e)),r=new vi;t.message=r.redact(t.message),t.stack&&(t.stack=r.redact(t.stack)),le.handle(t)}})}a(Mie,"restPushCommand");var jo=require("node:fs"),A4=require("node:crypto"),Ei=J(require("node:path"));var Ti=J(tt());var jie=a(async n=>{let e=await A4.webcrypto.subtle.digest("SHA-1",n.buffer.slice(n.byteOffset,n.byteOffset+n.byteLength));return[...new Uint8Array(e)].map(t=>t.toString(16).padStart(2,"0")).join("")},"nodeSha1"),$ie={parse:a(n=>Nt.load(n,{schema:Nt.CORE_SCHEMA}),"parse"),stringify:a(n=>Nt.dump(n,{schema:Nt.CORE_SCHEMA,lineWidth:-1}),"stringify")};function Uie(n,e){if(n.tokenFromGh===!0)return vi.resolveGhToken(e.ghTokenRunner);let t=e.env??process.env,r=n.token||t.GITHUB_TOKEN||t.GH_TOKEN||"";if(r.length===0)throw new Error("A GitHub token is required (private sync units read as 404 without one). Use --token-from-gh, --token <pat>, or set GITHUB_TOKEN / GH_TOKEN.");return r}a(Uie,"resolveToken");function Bie(n){let e=a(r=>Ei.join(n,r),"abs"),t=a(async(r,i)=>{let s;try{s=await jo.promises.readdir(r,{withFileTypes:!0})}catch{return}for(let o of s){let c=Ei.join(r,o.name);if(o.isDirectory()){if(o.name===".git")continue;await t(c,i)}else o.isFile()&&i.push(Ei.relative(n,c).split(Ei.sep).join("/"))}},"walk");return{async list(){let r=[];return(0,jo.existsSync)(n)&&await t(n,r),r},read:a(r=>jo.promises.readFile(e(r),"utf-8"),"read"),async readBinary(r){return new Uint8Array(await jo.promises.readFile(e(r)))},async write(){throw new Error("exosync-parity is read-only \u2014 write refused")},async delete(){throw new Error("exosync-parity is read-only \u2014 delete refused")}}}a(Bie,"nodeLocalFilesPort");function mA(n){let e=new dt(n),t=new Ti.SpaceSpecAccumulator;for(let r of e.getAllFiles()){let i=e.getFrontmatter(r);if(!i)continue;let s=(0,Ti.classifySpaceDeclaration)(i,r.path);if(s.kind==="not-space"||(s.warning!==void 0&&t.warnings.push(s.warning),s.kind==="skip"))continue;let o=t.offer(s.candidate);o!==null&&(0,jo.existsSync)(Ei.join(n,o.localPath))&&t.commit(s.candidate)}return{specs:t.specs,warnings:t.warnings}}a(mA,"collectVaultSpecs");function Vie(n,e){for(let t of n.repos){let r=t.headSha!==void 0?` @${t.headSha.slice(0,7)}`:"";e(`${t.repoKey}${r}: ${t.status} \u2014 ${t.inParity}/${t.filesChecked} in parity, M2 diffs ${t.m2SemanticDiffs}, accounted ${t.accountedCount}, M1 violations ${t.m1Violations.length}${t.attachmentHashSetIdentical!==void 0?`, attachment hash-set ${t.attachmentHashSetIdentical?"identical":"DIFFERS"}`:""}`),t.detail!==void 0&&e(` ${t.detail}`);for(let i of t.warnings)e(` warn: ${i}`);for(let i of t.discrepancies)e(` ${i.cls}: ${i.path}${i.detail!==void 0?` (${i.detail})`:""}`);for(let i of t.m1Violations)e(` M1 VIOLATION: ${i.path} \u2014 ${i.detail}`)}e((0,Ti.summarizeParityRound)(n))}a(Vie,"printHumanReport");async function Gie(n,e={}){let t=e.out??(y=>console.log(y)),r=Ei.resolve(n.vault);if(!(0,jo.existsSync)(r))throw new Error(`Vault path does not exist: ${r}`);let i=Uie(n,e),s=new vi({token:i,...n.apiBase!==void 0?{apiBase:n.apiBase}:{}}),o=e.transportFactory?.(i,n.apiBase)??s.transport(),{specs:c,warnings:l}=mA(r);for(let y of l)t(`warn: ${y}`);if(c.length===0)return t("Nothing to check \u2014 no materialized AssetSpaces with a GitHub source found in this vault."),2;let u=n.configDir??".obsidian",f=Ei.join(r,u,"plugins","exocortex",Ti.WATERMARK_STORE_FILENAME),d=new Ti.FileWatermarkStore({read:a(async()=>{try{return await jo.promises.readFile(f,"utf-8")}catch{return null}},"read"),writeAtomic:a(async()=>{throw new Error("exosync-parity: watermark access is read-only by contract")},"writeAtomic")}),h=new Ti.ParityValidator({transport:o,sha1:jie,localFilesFor:a(y=>Bie(Ei.join(r,y.localPath)),"localFilesFor"),watermarks:{get:a(y=>d.get(y),"get")},yaml:$ie,redact:a(y=>s.redact(y),"redact"),...n.apiBase!==void 0?{baseURL:n.apiBase}:{}});t(`ExoSync parity check: ${c.length} repo(s), vault ${r}`);let p=await h.runRound(c,{trigger:"standalone"});return n.json===!0?t(JSON.stringify(p,null,2)):Vie(p,t),p.vacuous?2:p.ok?0:1}a(Gie,"runExosyncParity");function I4(){return new Ae("exosync-parity").description("ExoSync M1/M2 parity report: compare materialized sync units against their remote heads (read-only; RFC 4e4dc453 Phase E)").requiredOption("--vault <path>","Vault root path").option("--config-dir <name>","Obsidian config dir name (watermark location)",".obsidian").option("--json","Print the full round record as JSON").option("--token <pat>","GitHub PAT (or env GITHUB_TOKEN / GH_TOKEN). Prefer --token-from-gh.").option("--token-from-gh","Resolve the PAT via `gh auth token`").option("--api-base <url>","GitHub API base (testing)").action(async n=>{try{process.exitCode=await Gie(n)}catch(e){le.handle(e,{command:"exosync-parity"}),process.exitCode=1}})}a(I4,"exosyncParityCommand");var Dr=require("node:fs"),R4=require("node:crypto"),xn=J(require("node:path"));var Fr=J(tt());var x4=a(async n=>{let e=await R4.webcrypto.subtle.digest("SHA-1",n.buffer.slice(n.byteOffset,n.byteOffset+n.byteLength));return[...new Uint8Array(e)].map(t=>t.toString(16).padStart(2,"0")).join("")},"nodeSha1"),qie={parse:a(n=>Nt.load(n,{schema:Nt.CORE_SCHEMA}),"parse"),stringify:a(n=>Nt.dump(n,{schema:Nt.CORE_SCHEMA,lineWidth:-1}),"stringify")};function Wie(n,e){if(n.tokenFromGh===!0)return vi.resolveGhToken(e.ghTokenRunner);let t=e.env??process.env,r=n.token||t.GITHUB_TOKEN||t.GH_TOKEN||"";if(r.length===0)throw new Error("A GitHub token is required (private sync units read as 404 and push needs write scope). Use --token-from-gh, --token <pat>, or set GITHUB_TOKEN / GH_TOKEN.");return r}a(Wie,"resolveToken");function zie(n){let e=/^https:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?\/?$/.exec(n.trim());if(e===null)throw new Error(`Invalid quarantine repo URL (expected https://github.com/<owner>/<repo>): ${n}`);return{owner:e[1],repo:e[2]}}a(zie,"parseGitHubRepoUrl");function Hie(n){let e=a(i=>xn.join(n,i),"abs"),t=a(async(i,s)=>{let o;try{o=await Dr.promises.readdir(i,{withFileTypes:!0})}catch{return}for(let c of o){let l=xn.join(i,c.name);if(c.isDirectory()){if(c.name===".git")continue;await t(l,s)}else c.isFile()&&s.push(xn.relative(n,l).split(xn.sep).join("/"))}},"walk"),r=a(async(i,s)=>{let o=xn.dirname(i);await Dr.promises.mkdir(o,{recursive:!0});let c=`${i}.local.tmp`;await s(c),await Dr.promises.rename(c,i)},"writeAtomic");return{async list(){let i=[];return(0,Dr.existsSync)(n)&&await t(n,i),i},read:a(i=>Dr.promises.readFile(e(i),"utf-8"),"read"),async write(i,s){await r(e(i),o=>Dr.promises.writeFile(o,s,"utf-8"))},async delete(i){await Dr.promises.rm(e(i),{force:!0})},async readBinary(i){return new Uint8Array(await Dr.promises.readFile(e(i)))},async writeBinary(i,s){let o=s.buffer.slice(s.byteOffset,s.byteOffset+s.byteLength);await r(e(i),c=>Dr.promises.writeFile(c,Buffer.from(o)))}}}a(Hie,"nodeLocalFilesPort");function Kie(n){return{async read(){try{return await Dr.promises.readFile(n,"utf-8")}catch{return null}},async writeAtomic(e){await Dr.promises.mkdir(xn.dirname(n),{recursive:!0});let t=`${n}.local.tmp`;await Dr.promises.writeFile(t,e,"utf-8"),await Dr.promises.rename(t,n)}}}a(Kie,"nodeWatermarkFileIO");function Qie(n){return{async check(e){let t=xn.join(n,e.localPath);if(!(0,Dr.existsSync)(t))return{fullyMaterialized:!1,reason:`mount folder ${e.localPath} does not exist`};let r=0;try{r=(await Dr.promises.readdir(t)).length}catch{return{fullyMaterialized:!1,reason:`mount folder ${e.localPath} is not readable`}}return r===0&&e.spaceKind!=="file"?{fullyMaterialized:!1,reason:`mount folder ${e.localPath} is empty (mid-mount?)`}:{fullyMaterialized:!0}}}}a(Qie,"nodeMaterializationCheck");function Xie(n,e){let t=n.pushedSha!==void 0?` \u2192@${n.pushedSha.slice(0,7)}`:"";e(`${n.repoKey}${t}: ${n.status} \u2014 pulled ${n.pulledCount}, pushed ${n.pushedCount}, merged ${n.mergedCount}, quarantined ${n.quarantinedCount}${(n.pushedDeletes?.length??0)>0?`, deleted ${n.pushedDeletes.length}`:""}`),n.detail!==void 0&&e(` ${n.detail}`);for(let r of n.warnings)e(` warn: ${r}`);(n.deferredPaths?.length??0)>0&&e(` deferred (\u2192 full sync): ${n.deferredPaths.join(", ")}`),(n.deferredDeletes?.length??0)>0&&e(` deferred deletes: ${n.deferredDeletes.join(", ")}`)}a(Xie,"printRepoResult");function Yie(n){return n==="conflict"||n==="full-conflict"||n==="retry-exhausted"||n==="busy"||n==="auth-required"||n==="error"}a(Yie,"isFailureStatus");async function Jie(n,e,t={}){let r=t.out??(_=>console.log(_)),i=xn.resolve(e.vault);if(!(0,Dr.existsSync)(i))throw new Error(`Vault path does not exist: ${i}`);let s=Wie(e,t),o=new vi({token:s,...e.apiBase!==void 0?{apiBase:e.apiBase}:{}}),c=t.transportFactory?.(s,e.apiBase)??o.transport(),{specs:l,warnings:u}=mA(i);for(let _ of u)r(`warn: ${_}`);if(l.length===0)return r("Nothing to sync \u2014 no materialized AssetSpaces with a GitHub source found in this vault."),2;let f=e.configDir??".obsidian",d=xn.join(i,f,"plugins","exocortex",Fr.WATERMARK_STORE_FILENAME),h,p=e.quarantineRepo?.trim()??"";if(p.length>0){let{owner:_,repo:S}=zie(p);h=new Fr.SyncedQuarantineStore({transport:(0,Fr.withRateLimitBackoff)(c),sha1:x4,owner:_,repo:S,branch:Fr.SYNC_BRANCH,redact:a(T=>o.redact(T),"redact")})}let y=new Fr.SyncEngine({transport:c,watermarkStore:new Fr.FileWatermarkStore(Kie(d)),materializationCheck:Qie(i),localFilesFor:a(_=>Hie(xn.join(i,_.localPath)),"localFilesFor"),sha1:x4,redact:a(_=>o.redact(_),"redact"),commitMessage:a((_,S,T=0)=>`exosync: ${S} change(s)${T>0?`, ${T} deletion(s)`:""} (CLI)`,"commitMessage"),mergeLayer:new Fr.GatedStructuredMerger(new Fr.StructuredMerger(qie)),...h!==void 0?{quarantine:h}:{},...e.apiBase!==void 0?{baseURL:e.apiBase}:{}});r(`ExoSync ${n}: ${l.length} repo(s), vault ${i}${h!==void 0?" (quarantine configured)":""}`);let g=(0,Fr.orderChildrenFirst)(l),v=await y.syncAll(g,n);if(e.json===!0)r(JSON.stringify(v,null,2));else{for(let S of v)Xie(S,r);let _=v.reduce((S,T)=>({pulled:S.pulled+T.pulledCount,pushed:S.pushed+T.pushedCount,merged:S.merged+T.mergedCount,quarantined:S.quarantined+T.quarantinedCount}),{pulled:0,pushed:0,merged:0,quarantined:0});r(`Summary: ${v.length} repo(s) \u2014 pulled ${_.pulled}, pushed ${_.pushed}, merged ${_.merged}, quarantined ${_.quarantined}`)}return v.some(_=>Yie(_.status))?1:0}a(Jie,"runExosyncSync");function gA(n){return n.requiredOption("--vault <path>","Vault root path").option("--config-dir <name>","Obsidian config dir name (watermark location)",".obsidian").option("--quarantine-repo <url>","Quarantine repo URL (https://github.com/<owner>/<repo>) \u2014 required for FileSpaces").option("--token <pat>","GitHub PAT (or env GITHUB_TOKEN / GH_TOKEN). Prefer --token-from-gh.").option("--token-from-gh","Resolve the PAT via `gh auth token`").option("--json","Print the full per-repo result array as JSON").option("--api-base <url>","GitHub API base (testing)")}a(gA,"withSyncOptions");function yA(n){return async e=>{try{process.exitCode=await Jie(n,e)}catch(t){le.handle(t,{command:`exosync ${n}`}),process.exitCode=1}}}a(yA,"makeDirectionAction");function P4(){let n=new Ae("exosync").description("ExoSync over the GitHub REST API: sync/pull/push the materialized AssetSpace set (CLI parity with the plugin; RFC 4e4dc453 Phase B). Read-only divergence check: `exosync-parity`.");return gA(n.command("sync").description("Full pull\u2192merge\u2192push cycle for every materialized repo")).action(yA("sync")),gA(n.command("pull").description("Apply remote changes only (nothing leaves the device; local changes re-derive)")).action(yA("pull")),gA(n.command("push").description("Send the local delta only (remote changes are pinned to re-derive on the next pull/sync)")).action(yA("push")),n}a(P4,"exosyncCommand");function C4(n){let e=new Ae;return e.name("exocortex").description("CLI tool for Exocortex knowledge management system").version(n??"16.96.9"),e.addCommand(LM()),e.addCommand(qM()),e.addCommand(Ik()),e.addCommand(Pk()),e.addCommand(iM()),e.addCommand(Fk()),e.addCommand(Lk()),e.addCommand($k()),e.addCommand(aM()),e.addCommand(gM()),e.addCommand(bM()),e.addCommand(EM()),e.addCommand(FM()),e.addCommand(s4()),e.addCommand(f4()),e.addCommand(d4()),e.addCommand(m4()),e.addCommand(_4()),e.addCommand(T4()),e.addCommand(I4()),e.addCommand(P4()),e}a(C4,"createProgram");C4().parse();0&&(module.exports={createProgram});
|
|
778
|
+
`)),process.exit(0)}catch(e){let t=e instanceof Error?e:new Error(String(e)),r=new vi;t.message=r.redact(t.message),t.stack&&(t.stack=r.redact(t.stack)),le.handle(t)}})}a(Mie,"restPushCommand");var jo=require("node:fs"),A4=require("node:crypto"),Ei=J(require("node:path"));var Ti=J(tt());var jie=a(async n=>{let e=await A4.webcrypto.subtle.digest("SHA-1",n.buffer.slice(n.byteOffset,n.byteOffset+n.byteLength));return[...new Uint8Array(e)].map(t=>t.toString(16).padStart(2,"0")).join("")},"nodeSha1"),$ie={parse:a(n=>Nt.load(n,{schema:Nt.CORE_SCHEMA}),"parse"),stringify:a(n=>Nt.dump(n,{schema:Nt.CORE_SCHEMA,lineWidth:-1}),"stringify")};function Uie(n,e){if(n.tokenFromGh===!0)return vi.resolveGhToken(e.ghTokenRunner);let t=e.env??process.env,r=n.token||t.GITHUB_TOKEN||t.GH_TOKEN||"";if(r.length===0)throw new Error("A GitHub token is required (private sync units read as 404 without one). Use --token-from-gh, --token <pat>, or set GITHUB_TOKEN / GH_TOKEN.");return r}a(Uie,"resolveToken");function Bie(n){let e=a(r=>Ei.join(n,r),"abs"),t=a(async(r,i)=>{let s;try{s=await jo.promises.readdir(r,{withFileTypes:!0})}catch{return}for(let o of s){let c=Ei.join(r,o.name);if(o.isDirectory()){if(o.name===".git")continue;await t(c,i)}else o.isFile()&&i.push(Ei.relative(n,c).split(Ei.sep).join("/"))}},"walk");return{async list(){let r=[];return(0,jo.existsSync)(n)&&await t(n,r),r},read:a(r=>jo.promises.readFile(e(r),"utf-8"),"read"),async readBinary(r){return new Uint8Array(await jo.promises.readFile(e(r)))},async write(){throw new Error("exosync-parity is read-only \u2014 write refused")},async delete(){throw new Error("exosync-parity is read-only \u2014 delete refused")}}}a(Bie,"nodeLocalFilesPort");function mA(n){let e=new dt(n),t=new Ti.SpaceSpecAccumulator;for(let r of e.getAllFiles()){let i=e.getFrontmatter(r);if(!i)continue;let s=(0,Ti.classifySpaceDeclaration)(i,r.path);if(s.kind==="not-space"||(s.warning!==void 0&&t.warnings.push(s.warning),s.kind==="skip"))continue;let o=t.offer(s.candidate);o!==null&&(0,jo.existsSync)(Ei.join(n,o.localPath))&&t.commit(s.candidate)}return{specs:t.specs,warnings:t.warnings}}a(mA,"collectVaultSpecs");function Vie(n,e){for(let t of n.repos){let r=t.headSha!==void 0?` @${t.headSha.slice(0,7)}`:"";e(`${t.repoKey}${r}: ${t.status} \u2014 ${t.inParity}/${t.filesChecked} in parity, M2 diffs ${t.m2SemanticDiffs}, accounted ${t.accountedCount}, M1 violations ${t.m1Violations.length}${t.attachmentHashSetIdentical!==void 0?`, attachment hash-set ${t.attachmentHashSetIdentical?"identical":"DIFFERS"}`:""}`),t.detail!==void 0&&e(` ${t.detail}`);for(let i of t.warnings)e(` warn: ${i}`);for(let i of t.discrepancies)e(` ${i.cls}: ${i.path}${i.detail!==void 0?` (${i.detail})`:""}`);for(let i of t.m1Violations)e(` M1 VIOLATION: ${i.path} \u2014 ${i.detail}`)}e((0,Ti.summarizeParityRound)(n))}a(Vie,"printHumanReport");async function Gie(n,e={}){let t=e.out??(y=>console.log(y)),r=Ei.resolve(n.vault);if(!(0,jo.existsSync)(r))throw new Error(`Vault path does not exist: ${r}`);let i=Uie(n,e),s=new vi({token:i,...n.apiBase!==void 0?{apiBase:n.apiBase}:{}}),o=e.transportFactory?.(i,n.apiBase)??s.transport(),{specs:c,warnings:l}=mA(r);for(let y of l)t(`warn: ${y}`);if(c.length===0)return t("Nothing to check \u2014 no materialized AssetSpaces with a GitHub source found in this vault."),2;let u=n.configDir??".obsidian",f=Ei.join(r,u,"plugins","exocortex",Ti.WATERMARK_STORE_FILENAME),d=new Ti.FileWatermarkStore({read:a(async()=>{try{return await jo.promises.readFile(f,"utf-8")}catch{return null}},"read"),writeAtomic:a(async()=>{throw new Error("exosync-parity: watermark access is read-only by contract")},"writeAtomic")}),h=new Ti.ParityValidator({transport:o,sha1:jie,localFilesFor:a(y=>Bie(Ei.join(r,y.localPath)),"localFilesFor"),watermarks:{get:a(y=>d.get(y),"get")},yaml:$ie,redact:a(y=>s.redact(y),"redact"),...n.apiBase!==void 0?{baseURL:n.apiBase}:{}});t(`ExoSync parity check: ${c.length} repo(s), vault ${r}`);let p=await h.runRound(c,{trigger:"standalone"});return n.json===!0?t(JSON.stringify(p,null,2)):Vie(p,t),p.vacuous?2:p.ok?0:1}a(Gie,"runExosyncParity");function I4(){return new Ae("exosync-parity").description("ExoSync M1/M2 parity report: compare materialized sync units against their remote heads (read-only; RFC 4e4dc453 Phase E)").requiredOption("--vault <path>","Vault root path").option("--config-dir <name>","Obsidian config dir name (watermark location)",".obsidian").option("--json","Print the full round record as JSON").option("--token <pat>","GitHub PAT (or env GITHUB_TOKEN / GH_TOKEN). Prefer --token-from-gh.").option("--token-from-gh","Resolve the PAT via `gh auth token`").option("--api-base <url>","GitHub API base (testing)").action(async n=>{try{process.exitCode=await Gie(n)}catch(e){le.handle(e,{command:"exosync-parity"}),process.exitCode=1}})}a(I4,"exosyncParityCommand");var Dr=require("node:fs"),R4=require("node:crypto"),xn=J(require("node:path"));var Fr=J(tt());var x4=a(async n=>{let e=await R4.webcrypto.subtle.digest("SHA-1",n.buffer.slice(n.byteOffset,n.byteOffset+n.byteLength));return[...new Uint8Array(e)].map(t=>t.toString(16).padStart(2,"0")).join("")},"nodeSha1"),qie={parse:a(n=>Nt.load(n,{schema:Nt.CORE_SCHEMA}),"parse"),stringify:a(n=>Nt.dump(n,{schema:Nt.CORE_SCHEMA,lineWidth:-1}),"stringify")};function Wie(n,e){if(n.tokenFromGh===!0)return vi.resolveGhToken(e.ghTokenRunner);let t=e.env??process.env,r=n.token||t.GITHUB_TOKEN||t.GH_TOKEN||"";if(r.length===0)throw new Error("A GitHub token is required (private sync units read as 404 and push needs write scope). Use --token-from-gh, --token <pat>, or set GITHUB_TOKEN / GH_TOKEN.");return r}a(Wie,"resolveToken");function zie(n){let e=/^https:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?\/?$/.exec(n.trim());if(e===null)throw new Error(`Invalid quarantine repo URL (expected https://github.com/<owner>/<repo>): ${n}`);return{owner:e[1],repo:e[2]}}a(zie,"parseGitHubRepoUrl");function Hie(n){let e=a(i=>xn.join(n,i),"abs"),t=a(async(i,s)=>{let o;try{o=await Dr.promises.readdir(i,{withFileTypes:!0})}catch{return}for(let c of o){let l=xn.join(i,c.name);if(c.isDirectory()){if(c.name===".git")continue;await t(l,s)}else c.isFile()&&s.push(xn.relative(n,l).split(xn.sep).join("/"))}},"walk"),r=a(async(i,s)=>{let o=xn.dirname(i);await Dr.promises.mkdir(o,{recursive:!0});let c=`${i}.local.tmp`;await s(c),await Dr.promises.rename(c,i)},"writeAtomic");return{async list(){let i=[];return(0,Dr.existsSync)(n)&&await t(n,i),i},read:a(i=>Dr.promises.readFile(e(i),"utf-8"),"read"),async write(i,s){await r(e(i),o=>Dr.promises.writeFile(o,s,"utf-8"))},async delete(i){await Dr.promises.rm(e(i),{force:!0})},async readBinary(i){return new Uint8Array(await Dr.promises.readFile(e(i)))},async writeBinary(i,s){let o=s.buffer.slice(s.byteOffset,s.byteOffset+s.byteLength);await r(e(i),c=>Dr.promises.writeFile(c,Buffer.from(o)))}}}a(Hie,"nodeLocalFilesPort");function Kie(n){return{async read(){try{return await Dr.promises.readFile(n,"utf-8")}catch{return null}},async writeAtomic(e){await Dr.promises.mkdir(xn.dirname(n),{recursive:!0});let t=`${n}.local.tmp`;await Dr.promises.writeFile(t,e,"utf-8"),await Dr.promises.rename(t,n)}}}a(Kie,"nodeWatermarkFileIO");function Qie(n){return{async check(e){let t=xn.join(n,e.localPath);if(!(0,Dr.existsSync)(t))return{fullyMaterialized:!1,reason:`mount folder ${e.localPath} does not exist`};let r=0;try{r=(await Dr.promises.readdir(t)).length}catch{return{fullyMaterialized:!1,reason:`mount folder ${e.localPath} is not readable`}}return r===0&&e.spaceKind!=="file"?{fullyMaterialized:!1,reason:`mount folder ${e.localPath} is empty (mid-mount?)`}:{fullyMaterialized:!0}}}}a(Qie,"nodeMaterializationCheck");function Xie(n,e){let t=n.pushedSha!==void 0?` \u2192@${n.pushedSha.slice(0,7)}`:"";e(`${n.repoKey}${t}: ${n.status} \u2014 pulled ${n.pulledCount}, pushed ${n.pushedCount}, merged ${n.mergedCount}, quarantined ${n.quarantinedCount}${(n.pushedDeletes?.length??0)>0?`, deleted ${n.pushedDeletes.length}`:""}`),n.detail!==void 0&&e(` ${n.detail}`);for(let r of n.warnings)e(` warn: ${r}`);(n.deferredPaths?.length??0)>0&&e(` deferred (\u2192 full sync): ${n.deferredPaths.join(", ")}`),(n.deferredDeletes?.length??0)>0&&e(` deferred deletes: ${n.deferredDeletes.join(", ")}`)}a(Xie,"printRepoResult");function Yie(n){return n==="conflict"||n==="full-conflict"||n==="retry-exhausted"||n==="busy"||n==="auth-required"||n==="error"}a(Yie,"isFailureStatus");async function Jie(n,e,t={}){let r=t.out??(_=>console.log(_)),i=xn.resolve(e.vault);if(!(0,Dr.existsSync)(i))throw new Error(`Vault path does not exist: ${i}`);let s=Wie(e,t),o=new vi({token:s,...e.apiBase!==void 0?{apiBase:e.apiBase}:{}}),c=t.transportFactory?.(s,e.apiBase)??o.transport(),{specs:l,warnings:u}=mA(i);for(let _ of u)r(`warn: ${_}`);if(l.length===0)return r("Nothing to sync \u2014 no materialized AssetSpaces with a GitHub source found in this vault."),2;let f=e.configDir??".obsidian",d=xn.join(i,f,"plugins","exocortex",Fr.WATERMARK_STORE_FILENAME),h,p=e.quarantineRepo?.trim()??"";if(p.length>0){let{owner:_,repo:S}=zie(p);h=new Fr.SyncedQuarantineStore({transport:(0,Fr.withRateLimitBackoff)(c),sha1:x4,owner:_,repo:S,branch:Fr.SYNC_BRANCH,redact:a(T=>o.redact(T),"redact")})}let y=new Fr.SyncEngine({transport:c,watermarkStore:new Fr.FileWatermarkStore(Kie(d)),materializationCheck:Qie(i),localFilesFor:a(_=>Hie(xn.join(i,_.localPath)),"localFilesFor"),sha1:x4,redact:a(_=>o.redact(_),"redact"),commitMessage:a((_,S,T=0)=>`exosync: ${S} change(s)${T>0?`, ${T} deletion(s)`:""} (CLI)`,"commitMessage"),mergeLayer:new Fr.GatedStructuredMerger(new Fr.StructuredMerger(qie)),...h!==void 0?{quarantine:h}:{},...e.apiBase!==void 0?{baseURL:e.apiBase}:{}});r(`ExoSync ${n}: ${l.length} repo(s), vault ${i}${h!==void 0?" (quarantine configured)":""}`);let g=(0,Fr.orderChildrenFirst)(l),v=await y.syncAll(g,n);if(e.json===!0)r(JSON.stringify(v,null,2));else{for(let S of v)Xie(S,r);let _=v.reduce((S,T)=>({pulled:S.pulled+T.pulledCount,pushed:S.pushed+T.pushedCount,merged:S.merged+T.mergedCount,quarantined:S.quarantined+T.quarantinedCount}),{pulled:0,pushed:0,merged:0,quarantined:0});r(`Summary: ${v.length} repo(s) \u2014 pulled ${_.pulled}, pushed ${_.pushed}, merged ${_.merged}, quarantined ${_.quarantined}`)}return v.some(_=>Yie(_.status))?1:0}a(Jie,"runExosyncSync");function gA(n){return n.requiredOption("--vault <path>","Vault root path").option("--config-dir <name>","Obsidian config dir name (watermark location)",".obsidian").option("--quarantine-repo <url>","Quarantine repo URL (https://github.com/<owner>/<repo>) \u2014 required for FileSpaces").option("--token <pat>","GitHub PAT (or env GITHUB_TOKEN / GH_TOKEN). Prefer --token-from-gh.").option("--token-from-gh","Resolve the PAT via `gh auth token`").option("--json","Print the full per-repo result array as JSON").option("--api-base <url>","GitHub API base (testing)")}a(gA,"withSyncOptions");function yA(n){return async e=>{try{process.exitCode=await Jie(n,e)}catch(t){le.handle(t,{command:`exosync ${n}`}),process.exitCode=1}}}a(yA,"makeDirectionAction");function P4(){let n=new Ae("exosync").description("ExoSync over the GitHub REST API: sync/pull/push the materialized AssetSpace set (CLI parity with the plugin; RFC 4e4dc453 Phase B). Read-only divergence check: `exosync-parity`.");return gA(n.command("sync").description("Full pull\u2192merge\u2192push cycle for every materialized repo")).action(yA("sync")),gA(n.command("pull").description("Apply remote changes only (nothing leaves the device; local changes re-derive)")).action(yA("pull")),gA(n.command("push").description("Send the local delta only (remote changes are pinned to re-derive on the next pull/sync)")).action(yA("push")),n}a(P4,"exosyncCommand");function C4(n){let e=new Ae;return e.name("exocortex").description("CLI tool for Exocortex knowledge management system").version(n??"16.96.11"),e.addCommand(LM()),e.addCommand(qM()),e.addCommand(Ik()),e.addCommand(Pk()),e.addCommand(iM()),e.addCommand(Fk()),e.addCommand(Lk()),e.addCommand($k()),e.addCommand(aM()),e.addCommand(gM()),e.addCommand(bM()),e.addCommand(EM()),e.addCommand(FM()),e.addCommand(s4()),e.addCommand(f4()),e.addCommand(d4()),e.addCommand(m4()),e.addCommand(_4()),e.addCommand(T4()),e.addCommand(I4()),e.addCommand(P4()),e}a(C4,"createProgram");C4().parse();0&&(module.exports={createProgram});
|
|
779
779
|
/*! Bundled license information:
|
|
780
780
|
|
|
781
781
|
reflect-metadata/Reflect.js:
|
package/package.json
CHANGED