@siming-org/opencode-plugin 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +85 -2
- package/dist/assets-store.d.ts +63 -0
- package/dist/assets-store.d.ts.map +1 -0
- package/dist/assets-store.js +68 -0
- package/dist/assets-store.js.map +1 -0
- package/dist/cli-locator.d.ts +11 -0
- package/dist/cli-locator.d.ts.map +1 -0
- package/dist/cli-locator.js +100 -0
- package/dist/cli-locator.js.map +1 -0
- package/dist/fetch-assets.d.ts +64 -0
- package/dist/fetch-assets.d.ts.map +1 -0
- package/dist/fetch-assets.js +362 -0
- package/dist/fetch-assets.js.map +1 -0
- package/dist/guide-skill.d.ts +12 -0
- package/dist/guide-skill.d.ts.map +1 -0
- package/dist/guide-skill.js +59 -0
- package/dist/guide-skill.js.map +1 -0
- package/dist/host-api.d.ts +141 -0
- package/dist/host-api.d.ts.map +1 -0
- package/dist/host-api.js +49 -0
- package/dist/host-api.js.map +1 -0
- package/dist/register/agents.d.ts +17 -0
- package/dist/register/agents.d.ts.map +1 -0
- package/dist/register/agents.js +32 -0
- package/dist/register/agents.js.map +1 -0
- package/dist/register/mcp.d.ts +16 -0
- package/dist/register/mcp.d.ts.map +1 -0
- package/dist/register/mcp.js +10 -0
- package/dist/register/mcp.js.map +1 -0
- package/dist/register/refresh-tool.d.ts +12 -0
- package/dist/register/refresh-tool.d.ts.map +1 -0
- package/dist/register/refresh-tool.js +45 -0
- package/dist/register/refresh-tool.js.map +1 -0
- package/dist/register/skills.d.ts +13 -0
- package/dist/register/skills.d.ts.map +1 -0
- package/dist/register/skills.js +27 -0
- package/dist/register/skills.js.map +1 -0
- package/dist/register/tools.d.ts +11 -0
- package/dist/register/tools.d.ts.map +1 -0
- package/dist/register/tools.js +8 -0
- package/dist/register/tools.js.map +1 -0
- package/dist/revalidate.d.ts +68 -0
- package/dist/revalidate.d.ts.map +1 -0
- package/dist/revalidate.js +190 -0
- package/dist/revalidate.js.map +1 -0
- package/dist/server/index.d.ts +7 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +113 -0
- package/dist/server/index.js.map +1 -0
- package/dist/tools/simming-cli.d.ts +33 -0
- package/dist/tools/simming-cli.d.ts.map +1 -0
- package/dist/tools/simming-cli.js +120 -0
- package/dist/tools/simming-cli.js.map +1 -0
- package/package.json +31 -3
package/dist/host-api.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* opencode v2 宿主插件 API 最小契约(自维护)。
|
|
3
|
+
*
|
|
4
|
+
* 为什么不用 @opencode-ai/plugin 的类型:SDK .d.ts 滞后于宿主运行时
|
|
5
|
+
* (v2.0.26 宿主有 mcp/tool 等域的运行时能力,SDK 声明缺失/漂移,见技术方案 §2)。
|
|
6
|
+
* 本文件按 v2.0.26 宿主源码锚点(packages/plugin/src/promise/*.ts,隔离 HOME 实测核实):
|
|
7
|
+
* - skill 域:SkillEditor = list/get/add/update/remove(无 set;Skill.Info 必填 path=合成展示路径,
|
|
8
|
+
* content 内嵌消费——内置技能先例 /builtin/opencode.md + core/src/skill.ts toModelOutput);
|
|
9
|
+
* - agent 域:AgentEditor = list/get/default/update/remove(无 set 无 add;update=upsert-create,
|
|
10
|
+
* 回调条目字段是 system 非 systemPrompt,种子 Agent.default(id) mode=primary);
|
|
11
|
+
* - mcp 域:MCPEditor = set/remove(LocalConfig 无 enabled 字段,语义取 disabled?);
|
|
12
|
+
* - tool 域:Tool.Info 必填 input(zod 实现 StandardSchemaV1 可行);ToolContext 无 directory
|
|
13
|
+
* ——cwd 基准由 setup 捕获 ctx.location.directory 经闭包传入;
|
|
14
|
+
* - setup ctx.location.directory 存在(Location.Info):插件按活跃 location 各跑一份 setup。
|
|
15
|
+
* 只声明插件实际消费的最小面;SDK 仅作 devDep 参考对齐,不进入运行时依赖。
|
|
16
|
+
*/
|
|
17
|
+
import { tmpdir } from 'node:os';
|
|
18
|
+
/**
|
|
19
|
+
* 技能合成展示路径(内置技能 /builtin/*.md 先例):以 tmpdir 为基避免与真实项目文件混淆;
|
|
20
|
+
* references 已在拉取时物化为绝对路径,不依赖此 path 做相对解析。
|
|
21
|
+
*/
|
|
22
|
+
export function skillDisplayPath(name) {
|
|
23
|
+
return `${tmpdir()}/siming-opencode-plugin/skills/${name}/SKILL.md`;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 域 list() 返回条目的名字归一化(自检用)。
|
|
27
|
+
* 宿主各域 list 的条目形状未逐一锚定(可能是 {name} 对象 / [id, item] 元组 / 字符串 id),
|
|
28
|
+
* 统一提取可辨识名字集合;无法提取的条目静默跳过(自检按“能确认在场的名字”判定)。
|
|
29
|
+
*/
|
|
30
|
+
export function listEntryNames(entries) {
|
|
31
|
+
const names = new Set();
|
|
32
|
+
for (const entry of entries) {
|
|
33
|
+
if (typeof entry === 'string') {
|
|
34
|
+
names.add(entry);
|
|
35
|
+
}
|
|
36
|
+
else if (Array.isArray(entry) && typeof entry[0] === 'string') {
|
|
37
|
+
names.add(entry[0]);
|
|
38
|
+
}
|
|
39
|
+
else if (typeof entry === 'object' && entry !== null) {
|
|
40
|
+
const record = entry;
|
|
41
|
+
if (typeof record.name === 'string')
|
|
42
|
+
names.add(record.name);
|
|
43
|
+
else if (typeof record.id === 'string')
|
|
44
|
+
names.add(record.id);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return names;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=host-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-api.js","sourceRoot":"","sources":["../src/host-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAkGjC;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,GAAG,MAAM,EAAE,kCAAkC,IAAI,WAAW,CAAC;AACtE,CAAC;AAsDD;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,OAA2B;IACxD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YAChE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAW,CAAC,CAAC;QAChC,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACvD,MAAM,MAAM,GAAG,KAAgC,CAAC;YAChD,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;gBAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;iBACvD,IAAI,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ;gBAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 子代理域注册(技术方案 §4.C3-4 / §4.B register/agents.ts)。
|
|
3
|
+
*
|
|
4
|
+
* systemPrompt 组装契约沿用 install writer agentToMarkdown 先例
|
|
5
|
+
* (packages/cli/src/commands/install/writer.ts:151-174),插件版差异(用户裁定):
|
|
6
|
+
* - model 不设置——宿主字段级 merge 链生效(用户 jsonc agents 段 model > 继承主会话当前模型);
|
|
7
|
+
* - permissions 不注入(边界描述沿用资产定义文本,随 system 携带);
|
|
8
|
+
* - 注册经 editor.update(id, fn) upsert-create(v2.0.26 AgentEditor 无 set/add):
|
|
9
|
+
* 宿主种子=Agent.default(id)(mode=primary),回调内改写为 subagent 形态。
|
|
10
|
+
* 对账簿语义同技能域(§4.C3-5)。
|
|
11
|
+
*/
|
|
12
|
+
import type { HostPluginContext } from '../host-api.js';
|
|
13
|
+
import { type AgentAsset } from '../assets-store.js';
|
|
14
|
+
/** 资产 → 宿主 system(writer.ts:166-172 同构:身份 + 绑定技能加载指令 + 条件信息边界 + 正文) */
|
|
15
|
+
export declare function agentToSystemPrompt(agent: AgentAsset): string;
|
|
16
|
+
export declare function registerAgents(ctx: HostPluginContext): void;
|
|
17
|
+
//# sourceMappingURL=agents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/register/agents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAiE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAMpH,uEAAuE;AACvE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAQ7D;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAkB3D"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { getSnapshot, getRegisteredAgentNames, setRegisteredAgentNames } from '../assets-store.js';
|
|
2
|
+
/** reviewer 专属信息边界(T202608260002 A 版定版 + T202609220001 修订;仅 function=reviewer 注入) */
|
|
3
|
+
const AGENT_INFO_BOUNDARY = '任务依据限于项目代码、设计文档/执行报告及任务上下文(含任务信息、提示词、委派材料);不修改代码或文档,不执行测试、构建或发布命令;自身角色定义授权的采证操作(如浏览器交互、截图取证、读取运行证据)不受此限,其余过程产物读取与命令执行仍禁止。';
|
|
4
|
+
/** 资产 → 宿主 system(writer.ts:166-172 同构:身份 + 绑定技能加载指令 + 条件信息边界 + 正文) */
|
|
5
|
+
export function agentToSystemPrompt(agent) {
|
|
6
|
+
const identity = '你是subagent,正在接受主会话的委派任务。';
|
|
7
|
+
const skillLine = agent.boundSkills.length > 0
|
|
8
|
+
? `这个任务必须先加载SKILL:${JSON.stringify(agent.boundSkills)} 后再执行。`
|
|
9
|
+
: '';
|
|
10
|
+
const boundary = agent.function === 'reviewer' ? AGENT_INFO_BOUNDARY : '';
|
|
11
|
+
return `${identity}${skillLine}${boundary}\n\n${agent.systemPrompt}`;
|
|
12
|
+
}
|
|
13
|
+
export function registerAgents(ctx) {
|
|
14
|
+
ctx.agent.transform((editor) => {
|
|
15
|
+
// 对账:store 已无但上轮注册过的名字移除(停用/删除消失)
|
|
16
|
+
const currentNames = new Set(getSnapshot().agents.map((agent) => agent.name));
|
|
17
|
+
for (const name of getRegisteredAgentNames()) {
|
|
18
|
+
if (!currentNames.has(name))
|
|
19
|
+
editor.remove(name);
|
|
20
|
+
}
|
|
21
|
+
setRegisteredAgentNames(currentNames);
|
|
22
|
+
for (const agent of getSnapshot().agents) {
|
|
23
|
+
const system = agentToSystemPrompt(agent);
|
|
24
|
+
editor.update(agent.name, (item) => {
|
|
25
|
+
item.description = agent.description;
|
|
26
|
+
item.system = system;
|
|
27
|
+
item.mode = 'subagent';
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/register/agents.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,uBAAuB,EAAmB,MAAM,oBAAoB,CAAC;AAEpH,qFAAqF;AACrF,MAAM,mBAAmB,GACvB,2HAA2H,CAAC;AAE9H,uEAAuE;AACvE,MAAM,UAAU,mBAAmB,CAAC,KAAiB;IACnD,MAAM,QAAQ,GAAG,0BAA0B,CAAC;IAC5C,MAAM,SAAS,GACb,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;QAC1B,CAAC,CAAC,kBAAkB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ;QAC7D,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,OAAO,KAAK,CAAC,YAAY,EAAE,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAsB;IACnD,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE;QAC7B,kCAAkC;QAClC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9E,KAAK,MAAM,IAAI,IAAI,uBAAuB,EAAE,EAAE,CAAC;YAC7C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;QACD,uBAAuB,CAAC,YAAY,CAAC,CAAC;QAEtC,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC,MAAM,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;gBACjC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;gBACrC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;gBACrB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;YACzB,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP 通道注册(技术方案 §4.C1 / §4.B register/mcp.ts)。
|
|
3
|
+
*
|
|
4
|
+
* 注册名固定 `siming`:宿主 ConfigMcpPlugin(pre 内置)处理用户 jsonc mcp 段与插件注册的
|
|
5
|
+
* 同名关系=插件胜(§4.D 域分治);MCP 工具二级命名 `siming_task` / `siming_template` / `siming_auth`
|
|
6
|
+
* 由 mcp-serve 子进程内定义,插件只负责拉起进程。
|
|
7
|
+
* 边界(§4.C1,已申报):serverUrl 在 mcp-serve 启动时定格(构造时解析一次闭包复用),
|
|
8
|
+
* 引导写入新绑定后须重启 opencode 才连向新地址。
|
|
9
|
+
*/
|
|
10
|
+
import type { HostPluginContext } from '../host-api.js';
|
|
11
|
+
export declare const MCP_SERVER_NAME = "siming";
|
|
12
|
+
export declare function registerMcp(ctx: HostPluginContext, cli: {
|
|
13
|
+
nodeBin: string;
|
|
14
|
+
cliJs: string;
|
|
15
|
+
}): void;
|
|
16
|
+
//# sourceMappingURL=mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/register/mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,eAAO,MAAM,eAAe,WAAW,CAAC;AAExC,wBAAgB,WAAW,CAAC,GAAG,EAAE,iBAAiB,EAAE,GAAG,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAOjG"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const MCP_SERVER_NAME = 'siming';
|
|
2
|
+
export function registerMcp(ctx, cli) {
|
|
3
|
+
ctx.mcp.transform((editor) => {
|
|
4
|
+
editor.set(MCP_SERVER_NAME, {
|
|
5
|
+
type: 'local',
|
|
6
|
+
command: [cli.nodeBin, cli.cliJs, 'mcp-serve'],
|
|
7
|
+
});
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/register/mcp.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC;AAExC,MAAM,UAAU,WAAW,CAAC,GAAsB,EAAE,GAAuC;IACzF,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE;QAC3B,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE;YAC1B,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC;SAC/C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* siming_refresh 本地工具注册(技术方案 §4.C2b / §4.B register/refresh-tool.ts)。
|
|
3
|
+
*
|
|
4
|
+
* 手动刷新入口:execute 直调 revalidate({force:true})——跳过指纹直接全链重拉;
|
|
5
|
+
* single-flight 不豁免(进行中返回「刷新进行中」);变更下一请求生效(如实告知时序)。
|
|
6
|
+
* 报告含项目作用域就位确认(§4.F 第 4 步):绑定项目时对照技能/子代理数量与 task-create 就位状态,
|
|
7
|
+
* 缺项如实报出(弱校验——compose 产出名单逐项对照由引导对话执行,工具报告提供数据面)。
|
|
8
|
+
*/
|
|
9
|
+
import type { HostPluginContext } from '../host-api.js';
|
|
10
|
+
export declare const SIMING_REFRESH_TOOL_NAME = "siming_refresh";
|
|
11
|
+
export declare function registerRefreshTool(ctx: HostPluginContext, directory: string): void;
|
|
12
|
+
//# sourceMappingURL=refresh-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh-tool.d.ts","sourceRoot":"","sources":["../../src/register/refresh-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAgB,MAAM,gBAAgB,CAAC;AAKtE,eAAO,MAAM,wBAAwB,mBAAmB,CAAC;AAezD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CA+BnF"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { revalidate, getLastResolvedTarget } from '../revalidate.js';
|
|
3
|
+
import { getSnapshot } from '../assets-store.js';
|
|
4
|
+
export const SIMING_REFRESH_TOOL_NAME = 'siming_refresh';
|
|
5
|
+
function domainLine(label, outcome) {
|
|
6
|
+
switch (outcome.status) {
|
|
7
|
+
case 'refreshed':
|
|
8
|
+
return `${label}域已刷新:${String(outcome.count ?? 0)} 条`;
|
|
9
|
+
case 'unchanged':
|
|
10
|
+
return `${label}域无变化`;
|
|
11
|
+
case 'in-progress':
|
|
12
|
+
return `${label}域刷新进行中`;
|
|
13
|
+
case 'failed':
|
|
14
|
+
return `${label}域刷新失败:${outcome.error ?? '未知错误'}`;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function registerRefreshTool(ctx, directory) {
|
|
18
|
+
const info = {
|
|
19
|
+
name: SIMING_REFRESH_TOOL_NAME,
|
|
20
|
+
description: '刷新 siming 资产注册(技能/子代理):跳过指纹直连 server 全链重拉,变更下一请求生效。' +
|
|
21
|
+
'用于接入引导 doctor 通过后显式调用一次,或 server 侧资产变更后手动同步。',
|
|
22
|
+
input: z.object({}).describe('无参数'),
|
|
23
|
+
execute: async (_input, _toolCtx) => {
|
|
24
|
+
const summary = await revalidate({ force: true, directory, source: 'refresh' });
|
|
25
|
+
const lines = [`server:${getLastResolvedTarget()?.serverUrl ?? '(解析失败)'}`];
|
|
26
|
+
lines.push(domainLine('技能', summary.skill));
|
|
27
|
+
lines.push(domainLine('子代理', summary.agent));
|
|
28
|
+
// 项目作用域就位确认(弱校验):绑定项目时报告 task-create 就位状态与数量
|
|
29
|
+
const target = getLastResolvedTarget();
|
|
30
|
+
if (target !== null && target.projectId !== null) {
|
|
31
|
+
const snapshot = getSnapshot();
|
|
32
|
+
const hasTaskCreate = snapshot.skills.some((skill) => skill.name === 'task-create');
|
|
33
|
+
lines.push(hasTaskCreate
|
|
34
|
+
? '项目作用域确认:task-create 已注册(数量对照 flow compose 产出名单请见引导第 4 步)'
|
|
35
|
+
: '项目作用域确认:未检测到 task-create 技能——请核对 flow compose 是否已执行/产出名单,缺项如实上报');
|
|
36
|
+
}
|
|
37
|
+
lines.push('(刷新完成 ≠ 当前请求内立即可见,下一请求生效)');
|
|
38
|
+
return { content: lines.join('\n') };
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
ctx.tool.transform((editor) => {
|
|
42
|
+
editor.add(info);
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=refresh-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh-tool.js","sourceRoot":"","sources":["../../src/register/refresh-tool.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAsB,MAAM,kBAAkB,CAAC;AACzF,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,MAAM,wBAAwB,GAAG,gBAAgB,CAAC;AAEzD,SAAS,UAAU,CAAC,KAAa,EAAE,OAAsB;IACvD,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;QACvB,KAAK,WAAW;YACd,OAAO,GAAG,KAAK,QAAQ,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC;QACxD,KAAK,WAAW;YACd,OAAO,GAAG,KAAK,MAAM,CAAC;QACxB,KAAK,aAAa;YAChB,OAAO,GAAG,KAAK,QAAQ,CAAC;QAC1B,KAAK,QAAQ;YACX,OAAO,GAAG,KAAK,SAAS,OAAO,CAAC,KAAK,IAAI,MAAM,EAAE,CAAC;IACtD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAsB,EAAE,SAAiB;IAC3E,MAAM,IAAI,GAAiB;QACzB,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EACT,qDAAqD;YACrD,8CAA8C;QAChD,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QACnC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;YAClC,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YAChF,MAAM,KAAK,GAAG,CAAC,UAAU,qBAAqB,EAAE,EAAE,SAAS,IAAI,QAAQ,EAAE,CAAC,CAAC;YAC3E,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YAE7C,6CAA6C;YAC7C,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC;YACvC,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;gBACjD,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;gBAC/B,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;gBACpF,KAAK,CAAC,IAAI,CACR,aAAa;oBACX,CAAC,CAAC,0DAA0D;oBAC5D,CAAC,CAAC,iEAAiE,CACtE,CAAC;YACJ,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YACxC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,CAAC;KACF,CAAC;IACF,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE;QAC5B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 技能域注册(技术方案 §4.C3-4 / §4.B register/skills.ts)。
|
|
3
|
+
*
|
|
4
|
+
* transform 全量对账重放(§4.C3-5):
|
|
5
|
+
* 1. 对账簿比对——上轮注册过但本轮 store 已无的名字 ed.remove(停用/删除的消失不依赖宿主 reload 实现形态);
|
|
6
|
+
* 2. store 内全部技能 add(正文内嵌消费,path=合成展示路径——内置技能 /builtin/*.md 先例,
|
|
7
|
+
* references 已在拉取时物化并改写为绝对路径);
|
|
8
|
+
* 3. 引导技能固定注册(五样常驻之一,不随拉取变化)。
|
|
9
|
+
* transform 每请求重放,读的是 assets-store 当前快照——刷新替换 store 后下一请求即见新名单。
|
|
10
|
+
*/
|
|
11
|
+
import type { HostPluginContext } from '../host-api.js';
|
|
12
|
+
export declare function registerSkills(ctx: HostPluginContext): void;
|
|
13
|
+
//# sourceMappingURL=skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/register/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAKxD,wBAAgB,cAAc,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAuB3D"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { skillDisplayPath } from '../host-api.js';
|
|
2
|
+
import { getSnapshot, getRegisteredSkillNames, setRegisteredSkillNames } from '../assets-store.js';
|
|
3
|
+
import { guideSkillInfo } from '../guide-skill.js';
|
|
4
|
+
export function registerSkills(ctx) {
|
|
5
|
+
ctx.skill.transform((editor) => {
|
|
6
|
+
// 1. 对账:store 已无但上轮注册过的名字移除(停用/删除消失)
|
|
7
|
+
const currentNames = new Set(getSnapshot().skills.map((skill) => skill.name));
|
|
8
|
+
for (const name of getRegisteredSkillNames()) {
|
|
9
|
+
if (!currentNames.has(name))
|
|
10
|
+
editor.remove(name);
|
|
11
|
+
}
|
|
12
|
+
setRegisteredSkillNames(currentNames);
|
|
13
|
+
// 2. 全量注册(同名 project 胜已在拉取侧 Map 合并完成)
|
|
14
|
+
for (const skill of getSnapshot().skills) {
|
|
15
|
+
editor.add({
|
|
16
|
+
id: skill.name,
|
|
17
|
+
name: skill.name,
|
|
18
|
+
description: skill.description,
|
|
19
|
+
path: skillDisplayPath(skill.name),
|
|
20
|
+
content: skill.content,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
// 3. 引导技能(固定常驻)
|
|
24
|
+
editor.add(guideSkillInfo());
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/register/skills.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,UAAU,cAAc,CAAC,GAAsB;IACnD,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE;QAC7B,qCAAqC;QACrC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9E,KAAK,MAAM,IAAI,IAAI,uBAAuB,EAAE,EAAE,CAAC;YAC7C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;QACD,uBAAuB,CAAC,YAAY,CAAC,CAAC;QAEtC,sCAAsC;QACtC,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC,MAAM,EAAE,CAAC;YACzC,MAAM,CAAC,GAAG,CAAC;gBACT,EAAE,EAAE,KAAK,CAAC,IAAI;gBACd,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,IAAI,EAAE,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;gBAClC,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;QACL,CAAC;QAED,gBAAgB;QAChB,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* siming_cli 工具注册(技术方案 §4.C2a / §4.B register/tools.ts)。
|
|
3
|
+
* 工具定义与 spawn 包装在 tools/simming-cli.ts(§4.B 文件树职责拆分)。
|
|
4
|
+
*/
|
|
5
|
+
import type { HostPluginContext } from '../host-api.js';
|
|
6
|
+
export { SIMING_CLI_TOOL_NAME } from '../tools/simming-cli.js';
|
|
7
|
+
export declare function registerSimingCli(ctx: HostPluginContext, cli: {
|
|
8
|
+
nodeBin: string;
|
|
9
|
+
cliJs: string;
|
|
10
|
+
}, directory: string): void;
|
|
11
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/register/tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/D,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,iBAAiB,EACtB,GAAG,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EACvC,SAAS,EAAE,MAAM,GAChB,IAAI,CAIN"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { simingCliToolInfo } from '../tools/simming-cli.js';
|
|
2
|
+
export { SIMING_CLI_TOOL_NAME } from '../tools/simming-cli.js';
|
|
3
|
+
export function registerSimingCli(ctx, cli, directory) {
|
|
4
|
+
ctx.tool.transform((editor) => {
|
|
5
|
+
editor.add(simingCliToolInfo(cli, directory));
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/register/tools.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/D,MAAM,UAAU,iBAAiB,CAC/B,GAAsB,EACtB,GAAuC,EACvC,SAAiB;IAEjB,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE;QAC5B,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 再验证调度(技术方案 §4.C3 第 4-6 条:三触发 + 指纹协商 + single-flight)。
|
|
3
|
+
*
|
|
4
|
+
* 三触发(唯一入口均在本模块):
|
|
5
|
+
* 1. 初始化:setup 同步阻塞有界等待(INIT_BUDGET_MS),失败空集注册不中断激活(§4.G 行 1);
|
|
6
|
+
* 2. 任务创建触发:ctx.tool.hook("execute.after") 观测 MCP siming_task 的 create 动作,
|
|
7
|
+
* fire-and-forget(不 await、异常吞掉),目录基准=setup 捕获的 location directory
|
|
8
|
+
* (ctx.location.directory,与初始化触发同源——钩子载荷无 directory 字段);
|
|
9
|
+
* 3. 手动:siming_refresh 工具直调 revalidate({force:true}),force=跳过指纹直接全链重拉。
|
|
10
|
+
*
|
|
11
|
+
* 指纹协商:每域一次列表请求比对 name@scope|version|updatedAt|enabled;
|
|
12
|
+
* 指纹仅对应域重拉成功后写入(失败不前移,下次触发自然重试)。
|
|
13
|
+
* single-flight:每域独立闸门,进行中新触发直接返回不重入(siming_refresh 拿到 in-progress 如实上报)。
|
|
14
|
+
* 变更生效:store 原子替换 → 对应域 reload() → 下一请求生效(宿主按名单重建会话注入面)。
|
|
15
|
+
* 失败:保留现有注册(不空转),限频 console.error(连续相同消息只打一次)。
|
|
16
|
+
*/
|
|
17
|
+
import type { HostToolDomain } from './host-api.js';
|
|
18
|
+
export type Domain = 'skill' | 'agent';
|
|
19
|
+
export type DomainStatus = 'unchanged' | 'refreshed' | 'failed' | 'in-progress';
|
|
20
|
+
export interface DomainOutcome {
|
|
21
|
+
status: DomainStatus;
|
|
22
|
+
/** refreshed 时的资产条数 */
|
|
23
|
+
count?: number;
|
|
24
|
+
/** failed 时的错误描述(已限频打日志,此处供 siming_refresh 摘要透出) */
|
|
25
|
+
error?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface RevalidateSummary {
|
|
28
|
+
skill: DomainOutcome;
|
|
29
|
+
agent: DomainOutcome;
|
|
30
|
+
}
|
|
31
|
+
/** setup 调用:记录本插件实例绑定 location 的目录(插件按活跃 location 各跑一份 setup) */
|
|
32
|
+
export declare function setLocationDirectory(directory: string): void;
|
|
33
|
+
export declare function getLastResolvedTarget(): {
|
|
34
|
+
serverUrl: string;
|
|
35
|
+
projectId: string | null;
|
|
36
|
+
} | null;
|
|
37
|
+
export declare function setReloader(domain: Domain, reload: () => Promise<void> | void): void;
|
|
38
|
+
/**
|
|
39
|
+
* 再验证(两域并行独立)。
|
|
40
|
+
* - siming_refresh:force=true(跳过指纹),目录=注册闭包持有的 location directory,await 返回摘要;
|
|
41
|
+
* - 任务创建触发:force=false,目录=setup 捕获的 location directory(钩子载荷无 directory 字段),fire-and-forget。
|
|
42
|
+
*/
|
|
43
|
+
export declare function revalidate(opts: {
|
|
44
|
+
force: boolean;
|
|
45
|
+
directory?: string;
|
|
46
|
+
source: 'task-create' | 'refresh';
|
|
47
|
+
}): Promise<RevalidateSummary>;
|
|
48
|
+
/**
|
|
49
|
+
* 初始化拉取(setup 同步阻塞,有界等待 budgetMs,缺省 INIT_BUDGET_MS)。
|
|
50
|
+
* - 成功:两域 store + 指纹就位,返回 true;
|
|
51
|
+
* - 失败/超时:返回 false(store 保持空集,激活继续注册空名单——首个 siming_refresh/任务创建触发自愈)。
|
|
52
|
+
* 超时后底层拉取不取消:迟到成功仍会写入 store(下次请求即见),只是不再阻塞激活。
|
|
53
|
+
* budgetMs 参数为测试缝(§6:init 有界等待行为单测可缩短预算)——生产调用方不传。
|
|
54
|
+
*/
|
|
55
|
+
export declare function initFetch(startDir: string, budgetMs?: number): Promise<boolean>;
|
|
56
|
+
/**
|
|
57
|
+
* 注册任务创建观测(setup 调用一次)。
|
|
58
|
+
* 仅 MCP siming_task + action=create + 执行成功 → fire-and-forget revalidate(不 await,异常吞掉——
|
|
59
|
+
* 闸门防重入,失败留限频日志)。窄观测面:siming_cli / 终端 CLI 建任务不触发(防参数字符串解析脆弱)。
|
|
60
|
+
*
|
|
61
|
+
* 目录基准(v2.0.26 实测修订,§4.C3-3):宿主钩子载荷仅含 sessionID(无 directory 字段),
|
|
62
|
+
* 但插件 setup ctx.location.directory 存在(setup 时捕获,setLocationDirectory)——任务创建触发
|
|
63
|
+
* 与初始化触发同取捕获值(同一 location 的插件实例,目录天然一致)。
|
|
64
|
+
* 多 location 形态(一个宿主进程多个活跃项目目录)下各 location 独立 setup 各自捕获;
|
|
65
|
+
* 模块级 store 单实例=最后捕获者生效(当前边界,PRD 非目标:单 location 主场景)。
|
|
66
|
+
*/
|
|
67
|
+
export declare function observeTaskCreate(toolDomain: HostToolDomain): void;
|
|
68
|
+
//# sourceMappingURL=revalidate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revalidate.d.ts","sourceRoot":"","sources":["../src/revalidate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,cAAc,EAA8B,MAAM,eAAe,CAAC;AAoBhF,MAAM,MAAM,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAEvC,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,GAAG,aAAa,CAAC;AAEhF,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,CAAC;IACrB,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,EAAE,aAAa,CAAC;CACtB;AAeD,iEAAiE;AACjE,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAE5D;AAaD,wBAAgB,qBAAqB,IAAI;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAE9F;AAKD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAEpF;AA4ED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,aAAa,GAAG,SAAS,CAAC;CACnC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAY7B;AAED;;;;;;GAMG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAuB,GAAG,OAAO,CAAC,OAAO,CAAC,CAerG;AAoCD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,cAAc,GAAG,IAAI,CAUlE"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { fetchAgentsDomain, fetchAgentCheckFingerprint, fetchSkillsDomain, fetchSkillCheckFingerprint, resolveFetchPlan, } from './fetch-assets.js';
|
|
2
|
+
import { getAgentFingerprint, getSkillFingerprint, replaceAgents, replaceSkills, setAgentFingerprint, setSkillFingerprint, } from './assets-store.js';
|
|
3
|
+
/** setup 同步阻塞的初始化拉取预算(§4.C3-3:AbortSignal.timeout(10_000) 有界) */
|
|
4
|
+
const INIT_BUDGET_MS = 10_000;
|
|
5
|
+
// ── 模块状态(单宿主进程单实例;setup 一次注册) ──
|
|
6
|
+
/** 每域 single-flight 闸门:进行中的任务 Promise;新触发见非空即跳过该域 */
|
|
7
|
+
const gates = { skill: null, agent: null };
|
|
8
|
+
/** 变更后通知宿主重建注入面的 reload 通道(index.ts setup 时注入;未注入=宿主无此域注册,静默跳过) */
|
|
9
|
+
const reloaders = {};
|
|
10
|
+
// ── location directory 捕获(setup 时写入;三触发目录基准的唯一来源) ──
|
|
11
|
+
/** setup 捕获的 location directory(v2.0.26:ctx.location.directory;未捕获时兜底宿主进程 cwd) */
|
|
12
|
+
let capturedLocationDirectory = null;
|
|
13
|
+
/** setup 调用:记录本插件实例绑定 location 的目录(插件按活跃 location 各跑一份 setup) */
|
|
14
|
+
export function setLocationDirectory(directory) {
|
|
15
|
+
capturedLocationDirectory = directory;
|
|
16
|
+
}
|
|
17
|
+
/** 目录基准读取:捕获值优先,未捕获(异常场景/setup 前触发)兜底 process.cwd() */
|
|
18
|
+
function locationDirectory() {
|
|
19
|
+
return capturedLocationDirectory ?? process.cwd();
|
|
20
|
+
}
|
|
21
|
+
/** 工作区项目 key→hex id 缓存:稳态检查跳过 /api/projects 解析,保持每域 1 次列表请求 */
|
|
22
|
+
let projectCache = null;
|
|
23
|
+
/** 最近一次成功解析的拉取目标(siming_refresh 报告项目作用域就位确认用;进程启动后未解析过=null) */
|
|
24
|
+
let lastResolvedTarget = null;
|
|
25
|
+
export function getLastResolvedTarget() {
|
|
26
|
+
return lastResolvedTarget;
|
|
27
|
+
}
|
|
28
|
+
/** 限频去重:每域连续相同的错误消息只打一次(消息变化才重打) */
|
|
29
|
+
const lastErrorByDomain = { skill: null, agent: null };
|
|
30
|
+
export function setReloader(domain, reload) {
|
|
31
|
+
reloaders[domain] = reload;
|
|
32
|
+
}
|
|
33
|
+
function logError(domain, message) {
|
|
34
|
+
if (lastErrorByDomain[domain] === message)
|
|
35
|
+
return; // 限频:连续相同不重打
|
|
36
|
+
lastErrorByDomain[domain] = message;
|
|
37
|
+
console.error(`[siming-plugin] 资产刷新失败(${domain === 'skill' ? '技能' : '子代理'}域,保留现有注册):${message}`);
|
|
38
|
+
}
|
|
39
|
+
async function runDomainJob(domain, opts) {
|
|
40
|
+
try {
|
|
41
|
+
const plan = await resolveFetchPlan(opts.directory, projectCache ?? undefined);
|
|
42
|
+
lastResolvedTarget = { serverUrl: plan.target.serverUrl, projectId: plan.projectId };
|
|
43
|
+
if (plan.projectId !== null && plan.target.projectKey !== null) {
|
|
44
|
+
projectCache = { key: plan.target.projectKey, id: plan.projectId };
|
|
45
|
+
}
|
|
46
|
+
if (!opts.force) {
|
|
47
|
+
const checked = domain === 'skill' ? await fetchSkillCheckFingerprint(plan) : await fetchAgentCheckFingerprint(plan);
|
|
48
|
+
const stored = domain === 'skill' ? getSkillFingerprint() : getAgentFingerprint();
|
|
49
|
+
if (checked === stored)
|
|
50
|
+
return { status: 'unchanged' };
|
|
51
|
+
}
|
|
52
|
+
let refreshedCount;
|
|
53
|
+
if (domain === 'skill') {
|
|
54
|
+
const result = await fetchSkillsDomain(plan);
|
|
55
|
+
replaceSkills(result.assets);
|
|
56
|
+
setSkillFingerprint(result.fingerprint);
|
|
57
|
+
refreshedCount = result.assets.length;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
const result = await fetchAgentsDomain(plan);
|
|
61
|
+
replaceAgents(result.assets);
|
|
62
|
+
setAgentFingerprint(result.fingerprint);
|
|
63
|
+
refreshedCount = result.assets.length;
|
|
64
|
+
}
|
|
65
|
+
const reload = reloaders[domain];
|
|
66
|
+
if (reload !== undefined)
|
|
67
|
+
await reload();
|
|
68
|
+
if (opts.source !== 'refresh') {
|
|
69
|
+
// 后台触发的变更完成:留一条可观测日志(siming_refresh 自带返回摘要,不重复打)
|
|
70
|
+
console.log(`[siming-plugin] 检测到资产变更,${domain === 'skill' ? '技能' : '子代理'}域已刷新(${String(refreshedCount)} 条,下一请求生效)`);
|
|
71
|
+
}
|
|
72
|
+
return { status: 'refreshed', count: refreshedCount };
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
76
|
+
logError(domain, message);
|
|
77
|
+
return { status: 'failed', error: message };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/** 带闸门的单域调度:进行中返回 in-progress 不重入 */
|
|
81
|
+
function dispatchDomain(domain, opts) {
|
|
82
|
+
const running = gates[domain];
|
|
83
|
+
if (running !== null)
|
|
84
|
+
return Promise.resolve({ status: 'in-progress' });
|
|
85
|
+
const job = runDomainJob(domain, opts).finally(() => {
|
|
86
|
+
gates[domain] = null;
|
|
87
|
+
});
|
|
88
|
+
gates[domain] = job;
|
|
89
|
+
return job;
|
|
90
|
+
}
|
|
91
|
+
// ── 对外入口 ──
|
|
92
|
+
/**
|
|
93
|
+
* 再验证(两域并行独立)。
|
|
94
|
+
* - siming_refresh:force=true(跳过指纹),目录=注册闭包持有的 location directory,await 返回摘要;
|
|
95
|
+
* - 任务创建触发:force=false,目录=setup 捕获的 location directory(钩子载荷无 directory 字段),fire-and-forget。
|
|
96
|
+
*/
|
|
97
|
+
export function revalidate(opts) {
|
|
98
|
+
const jobOpts = {
|
|
99
|
+
force: opts.force,
|
|
100
|
+
directory: opts.directory ?? locationDirectory(),
|
|
101
|
+
source: opts.source,
|
|
102
|
+
};
|
|
103
|
+
const skill = dispatchDomain('skill', jobOpts);
|
|
104
|
+
const agent = dispatchDomain('agent', jobOpts);
|
|
105
|
+
return Promise.all([skill, agent]).then(([skillOutcome, agentOutcome]) => ({
|
|
106
|
+
skill: skillOutcome,
|
|
107
|
+
agent: agentOutcome,
|
|
108
|
+
}));
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* 初始化拉取(setup 同步阻塞,有界等待 budgetMs,缺省 INIT_BUDGET_MS)。
|
|
112
|
+
* - 成功:两域 store + 指纹就位,返回 true;
|
|
113
|
+
* - 失败/超时:返回 false(store 保持空集,激活继续注册空名单——首个 siming_refresh/任务创建触发自愈)。
|
|
114
|
+
* 超时后底层拉取不取消:迟到成功仍会写入 store(下次请求即见),只是不再阻塞激活。
|
|
115
|
+
* budgetMs 参数为测试缝(§6:init 有界等待行为单测可缩短预算)——生产调用方不传。
|
|
116
|
+
*/
|
|
117
|
+
export async function initFetch(startDir, budgetMs = INIT_BUDGET_MS) {
|
|
118
|
+
const jobOpts = { force: true, directory: startDir, source: 'init' };
|
|
119
|
+
const timedFetch = Promise.all([dispatchDomain('skill', jobOpts), dispatchDomain('agent', jobOpts)]);
|
|
120
|
+
let budgetTimer;
|
|
121
|
+
const budget = new Promise((resolve) => {
|
|
122
|
+
budgetTimer = setTimeout(() => resolve(null), budgetMs);
|
|
123
|
+
});
|
|
124
|
+
const settled = await Promise.race([timedFetch.then(() => true), budget]);
|
|
125
|
+
clearTimeout(budgetTimer);
|
|
126
|
+
if (settled === true) {
|
|
127
|
+
const [skillOutcome, agentOutcome] = await timedFetch;
|
|
128
|
+
return skillOutcome.status === 'refreshed' && agentOutcome.status === 'refreshed';
|
|
129
|
+
}
|
|
130
|
+
console.error('[siming-plugin] 初始化拉取超时(10s)——空集注册继续激活,稍后触发自动补齐');
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
// ── 任务创建触发(§4.C3-3:execute.after 观测) ──
|
|
134
|
+
/** 从 execute.after 载荷提取工具名(V8 申报:载荷形态以实测锚定,容错多种呈现) */
|
|
135
|
+
function extractToolName(tool) {
|
|
136
|
+
if (typeof tool === 'string')
|
|
137
|
+
return tool;
|
|
138
|
+
if (typeof tool === 'object' && tool !== null) {
|
|
139
|
+
const name = tool.name;
|
|
140
|
+
if (typeof name === 'string')
|
|
141
|
+
return name;
|
|
142
|
+
}
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
/** MCP 工具名匹配 siming_task(含 mcp__siming_siming_task 等宿主前缀形态;精确匹配不吃配,includes 不误伤 siming_template) */
|
|
146
|
+
function isSimingTaskTool(name) {
|
|
147
|
+
return name.includes('siming_task');
|
|
148
|
+
}
|
|
149
|
+
/** 仅观测 create 动作(args 形态不可判定=不触发——保守面,防误判其他 action) */
|
|
150
|
+
function isCreateArgs(args) {
|
|
151
|
+
if (typeof args !== 'object' || args === null || Array.isArray(args))
|
|
152
|
+
return false;
|
|
153
|
+
return args.action === 'create';
|
|
154
|
+
}
|
|
155
|
+
/** 执行失败判定(best-effort):MCP 工具真实返回形态为 {content:[...]}(§2 V8),无 success 字段可判——
|
|
156
|
+
* 仅识别自造/少数带 success 的载荷;判不出失败=按成功处理(代价=多 2 次列表请求,指纹 unchanged 即止,
|
|
157
|
+
* 不会错误重拉)。显式裁定(v12):待 V8 实测锚定真实失败形态后再对齐字段。 */
|
|
158
|
+
function isFailedOutput(output) {
|
|
159
|
+
const inner = output?.output;
|
|
160
|
+
if (typeof inner === 'object' && inner !== null && inner.success === false) {
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* 注册任务创建观测(setup 调用一次)。
|
|
167
|
+
* 仅 MCP siming_task + action=create + 执行成功 → fire-and-forget revalidate(不 await,异常吞掉——
|
|
168
|
+
* 闸门防重入,失败留限频日志)。窄观测面:siming_cli / 终端 CLI 建任务不触发(防参数字符串解析脆弱)。
|
|
169
|
+
*
|
|
170
|
+
* 目录基准(v2.0.26 实测修订,§4.C3-3):宿主钩子载荷仅含 sessionID(无 directory 字段),
|
|
171
|
+
* 但插件 setup ctx.location.directory 存在(setup 时捕获,setLocationDirectory)——任务创建触发
|
|
172
|
+
* 与初始化触发同取捕获值(同一 location 的插件实例,目录天然一致)。
|
|
173
|
+
* 多 location 形态(一个宿主进程多个活跃项目目录)下各 location 独立 setup 各自捕获;
|
|
174
|
+
* 模块级 store 单实例=最后捕获者生效(当前边界,PRD 非目标:单 location 主场景)。
|
|
175
|
+
*/
|
|
176
|
+
export function observeTaskCreate(toolDomain) {
|
|
177
|
+
void toolDomain.hook('execute.after', (input, output) => {
|
|
178
|
+
const name = extractToolName(input.tool);
|
|
179
|
+
if (name === null || !isSimingTaskTool(name))
|
|
180
|
+
return;
|
|
181
|
+
if (!isCreateArgs(input.args))
|
|
182
|
+
return;
|
|
183
|
+
if (isFailedOutput(output))
|
|
184
|
+
return;
|
|
185
|
+
void revalidate({ force: false, source: 'task-create' }).catch(() => {
|
|
186
|
+
// fire-and-forget:异常吞掉(runDomainJob 内部已捕获留痕,此处兜底防未处理拒绝)
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=revalidate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revalidate.js","sourceRoot":"","sources":["../src/revalidate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAkB,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AA6DxE,QAAA,MAAM,MAAM;;iBAES,iBAAiB,KAAG,OAAO,CAAC,IAAI,CAAC;CAmCrD,CAAC;AAEF,eAAe,MAAM,CAAC"}
|