@kelceyp/caw-server 0.0.65 → 0.0.66
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.js +1 -1
- package/dist/public_html/main.js +410 -402
- package/dist/public_html/styles.css +1 -1
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -562,7 +562,7 @@ try {
|
|
|
562
562
|
`,X8=U+P8+x;Y$("runJob: Appending output for turn %d",e),await K.updateJobOutput(H,{id:W,output:X8})}if(D.tokensUsed!==null)await K.updateJobTokens(H,{id:W,tokensUsed:D.tokensUsed});if(D.durationMs!==null||D.totalCostUsd!==null||D.numTurns!==null||D.sessionId!==null)await K.updateJobMetadata(H,{id:W,durationMs:D.durationMs,totalCostUsd:D.totalCostUsd,numTurns:D.numTurns,sessionId:D.sessionId});if(E===0)await K.updateJobStatus(H,{id:W,status:"completed",exitCode:0});else{let S=i.trim()||`Process exited with code ${E}`;await K.updateJobStatus(H,{id:W,status:"error",exitCode:E,errorMessage:S})}try{await K.clearJobPid(H,{id:W})}catch(S){Y$("runJob: Failed to clear PID for job %s: %s",W,S.message)}Y$("runJob: Job %s completed with status %s",W,E===0?"completed":"error")}catch(x){Y$("runJob: Failed to update job after process close: %s",x.message);try{await K.updateJobStatus(H,{id:W,status:"error",errorMessage:`Database update failed: ${x.message}`})}catch(D){Y$("runJob: Failed to set error status for job %s: %s",W,D.message)}}}),Y$("runJob: Process spawned, returning immediately")}})};var $d=Object.freeze({create:LP1});$4();var wl8=f6(N4(),1);import{spawn as IP1}from"child_process";import{join as xP1}from"path";var X4=wl8.default("caw:worktree-service"),bP1=($)=>{if(!$||!$.trim())return[];let K=[],q=$.trim().split(`
|
|
563
563
|
|
|
564
564
|
`);for(let Y of q){let J=Y.trim().split(`
|
|
565
|
-
`),z={path:null,commit:null,branch:null,isLocked:!1,isMain:!1};for(let W of J)if(W.startsWith("worktree "))z.path=W.slice(9);else if(W.startsWith("HEAD "))z.commit=W.slice(5);else if(W.startsWith("branch ")){let H=W.slice(7);z.branch=H.replace("refs/heads/","")}else if(W==="detached");else if(W==="locked")z.isLocked=!0;else if(W.startsWith("locked "))z.isLocked=!0;if(z.path)K.push(z)}if(K.length>0)K[0].isMain=!0;return K},lX=($,K)=>{return new Promise((q)=>{let Y=IP1("git",$,{cwd:K}),J="",z="";Y.stdout.on("data",(W)=>{J+=W.toString()}),Y.stderr.on("data",(W)=>{z+=W.toString()}),Y.on("close",(W)=>{q({stdout:J,stderr:z,exitCode:W})}),Y.on("error",(W)=>{if(W.code==="ENOENT")q({stdout:"",stderr:"git: command not found",exitCode:-1,enoent:!0});else q({stdout:"",stderr:W.message,exitCode:-1})})})},gP1=()=>{let $=async({projectPath:Y})=>{m.factory(!Y,b.validation,"projectPath is required","MISSING_PROJECT_PATH"),X4("listWorktrees: Running git worktree list --porcelain in %s",Y);let J=await lX(["worktree","list","--porcelain"],Y);if(J.enoent)throw X4("listWorktrees: Git not found"),b.validation("Git not installed or not found in PATH","GIT_NOT_FOUND");if(J.stderr&&J.stderr.includes("not a git repository"))return X4("listWorktrees: Not a git repository"),{worktrees:[],isGitProject:!1};if(J.exitCode!==0)throw X4("listWorktrees: Git command failed with exit code %d: %s",J.exitCode,J.stderr),Error(`Git worktree list failed: ${J.stderr||"Unknown error"}`);let z=bP1(J.stdout);X4("listWorktrees: Parsed %d worktrees",z.length);let W=z.filter((H)=>!H.isMain).map((H)=>({branch:H.branch,path:H.path,commit:H.commit,isLocked:H.isLocked}));return X4("listWorktrees: Returning %d worktrees (excluding main)",W.length),{worktrees:W,isGitProject:!0}},K=async(Y)=>{if(X4("getDefaultBaseBranch: Checking for main branch in %s",Y),(await lX(["show-ref","--verify","--quiet","refs/heads/main"],Y)).exitCode===0)return X4("getDefaultBaseBranch: Detected default branch: main"),"main";if(X4("getDefaultBaseBranch: main not found, checking for master branch"),(await lX(["show-ref","--verify","--quiet","refs/heads/master"],Y)).exitCode===0)return X4("getDefaultBaseBranch: Detected default branch: master"),"master";throw X4("getDefaultBaseBranch: Neither main nor master branch found"),b.validation("No default branch found (neither main nor master exists)","NO_DEFAULT_BRANCH")};return Object.freeze({listWorktrees:$,createWorktree:async({projectPath:Y,branch:J,baseBranch:z})=>{m.factory(!Y,b.validation,"projectPath is required","MISSING_PROJECT_PATH"),m.factory(!J,b.validation,"branch is required","MISSING_BRANCH"),X4("createWorktree: Creating worktree for branch %s in %s",J,Y),X4("createWorktree: Validating branch name: %s",J);let W=await lX(["check-ref-format","--branch",J],Y);if(W.enoent)throw X4("createWorktree: Git not found"),b.validation("Git not installed or not found in PATH","GIT_NOT_FOUND");if(W.exitCode!==0)throw X4("createWorktree: Invalid branch name: %s",J),b.validation(`Invalid branch name: ${J}`,"INVALID_BRANCH_NAME");let H=z;if(!H){X4("createWorktree: No baseBranch provided, detecting default");try{H=await K(Y)}catch(X){if(X.code==="NO_DEFAULT_BRANCH"){let P=await lX(["status","--porcelain"],Y);if(P.stderr&&P.stderr.includes("not a git repository"))throw X4("createWorktree: Not a git repository"),b.validation("Not a git repository","NOT_GIT_REPOSITORY")}throw X}}let Z=xP1(Y,"worktree",J);X4("createWorktree: Worktree path will be: %s",Z),X4("createWorktree: Running git worktree add %s -b %s %s",Z,J,H);let O=await lX(["worktree","add",Z,"-b",J,H],Y);if(O.enoent)throw X4("createWorktree: Git not found"),b.validation("Git not installed or not found in PATH","GIT_NOT_FOUND");if(O.stderr&&O.stderr.includes("not a git repository"))throw X4("createWorktree: Not a git repository"),b.validation("Not a git repository","NOT_GIT_REPOSITORY");if(O.stderr&&O.stderr.includes("is already checked out"))throw X4("createWorktree: Branch %s is already checked out",J),b.conflict(`Branch '${J}' is already checked out in another worktree`,"BRANCH_ALREADY_CHECKED_OUT");if(O.stderr&&O.stderr.includes("already exists"))throw X4("createWorktree: Branch %s already exists",J),b.conflict(`Branch '${J}' already exists`,"BRANCH_ALREADY_EXISTS");if(O.exitCode!==0)throw X4("createWorktree: Git worktree add failed with exit code %d: %s",O.exitCode,O.stderr),Error(`Git worktree add failed: ${O.stderr||"Unknown error"}`);return X4("createWorktree: Successfully created worktree at %s for branch %s",Z,J),{path:Z,branch:J}},getDefaultBaseBranch:K})};var Tl8=Object.freeze({create:gP1});var k5=jl8.default("caw:core"),yP1=async({databaseFilepath:$,assetsDir:K,lazilyCreateDb:q,kyselyFactory:Y},J)=>{let W=await yX8.create({kyselyFactory:Y}).getDb($,q),H=BX8.create(),Z=YP8.create(),O=vB8.create({db:W}),X=eQ8.create(),P=new Map,w=async(y)=>{if(!y||!/^P\d+$/.test(y))m.factory(!0,b.notFound,`Project not found: ${y}`,"PROJECT_NOT_FOUND");let d=parseInt(y.slice(1),10);m.factory(d<1||d>Number.MAX_SAFE_INTEGER,b.notFound,`Project not found: ${y}`,"PROJECT_NOT_FOUND");let Q=await H.readProjectByObjectId(W,null,y);return m.factory(!Q,b.notFound,`Project not found: ${y}`,"PROJECT_NOT_FOUND"),{projCtx:Q.getObjectId(),projectPath:Q.getPath(),authCtx:null}},T=async(y)=>{let d=P.get(y);if(d)return d;let Q=await Z.readRootStoreForProject(W,{},y),r=JP8.create({store:Q}),w8=zP8.create({store:Q}),M8=lT8.create(),x8=QT8.create({store:Q,folderService:r,documentHooks:M8}),Q8=VV8.create(),$6=ql8.create({store:Q,fieldService:w8}),r8=Wl8.create({store:Q,assetsDir:K}),m6=Xl8.create({store:Q,fieldService:w8}),z7=Tl8.create(),W7=Im.create({db:W,folderService:r,fieldService:w8,documentService:x8,templateService:Q8,projectService:null,clipboardService:X,storyService:$6,assetService:r8,jobService:m6}),m5=Sm8.create({store:Q,folderService:r,documentService:x8,templateService:Q8,assetService:r8,assetsDir:K}),sW=wB8.create({store:Q,folderService:r,documentService:x8,templateService:Q8,assetService:r8,assetsDir:K}),cv={folderService:r,fieldService:w8,documentService:x8,templateService:Q8,transactionService:W7,exportService:m5,importService:sW,rootStore:Q,storyService:$6,assetService:r8,jobService:m6,worktreeService:z7};return P.set(y,cv),cv},v=async()=>{return await Lk.create({projectStore:H,storeStore:Z}).listProjects(W)},j=async(y)=>{if(!y||!/^P\d+$/.test(y))return null;let d=parseInt(y.slice(1),10);if(d<1||d>Number.MAX_SAFE_INTEGER)return null;return await H.readProjectByObjectId(W,null,y)},G=async(y,{mode:d,store:Q,path:r,root:w8,parentId:M8,name:x8,type:Q8})=>{let $6=await w(y),{transactionService:r8}=await T($6.projCtx);return await r8.createFolder($6,{mode:d,store:Q,path:r,root:w8,parentId:M8,name:x8,type:Q8})},A=async(y,{id:d,name:Q})=>{let r=await w(y),{transactionService:w8}=await T(r.projCtx);return await w8.renameFolder(r,{id:d,name:Q})},f=async(y,{id:d,parentId:Q})=>{let r=await w(y),{transactionService:w8}=await T(r.projCtx);return await w8.moveFolder(r,{id:d,parentId:Q})},k=async(y,{id:d})=>{let Q=await w(y),{transactionService:r}=await T(Q.projCtx);return await r.deleteFolder(Q,{id:d})},N=async(y,{id:d})=>{let Q=await w(y),{folderService:r}=await T(Q.projCtx);return await r.readFolder(W,Q,{id:d})},C=async(y,{store:d,path:Q,type:r})=>{let w8=await w(y),{folderService:M8}=await T(w8.projCtx);return await M8.getFolderByPath(W,w8,{path:Q,type:r,storeCode:d})},E=async(y,{folderId:d,store:Q,type:r})=>{let w8=await w(y);k5("listFolderContents: Listing contents for project %s: folderId=%s, store=%s, type=%s",w8.projCtx,d||"root",Q,r);let{folderService:M8,documentService:x8,rootStore:Q8}=await T(w8.projCtx),$6=r;if(d&&!r)$6=await h(W,Q8,w8,d,Q),k5("listFolderContents: Inferred type %s from folder %s",$6,d);let r8=await M8.listFolderContents(W,w8,{folderId:d,storeCode:Q,type:$6}),m6=d;if((d===null||d===void 0)&&($6==="d"||$6==="t"))m6=(await Q8.readRootFolderForType(W,w8,$6,Q)).getObjectId(),k5("listFolderContents: Resolved root folder for type %s: %s",$6,m6);k5("listFolderContents: Querying content with parentId=%s, store=%s, type=%s",m6,Q,$6);let z7=await x8.listDocuments(W,w8,{parentId:m6,storeCode:Q,type:$6});return k5("listFolderContents: Found %d folders, %d documents",r8?.length||0,z7?.length||0),{folders:r8,documents:z7}},h=async(y,d,Q,r,w8)=>{let M8=await d.readFolder(y,Q,{id:r});if(!M8)return null;let x8=await y.selectFrom("entities").innerJoin("entity_types","entities.entity_type_id","entity_types.id").select(["entity_types.code as entity_type_code","entity_types.subtype as entity_type_subtype"]).where("entities.object_id","=",r).executeTakeFirst();if(x8?.entity_type_code==="f"&&x8?.entity_type_subtype==="root_d")return"d";if(x8?.entity_type_code==="f"&&x8?.entity_type_subtype==="root_t")return"t";if(x8?.entity_type_code==="f"&&(x8?.entity_type_subtype==="root_s"||x8?.entity_type_subtype==="state_folder"))return"d";let Q8=await d.readRootFolderForType(y,Q,"d",w8),$6=await d.readRootFolderForType(y,Q,"t",w8),r8=M8;while(r8&&r8.getParentId()!==null){let m6=await d.readFolder(y,Q,{id:r8.getParentId()});if(!m6)break;r8=m6}if(r8&&r8.getObjectId()===Q8?.getObjectId())return"d";else if(r8&&r8.getObjectId()===$6?.getObjectId())return"t";return null},i=async(y)=>{let d=await w(y),{rootStore:Q}=await T(d.projCtx);return Q},x=async({name:y,path:d})=>{let Q=Lk.create({projectStore:H,storeStore:Z}),r=Im.create({db:W,folderService:null,projectService:Q}),w8={};return await r.createProject(w8,{name:y,path:d})},D=(y)=>{return Lk.create({projectStore:H,storeStore:Z}).validateProjectPath(y)},S=(y)=>{P.delete(y)},U=async(y,{mode:d,store:Q,path:r,root:w8,parentId:M8,name:x8,type:Q8,content:$6,tree:r8})=>{let m6=await w(y);k5("createDocument: Creating document in project %s: mode=%s, path=%s, store=%s, type=%s",m6.projCtx,d,r,Q,Q8);let{transactionService:z7}=await T(m6.projCtx),W7=await z7.createDocument(m6,{mode:d,store:Q,path:r,root:w8,parentId:M8,name:x8,type:Q8,content:$6,tree:r8});return k5("createDocument: Document created: id=%s, path=%s",W7.getObjectId(),W7.getPath()),W7},p=async(y,{mode:d,store:Q,path:r,root:w8,parentId:M8,name:x8,content:Q8})=>{let $6=await w(y);k5("createTemplate: Creating template in project %s: mode=%s, path=%s, store=%s",$6.projCtx,d,r,Q);let{transactionService:r8}=await T($6.projCtx),m6=await r8.createTemplate($6,{mode:d,store:Q,path:r,root:w8,parentId:M8,name:x8,content:Q8});return k5("createTemplate: Template created: id=%s, path=%s",m6.getObjectId(),m6.getPath()),m6},e=async(y,{id:d})=>{let Q=await w(y),{documentService:r}=await T(Q.projCtx);return await r.readDocument(W,Q,{id:d})},P8=async(y,{path:d,store:Q,type:r})=>{let w8=await w(y),{documentService:M8}=await T(w8.projCtx);return await M8.readDocumentByPath(W,w8,{path:d,type:r,storeCode:Q})},X8=async(y,{id:d,path:Q,parentId:r,type:w8})=>{let M8=await w(y),{transactionService:x8}=await T(M8.projCtx);return await x8.updateDocumentPath(M8,{id:d,path:Q,parentId:r,type:w8})},k8=async(y,{id:d})=>{let Q=await w(y),{transactionService:r}=await T(Q.projCtx);return await r.deleteDocument(Q,{id:d})},L8=async(y,{id:d,content:Q,sessionId:r})=>{let w8=await w(y),{transactionService:M8}=await T(w8.projCtx);return await M8.saveDraft(w8,{id:d,content:Q,sessionId:r})},A8=async(y,{id:d})=>{let Q=await w(y),{documentService:r}=await T(Q.projCtx);return await r.readDraft(W,Q,{id:d})},I8=async(y,{id:d,sessionId:Q})=>{let r=await w(y),{transactionService:w8}=await T(r.projCtx);return await w8.publishDocument(r,{id:d,sessionId:Q})},c8=async(y,{id:d})=>{let Q=await w(y),{transactionService:r}=await T(Q.projCtx);return await r.discardDraft(Q,{id:d})},_8=async(y,{id:d,sessionId:Q})=>{let r=await w(y),{transactionService:w8}=await T(r.projCtx);return await w8.setEditState(r,{id:d,sessionId:Q})},B8=async(y,{id:d})=>{let Q=await w(y),{transactionService:r}=await T(Q.projCtx);return await r.clearEditState(Q,{id:d})},z6=async(y,{id:d})=>{let Q=await w(y),{documentService:r}=await T(Q.projCtx);return await r.getEditState(W,Q,{id:d})},q6=async(y,{id:d,versionNumber:Q})=>{let r=await w(y),{documentService:w8}=await T(r.projCtx);return await w8.readVersion(W,r,{id:d,versionNumber:Q})},E6=async(y,{id:d})=>{let Q=await w(y),{documentService:r}=await T(Q.projCtx);return await r.getVersions(W,Q,{id:d})},e8=async(y,{id:d,operation:Q,preview:r,ignoreContent:w8,sessionId:M8})=>{let x8=await w(y),{transactionService:Q8}=await T(x8.projCtx);return await Q8.editDocument(x8,{id:d,operation:Q,preview:r,ignoreContent:w8,sessionId:M8})},i6=async(y,{id:d,operations:Q,preview:r,ignoreContent:w8,sessionId:M8})=>{let x8=await w(y),{transactionService:Q8}=await T(x8.projCtx);return await Q8.batchEditDocument(x8,{id:d,operations:Q,preview:r,ignoreContent:w8,sessionId:M8})},_6=async(y,{folderId:d,store:Q,type:r="d"})=>{let w8=await w(y),{documentService:M8}=await T(w8.projCtx);return await M8.listDocuments(W,w8,{parentId:d,storeCode:Q,type:r})},a1=async(y,{id:d,params:Q,target:r,targetOptions:w8,sessionId:M8})=>{let x8=await w(y),{transactionService:Q8}=await T(x8.projCtx);return await Q8.renderTemplate(x8,{id:d,params:Q,target:r,targetOptions:w8,sessionId:M8})},J7=async(y,{id:d})=>{let Q=await w(y),{documentService:r,templateService:w8}=await T(Q.projCtx),{entity:M8}=await r.readDocument(W,Q,{id:d});if(!M8.getPublishedContent())return{parameters:{},detectedVariables:[],target:null,targetPath:null};return w8.extractTemplateParameters(M8.getPublishedContent())},f3=async(y,{store:d,ownerEntityId:Q,name:r,label:w8,description:M8,primitiveType:x8,required:Q8,multiplicity:$6,isSystem:r8})=>{let m6=await w(y),{transactionService:z7}=await T(m6.projCtx);return await z7.createFieldDefinition(m6,{store:d,ownerEntityId:Q,name:r,label:w8,description:M8,primitiveType:x8,required:Q8,multiplicity:$6,isSystem:r8})},R8=async(y,{id:d})=>{let Q=await w(y),{fieldService:r}=await T(Q.projCtx);return await r.readFieldDefinition(W,Q,{id:d})},h8=async(y,{store:d,ownerEntityId:Q,includeSystem:r})=>{let w8=await w(y),{fieldService:M8}=await T(w8.projCtx);return await M8.getFieldDefinitionsForOwner(W,w8,{store:d,ownerEntityId:Q,includeSystem:r})},E8=async(y,{id:d})=>{let Q=await w(y),{transactionService:r}=await T(Q.projCtx);return await r.deleteFieldDefinition(Q,{id:d})},S8=async(y,{entityId:d,fieldDefinitionId:Q,fieldName:r,value:w8,values:M8})=>{let x8=await w(y),{transactionService:Q8,rootStore:$6}=await T(x8.projCtx),r8=await Q8.setFieldValue(x8,{entityId:d,fieldDefinitionId:Q,fieldName:r,value:w8,values:M8});return $6.evictFolder(d),r8},y8=async(y,{entityId:d})=>{let Q=await w(y),{folderService:r}=await T(Q.projCtx),w8=await r.readFolder(W,Q,{id:d});if(!w8)return{};return w8.getFields()},W6=async(y,{entityId:d,fieldDefinitionId:Q,fieldName:r})=>{let w8=await w(y),{transactionService:M8,rootStore:x8}=await T(w8.projCtx),Q8=await M8.deleteFieldValue(w8,{entityId:d,fieldDefinitionId:Q,fieldName:r});return x8.evictFolder(d),Q8},G6=async(y)=>{let d=await w(y),{exportService:Q}=await T(d.projCtx);return await Q.listExports(W,d,{projectPath:d.projectPath})},g6=async(y,{store:d="A"}={})=>{let Q=await w(y),{exportService:r}=await T(Q.projCtx);return await r.exportPreview(W,Q,{storeCode:d})},S1=async(y,{store:d="A",confirm:Q=!1}={})=>{let r=await w(y),{exportService:w8}=await T(r.projCtx);if(!Q)return await w8.exportPreview(W,r,{storeCode:d});return await w8.exportDocuments(W,r,{storeCode:d,projectPath:r.projectPath})},B1=async(y,{filename:d,store:Q="A"})=>{let r=await w(y);m.factory(!d,b.validation,"filename is required","FILENAME_REQUIRED");let{importService:w8}=await T(r.projCtx);return await w8.importDocuments(W,r,{filename:d,storeCode:Q,projectPath:r.projectPath})},o=async(y,{name:d,store:Q,state:r})=>{let w8=await w(y),{transactionService:M8}=await T(w8.projCtx);return await M8.createStory(w8,{name:d,storeCode:Q,state:r})},a=async(y,{store:d})=>{let Q=await w(y),{storyService:r}=await T(Q.projCtx);return await r.listStories(W,Q,{store:d})},F=async(y,{id:d})=>{let Q=await w(y),{storyService:r}=await T(Q.projCtx);return await r.getStory(W,Q,{id:d})},z8=async(y,{id:d,state:Q})=>{let r=await w(y),{transactionService:w8}=await T(r.projCtx);return await w8.updateStoryState(r,{id:d,state:Q})},s=async(y,{id:d})=>{let Q=await w(y),{transactionService:r}=await T(Q.projCtx);return await r.deleteStory(Q,{id:d})},H8=async(y,{storyId:d,state:Q})=>{let r=await w(y),{transactionService:w8}=await T(r.projCtx);return await w8.createStateFolder(r,{storyId:d,state:Q})},O8=async(y,{storyId:d})=>{let Q=await w(y),{storyService:r}=await T(Q.projCtx);return await r.listStateFolders(W,Q,{storyId:d})},G8=async(y,{mode:d,storyId:Q,storyPath:r,store:w8,state:M8})=>{let x8=await w(y),{transactionService:Q8}=await T(x8.projCtx);return await Q8.ensureStateFolder(x8,{mode:d,storyId:Q,storyPath:r,store:w8,state:M8})},F8=async(y,{store:d,buffer:Q,mimeType:r,originalFilename:w8,widthPx:M8,heightPx:x8,displayWidth:Q8,displayHeight:$6})=>{let r8=await w(y),{transactionService:m6}=await T(r8.projCtx);return await m6.createAsset(r8,{store:d,buffer:Q,mimeType:r,originalFilename:w8,widthPx:M8,heightPx:x8,displayWidth:Q8,displayHeight:$6})},M1=async(y,{id:d})=>{let Q=await w(y),{assetService:r}=await T(Q.projCtx);return await r.readAsset(W,Q,{id:d})},r1=async(y,{id:d})=>{let Q=await w(y),{assetService:r}=await T(Q.projCtx);return await r.readAssetBinary(W,Q,{id:d})},$1=async(y,{store:d})=>{let Q=await w(y),{assetService:r}=await T(Q.projCtx);return await r.listAssets(W,Q,{store:d})},g4=async(y,{id:d})=>{let Q=await w(y),{transactionService:r}=await T(Q.projCtx);return await r.deleteAsset(Q,{id:d})},m$=async(y,{name:d,agent:Q,model:r,prompt:w8,store:M8="A",workingDirectory:x8})=>{let Q8=await w(y),{transactionService:$6,jobService:r8,rootStore:m6}=await T(Q8.projCtx),z7=await $6.createJob(Q8,{store:M8,name:d,agent:Q,model:r,prompt:w8,workingDirectory:x8}),W7=$d.create({jobService:r8,transactionService:$6,store:m6,db:W,projectPath:Q8.projectPath});return setImmediate(async()=>{try{await W7.runJob(z7.id,Q8)}catch(m5){k5("JobRunner error for job %s: %s",z7.id,m5.message)}}),z7},B$=async(y,{store:d="A",status:Q})=>{let r=await w(y),{jobService:w8}=await T(r.projCtx);return await w8.listJobs(W,r,{store:d,status:Q})},I=async(y,{id:d})=>{let Q=await w(y),{jobService:r}=await T(Q.projCtx);return await r.getJob(W,Q,{id:d})},K8=async(y,{id:d})=>{let Q=await w(y),{transactionService:r}=await T(Q.projCtx);return await r.deleteJob(Q,{id:d})},L=async(y,{id:d,prompt:Q})=>{let r=await w(y),{transactionService:w8,jobService:M8,rootStore:x8}=await T(r.projCtx),Q8=await w8.continueJob(r,{id:d,prompt:Q}),$6=$d.create({jobService:M8,transactionService:w8,store:x8,db:W,projectPath:r.projectPath});return setImmediate(async()=>{try{await $6.runJob(Q8.id,r)}catch(r8){k5("JobRunner error for job %s: %s",Q8.id,r8.message)}}),Q8},c=async(y,{id:d,name:Q})=>{let r=await w(y),{transactionService:w8}=await T(r.projCtx);return await w8.renameJob(r,{id:d,name:Q})},B=async(y)=>{let d=await w(y),{worktreeService:Q}=await T(d.projCtx);return await Q.listWorktrees({projectPath:d.projectPath})},n=async(y,{branch:d,baseBranch:Q})=>{let r=await w(y),{worktreeService:w8}=await T(r.projCtx);return await w8.createWorktree({projectPath:r.projectPath,branch:d,baseBranch:Q})};if(J)J({db:W,projectStore:H,storeStore:Z});return Object.freeze({getProjects:v,getProjectByObjectId:j,createProject:x,validateProjectPath:D,createFolder:G,renameFolder:A,moveFolder:f,deleteFolder:k,getFolder:N,getFolderByPath:C,listFolderContents:E,getRootStore:i,evictProject:S,getDb:()=>W,createDocument:U,createTemplate:p,readDocument:e,readDocumentByPath:P8,updateDocumentPath:X8,deleteDocument:k8,saveDraft:L8,readDraft:A8,publishDocument:I8,discardDraft:c8,setEditState:_8,clearEditState:B8,getEditState:z6,readVersion:q6,getVersions:E6,editDocument:e8,batchEditDocument:i6,listDocuments:_6,renderTemplate:a1,getTemplateParameters:J7,createFieldDefinition:f3,readFieldDefinition:R8,getFieldDefinitions:h8,deleteFieldDefinition:E8,setField:S8,getFields:y8,deleteField:W6,listExports:G6,exportPreview:g6,exportDocuments:S1,importDocuments:B1,createStory:o,listStories:a,getStory:F,updateStoryState:z8,deleteStory:s,createStateFolder:H8,ensureStateFolder:G8,listStateFolders:O8,createAsset:F8,readAsset:M1,readAssetBinary:r1,listAssets:$1,deleteAsset:g4,createJob:m$,listJobs:B$,getJob:I,deleteJob:K8,continueJob:L,renameJob:c,listWorktrees:B,createWorktree:n,listCrons:()=>O.list(),startCron:(y)=>O.start(y),stopCron:(y)=>O.stop(y),restartCron:(y)=>O.restart(y),startAllCrons:()=>O.startAll(),stopAllCrons:()=>O.stopAll(),registerCronJob:(y,d)=>{O.register(y,d)}})},Gl8=Object.freeze({create:yP1});var vl8=f6(lL(),1);import{join as uP1}from"path";var mP1=($,{staticPath:K})=>{return $.use(vl8.default.static(K)),$.get("*",(q,Y,J)=>{if(q.path.startsWith("/api")||q.path==="/health")return J();Y.sendFile(uP1(K,"index.html"))}),Object.freeze({})},Vl8=Object.freeze({create:mP1});var Al8=f6(N4(),1),MD=Al8.default("caw:api:projects"),BP1=($,{core:K})=>{return $.get("/api/projects",async(q,Y)=>{try{MD("GET /api/projects - Fetching projects list");let J=await K.getProjects();MD("GET /api/projects - Returning %d projects",J.length),J.forEach((z)=>{MD(" - %s (%s) with %d children",z.name,z.objectId,z.children?.length||0)}),Y.json(J)}catch(J){MD("GET /api/projects - Error: %s",J.message),Y.status(500).json({error:J.message})}}),$.post("/api/projects/validate",async(q,Y)=>{try{let{path:J}=q.body,z=K.validateProjectPath(J);Y.json(z)}catch(J){if(J.code==="VALIDATION_ERROR")return Y.status(400).json({error:J.message,code:"VALIDATION_ERROR"});Y.status(500).json({error:J.message})}}),$.post("/api/projects",async(q,Y)=>{try{let{name:J,path:z}=q.body;if(!J||typeof J!=="string"||J.trim()==="")return Y.status(400).json({error:"Name is required",code:"VALIDATION_ERROR"});if(!z||typeof z!=="string"||z.trim()==="")return Y.status(400).json({error:"Path is required",code:"VALIDATION_ERROR"});if(J.length>255)return Y.status(400).json({error:"Name exceeds maximum length (255)",code:"VALIDATION_ERROR"});let W=await K.createProject({name:J.trim(),path:z.trim()});Y.status(201).json(W.toJSON())}catch(J){if(J.code==="DUPLICATE_PATH")return Y.status(409).json({error:J.message,code:"DUPLICATE_PATH"});console.error("Failed to create project:",J),Y.status(500).json({error:J.message})}}),Object.freeze({})},Ml8=Object.freeze({create:BP1});var kl8=f6(N4(),1);var UP1=($,K)=>{if($.isDomainError){let q=$.code==="UNAUTHORIZED"||$.code==="INVALID_TOKEN"?401:$.code==="NOT_FOUND"||$.code==="PROJECT_NOT_FOUND"||$.code==="EXPORT_NOT_FOUND"||$.code==="STORY_NOT_FOUND"||$.code==="JOB_NOT_FOUND"||$.code==="ASSET_NOT_FOUND"||$.code==="BLOB_NOT_FOUND"||$.code==="STORE_NOT_FOUND"?404:$.code==="CONFLICT"||$.code==="STORE_NOT_EMPTY"||$.code==="EDIT_CONFLICT"||$.code==="DUPLICATE_NAME"||$.code==="BRANCH_ALREADY_CHECKED_OUT"||$.code==="BRANCH_ALREADY_EXISTS"?409:$.code==="EXPORT_ERROR"||$.code==="STORY_ROOT_NOT_FOUND"?500:400;return K.status(q).json({error:$.message,code:$.code})}console.error("Unhandled error:",$),K.status(500).json({error:$.message})},i8=UP1;var rq=kl8.default("caw:api:folders"),_l8=($)=>({folders:$.folders.map((K)=>K.toJSON()),documents:$.documents.map((K)=>K.toJSON())}),pP1=($,{core:K})=>{return $.get("/api/p/:projectId/folders/contents",async(q,Y)=>{try{let{projectId:J}=q.params,{store:z,type:W}=q.query;rq("GET /api/p/%s/folders/contents - Listing root contents: store=%s, type=%s",J,z,W);let H=await K.listFolderContents(J,{folderId:null,store:z,type:W}),Z=_l8(H);rq("GET /api/p/%s/folders/contents - Found %d folders, %d documents",J,Z.folders.length,Z.documents.length),Y.json(Z)}catch(J){rq("GET /api/p/%s/folders/contents - Error: %s",q.params.projectId,J.message),i8(J,Y)}}),$.get("/api/p/:projectId/folders/by-path",async(q,Y)=>{try{let{projectId:J}=q.params,{path:z,store:W,type:H}=q.query,Z=await K.getFolderByPath(J,{path:z,store:W,type:H});if(!Z)return Y.status(404).json({error:"Not found"});Y.json(Z.toJSON())}catch(J){i8(J,Y)}}),$.get("/api/p/:projectId/folders/:id/contents",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,{type:W}=q.query;rq("GET /api/p/%s/folders/%s/contents - Listing folder contents: type=%s",J,z,W);let H=await K.listFolderContents(J,{folderId:z,type:W}),Z=_l8(H);rq("GET /api/p/%s/folders/%s/contents - Found %d folders, %d documents",J,z,Z.folders.length,Z.documents.length),Y.json(Z)}catch(J){rq("GET /api/p/%s/folders/%s/contents - Error: %s",q.params.projectId,q.params.id,J.message),i8(J,Y)}}),$.get("/api/p/:projectId/folders/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,W=await K.getFolder(J,{id:z});if(!W)return Y.status(404).json({error:"Not found",code:"NOT_FOUND"});Y.json(W.toJSON())}catch(J){i8(J,Y)}}),$.post("/api/p/:projectId/folders",async(q,Y)=>{try{let{projectId:J}=q.params,{path:z,store:W,root:H,parentId:Z,name:O}=q.body,X=z&&W&&!H&&!Z,P=H&&z&&!W&&!Z;if([X,P,Z&&O&&!z&&!H].filter(Boolean).length!==1)return Y.status(400).json({error:"Exactly one creation mode required: (path+store), (root+path), or (parentId+name)",code:"INVALID_PARAMS"});let v;if(X)v="fullPath";else if(P)v="rootRelative";else v="parentName";rq("POST /api/p/%s/folders - Creating folder: mode=%s, path=%s, store=%s, root=%s, parentId=%s, name=%s",J,v,z,W,H,Z,O);let j=await K.createFolder(J,{mode:v,path:z,store:W,root:H,parentId:Z,name:O});rq("POST /api/p/%s/folders - Folder created: id=%s, path=%s",J,j.getObjectId(),j.getPath()),Y.status(201).json(j.toJSON())}catch(J){rq("POST /api/p/%s/folders - Error: %s",q.params.projectId,J.message),i8(J,Y)}}),$.delete("/api/p/:projectId/folders/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,W=await K.deleteFolder(J,{id:z});Y.json(W)}catch(J){i8(J,Y)}}),$.patch("/api/p/:projectId/folders/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,{name:W,parentId:H}=q.body;if(W&&H)return Y.status(400).json({error:"Provide only name or parentId, not both",code:"INVALID_REQUEST"});if(!W&&!H)return Y.status(400).json({error:"Provide name or parentId",code:"INVALID_REQUEST"});let Z;if(W)Z=await K.renameFolder(J,{id:z,name:W});else Z=await K.moveFolder(J,{id:z,parentId:H});Y.json(Z.toJSON())}catch(J){i8(J,Y)}}),Object.freeze({})},fl8=Object.freeze({create:pP1});var cP1=($,{core:K})=>{return $.post("/api/p/:projectId/field-definitions",async(q,Y)=>{try{let{projectId:J}=q.params,{store:z,ownerEntityId:W,name:H,label:Z,description:O,primitiveType:X,required:P,multiplicity:w}=q.body,T=await K.createFieldDefinition(J,{store:z,ownerEntityId:W??null,name:H,label:Z??null,description:O??null,primitiveType:X,required:P??!1,multiplicity:w??"single"});Y.status(201).json(T.toJSON())}catch(J){i8(J,Y)}}),$.get("/api/p/:projectId/field-definitions/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,W=await K.readFieldDefinition(J,{id:z});if(!W)return Y.status(404).json({error:"Not found",code:"NOT_FOUND"});Y.json(W.toJSON())}catch(J){i8(J,Y)}}),$.get("/api/p/:projectId/field-definitions",async(q,Y)=>{try{let{projectId:J}=q.params,{store:z,ownerEntityId:W,includeSystem:H}=q.query,Z=await K.getFieldDefinitions(J,{store:z,ownerEntityId:W??null,includeSystem:H==="true"});Y.json(Z.map((O)=>O.toJSON()))}catch(J){i8(J,Y)}}),$.delete("/api/p/:projectId/field-definitions/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,W=await K.deleteFieldDefinition(J,{id:z});Y.json(W.toJSON())}catch(J){i8(J,Y)}}),$.put("/api/p/:projectId/entities/:id/fields/:fieldName",async(q,Y)=>{try{let{projectId:J,id:z,fieldName:W}=q.params,{fieldDefinitionId:H,value:Z,values:O}=q.body,X={entityId:z,fieldDefinitionId:H!==void 0?H:null,fieldName:W};if(Z!==void 0)X.value=Z;if(O!==void 0)X.values=O;await K.setField(J,X);let P=await K.getFolder(J,{id:z});Y.json({id:P.getObjectId(),parentId:P.getParentId(),name:P.getName(),path:P.getPath(),createdAt:P.getCreatedAt(),updatedAt:P.getUpdatedAt()})}catch(J){i8(J,Y)}}),$.get("/api/p/:projectId/entities/:id/fields",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,W=await K.getFields(J,{entityId:z}),H={};for(let[Z,O]of Object.entries(W))H[Z]=O.toJSON();Y.json(H)}catch(J){i8(J,Y)}}),$.delete("/api/p/:projectId/entities/:id/fields/:fieldName",async(q,Y)=>{try{let{projectId:J,id:z,fieldName:W}=q.params,{fieldDefinitionId:H}=q.query,Z={entityId:z,fieldName:W};if(H!==void 0)Z.fieldDefinitionId=H;await K.deleteField(J,Z),Y.status(204).send()}catch(J){i8(J,Y)}}),Object.freeze({})},Nl8=Object.freeze({create:cP1});var Rl8=f6(N4(),1);var iX=Rl8.default("caw:api:documents"),FP1=($,{core:K})=>{return $.post("/api/p/:projectId/documents",async(q,Y)=>{try{let{projectId:J}=q.params,{path:z,store:W,root:H,parentId:Z,name:O,content:X}=q.body,P=z&&W&&!H&&!Z,w=H&&z&&!W&&!Z;if([P,w,Z&&O&&!z&&!H].filter(Boolean).length!==1)return Y.status(400).json({error:"Exactly one creation mode required: (path+store), (root+path), or (parentId+name)",code:"INVALID_PARAMS"});let j;if(P)j="fullPath";else if(w)j="rootRelative";else j="parentName";iX("POST /api/p/%s/documents - Creating document: mode=%s, path=%s, store=%s, root=%s, parentId=%s, name=%s, hasContent=%s",J,j,z,W,H,Z,O,!!X);let A=(await K.createDocument(J,{mode:j,path:z,store:W,root:H,parentId:Z,name:O,content:X})).toJSON();iX("POST /api/p/%s/documents - Document created: id=%s, path=%s",J,A.id,A.path),Y.status(201).json(A)}catch(J){iX("POST /api/p/%s/documents - Error: %s",q.params.projectId,J.message),i8(J,Y)}}),$.post("/api/p/:projectId/templates",async(q,Y)=>{try{let{projectId:J}=q.params,{path:z,store:W,root:H,parentId:Z,name:O,content:X}=q.body,P=z&&W&&!H&&!Z,w=H&&z&&!W&&!Z;if([P,w,Z&&O&&!z&&!H].filter(Boolean).length!==1)return Y.status(400).json({error:"Exactly one creation mode required: (path+store), (root+path), or (parentId+name)",code:"INVALID_PARAMS"});let j;if(P)j="fullPath";else if(w)j="rootRelative";else j="parentName";iX("POST /api/p/%s/templates - Creating template: mode=%s, path=%s, store=%s, root=%s, parentId=%s, name=%s, hasContent=%s",J,j,z,W,H,Z,O,!!X);let A=(await K.createTemplate(J,{mode:j,path:z,store:W,root:H,parentId:Z,name:O,content:X})).toJSON();iX("POST /api/p/%s/templates - Template created: id=%s, path=%s",J,A.id,A.path),Y.status(201).json(A)}catch(J){iX("POST /api/p/%s/templates - Error: %s",q.params.projectId,J.message),i8(J,Y)}}),$.get("/api/p/:projectId/documents/by-path",async(q,Y)=>{try{let{projectId:J}=q.params,{path:z,store:W,type:H="d"}=q.query,Z=await K.readDocumentByPath(J,{path:z,store:W,type:H});if(!Z)return Y.status(404).json({error:"Not found",code:"NOT_FOUND"});let{entity:O,ancestorFolderIds:X}=Z;Y.json({...O.toJSON(),ancestorFolderIds:X})}catch(J){i8(J,Y)}}),$.get("/api/p/:projectId/documents",async(q,Y)=>{try{let{projectId:J}=q.params,{folderId:z,store:W,type:H="d"}=q.query,Z=await K.listDocuments(J,{folderId:z??null,store:W,type:H});Y.json(Z.map((O)=>O.toJSON()))}catch(J){i8(J,Y)}}),$.get("/api/p/:projectId/documents/:id/parameters",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,{entity:W}=await K.readDocument(J,{id:z});if(!W)return Y.status(404).json({error:"Not found",code:"NOT_FOUND"});let H=W.getPublishedContent();if(!H)return Y.json({id:z,parameters:{},target:null,targetPath:null,targetParentId:null,targetName:null,targetRoot:null,targetStore:null,detectedVariables:[]});try{let{parameters:Z,target:O,targetPath:X,targetParentId:P,targetName:w,targetRoot:T,targetStore:v}=ZK.getParameters(H),{body:j}=ZK.parseFrontMatter(H),G=Array.from(ZK.extractVariables(j));Y.json({id:z,parameters:Z,target:O,targetPath:X,targetParentId:P,targetName:w,targetRoot:T,targetStore:v,detectedVariables:G})}catch(Z){return Y.json({id:z,parameters:{},target:null,targetPath:null,targetParentId:null,targetName:null,targetRoot:null,targetStore:null,detectedVariables:[],parseError:Z.message})}}catch(J){i8(J,Y)}}),$.post("/api/p/:projectId/documents/:id/render",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,{params:W,target:H,targetOptions:Z}=q.body,O=await K.renderTemplate(J,{id:z,params:W,target:H,targetOptions:Z,sessionId:q.sessionId});Y.json(O)}catch(J){i8(J,Y)}}),$.get("/api/p/:projectId/documents/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,{entity:W,ancestorFolderIds:H}=await K.readDocument(J,{id:z});if(!W)return Y.status(404).json({error:"Not found",code:"NOT_FOUND"});Y.json({...W.toJSON(),ancestorFolderIds:H})}catch(J){i8(J,Y)}}),$.patch("/api/p/:projectId/documents/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,{path:W,parentId:H}=q.body,Z=d1.getTypeFromId(z),O=await K.updateDocumentPath(J,{id:z,path:W,parentId:H,type:Z});Y.json(O.toJSON())}catch(J){i8(J,Y)}}),$.delete("/api/p/:projectId/documents/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,W=await K.deleteDocument(J,{id:z});Y.json(W)}catch(J){i8(J,Y)}}),$.put("/api/p/:projectId/documents/:id/draft",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,{content:W}=q.body,H=q.sessionId;if(W===void 0)return Y.status(400).json({error:"content is required",code:"MISSING_CONTENT"});let Z=await K.saveDraft(J,{id:z,content:W,sessionId:H});Y.json({id:z,updated:!0,lockLost:Z.lockLost??!1})}catch(J){i8(J,Y)}}),$.get("/api/p/:projectId/documents/:id/draft",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,W=await K.readDraft(J,{id:z});Y.json(W)}catch(J){i8(J,Y)}}),$.post("/api/p/:projectId/documents/:id/publish",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,W=await K.publishDocument(J,{id:z,sessionId:q.sessionId});Y.json(W)}catch(J){i8(J,Y)}}),$.delete("/api/p/:projectId/documents/:id/draft",async(q,Y)=>{try{let{projectId:J,id:z}=q.params;await K.discardDraft(J,{id:z}),Y.json({id:z,discarded:!0})}catch(J){i8(J,Y)}}),$.get("/api/p/:projectId/documents/:id/versions",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,W=await K.getVersions(J,{id:z});Y.json(W)}catch(J){i8(J,Y)}}),$.get("/api/p/:projectId/documents/:id/versions/:versionNumber",async(q,Y)=>{try{let{projectId:J,id:z,versionNumber:W}=q.params,H=await K.readVersion(J,{id:z,versionNumber:parseInt(W,10)});if(!H)return Y.status(404).json({error:"Not found",code:"NOT_FOUND"});Y.json(H)}catch(J){i8(J,Y)}}),$.get("/api/p/:projectId/documents/:id/edit-state",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,W=await K.getEditState(J,{id:z});if(!W)return Y.json({locked:!1});Y.json({locked:!0,locked_at:W.startedAt})}catch(J){i8(J,Y)}}),$.post("/api/p/:projectId/documents/:id/edit-state",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,W=q.sessionId;if(!W)return Y.status(400).json({error:"X-Session-Id header required",code:"MISSING_SESSION_ID"});let H=await K.setEditState(J,{id:z,sessionId:W});if(!H.success)return Y.status(409).json(H);Y.json(H)}catch(J){i8(J,Y)}}),$.delete("/api/p/:projectId/documents/:id/edit-state",async(q,Y)=>{try{let{projectId:J,id:z}=q.params;await K.clearEditState(J,{id:z}),Y.json({success:!0})}catch(J){i8(J,Y)}}),Object.freeze({})},Cl8=Object.freeze({create:FP1});var Dl8=f6(N4(),1);var i3=Dl8.default("caw:api:export"),QP1=($,{core:K})=>{return $.get("/api/p/:projectId/exports",async(q,Y)=>{try{let{projectId:J}=q.params;i3("GET /api/p/%s/exports - Listing export files",J);let z=await K.listExports(J);i3("GET /api/p/%s/exports - Found %d export files",J,z.length),Y.json({ok:!0,exports:z})}catch(J){i3("GET /api/p/:projectId/exports - Error: %s",J.message),i8(J,Y)}}),$.get("/api/p/:projectId/export/preview",async(q,Y)=>{try{let{projectId:J}=q.params,{store:z}=q.query;i3("GET /api/p/%s/export/preview - Previewing export: store=%s",J,z);let W=await K.exportPreview(J,{store:z});i3("GET /api/p/%s/export/preview - Preview complete: %d to export, %d draft-only",J,(W.toExport?.folders?.length||0)+(W.toExport?.documents?.length||0)+(W.toExport?.templates?.length||0),(W.draftOnly?.documents?.length||0)+(W.draftOnly?.templates?.length||0)),Y.json(W)}catch(J){i3("GET /api/p/:projectId/export/preview - Error: %s",J.message),i8(J,Y)}}),$.post("/api/p/:projectId/export",async(q,Y)=>{try{let{projectId:J}=q.params,{store:z,confirm:W}=q.body;i3("POST /api/p/%s/export - Export request: store=%s, confirm=%s",J,z,W);let H=await K.exportDocuments(J,{store:z,confirm:W});if(W)i3("POST /api/p/%s/export - Export complete: %s",J,H.filename);else i3("POST /api/p/%s/export - Preview returned (confirm=false)",J);Y.json(H)}catch(J){i3("POST /api/p/:projectId/export - Error: %s",J.message),i8(J,Y)}}),$.post("/api/p/:projectId/import",async(q,Y)=>{try{let{projectId:J}=q.params,{filename:z,store:W}=q.body;i3("POST /api/p/%s/import - Import request: filename=%s, store=%s",J,z,W);let H=await K.importDocuments(J,{filename:z,store:W});i3("POST /api/p/%s/import - Import complete: %d folders, %d documents, %d templates",J,H.counts?.folders||0,H.counts?.documents||0,H.counts?.templates||0),Y.json({ok:!0,...H})}catch(J){i3("POST /api/p/:projectId/import - Error: %s",J.message),i8(J,Y)}}),Object.freeze({})},hl8=Object.freeze({create:QP1});var El8=f6(N4(),1);var C7=El8.default("caw:api:stories"),lP1=($,{core:K})=>{return $.post("/api/p/:projectId/stories",async(q,Y)=>{try{let{projectId:J}=q.params,{name:z,store:W="A",state:H="prep"}=q.body;C7("POST /api/p/%s/stories - Creating story: name=%s, store=%s, state=%s",J,z,W,H);let Z=await K.createStory(J,{name:z,store:W,state:H});Y.status(201).json(Z)}catch(J){C7("POST /api/p/%s/stories - Error: %s",q.params.projectId,J.message),i8(J,Y)}}),$.get("/api/p/:projectId/stories",async(q,Y)=>{try{let{projectId:J}=q.params,{store:z="A"}=q.query;C7("GET /api/p/%s/stories - Listing stories: store=%s",J,z);let W=await K.listStories(J,{store:z});Y.json(W)}catch(J){C7("GET /api/p/%s/stories - Error: %s",q.params.projectId,J.message),i8(J,Y)}}),$.get("/api/p/:projectId/stories/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params;C7("GET /api/p/%s/stories/%s - Getting story",J,z);let W=await K.getStory(J,{id:z});if(!W)return Y.status(404).json({error:"Not found",code:"NOT_FOUND"});Y.json(W)}catch(J){C7("GET /api/p/%s/stories/%s - Error: %s",q.params.projectId,q.params.id,J.message),i8(J,Y)}}),$.patch("/api/p/:projectId/stories/:id/state",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,{state:W}=q.body;if(!W)return Y.status(400).json({error:"State is required",code:"MISSING_STATE"});C7("PATCH /api/p/%s/stories/%s/state - Updating state to: %s",J,z,W);let H=await K.updateStoryState(J,{id:z,state:W});Y.json(H)}catch(J){C7("PATCH /api/p/%s/stories/%s/state - Error: %s",q.params.projectId,q.params.id,J.message),i8(J,Y)}}),$.delete("/api/p/:projectId/stories/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params;C7("DELETE /api/p/%s/stories/%s - Deleting story",J,z);let W=await K.deleteStory(J,{id:z});Y.json(W)}catch(J){C7("DELETE /api/p/%s/stories/%s - Error: %s",q.params.projectId,q.params.id,J.message),i8(J,Y)}}),$.get("/api/p/:projectId/stories/:id/states",async(q,Y)=>{try{let{projectId:J,id:z}=q.params;C7("GET /api/p/%s/stories/%s/states",J,z);let W=await K.listStateFolders(J,{storyId:z});Y.json(W)}catch(J){C7("GET states error: %s",J.message),i8(J,Y)}}),$.post("/api/p/:projectId/stories/:id/states",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,{state:W}=q.body;C7("POST /api/p/%s/stories/%s/states state=%s",J,z,W);let H=await K.createStateFolder(J,{storyId:z,state:W}),Z=H.created?201:200;Y.status(Z).json(H)}catch(J){C7("POST states error: %s",J.message),i8(J,Y)}}),$.post("/api/p/:projectId/stories/state-folders",async(q,Y)=>{try{let{projectId:J}=q.params,{storyId:z,storyPath:W,store:H,state:Z}=q.body;if(!Z)return Y.status(400).json({error:"state is required",code:"MISSING_STATE"});let O=z&&!W;if([O,W&&H&&!z].filter(Boolean).length!==1)return Y.status(400).json({error:"Exactly one mode required: (storyId) or (storyPath+store)",code:"INVALID_PARAMS"});let w;if(O)w="storyId";else w="storyPath";C7("POST /api/p/%s/stories/state-folders - mode=%s, storyId=%s, storyPath=%s, store=%s, state=%s",J,w,z,W,H,Z);let T=await K.ensureStateFolder(J,{mode:w,storyId:z,storyPath:W,store:H,state:Z}),v=T.created?201:200;Y.status(v).json(T)}catch(J){C7("POST /api/p/%s/stories/state-folders - Error: %s",q.params.projectId,J.message),i8(J,Y)}}),Object.freeze({})},Sl8=Object.freeze({create:lP1});var ed8=f6(N4(),1),UD=f6(sd8(),1);var cK=ed8.default("caw:api:assets"),td8=["image/png","image/jpeg","image/gif","image/webp"],xG1=UD.default({storage:UD.default.memoryStorage(),limits:{fileSize:10485760},fileFilter:($,K,q)=>{if(td8.includes(K.mimetype))q(null,!0);else q(Error(`Unsupported MIME type: ${K.mimetype}. Allowed: ${td8.join(", ")}`))}}),bG1=($,{core:K})=>{return $.post("/api/p/:projectId/assets",xG1.single("file"),async(q,Y)=>{try{let{projectId:J}=q.params,{store:z="A"}=q.query,W=q.file;if(!W)return Y.status(400).json({error:"No file uploaded",code:"MISSING_FILE"});let H=q.body.widthPx?parseInt(q.body.widthPx,10):void 0,Z=q.body.heightPx?parseInt(q.body.heightPx,10):void 0,O=q.body.displayWidth?parseInt(q.body.displayWidth,10):void 0,X=q.body.displayHeight?parseInt(q.body.displayHeight,10):void 0;cK("POST /api/p/%s/assets - Uploading: %s (%s, %d bytes)",J,W.originalname,W.mimetype,W.size);let P=await K.createAsset(J,{store:z,buffer:W.buffer,mimeType:W.mimetype,originalFilename:W.originalname,widthPx:H,heightPx:Z,displayWidth:O,displayHeight:X});Y.status(201).json(P)}catch(J){cK("POST /api/p/%s/assets - Error: %s",q.params.projectId,J.message),i8(J,Y)}}),$.get("/api/p/:projectId/assets/:id/binary",async(q,Y)=>{try{let{projectId:J,id:z}=q.params;cK("GET /api/p/%s/assets/%s/binary - Retrieving binary",J,z);let W=await K.readAssetBinary(J,{id:z});Y.set("Content-Type",W.mimeType),Y.set("Content-Length",W.sizeBytes),Y.set("Cache-Control","public, max-age=31536000, immutable"),Y.set("Content-Disposition",`inline; filename="${W.originalFilename}"`),Y.send(W.buffer)}catch(J){cK("GET /api/p/%s/assets/%s/binary - Error: %s",q.params.projectId,q.params.id,J.message),i8(J,Y)}}),$.get("/api/p/:projectId/assets/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params;cK("GET /api/p/%s/assets/%s - Retrieving metadata",J,z);let W=await K.readAsset(J,{id:z});Y.json(W)}catch(J){cK("GET /api/p/%s/assets/%s - Error: %s",q.params.projectId,q.params.id,J.message),i8(J,Y)}}),$.get("/api/p/:projectId/assets",async(q,Y)=>{try{let{projectId:J}=q.params,{store:z="A"}=q.query;cK("GET /api/p/%s/assets - Listing assets for store %s",J,z);let W=await K.listAssets(J,{store:z});Y.json(W)}catch(J){cK("GET /api/p/%s/assets - Error: %s",q.params.projectId,J.message),i8(J,Y)}}),$.delete("/api/p/:projectId/assets/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params;cK("DELETE /api/p/%s/assets/%s - Deleting asset",J,z);let W=await K.deleteAsset(J,{id:z});Y.json(W)}catch(J){cK("DELETE /api/p/%s/assets/%s - Error: %s",q.params.projectId,q.params.id,J.message),i8(J,Y)}}),$.use("/api/p/:projectId/assets",(q,Y,J,z)=>{if(q instanceof UD.default.MulterError){if(q.code==="LIMIT_FILE_SIZE")return J.status(400).json({error:"File too large. Maximum size is 10MB.",code:"FILE_TOO_LARGE"});return J.status(400).json({error:q.message,code:"UPLOAD_ERROR"})}if(q.message&&q.message.includes("Unsupported MIME type"))return J.status(400).json({error:q.message,code:"UNSUPPORTED_MIME_TYPE"});z(q)}),Object.freeze({})},$n8=Object.freeze({create:bG1});var Kn8=f6(N4(),1);var FK=Kn8.default("caw:api:jobs"),gG1=($,{core:K})=>{return $.post("/api/p/:projectId/jobs",async(q,Y)=>{try{let{projectId:J}=q.params,{name:z,agent:W,model:H,prompt:Z,store:O="A",workingDirectory:X}=q.body;FK("POST /api/p/%s/jobs - Creating job: agent=%s, model=%s, store=%s, workingDirectory=%s",J,W,H,O,X||"default");let P=await K.createJob(J,{name:z,agent:W,model:H,prompt:Z,store:O,workingDirectory:X});Y.status(201).json(P)}catch(J){FK("POST /api/p/%s/jobs - Error: %s",q.params.projectId,J.message),i8(J,Y)}}),$.get("/api/p/:projectId/jobs",async(q,Y)=>{try{let{projectId:J}=q.params,{store:z="A",status:W}=q.query;FK("GET /api/p/%s/jobs - Listing jobs: store=%s, status=%s",J,z,W||"all");let H=await K.listJobs(J,{store:z,status:W});Y.json(H)}catch(J){FK("GET /api/p/%s/jobs - Error: %s",q.params.projectId,J.message),i8(J,Y)}}),$.get("/api/p/:projectId/jobs/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params;FK("GET /api/p/%s/jobs/%s - Getting job",J,z);let W=await K.getJob(J,{id:z});if(!W)return Y.status(404).json({error:"Not found",code:"NOT_FOUND"});Y.json(W)}catch(J){FK("GET /api/p/%s/jobs/%s - Error: %s",q.params.projectId,q.params.id,J.message),i8(J,Y)}}),$.post("/api/p/:projectId/jobs/:id/continue",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,{prompt:W}=q.body;FK("POST /api/p/%s/jobs/%s/continue - Continuing job",J,z);let H=await K.continueJob(J,{id:z,prompt:W});Y.json(H)}catch(J){FK("POST /api/p/%s/jobs/%s/continue - Error: %s",q.params.projectId,q.params.id,J.message),i8(J,Y)}}),$.patch("/api/p/:projectId/jobs/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,{name:W}=q.body;FK("PATCH /api/p/%s/jobs/%s - Renaming job",J,z);let H=await K.renameJob(J,{id:z,name:W});Y.json(H)}catch(J){FK("PATCH /api/p/%s/jobs/%s - Error: %s",q.params.projectId,q.params.id,J.message),i8(J,Y)}}),Object.freeze({})},qn8=Object.freeze({create:gG1});var Yn8=f6(N4(),1);var $P=Yn8.default("caw:api:worktrees"),yG1=($,{core:K})=>{return $.get("/api/p/:projectId/worktrees",async(q,Y)=>{try{let{projectId:J}=q.params;$P("GET /api/p/%s/worktrees - Listing worktrees",J);let z=await K.listWorktrees(J);$P("GET /api/p/%s/worktrees - Found %d worktrees, isGitProject=%s",J,z.worktrees.length,z.isGitProject),Y.json(z)}catch(J){$P("GET /api/p/%s/worktrees - Error: %s",q.params.projectId,J.message),i8(J,Y)}}),$.post("/api/p/:projectId/worktrees",async(q,Y)=>{try{let{projectId:J}=q.params,{branch:z,baseBranch:W}=q.body;$P("POST /api/p/%s/worktrees - Creating worktree: branch=%s, baseBranch=%s",J,z,W||"default");let H=await K.createWorktree(J,{branch:z,baseBranch:W});$P("POST /api/p/%s/worktrees - Created worktree at %s for branch %s",J,H.path,H.branch),Y.status(201).json(H)}catch(J){$P("POST /api/p/%s/worktrees - Error: %s",q.params.projectId,J.message),i8(J,Y)}}),Object.freeze({})},Jn8=Object.freeze({create:yG1});var zn8=f6(N4(),1);var pD=zn8.default("caw:api:events"),uG1=($,{core:K})=>{return $.get("/api/p/:projectId/events",async(q,Y)=>{try{let{projectId:J}=q.params;pD("GET /api/p/%s/events - Client connecting",J);let z=await K.getRootStore(J);pD("GET /api/p/%s/events - Got root store, setting up SSE subscription",J),Y.setHeader("Content-Type","text/event-stream"),Y.setHeader("Cache-Control","no-cache"),Y.setHeader("Connection","keep-alive"),Y.flushHeaders(),Y.write(`: connected
|
|
565
|
+
`),z={path:null,commit:null,branch:null,isLocked:!1,isMain:!1};for(let W of J)if(W.startsWith("worktree "))z.path=W.slice(9);else if(W.startsWith("HEAD "))z.commit=W.slice(5);else if(W.startsWith("branch ")){let H=W.slice(7);z.branch=H.replace("refs/heads/","")}else if(W==="detached");else if(W==="locked")z.isLocked=!0;else if(W.startsWith("locked "))z.isLocked=!0;if(z.path)K.push(z)}if(K.length>0)K[0].isMain=!0;return K},lX=($,K)=>{return new Promise((q)=>{let Y=IP1("git",$,{cwd:K}),J="",z="";Y.stdout.on("data",(W)=>{J+=W.toString()}),Y.stderr.on("data",(W)=>{z+=W.toString()}),Y.on("close",(W)=>{q({stdout:J,stderr:z,exitCode:W})}),Y.on("error",(W)=>{if(W.code==="ENOENT")q({stdout:"",stderr:"git: command not found",exitCode:-1,enoent:!0});else q({stdout:"",stderr:W.message,exitCode:-1})})})},gP1=()=>{let $=async({projectPath:Y})=>{m.factory(!Y,b.validation,"projectPath is required","MISSING_PROJECT_PATH"),X4("listWorktrees: Running git worktree list --porcelain in %s",Y);let J=await lX(["worktree","list","--porcelain"],Y);if(J.enoent)throw X4("listWorktrees: Git not found"),b.validation("Git not installed or not found in PATH","GIT_NOT_FOUND");if(J.stderr&&J.stderr.includes("not a git repository"))return X4("listWorktrees: Not a git repository"),{worktrees:[],isGitProject:!1};if(J.exitCode!==0)throw X4("listWorktrees: Git command failed with exit code %d: %s",J.exitCode,J.stderr),Error(`Git worktree list failed: ${J.stderr||"Unknown error"}`);let z=bP1(J.stdout);X4("listWorktrees: Parsed %d worktrees",z.length);let W=z.filter((H)=>!H.isMain).map((H)=>({branch:H.branch,path:H.path,commit:H.commit,isLocked:H.isLocked}));return X4("listWorktrees: Returning %d worktrees (excluding main)",W.length),{worktrees:W,isGitProject:!0}},K=async(Y)=>{if(X4("getDefaultBaseBranch: Checking for main branch in %s",Y),(await lX(["show-ref","--verify","--quiet","refs/heads/main"],Y)).exitCode===0)return X4("getDefaultBaseBranch: Detected default branch: main"),"main";if(X4("getDefaultBaseBranch: main not found, checking for master branch"),(await lX(["show-ref","--verify","--quiet","refs/heads/master"],Y)).exitCode===0)return X4("getDefaultBaseBranch: Detected default branch: master"),"master";throw X4("getDefaultBaseBranch: Neither main nor master branch found"),b.validation("No default branch found (neither main nor master exists)","NO_DEFAULT_BRANCH")};return Object.freeze({listWorktrees:$,createWorktree:async({projectPath:Y,branch:J,baseBranch:z})=>{m.factory(!Y,b.validation,"projectPath is required","MISSING_PROJECT_PATH"),m.factory(!J,b.validation,"branch is required","MISSING_BRANCH"),X4("createWorktree: Creating worktree for branch %s in %s",J,Y),X4("createWorktree: Validating branch name: %s",J);let W=await lX(["check-ref-format","--branch",J],Y);if(W.enoent)throw X4("createWorktree: Git not found"),b.validation("Git not installed or not found in PATH","GIT_NOT_FOUND");if(W.exitCode!==0)throw X4("createWorktree: Invalid branch name: %s",J),b.validation(`Invalid branch name: ${J}`,"INVALID_BRANCH_NAME");let H=z;if(!H){X4("createWorktree: No baseBranch provided, detecting default");try{H=await K(Y)}catch(X){if(X.code==="NO_DEFAULT_BRANCH"){let P=await lX(["status","--porcelain"],Y);if(P.stderr&&P.stderr.includes("not a git repository"))throw X4("createWorktree: Not a git repository"),b.validation("Not a git repository","NOT_GIT_REPOSITORY")}throw X}}let Z=xP1(Y,"worktree",J);X4("createWorktree: Worktree path will be: %s",Z),X4("createWorktree: Running git worktree add %s -b %s %s",Z,J,H);let O=await lX(["worktree","add",Z,"-b",J,H],Y);if(O.enoent)throw X4("createWorktree: Git not found"),b.validation("Git not installed or not found in PATH","GIT_NOT_FOUND");if(O.stderr&&O.stderr.includes("not a git repository"))throw X4("createWorktree: Not a git repository"),b.validation("Not a git repository","NOT_GIT_REPOSITORY");if(O.stderr&&O.stderr.includes("is already checked out"))throw X4("createWorktree: Branch %s is already checked out",J),b.conflict(`Branch '${J}' is already checked out in another worktree`,"BRANCH_ALREADY_CHECKED_OUT");if(O.stderr&&O.stderr.includes("already exists"))throw X4("createWorktree: Branch %s already exists",J),b.conflict(`Branch '${J}' already exists`,"BRANCH_ALREADY_EXISTS");if(O.exitCode!==0)throw X4("createWorktree: Git worktree add failed with exit code %d: %s",O.exitCode,O.stderr),Error(`Git worktree add failed: ${O.stderr||"Unknown error"}`);return X4("createWorktree: Successfully created worktree at %s for branch %s",Z,J),{path:Z,branch:J}},getDefaultBaseBranch:K})};var Tl8=Object.freeze({create:gP1});var k5=jl8.default("caw:core"),yP1=async({databaseFilepath:$,assetsDir:K,lazilyCreateDb:q,kyselyFactory:Y},J)=>{let W=await yX8.create({kyselyFactory:Y}).getDb($,q),H=BX8.create(),Z=YP8.create(),O=vB8.create({db:W}),X=eQ8.create(),P=new Map,w=async(y)=>{if(!y||!/^P\d+$/.test(y))m.factory(!0,b.notFound,`Project not found: ${y}`,"PROJECT_NOT_FOUND");let d=parseInt(y.slice(1),10);m.factory(d<1||d>Number.MAX_SAFE_INTEGER,b.notFound,`Project not found: ${y}`,"PROJECT_NOT_FOUND");let Q=await H.readProjectByObjectId(W,null,y);return m.factory(!Q,b.notFound,`Project not found: ${y}`,"PROJECT_NOT_FOUND"),{projCtx:Q.getObjectId(),projectPath:Q.getPath(),authCtx:null}},T=async(y)=>{let d=P.get(y);if(d)return d;let Q=await Z.readRootStoreForProject(W,{},y),r=JP8.create({store:Q}),w8=zP8.create({store:Q}),M8=lT8.create(),x8=QT8.create({store:Q,folderService:r,documentHooks:M8}),Q8=VV8.create(),$6=ql8.create({store:Q,fieldService:w8}),r8=Wl8.create({store:Q,assetsDir:K}),m6=Xl8.create({store:Q,fieldService:w8}),z7=Tl8.create(),W7=Im.create({db:W,folderService:r,fieldService:w8,documentService:x8,templateService:Q8,projectService:null,clipboardService:X,storyService:$6,assetService:r8,jobService:m6}),m5=Sm8.create({store:Q,folderService:r,documentService:x8,templateService:Q8,assetService:r8,assetsDir:K}),sW=wB8.create({store:Q,folderService:r,documentService:x8,templateService:Q8,assetService:r8,assetsDir:K}),cv={folderService:r,fieldService:w8,documentService:x8,templateService:Q8,transactionService:W7,exportService:m5,importService:sW,rootStore:Q,storyService:$6,assetService:r8,jobService:m6,worktreeService:z7};return P.set(y,cv),cv},v=async()=>{return await Lk.create({projectStore:H,storeStore:Z}).listProjects(W)},j=async(y)=>{if(!y||!/^P\d+$/.test(y))return null;let d=parseInt(y.slice(1),10);if(d<1||d>Number.MAX_SAFE_INTEGER)return null;return await H.readProjectByObjectId(W,null,y)},G=async(y,{mode:d,store:Q,path:r,root:w8,parentId:M8,name:x8,type:Q8})=>{let $6=await w(y),{transactionService:r8}=await T($6.projCtx);return await r8.createFolder($6,{mode:d,store:Q,path:r,root:w8,parentId:M8,name:x8,type:Q8})},A=async(y,{id:d,name:Q})=>{let r=await w(y),{transactionService:w8}=await T(r.projCtx);return await w8.renameFolder(r,{id:d,name:Q})},f=async(y,{id:d,parentId:Q})=>{let r=await w(y),{transactionService:w8}=await T(r.projCtx);return await w8.moveFolder(r,{id:d,parentId:Q})},k=async(y,{id:d})=>{let Q=await w(y),{transactionService:r}=await T(Q.projCtx);return await r.deleteFolder(Q,{id:d})},N=async(y,{id:d})=>{let Q=await w(y),{folderService:r}=await T(Q.projCtx);return await r.readFolder(W,Q,{id:d})},C=async(y,{store:d,path:Q,type:r})=>{let w8=await w(y),{folderService:M8}=await T(w8.projCtx);return await M8.getFolderByPath(W,w8,{path:Q,type:r,storeCode:d})},E=async(y,{folderId:d,store:Q,type:r})=>{let w8=await w(y);k5("listFolderContents: Listing contents for project %s: folderId=%s, store=%s, type=%s",w8.projCtx,d||"root",Q,r);let{folderService:M8,documentService:x8,rootStore:Q8}=await T(w8.projCtx),$6=r;if(d&&!r)$6=await h(W,Q8,w8,d,Q),k5("listFolderContents: Inferred type %s from folder %s",$6,d);let r8=await M8.listFolderContents(W,w8,{folderId:d,storeCode:Q,type:$6}),m6=d;if((d===null||d===void 0)&&($6==="d"||$6==="t"))m6=(await Q8.readRootFolderForType(W,w8,$6,Q)).getObjectId(),k5("listFolderContents: Resolved root folder for type %s: %s",$6,m6);k5("listFolderContents: Querying content with parentId=%s, store=%s, type=%s",m6,Q,$6);let z7=await x8.listDocuments(W,w8,{parentId:m6,storeCode:Q,type:$6});return k5("listFolderContents: Found %d folders, %d documents",r8?.length||0,z7?.length||0),{folders:r8,documents:z7}},h=async(y,d,Q,r,w8)=>{let M8=await d.readFolder(y,Q,{id:r});if(!M8)return null;let x8=await y.selectFrom("entities").innerJoin("entity_types","entities.entity_type_id","entity_types.id").select(["entity_types.code as entity_type_code","entity_types.subtype as entity_type_subtype"]).where("entities.object_id","=",r).executeTakeFirst();if(x8?.entity_type_code==="f"&&x8?.entity_type_subtype==="root_d")return"d";if(x8?.entity_type_code==="f"&&x8?.entity_type_subtype==="root_t")return"t";if(x8?.entity_type_code==="f"&&(x8?.entity_type_subtype==="root_s"||x8?.entity_type_subtype==="state_folder"))return"d";let Q8=await d.readRootFolderForType(y,Q,"d",w8),$6=await d.readRootFolderForType(y,Q,"t",w8),r8=M8;while(r8&&r8.getParentId()!==null){let m6=await d.readFolder(y,Q,{id:r8.getParentId()});if(!m6)break;r8=m6}if(r8&&r8.getObjectId()===Q8?.getObjectId())return"d";else if(r8&&r8.getObjectId()===$6?.getObjectId())return"t";return null},i=async(y)=>{let d=await w(y),{rootStore:Q}=await T(d.projCtx);return Q},x=async({name:y,path:d})=>{let Q=Lk.create({projectStore:H,storeStore:Z}),r=Im.create({db:W,folderService:null,projectService:Q}),w8={};return await r.createProject(w8,{name:y,path:d})},D=(y)=>{return Lk.create({projectStore:H,storeStore:Z}).validateProjectPath(y)},S=(y)=>{P.delete(y)},U=async(y,{mode:d,store:Q,path:r,root:w8,parentId:M8,name:x8,type:Q8,content:$6,tree:r8})=>{let m6=await w(y);k5("createDocument: Creating document in project %s: mode=%s, path=%s, store=%s, type=%s",m6.projCtx,d,r,Q,Q8);let{transactionService:z7}=await T(m6.projCtx),W7=await z7.createDocument(m6,{mode:d,store:Q,path:r,root:w8,parentId:M8,name:x8,type:Q8,content:$6,tree:r8});return k5("createDocument: Document created: id=%s, path=%s",W7.getObjectId(),W7.getPath()),W7},p=async(y,{mode:d,store:Q,path:r,root:w8,parentId:M8,name:x8,content:Q8})=>{let $6=await w(y);k5("createTemplate: Creating template in project %s: mode=%s, path=%s, store=%s",$6.projCtx,d,r,Q);let{transactionService:r8}=await T($6.projCtx),m6=await r8.createTemplate($6,{mode:d,store:Q,path:r,root:w8,parentId:M8,name:x8,content:Q8});return k5("createTemplate: Template created: id=%s, path=%s",m6.getObjectId(),m6.getPath()),m6},e=async(y,{id:d})=>{let Q=await w(y),{documentService:r}=await T(Q.projCtx);return await r.readDocument(W,Q,{id:d})},P8=async(y,{path:d,store:Q,type:r})=>{let w8=await w(y),{documentService:M8}=await T(w8.projCtx);return await M8.readDocumentByPath(W,w8,{path:d,type:r,storeCode:Q})},X8=async(y,{id:d,path:Q,parentId:r,type:w8})=>{let M8=await w(y),{transactionService:x8}=await T(M8.projCtx);return await x8.updateDocumentPath(M8,{id:d,path:Q,parentId:r,type:w8})},k8=async(y,{id:d})=>{let Q=await w(y),{transactionService:r}=await T(Q.projCtx);return await r.deleteDocument(Q,{id:d})},L8=async(y,{id:d,content:Q,sessionId:r})=>{let w8=await w(y),{transactionService:M8}=await T(w8.projCtx);return await M8.saveDraft(w8,{id:d,content:Q,sessionId:r})},A8=async(y,{id:d})=>{let Q=await w(y),{documentService:r}=await T(Q.projCtx);return await r.readDraft(W,Q,{id:d})},I8=async(y,{id:d,sessionId:Q})=>{let r=await w(y),{transactionService:w8}=await T(r.projCtx);return await w8.publishDocument(r,{id:d,sessionId:Q})},c8=async(y,{id:d})=>{let Q=await w(y),{transactionService:r}=await T(Q.projCtx);return await r.discardDraft(Q,{id:d})},_8=async(y,{id:d,sessionId:Q})=>{let r=await w(y),{transactionService:w8}=await T(r.projCtx);return await w8.setEditState(r,{id:d,sessionId:Q})},B8=async(y,{id:d})=>{let Q=await w(y),{transactionService:r}=await T(Q.projCtx);return await r.clearEditState(Q,{id:d})},z6=async(y,{id:d})=>{let Q=await w(y),{documentService:r}=await T(Q.projCtx);return await r.getEditState(W,Q,{id:d})},q6=async(y,{id:d,versionNumber:Q})=>{let r=await w(y),{documentService:w8}=await T(r.projCtx);return await w8.readVersion(W,r,{id:d,versionNumber:Q})},E6=async(y,{id:d})=>{let Q=await w(y),{documentService:r}=await T(Q.projCtx);return await r.getVersions(W,Q,{id:d})},e8=async(y,{id:d,operation:Q,preview:r,ignoreContent:w8,sessionId:M8})=>{let x8=await w(y),{transactionService:Q8}=await T(x8.projCtx);return await Q8.editDocument(x8,{id:d,operation:Q,preview:r,ignoreContent:w8,sessionId:M8})},i6=async(y,{id:d,operations:Q,preview:r,ignoreContent:w8,sessionId:M8})=>{let x8=await w(y),{transactionService:Q8}=await T(x8.projCtx);return await Q8.batchEditDocument(x8,{id:d,operations:Q,preview:r,ignoreContent:w8,sessionId:M8})},_6=async(y,{folderId:d,store:Q,type:r="d"})=>{let w8=await w(y),{documentService:M8}=await T(w8.projCtx);return await M8.listDocuments(W,w8,{parentId:d,storeCode:Q,type:r})},a1=async(y,{id:d,params:Q,target:r,targetOptions:w8,sessionId:M8})=>{let x8=await w(y),{transactionService:Q8}=await T(x8.projCtx);return await Q8.renderTemplate(x8,{id:d,params:Q,target:r,targetOptions:w8,sessionId:M8})},J7=async(y,{id:d})=>{let Q=await w(y),{documentService:r,templateService:w8}=await T(Q.projCtx),{entity:M8}=await r.readDocument(W,Q,{id:d});if(!M8.getPublishedContent())return{parameters:{},detectedVariables:[],target:null,targetPath:null};return w8.extractTemplateParameters(M8.getPublishedContent())},f3=async(y,{store:d,ownerEntityId:Q,name:r,label:w8,description:M8,primitiveType:x8,required:Q8,multiplicity:$6,isSystem:r8})=>{let m6=await w(y),{transactionService:z7}=await T(m6.projCtx);return await z7.createFieldDefinition(m6,{store:d,ownerEntityId:Q,name:r,label:w8,description:M8,primitiveType:x8,required:Q8,multiplicity:$6,isSystem:r8})},R8=async(y,{id:d})=>{let Q=await w(y),{fieldService:r}=await T(Q.projCtx);return await r.readFieldDefinition(W,Q,{id:d})},h8=async(y,{store:d,ownerEntityId:Q,includeSystem:r})=>{let w8=await w(y),{fieldService:M8}=await T(w8.projCtx);return await M8.getFieldDefinitionsForOwner(W,w8,{store:d,ownerEntityId:Q,includeSystem:r})},E8=async(y,{id:d})=>{let Q=await w(y),{transactionService:r}=await T(Q.projCtx);return await r.deleteFieldDefinition(Q,{id:d})},S8=async(y,{entityId:d,fieldDefinitionId:Q,fieldName:r,value:w8,values:M8})=>{let x8=await w(y),{transactionService:Q8,rootStore:$6}=await T(x8.projCtx),r8=await Q8.setFieldValue(x8,{entityId:d,fieldDefinitionId:Q,fieldName:r,value:w8,values:M8});return $6.evictFolder(d),r8},y8=async(y,{entityId:d})=>{let Q=await w(y),{folderService:r}=await T(Q.projCtx),w8=await r.readFolder(W,Q,{id:d});if(!w8)return{};return w8.getFields()},W6=async(y,{entityId:d,fieldDefinitionId:Q,fieldName:r})=>{let w8=await w(y),{transactionService:M8,rootStore:x8}=await T(w8.projCtx),Q8=await M8.deleteFieldValue(w8,{entityId:d,fieldDefinitionId:Q,fieldName:r});return x8.evictFolder(d),Q8},G6=async(y)=>{let d=await w(y),{exportService:Q}=await T(d.projCtx);return await Q.listExports(W,d,{projectPath:d.projectPath})},g6=async(y,{store:d="A"}={})=>{let Q=await w(y),{exportService:r}=await T(Q.projCtx);return await r.exportPreview(W,Q,{storeCode:d})},S1=async(y,{store:d="A",confirm:Q=!1}={})=>{let r=await w(y),{exportService:w8}=await T(r.projCtx);if(!Q)return await w8.exportPreview(W,r,{storeCode:d});return await w8.exportDocuments(W,r,{storeCode:d,projectPath:r.projectPath})},B1=async(y,{filename:d,store:Q="A"})=>{let r=await w(y);m.factory(!d,b.validation,"filename is required","FILENAME_REQUIRED");let{importService:w8}=await T(r.projCtx);return await w8.importDocuments(W,r,{filename:d,storeCode:Q,projectPath:r.projectPath})},o=async(y,{name:d,store:Q,state:r})=>{let w8=await w(y),{transactionService:M8}=await T(w8.projCtx);return await M8.createStory(w8,{name:d,storeCode:Q,state:r})},a=async(y,{store:d})=>{let Q=await w(y),{storyService:r}=await T(Q.projCtx);return await r.listStories(W,Q,{store:d})},F=async(y,{id:d})=>{let Q=await w(y),{storyService:r}=await T(Q.projCtx);return await r.getStory(W,Q,{id:d})},z8=async(y,{id:d,state:Q})=>{let r=await w(y),{transactionService:w8}=await T(r.projCtx);return await w8.updateStoryState(r,{id:d,state:Q})},s=async(y,{id:d})=>{let Q=await w(y),{transactionService:r}=await T(Q.projCtx);return await r.deleteStory(Q,{id:d})},H8=async(y,{storyId:d,state:Q})=>{let r=await w(y),{transactionService:w8}=await T(r.projCtx);return await w8.createStateFolder(r,{storyId:d,state:Q})},O8=async(y,{storyId:d})=>{let Q=await w(y),{storyService:r}=await T(Q.projCtx);return await r.listStateFolders(W,Q,{storyId:d})},G8=async(y,{mode:d,storyId:Q,storyPath:r,store:w8,state:M8})=>{let x8=await w(y),{transactionService:Q8}=await T(x8.projCtx);return await Q8.ensureStateFolder(x8,{mode:d,storyId:Q,storyPath:r,store:w8,state:M8})},F8=async(y,{store:d,buffer:Q,mimeType:r,originalFilename:w8,widthPx:M8,heightPx:x8,displayWidth:Q8,displayHeight:$6})=>{let r8=await w(y),{transactionService:m6}=await T(r8.projCtx);return await m6.createAsset(r8,{store:d,buffer:Q,mimeType:r,originalFilename:w8,widthPx:M8,heightPx:x8,displayWidth:Q8,displayHeight:$6})},M1=async(y,{id:d})=>{let Q=await w(y),{assetService:r}=await T(Q.projCtx);return await r.readAsset(W,Q,{id:d})},r1=async(y,{id:d})=>{let Q=await w(y),{assetService:r}=await T(Q.projCtx);return await r.readAssetBinary(W,Q,{id:d})},$1=async(y,{store:d})=>{let Q=await w(y),{assetService:r}=await T(Q.projCtx);return await r.listAssets(W,Q,{store:d})},g4=async(y,{id:d})=>{let Q=await w(y),{transactionService:r}=await T(Q.projCtx);return await r.deleteAsset(Q,{id:d})},m$=async(y,{name:d,agent:Q,model:r,prompt:w8,store:M8="A",workingDirectory:x8})=>{let Q8=await w(y),{transactionService:$6,jobService:r8,rootStore:m6}=await T(Q8.projCtx),z7=await $6.createJob(Q8,{store:M8,name:d,agent:Q,model:r,prompt:w8,workingDirectory:x8}),W7=$d.create({jobService:r8,transactionService:$6,store:m6,db:W,projectPath:Q8.projectPath});return setImmediate(async()=>{try{await W7.runJob(z7.id,Q8)}catch(m5){k5("JobRunner error for job %s: %s",z7.id,m5.message)}}),z7},B$=async(y,{store:d="A",status:Q})=>{let r=await w(y),{jobService:w8}=await T(r.projCtx);return await w8.listJobs(W,r,{store:d,status:Q})},I=async(y,{id:d})=>{let Q=await w(y),{jobService:r}=await T(Q.projCtx);return await r.getJob(W,Q,{id:d})},K8=async(y,{id:d})=>{let Q=await w(y),{transactionService:r}=await T(Q.projCtx);return await r.deleteJob(Q,{id:d})},L=async(y,{id:d,prompt:Q})=>{let r=await w(y),{transactionService:w8,jobService:M8,rootStore:x8}=await T(r.projCtx),Q8=await w8.continueJob(r,{id:d,prompt:Q}),$6=$d.create({jobService:M8,transactionService:w8,store:x8,db:W,projectPath:r.projectPath});return setImmediate(async()=>{try{await $6.runJob(Q8.id,r)}catch(r8){k5("JobRunner error for job %s: %s",Q8.id,r8.message)}}),Q8},c=async(y,{id:d,name:Q})=>{let r=await w(y),{transactionService:w8}=await T(r.projCtx);return await w8.renameJob(r,{id:d,name:Q})},B=async(y)=>{let d=await w(y),{worktreeService:Q}=await T(d.projCtx);return await Q.listWorktrees({projectPath:d.projectPath})},n=async(y,{branch:d,baseBranch:Q})=>{let r=await w(y),{worktreeService:w8}=await T(r.projCtx);return await w8.createWorktree({projectPath:r.projectPath,branch:d,baseBranch:Q})};if(J)J({db:W,projectStore:H,storeStore:Z});return Object.freeze({getProjects:v,getProjectByObjectId:j,createProject:x,validateProjectPath:D,createFolder:G,renameFolder:A,moveFolder:f,deleteFolder:k,getFolder:N,getFolderByPath:C,listFolderContents:E,getRootStore:i,evictProject:S,getDb:()=>W,createDocument:U,createTemplate:p,readDocument:e,readDocumentByPath:P8,updateDocumentPath:X8,deleteDocument:k8,saveDraft:L8,readDraft:A8,publishDocument:I8,discardDraft:c8,setEditState:_8,clearEditState:B8,getEditState:z6,readVersion:q6,getVersions:E6,editDocument:e8,batchEditDocument:i6,listDocuments:_6,renderTemplate:a1,getTemplateParameters:J7,createFieldDefinition:f3,readFieldDefinition:R8,getFieldDefinitions:h8,deleteFieldDefinition:E8,setField:S8,getFields:y8,deleteField:W6,listExports:G6,exportPreview:g6,exportDocuments:S1,importDocuments:B1,createStory:o,listStories:a,getStory:F,updateStoryState:z8,deleteStory:s,createStateFolder:H8,ensureStateFolder:G8,listStateFolders:O8,createAsset:F8,readAsset:M1,readAssetBinary:r1,listAssets:$1,deleteAsset:g4,createJob:m$,listJobs:B$,getJob:I,deleteJob:K8,continueJob:L,renameJob:c,listWorktrees:B,createWorktree:n,listCrons:()=>O.list(),startCron:(y)=>O.start(y),stopCron:(y)=>O.stop(y),restartCron:(y)=>O.restart(y),startAllCrons:()=>O.startAll(),stopAllCrons:()=>O.stopAll(),registerCronJob:(y,d)=>{O.register(y,d)}})},Gl8=Object.freeze({create:yP1});var vl8=f6(lL(),1);import{join as uP1}from"path";var mP1=($,{staticPath:K})=>{return $.use(vl8.default.static(K)),$.get("*",(q,Y,J)=>{if(q.path.startsWith("/api")||q.path==="/health")return J();Y.sendFile(uP1(K,"index.html"))}),Object.freeze({})},Vl8=Object.freeze({create:mP1});var Al8=f6(N4(),1),MD=Al8.default("caw:api:projects"),BP1=($,{core:K})=>{return $.get("/api/projects",async(q,Y)=>{try{MD("GET /api/projects - Fetching projects list");let J=await K.getProjects();MD("GET /api/projects - Returning %d projects",J.length),J.forEach((z)=>{MD(" - %s (%s) with %d children",z.name,z.objectId,z.children?.length||0)}),Y.json(J)}catch(J){MD("GET /api/projects - Error: %s",J.message),Y.status(500).json({error:J.message})}}),$.post("/api/projects/validate",async(q,Y)=>{try{let{path:J}=q.body,z=K.validateProjectPath(J);Y.json(z)}catch(J){if(J.code==="VALIDATION_ERROR")return Y.status(400).json({error:J.message,code:"VALIDATION_ERROR"});Y.status(500).json({error:J.message})}}),$.post("/api/projects",async(q,Y)=>{try{let{name:J,path:z}=q.body;if(!J||typeof J!=="string"||J.trim()==="")return Y.status(400).json({error:"Name is required",code:"VALIDATION_ERROR"});if(!z||typeof z!=="string"||z.trim()==="")return Y.status(400).json({error:"Path is required",code:"VALIDATION_ERROR"});if(J.length>255)return Y.status(400).json({error:"Name exceeds maximum length (255)",code:"VALIDATION_ERROR"});let W=await K.createProject({name:J.trim(),path:z.trim()});Y.status(201).json(W.toJSON())}catch(J){if(J.code==="DUPLICATE_PATH")return Y.status(409).json({error:J.message,code:"DUPLICATE_PATH"});console.error("Failed to create project:",J),Y.status(500).json({error:J.message})}}),Object.freeze({})},Ml8=Object.freeze({create:BP1});var kl8=f6(N4(),1);var UP1=($,K)=>{if($.isDomainError){let q=$.code==="UNAUTHORIZED"||$.code==="INVALID_TOKEN"?401:$.code==="NOT_FOUND"||$.code==="PROJECT_NOT_FOUND"||$.code==="EXPORT_NOT_FOUND"||$.code==="STORY_NOT_FOUND"||$.code==="JOB_NOT_FOUND"||$.code==="ASSET_NOT_FOUND"||$.code==="BLOB_NOT_FOUND"||$.code==="STORE_NOT_FOUND"?404:$.code==="CONFLICT"||$.code==="STORE_NOT_EMPTY"||$.code==="EDIT_CONFLICT"||$.code==="DUPLICATE_NAME"||$.code==="BRANCH_ALREADY_CHECKED_OUT"||$.code==="BRANCH_ALREADY_EXISTS"?409:$.code==="EXPORT_ERROR"||$.code==="STORY_ROOT_NOT_FOUND"?500:400;return K.status(q).json({error:$.message,code:$.code})}console.error("Unhandled error:",$),K.status(500).json({error:$.message})},i8=UP1;var rq=kl8.default("caw:api:folders"),_l8=($)=>({folders:$.folders.map((K)=>K.toJSON()),documents:$.documents.map((K)=>K.toJSON())}),pP1=($,{core:K})=>{return $.get("/api/p/:projectId/folders/contents",async(q,Y)=>{try{let{projectId:J}=q.params,{store:z,type:W}=q.query;rq("GET /api/p/%s/folders/contents - Listing root contents: store=%s, type=%s",J,z,W);let H=await K.listFolderContents(J,{folderId:null,store:z,type:W}),Z=_l8(H);rq("GET /api/p/%s/folders/contents - Found %d folders, %d documents",J,Z.folders.length,Z.documents.length),Y.json(Z)}catch(J){rq("GET /api/p/%s/folders/contents - Error: %s",q.params.projectId,J.message),i8(J,Y)}}),$.get("/api/p/:projectId/folders/by-path",async(q,Y)=>{try{let{projectId:J}=q.params,{path:z,store:W,type:H}=q.query,Z=await K.getFolderByPath(J,{path:z,store:W,type:H});if(!Z)return Y.status(404).json({error:"Not found"});Y.json(Z.toJSON())}catch(J){i8(J,Y)}}),$.get("/api/p/:projectId/folders/:id/contents",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,{type:W}=q.query;rq("GET /api/p/%s/folders/%s/contents - Listing folder contents: type=%s",J,z,W);let H=await K.listFolderContents(J,{folderId:z,type:W}),Z=_l8(H);rq("GET /api/p/%s/folders/%s/contents - Found %d folders, %d documents",J,z,Z.folders.length,Z.documents.length),Y.json(Z)}catch(J){rq("GET /api/p/%s/folders/%s/contents - Error: %s",q.params.projectId,q.params.id,J.message),i8(J,Y)}}),$.get("/api/p/:projectId/folders/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,W=await K.getFolder(J,{id:z});if(!W)return Y.status(404).json({error:"Not found",code:"NOT_FOUND"});Y.json(W.toJSON())}catch(J){i8(J,Y)}}),$.post("/api/p/:projectId/folders",async(q,Y)=>{try{let{projectId:J}=q.params,{path:z,store:W,root:H,parentId:Z,name:O}=q.body,X=z&&W&&!H&&!Z,P=H&&z&&!W&&!Z;if([X,P,Z&&O&&!z&&!H].filter(Boolean).length!==1)return Y.status(400).json({error:"Exactly one creation mode required: (path+store), (root+path), or (parentId+name)",code:"INVALID_PARAMS"});let v;if(X)v="fullPath";else if(P)v="rootRelative";else v="parentName";rq("POST /api/p/%s/folders - Creating folder: mode=%s, path=%s, store=%s, root=%s, parentId=%s, name=%s",J,v,z,W,H,Z,O);let j=await K.createFolder(J,{mode:v,path:z,store:W,root:H,parentId:Z,name:O});rq("POST /api/p/%s/folders - Folder created: id=%s, path=%s",J,j.getObjectId(),j.getPath()),Y.status(201).json(j.toJSON())}catch(J){rq("POST /api/p/%s/folders - Error: %s",q.params.projectId,J.message),i8(J,Y)}}),$.delete("/api/p/:projectId/folders/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,W=await K.deleteFolder(J,{id:z});Y.json(W)}catch(J){i8(J,Y)}}),$.patch("/api/p/:projectId/folders/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,{name:W,parentId:H}=q.body;if(W&&H)return Y.status(400).json({error:"Provide only name or parentId, not both",code:"INVALID_REQUEST"});if(!W&&!H)return Y.status(400).json({error:"Provide name or parentId",code:"INVALID_REQUEST"});let Z;if(W)Z=await K.renameFolder(J,{id:z,name:W});else Z=await K.moveFolder(J,{id:z,parentId:H});Y.json(Z.toJSON())}catch(J){i8(J,Y)}}),Object.freeze({})},fl8=Object.freeze({create:pP1});var cP1=($,{core:K})=>{return $.post("/api/p/:projectId/field-definitions",async(q,Y)=>{try{let{projectId:J}=q.params,{store:z,ownerEntityId:W,name:H,label:Z,description:O,primitiveType:X,required:P,multiplicity:w}=q.body,T=await K.createFieldDefinition(J,{store:z,ownerEntityId:W??null,name:H,label:Z??null,description:O??null,primitiveType:X,required:P??!1,multiplicity:w??"single"});Y.status(201).json(T.toJSON())}catch(J){i8(J,Y)}}),$.get("/api/p/:projectId/field-definitions/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,W=await K.readFieldDefinition(J,{id:z});if(!W)return Y.status(404).json({error:"Not found",code:"NOT_FOUND"});Y.json(W.toJSON())}catch(J){i8(J,Y)}}),$.get("/api/p/:projectId/field-definitions",async(q,Y)=>{try{let{projectId:J}=q.params,{store:z,ownerEntityId:W,includeSystem:H}=q.query,Z=await K.getFieldDefinitions(J,{store:z,ownerEntityId:W??null,includeSystem:H==="true"});Y.json(Z.map((O)=>O.toJSON()))}catch(J){i8(J,Y)}}),$.delete("/api/p/:projectId/field-definitions/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,W=await K.deleteFieldDefinition(J,{id:z});Y.json(W.toJSON())}catch(J){i8(J,Y)}}),$.put("/api/p/:projectId/entities/:id/fields/:fieldName",async(q,Y)=>{try{let{projectId:J,id:z,fieldName:W}=q.params,{fieldDefinitionId:H,value:Z,values:O}=q.body,X={entityId:z,fieldDefinitionId:H!==void 0?H:null,fieldName:W};if(Z!==void 0)X.value=Z;if(O!==void 0)X.values=O;await K.setField(J,X);let P=await K.getFolder(J,{id:z});Y.json({id:P.getObjectId(),parentId:P.getParentId(),name:P.getName(),path:P.getPath(),createdAt:P.getCreatedAt(),updatedAt:P.getUpdatedAt()})}catch(J){i8(J,Y)}}),$.get("/api/p/:projectId/entities/:id/fields",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,W=await K.getFields(J,{entityId:z}),H={};for(let[Z,O]of Object.entries(W))H[Z]=O.toJSON();Y.json(H)}catch(J){i8(J,Y)}}),$.delete("/api/p/:projectId/entities/:id/fields/:fieldName",async(q,Y)=>{try{let{projectId:J,id:z,fieldName:W}=q.params,{fieldDefinitionId:H}=q.query,Z={entityId:z,fieldName:W};if(H!==void 0)Z.fieldDefinitionId=H;await K.deleteField(J,Z),Y.status(204).send()}catch(J){i8(J,Y)}}),Object.freeze({})},Nl8=Object.freeze({create:cP1});var Rl8=f6(N4(),1);var iX=Rl8.default("caw:api:documents"),FP1=($,{core:K})=>{return $.post("/api/p/:projectId/documents",async(q,Y)=>{try{let{projectId:J}=q.params,{path:z,store:W,root:H,parentId:Z,name:O,content:X}=q.body,P=z&&W&&!H&&!Z,w=H&&z&&!W&&!Z;if([P,w,Z&&O&&!z&&!H].filter(Boolean).length!==1)return Y.status(400).json({error:"Exactly one creation mode required: (path+store), (root+path), or (parentId+name)",code:"INVALID_PARAMS"});let j;if(P)j="fullPath";else if(w)j="rootRelative";else j="parentName";iX("POST /api/p/%s/documents - Creating document: mode=%s, path=%s, store=%s, root=%s, parentId=%s, name=%s, hasContent=%s",J,j,z,W,H,Z,O,!!X);let A=(await K.createDocument(J,{mode:j,path:z,store:W,root:H,parentId:Z,name:O,content:X})).toJSON();iX("POST /api/p/%s/documents - Document created: id=%s, path=%s",J,A.id,A.path),Y.status(201).json(A)}catch(J){iX("POST /api/p/%s/documents - Error: %s",q.params.projectId,J.message),i8(J,Y)}}),$.post("/api/p/:projectId/templates",async(q,Y)=>{try{let{projectId:J}=q.params,{path:z,store:W,root:H,parentId:Z,name:O,content:X}=q.body,P=z&&W&&!H&&!Z,w=H&&z&&!W&&!Z;if([P,w,Z&&O&&!z&&!H].filter(Boolean).length!==1)return Y.status(400).json({error:"Exactly one creation mode required: (path+store), (root+path), or (parentId+name)",code:"INVALID_PARAMS"});let j;if(P)j="fullPath";else if(w)j="rootRelative";else j="parentName";iX("POST /api/p/%s/templates - Creating template: mode=%s, path=%s, store=%s, root=%s, parentId=%s, name=%s, hasContent=%s",J,j,z,W,H,Z,O,!!X);let A=(await K.createTemplate(J,{mode:j,path:z,store:W,root:H,parentId:Z,name:O,content:X})).toJSON();iX("POST /api/p/%s/templates - Template created: id=%s, path=%s",J,A.id,A.path),Y.status(201).json(A)}catch(J){iX("POST /api/p/%s/templates - Error: %s",q.params.projectId,J.message),i8(J,Y)}}),$.get("/api/p/:projectId/documents/by-path",async(q,Y)=>{try{let{projectId:J}=q.params,{path:z,store:W,type:H="d"}=q.query,Z=await K.readDocumentByPath(J,{path:z,store:W,type:H});if(!Z)return Y.status(404).json({error:"Not found",code:"NOT_FOUND"});let{entity:O,ancestorFolderIds:X}=Z;Y.json({...O.toJSON(),ancestorFolderIds:X})}catch(J){i8(J,Y)}}),$.get("/api/p/:projectId/documents",async(q,Y)=>{try{let{projectId:J}=q.params,{folderId:z,store:W,type:H="d"}=q.query,Z=await K.listDocuments(J,{folderId:z??null,store:W,type:H});Y.json(Z.map((O)=>O.toJSON()))}catch(J){i8(J,Y)}}),$.get("/api/p/:projectId/documents/:id/parameters",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,{entity:W}=await K.readDocument(J,{id:z});if(!W)return Y.status(404).json({error:"Not found",code:"NOT_FOUND"});let H=W.getPublishedContent();if(!H)return Y.json({id:z,path:W.getPath(),parameters:{},target:null,targetPath:null,targetParentId:null,targetName:null,targetRoot:null,targetStore:null,detectedVariables:[]});try{let{parameters:Z,target:O,targetPath:X,targetParentId:P,targetName:w,targetRoot:T,targetStore:v}=ZK.getParameters(H),{body:j}=ZK.parseFrontMatter(H),G=Array.from(ZK.extractVariables(j));Y.json({id:z,path:W.getPath(),parameters:Z,target:O,targetPath:X,targetParentId:P,targetName:w,targetRoot:T,targetStore:v,detectedVariables:G})}catch(Z){return Y.json({id:z,path:W.getPath(),parameters:{},target:null,targetPath:null,targetParentId:null,targetName:null,targetRoot:null,targetStore:null,detectedVariables:[],parseError:Z.message})}}catch(J){i8(J,Y)}}),$.post("/api/p/:projectId/documents/:id/render",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,{params:W,target:H,targetOptions:Z}=q.body,O=await K.renderTemplate(J,{id:z,params:W,target:H,targetOptions:Z,sessionId:q.sessionId});Y.json(O)}catch(J){i8(J,Y)}}),$.get("/api/p/:projectId/documents/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,{entity:W,ancestorFolderIds:H}=await K.readDocument(J,{id:z});if(!W)return Y.status(404).json({error:"Not found",code:"NOT_FOUND"});Y.json({...W.toJSON(),ancestorFolderIds:H})}catch(J){i8(J,Y)}}),$.patch("/api/p/:projectId/documents/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,{path:W,parentId:H}=q.body,Z=d1.getTypeFromId(z),O=await K.updateDocumentPath(J,{id:z,path:W,parentId:H,type:Z});Y.json(O.toJSON())}catch(J){i8(J,Y)}}),$.delete("/api/p/:projectId/documents/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,W=await K.deleteDocument(J,{id:z});Y.json(W)}catch(J){i8(J,Y)}}),$.put("/api/p/:projectId/documents/:id/draft",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,{content:W}=q.body,H=q.sessionId;if(W===void 0)return Y.status(400).json({error:"content is required",code:"MISSING_CONTENT"});let Z=await K.saveDraft(J,{id:z,content:W,sessionId:H});Y.json({id:z,updated:!0,lockLost:Z.lockLost??!1})}catch(J){i8(J,Y)}}),$.get("/api/p/:projectId/documents/:id/draft",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,W=await K.readDraft(J,{id:z});Y.json(W)}catch(J){i8(J,Y)}}),$.post("/api/p/:projectId/documents/:id/publish",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,W=await K.publishDocument(J,{id:z,sessionId:q.sessionId});Y.json(W)}catch(J){i8(J,Y)}}),$.delete("/api/p/:projectId/documents/:id/draft",async(q,Y)=>{try{let{projectId:J,id:z}=q.params;await K.discardDraft(J,{id:z}),Y.json({id:z,discarded:!0})}catch(J){i8(J,Y)}}),$.get("/api/p/:projectId/documents/:id/versions",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,W=await K.getVersions(J,{id:z});Y.json(W)}catch(J){i8(J,Y)}}),$.get("/api/p/:projectId/documents/:id/versions/:versionNumber",async(q,Y)=>{try{let{projectId:J,id:z,versionNumber:W}=q.params,H=await K.readVersion(J,{id:z,versionNumber:parseInt(W,10)});if(!H)return Y.status(404).json({error:"Not found",code:"NOT_FOUND"});Y.json(H)}catch(J){i8(J,Y)}}),$.get("/api/p/:projectId/documents/:id/edit-state",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,W=await K.getEditState(J,{id:z});if(!W)return Y.json({locked:!1});Y.json({locked:!0,locked_at:W.startedAt})}catch(J){i8(J,Y)}}),$.post("/api/p/:projectId/documents/:id/edit-state",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,W=q.sessionId;if(!W)return Y.status(400).json({error:"X-Session-Id header required",code:"MISSING_SESSION_ID"});let H=await K.setEditState(J,{id:z,sessionId:W});if(!H.success)return Y.status(409).json(H);Y.json(H)}catch(J){i8(J,Y)}}),$.delete("/api/p/:projectId/documents/:id/edit-state",async(q,Y)=>{try{let{projectId:J,id:z}=q.params;await K.clearEditState(J,{id:z}),Y.json({success:!0})}catch(J){i8(J,Y)}}),Object.freeze({})},Cl8=Object.freeze({create:FP1});var Dl8=f6(N4(),1);var i3=Dl8.default("caw:api:export"),QP1=($,{core:K})=>{return $.get("/api/p/:projectId/exports",async(q,Y)=>{try{let{projectId:J}=q.params;i3("GET /api/p/%s/exports - Listing export files",J);let z=await K.listExports(J);i3("GET /api/p/%s/exports - Found %d export files",J,z.length),Y.json({ok:!0,exports:z})}catch(J){i3("GET /api/p/:projectId/exports - Error: %s",J.message),i8(J,Y)}}),$.get("/api/p/:projectId/export/preview",async(q,Y)=>{try{let{projectId:J}=q.params,{store:z}=q.query;i3("GET /api/p/%s/export/preview - Previewing export: store=%s",J,z);let W=await K.exportPreview(J,{store:z});i3("GET /api/p/%s/export/preview - Preview complete: %d to export, %d draft-only",J,(W.toExport?.folders?.length||0)+(W.toExport?.documents?.length||0)+(W.toExport?.templates?.length||0),(W.draftOnly?.documents?.length||0)+(W.draftOnly?.templates?.length||0)),Y.json(W)}catch(J){i3("GET /api/p/:projectId/export/preview - Error: %s",J.message),i8(J,Y)}}),$.post("/api/p/:projectId/export",async(q,Y)=>{try{let{projectId:J}=q.params,{store:z,confirm:W}=q.body;i3("POST /api/p/%s/export - Export request: store=%s, confirm=%s",J,z,W);let H=await K.exportDocuments(J,{store:z,confirm:W});if(W)i3("POST /api/p/%s/export - Export complete: %s",J,H.filename);else i3("POST /api/p/%s/export - Preview returned (confirm=false)",J);Y.json(H)}catch(J){i3("POST /api/p/:projectId/export - Error: %s",J.message),i8(J,Y)}}),$.post("/api/p/:projectId/import",async(q,Y)=>{try{let{projectId:J}=q.params,{filename:z,store:W}=q.body;i3("POST /api/p/%s/import - Import request: filename=%s, store=%s",J,z,W);let H=await K.importDocuments(J,{filename:z,store:W});i3("POST /api/p/%s/import - Import complete: %d folders, %d documents, %d templates",J,H.counts?.folders||0,H.counts?.documents||0,H.counts?.templates||0),Y.json({ok:!0,...H})}catch(J){i3("POST /api/p/:projectId/import - Error: %s",J.message),i8(J,Y)}}),Object.freeze({})},hl8=Object.freeze({create:QP1});var El8=f6(N4(),1);var C7=El8.default("caw:api:stories"),lP1=($,{core:K})=>{return $.post("/api/p/:projectId/stories",async(q,Y)=>{try{let{projectId:J}=q.params,{name:z,store:W="A",state:H="prep"}=q.body;C7("POST /api/p/%s/stories - Creating story: name=%s, store=%s, state=%s",J,z,W,H);let Z=await K.createStory(J,{name:z,store:W,state:H});Y.status(201).json(Z)}catch(J){C7("POST /api/p/%s/stories - Error: %s",q.params.projectId,J.message),i8(J,Y)}}),$.get("/api/p/:projectId/stories",async(q,Y)=>{try{let{projectId:J}=q.params,{store:z="A"}=q.query;C7("GET /api/p/%s/stories - Listing stories: store=%s",J,z);let W=await K.listStories(J,{store:z});Y.json(W)}catch(J){C7("GET /api/p/%s/stories - Error: %s",q.params.projectId,J.message),i8(J,Y)}}),$.get("/api/p/:projectId/stories/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params;C7("GET /api/p/%s/stories/%s - Getting story",J,z);let W=await K.getStory(J,{id:z});if(!W)return Y.status(404).json({error:"Not found",code:"NOT_FOUND"});Y.json(W)}catch(J){C7("GET /api/p/%s/stories/%s - Error: %s",q.params.projectId,q.params.id,J.message),i8(J,Y)}}),$.patch("/api/p/:projectId/stories/:id/state",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,{state:W}=q.body;if(!W)return Y.status(400).json({error:"State is required",code:"MISSING_STATE"});C7("PATCH /api/p/%s/stories/%s/state - Updating state to: %s",J,z,W);let H=await K.updateStoryState(J,{id:z,state:W});Y.json(H)}catch(J){C7("PATCH /api/p/%s/stories/%s/state - Error: %s",q.params.projectId,q.params.id,J.message),i8(J,Y)}}),$.delete("/api/p/:projectId/stories/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params;C7("DELETE /api/p/%s/stories/%s - Deleting story",J,z);let W=await K.deleteStory(J,{id:z});Y.json(W)}catch(J){C7("DELETE /api/p/%s/stories/%s - Error: %s",q.params.projectId,q.params.id,J.message),i8(J,Y)}}),$.get("/api/p/:projectId/stories/:id/states",async(q,Y)=>{try{let{projectId:J,id:z}=q.params;C7("GET /api/p/%s/stories/%s/states",J,z);let W=await K.listStateFolders(J,{storyId:z});Y.json(W)}catch(J){C7("GET states error: %s",J.message),i8(J,Y)}}),$.post("/api/p/:projectId/stories/:id/states",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,{state:W}=q.body;C7("POST /api/p/%s/stories/%s/states state=%s",J,z,W);let H=await K.createStateFolder(J,{storyId:z,state:W}),Z=H.created?201:200;Y.status(Z).json(H)}catch(J){C7("POST states error: %s",J.message),i8(J,Y)}}),$.post("/api/p/:projectId/stories/state-folders",async(q,Y)=>{try{let{projectId:J}=q.params,{storyId:z,storyPath:W,store:H,state:Z}=q.body;if(!Z)return Y.status(400).json({error:"state is required",code:"MISSING_STATE"});let O=z&&!W;if([O,W&&H&&!z].filter(Boolean).length!==1)return Y.status(400).json({error:"Exactly one mode required: (storyId) or (storyPath+store)",code:"INVALID_PARAMS"});let w;if(O)w="storyId";else w="storyPath";C7("POST /api/p/%s/stories/state-folders - mode=%s, storyId=%s, storyPath=%s, store=%s, state=%s",J,w,z,W,H,Z);let T=await K.ensureStateFolder(J,{mode:w,storyId:z,storyPath:W,store:H,state:Z}),v=T.created?201:200;Y.status(v).json(T)}catch(J){C7("POST /api/p/%s/stories/state-folders - Error: %s",q.params.projectId,J.message),i8(J,Y)}}),Object.freeze({})},Sl8=Object.freeze({create:lP1});var ed8=f6(N4(),1),UD=f6(sd8(),1);var cK=ed8.default("caw:api:assets"),td8=["image/png","image/jpeg","image/gif","image/webp"],xG1=UD.default({storage:UD.default.memoryStorage(),limits:{fileSize:10485760},fileFilter:($,K,q)=>{if(td8.includes(K.mimetype))q(null,!0);else q(Error(`Unsupported MIME type: ${K.mimetype}. Allowed: ${td8.join(", ")}`))}}),bG1=($,{core:K})=>{return $.post("/api/p/:projectId/assets",xG1.single("file"),async(q,Y)=>{try{let{projectId:J}=q.params,{store:z="A"}=q.query,W=q.file;if(!W)return Y.status(400).json({error:"No file uploaded",code:"MISSING_FILE"});let H=q.body.widthPx?parseInt(q.body.widthPx,10):void 0,Z=q.body.heightPx?parseInt(q.body.heightPx,10):void 0,O=q.body.displayWidth?parseInt(q.body.displayWidth,10):void 0,X=q.body.displayHeight?parseInt(q.body.displayHeight,10):void 0;cK("POST /api/p/%s/assets - Uploading: %s (%s, %d bytes)",J,W.originalname,W.mimetype,W.size);let P=await K.createAsset(J,{store:z,buffer:W.buffer,mimeType:W.mimetype,originalFilename:W.originalname,widthPx:H,heightPx:Z,displayWidth:O,displayHeight:X});Y.status(201).json(P)}catch(J){cK("POST /api/p/%s/assets - Error: %s",q.params.projectId,J.message),i8(J,Y)}}),$.get("/api/p/:projectId/assets/:id/binary",async(q,Y)=>{try{let{projectId:J,id:z}=q.params;cK("GET /api/p/%s/assets/%s/binary - Retrieving binary",J,z);let W=await K.readAssetBinary(J,{id:z});Y.set("Content-Type",W.mimeType),Y.set("Content-Length",W.sizeBytes),Y.set("Cache-Control","public, max-age=31536000, immutable"),Y.set("Content-Disposition",`inline; filename="${W.originalFilename}"`),Y.send(W.buffer)}catch(J){cK("GET /api/p/%s/assets/%s/binary - Error: %s",q.params.projectId,q.params.id,J.message),i8(J,Y)}}),$.get("/api/p/:projectId/assets/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params;cK("GET /api/p/%s/assets/%s - Retrieving metadata",J,z);let W=await K.readAsset(J,{id:z});Y.json(W)}catch(J){cK("GET /api/p/%s/assets/%s - Error: %s",q.params.projectId,q.params.id,J.message),i8(J,Y)}}),$.get("/api/p/:projectId/assets",async(q,Y)=>{try{let{projectId:J}=q.params,{store:z="A"}=q.query;cK("GET /api/p/%s/assets - Listing assets for store %s",J,z);let W=await K.listAssets(J,{store:z});Y.json(W)}catch(J){cK("GET /api/p/%s/assets - Error: %s",q.params.projectId,J.message),i8(J,Y)}}),$.delete("/api/p/:projectId/assets/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params;cK("DELETE /api/p/%s/assets/%s - Deleting asset",J,z);let W=await K.deleteAsset(J,{id:z});Y.json(W)}catch(J){cK("DELETE /api/p/%s/assets/%s - Error: %s",q.params.projectId,q.params.id,J.message),i8(J,Y)}}),$.use("/api/p/:projectId/assets",(q,Y,J,z)=>{if(q instanceof UD.default.MulterError){if(q.code==="LIMIT_FILE_SIZE")return J.status(400).json({error:"File too large. Maximum size is 10MB.",code:"FILE_TOO_LARGE"});return J.status(400).json({error:q.message,code:"UPLOAD_ERROR"})}if(q.message&&q.message.includes("Unsupported MIME type"))return J.status(400).json({error:q.message,code:"UNSUPPORTED_MIME_TYPE"});z(q)}),Object.freeze({})},$n8=Object.freeze({create:bG1});var Kn8=f6(N4(),1);var FK=Kn8.default("caw:api:jobs"),gG1=($,{core:K})=>{return $.post("/api/p/:projectId/jobs",async(q,Y)=>{try{let{projectId:J}=q.params,{name:z,agent:W,model:H,prompt:Z,store:O="A",workingDirectory:X}=q.body;FK("POST /api/p/%s/jobs - Creating job: agent=%s, model=%s, store=%s, workingDirectory=%s",J,W,H,O,X||"default");let P=await K.createJob(J,{name:z,agent:W,model:H,prompt:Z,store:O,workingDirectory:X});Y.status(201).json(P)}catch(J){FK("POST /api/p/%s/jobs - Error: %s",q.params.projectId,J.message),i8(J,Y)}}),$.get("/api/p/:projectId/jobs",async(q,Y)=>{try{let{projectId:J}=q.params,{store:z="A",status:W}=q.query;FK("GET /api/p/%s/jobs - Listing jobs: store=%s, status=%s",J,z,W||"all");let H=await K.listJobs(J,{store:z,status:W});Y.json(H)}catch(J){FK("GET /api/p/%s/jobs - Error: %s",q.params.projectId,J.message),i8(J,Y)}}),$.get("/api/p/:projectId/jobs/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params;FK("GET /api/p/%s/jobs/%s - Getting job",J,z);let W=await K.getJob(J,{id:z});if(!W)return Y.status(404).json({error:"Not found",code:"NOT_FOUND"});Y.json(W)}catch(J){FK("GET /api/p/%s/jobs/%s - Error: %s",q.params.projectId,q.params.id,J.message),i8(J,Y)}}),$.post("/api/p/:projectId/jobs/:id/continue",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,{prompt:W}=q.body;FK("POST /api/p/%s/jobs/%s/continue - Continuing job",J,z);let H=await K.continueJob(J,{id:z,prompt:W});Y.json(H)}catch(J){FK("POST /api/p/%s/jobs/%s/continue - Error: %s",q.params.projectId,q.params.id,J.message),i8(J,Y)}}),$.patch("/api/p/:projectId/jobs/:id",async(q,Y)=>{try{let{projectId:J,id:z}=q.params,{name:W}=q.body;FK("PATCH /api/p/%s/jobs/%s - Renaming job",J,z);let H=await K.renameJob(J,{id:z,name:W});Y.json(H)}catch(J){FK("PATCH /api/p/%s/jobs/%s - Error: %s",q.params.projectId,q.params.id,J.message),i8(J,Y)}}),Object.freeze({})},qn8=Object.freeze({create:gG1});var Yn8=f6(N4(),1);var $P=Yn8.default("caw:api:worktrees"),yG1=($,{core:K})=>{return $.get("/api/p/:projectId/worktrees",async(q,Y)=>{try{let{projectId:J}=q.params;$P("GET /api/p/%s/worktrees - Listing worktrees",J);let z=await K.listWorktrees(J);$P("GET /api/p/%s/worktrees - Found %d worktrees, isGitProject=%s",J,z.worktrees.length,z.isGitProject),Y.json(z)}catch(J){$P("GET /api/p/%s/worktrees - Error: %s",q.params.projectId,J.message),i8(J,Y)}}),$.post("/api/p/:projectId/worktrees",async(q,Y)=>{try{let{projectId:J}=q.params,{branch:z,baseBranch:W}=q.body;$P("POST /api/p/%s/worktrees - Creating worktree: branch=%s, baseBranch=%s",J,z,W||"default");let H=await K.createWorktree(J,{branch:z,baseBranch:W});$P("POST /api/p/%s/worktrees - Created worktree at %s for branch %s",J,H.path,H.branch),Y.status(201).json(H)}catch(J){$P("POST /api/p/%s/worktrees - Error: %s",q.params.projectId,J.message),i8(J,Y)}}),Object.freeze({})},Jn8=Object.freeze({create:yG1});var zn8=f6(N4(),1);var pD=zn8.default("caw:api:events"),uG1=($,{core:K})=>{return $.get("/api/p/:projectId/events",async(q,Y)=>{try{let{projectId:J}=q.params;pD("GET /api/p/%s/events - Client connecting",J);let z=await K.getRootStore(J);pD("GET /api/p/%s/events - Got root store, setting up SSE subscription",J),Y.setHeader("Content-Type","text/event-stream"),Y.setHeader("Cache-Control","no-cache"),Y.setHeader("Connection","keep-alive"),Y.flushHeaders(),Y.write(`: connected
|
|
566
566
|
|
|
567
567
|
`);let W=(O,X)=>{pD("SSE sending event: %s with data: %o",O,X),Y.write(`event: ${O}
|
|
568
568
|
`),Y.write(`data: ${JSON.stringify(X)}
|