@kitelev/exocortex-cli 16.248.5 → 16.248.6

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.
Files changed (2) hide show
  1. package/dist/index.js +4 -4
  2. 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.248.5
2
+ // @kitelev/exocortex-cli v16.248.6
3
3
  // CLI tool for Exocortex knowledge management system - SPARQL queries, task management, and more
4
4
  // License: MIT
5
5
 
@@ -136,8 +136,8 @@ ${Object.entries(o).map(([f,d])=>this.serializeValue(f,d,!0,n?.(s[f]??f))).join(
136
136
  ${c}`}let o=n?(0,qA.serializeYamlScalar)(t,s,i):String(t);return`${e}: ${o}`}escapeRegex(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}static findPropertyLineSpan(e,t){let n=`${t}:`,i=e.findIndex(o=>o.startsWith(n));if(i===-1)return null;let s=i+1;for(let o=i+1;o<e.length;o++){let c=e[o];if(/^[ \t]/.test(c)){s=o+1;continue}if(c.trim()!=="")break}return{start:i,end:s}}};wb.FrontmatterService=Sb;Sb.FRONTMATTER_REGEX=/^---\n([\s\S]*?)\n---/});var Hl=T(WA=>{"use strict";Object.defineProperty(WA,"__esModule",{value:!0});WA.extractAssetReference=KJ;function KJ(r){if(typeof r!="string")return null;let e=r.trim().replace(/^["']|["']$/g,"");e=e.replace(/^\[\[|\]\]$/g,"");let t=e.indexOf("|");return t!==-1&&(e=e.slice(0,t).trim()),e||null}a(KJ,"extractAssetReference")});var Kl=T(Eb=>{"use strict";Object.defineProperty(Eb,"__esModule",{value:!0});Eb.LoggingService=void 0;var Th=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,n){let i=this.checkIsDevelopment(),s=n?` [${n}]`:"";if(i){let o=t?.stack?`
137
137
  Stack trace:
138
138
  ${t.stack}`:"";console.error(`[Exocortex ERROR]${s} ${e}${o}`,t??"")}else{let o=t?.message?`
139
- Details: ${t.message}`:"";console.error(`[Exocortex ERROR]${s} ${e}${o}`)}}};Eb.LoggingService=Th;Th.isVerbose=!1;Th.isDevelopment=void 0});var HA=T(vb=>{"use strict";Object.defineProperty(vb,"__esModule",{value:!0});vb.CLASS_UID_TO_LABEL=void 0;var zA=ml();vb.CLASS_UID_TO_LABEL=Object.freeze({"1b20a8f0-d745-4e93-91db-4531b3df120e":zA.AssetClass.TASK,"7db5eeff-718a-49b0-8d2b-39b084a356e3":zA.AssetClass.PROJECT,"1b0a5e34-dd7f-4ead-b43a-6c7c5a5ecaca":zA.AssetClass.MEETING})});var xk=T(Br=>{"use strict";var YJ=Br&&Br.__decorate||function(r,e,t,n){var i=arguments.length,s=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,o;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(r,e,t,n);else for(var c=r.length-1;c>=0;c--)(o=r[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},XJ=Br&&Br.__metadata||function(r,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(r,e)},qt;Object.defineProperty(Br,"__esModule",{value:!0});Br.GroundingExecutor=Br.ServiceRegistry=Br.CLASS_UID_TO_LABEL=Br.STATUS_UID_BY_ENUM=void 0;Br.missingInputHint=QA;Br.missingInputError=Ck;Br.findMissingInput=aZ;var QJ=ct(),JJ=_h(),ZJ=ob(),jn=cc(),eZ=kA(),tZ=ef(),Rk=Gu(),rZ=Le(),KA=zl(),Fi=Fl(),YA=Wl(),nZ=Hl(),iZ=oa(),Ek=gb(),Ah=vs(),vk=hh(),Is=Kl();Br.STATUS_UID_BY_ENUM=Rk.EFFORT_STATUS_UID;var sZ=HA();Object.defineProperty(Br,"CLASS_UID_TO_LABEL",{enumerable:!0,get:a(function(){return sZ.CLASS_UID_TO_LABEL},"get")});var XA=lb();(0,XA.installDefaultResolvers)();function oZ(r){if(r){if(r==="1b20a8f0-d745-4e93-91db-4531b3df120e")return"ems__Task";if(r==="7db5eeff-718a-49b0-8d2b-39b084a356e3")return"ems__Project";if(r==="ems__Task"||r==="ems__Project")return r}}a(oZ,"resolveClassFlipTarget");function QA(r,e){let t=e??{},n=a(c=>c!=null,"isProvided"),i=[...r.matchAll(/\$input\.([A-Za-z_]\w*)/g)].map(c=>c[1]),s=/\$input\b(?!\.)/.test(r)||/\$value\b/.test(r),o=i.find(c=>!n(t[c]));return o!==void 0?`--input '{"${o}":...}'`:s&&!n(t.value)?`--input '{"value":...}'`:null}a(QA,"missingInputHint");function Ck(r){return`property_set: value template references an input that was not provided (${r} required)`}a(Ck,"missingInputError");function aZ(r,e){let t=a(i=>{if(i.type===jn.GroundingType.PROPERTY_SET){if(i.targetValueRef!==void 0)return`"[[${i.targetValueRef}]]"`;if(i.targetValueLiteral!==void 0)return i.targetValueLiteral;if(i.targetValueSubstitution!==void 0)return i.targetValueSubstitution}},"staticTemplate"),n=a(i=>{let s=t(i);if(s!==void 0){let o=QA(s,e);if(o!==null)return o}for(let o of i.steps??[]){let c=n(o);if(c!==null)return c}return null},"visit");return n(r)}a(aZ,"findMissingInput");var cZ=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Tk=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,lZ=/^__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}__$/,Ak=/^__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_-]*)__$/,Tb=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())}};Br.ServiceRegistry=Tb;var Ik=20;function uZ(r){return/^\[\[[\s\S]*\]\]$/.test(r.trim())}a(uZ,"isUnquotedWikilink");var Uf=qt=class{static{a(this,"GroundingExecutor")}constructor(e,t,n,i,s){this.frontmatterService=new KA.FrontmatterService,this.fileReader=e,this.fileWriter=t,this.serviceRegistry=n,this.classLabelToUid=i,this.refToFolder=s?.refToFolder,this.refToFrontmatter=s?.refToFrontmatter,this.workflowResolver=s?.workflowResolver,this.groundingLoader=s?.groundingLoader,this.templateLoader=s?.templateLoader,this.namedQueryRunner=s?.namedQueryRunner,this.declaredRanges=s?.declaredRanges,this.clock=s?.clock??(0,JJ.liveClock)(),this.uidGen=s?.uidGenerator??(0,ZJ.liveUidGenerator)()}async execute(e,t,n,i){try{switch(e.type){case jn.GroundingType.PROPERTY_SET:return await this.executePropertySet(e,t,n,i);case jn.GroundingType.PROPERTY_DELETE:return await this.executePropertyDelete(e,n);case jn.GroundingType.PROPERTY_REPLACE:return await this.executePropertyReplace(e,t,n,i);case jn.GroundingType.COMPOSITE:return await this.executeComposite(e,t,n,i,0);case jn.GroundingType.SERVICE_CALL:return await this.executeServiceCall(e,t,n,i);case jn.GroundingType.CREATE_INSTANCE:return await this.executeCreateInstance(e,t,n,i);case jn.GroundingType.PROPERTY_APPEND:return await this.executePropertyAppend(e,t,n,i);case jn.GroundingType.PROPERTY_INCREMENT:return await this.executePropertyIncrement(e,n);case jn.GroundingType.PROPERTY_SHIFT:return await this.executePropertyShift(e,n);case jn.GroundingType.SPARQL_UPDATE:return{success:!1,error:"sparql_update grounding not yet implemented. Use property_set/property_delete instead."};case jn.GroundingType.WORKFLOW_TRANSITION:return await this.executeWorkflowTransition(e,t,n,i);case jn.GroundingType.BODY_TEMPLATE:return await this.executeBodyTemplate(e,t,n,i);default:return{success:!1,error:`Unknown grounding type: ${e.type}`}}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}stampUpdatedAt(e,t,n){return t===e||n!==void 0&&(0,YA.canonicalYamlKey)(KA.FrontmatterService.normalizeIRI(n))==="exo__Asset_updatedAt"||!this.frontmatterService.parse(t).exists?t:this.frontmatterService.updateProperty(t,"exo__Asset_updatedAt",Ah.DateFormatter.toLocalTimestamp(this.clock.now()))}async executePropertySet(e,t,n,i){if(!e.targetProperty)return{success:!1,error:"property_set requires targetProperty"};if(e.targetQuery!==void 0&&e.targetsCreatedInstance===!0)return{success:!1,error:"property_set: targetQuery and targetsCreatedInstance are mutually exclusive (both address the step's TARGET \u2014 pick one)."};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 I=await this.resolveTargetValueQuery(e.targetValueQuery,t);if(!I.success)return I;s=I.value}else return{success:!1,error:"property_set requires one of targetValueRef/targetValueLiteral/targetValueSubstitution/targetValueQuery"};let c=QA(s,i);if(c!==null)return{success:!1,error:Ck(c)};let l=e.targetValueRef!==void 0&&/\$/.test(e.targetValueRef),u;if(l){let I=this.substituteVariables(e.targetValueRef,t,i),E=I.trim().replace(/^["']|["']$/g,"").replace(/^\[\[|\]\]$/g,""),w=/\[\[|\]\]/.test(E)?null:(0,nZ.extractAssetReference)(I)?.trim()||null;if(w===null)return{success:!1,error:`property_set: asset-reference value ${JSON.stringify(I)} for ${e.targetProperty} is not a single reference \u2014 pass a BARE uid (or one [[uid]] / [[uid|alias]] wikilink, which is unwrapped); nested brackets, a link inside prose or an empty value would be written as a broken link.`};u=`"[[${w}]]"`}else u=this.substituteVariables(s,t,i);let f=KA.FrontmatterService.normalizeIRI(e.targetProperty),d=(0,YA.canonicalYamlKey)(f),p=(0,iZ.iriToObsidianName)(e.targetProperty)??f,h=this.declaredRanges?(await this.declaredRanges([p])).get(p):void 0,g=Fi.STRING_SCALAR_PROPERTIES.has(d),m=(0,Fi.scalarTypingForRange)(h)!==void 0?(0,Fi.serializeYamlScalar)(u,g,h):g?(0,Fi.serializeYamlScalar)(u,!0):u;if(uZ(m))return{success:!1,error:`property_set: value ${m} is an UNQUOTED wikilink \u2014 YAML reads it as a flow sequence, so the graph would receive a literal instead of a link (silent data loss). Pass the QUOTED form for a substituted reference (the quotes are part of the string, e.g. --input '{"<key>":"\\"[[<uid>]]\\""}'), or use targetValueRef, which takes a BARE uid and wraps it itself.`};let b=n;if(e.targetQuery!==void 0){let I=await this.resolveTargetQuery(e.targetQuery,t);if(!I.success)return I;b=I.path}let _=await this.fileReader.readFile(b),S=this.stampUpdatedAt(_,this.frontmatterService.updateProperty(_,e.targetProperty,m),e.targetProperty);return await this.fileWriter.updateFile(b,S),{success:!0}}async resolveTargetQuery(e,t){if(!this.namedQueryRunner)return{success:!1,error:"property_set targetQuery requires NamedQueryRunner injection (options.namedQueryRunner). Wire the plugin/CLI before using this target-source."};let n;try{n=await this.namedQueryRunner.runScalar(e,{currentAsset:t})}catch(s){return{success:!1,error:`property_set targetQuery: NamedQuery '${e}' failed \u2014 ${s instanceof Error?s.message:String(s)}`}}if(n===null)return{success:!1,error:`property_set targetQuery: NamedQuery '${e}' matched no asset (empty result set) \u2014 refusing to fall back to the click-target.`};if(n.kind!=="iri")return{success:!1,error:`property_set targetQuery: NamedQuery '${e}' returned a literal ('${n.value}'), not an asset reference \u2014 a target must be an asset.`};if(n.iri===void 0)return{success:!1,error:`property_set targetQuery: NamedQuery '${e}' returned an asset reference without its source IRI, so its file path cannot be resolved.`};let i=(0,Ek.iriToVaultPath)(n.iri);return i===null?{success:!1,error:`property_set targetQuery: NamedQuery '${e}' matched '${n.iri}', which is not a vault asset IRI (no resolvable file path).`}:{success:!0,path:i}}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 n;try{n=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 n===null?{success:!1,error:`property_set targetValueQuery: NamedQuery '${e}' returned no scalar value (empty result set or non-scalar shape).`}:{success:!0,value:n.kind==="iri"?`"[[${n.value}]]"`:n.value}}async executePropertyDelete(e,t){if(!e.targetProperty)return{success:!1,error:"property_delete requires targetProperty"};let n=await this.fileReader.readFile(t),i=this.stampUpdatedAt(n,this.frontmatterService.removeProperty(n,e.targetProperty),e.targetProperty);return await this.fileWriter.updateFile(t,i),{success:!0}}async executeComposite(e,t,n,i,s){if(s>=Ik)return{success:!1,error:`Composite grounding exceeded maximum depth of ${Ik}`};let o=e.steps??[];if(o.length===0)return{success:!0};let c;try{c=await this.fileReader.readFile(n)}catch{}let l=[],u,f=[];try{for(let d=0;d<o.length;d++){let p=o[d],g=(p.type===jn.GroundingType.BODY_TEMPLATE||p.targetsCreatedInstance===!0)&&u?u:n,m=await this.executeStep(p,t,g,i,s+1);if(!m.success)return await this.rollback(c,n,l,f),{success:!1,error:`Composite step ${d} failed: ${m.error}`};m.openPath&&(u=m.openPath),m.openPath&&f.push(m.openPath),m.createdPaths&&m.createdPaths.length>0&&f.push(...m.createdPaths),l.push(d)}return{success:!0,...f.length>0?{createdPaths:f}:{}}}catch(d){return await this.rollback(c,n,l,f),{success:!1,error:`Composite execution failed: ${d instanceof Error?d.message:String(d)}`}}}async executeServiceCall(e,t,n,i){let s=e.targetProperty;if(!s)return{success:!1,error:"service_call requires targetProperty as serviceId"};if(e.targetQuery!==void 0&&e.targetsCreatedInstance===!0)return{success:!1,error:"service_call: targetQuery and targetsCreatedInstance are mutually exclusive (both address the step's TARGET \u2014 pick one)."};if(s==="convertToTask")return await this.executeConvertToTask(n);if(s==="updateProperty"){let f=oZ(e.targetValueRef);if(f==="ems__Task")return await this.executeConvertToTask(n);if(f==="ems__Project")return await this.executeConvertToProject(n)}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 f=this.substituteVariables(e.serviceCallPayload,t,i),d=JSON.parse(f);typeof d=="object"&&d!==null&&(c={...d,...c??{}})}catch{}let l=e.targetsCreatedInstance===!0&&n?(0,Ek.vaultPathToIRI)(n):t,u=await this.readServiceCallSnapshot(n);return await o.execute(l,c),await this.stampServiceCallTarget(n,u,c),{success:!0}}async readServiceCallSnapshot(e){if(!e||!await this.fileReader.fileExists(e))return;let t=await this.fileReader.readFile(e),n=this.frontmatterService.parseObject(t)?.exo__Asset_uid,i=typeof n=="string"?n.trim().replace(/^"|"$/g,""):"";if(!cZ.test(i))return{bytes:t};let s=e.lastIndexOf("/"),c=`${s>=0?e.slice(0,s+1):""}${i}.md`;return c===e?{bytes:t}:await this.fileReader.fileExists(c)?{bytes:t}:{bytes:t,canon:c}}async stampServiceCallTarget(e,t,n){if(t===void 0)return;let i=await this.locateServiceCallTarget(e,t);if(i===void 0)return;let s=t.bytes,o=await this.fileReader.readFile(i);if(o===s)return;let c=typeof n?.property=="string"?n.property:void 0,l=this.stampUpdatedAt(s,o,c);l!==o&&await this.fileWriter.updateFile(i,l)}async locateServiceCallTarget(e,t){if(await this.fileReader.fileExists(e))return e;if(t.canon!==void 0&&await this.fileReader.fileExists(t.canon))return t.canon}async executeConvertToTask(e){let t=await this.fileReader.readFile(e),n=await this.resolveClassRefToUid("ems__Task"),i=this.stampUpdatedAt(t,this.frontmatterService.updateProperty(t,"exo__Instance_class",`["[[${n}]]"]`),"exo__Instance_class");return await this.fileWriter.updateFile(e,i),{success:!0}}async executeConvertToProject(e){let t=await this.fileReader.readFile(e),n=await this.resolveClassRefToUid("ems__Project"),i=this.stampUpdatedAt(t,this.frontmatterService.updateProperty(t,"exo__Instance_class",`["[[${n}]]"]`),"exo__Instance_class");return await this.fileWriter.updateFile(e,i),{success:!0}}async executeBodyTemplate(e,t,n,i){let s=null;if(e.templateRef)if(this.templateLoader){if(s=await this.templateLoader(e.templateRef),s===null)return{success:!1,error:`body_template: templateRef "${e.templateRef}" did not resolve to a template body (asset missing or empty).`}}else{if(e.bodyTemplate===void 0)return{success:!1,error:`body_template: templateRef "${e.templateRef}" set but no TemplateLoaderPort is wired (and no inline bodyTemplate fallback).`};s=e.bodyTemplate}else if(e.bodyTemplate!==void 0)s=e.bodyTemplate;else return{success:!1,error:"body_template requires bodyTemplate or templateRef"};let o=(0,eZ.resolveTemplateBody)(s,{userInput:i,targetIRI:t,targetFilePath:n}),c;try{c=await this.fileReader.readFile(n)}catch(u){return{success:!1,error:`body_template: failed to read target file "${n}": ${u instanceof Error?u.message:String(u)}`}}let l=this.stampUpdatedAt(c,qt.replaceBody(c,o));return await this.fileWriter.updateFile(n,l),{success:!0}}static replaceBody(e,t){let n=e.match(/^---\r?\n[\s\S]*?\r?\n---/);return n?`${n[0]}
140
- ${t}`:t}static extractBody(e){let t=e.match(/^---\r?\n[\s\S]*?\r?\n---/);return t?e.slice(t[0].length).replace(/^\r?\n/,""):e}async executeCreateInstance(e,t,n,i){if(!e.targetFolder)return{success:!1,error:"create_instance requires targetFolder"};let s={},o=null,c=null;if((e.inheritanceRule&&e.inheritanceRule.length>0||e.propertyDefault&&e.propertyDefault.some(E=>typeof E.value=="string"&&E.value.includes("__SUBSTITUTE"))||e.labelTemplate!==void 0&&/\$target\./.test(e.labelTemplate)||e.cloneTargetBody===!0)&&t&&n){let E;try{E=await this.fileReader.readFile(n)}catch(w){return{success:!1,error:`create_instance: failed to read $target file "${n}": ${w instanceof Error?w.message:String(w)}`}}o=this.frontmatterService.parseObject(E)??null,e.cloneTargetBody&&(c=qt.extractBody(E))}let u;e.targetClass&&(u=await this.resolveClassRefToUid(e.targetClass));let f=await this.preResolveTargetRefs(e.propertyDefault,o),d={userInput:i,targetIRI:t,targetFilePath:n,targetFm:o??void 0,targetRefFm:f,groundingTargetClassUid:u};if(e.propertyDefault&&e.propertyDefault.length>0&&this.applyPropertyDefaultStep(s,e.propertyDefault,d),this.applyMissingScalarPrimitives(s,i,u,e,t,o,n),i)for(let[E,w]of Object.entries(i))E!=="label"&&E!=="body"&&E!=="plannedDate"&&w!=null&&(s[E]=w);if(e.inheritanceRule&&e.inheritanceRule.length>0&&o&&await this.applyInheritanceRuleStep(s,e.inheritanceRule,o),await this.applyMissingBacklinkTopUp(s,e,t,n,o),t&&e.linkBackProperty&&s[e.linkBackProperty]===void 0){let E=qt.extractBacklinkTarget(t,n);s[e.linkBackProperty]=`"[[${E}]]"`}this.applyPrototypeTimePropagation(s,o,i);let p=s.exo__Asset_uid,h=this.declaredRanges?await this.declaredRanges(Object.keys(s)):void 0,g=this.frontmatterService.createFrontmatter("",s,h===void 0?void 0:E=>h.get(E)),m=e.targetFolder.includes("$isDefinedByFolder")?await this.resolveIsDefinedByFolder(s,n):this.substituteVariables(e.targetFolder,t,i,void 0,n),b=m?`${m}/${p}.md`:`${p}.md`,_=i?.body,S=typeof _=="string"&&_.length>0?_:e.cloneTargetBody&&typeof c=="string"&&c.length>0?c:null,I=S!==null?qt.replaceBody(g,S):g;return await this.fileWriter.createFile(b,I),{success:!0,openPath:b}}resolveInstanceDate(e,t){let n=qt.firstScalar(e?.plannedDate);return n&&/^\d{4}-\d{2}-\d{2}$/.test(n)?n:Ah.DateFormatter.toDateString(t??this.clock.now())}applyPrototypeTimePropagation(e,t,n){if(!t)return;let i=qt.firstScalar(t.ems__EffortPrototype_startTime),s=qt.firstScalar(t.ems__EffortPrototype_endTime);if(!i&&!s)return;let o=this.resolveInstanceDate(n);if(i&&e.ems__Effort_plannedStartTimestamp===void 0){let c=qt.combineDateAndTime(o,i);c!==null?e.ems__Effort_plannedStartTimestamp=c:Is.LoggingService.warn(`[GroundingExecutor] prototype ems__EffortPrototype_startTime "${i}" is not a valid HH:MM[:SS] time-of-day \u2014 skipping plannedStartTimestamp stamp.`)}if(s&&e.ems__Effort_plannedEndTimestamp===void 0){let c=qt.combineDateAndTime(o,s);c!==null?e.ems__Effort_plannedEndTimestamp=c:Is.LoggingService.warn(`[GroundingExecutor] prototype ems__EffortPrototype_endTime "${s}" is not a valid HH:MM[:SS] time-of-day \u2014 skipping plannedEndTimestamp stamp.`)}}static firstScalar(e){if(e==null)return null;let t=Array.isArray(e)?e[0]:e;if(typeof t!="string")return null;let n=t.trim().replace(/^["'](.*)["']$/,"$1").trim();return n.length>0?n:null}static combineDateAndTime(e,t){if(!/^([01]\d|2[0-3]):[0-5]\d(:[0-5]\d)?$/.test(t))return null;let n=/^\d{2}:\d{2}$/.test(t)?`${t}:00`:t;return`${e}T${n}`}async resolveIsDefinedByFolder(e,t){let n=qt.parentFolderOf(t),i=e.exo__Asset_isDefinedBy,s=qt.extractBareRef(i);if(s&&this.refToFolder)try{let o=await this.refToFolder(s);if(o!=null)return o}catch(o){Is.LoggingService.error(`[GroundingExecutor] $isDefinedByFolder resolution failed for ref "${s}" \u2014 falling back to host folder.`,o instanceof Error?o:new Error(String(o)))}return n}static parentFolderOf(e){let t=e.replace(/^\/+/,""),n=t.lastIndexOf("/");return n>=0?t.slice(0,n):""}static extractBareRef(e){if(typeof e!="string")return null;let t=e.trim();t=t.replace(/^["']|["']$/g,"").trim(),t=t.replace(/^\[\[/,"").replace(/\]\]$/,"");let n=t.indexOf("|");return n>=0&&(t=t.slice(0,n)),t=t.trim(),t.length>0?t:null}async preResolveTargetRefs(e,t){if(!e||!this.refToFrontmatter||!t)return;let n=new Set;for(let{value:s}of e){if(typeof s!="string")continue;let o=qt.extractTargetRefPropertyRefKey(s);o&&n.add(o)}if(n.size===0)return;let i={};for(let s of n){let o=t[s],c=Array.isArray(o)?o[0]:o,l=qt.extractBareRef(c);if(!l){i[s]=null;continue}try{i[s]=await this.refToFrontmatter(l)}catch(u){Is.LoggingService.error(`[GroundingExecutor] targetRefProperty second-hop resolution failed for ref "${l}" (refKey "${s}") \u2014 routing skipped, instance co-locates with the click-target.`,u instanceof Error?u:new Error(String(u))),i[s]=null}}return i}static extractTargetRefPropertyRefKey(e){let t=e.match(Ak);if(!t||t[1]!=="targetRefProperty")return null;let n=qt.decodeBase64UrlSafe(t[2]),i=n.indexOf("|");if(i<0)return null;let s=n.slice(0,i);return s.length>0?s:null}async resolveClassRefToUid(e){if(Tk.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,n){for(let{propertyName:i,value:s}of t){if(e[i]!==void 0)continue;let o=this.resolveSubstitutionMarker(s,n);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,n,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=Ah.DateFormatter.toLocalTimestamp(this.clock.now()),l.push("exo__Asset_createdAt")),e.exo__Asset_updatedAt===void 0&&(e.exo__Asset_updatedAt=e.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 p=this.substituteVariables(i.labelTemplate,s??"",t,o??void 0,c);p.trim().length>0&&(f=p)}catch(p){Is.LoggingService.error(`[GroundingExecutor] labelTemplate substitution failed: ${p instanceof Error?p.message:String(p)}. Falling back to "Untitled".`)}if(i?.omitLabel===!0&&(f===void 0||f.trim().length===0))delete e.exo__Asset_label;else{let p=f!==void 0&&f.trim().length>0?f:"Untitled";e.exo__Asset_label=p;let h=Object.keys(e).some(g=>(0,YA.canonicalYamlKey)(g)==="aliases");p!=="Untitled"&&!h&&(e.aliases=[p]),p==="Untitled"&&l.push("exo__Asset_label")}}e.exo__Instance_class===void 0&&n&&(e.exo__Instance_class=[`"[[${n}]]"`],l.push("exo__Instance_class")),l.length>0&&Is.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.`)}async applyMissingBacklinkTopUp(e,t,n,i,s){if(!n||t.linkBackProperty||e.exo__Asset_prototype!==void 0||e.ems__Effort_parent!==void 0)return;let o=qt.extractBacklinkTarget(n,i);if(qt.propertiesReferenceTarget(e,o))return;let c=s??await this.readTargetFrontmatter(n,i);if(!await this.targetIsPrototype(c))return;let l=c?.exo__Asset_uid,u=typeof l=="string"?l.trim().replace(/^['"]+|['"]+$/g,"").trim():"",f=u.length>0?u:o;e.exo__Asset_prototype=`"[[${f}]]"`,Is.LoggingService.error("[GroundingExecutor] No backlink rule fired (Universal IRs absent or no class match). Falling back to legacy exo__Asset_prototype default \u2014 the target is a prototype, so the link is valid.")}async readTargetFrontmatter(e,t){let n=t;if(!n){let i=qt.resolveTargetPath(e,"");if(!i)return null;n=/\.md$/i.test(i)?i:`${i}.md`}try{let i=await this.fileReader.readFile(n);return this.frontmatterService.parseObject(i)??null}catch{return null}}async targetIsPrototype(e){if(!e)return!1;let t=this.resolveClassRefsFromFrontmatter(e),n=new Set;for(let i of t)if(await this.classRefReachesPrototype(i,0,n))return!0;return!1}async classRefReachesPrototype(e,t,n){if(t>qt.MAX_PROTOTYPE_CLASS_WALK_DEPTH)return!1;let i=e.trim();if(!i||n.has(i))return!1;n.add(i);let s=i.split("|"),o=s[0].trim();if((s[1]??s[0]).trim()===qt.PROTOTYPE_CLASS_LABEL)return!0;if(!this.refToFrontmatter||!o)return!1;let l;try{l=await this.refToFrontmatter(o)}catch{return!1}if(!l)return!1;if(String(l.exo__Asset_label??"").trim()===qt.PROTOTYPE_CLASS_LABEL)return!0;let u=l.exo__Class_superClass,f=Array.isArray(u)?u:u==null?[]:[u];for(let d of f){let p=this.extractWikilinkInner(String(d));if(p&&await this.classRefReachesPrototype(p,t+1,n))return!0}return!1}static propertiesReferenceTarget(e,t){if(!t)return!1;let n=`[[${t}]]`,i=a(s=>typeof s=="string"&&s.includes(n),"refs");for(let s of Object.values(e))if(i(s)||Array.isArray(s)&&s.some(i))return!0;return!1}resolveSubstitutionMarker(e,t){let n=e.match(Ak);if(n){let c=n[1],l=n[2],u=qt.decodeBase64UrlSafe(l),f=(0,XA.getResolver)(c);return f?f(t,u):(Is.LoggingService.warn(`[GroundingExecutor] Parameterised marker references unknown resolver '${c}' \u2014 value left as marker.`),e)}let i=e.match(lZ);if(!i)return e;let s=i[1];if(s==="target"){let c=t.targetIRI??"",l=t.targetFilePath??"";return`"[[${qt.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,XA.getResolver)(s);return o?o(t):(Is.LoggingService.warn(`[GroundingExecutor] Marker references unknown resolver '${s}' \u2014 value left as marker.`),e)}static decodeBase64UrlSafe(e){return(0,tZ.base64ToUtf8)(e.replace(/-/g,"+").replace(/_/g,"/"))}async applyInheritanceRuleStep(e,t,n){let i=this.extractTargetClassNames(n),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=n[o.sourcePropertyName];c!=null&&(e[o.targetPropertyName]=this.formatInheritedValue(c))}}async inheritanceConditionMatches(e,t,n){return!e&&!t?!0:this.classRefMatchesAny(e,t,n)}async inheritanceExclusionMatches(e,t,n){for(let i of t??[])if(i&&n.includes(i))return!0;for(let i of e)if(await this.classRefMatchesAny(i,void 0,n))return!0;return!1}async classRefMatchesAny(e,t,n){if(t&&n.includes(t)||e&&n.includes(e))return!0;if(e&&this.classLabelToUid)try{let i=await this.classLabelToUid(e);if(i&&i.length>0&&n.includes(i))return!0}catch{}return!1}extractTargetClassNames(e){let t=e.exo__Instance_class;if(t==null)return[];let n=Array.isArray(t)?t:[t],i=[];for(let s of n){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):Tk.test(e)?`"[[${e}]]"`:e}reformatWikilink(e){return e.startsWith('"[[')&&e.endsWith(']]"')?e:e.startsWith("[[")&&e.endsWith("]]")?`"${e}"`:e}async executeStep(e,t,n,i,s){return e.type===jn.GroundingType.COMPOSITE?this.executeComposite(e,t,n,i,s):this.execute(e,t,n,i)}async rollback(e,t,n,i=[]){if(e!==void 0)try{await this.fileWriter.updateFile(t,e)}catch(s){Is.LoggingService.error(`[GroundingExecutor] Rollback failed for ${t}`,s instanceof Error?s:new Error(String(s)))}for(let s of i)try{await this.fileWriter.deleteFile(s)}catch(o){Is.LoggingService.error(`[GroundingExecutor] Rollback: failed to delete orphaned created asset ${s}`,o instanceof Error?o:new Error(String(o)))}}substituteVariables(e,t,n,i,s){let o=this.clock.now(),c=o.toISOString(),l=Ah.DateFormatter.toLocalTimestamp(o),u=this.resolveInstanceDate(n,o),f=`${u}T00:00:00`,d=`${l.slice(0,10)}-${l.slice(11,13)}-${l.slice(14,16)}`,p=e.replace(/\$target\.([A-Za-z_][\w]*)/g,(h,g)=>{if(!i)throw new Error(`$target.${g} substitution requires target frontmatter context; none was supplied (asset IRI: ${t})`);let m=i[g];if(m==null)throw new Error(`$target.${g} is undefined on asset ${t}`);if(Array.isArray(m))throw new Error(`$target.${g} resolved to an array on asset ${t}; only scalar properties are supported for substitution`);return(0,Fi.decodeYamlQuotedScalar)(String(m))});if(/\$targetFolder\b/.test(p)){if(!s)throw new Error("$targetFolder substitution requires targetFilePath context; none was supplied (asset IRI: "+t+")");let h=s.replace(/^\/+/,""),g=h.lastIndexOf("/"),m=g>=0?h.slice(0,g):"";p=p.replace(/\$targetFolder\b/g,m)}if(p=p.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),n){let h=n;p=p.replace(/\$input\.([A-Za-z_]\w*)|\$(?:input|value)\b/g,(g,m)=>{let b=m!==void 0?h[m]:h.value;return b==null?g:String(b)})}return p}async executePropertyAppend(e,t,n,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(n),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=(0,Fi.isCompleteDoubleQuotedScalar)(c)?(0,Fi.decodeYamlQuotedScalar)(c):c,d=new Set(u.map(Fi.decodeYamlQuotedScalar)),p;d.has(f)?p=u:p=[...u,(0,Fi.quoteYamlString)(f)];let h=this.stampUpdatedAt(s,this.frontmatterService.updateProperty(s,e.targetProperty,p),e.targetProperty);return await this.fileWriter.updateFile(n,h),{success:!0}}async executePropertyReplace(e,t,n,i){if(!e.targetProperty)return{success:!1,error:"property_replace requires targetProperty"};if(e.replaceFromExpression===void 0)return{success:!1,error:"property_replace requires replaceFromExpression"};if(e.replaceToExpression===void 0)return{success:!1,error:"property_replace requires replaceToExpression"};let s=await this.fileReader.readFile(n),o=this.frontmatterService.parseObject(s)??{},c=o[e.targetProperty];if(!Array.isArray(c))return{success:!1,error:`property_replace: <${e.targetProperty}> is not a list on this asset (replacing one element of a scalar is identical to property_set \u2014 use that instead)`};let l=c,u=a(b=>{let _=this.substituteVariables(b,t,i,o);return(0,Fi.isCompleteDoubleQuotedScalar)(_)?(0,Fi.decodeYamlQuotedScalar)(_):_},"plainOf"),f=u(e.replaceFromExpression),d=u(e.replaceToExpression),p=l.findIndex(b=>(0,Fi.decodeYamlQuotedScalar)(b)===f);if(p===-1)return{success:!1,error:`property_replace: "${f}" is not a value of <${e.targetProperty}> on this asset \u2014 refusing rather than appending`};let g=l.findIndex((b,_)=>_!==p&&(0,Fi.decodeYamlQuotedScalar)(b)===d)===-1?l.map((b,_)=>_===p?(0,Fi.quoteYamlString)(d):b):l.filter((b,_)=>_!==p),m=this.stampUpdatedAt(s,this.frontmatterService.updateProperty(s,e.targetProperty,g),e.targetProperty);return await this.fileWriter.updateFile(n,m),{success:!0}}async executePropertyIncrement(e,t){if(!e.targetProperty)return{success:!1,error:"property_increment requires targetProperty"};let n=e.incrementBy??1;if(!Number.isFinite(n)||!Number.isInteger(n))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+n,u=this.stampUpdatedAt(i,this.frontmatterService.updateProperty(i,e.targetProperty,l),e.targetProperty);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 n=await this.fileReader.readFile(t),s=(this.frontmatterService.parseObject(n)??{})[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=qt.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=Ah.DateFormatter.toLocalTimestamp(l),f=this.stampUpdatedAt(n,this.frontmatterService.updateProperty(n,e.targetProperty,u),e.targetProperty);return await this.fileWriter.updateFile(t,f),{success:!0}}async executeWorkflowTransition(e,t,n,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(n),o=this.frontmatterService.parseObject(s)??{},c=this.resolveClassRefsFromFrontmatter(o);if(c.length===0)return{success:!1,notApplicable:!0,error:"workflow_transition: target asset has no exo__Instance_class \u2014 status transitions are not available for it."};let l;try{l=new rZ.IRI(t)}catch(I){return{success:!1,error:`workflow_transition: invalid targetIRI "${t}" \u2014 ${I instanceof Error?I.message:String(I)}`}}let u=await this.workflowResolver.resolveForAssetOrNull(l,c);if(!u)return{success:!1,notApplicable:!0,error:"workflow_transition: this asset's class has no status workflow \u2014 status transitions are not available for it."};let f=this.resolveStatusFromFrontmatter(o);if(!f)return{success:!1,error:"workflow_transition: target asset has no parseable ems__Effort_status value (need wikilink to an ems__EffortStatus* asset)."};let d=e.direction??"forward",p=d==="rollback",h=u.transitions.find(I=>I.from===f&&I.isRollback===p);if(!h)return{success:!1,error:`workflow_transition: no ${d} transition from "${f}" defined in workflow "${u.name}" (target class: ${u.targetClass}).`};let g=Br.STATUS_UID_BY_ENUM[h.to];if(!g)return{success:!1,error:`workflow_transition: no UID mapping for destination status "${h.to}" (transition target unreachable).`};let m={id:`${e.id}.statusMutation`,label:`workflow_transition: ${h.from} \u2192 ${h.to}`,type:jn.GroundingType.PROPERTY_SET,targetProperty:"ems__Effort_status",targetValueRef:g},b=await this.executePropertySet(m,t,n,i);if(!b.success)return{success:!1,error:`workflow_transition: status mutation failed \u2014 ${b.error}`};let _=h.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 I of _){if(S===void 0)break;let E=await S(I);if(!E)return{success:!1,error:`workflow_transition: postAction grounding UID "${I}" could not be loaded (asset missing or invalid Grounding shape).`};let w=await this.execute(E,t,n,i);if(!w.success)return{success:!1,error:`workflow_transition: postAction "${E.label}" (UID ${I}) failed \u2014 ${w.error}`}}return{success:!0}}resolveClassRefsFromFrontmatter(e){let t=e.exo__Instance_class;if(t==null)return[];let n=Array.isArray(t)?t:[t],i=[];for(let s of n){if(typeof s!="string")continue;let o=s.replace(/^\s*"?\[\[/,"").replace(/\]\]"?\s*$/,"").trim();o.length>0&&i.push(o)}return i}resolveStatusFromFrontmatter(e){return(0,Rk.normalizeEffortStatus)(e.ems__Effort_status)}static applyIsoDuration(e,t){let n=t.trim();if(/^-?P(\d+Y)(\d+M)?$|^-?P\d+M$/.test(n)){let o=vk.DateTimeParsing.parseYearMonthDuration(n),c=new Date(e.getTime());return c.setMonth(c.getMonth()+o),c}let s=vk.DateTimeParsing.parseDayTimeDuration(n);return new Date(e.getTime()+s)}static extractBacklinkTarget(e,t){let n=qt.resolveTargetPath(e,t),i=n.split("/").pop()??n;return qt.UUID_BASENAME_RE.test(i)?i:n}static resolveTargetPath(e,t){if(t)return t.replace(/\.md$/i,"").replace(/^\/+/,"");if(e){let n=e.match(/^obsidian:\/\/vault\/(.+?)(?:\.md)?(?:\?|#|$)/i);if(n&&n[1])try{return decodeURIComponent(n[1])}catch{return n[1]}}return e}};Br.GroundingExecutor=Uf;Uf.UUID_BASENAME_RE=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;Uf.PROTOTYPE_CLASS_LABEL="exo__Prototype";Uf.MAX_PROTOTYPE_CLASS_WALK_DEPTH=6;Br.GroundingExecutor=Uf=qt=YJ([(0,QJ.injectable)(),XJ("design:paramtypes",[Object,Object,Tb,Function,Object])],Uf)});var Ok=T(JA=>{"use strict";Object.defineProperty(JA,"__esModule",{value:!0});JA.createVaultFrontmatterClassLabelResolver=fZ;function fZ(r){return async e=>{if(!e)return null;let t=await r.findFilesByMetadata({exo__Asset_label:e});if(t.length>0){let s=(await r.getFileMetadata(t[0])).exo__Asset_uid;if(typeof s=="string"&&s.length>0)return s}let n=await r.findFilesByMetadata({aliases:e});if(n.length>0){let s=(await r.getFileMetadata(n[0])).exo__Asset_uid;if(typeof s=="string"&&s.length>0)return s}return null}}a(fZ,"createVaultFrontmatterClassLabelResolver")});var Pk=T(ZA=>{"use strict";Object.defineProperty(ZA,"__esModule",{value:!0});ZA.createVaultFrontmatterRefToFolderResolver=dZ;function dZ(r){return async e=>{if(!e)return null;let t=await r.findFilesByMetadata({exo__Asset_uid:e});return t.length===0?null:pZ(t[0])}}a(dZ,"createVaultFrontmatterRefToFolderResolver");function pZ(r){let e=r.replace(/^\/+/,""),t=e.lastIndexOf("/");return t>=0?e.slice(0,t):""}a(pZ,"parentFolderOf")});var Fk=T(e2=>{"use strict";Object.defineProperty(e2,"__esModule",{value:!0});e2.createVaultFrontmatterRefToFrontmatterResolver=hZ;function hZ(r){return async e=>{if(!e)return null;let t=await r.findFilesByMetadata({exo__Asset_uid:e});return t.length===0?null:r.getFileMetadata(t[0])}}a(hZ,"createVaultFrontmatterRefToFrontmatterResolver")});var Lk=T(ma=>{"use strict";var mZ=ma&&ma.__decorate||function(r,e,t,n){var i=arguments.length,s=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,o;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(r,e,t,n);else for(var c=r.length-1;c>=0;c--)(o=r[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},gZ=ma&&ma.__metadata||function(r,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(r,e)},Bf;Object.defineProperty(ma,"__esModule",{value:!0});ma.NamedQueryRunner=void 0;var yZ=ct(),bZ=Le(),_Z=Ye(),Dk=rb(),SZ=oa(),t2=Bf=class{static{a(this,"NamedQueryRunner")}constructor(e,t){this.queryBodyResolver=e,this.tripleStore=t}async run(e,t={}){if(!e)return null;let n=await this.queryBodyResolver.resolveSparql(e);if(!n)return null;let i=this.substitute(n,t);return(0,Dk.evaluateWithExoEval)(i,{store:this.tripleStore})}async runScalar(e,t={},n){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,Dk.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=n??l[0];if(!u)return null;let f=c.get(u);return f===void 0?null:f instanceof bZ.IRI?{value:(0,SZ.iriToObsidianName)(f.value)??f.value,kind:"iri",iri:f.value}:f instanceof _Z.Literal?{value:f.value,kind:"literal"}:null}substitute(e,t){let n=e;t.currentAsset&&(n=n.replace(/\$currentAsset\b/g,Bf.formatIri(t.currentAsset))),t.currentClass&&(n=n.replace(/\$currentClass\b/g,Bf.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"?Bf.formatIri(c.value):`"${Bf.escapeLiteral(c.value)}"`,u=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");n=n.replace(new RegExp(`\\$${u}\\b`,"g"),l)}}return n}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")}};ma.NamedQueryRunner=t2;ma.NamedQueryRunner=t2=Bf=mZ([(0,yZ.injectable)(),gZ("design:paramtypes",[Object,Object])],t2)});var Nk=T(Ab=>{"use strict";Object.defineProperty(Ab,"__esModule",{value:!0});Ab.extractSparqlBlock=wZ;Ab.stripFrontmatter=EZ;function wZ(r){let e=r.match(/```sparql\s*\n([\s\S]*?)\n```/);if(!e)return null;let t=e[1].trim();return t.length>0?t:null}a(wZ,"extractSparqlBlock");function EZ(r){if(!r.startsWith("---"))return r;let e=r.indexOf(`
139
+ Details: ${t.message}`:"";console.error(`[Exocortex ERROR]${s} ${e}${o}`)}}};Eb.LoggingService=Th;Th.isVerbose=!1;Th.isDevelopment=void 0});var HA=T(vb=>{"use strict";Object.defineProperty(vb,"__esModule",{value:!0});vb.CLASS_UID_TO_LABEL=void 0;var zA=ml();vb.CLASS_UID_TO_LABEL=Object.freeze({"1b20a8f0-d745-4e93-91db-4531b3df120e":zA.AssetClass.TASK,"7db5eeff-718a-49b0-8d2b-39b084a356e3":zA.AssetClass.PROJECT,"1b0a5e34-dd7f-4ead-b43a-6c7c5a5ecaca":zA.AssetClass.MEETING})});var xk=T(Br=>{"use strict";var YJ=Br&&Br.__decorate||function(r,e,t,n){var i=arguments.length,s=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,o;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(r,e,t,n);else for(var c=r.length-1;c>=0;c--)(o=r[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},XJ=Br&&Br.__metadata||function(r,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(r,e)},qt;Object.defineProperty(Br,"__esModule",{value:!0});Br.GroundingExecutor=Br.ServiceRegistry=Br.CLASS_UID_TO_LABEL=Br.STATUS_UID_BY_ENUM=void 0;Br.missingInputHint=QA;Br.missingInputError=Ck;Br.findMissingInput=aZ;var QJ=ct(),JJ=_h(),ZJ=ob(),jn=cc(),eZ=kA(),tZ=ef(),Rk=Gu(),rZ=Le(),KA=zl(),Fi=Fl(),YA=Wl(),nZ=Hl(),iZ=oa(),Ek=gb(),Ah=vs(),vk=hh(),Is=Kl();Br.STATUS_UID_BY_ENUM=Rk.EFFORT_STATUS_UID;var sZ=HA();Object.defineProperty(Br,"CLASS_UID_TO_LABEL",{enumerable:!0,get:a(function(){return sZ.CLASS_UID_TO_LABEL},"get")});var XA=lb();(0,XA.installDefaultResolvers)();function oZ(r){if(r){if(r==="1b20a8f0-d745-4e93-91db-4531b3df120e")return"ems__Task";if(r==="7db5eeff-718a-49b0-8d2b-39b084a356e3")return"ems__Project";if(r==="ems__Task"||r==="ems__Project")return r}}a(oZ,"resolveClassFlipTarget");function QA(r,e){let t=e??{},n=a(c=>c!=null,"isProvided"),i=[...r.matchAll(/\$input\.([A-Za-z_]\w*)/g)].map(c=>c[1]),s=/\$input\b(?!\.)/.test(r)||/\$value\b/.test(r),o=i.find(c=>!n(t[c]));return o!==void 0?`--input '{"${o}":...}'`:s&&!n(t.value)?`--input '{"value":...}'`:null}a(QA,"missingInputHint");function Ck(r){return`property_set: value template references an input that was not provided (${r} required)`}a(Ck,"missingInputError");function aZ(r,e){let t=a(i=>{if(i.type===jn.GroundingType.PROPERTY_SET){if(i.targetValueRef!==void 0)return`"[[${i.targetValueRef}]]"`;if(i.targetValueLiteral!==void 0)return i.targetValueLiteral;if(i.targetValueSubstitution!==void 0)return i.targetValueSubstitution}},"staticTemplate"),n=a(i=>{let s=t(i);if(s!==void 0){let o=QA(s,e);if(o!==null)return o}for(let o of i.steps??[]){let c=n(o);if(c!==null)return c}return null},"visit");return n(r)}a(aZ,"findMissingInput");var cZ=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Tk=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,lZ=/^__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}__$/,Ak=/^__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_-]*)__$/,Tb=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())}};Br.ServiceRegistry=Tb;var Ik=20;function uZ(r){return/^\[\[[\s\S]*\]\]$/.test(r.trim())}a(uZ,"isUnquotedWikilink");var Uf=qt=class{static{a(this,"GroundingExecutor")}constructor(e,t,n,i,s){this.frontmatterService=new KA.FrontmatterService,this.fileReader=e,this.fileWriter=t,this.serviceRegistry=n,this.classLabelToUid=i,this.refToFolder=s?.refToFolder,this.refToFrontmatter=s?.refToFrontmatter,this.workflowResolver=s?.workflowResolver,this.groundingLoader=s?.groundingLoader,this.templateLoader=s?.templateLoader,this.namedQueryRunner=s?.namedQueryRunner,this.declaredRanges=s?.declaredRanges,this.clock=s?.clock??(0,JJ.liveClock)(),this.uidGen=s?.uidGenerator??(0,ZJ.liveUidGenerator)()}async execute(e,t,n,i){try{switch(e.type){case jn.GroundingType.PROPERTY_SET:return await this.executePropertySet(e,t,n,i);case jn.GroundingType.PROPERTY_DELETE:return await this.executePropertyDelete(e,n);case jn.GroundingType.PROPERTY_REPLACE:return await this.executePropertyReplace(e,t,n,i);case jn.GroundingType.COMPOSITE:return await this.executeComposite(e,t,n,i,0);case jn.GroundingType.SERVICE_CALL:return await this.executeServiceCall(e,t,n,i);case jn.GroundingType.CREATE_INSTANCE:return await this.executeCreateInstance(e,t,n,i);case jn.GroundingType.PROPERTY_APPEND:return await this.executePropertyAppend(e,t,n,i);case jn.GroundingType.PROPERTY_INCREMENT:return await this.executePropertyIncrement(e,n);case jn.GroundingType.PROPERTY_SHIFT:return await this.executePropertyShift(e,n);case jn.GroundingType.SPARQL_UPDATE:return{success:!1,error:"sparql_update grounding not yet implemented. Use property_set/property_delete instead."};case jn.GroundingType.WORKFLOW_TRANSITION:return await this.executeWorkflowTransition(e,t,n,i);case jn.GroundingType.BODY_TEMPLATE:return await this.executeBodyTemplate(e,t,n,i);default:return{success:!1,error:`Unknown grounding type: ${e.type}`}}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}stampUpdatedAt(e,t,n){return t===e||n!==void 0&&(0,YA.canonicalYamlKey)(KA.FrontmatterService.normalizeIRI(n))==="exo__Asset_updatedAt"||!this.frontmatterService.parse(t).exists?t:this.frontmatterService.updateProperty(t,"exo__Asset_updatedAt",Ah.DateFormatter.toLocalTimestamp(this.clock.now()))}async executePropertySet(e,t,n,i){if(!e.targetProperty)return{success:!1,error:"property_set requires targetProperty"};if(e.targetQuery!==void 0&&e.targetsCreatedInstance===!0)return{success:!1,error:"property_set: targetQuery and targetsCreatedInstance are mutually exclusive (both address the step's TARGET \u2014 pick one)."};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 I=await this.resolveTargetValueQuery(e.targetValueQuery,t);if(!I.success)return I;s=I.value}else return{success:!1,error:"property_set requires one of targetValueRef/targetValueLiteral/targetValueSubstitution/targetValueQuery"};let c=QA(s,i);if(c!==null)return{success:!1,error:Ck(c)};let l=e.targetValueRef!==void 0&&/\$/.test(e.targetValueRef),u;if(l){let I=this.substituteVariables(e.targetValueRef,t,i),E=I.trim().replace(/^["']|["']$/g,"").replace(/^\[\[|\]\]$/g,""),w=/\[\[|\]\]/.test(E)?null:(0,nZ.extractAssetReference)(I)?.trim()||null;if(w===null)return{success:!1,error:`property_set: asset-reference value ${JSON.stringify(I)} for ${e.targetProperty} is not a single reference \u2014 pass a BARE uid (or one [[uid]] / [[uid|alias]] wikilink, which is unwrapped); nested brackets, a link inside prose or an empty value would be written as a broken link.`};u=`"[[${w}]]"`}else u=this.substituteVariables(s,t,i);let f=KA.FrontmatterService.normalizeIRI(e.targetProperty),d=(0,YA.canonicalYamlKey)(f),p=(0,iZ.iriToObsidianName)(e.targetProperty)??f,h=this.declaredRanges?(await this.declaredRanges([p])).get(p):void 0,g=Fi.STRING_SCALAR_PROPERTIES.has(d),m=(0,Fi.scalarTypingForRange)(h)!==void 0?(0,Fi.serializeYamlScalar)(u,g,h):g?(0,Fi.serializeYamlScalar)(u,!0):u;if(uZ(m))return{success:!1,error:`property_set: value ${m} is an UNQUOTED wikilink \u2014 YAML reads it as a flow sequence, so the graph would receive a literal instead of a link (silent data loss). Pass the QUOTED form for a substituted reference (the quotes are part of the string, e.g. --input '{"<key>":"\\"[[<uid>]]\\""}'), or use targetValueRef, which takes a BARE uid and wraps it itself.`};let b=n;if(e.targetQuery!==void 0){let I=await this.resolveTargetQuery(e.targetQuery,t);if(!I.success)return I;b=I.path}let _=await this.fileReader.readFile(b),S=this.stampUpdatedAt(_,this.frontmatterService.updateProperty(_,e.targetProperty,m),e.targetProperty);return await this.fileWriter.updateFile(b,S),{success:!0}}async resolveTargetQuery(e,t){if(!this.namedQueryRunner)return{success:!1,error:"property_set targetQuery requires NamedQueryRunner injection (options.namedQueryRunner). Wire the plugin/CLI before using this target-source."};let n;try{n=await this.namedQueryRunner.runScalar(e,{currentAsset:t})}catch(s){return{success:!1,error:`property_set targetQuery: NamedQuery '${e}' failed \u2014 ${s instanceof Error?s.message:String(s)}`}}if(n===null)return{success:!1,error:`property_set targetQuery: NamedQuery '${e}' matched no asset (empty result set) \u2014 refusing to fall back to the click-target.`};if(n.kind!=="iri")return{success:!1,error:`property_set targetQuery: NamedQuery '${e}' returned a literal ('${n.value}'), not an asset reference \u2014 a target must be an asset.`};if(n.iri===void 0)return{success:!1,error:`property_set targetQuery: NamedQuery '${e}' returned an asset reference without its source IRI, so its file path cannot be resolved.`};let i=(0,Ek.iriToVaultPath)(n.iri);return i===null?{success:!1,error:`property_set targetQuery: NamedQuery '${e}' matched '${n.iri}', which is not a vault asset IRI (no resolvable file path).`}:{success:!0,path:i}}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 n;try{n=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 n===null?{success:!1,error:`property_set targetValueQuery: NamedQuery '${e}' returned no scalar value (empty result set or non-scalar shape).`}:{success:!0,value:n.kind==="iri"?`"[[${n.value}]]"`:n.value}}async executePropertyDelete(e,t){if(!e.targetProperty)return{success:!1,error:"property_delete requires targetProperty"};let n=await this.fileReader.readFile(t),i=this.stampUpdatedAt(n,this.frontmatterService.removeProperty(n,e.targetProperty),e.targetProperty);return await this.fileWriter.updateFile(t,i),{success:!0}}async executeComposite(e,t,n,i,s){if(s>=Ik)return{success:!1,error:`Composite grounding exceeded maximum depth of ${Ik}`};let o=e.steps??[];if(o.length===0)return{success:!0};let c;try{c=await this.fileReader.readFile(n)}catch{}let l=[],u,f=[];try{for(let d=0;d<o.length;d++){let p=o[d],g=(p.type===jn.GroundingType.BODY_TEMPLATE||p.targetsCreatedInstance===!0)&&u?u:n,m=await this.executeStep(p,t,g,i,s+1);if(!m.success)return await this.rollback(c,n,l,f),{success:!1,error:`Composite step ${d} failed: ${m.error}`};m.openPath&&(u=m.openPath),m.openPath&&f.push(m.openPath),m.createdPaths&&m.createdPaths.length>0&&f.push(...m.createdPaths),l.push(d)}return{success:!0,...f.length>0?{createdPaths:await this.resolveCreatedPaths(f)}:{}}}catch(d){return await this.rollback(c,n,l,f),{success:!1,error:`Composite execution failed: ${d instanceof Error?d.message:String(d)}`}}}async executeServiceCall(e,t,n,i){let s=e.targetProperty;if(!s)return{success:!1,error:"service_call requires targetProperty as serviceId"};if(e.targetQuery!==void 0&&e.targetsCreatedInstance===!0)return{success:!1,error:"service_call: targetQuery and targetsCreatedInstance are mutually exclusive (both address the step's TARGET \u2014 pick one)."};if(s==="convertToTask")return await this.executeConvertToTask(n);if(s==="updateProperty"){let f=oZ(e.targetValueRef);if(f==="ems__Task")return await this.executeConvertToTask(n);if(f==="ems__Project")return await this.executeConvertToProject(n)}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 f=this.substituteVariables(e.serviceCallPayload,t,i),d=JSON.parse(f);typeof d=="object"&&d!==null&&(c={...d,...c??{}})}catch{}let l=e.targetsCreatedInstance===!0&&n?(0,Ek.vaultPathToIRI)(n):t,u=await this.readServiceCallSnapshot(n);return await o.execute(l,c),await this.stampServiceCallTarget(n,u,c),{success:!0}}async readServiceCallSnapshot(e){if(!e||!await this.fileReader.fileExists(e))return;let t=await this.fileReader.readFile(e),n=this.frontmatterService.parseObject(t)?.exo__Asset_uid,i=typeof n=="string"?n.trim().replace(/^"|"$/g,""):"";if(!cZ.test(i))return{bytes:t};let s=e.lastIndexOf("/"),c=`${s>=0?e.slice(0,s+1):""}${i}.md`;return c===e?{bytes:t}:await this.fileReader.fileExists(c)?{bytes:t}:{bytes:t,canon:c}}async stampServiceCallTarget(e,t,n){if(t===void 0)return;let i=await this.locateServiceCallTarget(e,t);if(i===void 0)return;let s=t.bytes,o=await this.fileReader.readFile(i);if(o===s)return;let c=typeof n?.property=="string"?n.property:void 0,l=this.stampUpdatedAt(s,o,c);l!==o&&await this.fileWriter.updateFile(i,l)}async locateServiceCallTarget(e,t){if(await this.fileReader.fileExists(e))return e;if(t.canon!==void 0&&await this.fileReader.fileExists(t.canon))return t.canon}async executeConvertToTask(e){let t=await this.fileReader.readFile(e),n=await this.resolveClassRefToUid("ems__Task"),i=this.stampUpdatedAt(t,this.frontmatterService.updateProperty(t,"exo__Instance_class",`["[[${n}]]"]`),"exo__Instance_class");return await this.fileWriter.updateFile(e,i),{success:!0}}async executeConvertToProject(e){let t=await this.fileReader.readFile(e),n=await this.resolveClassRefToUid("ems__Project"),i=this.stampUpdatedAt(t,this.frontmatterService.updateProperty(t,"exo__Instance_class",`["[[${n}]]"]`),"exo__Instance_class");return await this.fileWriter.updateFile(e,i),{success:!0}}async executeBodyTemplate(e,t,n,i){let s=null;if(e.templateRef)if(this.templateLoader){if(s=await this.templateLoader(e.templateRef),s===null)return{success:!1,error:`body_template: templateRef "${e.templateRef}" did not resolve to a template body (asset missing or empty).`}}else{if(e.bodyTemplate===void 0)return{success:!1,error:`body_template: templateRef "${e.templateRef}" set but no TemplateLoaderPort is wired (and no inline bodyTemplate fallback).`};s=e.bodyTemplate}else if(e.bodyTemplate!==void 0)s=e.bodyTemplate;else return{success:!1,error:"body_template requires bodyTemplate or templateRef"};let o=(0,eZ.resolveTemplateBody)(s,{userInput:i,targetIRI:t,targetFilePath:n}),c;try{c=await this.fileReader.readFile(n)}catch(u){return{success:!1,error:`body_template: failed to read target file "${n}": ${u instanceof Error?u.message:String(u)}`}}let l=this.stampUpdatedAt(c,qt.replaceBody(c,o));return await this.fileWriter.updateFile(n,l),{success:!0}}static replaceBody(e,t){let n=e.match(/^---\r?\n[\s\S]*?\r?\n---/);return n?`${n[0]}
140
+ ${t}`:t}static extractBody(e){let t=e.match(/^---\r?\n[\s\S]*?\r?\n---/);return t?e.slice(t[0].length).replace(/^\r?\n/,""):e}async executeCreateInstance(e,t,n,i){if(!e.targetFolder)return{success:!1,error:"create_instance requires targetFolder"};let s={},o=null,c=null;if((e.inheritanceRule&&e.inheritanceRule.length>0||e.propertyDefault&&e.propertyDefault.some(E=>typeof E.value=="string"&&E.value.includes("__SUBSTITUTE"))||e.labelTemplate!==void 0&&/\$target\./.test(e.labelTemplate)||e.cloneTargetBody===!0)&&t&&n){let E;try{E=await this.fileReader.readFile(n)}catch(w){return{success:!1,error:`create_instance: failed to read $target file "${n}": ${w instanceof Error?w.message:String(w)}`}}o=this.frontmatterService.parseObject(E)??null,e.cloneTargetBody&&(c=qt.extractBody(E))}let u;e.targetClass&&(u=await this.resolveClassRefToUid(e.targetClass));let f=await this.preResolveTargetRefs(e.propertyDefault,o),d={userInput:i,targetIRI:t,targetFilePath:n,targetFm:o??void 0,targetRefFm:f,groundingTargetClassUid:u};if(e.propertyDefault&&e.propertyDefault.length>0&&this.applyPropertyDefaultStep(s,e.propertyDefault,d),this.applyMissingScalarPrimitives(s,i,u,e,t,o,n),i)for(let[E,w]of Object.entries(i))E!=="label"&&E!=="body"&&E!=="plannedDate"&&w!=null&&(s[E]=w);if(e.inheritanceRule&&e.inheritanceRule.length>0&&o&&await this.applyInheritanceRuleStep(s,e.inheritanceRule,o),await this.applyMissingBacklinkTopUp(s,e,t,n,o),t&&e.linkBackProperty&&s[e.linkBackProperty]===void 0){let E=qt.extractBacklinkTarget(t,n);s[e.linkBackProperty]=`"[[${E}]]"`}this.applyPrototypeTimePropagation(s,o,i);let p=s.exo__Asset_uid,h=this.declaredRanges?await this.declaredRanges(Object.keys(s)):void 0,g=this.frontmatterService.createFrontmatter("",s,h===void 0?void 0:E=>h.get(E)),m=e.targetFolder.includes("$isDefinedByFolder")?await this.resolveIsDefinedByFolder(s,n):this.substituteVariables(e.targetFolder,t,i,void 0,n),b=m?`${m}/${p}.md`:`${p}.md`,_=i?.body,S=typeof _=="string"&&_.length>0?_:e.cloneTargetBody&&typeof c=="string"&&c.length>0?c:null,I=S!==null?qt.replaceBody(g,S):g;return await this.fileWriter.createFile(b,I),{success:!0,openPath:b}}resolveInstanceDate(e,t){let n=qt.firstScalar(e?.plannedDate);return n&&/^\d{4}-\d{2}-\d{2}$/.test(n)?n:Ah.DateFormatter.toDateString(t??this.clock.now())}applyPrototypeTimePropagation(e,t,n){if(!t)return;let i=qt.firstScalar(t.ems__EffortPrototype_startTime),s=qt.firstScalar(t.ems__EffortPrototype_endTime);if(!i&&!s)return;let o=this.resolveInstanceDate(n);if(i&&e.ems__Effort_plannedStartTimestamp===void 0){let c=qt.combineDateAndTime(o,i);c!==null?e.ems__Effort_plannedStartTimestamp=c:Is.LoggingService.warn(`[GroundingExecutor] prototype ems__EffortPrototype_startTime "${i}" is not a valid HH:MM[:SS] time-of-day \u2014 skipping plannedStartTimestamp stamp.`)}if(s&&e.ems__Effort_plannedEndTimestamp===void 0){let c=qt.combineDateAndTime(o,s);c!==null?e.ems__Effort_plannedEndTimestamp=c:Is.LoggingService.warn(`[GroundingExecutor] prototype ems__EffortPrototype_endTime "${s}" is not a valid HH:MM[:SS] time-of-day \u2014 skipping plannedEndTimestamp stamp.`)}}static firstScalar(e){if(e==null)return null;let t=Array.isArray(e)?e[0]:e;if(typeof t!="string")return null;let n=t.trim().replace(/^["'](.*)["']$/,"$1").trim();return n.length>0?n:null}static combineDateAndTime(e,t){if(!/^([01]\d|2[0-3]):[0-5]\d(:[0-5]\d)?$/.test(t))return null;let n=/^\d{2}:\d{2}$/.test(t)?`${t}:00`:t;return`${e}T${n}`}async resolveIsDefinedByFolder(e,t){let n=qt.parentFolderOf(t),i=e.exo__Asset_isDefinedBy,s=qt.extractBareRef(i);if(s&&this.refToFolder)try{let o=await this.refToFolder(s);if(o!=null)return o}catch(o){Is.LoggingService.error(`[GroundingExecutor] $isDefinedByFolder resolution failed for ref "${s}" \u2014 falling back to host folder.`,o instanceof Error?o:new Error(String(o)))}return n}static parentFolderOf(e){let t=e.replace(/^\/+/,""),n=t.lastIndexOf("/");return n>=0?t.slice(0,n):""}static extractBareRef(e){if(typeof e!="string")return null;let t=e.trim();t=t.replace(/^["']|["']$/g,"").trim(),t=t.replace(/^\[\[/,"").replace(/\]\]$/,"");let n=t.indexOf("|");return n>=0&&(t=t.slice(0,n)),t=t.trim(),t.length>0?t:null}async preResolveTargetRefs(e,t){if(!e||!this.refToFrontmatter||!t)return;let n=new Set;for(let{value:s}of e){if(typeof s!="string")continue;let o=qt.extractTargetRefPropertyRefKey(s);o&&n.add(o)}if(n.size===0)return;let i={};for(let s of n){let o=t[s],c=Array.isArray(o)?o[0]:o,l=qt.extractBareRef(c);if(!l){i[s]=null;continue}try{i[s]=await this.refToFrontmatter(l)}catch(u){Is.LoggingService.error(`[GroundingExecutor] targetRefProperty second-hop resolution failed for ref "${l}" (refKey "${s}") \u2014 routing skipped, instance co-locates with the click-target.`,u instanceof Error?u:new Error(String(u))),i[s]=null}}return i}static extractTargetRefPropertyRefKey(e){let t=e.match(Ak);if(!t||t[1]!=="targetRefProperty")return null;let n=qt.decodeBase64UrlSafe(t[2]),i=n.indexOf("|");if(i<0)return null;let s=n.slice(0,i);return s.length>0?s:null}async resolveClassRefToUid(e){if(Tk.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,n){for(let{propertyName:i,value:s}of t){if(e[i]!==void 0)continue;let o=this.resolveSubstitutionMarker(s,n);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,n,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=Ah.DateFormatter.toLocalTimestamp(this.clock.now()),l.push("exo__Asset_createdAt")),e.exo__Asset_updatedAt===void 0&&(e.exo__Asset_updatedAt=e.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 p=this.substituteVariables(i.labelTemplate,s??"",t,o??void 0,c);p.trim().length>0&&(f=p)}catch(p){Is.LoggingService.error(`[GroundingExecutor] labelTemplate substitution failed: ${p instanceof Error?p.message:String(p)}. Falling back to "Untitled".`)}if(i?.omitLabel===!0&&(f===void 0||f.trim().length===0))delete e.exo__Asset_label;else{let p=f!==void 0&&f.trim().length>0?f:"Untitled";e.exo__Asset_label=p;let h=Object.keys(e).some(g=>(0,YA.canonicalYamlKey)(g)==="aliases");p!=="Untitled"&&!h&&(e.aliases=[p]),p==="Untitled"&&l.push("exo__Asset_label")}}e.exo__Instance_class===void 0&&n&&(e.exo__Instance_class=[`"[[${n}]]"`],l.push("exo__Instance_class")),l.length>0&&Is.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.`)}async applyMissingBacklinkTopUp(e,t,n,i,s){if(!n||t.linkBackProperty||e.exo__Asset_prototype!==void 0||e.ems__Effort_parent!==void 0)return;let o=qt.extractBacklinkTarget(n,i);if(qt.propertiesReferenceTarget(e,o))return;let c=s??await this.readTargetFrontmatter(n,i);if(!await this.targetIsPrototype(c))return;let l=c?.exo__Asset_uid,u=typeof l=="string"?l.trim().replace(/^['"]+|['"]+$/g,"").trim():"",f=u.length>0?u:o;e.exo__Asset_prototype=`"[[${f}]]"`,Is.LoggingService.error("[GroundingExecutor] No backlink rule fired (Universal IRs absent or no class match). Falling back to legacy exo__Asset_prototype default \u2014 the target is a prototype, so the link is valid.")}async readTargetFrontmatter(e,t){let n=t;if(!n){let i=qt.resolveTargetPath(e,"");if(!i)return null;n=/\.md$/i.test(i)?i:`${i}.md`}try{let i=await this.fileReader.readFile(n);return this.frontmatterService.parseObject(i)??null}catch{return null}}async targetIsPrototype(e){if(!e)return!1;let t=this.resolveClassRefsFromFrontmatter(e),n=new Set;for(let i of t)if(await this.classRefReachesPrototype(i,0,n))return!0;return!1}async classRefReachesPrototype(e,t,n){if(t>qt.MAX_PROTOTYPE_CLASS_WALK_DEPTH)return!1;let i=e.trim();if(!i||n.has(i))return!1;n.add(i);let s=i.split("|"),o=s[0].trim();if((s[1]??s[0]).trim()===qt.PROTOTYPE_CLASS_LABEL)return!0;if(!this.refToFrontmatter||!o)return!1;let l;try{l=await this.refToFrontmatter(o)}catch{return!1}if(!l)return!1;if(String(l.exo__Asset_label??"").trim()===qt.PROTOTYPE_CLASS_LABEL)return!0;let u=l.exo__Class_superClass,f=Array.isArray(u)?u:u==null?[]:[u];for(let d of f){let p=this.extractWikilinkInner(String(d));if(p&&await this.classRefReachesPrototype(p,t+1,n))return!0}return!1}static propertiesReferenceTarget(e,t){if(!t)return!1;let n=`[[${t}]]`,i=a(s=>typeof s=="string"&&s.includes(n),"refs");for(let s of Object.values(e))if(i(s)||Array.isArray(s)&&s.some(i))return!0;return!1}resolveSubstitutionMarker(e,t){let n=e.match(Ak);if(n){let c=n[1],l=n[2],u=qt.decodeBase64UrlSafe(l),f=(0,XA.getResolver)(c);return f?f(t,u):(Is.LoggingService.warn(`[GroundingExecutor] Parameterised marker references unknown resolver '${c}' \u2014 value left as marker.`),e)}let i=e.match(lZ);if(!i)return e;let s=i[1];if(s==="target"){let c=t.targetIRI??"",l=t.targetFilePath??"";return`"[[${qt.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,XA.getResolver)(s);return o?o(t):(Is.LoggingService.warn(`[GroundingExecutor] Marker references unknown resolver '${s}' \u2014 value left as marker.`),e)}static decodeBase64UrlSafe(e){return(0,tZ.base64ToUtf8)(e.replace(/-/g,"+").replace(/_/g,"/"))}async applyInheritanceRuleStep(e,t,n){let i=this.extractTargetClassNames(n),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=n[o.sourcePropertyName];c!=null&&(e[o.targetPropertyName]=this.formatInheritedValue(c))}}async inheritanceConditionMatches(e,t,n){return!e&&!t?!0:this.classRefMatchesAny(e,t,n)}async inheritanceExclusionMatches(e,t,n){for(let i of t??[])if(i&&n.includes(i))return!0;for(let i of e)if(await this.classRefMatchesAny(i,void 0,n))return!0;return!1}async classRefMatchesAny(e,t,n){if(t&&n.includes(t)||e&&n.includes(e))return!0;if(e&&this.classLabelToUid)try{let i=await this.classLabelToUid(e);if(i&&i.length>0&&n.includes(i))return!0}catch{}return!1}extractTargetClassNames(e){let t=e.exo__Instance_class;if(t==null)return[];let n=Array.isArray(t)?t:[t],i=[];for(let s of n){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):Tk.test(e)?`"[[${e}]]"`:e}reformatWikilink(e){return e.startsWith('"[[')&&e.endsWith(']]"')?e:e.startsWith("[[")&&e.endsWith("]]")?`"${e}"`:e}async executeStep(e,t,n,i,s){return e.type===jn.GroundingType.COMPOSITE?this.executeComposite(e,t,n,i,s):this.execute(e,t,n,i)}async resolveCreatedPaths(e){let t=[],n;for(let i of e){if(await this.fileReader.fileExists(i)){t.push(i);continue}let s=i.slice(i.lastIndexOf("/")+1);if(s.length===0){t.push(i);continue}try{n??(n=await this.fileReader.getMarkdownFiles())}catch{t.push(i);continue}let o=n.filter(c=>c.slice(c.lastIndexOf("/")+1)===s);t.push(o.length===1?o[0]:i)}return t}async rollback(e,t,n,i=[]){if(e!==void 0)try{await this.fileWriter.updateFile(t,e)}catch(s){Is.LoggingService.error(`[GroundingExecutor] Rollback failed for ${t}`,s instanceof Error?s:new Error(String(s)))}for(let s of i)try{await this.fileWriter.deleteFile(s)}catch(o){Is.LoggingService.error(`[GroundingExecutor] Rollback: failed to delete orphaned created asset ${s}`,o instanceof Error?o:new Error(String(o)))}}substituteVariables(e,t,n,i,s){let o=this.clock.now(),c=o.toISOString(),l=Ah.DateFormatter.toLocalTimestamp(o),u=this.resolveInstanceDate(n,o),f=`${u}T00:00:00`,d=`${l.slice(0,10)}-${l.slice(11,13)}-${l.slice(14,16)}`,p=e.replace(/\$target\.([A-Za-z_][\w]*)/g,(h,g)=>{if(!i)throw new Error(`$target.${g} substitution requires target frontmatter context; none was supplied (asset IRI: ${t})`);let m=i[g];if(m==null)throw new Error(`$target.${g} is undefined on asset ${t}`);if(Array.isArray(m))throw new Error(`$target.${g} resolved to an array on asset ${t}; only scalar properties are supported for substitution`);return(0,Fi.decodeYamlQuotedScalar)(String(m))});if(/\$targetFolder\b/.test(p)){if(!s)throw new Error("$targetFolder substitution requires targetFilePath context; none was supplied (asset IRI: "+t+")");let h=s.replace(/^\/+/,""),g=h.lastIndexOf("/"),m=g>=0?h.slice(0,g):"";p=p.replace(/\$targetFolder\b/g,m)}if(p=p.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),n){let h=n;p=p.replace(/\$input\.([A-Za-z_]\w*)|\$(?:input|value)\b/g,(g,m)=>{let b=m!==void 0?h[m]:h.value;return b==null?g:String(b)})}return p}async executePropertyAppend(e,t,n,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(n),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=(0,Fi.isCompleteDoubleQuotedScalar)(c)?(0,Fi.decodeYamlQuotedScalar)(c):c,d=new Set(u.map(Fi.decodeYamlQuotedScalar)),p;d.has(f)?p=u:p=[...u,(0,Fi.quoteYamlString)(f)];let h=this.stampUpdatedAt(s,this.frontmatterService.updateProperty(s,e.targetProperty,p),e.targetProperty);return await this.fileWriter.updateFile(n,h),{success:!0}}async executePropertyReplace(e,t,n,i){if(!e.targetProperty)return{success:!1,error:"property_replace requires targetProperty"};if(e.replaceFromExpression===void 0)return{success:!1,error:"property_replace requires replaceFromExpression"};if(e.replaceToExpression===void 0)return{success:!1,error:"property_replace requires replaceToExpression"};let s=await this.fileReader.readFile(n),o=this.frontmatterService.parseObject(s)??{},c=o[e.targetProperty];if(!Array.isArray(c))return{success:!1,error:`property_replace: <${e.targetProperty}> is not a list on this asset (replacing one element of a scalar is identical to property_set \u2014 use that instead)`};let l=c,u=a(b=>{let _=this.substituteVariables(b,t,i,o);return(0,Fi.isCompleteDoubleQuotedScalar)(_)?(0,Fi.decodeYamlQuotedScalar)(_):_},"plainOf"),f=u(e.replaceFromExpression),d=u(e.replaceToExpression),p=l.findIndex(b=>(0,Fi.decodeYamlQuotedScalar)(b)===f);if(p===-1)return{success:!1,error:`property_replace: "${f}" is not a value of <${e.targetProperty}> on this asset \u2014 refusing rather than appending`};let g=l.findIndex((b,_)=>_!==p&&(0,Fi.decodeYamlQuotedScalar)(b)===d)===-1?l.map((b,_)=>_===p?(0,Fi.quoteYamlString)(d):b):l.filter((b,_)=>_!==p),m=this.stampUpdatedAt(s,this.frontmatterService.updateProperty(s,e.targetProperty,g),e.targetProperty);return await this.fileWriter.updateFile(n,m),{success:!0}}async executePropertyIncrement(e,t){if(!e.targetProperty)return{success:!1,error:"property_increment requires targetProperty"};let n=e.incrementBy??1;if(!Number.isFinite(n)||!Number.isInteger(n))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+n,u=this.stampUpdatedAt(i,this.frontmatterService.updateProperty(i,e.targetProperty,l),e.targetProperty);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 n=await this.fileReader.readFile(t),s=(this.frontmatterService.parseObject(n)??{})[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=qt.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=Ah.DateFormatter.toLocalTimestamp(l),f=this.stampUpdatedAt(n,this.frontmatterService.updateProperty(n,e.targetProperty,u),e.targetProperty);return await this.fileWriter.updateFile(t,f),{success:!0}}async executeWorkflowTransition(e,t,n,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(n),o=this.frontmatterService.parseObject(s)??{},c=this.resolveClassRefsFromFrontmatter(o);if(c.length===0)return{success:!1,notApplicable:!0,error:"workflow_transition: target asset has no exo__Instance_class \u2014 status transitions are not available for it."};let l;try{l=new rZ.IRI(t)}catch(I){return{success:!1,error:`workflow_transition: invalid targetIRI "${t}" \u2014 ${I instanceof Error?I.message:String(I)}`}}let u=await this.workflowResolver.resolveForAssetOrNull(l,c);if(!u)return{success:!1,notApplicable:!0,error:"workflow_transition: this asset's class has no status workflow \u2014 status transitions are not available for it."};let f=this.resolveStatusFromFrontmatter(o);if(!f)return{success:!1,error:"workflow_transition: target asset has no parseable ems__Effort_status value (need wikilink to an ems__EffortStatus* asset)."};let d=e.direction??"forward",p=d==="rollback",h=u.transitions.find(I=>I.from===f&&I.isRollback===p);if(!h)return{success:!1,error:`workflow_transition: no ${d} transition from "${f}" defined in workflow "${u.name}" (target class: ${u.targetClass}).`};let g=Br.STATUS_UID_BY_ENUM[h.to];if(!g)return{success:!1,error:`workflow_transition: no UID mapping for destination status "${h.to}" (transition target unreachable).`};let m={id:`${e.id}.statusMutation`,label:`workflow_transition: ${h.from} \u2192 ${h.to}`,type:jn.GroundingType.PROPERTY_SET,targetProperty:"ems__Effort_status",targetValueRef:g},b=await this.executePropertySet(m,t,n,i);if(!b.success)return{success:!1,error:`workflow_transition: status mutation failed \u2014 ${b.error}`};let _=h.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 I of _){if(S===void 0)break;let E=await S(I);if(!E)return{success:!1,error:`workflow_transition: postAction grounding UID "${I}" could not be loaded (asset missing or invalid Grounding shape).`};let w=await this.execute(E,t,n,i);if(!w.success)return{success:!1,error:`workflow_transition: postAction "${E.label}" (UID ${I}) failed \u2014 ${w.error}`}}return{success:!0}}resolveClassRefsFromFrontmatter(e){let t=e.exo__Instance_class;if(t==null)return[];let n=Array.isArray(t)?t:[t],i=[];for(let s of n){if(typeof s!="string")continue;let o=s.replace(/^\s*"?\[\[/,"").replace(/\]\]"?\s*$/,"").trim();o.length>0&&i.push(o)}return i}resolveStatusFromFrontmatter(e){return(0,Rk.normalizeEffortStatus)(e.ems__Effort_status)}static applyIsoDuration(e,t){let n=t.trim();if(/^-?P(\d+Y)(\d+M)?$|^-?P\d+M$/.test(n)){let o=vk.DateTimeParsing.parseYearMonthDuration(n),c=new Date(e.getTime());return c.setMonth(c.getMonth()+o),c}let s=vk.DateTimeParsing.parseDayTimeDuration(n);return new Date(e.getTime()+s)}static extractBacklinkTarget(e,t){let n=qt.resolveTargetPath(e,t),i=n.split("/").pop()??n;return qt.UUID_BASENAME_RE.test(i)?i:n}static resolveTargetPath(e,t){if(t)return t.replace(/\.md$/i,"").replace(/^\/+/,"");if(e){let n=e.match(/^obsidian:\/\/vault\/(.+?)(?:\.md)?(?:\?|#|$)/i);if(n&&n[1])try{return decodeURIComponent(n[1])}catch{return n[1]}}return e}};Br.GroundingExecutor=Uf;Uf.UUID_BASENAME_RE=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;Uf.PROTOTYPE_CLASS_LABEL="exo__Prototype";Uf.MAX_PROTOTYPE_CLASS_WALK_DEPTH=6;Br.GroundingExecutor=Uf=qt=YJ([(0,QJ.injectable)(),XJ("design:paramtypes",[Object,Object,Tb,Function,Object])],Uf)});var Ok=T(JA=>{"use strict";Object.defineProperty(JA,"__esModule",{value:!0});JA.createVaultFrontmatterClassLabelResolver=fZ;function fZ(r){return async e=>{if(!e)return null;let t=await r.findFilesByMetadata({exo__Asset_label:e});if(t.length>0){let s=(await r.getFileMetadata(t[0])).exo__Asset_uid;if(typeof s=="string"&&s.length>0)return s}let n=await r.findFilesByMetadata({aliases:e});if(n.length>0){let s=(await r.getFileMetadata(n[0])).exo__Asset_uid;if(typeof s=="string"&&s.length>0)return s}return null}}a(fZ,"createVaultFrontmatterClassLabelResolver")});var Pk=T(ZA=>{"use strict";Object.defineProperty(ZA,"__esModule",{value:!0});ZA.createVaultFrontmatterRefToFolderResolver=dZ;function dZ(r){return async e=>{if(!e)return null;let t=await r.findFilesByMetadata({exo__Asset_uid:e});return t.length===0?null:pZ(t[0])}}a(dZ,"createVaultFrontmatterRefToFolderResolver");function pZ(r){let e=r.replace(/^\/+/,""),t=e.lastIndexOf("/");return t>=0?e.slice(0,t):""}a(pZ,"parentFolderOf")});var Fk=T(e2=>{"use strict";Object.defineProperty(e2,"__esModule",{value:!0});e2.createVaultFrontmatterRefToFrontmatterResolver=hZ;function hZ(r){return async e=>{if(!e)return null;let t=await r.findFilesByMetadata({exo__Asset_uid:e});return t.length===0?null:r.getFileMetadata(t[0])}}a(hZ,"createVaultFrontmatterRefToFrontmatterResolver")});var Lk=T(ma=>{"use strict";var mZ=ma&&ma.__decorate||function(r,e,t,n){var i=arguments.length,s=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,o;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(r,e,t,n);else for(var c=r.length-1;c>=0;c--)(o=r[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},gZ=ma&&ma.__metadata||function(r,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(r,e)},Bf;Object.defineProperty(ma,"__esModule",{value:!0});ma.NamedQueryRunner=void 0;var yZ=ct(),bZ=Le(),_Z=Ye(),Dk=rb(),SZ=oa(),t2=Bf=class{static{a(this,"NamedQueryRunner")}constructor(e,t){this.queryBodyResolver=e,this.tripleStore=t}async run(e,t={}){if(!e)return null;let n=await this.queryBodyResolver.resolveSparql(e);if(!n)return null;let i=this.substitute(n,t);return(0,Dk.evaluateWithExoEval)(i,{store:this.tripleStore})}async runScalar(e,t={},n){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,Dk.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=n??l[0];if(!u)return null;let f=c.get(u);return f===void 0?null:f instanceof bZ.IRI?{value:(0,SZ.iriToObsidianName)(f.value)??f.value,kind:"iri",iri:f.value}:f instanceof _Z.Literal?{value:f.value,kind:"literal"}:null}substitute(e,t){let n=e;t.currentAsset&&(n=n.replace(/\$currentAsset\b/g,Bf.formatIri(t.currentAsset))),t.currentClass&&(n=n.replace(/\$currentClass\b/g,Bf.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"?Bf.formatIri(c.value):`"${Bf.escapeLiteral(c.value)}"`,u=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");n=n.replace(new RegExp(`\\$${u}\\b`,"g"),l)}}return n}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")}};ma.NamedQueryRunner=t2;ma.NamedQueryRunner=t2=Bf=mZ([(0,yZ.injectable)(),gZ("design:paramtypes",[Object,Object])],t2)});var Nk=T(Ab=>{"use strict";Object.defineProperty(Ab,"__esModule",{value:!0});Ab.extractSparqlBlock=wZ;Ab.stripFrontmatter=EZ;function wZ(r){let e=r.match(/```sparql\s*\n([\s\S]*?)\n```/);if(!e)return null;let t=e[1].trim();return t.length>0?t:null}a(wZ,"extractSparqlBlock");function EZ(r){if(!r.startsWith("---"))return r;let e=r.indexOf(`
141
141
  ---`,3);return e<0?r:r.slice(e+4)}a(EZ,"stripFrontmatter")});var Mk=T(ga=>{"use strict";var vZ=ga&&ga.__decorate||function(r,e,t,n){var i=arguments.length,s=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,o;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(r,e,t,n);else for(var c=r.length-1;c>=0;c--)(o=r[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},TZ=ga&&ga.__metadata||function(r,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(r,e)},Ih;Object.defineProperty(ga,"__esModule",{value:!0});ga.CommandExecutionFlow=void 0;var AZ=ct(),kk=cc(),IZ=Le(),RZ=Ye(),CZ=Wt(),xZ=vs(),Ib=Ih=class{static{a(this,"CommandExecutionFlow")}constructor(e,t,n,i,s,o,c){this.groundingExecutor=e,this.notificationService=t,this.logger=n,this.prompts=i,this.tripleStore=s,this.fileOpener=o,this.requiredPropertyResolver=c}async run(e,t){let{command:n}=e;if(n.confirmMessage&&!await this.prompts.confirm(n.confirmMessage))return;let i=t.injectedUserInput,s=Ih.extractInputSchema(e);if(s!==null&&s.length>0){let l=await this.applyLabelDatePrefill(s,n.grounding,t.targetIRI);l=await this.applyRequiredPropertyFields(l,n.grounding,t);let u=await this.prompts.promptInputSchema(l);if(u===null)return;i={...t.injectedUserInput??{},...u}}let o=await this.groundingExecutor.execute(n.grounding,t.targetIRI??"",t.filePath??"",i),c=t.filePath??"<no-file>";if(o.success){if(n.successMessage&&this.notificationService.success(n.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:n.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 "${n.name}" on ${c}`)}else o.notApplicable?(this.notificationService.info(o.error??"This command is not available for this asset."),this.logger.info(`[CommandExecutionFlow] Not applicable "${n.name}": ${o.error}`)):(this.notificationService.error(`Command failed: ${o.error??"unknown error"}`),this.logger.info(`[CommandExecutionFlow] Failed "${n.name}": ${o.error}`))}static extractInputSchema(e){let n=e.command.grounding.inputSchema;return!n||!Array.isArray(n)?null:n}async applyLabelDatePrefill(e,t,n){if(t.type!==kk.GroundingType.CREATE_INSTANCE||!t.prefillLabelWithDate||!n||!this.tripleStore)return e;let i=await this.resolveAssetLabel(n);if(!i)return e;let s=xZ.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 applyRequiredPropertyFields(e,t,n){if(t.type!==kk.GroundingType.CREATE_INSTANCE||t.targetClass||!this.requiredPropertyResolver||!n.filePath)return e;let i=Ih.basenameUid(n.filePath);if(!i)return e;let s;try{s=await this.requiredPropertyResolver(i)}catch(l){return this.logger.info(`[CommandExecutionFlow] required-property resolution failed for "${i}": ${l instanceof Error?l.message:String(l)}`),e}if(s.length===0)return e;let o=new Set(Ih.ALWAYS_COVERED);for(let l of e)l&&typeof l=="object"&&typeof l.name=="string"&&o.add(l.name);let c=s.filter(l=>!o.has(l.propertyKey)).map(l=>{let u={name:l.propertyKey,type:l.fieldType,label:l.label,required:!0};return l.targetClassUid&&(u.targetClassUid=l.targetClassUid),l.fieldType==="boolean"&&(u.defaultValue="false"),u});return c.length===0?e:[...e,...c]}static basenameUid(e){let t=e.replace(/^\/+/,"").split("/").pop()?.replace(/\.md$/i,"");return t&&/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(t)?t.toLowerCase():null}async resolveAssetLabel(e){if(!this.tripleStore)return;let t=new IZ.IRI(e),n=await this.tripleStore.match(t,CZ.Namespace.EXO.term("Asset_label"),void 0);if(n.length===0)return;let i=n[0].object;if(i instanceof RZ.Literal)return i.value.length>0?i.value:void 0}};ga.CommandExecutionFlow=Ib;Ib.ALWAYS_COVERED=["exo__Asset_uid","exo__Asset_createdAt","exo__Asset_updatedAt","exo__Asset_label","exo__Asset_createdBy","exo__Instance_class","exo__Asset_isDefinedBy"];ga.CommandExecutionFlow=Ib=Ih=vZ([(0,AZ.injectable)(),TZ("design:paramtypes",[Function,Object,Object,Object,Object,Object,Function])],Ib)});var n2=T(r2=>{"use strict";Object.defineProperty(r2,"__esModule",{value:!0});r2.parseMinCount=jk;var OZ=Ye();function jk(r){if(Array.isArray(r)){let e;for(let t of r){let n=jk(t);n!==void 0&&(e===void 0||n>e)&&(e=n)}return e}if(r instanceof OZ.Literal){let e=parseInt(r.value,10);return Number.isNaN(e)?void 0:e}if(typeof r=="string"){let e=parseInt(r.trim().replace(/^["']|["']$/g,""),10);return Number.isNaN(e)?void 0:e}}a(jk,"parseMinCount")});var Gk=T(Cb=>{"use strict";Object.defineProperty(Cb,"__esModule",{value:!0});Cb.createTripleStoreRequiredPropertyResolver=NZ;Cb.createTripleStoreClassPropertyResolver=kZ;var si=Le(),Vf=Ye(),Gf=Wt(),i2=oa(),Uk=n2(),PZ=Yy(),FZ=/\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.md$/i,DZ=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function Rb(r){let e=FZ.exec(r);return e?e[1].toLowerCase():DZ.test(r.trim())?r.trim().toLowerCase():null}a(Rb,"uidFrom");function LZ(r){let e=(0,PZ.xsdDatatypeLocalName)(r);return e===null?null:e.toLowerCase()}a(LZ,"xsdLocalName");function Bk(r){for(let e of r){let t=e.value,n=LZ(t);if(n!==null)return n==="date"||n==="datetime"?{fieldType:"date"}:n==="boolean"?{fieldType:"boolean"}:["integer","int","long","short","decimal","float","double","nonnegativeinteger","positiveinteger"].includes(n)?{fieldType:"number"}:{fieldType:"text"};if(e.iri){let i=Rb(t)??(0,i2.iriToObsidianName)(t);return i?{fieldType:"assetRef",targetClassUid:i}:{fieldType:"assetRef"}}}return{fieldType:"text"}}a(Bk,"fieldTypeFromRange");function Rh(r){let e=Rb(r);if(e)return e;let t=(0,i2.iriToObsidianName)(r);return t?t.trim().toLowerCase():null}a(Rh,"classKeyOf");function $k(r){let t=(r instanceof Vf.Literal?r.value:r instanceof si.IRI?(0,i2.iriToObsidianName)(r.value)??"":"").trim().toLowerCase();return t.length>0?t:null}a($k,"labelKeyOf");async function Vk(r,e){let t=Gf.Namespace.EXO,n=Gf.Namespace.RDFS,i=Rh(e)??e.trim().toLowerCase();if(!i)return new Set;let s=new Map,o=a((h,g)=>{let m=s.get(h);m||(m=new Set,s.set(h,m)),m.add(g)},"rememberIRI"),c=new Map,l=a(async h=>{let g=c.get(h);if(g)return g;let m=new Set;for(let _ of s.get(h)??[])if(Rb(_))for(let S of[t.term("Asset_label"),n.term("label")])for(let I of await r.match(new si.IRI(_),S,void 0)){let E=$k(I.object);E&&E!==h&&m.add(E)}else for(let S of await r.match(void 0,t.term("Asset_label"),new si.IRI(_))){let I=S.subject instanceof si.IRI?Rb(S.subject.value):null;I&&I!==h&&m.add(I)}if(h===i){for(let _ of await r.match(void 0,t.term("Asset_uid"),new Vf.Literal(i)))if(_.subject instanceof si.IRI)for(let S of[t.term("Asset_label"),n.term("label")])for(let I of await r.match(_.subject,S,void 0)){let E=$k(I.object);E&&E!==h&&m.add(E)}}let b=[...m];return c.set(h,b),b},"twinsOf"),u=await r.match(void 0,t.term("Class_superClass"),void 0),f=new Map;for(let h of u){let g=h.subject instanceof si.IRI?Rh(h.subject.value):null,m=h.object instanceof si.IRI?Rh(h.object.value):null;if(!g||!m)continue;h.subject instanceof si.IRI&&o(g,h.subject.value),h.object instanceof si.IRI&&o(m,h.object.value);let b=f.get(g);b||(b=new Set,f.set(g,b)),b.add(m)}let d=new Set([i]),p=[i];for(;p.length>0;){let h=p.shift();if(h===void 0)break;let g=[...f.get(h)??[],...await l(h)];for(let m of g)d.has(m)||(d.add(m),p.push(m))}return d}a(Vk,"resolveClassKeyClosure");function NZ(r){let e=Gf.Namespace.EXO,t=Gf.Namespace.RDFS;return async n=>{let i=await Vk(r,n);if(i.size===0)return[];let s=await r.match(void 0,e.term("Property_minCount"),void 0),o=[],c=new Set;for(let l of s){let u=(0,Uk.parseMinCount)(l.object);if(u===void 0||u<=0)continue;let f=l.subject;if(!(f instanceof si.IRI)||!(await r.match(f,e.term("Property_domain"),void 0)).map(S=>S.object instanceof si.IRI?Rh(S.object.value):null).filter(S=>S!==null).some(S=>i.has(S)))continue;let h=null;for(let S of[e.term("Asset_label"),t.term("label")]){let I=await r.match(f,S,void 0);for(let E of I)if(E.object instanceof Vf.Literal&&E.object.value.trim().length>0){h=E.object.value.trim();break}if(h)break}if(!h||c.has(h))continue;c.add(h);let m=(await r.match(f,e.term("Property_range"),void 0)).map(S=>S.object instanceof si.IRI?{iri:!0,value:S.object.value}:S.object instanceof Vf.Literal?{iri:!1,value:S.object.value}:null).filter(S=>S!==null),{fieldType:b,targetClassUid:_}=Bk(m);o.push({propertyKey:h,label:h,fieldType:b,targetClassUid:_})}return o.sort((l,u)=>l.propertyKey.localeCompare(u.propertyKey)),o}}a(NZ,"createTripleStoreRequiredPropertyResolver");function kZ(r){let e=Gf.Namespace.EXO,t=Gf.Namespace.RDFS;return async n=>{let i=await Vk(r,n);if(i.size===0)return[];let s=await r.match(void 0,e.term("Property_domain"),void 0),o=[],c=new Set;for(let l of s){let u=l.object instanceof si.IRI?Rh(l.object.value):null;if(!u||!i.has(u))continue;let f=l.subject;if(!(f instanceof si.IRI))continue;let d=null;for(let S of[e.term("Asset_label"),t.term("label")]){let I=await r.match(f,S,void 0);for(let E of I)if(E.object instanceof Vf.Literal&&E.object.value.trim().length>0){d=E.object.value.trim();break}if(d)break}if(!d||c.has(d))continue;c.add(d);let p=(0,Uk.parseMinCount)((await r.match(f,e.term("Property_minCount"),void 0)).map(S=>S.object)),h=p!==void 0&&p>0,m=(await r.match(f,e.term("Property_range"),void 0)).map(S=>S.object instanceof si.IRI?{iri:!0,value:S.object.value}:S.object instanceof Vf.Literal?{iri:!1,value:S.object.value}:null).filter(S=>S!==null),{fieldType:b,targetClassUid:_}=Bk(m);o.push({propertyKey:d,label:d,fieldType:b,targetClassUid:_,required:h})}return o.sort((l,u)=>l.propertyKey.localeCompare(u.propertyKey)),o}}a(kZ,"createTripleStoreClassPropertyResolver")});var zk=T(s2=>{"use strict";Object.defineProperty(s2,"__esModule",{value:!0});s2.createTripleStoreDeclaredRanges=jZ;var xb=Le(),qk=Ye(),Wk=Wt(),MZ=oa();function jZ(r){let e=Wk.Namespace.EXO,t=Wk.Namespace.RDFS;return async()=>{let n=await r.match(void 0,e.term("Property_range"),void 0),i=await r.match(void 0,e.term("Asset_label"),void 0),s=await r.match(void 0,t.term("label"),void 0),o=new Map,c=new Map;for(let f of[...i,...s]){if(!(f.subject instanceof xb.IRI))continue;let d=f.subject.value;if(f.object instanceof qk.Literal){let p=f.object.value.trim();p.length>0&&!o.has(d)&&o.set(d,p)}else f.object instanceof xb.IRI&&!c.has(d)&&c.set(d,f.object.value)}let l=new Map,u=new Map;for(let f of n){if(!(f.subject instanceof xb.IRI))continue;let d=f.object instanceof xb.IRI||f.object instanceof qk.Literal?f.object.value:null;if(d===null)continue;let p=f.subject.value,h=u.get(p);h?h.push(d):u.set(p,[d])}for(let[f,d]of u){let p=o.get(f),h=c.get(f),g=p??(h===void 0?null:(0,MZ.iriToObsidianName)(h));g==null||g.length===0||l.has(g)||l.set(g,d)}return l}}a(jZ,"createTripleStoreDeclaredRanges")});var Ch=T(ya=>{"use strict";var $Z=ya&&ya.__decorate||function(r,e,t,n){var i=arguments.length,s=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,o;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(r,e,t,n);else for(var c=r.length-1;c>=0;c--)(o=r[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},UZ=ya&&ya.__metadata||function(r,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(r,e)};Object.defineProperty(ya,"__esModule",{value:!0});ya.WorkflowEngine=void 0;var BZ=ct(),o2=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(n=>n.from===e&&n.to===t)}getPreviousStatus(e){return this.definition.transitions.find(n=>n.from===e&&n.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(n=>n.status===e)?.timestampOnEnter??[]}getTransition(e,t){return this.definition.transitions.find(n=>n.from===e&&n.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 n=new Set;for(let i of this.definition.transitions){let s=`${i.from}\u2192${i.to}`;n.has(s)&&e.push(`Duplicate transition: ${s}`),n.add(s)}return{valid:e.length===0,errors:e}}};ya.WorkflowEngine=o2;ya.WorkflowEngine=o2=$Z([(0,BZ.injectable)(),UZ("design:paramtypes",[Object])],o2)});var Hk=T(_o=>{"use strict";Object.defineProperty(_o,"__esModule",{value:!0});_o.EFFORT_WORKFLOW_PROPERTY=_o.WorkflowTransitionProperty=_o.WorkflowStateProperty=_o.WorkflowProperty=void 0;_o.WorkflowProperty={TARGET_CLASS:"ems__Workflow_targetClass",INITIAL_STATE:"ems__Workflow_initialState",TERMINAL_STATES:"ems__Workflow_terminalStates",IS_DEFAULT:"ems__Workflow_isDefault"};_o.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"};_o.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"};_o.EFFORT_WORKFLOW_PROPERTY="ems__Effort_workflow"});var ba=T(Pb=>{"use strict";Object.defineProperty(Pb,"__esModule",{value:!0});Pb.MetadataHelpers=void 0;var Kk=pb(),VZ=Wl(),a2=Fl(),Ob=class r{static{a(this,"MetadataHelpers")}static findAllReferencingProperties(e,t){let n=[];for(let[i,s]of Object.entries(e))this.containsReference(s,t)&&n.push(i);return n}static findReferencingProperty(e,t){for(let[n,i]of Object.entries(e))if(this.containsReference(i,t))return n}static containsReference(e,t){if(!e)return!1;let n=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===n||c.endsWith(`/${n}`))return!0}return!1}return Array.isArray(e)?e.some(i=>this.containsReference(i,t)):!1}static isAssetArchived(e){for(let t of r.ARCHIVED_FLAG_KEYS){let n=e?.[t];if(n!=null)return r.isTruthyFlag(n)}return!1}static isTruthyFlag(e){let t=Array.isArray(e)?e.length===1?e[0]:void 0:e;if(typeof t=="boolean")return t;if(typeof t=="number")return t!==0;if(typeof t=="string"){let n=t.toLowerCase().trim();return n==="true"||n==="yes"||n==="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,n){let i={},s={};for(let[f,d]of Object.entries(e)){let p=(0,VZ.canonicalYamlKey)(f);i[p]=d,s[p]=f}let o=(0,Kk.orderProperties)(i,(0,Kk.loadDefaultSpec)()),c=Object.entries(o).map(([f,d])=>{let p=a2.STRING_SCALAR_PROPERTIES.has(f),h=n?.(s[f]??f);if(Array.isArray(d)){let g=d.map(m=>` - ${(0,a2.serializeYamlScalar)(m,p,h)}`).join(`
142
142
  `);return`${f}:
143
143
  ${g}`}return`${f}: ${(0,a2.serializeYamlScalar)(d,p,h)}`}).join(`
@@ -685,7 +685,7 @@ Next steps:
685
685
  `).map(n=>n.trim()).filter(n=>n.length>0),t=e[e.length-1];if(t!==void 0)try{return JSON.parse(t)}catch{return}}a(Z_e,"parseLastJsonLine");function vV(r,e){return e.filter(t=>{let n=r[t];return typeof n!="string"||n.trim().length===0})}a(vV,"missingStringFields");var AE=class{constructor(e){this.deps=e}static{a(this,"McpServer")}async handle(e){if(typeof e!="object"||e===null||Array.isArray(e))return{jsonrpc:"2.0",id:null,error:{code:EV,message:"Invalid request: expected a JSON-RPC object"}};let t=e.id,n=t===void 0;if(typeof e.method!="string")return n?null:{jsonrpc:"2.0",id:t??null,error:{code:EV,message:"Invalid request: missing method"}};if(n)return null;let i=t??null;switch(e.method){case"initialize":return{jsonrpc:"2.0",id:i,result:{protocolVersion:Q_e,capabilities:{tools:{}},serverInfo:{name:"exocortex",version:this.deps.version}}};case"ping":return{jsonrpc:"2.0",id:i,result:{}};case"tools/list":return{jsonrpc:"2.0",id:i,result:{tools:wV}};case"tools/call":return{jsonrpc:"2.0",id:i,result:await this.callTool(e.params??{})};default:return{jsonrpc:"2.0",id:i,error:{code:J_e,message:`Method not found: ${e.method}`}}}}async callTool(e){let t=e.name,n=e.arguments??{},i;if(t==="create_asset"){let c=vV(n,["vault","class","label"]);if(c.length>0)return mp(`create_asset: missing required argument(s): ${c.join(", ")}`,!0);let l=bV(n);if(l!==null)return mp(`create_asset: ${l}`,!0);i=_V(n)}else if(t==="create_effort"){let c=vV(n,["vault","command","target"]);if(c.length>0)return mp(`create_effort: missing required argument(s): ${c.join(", ")}`,!0);i=SV(n)}else return mp(`Unknown tool: ${String(t)}`,!0);let s=await this.deps.runCli(i);if(s.exitCode!==0){let c=s.stderr.trim()||s.stdout.trim()||"(no diagnostic output)";return mp(`exocortex-cli exited ${s.exitCode}
686
686
  ${c}`,!0)}let o=Z_e(s.stdout);return mp(o===void 0?s.stdout.trim():JSON.stringify(o))}};var IV=require("child_process");var eSe=32*1024*1024;function RV(r){return e=>new Promise(t=>{(0,IV.execFile)(process.execPath,[r,...e],{maxBuffer:eSe},(n,i,s)=>{let o=0;if(n){let c=n.code;o=typeof c=="number"?c:1}t({stdout:i,stderr:s,exitCode:o})})})}a(RV,"createSelfCliRunner");async function tSe(r,e,t){let n=(0,CV.createInterface)({input:e,crlfDelay:1/0});for await(let i of n){let s=i.trim();if(s.length===0)continue;let o;try{o=JSON.parse(s)}catch{t(JSON.stringify({jsonrpc:"2.0",id:null,error:{code:TV,message:"Parse error: invalid JSON"}})+`
687
687
  `);continue}let c;try{c=await r.handle(o)}catch(l){c={jsonrpc:"2.0",id:typeof o?.id=="string"||typeof o?.id=="number"?o.id:null,error:{code:AV,message:`Internal error: ${l instanceof Error?l.message:String(l)}`}}}c!==null&&t(JSON.stringify(c)+`
688
- `)}}a(tSe,"runStdioServer");function xV(r){return new he("mcp").description("Run an MCP (Model Context Protocol) stdio server exposing create_asset / create_effort tools backed by this CLI").option("--entry <path>","Path to the CLI entry script the tools invoke (defaults to this process's script)").action(async e=>{let t=e.entry??process.argv[1],n=new AE({runCli:RV(t),version:r??"unknown"});await tSe(n,process.stdin,i=>process.stdout.write(i))})}a(xV,"mcpCommand");function IE(r){let e=new he;return e.name("exocortex").description("CLI tool for Exocortex knowledge management system - SPARQL queries, task management, and more").version(r??"16.248.5"),e.addCommand(c7()),e.addCommand(y7()),e.addCommand(e8()),e.addCommand(i8()),e.addCommand(I8()),e.addCommand(s8()),e.addCommand(f8()),e.addCommand(d8()),e.addCommand(L8()),e.addCommand($8()),e.addCommand(J8()),e.addCommand(t7()),e.addCommand(r7()),e.addCommand(i7()),e.addCommand(s7()),e.addCommand(V7()),e.addCommand(W7()),e.addCommand(oV()),e.addCommand(cV()),e.addCommand(fV()),e.addCommand(dV()),e.addCommand(mV()),e.addCommand(Q7()),e.addCommand(nV()),e.addCommand(gV()),e.addCommand(xV(r??"16.248.5")),e}a(IE,"createProgram");IE().parse();0&&(module.exports={createProgram});
688
+ `)}}a(tSe,"runStdioServer");function xV(r){return new he("mcp").description("Run an MCP (Model Context Protocol) stdio server exposing create_asset / create_effort tools backed by this CLI").option("--entry <path>","Path to the CLI entry script the tools invoke (defaults to this process's script)").action(async e=>{let t=e.entry??process.argv[1],n=new AE({runCli:RV(t),version:r??"unknown"});await tSe(n,process.stdin,i=>process.stdout.write(i))})}a(xV,"mcpCommand");function IE(r){let e=new he;return e.name("exocortex").description("CLI tool for Exocortex knowledge management system - SPARQL queries, task management, and more").version(r??"16.248.6"),e.addCommand(c7()),e.addCommand(y7()),e.addCommand(e8()),e.addCommand(i8()),e.addCommand(I8()),e.addCommand(s8()),e.addCommand(f8()),e.addCommand(d8()),e.addCommand(L8()),e.addCommand($8()),e.addCommand(J8()),e.addCommand(t7()),e.addCommand(r7()),e.addCommand(i7()),e.addCommand(s7()),e.addCommand(V7()),e.addCommand(W7()),e.addCommand(oV()),e.addCommand(cV()),e.addCommand(fV()),e.addCommand(dV()),e.addCommand(mV()),e.addCommand(Q7()),e.addCommand(nV()),e.addCommand(gV()),e.addCommand(xV(r??"16.248.6")),e}a(IE,"createProgram");IE().parse();0&&(module.exports={createProgram});
689
689
  /*! Bundled license information:
690
690
 
691
691
  reflect-metadata/Reflect.js:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kitelev/exocortex-cli",
3
- "version": "16.248.5",
3
+ "version": "16.248.6",
4
4
  "description": "CLI tool for Exocortex knowledge management system - SPARQL queries, task management, and more",
5
5
  "main": "dist/index.js",
6
6
  "bin": {