工作原理

九件事,按发生的顺序

每一章讲一个概念,用普通人的话:它是什么、不是什么、KernelHub 拿它做什么。这一页上的每一段动画和每一张表,都是 v1.0.2 今天就有的。

关系图:你指挥一位 AI 员工;它的 Agent 与技能经过 KernelHub 治理层(工作区、权限、环境、记忆、Runtime Router)到达 Runtime,再到你 Mac 或 Windows 上的执行体,执行体交回 diff、产物和结果。另一条通道里,iPhone 和 Android 向 KernelHub 发任务、做批准、读结果 —— 手机从来不是执行体。 AI 员工 Agent / 技能 KernelHub 治理层 工作区 权限 环境 记忆 Runtime Router Runtime 执行体 你的 Mac / Windows Diff · 产物 · Result iPhone / Android 任务 · 审批 · 结果 手机不是执行体。它发任务、做批准、读结果。 图上每一个框在 v1.0.2 里都存在,没有一个是占位。 KERNELHUB v1.0.2 · CONCEPT MAP
01

AI 员工

你雇的那一个。一个有名字的角色 —— 比如 AI 开发者 —— 有定义、它声明的技能、这些技能需要的环境、被指派的工作区、它在其下工作的权限,以及随着干活积累起来的任务、记忆和结果。

它不是

它不是一段聊天,也不是模型。雇一个员工不会扩大你机器上能做的事 —— 那仍然由权限决定。

KernelHub

KernelHub 把员工放在账户这一层:它的角色和技能在被指派的每个工作区里都一样,管理台会如实报告它的环境是不是真的就绪。

EMPLOYEE FLOW
动画:雇一位 AI 开发者,指派到一个工作区,它读取、修改、构建;跑构建之前在手机上弹出审批卡;产出一个产物;带着证据报告结果。 KERNELHUB v1.0.2 · EMPLOYEE FLOW 01 HIRE 雇用 AI 开发者 02 ASSIGN 指派 到一个工作区 03 WORK 干活 读 · 改 · 构建 04 APPROVAL 审批 在你手机上 05 ARTIFACT 产物 app-debug.apk 06 RESULT 结果 完成,附证据 AI 开发者 kotlin · gradle · git ~/projects/app read PermToggle.kt edit DateUtils.kt +8 −3 exec ./gradlew → ? 9:41 PERMISSION · EXEC 要跑 Gradle 构建吗? 就这一次 app-debug.apk 12.4 MB · sha256 ✓ +8 −3 · BUILD OK 构建在跑之前停下来,在你手里的设备上问一句。产物和结果之所以存在,是因为执行体真的把活干了。

横向滑动看完整条链 →

02

Agent

员工干活时用的智能:理解任务、规划、推理、调工具、决定下一步做什么。

它不是

决定了,不等于被允许。Agent 可以提议写一个文件,但它写不了。

KernelHub

KernelHub 不造自己的 Agent,也从不亲自调模型。它治理你已经在用的那些 Agent:它们想做的每一个动作都要经过工作区、权限契约和执行体。

AGENT GOVERNANCE
动画:AI 员工的 Agent 决定写一个文件;请求经过 KernelHub 治理层到 Runtime,再到执行体;在 WRITE 与 EXEC 的边界上权限闸拦住它,手机上出现审批卡,你放行之后,执行体才把改动落到本机。 INTELLIGENCE ≠ AUTHORITY AI 员工 Agent KernelHub 治理层 工作区 权限 环境 记忆 Runtime Router Runtime PERMISSION GATE 执行体 你的机器 src/Auth.kt read ✓ 已写到你的机器上 +3 −1 READ src/Auth.kt WRITE src/Auth.kt 9:41 PERMISSION · WRITE 允许这条任务 WRITE 吗? 允许 READ 自己就过。你还没批的 WRITE 或 EXEC 在闸前停下,去你手机上问。Runtime 从不碰磁盘;碰磁盘的是执行体,而且只在闸开了之后。

横向滑动看完整条链 →

03

Runtime

