Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
51 changes: 17 additions & 34 deletions apps/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ OctoSense repository into the same workspace, then run this from your App Flow c

### Shared appearance

News, Photos, Mail, Calendar, Maps, AI providers, YouTube, PDF Tools and Writer share the interface
News, Photos, Mail, Calendar, Maps, AI providers, YouTube, Quick Deck, PDF Tools and Writer share the interface
in [`interface.splash`](interface.splash): theme-aware page/card/field surfaces,
readable secondary text, 44-point actions and 48-point inputs. Desktop content
has a maximum width; narrow windows keep the same actions. Camera and media
Expand Down Expand Up @@ -131,7 +131,7 @@ profiles. Phone-sized desktop captures are not physical-device verification.
| [AI providers](ai-providers/bundle) | `os.ai-providers` | The assistant's LLM providers: a primary and fallbacks, each with a model pull-down from octos's catalog and Test connection; an add wizard (family, model, route, key, test); Show QR for phone and import by camera, image or paste | `storage`, `llm` | none (the service connects, not the app) | [`llm`](ai-providers/host-service) |
| [YouTube](youtube/bundle) | `os.youtube` | YouTube search (the runtime's keyless `sys.video`, which reads YouTube's own results page), result rows with thumbnails and LIVE or length badges, topic chips, playback of YouTube's mobile watch page in `WebReader`, and a history of what was played on this device | `storage`, `net`, `glance` | `www.youtube.com`, `m.youtube.com`, `i.ytimg.com` | `youtube.notify` via the shell notice service |
| [Calendar](calendar/bundle) | `os.calendar` | Month/day calendar, event details and editor; app-owned event/agenda cards in Glance, with saved-event navigation | `calendar`, `glance` | none | [`calendar`](calendar/host-service) (Calendar-owned executor; granted cross-app tools) |
| [Quick Deck](quickdeck/bundle) | `os.quickdeck` (desktop) | An outline becomes a deck in four steps: write the slides (a title and points each), generate, review every slide (a thumbnail grid, and a slide view with a strip), export PowerPoint or PDF; keeps a list of its decks | `storage`, `deck` | none | [`deck`](deck/host-service): `new`, `info`, `render`, `convert`, in Quick Deck's own storage |
| [Quick Deck](quickdeck/bundle) | `os.quickdeck` (desktop) | A presentation editor: a library of decks with their covers, an editor with a slide navigator, a canvas and an inspector (Format, Layout, Theme, Notes), text edited in place, pictures, shapes, tables and charts with their data, a slide sorter with sections, New from an outline (typed, or drafted by the person's own AI provider), Present and Export (.pptx, PDF, pictures); open a presentation from the device. See [its README](quickdeck/README.md), with the runs that test it | `storage`, `files`, `deck`, `model` | none | the [`deck`](deck/host-service) engine service's open-document methods in [design/SERVICE.md](quickdeck/design/SERVICE.md), in the app's own storage; the shell's `files.status` and `files.import`; `model.complete` for Draft with AI |
| [PDF Tools](pdftools/bundle) | `os.pdftools` (desktop) | The PDFs in its own storage: a library with each first page, a document view with page thumbnails, text with find, and info; a page view; merge in three steps (choose, order, done) and split every few pages or where you choose; open a PDF from the device (up to 64 MiB) and remove one. See [its README](pdftools/README.md), with the hidden-shell journey that tests it | `storage`, `files`, `pdf` | none | the [`pdf`](pdf/host-service) engine service in the app's own storage: `pdf.info`, `pdf.render`, `pdf.text`, `pdf.merge`, `pdf.split`; the shell's `files.status` and `files.import` |
| [Writer](writer/bundle) | `os.writer` (desktop) | A calm editor on a white page (a line starting with `#` is a heading, `-` a bullet, `>` a quote), a document list, Save as a Word document, a preview of the saved document with an outline from its headings, and export to PDF, Markdown, HTML or OpenDocument; drafts autosave in the app's storage | `storage`, `word` | none | [`word`](word/host-service) (`word.convert`, `word.info`, `word.inspect`), in Writer's own storage |
| [AppCard](appcard) | native, opt-in | The AppCard assistant: a routing brain picks or composes an app agent, which generates a live Splash or webview card. Shells link it only with `app-appcard`; not shipped by default | n/a (not a bundle) | n/a | the shell's octos kernel |
Expand Down Expand Up @@ -225,18 +225,12 @@ See [capabilities and execution boundaries](../docs/capabilities.md).
sheet came up, the agent added an event and its card opened the glance
panel. Not packed on the phone. Its host service's tests are not in
`apps.yml` yet.
- **Quick Deck** (2026-10-09, macOS, hidden windows, light and dark): run end
to end in a desktop shell built from its branch. A typed outline became a
deck through `deck.new`, `deck.info` and one `deck.render` per slide, all
writing into Quick Deck's own storage (`decks/<id>/g<n>/`); the review grid
and the slide view show the engine's PNGs, and the PowerPoint and PDF
exports land beside them. Refusals show in the app: a nearly full storage,
a deck file the engine can't read, and a path outside the storage. A light
or dark switch keeps the screen the person is on. The `deck` service runs on
the shell's UI thread (#399), so the shell pauses while it works: about 3 s
for a five-slide deck, 16 s on the very first call of a session. Every
screen and state, refusals included, is also covered in `card-host` by
`quickdeck/tests/ui.py` with the dev fixture below.
- **Quick Deck v2** (2026-10-11): see [its README](quickdeck/README.md#status).
In App Hub's `card-host`, light and dark: every designed screen and state
on the dev fixture, and the shipped bundle with no engine. In a hidden
desktop shell on Linux (headless weston) with the real `deck` engine of
#503: a deck made from an outline, text edited in place, a format, a chart, a theme, notes, the sorter, save, export and Present, light then dark, then a restart. The model tests pass (`cargo test --locked
-p octosense-shell --lib quickdeck_model`).
- **Writer** (2026-10-09). In a hidden desktop shell built from this tree
(`MAKEPAD_WM_TEST_APP=writer`, a hidden `--remote` run, light and dark),
with the real `word` engine working in Writer's own storage: a document
Expand Down Expand Up @@ -317,6 +311,7 @@ calendar/host-service/ octosense-calendar-service, the `calendar` host ser
news/host-service/ octosense-news-service, the `news` host service (News's data service)
pdf/host-service/ octosense-pdf-service, the `pdf` host service (the pdfcraft engine, ADR 0013); examples/pdftools_fixture.rs writes PDF Tools' sample PDFs for its tests
pdftools/ PDF Tools: bundle/, tests/ui.py (its hidden-shell journey), README.md
quickdeck/ Quick Deck: bundle/, design/ (brief, designs, maps, SERVICE.md), dev-fixture/, tests/ui.py, README.md
<name>/bundle/tools.json app tools: News, Mail, Calendar, Photos, Maps, YouTube, Camera
<family>/host-service/tools.json the craft engines' tools (word, deck, cad, light, sound, design, film, effect, vector, pdf), the system agent's (ADR 0013)
../crates/shell/src/glance_notice.rs shared notice service; ../crates/shell/resources/glance/notice.card
Expand Down Expand Up @@ -465,26 +460,14 @@ desktop builds, so they read `MAKEPAD_APP_CONFIG` as a local command-line
setting; on a real phone the demo needs a development test build
(`rom/scripts/build-home.py --dev-mode`).

**Quick Deck's dev fixture.** `card-host` has no `deck` service, and the
shipped bundle has no fixture code. Quick Deck's UI tests use
`quickdeck/dev-fixture/`, outside the bundle: `engine.splash`, a stand-in for
the engine that writes what each call asks for at the paths it is given;
`fixture.json`, its settings; and real renders of `outline.txt` by the pinned
deckcraft (d0e57d7e), for its pictures. `quickdeck/tests/ui.py` makes a
scratch copy of the bundle with `engine.splash` in place of `deck_call()`,
copies the fixture into the app's storage as `dev/`, and drives every screen
and state in a hidden `card-host`, light and dark. Its first run uses the
shipped bundle as it is, which shows that no engine answers.

```sh
python3 apps/quickdeck/tests/ui.py --card-host <App Hub>/target/release/card-host --output target/quickdeck-ui
```

The grabs and a receipt per appearance land in `target/quickdeck-ui/light`
and `target/quickdeck-ui/dark`. In `fixture.json`, `delay` is the seconds each
call takes, `fail` names a call that fails (`new`, `info`, `render`, `convert`
or `all`), and `unreadable: true` answers `render` without leaving a picture,
so each slide shows its text.
**Quick Deck's tests.** The shipped bundle has one engine path,
`host.request("deck.*")`, and no fixture code. Its rules are pure functions,
run in a script VM by `../crates/shell/src/quickdeck_model_tests.rs`;
`quickdeck/tests/ui.py` runs every designed screen and state in `card-host`
on the dev fixture (`quickdeck/dev-fixture/`: `engine.splash`, a stand-in for
the engine, and `make_fixture.py`, the designs' sample decks), and the real
engine's journey in a hidden desktop shell. Commands and what each run
covers: [quickdeck/README.md](quickdeck/README.md#testing).

**Writer's tests.** The shipped bundle has one engine path,
`host.request("word.*")`, and no fixture code. Its text rules (what the list
Expand Down
42 changes: 14 additions & 28 deletions apps/README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ OctoSense-System-Apps 仓库(已归档)。

### 共用外观

新闻、相册、邮件、日历、地图、AI providers、YouTube、PDF Tools 和 Writer 共用
新闻、相册、邮件、日历、地图、AI providers、YouTube、Quick Deck、PDF Tools 和 Writer 共用
[`interface.splash`](interface.splash):页面、卡片和输入框跟随主题,
辅助文字保持可读,操作按钮高 44 点,输入框高 48 点。桌面内容限制最大宽度,
窄窗口保留相同操作。相机和媒体查看器保留深色观看背景。应用大厅的原生模块
Expand Down Expand Up @@ -108,7 +108,7 @@ OctoSense-System-Apps 仓库(已归档)。
| [AI providers](ai-providers/bundle) | `os.ai-providers` | 助手的大模型服务商:一个主用与若干备用,每项都有来自 octos 模型目录的型号下拉菜单和“测试连接”;添加向导(系列、型号、线路、密钥、测试);“为手机显示二维码”,以及通过相机、图片或粘贴导入 | `storage`、`llm` | 无(由服务联网,而不是应用) | [`llm`](ai-providers/host-service) |
| [YouTube](youtube/bundle) | `os.youtube` | YouTube 搜索(运行时无需密钥的 `sys.video`,读取 YouTube 自己的搜索结果页),带缩略图和直播或时长角标的结果列表、话题标签,在 `WebReader` 中播放 YouTube 移动版观看页,以及本机播放记录 | `storage`、`net`、`glance` | `www.youtube.com`、`m.youtube.com`、`i.ytimg.com` | Shell 通知服务的 `youtube.notify` |
| [Calendar](calendar/bundle) | `os.calendar` | 月历、按日列表、日程详情与编辑器;Glance 使用应用自有卡片,并能打开已保存日程 | `calendar`、`glance` | 无 | [`calendar`](calendar/host-service)(日历持有执行器;跨应用工具需授权) |
| [Quick Deck](quickdeck/bundle) | `os.quickdeck`(桌面) | 分四步把大纲变成演示文稿:写幻灯片(每张一个标题和若干要点)、生成、逐张检查(缩略图网格,以及带缩略图条的单张视图)、导出 PowerPoint 或 PDF;保留自己的演示文稿列表 | `storage`、`deck` | 无 | [`deck`](deck/host-service):`new`、`info`、`render`、`convert`,在 Quick Deck 自己的存储中运行 |
| [Quick Deck](quickdeck/bundle) | `os.quickdeck`(桌面) | 演示文稿编辑器:带封面的演示文稿库,带幻灯片导航栏、画布和检查器(Format、Layout、Theme、Notes)的编辑器,原地编辑文本,图片、形状、表格和带数据的图表,带分节的幻灯片浏览视图,从大纲新建(手动输入,或由用户自己的 AI 提供方起草),放映和导出(.pptx、PDF、图片);从本设备打开演示文稿。见[它的 README](quickdeck/README.zh-CN.md),其中有测试它的各次运行 | `storage`、`files`、`deck`、`model` | 无 | [`deck`](deck/host-service) 引擎服务中 [design/SERVICE.md](quickdeck/design/SERVICE.md) 规定的打开文档方法,在应用自己的存储中运行;Shell 的 `files.status` 和 `files.import`;Draft with AI 使用 `model.complete` |
| [PDF Tools](pdftools/bundle) | `os.pdftools`(桌面) | 管理自己存储中的 PDF:带首页预览的资料库,带页面缩略图、可查找的文字和信息的文档视图;单页视图;三步合并(选择、排序、完成),以及按固定页数或在指定页面处拆分;从设备打开 PDF(最大 64 MiB)和移除 PDF。见[它的 README](pdftools/README.zh-CN.md),其中介绍了测试它的隐藏 Shell 流程 | `storage`、`files`、`pdf` | 无 | 在应用自己的存储中工作的 [`pdf`](pdf/host-service) 引擎服务:`pdf.info`、`pdf.render`、`pdf.text`、`pdf.merge`、`pdf.split`;Shell 的 `files.status` 和 `files.import` |
| [Writer](writer/bundle) | `os.writer`(桌面端) | 白纸上的安静编辑器(以 `#` 开头的行是标题,`-` 是列表项,`>` 是引用)、文档列表、保存为 Word 文档、预览已保存的文档并按其标题生成大纲,以及导出为 PDF、Markdown、HTML 或 OpenDocument;草稿自动保存在应用自己的存储中 | `storage`、`word` | 无 | [`word`](word/host-service)(`word.convert`、`word.info`、`word.inspect`),在 Writer 自己的存储中 |
| [AppCard](appcard) | 原生,需显式启用 | AppCard 助手:路由大脑选择或组合一个应用 Agent,由它生成实时的 Splash 或 webview 卡片。Shell 只在启用 `app-appcard` 时链接它;默认不发布 | 不适用(不是 bundle) | 不适用 | Shell 的 octos 内核 |
Expand Down Expand Up @@ -175,15 +175,11 @@ WebView 页面、图库导出、邮件、新闻、Glance 或单次模型调用
- **日历**(2026-10-01,桌面端,隐藏窗口的 `--remote` 运行,接真实模型):系统 Agent
请日历的 Agent 放一张卡片;首次使用面板弹出,Agent 添加了一个日程,它的卡片打开了
glance 面板。手机上没有打包。它的宿主服务测试还不在 `apps.yml` 中。
- **Quick Deck**(2026-10-09,macOS,隐藏窗口,浅色与深色):在用其分支构建的桌面
Shell 中端到端运行。输入的大纲通过 `deck.new`、`deck.info` 和每张幻灯片一次
`deck.render` 变成演示文稿,全部写入 Quick Deck 自己的存储(`decks/<id>/g<n>/`);
检查网格和单张视图显示引擎生成的 PNG,PowerPoint 和 PDF 导出也保存在旁边。
拒绝都会在应用中显示:存储几乎已满、引擎无法读取的演示文稿文件、存储之外的路径。
切换浅色或深色时,应用停留在用户所在的页面。`deck` 服务运行在 Shell 的 UI 线程上
(#399),所以它工作时 Shell 会停顿:五张幻灯片约 3 秒,会话中的第一次调用 16 秒。
每个页面和状态(包括各种拒绝)也由 `quickdeck/tests/ui.py` 用下方的开发夹具在
`card-host` 中覆盖。
- **Quick Deck 第 2 版**(2026-10-11):见[它的 README](quickdeck/README.zh-CN.md#状态)。
在 App Hub 的 `card-host` 中(浅色与深色):开发夹具上每个设计过的页面和状态,以及没有
引擎时随 Shell 发布的 bundle。在 Linux 上隐藏运行的桌面 Shell 中(无头 weston),使用
#503 的真实 `deck` 引擎:从大纲生成演示文稿、原地编辑文本、格式、图表、主题、备注、浏览视图、保存、导出和放映,先浅色后深色,然后重启。模型测试通过(`cargo test --locked
-p octosense-shell --lib quickdeck_model`)。
- **Writer**(2026-10-09)。在用本仓库构建的隐藏桌面 Shell 中(`MAKEPAD_WM_TEST_APP=writer`,
隐藏窗口的 `--remote` 运行,浅色与深色),使用在 Writer 自己存储中工作的真实 `word` 引擎:
通过 instrument 输入的文档被保存为 Word 文档(`word.convert` 转换 Writer 写到 `work/` 的
Expand Down Expand Up @@ -248,6 +244,7 @@ calendar/host-service/ octosense-calendar-service,`calendar` 宿主服
news/host-service/ octosense-news-service,`news` 宿主服务(新闻的数据服务)
pdf/host-service/ octosense-pdf-service,`pdf` 宿主服务(pdfcraft 引擎,ADR 0013);examples/pdftools_fixture.rs 为 PDF Tools 的测试写出示例 PDF
pdftools/ PDF Tools:bundle/、tests/ui.py(在隐藏的 Shell 中运行的流程)、README.md
quickdeck/ Quick Deck:bundle/、design/(需求、设计图、像素映射、SERVICE.md)、dev-fixture/、tests/ui.py、README.md
<name>/bundle/tools.json 新闻、邮件、日历、相册、地图、YouTube、相机的 Agent 工具
<family>/host-service/tools.json craft 引擎(word、deck、cad、light、sound、design、film、effect、vector、pdf)的工具,供系统 Agent 使用(ADR 0013)
../crates/shell/src/glance_notice.rs 共用通知服务;../crates/shell/resources/glance/notice.card
Expand Down Expand Up @@ -381,23 +378,12 @@ MAKEPAD_APP_CONFIG='{"mail_demo":true}' cargo run --release -p octosense-home --

演示邮箱的密码存放在文件中,因此不会弹出钥匙串提示。这些都是桌面构建,会把 `MAKEPAD_APP_CONFIG` 当作本机命令行设置读取;在真实手机上,演示邮箱需要开发版测试构建(`rom/scripts/build-home.py --dev-mode`)。

**Quick Deck 的开发夹具。** `card-host` 没有 `deck` 服务,而随 Shell 发布的
bundle 中没有任何夹具代码。Quick Deck 的 UI 测试使用 bundle 之外的
`quickdeck/dev-fixture/`:`engine.splash` 是引擎的替身,它把每次调用要求的内容
写到调用给出的路径;`fixture.json` 是它的设置;图片是固定版本的 deckcraft
(d0e57d7e)根据 `outline.txt` 生成的真实渲染图。`quickdeck/tests/ui.py` 会复制一份
临时 bundle,用 `engine.splash` 替换其中的 `deck_call()`,把夹具复制到应用存储的
`dev/` 中,然后在隐藏的 `card-host` 中以浅色和深色外观走遍每个页面和状态。第一轮
直接使用随 Shell 发布的 bundle,展示没有引擎应答时的样子。

```sh
python3 apps/quickdeck/tests/ui.py --card-host <App Hub>/target/release/card-host --output target/quickdeck-ui
```

截图和每种外观的回执保存在 `target/quickdeck-ui/light` 与
`target/quickdeck-ui/dark`。`fixture.json` 中,`delay` 是每次调用耗费的秒数,
`fail` 指定失败的调用(`new`、`info`、`render`、`convert` 或 `all`),
`unreadable: true` 让 `render` 正常应答但不留下图片,于是每张幻灯片显示其文字。
**Quick Deck 的测试。** 发布的应用包只有一条引擎路径 `host.request("deck.*")`,不含夹具代码。
它的规则是纯函数,由 `../crates/shell/src/quickdeck_model_tests.rs` 在脚本虚拟机中运行;
`quickdeck/tests/ui.py` 在 `card-host` 中用开发夹具(`quickdeck/dev-fixture/`:引擎的替身
`engine.splash`,以及生成设计图示例演示文稿的 `make_fixture.py`)走遍每个设计过的页面和状态,
并在隐藏的桌面 Shell 中用真实引擎运行完整流程。命令和每次运行覆盖的内容见
[quickdeck/README.zh-CN.md](quickdeck/README.zh-CN.md#测试)。

**Writer 的测试。** 发布的应用包只有一条引擎路径 `host.request("word.*")`,不含 fixture 代码。
它的文本规则(列表为草稿显示什么、交给引擎的 Markdown、文件名、大纲、相对时间以及拒绝时的提示)
Expand Down
Loading
Loading