/** * Hono 应用 —— 自建应用,Mastra 以库形态嵌入(ADR-001)。 * 鉴权、岗位权限、SSE 全归 app 层;不暴露 Mastra 默认端点。 */ import { Hono } from 'hono'; import type { ApiError } from '@contracts'; import { DEFAULT_LOGIN_ACCOUNT } from '@modules/org'; import type { Container } from './container.ts'; import type { AppEnv } from './http-env.ts'; import { registerDeskRoutes } from './routes/desk.ts'; import { registerGovernanceRoutes } from './routes/governance.ts'; import { registerIngestRoutes } from './routes/ingest.ts'; import { registerWorkbenchRoutes } from './routes/workbench.ts'; export type { AppEnv }; export function createServer(container: Container): Hono { const app = new Hono(); // 单组织 cookie session(编码规范 §4 鉴权定调)—— MVP 单登录者,cookie 缺省即种子登录者 app.use('*', async (c, next) => { const cookie = c.req.header('cookie') ?? ''; const match = /(?:^|;\s*)jcai_account=([^;]+)/.exec(cookie); c.set('account', match?.[1] ?? DEFAULT_LOGIN_ACCOUNT); await next(); }); app.onError((error, c) => { const body: ApiError = { code: 'internal', message: error instanceof Error ? error.message : String(error), }; process.stderr.write(`[api] ${body.message}\n`); return c.json(body, 500); }); app.notFound((c) => { const body: ApiError = { code: 'not-found', message: `无此路由:${c.req.path}` }; return c.json(body, 404); }); registerWorkbenchRoutes(app, container); registerGovernanceRoutes(app, container); registerDeskRoutes(app, container); registerIngestRoutes(app, container); return app; }