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
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@

### Added

- #329:手机打开 RoleWeave 时进入原生手机壳(组织 / 指令 / 桌面 / 设置),而不是缩过的桌面工作台。组织页只读预览 `examples/oss-maintainer`;回合仍在已打开的电脑桌面执行。

- #328 R2:新增 `semantic-runtime.v1alpha1` 合同切片(BusinessObjectRef / EvidenceRef / DecisionRecord / ActionProposal / ExecutionReceipt)与 Ontology Runtime 术语表;github-ops 示例给出只读分析与可写 squash-merge 轨迹;纯函数测试覆盖「未批准不可执行、非法过期时间 fail-closed、幂等重试绑定目标版本、目标版本失效、运行前状态不可直接失败、indeterminate 不能变成 succeeded」。不是 live GitHub 执行,也不是 Sales Workbench 核心词汇。设计说明见 `docs/design/ontology-runtime-r2.md`。

- #309 后续:控制面拒绝超大请求体时,drain 或读取被中止(2 秒截止、10 MiB drain 上限、对端断开)会向 stderr 写一行原因与字节数,现场 EPIPE / 连接复位事故从此可归因;同步 docs/api-contract-v0.md:1 MiB 上限补记先读后拒行为、drain 上限与截止、server requestTimeout / headersTimeout,以及拒绝响应携带 Connection: close。附测试:stall 的超大上传在 drain 与 read 两条路径都断言中止行。
Expand Down Expand Up @@ -141,6 +143,8 @@

### Added

- #329:手机打开 RoleWeave 时进入原生手机壳(组织 / 指令 / 桌面 / 设置),而不是缩过的桌面工作台。组织页只读预览 `examples/oss-maintainer`;回合仍在已打开的电脑桌面执行。

- #127 AC-004 跨平台布局一致性证据:新增 layout smoke 模式(macOS arm64 / Windows x64 双平台,全应用渲染两栏组织工作区并由 main 进程度量列矩形写报告),verify.yml 新增 layout-parity job 下载双平台报告比对(per-platform bottomDelta ≤2px、per-platform 两列高差 ≤2px、跨平台宽差 ≤4px、跨平台 chrome overhead 差 ≤8px,阈值声明在 scripts/check-layout-parity.mjs)。跨平台一项自 #190 起比的是 chrome overhead(`viewport.innerHeight - 列高`)而非绝对列高:runner 给两侧的窗口高度本就不同,比绝对高度量到的是 runner 而不是布局,#190 之前的「高差 ≤8px」写法已随之作废。顺带修 #150 打包缺口:doc-plane.js 未登记 SERVER_RUNTIME_FILES 导致打包 server 启动即崩、main CI 红。
- #146 国际化骨架与全量迁移:`@org-workbench/ui` 新增 `OwbI18nProvider` / `useT` / `zhText` 与 zh-CN/en 双目录(440 key,parity 门强制 key 集合一致);标题栏新增语言切换钮(恰好两态,持久化,默认 zh-CN,antd ConfigProvider locale 同步切换);renderer 与 ui 包全部用户可见文案迁入目录,`i18n-cjk-gate` 测试扫描源码字符串字面量内的 CJK 防绕过;数据层(turn 原文、信封、组织文件、裁决输入)不翻译。
- #167 组织图画布化收尾:视口 overflow:hidden 零滚动条,平移纯拖拽(transform translate + pointer capture,4px 点击阈值保留),缩放(按钮/捏合)以光标为锚;选中岗位 translate 居中替代 scrollIntoView;布局不再随滚动条跳动。描述语精简到标题:图表头部只留标题、空态只留标题行、composer 空闲提示行移除(运行态/禁用原因保留)。
Expand Down Expand Up @@ -258,6 +262,8 @@

### Added

- #329:手机打开 RoleWeave 时进入原生手机壳(组织 / 指令 / 桌面 / 设置),而不是缩过的桌面工作台。组织页只读预览 `examples/oss-maintainer`;回合仍在已打开的电脑桌面执行。

- 壳-服务分离:Electron main 拉起 `apps/server`(Node,仅 127.0.0.1,每启动随机 boot-token);控制面可脱离壳独立运行。
- 引擎消费:spawn 钉版 `digital-employee` CLI(ADR-0002);`/health` 报告引擎可用性与下一步。
- `org apply`:staging 暂存 → 引擎校验 → rename 原子发布;失败留档 `rejected/`,裁撤归档 `archive/`,全程不硬删除(ADR-0003)。
Expand Down
213 changes: 213 additions & 0 deletions apps/mobile-web/app.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,213 @@
:root {
color-scheme: dark;
--bg: #12141b;
--bg-elev: #1b1d26;
--ink: #f3f4f8;
--muted: #b0b5c4;
--line: #323644;
--accent: #7aa2ff;
--accent-ink: #101116;
--danger: #f0a8a8;
--radius: 16px;
--pad: 16px;
--tab: 64px;
font-family: Inter, "PingFang SC", "Noto Sans SC", system-ui, sans-serif;
}

