Files
fire-safety-ymd/CONTEXT.md
T
2026-09-05 15:46:37 +08:00

100 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# fire-safety-ymd 项目上下文
## 1. 项目目标
`fire-safety-ymd` 是一个面向森林防火场景的 Go 后端项目。目标调用链是:用户在业务应用中提问,后端维护会话并调用既有 SuperAgent 平台;SuperAgent 在需要业务事实时调用本项目提供的 MCP 工具;本项目从受控的 PostgreSQL/PostGIS 数据源查询消防资源和风险区域,再将结构化结果返回给 Agent 组织回答或辅助方案。
项目不自行训练或实现通用 Agent,也不允许大模型直接访问数据库。
## 2. 当前系统组成
| 路径或系统 | 当前职责 | 当前状态 |
| --- | --- | --- |
| `cmd/server` | Go 服务进程入口 | 已建立 |
| `internal/app` | 应用装配、readiness 和 HTTP 生命周期 | 已建立;按开关装配原生/兼容 Chat、SuperAgent 和 MCP/PostGIS |
| `internal/config` | 环境配置入口 | 已包含 HTTP、SuperAgent、Chat 兼容 App ID、MCP 与 PostGIS 配置校验和凭证分离门禁 |
| `internal/handler` | HTTP/MCP 入站协议层 | `GET /health` 已启用;默认关闭的原生 `/api/chat`、可选 DashScope 风格 `completion` 和 `/mcp` 已实现 |
| `internal/service` | 业务用例编排 | 已实现单进程聊天会话/并发 Run 控制,以及地名候选、有界空间查询、可信数据库全范围/镇街白名单和结果语义 |
| `internal/domain` | 森林防火领域模型与规则 | 已包含点位、水源、候选设施、通道、队伍和风险区模型 |
| `internal/repository` | PostgreSQL/PostGIS 持久化适配 | 已实现 pgxpool、只读固定 SQL 与 schema/SRID readiness;实库 SRID 元数据、严格 readiness 和 7 个工具真实查询已验证 |
| `cmd/postgis-srid-migrate` | 显式 SRID 元数据迁移 | 已执行;默认只读预检,写入需独立迁移凭证和明确 CRS 确认 |
| `internal/integration/superagent` | SuperAgent Open API 出站适配 | 已实现并通过模拟 Provider 测试,默认关闭 |
| `cmd/superagent-probe` | 无业务数据的显式连通性探针 | 已实现;需要项目专属测试配置 |
| `cmd/postgis-probe` | 不读取业务行的 PostGIS readiness 探针 | 已实现;需要只读数据库配置 |
| `Dockerfile` / `compose.yaml` | 测试环境容器构建与单实例进程托管 | 已建立;只发布宿主机回环端口,目标服务器尚未验证 |
| `pkg` | 可被外部 module 复用的稳定 Go API | 当前为空 |
| `docs/import` | 字段/表映射、通用模板和本地数据库样例 | 样例 SQL 含受限数据并被 Git 忽略,不会执行 |
| SuperAgent | 对话理解、工具选择和答案组织 | 已按仓库内 2026-07-12 协议基线实现客户端;当前环境待联调 |
| PostgreSQL/PostGIS | 消防空间业务事实的预期权威来源 | 8 表共 4,055 条记录;4,048 条非空几何已标记 EPSG:4326,严格 readiness 与本地真实工具冒烟均通过;35 条无效几何按当前策略排除并告警 |
## 3. 技术栈
### 已采用
- Go module:`fire-safety-ymd`(临时 module 名)。
- 本地工具链:Go `1.26.6`。
- HTTP:Go 标准库 `net/http`。
- 测试:Go 标准库 `testing`、`httptest`。
- 配置:环境变量;支持 HTTP、SuperAgent、Chat、MCP 与 PostGIS 配置,并默认关闭 Chat 及两个外部方向。
- Chat API:标准库 HTTP/SSE;原生 `/api/chat` 使用静态联调 Bearer,可选 `completion` 兼容入口使用同一信任方向的 `xtoken`;两者共享精确 Origin、严格 JSON、总超时、有界单进程会话和同会话并发冲突。兼容入口只在严格成功后发送正文。
- SuperAgent:标准库 HTTP/SSE 客户端,分离 Session 创建和消息发送,支持严格完成判定与既有 Run 断流恢复。
- MCP:标准库 HTTP/JSON-RPC,协议基线 `2025-06-18`,同步 JSON 响应,独立 Bearer 和 7 个只读工具;地名工具只搜索现有业务记录并要求用户确认候选。
- PostgreSQL:`github.com/jackc/pgx/v5 v5.10.0` 原生连接池;连接默认只读并设置 statement timeout。
- PostGIS:`ST_Covers`、`ST_DWithin`、`ST_Distance` 和 `ST_ClosestPoint`;只在实库确认 EPSG:4326 后启用。
- 部署:多阶段 Docker 镜像与单实例 Compose;Secret 通过未提交的 `.env` 在运行时注入,应用端口只发布到宿主机 `127.0.0.1:8080`,由宿主机 Nginx 终止 TLS。
### 计划但尚未接入或确认
- PostgreSQL/PostGIS 的适用索引和生产查询计划验证。
- SuperAgent 到 `/mcp` 的真实网络、TLS、Header 与 Token 联调。
- 任意地址/山名的外部地理编码、别名词典和大数据量地名索引。
- 用户聊天的真实身份认证、动态授权、共享/持久会话、主动取消和限流策略;首版默认关闭的静态 Bearer + 内存会话 API 已实现。
- 最终用户鉴权、动态角色/区域或租户隔离、持久审计与完整可观测性方案。
- 正式前端身份接入;现有客户端仅通过受限 DashScope 风格协议适配。
## 4. 已知业务数据范围
当前资料描述 8 类森林防火空间资源:
| 资源 | 预期 PostgreSQL 表 | 预期几何形态 |
| --- | --- | --- |
| 蓄水池 | `st_2_xianyouxushuichiguan` | 点 |
| 防火通道 | `st_2_xianyoufanghuotongdao` | 线;样例为 MultiLineString,原始数据混合二维与 Z 维度 |
| 水源地 | `st_2_mpslfh_t_slfh_syd` | 点 |
| 林区工矿企业 | `st_2_linqugongkuangqiye` | 面 |
| 防火网格 | `st_2_fanghuowangge` | 面 |
| 防火瞭望哨 | `st_2_fanghuoliaowangshao` | 点 |
| 防火检查站 | `st_2_fanghuojianchazhan` | 点 |
| 墓地坟区 | `st_2_mudifenqu_mian` | 面 |
仓库中的两份 Excel 是字段与数据表映射资料,不是可查询的业务数据库。`docs/import/db-samples/*.sql` 是含敏感字段的本地参考输入,已被 Git 忽略且不得由开发 Agent 执行。用户在 2026-09-04 的现场导入中确认,防火通道原始数据同时包含二维和带 Z 维度的几何:`geometry(GEOMETRY)` 导入到第 256 条附近时报 `Geometry has Z dimension but column does not`,将该原始列改为不限定 typmod 的 `geometry` 后重导成功。2026-09-05 的初始只读 audit 覆盖 8 表共 4,055 条记录:4,048 条非空几何均标记 SRID 0,7 条为空,35 条面几何无效,仅防火网格表存在 GiST 几何索引;类型和经纬度数值范围符合预期。数据提供方随后确认 8 表源数据均为 EPSG:4326、无坐标偏移,并允许 MCP 二维计算忽略 Z,但原始 Z 仍须保留。项目使用独立 `admin` 迁移凭证在单个事务中补齐了 4,048 条几何的 SRID 4326 元数据:7 张二维表改为 `geometry(Geometry,4326)`,防火通道保持裸 `geometry` 且 2 条 Z 几何未变;迁移前后无 SRID WKB 指纹、行数、类型、有效性和维度一致,随后只读严格 readiness 通过。无效几何仍不自动修复,查询排除并明确告警。
## 5. 目标职责边界
- 用户侧应用:采集用户输入并展示结果;具体形态待确认。
- 本 Go 服务:鉴权上下文、会话转发、MCP 工具、数据查询、权限、安全和审计。
- SuperAgent:理解自然语言、决定是否调用工具、组织自然语言结果。
- MCP 工具:提供固定的森林防火领域查询,不开放任意 SQL 或跨权限访问。
- PostgreSQL/PostGIS:保存和计算可信空间事实;资源是否可用仍取决于明确状态和数据时效。
## 6. 当前开发方向与非目标
当前阶段已有可运行、可测试、文档自解释的 Go 基线、SuperAgent Open API Adapter、默认关闭的原生用户对话 API、可选 DashScope 风格兼容入口,以及空间只读 MCP/PostGIS 实现。对话入口使用独立静态联调凭证和单进程内存会话;仓库已有多阶段 Docker/Compose 基线以及精确路径、无 Secret 的 Nginx HTTPS 反向代理示例,但尚未在目标机验证。MCP 默认关闭,实库严格 readiness 和全部 7 个工具的本地真实查询已通过。下一阶段在测试服务器应用这些部署资产,并使用真实消防 Profile 联调公网对话与 MCP。
本阶段不实现:
- 面向真实用户的认证、动态权限、持久会话和已验证生产能力;当前对话入口只用于受控联调。
- PostgreSQL/PostGIS 数据导入或索引 DDL;SRID 元数据迁移是已经显式执行的一次受控运维操作,不是应用运行时行为。
- 用户登录、权限模型、审计存储和生产部署。
- 面向真实火情的自动决策或路径规划。
- 队伍实时定位、集结点管理和资源调度。
## 7. 新 Agent 阅读顺序
1. `AGENTS.md`
2. `CONTEXT.md`
3. `PROJECT_STATE.md`
4. `docs/project/README.md`
5. `docs/project/ai-nses-project-overlay.md`
6. 与任务相关的后端或安全规范