承载 Agent 智能的模型(Runtime)—— Claude Code、Codex、Qwen Code、Antigravity(agy)、MiMo 等,由你自己安装、自己登录。

它不是

Runtime 不是员工。换掉它不会改变你雇了谁、他们被允许做什么、在哪个工作区干活。

KernelHub

Runtime Router 会挑一个在这台机器上真接得了这条任务的 Runtime。不管跑的是哪一家,它的写、改、执行都经过同一个内建 Tool Server,对照你的授权核过 —— 不是一句请模型自觉的提示词。

Runtime执行联网推送删除状态
claudeKernelHubRuntime 原生Runtime 原生KernelHubKernelHubKernelHub正式支持
codexKernelHubRuntime 原生Runtime 原生KernelHubKernelHubKernelHub正式支持
mimoKernelHubKernelHubKernelHubKernelHubKernelHubKernelHub正式支持
opencodeKernelHubKernelHubKernelHubKernelHubKernelHubKernelHub正式支持
qwenKernelHubKernelHubRuntime 原生KernelHubKernelHubKernelHub正式支持
acpKernelHubKernelHubKernelHubKernelHubKernelHub未就绪
agyKernelHubKernelHubKernelHubKernelHubKernelHubKernelHub未就绪
codebuddyKernelHubKernelHubRuntime 原生KernelHubKernelHubKernelHub未就绪
geminiKernelHubRuntime 原生Runtime 原生KernelHubKernelHubKernelHub未就绪
kimiKernelHubKernelHubKernelHubKernelHubKernelHubKernelHub未就绪
mcpKernelHubKernelHubKernelHubKernelHubKernelHub未就绪
ohmypiKernelHubKernelHubKernelHubKernelHubKernelHub未就绪
piKernelHubKernelHubKernelHubKernelHubKernelHubKernelHub未就绪
Runtime 原生

这家 Runtime 自己有可验证的开关,KernelHub 把授权落到它的参数上。验证方式是真把命令行拼出来看,不是读它的文档。

KernelHub

这家 Runtime 自己没有这一档的开关,这一格由 KernelHub 在它进程外面加的那道 OS 外层边界守着 —— macOS 上是 seatbelt、Linux 上是 Landlock,这两个平台默认打开;Windows 上这一版默认关闭,那样的机器上这一格印成「—」。它是可选的加固层,不是干活的前提;不管这一格是什么,写、改、执行照样先经 Tool Server 按你的授权和工作区边界核过。

这台机器上证不出有谁守住这一档。这一家会标 NOT_READY —— 那是记账,不是拦路:它照样接活,每一次写、改、执行照样要过你的授权、工作区边界和执行规则。

04

执行体

你自己机器上的受控执行层:icloser 这个进程。它落实被授权的动作 —— 读、写、执行、构建、测试、git、产物、设备 —— 并报告发生了什么。

它不是

它不是 Agent。它自己没有智能,也没有自己的权力;它受权限契约和工作区契约约束。

KernelHub

执行体有一道自己的闸:一条命令到了它这里、却没有所需的授权,就在跑之前被拒掉,不管是哪家模型要跑它 —— 而且它做的每一步都记账。

AI 员工

你雇的那一个

不是一个聊天窗口,也不是 Runtime。
Agent

它干活时用的智能

会想,不等于有权碰你的机器。
Runtime

承载智能的模型

不是员工,也不是动手执行的那个。
执行体

你机器上受管的那双手

它不是 Agent。它自己没有智能,服从权限契约和工作区契约。
05

工作区

你机器上的一个目录,任务绑定在它上面。任务、权限、记忆和结果都按工作区记录。

它不是

工作区不拥有员工;它是员工被指派去干活的地方。工作区之间互不伸手。

KernelHub

任务只在它被发到的那个工作区里跑,别处不跑。目录搬家身份不变;任务、记忆和文件一起跟过去。

工作区隔离

工作区之间不互通

任务在被下达的那个工作区里跑。权限按设备、按工作区记录,没有全局开关。

源码留在本地

你的仓库不会被上传

执行发生在你的机器上。过网络的是任务原话、进度、你要看的 diff,以及审批。

06

权限