* { box-sizing: border-box; }
html, body { margin: 0; min-height: 100%; background: var(--bg); color: var(--ink); }
body {
min-height: 100dvh;
padding:
max(12px, env(safe-area-inset-top))
max(var(--pad), env(safe-area-inset-right))
calc(var(--tab) + env(safe-area-inset-bottom))
max(var(--pad), env(safe-area-inset-left));
overscroll-behavior: contain;
touch-action: manipulation;
}

.skip {
position: absolute;
left: -999px;
top: 8px;
}
.skip:focus {
left: 12px;
z-index: 20;
padding: 8px 12px;
background: var(--accent);
color: var(--accent-ink);
border-radius: 8px;
}

.top { margin-bottom: 18px; }
.brand { display: flex; gap: 12px; align-items: center; }
.mark { width: 36px; height: 36px; flex: none; }
.eyebrow {
margin: 0;
color: var(--accent);
font-size: 11px;
letter-spacing: 0.08em;
text-transform: uppercase;
}
h1 {
margin: 2px 0 0;
font-size: 22px;
line-height: 1.25;
letter-spacing: -0.02em;
}
.lead, #command-status { color: var(--muted); line-height: 1.5; font-size: 15px; }

.panel[hidden] { display: none; }
.panel.is-active { display: block; }

.roles {
list-style: none;
margin: 16px 0 0;
padding: 0;
display: grid;
gap: 10px;
}
.role {
width: 100%;
text-align: left;
min-height: 72px;
padding: 14px 16px;
border: 1px solid var(--line);
border-radius: var(--radius);
background: var(--bg-elev);
color: inherit;
font: inherit;
display: grid;
gap: 4px;
}
.role:focus-visible, .button:focus-visible, .tab:focus-visible, input:focus-visible, textarea:focus-visible, button:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
.role strong { font-size: 16px; }
.role span { color: var(--muted); font-size: 13px; }
.role:active { transform: scale(0.99); }

.detail {
margin-top: 14px;
padding: 16px;
border: 1px solid var(--line);
border-radius: var(--radius);
background: var(--bg-elev);
display: grid;
gap: 10px;
}
.detail pre {
white-space: pre-wrap;
margin: 0;
color: var(--muted);
font: 13px/1.5 ui-monospace, SFMono-Regular, Menlo, monospace;
}
.meta { display: flex; gap: 8px; flex-wrap: wrap; }
.chip {
border: 1px solid var(--line);
border-radius: 999px;
padding: 4px 10px;
font-size: 12px;
color: var(--muted);
}

.stack { display: grid; gap: 10px; margin: 20px 0; }
label { font-size: 14px; }
input, textarea, button, .button {
width: 100%;
font: inherit;
color: var(--ink);
border: 1px solid var(--line);
border-radius: 12px;
background: var(--bg-elev);
}
input, textarea { padding: 14px; }
input { letter-spacing: 0.35em; font-size: 22px; text-align: center; }
button, .button {
min-height: 48px;
display: inline-flex;
align-items: center;
justify-content: center;
background: var(--accent);
color: var(--accent-ink);
border: 0;
font-weight: 650;
text-decoration: none;
cursor: pointer;
}
button:disabled { opacity: 0.55; cursor: not-allowed; }
.button.ghost {
background: transparent;
color: var(--ink);
border: 1px solid var(--line);
}
#command-summary {
white-space: pre-wrap;
background: var(--bg-elev);
border: 1px solid var(--line);
border-radius: 12px;
padding: 14px;
line-height: 1.45;
}

.settings {
list-style: none;
margin: 0 0 16px;
padding: 0;
border: 1px solid var(--line);
border-radius: var(--radius);
overflow: hidden;
}
.settings li {
display: flex;
justify-content: space-between;
gap: 12px;
padding: 14px 16px;
min-height: 48px;
border-bottom: 1px solid var(--line);
}
.settings li:last-child { border-bottom: 0; }
.settings span { color: var(--muted); }
.settings strong { font-weight: 600; text-align: right; }

.tabs {
position: fixed;
left: 0;
right: 0;
bottom: 0;
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 4px;
padding: 6px 8px calc(6px + env(safe-area-inset-bottom));
background: rgb(18 20 27 / 94%);
border-top: 1px solid var(--line);
backdrop-filter: blur(12px);
}
.tab {
min-height: 48px;
border: 0;
background: transparent;
color: var(--muted);
display: grid;
justify-items: center;
gap: 2px;
font-size: 11px;
font-weight: 600;
width: auto;
border-radius: 12px;
}
.tab svg { width: 22px; height: 22px; fill: currentColor; }
.tab.is-active { color: var(--ink); background: #262936; }

.error { color: var(--danger); }

@media (prefers-reduced-motion: reduce) {
.role:active { transform: none; }
}

@media (min-width: 720px) {
main, .top { max-width: 42rem; margin-left: auto; margin-right: auto; }
}
Loading
Loading