mister-wolf 2.17.0 → 2.18.0

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.
Files changed (101) hide show
  1. package/README.md +31 -18
  2. package/README.ru.md +25 -14
  3. package/dist/adapters/cli/cli-entry.d.ts.map +1 -1
  4. package/dist/adapters/cli/cli-entry.js +8 -0
  5. package/dist/adapters/cli/cli-entry.js.map +1 -1
  6. package/dist/adapters/cli/commands/claim.d.ts +6 -0
  7. package/dist/adapters/cli/commands/claim.d.ts.map +1 -0
  8. package/dist/adapters/cli/commands/claim.js +74 -0
  9. package/dist/adapters/cli/commands/claim.js.map +1 -0
  10. package/dist/adapters/cli/commands/face.d.ts.map +1 -1
  11. package/dist/adapters/cli/commands/face.js +36 -3
  12. package/dist/adapters/cli/commands/face.js.map +1 -1
  13. package/dist/adapters/cli/commands/memory-doctor.d.ts.map +1 -1
  14. package/dist/adapters/cli/commands/memory-doctor.js +37 -5
  15. package/dist/adapters/cli/commands/memory-doctor.js.map +1 -1
  16. package/dist/adapters/cli/commands/memory-edit.d.ts.map +1 -1
  17. package/dist/adapters/cli/commands/memory-edit.js +6 -52
  18. package/dist/adapters/cli/commands/memory-edit.js.map +1 -1
  19. package/dist/adapters/cli/commands/memory-init.d.ts.map +1 -1
  20. package/dist/adapters/cli/commands/memory-init.js +26 -1
  21. package/dist/adapters/cli/commands/memory-init.js.map +1 -1
  22. package/dist/adapters/cli/commands/memory-scaffold.d.ts.map +1 -1
  23. package/dist/adapters/cli/commands/memory-scaffold.js +2 -1
  24. package/dist/adapters/cli/commands/memory-scaffold.js.map +1 -1
  25. package/dist/adapters/fs/claim-registry.d.ts +114 -0
  26. package/dist/adapters/fs/claim-registry.d.ts.map +1 -0
  27. package/dist/adapters/fs/claim-registry.js +343 -0
  28. package/dist/adapters/fs/claim-registry.js.map +1 -0
  29. package/dist/adapters/fs/memory-root.d.ts +26 -1
  30. package/dist/adapters/fs/memory-root.d.ts.map +1 -1
  31. package/dist/adapters/fs/memory-root.js +88 -2
  32. package/dist/adapters/fs/memory-root.js.map +1 -1
  33. package/dist/app/use-cases/build-analytics.d.ts +22 -0
  34. package/dist/app/use-cases/build-analytics.d.ts.map +1 -1
  35. package/dist/app/use-cases/build-analytics.js +34 -0
  36. package/dist/app/use-cases/build-analytics.js.map +1 -1
  37. package/dist/app/use-cases/claim-artifact.d.ts +34 -0
  38. package/dist/app/use-cases/claim-artifact.d.ts.map +1 -0
  39. package/dist/app/use-cases/claim-artifact.js +43 -0
  40. package/dist/app/use-cases/claim-artifact.js.map +1 -0
  41. package/dist/app/use-cases/create-face-version.d.ts +26 -4
  42. package/dist/app/use-cases/create-face-version.d.ts.map +1 -1
  43. package/dist/app/use-cases/create-face-version.js +9 -133
  44. package/dist/app/use-cases/create-face-version.js.map +1 -1
  45. package/dist/app/use-cases/edit-memory-object.d.ts +26 -0
  46. package/dist/app/use-cases/edit-memory-object.d.ts.map +1 -0
  47. package/dist/app/use-cases/edit-memory-object.js +57 -0
  48. package/dist/app/use-cases/edit-memory-object.js.map +1 -0
  49. package/dist/app/use-cases/face-operation.d.ts +81 -0
  50. package/dist/app/use-cases/face-operation.d.ts.map +1 -0
  51. package/dist/app/use-cases/face-operation.js +503 -0
  52. package/dist/app/use-cases/face-operation.js.map +1 -0
  53. package/dist/app/use-cases/get-call-injections.d.ts +12 -1
  54. package/dist/app/use-cases/get-call-injections.d.ts.map +1 -1
  55. package/dist/app/use-cases/get-call-injections.js +73 -12
  56. package/dist/app/use-cases/get-call-injections.js.map +1 -1
  57. package/dist/app/use-cases/init-project.d.ts +6 -0
  58. package/dist/app/use-cases/init-project.d.ts.map +1 -1
  59. package/dist/app/use-cases/init-project.js +34 -1
  60. package/dist/app/use-cases/init-project.js.map +1 -1
  61. package/dist/app/use-cases/migrate-faces.d.ts +45 -11
  62. package/dist/app/use-cases/migrate-faces.d.ts.map +1 -1
  63. package/dist/app/use-cases/migrate-faces.js +234 -32
  64. package/dist/app/use-cases/migrate-faces.js.map +1 -1
  65. package/dist/app/use-cases/promote-memory.d.ts +14 -1
  66. package/dist/app/use-cases/promote-memory.d.ts.map +1 -1
  67. package/dist/app/use-cases/promote-memory.js +36 -5
  68. package/dist/app/use-cases/promote-memory.js.map +1 -1
  69. package/dist/app/use-cases/scaffold-artifact.d.ts +5 -0
  70. package/dist/app/use-cases/scaffold-artifact.d.ts.map +1 -1
  71. package/dist/app/use-cases/scaffold-artifact.js +2 -0
  72. package/dist/app/use-cases/scaffold-artifact.js.map +1 -1
  73. package/dist/app/use-cases/seed-base-playbooks.d.ts +3 -3
  74. package/dist/app/use-cases/seed-base-playbooks.d.ts.map +1 -1
  75. package/dist/app/use-cases/seed-base-playbooks.js +75 -29
  76. package/dist/app/use-cases/seed-base-playbooks.js.map +1 -1
  77. package/dist/app/use-cases/supersede-memory-object.d.ts +3 -1
  78. package/dist/app/use-cases/supersede-memory-object.d.ts.map +1 -1
  79. package/dist/app/use-cases/supersede-memory-object.js +8 -1
  80. package/dist/app/use-cases/supersede-memory-object.js.map +1 -1
  81. package/dist/app/use-cases/transition-memory-object.d.ts.map +1 -1
  82. package/dist/app/use-cases/transition-memory-object.js +6 -0
  83. package/dist/app/use-cases/transition-memory-object.js.map +1 -1
  84. package/dist/domain/memory-types.d.ts +28 -2
  85. package/dist/domain/memory-types.d.ts.map +1 -1
  86. package/dist/domain/memory-types.js +50 -2
  87. package/dist/domain/memory-types.js.map +1 -1
  88. package/dist/domain/schemas/memory-event-schema.d.ts +4 -0
  89. package/dist/domain/schemas/memory-event-schema.d.ts.map +1 -1
  90. package/dist/domain/schemas/memory-event-schema.js +12 -0
  91. package/dist/domain/schemas/memory-event-schema.js.map +1 -1
  92. package/dist/domain/type-schema-builder.d.ts +1 -1
  93. package/dist/domain/type-schema-builder.d.ts.map +1 -1
  94. package/dist/domain/type-schema-builder.js +20 -0
  95. package/dist/domain/type-schema-builder.js.map +1 -1
  96. package/package.json +1 -1
  97. package/templates/.wolf/router.log +1 -1
  98. package/templates/base/agents/steward.md +9 -6
  99. package/templates/base/playbooks/complaint-protocol.md +1 -1
  100. package/templates/base/playbooks/steward-nastavnik.md +36 -17
  101. package/templates/base/skills/wolf-brainstorm/SKILL.md +25 -0
