orchestrator-server 0.2.0

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 (57) hide show
  1. package/dist/index.js +355 -0
  2. package/package.json +60 -0
  3. package/prisma/migrations/20260422200035_init/migration.sql +23 -0
  4. package/prisma/migrations/migration_lock.toml +3 -0
  5. package/prisma/schema.prisma +49 -0
  6. package/prisma/seed.ts +186 -0
  7. package/prisma.config.ts +14 -0
  8. package/public/404.html +1 -0
  9. package/public/__next.__PAGE__.txt +9 -0
  10. package/public/__next._full.txt +18 -0
  11. package/public/__next._head.txt +6 -0
  12. package/public/__next._index.txt +5 -0
  13. package/public/__next._tree.txt +2 -0
  14. package/public/_next/static/3wVNKXGkEvcJKQQ41ykC8/_buildManifest.js +11 -0
  15. package/public/_next/static/3wVNKXGkEvcJKQQ41ykC8/_clientMiddlewareManifest.js +1 -0
  16. package/public/_next/static/3wVNKXGkEvcJKQQ41ykC8/_ssgManifest.js +1 -0
  17. package/public/_next/static/E8q98Qsrw4E60c3xYkyPl/_buildManifest.js +11 -0
  18. package/public/_next/static/E8q98Qsrw4E60c3xYkyPl/_clientMiddlewareManifest.js +1 -0
  19. package/public/_next/static/E8q98Qsrw4E60c3xYkyPl/_ssgManifest.js +1 -0
  20. package/public/_next/static/SwqlSKgnrxdsy4WFR-t8H/_buildManifest.js +11 -0
  21. package/public/_next/static/SwqlSKgnrxdsy4WFR-t8H/_clientMiddlewareManifest.js +1 -0
  22. package/public/_next/static/SwqlSKgnrxdsy4WFR-t8H/_ssgManifest.js +1 -0
  23. package/public/_next/static/aWmqEAVXz6UBBs_rqx3yi/_buildManifest.js +11 -0
  24. package/public/_next/static/aWmqEAVXz6UBBs_rqx3yi/_clientMiddlewareManifest.js +1 -0
  25. package/public/_next/static/aWmqEAVXz6UBBs_rqx3yi/_ssgManifest.js +1 -0
  26. package/public/_next/static/chunks/0.ash4e7s.y_n.js +1 -0
  27. package/public/_next/static/chunks/0227w9~5ech5o.js +6 -0
  28. package/public/_next/static/chunks/03~yq9q893hmn.js +1 -0
  29. package/public/_next/static/chunks/049jf9s0z~cli.js +5 -0
  30. package/public/_next/static/chunks/0mhs.xtrl10bx.css +1 -0
  31. package/public/_next/static/chunks/0njbtjaz48fw6.js +31 -0
  32. package/public/_next/static/chunks/0nv56i_s5cuzh.js +1 -0
  33. package/public/_next/static/chunks/0ozj8lowkja2v.js +1 -0
  34. package/public/_next/static/chunks/0rxy0xkqa_3on.js +6 -0
  35. package/public/_next/static/chunks/0th7jtcn7x3uc.js +6 -0
  36. package/public/_next/static/chunks/0v07aq9b8c~c4.js +5 -0
  37. package/public/_next/static/chunks/0wm_~5kuh.ots.js +31 -0
  38. package/public/_next/static/chunks/0x0nx44ub6fmc.js +1 -0
  39. package/public/_next/static/chunks/1365saokawb2b.css +1 -0
  40. package/public/_next/static/chunks/turbopack-0qtoh2fca~nc8.js +1 -0
  41. package/public/_next/static/chunks/turbopack-129sj.l69irpg.js +1 -0
  42. package/public/_next/static/mRojh1Ci0tjmSkgj_7ecu/_buildManifest.js +11 -0
  43. package/public/_next/static/mRojh1Ci0tjmSkgj_7ecu/_clientMiddlewareManifest.js +1 -0
  44. package/public/_next/static/mRojh1Ci0tjmSkgj_7ecu/_ssgManifest.js +1 -0
  45. package/public/_next/static/zGgAiq7Yp5kzCwj2dVIc8/_buildManifest.js +11 -0
  46. package/public/_next/static/zGgAiq7Yp5kzCwj2dVIc8/_clientMiddlewareManifest.js +1 -0
  47. package/public/_next/static/zGgAiq7Yp5kzCwj2dVIc8/_ssgManifest.js +1 -0
  48. package/public/_not-found/__next._full.txt +16 -0
  49. package/public/_not-found/__next._head.txt +6 -0
  50. package/public/_not-found/__next._index.txt +5 -0
  51. package/public/_not-found/__next._not-found.__PAGE__.txt +5 -0
  52. package/public/_not-found/__next._not-found.txt +5 -0
  53. package/public/_not-found/__next._tree.txt +2 -0
  54. package/public/_not-found.html +1 -0
  55. package/public/_not-found.txt +16 -0
  56. package/public/index.html +1 -0
  57. package/public/index.txt +18 -0
