@ alwith/module-desktop- shell (简体中文)
用于创建的默认桌面能力:本土macOS/Windows/Linux菜单,macOS材料和不透明回落的Windows acrylic,以及Atlas本土 trackpad支持. 本地窗口框架保留了Windows Close/minimize/maximize和系统快速行为. 此初始执行不复制U自定义的Windows上覆控制.
这个包裹拥有本土行为及其JS桥. 生成的 shell 块拥有 React 版式并可以被编辑或替换. 不需要行高,颜色,半径或标题栏的造型配置.
在生成的应用程序中安装
使用已发布的 npm 包并带有cet 版本; 永远不链接维护者退出 。 在货运,取决于 alwith-desktop-shell = "0.6" 从箱子。 登记册 .plugin(alwith_desktop_shell::init("en")) 和赠款 alwith-desktop-shell:default 到主窗口。 主窗口配置来自 desktopWindow(appConfig) 内 @alwith/module-desktop-shell/config。 。 。 .
导入样式.cs后的主题样式. 等着 initializeDesktopShell() ; 如果初始化失败, 保留不透明默认值。 使用 .desktop-shell, (中文(简体) ), .desktop-shell-navigation 财务报告和审定财务报表 .desktop-shell-workspace 在默认块中。 连接Atlas系统 connectDesktopAtlas(controller) 在替换/卸载时处理返回的函数。 订阅 onDesktopNewChat 仅在已认证的聊天页面被挂载时,将返回的收听器移入卸载(包括同步的注册比赛).
原生菜单标签取用应用程序的用地. 品牌取自Tauri所生成的产品Name. 菜单动作只发布到焦点网页视图. 标准编辑/窗口命令使用操作系统执行.
菜单是应用程序对 U 快捷键的单项注册: New Chat ()CmdOrCtrl+N, (中文(简体) ),
首选项... (CmdOrCtrl+,,在 macOS 上的应用程序菜单中,在其它文件下)并查找
(单位:千美元)CmdOrCtrl+F,在"编辑"下). 每次点击或加速发射 alwith-shell:<action> 页:1
焦点网络视图; 订阅 onDesktopMenu("new-chat" | "settings" | "find", handler) 时
的页面中,含有该动作的页面会被挂载,并处理未挂载的收听器。 页面不注册
他们自己的 keydown 这些密钥的处理者.
所有权和释放
通过npm升级. 公共npm文物中的Rust源船. 默认反应标记(Default React markup)属于Creative-alwith的注册区块;消费者可以在保留本土能力的同时取而代之.
该套件包括原生SDK源和第三方通知. Windows设备接受情况另行跟踪.
替换完整的菜单
带有完整的菜单登记册的应用程序 alwith_desktop_shell::init_native() 改为 init(locale)。它获得相同的命令、本土材料和图集,但没有默认菜单。 在应用程序中保留菜单构建和动作路由. 不要同时打电话 atlas_tauri::install。 。 。 .
安装自己的窗口材料和Atlas(带有桌面)登记册的应用程序 init_with_options(locale, ShellOptions::new().host_native_window(native_backdrop)) 改为: locale None 当它也拥有菜单时。 贝壳也打不通 set_effects 也没有 atlas_tauri::install (阿特拉斯拒绝第二次安装)和报告 backdrop 作为 "native" 何时 native_backdrop 没错, "opaque" 否则. init, (中文(简体) ), init_with, (中文(简体) ), init_native 财务报告和审定财务报表 init_native_with 继续安装两者.
没有Atlas页面布局的应用程序可以导入初始化和菜单事件 /native。该条目没有 Atlas JavaScript 依赖性,也不强制导航或侧边栏标记。 原生手势安装仍然是外壳的一部分;只有使用Atlas控制器调用连接DesktopAtlas的页面.
品牌配置
导入文稿 configureProject 从 @alwith/module-desktop-shell/build。它从 alwith.app.json 生成本地配置和图标,保存用户拥有的页面,并在保留应用程序显示名的同时使用本地二进制软件包名称。 生成的项目并不依赖于创建- 附加 .
聊天预设需要 chat 财务报告和审定财务报表 store。包含 auth 内 modules 仅针对包含账户整合的应用程序; 本地授权资源和宠物资产权限除外.
显示模块库
Bun 中转脚本导入 stageNativeModule 从 @alwith/module-desktop-shell/stage 在构建时将模块的私人库复制到应用程序中。 它只在Node/Bun运行,从不在网页视图中运行.
import { stageNativeModule } from "@alwith/module-desktop-shell/stage"
const staged = stageNativeModule(import.meta.url, "editor", "aarch64-apple-darwin", nativeDirectory, licenses, contract)
for (const file of staged) if (file.signing === "resign") await sign(file.path)
stageNativeModule(from, module, target, destination, licenses, contract?) 解析已安装 @alwith/module-<module> 软件包来自 from (通常是中导脚本) import.meta.url),将其库取出一个 Rust 目标,复制它(以及设备帮助器,使可执行) destination 和许可证进入 <licenses>/alwith-native-<module>/,然后返回每个已播放的文件为 { path, signing }数字 : resign 为AL With图书馆和助手, 应用程序以自己的身份标出其标识, resource 为许可证文件。 任何不匹配的抛出。 分阶段文件是构建输出,必须被 Git-ignored .
工艺布局是同Al-With模块签订的合同,后者 scripts/lib/native-artifact.ts 在发布前验证相同的字段,并另外拒绝目录中出乎意料的文件和执行源. 每个模块包携带,每个支持的平台, native/<os>-<cpu>/数字 :
artifact.json数字 :{ module, contract, abi, target, binary, sha256, helper? }。 。 。 .module是模块身份( e)editor, (中文(简体) ),chat-network(......) ; (......);contract整数合同生成(至少1个,并等于contract当召唤者过一位;abi实值1· ;target目录的粗略目标;binary库文件名;sha256其六级SHA-256;helper(仅在macOS上的设备, 并需要在那里){ binary: "alwith-device-helper", sha256, revision }带有40个特征的xx源修订.- 图书馆的名字
libalwith_native_<module>.dylib(单位:千美元)darwin-arm64, (中文(简体) ),aarch64-apple-darwin, (中文(简体) ),alwith_native_<module>.dll(单位:千美元)win32-x64, (中文(简体) ),x86_64-pc-windows-msvc)或(或)libalwith_native_<module>.so(单位:千美元)linux-x64, (中文(简体) ),x86_64-unknown-linux-gnu,只有计算机)-在模块中替换为_。 。 。 . THIRD_PARTY_NOTICES.md财务报告和审定财务报表licenses/,与包裹的LICENSE. 共通性被拒绝.
包裹 package.json name 必须是 @alwith/module-<module>。缺少软件包、缺少平台目录、不支持的目标、外国身份、合同、ABI或文件名称,以及检查和错配,每个都使构建失败.
更新
可选 updates 对象打开签名的自动更新 : {"pubkey": "<Tauri updater public key>", "github": "owner/repo"},或 endpoints 改为(或以前) github 用于 HTTPS 主机, 如产品特定版本服务 : "endpoints": ["https://api.example.com/apps/my-app/update/{{target}}-{{arch}}/{{current_version}}"] (插件填充) {{target}}, (中文(简体) ), {{arch}}, (中文(简体) ), {{current_version}} 财务报告和审定财务报表 {{bundle_type}}) (中文(简体) ). requireSignedVersion 默认为 true。 。 。 . configureProject 发射 plugins.updater 有公用钥匙, 终点, requireSignedVersion 财务报告和审定财务报表 windows.installMode: "passive"; 无 updates 配置不变.
申请登记册 tauri_plugin_updater::Builder::new().build() 仅在 alwith_desktop_shell::updates_configured(context.config()) 是真的: 端点和一个公钥都存在, 同样的测试是 shell 。 此 shell 然后运行每个 AL 桌面应用程序的一个标准更新器 :
- 它检查30秒后和小时, 下载一个命中直走(30 s检查和300 s下载超时), 通过一个
.partfile, 校验并分级它: 在 macOS 上, 归档被提取成一个完整的捆绑在更新器缓存中. 国家变成ready只有在更新阶段才进行. - 在更新准备就绪的同时,其发布身份每5分钟重新验证一次(30秒超时). 撤回或替换的释放被放弃,目前的释放立即取出.
- 点击不问网络 。 macOS重命名被相接的捆绑在同一卷上的位置(APFS允许的原子交换;否则两个带有回滚的重命名),当安装位置无法写出或者放在另一个卷上时倒回插件自己的特权替换. Windows立即发射已核实的安装器. 然后程序通过
request_restart(),因此,这是RunEvent清理运行. 日志记录从点击到重新启动的时间 . - 分阶段更新能活下来重启:在启动时,其存档会再次被验证为与缓存的发布表(签名和签名版本)相匹配,再次上演并重新验证.
- 一个锁序列检查,下载,再验证,恢复和安装. 外壳在出口时会阻止更新器本身.
- 更新者留下
disabled当缓存目录不可用时,没有端点或公钥,在调试中构建.
Rust 选项通过 init_with(locale, options) 或者说 init_native_with(options) 与 UpdaterOptions::new()数字 : .install_window("main") 将安装限制在一个窗口, .enable_in_debug(true) 选择在Windows内和上构建调试 .on_before_exit(|app| ..) 在安装器替换应用程序之前运行( 停止子进程; 插件另调用) cleanup_before_exit与 .on_failed_install(|app| ..) 当安装器失败时恢复它停止的状态 . .on_before_exit_async(timeout, |app| Box::pin(async move { .. })) 点击后运行在每一个平台上, 请求更新, 并在更新到位前运行( macOS 捆绑互换, Windows 安装器启动), 用于命令同步关闭, 如排水 Drive; 钩子返回 Result<(), String> (单位:千美元)updater::BoxFuture) (中文(简体) ). 最多还等着呢 timeout: 出错或超时 明确中止安装( 更新保留, 点击返回错误) 和 on_failed_install 运行. on_failed_install 每次尝试最多运行一次,无论是同步钩子,Windows钩子还是两者都在失败前运行. 在窗口上 on_before_exit 在安装器启动之前, 仍然运行 。 通过所有选项 ShellOptions::new().updater(..) 与 init_with_options 当本地窗口是主机.
DesktopNavigationFooter 默认显示进度并重新启动卡(通过) status ),主窗口询问每个已准备好的版本是否重启. useDesktopUpdater() 是应用程序自己的卡、对话框或铁路的无头钩: state, (中文(简体) ), busy, (中文(简体) ), error, (中文(简体) ), prompt, (中文(简体) ), status (用于检查、下载、装入、准备、更新或已停用的标签), check(), (中文(简体) ), install(), (中文(简体) ), confirmInstallAndRelaunch(), (中文(简体) ), requestInstall() 财务报告和审定财务报表 dismiss()。 。 。 . configureDesktopUpdater({ prepare, finishPreparation, onStateChange, dialog }) 按窗口设置钩子 : prepare 在确认后运行和安装前运行(保存工作,关闭入院);释放后再次检查,拒绝另作选择; finishPreparation(installed) 始终遵循; onStateChange(state, previous) 观察每一个变化; dialog: "custom" 套装 prompt 用于应用程序对话框而不是平台问题。 安装失败被浮出水面 error。 。 。 . getUpdaterState(), (中文(简体) ), onUpdaterState(), (中文(简体) ), checkForUpdates() 财务报告和审定财务报表 installUpdateAndRelaunch(expected?) 是下面的简单函数。 所有费用都包含在内 alwith-desktop-shell:default; 无 updater:* 需要许可。 私人密钥从未进入工程: 创建- 附加它写入 ~/.tauri/<name>.key 发布工作流程从 TAURI_SIGNING_PRIVATE_KEY 暗号.
本地应用程序构建不创建已签名的更新器档案,也不需要更新器私钥. 发布工作流程选择使用 tauri build --config '{"bundle":{"createUpdaterArtifacts":true}}' 并提供他们的签名钥匙。 公共更新器端点仍在应用程序中配置.
页 次
desktopShellPages() (单位:千美元)./vite)是每个HTML条目的Vite插件. 在第一页画之前
取回 shell 记住的主题, 所以没有窗口闪出错误的方案 ; setThemePreference
记得它, 和应用程序 保持主题 在自己的商店呼叫 rememberThemePreference 每当他们
应用它。 单位 index.html 它也会填满空地 #root 中键的“带有文字标记”
主窗口直到 React 挂载。 添加到 plugins 内 vite.config.ts 保留
<div id="root"></div> 空无相.
主窗口
DesktopWorkspace (单位:千美元)./react)是 AL With U 的主窗口,每个应用共享的实现窗口: a
主屏幕 持续导航 主屏幕 panes 和可选 trailing 车站运行
一个阿特拉斯画布。 主机提供相片;外壳拥有几何,手势,相片,概览和相片
窗口铬.
panes排列顺序id也是其区域名称( U 通行证)chat,则preview) (中文(简体) ). 邻居共享屏幕,同时保留他们的min(默认为320起),否则下起 移动到下面的屏幕整体.hidden折叠窗格至无宽度并保持其内容挂起; 无法隐藏窗帘.maximized给一个窗帘 整个屏幕,和resizable设置分隔符 在它的起始边缘.screen(单位:千美元)"main" | "leading"和onScreenChange选择屏幕;useDesktopCanvas()给出内容 画布在工作空间内(navigate(paneId | "trailing"), (中文(简体) ),region, (中文(简体) ),trailingActive, (中文(简体) ),budget) (中文(简体) ).initialNavigationPinned财务报告和审定财务报表onNavigationPinnedChange在本地窗口后驱动指针切换 控制(80px在全屏外的macOS上,8px在别处)。 不固定,导航隐藏并浮出水面 回到起点 东道主坚持选择;电话是连续的。 根带data-sidebar-mode="pinned" | "floating" | "hidden"。 。 。 .toolbar坐在标题行的尽头,statusBar在下行( Atlas pagination 分享它),overlays在画布后。 环绕每页.main-chat-surface用于四舍五入的页面表面.labels默认为desktopNavigationLabels(navigator.language); 也通过direction, (中文(简体) ),trackpad(主机的轨道板偏好),zoom, (中文(简体) ),openLink财务报告和审定财务报表onError。 。 。 .- 以
DesktopNavigationFooter(单位:千美元)status首先,然后脚行为 艾尔维的竞选位置在他们之间。 没有它,槽就坐落在导航脚下. - 从导航打开的门户菜单将函数调用到
DesktopNavigationOverlayContext这么说 漂浮导航保持开放. - 在 Windows 上,将应用程序包入
DesktopWindowsShell(单位:千美元)icon, (中文(简体) ),title, (中文(简体) ),zoom: 它绘制标题栏行 和工作空间门户 切换和工具栏. - 导航以ALWIT的竞选槽结束. 这是工作空间的一部分,不是选项:是否 显示由应用程序的身份决定, 应用 AL With ships 本身不携带任何.
这个 ./react 条目还提供 DesktopHeader, (中文(简体) ), DesktopLeading 财务报告和审定财务报表
LeadingNavigation:主屏幕为 U's 48px 的图标键轨并有内端
工具提示( r)items 标识、标签、图标和点击; activePage 第1页)
它所选择的,由主机制作为 DesktopLeading孩子们 供应页面内容和导航动作;软件包拥有图集组成,本土手势接线,头相距和地表几何. 导入 ./theme.css 用于共享 U 主题和 ./tailwind.css 用于生成的拖风捆绑。 其他产品可能通过省略这些选择进口而保留自己的主题.
chooseFolder(defaultPath?) 从 ./native 打开平台的文件夹对话框并解析
选择路径,或 null 当用户取消时; 聊天块将其交给对话主机作为
chooseFolder 用于项目选取器草稿。 已经包括在内 alwith-desktop-shell:default。 。 。 .
openDesktopGuide(title) 打开或聚焦一个 guide.html 窗口( U 用户指南: 1000x760),
; 应用程序提供该页面并给予与该页面相同的窗口权限
设置.
设置窗口和外观
./settings 是 U 的设置窗口 : AuxWindowShell (辅助窗口框架与
车灯下侧栏, SettingsLayout (包含 30px 导航行的段落列表)
和中心内容栏; navigation 段落后添加行, 如扩展名
设置页面, SettingGroup 编号 : SettingLabel 编号 : SettingRow (进口) ./settings.css页:1
该 shell 可拥有的段落 : AppearanceSection (主题行:轻/系统/暗),
GeneralSection (版本和语言行;应用程序提供语言列表和
处理器,以及儿时多行)和 AboutSection (捆绑的代码版本,然后是
应用程序的行,例如更新和许可证). useHideOnClose() 隐藏窗口而不是
关闭它,所以重新打开是即时的。 标签来自 desktopSettingsLabels(language)。 。 。 .
./theme 拥有外观偏好: 调用 initializeDesktopTheme() 在每一页前
第一条; setThemePreference("light" | "dark" | "system") 保存, 应用 .dark
类和本地窗口主题( grant) core:app:allow-set-app-theme并告诉对方
通过 Tauri 事件窗口;
useDesktopTheme() (从) ./settings)读取React中的首选和已解决的主题.
openDesktopSettings(title, section?, options?) 打开或聚焦一个 settings.html 窗口; 与 section 它打开该节(?tab=)或,当窗口已经存在时,通过 settings-change-tab 事件,哪个 useSettingsSection(sections, fallback?, onChange?) 从 ./settings 其后; onChange(id) 在主窗口要求的每个切换上运行(U关闭一个打开的扩展设置页面). 选项, 全部可选 : defaultSection (单位:千美元) ?tab= 新建窗口,无需 section; 默认无,因此页面倒回 "general", (中文(简体) ), backgroundColor (新窗口的陶里语) Color),以及 attach(label),在每次显示和焦点之前运行(U在macOS上重新显示窗口到主窗口;拒绝宣传,窗口不显示)。 在应用程序中提供该页面并授予标准 Tauri 网页视图创建、显示和焦点权限。 设置内容不启动聊天运行时会话 .
概览
DesktopWorkspace 连接共享概览标题、捆绑的 Caveat 字体,
口音颜色和社会联系。 这些是外壳显示,而不是Atlas版式.
使用Atlas的应用程序直接连接同一演示文稿并处理
当其控制器更改时:
import { connectDesktopOverview } from "@alwith/module-desktop-shell/overview"
import "@alwith/module-desktop-shell/overview.css"
const disconnect = connectDesktopOverview(atlas, { openLink: openExternal })
// On unmount, before destroying the Atlas controller:
disconnect()
Atlas拥有概览几何,导航和下巴双击手势. Shell观察概览状态;模板不复制标题或CSS.
运行时间状态条目
DesktopStatusItem (单位:千美元)./status-item,也从 ./react)为桌面
右下角终端图标和上开状态弹出. 通过服务器
URL/环境,应用程序版本,可用更新和实际运行时间 CLI
版本/路径。 shell 拥有渲染; 主机拥有查询和打开 URL
或显示本地可执行文件。 提供被翻译的标签和一个错误处理器.
没有投票或自动重试。 缺失的数值仍然缺失,永远不会
假装是一个健康的连接。 环境指标描述建筑
配置,不是服务器可达性. 非标准环境/标志标签
替换图标,按服务器第一顺序。 远程 CLI 版本为纯文本.
在主机现有的右下角槽中渲染此条目; 它不创建 (a) 页脚或更改阿特拉斯图页页脚。 包含此软件包的 JavaScript 在主机 Tailwind 源扫描中,与其他 shell React 组件一样.
DesktopStatusBar 是 AL With 桌面的整个下行: 线索 start 插槽
(延长状态),a end 状态项目( 驱动同步) 前的槽, 以及
状态项目读取应用程序版本和被捆绑的 Codex CLI 本身。 过
server 当应用程序与 AL 服务器交谈时 readCli 当运行时间
运行另一个CLI. DesktopWorkspace 调制 <DesktopStatusBar /> 何时
statusBar 被省略,所以每个应用程序都显示同一角;通过 statusBar={null}
藏起来.
许可证
版权:2026 ALWITHAI PTE. LTD. 仅凭GNU Affero通用公共许可证 v3
(单位:千美元)AGPL-3.0-only; 见 自由主义ALWI提供商业许可证
无法满足 AGPL 条件的应用程序。 第三方材料保留其自己的许可证,列于
第三次议会 NoTICES.md。 。 。 .
捐款按 缴款许可证协议 这样这个项目就可以留下来了 双许可; CLA bot 请求在您的第一个拉取请求上签名 .