@kelceyp/caw-server 1.0.32 → 1.0.33
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/main.js +1 -1
- package/dist/public_html/main.js +85 -85
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -531,7 +531,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
|
|
|
531
531
|
`),details:{changed:!0,lineNumber:K,checked:q}}},Q08=($,{lineNumber:K})=>{let q=$===""?[""]:$.split(`
|
|
532
532
|
`),Y=q.length;if(K<1||K>Y)throw I.validation(`Line ${K} is out of range (document has ${Y} lines)`,"LINE_OUT_OF_RANGE");let J=K-1,z=q[J],W=/^(?:[-*+] |\d+\. )\[([ xX])\] .+$/,Z=z.match(W);if(!Z)throw I.validation("Line is not a valid checklist item","NOT_CHECKLIST_ITEM");let H=Z[1]!==" ",O=!H;return q[J]=Am(z,O),{newContent:q.join(`
|
|
533
533
|
`),details:{lineNumber:K,previousStatus:H,newStatus:O}}},l08=($,{items:K})=>{if(!K||K.length===0)throw I.validation("Items array cannot be empty","EMPTY_ITEMS");let q=$,Y=[],J=[...K].sort((z,W)=>W.lineNumber-z.lineNumber);for(let z of J){let W=Mm(q,z);q=W.newContent,Y.push(W.details)}return Y.reverse(),{newContent:q,details:{items:Y,count:Y.filter((z)=>z.changed).length}}},lk=($,K)=>{switch(K.type){case"replace_first":return ph6($,K);case"replace_all":return Fh6($,K);case"replace_regex":return ch6($,K);case"replace_regex_all":return Qh6($,K);case"replace_between_markers":return lh6($,K);case"replace_lines":return ih6($,K);case"insert_at":return dh6($,K);case"replace_all_content":return{newContent:K.content,details:{message:"Replaced all content"}};case"append":return nh6($,K);default:throw Error(`Unknown operation type: ${K.type}`)}},i08=($,K,q=!1)=>{let Y=lk($,K),J={originalLength:$.length,newLength:Y.newContent.length,changeCount:Y.details.count||Y.details.linesReplaced||Y.details.linesDeleted||1},z={matches:J.changeCount,stats:J};if(!q)z.diff=bO($,Y.newContent);return z};var d08=($,K)=>{let q=G4.detectFullPathPrefix($,K);if(q.valid)return $.slice(q.prefix.length);return $},oh6=({store:$,folderService:K,documentHooks:q,includeResolver:Y,fieldService:J})=>{let z=Y,W=(P8)=>{return P8==="t"?"Template":"Document"},Z=(P8)=>{let O8=P8.getParentId();if(!O8)return!1;try{let{typeCode:f8}=a6.resolveEntityId(O8);return f8==="j"}catch{return!1}},H=async(P8,O8,f8,u8,i8,a8,z6,h8={})=>{let{createMissing:p8=!0,startingFolderId:s8}=h8,q6=a8??u8;if(f8){let X6=await K.resolvePath(P8,O8,f8,u8,i8,q6,z6,p8,s8),f6=await $.findFolderByName(P8,O8,X6.parentObjectId,X6.name);if(f6)return f6.getObjectId();else{if(!p8)throw I.notFound(`Folder not found: "${X6.name}"`,"FOLDER_NOT_FOUND");return(await $.createFolder(P8,O8,{storeCode:i8,parentId:X6.parentObjectId,name:X6.name},z6)).getObjectId()}}else{if(s8)return s8;return(await $.readRootFolderForType(P8,O8,u8,i8)).getObjectId()}},O=async(P8,O8,f8,u8)=>{let{path:i8,store:a8,content:z6,allowedRoots:h8,validPrefixes:p8,entityType:s8,subtype:q6}=f8;G4.validatePathFormat(i8);let X6=G4.detectFullPathPrefix(i8,p8);y.factory(!X6.valid,I.validation,`Path must start with one of: ${p8.map((J8)=>typeof J8==="string"?J8:J8.toString()).join(", ")}`,"INVALID_PATH_PREFIX");let f6=d08(i8,p8);y.factory(!f6||f6.length===0,I.validation,"Path cannot end at tree prefix - provide a path after the prefix","EMPTY_PATH");let M8,x8=null;if(X6.prefix==="Documents/")M8="d";else if(X6.prefix==="Templates/")M8="t";else if(X6.prefix.startsWith("Stories/")){M8="s";let J8=X6.prefix.slice(8,-1),o=(await $.listStories(P8,O8,{storeCode:a8})).find((X8)=>X8.getName()===J8);if(!o)throw I.notFound(`Story not found: ${J8}`,"STORY_NOT_FOUND");x8=o.getObjectId()}let{parentPath:B8,name:F8}=w1.parsePath(f6),l8=await H(P8,O8,B8,s8,a8,M8,u8,{startingFolderId:x8});if(M8==="s"){let J8=await $.readFolder(P8,O8,{id:l8});if(y.factory(!J8,I.notFound,"Parent folder not found","FOLDER_NOT_FOUND"),await G4.validateRootInAllowedTree(P8,O8,J8,h8,$),await G4.isInsideTasksFolder(P8,O8,J8,$))y.factory(q6!=="task",I.validation,"Only task documents can be created inside a tasks folder","INVALID_DOCUMENT_TYPE")}let Y8=W(s8),W8=await $.findContentByName(P8,O8,l8,F8,s8);return y.factory(W8,I.conflict,`${Y8} "${F8}" already exists in folder`,"DUPLICATE_NAME"),await $.createContent(P8,O8,{storeCode:a8,type:s8,parentId:l8,name:F8,initialContent:z6,subtype:q6},u8)},X=async(P8,O8,f8,u8)=>{let{root:i8,path:a8,content:z6,allowedRoots:h8,entityType:p8,subtype:s8}=f8,q6=w1.extractStoreCode(i8);G4.validatePathFormat(a8);let X6=await $.readFolder(P8,O8,{id:i8});y.factory(!X6,I.notFound,`Root folder not found: ${i8}`,"FOLDER_NOT_FOUND"),await G4.validateRootInAllowedTree(P8,O8,X6,h8,$);let{parentPath:f6,name:M8}=w1.parsePath(a8),x8;if(f6){let Y8=f6.split("/").filter((J8)=>J8.trim()),W8=X6;for(let J8 of Y8){let c8=await $.findFolderByName(P8,O8,W8.getObjectId(),J8);if(c8)W8=c8;else W8=await $.createFolder(P8,O8,{storeCode:q6,parentId:W8.getObjectId(),name:J8},u8)}x8=W8.getObjectId()}else x8=i8;let B8=await $.readFolder(P8,O8,{id:x8});if(B8&&await G4.isInsideTasksFolder(P8,O8,B8,$))y.factory(s8!=="task",I.validation,"Only task documents can be created inside a tasks folder","INVALID_DOCUMENT_TYPE");let F8=W(p8),l8=await $.findContentByName(P8,O8,x8,M8,p8);return y.factory(l8,I.conflict,`${F8} "${M8}" already exists in folder`,"DUPLICATE_NAME"),await $.createContent(P8,O8,{storeCode:q6,type:p8,parentId:x8,name:M8,initialContent:z6,subtype:s8},u8)},P=async(P8,O8,f8,u8)=>{let{parentId:i8,name:a8,content:z6,allowedRoots:h8,entityType:p8,subtype:s8}=f8,q6=w1.extractStoreCode(i8);G4.validateName(a8);let X6=await $.readFolder(P8,O8,{id:i8});if(y.factory(!X6,I.notFound,`Parent folder not found: ${i8}`,"FOLDER_NOT_FOUND"),await G4.validateRootInAllowedTree(P8,O8,X6,h8,$),await G4.isInsideTasksFolder(P8,O8,X6,$))y.factory(s8!=="task",I.validation,"Only task documents can be created inside a tasks folder","INVALID_DOCUMENT_TYPE");let f6=W(p8),M8=await $.findContentByName(P8,O8,i8,a8,p8);return y.factory(M8,I.conflict,`${f6} "${a8}" already exists in folder`,"DUPLICATE_NAME"),await $.createContent(P8,O8,{storeCode:q6,type:p8,parentId:i8,name:a8,initialContent:z6,subtype:s8},u8)},w=async(P8,O8,f8,u8)=>{let{mode:i8,path:a8,root:z6,parentId:h8,name:p8,store:s8,content:q6,type:X6,tree:f6,subtype:M8,fields:x8}=f8,B8=["d","s","tasks"],F8=G4.DOCUMENT_PREFIXES;if(M8&&J){let Y8=s8??(z6?w1.extractStoreCode(z6):null)??(h8?w1.extractStoreCode(h8):null);if(!Y8)throw I.validation("Cannot validate required fields: unable to determine store code from creation parameters","MISSING_STORE_CODE");let W8=X6??"d";await J.validateRequiredFields(P8,O8,{store:Y8,code:W8,subtype:M8,fields:x8})}let l8;if(i8==="fullPath")y.factory(!s8,I.validation,"store is required for fullPath mode","MISSING_STORE_CODE"),l8=await O(P8,O8,{path:a8,store:s8,content:q6,allowedRoots:B8,validPrefixes:F8,entityType:"d",subtype:M8},u8);else if(i8==="rootRelative")y.factory(!z6,I.validation,"root is required for rootRelative mode","MISSING_ROOT"),l8=await X(P8,O8,{root:z6,path:a8,content:q6,allowedRoots:B8,entityType:"d",subtype:M8},u8);else if(i8==="parentName")y.factory(!h8,I.validation,"parentId is required for parentName mode","MISSING_PARENT_ID"),y.factory(!p8,I.validation,"name is required for parentName mode","MISSING_NAME"),l8=await P(P8,O8,{parentId:h8,name:p8,content:q6,allowedRoots:B8,entityType:"d",subtype:M8},u8);else if(X6!==void 0){y.factory(X6!=="d"&&X6!=="t",I.validation,'type must be "d" or "t"',"INVALID_TYPE"),y.factory(!a8||a8==="/",I.validation,"Path cannot be empty","EMPTY_PATH"),y.factory(!s8,I.validation,"store is required","MISSING_STORE_CODE");let{parentPath:Y8,name:W8}=w1.parsePath(a8),J8=h8??await H(P8,O8,Y8,X6,s8,f6,u8),c8=W(X6),o=await $.findContentByName(P8,O8,J8,W8,X6);y.factory(o,I.conflict,`${c8} "${W8}" already exists in folder`,"DUPLICATE_NAME"),l8=await $.createContent(P8,O8,{storeCode:s8,type:X6,parentId:J8,name:W8,initialContent:q6,subtype:M8},u8)}else throw I.validation("Invalid creation parameters. Use one of: fullPath (path+store), rootRelative (root+path), or parentName (parentId+name)","INVALID_PARAMS");if(x8&&J&&Object.keys(x8).length>0)for(let[Y8,W8]of Object.entries(x8))await J.setFieldValue(P8,O8,{entityId:l8.getObjectId(),fieldName:Y8,...Array.isArray(W8)?{values:W8}:{value:W8}},u8);return l8},T=async(P8,O8,f8,u8)=>{let{mode:i8,path:a8,root:z6,parentId:h8,name:p8,store:s8,content:q6,subtype:X6}=f8,f6=["t"],M8=G4.TEMPLATE_PREFIXES;if(i8==="fullPath")return y.factory(!s8,I.validation,"store is required for fullPath mode","MISSING_STORE_CODE"),await O(P8,O8,{path:a8,store:s8,content:q6,allowedRoots:f6,validPrefixes:M8,entityType:"t",subtype:X6},u8);if(i8==="rootRelative")return y.factory(!z6,I.validation,"root is required for rootRelative mode","MISSING_ROOT"),await X(P8,O8,{root:z6,path:a8,content:q6,allowedRoots:f6,entityType:"t",subtype:X6},u8);if(i8==="parentName")return y.factory(!h8,I.validation,"parentId is required for parentName mode","MISSING_PARENT_ID"),y.factory(!p8,I.validation,"name is required for parentName mode","MISSING_NAME"),await P(P8,O8,{parentId:h8,name:p8,content:q6,allowedRoots:f6,entityType:"t",subtype:X6},u8);throw I.validation("Invalid creation parameters. Use one of: fullPath (path+store), rootRelative (root+path), or parentName (parentId+name)","INVALID_PARAMS")},G=async(P8,O8,{id:f8,resolveIncludes:u8=!0})=>{let{typeCode:i8}=a6.resolveEntityId(f8),a8=W(i8),z6=await $.readContent(P8,O8,{id:f8});y.factory(!z6,I.notFound,`${a8} not found: ${f8}`,"NOT_FOUND");let h8=[],p8=z6.getParentId();while(p8){h8.unshift(p8);let q6=await $.readFolder(P8,O8,{id:p8});if(!q6)break;p8=q6.getParentId()}let s8=null;if(u8&&z&&z6.getPublishedContent())s8=await z.resolve(P8,O8,z6.getPublishedContent(),z6.getObjectId());return{entity:z6,ancestorFolderIds:h8,resolvedContent:s8}},j=async(P8,O8,{path:f8,type:u8,storeCode:i8})=>{y.factory(u8!=="d"&&u8!=="t",I.validation,'type must be "d" or "t"',"INVALID_TYPE");let{parentPath:a8,name:z6}=w1.parsePath(f8),h8=[],p8;if(a8){let q6=a8.split("/").filter((f6)=>f6),X6="";for(let f6 of q6){X6=X6?`${X6}/${f6}`:f6;let M8=await $.getFolderByPath(P8,O8,{path:X6,type:u8,storeCode:i8});if(!M8)return null;h8.push(M8.getObjectId())}p8=h8[h8.length-1]}else p8=(await $.readRootFolderForType(P8,O8,u8,i8)).getObjectId();let s8=await $.findContentByName(P8,O8,p8,z6,u8);if(!s8)return null;return{entity:s8,ancestorFolderIds:h8}},v=async(P8,O8,{id:f8,path:u8,parentId:i8,type:a8},z6)=>{y.factory(a8!=="d"&&a8!=="t",I.validation,'type must be "d" or "t"',"INVALID_TYPE");let h8=u8!==void 0&&u8!==null,p8=i8!==void 0&&i8!==null;if(y.factory(h8===p8,I.validation,"Either path OR parentId must be provided, not both or neither","INVALID_PARAMS"),h8)y.factory(u8==="/",I.validation,"Path cannot be empty","EMPTY_PATH");let{entity:s8}=await G(P8,O8,{id:f8}),q6=w1.extractStoreCode(f8),X6=W(a8),f6,M8;if(p8){let F8=await $.readFolder(P8,O8,{id:i8});y.factory(!F8,I.notFound,`Parent folder not found: ${i8}`,"PARENT_NOT_FOUND"),f6=s8.getName(),M8=i8}else{let F8=a8==="t"?G4.TEMPLATE_PREFIXES:G4.DOCUMENT_PREFIXES,l8=d08(u8,F8),{parentPath:Y8,name:W8}=w1.parsePath(l8);f6=W8;let J8=w1.parsePath(s8.getPath());if(Y8===J8.parentPath)M8=s8.getParentId();else M8=await H(P8,O8,Y8,a8,q6,void 0,z6,{createMissing:!1})}let x8=f6!==s8.getName(),B8=M8!==s8.getParentId();if(!x8&&!B8)return s8;if(x8||B8){let F8=await $.findContentByName(P8,O8,M8,f6,a8);y.factory(F8&&F8.getObjectId()!==f8,I.conflict,`${X6} "${f6}" already exists in target folder`,"DUPLICATE_NAME")}return await $.updateContent(P8,O8,{id:f8,name:x8?f6:void 0,parentId:B8?M8:void 0},z6)},M=async(P8,O8,{id:f8},u8)=>{let{entity:i8}=await G(P8,O8,{id:f8}),a8=await $.deleteContent(P8,O8,{id:f8},u8),{typeCode:z6}=a6.resolveEntityId(f8);if(z6==="d"&&i8.getSubtype()==="task"&&J){let h8=i8.getParentId(),p8=await $.listContent(P8,O8,{parentId:h8,type:"d"});for(let s8 of p8){if(s8.getObjectId()===f8)continue;if(s8.getSubtype()!=="task")continue;let q6=await $.getFieldValue(P8,O8,{entityId:s8.getObjectId(),fieldName:"dependsOn"});if(!q6)continue;let X6=q6.getValues();if(!X6.includes(f8))continue;let f6=X6.filter((M8)=>M8!==f8);if(f6.length>0)await J.setFieldValue(P8,O8,{entityId:s8.getObjectId(),fieldName:"dependsOn",values:f6},u8,!0);else await J.deleteFieldValue(P8,O8,{entityId:s8.getObjectId(),fieldName:"dependsOn"},u8,!0)}}return a8},f=async(P8,O8,{id:f8,content:u8,sessionId:i8},a8)=>{let{entity:z6}=await G(P8,O8,{id:f8});return y.factory(Z(z6),I.validation,"Documents inside jobs are read-only","JOB_DOCUMENT_READ_ONLY"),await $.saveDraft(P8,O8,{id:f8,content:u8,sessionId:i8},a8)},k=async(P8,O8,{id:f8})=>{let{typeCode:u8}=a6.resolveEntityId(f8),{entity:i8}=await G(P8,O8,{id:f8}),a8=W(u8),z6=await $.readDraft(P8,O8,{id:f8});return y.factory(!z6,I.notFound,`No draft found for ${a8}: ${f8}`,"DRAFT_NOT_FOUND"),z6},N=async(P8,O8,{id:f8,sessionId:u8},i8)=>{let{entity:a8}=await G(P8,O8,{id:f8,resolveIncludes:!1}),{typeCode:z6}=a6.resolveEntityId(f8),h8=q.getHook("prePublish",z6);if(h8)await h8(P8,O8,a8,u8,i8);return await $.publishContent(P8,O8,{id:f8,sessionId:u8},i8)},R=async(P8,O8,{id:f8},u8)=>{let{entity:i8}=await G(P8,O8,{id:f8});return await $.discardDraft(P8,O8,{id:f8},u8)},E=async(P8,O8,{id:f8,versionNumber:u8})=>{let{typeCode:i8}=a6.resolveEntityId(f8),{entity:a8}=await G(P8,O8,{id:f8}),z6=W(i8),h8=await $.readVersion(P8,O8,{id:f8,versionNumber:u8});return y.factory(!h8,I.notFound,`Version ${u8} not found for ${z6}: ${f8}`,"VERSION_NOT_FOUND"),h8},C=async(P8,O8,{id:f8})=>{let{entity:u8}=await G(P8,O8,{id:f8});return await $.getVersions(P8,O8,{id:f8})},g=async(P8,O8,{id:f8,sessionId:u8},i8)=>{let{entity:a8}=await G(P8,O8,{id:f8});return await $.setEditState(P8,O8,{id:f8,sessionId:u8},i8)},S=async(P8,O8,{id:f8},u8)=>{let{entity:i8}=await G(P8,O8,{id:f8});return await $.clearEditState(P8,O8,{id:f8},u8)},D=async(P8,O8,{id:f8})=>{let{entity:u8}=await G(P8,O8,{id:f8});return await $.getEditState(P8,O8,{id:f8})},L=async(P8,O8,{parentId:f8,storeCode:u8,type:i8="d"})=>{return await $.listContent(P8,O8,{parentId:f8,storeCode:u8,type:i8})},m=async(P8,O8,{id:f8,operation:u8,preview:i8=!1,ignoreContent:a8=!1,sessionId:z6},h8)=>{let{entity:p8}=await G(P8,O8,{id:f8}),s8=p8.getDraftContent()??p8.getPublishedContent()??"";if(i8)return{preview:!0,...i08(s8,u8,a8)};let q6=lk(s8,u8);return await f(P8,O8,{id:f8,content:q6.newContent,sessionId:z6},h8),{applied:!0,details:q6.details}},c=async(P8,O8,{id:f8,operations:u8,preview:i8=!1,ignoreContent:a8=!1,sessionId:z6},h8)=>{let p8=["replace_first","replace_all","replace_regex","replace_regex_all","replace_between_markers","replace_all_content","append"];for(let x8 of u8)if(!p8.includes(x8.type))throw I.validation(`Operation type "${x8.type}" is not batchable. Only line-agnostic operations are allowed in batch mode.`,"NON_BATCHABLE_OPERATION");let{entity:s8}=await G(P8,O8,{id:f8}),q6=s8.getDraftContent()??s8.getPublishedContent()??"",X6=q6,f6=[];for(let x8 of u8){let B8=lk(X6,x8);X6=B8.newContent,f6.push(B8.details)}let M8={originalLength:q6.length,newLength:X6.length,operationsApplied:u8.length};if(i8){let x8={preview:!0,stats:M8,operationResults:f6};if(!a8)x8.diff=bO(q6,X6);return x8}return await f(P8,O8,{id:f8,content:X6,sessionId:z6},h8),{applied:u8.length,results:f6}},e=async(P8,O8,{id:f8,startLine:u8,endLine:i8,includeDraft:a8=!1})=>{let{entity:z6}=await G(P8,O8,{id:f8}),h8=a8?z6.getDraftContent()??z6.getPublishedContent()??"":z6.getPublishedContent()??"";return xO(h8,u8,i8)},_8=async(P8,O8,{id:f8,startMarker:u8,endMarker:i8,inclusive:a8=!1,includeDraft:z6=!1})=>{let{entity:h8}=await G(P8,O8,{id:f8}),p8=z6?h8.getDraftContent()??h8.getPublishedContent()??"":h8.getPublishedContent()??"";return x08(p8,u8,i8,a8)},T8=async(P8,O8,{id:f8,includeDraft:u8=!1})=>{let{entity:i8}=await G(P8,O8,{id:f8}),a8=u8?i8.getDraftContent()??i8.getPublishedContent()??"":i8.getPublishedContent()??"";return g08(a8)},d8=async(P8,O8,{id:f8,maxDepth:u8,includeDraft:i8=!1})=>{let{entity:a8}=await G(P8,O8,{id:f8}),z6=i8?a8.getDraftContent()??a8.getPublishedContent()??"":a8.getPublishedContent()??"";return vm(z6,u8)},H6=async(P8,O8,{id:f8,heading:u8,includeHeading:i8=!0,includeDraft:a8=!1})=>{let{entity:z6}=await G(P8,O8,{id:f8}),h8=a8?z6.getDraftContent()??z6.getPublishedContent()??"":z6.getPublishedContent()??"";return Vm(h8,u8,i8)},D8=async(P8,O8,{id:f8,includeDraft:u8=!1})=>{let{entity:i8}=await G(P8,O8,{id:f8}),a8=u8?i8.getDraftContent()??i8.getPublishedContent()??"":i8.getPublishedContent()??"";return b08(a8)},y8=async(P8,O8,{id:f8,section:u8,includeDraft:i8=!1})=>{let{entity:a8}=await G(P8,O8,{id:f8}),z6=i8?a8.getDraftContent()??a8.getPublishedContent()??"":a8.getPublishedContent()??"";return y08(z6,u8)},o8=(P8,O8)=>{let f8=P8.split(`
|
|
534
|
-
`),i8=f8[O8-1].match(/^(?:[-*+] |\d+\. )\[([ xX])\] (.+)$/),a8=0,z6=/^(?:[-*+] |\d+\. )\[([ xX])\] .+$/;for(let h8=0;h8<O8;h8++)if(z6.test(f8[h8]))a8++;return{text:i8[2],checked:i8[1]!==" ",lineNumber:O8,itemNumber:a8}};return Object.freeze({createDocument:w,createTemplate:T,readDocument:G,readDocumentByPath:j,updateDocumentPath:v,deleteDocument:M,saveDraft:f,readDraft:k,publishDocument:N,discardDraft:R,readVersion:E,getVersions:C,setEditState:g,clearEditState:S,getEditState:D,listDocuments:L,editDocument:m,batchEditDocument:c,readLines:e,readBetweenMarkers:_8,getDocumentStats:T8,readHeadings:d8,readSection:H6,readFrontmatter:D8,readChecklist:y8,checkChecklistItem:async(P8,O8,{id:f8,lineNumber:u8,checked:i8,includeDraft:a8=!1,preview:z6=!1,sessionId:h8},p8)=>{let{entity:s8}=await G(P8,O8,{id:f8}),q6=a8?s8.getDraftContent()??s8.getPublishedContent()??"":s8.getPublishedContent()??"",X6=Mm(q6,{lineNumber:u8,checked:i8});if(z6)return{preview:!0,diff:bO(q6,X6.newContent),item:o8(X6.newContent,u8)};return await f(P8,O8,{id:f8,content:X6.newContent,sessionId:h8},p8),{applied:!0,item:o8(X6.newContent,u8)}},toggleChecklistItem:async(P8,O8,{id:f8,lineNumber:u8,includeDraft:i8=!1,preview:a8=!1,sessionId:z6},h8)=>{let{entity:p8}=await G(P8,O8,{id:f8}),s8=i8?p8.getDraftContent()??p8.getPublishedContent()??"":p8.getPublishedContent()??"",q6=Q08(s8,{lineNumber:u8});if(a8)return{preview:!0,diff:bO(s8,q6.newContent),item:o8(q6.newContent,u8)};return await f(P8,O8,{id:f8,content:q6.newContent,sessionId:z6},h8),{applied:!0,item:o8(q6.newContent,u8)}},batchCheckChecklistItems:async(P8,O8,{id:f8,items:u8,includeDraft:i8=!1,preview:a8=!1,sessionId:z6},h8)=>{let{entity:p8}=await G(P8,O8,{id:f8}),s8=i8?p8.getDraftContent()??p8.getPublishedContent()??"":p8.getPublishedContent()??"",q6=l08(s8,{items:u8}),X6=u8.map((f6)=>o8(q6.newContent,f6.lineNumber));if(a8)return{preview:!0,diff:bO(s8,q6.newContent),items:X6,count:q6.details.count};return await f(P8,O8,{id:f8,content:q6.newContent,sessionId:z6},h8),{applied:!0,items:X6,count:q6.details.count}},specialiseDocument:async(P8,O8,{id:f8,subtype:u8,fields:i8},a8)=>{let{entity:z6}=await G(P8,O8,{id:f8});y.factory(z6.getSubtype()!==null,I.validation,`Entity is already specialised to subtype: ${z6.getSubtype()}`,"ALREADY_SPECIALISED");let{storeCode:h8,typeCode:p8}=a6.resolveEntityId(f8),s8=(await Promise.resolve().then(() => (Yk(),PP8))).default;try{await s8.readEntityTypeId(P8,O8,p8,u8)}catch(f6){throw I.validation(`Invalid subtype: ${u8}`,"INVALID_SUBTYPE")}await J.validateRequiredFields(P8,O8,{store:h8,code:p8,subtype:u8,fields:i8});let q6=await $.updateEntityType(P8,O8,{id:f8,subtype:u8},a8);if(i8&&Object.keys(i8).length>0)for(let[f6,M8]of Object.entries(i8))await J.setFieldValue(P8,O8,{entityId:f8,fieldName:f6,...Array.isArray(M8)?{values:M8}:{value:M8}},a8);let{entity:X6}=await G(P8,O8,{id:f8});return{entity:X6}},generaliseDocument:async(P8,O8,{id:f8},u8)=>{let{entity:i8}=await G(P8,O8,{id:f8}),a8=i8.getSubtype();y.factory(a8===null,I.validation,"Entity is already generic (has no subtype)","ALREADY_GENERIC");let z6=await $.readFolder(P8,O8,{id:i8.getParentId()});if(z6&&await G4.isInsideTasksFolder(P8,O8,z6,$))throw I.validation("Cannot generalise entity inside a tasks folder","INVALID_LOCATION");let{typeCode:h8}=a6.resolveEntityId(f8),p8=await $.getFieldDefinitionsForEntityType(P8,O8,{storeCode:"B",code:h8,subtype:a8}),s8=i8.getFields();for(let X6 of p8){let f6=X6.getName();if(s8&&s8[f6])await J.deleteFieldValue(P8,O8,{entityId:f8,fieldName:f6},u8)}await $.updateEntityType(P8,O8,{id:f8,subtype:null},u8);let{entity:q6}=await G(P8,O8,{id:f8});return{entity:q6}},setIncludeResolver:(P8)=>{z=P8}})},n08=Object.freeze({create:oh6});var ah6=()=>{let $=null,K=null,q={prePublish:{d:async(z,W,Z,H,O)=>{if(!$)return;let X=Z.getDraftContent();if(!X)return;let{content:P,pinned:w}=await $.pinIncludes(z,W,X,Z.getObjectId());if(w.length>0)await K.saveDraft(z,W,{id:Z.getObjectId(),content:P,sessionId:H},O)},t:null},postPublish:{},preDelete:{},postCreate:{}};return Object.freeze({getHook:(z,W)=>{return q[z]?.[W]||null},setIncludeResolver:(z,W)=>{$=z,K=W}})},o08=Object.freeze({create:ah6});Z4();var a08=o6(I4(),1),UJ=a08.default("caw:includes"),rh6=({store:$,documentService:K})=>{let q=/<include\s+(?:id="([^"]+)"|path="([^"]+)")(?:\s+version="(\d+)")?\s*\/>/g,Y=(X)=>{let P=X;return P=P.replace(/```[\s\S]*?```/g,(w)=>" ".repeat(w.length)),P=P.replace(/~~~[\s\S]*?~~~/g,(w)=>" ".repeat(w.length)),P=P.replace(/``[^`]+``/g,(w)=>" ".repeat(w.length)),P=P.replace(/`[^`]+`/g,(w)=>" ".repeat(w.length)),P},J=(X)=>{let P=Y(X),w=[],T,G=new RegExp(q.source,"g");while((T=G.exec(P))!==null){let j=X.substring(T.index,T.index+T[0].length),v=new RegExp(q.source).exec(j);if(v)w.push({fullMatch:j,id:v[1],path:v[2],versionStr:v[3],index:T.index})}return w},z=5,W=async(X,P,w,T,G=new Set,j=0)=>{if(UJ("Resolving includes in document, depth=%d, chain=%s, sourceDocId=%s",j,[...G].join(","),T),j>5)throw I.validation("Include depth limit exceeded (max 5 levels)","INCLUDE_DEPTH_EXCEEDED");if(T)G=new Set(G).add(T);let v=J(w);if(UJ("Found %d include directives",v.length),v.length===0)return w;let M=w;for(let f of v){let{fullMatch:k,id:N,path:R,versionStr:E}=f,C=E?parseInt(E,10):null;UJ("Resolving include: id=%s, path=%s, version=%s",N,R,E);try{let g;if(N)g=N;else{let L=T?T.charAt(0):"A",m=await K.readDocumentByPath(X,P,{path:R,type:"d",storeCode:L});if(!m)throw I.notFound(`Included document not found: ${R}`,"INCLUDE_NOT_FOUND");g=m.entity.getObjectId()}if(G.has(g)){let L=[...G,g].join(" -> ");throw I.validation(`Circular include detected: ${L}`,"INCLUDE_CYCLE")}if(C===null)throw I.validation(`Unpinned include found: ${k}. Includes must specify a version.`,"INCLUDE_UNPINNED");let S=await $.readVersion(X,P,{id:g,versionNumber:C});if(!S)throw I.notFound(`Version ${C} not found for included document: ${g}`,"INCLUDE_VERSION_NOT_FOUND");let D=await W(X,P,S.content,g,G,j+1);M=M.replace(k,D)}catch(g){let S=N||R,D=`> **Include Error** - couldn't include ${S}${C?` version ${C}`:""}: ${g.message}`;UJ("Include resolution failed for %s: %s",S,g.message),M=M.replace(k,D)}}return M};return Object.freeze({resolve:W,pinIncludes:async(X,P,w,T)=>{UJ("Auto-pinning unpinned includes in document: %s",T);let G=J(w),j=[],v=w;for(let M of G){let{fullMatch:f,id:k,path:N,versionStr:R}=M;if(R)continue;UJ("Pinning unpinned include: id=%s, path=%s",k,N);let E,C;if(k){E=k;let{entity:S}=await K.readDocument(X,P,{id:k,resolveIncludes:!1});C=S.getPublishedVersionNumber()}else{let S=T?T.charAt(0):"A",D=await K.readDocumentByPath(X,P,{path:N,type:"d",storeCode:S});if(!D)throw I.notFound(`Included document not found: ${N}`,"INCLUDE_NOT_FOUND");E=D.entity.getObjectId(),C=D.entity.getPublishedVersionNumber()}if(!C)throw I.validation(`Cannot pin include - document has no published version: ${E}`,"INCLUDE_NO_VERSION");let g=k?`<include id="${k}" version="${C}" />`:`<include path="${N}" version="${C}" />`;UJ("Pinned include %s to version %d",E,C),v=v.replace(f,g),j.push({id:E,path:N,version:C})}return UJ("Auto-pinned %d unpinned includes",j.length),{content:v,pinned:j}},checkIncludes:async(X,P,w,T)=>{let G=J(w),j=[];for(let v of G){let{id:M,path:f,versionStr:k}=v,N=k?parseInt(k,10):null,R,E;if(M){R=M;let{entity:C}=await K.readDocument(X,P,{id:M,resolveIncludes:!1});E=C.getPublishedVersionNumber()}else{let C=T?T.charAt(0):"A",g=await K.readDocumentByPath(X,P,{path:f,type:"d",storeCode:C});R=g?.entity?.getObjectId(),E=g?.entity?.getPublishedVersionNumber()}j.push({id:R,path:f||null,pinnedVersion:N,latestVersion:E,outdated:N!==null&&E!==null&&N<E})}return j},updateIncludes:async(X,P,w,T)=>{let G=J(w),j=[],v=w;for(let M of G){let{fullMatch:f,id:k,path:N,versionStr:R}=M,E=R?parseInt(R,10):null,C,g;if(k){C=k;let{entity:S}=await K.readDocument(X,P,{id:k,resolveIncludes:!1});g=S.getPublishedVersionNumber()}else{let S=T?T.charAt(0):"A",D=await K.readDocumentByPath(X,P,{path:N,type:"d",storeCode:S});C=D?.entity?.getObjectId(),g=D?.entity?.getPublishedVersionNumber()}if(g&&E!==g){let S=k?`<include id="${k}" version="${g}" />`:`<include path="${N}" version="${g}" />`;v=v.replace(f,S),j.push({id:C,path:N||null,fromVersion:E,toVersion:g})}}return{content:v,updated:j}}})},r08=Object.freeze({create:rh6});Z4();var qA8=o6(Gm(),1),YA8=o6(HB(),1),JA8=($)=>{if(!$)return{parameters:{},target:null,targetPath:null,targetParentId:null,targetName:null,targetRoot:null,targetStore:null,targetJobName:null,targetJobAgent:null,targetJobModel:null,targetJobWorktree:null,targetJobSkipDialog:!1,targetJobStreaming:!1,skipDialog:!1,body:""};let K=qA8.default($),q=K.data?.parameters||{},Y=K.data?.target||null,J=K.data?.targetPath||null,z=K.data?.targetParentId||null,W=K.data?.targetName||null,Z=K.data?.targetRoot||null,H=K.data?.targetStore||null,O=K.data?.targetJobName||null,X=K.data?.targetJobAgent||null,P=K.data?.targetJobModel||null,w=K.data?.targetJobWorktree||null,T=K.data?.targetJobSkipDialog??!1,G=K.data?.targetJobStreaming??!1,j=K.data?.skipDialog??!1,v=K.content;return{parameters:q,target:Y,targetPath:J,targetParentId:z,targetName:W,targetRoot:Z,targetStore:H,targetJobName:O,targetJobAgent:X,targetJobModel:P,targetJobWorktree:w,targetJobSkipDialog:T,targetJobStreaming:G,skipDialog:j,body:v}},yg6=($)=>{if(!$)return new Set;let K=new Set,q=new Set(["if","unless","each","with","lookup","log"]);try{let Y=YA8.default.parse($),J=(z,W=null,Z=null)=>{if(!z)return;if(z.type==="PathExpression"){if(z.data)return;let H=z.parts.join(".");if(!H||H.startsWith("@"))return;if(W?.type==="BlockStatement"&&Z==="path"||W?.type==="MustacheStatement"&&Z==="path"&&W.params?.length>0){if(q.has(H))return;return}K.add(H)}if(z.program)J(z.program,z,"program");if(z.inverse)J(z.inverse,z,"inverse");if(z.body)z.body.forEach((H)=>J(H,z,"body"));if(z.params)z.params.forEach((H)=>J(H,z,"params"));if(z.hash?.pairs)z.hash.pairs.forEach((H)=>J(H.value,z,"hash"));if(z.path)J(z.path,z,"path")};J(Y)}catch(Y){throw Error(`Invalid Handlebars template: ${Y.message}`)}return K},ug6=($)=>{if(!$)return{parameters:{},target:null,targetPath:null,targetParentId:null,targetName:null,targetRoot:null,targetStore:null,targetJobName:null,targetJobAgent:null,targetJobModel:null,targetJobWorktree:null,targetJobSkipDialog:!1,targetJobStreaming:!1,skipDialog:!1};let{parameters:K,target:q,targetPath:Y,targetParentId:J,targetName:z,targetRoot:W,targetStore:Z,targetJobName:H,targetJobAgent:O,targetJobModel:X,targetJobWorktree:P,targetJobSkipDialog:w,targetJobStreaming:T,skipDialog:G}=JA8($);return{parameters:K,target:q,targetPath:Y,targetParentId:J,targetName:z,targetRoot:W,targetStore:Z,targetJobName:H,targetJobAgent:O,targetJobModel:X,targetJobWorktree:P,targetJobSkipDialog:w,targetJobStreaming:T,skipDialog:G}},FK=Object.freeze({parseFrontMatter:JA8,extractVariables:yg6,getParameters:ug6});var OB=o6(HB(),1),mg6=($={})=>{return Object.freeze({renderTemplate:(Y,J={})=>{if(!Y)throw I.validation("Template content cannot be empty","EMPTY_TEMPLATE");let{body:z}=FK.parseFrontMatter(Y),W;try{W=OB.default.compile(z,{noEscape:!0})(J)}catch(Z){throw I.validation(`Failed to render template: ${Z.message}`,"RENDER_ERROR")}return W},extractTemplateParameters:(Y)=>{if(!Y)return{parameters:{},detectedVariables:[],target:null,targetPath:null,targetParentId:null,targetName:null,targetRoot:null,targetStore:null,targetJobName:null,targetJobAgent:null,targetJobModel:null,targetJobWorktree:null,targetJobSkipDialog:!1,targetJobStreaming:!1};let{parameters:J,target:z,targetPath:W,targetParentId:Z,targetName:H,targetRoot:O,targetStore:X,targetJobName:P,targetJobAgent:w,targetJobModel:T,targetJobWorktree:G,targetJobSkipDialog:j,targetJobStreaming:v,body:M}=FK.parseFrontMatter(Y),f=FK.extractVariables(M),k=Array.from(f);return{parameters:J,detectedVariables:k,target:z,targetPath:W,targetParentId:Z,targetName:H,targetRoot:O,targetStore:X,targetJobName:P,targetJobAgent:w,targetJobModel:T,targetJobWorktree:G,targetJobSkipDialog:j,targetJobStreaming:v}}})},zA8=Object.freeze({create:mg6});import _j from"node:fs";import WA8 from"node:os";import Yf from"node:path";var Bg6=({projectStore:$,storeStore:K})=>{return Object.freeze({createProject:async(z,W,{name:Z,path:H},O)=>{if(await $.readProjectByPath(z,W,H)){let g=Error("Project with this path already exists");throw g.code="DUPLICATE_PATH",g}let P=await $.createProject(z,W,{name:Z,path:H},O),w=await K.createLocalStore(z,W,{code:"A",name:"Project"},O);await w.createFolder(z,W,{parentId:null,name:"Documents",subtype:"root_d"},O),await w.createFolder(z,W,{parentId:null,name:"Templates",subtype:"root_t"},O),await w.createFolder(z,W,{parentId:null,name:"Stories",subtype:"root_s"},O),await w.createFolder(z,W,{parentId:null,name:"Jobs",subtype:"root_j"},O),await w.createFieldDefinition(z,W,{storeCode:"A",ownerEntityId:null,name:"state",label:"State",description:"Workflow state",primitiveType:"string",required:!1,multiplicity:"single",isSystem:!0},O);let T=await w.resolveEntityTypePk(z,W,{code:"f",subtype:"root_s"}),G=await w.createFieldDefinition(z,W,{storeCode:"A",ownerEntityId:null,ownerEntityTypePk:T,name:"states",label:"States",description:"Ordered list of valid story states",primitiveType:"string",required:!0,multiplicity:"multi",isSystem:!0},O),v=(await w.readStoryRootFolder(z,W,{storeCode:"A"})).getObjectId();await w.setFieldValue(z,W,{entityId:v,fieldDefinitionId:G.getObjectId(),values:[...vM]},O);let M=await w.resolveEntityTypePk(z,W,{code:"d",subtype:"task"});await w.createFieldDefinition(z,W,{storeCode:"A",ownerEntityId:null,ownerEntityTypePk:M,name:"dependsOn",label:"Depends On",description:"Tasks that block this task",primitiveType:"object_ref",required:!1,multiplicity:"multi",isSystem:!0},O);let f=await w.resolveEntityTypePk(z,W,{code:"d",subtype:"cartridge"});await w.createFieldDefinition(z,W,{storeCode:"A",ownerEntityId:null,ownerEntityTypePk:f,name:"synopsis",label:"Synopsis",description:"Brief description of the cartridge",primitiveType:"string",required:!1,multiplicity:"single",isSystem:!0},O),await w.createFieldDefinition(z,W,{storeCode:"A",ownerEntityId:null,ownerEntityTypePk:f,name:"relatedActivities",label:"Related Activities",description:"Associated activity types",primitiveType:"string",required:!1,multiplicity:"multi",isSystem:!0},O);let k=await w.resolveEntityTypePk(z,W,{code:"f",subtype:"tasks"});await w.createFieldDefinition(z,W,{storeCode:"A",ownerEntityId:null,ownerEntityTypePk:k,name:"states",label:"States",description:"Ordered list of valid task states",primitiveType:"string",required:!0,multiplicity:"multi",isSystem:!0},O);let N=await w.resolveEntityTypePk(z,W,{code:"t",subtype:"prompt"});await w.createFieldDefinition(z,W,{storeCode:"A",ownerEntityId:null,ownerEntityTypePk:N,name:"associatedType",label:"Associated Type",description:"Entity types this template is associated with",primitiveType:"string",required:!1,multiplicity:"multi",isSystem:!0},O);let R=await w.resolveEntityTypePk(z,W,{code:"s",subtype:null});await w.createFieldDefinition(z,W,{storeCode:"A",ownerEntityId:null,ownerEntityTypePk:R,name:"flag",label:"Flag",description:"Visual indicator for story attention",primitiveType:"string",required:!1,multiplicity:"single",isSystem:!0},O),await w.createFieldDefinition(z,W,{storeCode:"A",ownerEntityId:null,ownerEntityTypePk:R,name:"activeJobCount",label:"Active Job Count",description:"Number of active jobs associated with this story",primitiveType:"int",required:!1,multiplicity:"single",isSystem:!0},O),await w.createFieldDefinition(z,W,{storeCode:"A",ownerEntityId:null,ownerEntityTypePk:R,name:"statusMessage",label:"Status Message",description:"Agent status message displayed in stories list",primitiveType:"string",required:!1,multiplicity:"single",isSystem:!0},O);let E=await K.readSharedStore(z,W),C=await K.createDemuxStore(z,W,{name:Z},O);return await K.addChildToDemux(z,W,{demuxId:C.getObjectId(),childId:w.getObjectId()},O),await K.addChildToDemux(z,W,{demuxId:C.getObjectId(),childId:E.getObjectId()},O),await K.addStoresToProject(z,W,{projectId:P.getObjectId(),rootStoreId:C.getObjectId(),storeIds:[C.getObjectId(),w.getObjectId(),E.getObjectId()]}),P},validateProjectPath:(z)=>{if(!z||typeof z!=="string"){let w=Error("Path is required and must be a non-empty string");throw w.code="VALIDATION_ERROR",w}let W;if(z==="~")W=WA8.homedir();else if(z.startsWith("~/"))W=Yf.join(WA8.homedir(),z.slice(2));else W=z;let Z=_j.existsSync(W),H=!1,O=!1,X=!1;if(Z)try{if(H=_j.statSync(W).isDirectory(),H){let T=Yf.join(W,".git");try{O=_j.statSync(T).isDirectory()}catch{O=!1}let G=Yf.join(W,".claude");try{X=_j.statSync(G).isDirectory()}catch{X=!1}}}catch(w){H=!1}let P=Yf.basename(W);return{path:W,exists:Z,isDirectory:H,hasGit:O,hasClaude:X,suggestedName:P}},listProjects:async(z)=>{let W=await z.selectFrom("projects").selectAll().where("name","!=","__system__").orderBy("created_at","desc").execute();return await Promise.all(W.map(async(H)=>{let X=(await z.selectFrom("project_stores").innerJoin("stores","stores.id","project_stores.store_id").select(["stores.object_id","stores.code","stores.name","stores.type"]).where("project_stores.project_id","=",H.id).where("stores.type","=","local").execute()).map((P)=>({id:P.code==="B"?"store:B":`store:${P.code}:${H.object_id}`,code:P.code,name:P.name}));return{objectId:H.object_id,name:H.name,path:H.path,createdAt:H.created_at,updatedAt:H.updated_at,children:X}}))}})},Jf=Object.freeze({create:Bg6});var Ug6=()=>{let $=[];return{enqueuePostCommitHook:(K)=>{$.push(K)},flush:()=>{for(let K of $)try{K()}catch(q){console.error("Post-commit hook failed:",q)}}}},pg6=({db:$,folderService:K,fieldService:q,documentService:Y,templateService:J,projectService:z,clipboardService:W,storyService:Z,assetService:H,jobService:O,includeResolver:X,worktreeService:P})=>{let w=async(M8)=>{let x8=Ug6(),B8;return await $.transaction().execute(async(F8)=>{B8=await M8(F8,x8.enqueuePostCommitHook)}),x8.flush(),B8};return Object.freeze({createFolder:async(M8,{mode:x8,store:B8,path:F8,root:l8,parentId:Y8,name:W8,type:J8})=>{return w(async(c8,o)=>{return await K.createFolder(c8,M8,{mode:x8,store:B8,path:F8,root:l8,parentId:Y8,name:W8,type:J8},o)})},renameFolder:async(M8,{id:x8,name:B8})=>{return w(async(F8,l8)=>{return await K.renameFolder(F8,M8,{id:x8,name:B8},l8)})},moveFolder:async(M8,{id:x8,parentId:B8})=>{return w(async(F8,l8)=>{return await K.moveFolder(F8,M8,{id:x8,parentId:B8},l8)})},deleteFolder:async(M8,{id:x8})=>{return w(async(B8,F8)=>{return await K.deleteFolder(B8,M8,{id:x8},F8)})},createProject:async(M8,{name:x8,path:B8})=>{return w(async(F8,l8)=>{return await z.createProject(F8,M8,{name:x8,path:B8},l8)})},createFieldDefinition:async(M8,{store:x8,ownerEntityId:B8,ownerEntityTypeCode:F8,ownerEntityTypeSubtype:l8,name:Y8,label:W8,description:J8,primitiveType:c8,required:o,multiplicity:X8,isSystem:t})=>{return w(async(G8,z8)=>{return await q.createFieldDefinition(G8,M8,{store:x8,ownerEntityId:B8,ownerEntityTypeCode:F8,ownerEntityTypeSubtype:l8,name:Y8,label:W8,description:J8,primitiveType:c8,required:o,multiplicity:X8,isSystem:t},z8)})},setFieldValue:async(M8,{entityId:x8,fieldDefinitionId:B8,fieldName:F8,value:l8,values:Y8})=>{return w(async(W8,J8)=>{return await q.setFieldValue(W8,M8,{entityId:x8,fieldDefinitionId:B8,fieldName:F8,value:l8,values:Y8},J8)})},deleteFieldValue:async(M8,{entityId:x8,fieldDefinitionId:B8,fieldName:F8})=>{return w(async(l8,Y8)=>{return await q.deleteFieldValue(l8,M8,{entityId:x8,fieldDefinitionId:B8,fieldName:F8},Y8)})},deleteFieldDefinition:async(M8,{id:x8})=>{return w(async(B8,F8)=>{return await q.deleteFieldDefinition(B8,M8,{id:x8},F8)})},createDocument:async(M8,{mode:x8,store:B8,path:F8,root:l8,parentId:Y8,name:W8,type:J8,content:c8,tree:o,subtype:X8,fields:t})=>{return w(async(G8,z8)=>{return await Y.createDocument(G8,M8,{mode:x8,store:B8,path:F8,root:l8,parentId:Y8,name:W8,type:J8,content:c8,tree:o,subtype:X8,fields:t},z8)})},createTemplate:async(M8,{mode:x8,store:B8,path:F8,root:l8,parentId:Y8,name:W8,content:J8,subtype:c8})=>{return w(async(o,X8)=>{return await Y.createTemplate(o,M8,{mode:x8,store:B8,path:F8,root:l8,parentId:Y8,name:W8,content:J8,subtype:c8},X8)})},updateDocumentPath:async(M8,{id:x8,path:B8,parentId:F8,type:l8})=>{return w(async(Y8,W8)=>{return await Y.updateDocumentPath(Y8,M8,{id:x8,path:B8,parentId:F8,type:l8},W8)})},deleteDocument:async(M8,{id:x8})=>{return w(async(B8,F8)=>{return await Y.deleteDocument(B8,M8,{id:x8},F8)})},saveDraft:async(M8,{id:x8,content:B8,sessionId:F8})=>{return w(async(l8,Y8)=>{return await Y.saveDraft(l8,M8,{id:x8,content:B8,sessionId:F8},Y8)})},publishDocument:async(M8,{id:x8,sessionId:B8})=>{return w(async(F8,l8)=>{return await Y.publishDocument(F8,M8,{id:x8,sessionId:B8},l8)})},discardDraft:async(M8,{id:x8})=>{return w(async(B8,F8)=>{return await Y.discardDraft(B8,M8,{id:x8},F8)})},setEditState:async(M8,{id:x8,sessionId:B8})=>{return w(async(F8,l8)=>{return await Y.setEditState(F8,M8,{id:x8,sessionId:B8},l8)})},clearEditState:async(M8,{id:x8})=>{return w(async(B8,F8)=>{return await Y.clearEditState(B8,M8,{id:x8},F8)})},editDocument:async(M8,{id:x8,operation:B8,preview:F8,ignoreContent:l8,sessionId:Y8})=>{return w(async(W8,J8)=>{return await Y.editDocument(W8,M8,{id:x8,operation:B8,preview:F8,ignoreContent:l8,sessionId:Y8},J8)})},batchEditDocument:async(M8,{id:x8,operations:B8,preview:F8,ignoreContent:l8,sessionId:Y8})=>{return w(async(W8,J8)=>{return await Y.batchEditDocument(W8,M8,{id:x8,operations:B8,preview:F8,ignoreContent:l8,sessionId:Y8},J8)})},checkChecklistItem:async(M8,{id:x8,lineNumber:B8,checked:F8,includeDraft:l8,preview:Y8,sessionId:W8})=>{return w(async(J8,c8)=>{return await Y.checkChecklistItem(J8,M8,{id:x8,lineNumber:B8,checked:F8,includeDraft:l8,preview:Y8,sessionId:W8},c8)})},toggleChecklistItem:async(M8,{id:x8,lineNumber:B8,includeDraft:F8,preview:l8,sessionId:Y8})=>{return w(async(W8,J8)=>{return await Y.toggleChecklistItem(W8,M8,{id:x8,lineNumber:B8,includeDraft:F8,preview:l8,sessionId:Y8},J8)})},batchCheckChecklistItems:async(M8,{id:x8,items:B8,includeDraft:F8,preview:l8,sessionId:Y8})=>{return w(async(W8,J8)=>{return await Y.batchCheckChecklistItems(W8,M8,{id:x8,items:B8,includeDraft:F8,preview:l8,sessionId:Y8},J8)})},specialiseDocument:async(M8,{id:x8,subtype:B8,fields:F8})=>{return w(async(l8,Y8)=>{return await Y.specialiseDocument(l8,M8,{id:x8,subtype:B8,fields:F8},Y8)})},generaliseDocument:async(M8,{id:x8})=>{return w(async(B8,F8)=>{return await Y.generaliseDocument(B8,M8,{id:x8},F8)})},renderTemplate:async(M8,{id:x8,params:B8,target:F8,targetOptions:l8,sessionId:Y8})=>{let{entity:W8}=await Y.readDocument($,M8,{id:x8,resolveIncludes:!1});if(!W8.getPublishedContent())throw(await Promise.resolve().then(() => (Z4(),vO))).default.validation("Template has no published content","NO_PUBLISHED_CONTENT");let J8=W8.getPublishedContent(),{target:c8,targetPath:o,targetParentId:X8,targetName:t,targetRoot:G8,targetStore:z8,targetJobName:k8,targetJobAgent:b8,targetJobModel:Q8,targetJobWorktree:l6,targetJobStreaming:D4}=J.extractTemplateParameters(J8),K3=F8||c8||"stdout",B1=l8?.parentId||l8?.root||l8?.path?{path:l8?.path,parentId:l8?.parentId,name:l8?.name,root:l8?.root,store:l8?.store,publish:l8?.publish}:{path:l8?.path||o,parentId:l8?.parentId||X8,name:l8?.name||t,root:l8?.root||G8,store:l8?.store||z8,publish:l8?.publish},L$=J8;if(X)L$=await X.resolve($,M8,J8,x8);let f$=J.renderTemplate(L$,B8||{});if(B1.path)B1.path=J.renderTemplate(B1.path,B8||{});if(B1.name)B1.name=J.renderTemplate(B1.name,B8||{});switch(K3){case"stdout":return{content:f$,target:"stdout"};case"clipboard":return await W.copyToClipboard(f$),{target:"clipboard",message:"Copied to clipboard"};case"document":return w(async(C8,$8)=>{let E8=(await Promise.resolve().then(() => (Z4(),vO))).default,L8;if(B1.parentId){if(!B1.name)throw E8.validation("targetOptions.name is required when parentId is provided","MISSING_TARGET_NAME");L8={mode:"parentName",parentId:B1.parentId,name:B1.name,content:f$}}else if(B1.root){if(!B1.path)throw E8.validation("targetOptions.path is required when root is provided","MISSING_TARGET_PATH");L8={mode:"rootRelative",root:B1.root,path:B1.path,content:f$}}else{if(!B1.path)throw E8.validation("targetOptions.path is required for document target","MISSING_TARGET_PATH");L8={mode:"fullPath",store:B1.store||"A",path:B1.path,content:f$}}let m8=await Y.createDocument(C8,M8,L8,$8);if(B1.publish)await Y.publishDocument(C8,M8,{id:m8.getObjectId(),sessionId:Y8},$8);return{content:f$,target:"document",documentId:m8.getObjectId(),documentPath:B1.path||B1.name,published:!!B1.publish}});case"job":return w(async(C8,$8)=>{let E8=(await Promise.resolve().then(() => (Z4(),vO))).default;if(!f$||!f$.trim())throw E8.validation("Template rendered to empty prompt","MISSING_PROMPT");let L8=l8?.jobName||k8,m8=l8?.jobAgent||b8||"claude",_6=l8?.jobModel||Q8,x=l8?.jobWorktree||l6,w8=l8?.jobStreaming??D4,u=l8?.objectId,s=null;if(L8)s=J.renderTemplate(L8,B8||{});let Q=null;if(x&&P){let{worktrees:d}=await P.listWorktrees({projectPath:M8.projectPath}),H8=d.find((v8)=>v8.branch===x);if(!H8)throw E8.validation(`Worktree with branch '${x}' not found`,"WORKTREE_NOT_FOUND");Q=H8.path}let a=w1.extractStoreCode(x8),n=await O.createJob(C8,M8,{store:a,name:s,agent:m8,model:_6,prompt:f$,workingDirectory:Q,objectId:u,streaming:w8},$8);return{target:"job",jobId:n.id,jobName:n.name}});case"file":throw(await Promise.resolve().then(() => (Z4(),vO))).default.validation("file target not yet implemented","NOT_IMPLEMENTED");default:throw(await Promise.resolve().then(() => (Z4(),vO))).default.validation(`Unknown target: ${K3}`,"INVALID_TARGET")}},createStory:async(M8,{name:x8,storeCode:B8,state:F8})=>{return w(async(l8,Y8)=>{return await Z.createStory(l8,M8,{store:B8,name:x8,state:F8},Y8)})},renameStory:async(M8,{id:x8,name:B8})=>{return w(async(F8,l8)=>{return await Z.renameStory(F8,M8,{id:x8,name:B8},l8)})},updateStoryState:async(M8,{id:x8,state:B8})=>{return w(async(F8,l8)=>{return await Z.updateStoryState(F8,M8,{id:x8,state:B8},l8)})},deleteStory:async(M8,{id:x8})=>{return w(async(B8,F8)=>{return await Z.deleteStory(B8,M8,{id:x8},F8)})},incrementStoryJobCount:async(M8,{id:x8})=>{return w(async(B8,F8)=>{return await Z.incrementActiveJobCount(B8,M8,{id:x8},F8)})},decrementStoryJobCount:async(M8,{id:x8})=>{return w(async(B8,F8)=>{return await Z.decrementActiveJobCount(B8,M8,{id:x8},F8)})},createAsset:async(M8,{store:x8,buffer:B8,mimeType:F8,originalFilename:l8,widthPx:Y8,heightPx:W8,displayWidth:J8,displayHeight:c8})=>{return w(async(o,X8)=>{return await H.createAsset(o,M8,{store:x8,buffer:B8,mimeType:F8,originalFilename:l8,widthPx:Y8,heightPx:W8,displayWidth:J8,displayHeight:c8},X8)})},deleteAsset:async(M8,{id:x8})=>{return w(async(B8,F8)=>{return await H.deleteAsset(B8,M8,{id:x8},F8)})},createJob:async(M8,{store:x8,name:B8,agent:F8,model:l8,prompt:Y8,workingDirectory:W8,objectId:J8,streaming:c8})=>{return w(async(o,X8)=>{return await O.createJob(o,M8,{store:x8,name:B8,agent:F8,model:l8,prompt:Y8,workingDirectory:W8,objectId:J8,streaming:c8},X8)})},deleteJob:async(M8,{id:x8})=>{return w(async(B8,F8)=>{return await O.deleteJob(B8,M8,{id:x8},F8)})},updateJobStatus:async(M8,{id:x8,status:B8,exitCode:F8,errorMessage:l8})=>{return w(async(Y8,W8)=>{return await O.updateJobStatus(Y8,M8,{id:x8,status:B8,exitCode:F8,errorMessage:l8},W8)})},updateJobOutput:async(M8,{id:x8,output:B8})=>{return w(async(F8,l8)=>{return await O.updateJobOutput(F8,M8,{id:x8,output:B8},l8)})},updateJobTokens:async(M8,{id:x8,tokensUsed:B8})=>{return w(async(F8,l8)=>{return await O.updateJobTokens(F8,M8,{id:x8,tokensUsed:B8},l8)})},updateJobMetadata:async(M8,{id:x8,durationMs:B8,totalCostUsd:F8,numTurns:l8,sessionId:Y8})=>{return w(async(W8,J8)=>{return await O.updateJobMetadata(W8,M8,{id:x8,durationMs:B8,totalCostUsd:F8,numTurns:l8,sessionId:Y8},J8)})},continueJob:async(M8,{id:x8,prompt:B8,model:F8})=>{return w(async(l8,Y8)=>{return await O.continueJob(l8,M8,{id:x8,prompt:B8,model:F8},Y8)})},setJobPid:async(M8,{id:x8,pid:B8})=>{return w(async(F8,l8)=>{return await O.setJobPid(F8,M8,{id:x8,pid:B8},l8)})},clearJobPid:async(M8,{id:x8})=>{return w(async(B8,F8)=>{return await O.clearJobPid(B8,M8,{id:x8},F8)})},renameJob:async(M8,{id:x8,name:B8})=>{return w(async(F8,l8)=>{return await O.renameJob(F8,M8,{id:x8,name:B8},l8)})}})},XB=Object.freeze({create:pg6});Z4();var jB8=o6(wB8(),1),vB8=o6(I4(),1);import m$ from"fs/promises";import h$ from"path";import{createWriteStream as J21}from"fs";import z21 from"crypto";var R3=vB8.default("caw:export"),TB8=".caw-exports",GB8=".tmp",W21=2,Z21=({store:$,folderService:K,documentService:q,templateService:Y,storyService:J,assetService:z,assetsDir:W})=>{let Z=()=>{let R=new Date,E=R.getFullYear(),C=String(R.getMonth()+1).padStart(2,"0"),g=String(R.getDate()).padStart(2,"0"),S=String(R.getHours()).padStart(2,"0"),D=String(R.getMinutes()).padStart(2,"0"),L=String(R.getSeconds()).padStart(2,"0");return`${E}-${C}-${g}-${S}${D}${L}`},H=async(R)=>{let E=h$.join(R,TB8),C=h$.join(E,GB8);try{return await m$.mkdir(E,{recursive:!0}),await m$.mkdir(C,{recursive:!0}),E}catch(g){if(g.code==="EACCES")throw I.validation("Permission denied creating export directory","EXPORT_ERROR");if(g.code==="ENOSPC")throw I.validation("Insufficient disk space","EXPORT_ERROR");throw R3("Error creating export directory: [%s] %s",g.code||"UNKNOWN",g.message),I.validation(`Failed to create export directory: ${g.message} (${g.code||"UNKNOWN"})`,"EXPORT_ERROR")}},O=async(R,E,C,g)=>{let S=[],D=async(L,m)=>{let c=await K.listFolderContents(R,E,{folderId:L,type:C,storeCode:g});for(let e of c)if(e.getParentId()!==null)S.push({entity:e,depth:m,contentType:C}),await D(e.getObjectId(),m+1)};return await D(null,0),S},X=async(R,E,C)=>{let g=[],S=[],D=async(L)=>{let m=await q.listDocuments(R,E,{parentId:L,storeCode:C});for(let e of m){let _8=e.getPublishedVersionNumber();if(_8!==null){let T8=await q.readVersion(R,E,{id:e.getObjectId(),versionNumber:_8});g.push({entity:e,version:T8})}else S.push(e)}let c=await K.listFolderContents(R,E,{folderId:L,type:"d",storeCode:C});for(let e of c)await D(e.getObjectId())};return await D(null),{published:g,draftOnly:S}},P=async(R,E,C)=>{let g=[],S=[],D=async(L)=>{let m=await q.listDocuments(R,E,{parentId:L,storeCode:C,type:"t"});for(let e of m){let _8=e.getPublishedVersionNumber();if(_8!==null){let T8=await q.readVersion(R,E,{id:e.getObjectId(),versionNumber:_8});g.push({entity:e,version:T8})}else S.push(e)}let c=await K.listFolderContents(R,E,{folderId:L,type:"t",storeCode:C});for(let e of c)await D(e.getObjectId())};return await D(null),{published:g,draftOnly:S}},w=async(R,E,C)=>{let g=await z.listAssets(R,E,{store:C}),S=[];for(let D of g){let L=D.hash,m=L.substring(0,2),c=h$.join(W,m,L);try{let e=await m$.readFile(c);S.push({entity:D,buffer:e})}catch(e){if(e.code==="ENOENT"){R3("Warning: Skipping asset %s - blob file missing",D.id);continue}throw e}}return R3("Collected %d assets for export",S.length),S},T=new Set(["draft_version","latest_published_version"]),G=(R)=>{let E=typeof R.getFields==="function"?R.getFields():R.fields;if(!E||typeof E!=="object"||Object.keys(E).length===0)return;let C={};for(let[g,S]of Object.entries(E)){if(T.has(g))continue;let D;if(typeof S?.getValues==="function")D=S.getValues();else if(Array.isArray(S))D=S;else D=[S];C[g]=D.length===1?D[0]:D}return Object.keys(C).length>0?C:void 0},j=async(R,E,C)=>{let g=[],S=[],D={published:[],draftOnly:[]};if(!J)return R3("StoryService not available, skipping story export"),{stories:g,folders:S,documents:D};let L=await J.listStories(R,E,{store:C});R3("Found %d stories for export",L.length);for(let m of L)g.push(m),await v(R,E,m,C,S,D);return{stories:g,folders:S,documents:D}},v=async(R,E,C,g,S,D)=>{let L=C.id||C.getObjectId?.()||C,m=await $.listFolderContents(R,E,{folderId:L,type:"s",storeCode:g});for(let e of m){if(e.getParentId()!==null)S.push({entity:e,contentType:"s"});await v(R,E,e.getObjectId(),g,S,D)}let c=await q.listDocuments(R,E,{parentId:L,storeCode:g});for(let e of c){let _8=e.getPublishedVersionNumber();if(_8!==null){let T8=await q.readVersion(R,E,{id:e.getObjectId(),versionNumber:_8});D.published.push({entity:e,version:T8})}else D.draftOnly.push(e)}},M=async(R)=>{try{await m$.rm(R,{recursive:!0,force:!0})}catch(E){R3("Warning: Failed to cleanup temp directory: %s",E.message)}};return Object.freeze({listExports:async(R,E,{projectPath:C})=>{let g=h$.join(C,TB8);try{let S=await m$.readdir(g),D=[];for(let L of S)if(L.endsWith(".zip")){let m=h$.join(g,L),c=await m$.stat(m);D.push({filename:L,timestamp:c.mtime.toISOString(),size:c.size})}return R3("Found %d export files",D.length),D}catch(S){if(S.code==="ENOENT")return[];throw S}},exportPreview:async(R,E,{storeCode:C})=>{let g=await O(R,E,"d",C),S=await O(R,E,"t",C),{published:D,draftOnly:L}=await X(R,E,C),{published:m,draftOnly:c}=await P(R,E,C),_8={assets:(z?await z.listAssets(R,E,{store:C}):[]).map((D8)=>({id:D8.id,originalFilename:D8.originalFilename,mimeType:D8.mimeType,sizeBytes:D8.sizeBytes})),folders:[...g,...S].map((D8)=>({id:D8.entity.getObjectId(),path:D8.entity.getPath(),name:D8.entity.getName()})),documents:D.map((D8)=>({id:D8.entity.getObjectId(),path:D8.entity.getPath(),name:D8.entity.getName()})),templates:m.map((D8)=>({id:D8.entity.getObjectId(),path:D8.entity.getPath(),name:D8.entity.getName()}))},T8={documents:L.map((D8)=>({id:D8.getObjectId(),path:D8.getPath(),name:D8.getName()})),templates:c.map((D8)=>({id:D8.getObjectId(),path:D8.getPath(),name:D8.getName()}))},d8=_8.assets.length+_8.folders.length+_8.documents.length+_8.templates.length,H6=T8.documents.length+T8.templates.length;return R3("Preview: %d published (%d assets), %d draft-only",d8,_8.assets.length,H6),{toExport:_8,draftOnly:T8}},exportDocuments:async(R,E,{storeCode:C,projectPath:g})=>{R3("Starting export for store %s",C);let S=await H(g),D=z21.randomUUID(),L=h$.join(S,GB8,D);await m$.mkdir(L,{recursive:!0});try{let m=await O(R,E,"d",C),c=await O(R,E,"t",C),e=[...m,...c],{published:_8,draftOnly:T8}=await X(R,E,C),{published:d8,draftOnly:H6}=await P(R,E,C),D8=z?await w(R,E,C):[],{stories:y8,folders:o8,documents:Z6}=await j(R,E,C),M6=[...e,...o8],u6=[..._8,...Z6.published],y6=[...T8,...Z6.draftOnly];R3("Found %d folders, %d documents, %d templates, %d assets, %d stories",M6.length,u6.length,d8.length,D8.length,y8.length);let s6={},L6=await $.readStoryRootFolder(R,E,{storeCode:C});if(L6){let h8=L6.toJSON(),p8=G(h8);if(p8&&Object.keys(p8).length>0)s6[L6.getObjectId()]={subtype:"root_s",fields:p8}}let P8=[...D8.map((h8)=>({id:h8.entity.id,type:"asset",hash:h8.entity.hash,mimeType:h8.entity.mimeType,sizeBytes:h8.entity.sizeBytes,originalFilename:h8.entity.originalFilename,widthPx:h8.entity.widthPx,heightPx:h8.entity.heightPx,displayWidth:h8.entity.displayWidth,displayHeight:h8.entity.displayHeight})),...y8.map((h8)=>{let p8={id:h8.id,type:"story",name:h8.name},s8=G(h8);if(s8)p8.fields=s8;return p8}),...M6.map((h8)=>{let p8={id:h8.entity.getObjectId(),type:"folder",path:h8.entity.getPath(),contentType:h8.contentType},s8=h8.entity.getSubtype?.();if(s8)p8.subtype=s8;let q6=G(h8.entity);if(q6)p8.fields=q6;return p8}),...u6.map((h8)=>{let p8={id:h8.entity.getObjectId(),type:"document",path:h8.entity.getPath()},s8=h8.entity.getSubtype?.();if(s8)p8.subtype=s8;else{let X6=h8.entity.getPath(),f6=X6.split("/");if(f6.length>=4&&f6[2]==="tasks")R3('WARN: Document %s in tasks folder missing subtype, inferring "task"',X6),p8.subtype="task"}let q6=G(h8.entity);if(q6)p8.fields=q6;return p8}),...d8.map((h8)=>{let p8={id:h8.entity.getObjectId(),type:"template",path:h8.entity.getPath()},s8=h8.entity.getSubtype?.();if(s8)p8.subtype=s8;let q6=G(h8.entity);if(q6)p8.fields=q6;return p8})],O8={version:W21,exportedAt:new Date().toISOString(),entities:P8};if(Object.keys(s6).length>0)O8.rootFolderFields=s6;await m$.writeFile(h$.join(L,"manifest.json"),JSON.stringify(O8,null,2),"utf-8");for(let h8 of M6){if(h8.entity.getParentId()===null)continue;let p8=h$.join(L,h8.entity.getPath());await m$.mkdir(p8,{recursive:!0})}await m$.mkdir(h$.join(L,"Documents"),{recursive:!0}),await m$.mkdir(h$.join(L,"Templates"),{recursive:!0}),await m$.mkdir(h$.join(L,"Stories"),{recursive:!0});for(let h8 of u6){let p8=h$.join(L,h8.entity.getPath()),s8=h8.version.content;await m$.mkdir(h$.dirname(p8),{recursive:!0}),await m$.writeFile(p8,s8,"utf-8")}for(let h8 of d8){let p8=h$.join(L,h8.entity.getPath()),s8=h8.version.content;await m$.mkdir(h$.dirname(p8),{recursive:!0}),await m$.writeFile(p8,s8,"utf-8")}if(D8.length>0){let h8=h$.join(L,"assets");await m$.mkdir(h8,{recursive:!0});for(let p8 of D8){let s8=p8.entity.id,q6=h$.join(h8,`${s8}.bin`);await m$.writeFile(q6,p8.buffer);let X6=h$.join(h8,`${s8}.json`);await m$.writeFile(X6,JSON.stringify({id:s8,hash:p8.entity.hash,mimeType:p8.entity.mimeType,sizeBytes:p8.entity.sizeBytes,originalFilename:p8.entity.originalFilename,widthPx:p8.entity.widthPx,heightPx:p8.entity.heightPx,displayWidth:p8.entity.displayWidth,displayHeight:p8.entity.displayHeight},null,2),"utf-8")}}for(let h8 of P8){if(h8.type==="folder"||h8.type==="story")continue;let p8;if(h8.type==="asset")p8=h$.join(L,"assets",`${h8.id}.bin`);else if(h8.type==="document"||h8.type==="template")p8=h$.join(L,h8.path);else{R3("Unknown entity type in validation: %s",h8.type);continue}try{await m$.access(p8)}catch(s8){throw I.validation(`Manifest entry missing file: ${h8.id||h8.path}`,"EXPORT_VALIDATION_FAILED")}}let f8=`caw-export-${Z()}.zip`,u8=h$.join(S,f8),i8=J21(u8),a8=jB8.default("zip",{zlib:{level:9}});a8.on("error",async(h8)=>{throw await M(L),R3("Zip creation error: %s",h8.message),I.validation(`Export failed: ${h8.message}`,"EXPORT_ERROR")}),a8.pipe(i8),a8.directory(L,!1),await a8.finalize(),await new Promise((h8,p8)=>{i8.on("close",h8),i8.on("error",p8),setTimeout(()=>{p8(Error("Zip creation timeout"))},60000)}),R3("Created zip: %s (%d bytes)",f8,a8.pointer()),await M(L);let z6=P8.length;return R3("Export complete: %s (%d entities)",f8,z6),{success:!0,filename:f8,path:u8,counts:{assets:D8.length,stories:y8.length,folders:M6.length,documents:u6.length,templates:d8.length},draftOnlySkipped:{documents:y6.length,templates:H6.length}}}catch(m){throw await M(L),m}}})},VB8=Object.freeze({create:Z21});Z4();var tB8=o6(rB8(),1),eB8=o6(I4(),1);import Tq from"fs/promises";import s5 from"path";import b21 from"crypto";var P1=eB8.default("caw:import"),rl=($)=>{if(!$||typeof $!=="string")throw Error(`Invalid export path: ${$}`);let K={Documents:"d",Templates:"t",Stories:"s"},q=$.indexOf("/");if(q===-1){let z=K[$];if(z)return{path:"",type:z};throw Error(`Invalid export path: ${$}`)}let Y=$.slice(0,q),J=K[Y];if(!J)throw Error(`Unknown root folder: ${Y}`);return{path:$.slice(q+1),type:J}},sl=".caw-exports",sB8=".tmp",y21=[1,2],u21=/\b([A-Z][adtfns]\d+)\b/g,m21=({store:$,folderService:K,documentService:q,templateService:Y,storyService:J,fieldService:z,assetService:W,assetsDir:Z})=>{let H=(v,M)=>{if(!v)return v;return v.replace(u21,(f,k)=>{return M[k]??f})},O=(v)=>{if(!Array.isArray(v))return!1;if(v.length!==Oz.length)return!0;return!v.every((M,f)=>M===Oz[f])},X=async(v,M,f,k,N,R)=>{if(!k||typeof k!=="object"||!z)return;for(let[E,C]of Object.entries(k)){if(E==="activeJobCount")continue;let g=E==="dependsOn",S=C;if(g)if(Array.isArray(C))S=C.map((D)=>N[D]||D);else S=N[C]||C;if(Array.isArray(S))await z.setFieldValue(v,M,{entityId:f,fieldName:E,values:S},R);else await z.setFieldValue(v,M,{entityId:f,fieldName:E,value:S},R)}},P=async(v)=>{try{await Tq.rm(v,{recursive:!0,force:!0})}catch(M){P1("Warning: Failed to cleanup temp directory: %s",M.message)}},w=async(v,M,{storeCode:f})=>{let k=await K.listFolderContents(v,M,{folderId:null,type:"d",storeCode:f}),N=await K.listFolderContents(v,M,{folderId:null,type:"t",storeCode:f}),R=await q.listDocuments(v,M,{parentId:null,storeCode:f,type:"d"}),E=await q.listDocuments(v,M,{parentId:null,storeCode:f,type:"t"}),C=k.length===0&&N.length===0&&R.length===0&&E.length===0;return P1("Store %s empty check: %s",f,C),C},T=async(v,M,{tempPath:f,storeCode:k,idMapping:N,enqueuePostCommitHook:R})=>{let E=s5.join(f,"assets"),C;try{C=await Tq.readdir(E)}catch(D){if(D.code==="ENOENT")return P1("No assets directory in export"),0;throw D}let g=C.filter((D)=>D.endsWith(".json"));if(P1("Found %d assets to import",g.length),!W||!Z){if(g.length>0)throw I.validation("Export contains assets but asset service is not configured","ASSET_SERVICE_MISSING");return 0}let S=0;for(let D of g){let L=s5.join(E,D),m=await Tq.readFile(L,"utf-8"),c=JSON.parse(m),e=D.replace(".json",".bin"),_8=s5.join(E,e),T8=await Tq.readFile(_8),d8=await W.createAsset(v,M,{store:k,buffer:T8,mimeType:c.mimeType,originalFilename:c.originalFilename,widthPx:c.widthPx,heightPx:c.heightPx,displayWidth:c.displayWidth,displayHeight:c.displayHeight},R);N[c.id]=d8.id,S++}return P1("Imported %d assets",S),S},G=async(v,M,{manifest:f,tempPath:k,storeCode:N})=>{return P1("Starting transaction..."),await v.transaction().execute(async(R)=>{let E={},C=(y8)=>{},g=await T(R,M,{tempPath:k,storeCode:N,idMapping:E,enqueuePostCommitHook:C});if(P1("Phase 0 complete - imported %d assets",g),f.rootFolderFields&&z){P1("Phase 0.25: Restoring root folder fields");for(let[y8,o8]of Object.entries(f.rootFolderFields)){let Z6;if(o8.subtype==="root_s")Z6=await $.readStoryRootFolder(R,M,{storeCode:N});if(Z6&&o8.fields){for(let[M6,u6]of Object.entries(o8.fields))if(Array.isArray(u6))await z.setFieldValue(R,M,{entityId:Z6.getObjectId(),fieldName:M6,values:u6},C);else await z.setFieldValue(R,M,{entityId:Z6.getObjectId(),fieldName:M6,value:u6},C);P1("Restored fields for root folder %s (%s)",Z6.getObjectId(),o8.subtype)}}P1("Phase 0.25 complete - restored root folder fields")}let S=f.entities.filter((y8)=>y8.type==="story"),D=0,L={};if(S.length>0&&J){P1("Phase 0.5: Creating %d stories",S.length);let y8=f.entities.filter((o8)=>o8.type==="folder"&&o8.subtype==="tasks");for(let o8 of y8){let Z6=o8.path.split("/");if(Z6.length>=3&&Z6[0]==="Stories"){let M6=Z6[1];L[M6]=o8.id}}for(let o8 of S){let Z6=o8.fields?.state||"waiting",M6=await J.createStory(R,M,{store:N,name:o8.name,state:Z6},C);if(E[o8.id]=M6.id,o8.fields&&f.version>=2)await X(R,M,M6.id,o8.fields,E,C);let u6=L[o8.name];if(u6&&M6.tasksFolder){E[u6]=M6.tasksFolder.id;let y6=f.entities.find((s6)=>s6.id===u6);if(y6?.fields?.states){let s6=y6.fields.states;if(O(Array.isArray(s6)?s6:[s6]))await z.setFieldValue(R,M,{entityId:M6.tasksFolder.id,fieldName:"states",values:Array.isArray(s6)?s6:[s6]},C)}}D++}P1("Phase 0.5 complete - created %d stories",D)}let m=f.entities.filter((y8)=>y8.type==="folder"&&y8.subtype!=="tasks");P1("Phase 1: Creating %d folders (excluding tasks folders)",m.length);let c=0;for(let y8 of m){let{path:o8,type:Z6}=rl(y8.path);if(!o8)continue;if(E[y8.id])continue;let M6;if(Z6==="s"){let u6=o8.split("/"),y6=u6[u6.length-1],s6=u6.slice(0,-1).join("/"),L6;if(u6.length===1){P1("Unexpected folder directly under Stories root: %s",o8);continue}else if(u6.length===2){let P8=u6[0],O8=f.entities.find((f8)=>f8.type==="story"&&f8.name===P8);if(O8&&E[O8.id])L6=E[O8.id]}else{let P8=f.entities.find((O8)=>O8.type==="folder"&&O8.path===`Stories/${s6}`);if(P8&&E[P8.id])L6=E[P8.id]}if(!L6){P1("Could not resolve parent for story folder: %s",y8.path);continue}M6=await K.createFolder(R,M,{mode:"parentName",parentId:L6,name:y6},C)}else M6=await K.createFolder(R,M,{store:N,path:o8,type:Z6},C);if(E[y8.id]=M6.getObjectId(),y8.fields&&f.version>=2)await X(R,M,M6.getObjectId(),y8.fields,E,C);c++}P1("Phase 1 complete - created %d folders (skipped root folders)",c);let e=f.entities.filter((y8)=>y8.type==="document"),_8=[];P1("Phase 2: Reading %d documents",e.length);for(let y8 of e){let o8=s5.join(k,y8.path),Z6=await Tq.readFile(o8,"utf-8");_8.push({oldId:y8.id,path:y8.path,content:Z6,subtype:y8.subtype,fields:y8.fields})}P1("Phase 2 complete - read %d documents",_8.length),P1("Phase 3: Creating %d document entities",_8.length);let T8=[];for(let y8 of _8){let{path:o8,type:Z6}=rl(y8.path),M6;if(Z6==="s"){let y6=o8.split("/"),s6=y6[0],L6=y6.slice(0,-1).join("/"),P8=y6[y6.length-1],O8=f.entities.find((u8)=>u8.type==="folder"&&u8.path===`Stories/${L6}`),f8;if(O8&&E[O8.id])f8=E[O8.id];else{let u8=f.entities.find((i8)=>i8.type==="story"&&i8.name===s6);if(u8&&E[u8.id])f8=E[u8.id]}if(!f8)throw I.validation(`Cannot resolve parent folder for story document: ${y8.path}`,"IMPORT_RESOLUTION_FAILED");M6={mode:"parentName",parentId:f8,name:P8}}else M6={store:N,path:o8,type:Z6};if(y8.subtype)M6.subtype=y8.subtype;else if(Z6==="s"){let y6=o8.split("/");if(y6.length>=3&&y6[1]==="tasks")P1('WARN: Document %s in tasks folder missing subtype, inferring "task"',y8.path),M6.subtype="task"}let u6=await q.createDocument(R,M,M6,C);E[y8.oldId]=u6.getObjectId(),T8.push({document:u6,originalContent:y8.content,fields:y8.fields})}P1("Phase 3 complete - created %d document entities",T8.length);let d8=f.entities.filter((y8)=>y8.type==="template"),H6=[];P1("Phase 4: Reading %d templates",d8.length);for(let y8 of d8){let o8=s5.join(k,y8.path),Z6=await Tq.readFile(o8,"utf-8");H6.push({oldId:y8.id,path:y8.path,content:Z6,subtype:y8.subtype,fields:y8.fields})}P1("Phase 4 complete - read %d templates",H6.length),P1("Phase 5: Creating %d template entities",H6.length);let D8=[];for(let y8 of H6){let{path:o8,type:Z6}=rl(y8.path),M6={store:N,path:o8,type:Z6};if(y8.subtype)M6.subtype=y8.subtype;let u6=await q.createDocument(R,M,M6,C);E[y8.oldId]=u6.getObjectId(),D8.push({template:u6,originalContent:y8.content,fields:y8.fields})}P1("Phase 5 complete - created %d template entities",D8.length),P1("Phase 6: Remapping and saving content for %d documents",T8.length);for(let{document:y8,originalContent:o8,fields:Z6}of T8){let M6=H(o8,E);if(await q.saveDraft(R,M,{id:y8.getObjectId(),content:M6,sessionId:"import-service"},C),await q.publishDocument(R,M,{id:y8.getObjectId()},C),Z6&&f.version>=2)await X(R,M,y8.getObjectId(),Z6,E,C)}P1("Phase 6 complete - saved and published %d documents",T8.length),P1("Phase 7: Remapping and saving content for %d templates",D8.length);for(let{template:y8,originalContent:o8,fields:Z6}of D8){let M6=H(o8,E);if(await q.saveDraft(R,M,{id:y8.getObjectId(),content:M6,sessionId:"import-service"},C),await q.publishDocument(R,M,{id:y8.getObjectId()},C),Z6&&f.version>=2)await X(R,M,y8.getObjectId(),Z6,E,C)}return P1("Phase 7 complete - saved and published %d templates",D8.length),P1("Transaction committed successfully"),{success:!0,counts:{assets:g,stories:D,folders:c,documents:T8.length,templates:D8.length},remapped:E}})};return Object.freeze({isStoreEmpty:w,importDocuments:async(v,M,{filename:f,storeCode:k,projectPath:N})=>{P1("Starting import from %s to store %s",f,k);let R=s5.join(N,sl,f);try{await Tq.access(R),P1("Zip file found: %s",R)}catch(D){throw I.notFound(`Export file not found: ${f}`,"EXPORT_NOT_FOUND")}P1("Validating zip and manifest...");let E=await w(v,M,{storeCode:k});if(!E)throw I.conflict("Store not empty - import requires empty store","STORE_NOT_EMPTY");P1("Store empty check: %s",E);let C=b21.randomUUID(),g=s5.join(N,sl,sB8,C),S=s5.join(N,sl,sB8);await Tq.mkdir(S,{recursive:!0});try{new tB8.default(R).extractAllTo(g,!0),P1("Extracted zip to: %s",g)}catch(D){throw I.validation("Corrupted or invalid zip file","IMPORT_VALIDATION_FAILED")}try{let D=s5.join(g,"manifest.json"),L;try{let e=await Tq.readFile(D,"utf-8");L=JSON.parse(e)}catch(e){throw I.validation(`Failed to read manifest: ${e.message}`,"MANIFEST_READ_FAILED")}if(!y21.includes(L.version))throw I.validation(`Unsupported manifest version: ${L.version}`,"UNSUPPORTED_VERSION");if(!L.entities||!Array.isArray(L.entities))throw I.validation("Invalid manifest structure","MANIFEST_READ_FAILED");P1("Manifest valid: version=%d, entities=%d",L.version,L.entities.length);for(let e of L.entities){if(e.type==="folder"||e.type==="story")continue;let _8;if(e.type==="asset")_8=s5.join(g,"assets",`${e.id}.bin`);else if(e.type==="document"||e.type==="template")_8=s5.join(g,e.path);else{P1("Unknown entity type in import validation: %s",e.type);continue}try{await Tq.access(_8)}catch(T8){throw I.validation(`Missing file for manifest entry: ${e.path||e.id}`,"IMPORT_VALIDATION_FAILED")}}P1("All content files validated");let m=await G(v,M,{manifest:L,tempPath:g,storeCode:k}),c=m.counts.folders+m.counts.documents+m.counts.templates;return P1("Import complete: %d entities imported",c),m}finally{await P(g)}}})},$U8=Object.freeze({create:m21});var B21=($)=>{let{name:K,interval:q,execute:Y}=$,J=null,z=!1,W=null,Z=null,H=0,O=null,M=Object.freeze({getName:()=>K,getInterval:()=>q,getIsRunning:()=>z,getLastRun:()=>W,getLastError:()=>Z,getRunCount:()=>H,getNextRun:()=>O}),f=async()=>{try{await Y(),W=new Date().toISOString(),Z=null,H++}catch(C){console.error(`[CronJob] ${K} failed:`,C),Z={message:C.message,timestamp:new Date().toISOString()}}if(z)O=new Date(Date.now()+q).toISOString()},k=()=>{if(J!==null)return;J=setInterval(f,q),z=!0,O=new Date(Date.now()+q).toISOString()},N=()=>{if(J===null)return;clearInterval(J),J=null,z=!1,O=null},E=Object.freeze({start:k,stop:N,restart:()=>{N(),k()}});return{jobFns:M,controlFns:E}},EC=Object.freeze({create:B21});var KU8=o6(I4(),1),U21=KU8.default("caw:cron:cleanup-edit-states"),qU8=async($)=>{let K=new Date(Date.now()-gJ).toISOString();try{let q=await $.selectFrom("field_definitions as fd").innerJoin("entity_types as et","et.id","fd.owner_entity_type_id").select(["fd.id","fd.name","fd.primitive_type"]).where("fd.name","in",["edit_session_id","edit_started_at","edit_last_activity_at"]).where("et.code","in",["d","t"]).where("et.subtype","is",null).execute(),Y=q.filter((O)=>O.name==="edit_last_activity_at").map((O)=>O.id),J=q.filter((O)=>O.name==="edit_session_id").map((O)=>O.id),z=q.filter((O)=>O.name==="edit_started_at").map((O)=>O.id);if(Y.length===0)return{expired:0};let W=await $.selectFrom("date_fields").select(["entity_id"]).where("field_definition_id","in",Y).where("value","<",K).execute();if(W.length===0)return{expired:0};let Z=W.map((O)=>O.entity_id);if(J.length>0)await $.deleteFrom("string_fields").where("entity_id","in",Z).where("field_definition_id","in",J).execute();let H=[...z,...Y];if(H.length>0)await $.deleteFrom("date_fields").where("entity_id","in",Z).where("field_definition_id","in",H).execute();if(W.length>0)U21("Cleaned up %d expired edit locks (older than %d minutes)",W.length,gJ/60000);return{expired:W.length}}catch(q){throw console.error("[Cleanup] Failed to cleanup expired edit locks:",q),q}};var p21=({db:$})=>{let{jobFns:K,controlFns:q}=EC.create({name:"cleanup-stale-edit-states",interval:900000,execute:async()=>{await qU8($)}});return{job:Object.freeze(K),control:q}},YU8=Object.freeze({create:p21});var F21=({db:$})=>{let K=new Map,q=(O,X)=>{let{job:P,control:w}=O.create(X);K.set(P.getName(),{job:P,control:w})},Y=(O)=>{let X=K.get(O);if(!X)throw Error(`Job not found: ${O}`);let P=X.job.getIsRunning();return X.control.start(),{name:O,status:P?"already-running":"started",isRunning:X.job.getIsRunning()}},J=(O)=>{let X=K.get(O);if(!X)throw Error(`Job not found: ${O}`);let P=X.job.getIsRunning();return X.control.stop(),{name:O,status:P?"stopped":"already-stopped",isRunning:X.job.getIsRunning()}},z=(O)=>{let X=K.get(O);if(!X)throw Error(`Job not found: ${O}`);return X.control.restart(),{name:O,status:"restarted",isRunning:X.job.getIsRunning()}},W=()=>{let O=[];for(let[X,{job:P}]of K.entries())O.push({name:P.getName(),interval:P.getInterval(),isRunning:P.getIsRunning(),lastRun:P.getLastRun(),lastError:P.getLastError(),runCount:P.getRunCount(),nextRun:P.getNextRun()});return O},Z=()=>{for(let[O,{control:X}]of K.entries())X.start()},H=()=>{for(let[O,{control:X}]of K.entries())X.stop()};return q(YU8,{db:$}),Object.freeze({register:q,start:Y,stop:J,restart:z,list:W,startAll:Z,stopAll:H})},JU8=Object.freeze({create:F21});import Ul8 from"node:process";import ZU8 from"node:process";import d21 from"node:os";import n21 from"node:fs";import l21 from"node:fs";import zU8 from"node:fs";var tl;function c21(){try{return zU8.statSync("/.dockerenv"),!0}catch{return!1}}function Q21(){try{return zU8.readFileSync("/proc/self/cgroup","utf8").includes("docker")}catch{return!1}}function el(){if(tl===void 0)tl=c21()||Q21();return tl}var $i,i21=()=>{try{return l21.statSync("/run/.containerenv"),!0}catch{return!1}};function SC(){if($i===void 0)$i=i21()||el();return $i}var WU8=()=>{if(ZU8.platform!=="linux")return!1;if(d21.release().toLowerCase().includes("microsoft")){if(SC())return!1;return!0}try{return n21.readFileSync("/proc/version","utf8").toLowerCase().includes("microsoft")?!SC():!1}catch{return!1}},HU8=ZU8.env.__IS_WSL_TEST__?WU8:WU8();import Ki from"node:process";function qi(){if(Ki.platform!=="linux")return!1;if(Ki.env.WAYLAND_DISPLAY)return!0;if(Ki.env.XDG_SESSION_TYPE==="wayland")return!0;return!1}function E$($){if(typeof $!=="object"||$===null)return!1;let K=Object.getPrototypeOf($);return(K===null||K===Object.prototype||Object.getPrototypeOf(K)===null)&&!(Symbol.toStringTag in $)&&!(Symbol.iterator in $)}import{fileURLToPath as o21}from"node:url";var TP=($,K)=>{let q=Ji(a21($));if(typeof q!=="string")throw TypeError(`${K} must be a string or a file URL: ${q}.`);return q},a21=($)=>Yi($)?$.toString():$,Yi=($)=>typeof $!=="string"&&$&&Object.getPrototypeOf($)===String.prototype,Ji=($)=>$ instanceof URL?o21($):$;var LC=($,K=[],q={})=>{let Y=TP($,"First argument"),[J,z]=E$(K)?[[],K]:[K,q];if(!Array.isArray(J))throw TypeError(`Second argument must be either an array of arguments or an options object: ${J}`);if(J.some((H)=>typeof H==="object"&&H!==null))throw TypeError(`Second argument must be an array of strings: ${J}`);let W=J.map(String),Z=W.find((H)=>H.includes("\x00"));if(Z!==void 0)throw TypeError(`Arguments cannot contain null bytes ("\\0"): ${Z}`);if(!E$(z))throw TypeError(`Last argument must be an options object: ${z}`);return[Y,W,z]};import{ChildProcess as qz1}from"node:child_process";import{StringDecoder as r21}from"node:string_decoder";var{toString:OU8}=Object.prototype,XU8=($)=>OU8.call($)==="[object ArrayBuffer]",e$=($)=>OU8.call($)==="[object Uint8Array]",RY=($)=>new Uint8Array($.buffer,$.byteOffset,$.byteLength),s21=new TextEncoder,PU8=($)=>s21.encode($),t21=new TextDecoder,IC=($)=>t21.decode($),wU8=($,K)=>{return e21($,K).join("")},e21=($,K)=>{if(K==="utf8"&&$.every((z)=>typeof z==="string"))return $;let q=new r21(K),Y=$.map((z)=>typeof z==="string"?PU8(z):z).map((z)=>q.write(z)),J=q.end();return J===""?Y:[...Y,J]},Kv=($)=>{if($.length===1&&e$($[0]))return $[0];return zi($z1($))},$z1=($)=>$.map((K)=>typeof K==="string"?PU8(K):K),zi=($)=>{let K=new Uint8Array(Kz1($)),q=0;for(let Y of $)K.set(Y,q),q+=Y.length;return K},Kz1=($)=>{let K=0;for(let q of $)K+=q.length;return K};var vU8=($)=>Array.isArray($)&&Array.isArray($.raw),VU8=($,K)=>{let q=[];for(let[z,W]of $.entries())q=Yz1({templates:$,expressions:K,tokens:q,index:z,template:W});if(q.length===0)throw TypeError("Template script must not be empty");let[Y,...J]=q;return[Y,J,{}]},Yz1=({templates:$,expressions:K,tokens:q,index:Y,template:J})=>{if(J===void 0)throw TypeError(`Invalid backslash sequence: ${$.raw[Y]}`);let{nextTokens:z,leadingWhitespaces:W,trailingWhitespaces:Z}=Jz1(J,$.raw[Y]),H=GU8(q,z,W);if(Y===K.length)return H;let O=K[Y],X=Array.isArray(O)?O.map((P)=>jU8(P)):[jU8(O)];return GU8(H,X,Z)},Jz1=($,K)=>{if(K.length===0)return{nextTokens:[],leadingWhitespaces:!1,trailingWhitespaces:!1};let q=[],Y=0,J=TU8.has(K[0]);for(let W=0,Z=0;W<$.length;W+=1,Z+=1){let H=K[Z];if(TU8.has(H)){if(Y!==W)q.push($.slice(Y,W));Y=W+1}else if(H==="\\"){let O=K[Z+1];if(O===`
|
|
534
|
+
`),i8=f8[O8-1].match(/^(?:[-*+] |\d+\. )\[([ xX])\] (.+)$/),a8=0,z6=/^(?:[-*+] |\d+\. )\[([ xX])\] .+$/;for(let h8=0;h8<O8;h8++)if(z6.test(f8[h8]))a8++;return{text:i8[2],checked:i8[1]!==" ",lineNumber:O8,itemNumber:a8}};return Object.freeze({createDocument:w,createTemplate:T,readDocument:G,readDocumentByPath:j,updateDocumentPath:v,deleteDocument:M,saveDraft:f,readDraft:k,publishDocument:N,discardDraft:R,readVersion:E,getVersions:C,setEditState:g,clearEditState:S,getEditState:D,listDocuments:L,editDocument:m,batchEditDocument:c,readLines:e,readBetweenMarkers:_8,getDocumentStats:T8,readHeadings:d8,readSection:H6,readFrontmatter:D8,readChecklist:y8,checkChecklistItem:async(P8,O8,{id:f8,lineNumber:u8,checked:i8,includeDraft:a8=!1,preview:z6=!1,sessionId:h8},p8)=>{let{entity:s8}=await G(P8,O8,{id:f8}),q6=a8?s8.getDraftContent()??s8.getPublishedContent()??"":s8.getPublishedContent()??"",X6=Mm(q6,{lineNumber:u8,checked:i8});if(z6)return{preview:!0,diff:bO(q6,X6.newContent),item:o8(X6.newContent,u8)};return await f(P8,O8,{id:f8,content:X6.newContent,sessionId:h8},p8),{applied:!0,item:o8(X6.newContent,u8)}},toggleChecklistItem:async(P8,O8,{id:f8,lineNumber:u8,includeDraft:i8=!1,preview:a8=!1,sessionId:z6},h8)=>{let{entity:p8}=await G(P8,O8,{id:f8}),s8=i8?p8.getDraftContent()??p8.getPublishedContent()??"":p8.getPublishedContent()??"",q6=Q08(s8,{lineNumber:u8});if(a8)return{preview:!0,diff:bO(s8,q6.newContent),item:o8(q6.newContent,u8)};return await f(P8,O8,{id:f8,content:q6.newContent,sessionId:z6},h8),{applied:!0,item:o8(q6.newContent,u8)}},batchCheckChecklistItems:async(P8,O8,{id:f8,items:u8,includeDraft:i8=!1,preview:a8=!1,sessionId:z6},h8)=>{let{entity:p8}=await G(P8,O8,{id:f8}),s8=i8?p8.getDraftContent()??p8.getPublishedContent()??"":p8.getPublishedContent()??"",q6=l08(s8,{items:u8}),X6=u8.map((f6)=>o8(q6.newContent,f6.lineNumber));if(a8)return{preview:!0,diff:bO(s8,q6.newContent),items:X6,count:q6.details.count};return await f(P8,O8,{id:f8,content:q6.newContent,sessionId:z6},h8),{applied:!0,items:X6,count:q6.details.count}},specialiseDocument:async(P8,O8,{id:f8,subtype:u8,fields:i8},a8)=>{let{entity:z6}=await G(P8,O8,{id:f8});y.factory(z6.getSubtype()!==null,I.validation,`Entity is already specialised to subtype: ${z6.getSubtype()}`,"ALREADY_SPECIALISED");let{storeCode:h8,typeCode:p8}=a6.resolveEntityId(f8),s8=(await Promise.resolve().then(() => (Yk(),PP8))).default;try{await s8.readEntityTypeId(P8,O8,p8,u8)}catch(f6){throw I.validation(`Invalid subtype: ${u8}`,"INVALID_SUBTYPE")}await J.validateRequiredFields(P8,O8,{store:h8,code:p8,subtype:u8,fields:i8});let q6=await $.updateEntityType(P8,O8,{id:f8,subtype:u8},a8);if(i8&&Object.keys(i8).length>0)for(let[f6,M8]of Object.entries(i8))await J.setFieldValue(P8,O8,{entityId:f8,fieldName:f6,...Array.isArray(M8)?{values:M8}:{value:M8}},a8);let{entity:X6}=await G(P8,O8,{id:f8});return{entity:X6}},generaliseDocument:async(P8,O8,{id:f8},u8)=>{let{entity:i8}=await G(P8,O8,{id:f8}),a8=i8.getSubtype();y.factory(a8===null,I.validation,"Entity is already generic (has no subtype)","ALREADY_GENERIC");let z6=await $.readFolder(P8,O8,{id:i8.getParentId()});if(z6&&await G4.isInsideTasksFolder(P8,O8,z6,$))throw I.validation("Cannot generalise entity inside a tasks folder","INVALID_LOCATION");let{typeCode:h8}=a6.resolveEntityId(f8),p8=await $.getFieldDefinitionsForEntityType(P8,O8,{storeCode:"B",code:h8,subtype:a8}),s8=i8.getFields();for(let X6 of p8){let f6=X6.getName();if(s8&&s8[f6])await J.deleteFieldValue(P8,O8,{entityId:f8,fieldName:f6},u8)}await $.updateEntityType(P8,O8,{id:f8,subtype:null},u8);let{entity:q6}=await G(P8,O8,{id:f8});return{entity:q6}},setIncludeResolver:(P8)=>{z=P8}})},n08=Object.freeze({create:oh6});var ah6=()=>{let $=null,K=null,q={prePublish:{d:async(z,W,Z,H,O)=>{if(!$)return;let X=Z.getDraftContent();if(!X)return;let{content:P,pinned:w}=await $.pinIncludes(z,W,X,Z.getObjectId());if(w.length>0)await K.saveDraft(z,W,{id:Z.getObjectId(),content:P,sessionId:H},O)},t:null},postPublish:{},preDelete:{},postCreate:{}};return Object.freeze({getHook:(z,W)=>{return q[z]?.[W]||null},setIncludeResolver:(z,W)=>{$=z,K=W}})},o08=Object.freeze({create:ah6});Z4();var a08=o6(I4(),1),UJ=a08.default("caw:includes"),rh6=({store:$,documentService:K})=>{let q=/<include\s+(?:id="([^"]+)"|path="([^"]+)")(?:\s+version="(\d+)")?\s*\/>/g,Y=(X)=>{let P=X;return P=P.replace(/```[\s\S]*?```/g,(w)=>" ".repeat(w.length)),P=P.replace(/~~~[\s\S]*?~~~/g,(w)=>" ".repeat(w.length)),P=P.replace(/``[^`]+``/g,(w)=>" ".repeat(w.length)),P=P.replace(/`[^`]+`/g,(w)=>" ".repeat(w.length)),P},J=(X)=>{let P=Y(X),w=[],T,G=new RegExp(q.source,"g");while((T=G.exec(P))!==null){let j=X.substring(T.index,T.index+T[0].length),v=new RegExp(q.source).exec(j);if(v)w.push({fullMatch:j,id:v[1],path:v[2],versionStr:v[3],index:T.index})}return w},z=5,W=async(X,P,w,T,G=new Set,j=0)=>{if(UJ("Resolving includes in document, depth=%d, chain=%s, sourceDocId=%s",j,[...G].join(","),T),j>5)throw I.validation("Include depth limit exceeded (max 5 levels)","INCLUDE_DEPTH_EXCEEDED");if(T)G=new Set(G).add(T);let v=J(w);if(UJ("Found %d include directives",v.length),v.length===0)return w;let M=w;for(let f of v){let{fullMatch:k,id:N,path:R,versionStr:E}=f,C=E?parseInt(E,10):null;UJ("Resolving include: id=%s, path=%s, version=%s",N,R,E);try{let g;if(N)g=N;else{let L=T?T.charAt(0):"A",m=await K.readDocumentByPath(X,P,{path:R,type:"d",storeCode:L});if(!m)throw I.notFound(`Included document not found: ${R}`,"INCLUDE_NOT_FOUND");g=m.entity.getObjectId()}if(G.has(g)){let L=[...G,g].join(" -> ");throw I.validation(`Circular include detected: ${L}`,"INCLUDE_CYCLE")}if(C===null)throw I.validation(`Unpinned include found: ${k}. Includes must specify a version.`,"INCLUDE_UNPINNED");let S=await $.readVersion(X,P,{id:g,versionNumber:C});if(!S)throw I.notFound(`Version ${C} not found for included document: ${g}`,"INCLUDE_VERSION_NOT_FOUND");let D=await W(X,P,S.content,g,G,j+1);M=M.replace(k,D)}catch(g){let S=N||R,D=`> **Include Error** - couldn't include ${S}${C?` version ${C}`:""}: ${g.message}`;UJ("Include resolution failed for %s: %s",S,g.message),M=M.replace(k,D)}}return M};return Object.freeze({resolve:W,pinIncludes:async(X,P,w,T)=>{UJ("Auto-pinning unpinned includes in document: %s",T);let G=J(w),j=[],v=w;for(let M of G){let{fullMatch:f,id:k,path:N,versionStr:R}=M;if(R)continue;UJ("Pinning unpinned include: id=%s, path=%s",k,N);let E,C;if(k){E=k;let{entity:S}=await K.readDocument(X,P,{id:k,resolveIncludes:!1});C=S.getPublishedVersionNumber()}else{let S=T?T.charAt(0):"A",D=await K.readDocumentByPath(X,P,{path:N,type:"d",storeCode:S});if(!D)throw I.notFound(`Included document not found: ${N}`,"INCLUDE_NOT_FOUND");E=D.entity.getObjectId(),C=D.entity.getPublishedVersionNumber()}if(!C)throw I.validation(`Cannot pin include - document has no published version: ${E}`,"INCLUDE_NO_VERSION");let g=k?`<include id="${k}" version="${C}" />`:`<include path="${N}" version="${C}" />`;UJ("Pinned include %s to version %d",E,C),v=v.replace(f,g),j.push({id:E,path:N,version:C})}return UJ("Auto-pinned %d unpinned includes",j.length),{content:v,pinned:j}},checkIncludes:async(X,P,w,T)=>{let G=J(w),j=[];for(let v of G){let{id:M,path:f,versionStr:k}=v,N=k?parseInt(k,10):null,R,E;if(M){R=M;let{entity:C}=await K.readDocument(X,P,{id:M,resolveIncludes:!1});E=C.getPublishedVersionNumber()}else{let C=T?T.charAt(0):"A",g=await K.readDocumentByPath(X,P,{path:f,type:"d",storeCode:C});R=g?.entity?.getObjectId(),E=g?.entity?.getPublishedVersionNumber()}j.push({id:R,path:f||null,pinnedVersion:N,latestVersion:E,outdated:N!==null&&E!==null&&N<E})}return j},updateIncludes:async(X,P,w,T)=>{let G=J(w),j=[],v=w;for(let M of G){let{fullMatch:f,id:k,path:N,versionStr:R}=M,E=R?parseInt(R,10):null,C,g;if(k){C=k;let{entity:S}=await K.readDocument(X,P,{id:k,resolveIncludes:!1});g=S.getPublishedVersionNumber()}else{let S=T?T.charAt(0):"A",D=await K.readDocumentByPath(X,P,{path:N,type:"d",storeCode:S});C=D?.entity?.getObjectId(),g=D?.entity?.getPublishedVersionNumber()}if(g&&E!==g){let S=k?`<include id="${k}" version="${g}" />`:`<include path="${N}" version="${g}" />`;v=v.replace(f,S),j.push({id:C,path:N||null,fromVersion:E,toVersion:g})}}return{content:v,updated:j}}})},r08=Object.freeze({create:rh6});Z4();var qA8=o6(Gm(),1),YA8=o6(HB(),1),JA8=($)=>{if(!$)return{parameters:{},target:null,targetPath:null,targetParentId:null,targetName:null,targetRoot:null,targetStore:null,targetJobName:null,targetJobAgent:null,targetJobModel:null,targetJobWorktree:null,targetJobSkipDialog:!1,targetJobStreaming:!1,skipDialog:!1,body:""};let K=qA8.default($),q=K.data?.parameters||{},Y=K.data?.target||null,J=K.data?.targetPath||null,z=K.data?.targetParentId||null,W=K.data?.targetName||null,Z=K.data?.targetRoot||null,H=K.data?.targetStore||null,O=K.data?.targetJobName||null,X=K.data?.targetJobAgent||null,P=K.data?.targetJobModel||null,w=K.data?.targetJobWorktree||null,T=K.data?.targetJobSkipDialog??!1,G=K.data?.targetJobStreaming??!1,j=K.data?.skipDialog??!1,v=K.content;return{parameters:q,target:Y,targetPath:J,targetParentId:z,targetName:W,targetRoot:Z,targetStore:H,targetJobName:O,targetJobAgent:X,targetJobModel:P,targetJobWorktree:w,targetJobSkipDialog:T,targetJobStreaming:G,skipDialog:j,body:v}},yg6=($)=>{if(!$)return new Set;let K=new Set,q=new Set(["if","unless","each","with","lookup","log"]);try{let Y=YA8.default.parse($),J=(z,W=null,Z=null)=>{if(!z)return;if(z.type==="PathExpression"){if(z.data)return;let H=z.parts.join(".");if(!H||H.startsWith("@"))return;if(W?.type==="BlockStatement"&&Z==="path"||W?.type==="MustacheStatement"&&Z==="path"&&W.params?.length>0){if(q.has(H))return;return}K.add(H)}if(z.program)J(z.program,z,"program");if(z.inverse)J(z.inverse,z,"inverse");if(z.body)z.body.forEach((H)=>J(H,z,"body"));if(z.params)z.params.forEach((H)=>J(H,z,"params"));if(z.hash?.pairs)z.hash.pairs.forEach((H)=>J(H.value,z,"hash"));if(z.path)J(z.path,z,"path")};J(Y)}catch(Y){throw Error(`Invalid Handlebars template: ${Y.message}`)}return K},ug6=($)=>{if(!$)return{parameters:{},target:null,targetPath:null,targetParentId:null,targetName:null,targetRoot:null,targetStore:null,targetJobName:null,targetJobAgent:null,targetJobModel:null,targetJobWorktree:null,targetJobSkipDialog:!1,targetJobStreaming:!1,skipDialog:!1};let{parameters:K,target:q,targetPath:Y,targetParentId:J,targetName:z,targetRoot:W,targetStore:Z,targetJobName:H,targetJobAgent:O,targetJobModel:X,targetJobWorktree:P,targetJobSkipDialog:w,targetJobStreaming:T,skipDialog:G}=JA8($);return{parameters:K,target:q,targetPath:Y,targetParentId:J,targetName:z,targetRoot:W,targetStore:Z,targetJobName:H,targetJobAgent:O,targetJobModel:X,targetJobWorktree:P,targetJobSkipDialog:w,targetJobStreaming:T,skipDialog:G}},FK=Object.freeze({parseFrontMatter:JA8,extractVariables:yg6,getParameters:ug6});var OB=o6(HB(),1),mg6=($={})=>{return Object.freeze({renderTemplate:(Y,J={})=>{if(!Y)throw I.validation("Template content cannot be empty","EMPTY_TEMPLATE");let{body:z}=FK.parseFrontMatter(Y),W;try{W=OB.default.compile(z,{noEscape:!0})(J)}catch(Z){throw I.validation(`Failed to render template: ${Z.message}`,"RENDER_ERROR")}return W},extractTemplateParameters:(Y)=>{if(!Y)return{parameters:{},detectedVariables:[],target:null,targetPath:null,targetParentId:null,targetName:null,targetRoot:null,targetStore:null,targetJobName:null,targetJobAgent:null,targetJobModel:null,targetJobWorktree:null,targetJobSkipDialog:!1,targetJobStreaming:!1};let{parameters:J,target:z,targetPath:W,targetParentId:Z,targetName:H,targetRoot:O,targetStore:X,targetJobName:P,targetJobAgent:w,targetJobModel:T,targetJobWorktree:G,targetJobSkipDialog:j,targetJobStreaming:v,body:M}=FK.parseFrontMatter(Y),f=FK.extractVariables(M),k=Array.from(f);return{parameters:J,detectedVariables:k,target:z,targetPath:W,targetParentId:Z,targetName:H,targetRoot:O,targetStore:X,targetJobName:P,targetJobAgent:w,targetJobModel:T,targetJobWorktree:G,targetJobSkipDialog:j,targetJobStreaming:v}}})},zA8=Object.freeze({create:mg6});import _j from"node:fs";import WA8 from"node:os";import Yf from"node:path";var Bg6=({projectStore:$,storeStore:K})=>{return Object.freeze({createProject:async(z,W,{name:Z,path:H},O)=>{if(await $.readProjectByPath(z,W,H)){let g=Error("Project with this path already exists");throw g.code="DUPLICATE_PATH",g}let P=await $.createProject(z,W,{name:Z,path:H},O),w=await K.createLocalStore(z,W,{code:"A",name:"Project"},O);await w.createFolder(z,W,{parentId:null,name:"Documents",subtype:"root_d"},O),await w.createFolder(z,W,{parentId:null,name:"Templates",subtype:"root_t"},O),await w.createFolder(z,W,{parentId:null,name:"Stories",subtype:"root_s"},O),await w.createFolder(z,W,{parentId:null,name:"Jobs",subtype:"root_j"},O),await w.createFieldDefinition(z,W,{storeCode:"A",ownerEntityId:null,name:"state",label:"State",description:"Workflow state",primitiveType:"string",required:!1,multiplicity:"single",isSystem:!0},O);let T=await w.resolveEntityTypePk(z,W,{code:"f",subtype:"root_s"}),G=await w.createFieldDefinition(z,W,{storeCode:"A",ownerEntityId:null,ownerEntityTypePk:T,name:"states",label:"States",description:"Ordered list of valid story states",primitiveType:"string",required:!0,multiplicity:"multi",isSystem:!0},O),v=(await w.readStoryRootFolder(z,W,{storeCode:"A"})).getObjectId();await w.setFieldValue(z,W,{entityId:v,fieldDefinitionId:G.getObjectId(),values:[...vM]},O);let M=await w.resolveEntityTypePk(z,W,{code:"d",subtype:"task"});await w.createFieldDefinition(z,W,{storeCode:"A",ownerEntityId:null,ownerEntityTypePk:M,name:"dependsOn",label:"Depends On",description:"Tasks that block this task",primitiveType:"object_ref",required:!1,multiplicity:"multi",isSystem:!0},O);let f=await w.resolveEntityTypePk(z,W,{code:"d",subtype:"cartridge"});await w.createFieldDefinition(z,W,{storeCode:"A",ownerEntityId:null,ownerEntityTypePk:f,name:"synopsis",label:"Synopsis",description:"Brief description of the cartridge",primitiveType:"string",required:!1,multiplicity:"single",isSystem:!0},O),await w.createFieldDefinition(z,W,{storeCode:"A",ownerEntityId:null,ownerEntityTypePk:f,name:"relatedActivities",label:"Related Activities",description:"Associated activity types",primitiveType:"string",required:!1,multiplicity:"multi",isSystem:!0},O);let k=await w.resolveEntityTypePk(z,W,{code:"f",subtype:"tasks"});await w.createFieldDefinition(z,W,{storeCode:"A",ownerEntityId:null,ownerEntityTypePk:k,name:"states",label:"States",description:"Ordered list of valid task states",primitiveType:"string",required:!0,multiplicity:"multi",isSystem:!0},O);let N=await w.resolveEntityTypePk(z,W,{code:"t",subtype:"prompt"});await w.createFieldDefinition(z,W,{storeCode:"A",ownerEntityId:null,ownerEntityTypePk:N,name:"associatedType",label:"Associated Type",description:"Entity types this template is associated with",primitiveType:"string",required:!1,multiplicity:"multi",isSystem:!0},O);let R=await w.resolveEntityTypePk(z,W,{code:"s",subtype:null});await w.createFieldDefinition(z,W,{storeCode:"A",ownerEntityId:null,ownerEntityTypePk:R,name:"flag",label:"Flag",description:"Visual indicator for story attention",primitiveType:"string",required:!1,multiplicity:"single",isSystem:!0},O),await w.createFieldDefinition(z,W,{storeCode:"A",ownerEntityId:null,ownerEntityTypePk:R,name:"activeJobCount",label:"Active Job Count",description:"Number of active jobs associated with this story",primitiveType:"int",required:!1,multiplicity:"single",isSystem:!0},O),await w.createFieldDefinition(z,W,{storeCode:"A",ownerEntityId:null,ownerEntityTypePk:R,name:"statusMessage",label:"Status Message",description:"Agent status message displayed in stories list",primitiveType:"string",required:!1,multiplicity:"single",isSystem:!0},O);let E=await K.readSharedStore(z,W),C=await K.createDemuxStore(z,W,{name:Z},O);return await K.addChildToDemux(z,W,{demuxId:C.getObjectId(),childId:w.getObjectId()},O),await K.addChildToDemux(z,W,{demuxId:C.getObjectId(),childId:E.getObjectId()},O),await K.addStoresToProject(z,W,{projectId:P.getObjectId(),rootStoreId:C.getObjectId(),storeIds:[C.getObjectId(),w.getObjectId(),E.getObjectId()]}),P},validateProjectPath:(z)=>{if(!z||typeof z!=="string"){let w=Error("Path is required and must be a non-empty string");throw w.code="VALIDATION_ERROR",w}let W;if(z==="~")W=WA8.homedir();else if(z.startsWith("~/"))W=Yf.join(WA8.homedir(),z.slice(2));else W=z;let Z=_j.existsSync(W),H=!1,O=!1,X=!1;if(Z)try{if(H=_j.statSync(W).isDirectory(),H){let T=Yf.join(W,".git");try{O=_j.statSync(T).isDirectory()}catch{O=!1}let G=Yf.join(W,".claude");try{X=_j.statSync(G).isDirectory()}catch{X=!1}}}catch(w){H=!1}let P=Yf.basename(W);return{path:W,exists:Z,isDirectory:H,hasGit:O,hasClaude:X,suggestedName:P}},listProjects:async(z)=>{let W=await z.selectFrom("projects").selectAll().where("name","!=","__system__").orderBy("created_at","desc").execute();return await Promise.all(W.map(async(H)=>{let X=(await z.selectFrom("project_stores").innerJoin("stores","stores.id","project_stores.store_id").select(["stores.object_id","stores.code","stores.name","stores.type"]).where("project_stores.project_id","=",H.id).where("stores.type","=","local").execute()).map((P)=>({id:P.code==="B"?"store:B":`store:${P.code}:${H.object_id}`,code:P.code,name:P.name}));return{objectId:H.object_id,name:H.name,path:H.path,createdAt:H.created_at,updatedAt:H.updated_at,children:X}}))}})},Jf=Object.freeze({create:Bg6});var Ug6=()=>{let $=[];return{enqueuePostCommitHook:(K)=>{$.push(K)},flush:()=>{for(let K of $)try{K()}catch(q){console.error("Post-commit hook failed:",q)}}}},pg6=({db:$,folderService:K,fieldService:q,documentService:Y,templateService:J,projectService:z,clipboardService:W,storyService:Z,assetService:H,jobService:O,includeResolver:X,worktreeService:P})=>{let w=async(M8)=>{let x8=Ug6(),B8;return await $.transaction().execute(async(F8)=>{B8=await M8(F8,x8.enqueuePostCommitHook)}),x8.flush(),B8};return Object.freeze({createFolder:async(M8,{mode:x8,store:B8,path:F8,root:l8,parentId:Y8,name:W8,type:J8})=>{return w(async(c8,o)=>{return await K.createFolder(c8,M8,{mode:x8,store:B8,path:F8,root:l8,parentId:Y8,name:W8,type:J8},o)})},renameFolder:async(M8,{id:x8,name:B8})=>{return w(async(F8,l8)=>{return await K.renameFolder(F8,M8,{id:x8,name:B8},l8)})},moveFolder:async(M8,{id:x8,parentId:B8})=>{return w(async(F8,l8)=>{return await K.moveFolder(F8,M8,{id:x8,parentId:B8},l8)})},deleteFolder:async(M8,{id:x8})=>{return w(async(B8,F8)=>{return await K.deleteFolder(B8,M8,{id:x8},F8)})},createProject:async(M8,{name:x8,path:B8})=>{return w(async(F8,l8)=>{return await z.createProject(F8,M8,{name:x8,path:B8},l8)})},createFieldDefinition:async(M8,{store:x8,ownerEntityId:B8,ownerEntityTypeCode:F8,ownerEntityTypeSubtype:l8,name:Y8,label:W8,description:J8,primitiveType:c8,required:o,multiplicity:X8,isSystem:t})=>{return w(async(G8,z8)=>{return await q.createFieldDefinition(G8,M8,{store:x8,ownerEntityId:B8,ownerEntityTypeCode:F8,ownerEntityTypeSubtype:l8,name:Y8,label:W8,description:J8,primitiveType:c8,required:o,multiplicity:X8,isSystem:t},z8)})},setFieldValue:async(M8,{entityId:x8,fieldDefinitionId:B8,fieldName:F8,value:l8,values:Y8})=>{return w(async(W8,J8)=>{return await q.setFieldValue(W8,M8,{entityId:x8,fieldDefinitionId:B8,fieldName:F8,value:l8,values:Y8},J8)})},deleteFieldValue:async(M8,{entityId:x8,fieldDefinitionId:B8,fieldName:F8})=>{return w(async(l8,Y8)=>{return await q.deleteFieldValue(l8,M8,{entityId:x8,fieldDefinitionId:B8,fieldName:F8},Y8)})},deleteFieldDefinition:async(M8,{id:x8})=>{return w(async(B8,F8)=>{return await q.deleteFieldDefinition(B8,M8,{id:x8},F8)})},createDocument:async(M8,{mode:x8,store:B8,path:F8,root:l8,parentId:Y8,name:W8,type:J8,content:c8,tree:o,subtype:X8,fields:t})=>{return w(async(G8,z8)=>{return await Y.createDocument(G8,M8,{mode:x8,store:B8,path:F8,root:l8,parentId:Y8,name:W8,type:J8,content:c8,tree:o,subtype:X8,fields:t},z8)})},createTemplate:async(M8,{mode:x8,store:B8,path:F8,root:l8,parentId:Y8,name:W8,content:J8,subtype:c8})=>{return w(async(o,X8)=>{return await Y.createTemplate(o,M8,{mode:x8,store:B8,path:F8,root:l8,parentId:Y8,name:W8,content:J8,subtype:c8},X8)})},updateDocumentPath:async(M8,{id:x8,path:B8,parentId:F8,type:l8})=>{return w(async(Y8,W8)=>{return await Y.updateDocumentPath(Y8,M8,{id:x8,path:B8,parentId:F8,type:l8},W8)})},deleteDocument:async(M8,{id:x8})=>{return w(async(B8,F8)=>{return await Y.deleteDocument(B8,M8,{id:x8},F8)})},saveDraft:async(M8,{id:x8,content:B8,sessionId:F8})=>{return w(async(l8,Y8)=>{return await Y.saveDraft(l8,M8,{id:x8,content:B8,sessionId:F8},Y8)})},publishDocument:async(M8,{id:x8,sessionId:B8})=>{return w(async(F8,l8)=>{return await Y.publishDocument(F8,M8,{id:x8,sessionId:B8},l8)})},discardDraft:async(M8,{id:x8})=>{return w(async(B8,F8)=>{return await Y.discardDraft(B8,M8,{id:x8},F8)})},setEditState:async(M8,{id:x8,sessionId:B8})=>{return w(async(F8,l8)=>{return await Y.setEditState(F8,M8,{id:x8,sessionId:B8},l8)})},clearEditState:async(M8,{id:x8})=>{return w(async(B8,F8)=>{return await Y.clearEditState(B8,M8,{id:x8},F8)})},editDocument:async(M8,{id:x8,operation:B8,preview:F8,ignoreContent:l8,sessionId:Y8})=>{return w(async(W8,J8)=>{return await Y.editDocument(W8,M8,{id:x8,operation:B8,preview:F8,ignoreContent:l8,sessionId:Y8},J8)})},batchEditDocument:async(M8,{id:x8,operations:B8,preview:F8,ignoreContent:l8,sessionId:Y8})=>{return w(async(W8,J8)=>{return await Y.batchEditDocument(W8,M8,{id:x8,operations:B8,preview:F8,ignoreContent:l8,sessionId:Y8},J8)})},checkChecklistItem:async(M8,{id:x8,lineNumber:B8,checked:F8,includeDraft:l8,preview:Y8,sessionId:W8})=>{return w(async(J8,c8)=>{return await Y.checkChecklistItem(J8,M8,{id:x8,lineNumber:B8,checked:F8,includeDraft:l8,preview:Y8,sessionId:W8},c8)})},toggleChecklistItem:async(M8,{id:x8,lineNumber:B8,includeDraft:F8,preview:l8,sessionId:Y8})=>{return w(async(W8,J8)=>{return await Y.toggleChecklistItem(W8,M8,{id:x8,lineNumber:B8,includeDraft:F8,preview:l8,sessionId:Y8},J8)})},batchCheckChecklistItems:async(M8,{id:x8,items:B8,includeDraft:F8,preview:l8,sessionId:Y8})=>{return w(async(W8,J8)=>{return await Y.batchCheckChecklistItems(W8,M8,{id:x8,items:B8,includeDraft:F8,preview:l8,sessionId:Y8},J8)})},specialiseDocument:async(M8,{id:x8,subtype:B8,fields:F8})=>{return w(async(l8,Y8)=>{return await Y.specialiseDocument(l8,M8,{id:x8,subtype:B8,fields:F8},Y8)})},generaliseDocument:async(M8,{id:x8})=>{return w(async(B8,F8)=>{return await Y.generaliseDocument(B8,M8,{id:x8},F8)})},renderTemplate:async(M8,{id:x8,params:B8,target:F8,targetOptions:l8,sessionId:Y8})=>{let{entity:W8}=await Y.readDocument($,M8,{id:x8,resolveIncludes:!1});if(!W8.getPublishedContent())throw(await Promise.resolve().then(() => (Z4(),vO))).default.validation("Template has no published content","NO_PUBLISHED_CONTENT");let J8=W8.getPublishedContent(),{target:c8,targetPath:o,targetParentId:X8,targetName:t,targetRoot:G8,targetStore:z8,targetJobName:k8,targetJobAgent:b8,targetJobModel:Q8,targetJobWorktree:l6,targetJobStreaming:D4}=J.extractTemplateParameters(J8),K3=F8||c8||"stdout",B1=l8?.parentId||l8?.root||l8?.path?{path:l8?.path,parentId:l8?.parentId,name:l8?.name,root:l8?.root,store:l8?.store,publish:l8?.publish}:{path:l8?.path||o,parentId:l8?.parentId||X8,name:l8?.name||t,root:l8?.root||G8,store:l8?.store||z8,publish:l8?.publish},L$=J8;if(X)L$=await X.resolve($,M8,J8,x8);let f$=J.renderTemplate(L$,B8||{});if(B1.path)B1.path=J.renderTemplate(B1.path,B8||{});if(B1.name)B1.name=J.renderTemplate(B1.name,B8||{});switch(K3){case"stdout":return{content:f$,target:"stdout"};case"clipboard":return await W.copyToClipboard(f$),{target:"clipboard",message:"Copied to clipboard"};case"document":return w(async(C8,$8)=>{let E8=(await Promise.resolve().then(() => (Z4(),vO))).default,L8;if(B1.parentId){if(!B1.name)throw E8.validation("targetOptions.name is required when parentId is provided","MISSING_TARGET_NAME");L8={mode:"parentName",parentId:B1.parentId,name:B1.name,content:f$}}else if(B1.root){if(!B1.path)throw E8.validation("targetOptions.path is required when root is provided","MISSING_TARGET_PATH");L8={mode:"rootRelative",root:B1.root,path:B1.path,content:f$}}else{if(!B1.path)throw E8.validation("targetOptions.path is required for document target","MISSING_TARGET_PATH");L8={mode:"fullPath",store:B1.store||"A",path:B1.path,content:f$}}let m8=await Y.createDocument(C8,M8,L8,$8);if(B1.publish)await Y.publishDocument(C8,M8,{id:m8.getObjectId(),sessionId:Y8},$8);return{content:f$,target:"document",documentId:m8.getObjectId(),documentPath:B1.path||B1.name,published:!!B1.publish}});case"job":return w(async(C8,$8)=>{let E8=(await Promise.resolve().then(() => (Z4(),vO))).default;if(!f$||!f$.trim())throw E8.validation("Template rendered to empty prompt","MISSING_PROMPT");let L8=l8?.jobName||k8,m8=l8?.jobAgent||b8||"claude",_6=l8?.jobModel||Q8,x=l8?.jobWorktree||l6,w8=l8?.jobStreaming??D4,u=l8?.objectId||B8?.["object-id"],s=null;if(L8)s=J.renderTemplate(L8,B8||{});let Q=null;if(x&&P){let{worktrees:d}=await P.listWorktrees({projectPath:M8.projectPath}),H8=d.find((v8)=>v8.branch===x);if(!H8)throw E8.validation(`Worktree with branch '${x}' not found`,"WORKTREE_NOT_FOUND");Q=H8.path}let a=w1.extractStoreCode(x8),n=await O.createJob(C8,M8,{store:a,name:s,agent:m8,model:_6,prompt:f$,workingDirectory:Q,objectId:u,streaming:w8},$8);return{target:"job",jobId:n.id,jobName:n.name}});case"file":throw(await Promise.resolve().then(() => (Z4(),vO))).default.validation("file target not yet implemented","NOT_IMPLEMENTED");default:throw(await Promise.resolve().then(() => (Z4(),vO))).default.validation(`Unknown target: ${K3}`,"INVALID_TARGET")}},createStory:async(M8,{name:x8,storeCode:B8,state:F8})=>{return w(async(l8,Y8)=>{return await Z.createStory(l8,M8,{store:B8,name:x8,state:F8},Y8)})},renameStory:async(M8,{id:x8,name:B8})=>{return w(async(F8,l8)=>{return await Z.renameStory(F8,M8,{id:x8,name:B8},l8)})},updateStoryState:async(M8,{id:x8,state:B8})=>{return w(async(F8,l8)=>{return await Z.updateStoryState(F8,M8,{id:x8,state:B8},l8)})},deleteStory:async(M8,{id:x8})=>{return w(async(B8,F8)=>{return await Z.deleteStory(B8,M8,{id:x8},F8)})},incrementStoryJobCount:async(M8,{id:x8})=>{return w(async(B8,F8)=>{return await Z.incrementActiveJobCount(B8,M8,{id:x8},F8)})},decrementStoryJobCount:async(M8,{id:x8})=>{return w(async(B8,F8)=>{return await Z.decrementActiveJobCount(B8,M8,{id:x8},F8)})},createAsset:async(M8,{store:x8,buffer:B8,mimeType:F8,originalFilename:l8,widthPx:Y8,heightPx:W8,displayWidth:J8,displayHeight:c8})=>{return w(async(o,X8)=>{return await H.createAsset(o,M8,{store:x8,buffer:B8,mimeType:F8,originalFilename:l8,widthPx:Y8,heightPx:W8,displayWidth:J8,displayHeight:c8},X8)})},deleteAsset:async(M8,{id:x8})=>{return w(async(B8,F8)=>{return await H.deleteAsset(B8,M8,{id:x8},F8)})},createJob:async(M8,{store:x8,name:B8,agent:F8,model:l8,prompt:Y8,workingDirectory:W8,objectId:J8,streaming:c8})=>{return w(async(o,X8)=>{return await O.createJob(o,M8,{store:x8,name:B8,agent:F8,model:l8,prompt:Y8,workingDirectory:W8,objectId:J8,streaming:c8},X8)})},deleteJob:async(M8,{id:x8})=>{return w(async(B8,F8)=>{return await O.deleteJob(B8,M8,{id:x8},F8)})},updateJobStatus:async(M8,{id:x8,status:B8,exitCode:F8,errorMessage:l8})=>{return w(async(Y8,W8)=>{return await O.updateJobStatus(Y8,M8,{id:x8,status:B8,exitCode:F8,errorMessage:l8},W8)})},updateJobOutput:async(M8,{id:x8,output:B8})=>{return w(async(F8,l8)=>{return await O.updateJobOutput(F8,M8,{id:x8,output:B8},l8)})},updateJobTokens:async(M8,{id:x8,tokensUsed:B8})=>{return w(async(F8,l8)=>{return await O.updateJobTokens(F8,M8,{id:x8,tokensUsed:B8},l8)})},updateJobMetadata:async(M8,{id:x8,durationMs:B8,totalCostUsd:F8,numTurns:l8,sessionId:Y8})=>{return w(async(W8,J8)=>{return await O.updateJobMetadata(W8,M8,{id:x8,durationMs:B8,totalCostUsd:F8,numTurns:l8,sessionId:Y8},J8)})},continueJob:async(M8,{id:x8,prompt:B8,model:F8})=>{return w(async(l8,Y8)=>{return await O.continueJob(l8,M8,{id:x8,prompt:B8,model:F8},Y8)})},setJobPid:async(M8,{id:x8,pid:B8})=>{return w(async(F8,l8)=>{return await O.setJobPid(F8,M8,{id:x8,pid:B8},l8)})},clearJobPid:async(M8,{id:x8})=>{return w(async(B8,F8)=>{return await O.clearJobPid(B8,M8,{id:x8},F8)})},renameJob:async(M8,{id:x8,name:B8})=>{return w(async(F8,l8)=>{return await O.renameJob(F8,M8,{id:x8,name:B8},l8)})}})},XB=Object.freeze({create:pg6});Z4();var jB8=o6(wB8(),1),vB8=o6(I4(),1);import m$ from"fs/promises";import h$ from"path";import{createWriteStream as J21}from"fs";import z21 from"crypto";var R3=vB8.default("caw:export"),TB8=".caw-exports",GB8=".tmp",W21=2,Z21=({store:$,folderService:K,documentService:q,templateService:Y,storyService:J,assetService:z,assetsDir:W})=>{let Z=()=>{let R=new Date,E=R.getFullYear(),C=String(R.getMonth()+1).padStart(2,"0"),g=String(R.getDate()).padStart(2,"0"),S=String(R.getHours()).padStart(2,"0"),D=String(R.getMinutes()).padStart(2,"0"),L=String(R.getSeconds()).padStart(2,"0");return`${E}-${C}-${g}-${S}${D}${L}`},H=async(R)=>{let E=h$.join(R,TB8),C=h$.join(E,GB8);try{return await m$.mkdir(E,{recursive:!0}),await m$.mkdir(C,{recursive:!0}),E}catch(g){if(g.code==="EACCES")throw I.validation("Permission denied creating export directory","EXPORT_ERROR");if(g.code==="ENOSPC")throw I.validation("Insufficient disk space","EXPORT_ERROR");throw R3("Error creating export directory: [%s] %s",g.code||"UNKNOWN",g.message),I.validation(`Failed to create export directory: ${g.message} (${g.code||"UNKNOWN"})`,"EXPORT_ERROR")}},O=async(R,E,C,g)=>{let S=[],D=async(L,m)=>{let c=await K.listFolderContents(R,E,{folderId:L,type:C,storeCode:g});for(let e of c)if(e.getParentId()!==null)S.push({entity:e,depth:m,contentType:C}),await D(e.getObjectId(),m+1)};return await D(null,0),S},X=async(R,E,C)=>{let g=[],S=[],D=async(L)=>{let m=await q.listDocuments(R,E,{parentId:L,storeCode:C});for(let e of m){let _8=e.getPublishedVersionNumber();if(_8!==null){let T8=await q.readVersion(R,E,{id:e.getObjectId(),versionNumber:_8});g.push({entity:e,version:T8})}else S.push(e)}let c=await K.listFolderContents(R,E,{folderId:L,type:"d",storeCode:C});for(let e of c)await D(e.getObjectId())};return await D(null),{published:g,draftOnly:S}},P=async(R,E,C)=>{let g=[],S=[],D=async(L)=>{let m=await q.listDocuments(R,E,{parentId:L,storeCode:C,type:"t"});for(let e of m){let _8=e.getPublishedVersionNumber();if(_8!==null){let T8=await q.readVersion(R,E,{id:e.getObjectId(),versionNumber:_8});g.push({entity:e,version:T8})}else S.push(e)}let c=await K.listFolderContents(R,E,{folderId:L,type:"t",storeCode:C});for(let e of c)await D(e.getObjectId())};return await D(null),{published:g,draftOnly:S}},w=async(R,E,C)=>{let g=await z.listAssets(R,E,{store:C}),S=[];for(let D of g){let L=D.hash,m=L.substring(0,2),c=h$.join(W,m,L);try{let e=await m$.readFile(c);S.push({entity:D,buffer:e})}catch(e){if(e.code==="ENOENT"){R3("Warning: Skipping asset %s - blob file missing",D.id);continue}throw e}}return R3("Collected %d assets for export",S.length),S},T=new Set(["draft_version","latest_published_version"]),G=(R)=>{let E=typeof R.getFields==="function"?R.getFields():R.fields;if(!E||typeof E!=="object"||Object.keys(E).length===0)return;let C={};for(let[g,S]of Object.entries(E)){if(T.has(g))continue;let D;if(typeof S?.getValues==="function")D=S.getValues();else if(Array.isArray(S))D=S;else D=[S];C[g]=D.length===1?D[0]:D}return Object.keys(C).length>0?C:void 0},j=async(R,E,C)=>{let g=[],S=[],D={published:[],draftOnly:[]};if(!J)return R3("StoryService not available, skipping story export"),{stories:g,folders:S,documents:D};let L=await J.listStories(R,E,{store:C});R3("Found %d stories for export",L.length);for(let m of L)g.push(m),await v(R,E,m,C,S,D);return{stories:g,folders:S,documents:D}},v=async(R,E,C,g,S,D)=>{let L=C.id||C.getObjectId?.()||C,m=await $.listFolderContents(R,E,{folderId:L,type:"s",storeCode:g});for(let e of m){if(e.getParentId()!==null)S.push({entity:e,contentType:"s"});await v(R,E,e.getObjectId(),g,S,D)}let c=await q.listDocuments(R,E,{parentId:L,storeCode:g});for(let e of c){let _8=e.getPublishedVersionNumber();if(_8!==null){let T8=await q.readVersion(R,E,{id:e.getObjectId(),versionNumber:_8});D.published.push({entity:e,version:T8})}else D.draftOnly.push(e)}},M=async(R)=>{try{await m$.rm(R,{recursive:!0,force:!0})}catch(E){R3("Warning: Failed to cleanup temp directory: %s",E.message)}};return Object.freeze({listExports:async(R,E,{projectPath:C})=>{let g=h$.join(C,TB8);try{let S=await m$.readdir(g),D=[];for(let L of S)if(L.endsWith(".zip")){let m=h$.join(g,L),c=await m$.stat(m);D.push({filename:L,timestamp:c.mtime.toISOString(),size:c.size})}return R3("Found %d export files",D.length),D}catch(S){if(S.code==="ENOENT")return[];throw S}},exportPreview:async(R,E,{storeCode:C})=>{let g=await O(R,E,"d",C),S=await O(R,E,"t",C),{published:D,draftOnly:L}=await X(R,E,C),{published:m,draftOnly:c}=await P(R,E,C),_8={assets:(z?await z.listAssets(R,E,{store:C}):[]).map((D8)=>({id:D8.id,originalFilename:D8.originalFilename,mimeType:D8.mimeType,sizeBytes:D8.sizeBytes})),folders:[...g,...S].map((D8)=>({id:D8.entity.getObjectId(),path:D8.entity.getPath(),name:D8.entity.getName()})),documents:D.map((D8)=>({id:D8.entity.getObjectId(),path:D8.entity.getPath(),name:D8.entity.getName()})),templates:m.map((D8)=>({id:D8.entity.getObjectId(),path:D8.entity.getPath(),name:D8.entity.getName()}))},T8={documents:L.map((D8)=>({id:D8.getObjectId(),path:D8.getPath(),name:D8.getName()})),templates:c.map((D8)=>({id:D8.getObjectId(),path:D8.getPath(),name:D8.getName()}))},d8=_8.assets.length+_8.folders.length+_8.documents.length+_8.templates.length,H6=T8.documents.length+T8.templates.length;return R3("Preview: %d published (%d assets), %d draft-only",d8,_8.assets.length,H6),{toExport:_8,draftOnly:T8}},exportDocuments:async(R,E,{storeCode:C,projectPath:g})=>{R3("Starting export for store %s",C);let S=await H(g),D=z21.randomUUID(),L=h$.join(S,GB8,D);await m$.mkdir(L,{recursive:!0});try{let m=await O(R,E,"d",C),c=await O(R,E,"t",C),e=[...m,...c],{published:_8,draftOnly:T8}=await X(R,E,C),{published:d8,draftOnly:H6}=await P(R,E,C),D8=z?await w(R,E,C):[],{stories:y8,folders:o8,documents:Z6}=await j(R,E,C),M6=[...e,...o8],u6=[..._8,...Z6.published],y6=[...T8,...Z6.draftOnly];R3("Found %d folders, %d documents, %d templates, %d assets, %d stories",M6.length,u6.length,d8.length,D8.length,y8.length);let s6={},L6=await $.readStoryRootFolder(R,E,{storeCode:C});if(L6){let h8=L6.toJSON(),p8=G(h8);if(p8&&Object.keys(p8).length>0)s6[L6.getObjectId()]={subtype:"root_s",fields:p8}}let P8=[...D8.map((h8)=>({id:h8.entity.id,type:"asset",hash:h8.entity.hash,mimeType:h8.entity.mimeType,sizeBytes:h8.entity.sizeBytes,originalFilename:h8.entity.originalFilename,widthPx:h8.entity.widthPx,heightPx:h8.entity.heightPx,displayWidth:h8.entity.displayWidth,displayHeight:h8.entity.displayHeight})),...y8.map((h8)=>{let p8={id:h8.id,type:"story",name:h8.name},s8=G(h8);if(s8)p8.fields=s8;return p8}),...M6.map((h8)=>{let p8={id:h8.entity.getObjectId(),type:"folder",path:h8.entity.getPath(),contentType:h8.contentType},s8=h8.entity.getSubtype?.();if(s8)p8.subtype=s8;let q6=G(h8.entity);if(q6)p8.fields=q6;return p8}),...u6.map((h8)=>{let p8={id:h8.entity.getObjectId(),type:"document",path:h8.entity.getPath()},s8=h8.entity.getSubtype?.();if(s8)p8.subtype=s8;else{let X6=h8.entity.getPath(),f6=X6.split("/");if(f6.length>=4&&f6[2]==="tasks")R3('WARN: Document %s in tasks folder missing subtype, inferring "task"',X6),p8.subtype="task"}let q6=G(h8.entity);if(q6)p8.fields=q6;return p8}),...d8.map((h8)=>{let p8={id:h8.entity.getObjectId(),type:"template",path:h8.entity.getPath()},s8=h8.entity.getSubtype?.();if(s8)p8.subtype=s8;let q6=G(h8.entity);if(q6)p8.fields=q6;return p8})],O8={version:W21,exportedAt:new Date().toISOString(),entities:P8};if(Object.keys(s6).length>0)O8.rootFolderFields=s6;await m$.writeFile(h$.join(L,"manifest.json"),JSON.stringify(O8,null,2),"utf-8");for(let h8 of M6){if(h8.entity.getParentId()===null)continue;let p8=h$.join(L,h8.entity.getPath());await m$.mkdir(p8,{recursive:!0})}await m$.mkdir(h$.join(L,"Documents"),{recursive:!0}),await m$.mkdir(h$.join(L,"Templates"),{recursive:!0}),await m$.mkdir(h$.join(L,"Stories"),{recursive:!0});for(let h8 of u6){let p8=h$.join(L,h8.entity.getPath()),s8=h8.version.content;await m$.mkdir(h$.dirname(p8),{recursive:!0}),await m$.writeFile(p8,s8,"utf-8")}for(let h8 of d8){let p8=h$.join(L,h8.entity.getPath()),s8=h8.version.content;await m$.mkdir(h$.dirname(p8),{recursive:!0}),await m$.writeFile(p8,s8,"utf-8")}if(D8.length>0){let h8=h$.join(L,"assets");await m$.mkdir(h8,{recursive:!0});for(let p8 of D8){let s8=p8.entity.id,q6=h$.join(h8,`${s8}.bin`);await m$.writeFile(q6,p8.buffer);let X6=h$.join(h8,`${s8}.json`);await m$.writeFile(X6,JSON.stringify({id:s8,hash:p8.entity.hash,mimeType:p8.entity.mimeType,sizeBytes:p8.entity.sizeBytes,originalFilename:p8.entity.originalFilename,widthPx:p8.entity.widthPx,heightPx:p8.entity.heightPx,displayWidth:p8.entity.displayWidth,displayHeight:p8.entity.displayHeight},null,2),"utf-8")}}for(let h8 of P8){if(h8.type==="folder"||h8.type==="story")continue;let p8;if(h8.type==="asset")p8=h$.join(L,"assets",`${h8.id}.bin`);else if(h8.type==="document"||h8.type==="template")p8=h$.join(L,h8.path);else{R3("Unknown entity type in validation: %s",h8.type);continue}try{await m$.access(p8)}catch(s8){throw I.validation(`Manifest entry missing file: ${h8.id||h8.path}`,"EXPORT_VALIDATION_FAILED")}}let f8=`caw-export-${Z()}.zip`,u8=h$.join(S,f8),i8=J21(u8),a8=jB8.default("zip",{zlib:{level:9}});a8.on("error",async(h8)=>{throw await M(L),R3("Zip creation error: %s",h8.message),I.validation(`Export failed: ${h8.message}`,"EXPORT_ERROR")}),a8.pipe(i8),a8.directory(L,!1),await a8.finalize(),await new Promise((h8,p8)=>{i8.on("close",h8),i8.on("error",p8),setTimeout(()=>{p8(Error("Zip creation timeout"))},60000)}),R3("Created zip: %s (%d bytes)",f8,a8.pointer()),await M(L);let z6=P8.length;return R3("Export complete: %s (%d entities)",f8,z6),{success:!0,filename:f8,path:u8,counts:{assets:D8.length,stories:y8.length,folders:M6.length,documents:u6.length,templates:d8.length},draftOnlySkipped:{documents:y6.length,templates:H6.length}}}catch(m){throw await M(L),m}}})},VB8=Object.freeze({create:Z21});Z4();var tB8=o6(rB8(),1),eB8=o6(I4(),1);import Tq from"fs/promises";import s5 from"path";import b21 from"crypto";var P1=eB8.default("caw:import"),rl=($)=>{if(!$||typeof $!=="string")throw Error(`Invalid export path: ${$}`);let K={Documents:"d",Templates:"t",Stories:"s"},q=$.indexOf("/");if(q===-1){let z=K[$];if(z)return{path:"",type:z};throw Error(`Invalid export path: ${$}`)}let Y=$.slice(0,q),J=K[Y];if(!J)throw Error(`Unknown root folder: ${Y}`);return{path:$.slice(q+1),type:J}},sl=".caw-exports",sB8=".tmp",y21=[1,2],u21=/\b([A-Z][adtfns]\d+)\b/g,m21=({store:$,folderService:K,documentService:q,templateService:Y,storyService:J,fieldService:z,assetService:W,assetsDir:Z})=>{let H=(v,M)=>{if(!v)return v;return v.replace(u21,(f,k)=>{return M[k]??f})},O=(v)=>{if(!Array.isArray(v))return!1;if(v.length!==Oz.length)return!0;return!v.every((M,f)=>M===Oz[f])},X=async(v,M,f,k,N,R)=>{if(!k||typeof k!=="object"||!z)return;for(let[E,C]of Object.entries(k)){if(E==="activeJobCount")continue;let g=E==="dependsOn",S=C;if(g)if(Array.isArray(C))S=C.map((D)=>N[D]||D);else S=N[C]||C;if(Array.isArray(S))await z.setFieldValue(v,M,{entityId:f,fieldName:E,values:S},R);else await z.setFieldValue(v,M,{entityId:f,fieldName:E,value:S},R)}},P=async(v)=>{try{await Tq.rm(v,{recursive:!0,force:!0})}catch(M){P1("Warning: Failed to cleanup temp directory: %s",M.message)}},w=async(v,M,{storeCode:f})=>{let k=await K.listFolderContents(v,M,{folderId:null,type:"d",storeCode:f}),N=await K.listFolderContents(v,M,{folderId:null,type:"t",storeCode:f}),R=await q.listDocuments(v,M,{parentId:null,storeCode:f,type:"d"}),E=await q.listDocuments(v,M,{parentId:null,storeCode:f,type:"t"}),C=k.length===0&&N.length===0&&R.length===0&&E.length===0;return P1("Store %s empty check: %s",f,C),C},T=async(v,M,{tempPath:f,storeCode:k,idMapping:N,enqueuePostCommitHook:R})=>{let E=s5.join(f,"assets"),C;try{C=await Tq.readdir(E)}catch(D){if(D.code==="ENOENT")return P1("No assets directory in export"),0;throw D}let g=C.filter((D)=>D.endsWith(".json"));if(P1("Found %d assets to import",g.length),!W||!Z){if(g.length>0)throw I.validation("Export contains assets but asset service is not configured","ASSET_SERVICE_MISSING");return 0}let S=0;for(let D of g){let L=s5.join(E,D),m=await Tq.readFile(L,"utf-8"),c=JSON.parse(m),e=D.replace(".json",".bin"),_8=s5.join(E,e),T8=await Tq.readFile(_8),d8=await W.createAsset(v,M,{store:k,buffer:T8,mimeType:c.mimeType,originalFilename:c.originalFilename,widthPx:c.widthPx,heightPx:c.heightPx,displayWidth:c.displayWidth,displayHeight:c.displayHeight},R);N[c.id]=d8.id,S++}return P1("Imported %d assets",S),S},G=async(v,M,{manifest:f,tempPath:k,storeCode:N})=>{return P1("Starting transaction..."),await v.transaction().execute(async(R)=>{let E={},C=(y8)=>{},g=await T(R,M,{tempPath:k,storeCode:N,idMapping:E,enqueuePostCommitHook:C});if(P1("Phase 0 complete - imported %d assets",g),f.rootFolderFields&&z){P1("Phase 0.25: Restoring root folder fields");for(let[y8,o8]of Object.entries(f.rootFolderFields)){let Z6;if(o8.subtype==="root_s")Z6=await $.readStoryRootFolder(R,M,{storeCode:N});if(Z6&&o8.fields){for(let[M6,u6]of Object.entries(o8.fields))if(Array.isArray(u6))await z.setFieldValue(R,M,{entityId:Z6.getObjectId(),fieldName:M6,values:u6},C);else await z.setFieldValue(R,M,{entityId:Z6.getObjectId(),fieldName:M6,value:u6},C);P1("Restored fields for root folder %s (%s)",Z6.getObjectId(),o8.subtype)}}P1("Phase 0.25 complete - restored root folder fields")}let S=f.entities.filter((y8)=>y8.type==="story"),D=0,L={};if(S.length>0&&J){P1("Phase 0.5: Creating %d stories",S.length);let y8=f.entities.filter((o8)=>o8.type==="folder"&&o8.subtype==="tasks");for(let o8 of y8){let Z6=o8.path.split("/");if(Z6.length>=3&&Z6[0]==="Stories"){let M6=Z6[1];L[M6]=o8.id}}for(let o8 of S){let Z6=o8.fields?.state||"waiting",M6=await J.createStory(R,M,{store:N,name:o8.name,state:Z6},C);if(E[o8.id]=M6.id,o8.fields&&f.version>=2)await X(R,M,M6.id,o8.fields,E,C);let u6=L[o8.name];if(u6&&M6.tasksFolder){E[u6]=M6.tasksFolder.id;let y6=f.entities.find((s6)=>s6.id===u6);if(y6?.fields?.states){let s6=y6.fields.states;if(O(Array.isArray(s6)?s6:[s6]))await z.setFieldValue(R,M,{entityId:M6.tasksFolder.id,fieldName:"states",values:Array.isArray(s6)?s6:[s6]},C)}}D++}P1("Phase 0.5 complete - created %d stories",D)}let m=f.entities.filter((y8)=>y8.type==="folder"&&y8.subtype!=="tasks");P1("Phase 1: Creating %d folders (excluding tasks folders)",m.length);let c=0;for(let y8 of m){let{path:o8,type:Z6}=rl(y8.path);if(!o8)continue;if(E[y8.id])continue;let M6;if(Z6==="s"){let u6=o8.split("/"),y6=u6[u6.length-1],s6=u6.slice(0,-1).join("/"),L6;if(u6.length===1){P1("Unexpected folder directly under Stories root: %s",o8);continue}else if(u6.length===2){let P8=u6[0],O8=f.entities.find((f8)=>f8.type==="story"&&f8.name===P8);if(O8&&E[O8.id])L6=E[O8.id]}else{let P8=f.entities.find((O8)=>O8.type==="folder"&&O8.path===`Stories/${s6}`);if(P8&&E[P8.id])L6=E[P8.id]}if(!L6){P1("Could not resolve parent for story folder: %s",y8.path);continue}M6=await K.createFolder(R,M,{mode:"parentName",parentId:L6,name:y6},C)}else M6=await K.createFolder(R,M,{store:N,path:o8,type:Z6},C);if(E[y8.id]=M6.getObjectId(),y8.fields&&f.version>=2)await X(R,M,M6.getObjectId(),y8.fields,E,C);c++}P1("Phase 1 complete - created %d folders (skipped root folders)",c);let e=f.entities.filter((y8)=>y8.type==="document"),_8=[];P1("Phase 2: Reading %d documents",e.length);for(let y8 of e){let o8=s5.join(k,y8.path),Z6=await Tq.readFile(o8,"utf-8");_8.push({oldId:y8.id,path:y8.path,content:Z6,subtype:y8.subtype,fields:y8.fields})}P1("Phase 2 complete - read %d documents",_8.length),P1("Phase 3: Creating %d document entities",_8.length);let T8=[];for(let y8 of _8){let{path:o8,type:Z6}=rl(y8.path),M6;if(Z6==="s"){let y6=o8.split("/"),s6=y6[0],L6=y6.slice(0,-1).join("/"),P8=y6[y6.length-1],O8=f.entities.find((u8)=>u8.type==="folder"&&u8.path===`Stories/${L6}`),f8;if(O8&&E[O8.id])f8=E[O8.id];else{let u8=f.entities.find((i8)=>i8.type==="story"&&i8.name===s6);if(u8&&E[u8.id])f8=E[u8.id]}if(!f8)throw I.validation(`Cannot resolve parent folder for story document: ${y8.path}`,"IMPORT_RESOLUTION_FAILED");M6={mode:"parentName",parentId:f8,name:P8}}else M6={store:N,path:o8,type:Z6};if(y8.subtype)M6.subtype=y8.subtype;else if(Z6==="s"){let y6=o8.split("/");if(y6.length>=3&&y6[1]==="tasks")P1('WARN: Document %s in tasks folder missing subtype, inferring "task"',y8.path),M6.subtype="task"}let u6=await q.createDocument(R,M,M6,C);E[y8.oldId]=u6.getObjectId(),T8.push({document:u6,originalContent:y8.content,fields:y8.fields})}P1("Phase 3 complete - created %d document entities",T8.length);let d8=f.entities.filter((y8)=>y8.type==="template"),H6=[];P1("Phase 4: Reading %d templates",d8.length);for(let y8 of d8){let o8=s5.join(k,y8.path),Z6=await Tq.readFile(o8,"utf-8");H6.push({oldId:y8.id,path:y8.path,content:Z6,subtype:y8.subtype,fields:y8.fields})}P1("Phase 4 complete - read %d templates",H6.length),P1("Phase 5: Creating %d template entities",H6.length);let D8=[];for(let y8 of H6){let{path:o8,type:Z6}=rl(y8.path),M6={store:N,path:o8,type:Z6};if(y8.subtype)M6.subtype=y8.subtype;let u6=await q.createDocument(R,M,M6,C);E[y8.oldId]=u6.getObjectId(),D8.push({template:u6,originalContent:y8.content,fields:y8.fields})}P1("Phase 5 complete - created %d template entities",D8.length),P1("Phase 6: Remapping and saving content for %d documents",T8.length);for(let{document:y8,originalContent:o8,fields:Z6}of T8){let M6=H(o8,E);if(await q.saveDraft(R,M,{id:y8.getObjectId(),content:M6,sessionId:"import-service"},C),await q.publishDocument(R,M,{id:y8.getObjectId()},C),Z6&&f.version>=2)await X(R,M,y8.getObjectId(),Z6,E,C)}P1("Phase 6 complete - saved and published %d documents",T8.length),P1("Phase 7: Remapping and saving content for %d templates",D8.length);for(let{template:y8,originalContent:o8,fields:Z6}of D8){let M6=H(o8,E);if(await q.saveDraft(R,M,{id:y8.getObjectId(),content:M6,sessionId:"import-service"},C),await q.publishDocument(R,M,{id:y8.getObjectId()},C),Z6&&f.version>=2)await X(R,M,y8.getObjectId(),Z6,E,C)}return P1("Phase 7 complete - saved and published %d templates",D8.length),P1("Transaction committed successfully"),{success:!0,counts:{assets:g,stories:D,folders:c,documents:T8.length,templates:D8.length},remapped:E}})};return Object.freeze({isStoreEmpty:w,importDocuments:async(v,M,{filename:f,storeCode:k,projectPath:N})=>{P1("Starting import from %s to store %s",f,k);let R=s5.join(N,sl,f);try{await Tq.access(R),P1("Zip file found: %s",R)}catch(D){throw I.notFound(`Export file not found: ${f}`,"EXPORT_NOT_FOUND")}P1("Validating zip and manifest...");let E=await w(v,M,{storeCode:k});if(!E)throw I.conflict("Store not empty - import requires empty store","STORE_NOT_EMPTY");P1("Store empty check: %s",E);let C=b21.randomUUID(),g=s5.join(N,sl,sB8,C),S=s5.join(N,sl,sB8);await Tq.mkdir(S,{recursive:!0});try{new tB8.default(R).extractAllTo(g,!0),P1("Extracted zip to: %s",g)}catch(D){throw I.validation("Corrupted or invalid zip file","IMPORT_VALIDATION_FAILED")}try{let D=s5.join(g,"manifest.json"),L;try{let e=await Tq.readFile(D,"utf-8");L=JSON.parse(e)}catch(e){throw I.validation(`Failed to read manifest: ${e.message}`,"MANIFEST_READ_FAILED")}if(!y21.includes(L.version))throw I.validation(`Unsupported manifest version: ${L.version}`,"UNSUPPORTED_VERSION");if(!L.entities||!Array.isArray(L.entities))throw I.validation("Invalid manifest structure","MANIFEST_READ_FAILED");P1("Manifest valid: version=%d, entities=%d",L.version,L.entities.length);for(let e of L.entities){if(e.type==="folder"||e.type==="story")continue;let _8;if(e.type==="asset")_8=s5.join(g,"assets",`${e.id}.bin`);else if(e.type==="document"||e.type==="template")_8=s5.join(g,e.path);else{P1("Unknown entity type in import validation: %s",e.type);continue}try{await Tq.access(_8)}catch(T8){throw I.validation(`Missing file for manifest entry: ${e.path||e.id}`,"IMPORT_VALIDATION_FAILED")}}P1("All content files validated");let m=await G(v,M,{manifest:L,tempPath:g,storeCode:k}),c=m.counts.folders+m.counts.documents+m.counts.templates;return P1("Import complete: %d entities imported",c),m}finally{await P(g)}}})},$U8=Object.freeze({create:m21});var B21=($)=>{let{name:K,interval:q,execute:Y}=$,J=null,z=!1,W=null,Z=null,H=0,O=null,M=Object.freeze({getName:()=>K,getInterval:()=>q,getIsRunning:()=>z,getLastRun:()=>W,getLastError:()=>Z,getRunCount:()=>H,getNextRun:()=>O}),f=async()=>{try{await Y(),W=new Date().toISOString(),Z=null,H++}catch(C){console.error(`[CronJob] ${K} failed:`,C),Z={message:C.message,timestamp:new Date().toISOString()}}if(z)O=new Date(Date.now()+q).toISOString()},k=()=>{if(J!==null)return;J=setInterval(f,q),z=!0,O=new Date(Date.now()+q).toISOString()},N=()=>{if(J===null)return;clearInterval(J),J=null,z=!1,O=null},E=Object.freeze({start:k,stop:N,restart:()=>{N(),k()}});return{jobFns:M,controlFns:E}},EC=Object.freeze({create:B21});var KU8=o6(I4(),1),U21=KU8.default("caw:cron:cleanup-edit-states"),qU8=async($)=>{let K=new Date(Date.now()-gJ).toISOString();try{let q=await $.selectFrom("field_definitions as fd").innerJoin("entity_types as et","et.id","fd.owner_entity_type_id").select(["fd.id","fd.name","fd.primitive_type"]).where("fd.name","in",["edit_session_id","edit_started_at","edit_last_activity_at"]).where("et.code","in",["d","t"]).where("et.subtype","is",null).execute(),Y=q.filter((O)=>O.name==="edit_last_activity_at").map((O)=>O.id),J=q.filter((O)=>O.name==="edit_session_id").map((O)=>O.id),z=q.filter((O)=>O.name==="edit_started_at").map((O)=>O.id);if(Y.length===0)return{expired:0};let W=await $.selectFrom("date_fields").select(["entity_id"]).where("field_definition_id","in",Y).where("value","<",K).execute();if(W.length===0)return{expired:0};let Z=W.map((O)=>O.entity_id);if(J.length>0)await $.deleteFrom("string_fields").where("entity_id","in",Z).where("field_definition_id","in",J).execute();let H=[...z,...Y];if(H.length>0)await $.deleteFrom("date_fields").where("entity_id","in",Z).where("field_definition_id","in",H).execute();if(W.length>0)U21("Cleaned up %d expired edit locks (older than %d minutes)",W.length,gJ/60000);return{expired:W.length}}catch(q){throw console.error("[Cleanup] Failed to cleanup expired edit locks:",q),q}};var p21=({db:$})=>{let{jobFns:K,controlFns:q}=EC.create({name:"cleanup-stale-edit-states",interval:900000,execute:async()=>{await qU8($)}});return{job:Object.freeze(K),control:q}},YU8=Object.freeze({create:p21});var F21=({db:$})=>{let K=new Map,q=(O,X)=>{let{job:P,control:w}=O.create(X);K.set(P.getName(),{job:P,control:w})},Y=(O)=>{let X=K.get(O);if(!X)throw Error(`Job not found: ${O}`);let P=X.job.getIsRunning();return X.control.start(),{name:O,status:P?"already-running":"started",isRunning:X.job.getIsRunning()}},J=(O)=>{let X=K.get(O);if(!X)throw Error(`Job not found: ${O}`);let P=X.job.getIsRunning();return X.control.stop(),{name:O,status:P?"stopped":"already-stopped",isRunning:X.job.getIsRunning()}},z=(O)=>{let X=K.get(O);if(!X)throw Error(`Job not found: ${O}`);return X.control.restart(),{name:O,status:"restarted",isRunning:X.job.getIsRunning()}},W=()=>{let O=[];for(let[X,{job:P}]of K.entries())O.push({name:P.getName(),interval:P.getInterval(),isRunning:P.getIsRunning(),lastRun:P.getLastRun(),lastError:P.getLastError(),runCount:P.getRunCount(),nextRun:P.getNextRun()});return O},Z=()=>{for(let[O,{control:X}]of K.entries())X.start()},H=()=>{for(let[O,{control:X}]of K.entries())X.stop()};return q(YU8,{db:$}),Object.freeze({register:q,start:Y,stop:J,restart:z,list:W,startAll:Z,stopAll:H})},JU8=Object.freeze({create:F21});import Ul8 from"node:process";import ZU8 from"node:process";import d21 from"node:os";import n21 from"node:fs";import l21 from"node:fs";import zU8 from"node:fs";var tl;function c21(){try{return zU8.statSync("/.dockerenv"),!0}catch{return!1}}function Q21(){try{return zU8.readFileSync("/proc/self/cgroup","utf8").includes("docker")}catch{return!1}}function el(){if(tl===void 0)tl=c21()||Q21();return tl}var $i,i21=()=>{try{return l21.statSync("/run/.containerenv"),!0}catch{return!1}};function SC(){if($i===void 0)$i=i21()||el();return $i}var WU8=()=>{if(ZU8.platform!=="linux")return!1;if(d21.release().toLowerCase().includes("microsoft")){if(SC())return!1;return!0}try{return n21.readFileSync("/proc/version","utf8").toLowerCase().includes("microsoft")?!SC():!1}catch{return!1}},HU8=ZU8.env.__IS_WSL_TEST__?WU8:WU8();import Ki from"node:process";function qi(){if(Ki.platform!=="linux")return!1;if(Ki.env.WAYLAND_DISPLAY)return!0;if(Ki.env.XDG_SESSION_TYPE==="wayland")return!0;return!1}function E$($){if(typeof $!=="object"||$===null)return!1;let K=Object.getPrototypeOf($);return(K===null||K===Object.prototype||Object.getPrototypeOf(K)===null)&&!(Symbol.toStringTag in $)&&!(Symbol.iterator in $)}import{fileURLToPath as o21}from"node:url";var TP=($,K)=>{let q=Ji(a21($));if(typeof q!=="string")throw TypeError(`${K} must be a string or a file URL: ${q}.`);return q},a21=($)=>Yi($)?$.toString():$,Yi=($)=>typeof $!=="string"&&$&&Object.getPrototypeOf($)===String.prototype,Ji=($)=>$ instanceof URL?o21($):$;var LC=($,K=[],q={})=>{let Y=TP($,"First argument"),[J,z]=E$(K)?[[],K]:[K,q];if(!Array.isArray(J))throw TypeError(`Second argument must be either an array of arguments or an options object: ${J}`);if(J.some((H)=>typeof H==="object"&&H!==null))throw TypeError(`Second argument must be an array of strings: ${J}`);let W=J.map(String),Z=W.find((H)=>H.includes("\x00"));if(Z!==void 0)throw TypeError(`Arguments cannot contain null bytes ("\\0"): ${Z}`);if(!E$(z))throw TypeError(`Last argument must be an options object: ${z}`);return[Y,W,z]};import{ChildProcess as qz1}from"node:child_process";import{StringDecoder as r21}from"node:string_decoder";var{toString:OU8}=Object.prototype,XU8=($)=>OU8.call($)==="[object ArrayBuffer]",e$=($)=>OU8.call($)==="[object Uint8Array]",RY=($)=>new Uint8Array($.buffer,$.byteOffset,$.byteLength),s21=new TextEncoder,PU8=($)=>s21.encode($),t21=new TextDecoder,IC=($)=>t21.decode($),wU8=($,K)=>{return e21($,K).join("")},e21=($,K)=>{if(K==="utf8"&&$.every((z)=>typeof z==="string"))return $;let q=new r21(K),Y=$.map((z)=>typeof z==="string"?PU8(z):z).map((z)=>q.write(z)),J=q.end();return J===""?Y:[...Y,J]},Kv=($)=>{if($.length===1&&e$($[0]))return $[0];return zi($z1($))},$z1=($)=>$.map((K)=>typeof K==="string"?PU8(K):K),zi=($)=>{let K=new Uint8Array(Kz1($)),q=0;for(let Y of $)K.set(Y,q),q+=Y.length;return K},Kz1=($)=>{let K=0;for(let q of $)K+=q.length;return K};var vU8=($)=>Array.isArray($)&&Array.isArray($.raw),VU8=($,K)=>{let q=[];for(let[z,W]of $.entries())q=Yz1({templates:$,expressions:K,tokens:q,index:z,template:W});if(q.length===0)throw TypeError("Template script must not be empty");let[Y,...J]=q;return[Y,J,{}]},Yz1=({templates:$,expressions:K,tokens:q,index:Y,template:J})=>{if(J===void 0)throw TypeError(`Invalid backslash sequence: ${$.raw[Y]}`);let{nextTokens:z,leadingWhitespaces:W,trailingWhitespaces:Z}=Jz1(J,$.raw[Y]),H=GU8(q,z,W);if(Y===K.length)return H;let O=K[Y],X=Array.isArray(O)?O.map((P)=>jU8(P)):[jU8(O)];return GU8(H,X,Z)},Jz1=($,K)=>{if(K.length===0)return{nextTokens:[],leadingWhitespaces:!1,trailingWhitespaces:!1};let q=[],Y=0,J=TU8.has(K[0]);for(let W=0,Z=0;W<$.length;W+=1,Z+=1){let H=K[Z];if(TU8.has(H)){if(Y!==W)q.push($.slice(Y,W));Y=W+1}else if(H==="\\"){let O=K[Z+1];if(O===`
|
|
535
535
|
`)W-=1,Z+=1;else if(O==="u"&&K[Z+2]==="{")Z=K.indexOf("}",Z+3);else Z+=zz1[O]??1}}let z=Y===$.length;if(!z)q.push($.slice(Y));return{nextTokens:q,leadingWhitespaces:J,trailingWhitespaces:z}},TU8=new Set([" ","\t","\r",`
|
|
536
536
|
`]),zz1={x:3,u:5},GU8=($,K,q)=>q||$.length===0||K.length===0?[...$,...K]:[...$.slice(0,-1),`${$.at(-1)}${K[0]}`,...K.slice(1)],jU8=($)=>{let K=typeof $;if(K==="string")return $;if(K==="number")return String($);if(E$($)&&(("stdout"in $)||("isMaxBuffer"in $)))return Wz1($);if($ instanceof qz1||Object.prototype.toString.call($)==="[object Promise]")throw TypeError("Unexpected subprocess in template expression. Please use ${await subprocess} instead of ${subprocess}.");throw TypeError(`Unexpected "${K}" in template expression`)},Wz1=({stdout:$})=>{if(typeof $==="string")return $;if(e$($))return IC($);if($===void 0)throw TypeError(`Missing result.stdout in template expression. This is probably due to the previous subprocess' "stdout" option.`);throw TypeError(`Unexpected "${typeof $}" stdout in template expression`)};import{spawnSync as GX1}from"node:child_process";import{debuglog as Zz1}from"node:util";import Wi from"node:process";var t5=($)=>xC.includes($),xC=[Wi.stdin,Wi.stdout,Wi.stderr],s9=["stdin","stdout","stderr"],gC=($)=>s9[$]??`stdio[${$}]`;var MU8=($)=>{let K={...$};for(let q of Oi)K[q]=Zi($,q);return K},Zi=($,K)=>{let q=Array.from({length:Hz1($)+1}),Y=Oz1($[K],q,K);return Gz1(Y,K)},Hz1=({stdio:$})=>Array.isArray($)?Math.max($.length,s9.length):s9.length,Oz1=($,K,q)=>E$($)?Xz1($,K,q):K.fill($),Xz1=($,K,q)=>{for(let Y of Object.keys($).sort(Pz1))for(let J of wz1(Y,q,K))K[J]=$[Y];return K},Pz1=($,K)=>AU8($)<AU8(K)?1:-1,AU8=($)=>{if($==="stdout"||$==="stderr")return 0;return $==="all"?2:1},wz1=($,K,q)=>{if($==="ipc")return[q.length-1];let Y=Hi($);if(Y===void 0||Y===0)throw TypeError(`"${K}.${$}" is invalid.
|
|
537
537
|
It must be "${K}.stdout", "${K}.stderr", "${K}.all", "${K}.ipc", or "${K}.fd3", "${K}.fd4" (and so on).`);if(Y>=q.length)throw TypeError(`"${K}.${$}" is invalid: that file descriptor does not exist.
|