@kitelev/exocortex-cli 16.31.1 → 16.31.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +3 -3
- 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.31.
|
|
2
|
+
// @kitelev/exocortex-cli v16.31.3
|
|
3
3
|
// CLI tool for Exocortex knowledge management system - SPARQL queries, task management, and more
|
|
4
4
|
// License: MIT
|
|
5
5
|
|
|
@@ -88,7 +88,7 @@ ${Object.entries(r).map(([c,l])=>this.serializeValue(c,l)).join(`
|
|
|
88
88
|
${r}`}return`${e}: ${String(t)}`}escapeRegex(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}};Vp.FrontmatterService=sf;sf.FRONTMATTER_REGEX=/^---\n([\s\S]*?)\n---/;sf.IRI_PREFIX_MAP={"https://exocortex.my/ontology/ems#":"ems__","https://exocortex.my/ontology/exo#":"exo__","https://exocortex.my/ontology/exocmd#":"exocmd__","https://exocortex.my/ontology/ims#":"ims__","https://exocortex.my/ontology/ztlk#":"ztlk__","https://exocortex.my/ontology/ptms#":"ptms__","https://exocortex.my/ontology/lit#":"lit__","https://exocortex.my/ontology/inbox#":"inbox__","https://exocortex.my/ontology/pmbok#":"pmbok__"}});var Dn=S(Bp=>{"use strict";Object.defineProperty(Bp,"__esModule",{value:!0});Bp.DateFormatter=void 0;var nb=class n{static{o(this,"DateFormatter")}static toISOTimestamp(e){return e.toISOString().replace(/\.\d{3}Z$/,"Z")}static toLocalTimestamp(e){let t=e.getFullYear(),r=String(e.getMonth()+1).padStart(2,"0"),i=String(e.getDate()).padStart(2,"0"),s=String(e.getHours()).padStart(2,"0"),a=String(e.getMinutes()).padStart(2,"0"),c=String(e.getSeconds()).padStart(2,"0");return`${t}-${r}-${i}T${s}:${a}:${c}`}static toDateWikilink(e){let t=e.getFullYear(),r=String(e.getMonth()+1).padStart(2,"0"),i=String(e.getDate()).padStart(2,"0");return`"[[${t}-${r}-${i}]]"`}static getTodayWikilink(){return n.toDateWikilink(new Date)}static toDateString(e){let t=e.getFullYear(),r=String(e.getMonth()+1).padStart(2,"0"),i=String(e.getDate()).padStart(2,"0");return`${t}-${r}-${i}`}static parseWikilink(e){let r=e.replace(/^["']|["']$/g,"").match(/\[\[(\d{4}-\d{2}-\d{2})\]\]/);return r?r[1]:null}static addDays(e,t){let r=new Date(e);return r.setDate(r.getDate()+t),r}static isSameDay(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}static getTodayStartTimestamp(){let e=new Date;return e.setHours(0,0,0,0),n.toLocalTimestamp(e)}static toTimestampAtStartOfDay(e){let t=e.split("-").map(Number);if(t.length!==3||t.some(isNaN))throw new Error(`Invalid date format: ${e}. Expected YYYY-MM-DD`);let[r,i,s]=t,a=new Date(r,i-1,s,0,0,0,0);if(isNaN(a.getTime()))throw new Error(`Invalid date values: ${e}`);return n.toLocalTimestamp(a)}static normalizeTimestamp(e){if(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/.test(e))return e;let t=new Date(e);if(isNaN(t.getTime()))throw new Error(`Invalid timestamp format: ${e}`);return n.toISOTimestamp(t)}static isISOTimestamp(e){return/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/.test(e)}};Bp.DateFormatter=nb});var Va=S(qp=>{"use strict";Object.defineProperty(qp,"__esModule",{value:!0});qp.LoggingService=void 0;var af=class{static{o(this,"LoggingService")}static setVerbose(e){this.isVerbose=e}static setDevelopmentMode(e){this.isDevelopment=e}static checkIsDevelopment(){return this.isDevelopment!==void 0?this.isDevelopment:typeof process<"u"?(this.isDevelopment=!1,this.isDevelopment):(this.isDevelopment=!1,this.isDevelopment)}static debug(e,t){this.isVerbose&&console.debug(`[Exocortex] ${e}`,t??"")}static info(e,t){console.log(`[Exocortex] ${e}`,t??"")}static warn(e,t){console.warn(`[Exocortex] ${e}`,t??"")}static error(e,t,r){let i=this.checkIsDevelopment(),s=r?` [${r}]`:"";if(i){let a=t?.stack?`
|
|
89
89
|
Stack trace:
|
|
90
90
|
${t.stack}`:"";console.error(`[Exocortex ERROR]${s} ${e}${a}`,t??"")}else{let a=t?.message?`
|
|
91
|
-
Details: ${t.message}`:"";console.error(`[Exocortex ERROR]${s} ${e}${a}`)}}};qp.LoggingService=af;af.isVerbose=!1;af.isDevelopment=void 0});var zA=S(Vo=>{"use strict";Object.defineProperty(Vo,"__esModule",{value:!0});Vo.registerResolver=hn;Vo.getResolver=l6;Vo.getRegisteredResolverIds=u6;Vo.clearResolvers=f6;Vo.installDefaultResolvers=d6;var Gp=new Map;function hn(n,e){Gp.set(n,e)}o(hn,"registerResolver");function l6(n){return Gp.get(n)}o(l6,"getResolver");function u6(){return Array.from(Gp.keys())}o(u6,"getRegisteredResolverIds");function f6(){Gp.clear()}o(f6,"clearResolvers");function Ba(n){return n<10?`0${n}`:String(n)}o(Ba,"pad2");function d6(){hn("today",()=>new Date().toISOString().slice(0,10)),hn("todayStart",()=>new Date(new Date().setHours(0,0,0,0)).toISOString()),hn("target",n=>n.targetIRI?`"[[${n.targetIRI}]]"`:""),hn("targetFolder",n=>{if(!n.targetFilePath)return"";let e=n.targetFilePath.replace(/^\/+/,""),t=e.lastIndexOf("/");return t>=0?e.slice(0,t):""}),hn("randomUUIDv4",()=>{if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();throw new Error("randomUUIDv4 resolver requires crypto.randomUUID() \u2014 runtime is missing Node crypto / Web Crypto API.")}),hn("nowTimestamp",()=>{let n=new Date;return`${n.getFullYear()}-${Ba(n.getMonth()+1)}-${Ba(n.getDate())}T${Ba(n.getHours())}:${Ba(n.getMinutes())}:${Ba(n.getSeconds())}`}),hn("nowDate",()=>{let n=new Date;return`${n.getFullYear()}-${Ba(n.getMonth()+1)}-${Ba(n.getDate())}`}),hn("nowYear",()=>String(new Date().getFullYear())),hn("nowMonth",()=>Ba(new Date().getMonth()+1)),hn("userInputLabel",n=>{let e=n.userInput?.label;return typeof e=="string"?e:""}),hn("userInput",(n,e)=>{if(!e)return null;let t=n.userInput?.[e];return typeof t=="string"?t:t==null?null:String(t)}),hn("targetProperty",(n,e)=>{if(!e||!n.targetFm)return null;let t=n.targetFm[e];return t==null?null:Array.isArray(t)?t.map(String):String(t)}),hn("labelAsArray",n=>{let e=n.userInput?.label;return typeof e=="string"&&e.length>0?[e]:[]}),hn("groundingTargetClass",n=>n.groundingTargetClassUid?`"[[${n.groundingTargetClassUid}]]"`:null)}o(d6,"installDefaultResolvers")});var KA=S(vi=>{"use strict";var h6=vi&&vi.__decorate||function(n,e,t,r){var i=arguments.length,s=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(s=(i<3?a(s):i>3?a(e,t,s):a(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s},p6=vi&&vi.__metadata||function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Js;Object.defineProperty(vi,"__esModule",{value:!0});vi.GroundingExecutor=vi.ServiceRegistry=void 0;var m6=Ie(),g6=ef(),y6=Mp(),fs=Ia(),_6=us(),ib=Dn(),HA=Yu(),cl=Va(),sb=zA();(0,sb.installDefaultResolvers)();function b6(n){if(n){if(n==="1b20a8f0-d745-4e93-91db-4531b3df120e")return"ems__Task";if(n==="7db5eeff-718a-49b0-8d2b-39b084a356e3")return"ems__Project";if(n==="ems__Task"||n==="ems__Project")return n}}o(b6,"resolveClassFlipTarget");var QA=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,S6=/^__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}__$/,v6=/^__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_-]*)__$/,Wp=class{static{o(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())}};vi.ServiceRegistry=Wp;var YA=20,zp=Js=class{static{o(this,"GroundingExecutor")}constructor(e,t,r,i,s){this.frontmatterService=new _6.FrontmatterService,this.fileReader=e,this.fileWriter=t,this.serviceRegistry=r,this.classLabelToUid=i,this.clock=s?.clock??(0,g6.liveClock)(),this.uidGen=s?.uidGenerator??(0,y6.liveUidGenerator)()}async execute(e,t,r,i){try{switch(e.type){case fs.GroundingType.PROPERTY_SET:return await this.executePropertySet(e,t,r,i);case fs.GroundingType.PROPERTY_DELETE:return await this.executePropertyDelete(e,r);case fs.GroundingType.COMPOSITE:return await this.executeComposite(e,t,r,i,0);case fs.GroundingType.SERVICE_CALL:return await this.executeServiceCall(e,t,r,i);case fs.GroundingType.CREATE_INSTANCE:return await this.executeCreateInstance(e,t,r,i);case fs.GroundingType.PROPERTY_APPEND:return await this.executePropertyAppend(e,t,r,i);case fs.GroundingType.PROPERTY_INCREMENT:return await this.executePropertyIncrement(e,r);case fs.GroundingType.PROPERTY_SHIFT:return await this.executePropertyShift(e,r);case fs.GroundingType.SPARQL_UPDATE:return{success:!1,error:"sparql_update grounding not yet implemented. Use property_set/property_delete instead."};default:return{success:!1,error:`Unknown grounding type: ${e.type}`}}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}async executePropertySet(e,t,r,i){if(!e.targetProperty)return{success:!1,error:"property_set requires targetProperty"};let s;if([e.targetValueRef!==void 0,e.targetValueLiteral!==void 0,e.targetValueSubstitution!==void 0].filter(Boolean).length>1)return{success:!1,error:"property_set: more than one of targetValueRef/targetValueLiteral/targetValueSubstitution 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 return{success:!1,error:"property_set requires one of targetValueRef/targetValueLiteral/targetValueSubstitution"};if(/\$(input|value)\b/.test(s)&&(i===void 0||i.value===void 0||i.value===null))return{success:!1,error:"property_set: substituted value contains $input/$value placeholder but no userInput.value provided"};let l=this.substituteVariables(s,t,i),u=await this.fileReader.readFile(r),f=this.frontmatterService.updateProperty(u,e.targetProperty,l);return await this.fileWriter.updateFile(r,f),{success:!0}}async executePropertyDelete(e,t){if(!e.targetProperty)return{success:!1,error:"property_delete requires targetProperty"};let r=await this.fileReader.readFile(t),i=this.frontmatterService.removeProperty(r,e.targetProperty);return await this.fileWriter.updateFile(t,i),{success:!0}}async executeComposite(e,t,r,i,s){if(s>=YA)return{success:!1,error:`Composite grounding exceeded maximum depth of ${YA}`};let a=e.steps??[];if(a.length===0)return{success:!0};let c;try{c=await this.fileReader.readFile(r)}catch{}let l=[];try{for(let u=0;u<a.length;u++){let f=a[u],d=await this.executeStep(f,t,r,i,s+1);if(!d.success)return await this.rollback(c,r,l),{success:!1,error:`Composite step ${u} failed: ${d.error}`};l.push(u)}return{success:!0}}catch(u){return await this.rollback(c,r,l),{success:!1,error:`Composite execution failed: ${u instanceof Error?u.message:String(u)}`}}}async executeServiceCall(e,t,r,i){let s=e.targetProperty;if(!s)return{success:!1,error:"service_call requires targetProperty as serviceId"};if(s==="convertToTask")return await this.executeConvertToTask(r);if(s==="updateProperty"){let l=b6(e.targetValueRef);if(l==="ems__Task")return await this.executeConvertToTask(r);if(l==="ems__Project")return await this.executeConvertToProject(r)}let a=this.serviceRegistry.get(s);if(!a)return{success:!1,error:`Service not found: "${s}". Registered services: ${this.serviceRegistry.getRegisteredIds().join(", ")||"none"}`};let c=i;if(e.isDefinedBy&&(c={isDefinedBy:e.isDefinedBy,...c??{}}),e.serviceCallPayload)try{let l=this.substituteVariables(e.serviceCallPayload,t,i),u=JSON.parse(l);typeof u=="object"&&u!==null&&(c={...u,...c??{}})}catch{}return await a.execute(t,c),{success:!0}}async executeConvertToTask(e){let t=await this.fileReader.readFile(e),r=await this.resolveClassRefToUid("ems__Task"),i=this.frontmatterService.updateProperty(t,"exo__Instance_class",`["[[${r}]]"]`);return await this.fileWriter.updateFile(e,i),{success:!0}}async executeConvertToProject(e){let t=await this.fileReader.readFile(e),r=await this.resolveClassRefToUid("ems__Project"),i=this.frontmatterService.updateProperty(t,"exo__Instance_class",`["[[${r}]]"]`);return await this.fileWriter.updateFile(e,i),{success:!0}}async executeCreateInstance(e,t,r,i){if(!e.targetFolder)return{success:!1,error:"create_instance requires targetFolder"};let s={},a=null;if((e.inheritanceRule&&e.inheritanceRule.length>0||e.propertyDefault&&e.propertyDefault.some(y=>typeof y.value=="string"&&y.value.includes("__SUBSTITUTE"))||e.labelTemplate!==void 0&&/\$target\./.test(e.labelTemplate))&&t&&r){let y;try{y=await this.fileReader.readFile(r)}catch(b){return{success:!1,error:`create_instance: failed to read $target file "${r}": ${b instanceof Error?b.message:String(b)}`}}a=this.frontmatterService.parseObject(y)??null}let l;e.targetClass&&(l=await this.resolveClassRefToUid(e.targetClass));let u={userInput:i,targetIRI:t,targetFilePath:r,targetFm:a??void 0,groundingTargetClassUid:l};if(e.propertyDefault&&e.propertyDefault.length>0&&this.applyPropertyDefaultStep(s,e.propertyDefault,u),this.applyMissingScalarPrimitives(s,i,l,e,t,a,r),i)for(let[y,b]of Object.entries(i))y!=="label"&&b!=null&&(s[y]=b);if(e.inheritanceRule&&e.inheritanceRule.length>0&&a&&await this.applyInheritanceRuleStep(s,e.inheritanceRule,a),this.applyMissingBacklinkTopUp(s,e,t,r),t&&e.linkBackProperty&&s[e.linkBackProperty]===void 0){let y=Js.extractBacklinkTarget(t,r);s[e.linkBackProperty]=`"[[${y}]]"`}let f=s.exo__Asset_uid,d=this.frontmatterService.createFrontmatter("",s),h=this.substituteVariables(e.targetFolder,t,i,void 0,r),p=h?`${h}/${f}.md`:`${f}.md`;return await this.fileWriter.createFile(p,d),{success:!0,openPath:p}}async resolveClassRefToUid(e){if(QA.test(e)||!this.classLabelToUid)return e;try{let t=await this.classLabelToUid(e);return t&&t.length>0?t:e}catch{return e}}applyPropertyDefaultStep(e,t,r){for(let{propertyName:i,value:s}of t){if(e[i]!==void 0)continue;let a=this.resolveSubstitutionMarker(s,r);if(a!=null){if(Array.isArray(a)){if(a.length===0)continue;e[i]=a;continue}if(i==="exo__Instance_class"&&typeof a=="string"){e[i]=[a];continue}e[i]=a}}}applyMissingScalarPrimitives(e,t,r,i,s,a,c){let l=[];if(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=ib.DateFormatter.toLocalTimestamp(this.clock.now()),l.push("exo__Asset_createdAt")),e.exo__Asset_label===void 0){let u=t?.label;if(u===void 0&&i?.labelTemplate)try{let d=this.substituteVariables(i.labelTemplate,s??"",t,a??void 0,c);d.trim().length>0&&(u=d)}catch(d){cl.LoggingService.error(`[GroundingExecutor] labelTemplate substitution failed: ${d instanceof Error?d.message:String(d)}. Falling back to "Untitled".`)}let f=u??"Untitled";e.exo__Asset_label=f,f!=="Untitled"&&e.aliases===void 0&&(e.aliases=[f]),l.push("exo__Asset_label")}e.exo__Instance_class===void 0&&r&&(e.exo__Instance_class=[`"[[${r}]]"`],l.push("exo__Instance_class")),l.length>0&&cl.LoggingService.error(`[GroundingExecutor] Universal Default Template did not cover essential scalar primitives: ${l.join(", ")}. Filled from legacy TS fallback. Vault may be in an unhealthy state \u2014 verify UniversalDefaultTemplate singleton is present and complete.`)}applyMissingBacklinkTopUp(e,t,r,i){if(!r||t.linkBackProperty||e.exo__Asset_prototype!==void 0||e.ems__Effort_parent!==void 0)return;let s=Js.extractBacklinkTarget(r,i);e.exo__Asset_prototype=`"[[${s}]]"`,cl.LoggingService.error("[GroundingExecutor] No backlink rule fired (Universal IRs absent or no class match). Falling back to legacy exo__Asset_prototype default. Bug #5 may surface if target is not a prototype-instance.")}resolveSubstitutionMarker(e,t){let r=e.match(v6);if(r){let c=r[1],l=r[2],u=Js.decodeBase64UrlSafe(l),f=(0,sb.getResolver)(c);return f?f(t,u):(cl.LoggingService.warn(`[GroundingExecutor] Parameterised marker references unknown resolver '${c}' \u2014 value left as marker.`),e)}let i=e.match(S6);if(!i)return e;let s=i[1];if(s==="target"){let c=t.targetIRI??"",l=t.targetFilePath??"";return`"[[${Js.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 a=(0,sb.getResolver)(s);return a?a(t):(cl.LoggingService.warn(`[GroundingExecutor] Marker references unknown resolver '${s}' \u2014 value left as marker.`),e)}static decodeBase64UrlSafe(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t.length%4===0?"":"=".repeat(4-t.length%4);return Buffer.from(t+r,"base64").toString("utf-8")}async applyInheritanceRuleStep(e,t,r){let i=this.extractTargetClassNames(r),s=[];for(let a of t)!await this.inheritanceConditionMatches(a.targetClassCondition,i)||await this.inheritanceExclusionMatches(a.targetClassExclusion,i)||s.push(a);s.sort((a,c)=>c.priority-a.priority);for(let a of s){if(e[a.targetPropertyName]!==void 0)continue;let c=r[a.sourcePropertyName];c!=null&&(e[a.targetPropertyName]=this.formatInheritedValue(c))}}async inheritanceConditionMatches(e,t){return e?this.classMatchesAny(e,t):!0}async inheritanceExclusionMatches(e,t){for(let r of e)if(await this.classMatchesAny(r,t))return!0;return!1}async classMatchesAny(e,t){if(t.includes(e))return!0;if(!this.classLabelToUid)return!1;try{let r=await this.classLabelToUid(e);if(r&&r.length>0&&t.includes(r))return!0}catch{}return!1}extractTargetClassNames(e){let t=e.exo__Instance_class;if(t==null)return[];let r=Array.isArray(t)?t:[t],i=[];for(let s of r){let a=this.extractWikilinkInner(String(s));a&&i.push(a)}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):QA.test(e)?`"[[${e}]]"`:e}reformatWikilink(e){return e.startsWith('"[[')&&e.endsWith(']]"')?e:e.startsWith("[[")&&e.endsWith("]]")?`"${e}"`:e}async executeStep(e,t,r,i,s){return e.type===fs.GroundingType.COMPOSITE?this.executeComposite(e,t,r,i,s):this.execute(e,t,r,i)}async rollback(e,t,r){if(e!==void 0)try{await this.fileWriter.updateFile(t,e)}catch(i){cl.LoggingService.error(`[GroundingExecutor] Rollback failed for ${t}`,i instanceof Error?i:new Error(String(i)))}}substituteVariables(e,t,r,i,s){let a=this.clock.now(),c=a.toISOString(),l=ib.DateFormatter.toLocalTimestamp(a),u=c.slice(0,10),f=`${u}T00:00:00`,d=`${l.slice(0,10)}-${l.slice(11,13)}-${l.slice(14,16)}`,h=e.replace(/\$target\.([A-Za-z_][\w]*)/g,(p,y)=>{if(!i)throw new Error(`$target.${y} substitution requires target frontmatter context; none was supplied (asset IRI: ${t})`);let b=i[y];if(b==null)throw new Error(`$target.${y} is undefined on asset ${t}`);if(Array.isArray(b))throw new Error(`$target.${y} resolved to an array on asset ${t}; only scalar properties are supported for substitution`);return String(b).replace(/^["'](.*)["']$/,"$1")});if(/\$targetFolder\b/.test(h)){if(!s)throw new Error("$targetFolder substitution requires targetFilePath context; none was supplied (asset IRI: "+t+")");let p=s.replace(/^\/+/,""),y=p.lastIndexOf("/"),b=y>=0?p.slice(0,y):"";h=h.replace(/\$targetFolder\b/g,b)}if(h=h.replace(/\$target/g,t).replace(/\$nowCompact\b/g,d).replace(/\$nowLocal/g,l).replace(/\$now/g,c).replace(/\$todayStart\b/g,f).replace(/\$today/g,u),r?.value!==void 0&&r.value!==null){let p=String(r.value);h=h.replace(/\$input\b/g,p).replace(/\$value\b/g,p)}return h}async executePropertyAppend(e,t,r,i){if(!e.targetProperty)return{success:!1,error:"property_append requires targetProperty"};if(e.appendExpression===void 0)return{success:!1,error:"property_append requires appendExpression"};let s=await this.fileReader.readFile(r),a=this.frontmatterService.parseObject(s)??{},c=this.substituteVariables(e.appendExpression,t,i,a),l=a[e.targetProperty],u=Array.isArray(l)?l:l!==void 0?[String(l)]:[],f=o(y=>y.replace(/^["'](.*)["']$/,"$1"),"stripQuotes"),d=new Set(u.map(f)),h;if(d.has(f(c)))h=u;else{let y=`"${f(c)}"`;h=[...u,y]}let p=this.frontmatterService.updateProperty(s,e.targetProperty,h);return await this.fileWriter.updateFile(r,p),{success:!0}}async executePropertyIncrement(e,t){if(!e.targetProperty)return{success:!1,error:"property_increment requires targetProperty"};let r=e.incrementBy??1;if(!Number.isFinite(r)||!Number.isInteger(r))return{success:!1,error:`property_increment: incrementBy must be an integer (got ${String(e.incrementBy)})`};let i=await this.fileReader.readFile(t),a=(this.frontmatterService.parseObject(i)??{})[e.targetProperty],c;if(a==null||a==="")c=0;else{if(Array.isArray(a))return{success:!1,error:`property_increment: targetProperty "${e.targetProperty}" is an array, expected integer`};{let f=String(a).replace(/^["'](.*)["']$/,"$1").trim();if(!/^-?\d+$/.test(f))return{success:!1,error:`property_increment: targetProperty "${e.targetProperty}" current value "${String(a)}" is not a valid integer`};c=Number.parseInt(f,10)}}let l=c+r,u=this.frontmatterService.updateProperty(i,e.targetProperty,l);return await this.fileWriter.updateFile(t,u),{success:!0}}async executePropertyShift(e,t){if(!e.targetProperty)return{success:!1,error:"property_shift requires targetProperty"};if(!e.shiftDelta)return{success:!1,error:"property_shift requires shiftDelta (ISO-8601 duration literal)"};let r=await this.fileReader.readFile(t),s=(this.frontmatterService.parseObject(r)??{})[e.targetProperty];if(s==null||s==="")return{success:!1,error:`property_shift: targetProperty "${e.targetProperty}" is not set on target asset`};if(Array.isArray(s))return{success:!1,error:`property_shift: targetProperty "${e.targetProperty}" is an array, expected single datetime`};let a=String(s).replace(/^["'](.*)["']$/,"$1").trim(),c=new Date(a);if(Number.isNaN(c.getTime()))return{success:!1,error:`property_shift: current value "${a}" is not a valid datetime`};let l;try{l=Js.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=ib.DateFormatter.toLocalTimestamp(l),f=this.frontmatterService.updateProperty(r,e.targetProperty,u);return await this.fileWriter.updateFile(t,f),{success:!0}}static applyIsoDuration(e,t){let r=t.trim();if(/^-?P(\d+Y)(\d+M)?$|^-?P\d+M$/.test(r)){let a=HA.DateTimeParsing.parseYearMonthDuration(r),c=new Date(e.getTime());return c.setMonth(c.getMonth()+a),c}let s=HA.DateTimeParsing.parseDayTimeDuration(r);return new Date(e.getTime()+s)}static extractBacklinkTarget(e,t){let r=Js.resolveTargetPath(e,t),i=r.split("/").pop()??r;return Js.UUID_BASENAME_RE.test(i)?i:r}static resolveTargetPath(e,t){if(t)return t.replace(/\.md$/i,"").replace(/^\/+/,"");if(e){let r=e.match(/^obsidian:\/\/vault\/(.+?)(?:\.md)?(?:\?|#|$)/i);if(r&&r[1])try{return decodeURIComponent(r[1])}catch{return r[1]}}return e}};vi.GroundingExecutor=zp;zp.UUID_BASENAME_RE=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;vi.GroundingExecutor=zp=Js=h6([(0,m6.injectable)(),p6("design:paramtypes",[Object,Object,Wp,Function,Object])],zp)});var XA=S(ab=>{"use strict";Object.defineProperty(ab,"__esModule",{value:!0});ab.createVaultFrontmatterClassLabelResolver=w6;function w6(n){return async e=>{if(!e)return null;let t=await n.findFilesByMetadata({exo__Asset_label:e});if(t.length>0){let s=(await n.getFileMetadata(t[0])).exo__Asset_uid;if(typeof s=="string"&&s.length>0)return s}let r=await n.findFilesByMetadata({aliases:e});if(r.length>0){let s=(await n.getFileMetadata(r[0])).exo__Asset_uid;if(typeof s=="string"&&s.length>0)return s}return null}}o(w6,"createVaultFrontmatterClassLabelResolver")});var JA=S(Zs=>{"use strict";var E6=Zs&&Zs.__decorate||function(n,e,t,r){var i=arguments.length,s=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(s=(i<3?a(s):i>3?a(e,t,s):a(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s},T6=Zs&&Zs.__metadata||function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ob;Object.defineProperty(Zs,"__esModule",{value:!0});Zs.CommandExecutionFlow=void 0;var A6=Ie(),I6=Ia(),x6=Ae(),C6=Me(),R6=Jt(),O6=Dn(),cb=ob=class{static{o(this,"CommandExecutionFlow")}constructor(e,t,r,i,s,a){this.groundingExecutor=e,this.notificationService=t,this.logger=r,this.prompts=i,this.tripleStore=s,this.fileOpener=a}async run(e,t){let{command:r}=e;if(r.confirmMessage&&!await this.prompts.confirm(r.confirmMessage))return;let i=t.injectedUserInput,s=ob.extractInputSchema(e);if(s!==null&&s.length>0){let l=await this.applyLabelDatePrefill(s,r.grounding,t.targetIRI),u=await this.prompts.promptInputSchema(l);if(u===null)return;i={...t.injectedUserInput??{},...u}}let a=await this.groundingExecutor.execute(r.grounding,t.targetIRI??"",t.filePath??"",i),c=t.filePath??"<no-file>";if(a.success){if(r.successMessage&&this.notificationService.success(r.successMessage),await new Promise(l=>setTimeout(l,100)),t.onComplete&&await t.onComplete(),a.openPath&&this.fileOpener)try{await this.fileOpener.open(a.openPath,{sameTab:r.openInSameTab})}catch(l){this.logger.info(`[CommandExecutionFlow] Failed to open created file "${a.openPath}": ${l instanceof Error?l.message:String(l)}`)}this.logger.info(`[CommandExecutionFlow] Executed "${r.name}" on ${c}`)}else this.notificationService.error(`Command failed: ${a.error??"unknown error"}`),this.logger.info(`[CommandExecutionFlow] Failed "${r.name}": ${a.error}`)}static extractInputSchema(e){let r=e.command.grounding.inputSchema;return!r||!Array.isArray(r)?null:r}async applyLabelDatePrefill(e,t,r){if(t.type!==I6.GroundingType.CREATE_INSTANCE||!t.prefillLabelWithDate||!r||!this.tripleStore)return e;let i=await this.resolveAssetLabel(r);if(!i)return e;let s=O6.DateFormatter.toDateString(new Date),a=`${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:a}})}async resolveAssetLabel(e){if(!this.tripleStore)return;let t=new x6.IRI(e),r=await this.tripleStore.match(t,R6.Namespace.EXO.term("Asset_label"),void 0);if(r.length===0)return;let i=r[0].object;if(i instanceof C6.Literal)return i.value.length>0?i.value:void 0}};Zs.CommandExecutionFlow=cb;Zs.CommandExecutionFlow=cb=ob=E6([(0,A6.injectable)(),T6("design:paramtypes",[Function,Object,Object,Object,Object,Object])],cb)});var of=S(ea=>{"use strict";var P6=ea&&ea.__decorate||function(n,e,t,r){var i=arguments.length,s=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(s=(i<3?a(s):i>3?a(e,t,s):a(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s},D6=ea&&ea.__metadata||function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)};Object.defineProperty(ea,"__esModule",{value:!0});ea.WorkflowEngine=void 0;var F6=Ie(),lb=class{static{o(this,"WorkflowEngine")}constructor(e){this.definition=e}getAvailableTransitions(e){return this.definition.transitions.filter(t=>t.from===e&&!t.isRollback)}getRollbackTransitions(e){return this.definition.transitions.filter(t=>t.from===e&&t.isRollback)}getAllTransitions(e){return this.definition.transitions.filter(t=>t.from===e)}canTransition(e,t){return this.definition.transitions.some(r=>r.from===e&&r.to===t)}getPreviousStatus(e){return this.definition.transitions.find(r=>r.from===e&&r.isRollback)?.to??null}getNextStates(e){return this.getAvailableTransitions(e).map(t=>t.to)}isTerminalState(e){return this.definition.terminalStates.includes(e)}isInitialState(e){return this.definition.initialState===e}getTimestampsForStatus(e){return this.definition.states.find(r=>r.status===e)?.timestampOnEnter??[]}getTransition(e,t){return this.definition.transitions.find(r=>r.from===e&&r.to===t)}getOrderedStates(){return this.definition.states.map(e=>e.status)}getDefinition(){return this.definition}validate(){let e=[],t=new Set(this.definition.states.map(i=>i.status));this.definition.states.length===0&&e.push("Workflow must have at least one state"),t.has(this.definition.initialState)||e.push(`Initial state "${this.definition.initialState}" is not in the states list`);for(let i of this.definition.terminalStates)t.has(i)||e.push(`Terminal state "${i}" is not in the states list`);for(let i of this.definition.transitions)t.has(i.from)||e.push(`Transition "${i.label}" references unknown source state "${i.from}"`),t.has(i.to)||e.push(`Transition "${i.label}" references unknown target state "${i.to}"`);for(let i of this.definition.states){if(this.definition.terminalStates.includes(i.status))continue;this.definition.transitions.filter(a=>a.from===i.status&&!a.isRollback).length===0&&e.push(`State "${i.status}" has no outgoing forward transitions (dead end)`)}let r=new Set;for(let i of this.definition.transitions){let s=`${i.from}\u2192${i.to}`;r.has(s)&&e.push(`Duplicate transition: ${s}`),r.add(s)}return{valid:e.length===0,errors:e}}};ea.WorkflowEngine=lb;ea.WorkflowEngine=lb=P6([(0,F6.injectable)(),D6("design:paramtypes",[Object])],lb)});var ZA=S(ds=>{"use strict";Object.defineProperty(ds,"__esModule",{value:!0});ds.EFFORT_WORKFLOW_PROPERTY=ds.WorkflowTransitionProperty=ds.WorkflowStateProperty=ds.WorkflowProperty=void 0;ds.WorkflowProperty={TARGET_CLASS:"ems__Workflow_targetClass",INITIAL_STATE:"ems__Workflow_initialState",TERMINAL_STATES:"ems__Workflow_terminalStates",IS_DEFAULT:"ems__Workflow_isDefault"};ds.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"};ds.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"};ds.EFFORT_WORKFLOW_PROPERTY="ems__Effort_workflow"});var ta=S(Hp=>{"use strict";Object.defineProperty(Hp,"__esModule",{value:!0});Hp.MetadataHelpers=void 0;var eI=nf(),ub=class{static{o(this,"MetadataHelpers")}static findAllReferencingProperties(e,t){let r=[];for(let[i,s]of Object.entries(e))this.containsReference(s,t)&&r.push(i);return r}static findReferencingProperty(e,t){for(let[r,i]of Object.entries(e))if(this.containsReference(i,t))return r}static containsReference(e,t){if(!e)return!1;let r=t.replace(/\.md$/,"");if(typeof e=="string"){let i=/\[\[([^[\]]+)\]\]/g,s;for(;(s=i.exec(e))!==null;){let c=s[1].split("|")[0].trim();if(c===r||c.endsWith(`/${r}`))return!0}return!1}return Array.isArray(e)?e.some(i=>this.containsReference(i,t)):!1}static isAssetArchived(e){let t=e?.exo__Asset_isArchived;if(t!=null){if(t===!0||t===1)return!0;if(typeof t=="string"){let i=t.toLowerCase().trim();if(i==="true"||i==="yes"||i==="1")return!0}if(typeof t=="boolean")return t}let r=e?.archived;if(r==null)return!1;if(typeof r=="boolean")return r;if(typeof r=="number")return r!==0;if(typeof r=="string"){let i=r.toLowerCase().trim();return i==="true"||i==="yes"||i==="1"}return!1}static getPropertyValue(e,t){return t==="Name"||t==="title"?e.title:t==="created"?e.created:t==="modified"?e.modified:t==="path"?e.path:e.metadata?.[t]}static ensureQuoted(e){return!e||e==='""'?'""':e.startsWith('"')&&e.endsWith('"')?e:`"${e}"`}static buildFileContent(e,t){let r=(0,eI.orderProperties)(e,(0,eI.loadDefaultSpec)()),i=Object.entries(r).map(([c,l])=>{if(Array.isArray(l)){let u=l.map(f=>` - ${String(f)}`).join(`
|
|
91
|
+
Details: ${t.message}`:"";console.error(`[Exocortex ERROR]${s} ${e}${a}`)}}};qp.LoggingService=af;af.isVerbose=!1;af.isDevelopment=void 0});var zA=S(Vo=>{"use strict";Object.defineProperty(Vo,"__esModule",{value:!0});Vo.registerResolver=hn;Vo.getResolver=l6;Vo.getRegisteredResolverIds=u6;Vo.clearResolvers=f6;Vo.installDefaultResolvers=d6;var Gp=new Map;function hn(n,e){Gp.set(n,e)}o(hn,"registerResolver");function l6(n){return Gp.get(n)}o(l6,"getResolver");function u6(){return Array.from(Gp.keys())}o(u6,"getRegisteredResolverIds");function f6(){Gp.clear()}o(f6,"clearResolvers");function Ba(n){return n<10?`0${n}`:String(n)}o(Ba,"pad2");function d6(){hn("today",()=>new Date().toISOString().slice(0,10)),hn("todayStart",()=>new Date(new Date().setHours(0,0,0,0)).toISOString()),hn("target",n=>n.targetIRI?`"[[${n.targetIRI}]]"`:""),hn("targetFolder",n=>{if(!n.targetFilePath)return"";let e=n.targetFilePath.replace(/^\/+/,""),t=e.lastIndexOf("/");return t>=0?e.slice(0,t):""}),hn("randomUUIDv4",()=>{if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();throw new Error("randomUUIDv4 resolver requires crypto.randomUUID() \u2014 runtime is missing Node crypto / Web Crypto API.")}),hn("nowTimestamp",()=>{let n=new Date;return`${n.getFullYear()}-${Ba(n.getMonth()+1)}-${Ba(n.getDate())}T${Ba(n.getHours())}:${Ba(n.getMinutes())}:${Ba(n.getSeconds())}`}),hn("nowDate",()=>{let n=new Date;return`${n.getFullYear()}-${Ba(n.getMonth()+1)}-${Ba(n.getDate())}`}),hn("nowYear",()=>String(new Date().getFullYear())),hn("nowMonth",()=>Ba(new Date().getMonth()+1)),hn("userInputLabel",n=>{let e=n.userInput?.label;return typeof e=="string"?e:""}),hn("userInput",(n,e)=>{if(!e)return null;let t=n.userInput?.[e];return typeof t=="string"?t:t==null?null:String(t)}),hn("targetProperty",(n,e)=>{if(!e||!n.targetFm)return null;let t=n.targetFm[e];return t==null?null:Array.isArray(t)?t.map(String):String(t)}),hn("labelAsArray",n=>{let e=n.userInput?.label;return typeof e=="string"&&e.length>0?[e]:[]}),hn("groundingTargetClass",n=>n.groundingTargetClassUid?`"[[${n.groundingTargetClassUid}]]"`:null)}o(d6,"installDefaultResolvers")});var KA=S(vi=>{"use strict";var h6=vi&&vi.__decorate||function(n,e,t,r){var i=arguments.length,s=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(s=(i<3?a(s):i>3?a(e,t,s):a(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s},p6=vi&&vi.__metadata||function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Js;Object.defineProperty(vi,"__esModule",{value:!0});vi.GroundingExecutor=vi.ServiceRegistry=void 0;var m6=Ie(),g6=ef(),y6=Mp(),fs=Ia(),_6=us(),ib=Dn(),HA=Yu(),cl=Va(),sb=zA();(0,sb.installDefaultResolvers)();function b6(n){if(n){if(n==="1b20a8f0-d745-4e93-91db-4531b3df120e")return"ems__Task";if(n==="7db5eeff-718a-49b0-8d2b-39b084a356e3")return"ems__Project";if(n==="ems__Task"||n==="ems__Project")return n}}o(b6,"resolveClassFlipTarget");var QA=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,S6=/^__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}__$/,v6=/^__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_-]*)__$/,Wp=class{static{o(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())}};vi.ServiceRegistry=Wp;var YA=20,zp=Js=class{static{o(this,"GroundingExecutor")}constructor(e,t,r,i,s){this.frontmatterService=new _6.FrontmatterService,this.fileReader=e,this.fileWriter=t,this.serviceRegistry=r,this.classLabelToUid=i,this.clock=s?.clock??(0,g6.liveClock)(),this.uidGen=s?.uidGenerator??(0,y6.liveUidGenerator)()}async execute(e,t,r,i){try{switch(e.type){case fs.GroundingType.PROPERTY_SET:return await this.executePropertySet(e,t,r,i);case fs.GroundingType.PROPERTY_DELETE:return await this.executePropertyDelete(e,r);case fs.GroundingType.COMPOSITE:return await this.executeComposite(e,t,r,i,0);case fs.GroundingType.SERVICE_CALL:return await this.executeServiceCall(e,t,r,i);case fs.GroundingType.CREATE_INSTANCE:return await this.executeCreateInstance(e,t,r,i);case fs.GroundingType.PROPERTY_APPEND:return await this.executePropertyAppend(e,t,r,i);case fs.GroundingType.PROPERTY_INCREMENT:return await this.executePropertyIncrement(e,r);case fs.GroundingType.PROPERTY_SHIFT:return await this.executePropertyShift(e,r);case fs.GroundingType.SPARQL_UPDATE:return{success:!1,error:"sparql_update grounding not yet implemented. Use property_set/property_delete instead."};default:return{success:!1,error:`Unknown grounding type: ${e.type}`}}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}async executePropertySet(e,t,r,i){if(!e.targetProperty)return{success:!1,error:"property_set requires targetProperty"};let s;if([e.targetValueRef!==void 0,e.targetValueLiteral!==void 0,e.targetValueSubstitution!==void 0].filter(Boolean).length>1)return{success:!1,error:"property_set: more than one of targetValueRef/targetValueLiteral/targetValueSubstitution 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 return{success:!1,error:"property_set requires one of targetValueRef/targetValueLiteral/targetValueSubstitution"};if(/\$(input|value)\b/.test(s)&&(i===void 0||i.value===void 0||i.value===null))return{success:!1,error:"property_set: substituted value contains $input/$value placeholder but no userInput.value provided"};let l=this.substituteVariables(s,t,i),u=await this.fileReader.readFile(r),f=this.frontmatterService.updateProperty(u,e.targetProperty,l);return await this.fileWriter.updateFile(r,f),{success:!0}}async executePropertyDelete(e,t){if(!e.targetProperty)return{success:!1,error:"property_delete requires targetProperty"};let r=await this.fileReader.readFile(t),i=this.frontmatterService.removeProperty(r,e.targetProperty);return await this.fileWriter.updateFile(t,i),{success:!0}}async executeComposite(e,t,r,i,s){if(s>=YA)return{success:!1,error:`Composite grounding exceeded maximum depth of ${YA}`};let a=e.steps??[];if(a.length===0)return{success:!0};let c;try{c=await this.fileReader.readFile(r)}catch{}let l=[];try{for(let u=0;u<a.length;u++){let f=a[u],d=await this.executeStep(f,t,r,i,s+1);if(!d.success)return await this.rollback(c,r,l),{success:!1,error:`Composite step ${u} failed: ${d.error}`};l.push(u)}return{success:!0}}catch(u){return await this.rollback(c,r,l),{success:!1,error:`Composite execution failed: ${u instanceof Error?u.message:String(u)}`}}}async executeServiceCall(e,t,r,i){let s=e.targetProperty;if(!s)return{success:!1,error:"service_call requires targetProperty as serviceId"};if(s==="convertToTask")return await this.executeConvertToTask(r);if(s==="updateProperty"){let l=b6(e.targetValueRef);if(l==="ems__Task")return await this.executeConvertToTask(r);if(l==="ems__Project")return await this.executeConvertToProject(r)}let a=this.serviceRegistry.get(s);if(!a)return{success:!1,error:`Service not found: "${s}". Registered services: ${this.serviceRegistry.getRegisteredIds().join(", ")||"none"}`};let c=i;if(e.isDefinedBy&&(c={isDefinedBy:e.isDefinedBy,...c??{}}),e.serviceCallPayload)try{let l=this.substituteVariables(e.serviceCallPayload,t,i),u=JSON.parse(l);typeof u=="object"&&u!==null&&(c={...u,...c??{}})}catch{}return await a.execute(t,c),{success:!0}}async executeConvertToTask(e){let t=await this.fileReader.readFile(e),r=await this.resolveClassRefToUid("ems__Task"),i=this.frontmatterService.updateProperty(t,"exo__Instance_class",`["[[${r}]]"]`);return await this.fileWriter.updateFile(e,i),{success:!0}}async executeConvertToProject(e){let t=await this.fileReader.readFile(e),r=await this.resolveClassRefToUid("ems__Project"),i=this.frontmatterService.updateProperty(t,"exo__Instance_class",`["[[${r}]]"]`);return await this.fileWriter.updateFile(e,i),{success:!0}}async executeCreateInstance(e,t,r,i){if(!e.targetFolder)return{success:!1,error:"create_instance requires targetFolder"};let s={},a=null;if((e.inheritanceRule&&e.inheritanceRule.length>0||e.propertyDefault&&e.propertyDefault.some(y=>typeof y.value=="string"&&y.value.includes("__SUBSTITUTE"))||e.labelTemplate!==void 0&&/\$target\./.test(e.labelTemplate))&&t&&r){let y;try{y=await this.fileReader.readFile(r)}catch(b){return{success:!1,error:`create_instance: failed to read $target file "${r}": ${b instanceof Error?b.message:String(b)}`}}a=this.frontmatterService.parseObject(y)??null}let l;e.targetClass&&(l=await this.resolveClassRefToUid(e.targetClass));let u={userInput:i,targetIRI:t,targetFilePath:r,targetFm:a??void 0,groundingTargetClassUid:l};if(e.propertyDefault&&e.propertyDefault.length>0&&this.applyPropertyDefaultStep(s,e.propertyDefault,u),this.applyMissingScalarPrimitives(s,i,l,e,t,a,r),i)for(let[y,b]of Object.entries(i))y!=="label"&&b!=null&&(s[y]=b);if(e.inheritanceRule&&e.inheritanceRule.length>0&&a&&await this.applyInheritanceRuleStep(s,e.inheritanceRule,a),this.applyMissingBacklinkTopUp(s,e,t,r),t&&e.linkBackProperty&&s[e.linkBackProperty]===void 0){let y=Js.extractBacklinkTarget(t,r);s[e.linkBackProperty]=`"[[${y}]]"`}let f=s.exo__Asset_uid,d=this.frontmatterService.createFrontmatter("",s),h=this.substituteVariables(e.targetFolder,t,i,void 0,r),p=h?`${h}/${f}.md`:`${f}.md`;return await this.fileWriter.createFile(p,d),{success:!0,openPath:p}}async resolveClassRefToUid(e){if(QA.test(e)||!this.classLabelToUid)return e;try{let t=await this.classLabelToUid(e);return t&&t.length>0?t:e}catch{return e}}applyPropertyDefaultStep(e,t,r){for(let{propertyName:i,value:s}of t){if(e[i]!==void 0)continue;let a=this.resolveSubstitutionMarker(s,r);if(a!=null){if(Array.isArray(a)){if(a.length===0)continue;e[i]=a;continue}if(i==="exo__Instance_class"&&typeof a=="string"){e[i]=[a];continue}e[i]=a}}}applyMissingScalarPrimitives(e,t,r,i,s,a,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=ib.DateFormatter.toLocalTimestamp(this.clock.now()),l.push("exo__Asset_createdAt"));let u=typeof e.exo__Asset_label=="string"&&e.exo__Asset_label.trim().length===0;if(e.exo__Asset_label===void 0||u){let f=t?.label;if(f===void 0&&i?.labelTemplate)try{let h=this.substituteVariables(i.labelTemplate,s??"",t,a??void 0,c);h.trim().length>0&&(f=h)}catch(h){cl.LoggingService.error(`[GroundingExecutor] labelTemplate substitution failed: ${h instanceof Error?h.message:String(h)}. Falling back to "Untitled".`)}let d=f??"Untitled";e.exo__Asset_label=d,d!=="Untitled"&&e.aliases===void 0&&(e.aliases=[d]),l.push("exo__Asset_label")}e.exo__Instance_class===void 0&&r&&(e.exo__Instance_class=[`"[[${r}]]"`],l.push("exo__Instance_class")),l.length>0&&cl.LoggingService.error(`[GroundingExecutor] Universal Default Template did not cover essential scalar primitives: ${l.join(", ")}. Filled from legacy TS fallback. Vault may be in an unhealthy state \u2014 verify UniversalDefaultTemplate singleton is present and complete.`)}applyMissingBacklinkTopUp(e,t,r,i){if(!r||t.linkBackProperty||e.exo__Asset_prototype!==void 0||e.ems__Effort_parent!==void 0)return;let s=Js.extractBacklinkTarget(r,i);e.exo__Asset_prototype=`"[[${s}]]"`,cl.LoggingService.error("[GroundingExecutor] No backlink rule fired (Universal IRs absent or no class match). Falling back to legacy exo__Asset_prototype default. Bug #5 may surface if target is not a prototype-instance.")}resolveSubstitutionMarker(e,t){let r=e.match(v6);if(r){let c=r[1],l=r[2],u=Js.decodeBase64UrlSafe(l),f=(0,sb.getResolver)(c);return f?f(t,u):(cl.LoggingService.warn(`[GroundingExecutor] Parameterised marker references unknown resolver '${c}' \u2014 value left as marker.`),e)}let i=e.match(S6);if(!i)return e;let s=i[1];if(s==="target"){let c=t.targetIRI??"",l=t.targetFilePath??"";return`"[[${Js.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 a=(0,sb.getResolver)(s);return a?a(t):(cl.LoggingService.warn(`[GroundingExecutor] Marker references unknown resolver '${s}' \u2014 value left as marker.`),e)}static decodeBase64UrlSafe(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t.length%4===0?"":"=".repeat(4-t.length%4);return Buffer.from(t+r,"base64").toString("utf-8")}async applyInheritanceRuleStep(e,t,r){let i=this.extractTargetClassNames(r),s=[];for(let a of t)!await this.inheritanceConditionMatches(a.targetClassCondition,i)||await this.inheritanceExclusionMatches(a.targetClassExclusion,i)||s.push(a);s.sort((a,c)=>c.priority-a.priority);for(let a of s){if(e[a.targetPropertyName]!==void 0)continue;let c=r[a.sourcePropertyName];c!=null&&(e[a.targetPropertyName]=this.formatInheritedValue(c))}}async inheritanceConditionMatches(e,t){return e?this.classMatchesAny(e,t):!0}async inheritanceExclusionMatches(e,t){for(let r of e)if(await this.classMatchesAny(r,t))return!0;return!1}async classMatchesAny(e,t){if(t.includes(e))return!0;if(!this.classLabelToUid)return!1;try{let r=await this.classLabelToUid(e);if(r&&r.length>0&&t.includes(r))return!0}catch{}return!1}extractTargetClassNames(e){let t=e.exo__Instance_class;if(t==null)return[];let r=Array.isArray(t)?t:[t],i=[];for(let s of r){let a=this.extractWikilinkInner(String(s));a&&i.push(a)}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):QA.test(e)?`"[[${e}]]"`:e}reformatWikilink(e){return e.startsWith('"[[')&&e.endsWith(']]"')?e:e.startsWith("[[")&&e.endsWith("]]")?`"${e}"`:e}async executeStep(e,t,r,i,s){return e.type===fs.GroundingType.COMPOSITE?this.executeComposite(e,t,r,i,s):this.execute(e,t,r,i)}async rollback(e,t,r){if(e!==void 0)try{await this.fileWriter.updateFile(t,e)}catch(i){cl.LoggingService.error(`[GroundingExecutor] Rollback failed for ${t}`,i instanceof Error?i:new Error(String(i)))}}substituteVariables(e,t,r,i,s){let a=this.clock.now(),c=a.toISOString(),l=ib.DateFormatter.toLocalTimestamp(a),u=c.slice(0,10),f=`${u}T00:00:00`,d=`${l.slice(0,10)}-${l.slice(11,13)}-${l.slice(14,16)}`,h=e.replace(/\$target\.([A-Za-z_][\w]*)/g,(p,y)=>{if(!i)throw new Error(`$target.${y} substitution requires target frontmatter context; none was supplied (asset IRI: ${t})`);let b=i[y];if(b==null)throw new Error(`$target.${y} is undefined on asset ${t}`);if(Array.isArray(b))throw new Error(`$target.${y} resolved to an array on asset ${t}; only scalar properties are supported for substitution`);return String(b).replace(/^["'](.*)["']$/,"$1")});if(/\$targetFolder\b/.test(h)){if(!s)throw new Error("$targetFolder substitution requires targetFilePath context; none was supplied (asset IRI: "+t+")");let p=s.replace(/^\/+/,""),y=p.lastIndexOf("/"),b=y>=0?p.slice(0,y):"";h=h.replace(/\$targetFolder\b/g,b)}if(h=h.replace(/\$target/g,t).replace(/\$nowCompact\b/g,d).replace(/\$nowLocal/g,l).replace(/\$now/g,c).replace(/\$todayStart\b/g,f).replace(/\$today/g,u),r?.value!==void 0&&r.value!==null){let p=String(r.value);h=h.replace(/\$input\b/g,p).replace(/\$value\b/g,p)}return h}async executePropertyAppend(e,t,r,i){if(!e.targetProperty)return{success:!1,error:"property_append requires targetProperty"};if(e.appendExpression===void 0)return{success:!1,error:"property_append requires appendExpression"};let s=await this.fileReader.readFile(r),a=this.frontmatterService.parseObject(s)??{},c=this.substituteVariables(e.appendExpression,t,i,a),l=a[e.targetProperty],u=Array.isArray(l)?l:l!==void 0?[String(l)]:[],f=o(y=>y.replace(/^["'](.*)["']$/,"$1"),"stripQuotes"),d=new Set(u.map(f)),h;if(d.has(f(c)))h=u;else{let y=`"${f(c)}"`;h=[...u,y]}let p=this.frontmatterService.updateProperty(s,e.targetProperty,h);return await this.fileWriter.updateFile(r,p),{success:!0}}async executePropertyIncrement(e,t){if(!e.targetProperty)return{success:!1,error:"property_increment requires targetProperty"};let r=e.incrementBy??1;if(!Number.isFinite(r)||!Number.isInteger(r))return{success:!1,error:`property_increment: incrementBy must be an integer (got ${String(e.incrementBy)})`};let i=await this.fileReader.readFile(t),a=(this.frontmatterService.parseObject(i)??{})[e.targetProperty],c;if(a==null||a==="")c=0;else{if(Array.isArray(a))return{success:!1,error:`property_increment: targetProperty "${e.targetProperty}" is an array, expected integer`};{let f=String(a).replace(/^["'](.*)["']$/,"$1").trim();if(!/^-?\d+$/.test(f))return{success:!1,error:`property_increment: targetProperty "${e.targetProperty}" current value "${String(a)}" is not a valid integer`};c=Number.parseInt(f,10)}}let l=c+r,u=this.frontmatterService.updateProperty(i,e.targetProperty,l);return await this.fileWriter.updateFile(t,u),{success:!0}}async executePropertyShift(e,t){if(!e.targetProperty)return{success:!1,error:"property_shift requires targetProperty"};if(!e.shiftDelta)return{success:!1,error:"property_shift requires shiftDelta (ISO-8601 duration literal)"};let r=await this.fileReader.readFile(t),s=(this.frontmatterService.parseObject(r)??{})[e.targetProperty];if(s==null||s==="")return{success:!1,error:`property_shift: targetProperty "${e.targetProperty}" is not set on target asset`};if(Array.isArray(s))return{success:!1,error:`property_shift: targetProperty "${e.targetProperty}" is an array, expected single datetime`};let a=String(s).replace(/^["'](.*)["']$/,"$1").trim(),c=new Date(a);if(Number.isNaN(c.getTime()))return{success:!1,error:`property_shift: current value "${a}" is not a valid datetime`};let l;try{l=Js.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=ib.DateFormatter.toLocalTimestamp(l),f=this.frontmatterService.updateProperty(r,e.targetProperty,u);return await this.fileWriter.updateFile(t,f),{success:!0}}static applyIsoDuration(e,t){let r=t.trim();if(/^-?P(\d+Y)(\d+M)?$|^-?P\d+M$/.test(r)){let a=HA.DateTimeParsing.parseYearMonthDuration(r),c=new Date(e.getTime());return c.setMonth(c.getMonth()+a),c}let s=HA.DateTimeParsing.parseDayTimeDuration(r);return new Date(e.getTime()+s)}static extractBacklinkTarget(e,t){let r=Js.resolveTargetPath(e,t),i=r.split("/").pop()??r;return Js.UUID_BASENAME_RE.test(i)?i:r}static resolveTargetPath(e,t){if(t)return t.replace(/\.md$/i,"").replace(/^\/+/,"");if(e){let r=e.match(/^obsidian:\/\/vault\/(.+?)(?:\.md)?(?:\?|#|$)/i);if(r&&r[1])try{return decodeURIComponent(r[1])}catch{return r[1]}}return e}};vi.GroundingExecutor=zp;zp.UUID_BASENAME_RE=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;vi.GroundingExecutor=zp=Js=h6([(0,m6.injectable)(),p6("design:paramtypes",[Object,Object,Wp,Function,Object])],zp)});var XA=S(ab=>{"use strict";Object.defineProperty(ab,"__esModule",{value:!0});ab.createVaultFrontmatterClassLabelResolver=w6;function w6(n){return async e=>{if(!e)return null;let t=await n.findFilesByMetadata({exo__Asset_label:e});if(t.length>0){let s=(await n.getFileMetadata(t[0])).exo__Asset_uid;if(typeof s=="string"&&s.length>0)return s}let r=await n.findFilesByMetadata({aliases:e});if(r.length>0){let s=(await n.getFileMetadata(r[0])).exo__Asset_uid;if(typeof s=="string"&&s.length>0)return s}return null}}o(w6,"createVaultFrontmatterClassLabelResolver")});var JA=S(Zs=>{"use strict";var E6=Zs&&Zs.__decorate||function(n,e,t,r){var i=arguments.length,s=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(s=(i<3?a(s):i>3?a(e,t,s):a(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s},T6=Zs&&Zs.__metadata||function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},ob;Object.defineProperty(Zs,"__esModule",{value:!0});Zs.CommandExecutionFlow=void 0;var A6=Ie(),I6=Ia(),x6=Ae(),C6=Me(),R6=Jt(),O6=Dn(),cb=ob=class{static{o(this,"CommandExecutionFlow")}constructor(e,t,r,i,s,a){this.groundingExecutor=e,this.notificationService=t,this.logger=r,this.prompts=i,this.tripleStore=s,this.fileOpener=a}async run(e,t){let{command:r}=e;if(r.confirmMessage&&!await this.prompts.confirm(r.confirmMessage))return;let i=t.injectedUserInput,s=ob.extractInputSchema(e);if(s!==null&&s.length>0){let l=await this.applyLabelDatePrefill(s,r.grounding,t.targetIRI),u=await this.prompts.promptInputSchema(l);if(u===null)return;i={...t.injectedUserInput??{},...u}}let a=await this.groundingExecutor.execute(r.grounding,t.targetIRI??"",t.filePath??"",i),c=t.filePath??"<no-file>";if(a.success){if(r.successMessage&&this.notificationService.success(r.successMessage),await new Promise(l=>setTimeout(l,100)),t.onComplete&&await t.onComplete(),a.openPath&&this.fileOpener)try{await this.fileOpener.open(a.openPath,{sameTab:r.openInSameTab})}catch(l){this.logger.info(`[CommandExecutionFlow] Failed to open created file "${a.openPath}": ${l instanceof Error?l.message:String(l)}`)}this.logger.info(`[CommandExecutionFlow] Executed "${r.name}" on ${c}`)}else this.notificationService.error(`Command failed: ${a.error??"unknown error"}`),this.logger.info(`[CommandExecutionFlow] Failed "${r.name}": ${a.error}`)}static extractInputSchema(e){let r=e.command.grounding.inputSchema;return!r||!Array.isArray(r)?null:r}async applyLabelDatePrefill(e,t,r){if(t.type!==I6.GroundingType.CREATE_INSTANCE||!t.prefillLabelWithDate||!r||!this.tripleStore)return e;let i=await this.resolveAssetLabel(r);if(!i)return e;let s=O6.DateFormatter.toDateString(new Date),a=`${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:a}})}async resolveAssetLabel(e){if(!this.tripleStore)return;let t=new x6.IRI(e),r=await this.tripleStore.match(t,R6.Namespace.EXO.term("Asset_label"),void 0);if(r.length===0)return;let i=r[0].object;if(i instanceof C6.Literal)return i.value.length>0?i.value:void 0}};Zs.CommandExecutionFlow=cb;Zs.CommandExecutionFlow=cb=ob=E6([(0,A6.injectable)(),T6("design:paramtypes",[Function,Object,Object,Object,Object,Object])],cb)});var of=S(ea=>{"use strict";var P6=ea&&ea.__decorate||function(n,e,t,r){var i=arguments.length,s=i<3?e:r===null?r=Object.getOwnPropertyDescriptor(e,t):r,a;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")s=Reflect.decorate(n,e,t,r);else for(var c=n.length-1;c>=0;c--)(a=n[c])&&(s=(i<3?a(s):i>3?a(e,t,s):a(e,t))||s);return i>3&&s&&Object.defineProperty(e,t,s),s},D6=ea&&ea.__metadata||function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)};Object.defineProperty(ea,"__esModule",{value:!0});ea.WorkflowEngine=void 0;var F6=Ie(),lb=class{static{o(this,"WorkflowEngine")}constructor(e){this.definition=e}getAvailableTransitions(e){return this.definition.transitions.filter(t=>t.from===e&&!t.isRollback)}getRollbackTransitions(e){return this.definition.transitions.filter(t=>t.from===e&&t.isRollback)}getAllTransitions(e){return this.definition.transitions.filter(t=>t.from===e)}canTransition(e,t){return this.definition.transitions.some(r=>r.from===e&&r.to===t)}getPreviousStatus(e){return this.definition.transitions.find(r=>r.from===e&&r.isRollback)?.to??null}getNextStates(e){return this.getAvailableTransitions(e).map(t=>t.to)}isTerminalState(e){return this.definition.terminalStates.includes(e)}isInitialState(e){return this.definition.initialState===e}getTimestampsForStatus(e){return this.definition.states.find(r=>r.status===e)?.timestampOnEnter??[]}getTransition(e,t){return this.definition.transitions.find(r=>r.from===e&&r.to===t)}getOrderedStates(){return this.definition.states.map(e=>e.status)}getDefinition(){return this.definition}validate(){let e=[],t=new Set(this.definition.states.map(i=>i.status));this.definition.states.length===0&&e.push("Workflow must have at least one state"),t.has(this.definition.initialState)||e.push(`Initial state "${this.definition.initialState}" is not in the states list`);for(let i of this.definition.terminalStates)t.has(i)||e.push(`Terminal state "${i}" is not in the states list`);for(let i of this.definition.transitions)t.has(i.from)||e.push(`Transition "${i.label}" references unknown source state "${i.from}"`),t.has(i.to)||e.push(`Transition "${i.label}" references unknown target state "${i.to}"`);for(let i of this.definition.states){if(this.definition.terminalStates.includes(i.status))continue;this.definition.transitions.filter(a=>a.from===i.status&&!a.isRollback).length===0&&e.push(`State "${i.status}" has no outgoing forward transitions (dead end)`)}let r=new Set;for(let i of this.definition.transitions){let s=`${i.from}\u2192${i.to}`;r.has(s)&&e.push(`Duplicate transition: ${s}`),r.add(s)}return{valid:e.length===0,errors:e}}};ea.WorkflowEngine=lb;ea.WorkflowEngine=lb=P6([(0,F6.injectable)(),D6("design:paramtypes",[Object])],lb)});var ZA=S(ds=>{"use strict";Object.defineProperty(ds,"__esModule",{value:!0});ds.EFFORT_WORKFLOW_PROPERTY=ds.WorkflowTransitionProperty=ds.WorkflowStateProperty=ds.WorkflowProperty=void 0;ds.WorkflowProperty={TARGET_CLASS:"ems__Workflow_targetClass",INITIAL_STATE:"ems__Workflow_initialState",TERMINAL_STATES:"ems__Workflow_terminalStates",IS_DEFAULT:"ems__Workflow_isDefault"};ds.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"};ds.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"};ds.EFFORT_WORKFLOW_PROPERTY="ems__Effort_workflow"});var ta=S(Hp=>{"use strict";Object.defineProperty(Hp,"__esModule",{value:!0});Hp.MetadataHelpers=void 0;var eI=nf(),ub=class{static{o(this,"MetadataHelpers")}static findAllReferencingProperties(e,t){let r=[];for(let[i,s]of Object.entries(e))this.containsReference(s,t)&&r.push(i);return r}static findReferencingProperty(e,t){for(let[r,i]of Object.entries(e))if(this.containsReference(i,t))return r}static containsReference(e,t){if(!e)return!1;let r=t.replace(/\.md$/,"");if(typeof e=="string"){let i=/\[\[([^[\]]+)\]\]/g,s;for(;(s=i.exec(e))!==null;){let c=s[1].split("|")[0].trim();if(c===r||c.endsWith(`/${r}`))return!0}return!1}return Array.isArray(e)?e.some(i=>this.containsReference(i,t)):!1}static isAssetArchived(e){let t=e?.exo__Asset_isArchived;if(t!=null){if(t===!0||t===1)return!0;if(typeof t=="string"){let i=t.toLowerCase().trim();if(i==="true"||i==="yes"||i==="1")return!0}if(typeof t=="boolean")return t}let r=e?.archived;if(r==null)return!1;if(typeof r=="boolean")return r;if(typeof r=="number")return r!==0;if(typeof r=="string"){let i=r.toLowerCase().trim();return i==="true"||i==="yes"||i==="1"}return!1}static getPropertyValue(e,t){return t==="Name"||t==="title"?e.title:t==="created"?e.created:t==="modified"?e.modified:t==="path"?e.path:e.metadata?.[t]}static ensureQuoted(e){return!e||e==='""'?'""':e.startsWith('"')&&e.endsWith('"')?e:`"${e}"`}static buildFileContent(e,t){let r=(0,eI.orderProperties)(e,(0,eI.loadDefaultSpec)()),i=Object.entries(r).map(([c,l])=>{if(Array.isArray(l)){let u=l.map(f=>` - ${String(f)}`).join(`
|
|
92
92
|
`);return`${c}:
|
|
93
93
|
${u}`}return`${c}: ${String(l)}`}).join(`
|
|
94
94
|
`),s=t;if(s===void 0){let c=r.exo__Asset_label;typeof c=="string"&&c.trim()!==""&&(s=`# ${c}`)}let a=s?`
|
|
@@ -762,7 +762,7 @@ ${r}`}o(NJ,"serializeFile");function IN(n,e,t={}){let r=my.default.dirname(n),i=
|
|
|
762
762
|
`).map(s=>s.trim()).filter(Boolean)){let s=LJ.exec(i);if(s){r.push({sessionName:i,uuid:s[1],type:"full"});continue}let a=kJ.exec(i);a&&r.push({sessionName:i,uuid:a[1],type:"short"})}return r}o(MJ,"listClaudeChildSessions");function $J(n,e,t){let r=null,i=e.toLowerCase();function s(a){if(r)return;let c;try{c=(0,yy.readdirSync)(a,{withFileTypes:!0})}catch{return}for(let l of c){if(r)return;if(l.name.startsWith(".")||l.name==="node_modules")continue;let u=(0,xN.join)(a,l.name);if(l.isDirectory())s(u);else if(l.name.endsWith(".md")){let f=l.name.slice(0,-3).toLowerCase();(t==="full"&&f===i||t==="short"&&f.startsWith(i))&&(r=u)}}}return o(s,"walk"),s(n),r}o($J,"findVaultFile");function UJ(n,e){try{let i=(e??(s=>(0,yy.readFileSync)(s,"utf8")))(n).match(/ems__Effort_status\s*:.*\[\[([^\]]+)\]\]/);return i?i[1].includes(jJ):!1}catch{return!1}}o(UJ,"isTaskDoing");async function RN(n,e=gy.exec,t){let r=await MJ(e),i=[];for(let s of r){let a=$J(n,s.uuid,s.type);if(!a){i.push({sessionName:s.sessionName,taskUuid:s.uuid,taskFilePath:null,reason:"vault task not found"});continue}UJ(a,t)||i.push({sessionName:s.sessionName,taskUuid:s.uuid,taskFilePath:a,reason:"vault task status != Doing"})}return i}o(RN,"detectOrphans");async function ON(n,e,t=gy.exec,r=IN){let i=CN(t);if(e)return{ok:!0};let s=new Date().toISOString();if(n.taskFilePath)try{r(n.taskFilePath,{ems__Effort_status:"[[ems__EffortStatusFailed]]",aiTask__Task_lastError:`orphan recovery: ${n.reason}`,exo__Asset_updatedAt:s})}catch(a){return{ok:!1,error:`vault update failed: ${a.message}`}}try{await i(`tmux kill-session -t ${JSON.stringify(n.sessionName)}`)}catch{}return{ok:!0}}o(ON,"recoverOrphan");function VJ(){return process.env.EXOCORTEX_VAULT??(0,_y.join)((0,DN.homedir)(),"vault-2025")}o(VJ,"defaultVault");function FN(){return new we("recover").description("Detect and recover orphaned claude-child tmux sessions. A session is orphaned when the corresponding vault task is not in Doing status. Default mode: dry-run (no changes). Use --apply to perform recovery.").option("--vault <path>","Path to Obsidian vault",VJ()).option("--dry-run","List orphans without applying changes (default)",!1).option("--apply","Apply orphan recovery: set Failed + kill tmux session",!1).action(async n=>{let e=(0,_y.resolve)(n.vault);if(!(0,PN.existsSync)(e)){console.error(`[recover] vault not found: ${e}`),process.exitCode=1;return}let t=!n.apply;console.log(`[recover] vault=${e} mode=${t?"dry-run":"apply"}`);let r=await RN(e);if(r.length===0){console.log("[recover] No orphaned claude-child sessions found.");return}console.log(`[recover] Found ${r.length} orphan(s):`);for(let a of r){let c=a.taskFilePath??"(not found in vault)";console.log(` session=${a.sessionName} uuid=${a.taskUuid} reason=${a.reason}`),console.log(` file=${c}`)}if(t){console.log("[recover] Dry-run mode: no changes applied. Use --apply to recover.");return}let i=0,s=0;for(let a of r){let c=await ON(a,!1);c.ok?(i++,console.log(`[recover] RECOVERED: ${a.sessionName}`)):(s++,console.error(`[recover] ERROR recovering ${a.sessionName}: ${c.error}`))}console.log(`[recover] Done: recovered=${i} errors=${s}`),s>0&&(process.exitCode=1)})}o(FN,"recoverCommand");var JE=require("fs"),by=require("path"),Kn=oe(ir());function BJ(n,e){return e.concat([n])}o(BJ,"collectAlso");var qJ="https://exocortex.my/ontology/find#Alias_sparql",GJ="https://exocortex.my/ontology/exo#Asset_label";function uu(n){if(n&&typeof n=="object"&&"value"in n){let e=n.value;return typeof e=="string"?e:String(e)}return String(n)}o(uu,"nodeValue");async function WJ(n,e){let t=await n.match(void 0,void 0,void 0),r=[];for(let s of t)uu(s.predicate)!==GJ||uu(s.object)!==e||r.push(uu(s.subject));if(r.length===0)return null;let i=[];for(let s of r)for(let a of t)uu(a.predicate)===qJ&&uu(a.subject)===s&&i.push(uu(a.object));if(i.length===0)return null;if(i.length>1)throw new Bt(`Ambiguous find__Alias "${e}" \u2014 ${i.length} instances define a sparql fragment`,`Ensure exactly one find__Alias asset has exo:Asset_label "${e}"`);return i[0]}o(WJ,"resolveAliasFragment");var zJ=/^([a-z][a-zA-Z0-9]*)__([A-Za-z0-9_]+)$/,HJ="https://exocortex.my/ontology/";function QJ(n,e){let t=zJ.exec(e);if(t){let i=`<${HJ}${t[1]}#${t[2]}>`;return n.replace(/\?value\b/g,i)}let r=e.replace(/\\/g,"\\\\").replace(/"/g,'\\"');return n.replace(/\?value\b/g,`"${r}"`)}o(QJ,"bindValueLiteral");function NN(){return new we("find").description("Find vault assets via SPARQL \u2014 outputs file paths one per line (RFC 8e83442b T1.1)").option("--vault <path>","Path to Obsidian vault",process.cwd()).option("--also <path>","Additional vault to include (repeatable)",BJ,[]).option("--sparql <query>","SPARQL SELECT query (must bind ?path)").option("--class <value>","Filter by class label via find__Alias 'class' (e.g. ems__Task)").action(async n=>{se.setFormat("text");try{if(n.sparql&&n.class)throw new Bt("--sparql and --class are mutually exclusive","Pass either a raw --sparql query or a find__Alias-backed flag like --class");if(!n.sparql&&!n.class)throw new Bt("one of --sparql <query> or --class <value> is required",'exocortex find --class ems__Task OR exocortex find --sparql "SELECT ?path WHERE { ... }"');let e=(0,by.resolve)(n.vault);if(!(0,JE.existsSync)(e))throw new Re(e);let t=new jt(e),i=await new Kn.NoteToRDFConverter(t).convertVault(),s=n.also||[];for(let v of s){let E=(0,by.resolve)(v);if(!(0,JE.existsSync)(E))throw new Re(E);let I=new jt(E),U=await new Kn.NoteToRDFConverter(I).convertVault();i=i.concat(U)}let a=new Kn.InMemoryTripleStore;await a.addAll(i);let c;if(n.class){let v=await WJ(a,"class");if(v===null)throw new Bt('No find__Alias with exo:Asset_label "class" was found in the vault',"Seed a find__Alias asset (label=class) or fall back to exocortex find --sparql");c=`SELECT ?path WHERE { ${QJ(v,n.class)} }`}else c=n.sparql;let l=ru(c);l=co(l);let u=new Kn.ExoQLParser,f=lo(oo(e));for(let v of s){let E=lo(oo((0,by.resolve)(v)));for(let[I,F]of E)f.has(I)||f.set(I,F)}f.size>0&&u.setVaultPrefixes(f);let d=u.parse(l),p=new Kn.ExoQLAlgebraTranslator().translate(d);p.type!=="construct"&&(p=new Kn.AlgebraOptimizer().optimize(p));let b=await new Kn.ExoQLQueryExecutor(a).executeAll(p),w="obsidian://vault/";for(let v of b){let I=v.toJSON().path;if(typeof I!="string"||!I.startsWith(w))continue;let F=I.slice(w.length),U;try{U=decodeURIComponent(F)}catch{U=F}process.stdout.write(U+`
|
|
763
763
|
`)}}catch(e){se.handle(e),process.exit(5)}})}o(NN,"findCommand");var t2=require("fs"),r2=require("path"),Oe=oe(ir());var UN=oe(ir()),Ft=oe(jN());var MN="obsidian://vault/";function oZ(n){let e=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;return{async resolveTargetPath(t){if(!t)throw new Error("Cannot resolve empty targetIRI to a vault path");let r=t;if(r.startsWith(MN))r=decodeURI(r.slice(MN.length));else if(e.test(r)){let i=await n.findFileByUID(r);if(!i)throw new Error(`No vault file found for UID: ${r}`);r=i}if(r.endsWith(".md")||(r=`${r}.md`),!await n.fileExists(r))throw new Error(`Cannot resolve target file for IRI "${t}" (tried "${r}")`);return r}}}o(oZ,"createCliPathResolver");var cZ=["openFile","sparqlSelect","getActiveFileIRI","getActiveFilePath","trashFile","duplicateFile"],e2=class extends Error{constructor(t){super(`Service "${t}" is not implemented in the CLI (no-op stub). dyncommand exec on this service_call grounding cannot change vault state. See CLI parity issues #2865-#2868 for port status.`);this.serviceId=t;this.name="CliServiceNotImplementedError"}static{o(this,"CliServiceNotImplementedError")}};function $N(n){return{async execute(){throw new e2(n)}}}o($N,"notImplementedService");function lZ(n){return e=>{let t=n.getFirstLinkpathDest(e,"");if(!t||!("basename"in t))return null;let i=n.getFrontmatter(t)?.exo__Asset_label;return typeof i=="string"&&i.length>0?i:null}}o(lZ,"createCliClassResolver");function VN(n,e){for(let t of cZ)n.register(t,$N(t));for(let t of["updateProperty","removeProperty","setStatus","createAsset"])n.register(t,$N(t));if(e){if(e.fsAdapter){let t=new UN.FrontmatterService,r=oZ(e.fsAdapter);n.register("updateProperty",(0,Ft.createUpdatePropertyService)(e.fsAdapter,t,r)),n.register("removeProperty",(0,Ft.createRemovePropertyService)(e.fsAdapter,t,r)),n.register("setStatus",(0,Ft.createSetStatusService)(e.fsAdapter,t,r)),n.register("createAsset",(0,Ft.createCreateAssetService)(e.vaultAdapter,e.fsAdapter,lZ(e.vaultAdapter)))}n.register("createRelatedTask",(0,Ft.createCreateRelatedTaskService)(e.vaultAdapter,e.genericAssetCreationService)),n.register("createRelatedProject",(0,Ft.createCreateRelatedProjectService)(e.vaultAdapter,e.genericAssetCreationService)),n.register("archiveAsset",(0,Ft.createArchiveAssetService)(e.vaultAdapter,e.archiveAssetService)),n.register("planForEvening",(0,Ft.createPlanForEveningService)(e.vaultAdapter,e.taskStatusService)),n.register("cleanProperties",(0,Ft.createCleanPropertiesService)(e.vaultAdapter,e.propertyCleanupService)),n.register("renameToUid",(0,Ft.createRenameToUidService)(e.vaultAdapter,e.renameToUidService)),n.register("repairFolder",(0,Ft.createRepairFolderService)(e.vaultAdapter,e.folderRepairService)),n.register("fixMissingLabel",(0,Ft.createFixMissingLabelService)(e.vaultAdapter,e.fixMissingLabelService))}}o(VN,"populateCliServiceRegistry");var uZ=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;async function fZ(){if(process.stdin.isTTY)return[];let n=[];for await(let t of process.stdin)n.push(t);return Buffer.concat(n).toString("utf-8").split(`
|
|
764
764
|
`).map(t=>t.trim()).filter(t=>t.length>0)}o(fZ,"readStdinLines");function vy(n){if(n&&typeof n=="object"&&"value"in n){let e=n.value;return typeof e=="string"?e:String(e)}return String(n)}o(vy,"nodeValue");async function dZ(n,e){let t=new Oe.IRI("https://exocortex.my/ontology/exocmd#Command_cliName"),r=await n.match(void 0,t,void 0),i=[];for(let s of r)if(vy(s.object)===e){let l=vy(s.subject).match(/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.md$/i);l&&i.push(l[1])}if(i.length===0)return null;if(i.length>1)throw new Bt(`Ambiguous cliName "${e}" \u2014 resolves to ${i.length} commands: ${i.join(", ")}`,"Use the UUID directly: exocortex apply <uuid> <path>");return i[0]}o(dZ,"resolveSlugToUuid");async function hZ(n,e){let t=new Oe.IRI("https://exocortex.my/ontology/exocmd#Command_destructive"),r=await n.match(void 0,t,void 0);for(let i of r)if(vy(i.subject).includes(e)){let a=vy(i.object);if(a==="true"||a==="True")return!0}return!1}o(hZ,"isDestructive");async function pZ(n,e,t,r,i,s,a){let c=(0,r2.resolve)(n,r);if(!(0,t2.existsSync)(c))return console.error(`\u274C Target file not found: ${r}`),!1;let u=await new Oe.CommandResolver(e).loadCommand(t);if(!u)return console.error(`\u274C Command with UID "${t}" not found.`),!1;if(await hZ(e,t)&&!i.dryRun&&!i.yes)return console.error(`\u274C Command "${u.name}" is marked destructive. Add --dry-run to preview, or --yes to apply.`),!1;let d=(0,Oe.vaultPathToIRI)(r);if(!await new Oe.PreconditionEvaluator(e,void 0,{clock:s}).evaluate(u.precondition,d))return console.error(`\u274C Precondition not satisfied for "${u.name}" on "${r}".`),!1;if(i.dryRun)return console.log(`\u{1F50D} Dry-run: would apply "${u.name}" to "${r}" (precondition passed).`),!0;let y=new Oe.ServiceRegistry,b=new jt(n),w=new Oe.GenericAssetCreationService(b).withDeterminism({clock:s,uidGenerator:a}),v=new Oe.ArchiveAssetService(b),E=new Oe.PropertyCleanupService(b),I=new Oe.FixMissingLabelService(b),F=new Oe.RenameToUidService(b),U=new Oe.FolderRepairService(b),ee=new Oe.TaskStatusService(b,new Oe.EffortStatusWorkflow,new Oe.StatusTimestampService(b)),V=new yr(n);VN(y,{vaultAdapter:b,fsAdapter:V,genericAssetCreationService:w,archiveAssetService:v,taskStatusService:ee,propertyCleanupService:E,fixMissingLabelService:I,renameToUidService:F,folderRepairService:U});let W=new Oe.GroundingExecutor(V,V,y,(0,Oe.createVaultFrontmatterClassLabelResolver)(V),{clock:s,uidGenerator:a}),D;if(i.input)try{let G=JSON.parse(i.input);if(typeof G!="object"||G===null||Array.isArray(G))throw new Error("must be a JSON object");D=G}catch(G){let Fe=G instanceof Error?G.message:String(G);return console.error(`\u274C --input: invalid JSON object (${Fe})`),!1}let N=await W.execute(u.grounding,d,r,D);if(N.success){let G=u.successMessage??`Applied "${u.name}" to "${r}".`;return console.log(`\u2705 ${G}`),!0}else return console.error(`\u274C "${u.name}" failed on "${r}": ${N.error}`),!1}o(pZ,"executeOnTarget");function BN(){return new we("apply").description("Apply an exocmd__Command to one or more vault assets (RFC 8e83442b T1.2). Pass a path arg or pipe paths via stdin.").argument("<cmd>","Command UUID or cliName slug").argument("[path]","Vault-relative path to target asset (omit to read paths from stdin)").option("--vault <path>","Path to Obsidian vault",process.cwd()).option("--dry-run","Preview without writing").option("--yes","Skip destructive-command confirmation").option("--input <json>","JSON userInput for service_call groundings").option("--seed <uuid>","Deterministic UID seed for test/replay (uses seededUidGenerator)").option("--frozen-clock <iso>","Freeze clock to ISO timestamp for test/replay (uses frozenClock)").action(async(n,e,t)=>{se.setFormat("text");try{let r=(0,r2.resolve)(t.vault);if(!(0,t2.existsSync)(r))throw new Re(r);sy(r);let i=t.frozenClock?(0,Oe.frozenClock)(t.frozenClock):(0,Oe.liveClock)(),s=t.seed?(0,Oe.seededUidGenerator)(t.seed):(0,Oe.liveUidGenerator)(),a=new jt(r),l=await new Oe.NoteToRDFConverter(a).convertVault(),u=new Oe.InMemoryTripleStore;await u.addAll(l);let f;if(uZ.test(n))f=n;else{let y=await dZ(u,n);y||(console.error(`\u274C No command found with UUID or cliName "${n}".`),process.exit(3)),f=y}let d;if(e)d=[e];else if(d=await fZ(),d.length===0)throw new Bt("No target path provided and stdin is empty.","exocortex apply <uuid> <path> OR exocortex find ... | exocortex apply <uuid>");let h=0,p=0;for(let y of d)await pZ(r,u,f,y,t,i,s)?h++:p++;d.length>1&&console.log(`
|
|
765
|
-
\u{1F4CA} Applied to ${h}/${d.length} target(s) (${p} failed).`),p>0&&process.exit(5)}catch(r){se.handle(r),process.exit(5)}})}o(BN,"applyCommand");var fo=require("fs"),fu=require("path");var qN=/^---\s*$/,mZ=/^exocmd__Grounding_type:\s*(.+?)\s*$/,gZ=/^"?\[\[[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}(?:\|[^\]]*)?\]\]"?$/i,yZ=new Set(["node_modules"]);function _Z(n){return n.startsWith(".")||yZ.has(n)}o(_Z,"shouldSkipDir");function*GN(n){let e;try{e=(0,fo.readdirSync)(n,{withFileTypes:!0})}catch(t){let r=t;if(r.code==="EPERM"||r.code==="EACCES"||r.code==="ENOENT")return;throw t}for(let t of e){let r=(0,fu.join)(n,t.name);if(t.isDirectory()){if(_Z(t.name))continue;yield*GN(r)}else t.isFile()&&t.name.endsWith(".md")&&(yield r)}}o(GN,"walkMarkdownFiles");function bZ(n){let e=n.split(/\r?\n/);if(e.length<2||!qN.test(e[0]))return null;for(let t=1;t<e.length;t++)if(qN.test(e[t]))return{lines:e.slice(1,t),startLine:2};return null}o(bZ,"extractFrontmatter");function SZ(n){let e=n.trim();return e===""||e==="null"||e==="~"?!1:!gZ.test(e)}o(SZ,"isLiteralForm");function vZ(n){let e=[];for(let t of GN(n)){let r;try{r=(0,fo.readFileSync)(t,"utf-8")}catch{continue}let i=bZ(r);if(i)for(let s=0;s<i.lines.length;s++){let a=i.lines[s].match(mZ);if(!a)continue;let c=a[1];SZ(c)&&e.push({path:(0,fu.relative)(n,t),line:i.startLine+s,value:c})}}return e}o(vZ,"scanVaultForLiteralForm");function WN(){return new we("grounding-type-literal-form").description("Detect post-Phase-4+1 regressions: any exocmd__Grounding_type literal-string form (not wikilink) in vault frontmatter").requiredOption("--vault <path>","Vault root directory").option("--output <type>","Response format: text|json","text").action(n=>{let e=n.output??"text";se.setFormat(e);try{let t=(0,fu.resolve)(n.vault);if(!(0,fo.existsSync)(t)||!(0,fo.statSync)(t).isDirectory())throw new Re(t);let r=vZ(t);if(e==="json")console.log(JSON.stringify({vaultPath:t,violationCount:r.length,violations:r,clean:r.length===0},null,2));else if(r.length===0)console.log(`OK ${t}: 0 exocmd__Grounding_type literal-form violations`);else{console.error(`FAIL ${t}: ${r.length} exocmd__Grounding_type literal-form violation(s):`);for(let i of r)console.error(` ${i.path}:${i.line} \u2014 value: ${i.value}`);console.error("\nRFC 9d20c91f Phase 3 migrated all values to wikilink form `[[<uid>]]`. Re-run the Phase 3 migration script or hand-edit offending files.")}r.length>0&&(process.exitCode=1)}catch(t){se.handle(t)}})}o(WN,"auditGroundingTypeLiteralFormCommand");function zN(){let n=new we("audit").description("Audit vault for regression patterns (RFC cutover detectors)");return n.addCommand(WN()),n}o(zN,"auditCommand");function HN(n){let e=new we;return e.name("exocortex").description("CLI tool for Exocortex knowledge management system").version(n??"16.31.
|
|
765
|
+
\u{1F4CA} Applied to ${h}/${d.length} target(s) (${p} failed).`),p>0&&process.exit(5)}catch(r){se.handle(r),process.exit(5)}})}o(BN,"applyCommand");var fo=require("fs"),fu=require("path");var qN=/^---\s*$/,mZ=/^exocmd__Grounding_type:\s*(.+?)\s*$/,gZ=/^"?\[\[[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}(?:\|[^\]]*)?\]\]"?$/i,yZ=new Set(["node_modules"]);function _Z(n){return n.startsWith(".")||yZ.has(n)}o(_Z,"shouldSkipDir");function*GN(n){let e;try{e=(0,fo.readdirSync)(n,{withFileTypes:!0})}catch(t){let r=t;if(r.code==="EPERM"||r.code==="EACCES"||r.code==="ENOENT")return;throw t}for(let t of e){let r=(0,fu.join)(n,t.name);if(t.isDirectory()){if(_Z(t.name))continue;yield*GN(r)}else t.isFile()&&t.name.endsWith(".md")&&(yield r)}}o(GN,"walkMarkdownFiles");function bZ(n){let e=n.split(/\r?\n/);if(e.length<2||!qN.test(e[0]))return null;for(let t=1;t<e.length;t++)if(qN.test(e[t]))return{lines:e.slice(1,t),startLine:2};return null}o(bZ,"extractFrontmatter");function SZ(n){let e=n.trim();return e===""||e==="null"||e==="~"?!1:!gZ.test(e)}o(SZ,"isLiteralForm");function vZ(n){let e=[];for(let t of GN(n)){let r;try{r=(0,fo.readFileSync)(t,"utf-8")}catch{continue}let i=bZ(r);if(i)for(let s=0;s<i.lines.length;s++){let a=i.lines[s].match(mZ);if(!a)continue;let c=a[1];SZ(c)&&e.push({path:(0,fu.relative)(n,t),line:i.startLine+s,value:c})}}return e}o(vZ,"scanVaultForLiteralForm");function WN(){return new we("grounding-type-literal-form").description("Detect post-Phase-4+1 regressions: any exocmd__Grounding_type literal-string form (not wikilink) in vault frontmatter").requiredOption("--vault <path>","Vault root directory").option("--output <type>","Response format: text|json","text").action(n=>{let e=n.output??"text";se.setFormat(e);try{let t=(0,fu.resolve)(n.vault);if(!(0,fo.existsSync)(t)||!(0,fo.statSync)(t).isDirectory())throw new Re(t);let r=vZ(t);if(e==="json")console.log(JSON.stringify({vaultPath:t,violationCount:r.length,violations:r,clean:r.length===0},null,2));else if(r.length===0)console.log(`OK ${t}: 0 exocmd__Grounding_type literal-form violations`);else{console.error(`FAIL ${t}: ${r.length} exocmd__Grounding_type literal-form violation(s):`);for(let i of r)console.error(` ${i.path}:${i.line} \u2014 value: ${i.value}`);console.error("\nRFC 9d20c91f Phase 3 migrated all values to wikilink form `[[<uid>]]`. Re-run the Phase 3 migration script or hand-edit offending files.")}r.length>0&&(process.exitCode=1)}catch(t){se.handle(t)}})}o(WN,"auditGroundingTypeLiteralFormCommand");function zN(){let n=new we("audit").description("Audit vault for regression patterns (RFC cutover detectors)");return n.addCommand(WN()),n}o(zN,"auditCommand");function HN(n){let e=new we;return e.name("exocortex").description("CLI tool for Exocortex knowledge management system").version(n??"16.31.3"),e.addCommand(NN()),e.addCommand(BN()),e.addCommand(cF()),e.addCommand(dF()),e.addCommand(MF()),e.addCommand(mF()),e.addCommand(gF()),e.addCommand(vF()),e.addCommand(VF()),e.addCommand(JF()),e.addCommand(tN()),e.addCommand(rN()),e.addCommand(iN()),e.addCommand(mN()),e.addCommand(gN()),e.addCommand(EN()),e.addCommand(FN()),e.addCommand(zN()),e}o(HN,"createProgram");HN().parse();0&&(module.exports={createProgram});
|
|
766
766
|
/*! Bundled license information:
|
|
767
767
|
|
|
768
768
|
reflect-metadata/Reflect.js:
|