@siming-org/opencode-plugin 0.1.12 → 0.1.13
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/README.md +2 -2
- package/dist/assets-store.d.ts +32 -20
- package/dist/assets-store.d.ts.map +1 -1
- package/dist/assets-store.js +42 -51
- package/dist/assets-store.js.map +1 -1
- package/dist/fetch-assets.d.ts +10 -2
- package/dist/fetch-assets.d.ts.map +1 -1
- package/dist/fetch-assets.js +31 -5
- package/dist/fetch-assets.js.map +1 -1
- package/dist/register/agents.d.ts +3 -2
- package/dist/register/agents.d.ts.map +1 -1
- package/dist/register/agents.js +6 -6
- package/dist/register/agents.js.map +1 -1
- package/dist/register/refresh-tool.d.ts +4 -1
- package/dist/register/refresh-tool.d.ts.map +1 -1
- package/dist/register/refresh-tool.js +13 -10
- package/dist/register/refresh-tool.js.map +1 -1
- package/dist/register/skills.d.ts +3 -1
- package/dist/register/skills.d.ts.map +1 -1
- package/dist/register/skills.js +6 -6
- package/dist/register/skills.js.map +1 -1
- package/dist/revalidate.d.ts +37 -36
- package/dist/revalidate.d.ts.map +1 -1
- package/dist/revalidate.js +147 -149
- package/dist/revalidate.js.map +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +30 -20
- package/dist/server/index.js.map +1 -1
- package/dist/task-discipline-prompt.d.ts +1 -0
- package/dist/task-discipline-prompt.d.ts.map +1 -1
- package/dist/task-discipline-prompt.js +6 -4
- package/dist/task-discipline-prompt.js.map +1 -1
- package/package.json +1 -1
package/dist/revalidate.d.ts
CHANGED
|
@@ -1,20 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 再验证调度(技术方案 §4.C3 第 4-6 条:三触发 + 指纹协商 + single-flight)。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* 三触发(唯一入口均在本模块,全部作用于构造时的 location 实例):
|
|
5
5
|
* 1. 初始化:setup 同步阻塞有界等待(INIT_BUDGET_MS),失败空集注册不中断激活(§4.G 行 1);
|
|
6
6
|
* 2. 任务创建触发:ctx.tool.hook("execute.after") 观测 MCP siming_task 的 create 动作,
|
|
7
|
-
* fire-and-forget(不 await
|
|
7
|
+
* fire-and-forget(不 await、异常吞掉),目录基准=构造参数 directory
|
|
8
8
|
* (ctx.location.directory,与初始化触发同源——钩子载荷无 directory 字段);
|
|
9
9
|
* 3. 手动:siming_refresh 工具直调 revalidate({force:true}),force=跳过指纹直接全链重拉。
|
|
10
10
|
*
|
|
11
|
+
* per-location 实例(T202610220003):gates/reloaders/projectCache/lastResolvedTarget/
|
|
12
|
+
* lastErrorByDomain 全部闭包在 createRevalidator 实例内——多 location(一个宿主进程多个
|
|
13
|
+
* 活跃项目目录)各 setup 各构造,互不覆盖;reload 只打回本 location 的注册表。
|
|
14
|
+
* single-flight 闸门为实例内语义:同 location 三触发互斥,跨 location 拉取目标不同不互斥。
|
|
15
|
+
*
|
|
11
16
|
* 指纹协商:每域一次列表请求比对 name@scope|version|updatedAt|enabled;
|
|
12
17
|
* 指纹仅对应域重拉成功后写入(失败不前移,下次触发自然重试)。
|
|
13
|
-
* single-flight:每域独立闸门,进行中新触发直接返回不重入(siming_refresh 拿到 in-progress 如实上报)。
|
|
14
18
|
* 变更生效:store 原子替换 → 对应域 reload() → 下一请求生效(宿主按名单重建会话注入面)。
|
|
15
19
|
* 失败:保留现有注册(不空转),限频 console.error(连续相同消息只打一次)。
|
|
16
20
|
*/
|
|
17
21
|
import type { HostToolDomain } from './host-api.js';
|
|
22
|
+
import type { AssetsStore } from './assets-store.js';
|
|
18
23
|
export type Domain = 'skill' | 'agent';
|
|
19
24
|
export type DomainStatus = 'unchanged' | 'refreshed' | 'failed' | 'in-progress';
|
|
20
25
|
export interface DomainOutcome {
|
|
@@ -28,41 +33,37 @@ export interface RevalidateSummary {
|
|
|
28
33
|
skill: DomainOutcome;
|
|
29
34
|
agent: DomainOutcome;
|
|
30
35
|
}
|
|
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
36
|
/**
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
* - 失败/超时:返回 false(store 保持空集,激活继续注册空名单——首个 siming_refresh/任务创建触发自愈)。
|
|
52
|
-
* 超时后底层拉取不取消:迟到成功仍会写入 store(下次请求即见),只是不再阻塞激活。
|
|
53
|
-
* budgetMs 参数为测试缝(§6:init 有界等待行为单测可缩短预算)——生产调用方不传。
|
|
37
|
+
* 最近一次成功解析的拉取目标(siming_refresh/selfCheck 报告项目绑定状态用;未解析过=null)。
|
|
38
|
+
* 可辨识联合钉住不变量:projectId 非 null ⇔ projectSource 非 null(绑定必知来源,仅全局两者皆 null)
|
|
54
39
|
*/
|
|
55
|
-
export
|
|
40
|
+
export type ResolvedTarget = {
|
|
41
|
+
serverUrl: string;
|
|
42
|
+
projectId: string;
|
|
43
|
+
projectSource: 'workspace' | 'instance-default';
|
|
44
|
+
} | {
|
|
45
|
+
serverUrl: string;
|
|
46
|
+
projectId: null;
|
|
47
|
+
projectSource: null;
|
|
48
|
+
};
|
|
49
|
+
/** 再验证器实例接口(setup 时每 location 构造一个) */
|
|
50
|
+
export interface Revalidator {
|
|
51
|
+
/** 再验证(两域并行独立):force=true 跳过指纹;await 返回摘要 */
|
|
52
|
+
revalidate(opts: {
|
|
53
|
+
force: boolean;
|
|
54
|
+
source: 'task-create' | 'refresh';
|
|
55
|
+
}): Promise<RevalidateSummary>;
|
|
56
|
+
/** 初始化拉取(setup 同步阻塞有界等待;budgetMs 为测试缝,生产调用方不传) */
|
|
57
|
+
initFetch(budgetMs?: number): Promise<boolean>;
|
|
58
|
+
/** 变更后通知宿主重建注入面的 reload 通道(setup 时注入;未注入=宿主无此域注册,静默跳过) */
|
|
59
|
+
setReloader(domain: Domain, reload: () => Promise<void> | void): void;
|
|
60
|
+
/** 注册任务创建观测(setup 调用一次) */
|
|
61
|
+
observeTaskCreate(toolDomain: HostToolDomain): void;
|
|
62
|
+
getLastResolvedTarget(): ResolvedTarget | null;
|
|
63
|
+
}
|
|
56
64
|
/**
|
|
57
|
-
*
|
|
58
|
-
*
|
|
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 主场景)。
|
|
65
|
+
* 构造一个再验证器实例(setup 时每 location 调用一次)。
|
|
66
|
+
* store 与 directory 由调用方注入(同一 location 的 store/reloader/transform 回调闭环在各自实例)。
|
|
66
67
|
*/
|
|
67
|
-
export declare function
|
|
68
|
+
export declare function createRevalidator(store: AssetsStore, directory: string): Revalidator;
|
|
68
69
|
//# sourceMappingURL=revalidate.d.ts.map
|
package/dist/revalidate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"revalidate.d.ts","sourceRoot":"","sources":["../src/revalidate.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"revalidate.d.ts","sourceRoot":"","sources":["../src/revalidate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EAAE,cAAc,EAA8B,MAAM,eAAe,CAAC;AAShF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAKrD,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;;;GAGG;AACH,MAAM,MAAM,cAAc,GACtB;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,WAAW,GAAG,kBAAkB,CAAA;CAAE,GACzF;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,IAAI,CAAC;IAAC,aAAa,EAAE,IAAI,CAAA;CAAE,CAAC;AAEhE,uCAAuC;AACvC,MAAM,WAAW,WAAW;IAC1B,6CAA6C;IAC7C,UAAU,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,aAAa,GAAG,SAAS,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACpG,kDAAkD;IAClD,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,0DAA0D;IAC1D,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;IACtE,2BAA2B;IAC3B,iBAAiB,CAAC,UAAU,EAAE,cAAc,GAAG,IAAI,CAAC;IACpD,qBAAqB,IAAI,cAAc,GAAG,IAAI,CAAC;CAChD;AAUD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,CA8JpF"}
|
package/dist/revalidate.js
CHANGED
|
@@ -1,136 +1,159 @@
|
|
|
1
|
-
import { fetchAgentsDomain, fetchAgentCheckFingerprint, fetchSkillsDomain, fetchSkillCheckFingerprint, resolveFetchPlan, } from './fetch-assets.js';
|
|
2
|
-
import { getAgentFingerprint, getSkillFingerprint, replaceAgents, replaceSkills, setAgentFingerprint, setSkillFingerprint, } from './assets-store.js';
|
|
1
|
+
import { fetchAgentsDomain, fetchAgentCheckFingerprint, fetchSkillsDomain, fetchSkillCheckFingerprint, resolveFetchPlan, INSTANCE_DEFAULT_PROJECT_KEY, } from './fetch-assets.js';
|
|
3
2
|
/** setup 同步阻塞的初始化拉取预算(§4.C3-3:AbortSignal.timeout(10_000) 有界) */
|
|
4
3
|
const INIT_BUDGET_MS = 10_000;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
// ── location
|
|
11
|
-
/**
|
|
12
|
-
|
|
13
|
-
/** setup
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
4
|
+
/**
|
|
5
|
+
* 构造一个再验证器实例(setup 时每 location 调用一次)。
|
|
6
|
+
* store 与 directory 由调用方注入(同一 location 的 store/reloader/transform 回调闭环在各自实例)。
|
|
7
|
+
*/
|
|
8
|
+
export function createRevalidator(store, directory) {
|
|
9
|
+
// ── 实例状态(闭包持有;多 location 互不可见) ──
|
|
10
|
+
/** 每域 single-flight 闸门:进行中的任务 Promise;新触发见非空即跳过该域 */
|
|
11
|
+
const gates = { skill: null, agent: null };
|
|
12
|
+
/** 变更后通知宿主重建注入面的 reload 通道(setup 注入本 location 的 ctx 域 reload) */
|
|
13
|
+
const reloaders = {};
|
|
14
|
+
/** 工作区项目 key→hex id 缓存(含 key=default 兜底命中):稳态检查跳过 /api/projects 解析,保持每域 1 次列表请求 */
|
|
15
|
+
let projectCache = null;
|
|
16
|
+
let lastResolvedTarget = null;
|
|
17
|
+
/** 限频去重:每域连续相同的错误消息只打一次(消息变化才重打) */
|
|
18
|
+
const lastErrorByDomain = { skill: null, agent: null };
|
|
19
|
+
function logError(domain, message) {
|
|
20
|
+
if (lastErrorByDomain[domain] === message)
|
|
21
|
+
return; // 限频:连续相同不重打
|
|
22
|
+
lastErrorByDomain[domain] = message;
|
|
23
|
+
console.error(`[siming-plugin] 资产刷新失败(${domain === 'skill' ? '技能' : '子代理'}域,保留现有注册):${message}`);
|
|
24
|
+
}
|
|
25
|
+
// ── 单域任务(检查 → 差异 → 重拉 → 替换 → reload;目录基准=构造参数 directory) ──
|
|
26
|
+
async function runDomainJob(domain, opts) {
|
|
27
|
+
try {
|
|
28
|
+
const plan = await resolveFetchPlan(directory, projectCache ?? undefined);
|
|
29
|
+
lastResolvedTarget =
|
|
30
|
+
plan.projectId !== null
|
|
31
|
+
? {
|
|
32
|
+
serverUrl: plan.target.serverUrl,
|
|
33
|
+
projectId: plan.projectId,
|
|
34
|
+
projectSource: plan.target.projectKey !== null ? 'workspace' : 'instance-default',
|
|
35
|
+
}
|
|
36
|
+
: { serverUrl: plan.target.serverUrl, projectId: null, projectSource: null };
|
|
37
|
+
if (plan.projectId !== null) {
|
|
38
|
+
projectCache = { key: plan.target.projectKey ?? INSTANCE_DEFAULT_PROJECT_KEY, id: plan.projectId };
|
|
39
|
+
}
|
|
40
|
+
if (!opts.force) {
|
|
41
|
+
const checked = domain === 'skill' ? await fetchSkillCheckFingerprint(plan) : await fetchAgentCheckFingerprint(plan);
|
|
42
|
+
const stored = domain === 'skill' ? store.getSkillFingerprint() : store.getAgentFingerprint();
|
|
43
|
+
if (checked === stored)
|
|
44
|
+
return { status: 'unchanged' };
|
|
45
|
+
}
|
|
46
|
+
let refreshedCount;
|
|
47
|
+
if (domain === 'skill') {
|
|
48
|
+
const result = await fetchSkillsDomain(plan);
|
|
49
|
+
store.replaceSkills(result.assets);
|
|
50
|
+
store.setSkillFingerprint(result.fingerprint);
|
|
51
|
+
refreshedCount = result.assets.length;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
const result = await fetchAgentsDomain(plan);
|
|
55
|
+
store.replaceAgents(result.assets);
|
|
56
|
+
store.setAgentFingerprint(result.fingerprint);
|
|
57
|
+
refreshedCount = result.assets.length;
|
|
58
|
+
}
|
|
59
|
+
const reload = reloaders[domain];
|
|
60
|
+
if (reload !== undefined)
|
|
61
|
+
await reload();
|
|
62
|
+
if (opts.source !== 'refresh') {
|
|
63
|
+
// 后台触发的变更完成:留一条可观测日志(siming_refresh 自带返回摘要,不重复打)
|
|
64
|
+
console.log(`[siming-plugin] 检测到资产变更,${domain === 'skill' ? '技能' : '子代理'}域已刷新(${String(refreshedCount)} 条,下一请求生效)`);
|
|
65
|
+
}
|
|
66
|
+
return { status: 'refreshed', count: refreshedCount };
|
|
58
67
|
}
|
|
59
|
-
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
refreshedCount = result.assets.length;
|
|
68
|
+
catch (err) {
|
|
69
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
70
|
+
logError(domain, message);
|
|
71
|
+
return { status: 'failed', error: message };
|
|
64
72
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
73
|
+
}
|
|
74
|
+
/** 带闸门的单域调度:进行中返回 in-progress 不重入 */
|
|
75
|
+
function dispatchDomain(domain, opts) {
|
|
76
|
+
const running = gates[domain];
|
|
77
|
+
if (running !== null)
|
|
78
|
+
return Promise.resolve({ status: 'in-progress' });
|
|
79
|
+
const job = runDomainJob(domain, opts).finally(() => {
|
|
80
|
+
gates[domain] = null;
|
|
81
|
+
});
|
|
82
|
+
gates[domain] = job;
|
|
83
|
+
return job;
|
|
84
|
+
}
|
|
85
|
+
// ── 对外入口(实例方法) ──
|
|
86
|
+
/**
|
|
87
|
+
* 再验证(两域并行独立)。
|
|
88
|
+
* - siming_refresh:force=true(跳过指纹),await 返回摘要;
|
|
89
|
+
* - 任务创建触发:force=false,fire-and-forget。
|
|
90
|
+
* 目录基准=构造参数 directory(本 location 的 location directory)。
|
|
91
|
+
*/
|
|
92
|
+
function revalidate(opts) {
|
|
93
|
+
const jobOpts = { force: opts.force, source: opts.source };
|
|
94
|
+
const skill = dispatchDomain('skill', jobOpts);
|
|
95
|
+
const agent = dispatchDomain('agent', jobOpts);
|
|
96
|
+
return Promise.all([skill, agent]).then(([skillOutcome, agentOutcome]) => ({
|
|
97
|
+
skill: skillOutcome,
|
|
98
|
+
agent: agentOutcome,
|
|
99
|
+
}));
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* 初始化拉取(setup 同步阻塞,有界等待 budgetMs,缺省 INIT_BUDGET_MS)。
|
|
103
|
+
* - 成功:两域 store + 指纹就位,返回 true;
|
|
104
|
+
* - 失败/超时:返回 false(store 保持空集,激活继续注册空名单——首个 siming_refresh/任务创建触发自愈)。
|
|
105
|
+
* 超时后底层拉取不取消:迟到成功仍会写入 store(下次请求即见),只是不再阻塞激活。
|
|
106
|
+
* budgetMs 参数为测试缝(§6:init 有界等待行为单测可缩短预算)——生产调用方不传。
|
|
107
|
+
*/
|
|
108
|
+
async function initFetch(budgetMs = INIT_BUDGET_MS) {
|
|
109
|
+
const jobOpts = { force: true, source: 'init' };
|
|
110
|
+
const timedFetch = Promise.all([dispatchDomain('skill', jobOpts), dispatchDomain('agent', jobOpts)]);
|
|
111
|
+
let budgetTimer;
|
|
112
|
+
const budget = new Promise((resolve) => {
|
|
113
|
+
budgetTimer = setTimeout(() => resolve(null), budgetMs);
|
|
114
|
+
});
|
|
115
|
+
const settled = await Promise.race([timedFetch.then(() => true), budget]);
|
|
116
|
+
clearTimeout(budgetTimer);
|
|
117
|
+
if (settled === true) {
|
|
118
|
+
const [skillOutcome, agentOutcome] = await timedFetch;
|
|
119
|
+
return skillOutcome.status === 'refreshed' && agentOutcome.status === 'refreshed';
|
|
71
120
|
}
|
|
72
|
-
|
|
121
|
+
console.error('[siming-plugin] 初始化拉取超时(10s)——空集注册继续激活,稍后触发自动补齐');
|
|
122
|
+
return false;
|
|
73
123
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
124
|
+
/**
|
|
125
|
+
* 注册任务创建观测(setup 调用一次)。
|
|
126
|
+
* 仅 MCP siming_task + action=create + 执行成功 → fire-and-forget revalidate(不 await,异常吞掉——
|
|
127
|
+
* 闸门防重入,失败留限频日志)。窄观测面:siming_cli / 终端 CLI 建任务不触发(防参数字符串解析脆弱)。
|
|
128
|
+
*
|
|
129
|
+
* 目录基准(v2.0.26 实测修订,§4.C3-3):宿主钩子载荷仅含 sessionID(无 directory 字段),
|
|
130
|
+
* 故取构造参数 directory——同一 location 的插件实例,目录天然一致。
|
|
131
|
+
*/
|
|
132
|
+
function observeTaskCreate(toolDomain) {
|
|
133
|
+
void toolDomain.hook('execute.after', (input, output) => {
|
|
134
|
+
const name = extractToolName(input.tool);
|
|
135
|
+
if (name === null || !isSimingTaskTool(name))
|
|
136
|
+
return;
|
|
137
|
+
if (!isCreateArgs(input.args))
|
|
138
|
+
return;
|
|
139
|
+
if (isFailedOutput(output))
|
|
140
|
+
return;
|
|
141
|
+
void revalidate({ force: false, source: 'task-create' }).catch(() => {
|
|
142
|
+
// fire-and-forget:异常吞掉(runDomainJob 内部已捕获留痕,此处兜底防未处理拒绝)
|
|
143
|
+
});
|
|
144
|
+
});
|
|
78
145
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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,
|
|
146
|
+
return {
|
|
147
|
+
revalidate,
|
|
148
|
+
initFetch,
|
|
149
|
+
setReloader: (domain, reload) => {
|
|
150
|
+
reloaders[domain] = reload;
|
|
151
|
+
},
|
|
152
|
+
observeTaskCreate,
|
|
153
|
+
getLastResolvedTarget: () => lastResolvedTarget,
|
|
102
154
|
};
|
|
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
155
|
}
|
|
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 观测) ──
|
|
156
|
+
// ── 钩子载荷判定(纯函数,模块级共享) ──
|
|
134
157
|
/** 从 execute.after 载荷提取工具名(V8 申报:载荷形态以实测锚定,容错多种呈现) */
|
|
135
158
|
function extractToolName(tool) {
|
|
136
159
|
if (typeof tool === 'string')
|
|
@@ -162,29 +185,4 @@ function isFailedOutput(output) {
|
|
|
162
185
|
}
|
|
163
186
|
return false;
|
|
164
187
|
}
|
|
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
188
|
//# sourceMappingURL=revalidate.js.map
|
package/dist/revalidate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"revalidate.js","sourceRoot":"","sources":["../src/revalidate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"revalidate.js","sourceRoot":"","sources":["../src/revalidate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAkB,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AA8ExE,QAAA,MAAM,MAAM;;iBAES,iBAAiB,KAAG,OAAO,CAAC,IAAI,CAAC;CAwCrD,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
package/dist/server/index.js
CHANGED
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
* 仅激活时刻执行一次(此后动态增减由三触发点承接,正确性归 §6 刷新链单测)。
|
|
12
12
|
*/
|
|
13
13
|
import { checkHostVersion, locateCli } from '../cli-locator.js';
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
14
|
+
import { createAssetsStore } from '../assets-store.js';
|
|
15
|
+
import { createRevalidator } from '../revalidate.js';
|
|
16
16
|
import { MCP_SERVER_NAME, registerMcp } from '../register/mcp.js';
|
|
17
17
|
import { SIMING_CLI_TOOL_NAME, registerSimingCli } from '../register/tools.js';
|
|
18
18
|
import { SIMING_REFRESH_TOOL_NAME, registerRefreshTool } from '../register/refresh-tool.js';
|
|
@@ -20,10 +20,9 @@ import { registerTaskDiscipline } from '../register/task-discipline.js';
|
|
|
20
20
|
import { registerSkills } from '../register/skills.js';
|
|
21
21
|
import { registerAgents } from '../register/agents.js';
|
|
22
22
|
import { GUIDE_SKILL_NAME } from '../guide-skill.js';
|
|
23
|
-
import { getLastResolvedTarget } from '../revalidate.js';
|
|
24
23
|
import { listEntryNames } from '../host-api.js';
|
|
25
24
|
/** 激活自检(§4.G:固定项按双轴基准;动态项区分拉取失败与注册缺项;异常 console.error) */
|
|
26
|
-
async function selfCheck(ctx, opts) {
|
|
25
|
+
async function selfCheck(ctx, store, revalidator, opts) {
|
|
27
26
|
const problems = [];
|
|
28
27
|
let skillCount = 0;
|
|
29
28
|
let agentCount = 0;
|
|
@@ -57,7 +56,7 @@ async function selfCheck(ctx, opts) {
|
|
|
57
56
|
problems.push('任务纪律注入 session 域不可用(context hook 或 session.get 缺失)——本宿主不注入任务纪律提示词');
|
|
58
57
|
}
|
|
59
58
|
// 动态项:拉取成功但注册缺项(拉取失败时 store 为空、此处自然无比对项=预期降级不告警)
|
|
60
|
-
const snapshot = getSnapshot();
|
|
59
|
+
const snapshot = store.getSnapshot();
|
|
61
60
|
for (const skill of snapshot.skills) {
|
|
62
61
|
if (!skillNames.has(skill.name))
|
|
63
62
|
problems.push(`技能 ${skill.name} 已拉取但未出现在 skill 域注册表`);
|
|
@@ -76,10 +75,17 @@ async function selfCheck(ctx, opts) {
|
|
|
76
75
|
console.error(`[siming-plugin] 激活自检发现异常(${String(problems.length)} 项,doctor 会话内可二次查证):\n- ${problems.join('\n- ')}`);
|
|
77
76
|
return;
|
|
78
77
|
}
|
|
79
|
-
const target = getLastResolvedTarget();
|
|
78
|
+
const target = revalidator.getLastResolvedTarget();
|
|
79
|
+
const bindLabel = target === null
|
|
80
|
+
? ''
|
|
81
|
+
: target.projectId === null
|
|
82
|
+
? ''
|
|
83
|
+
: target.projectSource === 'workspace'
|
|
84
|
+
? ',项目已绑定(工作区 defaultProject)'
|
|
85
|
+
: ',项目已绑定(实例默认项目)';
|
|
80
86
|
console.log(`[siming-plugin] 激活完成:固定 ${opts.interpreterOk ? '5' : '3'} 项(解释器${opts.interpreterOk ? '正常' : '缺失降级'})` +
|
|
81
87
|
` + 技能 ${String(skillCount)} + 子代理 ${String(agentCount)}` +
|
|
82
|
-
`${target !== null ? `(server:${target.serverUrl}${
|
|
88
|
+
`${target !== null ? `(server:${target.serverUrl}${bindLabel})` : ''}` +
|
|
83
89
|
`${skillCount === 0 && agentCount === 0 ? '——资产拉取未成功(空集注册,首次建任务/手动刷新时自动重试)' : ''}`);
|
|
84
90
|
}
|
|
85
91
|
const plugin = {
|
|
@@ -92,27 +98,31 @@ const plugin = {
|
|
|
92
98
|
throw new Error('[siming-plugin] 安装损坏:@siming-org/cli 依赖解析失败——' +
|
|
93
99
|
'请执行 opencode plugin remove @siming-org/opencode-plugin && opencode plugin add @siming-org/opencode-plugin 重装');
|
|
94
100
|
}
|
|
95
|
-
//
|
|
96
|
-
// ctx.location.directory 于 setup 时可得——三触发与工具 cwd
|
|
101
|
+
// 目录基准:本 location 的 directory(v2.0.26 实测:ToolContext 无 directory 字段,
|
|
102
|
+
// ctx.location.directory 于 setup 时可得——三触发与工具 cwd 统一取此值)。
|
|
103
|
+
// per-location 实例(T202610220003):store + revalidator 每次各构造一个,本 location 的
|
|
104
|
+
// 拉取/注册/刷新/自检全链闭环在这对实例上——多 location 互不覆盖(历史缺陷:模块级单例被
|
|
105
|
+
// 最后完成初始化的 location 覆盖,其他 location 的 project 域技能从注册表消失)。
|
|
97
106
|
const directory = ctx.location.directory;
|
|
98
|
-
|
|
107
|
+
const store = createAssetsStore();
|
|
108
|
+
const revalidator = createRevalidator(store, directory);
|
|
99
109
|
// 注册面(解释器轴降级:MCP 与 siming_cli 跳过,其余照常;任务纪律注入不在此轴,仅依赖宿主 session 域)
|
|
100
110
|
if (nodeBin !== null)
|
|
101
111
|
registerMcp(ctx, { nodeBin, cliJs });
|
|
102
|
-
registerRefreshTool(ctx,
|
|
103
|
-
registerSkills(ctx);
|
|
104
|
-
registerAgents(ctx);
|
|
112
|
+
registerRefreshTool(ctx, revalidator, store);
|
|
113
|
+
registerSkills(ctx, store);
|
|
114
|
+
registerAgents(ctx, store);
|
|
105
115
|
if (nodeBin !== null)
|
|
106
116
|
registerSimingCli(ctx, { nodeBin, cliJs }, directory);
|
|
107
117
|
registerTaskDiscipline(ctx, directory);
|
|
108
|
-
// 变更生效通道 + 任务创建观测(fire-and-forget
|
|
109
|
-
setReloader('skill', () => ctx.skill.reload());
|
|
110
|
-
setReloader('agent', () => ctx.agent.reload());
|
|
111
|
-
observeTaskCreate(ctx.tool);
|
|
112
|
-
// 初始化拉取(setup 期会话未建立 → location directory 基准,§4.C3-3)
|
|
113
|
-
await initFetch(
|
|
118
|
+
// 变更生效通道 + 任务创建观测(fire-and-forget)——均注入本 location 实例
|
|
119
|
+
revalidator.setReloader('skill', () => ctx.skill.reload());
|
|
120
|
+
revalidator.setReloader('agent', () => ctx.agent.reload());
|
|
121
|
+
revalidator.observeTaskCreate(ctx.tool);
|
|
122
|
+
// 初始化拉取(setup 期会话未建立 → 构造时 location directory 基准,§4.C3-3)
|
|
123
|
+
await revalidator.initFetch();
|
|
114
124
|
// 激活自检(仅此刻一次)
|
|
115
|
-
await selfCheck(ctx, { interpreterOk: nodeBin !== null });
|
|
125
|
+
await selfCheck(ctx, store, revalidator, { interpreterOk: nodeBin !== null });
|
|
116
126
|
},
|
|
117
127
|
};
|
|
118
128
|
export default plugin;
|
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-discipline-prompt.d.ts","sourceRoot":"","sources":["../src/task-discipline-prompt.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"task-discipline-prompt.d.ts","sourceRoot":"","sources":["../src/task-discipline-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,QAW2B,CAAC"}
|