- 人工智能
- AI Agent
- 自主智能体
- 桌面应用
- MCP Clients
【免费下载链接】Kun
Local-first AI agent workspace for coding, writing, design, research, and automation — one runtime for desktop GUI and TUI.
Kun 的扩展系统以kun-extension.json(Manifest)为唯一入口契约:Kun 在读取任何扩展代码或远程内容之前,先对 Manifest 的版本、入口、贡献、权限与资源引用做完整验证,未知字段、无效引用和不兼容版本都会直接判定失败,绝不靠“忽略未知字段”来猜测兼容。本文以 Kun Extension API v1 的 Manifest 参考为核心,逐字段拆解顶层结构、本地化、五维版本、激活事件、全部贡献点、权限模型与验证命令,并结合仓库源码(Manifest Schema 实现)、机器可读的 kun-extension.schema.json 以及 hello-sidebar、tool-provider、streaming-model-provider、direct-dom 等真实示例,帮助你写出一次通过校验、可打包发布、安全合规的扩展 Manifest。
Manifest 的定位与强制校验原则
每个扩展包(.kunx)或开发目录的根目录都必须存在kun-extension.json。Kun 在加载任何扩展代码或远程内容之前,会先验证 Manifest 的以下六个维度:
- Manifest 结构版本(
manifestVersion):当前 v1 固定为整数1; - API 版本(
apiVersion):用于 Extension API 能力协商; - 入口(
main/browser):必须存在且通过路径与完整性校验; - 贡献(
contributes):所有静态声明必须合法且引用完整; - 权限(
permissions):必须显式声明并满足贡献隐含的最小权限; - 资源引用(icon、entry、localResourceRoots 等):必须使用包内相对路径。
核心原则是严格同版本校验,拒绝猜测:未知字段、未知贡献类型、无效引用和不兼容版本都按同一版本的 Schema 处理,而不是靠忽略字段来“猜测兼容”。这也是为什么 Manifest 的权威真源是随@kun/extension-api发布的kun-extension.schema.json(仓库内即 packages/extension-api/schema/kun-extension.schema.json)——它是从 zod 定义自动生成的机器可读 Schema,字段级完整参考,文档中的省略示例不能用于绕过 validator。
在源码层面,Manifest 的解析与校验全部集中在 packages/extension-api/src/manifest.ts:ExtensionManifestSchema基于 zod 的strictObject(即额外字段直接报错)构建,并通过superRefine施加跨字段约束(隐含权限、激活事件双向引用、ID 唯一性、本地化引用合法性等)。当前常量定义也在这里:
CURRENT_MANIFEST_VERSION = 1CURRENT_EXTENSION_API_VERSION = '1.5.0'- 支持 API 版本列表:
1.5.0、1.4.0、1.3.0、1.2.0、1.1.0、1.0.0
完整骨架:一个可直接照抄的 v1 Manifest
以下骨架覆盖了绝大多数扩展所需的字段,空数组可以省略,实际 Manifest 应只声明扩展真正需要的贡献和权限:
{ "$schema": "https://kun.dev/schemas/extensions/manifest/v1.json", "manifestVersion": 1, "apiVersion": "1.0.0", "publisher": "acme", "name": "issue-assistant", "version": "1.2.0", "displayName": "Issue Assistant", "description": "Manage issues with a sidebar and Kun Agent tools.", "icon": "assets/issue-assistant.svg", "engines": { "kun": ">=0.1.0" }, "main": "dist/extension.js", "browser": "dist/webview/index.html", "activationEvents": [ "onView:issues", "onCommand:refresh", "onTool:create-issue" ], "contributes": { "commands": [], "views.rightSidebar": [], "actions.topBar": [], "settings": [], "tools": [], "agentProfiles": [] }, "permissions": [ "commands.register", "ui.views", "ui.actions", "webview", "agent.run", "agent.threads.readOwn", "tools.register", "network:api.example.com", "storage.workspace" ], "stateSchemaVersion": 1 }仓库中真实的、可通过校验的最小示例是 examples/extensions/hello-sidebar/kun-extension.json,它只声明了一个右侧栏 View、两条激活事件和两个权限,是学习最小合法 Manifest 的绝佳范本。
顶层字段逐项说明
| 字段 | 必填 | 约束与含义 |
|---|---|---|
$schema | 否 | 编辑器提示用的 URL,不参与运行时兼容决策;应匹配目标 API 文档版本 |
manifestVersion | 是 | Manifest 结构版本;v1 固定为整数1 |
apiVersion | 是 | Extension API SemVer;用于能力协商,不是 npm 包版本范围 |
publisher | 是 | 发布者 ID;与name组成不可变身份 |
name | 是 | 扩展名称 ID;必须符合 Schema,不能使用保留身份 |
version | 是 | 此.kunx包的 SemVer 版本 |
displayName | 否 | 面向用户的短名称,作为不可信纯文本渲染 |
description | 否 | 面向用户的说明,作为不可信纯文本渲染 |
icon | 否 | 扩展 Logo 的包内相对路径;用于扩展中心等 Host 界面,建议使用方形 SVG 或至少 80×80 的 PNG |
localizations | 否 | Host 渲染的 Manifest 和贡献显示文案的有界语言覆盖 |
license | 否 | 简短许可证标识;发布包仍必须包含LICENSE |
homepage | 否 | 扩展主页 HTTPS URL |
engines.kun | 是 | 兼容 Kun 版本的 SemVer range |
main | 条件必填 | Node Host 入口的包内相对路径 |
browser | 条件必填 | browser/Webview 入口的包内相对路径 |
activationEvents | 是 | 允许启动扩展代码的静态事件;可以为空 |
contributes | 是 | 静态贡献声明;可以为空对象 |
permissions | 是 | 精确的字符串权限列表;可以为空数组 |
stateSchemaVersion | 是 | 非负整数状态 Schema 版本;与包/API 版本独立,新扩展推荐从1开始 |
signature | 否 | 当前支持的签名 metadata;用于来源证明,不代表安全审计 |
结合 kun-extension.schema.json 中的正则细节,以下几点容易踩坑:
publisher:小写 ASCII 字母/数字/连字符,以字母或数字开头,最长 64;正则形如^[a-z0-9][a-z0-9-]*$。name与所有 local contribution ID:小写字母开头,之后只允许小写字母/数字/连字符,最长 64;正则形如^[a-z][a-z0-9-]*$。以同版本 Schema 的正则和保留字校验为准。displayName最长 128 字符,description最长 4096 字符(schema 中分别由minLength: 1/maxLength: 128与maxLength: 4096约束)。engines.kun是必填的 SemVer range 字符串(最长 128,允许^、~、>=、*等常见运算符)。icon、main、browser、entry等路径字段必须符合相对路径正则:不能以/开头、不能包含盘符([A-Za-z]:)、不能出现..段逃逸,长度上限 512。
main 与 browser:两类入口的取舍
main与browser至少存在一个:
main:Node Host 入口,模块公开activate(context),可选公开deactivate();详见生命周期。任何要求 headless 的工具、Agent profile、模型 Provider、认证处理器、计划任务或后台命令都必须存在main,Kun 不会用browser代替 Node 入口。browser:沙箱 View 资源入口,不是 Node 模块,也不会获得自定义 preload。
Browser-only Manifest(只有browser)不能声明commands、agentProfiles、tools、modelProviders或authentication——这些都需要 Node handler。所有browser入口都必须声明webview权限。这一约束在源码中体现为BrowserOnlyContributionsSchema(packages/extension-api/src/manifest.ts):它把上述五类贡献的最大数量压成 0,且main为never类型。
完整 ID 为publisher.name,一旦公开不得更改。改名等同于一个新扩展,旧状态、权限、账号和 thread 不会自动转移。
未声明顶层icon时,Host 可以兼容使用第一个声明了图标的 View 容器或主 View;都没有时显示默认占位图标。Logo 文件与其他 Manifest 资源一样,必须通过包内相对路径、完整性和受控资源协议校验。
Host 渲染文案的本地化
localizations把最多 32 个有界 BCP 47 语言标签映射为纯文本显示覆盖。基础 Manifest 始终是必需的 fallback,也是身份、激活事件、权限、路径、可执行 Schema 和 Agent instructions 的稳定真源。覆盖只能修改已知显示字段,且必须引用已声明的贡献、设置属性、通知操作或 Provider model。
{ "displayName": "Issue Assistant", "contributes": { "views.rightSidebar": [{ "id": "issues", "title": "Issues", "entry": "dist/index.html" }] }, "localizations": { "zh-CN": { "displayName": "问题助手", "contributes": { "views.rightSidebar": { "issues": { "title": "问题" } } } } } }匹配顺序:Kun 先按大小写不敏感的完整标签匹配,再逐级匹配更宽的语言标签(zh-Hans-CN→zh-Hans→zh),最后使用基础 Manifest。Webview 内容仍通过ui.getLocale和ui.localeChanged自行本地化;Manifest 覆盖用于侧栏 tooltip、面板/结果预览标题、扩展中心卡片和声明式设置等 Host chrome。
源码中的实现依据:
findManifestLocalization(packages/extension-api/src/manifest.ts)将请求语言标签逐级缩短(去掉最后一个-段)匹配本地化表,与文档描述的逐级匹配完全一致;resolveExtensionManifestLocale(同文件 L488-L548)只克隆并覆盖displayName、description及各贡献点的显示字段,身份、激活、权限、路径、Schema 与 instructions 始终保持基础 Manifest 数据;validateManifestLocalizationReferences(同文件 L581-L647)会校验每个本地化条目引用的贡献、设置属性、通知 action 和 Provider model 是否真的在基础 Manifest 中声明,未声明即报错。
版本字段:五个彼此独立的维度
manifestVersion是 Manifest Schema major,apiVersion是公开 Extension API SemVer,version是扩展包版本,stateSchemaVersion是扩展持久化状态的整数版本,engines.kun是允许运行的 Kun SemVer range——这五个维度彼此独立,不能混用。Kun/Host 的私有rpcVersion不写入 Manifest,也不要通过提高包版本来暗示 API 或状态兼容。详细规则见版本与迁移。
可选signaturev1 使用以下结构:
{ "algorithm": "ed25519", "keyId": "...", "value": "..." }它只携带发布者提供的来源元数据;当前 Host 不做密码学验签,并将其报告为present-unverified。包字节、Index SHA-256 和文件 integrity 仍分别验证。Schema 中signature的约束为:algorithm枚举仅ed25519,keyId最长 256,value最长 16384。
入口:路径与执行环境约束
入口必须满足:
- 使用规范化包内相对路径;
- 位于完整性清单和允许资源根内;
- 不能包含绝对路径、
..逃逸或符号链接; - 在 validate、pack 和安装时存在;
- 与所声明贡献的执行环境一致。
main模块公开activate(context),可选公开deactivate();详见生命周期。browser是沙箱 View 资源入口,不是 Node 模块,也不会获得自定义 preload。测试中也明确验证了路径越界会被拒绝——packages/extension-api/test/manifest.test.ts 断言{ ...manifest, icon: '../icon.svg' }校验失败。
激活事件
v1 支持的事件及触发时机如下:
| 事件 | 触发时机 |
|---|---|
onStartup | Kun runtime 启动并完成 admission 后;只用于确实需要 eager background 的 Node 扩展 |
onView:<id> | 用户打开该本地 View 贡献 |
onCommand:<id> | 调用该本地命令 |
onTool:<id> | Kun 要调用该本地工具 |
onProvider:<id> | 选择或请求该模型 Provider |
onAuthentication:<id> | 需要该认证处理器 |
onAgentProfile:<id> | 使用该 Agent profile |
<id>是 Manifest 内本地贡献 ID。Validator 会双向检查引用:每个 View/command/tool/Provider/authentication/Agent profile 必须声明对应事件(或扩展明确使用onStartup),每个非 startup 事件也必须指向真实贡献;不会把拼错的事件降级为第一个任意事件。仅展示图标、标题或设置元数据不会激活代码。不要把onStartup当作默认值。
源码中的双向校验逻辑清晰可见:ActivationEventSchema的正则只允许onStartup或on(?:View|Command|Tool|Provider|Authentication|AgentProfile):[a-z][a-z0-9-]*(packages/extension-api/src/manifest.ts);superRefine中先遍历每个贡献要求其事件存在(L341-L370),再遍历每个非 startup 事件要求其指向真实贡献(L372-L388)。也就是说,声明了onTool:create-issue却忘了在contributes.tools里声明create-issue,会直接校验失败。
贡献点总览
contributes只接受下列 v1 键。所有本地 ID 在同类贡献中必须唯一;所有可打开的 View(包括 result preview)还共享同一个 ID namespace。modelProviders[].authenticationProviderId必须指向本 Manifest 的 authentication contribution。宿主将本地 ID 解析为extension:<publisher.name>/<local-id>或等价的命名空间身份。
| 键 | 用途 | 关键声明内容 |
|---|---|---|
commands | 扩展命令 | id、title,参数/结果 Schema(如适用) |
views.containers | Activity/sidebar 容器 | id、title、icon、位置/排序 |
views.leftSidebar | 左侧栏 View | id、title、entry,可选 icon/when/order |
views.rightSidebar | 右侧栏 View | 同上;可选showInRightRail |
views.auxiliaryPanel | 辅助面板 | 同上 |
views.editorTab | 编辑区 Tab | 同上;宿主管理 tab 生命周期 |
views.fullPage | 全页 View | 同上;不能覆盖受保护窗口 |
actions.topBar | 顶部操作 | id、命令引用、title、可选 icon/when/group/order |
actions.composer | Composer 操作 | 同上;只得到公开 invocation context |
actions.message | 消息操作 | 同上;不能越权读取其它 thread |
message.resultPreviews | 结果预览 | id、title、entry、mimeTypes、可选 resource roots/when |
settings | 设置 Section/字段 | id、title、properties、global/workspace scope、order |
contextMenus | 上下文菜单项 | id、location、命令、group/order、when |
notifications | 声明式通知 | id、title、可选 message/severity/actions/when;action 含 id/title/command |
agentProfiles | Agent profile | id、显示信息、instruction overlay、默认绑定/工具范围/预算/可见性 |
tools | 扩展工具 | id、description、inputSchema;可选outputSchema/sideEffects/idempotent/maxOutputBytes(1 KiB–1 MiB) |
modelProviders | 完整模型 Provider | id、displayName、authenticationProviderId、model/capability 元数据 |
authentication | 认证 Provider | id、认证类型和受保护流程元数据 |
hostContentScripts | Direct DOM | 静态脚本/样式、允许宿主 surface、激活条件;高风险且不稳定 |
views.rightSidebar是新扩展的规范可发现 UI:默认情况下,View 的包内 icon 和本地化标题会出现在 Code 模式右侧竖向图标栏,并在主会话旁打开独立标签。设置showInRightRail: false可保留可由扩展管理页或命令打开的 View,但不在图标栏常驻。其它views.*位置继续保留 Extension API v1 解析和命令路由兼容,但宿主不会为它们生成额外的聚合扩展选择器。
Schema 层面的硬性约束(来自 kun-extension.schema.json)值得注意:
- 各贡献点数量上限:
commands与tools最多 512,各views.*与actions.*最多 128,views.containers与settings最多 64,contextMenus最多 256,hostContentScripts最多 32; views.*View 的order是-10000 ~ 10000的整数,默认 0;multiple默认 false,showInRightRail默认 true;notifications的severity枚举info | warning | error(默认 info),actions最多 4 个;tools的sideEffects枚举none | read | write | external | destructive(默认 none),idempotent默认 false,maxOutputBytes范围 1024–1048576(即 1 KiB–1 MiB);settings的scope枚举global | workspace(默认 workspace)。
固定远程网站:externalBrowser
需要固定远程网站时,View 可声明externalBrowser: { presentation, sites }。presentation为desktop或mobile;每个 site 只接受id、title、可选 badge/accent 和 credential-free HTTPSurl。这要求webview.external,且每个 site hostname 必须匹配显式network:grant。远程页由 Main-owned browser surface 承载,不加载扩展entry或 bridge。
Schema 与源码给出的细节约束:
sites最多 12 个;ExternalBrowserSiteSchema(packages/extension-api/src/manifest.ts)强制 HTTPS、默认端口 443、无用户名/密码;- 校验器为每个 site 从 URL 提取 hostname,要求
webview.external权限且存在匹配的network:<hostname>授权(manifest.ts L298-L339); - 同一 View 的 site id 不得重复。
Contribution 隐含权限
Validator 从入口/贡献自动推导并强制以下最小权限;缺少时 Manifest 无效:
| 入口/贡献 | 必需权限 |
|---|---|
任意browser | webview |
commands | commands.register |
views.containers | ui.views |
任意views.*View | ui.views,webview |
带externalBrowser的 View | webview.external和每个 site 的network:<hostname> |
message.resultPreviews | ui.views,webview |
actions.*,settings,contextMenus | ui.actions |
notifications | ui.notifications |
agentProfiles | agent.run |
tools | tools.register |
modelProviders | providers.register |
hostContentScripts | hostDom |
这些只是注册/呈现所需权限;实际 handler 仍要声明其使用的 workspace、network、account、storage 等权限。authentication的账号读取/管理/use/secret 权限按具体调用检查。
源码层面,隐含权限表就是MANIFEST_CONTRIBUTION_PERMISSION_REQUIREMENTS(packages/extension-api/src/manifest.ts),requiredManifestPermissions(同文件 L468-L478)汇总所有要求后在superRefine中与manifest.permissions逐一比对并报出具体缺失项。同时,Schema JSON 的allOf部分也以 JSON Schema 的if/then形式复刻了这套强制逻辑,保证非 TypeScript 工具链同样能校验。
三个可直接运行的最小贡献
最小命令:
{ "commands": [ { "id": "refresh", "title": "Refresh issues" } ] }最小 View:
{ "views.rightSidebar": [ { "id": "issues", "title": "Issues", "entry": "dist/webview/index.html", "icon": "assets/issues.svg", "when": "workspaceOpen", "order": 100, "localResourceRoots": ["dist/webview", "assets"] } ] }最小工具:
{ "tools": [ { "id": "create-issue", "description": "Create an issue in the configured project", "inputSchema": { "type": "object", "properties": { "title": { "type": "string", "minLength": 1 } }, "required": ["title"], "additionalProperties": false }, "outputSchema": { "type": "array", "items": { "type": "object", "properties": { "type": { "const": "text" }, "text": { "type": "string" } }, "required": ["type", "text"], "additionalProperties": false } }, "sideEffects": "external", "idempotent": false, "maxOutputBytes": 32768 } ] }真实仓库示例中,tool-provider 给出了一个 headless 工具的标准写法:main入口 +onTool:workspace-summary激活事件 +tools.register与workspace.read权限 +sideEffects: "read"、idempotent: true、maxOutputBytes: 65536;streaming-model-provider 则展示了完整的authentication(api-key 与 oauth2-pkce 两种类型)与modelProviders组合,包括模型能力元数据(输入/输出模态、reasoning、tools、streaming、上下文窗口)以及authenticationProviderId指向本 Manifest 认证贡献的引用方式。Contribution 的详细行为见工作台、Agent 与工具和Provider 与账号。
when条件
when使用宿主定义的封闭、无副作用表达式语言和公开 context keys。它不能执行 JavaScript、读取 renderer global、DOM 或私有 store,也不能创造调用者没有的权限。未知 key/capability 解析为 unavailable。
只使用同一 API 版本文档列出的 context key 和运算符。把业务决策放进命令 handler;when只负责可见/可用状态。状态变化后,宿主可能隐藏贡献并按该 contribution contract 关闭 View Session。Schema 中when是长度 1–2048 的字符串(WhenExpressionSchema)。
权限:精确字符串数组
v1 权限是精确字符串数组,每个权限对应一类明确的 Broker 能力:
| 权限 | 允许的 Broker 能力 |
|---|---|
commands.register | 注册 Manifest 声明的命令 |
ui.views | 提供受控 View |
ui.actions | 提供宿主渲染的 action/menu/settings controls |
ui.notifications | 请求宿主通知 |
webview | 创建声明的复杂 Webview UI |
webview.external | 在隔离子 Webview 中显示经network:*授权的远程 HTTPS 网站(高风险) |
hostDom | 注入声明的 Direct DOM content scripts(高风险) |
agent.run | 创建和控制 extension-owned Agent Run |
agent.threads.readOwn | 查询本扩展拥有的 thread/run 投影 |
agent.capacity.read | 读取全局 running/queued turn 计数与 admission 容量 |
rooms.read | 读取本地全部房间摘要、消息、任务摘要与公开事件 |
tools.register | 注册 Manifest 声明的工具 |
providers.register | 注册模型 Provider |
accounts.read | 读取获准范围内的脱敏账号元数据 |
accounts.use:<providerId> | 使用指定 Provider 的账号句柄 |
accounts.manage:<providerId> | 请求指定 Provider 的受保护账号管理流程 |
accounts.secrets.read:<providerId> | Node Host 请求指定 Provider 的原始秘密;高风险、单独确认 |
network:<hostname>/network:*.example.com | 通过 Network Broker 访问精确 hostname,或显式接受的子域 wildcard |
storage.global | 使用扩展隔离的全局状态 |
storage.workspace | 使用扩展隔离的工作区状态 |
storage.secrets | Node Host 使用受保护、扩展隔离的秘密字符串存储;View 不可直接访问 |
workspace.read | 通过 Broker 读取获准工作区 |
workspace.write | 通过 Broker 写入获准工作区,仍受政策/审批限制 |
Schema 中权限数组最多 256 项,且除了固定枚举(含media.read、media.process、media.export、jobs.manage等),还支持两类带参数的模式:accounts.(use|manage|secrets.read):<providerId>与network:(*.hostname|hostname)。
**只声明最小权限。**新增权限的包版本不会继承旧同意:用户必须在受保护窗口重新确认。webview.external还要求显式的network:<hostname>授权;该网络授权在这里限制远程子 Webview 的顶层导航,子页面绝不会获得 Kun preload、Node 或 Electron。权限不会让普通 browser 或 content script 获得 Node/秘密,也不能绕过 Kun ApprovalGate。详见安全与资源。
Direct DOM 声明
hostContentScripts必须静态列出id、matches、scripts,可选styles,以及runAt: "documentStart" | "documentEnd";运行时不能请求注入未声明文件或 surface。matches使用宿主 surface token,不是 URL glob:可选值为workbench:*、workbench:code、workbench:design、workbench:write、workbench:connect。Settings/初始设置包含凭据和执行权限控制,始终是 protected surface;没有workbench:settingsmatcher,workbench:*也不会匹配它或其它凭据/consent 窗口。安装器会把hostDom显示为最高风险能力。
这些脚本在插件专属 isolated world 中运行,可以访问可见 DOM,但不能访问页面 JavaScript 对象、React internals、Electron、Node、window.kunGui或受保护 consent/credential surface。宿主 DOM、选择器和 CSS 不属于稳定 API,详见Webview 与 Direct DOM。
Schema 细节:matches最多 64 个,scripts1–32 个,styles0–32 个,runAt默认documentEnd。仓库示例 direct-dom 是最小的 Direct DOM 声明——onStartup激活、workbench:*surface、hostDom权限。
资源与完整性
发布包根还必须包含:
README.md;LICENSE;kun-extension.integrity.json;- 所有入口和 Manifest 引用的本地资源。
完整性清单记录包文件的 SHA-256。安装验证拒绝未声明/缺失文件、摘要不一致、路径穿越、绝对路径、link、重复/大小写碰撞路径、越界资源和超过公布限制的包。不要把秘密、令牌、私钥、开发.env或用户数据打进.kunx。完整性清单的生成与校验实现位于 kun/src/extensions/archive-support.ts、archive-core.ts 与 registry-validation.ts 等文件,配合kun extension pack生成确定性归档。
验证:validate、pack 与 CLI 生态
Kun CLI 提供完整的扩展生命周期命令。用kun extension --help可查看全部命令(定义见 kun/src/cli/extension-cli-commands.ts),核心流程是:
# 校验一个源码目录 kun extension validate . # 校验一个已打包的 .kunx 归档 kun extension validate ./dist/acme.issue-assistant-1.2.0.kunx常用的相关命令还包括:kun extension create <directory>(脚手架)、kun extension pack <directory>(生成确定性.kunx)、kun extension install <path>(安装归档/开发目录/Index 版本)、kun extension list、kun extension enable/disable、kun extension doctor(校验包完整性与 Host 健康)、kun extension logs <extension-id>与kun extension reload <extension-id>。打包与校验还支持--output、--overwrite、--include、--ignore等选项(见 extension-cli-commands.ts)。
验证错误应包含稳定诊断代码、JSON path、说明和文档链接。兼容性失败会指出具体维度(Manifest、API、Kun engine、state 或 Host negotiation),而不是只报“版本错误”。
常见校验失败对照与排查要点
把上文散落的约束汇总成一张自查清单,可以大幅减少验证返工:
- 身份命名:
publisher可用数字开头,name与所有本地贡献 ID 必须小写字母开头,全小写字母/数字/连字符,最长 64; - 入口配对:
main/browser至少一个;Browser-only 时不能声明commands、agentProfiles、tools、modelProviders、authentication,且必须声明webview; - 路径安全:所有资源路径必须是包内相对路径,禁止绝对路径、
..、盘符、符号链接; - 激活事件双向引用:每个 View/command/tool/Provider/authentication/Agent profile 都要有对应事件(或用
onStartup),每个非 startup 事件都必须指向真实贡献; - 隐含权限:按“Contribution 隐含权限”表补齐最小权限,
externalBrowser还要追加webview.external与逐 site 的network:<hostname>; - ID 唯一性:同类贡献内 ID 唯一,所有可打开 View(含 result preview)共享 ID namespace;
- 认证引用:
modelProviders[].authenticationProviderId必须指向本 Manifest 的 authentication contribution; - 本地化引用:本地化覆盖只能引用已声明的贡献/设置属性/通知 action/Provider model;
- 版本一致性:
manifestVersion: 1、apiVersion取受支持列表(1.0.0至1.5.0)、stateSchemaVersion为非负整数; - 打包完整性:
README.md、LICENSE、kun-extension.integrity.json与全部引用资源必须在包内,且不含秘密与用户数据。
把kun-extension.json当作扩展的“安全边界声明”来写:身份与入口决定它如何被加载,贡献点决定它提供什么能力,权限决定它能触碰哪些 Broker 资源,而 Validator 则在代码运行前把这些声明全部钉死——这也是 Kun 扩展体系能够在加载任何远程内容前保持可审计、可回滚、可信任的根本原因。
- 人工智能
- AI Agent
- 自主智能体
- 桌面应用
- MCP Clients
【免费下载链接】Kun
Local-first AI agent workspace for coding, writing, design, research, and automation — one runtime for desktop GUI and TUI.
相关推荐
Kun 工作台扩展贡献点实战:View、命令、设置与 UX 完整指南(Extension API v1)
Kun 工作台扩展贡献点实战:View、命令、设置与 UX 完整指南(Extension API v1) 本文围绕 docs/extensions/workbe
人工智能AI Agent自主智能体桌面应用MCP ClientsVS Code 扩展清单(Extension Manifest)权威指南:package.json 字段、发布打包与实战配置
VS Code 扩展清单(Extension Manifest)权威指南:package.json 字段、发布打包与实战配置 导读 package.json 是
文档教程OpenRig AgentSpec 权威指南:agent.yaml 完整字段参考与源码级解析
OpenRig AgentSpec 权威指南:agent.yaml 完整字段参考与源码级解析 OpenRig 是一个将 Claude Code 与 Codex
人工智能AI Agent多智能体Agent 编排代码智能体CLI
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考