dsh-claude-style 0.13.3 → 0.14.0
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/CHANGELOG.md +202 -0
- package/LICENSE +0 -5
- package/README.en.md +1 -1
- package/README.md +2 -2
- package/THIRD_PARTY_NOTICES.md +282 -6
- package/docs/FEATURES.en.md +12 -14
- package/docs/FEATURES.md +13 -15
- package/docs/SETTINGS.en.md +19 -12
- package/docs/SETTINGS.md +19 -12
- package/docs/STYLE.md +151 -12
- package/lib/assets/3b91bf51db72.js.br +0 -0
- package/lib/assets/4ec527e58330.js.br +0 -0
- package/lib/assets/7323c8c86470.js.br +0 -0
- package/lib/assets/755d09170f37.js.br +0 -0
- package/lib/assets/92f87e9d3a60.js.br +0 -0
- package/lib/assets/c02a70a798bc.js.br +0 -0
- package/lib/assets/d8df7a57fbe3.js.br +0 -0
- package/lib/assets/manifest.json +28 -28
- package/lib/client.js +11 -8
- package/lib/host/peakrate.js +7 -0
- package/lib/host/routes.js +13 -15
- package/lib/host/search.js +8 -1
- package/lib/host/settings.js +2 -0
- package/lib/model-descriptions.json +118 -50
- package/package.json +12 -4
- package/docs/decisions/D11-private-routes.md +0 -26
- package/docs/decisions/D12-fail-fast.md +0 -38
- package/docs/decisions/D14-account-surface.md +0 -26
- package/docs/decisions/D15-hdsl-contract.md +0 -24
- package/docs/decisions/D16-popover-baseline.md +0 -23
- package/docs/decisions/D17-permission-presets.md +0 -26
- package/docs/decisions/D19-host-contracts.md +0 -27
- package/docs/decisions/D20-sliding-pill.md +0 -26
- package/docs/decisions/D21-archived-list.md +0 -24
- package/docs/decisions/D22-search-panel.md +0 -30
- package/docs/decisions/D24-mascot.md +0 -32
- package/docs/decisions/D25-ban-screen-titlebar.md +0 -24
- package/docs/decisions/D26-motion-preference.md +0 -23
- package/docs/decisions/D27-context-stats.md +0 -35
- package/docs/decisions/D28-desktop-band.md +0 -23
- package/docs/decisions/D29-feature-switches.md +0 -24
- package/docs/decisions/D3-host-selectors.md +0 -28
- package/docs/decisions/D30-palette-and-typeface.md +0 -25
- package/docs/decisions/D31-windows-titlebar.md +0 -24
- package/docs/decisions/D32-chat-interactions.md +0 -33
- package/docs/decisions/D33-stylesheet-ownership.md +0 -26
- package/docs/decisions/D34-turn-navigator.md +0 -29
- package/docs/decisions/D35-selection-scope.md +0 -23
- package/docs/decisions/D36-modules-and-bundling.md +0 -35
- package/docs/decisions/D38-assets.md +0 -28
- package/docs/decisions/D39-on-demand-loading.md +0 -33
- package/docs/decisions/D4-composer-gate.md +0 -22
- package/docs/decisions/D40-observation-bus.md +0 -36
- package/docs/decisions/D41-scroll-owner.md +0 -40
- package/docs/decisions/D42-feature-manifest.md +0 -28
- package/docs/decisions/D43-overlay-and-upstream.md +0 -27
- package/docs/decisions/D44-contract-module.md +0 -36
- package/docs/decisions/D45-testing.md +0 -30
- package/docs/decisions/D46-monorepo.md +0 -31
- package/docs/decisions/D47-build-output.md +0 -30
- package/docs/decisions/D48-documentation.md +0 -28
- package/docs/decisions/D49-visual-yield.md +0 -30
- package/docs/decisions/D5-model-copy.md +0 -29
- package/docs/decisions/D50-brand.md +0 -24
- package/docs/decisions/D51-css-toolchain.md +0 -34
- package/docs/decisions/D52-header-band.md +0 -31
- package/docs/decisions/D53-usage-merge.md +0 -33
- package/docs/decisions/D54-peakrate-meter.md +0 -33
- package/docs/decisions/D58-redraw-retired.md +0 -29
- package/docs/decisions/D60-settings-transport.md +0 -31
- package/docs/decisions/D61-wallpaper-under-one-mask.md +0 -28
- package/docs/decisions/D62-file-row-merge.md +0 -28
- package/docs/decisions/D63-turn-status-retired.md +0 -29
- package/docs/decisions/D64-custom-brand.md +0 -29
- package/docs/decisions/D7-one-package.md +0 -23
- package/docs/decisions/D9-style-performance.md +0 -25
- package/docs/decisions/README.md +0 -87
- package/lib/assets/2c01384360ac.js.map.br +0 -0
- package/lib/assets/31253ed42440.js.br +0 -0
- package/lib/assets/5063c46824b6.js.br +0 -0
- package/lib/assets/55a6154f87b5.js.map.br +0 -0
- package/lib/assets/5e05b29d5005.js.br +0 -0
- package/lib/assets/668d06ca781b.js.map.br +0 -0
- package/lib/assets/84b3319c06fb.js.br +0 -0
- package/lib/assets/91558108acf4.js.map.br +0 -0
- package/lib/assets/930546669455.js.map.br +0 -0
- package/lib/assets/968fcbfc3e22.js.br +0 -0
- package/lib/assets/ac9b0e625837.js.map.br +0 -0
- package/lib/assets/ad2905345a69.js.br +0 -0
- package/lib/assets/c52e41b4842b.js.map.br +0 -0
- package/lib/assets/e1291f79b7c9.js.br +0 -0
- package/lib/client.js.map +0 -7
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,208 @@ All notable changes to `dsh-claude-style` are documented here, newest first.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
[中文](#cn-unreleased) | [English](#en-unreleased)
|
|
8
|
+
|
|
9
|
+
<h3 id="cn-unreleased">体验优化</h3>
|
|
10
|
+
|
|
11
|
+
- `npm run verify` 不带参数时跑的就是推送前那一档:云端快档那批检查、构建、单元测试与冒烟的快档,端到端通道留到 `--e2e`、`--scenario` 或 `--full` 时跑,冒烟的完整走表由 `--case`、`--feature` 或 `--full` 点名;同一台机器上,一次本机判定的平均耗时从记录里的 413 秒降到快档的 29 秒。
|
|
12
|
+
- `npm run verify` 在走整份冒烟与端到端通道那一档之前打印一句「请确认你正处于发布流程。」:这一档就是云端的发布闸门,起跑前先让发起的人确认自己在发布流程里。
|
|
13
|
+
|
|
14
|
+
### 问题修复
|
|
15
|
+
|
|
16
|
+
- `npm run session` 拆除会话工作树前先删掉它的 `node_modules` 联接:`git worktree remove` 把这个联接当目录走进去,再顺着主树 `node_modules` 里的工作区联接删掉主树 `packages/*` 的文件;现在先删联接再拆树,树里另有指向自己的链接时拒绝拆除并列出它们。
|
|
17
|
+
- 手机远程访问(`@linxin666/dsh-remote-web-ui` 的竖屏适配)下,输入区底行不再错位:发送与停止按钮回到输入行内并完整落在卡片里;档位选择器与上下文圆环之间只隔 16px,和桌面一致;模型名称在行内还有空间时完整显示,只有真的放不下才以省略号收尾。上下文圆环的预留宽度变化时(流式输出期间也会发生),档位选择器当帧就跟着重新定位,不再停在旧位置。
|
|
18
|
+
|
|
19
|
+
### 其他变更
|
|
20
|
+
|
|
21
|
+
- `node scripts/changelog.mjs --release <版本>` 在汇编版本一节之前核对 `session/` 分支:有未合并的会话分支时列出它们并终止发版。
|
|
22
|
+
- 文档里带单位的数值不再进闸门:`scripts/doc-numbers.mjs` 留着按需运行(`npm run docs:numbers`),lint 不再核对它,`docs/STYLE.md` 里与样式表逐字对应的几何与时长因此不再让推送失败。
|
|
23
|
+
- `npm run verify` 先跑云端快档那批检查(lint、特性清单、决策索引、变更记录、AGENTS 表),推送前的一次运行与云端判定同一批内容。
|
|
24
|
+
- 端到端通道不带 `--scenario` 时走 `packages/contracts/src/timing.ts` 那张表里除停放的两个统计场景之外的全部条目,新加入表的场景默认进入云端判定,停放名单与场景表对不上时运行直接终止。
|
|
25
|
+
- 发版工作流在把这一版转正之前跑完快档那批检查、Windows 上的完整冒烟与端到端通道,与 pull request 判定的内容一致。
|
|
26
|
+
- 一次运行期间 `npm run dev` 的重建换掉了构建产物时,这次运行不写结论并判定为不通过,结论只对它真正跑过的那份产物成立。
|
|
27
|
+
|
|
28
|
+
<h3 id="en-unreleased">Improvements</h3>
|
|
29
|
+
|
|
30
|
+
- A bare `npm run verify` walks the tier the stretch before a push needs — the cloud's fast-tier checks, the build, the unit tests and the smoke's quick tier — and takes the end-to-end lane only when `--e2e`, `--scenario` or `--full` names it, with the smoke's full walk named by `--case`, `--feature` or `--full`; on this machine a local verdict averages 29 s where the recorded bare runs averaged 413 s.
|
|
31
|
+
- `npm run verify` prints 请确认你正处于发布流程。 before a request that walks the whole smoke and the end-to-end lane's default table, so whoever starts the release gate's minutes confirms the release process is what they are in.
|
|
32
|
+
|
|
33
|
+
### Bug Fixes
|
|
34
|
+
|
|
35
|
+
- `npm run session` drops a session tree's `node_modules` junction before it removes the tree: `git worktree remove` walked into that junction and, through the workspace junctions in the main tree's `node_modules`, deleted the main tree's own `packages/*` files. The junction goes first now, and a tree holding any other link out of itself is listed and kept.
|
|
36
|
+
- On a phone via the mobile remote plugin (`@linxin666/dsh-remote-web-ui`, portrait adaptation) the composer's bottom line no longer slips out of place: the send and stop buttons sit back on the input's own line and inside the card, the tier trigger stands 16px from the context ring as it does on a desktop, and the model name is shown whole whenever the row has room for it, ending in an ellipsis only when it does not. When the room the context ring reserves changes — which also happens while an answer streams — the tier trigger is placed again in that same frame instead of holding its old position.
|
|
37
|
+
|
|
38
|
+
### Chores
|
|
39
|
+
|
|
40
|
+
- `node scripts/changelog.mjs --release <version>` checks the `session/` branches before it assembles the version's section: an unmerged session branch is listed and stops the release.
|
|
41
|
+
- A number with a unit in a document is no longer a gate: `scripts/doc-numbers.mjs` stays for running on demand (`npm run docs:numbers`), and lint no longer checks it, so the geometry and timing in `docs/STYLE.md` that mirror the stylesheets no longer fail a push.
|
|
42
|
+
- `npm run verify` starts with the checks the cloud's fast tier runs (lint, the feature list, the decisions index, the changelog and the AGENTS table), so the run before a push judges the same set.
|
|
43
|
+
- The end-to-end lane without `--scenario` walks every entry of the table in `packages/contracts/src/timing.ts` but the two parked statistics scenarios, so a scenario added to the table is judged in the cloud by default, and a parked name the table does not hold stops the run.
|
|
44
|
+
- The release workflow runs the fast tier's checks, the full smoke on Windows and the end-to-end lane before it promotes a version, the same set a pull request is judged on.
|
|
45
|
+
- A run whose build output a rebuild behind `npm run dev` swapped files no verdict and reads as failed, so a recorded verdict belongs to the output that run actually drove.
|
|
46
|
+
|
|
47
|
+
## [0.14.0] - 2026-10-14
|
|
48
|
+
|
|
49
|
+
[中文](#cn-0.14.0) | [English](#en-0.14.0)
|
|
50
|
+
|
|
51
|
+
<h3 id="cn-0.14.0">新增功能</h3>
|
|
52
|
+
|
|
53
|
+
- 「侧栏」页多出「封号彩蛋」一行,选「关闭」后账号行只显示名字,设置项 `banLocale` 多了取值 `off`。
|
|
54
|
+
- 和 [ds-bot](https://github.com/Fei2411/DeepSeek-Bot) 同时安装时,侧栏顶端多出一个聊天 / 代码切换:聊天是 ds-bot 的 Bot 界面、本主题整个让开,代码是宿主自己的界面、由本主题绘制;没装 ds-bot 时页面上没有它。
|
|
55
|
+
- 「对话」页新增「状态行描述」(设置项 `statusDetail`,取值 `precise`(默认)与 `simple`),「精确」让命令调用说出模型为自己写下的描述。
|
|
56
|
+
- 运行行现在说出具体的文件名(超过 32 字截断),推理里出现英文进行时从句时写出模型自己那句话。
|
|
57
|
+
- 设置页多出「动效」分页,其中「状态行动画」用两张实时预览的卡片代替文字,一档是现在这道扫光,另一档让状态行的文字本身流动着变色;设置项 `statusMotion` 的取值为 `sweep`(默认)与 `wash`。
|
|
58
|
+
|
|
59
|
+
### 体验优化
|
|
60
|
+
|
|
61
|
+
- 同一个文件在同一个过程组里的多次读取、编辑与写入读成一行:图标与标题跟着最后一次操作换新,行尾的 `+n -m` 是这些改动的累计值并随每次改动逐位翻页,展开读到全部改动;只被读取过的文件展开读到这次读取的窗口。
|
|
62
|
+
- 设置页过长的描述统一改写为简洁风格:一句说清这项设置管什么、各档位做什么,中英两版同步。
|
|
63
|
+
- 每帧那一趟刷新不再为已知的宿主节点重新查询整份文档:输入卡片与它的占位、运行行、思考行、标题行、对话框、页脚、会话根、模型槽与上下文表盘都从观察总线按选择器登记的活清单里读,宿主换掉节点时才重解一次。会话越长,每帧的查询开销越不再跟着页面规模走。
|
|
64
|
+
- 状态行换词时说法盒子的宽度是一次移动:盒子先按住当前宽度再写上目标宽度,由滑动高亮那一对时长与曲线(约 0.24 秒)带过去,旁边的计时随盒子滑到新位置。
|
|
65
|
+
- 运行行的换词按 transitions.dev 的「Thinking states」合成:离场与入场同时进行,扫光带全程亮着而不从头再扫,行由一个隐藏测量层按住宽度与高度,换词期间旁边的计时不会被挤动,新词从下方升入也不会让整行变高。
|
|
66
|
+
- 只落在对话消息列里的变更批次(流式输出就是这种)只叫醒读消息列的功能,页头、视图标签、侧边栏页脚、模型与档位选择器不再跟着跑一趟;任何读到整页的信号(语言、偏好、时钟、功能自己排的一帧)照旧触发完整一趟。
|
|
67
|
+
- 只在另一项打开时才起作用的设置行现在随父项一起变灰、不能操作(重绘模型选择器与重绘权限控件随「重绘对话框」,对话统计信息位置随重绘覆盖对话页,封号彩蛋随「折叠侧栏设置区」),变灰的行仍显示你设的值,说明下面用强调色写明它在等哪一项。
|
|
68
|
+
- 滚动与窗口尺寸变化重新定位浮层时,一帧只派发一次(原来是每个滚动事件一次);关闭着的模型卡与档位卡不再读宿主触发器的盒子,上下文数字行的合身测量只在输入卡片宽度变化时重做。
|
|
69
|
+
- 「标题进入顶栏」放进设置页的「对话」页,只在 Windows 桌面端的窗口里可改,在别的页面变灰、仍显示你设的值,并在下面注明它只在哪个窗口生效;「动画效果」从「通用」挪到「动效」,「首页版面」挪到「外观」,「封号彩蛋」挪到「侧栏」并挂在打开它的账号弹层那一行下面,「搜索框样式」与「对话统计信息位置」的说明写出每个选项的效果。
|
|
70
|
+
- 「光标动画」从三档简化为开与关,从「对话」页挪到「动效」页,两档各用一张预览卡呈现:开的那张光标在样例行上来回滑动,关的那张停在行首闪烁;早先存下的「只在移动时」读作开。已经用预览卡呈现选项的行(状态行动画、光标动画)不再带文字说明。
|
|
71
|
+
- 皮肤里所有动效的时长、曲线、位移与模糊改由 `packages/client/src/theme/tokens.json` 的 `motion` 一组统一给出,同一作用的数值合成一档,`docs/STYLE.md` 的动效表由同一份数据生成,构建拒绝样式表里直接写出的时长与曲线、内容重复的关键帧,以及没有读者认领的动效令牌。
|
|
72
|
+
- 流式回答里新文字的淡入改按文本节点增量比较:一条回答里追加字符时不再把整条回答重拼成字符串、也不再逐字符重比,成本随本批新增的字符走;markdown 中途改写标记的那一段仍按原来的窗口判定,超过预算或刚被折叠重排过就保持本色。
|
|
73
|
+
- 状态行与过程组头部同读宿主 `TextShimmer` 的一档:1.5 秒一趟、`steps(48, end)`、每趟最后三分之一歇停,状态行的色带改用宿主的扫光色与 20% 带宽。
|
|
74
|
+
- 长会话里跟着会话长度增长的三处记账收敛:进程组表头的摘要共用一条尺寸订阅(原来一组一条),思考行的清单由变更批次增量登记(滚动不再扫整份文档),进程组跟随不再有常驻的定时器——页面上没有进程组时就没有任何定时查询。
|
|
75
|
+
- 宿主账户行被宿主换掉时,旧行上的四个监听与这一代登记的记录一起收走,不再留到整代拆除;账户菜单的绑定保持一次只有一张卡。
|
|
76
|
+
- 模型、推理等级、权限、账号几张弹层卡片与新会话页的菜单从各自按钮所在的一角、由略小的尺寸长出来(约 0.25 秒,不再上移),收起时更快(约 0.12 秒)。
|
|
77
|
+
- 封号彩蛋整页打开时从中心略小处放大淡入(约 0.25 秒),按页上的按钮或 Esc 关掉时缩回去淡出(约 0.12 秒)再离开页面。
|
|
78
|
+
- 设置页的开关按下后圆钮越过终点再弹回(约 0.35 秒),只有按过的开关这样动,打开设置页或换回某个分页时各个开关都静止在原位。
|
|
79
|
+
- 设置页切分页时新的一页从它在分页条上所在的一侧滑入并穿过一点模糊,被换下的那一页朝另一侧滑出(约 0.25 秒),滑出的那张静止副本读屏与 Tab 键都碰不到。
|
|
80
|
+
- 首页打开时品牌标志先升起、问候语晚一拍跟上,两者都从下方 12 像素处穿过一点模糊落到原位(约 0.5 秒)。
|
|
81
|
+
- 设置页在极窄宽度下保持可读:一行放不下全部分页时分页条换到第二行,每个分页标签始终完整显示在一行上;一行的文字空间不足时,开关、分段选择器等控件移到文字下方独占一行,说明文字保持整行排版。
|
|
82
|
+
- 上下文占用的色带移到四成到八成,并改用一组低饱和度的色标:占用四成以下保持绿色,四成到八成之间依次经过浅绿、黄与橙,八成起为红色。
|
|
83
|
+
- 工作室首页的用量面板:占位的底色淡去、数字从模糊里显出来,热力图的格子渐变到各自的颜色,模型列表与图表整体淡入(约 0.3 秒)。
|
|
84
|
+
- 等待行的「暂未响应」徽标从左下方滑上这一行,同时从无到有弹出来(约 0.5 秒),模型一开口就缩回消失(约 0.12 秒)。
|
|
85
|
+
- Claude 品牌下,轮次进行中那一行开头是主题自己的三枚 4px 加载点(各弹起 8 像素并在离地时压扁,半秒一次,错开周期依次起跳);DeepSeek 品牌下宿主的鲸鱼尾照旧,读屏播报也不变。
|
|
86
|
+
- 「外观」页的「主色」改名「强调色」并挪到「配色」下方,配色选「跟随宿主」时它变灰、不能操作。
|
|
87
|
+
- 工作台首页的权限控件此前和经典首页一样是一排 Read / Edit / Auto / Yolo 分段按钮,与它那身对话式的单行输入卡片并不相称;现在工作台首页与对话页一致:输入区里是一枚写着当前档位的按钮,点开是一张档位卡片,滑块式分段只留在经典首页。工作台首页还没选工作区时,按钮停在新会话的默认档位上、不接收点击,点它和点输入框一样打开工作区选择。
|
|
88
|
+
- 中文界面下内置 Auto review 档位此前显示英文名,因为宿主的档位文案表里这一条两种语言都是英文;现在它读「自动审查」,其它档位仍读宿主自己的中文名,界面语言不是中文时照旧读 Auto review。
|
|
89
|
+
- 轮次进行中那一行等待时只说品牌自己的那一个词:Claude 品牌下是皮肤自己的「正在思考」,DeepSeek 品牌下是宿主自己的「深度求索中」;模型思考与读不出状态两种情形共用这一个词,读不出状态不再换一次说法。
|
|
90
|
+
- 「动效」页两张状态行动画卡片里的预览说法改为这一行真正会用的两个:当前品牌的等待词与「正在调用工具」;换词动作与两档画法照旧。
|
|
91
|
+
|
|
92
|
+
### 问题修复
|
|
93
|
+
|
|
94
|
+
- 推理等级滑杆的方向在档位未按强度下发的模型上不再反向:宿主把 `reasoning.efforts` 记为从弱到强,而 Qoder 的 Qwen3.8-Max 发来「极高、低、中、关闭思考」、Raccoon 与 MiniMax 发来「高、关闭思考」,滑杆照下发顺序画,最右端便落在最弱的档位上——这些模型上停止思考被读成了最强。现在能判定强度的档位按强度排列,判不出强度的档位留在供应商给出的位置。
|
|
95
|
+
- 修复 Firefox 下鼠标停留在上下文用量圆环时统计弹层反复闪烁的问题:返回入口会取消待执行的关闭任务,鼠标仍在入口上时弹层保持展开。
|
|
96
|
+
- 思考行自动收起与读者的点开收起在两种宿主结构上都找得到展开体,因此都逐帧滚动;新增的展开体淡入并上移两个像素进入。
|
|
97
|
+
- 开着「悬停自动展开弹层」时,悬停态下按同一个入口不再收起刚展开的弹层(侧栏账号入口、权限选择器、模型选择器、档位选择器、首页那一行的两个选择器与输入框右侧的上下文圆环),收起交给鼠标离开入口与卡片。
|
|
98
|
+
- 「状态行描述」在中文界面补回中文的标题、描述与两个档位名:这一行的文案没有进文案文档,中文界面一直读英文兜底。
|
|
99
|
+
- 同一运行行中有可见替代文字且宿主文案被外部隐藏时,主题等待行自动让位,接管结束后恢复,其他聊天动效继续运行。
|
|
100
|
+
- 钉住的位置比末尾所有可能的停靠位置都高,跟随末尾期间输入框上方那一行每一帧都停在同一处,推理一段段到达也不再上下抖动。
|
|
101
|
+
- 功能被关掉或整代被换下之后,它留下的挂在宿主节点上的监听、观察总线订阅、排队帧与定时器一并收走:宿主账户菜单每次打开不再留住上一张已经卸载的卡片,会话数字的圆环与弹层不再累积旧的挂载代,输入卡片选择器关掉时不再把 mousemove 留在文档上,模型档位滑块按住时被拆下也不再留下 pointerup,进程组表头的摘要不会在拆除后重建并永久订阅宽度,思考窗与折叠回滚不再在拆除后继续排帧。
|
|
102
|
+
- 卷帘门在末尾展开、收起的整个过程中,只要读者没有自己往回翻看,输入框上方那一行都停在原处不动。
|
|
103
|
+
- 被合并掉的调用连同宿主给它留的间距一起离开页面,过程组里各行的间距保持一致。
|
|
104
|
+
- 状态行的扫光层始终挂在承载文字的那个副本上,扫光带贴着字形扫过。
|
|
105
|
+
- 飞行的气泡每一帧都从它按住的那一行重新取落点与高度、底色按画面上的颜色写定(半透明气泡令牌只与画布合成一次),真实行等它站上去并连着几帧不动之后才显形、显形瞬间两者对齐到同一像素,淡出期间它始终钉在那一行上;等待本身有上限,页面一直在动也不会把消息一直扣着。
|
|
106
|
+
- Windows 桌面端飞行的气泡全程是气泡自己的颜色,与 web 端一致;这条色带同时是窗口的拖拽区,飞行期间在那一块按下鼠标也不再拖动窗口。
|
|
107
|
+
- 换词时钉住的宽度与要去的宽度都按布局实际的宽度取,盒子稳住不动,计时只随说法变长而移动。
|
|
108
|
+
- 飞行的竖直阻尼比回到 0.75,落定的那点回落又回来了。
|
|
109
|
+
|
|
110
|
+
### 其他变更
|
|
111
|
+
|
|
112
|
+
- 36 段登记在册的复制代码全部清零:分段控件、品牌图蒙版、弹层暗色卡片与表单盒型等收进共享样式表,脚本与测试工具的公共启动代码收进 `scripts/shared/` 与 `packages/testing/`,jscpd 基线文件随之删除,lint 对任何新复制段直接拒绝。
|
|
113
|
+
- 压过宿主界面的 z-index 改由 `packages/client/src/theme/tokens.json` 的 `layer` 一组给出,`docs/STYLE.md` 里的层级表由同一份数据生成,构建拒绝样式表里 9 以上的 z-index 字面值与 TS 里内联写出的层级。
|
|
114
|
+
- npm 包不再携带 source map 与 `docs/decisions/` 决策文档,包体积从 2.3 MB 降到 1.6 MB。
|
|
115
|
+
- 新增 `npm run session`:会话在自己的工作树与 `session/` 分支上开工、收尾与清理,`node_modules/` 经联接复用主树;并行会话的改动、测试锁与云端失败归属不再互相交叉。
|
|
116
|
+
- 冒烟架、临时宿主、脚本化模型、端到端通道与三个在线探针全部住进 `packages/testing/`,共用一套 Playwright 浏览器栈,`scripts/` 只剩构建与文档工具。
|
|
117
|
+
- 构建对浏览器半边源码的检查改在 TypeScript 语法树上进行(`scripts/source-tree.mjs`):样式表读到的 `data-dsh-*` 属性必须真的有代码写入,经变量、联合类型与辅助函数转手也追得到,注释里的同名写法不再误报;流式淡入的 24 条 `::highlight()` 规则与首页热度图的四档规则由构建按 `constants.ts` 里的取值写出,步数、档数与规则出自同一处。
|
|
118
|
+
- 三个微型功能并入它们服务的功能——选区镜像与输入框的空白提示并入输入区、首页问候语并入首页版面、亮暗切换的过渡抑制并入设置页——功能数量从 28 降到 25。
|
|
119
|
+
- 端到端通道多一个长会话场景:先积累八轮对话,再在页内探针下流过一整条回答,逐帧记下帧间隔与长时间任务,并把每帧耗时的 p50、p95、最大值与页面节点数写进断言说明;本机两次运行读到 p50 31.5 毫秒、p95 156 至 187 毫秒、最大 156 至 218 毫秒、长时间任务合计 289 至 978 毫秒、约 1900 个节点(无显示加速的无头浏览器,读数随同机其他负载浮动)。
|
|
120
|
+
- 重要性走查里标为动画中间帧的那一组记录改成「抓到与否都算数」:这一类选择器只在动画播放的那几帧存在,走查在固定时刻读页面,同一次改动可能这一趟读到、下一趟读不到,原来会把其中一次读不到判成「从未匹配」、把读到判成「该划掉」,两边都会失败;换字退场的那个类补进这一组。
|
|
121
|
+
- `importance` 场景在走查里多审两件事:走遍所有页面形态都没匹配到元素的选择器即失败,到不了的选择器逐条登记在 `packages/testing/importance-unreachable.json`、每条写明缘由且登记表只许变短;同一轮走查去掉八处多余的 `!important`,端到端通道的设置层每次运行前回到运行前的副本。
|
|
122
|
+
- 文档里带单位的数值必须有出处:能由令牌或常量给出的一律读它,读不到的登记在 `scripts/doc-numbers.mjs` 的来源表里,数值失去出处时 `npm run lint` 与云端闸门报出。
|
|
123
|
+
- `docs/SETTINGS.md` 与 `docs/SETTINGS.en.md` 只留设置页自己的内容——六个分页与各档、设置项之间的依赖、跨功能的几段说明——动效各自做什么由链接指向功能一览。
|
|
124
|
+
- `docs/STYLE.md` 只留视觉规则与三张由令牌表生成的对照表,精灵的网格、格宽与帧号由 `packages/client/src/features/mascot/sheets.ts` 与精灵样式表持有。
|
|
125
|
+
- 决策的「决定」一节限定篇幅:一条不超过三百字、一节不超过三千字,「现状」不超过六百字,由 `npm run lint` 判定。
|
|
126
|
+
- `AGENTS.md` 的命令清单改由 `npm run agents` 从 `package.json` 与各脚本自己的首行生成,云端闸门用 `npm run agents:check` 核对。
|
|
127
|
+
- 端到端通道的两个发送场景在替身离场之后再读一次页面自己继续采样的帧:真行是否显形、替身是否落在它身上改按这一段帧判定,慢跑机器上不再把尚未显形的行当成不可见。
|
|
128
|
+
- 闸门的发起时机写明:本机默认不起闸门,开发期间的判断来自构建与在线页面;一次运行只属于推送之前那一段,取覆盖这次改动的最小集合。
|
|
129
|
+
|
|
130
|
+
<h3 id="en-0.14.0">New Features</h3>
|
|
131
|
+
|
|
132
|
+
- The Sidebar tab gains an Account-hold easter egg row, with Off the account row is a plain name, and the `banLocale` setting gains the value `off`.
|
|
133
|
+
- With [ds-bot](https://github.com/Fei2411/DeepSeek-Bot) installed too, the top of the sidebar carries a Chat / Code switch: Chat is ds-bot's Bot surface with the theme standing aside, Code is the host's own interface painted by the theme, and without ds-bot the page carries none.
|
|
134
|
+
- The Conversation tab gains Waiting-line detail (setting `statusDetail`, `precise` (the default) or `simple`), where Precise has a command call say the description the model declared for it.
|
|
135
|
+
- The running line names the file a call works on, cut past 32 characters, and writes the model's own words when the reasoning carries an English present-continuous clause.
|
|
136
|
+
- The settings page gains a Motion tab whose Waiting-line animation setting picks the paint with two live previews instead of text — the highlight band the line sweeps today, or a colour wash that moves through the letters; the `statusMotion` setting is `sweep` (the default) or `wash`.
|
|
137
|
+
|
|
138
|
+
### Improvements
|
|
139
|
+
|
|
140
|
+
- The calls on one file inside one process group stand as a single row: its icon and title move on with the file's last operation, its `+n -m` tail counts those changes and turns character by character as each one lands, and opening the row reads every change — or the window a read-only file was read at.
|
|
141
|
+
- The settings page's over-long descriptions are rewritten in a concise style — one sentence naming what the setting governs and what each tier does — with the Chinese and English copies kept in step.
|
|
142
|
+
- A pass no longer queries the whole document for host nodes it already knows: the composer cards and their placeholders, the running rows, the thinking rows, the title row, the dialogs, the footer, the conversation root, the model slot and the context meter are read from live per-selector registries on the observation bus, and only a node the host replaced is resolved again. The longer a session runs, the less a frame's query cost follows the size of the page.
|
|
143
|
+
- The wording box's width is now one move — pinned at the width it stands at, written with the width it heads for, and carried there over the sliding highlight's own time and curve (about 0.24 s) — so the clock travels to its new place with it.
|
|
144
|
+
- The running line's wording swap runs transitions.dev's "Thinking states": the two halves move at once, the sweeping highlight stays lit through the swap, and a hidden sizer holds the width and height, so the clock is never shoved aside and the copy rising from below never makes the line taller.
|
|
145
|
+
- A change confined to the conversation column — streaming, above all — wakes only the features that read it: the header, the view tabs, the sidebar footer and the model and effort pickers no longer take a pass of their own. Any signal that reads the whole page (a language, a preference, the clock, a frame a feature asks for) still runs the full pass.
|
|
146
|
+
- Settings rows that only work while another setting is on grey out and take no input with it — the model picker and the permission control with the composer restyle, the statistics position with the restyle covering the conversation, the easter egg with the sidebar settings — and a greyed row still shows the value you set, with a line in the accent colour saying what it waits for.
|
|
147
|
+
- Scrolling or resizing now re-places fixed popovers once a frame instead of once per event; a shut model or effort card stops reading its trigger's box, and the inline context line is measured for fit only when the card's width has changed.
|
|
148
|
+
- Header in the title bar lives on the settings page's Conversation tab, taking input on the Windows desktop window alone and greying out on every other page — still showing the value you set, with a note naming the window it acts in; Animation moves from General to Motion, Home layout to Appearance, the Account-hold easter egg to Sidebar under the row of the account popover it opens from, and Search box style and Conversation statistics position now say what each choice does.
|
|
149
|
+
- Composer caret motion drops its third tier for On and Off and moves from the Conversation tab to the Motion tab, each choice a preview card — the caret gliding along a sample line, or standing at its head blinking; a stored Explicit moves reads as On. A row whose preview cards already present the choice (the waiting-line animation, the caret) carries no description.
|
|
150
|
+
- Every duration, curve, distance and blur in the skin comes from the `motion` group of `packages/client/src/theme/tokens.json`, one value per role, with the style guide's motion table generated from the same data and the build refusing a duration or curve written straight into a stylesheet, keyframes that repeat one the skin has, and a motion token nothing reads.
|
|
151
|
+
- The fade over newly arrived characters in a streaming answer now compares text nodes incrementally: an append no longer rejoins the whole answer into a string nor walks it character by character, so the cost follows the batch. A markdown rewrite in the middle is still judged by the same window, and a rewrite past its budget or one that just reflowed from a fold stays solid.
|
|
152
|
+
- The line and a process group's header share the host's own `TextShimmer` gear — 1.5 s a pass, `steps(48, end)`, the band resting the last third — and the line's band takes the host's shimmer tint at 20% width.
|
|
153
|
+
- Three books that grew with a long session are now bounded: the process headers' summaries share one size subscription instead of one per group, the thinking rows are registered incrementally from change batches rather than scanned for on every scroll, and the process-group follow keeps no timer when the page holds no process group.
|
|
154
|
+
- When the host replaces its own account row, the four listeners on the old row leave with this generation's record of it instead of waiting for the teardown; the account menu still holds one card's binding at a time.
|
|
155
|
+
- The model, reasoning, permission and account cards and the new-conversation page's menus grow out of the corner nearest their button from a little smaller (about 0.25 s, with no rise) and close faster (about 0.12 s).
|
|
156
|
+
- The account-hold page grows out of the centre as it fades in (about 0.25 s), and a control on it or Esc shrinks it back as it fades (about 0.12 s) before it leaves the page.
|
|
157
|
+
- A settings switch now runs its knob past the end and settles back (about 0.35 s), and only a switch the reader has pressed moves — opening the page or coming back to a tab shows every switch at rest.
|
|
158
|
+
- Changing settings tabs slides the new one in from the side it sits on along the strip, through a short blur, while the one it replaces slides out the other way (about 0.25 s); the page sliding out is a still copy that neither a screen reader nor the Tab key reaches.
|
|
159
|
+
- Opening the home page raises the brand mark and then, a beat behind, the greeting, each from 12px below through a short blur (about 0.5 s).
|
|
160
|
+
- The settings page stays readable at very narrow widths: the tab strip wraps onto a second line when one line no longer holds every tab, each label always whole on one line, and a row whose text runs out of room drops its control — a switch, a segmented control — onto a line of its own under the text.
|
|
161
|
+
- The context-occupancy colour band moves to two fifths through four fifths in a set of low-chroma tones: the reading stays green below two fifths, runs through light green, yellow and orange in between, and is red from four fifths on.
|
|
162
|
+
- The studio home's usage panel fades its placeholders out while the figures come out of a blur, shades the heat map's cells into their own colours and fades the model list and chart in (about 0.3 s).
|
|
163
|
+
- The waiting line's "No response yet" badge slides onto the line from below and to the left while it pops out of nothing (about 0.5 s) and shrinks away as soon as the model speaks (about 0.12 s).
|
|
164
|
+
- Under the Claude brand the head of the running row carries the skin's own three 4px dots, each rising 8px and flattening as it leaves the floor, half a second a bounce with the three staggered into a wave; under the DeepSeek brand the host's whale tail stands as before, and the screen-reader announcement is unchanged.
|
|
165
|
+
- The Appearance tab's Primary colour row is renamed Accent colour and moves under Colours, greying out and taking no input while Colours is set to Follow the host.
|
|
166
|
+
- The studio home's permission control was the same Read / Edit / Auto / Yolo segment row the classic home wears, which sat oddly with its conversation-style single-line card; it now matches the conversation: one button naming the current tier, opening a card of tiers, with the slider-style segment row left to the classic home. Before a workspace is picked the button rests on the preset a new session starts in and takes no input, so pressing it opens the workspace picker the same as pressing the input box.
|
|
167
|
+
- Under a Chinese interface the built-in Auto review tier showed its English name, the host's own tier dictionary carrying that entry in English in every language; it now reads 自动审查, while the tiers the host names in Chinese keep their own words and every other interface language still reads Auto review.
|
|
168
|
+
- While a turn runs, the line stands on one word per brand: the skin's own "Thinking…" under the Claude brand and the host's own "Deep diving" under the DeepSeek brand, and a model thinking and a turn whose state cannot be read use that one word, so a wait no longer changes wording.
|
|
169
|
+
- The two Waiting-line animation cards on the Motion tab take turns between two wordings the line really uses — the current brand's waiting word and "Running tools…" — with the same swap and the same paints.
|
|
170
|
+
|
|
171
|
+
### Bug Fixes
|
|
172
|
+
|
|
173
|
+
- The effort slider no longer runs the wrong way on models whose levels arrive out of order: the host records `reasoning.efforts` from weakest to strongest, while Qoder's Qwen3.8-Max sends xhigh, low, medium, none and Raccoon and MiniMax send high, none, and the slider drew that order as it came, so the right end landed on the weakest level — on these models switching thinking off read as the strongest setting. Levels whose strength is known are now sorted by strength, and a level whose strength is unknown stays where the provider put it.
|
|
174
|
+
- Fix the context statistics popover repeatedly flickering while the pointer rests on the context ring in Firefox: returning to the trigger cancels the pending close, and the popover stays open while the trigger is hovered.
|
|
175
|
+
- A thinking row's automatic fold and a reader's own press find the expanded body on both host shapes, so both roll frame by frame; an inserted body fades in and rises two pixels.
|
|
176
|
+
- With popovers opening on hover, a press on the trigger no longer folds the popover the pointer just opened — on the sidebar account entry, the permission, model and effort pickers, the home row's two pickers and the context ring beside the composer — leaving the pointer's departure to close it.
|
|
177
|
+
- Waiting-line detail reads in Chinese on a Chinese interface — title, description and both tier names: the row's copy never entered the copy document, so a Chinese interface read the English fallbacks.
|
|
178
|
+
- The theme yields its waiting line when a visible sibling replaces externally hidden host wording, restores it when the takeover ends, and keeps other chat animations running.
|
|
179
|
+
- The pin stands above every place the scroll end can come to rest, so the line above the composer holds the same spot in every frame while the tail is followed and no longer shakes with each piece of reasoning.
|
|
180
|
+
- Turning a feature off or replacing a generation now takes its listeners on host-owned nodes, its observation-bus subscriptions, its queued frames and its timers with it: the host account menu no longer keeps every card it has already unmounted, the conversation meter and panel no longer stack bindings from earlier generations, switching the model picker off no longer leaves a document mousemove behind, dropping the effort slider mid-drag no longer leaves pointerup bound, a process header's summary is not rebuilt and subscribed after its teardown, and the reasoning window and fold roll stop queueing frames once the feature is gone.
|
|
181
|
+
- While a fold rolls open or shut at the tail, the line above the composer holds its place, unless the reader has scrolled back.
|
|
182
|
+
- A merged-away call leaves the page together with the spacing the host gave it, and the rows of a process group keep one even spacing.
|
|
183
|
+
- The sweeping highlight rides the copy holding the words, so the band sweeps across the glyphs themselves.
|
|
184
|
+
- The flying bubble takes its landing spot and height again every frame from the row it holds, its fill is written as the colour the screen paints (a translucent bubble token composites over the canvas once), and the real row is shown only once the stand-in is on it and the row has held still for several frames — the two are the same pixel then, and through the fade the stand-in stays pinned to the row; the wait is bounded, so a page that keeps moving never holds the message back.
|
|
185
|
+
- On the Windows desktop app the flying bubble keeps the bubble's own colour all the way, alike on the web, and the band — also the window's drag region — no longer turns a press there into a window drag during the flight.
|
|
186
|
+
- The pin and the width it heads for are the widths the layout really holds, so the box holds its place through a swap and the clock moves only as the wording grows.
|
|
187
|
+
- The flight's vertical damping ratio is 0.75 again, and the drop back into place is back with it.
|
|
188
|
+
|
|
189
|
+
### Chores
|
|
190
|
+
|
|
191
|
+
- The 36 tracked copied stretches are gone — the segment controls, the masked brand-mark idiom, the dark popover card and the form-control boxes now live in shared sheets, and the scripts' and testing tools' bootstrap moved into `scripts/shared/` and `packages/testing/`; the jscpd baseline is deleted with them and lint refuses any new copied stretch.
|
|
192
|
+
- A z-index that has to clear the host's interface comes from the `layer` group of `packages/client/src/theme/tokens.json`, the layer table in `docs/STYLE.md` is generated from the same data, and the build refuses a z-index literal above 9 in a stylesheet and a stacking level written inline in TypeScript.
|
|
193
|
+
- The npm package no longer carries source maps or the `docs/decisions/` documents, taking it from 2.3 MB to 1.6 MB.
|
|
194
|
+
- New `npm run session`: a session opens, finishes and sweeps its own worktree on a `session/` branch, reusing the main tree's `node_modules/` through a junction; parallel sessions' edits, test locks and cloud-failure ownership no longer cross.
|
|
195
|
+
- The smoke harness, the scratch host, the scripted model service, the end-to-end lane and the three live probes all live in `packages/testing/` on one Playwright stack, leaving `scripts/` with the build and document tools.
|
|
196
|
+
- The build's checks on the browser half's source read its TypeScript syntax tree (`scripts/source-tree.mjs`): every `data-dsh-*` attribute a stylesheet reads must really be written by code, found through a variable, a union or a helper parameter, and the same spelling in a comment no longer trips the check; the 24 `::highlight()` rules behind the streaming fade and the home heat grid's four levels are written by the build from `constants.ts`, so the counts and the rules have one source.
|
|
197
|
+
- Three micro-features fold into the features they serve — the window-blur selection mirror and the composer's idle hint into the composer, the home greeting into the home layout, the theme flip's transition suppression into the settings page — taking the feature count from 28 to 25.
|
|
198
|
+
- The end-to-end lane gains a long-session scenario: it grows eight turns first, then streams one more answer under an in-page probe that records frame intervals and long tasks, and prints the p50, p95 and worst frame times with the page's node count in the check details. Two local runs read p50 31.5 ms, p95 156 to 187 ms, worst 156 to 218 ms, 289 to 978 ms of long tasks and about 1900 nodes on a headless browser without display acceleration, the readings moving with other load on the machine.
|
|
199
|
+
- The groups of the importance walk marked as animation frames are now read as "counted whether or not the walk catches them": such a selector exists only inside an animation, the walk reads the page at fixed moments, and the same change may be caught in one run and missed in the next — which used to fail the run either way, as "never matched" when missed and as "strike this off" when caught. The swap's exit class joins that group.
|
|
200
|
+
- The `importance` scenario audits two more things in its walk: a selector that matches no element in any page state fails it, and the selectors the walk cannot reach are recorded with their reasons in `packages/testing/importance-unreachable.json`, a record that may only shrink; the same walk proved eight `!important` declarations redundant and took them out, and the end-to-end lane's settings layer returns to its pre-run copy.
|
|
201
|
+
- A number a document states now has a home: a value a token or a constant holds is read from there, the few a reader needs are registered with their source in `scripts/doc-numbers.mjs`, and `npm run lint` and the cloud gates fail when one loses it.
|
|
202
|
+
- `docs/SETTINGS.md` and `docs/SETTINGS.en.md` carry the settings page's own content — the six tabs and their tiers, the dependencies between rows, the cross-cutting notes — and link to the feature list for what each effect does.
|
|
203
|
+
- `docs/STYLE.md` keeps the visual rules and the three tables generated from the token table, with the sprites' grids, cell sizes and frame numbers held in `packages/client/src/features/mascot/sheets.ts` and the mascots' stylesheets.
|
|
204
|
+
- A decision's 决定 section is held to a length — one bullet of at most 300 characters, a section of at most 3000, a 现状 line of at most 600 — enforced by `npm run lint`.
|
|
205
|
+
- `AGENTS.md`'s command list is generated by `npm run agents` from `package.json` and each script's own header line, and checked in the cloud with `npm run agents:check`.
|
|
206
|
+
- The end-to-end lane's two send scenarios read the frames the page keeps sampling once the stand-in has left: whether the real row appeared, and whether the stand-in sat on it, are judged on that stretch, so a slow runner no longer calls a row that had not appeared yet invisible.
|
|
207
|
+
- The occasion for a gate run is stated plainly: no gate starts on this machine by default, work in progress runs on the build and the live page, and a run belongs to the stretch before a push over the smallest set covering that change.
|
|
208
|
+
|
|
7
209
|
## [0.13.3] - 2026-10-12
|
|
8
210
|
|
|
9
211
|
[中文](#cn-0.13.3) | [English](#en-0.13.3)
|
package/LICENSE
CHANGED
|
@@ -30,11 +30,6 @@ Font files notice:
|
|
|
30
30
|
They are included in this repository for personal use only and are **not**
|
|
31
31
|
covered by the MIT license above; all rights remain with Anthropic. The npm
|
|
32
32
|
package does not ship these files.
|
|
33
|
-
Provider icon notice: the files under `packages/assets/src/icons/providers/` (and their
|
|
34
|
-
`lib/icons/providers/` build copy) are vendored from farion1231/cc-switch
|
|
35
|
-
(MIT License, Copyright (c) 2025 Jason Young). They are redistributed under
|
|
36
|
-
the MIT License; brand names and logos remain trademarks of their respective
|
|
37
|
-
owners.
|
|
38
33
|
|
|
39
34
|
- `packages/assets/src/fonts/JetBrainsMonoVariable.ttf` and
|
|
40
35
|
`packages/assets/src/fonts/JetBrainsMonoItalicVariable.ttf` are JetBrains Mono,
|
package/README.en.md
CHANGED
|
@@ -110,7 +110,7 @@ Keep only one theme enabled at a time. dsh ≥ 0.1.7 is required, and a restart
|
|
|
110
110
|
|
|
111
111
|
| Document | Contents |
|
|
112
112
|
| --- | --- |
|
|
113
|
-
| [Design tokens](docs/STYLE.md) |
|
|
113
|
+
| [Design tokens](docs/STYLE.md) | The palette, typography, shape, motion and layer rules, with three tables generated from the token table (in English) |
|
|
114
114
|
| [Architecture decisions](docs/decisions/README.md) | One file per decision: build and source, the host boundary, the runtime and each feature's trade-offs, and the architecture migration in progress (in Chinese) |
|
|
115
115
|
| [Changelog](CHANGELOG.md) | Version history |
|
|
116
116
|
| [Contributing](CONTRIBUTING.md) | Building from `packages/client/src/`, commit conventions, and the screenshot and regression tooling (in English) |
|
package/README.md
CHANGED
|
@@ -98,12 +98,12 @@ Anthropic 字体启用(二选一):
|
|
|
98
98
|
|
|
99
99
|
| 文档 | 说明 |
|
|
100
100
|
| --- | --- |
|
|
101
|
-
| [设计令牌](docs/STYLE.md) |
|
|
101
|
+
| [设计令牌](docs/STYLE.md) | 配色、字体、形状、动效与层级的规则,以及由令牌表生成的三张对照表(英文) |
|
|
102
102
|
| [架构决策](docs/decisions/README.md) | 每条决策一个文件:构建与源码、宿主边界、运行时与各个功能的取舍,以及正在进行的架构迁移 |
|
|
103
103
|
| [更新日志](CHANGELOG.md) | 版本历史 |
|
|
104
104
|
| [贡献指南](CONTRIBUTING.md) | 如何从 `packages/client/src/` 构建、提交规范与截图/回归工具(英文) |
|
|
105
105
|
| [功能一览](docs/FEATURES.md) | 每一项功能做什么、在设置页哪里开关 |
|
|
106
|
-
| [设置说明](docs/SETTINGS.md) |
|
|
106
|
+
| [设置说明](docs/SETTINGS.md) | 六个分页(通用、外观、输入区、侧栏、对话、动效)的设置项与各档效果 |
|
|
107
107
|
|
|
108
108
|
## 鸣谢
|
|
109
109
|
|
package/THIRD_PARTY_NOTICES.md
CHANGED
|
@@ -2,16 +2,46 @@
|
|
|
2
2
|
|
|
3
3
|
This package includes material from the projects below. Each keeps its own license; the MIT license of this package does not relicense it.
|
|
4
4
|
|
|
5
|
-
## dsh-
|
|
5
|
+
## dsh-chat-ux
|
|
6
6
|
|
|
7
|
-
The
|
|
7
|
+
The chat area's folding (`packages/client/src/features/chat-fold/`), the token reveal (`packages/client/src/features/chat-reveal/`), the send flight (`packages/client/src/features/chat-send/`), the enhanced follow and the capped process group's follow (`packages/client/src/features/chat-follow/`) and the composer caret (`packages/client/src/features/caret/`) are ported from dsh-chat-ux. The ported source files name it in their headers, and each of those features stands down while that plugin is on the page.
|
|
8
8
|
|
|
9
|
-
Source: <https://github.com/
|
|
9
|
+
Source: <https://github.com/alm-allen/dsh-chat-ux>
|
|
10
10
|
|
|
11
11
|
```
|
|
12
12
|
MIT License
|
|
13
13
|
|
|
14
|
-
Copyright (c) 2026
|
|
14
|
+
Copyright (c) 2026 Alm
|
|
15
|
+
|
|
16
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
17
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
18
|
+
in the Software without restriction, including without limitation the rights
|
|
19
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
20
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
21
|
+
furnished to do so, subject to the following conditions:
|
|
22
|
+
|
|
23
|
+
The above copyright notice and this permission notice shall be included in all
|
|
24
|
+
copies or substantial portions of the Software.
|
|
25
|
+
|
|
26
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
27
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
28
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
29
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
30
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
31
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
32
|
+
SOFTWARE.
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Lobe Icons
|
|
36
|
+
|
|
37
|
+
The vendor lockups the model picker draws (`packages/assets/src/icons/combine/`, inlined into `lib/client.js`) are composed by `scripts/fetch-lobe-combines.py` from Lobe Icons: `@lobehub/icons-static-svg` ships each vendor's mono mark, colour mark and wordmark, and `@lobehub/icons` carries the composition ratios. Brand names and logos remain trademarks of their respective owners.
|
|
38
|
+
|
|
39
|
+
Source: <https://github.com/lobehub/lobe-icons>
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
MIT License
|
|
43
|
+
|
|
44
|
+
Copyright (c) 2023 LobeHub
|
|
15
45
|
|
|
16
46
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
17
47
|
of this software and associated documentation files (the "Software"), to deal
|
|
@@ -36,11 +66,15 @@ SOFTWARE.
|
|
|
36
66
|
|
|
37
67
|
The Number pop-in transition (`packages/client/src/features/context-stats/stats-digits.ts` and the `dsh-claude-digit-*` rules in `packages/client/src/features/composer/inline-bar.css`) is ported from transitions.dev's "Number pop-in": its keyframes, its distance, blur, stagger and easing tokens, and one span per character with the last two delayed behind the rest — renamed into this package's own classes and tokens.
|
|
38
68
|
|
|
39
|
-
The "Text states swap" transition (`packages/client/src/features/chat-wait/chat-wait.ts` and the `dsh-claude-chat-wait-label` rules in its stylesheet) is ported the same way: its three-phase sequence (leave upward with a blur, change the text out of sight, enter from below), its duration, shift, blur and easing tokens as this package's own custom properties, and the reflow that releases the entry pose. The snippet's `prefers-reduced-motion` guard is answered by the animation choice this skin resolves onto `<body>` (D26), which already folds the system setting in.
|
|
69
|
+
The "Text states swap" transition (`packages/client/src/features/chat-wait/chat-wait.ts` and the `dsh-claude-chat-wait-label` rules in its stylesheet, and the operation label of a shared file row in `packages/client/src/features/chat-files/` with the `dsh-claude-file-op-*` rules in its stylesheet) is ported the same way: its three-phase sequence (leave upward with a blur, change the text out of sight, enter from below), its duration, shift, blur and easing tokens as this package's own custom properties, and the reflow that releases the entry pose. The snippet's `prefers-reduced-motion` guard is answered by the animation choice this skin resolves onto `<body>` (D26), which already folds the system setting in.
|
|
40
70
|
|
|
41
71
|
The "Reasoning stream" transition (`packages/client/src/features/chat-fold/reasoning-stream.ts` and the `data-dsh-claude-reason-window` rules in that feature's `fold-motion.css`) is ported as well: its window (a few lines tall with a mask at each edge rather than painted gradients), its hold, step, lines, fade and easing tokens, and the stepping clock — read as live text, so there is no copy and no wrap and the steps stop at the newest line.
|
|
42
72
|
|
|
43
|
-
|
|
73
|
+
Seven more are ported the same way, each into this package's own classes, attributes and motion tokens, with the snippet's `prefers-reduced-motion` guard answered by the skin's animation choice: "Menu dropdown" (the popover cards in `packages/client/src/shared/popover.css` and the `dsh-claude-dropdown-in` preset in `packages/client/src/shared/motion.css` — its pre-open and closing scales and its curve, the closing state carried by the separate `scale` property instead of a class), "Modal open / close" (the account-hold page, `packages/client/src/features/ban-screen/`), "Page side-by-side" (the settings tabs, `packages/client/src/features/settings/` — the page leaving is a still copy of its rows), "Notification badge" (the waiting line's overtime badge, `packages/client/src/features/chat-wait/` — the slide and the pop as `translate` and `scale` on the one pill), "Skeleton loader and reveal" (the home usage panel, `packages/client/src/features/home/` — the placeholder and the figure being one element, its fill fades while the figure comes out of the blur), "Texts reveal" (the home greeting, `packages/client/src/theme/hero.css` — the brand mark and the greeting as its two lines) and "Toggle" (the settings switches — its double-bounce keyframes, armed by the first press).
|
|
74
|
+
|
|
75
|
+
The colour wash the waiting line can wear instead of the band (`packages/client/src/shared/motion.css`, the `dsh-claude-sweep` and `dsh-claude-wash` presets in that sheet and the `--dsh-claude-wash-*` custom properties) is the paint transitions.dev serves on its own pages as "Pro gradient text" (`.title-pro` on <https://transitions.dev/agent.html>): its seven radial washes over a grey base ramp as inline SVG, its 180% layer sizes, and its orbit and hue-rotation periods, renamed into this package's own custom properties and motion tokens, with the `prefers-reduced-motion` guard answered by the skin's animation choice (D26) as everywhere else.
|
|
76
|
+
|
|
77
|
+
Source: <https://transitions.dev/detail.html?t=number-pop-in> · <https://transitions.dev/detail.html?t=text-states-swap> · <https://transitions.dev/detail.html?t=reasoning-stream> · <https://transitions.dev/detail.html?t=menu-dropdown> · <https://transitions.dev/detail.html?t=modal-open-close> · <https://transitions.dev/detail.html?t=page-side-by-side> · <https://transitions.dev/detail.html?t=notification-badge> · <https://transitions.dev/detail.html?t=skeleton-loader-and-reveal> · <https://transitions.dev/detail.html?t=texts-reveal> · <https://transitions.dev/detail.html?t=toggle> · <https://transitions.dev/detail.html?t=pro-gradient-text> · <https://github.com/Jakubantalik/transitions.dev>
|
|
44
78
|
|
|
45
79
|
```
|
|
46
80
|
Transitions.dev License
|
|
@@ -69,3 +103,245 @@ transitions in your products, not as a product of their own.
|
|
|
69
103
|
|
|
70
104
|
Full terms: https://transitions.dev/terms.html
|
|
71
105
|
```
|
|
106
|
+
|
|
107
|
+
## zai-org/ZCode
|
|
108
|
+
|
|
109
|
+
The figures on a file-change row (`packages/client/src/features/chat-files/` and the `dsh-claude-file-roll-*` rules in its stylesheet) turn the way ZCode's metric flip does (its UI package's `flip-metric-value.tsx`): one short turn per update, only the characters whose own digit changed, a fixed-width slot per character with the perspective on the slot, 160 ms, and an animation choice that writes the value in place instead of turning it.
|
|
110
|
+
|
|
111
|
+
Source: <https://github.com/zai-org/ZCode> · <https://github.com/zai-org/ZCode/blob/main/packages/ui/src/components/ui/flip-metric-value.tsx>
|
|
112
|
+
|
|
113
|
+
License: Apache-2.0.
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
Apache License
|
|
117
|
+
Version 2.0, January 2004
|
|
118
|
+
http://www.apache.org/licenses/
|
|
119
|
+
|
|
120
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
121
|
+
|
|
122
|
+
1. Definitions.
|
|
123
|
+
|
|
124
|
+
"License" shall mean the terms and conditions for use, reproduction,
|
|
125
|
+
and distribution as defined by Sections 1 through 9 of this document.
|
|
126
|
+
|
|
127
|
+
"Licensor" shall mean the copyright owner or entity authorized by
|
|
128
|
+
the copyright owner that is granting the License.
|
|
129
|
+
|
|
130
|
+
"Legal Entity" shall mean the union of the acting entity and all
|
|
131
|
+
other entities that control, are controlled by, or are under common
|
|
132
|
+
control with that entity. For the purposes of this definition,
|
|
133
|
+
"control" means (i) the power, direct or indirect, to cause the
|
|
134
|
+
direction or management of such entity, whether by contract or
|
|
135
|
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
136
|
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
137
|
+
|
|
138
|
+
"You" (or "Your") shall mean an individual or Legal Entity
|
|
139
|
+
exercising permissions granted by this License.
|
|
140
|
+
|
|
141
|
+
"Source" form shall mean the preferred form for making modifications,
|
|
142
|
+
including but not limited to software source code, documentation
|
|
143
|
+
source, and configuration files.
|
|
144
|
+
|
|
145
|
+
"Object" form shall mean any form resulting from mechanical
|
|
146
|
+
transformation or translation of a Source form, including but
|
|
147
|
+
not limited to compiled object code, generated documentation,
|
|
148
|
+
and conversions to other media types.
|
|
149
|
+
|
|
150
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
151
|
+
Object form, made available under the License, as indicated by a
|
|
152
|
+
copyright notice that is included in or attached to the work
|
|
153
|
+
(an example is provided in the Appendix below).
|
|
154
|
+
|
|
155
|
+
"Derivative Works" shall mean any work, whether in Source or Object
|
|
156
|
+
form, that is based on (or derived from) the Work and for which the
|
|
157
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
158
|
+
represent, as a whole, an original work of authorship. For the purposes
|
|
159
|
+
of this License, Derivative Works shall not include works that remain
|
|
160
|
+
separable from, or merely link (or bind by name) to the interfaces of,
|
|
161
|
+
the Work and Derivative Works thereof.
|
|
162
|
+
|
|
163
|
+
"Contribution" shall mean any work of authorship, including
|
|
164
|
+
the original version of the Work and any modifications or additions
|
|
165
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
166
|
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
167
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
168
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
169
|
+
means any form of electronic, verbal, or written communication sent
|
|
170
|
+
to the Licensor or its representatives, including but not limited to
|
|
171
|
+
communication on electronic mailing lists, source code control systems,
|
|
172
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
173
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
174
|
+
excluding communication that is conspicuously marked or otherwise
|
|
175
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
176
|
+
|
|
177
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
178
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
179
|
+
subsequently incorporated within the Work.
|
|
180
|
+
|
|
181
|
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
182
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
183
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
184
|
+
copyright license to reproduce, prepare Derivative Works of,
|
|
185
|
+
publicly display, publicly perform, sublicense, and distribute the
|
|
186
|
+
Work and such Derivative Works in Source or Object form.
|
|
187
|
+
|
|
188
|
+
3. Grant of Patent License. Subject to the terms and conditions of
|
|
189
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
190
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
191
|
+
(except as stated in this section) patent license to make, have made,
|
|
192
|
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
193
|
+
where such license applies only to those patent claims licensable
|
|
194
|
+
by such Contributor that are necessarily infringed by their
|
|
195
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
196
|
+
with the Work to which such Contribution(s) was submitted. If You
|
|
197
|
+
institute patent litigation against any entity (including a
|
|
198
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
199
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
200
|
+
or contributory patent infringement, then any patent licenses
|
|
201
|
+
granted to You under this License for that Work shall terminate
|
|
202
|
+
as of the date such litigation is filed.
|
|
203
|
+
|
|
204
|
+
4. Redistribution. You may reproduce and distribute copies of the
|
|
205
|
+
Work or Derivative Works thereof in any medium, with or without
|
|
206
|
+
modifications, and in Source or Object form, provided that You
|
|
207
|
+
meet the following conditions:
|
|
208
|
+
|
|
209
|
+
(a) You must give any other recipients of the Work or
|
|
210
|
+
Derivative Works a copy of this License; and
|
|
211
|
+
|
|
212
|
+
(b) You must cause any modified files to carry prominent notices
|
|
213
|
+
stating that You changed the files; and
|
|
214
|
+
|
|
215
|
+
(c) You must retain, in the Source form of any Derivative Works
|
|
216
|
+
that You distribute, all copyright, patent, trademark, and
|
|
217
|
+
attribution notices from the Source form of the Work,
|
|
218
|
+
excluding those notices that do not pertain to any part of
|
|
219
|
+
the Derivative Works; and
|
|
220
|
+
|
|
221
|
+
(d) If the Work includes a "NOTICE" text file as part of its
|
|
222
|
+
distribution, then any Derivative Works that You distribute must
|
|
223
|
+
include a readable copy of the attribution notices contained
|
|
224
|
+
within such NOTICE file, excluding those notices that do not
|
|
225
|
+
pertain to any part of the Derivative Works, in at least one
|
|
226
|
+
of the following places: within a NOTICE text file distributed
|
|
227
|
+
as part of the Derivative Works; within the Source form or
|
|
228
|
+
documentation, if provided along with the Derivative Works; or,
|
|
229
|
+
within a display generated by the Derivative Works, if and
|
|
230
|
+
wherever such third-party notices normally appear. The contents
|
|
231
|
+
of the NOTICE file are for informational purposes only and
|
|
232
|
+
do not modify the License. You may add Your own attribution
|
|
233
|
+
notices within Derivative Works that You distribute, alongside
|
|
234
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
235
|
+
that such additional attribution notices cannot be construed
|
|
236
|
+
as modifying the License.
|
|
237
|
+
|
|
238
|
+
You may add Your own copyright statement to Your modifications and
|
|
239
|
+
may provide additional or different license terms and conditions
|
|
240
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
241
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
242
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
243
|
+
the conditions stated in this License.
|
|
244
|
+
|
|
245
|
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
246
|
+
any Contribution intentionally submitted for inclusion in the Work
|
|
247
|
+
by You to the Licensor shall be under the terms and conditions of
|
|
248
|
+
this License, without any additional terms or conditions.
|
|
249
|
+
Notwithstanding the above, nothing herein shall supersede or modify
|
|
250
|
+
the terms of any separate license agreement you may have executed
|
|
251
|
+
with Licensor regarding such Contributions.
|
|
252
|
+
|
|
253
|
+
6. Trademarks. This License does not grant permission to use the trade
|
|
254
|
+
names, trademarks, service marks, or product names of the Licensor,
|
|
255
|
+
except as required for reasonable and customary use in describing the
|
|
256
|
+
origin of the Work and reproducing the content of the NOTICE file.
|
|
257
|
+
|
|
258
|
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
259
|
+
agreed to in writing, Licensor provides the Work (and each
|
|
260
|
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
261
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
262
|
+
implied, including, without limitation, any warranties or conditions
|
|
263
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
264
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
265
|
+
appropriateness of using or redistributing the Work and assume any
|
|
266
|
+
risks associated with Your exercise of permissions under this License.
|
|
267
|
+
|
|
268
|
+
8. Limitation of Liability. In no event and under no legal theory,
|
|
269
|
+
whether in tort (including negligence), contract, or otherwise,
|
|
270
|
+
unless required by applicable law (such as deliberate and grossly
|
|
271
|
+
negligent acts) or agreed to in writing, shall any Contributor be
|
|
272
|
+
liable to You for damages, including any direct, indirect, special,
|
|
273
|
+
incidental, or consequential damages of any character arising as a
|
|
274
|
+
result of this License or out of the use or inability to use the
|
|
275
|
+
Work (including but not limited to damages for loss of goodwill,
|
|
276
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
277
|
+
other commercial damages or losses), even if such Contributor
|
|
278
|
+
has been advised of the possibility of such damages.
|
|
279
|
+
|
|
280
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
281
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
282
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
283
|
+
or other liability obligations and/or rights consistent with this
|
|
284
|
+
License. However, in accepting such obligations, You may act only
|
|
285
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
286
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
287
|
+
defend, and hold each Contributor harmless for any liability
|
|
288
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
289
|
+
of your accepting any such warranty or additional liability.
|
|
290
|
+
|
|
291
|
+
END OF TERMS AND CONDITIONS
|
|
292
|
+
|
|
293
|
+
APPENDIX: How to apply the Apache License to your work.
|
|
294
|
+
|
|
295
|
+
To apply the Apache License to your work, attach the following
|
|
296
|
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
297
|
+
replaced with your own identifying information. (Don't include
|
|
298
|
+
the brackets!) The text should be enclosed in the appropriate
|
|
299
|
+
comment syntax for the file format. We also recommend that a
|
|
300
|
+
file or class name and description of purpose be included on the
|
|
301
|
+
same "printed page" as the copyright notice for easier
|
|
302
|
+
identification within third-party archives.
|
|
303
|
+
|
|
304
|
+
Copyright [yyyy] [name of copyright owner]
|
|
305
|
+
|
|
306
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
307
|
+
you may not use this file except in compliance with the License.
|
|
308
|
+
You may obtain a copy of the License at
|
|
309
|
+
|
|
310
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
311
|
+
|
|
312
|
+
Unless required by applicable law or agreed to in writing, software
|
|
313
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
314
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
315
|
+
See the License for the specific language governing permissions and
|
|
316
|
+
limitations under the License.
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
## Uiverse — "Loader" by mobinkakei
|
|
320
|
+
|
|
321
|
+
The loader the waiting line leads with under the Claude brand (`packages/client/src/features/chat-wait/chat-wait.ts` and the `dsh-claude-chat-wait-loader` rules in its stylesheet) is ported from a Uiverse loader: its three dots, its squash-and-stretch keyframes (the flat-bottomed radius the dot lands with, the round pose two fifths into the bounce, the travel to the top), its half-second period and the phase each dot starts behind the one before it — renamed into this package's own classes, read from its own motion tokens and painted with the accent in force. The snippet's three shadow ellipses are left out, so the loader carries no shadow at all.
|
|
322
|
+
|
|
323
|
+
Source: <https://uiverse.io/mobinkakei/grumpy-turtle-41>
|
|
324
|
+
|
|
325
|
+
```
|
|
326
|
+
MIT License
|
|
327
|
+
|
|
328
|
+
Copyright - 2026 mobinkakei (Mobeen)
|
|
329
|
+
|
|
330
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
331
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
332
|
+
in the Software without restriction, including without limitation the rights
|
|
333
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
334
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
335
|
+
furnished to do so, subject to the following conditions:
|
|
336
|
+
|
|
337
|
+
The above copyright notice and this permission notice shall be included in all
|
|
338
|
+
copies or substantial portions of the Software.
|
|
339
|
+
|
|
340
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
341
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
342
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
343
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
344
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
345
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
346
|
+
SOFTWARE.
|
|
347
|
+
```
|