@kelceyp/caw-server 1.0.40 → 1.0.41
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 +1 -1
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -729,4 +729,4 @@ State: ${z.fields.state}
|
|
|
729
729
|
|
|
730
730
|
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}}},H16={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:UL1,execute:pL1};V6();var FL1=A.object({id:A.string().describe('Story ID (e.g., "As1")')}),cL1=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}}},O16={name:"increment_story_job_count",title:"Increment Story Job Count",description:"Increment a story's activeJobCount field (for manual tracking of agent activity)",schema:FL1,execute:cL1};V6();var QL1=A.object({id:A.string().describe('Story ID (e.g., "As1")')}),lL1=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}}},X16={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:QL1,execute:lL1};var P16=[J16,z16,W16,Z16,H16,O16,X16];V6();var iL1=A.object({id:A.string().describe('Asset ID (e.g., "Aa1")')}),dL1=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}}},w16={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:iL1,execute:dL1};var T16=[w16];V6();var nL1=A.object({store:A.string().optional().describe('Store code (default: "A")'),status:A.string().optional().describe("Filter by status (pending, running, completed, error)")}),oL1=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(`
|
|
731
731
|
`)}]}}catch(J){return{content:[{type:"text",text:`Error: ${J.message}`}],isError:!0}}},G16={name:"list_jobs",title:"List Jobs",description:"List all jobs",schema:nL1,execute:oL1};V6();var aL1=A.object({id:A.string().describe('Job ID (e.g., "Aj1")')}),rL1=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(`
|
|
732
|
-
`)}]}}catch(Y){return{content:[{type:"text",text:`Error: ${Y.message}`}],isError:!0}}},j16={name:"read_job",title:"Read Job",description:"Get job details",schema:aL1,execute:rL1};var v16=[G16,j16];var sL1=({core:$,projectId:K})=>{let q=new la({name:"caw-server",version:"0.0.1"},{capabilities:{tools:{}}}),Y=[...I66,...y66,...Q66,...t66,...Y16,...P16,...T16,...v16];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},V16=Object.freeze({createMcpServer:sL1});var eL1=ia.default("caw:mcp"),O5=ia.default("caw:mcp:session"),$I1=({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 O5("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 O5("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});O5("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)}}O5("Creating new MCP session for project: %s",H);let X=null,P=new So({sessionIdGenerator:()=>{return X=tL1(),O5("Generated session ID: %s",X),X},onsessioninitialized:(G)=>{O5("Session initialized: %s",G),Z.setHeader("Mcp-Session-Id",G),T.sessionId=G,K.set(G,T),O5("Session stored: %s",G)}});O5("Creating new server for session");let w=V16.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))O5("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){O5("Cannot close session - not found: %s",W);return}O5("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)O5("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)eL1("Cleaned up %d idle sessions",H)}})},A16=Object.freeze({create:$I1});var KI1=86400000,qI1=300000,YI1=({mcpSessionManager:$})=>{let{jobFns:K,controlFns:q}=LC.create({name:"cleanup-idle-mcp-sessions",interval:qI1,execute:async()=>{$.cleanupIdle(KI1)}});return{job:Object.freeze(K),control:q}},M16=Object.freeze({create:YI1});var JS=Y46.default("caw:server"),UI1=async({port:$,databaseFilepath:K,assetsDir:q,lazilyCreateDb:Y,enableRest:J,enableSse:z,enableStatic:W,enableCrons:Z,enableMcp:H=!0,enableCli:O=!0,staticPath:X,kyselyFactory:P})=>{let w=await Pi8.create({databaseFilepath:K,assetsDir:q,lazilyCreateDb:Y,kyselyFactory:P}),T=Zr.default();if(T.use(Zr.default.json()),T.get("/health",(f,k)=>{k.json({status:"ok"})}),T.get("/api/info",(f,k)=>{k.json({version:"1.0.
|
|
732
|
+
`)}]}}catch(Y){return{content:[{type:"text",text:`Error: ${Y.message}`}],isError:!0}}},j16={name:"read_job",title:"Read Job",description:"Get job details",schema:aL1,execute:rL1};var v16=[G16,j16];var sL1=({core:$,projectId:K})=>{let q=new la({name:"caw-server",version:"0.0.1"},{capabilities:{tools:{}}}),Y=[...I66,...y66,...Q66,...t66,...Y16,...P16,...T16,...v16];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},V16=Object.freeze({createMcpServer:sL1});var eL1=ia.default("caw:mcp"),O5=ia.default("caw:mcp:session"),$I1=({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 O5("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 O5("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});O5("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)}}O5("Creating new MCP session for project: %s",H);let X=null,P=new So({sessionIdGenerator:()=>{return X=tL1(),O5("Generated session ID: %s",X),X},onsessioninitialized:(G)=>{O5("Session initialized: %s",G),Z.setHeader("Mcp-Session-Id",G),T.sessionId=G,K.set(G,T),O5("Session stored: %s",G)}});O5("Creating new server for session");let w=V16.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))O5("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){O5("Cannot close session - not found: %s",W);return}O5("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)O5("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)eL1("Cleaned up %d idle sessions",H)}})},A16=Object.freeze({create:$I1});var KI1=86400000,qI1=300000,YI1=({mcpSessionManager:$})=>{let{jobFns:K,controlFns:q}=LC.create({name:"cleanup-idle-mcp-sessions",interval:qI1,execute:async()=>{$.cleanupIdle(KI1)}});return{job:Object.freeze(K),control:q}},M16=Object.freeze({create:YI1});var JS=Y46.default("caw:server"),UI1=async({port:$,databaseFilepath:K,assetsDir:q,lazilyCreateDb:Y,enableRest:J,enableSse:z,enableStatic:W,enableCrons:Z,enableMcp:H=!0,enableCli:O=!0,staticPath:X,kyselyFactory:P})=>{let w=await Pi8.create({databaseFilepath:K,assetsDir:q,lazilyCreateDb:Y,kyselyFactory:P}),T=Zr.default();if(T.use(Zr.default.json()),T.get("/health",(f,k)=>{k.json({status:"ok"})}),T.get("/api/info",(f,k)=>{k.json({version:"1.0.41"})}),J)T.use("/api",Yo8),ji8.create(T,{core:w}),Ai8.create(T,{core:w}),Mi8.create(T,{core:w}),ki8.create(T,{core:w}),Ni8.create(T,{core:w}),Ci8.create(T,{core:w}),rn8.create(T,{core:w}),tn8.create(T,{core:w}),$o8.create(T,{core:w});if(z)qo8.create(T,{core:w});if(W&&X)Ti8.create(T,{staticPath:X});if(H){JS("Initializing MCP subsystem...");let f=A16.create({core:w});w.registerCronJob(M16,{mcpSessionManager:f}),zo8.create(T,{core:w,mcpSessionManager:f}),JS("MCP subsystem initialized")}if(O){JS("Initializing CLI Adapter subsystem...");let f=(await Promise.resolve().then(() => (Q16(),c16))).default,k=(await Promise.resolve().then(() => (n16(),d16))).default,R=(await Promise.resolve().then(() => (e16(),t16))).default,C=(await Promise.resolve().then(() => (q46(),K46))).default,E=R.create({mcpClientFactory:f.create(),aliasGenerator:k.create(),core:w});await E.init(),C.create(T,{cliSessionManager:E}),JS("CLI Adapter subsystem initialized")}if(Z)w.startAllCrons();let G=null,j=new Set;return Object.freeze({app:T,core:w,start:async()=>{return new Promise((f)=>{G=T.listen($,()=>{let k=G.address().port;f(k)}),G.on("connection",(k)=>{j.add(k),k.on("close",()=>{j.delete(k)})})})},stop:async()=>{if(w.stopAllCrons(),G){for(let f of j)f.destroy();return j.clear(),new Promise((f)=>{G.close(()=>{f()})})}}})},J46=Object.freeze({create:UI1});var FI1=3131,cI1=zS.join(zS.dirname(pI1(import.meta.url)),"public_html"),QI1=!0,lI1=!0,iI1=!0,dI1=!0,nI1=!1,oI1=!0,aI1=!0,rI1=!0,y2=($,K)=>$!==void 0?$==="true":K,sI1=()=>{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{databaseFilepath:zS.join($,"caw.db"),assetsDir:zS.join($,"assets")}},tI1=async($)=>{let K=await J46.create($),q=await K.start();console.log(`Server listening on port ${q}`),process.on("SIGINT",()=>K.stop("SIGINT")),process.on("SIGTERM",()=>K.stop("SIGTERM"))},eI1=()=>{let{databaseFilepath:$,assetsDir:K}=sI1(),q=process.env.CAW_PORT?Number(process.env.CAW_PORT):FI1,Y=process.env.STATIC_PATH||cI1,J=y2(process.env.LAZY_CREATE_DB,QI1),z=y2(process.env.ENABLE_REST,lI1),W=y2(process.env.ENABLE_MCP,iI1),Z=y2(process.env.ENABLE_CLI,dI1),H=y2(process.env.ENABLE_WEBLLM_WSS,nI1),O=y2(process.env.ENABLE_SSE,oI1),X=y2(process.env.ENABLE_STATIC,aI1),P=y2(process.env.ENABLE_CRONS,rI1);return Object.freeze({port:q,staticPath:Y,databaseFilepath:$,assetsDir:K,lazilyCreateDb:J,enableRest:z,enableMcp:W,enableCli:Z,enableWebllmWss:H,enableSse:O,enableStatic:X,enableCrons:P})};await tI1(eI1()).catch(($)=>{console.error("ERROR: Failed to start server:",$),process.exit(1)});
|