aegra-hono 0.14.1 → 0.15.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.
package/README.md CHANGED
@@ -76,7 +76,7 @@ Python 的 graph、auth 与自定义路由模块无法在 Bun 运行时执行,
76
76
  - TypeScript 鉴权、细粒度授权处理器与自定义 Hono 路由
77
77
  - 可选的 Prometheus 指标
78
78
 
79
- 当前限制见[功能支持](docs/feature-support.mdx)。
79
+ 当前限制见[功能支持](docs/feature-support.md)。
80
80
 
81
81
  ## 常用命令
82
82
 
package/dist/cli.js CHANGED
@@ -23,7 +23,7 @@ var init_settings = __esm(() => {
23
23
  booleanFromEnv = z.stringbool().default(false);
24
24
  environmentShape = {
25
25
  PROJECT_NAME: z.string().default("Aegra"),
26
- VERSION: z.string().default("0.14.1"),
26
+ VERSION: z.string().default("0.14.2"),
27
27
  ENV_MODE: z.string().default("PRODUCTION"),
28
28
  LOG_VERBOSITY: z.string().default("verbose"),
29
29
  LOG_EXCLUDE_PATHS: z.string().default(""),
@@ -151,6 +151,111 @@ var init_project = __esm(() => {
151
151
  });
152
152
  });
153
153
 
154
+ // src/core/logger.ts
155
+ function startup(info) {
156
+ if (production) {
157
+ write("info", "Aegra listening", info);
158
+ return;
159
+ }
160
+ const heading = `${info.name} Dev Server`;
161
+ const introduction = `Starting ${info.name} development server`;
162
+ const rows = [
163
+ ["Version", info.version],
164
+ ["Host", info.host],
165
+ ["Port", String(info.port)],
166
+ ["URL", info.url],
167
+ ["Config", info.config],
168
+ ["Env", info.env],
169
+ ["Mode", info.mode]
170
+ ];
171
+ const footer = "Press Ctrl+C to stop the server";
172
+ const width = Math.max(64, introduction.length, footer.length, ...rows.map(([label, value]) => `${label}: ${value}`.length));
173
+ const border = "\u2500".repeat(width + 2);
174
+ const frame = (content, visibleLength = content.length) => {
175
+ const padding = " ".repeat(width - visibleLength);
176
+ const edge = colors ? `${ansi.info}\u2502${ansi.reset}` : "\u2502";
177
+ return `${edge} ${content}${padding} ${edge}`;
178
+ };
179
+ const detail = (label, value) => {
180
+ const raw2 = `${label}: ${value}`;
181
+ return colors ? frame(`${ansi.message}${label}:${ansi.reset} ${value}`, raw2.length) : frame(raw2);
182
+ };
183
+ const top = `\u256D\u2500 ${heading} ${"\u2500".repeat(width - heading.length - 1)}\u256E`;
184
+ const bottom = `\u2570${border}\u256F`;
185
+ const title = colors ? `${ansi.bold}${ansi.info}${introduction}${ansi.reset}` : introduction;
186
+ const hint = colors ? `${ansi.dim}${footer}${ansi.reset}` : footer;
187
+ const paintBorder = (value) => colors ? `${ansi.info}${value}${ansi.reset}` : value;
188
+ console.log([
189
+ paintBorder(top),
190
+ frame(title, introduction.length),
191
+ frame(""),
192
+ ...rows.map(([label, value]) => detail(label, value)),
193
+ frame(""),
194
+ frame(hint, footer.length),
195
+ paintBorder(bottom)
196
+ ].join(`
197
+ `));
198
+ }
199
+ function formatValue(value) {
200
+ if (value instanceof Error)
201
+ return value.stack ?? `${value.name}: ${value.message}`;
202
+ return typeof value === "string" ? value : Bun.inspect(value, { colors });
203
+ }
204
+ function jsonValue(value) {
205
+ if (!(value instanceof Error))
206
+ return value;
207
+ return { name: value.name, message: value.message, stack: value.stack };
208
+ }
209
+ function timestamp(date = new Date) {
210
+ const pad = (value, width = 2) => String(value).padStart(width, "0");
211
+ const offset = -date.getTimezoneOffset();
212
+ const sign = offset >= 0 ? "+" : "-";
213
+ return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}` + `T${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}.${pad(date.getMilliseconds(), 3)}` + `${sign}${pad(Math.floor(Math.abs(offset) / 60))}:${pad(Math.abs(offset) % 60)}`;
214
+ }
215
+ function write(level, message, fields = {}) {
216
+ const time = timestamp();
217
+ let line;
218
+ if (production) {
219
+ line = JSON.stringify({
220
+ time,
221
+ level,
222
+ message,
223
+ ...Object.fromEntries(Object.entries(fields).map(([key, value]) => [key, jsonValue(value)]))
224
+ });
225
+ } else {
226
+ const details = Object.entries(fields).map(([key, value]) => `${key}=${formatValue(value)}`).join(" ");
227
+ const plain = `${time} ${level.toUpperCase().padEnd(5)} ${message}${details ? ` ${details}` : ""}`;
228
+ line = colors ? `${ansi.dim}${time}${ansi.reset} ${ansi[level]}${level.toUpperCase().padEnd(5)}${ansi.reset} ${ansi.message}${message}${ansi.reset}${details ? ` ${details}` : ""}` : plain;
229
+ }
230
+ if (level === "error")
231
+ console.error(line);
232
+ else if (level === "warn")
233
+ console.warn(line);
234
+ else
235
+ console.log(line);
236
+ }
237
+ var production, colors, ansi, logger;
238
+ var init_logger = __esm(() => {
239
+ init_settings();
240
+ production = settings.ENV_MODE.toUpperCase() === "PRODUCTION" || false;
241
+ colors = !production && !("NO_COLOR" in process.env) && Boolean(process.stdout.isTTY || process.stderr.isTTY || process.env.TERM_PROGRAM === "vscode");
242
+ ansi = {
243
+ reset: "\x1B[0m",
244
+ bold: "\x1B[1m",
245
+ dim: "\x1B[2m",
246
+ info: "\x1B[32m",
247
+ warn: "\x1B[33m",
248
+ error: "\x1B[31m",
249
+ message: "\x1B[36m"
250
+ };
251
+ logger = {
252
+ info: (message, fields) => write("info", message, fields),
253
+ warn: (message, fields) => write("warn", message, fields),
254
+ error: (message, fields) => write("error", message, fields),
255
+ startup
256
+ };
257
+ });
258
+
154
259
  // src/core/schema.ts
155
260
  var exports_schema = {};
156
261
  __export(exports_schema, {
@@ -165,16 +270,16 @@ __export(exports_schema, {
165
270
  assistantVersions: () => assistantVersions
166
271
  });
167
272
  import { sql } from "drizzle-orm";
168
- import { bigint, bigserial, boolean, doublePrecision, index, integer, jsonb, pgTable, primaryKey, text, timestamp, unique, uniqueIndex } from "drizzle-orm/pg-core";
273
+ import { bigint, bigserial, boolean, doublePrecision, index, integer, jsonb, pgTable, primaryKey, text, timestamp as timestamp2, unique, uniqueIndex } from "drizzle-orm/pg-core";
169
274
  var timestamps, migrations, assistants, assistantVersions, threads, runs, threadEvents, crons, storeItems, threadTtl;
170
275
  var init_schema = __esm(() => {
171
276
  timestamps = {
172
- created_at: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
173
- updated_at: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow()
277
+ created_at: timestamp2("created_at", { withTimezone: true }).notNull().defaultNow(),
278
+ updated_at: timestamp2("updated_at", { withTimezone: true }).notNull().defaultNow()
174
279
  };
175
280
  migrations = pgTable("aegra_migrations", {
176
281
  version: integer("version").primaryKey(),
177
- applied_at: timestamp("applied_at", { withTimezone: true }).notNull().defaultNow()
282
+ applied_at: timestamp2("applied_at", { withTimezone: true }).notNull().defaultNow()
178
283
  });
179
284
  assistants = pgTable("assistant", {
180
285
  assistant_id: text("assistant_id").primaryKey().default(sql`gen_random_uuid()::text`),
@@ -202,7 +307,7 @@ var init_schema = __esm(() => {
202
307
  metadata: jsonb("metadata").$type().notNull().default({}),
203
308
  name: text("name"),
204
309
  description: text("description"),
205
- created_at: timestamp("created_at", { withTimezone: true }).notNull().defaultNow()
310
+ created_at: timestamp2("created_at", { withTimezone: true }).notNull().defaultNow()
206
311
  }, (table) => [primaryKey({ columns: [table.assistant_id, table.version] })]);
207
312
  threads = pgTable("thread", {
208
313
  thread_id: text("thread_id").primaryKey(),
@@ -227,7 +332,7 @@ var init_schema = __esm(() => {
227
332
  user_id: text("user_id").notNull(),
228
333
  execution_params: jsonb("execution_params").$type(),
229
334
  claimed_by: text("claimed_by"),
230
- lease_expires_at: timestamp("lease_expires_at", { withTimezone: true }),
335
+ lease_expires_at: timestamp2("lease_expires_at", { withTimezone: true }),
231
336
  ...timestamps
232
337
  }, (table) => [
233
338
  index("idx_runs_thread_id").on(table.thread_id),
@@ -247,7 +352,7 @@ var init_schema = __esm(() => {
247
352
  namespace: text("namespace").array().notNull().default(sql`'{}'::text[]`),
248
353
  event_data: jsonb("event_data").$type().notNull(),
249
354
  event_timestamp: bigint("event_timestamp", { mode: "number" }).notNull(),
250
- created_at: timestamp("created_at", { withTimezone: true }).notNull().defaultNow()
355
+ created_at: timestamp2("created_at", { withTimezone: true }).notNull().defaultNow()
251
356
  }, (table) => [index("idx_thread_events_replay").on(table.user_id, table.thread_id, table.seq)]);
252
357
  crons = pgTable("crons", {
253
358
  cron_id: text("cron_id").primaryKey().default(sql`gen_random_uuid()::text`),
@@ -259,9 +364,9 @@ var init_schema = __esm(() => {
259
364
  metadata: jsonb("metadata").$type().notNull().default({}),
260
365
  on_run_completed: text("on_run_completed"),
261
366
  enabled: boolean("enabled").notNull().default(true),
262
- end_time: timestamp("end_time", { withTimezone: true }),
263
- next_run_date: timestamp("next_run_date", { withTimezone: true }),
264
- claimed_until: timestamp("claimed_until", { withTimezone: true }),
367
+ end_time: timestamp2("end_time", { withTimezone: true }),
368
+ next_run_date: timestamp2("next_run_date", { withTimezone: true }),
369
+ claimed_until: timestamp2("claimed_until", { withTimezone: true }),
265
370
  ...timestamps
266
371
  }, (table) => [
267
372
  index("idx_cron_user").on(table.user_id),
@@ -280,8 +385,8 @@ var init_schema = __esm(() => {
280
385
  thread_id: text("thread_id").primaryKey().references(() => threads.thread_id, { onDelete: "cascade" }),
281
386
  strategy: text("strategy").notNull().default("delete"),
282
387
  ttl_minutes: doublePrecision("ttl_minutes").notNull(),
283
- created_at: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
284
- expires_at: timestamp("expires_at", { withTimezone: true }).notNull()
388
+ created_at: timestamp2("created_at", { withTimezone: true }).notNull().defaultNow(),
389
+ expires_at: timestamp2("expires_at", { withTimezone: true }).notNull()
285
390
  }, (table) => [index("idx_thread_ttl_expires_at").on(table.expires_at)]);
286
391
  });
287
392
 
@@ -326,6 +431,7 @@ var client, db, migrations2;
326
431
  var init_database = __esm(() => {
327
432
  init_project();
328
433
  init_settings();
434
+ init_logger();
329
435
  init_schema();
330
436
  client = postgres(settings.DATABASE_URL, {
331
437
  max: settings.POSTGRES_POOL_MAX_SIZE,
@@ -335,7 +441,7 @@ var init_database = __esm(() => {
335
441
  onnotice: (notice) => {
336
442
  if (settings.LOG_VERBOSITY !== "verbose")
337
443
  return;
338
- console.log(JSON.stringify({ event: "postgres_notice", severity: notice.severity, code: notice.code, message: notice.message }));
444
+ logger.info("postgres notice", { severity: notice.severity, code: notice.code, detail: notice.message });
339
445
  }
340
446
  });
341
447
  db = drizzle({ client, schema: exports_schema });
@@ -491,7 +597,7 @@ function usage(exitCode = 1) {
491
597
 
492
598
  Commands:
493
599
  init [path] Create a TypeScript Aegra project
494
- dev Start with Bun hot reload
600
+ dev Start with Bun watch mode
495
601
  serve Start the production server
496
602
  up|down [args] Run Docker Compose
497
603
  db upgrade Apply database migrations
@@ -524,7 +630,8 @@ function parseOptions(args) {
524
630
  return { positional, options };
525
631
  }
526
632
  async function loadEnv(path) {
527
- const file = Bun.file(path);
633
+ const resolved = resolve2(path);
634
+ const file = Bun.file(resolved);
528
635
  if (!await file.exists())
529
636
  return;
530
637
  for (const line of (await file.text()).split(/\r?\n/)) {
@@ -533,6 +640,7 @@ async function loadEnv(path) {
533
640
  continue;
534
641
  process.env[match[1]] = match[2].replace(/^(['"])(.*)\1$/, "$2");
535
642
  }
643
+ return resolved;
536
644
  }
537
645
  function run(command, env) {
538
646
  const result = Bun.spawnSync(command, { stdin: "inherit", stdout: "inherit", stderr: "inherit", ...env ? { env } : {} });
@@ -540,7 +648,9 @@ function run(command, env) {
540
648
  process.exit(result.exitCode);
541
649
  }
542
650
  async function serverEnvironment(options) {
543
- await loadEnv(String(options["env-file"] ?? resolve2(".env")));
651
+ const envFile = await loadEnv(String(options["env-file"] ?? resolve2(".env")));
652
+ if (envFile)
653
+ process.env.AEGRA_ENV_FILE = envFile;
544
654
  if (options.host)
545
655
  process.env.HOST = String(options.host);
546
656
  if (options.port)
@@ -559,6 +669,7 @@ function renderEnvironment(options) {
559
669
  PROJECT_NAME=${options.name}
560
670
  VERSION=${options.version}
561
671
  ENV_MODE=LOCAL
672
+ TZ=UTC
562
673
  LOG_VERBOSITY=verbose
563
674
  LOG_EXCLUDE_PATHS=/live
564
675
  HOST=0.0.0.0
@@ -891,7 +1002,7 @@ async function main(argv = process.argv.slice(2)) {
891
1002
  const builtEntrypoint = resolve2(import.meta.dir, "index.js");
892
1003
  const entrypoint = await Bun.file(builtEntrypoint).exists() ? builtEntrypoint : resolve2(import.meta.dir, "index.ts");
893
1004
  if (command === "dev")
894
- run(["bun", "--hot", entrypoint], env);
1005
+ run(["bun", "--watch", "--no-clear-screen", entrypoint], env);
895
1006
  else
896
1007
  await import(entrypoint);
897
1008
  return;
@@ -918,4 +1029,4 @@ export {
918
1029
  main
919
1030
  };
920
1031
 
921
- //# debugId=DA151E06305152BE64756E2164756E21
1032
+ //# debugId=F01FFA24D9F697B664756E2164756E21
package/dist/cli.js.map CHANGED
@@ -1,14 +1,15 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/config/settings.ts", "../src/config/project.ts", "../src/core/schema.ts", "../src/core/database.ts", "../src/cli.ts"],
3
+ "sources": ["../src/config/settings.ts", "../src/config/project.ts", "../src/core/logger.ts", "../src/core/schema.ts", "../src/core/database.ts", "../src/cli.ts"],
4
4
  "sourcesContent": [
5
- "import { z } from \"zod\";\n\nconst booleanFromEnv = z.stringbool().default(false);\nconst positiveIntFromEnv = (fallback: number) => z.coerce.number().int().positive().default(fallback);\n\nconst environmentShape = {\n PROJECT_NAME: z.string().default(\"Aegra\"),\n VERSION: z.string().default(\"0.14.1\"),\n ENV_MODE: z.string().default(\"PRODUCTION\"),\n LOG_VERBOSITY: z.string().default(\"verbose\"),\n LOG_EXCLUDE_PATHS: z.string().default(\"\"),\n HOST: z.string().default(\"0.0.0.0\"),\n PORT: z.coerce.number().int().min(1).max(65_535).default(2026),\n AEGRA_CONFIG: z.string().default(\"aegra.json\"),\n RUN_MIGRATIONS_ON_STARTUP: z.stringbool().default(true),\n DATABASE_URL: z.string().optional(),\n POSTGRES_USER: z.string().default(\"postgres\"),\n POSTGRES_PASSWORD: z.string().default(\"postgres\"),\n POSTGRES_HOST: z.string().default(\"localhost\"),\n POSTGRES_PORT: z.coerce.number().int().min(1).max(65_535).default(5432),\n POSTGRES_DB: z.string().default(\"aegra\"),\n POSTGRES_POOL_MAX_SIZE: positiveIntFromEnv(15),\n LANGGRAPH_POOL_MIN_SIZE: z.coerce.number().int().nonnegative().default(5),\n LANGGRAPH_POOL_MAX_SIZE: positiveIntFromEnv(20),\n REDIS_BROKER_ENABLED: booleanFromEnv,\n REDIS_URL: z.string().default(\"redis://localhost:6379/0\"),\n WORKER_COUNT: positiveIntFromEnv(3),\n N_JOBS_PER_WORKER: positiveIntFromEnv(10),\n WORKER_QUEUE_KEY: z.string().default(\"aegra:jobs\"),\n BG_JOB_TIMEOUT_SECS: positiveIntFromEnv(3600),\n BG_JOB_MAX_RETRIES: z.coerce.number().int().nonnegative().default(3),\n WORKER_DRAIN_TIMEOUT: z.coerce.number().nonnegative().default(30),\n STUCK_PENDING_THRESHOLD_SECONDS: positiveIntFromEnv(120),\n LEASE_DURATION_SECONDS: positiveIntFromEnv(30),\n HEARTBEAT_INTERVAL_SECONDS: positiveIntFromEnv(10),\n REAPER_INTERVAL_SECONDS: positiveIntFromEnv(15),\n POSTGRES_POLL_INTERVAL_SECONDS: positiveIntFromEnv(5),\n KEEPALIVE_INTERVAL_SECS: positiveIntFromEnv(5),\n CRON_ENABLED: z.stringbool().default(true),\n CRON_POLL_INTERVAL_SECONDS: positiveIntFromEnv(60),\n CRON_CLAIM_DURATION_SECONDS: positiveIntFromEnv(300),\n CRON_MAX_PER_USER: z.coerce.number().int().nonnegative().default(100),\n CRON_ALLOW_SECONDS_SCHEDULE: booleanFromEnv,\n CRON_TICK_BATCH_SIZE: positiveIntFromEnv(100),\n CRON_MAX_PAYLOAD_BYTES: positiveIntFromEnv(65_536),\n AEGRA_THREAD_TTL: z.string().optional(),\n LANGGRAPH_THREAD_TTL: z.string().optional(),\n MAX_SEARCH_LIMIT: positiveIntFromEnv(1000),\n ENABLE_PROMETHEUS_METRICS: booleanFromEnv,\n FF_V2_EVENT_STREAMING: z.stringbool().default(true),\n OTEL_SERVICE_NAME: z.string().default(\"aegra-backend\"),\n OTEL_TARGETS: z.string().default(\"\"),\n OTEL_CONSOLE_EXPORT: booleanFromEnv,\n OTEL_EXPORTER_OTLP_ENDPOINT: z.string().optional(),\n OTEL_EXPORTER_OTLP_HEADERS: z.string().optional(),\n LANGFUSE_BASE_URL: z.string().default(\"http://localhost:3000\"),\n LANGFUSE_PUBLIC_KEY: z.string().optional(),\n LANGFUSE_SECRET_KEY: z.string().optional(),\n PHOENIX_COLLECTOR_ENDPOINT: z.string().default(\"http://127.0.0.1:6006/v1/traces\"),\n PHOENIX_API_KEY: z.string().optional(),\n};\n\nexport const environmentVariableNames = Object.freeze(Object.keys(environmentShape));\n\nconst environmentSchema = z.object(environmentShape).superRefine((value, issue) => {\n if (value.LEASE_DURATION_SECONDS <= 2 * value.HEARTBEAT_INTERVAL_SECONDS) {\n issue.addIssue({ code: \"custom\", path: [\"LEASE_DURATION_SECONDS\"],\n message: \"LEASE_DURATION_SECONDS must exceed twice HEARTBEAT_INTERVAL_SECONDS\" });\n }\n if (value.LANGGRAPH_POOL_MIN_SIZE > value.LANGGRAPH_POOL_MAX_SIZE) {\n issue.addIssue({ code: \"custom\", path: [\"LANGGRAPH_POOL_MIN_SIZE\"],\n message: \"LANGGRAPH_POOL_MIN_SIZE must not exceed LANGGRAPH_POOL_MAX_SIZE\" });\n }\n});\n\nconst raw = environmentSchema.parse(process.env);\n\nexport const settings = {\n ...raw,\n DATABASE_URL:\n raw.DATABASE_URL ??\n `postgresql://${encodeURIComponent(raw.POSTGRES_USER)}:${encodeURIComponent(raw.POSTGRES_PASSWORD)}@${raw.POSTGRES_HOST}:${raw.POSTGRES_PORT}/${raw.POSTGRES_DB}`,\n} as const;\n\nexport type Settings = typeof settings;\n",
5
+ "import { z } from \"zod\";\n\nconst booleanFromEnv = z.stringbool().default(false);\nconst positiveIntFromEnv = (fallback: number) => z.coerce.number().int().positive().default(fallback);\n\nconst environmentShape = {\n PROJECT_NAME: z.string().default(\"Aegra\"),\n VERSION: z.string().default(\"0.14.2\"),\n ENV_MODE: z.string().default(\"PRODUCTION\"),\n LOG_VERBOSITY: z.string().default(\"verbose\"),\n LOG_EXCLUDE_PATHS: z.string().default(\"\"),\n HOST: z.string().default(\"0.0.0.0\"),\n PORT: z.coerce.number().int().min(1).max(65_535).default(2026),\n AEGRA_CONFIG: z.string().default(\"aegra.json\"),\n RUN_MIGRATIONS_ON_STARTUP: z.stringbool().default(true),\n DATABASE_URL: z.string().optional(),\n POSTGRES_USER: z.string().default(\"postgres\"),\n POSTGRES_PASSWORD: z.string().default(\"postgres\"),\n POSTGRES_HOST: z.string().default(\"localhost\"),\n POSTGRES_PORT: z.coerce.number().int().min(1).max(65_535).default(5432),\n POSTGRES_DB: z.string().default(\"aegra\"),\n POSTGRES_POOL_MAX_SIZE: positiveIntFromEnv(15),\n LANGGRAPH_POOL_MIN_SIZE: z.coerce.number().int().nonnegative().default(5),\n LANGGRAPH_POOL_MAX_SIZE: positiveIntFromEnv(20),\n REDIS_BROKER_ENABLED: booleanFromEnv,\n REDIS_URL: z.string().default(\"redis://localhost:6379/0\"),\n WORKER_COUNT: positiveIntFromEnv(3),\n N_JOBS_PER_WORKER: positiveIntFromEnv(10),\n WORKER_QUEUE_KEY: z.string().default(\"aegra:jobs\"),\n BG_JOB_TIMEOUT_SECS: positiveIntFromEnv(3600),\n BG_JOB_MAX_RETRIES: z.coerce.number().int().nonnegative().default(3),\n WORKER_DRAIN_TIMEOUT: z.coerce.number().nonnegative().default(30),\n STUCK_PENDING_THRESHOLD_SECONDS: positiveIntFromEnv(120),\n LEASE_DURATION_SECONDS: positiveIntFromEnv(30),\n HEARTBEAT_INTERVAL_SECONDS: positiveIntFromEnv(10),\n REAPER_INTERVAL_SECONDS: positiveIntFromEnv(15),\n POSTGRES_POLL_INTERVAL_SECONDS: positiveIntFromEnv(5),\n KEEPALIVE_INTERVAL_SECS: positiveIntFromEnv(5),\n CRON_ENABLED: z.stringbool().default(true),\n CRON_POLL_INTERVAL_SECONDS: positiveIntFromEnv(60),\n CRON_CLAIM_DURATION_SECONDS: positiveIntFromEnv(300),\n CRON_MAX_PER_USER: z.coerce.number().int().nonnegative().default(100),\n CRON_ALLOW_SECONDS_SCHEDULE: booleanFromEnv,\n CRON_TICK_BATCH_SIZE: positiveIntFromEnv(100),\n CRON_MAX_PAYLOAD_BYTES: positiveIntFromEnv(65_536),\n AEGRA_THREAD_TTL: z.string().optional(),\n LANGGRAPH_THREAD_TTL: z.string().optional(),\n MAX_SEARCH_LIMIT: positiveIntFromEnv(1000),\n ENABLE_PROMETHEUS_METRICS: booleanFromEnv,\n FF_V2_EVENT_STREAMING: z.stringbool().default(true),\n OTEL_SERVICE_NAME: z.string().default(\"aegra-backend\"),\n OTEL_TARGETS: z.string().default(\"\"),\n OTEL_CONSOLE_EXPORT: booleanFromEnv,\n OTEL_EXPORTER_OTLP_ENDPOINT: z.string().optional(),\n OTEL_EXPORTER_OTLP_HEADERS: z.string().optional(),\n LANGFUSE_BASE_URL: z.string().default(\"http://localhost:3000\"),\n LANGFUSE_PUBLIC_KEY: z.string().optional(),\n LANGFUSE_SECRET_KEY: z.string().optional(),\n PHOENIX_COLLECTOR_ENDPOINT: z.string().default(\"http://127.0.0.1:6006/v1/traces\"),\n PHOENIX_API_KEY: z.string().optional(),\n};\n\nexport const environmentVariableNames = Object.freeze(Object.keys(environmentShape));\n\nconst environmentSchema = z.object(environmentShape).superRefine((value, issue) => {\n if (value.LEASE_DURATION_SECONDS <= 2 * value.HEARTBEAT_INTERVAL_SECONDS) {\n issue.addIssue({ code: \"custom\", path: [\"LEASE_DURATION_SECONDS\"],\n message: \"LEASE_DURATION_SECONDS must exceed twice HEARTBEAT_INTERVAL_SECONDS\" });\n }\n if (value.LANGGRAPH_POOL_MIN_SIZE > value.LANGGRAPH_POOL_MAX_SIZE) {\n issue.addIssue({ code: \"custom\", path: [\"LANGGRAPH_POOL_MIN_SIZE\"],\n message: \"LANGGRAPH_POOL_MIN_SIZE must not exceed LANGGRAPH_POOL_MAX_SIZE\" });\n }\n});\n\nconst raw = environmentSchema.parse(process.env);\n\nexport const settings = {\n ...raw,\n DATABASE_URL:\n raw.DATABASE_URL ??\n `postgresql://${encodeURIComponent(raw.POSTGRES_USER)}:${encodeURIComponent(raw.POSTGRES_PASSWORD)}@${raw.POSTGRES_HOST}:${raw.POSTGRES_PORT}/${raw.POSTGRES_DB}`,\n} as const;\n\nexport type Settings = typeof settings;\n",
6
6
  "import { readFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\nimport { z } from \"zod\";\nimport { settings } from \"./settings.ts\";\n\nconst corsSchema = z.object({\n allow_origins: z.array(z.string()).default([\"*\"]),\n allow_methods: z.array(z.string()).default([\"*\"]),\n allow_headers: z.array(z.string()).default([\"*\"]),\n allow_credentials: z.boolean().optional(),\n expose_headers: z.array(z.string()).default([\"Content-Location\", \"Location\"]),\n max_age: z.number().int().nonnegative().default(600),\n});\n\nconst configSchema = z.object({\n dependencies: z.array(z.string()).default([]),\n graphs: z.record(z.string(), z.string()).default({}),\n auth: z.object({ path: z.string(), disable_studio_auth: z.boolean().default(false) }).optional(),\n http: z\n .object({\n app: z.string().optional(),\n enable_custom_route_auth: z.boolean().default(false),\n cors: corsSchema.optional(),\n })\n .optional(),\n store: z\n .object({\n index: z\n .object({ dims: z.number().int().positive(), embed: z.string(), fields: z.array(z.string()).nullable().optional() })\n .nullable()\n .optional(),\n scopes: z.record(z.string(), z.array(z.string())).default({}),\n })\n .optional(),\n checkpointer: z\n .object({\n ttl: z\n .object({\n strategy: z.enum([\"delete\", \"keep_latest\"]).default(\"delete\"),\n default_ttl: z.number().positive().optional(),\n sweep_interval_minutes: z.number().positive().default(5),\n sweep_limit: z.number().int().positive().default(100),\n })\n .nullable()\n .optional(),\n })\n .optional(),\n});\n\nexport type AegraConfig = z.infer<typeof configSchema>;\n\nlet cachedConfig: AegraConfig | undefined;\n\nexport async function loadConfig(): Promise<AegraConfig> {\n if (cachedConfig) return cachedConfig;\n const configPath = resolve(settings.AEGRA_CONFIG);\n const content = await readFile(configPath, \"utf8\");\n cachedConfig = configSchema.parse(JSON.parse(content));\n return cachedConfig;\n}\n\nexport function configDirectory(): string {\n return dirname(resolve(settings.AEGRA_CONFIG));\n}\n\nexport function clearConfigCache(): void {\n cachedConfig = undefined;\n}\n",
7
+ "import { settings } from \"../config/settings.ts\";\n\ntype LogLevel = \"info\" | \"warn\" | \"error\";\ntype LogFields = Record<string, unknown>;\ntype StartupInfo = {\n name: string;\n version: string;\n host: string;\n port: number;\n url: string;\n config: string;\n env: string;\n mode: string;\n};\n\nconst production = settings.ENV_MODE.toUpperCase() === \"PRODUCTION\" || process.env.NODE_ENV === \"production\";\nconst colors = !production && !(\"NO_COLOR\" in process.env)\n && Boolean(process.stdout.isTTY || process.stderr.isTTY || process.env.TERM_PROGRAM === \"vscode\");\nconst ansi = {\n reset: \"\\u001b[0m\",\n bold: \"\\u001b[1m\",\n dim: \"\\u001b[2m\",\n info: \"\\u001b[32m\",\n warn: \"\\u001b[33m\",\n error: \"\\u001b[31m\",\n message: \"\\u001b[36m\",\n};\n\nfunction startup(info: StartupInfo): void {\n if (production) {\n write(\"info\", \"Aegra listening\", info);\n return;\n }\n const heading = `${info.name} Dev Server`;\n const introduction = `Starting ${info.name} development server`;\n const rows = [\n [\"Version\", info.version],\n [\"Host\", info.host],\n [\"Port\", String(info.port)],\n [\"URL\", info.url],\n [\"Config\", info.config],\n [\"Env\", info.env],\n [\"Mode\", info.mode],\n ] as const;\n const footer = \"Press Ctrl+C to stop the server\";\n const width = Math.max(64, introduction.length, footer.length,\n ...rows.map(([label, value]) => `${label}: ${value}`.length));\n const border = \"─\".repeat(width + 2);\n const frame = (content: string, visibleLength = content.length): string => {\n const padding = \" \".repeat(width - visibleLength);\n const edge = colors ? `${ansi.info}│${ansi.reset}` : \"│\";\n return `${edge} ${content}${padding} ${edge}`;\n };\n const detail = (label: string, value: string): string => {\n const raw = `${label}: ${value}`;\n return colors\n ? frame(`${ansi.message}${label}:${ansi.reset} ${value}`, raw.length)\n : frame(raw);\n };\n const top = `╭─ ${heading} ${\"─\".repeat(width - heading.length - 1)}╮`;\n const bottom = `╰${border}╯`;\n const title = colors ? `${ansi.bold}${ansi.info}${introduction}${ansi.reset}` : introduction;\n const hint = colors ? `${ansi.dim}${footer}${ansi.reset}` : footer;\n const paintBorder = (value: string): string => colors ? `${ansi.info}${value}${ansi.reset}` : value;\n console.log([paintBorder(top), frame(title, introduction.length), frame(\"\"),\n ...rows.map(([label, value]) => detail(label, value)), frame(\"\"),\n frame(hint, footer.length), paintBorder(bottom)].join(\"\\n\"));\n}\n\nfunction formatValue(value: unknown): string {\n if (value instanceof Error) return value.stack ?? `${value.name}: ${value.message}`;\n return typeof value === \"string\" ? value : Bun.inspect(value, { colors });\n}\n\nfunction jsonValue(value: unknown): unknown {\n if (!(value instanceof Error)) return value;\n return { name: value.name, message: value.message, stack: value.stack };\n}\n\nfunction timestamp(date = new Date()): string {\n const pad = (value: number, width = 2): string => String(value).padStart(width, \"0\");\n const offset = -date.getTimezoneOffset();\n const sign = offset >= 0 ? \"+\" : \"-\";\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`\n + `T${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}.${pad(date.getMilliseconds(), 3)}`\n + `${sign}${pad(Math.floor(Math.abs(offset) / 60))}:${pad(Math.abs(offset) % 60)}`;\n}\n\nfunction write(level: LogLevel, message: string, fields: LogFields = {}): void {\n const time = timestamp();\n let line: string;\n if (production) {\n line = JSON.stringify({ time, level, message,\n ...Object.fromEntries(Object.entries(fields).map(([key, value]) => [key, jsonValue(value)])) });\n } else {\n const details = Object.entries(fields).map(([key, value]) => `${key}=${formatValue(value)}`).join(\" \");\n const plain = `${time} ${level.toUpperCase().padEnd(5)} ${message}${details ? ` ${details}` : \"\"}`;\n line = colors\n ? `${ansi.dim}${time}${ansi.reset} ${ansi[level]}${level.toUpperCase().padEnd(5)}${ansi.reset} ${ansi.message}${message}${ansi.reset}${details ? ` ${details}` : \"\"}`\n : plain;\n }\n if (level === \"error\") console.error(line);\n else if (level === \"warn\") console.warn(line);\n else console.log(line);\n}\n\nexport const logger = {\n info: (message: string, fields?: LogFields): void => write(\"info\", message, fields),\n warn: (message: string, fields?: LogFields): void => write(\"warn\", message, fields),\n error: (message: string, fields?: LogFields): void => write(\"error\", message, fields),\n startup,\n};\n",
7
8
  "import { sql } from \"drizzle-orm\";\nimport { bigint, bigserial, boolean, doublePrecision, index, integer, jsonb, pgTable, primaryKey, text, timestamp, unique, uniqueIndex } from \"drizzle-orm/pg-core\";\nimport type { JsonObject, JsonValue } from \"../types.ts\";\n\nconst timestamps = {\n created_at: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updated_at: timestamp(\"updated_at\", { withTimezone: true }).notNull().defaultNow(),\n};\n\nexport const migrations = pgTable(\"aegra_migrations\", {\n version: integer(\"version\").primaryKey(),\n applied_at: timestamp(\"applied_at\", { withTimezone: true }).notNull().defaultNow(),\n});\n\nexport const assistants = pgTable(\"assistant\", {\n assistant_id: text(\"assistant_id\").primaryKey().default(sql`gen_random_uuid()::text`),\n name: text(\"name\").notNull(),\n description: text(\"description\"),\n graph_id: text(\"graph_id\").notNull(),\n config: jsonb(\"config\").$type<JsonObject>().notNull().default({}),\n context: jsonb(\"context\").$type<JsonObject>().notNull().default({}),\n user_id: text(\"user_id\").notNull(),\n version: integer(\"version\").notNull().default(1),\n metadata: jsonb(\"metadata\").$type<JsonObject>().notNull().default({}),\n ...timestamps,\n}, (table) => [\n index(\"idx_assistant_user\").on(table.user_id),\n unique(\"assistant_user_id_unique\").on(table.user_id, table.assistant_id),\n uniqueIndex(\"idx_assistant_user_graph_config\").on(table.user_id, table.graph_id, sql`md5(${table.config}::text)`),\n index(\"idx_assistant_metadata_gin\").using(\"gin\", sql`${table.metadata} jsonb_path_ops`),\n]);\n\nexport const assistantVersions = pgTable(\"assistant_versions\", {\n assistant_id: text(\"assistant_id\").notNull().references(() => assistants.assistant_id, { onDelete: \"cascade\" }),\n version: integer(\"version\").notNull(),\n graph_id: text(\"graph_id\").notNull(),\n config: jsonb(\"config\").$type<JsonObject>(),\n context: jsonb(\"context\").$type<JsonObject>(),\n metadata: jsonb(\"metadata\").$type<JsonObject>().notNull().default({}),\n name: text(\"name\"),\n description: text(\"description\"),\n created_at: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n}, (table) => [primaryKey({ columns: [table.assistant_id, table.version] })]);\n\nexport const threads = pgTable(\"thread\", {\n thread_id: text(\"thread_id\").primaryKey(),\n status: text(\"status\").notNull().default(\"idle\"),\n metadata_json: jsonb(\"metadata_json\").$type<JsonObject>().notNull().default({}),\n user_id: text(\"user_id\").notNull(),\n ...timestamps,\n}, (table) => [index(\"idx_thread_user\").on(table.user_id),\n index(\"idx_thread_metadata_gin\").using(\"gin\", sql`${table.metadata_json} jsonb_path_ops`)]);\n\nexport const runs = pgTable(\"runs\", {\n run_id: text(\"run_id\").primaryKey().default(sql`gen_random_uuid()::text`),\n thread_id: text(\"thread_id\").notNull().references(() => threads.thread_id, { onDelete: \"cascade\" }),\n assistant_id: text(\"assistant_id\").references(() => assistants.assistant_id, { onDelete: \"cascade\" }),\n status: text(\"status\").notNull().default(\"pending\"),\n input: jsonb(\"input\").$type<JsonObject>(),\n config: jsonb(\"config\").$type<JsonObject>(),\n context: jsonb(\"context\").$type<JsonObject>(),\n output: jsonb(\"output\").$type<JsonObject>(),\n error_message: text(\"error_message\"),\n user_id: text(\"user_id\").notNull(),\n execution_params: jsonb(\"execution_params\").$type<JsonObject>(),\n claimed_by: text(\"claimed_by\"),\n lease_expires_at: timestamp(\"lease_expires_at\", { withTimezone: true }),\n ...timestamps,\n}, (table) => [\n index(\"idx_runs_thread_id\").on(table.thread_id), index(\"idx_runs_status\").on(table.status),\n index(\"idx_runs_user\").on(table.user_id), index(\"idx_runs_assistant_id\").on(table.assistant_id),\n index(\"idx_runs_created_at\").on(table.created_at),\n index(\"idx_runs_lease_reaper\").on(table.status, table.lease_expires_at).where(sql`${table.status} = 'running'`),\n]);\n\nexport const threadEvents = pgTable(\"thread_events\", {\n seq: bigserial(\"seq\", { mode: \"number\" }).primaryKey(),\n thread_id: text(\"thread_id\").notNull().references(() => threads.thread_id, { onDelete: \"cascade\" }),\n run_id: text(\"run_id\").notNull().references(() => runs.run_id, { onDelete: \"cascade\" }),\n user_id: text(\"user_id\").notNull(),\n event_id: text(\"event_id\").notNull().unique(),\n method: text(\"method\").notNull(),\n namespace: text(\"namespace\").array().notNull().default(sql`'{}'::text[]`),\n event_data: jsonb(\"event_data\").$type<JsonValue>().notNull(),\n event_timestamp: bigint(\"event_timestamp\", { mode: \"number\" }).notNull(),\n created_at: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n}, (table) => [index(\"idx_thread_events_replay\").on(table.user_id, table.thread_id, table.seq)]);\n\nexport const crons = pgTable(\"crons\", {\n cron_id: text(\"cron_id\").primaryKey().default(sql`gen_random_uuid()::text`),\n assistant_id: text(\"assistant_id\").notNull().references(() => assistants.assistant_id, { onDelete: \"cascade\" }),\n thread_id: text(\"thread_id\").references(() => threads.thread_id, { onDelete: \"cascade\" }),\n user_id: text(\"user_id\").notNull(),\n schedule: text(\"schedule\").notNull(),\n payload: jsonb(\"payload\").$type<JsonObject>().notNull().default({}),\n metadata: jsonb(\"metadata\").$type<JsonObject>().notNull().default({}),\n on_run_completed: text(\"on_run_completed\"),\n enabled: boolean(\"enabled\").notNull().default(true),\n end_time: timestamp(\"end_time\", { withTimezone: true }),\n next_run_date: timestamp(\"next_run_date\", { withTimezone: true }),\n claimed_until: timestamp(\"claimed_until\", { withTimezone: true }),\n ...timestamps,\n}, (table) => [\n index(\"idx_cron_user\").on(table.user_id), index(\"idx_cron_assistant_id\").on(table.assistant_id),\n index(\"idx_cron_thread_id\").on(table.thread_id), index(\"idx_cron_next_run\").on(table.enabled, table.next_run_date),\n]);\n\nexport const storeItems = pgTable(\"store_items\", {\n user_id: text(\"user_id\").notNull(),\n namespace: text(\"namespace\").array().notNull(),\n key: text(\"key\").notNull(),\n value: jsonb(\"value\").$type<JsonObject>().notNull(),\n ...timestamps,\n}, (table) => [primaryKey({ columns: [table.namespace, table.key] })]);\n\nexport const threadTtl = pgTable(\"thread_ttl\", {\n thread_id: text(\"thread_id\").primaryKey().references(() => threads.thread_id, { onDelete: \"cascade\" }),\n strategy: text(\"strategy\").notNull().default(\"delete\"),\n ttl_minutes: doublePrecision(\"ttl_minutes\").notNull(),\n created_at: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n expires_at: timestamp(\"expires_at\", { withTimezone: true }).notNull(),\n}, (table) => [index(\"idx_thread_ttl_expires_at\").on(table.expires_at)]);\n",
8
- "import postgres from \"postgres\";\nimport { drizzle } from \"drizzle-orm/postgres-js\";\nimport { loadConfig } from \"../config/project.ts\";\nimport { settings } from \"../config/settings.ts\";\nimport * as schema from \"./schema.ts\";\n\nexport const client = postgres(settings.DATABASE_URL, {\n max: settings.POSTGRES_POOL_MAX_SIZE,\n idle_timeout: 30,\n connect_timeout: 10,\n transform: { undefined: null },\n // Bootstrap DDL raises \"already exists\" notices on every boot; keep them only\n // in verbose mode so the structured request log stays readable.\n onnotice: (notice) => {\n if (settings.LOG_VERBOSITY !== \"verbose\") return;\n console.log(JSON.stringify({ event: \"postgres_notice\", severity: notice.severity, code: notice.code, message: notice.message }));\n },\n});\nexport const db = drizzle({ client, schema });\n\nconst migrations = [\n `CREATE TABLE IF NOT EXISTS aegra_migrations (\n version integer PRIMARY KEY,\n applied_at timestamptz NOT NULL DEFAULT now()\n )`,\n `CREATE TABLE IF NOT EXISTS assistant (\n assistant_id text PRIMARY KEY DEFAULT gen_random_uuid()::text,\n name text NOT NULL,\n description text,\n graph_id text NOT NULL,\n config jsonb NOT NULL DEFAULT '{}'::jsonb,\n context jsonb NOT NULL DEFAULT '{}'::jsonb,\n user_id text NOT NULL,\n version integer NOT NULL DEFAULT 1,\n metadata jsonb NOT NULL DEFAULT '{}'::jsonb,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now(),\n UNIQUE(user_id, assistant_id)\n )`,\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_assistant_user_graph_config\n ON assistant(user_id, graph_id, md5(config::text))`,\n `CREATE INDEX IF NOT EXISTS idx_assistant_user ON assistant(user_id)`,\n `CREATE INDEX IF NOT EXISTS idx_assistant_metadata_gin ON assistant USING gin (metadata jsonb_path_ops)`,\n `CREATE TABLE IF NOT EXISTS assistant_versions (\n assistant_id text NOT NULL REFERENCES assistant(assistant_id) ON DELETE CASCADE,\n version integer NOT NULL,\n graph_id text NOT NULL,\n config jsonb,\n context jsonb,\n metadata jsonb NOT NULL DEFAULT '{}'::jsonb,\n name text,\n description text,\n created_at timestamptz NOT NULL DEFAULT now(),\n PRIMARY KEY(assistant_id, version)\n )`,\n `CREATE TABLE IF NOT EXISTS thread (\n thread_id text PRIMARY KEY,\n status text NOT NULL DEFAULT 'idle',\n metadata_json jsonb NOT NULL DEFAULT '{}'::jsonb,\n user_id text NOT NULL,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n )`,\n `CREATE INDEX IF NOT EXISTS idx_thread_user ON thread(user_id)`,\n `CREATE INDEX IF NOT EXISTS idx_thread_metadata_gin ON thread USING gin (metadata_json jsonb_path_ops)`,\n `CREATE TABLE IF NOT EXISTS runs (\n run_id text PRIMARY KEY DEFAULT gen_random_uuid()::text,\n thread_id text NOT NULL REFERENCES thread(thread_id) ON DELETE CASCADE,\n assistant_id text REFERENCES assistant(assistant_id) ON DELETE CASCADE,\n status text NOT NULL DEFAULT 'pending',\n input jsonb,\n config jsonb,\n context jsonb,\n output jsonb,\n error_message text,\n user_id text NOT NULL,\n execution_params jsonb,\n claimed_by text,\n lease_expires_at timestamptz,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n )`,\n `CREATE INDEX IF NOT EXISTS idx_runs_thread_id ON runs(thread_id)`,\n `CREATE INDEX IF NOT EXISTS idx_runs_status ON runs(status)`,\n `CREATE INDEX IF NOT EXISTS idx_runs_user ON runs(user_id)`,\n `CREATE INDEX IF NOT EXISTS idx_runs_assistant_id ON runs(assistant_id)`,\n `CREATE INDEX IF NOT EXISTS idx_runs_created_at ON runs(created_at)`,\n `CREATE INDEX IF NOT EXISTS idx_runs_lease_reaper ON runs(status, lease_expires_at) WHERE status = 'running'`,\n `CREATE TABLE IF NOT EXISTS thread_events (\n seq bigserial PRIMARY KEY,\n thread_id text NOT NULL REFERENCES thread(thread_id) ON DELETE CASCADE,\n run_id text NOT NULL REFERENCES runs(run_id) ON DELETE CASCADE,\n user_id text NOT NULL,\n event_id text NOT NULL UNIQUE,\n method text NOT NULL,\n namespace text[] NOT NULL DEFAULT '{}',\n event_data jsonb NOT NULL,\n event_timestamp bigint NOT NULL,\n created_at timestamptz NOT NULL DEFAULT now()\n )`,\n `CREATE INDEX IF NOT EXISTS idx_thread_events_replay ON thread_events(user_id, thread_id, seq)`,\n `CREATE TABLE IF NOT EXISTS crons (\n cron_id text PRIMARY KEY DEFAULT gen_random_uuid()::text,\n assistant_id text NOT NULL REFERENCES assistant(assistant_id) ON DELETE CASCADE,\n thread_id text REFERENCES thread(thread_id) ON DELETE CASCADE,\n user_id text NOT NULL,\n schedule text NOT NULL,\n payload jsonb NOT NULL DEFAULT '{}'::jsonb,\n metadata jsonb NOT NULL DEFAULT '{}'::jsonb,\n on_run_completed text,\n enabled boolean NOT NULL DEFAULT true,\n end_time timestamptz,\n next_run_date timestamptz,\n claimed_until timestamptz,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n )`,\n `CREATE TABLE IF NOT EXISTS store_items (\n user_id text NOT NULL,\n namespace text[] NOT NULL,\n key text NOT NULL,\n value jsonb NOT NULL,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now(),\n PRIMARY KEY(namespace, key)\n )`,\n // Store isolation lives in the namespace head ([\"users\", identity, ...]), so\n // the primary key must not include the writer. Older databases keyed on\n // user_id and are migrated in place; shared scopes otherwise duplicate rows.\n `DO $$\n DECLARE legacy_key boolean;\n BEGIN\n SELECT EXISTS (\n SELECT 1 FROM pg_constraint c\n JOIN pg_class t ON t.oid = c.conrelid\n WHERE t.relname = 'store_items' AND c.contype = 'p'\n AND pg_get_constraintdef(c.oid) = 'PRIMARY KEY (user_id, namespace, key)'\n ) INTO legacy_key;\n IF legacy_key THEN\n IF to_regclass('store_embeddings') IS NOT NULL THEN\n ALTER TABLE store_embeddings DROP CONSTRAINT IF EXISTS store_embeddings_user_id_namespace_key_fkey;\n ALTER TABLE store_embeddings DROP CONSTRAINT IF EXISTS store_embeddings_pkey;\n END IF;\n ALTER TABLE store_items DROP CONSTRAINT store_items_pkey;\n ALTER TABLE store_items ADD CONSTRAINT store_items_pkey PRIMARY KEY (namespace, key);\n IF to_regclass('store_embeddings') IS NOT NULL THEN\n ALTER TABLE store_embeddings ADD CONSTRAINT store_embeddings_pkey PRIMARY KEY (namespace, key);\n ALTER TABLE store_embeddings ADD CONSTRAINT store_embeddings_item_fkey\n FOREIGN KEY (namespace, key) REFERENCES store_items(namespace, key) ON DELETE CASCADE;\n END IF;\n END IF;\n END $$`,\n `CREATE INDEX IF NOT EXISTS idx_cron_user ON crons(user_id)`,\n `CREATE INDEX IF NOT EXISTS idx_cron_assistant_id ON crons(assistant_id)`,\n `CREATE INDEX IF NOT EXISTS idx_cron_thread_id ON crons(thread_id)`,\n `CREATE INDEX IF NOT EXISTS idx_cron_next_run ON crons(enabled, next_run_date)`,\n `CREATE TABLE IF NOT EXISTS thread_ttl (\n thread_id text PRIMARY KEY REFERENCES thread(thread_id) ON DELETE CASCADE,\n strategy text NOT NULL DEFAULT 'delete',\n ttl_minutes double precision NOT NULL,\n created_at timestamptz NOT NULL DEFAULT now(),\n expires_at timestamptz NOT NULL\n )`,\n `CREATE INDEX IF NOT EXISTS idx_thread_ttl_expires_at ON thread_ttl(expires_at)`,\n];\n\nexport async function migrate(): Promise<void> {\n for (const statement of migrations) await client.unsafe(statement);\n if ((await loadConfig()).store?.index) {\n await client.unsafe(\"CREATE EXTENSION IF NOT EXISTS vector\");\n await client.unsafe(`CREATE TABLE IF NOT EXISTS store_embeddings (\n user_id text NOT NULL,\n namespace text[] NOT NULL,\n key text NOT NULL,\n embedding vector NOT NULL,\n PRIMARY KEY(namespace, key),\n FOREIGN KEY(namespace, key) REFERENCES store_items(namespace, key) ON DELETE CASCADE\n )`);\n }\n}\n\nexport async function pingDatabase(): Promise<boolean> {\n try {\n await client`SELECT 1`;\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function closeDatabase(): Promise<void> {\n await client.end({ timeout: 5 });\n}\n",
9
- "#!/usr/bin/env bun\nimport { mkdir } from \"node:fs/promises\";\nimport { basename, dirname, resolve } from \"node:path\";\n\ntype Options = Record<string, string | boolean>;\n\nfunction usage(exitCode = 1): never {\n console.log(`Usage: aegra <command> [options]\n\nCommands:\n init [path] Create a TypeScript Aegra project\n dev Start with Bun hot reload\n serve Start the production server\n up|down [args] Run Docker Compose\n db upgrade Apply database migrations\n version Print the version\n\nServer options: --host, --port, --config|-c, --env-file|-e\nInit options: --name|-n, --template|-t <basic|hono|auth|full>, --hono-version <version>, --force`);\n process.exit(exitCode);\n}\n\nfunction parseOptions(args: string[]): { positional: string[]; options: Options } {\n const positional: string[] = [];\n const options: Options = {};\n for (let index = 0; index < args.length; index++) {\n const value = args[index]!;\n if (!value.startsWith(\"-\")) { positional.push(value); continue; }\n const [rawName, inline] = value.split(\"=\", 2);\n const name = ({ \"-c\": \"config\", \"-e\": \"env-file\", \"-n\": \"name\", \"-t\": \"template\" } as Record<string, string>)[rawName!] ?? rawName!.replace(/^--/, \"\");\n if ([\"force\", \"help\", \"no-db-check\"].includes(name)) { options[name] = true; continue; }\n const next = inline ?? args[++index];\n if (!next) throw new Error(`Missing value for ${rawName}`);\n options[name] = next;\n }\n return { positional, options };\n}\n\nasync function loadEnv(path: string): Promise<void> {\n const file = Bun.file(path);\n if (!(await file.exists())) return;\n for (const line of (await file.text()).split(/\\r?\\n/)) {\n const match = line.match(/^\\s*(?:export\\s+)?([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*(.*?)\\s*$/);\n if (!match || process.env[match[1]!] !== undefined) continue;\n process.env[match[1]!] = match[2]!.replace(/^(['\"])(.*)\\1$/, \"$2\");\n }\n}\n\nfunction run(command: string[], env?: Record<string, string | undefined>): void {\n const result = Bun.spawnSync(command, { stdin: \"inherit\", stdout: \"inherit\", stderr: \"inherit\", ...(env ? { env } : {}) });\n if (result.exitCode !== 0) process.exit(result.exitCode);\n}\n\nasync function serverEnvironment(options: Options): Promise<Record<string, string | undefined>> {\n await loadEnv(String(options[\"env-file\"] ?? resolve(\".env\")));\n if (options.host) process.env.HOST = String(options.host);\n if (options.port) process.env.PORT = String(options.port);\n if (options.config) process.env.AEGRA_CONFIG = resolve(String(options.config));\n else if (!process.env.AEGRA_CONFIG && await Bun.file(resolve(\"langgraph.json\")).exists()\n && !(await Bun.file(resolve(\"aegra.json\")).exists())) process.env.AEGRA_CONFIG = \"langgraph.json\";\n return process.env;\n}\n\nfunction slugify(value: string): string {\n return value.toLowerCase().trim().replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\") || \"aegra-agent\";\n}\n\nfunction renderEnvironment(options: {\n name: string;\n version: string;\n withAuth: boolean;\n withRedis: boolean;\n}): string {\n return `# Application\nPROJECT_NAME=${options.name}\nVERSION=${options.version}\nENV_MODE=LOCAL\nLOG_VERBOSITY=verbose\nLOG_EXCLUDE_PATHS=/live\nHOST=0.0.0.0\nPORT=2026\nAEGRA_CONFIG=aegra.json\nRUN_MIGRATIONS_ON_STARTUP=true\n\n# PostgreSQL. DATABASE_URL takes precedence over the individual values.\nDATABASE_URL=postgresql://postgres:postgres@localhost:5432/aegra\nPOSTGRES_USER=postgres\nPOSTGRES_PASSWORD=postgres\nPOSTGRES_HOST=localhost\nPOSTGRES_PORT=5432\nPOSTGRES_DB=aegra\nPOSTGRES_POOL_MAX_SIZE=15\nLANGGRAPH_POOL_MIN_SIZE=5\nLANGGRAPH_POOL_MAX_SIZE=20\n\n# Redis and distributed workers. Disabled means in-process execution.\nREDIS_BROKER_ENABLED=${options.withRedis}\nREDIS_URL=redis://localhost:6379/0\nWORKER_COUNT=3\nN_JOBS_PER_WORKER=10\nWORKER_QUEUE_KEY=aegra:jobs\nBG_JOB_TIMEOUT_SECS=3600\nBG_JOB_MAX_RETRIES=3\nWORKER_DRAIN_TIMEOUT=30\nSTUCK_PENDING_THRESHOLD_SECONDS=120\nLEASE_DURATION_SECONDS=30\nHEARTBEAT_INTERVAL_SECONDS=10\nREAPER_INTERVAL_SECONDS=15\nPOSTGRES_POLL_INTERVAL_SECONDS=5\nKEEPALIVE_INTERVAL_SECS=5\n\n# Scheduled runs\nCRON_ENABLED=true\nCRON_POLL_INTERVAL_SECONDS=60\nCRON_CLAIM_DURATION_SECONDS=300\nCRON_MAX_PER_USER=100\nCRON_ALLOW_SECONDS_SCHEDULE=false\nCRON_TICK_BATCH_SIZE=100\nCRON_MAX_PAYLOAD_BYTES=65536\n\n# Thread retention. Set one value to a number of minutes or a JSON TTL policy.\nAEGRA_THREAD_TTL=\nLANGGRAPH_THREAD_TTL=\n\n# Protocol and metrics\nMAX_SEARCH_LIMIT=1000\nENABLE_PROMETHEUS_METRICS=false\nFF_V2_EVENT_STREAMING=true\n\n# OpenTelemetry. OTEL_TARGETS accepts OTLP/GENERIC, LANGFUSE, and PHOENIX.\nOTEL_SERVICE_NAME=aegra-backend\nOTEL_TARGETS=\nOTEL_CONSOLE_EXPORT=false\nOTEL_EXPORTER_OTLP_ENDPOINT=\nOTEL_EXPORTER_OTLP_HEADERS=\nLANGFUSE_BASE_URL=http://localhost:3000\nLANGFUSE_PUBLIC_KEY=\nLANGFUSE_SECRET_KEY=\nPHOENIX_COLLECTOR_ENDPOINT=http://127.0.0.1:6006/v1/traces\nPHOENIX_API_KEY=\n\n# Generated graph and authentication examples\nOPENAI_API_KEY=\nAEGRA_AUTH_TOKEN=${options.withAuth ? \"replace-me\" : \"\"}\n`;\n}\n\nasync function writeProjectFile(root: string, path: string, content: string, force: boolean): Promise<\"created\" | \"skipped\"> {\n const target = resolve(root, path);\n if (!force && await Bun.file(target).exists()) return \"skipped\";\n await mkdir(dirname(target), { recursive: true });\n await Bun.write(target, content);\n return \"created\";\n}\n\nasync function initProject(args: string[]): Promise<void> {\n const { positional, options } = parseOptions(args);\n if (options.help) usage(0);\n const root = resolve(positional[0] ?? \".\");\n const name = String(options.name ?? basename(root));\n const slug = slugify(name);\n const requestedTemplate = String(options.template ?? \"basic\");\n const template = requestedTemplate === \"1\" ? \"basic\" : requestedTemplate;\n if (![\"basic\", \"hono\", \"auth\", \"full\"].includes(template)) {\n throw new Error(\"Template must be one of: basic, hono, auth, full\");\n }\n\n const pkg = await Bun.file(resolve(import.meta.dir, \"../package.json\")).json() as {\n name: string;\n version: string;\n peerDependencies: Record<string, string>;\n peerDependenciesMeta?: Record<string, { optional?: boolean }>;\n devDependencies: Record<string, string>;\n };\n const pinnedVersion = (name: string): string => {\n const version = pkg.devDependencies[name];\n if (!version) throw new Error(`Package metadata is missing ${name}`);\n return version;\n };\n const packageSpec = process.env.AEGRA_INIT_PACKAGE_SPEC?.trim() || pkg.version;\n const bunVersion = pinnedVersion(\"@types/bun\");\n const honoVersion = String(options[\"hono-version\"] ?? \"\").trim() || pinnedVersion(\"hono\");\n // aegra-hono keeps every third-party runtime library as a peer dependency so\n // projects own their versions. Only the required ones are declared, so a new\n // project never installs Redis, metrics, tracing, or embedding provider SDKs\n // it has not enabled.\n const runtimeDependencies: Record<string, string> = {};\n for (const name of Object.keys(pkg.peerDependencies).sort()) {\n if (pkg.peerDependenciesMeta?.[name]?.optional) continue;\n runtimeDependencies[name] = name === \"hono\" ? honoVersion : pinnedVersion(name);\n }\n const escapedName = JSON.stringify(`Hello from ${name}`);\n const graph = `import { AIMessage } from \"@langchain/core/messages\";\\nimport { MessagesAnnotation, StateGraph, START, END } from \"@langchain/langgraph\";\\n\\nexport const graph = new StateGraph(MessagesAnnotation)\\n .addNode(\"reply\", async () => ({ messages: [new AIMessage(${escapedName})] }))\\n .addEdge(START, \"reply\").addEdge(\"reply\", END).compile();\\n`;\n const withHono = template === \"hono\" || template === \"full\";\n const withAuth = template === \"auth\" || template === \"full\";\n const withRedis = template === \"full\";\n const config = {\n name,\n dependencies: [\"./src\"],\n graphs: { [slug]: \"./src/graph.ts:graph\" },\n ...(withAuth ? { auth: { path: \"./src/auth.ts:auth\" } } : {}),\n ...(withHono ? { http: { app: \"./src/app.ts:app\", ...(withAuth ? { enable_custom_route_auth: true } : {}) } } : {}),\n };\n const redisService = withRedis ? ` redis:\\n image: redis:7-alpine\\n restart: unless-stopped\\n ports:\\n - \"\\${REDIS_PORT:-6379}:6379\"\\n volumes:\\n - redis-data:/data\\n healthcheck:\\n test: [\"CMD\", \"redis-cli\", \"ping\"]\\n interval: 5s\\n timeout: 5s\\n retries: 10\\n\\n` : \"\";\n const redisDependency = withRedis ? ` redis:\\n condition: service_healthy\\n` : \"\";\n const compose = `services:\\n postgres:\\n image: pgvector/pgvector:pg18\\n restart: unless-stopped\\n environment:\\n POSTGRES_USER: \\${POSTGRES_USER:-postgres}\\n POSTGRES_PASSWORD: \\${POSTGRES_PASSWORD:-postgres}\\n POSTGRES_DB: \\${POSTGRES_DB:-aegra}\\n ports:\\n - \"\\${POSTGRES_PORT:-5432}:5432\"\\n volumes:\\n - postgres-data:/var/lib/postgresql\\n healthcheck:\\n test: [\"CMD-SHELL\", \"pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB\"]\\n interval: 5s\\n timeout: 5s\\n retries: 10\\n\\n${redisService} api:\\n build: .\\n restart: unless-stopped\\n ports:\\n - \"\\${PORT:-2026}:2026\"\\n env_file:\\n - .env\\n environment:\\n DATABASE_URL: postgresql://\\${POSTGRES_USER:-postgres}:\\${POSTGRES_PASSWORD:-postgres}@postgres:5432/\\${POSTGRES_DB:-aegra}\\n PORT: \"2026\"\\n AEGRA_CONFIG: /app/aegra.json\\n REDIS_BROKER_ENABLED: \"${withRedis}\"\\n REDIS_URL: redis://redis:6379/0\\n depends_on:\\n postgres:\\n condition: service_healthy\\n${redisDependency} healthcheck:\\n test: [\"CMD\", \"bun\", \"-e\", \"const r=await fetch('http://localhost:2026/health');process.exit(r.ok?0:1)\"]\\n interval: 30s\\n timeout: 10s\\n retries: 3\\n start_period: 10s\\n\\nvolumes:\\n postgres-data:\\n${withRedis ? \" redis-data:\\n\" : \"\"}`;\n const dockerfile = `FROM oven/bun:${bunVersion}-alpine AS install\\nWORKDIR /app\\nCOPY package.json bun.lock ./\\nRUN bun install --frozen-lockfile --production\\n\\nFROM oven/bun:${bunVersion}-alpine AS runtime\\nWORKDIR /app\\nENV NODE_ENV=production\\nCOPY --from=install /app/node_modules ./node_modules\\nCOPY package.json aegra.json ./\\nCOPY src ./src\\nUSER bun\\nEXPOSE 2026\\nCMD [\"bun\", \"run\", \"start\"]\\n`;\n const localServices = `docker compose up -d postgres${withRedis ? \" redis\" : \"\"}`;\n // Redis is the only optional integration the templates switch on. Prometheus\n // metrics, OpenTelemetry tracing, and store embedding providers stay\n // uninstalled until a project enables them and adds the packages itself.\n if (withRedis) runtimeDependencies.ioredis = pinnedVersion(\"ioredis\");\n const packageJson = {\n name: slug,\n private: true,\n type: \"module\",\n scripts: {\n dev: \"aegra dev\",\n start: \"aegra serve\",\n check: \"tsc --noEmit\",\n db: \"aegra db upgrade\",\n \"services:up\": localServices,\n \"services:down\": \"docker compose down\",\n \"docker:up\": \"docker compose up --build -d\",\n \"docker:down\": \"docker compose down\",\n },\n dependencies: {\n [pkg.name]: packageSpec,\n ...runtimeDependencies,\n },\n devDependencies: {\n \"@types/bun\": bunVersion,\n typescript: pinnedVersion(\"typescript\"),\n },\n engines: { bun: `>=${bunVersion}` },\n packageManager: `bun@${bunVersion}`,\n };\n const files: Record<string, string> = {\n \"aegra.json\": `${JSON.stringify(config, null, 2)}\\n`,\n \"package.json\": `${JSON.stringify(packageJson, null, 2)}\\n`,\n \"tsconfig.json\": `${JSON.stringify({ compilerOptions: { target: \"ES2023\", module: \"Preserve\", moduleResolution: \"bundler\", strict: true, noUncheckedIndexedAccess: true, exactOptionalPropertyTypes: true, noEmit: true, types: [\"bun\"], skipLibCheck: true }, include: [\"src\"] }, null, 2)}\\n`,\n \"src/graph.ts\": graph,\n \".env.example\": renderEnvironment({ name, version: pkg.version, withAuth, withRedis }),\n \".gitignore\": `node_modules\\n.env\\ndist\\n*.tsbuildinfo\\n`,\n \".dockerignore\": `node_modules\\n.env\\ndist\\n.git\\n*.log\\n`,\n \"Dockerfile\": dockerfile,\n \"docker-compose.yml\": compose,\n \"README.md\": `# ${name}\\n\\nTypeScript Aegra backend generated with \\`${pkg.name}\\`.\\n\\n## Local development\\n\\n\\`\\`\\`bash\\nbun install\\ncp .env.example .env\\nbun run services:up\\nbun run db\\nbun run dev\\n\\`\\`\\`\\n\\nThe API listens on http://localhost:2026 and exposes its API reference at http://localhost:2026/docs.\\n\\n## Docker\\n\\n\\`\\`\\`bash\\nbun install\\ncp .env.example .env\\nbun run docker:up\\n\\`\\`\\`\\n`,\n };\n if (withHono) files[\"src/app.ts\"] = `import { Hono } from \"hono\";\\nimport { defineApp } from ${JSON.stringify(`${pkg.name}/hono`)};\\nimport type { AppVariables } from ${JSON.stringify(`${pkg.name}/types`)};\\n\\nexport const app = defineApp(new Hono<{ Variables: AppVariables }>().get(\"/hello\", (context) => context.json({ message: ${escapedName} })));\\n`;\n if (withAuth) files[\"src/auth.ts\"] = `import { Auth } from ${JSON.stringify(`${pkg.name}/auth`)};\\n\\nexport const auth = new Auth();\\nauth.authenticate((request) => {\\n const token = process.env.AEGRA_AUTH_TOKEN;\\n if (!token || request.headers.get(\"authorization\") !== \\`Bearer \\${token}\\`) throw new Error(\"Invalid bearer token\");\\n return { identity: request.headers.get(\"x-user-id\")?.trim() || \"authenticated-user\", isAuthenticated: true, permissions: [] };\\n});\\n`;\n let created = 0;\n let skipped = 0;\n for (const [path, content] of Object.entries(files)) {\n if (await writeProjectFile(root, path, content, Boolean(options.force)) === \"created\") created++;\n else skipped++;\n }\n console.log(`Created ${created} files in ${root}${skipped ? ` (${skipped} skipped; use --force to overwrite)` : \"\"}`);\n if (!skipped) {\n const changeDirectory = root === resolve(\".\") ? \"\" : ` cd ${JSON.stringify(root)}\\n`;\n console.log(`\\nNext steps:\\n${changeDirectory} bun install\\n cp .env.example .env\\n bun run services:up\\n bun run db\\n bun run dev`);\n }\n}\n\nexport async function main(argv = process.argv.slice(2)): Promise<void> {\n const [command, ...args] = argv;\n if (!command || command === \"help\" || command === \"--help\") usage(command ? 0 : 1);\n if (command === \"init\") return initProject(args);\n if (command === \"version\" || command === \"--version\") {\n const pkg = await Bun.file(resolve(import.meta.dir, \"../package.json\")).json() as { version: string };\n console.log(pkg.version);\n return;\n }\n if (command === \"dev\" || command === \"serve\") {\n const { options } = parseOptions(args);\n if (options.help) usage(0);\n const env = await serverEnvironment(options);\n const builtEntrypoint = resolve(import.meta.dir, \"index.js\");\n const entrypoint = await Bun.file(builtEntrypoint).exists() ? builtEntrypoint : resolve(import.meta.dir, \"index.ts\");\n if (command === \"dev\") run([\"bun\", \"--hot\", entrypoint], env);\n else await import(entrypoint);\n return;\n }\n if (command === \"up\" || command === \"down\") return run([\"docker\", \"compose\", command, ...args]);\n if (command === \"db\" && args[0] === \"upgrade\") {\n const { options } = parseOptions(args.slice(1));\n await serverEnvironment(options);\n const { migrate, closeDatabase } = await import(\"./core/database.ts\");\n await migrate();\n await closeDatabase();\n console.log(\"Database is up to date\");\n return;\n }\n usage();\n}\n\nif (import.meta.main) main().catch((error: unknown) => { console.error(error instanceof Error ? error.message : error); process.exit(1); });\n"
9
+ "import postgres from \"postgres\";\nimport { drizzle } from \"drizzle-orm/postgres-js\";\nimport { loadConfig } from \"../config/project.ts\";\nimport { settings } from \"../config/settings.ts\";\nimport { logger } from \"./logger.ts\";\nimport * as schema from \"./schema.ts\";\n\nexport const client = postgres(settings.DATABASE_URL, {\n max: settings.POSTGRES_POOL_MAX_SIZE,\n idle_timeout: 30,\n connect_timeout: 10,\n transform: { undefined: null },\n // Bootstrap DDL raises \"already exists\" notices on every boot; keep them only\n // in verbose mode so the structured request log stays readable.\n onnotice: (notice) => {\n if (settings.LOG_VERBOSITY !== \"verbose\") return;\n logger.info(\"postgres notice\", { severity: notice.severity, code: notice.code, detail: notice.message });\n },\n});\nexport const db = drizzle({ client, schema });\n\nconst migrations = [\n `CREATE TABLE IF NOT EXISTS aegra_migrations (\n version integer PRIMARY KEY,\n applied_at timestamptz NOT NULL DEFAULT now()\n )`,\n `CREATE TABLE IF NOT EXISTS assistant (\n assistant_id text PRIMARY KEY DEFAULT gen_random_uuid()::text,\n name text NOT NULL,\n description text,\n graph_id text NOT NULL,\n config jsonb NOT NULL DEFAULT '{}'::jsonb,\n context jsonb NOT NULL DEFAULT '{}'::jsonb,\n user_id text NOT NULL,\n version integer NOT NULL DEFAULT 1,\n metadata jsonb NOT NULL DEFAULT '{}'::jsonb,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now(),\n UNIQUE(user_id, assistant_id)\n )`,\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_assistant_user_graph_config\n ON assistant(user_id, graph_id, md5(config::text))`,\n `CREATE INDEX IF NOT EXISTS idx_assistant_user ON assistant(user_id)`,\n `CREATE INDEX IF NOT EXISTS idx_assistant_metadata_gin ON assistant USING gin (metadata jsonb_path_ops)`,\n `CREATE TABLE IF NOT EXISTS assistant_versions (\n assistant_id text NOT NULL REFERENCES assistant(assistant_id) ON DELETE CASCADE,\n version integer NOT NULL,\n graph_id text NOT NULL,\n config jsonb,\n context jsonb,\n metadata jsonb NOT NULL DEFAULT '{}'::jsonb,\n name text,\n description text,\n created_at timestamptz NOT NULL DEFAULT now(),\n PRIMARY KEY(assistant_id, version)\n )`,\n `CREATE TABLE IF NOT EXISTS thread (\n thread_id text PRIMARY KEY,\n status text NOT NULL DEFAULT 'idle',\n metadata_json jsonb NOT NULL DEFAULT '{}'::jsonb,\n user_id text NOT NULL,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n )`,\n `CREATE INDEX IF NOT EXISTS idx_thread_user ON thread(user_id)`,\n `CREATE INDEX IF NOT EXISTS idx_thread_metadata_gin ON thread USING gin (metadata_json jsonb_path_ops)`,\n `CREATE TABLE IF NOT EXISTS runs (\n run_id text PRIMARY KEY DEFAULT gen_random_uuid()::text,\n thread_id text NOT NULL REFERENCES thread(thread_id) ON DELETE CASCADE,\n assistant_id text REFERENCES assistant(assistant_id) ON DELETE CASCADE,\n status text NOT NULL DEFAULT 'pending',\n input jsonb,\n config jsonb,\n context jsonb,\n output jsonb,\n error_message text,\n user_id text NOT NULL,\n execution_params jsonb,\n claimed_by text,\n lease_expires_at timestamptz,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n )`,\n `CREATE INDEX IF NOT EXISTS idx_runs_thread_id ON runs(thread_id)`,\n `CREATE INDEX IF NOT EXISTS idx_runs_status ON runs(status)`,\n `CREATE INDEX IF NOT EXISTS idx_runs_user ON runs(user_id)`,\n `CREATE INDEX IF NOT EXISTS idx_runs_assistant_id ON runs(assistant_id)`,\n `CREATE INDEX IF NOT EXISTS idx_runs_created_at ON runs(created_at)`,\n `CREATE INDEX IF NOT EXISTS idx_runs_lease_reaper ON runs(status, lease_expires_at) WHERE status = 'running'`,\n `CREATE TABLE IF NOT EXISTS thread_events (\n seq bigserial PRIMARY KEY,\n thread_id text NOT NULL REFERENCES thread(thread_id) ON DELETE CASCADE,\n run_id text NOT NULL REFERENCES runs(run_id) ON DELETE CASCADE,\n user_id text NOT NULL,\n event_id text NOT NULL UNIQUE,\n method text NOT NULL,\n namespace text[] NOT NULL DEFAULT '{}',\n event_data jsonb NOT NULL,\n event_timestamp bigint NOT NULL,\n created_at timestamptz NOT NULL DEFAULT now()\n )`,\n `CREATE INDEX IF NOT EXISTS idx_thread_events_replay ON thread_events(user_id, thread_id, seq)`,\n `CREATE TABLE IF NOT EXISTS crons (\n cron_id text PRIMARY KEY DEFAULT gen_random_uuid()::text,\n assistant_id text NOT NULL REFERENCES assistant(assistant_id) ON DELETE CASCADE,\n thread_id text REFERENCES thread(thread_id) ON DELETE CASCADE,\n user_id text NOT NULL,\n schedule text NOT NULL,\n payload jsonb NOT NULL DEFAULT '{}'::jsonb,\n metadata jsonb NOT NULL DEFAULT '{}'::jsonb,\n on_run_completed text,\n enabled boolean NOT NULL DEFAULT true,\n end_time timestamptz,\n next_run_date timestamptz,\n claimed_until timestamptz,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n )`,\n `CREATE TABLE IF NOT EXISTS store_items (\n user_id text NOT NULL,\n namespace text[] NOT NULL,\n key text NOT NULL,\n value jsonb NOT NULL,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now(),\n PRIMARY KEY(namespace, key)\n )`,\n // Store isolation lives in the namespace head ([\"users\", identity, ...]), so\n // the primary key must not include the writer. Older databases keyed on\n // user_id and are migrated in place; shared scopes otherwise duplicate rows.\n `DO $$\n DECLARE legacy_key boolean;\n BEGIN\n SELECT EXISTS (\n SELECT 1 FROM pg_constraint c\n JOIN pg_class t ON t.oid = c.conrelid\n WHERE t.relname = 'store_items' AND c.contype = 'p'\n AND pg_get_constraintdef(c.oid) = 'PRIMARY KEY (user_id, namespace, key)'\n ) INTO legacy_key;\n IF legacy_key THEN\n IF to_regclass('store_embeddings') IS NOT NULL THEN\n ALTER TABLE store_embeddings DROP CONSTRAINT IF EXISTS store_embeddings_user_id_namespace_key_fkey;\n ALTER TABLE store_embeddings DROP CONSTRAINT IF EXISTS store_embeddings_pkey;\n END IF;\n ALTER TABLE store_items DROP CONSTRAINT store_items_pkey;\n ALTER TABLE store_items ADD CONSTRAINT store_items_pkey PRIMARY KEY (namespace, key);\n IF to_regclass('store_embeddings') IS NOT NULL THEN\n ALTER TABLE store_embeddings ADD CONSTRAINT store_embeddings_pkey PRIMARY KEY (namespace, key);\n ALTER TABLE store_embeddings ADD CONSTRAINT store_embeddings_item_fkey\n FOREIGN KEY (namespace, key) REFERENCES store_items(namespace, key) ON DELETE CASCADE;\n END IF;\n END IF;\n END $$`,\n `CREATE INDEX IF NOT EXISTS idx_cron_user ON crons(user_id)`,\n `CREATE INDEX IF NOT EXISTS idx_cron_assistant_id ON crons(assistant_id)`,\n `CREATE INDEX IF NOT EXISTS idx_cron_thread_id ON crons(thread_id)`,\n `CREATE INDEX IF NOT EXISTS idx_cron_next_run ON crons(enabled, next_run_date)`,\n `CREATE TABLE IF NOT EXISTS thread_ttl (\n thread_id text PRIMARY KEY REFERENCES thread(thread_id) ON DELETE CASCADE,\n strategy text NOT NULL DEFAULT 'delete',\n ttl_minutes double precision NOT NULL,\n created_at timestamptz NOT NULL DEFAULT now(),\n expires_at timestamptz NOT NULL\n )`,\n `CREATE INDEX IF NOT EXISTS idx_thread_ttl_expires_at ON thread_ttl(expires_at)`,\n];\n\nexport async function migrate(): Promise<void> {\n for (const statement of migrations) await client.unsafe(statement);\n if ((await loadConfig()).store?.index) {\n await client.unsafe(\"CREATE EXTENSION IF NOT EXISTS vector\");\n await client.unsafe(`CREATE TABLE IF NOT EXISTS store_embeddings (\n user_id text NOT NULL,\n namespace text[] NOT NULL,\n key text NOT NULL,\n embedding vector NOT NULL,\n PRIMARY KEY(namespace, key),\n FOREIGN KEY(namespace, key) REFERENCES store_items(namespace, key) ON DELETE CASCADE\n )`);\n }\n}\n\nexport async function pingDatabase(): Promise<boolean> {\n try {\n await client`SELECT 1`;\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function closeDatabase(): Promise<void> {\n await client.end({ timeout: 5 });\n}\n",
10
+ "#!/usr/bin/env bun\nimport { mkdir } from \"node:fs/promises\";\nimport { basename, dirname, resolve } from \"node:path\";\n\ntype Options = Record<string, string | boolean>;\n\nfunction usage(exitCode = 1): never {\n console.log(`Usage: aegra <command> [options]\n\nCommands:\n init [path] Create a TypeScript Aegra project\n dev Start with Bun watch mode\n serve Start the production server\n up|down [args] Run Docker Compose\n db upgrade Apply database migrations\n version Print the version\n\nServer options: --host, --port, --config|-c, --env-file|-e\nInit options: --name|-n, --template|-t <basic|hono|auth|full>, --hono-version <version>, --force`);\n process.exit(exitCode);\n}\n\nfunction parseOptions(args: string[]): { positional: string[]; options: Options } {\n const positional: string[] = [];\n const options: Options = {};\n for (let index = 0; index < args.length; index++) {\n const value = args[index]!;\n if (!value.startsWith(\"-\")) { positional.push(value); continue; }\n const [rawName, inline] = value.split(\"=\", 2);\n const name = ({ \"-c\": \"config\", \"-e\": \"env-file\", \"-n\": \"name\", \"-t\": \"template\" } as Record<string, string>)[rawName!] ?? rawName!.replace(/^--/, \"\");\n if ([\"force\", \"help\", \"no-db-check\"].includes(name)) { options[name] = true; continue; }\n const next = inline ?? args[++index];\n if (!next) throw new Error(`Missing value for ${rawName}`);\n options[name] = next;\n }\n return { positional, options };\n}\n\nasync function loadEnv(path: string): Promise<string | undefined> {\n const resolved = resolve(path);\n const file = Bun.file(resolved);\n if (!(await file.exists())) return undefined;\n for (const line of (await file.text()).split(/\\r?\\n/)) {\n const match = line.match(/^\\s*(?:export\\s+)?([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*(.*?)\\s*$/);\n if (!match || process.env[match[1]!] !== undefined) continue;\n process.env[match[1]!] = match[2]!.replace(/^(['\"])(.*)\\1$/, \"$2\");\n }\n return resolved;\n}\n\nfunction run(command: string[], env?: Record<string, string | undefined>): void {\n const result = Bun.spawnSync(command, { stdin: \"inherit\", stdout: \"inherit\", stderr: \"inherit\", ...(env ? { env } : {}) });\n if (result.exitCode !== 0) process.exit(result.exitCode);\n}\n\nasync function serverEnvironment(options: Options): Promise<Record<string, string | undefined>> {\n const envFile = await loadEnv(String(options[\"env-file\"] ?? resolve(\".env\")));\n if (envFile) process.env.AEGRA_ENV_FILE = envFile;\n if (options.host) process.env.HOST = String(options.host);\n if (options.port) process.env.PORT = String(options.port);\n if (options.config) process.env.AEGRA_CONFIG = resolve(String(options.config));\n else if (!process.env.AEGRA_CONFIG && await Bun.file(resolve(\"langgraph.json\")).exists()\n && !(await Bun.file(resolve(\"aegra.json\")).exists())) process.env.AEGRA_CONFIG = \"langgraph.json\";\n return process.env;\n}\n\nfunction slugify(value: string): string {\n return value.toLowerCase().trim().replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\") || \"aegra-agent\";\n}\n\nfunction renderEnvironment(options: {\n name: string;\n version: string;\n withAuth: boolean;\n withRedis: boolean;\n}): string {\n return `# Application\nPROJECT_NAME=${options.name}\nVERSION=${options.version}\nENV_MODE=LOCAL\nTZ=UTC\nLOG_VERBOSITY=verbose\nLOG_EXCLUDE_PATHS=/live\nHOST=0.0.0.0\nPORT=2026\nAEGRA_CONFIG=aegra.json\nRUN_MIGRATIONS_ON_STARTUP=true\n\n# PostgreSQL. DATABASE_URL takes precedence over the individual values.\nDATABASE_URL=postgresql://postgres:postgres@localhost:5432/aegra\nPOSTGRES_USER=postgres\nPOSTGRES_PASSWORD=postgres\nPOSTGRES_HOST=localhost\nPOSTGRES_PORT=5432\nPOSTGRES_DB=aegra\nPOSTGRES_POOL_MAX_SIZE=15\nLANGGRAPH_POOL_MIN_SIZE=5\nLANGGRAPH_POOL_MAX_SIZE=20\n\n# Redis and distributed workers. Disabled means in-process execution.\nREDIS_BROKER_ENABLED=${options.withRedis}\nREDIS_URL=redis://localhost:6379/0\nWORKER_COUNT=3\nN_JOBS_PER_WORKER=10\nWORKER_QUEUE_KEY=aegra:jobs\nBG_JOB_TIMEOUT_SECS=3600\nBG_JOB_MAX_RETRIES=3\nWORKER_DRAIN_TIMEOUT=30\nSTUCK_PENDING_THRESHOLD_SECONDS=120\nLEASE_DURATION_SECONDS=30\nHEARTBEAT_INTERVAL_SECONDS=10\nREAPER_INTERVAL_SECONDS=15\nPOSTGRES_POLL_INTERVAL_SECONDS=5\nKEEPALIVE_INTERVAL_SECS=5\n\n# Scheduled runs\nCRON_ENABLED=true\nCRON_POLL_INTERVAL_SECONDS=60\nCRON_CLAIM_DURATION_SECONDS=300\nCRON_MAX_PER_USER=100\nCRON_ALLOW_SECONDS_SCHEDULE=false\nCRON_TICK_BATCH_SIZE=100\nCRON_MAX_PAYLOAD_BYTES=65536\n\n# Thread retention. Set one value to a number of minutes or a JSON TTL policy.\nAEGRA_THREAD_TTL=\nLANGGRAPH_THREAD_TTL=\n\n# Protocol and metrics\nMAX_SEARCH_LIMIT=1000\nENABLE_PROMETHEUS_METRICS=false\nFF_V2_EVENT_STREAMING=true\n\n# OpenTelemetry. OTEL_TARGETS accepts OTLP/GENERIC, LANGFUSE, and PHOENIX.\nOTEL_SERVICE_NAME=aegra-backend\nOTEL_TARGETS=\nOTEL_CONSOLE_EXPORT=false\nOTEL_EXPORTER_OTLP_ENDPOINT=\nOTEL_EXPORTER_OTLP_HEADERS=\nLANGFUSE_BASE_URL=http://localhost:3000\nLANGFUSE_PUBLIC_KEY=\nLANGFUSE_SECRET_KEY=\nPHOENIX_COLLECTOR_ENDPOINT=http://127.0.0.1:6006/v1/traces\nPHOENIX_API_KEY=\n\n# Generated graph and authentication examples\nOPENAI_API_KEY=\nAEGRA_AUTH_TOKEN=${options.withAuth ? \"replace-me\" : \"\"}\n`;\n}\n\nasync function writeProjectFile(root: string, path: string, content: string, force: boolean): Promise<\"created\" | \"skipped\"> {\n const target = resolve(root, path);\n if (!force && await Bun.file(target).exists()) return \"skipped\";\n await mkdir(dirname(target), { recursive: true });\n await Bun.write(target, content);\n return \"created\";\n}\n\nasync function initProject(args: string[]): Promise<void> {\n const { positional, options } = parseOptions(args);\n if (options.help) usage(0);\n const root = resolve(positional[0] ?? \".\");\n const name = String(options.name ?? basename(root));\n const slug = slugify(name);\n const requestedTemplate = String(options.template ?? \"basic\");\n const template = requestedTemplate === \"1\" ? \"basic\" : requestedTemplate;\n if (![\"basic\", \"hono\", \"auth\", \"full\"].includes(template)) {\n throw new Error(\"Template must be one of: basic, hono, auth, full\");\n }\n\n const pkg = await Bun.file(resolve(import.meta.dir, \"../package.json\")).json() as {\n name: string;\n version: string;\n peerDependencies: Record<string, string>;\n peerDependenciesMeta?: Record<string, { optional?: boolean }>;\n devDependencies: Record<string, string>;\n };\n const pinnedVersion = (name: string): string => {\n const version = pkg.devDependencies[name];\n if (!version) throw new Error(`Package metadata is missing ${name}`);\n return version;\n };\n const packageSpec = process.env.AEGRA_INIT_PACKAGE_SPEC?.trim() || pkg.version;\n const bunVersion = pinnedVersion(\"@types/bun\");\n const honoVersion = String(options[\"hono-version\"] ?? \"\").trim() || pinnedVersion(\"hono\");\n // aegra-hono keeps every third-party runtime library as a peer dependency so\n // projects own their versions. Only the required ones are declared, so a new\n // project never installs Redis, metrics, tracing, or embedding provider SDKs\n // it has not enabled.\n const runtimeDependencies: Record<string, string> = {};\n for (const name of Object.keys(pkg.peerDependencies).sort()) {\n if (pkg.peerDependenciesMeta?.[name]?.optional) continue;\n runtimeDependencies[name] = name === \"hono\" ? honoVersion : pinnedVersion(name);\n }\n const escapedName = JSON.stringify(`Hello from ${name}`);\n const graph = `import { AIMessage } from \"@langchain/core/messages\";\\nimport { MessagesAnnotation, StateGraph, START, END } from \"@langchain/langgraph\";\\n\\nexport const graph = new StateGraph(MessagesAnnotation)\\n .addNode(\"reply\", async () => ({ messages: [new AIMessage(${escapedName})] }))\\n .addEdge(START, \"reply\").addEdge(\"reply\", END).compile();\\n`;\n const withHono = template === \"hono\" || template === \"full\";\n const withAuth = template === \"auth\" || template === \"full\";\n const withRedis = template === \"full\";\n const config = {\n name,\n dependencies: [\"./src\"],\n graphs: { [slug]: \"./src/graph.ts:graph\" },\n ...(withAuth ? { auth: { path: \"./src/auth.ts:auth\" } } : {}),\n ...(withHono ? { http: { app: \"./src/app.ts:app\", ...(withAuth ? { enable_custom_route_auth: true } : {}) } } : {}),\n };\n const redisService = withRedis ? ` redis:\\n image: redis:7-alpine\\n restart: unless-stopped\\n ports:\\n - \"\\${REDIS_PORT:-6379}:6379\"\\n volumes:\\n - redis-data:/data\\n healthcheck:\\n test: [\"CMD\", \"redis-cli\", \"ping\"]\\n interval: 5s\\n timeout: 5s\\n retries: 10\\n\\n` : \"\";\n const redisDependency = withRedis ? ` redis:\\n condition: service_healthy\\n` : \"\";\n const compose = `services:\\n postgres:\\n image: pgvector/pgvector:pg18\\n restart: unless-stopped\\n environment:\\n POSTGRES_USER: \\${POSTGRES_USER:-postgres}\\n POSTGRES_PASSWORD: \\${POSTGRES_PASSWORD:-postgres}\\n POSTGRES_DB: \\${POSTGRES_DB:-aegra}\\n ports:\\n - \"\\${POSTGRES_PORT:-5432}:5432\"\\n volumes:\\n - postgres-data:/var/lib/postgresql\\n healthcheck:\\n test: [\"CMD-SHELL\", \"pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB\"]\\n interval: 5s\\n timeout: 5s\\n retries: 10\\n\\n${redisService} api:\\n build: .\\n restart: unless-stopped\\n ports:\\n - \"\\${PORT:-2026}:2026\"\\n env_file:\\n - .env\\n environment:\\n DATABASE_URL: postgresql://\\${POSTGRES_USER:-postgres}:\\${POSTGRES_PASSWORD:-postgres}@postgres:5432/\\${POSTGRES_DB:-aegra}\\n PORT: \"2026\"\\n AEGRA_CONFIG: /app/aegra.json\\n REDIS_BROKER_ENABLED: \"${withRedis}\"\\n REDIS_URL: redis://redis:6379/0\\n depends_on:\\n postgres:\\n condition: service_healthy\\n${redisDependency} healthcheck:\\n test: [\"CMD\", \"bun\", \"-e\", \"const r=await fetch('http://localhost:2026/health');process.exit(r.ok?0:1)\"]\\n interval: 30s\\n timeout: 10s\\n retries: 3\\n start_period: 10s\\n\\nvolumes:\\n postgres-data:\\n${withRedis ? \" redis-data:\\n\" : \"\"}`;\n const dockerfile = `FROM oven/bun:${bunVersion}-alpine AS install\\nWORKDIR /app\\nCOPY package.json bun.lock ./\\nRUN bun install --frozen-lockfile --production\\n\\nFROM oven/bun:${bunVersion}-alpine AS runtime\\nWORKDIR /app\\nENV NODE_ENV=production\\nCOPY --from=install /app/node_modules ./node_modules\\nCOPY package.json aegra.json ./\\nCOPY src ./src\\nUSER bun\\nEXPOSE 2026\\nCMD [\"bun\", \"run\", \"start\"]\\n`;\n const localServices = `docker compose up -d postgres${withRedis ? \" redis\" : \"\"}`;\n // Redis is the only optional integration the templates switch on. Prometheus\n // metrics, OpenTelemetry tracing, and store embedding providers stay\n // uninstalled until a project enables them and adds the packages itself.\n if (withRedis) runtimeDependencies.ioredis = pinnedVersion(\"ioredis\");\n const packageJson = {\n name: slug,\n private: true,\n type: \"module\",\n scripts: {\n dev: \"aegra dev\",\n start: \"aegra serve\",\n check: \"tsc --noEmit\",\n db: \"aegra db upgrade\",\n \"services:up\": localServices,\n \"services:down\": \"docker compose down\",\n \"docker:up\": \"docker compose up --build -d\",\n \"docker:down\": \"docker compose down\",\n },\n dependencies: {\n [pkg.name]: packageSpec,\n ...runtimeDependencies,\n },\n devDependencies: {\n \"@types/bun\": bunVersion,\n typescript: pinnedVersion(\"typescript\"),\n },\n engines: { bun: `>=${bunVersion}` },\n packageManager: `bun@${bunVersion}`,\n };\n const files: Record<string, string> = {\n \"aegra.json\": `${JSON.stringify(config, null, 2)}\\n`,\n \"package.json\": `${JSON.stringify(packageJson, null, 2)}\\n`,\n \"tsconfig.json\": `${JSON.stringify({ compilerOptions: { target: \"ES2023\", module: \"Preserve\", moduleResolution: \"bundler\", strict: true, noUncheckedIndexedAccess: true, exactOptionalPropertyTypes: true, noEmit: true, types: [\"bun\"], skipLibCheck: true }, include: [\"src\"] }, null, 2)}\\n`,\n \"src/graph.ts\": graph,\n \".env.example\": renderEnvironment({ name, version: pkg.version, withAuth, withRedis }),\n \".gitignore\": `node_modules\\n.env\\ndist\\n*.tsbuildinfo\\n`,\n \".dockerignore\": `node_modules\\n.env\\ndist\\n.git\\n*.log\\n`,\n \"Dockerfile\": dockerfile,\n \"docker-compose.yml\": compose,\n \"README.md\": `# ${name}\\n\\nTypeScript Aegra backend generated with \\`${pkg.name}\\`.\\n\\n## Local development\\n\\n\\`\\`\\`bash\\nbun install\\ncp .env.example .env\\nbun run services:up\\nbun run db\\nbun run dev\\n\\`\\`\\`\\n\\nThe API listens on http://localhost:2026 and exposes its API reference at http://localhost:2026/docs.\\n\\n## Docker\\n\\n\\`\\`\\`bash\\nbun install\\ncp .env.example .env\\nbun run docker:up\\n\\`\\`\\`\\n`,\n };\n if (withHono) files[\"src/app.ts\"] = `import { Hono } from \"hono\";\\nimport { defineApp } from ${JSON.stringify(`${pkg.name}/hono`)};\\nimport type { AppVariables } from ${JSON.stringify(`${pkg.name}/types`)};\\n\\nexport const app = defineApp(new Hono<{ Variables: AppVariables }>().get(\"/hello\", (context) => context.json({ message: ${escapedName} })));\\n`;\n if (withAuth) files[\"src/auth.ts\"] = `import { Auth } from ${JSON.stringify(`${pkg.name}/auth`)};\\n\\nexport const auth = new Auth();\\nauth.authenticate((request) => {\\n const token = process.env.AEGRA_AUTH_TOKEN;\\n if (!token || request.headers.get(\"authorization\") !== \\`Bearer \\${token}\\`) throw new Error(\"Invalid bearer token\");\\n return { identity: request.headers.get(\"x-user-id\")?.trim() || \"authenticated-user\", isAuthenticated: true, permissions: [] };\\n});\\n`;\n let created = 0;\n let skipped = 0;\n for (const [path, content] of Object.entries(files)) {\n if (await writeProjectFile(root, path, content, Boolean(options.force)) === \"created\") created++;\n else skipped++;\n }\n console.log(`Created ${created} files in ${root}${skipped ? ` (${skipped} skipped; use --force to overwrite)` : \"\"}`);\n if (!skipped) {\n const changeDirectory = root === resolve(\".\") ? \"\" : ` cd ${JSON.stringify(root)}\\n`;\n console.log(`\\nNext steps:\\n${changeDirectory} bun install\\n cp .env.example .env\\n bun run services:up\\n bun run db\\n bun run dev`);\n }\n}\n\nexport async function main(argv = process.argv.slice(2)): Promise<void> {\n const [command, ...args] = argv;\n if (!command || command === \"help\" || command === \"--help\") usage(command ? 0 : 1);\n if (command === \"init\") return initProject(args);\n if (command === \"version\" || command === \"--version\") {\n const pkg = await Bun.file(resolve(import.meta.dir, \"../package.json\")).json() as { version: string };\n console.log(pkg.version);\n return;\n }\n if (command === \"dev\" || command === \"serve\") {\n const { options } = parseOptions(args);\n if (options.help) usage(0);\n const env = await serverEnvironment(options);\n const builtEntrypoint = resolve(import.meta.dir, \"index.js\");\n const entrypoint = await Bun.file(builtEntrypoint).exists() ? builtEntrypoint : resolve(import.meta.dir, \"index.ts\");\n if (command === \"dev\") run([\"bun\", \"--watch\", \"--no-clear-screen\", entrypoint], env);\n else await import(entrypoint);\n return;\n }\n if (command === \"up\" || command === \"down\") return run([\"docker\", \"compose\", command, ...args]);\n if (command === \"db\" && args[0] === \"upgrade\") {\n const { options } = parseOptions(args.slice(1));\n await serverEnvironment(options);\n const { migrate, closeDatabase } = await import(\"./core/database.ts\");\n await migrate();\n await closeDatabase();\n console.log(\"Database is up to date\");\n return;\n }\n usage();\n}\n\nif (import.meta.main) main().catch((error: unknown) => { console.error(error instanceof Error ? error.message : error); process.exit(1); });\n"
10
11
  ],
