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
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import { safeCwd } from '../cli-entry.js';
|
|
3
3
|
import { createCliContainer } from '../../../bootstrap/container.js';
|
|
4
|
-
import {
|
|
5
|
-
// wolf edit (спека 2.13 §6.1):
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
// Смыслные смены (смена решения и т.п.) — по-прежнему supersede.
|
|
9
|
-
const CLIP = 200;
|
|
10
|
-
const clip = (s) => (s.length > CLIP ? s.slice(0, CLIP) : s);
|
|
11
|
-
// baseDir инъектится для тестов (прецедент: memory-update.ts).
|
|
4
|
+
import { editMemoryObject } from '../../../app/use-cases/edit-memory-object.js';
|
|
5
|
+
// wolf edit (спека 2.13 §6.1): механика — в use-case edit-memory-object
|
|
6
|
+
// (2.17.1 REQ-04/R05: guard face-типа в use-case слое, не в CLI); команда —
|
|
7
|
+
// только разбор аргументов и печать.
|
|
12
8
|
export function memoryEditCommand(baseDir = safeCwd()) {
|
|
13
9
|
return new Command('edit')
|
|
14
10
|
.description('Edit title and/or body of a memory object (diff-audited in events.jsonl)')
|
|
@@ -18,50 +14,8 @@ export function memoryEditCommand(baseDir = safeCwd()) {
|
|
|
18
14
|
.option('--actor <actor>', 'Actor performing the edit', 'user:cli')
|
|
19
15
|
.action(async (id, options) => {
|
|
20
16
|
const { store, log, clock, idGen, index, lock } = createCliContainer(baseDir);
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
throw new UserFacingError(`Memory object not found: ${id}`);
|
|
24
|
-
const edits = [];
|
|
25
|
-
if (options.title !== undefined) {
|
|
26
|
-
if (options.title.trim() === '')
|
|
27
|
-
throw new UserFacingError('Title must not be empty');
|
|
28
|
-
edits.push('title');
|
|
29
|
-
}
|
|
30
|
-
if (options.body !== undefined) {
|
|
31
|
-
if (options.body.trim() === '')
|
|
32
|
-
throw new UserFacingError('Body must not be empty');
|
|
33
|
-
edits.push('body');
|
|
34
|
-
}
|
|
35
|
-
if (edits.length === 0) {
|
|
36
|
-
throw new UserFacingError('Nothing to edit: pass --title and/or --body');
|
|
37
|
-
}
|
|
38
|
-
const patch = {};
|
|
39
|
-
if (options.title !== undefined)
|
|
40
|
-
patch.title = options.title;
|
|
41
|
-
if (options.body !== undefined)
|
|
42
|
-
patch.body = options.body;
|
|
43
|
-
const run = async () => {
|
|
44
|
-
const updated = await store.update(id, patch);
|
|
45
|
-
const now = clock.now();
|
|
46
|
-
for (const field of edits) {
|
|
47
|
-
await log.append({
|
|
48
|
-
id: idGen.generateEventId(now),
|
|
49
|
-
type: 'memory.edited',
|
|
50
|
-
timestamp: now.toISOString(),
|
|
51
|
-
actor: options.actor,
|
|
52
|
-
payload: {
|
|
53
|
-
memory_id: id,
|
|
54
|
-
field,
|
|
55
|
-
before: clip(existing[field]),
|
|
56
|
-
after: clip(options[field]),
|
|
57
|
-
},
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
if (index)
|
|
61
|
-
await index.indexObject(updated);
|
|
62
|
-
console.log(`Edited ${id}: ${edits.join(', ')}`);
|
|
63
|
-
};
|
|
64
|
-
return lock ? lock.withLock(run) : run();
|
|
17
|
+
const result = await editMemoryObject({ store, log, clock, idGen, index, lock }, { ...options, id });
|
|
18
|
+
console.log(`Edited ${id}: ${result.fields.join(', ')}`);
|
|
65
19
|
});
|
|
66
20
|
}
|
|
67
21
|
//# sourceMappingURL=memory-edit.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-edit.js","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/memory-edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"memory-edit.js","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/memory-edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AAEhF,wEAAwE;AACxE,4EAA4E;AAC5E,qCAAqC;AACrC,MAAM,UAAU,iBAAiB,CAAC,UAAkB,OAAO,EAAE;IAC3D,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;SACvB,WAAW,CAAC,0EAA0E,CAAC;SACvF,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;SACpC,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC;SAClC,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC;SAChC,MAAM,CAAC,iBAAiB,EAAE,2BAA2B,EAAE,UAAU,CAAC;SAClE,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,OAAyD,EAAE,EAAE;QACtF,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QACrG,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-init.d.ts","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/memory-init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBpC,UAAU,EAAE;IACV,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACtC;AAED,mFAAmF;AACnF,wBAAsB,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAKxD;AAID,yFAAyF;AACzF,wBAAgB,eAAe,CAAC,IAAI,EAAE;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;IAAC,eAAe,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,EAAE,CAc/G;AAED,2GAA2G;AAC3G,wBAAgB,iBAAiB,CAAC,CAAC,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAO9F;AAED,+FAA+F;AAC/F,wBAAgB,kBAAkB,CAAC,CAAC,EAAE;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,GAAG,MAAM,CAWT;AAID,wBAAgB,iBAAiB,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"memory-init.d.ts","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/memory-init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBpC,UAAU,EAAE;IACV,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACtC;AAED,mFAAmF;AACnF,wBAAsB,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAKxD;AAID,yFAAyF;AACzF,wBAAgB,eAAe,CAAC,IAAI,EAAE;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;IAAC,eAAe,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,EAAE,CAc/G;AAED,2GAA2G;AAC3G,wBAAgB,iBAAiB,CAAC,CAAC,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAO9F;AAED,+FAA+F;AAC/F,wBAAgB,kBAAkB,CAAC,CAAC,EAAE;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,GAAG,MAAM,CAWT;AAID,wBAAgB,iBAAiB,IAAI,OAAO,CAkN3C"}
|
|
@@ -187,13 +187,38 @@ export function memoryInitCommand() {
|
|
|
187
187
|
index,
|
|
188
188
|
lock,
|
|
189
189
|
declarations,
|
|
190
|
-
})
|
|
190
|
+
}).then((os) =>
|
|
191
|
+
// BaseSetOutcome.action = RenderAction: 'diverged' печатается как
|
|
192
|
+
// 'conflict' (ближайший легальный исход), слово diverged — в reason
|
|
193
|
+
os.map((o) => ({
|
|
194
|
+
file: o.file,
|
|
195
|
+
action: o.action === 'diverged' ? 'conflict' : o.action,
|
|
196
|
+
reason: o.reason,
|
|
197
|
+
}))),
|
|
191
198
|
},
|
|
192
199
|
}, baseDir, input);
|
|
200
|
+
// T4 (REQ-01, design §3.6/ADR-6): re-init без --full тоже обновляет
|
|
201
|
+
// live-лица — минимальный путь не доходит до baseSet.seed (гейт
|
|
202
|
+
// input.full внутри initProject); документированная последовательность
|
|
203
|
+
// обновления «пакет → wolf init --yes» идёт этим проходом.
|
|
204
|
+
const faceOutcomes = plan.live && !input.full && !result.npx
|
|
205
|
+
? await seedBasePlaybooks({
|
|
206
|
+
files: playbookFiles,
|
|
207
|
+
store,
|
|
208
|
+
log,
|
|
209
|
+
clock,
|
|
210
|
+
idGen,
|
|
211
|
+
index,
|
|
212
|
+
lock,
|
|
213
|
+
declarations,
|
|
214
|
+
})
|
|
215
|
+
: [];
|
|
193
216
|
console.log('# wolf init');
|
|
194
217
|
console.log(`- memory skeleton: ensured (${join(baseDir, '.wolf')})`);
|
|
195
218
|
for (const o of result.baseSetOutcomes)
|
|
196
219
|
console.log(formatBaseSetLine(o)); // F5: скиллы — [skill] имя → путь
|
|
220
|
+
for (const o of faceOutcomes)
|
|
221
|
+
console.log(formatBaseSetLine(o)); // §3.6: исходы обновления лиц
|
|
197
222
|
for (const outcome of result.platformOutcomes)
|
|
198
223
|
console.log(formatPlatformLine(outcome)); // F6: configFile + keys
|
|
199
224
|
console.log(result.initReport.action === 'created'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-init.js","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/memory-init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAChG,OAAO,EAAE,0BAA0B,EAAE,MAAM,wCAAwC,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"memory-init.js","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/memory-init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-scaffold.d.ts","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/memory-scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"memory-scaffold.d.ts","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/memory-scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,WAAW,CAAC;AAS9C,wBAAgB,qBAAqB,IAAI,OAAO,CA8D/C"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Command, Argument } from 'commander';
|
|
2
2
|
import { scaffoldFrame, SCAFFOLD_KINDS } from '../../../app/use-cases/scaffold-agent.js';
|
|
3
3
|
import { scaffoldArtifact } from '../../../app/use-cases/scaffold-artifact.js';
|
|
4
|
+
import { makeClaimGuard } from '../../../app/use-cases/claim-artifact.js';
|
|
4
5
|
import { createCliContainer } from '../../../bootstrap/container.js';
|
|
5
6
|
import { resolveCreatedBy, resolveSessionId } from '../../../domain/actor.js';
|
|
6
7
|
import { UserFacingError } from '../../../domain/errors.js';
|
|
@@ -24,7 +25,7 @@ export function memoryScaffoldCommand() {
|
|
|
24
25
|
throw new UserFacingError('--persona/--model/--from-playbook are not supported for kind=artifact');
|
|
25
26
|
}
|
|
26
27
|
const { clock, fs } = createCliContainer(process.cwd());
|
|
27
|
-
const res = await scaffoldArtifact({ clock, fs, baseDir: process.cwd() }, { slug: name, fix: options.fix === true });
|
|
28
|
+
const res = await scaffoldArtifact({ clock, fs, baseDir: process.cwd(), claims: makeClaimGuard({ baseDir: process.cwd() }) }, { slug: name, fix: options.fix === true });
|
|
28
29
|
for (const f of res.files)
|
|
29
30
|
console.log(`Created artifact: ${f}`);
|
|
30
31
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-scaffold.js","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/memory-scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAqB,MAAM,0CAA0C,CAAC;AAC5G,OAAO,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AAEnF,MAAM,UAAU,qBAAqB;IACnC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;SAC3B,WAAW,CAAC,yEAAyE,CAAC;SACtF,WAAW,CAAC,IAAI,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;SAC9E,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;SAChC,MAAM,CAAC,kBAAkB,EAAE,oCAAoC,CAAC;SAChE,MAAM,CAAC,iBAAiB,EAAE,sCAAsC,CAAC;SACjE,MAAM,CAAC,sBAAsB,EAAE,0DAA0D,CAAC;SAC1F,MAAM,CAAC,OAAO,EAAE,+DAA+D,EAAE,KAAK,CAAC;SACvF,MAAM,CAAC,sBAAsB,EAAE,wDAAwD,CAAC;SACxF,MAAM,CACL,KAAK,EACH,IAAY,EACZ,IAAY,EACZ,OAAuG,EACvG,EAAE;QACF,IAAI,IAAI,KAAK,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YACvC,MAAM,IAAI,eAAe,CAAC,2CAA2C,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;gBACvG,MAAM,IAAI,eAAe,CAAC,uEAAuE,CAAC,CAAC;YACrG,CAAC;YACD,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACxD,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAChC,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"memory-scaffold.js","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/memory-scaffold.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 2.17.1 REQ-05 (R06), design §3.5 / ADR-5: файловый claim-реестр владения
|
|
3
|
+
* общими артефактами (TASK-бриф, план, отчёт, worktree). JSON-файлы в общем
|
|
4
|
+
* `.wolf/shared/claims/` (cross-copy видимость — root из resolveMemoryRoot);
|
|
5
|
+
* атомарный захват — `openSync(…, 'wx')` (механика FsMemoryLock tryAcquire);
|
|
6
|
+
* stale: PID мёртв (ESRCH) ИЛИ возраст > CLAIM_TTL; перехват stale сохраняет
|
|
7
|
+
* прежний файл жёсткой ссылкой в след `<slug>.<epochMs>.json` (excl, NFR-02).
|
|
8
|
+
*/
|
|
9
|
+
/** TTL claim'а: локальный-first, heartbeat не вводим (design §3.5). */
|
|
10
|
+
export declare const CLAIM_TTL_MS: number;
|
|
11
|
+
export interface ClaimRecord {
|
|
12
|
+
/** Тип+идентификатор артефакта: "dev:<date>-<slug>" | "worktree:<WT-ID>" | … */
|
|
13
|
+
artifact: string;
|
|
14
|
+
/** Actor (WOLF_ACTOR-резолв, тот же механизм атрибуции). */
|
|
15
|
+
owner: string;
|
|
16
|
+
session_id: string | null;
|
|
17
|
+
pid: number;
|
|
18
|
+
cwd: string;
|
|
19
|
+
/** ISO-время захвата. */
|
|
20
|
+
acquired_at: string;
|
|
21
|
+
}
|
|
22
|
+
/** Идентичность захватчика/освободителя: маппится в поля записи. */
|
|
23
|
+
export interface ClaimIdentity {
|
|
24
|
+
owner: string;
|
|
25
|
+
sessionId: string | null;
|
|
26
|
+
pid: number;
|
|
27
|
+
}
|
|
28
|
+
export interface ClaimRegistryDeps {
|
|
29
|
+
/** Общий root (resolveMemoryRoot().root) — claims видны из всех копий. */
|
|
30
|
+
root: string;
|
|
31
|
+
/** Тестовый seam: управляемое время (TTL). Дефолт — системные часы. */
|
|
32
|
+
now?: () => Date;
|
|
33
|
+
/** Тестовый seam: liveness PID. Дефолт — process.kill(pid, 0). */
|
|
34
|
+
isAlive?: (pid: number) => boolean;
|
|
35
|
+
/** Тестовый seam: ожидание in-flight окна. Дефолт — синхронный sleep. */
|
|
36
|
+
wait?: (ms: number) => void;
|
|
37
|
+
}
|
|
38
|
+
export declare class ClaimHeldError extends Error {
|
|
39
|
+
readonly claimPath: string;
|
|
40
|
+
readonly owner: string;
|
|
41
|
+
readonly reason: string;
|
|
42
|
+
constructor(claimPath: string, owner: string, reason: string);
|
|
43
|
+
}
|
|
44
|
+
export declare function claimsDir(root: string): string;
|
|
45
|
+
/** Имя файла claim'а: слэг артефакта, безопасный для ФС.
|
|
46
|
+
* shortcut: различные артефакты могут слэгнуться одинаково (отказ fail-closed, не порча). */
|
|
47
|
+
export declare function claimSlug(artifact: string): string;
|
|
48
|
+
export declare function claimFilePath(root: string, artifact: string): string;
|
|
49
|
+
/** След перехвата: `<slug>.<epochMs>.json` (исходные байты сохраняются, NFR-02). */
|
|
50
|
+
export declare function claimTrailPath(root: string, artifact: string, epochMs: number): string;
|
|
51
|
+
/** Прод-liveness: signal 0; ESRCH — мёртв, EPERM — жив (чужой user). pid<=0 —
|
|
52
|
+
* неизвестен (переданный claim) — считаем живым, пока не истечёт TTL. */
|
|
53
|
+
export declare function pidAlive(pid: number): boolean;
|
|
54
|
+
/** Атомарный захват (REQ-05 AC-1): wx-create; занято и fresh — ClaimHeldError
|
|
55
|
+
* с идентификатором владельца; stale/порченый — перехват со следом. */
|
|
56
|
+
export declare function acquireClaim(deps: ClaimRegistryDeps, input: {
|
|
57
|
+
artifact: string;
|
|
58
|
+
identity: ClaimIdentity;
|
|
59
|
+
cwd: string;
|
|
60
|
+
}): ClaimRecord;
|
|
61
|
+
/** Освобождение (design §3.5): владелец — совпадение owner+session+pid.
|
|
62
|
+
* Освобождение чужим (иной owner/session, или pid записи жив и не совпал) —
|
|
63
|
+
* отказ с именем владельца. Мёртвый/stale держатель: тот же owner+session
|
|
64
|
+
* может убрать запись (равносильно перехвату acquire — новой власти не даёт). */
|
|
65
|
+
export declare function releaseClaim(deps: ClaimRegistryDeps, input: {
|
|
66
|
+
artifact: string;
|
|
67
|
+
identity: ClaimIdentity;
|
|
68
|
+
transferTo?: string;
|
|
69
|
+
}): {
|
|
70
|
+
action: 'released' | 'transferred';
|
|
71
|
+
owner: string;
|
|
72
|
+
};
|
|
73
|
+
/** Реестр для наблюдаемости (REQ-05 AC-2): кто/когда/что из файлов; следы
|
|
74
|
+
* `<slug>.<epochMs>.json` исключаются — по содержимому: след хранит запись
|
|
75
|
+
* базового артефакта, его slug ≠ имя файла следа (MINOR-4). */
|
|
76
|
+
export declare function listClaims(deps: ClaimRegistryDeps): ClaimRecord[];
|
|
77
|
+
/** Guard записи (REQ-05 AC-3): активный claim артефакта должен существовать и
|
|
78
|
+
* принадлежать пишущему (owner+session; pid писателя ≠ pid захватчика —
|
|
79
|
+
* захват и запись обычно разные процессы). Отказ — UserFacingError с именем
|
|
80
|
+
* владельца и путём claim-файла. */
|
|
81
|
+
export declare function requireClaim(deps: ClaimRegistryDeps, artifact: string, who: {
|
|
82
|
+
owner: string;
|
|
83
|
+
sessionId: string | null;
|
|
84
|
+
}): void;
|
|
85
|
+
//# sourceMappingURL=claim-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claim-registry.d.ts","sourceRoot":"","sources":["../../../src/adapters/fs/claim-registry.ts"],"names":[],"mappings":"AAeA;;;;;;;GAOG;AAEH,uEAAuE;AACvE,eAAO,MAAM,YAAY,QAAsB,CAAC;AAEhD,MAAM,WAAW,WAAW;IAC1B,gFAAgF;IAChF,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,yBAAyB;IACzB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,oEAAoE;AACpE,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,kEAAkE;IAClE,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,yEAAyE;IACzE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,qBAAa,cAAe,SAAQ,KAAK;aAErB,SAAS,EAAE,MAAM;aACjB,KAAK,EAAE,MAAM;aACb,MAAM,EAAE,MAAM;gBAFd,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM;CAKjC;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;6FAC6F;AAC7F,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtF;AAED;yEACyE;AACzE,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQ7C;AAgDD;uEACuE;AACvE,wBAAgB,YAAY,CAC1B,IAAI,EAAE,iBAAiB,EACvB,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,aAAa,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAChE,WAAW,CA4Eb;AAMD;;;iFAGiF;AACjF,wBAAgB,YAAY,CAC1B,IAAI,EAAE,iBAAiB,EACvB,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,aAAa,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GACxE;IAAE,MAAM,EAAE,UAAU,GAAG,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAwCvD;AAED;;+DAE+D;AAC/D,wBAAgB,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,WAAW,EAAE,CAmBjE;AAED;;;oCAGoC;AACpC,wBAAgB,YAAY,CAC1B,IAAI,EAAE,iBAAiB,EACvB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC/C,IAAI,CA2BN"}
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import { closeSync, existsSync, linkSync, mkdirSync, openSync, readFileSync, readdirSync, statSync, unlinkSync, writeFileSync, } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { UserFacingError } from '../../domain/errors.js';
|
|
4
|
+
/**
|
|
5
|
+
* 2.17.1 REQ-05 (R06), design §3.5 / ADR-5: файловый claim-реестр владения
|
|
6
|
+
* общими артефактами (TASK-бриф, план, отчёт, worktree). JSON-файлы в общем
|
|
7
|
+
* `.wolf/shared/claims/` (cross-copy видимость — root из resolveMemoryRoot);
|
|
8
|
+
* атомарный захват — `openSync(…, 'wx')` (механика FsMemoryLock tryAcquire);
|
|
9
|
+
* stale: PID мёртв (ESRCH) ИЛИ возраст > CLAIM_TTL; перехват stale сохраняет
|
|
10
|
+
* прежний файл жёсткой ссылкой в след `<slug>.<epochMs>.json` (excl, NFR-02).
|
|
11
|
+
*/
|
|
12
|
+
/** TTL claim'а: локальный-first, heartbeat не вводим (design §3.5). */
|
|
13
|
+
export const CLAIM_TTL_MS = 24 * 60 * 60 * 1000;
|
|
14
|
+
export class ClaimHeldError extends Error {
|
|
15
|
+
claimPath;
|
|
16
|
+
owner;
|
|
17
|
+
reason;
|
|
18
|
+
constructor(claimPath, owner, reason) {
|
|
19
|
+
super(`Claim held by ${owner}: ${claimPath} (${reason})`);
|
|
20
|
+
this.claimPath = claimPath;
|
|
21
|
+
this.owner = owner;
|
|
22
|
+
this.reason = reason;
|
|
23
|
+
this.name = 'ClaimHeldError';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export function claimsDir(root) {
|
|
27
|
+
return join(root, '.wolf', 'shared', 'claims');
|
|
28
|
+
}
|
|
29
|
+
/** Имя файла claim'а: слэг артефакта, безопасный для ФС.
|
|
30
|
+
* shortcut: различные артефакты могут слэгнуться одинаково (отказ fail-closed, не порча). */
|
|
31
|
+
export function claimSlug(artifact) {
|
|
32
|
+
return artifact.replace(/[^A-Za-z0-9._-]+/g, '_');
|
|
33
|
+
}
|
|
34
|
+
export function claimFilePath(root, artifact) {
|
|
35
|
+
return join(claimsDir(root), `${claimSlug(artifact)}.json`);
|
|
36
|
+
}
|
|
37
|
+
/** След перехвата: `<slug>.<epochMs>.json` (исходные байты сохраняются, NFR-02). */
|
|
38
|
+
export function claimTrailPath(root, artifact, epochMs) {
|
|
39
|
+
return join(claimsDir(root), `${claimSlug(artifact)}.${epochMs}.json`);
|
|
40
|
+
}
|
|
41
|
+
/** Прод-liveness: signal 0; ESRCH — мёртв, EPERM — жив (чужой user). pid<=0 —
|
|
42
|
+
* неизвестен (переданный claim) — считаем живым, пока не истечёт TTL. */
|
|
43
|
+
export function pidAlive(pid) {
|
|
44
|
+
if (!Number.isInteger(pid) || pid <= 0)
|
|
45
|
+
return true;
|
|
46
|
+
try {
|
|
47
|
+
process.kill(pid, 0);
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
return e.code === 'EPERM';
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/** Синхронное ожидание in-flight окна (MINOR-2): Atomics.wait — без busy-loop. */
|
|
55
|
+
function sleepMs(ms) {
|
|
56
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
|
|
57
|
+
}
|
|
58
|
+
function parseClaim(raw) {
|
|
59
|
+
try {
|
|
60
|
+
const d = JSON.parse(raw);
|
|
61
|
+
if (typeof d.artifact !== 'string' || typeof d.owner !== 'string')
|
|
62
|
+
return null;
|
|
63
|
+
return {
|
|
64
|
+
artifact: d.artifact,
|
|
65
|
+
owner: d.owner,
|
|
66
|
+
session_id: typeof d.session_id === 'string' ? d.session_id : null,
|
|
67
|
+
pid: typeof d.pid === 'number' ? d.pid : 0,
|
|
68
|
+
cwd: typeof d.cwd === 'string' ? d.cwd : '',
|
|
69
|
+
acquired_at: typeof d.acquired_at === 'string' ? d.acquired_at : '',
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/** Stale (design §3.5): мёртвый PID ИЛИ возраст > TTL; порченый файл = stale. */
|
|
77
|
+
function isStale(rec, deps) {
|
|
78
|
+
if (rec === null)
|
|
79
|
+
return true;
|
|
80
|
+
const alive = deps.isAlive ?? pidAlive;
|
|
81
|
+
if (!alive(rec.pid))
|
|
82
|
+
return true;
|
|
83
|
+
const acquired = Date.parse(rec.acquired_at);
|
|
84
|
+
if (Number.isNaN(acquired))
|
|
85
|
+
return true;
|
|
86
|
+
const now = (deps.now ?? (() => new Date()))().getTime();
|
|
87
|
+
return now - acquired > CLAIM_TTL_MS;
|
|
88
|
+
}
|
|
89
|
+
function readClaimFile(path) {
|
|
90
|
+
try {
|
|
91
|
+
const raw = readFileSync(path, 'utf-8');
|
|
92
|
+
return { raw, rec: parseClaim(raw) };
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return { raw: null, rec: null };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function describeHolder(rec) {
|
|
99
|
+
return `session ${rec.session_id ?? '-'}, pid ${rec.pid}, acquired ${rec.acquired_at}`;
|
|
100
|
+
}
|
|
101
|
+
/** Атомарный захват (REQ-05 AC-1): wx-create; занято и fresh — ClaimHeldError
|
|
102
|
+
* с идентификатором владельца; stale/порченый — перехват со следом. */
|
|
103
|
+
export function acquireClaim(deps, input) {
|
|
104
|
+
const dir = claimsDir(deps.root);
|
|
105
|
+
mkdirSync(dir, { recursive: true });
|
|
106
|
+
const path = claimFilePath(deps.root, input.artifact);
|
|
107
|
+
const now = deps.now ?? (() => new Date());
|
|
108
|
+
const record = {
|
|
109
|
+
artifact: input.artifact,
|
|
110
|
+
owner: input.identity.owner,
|
|
111
|
+
session_id: input.identity.sessionId,
|
|
112
|
+
pid: input.identity.pid,
|
|
113
|
+
cwd: input.cwd,
|
|
114
|
+
acquired_at: now().toISOString(),
|
|
115
|
+
};
|
|
116
|
+
for (let attempt = 0;; attempt++) {
|
|
117
|
+
try {
|
|
118
|
+
const fd = openSync(path, 'wx');
|
|
119
|
+
writeFileSync(fd, JSON.stringify(record), 'utf-8');
|
|
120
|
+
closeSync(fd);
|
|
121
|
+
return record;
|
|
122
|
+
}
|
|
123
|
+
catch (e) {
|
|
124
|
+
const code = e.code;
|
|
125
|
+
if (code !== 'EEXIST')
|
|
126
|
+
throw e;
|
|
127
|
+
}
|
|
128
|
+
const { raw, rec } = readClaimFile(path);
|
|
129
|
+
// MINOR-2 (ревью T5): пустой файл — in-flight окно создателя (между wx и
|
|
130
|
+
// write), не порча: takeover запрещён, короткое ожидание и повтор
|
|
131
|
+
if (raw !== null && raw.trim() === '') {
|
|
132
|
+
if (attempt >= 60) {
|
|
133
|
+
throw new ClaimHeldError(path, 'unknown', 'claim file exists but stays empty (in-flight write?) — if it persists, remove it manually');
|
|
134
|
+
}
|
|
135
|
+
(deps.wait ?? sleepMs)(10);
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (rec !== null && !isStale(rec, deps)) {
|
|
139
|
+
throw new ClaimHeldError(path, rec.owner, describeHolder(rec));
|
|
140
|
+
}
|
|
141
|
+
// stale/порченый (rec === null, сырые байты могли быть) → перехват со следом;
|
|
142
|
+
// проигранная гонка перехвата (ENOENT на link/unlink) — повтор захвата
|
|
143
|
+
try {
|
|
144
|
+
const epoch = now().getTime();
|
|
145
|
+
// FIX-4 (MINOR-4, ревью T5): след — через linkSync (excl-семантика):
|
|
146
|
+
// exists+rename TOCTOU позволял двум перехватчикам одной мс перезаписать
|
|
147
|
+
// чужой след (потеря байтов, NFR-02); при EEXIST — bump эпохи до свободного
|
|
148
|
+
let preserved = null;
|
|
149
|
+
for (let bump = 0; bump < 50 && preserved === null; bump++) {
|
|
150
|
+
const trail = claimTrailPath(deps.root, input.artifact, epoch + bump);
|
|
151
|
+
try {
|
|
152
|
+
linkSync(path, trail);
|
|
153
|
+
preserved = trail;
|
|
154
|
+
}
|
|
155
|
+
catch (e) {
|
|
156
|
+
if (e.code !== 'EEXIST')
|
|
157
|
+
throw e;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
if (preserved !== null) {
|
|
161
|
+
// решение принималось по raw, а слинковаться мог уже переписанный файл
|
|
162
|
+
// (чужой takeover между чтением и link): чужую свежую запись в след не
|
|
163
|
+
// берём и claim-имя под ней не освобождаем — перечитаем и откажемся
|
|
164
|
+
if (raw !== null && readFileSync(preserved, 'utf-8') !== raw) {
|
|
165
|
+
unlinkSync(preserved);
|
|
166
|
+
}
|
|
167
|
+
else if (statSync(path).ino === statSync(preserved).ino) {
|
|
168
|
+
// unlink только сохранённый inode: конкурент мог уже пересоздать claim
|
|
169
|
+
unlinkSync(path);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
/* конкурент уже сохранил/убрал файл — идём на повторный wx */
|
|
175
|
+
}
|
|
176
|
+
if (attempt > 20) {
|
|
177
|
+
throw new ClaimHeldError(path, rec?.owner ?? 'unknown', 'too many contention attempts');
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function ownerSessionMatch(rec, identity) {
|
|
182
|
+
return rec.owner === identity.owner && rec.session_id === identity.sessionId;
|
|
183
|
+
}
|
|
184
|
+
/** Освобождение (design §3.5): владелец — совпадение owner+session+pid.
|
|
185
|
+
* Освобождение чужим (иной owner/session, или pid записи жив и не совпал) —
|
|
186
|
+
* отказ с именем владельца. Мёртвый/stale держатель: тот же owner+session
|
|
187
|
+
* может убрать запись (равносильно перехвату acquire — новой власти не даёт). */
|
|
188
|
+
export function releaseClaim(deps, input) {
|
|
189
|
+
const path = claimFilePath(deps.root, input.artifact);
|
|
190
|
+
const { rec } = readClaimFile(path);
|
|
191
|
+
if (!existsSync(path)) {
|
|
192
|
+
throw new UserFacingError(`No claim held for "${input.artifact}" (claim file: ${path})`);
|
|
193
|
+
}
|
|
194
|
+
if (rec === null) {
|
|
195
|
+
// FIX-5 (MINOR-5, ревью T5): файл есть, но не читается как claim — «No claim
|
|
196
|
+
// held» лгало об отсутствии; честный отказ без расширения поведения.
|
|
197
|
+
throw new UserFacingError(`Claim file for "${input.artifact}" is corrupt — ownership cannot be verified; take over via "wolf claim acquire" (preserves bytes) or remove it manually (claim file: ${path})`);
|
|
198
|
+
}
|
|
199
|
+
const fullMatch = ownerSessionMatch(rec, input.identity) && rec.pid === input.identity.pid;
|
|
200
|
+
const pidReleasable = rec.pid <= 0 || isStale(rec, deps);
|
|
201
|
+
// MINOR-1b (интегральное ревью 2.17.1): зеркально requireClaim — адресат
|
|
202
|
+
// transfer (session null + owner) освобождает своей сессией, иначе передача
|
|
203
|
+
// паркует release до TTL
|
|
204
|
+
const transferredToWho = rec.session_id === null && rec.owner === input.identity.owner;
|
|
205
|
+
if (!fullMatch && !transferredToWho && !(ownerSessionMatch(rec, input.identity) && pidReleasable)) {
|
|
206
|
+
throw new UserFacingError(`Claim for "${input.artifact}" is owned by ${rec.owner} (${describeHolder(rec)}) — release is owner-only (claim file: ${path})`);
|
|
207
|
+
}
|
|
208
|
+
if (input.transferTo !== undefined) {
|
|
209
|
+
const now = (deps.now ?? (() => new Date()))();
|
|
210
|
+
const transferred = {
|
|
211
|
+
artifact: rec.artifact,
|
|
212
|
+
owner: input.transferTo,
|
|
213
|
+
// новый владелец ещё не предъявил процесс — liveness неизвестна (TTL решает)
|
|
214
|
+
session_id: null,
|
|
215
|
+
pid: 0,
|
|
216
|
+
cwd: rec.cwd,
|
|
217
|
+
acquired_at: now.toISOString(),
|
|
218
|
+
};
|
|
219
|
+
writeFileSync(path, JSON.stringify(transferred), 'utf-8');
|
|
220
|
+
return { action: 'transferred', owner: input.transferTo };
|
|
221
|
+
}
|
|
222
|
+
unlinkSync(path);
|
|
223
|
+
return { action: 'released', owner: rec.owner };
|
|
224
|
+
}
|
|
225
|
+
/** Реестр для наблюдаемости (REQ-05 AC-2): кто/когда/что из файлов; следы
|
|
226
|
+
* `<slug>.<epochMs>.json` исключаются — по содержимому: след хранит запись
|
|
227
|
+
* базового артефакта, его slug ≠ имя файла следа (MINOR-4). */
|
|
228
|
+
export function listClaims(deps) {
|
|
229
|
+
const dir = claimsDir(deps.root);
|
|
230
|
+
let names;
|
|
231
|
+
try {
|
|
232
|
+
names = readdirSync(dir);
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
return [];
|
|
236
|
+
}
|
|
237
|
+
const out = [];
|
|
238
|
+
for (const name of names) {
|
|
239
|
+
if (!name.endsWith('.json'))
|
|
240
|
+
continue;
|
|
241
|
+
const { rec } = readClaimFile(join(dir, name));
|
|
242
|
+
if (rec === null)
|
|
243
|
+
continue;
|
|
244
|
+
// MINOR-4: имя с 13 цифрами на конце может быть легитимным claim'ом —
|
|
245
|
+
// след распознаём по несоответствию имени и slug(rec.artifact), не по маске
|
|
246
|
+
if (claimFilePath(deps.root, rec.artifact) !== join(dir, name))
|
|
247
|
+
continue;
|
|
248
|
+
out.push(rec);
|
|
249
|
+
}
|
|
250
|
+
return out;
|
|
251
|
+
}
|
|
252
|
+
/** Guard записи (REQ-05 AC-3): активный claim артефакта должен существовать и
|
|
253
|
+
* принадлежать пишущему (owner+session; pid писателя ≠ pid захватчика —
|
|
254
|
+
* захват и запись обычно разные процессы). Отказ — UserFacingError с именем
|
|
255
|
+
* владельца и путём claim-файла. */
|
|
256
|
+
export function requireClaim(deps, artifact, who) {
|
|
257
|
+
const path = claimFilePath(deps.root, artifact);
|
|
258
|
+
const { rec } = readClaimFile(path);
|
|
259
|
+
if (!existsSync(path)) {
|
|
260
|
+
throw new UserFacingError(`No claim held for "${artifact}" — acquire it first: wolf claim acquire "${artifact}" (claim file: ${path})`);
|
|
261
|
+
}
|
|
262
|
+
if (rec === null) {
|
|
263
|
+
throw new UserFacingError(`Claim file for "${artifact}" is corrupt — treated as stale; re-acquire: wolf claim acquire "${artifact}" (claim file: ${path})`);
|
|
264
|
+
}
|
|
265
|
+
if (isStale(rec, deps)) {
|
|
266
|
+
throw new UserFacingError(`Claim for "${artifact}" is stale (holder ${rec.owner}) — re-acquire: wolf claim acquire "${artifact}" (claim file: ${path})`);
|
|
267
|
+
}
|
|
268
|
+
// MINOR-1 (ревью T5): переданный claim (transfer: session null, pid 0)
|
|
269
|
+
// доступен адресату с любой его сессией — иначе передача парковала бы
|
|
270
|
+
// запись до TTL. pid-проверка для pid:0 не применяется (pidAlive).
|
|
271
|
+
const transferredToWho = rec.session_id === null && rec.owner === who.owner;
|
|
272
|
+
if (!transferredToWho && (rec.owner !== who.owner || rec.session_id !== who.sessionId)) {
|
|
273
|
+
throw new UserFacingError(`Artifact "${artifact}" is claimed by ${rec.owner} (${describeHolder(rec)}) — claim file: ${path}`);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=claim-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claim-registry.js","sourceRoot":"","sources":["../../../src/adapters/fs/claim-registry.ts"],"names":[],"mappings":"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"}
|