package/dist/index.js ADDED
@@ -0,0 +1,355 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/index.ts
4
+ import http from "http";
5
+ import path3 from "path";
6
+ import fs2 from "fs";
7
+ import Database from "better-sqlite3";
8
+ import express from "express";
9
+ import cors from "cors";
10
+
11
+ // src/routes/agents.ts
12
+ import { Router } from "express";
13
+
14
+ // src/lib/prisma.ts
15
+ import "dotenv/config";
16
+ import os from "os";
17
+ import path2 from "path";
18
+ import fs from "fs";
19
+ import { PrismaBetterSqlite3 } from "@prisma/adapter-better-sqlite3";
20
+
21
+ // src/generated/prisma/client.ts
22
+ import * as path from "path";
23
+ import { fileURLToPath } from "url";
24
+
25
+ // src/generated/prisma/internal/class.ts
26
+ import * as runtime from "@prisma/client/runtime/client";
27
+ var config = {
28
+ "previewFeatures": [],
29
+ "clientVersion": "7.8.0",
30
+ "engineVersion": "3c6e192761c0362d496ed980de936e2f3cebcd3a",
31
+ "activeProvider": "sqlite",
32
+ "inlineSchema": '// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Get a free hosted Postgres database in seconds: `npx create-db`\n\ngenerator client {\n provider = "prisma-client"\n output = "../src/generated/prisma"\n}\n\ndatasource db {\n provider = "sqlite"\n}\n\nmodel Agent {\n id String @id @default(cuid())\n name String\n status String @default("running")\n needsAttention Boolean @default(false)\n attentionReason String?\n webhookUrl String?\n currentGoal String?\n currentTask String?\n createdAt DateTime @default(now())\n endedAt DateTime?\n lastUpdateAt DateTime @default(now())\n events Event[]\n interventions Intervention[]\n}\n\nmodel Event {\n id String @id @default(cuid())\n agentId String\n type String // "info" | "error" | "warning" | "paused" | "resumed" | "instruction_modified"\n message String\n tokens Int?\n cost Float?\n timestamp DateTime @default(now())\n agent Agent @relation(fields: [agentId], references: [id])\n}\n\nmodel Intervention {\n id String @id @default(cuid())\n agentId String\n type String // "pause" | "resume" | "modify_instruction"\n payload String?\n createdAt DateTime @default(now())\n agent Agent @relation(fields: [agentId], references: [id])\n}\n',
33
+ "runtimeDataModel": {
34
+ "models": {},
35
+ "enums": {},
36
+ "types": {}
37
+ },
38
+ "parameterizationSchema": {
39
+ "strings": [],
40
+ "graph": ""
41
+ }
42
+ };
43
+ config.runtimeDataModel = JSON.parse('{"models":{"Agent":{"fields":[{"name":"id","kind":"scalar","type":"String"},{"name":"name","kind":"scalar","type":"String"},{"name":"status","kind":"scalar","type":"String"},{"name":"needsAttention","kind":"scalar","type":"Boolean"},{"name":"attentionReason","kind":"scalar","type":"String"},{"name":"webhookUrl","kind":"scalar","type":"String"},{"name":"currentGoal","kind":"scalar","type":"String"},{"name":"currentTask","kind":"scalar","type":"String"},{"name":"createdAt","kind":"scalar","type":"DateTime"},{"name":"endedAt","kind":"scalar","type":"DateTime"},{"name":"lastUpdateAt","kind":"scalar","type":"DateTime"},{"name":"events","kind":"object","type":"Event","relationName":"AgentToEvent"},{"name":"interventions","kind":"object","type":"Intervention","relationName":"AgentToIntervention"}],"dbName":null},"Event":{"fields":[{"name":"id","kind":"scalar","type":"String"},{"name":"agentId","kind":"scalar","type":"String"},{"name":"type","kind":"scalar","type":"String"},{"name":"message","kind":"scalar","type":"String"},{"name":"tokens","kind":"scalar","type":"Int"},{"name":"cost","kind":"scalar","type":"Float"},{"name":"timestamp","kind":"scalar","type":"DateTime"},{"name":"agent","kind":"object","type":"Agent","relationName":"AgentToEvent"}],"dbName":null},"Intervention":{"fields":[{"name":"id","kind":"scalar","type":"String"},{"name":"agentId","kind":"scalar","type":"String"},{"name":"type","kind":"scalar","type":"String"},{"name":"payload","kind":"scalar","type":"String"},{"name":"createdAt","kind":"scalar","type":"DateTime"},{"name":"agent","kind":"object","type":"Agent","relationName":"AgentToIntervention"}],"dbName":null}},"enums":{},"types":{}}');
44
+ config.parameterizationSchema = {
45
+ strings: JSON.parse('["where","orderBy","cursor","agent","events","interventions","_count","Agent.findUnique","Agent.findUniqueOrThrow","Agent.findFirst","Agent.findFirstOrThrow","Agent.findMany","data","Agent.createOne","Agent.createMany","Agent.createManyAndReturn","Agent.updateOne","Agent.updateMany","Agent.updateManyAndReturn","create","update","Agent.upsertOne","Agent.deleteOne","Agent.deleteMany","having","_min","_max","Agent.groupBy","Agent.aggregate","Event.findUnique","Event.findUniqueOrThrow","Event.findFirst","Event.findFirstOrThrow","Event.findMany","Event.createOne","Event.createMany","Event.createManyAndReturn","Event.updateOne","Event.updateMany","Event.updateManyAndReturn","Event.upsertOne","Event.deleteOne","Event.deleteMany","_avg","_sum","Event.groupBy","Event.aggregate","Intervention.findUnique","Intervention.findUniqueOrThrow","Intervention.findFirst","Intervention.findFirstOrThrow","Intervention.findMany","Intervention.createOne","Intervention.createMany","Intervention.createManyAndReturn","Intervention.updateOne","Intervention.updateMany","Intervention.updateManyAndReturn","Intervention.upsertOne","Intervention.deleteOne","Intervention.deleteMany","Intervention.groupBy","Intervention.aggregate","AND","OR","NOT","id","agentId","type","payload","createdAt","equals","in","notIn","lt","lte","gt","gte","not","contains","startsWith","endsWith","message","tokens","cost","timestamp","name","status","needsAttention","attentionReason","webhookUrl","currentGoal","currentTask","endedAt","lastUpdateAt","every","some","none","is","isNot","connectOrCreate","upsert","createMany","set","disconnect","delete","connect","updateMany","deleteMany","increment","decrement","multiply","divide"]'),
46
+ graph: "twEcMBAEAABvACAFAABwACA_AABpADBAAAAOABBBAABpADBCAQAAAAFGQABtACFWAQBqACFXAQBqACFYIABrACFZAQBsACFaAQBsACFbAQBsACFcAQBsACFdQABuACFeQABtACEBAAAAAQAgCwMAAHIAID8AAHMAMEAAAAMAEEEAAHMAMEIBAGoAIUMBAGoAIUQBAGoAIVIBAGoAIVMCAHQAIVQIAHUAIVVAAG0AIQMDAACrAQAgUwAAdgAgVAAAdgAgCwMAAHIAID8AAHMAMEAAAAMAEEEAAHMAMEIBAAAAAUMBAGoAIUQBAGoAIVIBAGoAIVMCAHQAIVQIAHUAIVVAAG0AIQMAAAADACABAAAEADACAAAFACAJAwAAcgAgPwAAcQAwQAAABwAQQQAAcQAwQgEAagAhQwEAagAhRAEAagAhRQEAbAAhRkAAbQAhAgMAAKsBACBFAAB2ACAJAwAAcgAgPwAAcQAwQAAABwAQQQAAcQAwQgEAAAABQwEAagAhRAEAagAhRQEAbAAhRkAAbQAhAwAAAAcAIAEAAAgAMAIAAAkAIAEAAAADACABAAAABwAgAQAAAAEAIBAEAABvACAFAABwACA_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_AABpADBAAAAOABBBAABpADBCAQBqACFGQABtACFWAQBqACFXAQBqACFYIABrACFZAQBsACFaAQBsACFbAQBsACFcAQBsACFdQABuACFeQABtACELRwEAAAABSAEAAAAESQEAAAAESgEAAAABSwEAAAABTAEAAAABTQEAAAABTgEAWwAhTwEAAAABUAEAAAABUQEAAAABAkcgAAAAAU4gAGgAIQtHAQAAAAFIAQAAAAVJAQAAAAVKAQAAAAFLAQAAAAFMAQAAAAFNAQAAAAFOAQBZACFPAQAAAAFQAQAAAAFRAQAAAAEIR0AAAAABSEAAAAAESUAAAAAESkAAAAABS0AAAAABTEAAAAABTUAAAAABTkAAVgAhCEdAAAAAAUhAAAAABUlAAAAABUpAAAAAAUtAAAAAAUxAAAAAAU1AAAAAAU5AAGYAIQNfAAADACBgAAADACBhAAADACADXwAABwAgYAAABwAgYQAABwAgCQMAAHIAID8AAHEAMEAAAAcAEEEAAHEAMEIBAGoAIUMBAGoAIUQBAGoAIUUBAGwAIUZAAG0AIRIEAABvACAFAABwACA_AABpADBAAAAOABBBAABpADBCAQBqACFGQABtACFWAQBqACFXAQBqACFYIABrACFZAQBsACFaAQBsACFbAQBsACFcAQBsACFdQABuACFeQABtACFiAAAOACBjAAAOACALAwAAcgAgPwAAcwAwQAAAAwAQQQAAcwAwQgEAagAhQwEAagAhRAEAagAhUgEAagAhUwIAdAAhVAgAdQAhVUAAbQAhCEcCAAAAAUgCAAAABUkCAAAABUoCAAAAAUsCAAAAAUwCAAAAAU0CAAAAAU4CAFgAIQhHCAAAAAFICAAAAAVJCAAAAAVKCAAAAAFLCAAAAAFMCAAAAAFNCAAAAAFOCABgACEAAAAAAWcBAAAAAQFnAQAAAAEBZ0AAAAABBRMAALMBACAUAAC2AQAgZAAAtAEAIGUAALUBACBqAAABACADEwAAswEAIGQAALQBACBqAAABACAAAAAAAAVnAgAAAAFtAgAAAAFuAgAAAAFvAgAAAAFwAgAAAAEFZwgAAAABbQgAAAABbggAAAABbwgAAAABcAgAAAABBRMAAK4BACAUAACxAQAgZAAArwEAIGUAALABACBqAAABACADEwAArgEAIGQAAK8BACBqAAABACAAAAABZyAAAAABAWdAAAAAAQsTAACbAQAwFAAAoAEAMGQAAJwBADBlAACdAQAwZgAAngEAIGcAAJ8BADBoAACfAQAwaQAAnwEAMGoAAJ8BADBrAAChAQAwbAAAogEAMAsTAACPAQAwFAAAlAEAMGQAAJABADBlAACRAQAwZgAAkgEAIGcAAJMBADBoAACTAQAwaQAAkwEAMGoAAJMBADBrAACVAQAwbAAAlgEAMARCAQAAAAFEAQAAAAFFAQAAAAFGQAAAAAECAAAACQAgEwAAmgEAIAMAAAAJACATAACaAQAgFAAAmQEAIAEMAACtAQAwCQMAAHIAID8AAHEAMEAAAAcAEEEAAHEAMEIBAAAAAUMBAGoAIUQBAGoAIUUBAGwAIUZAAG0AIQIAAAAJACAMAACZAQAgAgAAAJcBACAMAACYAQAgCD8AAJYBADBAAACXAQAQQQAAlgEAMEIBAGoAIUMBAGoAIUQBAGoAIUUBAGwAIUZAAG0AIQg_AACWAQAwQAAAlwEAEEEAAJYBADBCAQBqACFDAQBqACFEAQBqACFFAQBsACFGQABtACEEQgEAegAhRAEAegAhRQEAewAhRkAAfAAhBEIBAHoAIUQBAHoAIUUBAHsAIUZAAHwAIQRCAQAAAAFEAQAAAAFFAQAAAAFGQAAAAAEGQgEAAAABRAEAAAABUgEAAAABUwIAAAABVAgAAAABVUAAAAABAgAAAAUAIBMAAKYBACADAAAABQAgEwAApgEAIBQAAKUBACABDAAArAEAMAsDAAByACA_AABzADBAAAADABBBAABzADBCAQAAAAFDAQBqACFEAQBqACFSAQBqACFTAgB0ACFUCAB1ACFVQABtACECAAAABQAgDAAApQEAIAIAAACjAQAgDAAApAEAIAo_AACiAQAwQAAAowEAEEEAAKIBADBCAQBqACFDAQBqACFEAQBqACFSAQBqACFTAgB0ACFUCAB1ACFVQABtACEKPwAAogEAMEAAAKMBABBBAACiAQAwQgEAagAhQwEAagAhRAEAagAhUgEAagAhUwIAdAAhVAgAdQAhVUAAbQAhBkIBAHoAIUQBAHoAIVIBAHoAIVMCAIQBACFUCACFAQAhVUAAfAAhBkIBAHoAIUQBAHoAIVIBAHoAIVMCAIQBACFUCACFAQAhVUAAfAAhBkIBAAAAAUQBAAAAAVIBAAAAAVMCAAAAAVQIAAAAAVVAAAAAAQQTAACbAQAwZAAAnAEAMGYAAJ4BACBqAACfAQAwBBMAAI8BADBkAACQAQAwZgAAkgEAIGoAAJMBADAAAAcEAACpAQAgBQAAqgEAIFkAAHYAIFoAAHYAIFsAAHYAIFwAAHYAIF0AAHYAIAZCAQAAAAFEAQAAAAFSAQAAAAFTAgAAAAFUCAAAAAFVQAAAAAEEQgEAAAABRAEAAAABRQEAAAABRkAAAAABDAUAAKgBACBCAQAAAAFGQAAAAAFWAQAAAAFXAQAAAAFYIAAAAAFZAQAAAAFaAQAAAAFbAQAAAAFcAQAAAAFdQAAAAAFeQAAAAAECAAAAAQAgEwAArgEAIAMAAAAOACATAACuAQAgFAAAsgEAIA4AAAAOACAFAACOAQAgDAAAsgEAIEIBAHoAIUZAAHwAIVYBAHoAIVcBAHoAIVggAIsBACFZAQB7ACFaAQB7ACFbAQB7ACFcAQB7ACFdQACMAQAhXkAAfAAhDAUAAI4BACBCAQB6ACFGQAB8ACFWAQB6ACFXAQB6ACFYIACLAQAhWQEAewAhWgEAewAhWwEAewAhXAEAewAhXUAAjAEAIV5AAHwAIQwEAACnAQAgQgEAAAABRkAAAAABVgEAAAABVwEAAAABWCAAAAABWQEAAAABWgEAAAABWwEAAAABXAEAAAABXUAAAAABXkAAAAABAgAAAAEAIBMAALMBACADAAAADgAgEwAAswEAIBQAALcBACAOAAAADgAgBAAAjQEAIAwAALcBACBCAQB6ACFGQAB8ACFWAQB6ACFXAQB6ACFYIACLAQAhWQEAewAhWgEAewAhWwEAewAhXAEAewAhXUAAjAEAIV5AAHwAIQwEAACNAQAgQgEAegAhRkAAfAAhVgEAegAhVwEAegAhWCAAiwEAIVkBAHsAIVoBAHsAIVsBAHsAIVwBAHsAIV1AAIwBACFeQAB8ACEDBAYCBQoDBgAEAQMAAQEDAAECBAsABQwAAAAAAwYACRkAChoACwAAAAMGAAkZAAoaAAsBAwABAQMAAQUGABAZABMaABQrABEsABIAAAAAAAUGABAZABMaABQrABEsABIBAwABAQMAAQMGABkZABoaABsAAAADBgAZGQAaGgAbBwIBCA0BCRABChEBCxIBDRQBDhYFDxcGEBkBERsFEhwHFR0BFh4BFx8FGyIIHCMMHSQCHiUCHyYCICcCISgCIioCIywFJC0NJS8CJjEFJzIOKDMCKTQCKjUFLTgPLjkVLzoDMDsDMTwDMj0DMz4DNEADNUIFNkMWN0UDOEcFOUgXOkkDO0oDPEsFPU4YPk8c"
47
+ };
48
+ async function decodeBase64AsWasm(wasmBase64) {
49
+ const { Buffer } = await import("buffer");
50
+ const wasmArray = Buffer.from(wasmBase64, "base64");
51
+ return new WebAssembly.Module(wasmArray);
52
+ }
53
+ config.compilerWasm = {
54
+ getRuntime: async () => await import("@prisma/client/runtime/query_compiler_fast_bg.sqlite.mjs"),
55
+ getQueryCompilerWasmModule: async () => {
56
+ const { wasm } = await import("@prisma/client/runtime/query_compiler_fast_bg.sqlite.wasm-base64.mjs");
57
+ return await decodeBase64AsWasm(wasm);
58
+ },
59
+ importName: "./query_compiler_fast_bg.js"
60
+ };
61
+ function getPrismaClientClass() {
62
+ return runtime.getPrismaClient(config);
63
+ }
64
+
65
+ // src/generated/prisma/internal/prismaNamespace.ts
66
+ import * as runtime2 from "@prisma/client/runtime/client";
67
+ var getExtensionContext = runtime2.Extensions.getExtensionContext;
68
+ var NullTypes2 = {
69
+ DbNull: runtime2.NullTypes.DbNull,
70
+ JsonNull: runtime2.NullTypes.JsonNull,
71
+ AnyNull: runtime2.NullTypes.AnyNull
72
+ };
73
+ var TransactionIsolationLevel = runtime2.makeStrictEnum({
74
+ Serializable: "Serializable"
75
+ });
76
+ var defineExtension = runtime2.Extensions.defineExtension;
77
+
78
+ // src/generated/prisma/client.ts
79
+ globalThis["__dirname"] = path.dirname(fileURLToPath(import.meta.url));
80
+ var PrismaClient = getPrismaClientClass();
81
+
82
+ // src/lib/prisma.ts
83
+ if (!process.env.DATABASE_URL) {
84
+ const dir = path2.join(os.homedir(), ".orchestrator");
85
+ fs.mkdirSync(dir, { recursive: true });
86
+ process.env.DATABASE_URL = `file:${path2.join(dir, "dev.db")}`;
87
+ }
88
+ if (process.env.DATABASE_URL.startsWith("file:./")) {
89
+ const root = path2.join(import.meta.dirname, "..", "..");
90
+ const rel = process.env.DATABASE_URL.slice("file:".length);
91
+ process.env.DATABASE_URL = `file:${path2.resolve(root, rel)}`;
92
+ }
93
+ var adapter = new PrismaBetterSqlite3({ url: process.env.DATABASE_URL });
94
+ var prisma = new PrismaClient({ adapter });
95
+ var prisma_default = prisma;
96
+
97
+ // src/socket.ts
98
+ import { Server } from "socket.io";
99
+ var io;
100
+ function initSocket(httpServer2) {
101
+ io = new Server(httpServer2, { cors: { origin: "*" } });
102
+ return io;
103
+ }
104
+ function getIo() {
105
+ return io;
106
+ }
107
+
108
+ // src/routes/agents.ts
109
+ var router = Router();
110
+ async function notifyWebhook(url, body) {
111
+ if (!url) return;
112
+ try {
113
+ await fetch(url, {
114
+ method: "POST",
115
+ headers: { "Content-Type": "application/json" },
116
+ body: JSON.stringify(body),
117
+ signal: AbortSignal.timeout(3e3)
118
+ });
119
+ } catch {
120
+ }
121
+ }
122
+ router.post("/agent/start", async (req, res) => {
123
+ const { name, webhookUrl } = req.body;
124
+ const agent = await prisma_default.agent.create({ data: { name, webhookUrl: webhookUrl ?? null } });
125
+ getIo().emit("agents:update");
126
+ res.json(agent);
127
+ });
128
+ router.post("/agent/step", async (req, res) => {
129
+ const { agentId, message, tokens, cost } = req.body;
130
+ const event = await prisma_default.event.create({
131
+ data: { agentId, type: "info", message, tokens, cost }
132
+ });
133
+ await prisma_default.agent.update({
134
+ where: { id: agentId },
135
+ data: { lastUpdateAt: /* @__PURE__ */ new Date() }
136
+ });
137
+ getIo().emit("agents:update");
138
+ res.json(event);
139
+ });
140
+ router.post("/agent/error", async (req, res) => {
141
+ const { agentId, message } = req.body;
142
+ const event = await prisma_default.event.create({
143
+ data: { agentId, type: "error", message }
144
+ });
145
+ await prisma_default.agent.update({
146
+ where: { id: agentId },
147
+ data: { needsAttention: true, attentionReason: message }
148
+ });
149
+ getIo().emit("agents:update");
150
+ res.json(event);
151
+ });
152
+ router.post("/agent/warn", async (req, res) => {
153
+ const { agentId, message } = req.body;
154
+ const event = await prisma_default.event.create({
155
+ data: { agentId, type: "warning", message }
156
+ });
157
+ await prisma_default.agent.update({
158
+ where: { id: agentId },
159
+ data: { lastUpdateAt: /* @__PURE__ */ new Date() }
160
+ });
161
+ getIo().emit("agents:update");
162
+ res.json(event);
163
+ });
164
+ router.post("/agent/end", async (req, res) => {
165
+ const { agentId } = req.body;
166
+ const agent = await prisma_default.agent.update({
167
+ where: { id: agentId },
168
+ data: { status: "done", endedAt: /* @__PURE__ */ new Date() }
169
+ });
170
+ getIo().emit("agents:update");
171
+ res.json(agent);
172
+ });
173
+ router.post("/agent/:id/resolve", async (req, res) => {
174
+ const agent = await prisma_default.agent.update({
175
+ where: { id: req.params.id },
176
+ data: { needsAttention: false, attentionReason: null }
177
+ });
178
+ getIo().emit("agents:update");
179
+ res.json(agent);
180
+ });
181
+ router.post("/agent/:id/pause", async (req, res) => {
182
+ const agent = await prisma_default.agent.update({
183
+ where: { id: req.params.id },
184
+ data: { status: "paused", lastUpdateAt: /* @__PURE__ */ new Date() }
185
+ });
186
+ await prisma_default.intervention.create({
187
+ data: { agentId: req.params.id, type: "pause" }
188
+ });
189
+ await prisma_default.event.create({
190
+ data: { agentId: req.params.id, type: "paused", message: "Agent paused by user" }
191
+ });
192
+ getIo().emit("agents:update");
193
+ notifyWebhook(agent.webhookUrl, { type: "pause" });
194
+ res.json(agent);
195
+ });
196
+ router.post("/agent/:id/resume", async (req, res) => {
197
+ const agent = await prisma_default.agent.update({
198
+ where: { id: req.params.id },
199
+ data: { status: "running", lastUpdateAt: /* @__PURE__ */ new Date() }
200
+ });
201
+ await prisma_default.intervention.create({
202
+ data: { agentId: req.params.id, type: "resume" }
203
+ });
204
+ await prisma_default.event.create({
205
+ data: { agentId: req.params.id, type: "resumed", message: "Agent resumed by user" }
206
+ });
207
+ getIo().emit("agents:update");
208
+ notifyWebhook(agent.webhookUrl, { type: "resume" });
209
+ res.json(agent);
210
+ });
211
+ router.post("/agent/:id/instruction", async (req, res) => {
212
+ const { instruction } = req.body;
213
+ if (!instruction) return res.status(400).json({ error: "instruction required" });
214
+ const agent = await prisma_default.agent.findUnique({ where: { id: req.params.id } });
215
+ if (!agent) return res.status(404).json({ error: "Not Found" });
216
+ await prisma_default.intervention.create({
217
+ data: { agentId: req.params.id, type: "modify_instruction", payload: instruction }
218
+ });
219
+ await prisma_default.event.create({
220
+ data: { agentId: req.params.id, type: "instruction_modified", message: instruction }
221
+ });
222
+ await prisma_default.agent.update({
223
+ where: { id: req.params.id },
224
+ data: { lastUpdateAt: /* @__PURE__ */ new Date() }
225
+ });
226
+ getIo().emit("agents:update");
227
+ notifyWebhook(agent.webhookUrl, { type: "modify_instruction", payload: instruction });
228
+ res.json({ ok: true });
229
+ });
230
+ router.patch("/agent/:id", async (req, res) => {
231
+ const { currentGoal, currentTask } = req.body;
232
+ const data = {};
233
+ if (currentGoal !== void 0) data.currentGoal = currentGoal;
234
+ if (currentTask !== void 0) data.currentTask = currentTask;
235
+ const agent = await prisma_default.agent.update({ where: { id: req.params.id }, data });
236
+ getIo().emit("agents:update");
237
+ res.json(agent);
238
+ });
239
+ router.get("/agents", async (_req, res) => {
240
+ const agents = await prisma_default.agent.findMany({
241
+ orderBy: { lastUpdateAt: "desc" },
242
+ include: { events: { orderBy: { timestamp: "desc" }, take: 1 } }
243
+ });
244
+ res.json(agents);
245
+ });
246
+ router.get("/agent/:id", async (req, res) => {
247
+ const agentId = req.params.id;
248
+ const agent = await prisma_default.agent.findUnique({
249
+ where: { id: agentId },
250
+ include: {
251
+ events: { orderBy: { timestamp: "asc" } },
252
+ interventions: { orderBy: { createdAt: "asc" } }
253
+ }
254
+ });
255
+ if (!agent) return res.status(404).json({ error: "Not Found" });
256
+ res.json(agent);
257
+ });
258
+ var agents_default = router;
259
+
260
+ // src/config.ts
261
+ var STUCK_INTERVAL_THRESHHOLD = 40 * 1e3;
262
+ var STUCK_CHECK_INTERVAL_MS = 5e3;
263
+
264
+ // src/jobs/stuck-monitor.ts
265
+ function startStuckMonitor() {
266
+ return setInterval(async () => {
267
+ const runningAgents = await prisma_default.agent.findMany({
268
+ where: { status: "running", needsAttention: false },
269
+ include: { events: { orderBy: { timestamp: "desc" }, take: 1 } }
270
+ });
271
+ for (const agent of runningAgents) {
272
+ const now = (/* @__PURE__ */ new Date()).getTime();
273
+ const lastUpdated = new Date(agent.lastUpdateAt).getTime();
274
+ if (now - lastUpdated > STUCK_INTERVAL_THRESHHOLD) {
275
+ const lastMessage = agent.events[0]?.message?.toLowerCase() ?? "";
276
+ let reason = `No update for ${Math.round(now - lastUpdated) / 1e3}s`;
277
+ if (lastMessage.includes("search") || lastMessage.includes("fetch") || lastMessage.includes("request")) {
278
+ reason = "Possibly waiting on API";
279
+ } else if (lastMessage.includes("compile") || lastMessage.includes("build")) {
280
+ reason = "Build may have hung";
281
+ } else if (lastMessage.includes("wait") || lastMessage.includes("input") || lastMessage.includes("approval")) {
282
+ reason = "Awaiting user input";
283
+ }
284
+ await prisma_default.agent.update({
285
+ where: { id: agent.id },
286
+ data: { needsAttention: true, attentionReason: reason }
287
+ });
288
+ getIo().emit("agents:update");
289
+ console.log(`[ATTENTION] flagged agent ${agent.name}: ${reason}`);
290
+ }
291
+ }
292
+ }, STUCK_CHECK_INTERVAL_MS);
293
+ }
294
+
295
+ // src/index.ts
296
+ {
297
+ const dbPath = process.env.DATABASE_URL.replace(/^file:/, "");
298
+ const db = new Database(dbPath);
299
+ db.exec(`
300
+ CREATE TABLE IF NOT EXISTS "Agent" (
301
+ "id" TEXT NOT NULL PRIMARY KEY,
302
+ "name" TEXT NOT NULL,
303
+ "status" TEXT NOT NULL DEFAULT 'running',
304
+ "needsAttention" BOOLEAN NOT NULL DEFAULT false,
305
+ "attentionReason" TEXT,
306
+ "webhookUrl" TEXT,
307
+ "currentGoal" TEXT,
308
+ "currentTask" TEXT,
309
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
310
+ "endedAt" DATETIME,
311
+ "lastUpdateAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
312
+ );
313
+ CREATE TABLE IF NOT EXISTS "Event" (
314
+ "id" TEXT NOT NULL PRIMARY KEY,
315
+ "agentId" TEXT NOT NULL,
316
+ "type" TEXT NOT NULL,
317
+ "message" TEXT NOT NULL,
318
+ "tokens" INTEGER,
319
+ "cost" REAL,
320
+ "timestamp" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
321
+ CONSTRAINT "Event_agentId_fkey" FOREIGN KEY ("agentId") REFERENCES "Agent" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
322
+ );
323
+ CREATE TABLE IF NOT EXISTS "Intervention" (
324
+ "id" TEXT NOT NULL PRIMARY KEY,
325
+ "agentId" TEXT NOT NULL,
326
+ "type" TEXT NOT NULL,
327
+ "payload" TEXT,
328
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
329
+ CONSTRAINT "Intervention_agentId_fkey" FOREIGN KEY ("agentId") REFERENCES "Agent" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
330
+ );
331
+ `);
332
+ for (const col of ["webhookUrl TEXT", "currentGoal TEXT", "currentTask TEXT"]) {
333
+ try {
334
+ db.exec(`ALTER TABLE "Agent" ADD COLUMN ${col}`);
335
+ } catch {
336
+ }
337
+ }
338
+ db.close();
339
+ }
340
+ var app = express();
341
+ var httpServer = http.createServer(app);
342
+ initSocket(httpServer);
343
+ app.use(cors());
344
+ app.use(express.json());
345
+ app.use(agents_default);
346
+ var publicDir = path3.join(import.meta.dirname, "..", "public");
347
+ if (fs2.existsSync(publicDir)) {
348
+ app.use(express.static(publicDir));
349
+ app.get("/{*splat}", (_req, res) => {
350
+ res.sendFile(path3.join(publicDir, "index.html"));
351
+ });
352
+ }
353
+ startStuckMonitor();
354
+ var port = Number(process.env.PORT) || 8e3;
355
+ httpServer.listen(port, () => console.log(`Orchestrator server running on http://localhost:${port}`));
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "orchestrator-server",
3
+ "version": "0.2.0",
4
+ "description": "Local dashboard server for monitoring and controlling AI agents. Pairs with orchestrator-sdk.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "bin": {
8
+ "orchestrator-server": "./dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "prisma",
13
+ "prisma.config.ts",
14
+ "public"
15
+ ],
16
+ "keywords": [
17
+ "ai",
18
+ "agents",
19
+ "monitoring",
20
+ "dashboard",
21
+ "orchestration",
22
+ "llm",
23
+ "observability",
24
+ "claude",
25
+ "openai",
26
+ "control-plane"
27
+ ],
28
+ "author": "monaabishek2003",
29
+ "license": "ISC",
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "https://github.com/monaabishek2003/Orchestrator"
33
+ },
34
+ "homepage": "https://github.com/monaabishek2003/Orchestrator#readme",
35
+ "scripts": {
36
+ "dev": "tsx watch src/index.ts",
37
+ "start": "tsx src/index.ts",
38
+ "build": "tsup",
39
+ "seed": "tsx prisma/seed.ts"
40
+ },
41
+ "packageManager": "pnpm@10.17.1",
42
+ "dependencies": {
43
+ "@prisma/adapter-better-sqlite3": "^7.8.0",
44
+ "@prisma/client": "^7.8.0",
45
+ "better-sqlite3": "^12.10.0",
46
+ "cors": "^2.8.6",
47
+ "dotenv": "^17.4.2",
48
+ "express": "^5.2.1",
49
+ "socket.io": "^4.8.3",
50
+ "tsx": "^4.21.0"
51
+ },
52
+ "devDependencies": {
53
+ "@types/better-sqlite3": "^7.6.13",
54
+ "@types/cors": "^2.8.19",
55
+ "@types/express": "^5.0.6",
56
+ "@types/node": "^25.6.0",
57
+ "prisma": "^7.8.0",
58
+ "tsup": "^8.5.1"
59
+ }
60
+ }
@@ -0,0 +1,23 @@
1
+ -- CreateTable
2
+ CREATE TABLE "Agent" (
3
+ "id" TEXT NOT NULL PRIMARY KEY,
4
+ "name" TEXT NOT NULL,
5
+ "status" TEXT NOT NULL DEFAULT 'running',
6
+ "needsAttention" BOOLEAN NOT NULL DEFAULT false,
7
+ "attentionReason" TEXT,
8
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
9
+ "endedAt" DATETIME,
10
+ "lastUpdateAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
11
+ );
12
+
13
+ -- CreateTable
14
+ CREATE TABLE "Event" (
15
+ "id" TEXT NOT NULL PRIMARY KEY,
16
+ "agentId" TEXT NOT NULL,
17
+ "type" TEXT NOT NULL,
18
+ "message" TEXT NOT NULL,
19
+ "tokens" INTEGER,
20
+ "cost" REAL,
21
+ "timestamp" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
22
+ CONSTRAINT "Event_agentId_fkey" FOREIGN KEY ("agentId") REFERENCES "Agent" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
23
+ );
@@ -0,0 +1,3 @@
1
+ # Please do not edit this file manually
2
+ # It should be added in your version-control system (e.g., Git)
3
+ provider = "sqlite"
@@ -0,0 +1,49 @@
1
+ // This is your Prisma schema file,
2
+ // learn more about it in the docs: https://pris.ly/d/prisma-schema
3
+
4
+ // Get a free hosted Postgres database in seconds: `npx create-db`
5
+
6
+ generator client {
7
+ provider = "prisma-client"
8
+ output = "../src/generated/prisma"
9
+ }
10
+
11
+ datasource db {
12
+ provider = "sqlite"
13
+ }
14
+
15
+ model Agent {
16
+ id String @id @default(cuid())
17
+ name String
18
+ status String @default("running")
19
+ needsAttention Boolean @default(false)
20
+ attentionReason String?
21
+ webhookUrl String?
22
+ currentGoal String?
23
+ currentTask String?
24
+ createdAt DateTime @default(now())
25
+ endedAt DateTime?
26
+ lastUpdateAt DateTime @default(now())
27
+ events Event[]
28
+ interventions Intervention[]
29
+ }
30
+
31
+ model Event {
32
+ id String @id @default(cuid())
33
+ agentId String
34
+ type String // "info" | "error" | "warning" | "paused" | "resumed" | "instruction_modified"
35
+ message String
36
+ tokens Int?
37
+ cost Float?
38
+ timestamp DateTime @default(now())
39
+ agent Agent @relation(fields: [agentId], references: [id])
40
+ }
41
+
42
+ model Intervention {
43
+ id String @id @default(cuid())
44
+ agentId String
45
+ type String // "pause" | "resume" | "modify_instruction"
46
+ payload String?
47
+ createdAt DateTime @default(now())
48
+ agent Agent @relation(fields: [agentId], references: [id])
49
+ }