feat: add React UI and AI page sharing tools

Move HTTP page rendering to the React app, fix multi-tool-call message handling, add API docs lookup, web page lookup, and Markdown preview page sharing.
This commit is contained in:
2026-07-07 22:27:14 +08:00
parent 3d77733e11
commit 640ba9e7d2
65 changed files with 8020 additions and 1732 deletions
@@ -0,0 +1,33 @@
INSERT INTO ias_upgrade_logs (
version,
released_at,
title,
description,
changes,
modules
) VALUES (
'0.2.9',
'2026-07-07T00:00:00+08:00',
'HTTP 页面迁移至 Askama 模板引擎',
'更新日志页面和 Web 内容页面从手写字符串拼接改为 Askama 编译期模板渲染,提升可维护性。',
'[
"HTTP 页面迁移至 Askama 模板引擎:更新日志页面(/updates)和 Web 内容页面(/web/{type}/{slug}、/mail/{slug})从手写 format!() 字符串拼接改为 Askama 编译期模板渲染。",
"新增 ias-http/templates/ 目录,包含 base.html(共享布局)、error.html(错误页)、updates/ 和 pages/ 模板,支持模板继承和自动 HTML 转义。",
"ias-http 新增 askama 依赖;shell.rs 新增 ErrorPage Askama 模板,保留 html_shell() 和 escape_html() 供 ias-mail、ias-service 兼容使用。"
]'::jsonb,
'{
"ias-common": "0.1.0",
"ias-ai": "0.1.2",
"ias-wechat": "0.1.0",
"ias-context": "0.1.1",
"ias-http": "0.1.5",
"ias-mail": "0.1.13",
"ias-service": "0.1.7",
"ias-main": "0.2.9"
}'::jsonb
) ON CONFLICT (version) DO UPDATE SET
released_at = EXCLUDED.released_at,
title = EXCLUDED.title,
description = EXCLUDED.description,
changes = EXCLUDED.changes,
modules = EXCLUDED.modules;
@@ -0,0 +1,34 @@
INSERT INTO ias_upgrade_logs (
version,
released_at,
title,
description,
changes,
modules
) VALUES (
'0.2.10',
'2026-07-07T00:00:00+08:00',
'修复邮件已读状态和详情页返回上下文',
'修复邮件详情页自动标记已读后可能被后续轮询回滚的问题,并保留邮件详情页的列表查询上下文。',
'[
"修复邮件详情页自动标记已读后,下一轮 IMAP 轮询可能把本地已读状态回滚为未读的问题;本地已读状态现在不会被远端未读标记降级。",
"修复从筛选后的邮件列表进入详情页时丢失搜索、已读筛选和分页参数的问题;详情页返回列表、上一封和下一封会保留当前查询上下文。",
"说明:SMTP 只负责发信,不能设置收件箱邮件已读状态;已读同步需要 IMAP \\Seen 标记或服务端本地状态维护。",
"无数据库结构变化;ias-mail 升级至 0.1.14。"
]'::jsonb,
'{
"ias-common": "0.1.0",
"ias-ai": "0.1.2",
"ias-wechat": "0.1.0",
"ias-context": "0.1.1",
"ias-http": "0.1.5",
"ias-mail": "0.1.14",
"ias-service": "0.1.7",
"ias-main": "0.2.10"
}'::jsonb
) ON CONFLICT (version) DO UPDATE SET
released_at = EXCLUDED.released_at,
title = EXCLUDED.title,
description = EXCLUDED.description,
changes = EXCLUDED.changes,
modules = EXCLUDED.modules;
@@ -0,0 +1,36 @@
INSERT INTO ias_upgrade_logs (
version,
released_at,
title,
description,
changes,
modules
) VALUES (
'0.2.11',
'2026-07-07T00:00:00+08:00',
'新增上下文组装模拟器页面',
'新增 /context 页面,可查询指定 scope 下的会话、消息、长期记忆、摘要和工具,便于分析排错。',
'[
"新增上下文组装模拟器页面(/context),支持按 scopechannel + account_id + from_user_id)查询。",
"页面展示:活跃会话详情及消息列表、组装后的系统上下文预览、历史会话表、长期记忆、会话摘要(上次会话/近一周)和可用工具列表。",
"导航栏新增「上下文」入口链接。",
"ias-service 新增 context_simulator 和 context_simulator_data 模块,升级至 0.1.8。",
"ias-http 更新 shell.rs 和 base.html 导航栏,升级至 0.1.6。",
"无数据库结构变化。"
]'::jsonb,
'{
"ias-common": "0.1.0",
"ias-ai": "0.1.2",
"ias-wechat": "0.1.0",
"ias-context": "0.1.1",
"ias-http": "0.1.6",
"ias-mail": "0.1.14",
"ias-service": "0.1.8",
"ias-main": "0.2.11"
}'::jsonb
) ON CONFLICT (version) DO UPDATE SET
released_at = EXCLUDED.released_at,
title = EXCLUDED.title,
description = EXCLUDED.description,
changes = EXCLUDED.changes,
modules = EXCLUDED.modules;
@@ -0,0 +1,59 @@
INSERT INTO ias_upgrade_logs (
version,
released_at,
title,
description,
changes,
modules
) VALUES (
'0.2.12',
'2026-07-07T00:00:00+08:00',
'修复 React 页面路由与静态资源托管安全问题',
'修复 SPA 静态资源路径安全、动态内容页路由、HTML 邮件展示和上下文模拟器查询参数问题,并保持 ias-http 只负责 API 与静态资源托管。',
'[
"修复 React SPA 静态资源托管的路径安全问题,改用 tower-http 静态文件服务,避免手写路径拼接读取 web/dist 之外的文件。",
"React 新增动态内容页路由 /web/{page_type}/{slug} 与 /mail/{slug},通过 /v1/web/... API 拉取数据并渲染,保持 ias-http 只负责 API 与静态资源托管的边界。",
"邮件详情页恢复 HTML 邮件的沙箱 iframe 渲染,纯文本邮件继续按文本展示。",
"修复上下文组装模拟器提交表单后首次查询仍使用旧 URL 参数的问题。",
"邮件详情 API 在自动标记已读成功后,会在响应中同步返回 seen=true。",
"无数据库结构变化;ias-http 升级至 0.1.7ias-mail 升级至 0.1.15ias-service 升级至 0.1.9。"
]'::jsonb,
'{
"ias-common": "0.1.0",
"ias-ai": "0.1.2",
"ias-wechat": "0.1.0",
"ias-context": "0.1.1",
"ias-http": "0.1.7",
"ias-mail": "0.1.15",
"ias-service": "0.1.9",
"ias-main": "0.2.12"
}'::jsonb
) ON CONFLICT (version) DO UPDATE SET
released_at = EXCLUDED.released_at,
title = EXCLUDED.title,
description = EXCLUDED.description,
changes = EXCLUDED.changes,
modules = EXCLUDED.modules;
UPDATE ias_upgrade_logs
SET
title = 'HTTP 页面职责迁移到 React SPA',
description = 'HTTP 模块保留 JSON API 与静态资源托管,页面渲染职责迁移到 React 前端。',
changes = '[
"HTTP 页面职责迁移到 React SPAias-http 保留 /v1/updates、/v1/web/... 等 JSON API,页面渲染由 web/ 前端负责。",
"新增 React 前端工程,提供更新日志、邮件、工具、配置等页面入口。",
"ias-http 删除旧的服务端 HTML shell 与字符串拼接页面渲染代码,新增 React 静态资源托管入口。"
]'::jsonb
WHERE version = '0.2.9';
UPDATE ias_upgrade_logs
SET
changes = '[
"新增上下文组装模拟器页面(/context),支持按 scopechannel + account_id + from_user_id)查询。",
"页面展示:活跃会话详情及消息列表、组装后的系统上下文预览、历史会话表、长期记忆、会话摘要(上次会话/近一周)和可用工具列表。",
"导航栏新增「上下文」入口链接。",
"ias-service 新增 context_simulator 和 context_simulator_data 模块,升级至 0.1.8。",
"React 导航栏新增上下文入口;ias-http 升级至 0.1.6。",
"无数据库结构变化。"
]'::jsonb
WHERE version = '0.2.11';
@@ -0,0 +1,35 @@
INSERT INTO ias_upgrade_logs (
version,
released_at,
title,
description,
changes,
modules
) VALUES (
'0.2.13',
'2026-07-07T00:00:00+08:00',
'修复多工具调用上下文消息序列',
'修复模型返回多个 tool_calls 时上下文中缺少部分 tool 消息导致 LLM 请求 400 的问题,并过滤历史不完整工具调用片段。',
'[
"修复模型返回多个 tool_calls 时只执行第一个工具导致后续请求缺少 tool 消息的问题;现在会为每个 tool_call_id 生成对应工具结果。",
"服务队列新增批量工具结果处理,所有 tool 消息都写入上下文后才触发下一次 LLM 请求,避免中间态消息序列发送给模型。",
"上下文快照会过滤历史中不完整的 assistant/tool 调用片段,防止已存在的坏数据继续触发 insufficient tool messages following tool_calls message。",
"新增单元测试覆盖完整多工具调用保留、缺失工具结果过滤,以及 /v1 API catch-all 路由构建。",
"无数据库结构变化;ias-common 升级至 0.1.1ias-ai 升级至 0.1.3ias-context 升级至 0.1.2ias-service 升级至 0.1.10。"
]'::jsonb,
'{
"ias-common": "0.1.1",
"ias-ai": "0.1.3",
"ias-wechat": "0.1.0",
"ias-context": "0.1.2",
"ias-http": "0.1.7",
"ias-mail": "0.1.15",
"ias-service": "0.1.10",
"ias-main": "0.2.13"
}'::jsonb
) ON CONFLICT (version) DO UPDATE SET
released_at = EXCLUDED.released_at,
title = EXCLUDED.title,
description = EXCLUDED.description,
changes = EXCLUDED.changes,
modules = EXCLUDED.modules;
@@ -0,0 +1,36 @@
INSERT INTO ias_upgrade_logs (
version,
released_at,
title,
description,
changes,
modules
) VALUES (
'0.2.14',
'2026-07-07T00:00:00+08:00',
'新增 API 文档查询能力',
'新增结构化 HTTP API 文档接口和 AI 查询工具,使模型可以查询当前服务 API 的路径、参数、请求体、响应示例和备注后回复用户。',
'[
"新增 HTTP API 文档接口 /v1/api-docs 与 /v1/api-docs/{id},支持按关键词、分组和接口 id 查询当前服务的结构化 API 文档。",
"新增内置 AI 工具 query_api_docs,模型可查询 API 路径、参数、请求体、响应示例和备注,并据此用中文回复用户。",
"新增内置 AI 工具 query_web_pages,模型可按页面类型和关键词查询已创建的动态页面,并把相关 /web/... 或 /mail/... 链接发给用户。",
"动态页面列表 API GET /v1/web/pages 新增 q 关键词搜索,可匹配标题、摘要、正文、来源和 metadata,便于查找已创建页面。",
"API 文档覆盖健康检查、升级日志、动态页面、邮件、控制台工具、用户配置、长期记忆和上下文模拟器接口;HTTP 模块继续只负责 JSON API 与静态资源托管,页面展示仍由 React 前端负责。",
"无数据库结构变化;ias-ai 升级至 0.1.4ias-http 升级至 0.1.8ias-service 升级至 0.1.11。"
]'::jsonb,
'{
"ias-common": "0.1.1",
"ias-ai": "0.1.4",
"ias-wechat": "0.1.0",
"ias-context": "0.1.2",
"ias-http": "0.1.8",
"ias-mail": "0.1.15",
"ias-service": "0.1.11",
"ias-main": "0.2.14"
}'::jsonb
) ON CONFLICT (version) DO UPDATE SET
released_at = EXCLUDED.released_at,
title = EXCLUDED.title,
description = EXCLUDED.description,
changes = EXCLUDED.changes,
modules = EXCLUDED.modules;
@@ -0,0 +1,35 @@
INSERT INTO ias_upgrade_logs (
version,
released_at,
title,
description,
changes,
modules
) VALUES (
'0.2.15',
'2026-07-07T00:00:00+08:00',
'新增 Markdown 预览页面能力',
'新增 Markdown 预览页面和 AI 创建工具,使模型可以把长篇 Markdown 内容生成可分享链接,避免聊天平台消息长度限制。',
'[
"新增 Markdown 预览页面能力:page_type=markdown 的动态页面公开路径为 /md/{slug}React 前端按 Markdown/GFM 渲染标题、列表、表格、引用、链接和代码块。",
"新增内置 AI 工具 create_markdown_preview,模型可把长篇 Markdown、报告、代码说明或结构化答复创建成预览页,并只在聊天中发送简短摘要和链接,避免平台消息长度限制。",
"query_web_pages 支持查询 markdown 页面类型,并会返回 /md/{slug} 链接;普通动态页面和邮件页面路径保持不变。",
"API 文档补充 Markdown 动态页面说明;HTTP 模块仍只负责 JSON API 与静态资源托管,Markdown 渲染由 React 前端负责。",
"无数据库结构变化;ias-ai 升级至 0.1.5ias-http 升级至 0.1.9ias-service 升级至 0.1.12。"
]'::jsonb,
'{
"ias-common": "0.1.1",
"ias-ai": "0.1.5",
"ias-wechat": "0.1.0",
"ias-context": "0.1.2",
"ias-http": "0.1.9",
"ias-mail": "0.1.15",
"ias-service": "0.1.12",
"ias-main": "0.2.15"
}'::jsonb
) ON CONFLICT (version) DO UPDATE SET
released_at = EXCLUDED.released_at,
title = EXCLUDED.title,
description = EXCLUDED.description,
changes = EXCLUDED.changes,
modules = EXCLUDED.modules;