v1.0.22
English
New
- Sparkle-based auto-update — CodeIsland now self-updates via the Sparkle 2 framework with ed25519 signed appcast. No more opening GitHub Releases by hand; the About page tells you when an update is ready. (Users installed via Homebrew stay managed by
brew upgrade.) From v1.0.22 onwards, Sparkle is in charge. - Session monitoring engine overhaul — four deep improvements after studying the space for a week:
- Precise
tool_use_idmatching — Claude's PreToolUse / PermissionRequest / PostToolUse now pair by id, fixing a real bug where concurrent tool invocations could cancel each other's pending approval in the same session. - Warp terminal: exact pane jumping — reads Warp's SQLite state to find the exact tab running your session, then sends
⌘<n>via a CGEvent to switch. Handles firmlink path normalization (/tmp↔/private/tmp) and prefers active > focused > newest when multiple panes match. - Live JSONL tailing for Claude — streams the transcript file via
DispatchSource.makeFileSystemObjectSource+ inode change detection. AI output now shows up in the island panel as it streams, not only when the Stop hook fires. - Codex Desktop (app-server) support (#79) — subscribes to Codex.app's JSON-RPC app-server so thread lifecycle and
waitingOnApprovalstates render on the island for users of the Codex desktop app, not only the CLI.
- Precise
- Click-to-jump on approval card (#108 by @alvis-HaoH) — clicking the permission approval jumps to the terminal tab and auto-collapses after the jump validates.
- pi-mono support (#111) — pi-mono, the 38k★ TS-plugin-based Claude client.
- Third-party CLI extensibility + bridge hardening (#120) —
hookEventNamealias and nestedpayload.session_idcompatibility in the bridge; non-blocking alarm window tightened from 8s to 4s; Hermes/Gemini events no longer get dropped on the floor. - Default mascot setting + smart-suppress in IDE terminals (#102 #112) — pick any mascot as the idle indicator; smart-suppress now applies when a recognized IDE terminal is frontmost.
- Performance benchmark guardrails — micro-benchmarks for
scanLines,HookEvent.init,drainMessages,WarpPaneResolver— CI will catch hot-path regressions now. Transcript tailer gotquickTypeProbebyte-prefilter: real-world mixed transcript 11.76ms → 5.49ms (-53%).
Bug fixes
- #100 — Approval/question cards rendered fully transparent on macOS 26 until a hover forced a redraw; also "vanished when mouse approached the notch, reappeared near the buttons." Root cause:
compositingGroup + blurin BlurFadeModifier's identity state triggered a macOS 26 compositor regression where the offscreen layer never fully rendered. Dropped the compositingGroup; blur + opacity now apply directly without the offscreen buffer. - #104 — Returning from a fullscreen space to a non-fullscreen one could leave the island hidden for up to 1.5s (or longer if fullscreen detection misreported).
fullscreenLatchnow clears immediately on space change when the new space is not fullscreen. - #116 — Clicking a Terminal.app session in the notch only shook the card because
activateTerminalApprelied on acustom titlethat most users never set. Rewritten as a single AppleScript that tries tty → auto tab name → custom title → deminiaturize-first-minimized fallback. - #103 — Qwen hook
PermissionRequesthung until Qwen's internal timeout because the installer was omitting the per-entrytimeoutfield on Claude-style hook writes. Now emits the correct ms-unit timeouts (86400000 for PermissionRequest, 5000 otherwise). - #105 #106 #107 #119 — Hook installer used to destructively reformat
~/.claude/settings.json/~/.opencode/opencode.json(stripped comments, reordered keys, escaped slashes). Now preserves user formatting, keys, and comments across install/uninstall. - Copilot — the hook installer no longer clobbers a user-set Copilot version field.
- Compiler warnings —
SessionSnapshot,ChatMessage,ToolHistoryEntry,SubagentState,AgentStatusnow declareSendable; Codex supervisor bundle id markednonisolated. Release build is now 0-warning.
中文
新功能
- 基于 Sparkle 的自动更新 — CodeIsland 现在通过 Sparkle 2 框架实现自动更新,appcast 由 ed25519 签名。不用再去 GitHub Releases 手动下载,About 页会在有新版本时提示。(Homebrew 安装的版本继续交给
brew upgrade管理。)从 v1.0.22 开始,Sparkle 接管后续升级。 - 会话监测引擎全面升级 — 一周深挖后做了四项改进:
tool_use_id精准配对 — Claude 的 PreToolUse / PermissionRequest / PostToolUse 按 id 配对。修了一个真 bug:多工具并发时 PostToolUse 会误删同 session 其他待审批请求。- Warp 终端精准 pane 跳转 — 读 Warp SQLite 找到运行当前会话的确切 tab,然后 CGEvent 发
⌘<n>切过去。处理了 firmlink 路径归一化(/tmp↔/private/tmp),多 pane 匹配按 active > focused > newest 排序。 - Claude 会话 JSONL 实时 tail — 用
DispatchSource.makeFileSystemObjectSource+ inode 换盘检测增量读 transcript 文件。流式输出实时显示在岛上面板,不用等 Stop 事件触发。 - Codex Desktop(app-server)支持 (#79) — 订阅 Codex.app 的 JSON-RPC app-server,thread 生命周期和
waitingOnApproval状态都能精确映射到岛。Codex 桌面 app 用户(不只是 CLI)也能享受权限审批识别。
- 审批卡片点击跳转 (#108, by @alvis-HaoH) — 点权限审批跳转到终端 tab,跳转验证成功后自动收起岛。
- pi-mono 支持 (#111) — pi-mono 是 38k★ 的 TS 插件式 Claude 客户端。
- 第三方 CLI 扩展性 + bridge 加固 (#120) — bridge 兼容
hookEventName别名和嵌套payload.session_id;非阻塞 alarm 窗口从 8s 收紧到 4s;Hermes/Gemini 等 fork CLI 的 hook 事件不再静默丢弃。 - 默认角色设置 + IDE 终端智能抑制 (#102 #112) — 无会话时可以选任意 mascot 作为岛上默认角色;智能抑制现在对所有被识别为 IDE 终端的前台 app 生效。
- 性能 benchmark 回归闸 — 为
scanLines/HookEvent.init/drainMessages/WarpPaneResolver加了微基准,CI 会抓热路径回归。Transcript tailer 新增quickTypeProbe字节预筛:真实混合场景 11.76ms → 5.49ms (-53%)。
Bug 修复
- #100 — macOS 26 上权限/询问卡片一弹出就透明,hover 才显形;而且"鼠标移向刘海 → 消失、移回按钮位置 → 重现"。根因是
BlurFadeModifier在 identity 态里用了compositingGroup + blur,macOS 26 的 SwiftUI 合成器对这个组合有回归:offscreen 层的渲染结果异常,直到某个 invalidation 触发重新合成。去掉了 compositingGroup,blur+opacity 直接作用在子视图上,不再触发合成器 bug。 - #104 — 从全屏 space 切回非全屏 space 时,岛可能被隐藏最长 1.5s(全屏检测误报时更久)。
fullscreenLatch现在在 space 切换时立即清除,不再等 1.5s poller。 - #116 — Terminal.app session 点击跳转只看到卡片抖一下。原因:
activateTerminalApp依赖大多数用户从没设过的custom title,匹配不到就什么都不干。重写为单个 AppleScript:tty → auto tab name → custom title → deminiaturize 最后一个兜底。 - #103 — Qwen 的 hook PermissionRequest 会挂起直到 Qwen 内部超时。原因:installer 在写 Claude 风格 hook entry 时漏了 per-entry 的
timeout字段,Qwen 靠这个控制每条 hook 的超时。现在正确填 ms 单位超时(PermissionRequest 86400000 = 24h,其他 5000 = 5s)。 - #105 #106 #107 #119 — Hook installer 之前会破坏性重排
~/.claude/settings.json/~/.opencode/opencode.json(删注释、改字段顺序、escape 反斜杠)。现在 install/uninstall 全过程保留用户格式、字段顺序和注释。 - Copilot — hook installer 不再覆盖用户手动设置的 Copilot version 字段。
- 编译警告清理 —
SessionSnapshot/ChatMessage/ToolHistoryEntry/SubagentState/AgentStatus全部声明Sendable;Codex supervisor bundle id 标nonisolated。Release build 0 warning。
Thanks to contributors: @alvis-HaoH @Hatiaa and everyone who opened issues or shared reproduction steps this cycle.