@kelceyp/caw-server 1.0.165 → 1.0.166
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 +2 -2
- package/dist/public_html/main.js +386 -386
- package/dist/public_html/project-original.svg +18 -0
- package/dist/public_html/styles.css +1 -1
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -823,7 +823,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
|
|
|
823
823
|
`),details:{count:1,message:`Moved section '${K}' ${Y} '${q}'`}}},n16=($,{heading:K,delta:q})=>{if(q===0)throw h.validation("delta must be non-zero (use a negative value to promote, positive to demote)","INVALID_DELTA");let Y=oX($),z=Y.find((X)=>X.text===K);if(!z)throw h.validation(`Heading not found: '${K}'`,"HEADING_NOT_FOUND");let J=$===""?[""]:$.split(`
|
|
824
824
|
`),Z=J.length;for(let X of Y)if(X.lineNumber>z.lineNumber&&X.level<=z.level){Z=X.lineNumber-1;break}let O=Y.filter((X)=>X.lineNumber>=z.lineNumber&&X.lineNumber<=Z);for(let X of O){let w=X.level+q;if(w<1||w>6)throw h.validation(`Heading level out of bounds: '${X.text}' is H${X.level}; applying delta ${q} would produce H${w} (valid range: H1-H6)`,"HEADING_LEVEL_BOUNDS")}for(let X of O){let w=X.lineNumber-1,P=X.level+q,G="#".repeat(P);J[w]=J[w].replace(/^#{1,6} /,`${G} `)}let H=O.length;return{newContent:J.join(`
|
|
825
825
|
`),details:{count:H,message:`Adjusted ${H} heading level${H!==1?"s":""} by ${q>0?"+":""}${q}`}}},TC=($,K)=>{switch(K.type){case"replace_first":return x16($,K);case"replace_all":return g16($,K);case"replace_regex":return u16($,K);case"replace_regex_all":return y16($,K);case"replace_between_markers":return b16($,K);case"replace_lines":return B16($,K);case"insert_at":return m16($,K);case"replace_all_content":return{newContent:K.content,details:{message:"Replaced all content"}};case"append":return U16($,K);case"reindex_list":return F16($,K);case"insert_list_item":return p16($,K);case"remove_list_item":return Q16($,K);case"swap_list_items":return l16($,K);case"move_section":return i16($,K);case"adjust_heading_levels":return n16($,K);default:throw Error(`Unknown operation type: ${K.type}`)}},Ok1=($,K,q=!1)=>{let Y=TC($,K),z={originalLength:$.length,newLength:Y.newContent.length,changeCount:Y.details.count??Y.details.linesReplaced??Y.details.linesDeleted??1},J={matches:z.changeCount,stats:z};if(!q)J.diff=rX($,Y.newContent);return J};var ap=wk1.default("caw:services:document"),op=($,K)=>{let q=V2.detectFullPathPrefix($,K);if(q.valid)return $.slice(q.prefix.length);return $},Xk1=Object.freeze(new Set(["root_d","root_t","root_s","root_j","root_settings","root_orphaned","tasks"])),d16=({store:$,folderService:K,documentHooks:q,includeResolver:Y,fieldService:z})=>{let J=Y,W=(a)=>{return a==="t"?"Template":"Document"},Z=(a)=>{let z1=a.getParentId();if(!z1)return!1;try{let{typeCode:T1}=a6.resolveEntityId(z1);return T1==="j"}catch{return!1}},O=async(a,z1,T1,R1,N1,G1,s1,L1={})=>{let{createMissing:J8=!0,startingFolderId:b1}=L1,M8=G1??R1;if(T1){let Q1=await K.resolvePath(a,z1,T1,R1,N1,M8,s1,J8,b1),q8=await $.findFolderByName(a,z1,Q1.parentObjectId,Q1.name);if(q8)return q8.getObjectId();else{if(!J8)throw h.notFound(`Folder not found: "${Q1.name}"`,"FOLDER_NOT_FOUND");return(await $.createFolder(a,z1,{storeCode:N1,parentId:Q1.parentObjectId,name:Q1.name},s1)).getObjectId()}}else{if(b1)return b1;return(await $.readRootFolderForType(a,z1,R1,N1)).getObjectId()}},H=async(a,z1,T1,R1)=>{let{path:N1,store:G1,content:s1,allowedRoots:L1,validPrefixes:J8,entityType:b1,subtype:M8}=T1;V2.validatePathFormat(N1);let Q1=V2.detectFullPathPrefix(N1,J8);U.factory(!Q1.valid,h.validation,`Path must start with one of: ${J8.map((S8)=>typeof S8==="string"?S8:S8.toString()).join(", ")}`,"INVALID_PATH_PREFIX");let q8=op(N1,J8);U.factory(!q8||q8.length===0,h.validation,"Path cannot end at tree prefix - provide a path after the prefix","EMPTY_PATH");let P8,H8=null;if(Q1.prefix==="Documents/")P8="d";else if(Q1.prefix==="Templates/")P8="t";else if(Q1.prefix.startsWith("Stories/")){P8="s";let S8=Q1.prefix.slice(8,-1),Y6=(await $.listStories(a,z1,{storeCode:G1})).find(($4)=>$4.getName()===S8);if(!Y6)throw h.notFound(`Story not found: ${S8}`,"STORY_NOT_FOUND");H8=Y6.getObjectId()}let{parentPath:Z8,name:z8}=W6.parsePath(q8),j8=await O(a,z1,Z8,b1,G1,P8,R1,{startingFolderId:H8});if(P8==="s"){let S8=await $.readFolder(a,z1,{id:j8});if(U.factory(!S8,h.notFound,"Parent folder not found","FOLDER_NOT_FOUND"),await V2.validateRootInAllowedTree(a,z1,S8,L1,$),await V2.isInsideTasksFolder(a,z1,S8,$))U.factory(M8!=="task",h.validation,"Only task documents can be created inside a tasks folder","INVALID_DOCUMENT_TYPE")}let C8=W(b1),P6=await $.findContentByName(a,z1,j8,z8,b1);return U.factory(P6,h.conflict,`${C8} "${z8}" already exists in folder`,"DUPLICATE_NAME"),await $.createContent(a,z1,{storeCode:G1,type:b1,parentId:j8,name:z8,initialContent:s1,subtype:M8},R1)},X=async(a,z1,T1,R1)=>{let{root:N1,path:G1,content:s1,allowedRoots:L1,entityType:J8,subtype:b1}=T1,M8=W6.extractStoreCode(N1);V2.validatePathFormat(G1);let Q1=await $.readFolder(a,z1,{id:N1});U.factory(!Q1,h.notFound,`Root folder not found: ${N1}`,"FOLDER_NOT_FOUND"),await V2.validateRootInAllowedTree(a,z1,Q1,L1,$);let{parentPath:q8,name:P8}=W6.parsePath(G1),H8;if(q8){let C8=q8.split("/").filter((S8)=>S8.trim()),P6=Q1;for(let S8 of C8){let M6=await $.findFolderByName(a,z1,P6.getObjectId(),S8);if(M6)P6=M6;else P6=await $.createFolder(a,z1,{storeCode:M8,parentId:P6.getObjectId(),name:S8},R1)}H8=P6.getObjectId()}else H8=N1;let Z8=await $.readFolder(a,z1,{id:H8});if(Z8&&await V2.isInsideTasksFolder(a,z1,Z8,$))U.factory(b1!=="task",h.validation,"Only task documents can be created inside a tasks folder","INVALID_DOCUMENT_TYPE");let z8=W(J8),j8=await $.findContentByName(a,z1,H8,P8,J8);return U.factory(j8,h.conflict,`${z8} "${P8}" already exists in folder`,"DUPLICATE_NAME"),await $.createContent(a,z1,{storeCode:M8,type:J8,parentId:H8,name:P8,initialContent:s1,subtype:b1},R1)},w=async(a,z1,T1,R1)=>{let{parentId:N1,name:G1,content:s1,allowedRoots:L1,entityType:J8,subtype:b1}=T1,M8=W6.extractStoreCode(N1);V2.validateName(G1);let Q1=await $.readFolder(a,z1,{id:N1});if(U.factory(!Q1,h.notFound,`Parent folder not found: ${N1}`,"FOLDER_NOT_FOUND"),await V2.validateRootInAllowedTree(a,z1,Q1,L1,$),await V2.isInsideTasksFolder(a,z1,Q1,$))U.factory(b1!=="task",h.validation,"Only task documents can be created inside a tasks folder","INVALID_DOCUMENT_TYPE");let q8=W(J8),P8=await $.findContentByName(a,z1,N1,G1,J8);return U.factory(P8,h.conflict,`${q8} "${G1}" already exists in folder`,"DUPLICATE_NAME"),await $.createContent(a,z1,{storeCode:M8,type:J8,parentId:N1,name:G1,initialContent:s1,subtype:b1},R1)},P=async(a,z1,T1,R1)=>{let{mode:N1,path:G1,root:s1,parentId:L1,name:J8,store:b1,content:M8,type:Q1,tree:q8,subtype:P8,fields:H8}=T1,Z8=P8==="track"?["d","s","tasks","settings"]:["d","s","tasks"],z8=V2.DOCUMENT_PREFIXES;if(P8&&z){let C8=b1??(s1?W6.extractStoreCode(s1):null)??(L1?W6.extractStoreCode(L1):null);if(!C8)throw h.validation("Cannot validate required fields: unable to determine store code from creation parameters","MISSING_STORE_CODE");let P6=Q1??"d";await z.validateRequiredFields(a,z1,{store:C8,code:P6,subtype:P8,fields:H8})}let j8;if(N1==="fullPath")U.factory(!b1,h.validation,"store is required for fullPath mode","MISSING_STORE_CODE"),j8=await H(a,z1,{path:G1,store:b1,content:M8,allowedRoots:Z8,validPrefixes:z8,entityType:"d",subtype:P8},R1);else if(N1==="rootRelative")U.factory(!s1,h.validation,"root is required for rootRelative mode","MISSING_ROOT"),j8=await X(a,z1,{root:s1,path:G1,content:M8,allowedRoots:Z8,entityType:"d",subtype:P8},R1);else if(N1==="parentName")U.factory(!L1,h.validation,"parentId is required for parentName mode","MISSING_PARENT_ID"),U.factory(!J8,h.validation,"name is required for parentName mode","MISSING_NAME"),j8=await w(a,z1,{parentId:L1,name:J8,content:M8,allowedRoots:Z8,entityType:"d",subtype:P8},R1);else if(Q1!==void 0){U.factory(Q1!=="d"&&Q1!=="t",h.validation,'type must be "d" or "t"',"INVALID_TYPE"),U.factory(!G1||G1==="/",h.validation,"Path cannot be empty","EMPTY_PATH"),U.factory(!b1,h.validation,"store is required","MISSING_STORE_CODE");let{parentPath:C8,name:P6}=W6.parsePath(G1),S8=L1??await O(a,z1,C8,Q1,b1,q8,R1),M6=W(Q1),Y6=await $.findContentByName(a,z1,S8,P6,Q1);U.factory(Y6,h.conflict,`${M6} "${P6}" already exists in folder`,"DUPLICATE_NAME"),j8=await $.createContent(a,z1,{storeCode:b1,type:Q1,parentId:S8,name:P6,initialContent:M8,subtype:P8},R1)}else throw h.validation("Invalid creation parameters. Use one of: fullPath (path+store), rootRelative (root+path), or parentName (parentId+name)","INVALID_PARAMS");if(H8&&z&&Object.keys(H8).length>0)for(let[C8,P6]of Object.entries(H8))await z.setFieldValue(a,z1,{entityId:j8.getObjectId(),fieldName:C8,...Array.isArray(P6)?{values:P6}:{value:P6}},R1);return j8},G=async(a,z1,T1,R1)=>{let{mode:N1,path:G1,root:s1,parentId:L1,name:J8,store:b1,content:M8,subtype:Q1}=T1,q8=["t"],P8=V2.TEMPLATE_PREFIXES;if(N1==="fullPath")return U.factory(!b1,h.validation,"store is required for fullPath mode","MISSING_STORE_CODE"),await H(a,z1,{path:G1,store:b1,content:M8,allowedRoots:q8,validPrefixes:P8,entityType:"t",subtype:Q1},R1);if(N1==="rootRelative")return U.factory(!s1,h.validation,"root is required for rootRelative mode","MISSING_ROOT"),await X(a,z1,{root:s1,path:G1,content:M8,allowedRoots:q8,entityType:"t",subtype:Q1},R1);if(N1==="parentName")return U.factory(!L1,h.validation,"parentId is required for parentName mode","MISSING_PARENT_ID"),U.factory(!J8,h.validation,"name is required for parentName mode","MISSING_NAME"),await w(a,z1,{parentId:L1,name:J8,content:M8,allowedRoots:q8,entityType:"t",subtype:Q1},R1);throw h.validation("Invalid creation parameters. Use one of: fullPath (path+store), rootRelative (root+path), or parentName (parentId+name)","INVALID_PARAMS")},T=async(a,z1,{id:T1,resolveIncludes:R1=!0})=>{let{typeCode:N1}=a6.resolveEntityId(T1),G1=W(N1),s1=await $.readContent(a,z1,{id:T1});U.factory(!s1,h.notFound,`${G1} not found: ${T1}`,"NOT_FOUND");let L1=[],J8=s1.getParentId();while(J8){L1.unshift(J8);let M8=await $.readFolder(a,z1,{id:J8});if(!M8)break;J8=M8.getParentId()}let b1=null;if(R1&&J&&s1.getPublishedContent())b1=await J.resolve(a,z1,s1.getPublishedContent(),s1.getObjectId());return{entity:s1,ancestorFolderIds:L1,resolvedContent:b1}},v=async(a,z1,{path:T1,type:R1,storeCode:N1})=>{U.factory(R1!=="d"&&R1!=="t",h.validation,'type must be "d" or "t"',"INVALID_TYPE");let{parentPath:G1,name:s1}=W6.parsePath(T1),L1=[],J8;if(G1){let M8=G1.split("/").filter((q8)=>q8),Q1="";for(let q8 of M8){Q1=Q1?`${Q1}/${q8}`:q8;let P8=await $.getFolderByPath(a,z1,{path:Q1,type:R1,storeCode:N1});if(!P8)return null;L1.push(P8.getObjectId())}J8=L1[L1.length-1]}else J8=(await $.readRootFolderForType(a,z1,R1,N1)).getObjectId();let b1=await $.findContentByName(a,z1,J8,s1,R1);if(!b1)return null;return{entity:b1,ancestorFolderIds:L1}},M=async(a,z1,{id:T1,path:R1,parentId:N1,type:G1},s1)=>{U.factory(G1!=="d"&&G1!=="t",h.validation,'type must be "d" or "t"',"INVALID_TYPE");let L1=R1!==void 0&&R1!==null,J8=N1!==void 0&&N1!==null;if(U.factory(L1===J8,h.validation,"Either path OR parentId must be provided, not both or neither","INVALID_PARAMS"),L1)U.factory(R1==="/",h.validation,"Path cannot be empty","EMPTY_PATH");let{entity:b1}=await T(a,z1,{id:T1}),M8=W6.extractStoreCode(T1),Q1=W(G1),q8,P8;if(J8){let z8=await $.readFolder(a,z1,{id:N1});U.factory(!z8,h.notFound,`Parent folder not found: ${N1}`,"PARENT_NOT_FOUND"),q8=b1.getName(),P8=N1}else{let z8=G1==="t"?V2.TEMPLATE_PREFIXES:V2.DOCUMENT_PREFIXES,j8=op(R1,z8),{parentPath:C8,name:P6}=W6.parsePath(j8);q8=P6;let S8=W6.parsePath(op(b1.getPath(),z8));if(C8===S8.parentPath)P8=b1.getParentId();else P8=await O(a,z1,C8,G1,M8,void 0,s1,{createMissing:!1})}let H8=q8!==b1.getName(),Z8=P8!==b1.getParentId();if(!H8&&!Z8)return b1;if(H8||Z8){let z8=await $.findContentByName(a,z1,P8,q8,G1);U.factory(z8&&z8.getObjectId()!==T1,h.conflict,`${Q1} "${q8}" already exists in target folder`,"DUPLICATE_NAME")}return await $.updateContent(a,z1,{id:T1,name:H8?q8:void 0,parentId:Z8?P8:void 0},s1)},V=async(a,z1,{id:T1,ack:R1},N1)=>{let{entity:G1}=await T(a,z1,{id:T1}),s1=await $.getIncomingContentReferences(a,z1,{targetId:T1});if(s1.length>0){let b1=s1.map((q8)=>({id:q8.object_id,name:q8.name,path:q8.path})),M8=[...new Set(s1.map((q8)=>q8.object_id))].sort(),Q1=Hk1("sha256").update(M8.join(","),"utf8").digest("hex");if(ap("deleteDocument: id=%s refs=%d hash=%s ack=%s",T1,s1.length,Q1,R1??"(none)"),!R1||R1!==Q1)return ap("deleteDocument: ack check FAIL — returning INCOMING_REFERENCES"),{deleted:!1,reason:"INCOMING_REFERENCES",code:"INCOMING_REFERENCES",references:b1,hash:Q1};ap("deleteDocument: ack check PASS — proceeding with deletion")}let L1=await $.deleteContent(a,z1,{id:T1},N1),{typeCode:J8}=a6.resolveEntityId(T1);if(J8==="d"&&G1.getSubtype()==="task"&&z){let b1=G1.getParentId(),M8=await $.listContent(a,z1,{parentId:b1,type:"d"});for(let Q1 of M8){if(Q1.getObjectId()===T1)continue;if(Q1.getSubtype()!=="task")continue;let q8=await $.getFieldValue(a,z1,{entityId:Q1.getObjectId(),fieldName:"dependsOn"});if(!q8)continue;let P8=q8.getValues();if(!P8.includes(T1))continue;let H8=P8.filter((Z8)=>Z8!==T1);if(H8.length>0)await z.setFieldValue(a,z1,{entityId:Q1.getObjectId(),fieldName:"dependsOn",values:H8},N1,!0);else await z.deleteFieldValue(a,z1,{entityId:Q1.getObjectId(),fieldName:"dependsOn"},N1,!0)}}return L1},D=async(a,z1,{id:T1})=>{let{typeCode:R1}=a6.resolveEntityId(T1),N1=W(R1),G1=await $.readContent(a,z1,{id:T1});U.factory(!G1,h.notFound,`${N1} not found: ${T1}`,"NOT_FOUND");let s1=await $.getIncomingContentReferences(a,z1,{targetId:T1});if(s1.length===0)return{references:[],hash:null};let L1=s1.map((M8)=>({id:M8.object_id,name:M8.name,path:M8.path})),J8=[...new Set(s1.map((M8)=>M8.object_id))].sort(),b1=Hk1("sha256").update(J8.join(","),"utf8").digest("hex");return{references:L1,hash:b1}},N=async(a,z1,{id:T1,content:R1,sessionId:N1},G1)=>{let{entity:s1}=await T(a,z1,{id:T1});U.factory(Z(s1),h.validation,"Documents inside jobs are read-only","JOB_DOCUMENT_READ_ONLY");let L1=await $.saveDraft(a,z1,{id:T1,content:R1,sessionId:N1},G1);if(z){let J8=Buffer.byteLength(R1,"utf8");await z.setFieldValue(a,z1,{entityId:T1,fieldName:"size",value:String(J8),bypassEditableCheck:!0},G1)}return L1},E=async(a,z1,{id:T1})=>{let{typeCode:R1}=a6.resolveEntityId(T1),{entity:N1}=await T(a,z1,{id:T1}),G1=W(R1),s1=await $.readDraft(a,z1,{id:T1});return U.factory(!s1,h.notFound,`No draft found for ${G1}: ${T1}`,"DRAFT_NOT_FOUND"),s1},x=async(a,z1,{id:T1,sessionId:R1},N1)=>{let{entity:G1}=await T(a,z1,{id:T1,resolveIncludes:!1}),{typeCode:s1}=a6.resolveEntityId(T1),L1=q.getHook("prePublish",s1);if(L1)await L1(a,z1,G1,R1,N1);let b1=(await $.readDraft(a,z1,{id:T1}))?.content??"",M8=await $.publishContent(a,z1,{id:T1,sessionId:R1},N1);if(z){let Q1=Buffer.byteLength(b1,"utf8");await z.setFieldValue(a,z1,{entityId:T1,fieldName:"size",value:String(Q1),bypassEditableCheck:!0},N1)}return M8},b=async(a,z1,{id:T1},R1)=>{let{entity:N1}=await T(a,z1,{id:T1}),G1=N1.getPublishedContent()??"",s1=await $.discardDraft(a,z1,{id:T1},R1);if(z){let L1=Buffer.byteLength(G1,"utf8");await z.setFieldValue(a,z1,{entityId:T1,fieldName:"size",value:String(L1),bypassEditableCheck:!0},R1)}return s1},S=async(a,z1,{id:T1,versionNumber:R1,resolveIncludes:N1=!0})=>{let{typeCode:G1}=a6.resolveEntityId(T1),{entity:s1}=await T(a,z1,{id:T1,resolveIncludes:!1}),L1=W(G1),J8=await $.readVersion(a,z1,{id:T1,versionNumber:R1});U.factory(!J8,h.notFound,`Version ${R1} not found for ${L1}: ${T1}`,"VERSION_NOT_FOUND");let b1=null;if(N1&&J&&J8.content)b1=await J.resolve(a,z1,J8.content,T1);return{...J8,resolvedContent:b1}},I=async(a,z1,{id:T1})=>{let{entity:R1}=await T(a,z1,{id:T1});return await $.getVersions(a,z1,{id:T1})},C=async(a,z1,{id:T1,sessionId:R1},N1)=>{let{entity:G1}=await T(a,z1,{id:T1});return await $.setEditState(a,z1,{id:T1,sessionId:R1},N1)},k=async(a,z1,{id:T1},R1)=>{let{entity:N1}=await T(a,z1,{id:T1});return await $.clearEditState(a,z1,{id:T1},R1)},R=async(a,z1,{id:T1})=>{let{entity:R1}=await T(a,z1,{id:T1});return await $.getEditState(a,z1,{id:T1})},u=async(a,z1,{parentId:T1,storeCode:R1,type:N1="d",includeDeleted:G1})=>{return await $.listContent(a,z1,{parentId:T1,storeCode:R1,type:N1,includeDeleted:G1})},g=async(a,z1,{id:T1,operation:R1,preview:N1=!1,ignoreContent:G1=!1,sessionId:s1},L1)=>{let{entity:J8}=await T(a,z1,{id:T1}),b1=J8.getDraftContent()??J8.getPublishedContent()??"";if(N1)return{preview:!0,...Ok1(b1,R1,G1)};let M8=TC(b1,R1);return await N(a,z1,{id:T1,content:M8.newContent,sessionId:s1},L1),{applied:!0,details:M8.details}},s=async(a,z1,{id:T1,operations:R1,preview:N1=!1,ignoreContent:G1=!1,sessionId:s1},L1)=>{let J8=["replace_first","replace_all","replace_regex","replace_regex_all","replace_between_markers","replace_all_content","append","reindex_list","adjust_heading_levels"];for(let H8 of R1)if(!J8.includes(H8.type))throw h.validation(`Operation type "${H8.type}" is not batchable. Only line-agnostic operations are allowed in batch mode.`,"NON_BATCHABLE_OPERATION");let{entity:b1}=await T(a,z1,{id:T1}),M8=b1.getDraftContent()??b1.getPublishedContent()??"",Q1=M8,q8=[];for(let H8 of R1){let Z8=TC(Q1,H8);Q1=Z8.newContent,q8.push(Z8.details)}let P8={originalLength:M8.length,newLength:Q1.length,operationsApplied:R1.length};if(N1){let H8={preview:!0,stats:P8,operationResults:q8};if(!G1)H8.diff=rX(M8,Q1);return H8}return await N(a,z1,{id:T1,content:Q1,sessionId:s1},L1),{applied:R1.length,results:q8}},J1=async(a,z1,{id:T1,startLine:R1,endLine:N1,includeDraft:G1=!1})=>{let{entity:s1}=await T(a,z1,{id:T1}),L1=G1?s1.getDraftContent()??s1.getPublishedContent()??"":s1.getPublishedContent()??"";return aX(L1,R1,N1)},Y1=async(a,z1,{id:T1,startMarker:R1,endMarker:N1,inclusive:G1=!1,includeDraft:s1=!1})=>{let{entity:L1}=await T(a,z1,{id:T1}),J8=s1?L1.getDraftContent()??L1.getPublishedContent()??"":L1.getPublishedContent()??"";return sf1(J8,R1,N1,G1)},E1=async(a,z1,{id:T1,includeDraft:R1=!1})=>{let{entity:N1}=await T(a,z1,{id:T1}),G1=R1?N1.getDraftContent()??N1.getPublishedContent()??"":N1.getPublishedContent()??"";return wC(G1)},w1=async(a,z1,{id:T1,maxDepth:R1,includeDraft:N1=!1})=>{let{entity:G1}=await T(a,z1,{id:T1}),s1=N1?G1.getDraftContent()??G1.getPublishedContent()??"":G1.getPublishedContent()??"";return oX(s1,R1)},j1=async(a,z1,{id:T1,heading:R1,includeHeading:N1=!0,includeDraft:G1=!1})=>{let{entity:s1}=await T(a,z1,{id:T1}),L1=G1?s1.getDraftContent()??s1.getPublishedContent()??"":s1.getPublishedContent()??"";return oA(L1,R1,N1)},A1=async(a,z1,{id:T1,includeDraft:R1=!1})=>{let{entity:N1}=await T(a,z1,{id:T1}),G1=R1?N1.getDraftContent()??N1.getPublishedContent()??"":N1.getPublishedContent()??"";return tf1(G1)},p1=async(a,z1,{id:T1,section:R1,includeDraft:N1=!1})=>{let{entity:G1}=await T(a,z1,{id:T1}),s1=N1?G1.getDraftContent()??G1.getPublishedContent()??"":G1.getPublishedContent()??"";return ef1(s1,R1)},n1=(a,z1)=>{let T1=a.split(`
|
|
826
|
-
`),N1=T1[z1-1].match(/^(?:[-*+] |\d+\. )\[([ xX])\] (.+)$/),G1=0,s1=/^(?:[-*+] |\d+\. )\[([ xX])\] .+$/;for(let L1=0;L1<z1;L1++)if(s1.test(T1[L1]))G1++;return{text:N1[2],checked:N1[1]!==" ",lineNumber:z1,itemNumber:G1}};return Object.freeze({createDocument:P,createTemplate:G,readDocument:T,readDocumentByPath:v,updateDocumentPath:M,deleteDocument:V,getIncomingReferences:D,saveDraft:N,readDraft:E,publishDocument:x,discardDraft:b,readVersion:S,getVersions:I,setEditState:C,clearEditState:k,getEditState:R,listDocuments:u,editDocument:g,batchEditDocument:s,readLines:J1,readBetweenMarkers:Y1,getDocumentStats:E1,readHeadings:w1,readSection:j1,readFrontmatter:A1,readChecklist:p1,checkChecklistItem:async(a,z1,{id:T1,lineNumber:R1,checked:N1,includeDraft:G1=!1,preview:s1=!1,sessionId:L1},J8)=>{let{entity:b1}=await T(a,z1,{id:T1}),M8=G1?b1.getDraftContent()??b1.getPublishedContent()??"":b1.getPublishedContent()??"",Q1=dp(M8,{lineNumber:R1,checked:N1});if(s1)return{preview:!0,diff:rX(M8,Q1.newContent),item:n1(Q1.newContent,R1)};return await N(a,z1,{id:T1,content:Q1.newContent,sessionId:L1},J8),{applied:!0,item:n1(Q1.newContent,R1)}},toggleChecklistItem:async(a,z1,{id:T1,lineNumber:R1,includeDraft:N1=!1,preview:G1=!1,sessionId:s1},L1)=>{let{entity:J8}=await T(a,z1,{id:T1}),b1=N1?J8.getDraftContent()??J8.getPublishedContent()??"":J8.getPublishedContent()??"",M8=Wk1(b1,{lineNumber:R1});if(G1)return{preview:!0,diff:rX(b1,M8.newContent),item:n1(M8.newContent,R1)};return await N(a,z1,{id:T1,content:M8.newContent,sessionId:s1},L1),{applied:!0,item:n1(M8.newContent,R1)}},batchCheckChecklistItems:async(a,z1,{id:T1,items:R1,includeDraft:N1=!1,preview:G1=!1,sessionId:s1},L1)=>{let{entity:J8}=await T(a,z1,{id:T1}),b1=N1?J8.getDraftContent()??J8.getPublishedContent()??"":J8.getPublishedContent()??"",M8=Zk1(b1,{items:R1}),Q1=R1.map((q8)=>n1(M8.newContent,q8.lineNumber));if(G1)return{preview:!0,diff:rX(b1,M8.newContent),items:Q1,count:M8.details.count};return await N(a,z1,{id:T1,content:M8.newContent,sessionId:s1},L1),{applied:!0,items:Q1,count:M8.details.count}},specialiseDocument:async(a,z1,{id:T1,subtype:R1,fields:N1},G1)=>{let{entity:s1}=await T(a,z1,{id:T1});U.factory(s1.getSubtype()!==null,h.validation,`Entity is already specialised to subtype: ${s1.getSubtype()}`,"ALREADY_SPECIALISED");let{storeCode:L1,typeCode:J8}=a6.resolveEntityId(T1),b1=(await Promise.resolve().then(() => (m$(),hF))).default;try{await b1.readEntityTypeId(a,z1,J8,R1)}catch(q8){throw h.validation(`Invalid subtype: ${R1}`,"INVALID_SUBTYPE")}await z.validateRequiredFields(a,z1,{store:L1,code:J8,subtype:R1,fields:N1});let M8=await $.updateEntityType(a,z1,{id:T1,subtype:R1},G1);if(N1&&Object.keys(N1).length>0)for(let[q8,P8]of Object.entries(N1))await z.setFieldValue(a,z1,{entityId:T1,fieldName:q8,...Array.isArray(P8)?{values:P8}:{value:P8}},G1);let{entity:Q1}=await T(a,z1,{id:T1});return{entity:Q1}},generaliseDocument:async(a,z1,{id:T1},R1)=>{let{entity:N1}=await T(a,z1,{id:T1}),G1=N1.getSubtype();U.factory(G1===null,h.validation,"Entity is already generic (has no subtype)","ALREADY_GENERIC");let s1=await $.readFolder(a,z1,{id:N1.getParentId()});if(s1&&await V2.isInsideTasksFolder(a,z1,s1,$))throw h.validation("Cannot generalise entity inside a tasks folder","INVALID_LOCATION");let{typeCode:L1}=a6.resolveEntityId(T1),J8=await $.getFieldDefinitionsForEntityType(a,z1,{storeCode:"B",code:L1,subtype:G1}),b1=N1.getFields();for(let Q1 of J8){if(Q1.inherited)continue;let q8=Q1.entity.getName();if(b1&&b1[q8])await z.deleteFieldValue(a,z1,{entityId:T1,fieldName:q8},R1)}await $.updateEntityType(a,z1,{id:T1,subtype:null},R1);let{entity:M8}=await T(a,z1,{id:T1});return{entity:M8}},specialiseFolder:async(a,z1,{id:T1,subtype:R1},N1)=>{let G1=await $.readFolder(a,z1,{id:T1});U.factory(!G1,h.notFound,`Folder not found: ${T1}`,"NOT_FOUND");let{typeCode:s1}=a6.resolveEntityId(T1);U.factory(s1!=="f",h.validation,`Entity is not a folder: ${T1}`,"INVALID_OPERATION"),U.factory(G1.getSubtype()!==null,h.validation,`Entity is already specialised to subtype: ${G1.getSubtype()}`,"ALREADY_SPECIALISED"),U.factory(Xk1.has(R1),h.validation,`Invalid subtype: ${R1}`,"INVALID_SUBTYPE");let L1=(await Promise.resolve().then(() => (m$(),hF))).default;try{await L1.readEntityTypeId(a,z1,"f",R1)}catch(b1){throw h.validation(`Invalid subtype: ${R1}`,"INVALID_SUBTYPE")}return{entity:await $.updateEntityType(a,z1,{id:T1,subtype:R1},N1)}},generaliseFolder:async(a,z1,{id:T1},R1)=>{let N1=await $.readFolder(a,z1,{id:T1});U.factory(!N1,h.notFound,`Folder not found: ${T1}`,"NOT_FOUND");let{typeCode:G1}=a6.resolveEntityId(T1);U.factory(G1!=="f",h.validation,`Entity is not a folder: ${T1}`,"INVALID_OPERATION");let s1=N1.getSubtype();return U.factory(s1===null,h.validation,"Entity is already generic (has no subtype)","ALREADY_GENERIC"),U.factory(Xk1.has(s1),h.validation,`Cannot generalise system-managed folder subtype: ${s1}`,"INVALID_OPERATION"),{entity:await $.updateEntityType(a,z1,{id:T1,subtype:null},R1)}},setIncludeResolver:(a)=>{J=a}})},rp=Object.freeze({create:d16});c6();var a16=({store:$,fieldService:K})=>{return Object.freeze({createSetting:async(Z,O,{store:H,parentId:X,name:w,subtype:P,fields:G},T)=>{U.factory(!H,h.validation,"Store is required","MISSING_STORE_CODE"),U.factory(!X,h.validation,"Parent folder ID is required","MISSING_PARENT_ID"),U.factory(!w||!w.trim(),h.validation,"Setting name is required","MISSING_NAME");let{entity:v,mutationApi:M,pk:V}=await $.createSetting(Z,O,{storeCode:H,parentId:X,name:w.trim(),subtype:P},T);if(G&&typeof G==="object")for(let[N,E]of Object.entries(G))if(Array.isArray(E))await K.setFieldValue(Z,O,{entityId:v.getObjectId(),fieldName:N,values:E},T);else await K.setFieldValue(Z,O,{entityId:v.getObjectId(),fieldName:N,value:E},T);let D=v.toJSON();if(G)D.fields={...D.fields,...G};return{...D,storeCode:H}},readSetting:async(Z,O,{id:H})=>{U.factory(!H,h.validation,"Setting ID is required","MISSING_ID");let X=await $.readSetting(Z,O,{id:H});U.factory(!X,h.notFound,`Setting not found: ${H}`,"SETTING_NOT_FOUND");let{entity:w}=X,P=w.toJSON(),G=H.charAt(0);return{...P,storeCode:G}},listSettings:async(Z,O,{parentId:H,store:X,subtype:w})=>{return U.factory(!H,h.validation,"Parent folder ID is required","MISSING_PARENT_ID"),(await $.listSettings(Z,O,{parentId:H,storeCode:X,subtype:w})).map(({entity:G})=>{let T=G.toJSON(),v=G.getObjectId().charAt(0);return{...T,storeCode:v}})},updateSettingPath:async(Z,O,{id:H,name:X,parentId:w},P)=>{U.factory(!H,h.validation,"Setting ID is required","MISSING_ID"),U.factory(X===void 0&&w===void 0,h.validation,"At least one of name or parentId must be provided","NO_UPDATES");let G=await $.updateSettingPath(Z,O,{id:H,name:X,parentId:w},P);U.factory(!G,h.notFound,`Setting not found: ${H}`,"SETTING_NOT_FOUND");let{entity:T}=G,v=T.toJSON(),M=H.charAt(0);return{...v,storeCode:M}},deleteSetting:async(Z,O,{id:H},X)=>{return U.factory(!H,h.validation,"Setting ID is required","MISSING_ID"),await $.deleteSetting(Z,O,{id:H},X),{deleted:!0,id:H}}})},sp=Object.freeze({create:a16});var o16=()=>{let $=null,K=null,q={prePublish:{d:async(J,W,Z,O,H)=>{if(!$)return;let X=Z.getDraftContent();if(!X)return;let{content:w,pinned:P}=await $.pinIncludes(J,W,X,Z.getObjectId());if(P.length>0)await K.saveDraft(J,W,{id:Z.getObjectId(),content:w,sessionId:O},H)},t:null},postPublish:{},preDelete:{},postCreate:{}};return Object.freeze({getHook:(J,W)=>{return q[J]?.[W]||null},setIncludeResolver:(J,W)=>{$=J,K=W}})},tp=Object.freeze({create:o16});c6();var Gk1=X6(g6(),1),Pk1=X6(XC(),1);var Vz=Gk1.default("caw:includes"),r16=({store:$,documentService:K})=>{let q=/<include\s+(?:id="([^"]+)"|path="([^"]+)")(?:\s+version="(\d+)")?\s*\/>/g,Y=(H)=>{let X=RR(H),w=[],P,G=new RegExp(q.source,"g");while((P=G.exec(X))!==null){let T=H.substring(P.index,P.index+P[0].length),v=new RegExp(q.source).exec(T);if(v)w.push({fullMatch:T,id:v[1],path:v[2],versionStr:v[3],index:P.index})}return w},z=5,J=async(H,X,w,P,G=new Set,T=0)=>{if(Vz("Resolving includes in document, depth=%d, chain=%s, sourceDocId=%s",T,[...G].join(","),P),T>5)throw h.validation("Include depth limit exceeded (max 5 levels)","INCLUDE_DEPTH_EXCEEDED");if(P)G=new Set(G).add(P);let v=Y(w);if(Vz("Found %d include directives",v.length),v.length===0)return w;let M=w;for(let V of v){let{fullMatch:D,id:N,path:E,versionStr:x}=V,b=x?parseInt(x,10):null;Vz("Resolving include: id=%s, path=%s, version=%s",N,E,x);try{let S;if(N)S=N;else{let R=P?P.charAt(0):"A",u=await K.readDocumentByPath(H,X,{path:E,type:"d",storeCode:R});if(!u)throw h.notFound(`Included document not found: ${E}`,"INCLUDE_NOT_FOUND");S=u.entity.getObjectId()}if(G.has(S)){let R=[...G,S].join(" -> ");throw h.validation(`Circular include detected: ${R}`,"INCLUDE_CYCLE")}if(b===null)throw h.validation(`Unpinned include found: ${D}. Includes must specify a version.`,"INCLUDE_UNPINNED");let I=await $.readVersion(H,X,{id:S,versionNumber:b});if(!I)throw h.notFound(`Version ${b} not found for included document: ${S}`,"INCLUDE_VERSION_NOT_FOUND");let C=Pk1.default(I.content).content,k=await J(H,X,C,S,G,T+1);M=M.replace(D,k)}catch(S){let I=N||E,C=`> **Include Error** - couldn't include ${I}${b?` version ${b}`:""}: ${S.message}`;Vz("Include resolution failed for %s: %s",I,S.message),M=M.replace(D,C)}}return M};return Object.freeze({resolve:J,pinIncludes:async(H,X,w,P)=>{Vz("Auto-pinning unpinned includes in document: %s",P);let G=Y(w),T=[],v=w;for(let M of G){let{fullMatch:V,id:D,path:N,versionStr:E}=M;if(E)continue;Vz("Pinning unpinned include: id=%s, path=%s",D,N);let x,b;if(D){x=D;let{entity:I}=await K.readDocument(H,X,{id:D,resolveIncludes:!1});b=I.getPublishedVersionNumber()}else{let I=P?P.charAt(0):"A",C=await K.readDocumentByPath(H,X,{path:N,type:"d",storeCode:I});if(!C)throw h.notFound(`Included document not found: ${N}`,"INCLUDE_NOT_FOUND");x=C.entity.getObjectId(),b=C.entity.getPublishedVersionNumber()}if(!b)throw h.validation(`Cannot pin include - document has no published version: ${x}`,"INCLUDE_NO_VERSION");let S=D?`<include id="${D}" version="${b}" />`:`<include path="${N}" version="${b}" />`;Vz("Pinned include %s to version %d",x,b),v=v.replace(V,S),T.push({id:x,path:N,version:b})}return Vz("Auto-pinned %d unpinned includes",T.length),{content:v,pinned:T}},checkIncludes:async(H,X,w,P)=>{let G=Y(w),T=[];for(let v of G){let{id:M,path:V,versionStr:D}=v,N=D?parseInt(D,10):null,E,x;if(M){E=M;let{entity:b}=await K.readDocument(H,X,{id:M,resolveIncludes:!1});x=b.getPublishedVersionNumber()}else{let b=P?P.charAt(0):"A",S=await K.readDocumentByPath(H,X,{path:V,type:"d",storeCode:b});E=S?.entity?.getObjectId(),x=S?.entity?.getPublishedVersionNumber()}T.push({id:E,path:V||null,pinnedVersion:N,latestVersion:x,outdated:N!==null&&x!==null&&N<x})}return T},updateIncludes:async(H,X,w,P)=>{let G=Y(w),T=[],v=w;for(let M of G){let{fullMatch:V,id:D,path:N,versionStr:E}=M,x=E?parseInt(E,10):null,b,S;if(D){b=D;let{entity:I}=await K.readDocument(H,X,{id:D,resolveIncludes:!1});S=I.getPublishedVersionNumber()}else{let I=P?P.charAt(0):"A",C=await K.readDocumentByPath(H,X,{path:N,type:"d",storeCode:I});b=C?.entity?.getObjectId(),S=C?.entity?.getPublishedVersionNumber()}if(S&&x!==S){let I=D?`<include id="${D}" version="${S}" />`:`<include path="${N}" version="${S}" />`;v=v.replace(V,I),T.push({id:b,path:N||null,fromVersion:x,toVersion:S})}}return{content:v,updated:T}}})},ep=Object.freeze({create:r16});c6();var NR1=X6(XC(),1),fR1=X6(JM(),1),jR1=["job","document","file","stdout","clipboard"],y96=Object.freeze({string:"string",number:"float",boolean:"boolean",array:"json",object:"json",int:"int",float:"float",text:"text",date:"date",object_ref:"object_ref",enum:"string"}),b96=["default","placeholder","rows","description"],B96=($,K)=>{let q=K.type||"string",Y=y96[q];if(Y===void 0)throw Error(`INVALID_PARAMETER_TYPE: Parameter '${$}' has unknown type '${q}'`);let z={label:K.label??$,primitiveType:Y,required:K.required??!1};for(let J of b96)if(J in K)z[J]=K[J];if(q==="enum"){if(!Array.isArray(K.values))throw Error(`INVALID_PARAMETER_CONFIG: Parameter '${$}': enum type requires a 'values' array`);z.allowed={type:"enum",values:K.values}}else if(K.allowed!==void 0){if(Y!=="string")throw Error(`INVALID_PARAMETER_CONFIG: Parameter '${$}': 'allowed' is only supported on string-typed parameters`);if(K.allowed.type!=="enum")throw Error(`INVALID_PARAMETER_CONFIG: Parameter '${$}': allowed.type must be 'enum'`);z.allowed=K.allowed}return z},m96=($)=>{if($===null||$===void 0)return{type:null};if(typeof $==="string")return{type:$};if(typeof $==="object"){let{type:K}=$;if(!K)throw Error("Invalid target configuration: 'target.type' is required when target is an object");if(!jR1.includes(K))throw Error(`Invalid target type '${K}'. Valid types: ${jR1.join(", ")}`);let q=$[K]||{};if(K==="job"){let{name:Y,execution:z={},ui:J={}}=q;return{type:K,targetJobName:Y||null,targetJobAgent:z.agent||null,targetJobModel:z.model||null,targetJobWorktree:z.worktree||null,targetJobDockerImage:z.dockerImage||null,targetJobStreaming:z.output==="streaming",targetJobSkipDialog:J.skipDialog??!1,targetJobClearFlag:J.clearFlag??!1,targetJobClearMessage:J.clearStatusMessage??!1,targetJobResumePrompt:z.resumePrompt||null}}if(K==="document"){let{path:Y,parentId:z,name:J,root:W,store:Z,subtype:O,fields:H}=q;return{type:K,targetPath:Y||null,targetParentId:z||null,targetName:J||null,targetRoot:W||null,targetStore:Z||null,targetSubtype:O||null,targetFields:H||null}}if(K==="file"){let{path:Y,store:z}=q;return{type:K,targetPath:Y||null,targetStore:z||null}}return{type:K}}return{type:null}},kR1=($)=>{let K={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,targetJobDockerImage:null,targetJobClearFlag:!1,targetJobClearMessage:!1,targetJobResumePrompt:null,skipDialog:!1,targetSubtype:null,targetFields:null,body:""};if(!$)return K;let q=NR1.default($),Y=q.data?.parameters||{},z={};for(let[k,R]of Object.entries(Y))z[k]=B96(k,R||{});let J=q.content,W=q.data?.skipDialog??!1,Z=m96(q.data?.target),O=Z.type,H=Z.targetJobName??null,X=Z.targetJobAgent??null,w=Z.targetJobModel??null,P=Z.targetJobWorktree??null,G=Z.targetJobSkipDialog??!1,T=Z.targetJobStreaming??!1,v=Z.targetJobDockerImage??null,M=Z.targetJobClearFlag??!1,V=Z.targetJobClearMessage??!1,D=Z.targetJobResumePrompt??null,N=Z.targetPath??null,E=Z.targetParentId??null,x=Z.targetName??null,b=Z.targetRoot??null,S=Z.targetStore??null,I=Z.targetSubtype??null,C=Z.targetFields??null;return{parameters:z,target:O,targetPath:N,targetParentId:E,targetName:x,targetRoot:b,targetStore:S,targetJobName:H,targetJobAgent:X,targetJobModel:w,targetJobWorktree:P,targetJobSkipDialog:G,targetJobStreaming:T,targetJobDockerImage:v,targetJobClearFlag:M,targetJobClearMessage:V,targetJobResumePrompt:D,skipDialog:W,targetSubtype:I,targetFields:C,body:J}},U96=($)=>{if(!$)return new Set;let K=new Set,q=new Set(["if","unless","each","with","lookup","log"]);try{let Y=fR1.default.parse($),z=(J,W=null,Z=null)=>{if(!J)return;if(J.type==="PathExpression"){if(J.data)return;let O=J.parts.join(".");if(!O||O.startsWith("@"))return;if(W?.type==="BlockStatement"&&Z==="path"||W?.type==="MustacheStatement"&&Z==="path"&&W.params?.length>0){if(q.has(O))return;return}K.add(O)}if(J.program)z(J.program,J,"program");if(J.inverse)z(J.inverse,J,"inverse");if(J.body)J.body.forEach((O)=>z(O,J,"body"));if(J.params)J.params.forEach((O)=>z(O,J,"params"));if(J.hash?.pairs)J.hash.pairs.forEach((O)=>z(O.value,J,"hash"));if(J.path)z(J.path,J,"path")};z(Y)}catch(Y){throw Error(`Invalid Handlebars template: ${Y.message}`)}return K},c96=($)=>{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,targetJobDockerImage:null,targetJobClearFlag:!1,targetJobClearMessage:!1,targetJobResumePrompt:null,skipDialog:!1,targetSubtype:null,targetFields:null};let{parameters:K,target:q,targetPath:Y,targetParentId:z,targetName:J,targetRoot:W,targetStore:Z,targetJobName:O,targetJobAgent:H,targetJobModel:X,targetJobWorktree:w,targetJobSkipDialog:P,targetJobStreaming:G,targetJobDockerImage:T,targetJobClearFlag:v,targetJobClearMessage:M,targetJobResumePrompt:V,skipDialog:D,targetSubtype:N,targetFields:E}=kR1($);return{parameters:K,target:q,targetPath:Y,targetParentId:z,targetName:J,targetRoot:W,targetStore:Z,targetJobName:O,targetJobAgent:H,targetJobModel:X,targetJobWorktree:w,targetJobSkipDialog:P,targetJobStreaming:G,targetJobDockerImage:T,targetJobClearFlag:v,targetJobClearMessage:M,targetJobResumePrompt:V,skipDialog:D,targetSubtype:N,targetFields:E}},LC=Object.freeze({parseFrontMatter:kR1,extractVariables:U96,getParameters:c96});var zE=X6(JM(),1),fU1=X6(NU1(),1);fU1.default({handlebars:zE.default});var yq6=($={})=>{return Object.freeze({renderTemplate:(Y,z={})=>{if(!Y)throw h.validation("Template content cannot be empty","EMPTY_TEMPLATE");let{body:J}=LC.parseFrontMatter(Y),W;try{W=zE.default.compile(J,{noEscape:!0})(z)}catch(Z){throw h.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,targetJobDockerImage:null,targetJobClearFlag:!1,targetJobClearMessage:!1,skipDialog:!1,targetSubtype:null,targetFields:null};let{parameters:z,target:J,targetPath:W,targetParentId:Z,targetName:O,targetRoot:H,targetStore:X,targetJobName:w,targetJobAgent:P,targetJobModel:G,targetJobWorktree:T,targetJobSkipDialog:v,targetJobStreaming:M,targetJobDockerImage:V,targetJobClearFlag:D,targetJobClearMessage:N,skipDialog:E,targetSubtype:x,targetFields:b,body:S}=LC.parseFrontMatter(Y),I=LC.extractVariables(S),C=Array.from(I);return{parameters:z,detectedVariables:C,target:J,targetPath:W,targetParentId:Z,targetName:O,targetRoot:H,targetStore:X,targetJobName:w,targetJobAgent:P,targetJobModel:G,targetJobWorktree:T,targetJobSkipDialog:v,targetJobStreaming:M,targetJobDockerImage:V,targetJobClearFlag:D,targetJobClearMessage:N,skipDialog:E,targetSubtype:x,targetFields:b}}})},el=Object.freeze({create:yq6});import CM from"node:fs";import kU1 from"node:os";import JE from"node:path";c6();var bq6=({projectStore:$,storeStore:K})=>{return Object.freeze({createProject:async(Z,O,{name:H,path:X},w)=>{if(await $.readProjectByPath(Z,O,X))throw h.conflict("Project with this path already exists","DUPLICATE_PATH");let G=await $.createProject(Z,O,{name:H,path:X},w),T=await K.createLocalStore(Z,O,{code:"A",name:"Project"},w);await T.createFolder(Z,O,{parentId:null,name:"Documents",subtype:"root_d"},w),await T.createFolder(Z,O,{parentId:null,name:"Templates",subtype:"root_t"},w),await T.createFolder(Z,O,{parentId:null,name:"Stories",subtype:"root_s"},w),await T.createFolder(Z,O,{parentId:null,name:"Jobs",subtype:"root_j"},w),await T.createFolder(Z,O,{parentId:null,name:"Settings",subtype:"root_settings"},w);let v=await T.readSettingsRootFolder(Z,O,{storeCode:"A"}),M=await T.createFolder(Z,O,{parentId:v.getObjectId(),name:"Stories",subtype:null},w),V=await T.createFolder(Z,O,{parentId:v.getObjectId(),name:"Jobs",subtype:null},w),D=await T.createFolder(Z,O,{parentId:v.getObjectId(),name:"Deleted Items",subtype:null},w),N=await T.createFolder(Z,O,{parentId:M.getObjectId(),name:"Tracks",subtype:null},w),{entity:E}=await T.createSetting(Z,O,{storeCode:"A",parentId:N.getObjectId(),name:"Default",subtype:"track"},w);await T.setFieldValue(Z,O,{entityId:E.getObjectId(),fieldName:"states",values:[...Ik]},w);let{entity:x}=await T.createSetting(Z,O,{storeCode:"A",parentId:M.getObjectId(),name:"auto-archive-delay",subtype:"auto-archive-config"},w);await T.setFieldValue(Z,O,{entityId:x.getObjectId(),fieldName:"delayMs",value:604800000},w);let{entity:b}=await T.createSetting(Z,O,{storeCode:"A",parentId:V.getObjectId(),name:"job-config",subtype:"job-config"},w);await T.setFieldValue(Z,O,{entityId:b.getObjectId(),fieldName:"maxConcurrentJobs",value:5},w);let{entity:S}=await T.createSetting(Z,O,{storeCode:"A",parentId:D.getObjectId(),name:"disposal-config",subtype:"disposal-config"},w);await T.setFieldValue(Z,O,{entityId:S.getObjectId(),fieldName:"scratchDocDelayDays",value:7},w),await T.setFieldValue(Z,O,{entityId:S.getObjectId(),fieldName:"jobDelayDays",value:7},w),await T.setFieldValue(Z,O,{entityId:S.getObjectId(),fieldName:"retentionDays",value:30},w);let{entity:I}=await T.createSetting(Z,O,{storeCode:"A",parentId:V.getObjectId(),name:"resume-config",subtype:"resume-config"},w);await T.setFieldValue(Z,O,{entityId:I.getObjectId(),fieldName:"maxResumeAttempts",value:3},w),await T.setFieldValue(Z,O,{entityId:I.getObjectId(),fieldName:"cronIntervalMs",value:60000},w);let C=await K.readSharedStore(Z,O),k=await K.createDemuxStore(Z,O,{name:H},w);return await K.addChildToDemux(Z,O,{demuxId:k.getObjectId(),childId:T.getObjectId()},w),await K.addChildToDemux(Z,O,{demuxId:k.getObjectId(),childId:C.getObjectId()},w),await K.addStoresToProject(Z,O,{projectId:G.getObjectId(),rootStoreId:k.getObjectId(),storeIds:[k.getObjectId(),T.getObjectId(),C.getObjectId()]}),G},validateProjectPath:(Z)=>{if(!Z||typeof Z!=="string")throw h.validation("Path is required and must be a non-empty string","VALIDATION_ERROR");let O;if(Z==="~")O=kU1.homedir();else if(Z.startsWith("~/"))O=JE.join(kU1.homedir(),Z.slice(2));else O=Z;let H=CM.existsSync(O),X=!1,w=!1,P=!1;if(H)try{if(X=CM.statSync(O).isDirectory(),X){let v=JE.join(O,".git");try{w=CM.statSync(v).isDirectory()}catch{w=!1}let M=JE.join(O,".claude");try{P=CM.statSync(M).isDirectory()}catch{P=!1}}}catch(T){X=!1}let G=JE.basename(O);return{path:O,exists:H,isDirectory:X,hasGit:w,hasClaude:P,suggestedName:G}},listProjects:async(Z)=>{let O=await Z.selectFrom("entities").innerJoin("string_fields","string_fields.entity_id","entities.id").innerJoin("field_definitions","field_definitions.id","string_fields.field_definition_id").select(["entities.id","entities.object_id","entities.name","entities.created_at","entities.updated_at","string_fields.value as path"]).where("entities.type_code","=","p").where("entities.deleted_at","is",null).where("field_definitions.name","=","path").where("field_definitions.store_id","is",null).where("field_definitions.is_system","=",1).where("entities.name","!=","__system__").orderBy("entities.created_at","desc").execute();return await Promise.all(O.map(async(X)=>{let P=(await Z.selectFrom("project_stores").innerJoin("entities","entities.id","project_stores.store_id").innerJoin("entity_types","entity_types.id","entities.entity_type_id").leftJoin("string_fields","string_fields.entity_id","entities.id").leftJoin("field_definitions","field_definitions.id","string_fields.field_definition_id").select(["entities.object_id","entities.name","entity_types.subtype","string_fields.value as code"]).where("project_stores.project_id","=",X.id).where("entities.type_code","=","r").where("entity_types.subtype","=","local").where((G)=>G.or([G("field_definitions.name","=","code"),G("field_definitions.name","is",null)])).where("entities.deleted_at","is",null).execute()).map((G)=>({id:G.code==="B"?"store:B":`store:${G.code}:${X.object_id}`,code:G.code,name:G.name}));return{objectId:X.object_id,name:X.name,path:X.path,createdAt:X.created_at,updatedAt:X.updated_at,children:P}}))},renameProject:async(Z,O,{id:H,name:X},w)=>{if(!X||typeof X!=="string"||X.trim()==="")throw h.validation("Name is required","VALIDATION_ERROR");let P=X.trim();if(P.length>255)throw h.validation("Name exceeds maximum length (255)","VALIDATION_ERROR");if(!await $.readProject(Z,O,H))throw h.notFound(`Project not found: ${H}`,"PROJECT_NOT_FOUND");return await $.updateProject(Z,O,{id:H,name:P},w)},deleteProject:async(Z,O,{id:H},X)=>{if(!await $.readProject(Z,O,H))throw h.notFound(`Project not found: ${H}`,"PROJECT_NOT_FOUND");return await $.deleteProject(Z,O,{id:H},X)}})},KZ=Object.freeze({create:bq6});var DU1=X6(g6(),1),$i=DU1.default("caw:hooks"),RU1=0,CU1=()=>RU1,Bq6=()=>{let $=[];return{enqueuePostCommitHook:(K,q,Y)=>{$.push({name:K,fn:q,onError:Y})},flush:()=>{for(let{name:K,fn:q,onError:Y}of $)try{q()}catch(z){if(RU1++,$i("Post-commit hook failed: %s %o",K,z),Y)try{Y(z)}catch(J){$i("onError callback failed for hook %s: %o",K,J)}}},rollback:()=>{for(let{name:K,onError:q}of $)if(q)try{q(null)}catch(Y){$i("Rollback hook failed for %s: %o",K,Y)}}}},mq6=async($,K,{story:q,trackService:Y})=>{if(!Y)return{};let z=q.getField("track")?.getValue();if(!z)return{};try{let J=await Y.getTrackById($,K,{id:z});return{story:{track:J.getName(),trackId:J.getObjectId(),trackStore:W6.extractStoreCode(J.getObjectId())}}}catch(J){return{}}},Uq6=({db:$,store:K,folderService:q,fieldService:Y,documentService:z,templateService:J,projectService:W,clipboardService:Z,storyService:O,trackService:H,assetService:X,jobService:w,includeResolver:P,worktreeService:G,entityTypeService:T,progressService:v,duplicationService:M})=>{let V=async(d1)=>{let O1=Bq6(),k1;try{await $.transaction().execute(async(_1)=>{k1=await d1(_1,O1.enqueuePostCommitHook)})}catch(_1){throw O1.rollback(),_1}return O1.flush(),k1};return Object.freeze({createFolder:async(d1,{mode:O1,store:k1,path:_1,root:f1,parentId:y1,name:T8,type:b8,subtype:s8,fields:d8})=>{return V(async(T6,S1)=>{return await q.createFolder(T6,d1,{mode:O1,store:k1,path:_1,root:f1,parentId:y1,name:T8,type:b8,subtype:s8,fields:d8},S1)})},renameFolder:async(d1,{id:O1,name:k1})=>{return V(async(_1,f1)=>{return await q.renameFolder(_1,d1,{id:O1,name:k1},f1)})},moveFolder:async(d1,{id:O1,parentId:k1})=>{return V(async(_1,f1)=>{return await q.moveFolder(_1,d1,{id:O1,parentId:k1},f1)})},deleteFolder:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await q.deleteFolder(k1,d1,{id:O1},_1)})},createProject:async(d1,{name:O1,path:k1},_1)=>{return V(async(f1,y1)=>{let T8=await W.createProject(f1,d1,{name:O1,path:k1},y1);if(_1)y1(`notify:projectCreated:${T8.getObjectId()}`,()=>{_1({id:T8.getObjectId(),name:T8.getName(),path:T8.getPath()})});return T8})},renameProject:async(d1,{id:O1,name:k1})=>{return V(async(_1,f1)=>{return await W.renameProject(_1,d1,{id:O1,name:k1},f1)})},deleteProject:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await W.deleteProject(k1,d1,{id:O1},_1)})},createFieldDefinition:async(d1,{store:O1,ownerEntityId:k1,ownerEntityTypeCode:_1,ownerEntityTypeSubtype:f1,name:y1,label:T8,description:b8,primitiveType:s8,required:d8,multiplicity:T6,isSystem:S1,allowed:x1})=>{return V(async(X1,$8)=>{return await Y.createFieldDefinition(X1,d1,{store:O1,ownerEntityId:k1,ownerEntityTypeCode:_1,ownerEntityTypeSubtype:f1,name:y1,label:T8,description:b8,primitiveType:s8,required:d8,multiplicity:T6,isSystem:S1,allowed:x1},$8)})},addFieldToEntity:async(d1,{entityId:O1,fieldDefinitionId:k1,fieldName:_1,value:f1,values:y1})=>{return V(async(T8,b8)=>{let s8=await Y.addFieldToEntity(T8,d1,{entityId:O1,fieldDefinitionId:k1,fieldName:_1,value:f1,values:y1},b8);return s8?.entity??s8})},updateFieldValue:async(d1,{entityId:O1,fieldDefinitionId:k1,fieldName:_1,value:f1,values:y1})=>{return V(async(T8,b8)=>{return await Y.updateFieldValue(T8,d1,{entityId:O1,fieldDefinitionId:k1,fieldName:_1,value:f1,values:y1},b8)})},setFieldValue:async(d1,{entityId:O1,fieldDefinitionId:k1,fieldName:_1,value:f1,values:y1,dependencies:T8})=>{return V(async(b8,s8)=>{let d8=await Y.setFieldValue(b8,d1,{entityId:O1,fieldDefinitionId:k1,fieldName:_1,value:f1,values:y1,dependencies:T8},s8);return d8?.entity??d8})},removeFieldFromEntity:async(d1,{entityId:O1,fieldDefinitionId:k1,fieldName:_1})=>{return V(async(f1,y1)=>{return await Y.removeFieldFromEntity(f1,d1,{entityId:O1,fieldDefinitionId:k1,fieldName:_1},y1)})},deleteFieldDefinition:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await Y.deleteFieldDefinition(k1,d1,{id:O1},_1)})},addClassAssociation:async(d1,{store:O1,fieldDefinitionId:k1,entityTypeCode:_1,entityTypeSubtype:f1,required:y1,sortOrder:T8,rows:b8,colspan:s8,description:d8,hidden:T6})=>{return V(async(S1,x1)=>{return await Y.addClassAssociation(S1,d1,{store:O1,fieldDefinitionId:k1,entityTypeCode:_1,entityTypeSubtype:f1,required:y1,sortOrder:T8,rows:b8,colspan:s8,description:d8,hidden:T6},x1)})},createSubtype:async(d1,{code:O1,subtype:k1,name:_1,parentSubtype:f1})=>{return V(async(y1,T8)=>{return await T.createSubtype(y1,d1,{code:O1,subtype:k1,name:_1,parentSubtype:f1},T8)})},createDocument:async(d1,{mode:O1,store:k1,path:_1,root:f1,parentId:y1,name:T8,type:b8,content:s8,tree:d8,subtype:T6,fields:S1})=>{return V(async(x1,X1)=>{return await z.createDocument(x1,d1,{mode:O1,store:k1,path:_1,root:f1,parentId:y1,name:T8,type:b8,content:s8,tree:d8,subtype:T6,fields:S1},X1)})},createTemplate:async(d1,{mode:O1,store:k1,path:_1,root:f1,parentId:y1,name:T8,content:b8,subtype:s8})=>{return V(async(d8,T6)=>{return await z.createTemplate(d8,d1,{mode:O1,store:k1,path:_1,root:f1,parentId:y1,name:T8,content:b8,subtype:s8},T6)})},updateDocumentPath:async(d1,{id:O1,path:k1,parentId:_1,type:f1})=>{return V(async(y1,T8)=>{return await z.updateDocumentPath(y1,d1,{id:O1,path:k1,parentId:_1,type:f1},T8)})},deleteDocument:async(d1,{id:O1,ack:k1})=>{return V(async(_1,f1)=>{return await z.deleteDocument(_1,d1,{id:O1,ack:k1},f1)})},saveDraft:async(d1,{id:O1,content:k1,sessionId:_1})=>{return V(async(f1,y1)=>{return await z.saveDraft(f1,d1,{id:O1,content:k1,sessionId:_1},y1)})},publishDocument:async(d1,{id:O1,sessionId:k1})=>{return V(async(_1,f1)=>{let y1=await z.publishDocument(_1,d1,{id:O1,sessionId:k1},f1);if(v)await v.calculateAndStoreProgress(_1,d1,O1,f1,{includeDraft:!1});return y1})},discardDraft:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await z.discardDraft(k1,d1,{id:O1},_1)})},setEditState:async(d1,{id:O1,sessionId:k1})=>{return V(async(_1,f1)=>{return await z.setEditState(_1,d1,{id:O1,sessionId:k1},f1)})},clearEditState:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await z.clearEditState(k1,d1,{id:O1},_1)})},editDocument:async(d1,{id:O1,operation:k1,preview:_1,ignoreContent:f1,sessionId:y1})=>{return V(async(T8,b8)=>{return await z.editDocument(T8,d1,{id:O1,operation:k1,preview:_1,ignoreContent:f1,sessionId:y1},b8)})},batchEditDocument:async(d1,{id:O1,operations:k1,preview:_1,ignoreContent:f1,sessionId:y1})=>{return V(async(T8,b8)=>{return await z.batchEditDocument(T8,d1,{id:O1,operations:k1,preview:_1,ignoreContent:f1,sessionId:y1},b8)})},checkChecklistItem:async(d1,{id:O1,lineNumber:k1,checked:_1,includeDraft:f1,preview:y1,sessionId:T8})=>{return V(async(b8,s8)=>{let d8=await z.checkChecklistItem(b8,d1,{id:O1,lineNumber:k1,checked:_1,includeDraft:f1,preview:y1,sessionId:T8},s8);if(!y1&&v)await v.calculateAndStoreProgress(b8,d1,O1,s8);return d8})},toggleChecklistItem:async(d1,{id:O1,lineNumber:k1,includeDraft:_1,preview:f1,sessionId:y1})=>{return V(async(T8,b8)=>{let s8=await z.toggleChecklistItem(T8,d1,{id:O1,lineNumber:k1,includeDraft:_1,preview:f1,sessionId:y1},b8);if(!f1&&v)await v.calculateAndStoreProgress(T8,d1,O1,b8);return s8})},batchCheckChecklistItems:async(d1,{id:O1,items:k1,includeDraft:_1,preview:f1,sessionId:y1})=>{return V(async(T8,b8)=>{let s8=await z.batchCheckChecklistItems(T8,d1,{id:O1,items:k1,includeDraft:_1,preview:f1,sessionId:y1},b8);if(!f1&&v)await v.calculateAndStoreProgress(T8,d1,O1,b8);return s8})},specialiseDocument:async(d1,{id:O1,subtype:k1,fields:_1})=>{return V(async(f1,y1)=>{return await z.specialiseDocument(f1,d1,{id:O1,subtype:k1,fields:_1},y1)})},generaliseDocument:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await z.generaliseDocument(k1,d1,{id:O1},_1)})},specialiseFolder:async(d1,{id:O1,subtype:k1})=>{return V(async(_1,f1)=>{return await z.specialiseFolder(_1,d1,{id:O1,subtype:k1},f1)})},generaliseFolder:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await z.generaliseFolder(k1,d1,{id:O1},_1)})},duplicateDocument:async(d1,{sourceId:O1,targetParentId:k1,newName:_1})=>{return V(async(f1,y1)=>{return await M.duplicateDocument(f1,d1,{sourceId:O1,targetParentId:k1,newName:_1},y1)})},duplicateFolder:async(d1,{sourceId:O1,targetParentId:k1,newName:_1})=>{return V(async(f1,y1)=>{return await M.duplicateFolder(f1,d1,{sourceId:O1,targetParentId:k1,newName:_1},y1)})},restoreEvent:async(d1,{deletedAt:O1,storeCode:k1})=>{let _1=await K.findDeletedEventRoot($,d1,{deletedAt:O1,storeCode:k1});if(!_1)throw(await Promise.resolve().then(() => (c6(),SW))).default.notFound(`No deletion event found for timestamp: ${O1}`,"NOT_FOUND");return V(async(f1,y1)=>{return await K.restoreEntity(f1,d1,{id:_1,deletedAt:O1},y1)})},renderTemplate:async(d1,{id:O1,params:k1,target:_1,targetOptions:f1,sessionId:y1})=>{let{entity:T8}=await z.readDocument($,d1,{id:O1,resolveIncludes:!1});if(!T8.getPublishedContent())throw(await Promise.resolve().then(() => (c6(),SW))).default.validation("Template has no published content","NO_PUBLISHED_CONTENT");let b8=T8.getPublishedContent(),{target:s8,targetPath:d8,targetParentId:T6,targetName:S1,targetRoot:x1,targetStore:X1,targetJobName:$8,targetJobAgent:M1,targetJobModel:a1,targetJobWorktree:t1,targetJobStreaming:G8,targetJobDockerImage:A8,targetJobClearFlag:E8,targetJobClearMessage:x8,targetJobResumePrompt:Q8,targetSubtype:I6,targetFields:B6}=J.extractTemplateParameters(b8),F=_1||s8||"stdout",e=f1?.parentId||f1?.root||f1?.path?{path:f1?.path,parentId:f1?.parentId,name:f1?.name,root:f1?.root,store:f1?.store,publish:f1?.publish}:{path:f1?.path||d8,parentId:f1?.parentId||T6,name:f1?.name||S1,root:f1?.root||x1,store:f1?.store||X1,publish:f1?.publish},V1=f1?.subtype||I6,Z1=f1?.fields||B6,Q=b8;if(P)Q=await P.resolve($,d1,b8,O1);let i=f1?.objectId||k1?.["object-id"],c=k1||{};if(i&&i[1]==="s")try{let $1=await O.getStory($,d1,{id:i});c={...await mq6($,d1,{story:$1,trackService:H}),...c}}catch($1){}let d=J.renderTemplate(Q,c);if(e.path)e.path=J.renderTemplate(e.path,k1||{});if(e.name)e.name=J.renderTemplate(e.name,k1||{});let o=null;if(Z1){o={};for(let[$1,v1]of Object.entries(Z1))if(typeof v1==="string")o[$1]=J.renderTemplate(v1,k1||{});else if(Array.isArray(v1))o[$1]=v1.map((h1)=>typeof h1==="string"?J.renderTemplate(h1,k1||{}):h1);else o[$1]=v1}switch(F){case"stdout":return{content:d,target:"stdout"};case"clipboard":return await Z.copyToClipboard(d),{target:"clipboard",message:"Copied to clipboard"};case"document":return V(async(h1,F1)=>{let K8=(await Promise.resolve().then(() => (c6(),SW))).default,w8;if(e.parentId){if(!e.name)throw K8.validation("targetOptions.name is required when parentId is provided","MISSING_TARGET_NAME");w8={mode:"parentName",parentId:e.parentId,name:e.name,content:d,subtype:V1,fields:o}}else if(e.root){if(!e.path)throw K8.validation("targetOptions.path is required when root is provided","MISSING_TARGET_PATH");w8={mode:"rootRelative",root:e.root,path:e.path,content:d,subtype:V1,fields:o}}else{if(!e.path)throw K8.validation("targetOptions.path is required for document target","MISSING_TARGET_PATH");w8={mode:"fullPath",store:e.store||"A",path:e.path,content:d,subtype:V1,fields:o}}let D8=await z.createDocument(h1,d1,w8,F1);if(e.publish)await z.publishDocument(h1,d1,{id:D8.getObjectId(),sessionId:y1},F1);return{content:d,target:"document",documentId:D8.getObjectId(),documentPath:e.path||e.name,published:!!e.publish}});case"job":return V(async(h1,F1)=>{let K8=(await Promise.resolve().then(() => (c6(),SW))).default;if(!d||!d.trim())throw K8.validation("Template rendered to empty prompt","MISSING_PROMPT");let w8=f1?.jobName||$8,D8=f1?.jobAgent||M1||"claude",m8=f1?.jobModel||a1,y8=f1?.jobWorktree||t1,I8=f1?.jobStreaming??G8,O6=f1?.jobDockerImage||A8,b6=f1?.objectId||k1?.["object-id"],o6=E8?"true":void 0,V4=x8?"true":void 0,l6=null;if(w8)l6=J.renderTemplate(w8,k1||{});let q2=null;if(y8&&G){let{worktrees:s2}=await G.listWorktrees({projectPath:d1.projectPath}),N2=s2.find((y2)=>y2.branch===y8);if(!N2)throw K8.validation(`Worktree with branch '${y8}' not found`,"WORKTREE_NOT_FOUND");q2=N2.path}let d6=W6.extractStoreCode(O1),d4=await w.createJob(h1,d1,{store:d6,name:l6,agent:D8,model:m8,prompt:d,workingDirectory:q2,objectId:b6,streaming:I8,dockerImage:O6,clearStoryFlag:o6,clearStatusMessage:V4,resumePromptRef:Q8||void 0},F1);return{target:"job",jobId:d4.getObjectId(),jobName:d4.getName()}});case"file":throw(await Promise.resolve().then(() => (c6(),SW))).default.validation("file target not yet implemented","NOT_IMPLEMENTED");default:throw(await Promise.resolve().then(() => (c6(),SW))).default.validation(`Unknown target: ${F}`,"INVALID_TARGET")}},createStory:async(d1,{name:O1,storeCode:k1,state:_1,track:f1,phase:y1})=>{return V(async(T8,b8)=>{return await O.createStory(T8,d1,{store:k1,name:O1,state:_1,track:f1,phase:y1},b8)})},renameStory:async(d1,{id:O1,name:k1})=>{return V(async(_1,f1)=>{return await O.renameStory(_1,d1,{id:O1,name:k1},f1)})},updateStoryState:async(d1,{id:O1,state:k1})=>{return V(async(_1,f1)=>{return await O.updateStoryState(_1,d1,{id:O1,state:k1},f1)})},changeTrack:async(d1,{id:O1,track:k1,targetState:_1})=>{return V(async(f1,y1)=>{return await O.changeTrack(f1,d1,{id:O1,track:k1,targetState:_1},y1)})},deleteStory:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await O.deleteStory(k1,d1,{id:O1},_1)})},incrementStoryJobCount:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await O.incrementActiveJobCount(k1,d1,{id:O1},_1)})},decrementStoryJobCount:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await O.decrementActiveJobCount(k1,d1,{id:O1},_1)})},setStoryJobCount:async(d1,{id:O1,count:k1})=>{return V(async(_1,f1)=>{return await O.setActiveJobCount(_1,d1,{id:O1,count:k1},f1)})},reorderStories:async(d1,{store:O1,phase:k1,orderedIds:_1})=>{return V(async(f1,y1)=>{return await O.reorderStories(f1,d1,{store:O1,phase:k1,orderedIds:_1},y1)})},reorderSingle:async(d1,{store:O1,storyId:k1,afterId:_1})=>{return V(async(f1,y1)=>{return await O.reorderSingle(f1,d1,{store:O1,storyId:k1,afterId:_1},y1)})},createTrack:async(d1,{store:O1,name:k1,states:_1})=>{return V(async(f1,y1)=>{return await H.createTrack(f1,d1,{store:O1,name:k1,states:_1},y1)})},updateTrack:async(d1,{id:O1,name:k1,states:_1,renames:f1})=>{return V(async(y1,T8)=>{return await H.updateTrack(y1,d1,{id:O1,name:k1,states:_1,renames:f1},T8)})},deleteTrack:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await H.deleteTrack(k1,d1,{id:O1},_1)})},createAsset:async(d1,{store:O1,buffer:k1,mimeType:_1,originalFilename:f1,widthPx:y1,heightPx:T8,displayWidth:b8,displayHeight:s8})=>{return V(async(d8,T6)=>{return await X.createAsset(d8,d1,{store:O1,buffer:k1,mimeType:_1,originalFilename:f1,widthPx:y1,heightPx:T8,displayWidth:b8,displayHeight:s8},T6)})},deleteAsset:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await X.deleteAsset(k1,d1,{id:O1},_1)})},createJob:async(d1,{store:O1,name:k1,agent:_1,model:f1,prompt:y1,workingDirectory:T8,objectId:b8,streaming:s8,parentJobId:d8,blocking:T6,dockerImage:S1,clearStoryFlag:x1,clearStatusMessage:X1,resumePromptRef:$8,defaultResumePromptRef:M1})=>{return V(async(a1,t1)=>{return await w.createJob(a1,d1,{store:O1,name:k1,agent:_1,model:f1,prompt:y1,workingDirectory:T8,objectId:b8,streaming:s8,parentJobId:d8,blocking:T6,dockerImage:S1,clearStoryFlag:x1,clearStatusMessage:X1,resumePromptRef:$8,defaultResumePromptRef:M1},t1)})},deleteJob:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await w.deleteJob(k1,d1,{id:O1},_1)})},updateJobStatus:async(d1,{id:O1,status:k1,exitCode:_1,errorMessage:f1,resumeAt:y1,resumeAttempts:T8,segmentStartedAt:b8})=>{return V(async(s8,d8)=>{return await w.updateJobStatus(s8,d1,{id:O1,status:k1,exitCode:_1,errorMessage:f1,resumeAt:y1,resumeAttempts:T8,segmentStartedAt:b8},d8)})},updateJobOutput:async(d1,{id:O1,output:k1})=>{return V(async(_1,f1)=>{return await w.updateJobOutput(_1,d1,{id:O1,output:k1},f1)})},updateJobTokens:async(d1,{id:O1,tokensUsed:k1})=>{return V(async(_1,f1)=>{return await w.updateJobTokens(_1,d1,{id:O1,tokensUsed:k1},f1)})},updateJobMetadata:async(d1,{id:O1,durationMs:k1,totalCostUsd:_1,numTurns:f1,sessionId:y1})=>{return V(async(T8,b8)=>{return await w.updateJobMetadata(T8,d1,{id:O1,durationMs:k1,totalCostUsd:_1,numTurns:f1,sessionId:y1},b8)})},continueJob:async(d1,{id:O1,prompt:k1,model:_1,streaming:f1,workingDirectory:y1,dockerImage:T8,skipPermissions:b8})=>{try{return await V(async(s8,d8)=>{return await w.continueJob(s8,d1,{id:O1,prompt:k1,model:_1,streaming:f1,workingDirectory:y1,dockerImage:T8,skipPermissions:b8},d8)})}catch(s8){if(s8.code==="BUDGET_EXHAUSTED")await V(async(d8,T6)=>{await w.updateJobStatus(d8,d1,{id:O1,status:"error",errorMessage:s8.errorMessage},T6)});throw s8}},stopJob:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await w.stopJob(k1,d1,{id:O1},_1)})},setJobPid:async(d1,{id:O1,pid:k1})=>{return V(async(_1,f1)=>{return await w.setJobPid(_1,d1,{id:O1,pid:k1},f1)})},clearJobPid:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await w.clearJobPid(k1,d1,{id:O1},_1)})},renameJob:async(d1,{id:O1,name:k1})=>{return V(async(_1,f1)=>{return await w.renameJob(_1,d1,{id:O1,name:k1},f1)})}})},EM=Object.freeze({create:Uq6});c6();var u38=X6(h38(),1),y38=X6(g6(),1);import N3 from"fs/promises";import o2 from"path";import{createWriteStream as qb6}from"fs";import Yb6 from"crypto";var _b6=($,{minInterval:K=80,minItems:q=10,now:Y=()=>Date.now()}={})=>{if(!$)return Object.freeze({report:()=>{},flush:()=>{}});let z=0,J=0,W=null;return Object.freeze({report:({phase:H,current:X,total:w,label:P})=>{let G=Y();if(X===0||X===w||G-z>=K||X-J>=q)return $({phase:H,current:X,total:w,label:P}),z=G,J=X,W=null,new Promise((T)=>setImmediate(T));else W={phase:H,current:X,total:w,label:P}},flush:()=>{if(W!==null)return $(W),W=null,new Promise((H)=>setImmediate(H))}})},Ch=Object.freeze({create:_b6});var Wj={"auto-archive-delay":"Stories","job-config":"Jobs","resume-config":"Jobs","disposal-config":"Deleted Items"},Zj=[...new Set(Object.values(Wj))];var A9=y38.default("caw:export"),I38=".caw-exports",x38=".tmp",zb6=6,g38=($)=>$==="B"?"shared":"project",Jb6=($,K)=>{if(!$)return $;try{let q=JSON.parse($),Y=q?.visibility?.story;if(!Y||typeof Y!=="object")return $;let z=!1,J={};for(let[W,Z]of Object.entries(Y))if(K.has(W))J[JSON.stringify(K.get(W))]=Z,z=!0;else J[W]=Z;if(!z)return $;return q.visibility.story=J,JSON.stringify(q)}catch{return $}},Wb6=({store:$,folderService:K,documentService:q,templateService:Y,storyService:z,trackService:J,settingService:W,assetService:Z,assetsDir:O})=>{let H=()=>{let I=new Date,C=I.getFullYear(),k=String(I.getMonth()+1).padStart(2,"0"),R=String(I.getDate()).padStart(2,"0"),u=String(I.getHours()).padStart(2,"0"),g=String(I.getMinutes()).padStart(2,"0"),s=String(I.getSeconds()).padStart(2,"0");return`${C}-${k}-${R}-${u}${g}${s}`},X=async(I,C)=>{let k=C||(I?o2.join(I,I38):null);if(!k)throw h.validation("Either exportPath or projectPath must be provided","EXPORT_PATH_REQUIRED");let R=o2.join(k,x38);try{return await N3.mkdir(k,{recursive:!0}),await N3.mkdir(R,{recursive:!0}),k}catch(u){if(u.code==="EACCES")throw h.validation("Permission denied creating export directory","EXPORT_ERROR");if(u.code==="ENOSPC")throw h.validation("Insufficient disk space","EXPORT_ERROR");throw A9("Error creating export directory: [%s] %s",u.code||"UNKNOWN",u.message),h.validation(`Failed to create export directory: ${u.message} (${u.code||"UNKNOWN"})`,"EXPORT_ERROR")}},w=async(I,C,k,R)=>{let u=[],g=[],s=async(J1,Y1)=>{let E1=await K.listFolderContents(I,C,{folderId:J1,type:k,storeCode:R,includeDeleted:!0});for(let w1 of E1)if(w1.getParentId()!==null){if(w1.getName()==="Tracks")continue;let j1={entity:w1,depth:Y1,contentType:k};if(w1.getDeletedAt()!==null)g.push(j1);else u.push(j1);await s(w1.getObjectId(),Y1+1)}};return await s(null,0),{toExport:u,deletedItems:g}},P=async(I,C,k)=>{let R=[],u=[],g=[],s=async(J1)=>{let Y1=await q.listDocuments(I,C,{parentId:J1,storeCode:k,includeDeleted:!0});for(let w1 of Y1){if(w1.getSubtype?.()==="track")continue;let A1=w1.getPublishedVersionNumber();if(A1===null)g.push(w1);else if(w1.getDeletedAt()!==null)u.push({entity:w1,version:{content:w1.getPublishedContent()}});else{let p1=await q.readVersion(I,C,{id:w1.getObjectId(),versionNumber:A1});R.push({entity:w1,version:p1})}}let E1=await K.listFolderContents(I,C,{folderId:J1,type:"d",storeCode:k,includeDeleted:!0});for(let w1 of E1){if(w1.getName()==="Tracks")continue;await s(w1.getObjectId())}};return await s(null),{toExport:R,deletedItems:u,draftOnly:g}},G=async(I,C,k)=>{let R=[],u=[],g=[],s=async(J1)=>{let Y1=await q.listDocuments(I,C,{parentId:J1,storeCode:k,type:"t",includeDeleted:!0});for(let w1 of Y1){let j1=w1.getPublishedVersionNumber();if(j1===null)g.push(w1);else if(w1.getDeletedAt()!==null)u.push({entity:w1,version:{content:w1.getPublishedContent()}});else{let A1=await q.readVersion(I,C,{id:w1.getObjectId(),versionNumber:j1});R.push({entity:w1,version:A1})}}let E1=await K.listFolderContents(I,C,{folderId:J1,type:"t",storeCode:k,includeDeleted:!0});for(let w1 of E1)await s(w1.getObjectId())};return await s(null),{toExport:R,deletedItems:u,draftOnly:g}},T=async(I,C,k)=>{let R=await Z.listAssets(I,C,{store:k}),u=[];for(let g of R){let s=g.hash,J1=s.substring(0,2),Y1=o2.join(O,J1,s);try{let E1=await N3.readFile(Y1);u.push({entity:g,buffer:E1})}catch(E1){if(E1.code==="ENOENT"){A9("Warning: Skipping asset %s - blob file missing",g.id);continue}throw E1}}return A9("Collected %d assets for export",u.length),u},v=new Set(["draft_version","latest_published_version"]),M=(I)=>{let C=typeof I.getFields==="function"?I.getFields():I.fields;if(!C||typeof C!=="object"||Object.keys(C).length===0)return;let k={};for(let[R,u]of Object.entries(C)){if(v.has(R))continue;if(EA(R)||typeof u?.getDefinition==="function"&&u.getDefinition().getIsVirtual())continue;let g;if(typeof u?.getValues==="function")g=u.getValues();else if(Array.isArray(u))g=u;else g=[u];k[R]=g.length===1?g[0]:g}return Object.keys(k).length>0?k:void 0},V=async(I,C,k)=>{let R=[],u=[],g={toExport:[],deletedItems:[]},s={toExport:[],deletedItems:[],draftOnly:[]};if(!z)return A9("StoryService not available, skipping story export"),{stories:{toExport:R,deletedItems:u},folders:g,documents:s};let J1=await z.listStories(I,C,{store:k,includeDeleted:!0});A9("Found %d stories for export",J1.length);for(let Y1 of J1){if(Y1.getDeletedAt()!==null)u.push(Y1);else R.push(Y1);await D(I,C,Y1,k,g.toExport,g.deletedItems,s)}return{stories:{toExport:R,deletedItems:u},folders:g,documents:s}},D=async(I,C,k,R,u,g,s)=>{let J1=k.id||k.getObjectId?.()||k,Y1=await $.listFolderContents(I,C,{folderId:J1,type:"s",storeCode:R,includeDeleted:!0});for(let w1 of Y1){if(w1.getParentId()!==null){let j1={entity:w1,contentType:"s"};if(w1.getDeletedAt()!==null)g.push(j1);else u.push(j1)}await D(I,C,w1.getObjectId(),R,u,g,s)}let E1=await q.listDocuments(I,C,{parentId:J1,storeCode:R,includeDeleted:!0});for(let w1 of E1){let j1=w1.getPublishedVersionNumber();if(j1===null)s.draftOnly.push(w1);else if(w1.getDeletedAt()!==null)s.deletedItems.push({entity:w1,version:{content:w1.getPublishedContent()}});else{let A1=await q.readVersion(I,C,{id:w1.getObjectId(),versionNumber:j1});s.toExport.push({entity:w1,version:A1})}}},N=async(I,C,k)=>{let R=[],u=[],g={toExport:[],deletedItems:[],draftOnly:[]};if(!await $.readJobRootFolder(I,C,{storeCode:k}))return A9("Job root folder not found, skipping job export"),{jobs:{toExport:R,deletedItems:u},documents:g};let{jobs:J1}=await $.listJobs(I,C,{storeCode:k,sortBy:"startedAt",sortDir:"desc",limit:1e4,offset:0,includeDeleted:!0}),Y1=J1.map(({entity:E1})=>E1);A9("Found %d jobs for export",Y1.length);for(let E1 of Y1){if(E1.getDeletedAt()!==null)u.push(E1);else R.push(E1);let w1=E1.getObjectId(),j1=await q.listDocuments(I,C,{parentId:w1,storeCode:k,includeDeleted:!0});for(let A1 of j1){let p1=A1.getPublishedVersionNumber();if(p1===null)g.draftOnly.push(A1);else if(A1.getDeletedAt()!==null)g.deletedItems.push({entity:A1,version:{content:A1.getPublishedContent()}});else{let n1=await q.readVersion(I,C,{id:A1.getObjectId(),versionNumber:p1});g.toExport.push({entity:A1,version:n1})}}}return{jobs:{toExport:R,deletedItems:u},documents:g}},E=async(I)=>{try{await N3.rm(I,{recursive:!0,force:!0})}catch(C){A9("Warning: Failed to cleanup temp directory: %s",C.message)}};return Object.freeze({listExports:async(I,C,{projectPath:k,exportPath:R})=>{let u=R||(k?o2.join(k,I38):null);if(!u)throw h.validation("Either exportPath or projectPath must be provided","EXPORT_PATH_REQUIRED");try{let g=await N3.readdir(u),s=[];for(let J1 of g)if(J1.endsWith(".zip")){let Y1=o2.join(u,J1),E1=await N3.stat(Y1);s.push({filename:J1,timestamp:E1.mtime.toISOString(),size:E1.size})}return A9("Found %d export files",s.length),s}catch(g){if(g.code==="ENOENT")return[];throw g}},exportPreview:async(I,C,{storeCode:k})=>{let R=await w(I,C,"d",k),u=await w(I,C,"t",k),{toExport:g,deletedItems:s,draftOnly:J1}=await P(I,C,k),{toExport:Y1,deletedItems:E1,draftOnly:w1}=await G(I,C,k),j1=Z?await Z.listAssets(I,C,{store:k}):[],{stories:A1,folders:p1,documents:n1}=await V(I,C,k),{jobs:Y8,documents:R8}=await N(I,C,k),v8=k==="A"?"all":k,k8=J?await J.listTracks(I,C,{store:v8}):[],h8=[];if(W){let G1=await $.readSettingsRootFolder(I,C,{storeCode:k});if(G1)for(let s1 of Zj){let L1=await $.findFolderByName(I,C,G1.getObjectId(),s1);if(L1){let J8=await W.listSettings(I,C,{parentId:L1.getObjectId(),store:k});h8=h8.concat(J8)}}}let g8=[...R.toExport,...u.toExport,...p1.toExport],L8=[...R.deletedItems,...u.deletedItems,...p1.deletedItems],V8={assets:j1.map((G1)=>({id:G1.id,originalFilename:G1.originalFilename,mimeType:G1.mimeType,sizeBytes:G1.sizeBytes})),folders:g8.map((G1)=>({id:G1.entity.getObjectId(),path:G1.entity.getPath(),name:G1.entity.getName()})),documents:g.map((G1)=>({id:G1.entity.getObjectId(),path:G1.entity.getPath(),name:G1.entity.getName()})),templates:Y1.map((G1)=>({id:G1.entity.getObjectId(),path:G1.entity.getPath(),name:G1.entity.getName()})),stories:A1.toExport.map((G1)=>({id:G1.getObjectId(),path:G1.getPath(),name:G1.getName()})),storyFolders:p1.toExport.map((G1)=>({id:G1.entity.getObjectId(),path:G1.entity.getPath(),name:G1.entity.getName()})),storyDocuments:n1.toExport.map((G1)=>({id:G1.entity.getObjectId(),path:G1.entity.getPath(),name:G1.entity.getName()})),jobs:Y8.toExport.map((G1)=>({id:G1.getObjectId(),path:G1.getPath(),name:G1.getName()})),jobDocuments:R8.toExport.map((G1)=>({id:G1.entity.getObjectId(),path:G1.entity.getPath(),name:G1.entity.getName()})),tracks:k8.map((G1)=>({id:G1.id,path:G1.path,name:G1.name})),settings:h8.map((G1)=>({id:G1.id,path:G1.path,name:G1.name}))},a={documents:J1.map((G1)=>({id:G1.getObjectId(),path:G1.getPath(),name:G1.getName()})),templates:w1.map((G1)=>({id:G1.getObjectId(),path:G1.getPath(),name:G1.getName()})),storyDocuments:n1.draftOnly.map((G1)=>({id:G1.getObjectId(),path:G1.getPath(),name:G1.getName()})),jobDocuments:R8.draftOnly.map((G1)=>({id:G1.getObjectId(),path:G1.getPath(),name:G1.getName()}))},z1={folders:L8.map((G1)=>({id:G1.entity.getObjectId(),path:G1.entity.getPath(),name:G1.entity.getName()})),documents:s.map((G1)=>({id:G1.entity.getObjectId(),path:G1.entity.getPath(),name:G1.entity.getName()})),templates:E1.map((G1)=>({id:G1.entity.getObjectId(),path:G1.entity.getPath(),name:G1.entity.getName()})),stories:A1.deletedItems.map((G1)=>({id:G1.getObjectId(),path:G1.getPath(),name:G1.getName()})),storyFolders:p1.deletedItems.map((G1)=>({id:G1.entity.getObjectId(),path:G1.entity.getPath(),name:G1.entity.getName()})),storyDocuments:n1.deletedItems.map((G1)=>({id:G1.entity.getObjectId(),path:G1.entity.getPath(),name:G1.entity.getName()})),jobs:Y8.deletedItems.map((G1)=>({id:G1.getObjectId(),path:G1.getPath(),name:G1.getName()})),jobDocuments:R8.deletedItems.map((G1)=>({id:G1.entity.getObjectId(),path:G1.entity.getPath(),name:G1.entity.getName()}))},T1=V8.assets.length+V8.folders.length+V8.documents.length+V8.templates.length+V8.stories.length+V8.storyFolders.length+V8.storyDocuments.length+V8.jobs.length+V8.jobDocuments.length+V8.tracks.length,R1=a.documents.length+a.templates.length+a.storyDocuments.length+a.jobDocuments.length,N1=z1.folders.length+z1.documents.length+z1.templates.length+z1.stories.length+z1.storyFolders.length+z1.storyDocuments.length+z1.jobs.length+z1.jobDocuments.length;return A9("Preview: %d published (%d assets, %d stories, %d jobs, %d tracks), %d draft-only, %d deleted",T1,V8.assets.length,V8.stories.length,V8.jobs.length,V8.tracks.length,R1,N1),{toExport:V8,draftOnly:a,deletedItems:z1}},exportDocuments:async(I,C,{storeCode:k,projectPath:R,exportPath:u,onProgress:g})=>{A9("Starting export for store %s",k);let s=await X(R,u),J1=Yb6.randomUUID(),Y1=o2.join(s,x38,J1);await N3.mkdir(Y1,{recursive:!0});try{let E1=await w(I,C,"d",k),w1=await w(I,C,"t",k),{toExport:j1,deletedItems:A1,draftOnly:p1}=await P(I,C,k),{toExport:n1,deletedItems:Y8,draftOnly:R8}=await G(I,C,k),v8=Z?await T(I,C,k):[],{stories:k8,folders:h8,documents:g8}=await V(I,C,k),{jobs:L8,documents:V8}=await N(I,C,k),a=k==="A"?"all":k,z1=J?await J.listTracks(I,C,{store:a}):[];A9("Found %d tracks for export (%s stores)",z1.length,a);let T1=new Map(z1.map((_1)=>[_1.id,{name:_1.name,scope:g38(_1.storeCode)}])),R1=[];if(W){let _1=await $.readSettingsRootFolder(I,C,{storeCode:k});if(_1)for(let f1 of Zj){let y1=await $.findFolderByName(I,C,_1.getObjectId(),f1);if(y1){let T8=await W.listSettings(I,C,{parentId:y1.getObjectId(),store:k});R1=R1.concat(T8)}}}A9("Found %d settings for export",R1.length);let N1=[...E1.toExport,...w1.toExport,...h8.toExport],G1=[...E1.deletedItems,...w1.deletedItems,...h8.deletedItems],s1=[...j1,...g8.toExport,...V8.toExport],L1=[...A1,...g8.deletedItems,...V8.deletedItems],J8=[...p1,...g8.draftOnly,...V8.draftOnly],b1=k8.toExport,M8=k8.deletedItems,Q1=L8.toExport,q8=L8.deletedItems,P8=Y8,H8=G1.length+L1.length+P8.length+M8.length+q8.length;A9("Collected %d soft-deleted entities for export",H8),A9("Found %d folders, %d documents, %d templates, %d assets, %d stories, %d jobs, %d tracks, %d settings (%d deleted)",N1.length,s1.length,n1.length,v8.length,b1.length,Q1.length,z1.length,R1.length,H8);let Z8={},z8=await $.readStoryRootFolder(I,C,{storeCode:k});if(z8){let _1=z8.toJSON(),f1=M(_1);if(f1&&Object.keys(f1).length>0)Z8[z8.getObjectId()]={subtype:"root_s",fields:f1}}let j8=(_1)=>{let f1={id:_1.getObjectId(),type:"story",name:_1.getName()},y1=_1.getDeletedAt();if(y1!==null)f1.deleted_at=y1;let T8=M(_1);if(T8?.track&&T1.has(T8.track))T8.track=T1.get(T8.track);if(T8)f1.fields=T8;return f1},C8=(_1)=>{let f1={id:_1.getObjectId(),type:"job",name:_1.getName()},y1=_1.getDeletedAt();if(y1!==null)f1.deleted_at=y1;let T8=M(_1);if(T8)f1.fields=T8;return f1},P6=(_1)=>{let f1={id:_1.entity.getObjectId(),type:"folder",path:_1.entity.getPath(),contentType:_1.contentType},y1=_1.entity.getDeletedAt();if(y1!==null)f1.deleted_at=y1;let T8=_1.entity.getSubtype?.();if(T8)f1.subtype=T8;let b8=M(_1.entity);if(b8)f1.fields=b8;return f1},S8=(_1)=>{let f1={id:_1.entity.getObjectId(),type:"document",path:_1.entity.getPath()},y1=_1.entity.getDeletedAt();if(y1!==null)f1.deleted_at=y1;let T8=_1.entity.getSubtype?.();if(T8)f1.subtype=T8;else{let s8=_1.entity.getPath(),d8=s8.split("/");if(d8.length>=4&&d8[2]==="tasks")A9('WARN: Document %s in tasks folder missing subtype, inferring "task"',s8),f1.subtype="task"}let b8=M(_1.entity);if(b8)f1.fields=b8;return f1},M6=(_1)=>{let f1={id:_1.entity.getObjectId(),type:"template",path:_1.entity.getPath()},y1=_1.entity.getDeletedAt();if(y1!==null)f1.deleted_at=y1;let T8=_1.entity.getSubtype?.();if(T8)f1.subtype=T8;let b8=M(_1.entity);if(b8?.config)b8.config=Jb6(b8.config,T1);if(b8)f1.fields=b8;return f1},Y6=[...v8.map((_1)=>({id:_1.entity.id,type:"asset",hash:_1.entity.hash,mimeType:_1.entity.mimeType,sizeBytes:_1.entity.sizeBytes,originalFilename:_1.entity.originalFilename,widthPx:_1.entity.widthPx,heightPx:_1.entity.heightPx,displayWidth:_1.entity.displayWidth,displayHeight:_1.entity.displayHeight})),...b1.map(j8),...M8.map(j8),...Q1.map(C8),...q8.map(C8),...N1.map(P6),...G1.map(P6),...s1.map(S8),...L1.map(S8),...n1.map(M6),...P8.map(M6)],$4={version:zb6,exportedAt:new Date().toISOString(),tracks:z1.map((_1)=>({name:_1.name,scope:g38(_1.storeCode),states:_1.states})),settings:R1.map((_1)=>{let f1={id:_1.id,name:_1.name,subtype:_1.subtype},y1=M(_1);if(y1)f1.fields=y1;return f1}),entities:Y6};if(Object.keys(Z8).length>0)$4.rootFolderFields=Z8;await N3.writeFile(o2.join(Y1,"manifest.json"),JSON.stringify($4,null,2),"utf-8");let U6=Ch.create(g),w2=N1.length;await U6.report({phase:"folders",current:0,total:w2,label:"Exporting folders"});let e1=0;for(let _1 of N1){if(_1.entity.getParentId()!==null){let f1=o2.join(Y1,_1.entity.getPath());await N3.mkdir(f1,{recursive:!0})}await U6.report({phase:"folders",current:++e1,total:w2,label:"Exporting folders"})}await U6.flush(),await N3.mkdir(o2.join(Y1,"Documents"),{recursive:!0}),await N3.mkdir(o2.join(Y1,"Templates"),{recursive:!0}),await N3.mkdir(o2.join(Y1,"Stories"),{recursive:!0}),await N3.mkdir(o2.join(Y1,"Jobs"),{recursive:!0});let U1=s1.length;await U6.report({phase:"documents",current:0,total:U1,label:"Exporting documents"});let I1=0;for(let _1 of s1){let f1=o2.join(Y1,_1.entity.getPath()),y1=_1.version.content;await N3.mkdir(o2.dirname(f1),{recursive:!0}),await N3.writeFile(f1,y1,"utf-8"),await U6.report({phase:"documents",current:++I1,total:U1,label:"Exporting documents"})}await U6.flush();let X8=n1.length;await U6.report({phase:"templates",current:0,total:X8,label:"Exporting templates"});let W8=0;for(let _1 of n1){let f1=o2.join(Y1,_1.entity.getPath()),y1=_1.version.content;await N3.mkdir(o2.dirname(f1),{recursive:!0}),await N3.writeFile(f1,y1,"utf-8"),await U6.report({phase:"templates",current:++W8,total:X8,label:"Exporting templates"})}if(await U6.flush(),L1.length>0||P8.length>0){let _1=o2.join(Y1,"__deleted__");await N3.mkdir(_1,{recursive:!0});for(let f1 of L1){let y1=f1.entity.getObjectId();await N3.writeFile(o2.join(_1,`${y1}.md`),f1.version.content,"utf-8")}for(let f1 of P8){let y1=f1.entity.getObjectId();await N3.writeFile(o2.join(_1,`${y1}.md`),f1.version.content,"utf-8")}}let e8=v8.length;if(await U6.report({phase:"assets",current:0,total:e8,label:"Exporting assets"}),v8.length>0){let _1=o2.join(Y1,"assets");await N3.mkdir(_1,{recursive:!0});let f1=0;for(let y1 of v8){let T8=y1.entity.id,b8=o2.join(_1,`${T8}.bin`);await N3.writeFile(b8,y1.buffer);let s8=o2.join(_1,`${T8}.json`);await N3.writeFile(s8,JSON.stringify({id:T8,hash:y1.entity.hash,mimeType:y1.entity.mimeType,sizeBytes:y1.entity.sizeBytes,originalFilename:y1.entity.originalFilename,widthPx:y1.entity.widthPx,heightPx:y1.entity.heightPx,displayWidth:y1.entity.displayWidth,displayHeight:y1.entity.displayHeight},null,2),"utf-8"),await U6.report({phase:"assets",current:++f1,total:e8,label:"Exporting assets"})}}await U6.flush();for(let _1 of Y6){if(_1.type==="folder"||_1.type==="story"||_1.type==="job")continue;let f1;if(_1.type==="asset")f1=o2.join(Y1,"assets",`${_1.id}.bin`);else if(_1.type==="document"||_1.type==="template")if(_1.deleted_at)f1=o2.join(Y1,"__deleted__",`${_1.id}.md`);else f1=o2.join(Y1,_1.path);else{A9("Unknown entity type in validation: %s",_1.type);continue}try{await N3.access(f1)}catch(y1){throw h.validation(`Manifest entry missing file: ${_1.id||_1.path}`,"EXPORT_VALIDATION_FAILED")}}await U6.report({phase:"zip",current:0,total:1,label:"Creating archive"});let O8=`caw-export-${H()}.zip`,N6=o2.join(s,O8),d1=qb6(N6),O1=u38.default("zip",{zlib:{level:9}});O1.on("error",async(_1)=>{throw await E(Y1),A9("Zip creation error: %s",_1.message),h.validation(`Export failed: ${_1.message}`,"EXPORT_ERROR")}),O1.pipe(d1),O1.directory(Y1,!1),await O1.finalize(),await new Promise((_1,f1)=>{d1.on("close",_1),d1.on("error",f1),setTimeout(()=>{f1(Error("Zip creation timeout"))},60000)}),A9("Created zip: %s (%d bytes)",O8,O1.pointer()),await U6.report({phase:"zip",current:1,total:1,label:"Creating archive"}),await U6.flush(),await E(Y1);let k1=Y6.length;return A9("Export complete: %s (%d entities)",O8,k1),{success:!0,filename:O8,path:N6,counts:{assets:v8.length,stories:b1.length,jobs:Q1.length,folders:N1.length,documents:s1.length,templates:n1.length},draftOnlySkipped:{documents:J8.length,templates:R8.length}}}catch(E1){throw await E(Y1),E1}}})},ms=Object.freeze({create:Wb6});c6();var v98=X6(P98(),1),A98=X6(g6(),1);import kq from"fs/promises";import Q7 from"path";import ub6 from"crypto";var x6=A98.default("caw:import"),Qs=($)=>{if(!$||typeof $!=="string")throw Error(`Invalid export path: ${$}`);let K={Documents:"d",Templates:"t",Stories:"s",Jobs:"j"},q=$.indexOf("/");if(q===-1){let J=K[$];if(J)return{path:"",type:J};throw Error(`Invalid export path: ${$}`)}let Y=$.slice(0,q),z=K[Y];if(!z)throw Error(`Unknown root folder: ${Y}`);return{path:$.slice(q+1),type:z}},yb6=".caw-exports",T98=".tmp",bb6=[1,2,3,4,5,6],Bb6=/\b([A-Z][adtfnsje]\d+)\b/g,ls=($)=>{if(!$)return $;return $.replace(/(<include\s+(?:id="[^"]+"|path="[^"]+"))\s+version="\d+"(\s*\/>)/g,(K,q,Y)=>`${q} version="1"${Y}`)},mb6=($,K)=>{if(!$)return $;try{let q=JSON.parse($),Y=q?.visibility?.story;if(!Y||typeof Y!=="object")return $;let z=!1,J={};for(let[W,Z]of Object.entries(Y))if(W.startsWith("{"))try{let O=JSON.parse(W),H=`${O.scope}:${O.name}`,X=K.get(H);if(X)J[X]=Z,z=!0;else J[W]=Z}catch{J[W]=Z}else if(/^[A-Z][a-z]\d+$/.test(W))J[W]=Z;else{let O=`project:${W}`,H=K.get(O);if(H)J[H]=Z,z=!0;else J[W]=Z}if(!z)return $;return q.visibility.story=J,JSON.stringify(q)}catch{return $}},Ub6=({store:$,folderService:K,documentService:q,templateService:Y,storyService:z,trackService:J,fieldService:W,assetService:Z,assetsDir:O})=>{let H=(V,D)=>{if(!V)return V;return V.replace(Bb6,(N,E)=>{return D[E]??N})},X=(V)=>{if(!Array.isArray(V))return!1;if(V.length!==$X.length)return!0;return!V.every((D,N)=>D===$X[N])},w=async(V,D,N,E,x,b,{includeDeleted:S=!1}={})=>{if(!E||typeof E!=="object"||!W)return;for(let[I,C]of Object.entries(E)){if(I==="activeJobCount"){await W.setFieldValue(V,D,{entityId:N,fieldName:I,value:"0",bypassEditableCheck:!0,includeDeleted:S},b);continue}let R=(await W.resolveFieldDefinitionForEntity(V,D,{entityId:N,fieldName:I,includeDeleted:S}))?.getPrimitiveType(),u=C;if(R==="object_ref")if(Array.isArray(C))u=C.map((g)=>x[g]??g);else u=x[C]??C;else if(R==="string"||R==="text")if(Array.isArray(C))u=C.map((g)=>H(g,x));else u=H(C,x);try{if(Array.isArray(u))await W.setFieldValue(V,D,{entityId:N,fieldName:I,values:u,bypassEditableCheck:!0,includeDeleted:S},b);else await W.setFieldValue(V,D,{entityId:N,fieldName:I,value:u,bypassEditableCheck:!0,includeDeleted:S},b)}catch(g){if(g.code==="INVALID_REFERENCE"){x6("Skipping dangling object_ref %s=%s for entity %s",I,u,N);continue}throw g}}},P=async(V)=>{try{await kq.rm(V,{recursive:!0,force:!0})}catch(D){x6("Warning: Failed to cleanup temp directory: %s",D.message)}},G=async(V,D,{storeCode:N})=>{let E=await K.listFolderContents(V,D,{folderId:null,type:"d",storeCode:N}),x=await K.listFolderContents(V,D,{folderId:null,type:"t",storeCode:N}),b=E.filter((R)=>R.getName()!=="Tracks"),I=(await q.listDocuments(V,D,{parentId:null,storeCode:N,type:"d"})).filter((R)=>{return(typeof R.getSubtype==="function"?R.getSubtype():null)!=="track"}),C=await q.listDocuments(V,D,{parentId:null,storeCode:N,type:"t"}),k=b.length===0&&x.length===0&&I.length===0&&C.length===0;return x6("Store %s empty check: %s",N,k),k},T=async(V,D,{tempPath:N,storeCode:E,idMapping:x,enqueuePostCommitHook:b,throttle:S})=>{let I=Q7.join(N,"assets"),C;try{C=await kq.readdir(I)}catch(g){if(g.code==="ENOENT")return x6("No assets directory in export"),await S.report({phase:"assets",current:0,total:0,label:"Importing assets"}),await S.flush(),0;throw g}let k=C.filter((g)=>g.endsWith(".json"));if(x6("Found %d assets to import",k.length),!Z||!O){if(k.length>0)throw h.validation("Export contains assets but asset service is not configured","ASSET_SERVICE_MISSING");return await S.report({phase:"assets",current:0,total:0,label:"Importing assets"}),await S.flush(),0}let R=k.length;await S.report({phase:"assets",current:0,total:R,label:"Importing assets"});let u=0;for(let g of k){let s=Q7.join(I,g),J1=await kq.readFile(s,"utf-8"),Y1=JSON.parse(J1),E1=g.replace(".json",".bin"),w1=Q7.join(I,E1),j1=await kq.readFile(w1),A1=await Z.createAsset(V,D,{store:E,buffer:j1,mimeType:Y1.mimeType,originalFilename:Y1.originalFilename,widthPx:Y1.widthPx,heightPx:Y1.heightPx,displayWidth:Y1.displayWidth,displayHeight:Y1.displayHeight},b);x[Y1.id]=A1.id,u++,await S.report({phase:"assets",current:u,total:R,label:"Importing assets"})}return await S.flush(),x6("Imported %d assets",u),u},v=async(V,D,{manifest:N,tempPath:E,storeCode:x,onProgress:b})=>{x6("Starting transaction...");let S=Ch.create(b);return await V.transaction().execute(async(I)=>{let C={},k=new Set,R=(O1)=>{let k1=O1.indexOf(":");if(k1!==-1)k.add(O1.slice(k1+1))},u=await T(I,D,{tempPath:E,storeCode:x,idMapping:C,enqueuePostCommitHook:R,throttle:S});if(x6("Phase 0 complete - imported %d assets",u),N.rootFolderFields&&W){x6("Phase 0.25: Restoring root folder fields");for(let[O1,k1]of Object.entries(N.rootFolderFields)){let _1;if(k1.subtype==="root_s")_1=await $.readStoryRootFolder(I,D,{storeCode:x});if(_1&&k1.fields){for(let[f1,y1]of Object.entries(k1.fields)){if(f1==="states"){x6("Phase 0.25: Skipping states field (vestigial)");continue}if(Array.isArray(y1))await W.setFieldValue(I,D,{entityId:_1.getObjectId(),fieldName:f1,values:y1,bypassEditableCheck:!0},R);else await W.setFieldValue(I,D,{entityId:_1.getObjectId(),fieldName:f1,value:y1,bypassEditableCheck:!0},R)}x6("Restored fields for root folder %s (%s)",_1.getObjectId(),k1.subtype)}}x6("Phase 0.25 complete - restored root folder fields")}if(N.version===2&&N.rootFolderFields&&J){x6("Phase 0.3: Migrating legacy rootFolderFields states to Default track");for(let[,O1]of Object.entries(N.rootFolderFields))if(O1.subtype==="root_s"&&O1.fields?.states){let k1=await J.getTrackByName(I,D,{store:x,name:"Default"});if(k1)await J.updateTrack(I,D,{id:k1.getObjectId(),states:O1.fields.states},R),x6("Phase 0.3: Updated Default track states from rootFolderFields")}x6("Phase 0.3 complete")}let g=0,s=0,J1=N.tracks,Y1=J1&&J1.length>0&&J?J1.length:0;if(await S.report({phase:"tracks",current:0,total:Y1,label:"Importing tracks"}),J1&&J1.length>0&&J){x6("Phase 0.4: Creating %d tracks",J1.length);let O1=0;for(let k1 of J1){let f1=(k1.scope||"project")==="shared"?"B":x,y1=await J.getTrackByName(I,D,{store:f1,name:k1.name});if(!y1)await J.createTrack(I,D,{store:f1,name:k1.name,states:k1.states},R),g++;else await J.updateTrack(I,D,{id:y1.getObjectId(),states:k1.states},R),s++;await S.report({phase:"tracks",current:++O1,total:Y1,label:"Importing tracks"})}x6("Phase 0.4 complete - created %d tracks, updated %d tracks",g,s)}await S.flush();let E1=new Map,w1=new Map;if(J){let O1=x==="A"?"all":x,k1=await J.listTracks(I,D,{store:O1});for(let _1 of k1){let f1=_1.storeCode==="B"?"shared":"project";if(E1.set(`${f1}:${_1.name}`,_1.id),_1.storeCode===x)w1.set(_1.name,_1.id)}}let j1=[],A1=0,p1=0,n1=N.settings,Y8=n1&&n1.length>0?n1.length:0;if(await S.report({phase:"settings",current:0,total:Y8,label:"Importing settings"}),n1&&n1.length>0){x6("Phase 0.45: Importing %d settings",n1.length);let O1=await $.readSettingsRootFolder(I,D,{storeCode:x});if(!O1)x6("Phase 0.45: Settings root folder not found, skipping settings import");else{let k1=O1.getObjectId(),_1={};for(let y1 of Zj){let T8=await $.findFolderByName(I,D,k1,y1);if(!T8)T8=await $.createFolder(I,D,{storeCode:x,parentId:k1,name:y1},R);_1[y1]=T8.getObjectId()}let f1=0;for(let y1 of n1){let T8=Wj[y1.name];if(!T8)throw Error(`Phase 0.45: No domain mapping for setting "${y1.name}" — cannot import`);let b8=_1[T8],s8=await $.findSettingByName(I,D,b8,y1.name),d8;if(s8)d8=s8.entity.getObjectId(),p1++;else{let{entity:T6}=await $.createSetting(I,D,{storeCode:x,parentId:b8,name:y1.name,subtype:y1.subtype},R);d8=T6.getObjectId(),A1++}if(C[y1.id]=d8,y1.fields){let T6={},S1={};for(let[x1,X1]of Object.entries(y1.fields))if((await W.resolveFieldDefinitionForEntity(I,D,{entityId:d8,fieldName:x1}))?.getPrimitiveType()==="object_ref")S1[x1]=X1;else T6[x1]=X1;await w(I,D,d8,T6,C,R),j1.push({entityId:d8,fields:S1})}await S.report({phase:"settings",current:++f1,total:Y8,label:"Importing settings"})}x6("Phase 0.45 complete - created %d settings, updated %d settings",A1,p1)}}await S.flush();let R8=N.entities.filter((O1)=>O1.type==="story"&&!O1.deleted_at),v8=0,k8={},h8=[],g8=R8.length>0&&z?R8.length:0;if(await S.report({phase:"stories",current:0,total:g8,label:"Importing stories"}),R8.length>0&&z){x6("Phase 0.5: Creating %d stories",R8.length);let O1=N.entities.filter((k1)=>k1.type==="folder"&&k1.subtype==="tasks"&&!k1.deleted_at);for(let k1 of O1){let _1=k1.path.split("/");if(_1.length>=3&&_1[0]==="Stories"){let f1=_1[1];k8[f1]=k1.id}}for(let k1 of R8){let _1=k1.fields?.state||"waiting",f1=k1.fields?.track,y1;if(f1&&typeof f1==="object"&&f1.name&&f1.scope)y1=E1.get(`${f1.scope}:${f1.name}`)??`${f1.scope}:${f1.name}`;else{let S1=f1||"Default";y1=w1.get(S1)??S1}let T8=k1.fields?.phase||"active",b8=k1.fields?.ranking,{story:s8,tasksFolder:d8}=await z.createStory(I,D,{store:x,name:k1.name,state:_1,track:y1,phase:T8,ranking:b8},R);if(C[k1.id]=s8.getObjectId(),k1.fields&&N.version>=2){let{state:S1,track:x1,phase:X1,ranking:$8,...M1}=k1.fields;if(Object.keys(M1).length>0)h8.push({entityId:s8.getObjectId(),fields:M1})}let T6=k8[k1.name];if(T6&&d8){C[T6]=d8.getObjectId();let S1=N.entities.find((x1)=>x1.id===T6);if(S1?.fields?.states){let x1=S1.fields.states;if(X(Array.isArray(x1)?x1:[x1]))await W.setFieldValue(I,D,{entityId:d8.getObjectId(),fieldName:"states",values:Array.isArray(x1)?x1:[x1],bypassEditableCheck:!0},R)}}v8++,await S.report({phase:"stories",current:v8,total:g8,label:"Importing stories"})}x6("Phase 0.5 complete - created %d active stories",v8)}let L8=N.entities.filter((O1)=>O1.type==="story"&&O1.deleted_at),V8=0;if(L8.length>0&&z){x6("Phase 0.5: Creating %d soft-deleted stories via store directly",L8.length);let O1=await $.readStoryRootFolder(I,D,{storeCode:x});U.factory(!O1,h.notFound,"Story root folder not found","STORY_ROOT_NOT_FOUND");for(let k1 of L8){let _1=k1.fields?.track,f1;if(_1&&typeof _1==="object"&&_1.name&&_1.scope)f1=E1.get(`${_1.scope}:${_1.name}`)??`${_1.scope}:${_1.name}`;else{let T8=_1||"Default";f1=w1.get(T8)??T8}let y1=await $.createStory(I,D,{storeCode:x,parentId:O1.getObjectId(),name:k1.name,deletedAt:k1.deleted_at},R);if(C[k1.id]=y1.getObjectId(),W)await W.setFieldValue(I,D,{entityId:y1.getObjectId(),fieldName:"track",value:f1,bypassEditableCheck:!0,includeDeleted:!0},R);if(k1.fields&&N.version>=2){let{track:T8,...b8}=k1.fields;if(Object.keys(b8).length>0)h8.push({entityId:y1.getObjectId(),fields:b8,includeDeleted:!0})}V8++}x6("Phase 0.5 complete - created %d soft-deleted stories",V8)}await S.flush();let a=N.entities.filter((O1)=>O1.type==="job"&&!O1.deleted_at),z1=N.entities.filter((O1)=>O1.type==="job"&&O1.deleted_at),T1=0,R1=a.length;await S.report({phase:"jobs",current:0,total:R1,label:"Importing jobs"});let N1=[];if(a.concat(z1).length>0){x6("Phase 0.6: Creating %d active + %d soft-deleted jobs (pass 1: entities)",a.length,z1.length);let O1=await $.readJobRootFolder(I,D,{storeCode:x});if(!O1)throw h.validation("Job root folder not found - cannot import jobs","JOB_ROOT_MISSING");let k1=O1.getObjectId();for(let f1 of a){let y1=await $.createJob(I,D,{storeCode:x,parentId:k1,name:f1.name},R);if(C[f1.id]=y1.getObjectId(),f1.fields&&N.version>=2)N1.push({jobId:y1.getObjectId(),fields:f1.fields,includeDeleted:!1});T1++,await S.report({phase:"jobs",current:T1,total:R1,label:"Importing jobs"})}let _1=0;for(let f1 of z1){let y1=await $.createJob(I,D,{storeCode:x,parentId:k1,name:f1.name,deletedAt:f1.deleted_at},R);if(C[f1.id]=y1.getObjectId(),f1.fields&&N.version>=2)N1.push({jobId:y1.getObjectId(),fields:f1.fields,includeDeleted:!0});_1++}x6("Phase 0.6 complete - created %d active jobs, %d soft-deleted jobs",T1,_1)}let s1=N1.length;if(await S.report({phase:"jobFields",current:0,total:s1,label:"Importing job fields"}),N1.length>0){x6("Phase 0.6: Importing job fields (pass 2: fields)");let O1=0;for(let{jobId:k1,fields:_1,includeDeleted:f1}of N1)await w(I,D,k1,_1,C,R,{includeDeleted:f1??!1}),await S.report({phase:"jobFields",current:++O1,total:s1,label:"Importing job fields"})}await S.flush();let L1=(O1)=>{if(O1.subtype!=="tasks")return!1;let k1=O1.path?.split("/");if(!k1||k1[0]!=="Stories"||k1.length<3)return!1;let _1=k1[1];return!N.entities.find((y1)=>y1.type==="story"&&y1.name===_1)?.deleted_at},J8=N.entities.filter((O1)=>O1.type==="folder"&&!L1(O1)&&!O1.path?.endsWith("/Tracks"));x6("Phase 1: Creating %d folders (excluding active-story tasks folders)",J8.length);let b1=N.entities.filter((O1)=>O1.type==="folder"&&L1(O1)).length,M8=0,Q1=0,q8=J8.length;await S.report({phase:"folders",current:0,total:q8,label:"Importing folders"});let P8=0;for(let O1 of J8){let{path:k1,type:_1}=Qs(O1.path);if(!k1){await S.report({phase:"folders",current:++P8,total:q8,label:"Importing folders"});continue}if(C[O1.id]){await S.report({phase:"folders",current:++P8,total:q8,label:"Importing folders"});continue}let f1;if(O1.deleted_at){let y1=k1.split("/"),T8=y1[y1.length-1],b8;if(_1==="s")if(y1.length===1){x6("Unexpected soft-deleted folder directly under Stories root: %s",k1),await S.report({phase:"folders",current:++P8,total:q8,label:"Importing folders"});continue}else if(y1.length===2){let s8=y1[0],d8=N.entities.find((T6)=>T6.type==="story"&&T6.name===s8);if(d8&&C[d8.id])b8=C[d8.id]}else{let s8=y1.slice(0,-1).join("/"),d8=N.entities.find((T6)=>T6.type==="folder"&&T6.path===`Stories/${s8}`);if(d8&&C[d8.id])b8=C[d8.id]}else if(y1.length===1)b8=(await $.readRootFolderForType(I,D,_1,x))?.getObjectId();else{let s8=y1.slice(0,-1).join("/"),d8=_1==="d"?"Documents":"Templates",T6=N.entities.find((S1)=>S1.type==="folder"&&S1.path===`${d8}/${s8}`);if(T6&&C[T6.id])b8=C[T6.id]}if(!b8){x6("Could not resolve parent for soft-deleted folder: %s",O1.path),await S.report({phase:"folders",current:++P8,total:q8,label:"Importing folders"});continue}f1=await $.createFolder(I,D,{storeCode:x,parentId:b8,name:T8,subtype:O1.subtype||void 0,deletedAt:O1.deleted_at},R)}else if(_1==="s"){let y1=k1.split("/"),T8=y1[y1.length-1],b8=y1.slice(0,-1).join("/"),s8;if(y1.length===1){x6("Unexpected folder directly under Stories root: %s",k1),await S.report({phase:"folders",current:++P8,total:q8,label:"Importing folders"});continue}else if(y1.length===2){let d8=y1[0],T6=N.entities.find((S1)=>S1.type==="story"&&S1.name===d8);if(T6&&C[T6.id])s8=C[T6.id]}else{let d8=N.entities.find((T6)=>T6.type==="folder"&&T6.path===`Stories/${b8}`);if(d8&&C[d8.id])s8=C[d8.id]}if(!s8){x6("Could not resolve parent for story folder: %s",O1.path),await S.report({phase:"folders",current:++P8,total:q8,label:"Importing folders"});continue}f1=await K.createFolder(I,D,{mode:"parentName",parentId:s8,name:T8,subtype:O1.subtype||void 0},R)}else f1=await K.createFolder(I,D,{store:x,path:k1,type:_1,subtype:O1.subtype||void 0},R);if(C[O1.id]=f1.getObjectId(),O1.fields&&N.version>=2)await w(I,D,f1.getObjectId(),O1.fields,C,R,{includeDeleted:!!O1.deleted_at});if(_1==="t")M8++;else if(_1==="s")b1++;else Q1++;await S.report({phase:"folders",current:++P8,total:q8,label:"Importing folders"})}await S.flush(),x6("Phase 1 complete - created %d folders (skipped root folders)",Q1);let H8=N.entities.filter((O1)=>O1.type==="document"&&O1.subtype!=="track"),Z8=[];x6("Phase 2: Reading %d documents (%d soft-deleted)",H8.length,H8.filter((O1)=>O1.deleted_at).length);for(let O1 of H8){let k1=O1.deleted_at?Q7.join(E,"__deleted__",`${O1.id}.md`):Q7.join(E,O1.path),_1=await kq.readFile(k1,"utf-8");Z8.push({oldId:O1.id,path:O1.path,content:_1,subtype:O1.subtype,fields:O1.fields,deletedAt:O1.deleted_at||null})}x6("Phase 2 complete - read %d documents",Z8.length),x6("Phase 3: Creating %d document entities",Z8.length);let z8=[],j8=0,C8=0,P6=0,S8=Z8.length;await S.report({phase:"documents",current:0,total:S8,label:"Importing documents"});let M6=0,Y6=0;for(let O1 of Z8){let{path:k1,type:_1}=Qs(O1.path);if(_1==="j"){let T8=k1.lastIndexOf("/"),b8=k1.slice(0,T8),s8=k1.slice(T8+1),d8=N.entities.find((S1)=>S1.type==="job"&&S1.name===b8);if(!d8||!C[d8.id])throw h.validation(`Cannot resolve parent job for document: ${O1.path}`,"IMPORT_RESOLUTION_FAILED");let T6=await $.createContent(I,D,{storeCode:x,type:"d",parentId:C[d8.id],name:s8,deletedAt:O1.deletedAt||void 0},R);C[O1.oldId]=T6.getObjectId(),z8.push({document:T6,originalContent:O1.content,fields:O1.fields,isJobDocument:!0,deletedAt:O1.deletedAt}),P6++,await S.report({phase:"documents",current:++M6,total:S8,label:"Importing documents"});continue}if(O1.deletedAt){let T8=k1.split("/"),b8=T8[T8.length-1],s8;if(_1==="s"){let S1=T8.slice(0,-1).join("/"),x1=N.entities.find((X1)=>X1.type==="folder"&&X1.path===`Stories/${S1}`);if(x1&&C[x1.id])s8=C[x1.id];else{let X1=T8[0],$8=N.entities.find((M1)=>M1.type==="story"&&M1.name===X1);if($8&&C[$8.id])s8=C[$8.id]}}else if(T8.length===1)s8=(await $.readRootFolderForType(I,D,"d",x))?.getObjectId();else{let S1=T8.slice(0,-1).join("/"),x1=N.entities.find((X1)=>X1.type==="folder"&&X1.path===`Documents/${S1}`);if(x1&&C[x1.id])s8=C[x1.id]}if(!s8)throw h.validation(`Cannot resolve parent for soft-deleted document: ${O1.path}`,"IMPORT_RESOLUTION_FAILED");let d8=O1.subtype||(_1==="s"&&T8.length>=3&&T8[1]==="tasks"?"task":void 0),T6=await $.createContent(I,D,{storeCode:x,type:"d",parentId:s8,name:b8,subtype:d8,deletedAt:O1.deletedAt},R);C[O1.oldId]=T6.getObjectId(),z8.push({document:T6,originalContent:O1.content,fields:O1.fields,deletedAt:O1.deletedAt}),Y6++,await S.report({phase:"documents",current:++M6,total:S8,label:"Importing documents"});continue}let f1;if(_1==="s"){let T8=k1.split("/"),b8=T8[0],s8=T8.slice(0,-1).join("/"),d8=T8[T8.length-1],T6=N.entities.find((x1)=>x1.type==="folder"&&x1.path===`Stories/${s8}`),S1;if(T6&&C[T6.id])S1=C[T6.id];else{let x1=N.entities.find((X1)=>X1.type==="story"&&X1.name===b8);if(x1&&C[x1.id])S1=C[x1.id]}if(!S1)throw h.validation(`Cannot resolve parent folder for story document: ${O1.path}`,"IMPORT_RESOLUTION_FAILED");f1={mode:"parentName",parentId:S1,name:d8}}else f1={store:x,path:k1,type:_1};if(O1.subtype)f1.subtype=O1.subtype;else if(_1==="s"){let T8=k1.split("/");if(T8.length>=3&&T8[1]==="tasks")x6('WARN: Document %s in tasks folder missing subtype, inferring "task"',O1.path),f1.subtype="task"}let y1=await q.createDocument(I,D,f1,R);if(C[O1.oldId]=y1.getObjectId(),z8.push({document:y1,originalContent:O1.content,fields:O1.fields}),_1==="s")C8++;else j8++;await S.report({phase:"documents",current:++M6,total:S8,label:"Importing documents"})}await S.flush(),x6("Phase 3 complete - created %d document entities (%d soft-deleted)",z8.length,Y6);let $4=N.entities.filter((O1)=>O1.type==="template"),U6=[];x6("Phase 4: Reading %d templates (%d soft-deleted)",$4.length,$4.filter((O1)=>O1.deleted_at).length);for(let O1 of $4){let k1=O1.deleted_at?Q7.join(E,"__deleted__",`${O1.id}.md`):Q7.join(E,O1.path),_1=await kq.readFile(k1,"utf-8");U6.push({oldId:O1.id,path:O1.path,content:_1,subtype:O1.subtype,fields:O1.fields,deletedAt:O1.deleted_at||null})}x6("Phase 4 complete - read %d templates",U6.length),x6("Phase 5: Creating %d template entities",U6.length);let w2=[],e1=0,U1=U6.length;await S.report({phase:"templates",current:0,total:U1,label:"Importing templates"});let I1=0;for(let O1 of U6){let{path:k1}=Qs(O1.path);if(O1.deletedAt){let _1=k1.split("/"),f1=_1[_1.length-1],y1;if(_1.length===1)y1=(await $.readRootFolderForType(I,D,"t",x))?.getObjectId();else{let b8=_1.slice(0,-1).join("/"),s8=N.entities.find((d8)=>d8.type==="folder"&&d8.path===`Templates/${b8}`);if(s8&&C[s8.id])y1=C[s8.id]}if(!y1)throw h.validation(`Cannot resolve parent for soft-deleted template: ${O1.path}`,"IMPORT_RESOLUTION_FAILED");let T8=await $.createContent(I,D,{storeCode:x,type:"t",parentId:y1,name:f1,subtype:O1.subtype||void 0,deletedAt:O1.deletedAt},R);C[O1.oldId]=T8.getObjectId(),w2.push({template:T8,originalContent:O1.content,fields:O1.fields,deletedAt:O1.deletedAt}),e1++}else{let _1={store:x,path:k1,type:"t"};if(O1.subtype)_1.subtype=O1.subtype;let f1=await q.createDocument(I,D,_1,R);C[O1.oldId]=f1.getObjectId(),w2.push({template:f1,originalContent:O1.content,fields:O1.fields})}await S.report({phase:"templates",current:++I1,total:U1,label:"Importing templates"})}await S.flush(),x6("Phase 5 complete - created %d template entities (%d soft-deleted)",w2.length,e1),x6("Phase 6: Remapping and saving content for %d documents",z8.length);let X8=z8.length;await S.report({phase:"publishDocs",current:0,total:X8,label:"Publishing documents"});let W8=0;for(let{document:O1,originalContent:k1,fields:_1,isJobDocument:f1,deletedAt:y1}of z8){let T8=ls(H(k1,C)),b8=O1.getObjectId();if(f1||y1)await $.saveDraft(I,D,{id:b8,content:T8,sessionId:"import-service",includeDeleted:!!y1},R),await $.publishContent(I,D,{id:b8,includeDeleted:!!y1},R);else await q.saveDraft(I,D,{id:b8,content:T8,sessionId:"import-service"},R),await q.publishDocument(I,D,{id:b8},R);if(_1&&N.version>=2)await w(I,D,b8,_1,C,R,{includeDeleted:!!y1});await S.report({phase:"publishDocs",current:++W8,total:X8,label:"Publishing documents"})}await S.flush(),x6("Phase 6 complete - saved and published %d documents",z8.length),x6("Phase 7: Remapping and saving content for %d templates",w2.length);let e8=w2.length;await S.report({phase:"publishTemplates",current:0,total:e8,label:"Publishing templates"});let O8=0;for(let{template:O1,originalContent:k1,fields:_1,deletedAt:f1}of w2){let y1=ls(H(k1,C)),T8=O1.getObjectId();if(f1)await $.saveDraft(I,D,{id:T8,content:y1,sessionId:"import-service",includeDeleted:!0},R),await $.publishContent(I,D,{id:T8,includeDeleted:!0},R);else await q.saveDraft(I,D,{id:T8,content:y1,sessionId:"import-service"},R),await q.publishDocument(I,D,{id:T8},R);if(_1&&N.version>=2){let b8={..._1};if(b8.config)b8.config=mb6(b8.config,E1);await w(I,D,T8,b8,C,R,{includeDeleted:!!f1})}await S.report({phase:"publishTemplates",current:++O8,total:e8,label:"Publishing templates"})}await S.flush(),x6("Phase 7 complete - saved and published %d templates",w2.length);let N6=h8.length;if(await S.report({phase:"storyFields",current:0,total:N6,label:"Importing story fields"}),h8.length>0){x6("Phase 8: Importing deferred fields for %d stories",h8.length);let O1=0;for(let{entityId:k1,fields:_1,includeDeleted:f1}of h8)await w(I,D,k1,_1,C,R,{includeDeleted:!!f1}),await S.report({phase:"storyFields",current:++O1,total:N6,label:"Importing story fields"});x6("Phase 8 complete - imported deferred story fields")}await S.flush();let d1=j1.length;if(await S.report({phase:"settingFields",current:0,total:d1,label:"Importing setting fields"}),j1.length>0){x6("Phase 9: Importing deferred object_ref fields for %d settings",j1.length);let O1=0;for(let{entityId:k1,fields:_1}of j1)await w(I,D,k1,_1,C,R),await S.report({phase:"settingFields",current:++O1,total:d1,label:"Importing setting fields"});x6("Phase 9 complete - imported deferred setting object_ref fields")}return await S.flush(),x6("Transaction committed successfully"),{success:!0,counts:{assets:u,tracksCreated:g,tracksUpdated:s,settingsCreated:A1,settingsUpdated:p1,stories:v8,jobs:T1,folders:Q1,templateFolders:M8,storyFolders:b1,documents:j8,storyDocuments:C8,jobDocuments:P6,templates:w2.length},remapped:C,dirtiedEntityIds:k}})};return Object.freeze({isStoreEmpty:G,importDocuments:async(V,D,{filename:N,storeCode:E,projectPath:x,exportPath:b,onProgress:S})=>{let I=b||(x?Q7.join(x,yb6):null);if(!I)throw h.validation("Either exportPath or projectPath must be provided","EXPORT_PATH_REQUIRED");x6("Starting import from %s to store %s",N,E);let C=Q7.join(I,N);try{await kq.access(C),x6("Zip file found: %s",C)}catch(s){throw h.notFound(`Export file not found: ${N}`,"EXPORT_NOT_FOUND")}x6("Validating zip and manifest...");let k=await G(V,D,{storeCode:E});if(!k)throw h.conflict("Store not empty - import requires empty store","STORE_NOT_EMPTY");x6("Store empty check: %s",k);let R=ub6.randomUUID(),u=Q7.join(I,T98,R),g=Q7.join(I,T98);await kq.mkdir(g,{recursive:!0});try{new v98.default(C).extractAllTo(u,!0),x6("Extracted zip to: %s",u)}catch(s){throw h.validation("Corrupted or invalid zip file","IMPORT_VALIDATION_FAILED")}try{let s=Q7.join(u,"manifest.json"),J1;try{let A1=await kq.readFile(s,"utf-8");J1=JSON.parse(A1)}catch(A1){throw h.validation(`Failed to read manifest: ${A1.message}`,"MANIFEST_READ_FAILED")}if(!bb6.includes(J1.version))throw h.validation(`Unsupported manifest version: ${J1.version}`,"UNSUPPORTED_VERSION");if(!J1.entities||!Array.isArray(J1.entities))throw h.validation("Invalid manifest structure","MANIFEST_READ_FAILED");x6("Manifest valid: version=%d, entities=%d",J1.version,J1.entities.length);for(let A1 of J1.entities){if(A1.type==="folder"||A1.type==="story"||A1.type==="job")continue;if(A1.deleted_at)continue;let p1;if(A1.type==="asset")p1=Q7.join(u,"assets",`${A1.id}.bin`);else if(A1.type==="document"||A1.type==="template")p1=Q7.join(u,A1.path);else{x6("Unknown entity type in import validation: %s",A1.type);continue}try{await kq.access(p1)}catch(n1){throw h.validation(`Missing file for manifest entry: ${A1.path||A1.id}`,"IMPORT_VALIDATION_FAILED")}}x6("All content files validated");let Y1=await v(V,D,{manifest:J1,tempPath:u,storeCode:E,onProgress:S});if($.clearListCaches)$.clearListCaches();let E1=Object.values(Y1.remapped),w1=[...new Set([...E1,...Y1.dirtiedEntityIds])];$.evictEntitiesById(w1);let j1=Y1.counts.folders+Y1.counts.documents+Y1.counts.templates+Y1.counts.jobs;return x6("Import complete: %d entities imported (including %d jobs)",j1,Y1.counts.jobs),Y1}finally{await P(u)}}})},is=Object.freeze({create:Ub6,resetIncludeVersions:ls});var cb6=($)=>{let{name:K,interval:q,execute:Y}=$,z=null,J=!1,W=null,Z=null,O=0,H=null,V=Object.freeze({getName:()=>K,getInterval:()=>q,getIsRunning:()=>J,getLastRun:()=>W,getLastError:()=>Z,getRunCount:()=>O,getNextRun:()=>H}),D=async()=>{try{await Y(),W=new Date().toISOString(),Z=null,O++}catch(S){console.error(`[CronJob] ${K} failed:`,S),Z={message:S.message,timestamp:new Date().toISOString()}}if(J)H=new Date(Date.now()+q).toISOString()},N=()=>{if(z!==null)return;z=setInterval(D,q),J=!0,H=new Date(Date.now()+q).toISOString()},E=()=>{if(z===null)return;clearInterval(z),z=null,J=!1,H=null},b=Object.freeze({start:N,stop:E,restart:()=>{E(),N()}});return{jobFns:V,controlFns:b}},l7=Object.freeze({create:cb6});var M98=X6(g6(),1),Fb6=M98.default("caw:cron:cleanup-edit-states"),V98=async($)=>{let K=new Date(Date.now()-Pz).toISOString();try{let q=await $.selectFrom("field_definitions as fd").innerJoin("class_field_defs as cfd","cfd.field_definition_id","fd.id").innerJoin("entity_types as et","et.id","cfd.class_type_id").select(["fd.id"]).where("fd.name","=","edit_last_activity_at").where("et.code","in",["d","t"]).where("et.subtype","is",null).execute();if(q.length===0)return{expired:[]};let Y=q.map((J)=>J.id),z=await $.selectFrom("date_fields as df").innerJoin("entities as e","e.id","df.entity_id").leftJoin("project_stores as ps","ps.store_id","e.store_id").leftJoin("entities as p","p.id","ps.project_id").select(["e.object_id","p.object_id as project_object_id"]).where("df.field_definition_id","in",Y).where("df.value","<",K).execute();if(z.length>0)Fb6("Found %d expired edit locks (older than %d minutes)",z.length,Pz/60000);return{expired:z.map((J)=>({objectId:J.object_id,projectObjectId:J.project_object_id}))}}catch(q){throw console.error("[Cleanup] Failed to find expired edit locks:",q),q}};var j98=X6(g6(),1),ns=j98.default("caw:cron:cleanup-edit-states"),pb6=({db:$,clearEditState:K})=>{let{jobFns:q,controlFns:Y}=l7.create({name:"cleanup-stale-edit-states",interval:900000,execute:async()=>{let{expired:z}=await V98($);for(let{objectId:J,projectObjectId:W}of z)try{await K(W,{id:J}),ns("Cleared expired edit lock for %s",J)}catch(Z){ns("Failed to clear edit lock for %s: %s",J,Z.message)}if(z.length>0)ns("Cleaned up %d expired edit locks",z.length)}});return{job:Object.freeze(q),control:Y}},N98=Object.freeze({create:pb6});var Qb6=({db:$,clearEditState:K})=>{let q=new Map,Y=(X,w)=>{let{job:P,control:G}=X.create(w);q.set(P.getName(),{job:P,control:G})},z=(X)=>{let w=q.get(X);if(!w)throw Error(`Job not found: ${X}`);let P=w.job.getIsRunning();return w.control.start(),{name:X,status:P?"already-running":"started",isRunning:w.job.getIsRunning()}},J=(X)=>{let w=q.get(X);if(!w)throw Error(`Job not found: ${X}`);let P=w.job.getIsRunning();return w.control.stop(),{name:X,status:P?"stopped":"already-stopped",isRunning:w.job.getIsRunning()}},W=(X)=>{let w=q.get(X);if(!w)throw Error(`Job not found: ${X}`);return w.control.restart(),{name:X,status:"restarted",isRunning:w.job.getIsRunning()}},Z=()=>{let X=[];for(let[w,{job:P}]of q.entries())X.push({name:P.getName(),interval:P.getInterval(),isRunning:P.getIsRunning(),lastRun:P.getLastRun(),lastError:P.getLastError(),runCount:P.getRunCount(),nextRun:P.getNextRun()});return X},O=()=>{for(let[X,{control:w}]of q.entries())w.start()},H=()=>{for(let[X,{control:w}]of q.entries())w.stop()};return Y(N98,{db:$,clearEditState:K}),Object.freeze({register:Y,start:z,stop:J,restart:W,list:Z,startAll:O,stopAll:H})},f98=Object.freeze({create:Qb6});import qq8 from"node:process";import R98 from"node:process";import ab6 from"node:os";import ob6 from"node:fs";import nb6 from"node:fs";import k98 from"node:fs";var ds;function lb6(){try{return k98.statSync("/.dockerenv"),!0}catch{return!1}}function ib6(){try{return k98.readFileSync("/proc/self/cgroup","utf8").includes("docker")}catch{return!1}}function as(){if(ds===void 0)ds=lb6()||ib6();return ds}var os,db6=()=>{try{return nb6.statSync("/run/.containerenv"),!0}catch{return!1}};function hh(){if(os===void 0)os=db6()||as();return os}var D98=()=>{if(R98.platform!=="linux")return!1;if(ab6.release().toLowerCase().includes("microsoft")){if(hh())return!1;return!0}try{return ob6.readFileSync("/proc/version","utf8").toLowerCase().includes("microsoft")?!hh():!1}catch{return!1}},C98=R98.env.__IS_WSL_TEST__?D98:D98();import rs from"node:process";function ss(){if(rs.platform!=="linux")return!1;if(rs.env.WAYLAND_DISPLAY)return!0;if(rs.env.XDG_SESSION_TYPE==="wayland")return!0;return!1}function q9($){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 rb6}from"node:url";var mG=($,K)=>{let q=es(sb6($));if(typeof q!=="string")throw TypeError(`${K} must be a string or a file URL: ${q}.`);return q},sb6=($)=>ts($)?$.toString():$,ts=($)=>typeof $!=="string"&&$&&Object.getPrototypeOf($)===String.prototype,es=($)=>$ instanceof URL?rb6($):$;var Ih=($,K=[],q={})=>{let Y=mG($,"First argument"),[z,J]=q9(K)?[[],K]:[K,q];if(!Array.isArray(z))throw TypeError(`Second argument must be either an array of arguments or an options object: ${z}`);if(z.some((O)=>typeof O==="object"&&O!==null))throw TypeError(`Second argument must be an array of strings: ${z}`);let W=z.map(String),Z=W.find((O)=>O.includes("\x00"));if(Z!==void 0)throw TypeError(`Arguments cannot contain null bytes ("\\0"): ${Z}`);if(!q9(J))throw TypeError(`Last argument must be an options object: ${J}`);return[Y,W,J]};import{ChildProcess as YB6}from"node:child_process";import{StringDecoder as tb6}from"node:string_decoder";var{toString:E98}=Object.prototype,L98=($)=>E98.call($)==="[object ArrayBuffer]",b9=($)=>E98.call($)==="[object Uint8Array]",t0=($)=>new Uint8Array($.buffer,$.byteOffset,$.byteLength),eb6=new TextEncoder,S98=($)=>eb6.encode($),$B6=new TextDecoder,xh=($)=>$B6.decode($),h98=($,K)=>{return KB6($,K).join("")},KB6=($,K)=>{if(K==="utf8"&&$.every((J)=>typeof J==="string"))return $;let q=new tb6(K),Y=$.map((J)=>typeof J==="string"?S98(J):J).map((J)=>q.write(J)),z=q.end();return z===""?Y:[...Y,z]},Hj=($)=>{if($.length===1&&b9($[0]))return $[0];return $t(_B6($))},_B6=($)=>$.map((K)=>typeof K==="string"?S98(K):K),$t=($)=>{let K=new Uint8Array(qB6($)),q=0;for(let Y of $)K.set(Y,q),q+=Y.length;return K},qB6=($)=>{let K=0;for(let q of $)K+=q.length;return K};var u98=($)=>Array.isArray($)&&Array.isArray($.raw),y98=($,K)=>{let q=[];for(let[J,W]of $.entries())q=zB6({templates:$,expressions:K,tokens:q,index:J,template:W});if(q.length===0)throw TypeError("Template script must not be empty");let[Y,...z]=q;return[Y,z,{}]},zB6=({templates:$,expressions:K,tokens:q,index:Y,template:z})=>{if(z===void 0)throw TypeError(`Invalid backslash sequence: ${$.raw[Y]}`);let{nextTokens:J,leadingWhitespaces:W,trailingWhitespaces:Z}=JB6(z,$.raw[Y]),O=x98(q,J,W);if(Y===K.length)return O;let H=K[Y],X=Array.isArray(H)?H.map((w)=>g98(w)):[g98(H)];return x98(O,X,Z)},JB6=($,K)=>{if(K.length===0)return{nextTokens:[],leadingWhitespaces:!1,trailingWhitespaces:!1};let q=[],Y=0,z=I98.has(K[0]);for(let W=0,Z=0;W<$.length;W+=1,Z+=1){let O=K[Z];if(I98.has(O)){if(Y!==W)q.push($.slice(Y,W));Y=W+1}else if(O==="\\"){let H=K[Z+1];if(H===`
|
|
826
|
+
`),N1=T1[z1-1].match(/^(?:[-*+] |\d+\. )\[([ xX])\] (.+)$/),G1=0,s1=/^(?:[-*+] |\d+\. )\[([ xX])\] .+$/;for(let L1=0;L1<z1;L1++)if(s1.test(T1[L1]))G1++;return{text:N1[2],checked:N1[1]!==" ",lineNumber:z1,itemNumber:G1}};return Object.freeze({createDocument:P,createTemplate:G,readDocument:T,readDocumentByPath:v,updateDocumentPath:M,deleteDocument:V,getIncomingReferences:D,saveDraft:N,readDraft:E,publishDocument:x,discardDraft:b,readVersion:S,getVersions:I,setEditState:C,clearEditState:k,getEditState:R,listDocuments:u,editDocument:g,batchEditDocument:s,readLines:J1,readBetweenMarkers:Y1,getDocumentStats:E1,readHeadings:w1,readSection:j1,readFrontmatter:A1,readChecklist:p1,checkChecklistItem:async(a,z1,{id:T1,lineNumber:R1,checked:N1,includeDraft:G1=!1,preview:s1=!1,sessionId:L1},J8)=>{let{entity:b1}=await T(a,z1,{id:T1}),M8=G1?b1.getDraftContent()??b1.getPublishedContent()??"":b1.getPublishedContent()??"",Q1=dp(M8,{lineNumber:R1,checked:N1});if(s1)return{preview:!0,diff:rX(M8,Q1.newContent),item:n1(Q1.newContent,R1)};return await N(a,z1,{id:T1,content:Q1.newContent,sessionId:L1},J8),{applied:!0,item:n1(Q1.newContent,R1)}},toggleChecklistItem:async(a,z1,{id:T1,lineNumber:R1,includeDraft:N1=!1,preview:G1=!1,sessionId:s1},L1)=>{let{entity:J8}=await T(a,z1,{id:T1}),b1=N1?J8.getDraftContent()??J8.getPublishedContent()??"":J8.getPublishedContent()??"",M8=Wk1(b1,{lineNumber:R1});if(G1)return{preview:!0,diff:rX(b1,M8.newContent),item:n1(M8.newContent,R1)};return await N(a,z1,{id:T1,content:M8.newContent,sessionId:s1},L1),{applied:!0,item:n1(M8.newContent,R1)}},batchCheckChecklistItems:async(a,z1,{id:T1,items:R1,includeDraft:N1=!1,preview:G1=!1,sessionId:s1},L1)=>{let{entity:J8}=await T(a,z1,{id:T1}),b1=N1?J8.getDraftContent()??J8.getPublishedContent()??"":J8.getPublishedContent()??"",M8=Zk1(b1,{items:R1}),Q1=R1.map((q8)=>n1(M8.newContent,q8.lineNumber));if(G1)return{preview:!0,diff:rX(b1,M8.newContent),items:Q1,count:M8.details.count};return await N(a,z1,{id:T1,content:M8.newContent,sessionId:s1},L1),{applied:!0,items:Q1,count:M8.details.count}},specialiseDocument:async(a,z1,{id:T1,subtype:R1,fields:N1},G1)=>{let{entity:s1}=await T(a,z1,{id:T1});U.factory(s1.getSubtype()!==null,h.validation,`Entity is already specialised to subtype: ${s1.getSubtype()}`,"ALREADY_SPECIALISED");let{storeCode:L1,typeCode:J8}=a6.resolveEntityId(T1),b1=(await Promise.resolve().then(() => (m$(),hF))).default;try{await b1.readEntityTypeId(a,z1,J8,R1)}catch(q8){throw h.validation(`Invalid subtype: ${R1}`,"INVALID_SUBTYPE")}await z.validateRequiredFields(a,z1,{store:L1,code:J8,subtype:R1,fields:N1});let M8=await $.updateEntityType(a,z1,{id:T1,subtype:R1},G1);if(N1&&Object.keys(N1).length>0)for(let[q8,P8]of Object.entries(N1))await z.setFieldValue(a,z1,{entityId:T1,fieldName:q8,...Array.isArray(P8)?{values:P8}:{value:P8}},G1);let{entity:Q1}=await T(a,z1,{id:T1});return{entity:Q1}},generaliseDocument:async(a,z1,{id:T1},R1)=>{let{entity:N1}=await T(a,z1,{id:T1}),G1=N1.getSubtype();U.factory(G1===null,h.validation,"Entity is already generic (has no subtype)","ALREADY_GENERIC");let s1=await $.readFolder(a,z1,{id:N1.getParentId()});if(s1&&await V2.isInsideTasksFolder(a,z1,s1,$))throw h.validation("Cannot generalise entity inside a tasks folder","INVALID_LOCATION");let{typeCode:L1}=a6.resolveEntityId(T1),J8=await $.getFieldDefinitionsForEntityType(a,z1,{storeCode:"B",code:L1,subtype:G1}),b1=N1.getFields();for(let Q1 of J8){if(Q1.inherited)continue;let q8=Q1.entity.getName();if(b1&&b1[q8])await z.deleteFieldValue(a,z1,{entityId:T1,fieldName:q8},R1)}await $.updateEntityType(a,z1,{id:T1,subtype:null},R1);let{entity:M8}=await T(a,z1,{id:T1});return{entity:M8}},specialiseFolder:async(a,z1,{id:T1,subtype:R1},N1)=>{let G1=await $.readFolder(a,z1,{id:T1});U.factory(!G1,h.notFound,`Folder not found: ${T1}`,"NOT_FOUND");let{typeCode:s1}=a6.resolveEntityId(T1);U.factory(s1!=="f",h.validation,`Entity is not a folder: ${T1}`,"INVALID_OPERATION"),U.factory(G1.getSubtype()!==null,h.validation,`Entity is already specialised to subtype: ${G1.getSubtype()}`,"ALREADY_SPECIALISED"),U.factory(Xk1.has(R1),h.validation,`Invalid subtype: ${R1}`,"INVALID_SUBTYPE");let L1=(await Promise.resolve().then(() => (m$(),hF))).default;try{await L1.readEntityTypeId(a,z1,"f",R1)}catch(b1){throw h.validation(`Invalid subtype: ${R1}`,"INVALID_SUBTYPE")}return{entity:await $.updateEntityType(a,z1,{id:T1,subtype:R1},N1)}},generaliseFolder:async(a,z1,{id:T1},R1)=>{let N1=await $.readFolder(a,z1,{id:T1});U.factory(!N1,h.notFound,`Folder not found: ${T1}`,"NOT_FOUND");let{typeCode:G1}=a6.resolveEntityId(T1);U.factory(G1!=="f",h.validation,`Entity is not a folder: ${T1}`,"INVALID_OPERATION");let s1=N1.getSubtype();return U.factory(s1===null,h.validation,"Entity is already generic (has no subtype)","ALREADY_GENERIC"),U.factory(Xk1.has(s1),h.validation,`Cannot generalise system-managed folder subtype: ${s1}`,"INVALID_OPERATION"),{entity:await $.updateEntityType(a,z1,{id:T1,subtype:null},R1)}},setIncludeResolver:(a)=>{J=a}})},rp=Object.freeze({create:d16});c6();var a16=({store:$,fieldService:K})=>{return Object.freeze({createSetting:async(Z,O,{store:H,parentId:X,name:w,subtype:P,fields:G},T)=>{U.factory(!H,h.validation,"Store is required","MISSING_STORE_CODE"),U.factory(!X,h.validation,"Parent folder ID is required","MISSING_PARENT_ID"),U.factory(!w||!w.trim(),h.validation,"Setting name is required","MISSING_NAME");let{entity:v,mutationApi:M,pk:V}=await $.createSetting(Z,O,{storeCode:H,parentId:X,name:w.trim(),subtype:P},T);if(G&&typeof G==="object")for(let[N,E]of Object.entries(G))if(Array.isArray(E))await K.setFieldValue(Z,O,{entityId:v.getObjectId(),fieldName:N,values:E},T);else await K.setFieldValue(Z,O,{entityId:v.getObjectId(),fieldName:N,value:E},T);let D=v.toJSON();if(G)D.fields={...D.fields,...G};return{...D,storeCode:H}},readSetting:async(Z,O,{id:H})=>{U.factory(!H,h.validation,"Setting ID is required","MISSING_ID");let X=await $.readSetting(Z,O,{id:H});U.factory(!X,h.notFound,`Setting not found: ${H}`,"SETTING_NOT_FOUND");let{entity:w}=X,P=w.toJSON(),G=H.charAt(0);return{...P,storeCode:G}},listSettings:async(Z,O,{parentId:H,store:X,subtype:w})=>{return U.factory(!H,h.validation,"Parent folder ID is required","MISSING_PARENT_ID"),(await $.listSettings(Z,O,{parentId:H,storeCode:X,subtype:w})).map(({entity:G})=>{let T=G.toJSON(),v=G.getObjectId().charAt(0);return{...T,storeCode:v}})},updateSettingPath:async(Z,O,{id:H,name:X,parentId:w},P)=>{U.factory(!H,h.validation,"Setting ID is required","MISSING_ID"),U.factory(X===void 0&&w===void 0,h.validation,"At least one of name or parentId must be provided","NO_UPDATES");let G=await $.updateSettingPath(Z,O,{id:H,name:X,parentId:w},P);U.factory(!G,h.notFound,`Setting not found: ${H}`,"SETTING_NOT_FOUND");let{entity:T}=G,v=T.toJSON(),M=H.charAt(0);return{...v,storeCode:M}},deleteSetting:async(Z,O,{id:H},X)=>{return U.factory(!H,h.validation,"Setting ID is required","MISSING_ID"),await $.deleteSetting(Z,O,{id:H},X),{deleted:!0,id:H}}})},sp=Object.freeze({create:a16});var o16=()=>{let $=null,K=null,q={prePublish:{d:async(J,W,Z,O,H)=>{if(!$)return;let X=Z.getDraftContent();if(!X)return;let{content:w,pinned:P}=await $.pinIncludes(J,W,X,Z.getObjectId());if(P.length>0)await K.saveDraft(J,W,{id:Z.getObjectId(),content:w,sessionId:O},H)},t:null},postPublish:{},preDelete:{},postCreate:{}};return Object.freeze({getHook:(J,W)=>{return q[J]?.[W]||null},setIncludeResolver:(J,W)=>{$=J,K=W}})},tp=Object.freeze({create:o16});c6();var Gk1=X6(g6(),1),Pk1=X6(XC(),1);var Vz=Gk1.default("caw:includes"),r16=({store:$,documentService:K})=>{let q=/<include\s+(?:id="([^"]+)"|path="([^"]+)")(?:\s+version="(\d+)")?\s*\/>/g,Y=(H)=>{let X=RR(H),w=[],P,G=new RegExp(q.source,"g");while((P=G.exec(X))!==null){let T=H.substring(P.index,P.index+P[0].length),v=new RegExp(q.source).exec(T);if(v)w.push({fullMatch:T,id:v[1],path:v[2],versionStr:v[3],index:P.index})}return w},z=5,J=async(H,X,w,P,G=new Set,T=0)=>{if(Vz("Resolving includes in document, depth=%d, chain=%s, sourceDocId=%s",T,[...G].join(","),P),T>5)throw h.validation("Include depth limit exceeded (max 5 levels)","INCLUDE_DEPTH_EXCEEDED");if(P)G=new Set(G).add(P);let v=Y(w);if(Vz("Found %d include directives",v.length),v.length===0)return w;let M=w;for(let V of v){let{fullMatch:D,id:N,path:E,versionStr:x}=V,b=x?parseInt(x,10):null;Vz("Resolving include: id=%s, path=%s, version=%s",N,E,x);try{let S;if(N)S=N;else{let R=P?P.charAt(0):"A",u=await K.readDocumentByPath(H,X,{path:E,type:"d",storeCode:R});if(!u)throw h.notFound(`Included document not found: ${E}`,"INCLUDE_NOT_FOUND");S=u.entity.getObjectId()}if(G.has(S)){let R=[...G,S].join(" -> ");throw h.validation(`Circular include detected: ${R}`,"INCLUDE_CYCLE")}if(b===null)throw h.validation(`Unpinned include found: ${D}. Includes must specify a version.`,"INCLUDE_UNPINNED");let I=await $.readVersion(H,X,{id:S,versionNumber:b});if(!I)throw h.notFound(`Version ${b} not found for included document: ${S}`,"INCLUDE_VERSION_NOT_FOUND");let C=Pk1.default(I.content).content,k=await J(H,X,C,S,G,T+1);M=M.replace(D,k)}catch(S){let I=N||E,C=`> **Include Error** - couldn't include ${I}${b?` version ${b}`:""}: ${S.message}`;Vz("Include resolution failed for %s: %s",I,S.message),M=M.replace(D,C)}}return M};return Object.freeze({resolve:J,pinIncludes:async(H,X,w,P)=>{Vz("Auto-pinning unpinned includes in document: %s",P);let G=Y(w),T=[],v=w;for(let M of G){let{fullMatch:V,id:D,path:N,versionStr:E}=M;if(E)continue;Vz("Pinning unpinned include: id=%s, path=%s",D,N);let x,b;if(D){x=D;let{entity:I}=await K.readDocument(H,X,{id:D,resolveIncludes:!1});b=I.getPublishedVersionNumber()}else{let I=P?P.charAt(0):"A",C=await K.readDocumentByPath(H,X,{path:N,type:"d",storeCode:I});if(!C)throw h.notFound(`Included document not found: ${N}`,"INCLUDE_NOT_FOUND");x=C.entity.getObjectId(),b=C.entity.getPublishedVersionNumber()}if(!b)throw h.validation(`Cannot pin include - document has no published version: ${x}`,"INCLUDE_NO_VERSION");let S=D?`<include id="${D}" version="${b}" />`:`<include path="${N}" version="${b}" />`;Vz("Pinned include %s to version %d",x,b),v=v.replace(V,S),T.push({id:x,path:N,version:b})}return Vz("Auto-pinned %d unpinned includes",T.length),{content:v,pinned:T}},checkIncludes:async(H,X,w,P)=>{let G=Y(w),T=[];for(let v of G){let{id:M,path:V,versionStr:D}=v,N=D?parseInt(D,10):null,E,x;if(M){E=M;let{entity:b}=await K.readDocument(H,X,{id:M,resolveIncludes:!1});x=b.getPublishedVersionNumber()}else{let b=P?P.charAt(0):"A",S=await K.readDocumentByPath(H,X,{path:V,type:"d",storeCode:b});E=S?.entity?.getObjectId(),x=S?.entity?.getPublishedVersionNumber()}T.push({id:E,path:V||null,pinnedVersion:N,latestVersion:x,outdated:N!==null&&x!==null&&N<x})}return T},updateIncludes:async(H,X,w,P)=>{let G=Y(w),T=[],v=w;for(let M of G){let{fullMatch:V,id:D,path:N,versionStr:E}=M,x=E?parseInt(E,10):null,b,S;if(D){b=D;let{entity:I}=await K.readDocument(H,X,{id:D,resolveIncludes:!1});S=I.getPublishedVersionNumber()}else{let I=P?P.charAt(0):"A",C=await K.readDocumentByPath(H,X,{path:N,type:"d",storeCode:I});b=C?.entity?.getObjectId(),S=C?.entity?.getPublishedVersionNumber()}if(S&&x!==S){let I=D?`<include id="${D}" version="${S}" />`:`<include path="${N}" version="${S}" />`;v=v.replace(V,I),T.push({id:b,path:N||null,fromVersion:x,toVersion:S})}}return{content:v,updated:T}}})},ep=Object.freeze({create:r16});c6();var NR1=X6(XC(),1),fR1=X6(JM(),1),jR1=["job","document","file","stdout","clipboard"],y96=Object.freeze({string:"string",number:"float",boolean:"boolean",array:"json",object:"json",int:"int",float:"float",text:"text",date:"date",object_ref:"object_ref",enum:"string"}),b96=["default","placeholder","rows","description","colSpan"],B96=($,K)=>{let q=K.type||"string",Y=y96[q];if(Y===void 0)throw Error(`INVALID_PARAMETER_TYPE: Parameter '${$}' has unknown type '${q}'`);let z={label:K.label??$,primitiveType:Y,required:K.required??!1};for(let J of b96)if(J in K)z[J]=K[J];if(q==="enum"){if(!Array.isArray(K.values))throw Error(`INVALID_PARAMETER_CONFIG: Parameter '${$}': enum type requires a 'values' array`);z.allowed={type:"enum",values:K.values}}else if(K.allowed!==void 0){if(Y!=="string")throw Error(`INVALID_PARAMETER_CONFIG: Parameter '${$}': 'allowed' is only supported on string-typed parameters`);if(K.allowed.type!=="enum")throw Error(`INVALID_PARAMETER_CONFIG: Parameter '${$}': allowed.type must be 'enum'`);z.allowed=K.allowed}return z},m96=($)=>{if($===null||$===void 0)return{type:null};if(typeof $==="string")return{type:$};if(typeof $==="object"){let{type:K}=$;if(!K)throw Error("Invalid target configuration: 'target.type' is required when target is an object");if(!jR1.includes(K))throw Error(`Invalid target type '${K}'. Valid types: ${jR1.join(", ")}`);let q=$[K]||{};if(K==="job"){let{name:Y,execution:z={},ui:J={}}=q;return{type:K,targetJobName:Y||null,targetJobAgent:z.agent||null,targetJobModel:z.model||null,targetJobWorktree:z.worktree||null,targetJobDockerImage:z.dockerImage||null,targetJobStreaming:z.output==="streaming",targetJobSkipDialog:J.skipDialog??!1,targetJobClearFlag:J.clearFlag??!1,targetJobClearMessage:J.clearStatusMessage??!1,targetJobResumePrompt:z.resumePrompt||null}}if(K==="document"){let{path:Y,parentId:z,name:J,root:W,store:Z,subtype:O,fields:H}=q;return{type:K,targetPath:Y||null,targetParentId:z||null,targetName:J||null,targetRoot:W||null,targetStore:Z||null,targetSubtype:O||null,targetFields:H||null}}if(K==="file"){let{path:Y,store:z}=q;return{type:K,targetPath:Y||null,targetStore:z||null}}return{type:K}}return{type:null}},kR1=($)=>{let K={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,targetJobDockerImage:null,targetJobClearFlag:!1,targetJobClearMessage:!1,targetJobResumePrompt:null,skipDialog:!1,targetSubtype:null,targetFields:null,body:""};if(!$)return K;let q=NR1.default($),Y=q.data?.parameters||{},z={};for(let[k,R]of Object.entries(Y))z[k]=B96(k,R||{});let J=q.content,W=q.data?.skipDialog??!1,Z=m96(q.data?.target),O=Z.type,H=Z.targetJobName??null,X=Z.targetJobAgent??null,w=Z.targetJobModel??null,P=Z.targetJobWorktree??null,G=Z.targetJobSkipDialog??!1,T=Z.targetJobStreaming??!1,v=Z.targetJobDockerImage??null,M=Z.targetJobClearFlag??!1,V=Z.targetJobClearMessage??!1,D=Z.targetJobResumePrompt??null,N=Z.targetPath??null,E=Z.targetParentId??null,x=Z.targetName??null,b=Z.targetRoot??null,S=Z.targetStore??null,I=Z.targetSubtype??null,C=Z.targetFields??null;return{parameters:z,target:O,targetPath:N,targetParentId:E,targetName:x,targetRoot:b,targetStore:S,targetJobName:H,targetJobAgent:X,targetJobModel:w,targetJobWorktree:P,targetJobSkipDialog:G,targetJobStreaming:T,targetJobDockerImage:v,targetJobClearFlag:M,targetJobClearMessage:V,targetJobResumePrompt:D,skipDialog:W,targetSubtype:I,targetFields:C,body:J}},U96=($)=>{if(!$)return new Set;let K=new Set,q=new Set(["if","unless","each","with","lookup","log"]);try{let Y=fR1.default.parse($),z=(J,W=null,Z=null)=>{if(!J)return;if(J.type==="PathExpression"){if(J.data)return;let O=J.parts.join(".");if(!O||O.startsWith("@"))return;if(W?.type==="BlockStatement"&&Z==="path"||W?.type==="MustacheStatement"&&Z==="path"&&W.params?.length>0){if(q.has(O))return;return}K.add(O)}if(J.program)z(J.program,J,"program");if(J.inverse)z(J.inverse,J,"inverse");if(J.body)J.body.forEach((O)=>z(O,J,"body"));if(J.params)J.params.forEach((O)=>z(O,J,"params"));if(J.hash?.pairs)J.hash.pairs.forEach((O)=>z(O.value,J,"hash"));if(J.path)z(J.path,J,"path")};z(Y)}catch(Y){throw Error(`Invalid Handlebars template: ${Y.message}`)}return K},c96=($)=>{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,targetJobDockerImage:null,targetJobClearFlag:!1,targetJobClearMessage:!1,targetJobResumePrompt:null,skipDialog:!1,targetSubtype:null,targetFields:null};let{parameters:K,target:q,targetPath:Y,targetParentId:z,targetName:J,targetRoot:W,targetStore:Z,targetJobName:O,targetJobAgent:H,targetJobModel:X,targetJobWorktree:w,targetJobSkipDialog:P,targetJobStreaming:G,targetJobDockerImage:T,targetJobClearFlag:v,targetJobClearMessage:M,targetJobResumePrompt:V,skipDialog:D,targetSubtype:N,targetFields:E}=kR1($);return{parameters:K,target:q,targetPath:Y,targetParentId:z,targetName:J,targetRoot:W,targetStore:Z,targetJobName:O,targetJobAgent:H,targetJobModel:X,targetJobWorktree:w,targetJobSkipDialog:P,targetJobStreaming:G,targetJobDockerImage:T,targetJobClearFlag:v,targetJobClearMessage:M,targetJobResumePrompt:V,skipDialog:D,targetSubtype:N,targetFields:E}},LC=Object.freeze({parseFrontMatter:kR1,extractVariables:U96,getParameters:c96});var zE=X6(JM(),1),fU1=X6(NU1(),1);fU1.default({handlebars:zE.default});var yq6=($={})=>{return Object.freeze({renderTemplate:(Y,z={})=>{if(!Y)throw h.validation("Template content cannot be empty","EMPTY_TEMPLATE");let{body:J}=LC.parseFrontMatter(Y),W;try{W=zE.default.compile(J,{noEscape:!0})(z)}catch(Z){throw h.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,targetJobDockerImage:null,targetJobClearFlag:!1,targetJobClearMessage:!1,skipDialog:!1,targetSubtype:null,targetFields:null};let{parameters:z,target:J,targetPath:W,targetParentId:Z,targetName:O,targetRoot:H,targetStore:X,targetJobName:w,targetJobAgent:P,targetJobModel:G,targetJobWorktree:T,targetJobSkipDialog:v,targetJobStreaming:M,targetJobDockerImage:V,targetJobClearFlag:D,targetJobClearMessage:N,skipDialog:E,targetSubtype:x,targetFields:b,body:S}=LC.parseFrontMatter(Y),I=LC.extractVariables(S),C=Array.from(I);return{parameters:z,detectedVariables:C,target:J,targetPath:W,targetParentId:Z,targetName:O,targetRoot:H,targetStore:X,targetJobName:w,targetJobAgent:P,targetJobModel:G,targetJobWorktree:T,targetJobSkipDialog:v,targetJobStreaming:M,targetJobDockerImage:V,targetJobClearFlag:D,targetJobClearMessage:N,skipDialog:E,targetSubtype:x,targetFields:b}}})},el=Object.freeze({create:yq6});import CM from"node:fs";import kU1 from"node:os";import JE from"node:path";c6();var bq6=({projectStore:$,storeStore:K})=>{return Object.freeze({createProject:async(Z,O,{name:H,path:X},w)=>{if(await $.readProjectByPath(Z,O,X))throw h.conflict("Project with this path already exists","DUPLICATE_PATH");let G=await $.createProject(Z,O,{name:H,path:X},w),T=await K.createLocalStore(Z,O,{code:"A",name:"Project"},w);await T.createFolder(Z,O,{parentId:null,name:"Documents",subtype:"root_d"},w),await T.createFolder(Z,O,{parentId:null,name:"Templates",subtype:"root_t"},w),await T.createFolder(Z,O,{parentId:null,name:"Stories",subtype:"root_s"},w),await T.createFolder(Z,O,{parentId:null,name:"Jobs",subtype:"root_j"},w),await T.createFolder(Z,O,{parentId:null,name:"Settings",subtype:"root_settings"},w);let v=await T.readSettingsRootFolder(Z,O,{storeCode:"A"}),M=await T.createFolder(Z,O,{parentId:v.getObjectId(),name:"Stories",subtype:null},w),V=await T.createFolder(Z,O,{parentId:v.getObjectId(),name:"Jobs",subtype:null},w),D=await T.createFolder(Z,O,{parentId:v.getObjectId(),name:"Deleted Items",subtype:null},w),N=await T.createFolder(Z,O,{parentId:M.getObjectId(),name:"Tracks",subtype:null},w),{entity:E}=await T.createSetting(Z,O,{storeCode:"A",parentId:N.getObjectId(),name:"Default",subtype:"track"},w);await T.setFieldValue(Z,O,{entityId:E.getObjectId(),fieldName:"states",values:[...Ik]},w);let{entity:x}=await T.createSetting(Z,O,{storeCode:"A",parentId:M.getObjectId(),name:"auto-archive-delay",subtype:"auto-archive-config"},w);await T.setFieldValue(Z,O,{entityId:x.getObjectId(),fieldName:"delayMs",value:604800000},w);let{entity:b}=await T.createSetting(Z,O,{storeCode:"A",parentId:V.getObjectId(),name:"job-config",subtype:"job-config"},w);await T.setFieldValue(Z,O,{entityId:b.getObjectId(),fieldName:"maxConcurrentJobs",value:5},w);let{entity:S}=await T.createSetting(Z,O,{storeCode:"A",parentId:D.getObjectId(),name:"disposal-config",subtype:"disposal-config"},w);await T.setFieldValue(Z,O,{entityId:S.getObjectId(),fieldName:"scratchDocDelayDays",value:7},w),await T.setFieldValue(Z,O,{entityId:S.getObjectId(),fieldName:"jobDelayDays",value:7},w),await T.setFieldValue(Z,O,{entityId:S.getObjectId(),fieldName:"retentionDays",value:30},w);let{entity:I}=await T.createSetting(Z,O,{storeCode:"A",parentId:V.getObjectId(),name:"resume-config",subtype:"resume-config"},w);await T.setFieldValue(Z,O,{entityId:I.getObjectId(),fieldName:"maxResumeAttempts",value:3},w),await T.setFieldValue(Z,O,{entityId:I.getObjectId(),fieldName:"cronIntervalMs",value:60000},w);let C=await K.readSharedStore(Z,O),k=await K.createDemuxStore(Z,O,{name:H},w);return await K.addChildToDemux(Z,O,{demuxId:k.getObjectId(),childId:T.getObjectId()},w),await K.addChildToDemux(Z,O,{demuxId:k.getObjectId(),childId:C.getObjectId()},w),await K.addStoresToProject(Z,O,{projectId:G.getObjectId(),rootStoreId:k.getObjectId(),storeIds:[k.getObjectId(),T.getObjectId(),C.getObjectId()]}),G},validateProjectPath:(Z)=>{if(!Z||typeof Z!=="string")throw h.validation("Path is required and must be a non-empty string","VALIDATION_ERROR");let O;if(Z==="~")O=kU1.homedir();else if(Z.startsWith("~/"))O=JE.join(kU1.homedir(),Z.slice(2));else O=Z;let H=CM.existsSync(O),X=!1,w=!1,P=!1;if(H)try{if(X=CM.statSync(O).isDirectory(),X){let v=JE.join(O,".git");try{w=CM.statSync(v).isDirectory()}catch{w=!1}let M=JE.join(O,".claude");try{P=CM.statSync(M).isDirectory()}catch{P=!1}}}catch(T){X=!1}let G=JE.basename(O);return{path:O,exists:H,isDirectory:X,hasGit:w,hasClaude:P,suggestedName:G}},listProjects:async(Z)=>{let O=await Z.selectFrom("entities").innerJoin("string_fields","string_fields.entity_id","entities.id").innerJoin("field_definitions","field_definitions.id","string_fields.field_definition_id").select(["entities.id","entities.object_id","entities.name","entities.created_at","entities.updated_at","string_fields.value as path"]).where("entities.type_code","=","p").where("entities.deleted_at","is",null).where("field_definitions.name","=","path").where("field_definitions.store_id","is",null).where("field_definitions.is_system","=",1).where("entities.name","!=","__system__").orderBy("entities.created_at","desc").execute();return await Promise.all(O.map(async(X)=>{let P=(await Z.selectFrom("project_stores").innerJoin("entities","entities.id","project_stores.store_id").innerJoin("entity_types","entity_types.id","entities.entity_type_id").leftJoin("string_fields","string_fields.entity_id","entities.id").leftJoin("field_definitions","field_definitions.id","string_fields.field_definition_id").select(["entities.object_id","entities.name","entity_types.subtype","string_fields.value as code"]).where("project_stores.project_id","=",X.id).where("entities.type_code","=","r").where("entity_types.subtype","=","local").where((G)=>G.or([G("field_definitions.name","=","code"),G("field_definitions.name","is",null)])).where("entities.deleted_at","is",null).execute()).map((G)=>({id:G.code==="B"?"store:B":`store:${G.code}:${X.object_id}`,code:G.code,name:G.name}));return{objectId:X.object_id,name:X.name,path:X.path,createdAt:X.created_at,updatedAt:X.updated_at,children:P}}))},renameProject:async(Z,O,{id:H,name:X},w)=>{if(!X||typeof X!=="string"||X.trim()==="")throw h.validation("Name is required","VALIDATION_ERROR");let P=X.trim();if(P.length>255)throw h.validation("Name exceeds maximum length (255)","VALIDATION_ERROR");if(!await $.readProject(Z,O,H))throw h.notFound(`Project not found: ${H}`,"PROJECT_NOT_FOUND");return await $.updateProject(Z,O,{id:H,name:P},w)},deleteProject:async(Z,O,{id:H},X)=>{if(!await $.readProject(Z,O,H))throw h.notFound(`Project not found: ${H}`,"PROJECT_NOT_FOUND");return await $.deleteProject(Z,O,{id:H},X)}})},KZ=Object.freeze({create:bq6});var DU1=X6(g6(),1),$i=DU1.default("caw:hooks"),RU1=0,CU1=()=>RU1,Bq6=()=>{let $=[];return{enqueuePostCommitHook:(K,q,Y)=>{$.push({name:K,fn:q,onError:Y})},flush:()=>{for(let{name:K,fn:q,onError:Y}of $)try{q()}catch(z){if(RU1++,$i("Post-commit hook failed: %s %o",K,z),Y)try{Y(z)}catch(J){$i("onError callback failed for hook %s: %o",K,J)}}},rollback:()=>{for(let{name:K,onError:q}of $)if(q)try{q(null)}catch(Y){$i("Rollback hook failed for %s: %o",K,Y)}}}},mq6=async($,K,{story:q,trackService:Y})=>{if(!Y)return{};let z=q.getField("track")?.getValue();if(!z)return{};try{let J=await Y.getTrackById($,K,{id:z});return{story:{track:J.getName(),trackId:J.getObjectId(),trackStore:W6.extractStoreCode(J.getObjectId())}}}catch(J){return{}}},Uq6=({db:$,store:K,folderService:q,fieldService:Y,documentService:z,templateService:J,projectService:W,clipboardService:Z,storyService:O,trackService:H,assetService:X,jobService:w,includeResolver:P,worktreeService:G,entityTypeService:T,progressService:v,duplicationService:M})=>{let V=async(d1)=>{let O1=Bq6(),k1;try{await $.transaction().execute(async(_1)=>{k1=await d1(_1,O1.enqueuePostCommitHook)})}catch(_1){throw O1.rollback(),_1}return O1.flush(),k1};return Object.freeze({createFolder:async(d1,{mode:O1,store:k1,path:_1,root:f1,parentId:y1,name:T8,type:b8,subtype:s8,fields:d8})=>{return V(async(T6,S1)=>{return await q.createFolder(T6,d1,{mode:O1,store:k1,path:_1,root:f1,parentId:y1,name:T8,type:b8,subtype:s8,fields:d8},S1)})},renameFolder:async(d1,{id:O1,name:k1})=>{return V(async(_1,f1)=>{return await q.renameFolder(_1,d1,{id:O1,name:k1},f1)})},moveFolder:async(d1,{id:O1,parentId:k1})=>{return V(async(_1,f1)=>{return await q.moveFolder(_1,d1,{id:O1,parentId:k1},f1)})},deleteFolder:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await q.deleteFolder(k1,d1,{id:O1},_1)})},createProject:async(d1,{name:O1,path:k1},_1)=>{return V(async(f1,y1)=>{let T8=await W.createProject(f1,d1,{name:O1,path:k1},y1);if(_1)y1(`notify:projectCreated:${T8.getObjectId()}`,()=>{_1({id:T8.getObjectId(),name:T8.getName(),path:T8.getPath()})});return T8})},renameProject:async(d1,{id:O1,name:k1})=>{return V(async(_1,f1)=>{return await W.renameProject(_1,d1,{id:O1,name:k1},f1)})},deleteProject:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await W.deleteProject(k1,d1,{id:O1},_1)})},createFieldDefinition:async(d1,{store:O1,ownerEntityId:k1,ownerEntityTypeCode:_1,ownerEntityTypeSubtype:f1,name:y1,label:T8,description:b8,primitiveType:s8,required:d8,multiplicity:T6,isSystem:S1,allowed:x1})=>{return V(async(X1,$8)=>{return await Y.createFieldDefinition(X1,d1,{store:O1,ownerEntityId:k1,ownerEntityTypeCode:_1,ownerEntityTypeSubtype:f1,name:y1,label:T8,description:b8,primitiveType:s8,required:d8,multiplicity:T6,isSystem:S1,allowed:x1},$8)})},addFieldToEntity:async(d1,{entityId:O1,fieldDefinitionId:k1,fieldName:_1,value:f1,values:y1})=>{return V(async(T8,b8)=>{let s8=await Y.addFieldToEntity(T8,d1,{entityId:O1,fieldDefinitionId:k1,fieldName:_1,value:f1,values:y1},b8);return s8?.entity??s8})},updateFieldValue:async(d1,{entityId:O1,fieldDefinitionId:k1,fieldName:_1,value:f1,values:y1})=>{return V(async(T8,b8)=>{return await Y.updateFieldValue(T8,d1,{entityId:O1,fieldDefinitionId:k1,fieldName:_1,value:f1,values:y1},b8)})},setFieldValue:async(d1,{entityId:O1,fieldDefinitionId:k1,fieldName:_1,value:f1,values:y1,dependencies:T8})=>{return V(async(b8,s8)=>{let d8=await Y.setFieldValue(b8,d1,{entityId:O1,fieldDefinitionId:k1,fieldName:_1,value:f1,values:y1,dependencies:T8},s8);return d8?.entity??d8})},removeFieldFromEntity:async(d1,{entityId:O1,fieldDefinitionId:k1,fieldName:_1})=>{return V(async(f1,y1)=>{return await Y.removeFieldFromEntity(f1,d1,{entityId:O1,fieldDefinitionId:k1,fieldName:_1},y1)})},deleteFieldDefinition:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await Y.deleteFieldDefinition(k1,d1,{id:O1},_1)})},addClassAssociation:async(d1,{store:O1,fieldDefinitionId:k1,entityTypeCode:_1,entityTypeSubtype:f1,required:y1,sortOrder:T8,rows:b8,colspan:s8,description:d8,hidden:T6})=>{return V(async(S1,x1)=>{return await Y.addClassAssociation(S1,d1,{store:O1,fieldDefinitionId:k1,entityTypeCode:_1,entityTypeSubtype:f1,required:y1,sortOrder:T8,rows:b8,colspan:s8,description:d8,hidden:T6},x1)})},createSubtype:async(d1,{code:O1,subtype:k1,name:_1,parentSubtype:f1})=>{return V(async(y1,T8)=>{return await T.createSubtype(y1,d1,{code:O1,subtype:k1,name:_1,parentSubtype:f1},T8)})},createDocument:async(d1,{mode:O1,store:k1,path:_1,root:f1,parentId:y1,name:T8,type:b8,content:s8,tree:d8,subtype:T6,fields:S1})=>{return V(async(x1,X1)=>{return await z.createDocument(x1,d1,{mode:O1,store:k1,path:_1,root:f1,parentId:y1,name:T8,type:b8,content:s8,tree:d8,subtype:T6,fields:S1},X1)})},createTemplate:async(d1,{mode:O1,store:k1,path:_1,root:f1,parentId:y1,name:T8,content:b8,subtype:s8})=>{return V(async(d8,T6)=>{return await z.createTemplate(d8,d1,{mode:O1,store:k1,path:_1,root:f1,parentId:y1,name:T8,content:b8,subtype:s8},T6)})},updateDocumentPath:async(d1,{id:O1,path:k1,parentId:_1,type:f1})=>{return V(async(y1,T8)=>{return await z.updateDocumentPath(y1,d1,{id:O1,path:k1,parentId:_1,type:f1},T8)})},deleteDocument:async(d1,{id:O1,ack:k1})=>{return V(async(_1,f1)=>{return await z.deleteDocument(_1,d1,{id:O1,ack:k1},f1)})},saveDraft:async(d1,{id:O1,content:k1,sessionId:_1})=>{return V(async(f1,y1)=>{return await z.saveDraft(f1,d1,{id:O1,content:k1,sessionId:_1},y1)})},publishDocument:async(d1,{id:O1,sessionId:k1})=>{return V(async(_1,f1)=>{let y1=await z.publishDocument(_1,d1,{id:O1,sessionId:k1},f1);if(v)await v.calculateAndStoreProgress(_1,d1,O1,f1,{includeDraft:!1});return y1})},discardDraft:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await z.discardDraft(k1,d1,{id:O1},_1)})},setEditState:async(d1,{id:O1,sessionId:k1})=>{return V(async(_1,f1)=>{return await z.setEditState(_1,d1,{id:O1,sessionId:k1},f1)})},clearEditState:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await z.clearEditState(k1,d1,{id:O1},_1)})},editDocument:async(d1,{id:O1,operation:k1,preview:_1,ignoreContent:f1,sessionId:y1})=>{return V(async(T8,b8)=>{return await z.editDocument(T8,d1,{id:O1,operation:k1,preview:_1,ignoreContent:f1,sessionId:y1},b8)})},batchEditDocument:async(d1,{id:O1,operations:k1,preview:_1,ignoreContent:f1,sessionId:y1})=>{return V(async(T8,b8)=>{return await z.batchEditDocument(T8,d1,{id:O1,operations:k1,preview:_1,ignoreContent:f1,sessionId:y1},b8)})},checkChecklistItem:async(d1,{id:O1,lineNumber:k1,checked:_1,includeDraft:f1,preview:y1,sessionId:T8})=>{return V(async(b8,s8)=>{let d8=await z.checkChecklistItem(b8,d1,{id:O1,lineNumber:k1,checked:_1,includeDraft:f1,preview:y1,sessionId:T8},s8);if(!y1&&v)await v.calculateAndStoreProgress(b8,d1,O1,s8);return d8})},toggleChecklistItem:async(d1,{id:O1,lineNumber:k1,includeDraft:_1,preview:f1,sessionId:y1})=>{return V(async(T8,b8)=>{let s8=await z.toggleChecklistItem(T8,d1,{id:O1,lineNumber:k1,includeDraft:_1,preview:f1,sessionId:y1},b8);if(!f1&&v)await v.calculateAndStoreProgress(T8,d1,O1,b8);return s8})},batchCheckChecklistItems:async(d1,{id:O1,items:k1,includeDraft:_1,preview:f1,sessionId:y1})=>{return V(async(T8,b8)=>{let s8=await z.batchCheckChecklistItems(T8,d1,{id:O1,items:k1,includeDraft:_1,preview:f1,sessionId:y1},b8);if(!f1&&v)await v.calculateAndStoreProgress(T8,d1,O1,b8);return s8})},specialiseDocument:async(d1,{id:O1,subtype:k1,fields:_1})=>{return V(async(f1,y1)=>{return await z.specialiseDocument(f1,d1,{id:O1,subtype:k1,fields:_1},y1)})},generaliseDocument:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await z.generaliseDocument(k1,d1,{id:O1},_1)})},specialiseFolder:async(d1,{id:O1,subtype:k1})=>{return V(async(_1,f1)=>{return await z.specialiseFolder(_1,d1,{id:O1,subtype:k1},f1)})},generaliseFolder:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await z.generaliseFolder(k1,d1,{id:O1},_1)})},duplicateDocument:async(d1,{sourceId:O1,targetParentId:k1,newName:_1})=>{return V(async(f1,y1)=>{return await M.duplicateDocument(f1,d1,{sourceId:O1,targetParentId:k1,newName:_1},y1)})},duplicateFolder:async(d1,{sourceId:O1,targetParentId:k1,newName:_1})=>{return V(async(f1,y1)=>{return await M.duplicateFolder(f1,d1,{sourceId:O1,targetParentId:k1,newName:_1},y1)})},restoreEvent:async(d1,{deletedAt:O1,storeCode:k1})=>{let _1=await K.findDeletedEventRoot($,d1,{deletedAt:O1,storeCode:k1});if(!_1)throw(await Promise.resolve().then(() => (c6(),SW))).default.notFound(`No deletion event found for timestamp: ${O1}`,"NOT_FOUND");return V(async(f1,y1)=>{return await K.restoreEntity(f1,d1,{id:_1,deletedAt:O1},y1)})},renderTemplate:async(d1,{id:O1,params:k1,target:_1,targetOptions:f1,sessionId:y1})=>{let{entity:T8}=await z.readDocument($,d1,{id:O1,resolveIncludes:!1});if(!T8.getPublishedContent())throw(await Promise.resolve().then(() => (c6(),SW))).default.validation("Template has no published content","NO_PUBLISHED_CONTENT");let b8=T8.getPublishedContent(),{target:s8,targetPath:d8,targetParentId:T6,targetName:S1,targetRoot:x1,targetStore:X1,targetJobName:$8,targetJobAgent:M1,targetJobModel:a1,targetJobWorktree:t1,targetJobStreaming:G8,targetJobDockerImage:A8,targetJobClearFlag:E8,targetJobClearMessage:x8,targetJobResumePrompt:Q8,targetSubtype:I6,targetFields:B6}=J.extractTemplateParameters(b8),F=_1||s8||"stdout",e=f1?.parentId||f1?.root||f1?.path?{path:f1?.path,parentId:f1?.parentId,name:f1?.name,root:f1?.root,store:f1?.store,publish:f1?.publish}:{path:f1?.path||d8,parentId:f1?.parentId||T6,name:f1?.name||S1,root:f1?.root||x1,store:f1?.store||X1,publish:f1?.publish},V1=f1?.subtype||I6,Z1=f1?.fields||B6,Q=b8;if(P)Q=await P.resolve($,d1,b8,O1);let i=f1?.objectId||k1?.["object-id"],c=k1||{};if(i&&i[1]==="s")try{let $1=await O.getStory($,d1,{id:i});c={...await mq6($,d1,{story:$1,trackService:H}),...c}}catch($1){}let d=J.renderTemplate(Q,c);if(e.path)e.path=J.renderTemplate(e.path,k1||{});if(e.name)e.name=J.renderTemplate(e.name,k1||{});let o=null;if(Z1){o={};for(let[$1,v1]of Object.entries(Z1))if(typeof v1==="string")o[$1]=J.renderTemplate(v1,k1||{});else if(Array.isArray(v1))o[$1]=v1.map((h1)=>typeof h1==="string"?J.renderTemplate(h1,k1||{}):h1);else o[$1]=v1}switch(F){case"stdout":return{content:d,target:"stdout"};case"clipboard":return await Z.copyToClipboard(d),{target:"clipboard",message:"Copied to clipboard"};case"document":return V(async(h1,F1)=>{let K8=(await Promise.resolve().then(() => (c6(),SW))).default,w8;if(e.parentId){if(!e.name)throw K8.validation("targetOptions.name is required when parentId is provided","MISSING_TARGET_NAME");w8={mode:"parentName",parentId:e.parentId,name:e.name,content:d,subtype:V1,fields:o}}else if(e.root){if(!e.path)throw K8.validation("targetOptions.path is required when root is provided","MISSING_TARGET_PATH");w8={mode:"rootRelative",root:e.root,path:e.path,content:d,subtype:V1,fields:o}}else{if(!e.path)throw K8.validation("targetOptions.path is required for document target","MISSING_TARGET_PATH");w8={mode:"fullPath",store:e.store||"A",path:e.path,content:d,subtype:V1,fields:o}}let D8=await z.createDocument(h1,d1,w8,F1);if(e.publish)await z.publishDocument(h1,d1,{id:D8.getObjectId(),sessionId:y1},F1);return{content:d,target:"document",documentId:D8.getObjectId(),documentPath:e.path||e.name,published:!!e.publish}});case"job":return V(async(h1,F1)=>{let K8=(await Promise.resolve().then(() => (c6(),SW))).default;if(!d||!d.trim())throw K8.validation("Template rendered to empty prompt","MISSING_PROMPT");let w8=f1?.jobName||$8,D8=f1?.jobAgent||M1||"claude",m8=f1?.jobModel||a1,y8=f1?.jobWorktree||t1,I8=f1?.jobStreaming??G8,O6=f1?.jobDockerImage||A8,b6=f1?.objectId||k1?.["object-id"],o6=E8?"true":void 0,V4=x8?"true":void 0,l6=null;if(w8)l6=J.renderTemplate(w8,k1||{});let q2=null;if(y8&&G){let{worktrees:s2}=await G.listWorktrees({projectPath:d1.projectPath}),N2=s2.find((y2)=>y2.branch===y8);if(!N2)throw K8.validation(`Worktree with branch '${y8}' not found`,"WORKTREE_NOT_FOUND");q2=N2.path}let d6=W6.extractStoreCode(O1),d4=await w.createJob(h1,d1,{store:d6,name:l6,agent:D8,model:m8,prompt:d,workingDirectory:q2,objectId:b6,streaming:I8,dockerImage:O6,clearStoryFlag:o6,clearStatusMessage:V4,resumePromptRef:Q8||void 0},F1);return{target:"job",jobId:d4.getObjectId(),jobName:d4.getName()}});case"file":throw(await Promise.resolve().then(() => (c6(),SW))).default.validation("file target not yet implemented","NOT_IMPLEMENTED");default:throw(await Promise.resolve().then(() => (c6(),SW))).default.validation(`Unknown target: ${F}`,"INVALID_TARGET")}},createStory:async(d1,{name:O1,storeCode:k1,state:_1,track:f1,phase:y1})=>{return V(async(T8,b8)=>{return await O.createStory(T8,d1,{store:k1,name:O1,state:_1,track:f1,phase:y1},b8)})},renameStory:async(d1,{id:O1,name:k1})=>{return V(async(_1,f1)=>{return await O.renameStory(_1,d1,{id:O1,name:k1},f1)})},updateStoryState:async(d1,{id:O1,state:k1})=>{return V(async(_1,f1)=>{return await O.updateStoryState(_1,d1,{id:O1,state:k1},f1)})},changeTrack:async(d1,{id:O1,track:k1,targetState:_1})=>{return V(async(f1,y1)=>{return await O.changeTrack(f1,d1,{id:O1,track:k1,targetState:_1},y1)})},deleteStory:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await O.deleteStory(k1,d1,{id:O1},_1)})},incrementStoryJobCount:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await O.incrementActiveJobCount(k1,d1,{id:O1},_1)})},decrementStoryJobCount:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await O.decrementActiveJobCount(k1,d1,{id:O1},_1)})},setStoryJobCount:async(d1,{id:O1,count:k1})=>{return V(async(_1,f1)=>{return await O.setActiveJobCount(_1,d1,{id:O1,count:k1},f1)})},reorderStories:async(d1,{store:O1,phase:k1,orderedIds:_1})=>{return V(async(f1,y1)=>{return await O.reorderStories(f1,d1,{store:O1,phase:k1,orderedIds:_1},y1)})},reorderSingle:async(d1,{store:O1,storyId:k1,afterId:_1})=>{return V(async(f1,y1)=>{return await O.reorderSingle(f1,d1,{store:O1,storyId:k1,afterId:_1},y1)})},createTrack:async(d1,{store:O1,name:k1,states:_1})=>{return V(async(f1,y1)=>{return await H.createTrack(f1,d1,{store:O1,name:k1,states:_1},y1)})},updateTrack:async(d1,{id:O1,name:k1,states:_1,renames:f1})=>{return V(async(y1,T8)=>{return await H.updateTrack(y1,d1,{id:O1,name:k1,states:_1,renames:f1},T8)})},deleteTrack:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await H.deleteTrack(k1,d1,{id:O1},_1)})},createAsset:async(d1,{store:O1,buffer:k1,mimeType:_1,originalFilename:f1,widthPx:y1,heightPx:T8,displayWidth:b8,displayHeight:s8})=>{return V(async(d8,T6)=>{return await X.createAsset(d8,d1,{store:O1,buffer:k1,mimeType:_1,originalFilename:f1,widthPx:y1,heightPx:T8,displayWidth:b8,displayHeight:s8},T6)})},deleteAsset:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await X.deleteAsset(k1,d1,{id:O1},_1)})},createJob:async(d1,{store:O1,name:k1,agent:_1,model:f1,prompt:y1,workingDirectory:T8,objectId:b8,streaming:s8,parentJobId:d8,blocking:T6,dockerImage:S1,clearStoryFlag:x1,clearStatusMessage:X1,resumePromptRef:$8,defaultResumePromptRef:M1})=>{return V(async(a1,t1)=>{return await w.createJob(a1,d1,{store:O1,name:k1,agent:_1,model:f1,prompt:y1,workingDirectory:T8,objectId:b8,streaming:s8,parentJobId:d8,blocking:T6,dockerImage:S1,clearStoryFlag:x1,clearStatusMessage:X1,resumePromptRef:$8,defaultResumePromptRef:M1},t1)})},deleteJob:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await w.deleteJob(k1,d1,{id:O1},_1)})},updateJobStatus:async(d1,{id:O1,status:k1,exitCode:_1,errorMessage:f1,resumeAt:y1,resumeAttempts:T8,segmentStartedAt:b8})=>{return V(async(s8,d8)=>{return await w.updateJobStatus(s8,d1,{id:O1,status:k1,exitCode:_1,errorMessage:f1,resumeAt:y1,resumeAttempts:T8,segmentStartedAt:b8},d8)})},updateJobOutput:async(d1,{id:O1,output:k1})=>{return V(async(_1,f1)=>{return await w.updateJobOutput(_1,d1,{id:O1,output:k1},f1)})},updateJobTokens:async(d1,{id:O1,tokensUsed:k1})=>{return V(async(_1,f1)=>{return await w.updateJobTokens(_1,d1,{id:O1,tokensUsed:k1},f1)})},updateJobMetadata:async(d1,{id:O1,durationMs:k1,totalCostUsd:_1,numTurns:f1,sessionId:y1})=>{return V(async(T8,b8)=>{return await w.updateJobMetadata(T8,d1,{id:O1,durationMs:k1,totalCostUsd:_1,numTurns:f1,sessionId:y1},b8)})},continueJob:async(d1,{id:O1,prompt:k1,model:_1,streaming:f1,workingDirectory:y1,dockerImage:T8,skipPermissions:b8})=>{try{return await V(async(s8,d8)=>{return await w.continueJob(s8,d1,{id:O1,prompt:k1,model:_1,streaming:f1,workingDirectory:y1,dockerImage:T8,skipPermissions:b8},d8)})}catch(s8){if(s8.code==="BUDGET_EXHAUSTED")await V(async(d8,T6)=>{await w.updateJobStatus(d8,d1,{id:O1,status:"error",errorMessage:s8.errorMessage},T6)});throw s8}},stopJob:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await w.stopJob(k1,d1,{id:O1},_1)})},setJobPid:async(d1,{id:O1,pid:k1})=>{return V(async(_1,f1)=>{return await w.setJobPid(_1,d1,{id:O1,pid:k1},f1)})},clearJobPid:async(d1,{id:O1})=>{return V(async(k1,_1)=>{return await w.clearJobPid(k1,d1,{id:O1},_1)})},renameJob:async(d1,{id:O1,name:k1})=>{return V(async(_1,f1)=>{return await w.renameJob(_1,d1,{id:O1,name:k1},f1)})}})},EM=Object.freeze({create:Uq6});c6();var u38=X6(h38(),1),y38=X6(g6(),1);import N3 from"fs/promises";import o2 from"path";import{createWriteStream as qb6}from"fs";import Yb6 from"crypto";var _b6=($,{minInterval:K=80,minItems:q=10,now:Y=()=>Date.now()}={})=>{if(!$)return Object.freeze({report:()=>{},flush:()=>{}});let z=0,J=0,W=null;return Object.freeze({report:({phase:H,current:X,total:w,label:P})=>{let G=Y();if(X===0||X===w||G-z>=K||X-J>=q)return $({phase:H,current:X,total:w,label:P}),z=G,J=X,W=null,new Promise((T)=>setImmediate(T));else W={phase:H,current:X,total:w,label:P}},flush:()=>{if(W!==null)return $(W),W=null,new Promise((H)=>setImmediate(H))}})},Ch=Object.freeze({create:_b6});var Wj={"auto-archive-delay":"Stories","job-config":"Jobs","resume-config":"Jobs","disposal-config":"Deleted Items"},Zj=[...new Set(Object.values(Wj))];var A9=y38.default("caw:export"),I38=".caw-exports",x38=".tmp",zb6=6,g38=($)=>$==="B"?"shared":"project",Jb6=($,K)=>{if(!$)return $;try{let q=JSON.parse($),Y=q?.visibility?.story;if(!Y||typeof Y!=="object")return $;let z=!1,J={};for(let[W,Z]of Object.entries(Y))if(K.has(W))J[JSON.stringify(K.get(W))]=Z,z=!0;else J[W]=Z;if(!z)return $;return q.visibility.story=J,JSON.stringify(q)}catch{return $}},Wb6=({store:$,folderService:K,documentService:q,templateService:Y,storyService:z,trackService:J,settingService:W,assetService:Z,assetsDir:O})=>{let H=()=>{let I=new Date,C=I.getFullYear(),k=String(I.getMonth()+1).padStart(2,"0"),R=String(I.getDate()).padStart(2,"0"),u=String(I.getHours()).padStart(2,"0"),g=String(I.getMinutes()).padStart(2,"0"),s=String(I.getSeconds()).padStart(2,"0");return`${C}-${k}-${R}-${u}${g}${s}`},X=async(I,C)=>{let k=C||(I?o2.join(I,I38):null);if(!k)throw h.validation("Either exportPath or projectPath must be provided","EXPORT_PATH_REQUIRED");let R=o2.join(k,x38);try{return await N3.mkdir(k,{recursive:!0}),await N3.mkdir(R,{recursive:!0}),k}catch(u){if(u.code==="EACCES")throw h.validation("Permission denied creating export directory","EXPORT_ERROR");if(u.code==="ENOSPC")throw h.validation("Insufficient disk space","EXPORT_ERROR");throw A9("Error creating export directory: [%s] %s",u.code||"UNKNOWN",u.message),h.validation(`Failed to create export directory: ${u.message} (${u.code||"UNKNOWN"})`,"EXPORT_ERROR")}},w=async(I,C,k,R)=>{let u=[],g=[],s=async(J1,Y1)=>{let E1=await K.listFolderContents(I,C,{folderId:J1,type:k,storeCode:R,includeDeleted:!0});for(let w1 of E1)if(w1.getParentId()!==null){if(w1.getName()==="Tracks")continue;let j1={entity:w1,depth:Y1,contentType:k};if(w1.getDeletedAt()!==null)g.push(j1);else u.push(j1);await s(w1.getObjectId(),Y1+1)}};return await s(null,0),{toExport:u,deletedItems:g}},P=async(I,C,k)=>{let R=[],u=[],g=[],s=async(J1)=>{let Y1=await q.listDocuments(I,C,{parentId:J1,storeCode:k,includeDeleted:!0});for(let w1 of Y1){if(w1.getSubtype?.()==="track")continue;let A1=w1.getPublishedVersionNumber();if(A1===null)g.push(w1);else if(w1.getDeletedAt()!==null)u.push({entity:w1,version:{content:w1.getPublishedContent()}});else{let p1=await q.readVersion(I,C,{id:w1.getObjectId(),versionNumber:A1});R.push({entity:w1,version:p1})}}let E1=await K.listFolderContents(I,C,{folderId:J1,type:"d",storeCode:k,includeDeleted:!0});for(let w1 of E1){if(w1.getName()==="Tracks")continue;await s(w1.getObjectId())}};return await s(null),{toExport:R,deletedItems:u,draftOnly:g}},G=async(I,C,k)=>{let R=[],u=[],g=[],s=async(J1)=>{let Y1=await q.listDocuments(I,C,{parentId:J1,storeCode:k,type:"t",includeDeleted:!0});for(let w1 of Y1){let j1=w1.getPublishedVersionNumber();if(j1===null)g.push(w1);else if(w1.getDeletedAt()!==null)u.push({entity:w1,version:{content:w1.getPublishedContent()}});else{let A1=await q.readVersion(I,C,{id:w1.getObjectId(),versionNumber:j1});R.push({entity:w1,version:A1})}}let E1=await K.listFolderContents(I,C,{folderId:J1,type:"t",storeCode:k,includeDeleted:!0});for(let w1 of E1)await s(w1.getObjectId())};return await s(null),{toExport:R,deletedItems:u,draftOnly:g}},T=async(I,C,k)=>{let R=await Z.listAssets(I,C,{store:k}),u=[];for(let g of R){let s=g.hash,J1=s.substring(0,2),Y1=o2.join(O,J1,s);try{let E1=await N3.readFile(Y1);u.push({entity:g,buffer:E1})}catch(E1){if(E1.code==="ENOENT"){A9("Warning: Skipping asset %s - blob file missing",g.id);continue}throw E1}}return A9("Collected %d assets for export",u.length),u},v=new Set(["draft_version","latest_published_version"]),M=(I)=>{let C=typeof I.getFields==="function"?I.getFields():I.fields;if(!C||typeof C!=="object"||Object.keys(C).length===0)return;let k={};for(let[R,u]of Object.entries(C)){if(v.has(R))continue;if(EA(R)||typeof u?.getDefinition==="function"&&u.getDefinition().getIsVirtual())continue;let g;if(typeof u?.getValues==="function")g=u.getValues();else if(Array.isArray(u))g=u;else g=[u];k[R]=g.length===1?g[0]:g}return Object.keys(k).length>0?k:void 0},V=async(I,C,k)=>{let R=[],u=[],g={toExport:[],deletedItems:[]},s={toExport:[],deletedItems:[],draftOnly:[]};if(!z)return A9("StoryService not available, skipping story export"),{stories:{toExport:R,deletedItems:u},folders:g,documents:s};let J1=await z.listStories(I,C,{store:k,includeDeleted:!0});A9("Found %d stories for export",J1.length);for(let Y1 of J1){if(Y1.getDeletedAt()!==null)u.push(Y1);else R.push(Y1);await D(I,C,Y1,k,g.toExport,g.deletedItems,s)}return{stories:{toExport:R,deletedItems:u},folders:g,documents:s}},D=async(I,C,k,R,u,g,s)=>{let J1=k.id||k.getObjectId?.()||k,Y1=await $.listFolderContents(I,C,{folderId:J1,type:"s",storeCode:R,includeDeleted:!0});for(let w1 of Y1){if(w1.getParentId()!==null){let j1={entity:w1,contentType:"s"};if(w1.getDeletedAt()!==null)g.push(j1);else u.push(j1)}await D(I,C,w1.getObjectId(),R,u,g,s)}let E1=await q.listDocuments(I,C,{parentId:J1,storeCode:R,includeDeleted:!0});for(let w1 of E1){let j1=w1.getPublishedVersionNumber();if(j1===null)s.draftOnly.push(w1);else if(w1.getDeletedAt()!==null)s.deletedItems.push({entity:w1,version:{content:w1.getPublishedContent()}});else{let A1=await q.readVersion(I,C,{id:w1.getObjectId(),versionNumber:j1});s.toExport.push({entity:w1,version:A1})}}},N=async(I,C,k)=>{let R=[],u=[],g={toExport:[],deletedItems:[],draftOnly:[]};if(!await $.readJobRootFolder(I,C,{storeCode:k}))return A9("Job root folder not found, skipping job export"),{jobs:{toExport:R,deletedItems:u},documents:g};let{jobs:J1}=await $.listJobs(I,C,{storeCode:k,sortBy:"startedAt",sortDir:"desc",limit:1e4,offset:0,includeDeleted:!0}),Y1=J1.map(({entity:E1})=>E1);A9("Found %d jobs for export",Y1.length);for(let E1 of Y1){if(E1.getDeletedAt()!==null)u.push(E1);else R.push(E1);let w1=E1.getObjectId(),j1=await q.listDocuments(I,C,{parentId:w1,storeCode:k,includeDeleted:!0});for(let A1 of j1){let p1=A1.getPublishedVersionNumber();if(p1===null)g.draftOnly.push(A1);else if(A1.getDeletedAt()!==null)g.deletedItems.push({entity:A1,version:{content:A1.getPublishedContent()}});else{let n1=await q.readVersion(I,C,{id:A1.getObjectId(),versionNumber:p1});g.toExport.push({entity:A1,version:n1})}}}return{jobs:{toExport:R,deletedItems:u},documents:g}},E=async(I)=>{try{await N3.rm(I,{recursive:!0,force:!0})}catch(C){A9("Warning: Failed to cleanup temp directory: %s",C.message)}};return Object.freeze({listExports:async(I,C,{projectPath:k,exportPath:R})=>{let u=R||(k?o2.join(k,I38):null);if(!u)throw h.validation("Either exportPath or projectPath must be provided","EXPORT_PATH_REQUIRED");try{let g=await N3.readdir(u),s=[];for(let J1 of g)if(J1.endsWith(".zip")){let Y1=o2.join(u,J1),E1=await N3.stat(Y1);s.push({filename:J1,timestamp:E1.mtime.toISOString(),size:E1.size})}return A9("Found %d export files",s.length),s}catch(g){if(g.code==="ENOENT")return[];throw g}},exportPreview:async(I,C,{storeCode:k})=>{let R=await w(I,C,"d",k),u=await w(I,C,"t",k),{toExport:g,deletedItems:s,draftOnly:J1}=await P(I,C,k),{toExport:Y1,deletedItems:E1,draftOnly:w1}=await G(I,C,k),j1=Z?await Z.listAssets(I,C,{store:k}):[],{stories:A1,folders:p1,documents:n1}=await V(I,C,k),{jobs:Y8,documents:R8}=await N(I,C,k),v8=k==="A"?"all":k,k8=J?await J.listTracks(I,C,{store:v8}):[],h8=[];if(W){let G1=await $.readSettingsRootFolder(I,C,{storeCode:k});if(G1)for(let s1 of Zj){let L1=await $.findFolderByName(I,C,G1.getObjectId(),s1);if(L1){let J8=await W.listSettings(I,C,{parentId:L1.getObjectId(),store:k});h8=h8.concat(J8)}}}let g8=[...R.toExport,...u.toExport,...p1.toExport],L8=[...R.deletedItems,...u.deletedItems,...p1.deletedItems],V8={assets:j1.map((G1)=>({id:G1.id,originalFilename:G1.originalFilename,mimeType:G1.mimeType,sizeBytes:G1.sizeBytes})),folders:g8.map((G1)=>({id:G1.entity.getObjectId(),path:G1.entity.getPath(),name:G1.entity.getName()})),documents:g.map((G1)=>({id:G1.entity.getObjectId(),path:G1.entity.getPath(),name:G1.entity.getName()})),templates:Y1.map((G1)=>({id:G1.entity.getObjectId(),path:G1.entity.getPath(),name:G1.entity.getName()})),stories:A1.toExport.map((G1)=>({id:G1.getObjectId(),path:G1.getPath(),name:G1.getName()})),storyFolders:p1.toExport.map((G1)=>({id:G1.entity.getObjectId(),path:G1.entity.getPath(),name:G1.entity.getName()})),storyDocuments:n1.toExport.map((G1)=>({id:G1.entity.getObjectId(),path:G1.entity.getPath(),name:G1.entity.getName()})),jobs:Y8.toExport.map((G1)=>({id:G1.getObjectId(),path:G1.getPath(),name:G1.getName()})),jobDocuments:R8.toExport.map((G1)=>({id:G1.entity.getObjectId(),path:G1.entity.getPath(),name:G1.entity.getName()})),tracks:k8.map((G1)=>({id:G1.id,path:G1.path,name:G1.name})),settings:h8.map((G1)=>({id:G1.id,path:G1.path,name:G1.name}))},a={documents:J1.map((G1)=>({id:G1.getObjectId(),path:G1.getPath(),name:G1.getName()})),templates:w1.map((G1)=>({id:G1.getObjectId(),path:G1.getPath(),name:G1.getName()})),storyDocuments:n1.draftOnly.map((G1)=>({id:G1.getObjectId(),path:G1.getPath(),name:G1.getName()})),jobDocuments:R8.draftOnly.map((G1)=>({id:G1.getObjectId(),path:G1.getPath(),name:G1.getName()}))},z1={folders:L8.map((G1)=>({id:G1.entity.getObjectId(),path:G1.entity.getPath(),name:G1.entity.getName()})),documents:s.map((G1)=>({id:G1.entity.getObjectId(),path:G1.entity.getPath(),name:G1.entity.getName()})),templates:E1.map((G1)=>({id:G1.entity.getObjectId(),path:G1.entity.getPath(),name:G1.entity.getName()})),stories:A1.deletedItems.map((G1)=>({id:G1.getObjectId(),path:G1.getPath(),name:G1.getName()})),storyFolders:p1.deletedItems.map((G1)=>({id:G1.entity.getObjectId(),path:G1.entity.getPath(),name:G1.entity.getName()})),storyDocuments:n1.deletedItems.map((G1)=>({id:G1.entity.getObjectId(),path:G1.entity.getPath(),name:G1.entity.getName()})),jobs:Y8.deletedItems.map((G1)=>({id:G1.getObjectId(),path:G1.getPath(),name:G1.getName()})),jobDocuments:R8.deletedItems.map((G1)=>({id:G1.entity.getObjectId(),path:G1.entity.getPath(),name:G1.entity.getName()}))},T1=V8.assets.length+V8.folders.length+V8.documents.length+V8.templates.length+V8.stories.length+V8.storyFolders.length+V8.storyDocuments.length+V8.jobs.length+V8.jobDocuments.length+V8.tracks.length,R1=a.documents.length+a.templates.length+a.storyDocuments.length+a.jobDocuments.length,N1=z1.folders.length+z1.documents.length+z1.templates.length+z1.stories.length+z1.storyFolders.length+z1.storyDocuments.length+z1.jobs.length+z1.jobDocuments.length;return A9("Preview: %d published (%d assets, %d stories, %d jobs, %d tracks), %d draft-only, %d deleted",T1,V8.assets.length,V8.stories.length,V8.jobs.length,V8.tracks.length,R1,N1),{toExport:V8,draftOnly:a,deletedItems:z1}},exportDocuments:async(I,C,{storeCode:k,projectPath:R,exportPath:u,onProgress:g})=>{A9("Starting export for store %s",k);let s=await X(R,u),J1=Yb6.randomUUID(),Y1=o2.join(s,x38,J1);await N3.mkdir(Y1,{recursive:!0});try{let E1=await w(I,C,"d",k),w1=await w(I,C,"t",k),{toExport:j1,deletedItems:A1,draftOnly:p1}=await P(I,C,k),{toExport:n1,deletedItems:Y8,draftOnly:R8}=await G(I,C,k),v8=Z?await T(I,C,k):[],{stories:k8,folders:h8,documents:g8}=await V(I,C,k),{jobs:L8,documents:V8}=await N(I,C,k),a=k==="A"?"all":k,z1=J?await J.listTracks(I,C,{store:a}):[];A9("Found %d tracks for export (%s stores)",z1.length,a);let T1=new Map(z1.map((_1)=>[_1.id,{name:_1.name,scope:g38(_1.storeCode)}])),R1=[];if(W){let _1=await $.readSettingsRootFolder(I,C,{storeCode:k});if(_1)for(let f1 of Zj){let y1=await $.findFolderByName(I,C,_1.getObjectId(),f1);if(y1){let T8=await W.listSettings(I,C,{parentId:y1.getObjectId(),store:k});R1=R1.concat(T8)}}}A9("Found %d settings for export",R1.length);let N1=[...E1.toExport,...w1.toExport,...h8.toExport],G1=[...E1.deletedItems,...w1.deletedItems,...h8.deletedItems],s1=[...j1,...g8.toExport,...V8.toExport],L1=[...A1,...g8.deletedItems,...V8.deletedItems],J8=[...p1,...g8.draftOnly,...V8.draftOnly],b1=k8.toExport,M8=k8.deletedItems,Q1=L8.toExport,q8=L8.deletedItems,P8=Y8,H8=G1.length+L1.length+P8.length+M8.length+q8.length;A9("Collected %d soft-deleted entities for export",H8),A9("Found %d folders, %d documents, %d templates, %d assets, %d stories, %d jobs, %d tracks, %d settings (%d deleted)",N1.length,s1.length,n1.length,v8.length,b1.length,Q1.length,z1.length,R1.length,H8);let Z8={},z8=await $.readStoryRootFolder(I,C,{storeCode:k});if(z8){let _1=z8.toJSON(),f1=M(_1);if(f1&&Object.keys(f1).length>0)Z8[z8.getObjectId()]={subtype:"root_s",fields:f1}}let j8=(_1)=>{let f1={id:_1.getObjectId(),type:"story",name:_1.getName()},y1=_1.getDeletedAt();if(y1!==null)f1.deleted_at=y1;let T8=M(_1);if(T8?.track&&T1.has(T8.track))T8.track=T1.get(T8.track);if(T8)f1.fields=T8;return f1},C8=(_1)=>{let f1={id:_1.getObjectId(),type:"job",name:_1.getName()},y1=_1.getDeletedAt();if(y1!==null)f1.deleted_at=y1;let T8=M(_1);if(T8)f1.fields=T8;return f1},P6=(_1)=>{let f1={id:_1.entity.getObjectId(),type:"folder",path:_1.entity.getPath(),contentType:_1.contentType},y1=_1.entity.getDeletedAt();if(y1!==null)f1.deleted_at=y1;let T8=_1.entity.getSubtype?.();if(T8)f1.subtype=T8;let b8=M(_1.entity);if(b8)f1.fields=b8;return f1},S8=(_1)=>{let f1={id:_1.entity.getObjectId(),type:"document",path:_1.entity.getPath()},y1=_1.entity.getDeletedAt();if(y1!==null)f1.deleted_at=y1;let T8=_1.entity.getSubtype?.();if(T8)f1.subtype=T8;else{let s8=_1.entity.getPath(),d8=s8.split("/");if(d8.length>=4&&d8[2]==="tasks")A9('WARN: Document %s in tasks folder missing subtype, inferring "task"',s8),f1.subtype="task"}let b8=M(_1.entity);if(b8)f1.fields=b8;return f1},M6=(_1)=>{let f1={id:_1.entity.getObjectId(),type:"template",path:_1.entity.getPath()},y1=_1.entity.getDeletedAt();if(y1!==null)f1.deleted_at=y1;let T8=_1.entity.getSubtype?.();if(T8)f1.subtype=T8;let b8=M(_1.entity);if(b8?.config)b8.config=Jb6(b8.config,T1);if(b8)f1.fields=b8;return f1},Y6=[...v8.map((_1)=>({id:_1.entity.id,type:"asset",hash:_1.entity.hash,mimeType:_1.entity.mimeType,sizeBytes:_1.entity.sizeBytes,originalFilename:_1.entity.originalFilename,widthPx:_1.entity.widthPx,heightPx:_1.entity.heightPx,displayWidth:_1.entity.displayWidth,displayHeight:_1.entity.displayHeight})),...b1.map(j8),...M8.map(j8),...Q1.map(C8),...q8.map(C8),...N1.map(P6),...G1.map(P6),...s1.map(S8),...L1.map(S8),...n1.map(M6),...P8.map(M6)],$4={version:zb6,exportedAt:new Date().toISOString(),tracks:z1.map((_1)=>({name:_1.name,scope:g38(_1.storeCode),states:_1.states})),settings:R1.map((_1)=>{let f1={id:_1.id,name:_1.name,subtype:_1.subtype},y1=M(_1);if(y1)f1.fields=y1;return f1}),entities:Y6};if(Object.keys(Z8).length>0)$4.rootFolderFields=Z8;await N3.writeFile(o2.join(Y1,"manifest.json"),JSON.stringify($4,null,2),"utf-8");let U6=Ch.create(g),w2=N1.length;await U6.report({phase:"folders",current:0,total:w2,label:"Exporting folders"});let e1=0;for(let _1 of N1){if(_1.entity.getParentId()!==null){let f1=o2.join(Y1,_1.entity.getPath());await N3.mkdir(f1,{recursive:!0})}await U6.report({phase:"folders",current:++e1,total:w2,label:"Exporting folders"})}await U6.flush(),await N3.mkdir(o2.join(Y1,"Documents"),{recursive:!0}),await N3.mkdir(o2.join(Y1,"Templates"),{recursive:!0}),await N3.mkdir(o2.join(Y1,"Stories"),{recursive:!0}),await N3.mkdir(o2.join(Y1,"Jobs"),{recursive:!0});let U1=s1.length;await U6.report({phase:"documents",current:0,total:U1,label:"Exporting documents"});let I1=0;for(let _1 of s1){let f1=o2.join(Y1,_1.entity.getPath()),y1=_1.version.content;await N3.mkdir(o2.dirname(f1),{recursive:!0}),await N3.writeFile(f1,y1,"utf-8"),await U6.report({phase:"documents",current:++I1,total:U1,label:"Exporting documents"})}await U6.flush();let X8=n1.length;await U6.report({phase:"templates",current:0,total:X8,label:"Exporting templates"});let W8=0;for(let _1 of n1){let f1=o2.join(Y1,_1.entity.getPath()),y1=_1.version.content;await N3.mkdir(o2.dirname(f1),{recursive:!0}),await N3.writeFile(f1,y1,"utf-8"),await U6.report({phase:"templates",current:++W8,total:X8,label:"Exporting templates"})}if(await U6.flush(),L1.length>0||P8.length>0){let _1=o2.join(Y1,"__deleted__");await N3.mkdir(_1,{recursive:!0});for(let f1 of L1){let y1=f1.entity.getObjectId();await N3.writeFile(o2.join(_1,`${y1}.md`),f1.version.content,"utf-8")}for(let f1 of P8){let y1=f1.entity.getObjectId();await N3.writeFile(o2.join(_1,`${y1}.md`),f1.version.content,"utf-8")}}let e8=v8.length;if(await U6.report({phase:"assets",current:0,total:e8,label:"Exporting assets"}),v8.length>0){let _1=o2.join(Y1,"assets");await N3.mkdir(_1,{recursive:!0});let f1=0;for(let y1 of v8){let T8=y1.entity.id,b8=o2.join(_1,`${T8}.bin`);await N3.writeFile(b8,y1.buffer);let s8=o2.join(_1,`${T8}.json`);await N3.writeFile(s8,JSON.stringify({id:T8,hash:y1.entity.hash,mimeType:y1.entity.mimeType,sizeBytes:y1.entity.sizeBytes,originalFilename:y1.entity.originalFilename,widthPx:y1.entity.widthPx,heightPx:y1.entity.heightPx,displayWidth:y1.entity.displayWidth,displayHeight:y1.entity.displayHeight},null,2),"utf-8"),await U6.report({phase:"assets",current:++f1,total:e8,label:"Exporting assets"})}}await U6.flush();for(let _1 of Y6){if(_1.type==="folder"||_1.type==="story"||_1.type==="job")continue;let f1;if(_1.type==="asset")f1=o2.join(Y1,"assets",`${_1.id}.bin`);else if(_1.type==="document"||_1.type==="template")if(_1.deleted_at)f1=o2.join(Y1,"__deleted__",`${_1.id}.md`);else f1=o2.join(Y1,_1.path);else{A9("Unknown entity type in validation: %s",_1.type);continue}try{await N3.access(f1)}catch(y1){throw h.validation(`Manifest entry missing file: ${_1.id||_1.path}`,"EXPORT_VALIDATION_FAILED")}}await U6.report({phase:"zip",current:0,total:1,label:"Creating archive"});let O8=`caw-export-${H()}.zip`,N6=o2.join(s,O8),d1=qb6(N6),O1=u38.default("zip",{zlib:{level:9}});O1.on("error",async(_1)=>{throw await E(Y1),A9("Zip creation error: %s",_1.message),h.validation(`Export failed: ${_1.message}`,"EXPORT_ERROR")}),O1.pipe(d1),O1.directory(Y1,!1),await O1.finalize(),await new Promise((_1,f1)=>{d1.on("close",_1),d1.on("error",f1),setTimeout(()=>{f1(Error("Zip creation timeout"))},60000)}),A9("Created zip: %s (%d bytes)",O8,O1.pointer()),await U6.report({phase:"zip",current:1,total:1,label:"Creating archive"}),await U6.flush(),await E(Y1);let k1=Y6.length;return A9("Export complete: %s (%d entities)",O8,k1),{success:!0,filename:O8,path:N6,counts:{assets:v8.length,stories:b1.length,jobs:Q1.length,folders:N1.length,documents:s1.length,templates:n1.length},draftOnlySkipped:{documents:J8.length,templates:R8.length}}}catch(E1){throw await E(Y1),E1}}})},ms=Object.freeze({create:Wb6});c6();var v98=X6(P98(),1),A98=X6(g6(),1);import kq from"fs/promises";import Q7 from"path";import ub6 from"crypto";var x6=A98.default("caw:import"),Qs=($)=>{if(!$||typeof $!=="string")throw Error(`Invalid export path: ${$}`);let K={Documents:"d",Templates:"t",Stories:"s",Jobs:"j"},q=$.indexOf("/");if(q===-1){let J=K[$];if(J)return{path:"",type:J};throw Error(`Invalid export path: ${$}`)}let Y=$.slice(0,q),z=K[Y];if(!z)throw Error(`Unknown root folder: ${Y}`);return{path:$.slice(q+1),type:z}},yb6=".caw-exports",T98=".tmp",bb6=[1,2,3,4,5,6],Bb6=/\b([A-Z][adtfnsje]\d+)\b/g,ls=($)=>{if(!$)return $;return $.replace(/(<include\s+(?:id="[^"]+"|path="[^"]+"))\s+version="\d+"(\s*\/>)/g,(K,q,Y)=>`${q} version="1"${Y}`)},mb6=($,K)=>{if(!$)return $;try{let q=JSON.parse($),Y=q?.visibility?.story;if(!Y||typeof Y!=="object")return $;let z=!1,J={};for(let[W,Z]of Object.entries(Y))if(W.startsWith("{"))try{let O=JSON.parse(W),H=`${O.scope}:${O.name}`,X=K.get(H);if(X)J[X]=Z,z=!0;else J[W]=Z}catch{J[W]=Z}else if(/^[A-Z][a-z]\d+$/.test(W))J[W]=Z;else{let O=`project:${W}`,H=K.get(O);if(H)J[H]=Z,z=!0;else J[W]=Z}if(!z)return $;return q.visibility.story=J,JSON.stringify(q)}catch{return $}},Ub6=({store:$,folderService:K,documentService:q,templateService:Y,storyService:z,trackService:J,fieldService:W,assetService:Z,assetsDir:O})=>{let H=(V,D)=>{if(!V)return V;return V.replace(Bb6,(N,E)=>{return D[E]??N})},X=(V)=>{if(!Array.isArray(V))return!1;if(V.length!==$X.length)return!0;return!V.every((D,N)=>D===$X[N])},w=async(V,D,N,E,x,b,{includeDeleted:S=!1}={})=>{if(!E||typeof E!=="object"||!W)return;for(let[I,C]of Object.entries(E)){if(I==="activeJobCount"){await W.setFieldValue(V,D,{entityId:N,fieldName:I,value:"0",bypassEditableCheck:!0,includeDeleted:S},b);continue}let R=(await W.resolveFieldDefinitionForEntity(V,D,{entityId:N,fieldName:I,includeDeleted:S}))?.getPrimitiveType(),u=C;if(R==="object_ref")if(Array.isArray(C))u=C.map((g)=>x[g]??g);else u=x[C]??C;else if(R==="string"||R==="text")if(Array.isArray(C))u=C.map((g)=>H(g,x));else u=H(C,x);try{if(Array.isArray(u))await W.setFieldValue(V,D,{entityId:N,fieldName:I,values:u,bypassEditableCheck:!0,includeDeleted:S},b);else await W.setFieldValue(V,D,{entityId:N,fieldName:I,value:u,bypassEditableCheck:!0,includeDeleted:S},b)}catch(g){if(g.code==="INVALID_REFERENCE"){x6("Skipping dangling object_ref %s=%s for entity %s",I,u,N);continue}throw g}}},P=async(V)=>{try{await kq.rm(V,{recursive:!0,force:!0})}catch(D){x6("Warning: Failed to cleanup temp directory: %s",D.message)}},G=async(V,D,{storeCode:N})=>{let E=await K.listFolderContents(V,D,{folderId:null,type:"d",storeCode:N}),x=await K.listFolderContents(V,D,{folderId:null,type:"t",storeCode:N}),b=E.filter((R)=>R.getName()!=="Tracks"),I=(await q.listDocuments(V,D,{parentId:null,storeCode:N,type:"d"})).filter((R)=>{return(typeof R.getSubtype==="function"?R.getSubtype():null)!=="track"}),C=await q.listDocuments(V,D,{parentId:null,storeCode:N,type:"t"}),k=b.length===0&&x.length===0&&I.length===0&&C.length===0;return x6("Store %s empty check: %s",N,k),k},T=async(V,D,{tempPath:N,storeCode:E,idMapping:x,enqueuePostCommitHook:b,throttle:S})=>{let I=Q7.join(N,"assets"),C;try{C=await kq.readdir(I)}catch(g){if(g.code==="ENOENT")return x6("No assets directory in export"),await S.report({phase:"assets",current:0,total:0,label:"Importing assets"}),await S.flush(),0;throw g}let k=C.filter((g)=>g.endsWith(".json"));if(x6("Found %d assets to import",k.length),!Z||!O){if(k.length>0)throw h.validation("Export contains assets but asset service is not configured","ASSET_SERVICE_MISSING");return await S.report({phase:"assets",current:0,total:0,label:"Importing assets"}),await S.flush(),0}let R=k.length;await S.report({phase:"assets",current:0,total:R,label:"Importing assets"});let u=0;for(let g of k){let s=Q7.join(I,g),J1=await kq.readFile(s,"utf-8"),Y1=JSON.parse(J1),E1=g.replace(".json",".bin"),w1=Q7.join(I,E1),j1=await kq.readFile(w1),A1=await Z.createAsset(V,D,{store:E,buffer:j1,mimeType:Y1.mimeType,originalFilename:Y1.originalFilename,widthPx:Y1.widthPx,heightPx:Y1.heightPx,displayWidth:Y1.displayWidth,displayHeight:Y1.displayHeight},b);x[Y1.id]=A1.id,u++,await S.report({phase:"assets",current:u,total:R,label:"Importing assets"})}return await S.flush(),x6("Imported %d assets",u),u},v=async(V,D,{manifest:N,tempPath:E,storeCode:x,onProgress:b})=>{x6("Starting transaction...");let S=Ch.create(b);return await V.transaction().execute(async(I)=>{let C={},k=new Set,R=(O1)=>{let k1=O1.indexOf(":");if(k1!==-1)k.add(O1.slice(k1+1))},u=await T(I,D,{tempPath:E,storeCode:x,idMapping:C,enqueuePostCommitHook:R,throttle:S});if(x6("Phase 0 complete - imported %d assets",u),N.rootFolderFields&&W){x6("Phase 0.25: Restoring root folder fields");for(let[O1,k1]of Object.entries(N.rootFolderFields)){let _1;if(k1.subtype==="root_s")_1=await $.readStoryRootFolder(I,D,{storeCode:x});if(_1&&k1.fields){for(let[f1,y1]of Object.entries(k1.fields)){if(f1==="states"){x6("Phase 0.25: Skipping states field (vestigial)");continue}if(Array.isArray(y1))await W.setFieldValue(I,D,{entityId:_1.getObjectId(),fieldName:f1,values:y1,bypassEditableCheck:!0},R);else await W.setFieldValue(I,D,{entityId:_1.getObjectId(),fieldName:f1,value:y1,bypassEditableCheck:!0},R)}x6("Restored fields for root folder %s (%s)",_1.getObjectId(),k1.subtype)}}x6("Phase 0.25 complete - restored root folder fields")}if(N.version===2&&N.rootFolderFields&&J){x6("Phase 0.3: Migrating legacy rootFolderFields states to Default track");for(let[,O1]of Object.entries(N.rootFolderFields))if(O1.subtype==="root_s"&&O1.fields?.states){let k1=await J.getTrackByName(I,D,{store:x,name:"Default"});if(k1)await J.updateTrack(I,D,{id:k1.getObjectId(),states:O1.fields.states},R),x6("Phase 0.3: Updated Default track states from rootFolderFields")}x6("Phase 0.3 complete")}let g=0,s=0,J1=N.tracks,Y1=J1&&J1.length>0&&J?J1.length:0;if(await S.report({phase:"tracks",current:0,total:Y1,label:"Importing tracks"}),J1&&J1.length>0&&J){x6("Phase 0.4: Creating %d tracks",J1.length);let O1=0;for(let k1 of J1){let f1=(k1.scope||"project")==="shared"?"B":x,y1=await J.getTrackByName(I,D,{store:f1,name:k1.name});if(!y1)await J.createTrack(I,D,{store:f1,name:k1.name,states:k1.states},R),g++;else await J.updateTrack(I,D,{id:y1.getObjectId(),states:k1.states},R),s++;await S.report({phase:"tracks",current:++O1,total:Y1,label:"Importing tracks"})}x6("Phase 0.4 complete - created %d tracks, updated %d tracks",g,s)}await S.flush();let E1=new Map,w1=new Map;if(J){let O1=x==="A"?"all":x,k1=await J.listTracks(I,D,{store:O1});for(let _1 of k1){let f1=_1.storeCode==="B"?"shared":"project";if(E1.set(`${f1}:${_1.name}`,_1.id),_1.storeCode===x)w1.set(_1.name,_1.id)}}let j1=[],A1=0,p1=0,n1=N.settings,Y8=n1&&n1.length>0?n1.length:0;if(await S.report({phase:"settings",current:0,total:Y8,label:"Importing settings"}),n1&&n1.length>0){x6("Phase 0.45: Importing %d settings",n1.length);let O1=await $.readSettingsRootFolder(I,D,{storeCode:x});if(!O1)x6("Phase 0.45: Settings root folder not found, skipping settings import");else{let k1=O1.getObjectId(),_1={};for(let y1 of Zj){let T8=await $.findFolderByName(I,D,k1,y1);if(!T8)T8=await $.createFolder(I,D,{storeCode:x,parentId:k1,name:y1},R);_1[y1]=T8.getObjectId()}let f1=0;for(let y1 of n1){let T8=Wj[y1.name];if(!T8)throw Error(`Phase 0.45: No domain mapping for setting "${y1.name}" — cannot import`);let b8=_1[T8],s8=await $.findSettingByName(I,D,b8,y1.name),d8;if(s8)d8=s8.entity.getObjectId(),p1++;else{let{entity:T6}=await $.createSetting(I,D,{storeCode:x,parentId:b8,name:y1.name,subtype:y1.subtype},R);d8=T6.getObjectId(),A1++}if(C[y1.id]=d8,y1.fields){let T6={},S1={};for(let[x1,X1]of Object.entries(y1.fields))if((await W.resolveFieldDefinitionForEntity(I,D,{entityId:d8,fieldName:x1}))?.getPrimitiveType()==="object_ref")S1[x1]=X1;else T6[x1]=X1;await w(I,D,d8,T6,C,R),j1.push({entityId:d8,fields:S1})}await S.report({phase:"settings",current:++f1,total:Y8,label:"Importing settings"})}x6("Phase 0.45 complete - created %d settings, updated %d settings",A1,p1)}}await S.flush();let R8=N.entities.filter((O1)=>O1.type==="story"&&!O1.deleted_at),v8=0,k8={},h8=[],g8=R8.length>0&&z?R8.length:0;if(await S.report({phase:"stories",current:0,total:g8,label:"Importing stories"}),R8.length>0&&z){x6("Phase 0.5: Creating %d stories",R8.length);let O1=N.entities.filter((k1)=>k1.type==="folder"&&k1.subtype==="tasks"&&!k1.deleted_at);for(let k1 of O1){let _1=k1.path.split("/");if(_1.length>=3&&_1[0]==="Stories"){let f1=_1[1];k8[f1]=k1.id}}for(let k1 of R8){let _1=k1.fields?.state||"waiting",f1=k1.fields?.track,y1;if(f1&&typeof f1==="object"&&f1.name&&f1.scope)y1=E1.get(`${f1.scope}:${f1.name}`)??`${f1.scope}:${f1.name}`;else{let S1=f1||"Default";y1=w1.get(S1)??S1}let T8=k1.fields?.phase||"active",b8=k1.fields?.ranking,{story:s8,tasksFolder:d8}=await z.createStory(I,D,{store:x,name:k1.name,state:_1,track:y1,phase:T8,ranking:b8},R);if(C[k1.id]=s8.getObjectId(),k1.fields&&N.version>=2){let{state:S1,track:x1,phase:X1,ranking:$8,...M1}=k1.fields;if(Object.keys(M1).length>0)h8.push({entityId:s8.getObjectId(),fields:M1})}let T6=k8[k1.name];if(T6&&d8){C[T6]=d8.getObjectId();let S1=N.entities.find((x1)=>x1.id===T6);if(S1?.fields?.states){let x1=S1.fields.states;if(X(Array.isArray(x1)?x1:[x1]))await W.setFieldValue(I,D,{entityId:d8.getObjectId(),fieldName:"states",values:Array.isArray(x1)?x1:[x1],bypassEditableCheck:!0},R)}}v8++,await S.report({phase:"stories",current:v8,total:g8,label:"Importing stories"})}x6("Phase 0.5 complete - created %d active stories",v8)}let L8=N.entities.filter((O1)=>O1.type==="story"&&O1.deleted_at),V8=0;if(L8.length>0&&z){x6("Phase 0.5: Creating %d soft-deleted stories via store directly",L8.length);let O1=await $.readStoryRootFolder(I,D,{storeCode:x});U.factory(!O1,h.notFound,"Story root folder not found","STORY_ROOT_NOT_FOUND");for(let k1 of L8){let _1=k1.fields?.track,f1;if(_1&&typeof _1==="object"&&_1.name&&_1.scope)f1=E1.get(`${_1.scope}:${_1.name}`)??`${_1.scope}:${_1.name}`;else{let T8=_1||"Default";f1=w1.get(T8)??T8}let y1=await $.createStory(I,D,{storeCode:x,parentId:O1.getObjectId(),name:k1.name,deletedAt:k1.deleted_at},R);if(C[k1.id]=y1.getObjectId(),W)await W.setFieldValue(I,D,{entityId:y1.getObjectId(),fieldName:"track",value:f1,bypassEditableCheck:!0,includeDeleted:!0},R);if(k1.fields&&N.version>=2){let{track:T8,...b8}=k1.fields;if(Object.keys(b8).length>0)h8.push({entityId:y1.getObjectId(),fields:b8,includeDeleted:!0})}V8++}x6("Phase 0.5 complete - created %d soft-deleted stories",V8)}await S.flush();let a=N.entities.filter((O1)=>O1.type==="job"&&!O1.deleted_at),z1=N.entities.filter((O1)=>O1.type==="job"&&O1.deleted_at),T1=0,R1=a.length;await S.report({phase:"jobs",current:0,total:R1,label:"Importing jobs"});let N1=[];if(a.concat(z1).length>0){x6("Phase 0.6: Creating %d active + %d soft-deleted jobs (pass 1: entities)",a.length,z1.length);let O1=await $.readJobRootFolder(I,D,{storeCode:x});if(!O1)throw h.validation("Job root folder not found - cannot import jobs","JOB_ROOT_MISSING");let k1=O1.getObjectId();for(let f1 of a){let y1=await $.createJob(I,D,{storeCode:x,parentId:k1,name:f1.name},R);if(C[f1.id]=y1.getObjectId(),f1.fields&&N.version>=2)N1.push({jobId:y1.getObjectId(),fields:f1.fields,includeDeleted:!1});T1++,await S.report({phase:"jobs",current:T1,total:R1,label:"Importing jobs"})}let _1=0;for(let f1 of z1){let y1=await $.createJob(I,D,{storeCode:x,parentId:k1,name:f1.name,deletedAt:f1.deleted_at},R);if(C[f1.id]=y1.getObjectId(),f1.fields&&N.version>=2)N1.push({jobId:y1.getObjectId(),fields:f1.fields,includeDeleted:!0});_1++}x6("Phase 0.6 complete - created %d active jobs, %d soft-deleted jobs",T1,_1)}let s1=N1.length;if(await S.report({phase:"jobFields",current:0,total:s1,label:"Importing job fields"}),N1.length>0){x6("Phase 0.6: Importing job fields (pass 2: fields)");let O1=0;for(let{jobId:k1,fields:_1,includeDeleted:f1}of N1)await w(I,D,k1,_1,C,R,{includeDeleted:f1??!1}),await S.report({phase:"jobFields",current:++O1,total:s1,label:"Importing job fields"})}await S.flush();let L1=(O1)=>{if(O1.subtype!=="tasks")return!1;let k1=O1.path?.split("/");if(!k1||k1[0]!=="Stories"||k1.length<3)return!1;let _1=k1[1];return!N.entities.find((y1)=>y1.type==="story"&&y1.name===_1)?.deleted_at},J8=N.entities.filter((O1)=>O1.type==="folder"&&!L1(O1)&&!O1.path?.endsWith("/Tracks"));x6("Phase 1: Creating %d folders (excluding active-story tasks folders)",J8.length);let b1=N.entities.filter((O1)=>O1.type==="folder"&&L1(O1)).length,M8=0,Q1=0,q8=J8.length;await S.report({phase:"folders",current:0,total:q8,label:"Importing folders"});let P8=0;for(let O1 of J8){let{path:k1,type:_1}=Qs(O1.path);if(!k1){await S.report({phase:"folders",current:++P8,total:q8,label:"Importing folders"});continue}if(C[O1.id]){await S.report({phase:"folders",current:++P8,total:q8,label:"Importing folders"});continue}let f1;if(O1.deleted_at){let y1=k1.split("/"),T8=y1[y1.length-1],b8;if(_1==="s")if(y1.length===1){x6("Unexpected soft-deleted folder directly under Stories root: %s",k1),await S.report({phase:"folders",current:++P8,total:q8,label:"Importing folders"});continue}else if(y1.length===2){let s8=y1[0],d8=N.entities.find((T6)=>T6.type==="story"&&T6.name===s8);if(d8&&C[d8.id])b8=C[d8.id]}else{let s8=y1.slice(0,-1).join("/"),d8=N.entities.find((T6)=>T6.type==="folder"&&T6.path===`Stories/${s8}`);if(d8&&C[d8.id])b8=C[d8.id]}else if(y1.length===1)b8=(await $.readRootFolderForType(I,D,_1,x))?.getObjectId();else{let s8=y1.slice(0,-1).join("/"),d8=_1==="d"?"Documents":"Templates",T6=N.entities.find((S1)=>S1.type==="folder"&&S1.path===`${d8}/${s8}`);if(T6&&C[T6.id])b8=C[T6.id]}if(!b8){x6("Could not resolve parent for soft-deleted folder: %s",O1.path),await S.report({phase:"folders",current:++P8,total:q8,label:"Importing folders"});continue}f1=await $.createFolder(I,D,{storeCode:x,parentId:b8,name:T8,subtype:O1.subtype||void 0,deletedAt:O1.deleted_at},R)}else if(_1==="s"){let y1=k1.split("/"),T8=y1[y1.length-1],b8=y1.slice(0,-1).join("/"),s8;if(y1.length===1){x6("Unexpected folder directly under Stories root: %s",k1),await S.report({phase:"folders",current:++P8,total:q8,label:"Importing folders"});continue}else if(y1.length===2){let d8=y1[0],T6=N.entities.find((S1)=>S1.type==="story"&&S1.name===d8);if(T6&&C[T6.id])s8=C[T6.id]}else{let d8=N.entities.find((T6)=>T6.type==="folder"&&T6.path===`Stories/${b8}`);if(d8&&C[d8.id])s8=C[d8.id]}if(!s8){x6("Could not resolve parent for story folder: %s",O1.path),await S.report({phase:"folders",current:++P8,total:q8,label:"Importing folders"});continue}f1=await K.createFolder(I,D,{mode:"parentName",parentId:s8,name:T8,subtype:O1.subtype||void 0},R)}else f1=await K.createFolder(I,D,{store:x,path:k1,type:_1,subtype:O1.subtype||void 0},R);if(C[O1.id]=f1.getObjectId(),O1.fields&&N.version>=2)await w(I,D,f1.getObjectId(),O1.fields,C,R,{includeDeleted:!!O1.deleted_at});if(_1==="t")M8++;else if(_1==="s")b1++;else Q1++;await S.report({phase:"folders",current:++P8,total:q8,label:"Importing folders"})}await S.flush(),x6("Phase 1 complete - created %d folders (skipped root folders)",Q1);let H8=N.entities.filter((O1)=>O1.type==="document"&&O1.subtype!=="track"),Z8=[];x6("Phase 2: Reading %d documents (%d soft-deleted)",H8.length,H8.filter((O1)=>O1.deleted_at).length);for(let O1 of H8){let k1=O1.deleted_at?Q7.join(E,"__deleted__",`${O1.id}.md`):Q7.join(E,O1.path),_1=await kq.readFile(k1,"utf-8");Z8.push({oldId:O1.id,path:O1.path,content:_1,subtype:O1.subtype,fields:O1.fields,deletedAt:O1.deleted_at||null})}x6("Phase 2 complete - read %d documents",Z8.length),x6("Phase 3: Creating %d document entities",Z8.length);let z8=[],j8=0,C8=0,P6=0,S8=Z8.length;await S.report({phase:"documents",current:0,total:S8,label:"Importing documents"});let M6=0,Y6=0;for(let O1 of Z8){let{path:k1,type:_1}=Qs(O1.path);if(_1==="j"){let T8=k1.lastIndexOf("/"),b8=k1.slice(0,T8),s8=k1.slice(T8+1),d8=N.entities.find((S1)=>S1.type==="job"&&S1.name===b8);if(!d8||!C[d8.id])throw h.validation(`Cannot resolve parent job for document: ${O1.path}`,"IMPORT_RESOLUTION_FAILED");let T6=await $.createContent(I,D,{storeCode:x,type:"d",parentId:C[d8.id],name:s8,deletedAt:O1.deletedAt||void 0},R);C[O1.oldId]=T6.getObjectId(),z8.push({document:T6,originalContent:O1.content,fields:O1.fields,isJobDocument:!0,deletedAt:O1.deletedAt}),P6++,await S.report({phase:"documents",current:++M6,total:S8,label:"Importing documents"});continue}if(O1.deletedAt){let T8=k1.split("/"),b8=T8[T8.length-1],s8;if(_1==="s"){let S1=T8.slice(0,-1).join("/"),x1=N.entities.find((X1)=>X1.type==="folder"&&X1.path===`Stories/${S1}`);if(x1&&C[x1.id])s8=C[x1.id];else{let X1=T8[0],$8=N.entities.find((M1)=>M1.type==="story"&&M1.name===X1);if($8&&C[$8.id])s8=C[$8.id]}}else if(T8.length===1)s8=(await $.readRootFolderForType(I,D,"d",x))?.getObjectId();else{let S1=T8.slice(0,-1).join("/"),x1=N.entities.find((X1)=>X1.type==="folder"&&X1.path===`Documents/${S1}`);if(x1&&C[x1.id])s8=C[x1.id]}if(!s8)throw h.validation(`Cannot resolve parent for soft-deleted document: ${O1.path}`,"IMPORT_RESOLUTION_FAILED");let d8=O1.subtype||(_1==="s"&&T8.length>=3&&T8[1]==="tasks"?"task":void 0),T6=await $.createContent(I,D,{storeCode:x,type:"d",parentId:s8,name:b8,subtype:d8,deletedAt:O1.deletedAt},R);C[O1.oldId]=T6.getObjectId(),z8.push({document:T6,originalContent:O1.content,fields:O1.fields,deletedAt:O1.deletedAt}),Y6++,await S.report({phase:"documents",current:++M6,total:S8,label:"Importing documents"});continue}let f1;if(_1==="s"){let T8=k1.split("/"),b8=T8[0],s8=T8.slice(0,-1).join("/"),d8=T8[T8.length-1],T6=N.entities.find((x1)=>x1.type==="folder"&&x1.path===`Stories/${s8}`),S1;if(T6&&C[T6.id])S1=C[T6.id];else{let x1=N.entities.find((X1)=>X1.type==="story"&&X1.name===b8);if(x1&&C[x1.id])S1=C[x1.id]}if(!S1)throw h.validation(`Cannot resolve parent folder for story document: ${O1.path}`,"IMPORT_RESOLUTION_FAILED");f1={mode:"parentName",parentId:S1,name:d8}}else f1={store:x,path:k1,type:_1};if(O1.subtype)f1.subtype=O1.subtype;else if(_1==="s"){let T8=k1.split("/");if(T8.length>=3&&T8[1]==="tasks")x6('WARN: Document %s in tasks folder missing subtype, inferring "task"',O1.path),f1.subtype="task"}let y1=await q.createDocument(I,D,f1,R);if(C[O1.oldId]=y1.getObjectId(),z8.push({document:y1,originalContent:O1.content,fields:O1.fields}),_1==="s")C8++;else j8++;await S.report({phase:"documents",current:++M6,total:S8,label:"Importing documents"})}await S.flush(),x6("Phase 3 complete - created %d document entities (%d soft-deleted)",z8.length,Y6);let $4=N.entities.filter((O1)=>O1.type==="template"),U6=[];x6("Phase 4: Reading %d templates (%d soft-deleted)",$4.length,$4.filter((O1)=>O1.deleted_at).length);for(let O1 of $4){let k1=O1.deleted_at?Q7.join(E,"__deleted__",`${O1.id}.md`):Q7.join(E,O1.path),_1=await kq.readFile(k1,"utf-8");U6.push({oldId:O1.id,path:O1.path,content:_1,subtype:O1.subtype,fields:O1.fields,deletedAt:O1.deleted_at||null})}x6("Phase 4 complete - read %d templates",U6.length),x6("Phase 5: Creating %d template entities",U6.length);let w2=[],e1=0,U1=U6.length;await S.report({phase:"templates",current:0,total:U1,label:"Importing templates"});let I1=0;for(let O1 of U6){let{path:k1}=Qs(O1.path);if(O1.deletedAt){let _1=k1.split("/"),f1=_1[_1.length-1],y1;if(_1.length===1)y1=(await $.readRootFolderForType(I,D,"t",x))?.getObjectId();else{let b8=_1.slice(0,-1).join("/"),s8=N.entities.find((d8)=>d8.type==="folder"&&d8.path===`Templates/${b8}`);if(s8&&C[s8.id])y1=C[s8.id]}if(!y1)throw h.validation(`Cannot resolve parent for soft-deleted template: ${O1.path}`,"IMPORT_RESOLUTION_FAILED");let T8=await $.createContent(I,D,{storeCode:x,type:"t",parentId:y1,name:f1,subtype:O1.subtype||void 0,deletedAt:O1.deletedAt},R);C[O1.oldId]=T8.getObjectId(),w2.push({template:T8,originalContent:O1.content,fields:O1.fields,deletedAt:O1.deletedAt}),e1++}else{let _1={store:x,path:k1,type:"t"};if(O1.subtype)_1.subtype=O1.subtype;let f1=await q.createDocument(I,D,_1,R);C[O1.oldId]=f1.getObjectId(),w2.push({template:f1,originalContent:O1.content,fields:O1.fields})}await S.report({phase:"templates",current:++I1,total:U1,label:"Importing templates"})}await S.flush(),x6("Phase 5 complete - created %d template entities (%d soft-deleted)",w2.length,e1),x6("Phase 6: Remapping and saving content for %d documents",z8.length);let X8=z8.length;await S.report({phase:"publishDocs",current:0,total:X8,label:"Publishing documents"});let W8=0;for(let{document:O1,originalContent:k1,fields:_1,isJobDocument:f1,deletedAt:y1}of z8){let T8=ls(H(k1,C)),b8=O1.getObjectId();if(f1||y1)await $.saveDraft(I,D,{id:b8,content:T8,sessionId:"import-service",includeDeleted:!!y1},R),await $.publishContent(I,D,{id:b8,includeDeleted:!!y1},R);else await q.saveDraft(I,D,{id:b8,content:T8,sessionId:"import-service"},R),await q.publishDocument(I,D,{id:b8},R);if(_1&&N.version>=2)await w(I,D,b8,_1,C,R,{includeDeleted:!!y1});await S.report({phase:"publishDocs",current:++W8,total:X8,label:"Publishing documents"})}await S.flush(),x6("Phase 6 complete - saved and published %d documents",z8.length),x6("Phase 7: Remapping and saving content for %d templates",w2.length);let e8=w2.length;await S.report({phase:"publishTemplates",current:0,total:e8,label:"Publishing templates"});let O8=0;for(let{template:O1,originalContent:k1,fields:_1,deletedAt:f1}of w2){let y1=ls(H(k1,C)),T8=O1.getObjectId();if(f1)await $.saveDraft(I,D,{id:T8,content:y1,sessionId:"import-service",includeDeleted:!0},R),await $.publishContent(I,D,{id:T8,includeDeleted:!0},R);else await q.saveDraft(I,D,{id:T8,content:y1,sessionId:"import-service"},R),await q.publishDocument(I,D,{id:T8},R);if(_1&&N.version>=2){let b8={..._1};if(b8.config)b8.config=mb6(b8.config,E1);await w(I,D,T8,b8,C,R,{includeDeleted:!!f1})}await S.report({phase:"publishTemplates",current:++O8,total:e8,label:"Publishing templates"})}await S.flush(),x6("Phase 7 complete - saved and published %d templates",w2.length);let N6=h8.length;if(await S.report({phase:"storyFields",current:0,total:N6,label:"Importing story fields"}),h8.length>0){x6("Phase 8: Importing deferred fields for %d stories",h8.length);let O1=0;for(let{entityId:k1,fields:_1,includeDeleted:f1}of h8)await w(I,D,k1,_1,C,R,{includeDeleted:!!f1}),await S.report({phase:"storyFields",current:++O1,total:N6,label:"Importing story fields"});x6("Phase 8 complete - imported deferred story fields")}await S.flush();let d1=j1.length;if(await S.report({phase:"settingFields",current:0,total:d1,label:"Importing setting fields"}),j1.length>0){x6("Phase 9: Importing deferred object_ref fields for %d settings",j1.length);let O1=0;for(let{entityId:k1,fields:_1}of j1)await w(I,D,k1,_1,C,R),await S.report({phase:"settingFields",current:++O1,total:d1,label:"Importing setting fields"});x6("Phase 9 complete - imported deferred setting object_ref fields")}return await S.flush(),x6("Transaction committed successfully"),{success:!0,counts:{assets:u,tracksCreated:g,tracksUpdated:s,settingsCreated:A1,settingsUpdated:p1,stories:v8,jobs:T1,folders:Q1,templateFolders:M8,storyFolders:b1,documents:j8,storyDocuments:C8,jobDocuments:P6,templates:w2.length},remapped:C,dirtiedEntityIds:k}})};return Object.freeze({isStoreEmpty:G,importDocuments:async(V,D,{filename:N,storeCode:E,projectPath:x,exportPath:b,onProgress:S})=>{let I=b||(x?Q7.join(x,yb6):null);if(!I)throw h.validation("Either exportPath or projectPath must be provided","EXPORT_PATH_REQUIRED");x6("Starting import from %s to store %s",N,E);let C=Q7.join(I,N);try{await kq.access(C),x6("Zip file found: %s",C)}catch(s){throw h.notFound(`Export file not found: ${N}`,"EXPORT_NOT_FOUND")}x6("Validating zip and manifest...");let k=await G(V,D,{storeCode:E});if(!k)throw h.conflict("Store not empty - import requires empty store","STORE_NOT_EMPTY");x6("Store empty check: %s",k);let R=ub6.randomUUID(),u=Q7.join(I,T98,R),g=Q7.join(I,T98);await kq.mkdir(g,{recursive:!0});try{new v98.default(C).extractAllTo(u,!0),x6("Extracted zip to: %s",u)}catch(s){throw h.validation("Corrupted or invalid zip file","IMPORT_VALIDATION_FAILED")}try{let s=Q7.join(u,"manifest.json"),J1;try{let A1=await kq.readFile(s,"utf-8");J1=JSON.parse(A1)}catch(A1){throw h.validation(`Failed to read manifest: ${A1.message}`,"MANIFEST_READ_FAILED")}if(!bb6.includes(J1.version))throw h.validation(`Unsupported manifest version: ${J1.version}`,"UNSUPPORTED_VERSION");if(!J1.entities||!Array.isArray(J1.entities))throw h.validation("Invalid manifest structure","MANIFEST_READ_FAILED");x6("Manifest valid: version=%d, entities=%d",J1.version,J1.entities.length);for(let A1 of J1.entities){if(A1.type==="folder"||A1.type==="story"||A1.type==="job")continue;if(A1.deleted_at)continue;let p1;if(A1.type==="asset")p1=Q7.join(u,"assets",`${A1.id}.bin`);else if(A1.type==="document"||A1.type==="template")p1=Q7.join(u,A1.path);else{x6("Unknown entity type in import validation: %s",A1.type);continue}try{await kq.access(p1)}catch(n1){throw h.validation(`Missing file for manifest entry: ${A1.path||A1.id}`,"IMPORT_VALIDATION_FAILED")}}x6("All content files validated");let Y1=await v(V,D,{manifest:J1,tempPath:u,storeCode:E,onProgress:S});if($.clearListCaches)$.clearListCaches();let E1=Object.values(Y1.remapped),w1=[...new Set([...E1,...Y1.dirtiedEntityIds])];$.evictEntitiesById(w1);let j1=Y1.counts.folders+Y1.counts.documents+Y1.counts.templates+Y1.counts.jobs;return x6("Import complete: %d entities imported (including %d jobs)",j1,Y1.counts.jobs),Y1}finally{await P(u)}}})},is=Object.freeze({create:Ub6,resetIncludeVersions:ls});var cb6=($)=>{let{name:K,interval:q,execute:Y}=$,z=null,J=!1,W=null,Z=null,O=0,H=null,V=Object.freeze({getName:()=>K,getInterval:()=>q,getIsRunning:()=>J,getLastRun:()=>W,getLastError:()=>Z,getRunCount:()=>O,getNextRun:()=>H}),D=async()=>{try{await Y(),W=new Date().toISOString(),Z=null,O++}catch(S){console.error(`[CronJob] ${K} failed:`,S),Z={message:S.message,timestamp:new Date().toISOString()}}if(J)H=new Date(Date.now()+q).toISOString()},N=()=>{if(z!==null)return;z=setInterval(D,q),J=!0,H=new Date(Date.now()+q).toISOString()},E=()=>{if(z===null)return;clearInterval(z),z=null,J=!1,H=null},b=Object.freeze({start:N,stop:E,restart:()=>{E(),N()}});return{jobFns:V,controlFns:b}},l7=Object.freeze({create:cb6});var M98=X6(g6(),1),Fb6=M98.default("caw:cron:cleanup-edit-states"),V98=async($)=>{let K=new Date(Date.now()-Pz).toISOString();try{let q=await $.selectFrom("field_definitions as fd").innerJoin("class_field_defs as cfd","cfd.field_definition_id","fd.id").innerJoin("entity_types as et","et.id","cfd.class_type_id").select(["fd.id"]).where("fd.name","=","edit_last_activity_at").where("et.code","in",["d","t"]).where("et.subtype","is",null).execute();if(q.length===0)return{expired:[]};let Y=q.map((J)=>J.id),z=await $.selectFrom("date_fields as df").innerJoin("entities as e","e.id","df.entity_id").leftJoin("project_stores as ps","ps.store_id","e.store_id").leftJoin("entities as p","p.id","ps.project_id").select(["e.object_id","p.object_id as project_object_id"]).where("df.field_definition_id","in",Y).where("df.value","<",K).execute();if(z.length>0)Fb6("Found %d expired edit locks (older than %d minutes)",z.length,Pz/60000);return{expired:z.map((J)=>({objectId:J.object_id,projectObjectId:J.project_object_id}))}}catch(q){throw console.error("[Cleanup] Failed to find expired edit locks:",q),q}};var j98=X6(g6(),1),ns=j98.default("caw:cron:cleanup-edit-states"),pb6=({db:$,clearEditState:K})=>{let{jobFns:q,controlFns:Y}=l7.create({name:"cleanup-stale-edit-states",interval:900000,execute:async()=>{let{expired:z}=await V98($);for(let{objectId:J,projectObjectId:W}of z)try{await K(W,{id:J}),ns("Cleared expired edit lock for %s",J)}catch(Z){ns("Failed to clear edit lock for %s: %s",J,Z.message)}if(z.length>0)ns("Cleaned up %d expired edit locks",z.length)}});return{job:Object.freeze(q),control:Y}},N98=Object.freeze({create:pb6});var Qb6=({db:$,clearEditState:K})=>{let q=new Map,Y=(X,w)=>{let{job:P,control:G}=X.create(w);q.set(P.getName(),{job:P,control:G})},z=(X)=>{let w=q.get(X);if(!w)throw Error(`Job not found: ${X}`);let P=w.job.getIsRunning();return w.control.start(),{name:X,status:P?"already-running":"started",isRunning:w.job.getIsRunning()}},J=(X)=>{let w=q.get(X);if(!w)throw Error(`Job not found: ${X}`);let P=w.job.getIsRunning();return w.control.stop(),{name:X,status:P?"stopped":"already-stopped",isRunning:w.job.getIsRunning()}},W=(X)=>{let w=q.get(X);if(!w)throw Error(`Job not found: ${X}`);return w.control.restart(),{name:X,status:"restarted",isRunning:w.job.getIsRunning()}},Z=()=>{let X=[];for(let[w,{job:P}]of q.entries())X.push({name:P.getName(),interval:P.getInterval(),isRunning:P.getIsRunning(),lastRun:P.getLastRun(),lastError:P.getLastError(),runCount:P.getRunCount(),nextRun:P.getNextRun()});return X},O=()=>{for(let[X,{control:w}]of q.entries())w.start()},H=()=>{for(let[X,{control:w}]of q.entries())w.stop()};return Y(N98,{db:$,clearEditState:K}),Object.freeze({register:Y,start:z,stop:J,restart:W,list:Z,startAll:O,stopAll:H})},f98=Object.freeze({create:Qb6});import qq8 from"node:process";import R98 from"node:process";import ab6 from"node:os";import ob6 from"node:fs";import nb6 from"node:fs";import k98 from"node:fs";var ds;function lb6(){try{return k98.statSync("/.dockerenv"),!0}catch{return!1}}function ib6(){try{return k98.readFileSync("/proc/self/cgroup","utf8").includes("docker")}catch{return!1}}function as(){if(ds===void 0)ds=lb6()||ib6();return ds}var os,db6=()=>{try{return nb6.statSync("/run/.containerenv"),!0}catch{return!1}};function hh(){if(os===void 0)os=db6()||as();return os}var D98=()=>{if(R98.platform!=="linux")return!1;if(ab6.release().toLowerCase().includes("microsoft")){if(hh())return!1;return!0}try{return ob6.readFileSync("/proc/version","utf8").toLowerCase().includes("microsoft")?!hh():!1}catch{return!1}},C98=R98.env.__IS_WSL_TEST__?D98:D98();import rs from"node:process";function ss(){if(rs.platform!=="linux")return!1;if(rs.env.WAYLAND_DISPLAY)return!0;if(rs.env.XDG_SESSION_TYPE==="wayland")return!0;return!1}function q9($){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 rb6}from"node:url";var mG=($,K)=>{let q=es(sb6($));if(typeof q!=="string")throw TypeError(`${K} must be a string or a file URL: ${q}.`);return q},sb6=($)=>ts($)?$.toString():$,ts=($)=>typeof $!=="string"&&$&&Object.getPrototypeOf($)===String.prototype,es=($)=>$ instanceof URL?rb6($):$;var Ih=($,K=[],q={})=>{let Y=mG($,"First argument"),[z,J]=q9(K)?[[],K]:[K,q];if(!Array.isArray(z))throw TypeError(`Second argument must be either an array of arguments or an options object: ${z}`);if(z.some((O)=>typeof O==="object"&&O!==null))throw TypeError(`Second argument must be an array of strings: ${z}`);let W=z.map(String),Z=W.find((O)=>O.includes("\x00"));if(Z!==void 0)throw TypeError(`Arguments cannot contain null bytes ("\\0"): ${Z}`);if(!q9(J))throw TypeError(`Last argument must be an options object: ${J}`);return[Y,W,J]};import{ChildProcess as YB6}from"node:child_process";import{StringDecoder as tb6}from"node:string_decoder";var{toString:E98}=Object.prototype,L98=($)=>E98.call($)==="[object ArrayBuffer]",b9=($)=>E98.call($)==="[object Uint8Array]",t0=($)=>new Uint8Array($.buffer,$.byteOffset,$.byteLength),eb6=new TextEncoder,S98=($)=>eb6.encode($),$B6=new TextDecoder,xh=($)=>$B6.decode($),h98=($,K)=>{return KB6($,K).join("")},KB6=($,K)=>{if(K==="utf8"&&$.every((J)=>typeof J==="string"))return $;let q=new tb6(K),Y=$.map((J)=>typeof J==="string"?S98(J):J).map((J)=>q.write(J)),z=q.end();return z===""?Y:[...Y,z]},Hj=($)=>{if($.length===1&&b9($[0]))return $[0];return $t(_B6($))},_B6=($)=>$.map((K)=>typeof K==="string"?S98(K):K),$t=($)=>{let K=new Uint8Array(qB6($)),q=0;for(let Y of $)K.set(Y,q),q+=Y.length;return K},qB6=($)=>{let K=0;for(let q of $)K+=q.length;return K};var u98=($)=>Array.isArray($)&&Array.isArray($.raw),y98=($,K)=>{let q=[];for(let[J,W]of $.entries())q=zB6({templates:$,expressions:K,tokens:q,index:J,template:W});if(q.length===0)throw TypeError("Template script must not be empty");let[Y,...z]=q;return[Y,z,{}]},zB6=({templates:$,expressions:K,tokens:q,index:Y,template:z})=>{if(z===void 0)throw TypeError(`Invalid backslash sequence: ${$.raw[Y]}`);let{nextTokens:J,leadingWhitespaces:W,trailingWhitespaces:Z}=JB6(z,$.raw[Y]),O=x98(q,J,W);if(Y===K.length)return O;let H=K[Y],X=Array.isArray(H)?H.map((w)=>g98(w)):[g98(H)];return x98(O,X,Z)},JB6=($,K)=>{if(K.length===0)return{nextTokens:[],leadingWhitespaces:!1,trailingWhitespaces:!1};let q=[],Y=0,z=I98.has(K[0]);for(let W=0,Z=0;W<$.length;W+=1,Z+=1){let O=K[Z];if(I98.has(O)){if(Y!==W)q.push($.slice(Y,W));Y=W+1}else if(O==="\\"){let H=K[Z+1];if(H===`
|
|
827
827
|
`)W-=1,Z+=1;else if(H==="u"&&K[Z+2]==="{")Z=K.indexOf("}",Z+3);else Z+=WB6[H]??1}}let J=Y===$.length;if(!J)q.push($.slice(Y));return{nextTokens:q,leadingWhitespaces:z,trailingWhitespaces:J}},I98=new Set([" ","\t","\r",`
|
|
828
828
|
`]),WB6={x:3,u:5},x98=($,K,q)=>q||$.length===0||K.length===0?[...$,...K]:[...$.slice(0,-1),`${$.at(-1)}${K[0]}`,...K.slice(1)],g98=($)=>{let K=typeof $;if(K==="string")return $;if(K==="number")return String($);if(q9($)&&(("stdout"in $)||("isMaxBuffer"in $)))return ZB6($);if($ instanceof YB6||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`)},ZB6=({stdout:$})=>{if(typeof $==="string")return $;if(b9($))return xh($);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 vp6}from"node:child_process";import{debuglog as OB6}from"node:util";import Kt from"node:process";var __=($)=>gh.includes($),gh=[Kt.stdin,Kt.stdout,Kt.stderr],KK=["stdin","stdout","stderr"],uh=($)=>KK[$]??`stdio[${$}]`;var B98=($)=>{let K={...$};for(let q of Yt)K[q]=_t($,q);return K},_t=($,K)=>{let q=Array.from({length:HB6($)+1}),Y=XB6($[K],q,K);return vB6(Y,K)},HB6=({stdio:$})=>Array.isArray($)?Math.max($.length,KK.length):KK.length,XB6=($,K,q)=>q9($)?wB6($,K,q):K.fill($),wB6=($,K,q)=>{for(let Y of Object.keys($).sort(GB6))for(let z of PB6(Y,q,K))K[z]=$[Y];return K},GB6=($,K)=>b98($)<b98(K)?1:-1,b98=($)=>{if($==="stdout"||$==="stderr")return 0;return $==="all"?2:1},PB6=($,K,q)=>{if($==="ipc")return[q.length-1];let Y=qt($);if(Y===void 0||Y===0)throw TypeError(`"${K}.${$}" is invalid.
|
|
829
829
|
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.
|
|
@@ -1126,4 +1126,4 @@ Populated:
|
|
|
1126
1126
|
Errors:
|
|
1127
1127
|
`;for(let G of X.slice(0,10))P+=` - Version PK ${G.versionPk}: ${G.error}
|
|
1128
1128
|
`;if(X.length>10)P+=` ... and ${X.length-10} more errors
|
|
1129
|
-
`}return{content:[{type:"text",text:P}]}}catch(W){return i1(W)}},XT8={name:"backfill_content_refs",title:"Backfill Content Refs",description:"Backfill content reference fields (attachments, includes, hyperlinks) on existing version entities. If confirm=false, returns preview. If confirm=true, performs backfill.",schema:Dq4,execute:Rq4};var wT8=[XT8];F8();var Cq4=f.object({store:f.string().optional().describe('Store code (default: "A")'),limit:f.coerce.number().optional().describe("Maximum number of events to return (default: 50)"),offset:f.coerce.number().optional().describe("Pagination offset (default: 0)")}),Eq4=async({core:$,projectId:K},{store:q,limit:Y,offset:z})=>{try{let J=await $.listDeletedEvents(K,{store:q??"A",limit:Y??50,offset:z??0});return{content:[{type:"text",text:JSON.stringify(J,null,2)}]}}catch(J){return i1(J)}},GT8={name:"list_deleted_events",title:"List Deletion Events",description:"List deletion events grouped by timestamp. Each event represents a single delete action (e.g. deleting a folder and all its contents). Returns events with deletedAt timestamp, root entity info, item count, and days until purge.",schema:Cq4,execute:Eq4};F8();var Lq4=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/,Sq4=f.object({deleted_at:f.string().describe('Deletion event timestamp (ISO 8601, e.g. "2026-03-15T10:23:45.678Z")'),store:f.string().optional().describe('Store code (default: "A")'),limit:f.coerce.number().optional().describe("Maximum number of items to return (default: 50)"),offset:f.coerce.number().optional().describe("Pagination offset (default: 0)")}),hq4=async({core:$,projectId:K},{deleted_at:q,store:Y,limit:z,offset:J})=>{try{if(!Lq4.test(q))return{content:[{type:"text",text:JSON.stringify({error:`Invalid deleted_at timestamp: ${q}`,code:"INVALID_PARAMETER"},null,2)}],isError:!0};let W=await $.getDeletedEvent(K,{deletedAt:q,store:Y??"A",limit:z??50,offset:J??0});return{content:[{type:"text",text:JSON.stringify(W,null,2)}]}}catch(W){return i1(W)}},PT8={name:"get_deleted_event",title:"Get Deletion Event",description:"Get the items in a specific deletion event identified by its timestamp. Returns root entity info and a paginated list of all entities deleted in that event.",schema:Sq4,execute:hq4};F8();var Iq4=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/,xq4=f.object({deleted_at:f.string().describe('Deletion event timestamp (ISO 8601, e.g. "2026-03-15T10:23:45.678Z")'),store:f.string().optional().describe('Store code (default: "A")')}),gq4=async({core:$,projectId:K},{deleted_at:q,store:Y})=>{try{if(!Iq4.test(q))return{content:[{type:"text",text:JSON.stringify({error:`Invalid deleted_at timestamp: ${q}`,code:"INVALID_PARAMETER"},null,2)}],isError:!0};let z=await $.restoreDeletedEvent(K,{deletedAt:q,store:Y??"A"});return{content:[{type:"text",text:JSON.stringify(z,null,2)}]}}catch(z){return i1(z)}},TT8={name:"restore_deleted_event",title:"Restore Deletion Event",description:'Restore all entities in a deletion event (identified by its timestamp). All entities deleted in the same action are restored together. If the root entity has a name collision, it is renamed with a "-restored" suffix.',schema:xq4,execute:gq4};var vT8=[GT8,PT8,TT8];F8();var uq4=f.object({}),yq4=async({core:$,projectId:K})=>{try{let q=await $.getSystemSettings(K);return{content:[{type:"text",text:JSON.stringify(q,null,2)}]}}catch(q){return i1(q)}},AT8={name:"get_system_settings",title:"Get System Settings",description:"Returns all system settings for the project (autoArchiveDelayDays, maxConcurrentJobs, trashRetentionDays, maxResumeAttempts, defaultResumePromptRef, scratchDocDelayDays, jobDelayDays)",schema:uq4,execute:yq4};F8();var bq4=f.object({settings:Qq(f.object({autoArchiveDelayDays:f.number().int().optional(),maxConcurrentJobs:f.number().int().optional(),trashRetentionDays:f.number().int().optional(),maxResumeAttempts:f.number().int().optional(),defaultResumePromptRef:f.string().nullable().optional(),scratchDocDelayDays:f.number().int().optional(),jobDelayDays:f.number().int().optional()})).describe("Partial settings object. Only provided keys are updated.")}),Bq4=async({core:$,projectId:K},{settings:q})=>{try{let Y=await $.updateSystemSettings(K,{settings:q});return{content:[{type:"text",text:JSON.stringify(Y,null,2)}]}}catch(Y){return i1(Y)}},MT8={name:"update_system_settings",title:"Update System Settings",description:"Update system settings for the project. Accepts partial updates — only provided keys are changed. Settings: autoArchiveDelayDays, maxConcurrentJobs, trashRetentionDays, maxResumeAttempts, defaultResumePromptRef, scratchDocDelayDays, jobDelayDays. Validates values: integer fields must be positive integers; defaultResumePromptRef must be a template ID string or null (to clear).",schema:bq4,execute:Bq4};var VT8=[AT8,MT8];var mq4=jT8.default("caw:mcp"),Uq4=({core:$,projectId:K})=>{let q=new i61({name:"caw-server",version:"1.0.165"},{capabilities:{tools:{}}}),Y=[..._P8,...JP8,...TP8,...SP8,...uP8,...lP8,...rP8,...tP8,...WT8,...HT8,...wT8,...vT8,...VT8];for(let z of Y)q.registerTool(z.name,{title:z.title,description:z.description,inputSchema:z.schema},async(J,W)=>{try{let Z=W?.sessionId||W?.requestInfo?.headers?.["mcp-session-id"];return await z.execute({core:$,projectId:K,sessionId:Z,extra:W},J)}catch(Z){if(Z.isDomainError)mq4("Tool %s domain error: %o",z.name,Z);else console.error(`Tool ${z.name} failed:`,Z);return i1(Z)}});return q},NT8=Object.freeze({createMcpServer:Uq4});var Fq4=d61.default("caw:mcp"),HK=d61.default("caw:mcp:session"),pq4=({core:$})=>{let K=new Map;return Object.freeze({handleRequest:async(W,Z,{projectId:O})=>{let H=W.headers["mcp-session-id"];if(H){let T=K.get(H);if(!T)return HK("Session not found: %s",H),Z.status(404).json({jsonrpc:"2.0",error:{code:-32001,message:"Session not found. Server may have been restarted. If so, ask user to reconnect"},id:null});if(T.projectId!==O)return HK("Session %s belongs to project %s, not %s",H,T.projectId,O),Z.status(404).json({jsonrpc:"2.0",error:{code:-32001,message:"Session not found. Server may have been restarted. If so, ask user to reconnect"},id:null});HK("Routing request to existing session: %s",H),T.lastActivity=Date.now();try{return await T.transport.handleRequest(W,Z,W.body)}catch(v){console.error("MCP transport request failed:",v)}}HK("Creating new MCP session for project: %s",O);let X=null,w=new I81({sessionIdGenerator:()=>{return X=cq4(),HK("Generated session ID: %s",X),X},onsessioninitialized:(T)=>{HK("Session initialized: %s",T),Z.setHeader("Mcp-Session-Id",T),G.sessionId=T,K.set(T,G),HK("Session stored: %s",T)}});HK("Creating new server for session");let P=NT8.createMcpServer({core:$,projectId:O});try{await P.connect(w)}catch(T){return console.error("MCP server connect failed:",T),w.close?.(),P.close?.(),Z.status(500).json({jsonrpc:"2.0",error:{code:-32603,message:"Internal server error"},id:null})}let G={sessionId:null,transport:w,server:P,projectId:O,createdAt:Date.now(),lastActivity:Date.now()};Z.on("finish",()=>{if(Z.statusCode!==200&&X&&K.has(X))HK("Request failed (status %d), cleaning up session: %s",Z.statusCode,X),K.delete(X),w.close?.(),P.close?.()});try{await w.handleRequest(W,Z,W.body)}catch(T){console.error("MCP transport request failed:",T)}},getSession:(W)=>{return K.get(W)},closeSession:(W)=>{let Z=K.get(W);if(!Z){HK("Cannot close session - not found: %s",W);return}HK("Closing session: %s",W),Z.transport.close?.(),Z.server.close?.(),K.delete(W)},cleanupIdle:(W)=>{let Z=Date.now(),O=0;for(let[H,X]of K.entries())if(Z-X.lastActivity>W)HK("Cleaning up idle session: %s (idle for %dms)",H,Z-X.lastActivity),X.transport.close?.(),X.server.close?.(),K.delete(H),O++;if(O>0)Fq4("Cleaned up %d idle sessions",O)}})},fT8=Object.freeze({create:pq4});var Qq4=86400000,lq4=300000,iq4=({mcpSessionManager:$})=>{let{jobFns:K,controlFns:q}=l7.create({name:"cleanup-idle-mcp-sessions",interval:lq4,execute:async()=>{$.cleanupIdle(Qq4)}});return{job:Object.freeze(K),control:q}},kT8=Object.freeze({create:iq4});var vu=Wv8.default("caw:server"),E04=async({port:$,envDir:K,databaseFilepath:q,assetsDir:Y,lazilyCreateDb:z,enableRest:J,enableSse:W,enableStatic:Z,enableCrons:O,enableMcp:H=!0,enableCli:X=!0,staticPath:w,kyselyFactory:P})=>{let G=await f08.create({envDir:K,databaseFilepath:q,assetsDir:Y,lazilyCreateDb:z,kyselyFactory:P}),T=O41.default();if(T.use(O41.default.json({limit:"5mb"})),T.get("/health",(N,E)=>{E.json({status:"ok"})}),T.get("/api/info",(N,E)=>{E.json({version:"1.0.165",hookFailureCount:CU1()})}),J)T.use("/api",SJ8),C08.create(T,{core:G}),S08.create(T,{core:G}),h08.create(T,{core:G}),x08.create(T,{core:G}),y08.create(T,{core:G}),m08.create(T,{core:G}),c08.create(T,{core:G}),p08.create(T,{core:G}),l08.create(T,{core:G}),TJ8.create(T,{core:G}),AJ8.create(T,{core:G}),VJ8.create(T,{core:G}),NJ8.create(T,{core:G}),DJ8.create(T,{core:G});if(W)CJ8.create(T,{core:G}),LJ8.create(T,{core:G});if(Z&&w)D08.create(T,{staticPath:w});if(H){vu("Initializing MCP subsystem...");let N=fT8.create({core:G});G.registerCronJob(kT8,{mcpSessionManager:N}),IJ8.create(T,{core:G,mcpSessionManager:N}),vu("MCP subsystem initialized")}if(X){vu("Initializing CLI Adapter subsystem...");let N=(await Promise.resolve().then(() => (dT8(),nT8))).default,E=(await Promise.resolve().then(() => (sT8(),rT8))).default,x=(await Promise.resolve().then(() => (qv8(),_v8))).default,b=(await Promise.resolve().then(() => (Jv8(),zv8))).default,S=x.create({mcpClientFactory:N.create(),aliasGenerator:E.create(),core:G});await S.init(),G.subscribeServerEvents({onProjectCreated:(I)=>S.addProject({objectId:I.id,name:I.name,path:I.path})}),b.create(T,{cliSessionManager:S}),vu("CLI Adapter subsystem initialized")}if(O)G.startAllCrons();let v=null,M=new Set;return Object.freeze({app:T,core:G,start:async()=>{return new Promise((N)=>{v=T.listen($,()=>{let E=v.address().port;N(E)}),v.on("connection",(E)=>{M.add(E),E.on("close",()=>{M.delete(E)})})})},stop:async()=>{if(G.stopAllCrons(),v){for(let N of M)N.destroy();return M.clear(),new Promise((N)=>{v.close(()=>{N()})})}}})},Zv8=Object.freeze({create:E04});var S04=3131,h04=Au.join(Au.dirname(L04(import.meta.url)),"public_html"),I04=!0,x04=!0,g04=!0,u04=!0,y04=!1,b04=!0,B04=!0,m04=!0,fJ=($,K)=>$!==void 0?$==="true":K,U04=()=>{let $=process.env.CAW_ENV_DIR;if(!$)console.error("ERROR: CAW_ENV_DIR environment variable is required"),console.error("Set it to the path of your environment folder, e.g.:"),console.error(' export CAW_ENV_DIR="$HOME/.caw/dev"'),process.exit(1);return{envDir:$,databaseFilepath:Au.join($,"caw.db"),assetsDir:Au.join($,"assets")}},c04=async($)=>{let K=await Zv8.create($),q=await K.start();console.log(`Server listening on port ${q}`),process.on("SIGINT",()=>K.stop("SIGINT")),process.on("SIGTERM",()=>K.stop("SIGTERM"))},F04=()=>{let{envDir:$,databaseFilepath:K,assetsDir:q}=U04(),Y=process.env.CAW_PORT?Number(process.env.CAW_PORT):S04,z=process.env.STATIC_PATH||h04,J=fJ(process.env.LAZY_CREATE_DB,I04),W=fJ(process.env.ENABLE_REST,x04),Z=fJ(process.env.ENABLE_MCP,g04),O=fJ(process.env.ENABLE_CLI,u04),H=fJ(process.env.ENABLE_WEBLLM_WSS,y04),X=fJ(process.env.ENABLE_SSE,b04),w=fJ(process.env.ENABLE_STATIC,B04),P=fJ(process.env.ENABLE_CRONS,m04);return Object.freeze({port:Y,staticPath:z,envDir:$,databaseFilepath:K,assetsDir:q,lazilyCreateDb:J,enableRest:W,enableMcp:Z,enableCli:O,enableWebllmWss:H,enableSse:X,enableStatic:w,enableCrons:P})};await c04(F04()).catch(($)=>{console.error("ERROR: Failed to start server:",$),process.exit(1)});
|
|
1129
|
+
`}return{content:[{type:"text",text:P}]}}catch(W){return i1(W)}},XT8={name:"backfill_content_refs",title:"Backfill Content Refs",description:"Backfill content reference fields (attachments, includes, hyperlinks) on existing version entities. If confirm=false, returns preview. If confirm=true, performs backfill.",schema:Dq4,execute:Rq4};var wT8=[XT8];F8();var Cq4=f.object({store:f.string().optional().describe('Store code (default: "A")'),limit:f.coerce.number().optional().describe("Maximum number of events to return (default: 50)"),offset:f.coerce.number().optional().describe("Pagination offset (default: 0)")}),Eq4=async({core:$,projectId:K},{store:q,limit:Y,offset:z})=>{try{let J=await $.listDeletedEvents(K,{store:q??"A",limit:Y??50,offset:z??0});return{content:[{type:"text",text:JSON.stringify(J,null,2)}]}}catch(J){return i1(J)}},GT8={name:"list_deleted_events",title:"List Deletion Events",description:"List deletion events grouped by timestamp. Each event represents a single delete action (e.g. deleting a folder and all its contents). Returns events with deletedAt timestamp, root entity info, item count, and days until purge.",schema:Cq4,execute:Eq4};F8();var Lq4=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/,Sq4=f.object({deleted_at:f.string().describe('Deletion event timestamp (ISO 8601, e.g. "2026-03-15T10:23:45.678Z")'),store:f.string().optional().describe('Store code (default: "A")'),limit:f.coerce.number().optional().describe("Maximum number of items to return (default: 50)"),offset:f.coerce.number().optional().describe("Pagination offset (default: 0)")}),hq4=async({core:$,projectId:K},{deleted_at:q,store:Y,limit:z,offset:J})=>{try{if(!Lq4.test(q))return{content:[{type:"text",text:JSON.stringify({error:`Invalid deleted_at timestamp: ${q}`,code:"INVALID_PARAMETER"},null,2)}],isError:!0};let W=await $.getDeletedEvent(K,{deletedAt:q,store:Y??"A",limit:z??50,offset:J??0});return{content:[{type:"text",text:JSON.stringify(W,null,2)}]}}catch(W){return i1(W)}},PT8={name:"get_deleted_event",title:"Get Deletion Event",description:"Get the items in a specific deletion event identified by its timestamp. Returns root entity info and a paginated list of all entities deleted in that event.",schema:Sq4,execute:hq4};F8();var Iq4=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/,xq4=f.object({deleted_at:f.string().describe('Deletion event timestamp (ISO 8601, e.g. "2026-03-15T10:23:45.678Z")'),store:f.string().optional().describe('Store code (default: "A")')}),gq4=async({core:$,projectId:K},{deleted_at:q,store:Y})=>{try{if(!Iq4.test(q))return{content:[{type:"text",text:JSON.stringify({error:`Invalid deleted_at timestamp: ${q}`,code:"INVALID_PARAMETER"},null,2)}],isError:!0};let z=await $.restoreDeletedEvent(K,{deletedAt:q,store:Y??"A"});return{content:[{type:"text",text:JSON.stringify(z,null,2)}]}}catch(z){return i1(z)}},TT8={name:"restore_deleted_event",title:"Restore Deletion Event",description:'Restore all entities in a deletion event (identified by its timestamp). All entities deleted in the same action are restored together. If the root entity has a name collision, it is renamed with a "-restored" suffix.',schema:xq4,execute:gq4};var vT8=[GT8,PT8,TT8];F8();var uq4=f.object({}),yq4=async({core:$,projectId:K})=>{try{let q=await $.getSystemSettings(K);return{content:[{type:"text",text:JSON.stringify(q,null,2)}]}}catch(q){return i1(q)}},AT8={name:"get_system_settings",title:"Get System Settings",description:"Returns all system settings for the project (autoArchiveDelayDays, maxConcurrentJobs, trashRetentionDays, maxResumeAttempts, defaultResumePromptRef, scratchDocDelayDays, jobDelayDays)",schema:uq4,execute:yq4};F8();var bq4=f.object({settings:Qq(f.object({autoArchiveDelayDays:f.number().int().optional(),maxConcurrentJobs:f.number().int().optional(),trashRetentionDays:f.number().int().optional(),maxResumeAttempts:f.number().int().optional(),defaultResumePromptRef:f.string().nullable().optional(),scratchDocDelayDays:f.number().int().optional(),jobDelayDays:f.number().int().optional()})).describe("Partial settings object. Only provided keys are updated.")}),Bq4=async({core:$,projectId:K},{settings:q})=>{try{let Y=await $.updateSystemSettings(K,{settings:q});return{content:[{type:"text",text:JSON.stringify(Y,null,2)}]}}catch(Y){return i1(Y)}},MT8={name:"update_system_settings",title:"Update System Settings",description:"Update system settings for the project. Accepts partial updates — only provided keys are changed. Settings: autoArchiveDelayDays, maxConcurrentJobs, trashRetentionDays, maxResumeAttempts, defaultResumePromptRef, scratchDocDelayDays, jobDelayDays. Validates values: integer fields must be positive integers; defaultResumePromptRef must be a template ID string or null (to clear).",schema:bq4,execute:Bq4};var VT8=[AT8,MT8];var mq4=jT8.default("caw:mcp"),Uq4=({core:$,projectId:K})=>{let q=new i61({name:"caw-server",version:"1.0.166"},{capabilities:{tools:{}}}),Y=[..._P8,...JP8,...TP8,...SP8,...uP8,...lP8,...rP8,...tP8,...WT8,...HT8,...wT8,...vT8,...VT8];for(let z of Y)q.registerTool(z.name,{title:z.title,description:z.description,inputSchema:z.schema},async(J,W)=>{try{let Z=W?.sessionId||W?.requestInfo?.headers?.["mcp-session-id"];return await z.execute({core:$,projectId:K,sessionId:Z,extra:W},J)}catch(Z){if(Z.isDomainError)mq4("Tool %s domain error: %o",z.name,Z);else console.error(`Tool ${z.name} failed:`,Z);return i1(Z)}});return q},NT8=Object.freeze({createMcpServer:Uq4});var Fq4=d61.default("caw:mcp"),HK=d61.default("caw:mcp:session"),pq4=({core:$})=>{let K=new Map;return Object.freeze({handleRequest:async(W,Z,{projectId:O})=>{let H=W.headers["mcp-session-id"];if(H){let T=K.get(H);if(!T)return HK("Session not found: %s",H),Z.status(404).json({jsonrpc:"2.0",error:{code:-32001,message:"Session not found. Server may have been restarted. If so, ask user to reconnect"},id:null});if(T.projectId!==O)return HK("Session %s belongs to project %s, not %s",H,T.projectId,O),Z.status(404).json({jsonrpc:"2.0",error:{code:-32001,message:"Session not found. Server may have been restarted. If so, ask user to reconnect"},id:null});HK("Routing request to existing session: %s",H),T.lastActivity=Date.now();try{return await T.transport.handleRequest(W,Z,W.body)}catch(v){console.error("MCP transport request failed:",v)}}HK("Creating new MCP session for project: %s",O);let X=null,w=new I81({sessionIdGenerator:()=>{return X=cq4(),HK("Generated session ID: %s",X),X},onsessioninitialized:(T)=>{HK("Session initialized: %s",T),Z.setHeader("Mcp-Session-Id",T),G.sessionId=T,K.set(T,G),HK("Session stored: %s",T)}});HK("Creating new server for session");let P=NT8.createMcpServer({core:$,projectId:O});try{await P.connect(w)}catch(T){return console.error("MCP server connect failed:",T),w.close?.(),P.close?.(),Z.status(500).json({jsonrpc:"2.0",error:{code:-32603,message:"Internal server error"},id:null})}let G={sessionId:null,transport:w,server:P,projectId:O,createdAt:Date.now(),lastActivity:Date.now()};Z.on("finish",()=>{if(Z.statusCode!==200&&X&&K.has(X))HK("Request failed (status %d), cleaning up session: %s",Z.statusCode,X),K.delete(X),w.close?.(),P.close?.()});try{await w.handleRequest(W,Z,W.body)}catch(T){console.error("MCP transport request failed:",T)}},getSession:(W)=>{return K.get(W)},closeSession:(W)=>{let Z=K.get(W);if(!Z){HK("Cannot close session - not found: %s",W);return}HK("Closing session: %s",W),Z.transport.close?.(),Z.server.close?.(),K.delete(W)},cleanupIdle:(W)=>{let Z=Date.now(),O=0;for(let[H,X]of K.entries())if(Z-X.lastActivity>W)HK("Cleaning up idle session: %s (idle for %dms)",H,Z-X.lastActivity),X.transport.close?.(),X.server.close?.(),K.delete(H),O++;if(O>0)Fq4("Cleaned up %d idle sessions",O)}})},fT8=Object.freeze({create:pq4});var Qq4=86400000,lq4=300000,iq4=({mcpSessionManager:$})=>{let{jobFns:K,controlFns:q}=l7.create({name:"cleanup-idle-mcp-sessions",interval:lq4,execute:async()=>{$.cleanupIdle(Qq4)}});return{job:Object.freeze(K),control:q}},kT8=Object.freeze({create:iq4});var vu=Wv8.default("caw:server"),E04=async({port:$,envDir:K,databaseFilepath:q,assetsDir:Y,lazilyCreateDb:z,enableRest:J,enableSse:W,enableStatic:Z,enableCrons:O,enableMcp:H=!0,enableCli:X=!0,staticPath:w,kyselyFactory:P})=>{let G=await f08.create({envDir:K,databaseFilepath:q,assetsDir:Y,lazilyCreateDb:z,kyselyFactory:P}),T=O41.default();if(T.use(O41.default.json({limit:"5mb"})),T.get("/health",(N,E)=>{E.json({status:"ok"})}),T.get("/api/info",(N,E)=>{E.json({version:"1.0.166",hookFailureCount:CU1()})}),J)T.use("/api",SJ8),C08.create(T,{core:G}),S08.create(T,{core:G}),h08.create(T,{core:G}),x08.create(T,{core:G}),y08.create(T,{core:G}),m08.create(T,{core:G}),c08.create(T,{core:G}),p08.create(T,{core:G}),l08.create(T,{core:G}),TJ8.create(T,{core:G}),AJ8.create(T,{core:G}),VJ8.create(T,{core:G}),NJ8.create(T,{core:G}),DJ8.create(T,{core:G});if(W)CJ8.create(T,{core:G}),LJ8.create(T,{core:G});if(Z&&w)D08.create(T,{staticPath:w});if(H){vu("Initializing MCP subsystem...");let N=fT8.create({core:G});G.registerCronJob(kT8,{mcpSessionManager:N}),IJ8.create(T,{core:G,mcpSessionManager:N}),vu("MCP subsystem initialized")}if(X){vu("Initializing CLI Adapter subsystem...");let N=(await Promise.resolve().then(() => (dT8(),nT8))).default,E=(await Promise.resolve().then(() => (sT8(),rT8))).default,x=(await Promise.resolve().then(() => (qv8(),_v8))).default,b=(await Promise.resolve().then(() => (Jv8(),zv8))).default,S=x.create({mcpClientFactory:N.create(),aliasGenerator:E.create(),core:G});await S.init(),G.subscribeServerEvents({onProjectCreated:(I)=>S.addProject({objectId:I.id,name:I.name,path:I.path})}),b.create(T,{cliSessionManager:S}),vu("CLI Adapter subsystem initialized")}if(O)G.startAllCrons();T.use((N,E,x,b)=>{x.status(N.status||N.statusCode||500).json({error:N.message,type:N.type})});let v=null,M=new Set;return Object.freeze({app:T,core:G,start:async()=>{return new Promise((N)=>{v=T.listen($,()=>{let E=v.address().port;N(E)}),v.on("connection",(E)=>{M.add(E),E.on("close",()=>{M.delete(E)})})})},stop:async()=>{if(G.stopAllCrons(),v){for(let N of M)N.destroy();return M.clear(),new Promise((N)=>{v.close(()=>{N()})})}}})},Zv8=Object.freeze({create:E04});var S04=3131,h04=Au.join(Au.dirname(L04(import.meta.url)),"public_html"),I04=!0,x04=!0,g04=!0,u04=!0,y04=!1,b04=!0,B04=!0,m04=!0,fJ=($,K)=>$!==void 0?$==="true":K,U04=()=>{let $=process.env.CAW_ENV_DIR;if(!$)console.error("ERROR: CAW_ENV_DIR environment variable is required"),console.error("Set it to the path of your environment folder, e.g.:"),console.error(' export CAW_ENV_DIR="$HOME/.caw/dev"'),process.exit(1);return{envDir:$,databaseFilepath:Au.join($,"caw.db"),assetsDir:Au.join($,"assets")}},c04=async($)=>{let K=await Zv8.create($),q=await K.start();console.log(`Server listening on port ${q}`),process.on("SIGINT",()=>K.stop("SIGINT")),process.on("SIGTERM",()=>K.stop("SIGTERM"))},F04=()=>{let{envDir:$,databaseFilepath:K,assetsDir:q}=U04(),Y=process.env.CAW_PORT?Number(process.env.CAW_PORT):S04,z=process.env.STATIC_PATH||h04,J=fJ(process.env.LAZY_CREATE_DB,I04),W=fJ(process.env.ENABLE_REST,x04),Z=fJ(process.env.ENABLE_MCP,g04),O=fJ(process.env.ENABLE_CLI,u04),H=fJ(process.env.ENABLE_WEBLLM_WSS,y04),X=fJ(process.env.ENABLE_SSE,b04),w=fJ(process.env.ENABLE_STATIC,B04),P=fJ(process.env.ENABLE_CRONS,m04);return Object.freeze({port:Y,staticPath:z,envDir:$,databaseFilepath:K,assetsDir:q,lazilyCreateDb:J,enableRest:W,enableMcp:Z,enableCli:O,enableWebllmWss:H,enableSse:X,enableStatic:w,enableCrons:P})};await c04(F04()).catch(($)=>{console.error("ERROR: Failed to start server:",$),process.exit(1)});
|