aegra-hono 0.16.0 → 0.17.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/dist/cli.js CHANGED
@@ -18,7 +18,7 @@ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
18
18
 
19
19
  // src/config/settings.ts
20
20
  import { z } from "zod";
21
- var DEFAULT_VERSION = "0.16.0", booleanFromEnv, positiveIntFromEnv = (fallback) => z.coerce.number().int().positive().default(fallback), environmentShape, environmentVariableNames, environmentSchema, raw, settings;
21
+ var DEFAULT_VERSION = "0.17.0", booleanFromEnv, positiveIntFromEnv = (fallback) => z.coerce.number().int().positive().default(fallback), environmentShape, environmentVariableNames, environmentSchema, raw, settings;
22
22
  var init_settings = __esm(() => {
23
23
  booleanFromEnv = z.stringbool().default(false);
24
24
  environmentShape = {
@@ -1029,4 +1029,4 @@ export {
1029
1029
  main
1030
1030
  };
1031
1031
 
1032
- //# debugId=DB42B3726E253FFC64756E2164756E21
1032
+ //# debugId=30C97D58A5F96CB564756E2164756E21
package/dist/cli.js.map CHANGED
@@ -2,7 +2,7 @@
2
2
  "version": 3,
3
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\n/**\n * Fallback reported by `/info` and `/openapi.json` when `VERSION` is unset.\n *\n * Must equal the package version: drift ships a server that misreports the\n * running build. `tests/unit/openapi.test.ts` fails when they diverge. It is a\n * literal rather than a `package.json` import because the declaration build\n * pins `rootDir` to `src/`.\n */\nexport const DEFAULT_VERSION = \"0.16.0\";\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(DEFAULT_VERSION),\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\n/**\n * Fallback reported by `/info` and `/openapi.json` when `VERSION` is unset.\n *\n * Must equal the package version: drift ships a server that misreports the\n * running build. `tests/unit/openapi.test.ts` fails when they diverge. It is a\n * literal rather than a `package.json` import because the declaration build\n * pins `rootDir` to `src/`.\n */\nexport const DEFAULT_VERSION = \"0.17.0\";\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(DEFAULT_VERSION),\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
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",
8
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",
@@ -10,6 +10,6 @@
10
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"
11
11
  ],
12
12
  "mappings": "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",
13
- "debugId": "DB42B3726E253FFC64756E2164756E21",
13
+ "debugId": "30C97D58A5F96CB564756E2164756E21",
14
14
  "names": []
15
15
  }
@@ -6,7 +6,7 @@
6
6
  * literal rather than a `package.json` import because the declaration build
7
7
  * pins `rootDir` to `src/`.
8
8
  */
9
- export declare const DEFAULT_VERSION = "0.16.0";
9
+ export declare const DEFAULT_VERSION = "0.17.0";
10
10
  export declare const environmentVariableNames: readonly string[];
11
11
  export declare const settings: {
12
12
  readonly DATABASE_URL: string;
package/dist/hono.d.ts CHANGED
@@ -1,6 +1,39 @@
1
- import type { Hono } from "hono";
1
+ import type { Handler, Hono } from "hono";
2
2
  import type { AppVariables } from "./types.js";
3
3
  export type AegraApp = Hono<{
4
4
  Variables: AppVariables;
5
5
  }>;
6
+ /**
7
+ * An OpenAPI 3.1 operation object for a custom route — `summary`, `tags`,
8
+ * `responses`, `parameters`, anything the spec allows. Served verbatim.
9
+ */
10
+ export type OpenApiOperation = {
11
+ tags?: string[];
12
+ summary?: string;
13
+ description?: string;
14
+ operationId?: string;
15
+ responses?: Record<string, unknown>;
16
+ [key: string]: unknown;
17
+ };
6
18
  export declare function defineApp<T extends AegraApp>(app: T): T;
19
+ /**
20
+ * Attach OpenAPI documentation to a custom-route handler — the Hono analog of
21
+ * FastAPI's route-decorator arguments.
22
+ *
23
+ * The wrapped handler registers exactly like a plain one; the server reads the
24
+ * attached operation when serving `/openapi.json`, so the documentation lives
25
+ * on the route it describes instead of in a separate file. Routes without it
26
+ * still appear in the served spec with a generated bare operation.
27
+ *
28
+ * ```ts
29
+ * export const app = new Hono<{ Variables: AppVariables }>();
30
+ * app.get("/custom/hello", withOpenApi({
31
+ * tags: ["Custom"],
32
+ * summary: "Say hello",
33
+ * responses: { "200": { description: "Greeting" } },
34
+ * }, (context) => context.json({ message: "hello" })));
35
+ * ```
36
+ */
37
+ export declare function withOpenApi<C extends {
38
+ Variables: AppVariables;
39
+ }>(operation: OpenApiOperation, handler: Handler<C>): Handler<C>;
package/dist/hono.js CHANGED
@@ -19,8 +19,12 @@ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
19
19
  function defineApp(app) {
20
20
  return app;
21
21
  }
22
+ function withOpenApi(operation, handler) {
23
+ return Object.assign(handler, { openapi: operation });
24
+ }
22
25
  export {
26
+ withOpenApi,
23
27
  defineApp
24
28
  };
25
29
 
26
- //# debugId=7B2CA043FDA026BD64756E2164756E21
30
+ //# debugId=40D47AA4665BF03A64756E2164756E21
package/dist/hono.js.map CHANGED
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/hono.ts"],
4
4
  "sourcesContent": [
5
- "import type { Hono } from \"hono\";\nimport type { AppVariables } from \"./types.ts\";\n\nexport type AegraApp = Hono<{ Variables: AppVariables }>;\n\nexport function defineApp<T extends AegraApp>(app: T): T {\n return app;\n}\n"
5
+ "import type { Handler, Hono } from \"hono\";\nimport type { AppVariables } from \"./types.ts\";\n\nexport type AegraApp = Hono<{ Variables: AppVariables }>;\n\n/**\n * An OpenAPI 3.1 operation object for a custom route — `summary`, `tags`,\n * `responses`, `parameters`, anything the spec allows. Served verbatim.\n */\nexport type OpenApiOperation = {\n tags?: string[];\n summary?: string;\n description?: string;\n operationId?: string;\n responses?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\nexport function defineApp<T extends AegraApp>(app: T): T {\n return app;\n}\n\n/**\n * Attach OpenAPI documentation to a custom-route handler — the Hono analog of\n * FastAPI's route-decorator arguments.\n *\n * The wrapped handler registers exactly like a plain one; the server reads the\n * attached operation when serving `/openapi.json`, so the documentation lives\n * on the route it describes instead of in a separate file. Routes without it\n * still appear in the served spec with a generated bare operation.\n *\n * ```ts\n * export const app = new Hono<{ Variables: AppVariables }>();\n * app.get(\"/custom/hello\", withOpenApi({\n * tags: [\"Custom\"],\n * summary: \"Say hello\",\n * responses: { \"200\": { description: \"Greeting\" } },\n * }, (context) => context.json({ message: \"hello\" })));\n * ```\n */\nexport function withOpenApi<C extends { Variables: AppVariables }>(\n operation: OpenApiOperation,\n handler: Handler<C>,\n): Handler<C> {\n return Object.assign(handler, { openapi: operation });\n}\n"
6
6
  ],
7
- "mappings": ";;;;;;;;;;;;;;;;;;AAKO,SAAS,SAA6B,CAAC,KAAW;AAAA,EACvD,OAAO;AAAA;",
8
- "debugId": "7B2CA043FDA026BD64756E2164756E21",
7
+ "mappings": ";;;;;;;;;;;;;;;;;;AAkBO,SAAS,SAA6B,CAAC,KAAW;AAAA,EACvD,OAAO;AAAA;AAqBF,SAAS,WAAkD,CAChE,WACA,SACY;AAAA,EACZ,OAAO,OAAO,OAAO,SAAS,EAAE,SAAS,UAAU,CAAC;AAAA;",
8
+ "debugId": "40D47AA4665BF03A64756E2164756E21",
9
9
  "names": []
10
10
  }