消息中心 / Message Center — 全局消息与状态接口(0.5.4) 消息中心启用后,以灵动岛展示消息。关闭时不收集待显示通知,不启动提示音或全局气泡。消息为运行期记录,不写入聊天历史、不调用模型。 0.6.20 设置补充:父组件“消息中心”与其子项“灵动岛”分开。island.inApp 默认 true,仅控制应用内顶部消息展示;false 时不追加/保留灵动岛队列,但仍处理允许类别的系统通知、提示音与既有消息状态。其他通道分别由 systemNotifications、bubbles、soundEnabled 控制,消息中心父组件关闭则全部停止。自 0.6.21 起,允许通知的插件/任务/更新按钮同时过滤提醒来源及对应类别的气泡;全局气泡总开关仍独立控制是否加载气泡显示。提示音不依赖灵动岛 DOM 是否挂载;关闭期间的旧消息不补播。界面中文族语言使用中文,其他使用英文。 通知类别:plugins(插件变化及已检测更新)、tasks(任务完成/失败/需输入)、updates(DSH本体更新)。分类关闭时对应气泡不可见;重新开启按权威来源的最新状态恢复,不补播旧提醒、不复活已读或已清除的完成状态。 窗口可见且拥有焦点时只显示灵动岛;否则在标准Notification API已授权时额外尝试系统通知。设置页面提供明确用户点击的授权入口;没有桌面通知私有桥接、服务工作线程或远程推送服务,不承诺iOS网页关闭后的推送。 浏览器消息: window.dispatchEvent(new CustomEvent('tanuki:notify', {detail: { id: 'your-component:operation-unique-id', category: 'plugins', kind: 'plugin.available', title: {zh: '插件有新更新', en: 'Plugin update available'}, message: {zh: '发现可用更新。', en: 'An update is available.'} }})); Host消息: ctx.emit('tanuki/global-message', { id: 'your-component:operation-unique-id', kind: 'error', title: {zh: '操作失败', en: 'Operation failed'}, message: {zh: '请查看错误信息。', en: 'Please review the error.'} }); kind以plugin./task./dsh.update开头时可推导分类;其他一般消息保留统一入口。id应标识真实操作,重复id去重。正文使用纯文本双语对象,不传HTML。kind:error显示警告,不用成功勾冒充成功。 浏览器刷新不重播已消费的Host消息;关闭后不积攒消息。短时Host热重载可能保留尚未消费的有界记录,显式关闭清理。 GET /tanuki-toolbox/notifications复用DSH连接授权,没有未鉴权外部消息写入接口。 全局气泡(内部全量快照,不是提醒消息): window.dispatchEvent(new CustomEvent('tanuki:bubble-state', {detail:{ source:'plugin-center', items:[{id:'update:package-name',target:'plugins',packageName:'package-name',state:'action',count:1}] }})); - source当前仅notifications及plugin-center;每次items替换该source全部状态,空数组清除。notifications 同时携带 categories:{plugins,tasks,updates} 显示偏好;仅该权威源可更新分类过滤。插件目标(plugins/plugin-updates)归插件,workspace 会话归任务;notifications 的明确 category 可指定一般消息(如离线状态),避免误受任务分类控制。装饰层保留最新来源快照,仅过滤显示,分类重开恢复当前有效状态。 - state:done绿、action黄、error红、running蓝。任务target:workspace并带sessionId;插件target:plugins并尽可能带packageName。 - 发布方监听tanuki:bubble-request重播当前快照;不得把快照重播当成新的通知。 - 同一项使用稳定id,不能每次刷新累计。任务已读及状态清除由权威状态源处理,装饰层不猜测任务状态。 - 全局气泡单独懒加载,不发网络请求。最多三种颜色;同时四种时整泡隐藏,总数>1才显示数字,蓝圈循环增长并遵守减少动态效果设置。 - 插件中心关闭后不保留它的状态、扫描器或更新提醒入口。原生尚无已核实的通用可更新数量接口,不能发现任意第三方插件没有暴露的更新。 提示音:默认Web Audio本地合成,默认音量50。明确用户拖动结束后可试听;保存音量单独提交。恢复默认同时原子保存audio:null及volume:50,分类/气泡设置不变。自定义MP3/WAV/OGG最大5MiB,上传前解码验证。自动播放受限时不补播旧消息。设置试听资源与通知运行资源独立清理。 实现:lib/notifications.cjs(Host),lib/island-client.cjs(通知队列),client-src/dynamic-island.template.js(平台状态与子功能生命周期),lib/audio-preview-client.cjs(共享音频工厂),client-src/global-bubbles.template.js及lib/global-bubbles-client.cjs(气泡)。 新版本仅静态检查和必要构建;历史测试不代表这些新增通知/气泡/系统权限行为已通过功能或跨平台验收。 0.5.17: plugin-center 源新增 plugin-updates 目标,供更新全部按钮使用。按可执行更新去重计数,复用全局气泡开关、状态颜色、优先级与数字规则;不计入 plugins 目标,避免侧栏重复计数。 0.6.9 消息跳转 / Navigation 灵动岛主体及系统通知使用同一规则,关闭按钮仅关闭提示。任务按 sessionId 打开对话;插件按 packageName / pluginCategory 打开已安装列表,pluginCategory 为 official 或 installed(第三方),卸载通知保留卸载前的分类。安全/保护启动消息 launch.protected 自 0.6.19 起固定进入插件中心 → 已安装 → 第三方(内部 category:installed),从详情返回列表,不打开启动保护设置;dsh.update 消息打开原生更新窗口。 可选 destination 为纯数据: {page:'session',sessionId:'actual-session-id'} {page:'plugins',category:'installed'} {page:'settings',section:'tanuki-toolbox',component:'composer'} {page:'schedules'} / {page:'home'} / {page:'updates'} page 仅允许上列值。settings section 必须已在原生设置中注册;component 只定位本工具箱六个组件。Host 仅传递这些受限字段,不接受任意 URL、HTML 或回调。未声明目标的一般消息进入消息中心设置。消息点击不会下载、安装更新或重新执行任务。 0.6.12 点击系统通知唤起桌面 灵动岛点击已在 0.6.9 实现,本版系统通知点击补充桌面唤起。仅主应用 dsh-app://app 在明确通知点击后发出经过连接授权的 POST /tanuki-toolbox/notifications/activate(X-Tanuki-Notification-Click: 1),调用当前桌面 Host 的固定 DSH 外壳;利用单实例锁恢复/显示/聚焦已有窗口。无任意 URL、路径、PID 或命令参数输入,不修改宿主。普通网页只尝试 window.focus;系统限制或宿主形态不匹配时仍保留页面导航,但不保证前台抢占成功。 可选 destination 进一步接受 scheduleId、packageName、entryId(均为长度不超过 250 的字符串),以及消息顶层 scheduleId/entryId。任务优先 sessionId 对话;destination.page=schedules 且 scheduleId 指定真实任务时才在原生自动化列表选中该任务;不按显示标题猜测。插件仍按官方/第三方分类定位卡片,插件中心关闭可定位原生卡片。目标已删除时保留所属页面;关闭通知只关闭,点击不会执行任务或更新插件。 0.6.22 灵动岛显示规则:每条从接收进入显示起保持 8000ms,悬停/焦点不暂停。最新消息在顶部外侧进入,上一条向下移;最多两条活动消息,第三条淘汰最旧的一条并用 320ms 向下淡出,无隐藏排队补播。明确关闭、跳转成功也使用退出动画,父组件停用或 inApp 关闭则立即清空与取消计时器。返回前台按绝对期限清理过期消息。更新查询本身不发布 running 气泡,只在插件中心展示检查文字;真实安装更新进度仍保留。 0.6.23:灵动岛顶部位置采用 --dsh-frame-overlay-top(含 Mac 全屏状态)计算,不再固定保留窗口标题栏间距。macOS 系统通知点击使用固定 /usr/bin/open -a 加当前已核实的 .app 路径请求激活现有应用;导航和授权规则不变,不保证覆盖 macOS 的通知权限、专注模式或前台激活限制。