Keep research search recoverable and isolate browser checks [skip ci]

This commit is contained in:
2026-11-07 15:51:12 +08:00
parent 4478750909
commit d527d059eb
14 changed files with 189 additions and 46 deletions
+8 -3
View File
@@ -10,7 +10,7 @@
{"thesisly":"http://localhost:17322/auth/callback"}
```
这只是新增项示例,**不要用此单项覆盖全部现有项目**。前端 `.env.local` 的 `FOUNDRY_PROJECT` 必须与键完全相同,`APP_ORIGIN=http://localhost:17322`。第三方平台 Google/Slack 回调依然指向共享 Foundry 后端,不改为前端地址。后端变量的应用方式由后端维护方处理;本前端不配置CI/CD。
这只是新增项示例,**不要用此单项覆盖全部现有项目**。前端 `.env.local` 的 `FOUNDRY_PROJECT` 必须与键完全相同,`APP_ORIGIN=http://localhost:17322`。第三方平台 Google/Slack 回调依然指向共享 Foundry 后端,不改为前端地址。本前端不配置CI/CD。此次已对正式 Core 执行仅配置重载,保留原有 endoleap、notes、board,并追加 thesisly;复用原镜像和发布二进制,没有发布工作分支代码。
## 流程
@@ -31,8 +31,13 @@ App Router 的 route.ts 直接调用 src/lib/auth-gateway.mjs。tests/auth-gatew
## 2026-11-07 配置更新
用户已确认新增 Thesisly 的 FOUNDRY_PROJECTS 回调。FOUNDRY_RESEARCH_DATABASE 为已撤回的 SQLite 路径方案,无需添加。论文数据正在独立任务迁移到 PostgreSQL;本任务等待迁移后的数据库/schema与只读接入方式,再完成 Core 论文 API。
用户已确认新增 Thesisly 的 FOUNDRY_PROJECTS 回调。FOUNDRY_RESEARCH_DATABASE 为已撤回的 SQLite 路径方案,无需添加。论文库已完成 PostgreSQL 迁移及验收,Core 的论文 API 已通过临时回环服务接入前端。正式 Core 项目注册现已生效,新旧四个项目匿名 auth/me 均返回401;Google/Slack 实际授权地址和取消回调已验证。实际账户授权、邮件投递与完整会话验收仍未完成。
配置重载第一次因公网 TLS 探测超时而回退,已确认旧服务健康;随后按现有部署脚本使用回环 TLS、真实 SNI 与证书验证完成切换。服务器受保护验收记录为 foundry/verification/thesisly-config-foundry-core-1595929e8395.json,包含未变更的发布二进制 SHA256 和旧路由备份位置,不含认证凭据。
## 浏览器会话回归
`pnpm test:session` 使用系统 Chrome 和独立端口17323/17324:复制应用源文件到可清理的临时目录,运行真实 Next dev、App Router 代理与浏览器,只有 Core 响应为合成服务。它不会读取项目 .env、占用17322预览、发送真实密码或连接真实 OAuth。7项测试验证HttpOnly/SameSite Cookie及客户端无token、刷新/新标签恢复、跨标签退出、暂时故障后重试、失效清理、退出失败保留会话,以及Google/Slack模拟PKCE和邮箱验证的一次性消费。它证明前端会话接线,不证明真实Core数据、邮件投递、提供方授权或生产配置。
`pnpm test:session` 使用系统 Chrome 和独立端口17323/17324:复制应用源文件到可清理的临时目录,运行真实 Next dev、App Router 代理与浏览器,只有 Core 响应为合成服务。它不会读取项目 .env、占用17322预览、发送真实密码或连接真实 OAuth。其中7项测试验证HttpOnly/SameSite Cookie及客户端无token、刷新/新标签恢复、跨标签退出、暂时故障后重试、失效清理、退出失败保留会话,以及Google/Slack模拟PKCE和邮箱验证的一次性消费。它证明前端会话接线,不证明真实Core数据、邮件投递、提供方授权或生产配置。
另外2项浏览器用例使用同一隔离dev和合成论文API,验证400/429/503/504时保留搜索条件、隐藏未知总数和分页、缩小查询后恢复,以及格式异常响应不会显示成空结果或退回样本。共9项浏览器回归已通过。真实库上也验证了宽泛搜索超时后修改为CartoonGAN可恢复3条结果;宽泛全文计数的性能仍待优化。
+14 -8
View File
@@ -1,6 +1,6 @@
# 论文只读 HTTP 接口
状态:用户要求等待既有论文库从 SQLite 迁移至 PostgreSQL。此前 SQLite 实现方案已撤回,未部署;Foundry Core 的 codex/research-api 分支在迁移完成后按实际 PostgreSQL schema实现。本任务包括后端实现与联调,不把接口开发留给用户。
状态:既有论文库已完成 PostgreSQL 迁移与独立验收。此前 SQLite 实现方案已撤回,未部署;Foundry Core 的 codex/research-api 分支正在按实际 PostgreSQL schema 联调。本任务包括后端实现与联调,不把接口开发留给用户。
## 地址与配置
@@ -19,25 +19,31 @@ GET {PAPER_API_ORIGIN}/papers?q=&searchIn=text&topic=&sort=recent&page=1&pageSiz
- q:最多200个Unicode字符、20个词。searchIn=text时检索标题/摘要,searchIn=author时检索显示作者名。不会把用户输入作为任意SQL或FTS操作符。
- topic:精确arxiv:category值。
- sort:recent是稳定论文ID降序,即收录顺序,**不是发表日期排序**;title使用现有title_key索引。
- page:1–1000;pageSize:1–50,前端当前为8。
- page:1–1000;pageSize:1–50,前端当前为8。前端与此上限一致;结果超过8,000条时明确提示缩小搜索或领域范围,不生成不可访问的下一页链接。超出实际末页的页面地址会跳转至当前条件下的末页。
- 返回{items:Paper[],total,topics,page,pageSize},同一只读事务内计数及取页;无效、重复、未知参数返回400。
## 论文
Paper包含id、title、abstract(可空)、authors字符串数组、publishedAt(保留来源格式,可空)、topics、sources(label/url/externalId),以及publications(venue/year/track/status/evidenceUrl)。可选doi、journal、comments。
source_records按paper_id关联;作者兼容[family,given,suffix]数组与字符串。会议记录通过submissions→editions→venues,状态取最新决定观察;没有决定时保持unknown,不推断拒稿。不虚构代码库、数据集、引用量、热门或AI结论。详情不存在返回404。
source_records按paper_id关联;作者兼容[family,given,suffix]数组与字符串;真实 arXiv 的第四段机构名不拼入姓名。会议记录通过submissions→editions→venues,状态取最新决定观察;没有决定时保持unknown,不推断拒稿。不虚构代码库、数据集、引用量、热门或AI结论。详情不存在返回404。
## 读取边界
待 PostgreSQL 迁移任务完成后,核对实际数据库/schema、字段类型、全文索引及最小只读权限,在 Foundry Core 中实现查询。不部署 SQLite sidecar,不复制整库,不从浏览器持有数据库连接串。
已核对实际 PostgreSQL schema、编码标记和索引,并在服务器创建专用 SELECT 账号及受保护连接配置。已通过 SSH 回环隧道验证真实全库首页和详情(桌面/手机无页面异常和横向溢出),查询性能仍在调整;临时 Core 不是正式部署。不部署 SQLite sidecar,不复制整库,不从浏览器持有数据库连接串。
最多两个并行查询、8秒查询预算;繁忙返回429,超时/存储异常明确报错。作者筛选可能全库扫描,需要在真实库上验证性能。语料库是共享公开数据;账户与未来私有收藏仍须按项目隔离。
最多两个并行查询、8秒查询预算;繁忙返回429,超时/存储异常明确报错。已补建作者和领域索引,并局部关闭 JIT、调整过滤取页顺序。实测作者搜索146条、cs.AR领域9457条、CartoonGAN搜索3条、多词全文检索8653条均返回200;非常宽泛的检索仍可能超出8秒预算,需继续优化。语料库是共享公开数据;账户与未来私有收藏仍须按项目隔离。
## 联调前置
- 用户手动合并后端PR;后端沿用已确认ECS runner验证与部署。
- 当前阶段不触发 CI、不推送启动流水线,也不部署;手动验证在已确认 ECS 的独立临时目录执行。后续主线合并仍需用户手动操作。
- 保留FOUNDRY_PROJECTS旧条目,追加thesisly→http://localhost:17322/auth/callback。
- 用户已确认新增 FOUNDRY_PROJECTS;无需添加 FOUNDRY_RESEARCH_DATABASE。PostgreSQL 的后端接入配置待迁移完成后确定。
- 用户已确认新增 FOUNDRY_PROJECTS;无需添加 FOUNDRY_RESEARCH_DATABASE。PostgreSQL 后端连接仅放服务器受保护的 research.env,不放 Gitea Variables 或前端配置。
- 本地忽略文件 PAPER_API_ORIGIN 现指向 127.0.0.1:17325/projects/thesisly/research/,通过 SSH 连接 ECS 临时 Core。隧道和临时服务停止时应显式报错,不退回样本。
- 前端仓库为Zayden-Jung/Thesisly,不配置CI/CD;本地build按用户最新要求暂不执行。
- 真实Google/Slack、邮箱验证、刷新恢复与退出需要实际浏览器授权验收;302与fixture测试不代表登录成功。
- 正式 Core 已仅重载项目配置,Thesisly 匿名 auth/me 当前返回401,原有项目保留;论文 API 新代码仍未发布正式后端。真实Google/Slack、邮箱验证、刷新恢复与退出需要实际浏览器授权验收;302与fixture测试不代表登录成功。
## 查询失败后的恢复
列表将超时、繁忙、无效条件和服务不可用作为可恢复状态:保留关键词/搜索范围/领域,不显示未知总数和分页,不把错误显示成0条结果,也不退回样本。用户可直接修改关键词或重试。真实库已验证graph超时后修改为CartoonGAN恢复3条;隔离浏览器和匿名HTTP传输用例覆盖了错误分类、表单保留及异常响应处理。