六档 —— 读、写、执行、网络、推送、删除/迁移 —— 按设备、按工作区分别授予。六档之下还有两类任何授权都打不开:碰你的凭据,和写到工作区外面。

它不是

权限不是给模型的建议。它由 Tool Server 和执行体的闸在动作发生之前核过。

KernelHub

需要一档它没有的权限时,任务在动手之前停下来问你。给一条任务的授权,在那条任务结束的那一刻过期。

动画:五档权限依次点亮,第六档「删除 / 迁移」保持熄灭,下方是一条「凭据永远拒绝」的横条。 执行 联网 推送 删除 CREDENTIALS · ALWAYS DENIED 凭据路径不因为你给了哪一档而解封。 删除 / 迁移默认永远不给——你不为某一条任务单独授权,它就一直是暗的。
凭据

任何授权都打不开的凭据路径

凭据路径 —— SSH 私钥、云配置、.env、钥匙串 —— 以及高风险动作,与你批了什么无关地被拒绝。你批一档权限,这份清单一条都不会少。

任务级授权

「就这一次」真的只有一次

为某条任务批的权限只对那条任务、那个工作区生效,任务一进终态立刻失效 —— 靠读时判定,不靠定时清扫。

管不住的边界

守不住的时候,它会告诉你

当一条任务会碰到删除 / 迁移这条边界,而接手的 Runtime 表达不了拒绝清单时,KernelHub 会在动手之前停住,请你明确放行这一趟。点头不批出任何一档权限

权限契约

六档权限,动手之前先核

读文件、写入文件、执行、联网、推送、删除 / 迁移数据分开授权,按设备、按工作区。不管哪一家 Runtime 在干活,它的写、改、执行都要经过 KernelHub 内建的 Tool Server,先对照这些授权和工作区边界核过再跑 —— 不是一句「请你守规矩」的提示词。

07

本机执行

活在已经放着你代码的那台机器上干。什么都不上传;过网络的是任务原话、进度、你选择看的 diff,以及你的批准。

它不是

它不是远程终端。没有人往你机器里敲字;执行体只落实被允许的动作。

KernelHub

下面就是 v1.0.2 里一条任务真实走过的路 —— 每一个节点在正式产品里都有。

01你的设备iPhone · Android · Desktop
02任务一句话,用你自己的说法
03KernelHub 服务端排队、保管权限
04Runtime 路由挑一家装着、接得了活
05执行体你机器上的 icloser 进程
06你的 Mac 或 Windows你的代码本来就在那儿
读取中 修改中 测试中
07实时工作区证据流,发生一件记一件
08改动真实 hunk,归到这条任务名下
09批准卡片出现在你手里那块屏上
10结果做完、要改、或停下 —— 绝不假报「已完成」
已关闭动效 —— 所有步骤同时显示。
实时演示
动画:手机上打出的一句任务由 KernelHub 服务端排队,你自己机器上的 执行体 接手,读取、修改并测试代码;改动回到手机成为一张审批卡,你就这一次放行,任务随即完成。 WORKSPACE 1/1 · POLL 3s · NO UPLOAD KERNELHUB v1.0.2 · LOCAL EXECUTION T+00:02 T+00:05 T+00:09 T+00:13 9:41 实时工作区 修改中 DateUtils.kt +8 −3 read PermToggle.kt edit DateUtils.kt exec ./gradlew test BUILD OK 发一条任务… 把标签提成常量 权限 · 执行 运行 Gradle 构建? + LABEL_TODAY = "Today" + LABEL_YESTERDAY = … − "Today" 就这一次放行 任务完成 · +8 −3 你的设备 QUEUE · PERMISSIONS KernelHub 服务端 排队、保管权限 ~/android-app · DateUtils.kt 050607 080910 1112 +8 −3 读取中 修改中 测试中 $ ./gradlew :app:assembleDebug BUILD SUCCESSFUL in 41s 你自己的机器

横向滑动看完整条链 →

每一帧对应的都是 v1.0.2 真会做的一步。文件名、增删行数和那行构建输出,取自一条真跑过的任务。

本机执行

