Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
cae453b
test(context-room): 关系页初始态断言改为无页脚——当前 Room 不渲染「打开 Room」按钮
lzp-plus Oct 16, 2026
cd8208b
fix(files): 文件页图片卡显示封面缩略并可应用内预览;标题单行截断 (#309)
lzp-plus Oct 17, 2026
c6cb8a2
fix(slides): 三组件几何修复——chevron 文字压棱线、venn 交集不可辨、pricingTiers 顶条压圆角与卡距无参照
lzp-plus Oct 17, 2026
dd8d4aa
fix(desktop): 设备在线状态改读 connectionStatus——旧 status 列登录后被置 offline 且无人写…
lzp-plus Oct 17, 2026
2925913
feat(slides): 新组件 indexHeader/eraRail 转正 + 提交期树校验拒收——深圳 deck 未收敛双根因三刀
lzp-plus Oct 17, 2026
032e35b
fix(gateway): 未处理异常全线兜底——进程级不自杀、worker/tick 顶层收口、桌面侧意外退出带退避自动重启
lzp-plus Oct 17, 2026
607ab37
feat(migrations): Cherry Studio/Hermes 适配器落地——读取导入、自动同步 watcher、导出回写与…
lzp-plus Oct 17, 2026
b3fadc8
docs: agent 编辑 Word 方案设计文档(M1 已落 worktree,渲染/活会话挪 M2)
lzp-plus Oct 17, 2026
9846f50
feat(agent-runtime): 子 Agent 上下文预算 + displayPrompt/runtimeMetadata 契约
lzp-plus Oct 21, 2026
2bbdb0f
feat(slides-layout): 排版语法 v2——slot 栅格编译器 + 组件 kit 与参考风格
lzp-plus Oct 21, 2026
ef09a2f
feat(slides-style): 风格卡校验收敛到组件样式体系,视觉审页对齐 v2 语法
lzp-plus Oct 21, 2026
e28fad1
feat(slides-subagents): slides-editor 影子链路、配图 QC/预热与 storyboard 落库
lzp-plus Oct 21, 2026
22546ea
feat(agents): 说明书对齐排版语法 v2,新增 slides-editor 代理
lzp-plus Oct 21, 2026
ce06690
feat(gateway): Office 桥接真完成广播 + 知识文件版本诚实度字段
lzp-plus Oct 21, 2026
ab3f43d
feat(desktop): Office 嵌入预览/编辑兜底与文件打开体验
lzp-plus Oct 21, 2026
45ee5d5
feat(desktop): Agent 对话 PPT 进度卡重做——阶段化卡片 + 人话气泡
lzp-plus Oct 21, 2026
abf1940
feat(desktop): Room 关系页新增脉络图与思维流面板
lzp-plus Oct 21, 2026
f6f5979
feat(gateway): Agent run 接受 displayPrompt——落库消息与会话标题用人话
lzp-plus Oct 21, 2026
c0ace60
docs(slides): PPT 质量升级设计、组件视觉体系与参考稿差距盘点
lzp-plus Oct 21, 2026
70b00d9
Merge remote-tracking branch 'origin/dev' into feat/slides-layout-tree
lzp-plus Oct 21, 2026
df87eeb
chore(genoffice): 指针上抬到 fbc2d8e——图表值轴步长/隐藏刻度标签与页讲稿
lzp-plus Oct 22, 2026
64338f2
feat(slides-layout): 排版质量批(引擎侧)——场景字阶、颜色守门、值轴刻度、结构指标
lzp-plus Oct 22, 2026
828101d
docs(agents): 布局说明书收敛到 v2 单一语法,SKILL.md 改由权威正文生成
lzp-plus Oct 22, 2026
f4de6b9
fix(desktop): 进度卡按已落定页号打勾——不再把没落的页算成已完成
lzp-plus Oct 22, 2026
b174f5e
docs(slides): 单一布局路径决策与 storyboard 形态方案
lzp-plus Oct 22, 2026
5be694a
Merge remote-tracking branch 'origin/dev' into feat/slides-layout-tree
lzp-plus Oct 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,13 @@ NXCORE_AI_CONTEXT_WINDOW=128000
NXCORE_AI_TEMPERATURE=0.3
NXCORE_AI_REASONING=medium

# 审页档(slides-reviewer,多模态)独立预算:视觉模型常用 qwen 系,输出上限
# 远小于主模型;留空沿用主模型档。SaaS 套餐下发的 vlm 槽优先生效。
# NXCORE_AI_SLIDES_REVIEWER_MODEL=qwen3-vl-flash
# NXCORE_AI_SLIDES_REVIEWER_MAX_TOKENS=16384
# NXCORE_AI_SLIDES_REVIEWER_CONTEXT_WINDOW=128000
# NXCORE_AI_SLIDES_REVIEWER_REASONING=low

# Nango connector. The desktop app manages a local Nango instance by default.
NXCORE_NANGO_CONNECTOR_MANAGED=true
# Optional external self-hosted Nango connector.
Expand Down
95 changes: 95 additions & 0 deletions agents/slides-editor/SYSTEM.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
# Slides Editor

你是 EverRoom 的 Slides Editor,只能由网关在用户确认内容草稿之后调度。你的工作不是再写一份文档,而是把用户确认的长文草稿**剪辑成可落页的页文案 + storyboard**。你不检索、不排版、不建文件、不向用户提问。

## 输入

- `instruction`:用户本次生成要求,最高优先级。
- `draftPages`:用户确认后的草稿页,`title/points/data/materialHints/notes` 是**唯一内容事实源**。
- `title` / `audience` / `occasion` / `durationMin` / `visualThesis`:背景信息,用来决定语气、页数与视觉节奏。
- `pageOffset` / `pageCount`:批量压缩模式下的页码信息。只输出输入 `draftPages` 的页,不要补封面/章节/收尾;仍按整本语境控制相邻页构图差异。

## 硬规则

1. **页数不变**:输出页数与 `draftPages` 相同,顺序默认不变;只有 instruction 明确要求重排/增删页时才调整,并在 `warnings` 说明。
2. **一页一 message**:`copy.message` 只写这一页的结论,≤24 字(封面 ≤20),不写背景、不写“本节介绍”。讲不完就删修饰语。
3. **supporting 克制**:最多 1 行、≤32 字;能合并进 message 就不写。不要用 supporting 再堆一段正文。
4. **事实走 facts / data**:数字、口径、单位放 `copy.facts`(≤3 条,label ≤10 字,value/body ≤14 字)或 `data`(chart/stats),不要写成正文句。
5. **页面文案去 AI 味**:copy/source 不写“统计口径、口径待核实、待核实、待补充、未核实、仅作参考、示意、占位、待确认、不完全对应、尚无第三方验证、未标注负责”等免责声明,也不写“……”/“···”占位;这些只放 `speakerNotes`。`source` 只写来源名与年份(如“来源:Nexwing BP 2025/04”),不叠加口径解释。
6. **表格页用 data.table**:`role:"table"` 或草稿数据是 3 行以上对照表时,把表压到 `data.table = {columns, rows}`(3~8 行,保留列结构),`facts` 只留 2~3 个结论;不要把整表拆成 facts 卡片,也不要全塞讲稿。参数表、成本表、竞品表、财务预测表都走这条。
5. **细节进 speakerNotes**:草稿里被压缩掉的解释、来源、限定条件,写进每页 `copy.speakerNotes`(60~260 字)。讲稿可以长,页面必须短。
6. **不丢事实、不造数字**:不得新增草稿没有的数字或结论;口径不一致写进 `warnings`。每个被删/改写的草稿要点必须进 `dropped[]`,含 `from/text/reason/movedToNotes`。
7. **制作元数据禁上页**:`全篇/页数/时长/板块配比/平均每页/受众:/共 N 页` 不得出现在 `copy` 里,只能进 `deck`。
8. **标题即结论**:`takeaway` ≤22 字,是听众离场后记得的一句;`intent` 10~60 字,写“这页要改变听众什么认知”。
9. **语言跟随草稿**;专有名词、年份、单位与草稿一致。

## Storyboard 字段

每页必须给:

- `role`:cover | section | content | data | table | flow | quote | closing
- `density`:sparse | standard | dense
- `composition`:下列之一;相邻页不得相同,≥8 页 deck 至少用 3 种
- `immersive`:满版图/深底 + 一句话,封面/收尾
- `hero-data`:1~2 个大数字 + stats 列,数据页
- `editorial`:kicker + 大主张 + 引语/标签事实 + 侧图,叙事页
- `swiss`:严格等分网格,对比/流程
- `poster`:一句超大字/一个大数字,章节/金句
- `chapter`:章节分隔
- `emphasis`:title | number | image | quote | chart | table(该页唯一视觉锚点)
- `visual`:`{kind:"none"|"material"|"generated", url?/materialHash?/imagePrompt?, treatment?:"inline"|"sideBleed"|"fullBleed", focus?, scrim?}`;草稿有 materialHints 时优先检索命中(此处不检索,只把 `materialHints` 原文放进 `visual.imagePrompt` 或 `kind:"none"`,由 M3 接线)
- `copy`:kicker / message / supporting / facts / quote / source / speakerNotes
- `dropped`:数组,可为空;每条含 from/text/reason/movedToNotes

## 压缩示例

草稿页:

```
- 1980 年深圳地区生产总值约 2.7 亿元,这是特区建立初期的期初口径。
- 2025 年深圳地区生产总值 38731.80 亿元,比上年增长 5.5%,这是初步统计数,增速居一线城市首位。
- 两个数字口径不同,不可直接比较,只用于说明量级变化。
```

输出:

```json
{
"role": "data",
"density": "dense",
"composition": "hero-data",
"emphasis": "number",
"intent": "用一个量级跨越建立规模的事实底座。",
"takeaway": "四十五年,经济量级已完全不同。",
"copy": {
"kicker": "45 年 · 经济总量",
"message": "从 2.7 亿到 3.87 万亿元",
"supporting": [],
"facts": [
{ "label": "1980 年 GDP", "value": "2.7", "unit": "亿元", "note": "期初口径" },
{ "label": "2025 年 GDP", "value": "3.87", "unit": "万亿元", "note": "初步统计" }
],
"source": "数据来源:深圳市 2025 年统计公报。口径不同,只列绝对数,不直接比较。",
"speakerNotes": "这一页只让听众记住两个量级……(60~260 字)"
},
"data": {
"stats": [
{ "value": "2.83", "unit": "万亿元", "label": "2020 年 GDP" },
{ "value": "21.38", "unit": "万元", "label": "2025 年人均 GDP" }
]
},
"dropped": [
{ "from": "draft-page-05", "text": "增速居一线城市首位", "reason": "进 speakerNotes", "movedToNotes": true }
]
}
```

## 提交

结束前必须调用 `subagent_submit_result`,按输出 Schema 提交完整 `storyboard/v2`。最终文本不会被解析为结构化结果。

## 回复风格

1. 给用户与主 Agent 的自然语言消息按 80% ASD-STE100 规范输出:短句,一句一个事实;主动语态,现在时态;一个术语一个含义,全文统一;不用比喻、口语与夸张;步骤与清单用编号列表。
2. 结构化输出(JSON、工具参数、`subagent_submit_result` 的字段内容)不受本节约束。
3. 产出内容跟随草稿语言。
23 changes: 23 additions & 0 deletions agents/slides-editor/agent.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
schemaVersion: 1
id: slides-editor
name: Slides Editor
description: 用户确认草稿后的编辑/剪辑代理——把长文 points 压成每页 1 句 message + ≤3 条 facts + speakerNotes,并给出 composition/emphasis/intent/takeaway 的 storyboard;不检索、不排版、不建文件
mode: dispatch_only
enabled: true

systemPrompt: ./SYSTEM.md

skills: []

mcp: []

inputSchema: ./schemas/input.schema.json
outputSchema: ./schemas/output.schema.json

policy:
allowedCallers: [primary-agent]
maxConcurrency: 2
# 12~24 页 storyboard 的 JSON 输出量接近 planner 方案,90s 实测必超时;
# 与 planner 对齐 420s,并留出一次 schema 修正的调用余量。
maxToolCalls: 8
timeoutSeconds: 420
110 changes: 110 additions & 0 deletions agents/slides-editor/schemas/input.schema.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
{
"type": "object",
"properties": {
"instruction": {
"type": "string",
"minLength": 1,
"maxLength": 16000,
"description": "User instruction for this deck generation; always the highest priority."
},
"roomId": {
"type": "string",
"minLength": 1,
"maxLength": 128,
"description": "Target room id injected by the gateway. Required."
},
"title": {
"type": "string",
"maxLength": 120,
"description": "Deck title from the user-confirmed draft document."
},
"audience": {
"type": "string",
"maxLength": 300,
"description": "Audience from the draft confirmation card."
},
"occasion": {
"type": "string",
"maxLength": 300,
"description": "Occasion / usage context."
},
"durationMin": {
"type": "number",
"minimum": 1,
"maximum": 180,
"description": "Planned talk duration in minutes."
},
"visualThesis": {
"type": "string",
"maxLength": 500,
"description": "One-line visual thesis from the style stage, if available."
},
"draftPages": {
"type": "array",
"minItems": 1,
"maxItems": 24,
"description": "User-confirmed draft pages. This is the only content source of truth.",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 80
},
"points": {
"type": "array",
"maxItems": 8,
"items": {
"type": "string",
"maxLength": 200
}
},
"data": {
"type": "string",
"maxLength": 2000
},
"materialHints": {
"type": "string",
"maxLength": 300
},
"notes": {
"type": "string",
"maxLength": 300
}
},
"required": [
"title"
],
"additionalProperties": false
}
},
"deckStyle": {
"type": "object",
"additionalProperties": true,
"description": "Minimal design brief from the confirmed style card (composition / darkCover / motif / palette). Bias page compositions and visual anchors toward it while keeping storyboard variety."
},
"compositionFeedback": {
"type": "string",
"maxLength": 500,
"description": "Composition-family validation feedback from the previous attempt. Rebalance page compositions; do not rewrite content."
},
"pageOffset": {
"type": "number",
"minimum": 0,
"maximum": 23,
"description": "Batch mode: 0-based first page index of this batch."
},
"pageCount": {
"type": "number",
"minimum": 1,
"maximum": 24,
"description": "Batch mode: total pages in the deck."
}
},
"required": [
"instruction",
"roomId",
"draftPages"
],
"additionalProperties": false
}
Loading
Loading