dsh-notch 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BASELINE.md +13 -0
- package/DESIGN.md +34 -0
- package/LICENSE +21 -0
- package/README.en.md +136 -0
- package/README.md +145 -0
- package/cordis.yml +5 -0
- package/docs/motion-audit.md +65 -0
- package/docs/motion-continuity.md +77 -0
- package/docs/releases/v0.3.0.md +20 -0
- package/dshx.yml +14 -0
- package/macos/Package.swift +17 -0
- package/macos/STATUS-MOTION.md +49 -0
- package/macos/Sources/Client.swift +139 -0
- package/macos/Sources/IdleRobot.swift +423 -0
- package/macos/Sources/NotchMarkdown.swift +266 -0
- package/macos/Sources/Panel.swift +153 -0
- package/macos/Sources/Resources/Idle/balance.json +1 -0
- package/macos/Sources/Resources/Idle/blink.json +1 -0
- package/macos/Sources/Resources/Idle/cube-in.json +1 -0
- package/macos/Sources/Resources/Idle/dance.json +1 -0
- package/macos/Sources/Resources/Idle/hop.json +1 -0
- package/macos/Sources/Resources/Idle/nod.json +1 -0
- package/macos/Sources/Resources/Idle/satellite-in.json +1 -0
- package/macos/Sources/Resources/Idle/satellite-out.json +1 -0
- package/macos/Sources/Resources/Idle/scan.json +1 -0
- package/macos/Sources/Resources/Idle/sleep.json +1 -0
- package/macos/Sources/Resources/Idle/sneeze.json +1 -0
- package/macos/Sources/Resources/Idle/stretch.json +1 -0
- package/macos/Sources/Resources/Idle/tilt.json +1 -0
- package/macos/Sources/ReviewStudio.swift +337 -0
- package/macos/Sources/RootView.swift +1093 -0
- package/macos/Sources/StatusOrbit.swift +642 -0
- package/macos/Sources/main.swift +153 -0
- package/macos/Tests/ExpandedHeightProbe.swift +108 -0
- package/macos/Tests/GeometryProbe.swift +98 -0
- package/macos/Tests/IdleProbe.swift +294 -0
- package/macos/Tests/MotionProbe.swift +106 -0
- package/macos/Tests/OutcomeProbe.swift +133 -0
- package/macos/Tests/ScrollbarProbe.swift +91 -0
- package/macos/Tests/expanded-height.sh +13 -0
- package/macos/Tests/geometry.sh +14 -0
- package/macos/Tests/idle.sh +14 -0
- package/macos/Tests/motion.sh +14 -0
- package/macos/Tests/outcome.sh +14 -0
- package/macos/Tests/scrollbar.sh +13 -0
- package/package.json +46 -0
- package/src/board.ts +299 -0
- package/src/browse-sync.ts +59 -0
- package/src/dsh-notch.ts +60 -0
- package/src/http.ts +215 -0
- package/src/session-state.ts +31 -0
- package/src/store.ts +49 -0
- package/src/types.ts +65 -0
- package/tests/answer-lifecycle.test.mjs +23 -0
- package/tests/board.test.mjs +7 -0
- package/tests/browse-sync.test.mjs +20 -0
- package/tests/mirror.test.mjs +4 -0
- package/tests/peer-range.test.mjs +21 -0
- package/tests/session-state.test.mjs +54 -0
- package/tests/unread-hold.test.mjs +90 -0
- package/tools/desktop-shell/README.md +56 -0
- package/tools/desktop-shell/child-log.mjs +6 -0
- package/tools/desktop-shell/child-log.test.mjs +14 -0
- package/tools/desktop-shell/package-recovery.py +78 -0
- package/tools/desktop-shell/recovery-probe.cjs +50 -0
- package/tools/desktop-shell/renderer-recovery.mjs +95 -0
- package/tools/desktop-shell/renderer-recovery.test.mjs +24 -0
- package/tools/diagnostics/completion-watch.py +101 -0
- package/tools/diagnostics/completion-watch.test.py +17 -0
- package/tools/diagnostics/renderer-diagnostics.mjs +56 -0
- package/tools/diagnostics/renderer-diagnostics.test.mjs +32 -0
- package/tools/idle/LICENSE.open-bot-motion +21 -0
- package/tools/idle/export.mjs +40 -0
- package/tools/idle/index.html +4 -0
- package/tools/idle/motions.js +83 -0
- package/tools/idle/original.js +1673 -0
- package/tools/idle/renderer.js +1673 -0
- package/tools/recording/Client.swift +76 -0
- package/tools/recording/DemoCatalog.swift +174 -0
- package/tools/recording/README.md +23 -0
- package/tools/recording/build.sh +41 -0
- package/tools/recording/main.swift +100 -0
- package/tools/review/ReviewStudio.swift +236 -0
- package/tools/review/audit.sh +19 -0
- package/tools/review/build.sh +7 -0
- package/tools/review/main.swift +158 -0
- package/tools/review/render-audit.swift +32 -0
package/BASELINE.md
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# 2026-09-10 baseline
|
|
2
|
+
|
|
3
|
+
Snapshot of the existing native Notch and Host plugin, before robot idle experiments.
|
|
4
|
+
|
|
5
|
+
Verification on macOS:
|
|
6
|
+
- Host tests: 8 passed (tsx 4.22.4).
|
|
7
|
+
- Native motion probe: FAILURES=0.
|
|
8
|
+
- Native geometry probe: FAILURES=0; compact one/two/three lamp heights 44/72/100 pt.
|
|
9
|
+
- No live Host restart or model calls during this snapshot.
|
|
10
|
+
|
|
11
|
+
Existing manual acceptance covered first-click response, keyboard editing, long content, retry, multi-question navigation and queued questions. Automated tests do not replace live DSH acceptance after future installation.
|
|
12
|
+
|
|
13
|
+
The idle robot is a separate experiment and is not part of this baseline.
|
package/DESIGN.md
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Notch 动作与状态转场
|
|
2
|
+
|
|
3
|
+
本次范围:运行转为审核、成功或失败;分别覆盖只有一个任务,以及两个任务中一个改变状态。保留用户最近同步的玻璃外壳、排版和机器人资源;候选效果先在独立原生预览中验收,不安装到 DSH。
|
|
4
|
+
|
|
5
|
+
## 动效规则
|
|
6
|
+
|
|
7
|
+
由当前蓝色弧线出发,头部沿路径前进、尾部跟随,途中连续变色。黄色审核和绿色成功向上,红色失败向下。到达目标后沿圆周画线,再出现实心圆及符号。有其他任务运行时,线条从目标色连续回到蓝色运行弧;最后一个任务结束或等待审核时,笔画收在目标圈,源槽随之收起。不得用整圈平移或同时淡入两个圆代替笔画移动。
|
|
8
|
+
|
|
9
|
+
沿用已接受的 0.95 秒笔画时间轴和 19 pt 圆直径,颜色、字形与坐标使用现有定义。自动展开审核面板等待笔画结束,主动交互不因动画被禁用;重复轮询不重播,旧回调不能覆盖新状态。减少动态效果直接显示最终状态。
|
|
10
|
+
|
|
11
|
+
## 设计依据与验证
|
|
12
|
+
|
|
13
|
+
| Active concept | 决策 | 实现位置 | 验证 |
|
|
14
|
+
| --- | --- | --- | --- |
|
|
15
|
+
| motion-language | 三种结果共用有方向的笔画语义;保留当前弧线作为起点 | StatusFlight / StatusOrbitView | 原速六场景原生预览与逐帧截图 |
|
|
16
|
+
| motion-contract | 同一时间轴约束路程、颜色、填充、布局;只在有剩余工作时返回 | BoardModel / OrbitLayout / OrbitMotionFrame | OutcomeProbe、MotionProbe、取消和重复事件检查 |
|
|
17
|
+
|
|
18
|
+
视觉沿用纯黑紧凑外壳、细线与圆角字形;本轮不增加装饰。主要识别特征是线条本身连续转移。原生 AppKit/SwiftUI 使用原生渲染证据,浏览器 motion validator 不适用。
|
|
19
|
+
|
|
20
|
+
## 本轮验证
|
|
21
|
+
|
|
22
|
+
黄色已使用 StatusFlight 的 decision 结果类别,沿红绿共享的路径、时间轴和填充顺序绘制。单任务中源数字与黑底在线条离开时淡出,避免收缩时压住结果圆。自动展开推迟到审核笔画完成,取消审核会取消待展开请求。
|
|
23
|
+
|
|
24
|
+
OutcomeProbe 六场景与重复事件、快速取消、连续结果检查通过;项目原 MotionProbe(含减少动态效果静止检查)通过。原生渲染器采样六场景的逐帧图像并人工检查,证据位于 `本地 motion proof 输出目录`。六场景本地预览已展示;运行中 DSH 未安装此候选,用户对自然程度的验收仍以预览反馈为准。
|
|
25
|
+
|
|
26
|
+
## 决策回复回程(本轮)
|
|
27
|
+
|
|
28
|
+
覆盖完整的 `蓝 1 → 黄 → 蓝 1` 与 `蓝 2 → 蓝 1+黄 → 蓝 2`。单灯保留已接受的清空填充、从顶部画蓝环的回程;双灯由黄圈抽出笔画,沿既有路径的返回段汇入蓝环,再把数字从 1 渐变到 2。黄灯、线条与外壳使用同一进度,源填充消失后才收起槽位。若面板正在折叠,回程从折叠完成时开始,使线条可见。回复很快时接在去程后播放;取消且没有恢复运行时不制造蓝灯;轮询不重播,旧回调不覆盖新回程。
|
|
29
|
+
|
|
30
|
+
Active motion-language 绑定:回复恢复同一任务的可见因果 → DecisionReturn / StatusOrbitView → 两条往返原速预览。Active motion-contract 绑定:数字在汇入时更新、路径及旋转速度连续、折叠不吞动画 → BoardModel / DecisionReturnFrame → OutcomeProbe 和确定时间逐帧渲染。沿用当前颜色、19 pt 灯、0.95–0.98 秒时间轴、系统减少动态效果设置。
|
|
31
|
+
|
|
32
|
+
## 双语录屏
|
|
33
|
+
|
|
34
|
+
录屏标题使用中文在上、英文在下,只呈现同一个转换名称。六格与单景均保留固定标题区,英文不挤占动画空间。36 个场景由同一份生产源构建,录屏工具仅替换传输层并发送定向待机动作,不重写状态曲线。
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 DSH Notch contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.en.md
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# DSH Notch
|
|
2
|
+
|
|
3
|
+
[中文](README.md) · [English](README.en.md)
|
|
4
|
+
|
|
5
|
+
**DSH Notch is a macOS plugin for DeepSeek Harness.** It puts real session activity, questions, and unread results at the screen edge. Answer questions in the panel, open the matching DSH conversation, and watch the robot while idle.
|
|
6
|
+
|
|
7
|
+
Installation has two parts: a **Host plugin inside DSH** that supplies session state, and a **native Notch application** that displays it. Install both using the steps below.
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
### Requirements
|
|
12
|
+
|
|
13
|
+
- macOS 14 or later.
|
|
14
|
+
- DeepSeek Harness `0.1.7-rc.1`. This package peers `@deepseek-ai/dsh` and the `@deepseek-ai/dsh-*` packages it imports at `>=0.1.7-rc.1 <0.1.8`.
|
|
15
|
+
- A working local DSH Web Host, with `dsh`, `pnpm`, and `git` available in your terminal.
|
|
16
|
+
- Swift 6 or later through Command Line Tools. Check with `swift --version`; use `xcode-select --install` if the developer tools are missing.
|
|
17
|
+
|
|
18
|
+
These instructions use the default `web` profile and `~/.dsh`. For a custom `DSH_HOME`, run plugin installation with that same environment and edit that Home's profile in step 2.
|
|
19
|
+
|
|
20
|
+
### 1. Download and install the Host plugin
|
|
21
|
+
|
|
22
|
+
```sh
|
|
23
|
+
git clone https://github.com/aa2246740/dsh-notch.git
|
|
24
|
+
cd dsh-notch
|
|
25
|
+
dsh plugin --profile web add "$PWD"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
This links the local package into DSH's Web profile. Keep the checkout: it is also where you build the native application.
|
|
29
|
+
|
|
30
|
+
The warning `declares no dsh.bundle — installed as a plain dependency` is expected for this package. **Continue with step 2 to activate it.** The current package has no automatic bundle registration, so `plugin add` alone does not start Notch.
|
|
31
|
+
|
|
32
|
+
If you run DSH from source without a global `dsh` command, run this from the Harness checkout, then return to the Notch checkout:
|
|
33
|
+
|
|
34
|
+
```sh
|
|
35
|
+
pnpm dsh plugin --profile web add /absolute/path/to/dsh-notch
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### 2. Activate the plugin in DSH
|
|
39
|
+
|
|
40
|
+
Append this item to the YAML list in `~/.dsh/profiles/web/cordis.patch.yml`. Create the file if absent. **Keep existing configuration, and add this ID only once.**
|
|
41
|
+
|
|
42
|
+
```yaml
|
|
43
|
+
- insert:
|
|
44
|
+
- id: dsh-notch
|
|
45
|
+
name: dsh-notch
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
`name: dsh-notch` resolves the profile dependency from step 1. Do not copy the repository's `cordis.yml` directly into this location; its relative paths serve a different purpose.
|
|
49
|
+
|
|
50
|
+
The standard Web profile watches this file and loads the plugin after saving. If DSH is not running yet, start it using your usual launcher. Successful loading emits `[my-plugins/dsh-notch] loaded` in the Host log and creates `~/.dsh/dsh-notch/runtime.json`.
|
|
51
|
+
|
|
52
|
+
The plugin manages this private connection file automatically. Do not fill it in manually or paste its contents into a chat. If it is absent, resolve YAML, module-resolution, or missing-service errors in the Host before continuing.
|
|
53
|
+
|
|
54
|
+
### 3. Build and start the real Notch
|
|
55
|
+
|
|
56
|
+
From the Notch checkout:
|
|
57
|
+
|
|
58
|
+
```sh
|
|
59
|
+
swift build --package-path macos -c release
|
|
60
|
+
macos/.build/release/dsh-notch --verify-idle-resources
|
|
61
|
+
macos/.build/release/dsh-notch
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
The resource check should print `IDLE_RESOURCES=10/10`. The last command starts the application connected to real DSH sessions. Keep this terminal open during the first run.
|
|
65
|
+
|
|
66
|
+
If your DSH.app already manages a Notch helper, update that copy instead of starting a duplicate. When moving the executable or integrating it into a desktop shell, keep `dsh-notch` and `DshNotch_DshNotch.bundle` from the same build together in the destination directory, then relaunch the helper. Installing the Host plugin does not configure login startup or replace a desktop shell's existing executable.
|
|
67
|
+
|
|
68
|
+
### 4. Confirm it works
|
|
69
|
+
|
|
70
|
+
- With no active work or unread results, the robot appears at the screen edge.
|
|
71
|
+
- Existing running sessions produce a blue count; questions and results produce their corresponding states.
|
|
72
|
+
- Clicking a session opens it in DSH. When a question appears, answer it directly in Notch.
|
|
73
|
+
|
|
74
|
+
Use existing sessions for these checks; a new model task is unnecessary. Seeing the robot alone does not prove Host connectivity: confirm that real session state updates too.
|
|
75
|
+
|
|
76
|
+
## Usage
|
|
77
|
+
|
|
78
|
+
| State or action | Meaning |
|
|
79
|
+
| --- | --- |
|
|
80
|
+
| Blue number | Running sessions |
|
|
81
|
+
| Yellow exclamation mark | A question or decision needs attention |
|
|
82
|
+
| Green number | Unread completed results |
|
|
83
|
+
| Red number | Failed results |
|
|
84
|
+
| Click an option | Submit that choice; follow the panel for multiple questions or selections |
|
|
85
|
+
| Click the question title | Open the full conversation in DSH |
|
|
86
|
+
| Read all results | Return to the idle robot |
|
|
87
|
+
|
|
88
|
+
The interface uses native AppKit, SwiftUI, and Canvas. Animation itself never calls a model. The panel grows with content, scrolls at the screen-height cap, and respects Reduced Motion.
|
|
89
|
+
|
|
90
|
+
## Troubleshooting
|
|
91
|
+
|
|
92
|
+
| Symptom | Check |
|
|
93
|
+
| --- | --- |
|
|
94
|
+
| Package installed, but no Notch | Both Host activation in step 2 and native startup in step 3 are required. |
|
|
95
|
+
| Robot appears, but tasks do not | Check Host plugin loading, `runtime.json`, and whether the current Host is still running. |
|
|
96
|
+
| Cannot resolve `dsh-notch` | Use the same Home and profile for installation and activation; keep the linked source directory in place. |
|
|
97
|
+
| Fewer than `10/10` resources | Rebuild and keep the resource bundle with the executable. |
|
|
98
|
+
| Two Notches | Check for both a manually started and a desktop-shell-managed copy. |
|
|
99
|
+
| Old behavior after updating source | Rebuild and replace the executable actually running; `git pull` does not replace an existing native process. |
|
|
100
|
+
|
|
101
|
+
The Host plugin requires `sessions`, `webServer`, `approval`, `userQuestions`, and `agents`. It targets a local DSH Web Host on the same Mac. Native foregrounding looks for a DSH.app with bundle ID `local.dsh.desktop`; other desktop shells need an adapter. Successful package installation alone does not certify multiple Homes, remote Hosts, or every DSH version.
|
|
102
|
+
|
|
103
|
+
## Updates and development
|
|
104
|
+
|
|
105
|
+
After updating source, rebuild the native helper. Native-only changes require updating and relaunching Notch. Changes under `src/` also require the appropriate Host module activation.
|
|
106
|
+
|
|
107
|
+
Maintainers using [dshx](https://github.com/aa2246740/dsh-external-plugin-devkit) can inspect `dshx activation-plan dsh-notch --change artifact` or `--change server`, according to the changed surface. Initial activation above uses a watched patch; restarting the whole Host does not replace a missing installation step.
|
|
108
|
+
|
|
109
|
+
```sh
|
|
110
|
+
npm ci
|
|
111
|
+
npm test
|
|
112
|
+
npm run test:outcome
|
|
113
|
+
npm run test:motion
|
|
114
|
+
npm run test:geometry
|
|
115
|
+
npm run test:scrollbar
|
|
116
|
+
npm run test:expanded-height
|
|
117
|
+
npm run test:idle
|
|
118
|
+
npm run build:macos
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Optional recording demo
|
|
122
|
+
|
|
123
|
+
For animation review and video recording, separate from plugin installation:
|
|
124
|
+
|
|
125
|
+
```sh
|
|
126
|
+
npm run build:demo
|
|
127
|
+
open "dist/DSH Notch Demo.app"
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
The demo contains 36 bilingual scenes driven by local fixtures. It does not connect to DSH. See the [demo controls](tools/recording/README.md).
|
|
131
|
+
|
|
132
|
+
More: [motion contracts](macos/STATUS-MOTION.md), [design notes](DESIGN.md), [0.3.0 changes](docs/releases/v0.3.0.md), and [optional desktop-shell diagnostics](tools/desktop-shell/README.md).
|
|
133
|
+
|
|
134
|
+
## License
|
|
135
|
+
|
|
136
|
+
[MIT](LICENSE). Robot resources derive from [OpenBotMotion](https://github.com/aa2246740/open-bot-motion); its original [MIT notice](tools/idle/LICENSE.open-bot-motion) is retained. This is a community-maintained DSH plugin.
|
package/README.md
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# DSH Notch
|
|
2
|
+
|
|
3
|
+
[中文](README.md) · [English](README.en.md)
|
|
4
|
+
|
|
5
|
+
**DSH Notch 是 DeepSeek Harness 的 macOS 插件。** 它把真实会话的运行状态、待回答问题和未读结果放在屏幕边缘:查看任务、直接回答问题、点击回到对应会话;空闲时显示待机机器人。
|
|
6
|
+
|
|
7
|
+
插件包含两部分:**装进 DSH 的 Host 插件**负责同步会话,**原生 Notch 程序**负责显示和交互。下面的安装步骤会装好这两部分。
|
|
8
|
+
|
|
9
|
+
## 安装
|
|
10
|
+
|
|
11
|
+
### 准备条件
|
|
12
|
+
|
|
13
|
+
- macOS 14 或更新版本。
|
|
14
|
+
- DeepSeek Harness `0.1.7-rc.1`。本包对 `@deepseek-ai/dsh` 与所用 `@deepseek-ai/dsh-*` 的 peer 是 `>=0.1.7-rc.1 <0.1.8`。
|
|
15
|
+
- 本机已有正常运行的 DSH Web Host;终端能使用 `dsh`、`pnpm` 和 `git`。
|
|
16
|
+
- Swift 6 或更新版本的 Command Line Tools。用 `swift --version` 检查;没有开发工具时先运行 `xcode-select --install`。
|
|
17
|
+
|
|
18
|
+
以下以默认的 `web` profile、`~/.dsh` 为例。若你的 DSH 使用自定义 `DSH_HOME`,插件安装命令必须使用同一环境,第二步也要编辑该 Home 下的 profile 文件。
|
|
19
|
+
|
|
20
|
+
### 1. 下载并安装 Host 插件
|
|
21
|
+
|
|
22
|
+
```sh
|
|
23
|
+
git clone https://github.com/aa2246740/dsh-notch.git
|
|
24
|
+
cd dsh-notch
|
|
25
|
+
dsh plugin --profile web add "$PWD"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
这条命令把本地插件目录链接到 DSH 的 Web profile。请保留这个目录,后面还要在这里构建 Notch。
|
|
29
|
+
|
|
30
|
+
如果看到 `declares no dsh.bundle — installed as a plain dependency`,这是当前包的预期提示:**包已经装入,继续第二步把插件加入运行配置。** 当前版本没有声明自动挂载的 bundle,单独执行 `plugin add` 还不会显示 Notch。
|
|
31
|
+
|
|
32
|
+
<details>
|
|
33
|
+
<summary>从 Harness 源码运行,没有全局 dsh 命令?</summary>
|
|
34
|
+
|
|
35
|
+
在 Harness checkout 里运行它自己的 CLI,使用刚下载插件的绝对路径:
|
|
36
|
+
|
|
37
|
+
```sh
|
|
38
|
+
pnpm dsh plugin --profile web add /absolute/path/to/dsh-notch
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
然后回到 `dsh-notch` 目录继续下面的步骤。
|
|
42
|
+
|
|
43
|
+
</details>
|
|
44
|
+
|
|
45
|
+
### 2. 在 DSH 中激活插件
|
|
46
|
+
|
|
47
|
+
打开 `~/.dsh/profiles/web/cordis.patch.yml`,在现有 YAML 列表中追加下面这一项。文件不存在时可新建;**保留已有配置,同一个 `id` 只添加一次**。
|
|
48
|
+
|
|
49
|
+
```yaml
|
|
50
|
+
- insert:
|
|
51
|
+
- id: dsh-notch
|
|
52
|
+
name: dsh-notch
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
这里的 `name: dsh-notch` 从第一步安装的 profile 依赖中解析。不要直接复制仓库内的 `cordis.yml`:里面的相对路径用途不同。
|
|
56
|
+
|
|
57
|
+
标准 Web profile 会监听这份配置并热加载插件。若 DSH 正在运行,保存后等它加载即可;尚未启动 DSH 时,用你原来的启动入口启动它。成功后,Host 日志会出现 `[my-plugins/dsh-notch] loaded`,并生成 `~/.dsh/dsh-notch/runtime.json`。
|
|
58
|
+
|
|
59
|
+
该文件包含 Notch 的本机连接信息,由插件自动管理,不需要手动填写或把内容发给 Agent。如果没有生成,先检查 Host 是否报 YAML、模块解析或缺少服务的错误,再继续第三步。
|
|
60
|
+
|
|
61
|
+
### 3. 构建并启动正式 Notch
|
|
62
|
+
|
|
63
|
+
在刚下载的 `dsh-notch` 目录执行:
|
|
64
|
+
|
|
65
|
+
```sh
|
|
66
|
+
swift build --package-path macos -c release
|
|
67
|
+
macos/.build/release/dsh-notch --verify-idle-resources
|
|
68
|
+
macos/.build/release/dsh-notch
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
资源检查应输出 `IDLE_RESOURCES=10/10`。最后一条命令启动连接真实 DSH 会话的 Notch;首次启动时保持这个终端窗口打开。
|
|
72
|
+
|
|
73
|
+
如果你使用的 DSH.app 已经在管理一份 Notch,只更新那份程序,避免同时启动两个。移动程序或接入 App 壳时,要把 `dsh-notch` 和同一构建目录的 `DshNotch_DshNotch.bundle` 一起放到目标目录,再重新启动 Notch 程序。单独安装 Host 插件不会自动配置登录启动,也不会替换某个 App 壳里的旧程序。
|
|
74
|
+
|
|
75
|
+
### 4. 确认安装成功
|
|
76
|
+
|
|
77
|
+
- 没有活跃任务和未读结果时,屏幕边缘出现机器人。
|
|
78
|
+
- 已有会话运行时出现蓝色计数;完成、失败或等待决定时显示对应状态。
|
|
79
|
+
- 点击会话能回到 DSH;出现问题时可以直接在 Notch 里选择回答。
|
|
80
|
+
|
|
81
|
+
可以用已有会话检查,不必为了测试新开一个模型任务。仅出现机器人还不能证明已经连接 Host;还要确认真实会话状态能同步。
|
|
82
|
+
|
|
83
|
+
## 使用
|
|
84
|
+
|
|
85
|
+
| 状态 / 操作 | 含义 |
|
|
86
|
+
| --- | --- |
|
|
87
|
+
| 蓝色数字 | 正在运行的会话数量 |
|
|
88
|
+
| 黄色感叹号 | 有待处理的问题或决定 |
|
|
89
|
+
| 绿色数字 | 未读的完成结果 |
|
|
90
|
+
| 红色数字 | 失败结果 |
|
|
91
|
+
| 点击问题选项 | 直接提交该选项;多选或多题按面板提示完成 |
|
|
92
|
+
| 点击问题标题 | 回到 DSH 查看完整上下文 |
|
|
93
|
+
| 全部结果读完 | 回到机器人待机 |
|
|
94
|
+
|
|
95
|
+
Notch 使用原生 AppKit / SwiftUI / Canvas 渲染。动画本身不调用模型。窗口随内容展开,达到屏幕高度上限后滚动;系统开启“减少动态效果”时呈现静态状态。
|
|
96
|
+
|
|
97
|
+
## 常见安装问题
|
|
98
|
+
|
|
99
|
+
| 现象 | 检查位置 |
|
|
100
|
+
| --- | --- |
|
|
101
|
+
| `plugin add` 成功,但没有 Notch | 第二步是否激活了 Host 插件,第三步是否启动了原生程序?两者都需要。 |
|
|
102
|
+
| 只有机器人,真实任务不出现 | Host 插件是否加载、`runtime.json` 是否生成、当前 Host 是否仍在运行? |
|
|
103
|
+
| 找不到 `dsh-notch` 模块 | 确认第一步和第二步使用同一个 `DSH_HOME` 与 `web` profile;本地源码目录不能删除或移动。 |
|
|
104
|
+
| `IDLE_RESOURCES` 少于 `10/10` | 重新构建;移动程序时同时携带资源 bundle。 |
|
|
105
|
+
| 屏幕上出现两个 Notch | 检查是否同时启动了手动版本和 App 壳管理的版本,只保留预期的那一份。 |
|
|
106
|
+
| 更新源码后仍是旧效果 | 重新构建,并更新实际运行的可执行文件;只 `git pull` 不会替换已启动的原生进程。 |
|
|
107
|
+
|
|
108
|
+
当前 Host 插件依赖 `sessions`、`webServer`、`approval`、`userQuestions`、`agents` 服务,面向同一台 Mac 上的 DSH Web Host。原生界面的会话跳转会唤起 bundle ID 为 `local.dsh.desktop` 的 DSH.app;其他 App 壳的前台唤起需要适配。多 Home、远程 Host 和各版本 DSH 的兼容性不能只凭安装成功判断。
|
|
109
|
+
|
|
110
|
+
## 更新与开发
|
|
111
|
+
|
|
112
|
+
更新已安装的源码后,重新构建原生程序。只改原生界面时,更新并重新启动 Notch 即可;若改了 `src/` 下的 Host 插件代码,还需要对应的服务端热加载。
|
|
113
|
+
|
|
114
|
+
使用 [dshx](https://github.com/aa2246740/dsh-external-plugin-devkit) 的维护者可先执行 `dshx activation-plan dsh-notch --change artifact` 或 `--change server`,按实际修改范围更新。安装文档中的首次配置属于 watched patch,不能用重启整个 Host 代替缺失的安装步骤。
|
|
115
|
+
|
|
116
|
+
开发检查:
|
|
117
|
+
|
|
118
|
+
```sh
|
|
119
|
+
npm ci
|
|
120
|
+
npm test
|
|
121
|
+
npm run test:outcome
|
|
122
|
+
npm run test:motion
|
|
123
|
+
npm run test:geometry
|
|
124
|
+
npm run test:scrollbar
|
|
125
|
+
npm run test:expanded-height
|
|
126
|
+
npm run test:idle
|
|
127
|
+
npm run build:macos
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### 录屏 Demo(可选)
|
|
131
|
+
|
|
132
|
+
用于开发、检查动画或录制演示视频,**不属于插件安装步骤**:
|
|
133
|
+
|
|
134
|
+
```sh
|
|
135
|
+
npm run build:demo
|
|
136
|
+
open "dist/DSH Notch Demo.app"
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Demo 提供 36 个中英双语场景,使用本地假任务,不连接 DSH。录屏控制与快捷键见 [Demo 文档](tools/recording/README.md)。
|
|
140
|
+
|
|
141
|
+
更多:[动效说明](macos/STATUS-MOTION.md) · [设计说明](DESIGN.md) · [0.3.0 更新记录](docs/releases/v0.3.0.md) · [可选 App 壳诊断](tools/desktop-shell/README.md)。
|
|
142
|
+
|
|
143
|
+
## 许可
|
|
144
|
+
|
|
145
|
+
[MIT](LICENSE)。机器人资源基于 [OpenBotMotion](https://github.com/aa2246740/open-bot-motion),保留了原始 [MIT 许可声明](tools/idle/LICENSE.open-bot-motion)。这是社区维护的 DSH 插件。
|
package/cordis.yml
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Native motion audit
|
|
2
|
+
|
|
3
|
+
This pass covers all 13 independent review cases using the production RootView, BoardModel, geometry, robot resources and status renderer. It does not use DSH models, network calls or real session actions. User acceptance and production installation remain separate from this self-review.
|
|
4
|
+
|
|
5
|
+
## Defects reproduced and fixed
|
|
6
|
+
|
|
7
|
+
- Returning success/failure strokes used a different phase from the running ring. A failing regression reproduced the endpoint mismatch; flights now share the running phase and matched endpoint speed.
|
|
8
|
+
- Blue-to-yellow incorrectly reversed the resume curve and erased its arc. It now closes the gap, changes color, fills the circle, then resolves the exclamation point, on its own 0.82-second timeline.
|
|
9
|
+
- Text switched between font line boxes and outlines across states. All status glyphs now use the same centered 19-point canvas. This also removes the odd/even child-frame mismatch. The exclamation point retains its separate optical correction.
|
|
10
|
+
- Cold snapshots incorrectly used the robot-birth acceleration despite displaying an existing task. They now start at normal speed.
|
|
11
|
+
- Removing the bottom result shrank the shell while leaving that disk outside the bottom edge. Its center now follows the shell bottom during the fade.
|
|
12
|
+
- The review heading counted playback runs rather than showing the selected case. It now displays the actual case number out of 13.
|
|
13
|
+
|
|
14
|
+
## Coverage
|
|
15
|
+
|
|
16
|
+
| Case | Examined behavior |
|
|
17
|
+
| --- | --- |
|
|
18
|
+
| 01 | Robot backflip, point handoff, concurrent number and blue stroke, rotation handoff |
|
|
19
|
+
| 02 | Success flight, source number alignment, returning blue arc phase |
|
|
20
|
+
| 03 | Failure flight and return to remaining running task |
|
|
21
|
+
| 04 | Last running task succeeds; result counts and shell shrink together |
|
|
22
|
+
| 05 | Last running task fails; result counts and shell shrink together |
|
|
23
|
+
| 06 | Clear red, then last green; cube arrival |
|
|
24
|
+
| 07 | Clear green, then last red; cube arrival |
|
|
25
|
+
| 08 | Robot to point, yellow ring, fill and exclamation |
|
|
26
|
+
| 09 | Forward closing arc, complete ring, yellow fill, symbol change |
|
|
27
|
+
| 10 | Yellow clears, top-origin blue drawing, deceleration to running speed |
|
|
28
|
+
| 11 | Decision cancellation to idle robot |
|
|
29
|
+
| 12 | Four status types; progressive clearing without bottom clipping |
|
|
30
|
+
| 13 | Approval to running; same resume motion as case 10 |
|
|
31
|
+
|
|
32
|
+
Each case was captured for 180 frames (2,340 full-component images per complete pass). Every case changed across its capture. Contact strips and transition boundaries were inspected. Cases 06, 07 and 12 were captured again after the bottom-edge fix.
|
|
33
|
+
|
|
34
|
+
Actual-size, 2x and 3x raster checks covered all four colors. The visible glyph bounding-box center matched the circle horizontally in all 12 samples. In case 02, measured horizontal glyph center remained 199.5 raster pixels across frames 20–44 while the shell grew and the count changed. These are measurements for the tested rendering setup, not a claim that fractional coordinates or antialiasing never occur on other displays.
|
|
35
|
+
|
|
36
|
+
IdleProbe covers glyph geometry, phase continuity, cold-start speed, closed-ring-before-fill, velocity handoffs, bottom containment, idle contour interpolation, blink timing, reversal and shared shell movement. MotionProbe covers route geometry, outcome queues, stale completion IDs and reduced motion.
|
|
37
|
+
|
|
38
|
+
## Reproduction
|
|
39
|
+
|
|
40
|
+
Run `sh tools/review/audit.sh /tmp/notch-review-frames` on macOS with the Swift toolchain. It builds an isolated local harness and captures all cases through NSHostingView. `NOTCH_AUDIT_CASES=6,7,12` selects a subset. The script does not install the helper or modify DSH sessions.
|
|
41
|
+
|
|
42
|
+
The interactive review remains `sh tools/review/build.sh`. Production installation is not part of these scripts.
|
|
43
|
+
|
|
44
|
+
## Follow-up: dissolve symbols and avoid clearing overlap
|
|
45
|
+
|
|
46
|
+
Cases 09 and 10 (including approval case 13) now cross-dissolve the centered numeral and exclamation outlines instead of folding their halves. Ring timing is unchanged.
|
|
47
|
+
|
|
48
|
+
Removed red, green and yellow disks now fade according to their distance from surviving neighbors. Opacity reaches zero by a 20-point center separation, before the 19-point disks and blue stroke can overlap. A sole result returning to the idle robot retains its existing handoff because there is no surviving neighbor. Cases 06, 07, 09, 10, 11, 12 and 13 are the targeted replay set for this change.
|
|
49
|
+
|
|
50
|
+
The targeted set completed 1,260 full-component captures. Transition strips were inspected, including the lower red disk becoming invisible before reaching the blue ring. Native IdleProbe passed the separation invariant and existing motion checks. The independent preview executable was rebuilt and byte-verified; production installation is still pending user acceptance.
|
|
51
|
+
|
|
52
|
+
## Idle tour and relaxed holds
|
|
53
|
+
|
|
54
|
+
Review case 14 plays the chameleon first, returns to light neutral, then visits all nine basic actions with four seconds of neutral blinking between actions. The regular scheduler now waits a random 3–5 seconds between basic actions; independent blink intervals also stay within 3–5 seconds. The sleep clip holds fully closed eyes for four seconds (1.7–5.7 seconds in its nine-second timeline). Rare chameleon scheduling remains 20–40 minutes in normal use.
|
|
55
|
+
|
|
56
|
+
The tour disables only automatic action selection, retaining the real director timer, blink overlay and pose blending. The existing 100 from/to action-pair tests (nine basics plus dance) passed, along with closed-eye duration assertions. Native chameleon entry/exit frames were inspected. Preview executable and updated sleep resource were byte-verified; production installation remains separate.
|
|
57
|
+
|
|
58
|
+
### 正式安装:随机待机节奏(2026-09-10)
|
|
59
|
+
|
|
60
|
+
- 基础动作之间随机待机 5–10 秒;变色龙每次随机表演 3–5 秒,维持原采样速度,在最后 450 ms 平滑回到浅色中性姿态。低频彩蛋触发间隔仍为 20–40 分钟。其他动作保持已验收版本。
|
|
61
|
+
- 原生 IdleProbe 全部通过(FAILURES=0),包含 100 种动作组合以及 100 次随机时长/中性收尾断言;正式 Release 构建成功,安装资源验证 10/10。
|
|
62
|
+
- 已替换本机 DSH.app 内的独立 helper 与资源;二进制 SHA-256 为 `dc5612a0c36133857f27892b8532151dadb5c71a1599cb407c3b472c004c2ba5`。旧二进制和资源已备份。演示进程关闭。
|
|
63
|
+
- 新 helper PID 35639,确认到原 Host 43127 的 TCP 连接;只读状态请求 HTTP 200 / ok=true。DSH App PID 57838、Host PID 57873 均未变化,原生截图确认 DSH 页面正常显示。本轮未调用模型。
|
|
64
|
+
- 原生 CUA 能检查 DSH.app,但无法选择无 app bundle 的独立 helper;因此本轮安装后机器人屏幕表现未通过 CUA 重新截图验收,动画证据为此前用户认可的演示与本轮原生渲染回归。
|
|
65
|
+
- 本机安装与回滚证据:`/Users/wu/Documents/ChatGPT/dsgx/notch-install-proof/installation.json`、`previous-production/`、`host-status.json`。
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Native contour and transition repair
|
|
2
|
+
|
|
3
|
+
The SVG projector may change its hull start vertex between frames. The former 64-point arclength export inherited this changing origin. Index-wise interpolation then connected unrelated contour locations: the stretch midpoint fell to 41.3% of the smaller endpoint area.
|
|
4
|
+
|
|
5
|
+
The exporter now intersects 192 fixed angular rays with a dense sampling of the original outline. Native sampling uses shape-preserving cubic Hermite interpolation; action handoffs carry the incoming geometry velocity and dissipate it over 60 ms before blending to the next clip. Authored clip durations remain unchanged.
|
|
6
|
+
|
|
7
|
+
The macOS 15+ panel uses NSAnimationContext with the same SwiftUI spring as the standalone preview (duration 0.4, bounce 0.08). macOS 14 retains a 400 ms smooth timer fallback. Top-right anchoring remains the target-frame invariant.
|
|
8
|
+
|
|
9
|
+
Validation: every adjacent clip midpoint retains at least 98% of the smaller endpoint area; 100 action handoffs preserve position and their incoming velocity; interruption/reversal and native Canvas render probes pass. Native screenshots around previously defective tilt, stretch and dance frames were inspected. The central preview was rebuilt and opened with matching resources. Production helper activation and live acceptance of the revised spring remain separate from these checks.
|
|
10
|
+
|
|
11
|
+
References: Apple WWDC23 Animate with springs, https://developer.apple.com/videos/play/wwdc2023/10158/ ; SwiftUI spring documentation, https://developer.apple.com/documentation/swiftui/animation/spring . Parameters above are project choices, not Apple-prescribed values.
|
|
12
|
+
|
|
13
|
+
## Shared status geometry and satellite handoff
|
|
14
|
+
|
|
15
|
+
Status disk positions and compact panel height now consume the same `OrbitLayout` sample. When the last running task finishes into an existing result, the red disk displacement equals the shell height change on every frame. Non-returning brush travel uses a monotone cubic schedule that reserves time for transport instead of rushing through the short connecting path. New result slots are drawn before the source slot is released. All-read snapshots cancel pending visual flights.
|
|
16
|
+
|
|
17
|
+
Natural blinking is independent of the nine full-body gestures, with 3.2–5.3 second intervals and a 90 ms close / 190 ms reopen. Sleep, explicit blinking and sneezing retain their authored eyelid timing. `satellite-out` and `satellite-in` resources derive from the original #7 timeline at 2.00–2.80 and 7.04–7.86 seconds. They preserve the fixed angular contour correspondence. Return coloration starts at the previous result color and becomes the light robot color during expansion.
|
|
18
|
+
|
|
19
|
+
Validation: native idle/continuity/layout probes and existing motion/queue/color/reduced-motion probes report zero failures. RootView frame strips cover the last-task three-to-two-light transition. Native satellite strips cover anticipation, shrink, expansion and settle. The independent native loop was rebuilt and opened with all 12 resource files verified. Production helper installation remains pending visual review of this preview.
|
|
20
|
+
|
|
21
|
+
## Review revision: faster transport, cube arrival, decision states
|
|
22
|
+
|
|
23
|
+
Result flights now take 0.95 seconds (previously 1.6); path phases and shared layout remain coupled. The outgoing robot contracts to the smaller handoff rim; the blue rim and number reveal while expanding to normal working size. Idle arrival samples original #5 cube from 2.22–3.27 seconds, including the rear-facing phase. Exports keep two invisible eye slots while the eyes are occluded.
|
|
24
|
+
|
|
25
|
+
Decision yellow is now part of OrbitLayout rather than an independently inserted VStack row. A sole running/decision exchange remains centered without changing shell height. Busy rows waiting for input are excluded from the running count. The independent review driver covers 13 named cases and clears mixed results one at a time before green/red cube arrival. It includes direct idle-to-decision, work-to-decision, resume, cancel, mixed lights and approval.
|
|
26
|
+
|
|
27
|
+
Run `sh tools/review/build.sh` for the native local-only review window. It never starts BoardModel polling and disables task interaction. The picker, replay, next and continuous-play controls were exercised through native CUA. Idle/shape/layout and existing motion/queue/color/reduced-motion probes pass. The central app bundle was replaced with 13 verified resources; production helper activation remains pending visual review.
|
|
28
|
+
|
|
29
|
+
## Tiny-point departure and reversible decision flap
|
|
30
|
+
|
|
31
|
+
Departure now has separate size and reveal channels over 900 ms: contraction reaches 6% scale at 68% of the timeline, colour transfers at that tiny point over the next 6%, and the status glyph grows only after 74%. The robot remains its sampled silhouette while shrinking, rather than morphing early into a large ring. Tests prohibit status reveal before the tiny-point threshold.
|
|
32
|
+
|
|
33
|
+
A sole blue/amber status now uses one reversible glyph: the blue arc closes and changes colour, the numeral and exclamation mark exchange through two hinged halves, and yellow fill follows. Reversal removes fill before the flap returns to the numeral. The flap is drawn within one clipped Canvas; native 3D view transforms were rejected after frame inspection exposed displaced glyph fragments. Frame strips verify no fragment outside the glyph and no flap background overlapping the ring.
|
|
34
|
+
|
|
35
|
+
The native continuity/layout and added departure/morph checks report zero failures. The central review app was replaced and cases 08–10 are available for user-visible review. Production activation remains separate.
|
|
36
|
+
|
|
37
|
+
## Continuous blue/amber refinement
|
|
38
|
+
|
|
39
|
+
The prior blue/amber transition froze the live rotation when busy became zero, then added a full turn from the morph amount; reversing that amount reversed the extra turn. DecisionSpin now integrates a continuous angular velocity over 620 ms: decelerating into amber and accelerating forward into blue. Retargeting captures the current phase and velocity. Subsequent result flights receive that actual phase too.
|
|
40
|
+
|
|
41
|
+
Morph channels now share the layout progress with overlap rather than stacking several separate eased windows. Fill grows spatially, and split-flap character halves reveal only their exposed regions, eliminating opaque flap backing. Native frame inspection, phase/velocity reversal checks and existing motion/queue/color/reduced-motion probes pass. Only the central preview was replaced; cases 09 and 10 remain available for visual acceptance.
|
|
42
|
+
|
|
43
|
+
### Decision disk to running brush
|
|
44
|
+
|
|
45
|
+
Yellow-to-blue now resolves the split-flap number first, then draws the blue arc from zero to its running length. The full-size yellow disk and its outline fade in proportion to brush growth, so the disk no longer shrinks into a small solid dot. The same continuous amount mapping is used in reverse, including interrupted transitions, without a direction-dependent geometry switch. Spin phase remains controlled by DecisionSpin.
|
|
46
|
+
|
|
47
|
+
Native IdleProbe passed (FAILURES=0), including symbol-before-brush ordering and complementary fill/stroke weights. The seven-frame rendered strip was inspected; the independent review app was rebuilt and its installed executable byte-verified. This is preview delivery; the production edge helper has not been replaced.
|
|
48
|
+
|
|
49
|
+
### Follow-up: one continuous annular shape and a visible backward roll
|
|
50
|
+
|
|
51
|
+
Supersedes the disk/brush crossfade above: DecisionMorph now opens a central aperture in the solid disk, reaches a complete thin ring, then separates the endpoints to form the running gap. Reverse playback closes the gap before filling the center. A single Canvas path carries the geometry and color; there are no overlapping differently colored disks. Canvas bounds include the stroke extent. Native IdleProbe passed (FAILURES=0), including the invariant that the gap cannot open before the center is fully cleared; rendered endpoints and intermediate frames were inspected.
|
|
52
|
+
|
|
53
|
+
The original #7 anticipation includes squash, stretch and a small roll, not a full backward revolution. The adapted satellite-out now adds a continuous full pitch revolution after anticipation; collapse is delayed so the back-facing phase remains visible. Exported frames 11–13 have hidden eyes while retaining a large body, followed by front-facing frames before the tiny-point handoff. The pinned exporter regenerated only satellite-out. Preview binary and resource were byte-verified after replacement. Production helper remains unchanged.
|
|
54
|
+
|
|
55
|
+
### Follow-up: point-to-pen continuity
|
|
56
|
+
|
|
57
|
+
Supersedes the aperture morph above. Yellow-to-blue flips the symbol while clearing yellow to black, then grows the blue stroke from the top; yellow fill and blue stroke do not overlap. Resetting phase is allowed only when the previous glyph is fully solid or absent, so visible interrupted strokes retain their phase. Spin acceleration starts after the pen has begun drawing.
|
|
58
|
+
|
|
59
|
+
Robot departure retains the same 666 ms shrink-and-color handoff, then uses the remaining portion of a 1.22 s sequence for StatusBirth: the tiny point travels from center to top, draws the stroke, and reveals the glyph. Yellow closes the ring before filling and revealing the exclamation point. Blue reveals its number after drawing the running arc. Both use the same Canvas glyph renderer as their settled state, avoiding a text-renderer swap.
|
|
60
|
+
|
|
61
|
+
IdleProbe and MotionProbe both passed (FAILURES=0). Native strips cover all three paths, including pen-at-rim before drawing, closed-ring before filling, and stroke-before-text invariants. Final preview binary was byte-verified; this remains an independent local preview with no model calls and no production-helper replacement.
|
|
62
|
+
|
|
63
|
+
### Velocity handoff refinement for cases 01 and 10
|
|
64
|
+
|
|
65
|
+
Blue birth now draws at constant speed through the end of the appearance, with number opacity driven by that same progress. On completion, rotation starts at the pen's exact angular velocity, then settles to the normal running speed during rotation. There is no completed-ring hold waiting for the number.
|
|
66
|
+
|
|
67
|
+
Solid-yellow resume uses a linear transition clock instead of nesting quintic curves. Its drawing distance is a quadratic whose velocity decreases monotonically to the normal running angular velocity. Rotation begins at that same velocity when drawing ends. Numerical endpoint derivatives verify both handoffs to within 0.0001 rad/s; IdleProbe and MotionProbe passed (FAILURES=0). Intermediate native blue-birth rendering was inspected and the replacement preview binary byte-verified. Production helper remains unchanged.
|
|
68
|
+
|
|
69
|
+
### Slower resume and ink-centered glyphs
|
|
70
|
+
|
|
71
|
+
Resume now lasts 0.98 s: 0.28 s clearing/flipping, followed by 0.70 s drawing. The drawing curve integrates a smoothstep velocity decrease, reaching both the normal angular velocity and zero acceleration at handoff. Initial pen speed is about half the preceding version. Other transition durations remain as before.
|
|
72
|
+
|
|
73
|
+
DecisionFlipGlyph now fills cached CoreText outlines, normalized around their actual ink bounds rather than a font line box. Both halves share the same centered outline; outlines are prepared on the main actor before Canvas rendering. Multi-digit outlines are fitted to the shared clipping width. Native IdleProbe passed, including centered ink bounds for !, 1, 3, 8, 12, 99 and 100 and terminal angular velocity. The rendered yellow endpoint was inspected, build passed and preview executable byte-verified. Production helper remains unchanged.
|
|
74
|
+
|
|
75
|
+
### Exclamation-point optical alignment
|
|
76
|
+
|
|
77
|
+
The exclamation point now receives an optical correction based on filled outline area: the heavy upper stem previously put its visible mass above the center even though its bounds were centered. Numeric outlines are unchanged. The separate mixed-status yellow branch now uses this same glyph renderer instead of Text. Native IdleProbe passed; antialias-weighted rendered vertical centroid error was approximately 0.055 native points. Preview binary was rebuilt and byte-verified; production helper unchanged.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# 0.3.0 — Decisions in motion
|
|
2
|
+
|
|
3
|
+
Running tasks now travel into yellow decisions with the same brush motion used for green success and red failure. Answered decisions return to the running orbit, preserving task counts for both one-task and concurrent-task cases. Fast replies wait for the outgoing stroke; cancelled requests cannot reopen an old question.
|
|
4
|
+
|
|
5
|
+
The recording demo contains 36 scenes with Chinese and English state titles. It builds directly from the production Swift animation sources, uses a local transport stub, and never connects to DSH or calls a model. Grid, single-scene, replay and fullscreen controls are documented in `tools/recording/README.md`.
|
|
6
|
+
|
|
7
|
+
This release also includes the current Markdown question rendering and robot alignment refinements, repairs capped long-question scrolling, and includes the previously ignored source needed by the legacy `--demo` build.
|
|
8
|
+
|
|
9
|
+
Validation on macOS:
|
|
10
|
+
|
|
11
|
+
- 15 Host/state unit tests passed.
|
|
12
|
+
- Outcome, motion, geometry and idle native probes: `FAILURES=0`.
|
|
13
|
+
- Native helper and standalone recording demo release builds passed.
|
|
14
|
+
- Packaged helper resources: `IDLE_RESOURCES=10/10`.
|
|
15
|
+
- Bilingual six-scene recording layout inspected in the native app.
|
|
16
|
+
- Installed helper matched the release build by SHA-256. DSH and Host stayed running; the authenticated live status endpoint returned 200 and retained its pending question.
|
|
17
|
+
|
|
18
|
+
The pending real question was not answered during release validation. These results do not certify every DSH version, third-party shell, display arrangement, or end-to-end approval action. Optional desktop white-screen diagnostics are separate from this animation release.
|
|
19
|
+
|
|
20
|
+
MIT licensed, with the original OpenBotMotion attribution retained.
|
package/dshx.yml
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
id: dsh-notch
|
|
2
|
+
entry: src/dsh-notch.ts
|
|
3
|
+
marker: "[my-plugins/dsh-notch] loaded"
|
|
4
|
+
kind: function
|
|
5
|
+
profile: web
|
|
6
|
+
hotReload:
|
|
7
|
+
artifacts:
|
|
8
|
+
- src/dsh-notch.ts
|
|
9
|
+
- src/board.ts
|
|
10
|
+
- src/http.ts
|
|
11
|
+
- src/store.ts
|
|
12
|
+
- src/session-state.ts
|
|
13
|
+
- src/types.ts
|
|
14
|
+
- src/browse-sync.ts
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// swift-tools-version: 6.0
|
|
2
|
+
import PackageDescription
|
|
3
|
+
|
|
4
|
+
let package = Package(
|
|
5
|
+
name: "DshNotch",
|
|
6
|
+
platforms: [.macOS(.v14)],
|
|
7
|
+
products: [
|
|
8
|
+
.executable(name: "dsh-notch", targets: ["DshNotch"]),
|
|
9
|
+
],
|
|
10
|
+
targets: [
|
|
11
|
+
.executableTarget(
|
|
12
|
+
name: "DshNotch",
|
|
13
|
+
path: "Sources",
|
|
14
|
+
resources: [.copy("Resources/Idle")]
|
|
15
|
+
),
|
|
16
|
+
]
|
|
17
|
+
)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Notch status motion
|
|
2
|
+
|
|
3
|
+
Request: the existing rotating blue stroke moves continuously up into a green completion count, or down into a red failure count. It returns to the blue running count only if work remains. A fluid crossing curve takes precedence over a literal figure eight. Native SwiftUI helper; same black edge-attached shell, colors and rounded system numerals; no model calls for acceptance.
|
|
4
|
+
|
|
5
|
+
Motion purpose: continuity between running and outcome. Single local stroke, 0.95 seconds; counts stay readable, clicks remain available. Success above running, failure below. No pop, ripple or separate flying droplet. Initial history must not replay completion. New events are queued/coalesced by outcome; no overlapping flights. Reduced Motion skips travel and displays current counts immediately. Last task finishes at its destination instead of inventing a running task.
|
|
6
|
+
|
|
7
|
+
| Active reference | Decision | Artifact | Verification |
|
|
8
|
+
| --- | --- | --- | --- |
|
|
9
|
+
| motion-language | one migrating stroke, directional status semantics; static counts survive | StatusOrbitView | sampled native frames and guided live simulation |
|
|
10
|
+
| motion-contract | explicit start/end, queued events, reduced motion | StatusFlight and OrbitMotionFrame | phase/path checks; repeated-event and final-task checks |
|
|
11
|
+
|
|
12
|
+
Taste: preserve compact black shell, one thin status stroke and rounded numeric type. The memorable element is continuous status transfer, not decoration. Geometry stays inside shell bounds. Native rendering replaces browser motion validation because this is AppKit/SwiftUI.
|
|
13
|
+
|
|
14
|
+
Acceptance: inspect success and failure separately with the user; animation builds/tests alone do not establish naturalness. Existing hover and screen-height regressions must remain passing.
|
|
15
|
+
|
|
16
|
+
## Final brush implementation and Apple references
|
|
17
|
+
|
|
18
|
+
User correction: the moving object is a short painted stroke with a moving head and trailing tail, not a translated ring. Success/failure settle as stationary solid disks. The route begins on the current rotating arc, follows its circle to a tangent exit, draws towards the outcome, traces its boundary, fills it, then rejoins the source arc if the flight started with work remaining. Counts have fixed spatial slots. A single monotonic arc-length timeline avoids velocity resets at path-segment boundaries. RGB interpolation stays continuous. The solid disks and numeral backgrounds occlude a returning trail so it cannot paint through numbers.
|
|
19
|
+
|
|
20
|
+
The upward-success/downward-failure mapping and brush metaphor are this product's choices, not an Apple-provided animation. They apply Apple's guidance on purposeful, brief, consistent feedback and preserving user control:
|
|
21
|
+
- https://developer.apple.com/design/human-interface-guidelines/motion
|
|
22
|
+
- https://developer.apple.com/design/human-interface-guidelines/feedback
|
|
23
|
+
- https://developer.apple.com/design/human-interface-guidelines/accessibility
|
|
24
|
+
|
|
25
|
+
Motion never blocks click routing. An animation's return decision is fixed at its start so subsequent results cannot teleport its head; subsequent outcomes are queued. Reduced Motion renders the final disks/counts and a static running arc. No DSH model calls occur in the acceptance harness.
|
|
26
|
+
|
|
27
|
+
## Return colour and compact layout correction
|
|
28
|
+
|
|
29
|
+
The visible return trail uses a spatial result-to-blue gradient: the portion nearest the solid disk retains its result colour until it emerges, then blends into blue at the source rim. This prevents a hidden head from recolouring the entire visible tail too early. Compact height uses actual visible lamps: 44/72/100 points for one/two/three lamps, with the native panel geometry transition. Empty outcome slots are not reserved. Rendered corridor pixels and actual window heights are verified in this revision.
|
|
30
|
+
|
|
31
|
+
## Idle robot (0.2.0)
|
|
32
|
+
|
|
33
|
+
Native vector frames sampled from OpenBotMotion plus nine original local pose timelines. Canvas interpolates 30 fps samples at display cadence. No browser process or model invocation. Neutral pose separates actions. Rare dance uses original speed; first/last geometry and colors blend back to neutral.
|
|
34
|
+
|
|
35
|
+
Task arrival freezes current pose and contracts it into the running ring over 300 ms. Clearing all results expands a central dot into the robot over 400 ms, eyes appearing last. Reversal retains current progress and geometry, and resumes the interrupted idle clip rather than snapping to neutral. Timer generations reject stale callbacks.
|
|
36
|
+
|
|
37
|
+
Checks: 10 resources present, all vector frames inside native drawing bounds, immediate idle cancellation, reverse continuity, and existing native motion/geometry probes. Native helper installed separately from the unchanged Host.
|
|
38
|
+
|
|
39
|
+
## 审核共享笔画(0.3.0)
|
|
40
|
+
|
|
41
|
+
运行任务进入审核时新增 decision 笔画,沿当前蓝弧切线向上、途中变黄,描出目标圆后填充黄色并显示感叹号。只剩这个任务时收掉源槽;仍有任务时笔画回到蓝弧并更新运行数。审核、成功、失败共用 0.95 秒时序。审核自动展开等待笔画结束;问题已取消时不会由旧回调展开。
|
|
42
|
+
|
|
43
|
+
最后一个任务的蓝色数字和黑色遮罩随笔画离开源头淡出,避免结果圈靠近时出现蓝字重影或黑块遮挡。`sh macos/Tests/outcome.sh` 覆盖三种结果的单/双任务场景、重复事件、取消与排队;三个既有原生脚本已补齐 Markdown 编译依赖。
|
|
44
|
+
|
|
45
|
+
### 决策回复回程(0.3.0)
|
|
46
|
+
|
|
47
|
+
`DecisionReturn` 独立持有回复的 presentation clock,`BoardModel` 从同一行的 needsAction → busy 边沿启动它。单任务保留 `DecisionMorph` 的原位画环;有剩余工作时使用 `OrbitBrushRoute` 已有返回段,从黄圈抽出笔画接回蓝环。数字在笔画进入目标圆周后渐变;最终笔尖角速度匹配持续旋转速度。黄填充清空后才同步收槽,避免两颗实心灯叠在一起。
|
|
48
|
+
|
|
49
|
+
快速回复会排在黄色去程后,重复快照不重启,旧回调按 UUID 拒绝。面板正在折叠时,回程时钟等 0.4 秒再开始;取消且未恢复该任务不会把其他工作计数加一。此处演示和测试均使用本地快照,不调用 DSH 模型。正式 helper 与离线演示使用相同状态动画源码。
|