diff --git a/.qoder/repowiki/zh/content/API接口文档/API接口文档.md b/.qoder/repowiki/zh/content/API接口文档/API接口文档.md index 625fb9b..3f29707 100644 --- a/.qoder/repowiki/zh/content/API接口文档/API接口文档.md +++ b/.qoder/repowiki/zh/content/API接口文档/API接口文档.md @@ -21,6 +21,15 @@ - [backend/app/models/query_task.py](file://backend/app/models/query_task.py) +## 更新摘要 +**所做更改** +- 完善了认证接口的详细说明,包括注册、登录和用户信息查询 +- 更新了查询管理接口的完整功能说明,涵盖CRUD操作和权限控制 +- 补充了引用数据接口的统计分析和任务执行功能 +- 增强了报告导出接口的CSV格式说明 +- 完善了错误处理和状态码说明 +- 更新了架构图和数据流图以反映实际实现 + ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) @@ -60,7 +69,7 @@ A --> J["数据传输对象
backend/app/schemas/*.py"] - [backend/app/api/deps.py:13](file://backend/app/api/deps.py#L13) **章节来源** -- [backend/app/main.py:1-48](file://backend/app/main.py#L1-L48) +- [backend/app/main.py:1-57](file://backend/app/main.py#L1-L57) ## 核心组件 - 应用入口与生命周期管理:定义应用标题、版本、CORS策略,注册各模块路由,启动/关闭查询调度器。 @@ -71,7 +80,7 @@ A --> J["数据传输对象
backend/app/schemas/*.py"] - 数据模型与服务:用户、查询、引用记录、查询任务等模型及对应的服务逻辑。 **章节来源** -- [backend/app/main.py:13-47](file://backend/app/main.py#L13-L47) +- [backend/app/main.py:13-57](file://backend/app/main.py#L13-L57) - [backend/app/api/auth.py:13-42](file://backend/app/api/auth.py#L13-L42) - [backend/app/api/queries.py:15-85](file://backend/app/api/queries.py#L15-L85) - [backend/app/api/citations.py:25-77](file://backend/app/api/citations.py#L25-L77) @@ -112,11 +121,11 @@ MODELS --> CONFIG ``` **图表来源** -- [backend/app/main.py:38-42](file://backend/app/main.py#L38-L42) +- [backend/app/main.py:38-51](file://backend/app/main.py#L38-L51) - [backend/app/api/deps.py:16-42](file://backend/app/api/deps.py#L16-L42) - [backend/app/services/auth.py:37-68](file://backend/app/services/auth.py#L37-L68) -- [backend/app/services/query.py:12-129](file://backend/app/services/query.py#L12-L129) -- [backend/app/services/citation.py:24-268](file://backend/app/services/citation.py#L24-L268) +- [backend/app/services/query.py:12-123](file://backend/app/services/query.py#L12-L123) +- [backend/app/services/citation.py:24-359](file://backend/app/services/citation.py#L24-L359) ## 详细组件分析 @@ -215,7 +224,7 @@ Return --> End **章节来源** - [backend/app/api/queries.py:15-85](file://backend/app/api/queries.py#L15-L85) - [backend/app/schemas/query.py:11-94](file://backend/app/schemas/query.py#L11-L94) -- [backend/app/services/query.py:12-129](file://backend/app/services/query.py#L12-L129) +- [backend/app/services/query.py:12-123](file://backend/app/services/query.py#L12-L123) ### 引用数据接口 - 接口前缀:/api/v1/citations @@ -254,12 +263,12 @@ CitAPI-->>Client : 202 任务信息 **图表来源** - [backend/app/api/citations.py:59-77](file://backend/app/api/citations.py#L59-L77) -- [backend/app/services/citation.py:204-234](file://backend/app/services/citation.py#L204-L234) +- [backend/app/services/citation.py:204-261](file://backend/app/services/citation.py#L204-L261) **章节来源** - [backend/app/api/citations.py:25-77](file://backend/app/api/citations.py#L25-L77) - [backend/app/schemas/citation.py:7-50](file://backend/app/schemas/citation.py#L7-L50) -- [backend/app/services/citation.py:24-268](file://backend/app/services/citation.py#L24-L268) +- [backend/app/services/citation.py:24-359](file://backend/app/services/citation.py#L24-L359) ### 报告导出接口 - 接口前缀:/api/v1/reports @@ -289,11 +298,11 @@ ReportAPI-->>Client : 200 CSV文件下载 **图表来源** - [backend/app/api/reports.py:16-46](file://backend/app/api/reports.py#L16-L46) -- [backend/app/services/citation.py:237-268](file://backend/app/services/citation.py#L237-L268) +- [backend/app/services/citation.py:327-359](file://backend/app/services/citation.py#L327-L359) **章节来源** - [backend/app/api/reports.py:16-46](file://backend/app/api/reports.py#L16-L46) -- [backend/app/services/citation.py:237-268](file://backend/app/services/citation.py#L237-L268) +- [backend/app/services/citation.py:327-359](file://backend/app/services/citation.py#L327-L359) ## 依赖分析 - 中间件与认证: diff --git a/.qoder/repowiki/zh/content/任务调度系统/任务调度系统.md b/.qoder/repowiki/zh/content/任务调度系统/任务调度系统.md index b286ae8..d36b2cd 100644 --- a/.qoder/repowiki/zh/content/任务调度系统/任务调度系统.md +++ b/.qoder/repowiki/zh/content/任务调度系统/任务调度系统.md @@ -15,9 +15,18 @@ - [backend/app/database.py](file://backend/app/database.py) - [backend/app/config.py](file://backend/app/config.py) - [backend/app/main.py](file://backend/app/main.py) +- [tests/test_scheduler.py](file://tests/test_scheduler.py) - [tests/test_queries.py](file://tests/test_queries.py) +## 更新摘要 +**所做更改** +- 新增了遗留任务检查机制的详细说明,包括每分钟检查 pending 任务的兜底逻辑 +- 完善了调度器测试用例的文档,包括启动/关闭测试、查询筛选测试和频率计算测试 +- 增强了性能优化策略部分,增加了遗留任务处理和资源管理的说明 +- 更新了故障排查指南,增加了遗留任务状态异常的处理方法 +- 完善了调度器设计的详细分析,包括双调度器模式和事件循环兼容性 + ## 目录 1. [引言](#引言) 2. [项目结构](#项目结构) @@ -33,6 +42,8 @@ ## 引言 本文件面向任务调度系统的技术与非技术读者,系统性阐述基于 APscheduler 的异步任务调度架构,涵盖调度器配置、任务队列管理、并发控制机制;详述查询任务的生命周期(创建、状态跟踪、执行监控、错误恢复);文档化异步任务处理流程(分发、优先级与资源管理);给出性能优化策略、监控指标与故障处理机制;并提供配置项、扩展方法与调试技巧。 +**更新** 本次更新完善了调度器设计细节,新增了遗留任务检查机制和详细的测试用例说明。 + ## 项目结构 后端采用 FastAPI + SQLAlchemy Async 架构,调度系统位于 workers 子模块,围绕 Query 模型驱动周期性查询任务,通过 CitationEngine 统一执行平台适配器(Kimi、文心一言),并将结果持久化为 CitationRecord,同时维护 QueryTask 任务状态。 @@ -40,25 +51,25 @@ graph TB subgraph "应用入口" MAIN["app/main.py
生命周期管理"] -end +END subgraph "调度层" -SCHED["workers/scheduler.py
QueryScheduler"] -end +SCHED["workers/scheduler.py
QueryScheduler
双调度器模式"] +END subgraph "业务逻辑" CE["workers/citation_engine.py
CitationEngine"] SVC["services/query.py
查询服务"] -end +END subgraph "模型与存储" Q["models/query.py
查询模型"] QT["models/query_task.py
任务模型"] CR["models/citation_record.py
引用记录模型"] DB["database.py
异步会话"] -end +END subgraph "平台适配" BASE["workers/platforms/base.py
适配器基类"] KIMI["workers/platforms/kimi.py
Kimi适配器"] WENXIN["workers/platforms/wenxin.py
文心一言适配器"] -end +END MAIN --> SCHED SCHED --> CE CE --> KIMI @@ -72,7 +83,7 @@ SCHED --> DB CE --> DB ``` -图表来源 +**图表来源** - [backend/app/main.py:13-22](file://backend/app/main.py#L13-L22) - [backend/app/workers/scheduler.py:25-95](file://backend/app/workers/scheduler.py#L25-L95) - [backend/app/workers/citation_engine.py:148-309](file://backend/app/workers/citation_engine.py#L148-L309) @@ -85,7 +96,7 @@ CE --> DB - [backend/app/workers/platforms/kimi.py:11-206](file://backend/app/workers/platforms/kimi.py#L11-L206) - [backend/app/workers/platforms/wenxin.py:11-205](file://backend/app/workers/platforms/wenxin.py#L11-L205) -章节来源 +**章节来源** - [backend/app/main.py:13-22](file://backend/app/main.py#L13-L22) - [backend/app/workers/scheduler.py:25-95](file://backend/app/workers/scheduler.py#L25-L95) - [backend/app/workers/citation_engine.py:148-309](file://backend/app/workers/citation_engine.py#L148-L309) @@ -99,14 +110,16 @@ CE --> DB - [backend/app/workers/platforms/wenxin.py:11-205](file://backend/app/workers/platforms/wenxin.py#L11-L205) ## 核心组件 -- 调度器:基于 APscheduler 的 AsyncIOScheduler,定时扫描待执行查询并触发执行。 +- 调度器:基于 APscheduler 的 AsyncIOScheduler,采用双调度器模式,定时扫描待执行查询并触发执行,同时每分钟检查遗留的 pending 任务。 - 引擎:CitationEngine 负责跨平台查询、品牌匹配、竞争品牌检测、任务状态更新与结果落库。 - 平台适配器:KimiAdapter、WenxinAdapter 基于 Playwright 实现网页交互与响应抽取。 - 数据模型:Query、QueryTask、CitationRecord 支撑任务生命周期与结果存储。 - 服务与API:查询服务与查询 API 路由负责用户侧的查询管理与频率控制。 - 数据库:SQLAlchemy Async Engine + Session,统一事务与连接管理。 -章节来源 +**更新** 新增了遗留任务检查机制,通过双调度器模式提高系统的容错性和可靠性。 + +**章节来源** - [backend/app/workers/scheduler.py:25-95](file://backend/app/workers/scheduler.py#L25-L95) - [backend/app/workers/citation_engine.py:148-309](file://backend/app/workers/citation_engine.py#L148-L309) - [backend/app/workers/platforms/kimi.py:11-206](file://backend/app/workers/platforms/kimi.py#L11-L206) @@ -118,7 +131,7 @@ CE --> DB - [backend/app/database.py:1-29](file://backend/app/database.py#L1-L29) ## 架构总览 -调度系统以“定时扫描 + 异步执行 + 平台适配 + 结果落库”为主线,通过 Query 的状态与时间字段驱动执行节奏,QueryTask 记录每次平台执行的状态,CitationRecord 记录最终检测结果。 +调度系统以"定时扫描 + 异步执行 + 平台适配 + 结果落库"为主线,通过 Query 的状态与时间字段驱动执行节奏,QueryTask 记录每次平台执行的状态,CitationRecord 记录最终检测结果。新增的遗留任务检查机制提供了额外的容错保护。 ```mermaid sequenceDiagram @@ -127,7 +140,7 @@ participant Scheduler as "QueryScheduler" participant DB as "数据库
AsyncSession" participant Engine as "CitationEngine" participant Platform as "平台适配器
Kimi/Wenxin" -Timer->>Scheduler : "周期触发" +Timer->>Scheduler : "每小时触发" Scheduler->>DB : "查询 active 且 next_query_at<=now 的 Query" Scheduler->>Engine : "逐条执行 execute_query(query)" Engine->>DB : "获取/创建 QueryTask 并置为 running" @@ -138,10 +151,16 @@ Engine->>DB : "写入 CitationRecord" Engine->>DB : "更新 QueryTask 为 success/fail" Engine->>DB : "更新 Query 的 last_queried_at/next_query_at" Engine-->>Scheduler : "返回本次批次记录" +Note over Timer,Scheduler : 额外的遗留任务检查 +Timer->>Scheduler : "每分钟触发" +Scheduler->>DB : "查询 pending 且 scheduled_at<=1分钟前的 QueryTask" +Scheduler->>Engine : "重新执行遗留任务" +Engine->>DB : "更新 QueryTask 状态并写入结果" ``` -图表来源 +**图表来源** - [backend/app/workers/scheduler.py:30-90](file://backend/app/workers/scheduler.py#L30-L90) +- [backend/app/workers/scheduler.py:95-172](file://backend/app/workers/scheduler.py#L95-L172) - [backend/app/workers/citation_engine.py:159-234](file://backend/app/workers/citation_engine.py#L159-L234) - [backend/app/models/query.py:24-31](file://backend/app/models/query.py#L24-L31) - [backend/app/models/query_task.py:24-32](file://backend/app/models/query_task.py#L24-L32) @@ -150,30 +169,39 @@ Engine-->>Scheduler : "返回本次批次记录" ## 详细组件分析 ### 调度器:QueryScheduler -- 启动与注册:使用 AsyncIOScheduler 注册每小时触发的任务,ID 为“check_queries”,名称为“检查并执行到期的查询任务”,replace_existing=true 确保重复启动不冲突。 -- 事件循环兼容:_run_check 封装同步包装,优先获取运行中事件循环,否则使用 asyncio.run 启动新事件循环,保证在不同运行环境下均可执行。 -- 扫描与执行:check_and_execute_queries 异步查询数据库,筛选 active 且 next_query_at 已到达的 Query,逐条调用 _execute_single_query。 -- 错误处理:对单条查询异常进行日志记录并继续下一条,避免单点故障影响整体扫描。 +- 启动与注册:使用 AsyncIOScheduler 注册两个定时任务,每小时检查到期查询任务,每分钟检查遗留的 pending 任务,replace_existing=true 确保重复启动不冲突。 +- 事件循环兼容:_run_check 和 _run_pending_tasks_check 分别封装同步包装,优先获取运行中事件循环,否则使用 asyncio.run 启动新事件循环,保证在不同运行环境下均可执行。 +- 主要扫描与执行:check_and_execute_queries 异步查询数据库,筛选 active 且 next_query_at 已到达的 Query,逐条调用 _execute_single_query。 +- 遗留任务检查:check_and_execute_pending_tasks 兜底机制,处理超过1分钟仍未执行的 pending 任务,按 query_id 分组并重新执行。 +- 错误处理:对单条查询异常进行日志记录并继续下一条,避免单点故障影响整体扫描;遗留任务执行失败时记录错误信息并标记为 failed。 - 关闭流程:shutdown 调用 scheduler.shutdown(wait=False) 与 engine.close(),确保资源释放。 ```mermaid flowchart TD -Start(["启动调度器"]) --> AddJob["注册定时任务
每小时触发"] -AddJob --> StartSched["启动 AsyncIOScheduler"] -StartSched --> Loop["周期触发"] -Loop --> Scan["查询数据库
筛选到期的 Query"] +Start(["启动调度器"]) --> AddJobs["注册两个定时任务
每小时检查到期任务
每分钟检查遗留任务"] +AddJobs --> StartSched["启动 AsyncIOScheduler"] +StartSched --> HourlyLoop["每小时触发"] +HourlyLoop --> Scan["查询数据库
筛选到期的 Query"] Scan --> HasQ{"是否有待执行查询?"} -HasQ -- 否 --> Loop +HasQ -- 否 --> MinuteLoop["等待下一分钟"] HasQ -- 是 --> ExecOne["逐条执行 _execute_single_query"] ExecOne --> NextQ["继续下一条"] -NextQ --> Loop +NextQ --> HasQ +MinuteLoop --> PendingCheck["每分钟检查
遗留的 pending 任务"] +PendingCheck --> HasPending{"是否有遗留任务?"} +HasPending -- 否 --> HourlyLoop +HasPending -- 是 --> ReExec["重新执行遗留任务"] +ReExec --> UpdateStatus["更新任务状态并写入结果"] +UpdateStatus --> HasPending ``` -图表来源 +**图表来源** - [backend/app/workers/scheduler.py:30-90](file://backend/app/workers/scheduler.py#L30-L90) +- [backend/app/workers/scheduler.py:95-172](file://backend/app/workers/scheduler.py#L95-L172) -章节来源 +**章节来源** - [backend/app/workers/scheduler.py:25-95](file://backend/app/workers/scheduler.py#L25-L95) +- [backend/app/workers/scheduler.py:95-172](file://backend/app/workers/scheduler.py#L95-L172) ### 引擎:CitationEngine - 单查询执行:execute_query 接收 Query 与 AsyncSession,创建 BrandMatcher,遍历 Query.platforms,逐平台执行。 @@ -204,11 +232,11 @@ CitationEngine --> BrandMatcher : "使用" CitationEngine --> CompetitorDetector : "使用" ``` -图表来源 +**图表来源** - [backend/app/workers/citation_engine.py:148-309](file://backend/app/workers/citation_engine.py#L148-L309) - [backend/app/workers/citation_engine.py:19-120](file://backend/app/workers/citation_engine.py#L19-L120) -章节来源 +**章节来源** - [backend/app/workers/citation_engine.py:148-309](file://backend/app/workers/citation_engine.py#L148-L309) ### 平台适配器:KimiAdapter 与 WenxinAdapter @@ -233,12 +261,12 @@ AD->>AD : "_wait_for_response_stable()" AD-->>CE : "返回原始响应文本" ``` -图表来源 +**图表来源** - [backend/app/workers/platforms/kimi.py:33-125](file://backend/app/workers/platforms/kimi.py#L33-L125) - [backend/app/workers/platforms/wenxin.py:33-124](file://backend/app/workers/platforms/wenxin.py#L33-L124) - [backend/app/workers/platforms/base.py:4-18](file://backend/app/workers/platforms/base.py#L4-L18) -章节来源 +**章节来源** - [backend/app/workers/platforms/kimi.py:11-206](file://backend/app/workers/platforms/kimi.py#L11-L206) - [backend/app/workers/platforms/wenxin.py:11-205](file://backend/app/workers/platforms/wenxin.py#L11-L205) - [backend/app/workers/platforms/base.py:4-18](file://backend/app/workers/platforms/base.py#L4-L18) @@ -290,12 +318,12 @@ QUERIES ||--o{ QUERY_TASKS : "包含" QUERIES ||--o{ CITATION_RECORDS : "产生" ``` -图表来源 +**图表来源** - [backend/app/models/query.py:11-55](file://backend/app/models/query.py#L11-L55) - [backend/app/models/query_task.py:11-39](file://backend/app/models/query_task.py#L11-L39) - [backend/app/models/citation_record.py:11-42](file://backend/app/models/citation_record.py#L11-L42) -章节来源 +**章节来源** - [backend/app/models/query.py:11-55](file://backend/app/models/query.py#L11-L55) - [backend/app/models/query_task.py:11-39](file://backend/app/models/query_task.py#L11-L39) - [backend/app/models/citation_record.py:11-42](file://backend/app/models/citation_record.py#L11-L42) @@ -304,7 +332,7 @@ QUERIES ||--o{ CITATION_RECORDS : "产生" - 服务层:提供查询的增删改查、数量限制校验、频率变更时 next_query_at 重新计算。 - API 层:提供查询列表、创建、获取、更新、删除接口,配合权限与分页参数。 -章节来源 +**章节来源** - [backend/app/services/query.py:12-130](file://backend/app/services/query.py#L12-L130) - [backend/app/api/queries.py:15-86](file://backend/app/api/queries.py#L15-L86) @@ -334,7 +362,7 @@ API["api/queries.py"] --> SVC["services/query.py"] SVC --> D ``` -图表来源 +**图表来源** - [backend/app/workers/scheduler.py:25-95](file://backend/app/workers/scheduler.py#L25-L95) - [backend/app/workers/citation_engine.py:148-309](file://backend/app/workers/citation_engine.py#L148-L309) - [backend/app/workers/platforms/kimi.py:11-206](file://backend/app/workers/platforms/kimi.py#L11-L206) @@ -348,7 +376,7 @@ SVC --> D ## 性能考虑 - 调度频率与并发 - - 当前调度器每小时扫描一次,适合低至中等并发场景;如需更高吞吐,可考虑缩短周期或引入多进程/多实例。 + - 当前调度器采用双调度器模式:每小时扫描到期查询,每分钟检查遗留任务,适合低至中等并发场景;如需更高吞吐,可考虑缩短周期或引入多进程/多实例。 - 数据库访问 - 扫描查询使用 UTC 时间比较,建议在数据库层面为 next_query_at 建立高效索引,减少全表扫描。 - 异步执行 @@ -359,12 +387,18 @@ SVC --> D - 浏览器与 Playwright 生命周期严格管理,关闭时序正确,避免内存与句柄泄漏。 - 缓存与去重 - 可在 CitationEngine 层引入结果缓存(如 Redis)以降低重复查询成本,结合唯一键(关键词+平台+时间窗口)去重。 +- 遗留任务处理 + - 新增的每分钟遗留任务检查机制提供了额外的容错保护,确保即使主调度器出现问题,任务仍能在合理时间内得到执行。 + +**更新** 新增了遗留任务处理机制的性能考虑,提高了系统的整体可靠性。 ## 故障排查指南 - 调度器未启动 - 检查 lifespan 中是否调用 start(),以及是否在生产环境正确部署。 - 查询未被执行 - 核查 Query.status 是否为 active,next_query_at 是否已到达;确认数据库时区与 UTC 一致性。 +- 遗留任务异常 + - 检查 QueryTask 状态是否长期为 pending,确认每分钟遗留任务检查机制是否正常工作;查看日志中遗留任务重新执行的记录。 - 平台适配器异常 - Playwright 未安装:参考适配器错误提示运行安装命令;网络超时:调整等待稳定阈值与超时参数。 - 任务状态异常 @@ -372,14 +406,19 @@ SVC --> D - 结果缺失 - 确认 CitationRecord 写入逻辑与 QueryTask 成功分支;失败分支也会写入一条 cited=False 的记录作为占位。 -章节来源 +**更新** 新增了遗留任务相关的故障排查指导。 + +**章节来源** - [backend/app/workers/scheduler.py:42-90](file://backend/app/workers/scheduler.py#L42-L90) +- [backend/app/workers/scheduler.py:95-172](file://backend/app/workers/scheduler.py#L95-L172) - [backend/app/workers/citation_engine.py:175-234](file://backend/app/workers/citation_engine.py#L175-L234) - [backend/app/workers/platforms/kimi.py:21-48](file://backend/app/workers/platforms/kimi.py#L21-L48) - [backend/app/workers/platforms/wenxin.py:21-48](file://backend/app/workers/platforms/wenxin.py#L21-L48) ## 结论 -该调度系统以轻量、清晰的模块划分实现了“定时扫描 + 异步执行 + 平台适配 + 结果落库”的完整闭环。通过 Query/QueryTask/CitationRecord 的三层状态与数据模型,系统具备良好的可观测性与可扩展性。建议在高并发场景下引入并行化与缓存策略,并持续完善监控与告警体系。 +该调度系统以轻量、清晰的模块划分实现了"定时扫描 + 异步执行 + 平台适配 + 结果落库"的完整闭环。通过 Query/QueryTask/CitationRecord 的三层状态与数据模型,系统具备良好的可观测性与可扩展性。新增的双调度器模式和遗留任务检查机制进一步提高了系统的可靠性和容错能力。建议在高并发场景下引入并行化与缓存策略,并持续完善监控与告警体系。 + +**更新** 本次更新完善了调度器设计细节,增强了系统的容错性和可靠性。 ## 附录 @@ -388,7 +427,7 @@ SVC --> D - 日志与中间件:FastAPI CORS 配置(允许本地前端跨域) - 运行时生命周期:lifespan 在应用启动时启动调度器,在关闭时优雅退出 -章节来源 +**章节来源** - [backend/app/config.py:7-14](file://backend/app/config.py#L7-L14) - [backend/app/main.py:24-42](file://backend/app/main.py#L24-L42) - [backend/app/main.py:13-22](file://backend/app/main.py#L13-L22) @@ -401,7 +440,7 @@ SVC --> D - 结果聚合与报表 - 基于 CitationRecord 与 QueryTask 构建统计视图,输出趋势与失败率报表。 -章节来源 +**章节来源** - [backend/app/workers/platforms/base.py:4-18](file://backend/app/workers/platforms/base.py#L4-L18) - [backend/app/workers/citation_engine.py:152-157](file://backend/app/workers/citation_engine.py#L152-L157) - [backend/app/models/citation_record.py:11-42](file://backend/app/models/citation_record.py#L11-L42) @@ -411,7 +450,36 @@ SVC --> D - 启用数据库回显:在数据库引擎创建时开启 echo(当前为关闭,便于生产环境降噪) - 逐步验证:先验证调度器扫描逻辑,再验证单平台适配器,最后验证 CitationEngine 整体流程 - 单元测试:利用测试夹具模拟 Query 对象,验证 API 与服务层行为 +- 调度器测试:使用专门的测试用例验证调度器启动/关闭、查询筛选和频率计算功能 -章节来源 +**更新** 新增了调度器测试相关的调试技巧。 + +**章节来源** - [backend/app/database.py:6-10](file://backend/app/database.py#L6-L10) -- [tests/test_queries.py:10-154](file://tests/test_queries.py#L10-L154) \ No newline at end of file +- [tests/test_queries.py:10-154](file://tests/test_queries.py#L10-L154) +- [tests/test_scheduler.py:17-123](file://tests/test_scheduler.py#L17-L123) + +### 调度器测试详细说明 + +#### 启动/关闭测试 +验证调度器能够正确启动和关闭,包括: +- 调度作业的注册和命名验证 +- 引擎资源的正确关闭 +- 作业重复启动的安全性 + +#### 查询任务筛选测试 +验证调度器能够正确筛选待执行的查询任务: +- active 状态且 next_query_at 已到达的任务会被执行 +- 未来时间的任务不会被错误执行 +- paused 状态的任务不会被执行 + +#### 频率计算测试 +验证频率映射的正确性: +- daily 频率:next_query_at 增加 1 天 +- weekly 频率:next_query_at 增加 7 天 +- 默认频率:next_query_at 增加 7 天 + +**新增** 详细说明了调度器测试用例的设计和验证要点。 + +**章节来源** +- [tests/test_scheduler.py:17-123](file://tests/test_scheduler.py#L17-L123) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/前端系统架构/UI组件库.md b/.qoder/repowiki/zh/content/前端系统架构/UI组件库.md index b5effe8..6bdb72b 100644 --- a/.qoder/repowiki/zh/content/前端系统架构/UI组件库.md +++ b/.qoder/repowiki/zh/content/前端系统架构/UI组件库.md @@ -21,17 +21,25 @@ - [app/(dashboard)/dashboard/citations/page.tsx](file://frontend/app/(dashboard)/dashboard/citations/page.tsx) +## 更新摘要 +**所做更改** +- 新增了仪表板页面中UI组件的实际使用示例分析 +- 扩展了按钮、输入框、选择器、对话框、表格等组件的具体应用场景 +- 增加了组件在真实业务场景中的组合使用模式 +- 完善了组件可访问性与状态管理的最佳实践 + ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构概览](#架构概览) 5. [详细组件分析](#详细组件分析) -6. [依赖关系分析](#依赖关系分析) -7. [性能考虑](#性能考虑) -8. [故障排除指南](#故障排除指南) -9. [结论](#结论) -10. [附录](#附录) +6. [实际应用示例](#实际应用示例) +7. [依赖关系分析](#依赖关系分析) +8. [性能考虑](#性能考虑) +9. [故障排除指南](#故障排除指南) +10. [结论](#结论) +11. [附录](#附录) ## 简介 本UI组件库以Radix UI为核心,结合Tailwind CSS实现一致、可访问且可定制的基础组件。组件遵循以下设计原则: @@ -91,8 +99,8 @@ BADGE --> UTILS **图表来源** - [app/layout.tsx:1-37](file://frontend/app/layout.tsx#L1-L37) - [components/providers.tsx:1-9](file://frontend/components/providers.tsx#L1-L9) -- [app/(dashboard)/dashboard/page.tsx](file://frontend/app/(dashboard)/dashboard/page.tsx#L1-L156) -- [app/(dashboard)/dashboard/citations/page.tsx](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L1-L282) +- [app/(dashboard)/dashboard/page.tsx](file://frontend/app/(dashboard)/dashboard/page.tsx#L1-L227) +- [app/(dashboard)/dashboard/citations/page.tsx](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L1-L294) - [lib/utils.ts:1-7](file://frontend/lib/utils.ts#L1-L7) **章节来源** @@ -106,19 +114,19 @@ BADGE --> UTILS - 功能:承载点击动作,支持多种外观与尺寸 - 关键属性:variant(外观)、size(尺寸)、asChild(语义化渲染) - 可访问性:继承原生button语义,支持聚焦与键盘激活 - - 使用示例路径:[按钮使用示例](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L187-L192) + - 使用示例路径:[按钮使用示例](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L199-L204) - 输入框 Input - 功能:文本输入,支持禁用与聚焦态样式 - 关键属性:type、className等原生属性透传 - 可访问性:原生语义,配合Label使用提升可访问性 - - 使用示例路径:[输入框使用示例](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L170-L184) + - 使用示例路径:[输入框使用示例](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L182-L196) - 选择器 Select - 功能:下拉选择,支持滚动按钮与多级选项 - 关键属性:触发器、内容区、项、分隔符、滚动按钮 - 可访问性:基于Radix UI的键盘导航与焦点管理 - - 使用示例路径:[选择器使用示例](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L138-L166) + - 使用示例路径:[选择器使用示例](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L150-L162) - 对话框 Dialog - 功能:模态对话,包含覆盖层、内容区、标题与描述 @@ -135,12 +143,12 @@ BADGE --> UTILS - 卡片 Card - 功能:容器组件,支持头部、标题、描述、内容与底部 - 关键属性:通用HTML属性透传 - - 使用示例路径:[卡片使用示例](file://frontend/app/(dashboard)/dashboard/page.tsx#L106-L120) + - 使用示例路径:[卡片使用示例](file://frontend/app/(dashboard)/dashboard/page.tsx#L177-L191) - 表格 Table - 功能:数据表格,支持表头、表体、表尾、行、单元格与标题 - 关键属性:通用HTML属性透传 - - 使用示例路径:[表格使用示例](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L217-L274) + - 使用示例路径:[表格使用示例](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L229-L286) - 标签 Tabs - 功能:标签页切换,包含列表、触发器与内容区 @@ -150,12 +158,12 @@ BADGE --> UTILS - 标签 Label - 功能:表单控件标签,与输入控件建立关联 - 关键属性:基于Radix UI的peer-disabled语义 - - 使用示例路径:[标签使用示例](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L137-L150) + - 使用示例路径:[标签使用示例](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L149-L150) - 徽章 Badge - 功能:状态或分类标记 - 关键属性:variant(外观) - - 使用示例路径:[徽章使用示例](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L256-L266) + - 使用示例路径:[徽章使用示例](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L268-L278) **章节来源** - [components/ui/button.tsx:1-57](file://frontend/components/ui/button.tsx#L1-L57) @@ -210,7 +218,7 @@ UTILS --> CLX - 复杂度与性能 - O(1) 渲染开销,变体计算在编译期完成 - 使用示例 - - [按钮使用示例](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L187-L192) + - [按钮使用示例](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L199-L204) ```mermaid classDiagram @@ -274,7 +282,7 @@ C->>P : 关闭对话框 - 键盘导航:上下左右移动、Enter确认、Esc返回 - 焦点管理:打开时聚焦首个项,关闭时返回触发器 - 使用示例 - - [下拉菜单使用示例](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L138-L166) + - [下拉菜单使用示例:1-201](file://frontend/components/ui/dropdown-menu.tsx#L1-L201) ```mermaid flowchart TD @@ -305,7 +313,7 @@ Confirm --> Close - 键盘导航:Tab进入、方向键选择、Enter确认 - 屏幕阅读器:通过SelectValue与ItemText传达当前值与选项 - 使用示例 - - [选择器使用示例](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L138-L166) + - [选择器使用示例](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L150-L162) ```mermaid sequenceDiagram @@ -334,7 +342,7 @@ I->>T : 更新值并关闭 - 可访问性 - 表格语义清晰,适合屏幕阅读器解析 - 使用示例 - - [表格使用示例](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L217-L274) + - [表格使用示例](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L229-L286) ```mermaid flowchart TD @@ -377,11 +385,11 @@ L->>C : 显示对应内容 **章节来源** - [components/ui/tabs.tsx:1-56](file://frontend/components/ui/tabs.tsx#L1-L56) -### 卡片 Card +### 卡ード Card - 设计要点 - 分离头部、标题、描述、内容与底部区域,便于组合 - 使用示例 - - [卡片使用示例](file://frontend/app/(dashboard)/dashboard/page.tsx#L106-L120) + - [卡片使用示例](file://frontend/app/(dashboard)/dashboard/page.tsx#L177-L191) ```mermaid classDiagram @@ -410,7 +418,7 @@ Card --> CardFooter - 设计要点 - 基于peer-disabled语义,与受控输入联动 - 使用示例 - - [标签使用示例](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L137-L150) + - [标签使用示例](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L149-L150) ```mermaid flowchart TD @@ -430,7 +438,7 @@ Disabled --> |否| LabelEnabled["标签启用样式"] - 设计要点 - 通过变体系统提供默认/次要/破坏/描边等外观 - 使用示例 - - [徽章使用示例](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L256-L266) + - [徽章使用示例](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L268-L278) ```mermaid classDiagram @@ -445,6 +453,68 @@ class Badge { **章节来源** - [components/ui/badge.tsx:1-37](file://frontend/components/ui/badge.tsx#L1-L37) +## 实际应用示例 + +### 仪表板页面组件应用 +仪表板页面展示了组件在真实业务场景中的综合应用: + +#### 数据统计卡片组合 +- **组件组合**:Card + CardHeader + CardTitle + CardContent +- **应用场景**:展示查询次数、引用次数、引用率、平均位置等关键指标 +- **实现特点**:使用动态图标与颜色方案增强视觉表达 + +#### 图表集成应用 +- **组件组合**:Card + Chart组件 +- **应用场景**:展示引用趋势和平台对比数据 +- **实现特点**:通过条件渲染处理空数据状态 + +#### 完整的数据展示流程 +```mermaid +flowchart TD +Loading["加载状态"] --> Empty{"数据为空?"} +Empty --> |是| EmptyState["空状态展示"] +Empty --> |否| DataDisplay["数据展示"] +DataDisplay --> StatCards["统计卡片"] +DataDisplay --> Charts["图表展示"] +EmptyState --> CreateQuery["创建查询引导"] +``` + +**图表来源** +- [app/(dashboard)/dashboard/page.tsx:49-137](file://frontend/app/(dashboard)/dashboard/page.tsx#L49-L137) + +#### 引用记录页面组件应用 +引用记录页面体现了组件在复杂数据管理场景中的应用: + +##### 筛选表单组合 +- **组件组合**:Card + Label + Select + Input + Button +- **应用场景**:查询词筛选、平台筛选、日期范围筛选 +- **实现特点**:响应式网格布局,支持表单重置 + +##### 数据表格应用 +- **组件组合**:Table + TableRow + TableCell + Badge +- **应用场景**:展示引用检测结果的完整列表 +- **实现特点**:支持横向滚动,徽章用于状态标识 + +```mermaid +sequenceDiagram +participant User as "用户" +participant Form as "筛选表单" +participant API as "API服务" +participant Table as "数据表格" +User->>Form : 设置筛选条件 +Form->>API : 发送筛选请求 +API-->>Form : 返回筛选结果 +Form->>Table : 更新表格数据 +Table->>User : 显示筛选后的记录 +``` + +**图表来源** +- [app/(dashboard)/dashboard/citations/page.tsx:147-207](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L147-L207) + +**章节来源** +- [app/(dashboard)/dashboard/page.tsx:1-227](file://frontend/app/(dashboard)/dashboard/page.tsx#L1-L227) +- [app/(dashboard)/dashboard/citations/page.tsx:1-294](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L1-L294) + ## 依赖关系分析 - 组件依赖Radix UI实现可访问性与状态管理 - 类名合并依赖clsx与tailwind-merge,确保样式不冲突 @@ -512,7 +582,7 @@ BADGE --> UTILS - [lib/utils.ts:4-6](file://frontend/lib/utils.ts#L4-L6) ## 结论 -本UI组件库以Radix UI为基础,结合Tailwind CSS与变体系统,提供了高可访问性、一致性强且易于扩展的组件集合。通过清晰的组合模式与严格的样式约定,能够支撑从简单表单到复杂数据面板的各类界面需求。 +本UI组件库以Radix UI为基础,结合Tailwind CSS与变体系统,提供了高可访问性、一致性强且易于扩展的组件集合。通过清晰的组合模式与严格的样式约定,能够支撑从简单表单到复杂数据面板的各类界面需求。新增的仪表板页面使用示例进一步验证了组件在真实业务场景中的实用性与灵活性。 ## 附录 @@ -542,6 +612,6 @@ BADGE --> UTILS - 保持过渡时长与缓动曲线一致 **章节来源** -- [app/(dashboard)/dashboard/page.tsx](file://frontend/app/(dashboard)/dashboard/page.tsx#L106-L152) -- [app/(dashboard)/dashboard/citations/page.tsx](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L135-L194) +- [app/(dashboard)/dashboard/page.tsx:1-227](file://frontend/app/(dashboard)/dashboard/page.tsx#L1-L227) +- [app/(dashboard)/dashboard/citations/page.tsx:1-294](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L1-L294) - [tailwind.config.ts:10-54](file://frontend/tailwind.config.ts#L10-L54) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/前端系统架构/页面组件设计.md b/.qoder/repowiki/zh/content/前端系统架构/页面组件设计.md index b465481..011543c 100644 --- a/.qoder/repowiki/zh/content/前端系统架构/页面组件设计.md +++ b/.qoder/repowiki/zh/content/前端系统架构/页面组件设计.md @@ -17,8 +17,17 @@ - [frontend/lib/platforms.ts](file://frontend/lib/platforms.ts) - [frontend/lib/utils.ts](file://frontend/lib/utils.ts) - [frontend/components/charts/trend-chart.tsx](file://frontend/components/charts/trend-chart.tsx) +- [frontend/components/charts/platform-chart.tsx](file://frontend/components/charts/platform-chart.tsx) +## 更新摘要 +**变更内容** +- 新增完整的仪表板页面组件系统实现 +- 更新数据总览页、查询管理页、引用记录页和报告导出页的具体实现 +- 完善图表组件的详细分析和使用说明 +- 增强API客户端的接口文档和错误处理机制 +- 优化页面级数据获取策略和状态管理 + ## 目录 1. [引言](#引言) 2. [项目结构](#项目结构) @@ -34,6 +43,8 @@ ## 引言 本文件系统性梳理 GEO 平台前端页面组件的设计与实现,覆盖仪表板、查询管理、引用数据、报告导出与设置页面。内容包括页面布局与导航结构、用户体验流程、页面级数据获取策略、状态管理与错误边界处理、页面间导航逻辑与路由参数传递、页面生命周期管理、性能优化与懒加载策略、SEO 配置以及开发规范与最佳实践。 +**更新** 本次更新反映了应用的完整实现,所有页面组件均已开发完成并集成到Next.js应用架构中,包括数据总览、查询管理、引用记录、报告导出和设置页面的完整功能实现。 + ## 项目结构 前端采用 Next.js App Router 的分组路由模式,将认证相关页面置于 `(auth)` 分组,仪表板相关页面置于 `(dashboard)` 分组。根布局负责全局样式与 Provider 包装;仪表板布局负责权限校验、侧边栏与头部导航的统一渲染。 @@ -69,22 +80,29 @@ pages --> settings_page["设置
settings/page.tsx"] - UI 组件库 - 表格组件:封装响应式表格容器与表头/体/行/单元格等基础结构。 - 对话框组件:基于 Radix UI 实现模态对话框,支持触发器、内容、标题与描述。 +- 图表组件 + - 趋势图组件:基于 Recharts 实现折线图,展示过去30天引用趋势。 + - 平台对比图:基于 Recharts 实现柱状图,展示各平台引用率对比。 - 工具与常量 - 平台映射:提供平台键值到中文名称的映射与平台选项列表。 - 工具函数:类名合并工具,用于组合 Tailwind 类。 - API 客户端:统一封装鉴权头、错误处理与各模块接口(认证、查询、引用、报告)。 +**更新** 新增了图表组件的详细实现分析,包括数据结构定义、响应式容器配置和交互功能。 + **章节来源** - [frontend/components/layout/header.tsx:1-30](file://frontend/components/layout/header.tsx#L1-L30) - [frontend/components/layout/sidebar.tsx:1-54](file://frontend/components/layout/sidebar.tsx#L1-L54) - [frontend/components/ui/table.tsx:1-118](file://frontend/components/ui/table.tsx#L1-L118) - [frontend/components/ui/dialog.tsx:1-123](file://frontend/components/ui/dialog.tsx#L1-L123) +- [frontend/components/charts/trend-chart.tsx:1-60](file://frontend/components/charts/trend-chart.tsx#L1-L60) +- [frontend/components/charts/platform-chart.tsx:1-68](file://frontend/components/charts/platform-chart.tsx#L1-L68) - [frontend/lib/platforms.ts:1-18](file://frontend/lib/platforms.ts#L1-L18) - [frontend/lib/utils.ts:1-7](file://frontend/lib/utils.ts#L1-L7) -- [frontend/lib/api.ts:1-58](file://frontend/lib/api.ts#L1-L58) +- [frontend/lib/api.ts:1-79](file://frontend/lib/api.ts#L1-L79) ## 架构概览 -整体采用“布局层 + 页面层 + 组件层 + 工具层”的分层设计。页面层通过客户端会话获取令牌,调用 API 客户端进行数据拉取与写入;UI 组件层提供可复用的基础控件;工具层提供通用能力(类名合并、平台映射、API 封装)。图表组件独立封装,按需渲染。 +整体采用"布局层 + 页面层 + 组件层 + 工具层"的分层设计。页面层通过客户端会话获取令牌,调用 API 客户端进行数据拉取与写入;UI 组件层提供可复用的基础控件;工具层提供通用能力(类名合并、平台映射、API 封装);图表组件独立封装,按需渲染。 ```mermaid graph TB @@ -105,6 +123,7 @@ subgraph "组件层" table["表格组件"] dialog["对话框组件"] trend_chart["趋势图组件"] +platform_chart["平台对比图组件"] end subgraph "工具层" utils["工具函数"] @@ -120,6 +139,7 @@ dashboard_layout --> citations_page dashboard_layout --> reports_page dashboard_layout --> settings_page dashboard_page --> trend_chart +dashboard_page --> platform_chart queries_page --> table queries_page --> dialog citations_page --> table @@ -130,6 +150,7 @@ api_client --> utils table --> utils dialog --> utils trend_chart --> utils +platform_chart --> utils ``` **图示来源** @@ -137,17 +158,18 @@ trend_chart --> utils - [frontend/app/(dashboard)/layout.tsx:1-27](file://frontend/app/(dashboard)/layout.tsx#L1-L27) - [frontend/components/layout/header.tsx:1-30](file://frontend/components/layout/header.tsx#L1-L30) - [frontend/components/layout/sidebar.tsx:1-54](file://frontend/components/layout/sidebar.tsx#L1-L54) -- [frontend/app/(dashboard)/dashboard/page.tsx:1-156](file://frontend/app/(dashboard)/dashboard/page.tsx#L1-L156) -- [frontend/app/(dashboard)/dashboard/queries/page.tsx:1-461](file://frontend/app/(dashboard)/dashboard/queries/page.tsx#L1-L461) -- [frontend/app/(dashboard)/dashboard/citations/page.tsx:1-282](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L1-L282) -- [frontend/app/(dashboard)/dashboard/reports/page.tsx:1-198](file://frontend/app/(dashboard)/dashboard/reports/page.tsx#L1-L198) +- [frontend/app/(dashboard)/dashboard/page.tsx:1-227](file://frontend/app/(dashboard)/dashboard/page.tsx#L1-L227) +- [frontend/app/(dashboard)/dashboard/queries/page.tsx:1-526](file://frontend/app/(dashboard)/dashboard/queries/page.tsx#L1-L526) +- [frontend/app/(dashboard)/dashboard/citations/page.tsx:1-294](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L1-L294) +- [frontend/app/(dashboard)/dashboard/reports/page.tsx:1-200](file://frontend/app/(dashboard)/dashboard/reports/page.tsx#L1-L200) - [frontend/app/(dashboard)/dashboard/settings/page.tsx:1-172](file://frontend/app/(dashboard)/dashboard/settings/page.tsx#L1-L172) - [frontend/components/ui/table.tsx:1-118](file://frontend/components/ui/table.tsx#L1-L118) - [frontend/components/ui/dialog.tsx:1-123](file://frontend/components/ui/dialog.tsx#L1-L123) - [frontend/components/charts/trend-chart.tsx:1-60](file://frontend/components/charts/trend-chart.tsx#L1-L60) +- [frontend/components/charts/platform-chart.tsx:1-68](file://frontend/components/charts/platform-chart.tsx#L1-L68) - [frontend/lib/utils.ts:1-7](file://frontend/lib/utils.ts#L1-L7) - [frontend/lib/platforms.ts:1-18](file://frontend/lib/platforms.ts#L1-L18) -- [frontend/lib/api.ts:1-58](file://frontend/lib/api.ts#L1-L58) +- [frontend/lib/api.ts:1-79](file://frontend/lib/api.ts#L1-L79) ## 详细组件分析 @@ -185,16 +207,17 @@ end ``` **图示来源** -- [frontend/app/(dashboard)/dashboard/page.tsx:20-44](file://frontend/app/(dashboard)/dashboard/page.tsx#L20-L44) -- [frontend/lib/api.ts:46-49](file://frontend/lib/api.ts#L46-L49) +- [frontend/app/(dashboard)/dashboard/page.tsx:29-47](file://frontend/app/(dashboard)/dashboard/page.tsx#L29-L47) +- [frontend/lib/api.ts:67-70](file://frontend/lib/api.ts#L67-L70) **章节来源** -- [frontend/app/(dashboard)/dashboard/page.tsx:1-156](file://frontend/app/(dashboard)/dashboard/page.tsx#L1-L156) +- [frontend/app/(dashboard)/dashboard/page.tsx:1-227](file://frontend/app/(dashboard)/dashboard/page.tsx#L1-L227) - [frontend/components/charts/trend-chart.tsx:1-60](file://frontend/components/charts/trend-chart.tsx#L1-L60) +- [frontend/components/charts/platform-chart.tsx:1-68](file://frontend/components/charts/platform-chart.tsx#L1-L68) ### 查询管理页面 - 页面职责 - - 列表展示查询词,支持新增、编辑、删除与“立即查询”操作。 + - 列表展示查询词,支持新增、编辑、删除与"立即查询"操作。 - 提供平台多选、频率选择、品牌别名输入等配置项。 - 数据流 - 客户端加载查询词列表;新增/编辑通过 PUT/POST 写入;删除通过 DELETE。 @@ -223,11 +246,11 @@ Empty --> AddEdit ``` **图示来源** -- [frontend/app/(dashboard)/dashboard/queries/page.tsx:79-170](file://frontend/app/(dashboard)/dashboard/queries/page.tsx#L79-L170) -- [frontend/lib/api.ts:37-45](file://frontend/lib/api.ts#L37-L45) +- [frontend/app/(dashboard)/dashboard/queries/page.tsx:143-156](file://frontend/app/(dashboard)/dashboard/queries/page.tsx#L143-L156) +- [frontend/lib/api.ts:56-66](file://frontend/lib/api.ts#L56-L66) **章节来源** -- [frontend/app/(dashboard)/dashboard/queries/page.tsx:1-461](file://frontend/app/(dashboard)/dashboard/queries/page.tsx#L1-L461) +- [frontend/app/(dashboard)/dashboard/queries/page.tsx:1-526](file://frontend/app/(dashboard)/dashboard/queries/page.tsx#L1-L526) - [frontend/components/ui/dialog.tsx:1-123](file://frontend/components/ui/dialog.tsx#L1-L123) - [frontend/lib/platforms.ts:1-18](file://frontend/lib/platforms.ts#L1-L18) @@ -262,11 +285,11 @@ A-->>P : 渲染表格 ``` **图示来源** -- [frontend/app/(dashboard)/dashboard/citations/page.tsx:45-98](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L45-L98) -- [frontend/lib/api.ts:46-49](file://frontend/lib/api.ts#L46-L49) +- [frontend/app/(dashboard)/dashboard/citations/page.tsx:75-105](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L75-L105) +- [frontend/lib/api.ts:67-70](file://frontend/lib/api.ts#L67-L70) **章节来源** -- [frontend/app/(dashboard)/dashboard/citations/page.tsx:1-282](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L1-L282) +- [frontend/app/(dashboard)/dashboard/citations/page.tsx:1-294](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L1-L294) - [frontend/components/ui/table.tsx:1-118](file://frontend/components/ui/table.tsx#L1-L118) ### 报告导出页面 @@ -300,11 +323,11 @@ end ``` **图示来源** -- [frontend/app/(dashboard)/dashboard/reports/page.tsx:25-93](file://frontend/app/(dashboard)/dashboard/reports/page.tsx#L25-L93) -- [frontend/lib/api.ts:51-56](file://frontend/lib/api.ts#L51-L56) +- [frontend/app/(dashboard)/dashboard/reports/page.tsx:50-94](file://frontend/app/(dashboard)/dashboard/reports/page.tsx#L50-L94) +- [frontend/lib/api.ts:72-77](file://frontend/lib/api.ts#L72-L77) **章节来源** -- [frontend/app/(dashboard)/dashboard/reports/page.tsx:1-198](file://frontend/app/(dashboard)/dashboard/reports/page.tsx#L1-L198) +- [frontend/app/(dashboard)/dashboard/reports/page.tsx:1-200](file://frontend/app/(dashboard)/dashboard/reports/page.tsx#L1-L200) ### 设置页面 - 页面职责 @@ -344,22 +367,24 @@ utils --> dialog platforms["平台映射"] --> queries_page platforms --> citations_page trend_chart["趋势图组件"] --> dashboard_page +platform_chart["平台对比图组件"] --> dashboard_page ``` **图示来源** -- [frontend/lib/api.ts:1-58](file://frontend/lib/api.ts#L1-L58) -- [frontend/app/(dashboard)/dashboard/page.tsx:1-156](file://frontend/app/(dashboard)/dashboard/page.tsx#L1-L156) -- [frontend/app/(dashboard)/dashboard/queries/page.tsx:1-461](file://frontend/app/(dashboard)/dashboard/queries/page.tsx#L1-L461) -- [frontend/app/(dashboard)/dashboard/citations/page.tsx:1-282](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L1-L282) -- [frontend/app/(dashboard)/dashboard/reports/page.tsx:1-198](file://frontend/app/(dashboard)/dashboard/reports/page.tsx#L1-L198) +- [frontend/lib/api.ts:1-79](file://frontend/lib/api.ts#L1-L79) +- [frontend/app/(dashboard)/dashboard/page.tsx:1-227](file://frontend/app/(dashboard)/dashboard/page.tsx#L1-L227) +- [frontend/app/(dashboard)/dashboard/queries/page.tsx:1-526](file://frontend/app/(dashboard)/dashboard/queries/page.tsx#L1-L526) +- [frontend/app/(dashboard)/dashboard/citations/page.tsx:1-294](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L1-L294) +- [frontend/app/(dashboard)/dashboard/reports/page.tsx:1-200](file://frontend/app/(dashboard)/dashboard/reports/page.tsx#L1-L200) - [frontend/components/ui/table.tsx:1-118](file://frontend/components/ui/table.tsx#L1-L118) - [frontend/components/ui/dialog.tsx:1-123](file://frontend/components/ui/dialog.tsx#L1-L123) - [frontend/lib/utils.ts:1-7](file://frontend/lib/utils.ts#L1-L7) - [frontend/lib/platforms.ts:1-18](file://frontend/lib/platforms.ts#L1-L18) - [frontend/components/charts/trend-chart.tsx:1-60](file://frontend/components/charts/trend-chart.tsx#L1-L60) +- [frontend/components/charts/platform-chart.tsx:1-68](file://frontend/components/charts/platform-chart.tsx#L1-L68) **章节来源** -- [frontend/lib/api.ts:1-58](file://frontend/lib/api.ts#L1-L58) +- [frontend/lib/api.ts:1-79](file://frontend/lib/api.ts#L1-L79) - [frontend/lib/utils.ts:1-7](file://frontend/lib/utils.ts#L1-L7) - [frontend/lib/platforms.ts:1-18](file://frontend/lib/platforms.ts#L1-L18) @@ -377,8 +402,8 @@ trend_chart["趋势图组件"] --> dashboard_page **章节来源** - [frontend/app/layout.tsx:17-20](file://frontend/app/layout.tsx#L17-L20) -- [frontend/app/(dashboard)/dashboard/queries/page.tsx:96-113](file://frontend/app/(dashboard)/dashboard/queries/page.tsx#L96-L113) -- [frontend/app/(dashboard)/dashboard/citations/page.tsx:73-94](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L73-L94) +- [frontend/app/(dashboard)/dashboard/queries/page.tsx:104-121](file://frontend/app/(dashboard)/dashboard/queries/page.tsx#L104-L121) +- [frontend/app/(dashboard)/dashboard/citations/page.tsx:65-73](file://frontend/app/(dashboard)/dashboard/citations/page.tsx#L65-L73) ## 故障排除指南 - 登录态缺失 @@ -392,12 +417,12 @@ trend_chart["趋势图组件"] --> dashboard_page **章节来源** - [frontend/app/(dashboard)/layout.tsx:12-15](file://frontend/app/(dashboard)/layout.tsx#L12-L15) -- [frontend/lib/api.ts:3-21](file://frontend/lib/api.ts#L3-L21) -- [frontend/app/(dashboard)/dashboard/queries/page.tsx:133-142](file://frontend/app/(dashboard)/dashboard/queries/page.tsx#L133-L142) -- [frontend/app/(dashboard)/dashboard/reports/page.tsx:49-93](file://frontend/app/(dashboard)/dashboard/reports/page.tsx#L49-L93) +- [frontend/lib/api.ts:3-40](file://frontend/lib/api.ts#L3-L40) +- [frontend/app/(dashboard)/dashboard/queries/page.tsx:143-156](file://frontend/app/(dashboard)/dashboard/queries/page.tsx#L143-L156) +- [frontend/app/(dashboard)/dashboard/reports/page.tsx:50-94](file://frontend/app/(dashboard)/dashboard/reports/page.tsx#L50-L94) ## 结论 -本设计以清晰的分层与职责划分实现了仪表板、查询管理、引用记录、报告导出与设置页面的组件化构建。通过统一的 API 客户端与 UI 组件库,提升了可维护性与一致性;结合会话驱动的数据获取与完善的错误边界处理,保障了用户体验与稳定性。后续可在 SEO、国际化、缓存策略与状态持久化方面进一步完善。 +本设计以清晰的分层与职责划分实现了仪表板、查询管理、引用记录、报告导出与设置页面的组件化构建。通过统一的 API 客户端与 UI 组件库,提升了可维护性与一致性;结合会话驱动的数据获取与完善的错误边界处理,保障了用户体验与稳定性。所有页面组件均已实现并集成到Next.js应用架构中,包括数据总览、查询管理、引用记录、报告导出和设置页面的完整功能。后续可在 SEO、国际化、缓存策略与状态持久化方面进一步完善。 ## 附录 - 开发规范与最佳实践 diff --git a/.qoder/repowiki/zh/content/数据库设计/数据模型.md b/.qoder/repowiki/zh/content/数据库设计/数据模型.md index fbfdc67..2dd5b7b 100644 --- a/.qoder/repowiki/zh/content/数据库设计/数据模型.md +++ b/.qoder/repowiki/zh/content/数据库设计/数据模型.md @@ -1,7 +1,7 @@ # 数据模型 -**本文引用的文件** +**本文档引用的文件** - [backend/app/models/__init__.py](file://backend/app/models/__init__.py) - [backend/app/models/user.py](file://backend/app/models/user.py) - [backend/app/models/query.py](file://backend/app/models/query.py) @@ -14,9 +14,23 @@ - [backend/app/schemas/citation.py](file://backend/app/schemas/citation.py) - [backend/app/services/query.py](file://backend/app/services/query.py) - [backend/app/api/queries.py](file://backend/app/api/queries.py) +- [backend/app/services/citation.py](file://backend/app/services/citation.py) +- [backend/app/api/citations.py](file://backend/app/api/citations.py) - [backend/app/config.py](file://backend/app/config.py) +- [backend/app/api/deps.py](file://backend/app/api/deps.py) +## 更新摘要 +**所做更改** +- 完善了用户模型的字段映射和关系配置说明 +- 详细补充了查询模型的索引策略和生命周期管理 +- 新增了查询任务模型的状态机和任务调度机制 +- 完善了引用记录模型的统计分析功能说明 +- 补充了订阅模型的支付信息字段和状态管理 +- 增强了模型间关系映射和级联策略的技术细节 +- 完善了序列化、反序列化与数据验证机制 +- 新增了使用示例和最佳实践指南 + ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) @@ -49,16 +63,20 @@ DB["PostgreSQL"] end subgraph "服务层" SVCQ["Query 服务"] +SVCC["Citation 服务"] end subgraph "API 层" APIQ["Queries API"] +APIC["Citations API"] end U --> Q Q --> CR Q --> QT U --> S SVCQ --> Q +SVCC --> CR APIQ --> SVCQ +APIC --> SVCC Q --- DB CR --- DB QT --- DB @@ -66,17 +84,19 @@ S --- DB U --- DB ``` -图表来源 +**图表来源** - [backend/app/models/user.py:11-41](file://backend/app/models/user.py#L11-L41) - [backend/app/models/query.py:11-55](file://backend/app/models/query.py#L11-L55) - [backend/app/models/query_task.py:11-39](file://backend/app/models/query_task.py#L11-L39) - [backend/app/models/citation_record.py:11-42](file://backend/app/models/citation_record.py#L11-L42) - [backend/app/models/subscription.py:11-37](file://backend/app/models/subscription.py#L11-L37) - [backend/app/database.py:1-29](file://backend/app/database.py#L1-L29) -- [backend/app/services/query.py:1-130](file://backend/app/services/query.py#L1-L130) +- [backend/app/services/query.py:1-123](file://backend/app/services/query.py#L1-L123) +- [backend/app/services/citation.py:1-359](file://backend/app/services/citation.py#L1-L359) - [backend/app/api/queries.py:1-86](file://backend/app/api/queries.py#L1-L86) +- [backend/app/api/citations.py:1-78](file://backend/app/api/citations.py#L1-L78) -章节来源 +**章节来源** - [backend/app/models/__init__.py:1-14](file://backend/app/models/__init__.py#L1-L14) - [backend/app/database.py:1-29](file://backend/app/database.py#L1-L29) @@ -99,7 +119,7 @@ U --- DB - 记录用户的订阅计划、有效期、支付信息与状态。 - 关系:多对一到 User;删除时级联删除。 -章节来源 +**章节来源** - [backend/app/models/user.py:11-41](file://backend/app/models/user.py#L11-L41) - [backend/app/models/query.py:11-55](file://backend/app/models/query.py#L11-L55) - [backend/app/models/query_task.py:11-39](file://backend/app/models/query_task.py#L11-L39) @@ -175,7 +195,7 @@ QUERIES ||--o{ CITATION_RECORDS : "产生" QUERIES ||--o{ QUERY_TASKS : "拆分执行" ``` -图表来源 +**图表来源** - [backend/alembic/versions/488d0bd5ab01_initial_migration.py:21-128](file://backend/alembic/versions/488d0bd5ab01_initial_migration.py#L21-L128) - [backend/app/models/user.py:11-41](file://backend/app/models/user.py#L11-L41) - [backend/app/models/query.py:11-55](file://backend/app/models/query.py#L11-L55) @@ -199,7 +219,7 @@ QUERIES ||--o{ QUERY_TASKS : "拆分执行" - 最佳实践 - 在创建/更新用户时避免直接修改计划或配额,建议通过专门的服务接口进行校验与审计。 -章节来源 +**章节来源** - [backend/app/models/user.py:11-41](file://backend/app/models/user.py#L11-L41) - [backend/alembic/versions/488d0bd5ab01_initial_migration.py:23-37](file://backend/alembic/versions/488d0bd5ab01_initial_migration.py#L23-L37) @@ -219,7 +239,7 @@ QUERIES ||--o{ QUERY_TASKS : "拆分执行" - 最佳实践 - 更新频率时同步更新 next_query_at;在创建查询前检查用户配额。 -章节来源 +**章节来源** - [backend/app/models/query.py:11-55](file://backend/app/models/query.py#L11-L55) - [backend/alembic/versions/488d0bd5ab01_initial_migration.py:39-59](file://backend/alembic/versions/488d0bd5ab01_initial_migration.py#L39-L59) @@ -239,7 +259,7 @@ QUERIES ||--o{ QUERY_TASKS : "拆分执行" - 最佳实践 - 任务状态机:pending -> started -> completed 或 failed;失败时记录 error_message。 -章节来源 +**章节来源** - [backend/app/models/query_task.py:11-39](file://backend/app/models/query_task.py#L11-L39) - [backend/alembic/versions/488d0bd5ab01_initial_migration.py:80-94](file://backend/alembic/versions/488d0bd5ab01_initial_migration.py#L80-L94) @@ -259,7 +279,7 @@ QUERIES ||--o{ QUERY_TASKS : "拆分执行" - 最佳实践 - 统计时按平台与日期聚合,结合索引提升性能。 -章节来源 +**章节来源** - [backend/app/models/citation_record.py:11-42](file://backend/app/models/citation_record.py#L11-L42) - [backend/alembic/versions/488d0bd5ab01_initial_migration.py:61-78](file://backend/alembic/versions/488d0bd5ab01_initial_migration.py#L61-L78) @@ -277,7 +297,7 @@ QUERIES ||--o{ QUERY_TASKS : "拆分执行" - 最佳实践 - 订阅到期后应自动调整用户配额与功能权限。 -章节来源 +**章节来源** - [backend/app/models/subscription.py:11-37](file://backend/app/models/subscription.py#L11-L37) - [backend/alembic/versions/488d0bd5ab01_initial_migration.py:96-111](file://backend/alembic/versions/488d0bd5ab01_initial_migration.py#L96-L111) @@ -285,11 +305,11 @@ QUERIES ||--o{ QUERY_TASKS : "拆分执行" - 外键约束 - 所有子表均设置外键指向父表主键,并在删除时采用 CASCADE,确保数据一致性。 - 级联删除孤儿对象 - - User 的 queries、subscriptions;Query 的 citation_records、query_tasks 均配置了“all, delete-orphan”,保证删除父对象时自动清理其子对象。 + - User 的 queries、subscriptions;Query 的 citation_records、query_tasks 均配置了"all, delete-orphan",保证删除父对象时自动清理其子对象。 - 索引策略 - 查询高频字段(如 user_id、status、next_query_at、queried_at、platform)建立索引,提升查询性能。 -章节来源 +**章节来源** - [backend/app/models/user.py:35-40](file://backend/app/models/user.py#L35-L40) - [backend/app/models/query.py:43-48](file://backend/app/models/query.py#L43-L48) - [backend/app/models/query_task.py:36-38](file://backend/app/models/query_task.py#L36-L38) @@ -303,7 +323,7 @@ QUERIES ||--o{ QUERY_TASKS : "拆分执行" - API 层集成 - Queries API 将请求体绑定到 Pydantic 模型,调用服务层进行业务处理,再返回 ORM 对象或 Pydantic 响应模型。 -章节来源 +**章节来源** - [backend/app/schemas/query.py:11-94](file://backend/app/schemas/query.py#L11-L94) - [backend/app/schemas/citation.py:7-50](file://backend/app/schemas/citation.py#L7-L50) - [backend/app/api/queries.py:1-86](file://backend/app/api/queries.py#L1-L86) @@ -316,7 +336,7 @@ QUERIES ||--o{ QUERY_TASKS : "拆分执行" - 查询调度 - 服务层根据频率计算 next_query_at,便于定时任务调度。 -章节来源 +**章节来源** - [backend/app/models/user.py:25-33](file://backend/app/models/user.py#L25-L33) - [backend/app/models/query.py:32-40](file://backend/app/models/query.py#L32-L40) - [backend/app/models/query_task.py:27-32](file://backend/app/models/query_task.py#L27-L32) @@ -340,7 +360,7 @@ QUERIES ||--o{ QUERY_TASKS : "拆分执行" - DELETE /queries/{query_id} -> 204 No Content - 参考路径:[查询 API:15-86](file://backend/app/api/queries.py#L15-L86) -章节来源 +**章节来源** - [backend/app/services/query.py:45-129](file://backend/app/services/query.py#L45-L129) - [backend/app/api/queries.py:15-86](file://backend/app/api/queries.py#L15-L86) @@ -361,13 +381,13 @@ BASE --> MODELS["模型类"] MODELS --> DB["PostgreSQL"] ``` -图表来源 +**图表来源** - [backend/app/database.py:1-29](file://backend/app/database.py#L1-L29) - [backend/app/config.py](file://backend/app/config.py#L7) -章节来源 +**章节来源** - [backend/app/database.py:1-29](file://backend/app/database.py#L1-L29) -- [backend/app/config.py:1-17](file://backend/app/config.py#L1-L17) +- [backend/app/config.py:1-23](file://backend/app/config.py#L1-L23) ## 性能考量 - 索引设计 @@ -385,7 +405,7 @@ MODELS --> DB["PostgreSQL"] ## 故障排查指南 - 查询配额超限 - - 现象:创建查询时报错“PermissionError: Query limit exceeded” + - 现象:创建查询时报错"PermissionError: Query limit exceeded" - 处理:检查用户 max_queries 与当前查询数量,必要时升级计划或清理历史查询。 - 参考路径:[创建查询服务:45-81](file://backend/app/services/query.py#L45-L81) - 查询不存在 @@ -401,7 +421,7 @@ MODELS --> DB["PostgreSQL"] - 处理:检查 error_message 字段;核对平台可用性与 API 密钥配置。 - 参考路径:[查询任务模型:11-39](file://backend/app/models/query_task.py#L11-L39) -章节来源 +**章节来源** - [backend/app/services/query.py:45-129](file://backend/app/services/query.py#L45-L129) - [backend/app/api/queries.py:42-85](file://backend/app/api/queries.py#L42-L85) - [backend/app/schemas/query.py:18-33](file://backend/app/schemas/query.py#L18-L33) @@ -413,7 +433,11 @@ GEO 项目的数据模型围绕用户、查询、任务、引用记录与订阅 ## 附录 - 数据库连接配置 - DATABASE_URL:PostgreSQL 异步连接字符串 - - 参考路径:[配置](file://backend/app/config.py#L7) + - 参考路径:[配置](file://backend/app/config.py#L12) - 模型导出入口 - models/__init__.py 统一导出所有模型 - - 参考路径:[模型导出:1-14](file://backend/app/models/__init__.py#L1-L14) \ No newline at end of file + - 参考路径:[模型导出:1-14](file://backend/app/models/__init__.py#L1-L14) +- JWT 认证配置 + - JWT_SECRET:JWT 密钥 + - JWT_EXPIRE_HOURS:JWT 过期时间(小时) + - 参考路径:[认证依赖:16-43](file://backend/app/api/deps.py#L16-L43) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/测试策略/测试策略.md b/.qoder/repowiki/zh/content/测试策略/测试策略.md index 101b7a3..f338bb2 100644 --- a/.qoder/repowiki/zh/content/测试策略/测试策略.md +++ b/.qoder/repowiki/zh/content/测试策略/测试策略.md @@ -4,13 +4,16 @@ **本文引用的文件** - [tests/conftest.py](file://tests/conftest.py) - [tests/test_auth.py](file://tests/test_auth.py) +- [tests/test_business_flow.py](file://tests/test_business_flow.py) - [tests/test_citation_engine.py](file://tests/test_citation_engine.py) - [tests/test_citations.py](file://tests/test_citations.py) - [tests/test_queries.py](file://tests/test_queries.py) +- [tests/test_scheduler.py](file://tests/test_scheduler.py) - [backend/app/main.py](file://backend/app/main.py) - [backend/app/api/deps.py](file://backend/app/api/deps.py) - [backend/app/services/auth.py](file://backend/app/services/auth.py) - [backend/app/workers/citation_engine.py](file://backend/app/workers/citation_engine.py) +- [backend/app/workers/scheduler.py](file://backend/app/workers/scheduler.py) - [backend/app/api/auth.py](file://backend/app/api/auth.py) - [backend/app/api/citations.py](file://backend/app/api/citations.py) - [backend/app/api/queries.py](file://backend/app/api/queries.py) @@ -18,20 +21,29 @@ - [backend/app/config.py](file://backend/app/config.py) +## 更新摘要 +**变更内容** +- 新增业务流程测试章节,涵盖端到端业务场景测试 +- 新增调度器测试章节,包括定时任务调度和频率计算测试 +- 完善测试最佳实践,增加业务流程测试和调度器测试的最佳实践指导 +- 更新测试策略以反映新增的测试覆盖范围 + ## 目录 1. [引言](#引言) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) -6. [依赖分析](#依赖分析) -7. [性能考虑](#性能考虑) -8. [故障排查指南](#故障排查指南) -9. [结论](#结论) -10. [附录](#附录) +6. [业务流程测试策略](#业务流程测试策略) +7. [调度器测试策略](#调度器测试策略) +8. [依赖分析](#依赖分析) +9. [性能考虑](#性能考虑) +10. [故障排查指南](#故障排查指南) +11. [结论](#结论) +12. [附录](#附录) ## 引言 -本测试策略文档面向GEO项目的Pytest测试体系,覆盖单元测试与集成测试的设计与实施要点。内容包括:测试夹具与模拟对象的组织方式、测试数据管理策略、认证模块、引用引擎、查询处理等关键功能的测试用例设计思路;同时给出测试最佳实践,包括覆盖率目标、持续集成配置建议以及测试环境管理方案,并提供调试技巧与性能测试方法。 +本测试策略文档面向GEO项目的Pytest测试体系,覆盖单元测试、集成测试和业务流程测试的设计与实施要点。内容包括:测试夹具与模拟对象的组织方式、测试数据管理策略、认证模块、引用引擎、查询处理、业务流程和调度器等关键功能的测试用例设计思路;同时给出测试最佳实践,包括覆盖率目标、持续集成配置建议以及测试环境管理方案,并提供调试技巧与性能测试方法。 ## 项目结构 测试目录位于仓库根目录下的tests,采用按功能模块划分的组织方式,配合Pytest的conftest集中式夹具与模拟对象,确保测试隔离与可重复性。后端应用以FastAPI为核心,API层通过依赖注入获取当前用户与数据库会话,服务层封装业务逻辑,工作器(worker)负责异步任务与平台适配。 @@ -44,6 +56,8 @@ TA["tests/test_auth.py"] TQ["tests/test_queries.py"] TC["tests/test_citations.py"] TCE["tests/test_citation_engine.py"] +TB["tests/test_business_flow.py"] +TS["tests/test_scheduler.py"] end subgraph "后端应用" M["backend/app/main.py"] @@ -54,15 +68,19 @@ AUTH_API["backend/app/api/auth.py"] QUERIES_API["backend/app/api/queries.py"] CITATIONS_API["backend/app/api/citations.py"] CE["backend/app/workers/citation_engine.py"] +QS["backend/app/workers/scheduler.py"] end C --> TA C --> TQ C --> TC C --> TCE +C --> TB +C --> TS TA --> AUTH_API TQ --> QUERIES_API TC --> CITATIONS_API TCE --> CE +TS --> QS AUTH_API --> D QUERIES_API --> D CITATIONS_API --> D @@ -73,19 +91,20 @@ M --> QUERIES_API M --> CITATIONS_API ``` -图表来源 -- [tests/conftest.py:1-71](file://tests/conftest.py#L1-L71) +**图表来源** +- [tests/conftest.py:1-123](file://tests/conftest.py#L1-L123) - [backend/app/main.py:1-48](file://backend/app/main.py#L1-L48) - [backend/app/api/deps.py:1-43](file://backend/app/api/deps.py#L1-L43) - [backend/app/api/auth.py:1-43](file://backend/app/api/auth.py#L1-L43) - [backend/app/api/queries.py:1-86](file://backend/app/api/queries.py#L1-L86) - [backend/app/api/citations.py:1-78](file://backend/app/api/citations.py#L1-L78) - [backend/app/workers/citation_engine.py:1-309](file://backend/app/workers/citation_engine.py#L1-L309) +- [backend/app/workers/scheduler.py:1-182](file://backend/app/workers/scheduler.py#L1-L182) - [backend/app/database.py:1-29](file://backend/app/database.py#L1-L29) - [backend/app/config.py:1-17](file://backend/app/config.py#L1-L17) -章节来源 -- [tests/conftest.py:1-71](file://tests/conftest.py#L1-L71) +**章节来源** +- [tests/conftest.py:1-123](file://tests/conftest.py#L1-L123) - [backend/app/main.py:1-48](file://backend/app/main.py#L1-L48) ## 核心组件 @@ -94,14 +113,17 @@ M --> CITATIONS_API - 用户与令牌:提供模拟用户对象、JWT访问令牌及请求头,便于认证相关接口测试。 - 异步HTTP客户端:基于ASGI传输创建异步HTTP客户端,用于端到端API测试。 - 依赖覆盖:通过依赖注入覆盖当前用户解析逻辑,简化认证流程。 + - 内存数据库:使用SQLite内存数据库进行集成测试,确保测试隔离性。 - 测试数据管理 - 使用pytest fixture生成模拟模型对象(如查询、引用记录),保证测试数据一致性与可读性。 - 通过patch对服务层函数进行桩替,隔离外部依赖,提升测试确定性。 + - 直接操作数据库模型进行复杂场景测试,如权限隔离和统计计算。 - 测试运行与并发 - 使用pytest-asyncio标记异步测试,确保事件循环正确初始化与清理。 + - 支持并行执行多个测试文件,提高测试执行效率。 -章节来源 -- [tests/conftest.py:19-71](file://tests/conftest.py#L19-L71) +**章节来源** +- [tests/conftest.py:19-123](file://tests/conftest.py#L19-L123) ## 架构总览 下图展示了测试与被测系统的交互关系:测试通过异步HTTP客户端直接调用FastAPI路由,路由依赖当前用户与数据库会话,服务层完成业务逻辑,工作器负责平台查询与品牌匹配。 @@ -135,8 +157,8 @@ APP-->>AC : 序列化响应 AC-->>T : 断言结果 ``` -图表来源 -- [tests/conftest.py:65-71](file://tests/conftest.py#L65-L71) +**图表来源** +- [tests/conftest.py:117-123](file://tests/conftest.py#L117-L123) - [backend/app/main.py:38-42](file://backend/app/main.py#L38-L42) - [backend/app/api/deps.py:16-43](file://backend/app/api/deps.py#L16-L43) - [backend/app/api/auth.py:13-43](file://backend/app/api/auth.py#L13-L43) @@ -186,13 +208,13 @@ AUTH-->>AC : 200/401 AC-->>T : 断言 ``` -图表来源 +**图表来源** - [tests/test_auth.py:25-104](file://tests/test_auth.py#L25-L104) - [backend/app/api/auth.py:13-43](file://backend/app/api/auth.py#L13-L43) - [backend/app/services/auth.py:37-69](file://backend/app/services/auth.py#L37-L69) - [backend/app/api/deps.py:16-43](file://backend/app/api/deps.py#L16-L43) -章节来源 +**章节来源** - [tests/test_auth.py:1-104](file://tests/test_auth.py#L1-L104) - [backend/app/api/auth.py:1-43](file://backend/app/api/auth.py#L1-L43) - [backend/app/services/auth.py:1-69](file://backend/app/services/auth.py#L1-L69) @@ -231,13 +253,13 @@ BrandMatcher <.. CitationEngine : "使用" CompetitorDetector <.. CitationEngine : "使用" ``` -图表来源 +**图表来源** - [backend/app/workers/citation_engine.py:19-120](file://backend/app/workers/citation_engine.py#L19-L120) - [backend/app/workers/citation_engine.py:122-146](file://backend/app/workers/citation_engine.py#L122-L146) - [backend/app/workers/citation_engine.py:148-309](file://backend/app/workers/citation_engine.py#L148-L309) -章节来源 -- [tests/test_citation_engine.py:1-54](file://tests/test_citation_engine.py#L1-L54) +**章节来源** +- [tests/test_citation_engine.py:1-127](file://tests/test_citation_engine.py#L1-L127) - [backend/app/workers/citation_engine.py:1-309](file://backend/app/workers/citation_engine.py#L1-L309) ### 引用数据与报告测试策略 @@ -279,11 +301,11 @@ REP-->>AC : 200 + text/csv + attachment AC-->>T : 断言 ``` -图表来源 +**图表来源** - [tests/test_citations.py:23-93](file://tests/test_citations.py#L23-L93) - [backend/app/api/citations.py:25-78](file://backend/app/api/citations.py#L25-L78) -章节来源 +**章节来源** - [tests/test_citations.py:1-93](file://tests/test_citations.py#L1-L93) - [backend/app/api/citations.py:1-78](file://backend/app/api/citations.py#L1-L78) @@ -333,22 +355,140 @@ Q-->>AC : 204/404 AC-->>T : 断言 ``` -图表来源 +**图表来源** - [tests/test_queries.py:29-154](file://tests/test_queries.py#L29-L154) - [backend/app/api/queries.py:15-86](file://backend/app/api/queries.py#L15-L86) -章节来源 +**章节来源** - [tests/test_queries.py:1-154](file://tests/test_queries.py#L1-L154) - [backend/app/api/queries.py:1-86](file://backend/app/api/queries.py#L1-L86) +## 业务流程测试策略 + +### 测试目标 +业务流程测试旨在验证GEO应用的核心业务场景,包括用户完整注册登录流程、查询词生命周期管理、权限隔离机制、配额限制控制、统计计算准确性以及CSV导出功能。 + +### 关键测试场景 +- **完整用户流程**:从注册到登录再到查询管理的端到端流程 +- **查询生命周期**:创建、更新、暂停、恢复、删除的完整生命周期 +- **权限隔离**:确保用户间数据完全隔离 +- **配额限制**:免费用户的查询数量限制验证 +- **统计准确性**:引用统计数据的正确性验证 +- **CSV导出**:导出功能的完整性测试 + +### 测试实现策略 +- **用户管理**:通过fixture创建真实用户账户,模拟完整的用户生命周期 +- **权限测试**:使用两个独立用户账户验证权限隔离机制 +- **数据验证**:直接操作数据库模型验证统计计算的准确性 +- **端到端验证**:通过异步HTTP客户端验证完整的业务流程 + +```mermaid +sequenceDiagram +participant T as "业务流程测试" +participant AC as "异步HTTP客户端" +participant AUTH as "认证路由" +participant QUERIES as "查询路由" +participant CITATIONS as "引用路由" +participant DB as "数据库" +T->>AC : 注册用户 +AC->>AUTH : POST /api/v1/auth/register +AUTH->>DB : 创建用户记录 +AUTH-->>AC : 201 Created +T->>AC : 登录用户 +AC->>AUTH : POST /api/v1/auth/login +AUTH-->>AC : 200 OK + Token +T->>AC : 创建查询 +AC->>QUERIES : POST /api/v1/queries/ +QUERIES->>DB : 创建查询记录 +QUERIES-->>AC : 201 Created +T->>AC : 验证统计 +AC->>CITATIONS : GET /api/v1/citations/stats +CITATIONS->>DB : 查询引用记录 +CITATIONS-->>AC : 200 OK + 统计数据 +AC-->>T : 断言业务流程正确性 +``` + +**图表来源** +- [tests/test_business_flow.py:83-126](file://tests/test_business_flow.py#L83-L126) +- [tests/test_business_flow.py:131-186](file://tests/test_business_flow.py#L131-L186) +- [tests/test_business_flow.py:192-222](file://tests/test_business_flow.py#L192-L222) +- [tests/test_business_flow.py:228-296](file://tests/test_business_flow.py#L228-L296) + +### 测试用例设计要点 +- **用户隔离**:使用独立fixture创建多个用户,确保权限测试的准确性 +- **数据完整性**:通过直接操作数据库模型验证统计计算的正确性 +- **流程完整性**:覆盖业务流程的所有关键节点和异常场景 +- **边界条件**:测试配额限制、权限边界等关键边界条件 + +**章节来源** +- [tests/test_business_flow.py:1-441](file://tests/test_business_flow.py#L1-L441) + +## 调度器测试策略 + +### 测试目标 +调度器测试专注于验证查询调度器的定时任务执行能力,包括调度器的启动/关闭、查询任务筛选机制、频率计算逻辑以及遗留任务处理功能。 + +### 关键测试场景 +- **调度器生命周期**:启动、正常运行和优雅关闭 +- **查询筛选机制**:仅执行活跃且到期的查询任务 +- **频率计算**:daily和weekly频率的next_query_at计算 +- **遗留任务处理**:处理超过1分钟未执行的pending任务 +- **异常处理**:查询执行失败时的异常处理和日志记录 + +### 测试实现策略 +- **调度器控制**:通过patch替换真实的APScheduler,使用AsyncMock控制调度器行为 +- **数据库隔离**:使用独立的测试会话,确保调度器测试不影响其他测试 +- **时间控制**:通过精确的时间戳控制查询的到期状态 +- **频率验证**:使用datetime.utcnow()进行精确的时间计算验证 + +```mermaid +classDiagram +class QueryScheduler { ++start() void ++check_and_execute_queries() void ++check_and_execute_pending_tasks() void ++shutdown() void +-_run_check() void +-_run_pending_tasks_check() void +-_execute_single_query(query, db) void +} +class CitationEngine { ++execute_query(query, db) list ++execute_single_platform(keyword, platform, target_brand, brand_aliases) dict +} +class AsyncIOScheduler { ++add_job(job, trigger, id, name) void ++start() void ++shutdown() void +} +QueryScheduler --> CitationEngine : "调用" +QueryScheduler --> AsyncIOScheduler : "使用" +``` + +**图表来源** +- [backend/app/workers/scheduler.py:27-182](file://backend/app/workers/scheduler.py#L27-L182) + +### 测试用例设计要点 +- **调度器生命周期**:验证调度器启动时添加的定时任务和名称 +- **查询筛选**:通过创建不同状态和到期时间的查询验证筛选逻辑 +- **频率计算**:使用绝对误差容差验证next_query_at的计算精度 +- **遗留任务处理**:验证pending任务的兜底处理机制 +- **异常处理**:确保查询执行失败时不会中断整个调度流程 + +**章节来源** +- [tests/test_scheduler.py:1-123](file://tests/test_scheduler.py#L1-L123) +- [backend/app/workers/scheduler.py:1-182](file://backend/app/workers/scheduler.py#L1-L182) + ## 依赖分析 - 测试与被测模块耦合 - 测试通过ASGI传输直接调用路由,避免引入额外适配层 - 通过依赖覆盖与patch解耦服务层与数据库、第三方平台 + - 业务流程测试直接操作数据库模型,确保测试数据的准确性 - 外部依赖与集成点 - 数据库:通过异步引擎与会话管理,测试中可使用内存数据库或独立测试库 - JWT:通过服务层令牌生成与校验,测试中直接构造令牌头 - 平台适配器:通过patch替换,避免真实网络请求 + - 调度器:通过patch替换真实的APScheduler,使用AsyncMock控制调度行为 - 循环依赖与风险 - 当前结构清晰,无明显循环依赖;注意在测试中避免对真实调度器的依赖 @@ -357,26 +497,32 @@ graph LR T_AUTH["测试: 认证"] --> A_AUTH["路由: 认证"] T_QUERIES["测试: 查询"] --> A_QUERIES["路由: 查询"] T_CIT["测试: 引用"] --> A_CIT["路由: 引用"] +T_BUSINESS["测试: 业务流程"] --> A_QUERIES +T_BUSINESS --> A_CIT +T_SCHED["测试: 调度器"] --> QS["调度器: QueryScheduler"] A_AUTH --> S_AUTH["服务: 认证"] A_QUERIES --> S_QUERY["服务: 查询"] A_CIT --> S_CIT["服务: 引用"] S_AUTH --> DB["数据库"] S_QUERY --> DB S_CIT --> DB +QS --> CE["引擎: CitationEngine"] +QS --> DB DB --> CFG["配置"] ``` -图表来源 +**图表来源** - [tests/test_auth.py:1-104](file://tests/test_auth.py#L1-L104) -- [tests/test_queries.py:1-154](file://tests/test_queries.py#L1-L154) -- [tests/test_citations.py:1-93](file://tests/test_citations.py#L1-L93) +- [tests/test_business_flow.py:1-441](file://tests/test_business_flow.py#L1-L441) +- [tests/test_scheduler.py:1-123](file://tests/test_scheduler.py#L1-L123) - [backend/app/api/auth.py:1-43](file://backend/app/api/auth.py#L1-L43) - [backend/app/api/queries.py:1-86](file://backend/app/api/queries.py#L1-L86) - [backend/app/api/citations.py:1-78](file://backend/app/api/citations.py#L1-L78) +- [backend/app/workers/scheduler.py:1-182](file://backend/app/workers/scheduler.py#L1-L182) - [backend/app/database.py:1-29](file://backend/app/database.py#L1-L29) - [backend/app/config.py:1-17](file://backend/app/config.py#L1-L17) -章节来源 +**章节来源** - [backend/app/database.py:1-29](file://backend/app/database.py#L1-L29) - [backend/app/config.py:1-17](file://backend/app/config.py#L1-L17) @@ -384,29 +530,37 @@ DB --> CFG["配置"] - 测试并发与资源 - 使用pytest-asyncio并行执行异步测试,减少总耗时 - 通过会话级调度器模拟避免真实后台任务带来的不稳定因素 + - 业务流程测试使用内存数据库,避免磁盘I/O开销 - 数据库与缓存 - 建议使用独立测试数据库实例,避免与开发/生产数据冲突 - 对高频查询场景,可在测试中模拟数据库延迟,评估路由与服务层的超时与重试策略 + - 调度器测试使用AsyncMock,避免真实的定时任务执行 - 接口响应与序列化 - 对大列表与统计聚合接口,关注JSON序列化开销与分页参数边界 + - 业务流程测试中直接操作数据库模型,避免不必要的API调用 - 平台适配器性能 - 通过patch模拟不同响应时延与错误率,评估引擎的容错与降级策略 + - 调度器测试中使用精确的时间控制,避免真实的等待时间 ## 故障排查指南 - 常见问题定位 - 认证失败:检查令牌生成与头设置、依赖覆盖是否生效 - 404查询:确认查询ID与用户归属,检查服务层查询逻辑 - 403配额:检查服务层权限异常抛出与HTTP状态映射 + - 调度器异常:检查APScheduler的启动状态和job配置 + - 业务流程失败:检查数据库事务和fixture的使用 - 调试技巧 - 在conftest中临时打印依赖解析过程,定位get_current_user解析失败原因 - 使用pytest的-v与-s选项查看详细输出,结合patch的side_effect观察异常传播 - 对数据库相关测试,开启SQLAlchemy echo以查看生成的SQL + - 调度器测试中使用AsyncMock的assert_called_once()验证调度器行为 - 性能与稳定性 - 对于长时间运行的异步测试,确保事件循环正确关闭 - 对需要真实网络请求的场景,优先使用patch模拟,必要时增加超时与重试 + - 业务流程测试中合理使用fixture,避免重复创建昂贵的对象 ## 结论 -本测试策略以Pytest为核心,结合会话级调度器模拟、依赖覆盖与patch技术,实现了对认证、查询、引用与引擎模块的全面覆盖。通过明确的夹具与测试数据管理,确保测试的可维护性与可重复性。建议在CI中启用并行执行与覆盖率统计,并为数据库与平台适配器建立稳定的模拟层,持续提升测试效率与质量。 +本测试策略以Pytest为核心,结合会话级调度器模拟、依赖覆盖与patch技术,实现了对认证、查询、引用、引擎模块以及业务流程和调度器的全面覆盖。通过明确的夹具与测试数据管理,确保测试的可维护性与可重复性。新增的业务流程测试和调度器测试进一步完善了测试体系,涵盖了端到端业务场景和定时任务调度的关键功能。建议在CI中启用并行执行与覆盖率统计,并为数据库与平台适配器建立稳定的模拟层,持续提升测试效率与质量。 ## 附录 - 测试覆盖率要求建议 @@ -414,12 +568,18 @@ DB --> CFG["配置"] - 分支覆盖率:≥70% - 行覆盖率:≥80% - 函数/方法覆盖率:≥90% + - 业务流程覆盖率:≥95% + - 调度器覆盖率:≥90% - 持续集成配置建议 - 使用GitHub Actions或GitLab CI,包含Python版本矩阵、依赖安装、数据库准备、pytest执行与覆盖率上传 - 将测试与lint、类型检查并行,确保主干分支质量 + - 为业务流程测试和调度器测试单独配置执行时间限制 - 测试环境管理 - 使用独立测试数据库与Redis实例,避免污染 - 通过环境变量切换测试配置,确保敏感信息不泄露 + - 业务流程测试使用内存数据库,调度器测试使用AsyncMock - 性能测试方法 - 使用pytest-benchmark或locust对高频路由进行基准测试 - - 对引擎执行流程进行压力测试,评估平台适配器与数据库写入瓶颈 \ No newline at end of file + - 对引擎执行流程进行压力测试,评估平台适配器与数据库写入瓶颈 + - 调度器测试中使用时间控制和AsyncMock,避免真实的定时等待 + - 业务流程测试中评估端到端流程的响应时间和吞吐量 \ No newline at end of file diff --git a/.qoder/repowiki/zh/meta/repowiki-metadata.json b/.qoder/repowiki/zh/meta/repowiki-metadata.json index 48250d1..ee8b041 100644 --- a/.qoder/repowiki/zh/meta/repowiki-metadata.json +++ b/.qoder/repowiki/zh/meta/repowiki-metadata.json @@ -1 +1 @@ -{"knowledge_relations":[{"id":1,"source_id":"34e572eb-6fc8-4de7-8061-63783ef8be24","target_id":"2793782c-91c8-4052-b9db-39513426c736","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 34e572eb-6fc8-4de7-8061-63783ef8be24 -\u003e 2793782c-91c8-4052-b9db-39513426c736","gmt_create":"2026-04-22T19:25:18.918463+08:00","gmt_modified":"2026-04-22T19:25:18.918463+08:00"},{"id":2,"source_id":"34e572eb-6fc8-4de7-8061-63783ef8be24","target_id":"e23bd86e-b4ac-40eb-b1c1-38d929fd5419","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 34e572eb-6fc8-4de7-8061-63783ef8be24 -\u003e e23bd86e-b4ac-40eb-b1c1-38d929fd5419","gmt_create":"2026-04-22T19:25:18.919833+08:00","gmt_modified":"2026-04-22T19:25:18.919833+08:00"},{"id":3,"source_id":"34e572eb-6fc8-4de7-8061-63783ef8be24","target_id":"70b3948e-f456-42d2-b7ad-a0097ad5ee5f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 34e572eb-6fc8-4de7-8061-63783ef8be24 -\u003e 70b3948e-f456-42d2-b7ad-a0097ad5ee5f","gmt_create":"2026-04-22T19:25:18.92034+08:00","gmt_modified":"2026-04-22T19:25:18.92034+08:00"},{"id":4,"source_id":"34e572eb-6fc8-4de7-8061-63783ef8be24","target_id":"1c4316a1-f1d7-46da-bcfc-ea2fa0c56110","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 34e572eb-6fc8-4de7-8061-63783ef8be24 -\u003e 1c4316a1-f1d7-46da-bcfc-ea2fa0c56110","gmt_create":"2026-04-22T19:25:18.920778+08:00","gmt_modified":"2026-04-22T19:25:18.920778+08:00"},{"id":5,"source_id":"34e572eb-6fc8-4de7-8061-63783ef8be24","target_id":"7e679d62-c415-4d6a-a7e5-d41d00e0ed69","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 34e572eb-6fc8-4de7-8061-63783ef8be24 -\u003e 7e679d62-c415-4d6a-a7e5-d41d00e0ed69","gmt_create":"2026-04-22T19:25:18.921203+08:00","gmt_modified":"2026-04-22T19:25:18.921204+08:00"},{"id":6,"source_id":"c7eb113b-b503-4d83-be7f-9ccf3350c9d9","target_id":"f94da0b4-8a07-4de1-b0b3-d3b32a12c3c1","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: c7eb113b-b503-4d83-be7f-9ccf3350c9d9 -\u003e f94da0b4-8a07-4de1-b0b3-d3b32a12c3c1","gmt_create":"2026-04-22T19:25:18.921638+08:00","gmt_modified":"2026-04-22T19:25:18.921638+08:00"},{"id":7,"source_id":"c7eb113b-b503-4d83-be7f-9ccf3350c9d9","target_id":"df661133-efbf-43fe-97c3-f581c81f47a7","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: c7eb113b-b503-4d83-be7f-9ccf3350c9d9 -\u003e df661133-efbf-43fe-97c3-f581c81f47a7","gmt_create":"2026-04-22T19:25:18.922154+08:00","gmt_modified":"2026-04-22T19:25:18.922154+08:00"},{"id":8,"source_id":"c7eb113b-b503-4d83-be7f-9ccf3350c9d9","target_id":"11936bb5-374f-40f4-bb53-b75264fc4b9d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: c7eb113b-b503-4d83-be7f-9ccf3350c9d9 -\u003e 11936bb5-374f-40f4-bb53-b75264fc4b9d","gmt_create":"2026-04-22T19:25:18.922617+08:00","gmt_modified":"2026-04-22T19:25:18.922617+08:00"},{"id":9,"source_id":"c7eb113b-b503-4d83-be7f-9ccf3350c9d9","target_id":"23ad3419-5473-4e2c-ac87-d9715090279d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: c7eb113b-b503-4d83-be7f-9ccf3350c9d9 -\u003e 23ad3419-5473-4e2c-ac87-d9715090279d","gmt_create":"2026-04-22T19:25:18.923059+08:00","gmt_modified":"2026-04-22T19:25:18.923059+08:00"},{"id":10,"source_id":"c7eb113b-b503-4d83-be7f-9ccf3350c9d9","target_id":"19e75845-5147-4aeb-90be-16f3aa270465","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: c7eb113b-b503-4d83-be7f-9ccf3350c9d9 -\u003e 19e75845-5147-4aeb-90be-16f3aa270465","gmt_create":"2026-04-22T19:25:18.923883+08:00","gmt_modified":"2026-04-22T19:25:18.923883+08:00"},{"id":11,"source_id":"c7eb113b-b503-4d83-be7f-9ccf3350c9d9","target_id":"83fe6837-7874-4467-8114-103062f15f58","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: c7eb113b-b503-4d83-be7f-9ccf3350c9d9 -\u003e 83fe6837-7874-4467-8114-103062f15f58","gmt_create":"2026-04-22T19:25:18.924565+08:00","gmt_modified":"2026-04-22T19:25:18.924565+08:00"},{"id":12,"source_id":"3af3bb9e-4d99-4dc3-b1ed-2686db385c26","target_id":"c112a3f4-b0a1-4c4a-a325-e3ede8c90be6","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3af3bb9e-4d99-4dc3-b1ed-2686db385c26 -\u003e c112a3f4-b0a1-4c4a-a325-e3ede8c90be6","gmt_create":"2026-04-22T19:25:18.925143+08:00","gmt_modified":"2026-04-22T19:25:18.925143+08:00"},{"id":13,"source_id":"3af3bb9e-4d99-4dc3-b1ed-2686db385c26","target_id":"2b32ec11-d228-42c0-9232-103ba7e44f71","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3af3bb9e-4d99-4dc3-b1ed-2686db385c26 -\u003e 2b32ec11-d228-42c0-9232-103ba7e44f71","gmt_create":"2026-04-22T19:25:18.925589+08:00","gmt_modified":"2026-04-22T19:25:18.925589+08:00"},{"id":14,"source_id":"3af3bb9e-4d99-4dc3-b1ed-2686db385c26","target_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3af3bb9e-4d99-4dc3-b1ed-2686db385c26 -\u003e ba0390b3-c249-4e92-a3c8-6820343aeda9","gmt_create":"2026-04-22T19:25:18.926026+08:00","gmt_modified":"2026-04-22T19:25:18.926026+08:00"},{"id":15,"source_id":"3af3bb9e-4d99-4dc3-b1ed-2686db385c26","target_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3af3bb9e-4d99-4dc3-b1ed-2686db385c26 -\u003e 760610d4-dff6-4c6d-831f-7c9078db86a6","gmt_create":"2026-04-22T19:25:18.926451+08:00","gmt_modified":"2026-04-22T19:25:18.926451+08:00"},{"id":16,"source_id":"3af3bb9e-4d99-4dc3-b1ed-2686db385c26","target_id":"a40267bc-925a-4364-a01f-b96d3df60aea","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3af3bb9e-4d99-4dc3-b1ed-2686db385c26 -\u003e a40267bc-925a-4364-a01f-b96d3df60aea","gmt_create":"2026-04-22T19:25:18.927133+08:00","gmt_modified":"2026-04-22T19:25:18.927133+08:00"},{"id":17,"source_id":"3af3bb9e-4d99-4dc3-b1ed-2686db385c26","target_id":"7bd2c461-81b0-48e8-8cb3-b4b14305806d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3af3bb9e-4d99-4dc3-b1ed-2686db385c26 -\u003e 7bd2c461-81b0-48e8-8cb3-b4b14305806d","gmt_create":"2026-04-22T19:25:18.927624+08:00","gmt_modified":"2026-04-22T19:25:18.927625+08:00"},{"id":18,"source_id":"ffbb970e-56e0-40ad-bd88-1a1e55482d96","target_id":"d5c75004-b01b-416f-850a-4791c5489a32","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ffbb970e-56e0-40ad-bd88-1a1e55482d96 -\u003e d5c75004-b01b-416f-850a-4791c5489a32","gmt_create":"2026-04-22T19:25:18.928064+08:00","gmt_modified":"2026-04-22T19:25:18.928064+08:00"},{"id":19,"source_id":"ffbb970e-56e0-40ad-bd88-1a1e55482d96","target_id":"c3fa653f-8dd7-41fe-8c2e-8b60adbf70f4","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ffbb970e-56e0-40ad-bd88-1a1e55482d96 -\u003e c3fa653f-8dd7-41fe-8c2e-8b60adbf70f4","gmt_create":"2026-04-22T19:25:18.928495+08:00","gmt_modified":"2026-04-22T19:25:18.928495+08:00"},{"id":20,"source_id":"ffbb970e-56e0-40ad-bd88-1a1e55482d96","target_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ffbb970e-56e0-40ad-bd88-1a1e55482d96 -\u003e 262a3941-fdc6-46b0-b767-be40aa9d5761","gmt_create":"2026-04-22T19:25:18.928926+08:00","gmt_modified":"2026-04-22T19:25:18.928926+08:00"},{"id":21,"source_id":"ffbb970e-56e0-40ad-bd88-1a1e55482d96","target_id":"7c0201f7-9e02-4cba-9ee1-81c3477f049a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ffbb970e-56e0-40ad-bd88-1a1e55482d96 -\u003e 7c0201f7-9e02-4cba-9ee1-81c3477f049a","gmt_create":"2026-04-22T19:25:18.929347+08:00","gmt_modified":"2026-04-22T19:25:18.929347+08:00"},{"id":22,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"a1cc822d-5382-431c-8c49-cf398fb5eb3c","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: deb919cc-9541-4ed7-a581-ae2876ea67c2 -\u003e a1cc822d-5382-431c-8c49-cf398fb5eb3c","gmt_create":"2026-04-22T19:25:18.929786+08:00","gmt_modified":"2026-04-22T19:25:18.929786+08:00"},{"id":23,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"2fc79486-ec65-4533-860a-89c8877c2ea0","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: deb919cc-9541-4ed7-a581-ae2876ea67c2 -\u003e 2fc79486-ec65-4533-860a-89c8877c2ea0","gmt_create":"2026-04-22T19:25:18.930204+08:00","gmt_modified":"2026-04-22T19:25:18.930204+08:00"},{"id":24,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"d8e2cef5-37e6-44e7-8a7b-9bd365b82a72","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: deb919cc-9541-4ed7-a581-ae2876ea67c2 -\u003e d8e2cef5-37e6-44e7-8a7b-9bd365b82a72","gmt_create":"2026-04-22T19:25:18.930606+08:00","gmt_modified":"2026-04-22T19:25:18.930606+08:00"},{"id":25,"source_id":"cfc48cde-e1c3-47f6-afe2-a6d7a8f4ab69","target_id":"37003fc0-1cf5-4264-996b-40807001875f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: cfc48cde-e1c3-47f6-afe2-a6d7a8f4ab69 -\u003e 37003fc0-1cf5-4264-996b-40807001875f","gmt_create":"2026-04-22T19:25:18.931019+08:00","gmt_modified":"2026-04-22T19:25:18.931019+08:00"},{"id":26,"source_id":"cfc48cde-e1c3-47f6-afe2-a6d7a8f4ab69","target_id":"2126339b-b0f5-4152-924b-cbe028cd0c39","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: cfc48cde-e1c3-47f6-afe2-a6d7a8f4ab69 -\u003e 2126339b-b0f5-4152-924b-cbe028cd0c39","gmt_create":"2026-04-22T19:25:18.931426+08:00","gmt_modified":"2026-04-22T19:25:18.931426+08:00"},{"id":27,"source_id":"cfc48cde-e1c3-47f6-afe2-a6d7a8f4ab69","target_id":"fab60eaf-9652-4cb5-9f9e-0525caa62d63","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: cfc48cde-e1c3-47f6-afe2-a6d7a8f4ab69 -\u003e fab60eaf-9652-4cb5-9f9e-0525caa62d63","gmt_create":"2026-04-22T19:25:18.931829+08:00","gmt_modified":"2026-04-22T19:25:18.931829+08:00"},{"id":28,"source_id":"cfc48cde-e1c3-47f6-afe2-a6d7a8f4ab69","target_id":"00359e45-209d-4be3-8795-50dea52bdba1","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: cfc48cde-e1c3-47f6-afe2-a6d7a8f4ab69 -\u003e 00359e45-209d-4be3-8795-50dea52bdba1","gmt_create":"2026-04-22T19:25:18.932303+08:00","gmt_modified":"2026-04-22T19:25:18.932304+08:00"},{"id":29,"source_id":"cfc48cde-e1c3-47f6-afe2-a6d7a8f4ab69","target_id":"2632a6f9-774e-4a91-94da-a984bdb20758","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: cfc48cde-e1c3-47f6-afe2-a6d7a8f4ab69 -\u003e 2632a6f9-774e-4a91-94da-a984bdb20758","gmt_create":"2026-04-22T19:25:18.932811+08:00","gmt_modified":"2026-04-22T19:25:18.932811+08:00"},{"id":30,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"7c7564ee-7fe2-4555-8ff0-4ec1b757997a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 49915365-e38e-43b5-beac-6aa7d5a74cbb -\u003e 7c7564ee-7fe2-4555-8ff0-4ec1b757997a","gmt_create":"2026-04-22T19:25:18.933272+08:00","gmt_modified":"2026-04-22T19:25:18.933272+08:00"},{"id":31,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"74d3018f-4e23-4687-8bf4-7fb403f479f7","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 49915365-e38e-43b5-beac-6aa7d5a74cbb -\u003e 74d3018f-4e23-4687-8bf4-7fb403f479f7","gmt_create":"2026-04-22T19:25:18.933683+08:00","gmt_modified":"2026-04-22T19:25:18.933683+08:00"},{"id":32,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"737f8d6c-bd8f-4c11-b142-71a400423323","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 49915365-e38e-43b5-beac-6aa7d5a74cbb -\u003e 737f8d6c-bd8f-4c11-b142-71a400423323","gmt_create":"2026-04-22T19:25:18.934096+08:00","gmt_modified":"2026-04-22T19:25:18.934096+08:00"},{"id":33,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"ae62f4a8-8840-4c8e-9a42-3373370299ff","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 49915365-e38e-43b5-beac-6aa7d5a74cbb -\u003e ae62f4a8-8840-4c8e-9a42-3373370299ff","gmt_create":"2026-04-22T19:25:18.934506+08:00","gmt_modified":"2026-04-22T19:25:18.934506+08:00"},{"id":34,"source_id":"98909ecc-fceb-4ab7-a26f-741838eb2e50","target_id":"1ed0b482-3d6a-4bfd-af40-47a5d1f3e802","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 98909ecc-fceb-4ab7-a26f-741838eb2e50 -\u003e 1ed0b482-3d6a-4bfd-af40-47a5d1f3e802","gmt_create":"2026-04-22T19:25:18.934991+08:00","gmt_modified":"2026-04-22T19:25:18.934991+08:00"},{"id":35,"source_id":"98909ecc-fceb-4ab7-a26f-741838eb2e50","target_id":"26f80935-eac2-44ee-bcdb-d6a79c537750","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 98909ecc-fceb-4ab7-a26f-741838eb2e50 -\u003e 26f80935-eac2-44ee-bcdb-d6a79c537750","gmt_create":"2026-04-22T19:25:18.935426+08:00","gmt_modified":"2026-04-22T19:25:18.935426+08:00"},{"id":36,"source_id":"98909ecc-fceb-4ab7-a26f-741838eb2e50","target_id":"eb1288f7-5ea1-413a-8f54-4f870306d14d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 98909ecc-fceb-4ab7-a26f-741838eb2e50 -\u003e eb1288f7-5ea1-413a-8f54-4f870306d14d","gmt_create":"2026-04-22T19:25:18.935875+08:00","gmt_modified":"2026-04-22T19:25:18.935875+08:00"},{"id":37,"source_id":"98909ecc-fceb-4ab7-a26f-741838eb2e50","target_id":"aa6db9b6-71e1-4497-a0e2-f3ff25358d3a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 98909ecc-fceb-4ab7-a26f-741838eb2e50 -\u003e aa6db9b6-71e1-4497-a0e2-f3ff25358d3a","gmt_create":"2026-04-22T19:25:18.936315+08:00","gmt_modified":"2026-04-22T19:25:18.936316+08:00"},{"id":38,"source_id":"643984fc-5a57-498b-8f25-68cc318d9d82","target_id":"13c568d2-dfa7-4d1b-81c0-dfef247cbb67","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 643984fc-5a57-498b-8f25-68cc318d9d82 -\u003e 13c568d2-dfa7-4d1b-81c0-dfef247cbb67","gmt_create":"2026-04-22T19:25:18.936799+08:00","gmt_modified":"2026-04-22T19:25:18.936799+08:00"},{"id":39,"source_id":"643984fc-5a57-498b-8f25-68cc318d9d82","target_id":"222a9371-45c1-4e0d-b1da-e8ada1c501c2","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 643984fc-5a57-498b-8f25-68cc318d9d82 -\u003e 222a9371-45c1-4e0d-b1da-e8ada1c501c2","gmt_create":"2026-04-22T19:25:18.937215+08:00","gmt_modified":"2026-04-22T19:25:18.937215+08:00"},{"id":40,"source_id":"643984fc-5a57-498b-8f25-68cc318d9d82","target_id":"979be617-a83d-4db9-b73e-38581348f8c1","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 643984fc-5a57-498b-8f25-68cc318d9d82 -\u003e 979be617-a83d-4db9-b73e-38581348f8c1","gmt_create":"2026-04-22T19:25:18.937741+08:00","gmt_modified":"2026-04-22T19:25:18.937741+08:00"},{"id":41,"source_id":"643984fc-5a57-498b-8f25-68cc318d9d82","target_id":"422c46b3-e69c-4023-a878-411a48ae182f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 643984fc-5a57-498b-8f25-68cc318d9d82 -\u003e 422c46b3-e69c-4023-a878-411a48ae182f","gmt_create":"2026-04-22T19:25:18.938186+08:00","gmt_modified":"2026-04-22T19:25:18.938186+08:00"},{"id":42,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"8150ddbb-7aa9-48d0-9953-2ef55e4bcfd5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: b0c36b2b-bb03-4624-933d-c1f6a320b7ca -\u003e 8150ddbb-7aa9-48d0-9953-2ef55e4bcfd5","gmt_create":"2026-04-22T19:25:18.938603+08:00","gmt_modified":"2026-04-22T19:25:18.938603+08:00"},{"id":43,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"8c17b44f-1586-459b-a83d-c9b961cd2142","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: b0c36b2b-bb03-4624-933d-c1f6a320b7ca -\u003e 8c17b44f-1586-459b-a83d-c9b961cd2142","gmt_create":"2026-04-22T19:25:18.93902+08:00","gmt_modified":"2026-04-22T19:25:18.93902+08:00"},{"id":44,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"05e59a75-d52f-42e1-a924-f6a32f06f2fe","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: b0c36b2b-bb03-4624-933d-c1f6a320b7ca -\u003e 05e59a75-d52f-42e1-a924-f6a32f06f2fe","gmt_create":"2026-04-22T19:25:18.939451+08:00","gmt_modified":"2026-04-22T19:25:18.939452+08:00"},{"id":45,"source_id":"c5849940-e223-4222-be17-aa0a6cb36bc8","target_id":"d2c7157d-157f-4990-8f76-11f3ea5435f7","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: c5849940-e223-4222-be17-aa0a6cb36bc8 -\u003e d2c7157d-157f-4990-8f76-11f3ea5435f7","gmt_create":"2026-04-22T19:25:18.939978+08:00","gmt_modified":"2026-04-22T19:25:18.939978+08:00"},{"id":46,"source_id":"c5849940-e223-4222-be17-aa0a6cb36bc8","target_id":"e1e0bd0e-01b3-4543-9781-d9beb32b9a57","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: c5849940-e223-4222-be17-aa0a6cb36bc8 -\u003e e1e0bd0e-01b3-4543-9781-d9beb32b9a57","gmt_create":"2026-04-22T19:25:18.940415+08:00","gmt_modified":"2026-04-22T19:25:18.940415+08:00"},{"id":47,"source_id":"c5849940-e223-4222-be17-aa0a6cb36bc8","target_id":"e9a02c86-236b-49cb-bbed-9462ee123c04","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: c5849940-e223-4222-be17-aa0a6cb36bc8 -\u003e e9a02c86-236b-49cb-bbed-9462ee123c04","gmt_create":"2026-04-22T19:25:18.941227+08:00","gmt_modified":"2026-04-22T19:25:18.941227+08:00"}],"wiki_catalogs":[{"id":"1bb55e12-24c4-42cb-8f59-ddc303460d45","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"项目概述","description":"project-overview","prompt":"为GEO项目创建全面的项目概述内容。详细介绍GEO平台的核心目标、主要功能特性和技术架构。解释项目作为智能学术查询与引用管理系统的设计理念,包括多AI平台集成、定时查询任务调度、数据可视化展示等核心功能。说明前后端技术栈的选择原因和整体架构设计思路。提供项目背景、应用场景和价值主张。包含系统边界、核心组件关系图和数据流向说明。面向初学者提供概念性理解,同时为经验丰富的开发者提供技术决策的背景信息。","progress_status":"completed","dependent_files":"backend/app/main.py,backend/app/config.py,docker-compose.yml,README.md","gmt_create":"2026-04-22T18:56:47.080895+08:00","gmt_modified":"2026-04-22T18:58:50.329037+08:00","raw_data":"WikiEncrypted:0MI1/XkBoMl0lTbK6t0Cn/+8FdvqrJ62ianMLvZj02elJtBUgH0Ns0veIx1WPtM9wwkxI+/XAqHLxJLlHB8wVx/ob+gHrWfBRFOXtNWHzmTEJrNEttrYXRV2niAmjrnc6VwXmKYktKqbX8suWQzVig0VjADoZYGObEeg0k6UmhPkxkWTv0CFbAx+cDhkRVaksYUcZryJYvMvtyIQASEjZKRRtKwti+2pbfHzXGaF917ir8bLf35/8ERIvyLM91k6J7WrkQWQzCSMouoCq7SDEG2Mf9UPmNoJ04sS8RtxbiiFeHu6NAI8L7L1EfxY3DDdg47NhHU1wH7bOT2u9DuFl4zIbaVNsenyjEzRQZrcsq9OLnl8yWNKJf21GOA6ESfKQqN6mlowI6I1W8qLXaH+z7qnaPWhOyo4mje7g8hCZG4S41ZGWOkatECxYDASI4FIduNeEVW9aCmI7PB7nSnpPSwQE5aC5VqWoMBShuC18DGj8AvqVxfjw6b7bxR8HDUKjzXB/K7KmXdVGCcJNb3tgApQuSTsYxQ2jHsSoUECE/BEAaW7oLRxWD3c3uNNvgrgdfQuFT+k7Ko5zOXJ006KKVxWcThwPsColn6fIwGOPrS7ncbwW0n28B2g2hw91A5Hzpgm/Dy0+YIlPQM8anuTom0Oj0p1Y2g2Nbp2PLaPBGGPUa6bDoCNqzoUs1784Rwjp+aLG05lN7onsW7Z7C9feQ4P5Ry0h8YnKKl/dR4mKs1k+dkOeMPFUpWt/qlFcHAMSoVy+O+Xu+reQzwoCKYlSwgFgjiZzs3p+kL1LWvbxSvArAOemC7uu5lEzWdggi+MLrSVpB7hLalHKGdJv8NlK4SmNaadctIMUQvY+5PZwitnGdyyjjlS7/wScj8Uv3/EZk3ITEUlIvWPJ15U6QBNxHy2DbosENNEgp0lDni/UFPduUos6SlLo5L0WKgfv72BnFY4lZfB3LChbEu2eBhM8AALCKaUIhj7t/oEI+9I9qqfPimBNi6FyH0jllt2yllX04VJRxl32uuWOFcZnm/WuJgw/BbrZCR++fefrA1l6s02TJzhZ0Y5XWJsKulCubVCF9tUQ4UJbnnU1nI5rTahkANjI7mTWIpkPHp+GUXL8Q3UpSwYl2BshG/kyfJIyFu26CIJnX5HtHezPZNWAwBQVebhTaSURWwish62V3jO/gRkcmDJHlE8YC2bAo62/asrgniVM+qniMotIgbt1nopX3ishgnMYYmFqKU8+YXUiE9/z243TcTEzltDGAWj5YN10RF/Mx3dT+62D1cwhO1486VYAZpYZtOjHjPeP2/4TW7FbMhub9iGFZ8FNqneYJyWZBa+udx1oyHzyo3YHrDcFGJPXi9ido7nGq53tKEM64A="},{"id":"7c3e3c0b-5d1f-4d64-99be-668041c6cd9d","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"核心框架配置","description":"core-framework","prompt":"为GEO后端核心框架创建详细的配置文档。深入解释FastAPI应用实例的初始化过程,包括应用名称、版本管理和生命周期管理。详细说明CORS中间件配置、路由注册机制和健康检查端点。文档化配置管理系统的实现,包括环境变量读取、配置验证和默认值设置。解释数据库连接池配置、异步会话管理和连接超时设置。包含应用启动和关闭流程的详细说明,以及资源清理机制。提供配置最佳实践和常见问题解决方案。","parent_id":"7c2ac186-ec90-400a-ac1d-b3b7ca2f01d5","progress_status":"completed","dependent_files":"backend/app/main.py,backend/app/config.py,backend/app/database.py","gmt_create":"2026-04-22T18:57:02.316945+08:00","gmt_modified":"2026-04-22T19:03:21.69307+08:00","raw_data":"WikiEncrypted:luoNp8LvFa7zGThvIT9T4rhp6COPRJpm3tT/kftARqFq4dg1cG/8M10NcCrCelp/LC8SV6McSk0Sx9xEgJV/YmEmjfMmlukALh9v7ZKLxT8XDDYkBCrff2Ia9KfGFRdlfVmmQUGfhQARTeykGZh6O8/4GECBHUYLS0F6NXI7fSS3R+/I5c/HIjI7F17mVNpZDQZcc2HmM4zhdyIinOGyErSf3vIPcfVVobPB4D/wCUvMWxl+jpvktykHTIgH9ze7f4fTCC02xK5vRnt1RlMdAQ3d1Km7OOGjAga30OGvRdp9UtT48gdhzPQH5FEbfzn7K6TnuPzqQRf4GuS2kVTRSUFbSnmj5d5HqHmgx7D9iQYR/XxRRVbv+GeFwINvVa+UX9cnanYU19zazOGWG2rcdDk8jqu5MwAhVZsT28hykyuLfKeTf7xuM6Li86T1mZ18SROCJHe4LXYEaH94K6CHjZLCyEl10xBk02/CkW4aTW29TIgrponrmnrvV6bShQ+ZitR1TcivPsNN5t6TCaHMnlaLlOpznSGNpMyf4S51cRPxl2cwZrqJbrdFxehIoPrUyOvtRvtEsLhpo30456ihrInvbVXgJMwZIcDaKHSu0Bf7ma8y+UCWH61+VBIqW44KzA9zmKcXU9hiiwL+gjwiNcV7JDcgg43Un4qvjEzeJiBRBMGGzc8Oc05dWgRs1K6QUdS1kZTjI/JKiGS8zFYKz0mvQqLwc6/xe1/MDhMyU1QUXSqpcNNU6aFmY7te5kENN2aSPZqigqID+RwvIV8k8JETdmHaxJUzCSrNEpbpUukFuVQKz419athf4kMeQH2fKsLMZABn10WnnmY9HGGqBx+gpNOTU9AiSz1l4b0Ej8XoQcwIn1lqw49qdJ6+PRuuFBv6OcjxgJSMNSQzm4c/eyl7yv6J4vXceT7Ul+ySMAGRnSpDUehmOuw1DT4dV0n05Rcrx5gBjuztOAexxUhLwMUK/v+8qdn/0OcciISCZ/U1GhzhWFYiVKRBfNuNkuRjwmc4zg5Zc97TPRBXYs2q2e0/3cT+Dr7lqeGnXWL3X4iTjTygXMekhDQBjc0NbF6cdDOJcPAUnOg6jDkreBiEkTJ7hZg3J9ho2RYDaHuPvyMlkW4YWTpGRODtXIs4aLG0KFbNr6uOG31hOPZsgnHmoNwcPwRUO4G89Nkl2M6ZTMiNHWtsSwES+gLmCLPunm7R2zQNtdei+K3lzSg0bQgUvg==","layer_level":1},{"id":"bcaa04da-04e3-427f-ba01-847ad657e78a","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"Next.js应用配置","description":"nextjs-app-config","prompt":"创建Next.js 14应用配置的详细文档。说明App Router的页面组织结构,包括路由规则、嵌套路由和页面布局设计。文档化全局样式配置、字体系统和主题定制。解释Tailwind CSS的配置选项、自定义样式和响应式设计原则。说明TypeScript配置、类型定义和开发工具设置。包含性能优化配置、构建优化和生产环境部署设置。提供配置最佳实践和常见问题解决方案。","parent_id":"d907a8eb-795c-4060-9cdd-50d31cf39be3","progress_status":"completed","dependent_files":"frontend/app/layout.tsx,frontend/app/globals.css,frontend/next.config.mjs,frontend/tailwind.config.ts,frontend/tsconfig.json","gmt_create":"2026-04-22T18:57:04.216045+08:00","gmt_modified":"2026-04-22T19:04:47.361369+08:00","raw_data":"WikiEncrypted:MoQ9U2rERvJfHcC2U9f5yo5PrhAUeAY0OH9kgPk99cOGQSyTenUDM+krr5XcMxqj+FSA7CYnuq8hz8eS8Pvzc8yZuRRHbRPExvPpdrOEr8fRtUXkjnECv8NVvFPloo2fonxY9Q2vmL0x2O1UsV1O6L6tkraG28x1o504hsBitow5XMWkk8uSk+sDbyHo/y9/SBDWpcEOXVqeU4nwD/UU+7N90n5i5T89nz6b4M+31tkvffIuZRigZ+1+IJqlsqFgRt9PNrxL9ZUsD2D/Yvh8EJ0sCr9z7AI+D3z+JYM2kgFT/3ugS/EnEzwByGZk/e2EsOY4D+NkRBas836JX++o61ZH5GPQBXTHnVa8h5B1LAVlbA5zBuJHHY3V2XS4X1cTo9Hj76mg9Ha+jWvX2A9fv4vnscE6cVxnM+WjWnSfN8N7Vtla2YRDrNXZRAL50+PNfhUKpb48d0hKFyzf1Av1T4WBKgaYEo2znphEy99ViuG+oOFS6D5pVQ/w5yoPe5MpZCDk4aNsO/owrJkILcGc3+qHfld4Yd4HtYM6madWmmOvHIIuCy5CPGojBzKDcTTSPP6ZjuY1EC/RG3lBkYCQtQj889+80GZpaSbrqWjTmMI1DX1KLNXJkoI3dFk5Tx+w4TqiKICJ8q9KJhOX+mEVk+ECXqrc2Qz787D34zY5UlwsaA44ziBvWDZuwfPWmtelAq4KjqfWTFWYqdY6D0fUvetLh3/VEqH/o5Nh4HrlGvy/faZbU9FKOBZPkAy8c0J24rW5p2pKmRq6+2IicNTgufRROtiY87GKfbfmqpDYBEn3Dogv/Q3i5beVavuD1tJWhRsewhAZAUi1jWdiK3LyS0QI7dMFXVJw3cm2FnegeXA8CNlWnjUVSOY/OfLFqJJqYrfcj57f3nAU4a88w4h10+iFBLh0yZkX50llRxgUjV0fnjyEFUDoinC1xDA9ip9IOosTI+avZPhLTC0Yn4ZGnJi4NCD5cD88+KIdRUnVZJ5Sqf4ZcCCQamtYBT8NJ+PlByYxpqJpGtLyV9BuexYC86YnD3PJau0oXazcytuXMYh/TTaEo89ZzW4jpsqDM1G/gBUq7R+QDzLElNZfw3Ov0E0+Pvfm89W+v2iSsJ2JI2Yq7wrml7FiTN0KoP5KVEBCEzDLwebnJFqa7GBaghwADYcgoZ2VX2Xtin82a3oqlX2WNfur2DIr4YURiSmE8g8O","layer_level":1},{"id":"9e3d703f-f424-47f4-84df-b99873b93e5a","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"项目介绍","description":"project-introduction","prompt":"为GEO项目创建详细的项目介绍内容。解释GEO平台作为智能学术查询与引用管理系统的核心使命和价值主张。详细描述项目解决的实际问题,包括传统学术研究中品牌引用检测的痛点、多平台数据整合的需求等。说明项目的目标用户群体和应用场景,如研究人员、市场分析师、品牌监测团队等。介绍项目的发展历程、设计理念和创新点。提供系统的功能概览,包括智能引用检测、多AI平台集成、定时查询调度等核心能力。面向初学者解释项目的基本概念和使用价值,为后续技术文档奠定基础。","parent_id":"1bb55e12-24c4-42cb-8f59-ddc303460d45","progress_status":"completed","dependent_files":"backend/app/main.py,backend/app/config.py,README.md","gmt_create":"2026-04-22T18:57:13.329466+08:00","gmt_modified":"2026-04-22T19:05:00.376007+08:00","raw_data":"WikiEncrypted:0MI1/XkBoMl0lTbK6t0CnyIiRc/FeBluVaO5vMjpi7GJDj6RYPJBK8z3pvJGG/q2Umz028dfdXdKirGdHRY2lrn0erk9nv1ZHCzuughhzuFHwcxdCPIpZdrZtQpPh6bsxkWiwYzSScq7WGo0sBeTvyoiisiPXNkFNbSjUGQOu0M9zOwZAcknYWqtf16nUcOV3lRfAFHfNSt77Nc0IUQGl1zM4BWFjitEsa6cq/jjGIh7XC2gcTvm2eWRaWDDr5n6IcJZtD0ODJYzhH9IJVk4uIXlKksbQcuIrmEWEkZBxeh+DAIp0tmgXr52zuL9uRxapFuSlOq3BlU5N3I+Iu8Fg/rBAnNcvKEwSk/71gIbFlwaxLvik5gposBrfcD4U1+MJLRTPhgg/HJwljnpTC13NERk70aJg2/SCvFZcO+86xWuLwvNjWRxc2K8yOeJggfWG6S/Dt0dGaFl5F44u6XDbQV0GKiDfNOzo5CtzO7CrkSRJ+zErGQOEEoF6UhVmmpA6ONf2YDr/z3Z5bIP5z605qNZZWUDPVLjU5elINOMi4fsEw3OYaerNp6aoSHA1eXnOJoJIMsU0KM3eGAO9QNhHE2PlkwXulCEX5l1tkohbwthcv94cBVsn64CtaMMgjrgUkflNYnfEM1djmP2iJFEG/MjNMntZCrVRGXdjjqR4Q+lRe3ELhXuHjqeU5RS+KdYLASsYBDzti2T8foSfBxxXcpMIz/lS8+Qx3pTLW3ktH5AaEtSdclWCF2HLc1/03O/gdv070KOck/8TXbyZsJ6g3fzThY7xASttVsW1IITTaX9XE52YkNOe7KOrjJwkSbUgOU1Rv3Aa7x3VJ/ac9nDL4AgS+TlYNxfYBlGkbesL+sqDgWrL268y38MyK0DRqEQVjCxV9+7aAkxLvaUXVMYIwxqAM9Id66zRb0pJB3uwgpOAIRzOCskNEghjp17p4BK3lgehkRcM9RAGb7WqgeNfl/+ox2b25Pj+nvbWN3XghNZwNzoTW+kBZxXhOTRvIyAne7IPRpmtD1XD6ZBx/C6ucQ7kTUL/7LqFXE66g3Zey3hiaiQihueSMCFVer6F+BIMSBpV+9cmAczdqYvXRnKIjQg15zwVGz7mKE4D7caiDjkAQeMUSqziw+i/S26Ont/JBHIsLpYISQJErTAl2rGwC+7ADw+H6jg0rn+nE5s5u9fxUPMsWodcWi5oGIFRRTyGeIZYSTNveEwN8h0LGwXhUlHR6RxBAIpbiwKVUcOFOKc7mojhJEN36mXsQdRyCUjV3YdNzj2Tw5tG4exPzStsjDxSn98XK42QisGde126iI=","layer_level":1},{"id":"a06436ee-1678-4a51-bbf8-b0d0ac3456b9","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"数据库架构","description":"database-architecture","prompt":"创建GEO项目数据库架构文档。详细说明基于PostgreSQL的异步数据库连接配置,包括SQLAlchemy异步引擎设置、连接池管理和会话生命周期。文档化数据库连接字符串配置、环境变量管理和安全考虑。解释异步数据库操作的优势、性能特点和最佳实践。包含数据库连接监控、错误处理和故障恢复机制。提供生产环境配置建议和性能调优指南。","parent_id":"243a1a45-d31f-405e-a3b9-694d2fe617d5","progress_status":"completed","dependent_files":"backend/app/database.py,backend/app/config.py,backend/alembic.ini","gmt_create":"2026-04-22T18:57:14.160162+08:00","gmt_modified":"2026-04-22T19:05:13.623934+08:00","raw_data":"WikiEncrypted:veTYwq2y4io5qXerCTrkkJxdCaPVm76qYvPs0DmFrBYr++cWSoBpsZCop64XjnmZv6vHv8URIJAqohtlaw1HFotKc3mK0aD3tk5jmFWmTjGEd9iSTEcB45Yccg7p5eggZzqexWRLP1afxRQPau2t5uy1dZIlExyu+lyiNQI9/hXf1UppgfCjo4u6akBIZtYhzgcUSoYY4jCjv0naBAT/PyevZQctOpKPIBwMdeB86h71UT0hKB1hXxbyQoljBYZmATJaRjmlQzZf/Ka1gnDj1s1WVsGMpSoA7jyNRPH+Ra6hR+5N8Ba5vkjxM/HcRFq282Jnr/TnidF4MF5HpD5Piye73QZ3zAvIbu8+iOSvpQee/FTzkrUQBy0xOA5lsfFOy5OFOKtQh0mHybuNqe6H5squ2Tge+K4+RKXbDCt0wptrSV+BVQ+OkAJJEtLNRpJElsQ5bw1UU6CuzbgnnEYrMXB5TMBI5N2/J6hmlqt978t04N3zVI9JnnFKK0H2og6TVu1Hrxq/xEB8RFWTf/WNN1p4Akee5r1uOuUry6hsO2yQUTlmHq74QnJz4o4YJodWkhwAmcyzPIlMeSFg/Kr/EvsQJN4UprhudCTvNitnPaBesVkucYDYQiVAhxyNSAqCzZUYXbyuLD4r5DKxKzvHjkhRugm73yBM7wzbxB2lABMiGM9p90FASIxS0SfzIl4qrFbO/oQGRIFaYfUCnQF8h0YDi40UX4/LVmnlT/L8y/d+hU00P5j5PI0qOyoRDqsfQZFaze+qtibkMnJ//iy0Awl0wqQ47SxaB0jhTc07lPFBLSHFSoVUaKDs1DPGiwKjpWZRzAw7rbv9NFuV+irKc0l8qDNCaK6Rk0rRd0ukFuszcaE9n92URbvv0Fk8XTHLr8sFAh/xMm63r5hUAuqEYN6z/Si5Isq52UmJ1/TvnLYIUK58JHTuDsVn3MKJ2fTgUw/U3g+N61WpDIgGvaHO75crgWZbS9qQyDoSSj4wNdxWR+wtmKjwZdRK44kWRBS1QebMTLNYDBgHD5hPnmOa5W/Rx4Y0QBw6UFjCy/GOmDI=","layer_level":1},{"id":"7fea5a24-e6de-4003-bc70-9dae6d8fdb25","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"适配器架构设计","description":"adapter-architecture","prompt":"创建适配器架构设计的详细文档。详细解释BasePlatformAdapter抽象基类的设计理念和实现细节,包括平台名称、平台URL等核心属性的定义。说明抽象方法query()的设计目的和参数规范,以及close()方法的资源清理机制。文档化适配器模式在AI平台集成中的应用价值,包括如何通过统一接口实现不同平台的无缝切换。提供适配器扩展的最佳实践和代码示例,帮助开发者理解如何为新平台创建适配器。","parent_id":"7e66719b-4a8a-484d-889d-10fdc76788bb","progress_status":"completed","dependent_files":"backend/app/workers/platforms/base.py","gmt_create":"2026-04-22T18:57:14.592407+08:00","gmt_modified":"2026-04-22T19:06:14.01609+08:00","raw_data":"WikiEncrypted:mEeeU1uNqYKn4jkG2zPtuGBVTFJMKL8+aALSFPkyoEYifQL2Z+klmgmPGyzF3YlP0xw/C/hG8jzgXcVjqaWbA8lOQYPPvd4qFK8fszqAYs/fYEHXvWBVaOTbFhjNiT5k+li1MqVRx7SiaRze/N6NV4j39o5dfNAouxnCXgLyBZdG5QXj6JAfhJ1mTHsYQFDmrIU+nOtrQvRh3bruUOURVd64c13kwbBISJKHVwByRrfqWLRTsCLXPYfsgZF4rkL+Iz9x27Nl0VXvNcIIoMXj9B7hg2PPcQlmup4U8y2LhUHmKrdiKpW1t+XZ8rpO2aPKpzr47rn+3n2axWoQIDjWKlHAwi5AhxgPysB/i5EGv0pvgo/mNNIfsZlmSYgXASM6bgCzH5W4O4oJVqOi+gaLuI5+i7N8/+s+FKb63H9ZNvwClw5jXJe2Xm1YUwVGLG8KX5beKRTmBgnyDPmOW17/OXwsWMWQSQKrgpiv+2C7VQqI8X/agBVWawLJAc8VloY281S3ZH5LTa/6ajeGUVXiwpWSD/YWzo9sxLdws1ZXCInzLYy5vX7YflgBOlw+pn6Z901TBktq5jxrG3CFTbRLGxaeG1aJ06sLEFoPzLSXIIiEIuAROC6lPr6XpYAKESgWGOG0GdM3BinxdkriGn21ZZjENIJ436aZjsOiE5M20/kJAnjWIBPEJ/sv3nsi7u5iLfYFvkus4GfnKXJyto9LWiTgqrwHoEUQy4+pnVW+ce//iLlM/t0ZknimuBfzgYSWx/jPc8o9ZU5OIserDAYGaE4sDZIDQas1jOq8HGN/q4wJR7sW7Fw1jKyl4suQZE6QSfYx6molnJ1cSVKcsGrf7AHDKM5x+uGRmLWXqMMUZXXtbbCw0mwqfxAUPiRLUdVyzot8dh/NIWX6B1KABd/kKs+L+vVuCmMen1XVfP72Uy91fYOkBj/xPkA6GYrempnrB6zh6INdvGw5dEKlvNARMnZZLCA64Xw4h2TBjbkIjsBawvJtT+wEGkfkPk5z99jbaaGS65e/JDF/g5WNnKSX0B1Xo+frM1AFwnKR4dIJXZ8=","layer_level":1},{"id":"78288302-33bd-44f7-8b29-24f516c8b6bb","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"调度器设计","description":"scheduler-design","prompt":"创建调度器设计的详细文档。解释基于APScheduler的AsyncIOScheduler架构选择和配置,包括调度器初始化、触发器设置和任务注册机制。详细说明调度器的核心组件,包括QueryScheduler类的设计模式、事件循环管理和异步任务包装。文档化调度器的启动和关闭流程,包括资源清理和优雅停机机制。提供调度器配置参数、性能调优选项和扩展方法。包含实际代码示例展示调度器的使用模式和最佳实践。","parent_id":"7416db23-312f-478d-8883-2fc3c41ac2e8","progress_status":"completed","dependent_files":"backend/app/workers/scheduler.py","gmt_create":"2026-04-22T18:57:25.383156+08:00","gmt_modified":"2026-04-22T19:07:22.171607+08:00","raw_data":"WikiEncrypted:Ixm4kI/Z7v0V3JxitGlz9ZcE16c7bpwHYYT05QZRkQpqpcesze5XUXS1vkiVEZxtNobDh2UDQ262IRWHPAAsEfjffD0RXnPHjavBBNWFb55SS8wVV2Rm8qd7oVzDBvIVleBJx9ucizitwm2GR+t/zrSdfu/UzvGrffKAHLxZUN3s9E/3BLo1n+ImmJ5dx5UCkwVkXSzRKQAMfuIsH7ma+0I71aPP4I7dEiw6qsvVmEMkNxEr++lMh5Dnb5VgV5vajcBNj0ryBY+/GPzHWk1n5VS1l7zWR8cQS4bF17Gse7V/kjmebgHXeuF15QchHtqeN80YGSckXh6FvN4l+UAWPIoq0JKn25d4owSwjXjSpulylSlauIyNGCF3tRu8nKJlAin/M3iM636BZyJfj7q0PSxmh0Ftm6aHzsTPV6/t2nIaU6GykmNuYnPJBlmMN8ESL5uQVNFLG1SLfXVeME0V3yt6x17pfAw6u7Gy+ZCv5JbVDVkLi4wb4s6WMriDfmpSYZR6GN1wH0tP/N+ion1coTaOCnxsG5GG0QhSuXNsn2cTNfgu8H7kf/34F3OJ90+zqpfd+jgzlFcH6kOMEwW4fNvpgS1kbhXDLvumYYyF2HQLViSBNJMMOA1kdWN1zkg9b+nPACXFB5p5BaJwP2Knh6j6CHP+/exmzFnui0wsMSOy/5pwf/QXfaDhWZfXWMVaOZlG5zB11FP2E3auQLNixhJ3xGJ8y13Acb6oQu2SH3GcTe/GdtLF0yD4utctwTrXZGbe+gPjopDqmmw1vBORIQ3c0FlSSzFVrDiPydc/1RVFuLEm9Ju/mP8NtLWQh5vEClbIFrP2IyDH3EQuIQTBdp88+xasqDk9GItxnSgEKKSCKA/Mh6tW5FnUV7NhRtMcCQVTk1QCoRqzuxs5TIcLS4IZcjW2h8HYA9ai6ciOjWbbCoX7gOdogk0UzHdLZkIN0KNI9ynsGgKcvqJH+9+OpUYonXczqc3ZIr80LaNunN8cg2fpq04dAFKFt3JxYfc/0FXl0OogP4Y4rPnyi+QBmyQeqyaNPZgqcXxDmENgXrhVUp8O1YTalGtL4AbPfpSeWLWUYFiKpnKp8V2OgCdMSHz9aKwcwvdbaugwpBNWMGk=","layer_level":1},{"id":"b027f234-4ac5-4d6d-9b38-afc8054325f5","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"单元测试","description":"unit-testing","prompt":"创建GEO项目单元测试的详细文档。说明各个模块的单元测试实现,包括认证模块测试、引用引擎测试、查询处理测试和引用数据测试的具体用例设计。文档化测试夹具的使用方法,包括mock_user、auth_token、auth_headers等测试辅助对象的创建和配置。详细说明测试断言的编写方法和测试覆盖率要求。提供具体的测试代码示例,展示如何测试异步函数、依赖注入和错误处理。包含测试数据准备和清理的最佳实践。","parent_id":"fc6f24c3-594e-4153-854f-19250834eeb1","progress_status":"completed","dependent_files":"tests/test_auth.py,tests/test_citation_engine.py,tests/test_citations.py,tests/test_queries.py","gmt_create":"2026-04-22T18:57:25.616384+08:00","gmt_modified":"2026-04-22T19:06:55.090058+08:00","raw_data":"WikiEncrypted:oQ7VNoYBl3ApU4O5/TGa/YEO9ObmRNw6knddpSF6M+qfBokxpt9FAn5Oh9wXkjVweu6TpLk0XawcRFRcQ09Zi+YnQyN8+4Ep9fANKzHyAxzcnhkI4VZF35j3DwTbhekUFTKQ+71fms4SP6LGrVw+8IP/eqJC2TH96LJR1oxckQk//yfvKqFHsMLgziXy6zrXuQO8PIu5U/WbkKUkJHWSkLkoTtPteU+WKljSMapCS60e0RUDWZEPuFD2uupr2PJxT8AoOXx358C9XEj8tQ+OwHpsBiR7NdmO0D3GmcgVUcuU7WWxnToWu1UM1d/t4u+x7bIQvHQIDjLWR40nTrvBZJBSSiui0he3T03jLkIB7r9kxCpm9mFUx0fkmUSWp7FRfs7MfJkuoQYVU0YHf6/FF6g/PoQ8ieyqr4YaNjM3kk8GirHkmKjfdQt9YmQtuzMWnzUQ6COtN+BG3STyOvO+12YQAYi5LWe7u7oP4D7TJRReg7FeLDQ60Y8KEoKBJKM051F7pgHlorthWz42brF5tF7oa0tjB4AtWaEwXdCvH278kzwHNEW9E5zeERzX3hlHYL+mKpTbemJlfuHuRugCRy4EKFRP0RYiIUecBK82Pi4Vi9MGjB7cQxIEutHQ/3D0JNLGwEo5TCsk4W3isoF+mJDFy6/IDwgW/+5FIo7V/G18dTg9YbFRwMecdvBfJU5QZV4R993bdx+kH6qB5IoJrA0AzBOCn99YQ/xgAd3w/82Z5vR8syeNZjHYmcx8P/XrYDk4UZTwaacEHfn7tcq+tL5qJDbxdY95wjaWRo9giFE8woDfoLWstvKA1/q+YOyDsIHC/uHjNP1L0ELPZ9ssFuHcwLVrqDwlcblya4+oXlPEOH2ar22uXNRmFyd8Mf8MmEWVZklodBHSKiGUlj8eSWqtR+Cw5Am1gmeUcOxqan5YwzpyXet6g5ll12dnu6ItLby6qm+kjET3rsjaJag7UBlMXWV9xn9Vj4QDK8USPTTWkRUEAj4WH9QqECQzUtYJ6+GsIE7LGx/5tzApMdX3BThIiG8C2k5ry3z310nAMX/pTSrGFGjy8tWFf+KH95sJ6aG4CDyxSPHT/3ivhXAnKDesNYTVgSIKNmAUcj5hRjTfJeGyljB7NEs6Gxz0tf5k+GQLwvRX6PxSnMGkm+q0yx0MNDRBYJNlPCFKUR74ZAU=","layer_level":1},{"id":"940e5918-1689-4001-a284-44f2de75b8ee","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"认证接口","description":"authentication-api","prompt":"创建认证系统的完整API文档。详细记录用户注册接口(/api/v1/auth/register)的请求参数、响应格式和错误处理。说明用户登录接口(/api/v1/auth/login)的JWT令牌生成机制、认证流程和安全考虑。文档化用户信息接口(/api/v1/auth/me)的权限验证和当前用户获取功能。包含完整的请求示例、响应示例、状态码说明和常见错误处理。提供认证中间件的使用指南和最佳实践。","parent_id":"dd12cc44-0c95-45d5-a726-e7b8bcf2531b","progress_status":"completed","dependent_files":"backend/app/api/auth.py,backend/app/schemas/auth.py,backend/app/services/auth.py","gmt_create":"2026-04-22T18:57:37.836287+08:00","gmt_modified":"2026-04-22T19:07:12.356456+08:00","raw_data":"WikiEncrypted:uxAckj1IXK2TQH//kEdeBPmScopsydAsQUjZb8Fs6jI7ezX3WnM5wMv74LMiw55tL2+YKxETbMgwkBQYqIg1VTja5IjBYqljlAzD5l6SrkKU835vZQoOKlYgIFEEXj5PMURu9+2Om7SDVgjbSQ05vLa2aVIBV6PiVswRGc5EGTGtYnV+DJs4BxHzYpH0Ac7KkyHUCGgH6w5QDaOxWt6c5gftFmsRwr8WVKANmqlNU9uhDjmWzjTtSqZ39EVbLd++OjVbpLbTtijQ6gOF0KBBS4B0N5k+Xm2/gDv+HNK9kZ0BphZE1Si3NfV0+cu27HLJ2XV9w357rte4pplU0wYG5oC6cuO7eBFxQdCR6e+ejXIvKGahQOce8d/jWexjfdWnUzvQ18PU4+bUZmiP+YD1dJVBFgxggbCIHG8VFTQBqMaYwc3NLWogjXnczII+Z3sLLneLkVAQEdQ381GeRKdaD4PrtAWp1Ss2QpGHWUKDdaNSLcfm5NXEe6GeECxXH96p6BvyegD3twPfZmY9WKG8YOhXqbpzae/+DXnUTfldYKnMfbonSav0nUBYt8JA0L3oceaNs03211fvlSgE8L9vtUDtNF5lHkhOLMLbu000pe/VWc8WVQRbCKd8KPd4TUxMkB61vQNIcvlRKLMJLNSnE1VftRTpdEpWKhm5qkLfOfikgsp2qp1iSw5Idpu/TLQPIGN/sYpTJ1eACeXt/A3qrlITHFV8by4utTXDT1gRQQ7j7n51fQHHEIbpU+6CRhSBBQfa5IlWAqkarenBmr5RY74jeX7tlhDhvFojQGHYyMaDsZO8G/H93/20YG/li4iihHLIYmsN+2YRP/KWCNaopBGp7tRyZi//RKVXdHGteWxP7vse7URwPhfmHDUB6dMExCT5PwgsYoDwD32k19Eauv4c6OogAMMUN3I9rhSo3V0cde7/xSOhJ34SUY3w9VpPAu1I4zTqhY649YmBnNEjtGLZGTnEJWSdneSPsudvl1HJKg6faq1dMy0dVkMqbHaqMCooFDhiYVS1AM1cG07y9rQisvQP8Ic3NTPAA7BhH0nrPnLc615Jg+XEAjs3brkNXEVZlxNvX5ZqMCoMqsiZrA==","layer_level":1},{"id":"6406f42a-e10b-4a2b-84a5-0a21c1c759ea","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"代码规范","description":"code-standards","prompt":"创建GEO项目的代码规范文档。详细说明Python代码风格指南,包括PEP8标准、命名约定、导入顺序和注释规范。文档化TypeScript/JavaScript代码规范,包括类型定义、接口设计、模块组织和错误处理模式。说明前后端代码风格差异和一致性要求。提供具体的代码示例展示正确和错误的编码方式。包含自动化代码检查工具的配置和使用方法。","parent_id":"2148d7d6-25c4-497f-8894-c4eb7a0d2bd7","progress_status":"completed","dependent_files":"backend/requirements.txt,frontend/tsconfig.json,frontend/.eslintrc.json,backend/app/__init__.py","gmt_create":"2026-04-22T18:57:39.373374+08:00","gmt_modified":"2026-04-22T19:07:51.274139+08:00","raw_data":"WikiEncrypted:Gw00+yNdsAXvNpUHE0sZ2+QbHW33I6XBnIRt1QjI/FW/5OIgpgiMvU/f+bhXrxoZK5Mgo6YrGuAKhtZ2BPutU1EdQeDFUnQQxxqSupe1WUkFgEECvCkbZOAHimRWBeUutq2qKCfVhu1+US1y8n87OZXUUvVSAksZOa8lbb2AHyiKTMdzzPThS0D+8uOalkBg1mvJCS9fqVoZzY5BYYpuH5eZJBglHbA4uMbdFVTSKVFfHaJ8nlm6uYjaY0sJCSg+dhEAIiMfOTXP5Bh59kxWfLSdZU6b8oPvLV0btsiS22/oEJZI4rWjJ0YTxfQ4jRv348P+GQ6oi1pvwveiJyOxLq8QcVKSiDxO55Ovd76PhOgpOp2WJcUsKoKBoxs817utm+Ld0htpPBS3V90Rw+suMSPCU0mCa80FTrBNn6PnXemH7lH1ozQIu3Y/AGNYBN93acBxtiZ09sGFh2sO9mbbCU0iRuNe9nwWa4MsA5rJMLGdRbyv6jk03+sAvuKwZHXyTWxqeXvMatOUKXzTNfmhXsE+Bexe1vaukG22SWhsXu7FhIaH4Rt7CdpMW0jjbZOf4CwKY36ucVBRwft6ymuED4ihzikPz7pJ5IEuxLGtCyt5QDqT7kbv5ITx4NM/Q2IMMTRZf9bAZyN64PV2TJVCNK11yU+cE7y8HFBNFSzPfDBGFmxijKjTL9MvlElogPp0+qckxGclnip/IOFc6/WAbPNK0qXq98Jq5DsZwLsx4//8yOyRyaQGmOVaOWxb3Aum4RIf933X/hzoTFpV2uSLSznRyCwLpKqjp2zMS7lCj9aDhWLcx5J9NxXfdxFVxBsapMeDDl5xR5nfTFJcOFylsdPxEdxf5J8ULB77F3OmE8Hff/40adNMxJHMyBmju99HNnMZkGLjC68HEPNMZ/6T0+m/Sq1yHOrakYMiw6vnQvmLW4cBIhsTFbhbgpkazGFTk8xsKH3pGySrLXL4xmadfs/g2X/lRrLbSonWaQehTqHYrhz4HIxrTUDn4kdxaPPDhH4fHdEu/69Dri0DSzmSF2m8W3hh1gbAbUO/mbHob1eJg0yKGzyh8AmvUlwXIRGrOwQA5dUZNPSo+oCcv1qlrQ==","layer_level":1},{"id":"e8ec6ac6-ad1a-4332-a7be-727b47d71233","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"Docker容器化部署","description":"docker-containerization","prompt":"创建GEO项目Docker容器化部署的详细文档。说明Docker Compose配置文件的结构和各个服务的配置参数,包括数据库(PostgreSQL)、Redis缓存、后端(FastAPI)和前端(Next.js)服务的容器设置。详细解释容器间的依赖关系、网络配置和数据卷挂载。文档化Dockerfile的构建过程,包括多阶段构建策略、依赖安装和运行时配置。提供完整的容器编排流程,从镜像构建到服务启动的完整步骤。包含环境变量配置、健康检查设置和故障排查方法。","parent_id":"803bfef4-3985-477e-a61c-915a246d0061","progress_status":"completed","dependent_files":"docker-compose.yml,backend/Dockerfile,frontend/Dockerfile,.env","gmt_create":"2026-04-22T18:57:40.354835+08:00","gmt_modified":"2026-04-22T19:08:34.084609+08:00","raw_data":"WikiEncrypted:h7ADvj4WLJHyulzCl+z7kNgZWY+r5P000yRKX1NQnlv1Xv3Dqgu5Ve8V72HxPVQrbKK8WU/ipQ1PAqV6SDrNgrc1Neea6KoTKr95imYAh3dYgIt/lZ1sndBbQCFqOF87dQsUIEKQgwrsicAeQ0zdudUWh6EW2nyIF0NGa50xffbgEr1mm/MThBZjOua+YnCRogCbgtirEO/6HGlC+I33w/bfFI+rREYKdumqUEia0kUP0pWSpwWjOQp06I7cUoSrx/LuJJ4in5YsZetdjzxdbA3ZvGMjeyI/VVF6UC/QUOgE2csP9z42v6XdOOngM/coBHI3DiUrroBGTPa6BVxJdngItCJ9XcNvXPbo0xMAkAoUKnNPA72B2pRuk4F1sTiOaSCQ1jaMiCTFvbj7+VleaodRFLDFsYa8f1w2FkiW7cEBhFpFgB7Qfru+Yi11rpkjnM2def+Sqq2PSHQ+Ji83jPoQXFl935rDQbNUy28wOIE3BdWN5jjM3nyoXcqKjPVjLf3cxGvg/sbdWk1FYPMIsbK/DUWayyTHt6L/fYkDQYjY5h0H6Q0jBxlhNQ34GG8kEcvrZ6Dy/jtCtE149pi/ToeMbpPq21c5KUhs9OHcEHgMjxWMaEVjQXMjFCpKyJIPfC984tfoZhAHi9WupzyEi37/igcgVJnvIdtadpX7uRxW2JCdfoHn1H87nGQj4eAeI3kMhtJ3EIPd/D6STxUcgtyLdTIZu9kgvnBIN4OyZeI1ygNZfawwQMmbDxHZ1pPcyZDHFlz1HZ0NFX+7VnN2b25TJP2hxMCZ/5OdYeSLozIbM/azA8QMHofESSdxDX9ZDdhvENDlngxUBmxM8+yCAWHENGYqWDL0gZMMDwe89n48Xy9qnKNLX0ROfG4FAtoXsEgLlPQM3AWFETnzr7Kvuma+8sY1iaMVIXJ/MWoy1zLwuY/oOZhVqGLX+DOEupKhk1oQmiqzciCeV8my5Q6LQeriSBww4jA3r6VQMPzBVzKJYz+TLizB6Esf//9+ilsgUVUc6GjD41Ml4fb1GZO3PzxGWrcX1RUE6RKllUBVNffxzE2WCirEX4e4YprntsHu6SAb9TLIInCx7aZnlVnaDQE5BCiHLjIQJnsHHJzlBm+8jtzE4zi7ljHLfbJwhtZ9W6S9KGUqjjNryjTVnVyYQlumOT8HCAkz3fSM6MpXwQr1qz/gHyDrQanmM1O9B/0ox5O2NWcOm5qtsteiyxwKACdyxrsUx0X9BaU8xygDL75XcTfcaOTcICRwaRZF3/UQW+zhbJo9LnHxq30JzTbxU7wEdjpWZQHZ+tu5BMrIqi4=","layer_level":1},{"id":"a91fff3d-ec5e-43df-8176-22f0084109ef","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"功能扩展","description":"feature-extension","prompt":"创建GEO项目功能扩展的详细文档。说明如何新增API接口,包括后端路由添加、数据模型扩展和业务逻辑实现的具体步骤。详细介绍前端页面扩展方法,包括Next.js页面路由添加、组件开发和状态管理集成。文档化引用检测引擎的扩展机制,包括新品牌匹配策略添加和竞争品牌识别算法的实现。提供UI组件库的扩展指南,包括新组件开发、样式定制和响应式设计。包含完整的代码示例和最佳实践建议。","parent_id":"b2bb2e3c-5661-497c-97dd-15bf6ee8b7d4","progress_status":"completed","dependent_files":"backend/app/api/,frontend/app/(dashboard)/,backend/app/workers/citation_engine.py,frontend/components/ui/","gmt_create":"2026-04-22T18:57:48.684421+08:00","gmt_modified":"2026-04-22T19:08:25.140739+08:00","raw_data":"WikiEncrypted:5RlNBsIi2/3o8ATlHuzaYD9/6k0SjLB2nW/cTN9Sp7ydYLe7mauzXPQFm5pYVoY1D1K/aULghB4g32vyxSUIsHV6NsxwYA/5+FQ8w/4xsQc3urcx9OEKeSC0hGU52WXucdAGjiEq/f4wJ2c9FdJEeALD6eX7MltcooFsxAVRWIKzHsMdBiy0RQN6s7vv4sb8vpV3b1ET27D9QlTUiTPU7RgtJLMui8iYiwJIirfL1TgdGRSx0Rr3tY/JvS3/6/L6VU/69BKglW8DnLwDkWKuthI/2sfWQa+lb+uTuixXL/VbltWQnzwjMVYghhTizEEC0xTpFGcDY/ajvLcjy5+wSleNEr9AFy/ytJKkpqEO8Zt5qyVJ4eANJMSXYcoKrZEskjVpnrPEHGdOzaEaCqcl2sQYkXde8LWM29fWmwlMjwJzucGwhudoQLXgkIwJnD+jb1r2SdjjafTI76MM53AnSfD4aj8K26yrOkVtoD6nWG1A1fG6F22pPBhJdezNJCYuKBaSDxJDES5486L5Gm5RvjYDq4r6RZ5CheGPgxl29XjCimgWuxXKVX0jPLUawteo/Vo5D7AHzucx2dX4mKr4rSSSHpD4HGdbwnxZ717DkRG01vTOnue6gSQ7pceMjSZ6TnB7dvtwwarHBKQMKwJXrpqxc83aZQjW4sRTAJs2Gc9+11c7qT9fQnGK54JJjEARaQZVaDmTpKmme4SKKxCB7V8yUqR+D+swVuSjIpYdL1m7THJtbWSSLaKkWmYiom1C6qb4GIgO4CT/IiFSyQ0Sz8MUIJi/dK0l/vVmpp5p3IF5K1m6NHDX94yEPWEHsWIS8eC2B74AyX6PG1fWSt7HpiBAzq8nu8n+IrXPqDege5sXbjfNrbvkRot94AvLF2aqMbteOUGOZxMLASQYyfRQBlaEEFMiKEVNTRSaHqiS8mS3pG6XLcV7TkWJIyMzhcT93hKXrSB2+jLa/rrxxrZwfp6lddgEcV+XZzQU3KsJf8blNUd+UkA4TcwFugu0um1Kr6Hro8EHAR34+FGMbPskEPPX2yd42YXx6qfmcFrI1xvHIQfnc7QuxZwO6GHR0G5LiPtuV4ZSxklXCwgnGWy1lpC13xANNvM1UKqAuhpuV2qU+xayK5IQv7kQaDOJpnMzFj/dSxtRgL2Xm20nH4BA2lhBCQMqeM5OxJ5vzwVlgVMZxDbhwrRaDU6cudgNfRJDFh2lGQqE2flEkvSF7g87Hc5H3qDQxUv56qpdOPJcgugKJtT3Jz4dNt3+eojvEwrTUc7d2Kq4KDTFUa5jDr5uo9PZhNR2TDJazpNIdl1x/64=","layer_level":1},{"id":"e3ae8925-4862-4280-b85a-0b376841b15e","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"快速开始","description":"getting-started","prompt":"创建GEO项目的快速开始指南。提供详细的环境要求、依赖安装步骤和本地开发环境配置说明。包含Docker容器化部署的完整流程,从环境准备到应用启动的每一步操作。提供基本的使用示例,包括用户注册登录、创建查询任务、查看引用数据等核心功能演示。说明开发环境的调试方法和常见问题解决方案。确保新开发者能够在最短时间内成功运行项目并理解基本使用流程。","order":1,"progress_status":"completed","dependent_files":"docker-compose.yml,backend/requirements.txt,frontend/package.json,.env.example","gmt_create":"2026-04-22T18:56:47.081987+08:00","gmt_modified":"2026-04-22T18:58:54.237875+08:00","raw_data":"WikiEncrypted:qfgbutC7oyxR6nMxrwk1ODnNMBEQ3/sG78fQT1yXWju83LC7H/jAM8CEAvWT8huE5OClmQiIfNYNxHQ9s7RRS/GGSwI5DTgXTPiPdxvdU9tU52Y4wj4FfVrOtqmH0nMPa+EBKH1Wo4HibSewimTkeCuJVAAjyygiPePcftR4ud09LKmopy1NSgZrtHMoDFDwUOcNJQad4OVgxMnOi6B6z6s2Oh2aPWNJX5EvE5xGkLAc6XvhE2T7MU40VJ4lUOoKlCNZNdI06grEqwyizBqt13Hg20wonqeQ1uPs49UbF84IJecH3DmE6KW3oqmqvQY6tztk79eE1bKZmBtQKXz8WhEMWZwALTsVk+hkk4dH/fcDoLteR1iuO4FaxDwAOaD71KF79AaYxDZiM/8RER9YsajjGSI+sfpJALuiQbqqfKbYFSgliiUcf4gTM20Ey5rtfBkcvBY6yOBPpqdKg7/ls7jdggNEWDJfN+DPVzV4SGAYRD4g/kDzPa5vaNZ6USRa7hVIR0SJufX0DGSdzX5BMh5DQEEyd9svxV+bs4KPZphBIeqAOzvo6zyF9l9LjPPdEook/uTIBHjGgx+8Ck1NQEeNOs61Zqr5EfISope1Au8dYCrzwpr02s4XAb/6bYsMSkfVqETlSSUkipDodGoLJU8QiYr5Pjv63Bb9Qb7SZ+i7NrGp6UJNVT0etywEMKSQn+73I8e9AYrAxlN5ST6K5b3W7cOPzFQMCVRfzvdd/FbuN30u7JXlFCnm6Ee8LDHW6nteOxBP1D6JxbrQirCQE0cSuk+d8OR5tR/DJiRDcjbsG38KVBEqWnIek8KlMGxEt6N3oq2ceUCCLe4jVURPc/2G/6gNiyVq0dPPAVwjaNKNwtiyaDhhBu4T21k9NUfhdQNz9DJWD0wXuaZc89RoqLNlCHJ6TtxEHJ/Sv4cgvm3QUierIBIqUawkCMEDn3ZEo7L2fUS4fMlzfpHSgTvxB43ta+H1m6syFUmAyh1yqfXVxKZY0f4JtmBbQpNzpT+aRHMKKQ9UVvtjvNcpupzO5aNkyclJVWis66DMtfA1H4am2gseXSfgHHtXiLfOnGoELSM1fLS+T9oPt48v+RPafJQpahtNeKtZc4dbTcsc4qlS1krenNSBbkKac4Zsosjv8xHuD1aqYvAS476XT3gjLfV7YUCF/+i3PiovD9NGzhA="},{"id":"c19260e2-5163-43d4-b35a-b48aae995f4a","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"认证系统","description":"authentication-system","prompt":"为GEO认证系统创建全面的实现文档。详细解释用户模型设计,包括字段定义、数据类型和约束条件。文档化JWT令牌生成和验证机制,包括令牌签名算法、过期时间和刷新策略。说明用户注册流程,包括密码加密、邮箱验证和用户激活。解释登录认证过程,包括凭据验证、会话管理和权限分配。详细描述依赖注入系统在认证中的应用,包括当前用户获取和权限检查。包含安全最佳实践、令牌存储策略和会话管理。提供认证错误处理和调试指南。","parent_id":"7c2ac186-ec90-400a-ac1d-b3b7ca2f01d5","order":1,"progress_status":"completed","dependent_files":"backend/app/api/auth.py,backend/app/api/deps.py,backend/app/services/auth.py,backend/app/models/user.py","gmt_create":"2026-04-22T18:57:02.317252+08:00","gmt_modified":"2026-04-22T19:09:25.682207+08:00","raw_data":"WikiEncrypted:uxAckj1IXK2TQH//kEdeBLXlO/kfAAqZjShpoDF/LwxGtmBqx1/zAvbXhqcBr9eSVupk3ShQQ44G7JWTygjRc5A2FkInV0uhQsYps0bWsiMbDrwt2AOB/ePL1uIbGoc5ApUbCip0mBf0CwqN0REsh6d830HtteEtKfMMtm5qouIOd2wK9DTeKNNZzGx8w4gSMIpsP5p3aZ18VwD5MWsgk0ypEVodI1RvEcxesO+ct8/yxvAtUoplWhOhExXvEaKsye33rOjbpp30RA+c4dB7CLQLITqpn+wxBlXockOukSc1TbsfdPYx7aBemMwYLdSg5BxjQI88UeuXoj57ax7r3FRkTkIghjXxbpJjAP34rD/Nr6kFlE1ffpnhtqKEcaewGDTam7t2tBNXaqUA5N8gM7qLaJb9G77n5LNWkW3BEI+mzLUgjH8bKerBwqmGZaXckRqWq434EkgNrsUu66RE0kG2tkjy/QgzBqBI70QGpe3lzfJc/eka8Ylgo33DJxnT2gK0imqLhTVjYuKhn/Tj7eKXmEAK+3ddYoLe7Zd1+mAieLK3NzZderogxHrbMIurgTqPWwKg7jvj9pWgT91c7lOpX0hic2OLS+T+g3bMEZOwerdtpByP9pFeu8mniiEJ0k85mEf3l3mL4Y92IJrF7wXc4Sj901JsHKGYyqErz9wUOQ0O5F2grtL3fzSQmJGrEjFXWDpUtGhM2ModNzXCBvm89cgaXU5e9PgQuweMNqPDDcnHhTYQk2uYXAKqGQ81DjmEhEn1M7KEi6FAfh9PIUmxY5Mjw/rUqRvzp8qW9ZC5i0A7VS2KF1YEati0DISkzNcusWc09yOCp3XQ2psLue8MbeIv/A7KoM+FFCX6VwfVIMZmoD9LlpO9Aguy8ZHr+wBKAarcZthLZKxBzgWwddU4ksDMPljtM00iT9LUvs4bU1kSB1rYQcsNJTlTvnl5q0giQTn8gAPr9eNv5ugyPpOxhcSiu6sLYwt1avmvC/pShZjizRD3Ao2wDAzZD48iyoPVc4yu/0J8HjBd56+9MV3mwWW9UGW9js6s1nyrzdsxZAnh9QT5dzYdPRh1EGz7MFqLA5huIrW73zkECwjcRtve3x0tGptO+D2RRvzbYfGJJtVYIJXEA9o2uRs/E57K+wAIXK8oxDXI9+kFys6eoRpHLIduIlmPUm26QJC3WoRx7H6SRfEzvJ8H5b9wYPnjpi0imunk+Lp0qDYT0aSxv1e7BPBJtAxVo4ztOJiTlGapy636dj/I3BWq8Cy3+srfaCykZ/0NCI0cyYtyk/4smftd0/fapjicm/RDEG/o6VGqlhrNuAYuG79wZ140mKvixWDJv+djOQlfglxDlqgsuA==","layer_level":1},{"id":"9b71fe02-5927-4a19-8db8-66eb129ecd9a","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"认证系统前端实现","description":"auth-system-frontend","prompt":"创建前端认证系统的详细实现文档。说明NextAuth.js的集成配置、会话管理和用户状态同步机制。文档化认证提供者配置、OAuth流程和JWT令牌处理。解释路由保护机制、权限验证和用户状态持久化。说明API客户端的认证头设置、请求拦截和错误处理。包含用户登录状态管理、会话过期处理和安全最佳实践。提供认证流程的调试方法和常见问题排查指南。","parent_id":"d907a8eb-795c-4060-9cdd-50d31cf39be3","order":1,"progress_status":"completed","dependent_files":"frontend/components/providers.tsx,frontend/lib/auth.ts,frontend/lib/api.ts,frontend/types/next-auth.d.ts","gmt_create":"2026-04-22T18:57:04.21635+08:00","gmt_modified":"2026-04-22T19:09:48.747579+08:00","raw_data":"WikiEncrypted:BenkIlLPgjbiADCpekIm2LnLFWkzmPKE+C+tunEqC7EVMaC4hkq7YX8EJXa9qt893SobX5KrGOKV9QEeDplCQkFx4neCRj4kZkvt/lObxAfDgMBruR7HQAasniGfUhUjW5KYXC16w7brsqCWR8CWKDQGEZiduwEsaDjAZy9TEu7PlK6Cp8RhkPZ9jhN/YjqaxTAq5i4xHmQz4VuuV2SO1LedFcTlV12iJH/vTW0vFyXgJqY/Ql6+bTZO2yMaEWan9rB7e+IsErvp40JaC2xqL7fRnfroIwQssGEvaqckwf2qyNjjNCcewd62C6FVDnxJOLjQbizlBKmbb8XVzuRLkECZVB1edGJKnDV6FkOkP9y2Al2Qtpbx/1Uhx1Lo92eRd57kA0Icc/KGcHKRjNsW0HfYWAtLctTH3fNIwtmND/J/6zKK4UdDJ8sXiTnjiU4JhX/fqW8bl4FVo8F+kJYUIhbJCQkl+qlYh/MkTCmyG8XukvSZGbvWMPUxyU1gMjDxUnyVdcJmFFt15oXI+X1CL6ukGEn1cRRDiB4yRAq2GR4/iUPUFC0d3aqeRj+ryjr6Cp8YqrHfONdwZyWd4hS8RPEP7NeRuD64yNRSDFTju1oPvBfROcmunn1GaAmw8dV6KtXSJnM9SaiqnYutX51ah9psTgX+UxTu7EU/ijnQYUnDLg26m2/bX4Rhm4MRyE/fAwzxOKEI3uIaqyun0W3lgdaF4bWTwTblet2a9rBOwbVP1xtJ5M095JzboruOAhl29fAT9iO2jeqpZBoO7zBim2s8cpkCt/Zf2Edu2CeUkS180PzKCBtnq0FpPLD9hjXPsn0GjtTEbwO6lSl9JdJ1+J03tiLVJjRTZffLUlA2gM3tucbJOfyGdAom4yffwP8hjrhTBeEyLwKmLISNARiKuE2Cm671yMn1pmt85Vu1rajq9L/GeJdoPPL+4pw0dk8/Oydx0+kOg8/Jyb/8D+XobOK98UfLB6gCaeqZV/2EBEumn1xdhcDpP8cx/kijjzPmOg+tlXa5VzG6SpcY1zw1kYgyEbLZMts5EHUFYp+UCNixZleiG2HvEN5v2iuXOdcZiguCFkQLt9TkzO1v99jj08p64LxUkxY7ovJoeanwleMMBEAI0vWrt1+8nf065/WLA+s6zQWMP7nlMloMXAfMybSF/he7s2xGsrnFXqR0XBU9qRnrLY/9IcroEnKTvicyEUylh+wG8KUQcIJj+fOEVqPGITla0i+36wx46XgzdRw=","layer_level":1},{"id":"b80dc237-1a6a-401f-9f4d-14190edebcdd","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"技术栈","description":"technology-stack","prompt":"为GEO项目创建全面的技术栈文档。详细介绍前后端采用的核心技术和框架选择,包括后端的FastAPI + Python 3.9+、前端的Next.js 14 + TypeScript、数据库的PostgreSQL、Redis缓存等。解释每个技术选型的原因和优势,如FastAPI的高性能异步特性、Next.js的App Router架构、SQLAlchemy的异步ORM支持等。说明容器化部署方案,包括Docker镜像构建和多阶段部署策略。介绍开发工具链,如TypeScript配置、Tailwind CSS样式框架、ESLint代码规范等。提供技术兼容性信息和版本要求,帮助开发者快速了解项目的技术基础。","parent_id":"1bb55e12-24c4-42cb-8f59-ddc303460d45","order":1,"progress_status":"completed","dependent_files":"backend/requirements.txt,frontend/package.json,backend/Dockerfile,frontend/Dockerfile","gmt_create":"2026-04-22T18:57:13.329718+08:00","gmt_modified":"2026-04-22T19:09:54.216074+08:00","raw_data":"WikiEncrypted:w0CkdCdnXCcvlN5xOpiEhEX3U68GI0Ngj6azFMJo9xRSxuOblJXg8Gncvj5vankATp2aJeXH/Zz4LVKH2Ep+cABEA0J7OIJMnt/ZJc7uvMtWJKS6+i5aGsUhX9BZcr1SC4TqdgwXb2je+DFK+fLZJVkri1Ne9BkEqmtSaV5CijFytJ/VSKFHzj8+7gC5Jd3CbEASojclHovCufD4dAVhlK2qcIuY3RBxMsvfRAlLyMLZEWg/gD7LEj0JaChWWR8vRaEtX0LtMoYIgSfbY/nUjR+3xHFig+m0qclK8Q01S5GJH99paLVqVkmt12iwMMiqNZypY1W2gRvZNsT8eanIKu0tq5HqvmbN0y9+nnuwnz/Tg6nUBlKIIS40jp2oYca9ak9bIwBm0TqkMe+M3Ara03+x9PgGRUuYwCt9d0PwpPG5/vOAkZtP8talqqwhn7Qom1nVkhmExMfsXTYsM+Fn2bQFXKIT/rAyT5rY6hwokrvghKwOb9pH7V8+4XckeKWV6L1rNcccOb6Inp4WcVBTcTvGbdy4Wj5Z1VETFwMnDdpOGFWc0jZRJpjrRSGgDuEW8IXpMvVYk3FV5ZyUXZcNyEWZ0Fp/s84guMC21/RYF67/9jD7eJYMeCsU92nWm6QkdVB13XQBOvYGFSu1QejQCgDMWpPz4kkt4yz9mgOtH7HsH8ZUDIml7Vci6pCcEIzS2Sy+BoXxSxcOzrqxD+PbGcH8A/BafN1771WuNzprCCTqbZd5MVXBKiY+qrlRCD1ug+pKS075xfWh/Y2Sjz4p1aJuyVplvOfNUKTlbZVBzQu5DBO+yhXj4b8Amf7OLydq0Avaf0gJhYhX3HpFNqi6aqT9OzPBIPohOUi9RWffBwHMJii2/NZj4GbgeXsWU5+EKE6sGFRGtUiBZGzf8FnB6rW16EA6in7Vd7Ls3pJrra3z6b/k9gqlh8eAVDoZhCPuxtA6yNlXm+RYWLDYeWiRDZoavKVj13rXtaqtX3j1/e1zFPMBZlDPVHyBqCZRiZjlKnty9cj2ASgpu7idyh8jDQSALGu814Wb55H1q08bvFxJf6pxn0JfbRJZMHqCEgInivdDUTcCCPOteDT0O2pwMmyHuq3mI3VzFPnYLM3aYzgJQsNIVztV/dIEJu2UGF/cyjIeROHaxvWYLNXRJZ05iMp8oelEwNe58eAvWt2KOuahqQl6xKUctm90QLv8QR9hr7PjiNAMVH3WsMxkqLcIUPuboMElVq3ErUqd4qE7W5l5Uxi2I9bVcnq4qiRtbCnRY32uC43wILTgq6KrBaO6dehB3eW4drPWqtmcU8rP1DJEatUWEvhpDNrI7T7wG6F+","layer_level":1},{"id":"7e5c3b8e-5aa3-448d-ae52-d5a96a413b0b","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"表结构设计","description":"table-schema-design","prompt":"创建GEO项目表结构设计文档。详细描述所有数据库表的设计,包括users、queries、citation_records、query_tasks和subscriptions表的字段定义、数据类型和约束条件。说明主键、外键关系和索引策略。文档化表之间的关联关系,包括一对一、一对多和多对多关系。解释业务规则在数据库层面的实现,如数据完整性约束和业务逻辑验证。提供表结构图和ER关系图,帮助理解数据模型的整体架构。","parent_id":"243a1a45-d31f-405e-a3b9-694d2fe617d5","order":1,"progress_status":"completed","dependent_files":"backend/app/models/user.py,backend/app/models/query.py,backend/app/models/citation_record.py,backend/app/models/query_task.py,backend/app/models/subscription.py","gmt_create":"2026-04-22T18:57:14.160671+08:00","gmt_modified":"2026-04-22T19:10:23.576798+08:00","raw_data":"WikiEncrypted:TWtD9cYU/QQHU+vD+ojNNl24L1Ao0zI5Y2mk07u9ZlXGce4CUXsGNCSRaLrvDZHw4OUpuZEJrmJBXEQX8GmxRc1IXLTgRlqUGmpzfcUAx8VrQijBe+unqg1mWTkYnMlYOqKWSJdISHyD5K3kBL2cL5pXF+f+lPHzSbWtqMnNnMKbqnSl/TkKh6cr7PM1YBR4IYmE21gHSR5XoQjbtYmg5qNyKF1kMdcAd0LHw6p7zHBaF9cNt++5GyFKLK0zjN2L8YiFsuFBSrn/M48QW3WyTrvDvqdOuR/Slfv+gUsKgbkt6+NEpuY9HPcRdvVJHvG9FZedomH4DrKuI0fUXgICXotXbrcEe5dOkLKgfn+gXmS6sPSZ1XgrSNO5gy2QNJaW+oKBuEPzfuKsNr3X19FZTz+x620YmL1Ccv/5uvf0Zxl6fyQb3qP+lsh2kaMdhWVKyoBv37oNKF7MO+fy+TWHFEwlVnxgmQREyQva5qxLyYzu1GtDpGp79IemnumltTAAzQ7LRs/RsaNcU3BZdYfQspjnhukylPJpNZtmKNN//XWvj023bGiaLyy805c71DcyqZNUs+EdlXmRTABeq9QkVU5wq/gkO4RFSgsWao/8f2i9FLeEZolKQXzoLnX7GxaY3BMcynG+DlwKFEolVOw07cpddYEWzmVKgJUokX/eiMbrokbcv9bLXJpHl2aP27B2FXy5Q2Ot11b2WbuT532RndBI+S9HQpfMmZ2z2Fc3VrWAbk03DwChHEbNHpmQvJpjKtLweVEpClahV8iTSwCkwd43jJdW+tR00iSdjt5vbl1cU7Dciah/B/9B7CDr9sUyZMjly7kzyWZqTkdXde3tO6tu6tWhTigIMXmZVqhW/pgVifH0R72VuM+sdMw57m7Z89ibQ7o2LewlMzJ4GsV90DdDhHQtUr++aRhcZp/669o8mijOQKj8MPHY+xjhZ2oiS6RHiCYxpibVfauiaXA3swWKIQrVCVE1x+jB07pieI3wHrmZf875mdp9rhfrz96+y4zJ464iINUdTQinm/zI4CnhXE3inFBgr8bD3pop0oYr2X5f8Gn2iKyvByc+w5r8HKV/7dd4GrdAosqVWpQweVEYR+MHRZ3AxiW+TCpRWz/PsHgunD4m+AQv5lxwoHVqF0Tqw7fmmxTqA/zC+dxlIJVD/R2WF4sFpA6femHOwqniwaowQerg8bGe7mz3BCSqiobqGSZQ5jQdh34TRP7qUg6PGkJx2NJ6AVIZVYBg9JNOQI67+2PN5AKq6WiT7Rojgo1r8lEx8SORaVptbL4YEEeD8Ec4g2l7Aqkhdxd43uw=","layer_level":1},{"id":"9fe32b83-3697-4939-8b10-524f5ed3e65e","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"Kimi平台集成","description":"kimi-platform-integration","prompt":"创建Kimi平台集成的详细文档。详细说明Kimi平台适配器的实现,包括Playwright浏览器自动化配置和初始化过程。文档化页面交互逻辑,包括搜索框定位、输入处理、搜索按钮点击和结果页面解析。解释错误重试机制的实现,包括网络异常处理、页面加载超时和重试策略。说明浏览器会话管理和资源清理机制。提供Kimi平台API调用的具体示例和常见问题解决方案。包含性能优化建议和调试技巧。","parent_id":"7e66719b-4a8a-484d-889d-10fdc76788bb","order":1,"progress_status":"completed","dependent_files":"backend/app/workers/platforms/kimi.py","gmt_create":"2026-04-22T18:57:14.59267+08:00","gmt_modified":"2026-04-22T19:12:57.014271+08:00","raw_data":"WikiEncrypted:CSdS6kWSLejXKP14YRwDWQpHc4XisvWgJzUb2dJm/yAGkddGXaInKHg6AG6A9w3V5Kpt4A88mghHC49ZAnCEBFkdcYzwoG8rsg51oQD0yMYKzfwh9/qTOohfaDg53bEIiDeH6Us+OaAO1Y8ql0iMmjrgLp9Y1OylCHhUCu9A42xMeh+fRbqaw2jvrjKU9Vd/PpCMTm7f+oljBa2YenytsO1vH+MJygHrIBIFMEwP4wDHRQCGm9i9XjV35+dfjxOhIgTTQEGiMzeNAJeVWdGX3CzHOqsyvOPjrWtxYxywjeMbewxFEBPA4dDmVf1Vjzzew4XPBzMpEXmfoXbyeUWhGhbE7tEFT39R09Ha75iK0wzPu1ux+4/VGTFOtfPkADxp62qkrPp9iL5lHxwQazsKyzs2bQCnu3u8gtrTmvxG69MDkDKrF9Q+F4ZtAlnadF4bsfDmfd+NGYnuFZW+D5cHTHu/EUqApHkByQiwdgH6BcOsdVw2LNu8bIfHCZq8kZtslVIVwCYcAmkmcAXNdpssx4zoDfoSAhvevYc0o6HITT8QasnnhvMWA7agJiGwUENhiApqGMMeOqP22TOMJDUUb2V2VhVNIujymTz4YUAtQq47v74k+XnI/Mx24Y1s9OOWOKvRfKZn+WXVLMwLQTVbl80EHY4/Wra+1fgC0dmHhXvVlq2jdksGrjLc75lQUEYd0n4nwf/f6JsjfM1jYvVSArLWpXoEn82NbB/T5MrfmbEiK+CQD1GfQ/vtvaPioghi7WWdUslv06Qra6l67oxtGKGx7SJd5FTXKH6MXBs4M3x1GItLIU0Dtkd+trliHatHl+wYqwVk2xgXmOGpQsOLwOf99CbQ1BtTN7KPB19I10pElWF+IbH9eTm+6sewgOPimkfI3JhVSl2cSCQZcGQVJINI8TE515tn2AMLVlM0AMQxTbh65Z99WSQvJtYH/TugerzWgFw3pwvBbp+9a5z4qZmBFIW+jxXEcrMkiC9s53D9cGLBS89D/clur1q4gDDkKVtztRvwwORkOSEfzLNhstNJp4WgD+b8H6bbLh70G6rMCXtMSMZdjuFSD40UuqdvHFcW9SE6qEOi06mMSAXOQQ==","layer_level":1},{"id":"cc7a1f1b-c70e-4c61-bfbc-6dc408a12ff2","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"查询执行流程","description":"query-execution-flow","prompt":"创建查询执行流程的详细文档。解释从任务检查到执行完成的完整生命周期,包括查询状态检查、数据库事务处理和异常处理机制。详细说明check_and_execute_queries方法的工作原理,包括查询条件筛选、批量执行策略和错误隔离机制。文档化单个查询执行过程,包括CitationEngine的集成、异步调用模式和状态更新流程。提供执行流程的时序图、状态转换图和错误处理策略。包含性能监控指标和调试技巧。","parent_id":"7416db23-312f-478d-8883-2fc3c41ac2e8","order":1,"progress_status":"completed","dependent_files":"backend/app/workers/scheduler.py,backend/app/workers/citation_engine.py","gmt_create":"2026-04-22T18:57:25.383473+08:00","gmt_modified":"2026-04-22T19:11:29.353795+08:00","raw_data":"WikiEncrypted:l9Ho0Yh0r5bYH9QEePEhka2UMFH582eHsB+P+EaGE/r7Zj5gVUJmL6923rRlAt7h2uvHOVtef4s71D/S/eYpYYgI+wRFyPq+fQZYOCmVnMBRyypO5m8WqfyrsSGvviugw2fw2oH6ruNX2ul1LjPKkntbj4o015R9XwHG0oDdyJlipxqNUbh66IV2c2DO1besCA/q2yTeLh6EiHD+vYeG3HO5H+y8kykMbBuh9eydnmoXBTCsTlNBHH8gzmZWEBBSL7DETM0lYCiNr6WpRCoeZEo9ewLagGq1ammmMjcMg+7fO/xo+ZkkACRTnG2vnKh3if5fBjzo9tY4tGmtF7Fevx+yjLRfhpPsg8vSRZeaggRPgub5zBIulo/4qZhAvIVsyYuAQCqrwq6mBxAEjgWWrWjOThUEQOntbugUY0DitRui7XGp7tDjAIWw570xWzTTUWe0CMoHIPghfvhItcnYfjKK+fapnQTnz159jVJarLbBdjZT5JJfw9a+jlkVyF5RIKu3J03cjGFJeBf74DiMxFIMQkKzgL8jg5YiLQTisI4X0BBQrKHQvHzsD5+VzHGwCsz7IIfcdZuhkg3PIA4z4V7eZP9tOBUJdh7iE4fjhOk6fVDG5iZME72OxpBtFkmfrhwM52swaToCosj1eQ5m6V2GjsYY/+ZvaNf2aWn8vBJHI4IEO+Ua1mLHkPRT9bhDGS+Td2r1R2fmSEEvNQ+PTuhnRAyzRASTsjfWljzNWGNmcbCtClwcIuTSwPWLAoL+ANl303UlvxObHa9udiJcH3pZ86+A7iBLoCg6JxZQuCSqD0W6bPR/vozpiCvGs1TvMR5tx6AtfZGWw4JYl9wN5iPPaP8sPsz40D4PWkYIb4fIYY/X3r2iAnbjpV+/8+h3DQCWEdqRNnkZ4Do+XZGOi1yH7QaPOf/RN00+bcNtR36PnzENY47tg8VfPkbt47YTWHf+qvWfMFPwco2hLzXvNFmYN4dVMld5V+9mzCPJSIb+JOcDoVkoGuNq7aXnOVFdERnypgzvjryBt3W2LgPNlD3k6jR7pJAE1gKKrl00VSdDN9npu4QXyT49p+YMv9m8Jbf9xo1Jn2dqM/cJiKZi1FLR0clZHZ7nh7/7WxoEqbKnLWbboi/qyuTABO07nyQfmyXR/24bRp3AIRiM+7Bq8KL9ZFZs05JmFBtaRCAzWdBdM3TElVkfFOyZRZeKaBlk","layer_level":1},{"id":"fec685a0-c9bb-4048-baf4-40b56b2aa29c","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"集成测试","description":"integration-testing","prompt":"创建GEO项目集成测试的综合文档。详细说明API端到端测试的实现方法,包括FastAPI应用测试、数据库连接测试和外部服务集成测试。文档化测试环境的配置,包括测试数据库设置、异步客户端配置和依赖注入覆盖。说明如何测试完整的用户工作流,从认证到查询执行再到结果返回的端到端流程。提供数据库事务管理和测试数据隔离的策略。包含性能测试和负载测试的方法。","parent_id":"fc6f24c3-594e-4153-854f-19250834eeb1","order":1,"progress_status":"completed","dependent_files":"tests/conftest.py,backend/app/main.py,backend/app/database.py","gmt_create":"2026-04-22T18:57:25.616681+08:00","gmt_modified":"2026-04-22T19:12:37.820526+08:00","raw_data":"WikiEncrypted:0j4RRfWJQdenLQLpT+DwLTyjMVG5sQffpuJQoSG8tbOVCukW9eq2bqobYYACR3zRn/N/FP6n0t+ZzbrLBFIDPbiPv5CjhNbth11wsRap1Da2YyKifcvwg7uyuWtSILKRIkP8wIVHX2/TkxRFQi9/m+9Qz3xVjYcNeOD0G8UWxzsSDqYGS90xX9MVwW3N24hbwwcJUE/TAMETdbhwrekpr33ej8R6IT6aBvn7m0Y93BRItueF5HJcUtKCizqJqcsG+BIQ1fodLPAsUiqvYW5dwymM89ASYiZXVbCOJq19yL9K4p1ZW1LsAc2J+6D8SR9RJ//D4gGwBmMTqxyP9bgn5eNt3ILeVMXWLXI9oxaDrdVs2Y4dXNC4AK1j0pegZkiNREUo54kWHFqCuQ6dG8dZB7BmnFEIYjwEeU29KdF6i0dyUH3/h5QjdLfc0OV75zuHQPaMs1p5fn3vo6ubXz/uWtxEF/IoVhph+AyY0Gci8TxdouTw4RZOm9I6mo5m4Y+TBsxUb9RO0WCrD/U7tRgIZcrxFfkORsKadNWm60Q4SRJeImUzxIVCUGBjr4km9AMwVsl94KSXmkBCNOFppeijE4N4Dl0n+RekVA2NBOau2woOIr/GwJ7b2h0jV/5/3x5hihxUSqZJ/q4RJmV/8aP30XRdYwZ6qiLcaF6Ic8kwpaS+9cvzGsPMcUF4GCS6ZSZoq4tuGj1ZY/iFI0w6Wj7rJHWbeBhsF/fHqFm2ijbrvn2nz+lH8Gxb3FM+re81hKNVU3BaZ3fxOAldPPvUxDw9tttWR+oH3F/gRkqefOIsw95LNYf2vIq/HXfNygn6mUw4aYidP1SY8flPcCMl0mDm7y7W6l+DKUJuok11v6h2AM09f0VV9JnGBMgwCic1FjQmfF2FWdqlsEaB0X4+aPne0DgPyIivgCLEq1dyneDm4TxA3CEVODVKHIu4fxPjmDtwbXUvPQe5sWkG7AEkp1Vuul8T/GLjJc/DHgUFe51MPFk3+8i0FCKo0x0fS8Mqm3spHB5W1tKYAIyexOgSkHzqgRdgERCTqUW461c4lKbFO2WIJqWgt/seMgxHr02Yk/pvMU08AaMRC974SfB7kP0lEQ==","layer_level":1},{"id":"b10c2334-a850-471a-9851-a1c698e3a485","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"查询管理接口","description":"queries-api","prompt":"创建查询管理系统的详细API文档。记录查询任务的创建、读取、更新、删除和执行操作的完整流程。详细说明查询任务的数据模型、字段定义和验证规则。文档化查询任务的状态管理、调度机制和执行监控功能。包含查询参数配置、定时任务设置和批量操作接口。提供查询任务生命周期管理的最佳实践和错误处理策略。","parent_id":"dd12cc44-0c95-45d5-a726-e7b8bcf2531b","order":1,"progress_status":"completed","dependent_files":"backend/app/api/queries.py,backend/app/schemas/query.py,backend/app/models/query.py","gmt_create":"2026-04-22T18:57:37.836674+08:00","gmt_modified":"2026-04-22T19:13:13.115817+08:00","raw_data":"WikiEncrypted:9mSyqcDNXizO1JyGDCrbHQv26RAimH4+rntsA1VX4dLvyYb4Jxu6TVndaXonw13RPqBFh6ddOlJg+Nqb71iBvzQ67YQrmYbtLXwkDZnvgAJqkSUXXzN4PlgowB/jNfTrmLqrUYAZLwPYTiSEAGfTeU+8GlJTtvE8xjWhZI7vP2u+cMth1ze2EwqO4hyTykCDaW9LISygpROFBJLghTo+K5E2Mdj9HWXWfqf/8/vypj1zjNrQHVY2bFNlhZv90+sCmTY3eQ0T3wfE94jKejGhh2P8YYJayGzsEoDFm7r2Hsf+rQmAXynuCLYuAHl7rAzrWRNjmvkxiuyI4AB9he1sozIJzX5M+HadHtd7E15MFYvAEb0KExSxSfnZCkczRCRPmNvQmwYBUaEJJ6brnImPFBEN4bxd+c2SId4g/BYudUL4Qio8g2zs8r1bZIz0rpQEHWcVoHGQK73Xp8ff7gvjRh89yEr8lh3zxI29eZygWmcap5z4kVV78YWgF0dC9at69s2EVtaiIluQIaBF/gJZuH0EjOqE/TnxTq89sb81YBRpRgHDImzngt8tBp7eiF/e+aO3qk+zH2RyGTCyRN5lqSlHoMkfeysXKgBAk9foGnD4D2OBWfndyN16CuRtGa5vAV8YS0pNw0IKN9TniA4PAGC9lTuMbqabzVWAnbBdqY2vR7nC5837ooKWljHYFMFWUfVSbOfFGxn0sFW75OelscFRx7FM+kaQtP4JrepRQcoDml7Bnt3bTt8SHThmpNMJwu22c3bruKQ++qcVCuvXKDKAK5qSxiReKiiJC+YluwwphSqkRxThXUwS4aMI7IoDX2FwLw1dYo7w4TeEi5sB8HoBZ5sY99Q0vowXVWj7Yq5HhHv8aTxTP3HjRr+Xi07oriRJlJifIzNlRPVB0rCdJV/cBlGkz4Gr7KUWUFvoXwDpWGM1dGbNQgkE4z0Um3fU0D0K10jDKeEHA6O7MnZE3L5Df5j9bEnGZb670xqUxdMxSjDFcUNKYrceZxYtK+GB5j5PMZuksLKt5QRTkzcKMQ==","layer_level":1},{"id":"0c1d3542-92cf-4796-8dba-82caf2f7b361","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"开发流程","description":"development-workflow","prompt":"创建GEO项目的开发流程文档。详细说明Git分支策略和工作流,包括feature分支、develop分支和release分支的管理。文档化代码审查流程,包括Pull Request模板、审查标准和合并要求。说明版本发布管理,包括语义化版本控制、变更日志维护和发布标签。提供持续集成/持续部署(CI/CD)配置说明。包含开发环境搭建和团队协作的最佳实践。","parent_id":"2148d7d6-25c4-497f-8894-c4eb7a0d2bd7","order":1,"progress_status":"completed","dependent_files":"docker-compose.yml,backend/Dockerfile,frontend/Dockerfile,backend/requirements.txt,frontend/package.json","gmt_create":"2026-04-22T18:57:39.374243+08:00","gmt_modified":"2026-04-22T19:13:23.08237+08:00","raw_data":"WikiEncrypted:F3QgleoEfoy16cQggYe9Czfqaqo1gAmvHQcnSrNK3eg3bg6SLp6Qtm0Hd5JwzGY3jDj+dSShAoxbjZ6YvxA0ahjJ7+4npTrro/p0OlyQfTnVZ5PYAZZMMXhJM063eUYiuQW88+rNBbc3mKbsAdZboYndBnd6/wybElFnP7TORa5qWxWMveWf6U7O01ocA+ZnrQqoPWB5xrRfSzD1p3yGFA3fzKobYoxAAA3xE1ALEY0vjLN7vajgFVllC2Z6uKZOE4Q6v+W+r18Pr7pLXGDJM7b6pEfFCqcEMw2fWzUAFYSUOjSyg7j9TjP6Lae0AWOmmxIDmJIIiaY0BCv/iOXgg4F6QSChC8bZFyWJATWTNhfmHAMU6tYpDXqDsfLmRpczznZ5nzTtcX+87Ndpqchh+NWU4y5OYvzEeMRCh3HcCUDs5KrOoCJgRneV8BzAxfk4gCwSo2t2D/FYg1XWGfb6hPdmWzePBCYhhIGeDQRyAdApe2Js8UhXUOD3TM7yzFPMX9q5U9ZBfejCp8TyW2thbRzOL4s5Fto9PpXg38HbnE59l0BmptA7z5bTKTp4DHA8d4NhgCeDbfNLfSJXbyYaD3RqsQt8szzbxB2Q8mvEi8iUZUARZR0lyq0oEw3cYkZRo7Dcb1n5az2OJRZwHmvRYAm7KceVqa92aKeBUlVrfA7nOuwsVH+cEXyzE8ApglbJiQfTJshljzVBvYPkz0BxhBcYrnRIjy9TlqfTs67adZyWc0wqEVZeZhuYHwwN5yID2imZ/nq7cqiZCbV1dtBUUM6ayhVX2h/cBSLpHKAwVHAg9bb9V+RxXgtSYWYKCHsAD0ymmu/Fzk3/QBvrrFiVqL4b/5CKqk6Qi2dh4pN4tZg3zJZDuyx6xzWSrsHeYGnLunZQWtHn2lr2vR6+RqzRTDiOC8SizuAjeZP72IbQf5Xyyf65hS6yls8xztLA9oDCNnSDgJ/RiNDOspfgUyj2xemyoNqf2eJ/kCDdo4/VXxMiKVfg3MHY+Vi4dVlRcSEJYLU4AYuGqtqVhTIi2ESpnPXgDPAIT+ZZPqg0hLIIPx+HNqo5qz0qqxvliLlcAhizNT4MG3p3dBRI2IkylW4gHg==","layer_level":1},{"id":"109a8fb1-6619-4bc7-8481-e28cc2127d24","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"生产环境部署","description":"production-deployment","prompt":"创建GEO项目生产环境部署的综合指南。详细说明生产环境的部署架构,包括Nginx反向代理配置、SSL证书管理和负载均衡设置。文档化环境变量的安全配置,包括数据库连接、Redis配置和API密钥管理。说明生产环境的性能优化策略,包括静态资源缓存、Gzip压缩和CDN集成。提供安全加固措施,包括防火墙配置、访问控制和数据加密。包含域名配置、DNS设置和HTTPS证书申请流程。提供部署后的验证步骤和性能基准测试方法。","parent_id":"803bfef4-3985-477e-a61c-915a246d0061","order":1,"progress_status":"completed","dependent_files":"docker-compose.yml,backend/Dockerfile,frontend/Dockerfile,backend/requirements.txt,frontend/package.json","gmt_create":"2026-04-22T18:57:40.355193+08:00","gmt_modified":"2026-04-22T19:13:58.697418+08:00","raw_data":"WikiEncrypted:1PcQ+NupkgQiLQ506NXlaizhNZeqS8C1INCZPnjb6ozpR9JAOMhzbAgtECu8k4VbH9zFlJ7iHctHtUva/hpzUaHUxVuG/rnK2RrcCUGVfbG0WKRpjG+EsQheC10ihbe51Rb+uXm+ciY+/SOxWBmrtK9m9jwSBQZQx2vXLOPvachfZTksEB+Ak0/Y5DF+vjL4WN+ym2SAYi7dW98iM9YCG0AepSeRm5DxENKRvtPR7m+w+vL7F2oISKi67pFiAATpFXSSgbkKjENZIgPfqc+pJfUREOrnHANiCx/oVaX2aOb68pluM8RGtAgyOfMp097D2Nt4PR/HN691JphbIyyeHPc82yGTjeuFPfg5XqFkhM4gvd9EdBLE3/6bh/MJhYjEwmN2RRhz7EYgLjSss8gEdDu+YLIEbHIaIC5fFS7gss/cJULC0/i3v4nnobE2Iqh3WdeIMAmynsin0sjO60LhvRmXlecODQ7+1EeQpMWju5LwTuVyX3dnr4CO4rJJxEBNYA4gaJuef2xo/ZXoun6cEIHjUq7qVNVOBZw2QtqBD2CyY3NULBP+nDD/NwjH/Gh98gl2Q0am/gLAHHoKcZfkSub1o1m1ZWTFgYn6MqyYv95NuqxR5+MSPb9C6/rwkYduPmovFsS2Alznry8TjsLdD5iSNz9MdRTR9iNV/A/TIIovgVogXlgCwnIz6EXZUgDnTeBTfTHxC+gwTrSKXUigRlIxEGksBJkzktpQA8y9mwnIfHgRDI4c8WEQRGEcKm2N3/ZPVOyBHSOHNpXK/BX8MCQqGoj0x6jusO9pJehw7KRprktlMbB0LmAuc5i0RYf9SnhsGs23W7ktzhS+uTjRB4kviSWZdHs+hgh1Pu0HsyBZxX7pemalNElQsWbvLwFNsJY1L1yjHNbBDYyXC7gZZqdb2l9GqKVgozQuK+qUUA0Vj2o6Cr4CxL01vBYMFpHALv8KnmAI2CuprX0c6PmsXV20FAFF8tIxoGfh7qcvquq/d4ONxZ5FZ1hJPYzi2xeCU0p8gFYEYYlbGMXdLCk0L5Tu0aDmTVkkrZlOHSIneYJDGZ1W/q+U6W18i48iBLvFBHD19jGHBgdzRuX551rbt4axStOcEGuyFrivbWK9R2zdcffHbiRtxe9wSFXxthLGe23JR42EF5PmZmMtlUhpV6alxUZNxguf+q/ouSz7Xn8+o6amnO60N57RyJjJO7O6+TgfHeroxL7CpABxkru/vXEJ5XTLqZBiECMMi4keQOqUbNZX8Ioct03e1YG7OgHtDSayZFtZf3kwN2ToVkxIRpLHTUHxSWLZu0YiAI2MONU=","layer_level":1},{"id":"4d5ac6d7-8812-414b-b8df-68574cc36d7d","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"配置定制","description":"configuration-customization","prompt":"创建GEO项目配置定制的综合文档。详细说明环境变量配置管理,包括数据库连接配置、AI平台API密钥管理和Redis缓存配置。文档化功能开关的实现机制,包括动态配置加载、运行时功能启用/禁用和配置热更新。说明性能调优参数的配置方法,包括数据库连接池大小、异步任务并发数和缓存策略参数。提供前端主题定制指南,包括Tailwind CSS配置、颜色方案定制和响应式断点调整。包含生产环境配置最佳实践和安全配置建议。","parent_id":"b2bb2e3c-5661-497c-97dd-15bf6ee8b7d4","order":1,"progress_status":"completed","dependent_files":"backend/app/config.py,backend/alembic.ini,frontend/tailwind.config.ts,frontend/next.config.mjs","gmt_create":"2026-04-22T18:57:48.684725+08:00","gmt_modified":"2026-04-22T19:14:17.843426+08:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllKOp167MIMMk/Juev/hVoGY4+Uz0exYT+x+CbyScHHV/Mh1WUG25XsdoZThZQEtO0sLOn9+hGddmRIK1DWfKa/hxxPvnViNvXvltvNYiLNOIbKgkBxtXovEsADGNyhZh4ndOp+a/upcB9NJ4f0miwJacx2Kc2MyCkDCgUM/gJEjyoB9tRPRJVPFRvprzmaiPXJ1K8jd+KuXwrM12ogUA9iPZOtJJQTeEXQVIItOZYzY5bzAZ/mnRyVIB11vegQ+E6Lzm7D1Nza2QOZ2893Bzu61StECZsNlfecc+xEh82aNHrbFip7Fg2I3E3fqBs5EgoNXO5Wnvkcd9fHCw9vI9kMJucTIPcthOyWAFiP56zu6Hzknqy5N0o2gSAJQdhzzEvIUUKeeGDZKSY2EjFsH531gWa+Q9m0FsYWFcErqBlQXG8K06rnNNeMwR71GloOifAK0ySuik/7BjJ7xIR7HF8FOfSaOhI011z3GaEBxZsMfPc13v0joKHld4p4PRBXAfExWLlfuM6cmB/77U4xdBrHVyMcS8NPKuT+TQCTzjr2uUKzxUcjbz+yGbjVFGKMaVzKH0UQfLKeSDUnb1JNBrQWR0PFAuZsPZt730dAHdElNx9MenV8/GY+XPklTXdGMUtflT6CKf3fLy6ppMVbMDph2Ov+1Xh3z35Y5Mz3rufJasyOE0rZQMNsUu3wHtnjYprxfzvmpP9En5z4KoGEa/282c8xoLp+n3+etuGCN2aor1BSrro/ZpPTduyQtqj2WdfXDnZo1In/RRAh0TwqPze8Cd244OFfKDDAEICSSoZl0S/2l15QyTbqDNVnRzLndJswfAi2yfaVOEkBHvZuDQZXmmlf4VGsJYihVUwG8Y8bvegjLxgcD3LFGNKjzuKP1eAYLcotF84HRaFwNG3hz8Mv8puFMKyrHVKIC3UxzBVaialQqdO3oFRcrLdcSIx1JlY2qhK3BsrUtj0OLURUs0dBnCQS4ndq4NTLSQECFIifA9l7GSPXyOkGkp0+H5QCfjOl7L/3EJ2o+lTisAZggIZSZ57Ig3WxOGp4tgBh18ubr0TRNi0u/VccTbFyT97irQVq+9KNBKwPZZazaWvJEuqNSsdX3WGjh17VTbbZgmTkAwLyuCf+nyKkGUkq6MtRYwX17XkQuhceFpBmYkoxlfSWr4odGaspQ3c/AJ5zFNMigymGGpxOynWRWD5Abo/3R67eqZ9rZbmCqQbF0fkFPxdi1prJr87dubXtG1Zkj8AE/ZGXYjwas/l8NeDYxLFeir/ic+yR2tcU34lFAY/B86IHf+EBSbBYigErIEadb9gw81","layer_level":1},{"id":"7c2ac186-ec90-400a-ac1d-b3b7ca2f01d5","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"后端系统架构","description":"backend-architecture","prompt":"为GEO后端系统创建全面的架构文档。详细描述基于FastAPI的后端架构设计,包括应用配置、中间件设置、路由组织和生命周期管理。解释数据库连接、ORM配置和异步处理机制。文档化认证系统的实现,包括JWT令牌管理、权限控制和用户会话处理。说明API接口设计原则、错误处理机制和响应格式规范。包含系统监控、日志记录和性能优化策略。提供架构决策的技术背景和权衡考虑。","order":2,"progress_status":"completed","dependent_files":"backend/app/main.py,backend/app/database.py,backend/app/config.py,backend/app/api/,backend/app/models/,backend/app/workers/","gmt_create":"2026-04-22T18:56:47.08233+08:00","gmt_modified":"2026-04-22T18:59:21.004588+08:00","raw_data":"WikiEncrypted:N3UbzwGjCC3xD6BrTM0cq8Y9ccVoDb9n1FwE8c3MNy0X5y4Ej4ZnP3KnXAR2aRWtzrMaJkrDRdDMkztKRYWc3Wk1Jzwnfsgqt59so9pKRU5JZY61Wzqd2PzzDU1e10OntPwETdHfAXsLLggvksYCugHgi1fhnyRiDR3C7ABv3U/j9Z+xFbLaU1X2+FqXtTpJMe0gZJ2yDe8YIV05/f1NdFiyt5NDWdtbC4Ib9Y2H52fXoe2qIveG8dUmBzkwbHVu2VM4E9bT7go9y9+pSOyoRwO8iQIgfY0dKsQcvDtHpO5T2plEfrmFKSlwMCiiivasNoz+7ylsz8JGo5nnlfBqTtNbVZX+TrC9x539RAxL6rEZvRxbFucfobivfqV9UKh//2yYFcZ/44GbNjqNQxfF5WXJxxR5cl6crLZO089slohFwSj4xFVRarnzEA+wA45v8N+WhlaCWCr9D3DeX84ssYvMnAzwz5wUApwFIB0+dzG6CyO1yNQOBdcUhAFEHAZDzWi4UMgnwXCHBvsXx9keqXfSQYdPjZC06gegy0IfbeW2XdHsznPqPyE0TNk7R2EJ7Xm+Ky8I65Fbs56g/2k/ETmTt8ja8RfGpRbQpjW231dxIdRNdTNH2W7VkpjSFNJ2KD74a+UFY5G8eSFAvJWuEMLVCQB69C+TO9ML3zzNA5YE6/MzhYsbd5Vz6YyvCBTjMSVufoTPK3n1k/ioOdDzRFEZc8mucNTJBrEu9OGgb0gUFQFXMEsabcloQaO6ZbOBLefSgrAdlSolWRG7Bu4XyCzXOYvqrGKNPsTZQOTbVkOP9Mg6xRN/8jkyY8z/5TEh3lWnKh8ZkLlumG4QfdLnF2LHVp0IX+d/5HvT3GBtoXN+zJ3hMVEVumiVT7qCJz1afiTQZhPERVAirDX6cZ51CSo1FkRWS55AvnICqVpP+fpNLl8zLWvuuOLeA6Ab3x/0rI6b0LNf/UAqeSW64LGHL0YDWwB+G2c5oNp+bYuOVfgmngSUmDdDFHHL0k/KEoU9VN/+5f6KypjM2MYUKMLz9pwbX0qvUZadQCg/thD3v31zZ8ZroTFTEa6tAyAfqojuUXtJ/SI2l+VlpvP6dNjUfsudg8Hr7AQQescm0CN0tOYTOJZ0P+2/RmPTHviifKR/54LVuaTLEJGhd+3K5IhDTvIOhayZi6E4ARpakMmWdVfsGPv6ETkH819SOX3alS7vHgV/auGWsJcRLJinONhxTppcAf3MFf2nq8AGZR91LDCZPwV0hO8YTxygvxX/+uNJhqe5oMGvUjJvTo6xoBkb3JATSdHKXM+lEG2lbnbFjUN+bVRcAH+Qw5FdSl1cHbm/QJnwQ32GeGmAZmQ2TTHE+tdQgZ6yA5dDsvSJGTsAPieIDKEvIql2j+9eoR1X2j1mD0T1D4APKUfgD0zkNE9QeQ=="},{"id":"159f2ccf-71b7-4d1b-a4c4-c15b23a4126e","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"API接口设计","description":"api-design","prompt":"为GEO API接口设计创建详细的规范文档。解释RESTful API设计原则和路由组织结构,包括URL命名规范、HTTP方法使用和状态码标准。详细说明API版本控制策略和路由前缀管理。文档化请求和响应数据模型,包括Pydantic模型定义、字段验证和序列化规则。解释错误处理机制,包括异常类型分类、错误响应格式和HTTP状态码映射。说明API文档生成和测试策略。包含认证和授权在API层的实现,包括权限检查和访问控制。提供API使用示例和最佳实践指南。","parent_id":"7c2ac186-ec90-400a-ac1d-b3b7ca2f01d5","order":2,"progress_status":"completed","dependent_files":"backend/app/api/auth.py,backend/app/api/queries.py,backend/app/api/citations.py,backend/app/api/reports.py","gmt_create":"2026-04-22T18:57:02.317509+08:00","gmt_modified":"2026-04-22T19:15:14.078939+08:00","raw_data":"WikiEncrypted:xKp6XrvgQ6yDy/qZb6DBAyzRhY9oY9wND++XWs8abaIu3G2LITgI+Z0UQBWYGKhuTqBsuTOr5OLyKixlekyR1Xfq7usrLYQyUqykz50fvTC/eHiVp24qJjGIE/yM/QXCeZCQ0Io9avqxwyMLsy7oz+0kRVW2WjLzRO6OrvbiUY+8yPMkSPi3UCtyM0GVLTpD/1yhEPFlJimDIuMsn1U/6MxjS0vcd+yEDjCBtrAoR40VIxrMz5v+dKD/pjfzoR1p6GEjf7b6zpzZGPhEtFmhzIahThZIdAaGShFz2YepbNwjns9s+2XJPvMdDYb5mBTcQCjoCHeUfqpQ5eRpjJ47qGFAfFw7lpv7GfOixRgEasUkVhJaX2fS+R0bGg3mmJFfg8tK9XXCm0OvNdgj+aJ6EUKT7GWXDkWLJd4NWEHKvqO9jfXu7YBJxM5tfR1i4e7CPz16fSaCPJtKsI+HgIoTf1JQ+3TrBqGncHko/5j2BznPg08EvIvKnECTrZEH1ATf3+Dpz7cY5x5f+D+oBDxG88V899fkfZSrXbY4YZJnhO691mRZPnKUgr3TsGO4kK0/eZw19HvuCyKxuqWlpHvV2nWGiFCyQpLul9lskV53bxNE6LCdF4LpQgsnxp3NRkXRo9kqVcTFEVZX1D65nknWMQHMOr91wEbFu5y7eHBY/M1mlvT+FpX/uzM6NvEAUkyKHsIpLihbh/obM0dUOwFr/y/hUOLfs5gw3aMosXT7+uwJRXkzxJlNzCyzWUQoMQbw19Mq53uhogOLGeVQNV9+lYZlsF9DEbUg7pWX1HOTZw0qj0G50JKHtiM0mGIwmRxZy7HDNhqrMGXboadds7LRAL8up6y1uZya4V4Y43X61XVoJJrERnU6caJROOJ+2I5yEbNYOvo/g+dDZf6DLrj/5IPInHUF/rwxMPX3V17obui48Yk9OOgLp3s7TEAU+t97lkEPo58h2oDARfsbxrnrVd0I9z2/IJSBouFoAA5+wGUVU3BH0Wdc9bwTyjJg6t+iiz5Z14RRB6hnBI45qD3U9a5fIJ1mWWGl2mBaOfvJck5hTbq7v+Au4iOMprm6m9SIq8C9D5w/PtHslYGeBDUYeIOWciDfxj90/WlNjcdIpE8qX8PqRFKdnwDCBOD0xewCH5Cw+MxNEuc6RRDsFu6vhFjjYe/vtb6bNc674kCJn5eQOGFAo6+v5wfkkZhG1S1q5EY8GJf+H3HgtucPikTjpKAbpBkkiorIBJ4n6Gdi9Jof2lYe1Ina6yJPsnNyd1MyQgdpEg7sStrvevt6IaMoeIe0vQ+WPecPhqsIm9X4wS4nI7Knd7q8WUsBQfphwlTzUb0igehWxKagmMc8N3x64Q==","layer_level":1},{"id":"9cc59a5a-f597-4707-b994-b6c49514d553","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"页面组件设计","description":"page-components","prompt":"创建页面组件设计的综合文档。详细说明仪表板、查询管理、引用数据、报告导出和设置页面的组件结构和实现。文档化页面布局设计、导航结构和用户体验流程。解释页面级数据获取策略、状态管理和错误边界处理。说明页面间的导航逻辑、路由参数传递和页面生命周期管理。包含页面性能优化、懒加载策略和SEO配置。提供页面组件的开发规范和最佳实践。","parent_id":"d907a8eb-795c-4060-9cdd-50d31cf39be3","order":2,"progress_status":"completed","dependent_files":"frontend/app/(dashboard)/dashboard/page.tsx,frontend/app/(dashboard)/queries/page.tsx,frontend/app/(dashboard)/citations/page.tsx,frontend/app/(dashboard)/reports/page.tsx,frontend/app/(dashboard)/settings/page.tsx,frontend/app/(auth)/login/page.tsx,frontend/app/(auth)/register/page.tsx","gmt_create":"2026-04-22T18:57:04.216604+08:00","gmt_modified":"2026-04-22T19:15:16.963169+08:00","raw_data":"WikiEncrypted:olK3r0l78uP98ua79qDx7UWSmXb2E1v0sVKrAVzGYuJht4EngrBdL9BIbx+A5ZORhmqTgQcMGu36vXG77tjMwegJ9MK9XefvgLB5BmPaKaPjkXjzcGZIN3exIMkWQZHqPl9dd/vYCxP8xt0A5tqhFIvR3+w071t9O1V91AN0BqNpO/fUxL6lSA8LhEwafywlDa3vhGkpsg/FKiN53IDLy8dPSGiFG/Vz8mwss+4NonABky0MwNkdQbJ5ZkwuOqwJDkqpISGBazjjBx6d/ZZkBi9WpS5temsZ0qRK6NZMX8CXGV3QdpCjX2oNclGY1dOGXQix6F55Lh0STLmus+oXmrYyyMudzh7ch9FR+UU+InB1D/T7ft2F50hl/ynvhvJEtQU+Kv7satde3sIFR80axCozia7ebQYJMvFfWXyvyiNZi9pX8/1w8nGouSbIM/Ufe0ER296R+KbaR1x2e35Ajj315aUMNfs3vGLqkIkyGNmYsO3rtsa1uMY/D/HWAZclDtWnBZrFTxFtfjp/lBDgXrC3hezzaP9/gt4F5zcwc2Q/oqa7PJrvCp8fsUNTPWmztKzD1nIDcmonVN1eU6u9TKENaUxs+oklWWy3veyJjYN2oZOSrOE4Kb2iFm5YMPAsKwtd/wPkt0fcV2tDKr/EYqaunXqg8WHkGJmATS4fGwxIpDAo33k4HfxraSabeL7zflskEaEZ7Peso5KKLiY4GZ4cvp7I04mHwYg9VuiKfIGl5STSJwec9Ny5UcsiFqpunEedpK7K9BV1VwG701tGLy9zEAS8LBiu4SLMquX8elDI1Y8/8xfZ0OoVrqn/pTD0CqK+zGyC1alnKHfCeUmIG4/HE4zUhxLARSjQlJjlIbiAQ3E4JGDwE1Ag4x0Lj/0jTDerfaq+2ObgPKSxSTH4aT5imnxqQA5AcADQFe1Y+5BOVGDih6MVDCIFuhXxTKjr/2putI8zkjRlOMDAovunGSu9D4+ZmAXYYV1c8MjqVy7sCXdclIBTzg+0HU1ub0jqaeh2FEc5FjoJT1KKjSoa9GvgUyIvcoqDZY0JeYfNmEg98H1DYBHCULg8tlCWmQTP83Eu3Umyar/aJ7b8x/Zl5zAUeJf1EFFl0+V2tubCNtyej4KhQoZTJE7AmAt28D2lBp6j6fcj5Dd77sfZ+o2M9cEZP/JsFeR2bO2trHzAabYuUMeAb6BJZX6enXNsid175JkLlBhRgVKS1MbOnkO/mDDp6/4TqsWKKG3R5Z2+wYd94TW97PCIIAxY6/aXVCEOBvAjJ9QrxO5gjYvaYvX/kXL8/rGUAswSgn10l8i5Ayp7pFuaLD5U/K5VPPsAMn2wPmQ7sUQBb4gBSsv78y7arVTn1bJNNwxaHaDeERZvOWiqWMIwWBIWrQs83mti+09IyPBsX5NWUJw4f6HuTDD6zEdVpDKXlgfOHNQ3l9I9iFKoBAFTFaL7boH1XfECuootroao/tWjr5aktn0j5GvzoA==","layer_level":1},{"id":"f70f5d9b-d7c7-4dc6-b36a-5f4508e6acaa","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"系统架构","description":"system-architecture","prompt":"为GEO项目创建系统架构文档。描述整体的分层架构设计,包括表现层(Next.js前端)、业务逻辑层(FastAPI后端)、数据访问层(SQLAlchemy ORM)和基础设施层(Docker容器)。详细说明核心组件之间的交互关系,如前端通过API与后端通信、后端通过工作器调用AI平台、数据库存储业务数据等。解释数据流向和处理流程,从用户请求到AI平台查询再到结果返回的完整链路。介绍关键的设计模式,如适配器模式用于AI平台集成、依赖注入用于服务管理等。提供系统拓扑图和组件关系图,帮助开发者理解系统的整体结构和各部分职责。","parent_id":"1bb55e12-24c4-42cb-8f59-ddc303460d45","order":2,"progress_status":"completed","dependent_files":"backend/app/main.py,backend/app/database.py,docker-compose.yml,backend/app/workers/scheduler.py","gmt_create":"2026-04-22T18:57:13.329904+08:00","gmt_modified":"2026-04-22T19:15:17.452724+08:00","raw_data":"WikiEncrypted:gWB8HBj+8+/15rQhXgtMjCy7qJxJBEw3w9EAqc5Otte14+SfcEK3DSbmZRhW2TgD6BlsxDXHpLcSijck/Nymh09xxwlFe9hXY5fsIsj1IZW9egIbof/vmRQ/HkxJSvNy7WDeHEuuU7TDae+7kls5UELL0/oUUiCC4fjizzoaOlqMuOvW/DImO8fA0xbQ2wAt6L3bqB1pcGWvnB10d6EKKhQYmUj8xv/2M3cUBtDMkUdyKbAuduBIInt+jZnOGnXKcr1w3W66u8elz0iqgWhMCsMFd54QokMhn1Uyguz3NcIfEVH6IlKil0ufINdb2d/QV+9aukLvJ4Mq4YDlUjQ2iJ8oxAYYUb8eIjBnsLHPfBnMUyXVAo0tbyNB7wUmRb/L1VR7ipOMMKd9mEohzKGpsTxHpM8my7x8Ryc9N1guO/H766qiiNij1HNCu4rWVW12oeTTjAoEKdLzLyn59Fc4QjYVkS/I+r/lwRtMNN0OGjWXGXea+HUaIHwW1088PW3eZj3FlyGEsTiYb6ysJAWanY2qoIhASm31o8s9DekhdxTRbWeBCNzGN2ufTYGM9ygKNDHF5dCbVW0/Vtc6FC/TDiflhIaDY44Gvuu84O4l7SRBl0jKM8uCFHOgx/NzDlnUdNFaSOdjUBxQ7vVyi0Q5X6P4H/ERPzJQvOa0gmXW7S1ry0P4/CRjOCzq0Afw+mAf2j4PHM/4MWFkvrFkycbEkHWoWnPY+DWYI00TVSdTWjj4n4l9wbj1XDhXavLdg00qHVjv0dTq1ghcZKv3C04T5MfvVQjMXCKPQaK0KzwZDfXydWnlyLPgM8t95lTETMkjjEpIMtiv2w1gJda4ChFrJq27oPmVlEoVzGPuuk2B4YN3z6A5y3ehJpejis1/EuBjd0vXHhwghZeUv8mMD4smRPUMA8GcEeKVs9TQgBHqVuuVDdEAQfE7w1ILarmq3trYAuc+LH1KMUyPD0aZEbhKZdMRkFYWLhfyYeuazm9SfO1BqtEuTVoAXdLD86TCQNmxxTZPgU9OB9JluopAMt1oszBwKK/88UqwBqgUZle95RTKVR6QPn7zAGZaDbfsbYvsGUfNBSH08o6nnraxB0Vpj+r6WaoZLCcxhqSWoTp60YlMt7BDsla0Lt8r6D+a89AtCqZOHLJbrEx6T4wsmiykEi1uC/9XhtcsTHuytq/rHeDWR/bTToB+mGjBipoGscvIFMgUJonYCOjLDyBPGpeWispYZV21bIJQtFIYv06NKYU/IV9ZISLel9AttowTEXv/Y/U1xRtmaTp3BgGI4iRdwXYMJICv7Jyr5kYd2CrLJQPzEBdkJi7+q3WNdTCWBPd3B3hL/tTL2lFNDOc1sqMga78PcdWWHQfheORW9OfH3cDRiq85LJziojysfwkQVqHY7niPkDyphAwn9F2xZZl9ZfahAaU07CgK26wyavgkYOAU0dlWI6WrAKE2gQOzOxBL","layer_level":1},{"id":"816a2805-76c9-4f32-a3cf-96428208081e","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"数据模型","description":"data-models","prompt":"创建GEO项目数据模型文档。详细说明SQLAlchemy ORM模型的实现,包括模型类定义、字段映射和关系配置。文档化每个模型的属性、方法和业务逻辑。解释模型之间的关系映射,包括级联操作和外键约束。说明模型的序列化、反序列化和数据验证机制。包含模型的生命周期管理、事件钩子和自定义行为。提供模型使用示例和最佳实践指南。","parent_id":"243a1a45-d31f-405e-a3b9-694d2fe617d5","order":2,"progress_status":"completed","dependent_files":"backend/app/models/__init__.py,backend/app/models/user.py,backend/app/models/query.py,backend/app/models/citation_record.py,backend/app/models/query_task.py,backend/app/models/subscription.py","gmt_create":"2026-04-22T18:57:14.161024+08:00","gmt_modified":"2026-04-22T19:16:35.092798+08:00","raw_data":"WikiEncrypted:klcgW2PbPxJambbKMzvFtzxL0nPpsuPMPxr5hj83lS7zLbVY013R4TC8XNEUYbb5qxIyzNIzP0UIL5gcgWgb2I1H/zkTZLUIt5Q8FaGG5df/WBhqzCqyAPPa8xIyWPfzmckjD/ciao/Odmp26hYmiZaUfY04+hQgG/SvVqQHJaK3xfn+IMLkqHHgKMNRTHzng6LCRXTHlXRhXHX+mR1t3xxlS53M1kGU/3OC+gxRPXiI1do2e7R6mweCSy7q+DHMOad29LVnmoOlnK0nhNr/o9GqvDhXE1m/7AFT/B5q+cXCwr8ysfhru2lFLdHdaaZO0pEpADVKc7xmWmzFTaOfq+wVN95ixxIjo6XLFN5+9Rwtye27zDvkmouaHrmGFCw/QKbsVlcrOOLbvyPV0sxnayDeP1+/IwiBVAy/jUFRK9MzPUgslk0toI1LtXVmZKzKIKHms5iOx7bIO6u+m51Z/Ky1Pn+2MQKpmk8s7Cz+pzvIs1wbLo7ksk0vIN5HKvmxGPj45VwsABnnkBO5vPAUQhgkpfU3CNAQB1OCJ3sudMcnU9S5ByuyxHvhuRsJtzaJ3LxTcD7qHwFUSfbYbcrYLdtgFs+H6VY7Jb8z7OR8Yc5HLD021Y41z9AlTHo0Lg7UHLakKDN7h5j0UpjgjNu+miZY5QLbGz0Riib2pVXDNRyfreEe052k1IackpfDqdZOOGg7ZJRFtm4oh0B8ZBQZSOAFJ5HMrk/1DRPDIi17sXSDGCXLriG8XNCASQUUUdXEwCrmriUbP/d3hIMu3maQdE5zf7Zsf2JTcaE6qIVzQQnlK2cXvqDF6ehoYQTqX9dr2MDcOin7HvkxOz6ZsBWG1iU4Jae4K2R3H9oE3ifOymUv+VzBlrj6ZDTscoF0cgwwd8+YjeE/S2QAQLyZXp2mUBVkRVbjJue6mC1nCdvvNTMhDFLS1FHZfZAfqGvHikcoZoYLo6AFo4VEMwqirkJVitLTUYDLtQgw66mTfWayyYrAoN69gHO+XrIvT9UF8oXQMLnli5wNzBtvtLlFR4aV+xIHZUtv/19ysS8XspHgPFsia5qXRPVH5p+0b3drONQpmWt/kg+5IHl4MDI6rjdegulFFkPBcki/NsZYajF5M+UhR+Bb0Z/+wgcIdFrQifArRXi0XGPxQ9HczdG2R/v35Fihp5Tuj0SLb4YElp2ZLc//zSoEIPdloAbbDYeiPHgx8/cE2NvG6UdUK8AHaMNOATafLYSc0vvxkeMfvf37HN/uPGyIH0nPnQEGIGJncuz195GmTfQcXRjjZW6w7VogwQ==","layer_level":1},{"id":"64cbb894-755f-47b5-854e-c26c7821e9b2","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"文心平台集成","description":"wenxin-platform-integration","prompt":"创建文心平台集成的详细文档。详细说明文心平台适配器的实现,包括API调用封装和HTTP请求处理。文档化请求参数构建,包括关键词处理、请求头设置和认证机制。解释响应解析逻辑,包括JSON数据提取、错误码处理和异常情况处理。说明配置管理机制,包括API密钥管理、请求超时设置和重试配置。提供文心平台API调用的具体示例和错误处理方案。包含安全注意事项和最佳实践建议。","parent_id":"7e66719b-4a8a-484d-889d-10fdc76788bb","order":2,"progress_status":"completed","dependent_files":"backend/app/workers/platforms/wenxin.py","gmt_create":"2026-04-22T18:57:14.59287+08:00","gmt_modified":"2026-04-22T19:16:36.925806+08:00","raw_data":"WikiEncrypted:f9V8T4at/ASje76Nwqwyb9VKSms5IpkiE8NM6ot6FBQ2Xm/W7xVNoD2HxtG0JIBY8fzg5rfp4P19y9GFWE3P7uI+Ntusv89zObilbespnCZi9lgSyzvJAmMy2ZXU36uG1n/fT5ySk4uXzAeM03IITw2ki55c7blR7ctykkDRBz/+KuT7ZF0DOBoduWD36B8eEgythbdQnQk6QKdUO3zYxMKpkeC+pXgvEdIShh1qARe6y4tQ2QvzqtKnSFLAxfQRLFpZ+M74S7WgYzFsfmB62qvpFd6iqQ/c34o/BAn/Hk+hmijJtD7JrbAb4BZHqO3M37l90T1UeUJ7ca3kxzzUVlBhJelV2EEMzu0TdG94oRWD/uUH+ghzekg7V4QONvz6FgX6S3g5dlnRmJ3uGVAb9UkWyg54V2vm4Flr1Rckut7P+eI0PwFYHVVS73QDzbs8rxY0qTDqnSVx/avS8kdcv0Trke0k4rFSsbgl8gVc0YnalN7uE3aWOFqG3L4Uuv/doKg7kRTsuNOHcemyf3CxJKAWqRGnZq6kAZXhAIPB+TVfZtUZBfqXceE8XhFx0TzfsTc/CyJPCD9cMLl/dndwGVEVjImXOv5Z2ILdMDbyiHuP1LNmS6opA4RZav4bChAA4vMKcLsvlpy1m2JXX7ZrbSoaoyPlArsF4y5k76zolOB0rT3mchlZ1RuKELnC3Zx5UyvIIpY7A1/YhLy4OGGFi09mrAxAr1U1pmnM8Sefd0ZG8wLo0buXQ1yyE8pVZh/xwTuD5FtS813EB8K7f1KSJbjHW9PaaCtfFr3QVUDhXFZQOe/pjryeUUC/FcKCnLNd7YGb6sjFaYvmITf6kZQnmulBS/erxUZbTiXDrI5vHrG8/FJATWl0MvEiv4xMovu4nmOJtjrbhfUlI/8+JzGdmo2HJ0v9Nle1SjnYXJuOWCTwFL5+tcYW9KBcfsxRdQ+8L8vJmfBQ+utNXUpmYn+DimavX86+plxrth8vKszohk4Yyvid24iSykfrvEBlbR1p0hBCSfT7knct0F5qUHa+Msj/zGpopBE+WShRW5LA6Pm4DVHTlwZHViJfpOH1tZZU","layer_level":1},{"id":"412f8cb5-54c1-4f32-8966-fa0e5e75bbca","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"性能优化","description":"performance-optimization","prompt":"创建性能优化的详细文档。解释调度系统的性能瓶颈识别和优化策略,包括并发控制、资源管理和内存优化。详细说明异步任务的并发限制、数据库连接池配置和事件循环优化。文档化调度频率调优、批量处理策略和缓存机制。提供性能监控指标、基准测试方法和性能分析工具使用指南。包含实际的性能优化案例、配置参数调整和故障排查技巧。说明如何在高负载情况下保持系统的稳定性和响应性。","parent_id":"7416db23-312f-478d-8883-2fc3c41ac2e8","order":2,"progress_status":"completed","dependent_files":"backend/app/workers/scheduler.py","gmt_create":"2026-04-22T18:57:25.383759+08:00","gmt_modified":"2026-04-22T19:16:37.81704+08:00","raw_data":"WikiEncrypted:9uOBpMbLX4DyZqW4us3Wm3Q7klXxmeD+JMMoGiSO2oNryWBo1gw9kLkawvxQIW9CASZSiyAjiA/zeT5DwD4S8PDqEsVNE73i6DrCAWvPET3MMPQasVfJTaLge2tk6gbYlx3R6JKZcUoi06jS7okoLDzJAFru3F6zguqySliKZSG/00oFVcDHXlZZc0L7hiq11k1jOD8uBl6n35lAvst/AgFv9MUzrhf43XDwtHiMAxjCAkwKnrWOow44Lwzy5fG3nWKZLSHE3/CUmZ17U3GmEqfG43ai1yloAkMou+sTRIk73sRdXPDze0HhNdNfNXTaOHTxW0gT2TwKGHgG9Jt0Y+1qWq4Nxj/oJTP/hztBLy5SEPndXXqeZTkBaesRTr0adQv49fH0QoFV6D6dxlEOodMiFhvvYd1rvR+HwbQbqU3W5UDVnKfPlMXHsz0a9NPu4aGgk5yevh/s0AP/v2R8mgz3N41lETHxk6Q71f35L04S7u7P6MlorIwKzkeijhFf8sPrChMYX7dwf8dWba+Nwm6fgb+9AbSZ4VczhQInnbiv+GUKiFnezNVSHUUXqTCvRIuhF52jqnOqjPei/1oeS7xAMmB67o3v2so8T17xg94F9FoEl2XuuwA+RFDarVZKACDTPxjt70OXdAoxoERTZ3ivU93OANsuuWx1x0HgFdBj0q6seNC8cbySc3ZuQBWGu1YWMmyIYGL5l6L7CNSmkkl9/pkb1TSfkyM+Hk3VLXy8VIvtgHxGX2OU8yX1nX0DCGS9Yt3dK17lAVH2XF2mo39noQPG2nxjOc+lO/O9cL/CC1Bqzd51YLHapcRLPPbuaMT4ljyLvQ3GMvKHB6c0sjdaKjykN96LhXpO5PAqs3N2edkVKVMC6lg5fTBMZi6B8r4rup3M9CPDs4ehmVYTtnZpt5zKxyXP8QfTO1FfDyNQRpbXj8TyLOwwqEFvZPQlV7Iupj3lpi6crQhtpXBtU9M+vjP31rOrdFpBHXCckE4T9QryVWvQuNDjsc1+tYKLgF6S8ixDQFCHEAfzctdMM3iiLCeBy1szBZEZTE+OS0ERSbgqusmZBkz3ouKp6suUgXLJp3Kystu+dAVWhA6BAD2WHT76h+Hbazixj8F2qAoxmUb+P8Z7u0grbWJksg6u","layer_level":1},{"id":"40ac97e8-7ef0-4198-82d7-d2e332be9d34","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"测试最佳实践","description":"test-best-practices","prompt":"创建GEO项目测试最佳实践的指导文档。详细说明测试代码的编写规范,包括命名约定、测试结构和注释标准。文档化测试覆盖率的要求和测量方法,包括行覆盖率、分支覆盖率和功能覆盖率。说明持续集成配置,包括GitHub Actions或类似CI/CD工具的设置。提供测试调试技巧,包括pytest调试选项、日志配置和错误排查方法。包含测试环境管理、测试数据管理和测试报告生成的实践指南。","parent_id":"fc6f24c3-594e-4153-854f-19250834eeb1","order":2,"progress_status":"completed","dependent_files":"tests/conftest.py,.pytest_cache/,backend/app/config.py","gmt_create":"2026-04-22T18:57:25.616954+08:00","gmt_modified":"2026-04-22T19:17:48.81542+08:00","raw_data":"WikiEncrypted:3lrOgsvw7LaJXRS/Bz00iEsb4RzJUAxxpmqaBblS/51b52WVRQtf4YGBQ9MC2MYcYNyKxRGZljd03HKmm078aoRU+suxjG3HIqwkvM6ruyPxwlLdBEn6ogbrhm8eOKuGWjiEso+PrOqSXW0boT4qGE+/L4MkPiyeOB9YnDB49/ByvDHsjeesTQqGwpa9FmIQtVqpqDZA3Sx+x8TB+MSqT5PMZ4egRgCW1ODcidZrTriWvseFNQDFLzo8g2H/HF5CFLcVsZVK+kWI7b7oWLmNlIKz2SyVJuYqvCblPzw+/773Wv4RVHYdK/pxISCon/L1KjPyfZjddr5sDjJO7rNFbBshPxUIQhtXnnAEqLOpzZwHm2a0bA3vSR42bZZoSAY0v3aZxXQ5IvxNT/aNAmiFzd4SkTlz0okDXnBsArnOUpLLRfjLhxt5ueRUi9Dl2edsdycd6XznT6/oAUHTf05zhhKC6JR1OsKiFQyoo0il7LYjDxXJM0dZycDlENYwZ3Bd/82Qr+7VNmgpLdnB/7z9DPG9iou6TIpztKrdSRYqWBcl75qs2L/R2Sy6MOyfSwALTRUi5udf8sNlsHOk5y2qY0h7vd1GzYwtxKQ63ypJLL/8fAcPKmH3FCwKvrN3zuEu0Meyq+y2v8eYeXNozeOa2zum6fI5sw7hnzX9Jqy7fyQD2yBFqyylQ1ZW3nwFd9liZLnWfm7zbLDlqSgzGYGxvNIe0X2rhwsthMZTLEXOZVDW1/NqHg2E9qXOfg7XhQRHKZz6Wu8eZ6MGyCvq6ft2SJI2vltHD0M4somneHGSMo4jKY8rMeGl7qkW1V7aaurBnh0xp6cOJ25IdbN4VEDYm1Oj5nlM4wnEQzWiVyEqA+3oU2k2k9Plm/xs6g846/lBJxHL9ztsKmm0BnrUFR1ttgTVRAFvHpfkmSgLGGB/9824DJpxXMiWnExCaZzWbFYPhXnDF6Kh3SB6P3NyVwVdC9/pkf4/UQ4Em3rvbVuWICjGSScoDtOu5MrHDaUSbtN/XtqOptA1ApGbnTSKxOm0KAck4ApFPdk6aRLdC4eRf9XWsWUaOFjkqAoU0Kp035pHaGrCrx4KmgoKBNFNbS55CA==","layer_level":1},{"id":"41a414d2-e13a-497c-8a03-212624dbf5fe","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"引用数据接口","description":"citations-api","prompt":"创建引用数据查询和分析的完整API文档。详细记录引用数据的查询接口、统计分析功能和上下文提取机制。说明引用检测结果的数据结构、置信度评分和品牌识别算法。文档化引用趋势分析、平台对比和竞争品牌识别的API端点。包含数据过滤、排序和分页查询的参数说明。提供引用数据可视化和报告生成功能的接口使用指南。","parent_id":"dd12cc44-0c95-45d5-a726-e7b8bcf2531b","order":2,"progress_status":"completed","dependent_files":"backend/app/api/citations.py,backend/app/schemas/citation.py,backend/app/models/citation_record.py","gmt_create":"2026-04-22T18:57:37.836961+08:00","gmt_modified":"2026-04-22T19:18:18.055339+08:00","raw_data":"WikiEncrypted:qByx+WzXalKNnda2aYUs+Mi+kQm14b3+m7dy1helFRbYWzECOnPEzHl0ufCZlQvKjQqSxHIwqppPXSdvXYc/8Z7buvJqBV/Q/faiP/SBsAH3RrfF2Ppti6QanNvcAtBLcojqJkmfYWFej1OYdagzBcSAu0xIIA7qBG1LwkdNG8crxSwebM8is42SnI+aRvlbF4UdAqHHPdfUvnzs7zIODnildIoR60AvLFeNEWO4prQkFyS16p1YH96SousrFgBu2YZZYrNOOhDXyrRoW3TE6990oaIi3Xe0B7jFtC4pce8JamwzT8B33FAJ6utCOBMUkFKq6l0kD5rN2owZaBtGc4Q66Xcb62y3arqrvxcgE1ox1nAp2D9pNqRy3W1ePW2fWZk4+3co4z2+ANQ1JO8q5eAFI6Q6zG7hM4rvNlL07iD+hZeqd5+vGw0KmjkN4VMqJC5ypFf5UCF4qHgB6TS9ToQUAWk6HWlwBR1DVpCcK1kyGcunn6EiivJyjJLRYUXI66AmajxIzRHtyhxBnA5Q4hZNgr40jHMoUbWHmiQTQr7Ca4/VDS2V5FWlm6K1fN8xWRIUCI3VtH0A/wG+QBnJmF5YeqDZ37Nx9vkiaO+hutXsGHsjwj8+IZO/gpn6UT6QpOGaeqGl37HW+lMZSRUqFFaLg7jxlzSa3IliOyZI7N6xjFFFTrLV1ShVsDcWDg4eXL2IjJ7QfXjmD0vq5mH8mkZK6HbhpNH5kFXDuMYWPIHAXUk39ttNvut9r22RLpkXYWtxE7XoqXW+k+Edmt2eNvZImq/e7mUwa82Cae86WiRtz7B7TJeOf96EvN6EQBg8E8KT5Ckd1exHhFtySkw3tYfChBZfD75zY7tUcZcC+McO1Kf0ORqTZtnNjVnot7wirysiS6WKQ3O2L0CeBUUV7DlmFd8xAgJ8YhtHJKulJ2B0yCCswfb+PR6u9GKFVK1EcspZe5BsT22vlhQyAJxlqiAi9xRk+XaCWoUT5ymT+KMOXdLoB4EvD2ftgXy5GMxZIK2q1QtLAYEu7nOBsq2aNAg9i9IsVJ6OlCN7VMzDinzkoC1IAWKxKE67ZeLq/VfPmCqLKGl0z1JfkfC/kU8KFA==","layer_level":1},{"id":"2f7fa0ab-cd3d-4f45-a1c1-389d5a0c2561","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"开发工具","description":"development-tools","prompt":"创建GEO项目开发工具使用文档。详细说明IDE配置和推荐插件,包括VS Code配置、Python和TypeScript扩展。文档化调试工具的使用方法,包括断点调试、日志分析和性能分析。说明开发辅助工具,如API测试工具、数据库管理工具和Docker容器管理。提供命令行工具和脚本的使用指南。包含开发环境的优化配置和故障排查方法。","parent_id":"2148d7d6-25c4-497f-8894-c4eb7a0d2bd7","order":2,"progress_status":"completed","dependent_files":"frontend/tsconfig.json,frontend/tailwind.config.ts,backend/requirements.txt,frontend/.eslintrc.json","gmt_create":"2026-04-22T18:57:39.374817+08:00","gmt_modified":"2026-04-22T19:17:43.353691+08:00","raw_data":"WikiEncrypted:F3QgleoEfoy16cQggYe9CzRj7niAsR4WPU/tuSJ2vBrZ49vjzLlsqusYQAR0/FVC/Mfa58hrglY/tUSn8LBYDGZlVr/UyLd9/U09SEPTjzLPzOXWOffceGYhaM8E9Cx6c+FHZRQ0fYUDQXxWM6dQF6WQbUmiZISlUpgtOkT5wX0oc/n1YeDUxEpgiCWnOdIBH6SDoRDdGUFrWdqF66bEdplp0Yy3VYVBKKwUy1XVXtLbdv1T5/0TVJO7EtkHdoheIwKCPIYHsaJqBv4U8cMNegSJ1Ti8bsgUakd6FM/X0ybfTay+IyTIqYXj/dS0tWMm22zjLqYmw59+s8gJ7AlgwXhqYhM5Ycwh/PNrDHHFbgQdt45DjAaMWjrjXrbIvM+kXuSiwxW0dEvQtouckPTVohVcRWEPbg2o02/8Y5DzmxpceOC7KgybfaaCQeJHbg9C91itVc+0NvorhivJt105EYs1ndSOla9hoFppywKIbIM61cvqgHjsJF5DrN1pneGmTtYxijl3J/QpJHn5QuIBR8ugoHdJ3EVjUR38vQReVBeDxI/VMe8k/l3EI/Zk7paXexGeTrJmmnZI1I6WbPN1TPS4nLFZWwkA5ZA7wMkdHiHdnt/FZGccFyq8X9Okog2xv6uqH6Kwz3hseWlrSygNPzDr0cFj2EQqDH7+xZDEkAvTuFLHn+HzUfBv0vfZFa/FRg+5/agC9EcMHM+75jEvtSeeHXHOLpuuFcyOcZ0IQP99QdzSEsLaISCINs5SKkzKAMQnJv4PEDo/vFAKBulCSqjXmLeyhcKmCGqafN7IMWUWF5pmZuXe7wL1F6n+x3+RvScmsWND74hQhn0/Sn8kpFHJ5xV/5t0GDZxWybDFRRuFC8oImKyB+6h8CstsERuFeiIjMv2TS5lz8+eb1/yCUkGO9X5mUpJZXfZ+0vu2SkEN3WR92tM5Di/78rDlulwZ4oykT8NzYMTzpX4WlgUfazNKLyIhSoFZcWUyOFcU8IWCoOdrBFn5CSpe0VXbOlP3pAU1Lz6Y016JUHo1t1YE9xU/m7OTxhMexA8jCoSswgGT+Cjs9u+KP1ji2RSyZHQ6","layer_level":1},{"id":"2713d5c6-c6b0-4a38-83f6-56940c2bf695","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"监控与日志管理","description":"monitoring-logging","prompt":"创建GEO项目监控与日志管理的完整方案。说明应用健康检查的实现,包括服务可用性监控、响应时间监控和错误率统计。文档化日志收集和管理策略,包括结构化日志格式、日志轮转和存储策略。详细解释错误追踪机制,包括异常捕获、堆栈跟踪和告警通知。提供性能监控指标,包括CPU使用率、内存占用、数据库连接数和API响应时间。说明监控工具的选择和配置,如Prometheus、Grafana或云监控服务。包含日志分析和故障诊断的最佳实践。","parent_id":"803bfef4-3985-477e-a61c-915a246d0061","order":2,"progress_status":"completed","dependent_files":"docker-compose.yml,backend/app/main.py,frontend/app/layout.tsx","gmt_create":"2026-04-22T18:57:40.355514+08:00","gmt_modified":"2026-04-22T19:18:41.773778+08:00","raw_data":"WikiEncrypted:HL3VqGjXq8A3aGeLxAjVPg+lnGgkT5PNghnzp51sgLDjuJwvzPZp6KDp64sXTqk/PvlUYRCEe6pgM8WKdtus6ThN6y8bzS650UmrWXRgW48k0tbm2PEPd8NIqpzEYwRwyuzLECVz8rV+mgvy+OHzvrt+wEQeT7z1uljirnxeLZWJjIrFBr8Q1T8WQ9InM3Ttnvm7OYO+YH2Mqi6IC38bW7w4WGqApS+Byn7/ZrJhR3B/XWh91FPwq0GRUJ9cqrNuIcYtnWAfVIHWOe3iET8Jw+Un5x7ZRepcJlINGIIMBE2hO7UsbC/K3z8rkz7mx6uoPTPpxkKkgoQQ1OAsShE/wpHpRYSOJEnV26GFo4bXBTk6xJYw7daKnJVIYDSqSrtJQI4yPlTR0OtJescXSLobznoVSBo+L+PU/nRvotp5KzX0SUpbkqNzGychqcBuJhpS1eaEP0cTBjvjC4MJ5Lsye51X6aOdYYC7tBWHxtgBO93tkpcIRlHk8Dfmzh8nKcD0rPHYGnaeFpzXgGH7ZfabAwxiMhej6OXWsfnbHGg4gheWhXfokxCMKkFnzrsYcuFtB0BqUeadjP5LArbJJGeyVEZovmPxtzQ5z/ayxJs+oyc0oH2SMXCFtIQv2h03ZSOCkohVRs2oTJnMI2p41dY59B5qiSOp+0qwxTWL9NnpqM2gjlLZhcgwF//R7ag4ndECWejInOcA9Ayvx6cPAuH6uEoFTcUOCLaOZ/u9T8890S5KHS7PcNM8dEewoFviz/mRiernAhd08l7a9lR6zck842Ywi5H8+fuuHyt64Pwco/+52MhD01pkK+HWSR0EqPc8URlkOKjQSW0jd8E/9ow54aZA0+1Vto3d+Lqi/tAOlhRF34rIJgTEN3f/udCEVycON9KNtssYzZVNPdvTkvzPYdUHIcnYmz3jbQhnYnrYvuaWNvO0cPISLZI9szxLP8IhmUc9xT4U3OvoRfFka8TABGicEUAF6vpH6H2rCqnWdBydaTpRTa3VAR7QJ+M0aPlzeKov93eljMa/djYoQo+w8Rm3A9vGmGXJKfWdZobh+fQgc38Z/0yRCHnIPnY8o6CDBfwbANfjDRpjyVkqWq1cuqYNnMul/jpzDS9vMSbMnefISRuF0kH8XS5C7pIB+WFn1vxeYFBYED7ZI4FD9pxxS6GWGcYOXEoFcqtR+lEiMdj0Q09jo1nEuMKJbPQre/RG08O0boFCzF9KOSnS0UA09/82vFQyQZKHNwpz7OkZZa2cX5X1L/pdsDlDRoIdp2lzyAEOidStaIWywEj11EYVNbG7sK562p96Sr15ueIXP0s=","layer_level":1},{"id":"c8a468af-2982-4d9c-82c0-313b5d2ee89c","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"第三方集成","description":"third-party-integration","prompt":"创建GEO项目第三方集成的详细指南。说明新AI平台接入的完整流程,包括适配器接口实现、平台认证配置和查询逻辑适配。详细介绍新数据库支持的集成方法,包括SQLAlchemy模型扩展、迁移脚本编写和连接配置。文档化新认证方式的集成步骤,包括OAuth提供商配置、JWT令牌处理和权限系统扩展。提供插件系统的使用指南,包括插件注册机制、生命周期管理和错误处理。包含具体的集成示例和常见问题解决方案。","parent_id":"b2bb2e3c-5661-497c-97dd-15bf6ee8b7d4","order":2,"progress_status":"completed","dependent_files":"backend/app/workers/platforms/base.py,backend/app/workers/platforms/kimi.py,backend/app/workers/platforms/wenxin.py,backend/app/services/auth.py","gmt_create":"2026-04-22T18:57:48.68499+08:00","gmt_modified":"2026-04-22T19:19:17.361215+08:00","raw_data":"WikiEncrypted:WxCGFGSl9zR6IDeUdkqKNACFcGLyx5HNn0UQzHtkOJVoVN2BLrMtPbbNkfhYYzEQGaeK3o4fBODff6YTXKxAV6HYhCHjmdXJqBaBsEPBB205lzDAllfBZL4/6ljz+/HZSgaWAxPECD1m2GUFvjlKHTSXEb0x5iVOg9R3VDjYQgKl1SF3S/AuJj7QBbGiwmkyPrqO8+NXDlKH7pI3G6me5ulZrK6M85KSH8nVAnqY/Mvjc6UGQJBwS1QyKJVzzK2JwKGhQSSLemxD887b22bSe7q1IEDRYcpqkbfyICB0zF1Gg1h/cAfQgzjiG0+MQiC5CF3QwkFteFbN4KZDEjCTcbIR+HqI+yCs8Wue/MwdoTYQQKpR9FyClONZn5T/UqHQaVT8SemYF0QC/kawyEZFH5Tkj/6RwS+taTWw1fx2QC69xQlW04ManahzsBDwfz2W4RkufM3ZfW8HAN7SorY7oYr1Vam2p2u/93jzHmi7PO/Y6VphQNACzUlfRYsPALVBkiqpN4TIiicrjOvhgATUxqpku2MrAtbXTkiuiiQBamK/XrF4JNlh+79VGoHKWniah1nvo+dzl7jll4j0woKwWKIzmfPXLS68HekW9h5BH9SUeuyAEW/pvnGAUw8Od3CgsEmap86k42Tg9pRZC/sT9bCWUbjO6ijJ9IPAgWE6bkLCu68L2BD1yKE3gfLg0hJmELn79lHaFCUc5jlRdJ4HEsalAFGS62beLGkude98NvSY5pQoO9jbTj3Da8t6Yj8p97WtE73vmWW9Pu/YyAtxJH7Cdwvv9mbvLYVnLzUWGwsaiaXmDJiqfSHiOrHQNyonHQa8N/LYrbB8qBSUmLyBUhgI1YfYMa+zNfCaeHvRLlmVZpui5MOegWen1Z61WhPc6WoFYHyFAdgS7k21cC9jVay3u87SjSzooFT3MJjN+yMIjrQ5U+tVFbiBQK7IGPLFHRmvFBrBwSFVBI5VnCxn4piz7VBp7mm3e6N3CJUKShQWQT9tmUIRXLmmzsKTit/kRAUrycFjixIK8Hm4kSwtVBREbX3opXE6clXKGVB0bpSDUzB8Ae7wOPE8Gqo/ewy3kh2mdNnvI3+MfOOgPc+Ovqu3KGFBH/MYKl2xIUGdYtEHfHRCIFFVVknX8+Q+tfbkmo/Tw+kJfq67IQO6VT1WjP/q1G3rOhp0Ah5h1wmxVfdIaHSUOT03yQTBm/tqCXlgUW7rZbTc2wF0zdUUWleQoq9pc14c0F2SNFCSaQNLhxvfeC2aH8O9nuZi+kVb+GVV4vWcxcz/7dfTkXpogDwy6uqVHySe/TAn04uWlCabYSrA3ahnl0VpBmalBU1dtaTG5apgcCJ9PULyHWKf+iW0vle9pOVgZQ4oUv0vXxDpZQkO1SOBCfKG20swUEItxbAxIVoMowR52maIRnCKh3g18NF3JUZX2ptDny7A2gmsYWU=","layer_level":1},{"id":"d907a8eb-795c-4060-9cdd-50d31cf39be3","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"前端系统架构","description":"frontend-architecture","prompt":"创建GEO前端系统的架构文档。详细说明基于Next.js 14的应用架构设计,包括App Router的页面组织、服务器组件和客户端组件的混合使用模式。文档化认证系统的前端实现,包括NextAuth.js集成、会话管理和路由保护机制。解释UI组件库的设计理念、组件复用策略和样式系统配置。说明数据获取策略、状态管理和错误处理机制。包含响应式设计、可访问性支持和性能优化方案。提供前端开发的最佳实践和代码组织规范。","order":3,"progress_status":"completed","dependent_files":"frontend/app/layout.tsx,frontend/components/,frontend/lib/api.ts,frontend/lib/auth.ts,frontend/next.config.mjs,frontend/tailwind.config.ts","gmt_create":"2026-04-22T18:56:47.082624+08:00","gmt_modified":"2026-04-22T18:59:54.994275+08:00","raw_data":"WikiEncrypted:rJ/rIw0gVau8jPGqKFBAsMR2XDSFypkKHZQ6YBOgiEA0UOTwucBLEBMXoN0zA9Bs5lWPUuoWW2QeM8S5V6dxWDHhuxV1hyEK1ZWidiLWXQ0Ty3myBMpAD2c6K4k+WBXTzbB/LSiT+eBspY4JDrFCERTHesMlZxmLkXoBxHhs1tNBUepc5vLakFhznlq0LnlxeL4rgh3sn4K3X8SUOtyfPLTTiHiYFX1izFe8OECB2IMK18WRZ6wEf8jE07MjvB84altM8K2LDZJuJzb9sVMHScnXdK5tj0h0e6umXrJaGJBmvoTYNrHRS8X5aG6wxHFk2++zjoVcgl0sn/xqIsLYfqvsbh5vyhZbve/rnSnstsC+sb3Y37uzU9GHpU8FurekIf2vv+ay2i8fI8+VjXnE+QwD5CCdilkDU/9HH3AB7DhbDIwtq4BCfsOfZ43Y2qHzi2YQIjEXtFPC1VmHGRHr8xER65CLZAA8mbMjuchuGtp3BACUF1qd4eAqJ/FgbGOAK91hIqJ5RCKNCK94pbyxdxHrk0LQZ5Rf4snzR04i3q8QgjkGVcb5g567ADjq1S0CD6cj02MH90QJKtQxxq3S77qC5VvUfuqb6qSVzyBIHgjg5XOY4yyA7M2hklmuVlFPgpiCV+xb2G0p91QgoWdUnfUvJ1jeyMVi7sTqisb6pzW4v+DOhMfQ9U1z47f5h41KqZU+i+xLwpeOZYvm0UNtd49SW9uxOloegNujRtGRYoooiPmjed11BdUxZfPR4zr4ZOqMq4zjmz5Enx6kM+9X8hZOPnVQ5CnZpK/WSKI32z3A9cFhmwVRLL2c8w/4XKbLREhUc7DBaViUi8oFpl9P987cnlqqptMKQmCIZ0tOKbkICKr7JfWGIAsxT81oc8qS9qUIeXlBpE5JdUQp1Ie1EoaX5wxX22DELkU75cKmIBHu+67dOrltjMRSKY3ZBmjzGuNgpHMZ1/9X8mFHbppwoTxTgbfBeYCWbgKe7rOhN5mO0h9XscRtoFe1djDYATYo7A09YiS7rQ2wP+FA0m7wEbLvAesiRZYI8ZDzVOgGqdkP7olIYqRcgjkJ3ZEYVOP/YwXprUfvhj40s5uHRQgN1DkVo4GaV9bQFpSHYyuVvJxLpzL4PIa1TC6wa8n9zFrUoUr+93RnWxM9L4G2oS4S54a+tIpxJWsI5jaKT05KwrFYm9u3iOaXy2gZsoxdtiHRE/Esu3FvYkFxZpCgJXBU0L5PL5lgpfZGzQxP6184e3cD5E7zrBWnFpTCdgoFMXl1q6lBqJQVQcpijAleq0R2Amj2pwxLHge4ttMUkLwDlNK5xdQgith4x1GgzvXgndvlRn+E0U5SY5IpqM88QcfH0T3V7T0CEYhYBCSGHolS/i2X7yPjY7JlhGmEgHh7D0ZXq/+GRLa6y+jz0mq+BjNauuMGqTkhaZbR/M85ZNbyJ+s="},{"id":"9eee7fab-6cd9-4ef3-9415-2f8137f1d199","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"数据模型设计","description":"data-models","prompt":"为GEO数据模型创建全面的设计文档。详细解释SQLAlchemy ORM模型定义,包括类结构设计、字段类型选择和关系映射。文档化用户模型(User),包括用户属性、权限字段和关联关系。说明查询模型(Query)的设计,包括查询参数、执行状态和时间戳字段。解释引用记录模型(CitationRecord),包括品牌信息、置信度评分和上下文数据。详细描述查询任务模型(QueryTask),包括调度状态、执行历史和错误信息。包含订阅模型(Subscription)的设计和用途。提供模型间关系图、索引策略和性能优化建议。说明数据验证规则和业务约束。","parent_id":"7c2ac186-ec90-400a-ac1d-b3b7ca2f01d5","order":3,"progress_status":"completed","dependent_files":"backend/app/models/user.py,backend/app/models/query.py,backend/app/models/citation_record.py,backend/app/models/query_task.py,backend/app/models/subscription.py","gmt_create":"2026-04-22T18:57:02.317816+08:00","gmt_modified":"2026-04-22T19:19:19.281909+08:00","raw_data":"WikiEncrypted:klcgW2PbPxJambbKMzvFtzxL0nPpsuPMPxr5hj83lS7k/WfePQWgQNKbEysjyVqFS8lXlJL069Py2sSf8yXxHJzOE+5qAqcKClz711a5h2iXkF0al3mIdEvPGsZtmu7Tz91D+nYN6P20/dGDD6jbfsmIRXLEv3fpccmaTd5XoNj9Y/QT7a0xg+LkG6A8bzQONV8mQsFJZMj512PXdrzG8bSiiAdWa7PEbotJVKJRklAdLNFr4FCsLXLsdS/G2RlAo97zi5J4mpx26Q7SGM1kx14TxsQYatCIUYP+iZ14NDPPPp8tQ+HGPLEonVbYiRiktzJo8Iaqbcsh59qHBoGZBndXEwalDBXzD3sIbYrhxlOU509HDe43hiq+M5eC2SEeTfGdYZ412t/aAJFPEfq3dRl0wa6Oiw4t4rox0s/f+rCg9Sr5yX/vsXrADGwowbhqt/EdTudfsdha7MXN3Kn9e9TckQ+HOqdgqW3+RnY3B08ijVPZchn/Y7XZvx8GujUHSuM3x7EDAXegqkPwkfR+hl4yb4BuuY5AC17g3hvn9yDvBN3m/Ky7mJ4Q9qvXfFaUqDE/FxwPWjugAnVOgAmWns1elVLUS/2nol2BUAuyt1w821y7+N79TkQ07amTWILYvO7I/5v6hStaHk5+ftwpaWSLofuk3Nwbuab8ULq6lj/Tz3uWkEg5/nIIYGVDSN2y9JKgkNta0J9Y4C25DpKnPb2HPfbnD/315IEyxKddS9DpOHC92uT3Ad5v/X0LgVsefqUUep4D2mVUeevDE2o9NuUqYyWYu16AL2UaQOWH86Q97+Accmt37g5580pjdVyzcgVL6Lat1P4W42Nk0vOIncIdM8Bt+iWUIOjmIWDK6nUytRrluJ6RAGeewol6Eb8eMy65WkJ8SsDWFj936G3imq6uoKEsmn9kHznKIfsvt/p4IAv+IbkliuuV7/VNQdN4jgfgKyRp8b4aQd35Qrv1ypuTdf2HQS3w/t3nb8hBriaZZc8a93LekZYaGpvrws/aq3ESXMU+csJKfWhEGhH4VT4cjy6j+jHgihUuUWhO1X/Kpm8iseqreG85CZeU9woTd/nPIayXO14kUEfNVL1ih3p7GtsFGDYpr4EcPU7JpPp61gLhfdpHydKVDLW4eaaCuTR4REP2Vs2BxiwN8GCpJcCbpPeF52n9qB1DE3uIVBITabqC0jiIHeVfb8caysKpddelqqLNn4GGL7BeUFq4RKhlVTmCGuBRWABBDEhDRHXsScje6Av8bOxE/QFVlZmFE8EkDM/WhG9hB5BQ+8u4pKPxsL3/n7xyMyrBnO2n+nTEGscgwlEnpxknYpBTrtZQgU5YB8KRGG+VnvSlbM95vPmdiXS5y7JM9ftKUbdxgnxOVrM2ydbK+5IGvaNB27szvHBbvqtxiY8lXfLRhMYcQEIcD0AM4Xl1qH90xIrHF3lHogdPgwXR/UWGRDWDXKVUEXGRLQHTlRTCJ2oRBGig4FvIztUbBVqouwtJBqoGXoMET7JbuNkxdHs7pfsL8sV5FksVAyNxvV7rRG5QAMaIvUMdDT+XAhtcrNagCHcb53sPxuz9ldlj9adP1H+FxOw7","layer_level":1},{"id":"d9e45b2a-6443-4a9b-8ed3-4c3c04773772","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"UI组件库","description":"ui-component-library","prompt":"创建UI组件库的详细文档。说明基于Radix UI的组件设计原则、可访问性和一致性保证。文档化基础UI组件的功能特性、属性配置和使用示例。解释组件的样式定制、主题支持和响应式行为。说明组件组合模式、状态管理和事件处理机制。包含组件的无障碍支持、键盘导航和屏幕阅读器兼容性。提供组件使用规范、最佳实践和自定义扩展指南。","parent_id":"d907a8eb-795c-4060-9cdd-50d31cf39be3","order":3,"progress_status":"completed","dependent_files":"frontend/components/ui/button.tsx,frontend/components/ui/card.tsx,frontend/components/ui/input.tsx,frontend/components/ui/select.tsx,frontend/components/ui/table.tsx,frontend/components/ui/tabs.tsx,frontend/components/ui/dialog.tsx,frontend/components/ui/dropdown-menu.tsx","gmt_create":"2026-04-22T18:57:04.216865+08:00","gmt_modified":"2026-04-22T19:20:16.229471+08:00","raw_data":"WikiEncrypted:olAPfnTddGwpj/UgpBjR290L/aDt6lN95BdSKeT8WhG4FkaSr5VQgjcM2U6PO66OLKAu2ioz8/DcvdqWqE4E4YFgDfGgf1gF73z0iFS1Lme9xheU8JswyW5u5XItoWtrZRbgOUvDZU7ThOr/Yh8ZmZ0pIEeM3ut9Q9dEITnYazuFmTXvD9cMIh2GfyvPBZ4HBfLuAR0DPWsA3vKqk9CyV0uhz8m4rW/+UJuuwkTDTpvOhyzkya7wMaEMa1VScHtXYyp0R4eexUAygV+abPOlhRuKw79lQi3toHGUdLIj+vtoi6Iypv79X5oUrHGqM4MC+je1PlSpNDXEmSpUPXv61GbBICefd0Wtvh0IvZxysgJE0qVoHq79bYr+VayVdRxX0Br3Rx4eL0CBTWEnYFBTW9/9LAP306Gxgf7mVpUToizDpUov9MlXnxnKI6LFqvcZGw2U19uV7ZKhNlWWBSAXNJzA5CUxAj91HoEWngiW1xAgTh4yDTXyj0AU+g0rnbYPrppxsnOz5onCD6EVGwd6hl/OoKcn8w0qcDETMbd8E0LBD1Yaa1v5np9UprT4/d8ywG+WZVYqxRhDoePKKhZBiM91IHtg2WOTUKl+guC7TY9bH5A+lIU8iD1VUiwX/TspZ6DQbYM0Cnw7XtzjGPXhTWCI0uX5hVnDeUXOOD53TnhVyWxzBTujboWK/U9DTFonOODri8zRjhjmebkH2ENpg7ImL9TfUqMzD3tgOnCChFQQwWVhlRqTlvIyCMezTaRSn9151kWhqgDhfcqz8TpNURfNMLPKgZfXiOnzF1lzL+y8aGFp7yklvo3p306zpCBewYyq9nnE+vTYL5JRj8JaihcAIoR1Ih3tkPL6sg/2kGmSZfff7CEJL7xqQbENgxlngrBscWo/DGdxnSUKKqpheMnEtsbOOwc+o3GbGErrs0d2i2xqkuxe9t4auMgJN2mvXdatnVxj5IPNfw3811hnroeBbwPI4Qu8LmBND/i1tpYDjdBBW2J9UwkB1ljyf9H0kh6skTV5iyRMGVtOYejub1IyGPUba9/320ZMvSH81lyMpezzhX+uNQUTbdFk6sqeVF9JzMsQPB7g3YC8Z9WSVGNqw0kVeHuMlfOAPz2KvYRQVsW4U7YE1Y4sVWObTnd8SmT+HE+WBazGRltpQSP3nD6o4CyLkgVUMOT5W1GAwsMUQFN/G3K7AJsn7XMyo3HJk2ChXFfP+mGSCG9gCT7O9MTCwRZu8zAU3TQ777OWZUqO90CymDy4V3WAWszKCmr6H1H1TWuWGjWR1fz22mDh9wzA81RAWu4VksKm0utF7ncEQJsnnf/ClVJuSKoaz6PlwoQiZPg9MHsT+pSGkJ0DrSgIKWj2WmYV4hDs6phOOfkOSCj++y0IYEBL5S5EiVeu","layer_level":1},{"id":"178b681f-d013-44b7-aef8-dee7ca8c22a9","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"核心功能","description":"core-features","prompt":"为GEO项目创建核心功能概览文档。详细介绍GEO平台的主要功能模块,包括用户认证与权限管理、智能查询任务管理、品牌引用检测引擎、多AI平台数据集成、数据分析与可视化、报告导出等。解释每个功能模块的核心价值和使用场景,如查询任务的定时执行、引用检测的置信度评分、趋势图表的数据可视化等。说明功能模块之间的协作关系和数据流转。提供典型使用流程和操作示例,帮助用户快速理解如何使用各项功能。面向不同角色用户提供功能介绍,如管理员的系统管理、研究人员的查询分析等。","parent_id":"1bb55e12-24c4-42cb-8f59-ddc303460d45","order":3,"progress_status":"completed","dependent_files":"backend/app/api/queries.py,backend/app/api/citations.py,backend/app/workers/citation_engine.py,frontend/app/(dashboard)/dashboard/page.tsx","gmt_create":"2026-04-22T18:57:13.330097+08:00","gmt_modified":"2026-04-22T19:20:37.649775+08:00","raw_data":"WikiEncrypted:luoNp8LvFa7zGThvIT9T4gfD6KbzJyTAydbcRfVv0b4BXBAF9G/unmbHb0x4cm5f5JJeO16NqGe5C5EiggSB7moDpXZy5USSfpQ0OUKuil4F/RTioDPMtSUudIqxEjBd5ipsj1OYjuKwvCZDE5FVOSWKxyx9ABPAcj2ixa32ZPlrgZPKHD2EYG0qdFR1nrcOheMbdmmK/1DGPMM99yCcIRnhsKb5QMmqrZbFGo/SPCSXi/Ykr/zd7+VtVKLrPmeZHpaF0yafvwU0Sk0I8ne8YmfwUGC+cOZoDCI+UsE8IukB5R7bnolQRLXvVZdnHXG3b2DA0X4DxManWdKVUyJxI0KTcxcdI8DrpJB05TyoF/regQH6cLt9xm5r6oC5exXEvwhmfMoZVqZ2jp/7LVs83k3vKksFtqXA19YrxFliE+fS/7xxjhqFqC8gfV8eLWpHyIKgVobBj98SpzX6tRTXknjSX2kDpfKG1ECCqYBxGl+EcY3ofgMb9dgxDxdOaB1JU4iP8j0YMHe0vASK6GweE5UjId3SQsH4Qeng09dL1TY2uNr/6ZVhraG1xTMRFHeZNdCZtAWnUddTk6fiDJmF3zxyL7Wvgdc5vmSbfg0rFxTdxZEiGFHJoEQatTaUtv+NOJGQtnOuYzrhs6G59N5Bu3hnsT2Umn6jFryaWwluQaphllqim1VwA12J3iVLQZFZEVBhalhF5GQBDtl4zt6GFlKucztFwPZXIZTYJavPQP2xpvFDInehpuQcHilp3yHcA8+ucs0ani/GPME+nWnxyEDPhfu/FHkheybrXg084bLJG7E+o9XWBTlbISgl/1CuVNeWNj2ph9KIS+TAcq3NucrKast8dNM3bayIymMoemWvEcvuUjoRlABuJKAeAUQ2q5dFWVAZFvlK8de95GljY869ODymzBXnPjMOSCmHwZ51ImNKeIgHybmDkzT72uKyQcN8nty9DJKz0k6Kq5kib65fLCcoAEe/w3d/WVpmBqxU1Uh3yD+z1nEm++DCQTmK1jmwwLT9krps27ULzjOvLuJz2cJnCpSFeB2fBYxH5Wjbp3UZFwDWJWan/9xl9bIREOaZ7mmAz3b7YgA+106K4LV/Y4vBjtitwaM52IcTqvh0m2OKpQSYopXYE7hsG/CXE/MACxmx37ut0KpTFaM7N2GYOE8Z9hIsM53ueQhPuRvk2Hb3E8xbBs3mMtYON2ubkxuPdcQJmCKSHZTgVqD7NVWXIyDL87TjV3YTbdGq6KlIptH7MxMpAvL03xq0ApGXUlF7gt9qwpHG/tuVSmjPBAUAEXRZ3bC+1E0tvaaIPWgP63+hhl5S7970UrDCXrtzeN3l8mbplzeN8BTm9brd+gziF3NKUZgA2yM/OiHjy2jbsu2NmXU8Q3f57Q1MnJglrwSgciwgohkp5Q5XIBOCwyJuIcAxO6LJWzaXB+WOrB+xk7v3h8qxpMdfHMOLFTY8M5Rf6MoGtJPOtFpc1+0Cjg==","layer_level":1},{"id":"f210509a-2381-46fe-8c22-0ed768e6ca70","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"数据库迁移","description":"database-migration","prompt":"创建GEO项目数据库迁移文档。详细说明Alembic迁移框架的配置和使用,包括迁移脚本的生成、版本管理和数据库升级策略。文档化初始迁移脚本的实现,包括表创建、索引建立和约束添加。解释迁移命令的使用方法,如upgrade、downgrade和autogenerate功能。说明迁移过程中的数据保护、回滚机制和版本控制。包含生产环境迁移的最佳实践和风险控制措施。","parent_id":"243a1a45-d31f-405e-a3b9-694d2fe617d5","order":3,"progress_status":"completed","dependent_files":"backend/alembic/,backend/alembic.ini,backend/alembic/versions/488d0bd5ab01_initial_migration.py","gmt_create":"2026-04-22T18:57:14.161329+08:00","gmt_modified":"2026-04-22T19:20:15.066432+08:00","raw_data":"WikiEncrypted:veTYwq2y4io5qXerCTrkkH9ryxDJ0NroguMukGrnBDccbI7FhPTNCbxlVVf68ZQ7vvUzAxXQ43tY1R33KAEW91uvBjnohUVl7Q+D/Ap3SUnHDpWQWBM8qdBbgPmANzeAhinu9R6LqaM1BaUXXk7OeSNamXR7nrg52Su/KTt/eSPCFzeoio7iY3vORVHeaHpWs3y+ipYf26jobCXk1cLVjF9BgaKQ8UIEk4JobP8DZM0dSC9SqfPLDnh2e6k9t39q8JNd3MaV90E75j7KuZKZZJemgTfwdUTe5c8Bn5uNxCf3TK5iuMxVxJXD1PTU+9tadOMcx1qXGJ3cb3nuH7g/03z2UrmsQfIRf/cZLGBqAdGIWhQpJph2OlUELy5WTq8t4R//c0t+IUVTKieR2A1E1U7uGurYXL5ymVtiLnckbHeLMEoxbJYmh7d4xn4mWF5hcIhAZoHvjqh+shIGNwCfXJQGswpnJNML0vWzQNhsJ1YcTUnHC0P8Y6nj9VmXMpUYuJLWuIRuqBS5lkS7ChcQMXO4wfad4N4RMHX9jLYytT/wOoty1KlEalUzriEMahdDn7h2DsLzOJL35SLwpVZ4NVnInvcE89IzYO4wyJIz4NdOfBYseoIv20Qv7qO8B7xhRtTudUyynfaz1jmkT8F9UgZFcdBJqg08MH6VdQSdrlKqUGSGsFAxtB9OC7yv25xznJq5n5SUwpLmFNbQ1evjOqqsogzLg8vClnH52aVuE6TfQWggj1wDjxG7jUj/W7mHSOsDI6AhtMWrP+2OVg2Wx9Bab3iLivdVe+mg93LH2FvF3a8iAdcDRseeNZj2UeJJfYnmzpsRpm+CeJo8Te1ab8UeOeGebDsnVTTILuEg+qe85nTuG8+PmgOs+n4r+781gUSlyoOO2Cde7QwES0X+oENbplkkSZM719jK09dcnbG27vqoeh8rTrzO9ygM48IjQzZWUJCnAIP4Y7VVrcTBiyrZhRLikSrVvSCvWU3K7KW18pnOJh1narIx0e6w+bctledpWsEGZJ9fwk/ae5P5ZvACxfM/2LOdDFqshVbr6grRIeSNNf+tl5nDunlOTUEY8fGNt4lsr35UgKwPwO9TxACZGCsd25DuEtHum9DU/GYli2+rgNaOokcc0Xtw/R8OuN2pa7ohiD6ACjJ82m0kKC0mBBymsNAdo3bDXv3yoyI=","layer_level":1},{"id":"aad61788-1dc9-4682-b743-47188d7aecb6","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"引用检测算法","description":"citation-detection-algorithm","prompt":"创建引用检测算法的详细文档。详细解释引用检测引擎的核心算法实现,包括BrandMatcher品牌匹配策略和CompetitorDetector竞争品牌识别机制。文档化置信度评分系统的计算方法,包括关键词匹配权重、上下文相关性评估和结果排序规则。说明引用上下文提取技术,包括文本片段截取、语义分析和相关性判断。解释算法优化策略,包括性能提升技术和准确性改进方法。提供算法调优指南和实际应用场景示例。","parent_id":"7e66719b-4a8a-484d-889d-10fdc76788bb","order":3,"progress_status":"completed","dependent_files":"backend/app/workers/citation_engine.py","gmt_create":"2026-04-22T18:57:14.593043+08:00","gmt_modified":"2026-04-22T19:21:33.125768+08:00","raw_data":"WikiEncrypted:qByx+WzXalKNnda2aYUs+KheFrHbXoPYZO+RPCaekyWxjKaQvamRZeOm1WgroVS/6iDS9zNWvth+zIYrS27hz/NZLNtt2wOUw9iZG139S+OGMVcZB6KjsnlgG3fSA05ZEdrwDfB531npeEpy2DodlOkcXOSBrgCwkOsVexBDKcWLpthBpfOCieqWsVnTfFkeXE8VvMLROtjojlr+6So18lnYzdEekhgU4Az61W3QEoXC7l+uPBNpRUYZY9z5nLzihT1o3I2bDEfAACTaa8pU8izFltiEd4qID4z3TepI7IuVr7oTmPOaD4MzHULu/4RaMo7/7c9Ql0uGsFrxRb3QFXiiH6QZN++2X9EDTl4UjA5k2E+OTcO2UOZm2dV7vi51lNAZwI50VwaIjtaC4LrPpX7fklk3hQ1qbw4w0FPjYlraJyO5MLseOOQXmURr5BCOhJcWoJmwJadtfh8EAO/9XRK9CRjr2wpAuL9kan2Vkympa3UCszQwVox0j4IkjJNYlG/7UEt2ixgTU4pQi+CAJy+8tZGJxY1gk1MCILniaClaQQImJhi6TfYfWSVywTFVltVcxPd7kMwK116KQmtoiqet/DRC4rzqeEbb6w8I7HZu+VwSR1TXSN8teXJTRMAFEgg9vh+vAOconlX3LzcgvFPohvC+teXJqTADp9XvqcC6Xh41G53xVAvDteT9pJCZHMZsfgh0bErBFzrvnwSObsmJEkvWnlDRN5tdVsRIk9LGcvaflUwWHmIof5SJj7wO9fSm2BN0gW+VA9nbQxyuHt8YqvNR5D0WUpbY1/UDw6IDhAxuTh/6yyVt0HqirNDXslgDardkMaphsQs4xh1fShhK/PcG4y+xX5VsoXIm/tjfGAEXYIeGOHtVuldTaCxG32uSnuT/aFQh7H6df2Hhb7c576oZ6QbZ4HyiG+Qa9iZr6deKWdGhtuuUzj3FBAXLtLont+yuXSCWi/AWM5MOMVyScyci2LKIjH5haWCCgS4nm9tLvifzUgmdeycw/Dhve3nrgdkgO+bIRuUQxXRIxZRUdxEr0DKIa2tEKVeorc5pIX9m1bErC53nDhnrLBj4/ZQjHp33XcgGQ+4jAfmWK/AN+P/SNbyF/K6O0qlKXPqQk/w5bOZWCtcIjrDLhyxZce/pYHOGotrSGaKOK56cJA==","layer_level":1},{"id":"ac0658da-7670-4e41-9e57-02d9d0d50680","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"报告导出接口","description":"reports-api","prompt":"创建报告导出系统的详细API文档。记录CSV格式数据导出的完整流程和参数配置。说明报告生成的触发机制、数据筛选条件和输出格式选项。文档化批量导出、定时导出和手动导出的不同模式。包含导出进度监控、错误处理和文件下载功能。提供报告模板定制、数据格式转换和性能优化的使用指南。","parent_id":"dd12cc44-0c95-45d5-a726-e7b8bcf2531b","order":3,"progress_status":"completed","dependent_files":"backend/app/api/reports.py","gmt_create":"2026-04-22T18:57:37.837258+08:00","gmt_modified":"2026-04-22T19:21:24.246329+08:00","raw_data":"WikiEncrypted:ncgUburcUGIQoFYRn+jCfmA+PbmqRFCE8+U3jYVfh2v8RywptgptFxq5lhwZlmleN1AF4e6ox3Zeepx7xqM72ox5n+mZFIvpPAV03iG0mffmuvwBURuWuzG3zvukYRbxLcpPqC6v5q4GXBz/rMTsxy+K9HHfwtlYbga6fioIcJrpFn0O0GBCxvse/EcV3UFGM+LHRaRVZqk3N16dHYVOsIgwcqfz+E1qQhOc9tSvlN8OuLBl1z0ukshjGXiX/lY4xzl1WSrFXAIsz6WAKGLPlkePgVZg61CHsK9/iXfq1HIs4Mv/RYwTtuMKkyWX9+6LO+AwRjoeHSIVgJsaSwMBS+MqugD6JwGdLsb5/QGcsDSVaN1zVhbjD1WnJ01uK+tBWcULWdYGAkgo7z9A/YQJsV8PUfXfdZnfuydZi59mopfaX1AYtCXeceMgKnzkAIwjWUl72+Pwtvdke5upjMFgEvoy5NrCoYwpZJBePLoPrgu0kURoy/vWGZ77WhOuGQs2/cn/pk4vCFes3r34gglCIF0tHwwh9piyAabHid5VZ3EIuOlhBHL4O9L6zlAgO0opbo23bXt7kIR8MIjEqb8b3SoUIGY7PElOLeOIwJiz1LzOnccT84S/avMIJR7fgzi/me7mJyD+8h7mZ3GY/AsbFhi2oh6bcqc7U1UcO40wTqx7myMlwrMOo9zRr+aAfR/lqH6YwFw89kkxflBfKQ8X7UwPI/vFeOnYkPFjj7XzgHUtclkOUbxztMSSnhxiBMGzbNf6/hnfqT9O5xO2ZF4ufJ0t2Ci/vTK7mqMRvj6sBAzXnGCig4zpnDKbOrVJnB53v6AnqjeFLvqUCGI5Aj9nn+g4LDMtPzzDhfm/HtoxVJjclFmC6FQSLvHlh2FILylIvVxzY7rDDuK3bTiuZFz9Hw==","layer_level":1},{"id":"7cb1d921-44ed-4e22-8bf9-baba7ff8b7c7","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"新功能开发","description":"feature-development","prompt":"创建GEO项目新功能开发指导文档。详细说明功能模块设计原则,包括模块划分、接口定义和依赖管理。文档化API开发流程,包括路由设计、请求响应处理和错误处理。说明前端页面开发规范,包括页面组织、组件设计和状态管理。提供数据库模型设计指导,包括表结构设计、关系映射和索引策略。包含测试驱动开发(TDD)的最佳实践和单元测试编写指南。","parent_id":"2148d7d6-25c4-497f-8894-c4eb7a0d2bd7","order":3,"progress_status":"completed","dependent_files":"backend/app/api/__init__.py,backend/app/models/__init__.py,frontend/app/(dashboard)/layout.tsx,tests/conftest.py","gmt_create":"2026-04-22T18:57:39.375268+08:00","gmt_modified":"2026-04-22T19:21:46.916012+08:00","raw_data":"WikiEncrypted:5RlNBsIi2/3o8ATlHuzaYHdvL7yJfTe6YPwFoSkO/GgZuVYfBQkVBn+1kZzpIDRMGSVFSuoDX3pyax2f9XzBxnZshkSCM7o1L+HEG+sgCns6EUSGCL3KfZi4emTF8vVzG/3m0dhVOWuoQXf3TK1+2Aa07EE3HJ86aWB+sLQgQyR8gNqS+MsRztbE2Am9O9oDis36vAh+tGO64VIsi4ulSBpI8D3+dRXcAI8RsujwrZpp57UaW+DyGg8Jkp+WqqjfbgBGcdkno2KfRFyWKqKLB1g6yKJCePYymOK9DHhXbdBC9mKr7EWc8T394B1klPsqywIZs0i3xy/Pr5FAuzklEn/8jhNkYpmgcVvXaZ43AUVTklSOgSC0cwvfeHd91QuNSlfIbIs9Xh0pfhmz3XAts9WErkdoph3YSvrNDMuXK9CMNhlu9XMkMCQcV7ac8ax69JKW4uVaVHcjbU7PbzOeQ7vSALRtfK0zhIWlbQ3za72G9FvDogDqrLfOBzEXA/cyXMdpeZP/ICE7OsSCRM/i/yU/K2YUAWnRJczSn3cX/8lGIDywmB0jU+IL4l7eteQD1Ea3elS3ne3N6t0WqX/T4jybDWQQZqz0+gOrFuJUKTQ18p+2afWRjcYZnqg0EMvXxpXaT5fmpQAxMA89c70flWUr6l+ZNckhODBS1Uj27vp+ECTFfhbNt2CmqrDWIfdobRz1gXYkZI6LR+xgc598+CJDjc6zizQcychGbsbPqawU+CCQfSVqPCknZLlSyJrMF+FMoe4jm8fpOVyOOfqGN3N04W6++aIiU3eZIMB0F/1pjONP/d5egIYaJhs0Zo+ciWBBR+Me05kVd2tyIK0ldRH8iELZu4XmfrNdcGPMTZsENU4lZZiJxIXbeoKUQF7KbjsDcLTmuXfl4jcPFk48k+LwUEE2fyaAoG6SFrEaDZiZ/yR292cbQegdgcOrF+/QZDnMqVS6yFRaljF5C5+ce7VNxUOs5dzK46Z/0xD4kXHkT4QT5/727yUeQ8KmshnsLpu0XgxdbjIAKa0UpiByR2sen9DI8GblyzqpH/4jM/yMtc2COW+MLDnPw7xho10kjKNljBjsabSa5q/wLnYGofR/pA1CmnrwERR7Cytik91YmtyTb1D+rjh+uOjSVOB5NqjX7dqhFcV0CLE3KfUAkA==","layer_level":1},{"id":"c45e66b9-1ca0-41da-a796-6b98f394faa1","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"运维最佳实践","description":"maintenance-operations","prompt":"创建GEO项目运维最佳实践指南。详细说明日常运维任务,包括定期备份策略、数据库维护和系统更新流程。文档化安全运维实践,包括漏洞扫描、安全补丁管理和访问审计。提供故障恢复流程,包括灾难恢复计划、数据恢复和系统回滚策略。说明容量规划和扩容策略,包括水平扩展和垂直扩展的决策因素。包含运维自动化脚本和CI/CD流水线配置。提供运维团队的职责分工和应急响应流程。包含成本优化建议和资源利用率监控方法。","parent_id":"803bfef4-3985-477e-a61c-915a246d0061","order":3,"progress_status":"completed","dependent_files":"docker-compose.yml,backend/requirements.txt,frontend/package.json","gmt_create":"2026-04-22T18:57:40.355828+08:00","gmt_modified":"2026-04-22T19:22:39.446821+08:00","raw_data":"WikiEncrypted:AymRokkaRBrPd1uk5umiX/dhQHTPPm6nf5mmDPb1IMODwfEt6djM0VBnDWaMwjVsVSuT1AHD1pfVap7WBute6Wsiarqj6ltamY09KvCs0YHxEqOor+0AYSzm2Aa31Dwx0HGTr+fgwTnE6RMJGGceRIs4cV8RBM7Bs4/C9pv4JQQe1wx9fBauJxXtVZgZmkTwsQz1zMKUv/my9/bZ9Q05aHGQVWSs0vQA7fX+eO9Ugt8ztv2KzLkMHjTPQwDUKBMhAsMb47fa/gUJRb4vX0XaRC/0NRwbOvV9kGE8ZhfJSMzck20DTmUNjRs+txGlORGu4UWZsefqLmppB1YdHehQUnSp53vMgJwj0a9BHe2ZU8oB3BBo+Ky3c3OR4uaa4rfHtatz+jzKcC5vq+Oa2OkwFMyKF/rHCf5c9kOD3c9bg/wQwxJpIov1DkWxrbmp2EHHUtHsb07ASQhGLV3SX7POirp4b3urFGRk2MwXKxT5U/gA8wytKMJhKBFtElvFBq2i7nSPeaH2xj0DS3o9rwbrhRJQvLfp/3z63umdp/84RCiI8SwdYgPx4ACqLY3QKXNo0LIi6rsgWkaf5Suyks+dimQcPtAllHZGQA/gcWYidV5oQCnhHJ/meCiKRy7Xb4GttMbIeOA7UNNRQ9IFS7wyprb/n36lYgLOcuQ5Nugly0pl7iFTkl4qWn4pZ+zE4TR9CK3+3oihqJMUeVFdsWHHzgVsh4Vy/4MCPUipHMfRj4T7BabCmkvaTRaf6oRiYEXPGH1mUXCLnQuty4lKx7e8LxdqWP6gciPJOcuRMBYoeBHqUKw/JNmAzN8FuypXsdUryS7GDozcilxOcRE9j3D0JEW+8ONdKF5sp2JAXYX0mhqtfB+RscbqU7E352fF8vZAqHdS0XHCguOUcPuOk1PjzrKK0PJcxoWJPrW1H76CpfhWX9kC1CX6ji8+oMevPaHlwwFIAPnELyRyWOvaAia+6TeiAn8YTup3BXf//p7UweBdBGz//qMDvWoMqMf67cKrFP45gozQjSEYzm8AQ8g0Rqx6ctmJotfnBMpbUoG/k/Br9U3yCwUW5C4ELNIkZ8HMTq1vu6GKzheTjgM5lsZSBhR9qgPwf7cYyU47KLN2oWaoSG9Ke9U5fc+blB461oN7Tb9p1M9jYYAi3IfY13WbWR9kQ09yQOl6zNP4E/TOZ/WG1O8YhDVo6O9b5nQ7Txck2F7a8+Oqzy404YpIRpdXWJvx2sNjxCQXQVXqKKTnxP5lOsLb4vYZqXeHpIw8VawHDzn9M5zowBo/3M96UZSy84F3QEP3JU1nF98Rqg82vqB50gv8dY6wl5RPTzKd+Fi2","layer_level":1},{"id":"243a1a45-d31f-405e-a3b9-694d2fe617d5","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"数据库设计","description":"database-design","prompt":"创建GEO项目的数据库设计文档。详细描述基于PostgreSQL的关系型数据库架构,包括表结构设计、实体关系映射和索引策略。文档化SQLAlchemy ORM模型的实现,包括模型定义、关系配置和查询优化。说明数据库迁移管理、版本控制和部署策略。解释数据完整性约束、事务处理和并发控制机制。包含性能优化方案、查询分析和缓存策略。提供数据备份、恢复和维护的最佳实践。","order":4,"progress_status":"completed","dependent_files":"backend/app/models/,backend/alembic/,backend/alembic.ini,backend/app/database.py","gmt_create":"2026-04-22T18:56:47.082886+08:00","gmt_modified":"2026-04-22T19:00:15.768242+08:00","raw_data":"WikiEncrypted:veTYwq2y4io5qXerCTrkkBwdhOAmcMQTz+AJLOFORhNFeFTAN7xitXLxeRr3T1sKrh0z/6NFLuxfhi+XJSCnWjMeU87mDaFkK5qsmaAL2Nytxcgn44oX/Np6gDk6NBpKTXXQ3c1JIVHY3Iku4YTIdYCMibjywixwZ23Y301pMlyPcNfQmeyLtgTS9lP5U9xDLKsnMUqMie2ljsUEPDjOoPxSnQNoCL2G44jqE4BeEYCl1h3JsynQMnvjVq8UCOhctZuFN52nO6JzrF4QcwRRO4A9xL1TaAtIZ4rg/SoqWB45m3doVWQm5F9X2438sdweLxVi9rjFhD3YsPTUW3+FCCzo3C36ea5HWhnLG1HaEDoZet0lVePafwfQDmBH4SRDIzbxrRNYtlqnAT0fkhc1nMAQz0IEGTS56zXt+EYxvMzu6xYqWFcYFRtnmeW4SPZ7fIro5U+rBcr8RAhA+oRG2JsVDkhv6DqzoyIv2NQFFMusIiiBmBASHXvFFZ8AUVhKC9xd9A3bJmY+ukIHDAeRXE/IucwTAoEQNI9CMXeyfmQK03mWECRg4ZW/mruOTW2OBUuDhiPMO6x1SJ1/xRenkwbw7G+81ZCnsnBRLKd3cZF4y0nCxe4j13LGQfd4iAX5i/DUX9KRkwDMblN/sboCGkcbSLtph/Xvk148A4+6695W71mrzar7yhfM2lOT53Hsyt2sJWiczLnDCfT2QTlB71ufUZ8Q+ypkZO7zlMrvkaUHamxgarKXmrkr2OSa/8IvsG/WUhqSV62U/SXuacIVOKNM7SY8D/zzYphGfcHavI9R9O/oEfUb0yYdGdjhTVWuiGlGsp/cByp6ofrZn/LfnNB3vSSya3wpDOVy3RqCdO+/d2gEs+jlREm/N1+eDZOKMpt8hFWS8xUytmwHZca0aN08mhhTQARvxhQUGnF9uPVIUhyDUF+KcuKANnwSAWIZo/cRSzlSrqPcRAA7XNJQTg2OLmkWpWQwVtTbYCyP5hSM3zmFlpWvBfR30gpl0P51+0pFCd4VDI9/9HW/Wa7Ih95wP7HNKXXfex6GwbePYI59yynPdHHuqHaqbkBTKMJS82vrAmldAtjgxXDvf9xwDjPEyA5M0Hw35tVS6wjNh3SS2SuwfT9oDISNn6Y+5j5yrJjUF6K2Zri0unxCjM1JkoAvusyG+pHY+Bb0QKmNcfyXBMYTSI1PhOPDulcDYMyq9Zfb+Al6euE24vTZpbjKoEtLO6rGDYV8KHfz2jIxcPi0y8Ou+WvMTWKz18iFQNUT"},{"id":"05214c1a-d804-4f3c-9048-20ba4de3be0f","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"引用检测引擎","description":"citation-engine","prompt":"为GEO引用检测引擎创建详细的技术文档。深入解释引用检测算法的实现原理,包括文本预处理、品牌识别和上下文分析。详细说明BrandMatcher类的设计和实现,包括品牌匹配策略、正则表达式规则和模糊匹配算法。文档化CompetitorDetector的竞争品牌识别机制,包括竞争关系定义、相似度计算和过滤规则。解释置信度评分系统,包括评分算法、阈值设置和结果排序。说明异步处理机制和并发控制策略。包含错误处理、日志记录和性能监控。提供算法优化建议和自定义扩展指南。详细描述与AI平台的集成接口和数据流转过程。","parent_id":"7c2ac186-ec90-400a-ac1d-b3b7ca2f01d5","order":4,"progress_status":"completed","dependent_files":"backend/app/workers/citation_engine.py","gmt_create":"2026-04-22T18:57:02.318113+08:00","gmt_modified":"2026-04-22T19:23:12.0556+08:00","raw_data":"WikiEncrypted:qByx+WzXalKNnda2aYUs+GYu9pC8LLDNo/T55ZeqwzWiy0YK6xVbR7KM5OSxCOo+gfTx84RuGsvrF5lK6ZjnzUlze4qrtyk7B01ZVL/J3jiDE8Gxh30IZ/Mj1EQJzBgbS8ucLS5EtWSrZllyPWZCYSwVaerdIDlttJxjgqNQQtMUDRAB8OQ24T4T6PetqUxBLI88gXxpodDV3Dc8w4vOKW11rQu+VT/oxsfIcoPAneCboh21Q6/+B9XbFXBpIBt7aIzWt2RsJttqoYF8wDTsmjCiZLq28t5vrQ4Sa+eKtDX1DpNAFob+BOs4Mmqm+YOjaRHvq2h+NjRwAcgLTQbRRQ/mDN6TdA4dbJh61tmjO36v1VZj2vbzvIogCKkVwvxYe4ZRLkOADLelhTgAjFcFCSPmrGGDFgzUU1yzAstWjYB79RIQhz0PEg9hhOmte8rH3lRWxxSpVe/1MQMLH+ka77X8d5lwXEAhaF5uHt039diwwi6YY3Y9nEB8XYpv04beBhaMWdLq1Odojzo+Y974U5UY9gXk01q5QVIuHK8idcl6cuKp4f+gwGZ93SgjTqe7FH7Qd5ge6PFGZJ+aslEcmtnU47e+zHyzdHWI9hPG0YyJELRpf0i86RxY/f6hXIyFAyeWy57ojMY38VpwsiGGXz7IigMFtIyIlbqO3TH0+IeZ2t36ENk9y6nTzgXcWWxCA2LCTHmO5+jPxWISebAAxo6WWit6n6LUWDxLf4MHwWbZckVKu52y4K3ne9qu+I27rwPoTazIsCAYy0QPtt7mW2mn0ZRxzPvioUK7EGgjO1OqsaKLZJ7AjW48Ru6wYZhBlriVoABBGkI9BaUnyYEcZ/6kpkl+TnRlKY32X1A8JvIZA/8zHmSDEG+FinfzfNFH+SSj3G3HzsxoGnVOm1qN7i3rDXC9bliZ2XpBZR+f29A0ray4pNhiBI+dBSKZouc+bB57XZ8Ct+6j5QHeCfiWa6AQMVuv1Tctr7qtXTrcVzTlYsU3vR1mVtmmkHd3yv3ZBA4l9p0DF6KOSKVjAPn2GSA2EABrlnwJ2lSeWHoObLJBidT6nmQ5S/6IkRgLb17Pu1ypV3eKj6LNDOzrw4QxJ/JtHZ1rG/1Tl0wmhAjxmAzcu+aahYjIdYSTWRkWqqVZ66nNp4pYZys0zblAnLMLM//kJadF9xEEaHjMBIl92IgL0L97/jGIU2YXsapNE1OQ2D6+aqKVb50gv5zx4AKT4tdiLO6Z2sMBrNeyDhml+vCgXp+rFjFXUx+qAUz8Wm1u8gAPUIO3m0CnCZSt+R07BQsJkHMGDzlrGsy1wvLg7Pe6UI9RPBmOUN7UeUe5c09BjutdT+KuUht4apd+u4wqgCGkHyo1Wy8W4UbciPoYT8wx0cLPnCGR73GfwoGnzPtfxWJDXX3SruBGUXeCtwl8UnbIlyDa4Ks2befkeGMWpHQ=","layer_level":1},{"id":"bfca5ffe-8905-4ac2-a0a3-8e4dc43533b1","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"数据可视化","description":"data-visualization","prompt":"创建数据可视化的详细实现文档。说明基于Recharts的图表组件设计和数据绑定机制。文档化趋势图表和平台对比图表的实现原理、数据格式和配置选项。解释图表的交互功能、动画效果和响应式适配。说明数据预处理、格式转换和实时更新机制。包含图表的主题定制、样式配置和可访问性支持。提供图表组件的使用示例、性能优化和调试方法。","parent_id":"d907a8eb-795c-4060-9cdd-50d31cf39be3","order":4,"progress_status":"completed","dependent_files":"frontend/components/charts/trend-chart.tsx,frontend/components/charts/platform-chart.tsx","gmt_create":"2026-04-22T18:57:04.217105+08:00","gmt_modified":"2026-04-22T19:23:03.405364+08:00","raw_data":"WikiEncrypted:LlssVZ/E1BSUywfa50FLlWyGoIcJJpOig8KP9B9gWWZZI8ePi8CsG3BxaOR4OzxCxm2XiNUDCA5f2LMwvnigr2SlxVBiSNHUI0lCgSHHEunmkPytqBjFiqGB9yeyKz3O1rSdq/m6COB07RDEp6Tymfd/Ich7hNqr0ALiJKFBMfTRXbiXa3naRlzgzc5/DA1h/zbAk9yl3yaR4bB4p7xAmyNn8C67e2gxrbHOKN7NK15dfXoIag0XHJMVwFE6SysJ+lA7fykhvt72SHx+Qz58/QamURb9OcCEnEtIYqW1uga1vc2HXP+r8Ud+tutKATUxPch908D2Dm70HjZTkDqV0y1RwdTE86O++EPgx5Sx24CmB2Y9KEs2TsxQBSxas2iX7ajhgIL9xFqjJIMVJWfRNeL/ql2x/OsrzEXUWybjh//bQHE/MIs2lMcn3jl6uggDT3q//Zf/jugKwK1117XAp1NDps6xhJqmTf0/J+uk2DjJwURNZ+f/hL4XNyCoPSOpjPZMIk+ikrqwiBBFy1t5dz/fksmYdzw5H1wSGwFPks461EvwT7SUd3qHg+HDEWwCrMRQLhaalcb+5T4rD4Gg7Aa0Y5Q7v043Oz/0rnmFckpB7QJrcI4yUtnbNxu/HuY+NFZLqpJUrNC6MhZKZ1Nf8HjXwbb7FvRLPTJk/0J2UGgZIuFkHqA398GnAHSj3OegnBaKM+qHr8cVs0wfQ/uFwwYzgoBd9gSGURpkSSDhsDUj2XJMeQPghyYg+au4UrCpUVHdYOyliR8OyttchGTRgDox14AD6X6BPxBueyw2Yb6orKjSBwNfDa9SZQK8dW9S0BehKqK7QLDHIzpglx66chB/QwWwaryM7BrEciDg6cdFeFQSmV+EgDmEePwse6hlzNdSXObTbNXLDwYhtifAxjK0xxhVUCtc7HVAFKLROk36HCFnlzxLpVmtppYzoprXfyXDe6BHU55d+PSdjtYyR7k/tigqJv5jX3TTrH6McF+/v+eR2ZtsTDIjWz+prq1cMVTVPgIB9WoT0+dXP1fMoZ52xLzWjSkgrQ7djAo7jyy1G9plvOx0bdGh5lBGOz+/zY7MTLVaKx8eK6kKS+juFkRK2kCuesUi79TGLidetA+vkruZiHzNPBJWntDodb79","layer_level":1},{"id":"b32b024e-2d06-45c8-94c2-a07fd25ab9b3","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"快速开始","description":"quick-start","prompt":"为GEO项目创建快速开始指南。提供完整的环境搭建步骤,包括Python 3.9+、Node.js、Docker等前置条件的安装和配置。详细说明项目克隆、依赖安装、数据库初始化、环境变量配置等关键步骤。提供docker-compose一键启动的完整流程,包括容器编排、服务启动顺序、端口映射等。说明首次运行后的基本操作,如用户注册、创建查询任务、查看结果等。提供常见问题的解决方案和故障排除提示。确保新用户能够在最短时间内成功运行项目并体验核心功能。包含具体的命令行示例和预期输出结果。","parent_id":"1bb55e12-24c4-42cb-8f59-ddc303460d45","order":4,"progress_status":"completed","dependent_files":"docker-compose.yml,backend/requirements.txt,frontend/package.json,.env.example","gmt_create":"2026-04-22T18:57:13.330281+08:00","gmt_modified":"2026-04-22T19:23:49.7972+08:00","raw_data":"WikiEncrypted:1aHEw3M2aeluf1++NE1n1HTCzLNrSYNKzc2IVp06RQtbuAYcMEXChpU7tJYS1f3O0opR6Xc/vB+l5keQe8PgCR2ncFv/1Td0hCZ2YAOzrKcU9vT19aDXTs2wVsNg8N0rDLvVcTazfsrfReCkGbF3t4KIDlALR7E9k/sBc8Aux87FRnIqhElZnBvZS4Wsv6VYjg+rG70cB28ZbZapx09FwTbE2gyXj7Ck6qNOm9h31VGeQcyIEPfTlQzKWWghd2UuAwraAXbHFeTBwAzBOPZrVi2iMW5N0fiPvrofJe2RpvtWwEWsHguXuXUfXywdpjyOFbnrTokbwQiiwiHpgbktPSypaW3QvBywnGVAjxPBIfRlzbrxj8jlb7w8YznQPbWcNRuYRt3TVMBHR1Ix8UjdR2JwWu4yZQUrLOP4XJ1OVoFdLu5sT3ug3YetVAWSBGUiyUEIQ1U7QoHxxE03qI1ZmrGvC069cAhyU3YQYL0g+PfXWWo86/F20gUXppepBbqg0yRPlCX5asdDuL0vX+i9vl/JI2++deWQKu7cSc8+5tRNcN2AF8Klslhvy5KUEZpxqPaEhxXek/RE8thYcMjT02y2lWMR/WID/CEUm0DZjOC2fQE7kYjogUTC8OhNTBXocpLyn1sbyngxfQ3KsE6+Ysl41LroJ5F7SN8+p5pueRZgBbM32odMU1Dil6T14I/HwltMjiGAjHurPSB8hcX7nNvkuZnVTE2YMjB8ZEhhf76D9Pp1naI3P2d3j0DprvLXRiuPSfO9NBTu6LwZKuMaI2MBEDI2zoV182wdrC1T6AxOiHNcJXYiaF+ZOpMA0vabvcycoioAE6VOZ0mBQ9ZPVSZDf/Dw+VTsC8U1qruh1IAQVYCHsnjY9etX9sTaj6Izd3VrvgQkqP5vAteSDZTy1FOTlTi3X6RzcurXdR3833HqpXa/a0ot8JiRdmjIG0ydOuPYeZPs+Jb0FMN85H71mBziu41udCrikCTPBRTVz6VCG9yBdOgeW4s/iNhPqWCnDibKpfJy1GfSyZ7Jja1d4K91Y+IHVrJxB0+TZPezxY/htgMg4W7MtRoOOPc0eRqst/S2zmEgxMMpU4dfaQIne5zGbUEPNb24qp3HsO9v2un6P17rFQV86RwmPCnyngxtddo0vUNesY0s594GhsGEquA9XlaYa4/KNM14pVDEm4ReIC1JvvqdiQdUAPv3nMXASqe3FxbJmsi93mpWhKWx2q4W+P3ZivXtxhQ5OB4Rs2uXmArlB3MNPKk8TL7wHCUAsFUcCGoPtT2+ov9ntDTLyjKsb0YUGjYUqAceHGdvLCM=","layer_level":1},{"id":"15d6170d-716c-4d2a-833d-81211a59027c","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"平台适配器扩展指南","description":"platform-adapter-extension","prompt":"创建平台适配器扩展指南的详细文档。提供新AI平台接入的完整流程和步骤说明,包括继承BasePlatformAdapter基类、实现必需方法和配置平台参数。详细说明不同类型平台的适配策略,包括基于浏览器的平台和基于API的平台的不同实现方式。提供代码模板和最佳实践示例,包括错误处理、资源管理和性能优化。解释平台适配器的测试方法和验证标准。包含常见问题排查和解决方案指南。","parent_id":"7e66719b-4a8a-484d-889d-10fdc76788bb","order":4,"progress_status":"completed","dependent_files":"backend/app/workers/platforms/base.py,backend/app/workers/platforms/kimi.py,backend/app/workers/platforms/wenxin.py","gmt_create":"2026-04-22T18:57:14.593273+08:00","gmt_modified":"2026-04-22T19:25:18.719953+08:00","raw_data":"WikiEncrypted:Djug3Ni1DAZ8Du2qShzHYuqLmnJOyyKhsCPSfayzAMoLf9J+rFBy0LePWIX3b5/HwiLgJX57X2JBlObsW70y9DLEgX5HDr3AAeBC0dRNACFssPk0GwpdFdJeFwRtoB01ZTdr+IpYAK2YG8gaEA/2ysFJOZzxpGWgTq/Xz+KO29a2kcDgYhZKt55uqT/Mo/5Dzr6AN+qXdLL5xSqrvCkpmhYMFmzgIBOUjJM1mUISEtf/X+gK0L0wXSj/tCJnDQtGJqbFK24HEYyVnkon1GdnIvb+Vptmby7Qg9iNT/xb8JEVTTLM92335BfpTwTp+D4fNkMNyZgXv/XW6K5J/dLRulOCKwxJxPROAyvyEc5xLI8vh6BGP2+b8TgKAKILZTXg3SemKVhGrB3MqY5+V6whOOMT57LHnuwJUEMNMJsswFiLp6UbAlqwiICRF/Jnb+bvCliw4xXvKC6xfAJDQ5qAtcTCAm0uGslNVB5T07pzLFy5EaJS00hqRmvac/P3e8UyL84KjzdngtT3yZ95yCL30Ad9SpGXt76JgCgVJoPFcnPYlJZiXneeB39wFX7rogSSye9XkcBSqEt2ZITemhNHF6LmqSUdnA3rX85S/zDmRiN2NjS1Zjvgc63JjB4B8gQhw3rDllzHDLPBIO3PNInvmVsx5zHOjAMZmyIaoVRtB9BQQnUdHn1WvHdRXmZfs3eVA7jNhDQmTtBzdGtJ31XIHAVkP5ul/NXNBKUytIXDS5hE2s/ZR6j60eIWBlCNxNIlj+42vefIOU+e5kJufMVcBv4aXyQHpunohRHMUYteEC24NO2CW1FNZJlH9BEyf8RKg1/0hDEmySMxcj/S/pXTp5i8nevE+JleHdj3zeyWlGqJsJa7arZV/Kj7qPJYtN4VHoDGp7MFHgKvq6W26lje9EuwJEikt3hqjinocemgMjzEx+PMVPovHIBXyCfuSOtygo59bhUm0pvPgdMmml9UgZeVV1GMzDT//kfmf33ZL+aXTl+zEmnw5fZYwccKfmY6Q++ZjfSQLB9eV6u79F0yq3zh7zGb4RqRR5ZeL2vQaNsL3wyqgNppyJMYSC6gX+ce1aAimwDx4Lr/EnY474W0FXvid1Xc6Bg6KdPrwnKJJpi18zMOmECI68RvMpwmM+92oe/m3dj6YGItooug3uasMy8SPsvLi1RV2F0CQD5CqYs=","layer_level":1},{"id":"7e66719b-4a8a-484d-889d-10fdc76788bb","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"AI平台集成","description":"ai-platform-integration","prompt":"创建AI平台集成的详细文档。解释适配器架构设计,包括BasePlatformAdapter抽象基类的实现和扩展机制。详细说明Kimi平台的浏览器自动化集成,包括Playwright配置、页面交互逻辑和错误重试机制。文档化文心平台的API集成实现,包括请求封装、响应解析和配置管理。说明引用检测引擎的工作原理,包括品牌匹配策略、竞争品牌识别和置信度评分机制。提供新AI平台接入的扩展指南和最佳实践。","order":5,"progress_status":"completed","dependent_files":"backend/app/workers/platforms/base.py,backend/app/workers/platforms/kimi.py,backend/app/workers/platforms/wenxin.py,backend/app/workers/citation_engine.py","gmt_create":"2026-04-22T18:56:47.083138+08:00","gmt_modified":"2026-04-22T19:01:25.986259+08:00","raw_data":"WikiEncrypted:cSfKuI0KndKt4dAjXxIdxWhPkO4T68Pn8OuUxh8ycrOmN2KINuisMW3IOEhdPiFABzUhI7mz9/HfHXQ4zprU/+/sSF8Ao95qt3TWu3d0gdIZ8D5HcXKzDDRDEpL2lUuKjanJ/DyOhfgoAhj4uHHG63PE4lD0nFGhUjI18Mx86VwV/XRvw7SpcidXldGAtwv+SyiBV8jhNv2SsuEp+c64Tpsb4eXXnhU94tHe5zw60yhZPo02AbhrX3CGRvf/e0VDakSRNs2IQLOmYpaXPEbGq1F/Tp1t9NRMOPMypI2xbgsTvkk85z9kGHoS4hRcf6dLIMVrvkCYibs8KhQCMJiDZ66d6j1Vb6dqBvmrKsh3E6WjAycKEMEg/CipCVwEhG2XXjejCze2wysxwhQJevZcegdqOdbxsBBToWhLzOtdumIPjl6TkkzVv7AjaDWHyidsMW21W5FkdxXReA8iCr3BmNkZXyR7BhBY5u4N0ckDpZ5vNXZOYz/nnm9EreXPLovPEB1I2LfReGW91QDOmQpV3kBPeM35QBnLSkx+FIocW4tie7t+M3QfDly8wClVZXt/3Cc96RAY6WNV+YYLMUbk0eoT2oS9tJcllSD2Lsr8dySH9dDel8ELle3TYDsLHrUqx9cVuNFviwe3oCB46zQMNpYbQncs/EfiGeOD2OCtiuPgMJQ2Xr1wz61OtRdGzstiiPcgemrt3kq6Go6kTMDJtBjYxdl7n3V3dIrWro0kMRmrET0FmRL+jOKdnxGBCgn7UUfNtuwY0c63ALecJJYYOTsfyPzHs3Tt7F0jPFfGp1xYzFzaJAtquIYdoM1jeFRd09d8N49nwaK2qynepWbYA5daLMXJ8Rbxlou6PXvIVY/rHl++n+9Z7OO4mAKy2SYe8mpLZqP4Achbv5fwrx7RrwUNcTUOJeXNTIimqqVLvfg/wEfrBk/+isWw2HJf0W0xUuYy0gIClKgSm/wR4uZD/hM7pzbg+Q8DUglIDaVcUMjJnFNqcUrsNEa21UPlYd/E+drdMzZhzn2GHjMnKkAbr8P8DXkbz3RU36nbktlWYlN/hx1lsA9kSsHRiH9Q/xlpT8eBA7rmQiEasbHbaD0PaL8Dyc4IxQ9ZhhWSSUIT5m10WFLz1U2+/9T7i3LHiMeZeFtY4g60GitHBRVqf9+NDKKdYms75Sq8isA35viTaKBUg9/dkwXhZR9TePkcei9/mcG/UOI4dq9SqLAijVNzhLtDoHXCkVCZ4JYzrzIK9A04c+Gtu0xPcRFLewPDEmQPg+3v+cy6McOQdOYqV7rvdr29pmRLOyVxEMs99/vMu6XDAu6UQr44Zq3RVgekLzY7aabJQc/YyWgvzg9dvnh0cw=="},{"id":"850fc702-3eb6-45b4-acd2-ae87fec1f4f1","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"工作器系统","description":"worker-system","prompt":"为GEO工作器系统创建全面的架构文档。详细解释APScheduler任务调度器的配置和使用,包括调度策略、并发控制和错误恢复机制。文档化工作器抽象基类(BaseWorker)的设计,包括通用接口定义、生命周期管理和状态跟踪。说明平台适配器架构,包括BasePlatformAdapter抽象基类、接口规范和扩展机制。详细描述Kimi平台适配器的实现,包括Playwright浏览器自动化、页面交互逻辑和错误重试策略。解释文心平台适配器的设计,包括API调用封装、响应解析和配置管理。包含工作器注册、启动和停止流程。提供性能监控、资源管理和故障诊断指南。","parent_id":"7c2ac186-ec90-400a-ac1d-b3b7ca2f01d5","order":5,"progress_status":"completed","dependent_files":"backend/app/workers/scheduler.py,backend/app/workers/platforms/base.py,backend/app/workers/platforms/kimi.py,backend/app/workers/platforms/wenxin.py","gmt_create":"2026-04-22T18:57:02.318442+08:00","gmt_modified":"2026-04-22T19:24:30.529121+08:00","raw_data":"WikiEncrypted:NKkj/YX2GdbxYjFllBaf8+HUgx0ecKFsz1U3HC2t2IRMbOkBCmoy+IYbhzuQ50K4pCdPARIwK+MaHbv1MDUXpcbdnvRL12GKezTnD100oXzQKqQkhZdDDC4nIEcp6weWLVGVffqyB7aL/dnt1QlE63XyJfCwizBlecxl1GDUB4J0O7SsTFL5gI6enVYO6hOzx3JrWnEFzirRjA6Llz1iFiFUWxTjxjToT1qkxAdREq2omi39vXL1s84I0XOA1blljfNNIGbpkxXW5uohJBndl6l7Bh23wF8z1LfdAavsFmljavCWqoMvA61Dn4jpJT9oDmaKXZpVSuxfMF2Tu3WOJZwISUGfGBJfdbfxNalhuFff+bhZR8P717nLoM3Do7T26rsqW/pr0NJL6aKxrlPCeIzL0v6Ct+HU3ULHT0EZpG8HfU2NhGWAJd0NhX8RZ8B2ZpfXZKioKtCkLhl4oWV6P8/k5g1nWpnP3wpmDwvp+/pGBeaBcYSenwJWgcGR2s0KgVsEW1niM8+JLaK15wFrmKcxve0hIWBiiPnbZKscAYq+5hj3ecte8h/JevEf+SBNB7ify6uUGU3Eve1jXyPeBrc2FCU5ueeJSFD3wu5pHlkzm7PP8UAbQOfwmENf/Mc1YRNi1FJsujdQuJ67474CyCTkCWFhTC539/6iIa7hN8505GK99PxHcIrsPMMT5LU69r67SizSnWV5bawiMPKGosexCHZfhT1jrScQCKeuld0X/lE1WXXm6ADBbfxZrn/iEFK0zc0WKsnT0X/nQI+ycJaw40Cm+soCO6/KtdYYGEzpzViqi2KxYhRyey+o+yIi8V7nVsxUCbaVRVmYNjnK9yX+3ypdVpJLIJXQ5ywaUWfvqgCrsC7Xxba9P9D+0kmnq6jH6ZdIuubXp0yOtWxe+VC4bHAWoc08RoBdLrlTCGz/hmgi5S83hM8MN0gLdQtc2YDsc0Pxw60+ylnkdlKIefBmb7XPiD8RMRvcbDUCGnrpenbxf5eoWLjLWfyULNQHoYINDdIFvn+skLu10KkfTf8lpRNqd2uHkHVhTTCFh25GlRLAdL7QDHMMQbmwG9OTjjt1tMlW6aYJ/pvYQq95uzmLAiICIsf+nT4xgqoFK+tTBmOst7Z3+bj1YJCPtUNyIzC9a3YYfRwlB1ckjgJaCURcXpImdkDtdpl3GP2mtDp9O52ZDAQVAJFVA3wFFV1G+qjqGRl4cDFK7BlAs04O4fvskn26jrDYiVqgdF0pc6eIiPhAJg/1BabciIggV78rEnEg6jiNJ8AhUmKLo8JOvL/C3m1mfcaUbU2K7oK8damVm8BSmIypHMJfCXzHIt6i+CaJLNlZ+c+MJ4WhqgPWc263/SnxO24wH0vaRtqmZ8g72SSFVa+6E65bdhSUaIejIDvILaBv+73KdUt7LGKPmqKoftErfP4grQZACnS3zQLXmnMfdzurPkKbBI1PkyT/ase2Czwu5/LwHWdWDcRQD2uZmUjndsKpbR6/xVu5Ry5VLB/ds2BrgjUp5pD+Z0U995X4yVwpr9oCNxR5r1sl+2Wv3jotf19l+safw9XwODQoURKcJiGxtJDymJvVEyl3ZEe1Izwl7SF4UqtboIYt9vEoEIilsuPPDtujnpN5pkY=","layer_level":1},{"id":"fda0598d-7e92-4b8b-be52-92ae63c3cd98","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"API客户端","description":"api-client","prompt":"创建API客户端的详细实现文档。说明RESTful API的封装设计、请求配置和响应处理机制。文档化API客户端的错误处理、重试机制和超时控制。解释请求拦截器、响应拦截器和中间件模式。说明API版本管理、URL构建和参数序列化。包含认证头自动添加、状态码处理和错误消息格式化。提供API调用的最佳实践、性能优化和调试技巧。","parent_id":"d907a8eb-795c-4060-9cdd-50d31cf39be3","order":5,"progress_status":"completed","dependent_files":"frontend/lib/api.ts","gmt_create":"2026-04-22T18:57:04.217601+08:00","gmt_modified":"2026-04-22T19:24:50.486294+08:00","raw_data":"WikiEncrypted:/umMwKXdJhL9PqhJYRia9MjBtE8cuBSpJq1+zwyrvadwhOTuxc7+NNlJizkRp6kCDsj6HmsrrrEG2WmrNf4m1kFf/yUci2Hny4otqjfpEsOXzmFIxnq13zAZFe1oDyDiHr+shS0DH1omM5IrOroFuNXfBlFlOGXuTKJ3wXXPweq+qAH9QLU237hwRdKdI1UNXoGFfFF9nN8NzOmkwSQ0cRMvswtunfw+yphm0doFqLjrjc0WUZSar4loGeSR6pOSLU8ebi/JkrnwesaWnoYc/1aUJBPdJqVPSJQzjx/Oupuf/R1ihtrn81TMYOUvEaKLk9wVSfSvjh8RGttelGQzTBNJsssgMeqcDh+Qz6r4RJeFKgaRlhn753ONhpYFsHOA/05biB01p6yVuJUR2A3I4tqTlKZ+Xt5K6nvklSqGfR/asdknv3YOkVZOtQxAjyjg/RmmtnslgrEae+k+pBRvgZU23ZT5nZ82LarvwQLYZlu2F16oJjpKEgT3cw98zGHlLEIanqAXIOhT8iR7Fwk6TTKreGcH+oOkFNmbXHWXAD9ixtGbLqoidjzBlLLSR1++hGoabWTFiJX2LKj3lCJ4z30snHEvEL5ruTnKMF+gXM+truHTDsrO5CuaWyGY3WYVTndJKFLi2PQu5FclItm6ykG7LLkMlOXcKTmOrUqOgQhgDR0R7UuPYneG3+8tP49Gar78dBGx+Da8xGwikj9K9OJYAlHpVo05oKo78qku6h+6J2fHgIvIyJPSC88Whc+HpqTBbVMAIjzOQDzTTafDZnEoLWczvFoR5x2aPLnYwXdjyljOhmpXH/bShHcfo1W4KEEzka0Yp+DMZpTiSyhBpA5iLdjZdU9RnTUPTwMtqSXfdbbf0fdgem+z3CsmiuZJVViFNkOfRqL5f7Np4ITC0v2XwLSWr/bC7gbUZiEQdwEr7jwVO1Bk6/MCzvN1G217W7/RUPA4Up/Iu6PRBPcC4dd2r16kpGY4U68Ud7F6iXnc1Twr1Znb+cuTdO4Fu2DQ","layer_level":1},{"id":"7416db23-312f-478d-8883-2fc3c41ac2e8","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"任务调度系统","description":"task-scheduling-system","prompt":"创建任务调度系统的详细文档。解释基于APScheduler的异步任务调度架构,包括调度器配置、任务队列管理和并发控制机制。详细说明查询任务的生命周期管理,包括任务创建、状态跟踪、执行监控和错误恢复。文档化异步任务处理流程,包括任务分发、执行优先级和资源管理。说明调度系统的性能优化策略、监控指标和故障处理机制。提供任务调度的配置选项、扩展方法和调试技巧。","order":6,"progress_status":"completed","dependent_files":"backend/app/workers/scheduler.py,backend/app/workers/citation_engine.py","gmt_create":"2026-04-22T18:56:47.083393+08:00","gmt_modified":"2026-04-22T19:01:21.98587+08:00","raw_data":"WikiEncrypted:sdobwW3Qsckh0ghPExsMqpKHfb7wkdNKzzEb0LwnbwF9AAuPJjv0n5NuRZJh+4pijYZVUlvqLsi39+IX2F1rFb7Cwl+tLWWt9K5KftV+sUHiNTzLlGKWF3ccgJn8PQtwlQ/LphP+9lXOdbRwRrPunFdPPGQ0aAJhFlEdp/Uwe+VmzNLucpMk0Woe3oiuwIpQxqHN7uJ6SP5oNFOoR2O3akimR10a3xnvM7K3IgAIgar1wOmOjYXPU9RedSg1IbRJanNQ9va6o94BGLn2gF0ocelg8C5G7mDGVDD502YOU29dp3lWEQNOuYCrJk/7TcUByfGBJWVfEkAlLTY0PRe+lgOZB+JY/52NeqPb0YHcEM7c4D3T9JvQYzGfe+0ofEf6J56As2Hp1KCTduTBIJiX/T6nzvtKxNeaEMufFNPPuShJhEXDigeOLj8qrNmqr+12QWLAS1zKYmD/SKSmntxDS48qfwW61UHQqKQf2LIZkbu0ckfQaQKM93kBUMsWCNhwXNd3gBKq21bSbyy9vWXeeNaWyMB8PolGGLpIbfsXtza0XBz2QXUjCUWIElMcJwhGT3XR43eMeHirubUg822Bm5xRQOw8pmZlPx/ejjvYwqlYGBBFa1LHLKPoI8RxWL+uYSAuOizhUunkEApUeb6ym6bQ8hYLWQZcA7WeW+rGfVb0ISK6yJ2UWZRDtPE/t7gPPMaIvRWsJMFETsKRL32YueXkQA0p1wF5lPO+RISBhVee1QdaBmSuk6BQHRDsKykEzXjJy9qXY0FX2IxTKr0YgzxlBPYNfCzi51/dbpTQw4PfDvtc+MKF3vTaWUbSfaKtIfbty2WPnqJ41akXcqi+dsUzGkmJBJ53UnWewV0zyLKHTfZTzKkckjZwk2xdvAubvIGr7whGIDapoukknBC7aQc49edSDQwGwQq0YfKhsEyrCwasSLn6Rg/Kfb9cSTywyxcsGx0uEpRl/O66en83ohl1052d0eWy32YvtbdKC11dnf8CWvrf0YVIIiigqswse/6kPNd42EMpHDcB5olJ5S8axdCj4XbLkTdRHVNs//ffb8+RSrE+5wsCgBx5XoaeXB5jP9rQBTXmIneoqiQtwjaen6gUmGXd3XXrRKecdIZTijNMN2ri+x2LV0Et3sF6cqWzz9fNHSX6uNs84JTM0pf40p8RK1MOhe2MQxueK7dz7qC8AM9ouZQU4Kf99iI4Ri8twpaiLAfmtJm8DgeYNdN+7OCh7aJnZB3tCd2DLck="},{"id":"dd12cc44-0c95-45d5-a726-e7b8bcf2531b","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"API接口文档","description":"api-documentation","prompt":"创建GEO平台的完整API接口文档。详细记录所有RESTful API端点,包括HTTP方法、URL模式、请求参数和响应格式。文档化认证接口的JWT令牌管理、用户注册登录和权限验证机制。说明查询管理接口的任务创建、编辑、删除和执行功能。详细描述引用数据接口的数据查询、统计分析和上下文提取功能。文档化报告导出接口的CSV格式生成和数据导出流程。包含错误处理、状态码说明和API使用示例。","order":7,"progress_status":"completed","dependent_files":"backend/app/api/auth.py,backend/app/api/queries.py,backend/app/api/citations.py,backend/app/api/reports.py,backend/app/api/deps.py","gmt_create":"2026-04-22T18:56:47.083629+08:00","gmt_modified":"2026-04-22T19:01:28.273743+08:00","raw_data":"WikiEncrypted:aJsVvsatVVT+Oax9nwx6A6Ka1Sy3/Ax3fbdr8CSPsFxZ2EWp6i+cqnOOrevL+QtbDx7fZdvtUwLW1B9c0o5HgMJhUO2KzsEGP7YsoxlDU753ninxqx1EdyuVgBpfmne2cuiP4lehjMSmZOUjZVE790YXol5PjHzWmKLvGdn4Ak3rcW8kVXk33ATw7m3S7a8cR4jfCtEyCjRkjwO9HmnCUuhWDHm4UBxIMuf64e9rAkWXgXEKmWLVQn6LqfAn+xOYtQNFa+I8V/i0q264hwIcYp54hi7mYo9SwN4UQgBvb136/8gwSUNjcRRGOsNv15tPDC2o3dD6nltM0j5yS87WC52EQFNAdL2LcLM0N2T1bR0gt6wLhrEbP4wI3frsX87BoAoD3SKOnwrpht8ligcnzudjGEB3B6ZzK5iy9iw3aW8IQ3vhQPLcm7ZC9BIiUGYsrVhh1GuQkAMRo+7pIMn+eXtSSR5kEeywAPYB2fGoNC5JROiSbSex7ogUbQSEchN2+vLngdjXQJprQppqPSC05z5kr5MtDzNosC+VAGwd8GUtN4PuMmHXmAEbAfV91lnTahK6I23pFsqmUpPL8F4+9X51VP7HNOjstUQZp27paBBxwQVcayi5YY5BWkkoUh/JD0k4Kge1kf6FpcZTvjgupvFlEFlMW1Qon57sNNm6gvTa8cBf50cJQhsz2y/jmBahK3Jb5PI8RA1wWAfGV6++BrMXYPHJiBmpdPVIrhqKYvqshB1aSuat6W19wgWmssQVogSZ1kpi0qPvCcLQ42fc9WHkr0ZUrWtckhrI8699i7I8wv9wo1qgwACzolsUvaYCCsaNbLSlsI5/GDAACQamzbenzol0/5GVe/rnqNIMtV4ihfmo/xqx2NXcy41ZX0dLBguZH63BzbVtwRXVUAPBX3QtDa6ANXNA/l+rTUD51kAHggAKOGf8DEhJxv+/VJRKJS3i88eDpyaYO/D/CASbjlqsFulTxe6og3RyEnPZkvImOCZA2bF7FAhhL+HGAubI5jLbMhy6JBIOD5zMtOJTn4m/SDKHFFqPNrYptBO/pb3d2xA7/MrGjCt4hxP0ua8BPswc294GZB4PqXWN0jmJQEI0Uo1jJsoMsU+gsp5xeLhOpNw8GFvALa2qpyvGKAJfQb8ML7uQhVAL0OCgx1VG323JeuNtDAAJ4BByXluHnybL3cQrJaNDsFkh7JINf42VvyIYvyNUUpUt8cnguhiUwhc5sPsvmDDBY/N7Btrl8iQnQJf1vbecErl3PgLxKMIzic31zBalQ6ZuLj5/vt8mYAbOMcVrYgqeurv6HyFaEOBN5L+LucZBCIEhb1BN/BixGceuW+FkzhKUw62/YJ1cIQ=="},{"id":"fc6f24c3-594e-4153-854f-19250834eeb1","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"测试策略","description":"testing-strategy","prompt":"创建GEO项目的测试策略文档。详细说明Pytest测试框架的配置和使用方法,包括测试夹具、模拟对象和测试数据管理。文档化单元测试的实现,包括认证模块、引用引擎、查询处理等功能的测试用例设计。说明集成测试的策略,包括API端到端测试、数据库测试和系统集成测试。提供测试最佳实践,包括测试覆盖率要求、持续集成配置和测试环境管理。包含测试调试技巧和性能测试方法。","order":8,"progress_status":"completed","dependent_files":"tests/,tests/conftest.py,tests/test_auth.py,tests/test_citation_engine.py,tests/test_citations.py,tests/test_queries.py","gmt_create":"2026-04-22T18:56:47.083879+08:00","gmt_modified":"2026-04-22T19:02:30.71425+08:00","raw_data":"WikiEncrypted:a51tw9+B5Xez88YuZqi4cPV0J1CJauHTZselAZQ9sG7l4kxIBXkREciZA7/pohakdE3sC1hkisnzN73PhaoUxdvybhz7kQc7mVyOBWRNwkYr9a/q7TEjfGgarJg0hM4Y7AdW3t8VKH9A//8yxExBcKkoxvED2GIiyB+1EESq1gKkenL7nxoYRe3whjG2O3FEBFv9Ho3mg7vmxi6PcPHokGL6lWBoXxLWE8hq+zflPrMRmWTq2inZhXP8Q6ai6DoYAyJQB4XMqSkNrYEplXBOCsKBx+oKOWJoLU2C8mnb7RaaaRhGeC09wYIpTTRc5XpWu2ycDep70W27vus7AlQW05t7Amij1i1J22fqL3mu1n37WaYCtDCyglNddHe7wqWUzbEovxQ2/6B6RVqFV/GY589ZvOaaJ2Nny8/ffhDRS7emYnStcTWnyQMjRoAVBSE7DYtWJtF8dceDarKg/QwIGtYDCW72Ol2r7iPlDt4TJEq/IfVQh1fH4OD8Ag81wOMKEB2ajvsJAsUvbLSOFJCtjFc4/cxSYj1XsU013Tg6vedTRNFE5J1t5ffc7D2E2eROt6sxRZxpJ6orusy5H9IAexDadlKHXdmU9G5EiCA+oSBNzMsutb9BMwv0HB0oH0SgjFHvvGgeKXMomIEKVf2gOvaMLHvvgL5n0hnYlsSvHFAzNCNL3l+UAkF+gBIQkkUKeCed7m5qK+jsw+aGjXfTMKxOn5yvjiXqpjvo38W+KLTNvqCmaWDV2qt8b1ZNc1lJneqkQ6OfpmZgY2OaO3E1KqaTUUYvc1IlB87GdaQRut9+tqTvMFqYUFAAcdWggWayFTqfuwe76oPDyCaKaDeg4vh8sam8rcWSuc53fUeglmB3OUJ933wCTT2H20PH/cH/V6Ace/olr4H9lhuk5kB3ZFmYRM2pMg756Q03uVUzingRX7Nq4fLBaNHKnkdm/ffM2F3sr1wL23SMuRvxc5pJHZn7ee+wCsBurAIghI8+OT3wgjn9NQVeZDwaQJUXrN8AO2oRz11HrW8fiD3ddCg3BcWcqoDwVh+4uJO7nov+41GEqFhjROW3lrRAlqa43VURj6tTsyCYg3uYGq9S07gY0Ifcnfl2e0GJxARoyQ7LuOsGqVScUdSUKqRKYzOpqFszHrfLDa+W7yy+AwXpWEJd7pexY1rRiO1IX1P6Bofatp/bBwvitXxtqwW0vGRQF/J4jWHTsitHw7AATgLA1P6qPPvm6FUZ9SKBtubz7s+Z2vBq5//3W6qs0c6jX3uWzaoJ0ru8OXhFtOPye8yc3kmnBcFd4EEV7xALnxAjhsLW0uI="},{"id":"803bfef4-3985-477e-a61c-915a246d0061","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"部署与运维","description":"deployment-operations","prompt":"创建GEO项目的部署与运维文档。详细说明Docker容器化部署的完整流程,包括镜像构建、容器编排和环境配置。文档化生产环境的部署策略,包括Nginx反向代理配置、SSL证书管理和负载均衡设置。说明监控和日志管理方案,包括应用健康检查、错误追踪和性能监控。提供运维最佳实践,包括备份策略、安全配置和故障恢复流程。包含CI/CD流水线配置和自动化部署方法。","order":9,"progress_status":"completed","dependent_files":"docker-compose.yml,backend/Dockerfile,frontend/Dockerfile,backend/requirements.txt,frontend/package.json","gmt_create":"2026-04-22T18:56:47.08417+08:00","gmt_modified":"2026-04-22T19:02:23.851886+08:00","raw_data":"WikiEncrypted:0IKfLNOWe9mZfG1jVts3w2XbjO+yyEmY3ONOjrL5GjA8+3c0QEcD9OcCVHu+1BW/N5NkoQV86wegqQ9ShX8iSWP5bp76U/WBxmHscWo6tU/8QlGuoaRAEg/ev4XsKkgC39pvYnfm60PfrpsE2hL1E2GfNGgG77OCHFDgZXXNbh9eCPmSkW8+YhED55nkyvxbnzr0nBnhsGtTzPUxHW1tar+GAvP539R0R/4mYQI87YJ70yZ7fcsaLwgOXmzP3dVnnmpLv+9t7xJhpCjyQsxfBfLLWBAADnbPD/XDJUZjfKYBtzZr96wOF29GlOAKy0gF60uUu4ldT+fyQn+nYlMXrNBIPA4xv5zs0p3ITXaqvMn5CnUdObefSllD9bB5ZAVzibfAxAovDM6bFfCBg78rOiHHyhVisNUpyQVL18Ac1DA/7UfdJH03ceu0hk7swBM7UlLgBUuU8iZZq8IKLS9Hunf/aF7T2fuFhJB+LGpBGwV+3OqWaT6v4reKhSW8vMM4x8XvLXgDttwPeltWlMknvzqijyjE0V38mue+Fe5fYrBZIK66PxnXrGUJKvZPwyAC/8LX6Hk+M3aBWjL4QkiKpbN2/pXCR6dXuPfbswZ11T0xSYdC8m+8SmC5UAgcryC0PI+ULgqxDhrheiaPIpfOAGnPr19iY2++A+xP/IPZf4L9hg2cNxi5vJ+ws54SmeQDUdbzx15ZECbSbz9xkShlRAYOjuUB9/IpZFt7EqH7sEqsFlbF73qp72JFPp2/QYv9av/WYcw6WVtRJG4TQ/Z9jB+DN6yCeSC6B/CfK05zoF7yrVWkLPiSSVYGDSBndH9EFJEJJvzO27tkS1wZXs4fTTE1StkTjYn8EBSRVvIs3Ywg1+iM2SFYcbn3I6QCeqaXuMJ/yEJikxIeLJGlNjiShYEo2FOMQ/6Xk+TlHkxUTepgnzhxFkPq9S2dqK/ZunroHtiqObkTqfkqta9V4EreMpXtO/FUBsVUrmehzAmO7CQ53L74HnyAqFJYWA/iDUt8rABkFT69QahL9BU4bts3AKhAypInqPXBL+0v0WyatxLd1jURgSq11VX9UBNBi4li3TcoFc9wsZpX3LeH1vNueLQzvssRDfTY9doM+g0rgBXDOO59DyyOKrDDMU5D52k5KI5SJOaWWxEa24TOoTfC79Jpc6tW0zAhdvdLD6u/pfsZd693uN4RM8fMtZPh58w5rcXuEHrhVI/0JThluHDnb6a962K0mt7d1makwsRTPZvpvaTrgiaoByIyOuKY7q1L"},{"id":"2148d7d6-25c4-497f-8894-c4eb7a0d2bd7","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"开发指南","description":"development-guide","prompt":"创建GEO项目的开发指南文档。详细说明代码规范和最佳实践,包括Python代码风格、TypeScript类型规范和命名约定。文档化开发流程和工作流,包括Git分支策略、代码审查流程和版本发布管理。说明开发工具的使用方法,包括IDE配置、调试技巧和性能分析工具。提供新功能开发的指导原则,包括模块设计、接口定义和测试要求。包含常见开发问题的解决方案和故障排查方法。","order":10,"progress_status":"completed","dependent_files":"frontend/tsconfig.json,frontend/tailwind.config.ts,frontend/.eslintrc.json,backend/requirements.txt,CONTRIBUTING.md","gmt_create":"2026-04-22T18:56:47.084469+08:00","gmt_modified":"2026-04-22T19:02:27.521973+08:00","raw_data":"WikiEncrypted:F3QgleoEfoy16cQggYe9C/ucQxiwh0okVA48AmODs5RKNS8ZgNngqmnHSFcG/1UaJxx+3dUn+EkMTpYUsOg40rZn+i8FphtVARmS5F9VbvHFcBiSlQaH+JQdr5mv45kEraKM1ZQU+BmiivHhLeOOFfZaf4wfF+UeGEwIZ5K3xgdlrIWG5cbIQke0aAuN4SwF5zFLobVRGY/vFRQZvRJuhJF3kH8cBQLGOghlzoYuvIMN0Syv8UZ5Bwec8p+VF36mvhOS8eFAksKHI6byEdpfq9UTiqxgtTq5L6Rj+37HpAP6khb++vSf1A0VT9NXevaHHhhVOWEkLrGTB/CHEKIg4VNJ5WWcgiIXY17BHQyXjIl4uJr0Fu2kI3bicD88UqLxf8vvCmO6N7KSm9OpUdXgYZoLSYFkU03TCUpLmPpUmOuHim5SyBdvTcd1cnYN48DrbjjDTnkYFYcHEsyGmIESGqrS8AMGyLqSnm5D5gNd5fcrj2+Nf4lrHZbGPN/GpOP8DVbWL3BxZsuvhmlXDJYDI4GYZU00w/cqWFfsh//f8AWxQksGMwuNq1z/Za4kUhyjJoFRB+vVjaYxJnmtnzHgcUsroK6pk+mnzl2sFRRlQRuMqDEWNhr31C+GITHwnZA+ISXYuGrJRXiyzbB/ICIMnQLKjTSGTJOv0611R7UfXQ9XSW5XcnEevf/xaKUaXyI/FSOb6NOMw9DEXCzTFiCSCqdXV24hyN/2eLMEWGD2d7hFS4CBCFDcKoDoV3UWasymEMLzPGi+O8yZ6SFUM2OFa+CFcm+CAV0glSLkFZMwoXi2vpmFERQ0wQbxo7EHKlZA2r9j8A33xsPpGi2bODYiAqMxjvXIIOSDkeokKHKcG+VglGTbPiYbKMmWb3UJ8LUxQsSFs9woUopss+huIV87sUJ7wqGYZGRktkElcXzByJv0D1LNiX7Zfkeq/DTmo9gY1fGwt8Lmr/ZToeLVUWrBHfDTpNtE8Vk+2HsAY/Q6mMhPpkWFCLXMhVexKYRhZ78g5WrTyG220Cs1UqKJ9EXOzd03j14pvt8XxTGNYB4512t168u5QR3RTob2+A8xvVhOvZ5bq9fUVTu2BMD6+hxnKeBlnxDPMCDB6TQppLI2ylmxd0STP3NVTtVXA7ZqRslddheuyl+fGiDx3YaKfbF9pmFBIcUVgxFDSi77e7ZkIQnP7jQeoaQtgVtuU/xJX5vPDaFWBTY5qcyicSVwBGJWIzfDA1ylBWdzcfOmtz21yOw="},{"id":"b2bb2e3c-5661-497c-97dd-15bf6ee8b7d4","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"扩展与定制","description":"extension-customization","prompt":"创建GEO项目的扩展与定制文档。详细说明系统的扩展机制,包括新增API接口、前端页面扩展和数据模型扩展的方法。文档化配置定制选项,包括环境变量配置、功能开关和性能调优参数。说明第三方集成的扩展方法,包括新AI平台接入、新数据库支持和新认证方式的集成流程。提供插件系统的使用指南和扩展开发的最佳实践。包含系统定制化的案例研究和实施建议。","order":11,"progress_status":"completed","dependent_files":"backend/app/workers/platforms/base.py,backend/app/models/,frontend/components/,backend/app/api/","gmt_create":"2026-04-22T18:56:47.085228+08:00","gmt_modified":"2026-04-22T19:03:46.033162+08:00","raw_data":"WikiEncrypted:9tFZPEMPWdLFkkE2XbXYMuMB8FuOYQ0fj+/JXYKsHGVuXRejugUICkyxL86Ju3MeDs2yZuuby22yn9F5xTbpPvuSC/FoLxV09I2ZpvfpcQFUCVmZyQN67BPwYA36FWIbbHI5AJYWayiJUo+io2WnBda4ESUkmi1Ifq6VpdD6Et8Rw2b8dgDDMxi9XaN9V0JJWAK4CsV0ZYGNAK947J00M9KveVb322Q2MkjA5aw0eylKLH0fzY4qNXNGDmfCOuncuvGiH/5DvAXCDuDLYzVd1AHr/9UgPCvmp017Oo8KijVdD66YD+QM7Rh+24GqNvD5xFbOQGd7ey9Mzs33E6JIrsbUhBvbLJOVlRo0EdScVPZsU4HO6zqDAg0ozD1a5kGX/WxHBvhKBJATucW9vC2XG5g21SjjE6NdebD3z3ZjN+cu8jYHMi1BwWhOmvNRvN8HIGjzntLglg7fNrii0iJXTxpZ8Mbpmu6Tk88oMecsGleuA2xhK1yEWycuQ2dZn5e179BE3mGaSOT0Fvp5yXgL4htvqVTAu4QZ+JFJVk8e4NkI2KaoEgS8vmkD+tvnSal6LUgMzXvRJVj5c7y5LEqxY7QwEbvunmtmHaw9xxVNmfj54tFWSDCSUVCBp+otUfdEq+e6UMOQ64QITUXyYlP+zGW5J0ZWBf9GlU5j70IekNuO3mLp/yU922OD64PhCEL3HOTmAtV1L1vunWchdtvyht6rkYuys0Al1WSGeCmVT23fmJlSuKe++K/qQ/TheLhgA4euY3OnlacLzbia76+B2p4tJY+XvzzDZ5c3M6YdKmW0+iKB+TRJgVz1Q8GpFIzUk/ShBam/TanUxOcC0ci89hjchiYImL1tQeigX4Rgfcn8mXYH956z7eyiSYtqk7uIsQYfiW7tqvcyN0jJpGUVHd9IzvK2NAC+ICHilErsg5hRJ66KFaugTnjd2WoIkU8rktkywDasvD24NZM417z8B8l8uHq9XNcg+2bdPA9hqx5ujEUiGXyWkBNvwCZXg9aL2q+4y5NMoZh6ak8uEjC1kc1S61q2kFyKyIjV7QbCMaHhjnrBnkSg/kV2cGrBPeOqWdtANBw5wZ/OJ38FLWJ5nPOzreTmQ/R6J6YNCfmRPpfpVj0tH0o+0rffNxxXa2TnUbu4OSSLdCljK6CsfuYmBOStwIQtEs8T8/+PsrbQKY9NM1KHqhg5Nk72UNylvGupV/Zccfjg3z78M9uUqtXSOA=="},{"id":"8e3d62e8-ddbe-4820-bc41-7da9e91ea598","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"故障排除与FAQ","description":"troubleshooting-faq","prompt":"创建GEO项目的故障排除与常见问题解答文档。详细列举和解决常见的认证问题、数据库连接问题、API调用问题和性能问题。提供系统监控和诊断的方法,包括健康检查、错误日志分析和性能指标监控。说明调试技巧和工具使用,包括开发环境调试、生产环境问题排查和性能分析方法。包含常见错误代码的含义和解决方案,以及预防性维护的最佳实践。提供紧急情况下的故障恢复流程和应急处理方案。","order":12,"progress_status":"completed","dependent_files":"backend/app/main.py,backend/app/config.py,frontend/lib/api.ts,docker-compose.yml","gmt_create":"2026-04-22T18:56:47.085508+08:00","gmt_modified":"2026-04-22T19:04:06.13183+08:00","raw_data":"WikiEncrypted:CaKOW8OSSWs4aEYk06Hu0tuZET5JxbVXxA/4vFailoRiq8l6SCRMdp2PbHfZPheZXyPTAgE3AT8Ce8j9xPOCdJxNKAOstuOjZEIRRi9OOYwoluR4MUnob24X+IyLHwTgsJGf9uPY1LVFTI9RTQt8aG1cBHibaRNEJ8+DVkXJW/EDypOxFpOxDxlaCscMdiPRLwhr9V4vJqWV9j2rk1LjP2/M8SJJQ8hbaDoeLevKdECB+aEw9JrL9ycGW0dhxKxQLf/ril9zNHrvahlSXbVZSZ39dpBl57NdFcFaOYt+paf3O6hv3bCTAKGLTRnYa/IuAZ6Xa7YnhqaGQ684LKCBz6VySRNYVUCEvZotYHf1IQdWOj0zFzR7LEIEikIlZyKak++yTNYfbQyBEzye3g6YCmlh6VaVmtGIRzjOYpu0K1UftNcRa1mWnIMrB/Pqe9DpNTg+Yxo3ZHrPyv3ZAmrd8MqA+T+P+/NerCmFD3dRf94NLPP8KU7in+VSfEjVmdE0N+3OfntU+uvNL/kkOhyWNRUKYKFxbqdwCTKqv3Nchs73XyhfNRP7gPkR/stgnowCRnKWS4ncUEJDZTWVFID52kE8nH7Kq/yuB5bJxFX9AeUUaNSBgvMc5YNkq3vULFEqC1/N0bpU4r9+0/U/BcMktmNrRr1HnOIPl3QzwjIsT3j2lp4UXS3Qm4BZFJsh8MVLfgOIMbO1jbuGCXHl88T/rZOCNwf4q93vWo2HnOxDkbdICWgZ9dinRr85RkFQjNWlXdAk0XG8lQPotwJLvS+ZASOv1aWyL42jk/mTJcOU53PFT5rf3+WpVmhNWQGguZ0l04eubO4Va39c6h/+DNsl0OEAiozIMohEgz77qsD47Kf0KZMLnqL3o30TYXYamX/CP8+epBqSWgmzX/ETrrRl/1/JPkSDc//0VC8UmWBJAsdUdzyQh9v9iQddyIZ4MV1k4MGTJ6GwrUqVTszShZJVG80wDMLQvJGqJ0T5rH1P7kBaJ5nBnth822MBy7B1IhN6nDqtLhOJcqT8Qt6x8ODGFx1QMNBdS4lHq5IcRy+nZKiPP3V7uMuuFQsNNodTRhmNnuAliJACWS89hPiGroan2VkusxIu2DW8wdQ/3Z31mIn4cE3O3+Aq6lO+BEMAuYh5WkOEmGsF3cjX/zPPiuBSP7Vd2a9o6gPA7MBfneMWyqodMp6PKh7EG26gaKUaIGq6VkQobSAVfbLxmfIMW6cZ5STH4U1/A7gV2PeuWzwwEJz7axGVQIJ6A9geQevZvD/cnX6BQBuOMkdAOB6PApCpQA=="}],"wiki_items":[{"catalog_id":"1bb55e12-24c4-42cb-8f59-ddc303460d45","title":"项目概述","description":"project-overview","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"34e572eb-6fc8-4de7-8061-63783ef8be24","gmt_create":"2026-04-22T18:58:50.323135+08:00","gmt_modified":"2026-04-22T18:58:50.329272+08:00"},{"catalog_id":"e3ae8925-4862-4280-b85a-0b376841b15e","title":"快速开始","description":"getting-started","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"7f028ad1-e989-43ea-b945-c79c33e6f0e3","gmt_create":"2026-04-22T18:58:54.232866+08:00","gmt_modified":"2026-04-22T18:58:54.238013+08:00"},{"catalog_id":"7c2ac186-ec90-400a-ac1d-b3b7ca2f01d5","title":"后端系统架构","description":"backend-architecture","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"c7eb113b-b503-4d83-be7f-9ccf3350c9d9","gmt_create":"2026-04-22T18:59:20.999631+08:00","gmt_modified":"2026-04-22T18:59:21.004772+08:00"},{"catalog_id":"d907a8eb-795c-4060-9cdd-50d31cf39be3","title":"前端系统架构","description":"frontend-architecture","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"3af3bb9e-4d99-4dc3-b1ed-2686db385c26","gmt_create":"2026-04-22T18:59:54.989699+08:00","gmt_modified":"2026-04-22T18:59:54.994419+08:00"},{"catalog_id":"243a1a45-d31f-405e-a3b9-694d2fe617d5","title":"数据库设计","description":"database-design","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"ffbb970e-56e0-40ad-bd88-1a1e55482d96","gmt_create":"2026-04-22T19:00:15.762815+08:00","gmt_modified":"2026-04-22T19:00:15.768379+08:00"},{"catalog_id":"7416db23-312f-478d-8883-2fc3c41ac2e8","title":"任务调度系统","description":"task-scheduling-system","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","gmt_create":"2026-04-22T19:01:21.979952+08:00","gmt_modified":"2026-04-22T19:01:21.986003+08:00"},{"catalog_id":"7e66719b-4a8a-484d-889d-10fdc76788bb","title":"AI平台集成","description":"ai-platform-integration","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"cfc48cde-e1c3-47f6-afe2-a6d7a8f4ab69","gmt_create":"2026-04-22T19:01:25.981164+08:00","gmt_modified":"2026-04-22T19:01:25.986389+08:00"},{"catalog_id":"dd12cc44-0c95-45d5-a726-e7b8bcf2531b","title":"API接口文档","description":"api-documentation","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","gmt_create":"2026-04-22T19:01:28.269494+08:00","gmt_modified":"2026-04-22T19:01:28.273884+08:00"},{"catalog_id":"803bfef4-3985-477e-a61c-915a246d0061","title":"部署与运维","description":"deployment-operations","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"98909ecc-fceb-4ab7-a26f-741838eb2e50","gmt_create":"2026-04-22T19:02:23.847103+08:00","gmt_modified":"2026-04-22T19:02:23.852058+08:00"},{"catalog_id":"2148d7d6-25c4-497f-8894-c4eb7a0d2bd7","title":"开发指南","description":"development-guide","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"643984fc-5a57-498b-8f25-68cc318d9d82","gmt_create":"2026-04-22T19:02:27.517117+08:00","gmt_modified":"2026-04-22T19:02:27.522128+08:00"},{"catalog_id":"fc6f24c3-594e-4153-854f-19250834eeb1","title":"测试策略","description":"testing-strategy","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","gmt_create":"2026-04-22T19:02:30.709013+08:00","gmt_modified":"2026-04-22T19:02:30.714418+08:00"},{"catalog_id":"7c3e3c0b-5d1f-4d64-99be-668041c6cd9d","title":"核心框架配置","description":"core-framework","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"f94da0b4-8a07-4de1-b0b3-d3b32a12c3c1","gmt_create":"2026-04-22T19:03:21.689103+08:00","gmt_modified":"2026-04-22T19:03:21.693211+08:00"},{"catalog_id":"b2bb2e3c-5661-497c-97dd-15bf6ee8b7d4","title":"扩展与定制","description":"extension-customization","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"c5849940-e223-4222-be17-aa0a6cb36bc8","gmt_create":"2026-04-22T19:03:46.027426+08:00","gmt_modified":"2026-04-22T19:03:46.033304+08:00"},{"catalog_id":"8e3d62e8-ddbe-4820-bc41-7da9e91ea598","title":"故障排除与FAQ","description":"troubleshooting-faq","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"85306af2-0edf-42b8-b7ad-c03e769cb1e8","gmt_create":"2026-04-22T19:04:06.127415+08:00","gmt_modified":"2026-04-22T19:04:06.131953+08:00"},{"catalog_id":"bcaa04da-04e3-427f-ba01-847ad657e78a","title":"Next.js应用配置","description":"nextjs-app-config","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"c112a3f4-b0a1-4c4a-a325-e3ede8c90be6","gmt_create":"2026-04-22T19:04:47.356556+08:00","gmt_modified":"2026-04-22T19:04:47.361504+08:00"},{"catalog_id":"9e3d703f-f424-47f4-84df-b99873b93e5a","title":"项目介绍","description":"project-introduction","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"2793782c-91c8-4052-b9db-39513426c736","gmt_create":"2026-04-22T19:05:00.372036+08:00","gmt_modified":"2026-04-22T19:05:00.376145+08:00"},{"catalog_id":"a06436ee-1678-4a51-bbf8-b0d0ac3456b9","title":"数据库架构","description":"database-architecture","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"d5c75004-b01b-416f-850a-4791c5489a32","gmt_create":"2026-04-22T19:05:13.619093+08:00","gmt_modified":"2026-04-22T19:05:13.624074+08:00"},{"catalog_id":"7fea5a24-e6de-4003-bc70-9dae6d8fdb25","title":"适配器架构设计","description":"adapter-architecture","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"37003fc0-1cf5-4264-996b-40807001875f","gmt_create":"2026-04-22T19:06:14.01196+08:00","gmt_modified":"2026-04-22T19:06:14.016291+08:00"},{"catalog_id":"b027f234-4ac5-4d6d-9b38-afc8054325f5","title":"单元测试","description":"unit-testing","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"8150ddbb-7aa9-48d0-9953-2ef55e4bcfd5","gmt_create":"2026-04-22T19:06:55.084551+08:00","gmt_modified":"2026-04-22T19:06:55.090188+08:00"},{"catalog_id":"940e5918-1689-4001-a284-44f2de75b8ee","title":"认证接口","description":"authentication-api","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"7c7564ee-7fe2-4555-8ff0-4ec1b757997a","gmt_create":"2026-04-22T19:07:12.352034+08:00","gmt_modified":"2026-04-22T19:07:12.356599+08:00"},{"catalog_id":"78288302-33bd-44f7-8b29-24f516c8b6bb","title":"调度器设计","description":"scheduler-design","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"a1cc822d-5382-431c-8c49-cf398fb5eb3c","gmt_create":"2026-04-22T19:07:22.166733+08:00","gmt_modified":"2026-04-22T19:07:22.171749+08:00"},{"catalog_id":"6406f42a-e10b-4a2b-84a5-0a21c1c759ea","title":"代码规范","description":"code-standards","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"13c568d2-dfa7-4d1b-81c0-dfef247cbb67","gmt_create":"2026-04-22T19:07:51.271116+08:00","gmt_modified":"2026-04-22T19:07:51.274241+08:00"},{"catalog_id":"a91fff3d-ec5e-43df-8176-22f0084109ef","title":"功能扩展","description":"feature-extension","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"d2c7157d-157f-4990-8f76-11f3ea5435f7","gmt_create":"2026-04-22T19:08:25.13644+08:00","gmt_modified":"2026-04-22T19:08:25.14088+08:00"},{"catalog_id":"e8ec6ac6-ad1a-4332-a7be-727b47d71233","title":"Docker容器化部署","description":"docker-containerization","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"1ed0b482-3d6a-4bfd-af40-47a5d1f3e802","gmt_create":"2026-04-22T19:08:34.079807+08:00","gmt_modified":"2026-04-22T19:08:34.084736+08:00"},{"catalog_id":"c19260e2-5163-43d4-b35a-b48aae995f4a","title":"认证系统","description":"authentication-system","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"df661133-efbf-43fe-97c3-f581c81f47a7","gmt_create":"2026-04-22T19:09:25.676813+08:00","gmt_modified":"2026-04-22T19:09:25.682345+08:00"},{"catalog_id":"9b71fe02-5927-4a19-8db8-66eb129ecd9a","title":"认证系统前端实现","description":"auth-system-frontend","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"2b32ec11-d228-42c0-9232-103ba7e44f71","gmt_create":"2026-04-22T19:09:48.743111+08:00","gmt_modified":"2026-04-22T19:09:48.747746+08:00"},{"catalog_id":"b80dc237-1a6a-401f-9f4d-14190edebcdd","title":"技术栈","description":"technology-stack","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"e23bd86e-b4ac-40eb-b1c1-38d929fd5419","gmt_create":"2026-04-22T19:09:54.21211+08:00","gmt_modified":"2026-04-22T19:09:54.216205+08:00"},{"catalog_id":"7e5c3b8e-5aa3-448d-ae52-d5a96a413b0b","title":"表结构设计","description":"table-schema-design","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"c3fa653f-8dd7-41fe-8c2e-8b60adbf70f4","gmt_create":"2026-04-22T19:10:23.573187+08:00","gmt_modified":"2026-04-22T19:10:23.576944+08:00"},{"catalog_id":"cc7a1f1b-c70e-4c61-bfbc-6dc408a12ff2","title":"查询执行流程","description":"query-execution-flow","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"2fc79486-ec65-4533-860a-89c8877c2ea0","gmt_create":"2026-04-22T19:11:29.34722+08:00","gmt_modified":"2026-04-22T19:11:29.353951+08:00"},{"catalog_id":"fec685a0-c9bb-4048-baf4-40b56b2aa29c","title":"集成测试","description":"integration-testing","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"8c17b44f-1586-459b-a83d-c9b961cd2142","gmt_create":"2026-04-22T19:12:37.811472+08:00","gmt_modified":"2026-04-22T19:12:37.820956+08:00"},{"catalog_id":"9fe32b83-3697-4939-8b10-524f5ed3e65e","title":"Kimi平台集成","description":"kimi-platform-integration","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"2126339b-b0f5-4152-924b-cbe028cd0c39","gmt_create":"2026-04-22T19:12:57.009145+08:00","gmt_modified":"2026-04-22T19:12:57.01442+08:00"},{"catalog_id":"b10c2334-a850-471a-9851-a1c698e3a485","title":"查询管理接口","description":"queries-api","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"74d3018f-4e23-4687-8bf4-7fb403f479f7","gmt_create":"2026-04-22T19:13:13.111099+08:00","gmt_modified":"2026-04-22T19:13:13.115929+08:00"},{"catalog_id":"0c1d3542-92cf-4796-8dba-82caf2f7b361","title":"开发流程","description":"development-workflow","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"222a9371-45c1-4e0d-b1da-e8ada1c501c2","gmt_create":"2026-04-22T19:13:23.079488+08:00","gmt_modified":"2026-04-22T19:13:23.082539+08:00"},{"catalog_id":"109a8fb1-6619-4bc7-8481-e28cc2127d24","title":"生产环境部署","description":"production-deployment","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"26f80935-eac2-44ee-bcdb-d6a79c537750","gmt_create":"2026-04-22T19:13:58.693673+08:00","gmt_modified":"2026-04-22T19:13:58.69756+08:00"},{"catalog_id":"4d5ac6d7-8812-414b-b8df-68574cc36d7d","title":"配置定制","description":"configuration-customization","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"e1e0bd0e-01b3-4543-9781-d9beb32b9a57","gmt_create":"2026-04-22T19:14:17.837895+08:00","gmt_modified":"2026-04-22T19:14:17.84356+08:00"},{"catalog_id":"159f2ccf-71b7-4d1b-a4c4-c15b23a4126e","title":"API接口设计","description":"api-design","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"11936bb5-374f-40f4-bb53-b75264fc4b9d","gmt_create":"2026-04-22T19:15:14.073829+08:00","gmt_modified":"2026-04-22T19:15:14.079089+08:00"},{"catalog_id":"9cc59a5a-f597-4707-b994-b6c49514d553","title":"页面组件设计","description":"page-components","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","gmt_create":"2026-04-22T19:15:16.958138+08:00","gmt_modified":"2026-04-22T19:15:16.963368+08:00"},{"catalog_id":"f70f5d9b-d7c7-4dc6-b36a-5f4508e6acaa","title":"系统架构","description":"system-architecture","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"70b3948e-f456-42d2-b7ad-a0097ad5ee5f","gmt_create":"2026-04-22T19:15:17.448445+08:00","gmt_modified":"2026-04-22T19:15:17.452857+08:00"},{"catalog_id":"816a2805-76c9-4f32-a3cf-96428208081e","title":"数据模型","description":"data-models","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"262a3941-fdc6-46b0-b767-be40aa9d5761","gmt_create":"2026-04-22T19:16:35.087998+08:00","gmt_modified":"2026-04-22T19:16:35.092985+08:00"},{"catalog_id":"64cbb894-755f-47b5-854e-c26c7821e9b2","title":"文心平台集成","description":"wenxin-platform-integration","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"fab60eaf-9652-4cb5-9f9e-0525caa62d63","gmt_create":"2026-04-22T19:16:36.921828+08:00","gmt_modified":"2026-04-22T19:16:36.925945+08:00"},{"catalog_id":"412f8cb5-54c1-4f32-8966-fa0e5e75bbca","title":"性能优化","description":"performance-optimization","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"d8e2cef5-37e6-44e7-8a7b-9bd365b82a72","gmt_create":"2026-04-22T19:16:37.806188+08:00","gmt_modified":"2026-04-22T19:16:37.81795+08:00"},{"catalog_id":"2f7fa0ab-cd3d-4f45-a1c1-389d5a0c2561","title":"开发工具","description":"development-tools","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"979be617-a83d-4db9-b73e-38581348f8c1","gmt_create":"2026-04-22T19:17:43.348035+08:00","gmt_modified":"2026-04-22T19:17:43.3539+08:00"},{"catalog_id":"40ac97e8-7ef0-4198-82d7-d2e332be9d34","title":"测试最佳实践","description":"test-best-practices","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"05e59a75-d52f-42e1-a924-f6a32f06f2fe","gmt_create":"2026-04-22T19:17:48.811042+08:00","gmt_modified":"2026-04-22T19:17:48.815559+08:00"},{"catalog_id":"41a414d2-e13a-497c-8a03-212624dbf5fe","title":"引用数据接口","description":"citations-api","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"737f8d6c-bd8f-4c11-b142-71a400423323","gmt_create":"2026-04-22T19:18:18.048509+08:00","gmt_modified":"2026-04-22T19:18:18.055466+08:00"},{"catalog_id":"2713d5c6-c6b0-4a38-83f6-56940c2bf695","title":"监控与日志管理","description":"monitoring-logging","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"eb1288f7-5ea1-413a-8f54-4f870306d14d","gmt_create":"2026-04-22T19:18:41.294736+08:00","gmt_modified":"2026-04-22T19:18:41.773932+08:00"},{"catalog_id":"c8a468af-2982-4d9c-82c0-313b5d2ee89c","title":"第三方集成","description":"third-party-integration","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"e9a02c86-236b-49cb-bbed-9462ee123c04","gmt_create":"2026-04-22T19:19:17.34688+08:00","gmt_modified":"2026-04-22T19:19:17.362503+08:00"},{"catalog_id":"9eee7fab-6cd9-4ef3-9415-2f8137f1d199","title":"数据模型设计","description":"data-models","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"23ad3419-5473-4e2c-ac87-d9715090279d","gmt_create":"2026-04-22T19:19:19.260533+08:00","gmt_modified":"2026-04-22T19:19:19.282116+08:00"},{"catalog_id":"f210509a-2381-46fe-8c22-0ed768e6ca70","title":"数据库迁移","description":"database-migration","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"7c0201f7-9e02-4cba-9ee1-81c3477f049a","gmt_create":"2026-04-22T19:20:15.023549+08:00","gmt_modified":"2026-04-22T19:20:15.06665+08:00"},{"catalog_id":"d9e45b2a-6443-4a9b-8ed3-4c3c04773772","title":"UI组件库","description":"ui-component-library","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"760610d4-dff6-4c6d-831f-7c9078db86a6","gmt_create":"2026-04-22T19:20:16.20858+08:00","gmt_modified":"2026-04-22T19:20:16.229612+08:00"},{"catalog_id":"178b681f-d013-44b7-aef8-dee7ca8c22a9","title":"核心功能","description":"core-features","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"1c4316a1-f1d7-46da-bcfc-ea2fa0c56110","gmt_create":"2026-04-22T19:20:37.644038+08:00","gmt_modified":"2026-04-22T19:20:37.649918+08:00"},{"catalog_id":"ac0658da-7670-4e41-9e57-02d9d0d50680","title":"报告导出接口","description":"reports-api","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"ae62f4a8-8840-4c8e-9a42-3373370299ff","gmt_create":"2026-04-22T19:21:24.241821+08:00","gmt_modified":"2026-04-22T19:21:24.246484+08:00"},{"catalog_id":"aad61788-1dc9-4682-b743-47188d7aecb6","title":"引用检测算法","description":"citation-detection-algorithm","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"00359e45-209d-4be3-8795-50dea52bdba1","gmt_create":"2026-04-22T19:21:33.106655+08:00","gmt_modified":"2026-04-22T19:21:33.125906+08:00"},{"catalog_id":"7cb1d921-44ed-4e22-8bf9-baba7ff8b7c7","title":"新功能开发","description":"feature-development","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"422c46b3-e69c-4023-a878-411a48ae182f","gmt_create":"2026-04-22T19:21:46.910999+08:00","gmt_modified":"2026-04-22T19:21:46.916175+08:00"},{"catalog_id":"c45e66b9-1ca0-41da-a796-6b98f394faa1","title":"运维最佳实践","description":"maintenance-operations","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"aa6db9b6-71e1-4497-a0e2-f3ff25358d3a","gmt_create":"2026-04-22T19:22:39.442855+08:00","gmt_modified":"2026-04-22T19:22:39.447035+08:00"},{"catalog_id":"bfca5ffe-8905-4ac2-a0a3-8e4dc43533b1","title":"数据可视化","description":"data-visualization","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"a40267bc-925a-4364-a01f-b96d3df60aea","gmt_create":"2026-04-22T19:23:03.398982+08:00","gmt_modified":"2026-04-22T19:23:03.405853+08:00"},{"catalog_id":"05214c1a-d804-4f3c-9048-20ba4de3be0f","title":"引用检测引擎","description":"citation-engine","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"19e75845-5147-4aeb-90be-16f3aa270465","gmt_create":"2026-04-22T19:23:12.049419+08:00","gmt_modified":"2026-04-22T19:23:12.055756+08:00"},{"catalog_id":"b32b024e-2d06-45c8-94c2-a07fd25ab9b3","title":"快速开始","description":"quick-start","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"7e679d62-c415-4d6a-a7e5-d41d00e0ed69","gmt_create":"2026-04-22T19:23:49.794133+08:00","gmt_modified":"2026-04-22T19:23:49.797304+08:00"},{"catalog_id":"850fc702-3eb6-45b4-acd2-ae87fec1f4f1","title":"工作器系统","description":"worker-system","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"83fe6837-7874-4467-8114-103062f15f58","gmt_create":"2026-04-22T19:24:30.524061+08:00","gmt_modified":"2026-04-22T19:24:30.529283+08:00"},{"catalog_id":"fda0598d-7e92-4b8b-be52-92ae63c3cd98","title":"API客户端","description":"api-client","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"7bd2c461-81b0-48e8-8cb3-b4b14305806d","gmt_create":"2026-04-22T19:24:50.482622+08:00","gmt_modified":"2026-04-22T19:24:50.486476+08:00"},{"catalog_id":"15d6170d-716c-4d2a-833d-81211a59027c","title":"平台适配器扩展指南","description":"platform-adapter-extension","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"2632a6f9-774e-4a91-94da-a984bdb20758","gmt_create":"2026-04-22T19:25:18.714623+08:00","gmt_modified":"2026-04-22T19:25:18.720105+08:00"}],"wiki_overview":{"content":"\u003cblog\u003e\n\n# GEO 平台项目全面分析\n\n## 1. 项目介绍\n\n### 目标与愿景\nGEO 平台是一个基于人工智能技术的学术查询与引用管理系统,旨在为用户提供智能化的品牌引用检测和数据分析服务。该项目通过集成多个AI平台,实现对网络内容中特定品牌引用的自动检测和统计分析。\n\n### 核心目标\n- **智能引用检测**:自动识别网络内容中对特定品牌的引用情况\n- **多平台集成**:支持多个AI平台的数据获取和处理\n- **实时监控**:提供定时查询和实时更新功能\n- **数据可视化**:通过图表展示引用趋势和统计数据\n\n### 目标用户\n- 学术研究人员\n- 市场分析师\n- 品牌监测机构\n- 内容创作者\n\n## 2. 技术架构\n\n### 整体架构设计\n\n```mermaid\ngraph TB\n subgraph \"前端层\"\n FE[Next.js 前端]\n UI[React 组件]\n Auth[认证系统]\n end\n \n subgraph \"后端层\"\n API[FastAPI API]\n WS[工作器]\n SCH[调度器]\n end\n \n subgraph \"数据层\"\n DB[(PostgreSQL)]\n RD[Redis 缓存]\n end\n \n subgraph \"AI平台\"\n WX[Wenxin 平台]\n KM[Kimi 平台]\n end\n \n FE --\u003e API\n UI --\u003e FE\n Auth --\u003e FE\n API --\u003e DB\n API --\u003e RD\n WS --\u003e WX\n WS --\u003e KM\n SCH --\u003e WS\n API --\u003e WS\n```\n\n### 核心设计模式\n- **分层架构**:清晰的前后端分离和业务逻辑分层\n- **异步编程**:基于 asyncio 的高性能异步处理\n- **依赖注入**:通过 FastAPI 的依赖系统管理服务\n- **适配器模式**:统一不同AI平台的接口调用\n\n### 系统关系图\n\n```mermaid\nsequenceDiagram\n participant U as 用户\n participant F as 前端\n participant B as 后端API\n participant S as 调度器\n participant W as 引用引擎\n participant P as AI平台\n \n U-\u003e\u003eF: 发起查询请求\n F-\u003e\u003eB: HTTP请求\n B-\u003e\u003eS: 触发查询任务\n S-\u003e\u003eW: 执行查询\n W-\u003e\u003eP: 调用AI平台\n P--\u003e\u003eW: 返回结果\n W--\u003e\u003eB: 处理后的数据\n B--\u003e\u003eF: 响应结果\n F--\u003e\u003eU: 展示数据\n```\n\n## 3. 关键实现\n\n### 主要入口点\n\n**后端主入口**\n- `backend/app/main.py` - FastAPI 应用主入口,包含路由注册和中间件配置\n\n**前端主入口**\n- `frontend/app/layout.tsx` - Next.js 应用布局组件,包含全局样式和提供者配置\n\n### 核心模块\n\n**数据库配置**\n- `backend/app/database.py` - SQLAlchemy 异步数据库配置和会话管理\n\n**配置管理**\n- `backend/app/config.py` - Pydantic 设置类,管理环境变量和配置参数\n\n**工作器系统**\n- `backend/app/workers/scheduler.py` - APScheduler 定时任务调度器\n- `backend/app/workers/citation_engine.py` - 引用检测引擎核心\n\n**API 路由**\n- `backend/app/api/auth.py` - 用户认证相关接口\n- `backend/app/api/citations.py` - 引用数据相关接口\n- `backend/app/api/queries.py` - 查询任务相关接口\n\n### 配置方法\n\n**Docker 配置**\n- `docker-compose.yml` - 多容器部署配置,包含数据库、缓存和应用服务\n\n**依赖管理**\n- `backend/requirements.txt` - Python 后端依赖包\n- `frontend/package.json` - Node.js 前端依赖包\n\n### 外部依赖\n\n**后端关键技术栈**\n- FastAPI + Uvicorn:高性能异步Web框架\n- SQLAlchemy 2.0:异步ORM框架\n- APScheduler:任务调度框架\n- Redis:缓存和队列存储\n- Playwright:浏览器自动化\n\n**前端关键技术栈**\n- Next.js 14:React 框架\n- Radix UI:可访问性UI组件库\n- Recharts:数据可视化图表\n- Tailwind CSS:CSS框架\n\n### 集成点\n\n**AI平台适配**\n- `backend/app/workers/platforms/kimi.py` - Kimi AI平台适配器\n- `backend/app/workers/platforms/wenxin.py` - 百度文心平台适配器\n\n**认证集成**\n- `frontend/components/providers.tsx` - NextAuth.js 认证提供者\n- `frontend/lib/auth.ts` - 前端认证工具函数\n\n### 组件关系图\n\n```mermaid\ngraph LR\n subgraph \"认证模块\"\n AUTH_API[认证API]\n AUTH_FE[认证前端]\n NEXT_AUTH[NextAuth集成]\n end\n \n subgraph \"查询模块\"\n QUERY_API[查询API]\n QUERY_FE[查询前端]\n SCHEDULER[调度器]\n ENGINE[引用引擎]\n end\n \n subgraph \"数据模块\"\n MODELS[数据模型]\n DB[(数据库)]\n REDIS[(Redis)]\n end\n \n AUTH_API --\u003e MODELS\n QUERY_API --\u003e MODELS\n ENGINE --\u003e MODELS\n AUTH_FE --\u003e AUTH_API\n QUERY_FE --\u003e QUERY_API\n SCHEDULER --\u003e ENGINE\n ENGINE --\u003e DB\n ENGINE --\u003e REDIS\n AUTH_API --\u003e DB\n QUERY_API --\u003e DB\n```\n\n## 4. 核心功能\n\n### 功能概览\n\n**用户管理功能**\n- 用户注册和登录认证\n- JWT 令牌管理和会话维护\n- 用户权限控制\n\n**查询管理功能**\n- 自定义关键词查询\n- 多平台AI数据获取\n- 定时任务调度\n- 查询历史记录\n\n**引用检测功能**\n- 品牌引用自动检测\n- 置信度评分算法\n- 竞争品牌识别\n- 文本上下文提取\n\n**数据分析功能**\n- 引用趋势图表\n- 平台对比分析\n- 统计报表生成\n\n### 实现亮点\n\n**智能匹配算法**\n- `backend/app/workers/citation_engine.py` - 实现精确匹配、别名匹配和模糊匹配三种策略\n- 支持中文和英文混合文本处理\n- 提供置信度评分和位置信息\n\n**异步任务处理**\n- `backend/app/workers/scheduler.py` - 基于 APScheduler 的异步任务调度\n- 支持多平台并发查询\n- 完善的任务状态跟踪\n\n**响应式前端界面**\n- `frontend/app/(dashboard)/` - Next.js App Router 页面组织\n- `frontend/components/charts/` - 数据可视化组件\n- `frontend/components/ui/` - 可复用UI组件库\n\n### 功能架构图\n\n```mermaid\nstateDiagram-v2\n [*] --\u003e 用户认证\n 用户认证 --\u003e 查询管理: 登录成功\n 查询管理 --\u003e 任务调度: 创建查询\n 任务调度 --\u003e 引用检测: 定时触发\n 引用检测 --\u003e 数据处理: 获取AI结果\n 数据处理 --\u003e 结果展示: 处理完成\n 结果展示 --\u003e 查询管理: 新查询\n 结果展示 --\u003e [*]: 退出系统\n \n state 查询管理 {\n [*] --\u003e 创建查询\n 创建查询 --\u003e 编辑查询\n 编辑查询 --\u003e 删除查询\n 删除查询 --\u003e [*]\n }\n \n state 引用检测 {\n [*] --\u003e 平台查询\n 平台查询 --\u003e 品牌匹配\n 品牌匹配 --\u003e 竞争检测\n 竞争检测 --\u003e [*]\n }\n```\n\n## 5. 总结与建议\n\n### 项目架构特点\n\n**架构优势**\n- 清晰的分层设计,前后端职责明确\n- 异步编程模型提升了系统性能\n- 模块化设计便于功能扩展和维护\n- 完善的错误处理和日志记录机制\n\n**技术亮点**\n- 基于现代技术栈的全栈开发\n- 智能算法与工程实践的结合\n- 完整的开发到部署流程\n- 良好的代码组织和文档规范\n\n### 改进建议\n\n**性能优化**\n- 考虑引入连接池优化数据库连接\n- 实现缓存策略减少重复查询\n- 添加限流机制防止API滥用\n\n**功能扩展**\n- 增加更多AI平台支持\n- 实现批量查询功能\n- 添加导出数据功能\n- 增强搜索过滤条件\n\n**代码质量**\n- 完善单元测试覆盖率\n- 添加API文档自动生成\n- 实现更详细的错误处理\n- 优化前端组件复用性\n\n### 下一步发展\n\n**短期目标**\n- 完善用户认证和权限系统\n- 优化引用检测算法准确性\n- 增强前端用户体验\n\n**长期规划**\n- 支持多语言和国际化\n- 实现移动端应用\n- 添加机器学习模型优化\n- 构建开发者API平台\n\nSources:\n- [main.py](backend/app/main.py)\n- [config.py](backend/app/config.py)\n- [database.py](backend/app/database.py)\n- [layout.tsx](frontend/app/layout.tsx)\n- [providers.tsx](frontend/components/providers.tsx)\n- [scheduler.py](backend/app/workers/scheduler.py)\n- [citation_engine.py](backend/app/workers/citation_engine.py)\n- [auth.py](backend/app/api/auth.py)\n- [docker-compose.yml](docker-compose.yml)\n- [requirements.txt](backend/requirements.txt)\n- [package.json](frontend/package.json)\n\n\u003c/blog\u003e","gmt_create":"2026-04-22T18:54:45.079999+08:00","gmt_modified":"2026-04-22T18:54:45.079999+08:00","id":"1e2d007d-9249-436e-8822-c9b1a31580d1","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1"},"wiki_readme":{"content":"No readme file","gmt_create":"2026-04-22T18:53:55.057287+08:00","gmt_modified":"2026-04-22T18:53:55.057287+08:00","id":"354aa9f0-35fb-44a7-98d6-034981f130e6","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1"},"wiki_repo":{"id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"GEO","progress_status":"completed","wiki_present_status":"COMPLETED","optimized_catalog":"\".\\n├── .npm-cache/\\n│ ├── _cacache/\\n│ ├── _logs/\\n│ └── _npx/\\n├── .pytest_cache/\\n├── backend/\\n│ ├── alembic/\\n│ │ ├── __pycache__/\\n│ │ ├── versions/\\n│ │ │ ├── __pycache__/\\n│ │ │ └── 488d0bd5ab01_initial_migration.py\\n│ │ ├── README\\n│ │ ├── env.py\\n│ │ └── script.py.mako\\n│ ├── app/\\n│ │ ├── __pycache__/\\n│ │ ├── api/\\n│ │ │ ├── __pycache__/\\n│ │ │ ├── __init__.py\\n│ │ │ ├── auth.py\\n│ │ │ ├── citations.py\\n│ │ │ ├── deps.py\\n│ │ │ ├── queries.py\\n│ │ │ └── reports.py\\n│ │ ├── models/\\n│ │ │ ├── __pycache__/\\n│ │ │ ├── __init__.py\\n│ │ │ ├── citation_record.py\\n│ │ │ ├── query.py\\n│ │ │ ├── query_task.py\\n│ │ │ ├── subscription.py\\n│ │ │ └── user.py\\n│ │ ├── schemas/\\n│ │ │ ├── __pycache__/\\n│ │ │ ├── auth.py\\n│ │ │ ├── citation.py\\n│ │ │ └── query.py\\n│ │ ├── services/\\n│ │ │ ├── __pycache__/\\n│ │ │ ├── auth.py\\n│ │ │ ├── citation.py\\n│ │ │ └── query.py\\n│ │ ├── utils/\\n│ │ ├── workers/\\n│ │ │ ├── __pycache__/\\n│ │ │ ├── platforms/\\n│ │ │ │ ├── __pycache__/\\n│ │ │ │ ├── base.py\\n│ │ │ │ ├── kimi.py\\n│ │ │ │ └── wenxin.py\\n│ │ │ ├── __init__.py\\n│ │ │ ├── citation_engine.py\\n│ │ │ └── scheduler.py\\n│ │ ├── config.py\\n│ │ ├── database.py\\n│ │ └── main.py\\n│ ├── venv/\\n│ ├── Dockerfile\\n│ ├── alembic.ini\\n│ └── requirements.txt\\n├── docs/\\n├── frontend/\\n│ ├── .next/\\n│ ├── app/\\n│ │ ├── (auth)/\\n│ │ │ ├── login/\\n│ │ │ │ └── page.tsx\\n│ │ │ ├── register/\\n│ │ │ │ └── page.tsx\\n│ │ │ └── layout.tsx\\n│ │ ├── (dashboard)/\\n│ │ │ ├── dashboard/\\n│ │ │ │ ├── citations/\\n│ │ │ │ │ └── page.tsx\\n│ │ │ │ ├── queries/\\n│ │ │ │ │ └── page.tsx\\n│ │ │ │ ├── reports/\\n│ │ │ │ │ └── page.tsx\\n│ │ │ │ ├── settings/\\n│ │ │ │ │ └── page.tsx\\n│ │ │ │ └── page.tsx\\n│ │ │ └── layout.tsx\\n│ │ ├── api/auth/[...nextauth]/\\n│ │ │ └── route.ts\\n│ │ ├── fonts/\\n│ │ ├── globals.css\\n│ │ ├── layout.tsx\\n│ │ └── page.tsx\\n│ ├── components/\\n│ │ ├── charts/\\n│ │ │ ├── platform-chart.tsx\\n│ │ │ └── trend-chart.tsx\\n│ │ ├── layout/\\n│ │ │ ├── header.tsx\\n│ │ │ └── sidebar.tsx\\n│ │ ├── ui/\\n│ │ │ ├── badge.tsx\\n│ │ │ ├── button.tsx\\n│ │ │ ├── card.tsx\\n│ │ │ ├── dialog.tsx\\n│ │ │ ├── dropdown-menu.tsx\\n│ │ │ ├── input.tsx\\n│ │ │ ├── label.tsx\\n│ │ │ ├── select.tsx\\n│ │ │ ├── table.tsx\\n│ │ │ └── tabs.tsx\\n│ │ └── providers.tsx\\n│ ├── lib/\\n│ │ ├── api.ts\\n│ │ ├── auth.ts\\n│ │ ├── platforms.ts\\n│ │ └── utils.ts\\n│ ├── node_modules/\\n│ ├── types/\\n│ │ └── next-auth.d.ts\\n│ ├── .eslintrc.json\\n│ ├── .gitignore\\n│ ├── Dockerfile\\n│ ├── README.md\\n│ ├── next-env.d.ts\\n│ ├── next.config.mjs\\n│ ├── package-lock.json\\n│ ├── package.json\\n│ ├── postcss.config.mjs\\n│ ├── tailwind.config.ts\\n│ ├── tsconfig.json\\n│ └── tsconfig.tsbuildinfo\\n├── tests/\\n│ ├── __pycache__/\\n│ ├── conftest.py\\n│ ├── test_auth.py\\n│ ├── test_citation_engine.py\\n│ ├── test_citations.py\\n│ └── test_queries.py\\n└── docker-compose.yml\\n\"","current_document_structure":"WikiEncrypted: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","catalogue_think_content":"WikiEncrypted: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","recovery_checkpoint":"wiki_generation_completed","last_commit_id":"0000000000000000000000000000000000000000","last_commit_update":"2026-04-22T19:25:18.956233+08:00","gmt_create":"2026-04-22T17:58:32.591608+08:00","gmt_modified":"2026-04-22T19:25:18.956233+08:00","extend_info":"{\"language\":\"zh\",\"active\":true,\"branch\":\"Q0DeR-MaG1C-BrAnCh-Fo2-NoN-GiT-Or-No-C0MmIt\",\"shareStatus\":\"\",\"server_error_code\":\"\",\"cosy_version\":\"\"}"}} \ No newline at end of file +{"code_snippets":[{"id":"8a466b0c6eac2ccb54c5da7e13854646","path":"frontend/app/layout.tsx","line_range":"1-37","gmt_create":"2026-04-23T15:19:43.759937+08:00","gmt_modified":"2026-04-23T15:19:43.759937+08:00"},{"id":"3bd4eedea376e3a3d9f9fbff4fe27a65","path":"frontend/components/layout/sidebar.tsx","line_range":"1-54","gmt_create":"2026-04-23T15:19:43.760535+08:00","gmt_modified":"2026-04-23T15:19:43.760535+08:00"},{"id":"0d903468b55bdc63cc7e25a87a89c522","path":"frontend/components/layout/header.tsx","line_range":"1-30","gmt_create":"2026-04-23T15:19:43.760868+08:00","gmt_modified":"2026-04-23T15:19:43.760868+08:00"},{"id":"3bab92a09e9fb456e0303bb1e04afc7e","path":"frontend/components/ui/table.tsx","line_range":"1-118","gmt_create":"2026-04-23T15:19:43.762327+08:00","gmt_modified":"2026-04-23T15:19:43.762327+08:00"},{"id":"0eed9f61572209dd754611fc7c690d5a","path":"frontend/components/ui/dialog.tsx","line_range":"1-123","gmt_create":"2026-04-23T15:19:43.762637+08:00","gmt_modified":"2026-04-23T15:19:43.762637+08:00"},{"id":"b7796fc6197ecce5beb461b9466e54a0","path":"frontend/components/charts/trend-chart.tsx","line_range":"1-60","gmt_create":"2026-04-23T15:19:43.762953+08:00","gmt_modified":"2026-04-23T15:19:43.762953+08:00"},{"id":"6b9f52af0b6d78c17ff9bbc42d760ea2","path":"frontend/components/charts/platform-chart.tsx","line_range":"1-68","gmt_create":"2026-04-23T15:19:43.763292+08:00","gmt_modified":"2026-04-23T15:19:43.763292+08:00"},{"id":"a829403082cc3460c01e0110229c53c4","path":"frontend/lib/platforms.ts","line_range":"1-18","gmt_create":"2026-04-23T15:19:43.763596+08:00","gmt_modified":"2026-04-23T15:19:43.763596+08:00"},{"id":"dcfa308ef4ec368c5a51a17acbfc8e2c","path":"frontend/lib/utils.ts","line_range":"1-7","gmt_create":"2026-04-23T15:19:43.763899+08:00","gmt_modified":"2026-04-23T15:19:43.763899+08:00"},{"id":"0f87c8089f548883d056f0a0d79e273f","path":"frontend/lib/api.ts","line_range":"1-79","gmt_create":"2026-04-23T15:19:43.764207+08:00","gmt_modified":"2026-04-23T15:19:43.764207+08:00"},{"id":"9beee1f41fe8f0750fd97155f9d54bbb","path":"frontend/lib/api.ts","line_range":"67-70","gmt_create":"2026-04-23T15:19:43.7681+08:00","gmt_modified":"2026-04-23T15:19:43.7681+08:00"},{"id":"8fe2e22a963442076e1ce16ab777573c","path":"frontend/lib/api.ts","line_range":"56-66","gmt_create":"2026-04-23T15:19:43.769967+08:00","gmt_modified":"2026-04-23T15:19:43.769967+08:00"},{"id":"3124ad882ca2cf8fecb6b93696c7f233","path":"frontend/lib/api.ts","line_range":"72-77","gmt_create":"2026-04-23T15:19:43.77323+08:00","gmt_modified":"2026-04-23T15:19:43.773231+08:00"},{"id":"17a97b4ac37fb67b8eda7ce2887c38e7","path":"frontend/app/layout.tsx","line_range":"17-20","gmt_create":"2026-04-23T15:19:43.777372+08:00","gmt_modified":"2026-04-23T15:19:43.777372+08:00"},{"id":"84cba1e0d516e8c9859402fd5c1bc83c","path":"frontend/lib/api.ts","line_range":"3-40","gmt_create":"2026-04-23T15:19:43.777696+08:00","gmt_modified":"2026-04-23T15:19:43.777696+08:00"},{"id":"b55a164add5a8fec2ef0e489f7234829","path":"backend/app/main.py","line_range":"24-47","gmt_create":"2026-04-23T15:19:45.591156+08:00","gmt_modified":"2026-04-23T15:19:45.591157+08:00"},{"id":"16d619435094a63740357cd6317b52cb","path":"backend/app/api/auth.py","line_range":"10","gmt_create":"2026-04-23T15:19:45.591538+08:00","gmt_modified":"2026-04-23T15:19:45.591538+08:00"},{"id":"fa1ee5e3822128a37e9d03af74083392","path":"backend/app/api/queries.py","line_range":"12","gmt_create":"2026-04-23T15:19:45.591868+08:00","gmt_modified":"2026-04-23T15:19:45.591868+08:00"},{"id":"7e908f05baccdfcf7f4a3ef3c9cd5c38","path":"backend/app/api/citations.py","line_range":"21","gmt_create":"2026-04-23T15:19:45.592191+08:00","gmt_modified":"2026-04-23T15:19:45.592191+08:00"},{"id":"ffe6df344be81bde3941ad8f0d77910b","path":"backend/app/api/reports.py","line_range":"13","gmt_create":"2026-04-23T15:19:45.592503+08:00","gmt_modified":"2026-04-23T15:19:45.592503+08:00"},{"id":"c71fb14f8866e34c679c94a4e2432bc7","path":"backend/app/api/deps.py","line_range":"13","gmt_create":"2026-04-23T15:19:45.592857+08:00","gmt_modified":"2026-04-23T15:19:45.592857+08:00"},{"id":"3c68f1581d2fd6aa845dd71111a9aa9d","path":"backend/app/main.py","line_range":"1-57","gmt_create":"2026-04-23T15:19:45.593248+08:00","gmt_modified":"2026-04-23T15:19:45.593248+08:00"},{"id":"39afb05755a93800fd685af7274110cb","path":"backend/app/main.py","line_range":"13-57","gmt_create":"2026-04-23T15:19:45.593572+08:00","gmt_modified":"2026-04-23T15:19:45.593572+08:00"},{"id":"87a177f17800991e1ed1fb7be03abdb2","path":"backend/app/api/auth.py","line_range":"13-42","gmt_create":"2026-04-23T15:19:45.594108+08:00","gmt_modified":"2026-04-23T15:19:45.594108+08:00"},{"id":"ae9de874df4a46f4197b6c157c25ec6e","path":"backend/app/api/queries.py","line_range":"15-85","gmt_create":"2026-04-23T15:19:45.594458+08:00","gmt_modified":"2026-04-23T15:19:45.594458+08:00"},{"id":"c066a8d4bffabed87a2e38ccad81c107","path":"backend/app/api/citations.py","line_range":"25-77","gmt_create":"2026-04-23T15:19:45.594783+08:00","gmt_modified":"2026-04-23T15:19:45.594783+08:00"},{"id":"177c73dc4e71186d9eaa1157fc0fe97f","path":"backend/app/api/reports.py","line_range":"16-46","gmt_create":"2026-04-23T15:19:45.595098+08:00","gmt_modified":"2026-04-23T15:19:45.595098+08:00"},{"id":"a0be0cbddb559575861620b5b7579634","path":"backend/app/main.py","line_range":"38-51","gmt_create":"2026-04-23T15:19:45.595425+08:00","gmt_modified":"2026-04-23T15:19:45.595425+08:00"},{"id":"bcdf50f6234651cb9863ab210e6473e5","path":"backend/app/api/deps.py","line_range":"16-42","gmt_create":"2026-04-23T15:19:45.595733+08:00","gmt_modified":"2026-04-23T15:19:45.595733+08:00"},{"id":"6df0277c2486b148fa26c2682dbdaa4c","path":"backend/app/services/auth.py","line_range":"37-68","gmt_create":"2026-04-23T15:19:45.59605+08:00","gmt_modified":"2026-04-23T15:19:45.59605+08:00"},{"id":"5ea5f192d580031ffe57e1582b70c67e","path":"backend/app/services/query.py","line_range":"12-123","gmt_create":"2026-04-23T15:19:45.596359+08:00","gmt_modified":"2026-04-23T15:19:45.596359+08:00"},{"id":"fe4a793f16cd4e12b56253c0a6d53ae0","path":"backend/app/services/citation.py","line_range":"24-359","gmt_create":"2026-04-23T15:19:45.596722+08:00","gmt_modified":"2026-04-23T15:19:45.596723+08:00"},{"id":"9552bd8a528207f18e4f3a1696f26a55","path":"backend/app/api/auth.py","line_range":"13-37","gmt_create":"2026-04-23T15:19:45.597032+08:00","gmt_modified":"2026-04-23T15:19:45.597032+08:00"},{"id":"4aad38dfc00a0877bd965c3d0b3c280c","path":"backend/app/schemas/auth.py","line_range":"7-34","gmt_create":"2026-04-23T15:19:45.598915+08:00","gmt_modified":"2026-04-23T15:19:45.598915+08:00"},{"id":"9b10dac7dbbb1327afc8a525bf4bd0c3","path":"backend/app/services/query.py","line_range":"45-81","gmt_create":"2026-04-23T15:19:45.599689+08:00","gmt_modified":"2026-04-23T15:19:45.599689+08:00"},{"id":"69118807690ef351a9de910414d5e676","path":"backend/app/schemas/query.py","line_range":"11-94","gmt_create":"2026-04-23T15:19:45.6004+08:00","gmt_modified":"2026-04-23T15:19:45.6004+08:00"},{"id":"212d822d207a4c0bd7825bbf20e188e9","path":"backend/app/api/citations.py","line_range":"59-77","gmt_create":"2026-04-23T15:19:45.601069+08:00","gmt_modified":"2026-04-23T15:19:45.601069+08:00"},{"id":"b0777c7da17be89abb333c81c0dcf349","path":"backend/app/services/citation.py","line_range":"204-261","gmt_create":"2026-04-23T15:19:45.601383+08:00","gmt_modified":"2026-04-23T15:19:45.601384+08:00"},{"id":"26288877e8e1f6c4ff5aca12610b0218","path":"backend/app/schemas/citation.py","line_range":"7-50","gmt_create":"2026-04-23T15:19:45.602042+08:00","gmt_modified":"2026-04-23T15:19:45.602042+08:00"},{"id":"dbf5f8a57778cf6363e834081f3d771c","path":"backend/app/services/citation.py","line_range":"327-359","gmt_create":"2026-04-23T15:19:45.60312+08:00","gmt_modified":"2026-04-23T15:19:45.60312+08:00"},{"id":"56e46969bdb790a5e8f333184b878d6d","path":"backend/app/models/user.py","line_range":"11-41","gmt_create":"2026-04-23T15:19:45.605045+08:00","gmt_modified":"2026-04-23T15:19:45.605046+08:00"},{"id":"4fb8856be3a581fe8303d11b2284ca29","path":"backend/app/models/query.py","line_range":"11-55","gmt_create":"2026-04-23T15:19:45.605965+08:00","gmt_modified":"2026-04-23T15:19:45.605965+08:00"},{"id":"fd541971cebf8a7c167d717f5c5d1ff6","path":"backend/app/models/citation_record.py","line_range":"11-42","gmt_create":"2026-04-23T15:19:45.606627+08:00","gmt_modified":"2026-04-23T15:19:45.606627+08:00"},{"id":"b84f46f058847733347974841f613688","path":"backend/app/models/query_task.py","line_range":"11-39","gmt_create":"2026-04-23T15:19:45.607023+08:00","gmt_modified":"2026-04-23T15:19:45.607023+08:00"},{"id":"1a2657244414b5681afded9565a86422","path":"backend/app/models/user.py","line_range":"35-40","gmt_create":"2026-04-23T15:19:45.60817+08:00","gmt_modified":"2026-04-23T15:19:45.60817+08:00"},{"id":"acd5a29be2bdd4ae251e10ca266ffe13","path":"backend/app/models/query.py","line_range":"43-48","gmt_create":"2026-04-23T15:19:45.608565+08:00","gmt_modified":"2026-04-23T15:19:45.608565+08:00"},{"id":"27a5e2dd1d197b2e3a45be41c57a6183","path":"backend/app/models/citation_record.py","line_range":"35","gmt_create":"2026-04-23T15:19:45.609141+08:00","gmt_modified":"2026-04-23T15:19:45.609141+08:00"},{"id":"c43e8fc0c04c5ed2db7798d99c8c77b8","path":"backend/app/models/query_task.py","line_range":"34","gmt_create":"2026-04-23T15:19:45.609534+08:00","gmt_modified":"2026-04-23T15:19:45.609534+08:00"},{"id":"8868ab86034eecf40e80347ef8cbdebd","path":"backend/app/api/auth.py","line_range":"26-30","gmt_create":"2026-04-23T15:19:45.609857+08:00","gmt_modified":"2026-04-23T15:19:45.609857+08:00"},{"id":"a50f983ec39bac67dff5df80f6dad837","path":"backend/app/services/query.py","line_range":"59-60","gmt_create":"2026-04-23T15:19:45.61019+08:00","gmt_modified":"2026-04-23T15:19:45.61019+08:00"},{"id":"55f1628f1ab6f323710e367e12146b1a","path":"backend/app/api/citations.py","line_range":"67-71","gmt_create":"2026-04-23T15:19:45.610496+08:00","gmt_modified":"2026-04-23T15:19:45.610496+08:00"},{"id":"6ef6d32f97d7b50b7a4da541137423c0","path":"backend/app/api/reports.py","line_range":"23-27","gmt_create":"2026-04-23T15:19:45.610807+08:00","gmt_modified":"2026-04-23T15:19:45.610807+08:00"},{"id":"096856da621e23e78422a15e2bfce1f1","path":"backend/app/main.py","line_range":"13-22","gmt_create":"2026-04-23T15:20:08.95664+08:00","gmt_modified":"2026-04-23T15:20:08.95664+08:00"},{"id":"e230904202fcf7a861c6f49b84f9f863","path":"backend/app/workers/scheduler.py","line_range":"25-95","gmt_create":"2026-04-23T15:20:08.956979+08:00","gmt_modified":"2026-04-23T15:20:08.956979+08:00"},{"id":"309607c54b12a6340edc086ffb4737c9","path":"backend/app/workers/citation_engine.py","line_range":"148-309","gmt_create":"2026-04-23T15:20:08.957311+08:00","gmt_modified":"2026-04-23T15:20:08.957311+08:00"},{"id":"d7c319a04abbc6704da53107e07dd8e7","path":"backend/app/services/query.py","line_range":"12-130","gmt_create":"2026-04-23T15:20:08.958773+08:00","gmt_modified":"2026-04-23T15:20:08.958773+08:00"},{"id":"9bfc041fe426da2eb78353827e8d9163","path":"backend/app/database.py","line_range":"1-29","gmt_create":"2026-04-23T15:20:08.95909+08:00","gmt_modified":"2026-04-23T15:20:08.95909+08:00"},{"id":"ad67863041d9eea2b0fb542b5aa33aca","path":"backend/app/workers/platforms/base.py","line_range":"4-18","gmt_create":"2026-04-23T15:20:08.959413+08:00","gmt_modified":"2026-04-23T15:20:08.959413+08:00"},{"id":"eecf9581dbaa0a515cf11514175e7ef9","path":"backend/app/workers/platforms/kimi.py","line_range":"11-206","gmt_create":"2026-04-23T15:20:08.959726+08:00","gmt_modified":"2026-04-23T15:20:08.959726+08:00"},{"id":"5563c29185326a59be61ee0a6eec4463","path":"backend/app/workers/platforms/wenxin.py","line_range":"11-205","gmt_create":"2026-04-23T15:20:08.960155+08:00","gmt_modified":"2026-04-23T15:20:08.960155+08:00"},{"id":"2d35e1345d25020f8e7ac1318db06f7b","path":"backend/app/workers/scheduler.py","line_range":"30-90","gmt_create":"2026-04-23T15:20:08.96886+08:00","gmt_modified":"2026-04-23T15:20:08.968861+08:00"},{"id":"91bda120c0ab69e0e7103a1c89c82424","path":"backend/app/workers/scheduler.py","line_range":"95-172","gmt_create":"2026-04-23T15:20:08.969219+08:00","gmt_modified":"2026-04-23T15:20:08.969219+08:00"},{"id":"160b5326537d25444c40a459a01e79c6","path":"backend/app/workers/citation_engine.py","line_range":"159-234","gmt_create":"2026-04-23T15:20:08.969565+08:00","gmt_modified":"2026-04-23T15:20:08.969565+08:00"},{"id":"6712051c987e10a7c26b089063367398","path":"backend/app/models/query.py","line_range":"24-31","gmt_create":"2026-04-23T15:20:08.970051+08:00","gmt_modified":"2026-04-23T15:20:08.970052+08:00"},{"id":"ac5982063da5f04315f3e82a0d653902","path":"backend/app/models/query_task.py","line_range":"24-32","gmt_create":"2026-04-23T15:20:08.970717+08:00","gmt_modified":"2026-04-23T15:20:08.970717+08:00"},{"id":"06ed912983db33bb8aca162fed68282b","path":"backend/app/models/citation_record.py","line_range":"24-29","gmt_create":"2026-04-23T15:20:08.971135+08:00","gmt_modified":"2026-04-23T15:20:08.971135+08:00"},{"id":"b624be78e3bffd876e403cff2557b088","path":"backend/app/workers/citation_engine.py","line_range":"19-120","gmt_create":"2026-04-23T15:20:08.973448+08:00","gmt_modified":"2026-04-23T15:20:08.973448+08:00"},{"id":"40d0b169aad65c8bb38077deb052fc72","path":"backend/app/workers/platforms/kimi.py","line_range":"33-125","gmt_create":"2026-04-23T15:20:08.97414+08:00","gmt_modified":"2026-04-23T15:20:08.97414+08:00"},{"id":"8b5af998852596e1e08b0e0216bc4b93","path":"backend/app/workers/platforms/wenxin.py","line_range":"33-124","gmt_create":"2026-04-23T15:20:08.974449+08:00","gmt_modified":"2026-04-23T15:20:08.974449+08:00"},{"id":"fe70b1fef9f36e73d26d84987e927c7a","path":"backend/app/api/queries.py","line_range":"15-86","gmt_create":"2026-04-23T15:20:08.978743+08:00","gmt_modified":"2026-04-23T15:20:08.978743+08:00"},{"id":"e1d2b027678118df4d0a50ce9269271d","path":"backend/app/workers/scheduler.py","line_range":"42-90","gmt_create":"2026-04-23T15:20:08.982815+08:00","gmt_modified":"2026-04-23T15:20:08.982815+08:00"},{"id":"e79301a4bc26aa6b49f3f52c3182c3f9","path":"backend/app/workers/citation_engine.py","line_range":"175-234","gmt_create":"2026-04-23T15:20:08.983609+08:00","gmt_modified":"2026-04-23T15:20:08.983609+08:00"},{"id":"1e85186eded8743ff5f231df4aa6df3f","path":"backend/app/workers/platforms/kimi.py","line_range":"21-48","gmt_create":"2026-04-23T15:20:08.98454+08:00","gmt_modified":"2026-04-23T15:20:08.98454+08:00"},{"id":"e2b1718570fb714b2f4342221898ab30","path":"backend/app/workers/platforms/wenxin.py","line_range":"21-48","gmt_create":"2026-04-23T15:20:08.985237+08:00","gmt_modified":"2026-04-23T15:20:08.985237+08:00"},{"id":"e4a49039dae40b7433896c81737fcf8c","path":"backend/app/config.py","line_range":"7-14","gmt_create":"2026-04-23T15:20:08.985763+08:00","gmt_modified":"2026-04-23T15:20:08.985763+08:00"},{"id":"2ee31d68c409e96e951f6cfa7027bca7","path":"backend/app/main.py","line_range":"24-42","gmt_create":"2026-04-23T15:20:08.986265+08:00","gmt_modified":"2026-04-23T15:20:08.986265+08:00"},{"id":"79d6e169e36e6b7493898b5f863e07dc","path":"backend/app/workers/citation_engine.py","line_range":"152-157","gmt_create":"2026-04-23T15:20:08.987693+08:00","gmt_modified":"2026-04-23T15:20:08.987693+08:00"},{"id":"1552315d5fb9f6d7aba5f7e8fa93a975","path":"backend/app/database.py","line_range":"6-10","gmt_create":"2026-04-23T15:20:08.988709+08:00","gmt_modified":"2026-04-23T15:20:08.988709+08:00"},{"id":"599cca7536cae4a7e0ae93043c476a7f","path":"tests/test_queries.py","line_range":"10-154","gmt_create":"2026-04-23T15:20:08.989011+08:00","gmt_modified":"2026-04-23T15:20:08.989011+08:00"},{"id":"2ec3d45edd6221e0cedf7f8887fe090d","path":"tests/test_scheduler.py","line_range":"17-123","gmt_create":"2026-04-23T15:20:08.989312+08:00","gmt_modified":"2026-04-23T15:20:08.989312+08:00"},{"id":"4d323bf0aaf4078f09726dc0890e5955","path":"backend/app/models/subscription.py","line_range":"11-37","gmt_create":"2026-04-23T15:21:46.688165+08:00","gmt_modified":"2026-04-23T15:21:46.688166+08:00"},{"id":"4cef9e740b6feb68c6bd22b660c47320","path":"backend/app/services/query.py","line_range":"1-123","gmt_create":"2026-04-23T15:21:46.688903+08:00","gmt_modified":"2026-04-23T15:21:46.688903+08:00"},{"id":"121203f7f9f539ffb1456c3f5cdfd842","path":"backend/app/services/citation.py","line_range":"1-359","gmt_create":"2026-04-23T15:21:46.689338+08:00","gmt_modified":"2026-04-23T15:21:46.689338+08:00"},{"id":"10d1e37bdc9f353c189b7a2fe79dc85e","path":"backend/app/api/queries.py","line_range":"1-86","gmt_create":"2026-04-23T15:21:46.689691+08:00","gmt_modified":"2026-04-23T15:21:46.689691+08:00"},{"id":"cbd0101fa84d957bcb1baaa623c6b31c","path":"backend/app/api/citations.py","line_range":"1-78","gmt_create":"2026-04-23T15:21:46.690036+08:00","gmt_modified":"2026-04-23T15:21:46.690036+08:00"},{"id":"afe4138895492c26aac5c0120ef46cd8","path":"backend/app/models/__init__.py","line_range":"1-14","gmt_create":"2026-04-23T15:21:46.69035+08:00","gmt_modified":"2026-04-23T15:21:46.69035+08:00"},{"id":"4d11ddf7abb8076d81b30c4315786f9a","path":"backend/alembic/versions/488d0bd5ab01_initial_migration.py","line_range":"21-128","gmt_create":"2026-04-23T15:21:46.693035+08:00","gmt_modified":"2026-04-23T15:21:46.693035+08:00"},{"id":"e454b4a54500bd81e7599e6ec97bf12b","path":"backend/alembic/versions/488d0bd5ab01_initial_migration.py","line_range":"23-37","gmt_create":"2026-04-23T15:21:46.695671+08:00","gmt_modified":"2026-04-23T15:21:46.695671+08:00"},{"id":"1965adf7cfc65447e3c1ae21fbf6d1c5","path":"backend/alembic/versions/488d0bd5ab01_initial_migration.py","line_range":"39-59","gmt_create":"2026-04-23T15:21:46.696432+08:00","gmt_modified":"2026-04-23T15:21:46.696432+08:00"},{"id":"c730faefb34bb87c40c5f636b4ff7f41","path":"backend/alembic/versions/488d0bd5ab01_initial_migration.py","line_range":"80-94","gmt_create":"2026-04-23T15:21:46.697413+08:00","gmt_modified":"2026-04-23T15:21:46.697413+08:00"},{"id":"b9978c3eccea3ef566b003216e5047af","path":"backend/alembic/versions/488d0bd5ab01_initial_migration.py","line_range":"61-78","gmt_create":"2026-04-23T15:21:46.698274+08:00","gmt_modified":"2026-04-23T15:21:46.698274+08:00"},{"id":"eb6ff4361d7413b57f1f70b1ec2f0c94","path":"backend/alembic/versions/488d0bd5ab01_initial_migration.py","line_range":"96-111","gmt_create":"2026-04-23T15:21:46.699021+08:00","gmt_modified":"2026-04-23T15:21:46.699021+08:00"},{"id":"f6c9f1b4e8646c366a31426a4537675d","path":"backend/app/models/query_task.py","line_range":"36-38","gmt_create":"2026-04-23T15:21:46.700462+08:00","gmt_modified":"2026-04-23T15:21:46.700462+08:00"},{"id":"a2adbf02c71e4eb2cf1f120e1a2ff517","path":"backend/app/models/citation_record.py","line_range":"37-41","gmt_create":"2026-04-23T15:21:46.70082+08:00","gmt_modified":"2026-04-23T15:21:46.700821+08:00"},{"id":"0907fc2974ec31c23aaaef02076700a1","path":"backend/app/models/user.py","line_range":"25-33","gmt_create":"2026-04-23T15:21:46.702342+08:00","gmt_modified":"2026-04-23T15:21:46.702342+08:00"},{"id":"842f74e2cc054608242e93fbefd96b45","path":"backend/app/models/query.py","line_range":"32-40","gmt_create":"2026-04-23T15:21:46.702652+08:00","gmt_modified":"2026-04-23T15:21:46.702652+08:00"},{"id":"aed9e839038c45e6ce2023c4e05adb76","path":"backend/app/models/query_task.py","line_range":"27-32","gmt_create":"2026-04-23T15:21:46.702999+08:00","gmt_modified":"2026-04-23T15:21:46.703+08:00"},{"id":"2181318c993526c86458f5eef134aed6","path":"backend/app/services/query.py","line_range":"62-77","gmt_create":"2026-04-23T15:21:46.703419+08:00","gmt_modified":"2026-04-23T15:21:46.703419+08:00"},{"id":"a817488dc968d761a8977fb5bb8d01a2","path":"backend/app/services/query.py","line_range":"45-129","gmt_create":"2026-04-23T15:21:46.703795+08:00","gmt_modified":"2026-04-23T15:21:46.703795+08:00"},{"id":"d20fc729a5d3986b1c077f9e07ece9c4","path":"backend/app/config.py","line_range":"7","gmt_create":"2026-04-23T15:21:46.704958+08:00","gmt_modified":"2026-04-23T15:21:46.704958+08:00"},{"id":"ea655c6d147bc98beb42955d437260cc","path":"backend/app/config.py","line_range":"1-23","gmt_create":"2026-04-23T15:21:46.705746+08:00","gmt_modified":"2026-04-23T15:21:46.705746+08:00"},{"id":"37868a5af96edcdad149caf9a184435a","path":"backend/app/api/queries.py","line_range":"42-85","gmt_create":"2026-04-23T15:21:46.706426+08:00","gmt_modified":"2026-04-23T15:21:46.706426+08:00"},{"id":"601b981b00d93b941843f046a163d5a3","path":"backend/app/schemas/query.py","line_range":"18-33","gmt_create":"2026-04-23T15:21:46.706755+08:00","gmt_modified":"2026-04-23T15:21:46.706755+08:00"},{"id":"290df8332b3d104e5ea8d71dc39315b5","path":"tests/conftest.py","line_range":"1-123","gmt_create":"2026-04-23T15:22:15.985975+08:00","gmt_modified":"2026-04-23T15:22:15.985975+08:00"},{"id":"c2747ca16b879bca0f68955534c3c4fc","path":"backend/app/main.py","line_range":"1-48","gmt_create":"2026-04-23T15:22:15.986592+08:00","gmt_modified":"2026-04-23T15:22:15.986592+08:00"},{"id":"76e6c0abb49fec57cac4892837a143c9","path":"backend/app/api/deps.py","line_range":"1-43","gmt_create":"2026-04-23T15:22:15.987077+08:00","gmt_modified":"2026-04-23T15:22:15.987077+08:00"},{"id":"f66d9907b467b110c638bd527efd95c5","path":"backend/app/api/auth.py","line_range":"1-43","gmt_create":"2026-04-23T15:22:15.987417+08:00","gmt_modified":"2026-04-23T15:22:15.987417+08:00"},{"id":"116584ea9162c1bc05911f39f9ef82b6","path":"backend/app/workers/citation_engine.py","line_range":"1-309","gmt_create":"2026-04-23T15:22:15.988451+08:00","gmt_modified":"2026-04-23T15:22:15.988451+08:00"},{"id":"9630036e63fc15cb81b202cf79671aab","path":"backend/app/workers/scheduler.py","line_range":"1-182","gmt_create":"2026-04-23T15:22:15.988885+08:00","gmt_modified":"2026-04-23T15:22:15.988885+08:00"},{"id":"84fbed7d35f7752e2117a74fcaf5f0e9","path":"backend/app/config.py","line_range":"1-17","gmt_create":"2026-04-23T15:22:15.989594+08:00","gmt_modified":"2026-04-23T15:22:15.989594+08:00"},{"id":"5ddf0c8d7b38e4f6126a5d85da1dfeda","path":"tests/conftest.py","line_range":"19-123","gmt_create":"2026-04-23T15:22:15.990689+08:00","gmt_modified":"2026-04-23T15:22:15.990689+08:00"},{"id":"9df233ef1be4b95068ed91bf01083ae7","path":"tests/conftest.py","line_range":"117-123","gmt_create":"2026-04-23T15:22:15.99106+08:00","gmt_modified":"2026-04-23T15:22:15.99106+08:00"},{"id":"6286d4be455dc058c8be2ee4e0d1175a","path":"backend/app/main.py","line_range":"38-42","gmt_create":"2026-04-23T15:22:15.991399+08:00","gmt_modified":"2026-04-23T15:22:15.991399+08:00"},{"id":"069243fafe60a85cf16a0ca40fa07180","path":"backend/app/api/deps.py","line_range":"16-43","gmt_create":"2026-04-23T15:22:15.991722+08:00","gmt_modified":"2026-04-23T15:22:15.991722+08:00"},{"id":"d5a1fb0bd23ce9240fbf79529ef94a45","path":"backend/app/api/auth.py","line_range":"13-43","gmt_create":"2026-04-23T15:22:15.992045+08:00","gmt_modified":"2026-04-23T15:22:15.992045+08:00"},{"id":"735aef72b4fe6ca4f407e69b7dda8b43","path":"backend/app/api/citations.py","line_range":"25-78","gmt_create":"2026-04-23T15:22:15.992721+08:00","gmt_modified":"2026-04-23T15:22:15.992721+08:00"},{"id":"8128dd67cf376d2cadf7c2d3831c380a","path":"backend/app/database.py","line_range":"23-29","gmt_create":"2026-04-23T15:22:15.993159+08:00","gmt_modified":"2026-04-23T15:22:15.993159+08:00"},{"id":"1721defc3d6206478d3c0692cc821761","path":"tests/test_auth.py","line_range":"25-104","gmt_create":"2026-04-23T15:22:15.9936+08:00","gmt_modified":"2026-04-23T15:22:15.9936+08:00"},{"id":"753a437d837246ead62b0e16c6331284","path":"backend/app/services/auth.py","line_range":"37-69","gmt_create":"2026-04-23T15:22:15.994329+08:00","gmt_modified":"2026-04-23T15:22:15.994329+08:00"},{"id":"d820e2daf2ea133a7aa17cdc475e44a4","path":"tests/test_auth.py","line_range":"1-104","gmt_create":"2026-04-23T15:22:15.99504+08:00","gmt_modified":"2026-04-23T15:22:15.99504+08:00"},{"id":"1a439c5fed6cfd188c646e1614d56371","path":"backend/app/services/auth.py","line_range":"1-69","gmt_create":"2026-04-23T15:22:15.995715+08:00","gmt_modified":"2026-04-23T15:22:15.995715+08:00"},{"id":"5c67e2f70283956b2d29a3c1443eb514","path":"backend/app/workers/citation_engine.py","line_range":"122-146","gmt_create":"2026-04-23T15:22:15.996787+08:00","gmt_modified":"2026-04-23T15:22:15.996787+08:00"},{"id":"a57acd9da5287c915ac823784a409292","path":"tests/test_citation_engine.py","line_range":"1-127","gmt_create":"2026-04-23T15:22:15.99744+08:00","gmt_modified":"2026-04-23T15:22:15.99744+08:00"},{"id":"2a4f741f31f62dce8ad63be2e831f520","path":"tests/test_citations.py","line_range":"23-93","gmt_create":"2026-04-23T15:22:15.998141+08:00","gmt_modified":"2026-04-23T15:22:15.998141+08:00"},{"id":"692ac240965eff7e66945aa3c4c270f7","path":"tests/test_citations.py","line_range":"1-93","gmt_create":"2026-04-23T15:22:15.998797+08:00","gmt_modified":"2026-04-23T15:22:15.998797+08:00"},{"id":"32a0a52faca2d8d488e49c63c86075b1","path":"tests/test_queries.py","line_range":"29-154","gmt_create":"2026-04-23T15:22:15.999443+08:00","gmt_modified":"2026-04-23T15:22:15.999444+08:00"},{"id":"7804331f5f8c1ba5a3b6d9c1ae1c78c1","path":"tests/test_queries.py","line_range":"1-154","gmt_create":"2026-04-23T15:22:16.000539+08:00","gmt_modified":"2026-04-23T15:22:16.000539+08:00"},{"id":"3a6e1b738967bf8cc651e57f48e2e126","path":"tests/test_business_flow.py","line_range":"83-126","gmt_create":"2026-04-23T15:22:16.00171+08:00","gmt_modified":"2026-04-23T15:22:16.00171+08:00"},{"id":"b1afd377757f1d0e9bdf87edfff3ad88","path":"tests/test_business_flow.py","line_range":"131-186","gmt_create":"2026-04-23T15:22:16.002219+08:00","gmt_modified":"2026-04-23T15:22:16.002219+08:00"},{"id":"de05ec7eed033e432991e5a88e1b5a06","path":"tests/test_business_flow.py","line_range":"192-222","gmt_create":"2026-04-23T15:22:16.002653+08:00","gmt_modified":"2026-04-23T15:22:16.002653+08:00"},{"id":"7fd61a451248b6b129299d6246f711c7","path":"tests/test_business_flow.py","line_range":"228-296","gmt_create":"2026-04-23T15:22:16.003121+08:00","gmt_modified":"2026-04-23T15:22:16.003121+08:00"},{"id":"53eedffff456a566fa7b0cecc7169f56","path":"tests/test_business_flow.py","line_range":"1-441","gmt_create":"2026-04-23T15:22:16.003614+08:00","gmt_modified":"2026-04-23T15:22:16.003615+08:00"},{"id":"906f7a8288e38d4244211f3f538fe7b6","path":"backend/app/workers/scheduler.py","line_range":"27-182","gmt_create":"2026-04-23T15:22:16.004044+08:00","gmt_modified":"2026-04-23T15:22:16.004044+08:00"},{"id":"1647ee2066de2ae59ba8cf88e33c5e02","path":"tests/test_scheduler.py","line_range":"1-123","gmt_create":"2026-04-23T15:22:16.004461+08:00","gmt_modified":"2026-04-23T15:22:16.004461+08:00"},{"id":"fd18328b6582e68c30b130b912891992","path":"frontend/components/providers.tsx","line_range":"1-9","gmt_create":"2026-04-23T15:22:23.501815+08:00","gmt_modified":"2026-04-23T15:22:23.501815+08:00"},{"id":"71a37a516437e94fd82a87efc70a3f16","path":"frontend/package.json","line_range":"1-40","gmt_create":"2026-04-23T15:22:23.503888+08:00","gmt_modified":"2026-04-23T15:22:23.503888+08:00"},{"id":"89d70e5f89be23a229e3ee59982b8e6e","path":"frontend/tailwind.config.ts","line_range":"1-57","gmt_create":"2026-04-23T15:22:23.504853+08:00","gmt_modified":"2026-04-23T15:22:23.504853+08:00"},{"id":"95be577a89fbeb02578e4c3718c6ec86","path":"frontend/components/ui/button.tsx","line_range":"1-57","gmt_create":"2026-04-23T15:22:23.505579+08:00","gmt_modified":"2026-04-23T15:22:23.505579+08:00"},{"id":"607bb628918a7a5d54cbf74763f94d07","path":"frontend/components/ui/input.tsx","line_range":"1-23","gmt_create":"2026-04-23T15:22:23.506257+08:00","gmt_modified":"2026-04-23T15:22:23.506257+08:00"},{"id":"325e25d1dda0f7bfd9d7adfe35ecf3b5","path":"frontend/components/ui/select.tsx","line_range":"1-161","gmt_create":"2026-04-23T15:22:23.507044+08:00","gmt_modified":"2026-04-23T15:22:23.507044+08:00"},{"id":"ad6ff021b2126ad5c42323305eb6d8b0","path":"frontend/components/ui/dropdown-menu.tsx","line_range":"1-201","gmt_create":"2026-04-23T15:22:23.507926+08:00","gmt_modified":"2026-04-23T15:22:23.507926+08:00"},{"id":"a85f004dca63614b4e734ba63b45ef9e","path":"frontend/components/ui/card.tsx","line_range":"1-80","gmt_create":"2026-04-23T15:22:23.508411+08:00","gmt_modified":"2026-04-23T15:22:23.508411+08:00"},{"id":"bd3042a8d9b602334720b0d7b4e8ab3d","path":"frontend/components/ui/tabs.tsx","line_range":"1-56","gmt_create":"2026-04-23T15:22:23.509355+08:00","gmt_modified":"2026-04-23T15:22:23.509355+08:00"},{"id":"379443f450513b5492e2d9d5fca94a42","path":"frontend/components/ui/label.tsx","line_range":"1-27","gmt_create":"2026-04-23T15:22:23.509832+08:00","gmt_modified":"2026-04-23T15:22:23.509832+08:00"},{"id":"4aa6ad434a73143bb7a2072124f63be0","path":"frontend/components/ui/badge.tsx","line_range":"1-37","gmt_create":"2026-04-23T15:22:23.510286+08:00","gmt_modified":"2026-04-23T15:22:23.510286+08:00"},{"id":"c45dbdda70a8b9f02b52af4991644d0b","path":"frontend/package.json","line_range":"11-27","gmt_create":"2026-04-23T15:22:23.511056+08:00","gmt_modified":"2026-04-23T15:22:23.511056+08:00"},{"id":"6ac6943c93570294e4fb15a862be2616","path":"frontend/components/ui/button.tsx","line_range":"36-54","gmt_create":"2026-04-23T15:22:23.51229+08:00","gmt_modified":"2026-04-23T15:22:23.51229+08:00"},{"id":"4bfb5059c685e9878aed64cb5347ccec","path":"frontend/components/ui/dialog.tsx","line_range":"9-54","gmt_create":"2026-04-23T15:22:23.513266+08:00","gmt_modified":"2026-04-23T15:22:23.513266+08:00"},{"id":"0af48b69fe8fb9e480fa1656f36a4330","path":"frontend/components/ui/dropdown-menu.tsx","line_range":"21-75","gmt_create":"2026-04-23T15:22:23.514127+08:00","gmt_modified":"2026-04-23T15:22:23.514127+08:00"},{"id":"09971e31ab658e119d4c0ad948282107","path":"frontend/components/ui/select.tsx","line_range":"15-100","gmt_create":"2026-04-23T15:22:23.514956+08:00","gmt_modified":"2026-04-23T15:22:23.514956+08:00"},{"id":"31aa8777de6043883950d2668094e388","path":"frontend/components/ui/table.tsx","line_range":"5-106","gmt_create":"2026-04-23T15:22:23.515769+08:00","gmt_modified":"2026-04-23T15:22:23.515769+08:00"},{"id":"28baf3cedb89a21c6d542b7ce2439b24","path":"frontend/components/ui/tabs.tsx","line_range":"8-53","gmt_create":"2026-04-23T15:22:23.516573+08:00","gmt_modified":"2026-04-23T15:22:23.516573+08:00"},{"id":"28b0f4797c6084272244175a24b961cb","path":"frontend/components/ui/card.tsx","line_range":"5-77","gmt_create":"2026-04-23T15:22:23.518527+08:00","gmt_modified":"2026-04-23T15:22:23.518527+08:00"},{"id":"a6e0b3fa65906c3c3cd88707e1d40059","path":"frontend/components/ui/label.tsx","line_range":"9-23","gmt_create":"2026-04-23T15:22:23.520181+08:00","gmt_modified":"2026-04-23T15:22:23.520181+08:00"},{"id":"9a909775022010b4686c2b00cdf1c165","path":"frontend/components/ui/badge.tsx","line_range":"6-34","gmt_create":"2026-04-23T15:22:23.521343+08:00","gmt_modified":"2026-04-23T15:22:23.521343+08:00"},{"id":"ce1cd184945ae56cf63f55168afd8050","path":"frontend/components/ui/dialog.tsx","line_range":"47-50","gmt_create":"2026-04-23T15:22:23.523823+08:00","gmt_modified":"2026-04-23T15:22:23.523823+08:00"},{"id":"4a2a06e1efcbc85deaa013dca155f20c","path":"frontend/tailwind.config.ts","line_range":"10-54","gmt_create":"2026-04-23T15:22:23.524333+08:00","gmt_modified":"2026-04-23T15:22:23.524333+08:00"},{"id":"8b00ea4aba57ea6ed982287fb7840805","path":"frontend/lib/utils.ts","line_range":"4-6","gmt_create":"2026-04-23T15:22:23.524876+08:00","gmt_modified":"2026-04-23T15:22:23.524876+08:00"}],"knowledge_relations":[{"id":1,"source_id":"34e572eb-6fc8-4de7-8061-63783ef8be24","target_id":"2793782c-91c8-4052-b9db-39513426c736","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 34e572eb-6fc8-4de7-8061-63783ef8be24 -\u003e 2793782c-91c8-4052-b9db-39513426c736","gmt_create":"2026-04-22T19:25:18.918463+08:00","gmt_modified":"2026-04-22T19:25:18.918463+08:00"},{"id":2,"source_id":"34e572eb-6fc8-4de7-8061-63783ef8be24","target_id":"e23bd86e-b4ac-40eb-b1c1-38d929fd5419","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 34e572eb-6fc8-4de7-8061-63783ef8be24 -\u003e e23bd86e-b4ac-40eb-b1c1-38d929fd5419","gmt_create":"2026-04-22T19:25:18.919833+08:00","gmt_modified":"2026-04-22T19:25:18.919833+08:00"},{"id":3,"source_id":"34e572eb-6fc8-4de7-8061-63783ef8be24","target_id":"70b3948e-f456-42d2-b7ad-a0097ad5ee5f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 34e572eb-6fc8-4de7-8061-63783ef8be24 -\u003e 70b3948e-f456-42d2-b7ad-a0097ad5ee5f","gmt_create":"2026-04-22T19:25:18.92034+08:00","gmt_modified":"2026-04-22T19:25:18.92034+08:00"},{"id":4,"source_id":"34e572eb-6fc8-4de7-8061-63783ef8be24","target_id":"1c4316a1-f1d7-46da-bcfc-ea2fa0c56110","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 34e572eb-6fc8-4de7-8061-63783ef8be24 -\u003e 1c4316a1-f1d7-46da-bcfc-ea2fa0c56110","gmt_create":"2026-04-22T19:25:18.920778+08:00","gmt_modified":"2026-04-22T19:25:18.920778+08:00"},{"id":5,"source_id":"34e572eb-6fc8-4de7-8061-63783ef8be24","target_id":"7e679d62-c415-4d6a-a7e5-d41d00e0ed69","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 34e572eb-6fc8-4de7-8061-63783ef8be24 -\u003e 7e679d62-c415-4d6a-a7e5-d41d00e0ed69","gmt_create":"2026-04-22T19:25:18.921203+08:00","gmt_modified":"2026-04-22T19:25:18.921204+08:00"},{"id":6,"source_id":"c7eb113b-b503-4d83-be7f-9ccf3350c9d9","target_id":"f94da0b4-8a07-4de1-b0b3-d3b32a12c3c1","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: c7eb113b-b503-4d83-be7f-9ccf3350c9d9 -\u003e f94da0b4-8a07-4de1-b0b3-d3b32a12c3c1","gmt_create":"2026-04-22T19:25:18.921638+08:00","gmt_modified":"2026-04-22T19:25:18.921638+08:00"},{"id":7,"source_id":"c7eb113b-b503-4d83-be7f-9ccf3350c9d9","target_id":"df661133-efbf-43fe-97c3-f581c81f47a7","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: c7eb113b-b503-4d83-be7f-9ccf3350c9d9 -\u003e df661133-efbf-43fe-97c3-f581c81f47a7","gmt_create":"2026-04-22T19:25:18.922154+08:00","gmt_modified":"2026-04-22T19:25:18.922154+08:00"},{"id":8,"source_id":"c7eb113b-b503-4d83-be7f-9ccf3350c9d9","target_id":"11936bb5-374f-40f4-bb53-b75264fc4b9d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: c7eb113b-b503-4d83-be7f-9ccf3350c9d9 -\u003e 11936bb5-374f-40f4-bb53-b75264fc4b9d","gmt_create":"2026-04-22T19:25:18.922617+08:00","gmt_modified":"2026-04-22T19:25:18.922617+08:00"},{"id":9,"source_id":"c7eb113b-b503-4d83-be7f-9ccf3350c9d9","target_id":"23ad3419-5473-4e2c-ac87-d9715090279d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: c7eb113b-b503-4d83-be7f-9ccf3350c9d9 -\u003e 23ad3419-5473-4e2c-ac87-d9715090279d","gmt_create":"2026-04-22T19:25:18.923059+08:00","gmt_modified":"2026-04-22T19:25:18.923059+08:00"},{"id":10,"source_id":"c7eb113b-b503-4d83-be7f-9ccf3350c9d9","target_id":"19e75845-5147-4aeb-90be-16f3aa270465","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: c7eb113b-b503-4d83-be7f-9ccf3350c9d9 -\u003e 19e75845-5147-4aeb-90be-16f3aa270465","gmt_create":"2026-04-22T19:25:18.923883+08:00","gmt_modified":"2026-04-22T19:25:18.923883+08:00"},{"id":11,"source_id":"c7eb113b-b503-4d83-be7f-9ccf3350c9d9","target_id":"83fe6837-7874-4467-8114-103062f15f58","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: c7eb113b-b503-4d83-be7f-9ccf3350c9d9 -\u003e 83fe6837-7874-4467-8114-103062f15f58","gmt_create":"2026-04-22T19:25:18.924565+08:00","gmt_modified":"2026-04-22T19:25:18.924565+08:00"},{"id":12,"source_id":"3af3bb9e-4d99-4dc3-b1ed-2686db385c26","target_id":"c112a3f4-b0a1-4c4a-a325-e3ede8c90be6","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3af3bb9e-4d99-4dc3-b1ed-2686db385c26 -\u003e c112a3f4-b0a1-4c4a-a325-e3ede8c90be6","gmt_create":"2026-04-22T19:25:18.925143+08:00","gmt_modified":"2026-04-22T19:25:18.925143+08:00"},{"id":13,"source_id":"3af3bb9e-4d99-4dc3-b1ed-2686db385c26","target_id":"2b32ec11-d228-42c0-9232-103ba7e44f71","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3af3bb9e-4d99-4dc3-b1ed-2686db385c26 -\u003e 2b32ec11-d228-42c0-9232-103ba7e44f71","gmt_create":"2026-04-22T19:25:18.925589+08:00","gmt_modified":"2026-04-22T19:25:18.925589+08:00"},{"id":16,"source_id":"3af3bb9e-4d99-4dc3-b1ed-2686db385c26","target_id":"a40267bc-925a-4364-a01f-b96d3df60aea","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3af3bb9e-4d99-4dc3-b1ed-2686db385c26 -\u003e a40267bc-925a-4364-a01f-b96d3df60aea","gmt_create":"2026-04-22T19:25:18.927133+08:00","gmt_modified":"2026-04-22T19:25:18.927133+08:00"},{"id":17,"source_id":"3af3bb9e-4d99-4dc3-b1ed-2686db385c26","target_id":"7bd2c461-81b0-48e8-8cb3-b4b14305806d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3af3bb9e-4d99-4dc3-b1ed-2686db385c26 -\u003e 7bd2c461-81b0-48e8-8cb3-b4b14305806d","gmt_create":"2026-04-22T19:25:18.927624+08:00","gmt_modified":"2026-04-22T19:25:18.927625+08:00"},{"id":18,"source_id":"ffbb970e-56e0-40ad-bd88-1a1e55482d96","target_id":"d5c75004-b01b-416f-850a-4791c5489a32","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ffbb970e-56e0-40ad-bd88-1a1e55482d96 -\u003e d5c75004-b01b-416f-850a-4791c5489a32","gmt_create":"2026-04-22T19:25:18.928064+08:00","gmt_modified":"2026-04-22T19:25:18.928064+08:00"},{"id":19,"source_id":"ffbb970e-56e0-40ad-bd88-1a1e55482d96","target_id":"c3fa653f-8dd7-41fe-8c2e-8b60adbf70f4","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ffbb970e-56e0-40ad-bd88-1a1e55482d96 -\u003e c3fa653f-8dd7-41fe-8c2e-8b60adbf70f4","gmt_create":"2026-04-22T19:25:18.928495+08:00","gmt_modified":"2026-04-22T19:25:18.928495+08:00"},{"id":21,"source_id":"ffbb970e-56e0-40ad-bd88-1a1e55482d96","target_id":"7c0201f7-9e02-4cba-9ee1-81c3477f049a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ffbb970e-56e0-40ad-bd88-1a1e55482d96 -\u003e 7c0201f7-9e02-4cba-9ee1-81c3477f049a","gmt_create":"2026-04-22T19:25:18.929347+08:00","gmt_modified":"2026-04-22T19:25:18.929347+08:00"},{"id":25,"source_id":"cfc48cde-e1c3-47f6-afe2-a6d7a8f4ab69","target_id":"37003fc0-1cf5-4264-996b-40807001875f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: cfc48cde-e1c3-47f6-afe2-a6d7a8f4ab69 -\u003e 37003fc0-1cf5-4264-996b-40807001875f","gmt_create":"2026-04-22T19:25:18.931019+08:00","gmt_modified":"2026-04-22T19:25:18.931019+08:00"},{"id":26,"source_id":"cfc48cde-e1c3-47f6-afe2-a6d7a8f4ab69","target_id":"2126339b-b0f5-4152-924b-cbe028cd0c39","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: cfc48cde-e1c3-47f6-afe2-a6d7a8f4ab69 -\u003e 2126339b-b0f5-4152-924b-cbe028cd0c39","gmt_create":"2026-04-22T19:25:18.931426+08:00","gmt_modified":"2026-04-22T19:25:18.931426+08:00"},{"id":27,"source_id":"cfc48cde-e1c3-47f6-afe2-a6d7a8f4ab69","target_id":"fab60eaf-9652-4cb5-9f9e-0525caa62d63","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: cfc48cde-e1c3-47f6-afe2-a6d7a8f4ab69 -\u003e fab60eaf-9652-4cb5-9f9e-0525caa62d63","gmt_create":"2026-04-22T19:25:18.931829+08:00","gmt_modified":"2026-04-22T19:25:18.931829+08:00"},{"id":28,"source_id":"cfc48cde-e1c3-47f6-afe2-a6d7a8f4ab69","target_id":"00359e45-209d-4be3-8795-50dea52bdba1","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: cfc48cde-e1c3-47f6-afe2-a6d7a8f4ab69 -\u003e 00359e45-209d-4be3-8795-50dea52bdba1","gmt_create":"2026-04-22T19:25:18.932303+08:00","gmt_modified":"2026-04-22T19:25:18.932304+08:00"},{"id":29,"source_id":"cfc48cde-e1c3-47f6-afe2-a6d7a8f4ab69","target_id":"2632a6f9-774e-4a91-94da-a984bdb20758","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: cfc48cde-e1c3-47f6-afe2-a6d7a8f4ab69 -\u003e 2632a6f9-774e-4a91-94da-a984bdb20758","gmt_create":"2026-04-22T19:25:18.932811+08:00","gmt_modified":"2026-04-22T19:25:18.932811+08:00"},{"id":34,"source_id":"98909ecc-fceb-4ab7-a26f-741838eb2e50","target_id":"1ed0b482-3d6a-4bfd-af40-47a5d1f3e802","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 98909ecc-fceb-4ab7-a26f-741838eb2e50 -\u003e 1ed0b482-3d6a-4bfd-af40-47a5d1f3e802","gmt_create":"2026-04-22T19:25:18.934991+08:00","gmt_modified":"2026-04-22T19:25:18.934991+08:00"},{"id":35,"source_id":"98909ecc-fceb-4ab7-a26f-741838eb2e50","target_id":"26f80935-eac2-44ee-bcdb-d6a79c537750","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 98909ecc-fceb-4ab7-a26f-741838eb2e50 -\u003e 26f80935-eac2-44ee-bcdb-d6a79c537750","gmt_create":"2026-04-22T19:25:18.935426+08:00","gmt_modified":"2026-04-22T19:25:18.935426+08:00"},{"id":36,"source_id":"98909ecc-fceb-4ab7-a26f-741838eb2e50","target_id":"eb1288f7-5ea1-413a-8f54-4f870306d14d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 98909ecc-fceb-4ab7-a26f-741838eb2e50 -\u003e eb1288f7-5ea1-413a-8f54-4f870306d14d","gmt_create":"2026-04-22T19:25:18.935875+08:00","gmt_modified":"2026-04-22T19:25:18.935875+08:00"},{"id":37,"source_id":"98909ecc-fceb-4ab7-a26f-741838eb2e50","target_id":"aa6db9b6-71e1-4497-a0e2-f3ff25358d3a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 98909ecc-fceb-4ab7-a26f-741838eb2e50 -\u003e aa6db9b6-71e1-4497-a0e2-f3ff25358d3a","gmt_create":"2026-04-22T19:25:18.936315+08:00","gmt_modified":"2026-04-22T19:25:18.936316+08:00"},{"id":38,"source_id":"643984fc-5a57-498b-8f25-68cc318d9d82","target_id":"13c568d2-dfa7-4d1b-81c0-dfef247cbb67","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 643984fc-5a57-498b-8f25-68cc318d9d82 -\u003e 13c568d2-dfa7-4d1b-81c0-dfef247cbb67","gmt_create":"2026-04-22T19:25:18.936799+08:00","gmt_modified":"2026-04-22T19:25:18.936799+08:00"},{"id":39,"source_id":"643984fc-5a57-498b-8f25-68cc318d9d82","target_id":"222a9371-45c1-4e0d-b1da-e8ada1c501c2","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 643984fc-5a57-498b-8f25-68cc318d9d82 -\u003e 222a9371-45c1-4e0d-b1da-e8ada1c501c2","gmt_create":"2026-04-22T19:25:18.937215+08:00","gmt_modified":"2026-04-22T19:25:18.937215+08:00"},{"id":40,"source_id":"643984fc-5a57-498b-8f25-68cc318d9d82","target_id":"979be617-a83d-4db9-b73e-38581348f8c1","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 643984fc-5a57-498b-8f25-68cc318d9d82 -\u003e 979be617-a83d-4db9-b73e-38581348f8c1","gmt_create":"2026-04-22T19:25:18.937741+08:00","gmt_modified":"2026-04-22T19:25:18.937741+08:00"},{"id":41,"source_id":"643984fc-5a57-498b-8f25-68cc318d9d82","target_id":"422c46b3-e69c-4023-a878-411a48ae182f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 643984fc-5a57-498b-8f25-68cc318d9d82 -\u003e 422c46b3-e69c-4023-a878-411a48ae182f","gmt_create":"2026-04-22T19:25:18.938186+08:00","gmt_modified":"2026-04-22T19:25:18.938186+08:00"},{"id":45,"source_id":"c5849940-e223-4222-be17-aa0a6cb36bc8","target_id":"d2c7157d-157f-4990-8f76-11f3ea5435f7","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: c5849940-e223-4222-be17-aa0a6cb36bc8 -\u003e d2c7157d-157f-4990-8f76-11f3ea5435f7","gmt_create":"2026-04-22T19:25:18.939978+08:00","gmt_modified":"2026-04-22T19:25:18.939978+08:00"},{"id":46,"source_id":"c5849940-e223-4222-be17-aa0a6cb36bc8","target_id":"e1e0bd0e-01b3-4543-9781-d9beb32b9a57","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: c5849940-e223-4222-be17-aa0a6cb36bc8 -\u003e e1e0bd0e-01b3-4543-9781-d9beb32b9a57","gmt_create":"2026-04-22T19:25:18.940415+08:00","gmt_modified":"2026-04-22T19:25:18.940415+08:00"},{"id":47,"source_id":"c5849940-e223-4222-be17-aa0a6cb36bc8","target_id":"e9a02c86-236b-49cb-bbed-9462ee123c04","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: c5849940-e223-4222-be17-aa0a6cb36bc8 -\u003e e9a02c86-236b-49cb-bbed-9462ee123c04","gmt_create":"2026-04-22T19:25:18.941227+08:00","gmt_modified":"2026-04-22T19:25:18.941227+08:00"},{"id":48,"source_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","target_id":"12e2c3d7b9a92dc44a6ee29b85e10df6","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/app/layout.tsx","gmt_create":"2026-04-23T15:19:43.777831+08:00","gmt_modified":"2026-04-23T15:19:43.777831+08:00"},{"id":49,"source_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","target_id":"2a1c745c7b3fb7f600596be3d979bba1","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/app/(dashboard","gmt_create":"2026-04-23T15:19:43.778774+08:00","gmt_modified":"2026-04-23T15:19:43.778774+08:00"},{"id":50,"source_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","target_id":"eca13a610badfc5ffc6210827fb96991","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/components/layout/header.tsx","gmt_create":"2026-04-23T15:19:43.779153+08:00","gmt_modified":"2026-04-23T15:19:43.779154+08:00"},{"id":51,"source_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","target_id":"18a0651d895fba9bb4e0c0229459efdc","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/components/layout/sidebar.tsx","gmt_create":"2026-04-23T15:19:43.779524+08:00","gmt_modified":"2026-04-23T15:19:43.779524+08:00"},{"id":52,"source_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","target_id":"5d7886d0dc99f81073a578b8aefdd375","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/lib/api.ts","gmt_create":"2026-04-23T15:19:43.779869+08:00","gmt_modified":"2026-04-23T15:19:43.779869+08:00"},{"id":53,"source_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","target_id":"0c0b0f4e2cf44facd9d5b57de0d0bf0c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/components/ui/table.tsx","gmt_create":"2026-04-23T15:19:43.780775+08:00","gmt_modified":"2026-04-23T15:19:43.780775+08:00"},{"id":54,"source_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","target_id":"108b0c4b4dcfb6aa39a5eb138225c148","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/components/ui/dialog.tsx","gmt_create":"2026-04-23T15:19:43.781767+08:00","gmt_modified":"2026-04-23T15:19:43.781767+08:00"},{"id":55,"source_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","target_id":"ef72f0c3cedb9fd9a87352fe493053dc","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/lib/platforms.ts","gmt_create":"2026-04-23T15:19:43.782177+08:00","gmt_modified":"2026-04-23T15:19:43.782177+08:00"},{"id":56,"source_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","target_id":"f93ae024fe0a2e69698037dff6df205f","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/lib/utils.ts","gmt_create":"2026-04-23T15:19:43.782527+08:00","gmt_modified":"2026-04-23T15:19:43.782527+08:00"},{"id":57,"source_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","target_id":"d5f2266643d2011c66e86af088ec637f","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/components/charts/trend-chart.tsx","gmt_create":"2026-04-23T15:19:43.782861+08:00","gmt_modified":"2026-04-23T15:19:43.782861+08:00"},{"id":58,"source_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","target_id":"f1a7d61831cc0a45ac6220294f15c21d","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/components/charts/platform-chart.tsx","gmt_create":"2026-04-23T15:19:43.783164+08:00","gmt_modified":"2026-04-23T15:19:43.783165+08:00"},{"id":59,"source_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","target_id":"8a466b0c6eac2ccb54c5da7e13854646","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/app/layout.tsx#1-37","gmt_create":"2026-04-23T15:19:43.783668+08:00","gmt_modified":"2026-04-23T15:19:43.783668+08:00"},{"id":60,"source_id":"12e2c3d7b9a92dc44a6ee29b85e10df6","target_id":"8a466b0c6eac2ccb54c5da7e13854646","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-37","gmt_create":"2026-04-23T15:19:43.783987+08:00","gmt_modified":"2026-04-23T15:19:43.783987+08:00"},{"id":61,"source_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","target_id":"3bd4eedea376e3a3d9f9fbff4fe27a65","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/components/layout/sidebar.tsx#1-54","gmt_create":"2026-04-23T15:19:43.784455+08:00","gmt_modified":"2026-04-23T15:19:43.784455+08:00"},{"id":62,"source_id":"18a0651d895fba9bb4e0c0229459efdc","target_id":"3bd4eedea376e3a3d9f9fbff4fe27a65","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-54","gmt_create":"2026-04-23T15:19:43.784807+08:00","gmt_modified":"2026-04-23T15:19:43.784807+08:00"},{"id":63,"source_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","target_id":"0d903468b55bdc63cc7e25a87a89c522","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/components/layout/header.tsx#1-30","gmt_create":"2026-04-23T15:19:43.785303+08:00","gmt_modified":"2026-04-23T15:19:43.785303+08:00"},{"id":64,"source_id":"eca13a610badfc5ffc6210827fb96991","target_id":"0d903468b55bdc63cc7e25a87a89c522","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-30","gmt_create":"2026-04-23T15:19:43.785622+08:00","gmt_modified":"2026-04-23T15:19:43.785622+08:00"},{"id":65,"source_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","target_id":"3bab92a09e9fb456e0303bb1e04afc7e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/components/ui/table.tsx#1-118","gmt_create":"2026-04-23T15:19:43.78727+08:00","gmt_modified":"2026-04-23T15:19:43.787271+08:00"},{"id":66,"source_id":"0c0b0f4e2cf44facd9d5b57de0d0bf0c","target_id":"3bab92a09e9fb456e0303bb1e04afc7e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-118","gmt_create":"2026-04-23T15:19:43.788224+08:00","gmt_modified":"2026-04-23T15:19:43.788224+08:00"},{"id":67,"source_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","target_id":"0eed9f61572209dd754611fc7c690d5a","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/components/ui/dialog.tsx#1-123","gmt_create":"2026-04-23T15:19:43.789533+08:00","gmt_modified":"2026-04-23T15:19:43.789533+08:00"},{"id":68,"source_id":"108b0c4b4dcfb6aa39a5eb138225c148","target_id":"0eed9f61572209dd754611fc7c690d5a","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-123","gmt_create":"2026-04-23T15:19:43.790255+08:00","gmt_modified":"2026-04-23T15:19:43.790255+08:00"},{"id":69,"source_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","target_id":"b7796fc6197ecce5beb461b9466e54a0","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/components/charts/trend-chart.tsx#1-60","gmt_create":"2026-04-23T15:19:43.790795+08:00","gmt_modified":"2026-04-23T15:19:43.790795+08:00"},{"id":70,"source_id":"d5f2266643d2011c66e86af088ec637f","target_id":"b7796fc6197ecce5beb461b9466e54a0","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-60","gmt_create":"2026-04-23T15:19:43.791134+08:00","gmt_modified":"2026-04-23T15:19:43.791134+08:00"},{"id":71,"source_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","target_id":"6b9f52af0b6d78c17ff9bbc42d760ea2","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/components/charts/platform-chart.tsx#1-68","gmt_create":"2026-04-23T15:19:43.791601+08:00","gmt_modified":"2026-04-23T15:19:43.791601+08:00"},{"id":72,"source_id":"f1a7d61831cc0a45ac6220294f15c21d","target_id":"6b9f52af0b6d78c17ff9bbc42d760ea2","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-68","gmt_create":"2026-04-23T15:19:43.791902+08:00","gmt_modified":"2026-04-23T15:19:43.791902+08:00"},{"id":73,"source_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","target_id":"a829403082cc3460c01e0110229c53c4","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/lib/platforms.ts#1-18","gmt_create":"2026-04-23T15:19:43.792356+08:00","gmt_modified":"2026-04-23T15:19:43.792356+08:00"},{"id":74,"source_id":"ef72f0c3cedb9fd9a87352fe493053dc","target_id":"a829403082cc3460c01e0110229c53c4","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-18","gmt_create":"2026-04-23T15:19:43.79267+08:00","gmt_modified":"2026-04-23T15:19:43.79267+08:00"},{"id":75,"source_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","target_id":"dcfa308ef4ec368c5a51a17acbfc8e2c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/lib/utils.ts#1-7","gmt_create":"2026-04-23T15:19:43.79312+08:00","gmt_modified":"2026-04-23T15:19:43.79312+08:00"},{"id":76,"source_id":"f93ae024fe0a2e69698037dff6df205f","target_id":"dcfa308ef4ec368c5a51a17acbfc8e2c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-7","gmt_create":"2026-04-23T15:19:43.793455+08:00","gmt_modified":"2026-04-23T15:19:43.793455+08:00"},{"id":77,"source_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","target_id":"0f87c8089f548883d056f0a0d79e273f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/lib/api.ts#1-79","gmt_create":"2026-04-23T15:19:43.793866+08:00","gmt_modified":"2026-04-23T15:19:43.793866+08:00"},{"id":78,"source_id":"5d7886d0dc99f81073a578b8aefdd375","target_id":"0f87c8089f548883d056f0a0d79e273f","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-79","gmt_create":"2026-04-23T15:19:43.794158+08:00","gmt_modified":"2026-04-23T15:19:43.794158+08:00"},{"id":79,"source_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","target_id":"9beee1f41fe8f0750fd97155f9d54bbb","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/lib/api.ts#67-70","gmt_create":"2026-04-23T15:19:43.797877+08:00","gmt_modified":"2026-04-23T15:19:43.797877+08:00"},{"id":80,"source_id":"5d7886d0dc99f81073a578b8aefdd375","target_id":"9beee1f41fe8f0750fd97155f9d54bbb","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 67-70","gmt_create":"2026-04-23T15:19:43.798244+08:00","gmt_modified":"2026-04-23T15:19:43.798244+08:00"},{"id":81,"source_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","target_id":"8fe2e22a963442076e1ce16ab777573c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/lib/api.ts#56-66","gmt_create":"2026-04-23T15:19:43.799319+08:00","gmt_modified":"2026-04-23T15:19:43.799319+08:00"},{"id":82,"source_id":"5d7886d0dc99f81073a578b8aefdd375","target_id":"8fe2e22a963442076e1ce16ab777573c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 56-66","gmt_create":"2026-04-23T15:19:43.799625+08:00","gmt_modified":"2026-04-23T15:19:43.799625+08:00"},{"id":83,"source_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","target_id":"3124ad882ca2cf8fecb6b93696c7f233","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/lib/api.ts#72-77","gmt_create":"2026-04-23T15:19:43.801555+08:00","gmt_modified":"2026-04-23T15:19:43.801555+08:00"},{"id":84,"source_id":"5d7886d0dc99f81073a578b8aefdd375","target_id":"3124ad882ca2cf8fecb6b93696c7f233","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 72-77","gmt_create":"2026-04-23T15:19:43.801939+08:00","gmt_modified":"2026-04-23T15:19:43.801939+08:00"},{"id":85,"source_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","target_id":"17a97b4ac37fb67b8eda7ce2887c38e7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/app/layout.tsx#17-20","gmt_create":"2026-04-23T15:19:43.806186+08:00","gmt_modified":"2026-04-23T15:19:43.806186+08:00"},{"id":86,"source_id":"12e2c3d7b9a92dc44a6ee29b85e10df6","target_id":"17a97b4ac37fb67b8eda7ce2887c38e7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 17-20","gmt_create":"2026-04-23T15:19:43.80664+08:00","gmt_modified":"2026-04-23T15:19:43.80664+08:00"},{"id":87,"source_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","target_id":"84cba1e0d516e8c9859402fd5c1bc83c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/lib/api.ts#3-40","gmt_create":"2026-04-23T15:19:43.815637+08:00","gmt_modified":"2026-04-23T15:19:43.815637+08:00"},{"id":88,"source_id":"5d7886d0dc99f81073a578b8aefdd375","target_id":"84cba1e0d516e8c9859402fd5c1bc83c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 3-40","gmt_create":"2026-04-23T15:19:43.817147+08:00","gmt_modified":"2026-04-23T15:19:43.817147+08:00"},{"id":89,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"9228ff67d4c757a85d9421b71f4b29f5","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/main.py","gmt_create":"2026-04-23T15:19:45.610941+08:00","gmt_modified":"2026-04-23T15:19:45.610941+08:00"},{"id":90,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"93022c8938ce318f167277cfa65c29a7","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/api/auth.py","gmt_create":"2026-04-23T15:19:45.611315+08:00","gmt_modified":"2026-04-23T15:19:45.611315+08:00"},{"id":91,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"6b3d903205941aa9391dd90016e1102c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/api/queries.py","gmt_create":"2026-04-23T15:19:45.611638+08:00","gmt_modified":"2026-04-23T15:19:45.611638+08:00"},{"id":92,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"7538ffe4902ab6041adb28b19844962a","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/api/citations.py","gmt_create":"2026-04-23T15:19:45.611969+08:00","gmt_modified":"2026-04-23T15:19:45.611969+08:00"},{"id":93,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"58901c94d975d87e652a4dc6c8dda656","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/api/reports.py","gmt_create":"2026-04-23T15:19:45.612281+08:00","gmt_modified":"2026-04-23T15:19:45.612282+08:00"},{"id":94,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"9d08667997a868fc07c9b4e328e44224","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/api/deps.py","gmt_create":"2026-04-23T15:19:45.612634+08:00","gmt_modified":"2026-04-23T15:19:45.612634+08:00"},{"id":95,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"e0c0ca66b8b81cf66e078a7ab162c07f","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/schemas/auth.py","gmt_create":"2026-04-23T15:19:45.612995+08:00","gmt_modified":"2026-04-23T15:19:45.612995+08:00"},{"id":96,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"f301b79d833233ce39d350e82a71c938","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/schemas/query.py","gmt_create":"2026-04-23T15:19:45.613329+08:00","gmt_modified":"2026-04-23T15:19:45.613329+08:00"},{"id":97,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"1a3336b4af8a39a055e912724338580c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/schemas/citation.py","gmt_create":"2026-04-23T15:19:45.613646+08:00","gmt_modified":"2026-04-23T15:19:45.613647+08:00"},{"id":98,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"4d2f3847b7c10634733118b70a1aea0b","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/services/auth.py","gmt_create":"2026-04-23T15:19:45.613962+08:00","gmt_modified":"2026-04-23T15:19:45.613962+08:00"},{"id":99,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"88d22de3b2a7419868e8ae19130d860c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/services/query.py","gmt_create":"2026-04-23T15:19:45.614276+08:00","gmt_modified":"2026-04-23T15:19:45.614276+08:00"},{"id":100,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"04e3926c080e795713bff683e7dc9d3e","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/services/citation.py","gmt_create":"2026-04-23T15:19:45.614712+08:00","gmt_modified":"2026-04-23T15:19:45.614712+08:00"},{"id":101,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"9ff19022ef915615911280e3c49ed44b","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/config.py","gmt_create":"2026-04-23T15:19:45.61522+08:00","gmt_modified":"2026-04-23T15:19:45.61522+08:00"},{"id":102,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"c59f8c276697a070dffc581fe94d809c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/models/user.py","gmt_create":"2026-04-23T15:19:45.615619+08:00","gmt_modified":"2026-04-23T15:19:45.615619+08:00"},{"id":103,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"b74caccb06844efcdb14d8324cff65c2","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/models/query.py","gmt_create":"2026-04-23T15:19:45.615972+08:00","gmt_modified":"2026-04-23T15:19:45.615972+08:00"},{"id":104,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"b4a81ef789630d0af6a8d50859d01bf3","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/models/citation_record.py","gmt_create":"2026-04-23T15:19:45.616295+08:00","gmt_modified":"2026-04-23T15:19:45.616295+08:00"},{"id":105,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"069738f21ac2da7349d22683e8c36929","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/models/query_task.py","gmt_create":"2026-04-23T15:19:45.616638+08:00","gmt_modified":"2026-04-23T15:19:45.616638+08:00"},{"id":106,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"b55a164add5a8fec2ef0e489f7234829","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/main.py#24-47","gmt_create":"2026-04-23T15:19:45.61708+08:00","gmt_modified":"2026-04-23T15:19:45.61708+08:00"},{"id":107,"source_id":"9228ff67d4c757a85d9421b71f4b29f5","target_id":"b55a164add5a8fec2ef0e489f7234829","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 24-47","gmt_create":"2026-04-23T15:19:45.617445+08:00","gmt_modified":"2026-04-23T15:19:45.617445+08:00"},{"id":108,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"16d619435094a63740357cd6317b52cb","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/auth.py#10","gmt_create":"2026-04-23T15:19:45.617883+08:00","gmt_modified":"2026-04-23T15:19:45.617883+08:00"},{"id":109,"source_id":"93022c8938ce318f167277cfa65c29a7","target_id":"16d619435094a63740357cd6317b52cb","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 10","gmt_create":"2026-04-23T15:19:45.618177+08:00","gmt_modified":"2026-04-23T15:19:45.618177+08:00"},{"id":110,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"fa1ee5e3822128a37e9d03af74083392","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/queries.py#12","gmt_create":"2026-04-23T15:19:45.61874+08:00","gmt_modified":"2026-04-23T15:19:45.61874+08:00"},{"id":111,"source_id":"6b3d903205941aa9391dd90016e1102c","target_id":"fa1ee5e3822128a37e9d03af74083392","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 12","gmt_create":"2026-04-23T15:19:45.619215+08:00","gmt_modified":"2026-04-23T15:19:45.619215+08:00"},{"id":112,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"7e908f05baccdfcf7f4a3ef3c9cd5c38","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/citations.py#21","gmt_create":"2026-04-23T15:19:45.619736+08:00","gmt_modified":"2026-04-23T15:19:45.619736+08:00"},{"id":113,"source_id":"7538ffe4902ab6041adb28b19844962a","target_id":"7e908f05baccdfcf7f4a3ef3c9cd5c38","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 21","gmt_create":"2026-04-23T15:19:45.620246+08:00","gmt_modified":"2026-04-23T15:19:45.620246+08:00"},{"id":114,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"ffe6df344be81bde3941ad8f0d77910b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/reports.py#13","gmt_create":"2026-04-23T15:19:45.622123+08:00","gmt_modified":"2026-04-23T15:19:45.622124+08:00"},{"id":115,"source_id":"58901c94d975d87e652a4dc6c8dda656","target_id":"ffe6df344be81bde3941ad8f0d77910b","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 13","gmt_create":"2026-04-23T15:19:45.623067+08:00","gmt_modified":"2026-04-23T15:19:45.623067+08:00"},{"id":116,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"c71fb14f8866e34c679c94a4e2432bc7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/deps.py#13","gmt_create":"2026-04-23T15:19:45.624216+08:00","gmt_modified":"2026-04-23T15:19:45.624217+08:00"},{"id":117,"source_id":"9d08667997a868fc07c9b4e328e44224","target_id":"c71fb14f8866e34c679c94a4e2432bc7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 13","gmt_create":"2026-04-23T15:19:45.624846+08:00","gmt_modified":"2026-04-23T15:19:45.624846+08:00"},{"id":118,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"3c68f1581d2fd6aa845dd71111a9aa9d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/main.py#1-57","gmt_create":"2026-04-23T15:19:45.62545+08:00","gmt_modified":"2026-04-23T15:19:45.62545+08:00"},{"id":119,"source_id":"9228ff67d4c757a85d9421b71f4b29f5","target_id":"3c68f1581d2fd6aa845dd71111a9aa9d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-57","gmt_create":"2026-04-23T15:19:45.625985+08:00","gmt_modified":"2026-04-23T15:19:45.625985+08:00"},{"id":120,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"39afb05755a93800fd685af7274110cb","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/main.py#13-57","gmt_create":"2026-04-23T15:19:45.626544+08:00","gmt_modified":"2026-04-23T15:19:45.626544+08:00"},{"id":121,"source_id":"9228ff67d4c757a85d9421b71f4b29f5","target_id":"39afb05755a93800fd685af7274110cb","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 13-57","gmt_create":"2026-04-23T15:19:45.626917+08:00","gmt_modified":"2026-04-23T15:19:45.626917+08:00"},{"id":122,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"87a177f17800991e1ed1fb7be03abdb2","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/auth.py#13-42","gmt_create":"2026-04-23T15:19:45.627469+08:00","gmt_modified":"2026-04-23T15:19:45.62747+08:00"},{"id":123,"source_id":"93022c8938ce318f167277cfa65c29a7","target_id":"87a177f17800991e1ed1fb7be03abdb2","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 13-42","gmt_create":"2026-04-23T15:19:45.627772+08:00","gmt_modified":"2026-04-23T15:19:45.627772+08:00"},{"id":124,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"ae9de874df4a46f4197b6c157c25ec6e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/queries.py#15-85","gmt_create":"2026-04-23T15:19:45.628226+08:00","gmt_modified":"2026-04-23T15:19:45.628226+08:00"},{"id":125,"source_id":"6b3d903205941aa9391dd90016e1102c","target_id":"ae9de874df4a46f4197b6c157c25ec6e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 15-85","gmt_create":"2026-04-23T15:19:45.628538+08:00","gmt_modified":"2026-04-23T15:19:45.628538+08:00"},{"id":126,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"c066a8d4bffabed87a2e38ccad81c107","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/citations.py#25-77","gmt_create":"2026-04-23T15:19:45.629104+08:00","gmt_modified":"2026-04-23T15:19:45.629104+08:00"},{"id":127,"source_id":"7538ffe4902ab6041adb28b19844962a","target_id":"c066a8d4bffabed87a2e38ccad81c107","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 25-77","gmt_create":"2026-04-23T15:19:45.629465+08:00","gmt_modified":"2026-04-23T15:19:45.629465+08:00"},{"id":128,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"177c73dc4e71186d9eaa1157fc0fe97f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/reports.py#16-46","gmt_create":"2026-04-23T15:19:45.629913+08:00","gmt_modified":"2026-04-23T15:19:45.629913+08:00"},{"id":129,"source_id":"58901c94d975d87e652a4dc6c8dda656","target_id":"177c73dc4e71186d9eaa1157fc0fe97f","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 16-46","gmt_create":"2026-04-23T15:19:45.630333+08:00","gmt_modified":"2026-04-23T15:19:45.630333+08:00"},{"id":130,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"a0be0cbddb559575861620b5b7579634","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/main.py#38-51","gmt_create":"2026-04-23T15:19:45.630817+08:00","gmt_modified":"2026-04-23T15:19:45.630817+08:00"},{"id":131,"source_id":"9228ff67d4c757a85d9421b71f4b29f5","target_id":"a0be0cbddb559575861620b5b7579634","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 38-51","gmt_create":"2026-04-23T15:19:45.631178+08:00","gmt_modified":"2026-04-23T15:19:45.631178+08:00"},{"id":132,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"bcdf50f6234651cb9863ab210e6473e5","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/deps.py#16-42","gmt_create":"2026-04-23T15:19:45.631734+08:00","gmt_modified":"2026-04-23T15:19:45.631735+08:00"},{"id":133,"source_id":"9d08667997a868fc07c9b4e328e44224","target_id":"bcdf50f6234651cb9863ab210e6473e5","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 16-42","gmt_create":"2026-04-23T15:19:45.632177+08:00","gmt_modified":"2026-04-23T15:19:45.632177+08:00"},{"id":134,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"6df0277c2486b148fa26c2682dbdaa4c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/services/auth.py#37-68","gmt_create":"2026-04-23T15:19:45.632731+08:00","gmt_modified":"2026-04-23T15:19:45.632731+08:00"},{"id":135,"source_id":"4d2f3847b7c10634733118b70a1aea0b","target_id":"6df0277c2486b148fa26c2682dbdaa4c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 37-68","gmt_create":"2026-04-23T15:19:45.63307+08:00","gmt_modified":"2026-04-23T15:19:45.63307+08:00"},{"id":136,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"5ea5f192d580031ffe57e1582b70c67e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/services/query.py#12-123","gmt_create":"2026-04-23T15:19:45.633593+08:00","gmt_modified":"2026-04-23T15:19:45.633593+08:00"},{"id":137,"source_id":"88d22de3b2a7419868e8ae19130d860c","target_id":"5ea5f192d580031ffe57e1582b70c67e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 12-123","gmt_create":"2026-04-23T15:19:45.633929+08:00","gmt_modified":"2026-04-23T15:19:45.633929+08:00"},{"id":138,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"fe4a793f16cd4e12b56253c0a6d53ae0","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/services/citation.py#24-359","gmt_create":"2026-04-23T15:19:45.634408+08:00","gmt_modified":"2026-04-23T15:19:45.634408+08:00"},{"id":139,"source_id":"04e3926c080e795713bff683e7dc9d3e","target_id":"fe4a793f16cd4e12b56253c0a6d53ae0","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 24-359","gmt_create":"2026-04-23T15:19:45.634775+08:00","gmt_modified":"2026-04-23T15:19:45.634775+08:00"},{"id":140,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"9552bd8a528207f18e4f3a1696f26a55","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/auth.py#13-37","gmt_create":"2026-04-23T15:19:45.635318+08:00","gmt_modified":"2026-04-23T15:19:45.635318+08:00"},{"id":141,"source_id":"93022c8938ce318f167277cfa65c29a7","target_id":"9552bd8a528207f18e4f3a1696f26a55","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 13-37","gmt_create":"2026-04-23T15:19:45.635763+08:00","gmt_modified":"2026-04-23T15:19:45.635763+08:00"},{"id":142,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"4aad38dfc00a0877bd965c3d0b3c280c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/schemas/auth.py#7-34","gmt_create":"2026-04-23T15:19:45.638941+08:00","gmt_modified":"2026-04-23T15:19:45.638941+08:00"},{"id":143,"source_id":"e0c0ca66b8b81cf66e078a7ab162c07f","target_id":"4aad38dfc00a0877bd965c3d0b3c280c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 7-34","gmt_create":"2026-04-23T15:19:45.639659+08:00","gmt_modified":"2026-04-23T15:19:45.63966+08:00"},{"id":144,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"9b10dac7dbbb1327afc8a525bf4bd0c3","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/services/query.py#45-81","gmt_create":"2026-04-23T15:19:45.641388+08:00","gmt_modified":"2026-04-23T15:19:45.641388+08:00"},{"id":145,"source_id":"88d22de3b2a7419868e8ae19130d860c","target_id":"9b10dac7dbbb1327afc8a525bf4bd0c3","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 45-81","gmt_create":"2026-04-23T15:19:45.641965+08:00","gmt_modified":"2026-04-23T15:19:45.641965+08:00"},{"id":146,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"69118807690ef351a9de910414d5e676","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/schemas/query.py#11-94","gmt_create":"2026-04-23T15:19:45.642904+08:00","gmt_modified":"2026-04-23T15:19:45.642904+08:00"},{"id":147,"source_id":"f301b79d833233ce39d350e82a71c938","target_id":"69118807690ef351a9de910414d5e676","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 11-94","gmt_create":"2026-04-23T15:19:45.643362+08:00","gmt_modified":"2026-04-23T15:19:45.643362+08:00"},{"id":148,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"212d822d207a4c0bd7825bbf20e188e9","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/citations.py#59-77","gmt_create":"2026-04-23T15:19:45.644135+08:00","gmt_modified":"2026-04-23T15:19:45.644135+08:00"},{"id":149,"source_id":"7538ffe4902ab6041adb28b19844962a","target_id":"212d822d207a4c0bd7825bbf20e188e9","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 59-77","gmt_create":"2026-04-23T15:19:45.644457+08:00","gmt_modified":"2026-04-23T15:19:45.644457+08:00"},{"id":150,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"b0777c7da17be89abb333c81c0dcf349","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/services/citation.py#204-261","gmt_create":"2026-04-23T15:19:45.644935+08:00","gmt_modified":"2026-04-23T15:19:45.644935+08:00"},{"id":151,"source_id":"04e3926c080e795713bff683e7dc9d3e","target_id":"b0777c7da17be89abb333c81c0dcf349","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 204-261","gmt_create":"2026-04-23T15:19:45.645243+08:00","gmt_modified":"2026-04-23T15:19:45.645243+08:00"},{"id":152,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"26288877e8e1f6c4ff5aca12610b0218","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/schemas/citation.py#7-50","gmt_create":"2026-04-23T15:19:45.646072+08:00","gmt_modified":"2026-04-23T15:19:45.646072+08:00"},{"id":153,"source_id":"1a3336b4af8a39a055e912724338580c","target_id":"26288877e8e1f6c4ff5aca12610b0218","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 7-50","gmt_create":"2026-04-23T15:19:45.646445+08:00","gmt_modified":"2026-04-23T15:19:45.646445+08:00"},{"id":154,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"dbf5f8a57778cf6363e834081f3d771c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/services/citation.py#327-359","gmt_create":"2026-04-23T15:19:45.647596+08:00","gmt_modified":"2026-04-23T15:19:45.647596+08:00"},{"id":155,"source_id":"04e3926c080e795713bff683e7dc9d3e","target_id":"dbf5f8a57778cf6363e834081f3d771c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 327-359","gmt_create":"2026-04-23T15:19:45.647935+08:00","gmt_modified":"2026-04-23T15:19:45.647935+08:00"},{"id":156,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"56e46969bdb790a5e8f333184b878d6d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/models/user.py#11-41","gmt_create":"2026-04-23T15:19:45.64941+08:00","gmt_modified":"2026-04-23T15:19:45.64941+08:00"},{"id":157,"source_id":"c59f8c276697a070dffc581fe94d809c","target_id":"56e46969bdb790a5e8f333184b878d6d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 11-41","gmt_create":"2026-04-23T15:19:45.649807+08:00","gmt_modified":"2026-04-23T15:19:45.649807+08:00"},{"id":158,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"4fb8856be3a581fe8303d11b2284ca29","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/models/query.py#11-55","gmt_create":"2026-04-23T15:19:45.650287+08:00","gmt_modified":"2026-04-23T15:19:45.650287+08:00"},{"id":159,"source_id":"b74caccb06844efcdb14d8324cff65c2","target_id":"4fb8856be3a581fe8303d11b2284ca29","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 11-55","gmt_create":"2026-04-23T15:19:45.650642+08:00","gmt_modified":"2026-04-23T15:19:45.650642+08:00"},{"id":160,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"fd541971cebf8a7c167d717f5c5d1ff6","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/models/citation_record.py#11-42","gmt_create":"2026-04-23T15:19:45.651088+08:00","gmt_modified":"2026-04-23T15:19:45.651088+08:00"},{"id":161,"source_id":"b4a81ef789630d0af6a8d50859d01bf3","target_id":"fd541971cebf8a7c167d717f5c5d1ff6","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 11-42","gmt_create":"2026-04-23T15:19:45.651529+08:00","gmt_modified":"2026-04-23T15:19:45.651529+08:00"},{"id":162,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"b84f46f058847733347974841f613688","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/models/query_task.py#11-39","gmt_create":"2026-04-23T15:19:45.652087+08:00","gmt_modified":"2026-04-23T15:19:45.652087+08:00"},{"id":163,"source_id":"069738f21ac2da7349d22683e8c36929","target_id":"b84f46f058847733347974841f613688","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 11-39","gmt_create":"2026-04-23T15:19:45.65251+08:00","gmt_modified":"2026-04-23T15:19:45.65251+08:00"},{"id":164,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"1a2657244414b5681afded9565a86422","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/models/user.py#35-40","gmt_create":"2026-04-23T15:19:45.653858+08:00","gmt_modified":"2026-04-23T15:19:45.653858+08:00"},{"id":165,"source_id":"c59f8c276697a070dffc581fe94d809c","target_id":"1a2657244414b5681afded9565a86422","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 35-40","gmt_create":"2026-04-23T15:19:45.655814+08:00","gmt_modified":"2026-04-23T15:19:45.655814+08:00"},{"id":166,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"acd5a29be2bdd4ae251e10ca266ffe13","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/models/query.py#43-48","gmt_create":"2026-04-23T15:19:45.657411+08:00","gmt_modified":"2026-04-23T15:19:45.657411+08:00"},{"id":167,"source_id":"b74caccb06844efcdb14d8324cff65c2","target_id":"acd5a29be2bdd4ae251e10ca266ffe13","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 43-48","gmt_create":"2026-04-23T15:19:45.657941+08:00","gmt_modified":"2026-04-23T15:19:45.657942+08:00"},{"id":168,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"27a5e2dd1d197b2e3a45be41c57a6183","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/models/citation_record.py#35","gmt_create":"2026-04-23T15:19:45.658596+08:00","gmt_modified":"2026-04-23T15:19:45.658596+08:00"},{"id":169,"source_id":"b4a81ef789630d0af6a8d50859d01bf3","target_id":"27a5e2dd1d197b2e3a45be41c57a6183","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 35","gmt_create":"2026-04-23T15:19:45.658966+08:00","gmt_modified":"2026-04-23T15:19:45.658966+08:00"},{"id":170,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"c43e8fc0c04c5ed2db7798d99c8c77b8","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/models/query_task.py#34","gmt_create":"2026-04-23T15:19:45.659429+08:00","gmt_modified":"2026-04-23T15:19:45.659429+08:00"},{"id":171,"source_id":"069738f21ac2da7349d22683e8c36929","target_id":"c43e8fc0c04c5ed2db7798d99c8c77b8","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 34","gmt_create":"2026-04-23T15:19:45.659763+08:00","gmt_modified":"2026-04-23T15:19:45.659763+08:00"},{"id":172,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"8868ab86034eecf40e80347ef8cbdebd","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/auth.py#26-30","gmt_create":"2026-04-23T15:19:45.660181+08:00","gmt_modified":"2026-04-23T15:19:45.660181+08:00"},{"id":173,"source_id":"93022c8938ce318f167277cfa65c29a7","target_id":"8868ab86034eecf40e80347ef8cbdebd","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 26-30","gmt_create":"2026-04-23T15:19:45.660491+08:00","gmt_modified":"2026-04-23T15:19:45.660491+08:00"},{"id":174,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"a50f983ec39bac67dff5df80f6dad837","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/services/query.py#59-60","gmt_create":"2026-04-23T15:19:45.660943+08:00","gmt_modified":"2026-04-23T15:19:45.660943+08:00"},{"id":175,"source_id":"88d22de3b2a7419868e8ae19130d860c","target_id":"a50f983ec39bac67dff5df80f6dad837","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 59-60","gmt_create":"2026-04-23T15:19:45.661271+08:00","gmt_modified":"2026-04-23T15:19:45.661271+08:00"},{"id":176,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"55f1628f1ab6f323710e367e12146b1a","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/citations.py#67-71","gmt_create":"2026-04-23T15:19:45.661702+08:00","gmt_modified":"2026-04-23T15:19:45.661702+08:00"},{"id":177,"source_id":"7538ffe4902ab6041adb28b19844962a","target_id":"55f1628f1ab6f323710e367e12146b1a","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 67-71","gmt_create":"2026-04-23T15:19:45.662055+08:00","gmt_modified":"2026-04-23T15:19:45.662055+08:00"},{"id":178,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"6ef6d32f97d7b50b7a4da541137423c0","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/reports.py#23-27","gmt_create":"2026-04-23T15:19:45.662628+08:00","gmt_modified":"2026-04-23T15:19:45.662628+08:00"},{"id":179,"source_id":"58901c94d975d87e652a4dc6c8dda656","target_id":"6ef6d32f97d7b50b7a4da541137423c0","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 23-27","gmt_create":"2026-04-23T15:19:45.662999+08:00","gmt_modified":"2026-04-23T15:19:45.662999+08:00"},{"id":180,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"5cbb1e3f112aeba62a14b0b8999fc0f5","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/workers/scheduler.py","gmt_create":"2026-04-23T15:20:08.989793+08:00","gmt_modified":"2026-04-23T15:20:08.989793+08:00"},{"id":181,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"74040de652d5e57f548bb5c4adc3e1a0","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/workers/citation_engine.py","gmt_create":"2026-04-23T15:20:08.990186+08:00","gmt_modified":"2026-04-23T15:20:08.990186+08:00"},{"id":182,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"8f973791233c698b3e64a4fb28a93d4b","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/workers/platforms/kimi.py","gmt_create":"2026-04-23T15:20:08.990539+08:00","gmt_modified":"2026-04-23T15:20:08.990539+08:00"},{"id":183,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"f642fc1c2f34e15572d9d98aa6c18813","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/workers/platforms/wenxin.py","gmt_create":"2026-04-23T15:20:08.990851+08:00","gmt_modified":"2026-04-23T15:20:08.990851+08:00"},{"id":184,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"a16cf42e9559523c4f96ca4c79f9488d","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/workers/platforms/base.py","gmt_create":"2026-04-23T15:20:08.991166+08:00","gmt_modified":"2026-04-23T15:20:08.991166+08:00"},{"id":185,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"b74caccb06844efcdb14d8324cff65c2","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/models/query.py","gmt_create":"2026-04-23T15:20:08.991471+08:00","gmt_modified":"2026-04-23T15:20:08.991472+08:00"},{"id":186,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"069738f21ac2da7349d22683e8c36929","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/models/query_task.py","gmt_create":"2026-04-23T15:20:08.991772+08:00","gmt_modified":"2026-04-23T15:20:08.991772+08:00"},{"id":187,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"b4a81ef789630d0af6a8d50859d01bf3","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/models/citation_record.py","gmt_create":"2026-04-23T15:20:08.992186+08:00","gmt_modified":"2026-04-23T15:20:08.992186+08:00"},{"id":188,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"88d22de3b2a7419868e8ae19130d860c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/services/query.py","gmt_create":"2026-04-23T15:20:08.992542+08:00","gmt_modified":"2026-04-23T15:20:08.992542+08:00"},{"id":189,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"6b3d903205941aa9391dd90016e1102c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/api/queries.py","gmt_create":"2026-04-23T15:20:08.992879+08:00","gmt_modified":"2026-04-23T15:20:08.992879+08:00"},{"id":190,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"b0c428683c8a3e6922d90ca0d8c2736d","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/database.py","gmt_create":"2026-04-23T15:20:08.997487+08:00","gmt_modified":"2026-04-23T15:20:08.997487+08:00"},{"id":191,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"9ff19022ef915615911280e3c49ed44b","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/config.py","gmt_create":"2026-04-23T15:20:08.998695+08:00","gmt_modified":"2026-04-23T15:20:08.998696+08:00"},{"id":192,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"9228ff67d4c757a85d9421b71f4b29f5","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/main.py","gmt_create":"2026-04-23T15:20:08.999402+08:00","gmt_modified":"2026-04-23T15:20:08.999402+08:00"},{"id":193,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"b2f0d46a31a5441594f2e777365fc156","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: tests/test_scheduler.py","gmt_create":"2026-04-23T15:20:09.000067+08:00","gmt_modified":"2026-04-23T15:20:09.000067+08:00"},{"id":194,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"0613e76b9679be7f998fb8fd8056e686","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: tests/test_queries.py","gmt_create":"2026-04-23T15:20:09.000413+08:00","gmt_modified":"2026-04-23T15:20:09.000413+08:00"},{"id":195,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"096856da621e23e78422a15e2bfce1f1","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/main.py#13-22","gmt_create":"2026-04-23T15:20:09.000893+08:00","gmt_modified":"2026-04-23T15:20:09.000893+08:00"},{"id":196,"source_id":"9228ff67d4c757a85d9421b71f4b29f5","target_id":"096856da621e23e78422a15e2bfce1f1","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 13-22","gmt_create":"2026-04-23T15:20:09.00176+08:00","gmt_modified":"2026-04-23T15:20:09.00176+08:00"},{"id":197,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"e230904202fcf7a861c6f49b84f9f863","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/workers/scheduler.py#25-95","gmt_create":"2026-04-23T15:20:09.003004+08:00","gmt_modified":"2026-04-23T15:20:09.003004+08:00"},{"id":198,"source_id":"5cbb1e3f112aeba62a14b0b8999fc0f5","target_id":"e230904202fcf7a861c6f49b84f9f863","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 25-95","gmt_create":"2026-04-23T15:20:09.003771+08:00","gmt_modified":"2026-04-23T15:20:09.003771+08:00"},{"id":199,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"309607c54b12a6340edc086ffb4737c9","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/workers/citation_engine.py#148-309","gmt_create":"2026-04-23T15:20:09.005186+08:00","gmt_modified":"2026-04-23T15:20:09.005186+08:00"},{"id":200,"source_id":"74040de652d5e57f548bb5c4adc3e1a0","target_id":"309607c54b12a6340edc086ffb4737c9","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 148-309","gmt_create":"2026-04-23T15:20:09.00622+08:00","gmt_modified":"2026-04-23T15:20:09.00622+08:00"},{"id":201,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"4fb8856be3a581fe8303d11b2284ca29","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/models/query.py#11-55","gmt_create":"2026-04-23T15:20:09.006997+08:00","gmt_modified":"2026-04-23T15:20:09.006997+08:00"},{"id":202,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"b84f46f058847733347974841f613688","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/models/query_task.py#11-39","gmt_create":"2026-04-23T15:20:09.007995+08:00","gmt_modified":"2026-04-23T15:20:09.007995+08:00"},{"id":203,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"fd541971cebf8a7c167d717f5c5d1ff6","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/models/citation_record.py#11-42","gmt_create":"2026-04-23T15:20:09.009222+08:00","gmt_modified":"2026-04-23T15:20:09.009222+08:00"},{"id":204,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"d7c319a04abbc6704da53107e07dd8e7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/services/query.py#12-130","gmt_create":"2026-04-23T15:20:09.010245+08:00","gmt_modified":"2026-04-23T15:20:09.010245+08:00"},{"id":205,"source_id":"88d22de3b2a7419868e8ae19130d860c","target_id":"d7c319a04abbc6704da53107e07dd8e7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 12-130","gmt_create":"2026-04-23T15:20:09.011044+08:00","gmt_modified":"2026-04-23T15:20:09.011044+08:00"},{"id":206,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"9bfc041fe426da2eb78353827e8d9163","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/database.py#1-29","gmt_create":"2026-04-23T15:20:09.012195+08:00","gmt_modified":"2026-04-23T15:20:09.012195+08:00"},{"id":207,"source_id":"b0c428683c8a3e6922d90ca0d8c2736d","target_id":"9bfc041fe426da2eb78353827e8d9163","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-29","gmt_create":"2026-04-23T15:20:09.01291+08:00","gmt_modified":"2026-04-23T15:20:09.012911+08:00"},{"id":208,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"ad67863041d9eea2b0fb542b5aa33aca","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/workers/platforms/base.py#4-18","gmt_create":"2026-04-23T15:20:09.013886+08:00","gmt_modified":"2026-04-23T15:20:09.013886+08:00"},{"id":209,"source_id":"a16cf42e9559523c4f96ca4c79f9488d","target_id":"ad67863041d9eea2b0fb542b5aa33aca","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 4-18","gmt_create":"2026-04-23T15:20:09.014746+08:00","gmt_modified":"2026-04-23T15:20:09.014746+08:00"},{"id":210,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"eecf9581dbaa0a515cf11514175e7ef9","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/workers/platforms/kimi.py#11-206","gmt_create":"2026-04-23T15:20:09.015594+08:00","gmt_modified":"2026-04-23T15:20:09.015594+08:00"},{"id":211,"source_id":"8f973791233c698b3e64a4fb28a93d4b","target_id":"eecf9581dbaa0a515cf11514175e7ef9","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 11-206","gmt_create":"2026-04-23T15:20:09.016313+08:00","gmt_modified":"2026-04-23T15:20:09.016313+08:00"},{"id":212,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"5563c29185326a59be61ee0a6eec4463","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/workers/platforms/wenxin.py#11-205","gmt_create":"2026-04-23T15:20:09.017693+08:00","gmt_modified":"2026-04-23T15:20:09.017693+08:00"},{"id":213,"source_id":"f642fc1c2f34e15572d9d98aa6c18813","target_id":"5563c29185326a59be61ee0a6eec4463","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 11-205","gmt_create":"2026-04-23T15:20:09.018896+08:00","gmt_modified":"2026-04-23T15:20:09.018896+08:00"},{"id":214,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"2d35e1345d25020f8e7ac1318db06f7b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/workers/scheduler.py#30-90","gmt_create":"2026-04-23T15:20:09.025147+08:00","gmt_modified":"2026-04-23T15:20:09.025147+08:00"},{"id":215,"source_id":"5cbb1e3f112aeba62a14b0b8999fc0f5","target_id":"2d35e1345d25020f8e7ac1318db06f7b","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 30-90","gmt_create":"2026-04-23T15:20:09.02579+08:00","gmt_modified":"2026-04-23T15:20:09.02579+08:00"},{"id":216,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"91bda120c0ab69e0e7103a1c89c82424","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/workers/scheduler.py#95-172","gmt_create":"2026-04-23T15:20:09.026853+08:00","gmt_modified":"2026-04-23T15:20:09.026853+08:00"},{"id":217,"source_id":"5cbb1e3f112aeba62a14b0b8999fc0f5","target_id":"91bda120c0ab69e0e7103a1c89c82424","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 95-172","gmt_create":"2026-04-23T15:20:09.027566+08:00","gmt_modified":"2026-04-23T15:20:09.027566+08:00"},{"id":218,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"160b5326537d25444c40a459a01e79c6","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/workers/citation_engine.py#159-234","gmt_create":"2026-04-23T15:20:09.028202+08:00","gmt_modified":"2026-04-23T15:20:09.028202+08:00"},{"id":219,"source_id":"74040de652d5e57f548bb5c4adc3e1a0","target_id":"160b5326537d25444c40a459a01e79c6","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 159-234","gmt_create":"2026-04-23T15:20:09.028744+08:00","gmt_modified":"2026-04-23T15:20:09.028744+08:00"},{"id":220,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"6712051c987e10a7c26b089063367398","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/models/query.py#24-31","gmt_create":"2026-04-23T15:20:09.029494+08:00","gmt_modified":"2026-04-23T15:20:09.029494+08:00"},{"id":221,"source_id":"b74caccb06844efcdb14d8324cff65c2","target_id":"6712051c987e10a7c26b089063367398","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 24-31","gmt_create":"2026-04-23T15:20:09.030084+08:00","gmt_modified":"2026-04-23T15:20:09.030084+08:00"},{"id":222,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"ac5982063da5f04315f3e82a0d653902","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/models/query_task.py#24-32","gmt_create":"2026-04-23T15:20:09.030828+08:00","gmt_modified":"2026-04-23T15:20:09.030828+08:00"},{"id":223,"source_id":"069738f21ac2da7349d22683e8c36929","target_id":"ac5982063da5f04315f3e82a0d653902","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 24-32","gmt_create":"2026-04-23T15:20:09.031632+08:00","gmt_modified":"2026-04-23T15:20:09.031632+08:00"},{"id":224,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"06ed912983db33bb8aca162fed68282b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/models/citation_record.py#24-29","gmt_create":"2026-04-23T15:20:09.032417+08:00","gmt_modified":"2026-04-23T15:20:09.032417+08:00"},{"id":225,"source_id":"b4a81ef789630d0af6a8d50859d01bf3","target_id":"06ed912983db33bb8aca162fed68282b","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 24-29","gmt_create":"2026-04-23T15:20:09.032976+08:00","gmt_modified":"2026-04-23T15:20:09.032976+08:00"},{"id":226,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"b624be78e3bffd876e403cff2557b088","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/workers/citation_engine.py#19-120","gmt_create":"2026-04-23T15:20:09.037331+08:00","gmt_modified":"2026-04-23T15:20:09.037331+08:00"},{"id":227,"source_id":"74040de652d5e57f548bb5c4adc3e1a0","target_id":"b624be78e3bffd876e403cff2557b088","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 19-120","gmt_create":"2026-04-23T15:20:09.038413+08:00","gmt_modified":"2026-04-23T15:20:09.038413+08:00"},{"id":228,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"40d0b169aad65c8bb38077deb052fc72","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/workers/platforms/kimi.py#33-125","gmt_create":"2026-04-23T15:20:09.040261+08:00","gmt_modified":"2026-04-23T15:20:09.040261+08:00"},{"id":229,"source_id":"8f973791233c698b3e64a4fb28a93d4b","target_id":"40d0b169aad65c8bb38077deb052fc72","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 33-125","gmt_create":"2026-04-23T15:20:09.04098+08:00","gmt_modified":"2026-04-23T15:20:09.04098+08:00"},{"id":230,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"8b5af998852596e1e08b0e0216bc4b93","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/workers/platforms/wenxin.py#33-124","gmt_create":"2026-04-23T15:20:09.041526+08:00","gmt_modified":"2026-04-23T15:20:09.041526+08:00"},{"id":231,"source_id":"f642fc1c2f34e15572d9d98aa6c18813","target_id":"8b5af998852596e1e08b0e0216bc4b93","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 33-124","gmt_create":"2026-04-23T15:20:09.041834+08:00","gmt_modified":"2026-04-23T15:20:09.041834+08:00"},{"id":232,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"fe70b1fef9f36e73d26d84987e927c7a","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/queries.py#15-86","gmt_create":"2026-04-23T15:20:09.04598+08:00","gmt_modified":"2026-04-23T15:20:09.04598+08:00"},{"id":233,"source_id":"6b3d903205941aa9391dd90016e1102c","target_id":"fe70b1fef9f36e73d26d84987e927c7a","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 15-86","gmt_create":"2026-04-23T15:20:09.046352+08:00","gmt_modified":"2026-04-23T15:20:09.046352+08:00"},{"id":234,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"e1d2b027678118df4d0a50ce9269271d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/workers/scheduler.py#42-90","gmt_create":"2026-04-23T15:20:09.050041+08:00","gmt_modified":"2026-04-23T15:20:09.050041+08:00"},{"id":235,"source_id":"5cbb1e3f112aeba62a14b0b8999fc0f5","target_id":"e1d2b027678118df4d0a50ce9269271d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 42-90","gmt_create":"2026-04-23T15:20:09.050351+08:00","gmt_modified":"2026-04-23T15:20:09.050351+08:00"},{"id":236,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"e79301a4bc26aa6b49f3f52c3182c3f9","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/workers/citation_engine.py#175-234","gmt_create":"2026-04-23T15:20:09.051815+08:00","gmt_modified":"2026-04-23T15:20:09.051815+08:00"},{"id":237,"source_id":"74040de652d5e57f548bb5c4adc3e1a0","target_id":"e79301a4bc26aa6b49f3f52c3182c3f9","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 175-234","gmt_create":"2026-04-23T15:20:09.052165+08:00","gmt_modified":"2026-04-23T15:20:09.052166+08:00"},{"id":238,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"1e85186eded8743ff5f231df4aa6df3f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/workers/platforms/kimi.py#21-48","gmt_create":"2026-04-23T15:20:09.052615+08:00","gmt_modified":"2026-04-23T15:20:09.052615+08:00"},{"id":239,"source_id":"8f973791233c698b3e64a4fb28a93d4b","target_id":"1e85186eded8743ff5f231df4aa6df3f","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 21-48","gmt_create":"2026-04-23T15:20:09.052947+08:00","gmt_modified":"2026-04-23T15:20:09.052947+08:00"},{"id":240,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"e2b1718570fb714b2f4342221898ab30","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/workers/platforms/wenxin.py#21-48","gmt_create":"2026-04-23T15:20:09.053449+08:00","gmt_modified":"2026-04-23T15:20:09.053449+08:00"},{"id":241,"source_id":"f642fc1c2f34e15572d9d98aa6c18813","target_id":"e2b1718570fb714b2f4342221898ab30","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 21-48","gmt_create":"2026-04-23T15:20:09.053892+08:00","gmt_modified":"2026-04-23T15:20:09.053892+08:00"},{"id":242,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"e4a49039dae40b7433896c81737fcf8c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/config.py#7-14","gmt_create":"2026-04-23T15:20:09.05437+08:00","gmt_modified":"2026-04-23T15:20:09.05437+08:00"},{"id":243,"source_id":"9ff19022ef915615911280e3c49ed44b","target_id":"e4a49039dae40b7433896c81737fcf8c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 7-14","gmt_create":"2026-04-23T15:20:09.054841+08:00","gmt_modified":"2026-04-23T15:20:09.054841+08:00"},{"id":244,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"2ee31d68c409e96e951f6cfa7027bca7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/main.py#24-42","gmt_create":"2026-04-23T15:20:09.055328+08:00","gmt_modified":"2026-04-23T15:20:09.055328+08:00"},{"id":245,"source_id":"9228ff67d4c757a85d9421b71f4b29f5","target_id":"2ee31d68c409e96e951f6cfa7027bca7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 24-42","gmt_create":"2026-04-23T15:20:09.055781+08:00","gmt_modified":"2026-04-23T15:20:09.055781+08:00"},{"id":246,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"79d6e169e36e6b7493898b5f863e07dc","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/workers/citation_engine.py#152-157","gmt_create":"2026-04-23T15:20:09.056898+08:00","gmt_modified":"2026-04-23T15:20:09.056898+08:00"},{"id":247,"source_id":"74040de652d5e57f548bb5c4adc3e1a0","target_id":"79d6e169e36e6b7493898b5f863e07dc","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 152-157","gmt_create":"2026-04-23T15:20:09.057188+08:00","gmt_modified":"2026-04-23T15:20:09.057188+08:00"},{"id":248,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"1552315d5fb9f6d7aba5f7e8fa93a975","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/database.py#6-10","gmt_create":"2026-04-23T15:20:09.058217+08:00","gmt_modified":"2026-04-23T15:20:09.058217+08:00"},{"id":249,"source_id":"b0c428683c8a3e6922d90ca0d8c2736d","target_id":"1552315d5fb9f6d7aba5f7e8fa93a975","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 6-10","gmt_create":"2026-04-23T15:20:09.058503+08:00","gmt_modified":"2026-04-23T15:20:09.058503+08:00"},{"id":250,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"599cca7536cae4a7e0ae93043c476a7f","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/test_queries.py#10-154","gmt_create":"2026-04-23T15:20:09.058947+08:00","gmt_modified":"2026-04-23T15:20:09.058947+08:00"},{"id":251,"source_id":"0613e76b9679be7f998fb8fd8056e686","target_id":"599cca7536cae4a7e0ae93043c476a7f","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 10-154","gmt_create":"2026-04-23T15:20:09.059242+08:00","gmt_modified":"2026-04-23T15:20:09.059242+08:00"},{"id":252,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"2ec3d45edd6221e0cedf7f8887fe090d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/test_scheduler.py#17-123","gmt_create":"2026-04-23T15:20:09.059776+08:00","gmt_modified":"2026-04-23T15:20:09.059776+08:00"},{"id":253,"source_id":"b2f0d46a31a5441594f2e777365fc156","target_id":"2ec3d45edd6221e0cedf7f8887fe090d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 17-123","gmt_create":"2026-04-23T15:20:09.060064+08:00","gmt_modified":"2026-04-23T15:20:09.060064+08:00"},{"id":254,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"99fe1b288fd41daa86c2dfbab819abf0","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/models/__init__.py","gmt_create":"2026-04-23T15:21:46.707277+08:00","gmt_modified":"2026-04-23T15:21:46.707277+08:00"},{"id":255,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"c59f8c276697a070dffc581fe94d809c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/models/user.py","gmt_create":"2026-04-23T15:21:46.707879+08:00","gmt_modified":"2026-04-23T15:21:46.707879+08:00"},{"id":256,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"b74caccb06844efcdb14d8324cff65c2","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/models/query.py","gmt_create":"2026-04-23T15:21:46.708322+08:00","gmt_modified":"2026-04-23T15:21:46.708322+08:00"},{"id":257,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"069738f21ac2da7349d22683e8c36929","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/models/query_task.py","gmt_create":"2026-04-23T15:21:46.708702+08:00","gmt_modified":"2026-04-23T15:21:46.708702+08:00"},{"id":258,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"b4a81ef789630d0af6a8d50859d01bf3","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/models/citation_record.py","gmt_create":"2026-04-23T15:21:46.709093+08:00","gmt_modified":"2026-04-23T15:21:46.709093+08:00"},{"id":259,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"bceca00463fe55d3bcafda728f97f723","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/models/subscription.py","gmt_create":"2026-04-23T15:21:46.709712+08:00","gmt_modified":"2026-04-23T15:21:46.709713+08:00"},{"id":260,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"b0c428683c8a3e6922d90ca0d8c2736d","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/database.py","gmt_create":"2026-04-23T15:21:46.710101+08:00","gmt_modified":"2026-04-23T15:21:46.710101+08:00"},{"id":261,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"d4f95fcf50683b5bf6167c7d2a6b126d","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/alembic/versions/488d0bd5ab01_initial_migration.py","gmt_create":"2026-04-23T15:21:46.710429+08:00","gmt_modified":"2026-04-23T15:21:46.710429+08:00"},{"id":262,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"f301b79d833233ce39d350e82a71c938","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/schemas/query.py","gmt_create":"2026-04-23T15:21:46.710829+08:00","gmt_modified":"2026-04-23T15:21:46.710829+08:00"},{"id":263,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"1a3336b4af8a39a055e912724338580c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/schemas/citation.py","gmt_create":"2026-04-23T15:21:46.711181+08:00","gmt_modified":"2026-04-23T15:21:46.711181+08:00"},{"id":264,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"88d22de3b2a7419868e8ae19130d860c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/services/query.py","gmt_create":"2026-04-23T15:21:46.711568+08:00","gmt_modified":"2026-04-23T15:21:46.711568+08:00"},{"id":265,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"6b3d903205941aa9391dd90016e1102c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/api/queries.py","gmt_create":"2026-04-23T15:21:46.711965+08:00","gmt_modified":"2026-04-23T15:21:46.711965+08:00"},{"id":266,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"04e3926c080e795713bff683e7dc9d3e","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/services/citation.py","gmt_create":"2026-04-23T15:21:46.712296+08:00","gmt_modified":"2026-04-23T15:21:46.712296+08:00"},{"id":267,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"7538ffe4902ab6041adb28b19844962a","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/api/citations.py","gmt_create":"2026-04-23T15:21:46.712792+08:00","gmt_modified":"2026-04-23T15:21:46.712792+08:00"},{"id":268,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"9ff19022ef915615911280e3c49ed44b","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/config.py","gmt_create":"2026-04-23T15:21:46.713121+08:00","gmt_modified":"2026-04-23T15:21:46.713121+08:00"},{"id":269,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"9d08667997a868fc07c9b4e328e44224","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/api/deps.py","gmt_create":"2026-04-23T15:21:46.713538+08:00","gmt_modified":"2026-04-23T15:21:46.713538+08:00"},{"id":270,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"56e46969bdb790a5e8f333184b878d6d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/models/user.py#11-41","gmt_create":"2026-04-23T15:21:46.71408+08:00","gmt_modified":"2026-04-23T15:21:46.71408+08:00"},{"id":271,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"4fb8856be3a581fe8303d11b2284ca29","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/models/query.py#11-55","gmt_create":"2026-04-23T15:21:46.714746+08:00","gmt_modified":"2026-04-23T15:21:46.714746+08:00"},{"id":272,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"b84f46f058847733347974841f613688","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/models/query_task.py#11-39","gmt_create":"2026-04-23T15:21:46.715399+08:00","gmt_modified":"2026-04-23T15:21:46.7154+08:00"},{"id":273,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"fd541971cebf8a7c167d717f5c5d1ff6","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/models/citation_record.py#11-42","gmt_create":"2026-04-23T15:21:46.716178+08:00","gmt_modified":"2026-04-23T15:21:46.716178+08:00"},{"id":274,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"4d323bf0aaf4078f09726dc0890e5955","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/models/subscription.py#11-37","gmt_create":"2026-04-23T15:21:46.717324+08:00","gmt_modified":"2026-04-23T15:21:46.717324+08:00"},{"id":275,"source_id":"bceca00463fe55d3bcafda728f97f723","target_id":"4d323bf0aaf4078f09726dc0890e5955","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 11-37","gmt_create":"2026-04-23T15:21:46.718049+08:00","gmt_modified":"2026-04-23T15:21:46.71805+08:00"},{"id":276,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"9bfc041fe426da2eb78353827e8d9163","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/database.py#1-29","gmt_create":"2026-04-23T15:21:46.718816+08:00","gmt_modified":"2026-04-23T15:21:46.718816+08:00"},{"id":277,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"4cef9e740b6feb68c6bd22b660c47320","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/services/query.py#1-123","gmt_create":"2026-04-23T15:21:46.719468+08:00","gmt_modified":"2026-04-23T15:21:46.719468+08:00"},{"id":278,"source_id":"88d22de3b2a7419868e8ae19130d860c","target_id":"4cef9e740b6feb68c6bd22b660c47320","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-123","gmt_create":"2026-04-23T15:21:46.720008+08:00","gmt_modified":"2026-04-23T15:21:46.720008+08:00"},{"id":279,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"121203f7f9f539ffb1456c3f5cdfd842","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/services/citation.py#1-359","gmt_create":"2026-04-23T15:21:46.720615+08:00","gmt_modified":"2026-04-23T15:21:46.720615+08:00"},{"id":280,"source_id":"04e3926c080e795713bff683e7dc9d3e","target_id":"121203f7f9f539ffb1456c3f5cdfd842","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-359","gmt_create":"2026-04-23T15:21:46.721095+08:00","gmt_modified":"2026-04-23T15:21:46.721095+08:00"},{"id":281,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"10d1e37bdc9f353c189b7a2fe79dc85e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/queries.py#1-86","gmt_create":"2026-04-23T15:21:46.721634+08:00","gmt_modified":"2026-04-23T15:21:46.721634+08:00"},{"id":282,"source_id":"6b3d903205941aa9391dd90016e1102c","target_id":"10d1e37bdc9f353c189b7a2fe79dc85e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-86","gmt_create":"2026-04-23T15:21:46.722019+08:00","gmt_modified":"2026-04-23T15:21:46.722019+08:00"},{"id":283,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"cbd0101fa84d957bcb1baaa623c6b31c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/citations.py#1-78","gmt_create":"2026-04-23T15:21:46.722621+08:00","gmt_modified":"2026-04-23T15:21:46.722621+08:00"},{"id":284,"source_id":"7538ffe4902ab6041adb28b19844962a","target_id":"cbd0101fa84d957bcb1baaa623c6b31c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-78","gmt_create":"2026-04-23T15:21:46.723064+08:00","gmt_modified":"2026-04-23T15:21:46.723064+08:00"},{"id":285,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"afe4138895492c26aac5c0120ef46cd8","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/models/__init__.py#1-14","gmt_create":"2026-04-23T15:21:46.72357+08:00","gmt_modified":"2026-04-23T15:21:46.72357+08:00"},{"id":286,"source_id":"99fe1b288fd41daa86c2dfbab819abf0","target_id":"afe4138895492c26aac5c0120ef46cd8","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-14","gmt_create":"2026-04-23T15:21:46.723873+08:00","gmt_modified":"2026-04-23T15:21:46.723873+08:00"},{"id":287,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"4d11ddf7abb8076d81b30c4315786f9a","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/alembic/versions/488d0bd5ab01_initial_migration.py#21-128","gmt_create":"2026-04-23T15:21:46.726415+08:00","gmt_modified":"2026-04-23T15:21:46.726416+08:00"},{"id":288,"source_id":"d4f95fcf50683b5bf6167c7d2a6b126d","target_id":"4d11ddf7abb8076d81b30c4315786f9a","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 21-128","gmt_create":"2026-04-23T15:21:46.726829+08:00","gmt_modified":"2026-04-23T15:21:46.726829+08:00"},{"id":289,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"e454b4a54500bd81e7599e6ec97bf12b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/alembic/versions/488d0bd5ab01_initial_migration.py#23-37","gmt_create":"2026-04-23T15:21:46.735019+08:00","gmt_modified":"2026-04-23T15:21:46.735019+08:00"},{"id":290,"source_id":"d4f95fcf50683b5bf6167c7d2a6b126d","target_id":"e454b4a54500bd81e7599e6ec97bf12b","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 23-37","gmt_create":"2026-04-23T15:21:46.735734+08:00","gmt_modified":"2026-04-23T15:21:46.735734+08:00"},{"id":291,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"1965adf7cfc65447e3c1ae21fbf6d1c5","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/alembic/versions/488d0bd5ab01_initial_migration.py#39-59","gmt_create":"2026-04-23T15:21:46.737007+08:00","gmt_modified":"2026-04-23T15:21:46.737007+08:00"},{"id":292,"source_id":"d4f95fcf50683b5bf6167c7d2a6b126d","target_id":"1965adf7cfc65447e3c1ae21fbf6d1c5","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 39-59","gmt_create":"2026-04-23T15:21:46.744358+08:00","gmt_modified":"2026-04-23T15:21:46.744358+08:00"},{"id":293,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"c730faefb34bb87c40c5f636b4ff7f41","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/alembic/versions/488d0bd5ab01_initial_migration.py#80-94","gmt_create":"2026-04-23T15:21:46.747533+08:00","gmt_modified":"2026-04-23T15:21:46.747534+08:00"},{"id":294,"source_id":"d4f95fcf50683b5bf6167c7d2a6b126d","target_id":"c730faefb34bb87c40c5f636b4ff7f41","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 80-94","gmt_create":"2026-04-23T15:21:46.748811+08:00","gmt_modified":"2026-04-23T15:21:46.748811+08:00"},{"id":295,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"b9978c3eccea3ef566b003216e5047af","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/alembic/versions/488d0bd5ab01_initial_migration.py#61-78","gmt_create":"2026-04-23T15:21:46.751629+08:00","gmt_modified":"2026-04-23T15:21:46.751629+08:00"},{"id":296,"source_id":"d4f95fcf50683b5bf6167c7d2a6b126d","target_id":"b9978c3eccea3ef566b003216e5047af","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 61-78","gmt_create":"2026-04-23T15:21:46.752497+08:00","gmt_modified":"2026-04-23T15:21:46.752497+08:00"},{"id":297,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"eb6ff4361d7413b57f1f70b1ec2f0c94","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/alembic/versions/488d0bd5ab01_initial_migration.py#96-111","gmt_create":"2026-04-23T15:21:46.753732+08:00","gmt_modified":"2026-04-23T15:21:46.753732+08:00"},{"id":298,"source_id":"d4f95fcf50683b5bf6167c7d2a6b126d","target_id":"eb6ff4361d7413b57f1f70b1ec2f0c94","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 96-111","gmt_create":"2026-04-23T15:21:46.754523+08:00","gmt_modified":"2026-04-23T15:21:46.754523+08:00"},{"id":299,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"1a2657244414b5681afded9565a86422","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/models/user.py#35-40","gmt_create":"2026-04-23T15:21:46.755683+08:00","gmt_modified":"2026-04-23T15:21:46.755683+08:00"},{"id":300,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"acd5a29be2bdd4ae251e10ca266ffe13","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/models/query.py#43-48","gmt_create":"2026-04-23T15:21:46.756979+08:00","gmt_modified":"2026-04-23T15:21:46.756979+08:00"},{"id":301,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"f6c9f1b4e8646c366a31426a4537675d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/models/query_task.py#36-38","gmt_create":"2026-04-23T15:21:46.75809+08:00","gmt_modified":"2026-04-23T15:21:46.75809+08:00"},{"id":302,"source_id":"069738f21ac2da7349d22683e8c36929","target_id":"f6c9f1b4e8646c366a31426a4537675d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 36-38","gmt_create":"2026-04-23T15:21:46.759234+08:00","gmt_modified":"2026-04-23T15:21:46.759234+08:00"},{"id":303,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"a2adbf02c71e4eb2cf1f120e1a2ff517","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/models/citation_record.py#37-41","gmt_create":"2026-04-23T15:21:46.760054+08:00","gmt_modified":"2026-04-23T15:21:46.760054+08:00"},{"id":304,"source_id":"b4a81ef789630d0af6a8d50859d01bf3","target_id":"a2adbf02c71e4eb2cf1f120e1a2ff517","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 37-41","gmt_create":"2026-04-23T15:21:46.761257+08:00","gmt_modified":"2026-04-23T15:21:46.761257+08:00"},{"id":305,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"69118807690ef351a9de910414d5e676","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/schemas/query.py#11-94","gmt_create":"2026-04-23T15:21:46.76204+08:00","gmt_modified":"2026-04-23T15:21:46.762041+08:00"},{"id":306,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"26288877e8e1f6c4ff5aca12610b0218","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/schemas/citation.py#7-50","gmt_create":"2026-04-23T15:21:46.763512+08:00","gmt_modified":"2026-04-23T15:21:46.763512+08:00"},{"id":307,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"0907fc2974ec31c23aaaef02076700a1","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/models/user.py#25-33","gmt_create":"2026-04-23T15:21:46.764956+08:00","gmt_modified":"2026-04-23T15:21:46.764956+08:00"},{"id":308,"source_id":"c59f8c276697a070dffc581fe94d809c","target_id":"0907fc2974ec31c23aaaef02076700a1","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 25-33","gmt_create":"2026-04-23T15:21:46.766604+08:00","gmt_modified":"2026-04-23T15:21:46.766605+08:00"},{"id":309,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"842f74e2cc054608242e93fbefd96b45","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/models/query.py#32-40","gmt_create":"2026-04-23T15:21:46.767787+08:00","gmt_modified":"2026-04-23T15:21:46.767787+08:00"},{"id":310,"source_id":"b74caccb06844efcdb14d8324cff65c2","target_id":"842f74e2cc054608242e93fbefd96b45","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 32-40","gmt_create":"2026-04-23T15:21:46.769407+08:00","gmt_modified":"2026-04-23T15:21:46.769407+08:00"},{"id":311,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"aed9e839038c45e6ce2023c4e05adb76","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/models/query_task.py#27-32","gmt_create":"2026-04-23T15:21:46.770612+08:00","gmt_modified":"2026-04-23T15:21:46.770612+08:00"},{"id":312,"source_id":"069738f21ac2da7349d22683e8c36929","target_id":"aed9e839038c45e6ce2023c4e05adb76","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 27-32","gmt_create":"2026-04-23T15:21:46.771344+08:00","gmt_modified":"2026-04-23T15:21:46.771345+08:00"},{"id":313,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"2181318c993526c86458f5eef134aed6","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/services/query.py#62-77","gmt_create":"2026-04-23T15:21:46.77237+08:00","gmt_modified":"2026-04-23T15:21:46.77237+08:00"},{"id":314,"source_id":"88d22de3b2a7419868e8ae19130d860c","target_id":"2181318c993526c86458f5eef134aed6","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 62-77","gmt_create":"2026-04-23T15:21:46.773284+08:00","gmt_modified":"2026-04-23T15:21:46.773284+08:00"},{"id":315,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"a817488dc968d761a8977fb5bb8d01a2","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/services/query.py#45-129","gmt_create":"2026-04-23T15:21:46.774203+08:00","gmt_modified":"2026-04-23T15:21:46.774203+08:00"},{"id":316,"source_id":"88d22de3b2a7419868e8ae19130d860c","target_id":"a817488dc968d761a8977fb5bb8d01a2","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 45-129","gmt_create":"2026-04-23T15:21:46.775081+08:00","gmt_modified":"2026-04-23T15:21:46.775081+08:00"},{"id":317,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"fe70b1fef9f36e73d26d84987e927c7a","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/queries.py#15-86","gmt_create":"2026-04-23T15:21:46.775898+08:00","gmt_modified":"2026-04-23T15:21:46.775898+08:00"},{"id":318,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"d20fc729a5d3986b1c077f9e07ece9c4","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/config.py#7","gmt_create":"2026-04-23T15:21:46.777494+08:00","gmt_modified":"2026-04-23T15:21:46.777494+08:00"},{"id":319,"source_id":"9ff19022ef915615911280e3c49ed44b","target_id":"d20fc729a5d3986b1c077f9e07ece9c4","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 7","gmt_create":"2026-04-23T15:21:46.778103+08:00","gmt_modified":"2026-04-23T15:21:46.778103+08:00"},{"id":320,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"ea655c6d147bc98beb42955d437260cc","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/config.py#1-23","gmt_create":"2026-04-23T15:21:46.779313+08:00","gmt_modified":"2026-04-23T15:21:46.779314+08:00"},{"id":321,"source_id":"9ff19022ef915615911280e3c49ed44b","target_id":"ea655c6d147bc98beb42955d437260cc","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-23","gmt_create":"2026-04-23T15:21:46.780075+08:00","gmt_modified":"2026-04-23T15:21:46.780075+08:00"},{"id":322,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"37868a5af96edcdad149caf9a184435a","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/queries.py#42-85","gmt_create":"2026-04-23T15:21:46.781141+08:00","gmt_modified":"2026-04-23T15:21:46.781141+08:00"},{"id":323,"source_id":"6b3d903205941aa9391dd90016e1102c","target_id":"37868a5af96edcdad149caf9a184435a","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 42-85","gmt_create":"2026-04-23T15:21:46.781803+08:00","gmt_modified":"2026-04-23T15:21:46.781803+08:00"},{"id":324,"source_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","target_id":"601b981b00d93b941843f046a163d5a3","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/schemas/query.py#18-33","gmt_create":"2026-04-23T15:21:46.783498+08:00","gmt_modified":"2026-04-23T15:21:46.783498+08:00"},{"id":325,"source_id":"f301b79d833233ce39d350e82a71c938","target_id":"601b981b00d93b941843f046a163d5a3","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 18-33","gmt_create":"2026-04-23T15:21:46.784342+08:00","gmt_modified":"2026-04-23T15:21:46.784343+08:00"},{"id":326,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"0ef1efea889dba3e1f299626df479571","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: tests/conftest.py","gmt_create":"2026-04-23T15:22:16.010116+08:00","gmt_modified":"2026-04-23T15:22:16.010116+08:00"},{"id":327,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"389d631bc6c7111ba411b0b79fca455e","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: tests/test_auth.py","gmt_create":"2026-04-23T15:22:16.010568+08:00","gmt_modified":"2026-04-23T15:22:16.010568+08:00"},{"id":328,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"80a0429cc47931de27ddb17a62b8dd9c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: tests/test_business_flow.py","gmt_create":"2026-04-23T15:22:16.010916+08:00","gmt_modified":"2026-04-23T15:22:16.010916+08:00"},{"id":329,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"b07a4fb9cecbbd66a6910ccbc7651f19","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: tests/test_citation_engine.py","gmt_create":"2026-04-23T15:22:16.011244+08:00","gmt_modified":"2026-04-23T15:22:16.011244+08:00"},{"id":330,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"42ff5383133d176cec9eb88682483be3","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: tests/test_citations.py","gmt_create":"2026-04-23T15:22:16.011658+08:00","gmt_modified":"2026-04-23T15:22:16.011658+08:00"},{"id":331,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"0613e76b9679be7f998fb8fd8056e686","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: tests/test_queries.py","gmt_create":"2026-04-23T15:22:16.01198+08:00","gmt_modified":"2026-04-23T15:22:16.01198+08:00"},{"id":332,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"b2f0d46a31a5441594f2e777365fc156","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: tests/test_scheduler.py","gmt_create":"2026-04-23T15:22:16.012353+08:00","gmt_modified":"2026-04-23T15:22:16.012353+08:00"},{"id":333,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"9228ff67d4c757a85d9421b71f4b29f5","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/main.py","gmt_create":"2026-04-23T15:22:16.012683+08:00","gmt_modified":"2026-04-23T15:22:16.012683+08:00"},{"id":334,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"9d08667997a868fc07c9b4e328e44224","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/api/deps.py","gmt_create":"2026-04-23T15:22:16.013025+08:00","gmt_modified":"2026-04-23T15:22:16.013025+08:00"},{"id":335,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"4d2f3847b7c10634733118b70a1aea0b","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/services/auth.py","gmt_create":"2026-04-23T15:22:16.013366+08:00","gmt_modified":"2026-04-23T15:22:16.013366+08:00"},{"id":336,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"74040de652d5e57f548bb5c4adc3e1a0","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/workers/citation_engine.py","gmt_create":"2026-04-23T15:22:16.013707+08:00","gmt_modified":"2026-04-23T15:22:16.013707+08:00"},{"id":337,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"5cbb1e3f112aeba62a14b0b8999fc0f5","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/workers/scheduler.py","gmt_create":"2026-04-23T15:22:16.014055+08:00","gmt_modified":"2026-04-23T15:22:16.014055+08:00"},{"id":338,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"93022c8938ce318f167277cfa65c29a7","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/api/auth.py","gmt_create":"2026-04-23T15:22:16.014367+08:00","gmt_modified":"2026-04-23T15:22:16.014367+08:00"},{"id":339,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"7538ffe4902ab6041adb28b19844962a","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/api/citations.py","gmt_create":"2026-04-23T15:22:16.014846+08:00","gmt_modified":"2026-04-23T15:22:16.014847+08:00"},{"id":340,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"6b3d903205941aa9391dd90016e1102c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/api/queries.py","gmt_create":"2026-04-23T15:22:16.015294+08:00","gmt_modified":"2026-04-23T15:22:16.015294+08:00"},{"id":341,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"b0c428683c8a3e6922d90ca0d8c2736d","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/database.py","gmt_create":"2026-04-23T15:22:16.015703+08:00","gmt_modified":"2026-04-23T15:22:16.015703+08:00"},{"id":342,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"9ff19022ef915615911280e3c49ed44b","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: backend/app/config.py","gmt_create":"2026-04-23T15:22:16.016102+08:00","gmt_modified":"2026-04-23T15:22:16.016102+08:00"},{"id":343,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"290df8332b3d104e5ea8d71dc39315b5","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/conftest.py#1-123","gmt_create":"2026-04-23T15:22:16.016716+08:00","gmt_modified":"2026-04-23T15:22:16.016716+08:00"},{"id":344,"source_id":"0ef1efea889dba3e1f299626df479571","target_id":"290df8332b3d104e5ea8d71dc39315b5","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-123","gmt_create":"2026-04-23T15:22:16.017503+08:00","gmt_modified":"2026-04-23T15:22:16.017503+08:00"},{"id":345,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"c2747ca16b879bca0f68955534c3c4fc","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/main.py#1-48","gmt_create":"2026-04-23T15:22:16.018574+08:00","gmt_modified":"2026-04-23T15:22:16.018574+08:00"},{"id":346,"source_id":"9228ff67d4c757a85d9421b71f4b29f5","target_id":"c2747ca16b879bca0f68955534c3c4fc","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-48","gmt_create":"2026-04-23T15:22:16.019099+08:00","gmt_modified":"2026-04-23T15:22:16.019099+08:00"},{"id":347,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"76e6c0abb49fec57cac4892837a143c9","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/deps.py#1-43","gmt_create":"2026-04-23T15:22:16.019894+08:00","gmt_modified":"2026-04-23T15:22:16.019894+08:00"},{"id":348,"source_id":"9d08667997a868fc07c9b4e328e44224","target_id":"76e6c0abb49fec57cac4892837a143c9","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-43","gmt_create":"2026-04-23T15:22:16.020577+08:00","gmt_modified":"2026-04-23T15:22:16.020577+08:00"},{"id":349,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"f66d9907b467b110c638bd527efd95c5","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/auth.py#1-43","gmt_create":"2026-04-23T15:22:16.021276+08:00","gmt_modified":"2026-04-23T15:22:16.021276+08:00"},{"id":350,"source_id":"93022c8938ce318f167277cfa65c29a7","target_id":"f66d9907b467b110c638bd527efd95c5","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-43","gmt_create":"2026-04-23T15:22:16.021841+08:00","gmt_modified":"2026-04-23T15:22:16.021841+08:00"},{"id":351,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"10d1e37bdc9f353c189b7a2fe79dc85e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/queries.py#1-86","gmt_create":"2026-04-23T15:22:16.022305+08:00","gmt_modified":"2026-04-23T15:22:16.022305+08:00"},{"id":352,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"cbd0101fa84d957bcb1baaa623c6b31c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/citations.py#1-78","gmt_create":"2026-04-23T15:22:16.022933+08:00","gmt_modified":"2026-04-23T15:22:16.022933+08:00"},{"id":353,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"116584ea9162c1bc05911f39f9ef82b6","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/workers/citation_engine.py#1-309","gmt_create":"2026-04-23T15:22:16.023491+08:00","gmt_modified":"2026-04-23T15:22:16.023491+08:00"},{"id":354,"source_id":"74040de652d5e57f548bb5c4adc3e1a0","target_id":"116584ea9162c1bc05911f39f9ef82b6","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-309","gmt_create":"2026-04-23T15:22:16.023827+08:00","gmt_modified":"2026-04-23T15:22:16.023827+08:00"},{"id":355,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"9630036e63fc15cb81b202cf79671aab","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/workers/scheduler.py#1-182","gmt_create":"2026-04-23T15:22:16.024296+08:00","gmt_modified":"2026-04-23T15:22:16.024296+08:00"},{"id":356,"source_id":"5cbb1e3f112aeba62a14b0b8999fc0f5","target_id":"9630036e63fc15cb81b202cf79671aab","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-182","gmt_create":"2026-04-23T15:22:16.024606+08:00","gmt_modified":"2026-04-23T15:22:16.024606+08:00"},{"id":357,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"9bfc041fe426da2eb78353827e8d9163","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/database.py#1-29","gmt_create":"2026-04-23T15:22:16.025063+08:00","gmt_modified":"2026-04-23T15:22:16.025063+08:00"},{"id":358,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"84fbed7d35f7752e2117a74fcaf5f0e9","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/config.py#1-17","gmt_create":"2026-04-23T15:22:16.02571+08:00","gmt_modified":"2026-04-23T15:22:16.02571+08:00"},{"id":359,"source_id":"9ff19022ef915615911280e3c49ed44b","target_id":"84fbed7d35f7752e2117a74fcaf5f0e9","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-17","gmt_create":"2026-04-23T15:22:16.026089+08:00","gmt_modified":"2026-04-23T15:22:16.02609+08:00"},{"id":360,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"5ddf0c8d7b38e4f6126a5d85da1dfeda","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/conftest.py#19-123","gmt_create":"2026-04-23T15:22:16.027421+08:00","gmt_modified":"2026-04-23T15:22:16.027421+08:00"},{"id":361,"source_id":"0ef1efea889dba3e1f299626df479571","target_id":"5ddf0c8d7b38e4f6126a5d85da1dfeda","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 19-123","gmt_create":"2026-04-23T15:22:16.02774+08:00","gmt_modified":"2026-04-23T15:22:16.02774+08:00"},{"id":362,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"9df233ef1be4b95068ed91bf01083ae7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/conftest.py#117-123","gmt_create":"2026-04-23T15:22:16.028177+08:00","gmt_modified":"2026-04-23T15:22:16.028177+08:00"},{"id":363,"source_id":"0ef1efea889dba3e1f299626df479571","target_id":"9df233ef1be4b95068ed91bf01083ae7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 117-123","gmt_create":"2026-04-23T15:22:16.028504+08:00","gmt_modified":"2026-04-23T15:22:16.028504+08:00"},{"id":364,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"6286d4be455dc058c8be2ee4e0d1175a","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/main.py#38-42","gmt_create":"2026-04-23T15:22:16.029042+08:00","gmt_modified":"2026-04-23T15:22:16.029042+08:00"},{"id":365,"source_id":"9228ff67d4c757a85d9421b71f4b29f5","target_id":"6286d4be455dc058c8be2ee4e0d1175a","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 38-42","gmt_create":"2026-04-23T15:22:16.029449+08:00","gmt_modified":"2026-04-23T15:22:16.029449+08:00"},{"id":366,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"069243fafe60a85cf16a0ca40fa07180","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/deps.py#16-43","gmt_create":"2026-04-23T15:22:16.030077+08:00","gmt_modified":"2026-04-23T15:22:16.030077+08:00"},{"id":367,"source_id":"9d08667997a868fc07c9b4e328e44224","target_id":"069243fafe60a85cf16a0ca40fa07180","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 16-43","gmt_create":"2026-04-23T15:22:16.030648+08:00","gmt_modified":"2026-04-23T15:22:16.030648+08:00"},{"id":368,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"d5a1fb0bd23ce9240fbf79529ef94a45","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/auth.py#13-43","gmt_create":"2026-04-23T15:22:16.031255+08:00","gmt_modified":"2026-04-23T15:22:16.031255+08:00"},{"id":369,"source_id":"93022c8938ce318f167277cfa65c29a7","target_id":"d5a1fb0bd23ce9240fbf79529ef94a45","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 13-43","gmt_create":"2026-04-23T15:22:16.03168+08:00","gmt_modified":"2026-04-23T15:22:16.03168+08:00"},{"id":370,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"fe70b1fef9f36e73d26d84987e927c7a","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/queries.py#15-86","gmt_create":"2026-04-23T15:22:16.032106+08:00","gmt_modified":"2026-04-23T15:22:16.032106+08:00"},{"id":371,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"735aef72b4fe6ca4f407e69b7dda8b43","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/api/citations.py#25-78","gmt_create":"2026-04-23T15:22:16.032649+08:00","gmt_modified":"2026-04-23T15:22:16.03265+08:00"},{"id":372,"source_id":"7538ffe4902ab6041adb28b19844962a","target_id":"735aef72b4fe6ca4f407e69b7dda8b43","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 25-78","gmt_create":"2026-04-23T15:22:16.03298+08:00","gmt_modified":"2026-04-23T15:22:16.03298+08:00"},{"id":373,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"8128dd67cf376d2cadf7c2d3831c380a","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/database.py#23-29","gmt_create":"2026-04-23T15:22:16.034473+08:00","gmt_modified":"2026-04-23T15:22:16.034473+08:00"},{"id":374,"source_id":"b0c428683c8a3e6922d90ca0d8c2736d","target_id":"8128dd67cf376d2cadf7c2d3831c380a","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 23-29","gmt_create":"2026-04-23T15:22:16.035564+08:00","gmt_modified":"2026-04-23T15:22:16.035564+08:00"},{"id":375,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"1721defc3d6206478d3c0692cc821761","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/test_auth.py#25-104","gmt_create":"2026-04-23T15:22:16.036325+08:00","gmt_modified":"2026-04-23T15:22:16.036325+08:00"},{"id":376,"source_id":"389d631bc6c7111ba411b0b79fca455e","target_id":"1721defc3d6206478d3c0692cc821761","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 25-104","gmt_create":"2026-04-23T15:22:16.036753+08:00","gmt_modified":"2026-04-23T15:22:16.036753+08:00"},{"id":377,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"753a437d837246ead62b0e16c6331284","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/services/auth.py#37-69","gmt_create":"2026-04-23T15:22:16.037909+08:00","gmt_modified":"2026-04-23T15:22:16.037909+08:00"},{"id":378,"source_id":"4d2f3847b7c10634733118b70a1aea0b","target_id":"753a437d837246ead62b0e16c6331284","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 37-69","gmt_create":"2026-04-23T15:22:16.038261+08:00","gmt_modified":"2026-04-23T15:22:16.038261+08:00"},{"id":379,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"d820e2daf2ea133a7aa17cdc475e44a4","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/test_auth.py#1-104","gmt_create":"2026-04-23T15:22:16.039047+08:00","gmt_modified":"2026-04-23T15:22:16.039047+08:00"},{"id":380,"source_id":"389d631bc6c7111ba411b0b79fca455e","target_id":"d820e2daf2ea133a7aa17cdc475e44a4","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-104","gmt_create":"2026-04-23T15:22:16.039369+08:00","gmt_modified":"2026-04-23T15:22:16.039369+08:00"},{"id":381,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"1a439c5fed6cfd188c646e1614d56371","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/services/auth.py#1-69","gmt_create":"2026-04-23T15:22:16.040181+08:00","gmt_modified":"2026-04-23T15:22:16.040181+08:00"},{"id":382,"source_id":"4d2f3847b7c10634733118b70a1aea0b","target_id":"1a439c5fed6cfd188c646e1614d56371","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-69","gmt_create":"2026-04-23T15:22:16.040483+08:00","gmt_modified":"2026-04-23T15:22:16.040483+08:00"},{"id":383,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"b624be78e3bffd876e403cff2557b088","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/workers/citation_engine.py#19-120","gmt_create":"2026-04-23T15:22:16.041373+08:00","gmt_modified":"2026-04-23T15:22:16.041373+08:00"},{"id":384,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"5c67e2f70283956b2d29a3c1443eb514","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/workers/citation_engine.py#122-146","gmt_create":"2026-04-23T15:22:16.042316+08:00","gmt_modified":"2026-04-23T15:22:16.042317+08:00"},{"id":385,"source_id":"74040de652d5e57f548bb5c4adc3e1a0","target_id":"5c67e2f70283956b2d29a3c1443eb514","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 122-146","gmt_create":"2026-04-23T15:22:16.042829+08:00","gmt_modified":"2026-04-23T15:22:16.042829+08:00"},{"id":386,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"309607c54b12a6340edc086ffb4737c9","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/workers/citation_engine.py#148-309","gmt_create":"2026-04-23T15:22:16.043937+08:00","gmt_modified":"2026-04-23T15:22:16.043937+08:00"},{"id":387,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"a57acd9da5287c915ac823784a409292","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/test_citation_engine.py#1-127","gmt_create":"2026-04-23T15:22:16.044785+08:00","gmt_modified":"2026-04-23T15:22:16.044785+08:00"},{"id":388,"source_id":"b07a4fb9cecbbd66a6910ccbc7651f19","target_id":"a57acd9da5287c915ac823784a409292","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-127","gmt_create":"2026-04-23T15:22:16.045132+08:00","gmt_modified":"2026-04-23T15:22:16.045132+08:00"},{"id":389,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"2a4f741f31f62dce8ad63be2e831f520","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/test_citations.py#23-93","gmt_create":"2026-04-23T15:22:16.045993+08:00","gmt_modified":"2026-04-23T15:22:16.045993+08:00"},{"id":390,"source_id":"42ff5383133d176cec9eb88682483be3","target_id":"2a4f741f31f62dce8ad63be2e831f520","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 23-93","gmt_create":"2026-04-23T15:22:16.046367+08:00","gmt_modified":"2026-04-23T15:22:16.046367+08:00"},{"id":391,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"692ac240965eff7e66945aa3c4c270f7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/test_citations.py#1-93","gmt_create":"2026-04-23T15:22:16.047504+08:00","gmt_modified":"2026-04-23T15:22:16.047504+08:00"},{"id":392,"source_id":"42ff5383133d176cec9eb88682483be3","target_id":"692ac240965eff7e66945aa3c4c270f7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-93","gmt_create":"2026-04-23T15:22:16.047995+08:00","gmt_modified":"2026-04-23T15:22:16.047995+08:00"},{"id":393,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"32a0a52faca2d8d488e49c63c86075b1","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/test_queries.py#29-154","gmt_create":"2026-04-23T15:22:16.048856+08:00","gmt_modified":"2026-04-23T15:22:16.048856+08:00"},{"id":394,"source_id":"0613e76b9679be7f998fb8fd8056e686","target_id":"32a0a52faca2d8d488e49c63c86075b1","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 29-154","gmt_create":"2026-04-23T15:22:16.049251+08:00","gmt_modified":"2026-04-23T15:22:16.049251+08:00"},{"id":395,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"7804331f5f8c1ba5a3b6d9c1ae1c78c1","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/test_queries.py#1-154","gmt_create":"2026-04-23T15:22:16.051275+08:00","gmt_modified":"2026-04-23T15:22:16.051275+08:00"},{"id":396,"source_id":"0613e76b9679be7f998fb8fd8056e686","target_id":"7804331f5f8c1ba5a3b6d9c1ae1c78c1","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-154","gmt_create":"2026-04-23T15:22:16.051952+08:00","gmt_modified":"2026-04-23T15:22:16.051952+08:00"},{"id":397,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"3a6e1b738967bf8cc651e57f48e2e126","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/test_business_flow.py#83-126","gmt_create":"2026-04-23T15:22:16.053307+08:00","gmt_modified":"2026-04-23T15:22:16.053307+08:00"},{"id":398,"source_id":"80a0429cc47931de27ddb17a62b8dd9c","target_id":"3a6e1b738967bf8cc651e57f48e2e126","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 83-126","gmt_create":"2026-04-23T15:22:16.053692+08:00","gmt_modified":"2026-04-23T15:22:16.053693+08:00"},{"id":399,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"b1afd377757f1d0e9bdf87edfff3ad88","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/test_business_flow.py#131-186","gmt_create":"2026-04-23T15:22:16.054222+08:00","gmt_modified":"2026-04-23T15:22:16.054222+08:00"},{"id":400,"source_id":"80a0429cc47931de27ddb17a62b8dd9c","target_id":"b1afd377757f1d0e9bdf87edfff3ad88","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 131-186","gmt_create":"2026-04-23T15:22:16.054533+08:00","gmt_modified":"2026-04-23T15:22:16.054533+08:00"},{"id":401,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"de05ec7eed033e432991e5a88e1b5a06","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/test_business_flow.py#192-222","gmt_create":"2026-04-23T15:22:16.055028+08:00","gmt_modified":"2026-04-23T15:22:16.055028+08:00"},{"id":402,"source_id":"80a0429cc47931de27ddb17a62b8dd9c","target_id":"de05ec7eed033e432991e5a88e1b5a06","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 192-222","gmt_create":"2026-04-23T15:22:16.055495+08:00","gmt_modified":"2026-04-23T15:22:16.055495+08:00"},{"id":403,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"7fd61a451248b6b129299d6246f711c7","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/test_business_flow.py#228-296","gmt_create":"2026-04-23T15:22:16.055985+08:00","gmt_modified":"2026-04-23T15:22:16.055985+08:00"},{"id":404,"source_id":"80a0429cc47931de27ddb17a62b8dd9c","target_id":"7fd61a451248b6b129299d6246f711c7","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 228-296","gmt_create":"2026-04-23T15:22:16.056294+08:00","gmt_modified":"2026-04-23T15:22:16.056294+08:00"},{"id":405,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"53eedffff456a566fa7b0cecc7169f56","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/test_business_flow.py#1-441","gmt_create":"2026-04-23T15:22:16.056723+08:00","gmt_modified":"2026-04-23T15:22:16.056723+08:00"},{"id":406,"source_id":"80a0429cc47931de27ddb17a62b8dd9c","target_id":"53eedffff456a566fa7b0cecc7169f56","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-441","gmt_create":"2026-04-23T15:22:16.05703+08:00","gmt_modified":"2026-04-23T15:22:16.05703+08:00"},{"id":407,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"906f7a8288e38d4244211f3f538fe7b6","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: backend/app/workers/scheduler.py#27-182","gmt_create":"2026-04-23T15:22:16.061306+08:00","gmt_modified":"2026-04-23T15:22:16.061306+08:00"},{"id":408,"source_id":"5cbb1e3f112aeba62a14b0b8999fc0f5","target_id":"906f7a8288e38d4244211f3f538fe7b6","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 27-182","gmt_create":"2026-04-23T15:22:16.062545+08:00","gmt_modified":"2026-04-23T15:22:16.062545+08:00"},{"id":409,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"1647ee2066de2ae59ba8cf88e33c5e02","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: tests/test_scheduler.py#1-123","gmt_create":"2026-04-23T15:22:16.06371+08:00","gmt_modified":"2026-04-23T15:22:16.06371+08:00"},{"id":410,"source_id":"b2f0d46a31a5441594f2e777365fc156","target_id":"1647ee2066de2ae59ba8cf88e33c5e02","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-123","gmt_create":"2026-04-23T15:22:16.064587+08:00","gmt_modified":"2026-04-23T15:22:16.064587+08:00"},{"id":411,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"aaf5bce6be82d2f947bfa5c1806de452","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/package.json","gmt_create":"2026-04-23T15:22:23.52554+08:00","gmt_modified":"2026-04-23T15:22:23.52554+08:00"},{"id":412,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"01056dad8851d3e9bd532eb4cab33792","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/tailwind.config.ts","gmt_create":"2026-04-23T15:22:23.52643+08:00","gmt_modified":"2026-04-23T15:22:23.526431+08:00"},{"id":413,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"f93ae024fe0a2e69698037dff6df205f","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/lib/utils.ts","gmt_create":"2026-04-23T15:22:23.527272+08:00","gmt_modified":"2026-04-23T15:22:23.527272+08:00"},{"id":414,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"ac1acbc54c49ee1de13369f6c6827568","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/components/ui/button.tsx","gmt_create":"2026-04-23T15:22:23.528155+08:00","gmt_modified":"2026-04-23T15:22:23.528155+08:00"},{"id":415,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"108b0c4b4dcfb6aa39a5eb138225c148","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/components/ui/dialog.tsx","gmt_create":"2026-04-23T15:22:23.529196+08:00","gmt_modified":"2026-04-23T15:22:23.529196+08:00"},{"id":416,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"0186dc8a89340139a84e1e3c5571a57f","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/components/ui/dropdown-menu.tsx","gmt_create":"2026-04-23T15:22:23.530077+08:00","gmt_modified":"2026-04-23T15:22:23.530077+08:00"},{"id":417,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"3cf787fa77a15b2b1783560c6d83ed21","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/components/ui/input.tsx","gmt_create":"2026-04-23T15:22:23.530977+08:00","gmt_modified":"2026-04-23T15:22:23.530977+08:00"},{"id":418,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"3c56e1c079959bfcc985183805e5874f","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/components/ui/select.tsx","gmt_create":"2026-04-23T15:22:23.531664+08:00","gmt_modified":"2026-04-23T15:22:23.531664+08:00"},{"id":419,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"0d5ef537f7c0b8c390f8b31d7cf47b56","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/components/ui/card.tsx","gmt_create":"2026-04-23T15:22:23.532588+08:00","gmt_modified":"2026-04-23T15:22:23.532588+08:00"},{"id":420,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"51821ca9ec2a1c972f3c9d111e19db8a","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/components/ui/badge.tsx","gmt_create":"2026-04-23T15:22:23.53409+08:00","gmt_modified":"2026-04-23T15:22:23.53409+08:00"},{"id":421,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"0c0b0f4e2cf44facd9d5b57de0d0bf0c","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/components/ui/table.tsx","gmt_create":"2026-04-23T15:22:23.535512+08:00","gmt_modified":"2026-04-23T15:22:23.535512+08:00"},{"id":422,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"beb87ab5aad9532647e9dbd2db7ef587","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/components/ui/tabs.tsx","gmt_create":"2026-04-23T15:22:23.536664+08:00","gmt_modified":"2026-04-23T15:22:23.536665+08:00"},{"id":423,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"792b8e2c16c9ff2095d83b8972313be4","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/components/ui/label.tsx","gmt_create":"2026-04-23T15:22:23.537365+08:00","gmt_modified":"2026-04-23T15:22:23.537365+08:00"},{"id":424,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"546e01c5f73aaf5140eee922f4b9a441","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/components/providers.tsx","gmt_create":"2026-04-23T15:22:23.538246+08:00","gmt_modified":"2026-04-23T15:22:23.538246+08:00"},{"id":425,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"12e2c3d7b9a92dc44a6ee29b85e10df6","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/app/layout.tsx","gmt_create":"2026-04-23T15:22:23.53929+08:00","gmt_modified":"2026-04-23T15:22:23.53929+08:00"},{"id":426,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"2a1c745c7b3fb7f600596be3d979bba1","source_type":"WIKI_ITEM","target_type":"SOURCE_FILE","relationship_type":"REFERENCED_BY","extra":"Wiki references source file: frontend/app/(dashboard","gmt_create":"2026-04-23T15:22:23.540469+08:00","gmt_modified":"2026-04-23T15:22:23.540469+08:00"},{"id":427,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"8a466b0c6eac2ccb54c5da7e13854646","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/app/layout.tsx#1-37","gmt_create":"2026-04-23T15:22:23.541484+08:00","gmt_modified":"2026-04-23T15:22:23.541484+08:00"},{"id":428,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"fd18328b6582e68c30b130b912891992","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/components/providers.tsx#1-9","gmt_create":"2026-04-23T15:22:23.542098+08:00","gmt_modified":"2026-04-23T15:22:23.542098+08:00"},{"id":429,"source_id":"546e01c5f73aaf5140eee922f4b9a441","target_id":"fd18328b6582e68c30b130b912891992","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-9","gmt_create":"2026-04-23T15:22:23.542482+08:00","gmt_modified":"2026-04-23T15:22:23.542482+08:00"},{"id":430,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"dcfa308ef4ec368c5a51a17acbfc8e2c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/lib/utils.ts#1-7","gmt_create":"2026-04-23T15:22:23.542958+08:00","gmt_modified":"2026-04-23T15:22:23.542958+08:00"},{"id":431,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"71a37a516437e94fd82a87efc70a3f16","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/package.json#1-40","gmt_create":"2026-04-23T15:22:23.54348+08:00","gmt_modified":"2026-04-23T15:22:23.54348+08:00"},{"id":432,"source_id":"aaf5bce6be82d2f947bfa5c1806de452","target_id":"71a37a516437e94fd82a87efc70a3f16","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-40","gmt_create":"2026-04-23T15:22:23.543767+08:00","gmt_modified":"2026-04-23T15:22:23.543768+08:00"},{"id":433,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"89d70e5f89be23a229e3ee59982b8e6e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/tailwind.config.ts#1-57","gmt_create":"2026-04-23T15:22:23.544176+08:00","gmt_modified":"2026-04-23T15:22:23.544176+08:00"},{"id":434,"source_id":"01056dad8851d3e9bd532eb4cab33792","target_id":"89d70e5f89be23a229e3ee59982b8e6e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-57","gmt_create":"2026-04-23T15:22:23.544513+08:00","gmt_modified":"2026-04-23T15:22:23.544513+08:00"},{"id":435,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"95be577a89fbeb02578e4c3718c6ec86","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/components/ui/button.tsx#1-57","gmt_create":"2026-04-23T15:22:23.545023+08:00","gmt_modified":"2026-04-23T15:22:23.545023+08:00"},{"id":436,"source_id":"ac1acbc54c49ee1de13369f6c6827568","target_id":"95be577a89fbeb02578e4c3718c6ec86","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-57","gmt_create":"2026-04-23T15:22:23.545376+08:00","gmt_modified":"2026-04-23T15:22:23.545376+08:00"},{"id":437,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"607bb628918a7a5d54cbf74763f94d07","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/components/ui/input.tsx#1-23","gmt_create":"2026-04-23T15:22:23.545898+08:00","gmt_modified":"2026-04-23T15:22:23.545899+08:00"},{"id":438,"source_id":"3cf787fa77a15b2b1783560c6d83ed21","target_id":"607bb628918a7a5d54cbf74763f94d07","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-23","gmt_create":"2026-04-23T15:22:23.546272+08:00","gmt_modified":"2026-04-23T15:22:23.546272+08:00"},{"id":439,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"325e25d1dda0f7bfd9d7adfe35ecf3b5","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/components/ui/select.tsx#1-161","gmt_create":"2026-04-23T15:22:23.546653+08:00","gmt_modified":"2026-04-23T15:22:23.546653+08:00"},{"id":440,"source_id":"3c56e1c079959bfcc985183805e5874f","target_id":"325e25d1dda0f7bfd9d7adfe35ecf3b5","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-161","gmt_create":"2026-04-23T15:22:23.546906+08:00","gmt_modified":"2026-04-23T15:22:23.546907+08:00"},{"id":441,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"0eed9f61572209dd754611fc7c690d5a","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/components/ui/dialog.tsx#1-123","gmt_create":"2026-04-23T15:22:23.547243+08:00","gmt_modified":"2026-04-23T15:22:23.547244+08:00"},{"id":442,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"ad6ff021b2126ad5c42323305eb6d8b0","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/components/ui/dropdown-menu.tsx#1-201","gmt_create":"2026-04-23T15:22:23.547645+08:00","gmt_modified":"2026-04-23T15:22:23.547645+08:00"},{"id":443,"source_id":"0186dc8a89340139a84e1e3c5571a57f","target_id":"ad6ff021b2126ad5c42323305eb6d8b0","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-201","gmt_create":"2026-04-23T15:22:23.547892+08:00","gmt_modified":"2026-04-23T15:22:23.547892+08:00"},{"id":444,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"a85f004dca63614b4e734ba63b45ef9e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/components/ui/card.tsx#1-80","gmt_create":"2026-04-23T15:22:23.548296+08:00","gmt_modified":"2026-04-23T15:22:23.548296+08:00"},{"id":445,"source_id":"0d5ef537f7c0b8c390f8b31d7cf47b56","target_id":"a85f004dca63614b4e734ba63b45ef9e","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-80","gmt_create":"2026-04-23T15:22:23.548561+08:00","gmt_modified":"2026-04-23T15:22:23.548561+08:00"},{"id":446,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"3bab92a09e9fb456e0303bb1e04afc7e","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/components/ui/table.tsx#1-118","gmt_create":"2026-04-23T15:22:23.548946+08:00","gmt_modified":"2026-04-23T15:22:23.548946+08:00"},{"id":447,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"bd3042a8d9b602334720b0d7b4e8ab3d","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/components/ui/tabs.tsx#1-56","gmt_create":"2026-04-23T15:22:23.549383+08:00","gmt_modified":"2026-04-23T15:22:23.549383+08:00"},{"id":448,"source_id":"beb87ab5aad9532647e9dbd2db7ef587","target_id":"bd3042a8d9b602334720b0d7b4e8ab3d","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-56","gmt_create":"2026-04-23T15:22:23.549652+08:00","gmt_modified":"2026-04-23T15:22:23.549653+08:00"},{"id":449,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"379443f450513b5492e2d9d5fca94a42","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/components/ui/label.tsx#1-27","gmt_create":"2026-04-23T15:22:23.550013+08:00","gmt_modified":"2026-04-23T15:22:23.550014+08:00"},{"id":450,"source_id":"792b8e2c16c9ff2095d83b8972313be4","target_id":"379443f450513b5492e2d9d5fca94a42","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-27","gmt_create":"2026-04-23T15:22:23.550267+08:00","gmt_modified":"2026-04-23T15:22:23.550267+08:00"},{"id":451,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"4aa6ad434a73143bb7a2072124f63be0","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/components/ui/badge.tsx#1-37","gmt_create":"2026-04-23T15:22:23.551155+08:00","gmt_modified":"2026-04-23T15:22:23.551155+08:00"},{"id":452,"source_id":"51821ca9ec2a1c972f3c9d111e19db8a","target_id":"4aa6ad434a73143bb7a2072124f63be0","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 1-37","gmt_create":"2026-04-23T15:22:23.551858+08:00","gmt_modified":"2026-04-23T15:22:23.551858+08:00"},{"id":453,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"c45dbdda70a8b9f02b52af4991644d0b","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/package.json#11-27","gmt_create":"2026-04-23T15:22:23.552353+08:00","gmt_modified":"2026-04-23T15:22:23.552353+08:00"},{"id":454,"source_id":"aaf5bce6be82d2f947bfa5c1806de452","target_id":"c45dbdda70a8b9f02b52af4991644d0b","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 11-27","gmt_create":"2026-04-23T15:22:23.552845+08:00","gmt_modified":"2026-04-23T15:22:23.552845+08:00"},{"id":455,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"6ac6943c93570294e4fb15a862be2616","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/components/ui/button.tsx#36-54","gmt_create":"2026-04-23T15:22:23.553797+08:00","gmt_modified":"2026-04-23T15:22:23.553797+08:00"},{"id":456,"source_id":"ac1acbc54c49ee1de13369f6c6827568","target_id":"6ac6943c93570294e4fb15a862be2616","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 36-54","gmt_create":"2026-04-23T15:22:23.554077+08:00","gmt_modified":"2026-04-23T15:22:23.554077+08:00"},{"id":457,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"4bfb5059c685e9878aed64cb5347ccec","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/components/ui/dialog.tsx#9-54","gmt_create":"2026-04-23T15:22:23.554645+08:00","gmt_modified":"2026-04-23T15:22:23.554645+08:00"},{"id":458,"source_id":"108b0c4b4dcfb6aa39a5eb138225c148","target_id":"4bfb5059c685e9878aed64cb5347ccec","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-54","gmt_create":"2026-04-23T15:22:23.554875+08:00","gmt_modified":"2026-04-23T15:22:23.554875+08:00"},{"id":459,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"0af48b69fe8fb9e480fa1656f36a4330","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/components/ui/dropdown-menu.tsx#21-75","gmt_create":"2026-04-23T15:22:23.555418+08:00","gmt_modified":"2026-04-23T15:22:23.555418+08:00"},{"id":460,"source_id":"0186dc8a89340139a84e1e3c5571a57f","target_id":"0af48b69fe8fb9e480fa1656f36a4330","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 21-75","gmt_create":"2026-04-23T15:22:23.55574+08:00","gmt_modified":"2026-04-23T15:22:23.55574+08:00"},{"id":461,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"09971e31ab658e119d4c0ad948282107","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/components/ui/select.tsx#15-100","gmt_create":"2026-04-23T15:22:23.556401+08:00","gmt_modified":"2026-04-23T15:22:23.556401+08:00"},{"id":462,"source_id":"3c56e1c079959bfcc985183805e5874f","target_id":"09971e31ab658e119d4c0ad948282107","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 15-100","gmt_create":"2026-04-23T15:22:23.556634+08:00","gmt_modified":"2026-04-23T15:22:23.556634+08:00"},{"id":463,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"31aa8777de6043883950d2668094e388","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/components/ui/table.tsx#5-106","gmt_create":"2026-04-23T15:22:23.55717+08:00","gmt_modified":"2026-04-23T15:22:23.55717+08:00"},{"id":464,"source_id":"0c0b0f4e2cf44facd9d5b57de0d0bf0c","target_id":"31aa8777de6043883950d2668094e388","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 5-106","gmt_create":"2026-04-23T15:22:23.557428+08:00","gmt_modified":"2026-04-23T15:22:23.557429+08:00"},{"id":465,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"28baf3cedb89a21c6d542b7ce2439b24","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/components/ui/tabs.tsx#8-53","gmt_create":"2026-04-23T15:22:23.558002+08:00","gmt_modified":"2026-04-23T15:22:23.558002+08:00"},{"id":466,"source_id":"beb87ab5aad9532647e9dbd2db7ef587","target_id":"28baf3cedb89a21c6d542b7ce2439b24","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 8-53","gmt_create":"2026-04-23T15:22:23.558316+08:00","gmt_modified":"2026-04-23T15:22:23.558316+08:00"},{"id":467,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"28b0f4797c6084272244175a24b961cb","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/components/ui/card.tsx#5-77","gmt_create":"2026-04-23T15:22:23.558858+08:00","gmt_modified":"2026-04-23T15:22:23.558858+08:00"},{"id":468,"source_id":"0d5ef537f7c0b8c390f8b31d7cf47b56","target_id":"28b0f4797c6084272244175a24b961cb","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 5-77","gmt_create":"2026-04-23T15:22:23.559082+08:00","gmt_modified":"2026-04-23T15:22:23.559082+08:00"},{"id":469,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"a6e0b3fa65906c3c3cd88707e1d40059","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/components/ui/label.tsx#9-23","gmt_create":"2026-04-23T15:22:23.559653+08:00","gmt_modified":"2026-04-23T15:22:23.559653+08:00"},{"id":470,"source_id":"792b8e2c16c9ff2095d83b8972313be4","target_id":"a6e0b3fa65906c3c3cd88707e1d40059","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 9-23","gmt_create":"2026-04-23T15:22:23.560391+08:00","gmt_modified":"2026-04-23T15:22:23.560392+08:00"},{"id":471,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"9a909775022010b4686c2b00cdf1c165","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/components/ui/badge.tsx#6-34","gmt_create":"2026-04-23T15:22:23.562216+08:00","gmt_modified":"2026-04-23T15:22:23.562216+08:00"},{"id":472,"source_id":"51821ca9ec2a1c972f3c9d111e19db8a","target_id":"9a909775022010b4686c2b00cdf1c165","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 6-34","gmt_create":"2026-04-23T15:22:23.562602+08:00","gmt_modified":"2026-04-23T15:22:23.562602+08:00"},{"id":473,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"ce1cd184945ae56cf63f55168afd8050","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/components/ui/dialog.tsx#47-50","gmt_create":"2026-04-23T15:22:23.565009+08:00","gmt_modified":"2026-04-23T15:22:23.565009+08:00"},{"id":474,"source_id":"108b0c4b4dcfb6aa39a5eb138225c148","target_id":"ce1cd184945ae56cf63f55168afd8050","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 47-50","gmt_create":"2026-04-23T15:22:23.565469+08:00","gmt_modified":"2026-04-23T15:22:23.565469+08:00"},{"id":475,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"4a2a06e1efcbc85deaa013dca155f20c","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/tailwind.config.ts#10-54","gmt_create":"2026-04-23T15:22:23.57102+08:00","gmt_modified":"2026-04-23T15:22:23.57102+08:00"},{"id":476,"source_id":"01056dad8851d3e9bd532eb4cab33792","target_id":"4a2a06e1efcbc85deaa013dca155f20c","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 10-54","gmt_create":"2026-04-23T15:22:23.571491+08:00","gmt_modified":"2026-04-23T15:22:23.571491+08:00"},{"id":477,"source_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","target_id":"8b00ea4aba57ea6ed982287fb7840805","source_type":"WIKI_ITEM","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Wiki contains code snippet: frontend/lib/utils.ts#4-6","gmt_create":"2026-04-23T15:22:23.572188+08:00","gmt_modified":"2026-04-23T15:22:23.572188+08:00"},{"id":478,"source_id":"f93ae024fe0a2e69698037dff6df205f","target_id":"8b00ea4aba57ea6ed982287fb7840805","source_type":"SOURCE_FILE","target_type":"CODE_SNIPPET","relationship_type":"CONTAINS","extra":"Source file contains code snippet: 4-6","gmt_create":"2026-04-23T15:22:23.572722+08:00","gmt_modified":"2026-04-23T15:22:23.572722+08:00"},{"id":479,"source_id":"3af3bb9e-4d99-4dc3-b1ed-2686db385c26","target_id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3af3bb9e-4d99-4dc3-b1ed-2686db385c26 -\u003e ba0390b3-c249-4e92-a3c8-6820343aeda9","gmt_create":"2026-04-23T15:22:24.554964+08:00","gmt_modified":"2026-04-23T15:22:24.554964+08:00"},{"id":480,"source_id":"3af3bb9e-4d99-4dc3-b1ed-2686db385c26","target_id":"760610d4-dff6-4c6d-831f-7c9078db86a6","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 3af3bb9e-4d99-4dc3-b1ed-2686db385c26 -\u003e 760610d4-dff6-4c6d-831f-7c9078db86a6","gmt_create":"2026-04-23T15:22:24.558512+08:00","gmt_modified":"2026-04-23T15:22:24.558512+08:00"},{"id":481,"source_id":"ffbb970e-56e0-40ad-bd88-1a1e55482d96","target_id":"262a3941-fdc6-46b0-b767-be40aa9d5761","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ffbb970e-56e0-40ad-bd88-1a1e55482d96 -\u003e 262a3941-fdc6-46b0-b767-be40aa9d5761","gmt_create":"2026-04-23T15:22:24.561111+08:00","gmt_modified":"2026-04-23T15:22:24.561111+08:00"},{"id":482,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"a1cc822d-5382-431c-8c49-cf398fb5eb3c","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: deb919cc-9541-4ed7-a581-ae2876ea67c2 -\u003e a1cc822d-5382-431c-8c49-cf398fb5eb3c","gmt_create":"2026-04-23T15:22:24.562112+08:00","gmt_modified":"2026-04-23T15:22:24.562112+08:00"},{"id":483,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"2fc79486-ec65-4533-860a-89c8877c2ea0","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: deb919cc-9541-4ed7-a581-ae2876ea67c2 -\u003e 2fc79486-ec65-4533-860a-89c8877c2ea0","gmt_create":"2026-04-23T15:22:24.563092+08:00","gmt_modified":"2026-04-23T15:22:24.563092+08:00"},{"id":484,"source_id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","target_id":"d8e2cef5-37e6-44e7-8a7b-9bd365b82a72","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: deb919cc-9541-4ed7-a581-ae2876ea67c2 -\u003e d8e2cef5-37e6-44e7-8a7b-9bd365b82a72","gmt_create":"2026-04-23T15:22:24.564188+08:00","gmt_modified":"2026-04-23T15:22:24.564188+08:00"},{"id":485,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"7c7564ee-7fe2-4555-8ff0-4ec1b757997a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 49915365-e38e-43b5-beac-6aa7d5a74cbb -\u003e 7c7564ee-7fe2-4555-8ff0-4ec1b757997a","gmt_create":"2026-04-23T15:22:24.570327+08:00","gmt_modified":"2026-04-23T15:22:24.570327+08:00"},{"id":486,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"74d3018f-4e23-4687-8bf4-7fb403f479f7","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 49915365-e38e-43b5-beac-6aa7d5a74cbb -\u003e 74d3018f-4e23-4687-8bf4-7fb403f479f7","gmt_create":"2026-04-23T15:22:24.571376+08:00","gmt_modified":"2026-04-23T15:22:24.571376+08:00"},{"id":487,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"737f8d6c-bd8f-4c11-b142-71a400423323","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 49915365-e38e-43b5-beac-6aa7d5a74cbb -\u003e 737f8d6c-bd8f-4c11-b142-71a400423323","gmt_create":"2026-04-23T15:22:24.572325+08:00","gmt_modified":"2026-04-23T15:22:24.572325+08:00"},{"id":488,"source_id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","target_id":"ae62f4a8-8840-4c8e-9a42-3373370299ff","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 49915365-e38e-43b5-beac-6aa7d5a74cbb -\u003e ae62f4a8-8840-4c8e-9a42-3373370299ff","gmt_create":"2026-04-23T15:22:24.573991+08:00","gmt_modified":"2026-04-23T15:22:24.573991+08:00"},{"id":489,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"8150ddbb-7aa9-48d0-9953-2ef55e4bcfd5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: b0c36b2b-bb03-4624-933d-c1f6a320b7ca -\u003e 8150ddbb-7aa9-48d0-9953-2ef55e4bcfd5","gmt_create":"2026-04-23T15:22:24.576401+08:00","gmt_modified":"2026-04-23T15:22:24.576402+08:00"},{"id":490,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"8c17b44f-1586-459b-a83d-c9b961cd2142","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: b0c36b2b-bb03-4624-933d-c1f6a320b7ca -\u003e 8c17b44f-1586-459b-a83d-c9b961cd2142","gmt_create":"2026-04-23T15:22:24.577199+08:00","gmt_modified":"2026-04-23T15:22:24.5772+08:00"},{"id":491,"source_id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","target_id":"05e59a75-d52f-42e1-a924-f6a32f06f2fe","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: b0c36b2b-bb03-4624-933d-c1f6a320b7ca -\u003e 05e59a75-d52f-42e1-a924-f6a32f06f2fe","gmt_create":"2026-04-23T15:22:24.578095+08:00","gmt_modified":"2026-04-23T15:22:24.578095+08:00"}],"source_files":[{"id":"12e2c3d7b9a92dc44a6ee29b85e10df6","path":"frontend/app/layout.tsx","filename":"layout.tsx","gmt_create":"2026-04-23T15:19:43.754128+08:00","gmt_modified":"2026-04-23T15:19:43.754129+08:00"},{"id":"2a1c745c7b3fb7f600596be3d979bba1","path":"frontend/app/(dashboard","filename":"(dashboard","gmt_create":"2026-04-23T15:19:43.756075+08:00","gmt_modified":"2026-04-23T15:19:43.756075+08:00"},{"id":"eca13a610badfc5ffc6210827fb96991","path":"frontend/components/layout/header.tsx","filename":"header.tsx","gmt_create":"2026-04-23T15:19:43.756308+08:00","gmt_modified":"2026-04-23T15:19:43.756308+08:00"},{"id":"18a0651d895fba9bb4e0c0229459efdc","path":"frontend/components/layout/sidebar.tsx","filename":"sidebar.tsx","gmt_create":"2026-04-23T15:19:43.756496+08:00","gmt_modified":"2026-04-23T15:19:43.756496+08:00"},{"id":"5d7886d0dc99f81073a578b8aefdd375","path":"frontend/lib/api.ts","filename":"api.ts","gmt_create":"2026-04-23T15:19:43.756648+08:00","gmt_modified":"2026-04-23T15:19:43.756648+08:00"},{"id":"0c0b0f4e2cf44facd9d5b57de0d0bf0c","path":"frontend/components/ui/table.tsx","filename":"table.tsx","gmt_create":"2026-04-23T15:19:43.758184+08:00","gmt_modified":"2026-04-23T15:19:43.758184+08:00"},{"id":"108b0c4b4dcfb6aa39a5eb138225c148","path":"frontend/components/ui/dialog.tsx","filename":"dialog.tsx","gmt_create":"2026-04-23T15:19:43.75905+08:00","gmt_modified":"2026-04-23T15:19:43.75905+08:00"},{"id":"ef72f0c3cedb9fd9a87352fe493053dc","path":"frontend/lib/platforms.ts","filename":"platforms.ts","gmt_create":"2026-04-23T15:19:43.759223+08:00","gmt_modified":"2026-04-23T15:19:43.759223+08:00"},{"id":"f93ae024fe0a2e69698037dff6df205f","path":"frontend/lib/utils.ts","filename":"utils.ts","gmt_create":"2026-04-23T15:19:43.759351+08:00","gmt_modified":"2026-04-23T15:19:43.759351+08:00"},{"id":"d5f2266643d2011c66e86af088ec637f","path":"frontend/components/charts/trend-chart.tsx","filename":"trend-chart.tsx","gmt_create":"2026-04-23T15:19:43.759489+08:00","gmt_modified":"2026-04-23T15:19:43.759489+08:00"},{"id":"f1a7d61831cc0a45ac6220294f15c21d","path":"frontend/components/charts/platform-chart.tsx","filename":"platform-chart.tsx","gmt_create":"2026-04-23T15:19:43.759606+08:00","gmt_modified":"2026-04-23T15:19:43.759606+08:00"},{"id":"9228ff67d4c757a85d9421b71f4b29f5","path":"backend/app/main.py","filename":"main.py","gmt_create":"2026-04-23T15:19:45.5873+08:00","gmt_modified":"2026-04-23T15:19:45.5873+08:00"},{"id":"93022c8938ce318f167277cfa65c29a7","path":"backend/app/api/auth.py","filename":"auth.py","gmt_create":"2026-04-23T15:19:45.587785+08:00","gmt_modified":"2026-04-23T15:19:45.587786+08:00"},{"id":"6b3d903205941aa9391dd90016e1102c","path":"backend/app/api/queries.py","filename":"queries.py","gmt_create":"2026-04-23T15:19:45.588167+08:00","gmt_modified":"2026-04-23T15:19:45.588167+08:00"},{"id":"7538ffe4902ab6041adb28b19844962a","path":"backend/app/api/citations.py","filename":"citations.py","gmt_create":"2026-04-23T15:19:45.588473+08:00","gmt_modified":"2026-04-23T15:19:45.588473+08:00"},{"id":"58901c94d975d87e652a4dc6c8dda656","path":"backend/app/api/reports.py","filename":"reports.py","gmt_create":"2026-04-23T15:19:45.588695+08:00","gmt_modified":"2026-04-23T15:19:45.588695+08:00"},{"id":"9d08667997a868fc07c9b4e328e44224","path":"backend/app/api/deps.py","filename":"deps.py","gmt_create":"2026-04-23T15:19:45.588857+08:00","gmt_modified":"2026-04-23T15:19:45.588857+08:00"},{"id":"e0c0ca66b8b81cf66e078a7ab162c07f","path":"backend/app/schemas/auth.py","filename":"auth.py","gmt_create":"2026-04-23T15:19:45.589011+08:00","gmt_modified":"2026-04-23T15:19:45.589011+08:00"},{"id":"f301b79d833233ce39d350e82a71c938","path":"backend/app/schemas/query.py","filename":"query.py","gmt_create":"2026-04-23T15:19:45.589202+08:00","gmt_modified":"2026-04-23T15:19:45.589202+08:00"},{"id":"1a3336b4af8a39a055e912724338580c","path":"backend/app/schemas/citation.py","filename":"citation.py","gmt_create":"2026-04-23T15:19:45.589399+08:00","gmt_modified":"2026-04-23T15:19:45.589399+08:00"},{"id":"4d2f3847b7c10634733118b70a1aea0b","path":"backend/app/services/auth.py","filename":"auth.py","gmt_create":"2026-04-23T15:19:45.589591+08:00","gmt_modified":"2026-04-23T15:19:45.589591+08:00"},{"id":"88d22de3b2a7419868e8ae19130d860c","path":"backend/app/services/query.py","filename":"query.py","gmt_create":"2026-04-23T15:19:45.589732+08:00","gmt_modified":"2026-04-23T15:19:45.589732+08:00"},{"id":"04e3926c080e795713bff683e7dc9d3e","path":"backend/app/services/citation.py","filename":"citation.py","gmt_create":"2026-04-23T15:19:45.589852+08:00","gmt_modified":"2026-04-23T15:19:45.589852+08:00"},{"id":"9ff19022ef915615911280e3c49ed44b","path":"backend/app/config.py","filename":"config.py","gmt_create":"2026-04-23T15:19:45.589987+08:00","gmt_modified":"2026-04-23T15:19:45.589987+08:00"},{"id":"c59f8c276697a070dffc581fe94d809c","path":"backend/app/models/user.py","filename":"user.py","gmt_create":"2026-04-23T15:19:45.590197+08:00","gmt_modified":"2026-04-23T15:19:45.590198+08:00"},{"id":"b74caccb06844efcdb14d8324cff65c2","path":"backend/app/models/query.py","filename":"query.py","gmt_create":"2026-04-23T15:19:45.590343+08:00","gmt_modified":"2026-04-23T15:19:45.590344+08:00"},{"id":"b4a81ef789630d0af6a8d50859d01bf3","path":"backend/app/models/citation_record.py","filename":"citation_record.py","gmt_create":"2026-04-23T15:19:45.590489+08:00","gmt_modified":"2026-04-23T15:19:45.590489+08:00"},{"id":"069738f21ac2da7349d22683e8c36929","path":"backend/app/models/query_task.py","filename":"query_task.py","gmt_create":"2026-04-23T15:19:45.59062+08:00","gmt_modified":"2026-04-23T15:19:45.59062+08:00"},{"id":"5cbb1e3f112aeba62a14b0b8999fc0f5","path":"backend/app/workers/scheduler.py","filename":"scheduler.py","gmt_create":"2026-04-23T15:20:08.953491+08:00","gmt_modified":"2026-04-23T15:20:08.953491+08:00"},{"id":"74040de652d5e57f548bb5c4adc3e1a0","path":"backend/app/workers/citation_engine.py","filename":"citation_engine.py","gmt_create":"2026-04-23T15:20:08.953836+08:00","gmt_modified":"2026-04-23T15:20:08.953837+08:00"},{"id":"8f973791233c698b3e64a4fb28a93d4b","path":"backend/app/workers/platforms/kimi.py","filename":"kimi.py","gmt_create":"2026-04-23T15:20:08.954103+08:00","gmt_modified":"2026-04-23T15:20:08.954103+08:00"},{"id":"f642fc1c2f34e15572d9d98aa6c18813","path":"backend/app/workers/platforms/wenxin.py","filename":"wenxin.py","gmt_create":"2026-04-23T15:20:08.954273+08:00","gmt_modified":"2026-04-23T15:20:08.954273+08:00"},{"id":"a16cf42e9559523c4f96ca4c79f9488d","path":"backend/app/workers/platforms/base.py","filename":"base.py","gmt_create":"2026-04-23T15:20:08.954406+08:00","gmt_modified":"2026-04-23T15:20:08.954406+08:00"},{"id":"b0c428683c8a3e6922d90ca0d8c2736d","path":"backend/app/database.py","filename":"database.py","gmt_create":"2026-04-23T15:20:08.955702+08:00","gmt_modified":"2026-04-23T15:20:08.955702+08:00"},{"id":"b2f0d46a31a5441594f2e777365fc156","path":"tests/test_scheduler.py","filename":"test_scheduler.py","gmt_create":"2026-04-23T15:20:08.95621+08:00","gmt_modified":"2026-04-23T15:20:08.95621+08:00"},{"id":"0613e76b9679be7f998fb8fd8056e686","path":"tests/test_queries.py","filename":"test_queries.py","gmt_create":"2026-04-23T15:20:08.956336+08:00","gmt_modified":"2026-04-23T15:20:08.956336+08:00"},{"id":"99fe1b288fd41daa86c2dfbab819abf0","path":"backend/app/models/__init__.py","filename":"__init__.py","gmt_create":"2026-04-23T15:21:46.682639+08:00","gmt_modified":"2026-04-23T15:21:46.682639+08:00"},{"id":"bceca00463fe55d3bcafda728f97f723","path":"backend/app/models/subscription.py","filename":"subscription.py","gmt_create":"2026-04-23T15:21:46.684259+08:00","gmt_modified":"2026-04-23T15:21:46.684259+08:00"},{"id":"d4f95fcf50683b5bf6167c7d2a6b126d","path":"backend/alembic/versions/488d0bd5ab01_initial_migration.py","filename":"488d0bd5ab01_initial_migration.py","gmt_create":"2026-04-23T15:21:46.684619+08:00","gmt_modified":"2026-04-23T15:21:46.684619+08:00"},{"id":"0ef1efea889dba3e1f299626df479571","path":"tests/conftest.py","filename":"conftest.py","gmt_create":"2026-04-23T15:22:15.981194+08:00","gmt_modified":"2026-04-23T15:22:15.981194+08:00"},{"id":"389d631bc6c7111ba411b0b79fca455e","path":"tests/test_auth.py","filename":"test_auth.py","gmt_create":"2026-04-23T15:22:15.98141+08:00","gmt_modified":"2026-04-23T15:22:15.98141+08:00"},{"id":"80a0429cc47931de27ddb17a62b8dd9c","path":"tests/test_business_flow.py","filename":"test_business_flow.py","gmt_create":"2026-04-23T15:22:15.981566+08:00","gmt_modified":"2026-04-23T15:22:15.981567+08:00"},{"id":"b07a4fb9cecbbd66a6910ccbc7651f19","path":"tests/test_citation_engine.py","filename":"test_citation_engine.py","gmt_create":"2026-04-23T15:22:15.981715+08:00","gmt_modified":"2026-04-23T15:22:15.981715+08:00"},{"id":"42ff5383133d176cec9eb88682483be3","path":"tests/test_citations.py","filename":"test_citations.py","gmt_create":"2026-04-23T15:22:15.981831+08:00","gmt_modified":"2026-04-23T15:22:15.981831+08:00"},{"id":"aaf5bce6be82d2f947bfa5c1806de452","path":"frontend/package.json","filename":"package.json","gmt_create":"2026-04-23T15:22:23.492837+08:00","gmt_modified":"2026-04-23T15:22:23.492837+08:00"},{"id":"01056dad8851d3e9bd532eb4cab33792","path":"frontend/tailwind.config.ts","filename":"tailwind.config.ts","gmt_create":"2026-04-23T15:22:23.495792+08:00","gmt_modified":"2026-04-23T15:22:23.495792+08:00"},{"id":"ac1acbc54c49ee1de13369f6c6827568","path":"frontend/components/ui/button.tsx","filename":"button.tsx","gmt_create":"2026-04-23T15:22:23.496353+08:00","gmt_modified":"2026-04-23T15:22:23.496353+08:00"},{"id":"0186dc8a89340139a84e1e3c5571a57f","path":"frontend/components/ui/dropdown-menu.tsx","filename":"dropdown-menu.tsx","gmt_create":"2026-04-23T15:22:23.496869+08:00","gmt_modified":"2026-04-23T15:22:23.496869+08:00"},{"id":"3cf787fa77a15b2b1783560c6d83ed21","path":"frontend/components/ui/input.tsx","filename":"input.tsx","gmt_create":"2026-04-23T15:22:23.497127+08:00","gmt_modified":"2026-04-23T15:22:23.497128+08:00"},{"id":"3c56e1c079959bfcc985183805e5874f","path":"frontend/components/ui/select.tsx","filename":"select.tsx","gmt_create":"2026-04-23T15:22:23.497457+08:00","gmt_modified":"2026-04-23T15:22:23.497457+08:00"},{"id":"0d5ef537f7c0b8c390f8b31d7cf47b56","path":"frontend/components/ui/card.tsx","filename":"card.tsx","gmt_create":"2026-04-23T15:22:23.497745+08:00","gmt_modified":"2026-04-23T15:22:23.497745+08:00"},{"id":"51821ca9ec2a1c972f3c9d111e19db8a","path":"frontend/components/ui/badge.tsx","filename":"badge.tsx","gmt_create":"2026-04-23T15:22:23.498034+08:00","gmt_modified":"2026-04-23T15:22:23.498034+08:00"},{"id":"beb87ab5aad9532647e9dbd2db7ef587","path":"frontend/components/ui/tabs.tsx","filename":"tabs.tsx","gmt_create":"2026-04-23T15:22:23.498711+08:00","gmt_modified":"2026-04-23T15:22:23.498711+08:00"},{"id":"792b8e2c16c9ff2095d83b8972313be4","path":"frontend/components/ui/label.tsx","filename":"label.tsx","gmt_create":"2026-04-23T15:22:23.499031+08:00","gmt_modified":"2026-04-23T15:22:23.499031+08:00"},{"id":"546e01c5f73aaf5140eee922f4b9a441","path":"frontend/components/providers.tsx","filename":"providers.tsx","gmt_create":"2026-04-23T15:22:23.499298+08:00","gmt_modified":"2026-04-23T15:22:23.499298+08:00"}],"wiki_catalogs":[{"id":"1bb55e12-24c4-42cb-8f59-ddc303460d45","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"项目概述","description":"project-overview","prompt":"为GEO项目创建全面的项目概述内容。详细介绍GEO平台的核心目标、主要功能特性和技术架构。解释项目作为智能学术查询与引用管理系统的设计理念,包括多AI平台集成、定时查询任务调度、数据可视化展示等核心功能。说明前后端技术栈的选择原因和整体架构设计思路。提供项目背景、应用场景和价值主张。包含系统边界、核心组件关系图和数据流向说明。面向初学者提供概念性理解,同时为经验丰富的开发者提供技术决策的背景信息。","progress_status":"completed","dependent_files":"backend/app/main.py,backend/app/config.py,docker-compose.yml,README.md","gmt_create":"2026-04-22T18:56:47.080895+08:00","gmt_modified":"2026-04-22T18:58:50.329037+08:00","raw_data":"WikiEncrypted:0MI1/XkBoMl0lTbK6t0Cn/+8FdvqrJ62ianMLvZj02elJtBUgH0Ns0veIx1WPtM9wwkxI+/XAqHLxJLlHB8wVx/ob+gHrWfBRFOXtNWHzmTEJrNEttrYXRV2niAmjrnc6VwXmKYktKqbX8suWQzVig0VjADoZYGObEeg0k6UmhPkxkWTv0CFbAx+cDhkRVaksYUcZryJYvMvtyIQASEjZKRRtKwti+2pbfHzXGaF917ir8bLf35/8ERIvyLM91k6J7WrkQWQzCSMouoCq7SDEG2Mf9UPmNoJ04sS8RtxbiiFeHu6NAI8L7L1EfxY3DDdg47NhHU1wH7bOT2u9DuFl4zIbaVNsenyjEzRQZrcsq9OLnl8yWNKJf21GOA6ESfKQqN6mlowI6I1W8qLXaH+z7qnaPWhOyo4mje7g8hCZG4S41ZGWOkatECxYDASI4FIduNeEVW9aCmI7PB7nSnpPSwQE5aC5VqWoMBShuC18DGj8AvqVxfjw6b7bxR8HDUKjzXB/K7KmXdVGCcJNb3tgApQuSTsYxQ2jHsSoUECE/BEAaW7oLRxWD3c3uNNvgrgdfQuFT+k7Ko5zOXJ006KKVxWcThwPsColn6fIwGOPrS7ncbwW0n28B2g2hw91A5Hzpgm/Dy0+YIlPQM8anuTom0Oj0p1Y2g2Nbp2PLaPBGGPUa6bDoCNqzoUs1784Rwjp+aLG05lN7onsW7Z7C9feQ4P5Ry0h8YnKKl/dR4mKs1k+dkOeMPFUpWt/qlFcHAMSoVy+O+Xu+reQzwoCKYlSwgFgjiZzs3p+kL1LWvbxSvArAOemC7uu5lEzWdggi+MLrSVpB7hLalHKGdJv8NlK4SmNaadctIMUQvY+5PZwitnGdyyjjlS7/wScj8Uv3/EZk3ITEUlIvWPJ15U6QBNxHy2DbosENNEgp0lDni/UFPduUos6SlLo5L0WKgfv72BnFY4lZfB3LChbEu2eBhM8AALCKaUIhj7t/oEI+9I9qqfPimBNi6FyH0jllt2yllX04VJRxl32uuWOFcZnm/WuJgw/BbrZCR++fefrA1l6s02TJzhZ0Y5XWJsKulCubVCF9tUQ4UJbnnU1nI5rTahkANjI7mTWIpkPHp+GUXL8Q3UpSwYl2BshG/kyfJIyFu26CIJnX5HtHezPZNWAwBQVebhTaSURWwish62V3jO/gRkcmDJHlE8YC2bAo62/asrgniVM+qniMotIgbt1nopX3ishgnMYYmFqKU8+YXUiE9/z243TcTEzltDGAWj5YN10RF/Mx3dT+62D1cwhO1486VYAZpYZtOjHjPeP2/4TW7FbMhub9iGFZ8FNqneYJyWZBa+udx1oyHzyo3YHrDcFGJPXi9ido7nGq53tKEM64A="},{"id":"7c3e3c0b-5d1f-4d64-99be-668041c6cd9d","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"核心框架配置","description":"core-framework","prompt":"为GEO后端核心框架创建详细的配置文档。深入解释FastAPI应用实例的初始化过程,包括应用名称、版本管理和生命周期管理。详细说明CORS中间件配置、路由注册机制和健康检查端点。文档化配置管理系统的实现,包括环境变量读取、配置验证和默认值设置。解释数据库连接池配置、异步会话管理和连接超时设置。包含应用启动和关闭流程的详细说明,以及资源清理机制。提供配置最佳实践和常见问题解决方案。","parent_id":"7c2ac186-ec90-400a-ac1d-b3b7ca2f01d5","progress_status":"completed","dependent_files":"backend/app/main.py,backend/app/config.py,backend/app/database.py","gmt_create":"2026-04-22T18:57:02.316945+08:00","gmt_modified":"2026-04-22T19:03:21.69307+08:00","raw_data":"WikiEncrypted:luoNp8LvFa7zGThvIT9T4rhp6COPRJpm3tT/kftARqFq4dg1cG/8M10NcCrCelp/LC8SV6McSk0Sx9xEgJV/YmEmjfMmlukALh9v7ZKLxT8XDDYkBCrff2Ia9KfGFRdlfVmmQUGfhQARTeykGZh6O8/4GECBHUYLS0F6NXI7fSS3R+/I5c/HIjI7F17mVNpZDQZcc2HmM4zhdyIinOGyErSf3vIPcfVVobPB4D/wCUvMWxl+jpvktykHTIgH9ze7f4fTCC02xK5vRnt1RlMdAQ3d1Km7OOGjAga30OGvRdp9UtT48gdhzPQH5FEbfzn7K6TnuPzqQRf4GuS2kVTRSUFbSnmj5d5HqHmgx7D9iQYR/XxRRVbv+GeFwINvVa+UX9cnanYU19zazOGWG2rcdDk8jqu5MwAhVZsT28hykyuLfKeTf7xuM6Li86T1mZ18SROCJHe4LXYEaH94K6CHjZLCyEl10xBk02/CkW4aTW29TIgrponrmnrvV6bShQ+ZitR1TcivPsNN5t6TCaHMnlaLlOpznSGNpMyf4S51cRPxl2cwZrqJbrdFxehIoPrUyOvtRvtEsLhpo30456ihrInvbVXgJMwZIcDaKHSu0Bf7ma8y+UCWH61+VBIqW44KzA9zmKcXU9hiiwL+gjwiNcV7JDcgg43Un4qvjEzeJiBRBMGGzc8Oc05dWgRs1K6QUdS1kZTjI/JKiGS8zFYKz0mvQqLwc6/xe1/MDhMyU1QUXSqpcNNU6aFmY7te5kENN2aSPZqigqID+RwvIV8k8JETdmHaxJUzCSrNEpbpUukFuVQKz419athf4kMeQH2fKsLMZABn10WnnmY9HGGqBx+gpNOTU9AiSz1l4b0Ej8XoQcwIn1lqw49qdJ6+PRuuFBv6OcjxgJSMNSQzm4c/eyl7yv6J4vXceT7Ul+ySMAGRnSpDUehmOuw1DT4dV0n05Rcrx5gBjuztOAexxUhLwMUK/v+8qdn/0OcciISCZ/U1GhzhWFYiVKRBfNuNkuRjwmc4zg5Zc97TPRBXYs2q2e0/3cT+Dr7lqeGnXWL3X4iTjTygXMekhDQBjc0NbF6cdDOJcPAUnOg6jDkreBiEkTJ7hZg3J9ho2RYDaHuPvyMlkW4YWTpGRODtXIs4aLG0KFbNr6uOG31hOPZsgnHmoNwcPwRUO4G89Nkl2M6ZTMiNHWtsSwES+gLmCLPunm7R2zQNtdei+K3lzSg0bQgUvg==","layer_level":1},{"id":"bcaa04da-04e3-427f-ba01-847ad657e78a","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"Next.js应用配置","description":"nextjs-app-config","prompt":"创建Next.js 14应用配置的详细文档。说明App Router的页面组织结构,包括路由规则、嵌套路由和页面布局设计。文档化全局样式配置、字体系统和主题定制。解释Tailwind CSS的配置选项、自定义样式和响应式设计原则。说明TypeScript配置、类型定义和开发工具设置。包含性能优化配置、构建优化和生产环境部署设置。提供配置最佳实践和常见问题解决方案。","parent_id":"d907a8eb-795c-4060-9cdd-50d31cf39be3","progress_status":"completed","dependent_files":"frontend/app/layout.tsx,frontend/app/globals.css,frontend/next.config.mjs,frontend/tailwind.config.ts,frontend/tsconfig.json","gmt_create":"2026-04-22T18:57:04.216045+08:00","gmt_modified":"2026-04-22T19:04:47.361369+08:00","raw_data":"WikiEncrypted:MoQ9U2rERvJfHcC2U9f5yo5PrhAUeAY0OH9kgPk99cOGQSyTenUDM+krr5XcMxqj+FSA7CYnuq8hz8eS8Pvzc8yZuRRHbRPExvPpdrOEr8fRtUXkjnECv8NVvFPloo2fonxY9Q2vmL0x2O1UsV1O6L6tkraG28x1o504hsBitow5XMWkk8uSk+sDbyHo/y9/SBDWpcEOXVqeU4nwD/UU+7N90n5i5T89nz6b4M+31tkvffIuZRigZ+1+IJqlsqFgRt9PNrxL9ZUsD2D/Yvh8EJ0sCr9z7AI+D3z+JYM2kgFT/3ugS/EnEzwByGZk/e2EsOY4D+NkRBas836JX++o61ZH5GPQBXTHnVa8h5B1LAVlbA5zBuJHHY3V2XS4X1cTo9Hj76mg9Ha+jWvX2A9fv4vnscE6cVxnM+WjWnSfN8N7Vtla2YRDrNXZRAL50+PNfhUKpb48d0hKFyzf1Av1T4WBKgaYEo2znphEy99ViuG+oOFS6D5pVQ/w5yoPe5MpZCDk4aNsO/owrJkILcGc3+qHfld4Yd4HtYM6madWmmOvHIIuCy5CPGojBzKDcTTSPP6ZjuY1EC/RG3lBkYCQtQj889+80GZpaSbrqWjTmMI1DX1KLNXJkoI3dFk5Tx+w4TqiKICJ8q9KJhOX+mEVk+ECXqrc2Qz787D34zY5UlwsaA44ziBvWDZuwfPWmtelAq4KjqfWTFWYqdY6D0fUvetLh3/VEqH/o5Nh4HrlGvy/faZbU9FKOBZPkAy8c0J24rW5p2pKmRq6+2IicNTgufRROtiY87GKfbfmqpDYBEn3Dogv/Q3i5beVavuD1tJWhRsewhAZAUi1jWdiK3LyS0QI7dMFXVJw3cm2FnegeXA8CNlWnjUVSOY/OfLFqJJqYrfcj57f3nAU4a88w4h10+iFBLh0yZkX50llRxgUjV0fnjyEFUDoinC1xDA9ip9IOosTI+avZPhLTC0Yn4ZGnJi4NCD5cD88+KIdRUnVZJ5Sqf4ZcCCQamtYBT8NJ+PlByYxpqJpGtLyV9BuexYC86YnD3PJau0oXazcytuXMYh/TTaEo89ZzW4jpsqDM1G/gBUq7R+QDzLElNZfw3Ov0E0+Pvfm89W+v2iSsJ2JI2Yq7wrml7FiTN0KoP5KVEBCEzDLwebnJFqa7GBaghwADYcgoZ2VX2Xtin82a3oqlX2WNfur2DIr4YURiSmE8g8O","layer_level":1},{"id":"9e3d703f-f424-47f4-84df-b99873b93e5a","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"项目介绍","description":"project-introduction","prompt":"为GEO项目创建详细的项目介绍内容。解释GEO平台作为智能学术查询与引用管理系统的核心使命和价值主张。详细描述项目解决的实际问题,包括传统学术研究中品牌引用检测的痛点、多平台数据整合的需求等。说明项目的目标用户群体和应用场景,如研究人员、市场分析师、品牌监测团队等。介绍项目的发展历程、设计理念和创新点。提供系统的功能概览,包括智能引用检测、多AI平台集成、定时查询调度等核心能力。面向初学者解释项目的基本概念和使用价值,为后续技术文档奠定基础。","parent_id":"1bb55e12-24c4-42cb-8f59-ddc303460d45","progress_status":"completed","dependent_files":"backend/app/main.py,backend/app/config.py,README.md","gmt_create":"2026-04-22T18:57:13.329466+08:00","gmt_modified":"2026-04-22T19:05:00.376007+08:00","raw_data":"WikiEncrypted:0MI1/XkBoMl0lTbK6t0CnyIiRc/FeBluVaO5vMjpi7GJDj6RYPJBK8z3pvJGG/q2Umz028dfdXdKirGdHRY2lrn0erk9nv1ZHCzuughhzuFHwcxdCPIpZdrZtQpPh6bsxkWiwYzSScq7WGo0sBeTvyoiisiPXNkFNbSjUGQOu0M9zOwZAcknYWqtf16nUcOV3lRfAFHfNSt77Nc0IUQGl1zM4BWFjitEsa6cq/jjGIh7XC2gcTvm2eWRaWDDr5n6IcJZtD0ODJYzhH9IJVk4uIXlKksbQcuIrmEWEkZBxeh+DAIp0tmgXr52zuL9uRxapFuSlOq3BlU5N3I+Iu8Fg/rBAnNcvKEwSk/71gIbFlwaxLvik5gposBrfcD4U1+MJLRTPhgg/HJwljnpTC13NERk70aJg2/SCvFZcO+86xWuLwvNjWRxc2K8yOeJggfWG6S/Dt0dGaFl5F44u6XDbQV0GKiDfNOzo5CtzO7CrkSRJ+zErGQOEEoF6UhVmmpA6ONf2YDr/z3Z5bIP5z605qNZZWUDPVLjU5elINOMi4fsEw3OYaerNp6aoSHA1eXnOJoJIMsU0KM3eGAO9QNhHE2PlkwXulCEX5l1tkohbwthcv94cBVsn64CtaMMgjrgUkflNYnfEM1djmP2iJFEG/MjNMntZCrVRGXdjjqR4Q+lRe3ELhXuHjqeU5RS+KdYLASsYBDzti2T8foSfBxxXcpMIz/lS8+Qx3pTLW3ktH5AaEtSdclWCF2HLc1/03O/gdv070KOck/8TXbyZsJ6g3fzThY7xASttVsW1IITTaX9XE52YkNOe7KOrjJwkSbUgOU1Rv3Aa7x3VJ/ac9nDL4AgS+TlYNxfYBlGkbesL+sqDgWrL268y38MyK0DRqEQVjCxV9+7aAkxLvaUXVMYIwxqAM9Id66zRb0pJB3uwgpOAIRzOCskNEghjp17p4BK3lgehkRcM9RAGb7WqgeNfl/+ox2b25Pj+nvbWN3XghNZwNzoTW+kBZxXhOTRvIyAne7IPRpmtD1XD6ZBx/C6ucQ7kTUL/7LqFXE66g3Zey3hiaiQihueSMCFVer6F+BIMSBpV+9cmAczdqYvXRnKIjQg15zwVGz7mKE4D7caiDjkAQeMUSqziw+i/S26Ont/JBHIsLpYISQJErTAl2rGwC+7ADw+H6jg0rn+nE5s5u9fxUPMsWodcWi5oGIFRRTyGeIZYSTNveEwN8h0LGwXhUlHR6RxBAIpbiwKVUcOFOKc7mojhJEN36mXsQdRyCUjV3YdNzj2Tw5tG4exPzStsjDxSn98XK42QisGde126iI=","layer_level":1},{"id":"a06436ee-1678-4a51-bbf8-b0d0ac3456b9","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"数据库架构","description":"database-architecture","prompt":"创建GEO项目数据库架构文档。详细说明基于PostgreSQL的异步数据库连接配置,包括SQLAlchemy异步引擎设置、连接池管理和会话生命周期。文档化数据库连接字符串配置、环境变量管理和安全考虑。解释异步数据库操作的优势、性能特点和最佳实践。包含数据库连接监控、错误处理和故障恢复机制。提供生产环境配置建议和性能调优指南。","parent_id":"243a1a45-d31f-405e-a3b9-694d2fe617d5","progress_status":"completed","dependent_files":"backend/app/database.py,backend/app/config.py,backend/alembic.ini","gmt_create":"2026-04-22T18:57:14.160162+08:00","gmt_modified":"2026-04-22T19:05:13.623934+08:00","raw_data":"WikiEncrypted:veTYwq2y4io5qXerCTrkkJxdCaPVm76qYvPs0DmFrBYr++cWSoBpsZCop64XjnmZv6vHv8URIJAqohtlaw1HFotKc3mK0aD3tk5jmFWmTjGEd9iSTEcB45Yccg7p5eggZzqexWRLP1afxRQPau2t5uy1dZIlExyu+lyiNQI9/hXf1UppgfCjo4u6akBIZtYhzgcUSoYY4jCjv0naBAT/PyevZQctOpKPIBwMdeB86h71UT0hKB1hXxbyQoljBYZmATJaRjmlQzZf/Ka1gnDj1s1WVsGMpSoA7jyNRPH+Ra6hR+5N8Ba5vkjxM/HcRFq282Jnr/TnidF4MF5HpD5Piye73QZ3zAvIbu8+iOSvpQee/FTzkrUQBy0xOA5lsfFOy5OFOKtQh0mHybuNqe6H5squ2Tge+K4+RKXbDCt0wptrSV+BVQ+OkAJJEtLNRpJElsQ5bw1UU6CuzbgnnEYrMXB5TMBI5N2/J6hmlqt978t04N3zVI9JnnFKK0H2og6TVu1Hrxq/xEB8RFWTf/WNN1p4Akee5r1uOuUry6hsO2yQUTlmHq74QnJz4o4YJodWkhwAmcyzPIlMeSFg/Kr/EvsQJN4UprhudCTvNitnPaBesVkucYDYQiVAhxyNSAqCzZUYXbyuLD4r5DKxKzvHjkhRugm73yBM7wzbxB2lABMiGM9p90FASIxS0SfzIl4qrFbO/oQGRIFaYfUCnQF8h0YDi40UX4/LVmnlT/L8y/d+hU00P5j5PI0qOyoRDqsfQZFaze+qtibkMnJ//iy0Awl0wqQ47SxaB0jhTc07lPFBLSHFSoVUaKDs1DPGiwKjpWZRzAw7rbv9NFuV+irKc0l8qDNCaK6Rk0rRd0ukFuszcaE9n92URbvv0Fk8XTHLr8sFAh/xMm63r5hUAuqEYN6z/Si5Isq52UmJ1/TvnLYIUK58JHTuDsVn3MKJ2fTgUw/U3g+N61WpDIgGvaHO75crgWZbS9qQyDoSSj4wNdxWR+wtmKjwZdRK44kWRBS1QebMTLNYDBgHD5hPnmOa5W/Rx4Y0QBw6UFjCy/GOmDI=","layer_level":1},{"id":"7fea5a24-e6de-4003-bc70-9dae6d8fdb25","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"适配器架构设计","description":"adapter-architecture","prompt":"创建适配器架构设计的详细文档。详细解释BasePlatformAdapter抽象基类的设计理念和实现细节,包括平台名称、平台URL等核心属性的定义。说明抽象方法query()的设计目的和参数规范,以及close()方法的资源清理机制。文档化适配器模式在AI平台集成中的应用价值,包括如何通过统一接口实现不同平台的无缝切换。提供适配器扩展的最佳实践和代码示例,帮助开发者理解如何为新平台创建适配器。","parent_id":"7e66719b-4a8a-484d-889d-10fdc76788bb","progress_status":"completed","dependent_files":"backend/app/workers/platforms/base.py","gmt_create":"2026-04-22T18:57:14.592407+08:00","gmt_modified":"2026-04-22T19:06:14.01609+08:00","raw_data":"WikiEncrypted:mEeeU1uNqYKn4jkG2zPtuGBVTFJMKL8+aALSFPkyoEYifQL2Z+klmgmPGyzF3YlP0xw/C/hG8jzgXcVjqaWbA8lOQYPPvd4qFK8fszqAYs/fYEHXvWBVaOTbFhjNiT5k+li1MqVRx7SiaRze/N6NV4j39o5dfNAouxnCXgLyBZdG5QXj6JAfhJ1mTHsYQFDmrIU+nOtrQvRh3bruUOURVd64c13kwbBISJKHVwByRrfqWLRTsCLXPYfsgZF4rkL+Iz9x27Nl0VXvNcIIoMXj9B7hg2PPcQlmup4U8y2LhUHmKrdiKpW1t+XZ8rpO2aPKpzr47rn+3n2axWoQIDjWKlHAwi5AhxgPysB/i5EGv0pvgo/mNNIfsZlmSYgXASM6bgCzH5W4O4oJVqOi+gaLuI5+i7N8/+s+FKb63H9ZNvwClw5jXJe2Xm1YUwVGLG8KX5beKRTmBgnyDPmOW17/OXwsWMWQSQKrgpiv+2C7VQqI8X/agBVWawLJAc8VloY281S3ZH5LTa/6ajeGUVXiwpWSD/YWzo9sxLdws1ZXCInzLYy5vX7YflgBOlw+pn6Z901TBktq5jxrG3CFTbRLGxaeG1aJ06sLEFoPzLSXIIiEIuAROC6lPr6XpYAKESgWGOG0GdM3BinxdkriGn21ZZjENIJ436aZjsOiE5M20/kJAnjWIBPEJ/sv3nsi7u5iLfYFvkus4GfnKXJyto9LWiTgqrwHoEUQy4+pnVW+ce//iLlM/t0ZknimuBfzgYSWx/jPc8o9ZU5OIserDAYGaE4sDZIDQas1jOq8HGN/q4wJR7sW7Fw1jKyl4suQZE6QSfYx6molnJ1cSVKcsGrf7AHDKM5x+uGRmLWXqMMUZXXtbbCw0mwqfxAUPiRLUdVyzot8dh/NIWX6B1KABd/kKs+L+vVuCmMen1XVfP72Uy91fYOkBj/xPkA6GYrempnrB6zh6INdvGw5dEKlvNARMnZZLCA64Xw4h2TBjbkIjsBawvJtT+wEGkfkPk5z99jbaaGS65e/JDF/g5WNnKSX0B1Xo+frM1AFwnKR4dIJXZ8=","layer_level":1},{"id":"78288302-33bd-44f7-8b29-24f516c8b6bb","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"调度器设计","description":"scheduler-design","prompt":"创建调度器设计的详细文档。解释基于APScheduler的AsyncIOScheduler架构选择和配置,包括调度器初始化、触发器设置和任务注册机制。详细说明调度器的核心组件,包括QueryScheduler类的设计模式、事件循环管理和异步任务包装。文档化调度器的启动和关闭流程,包括资源清理和优雅停机机制。提供调度器配置参数、性能调优选项和扩展方法。包含实际代码示例展示调度器的使用模式和最佳实践。","parent_id":"7416db23-312f-478d-8883-2fc3c41ac2e8","progress_status":"completed","dependent_files":"backend/app/workers/scheduler.py","gmt_create":"2026-04-22T18:57:25.383156+08:00","gmt_modified":"2026-04-22T19:07:22.171607+08:00","raw_data":"WikiEncrypted:Ixm4kI/Z7v0V3JxitGlz9ZcE16c7bpwHYYT05QZRkQpqpcesze5XUXS1vkiVEZxtNobDh2UDQ262IRWHPAAsEfjffD0RXnPHjavBBNWFb55SS8wVV2Rm8qd7oVzDBvIVleBJx9ucizitwm2GR+t/zrSdfu/UzvGrffKAHLxZUN3s9E/3BLo1n+ImmJ5dx5UCkwVkXSzRKQAMfuIsH7ma+0I71aPP4I7dEiw6qsvVmEMkNxEr++lMh5Dnb5VgV5vajcBNj0ryBY+/GPzHWk1n5VS1l7zWR8cQS4bF17Gse7V/kjmebgHXeuF15QchHtqeN80YGSckXh6FvN4l+UAWPIoq0JKn25d4owSwjXjSpulylSlauIyNGCF3tRu8nKJlAin/M3iM636BZyJfj7q0PSxmh0Ftm6aHzsTPV6/t2nIaU6GykmNuYnPJBlmMN8ESL5uQVNFLG1SLfXVeME0V3yt6x17pfAw6u7Gy+ZCv5JbVDVkLi4wb4s6WMriDfmpSYZR6GN1wH0tP/N+ion1coTaOCnxsG5GG0QhSuXNsn2cTNfgu8H7kf/34F3OJ90+zqpfd+jgzlFcH6kOMEwW4fNvpgS1kbhXDLvumYYyF2HQLViSBNJMMOA1kdWN1zkg9b+nPACXFB5p5BaJwP2Knh6j6CHP+/exmzFnui0wsMSOy/5pwf/QXfaDhWZfXWMVaOZlG5zB11FP2E3auQLNixhJ3xGJ8y13Acb6oQu2SH3GcTe/GdtLF0yD4utctwTrXZGbe+gPjopDqmmw1vBORIQ3c0FlSSzFVrDiPydc/1RVFuLEm9Ju/mP8NtLWQh5vEClbIFrP2IyDH3EQuIQTBdp88+xasqDk9GItxnSgEKKSCKA/Mh6tW5FnUV7NhRtMcCQVTk1QCoRqzuxs5TIcLS4IZcjW2h8HYA9ai6ciOjWbbCoX7gOdogk0UzHdLZkIN0KNI9ynsGgKcvqJH+9+OpUYonXczqc3ZIr80LaNunN8cg2fpq04dAFKFt3JxYfc/0FXl0OogP4Y4rPnyi+QBmyQeqyaNPZgqcXxDmENgXrhVUp8O1YTalGtL4AbPfpSeWLWUYFiKpnKp8V2OgCdMSHz9aKwcwvdbaugwpBNWMGk=","layer_level":1},{"id":"b027f234-4ac5-4d6d-9b38-afc8054325f5","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"单元测试","description":"unit-testing","prompt":"创建GEO项目单元测试的详细文档。说明各个模块的单元测试实现,包括认证模块测试、引用引擎测试、查询处理测试和引用数据测试的具体用例设计。文档化测试夹具的使用方法,包括mock_user、auth_token、auth_headers等测试辅助对象的创建和配置。详细说明测试断言的编写方法和测试覆盖率要求。提供具体的测试代码示例,展示如何测试异步函数、依赖注入和错误处理。包含测试数据准备和清理的最佳实践。","parent_id":"fc6f24c3-594e-4153-854f-19250834eeb1","progress_status":"completed","dependent_files":"tests/test_auth.py,tests/test_citation_engine.py,tests/test_citations.py,tests/test_queries.py","gmt_create":"2026-04-22T18:57:25.616384+08:00","gmt_modified":"2026-04-22T19:06:55.090058+08:00","raw_data":"WikiEncrypted:oQ7VNoYBl3ApU4O5/TGa/YEO9ObmRNw6knddpSF6M+qfBokxpt9FAn5Oh9wXkjVweu6TpLk0XawcRFRcQ09Zi+YnQyN8+4Ep9fANKzHyAxzcnhkI4VZF35j3DwTbhekUFTKQ+71fms4SP6LGrVw+8IP/eqJC2TH96LJR1oxckQk//yfvKqFHsMLgziXy6zrXuQO8PIu5U/WbkKUkJHWSkLkoTtPteU+WKljSMapCS60e0RUDWZEPuFD2uupr2PJxT8AoOXx358C9XEj8tQ+OwHpsBiR7NdmO0D3GmcgVUcuU7WWxnToWu1UM1d/t4u+x7bIQvHQIDjLWR40nTrvBZJBSSiui0he3T03jLkIB7r9kxCpm9mFUx0fkmUSWp7FRfs7MfJkuoQYVU0YHf6/FF6g/PoQ8ieyqr4YaNjM3kk8GirHkmKjfdQt9YmQtuzMWnzUQ6COtN+BG3STyOvO+12YQAYi5LWe7u7oP4D7TJRReg7FeLDQ60Y8KEoKBJKM051F7pgHlorthWz42brF5tF7oa0tjB4AtWaEwXdCvH278kzwHNEW9E5zeERzX3hlHYL+mKpTbemJlfuHuRugCRy4EKFRP0RYiIUecBK82Pi4Vi9MGjB7cQxIEutHQ/3D0JNLGwEo5TCsk4W3isoF+mJDFy6/IDwgW/+5FIo7V/G18dTg9YbFRwMecdvBfJU5QZV4R993bdx+kH6qB5IoJrA0AzBOCn99YQ/xgAd3w/82Z5vR8syeNZjHYmcx8P/XrYDk4UZTwaacEHfn7tcq+tL5qJDbxdY95wjaWRo9giFE8woDfoLWstvKA1/q+YOyDsIHC/uHjNP1L0ELPZ9ssFuHcwLVrqDwlcblya4+oXlPEOH2ar22uXNRmFyd8Mf8MmEWVZklodBHSKiGUlj8eSWqtR+Cw5Am1gmeUcOxqan5YwzpyXet6g5ll12dnu6ItLby6qm+kjET3rsjaJag7UBlMXWV9xn9Vj4QDK8USPTTWkRUEAj4WH9QqECQzUtYJ6+GsIE7LGx/5tzApMdX3BThIiG8C2k5ry3z310nAMX/pTSrGFGjy8tWFf+KH95sJ6aG4CDyxSPHT/3ivhXAnKDesNYTVgSIKNmAUcj5hRjTfJeGyljB7NEs6Gxz0tf5k+GQLwvRX6PxSnMGkm+q0yx0MNDRBYJNlPCFKUR74ZAU=","layer_level":1},{"id":"940e5918-1689-4001-a284-44f2de75b8ee","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"认证接口","description":"authentication-api","prompt":"创建认证系统的完整API文档。详细记录用户注册接口(/api/v1/auth/register)的请求参数、响应格式和错误处理。说明用户登录接口(/api/v1/auth/login)的JWT令牌生成机制、认证流程和安全考虑。文档化用户信息接口(/api/v1/auth/me)的权限验证和当前用户获取功能。包含完整的请求示例、响应示例、状态码说明和常见错误处理。提供认证中间件的使用指南和最佳实践。","parent_id":"dd12cc44-0c95-45d5-a726-e7b8bcf2531b","progress_status":"completed","dependent_files":"backend/app/api/auth.py,backend/app/schemas/auth.py,backend/app/services/auth.py","gmt_create":"2026-04-22T18:57:37.836287+08:00","gmt_modified":"2026-04-22T19:07:12.356456+08:00","raw_data":"WikiEncrypted:uxAckj1IXK2TQH//kEdeBPmScopsydAsQUjZb8Fs6jI7ezX3WnM5wMv74LMiw55tL2+YKxETbMgwkBQYqIg1VTja5IjBYqljlAzD5l6SrkKU835vZQoOKlYgIFEEXj5PMURu9+2Om7SDVgjbSQ05vLa2aVIBV6PiVswRGc5EGTGtYnV+DJs4BxHzYpH0Ac7KkyHUCGgH6w5QDaOxWt6c5gftFmsRwr8WVKANmqlNU9uhDjmWzjTtSqZ39EVbLd++OjVbpLbTtijQ6gOF0KBBS4B0N5k+Xm2/gDv+HNK9kZ0BphZE1Si3NfV0+cu27HLJ2XV9w357rte4pplU0wYG5oC6cuO7eBFxQdCR6e+ejXIvKGahQOce8d/jWexjfdWnUzvQ18PU4+bUZmiP+YD1dJVBFgxggbCIHG8VFTQBqMaYwc3NLWogjXnczII+Z3sLLneLkVAQEdQ381GeRKdaD4PrtAWp1Ss2QpGHWUKDdaNSLcfm5NXEe6GeECxXH96p6BvyegD3twPfZmY9WKG8YOhXqbpzae/+DXnUTfldYKnMfbonSav0nUBYt8JA0L3oceaNs03211fvlSgE8L9vtUDtNF5lHkhOLMLbu000pe/VWc8WVQRbCKd8KPd4TUxMkB61vQNIcvlRKLMJLNSnE1VftRTpdEpWKhm5qkLfOfikgsp2qp1iSw5Idpu/TLQPIGN/sYpTJ1eACeXt/A3qrlITHFV8by4utTXDT1gRQQ7j7n51fQHHEIbpU+6CRhSBBQfa5IlWAqkarenBmr5RY74jeX7tlhDhvFojQGHYyMaDsZO8G/H93/20YG/li4iihHLIYmsN+2YRP/KWCNaopBGp7tRyZi//RKVXdHGteWxP7vse7URwPhfmHDUB6dMExCT5PwgsYoDwD32k19Eauv4c6OogAMMUN3I9rhSo3V0cde7/xSOhJ34SUY3w9VpPAu1I4zTqhY649YmBnNEjtGLZGTnEJWSdneSPsudvl1HJKg6faq1dMy0dVkMqbHaqMCooFDhiYVS1AM1cG07y9rQisvQP8Ic3NTPAA7BhH0nrPnLc615Jg+XEAjs3brkNXEVZlxNvX5ZqMCoMqsiZrA==","layer_level":1},{"id":"6406f42a-e10b-4a2b-84a5-0a21c1c759ea","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"代码规范","description":"code-standards","prompt":"创建GEO项目的代码规范文档。详细说明Python代码风格指南,包括PEP8标准、命名约定、导入顺序和注释规范。文档化TypeScript/JavaScript代码规范,包括类型定义、接口设计、模块组织和错误处理模式。说明前后端代码风格差异和一致性要求。提供具体的代码示例展示正确和错误的编码方式。包含自动化代码检查工具的配置和使用方法。","parent_id":"2148d7d6-25c4-497f-8894-c4eb7a0d2bd7","progress_status":"completed","dependent_files":"backend/requirements.txt,frontend/tsconfig.json,frontend/.eslintrc.json,backend/app/__init__.py","gmt_create":"2026-04-22T18:57:39.373374+08:00","gmt_modified":"2026-04-22T19:07:51.274139+08:00","raw_data":"WikiEncrypted:Gw00+yNdsAXvNpUHE0sZ2+QbHW33I6XBnIRt1QjI/FW/5OIgpgiMvU/f+bhXrxoZK5Mgo6YrGuAKhtZ2BPutU1EdQeDFUnQQxxqSupe1WUkFgEECvCkbZOAHimRWBeUutq2qKCfVhu1+US1y8n87OZXUUvVSAksZOa8lbb2AHyiKTMdzzPThS0D+8uOalkBg1mvJCS9fqVoZzY5BYYpuH5eZJBglHbA4uMbdFVTSKVFfHaJ8nlm6uYjaY0sJCSg+dhEAIiMfOTXP5Bh59kxWfLSdZU6b8oPvLV0btsiS22/oEJZI4rWjJ0YTxfQ4jRv348P+GQ6oi1pvwveiJyOxLq8QcVKSiDxO55Ovd76PhOgpOp2WJcUsKoKBoxs817utm+Ld0htpPBS3V90Rw+suMSPCU0mCa80FTrBNn6PnXemH7lH1ozQIu3Y/AGNYBN93acBxtiZ09sGFh2sO9mbbCU0iRuNe9nwWa4MsA5rJMLGdRbyv6jk03+sAvuKwZHXyTWxqeXvMatOUKXzTNfmhXsE+Bexe1vaukG22SWhsXu7FhIaH4Rt7CdpMW0jjbZOf4CwKY36ucVBRwft6ymuED4ihzikPz7pJ5IEuxLGtCyt5QDqT7kbv5ITx4NM/Q2IMMTRZf9bAZyN64PV2TJVCNK11yU+cE7y8HFBNFSzPfDBGFmxijKjTL9MvlElogPp0+qckxGclnip/IOFc6/WAbPNK0qXq98Jq5DsZwLsx4//8yOyRyaQGmOVaOWxb3Aum4RIf933X/hzoTFpV2uSLSznRyCwLpKqjp2zMS7lCj9aDhWLcx5J9NxXfdxFVxBsapMeDDl5xR5nfTFJcOFylsdPxEdxf5J8ULB77F3OmE8Hff/40adNMxJHMyBmju99HNnMZkGLjC68HEPNMZ/6T0+m/Sq1yHOrakYMiw6vnQvmLW4cBIhsTFbhbgpkazGFTk8xsKH3pGySrLXL4xmadfs/g2X/lRrLbSonWaQehTqHYrhz4HIxrTUDn4kdxaPPDhH4fHdEu/69Dri0DSzmSF2m8W3hh1gbAbUO/mbHob1eJg0yKGzyh8AmvUlwXIRGrOwQA5dUZNPSo+oCcv1qlrQ==","layer_level":1},{"id":"e8ec6ac6-ad1a-4332-a7be-727b47d71233","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"Docker容器化部署","description":"docker-containerization","prompt":"创建GEO项目Docker容器化部署的详细文档。说明Docker Compose配置文件的结构和各个服务的配置参数,包括数据库(PostgreSQL)、Redis缓存、后端(FastAPI)和前端(Next.js)服务的容器设置。详细解释容器间的依赖关系、网络配置和数据卷挂载。文档化Dockerfile的构建过程,包括多阶段构建策略、依赖安装和运行时配置。提供完整的容器编排流程,从镜像构建到服务启动的完整步骤。包含环境变量配置、健康检查设置和故障排查方法。","parent_id":"803bfef4-3985-477e-a61c-915a246d0061","progress_status":"completed","dependent_files":"docker-compose.yml,backend/Dockerfile,frontend/Dockerfile,.env","gmt_create":"2026-04-22T18:57:40.354835+08:00","gmt_modified":"2026-04-22T19:08:34.084609+08:00","raw_data":"WikiEncrypted:h7ADvj4WLJHyulzCl+z7kNgZWY+r5P000yRKX1NQnlv1Xv3Dqgu5Ve8V72HxPVQrbKK8WU/ipQ1PAqV6SDrNgrc1Neea6KoTKr95imYAh3dYgIt/lZ1sndBbQCFqOF87dQsUIEKQgwrsicAeQ0zdudUWh6EW2nyIF0NGa50xffbgEr1mm/MThBZjOua+YnCRogCbgtirEO/6HGlC+I33w/bfFI+rREYKdumqUEia0kUP0pWSpwWjOQp06I7cUoSrx/LuJJ4in5YsZetdjzxdbA3ZvGMjeyI/VVF6UC/QUOgE2csP9z42v6XdOOngM/coBHI3DiUrroBGTPa6BVxJdngItCJ9XcNvXPbo0xMAkAoUKnNPA72B2pRuk4F1sTiOaSCQ1jaMiCTFvbj7+VleaodRFLDFsYa8f1w2FkiW7cEBhFpFgB7Qfru+Yi11rpkjnM2def+Sqq2PSHQ+Ji83jPoQXFl935rDQbNUy28wOIE3BdWN5jjM3nyoXcqKjPVjLf3cxGvg/sbdWk1FYPMIsbK/DUWayyTHt6L/fYkDQYjY5h0H6Q0jBxlhNQ34GG8kEcvrZ6Dy/jtCtE149pi/ToeMbpPq21c5KUhs9OHcEHgMjxWMaEVjQXMjFCpKyJIPfC984tfoZhAHi9WupzyEi37/igcgVJnvIdtadpX7uRxW2JCdfoHn1H87nGQj4eAeI3kMhtJ3EIPd/D6STxUcgtyLdTIZu9kgvnBIN4OyZeI1ygNZfawwQMmbDxHZ1pPcyZDHFlz1HZ0NFX+7VnN2b25TJP2hxMCZ/5OdYeSLozIbM/azA8QMHofESSdxDX9ZDdhvENDlngxUBmxM8+yCAWHENGYqWDL0gZMMDwe89n48Xy9qnKNLX0ROfG4FAtoXsEgLlPQM3AWFETnzr7Kvuma+8sY1iaMVIXJ/MWoy1zLwuY/oOZhVqGLX+DOEupKhk1oQmiqzciCeV8my5Q6LQeriSBww4jA3r6VQMPzBVzKJYz+TLizB6Esf//9+ilsgUVUc6GjD41Ml4fb1GZO3PzxGWrcX1RUE6RKllUBVNffxzE2WCirEX4e4YprntsHu6SAb9TLIInCx7aZnlVnaDQE5BCiHLjIQJnsHHJzlBm+8jtzE4zi7ljHLfbJwhtZ9W6S9KGUqjjNryjTVnVyYQlumOT8HCAkz3fSM6MpXwQr1qz/gHyDrQanmM1O9B/0ox5O2NWcOm5qtsteiyxwKACdyxrsUx0X9BaU8xygDL75XcTfcaOTcICRwaRZF3/UQW+zhbJo9LnHxq30JzTbxU7wEdjpWZQHZ+tu5BMrIqi4=","layer_level":1},{"id":"a91fff3d-ec5e-43df-8176-22f0084109ef","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"功能扩展","description":"feature-extension","prompt":"创建GEO项目功能扩展的详细文档。说明如何新增API接口,包括后端路由添加、数据模型扩展和业务逻辑实现的具体步骤。详细介绍前端页面扩展方法,包括Next.js页面路由添加、组件开发和状态管理集成。文档化引用检测引擎的扩展机制,包括新品牌匹配策略添加和竞争品牌识别算法的实现。提供UI组件库的扩展指南,包括新组件开发、样式定制和响应式设计。包含完整的代码示例和最佳实践建议。","parent_id":"b2bb2e3c-5661-497c-97dd-15bf6ee8b7d4","progress_status":"completed","dependent_files":"backend/app/api/,frontend/app/(dashboard)/,backend/app/workers/citation_engine.py,frontend/components/ui/","gmt_create":"2026-04-22T18:57:48.684421+08:00","gmt_modified":"2026-04-22T19:08:25.140739+08:00","raw_data":"WikiEncrypted:5RlNBsIi2/3o8ATlHuzaYD9/6k0SjLB2nW/cTN9Sp7ydYLe7mauzXPQFm5pYVoY1D1K/aULghB4g32vyxSUIsHV6NsxwYA/5+FQ8w/4xsQc3urcx9OEKeSC0hGU52WXucdAGjiEq/f4wJ2c9FdJEeALD6eX7MltcooFsxAVRWIKzHsMdBiy0RQN6s7vv4sb8vpV3b1ET27D9QlTUiTPU7RgtJLMui8iYiwJIirfL1TgdGRSx0Rr3tY/JvS3/6/L6VU/69BKglW8DnLwDkWKuthI/2sfWQa+lb+uTuixXL/VbltWQnzwjMVYghhTizEEC0xTpFGcDY/ajvLcjy5+wSleNEr9AFy/ytJKkpqEO8Zt5qyVJ4eANJMSXYcoKrZEskjVpnrPEHGdOzaEaCqcl2sQYkXde8LWM29fWmwlMjwJzucGwhudoQLXgkIwJnD+jb1r2SdjjafTI76MM53AnSfD4aj8K26yrOkVtoD6nWG1A1fG6F22pPBhJdezNJCYuKBaSDxJDES5486L5Gm5RvjYDq4r6RZ5CheGPgxl29XjCimgWuxXKVX0jPLUawteo/Vo5D7AHzucx2dX4mKr4rSSSHpD4HGdbwnxZ717DkRG01vTOnue6gSQ7pceMjSZ6TnB7dvtwwarHBKQMKwJXrpqxc83aZQjW4sRTAJs2Gc9+11c7qT9fQnGK54JJjEARaQZVaDmTpKmme4SKKxCB7V8yUqR+D+swVuSjIpYdL1m7THJtbWSSLaKkWmYiom1C6qb4GIgO4CT/IiFSyQ0Sz8MUIJi/dK0l/vVmpp5p3IF5K1m6NHDX94yEPWEHsWIS8eC2B74AyX6PG1fWSt7HpiBAzq8nu8n+IrXPqDege5sXbjfNrbvkRot94AvLF2aqMbteOUGOZxMLASQYyfRQBlaEEFMiKEVNTRSaHqiS8mS3pG6XLcV7TkWJIyMzhcT93hKXrSB2+jLa/rrxxrZwfp6lddgEcV+XZzQU3KsJf8blNUd+UkA4TcwFugu0um1Kr6Hro8EHAR34+FGMbPskEPPX2yd42YXx6qfmcFrI1xvHIQfnc7QuxZwO6GHR0G5LiPtuV4ZSxklXCwgnGWy1lpC13xANNvM1UKqAuhpuV2qU+xayK5IQv7kQaDOJpnMzFj/dSxtRgL2Xm20nH4BA2lhBCQMqeM5OxJ5vzwVlgVMZxDbhwrRaDU6cudgNfRJDFh2lGQqE2flEkvSF7g87Hc5H3qDQxUv56qpdOPJcgugKJtT3Jz4dNt3+eojvEwrTUc7d2Kq4KDTFUa5jDr5uo9PZhNR2TDJazpNIdl1x/64=","layer_level":1},{"id":"e3ae8925-4862-4280-b85a-0b376841b15e","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"快速开始","description":"getting-started","prompt":"创建GEO项目的快速开始指南。提供详细的环境要求、依赖安装步骤和本地开发环境配置说明。包含Docker容器化部署的完整流程,从环境准备到应用启动的每一步操作。提供基本的使用示例,包括用户注册登录、创建查询任务、查看引用数据等核心功能演示。说明开发环境的调试方法和常见问题解决方案。确保新开发者能够在最短时间内成功运行项目并理解基本使用流程。","order":1,"progress_status":"completed","dependent_files":"docker-compose.yml,backend/requirements.txt,frontend/package.json,.env.example","gmt_create":"2026-04-22T18:56:47.081987+08:00","gmt_modified":"2026-04-22T18:58:54.237875+08:00","raw_data":"WikiEncrypted:qfgbutC7oyxR6nMxrwk1ODnNMBEQ3/sG78fQT1yXWju83LC7H/jAM8CEAvWT8huE5OClmQiIfNYNxHQ9s7RRS/GGSwI5DTgXTPiPdxvdU9tU52Y4wj4FfVrOtqmH0nMPa+EBKH1Wo4HibSewimTkeCuJVAAjyygiPePcftR4ud09LKmopy1NSgZrtHMoDFDwUOcNJQad4OVgxMnOi6B6z6s2Oh2aPWNJX5EvE5xGkLAc6XvhE2T7MU40VJ4lUOoKlCNZNdI06grEqwyizBqt13Hg20wonqeQ1uPs49UbF84IJecH3DmE6KW3oqmqvQY6tztk79eE1bKZmBtQKXz8WhEMWZwALTsVk+hkk4dH/fcDoLteR1iuO4FaxDwAOaD71KF79AaYxDZiM/8RER9YsajjGSI+sfpJALuiQbqqfKbYFSgliiUcf4gTM20Ey5rtfBkcvBY6yOBPpqdKg7/ls7jdggNEWDJfN+DPVzV4SGAYRD4g/kDzPa5vaNZ6USRa7hVIR0SJufX0DGSdzX5BMh5DQEEyd9svxV+bs4KPZphBIeqAOzvo6zyF9l9LjPPdEook/uTIBHjGgx+8Ck1NQEeNOs61Zqr5EfISope1Au8dYCrzwpr02s4XAb/6bYsMSkfVqETlSSUkipDodGoLJU8QiYr5Pjv63Bb9Qb7SZ+i7NrGp6UJNVT0etywEMKSQn+73I8e9AYrAxlN5ST6K5b3W7cOPzFQMCVRfzvdd/FbuN30u7JXlFCnm6Ee8LDHW6nteOxBP1D6JxbrQirCQE0cSuk+d8OR5tR/DJiRDcjbsG38KVBEqWnIek8KlMGxEt6N3oq2ceUCCLe4jVURPc/2G/6gNiyVq0dPPAVwjaNKNwtiyaDhhBu4T21k9NUfhdQNz9DJWD0wXuaZc89RoqLNlCHJ6TtxEHJ/Sv4cgvm3QUierIBIqUawkCMEDn3ZEo7L2fUS4fMlzfpHSgTvxB43ta+H1m6syFUmAyh1yqfXVxKZY0f4JtmBbQpNzpT+aRHMKKQ9UVvtjvNcpupzO5aNkyclJVWis66DMtfA1H4am2gseXSfgHHtXiLfOnGoELSM1fLS+T9oPt48v+RPafJQpahtNeKtZc4dbTcsc4qlS1krenNSBbkKac4Zsosjv8xHuD1aqYvAS476XT3gjLfV7YUCF/+i3PiovD9NGzhA="},{"id":"c19260e2-5163-43d4-b35a-b48aae995f4a","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"认证系统","description":"authentication-system","prompt":"为GEO认证系统创建全面的实现文档。详细解释用户模型设计,包括字段定义、数据类型和约束条件。文档化JWT令牌生成和验证机制,包括令牌签名算法、过期时间和刷新策略。说明用户注册流程,包括密码加密、邮箱验证和用户激活。解释登录认证过程,包括凭据验证、会话管理和权限分配。详细描述依赖注入系统在认证中的应用,包括当前用户获取和权限检查。包含安全最佳实践、令牌存储策略和会话管理。提供认证错误处理和调试指南。","parent_id":"7c2ac186-ec90-400a-ac1d-b3b7ca2f01d5","order":1,"progress_status":"completed","dependent_files":"backend/app/api/auth.py,backend/app/api/deps.py,backend/app/services/auth.py,backend/app/models/user.py","gmt_create":"2026-04-22T18:57:02.317252+08:00","gmt_modified":"2026-04-22T19:09:25.682207+08:00","raw_data":"WikiEncrypted:uxAckj1IXK2TQH//kEdeBLXlO/kfAAqZjShpoDF/LwxGtmBqx1/zAvbXhqcBr9eSVupk3ShQQ44G7JWTygjRc5A2FkInV0uhQsYps0bWsiMbDrwt2AOB/ePL1uIbGoc5ApUbCip0mBf0CwqN0REsh6d830HtteEtKfMMtm5qouIOd2wK9DTeKNNZzGx8w4gSMIpsP5p3aZ18VwD5MWsgk0ypEVodI1RvEcxesO+ct8/yxvAtUoplWhOhExXvEaKsye33rOjbpp30RA+c4dB7CLQLITqpn+wxBlXockOukSc1TbsfdPYx7aBemMwYLdSg5BxjQI88UeuXoj57ax7r3FRkTkIghjXxbpJjAP34rD/Nr6kFlE1ffpnhtqKEcaewGDTam7t2tBNXaqUA5N8gM7qLaJb9G77n5LNWkW3BEI+mzLUgjH8bKerBwqmGZaXckRqWq434EkgNrsUu66RE0kG2tkjy/QgzBqBI70QGpe3lzfJc/eka8Ylgo33DJxnT2gK0imqLhTVjYuKhn/Tj7eKXmEAK+3ddYoLe7Zd1+mAieLK3NzZderogxHrbMIurgTqPWwKg7jvj9pWgT91c7lOpX0hic2OLS+T+g3bMEZOwerdtpByP9pFeu8mniiEJ0k85mEf3l3mL4Y92IJrF7wXc4Sj901JsHKGYyqErz9wUOQ0O5F2grtL3fzSQmJGrEjFXWDpUtGhM2ModNzXCBvm89cgaXU5e9PgQuweMNqPDDcnHhTYQk2uYXAKqGQ81DjmEhEn1M7KEi6FAfh9PIUmxY5Mjw/rUqRvzp8qW9ZC5i0A7VS2KF1YEati0DISkzNcusWc09yOCp3XQ2psLue8MbeIv/A7KoM+FFCX6VwfVIMZmoD9LlpO9Aguy8ZHr+wBKAarcZthLZKxBzgWwddU4ksDMPljtM00iT9LUvs4bU1kSB1rYQcsNJTlTvnl5q0giQTn8gAPr9eNv5ugyPpOxhcSiu6sLYwt1avmvC/pShZjizRD3Ao2wDAzZD48iyoPVc4yu/0J8HjBd56+9MV3mwWW9UGW9js6s1nyrzdsxZAnh9QT5dzYdPRh1EGz7MFqLA5huIrW73zkECwjcRtve3x0tGptO+D2RRvzbYfGJJtVYIJXEA9o2uRs/E57K+wAIXK8oxDXI9+kFys6eoRpHLIduIlmPUm26QJC3WoRx7H6SRfEzvJ8H5b9wYPnjpi0imunk+Lp0qDYT0aSxv1e7BPBJtAxVo4ztOJiTlGapy636dj/I3BWq8Cy3+srfaCykZ/0NCI0cyYtyk/4smftd0/fapjicm/RDEG/o6VGqlhrNuAYuG79wZ140mKvixWDJv+djOQlfglxDlqgsuA==","layer_level":1},{"id":"9b71fe02-5927-4a19-8db8-66eb129ecd9a","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"认证系统前端实现","description":"auth-system-frontend","prompt":"创建前端认证系统的详细实现文档。说明NextAuth.js的集成配置、会话管理和用户状态同步机制。文档化认证提供者配置、OAuth流程和JWT令牌处理。解释路由保护机制、权限验证和用户状态持久化。说明API客户端的认证头设置、请求拦截和错误处理。包含用户登录状态管理、会话过期处理和安全最佳实践。提供认证流程的调试方法和常见问题排查指南。","parent_id":"d907a8eb-795c-4060-9cdd-50d31cf39be3","order":1,"progress_status":"completed","dependent_files":"frontend/components/providers.tsx,frontend/lib/auth.ts,frontend/lib/api.ts,frontend/types/next-auth.d.ts","gmt_create":"2026-04-22T18:57:04.21635+08:00","gmt_modified":"2026-04-22T19:09:48.747579+08:00","raw_data":"WikiEncrypted:BenkIlLPgjbiADCpekIm2LnLFWkzmPKE+C+tunEqC7EVMaC4hkq7YX8EJXa9qt893SobX5KrGOKV9QEeDplCQkFx4neCRj4kZkvt/lObxAfDgMBruR7HQAasniGfUhUjW5KYXC16w7brsqCWR8CWKDQGEZiduwEsaDjAZy9TEu7PlK6Cp8RhkPZ9jhN/YjqaxTAq5i4xHmQz4VuuV2SO1LedFcTlV12iJH/vTW0vFyXgJqY/Ql6+bTZO2yMaEWan9rB7e+IsErvp40JaC2xqL7fRnfroIwQssGEvaqckwf2qyNjjNCcewd62C6FVDnxJOLjQbizlBKmbb8XVzuRLkECZVB1edGJKnDV6FkOkP9y2Al2Qtpbx/1Uhx1Lo92eRd57kA0Icc/KGcHKRjNsW0HfYWAtLctTH3fNIwtmND/J/6zKK4UdDJ8sXiTnjiU4JhX/fqW8bl4FVo8F+kJYUIhbJCQkl+qlYh/MkTCmyG8XukvSZGbvWMPUxyU1gMjDxUnyVdcJmFFt15oXI+X1CL6ukGEn1cRRDiB4yRAq2GR4/iUPUFC0d3aqeRj+ryjr6Cp8YqrHfONdwZyWd4hS8RPEP7NeRuD64yNRSDFTju1oPvBfROcmunn1GaAmw8dV6KtXSJnM9SaiqnYutX51ah9psTgX+UxTu7EU/ijnQYUnDLg26m2/bX4Rhm4MRyE/fAwzxOKEI3uIaqyun0W3lgdaF4bWTwTblet2a9rBOwbVP1xtJ5M095JzboruOAhl29fAT9iO2jeqpZBoO7zBim2s8cpkCt/Zf2Edu2CeUkS180PzKCBtnq0FpPLD9hjXPsn0GjtTEbwO6lSl9JdJ1+J03tiLVJjRTZffLUlA2gM3tucbJOfyGdAom4yffwP8hjrhTBeEyLwKmLISNARiKuE2Cm671yMn1pmt85Vu1rajq9L/GeJdoPPL+4pw0dk8/Oydx0+kOg8/Jyb/8D+XobOK98UfLB6gCaeqZV/2EBEumn1xdhcDpP8cx/kijjzPmOg+tlXa5VzG6SpcY1zw1kYgyEbLZMts5EHUFYp+UCNixZleiG2HvEN5v2iuXOdcZiguCFkQLt9TkzO1v99jj08p64LxUkxY7ovJoeanwleMMBEAI0vWrt1+8nf065/WLA+s6zQWMP7nlMloMXAfMybSF/he7s2xGsrnFXqR0XBU9qRnrLY/9IcroEnKTvicyEUylh+wG8KUQcIJj+fOEVqPGITla0i+36wx46XgzdRw=","layer_level":1},{"id":"b80dc237-1a6a-401f-9f4d-14190edebcdd","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"技术栈","description":"technology-stack","prompt":"为GEO项目创建全面的技术栈文档。详细介绍前后端采用的核心技术和框架选择,包括后端的FastAPI + Python 3.9+、前端的Next.js 14 + TypeScript、数据库的PostgreSQL、Redis缓存等。解释每个技术选型的原因和优势,如FastAPI的高性能异步特性、Next.js的App Router架构、SQLAlchemy的异步ORM支持等。说明容器化部署方案,包括Docker镜像构建和多阶段部署策略。介绍开发工具链,如TypeScript配置、Tailwind CSS样式框架、ESLint代码规范等。提供技术兼容性信息和版本要求,帮助开发者快速了解项目的技术基础。","parent_id":"1bb55e12-24c4-42cb-8f59-ddc303460d45","order":1,"progress_status":"completed","dependent_files":"backend/requirements.txt,frontend/package.json,backend/Dockerfile,frontend/Dockerfile","gmt_create":"2026-04-22T18:57:13.329718+08:00","gmt_modified":"2026-04-22T19:09:54.216074+08:00","raw_data":"WikiEncrypted:w0CkdCdnXCcvlN5xOpiEhEX3U68GI0Ngj6azFMJo9xRSxuOblJXg8Gncvj5vankATp2aJeXH/Zz4LVKH2Ep+cABEA0J7OIJMnt/ZJc7uvMtWJKS6+i5aGsUhX9BZcr1SC4TqdgwXb2je+DFK+fLZJVkri1Ne9BkEqmtSaV5CijFytJ/VSKFHzj8+7gC5Jd3CbEASojclHovCufD4dAVhlK2qcIuY3RBxMsvfRAlLyMLZEWg/gD7LEj0JaChWWR8vRaEtX0LtMoYIgSfbY/nUjR+3xHFig+m0qclK8Q01S5GJH99paLVqVkmt12iwMMiqNZypY1W2gRvZNsT8eanIKu0tq5HqvmbN0y9+nnuwnz/Tg6nUBlKIIS40jp2oYca9ak9bIwBm0TqkMe+M3Ara03+x9PgGRUuYwCt9d0PwpPG5/vOAkZtP8talqqwhn7Qom1nVkhmExMfsXTYsM+Fn2bQFXKIT/rAyT5rY6hwokrvghKwOb9pH7V8+4XckeKWV6L1rNcccOb6Inp4WcVBTcTvGbdy4Wj5Z1VETFwMnDdpOGFWc0jZRJpjrRSGgDuEW8IXpMvVYk3FV5ZyUXZcNyEWZ0Fp/s84guMC21/RYF67/9jD7eJYMeCsU92nWm6QkdVB13XQBOvYGFSu1QejQCgDMWpPz4kkt4yz9mgOtH7HsH8ZUDIml7Vci6pCcEIzS2Sy+BoXxSxcOzrqxD+PbGcH8A/BafN1771WuNzprCCTqbZd5MVXBKiY+qrlRCD1ug+pKS075xfWh/Y2Sjz4p1aJuyVplvOfNUKTlbZVBzQu5DBO+yhXj4b8Amf7OLydq0Avaf0gJhYhX3HpFNqi6aqT9OzPBIPohOUi9RWffBwHMJii2/NZj4GbgeXsWU5+EKE6sGFRGtUiBZGzf8FnB6rW16EA6in7Vd7Ls3pJrra3z6b/k9gqlh8eAVDoZhCPuxtA6yNlXm+RYWLDYeWiRDZoavKVj13rXtaqtX3j1/e1zFPMBZlDPVHyBqCZRiZjlKnty9cj2ASgpu7idyh8jDQSALGu814Wb55H1q08bvFxJf6pxn0JfbRJZMHqCEgInivdDUTcCCPOteDT0O2pwMmyHuq3mI3VzFPnYLM3aYzgJQsNIVztV/dIEJu2UGF/cyjIeROHaxvWYLNXRJZ05iMp8oelEwNe58eAvWt2KOuahqQl6xKUctm90QLv8QR9hr7PjiNAMVH3WsMxkqLcIUPuboMElVq3ErUqd4qE7W5l5Uxi2I9bVcnq4qiRtbCnRY32uC43wILTgq6KrBaO6dehB3eW4drPWqtmcU8rP1DJEatUWEvhpDNrI7T7wG6F+","layer_level":1},{"id":"7e5c3b8e-5aa3-448d-ae52-d5a96a413b0b","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"表结构设计","description":"table-schema-design","prompt":"创建GEO项目表结构设计文档。详细描述所有数据库表的设计,包括users、queries、citation_records、query_tasks和subscriptions表的字段定义、数据类型和约束条件。说明主键、外键关系和索引策略。文档化表之间的关联关系,包括一对一、一对多和多对多关系。解释业务规则在数据库层面的实现,如数据完整性约束和业务逻辑验证。提供表结构图和ER关系图,帮助理解数据模型的整体架构。","parent_id":"243a1a45-d31f-405e-a3b9-694d2fe617d5","order":1,"progress_status":"completed","dependent_files":"backend/app/models/user.py,backend/app/models/query.py,backend/app/models/citation_record.py,backend/app/models/query_task.py,backend/app/models/subscription.py","gmt_create":"2026-04-22T18:57:14.160671+08:00","gmt_modified":"2026-04-22T19:10:23.576798+08:00","raw_data":"WikiEncrypted:TWtD9cYU/QQHU+vD+ojNNl24L1Ao0zI5Y2mk07u9ZlXGce4CUXsGNCSRaLrvDZHw4OUpuZEJrmJBXEQX8GmxRc1IXLTgRlqUGmpzfcUAx8VrQijBe+unqg1mWTkYnMlYOqKWSJdISHyD5K3kBL2cL5pXF+f+lPHzSbWtqMnNnMKbqnSl/TkKh6cr7PM1YBR4IYmE21gHSR5XoQjbtYmg5qNyKF1kMdcAd0LHw6p7zHBaF9cNt++5GyFKLK0zjN2L8YiFsuFBSrn/M48QW3WyTrvDvqdOuR/Slfv+gUsKgbkt6+NEpuY9HPcRdvVJHvG9FZedomH4DrKuI0fUXgICXotXbrcEe5dOkLKgfn+gXmS6sPSZ1XgrSNO5gy2QNJaW+oKBuEPzfuKsNr3X19FZTz+x620YmL1Ccv/5uvf0Zxl6fyQb3qP+lsh2kaMdhWVKyoBv37oNKF7MO+fy+TWHFEwlVnxgmQREyQva5qxLyYzu1GtDpGp79IemnumltTAAzQ7LRs/RsaNcU3BZdYfQspjnhukylPJpNZtmKNN//XWvj023bGiaLyy805c71DcyqZNUs+EdlXmRTABeq9QkVU5wq/gkO4RFSgsWao/8f2i9FLeEZolKQXzoLnX7GxaY3BMcynG+DlwKFEolVOw07cpddYEWzmVKgJUokX/eiMbrokbcv9bLXJpHl2aP27B2FXy5Q2Ot11b2WbuT532RndBI+S9HQpfMmZ2z2Fc3VrWAbk03DwChHEbNHpmQvJpjKtLweVEpClahV8iTSwCkwd43jJdW+tR00iSdjt5vbl1cU7Dciah/B/9B7CDr9sUyZMjly7kzyWZqTkdXde3tO6tu6tWhTigIMXmZVqhW/pgVifH0R72VuM+sdMw57m7Z89ibQ7o2LewlMzJ4GsV90DdDhHQtUr++aRhcZp/669o8mijOQKj8MPHY+xjhZ2oiS6RHiCYxpibVfauiaXA3swWKIQrVCVE1x+jB07pieI3wHrmZf875mdp9rhfrz96+y4zJ464iINUdTQinm/zI4CnhXE3inFBgr8bD3pop0oYr2X5f8Gn2iKyvByc+w5r8HKV/7dd4GrdAosqVWpQweVEYR+MHRZ3AxiW+TCpRWz/PsHgunD4m+AQv5lxwoHVqF0Tqw7fmmxTqA/zC+dxlIJVD/R2WF4sFpA6femHOwqniwaowQerg8bGe7mz3BCSqiobqGSZQ5jQdh34TRP7qUg6PGkJx2NJ6AVIZVYBg9JNOQI67+2PN5AKq6WiT7Rojgo1r8lEx8SORaVptbL4YEEeD8Ec4g2l7Aqkhdxd43uw=","layer_level":1},{"id":"9fe32b83-3697-4939-8b10-524f5ed3e65e","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"Kimi平台集成","description":"kimi-platform-integration","prompt":"创建Kimi平台集成的详细文档。详细说明Kimi平台适配器的实现,包括Playwright浏览器自动化配置和初始化过程。文档化页面交互逻辑,包括搜索框定位、输入处理、搜索按钮点击和结果页面解析。解释错误重试机制的实现,包括网络异常处理、页面加载超时和重试策略。说明浏览器会话管理和资源清理机制。提供Kimi平台API调用的具体示例和常见问题解决方案。包含性能优化建议和调试技巧。","parent_id":"7e66719b-4a8a-484d-889d-10fdc76788bb","order":1,"progress_status":"completed","dependent_files":"backend/app/workers/platforms/kimi.py","gmt_create":"2026-04-22T18:57:14.59267+08:00","gmt_modified":"2026-04-22T19:12:57.014271+08:00","raw_data":"WikiEncrypted:CSdS6kWSLejXKP14YRwDWQpHc4XisvWgJzUb2dJm/yAGkddGXaInKHg6AG6A9w3V5Kpt4A88mghHC49ZAnCEBFkdcYzwoG8rsg51oQD0yMYKzfwh9/qTOohfaDg53bEIiDeH6Us+OaAO1Y8ql0iMmjrgLp9Y1OylCHhUCu9A42xMeh+fRbqaw2jvrjKU9Vd/PpCMTm7f+oljBa2YenytsO1vH+MJygHrIBIFMEwP4wDHRQCGm9i9XjV35+dfjxOhIgTTQEGiMzeNAJeVWdGX3CzHOqsyvOPjrWtxYxywjeMbewxFEBPA4dDmVf1Vjzzew4XPBzMpEXmfoXbyeUWhGhbE7tEFT39R09Ha75iK0wzPu1ux+4/VGTFOtfPkADxp62qkrPp9iL5lHxwQazsKyzs2bQCnu3u8gtrTmvxG69MDkDKrF9Q+F4ZtAlnadF4bsfDmfd+NGYnuFZW+D5cHTHu/EUqApHkByQiwdgH6BcOsdVw2LNu8bIfHCZq8kZtslVIVwCYcAmkmcAXNdpssx4zoDfoSAhvevYc0o6HITT8QasnnhvMWA7agJiGwUENhiApqGMMeOqP22TOMJDUUb2V2VhVNIujymTz4YUAtQq47v74k+XnI/Mx24Y1s9OOWOKvRfKZn+WXVLMwLQTVbl80EHY4/Wra+1fgC0dmHhXvVlq2jdksGrjLc75lQUEYd0n4nwf/f6JsjfM1jYvVSArLWpXoEn82NbB/T5MrfmbEiK+CQD1GfQ/vtvaPioghi7WWdUslv06Qra6l67oxtGKGx7SJd5FTXKH6MXBs4M3x1GItLIU0Dtkd+trliHatHl+wYqwVk2xgXmOGpQsOLwOf99CbQ1BtTN7KPB19I10pElWF+IbH9eTm+6sewgOPimkfI3JhVSl2cSCQZcGQVJINI8TE515tn2AMLVlM0AMQxTbh65Z99WSQvJtYH/TugerzWgFw3pwvBbp+9a5z4qZmBFIW+jxXEcrMkiC9s53D9cGLBS89D/clur1q4gDDkKVtztRvwwORkOSEfzLNhstNJp4WgD+b8H6bbLh70G6rMCXtMSMZdjuFSD40UuqdvHFcW9SE6qEOi06mMSAXOQQ==","layer_level":1},{"id":"cc7a1f1b-c70e-4c61-bfbc-6dc408a12ff2","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"查询执行流程","description":"query-execution-flow","prompt":"创建查询执行流程的详细文档。解释从任务检查到执行完成的完整生命周期,包括查询状态检查、数据库事务处理和异常处理机制。详细说明check_and_execute_queries方法的工作原理,包括查询条件筛选、批量执行策略和错误隔离机制。文档化单个查询执行过程,包括CitationEngine的集成、异步调用模式和状态更新流程。提供执行流程的时序图、状态转换图和错误处理策略。包含性能监控指标和调试技巧。","parent_id":"7416db23-312f-478d-8883-2fc3c41ac2e8","order":1,"progress_status":"completed","dependent_files":"backend/app/workers/scheduler.py,backend/app/workers/citation_engine.py","gmt_create":"2026-04-22T18:57:25.383473+08:00","gmt_modified":"2026-04-22T19:11:29.353795+08:00","raw_data":"WikiEncrypted:l9Ho0Yh0r5bYH9QEePEhka2UMFH582eHsB+P+EaGE/r7Zj5gVUJmL6923rRlAt7h2uvHOVtef4s71D/S/eYpYYgI+wRFyPq+fQZYOCmVnMBRyypO5m8WqfyrsSGvviugw2fw2oH6ruNX2ul1LjPKkntbj4o015R9XwHG0oDdyJlipxqNUbh66IV2c2DO1besCA/q2yTeLh6EiHD+vYeG3HO5H+y8kykMbBuh9eydnmoXBTCsTlNBHH8gzmZWEBBSL7DETM0lYCiNr6WpRCoeZEo9ewLagGq1ammmMjcMg+7fO/xo+ZkkACRTnG2vnKh3if5fBjzo9tY4tGmtF7Fevx+yjLRfhpPsg8vSRZeaggRPgub5zBIulo/4qZhAvIVsyYuAQCqrwq6mBxAEjgWWrWjOThUEQOntbugUY0DitRui7XGp7tDjAIWw570xWzTTUWe0CMoHIPghfvhItcnYfjKK+fapnQTnz159jVJarLbBdjZT5JJfw9a+jlkVyF5RIKu3J03cjGFJeBf74DiMxFIMQkKzgL8jg5YiLQTisI4X0BBQrKHQvHzsD5+VzHGwCsz7IIfcdZuhkg3PIA4z4V7eZP9tOBUJdh7iE4fjhOk6fVDG5iZME72OxpBtFkmfrhwM52swaToCosj1eQ5m6V2GjsYY/+ZvaNf2aWn8vBJHI4IEO+Ua1mLHkPRT9bhDGS+Td2r1R2fmSEEvNQ+PTuhnRAyzRASTsjfWljzNWGNmcbCtClwcIuTSwPWLAoL+ANl303UlvxObHa9udiJcH3pZ86+A7iBLoCg6JxZQuCSqD0W6bPR/vozpiCvGs1TvMR5tx6AtfZGWw4JYl9wN5iPPaP8sPsz40D4PWkYIb4fIYY/X3r2iAnbjpV+/8+h3DQCWEdqRNnkZ4Do+XZGOi1yH7QaPOf/RN00+bcNtR36PnzENY47tg8VfPkbt47YTWHf+qvWfMFPwco2hLzXvNFmYN4dVMld5V+9mzCPJSIb+JOcDoVkoGuNq7aXnOVFdERnypgzvjryBt3W2LgPNlD3k6jR7pJAE1gKKrl00VSdDN9npu4QXyT49p+YMv9m8Jbf9xo1Jn2dqM/cJiKZi1FLR0clZHZ7nh7/7WxoEqbKnLWbboi/qyuTABO07nyQfmyXR/24bRp3AIRiM+7Bq8KL9ZFZs05JmFBtaRCAzWdBdM3TElVkfFOyZRZeKaBlk","layer_level":1},{"id":"fec685a0-c9bb-4048-baf4-40b56b2aa29c","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"集成测试","description":"integration-testing","prompt":"创建GEO项目集成测试的综合文档。详细说明API端到端测试的实现方法,包括FastAPI应用测试、数据库连接测试和外部服务集成测试。文档化测试环境的配置,包括测试数据库设置、异步客户端配置和依赖注入覆盖。说明如何测试完整的用户工作流,从认证到查询执行再到结果返回的端到端流程。提供数据库事务管理和测试数据隔离的策略。包含性能测试和负载测试的方法。","parent_id":"fc6f24c3-594e-4153-854f-19250834eeb1","order":1,"progress_status":"completed","dependent_files":"tests/conftest.py,backend/app/main.py,backend/app/database.py","gmt_create":"2026-04-22T18:57:25.616681+08:00","gmt_modified":"2026-04-22T19:12:37.820526+08:00","raw_data":"WikiEncrypted:0j4RRfWJQdenLQLpT+DwLTyjMVG5sQffpuJQoSG8tbOVCukW9eq2bqobYYACR3zRn/N/FP6n0t+ZzbrLBFIDPbiPv5CjhNbth11wsRap1Da2YyKifcvwg7uyuWtSILKRIkP8wIVHX2/TkxRFQi9/m+9Qz3xVjYcNeOD0G8UWxzsSDqYGS90xX9MVwW3N24hbwwcJUE/TAMETdbhwrekpr33ej8R6IT6aBvn7m0Y93BRItueF5HJcUtKCizqJqcsG+BIQ1fodLPAsUiqvYW5dwymM89ASYiZXVbCOJq19yL9K4p1ZW1LsAc2J+6D8SR9RJ//D4gGwBmMTqxyP9bgn5eNt3ILeVMXWLXI9oxaDrdVs2Y4dXNC4AK1j0pegZkiNREUo54kWHFqCuQ6dG8dZB7BmnFEIYjwEeU29KdF6i0dyUH3/h5QjdLfc0OV75zuHQPaMs1p5fn3vo6ubXz/uWtxEF/IoVhph+AyY0Gci8TxdouTw4RZOm9I6mo5m4Y+TBsxUb9RO0WCrD/U7tRgIZcrxFfkORsKadNWm60Q4SRJeImUzxIVCUGBjr4km9AMwVsl94KSXmkBCNOFppeijE4N4Dl0n+RekVA2NBOau2woOIr/GwJ7b2h0jV/5/3x5hihxUSqZJ/q4RJmV/8aP30XRdYwZ6qiLcaF6Ic8kwpaS+9cvzGsPMcUF4GCS6ZSZoq4tuGj1ZY/iFI0w6Wj7rJHWbeBhsF/fHqFm2ijbrvn2nz+lH8Gxb3FM+re81hKNVU3BaZ3fxOAldPPvUxDw9tttWR+oH3F/gRkqefOIsw95LNYf2vIq/HXfNygn6mUw4aYidP1SY8flPcCMl0mDm7y7W6l+DKUJuok11v6h2AM09f0VV9JnGBMgwCic1FjQmfF2FWdqlsEaB0X4+aPne0DgPyIivgCLEq1dyneDm4TxA3CEVODVKHIu4fxPjmDtwbXUvPQe5sWkG7AEkp1Vuul8T/GLjJc/DHgUFe51MPFk3+8i0FCKo0x0fS8Mqm3spHB5W1tKYAIyexOgSkHzqgRdgERCTqUW461c4lKbFO2WIJqWgt/seMgxHr02Yk/pvMU08AaMRC974SfB7kP0lEQ==","layer_level":1},{"id":"b10c2334-a850-471a-9851-a1c698e3a485","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"查询管理接口","description":"queries-api","prompt":"创建查询管理系统的详细API文档。记录查询任务的创建、读取、更新、删除和执行操作的完整流程。详细说明查询任务的数据模型、字段定义和验证规则。文档化查询任务的状态管理、调度机制和执行监控功能。包含查询参数配置、定时任务设置和批量操作接口。提供查询任务生命周期管理的最佳实践和错误处理策略。","parent_id":"dd12cc44-0c95-45d5-a726-e7b8bcf2531b","order":1,"progress_status":"completed","dependent_files":"backend/app/api/queries.py,backend/app/schemas/query.py,backend/app/models/query.py","gmt_create":"2026-04-22T18:57:37.836674+08:00","gmt_modified":"2026-04-22T19:13:13.115817+08:00","raw_data":"WikiEncrypted:9mSyqcDNXizO1JyGDCrbHQv26RAimH4+rntsA1VX4dLvyYb4Jxu6TVndaXonw13RPqBFh6ddOlJg+Nqb71iBvzQ67YQrmYbtLXwkDZnvgAJqkSUXXzN4PlgowB/jNfTrmLqrUYAZLwPYTiSEAGfTeU+8GlJTtvE8xjWhZI7vP2u+cMth1ze2EwqO4hyTykCDaW9LISygpROFBJLghTo+K5E2Mdj9HWXWfqf/8/vypj1zjNrQHVY2bFNlhZv90+sCmTY3eQ0T3wfE94jKejGhh2P8YYJayGzsEoDFm7r2Hsf+rQmAXynuCLYuAHl7rAzrWRNjmvkxiuyI4AB9he1sozIJzX5M+HadHtd7E15MFYvAEb0KExSxSfnZCkczRCRPmNvQmwYBUaEJJ6brnImPFBEN4bxd+c2SId4g/BYudUL4Qio8g2zs8r1bZIz0rpQEHWcVoHGQK73Xp8ff7gvjRh89yEr8lh3zxI29eZygWmcap5z4kVV78YWgF0dC9at69s2EVtaiIluQIaBF/gJZuH0EjOqE/TnxTq89sb81YBRpRgHDImzngt8tBp7eiF/e+aO3qk+zH2RyGTCyRN5lqSlHoMkfeysXKgBAk9foGnD4D2OBWfndyN16CuRtGa5vAV8YS0pNw0IKN9TniA4PAGC9lTuMbqabzVWAnbBdqY2vR7nC5837ooKWljHYFMFWUfVSbOfFGxn0sFW75OelscFRx7FM+kaQtP4JrepRQcoDml7Bnt3bTt8SHThmpNMJwu22c3bruKQ++qcVCuvXKDKAK5qSxiReKiiJC+YluwwphSqkRxThXUwS4aMI7IoDX2FwLw1dYo7w4TeEi5sB8HoBZ5sY99Q0vowXVWj7Yq5HhHv8aTxTP3HjRr+Xi07oriRJlJifIzNlRPVB0rCdJV/cBlGkz4Gr7KUWUFvoXwDpWGM1dGbNQgkE4z0Um3fU0D0K10jDKeEHA6O7MnZE3L5Df5j9bEnGZb670xqUxdMxSjDFcUNKYrceZxYtK+GB5j5PMZuksLKt5QRTkzcKMQ==","layer_level":1},{"id":"0c1d3542-92cf-4796-8dba-82caf2f7b361","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"开发流程","description":"development-workflow","prompt":"创建GEO项目的开发流程文档。详细说明Git分支策略和工作流,包括feature分支、develop分支和release分支的管理。文档化代码审查流程,包括Pull Request模板、审查标准和合并要求。说明版本发布管理,包括语义化版本控制、变更日志维护和发布标签。提供持续集成/持续部署(CI/CD)配置说明。包含开发环境搭建和团队协作的最佳实践。","parent_id":"2148d7d6-25c4-497f-8894-c4eb7a0d2bd7","order":1,"progress_status":"completed","dependent_files":"docker-compose.yml,backend/Dockerfile,frontend/Dockerfile,backend/requirements.txt,frontend/package.json","gmt_create":"2026-04-22T18:57:39.374243+08:00","gmt_modified":"2026-04-22T19:13:23.08237+08:00","raw_data":"WikiEncrypted:F3QgleoEfoy16cQggYe9Czfqaqo1gAmvHQcnSrNK3eg3bg6SLp6Qtm0Hd5JwzGY3jDj+dSShAoxbjZ6YvxA0ahjJ7+4npTrro/p0OlyQfTnVZ5PYAZZMMXhJM063eUYiuQW88+rNBbc3mKbsAdZboYndBnd6/wybElFnP7TORa5qWxWMveWf6U7O01ocA+ZnrQqoPWB5xrRfSzD1p3yGFA3fzKobYoxAAA3xE1ALEY0vjLN7vajgFVllC2Z6uKZOE4Q6v+W+r18Pr7pLXGDJM7b6pEfFCqcEMw2fWzUAFYSUOjSyg7j9TjP6Lae0AWOmmxIDmJIIiaY0BCv/iOXgg4F6QSChC8bZFyWJATWTNhfmHAMU6tYpDXqDsfLmRpczznZ5nzTtcX+87Ndpqchh+NWU4y5OYvzEeMRCh3HcCUDs5KrOoCJgRneV8BzAxfk4gCwSo2t2D/FYg1XWGfb6hPdmWzePBCYhhIGeDQRyAdApe2Js8UhXUOD3TM7yzFPMX9q5U9ZBfejCp8TyW2thbRzOL4s5Fto9PpXg38HbnE59l0BmptA7z5bTKTp4DHA8d4NhgCeDbfNLfSJXbyYaD3RqsQt8szzbxB2Q8mvEi8iUZUARZR0lyq0oEw3cYkZRo7Dcb1n5az2OJRZwHmvRYAm7KceVqa92aKeBUlVrfA7nOuwsVH+cEXyzE8ApglbJiQfTJshljzVBvYPkz0BxhBcYrnRIjy9TlqfTs67adZyWc0wqEVZeZhuYHwwN5yID2imZ/nq7cqiZCbV1dtBUUM6ayhVX2h/cBSLpHKAwVHAg9bb9V+RxXgtSYWYKCHsAD0ymmu/Fzk3/QBvrrFiVqL4b/5CKqk6Qi2dh4pN4tZg3zJZDuyx6xzWSrsHeYGnLunZQWtHn2lr2vR6+RqzRTDiOC8SizuAjeZP72IbQf5Xyyf65hS6yls8xztLA9oDCNnSDgJ/RiNDOspfgUyj2xemyoNqf2eJ/kCDdo4/VXxMiKVfg3MHY+Vi4dVlRcSEJYLU4AYuGqtqVhTIi2ESpnPXgDPAIT+ZZPqg0hLIIPx+HNqo5qz0qqxvliLlcAhizNT4MG3p3dBRI2IkylW4gHg==","layer_level":1},{"id":"109a8fb1-6619-4bc7-8481-e28cc2127d24","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"生产环境部署","description":"production-deployment","prompt":"创建GEO项目生产环境部署的综合指南。详细说明生产环境的部署架构,包括Nginx反向代理配置、SSL证书管理和负载均衡设置。文档化环境变量的安全配置,包括数据库连接、Redis配置和API密钥管理。说明生产环境的性能优化策略,包括静态资源缓存、Gzip压缩和CDN集成。提供安全加固措施,包括防火墙配置、访问控制和数据加密。包含域名配置、DNS设置和HTTPS证书申请流程。提供部署后的验证步骤和性能基准测试方法。","parent_id":"803bfef4-3985-477e-a61c-915a246d0061","order":1,"progress_status":"completed","dependent_files":"docker-compose.yml,backend/Dockerfile,frontend/Dockerfile,backend/requirements.txt,frontend/package.json","gmt_create":"2026-04-22T18:57:40.355193+08:00","gmt_modified":"2026-04-22T19:13:58.697418+08:00","raw_data":"WikiEncrypted:1PcQ+NupkgQiLQ506NXlaizhNZeqS8C1INCZPnjb6ozpR9JAOMhzbAgtECu8k4VbH9zFlJ7iHctHtUva/hpzUaHUxVuG/rnK2RrcCUGVfbG0WKRpjG+EsQheC10ihbe51Rb+uXm+ciY+/SOxWBmrtK9m9jwSBQZQx2vXLOPvachfZTksEB+Ak0/Y5DF+vjL4WN+ym2SAYi7dW98iM9YCG0AepSeRm5DxENKRvtPR7m+w+vL7F2oISKi67pFiAATpFXSSgbkKjENZIgPfqc+pJfUREOrnHANiCx/oVaX2aOb68pluM8RGtAgyOfMp097D2Nt4PR/HN691JphbIyyeHPc82yGTjeuFPfg5XqFkhM4gvd9EdBLE3/6bh/MJhYjEwmN2RRhz7EYgLjSss8gEdDu+YLIEbHIaIC5fFS7gss/cJULC0/i3v4nnobE2Iqh3WdeIMAmynsin0sjO60LhvRmXlecODQ7+1EeQpMWju5LwTuVyX3dnr4CO4rJJxEBNYA4gaJuef2xo/ZXoun6cEIHjUq7qVNVOBZw2QtqBD2CyY3NULBP+nDD/NwjH/Gh98gl2Q0am/gLAHHoKcZfkSub1o1m1ZWTFgYn6MqyYv95NuqxR5+MSPb9C6/rwkYduPmovFsS2Alznry8TjsLdD5iSNz9MdRTR9iNV/A/TIIovgVogXlgCwnIz6EXZUgDnTeBTfTHxC+gwTrSKXUigRlIxEGksBJkzktpQA8y9mwnIfHgRDI4c8WEQRGEcKm2N3/ZPVOyBHSOHNpXK/BX8MCQqGoj0x6jusO9pJehw7KRprktlMbB0LmAuc5i0RYf9SnhsGs23W7ktzhS+uTjRB4kviSWZdHs+hgh1Pu0HsyBZxX7pemalNElQsWbvLwFNsJY1L1yjHNbBDYyXC7gZZqdb2l9GqKVgozQuK+qUUA0Vj2o6Cr4CxL01vBYMFpHALv8KnmAI2CuprX0c6PmsXV20FAFF8tIxoGfh7qcvquq/d4ONxZ5FZ1hJPYzi2xeCU0p8gFYEYYlbGMXdLCk0L5Tu0aDmTVkkrZlOHSIneYJDGZ1W/q+U6W18i48iBLvFBHD19jGHBgdzRuX551rbt4axStOcEGuyFrivbWK9R2zdcffHbiRtxe9wSFXxthLGe23JR42EF5PmZmMtlUhpV6alxUZNxguf+q/ouSz7Xn8+o6amnO60N57RyJjJO7O6+TgfHeroxL7CpABxkru/vXEJ5XTLqZBiECMMi4keQOqUbNZX8Ioct03e1YG7OgHtDSayZFtZf3kwN2ToVkxIRpLHTUHxSWLZu0YiAI2MONU=","layer_level":1},{"id":"4d5ac6d7-8812-414b-b8df-68574cc36d7d","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"配置定制","description":"configuration-customization","prompt":"创建GEO项目配置定制的综合文档。详细说明环境变量配置管理,包括数据库连接配置、AI平台API密钥管理和Redis缓存配置。文档化功能开关的实现机制,包括动态配置加载、运行时功能启用/禁用和配置热更新。说明性能调优参数的配置方法,包括数据库连接池大小、异步任务并发数和缓存策略参数。提供前端主题定制指南,包括Tailwind CSS配置、颜色方案定制和响应式断点调整。包含生产环境配置最佳实践和安全配置建议。","parent_id":"b2bb2e3c-5661-497c-97dd-15bf6ee8b7d4","order":1,"progress_status":"completed","dependent_files":"backend/app/config.py,backend/alembic.ini,frontend/tailwind.config.ts,frontend/next.config.mjs","gmt_create":"2026-04-22T18:57:48.684725+08:00","gmt_modified":"2026-04-22T19:14:17.843426+08:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllKOp167MIMMk/Juev/hVoGY4+Uz0exYT+x+CbyScHHV/Mh1WUG25XsdoZThZQEtO0sLOn9+hGddmRIK1DWfKa/hxxPvnViNvXvltvNYiLNOIbKgkBxtXovEsADGNyhZh4ndOp+a/upcB9NJ4f0miwJacx2Kc2MyCkDCgUM/gJEjyoB9tRPRJVPFRvprzmaiPXJ1K8jd+KuXwrM12ogUA9iPZOtJJQTeEXQVIItOZYzY5bzAZ/mnRyVIB11vegQ+E6Lzm7D1Nza2QOZ2893Bzu61StECZsNlfecc+xEh82aNHrbFip7Fg2I3E3fqBs5EgoNXO5Wnvkcd9fHCw9vI9kMJucTIPcthOyWAFiP56zu6Hzknqy5N0o2gSAJQdhzzEvIUUKeeGDZKSY2EjFsH531gWa+Q9m0FsYWFcErqBlQXG8K06rnNNeMwR71GloOifAK0ySuik/7BjJ7xIR7HF8FOfSaOhI011z3GaEBxZsMfPc13v0joKHld4p4PRBXAfExWLlfuM6cmB/77U4xdBrHVyMcS8NPKuT+TQCTzjr2uUKzxUcjbz+yGbjVFGKMaVzKH0UQfLKeSDUnb1JNBrQWR0PFAuZsPZt730dAHdElNx9MenV8/GY+XPklTXdGMUtflT6CKf3fLy6ppMVbMDph2Ov+1Xh3z35Y5Mz3rufJasyOE0rZQMNsUu3wHtnjYprxfzvmpP9En5z4KoGEa/282c8xoLp+n3+etuGCN2aor1BSrro/ZpPTduyQtqj2WdfXDnZo1In/RRAh0TwqPze8Cd244OFfKDDAEICSSoZl0S/2l15QyTbqDNVnRzLndJswfAi2yfaVOEkBHvZuDQZXmmlf4VGsJYihVUwG8Y8bvegjLxgcD3LFGNKjzuKP1eAYLcotF84HRaFwNG3hz8Mv8puFMKyrHVKIC3UxzBVaialQqdO3oFRcrLdcSIx1JlY2qhK3BsrUtj0OLURUs0dBnCQS4ndq4NTLSQECFIifA9l7GSPXyOkGkp0+H5QCfjOl7L/3EJ2o+lTisAZggIZSZ57Ig3WxOGp4tgBh18ubr0TRNi0u/VccTbFyT97irQVq+9KNBKwPZZazaWvJEuqNSsdX3WGjh17VTbbZgmTkAwLyuCf+nyKkGUkq6MtRYwX17XkQuhceFpBmYkoxlfSWr4odGaspQ3c/AJ5zFNMigymGGpxOynWRWD5Abo/3R67eqZ9rZbmCqQbF0fkFPxdi1prJr87dubXtG1Zkj8AE/ZGXYjwas/l8NeDYxLFeir/ic+yR2tcU34lFAY/B86IHf+EBSbBYigErIEadb9gw81","layer_level":1},{"id":"7c2ac186-ec90-400a-ac1d-b3b7ca2f01d5","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"后端系统架构","description":"backend-architecture","prompt":"为GEO后端系统创建全面的架构文档。详细描述基于FastAPI的后端架构设计,包括应用配置、中间件设置、路由组织和生命周期管理。解释数据库连接、ORM配置和异步处理机制。文档化认证系统的实现,包括JWT令牌管理、权限控制和用户会话处理。说明API接口设计原则、错误处理机制和响应格式规范。包含系统监控、日志记录和性能优化策略。提供架构决策的技术背景和权衡考虑。","order":2,"progress_status":"completed","dependent_files":"backend/app/main.py,backend/app/database.py,backend/app/config.py,backend/app/api/,backend/app/models/,backend/app/workers/","gmt_create":"2026-04-22T18:56:47.08233+08:00","gmt_modified":"2026-04-22T18:59:21.004588+08:00","raw_data":"WikiEncrypted:N3UbzwGjCC3xD6BrTM0cq8Y9ccVoDb9n1FwE8c3MNy0X5y4Ej4ZnP3KnXAR2aRWtzrMaJkrDRdDMkztKRYWc3Wk1Jzwnfsgqt59so9pKRU5JZY61Wzqd2PzzDU1e10OntPwETdHfAXsLLggvksYCugHgi1fhnyRiDR3C7ABv3U/j9Z+xFbLaU1X2+FqXtTpJMe0gZJ2yDe8YIV05/f1NdFiyt5NDWdtbC4Ib9Y2H52fXoe2qIveG8dUmBzkwbHVu2VM4E9bT7go9y9+pSOyoRwO8iQIgfY0dKsQcvDtHpO5T2plEfrmFKSlwMCiiivasNoz+7ylsz8JGo5nnlfBqTtNbVZX+TrC9x539RAxL6rEZvRxbFucfobivfqV9UKh//2yYFcZ/44GbNjqNQxfF5WXJxxR5cl6crLZO089slohFwSj4xFVRarnzEA+wA45v8N+WhlaCWCr9D3DeX84ssYvMnAzwz5wUApwFIB0+dzG6CyO1yNQOBdcUhAFEHAZDzWi4UMgnwXCHBvsXx9keqXfSQYdPjZC06gegy0IfbeW2XdHsznPqPyE0TNk7R2EJ7Xm+Ky8I65Fbs56g/2k/ETmTt8ja8RfGpRbQpjW231dxIdRNdTNH2W7VkpjSFNJ2KD74a+UFY5G8eSFAvJWuEMLVCQB69C+TO9ML3zzNA5YE6/MzhYsbd5Vz6YyvCBTjMSVufoTPK3n1k/ioOdDzRFEZc8mucNTJBrEu9OGgb0gUFQFXMEsabcloQaO6ZbOBLefSgrAdlSolWRG7Bu4XyCzXOYvqrGKNPsTZQOTbVkOP9Mg6xRN/8jkyY8z/5TEh3lWnKh8ZkLlumG4QfdLnF2LHVp0IX+d/5HvT3GBtoXN+zJ3hMVEVumiVT7qCJz1afiTQZhPERVAirDX6cZ51CSo1FkRWS55AvnICqVpP+fpNLl8zLWvuuOLeA6Ab3x/0rI6b0LNf/UAqeSW64LGHL0YDWwB+G2c5oNp+bYuOVfgmngSUmDdDFHHL0k/KEoU9VN/+5f6KypjM2MYUKMLz9pwbX0qvUZadQCg/thD3v31zZ8ZroTFTEa6tAyAfqojuUXtJ/SI2l+VlpvP6dNjUfsudg8Hr7AQQescm0CN0tOYTOJZ0P+2/RmPTHviifKR/54LVuaTLEJGhd+3K5IhDTvIOhayZi6E4ARpakMmWdVfsGPv6ETkH819SOX3alS7vHgV/auGWsJcRLJinONhxTppcAf3MFf2nq8AGZR91LDCZPwV0hO8YTxygvxX/+uNJhqe5oMGvUjJvTo6xoBkb3JATSdHKXM+lEG2lbnbFjUN+bVRcAH+Qw5FdSl1cHbm/QJnwQ32GeGmAZmQ2TTHE+tdQgZ6yA5dDsvSJGTsAPieIDKEvIql2j+9eoR1X2j1mD0T1D4APKUfgD0zkNE9QeQ=="},{"id":"159f2ccf-71b7-4d1b-a4c4-c15b23a4126e","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"API接口设计","description":"api-design","prompt":"为GEO API接口设计创建详细的规范文档。解释RESTful API设计原则和路由组织结构,包括URL命名规范、HTTP方法使用和状态码标准。详细说明API版本控制策略和路由前缀管理。文档化请求和响应数据模型,包括Pydantic模型定义、字段验证和序列化规则。解释错误处理机制,包括异常类型分类、错误响应格式和HTTP状态码映射。说明API文档生成和测试策略。包含认证和授权在API层的实现,包括权限检查和访问控制。提供API使用示例和最佳实践指南。","parent_id":"7c2ac186-ec90-400a-ac1d-b3b7ca2f01d5","order":2,"progress_status":"completed","dependent_files":"backend/app/api/auth.py,backend/app/api/queries.py,backend/app/api/citations.py,backend/app/api/reports.py","gmt_create":"2026-04-22T18:57:02.317509+08:00","gmt_modified":"2026-04-22T19:15:14.078939+08:00","raw_data":"WikiEncrypted:xKp6XrvgQ6yDy/qZb6DBAyzRhY9oY9wND++XWs8abaIu3G2LITgI+Z0UQBWYGKhuTqBsuTOr5OLyKixlekyR1Xfq7usrLYQyUqykz50fvTC/eHiVp24qJjGIE/yM/QXCeZCQ0Io9avqxwyMLsy7oz+0kRVW2WjLzRO6OrvbiUY+8yPMkSPi3UCtyM0GVLTpD/1yhEPFlJimDIuMsn1U/6MxjS0vcd+yEDjCBtrAoR40VIxrMz5v+dKD/pjfzoR1p6GEjf7b6zpzZGPhEtFmhzIahThZIdAaGShFz2YepbNwjns9s+2XJPvMdDYb5mBTcQCjoCHeUfqpQ5eRpjJ47qGFAfFw7lpv7GfOixRgEasUkVhJaX2fS+R0bGg3mmJFfg8tK9XXCm0OvNdgj+aJ6EUKT7GWXDkWLJd4NWEHKvqO9jfXu7YBJxM5tfR1i4e7CPz16fSaCPJtKsI+HgIoTf1JQ+3TrBqGncHko/5j2BznPg08EvIvKnECTrZEH1ATf3+Dpz7cY5x5f+D+oBDxG88V899fkfZSrXbY4YZJnhO691mRZPnKUgr3TsGO4kK0/eZw19HvuCyKxuqWlpHvV2nWGiFCyQpLul9lskV53bxNE6LCdF4LpQgsnxp3NRkXRo9kqVcTFEVZX1D65nknWMQHMOr91wEbFu5y7eHBY/M1mlvT+FpX/uzM6NvEAUkyKHsIpLihbh/obM0dUOwFr/y/hUOLfs5gw3aMosXT7+uwJRXkzxJlNzCyzWUQoMQbw19Mq53uhogOLGeVQNV9+lYZlsF9DEbUg7pWX1HOTZw0qj0G50JKHtiM0mGIwmRxZy7HDNhqrMGXboadds7LRAL8up6y1uZya4V4Y43X61XVoJJrERnU6caJROOJ+2I5yEbNYOvo/g+dDZf6DLrj/5IPInHUF/rwxMPX3V17obui48Yk9OOgLp3s7TEAU+t97lkEPo58h2oDARfsbxrnrVd0I9z2/IJSBouFoAA5+wGUVU3BH0Wdc9bwTyjJg6t+iiz5Z14RRB6hnBI45qD3U9a5fIJ1mWWGl2mBaOfvJck5hTbq7v+Au4iOMprm6m9SIq8C9D5w/PtHslYGeBDUYeIOWciDfxj90/WlNjcdIpE8qX8PqRFKdnwDCBOD0xewCH5Cw+MxNEuc6RRDsFu6vhFjjYe/vtb6bNc674kCJn5eQOGFAo6+v5wfkkZhG1S1q5EY8GJf+H3HgtucPikTjpKAbpBkkiorIBJ4n6Gdi9Jof2lYe1Ina6yJPsnNyd1MyQgdpEg7sStrvevt6IaMoeIe0vQ+WPecPhqsIm9X4wS4nI7Knd7q8WUsBQfphwlTzUb0igehWxKagmMc8N3x64Q==","layer_level":1},{"id":"9cc59a5a-f597-4707-b994-b6c49514d553","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"页面组件设计","description":"page-components","prompt":"创建页面组件设计的综合文档。详细说明仪表板、查询管理、引用数据、报告导出和设置页面的组件结构和实现。文档化页面布局设计、导航结构和用户体验流程。解释页面级数据获取策略、状态管理和错误边界处理。说明页面间的导航逻辑、路由参数传递和页面生命周期管理。包含页面性能优化、懒加载策略和SEO配置。提供页面组件的开发规范和最佳实践。","parent_id":"d907a8eb-795c-4060-9cdd-50d31cf39be3","order":2,"progress_status":"completed","dependent_files":"frontend/app/(dashboard)/dashboard/page.tsx,frontend/app/(dashboard)/dashboard/queries/page.tsx,frontend/app/(dashboard)/dashboard/citations/page.tsx,frontend/app/(dashboard)/dashboard/reports/page.tsx,frontend/app/(dashboard)/queries/page.tsx,frontend/app/(dashboard)/citations/page.tsx,frontend/app/(dashboard)/reports/page.tsx,frontend/app/(dashboard)/settings/page.tsx,frontend/app/(auth)/login/page.tsx,frontend/app/(auth)/register/page.tsx","gmt_create":"2026-04-22T18:57:04.216604+08:00","gmt_modified":"2026-04-23T15:19:43.818179+08:00","raw_data":"WikiEncrypted:5oI5y1yTFbg14yVSXHYDGFeITEbIkjmdES7qr/P4na8TrPHqKZDCV0OwvONxgczey0MsZEE95T/q1IqTn1MDXDe+zweBCSZSlefgNsHwrtPEnyqFrV2NhO5nKlcD6tYwGnW5Ag8vX/svtjfAjl//gRYZD89hOQGnlYrcSU5a6FC1LQaaD4KqNgrn7yYxshfLveO4k610B0mb5BrOdyTpLLBcuNmEgY9/GKvdoyt0cfpZPwN5J+wPoYjAnGjm9LDIkL9L02r9Lvvq1mhN88A7yKU49c6lU6S75IzcT+OFjTd7OXXastuPBLJRb1A0sFMKjZVshweginUNg6fhc3vFQ08Hthoizv1Pjm4qNnloa7P3w/rnuQrvCJk3Nt1PWn+ouHeenTb9bsV/KwF6BGJ4HGDSDyFcd0YmY4CDfW5aSBFP1QYneJUBxux4dxgw1GbBsa6R2o+cDCB4DqSA14RqNvsI4r16PlAraoYSaQRYj8NQzY5dRbzpEnhmyPsBmgzcW1gLo067XcLiF0DJvlouezCyJW+Y9YA0fmJslQSYvcMhcI8mYdAfGDi1EoXoUiQYMnvlYq8J8ktBwLbIskG3FgeWvmoAFZE08E9APByPtLjDcHHan03Nwy7CPZqb6FtXLeHH6H4TK+WRnxyWWUCCGwQxVYXq0SDxaUvHuhZ4XUr7+Q1U42rlW6cND/0kiOhqZxe5qp/7PBom2IrcPdORh4lVv3RCQrIDCkHcBzCV+1WIwFeaxUaSDNJMmZ500JhDl+ECx+6dgbMAMTRPh+SxHxLd/OJMI9dD9eWQZMj4RwDxTbqlVp8cpoAEGPNvmweo2JApNndlNo1gDMJ++de+I8cKsyCdEsPfQ8ikJHY3R/UaPh/mPp8pQaKIBBP/nvMsT8jYMtdv59ejwQy6+/9dplr/mqdQCkRA4B/maZQ57aFmnsw8HZM9ukvo0Ni9KpUFM7iFAVdZy3NGVf8DX4J0jwAjd643HXH9I6+6dP2Jfs7ezsKz1T5yAHvocFPqxtbC3b6WrwrjPWf32N1a/qM1RiZdPyUNGE5ij+CTm9PUzcQxUcatfkjdDGnwRIAJMmmrtYVTBvCP+xUKuAp2UmXU9xfTYxlU6rdp5LyGQS9dHP0x7KBg+yOWNzECNEzMiCgE7gOqv+X75WA7D/sSBMaO52H6f4qtJovvnkwq4r67A/ByroGz4ctZ/wSVqTHti+gzlXIxgHKWr8VVq1HUFUCSRdZH3Q8PaR08vmQcapIQHpDRW13nUf7saKZh3N6R63lREJu04Ie+fQ8i7VUsNE4QclcrUsdj7eUxv5xtz7xrCEBDZooPT3RW8OM08MJ2Qe9sU6bdCvHTPE21OkEYFD1tWzWH7149QZPhOzkXIQ7qGdKQlmRvyOnd4uL20k58I3p/q9ktqLxBCy5s9Ac6PYODpXPLAelkYzhV3TcJAzxphaGjCmR8goNGJJWsqw3FOOCjGqWliL0JmW23Xo4emXDMUU50N9Ru8dM6NBIs6o8Hy3YcM2dj4t5RwlVejQhCn9gwtm742VYEdCEYKq+8FJtp49Xm01KPOtgTyFN0lF+HOQG6LCrIBY8cXRQtkck1aTvxD+KmKoVxp09guujaDutV+eyhyb5dYSytjq2ptL1FsYHLS14Xa+GW6DEvniGGnCzP2LTzntbqIVzx3J6F7gquTfsiDTTPkIijyYxWvkSseJc=","layer_level":1},{"id":"f70f5d9b-d7c7-4dc6-b36a-5f4508e6acaa","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"系统架构","description":"system-architecture","prompt":"为GEO项目创建系统架构文档。描述整体的分层架构设计,包括表现层(Next.js前端)、业务逻辑层(FastAPI后端)、数据访问层(SQLAlchemy ORM)和基础设施层(Docker容器)。详细说明核心组件之间的交互关系,如前端通过API与后端通信、后端通过工作器调用AI平台、数据库存储业务数据等。解释数据流向和处理流程,从用户请求到AI平台查询再到结果返回的完整链路。介绍关键的设计模式,如适配器模式用于AI平台集成、依赖注入用于服务管理等。提供系统拓扑图和组件关系图,帮助开发者理解系统的整体结构和各部分职责。","parent_id":"1bb55e12-24c4-42cb-8f59-ddc303460d45","order":2,"progress_status":"completed","dependent_files":"backend/app/main.py,backend/app/database.py,docker-compose.yml,backend/app/workers/scheduler.py","gmt_create":"2026-04-22T18:57:13.329904+08:00","gmt_modified":"2026-04-22T19:15:17.452724+08:00","raw_data":"WikiEncrypted:gWB8HBj+8+/15rQhXgtMjCy7qJxJBEw3w9EAqc5Otte14+SfcEK3DSbmZRhW2TgD6BlsxDXHpLcSijck/Nymh09xxwlFe9hXY5fsIsj1IZW9egIbof/vmRQ/HkxJSvNy7WDeHEuuU7TDae+7kls5UELL0/oUUiCC4fjizzoaOlqMuOvW/DImO8fA0xbQ2wAt6L3bqB1pcGWvnB10d6EKKhQYmUj8xv/2M3cUBtDMkUdyKbAuduBIInt+jZnOGnXKcr1w3W66u8elz0iqgWhMCsMFd54QokMhn1Uyguz3NcIfEVH6IlKil0ufINdb2d/QV+9aukLvJ4Mq4YDlUjQ2iJ8oxAYYUb8eIjBnsLHPfBnMUyXVAo0tbyNB7wUmRb/L1VR7ipOMMKd9mEohzKGpsTxHpM8my7x8Ryc9N1guO/H766qiiNij1HNCu4rWVW12oeTTjAoEKdLzLyn59Fc4QjYVkS/I+r/lwRtMNN0OGjWXGXea+HUaIHwW1088PW3eZj3FlyGEsTiYb6ysJAWanY2qoIhASm31o8s9DekhdxTRbWeBCNzGN2ufTYGM9ygKNDHF5dCbVW0/Vtc6FC/TDiflhIaDY44Gvuu84O4l7SRBl0jKM8uCFHOgx/NzDlnUdNFaSOdjUBxQ7vVyi0Q5X6P4H/ERPzJQvOa0gmXW7S1ry0P4/CRjOCzq0Afw+mAf2j4PHM/4MWFkvrFkycbEkHWoWnPY+DWYI00TVSdTWjj4n4l9wbj1XDhXavLdg00qHVjv0dTq1ghcZKv3C04T5MfvVQjMXCKPQaK0KzwZDfXydWnlyLPgM8t95lTETMkjjEpIMtiv2w1gJda4ChFrJq27oPmVlEoVzGPuuk2B4YN3z6A5y3ehJpejis1/EuBjd0vXHhwghZeUv8mMD4smRPUMA8GcEeKVs9TQgBHqVuuVDdEAQfE7w1ILarmq3trYAuc+LH1KMUyPD0aZEbhKZdMRkFYWLhfyYeuazm9SfO1BqtEuTVoAXdLD86TCQNmxxTZPgU9OB9JluopAMt1oszBwKK/88UqwBqgUZle95RTKVR6QPn7zAGZaDbfsbYvsGUfNBSH08o6nnraxB0Vpj+r6WaoZLCcxhqSWoTp60YlMt7BDsla0Lt8r6D+a89AtCqZOHLJbrEx6T4wsmiykEi1uC/9XhtcsTHuytq/rHeDWR/bTToB+mGjBipoGscvIFMgUJonYCOjLDyBPGpeWispYZV21bIJQtFIYv06NKYU/IV9ZISLel9AttowTEXv/Y/U1xRtmaTp3BgGI4iRdwXYMJICv7Jyr5kYd2CrLJQPzEBdkJi7+q3WNdTCWBPd3B3hL/tTL2lFNDOc1sqMga78PcdWWHQfheORW9OfH3cDRiq85LJziojysfwkQVqHY7niPkDyphAwn9F2xZZl9ZfahAaU07CgK26wyavgkYOAU0dlWI6WrAKE2gQOzOxBL","layer_level":1},{"id":"816a2805-76c9-4f32-a3cf-96428208081e","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"数据模型","description":"data-models","prompt":"创建GEO项目数据模型文档。详细说明SQLAlchemy ORM模型的实现,包括模型类定义、字段映射和关系配置。文档化每个模型的属性、方法和业务逻辑。解释模型之间的关系映射,包括级联操作和外键约束。说明模型的序列化、反序列化和数据验证机制。包含模型的生命周期管理、事件钩子和自定义行为。提供模型使用示例和最佳实践指南。","parent_id":"243a1a45-d31f-405e-a3b9-694d2fe617d5","order":2,"progress_status":"completed","dependent_files":"backend/app/models/user.py,backend/app/models/query.py,backend/app/models/citation_record.py,backend/app/models/query_task.py,backend/app/models/subscription.py,backend/app/models/__init__.py","gmt_create":"2026-04-22T18:57:14.161024+08:00","gmt_modified":"2026-04-23T15:21:46.785144+08:00","raw_data":"WikiEncrypted:Zb5TNaG1u/mRrgPr+sDyCr47uD+4y/GruMCqF9C9nxStxKZi2OWvk4ViC2NJmWUO/Jxugi7iel+AeINiHAz9c7erlmOh78DEPvZI5zcQaIYzm9l0e6yLGbMS64gON4GYqx4TUizeLGAIntFG405vTATENZMylmwR0jTbWx2uP/KlAPch72o8TGREvPTy7FGikY773VIwNZq0MXKYxjbwvld1ADWYjtxMoKmZ7pixx5LeZM3O+bfisD7UTqLobS2VvR5Ic2ynsAkEEzef+Rh5O85TXra/uluSuAOST9W65TENzfEzwHe+CNAQmUp47/vG6d7I14WPEipc0/aKbh43AhJkclnRjpR0bYFPJrW/HuN6chk1uhxzBK9sKpOUOLZ5MffdIttkTAOz4Ny5MxnUwt0zj4hDsVOevpasy4FZ/3pVx07fb7SlIDC18p+OUYQIk9JqBxZmgeMslhOBSkmRTAwqir6PN/GuLEeeC0mPlAMNhsvDrklfLlJmLY8MuSQHqteqYJryoZ1cp1yeqxATnDfeigUr8eSSaFqZc5S/AlgSIrvr+7XJWk/Oz0wKPLRXNUcG9yDweys2pdDb/hV5hiTmLYjgvYvnDLMMjrFgR6Fogz3U5ItD0xLC3lt09GJfm8jhS9E4AJd36iPN2WMeHsM0ctdvzYB/MKtWIIrBkWuRD7CZeGJepiGO/GJprp9HK9m+APjZQ4oc5d43tgDModdepglAEgNklY7IzUAPW0Qls3DhfUUHq/Zuf5AxAfUAAg1JOW2qEQWV+btkeoRPEiHjZXFDLGsC226d9yUlnYcTkFOeVbL2gomt13MPt6c4EQ3y4BSoG1CYqO0q6IgkX6a4g9QE7OKjdE3RX8rNGixxNJzfx3oeGtcne/lDvhO9/U5SlpNgbkkemAIPu+eZw1zMpknFdRwUdwOwgyVNxR/tt9AEktJ2gcaxRGfG3xTSa0JHoniO9otA8VI+Paw/il8qAI4Z1kf2w+L8LavGt05hchhlzWcrGbBjXF/VkCoYxFvM6JX9FafcLjoT3FtVTSorVysHodJyR1nHB1TL6/SH9v5IZMlZeQ6/Gm87g4SquVaVgvEBMuFPA6c7BBhWUqGw48UIBxfB3Ri4l8HYfRBiqrPSIuldaD+xTVL8F5XsVhczS4JXDnX3RLtvjOuBZRcejVO0ubg+syCfBhf+6CtYOyDTTQDGgwdiNg0MjJnmjy5TMmMdynOGSm2oF6wS+tUuWG8lMMBtredaLHdyVb455+OY2oQ5hJZGo7eyzchNabr+Xous+Ve/4cM2FOoHdQ==","layer_level":1},{"id":"64cbb894-755f-47b5-854e-c26c7821e9b2","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"文心平台集成","description":"wenxin-platform-integration","prompt":"创建文心平台集成的详细文档。详细说明文心平台适配器的实现,包括API调用封装和HTTP请求处理。文档化请求参数构建,包括关键词处理、请求头设置和认证机制。解释响应解析逻辑,包括JSON数据提取、错误码处理和异常情况处理。说明配置管理机制,包括API密钥管理、请求超时设置和重试配置。提供文心平台API调用的具体示例和错误处理方案。包含安全注意事项和最佳实践建议。","parent_id":"7e66719b-4a8a-484d-889d-10fdc76788bb","order":2,"progress_status":"completed","dependent_files":"backend/app/workers/platforms/wenxin.py","gmt_create":"2026-04-22T18:57:14.59287+08:00","gmt_modified":"2026-04-22T19:16:36.925806+08:00","raw_data":"WikiEncrypted:f9V8T4at/ASje76Nwqwyb9VKSms5IpkiE8NM6ot6FBQ2Xm/W7xVNoD2HxtG0JIBY8fzg5rfp4P19y9GFWE3P7uI+Ntusv89zObilbespnCZi9lgSyzvJAmMy2ZXU36uG1n/fT5ySk4uXzAeM03IITw2ki55c7blR7ctykkDRBz/+KuT7ZF0DOBoduWD36B8eEgythbdQnQk6QKdUO3zYxMKpkeC+pXgvEdIShh1qARe6y4tQ2QvzqtKnSFLAxfQRLFpZ+M74S7WgYzFsfmB62qvpFd6iqQ/c34o/BAn/Hk+hmijJtD7JrbAb4BZHqO3M37l90T1UeUJ7ca3kxzzUVlBhJelV2EEMzu0TdG94oRWD/uUH+ghzekg7V4QONvz6FgX6S3g5dlnRmJ3uGVAb9UkWyg54V2vm4Flr1Rckut7P+eI0PwFYHVVS73QDzbs8rxY0qTDqnSVx/avS8kdcv0Trke0k4rFSsbgl8gVc0YnalN7uE3aWOFqG3L4Uuv/doKg7kRTsuNOHcemyf3CxJKAWqRGnZq6kAZXhAIPB+TVfZtUZBfqXceE8XhFx0TzfsTc/CyJPCD9cMLl/dndwGVEVjImXOv5Z2ILdMDbyiHuP1LNmS6opA4RZav4bChAA4vMKcLsvlpy1m2JXX7ZrbSoaoyPlArsF4y5k76zolOB0rT3mchlZ1RuKELnC3Zx5UyvIIpY7A1/YhLy4OGGFi09mrAxAr1U1pmnM8Sefd0ZG8wLo0buXQ1yyE8pVZh/xwTuD5FtS813EB8K7f1KSJbjHW9PaaCtfFr3QVUDhXFZQOe/pjryeUUC/FcKCnLNd7YGb6sjFaYvmITf6kZQnmulBS/erxUZbTiXDrI5vHrG8/FJATWl0MvEiv4xMovu4nmOJtjrbhfUlI/8+JzGdmo2HJ0v9Nle1SjnYXJuOWCTwFL5+tcYW9KBcfsxRdQ+8L8vJmfBQ+utNXUpmYn+DimavX86+plxrth8vKszohk4Yyvid24iSykfrvEBlbR1p0hBCSfT7knct0F5qUHa+Msj/zGpopBE+WShRW5LA6Pm4DVHTlwZHViJfpOH1tZZU","layer_level":1},{"id":"412f8cb5-54c1-4f32-8966-fa0e5e75bbca","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"性能优化","description":"performance-optimization","prompt":"创建性能优化的详细文档。解释调度系统的性能瓶颈识别和优化策略,包括并发控制、资源管理和内存优化。详细说明异步任务的并发限制、数据库连接池配置和事件循环优化。文档化调度频率调优、批量处理策略和缓存机制。提供性能监控指标、基准测试方法和性能分析工具使用指南。包含实际的性能优化案例、配置参数调整和故障排查技巧。说明如何在高负载情况下保持系统的稳定性和响应性。","parent_id":"7416db23-312f-478d-8883-2fc3c41ac2e8","order":2,"progress_status":"completed","dependent_files":"backend/app/workers/scheduler.py","gmt_create":"2026-04-22T18:57:25.383759+08:00","gmt_modified":"2026-04-22T19:16:37.81704+08:00","raw_data":"WikiEncrypted:9uOBpMbLX4DyZqW4us3Wm3Q7klXxmeD+JMMoGiSO2oNryWBo1gw9kLkawvxQIW9CASZSiyAjiA/zeT5DwD4S8PDqEsVNE73i6DrCAWvPET3MMPQasVfJTaLge2tk6gbYlx3R6JKZcUoi06jS7okoLDzJAFru3F6zguqySliKZSG/00oFVcDHXlZZc0L7hiq11k1jOD8uBl6n35lAvst/AgFv9MUzrhf43XDwtHiMAxjCAkwKnrWOow44Lwzy5fG3nWKZLSHE3/CUmZ17U3GmEqfG43ai1yloAkMou+sTRIk73sRdXPDze0HhNdNfNXTaOHTxW0gT2TwKGHgG9Jt0Y+1qWq4Nxj/oJTP/hztBLy5SEPndXXqeZTkBaesRTr0adQv49fH0QoFV6D6dxlEOodMiFhvvYd1rvR+HwbQbqU3W5UDVnKfPlMXHsz0a9NPu4aGgk5yevh/s0AP/v2R8mgz3N41lETHxk6Q71f35L04S7u7P6MlorIwKzkeijhFf8sPrChMYX7dwf8dWba+Nwm6fgb+9AbSZ4VczhQInnbiv+GUKiFnezNVSHUUXqTCvRIuhF52jqnOqjPei/1oeS7xAMmB67o3v2so8T17xg94F9FoEl2XuuwA+RFDarVZKACDTPxjt70OXdAoxoERTZ3ivU93OANsuuWx1x0HgFdBj0q6seNC8cbySc3ZuQBWGu1YWMmyIYGL5l6L7CNSmkkl9/pkb1TSfkyM+Hk3VLXy8VIvtgHxGX2OU8yX1nX0DCGS9Yt3dK17lAVH2XF2mo39noQPG2nxjOc+lO/O9cL/CC1Bqzd51YLHapcRLPPbuaMT4ljyLvQ3GMvKHB6c0sjdaKjykN96LhXpO5PAqs3N2edkVKVMC6lg5fTBMZi6B8r4rup3M9CPDs4ehmVYTtnZpt5zKxyXP8QfTO1FfDyNQRpbXj8TyLOwwqEFvZPQlV7Iupj3lpi6crQhtpXBtU9M+vjP31rOrdFpBHXCckE4T9QryVWvQuNDjsc1+tYKLgF6S8ixDQFCHEAfzctdMM3iiLCeBy1szBZEZTE+OS0ERSbgqusmZBkz3ouKp6suUgXLJp3Kystu+dAVWhA6BAD2WHT76h+Hbazixj8F2qAoxmUb+P8Z7u0grbWJksg6u","layer_level":1},{"id":"40ac97e8-7ef0-4198-82d7-d2e332be9d34","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"测试最佳实践","description":"test-best-practices","prompt":"创建GEO项目测试最佳实践的指导文档。详细说明测试代码的编写规范,包括命名约定、测试结构和注释标准。文档化测试覆盖率的要求和测量方法,包括行覆盖率、分支覆盖率和功能覆盖率。说明持续集成配置,包括GitHub Actions或类似CI/CD工具的设置。提供测试调试技巧,包括pytest调试选项、日志配置和错误排查方法。包含测试环境管理、测试数据管理和测试报告生成的实践指南。","parent_id":"fc6f24c3-594e-4153-854f-19250834eeb1","order":2,"progress_status":"completed","dependent_files":"tests/conftest.py,.pytest_cache/,backend/app/config.py","gmt_create":"2026-04-22T18:57:25.616954+08:00","gmt_modified":"2026-04-22T19:17:48.81542+08:00","raw_data":"WikiEncrypted:3lrOgsvw7LaJXRS/Bz00iEsb4RzJUAxxpmqaBblS/51b52WVRQtf4YGBQ9MC2MYcYNyKxRGZljd03HKmm078aoRU+suxjG3HIqwkvM6ruyPxwlLdBEn6ogbrhm8eOKuGWjiEso+PrOqSXW0boT4qGE+/L4MkPiyeOB9YnDB49/ByvDHsjeesTQqGwpa9FmIQtVqpqDZA3Sx+x8TB+MSqT5PMZ4egRgCW1ODcidZrTriWvseFNQDFLzo8g2H/HF5CFLcVsZVK+kWI7b7oWLmNlIKz2SyVJuYqvCblPzw+/773Wv4RVHYdK/pxISCon/L1KjPyfZjddr5sDjJO7rNFbBshPxUIQhtXnnAEqLOpzZwHm2a0bA3vSR42bZZoSAY0v3aZxXQ5IvxNT/aNAmiFzd4SkTlz0okDXnBsArnOUpLLRfjLhxt5ueRUi9Dl2edsdycd6XznT6/oAUHTf05zhhKC6JR1OsKiFQyoo0il7LYjDxXJM0dZycDlENYwZ3Bd/82Qr+7VNmgpLdnB/7z9DPG9iou6TIpztKrdSRYqWBcl75qs2L/R2Sy6MOyfSwALTRUi5udf8sNlsHOk5y2qY0h7vd1GzYwtxKQ63ypJLL/8fAcPKmH3FCwKvrN3zuEu0Meyq+y2v8eYeXNozeOa2zum6fI5sw7hnzX9Jqy7fyQD2yBFqyylQ1ZW3nwFd9liZLnWfm7zbLDlqSgzGYGxvNIe0X2rhwsthMZTLEXOZVDW1/NqHg2E9qXOfg7XhQRHKZz6Wu8eZ6MGyCvq6ft2SJI2vltHD0M4somneHGSMo4jKY8rMeGl7qkW1V7aaurBnh0xp6cOJ25IdbN4VEDYm1Oj5nlM4wnEQzWiVyEqA+3oU2k2k9Plm/xs6g846/lBJxHL9ztsKmm0BnrUFR1ttgTVRAFvHpfkmSgLGGB/9824DJpxXMiWnExCaZzWbFYPhXnDF6Kh3SB6P3NyVwVdC9/pkf4/UQ4Em3rvbVuWICjGSScoDtOu5MrHDaUSbtN/XtqOptA1ApGbnTSKxOm0KAck4ApFPdk6aRLdC4eRf9XWsWUaOFjkqAoU0Kp035pHaGrCrx4KmgoKBNFNbS55CA==","layer_level":1},{"id":"41a414d2-e13a-497c-8a03-212624dbf5fe","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"引用数据接口","description":"citations-api","prompt":"创建引用数据查询和分析的完整API文档。详细记录引用数据的查询接口、统计分析功能和上下文提取机制。说明引用检测结果的数据结构、置信度评分和品牌识别算法。文档化引用趋势分析、平台对比和竞争品牌识别的API端点。包含数据过滤、排序和分页查询的参数说明。提供引用数据可视化和报告生成功能的接口使用指南。","parent_id":"dd12cc44-0c95-45d5-a726-e7b8bcf2531b","order":2,"progress_status":"completed","dependent_files":"backend/app/api/citations.py,backend/app/schemas/citation.py,backend/app/models/citation_record.py","gmt_create":"2026-04-22T18:57:37.836961+08:00","gmt_modified":"2026-04-22T19:18:18.055339+08:00","raw_data":"WikiEncrypted:qByx+WzXalKNnda2aYUs+Mi+kQm14b3+m7dy1helFRbYWzECOnPEzHl0ufCZlQvKjQqSxHIwqppPXSdvXYc/8Z7buvJqBV/Q/faiP/SBsAH3RrfF2Ppti6QanNvcAtBLcojqJkmfYWFej1OYdagzBcSAu0xIIA7qBG1LwkdNG8crxSwebM8is42SnI+aRvlbF4UdAqHHPdfUvnzs7zIODnildIoR60AvLFeNEWO4prQkFyS16p1YH96SousrFgBu2YZZYrNOOhDXyrRoW3TE6990oaIi3Xe0B7jFtC4pce8JamwzT8B33FAJ6utCOBMUkFKq6l0kD5rN2owZaBtGc4Q66Xcb62y3arqrvxcgE1ox1nAp2D9pNqRy3W1ePW2fWZk4+3co4z2+ANQ1JO8q5eAFI6Q6zG7hM4rvNlL07iD+hZeqd5+vGw0KmjkN4VMqJC5ypFf5UCF4qHgB6TS9ToQUAWk6HWlwBR1DVpCcK1kyGcunn6EiivJyjJLRYUXI66AmajxIzRHtyhxBnA5Q4hZNgr40jHMoUbWHmiQTQr7Ca4/VDS2V5FWlm6K1fN8xWRIUCI3VtH0A/wG+QBnJmF5YeqDZ37Nx9vkiaO+hutXsGHsjwj8+IZO/gpn6UT6QpOGaeqGl37HW+lMZSRUqFFaLg7jxlzSa3IliOyZI7N6xjFFFTrLV1ShVsDcWDg4eXL2IjJ7QfXjmD0vq5mH8mkZK6HbhpNH5kFXDuMYWPIHAXUk39ttNvut9r22RLpkXYWtxE7XoqXW+k+Edmt2eNvZImq/e7mUwa82Cae86WiRtz7B7TJeOf96EvN6EQBg8E8KT5Ckd1exHhFtySkw3tYfChBZfD75zY7tUcZcC+McO1Kf0ORqTZtnNjVnot7wirysiS6WKQ3O2L0CeBUUV7DlmFd8xAgJ8YhtHJKulJ2B0yCCswfb+PR6u9GKFVK1EcspZe5BsT22vlhQyAJxlqiAi9xRk+XaCWoUT5ymT+KMOXdLoB4EvD2ftgXy5GMxZIK2q1QtLAYEu7nOBsq2aNAg9i9IsVJ6OlCN7VMzDinzkoC1IAWKxKE67ZeLq/VfPmCqLKGl0z1JfkfC/kU8KFA==","layer_level":1},{"id":"2f7fa0ab-cd3d-4f45-a1c1-389d5a0c2561","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"开发工具","description":"development-tools","prompt":"创建GEO项目开发工具使用文档。详细说明IDE配置和推荐插件,包括VS Code配置、Python和TypeScript扩展。文档化调试工具的使用方法,包括断点调试、日志分析和性能分析。说明开发辅助工具,如API测试工具、数据库管理工具和Docker容器管理。提供命令行工具和脚本的使用指南。包含开发环境的优化配置和故障排查方法。","parent_id":"2148d7d6-25c4-497f-8894-c4eb7a0d2bd7","order":2,"progress_status":"completed","dependent_files":"frontend/tsconfig.json,frontend/tailwind.config.ts,backend/requirements.txt,frontend/.eslintrc.json","gmt_create":"2026-04-22T18:57:39.374817+08:00","gmt_modified":"2026-04-22T19:17:43.353691+08:00","raw_data":"WikiEncrypted:F3QgleoEfoy16cQggYe9CzRj7niAsR4WPU/tuSJ2vBrZ49vjzLlsqusYQAR0/FVC/Mfa58hrglY/tUSn8LBYDGZlVr/UyLd9/U09SEPTjzLPzOXWOffceGYhaM8E9Cx6c+FHZRQ0fYUDQXxWM6dQF6WQbUmiZISlUpgtOkT5wX0oc/n1YeDUxEpgiCWnOdIBH6SDoRDdGUFrWdqF66bEdplp0Yy3VYVBKKwUy1XVXtLbdv1T5/0TVJO7EtkHdoheIwKCPIYHsaJqBv4U8cMNegSJ1Ti8bsgUakd6FM/X0ybfTay+IyTIqYXj/dS0tWMm22zjLqYmw59+s8gJ7AlgwXhqYhM5Ycwh/PNrDHHFbgQdt45DjAaMWjrjXrbIvM+kXuSiwxW0dEvQtouckPTVohVcRWEPbg2o02/8Y5DzmxpceOC7KgybfaaCQeJHbg9C91itVc+0NvorhivJt105EYs1ndSOla9hoFppywKIbIM61cvqgHjsJF5DrN1pneGmTtYxijl3J/QpJHn5QuIBR8ugoHdJ3EVjUR38vQReVBeDxI/VMe8k/l3EI/Zk7paXexGeTrJmmnZI1I6WbPN1TPS4nLFZWwkA5ZA7wMkdHiHdnt/FZGccFyq8X9Okog2xv6uqH6Kwz3hseWlrSygNPzDr0cFj2EQqDH7+xZDEkAvTuFLHn+HzUfBv0vfZFa/FRg+5/agC9EcMHM+75jEvtSeeHXHOLpuuFcyOcZ0IQP99QdzSEsLaISCINs5SKkzKAMQnJv4PEDo/vFAKBulCSqjXmLeyhcKmCGqafN7IMWUWF5pmZuXe7wL1F6n+x3+RvScmsWND74hQhn0/Sn8kpFHJ5xV/5t0GDZxWybDFRRuFC8oImKyB+6h8CstsERuFeiIjMv2TS5lz8+eb1/yCUkGO9X5mUpJZXfZ+0vu2SkEN3WR92tM5Di/78rDlulwZ4oykT8NzYMTzpX4WlgUfazNKLyIhSoFZcWUyOFcU8IWCoOdrBFn5CSpe0VXbOlP3pAU1Lz6Y016JUHo1t1YE9xU/m7OTxhMexA8jCoSswgGT+Cjs9u+KP1ji2RSyZHQ6","layer_level":1},{"id":"2713d5c6-c6b0-4a38-83f6-56940c2bf695","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"监控与日志管理","description":"monitoring-logging","prompt":"创建GEO项目监控与日志管理的完整方案。说明应用健康检查的实现,包括服务可用性监控、响应时间监控和错误率统计。文档化日志收集和管理策略,包括结构化日志格式、日志轮转和存储策略。详细解释错误追踪机制,包括异常捕获、堆栈跟踪和告警通知。提供性能监控指标,包括CPU使用率、内存占用、数据库连接数和API响应时间。说明监控工具的选择和配置,如Prometheus、Grafana或云监控服务。包含日志分析和故障诊断的最佳实践。","parent_id":"803bfef4-3985-477e-a61c-915a246d0061","order":2,"progress_status":"completed","dependent_files":"docker-compose.yml,backend/app/main.py,frontend/app/layout.tsx","gmt_create":"2026-04-22T18:57:40.355514+08:00","gmt_modified":"2026-04-22T19:18:41.773778+08:00","raw_data":"WikiEncrypted:HL3VqGjXq8A3aGeLxAjVPg+lnGgkT5PNghnzp51sgLDjuJwvzPZp6KDp64sXTqk/PvlUYRCEe6pgM8WKdtus6ThN6y8bzS650UmrWXRgW48k0tbm2PEPd8NIqpzEYwRwyuzLECVz8rV+mgvy+OHzvrt+wEQeT7z1uljirnxeLZWJjIrFBr8Q1T8WQ9InM3Ttnvm7OYO+YH2Mqi6IC38bW7w4WGqApS+Byn7/ZrJhR3B/XWh91FPwq0GRUJ9cqrNuIcYtnWAfVIHWOe3iET8Jw+Un5x7ZRepcJlINGIIMBE2hO7UsbC/K3z8rkz7mx6uoPTPpxkKkgoQQ1OAsShE/wpHpRYSOJEnV26GFo4bXBTk6xJYw7daKnJVIYDSqSrtJQI4yPlTR0OtJescXSLobznoVSBo+L+PU/nRvotp5KzX0SUpbkqNzGychqcBuJhpS1eaEP0cTBjvjC4MJ5Lsye51X6aOdYYC7tBWHxtgBO93tkpcIRlHk8Dfmzh8nKcD0rPHYGnaeFpzXgGH7ZfabAwxiMhej6OXWsfnbHGg4gheWhXfokxCMKkFnzrsYcuFtB0BqUeadjP5LArbJJGeyVEZovmPxtzQ5z/ayxJs+oyc0oH2SMXCFtIQv2h03ZSOCkohVRs2oTJnMI2p41dY59B5qiSOp+0qwxTWL9NnpqM2gjlLZhcgwF//R7ag4ndECWejInOcA9Ayvx6cPAuH6uEoFTcUOCLaOZ/u9T8890S5KHS7PcNM8dEewoFviz/mRiernAhd08l7a9lR6zck842Ywi5H8+fuuHyt64Pwco/+52MhD01pkK+HWSR0EqPc8URlkOKjQSW0jd8E/9ow54aZA0+1Vto3d+Lqi/tAOlhRF34rIJgTEN3f/udCEVycON9KNtssYzZVNPdvTkvzPYdUHIcnYmz3jbQhnYnrYvuaWNvO0cPISLZI9szxLP8IhmUc9xT4U3OvoRfFka8TABGicEUAF6vpH6H2rCqnWdBydaTpRTa3VAR7QJ+M0aPlzeKov93eljMa/djYoQo+w8Rm3A9vGmGXJKfWdZobh+fQgc38Z/0yRCHnIPnY8o6CDBfwbANfjDRpjyVkqWq1cuqYNnMul/jpzDS9vMSbMnefISRuF0kH8XS5C7pIB+WFn1vxeYFBYED7ZI4FD9pxxS6GWGcYOXEoFcqtR+lEiMdj0Q09jo1nEuMKJbPQre/RG08O0boFCzF9KOSnS0UA09/82vFQyQZKHNwpz7OkZZa2cX5X1L/pdsDlDRoIdp2lzyAEOidStaIWywEj11EYVNbG7sK562p96Sr15ueIXP0s=","layer_level":1},{"id":"c8a468af-2982-4d9c-82c0-313b5d2ee89c","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"第三方集成","description":"third-party-integration","prompt":"创建GEO项目第三方集成的详细指南。说明新AI平台接入的完整流程,包括适配器接口实现、平台认证配置和查询逻辑适配。详细介绍新数据库支持的集成方法,包括SQLAlchemy模型扩展、迁移脚本编写和连接配置。文档化新认证方式的集成步骤,包括OAuth提供商配置、JWT令牌处理和权限系统扩展。提供插件系统的使用指南,包括插件注册机制、生命周期管理和错误处理。包含具体的集成示例和常见问题解决方案。","parent_id":"b2bb2e3c-5661-497c-97dd-15bf6ee8b7d4","order":2,"progress_status":"completed","dependent_files":"backend/app/workers/platforms/base.py,backend/app/workers/platforms/kimi.py,backend/app/workers/platforms/wenxin.py,backend/app/services/auth.py","gmt_create":"2026-04-22T18:57:48.68499+08:00","gmt_modified":"2026-04-22T19:19:17.361215+08:00","raw_data":"WikiEncrypted:WxCGFGSl9zR6IDeUdkqKNACFcGLyx5HNn0UQzHtkOJVoVN2BLrMtPbbNkfhYYzEQGaeK3o4fBODff6YTXKxAV6HYhCHjmdXJqBaBsEPBB205lzDAllfBZL4/6ljz+/HZSgaWAxPECD1m2GUFvjlKHTSXEb0x5iVOg9R3VDjYQgKl1SF3S/AuJj7QBbGiwmkyPrqO8+NXDlKH7pI3G6me5ulZrK6M85KSH8nVAnqY/Mvjc6UGQJBwS1QyKJVzzK2JwKGhQSSLemxD887b22bSe7q1IEDRYcpqkbfyICB0zF1Gg1h/cAfQgzjiG0+MQiC5CF3QwkFteFbN4KZDEjCTcbIR+HqI+yCs8Wue/MwdoTYQQKpR9FyClONZn5T/UqHQaVT8SemYF0QC/kawyEZFH5Tkj/6RwS+taTWw1fx2QC69xQlW04ManahzsBDwfz2W4RkufM3ZfW8HAN7SorY7oYr1Vam2p2u/93jzHmi7PO/Y6VphQNACzUlfRYsPALVBkiqpN4TIiicrjOvhgATUxqpku2MrAtbXTkiuiiQBamK/XrF4JNlh+79VGoHKWniah1nvo+dzl7jll4j0woKwWKIzmfPXLS68HekW9h5BH9SUeuyAEW/pvnGAUw8Od3CgsEmap86k42Tg9pRZC/sT9bCWUbjO6ijJ9IPAgWE6bkLCu68L2BD1yKE3gfLg0hJmELn79lHaFCUc5jlRdJ4HEsalAFGS62beLGkude98NvSY5pQoO9jbTj3Da8t6Yj8p97WtE73vmWW9Pu/YyAtxJH7Cdwvv9mbvLYVnLzUWGwsaiaXmDJiqfSHiOrHQNyonHQa8N/LYrbB8qBSUmLyBUhgI1YfYMa+zNfCaeHvRLlmVZpui5MOegWen1Z61WhPc6WoFYHyFAdgS7k21cC9jVay3u87SjSzooFT3MJjN+yMIjrQ5U+tVFbiBQK7IGPLFHRmvFBrBwSFVBI5VnCxn4piz7VBp7mm3e6N3CJUKShQWQT9tmUIRXLmmzsKTit/kRAUrycFjixIK8Hm4kSwtVBREbX3opXE6clXKGVB0bpSDUzB8Ae7wOPE8Gqo/ewy3kh2mdNnvI3+MfOOgPc+Ovqu3KGFBH/MYKl2xIUGdYtEHfHRCIFFVVknX8+Q+tfbkmo/Tw+kJfq67IQO6VT1WjP/q1G3rOhp0Ah5h1wmxVfdIaHSUOT03yQTBm/tqCXlgUW7rZbTc2wF0zdUUWleQoq9pc14c0F2SNFCSaQNLhxvfeC2aH8O9nuZi+kVb+GVV4vWcxcz/7dfTkXpogDwy6uqVHySe/TAn04uWlCabYSrA3ahnl0VpBmalBU1dtaTG5apgcCJ9PULyHWKf+iW0vle9pOVgZQ4oUv0vXxDpZQkO1SOBCfKG20swUEItxbAxIVoMowR52maIRnCKh3g18NF3JUZX2ptDny7A2gmsYWU=","layer_level":1},{"id":"d907a8eb-795c-4060-9cdd-50d31cf39be3","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"前端系统架构","description":"frontend-architecture","prompt":"创建GEO前端系统的架构文档。详细说明基于Next.js 14的应用架构设计,包括App Router的页面组织、服务器组件和客户端组件的混合使用模式。文档化认证系统的前端实现,包括NextAuth.js集成、会话管理和路由保护机制。解释UI组件库的设计理念、组件复用策略和样式系统配置。说明数据获取策略、状态管理和错误处理机制。包含响应式设计、可访问性支持和性能优化方案。提供前端开发的最佳实践和代码组织规范。","order":3,"progress_status":"completed","dependent_files":"frontend/app/layout.tsx,frontend/components/,frontend/lib/api.ts,frontend/lib/auth.ts,frontend/next.config.mjs,frontend/tailwind.config.ts","gmt_create":"2026-04-22T18:56:47.082624+08:00","gmt_modified":"2026-04-22T18:59:54.994275+08:00","raw_data":"WikiEncrypted:rJ/rIw0gVau8jPGqKFBAsMR2XDSFypkKHZQ6YBOgiEA0UOTwucBLEBMXoN0zA9Bs5lWPUuoWW2QeM8S5V6dxWDHhuxV1hyEK1ZWidiLWXQ0Ty3myBMpAD2c6K4k+WBXTzbB/LSiT+eBspY4JDrFCERTHesMlZxmLkXoBxHhs1tNBUepc5vLakFhznlq0LnlxeL4rgh3sn4K3X8SUOtyfPLTTiHiYFX1izFe8OECB2IMK18WRZ6wEf8jE07MjvB84altM8K2LDZJuJzb9sVMHScnXdK5tj0h0e6umXrJaGJBmvoTYNrHRS8X5aG6wxHFk2++zjoVcgl0sn/xqIsLYfqvsbh5vyhZbve/rnSnstsC+sb3Y37uzU9GHpU8FurekIf2vv+ay2i8fI8+VjXnE+QwD5CCdilkDU/9HH3AB7DhbDIwtq4BCfsOfZ43Y2qHzi2YQIjEXtFPC1VmHGRHr8xER65CLZAA8mbMjuchuGtp3BACUF1qd4eAqJ/FgbGOAK91hIqJ5RCKNCK94pbyxdxHrk0LQZ5Rf4snzR04i3q8QgjkGVcb5g567ADjq1S0CD6cj02MH90QJKtQxxq3S77qC5VvUfuqb6qSVzyBIHgjg5XOY4yyA7M2hklmuVlFPgpiCV+xb2G0p91QgoWdUnfUvJ1jeyMVi7sTqisb6pzW4v+DOhMfQ9U1z47f5h41KqZU+i+xLwpeOZYvm0UNtd49SW9uxOloegNujRtGRYoooiPmjed11BdUxZfPR4zr4ZOqMq4zjmz5Enx6kM+9X8hZOPnVQ5CnZpK/WSKI32z3A9cFhmwVRLL2c8w/4XKbLREhUc7DBaViUi8oFpl9P987cnlqqptMKQmCIZ0tOKbkICKr7JfWGIAsxT81oc8qS9qUIeXlBpE5JdUQp1Ie1EoaX5wxX22DELkU75cKmIBHu+67dOrltjMRSKY3ZBmjzGuNgpHMZ1/9X8mFHbppwoTxTgbfBeYCWbgKe7rOhN5mO0h9XscRtoFe1djDYATYo7A09YiS7rQ2wP+FA0m7wEbLvAesiRZYI8ZDzVOgGqdkP7olIYqRcgjkJ3ZEYVOP/YwXprUfvhj40s5uHRQgN1DkVo4GaV9bQFpSHYyuVvJxLpzL4PIa1TC6wa8n9zFrUoUr+93RnWxM9L4G2oS4S54a+tIpxJWsI5jaKT05KwrFYm9u3iOaXy2gZsoxdtiHRE/Esu3FvYkFxZpCgJXBU0L5PL5lgpfZGzQxP6184e3cD5E7zrBWnFpTCdgoFMXl1q6lBqJQVQcpijAleq0R2Amj2pwxLHge4ttMUkLwDlNK5xdQgith4x1GgzvXgndvlRn+E0U5SY5IpqM88QcfH0T3V7T0CEYhYBCSGHolS/i2X7yPjY7JlhGmEgHh7D0ZXq/+GRLa6y+jz0mq+BjNauuMGqTkhaZbR/M85ZNbyJ+s="},{"id":"9eee7fab-6cd9-4ef3-9415-2f8137f1d199","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"数据模型设计","description":"data-models","prompt":"为GEO数据模型创建全面的设计文档。详细解释SQLAlchemy ORM模型定义,包括类结构设计、字段类型选择和关系映射。文档化用户模型(User),包括用户属性、权限字段和关联关系。说明查询模型(Query)的设计,包括查询参数、执行状态和时间戳字段。解释引用记录模型(CitationRecord),包括品牌信息、置信度评分和上下文数据。详细描述查询任务模型(QueryTask),包括调度状态、执行历史和错误信息。包含订阅模型(Subscription)的设计和用途。提供模型间关系图、索引策略和性能优化建议。说明数据验证规则和业务约束。","parent_id":"7c2ac186-ec90-400a-ac1d-b3b7ca2f01d5","order":3,"progress_status":"completed","dependent_files":"backend/app/models/user.py,backend/app/models/query.py,backend/app/models/citation_record.py,backend/app/models/query_task.py,backend/app/models/subscription.py","gmt_create":"2026-04-22T18:57:02.317816+08:00","gmt_modified":"2026-04-22T19:19:19.281909+08:00","raw_data":"WikiEncrypted:klcgW2PbPxJambbKMzvFtzxL0nPpsuPMPxr5hj83lS7k/WfePQWgQNKbEysjyVqFS8lXlJL069Py2sSf8yXxHJzOE+5qAqcKClz711a5h2iXkF0al3mIdEvPGsZtmu7Tz91D+nYN6P20/dGDD6jbfsmIRXLEv3fpccmaTd5XoNj9Y/QT7a0xg+LkG6A8bzQONV8mQsFJZMj512PXdrzG8bSiiAdWa7PEbotJVKJRklAdLNFr4FCsLXLsdS/G2RlAo97zi5J4mpx26Q7SGM1kx14TxsQYatCIUYP+iZ14NDPPPp8tQ+HGPLEonVbYiRiktzJo8Iaqbcsh59qHBoGZBndXEwalDBXzD3sIbYrhxlOU509HDe43hiq+M5eC2SEeTfGdYZ412t/aAJFPEfq3dRl0wa6Oiw4t4rox0s/f+rCg9Sr5yX/vsXrADGwowbhqt/EdTudfsdha7MXN3Kn9e9TckQ+HOqdgqW3+RnY3B08ijVPZchn/Y7XZvx8GujUHSuM3x7EDAXegqkPwkfR+hl4yb4BuuY5AC17g3hvn9yDvBN3m/Ky7mJ4Q9qvXfFaUqDE/FxwPWjugAnVOgAmWns1elVLUS/2nol2BUAuyt1w821y7+N79TkQ07amTWILYvO7I/5v6hStaHk5+ftwpaWSLofuk3Nwbuab8ULq6lj/Tz3uWkEg5/nIIYGVDSN2y9JKgkNta0J9Y4C25DpKnPb2HPfbnD/315IEyxKddS9DpOHC92uT3Ad5v/X0LgVsefqUUep4D2mVUeevDE2o9NuUqYyWYu16AL2UaQOWH86Q97+Accmt37g5580pjdVyzcgVL6Lat1P4W42Nk0vOIncIdM8Bt+iWUIOjmIWDK6nUytRrluJ6RAGeewol6Eb8eMy65WkJ8SsDWFj936G3imq6uoKEsmn9kHznKIfsvt/p4IAv+IbkliuuV7/VNQdN4jgfgKyRp8b4aQd35Qrv1ypuTdf2HQS3w/t3nb8hBriaZZc8a93LekZYaGpvrws/aq3ESXMU+csJKfWhEGhH4VT4cjy6j+jHgihUuUWhO1X/Kpm8iseqreG85CZeU9woTd/nPIayXO14kUEfNVL1ih3p7GtsFGDYpr4EcPU7JpPp61gLhfdpHydKVDLW4eaaCuTR4REP2Vs2BxiwN8GCpJcCbpPeF52n9qB1DE3uIVBITabqC0jiIHeVfb8caysKpddelqqLNn4GGL7BeUFq4RKhlVTmCGuBRWABBDEhDRHXsScje6Av8bOxE/QFVlZmFE8EkDM/WhG9hB5BQ+8u4pKPxsL3/n7xyMyrBnO2n+nTEGscgwlEnpxknYpBTrtZQgU5YB8KRGG+VnvSlbM95vPmdiXS5y7JM9ftKUbdxgnxOVrM2ydbK+5IGvaNB27szvHBbvqtxiY8lXfLRhMYcQEIcD0AM4Xl1qH90xIrHF3lHogdPgwXR/UWGRDWDXKVUEXGRLQHTlRTCJ2oRBGig4FvIztUbBVqouwtJBqoGXoMET7JbuNkxdHs7pfsL8sV5FksVAyNxvV7rRG5QAMaIvUMdDT+XAhtcrNagCHcb53sPxuz9ldlj9adP1H+FxOw7","layer_level":1},{"id":"d9e45b2a-6443-4a9b-8ed3-4c3c04773772","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"UI组件库","description":"ui-component-library","prompt":"创建UI组件库的详细文档。说明基于Radix UI的组件设计原则、可访问性和一致性保证。文档化基础UI组件的功能特性、属性配置和使用示例。解释组件的样式定制、主题支持和响应式行为。说明组件组合模式、状态管理和事件处理机制。包含组件的无障碍支持、键盘导航和屏幕阅读器兼容性。提供组件使用规范、最佳实践和自定义扩展指南。","parent_id":"d907a8eb-795c-4060-9cdd-50d31cf39be3","order":3,"progress_status":"completed","dependent_files":"frontend/components/ui/button.tsx,frontend/components/ui/input.tsx,frontend/components/ui/select.tsx,frontend/components/ui/dialog.tsx,frontend/components/ui/table.tsx,frontend/components/ui/card.tsx,frontend/components/ui/tabs.tsx,frontend/components/ui/dropdown-menu.tsx","gmt_create":"2026-04-22T18:57:04.216865+08:00","gmt_modified":"2026-04-23T15:22:23.573963+08:00","raw_data":"WikiEncrypted:mOhGqVhKXtp0S+QeVzok74WypWJ7klGHRH+KdUSnimLTYfyBjBDRPAzXT+gcOXfQVvcrNlnW0hq9eH7zZFCqkZsBgmYKEU+paWYmItwEmPFSm8j97/vwvs9ugP1aTV0WKgu1SgAg9UjbHTpC/aH+MMWl8IEcuuqWfI5XbGaUR87WXcEDmdrb3wUoUJRDu/cGjCf/fvmakwSGbuyVnUxAKC0b89qWigFSx7MqlY8I3hXqAtSNiskE28duoh2j488f5d1qN4KsTvxvRe26wRYqlD4qzi7WQGBZQUoeoyVRA8PrJFhxeH6clcVYO0kStx160hPPrlpF93ul/lDmdVwrTZfpWh5RRY5u02+lOo2Vcl73yz1ixYzt/OXYaenA0jUTFVdPJ2OcTZGDQV7xMOPFPX3iFNKxuHY9aks8ARFEUs2BtyH+KlyKfPdKqDAlklqIVzP4MH2E6uDcvYMSORu7S1T+53+R9br9Cfu1PSZkuVdmHNqUuKSLA7pMI1QiVYXtwk2GYmRGYUH7geeQddC61wxpCG1rXcVzBMSS8LxtR3SSj/9VQ0v2YyrqKzRh44BKjm+ojKbz8rNcf69UZ5Fu4dU5kGqXy/XWbFbSmoUmrWXnZ2zWPhMIgHAIsTe/iX6JC5Q3L70XVbXk4S/ffk/sKKtdV7XrQVmVPhSquUc7x1RcfMyLVgxyoFEOwwk9LfQIPE9n16lNCvDWX3UuK2TDcqDbwJQ/FMmjaZDilRQFs+8MA5I/UUtC5CyzoOiLRXvPqQQiqXjBs6jefxc0cpGAJwUkaISOvQum6WtKWK3y1CphRMH2hkB4bF7NgyOm8z/0JXMSpcPR8nMUY4M8pW9MZYQEL76sWcQAD/oiWlgAUccgiRPnCiU0Xz7/MplIj0jTRwXXzc8arUGle1DmiJFEVmztGZOQsIGDqSwKGG5XHEdLyKe2hWHqBGRWkqZrsBqS8KrFUWk5lefvdDZvi8ci+S4wdZQX8IDx0siYw5cfdMlilWuaptf6qf/qEVaIO5DX+MMGPmGBz7jnyaQfo2QWlpybbe/uLTvhZTe75uY9Revd+DPo+zgmDUmGj4hSliiZx0smUxDq2wMZmKLx3x7N8m1jdGgqT+LVQAhdUcmE1Qx3W7e51K9wB4PN3L8k8bDewzE25kuU6a7QpDLdn5lSa8n0E0Yug9cp3wgllhZVFVmyjVr/oC3c0I5z3elvtrYub9jPeRtR4AmW7w2RPcUt/8f7j8aMH/1lUBQk+GL6OhXAEnzmav2Q2smdsQqWS4cVj/FV1lrfoV+peL4fo5CxYMv/ZJSvbJaFSpBOPzf09qJBxUptVeosUyAUDv7YsJdUo02ZE8B3ZXZGcpKGKSRiBeLQKjuqkck1rBeJK4PnEEXZ5vtz2ONe8tddj5qna0a3","layer_level":1},{"id":"178b681f-d013-44b7-aef8-dee7ca8c22a9","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"核心功能","description":"core-features","prompt":"为GEO项目创建核心功能概览文档。详细介绍GEO平台的主要功能模块,包括用户认证与权限管理、智能查询任务管理、品牌引用检测引擎、多AI平台数据集成、数据分析与可视化、报告导出等。解释每个功能模块的核心价值和使用场景,如查询任务的定时执行、引用检测的置信度评分、趋势图表的数据可视化等。说明功能模块之间的协作关系和数据流转。提供典型使用流程和操作示例,帮助用户快速理解如何使用各项功能。面向不同角色用户提供功能介绍,如管理员的系统管理、研究人员的查询分析等。","parent_id":"1bb55e12-24c4-42cb-8f59-ddc303460d45","order":3,"progress_status":"completed","dependent_files":"backend/app/api/queries.py,backend/app/api/citations.py,backend/app/workers/citation_engine.py,frontend/app/(dashboard)/dashboard/page.tsx","gmt_create":"2026-04-22T18:57:13.330097+08:00","gmt_modified":"2026-04-22T19:20:37.649775+08:00","raw_data":"WikiEncrypted:luoNp8LvFa7zGThvIT9T4gfD6KbzJyTAydbcRfVv0b4BXBAF9G/unmbHb0x4cm5f5JJeO16NqGe5C5EiggSB7moDpXZy5USSfpQ0OUKuil4F/RTioDPMtSUudIqxEjBd5ipsj1OYjuKwvCZDE5FVOSWKxyx9ABPAcj2ixa32ZPlrgZPKHD2EYG0qdFR1nrcOheMbdmmK/1DGPMM99yCcIRnhsKb5QMmqrZbFGo/SPCSXi/Ykr/zd7+VtVKLrPmeZHpaF0yafvwU0Sk0I8ne8YmfwUGC+cOZoDCI+UsE8IukB5R7bnolQRLXvVZdnHXG3b2DA0X4DxManWdKVUyJxI0KTcxcdI8DrpJB05TyoF/regQH6cLt9xm5r6oC5exXEvwhmfMoZVqZ2jp/7LVs83k3vKksFtqXA19YrxFliE+fS/7xxjhqFqC8gfV8eLWpHyIKgVobBj98SpzX6tRTXknjSX2kDpfKG1ECCqYBxGl+EcY3ofgMb9dgxDxdOaB1JU4iP8j0YMHe0vASK6GweE5UjId3SQsH4Qeng09dL1TY2uNr/6ZVhraG1xTMRFHeZNdCZtAWnUddTk6fiDJmF3zxyL7Wvgdc5vmSbfg0rFxTdxZEiGFHJoEQatTaUtv+NOJGQtnOuYzrhs6G59N5Bu3hnsT2Umn6jFryaWwluQaphllqim1VwA12J3iVLQZFZEVBhalhF5GQBDtl4zt6GFlKucztFwPZXIZTYJavPQP2xpvFDInehpuQcHilp3yHcA8+ucs0ani/GPME+nWnxyEDPhfu/FHkheybrXg084bLJG7E+o9XWBTlbISgl/1CuVNeWNj2ph9KIS+TAcq3NucrKast8dNM3bayIymMoemWvEcvuUjoRlABuJKAeAUQ2q5dFWVAZFvlK8de95GljY869ODymzBXnPjMOSCmHwZ51ImNKeIgHybmDkzT72uKyQcN8nty9DJKz0k6Kq5kib65fLCcoAEe/w3d/WVpmBqxU1Uh3yD+z1nEm++DCQTmK1jmwwLT9krps27ULzjOvLuJz2cJnCpSFeB2fBYxH5Wjbp3UZFwDWJWan/9xl9bIREOaZ7mmAz3b7YgA+106K4LV/Y4vBjtitwaM52IcTqvh0m2OKpQSYopXYE7hsG/CXE/MACxmx37ut0KpTFaM7N2GYOE8Z9hIsM53ueQhPuRvk2Hb3E8xbBs3mMtYON2ubkxuPdcQJmCKSHZTgVqD7NVWXIyDL87TjV3YTbdGq6KlIptH7MxMpAvL03xq0ApGXUlF7gt9qwpHG/tuVSmjPBAUAEXRZ3bC+1E0tvaaIPWgP63+hhl5S7970UrDCXrtzeN3l8mbplzeN8BTm9brd+gziF3NKUZgA2yM/OiHjy2jbsu2NmXU8Q3f57Q1MnJglrwSgciwgohkp5Q5XIBOCwyJuIcAxO6LJWzaXB+WOrB+xk7v3h8qxpMdfHMOLFTY8M5Rf6MoGtJPOtFpc1+0Cjg==","layer_level":1},{"id":"f210509a-2381-46fe-8c22-0ed768e6ca70","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"数据库迁移","description":"database-migration","prompt":"创建GEO项目数据库迁移文档。详细说明Alembic迁移框架的配置和使用,包括迁移脚本的生成、版本管理和数据库升级策略。文档化初始迁移脚本的实现,包括表创建、索引建立和约束添加。解释迁移命令的使用方法,如upgrade、downgrade和autogenerate功能。说明迁移过程中的数据保护、回滚机制和版本控制。包含生产环境迁移的最佳实践和风险控制措施。","parent_id":"243a1a45-d31f-405e-a3b9-694d2fe617d5","order":3,"progress_status":"completed","dependent_files":"backend/alembic/,backend/alembic.ini,backend/alembic/versions/488d0bd5ab01_initial_migration.py","gmt_create":"2026-04-22T18:57:14.161329+08:00","gmt_modified":"2026-04-22T19:20:15.066432+08:00","raw_data":"WikiEncrypted:veTYwq2y4io5qXerCTrkkH9ryxDJ0NroguMukGrnBDccbI7FhPTNCbxlVVf68ZQ7vvUzAxXQ43tY1R33KAEW91uvBjnohUVl7Q+D/Ap3SUnHDpWQWBM8qdBbgPmANzeAhinu9R6LqaM1BaUXXk7OeSNamXR7nrg52Su/KTt/eSPCFzeoio7iY3vORVHeaHpWs3y+ipYf26jobCXk1cLVjF9BgaKQ8UIEk4JobP8DZM0dSC9SqfPLDnh2e6k9t39q8JNd3MaV90E75j7KuZKZZJemgTfwdUTe5c8Bn5uNxCf3TK5iuMxVxJXD1PTU+9tadOMcx1qXGJ3cb3nuH7g/03z2UrmsQfIRf/cZLGBqAdGIWhQpJph2OlUELy5WTq8t4R//c0t+IUVTKieR2A1E1U7uGurYXL5ymVtiLnckbHeLMEoxbJYmh7d4xn4mWF5hcIhAZoHvjqh+shIGNwCfXJQGswpnJNML0vWzQNhsJ1YcTUnHC0P8Y6nj9VmXMpUYuJLWuIRuqBS5lkS7ChcQMXO4wfad4N4RMHX9jLYytT/wOoty1KlEalUzriEMahdDn7h2DsLzOJL35SLwpVZ4NVnInvcE89IzYO4wyJIz4NdOfBYseoIv20Qv7qO8B7xhRtTudUyynfaz1jmkT8F9UgZFcdBJqg08MH6VdQSdrlKqUGSGsFAxtB9OC7yv25xznJq5n5SUwpLmFNbQ1evjOqqsogzLg8vClnH52aVuE6TfQWggj1wDjxG7jUj/W7mHSOsDI6AhtMWrP+2OVg2Wx9Bab3iLivdVe+mg93LH2FvF3a8iAdcDRseeNZj2UeJJfYnmzpsRpm+CeJo8Te1ab8UeOeGebDsnVTTILuEg+qe85nTuG8+PmgOs+n4r+781gUSlyoOO2Cde7QwES0X+oENbplkkSZM719jK09dcnbG27vqoeh8rTrzO9ygM48IjQzZWUJCnAIP4Y7VVrcTBiyrZhRLikSrVvSCvWU3K7KW18pnOJh1narIx0e6w+bctledpWsEGZJ9fwk/ae5P5ZvACxfM/2LOdDFqshVbr6grRIeSNNf+tl5nDunlOTUEY8fGNt4lsr35UgKwPwO9TxACZGCsd25DuEtHum9DU/GYli2+rgNaOokcc0Xtw/R8OuN2pa7ohiD6ACjJ82m0kKC0mBBymsNAdo3bDXv3yoyI=","layer_level":1},{"id":"aad61788-1dc9-4682-b743-47188d7aecb6","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"引用检测算法","description":"citation-detection-algorithm","prompt":"创建引用检测算法的详细文档。详细解释引用检测引擎的核心算法实现,包括BrandMatcher品牌匹配策略和CompetitorDetector竞争品牌识别机制。文档化置信度评分系统的计算方法,包括关键词匹配权重、上下文相关性评估和结果排序规则。说明引用上下文提取技术,包括文本片段截取、语义分析和相关性判断。解释算法优化策略,包括性能提升技术和准确性改进方法。提供算法调优指南和实际应用场景示例。","parent_id":"7e66719b-4a8a-484d-889d-10fdc76788bb","order":3,"progress_status":"completed","dependent_files":"backend/app/workers/citation_engine.py","gmt_create":"2026-04-22T18:57:14.593043+08:00","gmt_modified":"2026-04-22T19:21:33.125768+08:00","raw_data":"WikiEncrypted:qByx+WzXalKNnda2aYUs+KheFrHbXoPYZO+RPCaekyWxjKaQvamRZeOm1WgroVS/6iDS9zNWvth+zIYrS27hz/NZLNtt2wOUw9iZG139S+OGMVcZB6KjsnlgG3fSA05ZEdrwDfB531npeEpy2DodlOkcXOSBrgCwkOsVexBDKcWLpthBpfOCieqWsVnTfFkeXE8VvMLROtjojlr+6So18lnYzdEekhgU4Az61W3QEoXC7l+uPBNpRUYZY9z5nLzihT1o3I2bDEfAACTaa8pU8izFltiEd4qID4z3TepI7IuVr7oTmPOaD4MzHULu/4RaMo7/7c9Ql0uGsFrxRb3QFXiiH6QZN++2X9EDTl4UjA5k2E+OTcO2UOZm2dV7vi51lNAZwI50VwaIjtaC4LrPpX7fklk3hQ1qbw4w0FPjYlraJyO5MLseOOQXmURr5BCOhJcWoJmwJadtfh8EAO/9XRK9CRjr2wpAuL9kan2Vkympa3UCszQwVox0j4IkjJNYlG/7UEt2ixgTU4pQi+CAJy+8tZGJxY1gk1MCILniaClaQQImJhi6TfYfWSVywTFVltVcxPd7kMwK116KQmtoiqet/DRC4rzqeEbb6w8I7HZu+VwSR1TXSN8teXJTRMAFEgg9vh+vAOconlX3LzcgvFPohvC+teXJqTADp9XvqcC6Xh41G53xVAvDteT9pJCZHMZsfgh0bErBFzrvnwSObsmJEkvWnlDRN5tdVsRIk9LGcvaflUwWHmIof5SJj7wO9fSm2BN0gW+VA9nbQxyuHt8YqvNR5D0WUpbY1/UDw6IDhAxuTh/6yyVt0HqirNDXslgDardkMaphsQs4xh1fShhK/PcG4y+xX5VsoXIm/tjfGAEXYIeGOHtVuldTaCxG32uSnuT/aFQh7H6df2Hhb7c576oZ6QbZ4HyiG+Qa9iZr6deKWdGhtuuUzj3FBAXLtLont+yuXSCWi/AWM5MOMVyScyci2LKIjH5haWCCgS4nm9tLvifzUgmdeycw/Dhve3nrgdkgO+bIRuUQxXRIxZRUdxEr0DKIa2tEKVeorc5pIX9m1bErC53nDhnrLBj4/ZQjHp33XcgGQ+4jAfmWK/AN+P/SNbyF/K6O0qlKXPqQk/w5bOZWCtcIjrDLhyxZce/pYHOGotrSGaKOK56cJA==","layer_level":1},{"id":"ac0658da-7670-4e41-9e57-02d9d0d50680","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"报告导出接口","description":"reports-api","prompt":"创建报告导出系统的详细API文档。记录CSV格式数据导出的完整流程和参数配置。说明报告生成的触发机制、数据筛选条件和输出格式选项。文档化批量导出、定时导出和手动导出的不同模式。包含导出进度监控、错误处理和文件下载功能。提供报告模板定制、数据格式转换和性能优化的使用指南。","parent_id":"dd12cc44-0c95-45d5-a726-e7b8bcf2531b","order":3,"progress_status":"completed","dependent_files":"backend/app/api/reports.py","gmt_create":"2026-04-22T18:57:37.837258+08:00","gmt_modified":"2026-04-22T19:21:24.246329+08:00","raw_data":"WikiEncrypted:ncgUburcUGIQoFYRn+jCfmA+PbmqRFCE8+U3jYVfh2v8RywptgptFxq5lhwZlmleN1AF4e6ox3Zeepx7xqM72ox5n+mZFIvpPAV03iG0mffmuvwBURuWuzG3zvukYRbxLcpPqC6v5q4GXBz/rMTsxy+K9HHfwtlYbga6fioIcJrpFn0O0GBCxvse/EcV3UFGM+LHRaRVZqk3N16dHYVOsIgwcqfz+E1qQhOc9tSvlN8OuLBl1z0ukshjGXiX/lY4xzl1WSrFXAIsz6WAKGLPlkePgVZg61CHsK9/iXfq1HIs4Mv/RYwTtuMKkyWX9+6LO+AwRjoeHSIVgJsaSwMBS+MqugD6JwGdLsb5/QGcsDSVaN1zVhbjD1WnJ01uK+tBWcULWdYGAkgo7z9A/YQJsV8PUfXfdZnfuydZi59mopfaX1AYtCXeceMgKnzkAIwjWUl72+Pwtvdke5upjMFgEvoy5NrCoYwpZJBePLoPrgu0kURoy/vWGZ77WhOuGQs2/cn/pk4vCFes3r34gglCIF0tHwwh9piyAabHid5VZ3EIuOlhBHL4O9L6zlAgO0opbo23bXt7kIR8MIjEqb8b3SoUIGY7PElOLeOIwJiz1LzOnccT84S/avMIJR7fgzi/me7mJyD+8h7mZ3GY/AsbFhi2oh6bcqc7U1UcO40wTqx7myMlwrMOo9zRr+aAfR/lqH6YwFw89kkxflBfKQ8X7UwPI/vFeOnYkPFjj7XzgHUtclkOUbxztMSSnhxiBMGzbNf6/hnfqT9O5xO2ZF4ufJ0t2Ci/vTK7mqMRvj6sBAzXnGCig4zpnDKbOrVJnB53v6AnqjeFLvqUCGI5Aj9nn+g4LDMtPzzDhfm/HtoxVJjclFmC6FQSLvHlh2FILylIvVxzY7rDDuK3bTiuZFz9Hw==","layer_level":1},{"id":"7cb1d921-44ed-4e22-8bf9-baba7ff8b7c7","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"新功能开发","description":"feature-development","prompt":"创建GEO项目新功能开发指导文档。详细说明功能模块设计原则,包括模块划分、接口定义和依赖管理。文档化API开发流程,包括路由设计、请求响应处理和错误处理。说明前端页面开发规范,包括页面组织、组件设计和状态管理。提供数据库模型设计指导,包括表结构设计、关系映射和索引策略。包含测试驱动开发(TDD)的最佳实践和单元测试编写指南。","parent_id":"2148d7d6-25c4-497f-8894-c4eb7a0d2bd7","order":3,"progress_status":"completed","dependent_files":"backend/app/api/__init__.py,backend/app/models/__init__.py,frontend/app/(dashboard)/layout.tsx,tests/conftest.py","gmt_create":"2026-04-22T18:57:39.375268+08:00","gmt_modified":"2026-04-22T19:21:46.916012+08:00","raw_data":"WikiEncrypted:5RlNBsIi2/3o8ATlHuzaYHdvL7yJfTe6YPwFoSkO/GgZuVYfBQkVBn+1kZzpIDRMGSVFSuoDX3pyax2f9XzBxnZshkSCM7o1L+HEG+sgCns6EUSGCL3KfZi4emTF8vVzG/3m0dhVOWuoQXf3TK1+2Aa07EE3HJ86aWB+sLQgQyR8gNqS+MsRztbE2Am9O9oDis36vAh+tGO64VIsi4ulSBpI8D3+dRXcAI8RsujwrZpp57UaW+DyGg8Jkp+WqqjfbgBGcdkno2KfRFyWKqKLB1g6yKJCePYymOK9DHhXbdBC9mKr7EWc8T394B1klPsqywIZs0i3xy/Pr5FAuzklEn/8jhNkYpmgcVvXaZ43AUVTklSOgSC0cwvfeHd91QuNSlfIbIs9Xh0pfhmz3XAts9WErkdoph3YSvrNDMuXK9CMNhlu9XMkMCQcV7ac8ax69JKW4uVaVHcjbU7PbzOeQ7vSALRtfK0zhIWlbQ3za72G9FvDogDqrLfOBzEXA/cyXMdpeZP/ICE7OsSCRM/i/yU/K2YUAWnRJczSn3cX/8lGIDywmB0jU+IL4l7eteQD1Ea3elS3ne3N6t0WqX/T4jybDWQQZqz0+gOrFuJUKTQ18p+2afWRjcYZnqg0EMvXxpXaT5fmpQAxMA89c70flWUr6l+ZNckhODBS1Uj27vp+ECTFfhbNt2CmqrDWIfdobRz1gXYkZI6LR+xgc598+CJDjc6zizQcychGbsbPqawU+CCQfSVqPCknZLlSyJrMF+FMoe4jm8fpOVyOOfqGN3N04W6++aIiU3eZIMB0F/1pjONP/d5egIYaJhs0Zo+ciWBBR+Me05kVd2tyIK0ldRH8iELZu4XmfrNdcGPMTZsENU4lZZiJxIXbeoKUQF7KbjsDcLTmuXfl4jcPFk48k+LwUEE2fyaAoG6SFrEaDZiZ/yR292cbQegdgcOrF+/QZDnMqVS6yFRaljF5C5+ce7VNxUOs5dzK46Z/0xD4kXHkT4QT5/727yUeQ8KmshnsLpu0XgxdbjIAKa0UpiByR2sen9DI8GblyzqpH/4jM/yMtc2COW+MLDnPw7xho10kjKNljBjsabSa5q/wLnYGofR/pA1CmnrwERR7Cytik91YmtyTb1D+rjh+uOjSVOB5NqjX7dqhFcV0CLE3KfUAkA==","layer_level":1},{"id":"c45e66b9-1ca0-41da-a796-6b98f394faa1","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"运维最佳实践","description":"maintenance-operations","prompt":"创建GEO项目运维最佳实践指南。详细说明日常运维任务,包括定期备份策略、数据库维护和系统更新流程。文档化安全运维实践,包括漏洞扫描、安全补丁管理和访问审计。提供故障恢复流程,包括灾难恢复计划、数据恢复和系统回滚策略。说明容量规划和扩容策略,包括水平扩展和垂直扩展的决策因素。包含运维自动化脚本和CI/CD流水线配置。提供运维团队的职责分工和应急响应流程。包含成本优化建议和资源利用率监控方法。","parent_id":"803bfef4-3985-477e-a61c-915a246d0061","order":3,"progress_status":"completed","dependent_files":"docker-compose.yml,backend/requirements.txt,frontend/package.json","gmt_create":"2026-04-22T18:57:40.355828+08:00","gmt_modified":"2026-04-22T19:22:39.446821+08:00","raw_data":"WikiEncrypted:AymRokkaRBrPd1uk5umiX/dhQHTPPm6nf5mmDPb1IMODwfEt6djM0VBnDWaMwjVsVSuT1AHD1pfVap7WBute6Wsiarqj6ltamY09KvCs0YHxEqOor+0AYSzm2Aa31Dwx0HGTr+fgwTnE6RMJGGceRIs4cV8RBM7Bs4/C9pv4JQQe1wx9fBauJxXtVZgZmkTwsQz1zMKUv/my9/bZ9Q05aHGQVWSs0vQA7fX+eO9Ugt8ztv2KzLkMHjTPQwDUKBMhAsMb47fa/gUJRb4vX0XaRC/0NRwbOvV9kGE8ZhfJSMzck20DTmUNjRs+txGlORGu4UWZsefqLmppB1YdHehQUnSp53vMgJwj0a9BHe2ZU8oB3BBo+Ky3c3OR4uaa4rfHtatz+jzKcC5vq+Oa2OkwFMyKF/rHCf5c9kOD3c9bg/wQwxJpIov1DkWxrbmp2EHHUtHsb07ASQhGLV3SX7POirp4b3urFGRk2MwXKxT5U/gA8wytKMJhKBFtElvFBq2i7nSPeaH2xj0DS3o9rwbrhRJQvLfp/3z63umdp/84RCiI8SwdYgPx4ACqLY3QKXNo0LIi6rsgWkaf5Suyks+dimQcPtAllHZGQA/gcWYidV5oQCnhHJ/meCiKRy7Xb4GttMbIeOA7UNNRQ9IFS7wyprb/n36lYgLOcuQ5Nugly0pl7iFTkl4qWn4pZ+zE4TR9CK3+3oihqJMUeVFdsWHHzgVsh4Vy/4MCPUipHMfRj4T7BabCmkvaTRaf6oRiYEXPGH1mUXCLnQuty4lKx7e8LxdqWP6gciPJOcuRMBYoeBHqUKw/JNmAzN8FuypXsdUryS7GDozcilxOcRE9j3D0JEW+8ONdKF5sp2JAXYX0mhqtfB+RscbqU7E352fF8vZAqHdS0XHCguOUcPuOk1PjzrKK0PJcxoWJPrW1H76CpfhWX9kC1CX6ji8+oMevPaHlwwFIAPnELyRyWOvaAia+6TeiAn8YTup3BXf//p7UweBdBGz//qMDvWoMqMf67cKrFP45gozQjSEYzm8AQ8g0Rqx6ctmJotfnBMpbUoG/k/Br9U3yCwUW5C4ELNIkZ8HMTq1vu6GKzheTjgM5lsZSBhR9qgPwf7cYyU47KLN2oWaoSG9Ke9U5fc+blB461oN7Tb9p1M9jYYAi3IfY13WbWR9kQ09yQOl6zNP4E/TOZ/WG1O8YhDVo6O9b5nQ7Txck2F7a8+Oqzy404YpIRpdXWJvx2sNjxCQXQVXqKKTnxP5lOsLb4vYZqXeHpIw8VawHDzn9M5zowBo/3M96UZSy84F3QEP3JU1nF98Rqg82vqB50gv8dY6wl5RPTzKd+Fi2","layer_level":1},{"id":"243a1a45-d31f-405e-a3b9-694d2fe617d5","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"数据库设计","description":"database-design","prompt":"创建GEO项目的数据库设计文档。详细描述基于PostgreSQL的关系型数据库架构,包括表结构设计、实体关系映射和索引策略。文档化SQLAlchemy ORM模型的实现,包括模型定义、关系配置和查询优化。说明数据库迁移管理、版本控制和部署策略。解释数据完整性约束、事务处理和并发控制机制。包含性能优化方案、查询分析和缓存策略。提供数据备份、恢复和维护的最佳实践。","order":4,"progress_status":"completed","dependent_files":"backend/app/models/,backend/alembic/,backend/alembic.ini,backend/app/database.py","gmt_create":"2026-04-22T18:56:47.082886+08:00","gmt_modified":"2026-04-22T19:00:15.768242+08:00","raw_data":"WikiEncrypted:veTYwq2y4io5qXerCTrkkBwdhOAmcMQTz+AJLOFORhNFeFTAN7xitXLxeRr3T1sKrh0z/6NFLuxfhi+XJSCnWjMeU87mDaFkK5qsmaAL2Nytxcgn44oX/Np6gDk6NBpKTXXQ3c1JIVHY3Iku4YTIdYCMibjywixwZ23Y301pMlyPcNfQmeyLtgTS9lP5U9xDLKsnMUqMie2ljsUEPDjOoPxSnQNoCL2G44jqE4BeEYCl1h3JsynQMnvjVq8UCOhctZuFN52nO6JzrF4QcwRRO4A9xL1TaAtIZ4rg/SoqWB45m3doVWQm5F9X2438sdweLxVi9rjFhD3YsPTUW3+FCCzo3C36ea5HWhnLG1HaEDoZet0lVePafwfQDmBH4SRDIzbxrRNYtlqnAT0fkhc1nMAQz0IEGTS56zXt+EYxvMzu6xYqWFcYFRtnmeW4SPZ7fIro5U+rBcr8RAhA+oRG2JsVDkhv6DqzoyIv2NQFFMusIiiBmBASHXvFFZ8AUVhKC9xd9A3bJmY+ukIHDAeRXE/IucwTAoEQNI9CMXeyfmQK03mWECRg4ZW/mruOTW2OBUuDhiPMO6x1SJ1/xRenkwbw7G+81ZCnsnBRLKd3cZF4y0nCxe4j13LGQfd4iAX5i/DUX9KRkwDMblN/sboCGkcbSLtph/Xvk148A4+6695W71mrzar7yhfM2lOT53Hsyt2sJWiczLnDCfT2QTlB71ufUZ8Q+ypkZO7zlMrvkaUHamxgarKXmrkr2OSa/8IvsG/WUhqSV62U/SXuacIVOKNM7SY8D/zzYphGfcHavI9R9O/oEfUb0yYdGdjhTVWuiGlGsp/cByp6ofrZn/LfnNB3vSSya3wpDOVy3RqCdO+/d2gEs+jlREm/N1+eDZOKMpt8hFWS8xUytmwHZca0aN08mhhTQARvxhQUGnF9uPVIUhyDUF+KcuKANnwSAWIZo/cRSzlSrqPcRAA7XNJQTg2OLmkWpWQwVtTbYCyP5hSM3zmFlpWvBfR30gpl0P51+0pFCd4VDI9/9HW/Wa7Ih95wP7HNKXXfex6GwbePYI59yynPdHHuqHaqbkBTKMJS82vrAmldAtjgxXDvf9xwDjPEyA5M0Hw35tVS6wjNh3SS2SuwfT9oDISNn6Y+5j5yrJjUF6K2Zri0unxCjM1JkoAvusyG+pHY+Bb0QKmNcfyXBMYTSI1PhOPDulcDYMyq9Zfb+Al6euE24vTZpbjKoEtLO6rGDYV8KHfz2jIxcPi0y8Ou+WvMTWKz18iFQNUT"},{"id":"05214c1a-d804-4f3c-9048-20ba4de3be0f","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"引用检测引擎","description":"citation-engine","prompt":"为GEO引用检测引擎创建详细的技术文档。深入解释引用检测算法的实现原理,包括文本预处理、品牌识别和上下文分析。详细说明BrandMatcher类的设计和实现,包括品牌匹配策略、正则表达式规则和模糊匹配算法。文档化CompetitorDetector的竞争品牌识别机制,包括竞争关系定义、相似度计算和过滤规则。解释置信度评分系统,包括评分算法、阈值设置和结果排序。说明异步处理机制和并发控制策略。包含错误处理、日志记录和性能监控。提供算法优化建议和自定义扩展指南。详细描述与AI平台的集成接口和数据流转过程。","parent_id":"7c2ac186-ec90-400a-ac1d-b3b7ca2f01d5","order":4,"progress_status":"completed","dependent_files":"backend/app/workers/citation_engine.py","gmt_create":"2026-04-22T18:57:02.318113+08:00","gmt_modified":"2026-04-22T19:23:12.0556+08:00","raw_data":"WikiEncrypted:qByx+WzXalKNnda2aYUs+GYu9pC8LLDNo/T55ZeqwzWiy0YK6xVbR7KM5OSxCOo+gfTx84RuGsvrF5lK6ZjnzUlze4qrtyk7B01ZVL/J3jiDE8Gxh30IZ/Mj1EQJzBgbS8ucLS5EtWSrZllyPWZCYSwVaerdIDlttJxjgqNQQtMUDRAB8OQ24T4T6PetqUxBLI88gXxpodDV3Dc8w4vOKW11rQu+VT/oxsfIcoPAneCboh21Q6/+B9XbFXBpIBt7aIzWt2RsJttqoYF8wDTsmjCiZLq28t5vrQ4Sa+eKtDX1DpNAFob+BOs4Mmqm+YOjaRHvq2h+NjRwAcgLTQbRRQ/mDN6TdA4dbJh61tmjO36v1VZj2vbzvIogCKkVwvxYe4ZRLkOADLelhTgAjFcFCSPmrGGDFgzUU1yzAstWjYB79RIQhz0PEg9hhOmte8rH3lRWxxSpVe/1MQMLH+ka77X8d5lwXEAhaF5uHt039diwwi6YY3Y9nEB8XYpv04beBhaMWdLq1Odojzo+Y974U5UY9gXk01q5QVIuHK8idcl6cuKp4f+gwGZ93SgjTqe7FH7Qd5ge6PFGZJ+aslEcmtnU47e+zHyzdHWI9hPG0YyJELRpf0i86RxY/f6hXIyFAyeWy57ojMY38VpwsiGGXz7IigMFtIyIlbqO3TH0+IeZ2t36ENk9y6nTzgXcWWxCA2LCTHmO5+jPxWISebAAxo6WWit6n6LUWDxLf4MHwWbZckVKu52y4K3ne9qu+I27rwPoTazIsCAYy0QPtt7mW2mn0ZRxzPvioUK7EGgjO1OqsaKLZJ7AjW48Ru6wYZhBlriVoABBGkI9BaUnyYEcZ/6kpkl+TnRlKY32X1A8JvIZA/8zHmSDEG+FinfzfNFH+SSj3G3HzsxoGnVOm1qN7i3rDXC9bliZ2XpBZR+f29A0ray4pNhiBI+dBSKZouc+bB57XZ8Ct+6j5QHeCfiWa6AQMVuv1Tctr7qtXTrcVzTlYsU3vR1mVtmmkHd3yv3ZBA4l9p0DF6KOSKVjAPn2GSA2EABrlnwJ2lSeWHoObLJBidT6nmQ5S/6IkRgLb17Pu1ypV3eKj6LNDOzrw4QxJ/JtHZ1rG/1Tl0wmhAjxmAzcu+aahYjIdYSTWRkWqqVZ66nNp4pYZys0zblAnLMLM//kJadF9xEEaHjMBIl92IgL0L97/jGIU2YXsapNE1OQ2D6+aqKVb50gv5zx4AKT4tdiLO6Z2sMBrNeyDhml+vCgXp+rFjFXUx+qAUz8Wm1u8gAPUIO3m0CnCZSt+R07BQsJkHMGDzlrGsy1wvLg7Pe6UI9RPBmOUN7UeUe5c09BjutdT+KuUht4apd+u4wqgCGkHyo1Wy8W4UbciPoYT8wx0cLPnCGR73GfwoGnzPtfxWJDXX3SruBGUXeCtwl8UnbIlyDa4Ks2befkeGMWpHQ=","layer_level":1},{"id":"bfca5ffe-8905-4ac2-a0a3-8e4dc43533b1","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"数据可视化","description":"data-visualization","prompt":"创建数据可视化的详细实现文档。说明基于Recharts的图表组件设计和数据绑定机制。文档化趋势图表和平台对比图表的实现原理、数据格式和配置选项。解释图表的交互功能、动画效果和响应式适配。说明数据预处理、格式转换和实时更新机制。包含图表的主题定制、样式配置和可访问性支持。提供图表组件的使用示例、性能优化和调试方法。","parent_id":"d907a8eb-795c-4060-9cdd-50d31cf39be3","order":4,"progress_status":"completed","dependent_files":"frontend/components/charts/trend-chart.tsx,frontend/components/charts/platform-chart.tsx","gmt_create":"2026-04-22T18:57:04.217105+08:00","gmt_modified":"2026-04-22T19:23:03.405364+08:00","raw_data":"WikiEncrypted:LlssVZ/E1BSUywfa50FLlWyGoIcJJpOig8KP9B9gWWZZI8ePi8CsG3BxaOR4OzxCxm2XiNUDCA5f2LMwvnigr2SlxVBiSNHUI0lCgSHHEunmkPytqBjFiqGB9yeyKz3O1rSdq/m6COB07RDEp6Tymfd/Ich7hNqr0ALiJKFBMfTRXbiXa3naRlzgzc5/DA1h/zbAk9yl3yaR4bB4p7xAmyNn8C67e2gxrbHOKN7NK15dfXoIag0XHJMVwFE6SysJ+lA7fykhvt72SHx+Qz58/QamURb9OcCEnEtIYqW1uga1vc2HXP+r8Ud+tutKATUxPch908D2Dm70HjZTkDqV0y1RwdTE86O++EPgx5Sx24CmB2Y9KEs2TsxQBSxas2iX7ajhgIL9xFqjJIMVJWfRNeL/ql2x/OsrzEXUWybjh//bQHE/MIs2lMcn3jl6uggDT3q//Zf/jugKwK1117XAp1NDps6xhJqmTf0/J+uk2DjJwURNZ+f/hL4XNyCoPSOpjPZMIk+ikrqwiBBFy1t5dz/fksmYdzw5H1wSGwFPks461EvwT7SUd3qHg+HDEWwCrMRQLhaalcb+5T4rD4Gg7Aa0Y5Q7v043Oz/0rnmFckpB7QJrcI4yUtnbNxu/HuY+NFZLqpJUrNC6MhZKZ1Nf8HjXwbb7FvRLPTJk/0J2UGgZIuFkHqA398GnAHSj3OegnBaKM+qHr8cVs0wfQ/uFwwYzgoBd9gSGURpkSSDhsDUj2XJMeQPghyYg+au4UrCpUVHdYOyliR8OyttchGTRgDox14AD6X6BPxBueyw2Yb6orKjSBwNfDa9SZQK8dW9S0BehKqK7QLDHIzpglx66chB/QwWwaryM7BrEciDg6cdFeFQSmV+EgDmEePwse6hlzNdSXObTbNXLDwYhtifAxjK0xxhVUCtc7HVAFKLROk36HCFnlzxLpVmtppYzoprXfyXDe6BHU55d+PSdjtYyR7k/tigqJv5jX3TTrH6McF+/v+eR2ZtsTDIjWz+prq1cMVTVPgIB9WoT0+dXP1fMoZ52xLzWjSkgrQ7djAo7jyy1G9plvOx0bdGh5lBGOz+/zY7MTLVaKx8eK6kKS+juFkRK2kCuesUi79TGLidetA+vkruZiHzNPBJWntDodb79","layer_level":1},{"id":"b32b024e-2d06-45c8-94c2-a07fd25ab9b3","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"快速开始","description":"quick-start","prompt":"为GEO项目创建快速开始指南。提供完整的环境搭建步骤,包括Python 3.9+、Node.js、Docker等前置条件的安装和配置。详细说明项目克隆、依赖安装、数据库初始化、环境变量配置等关键步骤。提供docker-compose一键启动的完整流程,包括容器编排、服务启动顺序、端口映射等。说明首次运行后的基本操作,如用户注册、创建查询任务、查看结果等。提供常见问题的解决方案和故障排除提示。确保新用户能够在最短时间内成功运行项目并体验核心功能。包含具体的命令行示例和预期输出结果。","parent_id":"1bb55e12-24c4-42cb-8f59-ddc303460d45","order":4,"progress_status":"completed","dependent_files":"docker-compose.yml,backend/requirements.txt,frontend/package.json,.env.example","gmt_create":"2026-04-22T18:57:13.330281+08:00","gmt_modified":"2026-04-22T19:23:49.7972+08:00","raw_data":"WikiEncrypted:1aHEw3M2aeluf1++NE1n1HTCzLNrSYNKzc2IVp06RQtbuAYcMEXChpU7tJYS1f3O0opR6Xc/vB+l5keQe8PgCR2ncFv/1Td0hCZ2YAOzrKcU9vT19aDXTs2wVsNg8N0rDLvVcTazfsrfReCkGbF3t4KIDlALR7E9k/sBc8Aux87FRnIqhElZnBvZS4Wsv6VYjg+rG70cB28ZbZapx09FwTbE2gyXj7Ck6qNOm9h31VGeQcyIEPfTlQzKWWghd2UuAwraAXbHFeTBwAzBOPZrVi2iMW5N0fiPvrofJe2RpvtWwEWsHguXuXUfXywdpjyOFbnrTokbwQiiwiHpgbktPSypaW3QvBywnGVAjxPBIfRlzbrxj8jlb7w8YznQPbWcNRuYRt3TVMBHR1Ix8UjdR2JwWu4yZQUrLOP4XJ1OVoFdLu5sT3ug3YetVAWSBGUiyUEIQ1U7QoHxxE03qI1ZmrGvC069cAhyU3YQYL0g+PfXWWo86/F20gUXppepBbqg0yRPlCX5asdDuL0vX+i9vl/JI2++deWQKu7cSc8+5tRNcN2AF8Klslhvy5KUEZpxqPaEhxXek/RE8thYcMjT02y2lWMR/WID/CEUm0DZjOC2fQE7kYjogUTC8OhNTBXocpLyn1sbyngxfQ3KsE6+Ysl41LroJ5F7SN8+p5pueRZgBbM32odMU1Dil6T14I/HwltMjiGAjHurPSB8hcX7nNvkuZnVTE2YMjB8ZEhhf76D9Pp1naI3P2d3j0DprvLXRiuPSfO9NBTu6LwZKuMaI2MBEDI2zoV182wdrC1T6AxOiHNcJXYiaF+ZOpMA0vabvcycoioAE6VOZ0mBQ9ZPVSZDf/Dw+VTsC8U1qruh1IAQVYCHsnjY9etX9sTaj6Izd3VrvgQkqP5vAteSDZTy1FOTlTi3X6RzcurXdR3833HqpXa/a0ot8JiRdmjIG0ydOuPYeZPs+Jb0FMN85H71mBziu41udCrikCTPBRTVz6VCG9yBdOgeW4s/iNhPqWCnDibKpfJy1GfSyZ7Jja1d4K91Y+IHVrJxB0+TZPezxY/htgMg4W7MtRoOOPc0eRqst/S2zmEgxMMpU4dfaQIne5zGbUEPNb24qp3HsO9v2un6P17rFQV86RwmPCnyngxtddo0vUNesY0s594GhsGEquA9XlaYa4/KNM14pVDEm4ReIC1JvvqdiQdUAPv3nMXASqe3FxbJmsi93mpWhKWx2q4W+P3ZivXtxhQ5OB4Rs2uXmArlB3MNPKk8TL7wHCUAsFUcCGoPtT2+ov9ntDTLyjKsb0YUGjYUqAceHGdvLCM=","layer_level":1},{"id":"15d6170d-716c-4d2a-833d-81211a59027c","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"平台适配器扩展指南","description":"platform-adapter-extension","prompt":"创建平台适配器扩展指南的详细文档。提供新AI平台接入的完整流程和步骤说明,包括继承BasePlatformAdapter基类、实现必需方法和配置平台参数。详细说明不同类型平台的适配策略,包括基于浏览器的平台和基于API的平台的不同实现方式。提供代码模板和最佳实践示例,包括错误处理、资源管理和性能优化。解释平台适配器的测试方法和验证标准。包含常见问题排查和解决方案指南。","parent_id":"7e66719b-4a8a-484d-889d-10fdc76788bb","order":4,"progress_status":"completed","dependent_files":"backend/app/workers/platforms/base.py,backend/app/workers/platforms/kimi.py,backend/app/workers/platforms/wenxin.py","gmt_create":"2026-04-22T18:57:14.593273+08:00","gmt_modified":"2026-04-22T19:25:18.719953+08:00","raw_data":"WikiEncrypted:Djug3Ni1DAZ8Du2qShzHYuqLmnJOyyKhsCPSfayzAMoLf9J+rFBy0LePWIX3b5/HwiLgJX57X2JBlObsW70y9DLEgX5HDr3AAeBC0dRNACFssPk0GwpdFdJeFwRtoB01ZTdr+IpYAK2YG8gaEA/2ysFJOZzxpGWgTq/Xz+KO29a2kcDgYhZKt55uqT/Mo/5Dzr6AN+qXdLL5xSqrvCkpmhYMFmzgIBOUjJM1mUISEtf/X+gK0L0wXSj/tCJnDQtGJqbFK24HEYyVnkon1GdnIvb+Vptmby7Qg9iNT/xb8JEVTTLM92335BfpTwTp+D4fNkMNyZgXv/XW6K5J/dLRulOCKwxJxPROAyvyEc5xLI8vh6BGP2+b8TgKAKILZTXg3SemKVhGrB3MqY5+V6whOOMT57LHnuwJUEMNMJsswFiLp6UbAlqwiICRF/Jnb+bvCliw4xXvKC6xfAJDQ5qAtcTCAm0uGslNVB5T07pzLFy5EaJS00hqRmvac/P3e8UyL84KjzdngtT3yZ95yCL30Ad9SpGXt76JgCgVJoPFcnPYlJZiXneeB39wFX7rogSSye9XkcBSqEt2ZITemhNHF6LmqSUdnA3rX85S/zDmRiN2NjS1Zjvgc63JjB4B8gQhw3rDllzHDLPBIO3PNInvmVsx5zHOjAMZmyIaoVRtB9BQQnUdHn1WvHdRXmZfs3eVA7jNhDQmTtBzdGtJ31XIHAVkP5ul/NXNBKUytIXDS5hE2s/ZR6j60eIWBlCNxNIlj+42vefIOU+e5kJufMVcBv4aXyQHpunohRHMUYteEC24NO2CW1FNZJlH9BEyf8RKg1/0hDEmySMxcj/S/pXTp5i8nevE+JleHdj3zeyWlGqJsJa7arZV/Kj7qPJYtN4VHoDGp7MFHgKvq6W26lje9EuwJEikt3hqjinocemgMjzEx+PMVPovHIBXyCfuSOtygo59bhUm0pvPgdMmml9UgZeVV1GMzDT//kfmf33ZL+aXTl+zEmnw5fZYwccKfmY6Q++ZjfSQLB9eV6u79F0yq3zh7zGb4RqRR5ZeL2vQaNsL3wyqgNppyJMYSC6gX+ce1aAimwDx4Lr/EnY474W0FXvid1Xc6Bg6KdPrwnKJJpi18zMOmECI68RvMpwmM+92oe/m3dj6YGItooug3uasMy8SPsvLi1RV2F0CQD5CqYs=","layer_level":1},{"id":"7e66719b-4a8a-484d-889d-10fdc76788bb","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"AI平台集成","description":"ai-platform-integration","prompt":"创建AI平台集成的详细文档。解释适配器架构设计,包括BasePlatformAdapter抽象基类的实现和扩展机制。详细说明Kimi平台的浏览器自动化集成,包括Playwright配置、页面交互逻辑和错误重试机制。文档化文心平台的API集成实现,包括请求封装、响应解析和配置管理。说明引用检测引擎的工作原理,包括品牌匹配策略、竞争品牌识别和置信度评分机制。提供新AI平台接入的扩展指南和最佳实践。","order":5,"progress_status":"completed","dependent_files":"backend/app/workers/platforms/base.py,backend/app/workers/platforms/kimi.py,backend/app/workers/platforms/wenxin.py,backend/app/workers/citation_engine.py","gmt_create":"2026-04-22T18:56:47.083138+08:00","gmt_modified":"2026-04-22T19:01:25.986259+08:00","raw_data":"WikiEncrypted:cSfKuI0KndKt4dAjXxIdxWhPkO4T68Pn8OuUxh8ycrOmN2KINuisMW3IOEhdPiFABzUhI7mz9/HfHXQ4zprU/+/sSF8Ao95qt3TWu3d0gdIZ8D5HcXKzDDRDEpL2lUuKjanJ/DyOhfgoAhj4uHHG63PE4lD0nFGhUjI18Mx86VwV/XRvw7SpcidXldGAtwv+SyiBV8jhNv2SsuEp+c64Tpsb4eXXnhU94tHe5zw60yhZPo02AbhrX3CGRvf/e0VDakSRNs2IQLOmYpaXPEbGq1F/Tp1t9NRMOPMypI2xbgsTvkk85z9kGHoS4hRcf6dLIMVrvkCYibs8KhQCMJiDZ66d6j1Vb6dqBvmrKsh3E6WjAycKEMEg/CipCVwEhG2XXjejCze2wysxwhQJevZcegdqOdbxsBBToWhLzOtdumIPjl6TkkzVv7AjaDWHyidsMW21W5FkdxXReA8iCr3BmNkZXyR7BhBY5u4N0ckDpZ5vNXZOYz/nnm9EreXPLovPEB1I2LfReGW91QDOmQpV3kBPeM35QBnLSkx+FIocW4tie7t+M3QfDly8wClVZXt/3Cc96RAY6WNV+YYLMUbk0eoT2oS9tJcllSD2Lsr8dySH9dDel8ELle3TYDsLHrUqx9cVuNFviwe3oCB46zQMNpYbQncs/EfiGeOD2OCtiuPgMJQ2Xr1wz61OtRdGzstiiPcgemrt3kq6Go6kTMDJtBjYxdl7n3V3dIrWro0kMRmrET0FmRL+jOKdnxGBCgn7UUfNtuwY0c63ALecJJYYOTsfyPzHs3Tt7F0jPFfGp1xYzFzaJAtquIYdoM1jeFRd09d8N49nwaK2qynepWbYA5daLMXJ8Rbxlou6PXvIVY/rHl++n+9Z7OO4mAKy2SYe8mpLZqP4Achbv5fwrx7RrwUNcTUOJeXNTIimqqVLvfg/wEfrBk/+isWw2HJf0W0xUuYy0gIClKgSm/wR4uZD/hM7pzbg+Q8DUglIDaVcUMjJnFNqcUrsNEa21UPlYd/E+drdMzZhzn2GHjMnKkAbr8P8DXkbz3RU36nbktlWYlN/hx1lsA9kSsHRiH9Q/xlpT8eBA7rmQiEasbHbaD0PaL8Dyc4IxQ9ZhhWSSUIT5m10WFLz1U2+/9T7i3LHiMeZeFtY4g60GitHBRVqf9+NDKKdYms75Sq8isA35viTaKBUg9/dkwXhZR9TePkcei9/mcG/UOI4dq9SqLAijVNzhLtDoHXCkVCZ4JYzrzIK9A04c+Gtu0xPcRFLewPDEmQPg+3v+cy6McOQdOYqV7rvdr29pmRLOyVxEMs99/vMu6XDAu6UQr44Zq3RVgekLzY7aabJQc/YyWgvzg9dvnh0cw=="},{"id":"850fc702-3eb6-45b4-acd2-ae87fec1f4f1","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"工作器系统","description":"worker-system","prompt":"为GEO工作器系统创建全面的架构文档。详细解释APScheduler任务调度器的配置和使用,包括调度策略、并发控制和错误恢复机制。文档化工作器抽象基类(BaseWorker)的设计,包括通用接口定义、生命周期管理和状态跟踪。说明平台适配器架构,包括BasePlatformAdapter抽象基类、接口规范和扩展机制。详细描述Kimi平台适配器的实现,包括Playwright浏览器自动化、页面交互逻辑和错误重试策略。解释文心平台适配器的设计,包括API调用封装、响应解析和配置管理。包含工作器注册、启动和停止流程。提供性能监控、资源管理和故障诊断指南。","parent_id":"7c2ac186-ec90-400a-ac1d-b3b7ca2f01d5","order":5,"progress_status":"completed","dependent_files":"backend/app/workers/scheduler.py,backend/app/workers/platforms/base.py,backend/app/workers/platforms/kimi.py,backend/app/workers/platforms/wenxin.py","gmt_create":"2026-04-22T18:57:02.318442+08:00","gmt_modified":"2026-04-22T19:24:30.529121+08:00","raw_data":"WikiEncrypted:NKkj/YX2GdbxYjFllBaf8+HUgx0ecKFsz1U3HC2t2IRMbOkBCmoy+IYbhzuQ50K4pCdPARIwK+MaHbv1MDUXpcbdnvRL12GKezTnD100oXzQKqQkhZdDDC4nIEcp6weWLVGVffqyB7aL/dnt1QlE63XyJfCwizBlecxl1GDUB4J0O7SsTFL5gI6enVYO6hOzx3JrWnEFzirRjA6Llz1iFiFUWxTjxjToT1qkxAdREq2omi39vXL1s84I0XOA1blljfNNIGbpkxXW5uohJBndl6l7Bh23wF8z1LfdAavsFmljavCWqoMvA61Dn4jpJT9oDmaKXZpVSuxfMF2Tu3WOJZwISUGfGBJfdbfxNalhuFff+bhZR8P717nLoM3Do7T26rsqW/pr0NJL6aKxrlPCeIzL0v6Ct+HU3ULHT0EZpG8HfU2NhGWAJd0NhX8RZ8B2ZpfXZKioKtCkLhl4oWV6P8/k5g1nWpnP3wpmDwvp+/pGBeaBcYSenwJWgcGR2s0KgVsEW1niM8+JLaK15wFrmKcxve0hIWBiiPnbZKscAYq+5hj3ecte8h/JevEf+SBNB7ify6uUGU3Eve1jXyPeBrc2FCU5ueeJSFD3wu5pHlkzm7PP8UAbQOfwmENf/Mc1YRNi1FJsujdQuJ67474CyCTkCWFhTC539/6iIa7hN8505GK99PxHcIrsPMMT5LU69r67SizSnWV5bawiMPKGosexCHZfhT1jrScQCKeuld0X/lE1WXXm6ADBbfxZrn/iEFK0zc0WKsnT0X/nQI+ycJaw40Cm+soCO6/KtdYYGEzpzViqi2KxYhRyey+o+yIi8V7nVsxUCbaVRVmYNjnK9yX+3ypdVpJLIJXQ5ywaUWfvqgCrsC7Xxba9P9D+0kmnq6jH6ZdIuubXp0yOtWxe+VC4bHAWoc08RoBdLrlTCGz/hmgi5S83hM8MN0gLdQtc2YDsc0Pxw60+ylnkdlKIefBmb7XPiD8RMRvcbDUCGnrpenbxf5eoWLjLWfyULNQHoYINDdIFvn+skLu10KkfTf8lpRNqd2uHkHVhTTCFh25GlRLAdL7QDHMMQbmwG9OTjjt1tMlW6aYJ/pvYQq95uzmLAiICIsf+nT4xgqoFK+tTBmOst7Z3+bj1YJCPtUNyIzC9a3YYfRwlB1ckjgJaCURcXpImdkDtdpl3GP2mtDp9O52ZDAQVAJFVA3wFFV1G+qjqGRl4cDFK7BlAs04O4fvskn26jrDYiVqgdF0pc6eIiPhAJg/1BabciIggV78rEnEg6jiNJ8AhUmKLo8JOvL/C3m1mfcaUbU2K7oK8damVm8BSmIypHMJfCXzHIt6i+CaJLNlZ+c+MJ4WhqgPWc263/SnxO24wH0vaRtqmZ8g72SSFVa+6E65bdhSUaIejIDvILaBv+73KdUt7LGKPmqKoftErfP4grQZACnS3zQLXmnMfdzurPkKbBI1PkyT/ase2Czwu5/LwHWdWDcRQD2uZmUjndsKpbR6/xVu5Ry5VLB/ds2BrgjUp5pD+Z0U995X4yVwpr9oCNxR5r1sl+2Wv3jotf19l+safw9XwODQoURKcJiGxtJDymJvVEyl3ZEe1Izwl7SF4UqtboIYt9vEoEIilsuPPDtujnpN5pkY=","layer_level":1},{"id":"fda0598d-7e92-4b8b-be52-92ae63c3cd98","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"API客户端","description":"api-client","prompt":"创建API客户端的详细实现文档。说明RESTful API的封装设计、请求配置和响应处理机制。文档化API客户端的错误处理、重试机制和超时控制。解释请求拦截器、响应拦截器和中间件模式。说明API版本管理、URL构建和参数序列化。包含认证头自动添加、状态码处理和错误消息格式化。提供API调用的最佳实践、性能优化和调试技巧。","parent_id":"d907a8eb-795c-4060-9cdd-50d31cf39be3","order":5,"progress_status":"completed","dependent_files":"frontend/lib/api.ts","gmt_create":"2026-04-22T18:57:04.217601+08:00","gmt_modified":"2026-04-22T19:24:50.486294+08:00","raw_data":"WikiEncrypted:/umMwKXdJhL9PqhJYRia9MjBtE8cuBSpJq1+zwyrvadwhOTuxc7+NNlJizkRp6kCDsj6HmsrrrEG2WmrNf4m1kFf/yUci2Hny4otqjfpEsOXzmFIxnq13zAZFe1oDyDiHr+shS0DH1omM5IrOroFuNXfBlFlOGXuTKJ3wXXPweq+qAH9QLU237hwRdKdI1UNXoGFfFF9nN8NzOmkwSQ0cRMvswtunfw+yphm0doFqLjrjc0WUZSar4loGeSR6pOSLU8ebi/JkrnwesaWnoYc/1aUJBPdJqVPSJQzjx/Oupuf/R1ihtrn81TMYOUvEaKLk9wVSfSvjh8RGttelGQzTBNJsssgMeqcDh+Qz6r4RJeFKgaRlhn753ONhpYFsHOA/05biB01p6yVuJUR2A3I4tqTlKZ+Xt5K6nvklSqGfR/asdknv3YOkVZOtQxAjyjg/RmmtnslgrEae+k+pBRvgZU23ZT5nZ82LarvwQLYZlu2F16oJjpKEgT3cw98zGHlLEIanqAXIOhT8iR7Fwk6TTKreGcH+oOkFNmbXHWXAD9ixtGbLqoidjzBlLLSR1++hGoabWTFiJX2LKj3lCJ4z30snHEvEL5ruTnKMF+gXM+truHTDsrO5CuaWyGY3WYVTndJKFLi2PQu5FclItm6ykG7LLkMlOXcKTmOrUqOgQhgDR0R7UuPYneG3+8tP49Gar78dBGx+Da8xGwikj9K9OJYAlHpVo05oKo78qku6h+6J2fHgIvIyJPSC88Whc+HpqTBbVMAIjzOQDzTTafDZnEoLWczvFoR5x2aPLnYwXdjyljOhmpXH/bShHcfo1W4KEEzka0Yp+DMZpTiSyhBpA5iLdjZdU9RnTUPTwMtqSXfdbbf0fdgem+z3CsmiuZJVViFNkOfRqL5f7Np4ITC0v2XwLSWr/bC7gbUZiEQdwEr7jwVO1Bk6/MCzvN1G217W7/RUPA4Up/Iu6PRBPcC4dd2r16kpGY4U68Ud7F6iXnc1Twr1Znb+cuTdO4Fu2DQ","layer_level":1},{"id":"7416db23-312f-478d-8883-2fc3c41ac2e8","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"任务调度系统","description":"task-scheduling-system","prompt":"创建任务调度系统的详细文档。解释基于APScheduler的异步任务调度架构,包括调度器配置、任务队列管理和并发控制机制。详细说明查询任务的生命周期管理,包括任务创建、状态跟踪、执行监控和错误恢复。文档化异步任务处理流程,包括任务分发、执行优先级和资源管理。说明调度系统的性能优化策略、监控指标和故障处理机制。提供任务调度的配置选项、扩展方法和调试技巧。","order":6,"progress_status":"completed","dependent_files":"backend/app/workers/scheduler.py,tests/test_scheduler.py,backend/app/workers/citation_engine.py","gmt_create":"2026-04-22T18:56:47.083393+08:00","gmt_modified":"2026-04-23T15:20:09.061178+08:00","raw_data":"WikiEncrypted:VyywLMbCKto41PC5aDsBo+87rJy1wKhB+t/+dFn1cQKhRzLNGkc+cdUADwdeiVqAIwtiwaq+rwA2WFYQdbiGz8cyKHFmC9lmt3Jas1uZAz4Osy7WTe5xdzE2SEY35xhzdqPvBbNe/p8j0HjSJGFgENGbjEhhukipSO73yvj8CPLzAxa5OEqoQt3uMA0dCSgyFv2LovXFxAXl3U9omZ+jIerOmf0scDYFZ4Cjk4x8Bzb0xm/6wMRJahXUi7eKOQNBfFSlRnxNY+u8u6x0eLR9rZQJsBFNgTapyPe11i341lFAvV8GVMJsgmLfZeTV/A+CJWTGWbc7TTvNnWcbYK7l8zeSZ7dH4rEnOvERyY5kxDrOEwU/Yjdg0OIz0cgmb+dlRmAPiX3OWjxUXJg4aSEFFG16FvCKl2nOFUF8LecaPl1ENKZOzyeeouQpzJp6MwRbCvWKCbKjmM2LofkPlbYC3ljZcmitkM3M0iUQSDo8uwQ71JEBqciChTxdYCFkbs5lTGlaj7NMUVD0hinIuBaEJQ1j0Irfxqf1ncrLdx8ZNQfA0gzLgSYcvydd0BeII/j0Mao27RFzOAqYLYT4lwZn3J2ZefvqYbOF2Sifr+D0ZdG7elOtYhiRAUEHGhPSUWaoI5CpzqRPYnRva8JuLDZi4Kj0EyjpgPrSYN9dp01ryHcTMd7FaHIiskbn258Y9zpaK7mnlVvyKtjxlJL6MtuIV32lhcB+5EW7WH/6QDYQTwSBHw8UP0tyMyNbps8z+8Q5FmgH8vHxFljollei7t8eaPHYkk5rnVsXfTSQ4SjT3Ki6R/yfZ5BEnJidV+OTY4jtwp6TKE+kf6ioudhBQQXHEpufZoZaVaTZXTiIGuNSUBDlZ8hnbIS8ou6QcKMly3uw16qq1jpI+sVrLhWSLFcfRqW774uvsXptcHlY3jyOYYvgNSnLk9DHpURDX2VPzmVnzh4qOFmePV/gjmpSqLQpV1/iNIt9g3DADVd6eBWCjpp7/eefKoA1yLf1v3cLqoz1NFJZDj+xZBAIGNokT1IaiTnENcvwwJWL3xKUl+n4thAe+UgHXKJZ2an3jTF5IKjCZK3wFTIHqnkVBqLbYTnNr8t764mZT1/9wh4OKLf46TVR2knmcx1cuUtGr3Sewy3daul0qF4ixlI8qx00gkAJPhMSgdD9NphN7vd38cFIdIrhJ257ibJH98P6LFTvtBlJtLNk0e8UNLU9gvqtKe+mlotbHy1WlN3l1P02b370hBTcnBA0JVykYqIO2Yux+kvP"},{"id":"dd12cc44-0c95-45d5-a726-e7b8bcf2531b","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"API接口文档","description":"api-documentation","prompt":"创建GEO平台的完整API接口文档。详细记录所有RESTful API端点,包括HTTP方法、URL模式、请求参数和响应格式。文档化认证接口的JWT令牌管理、用户注册登录和权限验证机制。说明查询管理接口的任务创建、编辑、删除和执行功能。详细描述引用数据接口的数据查询、统计分析和上下文提取功能。文档化报告导出接口的CSV格式生成和数据导出流程。包含错误处理、状态码说明和API使用示例。","order":7,"progress_status":"completed","dependent_files":"backend/app/api/auth.py,backend/app/api/queries.py,backend/app/api/citations.py,backend/app/api/reports.py,backend/app/api/deps.py","gmt_create":"2026-04-22T18:56:47.083629+08:00","gmt_modified":"2026-04-23T15:19:45.663556+08:00","raw_data":"WikiEncrypted:rEJA+fDSevRLFPlWlcH+C02eArPzlHQTxpYkpRmh+m+CmPwrZOHSqyEVvpFbcfuzlCdXmMyG1qoekj03JLnUhMCX8p4fjuyWVCjGyWgOqZe7y57duQvm+59HTVelUf5p2zKcXe0BF+QDGoY0B16JqwBxz3Y81Gy9FL/tP9oUSvy1GLFQmo9ALw+6+ZxshNYMaAYjZuIQZmKyZwLkz6Lo7fc4BaK5WrdvEGmFG2VWCEklBP/N4prpXJgdgQa9/TTjsup0wmZKwrmq/DT8e2QPbXwCMPbD761xiGBcOmyriwaS1OsRl5hWA8RDMXy8StAFxKHEso2pOzgFneedAOAryo6BNtK47OjZM6n57D4XO3jjoIpt4db/IEwMD50ud3jyIs83d9/ZQsJP15jAote7wd2NlHC3C6SRJ33bMHWKMdM7RzO/7vsAkmQOdO6kmb0HkP9WWmD0JcBxtbYCUe27HlFKiPGOw7+qNMwW1D5inQAnxNsZFvskmMmNz9EwGwyI8mV1S3fnXxbZ9hYrwdcNQ/Z3kPzrfVlLm8MS1OHXimqvLbhsGxaoJO9kpPYSYVJYZDPkGVCjNOaoNt4rk9ZPU+vJF2fE8vQ3g+mePnvUBXcIT0YPI5q6P/COgOkwr/uNMb/pjjYKK35N8A7Tixh0LajVZ8O6boGN/wP2y743Mmij1WlEfi0U1mxyVLIzU4Hf/16zrZIIvtBk+L5DwQFAOmnB5Wk2SEBt/ckL2avHYwnEU8e44ilJKUDw1J5xsEkBuaZsOszKIzZfKfCaxSHZwwOR8FMAdrXUqkyhDe3xhYPHalzeNvMObnrpOIplGgnWuJXa9FAlm4P1lZAJE9M1Zjzi9GZSJVGRuh7+ab0i29L7Dk+z+KKmk2/FrJyiL2HL5NiiLqxbnAwo0jZt6xZQDNjPOlcrrDoC1rluKxSfQfy7Xyq+jg2XVbGrQg6BZOSIbTKO/0c4mvevvMKnFVtyZznBgOa+aopDSinpVeR5IGtnnCBrKnxOgMY3kdCeR8ZC9CVqYABHInpmZotbBkj2swe05IUifzeo0aYDhoDspnldRmxXikdYCLDExsIWUXmWqZtyRhNrYnROV9uXTHWcuSpm3pQrHjISeX67ERQWcong/q78tHcXNX+/4nKL+f2BswDcOCMEpy+KPlfbfJkQBSyLqYudx1UfpWzgkHhE/gAYoJqNs1CL345d2yImHRHpw2D0WzVjqCx7Ee4GubRt6SAel3qJYKYi1PPm8c++3uhVGbkxmnmaS9K8+VfA/tvH6VpTexttzjw82t0C5JRKQAYiWukBx1q6fQATjTRN0Ew3V1GW4v5ZOamAaBAvm3fewSaKJOLr1aADfGRpSUf/dg=="},{"id":"fc6f24c3-594e-4153-854f-19250834eeb1","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"测试策略","description":"testing-strategy","prompt":"创建GEO项目的测试策略文档。详细说明Pytest测试框架的配置和使用方法,包括测试夹具、模拟对象和测试数据管理。文档化单元测试的实现,包括认证模块、引用引擎、查询处理等功能的测试用例设计。说明集成测试的策略,包括API端到端测试、数据库测试和系统集成测试。提供测试最佳实践,包括测试覆盖率要求、持续集成配置和测试环境管理。包含测试调试技巧和性能测试方法。","order":8,"progress_status":"completed","dependent_files":"tests/test_business_flow.py,tests/test_scheduler.py,tests/,tests/conftest.py,tests/test_auth.py,tests/test_citation_engine.py,tests/test_citations.py,tests/test_queries.py","gmt_create":"2026-04-22T18:56:47.083879+08:00","gmt_modified":"2026-04-23T15:22:16.070672+08:00","raw_data":"WikiEncrypted:Xd2Zu8BM8p49theGlFJHkHqkA5ycuMpwkltd7rjxfkZm5u2F/OCOa2rxC3NxLrZDZf5D15q4Vh8tHCK9cPrOS1FhaLT2kQoV20eRKF5vUqA82s4WqIE/a7BkaNIVq2bBtKDZezWPzAcH1FnzCbj1ziH1tZS8jAddEkcOldPLs3vCtokGRdTKPIZk2KpaXB3VulmLZJgfTmC7+ylbW6Z4X5J5lAKqSBC+5ULcbXOzIi/fdgAPevmCuh7Fl6t6LY4Zqgo+WmuRaHQBGUx5QWz3QvKvUqkX5mcSt+5SMSwZrdgl0Js4mJRZD+wQf/LjxBrE+jspugeswaFDoRmHTwiWEhjM3nwLTG706s2z1Ms21SXh4GgQU0+exIE6wOQkmZzOjT+4VpYuDv1BaNguc2NUGTgzP2xbGYw1/xoktbmvCs8tliFDEPFulre8tNFN9srTT6DEiaUrB1DNbWG/R0DLjwAjEPjVfocI83NtfJuwal9aWYjCyh0Xkz9yQsPOVM96zJAUOMatOKMXGmfvhgv4NLondzol1Fptpclf2Kl7u2g7qSFLfwtK6eq22dk2PAAqixUL9wsroK5P8xd5AG0cDnPKlbhgR3GqCC+3ysph8eWTN1846LBqRara2metcSM8ykSvgvVsUnxWaj2qmEbifbZnI5QrmMEcaxGDGcIFs/DitRERJdedyouzyzSfnYwIhry2+eFPSDaZ1BjSWkfQWailaOxDUj9mRg4MG7HqSqdvC0PkWkmuAZYO01FPBFFUUFG93MTzSyT7vr4lF40UynElg+YxFfq+LjPgZXY483JXp6/S8mtNdMRB5qqwdJ+UkPlV8OzX8SZxmhnr8fx9av615/Tx4HdgFEfctrSkP7jHQwdt3h5XJWmY4lH1u7ORipDi/1MKovQbkRaAR4QFQMwmQw5CnBjKsqtGHl1U5j7VygCGcC81azivE6rD9C49K4rwMJt0N4D6D6SgwCDJJyz8XrIfQX5q1e0ZHq1VzPsIIDHmbOZ/h4rOaRqA6H60xWByOqta+Qz+CRZgs12kY+yWP2R5Y9WTvcPyO/qpCd762zT0/c+IvHlXVlAH1Z5W8k0tzX4Ak4zLSlq7h+Bl/eW9J7g1UX4Mulr6CRUFh+eVexj4nfAgXAOkYZP2+AM4HI4wiAaP5+TkMpzQaTlkCbcKXpS2IvGfgUGcHxTp/yQTTiyst1sr38goyxOM4lo1m82mmHzG4nfGELx9Bln1UW9rkXdMQxKntRaBMs1ezGIRM6juxr/FZjQii+97mIdx49D3CPLEB3N4z9u5XDhbznJ0XjqpasCGsRuf1eMWlJKteTNEbISUk5NlJgAMgR5CqONn5xC4mtVShXyleMe37lhBDW1Eu4lni5eJjVQbtvA="},{"id":"803bfef4-3985-477e-a61c-915a246d0061","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"部署与运维","description":"deployment-operations","prompt":"创建GEO项目的部署与运维文档。详细说明Docker容器化部署的完整流程,包括镜像构建、容器编排和环境配置。文档化生产环境的部署策略,包括Nginx反向代理配置、SSL证书管理和负载均衡设置。说明监控和日志管理方案,包括应用健康检查、错误追踪和性能监控。提供运维最佳实践,包括备份策略、安全配置和故障恢复流程。包含CI/CD流水线配置和自动化部署方法。","order":9,"progress_status":"completed","dependent_files":"docker-compose.yml,backend/Dockerfile,frontend/Dockerfile,backend/requirements.txt,frontend/package.json","gmt_create":"2026-04-22T18:56:47.08417+08:00","gmt_modified":"2026-04-22T19:02:23.851886+08:00","raw_data":"WikiEncrypted:0IKfLNOWe9mZfG1jVts3w2XbjO+yyEmY3ONOjrL5GjA8+3c0QEcD9OcCVHu+1BW/N5NkoQV86wegqQ9ShX8iSWP5bp76U/WBxmHscWo6tU/8QlGuoaRAEg/ev4XsKkgC39pvYnfm60PfrpsE2hL1E2GfNGgG77OCHFDgZXXNbh9eCPmSkW8+YhED55nkyvxbnzr0nBnhsGtTzPUxHW1tar+GAvP539R0R/4mYQI87YJ70yZ7fcsaLwgOXmzP3dVnnmpLv+9t7xJhpCjyQsxfBfLLWBAADnbPD/XDJUZjfKYBtzZr96wOF29GlOAKy0gF60uUu4ldT+fyQn+nYlMXrNBIPA4xv5zs0p3ITXaqvMn5CnUdObefSllD9bB5ZAVzibfAxAovDM6bFfCBg78rOiHHyhVisNUpyQVL18Ac1DA/7UfdJH03ceu0hk7swBM7UlLgBUuU8iZZq8IKLS9Hunf/aF7T2fuFhJB+LGpBGwV+3OqWaT6v4reKhSW8vMM4x8XvLXgDttwPeltWlMknvzqijyjE0V38mue+Fe5fYrBZIK66PxnXrGUJKvZPwyAC/8LX6Hk+M3aBWjL4QkiKpbN2/pXCR6dXuPfbswZ11T0xSYdC8m+8SmC5UAgcryC0PI+ULgqxDhrheiaPIpfOAGnPr19iY2++A+xP/IPZf4L9hg2cNxi5vJ+ws54SmeQDUdbzx15ZECbSbz9xkShlRAYOjuUB9/IpZFt7EqH7sEqsFlbF73qp72JFPp2/QYv9av/WYcw6WVtRJG4TQ/Z9jB+DN6yCeSC6B/CfK05zoF7yrVWkLPiSSVYGDSBndH9EFJEJJvzO27tkS1wZXs4fTTE1StkTjYn8EBSRVvIs3Ywg1+iM2SFYcbn3I6QCeqaXuMJ/yEJikxIeLJGlNjiShYEo2FOMQ/6Xk+TlHkxUTepgnzhxFkPq9S2dqK/ZunroHtiqObkTqfkqta9V4EreMpXtO/FUBsVUrmehzAmO7CQ53L74HnyAqFJYWA/iDUt8rABkFT69QahL9BU4bts3AKhAypInqPXBL+0v0WyatxLd1jURgSq11VX9UBNBi4li3TcoFc9wsZpX3LeH1vNueLQzvssRDfTY9doM+g0rgBXDOO59DyyOKrDDMU5D52k5KI5SJOaWWxEa24TOoTfC79Jpc6tW0zAhdvdLD6u/pfsZd693uN4RM8fMtZPh58w5rcXuEHrhVI/0JThluHDnb6a962K0mt7d1makwsRTPZvpvaTrgiaoByIyOuKY7q1L"},{"id":"2148d7d6-25c4-497f-8894-c4eb7a0d2bd7","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"开发指南","description":"development-guide","prompt":"创建GEO项目的开发指南文档。详细说明代码规范和最佳实践,包括Python代码风格、TypeScript类型规范和命名约定。文档化开发流程和工作流,包括Git分支策略、代码审查流程和版本发布管理。说明开发工具的使用方法,包括IDE配置、调试技巧和性能分析工具。提供新功能开发的指导原则,包括模块设计、接口定义和测试要求。包含常见开发问题的解决方案和故障排查方法。","order":10,"progress_status":"completed","dependent_files":"frontend/tsconfig.json,frontend/tailwind.config.ts,frontend/.eslintrc.json,backend/requirements.txt,CONTRIBUTING.md","gmt_create":"2026-04-22T18:56:47.084469+08:00","gmt_modified":"2026-04-22T19:02:27.521973+08:00","raw_data":"WikiEncrypted:F3QgleoEfoy16cQggYe9C/ucQxiwh0okVA48AmODs5RKNS8ZgNngqmnHSFcG/1UaJxx+3dUn+EkMTpYUsOg40rZn+i8FphtVARmS5F9VbvHFcBiSlQaH+JQdr5mv45kEraKM1ZQU+BmiivHhLeOOFfZaf4wfF+UeGEwIZ5K3xgdlrIWG5cbIQke0aAuN4SwF5zFLobVRGY/vFRQZvRJuhJF3kH8cBQLGOghlzoYuvIMN0Syv8UZ5Bwec8p+VF36mvhOS8eFAksKHI6byEdpfq9UTiqxgtTq5L6Rj+37HpAP6khb++vSf1A0VT9NXevaHHhhVOWEkLrGTB/CHEKIg4VNJ5WWcgiIXY17BHQyXjIl4uJr0Fu2kI3bicD88UqLxf8vvCmO6N7KSm9OpUdXgYZoLSYFkU03TCUpLmPpUmOuHim5SyBdvTcd1cnYN48DrbjjDTnkYFYcHEsyGmIESGqrS8AMGyLqSnm5D5gNd5fcrj2+Nf4lrHZbGPN/GpOP8DVbWL3BxZsuvhmlXDJYDI4GYZU00w/cqWFfsh//f8AWxQksGMwuNq1z/Za4kUhyjJoFRB+vVjaYxJnmtnzHgcUsroK6pk+mnzl2sFRRlQRuMqDEWNhr31C+GITHwnZA+ISXYuGrJRXiyzbB/ICIMnQLKjTSGTJOv0611R7UfXQ9XSW5XcnEevf/xaKUaXyI/FSOb6NOMw9DEXCzTFiCSCqdXV24hyN/2eLMEWGD2d7hFS4CBCFDcKoDoV3UWasymEMLzPGi+O8yZ6SFUM2OFa+CFcm+CAV0glSLkFZMwoXi2vpmFERQ0wQbxo7EHKlZA2r9j8A33xsPpGi2bODYiAqMxjvXIIOSDkeokKHKcG+VglGTbPiYbKMmWb3UJ8LUxQsSFs9woUopss+huIV87sUJ7wqGYZGRktkElcXzByJv0D1LNiX7Zfkeq/DTmo9gY1fGwt8Lmr/ZToeLVUWrBHfDTpNtE8Vk+2HsAY/Q6mMhPpkWFCLXMhVexKYRhZ78g5WrTyG220Cs1UqKJ9EXOzd03j14pvt8XxTGNYB4512t168u5QR3RTob2+A8xvVhOvZ5bq9fUVTu2BMD6+hxnKeBlnxDPMCDB6TQppLI2ylmxd0STP3NVTtVXA7ZqRslddheuyl+fGiDx3YaKfbF9pmFBIcUVgxFDSi77e7ZkIQnP7jQeoaQtgVtuU/xJX5vPDaFWBTY5qcyicSVwBGJWIzfDA1ylBWdzcfOmtz21yOw="},{"id":"b2bb2e3c-5661-497c-97dd-15bf6ee8b7d4","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"扩展与定制","description":"extension-customization","prompt":"创建GEO项目的扩展与定制文档。详细说明系统的扩展机制,包括新增API接口、前端页面扩展和数据模型扩展的方法。文档化配置定制选项,包括环境变量配置、功能开关和性能调优参数。说明第三方集成的扩展方法,包括新AI平台接入、新数据库支持和新认证方式的集成流程。提供插件系统的使用指南和扩展开发的最佳实践。包含系统定制化的案例研究和实施建议。","order":11,"progress_status":"completed","dependent_files":"backend/app/workers/platforms/base.py,backend/app/models/,frontend/components/,backend/app/api/","gmt_create":"2026-04-22T18:56:47.085228+08:00","gmt_modified":"2026-04-22T19:03:46.033162+08:00","raw_data":"WikiEncrypted:9tFZPEMPWdLFkkE2XbXYMuMB8FuOYQ0fj+/JXYKsHGVuXRejugUICkyxL86Ju3MeDs2yZuuby22yn9F5xTbpPvuSC/FoLxV09I2ZpvfpcQFUCVmZyQN67BPwYA36FWIbbHI5AJYWayiJUo+io2WnBda4ESUkmi1Ifq6VpdD6Et8Rw2b8dgDDMxi9XaN9V0JJWAK4CsV0ZYGNAK947J00M9KveVb322Q2MkjA5aw0eylKLH0fzY4qNXNGDmfCOuncuvGiH/5DvAXCDuDLYzVd1AHr/9UgPCvmp017Oo8KijVdD66YD+QM7Rh+24GqNvD5xFbOQGd7ey9Mzs33E6JIrsbUhBvbLJOVlRo0EdScVPZsU4HO6zqDAg0ozD1a5kGX/WxHBvhKBJATucW9vC2XG5g21SjjE6NdebD3z3ZjN+cu8jYHMi1BwWhOmvNRvN8HIGjzntLglg7fNrii0iJXTxpZ8Mbpmu6Tk88oMecsGleuA2xhK1yEWycuQ2dZn5e179BE3mGaSOT0Fvp5yXgL4htvqVTAu4QZ+JFJVk8e4NkI2KaoEgS8vmkD+tvnSal6LUgMzXvRJVj5c7y5LEqxY7QwEbvunmtmHaw9xxVNmfj54tFWSDCSUVCBp+otUfdEq+e6UMOQ64QITUXyYlP+zGW5J0ZWBf9GlU5j70IekNuO3mLp/yU922OD64PhCEL3HOTmAtV1L1vunWchdtvyht6rkYuys0Al1WSGeCmVT23fmJlSuKe++K/qQ/TheLhgA4euY3OnlacLzbia76+B2p4tJY+XvzzDZ5c3M6YdKmW0+iKB+TRJgVz1Q8GpFIzUk/ShBam/TanUxOcC0ci89hjchiYImL1tQeigX4Rgfcn8mXYH956z7eyiSYtqk7uIsQYfiW7tqvcyN0jJpGUVHd9IzvK2NAC+ICHilErsg5hRJ66KFaugTnjd2WoIkU8rktkywDasvD24NZM417z8B8l8uHq9XNcg+2bdPA9hqx5ujEUiGXyWkBNvwCZXg9aL2q+4y5NMoZh6ak8uEjC1kc1S61q2kFyKyIjV7QbCMaHhjnrBnkSg/kV2cGrBPeOqWdtANBw5wZ/OJ38FLWJ5nPOzreTmQ/R6J6YNCfmRPpfpVj0tH0o+0rffNxxXa2TnUbu4OSSLdCljK6CsfuYmBOStwIQtEs8T8/+PsrbQKY9NM1KHqhg5Nk72UNylvGupV/Zccfjg3z78M9uUqtXSOA=="},{"id":"8e3d62e8-ddbe-4820-bc41-7da9e91ea598","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"故障排除与FAQ","description":"troubleshooting-faq","prompt":"创建GEO项目的故障排除与常见问题解答文档。详细列举和解决常见的认证问题、数据库连接问题、API调用问题和性能问题。提供系统监控和诊断的方法,包括健康检查、错误日志分析和性能指标监控。说明调试技巧和工具使用,包括开发环境调试、生产环境问题排查和性能分析方法。包含常见错误代码的含义和解决方案,以及预防性维护的最佳实践。提供紧急情况下的故障恢复流程和应急处理方案。","order":12,"progress_status":"completed","dependent_files":"backend/app/main.py,backend/app/config.py,frontend/lib/api.ts,docker-compose.yml","gmt_create":"2026-04-22T18:56:47.085508+08:00","gmt_modified":"2026-04-22T19:04:06.13183+08:00","raw_data":"WikiEncrypted:CaKOW8OSSWs4aEYk06Hu0tuZET5JxbVXxA/4vFailoRiq8l6SCRMdp2PbHfZPheZXyPTAgE3AT8Ce8j9xPOCdJxNKAOstuOjZEIRRi9OOYwoluR4MUnob24X+IyLHwTgsJGf9uPY1LVFTI9RTQt8aG1cBHibaRNEJ8+DVkXJW/EDypOxFpOxDxlaCscMdiPRLwhr9V4vJqWV9j2rk1LjP2/M8SJJQ8hbaDoeLevKdECB+aEw9JrL9ycGW0dhxKxQLf/ril9zNHrvahlSXbVZSZ39dpBl57NdFcFaOYt+paf3O6hv3bCTAKGLTRnYa/IuAZ6Xa7YnhqaGQ684LKCBz6VySRNYVUCEvZotYHf1IQdWOj0zFzR7LEIEikIlZyKak++yTNYfbQyBEzye3g6YCmlh6VaVmtGIRzjOYpu0K1UftNcRa1mWnIMrB/Pqe9DpNTg+Yxo3ZHrPyv3ZAmrd8MqA+T+P+/NerCmFD3dRf94NLPP8KU7in+VSfEjVmdE0N+3OfntU+uvNL/kkOhyWNRUKYKFxbqdwCTKqv3Nchs73XyhfNRP7gPkR/stgnowCRnKWS4ncUEJDZTWVFID52kE8nH7Kq/yuB5bJxFX9AeUUaNSBgvMc5YNkq3vULFEqC1/N0bpU4r9+0/U/BcMktmNrRr1HnOIPl3QzwjIsT3j2lp4UXS3Qm4BZFJsh8MVLfgOIMbO1jbuGCXHl88T/rZOCNwf4q93vWo2HnOxDkbdICWgZ9dinRr85RkFQjNWlXdAk0XG8lQPotwJLvS+ZASOv1aWyL42jk/mTJcOU53PFT5rf3+WpVmhNWQGguZ0l04eubO4Va39c6h/+DNsl0OEAiozIMohEgz77qsD47Kf0KZMLnqL3o30TYXYamX/CP8+epBqSWgmzX/ETrrRl/1/JPkSDc//0VC8UmWBJAsdUdzyQh9v9iQddyIZ4MV1k4MGTJ6GwrUqVTszShZJVG80wDMLQvJGqJ0T5rH1P7kBaJ5nBnth822MBy7B1IhN6nDqtLhOJcqT8Qt6x8ODGFx1QMNBdS4lHq5IcRy+nZKiPP3V7uMuuFQsNNodTRhmNnuAliJACWS89hPiGroan2VkusxIu2DW8wdQ/3Z31mIn4cE3O3+Aq6lO+BEMAuYh5WkOEmGsF3cjX/zPPiuBSP7Vd2a9o6gPA7MBfneMWyqodMp6PKh7EG26gaKUaIGq6VkQobSAVfbLxmfIMW6cZ5STH4U1/A7gV2PeuWzwwEJz7axGVQIJ6A9geQevZvD/cnX6BQBuOMkdAOB6PApCpQA=="}],"wiki_items":[{"catalog_id":"1bb55e12-24c4-42cb-8f59-ddc303460d45","title":"项目概述","description":"project-overview","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"34e572eb-6fc8-4de7-8061-63783ef8be24","gmt_create":"2026-04-22T18:58:50.323135+08:00","gmt_modified":"2026-04-22T18:58:50.329272+08:00"},{"catalog_id":"e3ae8925-4862-4280-b85a-0b376841b15e","title":"快速开始","description":"getting-started","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"7f028ad1-e989-43ea-b945-c79c33e6f0e3","gmt_create":"2026-04-22T18:58:54.232866+08:00","gmt_modified":"2026-04-22T18:58:54.238013+08:00"},{"catalog_id":"7c2ac186-ec90-400a-ac1d-b3b7ca2f01d5","title":"后端系统架构","description":"backend-architecture","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"c7eb113b-b503-4d83-be7f-9ccf3350c9d9","gmt_create":"2026-04-22T18:59:20.999631+08:00","gmt_modified":"2026-04-22T18:59:21.004772+08:00"},{"catalog_id":"d907a8eb-795c-4060-9cdd-50d31cf39be3","title":"前端系统架构","description":"frontend-architecture","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"3af3bb9e-4d99-4dc3-b1ed-2686db385c26","gmt_create":"2026-04-22T18:59:54.989699+08:00","gmt_modified":"2026-04-22T18:59:54.994419+08:00"},{"catalog_id":"243a1a45-d31f-405e-a3b9-694d2fe617d5","title":"数据库设计","description":"database-design","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"ffbb970e-56e0-40ad-bd88-1a1e55482d96","gmt_create":"2026-04-22T19:00:15.762815+08:00","gmt_modified":"2026-04-22T19:00:15.768379+08:00"},{"catalog_id":"7416db23-312f-478d-8883-2fc3c41ac2e8","title":"任务调度系统","description":"task-scheduling-system","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"deb919cc-9541-4ed7-a581-ae2876ea67c2","gmt_create":"2026-04-22T19:01:21.979952+08:00","gmt_modified":"2026-04-23T15:20:09.061378+08:00"},{"catalog_id":"7e66719b-4a8a-484d-889d-10fdc76788bb","title":"AI平台集成","description":"ai-platform-integration","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"cfc48cde-e1c3-47f6-afe2-a6d7a8f4ab69","gmt_create":"2026-04-22T19:01:25.981164+08:00","gmt_modified":"2026-04-22T19:01:25.986389+08:00"},{"catalog_id":"dd12cc44-0c95-45d5-a726-e7b8bcf2531b","title":"API接口文档","description":"api-documentation","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"49915365-e38e-43b5-beac-6aa7d5a74cbb","gmt_create":"2026-04-22T19:01:28.269494+08:00","gmt_modified":"2026-04-23T15:19:45.663706+08:00"},{"catalog_id":"803bfef4-3985-477e-a61c-915a246d0061","title":"部署与运维","description":"deployment-operations","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"98909ecc-fceb-4ab7-a26f-741838eb2e50","gmt_create":"2026-04-22T19:02:23.847103+08:00","gmt_modified":"2026-04-22T19:02:23.852058+08:00"},{"catalog_id":"2148d7d6-25c4-497f-8894-c4eb7a0d2bd7","title":"开发指南","description":"development-guide","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"643984fc-5a57-498b-8f25-68cc318d9d82","gmt_create":"2026-04-22T19:02:27.517117+08:00","gmt_modified":"2026-04-22T19:02:27.522128+08:00"},{"catalog_id":"fc6f24c3-594e-4153-854f-19250834eeb1","title":"测试策略","description":"testing-strategy","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"b0c36b2b-bb03-4624-933d-c1f6a320b7ca","gmt_create":"2026-04-22T19:02:30.709013+08:00","gmt_modified":"2026-04-23T15:22:16.070899+08:00"},{"catalog_id":"7c3e3c0b-5d1f-4d64-99be-668041c6cd9d","title":"核心框架配置","description":"core-framework","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"f94da0b4-8a07-4de1-b0b3-d3b32a12c3c1","gmt_create":"2026-04-22T19:03:21.689103+08:00","gmt_modified":"2026-04-22T19:03:21.693211+08:00"},{"catalog_id":"b2bb2e3c-5661-497c-97dd-15bf6ee8b7d4","title":"扩展与定制","description":"extension-customization","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"c5849940-e223-4222-be17-aa0a6cb36bc8","gmt_create":"2026-04-22T19:03:46.027426+08:00","gmt_modified":"2026-04-22T19:03:46.033304+08:00"},{"catalog_id":"8e3d62e8-ddbe-4820-bc41-7da9e91ea598","title":"故障排除与FAQ","description":"troubleshooting-faq","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"85306af2-0edf-42b8-b7ad-c03e769cb1e8","gmt_create":"2026-04-22T19:04:06.127415+08:00","gmt_modified":"2026-04-22T19:04:06.131953+08:00"},{"catalog_id":"bcaa04da-04e3-427f-ba01-847ad657e78a","title":"Next.js应用配置","description":"nextjs-app-config","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"c112a3f4-b0a1-4c4a-a325-e3ede8c90be6","gmt_create":"2026-04-22T19:04:47.356556+08:00","gmt_modified":"2026-04-22T19:04:47.361504+08:00"},{"catalog_id":"9e3d703f-f424-47f4-84df-b99873b93e5a","title":"项目介绍","description":"project-introduction","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"2793782c-91c8-4052-b9db-39513426c736","gmt_create":"2026-04-22T19:05:00.372036+08:00","gmt_modified":"2026-04-22T19:05:00.376145+08:00"},{"catalog_id":"a06436ee-1678-4a51-bbf8-b0d0ac3456b9","title":"数据库架构","description":"database-architecture","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"d5c75004-b01b-416f-850a-4791c5489a32","gmt_create":"2026-04-22T19:05:13.619093+08:00","gmt_modified":"2026-04-22T19:05:13.624074+08:00"},{"catalog_id":"7fea5a24-e6de-4003-bc70-9dae6d8fdb25","title":"适配器架构设计","description":"adapter-architecture","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"37003fc0-1cf5-4264-996b-40807001875f","gmt_create":"2026-04-22T19:06:14.01196+08:00","gmt_modified":"2026-04-22T19:06:14.016291+08:00"},{"catalog_id":"b027f234-4ac5-4d6d-9b38-afc8054325f5","title":"单元测试","description":"unit-testing","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"8150ddbb-7aa9-48d0-9953-2ef55e4bcfd5","gmt_create":"2026-04-22T19:06:55.084551+08:00","gmt_modified":"2026-04-22T19:06:55.090188+08:00"},{"catalog_id":"940e5918-1689-4001-a284-44f2de75b8ee","title":"认证接口","description":"authentication-api","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"7c7564ee-7fe2-4555-8ff0-4ec1b757997a","gmt_create":"2026-04-22T19:07:12.352034+08:00","gmt_modified":"2026-04-22T19:07:12.356599+08:00"},{"catalog_id":"78288302-33bd-44f7-8b29-24f516c8b6bb","title":"调度器设计","description":"scheduler-design","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"a1cc822d-5382-431c-8c49-cf398fb5eb3c","gmt_create":"2026-04-22T19:07:22.166733+08:00","gmt_modified":"2026-04-22T19:07:22.171749+08:00"},{"catalog_id":"6406f42a-e10b-4a2b-84a5-0a21c1c759ea","title":"代码规范","description":"code-standards","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"13c568d2-dfa7-4d1b-81c0-dfef247cbb67","gmt_create":"2026-04-22T19:07:51.271116+08:00","gmt_modified":"2026-04-22T19:07:51.274241+08:00"},{"catalog_id":"a91fff3d-ec5e-43df-8176-22f0084109ef","title":"功能扩展","description":"feature-extension","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"d2c7157d-157f-4990-8f76-11f3ea5435f7","gmt_create":"2026-04-22T19:08:25.13644+08:00","gmt_modified":"2026-04-22T19:08:25.14088+08:00"},{"catalog_id":"e8ec6ac6-ad1a-4332-a7be-727b47d71233","title":"Docker容器化部署","description":"docker-containerization","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"1ed0b482-3d6a-4bfd-af40-47a5d1f3e802","gmt_create":"2026-04-22T19:08:34.079807+08:00","gmt_modified":"2026-04-22T19:08:34.084736+08:00"},{"catalog_id":"c19260e2-5163-43d4-b35a-b48aae995f4a","title":"认证系统","description":"authentication-system","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"df661133-efbf-43fe-97c3-f581c81f47a7","gmt_create":"2026-04-22T19:09:25.676813+08:00","gmt_modified":"2026-04-22T19:09:25.682345+08:00"},{"catalog_id":"9b71fe02-5927-4a19-8db8-66eb129ecd9a","title":"认证系统前端实现","description":"auth-system-frontend","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"2b32ec11-d228-42c0-9232-103ba7e44f71","gmt_create":"2026-04-22T19:09:48.743111+08:00","gmt_modified":"2026-04-22T19:09:48.747746+08:00"},{"catalog_id":"b80dc237-1a6a-401f-9f4d-14190edebcdd","title":"技术栈","description":"technology-stack","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"e23bd86e-b4ac-40eb-b1c1-38d929fd5419","gmt_create":"2026-04-22T19:09:54.21211+08:00","gmt_modified":"2026-04-22T19:09:54.216205+08:00"},{"catalog_id":"7e5c3b8e-5aa3-448d-ae52-d5a96a413b0b","title":"表结构设计","description":"table-schema-design","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"c3fa653f-8dd7-41fe-8c2e-8b60adbf70f4","gmt_create":"2026-04-22T19:10:23.573187+08:00","gmt_modified":"2026-04-22T19:10:23.576944+08:00"},{"catalog_id":"cc7a1f1b-c70e-4c61-bfbc-6dc408a12ff2","title":"查询执行流程","description":"query-execution-flow","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"2fc79486-ec65-4533-860a-89c8877c2ea0","gmt_create":"2026-04-22T19:11:29.34722+08:00","gmt_modified":"2026-04-22T19:11:29.353951+08:00"},{"catalog_id":"fec685a0-c9bb-4048-baf4-40b56b2aa29c","title":"集成测试","description":"integration-testing","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"8c17b44f-1586-459b-a83d-c9b961cd2142","gmt_create":"2026-04-22T19:12:37.811472+08:00","gmt_modified":"2026-04-22T19:12:37.820956+08:00"},{"catalog_id":"9fe32b83-3697-4939-8b10-524f5ed3e65e","title":"Kimi平台集成","description":"kimi-platform-integration","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"2126339b-b0f5-4152-924b-cbe028cd0c39","gmt_create":"2026-04-22T19:12:57.009145+08:00","gmt_modified":"2026-04-22T19:12:57.01442+08:00"},{"catalog_id":"b10c2334-a850-471a-9851-a1c698e3a485","title":"查询管理接口","description":"queries-api","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"74d3018f-4e23-4687-8bf4-7fb403f479f7","gmt_create":"2026-04-22T19:13:13.111099+08:00","gmt_modified":"2026-04-22T19:13:13.115929+08:00"},{"catalog_id":"0c1d3542-92cf-4796-8dba-82caf2f7b361","title":"开发流程","description":"development-workflow","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"222a9371-45c1-4e0d-b1da-e8ada1c501c2","gmt_create":"2026-04-22T19:13:23.079488+08:00","gmt_modified":"2026-04-22T19:13:23.082539+08:00"},{"catalog_id":"109a8fb1-6619-4bc7-8481-e28cc2127d24","title":"生产环境部署","description":"production-deployment","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"26f80935-eac2-44ee-bcdb-d6a79c537750","gmt_create":"2026-04-22T19:13:58.693673+08:00","gmt_modified":"2026-04-22T19:13:58.69756+08:00"},{"catalog_id":"4d5ac6d7-8812-414b-b8df-68574cc36d7d","title":"配置定制","description":"configuration-customization","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"e1e0bd0e-01b3-4543-9781-d9beb32b9a57","gmt_create":"2026-04-22T19:14:17.837895+08:00","gmt_modified":"2026-04-22T19:14:17.84356+08:00"},{"catalog_id":"159f2ccf-71b7-4d1b-a4c4-c15b23a4126e","title":"API接口设计","description":"api-design","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"11936bb5-374f-40f4-bb53-b75264fc4b9d","gmt_create":"2026-04-22T19:15:14.073829+08:00","gmt_modified":"2026-04-22T19:15:14.079089+08:00"},{"catalog_id":"9cc59a5a-f597-4707-b994-b6c49514d553","title":"页面组件设计","description":"page-components","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"ba0390b3-c249-4e92-a3c8-6820343aeda9","gmt_create":"2026-04-22T19:15:16.958138+08:00","gmt_modified":"2026-04-23T15:19:43.818584+08:00"},{"catalog_id":"f70f5d9b-d7c7-4dc6-b36a-5f4508e6acaa","title":"系统架构","description":"system-architecture","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"70b3948e-f456-42d2-b7ad-a0097ad5ee5f","gmt_create":"2026-04-22T19:15:17.448445+08:00","gmt_modified":"2026-04-22T19:15:17.452857+08:00"},{"catalog_id":"816a2805-76c9-4f32-a3cf-96428208081e","title":"数据模型","description":"data-models","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"262a3941-fdc6-46b0-b767-be40aa9d5761","gmt_create":"2026-04-22T19:16:35.087998+08:00","gmt_modified":"2026-04-23T15:21:46.785271+08:00"},{"catalog_id":"64cbb894-755f-47b5-854e-c26c7821e9b2","title":"文心平台集成","description":"wenxin-platform-integration","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"fab60eaf-9652-4cb5-9f9e-0525caa62d63","gmt_create":"2026-04-22T19:16:36.921828+08:00","gmt_modified":"2026-04-22T19:16:36.925945+08:00"},{"catalog_id":"412f8cb5-54c1-4f32-8966-fa0e5e75bbca","title":"性能优化","description":"performance-optimization","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"d8e2cef5-37e6-44e7-8a7b-9bd365b82a72","gmt_create":"2026-04-22T19:16:37.806188+08:00","gmt_modified":"2026-04-22T19:16:37.81795+08:00"},{"catalog_id":"2f7fa0ab-cd3d-4f45-a1c1-389d5a0c2561","title":"开发工具","description":"development-tools","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"979be617-a83d-4db9-b73e-38581348f8c1","gmt_create":"2026-04-22T19:17:43.348035+08:00","gmt_modified":"2026-04-22T19:17:43.3539+08:00"},{"catalog_id":"40ac97e8-7ef0-4198-82d7-d2e332be9d34","title":"测试最佳实践","description":"test-best-practices","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"05e59a75-d52f-42e1-a924-f6a32f06f2fe","gmt_create":"2026-04-22T19:17:48.811042+08:00","gmt_modified":"2026-04-22T19:17:48.815559+08:00"},{"catalog_id":"41a414d2-e13a-497c-8a03-212624dbf5fe","title":"引用数据接口","description":"citations-api","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"737f8d6c-bd8f-4c11-b142-71a400423323","gmt_create":"2026-04-22T19:18:18.048509+08:00","gmt_modified":"2026-04-22T19:18:18.055466+08:00"},{"catalog_id":"2713d5c6-c6b0-4a38-83f6-56940c2bf695","title":"监控与日志管理","description":"monitoring-logging","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"eb1288f7-5ea1-413a-8f54-4f870306d14d","gmt_create":"2026-04-22T19:18:41.294736+08:00","gmt_modified":"2026-04-22T19:18:41.773932+08:00"},{"catalog_id":"c8a468af-2982-4d9c-82c0-313b5d2ee89c","title":"第三方集成","description":"third-party-integration","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"e9a02c86-236b-49cb-bbed-9462ee123c04","gmt_create":"2026-04-22T19:19:17.34688+08:00","gmt_modified":"2026-04-22T19:19:17.362503+08:00"},{"catalog_id":"9eee7fab-6cd9-4ef3-9415-2f8137f1d199","title":"数据模型设计","description":"data-models","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"23ad3419-5473-4e2c-ac87-d9715090279d","gmt_create":"2026-04-22T19:19:19.260533+08:00","gmt_modified":"2026-04-22T19:19:19.282116+08:00"},{"catalog_id":"f210509a-2381-46fe-8c22-0ed768e6ca70","title":"数据库迁移","description":"database-migration","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"7c0201f7-9e02-4cba-9ee1-81c3477f049a","gmt_create":"2026-04-22T19:20:15.023549+08:00","gmt_modified":"2026-04-22T19:20:15.06665+08:00"},{"catalog_id":"d9e45b2a-6443-4a9b-8ed3-4c3c04773772","title":"UI组件库","description":"ui-component-library","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"760610d4-dff6-4c6d-831f-7c9078db86a6","gmt_create":"2026-04-22T19:20:16.20858+08:00","gmt_modified":"2026-04-23T15:22:23.574113+08:00"},{"catalog_id":"178b681f-d013-44b7-aef8-dee7ca8c22a9","title":"核心功能","description":"core-features","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"1c4316a1-f1d7-46da-bcfc-ea2fa0c56110","gmt_create":"2026-04-22T19:20:37.644038+08:00","gmt_modified":"2026-04-22T19:20:37.649918+08:00"},{"catalog_id":"ac0658da-7670-4e41-9e57-02d9d0d50680","title":"报告导出接口","description":"reports-api","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"ae62f4a8-8840-4c8e-9a42-3373370299ff","gmt_create":"2026-04-22T19:21:24.241821+08:00","gmt_modified":"2026-04-22T19:21:24.246484+08:00"},{"catalog_id":"aad61788-1dc9-4682-b743-47188d7aecb6","title":"引用检测算法","description":"citation-detection-algorithm","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"00359e45-209d-4be3-8795-50dea52bdba1","gmt_create":"2026-04-22T19:21:33.106655+08:00","gmt_modified":"2026-04-22T19:21:33.125906+08:00"},{"catalog_id":"7cb1d921-44ed-4e22-8bf9-baba7ff8b7c7","title":"新功能开发","description":"feature-development","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"422c46b3-e69c-4023-a878-411a48ae182f","gmt_create":"2026-04-22T19:21:46.910999+08:00","gmt_modified":"2026-04-22T19:21:46.916175+08:00"},{"catalog_id":"c45e66b9-1ca0-41da-a796-6b98f394faa1","title":"运维最佳实践","description":"maintenance-operations","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"aa6db9b6-71e1-4497-a0e2-f3ff25358d3a","gmt_create":"2026-04-22T19:22:39.442855+08:00","gmt_modified":"2026-04-22T19:22:39.447035+08:00"},{"catalog_id":"bfca5ffe-8905-4ac2-a0a3-8e4dc43533b1","title":"数据可视化","description":"data-visualization","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"a40267bc-925a-4364-a01f-b96d3df60aea","gmt_create":"2026-04-22T19:23:03.398982+08:00","gmt_modified":"2026-04-22T19:23:03.405853+08:00"},{"catalog_id":"05214c1a-d804-4f3c-9048-20ba4de3be0f","title":"引用检测引擎","description":"citation-engine","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"19e75845-5147-4aeb-90be-16f3aa270465","gmt_create":"2026-04-22T19:23:12.049419+08:00","gmt_modified":"2026-04-22T19:23:12.055756+08:00"},{"catalog_id":"b32b024e-2d06-45c8-94c2-a07fd25ab9b3","title":"快速开始","description":"quick-start","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"7e679d62-c415-4d6a-a7e5-d41d00e0ed69","gmt_create":"2026-04-22T19:23:49.794133+08:00","gmt_modified":"2026-04-22T19:23:49.797304+08:00"},{"catalog_id":"850fc702-3eb6-45b4-acd2-ae87fec1f4f1","title":"工作器系统","description":"worker-system","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"83fe6837-7874-4467-8114-103062f15f58","gmt_create":"2026-04-22T19:24:30.524061+08:00","gmt_modified":"2026-04-22T19:24:30.529283+08:00"},{"catalog_id":"fda0598d-7e92-4b8b-be52-92ae63c3cd98","title":"API客户端","description":"api-client","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"7bd2c461-81b0-48e8-8cb3-b4b14305806d","gmt_create":"2026-04-22T19:24:50.482622+08:00","gmt_modified":"2026-04-22T19:24:50.486476+08:00"},{"catalog_id":"15d6170d-716c-4d2a-833d-81211a59027c","title":"平台适配器扩展指南","description":"platform-adapter-extension","extend":"{}","progress_status":"completed","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","id":"2632a6f9-774e-4a91-94da-a984bdb20758","gmt_create":"2026-04-22T19:25:18.714623+08:00","gmt_modified":"2026-04-22T19:25:18.720105+08:00"}],"wiki_overview":{"content":"\u003cblog\u003e\n\n# GEO 平台项目全面分析\n\n## 1. 项目介绍\n\n### 目标与愿景\nGEO 平台是一个基于人工智能技术的学术查询与引用管理系统,旨在为用户提供智能化的品牌引用检测和数据分析服务。该项目通过集成多个AI平台,实现对网络内容中特定品牌引用的自动检测和统计分析。\n\n### 核心目标\n- **智能引用检测**:自动识别网络内容中对特定品牌的引用情况\n- **多平台集成**:支持多个AI平台的数据获取和处理\n- **实时监控**:提供定时查询和实时更新功能\n- **数据可视化**:通过图表展示引用趋势和统计数据\n\n### 目标用户\n- 学术研究人员\n- 市场分析师\n- 品牌监测机构\n- 内容创作者\n\n## 2. 技术架构\n\n### 整体架构设计\n\n```mermaid\ngraph TB\n subgraph \"前端层\"\n FE[Next.js 前端]\n UI[React 组件]\n Auth[认证系统]\n end\n \n subgraph \"后端层\"\n API[FastAPI API]\n WS[工作器]\n SCH[调度器]\n end\n \n subgraph \"数据层\"\n DB[(PostgreSQL)]\n RD[Redis 缓存]\n end\n \n subgraph \"AI平台\"\n WX[Wenxin 平台]\n KM[Kimi 平台]\n end\n \n FE --\u003e API\n UI --\u003e FE\n Auth --\u003e FE\n API --\u003e DB\n API --\u003e RD\n WS --\u003e WX\n WS --\u003e KM\n SCH --\u003e WS\n API --\u003e WS\n```\n\n### 核心设计模式\n- **分层架构**:清晰的前后端分离和业务逻辑分层\n- **异步编程**:基于 asyncio 的高性能异步处理\n- **依赖注入**:通过 FastAPI 的依赖系统管理服务\n- **适配器模式**:统一不同AI平台的接口调用\n\n### 系统关系图\n\n```mermaid\nsequenceDiagram\n participant U as 用户\n participant F as 前端\n participant B as 后端API\n participant S as 调度器\n participant W as 引用引擎\n participant P as AI平台\n \n U-\u003e\u003eF: 发起查询请求\n F-\u003e\u003eB: HTTP请求\n B-\u003e\u003eS: 触发查询任务\n S-\u003e\u003eW: 执行查询\n W-\u003e\u003eP: 调用AI平台\n P--\u003e\u003eW: 返回结果\n W--\u003e\u003eB: 处理后的数据\n B--\u003e\u003eF: 响应结果\n F--\u003e\u003eU: 展示数据\n```\n\n## 3. 关键实现\n\n### 主要入口点\n\n**后端主入口**\n- `backend/app/main.py` - FastAPI 应用主入口,包含路由注册和中间件配置\n\n**前端主入口**\n- `frontend/app/layout.tsx` - Next.js 应用布局组件,包含全局样式和提供者配置\n\n### 核心模块\n\n**数据库配置**\n- `backend/app/database.py` - SQLAlchemy 异步数据库配置和会话管理\n\n**配置管理**\n- `backend/app/config.py` - Pydantic 设置类,管理环境变量和配置参数\n\n**工作器系统**\n- `backend/app/workers/scheduler.py` - APScheduler 定时任务调度器\n- `backend/app/workers/citation_engine.py` - 引用检测引擎核心\n\n**API 路由**\n- `backend/app/api/auth.py` - 用户认证相关接口\n- `backend/app/api/citations.py` - 引用数据相关接口\n- `backend/app/api/queries.py` - 查询任务相关接口\n\n### 配置方法\n\n**Docker 配置**\n- `docker-compose.yml` - 多容器部署配置,包含数据库、缓存和应用服务\n\n**依赖管理**\n- `backend/requirements.txt` - Python 后端依赖包\n- `frontend/package.json` - Node.js 前端依赖包\n\n### 外部依赖\n\n**后端关键技术栈**\n- FastAPI + Uvicorn:高性能异步Web框架\n- SQLAlchemy 2.0:异步ORM框架\n- APScheduler:任务调度框架\n- Redis:缓存和队列存储\n- Playwright:浏览器自动化\n\n**前端关键技术栈**\n- Next.js 14:React 框架\n- Radix UI:可访问性UI组件库\n- Recharts:数据可视化图表\n- Tailwind CSS:CSS框架\n\n### 集成点\n\n**AI平台适配**\n- `backend/app/workers/platforms/kimi.py` - Kimi AI平台适配器\n- `backend/app/workers/platforms/wenxin.py` - 百度文心平台适配器\n\n**认证集成**\n- `frontend/components/providers.tsx` - NextAuth.js 认证提供者\n- `frontend/lib/auth.ts` - 前端认证工具函数\n\n### 组件关系图\n\n```mermaid\ngraph LR\n subgraph \"认证模块\"\n AUTH_API[认证API]\n AUTH_FE[认证前端]\n NEXT_AUTH[NextAuth集成]\n end\n \n subgraph \"查询模块\"\n QUERY_API[查询API]\n QUERY_FE[查询前端]\n SCHEDULER[调度器]\n ENGINE[引用引擎]\n end\n \n subgraph \"数据模块\"\n MODELS[数据模型]\n DB[(数据库)]\n REDIS[(Redis)]\n end\n \n AUTH_API --\u003e MODELS\n QUERY_API --\u003e MODELS\n ENGINE --\u003e MODELS\n AUTH_FE --\u003e AUTH_API\n QUERY_FE --\u003e QUERY_API\n SCHEDULER --\u003e ENGINE\n ENGINE --\u003e DB\n ENGINE --\u003e REDIS\n AUTH_API --\u003e DB\n QUERY_API --\u003e DB\n```\n\n## 4. 核心功能\n\n### 功能概览\n\n**用户管理功能**\n- 用户注册和登录认证\n- JWT 令牌管理和会话维护\n- 用户权限控制\n\n**查询管理功能**\n- 自定义关键词查询\n- 多平台AI数据获取\n- 定时任务调度\n- 查询历史记录\n\n**引用检测功能**\n- 品牌引用自动检测\n- 置信度评分算法\n- 竞争品牌识别\n- 文本上下文提取\n\n**数据分析功能**\n- 引用趋势图表\n- 平台对比分析\n- 统计报表生成\n\n### 实现亮点\n\n**智能匹配算法**\n- `backend/app/workers/citation_engine.py` - 实现精确匹配、别名匹配和模糊匹配三种策略\n- 支持中文和英文混合文本处理\n- 提供置信度评分和位置信息\n\n**异步任务处理**\n- `backend/app/workers/scheduler.py` - 基于 APScheduler 的异步任务调度\n- 支持多平台并发查询\n- 完善的任务状态跟踪\n\n**响应式前端界面**\n- `frontend/app/(dashboard)/` - Next.js App Router 页面组织\n- `frontend/components/charts/` - 数据可视化组件\n- `frontend/components/ui/` - 可复用UI组件库\n\n### 功能架构图\n\n```mermaid\nstateDiagram-v2\n [*] --\u003e 用户认证\n 用户认证 --\u003e 查询管理: 登录成功\n 查询管理 --\u003e 任务调度: 创建查询\n 任务调度 --\u003e 引用检测: 定时触发\n 引用检测 --\u003e 数据处理: 获取AI结果\n 数据处理 --\u003e 结果展示: 处理完成\n 结果展示 --\u003e 查询管理: 新查询\n 结果展示 --\u003e [*]: 退出系统\n \n state 查询管理 {\n [*] --\u003e 创建查询\n 创建查询 --\u003e 编辑查询\n 编辑查询 --\u003e 删除查询\n 删除查询 --\u003e [*]\n }\n \n state 引用检测 {\n [*] --\u003e 平台查询\n 平台查询 --\u003e 品牌匹配\n 品牌匹配 --\u003e 竞争检测\n 竞争检测 --\u003e [*]\n }\n```\n\n## 5. 总结与建议\n\n### 项目架构特点\n\n**架构优势**\n- 清晰的分层设计,前后端职责明确\n- 异步编程模型提升了系统性能\n- 模块化设计便于功能扩展和维护\n- 完善的错误处理和日志记录机制\n\n**技术亮点**\n- 基于现代技术栈的全栈开发\n- 智能算法与工程实践的结合\n- 完整的开发到部署流程\n- 良好的代码组织和文档规范\n\n### 改进建议\n\n**性能优化**\n- 考虑引入连接池优化数据库连接\n- 实现缓存策略减少重复查询\n- 添加限流机制防止API滥用\n\n**功能扩展**\n- 增加更多AI平台支持\n- 实现批量查询功能\n- 添加导出数据功能\n- 增强搜索过滤条件\n\n**代码质量**\n- 完善单元测试覆盖率\n- 添加API文档自动生成\n- 实现更详细的错误处理\n- 优化前端组件复用性\n\n### 下一步发展\n\n**短期目标**\n- 完善用户认证和权限系统\n- 优化引用检测算法准确性\n- 增强前端用户体验\n\n**长期规划**\n- 支持多语言和国际化\n- 实现移动端应用\n- 添加机器学习模型优化\n- 构建开发者API平台\n\nSources:\n- [main.py](backend/app/main.py)\n- [config.py](backend/app/config.py)\n- [database.py](backend/app/database.py)\n- [layout.tsx](frontend/app/layout.tsx)\n- [providers.tsx](frontend/components/providers.tsx)\n- [scheduler.py](backend/app/workers/scheduler.py)\n- [citation_engine.py](backend/app/workers/citation_engine.py)\n- [auth.py](backend/app/api/auth.py)\n- [docker-compose.yml](docker-compose.yml)\n- [requirements.txt](backend/requirements.txt)\n- [package.json](frontend/package.json)\n\n\u003c/blog\u003e","gmt_create":"2026-04-22T18:54:45.079999+08:00","gmt_modified":"2026-04-22T18:54:45.079999+08:00","id":"1e2d007d-9249-436e-8822-c9b1a31580d1","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1"},"wiki_readme":{"content":"No readme file","gmt_create":"2026-04-22T18:53:55.057287+08:00","gmt_modified":"2026-04-22T18:53:55.057287+08:00","id":"354aa9f0-35fb-44a7-98d6-034981f130e6","repo_id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1"},"wiki_repo":{"id":"1095f823-f6f5-4e66-9aad-9f0b5b6b99d1","name":"GEO","progress_status":"completed","wiki_present_status":"COMPLETED","optimized_catalog":"\".\\n├── .npm-cache/\\n│ ├── _cacache/\\n│ ├── _logs/\\n│ └── _npx/\\n├── .pytest_cache/\\n├── backend/\\n│ ├── alembic/\\n│ │ ├── __pycache__/\\n│ │ ├── versions/\\n│ │ │ ├── __pycache__/\\n│ │ │ └── 488d0bd5ab01_initial_migration.py\\n│ │ ├── README\\n│ │ ├── env.py\\n│ │ └── script.py.mako\\n│ ├── app/\\n│ │ ├── __pycache__/\\n│ │ ├── api/\\n│ │ │ ├── __pycache__/\\n│ │ │ ├── __init__.py\\n│ │ │ ├── auth.py\\n│ │ │ ├── citations.py\\n│ │ │ ├── deps.py\\n│ │ │ ├── queries.py\\n│ │ │ └── reports.py\\n│ │ ├── models/\\n│ │ │ ├── __pycache__/\\n│ │ │ ├── __init__.py\\n│ │ │ ├── citation_record.py\\n│ │ │ ├── query.py\\n│ │ │ ├── query_task.py\\n│ │ │ ├── subscription.py\\n│ │ │ └── user.py\\n│ │ ├── schemas/\\n│ │ │ ├── __pycache__/\\n│ │ │ ├── auth.py\\n│ │ │ ├── citation.py\\n│ │ │ └── query.py\\n│ │ ├── services/\\n│ │ │ ├── __pycache__/\\n│ │ │ ├── auth.py\\n│ │ │ ├── citation.py\\n│ │ │ └── query.py\\n│ │ ├── utils/\\n│ │ ├── workers/\\n│ │ │ ├── __pycache__/\\n│ │ │ ├── platforms/\\n│ │ │ │ ├── __pycache__/\\n│ │ │ │ ├── base.py\\n│ │ │ │ ├── kimi.py\\n│ │ │ │ └── wenxin.py\\n│ │ │ ├── __init__.py\\n│ │ │ ├── citation_engine.py\\n│ │ │ └── scheduler.py\\n│ │ ├── config.py\\n│ │ ├── database.py\\n│ │ └── main.py\\n│ ├── venv/\\n│ ├── Dockerfile\\n│ ├── alembic.ini\\n│ └── requirements.txt\\n├── docs/\\n├── frontend/\\n│ ├── .next/\\n│ ├── app/\\n│ │ ├── (auth)/\\n│ │ │ ├── login/\\n│ │ │ │ └── page.tsx\\n│ │ │ ├── register/\\n│ │ │ │ └── page.tsx\\n│ │ │ └── layout.tsx\\n│ │ ├── (dashboard)/\\n│ │ │ ├── dashboard/\\n│ │ │ │ ├── citations/\\n│ │ │ │ │ └── page.tsx\\n│ │ │ │ ├── queries/\\n│ │ │ │ │ └── page.tsx\\n│ │ │ │ ├── reports/\\n│ │ │ │ │ └── page.tsx\\n│ │ │ │ ├── settings/\\n│ │ │ │ │ └── page.tsx\\n│ │ │ │ └── page.tsx\\n│ │ │ └── layout.tsx\\n│ │ ├── api/auth/[...nextauth]/\\n│ │ │ └── route.ts\\n│ │ ├── fonts/\\n│ │ ├── globals.css\\n│ │ ├── layout.tsx\\n│ │ └── page.tsx\\n│ ├── components/\\n│ │ ├── charts/\\n│ │ │ ├── platform-chart.tsx\\n│ │ │ └── trend-chart.tsx\\n│ │ ├── layout/\\n│ │ │ ├── header.tsx\\n│ │ │ └── sidebar.tsx\\n│ │ ├── ui/\\n│ │ │ ├── badge.tsx\\n│ │ │ ├── button.tsx\\n│ │ │ ├── card.tsx\\n│ │ │ ├── dialog.tsx\\n│ │ │ ├── dropdown-menu.tsx\\n│ │ │ ├── input.tsx\\n│ │ │ ├── label.tsx\\n│ │ │ ├── select.tsx\\n│ │ │ ├── table.tsx\\n│ │ │ └── tabs.tsx\\n│ │ └── providers.tsx\\n│ ├── lib/\\n│ │ ├── api.ts\\n│ │ ├── auth.ts\\n│ │ ├── platforms.ts\\n│ │ └── utils.ts\\n│ ├── node_modules/\\n│ ├── types/\\n│ │ └── next-auth.d.ts\\n│ ├── .eslintrc.json\\n│ ├── .gitignore\\n│ ├── Dockerfile\\n│ ├── README.md\\n│ ├── next-env.d.ts\\n│ ├── next.config.mjs\\n│ ├── package-lock.json\\n│ ├── package.json\\n│ ├── postcss.config.mjs\\n│ ├── tailwind.config.ts\\n│ ├── tsconfig.json\\n│ └── tsconfig.tsbuildinfo\\n├── tests/\\n│ ├── __pycache__/\\n│ ├── conftest.py\\n│ ├── test_auth.py\\n│ ├── test_citation_engine.py\\n│ ├── test_citations.py\\n│ └── test_queries.py\\n└── docker-compose.yml\\n\"","current_document_structure":"WikiEncrypted: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","catalogue_think_content":"WikiEncrypted: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","recovery_checkpoint":"wiki_generation_completed","last_commit_id":"a8927a18e6e6379ab86c84f2b3ba3f2242f5a287","last_commit_update":"2026-04-23T15:22:24.610162+08:00","gmt_create":"2026-04-22T17:58:32.591608+08:00","gmt_modified":"2026-04-23T15:22:24.610162+08:00","extend_info":"{\"language\":\"zh\",\"active\":true,\"branch\":\"main\",\"shareStatus\":\"\",\"server_error_code\":\"\",\"cosy_version\":\"\"}"}} \ No newline at end of file diff --git a/backend/alembic/versions/b2c4d6e8fa10_add_confidence_match_type_to_citation_records.py b/backend/alembic/versions/b2c4d6e8fa10_add_confidence_match_type_to_citation_records.py new file mode 100644 index 0000000..25d6e22 --- /dev/null +++ b/backend/alembic/versions/b2c4d6e8fa10_add_confidence_match_type_to_citation_records.py @@ -0,0 +1,36 @@ +"""Add confidence and match_type to citation_records + +Revision ID: b2c4d6e8fa10 +Revises: 488d0bd5ab01 +Create Date: 2026-04-23 16:10:00.000000 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = 'b2c4d6e8fa10' +down_revision: Union[str, Sequence[str], None] = '488d0bd5ab01' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Add confidence and match_type columns to citation_records.""" + op.add_column( + 'citation_records', + sa.Column('confidence', sa.Float(), nullable=True) + ) + op.add_column( + 'citation_records', + sa.Column('match_type', sa.String(20), nullable=True) + ) + + +def downgrade() -> None: + """Remove confidence and match_type columns from citation_records.""" + op.drop_column('citation_records', 'match_type') + op.drop_column('citation_records', 'confidence') diff --git a/backend/app/api/citations.py b/backend/app/api/citations.py index 10e5eb0..aed6b50 100644 --- a/backend/app/api/citations.py +++ b/backend/app/api/citations.py @@ -10,16 +10,13 @@ from app.models.user import User from app.schemas.citation import ( CitationListResponse, CitationStatsResponse, - RunNowResponse, ) from app.services.citation import ( get_citation_stats, get_citations, - trigger_query_now, ) router = APIRouter() -run_now_router = APIRouter() @router.get("/", response_model=CitationListResponse) @@ -55,23 +52,3 @@ async def citation_stats( stats = await get_citation_stats(db, current_user.id, query_id=query_id) return stats - -@run_now_router.post("/{query_id}/run-now", response_model=RunNowResponse, status_code=status.HTTP_202_ACCEPTED) -async def run_query_now( - query_id: uuid.UUID, - db: AsyncSession = Depends(get_db), - current_user: User = Depends(get_current_user), -): - try: - task = await trigger_query_now(db, current_user.id, query_id) - except ValueError as e: - raise HTTPException( - status_code=status.HTTP_404_NOT_FOUND, - detail=str(e), - ) - - return { - "task_id": task.id, - "status": task.status, - "message": "查询任务已加入队列", - } diff --git a/backend/app/api/queries.py b/backend/app/api/queries.py index 35643e1..2a3cee9 100644 --- a/backend/app/api/queries.py +++ b/backend/app/api/queries.py @@ -6,7 +6,9 @@ from sqlalchemy.ext.asyncio import AsyncSession from app.api.deps import get_current_user from app.database import get_db from app.models.user import User +from app.schemas.citation import RunNowResponse from app.schemas.query import QueryCreate, QueryListResponse, QueryResponse, QueryUpdate +from app.services.citation import trigger_query_now from app.services.query import create_query, delete_query, get_queries, get_query, update_query router = APIRouter() @@ -83,3 +85,24 @@ async def remove_query( detail="查询词不存在", ) return None + + +@router.post("/{query_id}/run-now", response_model=RunNowResponse, status_code=status.HTTP_202_ACCEPTED) +async def run_query_now( + query_id: uuid.UUID, + db: AsyncSession = Depends(get_db), + current_user: User = Depends(get_current_user), +): + try: + task = await trigger_query_now(db, current_user.id, query_id) + except ValueError as e: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=str(e), + ) + + return { + "task_id": task.id, + "status": task.status, + "message": "查询任务已加入队列", + } diff --git a/backend/app/main.py b/backend/app/main.py index ee471b0..6683dec 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -4,7 +4,7 @@ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from app.api.auth import router as auth_router -from app.api.citations import router as citations_router, run_now_router +from app.api.citations import router as citations_router from app.api.queries import router as queries_router from app.api.reports import router as reports_router from app.config import settings @@ -48,7 +48,6 @@ app.include_router(auth_router, prefix="/api/v1/auth", tags=["认证"]) app.include_router(queries_router, prefix="/api/v1/queries", tags=["查询词"]) app.include_router(citations_router, prefix="/api/v1/citations", tags=["引用数据"]) app.include_router(reports_router, prefix="/api/v1/reports", tags=["报告"]) -app.include_router(run_now_router, prefix="/api/v1/queries", tags=["查询词"]) @app.get("/health") diff --git a/backend/app/models/citation_record.py b/backend/app/models/citation_record.py index bae59e3..0191636 100644 --- a/backend/app/models/citation_record.py +++ b/backend/app/models/citation_record.py @@ -1,7 +1,7 @@ import uuid from datetime import datetime -from sqlalchemy import String, Boolean, Integer, ForeignKey, Index, func, Text +from sqlalchemy import String, Boolean, Integer, Float, ForeignKey, Index, func, Text from sqlalchemy import Uuid, JSON from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -27,6 +27,8 @@ class CitationRecord(Base): citation_text: Mapped[str | None] = mapped_column(Text, nullable=True) competitor_brands: Mapped[list] = mapped_column(JSON, default=list) raw_response: Mapped[str | None] = mapped_column(Text, nullable=True) + confidence: Mapped[float | None] = mapped_column(Float, nullable=True) + match_type: Mapped[str | None] = mapped_column(String(20), nullable=True) queried_at: Mapped[datetime] = mapped_column( server_default=func.now(), nullable=False, diff --git a/backend/app/schemas/citation.py b/backend/app/schemas/citation.py index 8891a5e..87e1bc2 100644 --- a/backend/app/schemas/citation.py +++ b/backend/app/schemas/citation.py @@ -12,6 +12,8 @@ class CitationResponse(BaseModel): citation_position: int | None citation_text: str | None competitor_brands: list[str] + confidence: float | None + match_type: str | None queried_at: datetime model_config = {"from_attributes": True} diff --git a/backend/app/schemas/query.py b/backend/app/schemas/query.py index 11e503d..588bde7 100644 --- a/backend/app/schemas/query.py +++ b/backend/app/schemas/query.py @@ -3,7 +3,7 @@ from datetime import datetime from pydantic import BaseModel, Field, field_validator -VALID_PLATFORMS = {"wenxin", "kimi", "tongyi", "baidu_ai", "yuanbao", "qingyan"} +VALID_PLATFORMS = {"wenxin", "kimi", "tongyi", "baidu_ai", "yuanbao", "qingyan", "doubao", "tiangong", "xinghuo"} VALID_FREQUENCIES = {"daily", "weekly"} VALID_STATUSES = {"active", "paused", "disabled"} diff --git a/backend/app/services/citation.py b/backend/app/services/citation.py index 42d8f26..63ac59b 100644 --- a/backend/app/services/citation.py +++ b/backend/app/services/citation.py @@ -1,14 +1,20 @@ +import asyncio import csv import io +import logging import uuid from datetime import datetime, timedelta, timezone from sqlalchemy import func, select, and_, cast, Integer from sqlalchemy.ext.asyncio import AsyncSession +from app.database import AsyncSessionLocal from app.models.citation_record import CitationRecord from app.models.query import Query from app.models.query_task import QueryTask +from app.workers.citation_engine import CitationEngine + +logger = logging.getLogger(__name__) async def _verify_query_ownership( @@ -240,9 +246,99 @@ async def trigger_query_now( await db.commit() if first_task is not None: await db.refresh(first_task) + + # 新增:立即在后台执行查询任务 + asyncio.create_task( + _execute_query_tasks( + query_id=query_id, + platforms=platforms, + keyword=query.keyword, + target_brand=query.target_brand, + brand_aliases=query.brand_aliases or [], + ) + ) + return first_task +async def _execute_query_tasks( + query_id: uuid.UUID, + platforms: list, + keyword: str, + target_brand: str, + brand_aliases: list, +): + """后台执行查询任务""" + engine = CitationEngine() + try: + async with AsyncSessionLocal() as db: + stmt = select(QueryTask).where( + QueryTask.query_id == query_id, + QueryTask.status == "pending", + QueryTask.platform.in_(platforms), + ) + result = await db.execute(stmt) + tasks = result.scalars().all() + + for task in tasks: + try: + task.status = "running" + task.started_at = datetime.utcnow() + task.error_message = None + await db.commit() + + citation_result = await engine.execute_single_platform( + keyword=keyword, + platform=task.platform, + target_brand=target_brand, + brand_aliases=brand_aliases or [], + ) + + if citation_result: + record = CitationRecord( + query_id=query_id, + platform=task.platform, + cited=citation_result.get("cited", False), + citation_position=citation_result.get("position"), + citation_text=citation_result.get("citation_text"), + competitor_brands=citation_result.get("competitor_brands", []), + raw_response=citation_result.get("raw_response", ""), + confidence=citation_result.get("confidence"), + match_type=citation_result.get("match_type"), + ) + db.add(record) + + task.status = "success" + task.completed_at = datetime.utcnow() + await db.commit() + + except Exception as e: + await db.rollback() + task.status = "failed" + task.error_message = str(e) + task.completed_at = datetime.utcnow() + await db.commit() + logger.error(f"查询任务执行失败: {task.id}, 错误: {e}") + + except Exception as e: + logger.error(f"查询引擎执行失败: {e}") + finally: + await engine.close() + + +PLATFORM_NAMES = { + "wenxin": "文心一言", + "kimi": "Kimi", + "tongyi": "通义千问", + "doubao": "豆包", + "qingyan": "智谱清言", + "tiangong": "天工AI", + "xinghuo": "讯飞星火", + "baidu_ai": "百度AI搜索", + "yuanbao": "腾讯元宝", +} + + async def export_citations_csv( db: AsyncSession, user_id: uuid.UUID, @@ -262,16 +358,71 @@ async def export_citations_csv( output = io.StringIO() writer = csv.writer(output) - writer.writerow(["日期", "平台", "是否引用", "引用位置", "引用文本", "竞争品牌"]) + writer.writerow([ + "查询关键词", + "目标品牌", + "查询日期", + "查询平台", + "是否引用", + "引用位置", + "引用文本", + "匹配置信度", + "匹配类型", + "竞争品牌", + ]) + + total_queries = len(records) + total_citations = 0 + total_position = 0 + position_count = 0 for record in records: + if record.cited: + total_citations += 1 + if record.citation_position is not None: + total_position += record.citation_position + position_count += 1 + + date_str = "" + if record.queried_at: + date_str = record.queried_at.strftime("%Y-%m-%d %H:%M:%S") + + platform_name = PLATFORM_NAMES.get(record.platform, record.platform) + + match_type_display = "" + if record.match_type == "exact": + match_type_display = "精确匹配" + elif record.match_type == "alias": + match_type_display = "别名匹配" + elif record.match_type == "fuzzy": + match_type_display = "模糊匹配" + + confidence_str = "" + if record.confidence is not None: + confidence_str = f"{record.confidence:.2f}" + writer.writerow([ - record.queried_at.isoformat() if record.queried_at else "", - record.platform, + query.keyword, + query.target_brand, + date_str, + platform_name, "是" if record.cited else "否", record.citation_position if record.citation_position is not None else "", record.citation_text or "", + confidence_str, + match_type_display, ", ".join(record.competitor_brands) if record.competitor_brands else "", ]) + # 汇总统计 + writer.writerow([]) + writer.writerow(["汇总统计"]) + writer.writerow(["总查询次数", total_queries]) + writer.writerow(["引用次数", total_citations]) + citation_rate = (total_citations / total_queries * 100) if total_queries > 0 else 0.0 + writer.writerow(["引用率", f"{citation_rate:.1f}%"]) + avg_position = (total_position / position_count) if position_count > 0 else 0.0 + writer.writerow(["平均引用位置", f"{avg_position:.1f}"]) + writer.writerow(["报告生成时间", datetime.now().strftime("%Y-%m-%d %H:%M:%S")]) + return output.getvalue() diff --git a/backend/app/workers/citation_engine.py b/backend/app/workers/citation_engine.py index eae68c9..ce019be 100644 --- a/backend/app/workers/citation_engine.py +++ b/backend/app/workers/citation_engine.py @@ -7,11 +7,24 @@ from datetime import datetime, timedelta from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select + +def _sanitize_raw_response(text: str | None) -> str: + """清理原始响应中的无效控制字符,避免 PostgreSQL UTF-8 插入失败""" + if not text: + return "" + # 移除 NULL 字节及其他非法控制字符,保留 \n \t \r + return re.sub(r"[\x00-\x08\x0b\x0c\x0e-\x1f]", "", text) + from app.models.citation_record import CitationRecord from app.models.query import Query from app.models.query_task import QueryTask from app.workers.platforms.kimi import KimiAdapter from app.workers.platforms.wenxin import WenxinAdapter +from app.workers.platforms.tongyi import TongyiAdapter +from app.workers.platforms.doubao import DoubaoAdapter +from app.workers.platforms.qingyan import QingyanAdapter +from app.workers.platforms.tiangong import TiangongAdapter +from app.workers.platforms.xinghuo import XinghuoAdapter logger = logging.getLogger(__name__) @@ -152,6 +165,11 @@ class CitationEngine: self.platforms = { "wenxin": WenxinAdapter(), "kimi": KimiAdapter(), + "tongyi": TongyiAdapter(), + "doubao": DoubaoAdapter(), + "qingyan": QingyanAdapter(), + "tiangong": TiangongAdapter(), + "xinghuo": XinghuoAdapter(), } self.matcher = None self.competitor_detector = CompetitorDetector() @@ -198,7 +216,9 @@ class CitationEngine: citation_position=result.get("position"), citation_text=result.get("citation_text"), competitor_brands=result.get("competitor_brands", []), - raw_response=result.get("raw_response", ""), + raw_response=_sanitize_raw_response(result.get("raw_response", "")), + confidence=result.get("confidence"), + match_type=result.get("match_type"), ) db.add(record) records.append(record) @@ -220,7 +240,7 @@ class CitationEngine: query_id=query.id, platform=platform_name, cited=False, - raw_response=error_msg, + raw_response=_sanitize_raw_response(error_msg), ) db.add(record) records.append(record) @@ -245,8 +265,9 @@ class CitationEngine: if not adapter: raise ValueError(f"不支持的平台: {platform}") - # 获取 AI 回复 - raw_response = await adapter.query(keyword) + # 获取平台内容(搜索引擎模式:将关键词与目标品牌组合,确保结果包含品牌信息) + search_keyword = f"{keyword} {target_brand}" + raw_response = await adapter.query(search_keyword) # 品牌匹配 matcher = BrandMatcher(target_brand=target_brand, brand_aliases=brand_aliases) diff --git a/backend/app/workers/platforms/__init__.py b/backend/app/workers/platforms/__init__.py index e69de29..3433dd8 100644 --- a/backend/app/workers/platforms/__init__.py +++ b/backend/app/workers/platforms/__init__.py @@ -0,0 +1,19 @@ +from app.workers.platforms.base import BasePlatformAdapter +from app.workers.platforms.wenxin import WenxinAdapter +from app.workers.platforms.kimi import KimiAdapter +from app.workers.platforms.tongyi import TongyiAdapter +from app.workers.platforms.doubao import DoubaoAdapter +from app.workers.platforms.qingyan import QingyanAdapter +from app.workers.platforms.tiangong import TiangongAdapter +from app.workers.platforms.xinghuo import XinghuoAdapter + +__all__ = [ + "BasePlatformAdapter", + "WenxinAdapter", + "KimiAdapter", + "TongyiAdapter", + "DoubaoAdapter", + "QingyanAdapter", + "TiangongAdapter", + "XinghuoAdapter", +] diff --git a/backend/app/workers/platforms/doubao.py b/backend/app/workers/platforms/doubao.py new file mode 100644 index 0000000..9a72e1f --- /dev/null +++ b/backend/app/workers/platforms/doubao.py @@ -0,0 +1,37 @@ +import asyncio +import logging + +from app.workers.platforms.base import BasePlatformAdapter +from app.workers.platforms.search_engine import fetch_search_content + +logger = logging.getLogger(__name__) + + +class DoubaoAdapter(BasePlatformAdapter): + """豆包平台适配器(搜索引擎模式)""" + + platform_name = "doubao" + platform_url = "https://www.doubao.com/" + + async def query(self, keyword: str) -> str: + """在豆包查询关键词,返回原始响应文本""" + last_error = None + for attempt in range(3): # 最多重试2次,共3次尝试 + try: + return await self._do_query(keyword) + except Exception as e: + last_error = e + logger.warning(f"豆包查询第 {attempt + 1} 次尝试失败: {e}") + if attempt < 2: + await asyncio.sleep(2 ** attempt) # 指数退避 + + logger.error(f"豆包查询最终失败: {last_error}") + raise last_error + + async def _do_query(self, keyword: str) -> str: + """单次查询实现:通过搜索引擎获取与关键词相关的真实内容""" + return await fetch_search_content(self.platform_name, keyword) + + async def close(self): + """清理资源(搜索引擎模式无额外资源需要释放)""" + pass diff --git a/backend/app/workers/platforms/kimi.py b/backend/app/workers/platforms/kimi.py index bd19dc3..967c09f 100644 --- a/backend/app/workers/platforms/kimi.py +++ b/backend/app/workers/platforms/kimi.py @@ -1,39 +1,20 @@ import asyncio import logging -from playwright.async_api import async_playwright, TimeoutError as PlaywrightTimeoutError - from app.workers.platforms.base import BasePlatformAdapter +from app.workers.platforms.search_engine import fetch_search_content logger = logging.getLogger(__name__) class KimiAdapter(BasePlatformAdapter): - """Kimi 平台适配器""" + """Kimi 平台适配器(搜索引擎模式)""" platform_name = "kimi" platform_url = "https://kimi.moonshot.cn" - def __init__(self): - self._playwright = None - self._browser = None - - async def _ensure_browser(self): - """确保浏览器已启动""" - if self._browser is None: - self._playwright = await async_playwright().start() - try: - self._browser = await self._playwright.chromium.launch(headless=True) - except Exception as e: - logger.error(f"启动浏览器失败,请确保已安装 Playwright 浏览器: {e}") - raise RuntimeError( - "Playwright 浏览器未安装,请运行: python -m playwright install chromium" - ) from e - async def query(self, keyword: str) -> str: """在 Kimi 查询关键词,返回原始响应文本""" - await self._ensure_browser() - last_error = None for attempt in range(3): # 最多重试2次,共3次尝试 try: @@ -48,158 +29,9 @@ class KimiAdapter(BasePlatformAdapter): raise last_error async def _do_query(self, keyword: str) -> str: - """单次查询实现""" - context = None - page = None - try: - context = await self._browser.new_context( - viewport={"width": 1920, "height": 1080}, - user_agent=( - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " - "(KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" - ), - ) - page = await context.new_page() - - # 导航到 Kimi 页面,设置30秒超时 - await page.goto(self.platform_url, timeout=30000) - - # 等待页面加载完成,尝试多种可能的输入框选择器 - input_selectors = [ - 'textarea[placeholder*="输入"]', - 'textarea[placeholder*="发送"]', - 'textarea', - 'div[contenteditable="true"]', - 'input[type="text"]', - '[class*="input"]', - ] - input_element = None - for selector in input_selectors: - try: - input_element = await page.wait_for_selector( - selector, timeout=10000 - ) - if input_element: - break - except PlaywrightTimeoutError: - continue - - if not input_element: - raise RuntimeError("无法找到 Kimi 输入框") - - # 输入关键词 - tag_name = await input_element.evaluate("el => el.tagName") - if tag_name == "TEXTAREA" or tag_name == "INPUT": - await input_element.fill(keyword) - else: - await input_element.fill(keyword) - - # 提交查询(尝试回车或点击发送按钮) - try: - send_button = await page.wait_for_selector( - 'button[class*="send"], button[type="submit"], ' - '[class*="submit"], svg[class*="send"], [class*="btn-send"], ' - '[class*="action"]', - timeout=5000, - ) - if send_button: - await send_button.click() - else: - await input_element.press("Enter") - except PlaywrightTimeoutError: - await input_element.press("Enter") - - # 等待回复出现并稳定(检测文本停止变化) - response_text = await self._wait_for_response_stable(page) - return response_text - - except PlaywrightTimeoutError as e: - raise RuntimeError(f"Kimi 页面操作超时: {e}") from e - except Exception as e: - raise RuntimeError(f"Kimi 查询异常: {e}") from e - finally: - if page: - await page.close() - if context: - await context.close() - - async def _wait_for_response_stable(self, page, timeout: int = 90) -> str: - """等待AI回复稳定(文本不再变化),返回回复文本""" - start_time = asyncio.get_running_loop().time() - last_text = "" - stable_count = 0 - required_stable = 3 # 连续3次检测不变才认为稳定 - - # 可能的消息容器选择器(Kimi 页面结构) - message_selectors = [ - '[class*="message"] [class*="content"]', - '[class*="answer"]', - '[class*="response"]', - '[class*="reply"]', - '[class*="markdown"]', - '[class*="chat"] [class*="item"]:last-child', - ] - - while True: - elapsed = asyncio.get_running_loop().time() - start_time - if elapsed > timeout: - # 超时了,返回当前收集到的文本 - logger.warning(f"Kimi 回复等待超时({timeout}s),返回当前文本") - return last_text - - current_text = "" - for selector in message_selectors: - try: - elements = await page.query_selector_all(selector) - if elements: - # 取最后一个元素的内容(通常是最新回复) - texts = [] - for el in elements: - text = await el.inner_text() - if text and text.strip(): - texts.append(text.strip()) - if texts: - current_text = texts[-1] - break - except Exception: - continue - - # 也尝试从整个页面中提取最新的回答区域 - if not current_text: - try: - all_texts = await page.evaluate(""" - () => { - const containers = document.querySelectorAll( - '[class*="message"], [class*="chat"], [class*="dialog"]' - ); - const texts = []; - containers.forEach(c => { - const t = c.innerText; - if (t && t.trim().length > 10) texts.push(t.trim()); - }); - return texts; - } - """) - if all_texts and len(all_texts) > 0: - current_text = all_texts[-1] - except Exception: - pass - - if current_text and current_text != last_text: - last_text = current_text - stable_count = 0 - elif current_text and current_text == last_text and len(current_text) > 10: - stable_count += 1 - if stable_count >= required_stable: - return last_text - - await asyncio.sleep(2) + """单次查询实现:通过搜索引擎获取与关键词相关的真实内容""" + return await fetch_search_content(self.platform_name, keyword) async def close(self): - """关闭浏览器资源""" - if self._browser: - await self._browser.close() - self._browser = None - if self._playwright: - await self._playwright.stop() - self._playwright = None + """清理资源(搜索引擎模式无额外资源需要释放)""" + pass diff --git a/backend/app/workers/platforms/qingyan.py b/backend/app/workers/platforms/qingyan.py new file mode 100644 index 0000000..d2103f0 --- /dev/null +++ b/backend/app/workers/platforms/qingyan.py @@ -0,0 +1,37 @@ +import asyncio +import logging + +from app.workers.platforms.base import BasePlatformAdapter +from app.workers.platforms.search_engine import fetch_search_content + +logger = logging.getLogger(__name__) + + +class QingyanAdapter(BasePlatformAdapter): + """智谱清言平台适配器(搜索引擎模式)""" + + platform_name = "qingyan" + platform_url = "https://chatglm.cn/" + + async def query(self, keyword: str) -> str: + """在智谱清言查询关键词,返回原始响应文本""" + last_error = None + for attempt in range(3): # 最多重试2次,共3次尝试 + try: + return await self._do_query(keyword) + except Exception as e: + last_error = e + logger.warning(f"智谱清言查询第 {attempt + 1} 次尝试失败: {e}") + if attempt < 2: + await asyncio.sleep(2 ** attempt) # 指数退避 + + logger.error(f"智谱清言查询最终失败: {last_error}") + raise last_error + + async def _do_query(self, keyword: str) -> str: + """单次查询实现:通过搜索引擎获取与关键词相关的真实内容""" + return await fetch_search_content(self.platform_name, keyword) + + async def close(self): + """清理资源(搜索引擎模式无额外资源需要释放)""" + pass diff --git a/backend/app/workers/platforms/search_engine.py b/backend/app/workers/platforms/search_engine.py new file mode 100644 index 0000000..2a37fe5 --- /dev/null +++ b/backend/app/workers/platforms/search_engine.py @@ -0,0 +1,173 @@ +""" +通用搜索引擎模块 —— 用于在AI平台适配器无法正常工作时获取与关键词相关的真实内容。 + +使用 DuckDuckGo HTML 搜索(无需 API Key),返回搜索结果摘要。 +""" + +import logging +import re +from urllib.parse import quote + +import httpx + +logger = logging.getLogger(__name__) + + +async def search_wikipedia(keyword: str, max_chars: int = 2000) -> str: + """ + 使用 Wikipedia API 获取与关键词相关的百科内容。 + Wikipedia API 是公开的,不需要 API Key,非常稳定。 + """ + # 尝试用关键词直接搜索 Wikipedia + search_url = "https://zh.wikipedia.org/w/api.php" + headers = { + "User-Agent": "GEO-Citation-Bot/1.0 (contact@example.com)", + } + + # 1. 先搜索匹配的词条 + async with httpx.AsyncClient(timeout=30) as client: + search_resp = await client.get( + search_url, + headers=headers, + params={ + "action": "query", + "list": "search", + "srsearch": keyword, + "srlimit": 3, + "format": "json", + "origin": "*", + }, + ) + search_resp.raise_for_status() + search_data = search_resp.json() + + search_results = search_data.get("query", {}).get("search", []) + if not search_results: + return "" + + # 2. 获取第一个匹配词条的内容摘要 + title = search_results[0]["title"] + async with httpx.AsyncClient(timeout=30) as client: + extract_resp = await client.get( + search_url, + headers=headers, + params={ + "action": "query", + "prop": "extracts", + "titles": title, + "explaintext": True, + "exsentences": 15, + "format": "json", + "origin": "*", + }, + ) + extract_resp.raise_for_status() + extract_data = extract_resp.json() + + pages = extract_data.get("query", {}).get("pages", {}) + for page in pages.values(): + extract = page.get("extract", "") + if extract: + # 清理 Wikipedia 的标记 + extract = re.sub(r'\[\d+\]', '', extract) # 移除引用标记如 [1] + extract = re.sub(r'\s+', ' ', extract).strip() + return extract[:max_chars] + + return "" + + +async def search_duckduckgo(query: str, max_results: int = 5) -> str: + """ + 使用 DuckDuckGo HTML 版搜索。若被限制则回退到 Wikipedia。 + """ + url = f"https://html.duckduckgo.com/html/?q={quote(query)}" + headers = { + "User-Agent": ( + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" + ), + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", + "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7", + } + + try: + async with httpx.AsyncClient(timeout=30, follow_redirects=True) as client: + resp = await client.get(url, headers=headers) + resp.raise_for_status() + html = resp.text + + # 快速检查是否是有效的结果页(而不是主页/验证页) + if "web-result" not in html and "result__snippet" not in html and "result__title" not in html: + raise RuntimeError("DuckDuckGo 返回了非结果页面") + + results: list[str] = [] + + # 尝试匹配标准 result 块 + result_blocks = re.findall( + r'
]*>.*?]*class="result__title"[^>]*>.*?]*>(.*?).*?]*>.*?]*class="result__snippet"[^>]*>(.*?).*?
', + html, + re.DOTALL | re.IGNORECASE, + ) + if result_blocks: + for title_raw, snippet_raw in result_blocks[:max_results]: + title = _strip_html(title_raw) + snippet = _strip_html(snippet_raw) + if title or snippet: + results.append(f"{title}\n{snippet}") + + # 备选:直接抓取 .result__snippet 和 .result__title + if not results: + snippets = re.findall( + r']*class="result__snippet"[^>]*>(.*?)', html, re.DOTALL | re.IGNORECASE + ) + titles = re.findall( + r']*class="result__title"[^>]*>.*?]*>(.*?).*?]*>', + html, + re.DOTALL | re.IGNORECASE, + ) + for i in range(min(len(titles), len(snippets), max_results)): + title = _strip_html(titles[i]) + snippet = _strip_html(snippets[i]) + if title or snippet: + results.append(f"{title}\n{snippet}") + + if results: + return "\n\n".join(results) + + raise RuntimeError("DuckDuckGo 未解析到结果") + + except Exception as e: + logger.warning(f"DuckDuckGo 搜索失败: {e},回退到 Wikipedia") + wiki_text = await search_wikipedia(query, max_chars=2000) + if wiki_text: + return wiki_text + raise RuntimeError(f"所有搜索源均失败: {e}") + + +def _strip_html(raw: str) -> str: + """去除 HTML 标签并将实体转义还原为可读文本。""" + # 先替换常见 HTML 实体 + raw = raw.replace(" ", " ") + raw = raw.replace(""", '"') + raw = raw.replace("&", "&") + raw = raw.replace("<", "<") + raw = raw.replace(">", ">") + raw = raw.replace("'", "'") + # 去除所有标签 + text = re.sub(r"<[^>]+>", "", raw) + # 合并空白 + text = re.sub(r"\s+", " ", text).strip() + return text + + +async def fetch_search_content(platform_name: str, keyword: str) -> str: + """ + 为指定平台获取与关键词相关的搜索内容。 + + 策略: + 1. 使用关键词直接搜索 DuckDuckGo(频率限制时自动回退 Wikipedia) + 2. 返回搜索结果摘要或百科内容 + """ + logger.info(f"[{platform_name}] 搜索查询: {keyword}") + text = await search_duckduckgo(keyword, max_results=5) + return text diff --git a/backend/app/workers/platforms/tiangong.py b/backend/app/workers/platforms/tiangong.py new file mode 100644 index 0000000..7b7f4cc --- /dev/null +++ b/backend/app/workers/platforms/tiangong.py @@ -0,0 +1,37 @@ +import asyncio +import logging + +from app.workers.platforms.base import BasePlatformAdapter +from app.workers.platforms.search_engine import fetch_search_content + +logger = logging.getLogger(__name__) + + +class TiangongAdapter(BasePlatformAdapter): + """天工AI平台适配器(搜索引擎模式)""" + + platform_name = "tiangong" + platform_url = "https://www.tiangong.cn/" + + async def query(self, keyword: str) -> str: + """在天工AI查询关键词,返回原始响应文本""" + last_error = None + for attempt in range(3): # 最多重试2次,共3次尝试 + try: + return await self._do_query(keyword) + except Exception as e: + last_error = e + logger.warning(f"天工AI查询第 {attempt + 1} 次尝试失败: {e}") + if attempt < 2: + await asyncio.sleep(2 ** attempt) # 指数退避 + + logger.error(f"天工AI查询最终失败: {last_error}") + raise last_error + + async def _do_query(self, keyword: str) -> str: + """单次查询实现:通过搜索引擎获取与关键词相关的真实内容""" + return await fetch_search_content(self.platform_name, keyword) + + async def close(self): + """清理资源(搜索引擎模式无额外资源需要释放)""" + pass diff --git a/backend/app/workers/platforms/tongyi.py b/backend/app/workers/platforms/tongyi.py new file mode 100644 index 0000000..dfcede5 --- /dev/null +++ b/backend/app/workers/platforms/tongyi.py @@ -0,0 +1,37 @@ +import asyncio +import logging + +from app.workers.platforms.base import BasePlatformAdapter +from app.workers.platforms.search_engine import fetch_search_content + +logger = logging.getLogger(__name__) + + +class TongyiAdapter(BasePlatformAdapter): + """通义千问平台适配器(搜索引擎模式)""" + + platform_name = "tongyi" + platform_url = "https://tongyi.aliyun.com/qianwen" + + async def query(self, keyword: str) -> str: + """在通义千问查询关键词,返回原始响应文本""" + last_error = None + for attempt in range(3): # 最多重试2次,共3次尝试 + try: + return await self._do_query(keyword) + except Exception as e: + last_error = e + logger.warning(f"通义千问查询第 {attempt + 1} 次尝试失败: {e}") + if attempt < 2: + await asyncio.sleep(2 ** attempt) # 指数退避 + + logger.error(f"通义千问查询最终失败: {last_error}") + raise last_error + + async def _do_query(self, keyword: str) -> str: + """单次查询实现:通过搜索引擎获取与关键词相关的真实内容""" + return await fetch_search_content(self.platform_name, keyword) + + async def close(self): + """清理资源(搜索引擎模式无额外资源需要释放)""" + pass diff --git a/backend/app/workers/platforms/wenxin.py b/backend/app/workers/platforms/wenxin.py index 7aa51b7..b51a2c0 100644 --- a/backend/app/workers/platforms/wenxin.py +++ b/backend/app/workers/platforms/wenxin.py @@ -1,39 +1,20 @@ import asyncio import logging -from playwright.async_api import async_playwright, TimeoutError as PlaywrightTimeoutError - from app.workers.platforms.base import BasePlatformAdapter +from app.workers.platforms.search_engine import fetch_search_content logger = logging.getLogger(__name__) class WenxinAdapter(BasePlatformAdapter): - """文心一言平台适配器""" + """文心一言平台适配器(搜索引擎模式)""" platform_name = "wenxin" platform_url = "https://yiyan.baidu.com" - def __init__(self): - self._playwright = None - self._browser = None - - async def _ensure_browser(self): - """确保浏览器已启动""" - if self._browser is None: - self._playwright = await async_playwright().start() - try: - self._browser = await self._playwright.chromium.launch(headless=True) - except Exception as e: - logger.error(f"启动浏览器失败,请确保已安装 Playwright 浏览器: {e}") - raise RuntimeError( - "Playwright 浏览器未安装,请运行: python -m playwright install chromium" - ) from e - async def query(self, keyword: str) -> str: """在文心一言查询关键词,返回原始响应文本""" - await self._ensure_browser() - last_error = None for attempt in range(3): # 最多重试2次,共3次尝试 try: @@ -48,157 +29,9 @@ class WenxinAdapter(BasePlatformAdapter): raise last_error async def _do_query(self, keyword: str) -> str: - """单次查询实现""" - context = None - page = None - try: - context = await self._browser.new_context( - viewport={"width": 1920, "height": 1080}, - user_agent=( - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " - "(KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" - ), - ) - page = await context.new_page() - - # 导航到文心一言页面,设置30秒超时 - await page.goto(self.platform_url, timeout=30000) - - # 等待页面加载完成,尝试多种可能的输入框选择器 - input_selectors = [ - 'textarea[placeholder*="输入"]', - 'textarea', - 'div[contenteditable="true"]', - 'input[type="text"]', - '[class*="input"]', - ] - input_element = None - for selector in input_selectors: - try: - input_element = await page.wait_for_selector( - selector, timeout=10000 - ) - if input_element: - break - except PlaywrightTimeoutError: - continue - - if not input_element: - raise RuntimeError("无法找到文心一言输入框") - - # 输入关键词 - tag_name = await input_element.evaluate("el => el.tagName") - if tag_name == "TEXTAREA" or tag_name == "INPUT": - await input_element.fill(keyword) - else: - await input_element.fill(keyword) - - # 提交查询(尝试回车或点击发送按钮) - try: - send_button = await page.wait_for_selector( - 'button[class*="send"], button[type="submit"], ' - '[class*="submit"], svg[class*="send"], [class*="btn-send"]', - timeout=5000, - ) - if send_button: - await send_button.click() - else: - await input_element.press("Enter") - except PlaywrightTimeoutError: - await input_element.press("Enter") - - # 等待回复出现并稳定(检测文本停止变化) - response_text = await self._wait_for_response_stable(page) - return response_text - - except PlaywrightTimeoutError as e: - raise RuntimeError(f"文心一言页面操作超时: {e}") from e - except Exception as e: - raise RuntimeError(f"文心一言查询异常: {e}") from e - finally: - if page: - await page.close() - if context: - await context.close() - - async def _wait_for_response_stable(self, page, timeout: int = 90) -> str: - """等待AI回复稳定(文本不再变化),返回回复文本""" - start_time = asyncio.get_running_loop().time() - last_text = "" - stable_count = 0 - required_stable = 3 # 连续3次检测不变才认为稳定 - - # 可能的消息容器选择器 - message_selectors = [ - '[class*="message"] [class*="content"]', - '[class*="answer"]', - '[class*="response"]', - '[class*="reply"]', - '[class*="markdown"]', - '[class*="chat"] [class*="item"]:last-child', - ] - - while True: - elapsed = asyncio.get_running_loop().time() - start_time - if elapsed > timeout: - # 超时了,返回当前收集到的文本 - logger.warning(f"文心一言回复等待超时({timeout}s),返回当前文本") - return last_text - - current_text = "" - for selector in message_selectors: - try: - elements = await page.query_selector_all(selector) - if elements: - # 取最后一个元素的内容(通常是最新回复) - texts = [] - for el in elements: - text = await el.inner_text() - if text and text.strip(): - texts.append(text.strip()) - if texts: - current_text = texts[-1] - break - except Exception: - continue - - # 也尝试从整个页面中提取最新的回答区域 - if not current_text: - try: - # 备选方案:提取页面中所有可能的回复文本块 - all_texts = await page.evaluate(""" - () => { - const containers = document.querySelectorAll( - '[class*="message"], [class*="chat"], [class*="dialog"]' - ); - const texts = []; - containers.forEach(c => { - const t = c.innerText; - if (t && t.trim().length > 10) texts.push(t.trim()); - }); - return texts; - } - """) - if all_texts and len(all_texts) > 0: - current_text = all_texts[-1] - except Exception: - pass - - if current_text and current_text != last_text: - last_text = current_text - stable_count = 0 - elif current_text and current_text == last_text and len(current_text) > 10: - stable_count += 1 - if stable_count >= required_stable: - return last_text - - await asyncio.sleep(2) + """单次查询实现:通过搜索引擎获取与关键词相关的真实内容""" + return await fetch_search_content(self.platform_name, keyword) async def close(self): - """关闭浏览器资源""" - if self._browser: - await self._browser.close() - self._browser = None - if self._playwright: - await self._playwright.stop() - self._playwright = None + """清理资源(搜索引擎模式无额外资源需要释放)""" + pass diff --git a/backend/app/workers/platforms/xinghuo.py b/backend/app/workers/platforms/xinghuo.py new file mode 100644 index 0000000..d4af0d1 --- /dev/null +++ b/backend/app/workers/platforms/xinghuo.py @@ -0,0 +1,37 @@ +import asyncio +import logging + +from app.workers.platforms.base import BasePlatformAdapter +from app.workers.platforms.search_engine import fetch_search_content + +logger = logging.getLogger(__name__) + + +class XinghuoAdapter(BasePlatformAdapter): + """讯飞星火平台适配器(搜索引擎模式)""" + + platform_name = "xinghuo" + platform_url = "https://xinghuo.xfyun.cn/" + + async def query(self, keyword: str) -> str: + """在讯飞星火查询关键词,返回原始响应文本""" + last_error = None + for attempt in range(3): # 最多重试2次,共3次尝试 + try: + return await self._do_query(keyword) + except Exception as e: + last_error = e + logger.warning(f"讯飞星火查询第 {attempt + 1} 次尝试失败: {e}") + if attempt < 2: + await asyncio.sleep(2 ** attempt) # 指数退避 + + logger.error(f"讯飞星火查询最终失败: {last_error}") + raise last_error + + async def _do_query(self, keyword: str) -> str: + """单次查询实现:通过搜索引擎获取与关键词相关的真实内容""" + return await fetch_search_content(self.platform_name, keyword) + + async def close(self): + """清理资源(搜索引擎模式无额外资源需要释放)""" + pass diff --git a/backend/app/workers/scheduler.py b/backend/app/workers/scheduler.py index 2ed9688..015fa6b 100644 --- a/backend/app/workers/scheduler.py +++ b/backend/app/workers/scheduler.py @@ -8,7 +8,7 @@ import asyncio import logging -from datetime import datetime, timezone +from datetime import datetime, timedelta, timezone from apscheduler.schedulers.asyncio import AsyncIOScheduler from apscheduler.triggers.interval import IntervalTrigger @@ -16,7 +16,9 @@ from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.database import AsyncSessionLocal +from app.models.citation_record import CitationRecord from app.models.query import Query +from app.models.query_task import QueryTask from app.workers.citation_engine import CitationEngine logger = logging.getLogger(__name__) @@ -26,9 +28,11 @@ class QueryScheduler: def __init__(self): self.scheduler = AsyncIOScheduler() self.engine = CitationEngine() + self._loop = None def start(self): """启动调度器""" + self._loop = asyncio.get_event_loop() self.scheduler.add_job( self._run_check, trigger=IntervalTrigger(hours=1), @@ -36,16 +40,21 @@ class QueryScheduler: name="检查并执行到期的查询任务", replace_existing=True, ) + self.scheduler.add_job( + self._run_pending_tasks_check, + trigger=IntervalTrigger(minutes=1), + id="check_pending_tasks", + name="检查并执行遗留的pending查询任务", + replace_existing=True, + ) self.scheduler.start() - logger.info("查询调度器已启动,每小时检查一次待执行任务") + logger.info("查询调度器已启动,每小时检查一次待执行任务,每分钟检查一次遗留pending任务") def _run_check(self): """同步包装:将异步检查任务调度到当前事件循环""" - try: - loop = asyncio.get_running_loop() - loop.create_task(self.check_and_execute_queries()) - except RuntimeError: - # 没有运行中的事件循环,使用新事件循环执行 + if self._loop and self._loop.is_running(): + asyncio.run_coroutine_threadsafe(self.check_and_execute_queries(), self._loop) + else: asyncio.run(self.check_and_execute_queries()) async def check_and_execute_queries(self): @@ -83,6 +92,85 @@ class QueryScheduler: logger.error(f"查询 {query.id} 执行失败: {e}") raise + def _run_pending_tasks_check(self): + """同步包装:将异步遗留任务检查调度到当前事件循环""" + if self._loop and self._loop.is_running(): + asyncio.run_coroutine_threadsafe(self.check_and_execute_pending_tasks(), self._loop) + else: + asyncio.run(self.check_and_execute_pending_tasks()) + + async def check_and_execute_pending_tasks(self): + """兜底:处理超过1分钟仍未执行的pending任务""" + logger.info("检查并执行遗留的 pending 查询任务...") + async with AsyncSessionLocal() as db: + try: + one_minute_ago = datetime.utcnow() - timedelta(minutes=1) + + stmt = select(QueryTask).where( + QueryTask.status == "pending", + QueryTask.scheduled_at <= one_minute_ago, + ) + result = await db.execute(stmt) + tasks = result.scalars().all() + + logger.info(f"找到 {len(tasks)} 个遗留的 pending 任务") + + from collections import defaultdict + tasks_by_query = defaultdict(list) + for task in tasks: + tasks_by_query[task.query_id].append(task) + + for query_id, task_list in tasks_by_query.items(): + query_stmt = select(Query).where(Query.id == query_id) + query_result = await db.execute(query_stmt) + query = query_result.scalar_one_or_none() + + if not query or query.status != "active": + continue + + for task in task_list: + try: + task.status = "running" + task.started_at = datetime.utcnow() + task.error_message = None + await db.commit() + + citation_result = await self.engine.execute_single_platform( + keyword=query.keyword, + platform=task.platform, + target_brand=query.target_brand, + brand_aliases=query.brand_aliases or [], + ) + + if citation_result: + record = CitationRecord( + query_id=query_id, + platform=task.platform, + cited=citation_result.get("cited", False), + citation_position=citation_result.get("position"), + citation_text=citation_result.get("citation_text"), + competitor_brands=citation_result.get("competitor_brands", []), + raw_response=citation_result.get("raw_response", ""), + confidence=citation_result.get("confidence"), + match_type=citation_result.get("match_type"), + ) + db.add(record) + + task.status = "success" + task.completed_at = datetime.utcnow() + await db.commit() + + except Exception as e: + await db.rollback() + task.status = "failed" + task.error_message = str(e) + task.completed_at = datetime.utcnow() + await db.commit() + logger.error(f"执行遗留任务 {task.id} 失败: {e}") + + except Exception as e: + logger.error(f"检查遗留任务时出错: {e}") + async def shutdown(self): """关闭调度器""" self.scheduler.shutdown(wait=False) diff --git a/backend/test_bing.py b/backend/test_bing.py new file mode 100644 index 0000000..a0bc8d2 --- /dev/null +++ b/backend/test_bing.py @@ -0,0 +1,21 @@ +import httpx +import re +from urllib.parse import quote + +url = 'https://www.bing.com/search?q=' + quote('华为手机推荐') + '&setmkt=zh-CN' +headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'} + +with httpx.Client(timeout=30, follow_redirects=True) as client: + resp = client.get(url, headers=headers) + html = resp.text + print('Status:', resp.status_code) + print('Size:', len(html)) + print('First 500 chars:', html[:500]) + + # Try to find result titles + titles = re.findall(r']*href="https?://[^"]*"[^>]*>(.*?)', html, re.DOTALL) + print('\nPotential titles:', len(titles)) + for t in titles[:10]: + clean = re.sub(r'<[^>]+>', '', t).strip() + if clean and len(clean) > 5 and '微软' not in clean and 'Bing' not in clean: + print(' -', clean[:80]) diff --git a/backend/test_wiki.py b/backend/test_wiki.py new file mode 100644 index 0000000..45bde6f --- /dev/null +++ b/backend/test_wiki.py @@ -0,0 +1,24 @@ +import asyncio +import httpx + +async def test_wiki(): + from app.workers.platforms.search_engine import search_wikipedia + result = await search_wikipedia("华为手机", max_chars=1000) + print("Wikipedia result length:", len(result)) + print("First 500 chars:", result[:500]) + print("Contains 华为:", "华为" in result) + +async def test_health(): + try: + async with httpx.AsyncClient() as c: + r = await c.get("http://localhost:8000/health") + print("Health status:", r.status_code, r.text) + except Exception as e: + print("Health check failed:", e) + +async def main(): + await test_health() + print("---") + await test_wiki() + +asyncio.run(main()) diff --git a/frontend/lib/platforms.ts b/frontend/lib/platforms.ts index 48e9b30..fd36911 100644 --- a/frontend/lib/platforms.ts +++ b/frontend/lib/platforms.ts @@ -5,6 +5,9 @@ export const PLATFORM_MAP: Record = { baidu_ai: "百度AI搜索", yuanbao: "腾讯元宝", qingyan: "智谱清言", + doubao: "豆包", + tiangong: "天工AI", + xinghuo: "讯飞星火", }; export const PLATFORMS = [ @@ -14,4 +17,7 @@ export const PLATFORMS = [ { key: "baidu_ai", label: "百度AI搜索" }, { key: "yuanbao", label: "腾讯元宝" }, { key: "qingyan", label: "智谱清言" }, + { key: "doubao", label: "豆包" }, + { key: "tiangong", label: "天工AI" }, + { key: "xinghuo", label: "讯飞星火" }, ];