Skip to content

v1.0.22

Choose a tag to compare

@wxtsky wxtsky released this 23 Apr 06:30
Immutable release. Only release title and notes can be modified.

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_id matching — 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 waitingOnApproval states render on the island for users of the Codex desktop app, not only the CLI.
  • 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) — hookEventName alias and nested payload.session_id compatibility 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 got quickTypeProbe byte-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 + blur in 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). fullscreenLatch now 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 activateTerminalApp relied on a custom title that most users never set. Rewritten as a single AppleScript that tries tty → auto tab name → custom title → deminiaturize-first-minimized fallback.
  • #103 — Qwen hook PermissionRequest hung until Qwen's internal timeout because the installer was omitting the per-entry timeout field 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 warningsSessionSnapshot, ChatMessage, ToolHistoryEntry, SubagentState, AgentStatus now declare Sendable; Codex supervisor bundle id marked nonisolated. 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.