@kelceyp/caw-server 1.0.59 → 1.0.60

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 CHANGED
@@ -746,4 +746,4 @@ State: ${z.fields.state}
746
746
 
747
747
  To confirm, call delete_story with confirm=true`}]}}let J=await $.deleteStory(K,{id:q});return{content:[{type:"text",text:`Deleted story: ${J.id} (${J.descendantCount} descendants also deleted)`}]}}catch(J){return{content:[{type:"text",text:`Error: ${J.message}`}],isError:!0}}},x16={name:"delete_story",title:"Delete Story",description:"Soft delete a story (can be restored later). If confirm is false or omitted, returns impact preview.",schema:QI1,execute:cI1};V6();var lI1=A.object({id:A.string().describe('Story ID (e.g., "As1")')}),iI1=async({core:$,projectId:K},{id:q})=>{try{let Y=await $.incrementStoryJobCount(K,{id:q});if(!Y)return{content:[{type:"text",text:`Story ${q} not found`}],isError:!0};return{content:[{type:"text",text:`Incremented activeJobCount for story ${Y.id} to: ${Y.fields.activeJobCount}`}]}}catch(Y){return{content:[{type:"text",text:`Error: ${Y.message}`}],isError:!0}}},g16={name:"increment_story_job_count",title:"Increment Story Job Count",description:"Increment a story's activeJobCount field (for manual tracking of agent activity)",schema:lI1,execute:iI1};V6();var dI1=A.object({id:A.string().describe('Story ID (e.g., "As1")')}),nI1=async({core:$,projectId:K},{id:q})=>{try{let Y=await $.decrementStoryJobCount(K,{id:q});if(!Y)return{content:[{type:"text",text:`Story ${q} not found`}],isError:!0};return{content:[{type:"text",text:`Decremented activeJobCount for story ${Y.id} to: ${Y.fields.activeJobCount}`}]}}catch(Y){return{content:[{type:"text",text:`Error: ${Y.message}`}],isError:!0}}},y16={name:"decrement_story_job_count",title:"Decrement Story Job Count",description:"Decrement a story's activeJobCount field (for manual tracking of agent activity). Guards against going below zero.",schema:dI1,execute:nI1};var b16=[E16,L16,S16,I16,x16,g16,y16];V6();var aI1=A.object({id:A.string().describe('Asset ID (e.g., "Aa1")')}),oI1=async({core:$,projectId:K},{id:q})=>{try{let{buffer:Y,mimeType:J,sizeBytes:z,hash:W,originalFilename:Z}=await $.readAssetBinary(K,{id:q});return{content:[{type:"image",data:Y.toString("base64"),mimeType:J},{type:"text",text:JSON.stringify({id:q,originalFilename:Z,sizeBytes:z,hash:W},null,2)}]}}catch(Y){return{content:[{type:"text",text:Y.code==="ASSET_NOT_FOUND"||Y.code==="BLOB_NOT_FOUND"?Y.message:`Error: ${Y.message}`}],isError:!0}}},u16={name:"read_asset",title:"Read Asset",description:"Read an asset image by ID. Returns the image as base64-encoded data that Claude can view. Supported formats: PNG, JPEG, GIF, WebP. Maximum size: 10MB.",schema:aI1,execute:oI1};var m16=[u16];V6();var rI1=A.object({store:A.string().optional().describe('Store code (default: "A")'),status:A.string().optional().describe("Filter by status (pending, running, completed, error, stopped)")}),sI1=async({core:$,projectId:K},{store:q,status:Y})=>{try{let J=await $.listJobs(K,{store:q||"A",status:Y});if(J.length===0)return{content:[{type:"text",text:"No jobs found"}]};return{content:[{type:"text",text:J.map((W)=>`${W.id}: ${W.name} [${W.fields.status}]`).join(`