11
- "mappings": "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",
12
- "debugId": "DA151E06305152BE64756E2164756E21",
12
+ "mappings": "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",
13
+ "debugId": "F01FFA24D9F697B664756E2164756E21",
13
14
  "names": []
14
15
  }
@@ -0,0 +1,58 @@
1
+ export declare const environmentVariableNames: readonly string[];
2
+ export declare const settings: {
3
+ readonly DATABASE_URL: string;
4
+ readonly PROJECT_NAME: string;
5
+ readonly VERSION: string;
6
+ readonly ENV_MODE: string;
7
+ readonly LOG_VERBOSITY: string;
8
+ readonly LOG_EXCLUDE_PATHS: string;
9
+ readonly HOST: string;
10
+ readonly PORT: number;
11
+ readonly AEGRA_CONFIG: string;
12
+ readonly RUN_MIGRATIONS_ON_STARTUP: boolean;
13
+ readonly POSTGRES_USER: string;
14
+ readonly POSTGRES_PASSWORD: string;
15
+ readonly POSTGRES_HOST: string;
16
+ readonly POSTGRES_PORT: number;
17
+ readonly POSTGRES_DB: string;
18
+ readonly POSTGRES_POOL_MAX_SIZE: number;
19
+ readonly LANGGRAPH_POOL_MIN_SIZE: number;
20
+ readonly LANGGRAPH_POOL_MAX_SIZE: number;
21
+ readonly REDIS_BROKER_ENABLED: boolean;
22
+ readonly REDIS_URL: string;
23
+ readonly WORKER_COUNT: number;
24
+ readonly N_JOBS_PER_WORKER: number;
25
+ readonly WORKER_QUEUE_KEY: string;
26
+ readonly BG_JOB_TIMEOUT_SECS: number;
27
+ readonly BG_JOB_MAX_RETRIES: number;
28
+ readonly WORKER_DRAIN_TIMEOUT: number;
29
+ readonly STUCK_PENDING_THRESHOLD_SECONDS: number;
30
+ readonly LEASE_DURATION_SECONDS: number;
31
+ readonly HEARTBEAT_INTERVAL_SECONDS: number;
32
+ readonly REAPER_INTERVAL_SECONDS: number;
33
+ readonly POSTGRES_POLL_INTERVAL_SECONDS: number;
34
+ readonly KEEPALIVE_INTERVAL_SECS: number;
35
+ readonly CRON_ENABLED: boolean;
36
+ readonly CRON_POLL_INTERVAL_SECONDS: number;
37
+ readonly CRON_CLAIM_DURATION_SECONDS: number;
38
+ readonly CRON_MAX_PER_USER: number;
39
+ readonly CRON_ALLOW_SECONDS_SCHEDULE: boolean;
40
+ readonly CRON_TICK_BATCH_SIZE: number;
41
+ readonly CRON_MAX_PAYLOAD_BYTES: number;
42
+ readonly MAX_SEARCH_LIMIT: number;
43
+ readonly ENABLE_PROMETHEUS_METRICS: boolean;
44
+ readonly FF_V2_EVENT_STREAMING: boolean;
45
+ readonly OTEL_SERVICE_NAME: string;
46
+ readonly OTEL_TARGETS: string;
47
+ readonly OTEL_CONSOLE_EXPORT: boolean;
48
+ readonly LANGFUSE_BASE_URL: string;
49
+ readonly PHOENIX_COLLECTOR_ENDPOINT: string;
50
+ readonly AEGRA_THREAD_TTL?: string | undefined;
51
+ readonly LANGGRAPH_THREAD_TTL?: string | undefined;
52
+ readonly OTEL_EXPORTER_OTLP_ENDPOINT?: string | undefined;
53
+ readonly OTEL_EXPORTER_OTLP_HEADERS?: string | undefined;
54
+ readonly LANGFUSE_PUBLIC_KEY?: string | undefined;
55
+ readonly LANGFUSE_SECRET_KEY?: string | undefined;
56
+ readonly PHOENIX_API_KEY?: string | undefined;
57
+ };
58
+ export type Settings = typeof settings;