@@ -1,12 +1,13 @@
1
- import { MemoryStore } from '../../ports/memory-store.port.js';
2
- import { EventLog } from '../../ports/event-log.port.js';
3
1
  import { Clock } from '../../ports/clock.port.js';
4
2
  import { IdGenerator } from '../../ports/id-generator.port.js';
5
3
  import { SearchIndex } from '../../ports/search-index.port.js';
6
4
  import { MemoryLock } from '../../ports/memory-lock.port.js';
5
+ import { MemoryStore } from '../../ports/memory-store.port.js';
6
+ import { EventLog } from '../../ports/event-log.port.js';
7
7
  import { RelationLog } from '../../ports/relation-log.port.js';
8
8
  import { MemoryTypeDeclaration } from '../../domain/memory-types.js';
9
9
  import { MemoryObject } from '../../domain/schemas/memory-object-schema.js';
10
+ import { type FaceFaultInjector } from './face-operation.js';
10
11
  /** Волна 2.17 REQ-03/REQ-04 (design §«Механика версий», §Guard): единая
11
12
  * версионирующая механика лиц — guard, номер версии, supersede head, журнал;
12
13
  * всё под внешним MemoryLock (прецедент tool-librarian.ts:167: вложенные
@@ -15,18 +16,26 @@ import { MemoryObject } from '../../domain/schemas/memory-object-schema.js';
15
16
  * 'steward') атомарно создаёт G17-запись + relation 'mutates' → версия.
16
17
  * T-05: 'migrate'/'seed' — служебные пути (вход migrateFaces/посева base-set,
17
18
  * design §Guard «посев идёт внутренним путём с initiator: 'seed'»): guard
18
- * полномочий не применяется, содержание задаёт вызывающий. */
19
+ * полномочий не применяется, содержание задаёт вызывающий.
20
+ *
21
+ * 2.17.1 REQ-03 (R04, design §3.3/ADR-3): сама цепочка — журналируемая
22
+ * операция в face-operation.ts (add_face(candidate) → G17 → relations →
23
+ * activate(commit) → supersede_prev → announce → op_committed) с resume
24
+ * по opId, авто-resume и abort; этот файл — валидация входа и guard
25
+ * (guard — до op_started, под lock). */
19
26
  export type FaceCommand = 'new' | 'restore' | 'breakglass' | 'migrate' | 'seed';
