mister-wolf 2.17.0 → 2.17.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/README.md +20 -7
- package/README.ru.md +21 -10
- package/dist/adapters/cli/cli-entry.d.ts.map +1 -1
- package/dist/adapters/cli/cli-entry.js +8 -0
- package/dist/adapters/cli/cli-entry.js.map +1 -1
- package/dist/adapters/cli/commands/claim.d.ts +6 -0
- package/dist/adapters/cli/commands/claim.d.ts.map +1 -0
- package/dist/adapters/cli/commands/claim.js +65 -0
- package/dist/adapters/cli/commands/claim.js.map +1 -0
- package/dist/adapters/cli/commands/face.d.ts.map +1 -1
- package/dist/adapters/cli/commands/face.js +36 -3
- package/dist/adapters/cli/commands/face.js.map +1 -1
- package/dist/adapters/cli/commands/memory-doctor.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-doctor.js +37 -5
- package/dist/adapters/cli/commands/memory-doctor.js.map +1 -1
- package/dist/adapters/cli/commands/memory-edit.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-edit.js +6 -52
- package/dist/adapters/cli/commands/memory-edit.js.map +1 -1
- package/dist/adapters/cli/commands/memory-init.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-init.js +26 -1
- package/dist/adapters/cli/commands/memory-init.js.map +1 -1
- package/dist/adapters/cli/commands/memory-scaffold.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-scaffold.js +2 -1
- package/dist/adapters/cli/commands/memory-scaffold.js.map +1 -1
- package/dist/adapters/fs/claim-registry.d.ts +85 -0
- package/dist/adapters/fs/claim-registry.d.ts.map +1 -0
- package/dist/adapters/fs/claim-registry.js +276 -0
- package/dist/adapters/fs/claim-registry.js.map +1 -0
- package/dist/adapters/fs/memory-root.d.ts +26 -1
- package/dist/adapters/fs/memory-root.d.ts.map +1 -1
- package/dist/adapters/fs/memory-root.js +88 -2
- package/dist/adapters/fs/memory-root.js.map +1 -1
- package/dist/app/use-cases/claim-artifact.d.ts +31 -0
- package/dist/app/use-cases/claim-artifact.d.ts.map +1 -0
- package/dist/app/use-cases/claim-artifact.js +38 -0
- package/dist/app/use-cases/claim-artifact.js.map +1 -0
- package/dist/app/use-cases/create-face-version.d.ts +26 -4
- package/dist/app/use-cases/create-face-version.d.ts.map +1 -1
- package/dist/app/use-cases/create-face-version.js +9 -133
- package/dist/app/use-cases/create-face-version.js.map +1 -1
- package/dist/app/use-cases/edit-memory-object.d.ts +26 -0
- package/dist/app/use-cases/edit-memory-object.d.ts.map +1 -0
- package/dist/app/use-cases/edit-memory-object.js +57 -0
- package/dist/app/use-cases/edit-memory-object.js.map +1 -0
- package/dist/app/use-cases/face-operation.d.ts +81 -0
- package/dist/app/use-cases/face-operation.d.ts.map +1 -0
- package/dist/app/use-cases/face-operation.js +503 -0
- package/dist/app/use-cases/face-operation.js.map +1 -0
- package/dist/app/use-cases/get-call-injections.d.ts +12 -1
- package/dist/app/use-cases/get-call-injections.d.ts.map +1 -1
- package/dist/app/use-cases/get-call-injections.js +73 -12
- package/dist/app/use-cases/get-call-injections.js.map +1 -1
- package/dist/app/use-cases/migrate-faces.d.ts +45 -11
- package/dist/app/use-cases/migrate-faces.d.ts.map +1 -1
- package/dist/app/use-cases/migrate-faces.js +234 -32
- package/dist/app/use-cases/migrate-faces.js.map +1 -1
- package/dist/app/use-cases/promote-memory.d.ts +14 -1
- package/dist/app/use-cases/promote-memory.d.ts.map +1 -1
- package/dist/app/use-cases/promote-memory.js +36 -5
- package/dist/app/use-cases/promote-memory.js.map +1 -1
- package/dist/app/use-cases/scaffold-artifact.d.ts +5 -0
- package/dist/app/use-cases/scaffold-artifact.d.ts.map +1 -1
- package/dist/app/use-cases/scaffold-artifact.js +2 -0
- package/dist/app/use-cases/scaffold-artifact.js.map +1 -1
- package/dist/app/use-cases/seed-base-playbooks.d.ts +3 -3
- package/dist/app/use-cases/seed-base-playbooks.d.ts.map +1 -1
- package/dist/app/use-cases/seed-base-playbooks.js +75 -29
- package/dist/app/use-cases/seed-base-playbooks.js.map +1 -1
- package/dist/app/use-cases/supersede-memory-object.d.ts +3 -1
- package/dist/app/use-cases/supersede-memory-object.d.ts.map +1 -1
- package/dist/app/use-cases/supersede-memory-object.js +8 -1
- package/dist/app/use-cases/supersede-memory-object.js.map +1 -1
- package/dist/app/use-cases/transition-memory-object.d.ts.map +1 -1
- package/dist/app/use-cases/transition-memory-object.js +6 -0
- package/dist/app/use-cases/transition-memory-object.js.map +1 -1
- package/dist/domain/memory-types.d.ts +5 -1
- package/dist/domain/memory-types.d.ts.map +1 -1
- package/dist/domain/memory-types.js +6 -2
- package/dist/domain/memory-types.js.map +1 -1
- package/dist/domain/schemas/memory-event-schema.d.ts +4 -0
- package/dist/domain/schemas/memory-event-schema.d.ts.map +1 -1
- package/dist/domain/schemas/memory-event-schema.js +12 -0
- package/dist/domain/schemas/memory-event-schema.js.map +1 -1
- package/package.json +1 -1
- package/templates/.wolf/router.log +1 -1
- package/templates/base/agents/steward.md +9 -6
- package/templates/base/playbooks/complaint-protocol.md +1 -1
- package/templates/base/playbooks/steward-nastavnik.md +36 -17
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { MemoryStore } from '../../ports/memory-store.port.js';
|
|
2
|
+
import { EventLog } from '../../ports/event-log.port.js';
|
|
3
|
+
import { Clock } from '../../ports/clock.port.js';
|
|
4
|
+
import { IdGenerator } from '../../ports/id-generator.port.js';
|
|
5
|
+
import { SearchIndex } from '../../ports/search-index.port.js';
|
|
6
|
+
import { MemoryLock } from '../../ports/memory-lock.port.js';
|
|
7
|
+
import { RelationLog } from '../../ports/relation-log.port.js';
|
|
8
|
+
import { MemoryTypeDeclaration } from '../../domain/memory-types.js';
|
|
9
|
+
import { MemoryObject } from '../../domain/schemas/memory-object-schema.js';
|
|
10
|
+
import { MemoryEvent } from '../../domain/schemas/memory-event-schema.js';
|
|
11
|
+
import type { CreateFaceVersionInput, CreateFaceVersionResult, FaceCommand, FaceInitiator, FaceObject } from './create-face-version.js';
|
|
12
|
+
/** 2.17.1 REQ-03 (R04), design §3.3/ADR-3: операция лица — журналируемая
|
|
13
|
+
* цепочка шагов (staging `candidate` → activation как точка commit) в
|
|
14
|
+
* существующем append-only event log; resume/abort идемпотентны по opId,
|
|
15
|
+
* reconcile читает фактическое состояние store (журнал — намёк, store —
|
|
16
|
+
* истина). `supersede_legacy` — шаг операций 'migrate'/'seed' (design §3.4/F9
|
|
17
|
+
* + §3.6 — популяция 2.16.3 тем же input.legacyHeadId): добавляется планом
|
|
18
|
+
* только при legacyHeadId во input (между supersede_prev
|
|
19
|
+
* и announce); план 'new'/'restore'-подобных его не содержит. Всё исполняется под ВНЕШНИМ MemoryLock (прецедент
|
|
20
|
+
* create-face-version.ts): сам модуль lock не реентерабельно не берёт,
|
|
21
|
+
* кроме публичных точек recover (self-locking). */
|
|
22
|
+
export type FaceOperationStep = 'add_face' | 'g17_record' | 'proposal_relation' | 'activate' | 'supersede_prev' | 'supersede_legacy' | 'announce';
|
|
23
|
+
/** Точки тестового seam'а (test-plan REQ-03): fault(point) бросается ПОСЛЕ
|
|
24
|
+
* завершения указанного шага (данные на диске, следующий не начат);
|
|
25
|
+
* 'op_committed' — перед финальной записью (F7: событие отсутствует). */
|
|
26
|
+
export type FaceFaultPoint = 'op_started' | FaceOperationStep | 'op_committed';
|
|
27
|
+
export type FaceFaultInjector = (point: FaceFaultPoint) => void;
|
|
28
|
+
export interface FaceOperationDeps {
|
|
29
|
+
store: MemoryStore;
|
|
30
|
+
log: EventLog;
|
|
31
|
+
clock: Clock;
|
|
32
|
+
idGen: IdGenerator;
|
|
33
|
+
index?: SearchIndex;
|
|
34
|
+
/** Публичные точки (resume/abort) берут lock сами; runFaceMutation зовётся
|
|
35
|
+
* вызывающим уже под его lock (FsMemoryLock не реентерабелен). */
|
|
36
|
+
lock?: MemoryLock;
|
|
37
|
+
relations?: RelationLog;
|
|
38
|
+
declarations?: readonly MemoryTypeDeclaration[];
|
|
39
|
+
env?: NodeJS.ProcessEnv;
|
|
40
|
+
fault?: FaceFaultInjector;
|
|
41
|
+
}
|
|
42
|
+
export declare const INITIATOR_BY_COMMAND: Record<FaceCommand, FaceInitiator>;
|
|
43
|
+
export declare function asFace(obj: MemoryObject): FaceObject;
|
|
44
|
+
export declare function facesOfOwner(store: MemoryStore, ownerSkill: string): Promise<FaceObject[]>;
|
|
45
|
+
/** Активная (head) версия владельца; null — владельца ещё нет. Дубль активных
|
|
46
|
+
* ловит doctor; здесь детерминированно берётся старшая версия (§3.3 — окно
|
|
47
|
+
* «два активных» между activate и supersede закрывается этим детерминизмом). */
|
|
48
|
+
export declare function activeFace(store: MemoryStore, ownerSkill: string): Promise<FaceObject | null>;
|
|
49
|
+
/** Резолв ссылки на основу: mem_-id напрямую, иначе номер версии ('v2'/'2'). */
|
|
50
|
+
export declare function resolveBase(store: MemoryStore, ownerSkill: string, ref: string): Promise<FaceObject>;
|
|
51
|
+
/** opId по контракту §3.3: faceop-<ts>-<rand4>. */
|
|
52
|
+
export declare function generateOpId(clock: Clock): string;
|
|
53
|
+
export interface IncompleteFaceOperation {
|
|
54
|
+
opId: string;
|
|
55
|
+
command: string;
|
|
56
|
+
ownerSkill: string;
|
|
57
|
+
/** true — activation прошла (состояние «применено, требуется след»). */
|
|
58
|
+
activated: boolean;
|
|
59
|
+
}
|
|
60
|
+
/** Doctor (§3.3): op_started без op_committed/op_aborted — «неполный след
|
|
61
|
+
* мутации». Чистая функция над журналом; авто-healing doctor не делает. */
|
|
62
|
+
export declare function incompleteFaceOperations(events: readonly MemoryEvent[]): IncompleteFaceOperation[];
|
|
63
|
+
/** Мутация лица как операция (вызывается из createFaceVersion ПОД его lock):
|
|
64
|
+
* явный opId → resume/идемпотентный повтор; иначе авто-resume незавершённой
|
|
65
|
+
* операции того же owner_skill (§3.3) и старт новой. */
|
|
66
|
+
export declare function runFaceMutation(deps: FaceOperationDeps, opts: {
|
|
67
|
+
input: CreateFaceVersionInput;
|
|
68
|
+
actor: string;
|
|
69
|
+
}): Promise<CreateFaceVersionResult>;
|
|
70
|
+
/** `wolf face recover <opId>`: дозавершение незавершённой операции (без --abort).
|
|
71
|
+
* Идемпотентно: завершённая операция возвращает своё состояние без записей. */
|
|
72
|
+
export declare function resumeFaceOperation(deps: FaceOperationDeps, opId: string, actor?: string): Promise<CreateFaceVersionResult>;
|
|
73
|
+
export interface AbortFaceOperationResult {
|
|
74
|
+
opId: string;
|
|
75
|
+
archivedFaceId: string | null;
|
|
76
|
+
}
|
|
77
|
+
/** `wolf face recover <opId> --abort` (§3.3): только в состоянии «не применено»
|
|
78
|
+
* — candidate → archived (NFR-02: история не уничтожается) + op_aborted.
|
|
79
|
+
* После activation — только вперёд (restore штатным путём). Идемпотентен. */
|
|
80
|
+
export declare function abortFaceOperation(deps: FaceOperationDeps, opId: string, actor?: string, reason?: string): Promise<AbortFaceOperationResult>;
|
|
81
|
+
//# sourceMappingURL=face-operation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"face-operation.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/face-operation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE,OAAO,EAAE,YAAY,EAAE,MAAM,8CAA8C,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,6CAA6C,CAAC;AAO1E,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACvB,WAAW,EACX,aAAa,EACb,UAAU,EACX,MAAM,0BAA0B,CAAC;AAElC;;;;;;;;;mDASmD;AAEnD,MAAM,MAAM,iBAAiB,GACzB,UAAU,GACV,YAAY,GACZ,mBAAmB,GACnB,UAAU,GACV,gBAAgB,GAChB,kBAAkB,GAClB,UAAU,CAAC;AAEf;;yEAEyE;AACzE,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,iBAAiB,GAAG,cAAc,CAAC;AAC/E,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;AAEhE,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,WAAW,CAAC;IACnB,GAAG,EAAE,QAAQ,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB;sEACkE;IAClE,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,YAAY,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAChD,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,KAAK,CAAC,EAAE,iBAAiB,CAAC;CAC3B;AAED,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,WAAW,EAAE,aAAa,CAMnE,CAAC;AAEF,wBAAgB,MAAM,CAAC,GAAG,EAAE,YAAY,GAAG,UAAU,CAEpD;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAEhG;AAED;;gFAEgF;AAChF,wBAAsB,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAInG;AAED,gFAAgF;AAChF,wBAAsB,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAY1G;AAED,mDAAmD;AACnD,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAGjD;AAqDD,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;2EAC2E;AAC3E,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,uBAAuB,EAAE,CAiClG;AA6UD;;wDAEwD;AACxD,wBAAsB,eAAe,CACnC,IAAI,EAAE,iBAAiB,EACvB,IAAI,EAAE;IAAE,KAAK,EAAE,sBAAsB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACrD,OAAO,CAAC,uBAAuB,CAAC,CAwDlC;AAED;+EAC+E;AAC/E,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,iBAAiB,EACvB,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,uBAAuB,CAAC,CAYlC;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED;;6EAE6E;AAC7E,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,iBAAiB,EACvB,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,wBAAwB,CAAC,CAkCnC"}
|
|
@@ -0,0 +1,503 @@
|
|
|
1
|
+
import { canTransition } from '../../domain/governance.js';
|
|
2
|
+
import { resolveCreatedBy } from '../../domain/actor.js';
|
|
3
|
+
import { UserFacingError } from '../../domain/errors.js';
|
|
4
|
+
import { addMemoryObject } from './add-memory-object.js';
|
|
5
|
+
import { supersedeMemoryObject } from './supersede-memory-object.js';
|
|
6
|
+
import { createMutationRecord } from './create-mutation-record.js';
|
|
7
|
+
import { recordRelation } from './record-relation.js';
|
|
8
|
+
export const INITIATOR_BY_COMMAND = {
|
|
9
|
+
new: 'steward',
|
|
10
|
+
restore: 'owner',
|
|
11
|
+
breakglass: 'breakglass',
|
|
12
|
+
migrate: 'migration',
|
|
13
|
+
seed: 'seed',
|
|
14
|
+
};
|
|
15
|
+
export function asFace(obj) {
|
|
16
|
+
return obj;
|
|
17
|
+
}
|
|
18
|
+
export async function facesOfOwner(store, ownerSkill) {
|
|
19
|
+
return (await store.list({ type: 'face' })).filter((o) => asFace(o).owner_skill === ownerSkill).map(asFace);
|
|
20
|
+
}
|
|
21
|
+
/** Активная (head) версия владельца; null — владельца ещё нет. Дубль активных
|
|
22
|
+
* ловит doctor; здесь детерминированно берётся старшая версия (§3.3 — окно
|
|
23
|
+
* «два активных» между activate и supersede закрывается этим детерминизмом). */
|
|
24
|
+
export async function activeFace(store, ownerSkill) {
|
|
25
|
+
const active = (await facesOfOwner(store, ownerSkill)).filter((f) => f.status === 'active');
|
|
26
|
+
if (active.length === 0)
|
|
27
|
+
return null;
|
|
28
|
+
return active.sort((a, b) => Number(b.version) - Number(a.version))[0];
|
|
29
|
+
}
|
|
30
|
+
/** Резолв ссылки на основу: mem_-id напрямую, иначе номер версии ('v2'/'2'). */
|
|
31
|
+
export async function resolveBase(store, ownerSkill, ref) {
|
|
32
|
+
if (ref.startsWith('mem_')) {
|
|
33
|
+
const obj = await store.get(ref);
|
|
34
|
+
if (!obj || obj.type !== 'face' || asFace(obj).owner_skill !== ownerSkill) {
|
|
35
|
+
throw new UserFacingError(`Face version not found for ${ownerSkill}: ${ref}`);
|
|
36
|
+
}
|
|
37
|
+
return asFace(obj);
|
|
38
|
+
}
|
|
39
|
+
const n = ref.replace(/^v/, '');
|
|
40
|
+
const found = (await facesOfOwner(store, ownerSkill)).filter((f) => f.version === n);
|
|
41
|
+
if (found.length === 0)
|
|
42
|
+
throw new UserFacingError(`Face version not found for ${ownerSkill}: ${ref}`);
|
|
43
|
+
return found.sort((a, b) => Number(b.version) - Number(a.version))[0];
|
|
44
|
+
}
|
|
45
|
+
/** opId по контракту §3.3: faceop-<ts>-<rand4>. */
|
|
46
|
+
export function generateOpId(clock) {
|
|
47
|
+
const rand = Math.random().toString(16).slice(2, 6).padEnd(4, '0');
|
|
48
|
+
return `faceop-${clock.now().getTime()}-${rand}`;
|
|
49
|
+
}
|
|
50
|
+
/** Журнал операций из event log (последний op_started с данным opId выигрывает). */
|
|
51
|
+
async function readOperations(log) {
|
|
52
|
+
const ops = new Map();
|
|
53
|
+
for (const [seq, e] of (await log.readAll()).entries()) {
|
|
54
|
+
const opId = e.payload['opId'];
|
|
55
|
+
if (typeof opId !== 'string')
|
|
56
|
+
continue;
|
|
57
|
+
if (e.type === 'memory.face.op_started') {
|
|
58
|
+
ops.set(opId, {
|
|
59
|
+
opId,
|
|
60
|
+
command: String(e.payload['command'] ?? ''),
|
|
61
|
+
ownerSkill: String(e.payload['owner_skill'] ?? ''),
|
|
62
|
+
plan: Array.isArray(e.payload['plan']) ? e.payload['plan'] : [],
|
|
63
|
+
input: (e.payload['input'] ?? {}),
|
|
64
|
+
committed: false,
|
|
65
|
+
aborted: false,
|
|
66
|
+
activated: false,
|
|
67
|
+
steps: new Map(),
|
|
68
|
+
seq,
|
|
69
|
+
});
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
const op = ops.get(opId);
|
|
73
|
+
if (!op)
|
|
74
|
+
continue;
|
|
75
|
+
if (e.type === 'memory.face.op_step') {
|
|
76
|
+
const step = String(e.payload['step']);
|
|
77
|
+
op.steps.set(step, e.payload['detail'] ?? {});
|
|
78
|
+
if (step === 'activate')
|
|
79
|
+
op.activated = true;
|
|
80
|
+
}
|
|
81
|
+
else if (e.type === 'memory.face.op_committed') {
|
|
82
|
+
op.committed = true;
|
|
83
|
+
}
|
|
84
|
+
else if (e.type === 'memory.face.op_aborted') {
|
|
85
|
+
op.aborted = true;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return ops;
|
|
89
|
+
}
|
|
90
|
+
/** Doctor (§3.3): op_started без op_committed/op_aborted — «неполный след
|
|
91
|
+
* мутации». Чистая функция над журналом; авто-healing doctor не делает. */
|
|
92
|
+
export function incompleteFaceOperations(events) {
|
|
93
|
+
const byOp = new Map();
|
|
94
|
+
for (const e of events) {
|
|
95
|
+
const opId = e.payload['opId'];
|
|
96
|
+
if (typeof opId !== 'string')
|
|
97
|
+
continue;
|
|
98
|
+
const rec = byOp.get(opId);
|
|
99
|
+
if (e.type === 'memory.face.op_started') {
|
|
100
|
+
if (rec) {
|
|
101
|
+
rec.command = String(e.payload['command'] ?? rec.command);
|
|
102
|
+
rec.ownerSkill = String(e.payload['owner_skill'] ?? rec.ownerSkill);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
byOp.set(opId, {
|
|
106
|
+
opId,
|
|
107
|
+
command: String(e.payload['command'] ?? ''),
|
|
108
|
+
ownerSkill: String(e.payload['owner_skill'] ?? ''),
|
|
109
|
+
activated: false,
|
|
110
|
+
done: false,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else if (rec && e.type === 'memory.face.op_step' && e.payload['step'] === 'activate') {
|
|
115
|
+
rec.activated = true;
|
|
116
|
+
}
|
|
117
|
+
else if (rec && (e.type === 'memory.face.op_committed' || e.type === 'memory.face.op_aborted')) {
|
|
118
|
+
rec.done = true;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return [...byOp.values()]
|
|
122
|
+
.filter((r) => !r.done)
|
|
123
|
+
.map(({ opId, command, ownerSkill, activated }) => ({
|
|
124
|
+
opId,
|
|
125
|
+
command,
|
|
126
|
+
ownerSkill,
|
|
127
|
+
activated,
|
|
128
|
+
}));
|
|
129
|
+
}
|
|
130
|
+
async function appendEvent(deps, type, payload, actor) {
|
|
131
|
+
const now = deps.clock.now();
|
|
132
|
+
await deps.log.append({
|
|
133
|
+
id: deps.idGen.generateEventId(now),
|
|
134
|
+
type,
|
|
135
|
+
timestamp: now.toISOString(),
|
|
136
|
+
actor,
|
|
137
|
+
payload,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
/** Индекс FTS производный (§3.3): сбой его обновления не рушит операцию —
|
|
141
|
+
* предупреждение в stderr, лечение — wolf doctor --repair (rebuild). */
|
|
142
|
+
function safeIndex(deps, opId) {
|
|
143
|
+
const idx = deps.index;
|
|
144
|
+
if (!idx)
|
|
145
|
+
return undefined;
|
|
146
|
+
return {
|
|
147
|
+
rebuild: (objects) => idx.rebuild(objects),
|
|
148
|
+
indexObject: (o) => idx.indexObject(o).catch((err) => {
|
|
149
|
+
console.error(`face operation ${opId}: FTS index update failed (wolf doctor --repair rebuilds it): ${err instanceof Error ? err.message : String(err)}`);
|
|
150
|
+
}),
|
|
151
|
+
removeObject: (id) => idx.removeObject(id),
|
|
152
|
+
search: (q, o) => idx.search(q, o),
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/** Привязка объект↔операция (§3.3): face владельца с совпадающим op_id.
|
|
156
|
+
* Дубль с одним op_id — честная ошибка (вскрыть вручную). */
|
|
157
|
+
async function faceByOpId(store, ownerSkill, opId) {
|
|
158
|
+
const found = (await facesOfOwner(store, ownerSkill)).filter((f) => f.op_id === opId);
|
|
159
|
+
if (found.length > 1) {
|
|
160
|
+
throw new UserFacingError(`multiple faces of ${ownerSkill} carry op_id ${opId} (${found.map((f) => f.id).join(', ')}) — resolve manually`);
|
|
161
|
+
}
|
|
162
|
+
return found[0] ?? null;
|
|
163
|
+
}
|
|
164
|
+
/** G17-запись ищется по детерминированному title (create-mutation-record.ts). */
|
|
165
|
+
async function findMutationNote(store, ownerSkill, version) {
|
|
166
|
+
const title = `mutation: ${ownerSkill} v${version}`;
|
|
167
|
+
return ((await store.list({ type: 'note', facet: 'history' })).find((n) => n.title === title) ?? null);
|
|
168
|
+
}
|
|
169
|
+
function journalDetail(op, step, key) {
|
|
170
|
+
const v = op.steps.get(step)?.[key];
|
|
171
|
+
return typeof v === 'string' ? v : null;
|
|
172
|
+
}
|
|
173
|
+
/** План шагов операции по команде (§3.3): g17 — только initiator 'steward';
|
|
174
|
+
* proposal_relation — только при --from-proposal; supersede_legacy — только
|
|
175
|
+
* 'migrate'/'seed' с legacyHeadId (design §3.4/F9 + §3.6: между supersede_prev
|
|
176
|
+
* и announce). */
|
|
177
|
+
function planFor(input) {
|
|
178
|
+
const plan = ['add_face'];
|
|
179
|
+
if (INITIATOR_BY_COMMAND[input.command] === 'steward')
|
|
180
|
+
plan.push('g17_record');
|
|
181
|
+
if (input.fromProposal !== undefined)
|
|
182
|
+
plan.push('proposal_relation');
|
|
183
|
+
plan.push('activate', 'supersede_prev');
|
|
184
|
+
if ((input.command === 'migrate' || input.command === 'seed') && input.legacyHeadId !== undefined) {
|
|
185
|
+
plan.push('supersede_legacy');
|
|
186
|
+
}
|
|
187
|
+
plan.push('announce');
|
|
188
|
+
return plan;
|
|
189
|
+
}
|
|
190
|
+
/** input для op_started: JSON-чистый (undefined-ключи исчезают — payload JSONL). */
|
|
191
|
+
function serializeInput(input) {
|
|
192
|
+
return JSON.parse(JSON.stringify(input));
|
|
193
|
+
}
|
|
194
|
+
/** Каноничное сравнение input'ов (порядок ключей не важен, undefined = отсутствие):
|
|
195
|
+
* одинаковый input незавершённой операции — этот вызов и есть её повтор
|
|
196
|
+
* (одна логическая мутация = одна версия, REQ-03 AC-2); разный — новая мутация
|
|
197
|
+
* после дозавершения старой (§3.3 авто-resume). */
|
|
198
|
+
function sameInput(a, b) {
|
|
199
|
+
const ser = (v) => {
|
|
200
|
+
if (v === null || typeof v !== 'object')
|
|
201
|
+
return JSON.stringify(v) ?? 'null';
|
|
202
|
+
if (Array.isArray(v))
|
|
203
|
+
return `[${v.map(ser).join(',')}]`;
|
|
204
|
+
const o = v;
|
|
205
|
+
return `{${Object.keys(o)
|
|
206
|
+
.filter((k) => o[k] !== undefined)
|
|
207
|
+
.sort()
|
|
208
|
+
.map((k) => `${JSON.stringify(k)}:${ser(o[k])}`)
|
|
209
|
+
.join(',')}}`;
|
|
210
|
+
};
|
|
211
|
+
return ser(serializeInput(a)) === ser(serializeInput(b));
|
|
212
|
+
}
|
|
213
|
+
async function stepDone(deps, op, step, detail, actor) {
|
|
214
|
+
await appendEvent(deps, 'memory.face.op_step', { opId: op.opId, step, detail }, actor);
|
|
215
|
+
op.steps.set(step, detail);
|
|
216
|
+
if (step === 'activate')
|
|
217
|
+
op.activated = true;
|
|
218
|
+
deps.fault?.(step);
|
|
219
|
+
}
|
|
220
|
+
/** Результат из фактического состояния (идемпотентный повтор завершённой
|
|
221
|
+
* операции): supersede-цель — единственная face с superseded_by на новую. */
|
|
222
|
+
async function resultFromRecord(deps, op) {
|
|
223
|
+
const face = await faceByOpId(deps.store, op.ownerSkill, op.opId);
|
|
224
|
+
if (!face) {
|
|
225
|
+
throw new UserFacingError(`face operation ${op.opId} has no face object — inspect the store manually`);
|
|
226
|
+
}
|
|
227
|
+
const supersededId = (await facesOfOwner(deps.store, op.ownerSkill)).find((f) => f.superseded_by === face.id)?.id ?? null;
|
|
228
|
+
const mutationRecordId = journalDetail(op, 'g17_record', 'note_id') ??
|
|
229
|
+
(await findMutationNote(deps.store, op.ownerSkill, face.version))?.id ??
|
|
230
|
+
null;
|
|
231
|
+
return { face, supersededId, mutationRecordId, opId: op.opId };
|
|
232
|
+
}
|
|
233
|
+
/** F-01 (фикс-раунд 1 ревью фазы 4): healing-операция миграции — план не
|
|
234
|
+
* начинается с add_face (тот же признак, что parseMigrateOps в
|
|
235
|
+
* migrate-faces.ts). Её вход не содержит body, а add_face не входит в план:
|
|
236
|
+
* recovery-пути (wolf face recover, авто-resume, явный --op-id) её НЕ
|
|
237
|
+
* исполняют — иначе executeChain создал бы версию с пустым body и погасил
|
|
238
|
+
* живой канон. Дозавершение — только повторный `wolf face migrate`
|
|
239
|
+
* (migrateOwner → healLegacyTransition). */
|
|
240
|
+
function healingRefusal(op) {
|
|
241
|
+
return new UserFacingError(`face operation ${op.opId} is a healing migration (plan: ${op.plan.join(', ')}) — recovery cannot resume it; re-run wolf face migrate to complete it (or wolf face recover ${op.opId} --abort to cancel)`);
|
|
242
|
+
}
|
|
243
|
+
/** Цепочка шагов с reconcile (§3.3): каждый шаг перед записью проверяет
|
|
244
|
+
* фактическое состояние — уже-выполненное пропускается молча (без второго
|
|
245
|
+
* op_step). Вызывается под внешним lock. */
|
|
246
|
+
async function executeChain(deps, op, actor) {
|
|
247
|
+
// F-01 defense-in-depth: шаг add_face гейтен планом — версия с пустым body
|
|
248
|
+
// (вход healing-операции body не содержит) из recovery-пути невозможна в принципе.
|
|
249
|
+
if (op.plan[0] !== 'add_face')
|
|
250
|
+
throw healingRefusal(op);
|
|
251
|
+
const index = safeIndex(deps, op.opId);
|
|
252
|
+
const { store } = deps;
|
|
253
|
+
const input = op.input;
|
|
254
|
+
// 1 add_face — версия лица, status 'candidate'; номер версии назначается здесь.
|
|
255
|
+
// Правило усыновления: candidate с совпадающим op_id принадлежит операции
|
|
256
|
+
// (окно «объект сохранён, op_step не дописан»); чужой/пустой op_id — конфликт.
|
|
257
|
+
let face = await faceByOpId(store, op.ownerSkill, op.opId);
|
|
258
|
+
if (!face) {
|
|
259
|
+
const candidates = (await facesOfOwner(store, op.ownerSkill)).filter((f) => f.status === 'candidate');
|
|
260
|
+
if (candidates.length > 0) {
|
|
261
|
+
throw new UserFacingError(`unfinished face operation ${op.opId} for ${op.ownerSkill} conflicts with candidate(s) ${candidates
|
|
262
|
+
.map((c) => `${c.id} (op_id: ${c.op_id ?? 'empty'})`)
|
|
263
|
+
.join(', ')} — not adopted blindly; resolve: wolf face recover ${op.opId} --abort, or archive the foreign candidate`);
|
|
264
|
+
}
|
|
265
|
+
const base = input.from
|
|
266
|
+
? await resolveBase(store, op.ownerSkill, input.from)
|
|
267
|
+
: await activeFace(store, op.ownerSkill);
|
|
268
|
+
const nextVersion = (await facesOfOwner(store, op.ownerSkill)).reduce((m, f) => Math.max(m, Number(f.version) || 0), 0) + 1;
|
|
269
|
+
const restoreLike = input.command === 'restore' || input.command === 'breakglass';
|
|
270
|
+
const title = restoreLike ? base.title : (input.title ?? `Face: ${op.ownerSkill}`);
|
|
271
|
+
const body = restoreLike ? base.body : input.body;
|
|
272
|
+
const tags = restoreLike ? base.tags : (input.tags ?? []);
|
|
273
|
+
const extra = {
|
|
274
|
+
owner_skill: op.ownerSkill,
|
|
275
|
+
version: String(nextVersion),
|
|
276
|
+
reason: input.reason,
|
|
277
|
+
initiator: INITIATOR_BY_COMMAND[input.command],
|
|
278
|
+
op_id: op.opId,
|
|
279
|
+
};
|
|
280
|
+
if (base)
|
|
281
|
+
extra.based_on = base.id;
|
|
282
|
+
const { object } = await addMemoryObject({ store, log: deps.log, clock: deps.clock, idGen: deps.idGen, index, declarations: deps.declarations }, { type: 'face', title, body, tags, createdBy: actor, status: 'candidate', extra, internalFacePath: true });
|
|
283
|
+
face = asFace(object);
|
|
284
|
+
await stepDone(deps, op, 'add_face', { face_id: face.id, version: face.version }, actor);
|
|
285
|
+
}
|
|
286
|
+
// 2 g17_record — G17-запись + relation 'mutates' (только initiator steward).
|
|
287
|
+
let mutationRecordId = journalDetail(op, 'g17_record', 'note_id');
|
|
288
|
+
if (op.plan.includes('g17_record') && mutationRecordId === null) {
|
|
289
|
+
const existing = await findMutationNote(store, op.ownerSkill, face.version);
|
|
290
|
+
if (existing === null) {
|
|
291
|
+
const note = await createMutationRecord({ store, log: deps.log, clock: deps.clock, idGen: deps.idGen, index, relations: deps.relations }, {
|
|
292
|
+
ownerSkill: op.ownerSkill,
|
|
293
|
+
version: face.version,
|
|
294
|
+
faceId: face.id,
|
|
295
|
+
createdBy: actor,
|
|
296
|
+
reason: input.reason,
|
|
297
|
+
minimalChange: input.minimalChange ?? '',
|
|
298
|
+
boundaries: input.boundaries ?? '',
|
|
299
|
+
exampleHelps: input.exampleHelps ?? '',
|
|
300
|
+
exampleKeep: input.exampleKeep ?? '',
|
|
301
|
+
verification: input.verification ?? '',
|
|
302
|
+
rollback: input.rollback ?? '',
|
|
303
|
+
});
|
|
304
|
+
mutationRecordId = note.id;
|
|
305
|
+
await stepDone(deps, op, 'g17_record', { note_id: note.id }, actor);
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
mutationRecordId = existing.id;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
// 3 proposal_relation — relation 'proposes' (если --from-proposal).
|
|
312
|
+
if (op.plan.includes('proposal_relation') && input.fromProposal !== undefined) {
|
|
313
|
+
const recorded = deps.relations &&
|
|
314
|
+
(await deps.relations.list({ subject: input.fromProposal, predicate: 'proposes', object: face.id })).length > 0;
|
|
315
|
+
if (!recorded) {
|
|
316
|
+
await recordRelation({ relations: deps.relations, idGen: deps.idGen }, deps.clock.now(), input.fromProposal, 'proposes', face.id, 'system');
|
|
317
|
+
await stepDone(deps, op, 'proposal_relation', { proposal_id: input.fromProposal }, actor);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
// 4 activate — ТОЧКА COMMIT: candidate → active; всё содержимое написано выше.
|
|
321
|
+
if (face.status === 'candidate') {
|
|
322
|
+
if (!canTransition('candidate', 'active')) {
|
|
323
|
+
throw new UserFacingError(`transition candidate → active is not allowed (face ${face.id})`);
|
|
324
|
+
}
|
|
325
|
+
const updated = await store.update(face.id, { status: 'active' });
|
|
326
|
+
await appendEvent(deps, 'memory.transitioned', { memory_id: face.id, from: 'candidate', to: 'active' }, actor);
|
|
327
|
+
await index?.indexObject(updated);
|
|
328
|
+
face = asFace(updated);
|
|
329
|
+
await stepDone(deps, op, 'activate', { face_id: face.id }, actor);
|
|
330
|
+
}
|
|
331
|
+
else if (face.status === 'active') {
|
|
332
|
+
op.activated = true; // окно «activation записана, op_step не дописан»
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
throw new UserFacingError(`face ${face.id} is "${face.status}" — operation ${op.opId} cannot proceed; resolve manually (wolf face recover ${op.opId} --abort or restore)`);
|
|
336
|
+
}
|
|
337
|
+
// 5 supersede_prev — погасить прежнюю активную (если была); идемпотентно.
|
|
338
|
+
let supersededId = journalDetail(op, 'supersede_prev', 'prev_id');
|
|
339
|
+
const others = (await facesOfOwner(store, op.ownerSkill))
|
|
340
|
+
.filter((f) => f.id !== face.id && f.status === 'active')
|
|
341
|
+
.sort((a, b) => Number(b.version) - Number(a.version));
|
|
342
|
+
if (others.length > 0) {
|
|
343
|
+
const prev = others[0];
|
|
344
|
+
await supersedeMemoryObject({ store, log: deps.log, clock: deps.clock, idGen: deps.idGen, index }, prev.id, face.id, { internalFacePath: true });
|
|
345
|
+
supersededId = prev.id;
|
|
346
|
+
await stepDone(deps, op, 'supersede_prev', { prev_id: prev.id }, actor);
|
|
347
|
+
}
|
|
348
|
+
// 5b supersede_legacy — погасить legacy-head волны 2.17 (design §3.4/F9 +
|
|
349
|
+
// §3.6; только migrate/seed с legacyHeadId). Идемпотентность §3.3: op_step уже в
|
|
350
|
+
// журнале → skip; head уже погашен (окно «supersede записан, op_step не
|
|
351
|
+
// дописан») → погашение не повторяется, op_step дописывается.
|
|
352
|
+
if (op.plan.includes('supersede_legacy') && input.legacyHeadId !== undefined) {
|
|
353
|
+
const legacyHeadId = input.legacyHeadId;
|
|
354
|
+
if (journalDetail(op, 'supersede_legacy', 'head_id') === null) {
|
|
355
|
+
const head = await store.get(legacyHeadId);
|
|
356
|
+
if (!head) {
|
|
357
|
+
throw new UserFacingError(`legacy head not found: ${legacyHeadId} (operation ${op.opId}) — resolve manually`);
|
|
358
|
+
}
|
|
359
|
+
if (head.status !== 'superseded') {
|
|
360
|
+
await supersedeMemoryObject({ store, log: deps.log, clock: deps.clock, idGen: deps.idGen, index }, legacyHeadId, face.id);
|
|
361
|
+
}
|
|
362
|
+
await stepDone(deps, op, 'supersede_legacy', { head_id: legacyHeadId, face_id: face.id }, actor);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
// 6 announce — публичное событие memory.face.versioned (+ breakglass).
|
|
366
|
+
const announced = (await deps.log.readAll()).some((e) => e.type === 'memory.face.versioned' && e.payload['new'] === face.id);
|
|
367
|
+
if (!announced) {
|
|
368
|
+
const versionPayload = {
|
|
369
|
+
owner_skill: op.ownerSkill,
|
|
370
|
+
from: supersededId,
|
|
371
|
+
new: face.id,
|
|
372
|
+
initiator: INITIATOR_BY_COMMAND[input.command],
|
|
373
|
+
reason: input.reason,
|
|
374
|
+
};
|
|
375
|
+
await appendEvent(deps, 'memory.face.versioned', versionPayload, actor);
|
|
376
|
+
if (input.command === 'breakglass') {
|
|
377
|
+
await appendEvent(deps, 'memory.face.breakglass', versionPayload, actor);
|
|
378
|
+
}
|
|
379
|
+
await stepDone(deps, op, 'announce', {}, actor);
|
|
380
|
+
}
|
|
381
|
+
// 7 op_committed — финал журнала операции (F7: может отсутствовать — данные целы).
|
|
382
|
+
if (!op.committed) {
|
|
383
|
+
deps.fault?.('op_committed');
|
|
384
|
+
await appendEvent(deps, 'memory.face.op_committed', { opId: op.opId }, actor);
|
|
385
|
+
op.committed = true;
|
|
386
|
+
}
|
|
387
|
+
return { face, supersededId, mutationRecordId, opId: op.opId };
|
|
388
|
+
}
|
|
389
|
+
/** Мутация лица как операция (вызывается из createFaceVersion ПОД его lock):
|
|
390
|
+
* явный opId → resume/идемпотентный повтор; иначе авто-resume незавершённой
|
|
391
|
+
* операции того же owner_skill (§3.3) и старт новой. */
|
|
392
|
+
export async function runFaceMutation(deps, opts) {
|
|
393
|
+
const owner = opts.input.ownerSkill;
|
|
394
|
+
const ops = await readOperations(deps.log);
|
|
395
|
+
const given = opts.input.opId !== undefined ? ops.get(opts.input.opId) : undefined;
|
|
396
|
+
if (opts.input.opId !== undefined && given) {
|
|
397
|
+
if (given.ownerSkill !== owner) {
|
|
398
|
+
throw new UserFacingError(`face operation ${opts.input.opId} belongs to ${given.ownerSkill}, not ${owner}`);
|
|
399
|
+
}
|
|
400
|
+
if (given.aborted) {
|
|
401
|
+
throw new UserFacingError(`face operation ${opts.input.opId} was aborted — start a new mutation without --op-id`);
|
|
402
|
+
}
|
|
403
|
+
if (given.committed)
|
|
404
|
+
return resultFromRecord(deps, given); // повтор без второй версии
|
|
405
|
+
return executeChain(deps, given, opts.actor); // resume: args из op_started
|
|
406
|
+
}
|
|
407
|
+
// Авто-resume: первая же мутация владельца дозавершает незавершённую
|
|
408
|
+
// операцию под тем же lock до старта новой (детерминированно из op_started).
|
|
409
|
+
// Тот же input — вызов является повтором той же операции (без второй версии).
|
|
410
|
+
// F-01: healing-операции пропускуются — их дозавершает только wolf face migrate.
|
|
411
|
+
let unfinished = null;
|
|
412
|
+
for (const op of ops.values()) {
|
|
413
|
+
if (op.ownerSkill !== owner || op.committed || op.aborted)
|
|
414
|
+
continue;
|
|
415
|
+
if (op.plan[0] !== 'add_face')
|
|
416
|
+
continue;
|
|
417
|
+
if (unfinished === null || op.seq > unfinished.seq)
|
|
418
|
+
unfinished = op;
|
|
419
|
+
}
|
|
420
|
+
if (unfinished) {
|
|
421
|
+
if (sameInput(unfinished.input, opts.input))
|
|
422
|
+
return executeChain(deps, unfinished, opts.actor);
|
|
423
|
+
await executeChain(deps, unfinished, opts.actor);
|
|
424
|
+
}
|
|
425
|
+
const opId = opts.input.opId ?? generateOpId(deps.clock);
|
|
426
|
+
await appendEvent(deps, 'memory.face.op_started', {
|
|
427
|
+
opId,
|
|
428
|
+
command: opts.input.command,
|
|
429
|
+
owner_skill: owner,
|
|
430
|
+
plan: planFor(opts.input),
|
|
431
|
+
input: serializeInput(opts.input),
|
|
432
|
+
}, opts.actor);
|
|
433
|
+
deps.fault?.('op_started');
|
|
434
|
+
const record = {
|
|
435
|
+
opId,
|
|
436
|
+
command: opts.input.command,
|
|
437
|
+
ownerSkill: owner,
|
|
438
|
+
plan: planFor(opts.input),
|
|
439
|
+
input: opts.input,
|
|
440
|
+
committed: false,
|
|
441
|
+
aborted: false,
|
|
442
|
+
activated: false,
|
|
443
|
+
steps: new Map(),
|
|
444
|
+
seq: Number.MAX_SAFE_INTEGER,
|
|
445
|
+
};
|
|
446
|
+
return executeChain(deps, record, opts.actor);
|
|
447
|
+
}
|
|
448
|
+
/** `wolf face recover <opId>`: дозавершение незавершённой операции (без --abort).
|
|
449
|
+
* Идемпотентно: завершённая операция возвращает своё состояние без записей. */
|
|
450
|
+
export async function resumeFaceOperation(deps, opId, actor) {
|
|
451
|
+
const who = actor ?? resolveCreatedBy(undefined, deps.env ?? process.env);
|
|
452
|
+
const run = async () => {
|
|
453
|
+
const ops = await readOperations(deps.log);
|
|
454
|
+
const op = ops.get(opId);
|
|
455
|
+
if (!op)
|
|
456
|
+
throw new UserFacingError(`face operation not found: ${opId}`);
|
|
457
|
+
if (op.plan[0] !== 'add_face')
|
|
458
|
+
throw healingRefusal(op); // F-01/MINOR-1: гейт выше committed — завершённой healing-операции честный отказ вместо «no face object»
|
|
459
|
+
if (op.committed)
|
|
460
|
+
return resultFromRecord(deps, op);
|
|
461
|
+
if (op.aborted)
|
|
462
|
+
throw new UserFacingError(`face operation ${opId} was aborted — nothing to resume`);
|
|
463
|
+
return executeChain(deps, op, who);
|
|
464
|
+
};
|
|
465
|
+
return deps.lock ? deps.lock.withLock(run) : run();
|
|
466
|
+
}
|
|
467
|
+
/** `wolf face recover <opId> --abort` (§3.3): только в состоянии «не применено»
|
|
468
|
+
* — candidate → archived (NFR-02: история не уничтожается) + op_aborted.
|
|
469
|
+
* После activation — только вперёд (restore штатным путём). Идемпотентен. */
|
|
470
|
+
export async function abortFaceOperation(deps, opId, actor, reason) {
|
|
471
|
+
const who = actor ?? resolveCreatedBy(undefined, deps.env ?? process.env);
|
|
472
|
+
const why = reason ?? 'aborted via wolf face recover --abort';
|
|
473
|
+
const run = async () => {
|
|
474
|
+
const ops = await readOperations(deps.log);
|
|
475
|
+
const op = ops.get(opId);
|
|
476
|
+
if (!op)
|
|
477
|
+
throw new UserFacingError(`face operation not found: ${opId}`);
|
|
478
|
+
if (op.committed) {
|
|
479
|
+
throw new UserFacingError(`face operation ${opId} is committed — abort is not possible; roll forward with wolf face restore`);
|
|
480
|
+
}
|
|
481
|
+
const face = await faceByOpId(deps.store, op.ownerSkill, opId);
|
|
482
|
+
if (op.aborted)
|
|
483
|
+
return { opId, archivedFaceId: face?.id ?? null };
|
|
484
|
+
if (face) {
|
|
485
|
+
if (face.status === 'active') {
|
|
486
|
+
throw new UserFacingError(`face operation ${opId} is already activated — abort is only possible before activation; roll forward with wolf face restore`);
|
|
487
|
+
}
|
|
488
|
+
if (face.status !== 'candidate') {
|
|
489
|
+
throw new UserFacingError(`face ${face.id} is "${face.status}" — cannot abort ${opId} safely`);
|
|
490
|
+
}
|
|
491
|
+
const index = safeIndex(deps, opId);
|
|
492
|
+
const updated = await deps.store.update(face.id, { status: 'archived' });
|
|
493
|
+
await appendEvent(deps, 'memory.transitioned', { memory_id: face.id, from: 'candidate', to: 'archived' }, who);
|
|
494
|
+
await index?.indexObject(updated);
|
|
495
|
+
await appendEvent(deps, 'memory.face.op_aborted', { opId, by: who, reason: why }, who);
|
|
496
|
+
return { opId, archivedFaceId: face.id };
|
|
497
|
+
}
|
|
498
|
+
await appendEvent(deps, 'memory.face.op_aborted', { opId, by: who, reason: why }, who);
|
|
499
|
+
return { opId, archivedFaceId: null };
|
|
500
|
+
};
|
|
501
|
+
return deps.lock ? deps.lock.withLock(run) : run();
|
|
502
|
+
}
|
|
503
|
+
//# sourceMappingURL=face-operation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"face-operation.js","sourceRoot":"","sources":["../../../src/app/use-cases/face-operation.ts"],"names":[],"mappings":"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"}
|