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.
@@ -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,GAKf,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;iFACiF;AACjF,MAAM,UAAU,sBAAsB,CAAC,IAAuB,EAAE,QAAgB;IAC9E,OAAO,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AAC1F,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"}
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,6 +1,6 @@
1
1
  {
2
2
  "name": "mister-wolf",
3
- "version": "2.18.2",
3
+ "version": "2.18.4",
4
4
  "description": "Local-first project memory for AI coding agents: decisions, lessons, tools and processes that outlive the session",
5
5
  "keywords": [
6
6
  "ai-agents",
@@ -1 +1 @@
1
- 2026-10-15T15:13:33.176Z agent-id=v2-router-probe-xyz playbook=hit name=fallback variant=fallback injected=yes ms=0 bytes=1274
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
- * попадает — известная грабля) → wolf search `<agentId> playbook` (после
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
- (event?.system ?? []).map((s) => s.text).join('\n'),
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) => {