# 架构与边界

本文档说明 DiAL 的项目结构、启动链路、运行时流程、HTTP 请求流程和前后端边界。

适用场景：修改目录边界、启动流程、运行时调度、HTTP server、前后端集成方式或主要模块职责。

## 项目结构

```text
src/
  server/
    bootstrap.ts
    config.ts
    dev.ts
    logger.ts
    main.ts
    server.ts
    helpers.ts
    middleware.ts
    version.ts
    routes/
    checker/
      config-loader.ts
      variables.ts
      schema/
      store.ts
      engine.ts
      expect/
      runner/
  shared/
    api.ts
  web/
    app.tsx
    main.tsx
    styles.css
    components/
    constants/
    hooks/
    utils/
scripts/
tests/
docs/
openspec/
probe-config.schema.json
```

## 启动流程

```text
dev.ts / main.ts
  -> readRuntimeConfig(cli args)
  -> bootstrap({ configPath, mode })
  -> loadConfig(yaml)
  -> createRuntimeLogger(logging)
  -> ProbeStore(db)
  -> store.syncTargets(targets)
  -> ProbeEngine(...).start()
  -> startServer({ config, mode, store, logger })
  -> 注册 SIGINT/SIGTERM shutdown
```

`loadConfig()` 的处理顺序：YAML 解析 -> Authoring normalize（变量替换 + expect 简写展开）-> Normalized 契约校验 -> 语义校验 -> resolve。

## 运行时流程

```text
定时器 tick
  -> ProbeEngine.probeGroup()
  -> checkerRegistry.get(target.type).execute()
  -> runner/*/expect.ts 校验
  -> engine.writeResult()
  -> store.insertCheckResult()
```

数据清理由 engine 定时调用 `store.prune(retentionMs)`，每小时执行一次。

## HTTP 请求流程

```text
Request
  -> Bun.serve routes 声明式匹配
  -> routes/*.ts handler
  -> middleware.ts 参数校验
  -> helpers.ts 响应格式化
  -> Response
```

生产模式下，非 API 路径由 fetch fallback 处理静态资源和 SPA fallback。开发模式下，Vite proxy 将 `/api` 和 `/health` 请求转发到 Bun API server。

## 前后端边界

- 前端只通过 HTTP 调用后端，API 路径为 `/api/*`。
- 共享类型放在 `src/shared/`。
- 前端不得 import `src/server/` 的运行时实现。
- 后端不得依赖 `src/web/` 运行时代码，HTML import 集成除外。

## 主要模块职责

| 模块                                  | 职责                                        |
| ------------------------------------- | ------------------------------------------- |
| `src/server/bootstrap.ts`             | 统一启动引导和 shutdown 编排                |
| `src/server/server.ts`                | Bun HTTP server 和 routes 注册              |
| `src/server/routes/`                  | API handler，按端点拆分                     |
| `src/server/checker/config-loader.ts` | YAML 解析、契约校验、语义校验、resolve 调度 |
| `src/server/checker/store.ts`         | SQLite 数据存储                             |
| `src/server/checker/engine.ts`        | 定时调度、并发控制、结果写入、数据清理      |
| `src/server/checker/runner/`          | 各 checker 自包含实现                       |
| `src/server/checker/expect/`          | 跨 checker 复用的断言基础设施               |
| `src/web/`                            | React Dashboard                             |
| `src/shared/api.ts`                   | 前后端共享 API 类型                         |

## 更新触发条件

修改项目结构、启动流程、运行时流程、HTTP 请求流程、前后端边界或主要模块职责时，必须更新本文档。
