summaryrefslogtreecommitdiff
path: root/makima/cloudflare-agent/src/index.ts
diff options
context:
space:
mode:
Diffstat (limited to 'makima/cloudflare-agent/src/index.ts')
-rw-r--r--makima/cloudflare-agent/src/index.ts47
1 files changed, 47 insertions, 0 deletions
diff --git a/makima/cloudflare-agent/src/index.ts b/makima/cloudflare-agent/src/index.ts
new file mode 100644
index 0000000..0b64af4
--- /dev/null
+++ b/makima/cloudflare-agent/src/index.ts
@@ -0,0 +1,47 @@
+/**
+ * Makima Cloudflare Agent — Worker Entry Point
+ *
+ * Routes incoming requests to the MakimaAgent Durable Object which manages
+ * the upstream WebSocket connection to the Makima server and relays tasks
+ * to downstream native daemon instances.
+ *
+ * Routes:
+ * GET / → Agent status (JSON)
+ * GET /status → Agent status (JSON)
+ * GET /health → Health check
+ * GET /tasks → Task history (paginated)
+ * GET /logs → Connection logs
+ * POST /reconnect → Force upstream reconnection
+ * * /ws → WebSocket upgrade for downstream daemons
+ * * /agent/* → Forwarded to Agent's onRequest handler
+ */
+
+import { MakimaAgent } from "./agent";
+import type { Env } from "./types";
+
+export { MakimaAgent };
+
+export default {
+ async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
+ const url = new URL(request.url);
+
+ // Use a singleton Durable Object — all traffic routes to one agent
+ // instance identified by a fixed name. This ensures a single persistent
+ // upstream WebSocket to the Makima server.
+ const agentId = env.MAKIMA_AGENT.idFromName("makima-relay-primary");
+ const agent = env.MAKIMA_AGENT.get(agentId);
+
+ // WebSocket upgrade path — downstream daemons connect here
+ if (url.pathname === "/ws" || url.pathname === "/ws/daemon") {
+ const upgradeHeader = request.headers.get("Upgrade");
+ if (upgradeHeader !== "websocket") {
+ return new Response("Expected WebSocket upgrade", { status: 426 });
+ }
+ // Forward the WebSocket upgrade to the Durable Object
+ return agent.fetch(request);
+ }
+
+ // All other routes are forwarded to the Durable Object's onRequest handler
+ return agent.fetch(request);
+ },
+};