mister-wolf 2.18.2 → 2.18.4
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 +10 -10
- package/README.ru.md +1 -1
- package/dist/adapters/cli/commands/claim.d.ts.map +1 -1
- package/dist/adapters/cli/commands/claim.js +14 -3
- package/dist/adapters/cli/commands/claim.js.map +1 -1
- package/dist/adapters/cli/commands/face.d.ts.map +1 -1
- package/dist/adapters/cli/commands/face.js +15 -0
- package/dist/adapters/cli/commands/face.js.map +1 -1
- package/dist/adapters/fs/claim-registry.d.ts +40 -12
- package/dist/adapters/fs/claim-registry.d.ts.map +1 -1
- package/dist/adapters/fs/claim-registry.js +108 -44
- package/dist/adapters/fs/claim-registry.js.map +1 -1
- package/dist/app/use-cases/build-analytics.d.ts +3 -2
- package/dist/app/use-cases/build-analytics.d.ts.map +1 -1
- package/dist/app/use-cases/build-analytics.js +2 -1
- package/dist/app/use-cases/build-analytics.js.map +1 -1
- package/dist/app/use-cases/claim-artifact.d.ts +8 -2
- package/dist/app/use-cases/claim-artifact.d.ts.map +1 -1
- package/dist/app/use-cases/claim-artifact.js +9 -3
- package/dist/app/use-cases/claim-artifact.js.map +1 -1
- package/dist/app/use-cases/resolve-face.d.ts +37 -0
- package/dist/app/use-cases/resolve-face.d.ts.map +1 -0
- package/dist/app/use-cases/resolve-face.js +24 -0
- package/dist/app/use-cases/resolve-face.js.map +1 -0
- package/package.json +1 -1
- package/templates/.wolf/router.log +1 -1
- package/templates/opencode/plugins/wolf-router.ts +30 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claim-artifact.js","sourceRoot":"","sources":["../../../src/app/use-cases/claim-artifact.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EACL,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,cAAc,
|
|
1
|
+
{"version":3,"file":"claim-artifact.js","sourceRoot":"","sources":["../../../src/app/use-cases/claim-artifact.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EACL,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,cAAc,GAMf,MAAM,qCAAqC,CAAC;AAoB7C,SAAS,UAAU,CAAC,IAAuB;IACzC,OAAO;QACL,KAAK,EAAE,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;QAC3D,SAAS,EAAE,gBAAgB,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;QACpD,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG;KAC7B,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,IAAuB;IAC3C,OAAO;QACL,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI;QAC1C,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAuB,EAAE,QAAgB;IAC5E,OAAO,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE;QACtC,QAAQ;QACR,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC;QAC1B,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;KAC/B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,IAAuB,EACvB,QAAgB,EAChB,UAAmB;IAEnB,OAAO,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;AAChG,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAuB;IACxD,OAAO,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;AACxC,CAAC;AAED;;;6EAG6E;AAC7E,MAAM,UAAU,sBAAsB,CACpC,IAAuB,EACvB,QAAgB,EAChB,gBAAmF;IAEnF,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,QAAQ,GAAkC,gBAAgB;QAC9D,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,gBAAgB,EAAE;QAC3C,CAAC,CAAC,SAAS,CAAC;IACd,OAAO,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAChH,CAAC;AASD,MAAM,UAAU,cAAc,CAAC,IAAuB;IACpD,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO;QACL,YAAY,EAAE,CAAC,QAAgB,EAAE,EAAE,CACjC,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;KACnF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { MemoryStore } from '../../ports/memory-store.port.js';
|
|
2
|
+
/**
|
|
3
|
+
* 2.18.4: канонический резолвер лица агента. Строгий запрос к объектам памяти:
|
|
4
|
+
* type=face, status=active, owner_skill === agentId (legacy-префикс `skill:` —
|
|
5
|
+
* тот же гвард, что в wolf-router). Ровно одно активное лицо → тело, версия,
|
|
6
|
+
* hash содержимого. Ноль или больше одного — детерминированный отказ (не выбор
|
|
7
|
+
* «первого попавшегося»): конфликт диагностируется отсортированным списком
|
|
8
|
+
* кандидатов (updated_at, затем версия — стабильный порядок для вывода и тестов).
|
|
9
|
+
*/
|
|
10
|
+
export interface ResolvedFace {
|
|
11
|
+
id: string;
|
|
12
|
+
body: string;
|
|
13
|
+
version: string;
|
|
14
|
+
/** checksumBlock(body) — контроль целостности доставленного канона. */
|
|
15
|
+
hash: string;
|
|
16
|
+
}
|
|
17
|
+
export type ResolveFaceError = {
|
|
18
|
+
kind: 'none';
|
|
19
|
+
owner: string;
|
|
20
|
+
} | {
|
|
21
|
+
kind: 'multiple';
|
|
22
|
+
owner: string;
|
|
23
|
+
candidates: {
|
|
24
|
+
id: string;
|
|
25
|
+
version: string;
|
|
26
|
+
updated_at: string;
|
|
27
|
+
}[];
|
|
28
|
+
};
|
|
29
|
+
export type ResolveFaceResult = {
|
|
30
|
+
ok: true;
|
|
31
|
+
face: ResolvedFace;
|
|
32
|
+
} | {
|
|
33
|
+
ok: false;
|
|
34
|
+
error: ResolveFaceError;
|
|
35
|
+
};
|
|
36
|
+
export declare function resolveFace(store: MemoryStore, agentId: string): Promise<ResolveFaceResult>;
|
|
37
|
+
//# sourceMappingURL=resolve-face.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-face.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/resolve-face.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAI/D;;;;;;;GAOG;AAEH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/B;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACnE,CAAC;AAEN,MAAM,MAAM,iBAAiB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,YAAY,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAM1G,wBAAsB,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAsBjG"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { checksumBlock } from '../../adapters/fs/session-delivery-registry.js';
|
|
2
|
+
function ownerMatches(face, agentId) {
|
|
3
|
+
return face.owner_skill === agentId || face.owner_skill === `skill:${agentId}`;
|
|
4
|
+
}
|
|
5
|
+
export async function resolveFace(store, agentId) {
|
|
6
|
+
const active = (await store.list({ type: 'face', status: 'active' })).filter((o) => ownerMatches(o, agentId));
|
|
7
|
+
const sorted = [...active].sort((a, b) => String(b.updated_at ?? '').localeCompare(String(a.updated_at ?? '')) || Number(b.version) - Number(a.version));
|
|
8
|
+
if (sorted.length === 0)
|
|
9
|
+
return { ok: false, error: { kind: 'none', owner: agentId } };
|
|
10
|
+
if (sorted.length > 1) {
|
|
11
|
+
return {
|
|
12
|
+
ok: false,
|
|
13
|
+
error: {
|
|
14
|
+
kind: 'multiple',
|
|
15
|
+
owner: agentId,
|
|
16
|
+
candidates: sorted.map((f) => ({ id: f.id, version: String(f.version), updated_at: f.updated_at })),
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
const f = sorted[0];
|
|
21
|
+
const body = typeof f.body === 'string' ? f.body : '';
|
|
22
|
+
return { ok: true, face: { id: f.id, body, version: String(f.version), hash: checksumBlock(body) } };
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=resolve-face.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-face.js","sourceRoot":"","sources":["../../../src/app/use-cases/resolve-face.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gDAAgD,CAAC;AA8B/E,SAAS,YAAY,CAAC,IAAgB,EAAE,OAAe;IACrD,OAAO,IAAI,CAAC,WAAW,KAAK,OAAO,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,OAAO,EAAE,CAAC;AACjF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAkB,EAAE,OAAe;IACnE,MAAM,MAAM,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACjF,YAAY,CAAC,CAAe,EAAE,OAAO,CAAC,CACvB,CAAC;IAClB,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAC7B,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,MAAM,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAChH,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;IACvF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE;gBACL,IAAI,EAAE,UAAU;gBAChB,KAAK,EAAE,OAAO;gBACd,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;aACpG;SACF,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;IACrB,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;AACvG,CAAC"}
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
2026-10-
|
|
1
|
+
2026-10-15T21:56:04.402Z agent-id=v2-router-probe-xyz playbook=hit name=fallback variant=fallback injected=yes ms=0 bytes=1274
|
|
@@ -4,7 +4,10 @@
|
|
|
4
4
|
* Слой доставки №1 playbook-контекста (канон §7.1): детерминированная
|
|
5
5
|
* доставка вместо вероятностного wolf search агентом. Маркер
|
|
6
6
|
* `agent-id: <id>` В ТЕЛЕ рамки агента (frontmatter в system-промпт не
|
|
7
|
-
* попадает — известная грабля) →
|
|
7
|
+
* попадает — известная грабля) → 2.18.4: канонический face-resolver
|
|
8
|
+
* (`wolf face resolve`: type=face, status=active, owner_skill === agentId;
|
|
9
|
+
* ровно одно активное лицо, иначе отказ) → при miss/conflict legacy-путь:
|
|
10
|
+
* wolf search `<agentId> playbook` (после
|
|
8
11
|
* таксономии 2.13 канон — note+facet howto, type-фильтр не применим) → get +
|
|
9
12
|
* гвард owner_skill === agentId | `skill:${agentId}` (legacy) → первый
|
|
10
13
|
* прошедший гвард кандидат (ранний стоп, A2-б) → инжект в system-промпт.
|
|
@@ -103,7 +106,29 @@ const cache = new Map<string, { value: { id: string; body: string } | null; at:
|
|
|
103
106
|
// ре-резолв — переключение версии посередине задания исключено (REQ-05).
|
|
104
107
|
const sessionInject = new Map<string, { text: string; name: string; variant: string; bytes: number }>();
|
|
105
108
|
|
|
109
|
+
// 2.18.4: канонический резолвер лица — строгий запрос type=face/status=active/
|
|
110
|
+
// owner_skill (`wolf face resolve`) вместо вероятностного текстового поиска.
|
|
111
|
+
// miss/conflict/сбой CLI → null → legacy-путь (note+howto + гвард) ниже:
|
|
112
|
+
// поведение 2.13 для howto-плейбуков сохранено, конфликт лиц ловит doctor.
|
|
113
|
+
async function resolveFaceCanonical(agentId: string): Promise<{ id: string; body: string } | null> {
|
|
114
|
+
try {
|
|
115
|
+
const { stdout } = await runWolf(['face', 'resolve', agentId]);
|
|
116
|
+
const parsed = JSON.parse(stdout) as { ok?: boolean; face?: { id?: unknown; body?: unknown } };
|
|
117
|
+
if (parsed?.ok && typeof parsed.face?.body === 'string' && parsed.face.body.length > 0) {
|
|
118
|
+
return { id: String(parsed.face.id ?? ''), body: parsed.face.body };
|
|
119
|
+
}
|
|
120
|
+
} catch {
|
|
121
|
+
/* fail-safe: miss/conflict — legacy-путь */
|
|
122
|
+
}
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
|
|
106
126
|
async function resolvePlaybook(agentId: string): Promise<{ id: string; body: string } | null> {
|
|
127
|
+
const face = await resolveFaceCanonical(agentId);
|
|
128
|
+
if (face) {
|
|
129
|
+
cache.set(agentId, { value: face, at: Date.now() });
|
|
130
|
+
return face;
|
|
131
|
+
}
|
|
107
132
|
let found: { id: string; body: string } | null = null;
|
|
108
133
|
try {
|
|
109
134
|
// 2.13: плейбуки живут как note+facet howto (type 'playbook' — legacy),
|
|
@@ -149,8 +174,7 @@ function recordSkillMetric(tool: unknown, args: unknown): void {
|
|
|
149
174
|
const a = (args ?? {}) as { name?: string; skill?: string } | null;
|
|
150
175
|
const skill = a?.name ?? a?.skill;
|
|
151
176
|
if (!skill) return;
|
|
152
|
-
const file =
|
|
153
|
-
process.env.WOLF_SKILL_LOG ?? path.join(PROJECT_ROOT, '.wolf', 'metrics', 'skill-invocations.jsonl');
|
|
177
|
+
const file = process.env.WOLF_SKILL_LOG ?? path.join(PROJECT_ROOT, '.wolf', 'metrics', 'skill-invocations.jsonl');
|
|
154
178
|
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
155
179
|
const entry: { ts: string; skill: string; agent?: string } = { ts: new Date().toISOString(), skill };
|
|
156
180
|
if (lastAgentId) entry.agent = lastAgentId;
|
|
@@ -260,19 +284,15 @@ interface V2Ctx {
|
|
|
260
284
|
hook(name: 'context', fn: (event: V2ContextEvent) => Promise<void>): Promise<{ dispose: () => Promise<void> }>;
|
|
261
285
|
};
|
|
262
286
|
tool: {
|
|
263
|
-
hook(
|
|
264
|
-
name: 'execute.before',
|
|
265
|
-
fn: (event: V2ToolEvent) => Promise<void>
|
|
266
|
-
): Promise<{ dispose: () => Promise<void> }>;
|
|
287
|
+
hook(name: 'execute.before', fn: (event: V2ToolEvent) => Promise<void>): Promise<{ dispose: () => Promise<void> }>;
|
|
267
288
|
};
|
|
268
289
|
}
|
|
269
290
|
|
|
270
291
|
async function setup(ctx: V2Ctx) {
|
|
271
292
|
ensureSession();
|
|
272
293
|
await ctx.session.hook('context', async (event) => {
|
|
273
|
-
await deliverPlaybook(
|
|
274
|
-
|
|
275
|
-
(text) => event.system.push({ type: 'text', text })
|
|
294
|
+
await deliverPlaybook((event?.system ?? []).map((s) => s.text).join('\n'), (text) =>
|
|
295
|
+
event.system.push({ type: 'text', text })
|
|
276
296
|
);
|
|
277
297
|
});
|
|
278
298
|
await ctx.tool.hook('execute.before', async (event) => {
|