20
27
  export type FaceInitiator = 'steward' | 'owner' | 'breakglass' | 'migration' | 'seed';
21
28
  /** Поля типа face поверх MemoryObject (декларация — memory-types.ts, T-01). */
22
29
  export interface FaceFields {
23
30
  owner_skill: string;
24
- /** '1','2',… — номер назначает эта команда под lock. */
31
+ /** '1','2',… — номер назначает операция add_face под lock. */
25
32
  version: string;
26
33
  /** id версии-основы; отсутствует у первой версии (optional, не null). */
27
34
  based_on?: string;
28
35
  reason: string;
29
36
  initiator: FaceInitiator;
37
+ /** 2.17.1 REQ-03 (§3.3): привязка к операции — правило усыновления candidate. */
38
+ op_id?: string;
30
39
  }
31
40
  export type FaceObject = MemoryObject & FaceFields;
32
41
  export interface CreateFaceVersionDeps {
@@ -42,6 +51,9 @@ export interface CreateFaceVersionDeps {
42
51
  * Параметра-актёра у API нет: подмена инициатора (--created-by-подобная)
43
52
  * исключена структурно (design §Guard, F-04). */
44
53
  env?: NodeJS.ProcessEnv;
54
+ /** Тестовый seam (test-plan REQ-03): fault(point) бросается после завершения
55
+ * шага операции; прод-код не задаёт. */
56
+ fault?: FaceFaultInjector;
45
57
  }
46
58
  export interface CreateFaceVersionInput {
47
59
  command: FaceCommand;
@@ -66,6 +78,14 @@ export interface CreateFaceVersionInput {
66
78
  * версию — записывает relation ('proposes', proposal, faceNew). Связь только
67
79
  * фиксируется: применение предложения остаётся решением Стюарда (REQ-09). */
68
80
  fromProposal?: string;
81
+ /** 2.17.1 REQ-03 (§3.3): идентификатор операции — resume/идемпотентный
82
+ * повтор; при отсутствии генерируется faceop-<ts>-<rand4> (в результате). */
83
+ opId?: string;
84
+ /** 2.17.1 REQ-04 (design §3.4, F9): id активного legacy-head волны 2.17 —
85
+ * добавляет шаг supersede_legacy операции (между supersede_prev и announce).
86
+ * Служебный вход migrateFaces и посева 2.16.3 (§3.6); resume берёт значение
87
+ * из op_started input. */
88
+ legacyHeadId?: string;
69
89
  }
70
90
  export interface CreateFaceVersionResult {
71
91
  face: FaceObject;
@@ -74,6 +94,8 @@ export interface CreateFaceVersionResult {
74
94
  /** G17-запись мутации (REQ-06): id note(history); null, если мутация не
75
95
  * Стюардом (restore/breakglass). */
76
96
  mutationRecordId: string | null;
97
+ /** 2.17.1 REQ-03: id журналируемой операции (печатают CLI/MCP для recover). */
98
+ opId: string;
77
99
  }
78
100
  export declare function createFaceVersion(deps: CreateFaceVersionDeps, input: CreateFaceVersionInput): Promise<CreateFaceVersionResult>;
79
101
  //# sourceMappingURL=create-face-version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-face-version.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/create-face-version.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;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,8CAA8C,CAAC;AAS5E;;;;;;;;8DAQ8D;AAC9D,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,SAAS,GAAG,YAAY,GAAG,SAAS,GAAG,MAAM,CAAC;AAChF,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,OAAO,GAAG,YAAY,GAAG,WAAW,GAAG,MAAM,CAAC;AAEtF,+EAA+E;AAC/E,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,aAAa,CAAC;CAC1B;AAED,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,UAAU,CAAC;AAEnD,MAAM,WAAW,qBAAqB;IACpC,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,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,YAAY,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAChD;;qDAEiD;IACjD,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,WAAW,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,wFAAwF;IACxF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;mFAC+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;iFAE6E;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,UAAU,CAAC;IACjB,gFAAgF;IAChF,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B;wCACoC;IACpC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAgFD,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,qBAAqB,EAC3B,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,uBAAuB,CAAC,CAmLlC"}
1
+ {"version":3,"file":"create-face-version.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/create-face-version.ts"],"names":[],"mappings":"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"}
@@ -1,45 +1,7 @@
1
1
  import { resolveCreatedBy, resolveSessionId } from '../../domain/actor.js';
2
2
  import { UserFacingError } from '../../domain/errors.js';
3
- import { addMemoryObject } from './add-memory-object.js';
4
- import { supersedeMemoryObject } from './supersede-memory-object.js';
5
- import { createMutationRecord, missingG17Field } from './create-mutation-record.js';
6
- import { recordRelation } from './record-relation.js';
7
- const INITIATOR_BY_COMMAND = {
8
- new: 'steward',
9
- restore: 'owner',
10
- breakglass: 'breakglass',
11
- migrate: 'migration',
12
- seed: 'seed',
13
- };
14
- function asFace(obj) {
15
- return obj;
16
- }
17
- async function facesOfOwner(store, ownerSkill) {
18
- return (await store.list({ type: 'face' })).filter((o) => asFace(o).owner_skill === ownerSkill).map(asFace);
19
- }
20
- /** Активная (head) версия владельца; null — владельца ещё нет. Дубликаты активных
21
- * ловит doctor (NFR-02); здесь детерминированно берётся старшая версия. */
22
- async function activeFace(store, ownerSkill) {
23
- const active = (await facesOfOwner(store, ownerSkill)).filter((f) => f.status === 'active');
24
- if (active.length === 0)
25
- return null;
26
- return active.sort((a, b) => Number(b.version) - Number(a.version))[0];
27
- }
28
- /** Резолв ссылки на основу: mem_-id напрямую, иначе номер версии ('v2'/'2'). */
29
- async function resolveBase(store, ownerSkill, ref) {
30
- if (ref.startsWith('mem_')) {
31
- const obj = await store.get(ref);
32
- if (!obj || obj.type !== 'face' || asFace(obj).owner_skill !== ownerSkill) {
33
- throw new UserFacingError(`Face version not found for ${ownerSkill}: ${ref}`);
34
- }
35
- return asFace(obj);
36
- }
37
- const n = ref.replace(/^v/, '');
38
- const found = (await facesOfOwner(store, ownerSkill)).filter((f) => f.version === n);
39
- if (found.length === 0)
40
- throw new UserFacingError(`Face version not found for ${ownerSkill}: ${ref}`);
41
- return found.sort((a, b) => Number(b.version) - Number(a.version))[0];
42
- }
3
+ import { missingG17Field } from './create-mutation-record.js';
4
+ import { resolveBase, runFaceMutation } from './face-operation.js';
43
5
  /** Guard (design §Guard): new — строго agent:steward; restore/breakglass — user:*;
44
6
  * breakglass дополнительно отказывает из агент-сессии (WOLF_SESSION=opc-*).
45
7
  * migrate/seed — служебные пути (T-05): без проверки полномочий — вход
@@ -124,100 +86,14 @@ export async function createFaceVersion(deps, input) {
124
86
  throw new UserFacingError(`Memory object ${input.fromProposal} is not a proposal (facet=proposal required)`);
125
87
  }
126
88
  }
127
- // Номер версии и head — строго под lock: параллельные вызовы сериализуются.
128
- const cur = await activeFace(deps.store, input.ownerSkill);
129
- const base = input.from ? await resolveBase(deps.store, input.ownerSkill, input.from) : cur;
130
- const nextVersion = (await facesOfOwner(deps.store, input.ownerSkill)).reduce((m, f) => Math.max(m, Number(f.version) || 0), 0) + 1;
131
- const restoreLike = input.command === 'restore' || input.command === 'breakglass';
132
- const source = restoreLike ? base : null;
133
- const title = restoreLike ? source.title : (input.title ?? `Face: ${input.ownerSkill}`);
134
- const body = restoreLike ? source.body : input.body;
135
- const tags = restoreLike ? source.tags : (input.tags ?? []);
136
- const extra = {
137
- owner_skill: input.ownerSkill,
138
- version: String(nextVersion),
139
- reason: input.reason,
140
- initiator: INITIATOR_BY_COMMAND[input.command],
141
- };
142
- if (base)
143
- extra.based_on = base.id;
144
- // lock не передаём: мы уже внутри deps.lock.withLock (FsMemoryLock не реентерабелен)
145
- const { object } = await addMemoryObject({
146
- store: deps.store,
147
- log: deps.log,
148
- clock: deps.clock,
149
- idGen: deps.idGen,
150
- index: deps.index,
151
- declarations: deps.declarations,
152
- }, { type: 'face', title, body, tags, createdBy: actor, extra, internalFacePath: true });
153
- const face = asFace(object);
154
- let supersededId = null;
155
- if (cur && cur.id !== face.id) {
156
- await supersedeMemoryObject({ store: deps.store, log: deps.log, clock: deps.clock, idGen: deps.idGen, index: deps.index }, cur.id, face.id);
157
- supersededId = cur.id;
158
- }
159
- // REQ-06 (design §«Механика версий»): initiator 'steward' → атомарно
160
- // G17-запись note(history) + relation 'mutates' → версия; та же
161
- // lock-транзакция (внутренние вызовы без lock).
162
- let mutationRecordId = null;
163
- if (INITIATOR_BY_COMMAND[input.command] === 'steward') {
164
- const note = await createMutationRecord({
165
- store: deps.store,
166
- log: deps.log,
167
- clock: deps.clock,
168
- idGen: deps.idGen,
169
- index: deps.index,
170
- relations: deps.relations,
171
- }, {
172
- ownerSkill: input.ownerSkill,
173
- version: face.version,
174
- faceId: face.id,
175
- createdBy: actor,
176
- reason: g17.reason,
177
- minimalChange: g17.minimalChange,
178
- boundaries: g17.boundaries,
179
- exampleHelps: g17.exampleHelps,
180
- exampleKeep: g17.exampleKeep,
181
- verification: g17.verification,
182
- rollback: g17.rollback,
183
- });
184
- mutationRecordId = note.id;
185
- }
186
- // T-09 (design §«Механика версий», строка 88): --from-proposal → relation
187
- // ('proposes', proposal, faceNew); только связь, не применение (REQ-09)
188
- if (input.fromProposal !== undefined) {
189
- await recordRelation({ relations: deps.relations, idGen: deps.idGen }, deps.clock.now(), input.fromProposal, 'proposes', face.id, 'system');
190
- }
191
- // Design §События журнала: versioned — на КАЖДУЮ версию (включая breakglass,
192
- // REQ-07 «результат = новая версия»); breakglass дополнительно журналируется
193
- // own-событием в составе самой операции (REQ-07 AC2). Порядок: versioned, затем breakglass.
194
- const now = deps.clock.now();
195
- const versionPayload = {
196
- owner_skill: input.ownerSkill,
197
- from: supersededId,
198
- new: face.id,
199
- initiator: INITIATOR_BY_COMMAND[input.command],
200
- reason: input.reason,
201
- };
202
- const versioned = {
203
- id: deps.idGen.generateEventId(now),
204
- type: 'memory.face.versioned',
205
- timestamp: now.toISOString(),
206
- actor,
207
- payload: versionPayload,
208
- };
209
- await deps.log.append(versioned);
210
- if (input.command === 'breakglass') {
211
- const breakglass = {
212
- id: deps.idGen.generateEventId(now),
213
- type: 'memory.face.breakglass',
214
- timestamp: now.toISOString(),
215
- actor,
216
- payload: versionPayload,
217
- };
218
- await deps.log.append(breakglass);
89
+ // Основа (restore/breakglass) проверяется до op_started: битая ссылка не
90
+ // оставляет незавершённую операцию в журнале (fail fast).
91
+ if (input.from) {
92
+ await resolveBase(deps.store, input.ownerSkill, input.from);
219
93
  }
220
- return { face, supersededId, mutationRecordId };
94
+ // 2.17.1 REQ-03: цепочка шагов — журналируемая операция (face-operation.ts);
95
+ // мы уже под lock, engine его не пере-берёт.
96
+ return runFaceMutation(deps, { input, actor });
221
97
  };
222
98
  return deps.lock ? deps.lock.withLock(run) : run();
223
99
  }
@@ -1 +1 @@
1
- {"version":3,"file":"create-face-version.js","sourceRoot":"","sources":["../../../src/app/use-cases/create-face-version.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create-face-version.js","sourceRoot":"","sources":["../../../src/app/use-cases/create-face-version.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
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
+ export interface EditMemoryObjectDeps {
8
+ store: MemoryStore;
9
+ log: EventLog;
10
+ clock: Clock;
11
+ idGen: IdGenerator;
12
+ index?: SearchIndex;
13
+ lock?: MemoryLock;
14
+ }
15
+ export interface EditMemoryObjectInput {
16
+ id: string;
17
+ title?: string;
18
+ body?: string;
19
+ actor: string;
20
+ }
21
+ export interface EditMemoryObjectResult {
22
+ id: string;
23
+ fields: Array<'title' | 'body'>;
24
+ }
25
+ export declare function editMemoryObject(deps: EditMemoryObjectDeps, input: EditMemoryObjectInput): Promise<EditMemoryObjectResult>;
26
+ //# sourceMappingURL=edit-memory-object.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-memory-object.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/edit-memory-object.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;AAa7D,MAAM,WAAW,oBAAoB;IACnC,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,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC;CACjC;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,oBAAoB,EAC1B,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,sBAAsB,CAAC,CA6CjC"}
@@ -0,0 +1,57 @@
1
+ import { UserFacingError } from '../../domain/errors.js';
2
+ // wolf edit (спека 2.13 §6.1): правка title/body с diff-аудитом — отдельное
3
+ // событие memory.edited на каждое изменённое поле, before/after обрезаны до
4
+ // 200 симв (прецедент target-обрезки волны 0, session-metrics-log.ts:482).
5
+ // 2.17.1 REQ-04 (R05, design §7): edit вынесен из CLI в use-case слой —
6
+ // face-тип запрещён (лицо меняется только версионирующим путём wolf face);
7
+ // guard здесь, не в CLI (AC-4: негативный сценарий на уровне use-case).
8
+ const CLIP = 200;
9
+ const clip = (s) => (s.length > CLIP ? s.slice(0, CLIP) : s);
10
+ export async function editMemoryObject(deps, input) {
11
+ const existing = await deps.store.get(input.id);
12
+ if (!existing)
13
+ throw new UserFacingError(`Memory object not found: ${input.id}`);
14
+ if (existing.type === 'face') {
15
+ throw new UserFacingError('type "face" cannot be edited: faces are versioned, use "wolf face" commands (new | restore | breakglass)');
16
+ }
17
+ const fields = [];
18
+ if (input.title !== undefined) {
19
+ if (input.title.trim() === '')
20
+ throw new UserFacingError('Title must not be empty');
21
+ fields.push('title');
22
+ }
23
+ if (input.body !== undefined) {
24
+ if (input.body.trim() === '')
25
+ throw new UserFacingError('Body must not be empty');
26
+ fields.push('body');
27
+ }
28
+ if (fields.length === 0)
29
+ throw new UserFacingError('Nothing to edit: pass a title and/or body');
30
+ const patch = {};
31
+ if (input.title !== undefined)
32
+ patch.title = input.title;
33
+ if (input.body !== undefined)
34
+ patch.body = input.body;
35
+ const run = async () => {
36
+ const updated = await deps.store.update(input.id, patch);
37
+ const now = deps.clock.now();
38
+ for (const field of fields) {
39
+ await deps.log.append({
40
+ id: deps.idGen.generateEventId(now),
41
+ type: 'memory.edited',
42
+ timestamp: now.toISOString(),
43
+ actor: input.actor,
44
+ payload: {
45
+ memory_id: input.id,
46
+ field,
47
+ before: clip(existing[field]),
48
+ after: clip(input[field]),
49
+ },
50
+ });
51
+ }
52
+ await deps.index?.indexObject(updated);
53
+ return { id: input.id, fields };
54
+ };
55
+ return deps.lock ? deps.lock.withLock(run) : run();
56
+ }
57
+ //# sourceMappingURL=edit-memory-object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-memory-object.js","sourceRoot":"","sources":["../../../src/app/use-cases/edit-memory-object.ts"],"names":[],"mappings":"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"}
@@ -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":"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"}