748
748
  `)}]}}catch(J){return{content:[{type:"text",text:`Error: ${J.message}`}],isError:!0}}},B16={name:"list_jobs",title:"List Jobs",description:"List all jobs",schema:rI1,execute:sI1};V6();var tI1=A.object({id:A.string().describe('Job ID (e.g., "Aj1")')}),eI1=async({core:$,projectId:K},{id:q})=>{try{let Y=await $.getJob(K,{id:q}),J=Y.fields||{};return{content:[{type:"text",text:[`Job: ${Y.id}`,`Name: ${Y.name}`,`Status: ${J.status}`,`PID: ${J.pid||"N/A"}`,`Agent: ${J.agent}`,`Started: ${J.startedAt||"N/A"}`,`Completed: ${J.completedAt||"N/A"}`].join(`
749
- `)}]}}catch(Y){return{content:[{type:"text",text:`Error: ${Y.message}`}],isError:!0}}},U16={name:"read_job",title:"Read Job",description:"Get job details",schema:tI1,execute:eI1};var F16=[B16,U16];V6();A1();var $x1=A.object({query:A.string().describe("FTS5 search query"),field_name:A.string().optional().describe("Filter by field definition name"),store:A.string().optional().describe('Store code (default: "A")')}),Kx1=async({core:$,projectId:K},{query:q,field_name:Y,store:J})=>{try{let z=await $.searchTextFields(K,{query:q,fieldName:Y,store:J||"A"});return{content:[{type:"text",text:JSON.stringify(z,null,2)}]}}catch(z){if(z.message?.includes("fts5: syntax error"))return{content:[{type:"text",text:`Error: ${S.validation('Invalid FTS5 query syntax. Valid syntax includes: simple terms (hello world), phrases ("hello world"), boolean (hello OR world), prefix (hel*), negation (hello NOT world)',"INVALID_FTS5_QUERY").message}`}],isError:!0};return{content:[{type:"text",text:`Error: ${z.message}`}],isError:!0}}},p16={name:"search_text_fields",title:"Search Text Fields",description:"Search text field content using FTS5 full-text search. Returns matching entity IDs, field names, and BM25 relevance ranking. Supports store:X filter to override store parameter.",schema:$x1,execute:Kx1};V6();A1();var qx1=A.object({query:A.string().describe("FTS5 search query"),store:A.string().optional().describe('Store code (default: "A")'),limit:A.number().int().positive().optional().describe("Maximum results (default: 20)"),offset:A.number().int().min(0).optional().describe("Pagination offset (default: 0)"),start_marker:A.string().optional().describe('Snippet highlight start marker (default: "<mark>")'),end_marker:A.string().optional().describe('Snippet highlight end marker (default: "</mark>")')}),Yx1=async({core:$,projectId:K},{query:q,store:Y,limit:J,offset:z,start_marker:W,end_marker:Z})=>{try{let H=await $.searchContent(K,{query:q,store:Y||"A",limit:J??20,offset:z??0,startMarker:W??"<mark>",endMarker:Z??"</mark>"});return{content:[{type:"text",text:JSON.stringify(H,null,2)}]}}catch(H){if(H.message?.includes("fts5: syntax error"))return{content:[{type:"text",text:`Error: ${S.validation('Invalid FTS5 query syntax. Valid syntax includes: simple terms (hello world), phrases ("hello world"), boolean (hello OR world), prefix (hel*), negation (hello NOT world)',"INVALID_FTS5_QUERY").message}`}],isError:!0};return{content:[{type:"text",text:`Error: ${H.message}`}],isError:!0}}},Q16={name:"search",title:"Search Document Content",description:'Search document content using FTS5 full-text search. Returns matching documents with entity IDs, paths, names, BM25 relevance scores, and content snippets. Response includes debug.strategy field indicating execution path: "fts-first" (FTS query with optional filters) or "filters-only" (no FTS, filters applied directly). Query syntax: simple terms (hello), phrases ("hello world"), boolean (hello OR world), prefix (auth*), negation (hello NOT world). Filters: type:document, type:template, type:d/task, store:X (overrides store parameter), fieldName:value (string field equality). For multi-value fields, matches if ANY value equals the filter (contains semantics).',schema:qx1,execute:Yx1};var c16=[p16,Q16];var Jx1=({core:$,projectId:K})=>{let q=new _r({name:"caw-server",version:"0.0.1"},{capabilities:{tools:{}}}),Y=[...K16,...z16,...T16,...N16,...h16,...b16,...m16,...F16,...c16];for(let J of Y)q.registerTool(J.name,{title:J.title,description:J.description,inputSchema:J.schema},async(z,W)=>{try{let Z=W?.sessionId||W?.requestInfo?.headers?.["mcp-session-id"];return await J.execute({core:$,projectId:K,sessionId:Z},z)}catch(Z){return console.error(`Tool ${J.name} failed:`,Z),{content:[{type:"text",text:`Tool execution failed: ${Z.message}`}],isError:!0}}});return q},l16=Object.freeze({createMcpServer:Jx1});var Wx1=kr.default("caw:mcp"),k5=kr.default("caw:mcp:session"),Zx1=({core:$})=>{let K=new Map;return Object.freeze({handleRequest:async(W,Z,{projectId:H})=>{let O=W.headers["mcp-session-id"];if(O){let G=K.get(O);if(!G)return k5("Session not found: %s",O),Z.status(404).json({jsonrpc:"2.0",error:{code:-32001,message:"Session not found. Server may have been restarted. If so, ask user to reconnect"},id:null});if(G.projectId!==H)return k5("Session %s belongs to project %s, not %s",O,G.projectId,H),Z.status(404).json({jsonrpc:"2.0",error:{code:-32001,message:"Session not found. Server may have been restarted. If so, ask user to reconnect"},id:null});k5("Routing request to existing session: %s",O),G.lastActivity=Date.now();try{return await G.transport.handleRequest(W,Z,W.body)}catch(j){console.error("MCP transport request failed:",j)}}k5("Creating new MCP session for project: %s",H);let X=null,P=new zo({sessionIdGenerator:()=>{return X=zx1(),k5("Generated session ID: %s",X),X},onsessioninitialized:(G)=>{k5("Session initialized: %s",G),Z.setHeader("Mcp-Session-Id",G),T.sessionId=G,K.set(G,T),k5("Session stored: %s",G)}});k5("Creating new server for session");let w=l16.createMcpServer({core:$,projectId:H});try{await w.connect(P)}catch(G){return console.error("MCP server connect failed:",G),P.close?.(),w.close?.(),Z.status(500).json({jsonrpc:"2.0",error:{code:-32603,message:"Internal server error"},id:null})}let T={sessionId:null,transport:P,server:w,projectId:H,createdAt:Date.now(),lastActivity:Date.now()};Z.on("finish",()=>{if(Z.statusCode!==200&&X&&K.has(X))k5("Request failed (status %d), cleaning up session: %s",Z.statusCode,X),K.delete(X),P.close?.(),w.close?.()});try{await P.handleRequest(W,Z,W.body)}catch(G){console.error("MCP transport request failed:",G)}},getSession:(W)=>{return K.get(W)},closeSession:(W)=>{let Z=K.get(W);if(!Z){k5("Cannot close session - not found: %s",W);return}k5("Closing session: %s",W),Z.transport.close?.(),Z.server.close?.(),K.delete(W)},cleanupIdle:(W)=>{let Z=Date.now(),H=0;for(let[O,X]of K.entries())if(Z-X.lastActivity>W)k5("Cleaning up idle session: %s (idle for %dms)",O,Z-X.lastActivity),X.transport.close?.(),X.server.close?.(),K.delete(O),H++;if(H>0)Wx1("Cleaned up %d idle sessions",H)}})},i16=Object.freeze({create:Zx1});var Hx1=86400000,Ox1=300000,Xx1=({mcpSessionManager:$})=>{let{jobFns:K,controlFns:q}=rC.create({name:"cleanup-idle-mcp-sessions",interval:Ox1,execute:async()=>{$.cleanupIdle(Hx1)}});return{job:Object.freeze(K),control:q}},d16=Object.freeze({create:Xx1});var fL=S46.default("caw:server"),dx1=async({port:$,envDir:K,databaseFilepath:q,assetsDir:Y,lazilyCreateDb:J,enableRest:z,enableSse:W,enableStatic:Z,enableCrons:H,enableMcp:O=!0,enableCli:X=!0,staticPath:P,kyselyFactory:w})=>{let T=await Ii8.create({envDir:K,databaseFilepath:q,assetsDir:Y,lazilyCreateDb:J,kyselyFactory:w}),G=mr.default();if(G.use(mr.default.json()),G.get("/health",(k,R)=>{R.json({status:"ok"})}),G.get("/api/info",(k,R)=>{R.json({version:"1.0.59"})}),z)G.use("/api",ha8),bi8.create(G,{core:T}),Bi8.create(G,{core:T}),Ui8.create(G,{core:T}),pi8.create(G,{core:T}),ci8.create(G,{core:T}),ii8.create(G,{core:T}),ni8.create(G,{core:T}),Aa8.create(G,{core:T}),_a8.create(G,{core:T}),Na8.create(G,{core:T}),Ra8.create(G,{core:T});if(W)Da8.create(G,{core:T});if(Z&&P)gi8.create(G,{staticPath:P});if(O){fL("Initializing MCP subsystem...");let k=i16.create({core:T});T.registerCronJob(d16,{mcpSessionManager:k}),La8.create(G,{core:T,mcpSessionManager:k}),fL("MCP subsystem initialized")}if(X){fL("Initializing CLI Adapter subsystem...");let k=(await Promise.resolve().then(() => (v46(),j46))).default,R=(await Promise.resolve().then(() => (_46(),M46))).default,C=(await Promise.resolve().then(() => (D46(),C46))).default,L=(await Promise.resolve().then(() => (L46(),E46))).default,h=C.create({mcpClientFactory:k.create(),aliasGenerator:R.create(),core:T});await h.init(),L.create(G,{cliSessionManager:h}),fL("CLI Adapter subsystem initialized")}if(H)T.startAllCrons();let j=null,v=new Set;return Object.freeze({app:G,core:T,start:async()=>{return new Promise((k)=>{j=G.listen($,()=>{let R=j.address().port;k(R)}),j.on("connection",(R)=>{v.add(R),R.on("close",()=>{v.delete(R)})})})},stop:async()=>{if(T.stopAllCrons(),j){for(let k of v)k.destroy();return v.clear(),new Promise((k)=>{j.close(()=>{k()})})}}})},I46=Object.freeze({create:dx1});var ax1=3131,ox1=RL.join(RL.dirname(nx1(import.meta.url)),"public_html"),rx1=!0,sx1=!0,tx1=!0,ex1=!0,$g1=!1,Kg1=!0,qg1=!0,Yg1=!0,i2=($,K)=>$!==void 0?$==="true":K,Jg1=()=>{let $=process.env.CAW_ENV_DIR;if(!$)console.error("ERROR: CAW_ENV_DIR environment variable is required"),console.error("Set it to the path of your environment folder, e.g.:"),console.error(' export CAW_ENV_DIR="$HOME/.caw/dev"'),process.exit(1);return{envDir:$,databaseFilepath:RL.join($,"caw.db"),assetsDir:RL.join($,"assets")}},zg1=async($)=>{let K=await I46.create($),q=await K.start();console.log(`Server listening on port ${q}`),process.on("SIGINT",()=>K.stop("SIGINT")),process.on("SIGTERM",()=>K.stop("SIGTERM"))},Wg1=()=>{let{envDir:$,databaseFilepath:K,assetsDir:q}=Jg1(),Y=process.env.CAW_PORT?Number(process.env.CAW_PORT):ax1,J=process.env.STATIC_PATH||ox1,z=i2(process.env.LAZY_CREATE_DB,rx1),W=i2(process.env.ENABLE_REST,sx1),Z=i2(process.env.ENABLE_MCP,tx1),H=i2(process.env.ENABLE_CLI,ex1),O=i2(process.env.ENABLE_WEBLLM_WSS,$g1),X=i2(process.env.ENABLE_SSE,Kg1),P=i2(process.env.ENABLE_STATIC,qg1),w=i2(process.env.ENABLE_CRONS,Yg1);return Object.freeze({port:Y,staticPath:J,envDir:$,databaseFilepath:K,assetsDir:q,lazilyCreateDb:z,enableRest:W,enableMcp:Z,enableCli:H,enableWebllmWss:O,enableSse:X,enableStatic:P,enableCrons:w})};await zg1(Wg1()).catch(($)=>{console.error("ERROR: Failed to start server:",$),process.exit(1)});
749
+ `)}]}}catch(Y){return{content:[{type:"text",text:`Error: ${Y.message}`}],isError:!0}}},U16={name:"read_job",title:"Read Job",description:"Get job details",schema:tI1,execute:eI1};var F16=[B16,U16];V6();A1();var $x1=A.object({query:A.string().describe("FTS5 search query"),field_name:A.string().optional().describe("Filter by field definition name"),store:A.string().optional().describe('Store code (default: "A")')}),Kx1=async({core:$,projectId:K},{query:q,field_name:Y,store:J})=>{try{let z=await $.searchTextFields(K,{query:q,fieldName:Y,store:J||"A"});return{content:[{type:"text",text:JSON.stringify(z,null,2)}]}}catch(z){if(z.message?.includes("fts5: syntax error"))return{content:[{type:"text",text:`Error: ${S.validation('Invalid FTS5 query syntax. Valid syntax includes: simple terms (hello world), phrases ("hello world"), boolean (hello OR world), prefix (hel*), negation (hello NOT world)',"INVALID_FTS5_QUERY").message}`}],isError:!0};return{content:[{type:"text",text:`Error: ${z.message}`}],isError:!0}}},p16={name:"search_text_fields",title:"Search Text Fields",description:"Search text field content using FTS5 full-text search. Returns matching entity IDs, field names, and BM25 relevance ranking. Supports store:X filter to override store parameter.",schema:$x1,execute:Kx1};V6();A1();var qx1=A.object({query:A.string().describe("FTS5 search query"),store:A.string().optional().describe('Store code (default: "A")'),limit:A.number().int().positive().optional().describe("Maximum results (default: 20)"),offset:A.number().int().min(0).optional().describe("Pagination offset (default: 0)"),start_marker:A.string().optional().describe('Snippet highlight start marker (default: "<mark>")'),end_marker:A.string().optional().describe('Snippet highlight end marker (default: "</mark>")')}),Yx1=async({core:$,projectId:K},{query:q,store:Y,limit:J,offset:z,start_marker:W,end_marker:Z})=>{try{let H=await $.searchContent(K,{query:q,store:Y||"A",limit:J??20,offset:z??0,startMarker:W??"<mark>",endMarker:Z??"</mark>"});return{content:[{type:"text",text:JSON.stringify(H,null,2)}]}}catch(H){if(H.message?.includes("fts5: syntax error"))return{content:[{type:"text",text:`Error: ${S.validation('Invalid FTS5 query syntax. Valid syntax includes: simple terms (hello world), phrases ("hello world"), boolean (hello OR world), prefix (hel*), negation (hello NOT world)',"INVALID_FTS5_QUERY").message}`}],isError:!0};return{content:[{type:"text",text:`Error: ${H.message}`}],isError:!0}}},Q16={name:"search",title:"Search Document Content",description:'Search document content using FTS5 full-text search. Returns matching documents with entity IDs, paths, names, BM25 relevance scores, and content snippets. Response includes debug.strategy field indicating execution path: "fts-first" (FTS query with optional filters) or "filters-only" (no FTS, filters applied directly). Query syntax: simple terms (hello), phrases ("hello world"), boolean (hello OR world), prefix (auth*), negation (hello NOT world). Filters: type:document, type:template, type:d/task, store:X (overrides store parameter), fieldName:value (string field equality). For multi-value fields, matches if ANY value equals the filter (contains semantics).',schema:qx1,execute:Yx1};var c16=[p16,Q16];var Jx1=({core:$,projectId:K})=>{let q=new _r({name:"caw-server",version:"0.0.1"},{capabilities:{tools:{}}}),Y=[...K16,...z16,...T16,...N16,...h16,...b16,...m16,...F16,...c16];for(let J of Y)q.registerTool(J.name,{title:J.title,description:J.description,inputSchema:J.schema},async(z,W)=>{try{let Z=W?.sessionId||W?.requestInfo?.headers?.["mcp-session-id"];return await J.execute({core:$,projectId:K,sessionId:Z},z)}catch(Z){return console.error(`Tool ${J.name} failed:`,Z),{content:[{type:"text",text:`Tool execution failed: ${Z.message}`}],isError:!0}}});return q},l16=Object.freeze({createMcpServer:Jx1});var Wx1=kr.default("caw:mcp"),k5=kr.default("caw:mcp:session"),Zx1=({core:$})=>{let K=new Map;return Object.freeze({handleRequest:async(W,Z,{projectId:H})=>{let O=W.headers["mcp-session-id"];if(O){let G=K.get(O);if(!G)return k5("Session not found: %s",O),Z.status(404).json({jsonrpc:"2.0",error:{code:-32001,message:"Session not found. Server may have been restarted. If so, ask user to reconnect"},id:null});if(G.projectId!==H)return k5("Session %s belongs to project %s, not %s",O,G.projectId,H),Z.status(404).json({jsonrpc:"2.0",error:{code:-32001,message:"Session not found. Server may have been restarted. If so, ask user to reconnect"},id:null});k5("Routing request to existing session: %s",O),G.lastActivity=Date.now();try{return await G.transport.handleRequest(W,Z,W.body)}catch(j){console.error("MCP transport request failed:",j)}}k5("Creating new MCP session for project: %s",H);let X=null,P=new zo({sessionIdGenerator:()=>{return X=zx1(),k5("Generated session ID: %s",X),X},onsessioninitialized:(G)=>{k5("Session initialized: %s",G),Z.setHeader("Mcp-Session-Id",G),T.sessionId=G,K.set(G,T),k5("Session stored: %s",G)}});k5("Creating new server for session");let w=l16.createMcpServer({core:$,projectId:H});try{await w.connect(P)}catch(G){return console.error("MCP server connect failed:",G),P.close?.(),w.close?.(),Z.status(500).json({jsonrpc:"2.0",error:{code:-32603,message:"Internal server error"},id:null})}let T={sessionId:null,transport:P,server:w,projectId:H,createdAt:Date.now(),lastActivity:Date.now()};Z.on("finish",()=>{if(Z.statusCode!==200&&X&&K.has(X))k5("Request failed (status %d), cleaning up session: %s",Z.statusCode,X),K.delete(X),P.close?.(),w.close?.()});try{await P.handleRequest(W,Z,W.body)}catch(G){console.error("MCP transport request failed:",G)}},getSession:(W)=>{return K.get(W)},closeSession:(W)=>{let Z=K.get(W);if(!Z){k5("Cannot close session - not found: %s",W);return}k5("Closing session: %s",W),Z.transport.close?.(),Z.server.close?.(),K.delete(W)},cleanupIdle:(W)=>{let Z=Date.now(),H=0;for(let[O,X]of K.entries())if(Z-X.lastActivity>W)k5("Cleaning up idle session: %s (idle for %dms)",O,Z-X.lastActivity),X.transport.close?.(),X.server.close?.(),K.delete(O),H++;if(H>0)Wx1("Cleaned up %d idle sessions",H)}})},i16=Object.freeze({create:Zx1});var Hx1=86400000,Ox1=300000,Xx1=({mcpSessionManager:$})=>{let{jobFns:K,controlFns:q}=rC.create({name:"cleanup-idle-mcp-sessions",interval:Ox1,execute:async()=>{$.cleanupIdle(Hx1)}});return{job:Object.freeze(K),control:q}},d16=Object.freeze({create:Xx1});var fL=S46.default("caw:server"),dx1=async({port:$,envDir:K,databaseFilepath:q,assetsDir:Y,lazilyCreateDb:J,enableRest:z,enableSse:W,enableStatic:Z,enableCrons:H,enableMcp:O=!0,enableCli:X=!0,staticPath:P,kyselyFactory:w})=>{let T=await Ii8.create({envDir:K,databaseFilepath:q,assetsDir:Y,lazilyCreateDb:J,kyselyFactory:w}),G=mr.default();if(G.use(mr.default.json()),G.get("/health",(k,R)=>{R.json({status:"ok"})}),G.get("/api/info",(k,R)=>{R.json({version:"1.0.60"})}),z)G.use("/api",ha8),bi8.create(G,{core:T}),Bi8.create(G,{core:T}),Ui8.create(G,{core:T}),pi8.create(G,{core:T}),ci8.create(G,{core:T}),ii8.create(G,{core:T}),ni8.create(G,{core:T}),Aa8.create(G,{core:T}),_a8.create(G,{core:T}),Na8.create(G,{core:T}),Ra8.create(G,{core:T});if(W)Da8.create(G,{core:T});if(Z&&P)gi8.create(G,{staticPath:P});if(O){fL("Initializing MCP subsystem...");let k=i16.create({core:T});T.registerCronJob(d16,{mcpSessionManager:k}),La8.create(G,{core:T,mcpSessionManager:k}),fL("MCP subsystem initialized")}if(X){fL("Initializing CLI Adapter subsystem...");let k=(await Promise.resolve().then(() => (v46(),j46))).default,R=(await Promise.resolve().then(() => (_46(),M46))).default,C=(await Promise.resolve().then(() => (D46(),C46))).default,L=(await Promise.resolve().then(() => (L46(),E46))).default,h=C.create({mcpClientFactory:k.create(),aliasGenerator:R.create(),core:T});await h.init(),L.create(G,{cliSessionManager:h}),fL("CLI Adapter subsystem initialized")}if(H)T.startAllCrons();let j=null,v=new Set;return Object.freeze({app:G,core:T,start:async()=>{return new Promise((k)=>{j=G.listen($,()=>{let R=j.address().port;k(R)}),j.on("connection",(R)=>{v.add(R),R.on("close",()=>{v.delete(R)})})})},stop:async()=>{if(T.stopAllCrons(),j){for(let k of v)k.destroy();return v.clear(),new Promise((k)=>{j.close(()=>{k()})})}}})},I46=Object.freeze({create:dx1});var ax1=3131,ox1=RL.join(RL.dirname(nx1(import.meta.url)),"public_html"),rx1=!0,sx1=!0,tx1=!0,ex1=!0,$g1=!1,Kg1=!0,qg1=!0,Yg1=!0,i2=($,K)=>$!==void 0?$==="true":K,Jg1=()=>{let $=process.env.CAW_ENV_DIR;if(!$)console.error("ERROR: CAW_ENV_DIR environment variable is required"),console.error("Set it to the path of your environment folder, e.g.:"),console.error(' export CAW_ENV_DIR="$HOME/.caw/dev"'),process.exit(1);return{envDir:$,databaseFilepath:RL.join($,"caw.db"),assetsDir:RL.join($,"assets")}},zg1=async($)=>{let K=await I46.create($),q=await K.start();console.log(`Server listening on port ${q}`),process.on("SIGINT",()=>K.stop("SIGINT")),process.on("SIGTERM",()=>K.stop("SIGTERM"))},Wg1=()=>{let{envDir:$,databaseFilepath:K,assetsDir:q}=Jg1(),Y=process.env.CAW_PORT?Number(process.env.CAW_PORT):ax1,J=process.env.STATIC_PATH||ox1,z=i2(process.env.LAZY_CREATE_DB,rx1),W=i2(process.env.ENABLE_REST,sx1),Z=i2(process.env.ENABLE_MCP,tx1),H=i2(process.env.ENABLE_CLI,ex1),O=i2(process.env.ENABLE_WEBLLM_WSS,$g1),X=i2(process.env.ENABLE_SSE,Kg1),P=i2(process.env.ENABLE_STATIC,qg1),w=i2(process.env.ENABLE_CRONS,Yg1);return Object.freeze({port:Y,staticPath:J,envDir:$,databaseFilepath:K,assetsDir:q,lazilyCreateDb:z,enableRest:W,enableMcp:Z,enableCli:H,enableWebllmWss:O,enableSse:X,enableStatic:P,enableCrons:w})};await zg1(Wg1()).catch(($)=>{console.error("ERROR: Failed to start server:",$),process.exit(1)});