@kitelev/exocortex-cli 16.14.0 → 16.14.1
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.14.
|
|
2
|
+
// @kitelev/exocortex-cli v16.14.1
|
|
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(t).map(([a,c])=>this.serializeValue(a,c)).join(`
|
|
|
88
88
|
${r}`}return`${e}: ${String(t)}`}escapeRegex(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}};hp.FrontmatterService=Mu;Mu.FRONTMATTER_REGEX=/^---\n([\s\S]*?)\n---/;Mu.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 Cn=b(pp=>{"use strict";Object.defineProperty(pp,"__esModule",{value:!0});pp.DateFormatter=void 0;var T_=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)}};pp.DateFormatter=T_});var Oa=b(mp=>{"use strict";Object.defineProperty(mp,"__esModule",{value:!0});mp.LoggingService=void 0;var $u=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}`)}}};mp.LoggingService=$u;$u.isVerbose=!1;$u.isDevelopment=void 0});var eA=b(gi=>{"use strict";var C9=gi&&gi.__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},R9=gi&&gi.__metadata||function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Vu;Object.defineProperty(gi,"__esModule",{value:!0});gi.GroundingExecutor=gi.ServiceRegistry=void 0;var O9=Ce(),P9=Jn(),os=lo(),F9=as(),A_=Cn(),J3=Pu(),D9=Oa();function N9(n){if(!n)return;let e=n.match(/^"?\[\[([^\]|]+)(?:\|[^\]]*)?\]\]"?$/);return e?e[1]:n}o(N9,"extractClassFromTargetValue");var L9=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,gp=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())}};gi.ServiceRegistry=gp;var Z3=20,yp=Vu=class{static{o(this,"GroundingExecutor")}constructor(e,t,r,i){this.frontmatterService=new F9.FrontmatterService,this.fileReader=e,this.fileWriter=t,this.serviceRegistry=r,this.classLabelToUid=i}async execute(e,t,r,i){try{switch(e.type){case os.GroundingType.PROPERTY_SET:return await this.executePropertySet(e,t,r,i);case os.GroundingType.PROPERTY_DELETE:return await this.executePropertyDelete(e,r);case os.GroundingType.COMPOSITE:return await this.executeComposite(e,t,r,i,0);case os.GroundingType.SERVICE_CALL:return await this.executeServiceCall(e,t,r,i);case os.GroundingType.CREATE_INSTANCE:return await this.executeCreateInstance(e,t,r,i);case os.GroundingType.PROPERTY_APPEND:return await this.executePropertyAppend(e,t,r,i);case os.GroundingType.PROPERTY_INCREMENT:return await this.executePropertyIncrement(e,r);case os.GroundingType.PROPERTY_SHIFT:return await this.executePropertyShift(e,r);case os.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>=Z3)return{success:!1,error:`Composite grounding exceeded maximum depth of ${Z3}`};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=N9(e.targetValue);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.targetValue)try{let l=this.substituteVariables(e.targetValue,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=this.frontmatterService.updateProperty(t,"exo__Instance_class",'["[[ems__Task]]"]');return await this.fileWriter.updateFile(e,r),{success:!0}}async executeConvertToProject(e){let t=await this.fileReader.readFile(e),r=this.frontmatterService.updateProperty(t,"exo__Instance_class",'["[[ems__Project]]"]');return await this.fileWriter.updateFile(e,r),{success:!0}}async executeCreateInstance(e,t,r,i){if(!e.targetFolder)return{success:!1,error:"create_instance requires targetFolder"};let s=(0,P9.v4)(),a=i?.label??"Untitled",c={exo__Asset_uid:s,exo__Asset_createdAt:A_.DateFormatter.toLocalTimestamp(new Date),exo__Asset_label:a};if(a!=="Untitled"&&(c.aliases=[a]),e.targetClass){let d=await this.resolveClassRefToUid(e.targetClass);c.exo__Instance_class=[`"[[${d}]]"`]}if(e.propertyDefaults)for(let[d,h]of Object.entries(e.propertyDefaults))typeof h=="string"&&(c[d]=this.substituteVariables(h,t,i,void 0,r));if(i)for(let[d,h]of Object.entries(i))d!=="label"&&h!=null&&(c[d]=h);if(t&&r){let d;try{d=await this.fileReader.readFile(r)}catch(p){return{success:!1,error:`create_instance: failed to read $target file "${r}": ${p instanceof Error?p.message:String(p)}`}}let h=this.frontmatterService.parseObject(d);if(h)for(let[p,y]of Object.entries(h))Vu.CREATE_INSTANCE_BLACKLIST.has(p)||c[p]===void 0&&(c[p]=this.reformatCopiedValue(y))}if(t){let d=e.linkBackProperty??"exo__Asset_prototype",h=Vu.extractBacklinkTarget(t,r);c[d]=`"[[${h}]]"`}let l=this.frontmatterService.createFrontmatter("",c),u=this.substituteVariables(e.targetFolder,t,i,void 0,r),f=u?`${u}/${s}.md`:`${s}.md`;return await this.fileWriter.createFile(f,l),{success:!0,openPath:f}}async resolveClassRefToUid(e){if(L9.test(e)||!this.classLabelToUid)return e;try{let t=await this.classLabelToUid(e);return t&&t.length>0?t:e}catch{return e}}reformatCopiedValue(e){return Array.isArray(e)?e.map(t=>this.reformatWikilink(t)):this.reformatWikilink(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===os.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){D9.LoggingService.error(`[GroundingExecutor] Rollback failed for ${t}`,i instanceof Error?i:new Error(String(i)))}}substituteVariables(e,t,r,i,s){let a=new Date,c=a.toISOString(),l=A_.DateFormatter.toLocalTimestamp(a),u=c.slice(0,10),f=`${u}T00:00:00`,d=e.replace(/\$target\.([A-Za-z_][\w]*)/g,(h,p)=>{if(!i)throw new Error(`$target.${p} substitution requires target frontmatter context; none was supplied (asset IRI: ${t})`);let y=i[p];if(y==null)throw new Error(`$target.${p} is undefined on asset ${t}`);if(Array.isArray(y))throw new Error(`$target.${p} resolved to an array on asset ${t}; only scalar properties are supported for substitution`);return String(y).replace(/^["'](.*)["']$/,"$1")});if(/\$targetFolder\b/.test(d)){if(!s)throw new Error("$targetFolder substitution requires targetFilePath context; none was supplied (asset IRI: "+t+")");let h=s.replace(/^\/+/,""),p=h.lastIndexOf("/"),y=p>=0?h.slice(0,p):"";d=d.replace(/\$targetFolder\b/g,y)}if(d=d.replace(/\$target/g,t).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 h=String(r.value);d=d.replace(/\$input\b/g,h).replace(/\$value\b/g,h)}return d}async executePropertyAppend(e,t,r,i){if(!e.targetProperty)return{success:!1,error:"property_append requires targetProperty"};if(e.targetValue===void 0)return{success:!1,error:"property_append requires targetValue"};let s=await this.fileReader.readFile(r),a=this.frontmatterService.parseObject(s)??{},c=this.substituteVariables(e.targetValue,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=Vu.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=A_.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=J3.DateTimeParsing.parseYearMonthDuration(r),c=new Date(e.getTime());return c.setMonth(c.getMonth()+a),c}let s=J3.DateTimeParsing.parseDayTimeDuration(r);return new Date(e.getTime()+s)}static extractBacklinkTarget(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}};gi.GroundingExecutor=yp;yp.CREATE_INSTANCE_BLACKLIST=new Set(["exo__Asset_uid","exo__Asset_createdAt","exo__Asset_updatedAt","exo__Instance_class","exo__Asset_label","aliases","ems__Effort_status","ems__Effort_startTimestamp","ems__Effort_endTimestamp","ems__Effort_resolutionTimestamp","ems__Effort_area","exo__Asset_relates"]);gi.GroundingExecutor=yp=Vu=C9([(0,O9.injectable)(),R9("design:paramtypes",[Object,Object,gp,Function])],yp)});var tA=b(Gs=>{"use strict";var k9=Gs&&Gs.__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},j9=Gs&&Gs.__metadata||function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},x_;Object.defineProperty(Gs,"__esModule",{value:!0});Gs.CommandExecutionFlow=void 0;var M9=Ce(),$9=lo(),V9=Ee(),B9=je(),U9=ir(),q9=Cn(),I_=x_=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=x_.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)}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!==$9.GroundingType.CREATE_INSTANCE||!t.prefillLabelWithDate||!r||!this.tripleStore)return e;let i=await this.resolveAssetLabel(r);if(!i)return e;let s=q9.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 V9.IRI(e),r=await this.tripleStore.match(t,U9.Namespace.EXO.term("Asset_label"),void 0);if(r.length===0)return;let i=r[0].object;if(i instanceof B9.Literal)return i.value.length>0?i.value:void 0}};Gs.CommandExecutionFlow=I_;Gs.CommandExecutionFlow=I_=x_=k9([(0,M9.injectable)(),j9("design:paramtypes",[Function,Object,Object,Object,Object,Object])],I_)});var Bu=b(zs=>{"use strict";var W9=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},G9=zs&&zs.__metadata||function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)};Object.defineProperty(zs,"__esModule",{value:!0});zs.WorkflowEngine=void 0;var z9=Ce(),C_=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}}};zs.WorkflowEngine=C_;zs.WorkflowEngine=C_=W9([(0,z9.injectable)(),G9("design:paramtypes",[Object])],C_)});var rA=b(cs=>{"use strict";Object.defineProperty(cs,"__esModule",{value:!0});cs.EFFORT_WORKFLOW_PROPERTY=cs.WorkflowTransitionProperty=cs.WorkflowStateProperty=cs.WorkflowProperty=void 0;cs.WorkflowProperty={TARGET_CLASS:"ems__Workflow_targetClass",INITIAL_STATE:"ems__Workflow_initialState",TERMINAL_STATES:"ems__Workflow_terminalStates",IS_DEFAULT:"ems__Workflow_isDefault"};cs.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"};cs.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"};cs.EFFORT_WORKFLOW_PROPERTY="ems__Effort_workflow"});var Hs=b(_p=>{"use strict";Object.defineProperty(_p,"__esModule",{value:!0});_p.MetadataHelpers=void 0;var R_=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=Object.entries(e).map(([a,c])=>{if(Array.isArray(c)){let l=c.map(u=>` - ${u}`).join(`
|
|
91
|
+
Details: ${t.message}`:"";console.error(`[Exocortex ERROR]${s} ${e}${a}`)}}};mp.LoggingService=$u;$u.isVerbose=!1;$u.isDevelopment=void 0});var eA=b(gi=>{"use strict";var C9=gi&&gi.__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},R9=gi&&gi.__metadata||function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},Vu;Object.defineProperty(gi,"__esModule",{value:!0});gi.GroundingExecutor=gi.ServiceRegistry=void 0;var O9=Ce(),P9=Jn(),os=lo(),F9=as(),A_=Cn(),J3=Pu(),D9=Oa();function N9(n){if(!n)return;let e=n.match(/^"?\[\[([^\]|]+)(?:\|[^\]]*)?\]\]"?$/);return e?e[1]:n}o(N9,"extractClassFromTargetValue");var L9=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,gp=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())}};gi.ServiceRegistry=gp;var Z3=20,yp=Vu=class{static{o(this,"GroundingExecutor")}constructor(e,t,r,i){this.frontmatterService=new F9.FrontmatterService,this.fileReader=e,this.fileWriter=t,this.serviceRegistry=r,this.classLabelToUid=i}async execute(e,t,r,i){try{switch(e.type){case os.GroundingType.PROPERTY_SET:return await this.executePropertySet(e,t,r,i);case os.GroundingType.PROPERTY_DELETE:return await this.executePropertyDelete(e,r);case os.GroundingType.COMPOSITE:return await this.executeComposite(e,t,r,i,0);case os.GroundingType.SERVICE_CALL:return await this.executeServiceCall(e,t,r,i);case os.GroundingType.CREATE_INSTANCE:return await this.executeCreateInstance(e,t,r,i);case os.GroundingType.PROPERTY_APPEND:return await this.executePropertyAppend(e,t,r,i);case os.GroundingType.PROPERTY_INCREMENT:return await this.executePropertyIncrement(e,r);case os.GroundingType.PROPERTY_SHIFT:return await this.executePropertyShift(e,r);case os.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>=Z3)return{success:!1,error:`Composite grounding exceeded maximum depth of ${Z3}`};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=N9(e.targetValue);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.targetValue)try{let l=this.substituteVariables(e.targetValue,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=(0,P9.v4)(),a=i?.label??"Untitled",c={exo__Asset_uid:s,exo__Asset_createdAt:A_.DateFormatter.toLocalTimestamp(new Date),exo__Asset_label:a};if(a!=="Untitled"&&(c.aliases=[a]),e.targetClass){let d=await this.resolveClassRefToUid(e.targetClass);c.exo__Instance_class=[`"[[${d}]]"`]}if(e.propertyDefaults)for(let[d,h]of Object.entries(e.propertyDefaults))typeof h=="string"&&(c[d]=this.substituteVariables(h,t,i,void 0,r));if(i)for(let[d,h]of Object.entries(i))d!=="label"&&h!=null&&(c[d]=h);if(t&&r){let d;try{d=await this.fileReader.readFile(r)}catch(p){return{success:!1,error:`create_instance: failed to read $target file "${r}": ${p instanceof Error?p.message:String(p)}`}}let h=this.frontmatterService.parseObject(d);if(h)for(let[p,y]of Object.entries(h))Vu.CREATE_INSTANCE_BLACKLIST.has(p)||c[p]===void 0&&(c[p]=this.reformatCopiedValue(y))}if(t){let d=e.linkBackProperty??"exo__Asset_prototype",h=Vu.extractBacklinkTarget(t,r);c[d]=`"[[${h}]]"`}let l=this.frontmatterService.createFrontmatter("",c),u=this.substituteVariables(e.targetFolder,t,i,void 0,r),f=u?`${u}/${s}.md`:`${s}.md`;return await this.fileWriter.createFile(f,l),{success:!0,openPath:f}}async resolveClassRefToUid(e){if(L9.test(e)||!this.classLabelToUid)return e;try{let t=await this.classLabelToUid(e);return t&&t.length>0?t:e}catch{return e}}reformatCopiedValue(e){return Array.isArray(e)?e.map(t=>this.reformatWikilink(t)):this.reformatWikilink(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===os.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){D9.LoggingService.error(`[GroundingExecutor] Rollback failed for ${t}`,i instanceof Error?i:new Error(String(i)))}}substituteVariables(e,t,r,i,s){let a=new Date,c=a.toISOString(),l=A_.DateFormatter.toLocalTimestamp(a),u=c.slice(0,10),f=`${u}T00:00:00`,d=e.replace(/\$target\.([A-Za-z_][\w]*)/g,(h,p)=>{if(!i)throw new Error(`$target.${p} substitution requires target frontmatter context; none was supplied (asset IRI: ${t})`);let y=i[p];if(y==null)throw new Error(`$target.${p} is undefined on asset ${t}`);if(Array.isArray(y))throw new Error(`$target.${p} resolved to an array on asset ${t}; only scalar properties are supported for substitution`);return String(y).replace(/^["'](.*)["']$/,"$1")});if(/\$targetFolder\b/.test(d)){if(!s)throw new Error("$targetFolder substitution requires targetFilePath context; none was supplied (asset IRI: "+t+")");let h=s.replace(/^\/+/,""),p=h.lastIndexOf("/"),y=p>=0?h.slice(0,p):"";d=d.replace(/\$targetFolder\b/g,y)}if(d=d.replace(/\$target/g,t).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 h=String(r.value);d=d.replace(/\$input\b/g,h).replace(/\$value\b/g,h)}return d}async executePropertyAppend(e,t,r,i){if(!e.targetProperty)return{success:!1,error:"property_append requires targetProperty"};if(e.targetValue===void 0)return{success:!1,error:"property_append requires targetValue"};let s=await this.fileReader.readFile(r),a=this.frontmatterService.parseObject(s)??{},c=this.substituteVariables(e.targetValue,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=Vu.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=A_.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=J3.DateTimeParsing.parseYearMonthDuration(r),c=new Date(e.getTime());return c.setMonth(c.getMonth()+a),c}let s=J3.DateTimeParsing.parseDayTimeDuration(r);return new Date(e.getTime()+s)}static extractBacklinkTarget(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}};gi.GroundingExecutor=yp;yp.CREATE_INSTANCE_BLACKLIST=new Set(["exo__Asset_uid","exo__Asset_createdAt","exo__Asset_updatedAt","exo__Instance_class","exo__Asset_label","aliases","ems__Effort_status","ems__Effort_startTimestamp","ems__Effort_endTimestamp","ems__Effort_resolutionTimestamp","ems__Effort_area","exo__Asset_relates"]);gi.GroundingExecutor=yp=Vu=C9([(0,O9.injectable)(),R9("design:paramtypes",[Object,Object,gp,Function])],yp)});var tA=b(Gs=>{"use strict";var k9=Gs&&Gs.__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},j9=Gs&&Gs.__metadata||function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)},x_;Object.defineProperty(Gs,"__esModule",{value:!0});Gs.CommandExecutionFlow=void 0;var M9=Ce(),$9=lo(),V9=Ee(),B9=je(),U9=ir(),q9=Cn(),I_=x_=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=x_.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)}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!==$9.GroundingType.CREATE_INSTANCE||!t.prefillLabelWithDate||!r||!this.tripleStore)return e;let i=await this.resolveAssetLabel(r);if(!i)return e;let s=q9.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 V9.IRI(e),r=await this.tripleStore.match(t,U9.Namespace.EXO.term("Asset_label"),void 0);if(r.length===0)return;let i=r[0].object;if(i instanceof B9.Literal)return i.value.length>0?i.value:void 0}};Gs.CommandExecutionFlow=I_;Gs.CommandExecutionFlow=I_=x_=k9([(0,M9.injectable)(),j9("design:paramtypes",[Function,Object,Object,Object,Object,Object])],I_)});var Bu=b(zs=>{"use strict";var W9=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},G9=zs&&zs.__metadata||function(n,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,e)};Object.defineProperty(zs,"__esModule",{value:!0});zs.WorkflowEngine=void 0;var z9=Ce(),C_=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}}};zs.WorkflowEngine=C_;zs.WorkflowEngine=C_=W9([(0,z9.injectable)(),G9("design:paramtypes",[Object])],C_)});var rA=b(cs=>{"use strict";Object.defineProperty(cs,"__esModule",{value:!0});cs.EFFORT_WORKFLOW_PROPERTY=cs.WorkflowTransitionProperty=cs.WorkflowStateProperty=cs.WorkflowProperty=void 0;cs.WorkflowProperty={TARGET_CLASS:"ems__Workflow_targetClass",INITIAL_STATE:"ems__Workflow_initialState",TERMINAL_STATES:"ems__Workflow_terminalStates",IS_DEFAULT:"ems__Workflow_isDefault"};cs.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"};cs.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"};cs.EFFORT_WORKFLOW_PROPERTY="ems__Effort_workflow"});var Hs=b(_p=>{"use strict";Object.defineProperty(_p,"__esModule",{value:!0});_p.MetadataHelpers=void 0;var R_=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=Object.entries(e).map(([a,c])=>{if(Array.isArray(c)){let l=c.map(u=>` - ${u}`).join(`
|
|
92
92
|
`);return`${a}:
|
|
93
93
|
${l}`}return`${a}: ${c}`}).join(`
|
|
94
94
|
`),i=t;if(i===void 0){let a=e.exo__Asset_label;typeof a=="string"&&a.trim()!==""&&(i=`# ${a}`)}let s=i?`
|
|
@@ -760,7 +760,7 @@ ${r}`}o(MY,"serializeFile");function _D(n,e,t={}){let r=Mg.default.dirname(n),i=
|
|
|
760
760
|
`).map(s=>s.trim()).filter(Boolean)){let s=$Y.exec(i);if(s){r.push({sessionName:i,uuid:s[1],type:"full"});continue}let a=VY.exec(i);a&&r.push({sessionName:i,uuid:a[1],type:"short"})}return r}o(UY,"listClaudeChildSessions");function qY(n,e,t){let r=null,i=e.toLowerCase();function s(a){if(r)return;let c;try{c=(0,Vg.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,bD.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(qY,"findVaultFile");function WY(n,e){try{let i=(e??(s=>(0,Vg.readFileSync)(s,"utf8")))(n).match(/ems__Effort_status\s*:.*\[\[([^\]]+)\]\]/);return i?i[1].includes(BY):!1}catch{return!1}}o(WY,"isTaskDoing");async function wD(n,e=$g.exec,t){let r=await UY(e),i=[];for(let s of r){let a=qY(n,s.uuid,s.type);if(!a){i.push({sessionName:s.sessionName,taskUuid:s.uuid,taskFilePath:null,reason:"vault task not found"});continue}WY(a,t)||i.push({sessionName:s.sessionName,taskUuid:s.uuid,taskFilePath:a,reason:"vault task status != Doing"})}return i}o(wD,"detectOrphans");async function vD(n,e,t=$g.exec,r=_D){let i=SD(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(vD,"recoverOrphan");function GY(){return process.env.EXOCORTEX_VAULT??(0,Bg.join)((0,TD.homedir)(),"vault-2025")}o(GY,"defaultVault");function AD(){return new Ie("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",GY()).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,Bg.resolve)(n.vault);if(!(0,ED.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 wD(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 vD(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(AD,"recoverCommand");var d2=require("fs"),Ug=require("path"),Gn=le(Sr());function zY(n,e){return e.concat([n])}o(zY,"collectAlso");var HY="https://exocortex.my/ontology/find#Alias_sparql",QY="https://exocortex.my/ontology/exo#Asset_label";function Kl(n){if(n&&typeof n=="object"&&"value"in n){let e=n.value;return typeof e=="string"?e:String(e)}return String(n)}o(Kl,"nodeValue");async function KY(n,e){let t=await n.match(void 0,void 0,void 0),r=[];for(let s of t)Kl(s.predicate)!==QY||Kl(s.object)!==e||r.push(Kl(s.subject));if(r.length===0)return null;let i=[];for(let s of r)for(let a of t)Kl(a.predicate)===HY&&Kl(a.subject)===s&&i.push(Kl(a.object));if(i.length===0)return null;if(i.length>1)throw new Vt(`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(KY,"resolveAliasFragment");var YY=/^([a-z][a-zA-Z0-9]*)__([A-Za-z0-9_]+)$/,XY="https://exocortex.my/ontology/";function JY(n,e){let t=YY.exec(e);if(t){let i=`<${XY}${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(JY,"bindValueLiteral");function xD(){return new Ie("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)",zY,[]).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=>{pe.setFormat("text");try{if(n.sparql&&n.class)throw new Vt("--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 Vt("one of --sparql <query> or --class <value> is required",'exocortex find --class ems__Task OR exocortex find --sparql "SELECT ?path WHERE { ... }"');let e=(0,Ug.resolve)(n.vault);if(!(0,d2.existsSync)(e))throw new Pe(e);let t=new Lt(e),i=await new Gn.NoteToRDFConverter(t).convertVault(),s=n.also||[];for(let w of s){let T=(0,Ug.resolve)(w);if(!(0,d2.existsSync)(T))throw new Pe(T);let C=new Lt(T),V=await new Gn.NoteToRDFConverter(C).convertVault();i=i.concat(V)}let a=new Gn.InMemoryTripleStore;await a.addAll(i);let c;if(n.class){let w=await KY(a,"class");if(w===null)throw new Vt('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 { ${JY(w,n.class)} }`}else c=n.sparql;let l=Ul(c);l=Ya(l);let u=new Gn.ExoQLParser,f=Xa(Ka(e));for(let w of s){let T=Xa(Ka((0,Ug.resolve)(w)));for(let[C,M]of T)f.has(C)||f.set(C,M)}f.size>0&&u.setVaultPrefixes(f);let d=u.parse(l),p=new Gn.ExoQLAlgebraTranslator().translate(d);p.type!=="construct"&&(p=new Gn.AlgebraOptimizer().optimize(p));let S=await new Gn.ExoQLQueryExecutor(a).executeAll(p),v="obsidian://vault/";for(let w of S){let C=w.toJSON().path;if(typeof C!="string"||!C.startsWith(v))continue;let M=C.slice(v.length),V;try{V=decodeURIComponent(M)}catch{V=M}process.stdout.write(V+`
|
|
761
761
|
`)}}catch(e){pe.handle(e),process.exit(5)}})}o(xD,"findCommand");var p2=require("fs"),m2=require("path"),et=le(Sr());var PD=le(Sr()),Ut=le(CD());var RD="obsidian://vault/";function uX(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(RD))r=decodeURI(r.slice(RD.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(uX,"createCliPathResolver");var fX=["createAsset","openFile","sparqlSelect","getActiveFileIRI","getActiveFilePath","trashFile","duplicateFile"],h2=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 OD(n){return{async execute(){throw new h2(n)}}}o(OD,"notImplementedService");function FD(n,e){for(let t of fX)n.register(t,OD(t));for(let t of["updateProperty","removeProperty","setStatus"])n.register(t,OD(t));if(e){if(e.fsAdapter){let t=new PD.FrontmatterService,r=uX(e.fsAdapter);n.register("updateProperty",(0,Ut.createUpdatePropertyService)(e.fsAdapter,t,r)),n.register("removeProperty",(0,Ut.createRemovePropertyService)(e.fsAdapter,t,r)),n.register("setStatus",(0,Ut.createSetStatusService)(e.fsAdapter,t,r))}n.register("createRelatedTask",(0,Ut.createCreateRelatedTaskService)(e.vaultAdapter,e.genericAssetCreationService)),n.register("createRelatedProject",(0,Ut.createCreateRelatedProjectService)(e.vaultAdapter,e.genericAssetCreationService)),n.register("archiveAsset",(0,Ut.createArchiveAssetService)(e.vaultAdapter,e.archiveAssetService)),n.register("planForEvening",(0,Ut.createPlanForEveningService)(e.vaultAdapter,e.taskStatusService)),n.register("cleanProperties",(0,Ut.createCleanPropertiesService)(e.vaultAdapter,e.propertyCleanupService)),n.register("renameToUid",(0,Ut.createRenameToUidService)(e.vaultAdapter,e.renameToUidService)),n.register("repairFolder",(0,Ut.createRepairFolderService)(e.vaultAdapter,e.folderRepairService)),n.register("fixMissingLabel",(0,Ut.createFixMissingLabelService)(e.vaultAdapter,e.fixMissingLabelService))}}o(FD,"populateCliServiceRegistry");var dX=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;async function hX(){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(`
|
|
762
762
|
`).map(t=>t.trim()).filter(t=>t.length>0)}o(hX,"readStdinLines");function qg(n){if(n&&typeof n=="object"&&"value"in n){let e=n.value;return typeof e=="string"?e:String(e)}return String(n)}o(qg,"nodeValue");async function pX(n,e){let t=new et.IRI("https://exocortex.my/ontology/exocmd#Command_cliName"),r=await n.match(void 0,t,void 0),i=[];for(let s of r)if(qg(s.object)===e){let l=qg(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 Vt(`Ambiguous cliName "${e}" \u2014 resolves to ${i.length} commands: ${i.join(", ")}`,"Use the UUID directly: exocortex apply <uuid> <path>");return i[0]}o(pX,"resolveSlugToUuid");async function mX(n,e){let t=new et.IRI("https://exocortex.my/ontology/exocmd#Command_destructive"),r=await n.match(void 0,t,void 0);for(let i of r)if(qg(i.subject).includes(e)){let a=qg(i.object);if(a==="true"||a==="True")return!0}return!1}o(mX,"isDestructive");async function gX(n,e,t,r,i){let s=(0,m2.resolve)(n,r);if(!(0,p2.existsSync)(s))return console.error(`\u274C Target file not found: ${r}`),!1;let c=await new et.CommandResolver(e).loadCommand(t);if(!c)return console.error(`\u274C Command with UID "${t}" not found.`),!1;if(await mX(e,t)&&!i.dryRun&&!i.yes)return console.error(`\u274C Command "${c.name}" is marked destructive. Add --dry-run to preview, or --yes to apply.`),!1;let u=(0,et.vaultPathToIRI)(r);if(!await new et.PreconditionEvaluator(e).evaluate(c.precondition,u))return console.error(`\u274C Precondition not satisfied for "${c.name}" on "${r}".`),!1;if(i.dryRun)return console.log(`\u{1F50D} Dry-run: would apply "${c.name}" to "${r}" (precondition passed).`),!0;let h=new et.ServiceRegistry,p=new Lt(n),y=new et.GenericAssetCreationService(p),S=new et.ArchiveAssetService(p),v=new et.PropertyCleanupService(p),w=new et.FixMissingLabelService(p),T=new et.RenameToUidService(p),C=new et.FolderRepairService(p),M=new et.TaskStatusService(p,new et.EffortStatusWorkflow,new et.StatusTimestampService(p)),V=new hr(n);FD(h,{vaultAdapter:p,fsAdapter:V,genericAssetCreationService:y,archiveAssetService:S,taskStatusService:M,propertyCleanupService:v,fixMissingLabelService:w,renameToUidService:T,folderRepairService:C});let ee=new et.GroundingExecutor(V,V,h),U;if(i.input)try{let P=JSON.parse(i.input);if(typeof P!="object"||P===null||Array.isArray(P))throw new Error("must be a JSON object");U=P}catch(P){let N=P instanceof Error?P.message:String(P);return console.error(`\u274C --input: invalid JSON object (${N})`),!1}let W=await ee.execute(c.grounding,u,r,U);if(W.success){let P=c.successMessage??`Applied "${c.name}" to "${r}".`;return console.log(`\u2705 ${P}`),!0}else return console.error(`\u274C "${c.name}" failed on "${r}": ${W.error}`),!1}o(gX,"executeOnTarget");function DD(){return new Ie("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").action(async(n,e,t)=>{pe.setFormat("text");try{let r=(0,m2.resolve)(t.vault);if(!(0,p2.existsSync)(r))throw new Pe(r);let i=new Lt(r),a=await new et.NoteToRDFConverter(i).convertVault(),c=new et.InMemoryTripleStore;await c.addAll(a);let l;if(dX.test(n))l=n;else{let h=await pX(c,n);h||(console.error(`\u274C No command found with UUID or cliName "${n}".`),process.exit(3)),l=h}let u;if(e)u=[e];else if(u=await hX(),u.length===0)throw new Vt("No target path provided and stdin is empty.","exocortex apply <uuid> <path> OR exocortex find ... | exocortex apply <uuid>");let f=0,d=0;for(let h of u)await gX(r,c,l,h,t)?f++:d++;u.length>1&&console.log(`
|
|
763
|
-
\u{1F4CA} Applied to ${f}/${u.length} target(s) (${d} failed).`),d>0&&process.exit(5)}catch(r){pe.handle(r),process.exit(5)}})}o(DD,"applyCommand");function ND(n){let e=new Ie;return e.name("exocortex").description("CLI tool for Exocortex knowledge management system").version(n??"16.14.
|
|
763
|
+
\u{1F4CA} Applied to ${f}/${u.length} target(s) (${d} failed).`),d>0&&process.exit(5)}catch(r){pe.handle(r),process.exit(5)}})}o(DD,"applyCommand");function ND(n){let e=new Ie;return e.name("exocortex").description("CLI tool for Exocortex knowledge management system").version(n??"16.14.1"),e.addCommand(xD()),e.addCommand(DD()),e.addCommand(iF()),e.addCommand(cF()),e.addCommand(DF()),e.addCommand(fF()),e.addCommand(dF()),e.addCommand(yF()),e.addCommand(kF()),e.addCommand(WF()),e.addCommand(HF()),e.addCommand(QF()),e.addCommand(YF()),e.addCommand(oD()),e.addCommand(cD()),e.addCommand(mD()),e.addCommand(AD()),e}o(ND,"createProgram");ND().parse();0&&(module.exports={createProgram});
|
|
764
764
|
/*! Bundled license information:
|
|
765
765
|
|
|
766
766
|
reflect-metadata/Reflect.js:
|