Agent 在你的代码本来所在的地方跑

一个 执行体(icloser)守着你自己机器上的工作区,驱动你本来就装着的 CLI Runtime —— Claude Code、Codex、Antigravity(agy)等。没有云端沙箱,不上传仓库,不做源码镜像。

为非交互而设计

不留一个没人能答的提示

Runtime 通常会停下来问一个没人在的终端。KernelHub 把那次决定搬到你手里真的拿着的那块屏幕上。

08

手机审批

任务碰到它没有的 WRITE、EXEC 或别的边界时,你手里的设备上会出现一张卡:带着到目前为止的 diff,以及它要求的一字不差的原话。

它不是

手机不是执行体,也不是 Runtime。它发任务、做批准、读结果。

KernelHub

批准一次,同一条任务接着跑 —— 不重跑,你在决定的时候什么也没被做。

手机上审批

要你拿主意的事会来找你

任务缺一档权限时,它会在开工前停下来挂一张卡,带着到目前为止的 diff,以及它到底在申请什么的逐字说明。点一次头,同一条任务接着跑。

iPhone / Android

任务 · 审批 · 结果

手机不是执行体。它发任务、做批准、读结果。

「PermToggle.kt 里那三句文案是写死的,提成常量。然后构建一次确认没坏。」

  1. 从手机发出在输入框里打出来,进这个工作区的队列
  2. 执行体 接单放着 Android 仓的那台机器认领了它
  3. 读 PermToggle.kt证据流里能看到它打开的每一个文件
  4. 改它它还在干活时,实时 diff 就出来了
  5. 跑构建Gradle 在本机跑,输出实时回传
  6. 手机上的审批卡带着 diff —— +8 −3,连 hunk 一起
  7. 结果你点头,同一条任务接着跑完

「给 README.md 加一段安装说明,语气跟全文保持一致。」

  1. 读取动手写之前它先把文件读一遍
  2. 修改改动落在你机器的磁盘上
  3. 实时 Diff你看着那几段一行行出现
  4. 结果不需要审批 —— 写入这一档本来就批过了
09

证据:Diff · 产物 · 结果

「完成」是一句话,证据才让它成立。每条任务结束时都有归属于它的 diff、它产出的产物,以及一个「完成 / 待修 / 已停」的结果 —— 从不假报「完成」。

它不是

结果不是聊天摘要。中途有命令被拒过,结果会写出来。

KernelHub

Live Diff 在任务还在跑的时候就从执行体流上来;文件清单归属到这条任务,同一工作区里别的改动不会混进去。

动画:DateUtils.kt 里一段真实的改动逐行写出来——删两行、加六行——右上角 +8 −3 的计数条同时长满。 LIVE DIFF · 1 FILE DateUtils.kt +8 −3 050607 080910 1112 @@ -5,4 +5,9 @@ import java.time.ZoneId import java.time.format.DateTimeFormatter - fun label(d: LocalDate) = "Today" - // FIXME hard-coded + private const val LABEL_TODAY = "Today" + private const val LABEL_YESTERDAY = "Yesterday" + fun label(d: LocalDate) = when { + d == today -> LABEL_TODAY 任务还在跑的时候,由 执行体 实时送上来的。 归属于这条任务

手机上发的一条任务、在笔记本上执行时的真实输出。

归到这条任务名下

任务开始前就已经改过的文件、以及执行期间被别的进程改的文件,单独计数,不进这条任务的 diff。

证据,不是叙述

读 / 跑命令 / 改文件,发生一件记一件。来自文件系统监视的那几行会压暗并用被动语态 —— 它只说文件变了,说不出是谁改的。

事后可回放

每条任务都留着自己的时间线与改动。跑完之后打开它,按顺序读它做了什么。

一口气说完
我雇的是 AI 员工;Agent 提供智能;Runtime 提供模型;执行体在我电脑上执行被允许的动作;KernelHub 组织、治理并留下证据。

拿你自己的仓库试一试

先装好 Node.js LTS(自带 npm),再在放着你代码的那台机器上敲一条命令。演示在浏览器里跑,不需要账号。