@kelceyp/caw-server 1.0.214 → 1.0.215

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.
Files changed (2) hide show
  1. package/dist/main.js +1 -1
  2. package/package.json +1 -1
package/dist/main.js CHANGED
@@ -1259,5 +1259,5 @@ Errors:
1259
1259
  Errors:
1260
1260
  `;for(let i of W.slice(0,10))Z+=` - ${i.entityId}: ${i.error}
1261
1261
  `;if(W.length>10)Z+=` ... and ${W.length-10} more errors
1262
- `}return{content:[{type:"text",text:Z}]}}catch(Y){return F2(Y)}},UK8={name:"backfill_resolved_fts",title:"Backfill Resolved FTS",description:"Re-resolve FTS content for published documents/templates with <include> directives. If confirm=false, returns preview of affected entities. If confirm=true, resolves includes and updates FTS content.",schema:tS6,execute:eS6};var FK8=[BK8,UK8];var _b6=h.object({store:h.string().optional().describe('Store code (default: "A")'),limit:h.coerce.number().optional().describe("Maximum number of events to return (default: 50)"),offset:h.coerce.number().optional().describe("Pagination offset (default: 0)")}),vb6=async({core:_,projectId:v},{store:u,limit:K,offset:q})=>{try{let Y=await _.listDeletedEvents(v,{store:u??"A",limit:K??50,offset:q??0});return{content:[{type:"text",text:JSON.stringify(Y,null,2)}]}}catch(Y){return F2(Y)}},oK8={name:"list_deleted_events",title:"List Deletion Events",description:"List deletion events. Each event represents a single delete action (e.g. deleting a folder and all its contents), identified by a root entity ID. Returns events with root entity ID, root entity info, item count, deletedAt timestamp (for display), and days until purge.",schema:_b6,execute:vb6};var $b6=h.object({root_entity_id:h.string().describe('Root entity ID of the deletion event (e.g. "Ad131")'),store:h.string().optional().describe('Store code (default: "A")'),limit:h.coerce.number().optional().describe("Maximum number of items to return (default: 50)"),offset:h.coerce.number().optional().describe("Pagination offset (default: 0)")}),ub6=async({core:_,projectId:v},{root_entity_id:u,store:K,limit:q,offset:Y})=>{try{let z=await _.getDeletedEvent(v,{rootEntityId:u,store:K??"A",limit:q??50,offset:Y??0});return{content:[{type:"text",text:JSON.stringify(z,null,2)}]}}catch(z){return F2(z)}},QK8={name:"get_deleted_event",title:"Get Deletion Event",description:"Get the items in a specific deletion event identified by its root entity ID. Returns root entity info and a paginated list of all entities deleted in that event.",schema:$b6,execute:ub6};var Kb6=h.object({root_entity_id:h.string().describe('Root entity ID of the deletion event (e.g. "Ad131")'),store:h.string().optional().describe('Store code (default: "A")')}),qb6=async({core:_,projectId:v},{root_entity_id:u,store:K})=>{try{let q=await _.restoreDeletedEvent(v,{rootEntityId:u,store:K??"A"});return{content:[{type:"text",text:JSON.stringify(q,null,2)}]}}catch(q){return F2(q)}},dK8={name:"restore_deleted_event",title:"Restore Deletion Event",description:'Restore all entities in a deletion event (identified by its root entity ID). All entities deleted in the same action are restored together. If the root entity has a name collision, it is renamed with a "-restored" suffix.',schema:Kb6,execute:qb6};var rK8=[oK8,QK8,dK8];var Yb6=h.object({}),zb6=async({core:_,projectId:v})=>{try{let u=await _.getSystemSettings(v);return{content:[{type:"text",text:JSON.stringify(u,null,2)}]}}catch(u){return F2(u)}},sK8={name:"get_system_settings",title:"Get System Settings",description:"Returns all system settings for the project (autoArchiveDelayDays, maxConcurrentJobs, trashRetentionDays, maxResumeAttempts, defaultResumePromptRef, scratchDocDelayDays, jobDelayDays, indexingMode, batchIntervalMinutes, claudeStrategy)",schema:Yb6,execute:zb6};var cb6=h.object({settings:VK(h.object({autoArchiveDelayDays:h.number().int().optional(),maxConcurrentJobs:h.number().int().optional(),maxJobDepth:h.number().int().optional(),trashRetentionDays:h.number().int().optional(),maxResumeAttempts:h.number().int().optional(),defaultResumePromptRef:h.string().nullable().optional(),scratchDocDelayDays:h.number().int().optional(),jobDelayDays:h.number().int().optional(),indexingMode:h.enum(["batch","constant"]).optional(),batchIntervalMinutes:h.number().int().positive().optional(),claudeStrategy:h.enum(["pty","headless"]).optional()})).describe("Partial settings object. Only provided keys are updated.")}),wb6=async({core:_,projectId:v},{settings:u})=>{try{let K=await _.updateSystemSettings(v,{settings:u});return{content:[{type:"text",text:JSON.stringify(K,null,2)}]}}catch(K){return F2(K)}},tK8={name:"update_system_settings",title:"Update System Settings",description:'Update system settings for the project. Accepts partial updates — only provided keys are changed. Settings: autoArchiveDelayDays, maxConcurrentJobs, trashRetentionDays, maxResumeAttempts, defaultResumePromptRef, scratchDocDelayDays, jobDelayDays, indexingMode, batchIntervalMinutes, claudeStrategy. Validates values: integer fields must be positive integers; defaultResumePromptRef must be a template ID string or null (to clear); indexingMode must be "batch" or "constant"; batchIntervalMinutes must be a positive integer; claudeStrategy must be "pty" or "headless".',schema:cb6,execute:wb6};var eK8=[sK8,tK8];var _q8=G8.create({namespace:"caw:mcp"}),Jb6=({core:_,projectId:v})=>{let u=new dv2({name:"caw-server",version:"1.0.214"},{capabilities:{tools:{}}}),K=[...Mu8,...Du8,...bu8,...eu8,...KK8,...XK8,...PK8,...VK8,...bK8,...yK8,...FK8,...rK8,...eK8];for(let q of K)u.registerTool(q.name,{title:q.title,description:q.description,inputSchema:q.schema},async(Y,z)=>{try{let c=z?.sessionId||z?.requestInfo?.headers?.["mcp-session-id"];return await q.execute({core:_,projectId:v,sessionId:c,extra:z},Y)}catch(c){if(c.isDomainError)_q8.debug("Tool %s domain error: %o",q.name,c);else _q8.error(`Tool ${q.name} failed:`,c);return F2(c)}});return u},vq8=Object.freeze({createMcpServer:Jb6});var Dg=G8.create({namespace:"caw:mcp"}),v7=G8.create({namespace:"caw:mcp:session"}),Zb6=({core:_})=>{let v=new Map;return Object.freeze({handleRequest:async(z,c,{projectId:w})=>{let J=z.headers["mcp-session-id"];if(J){let p=v.get(J);if(!p)return v7.debug("Session not found: %s",J),c.status(404).json({jsonrpc:"2.0",error:{code:-32001,message:"Session not found. Server may have been restarted. If so, ask user to reconnect"},id:null});if(p.projectId!==w)return v7.debug("Session %s belongs to project %s, not %s",J,p.projectId,w),c.status(404).json({jsonrpc:"2.0",error:{code:-32001,message:"Session not found. Server may have been restarted. If so, ask user to reconnect"},id:null});v7.debug("Routing request to existing session: %s",J),p.lastActivity=Date.now();try{return await p.transport.handleRequest(z,c,z.body)}catch(X){Dg.error("MCP transport request failed:",X)}}v7.debug("Creating new MCP session for project: %s",w);let W=null,Z=new o_2({sessionIdGenerator:()=>{return W=Wb6(),v7.debug("Generated session ID: %s",W),W},onsessioninitialized:(p)=>{v7.debug("Session initialized: %s",p),c.setHeader("Mcp-Session-Id",p),O.sessionId=p,v.set(p,O),v7.debug("Session stored: %s",p)}});v7.debug("Creating new server for session");let i=vq8.createMcpServer({core:_,projectId:w});try{await i.connect(Z)}catch(p){return Dg.error("MCP server connect failed:",p),Z.close?.(),i.close?.(),c.status(500).json({jsonrpc:"2.0",error:{code:-32603,message:"Internal server error"},id:null})}let O={sessionId:null,transport:Z,server:i,projectId:w,createdAt:Date.now(),lastActivity:Date.now()};c.on("finish",()=>{if(c.statusCode!==200&&W&&v.has(W))v7.debug("Request failed (status %d), cleaning up session: %s",c.statusCode,W),v.delete(W),Z.close?.(),i.close?.()});try{await Z.handleRequest(z,c,z.body)}catch(p){Dg.error("MCP transport request failed:",p)}},getSession:(z)=>{return v.get(z)},closeSession:(z)=>{let c=v.get(z);if(!c){v7.debug("Cannot close session - not found: %s",z);return}v7.debug("Closing session: %s",z),c.transport.close?.(),c.server.close?.(),v.delete(z)},cleanupIdle:(z)=>{let c=Date.now(),w=0;for(let[J,W]of v.entries())if(c-W.lastActivity>z)v7.debug("Cleaning up idle session: %s (idle for %dms)",J,c-W.lastActivity),W.transport.close?.(),W.server.close?.(),v.delete(J),w++;if(w>0)Dg.debug("Cleaned up %d idle sessions",w)}})},$q8=Object.freeze({create:Zb6});var Ob6=86400000,ib6=300000,pb6=({mcpSessionManager:_})=>{let{jobFns:v,controlFns:u}=yv.create({name:"cleanup-idle-mcp-sessions",interval:ib6,execute:async()=>{_.cleanupIdle(Ob6)}});return{job:Object.freeze(v),control:u}},uq8=Object.freeze({create:pb6});var Fg=G8.create({namespace:"caw:server"}),_a6=async({port:_,envDir:v,databaseFilepath:u,assetsDir:K,lazilyCreateDb:q,enableRest:Y,enableSse:z,enableStatic:c,enableCrons:w,enableMcp:J=!0,enableCli:W=!0,staticPath:Z,kyselyFactory:i})=>{let O=await We2.create({envDir:v,databaseFilepath:u,assetsDir:K,lazilyCreateDb:q,kyselyFactory:i}),p=O$2.default();if(p.use(O$2.default.json({limit:"5mb"})),p.get("/health",(A,j)=>{j.json({status:"ok"})}),p.get("/api/info",(A,j)=>{j.json({version:"1.0.214",hookFailureCount:CD2()})}),Y)p.use("/api",Z68),ie2.create(p,{core:O}),Xe2.create(p,{core:O}),He2.create(p,{core:O}),Ge2.create(p,{core:O}),Ae2.create(p,{core:O}),Pe2.create(p,{core:O}),je2.create(p,{core:O}),Ve2.create(p,{core:O}),ne2.create(p,{core:O}),Me2.create(p,{core:O}),u68.create(p,{core:O}),K68.create(p,{core:O}),q68.create(p,{core:O}),Y68.create(p,{core:O}),z68.create(p,{core:O}),c68.create(p,{core:O}),w68.create(p,{core:O});if(z)J68.create(p,{core:O}),W68.create(p,{core:O});if(J){Fg.debug("Initializing MCP subsystem...");let A=$q8.create({core:O});O.registerCronJob(uq8,{mcpSessionManager:A}),O68.create(p,{core:O,mcpSessionManager:A}),Fg.debug("MCP subsystem initialized")}if(W){Fg.debug("Initializing CLI Adapter subsystem...");let A=(await Promise.resolve().then(() => (Dq8(),Nq8))).default,j=(await Promise.resolve().then(() => (Eq8(),Cq8))).default,P=(await Promise.resolve().then(() => (bq8(),Sq8))).default,R=(await Promise.resolve().then(() => (Iq8(),aq8))).default,k=P.create({mcpClientFactory:A.create(),aliasGenerator:j.create(),core:O});await k.init(),O.subscribeServerEvents({onProjectCreated:(D)=>k.addProject({objectId:D.id,name:D.name,path:D.path})}),R.create(p,{cliSessionManager:k}),Fg.debug("CLI Adapter subsystem initialized")}if(c&&Z)Oe2.create(p,{staticPath:Z});if(w)O.startAllCrons();p.use((A,j,P,R)=>{P.status(A.status||A.statusCode||500).json({error:A.message,type:A.type})});let X=null,H=new Set;return Object.freeze({app:p,core:O,start:async()=>{return new Promise((A,j)=>{X=p.listen(_,(P)=>{if(P){j(P);return}let R=X.address();if(!R){j(Error("Server failed to bind"));return}A(R.port)}),X.on("connection",(P)=>{H.add(P),P.on("close",()=>{H.delete(P)})})})},stop:async()=>{if(await O.shutdownEmbeddingPipeline(),O.stopAllCrons(),X){for(let A of H)A.destroy();return H.clear(),new Promise((A)=>{X.close(()=>{A()})})}}})},lq8=Object.freeze({create:_a6});V6();var og=G8.create({namespace:"caw:main"}),$a6=2229,ua6=Qg.join(Qg.dirname(va6(import.meta.url)),"public_html"),Ka6=!0,qa6=!0,Ya6=!0,za6=!0,ca6=!1,wa6=!0,Ja6=!0,Wa6=!0,Za6="debug",oz=(_,v)=>_!==void 0?_==="true":v,Oa6=()=>{let _=process.env.CAW_ENV_DIR;if(!_)og.error("ERROR: CAW_ENV_DIR environment variable is required"),og.error("Set it to the path of your environment folder, e.g.:"),og.error(' export CAW_ENV_DIR="$HOME/.caw/prod"'),process.exit(1);return{envDir:_,databaseFilepath:Qg.join(_,"caw.db"),assetsDir:Qg.join(_,"assets")}},ia6=async(_)=>{let v=await lq8.create(_),u=await v.start();process.stdout.write(`Server listening on port ${u}
1262
+ `}return{content:[{type:"text",text:Z}]}}catch(Y){return F2(Y)}},UK8={name:"backfill_resolved_fts",title:"Backfill Resolved FTS",description:"Re-resolve FTS content for published documents/templates with <include> directives. If confirm=false, returns preview of affected entities. If confirm=true, resolves includes and updates FTS content.",schema:tS6,execute:eS6};var FK8=[BK8,UK8];var _b6=h.object({store:h.string().optional().describe('Store code (default: "A")'),limit:h.coerce.number().optional().describe("Maximum number of events to return (default: 50)"),offset:h.coerce.number().optional().describe("Pagination offset (default: 0)")}),vb6=async({core:_,projectId:v},{store:u,limit:K,offset:q})=>{try{let Y=await _.listDeletedEvents(v,{store:u??"A",limit:K??50,offset:q??0});return{content:[{type:"text",text:JSON.stringify(Y,null,2)}]}}catch(Y){return F2(Y)}},oK8={name:"list_deleted_events",title:"List Deletion Events",description:"List deletion events. Each event represents a single delete action (e.g. deleting a folder and all its contents), identified by a root entity ID. Returns events with root entity ID, root entity info, item count, deletedAt timestamp (for display), and days until purge.",schema:_b6,execute:vb6};var $b6=h.object({root_entity_id:h.string().describe('Root entity ID of the deletion event (e.g. "Ad131")'),store:h.string().optional().describe('Store code (default: "A")'),limit:h.coerce.number().optional().describe("Maximum number of items to return (default: 50)"),offset:h.coerce.number().optional().describe("Pagination offset (default: 0)")}),ub6=async({core:_,projectId:v},{root_entity_id:u,store:K,limit:q,offset:Y})=>{try{let z=await _.getDeletedEvent(v,{rootEntityId:u,store:K??"A",limit:q??50,offset:Y??0});return{content:[{type:"text",text:JSON.stringify(z,null,2)}]}}catch(z){return F2(z)}},QK8={name:"get_deleted_event",title:"Get Deletion Event",description:"Get the items in a specific deletion event identified by its root entity ID. Returns root entity info and a paginated list of all entities deleted in that event.",schema:$b6,execute:ub6};var Kb6=h.object({root_entity_id:h.string().describe('Root entity ID of the deletion event (e.g. "Ad131")'),store:h.string().optional().describe('Store code (default: "A")')}),qb6=async({core:_,projectId:v},{root_entity_id:u,store:K})=>{try{let q=await _.restoreDeletedEvent(v,{rootEntityId:u,store:K??"A"});return{content:[{type:"text",text:JSON.stringify(q,null,2)}]}}catch(q){return F2(q)}},dK8={name:"restore_deleted_event",title:"Restore Deletion Event",description:'Restore all entities in a deletion event (identified by its root entity ID). All entities deleted in the same action are restored together. If the root entity has a name collision, it is renamed with a "-restored" suffix.',schema:Kb6,execute:qb6};var rK8=[oK8,QK8,dK8];var Yb6=h.object({}),zb6=async({core:_,projectId:v})=>{try{let u=await _.getSystemSettings(v);return{content:[{type:"text",text:JSON.stringify(u,null,2)}]}}catch(u){return F2(u)}},sK8={name:"get_system_settings",title:"Get System Settings",description:"Returns all system settings for the project (autoArchiveDelayDays, maxConcurrentJobs, trashRetentionDays, maxResumeAttempts, defaultResumePromptRef, scratchDocDelayDays, jobDelayDays, indexingMode, batchIntervalMinutes, claudeStrategy)",schema:Yb6,execute:zb6};var cb6=h.object({settings:VK(h.object({autoArchiveDelayDays:h.number().int().optional(),maxConcurrentJobs:h.number().int().optional(),maxJobDepth:h.number().int().optional(),trashRetentionDays:h.number().int().optional(),maxResumeAttempts:h.number().int().optional(),defaultResumePromptRef:h.string().nullable().optional(),scratchDocDelayDays:h.number().int().optional(),jobDelayDays:h.number().int().optional(),indexingMode:h.enum(["batch","constant"]).optional(),batchIntervalMinutes:h.number().int().positive().optional(),claudeStrategy:h.enum(["pty","headless"]).optional()})).describe("Partial settings object. Only provided keys are updated.")}),wb6=async({core:_,projectId:v},{settings:u})=>{try{let K=await _.updateSystemSettings(v,{settings:u});return{content:[{type:"text",text:JSON.stringify(K,null,2)}]}}catch(K){return F2(K)}},tK8={name:"update_system_settings",title:"Update System Settings",description:'Update system settings for the project. Accepts partial updates — only provided keys are changed. Settings: autoArchiveDelayDays, maxConcurrentJobs, trashRetentionDays, maxResumeAttempts, defaultResumePromptRef, scratchDocDelayDays, jobDelayDays, indexingMode, batchIntervalMinutes, claudeStrategy. Validates values: integer fields must be positive integers; defaultResumePromptRef must be a template ID string or null (to clear); indexingMode must be "batch" or "constant"; batchIntervalMinutes must be a positive integer; claudeStrategy must be "pty" or "headless".',schema:cb6,execute:wb6};var eK8=[sK8,tK8];var _q8=G8.create({namespace:"caw:mcp"}),Jb6=({core:_,projectId:v})=>{let u=new dv2({name:"caw-server",version:"1.0.215"},{capabilities:{tools:{}}}),K=[...Mu8,...Du8,...bu8,...eu8,...KK8,...XK8,...PK8,...VK8,...bK8,...yK8,...FK8,...rK8,...eK8];for(let q of K)u.registerTool(q.name,{title:q.title,description:q.description,inputSchema:q.schema},async(Y,z)=>{try{let c=z?.sessionId||z?.requestInfo?.headers?.["mcp-session-id"];return await q.execute({core:_,projectId:v,sessionId:c,extra:z},Y)}catch(c){if(c.isDomainError)_q8.debug("Tool %s domain error: %o",q.name,c);else _q8.error(`Tool ${q.name} failed:`,c);return F2(c)}});return u},vq8=Object.freeze({createMcpServer:Jb6});var Dg=G8.create({namespace:"caw:mcp"}),v7=G8.create({namespace:"caw:mcp:session"}),Zb6=({core:_})=>{let v=new Map;return Object.freeze({handleRequest:async(z,c,{projectId:w})=>{let J=z.headers["mcp-session-id"];if(J){let p=v.get(J);if(!p)return v7.debug("Session not found: %s",J),c.status(404).json({jsonrpc:"2.0",error:{code:-32001,message:"Session not found. Server may have been restarted. If so, ask user to reconnect"},id:null});if(p.projectId!==w)return v7.debug("Session %s belongs to project %s, not %s",J,p.projectId,w),c.status(404).json({jsonrpc:"2.0",error:{code:-32001,message:"Session not found. Server may have been restarted. If so, ask user to reconnect"},id:null});v7.debug("Routing request to existing session: %s",J),p.lastActivity=Date.now();try{return await p.transport.handleRequest(z,c,z.body)}catch(X){Dg.error("MCP transport request failed:",X)}}v7.debug("Creating new MCP session for project: %s",w);let W=null,Z=new o_2({sessionIdGenerator:()=>{return W=Wb6(),v7.debug("Generated session ID: %s",W),W},onsessioninitialized:(p)=>{v7.debug("Session initialized: %s",p),c.setHeader("Mcp-Session-Id",p),O.sessionId=p,v.set(p,O),v7.debug("Session stored: %s",p)}});v7.debug("Creating new server for session");let i=vq8.createMcpServer({core:_,projectId:w});try{await i.connect(Z)}catch(p){return Dg.error("MCP server connect failed:",p),Z.close?.(),i.close?.(),c.status(500).json({jsonrpc:"2.0",error:{code:-32603,message:"Internal server error"},id:null})}let O={sessionId:null,transport:Z,server:i,projectId:w,createdAt:Date.now(),lastActivity:Date.now()};c.on("finish",()=>{if(c.statusCode!==200&&W&&v.has(W))v7.debug("Request failed (status %d), cleaning up session: %s",c.statusCode,W),v.delete(W),Z.close?.(),i.close?.()});try{await Z.handleRequest(z,c,z.body)}catch(p){Dg.error("MCP transport request failed:",p)}},getSession:(z)=>{return v.get(z)},closeSession:(z)=>{let c=v.get(z);if(!c){v7.debug("Cannot close session - not found: %s",z);return}v7.debug("Closing session: %s",z),c.transport.close?.(),c.server.close?.(),v.delete(z)},cleanupIdle:(z)=>{let c=Date.now(),w=0;for(let[J,W]of v.entries())if(c-W.lastActivity>z)v7.debug("Cleaning up idle session: %s (idle for %dms)",J,c-W.lastActivity),W.transport.close?.(),W.server.close?.(),v.delete(J),w++;if(w>0)Dg.debug("Cleaned up %d idle sessions",w)}})},$q8=Object.freeze({create:Zb6});var Ob6=86400000,ib6=300000,pb6=({mcpSessionManager:_})=>{let{jobFns:v,controlFns:u}=yv.create({name:"cleanup-idle-mcp-sessions",interval:ib6,execute:async()=>{_.cleanupIdle(Ob6)}});return{job:Object.freeze(v),control:u}},uq8=Object.freeze({create:pb6});var Fg=G8.create({namespace:"caw:server"}),_a6=async({port:_,envDir:v,databaseFilepath:u,assetsDir:K,lazilyCreateDb:q,enableRest:Y,enableSse:z,enableStatic:c,enableCrons:w,enableMcp:J=!0,enableCli:W=!0,staticPath:Z,kyselyFactory:i})=>{let O=await We2.create({envDir:v,databaseFilepath:u,assetsDir:K,lazilyCreateDb:q,kyselyFactory:i}),p=O$2.default();if(p.use(O$2.default.json({limit:"5mb"})),p.get("/health",(A,j)=>{j.json({status:"ok"})}),p.get("/api/info",(A,j)=>{j.json({version:"1.0.215",hookFailureCount:CD2()})}),Y)p.use("/api",Z68),ie2.create(p,{core:O}),Xe2.create(p,{core:O}),He2.create(p,{core:O}),Ge2.create(p,{core:O}),Ae2.create(p,{core:O}),Pe2.create(p,{core:O}),je2.create(p,{core:O}),Ve2.create(p,{core:O}),ne2.create(p,{core:O}),Me2.create(p,{core:O}),u68.create(p,{core:O}),K68.create(p,{core:O}),q68.create(p,{core:O}),Y68.create(p,{core:O}),z68.create(p,{core:O}),c68.create(p,{core:O}),w68.create(p,{core:O});if(z)J68.create(p,{core:O}),W68.create(p,{core:O});if(J){Fg.debug("Initializing MCP subsystem...");let A=$q8.create({core:O});O.registerCronJob(uq8,{mcpSessionManager:A}),O68.create(p,{core:O,mcpSessionManager:A}),Fg.debug("MCP subsystem initialized")}if(W){Fg.debug("Initializing CLI Adapter subsystem...");let A=(await Promise.resolve().then(() => (Dq8(),Nq8))).default,j=(await Promise.resolve().then(() => (Eq8(),Cq8))).default,P=(await Promise.resolve().then(() => (bq8(),Sq8))).default,R=(await Promise.resolve().then(() => (Iq8(),aq8))).default,k=P.create({mcpClientFactory:A.create(),aliasGenerator:j.create(),core:O});await k.init(),O.subscribeServerEvents({onProjectCreated:(D)=>k.addProject({objectId:D.id,name:D.name,path:D.path})}),R.create(p,{cliSessionManager:k}),Fg.debug("CLI Adapter subsystem initialized")}if(c&&Z)Oe2.create(p,{staticPath:Z});if(w)O.startAllCrons();p.use((A,j,P,R)=>{P.status(A.status||A.statusCode||500).json({error:A.message,type:A.type})});let X=null,H=new Set;return Object.freeze({app:p,core:O,start:async()=>{return new Promise((A,j)=>{X=p.listen(_,(P)=>{if(P){j(P);return}let R=X.address();if(!R){j(Error("Server failed to bind"));return}A(R.port)}),X.on("connection",(P)=>{H.add(P),P.on("close",()=>{H.delete(P)})})})},stop:async()=>{if(await O.shutdownEmbeddingPipeline(),O.stopAllCrons(),X){for(let A of H)A.destroy();return H.clear(),new Promise((A)=>{X.close(()=>{A()})})}}})},lq8=Object.freeze({create:_a6});V6();var og=G8.create({namespace:"caw:main"}),$a6=2229,ua6=Qg.join(Qg.dirname(va6(import.meta.url)),"public_html"),Ka6=!0,qa6=!0,Ya6=!0,za6=!0,ca6=!1,wa6=!0,Ja6=!0,Wa6=!0,Za6="debug",oz=(_,v)=>_!==void 0?_==="true":v,Oa6=()=>{let _=process.env.CAW_ENV_DIR;if(!_)og.error("ERROR: CAW_ENV_DIR environment variable is required"),og.error("Set it to the path of your environment folder, e.g.:"),og.error(' export CAW_ENV_DIR="$HOME/.caw/prod"'),process.exit(1);return{envDir:_,databaseFilepath:Qg.join(_,"caw.db"),assetsDir:Qg.join(_,"assets")}},ia6=async(_)=>{let v=await lq8.create(_),u=await v.start();process.stdout.write(`Server listening on port ${u}
1263
1263
  `),process.on("SIGINT",()=>v.stop("SIGINT")),process.on("SIGTERM",()=>v.stop("SIGTERM"))},pa6=()=>{let{envDir:_,databaseFilepath:v,assetsDir:u}=Oa6(),K=process.env.CAW_PORT?Number(process.env.CAW_PORT):$a6,q=process.env.STATIC_PATH||ua6,Y=oz(process.env.LAZY_CREATE_DB,Ka6),z=oz(process.env.ENABLE_REST,qa6),c=oz(process.env.ENABLE_MCP,Ya6),w=oz(process.env.ENABLE_CLI,za6),J=oz(process.env.ENABLE_WEBLLM_WSS,ca6),W=oz(process.env.ENABLE_SSE,wa6),Z=oz(process.env.ENABLE_STATIC,Ja6),i=oz(process.env.ENABLE_CRONS,Wa6),O=process.env.LOG_LEVEL||Za6;return Object.freeze({port:K,staticPath:q,envDir:_,databaseFilepath:v,assetsDir:u,lazilyCreateDb:Y,enableRest:z,enableMcp:c,enableCli:w,enableWebllmWss:J,enableSse:W,enableStatic:Z,enableCrons:i,logLevel:O})},yq8=pa6();G8.setLevel(yq8.logLevel);await ia6(yq8).catch((_)=>{og.error("ERROR: Failed to start server:",_),process.exit(1)});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kelceyp/caw-server",
3
- "version": "1.0.214",
3
+ "version": "1.0.215",
4
4
  "description": "CAW server - REST API, MCP server and core features",
5
5
  "type": "module",
6
6
  "main": "dist/main.js",