import type { Logger } from "../observability/logger.js"; import { type LoadedSkill } from "./skills.js"; /** * 声明面的 `source.url` 长度上限(S-483)—— **界在声明关口,不在每个出口各切一刀**。 * * 由来:出口上原有一刀 `.slice(0, 80)`,而它做了两件坏事(① 把 display-safe 铸点的 `«redacted…»` 记号截成 * 半只;② 与同一条 URL 在别处的处置成了两把尺)。删掉它之后,这个 **center 下发**值在日志行与 * `failures[]` 回执上就再没有界 —— 于是界回到它该在的地方:**声明被接收的那一刻**(与 hook 条目的 url * 同形 —— `parseHooksConfig` 用 `MAX_HOOK_COMMAND_CHARS` 在解析期就拒)。2048 = URL 的事实上限 * (同一个数在 `http/routes/sessions.ts` 的对端 endpoint 读面上也在用);超界的 git clone URL 不存在真部署。 */ export declare const MAX_PLUGIN_SOURCE_URL_CHARS = 2048; /** 缺省 clone host 白名单(契约条款 1;国内镜像走本名单加 https 镜像域,不开 http 口)。 */ export declare const DEFAULT_PLUGIN_ALLOW_HOSTS: readonly string[]; /** wire 上的插件声明(registry-core PluginSpec 的宽读形——本模块只消费不裁决,未知键忽略)。 */ export interface PluginDeclWire { name?: unknown; source?: { kind?: unknown; url?: unknown; marketplace?: unknown; }; version?: unknown; sha?: unknown; enabled?: unknown; } export type PluginValidation = { ok: true; name: string; url: string; sha?: string; } /** skip=true:不装但不算失败(enabled:false / marketplace 形 v1 暂缓);skip 缺席 = 真失败(计入 failures)。 */ | { ok: false; skip?: true; name: string; reason: string; }; /** 条款 1/2/4:https-only、host 全等白名单、sha 40hex。纯函数,worker 侧纵深复验(不信任 wire 已验过)。 */ export declare function validatePluginDecl(decl: PluginDeclWire, allowHosts: readonly string[]): PluginValidation; /** 条款 3/5:clone 计划(argv 序列 + 隔离 env)。纯数据,让"姿势"可被锚定。 */ export declare function gitClonePlan(o: { url: string; dest: string; sha?: string; }): { steps: string[][]; env: Record; }; /** manifest 本体尺寸上限(#97 redesign⑥ V2-⑦:**新的本地输入上限**,非既有格式事实——manifest 只被 * 消费一个 `skillsPath` 字段,几行 JSON;超界视为畸形输入整条拒装)。 */ export declare const PLUGIN_MANIFEST_MAX_BYTES: number; /** 条款 5 的 manifest 半场:`.claude-plugin/plugin.json` 的 `skillsPath`(缺省 `skills/`;cli plugin * 布局同族)。返回 ok:true+dir:undefined = 插件没有 skills 目录(可以只有 commands——那是 cli 壳的 * 半场,worker 装 0 个 skill 不算失败);ok:false = 路径逃逸/manifest 本体畸形,整条拒装。 * manifest 臂分立(V2-⑦,原 broad-catch 是 fail-open):**不存在**=可选面,缺省 skills/;**存在但** * 本体逃逸根外/非普通文件/超界/读失败/JSON 坏 = ok:false 走既有 warning 面。 */ export declare function resolvePluginSkillsRoot(cloneRoot: string): { ok: true; dir?: string; } | { ok: false; reason: string; }; export interface ApplyPluginsResult { skills: LoadedSkill[]; /** 真失败(validate 拒/clone 失败且无 LKG/装载抛):单条不连坐,逐条留痕。 */ failures: Array<{ plugin: string; reason: string; }>; /** 撞名让位名单(收紧④)。 */ letGo: Array<{ plugin: string; skill: string; }>; /** 本轮拉取失败、沿用上次成功物化的插件名。 */ lkgUsed: string[]; } /** 总入口(条款 3/7/8):逐条物化 + 装载 + 让位合并。materialize 盘位 = `//live` * (成功后原子 rename 替换,失败保留旧盘位 = LKG)。 */ export declare function applyCenterPlugins(baseline: LoadedSkill[], eff: { plugins?: unknown; }, opts: { cacheRoot: string; allowHosts: readonly string[]; logger?: Logger; /** 测试口:跳过 validate(materialize 只接受已验声明;真 git 腿用本地 bare repo,validate 层的 * https-only 单独测——两层分开,谁也不掩护谁)。生产恒 false/缺席。 */ skipValidate?: boolean; runGit?: (args: string[], env: Record) => Promise; }): Promise; //# sourceMappingURL=center-plugins.d.ts.map