import { env } from 'cloudflare:workers'; import { D1Store } from '@/core/store'; import { execute } from '@/core/service'; import { runLiveAutonomyTick } from '@/core/autonomy'; import type { RuntimeConfig } from '@/core/types'; function requestOriginAllowed(request:Request){ const origin=request.headers.get('origin'); if(!origin)return true; if(origin===new URL(request.url).origin)return true; const proto=(request.headers.get('x-forwarded-proto')??'').split(',')[0]?.trim().toLowerCase(); const host=(request.headers.get('x-forwarded-host')??request.headers.get('host')??'').split(',')[0]?.trim(); if((proto==='http'||proto==='https')&&host&&origin===`${proto}://${host}`)return true; return false; } export async function POST(request:Request){ if(!requestOriginAllowed(request))return Response.json({error:'Cross-origin action rejected'},{status:403}); try{ const text=await request.text(); if(text.length>16000)return Response.json({error:'Request too large'},{status:413}); const body=JSON.parse(text); const store=new D1Store(); if(body?.type==='think'&&typeof body.botId==='string'){ const state=await store.load(); const bot=state.bots.find(b=>b.id===body.botId); if(bot?.autonomy?.managed){ const result=await runLiveAutonomyTick(store,env.DB!,env as unknown as RuntimeConfig,{forceBotId:bot.id}); if(!result.ran)throw new Error(result.reason); return Response.json(result); } } return Response.json(await execute(store,body,env as unknown as RuntimeConfig)); } catch(e){const message=e instanceof Error?e.message:'Action failed';return Response.json({error:message},{status:400});} }