mister-wolf 2.18.2 → 2.18.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -10
- package/README.ru.md +1 -1
- package/dist/adapters/cli/commands/claim.d.ts.map +1 -1
- package/dist/adapters/cli/commands/claim.js +14 -3
- package/dist/adapters/cli/commands/claim.js.map +1 -1
- package/dist/adapters/cli/commands/face.d.ts.map +1 -1
- package/dist/adapters/cli/commands/face.js +15 -0
- package/dist/adapters/cli/commands/face.js.map +1 -1
- package/dist/adapters/fs/claim-registry.d.ts +40 -12
- package/dist/adapters/fs/claim-registry.d.ts.map +1 -1
- package/dist/adapters/fs/claim-registry.js +108 -44
- package/dist/adapters/fs/claim-registry.js.map +1 -1
- package/dist/app/use-cases/build-analytics.d.ts +3 -2
- package/dist/app/use-cases/build-analytics.d.ts.map +1 -1
- package/dist/app/use-cases/build-analytics.js +2 -1
- package/dist/app/use-cases/build-analytics.js.map +1 -1
- package/dist/app/use-cases/claim-artifact.d.ts +8 -2
- package/dist/app/use-cases/claim-artifact.d.ts.map +1 -1
- package/dist/app/use-cases/claim-artifact.js +9 -3
- package/dist/app/use-cases/claim-artifact.js.map +1 -1
- package/dist/app/use-cases/resolve-face.d.ts +37 -0
- package/dist/app/use-cases/resolve-face.d.ts.map +1 -0
- package/dist/app/use-cases/resolve-face.js +24 -0
- package/dist/app/use-cases/resolve-face.js.map +1 -0
- package/package.json +1 -1
- package/templates/.wolf/router.log +1 -1
- package/templates/opencode/plugins/wolf-router.ts +30 -10
package/README.md
CHANGED
|
@@ -168,16 +168,16 @@ Memory scoped to a linked worktree (`worktree:<id>`) is filtered on exactly one
|
|
|
168
168
|
|
|
169
169
|
Self-checking scenarios: `bash scripts/demo/scenario-N.sh`.
|
|
170
170
|
|
|
171
|
-
| # | Scenario
|
|
172
|
-
| --- |
|
|
173
|
-
| 1 | Connecting Wolf to a new project (self-checking, PASS/FAIL points)
|
|
174
|
-
| 2 | The life of a knowledge item: birth, aging (supersede), reading the current one
|
|
175
|
-
| 3 | A new agent = one command (scaffold: playbook + frame + relation)
|
|
176
|
-
| 4 | An owner complaint — a hot-signal into the self-learning loop
|
|
177
|
-
| 5 | A script becomes a resource — the Librarian's tool cycle
|
|
178
|
-
| 6 | Signal log: repeated tool errors land in session metrics (self-learning pipeline removed)
|
|
179
|
-
| 7 | Loop hygiene: memory integrity, attribution, and noise audit
|
|
180
|
-
| 8 | Routing: model from a routing memory object,
|
|
171
|
+
| # | Scenario |
|
|
172
|
+
| --- | ------------------------------------------------------------------------------------------------------------------- |
|
|
173
|
+
| 1 | Connecting Wolf to a new project (self-checking, PASS/FAIL points) |
|
|
174
|
+
| 2 | The life of a knowledge item: birth, aging (supersede), reading the current one |
|
|
175
|
+
| 3 | A new agent = one command (scaffold: playbook + frame + relation) |
|
|
176
|
+
| 4 | An owner complaint — a hot-signal into the self-learning loop |
|
|
177
|
+
| 5 | A script becomes a resource — the Librarian's tool cycle |
|
|
178
|
+
| 6 | Signal log: repeated tool errors land in session metrics (self-learning pipeline removed) |
|
|
179
|
+
| 7 | Loop hygiene: memory integrity, attribution, and noise audit |
|
|
180
|
+
| 8 | Routing: model from a routing memory object, session wrap-up recorded in memory (**one real LLM call, ~30–60 sec**) |
|
|
181
181
|
|
|
182
182
|
## Integrations
|
|
183
183
|
|
package/README.ru.md
CHANGED
|
@@ -197,7 +197,7 @@ wolf tool revive check # deprecated → active
|
|
|
197
197
|
| 5 | Скрипт становится ресурсом — tool-цикл Библиотекаря |
|
|
198
198
|
| 6 | Сигнальный лог: повторяющиеся тул-ошибки попадают в метрики сессий (конвейер самообучения удалён) |
|
|
199
199
|
| 7 | Гигиена контура: целостность памяти, атрибуция, аудит шума |
|
|
200
|
-
| 8 | Роутинг: модель из routing-объекта памяти,
|
|
200
|
+
| 8 | Роутинг: модель из routing-объекта памяти, итоги сессии в памяти проекта (**один реальный LLM-вызов, ~30–60 сек**) |
|
|
201
201
|
|
|
202
202
|
## Интеграции
|
|
203
203
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claim.d.ts","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/claim.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC;;mEAEmE;AAEnE,wBAAgB,YAAY,CAAC,OAAO,GAAE,MAAkB,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"claim.d.ts","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/claim.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC;;mEAEmE;AAEnE,wBAAgB,YAAY,CAAC,OAAO,GAAE,MAAkB,GAAG,OAAO,CAoFjE"}
|
|
@@ -37,10 +37,21 @@ export function claimCommand(baseDir = safeCwd()) {
|
|
|
37
37
|
.command('heartbeat')
|
|
38
38
|
.description('Refresh the claim heartbeat (keeps a long-running claim fresh within the 10-minute window)')
|
|
39
39
|
.argument('<artifact>', 'Artifact id whose claim heartbeat to refresh')
|
|
40
|
-
.
|
|
41
|
-
|
|
40
|
+
.option('--session <id>', 'Assert the claim session (2.18.4): refuse on mismatch')
|
|
41
|
+
.option('--pid <n>', 'Record writer pid in the heartbeat (debug, not auth)', parseInt)
|
|
42
|
+
.option('--claim-token <t>', 'Assert the claim token (2.18.4): refuse after re-acquire')
|
|
43
|
+
.action((artifact, options) => {
|
|
44
|
+
// 2.18.4: флаги включают строгую идентификацию; без них — legacy (только writer)
|
|
45
|
+
const hasFlags = options.session !== undefined || options.pid !== undefined || options.claimToken !== undefined;
|
|
46
|
+
const hb = heartbeatArtifactClaim({ baseDir }, artifact, hasFlags
|
|
47
|
+
? {
|
|
48
|
+
...(options.session !== undefined ? { sessionId: options.session } : {}),
|
|
49
|
+
...(options.pid !== undefined ? { pid: options.pid } : {}),
|
|
50
|
+
...(options.claimToken !== undefined ? { claimToken: options.claimToken } : {}),
|
|
51
|
+
}
|
|
52
|
+
: undefined);
|
|
42
53
|
console.log(`Heartbeat written: ${artifact} at ${hb.written_at} (writer ${hb.writer})`);
|
|
43
|
-
console.log(`heartbeat file: ${heartbeatFilePath(resolveMemoryRoot(baseDir).root, artifact)}`);
|
|
54
|
+
console.log(`heartbeat file: ${heartbeatFilePath(resolveMemoryRoot(baseDir).root, artifact, hb.claim_token)}`);
|
|
44
55
|
});
|
|
45
56
|
cmd
|
|
46
57
|
.command('release')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claim.js","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/claim.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D;;mEAEmE;AAEnE,MAAM,UAAU,YAAY,CAAC,UAAkB,OAAO,EAAE;IACtD,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAC1C,mFAAmF,CACpF,CAAC;IAEF,GAAG;SACA,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,8EAA8E,CAAC;SAC3F,QAAQ,CAAC,YAAY,EAAE,+DAA+D,CAAC;SACvF,MAAM,CAAC,CAAC,QAAgB,EAAE,EAAE;QAC3B,IAAI,CAAC;YACH,wEAAwE;YACxE,oEAAoE;YACpE,qEAAqE;YACrE,mEAAmE;YACnE,sEAAsE;YACtE,MAAM,GAAG,GAAG,oBAAoB,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,KAAK,aAAa,GAAG,CAAC,UAAU,IAAI,GAAG,SAAS,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;YACrF,OAAO,CAAC,GAAG,CAAC,eAAe,aAAa,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QACzF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;gBAClC,MAAM,IAAI,eAAe,CAAC,yBAAyB,GAAG,CAAC,KAAK,MAAM,GAAG,CAAC,SAAS,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;YACrG,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,4FAA4F,CAAC;SACzG,QAAQ,CAAC,YAAY,EAAE,8CAA8C,CAAC;SACtE,MAAM,CAAC,CAAC,QAAgB,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"claim.js","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/claim.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"face.d.ts","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/face.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"face.d.ts","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/face.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AA+E5C,wBAAgB,WAAW,CAAC,OAAO,GAAE,MAAkB,GAAG,OAAO,CA0OhE"}
|
|
@@ -5,6 +5,7 @@ import { safeCwd } from '../cli-entry.js';
|
|
|
5
5
|
import { createFaceVersion } from '../../../app/use-cases/create-face-version.js';
|
|
6
6
|
import { abortFaceOperation, resumeFaceOperation } from '../../../app/use-cases/face-operation.js';
|
|
7
7
|
import { migrateFaces } from '../../../app/use-cases/migrate-faces.js';
|
|
8
|
+
import { resolveFace } from '../../../app/use-cases/resolve-face.js';
|
|
8
9
|
import { createCliContainer } from '../../../bootstrap/container.js';
|
|
9
10
|
import { UserFacingError } from '../../../domain/errors.js';
|
|
10
11
|
/** Волна 2.17 T-04 (design §«CLI: проектируемые команды», REQ-03/04/05/07/10):
|
|
@@ -222,6 +223,20 @@ export function faceCommand(baseDir = safeCwd()) {
|
|
|
222
223
|
console.log('---');
|
|
223
224
|
console.log(active.body ?? '');
|
|
224
225
|
});
|
|
226
|
+
// 2.18.4: канонический резолвер лица — машинный канал доставки (wolf-router
|
|
227
|
+
// плагин). Строгий отказ (exit 1) при нуле/конфликте активных лиц — плагин
|
|
228
|
+
// переходит на legacy-путь, диагностику конфликта ловит wolf doctor.
|
|
229
|
+
createdByTrap(cmd
|
|
230
|
+
.command('resolve')
|
|
231
|
+
.description('Resolve the canonical active face for an agent (JSON: {ok, face|error}; exit 1 on miss/conflict)')
|
|
232
|
+
.argument('<owner_skill>', 'Agent id or skill (owner_skill)')).action(async (ownerSkill, options) => {
|
|
233
|
+
denyCreatedBy(options);
|
|
234
|
+
const { store } = createCliContainer(baseDir);
|
|
235
|
+
const result = await resolveFace(store, ownerSkill);
|
|
236
|
+
if (!result.ok)
|
|
237
|
+
process.exitCode = 1;
|
|
238
|
+
console.log(JSON.stringify(result));
|
|
239
|
+
});
|
|
225
240
|
return cmd;
|
|
226
241
|
}
|
|
227
242
|
//# sourceMappingURL=face.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"face.js","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/face.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"face.js","sourceRoot":"","sources":["../../../../src/adapters/cli/commands/face.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,10 +22,12 @@ export interface ClaimRecord {
|
|
|
22
22
|
cwd: string;
|
|
23
23
|
/** ISO-время захвата. */
|
|
24
24
|
acquired_at: string;
|
|
25
|
+
/** 2.18.3: уникальный токен владения claim'ом для per-token изоляции heartbeat. */
|
|
26
|
+
claim_token?: string;
|
|
25
27
|
}
|
|
26
|
-
/** Heartbeat-запись (2.18.0 REQ-03, design §3.3; 2.18.2 F-01):
|
|
27
|
-
* держателем долгой операции; writer — для отладки, не auth;
|
|
28
|
-
*
|
|
28
|
+
/** Heartbeat-запись (2.18.0 REQ-03, design §3.3; 2.18.2 F-01; 2.18.3 per-token isolation):
|
|
29
|
+
* продление свежести держателем долгой операции; writer — для отладки, не auth;
|
|
30
|
+
* claim_acquired_at и claim_token привязывают heartbeat к конкретному владению claim'ом. */
|
|
29
31
|
export interface HeartbeatRecord {
|
|
30
32
|
/** ISO-время последнего heartbeat. */
|
|
31
33
|
written_at: string;
|
|
@@ -33,6 +35,22 @@ export interface HeartbeatRecord {
|
|
|
33
35
|
writer: string;
|
|
34
36
|
/** ISO-время захвата claim, к которому привязан heartbeat (F-01). */
|
|
35
37
|
claim_acquired_at?: string;
|
|
38
|
+
/** Уникальный токен владения claim'ом (2.18.3). */
|
|
39
|
+
claim_token?: string;
|
|
40
|
+
/** 2.18.4: полный идентификатор сессии писателя (null — переданное владение). */
|
|
41
|
+
session_id?: string | null;
|
|
42
|
+
/** 2.18.4: pid писателя (для отладки, не auth). */
|
|
43
|
+
pid?: number;
|
|
44
|
+
}
|
|
45
|
+
/** 2.18.4: полная идентичность писателя heartbeat. Проверяются только переданные
|
|
46
|
+
* поля: owner — всегда; sessionId (null трактуется строго: claim тоже без сессии —
|
|
47
|
+
* переданное владение) и claimToken — только если определены. Непереданные поля —
|
|
48
|
+
* legacy-поведение (только writer). */
|
|
49
|
+
export interface HeartbeatIdentity {
|
|
50
|
+
owner: string;
|
|
51
|
+
sessionId?: string | null;
|
|
52
|
+
pid?: number;
|
|
53
|
+
claimToken?: string;
|
|
36
54
|
}
|
|
37
55
|
export type HeartbeatReadResult = HeartbeatRecord | {
|
|
38
56
|
corrupt: true;
|
|
@@ -66,24 +84,34 @@ export declare function claimSlug(artifact: string): string;
|
|
|
66
84
|
export declare function claimFilePath(root: string, artifact: string): string;
|
|
67
85
|
/** След перехвата: `<slug>.<epochMs>.json` (исходные байты сохраняются, NFR-02). */
|
|
68
86
|
export declare function claimTrailPath(root: string, artifact: string, epochMs: number): string;
|
|
69
|
-
/** Путь heartbeat-файла артефакта (2.18.0 REQ-03
|
|
70
|
-
|
|
71
|
-
|
|
87
|
+
/** Путь heartbeat-файла артефакта (2.18.0 REQ-03; 2.18.3 per-token isolation):
|
|
88
|
+
* если передан token: `<slug>.<claim_token>.heartbeat`, иначе fallback на `<slug>.heartbeat`. */
|
|
89
|
+
export declare function heartbeatFilePath(root: string, artifact: string, token?: string): string;
|
|
90
|
+
/** Токен claim'а: явный claim_token или fallback на acquired_at (legacy-совместимость). */
|
|
91
|
+
export declare function claimTokenOf(rec: ClaimRecord): string;
|
|
92
|
+
/** Удаление heartbeat-файлов артефакта: per-token (если указан) и legacy. */
|
|
93
|
+
export declare function removeHeartbeatFiles(root: string, artifact: string, token?: string): void;
|
|
94
|
+
/** Чтение heartbeat для конкретного claim (2.18.3): сначала per-token файл, затем fallback на legacy. */
|
|
95
|
+
export declare function readClaimHeartbeat(root: string, artifact: string, rec?: ClaimRecord | null): HeartbeatReadResult;
|
|
96
|
+
/** Чтение heartbeat (F-01; 2.18.3): null при отсутствии файла (ENOENT); { corrupt: true }
|
|
72
97
|
* при повреждённом файле/JSON; HeartbeatRecord при валидном JSON. */
|
|
73
98
|
export declare function readHeartbeat(path: string): HeartbeatReadResult;
|
|
74
|
-
/** Запись heartbeat (REQ-03, ADR-7; 2.18.2 F-01
|
|
75
|
-
*
|
|
76
|
-
*
|
|
99
|
+
/** Запись heartbeat (REQ-03, ADR-7; 2.18.2 F-01; 2.18.3 per-token isolation; 2.18.4
|
|
100
|
+
* полная идентификация): атомарная замена — уникальный tmp (wx) + rename поверх
|
|
101
|
+
* per-token heartbeat-файла. Проверяет, что claim существует, активен и принадлежит
|
|
102
|
+
* писателю (owner обязателен; sessionId/claimToken — при передаче в identity).
|
|
103
|
+
* Привязывает heartbeat к rec.acquired_at и rec.claim_token. */
|
|
77
104
|
export declare function writeHeartbeat(deps: ClaimRegistryDeps, input: {
|
|
78
105
|
artifact: string;
|
|
79
106
|
writer: string;
|
|
107
|
+
identity?: HeartbeatIdentity;
|
|
80
108
|
}): HeartbeatRecord;
|
|
81
109
|
/** Прод-liveness: signal 0; ESRCH — мёртв, EPERM — жив (чужой user). pid<=0 —
|
|
82
110
|
* неизвестен (переданный claim) — считаем живым, пока не истечёт TTL. */
|
|
83
111
|
export declare function pidAlive(pid: number): boolean;
|
|
84
|
-
/** Stale (design §3.3; 2.18.2 F-01): мёртвый PID ИЛИ
|
|
85
|
-
* старше окна/повреждён); нет heartbeat → правила 2.17.1 (NFR-03).
|
|
86
|
-
* Если heartbeat привязан к чужому claim_acquired_at — игнорируется. */
|
|
112
|
+
/** Stale (design §3.3; 2.18.2 F-01; 2.18.3 per-token isolation): мёртвый PID ИЛИ
|
|
113
|
+
* возраст > TTL ИЛИ (heartbeat есть и старше окна/повреждён); нет heartbeat → правила 2.17.1 (NFR-03).
|
|
114
|
+
* Если heartbeat привязан к чужому claim_acquired_at или чужому claim_token — игнорируется. */
|
|
87
115
|
export declare function isStale(rec: ClaimRecord | null, hb: HeartbeatReadResult, deps: ClaimRegistryDeps): boolean;
|
|
88
116
|
/** Атомарный захват (REQ-05 AC-1): wx-create; занято и fresh — ClaimHeldError
|
|
89
117
|
* с идентификатором владельца; stale/порченый — перехват со следом. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claim-registry.d.ts","sourceRoot":"","sources":["../../../src/adapters/fs/claim-registry.ts"],"names":[],"mappings":"AAgBA;;;;;;;;GAQG;AAEH,2EAA2E;AAC3E,eAAO,MAAM,YAAY,QAAsB,CAAC;AAEhD;8EAC8E;AAC9E,eAAO,MAAM,yBAAyB,QAAiB,CAAC;AAExD,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;
|
|
1
|
+
{"version":3,"file":"claim-registry.d.ts","sourceRoot":"","sources":["../../../src/adapters/fs/claim-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -42,11 +42,55 @@ export function claimFilePath(root, artifact) {
|
|
|
42
42
|
export function claimTrailPath(root, artifact, epochMs) {
|
|
43
43
|
return join(claimsDir(root), `${claimSlug(artifact)}.${epochMs}.json`);
|
|
44
44
|
}
|
|
45
|
-
/** Путь heartbeat-файла артефакта (2.18.0 REQ-03
|
|
46
|
-
|
|
45
|
+
/** Путь heartbeat-файла артефакта (2.18.0 REQ-03; 2.18.3 per-token isolation):
|
|
46
|
+
* если передан token: `<slug>.<claim_token>.heartbeat`, иначе fallback на `<slug>.heartbeat`. */
|
|
47
|
+
export function heartbeatFilePath(root, artifact, token) {
|
|
48
|
+
if (token) {
|
|
49
|
+
return join(claimsDir(root), `${claimSlug(artifact)}.${token}.heartbeat`);
|
|
50
|
+
}
|
|
47
51
|
return join(claimsDir(root), `${claimSlug(artifact)}.heartbeat`);
|
|
48
52
|
}
|
|
49
|
-
/**
|
|
53
|
+
/** Токен claim'а: явный claim_token или fallback на acquired_at (legacy-совместимость). */
|
|
54
|
+
export function claimTokenOf(rec) {
|
|
55
|
+
return rec.claim_token ?? rec.acquired_at;
|
|
56
|
+
}
|
|
57
|
+
/** Удаление heartbeat-файлов артефакта: per-token (если указан) и legacy. */
|
|
58
|
+
export function removeHeartbeatFiles(root, artifact, token) {
|
|
59
|
+
if (token) {
|
|
60
|
+
try {
|
|
61
|
+
const p = heartbeatFilePath(root, artifact, token);
|
|
62
|
+
if (existsSync(p))
|
|
63
|
+
unlinkSync(p);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
/* ignore */
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
const legacy = heartbeatFilePath(root, artifact);
|
|
71
|
+
if (existsSync(legacy))
|
|
72
|
+
unlinkSync(legacy);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
/* ignore */
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/** Чтение heartbeat для конкретного claim (2.18.3): сначала per-token файл, затем fallback на legacy. */
|
|
79
|
+
export function readClaimHeartbeat(root, artifact, rec) {
|
|
80
|
+
if (rec) {
|
|
81
|
+
const token = claimTokenOf(rec);
|
|
82
|
+
const tokenPath = heartbeatFilePath(root, artifact, token);
|
|
83
|
+
if (existsSync(tokenPath)) {
|
|
84
|
+
return readHeartbeat(tokenPath);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const legacyPath = heartbeatFilePath(root, artifact);
|
|
88
|
+
if (existsSync(legacyPath)) {
|
|
89
|
+
return readHeartbeat(legacyPath);
|
|
90
|
+
}
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
/** Чтение heartbeat (F-01; 2.18.3): null при отсутствии файла (ENOENT); { corrupt: true }
|
|
50
94
|
* при повреждённом файле/JSON; HeartbeatRecord при валидном JSON. */
|
|
51
95
|
export function readHeartbeat(path) {
|
|
52
96
|
let raw;
|
|
@@ -65,42 +109,71 @@ export function readHeartbeat(path) {
|
|
|
65
109
|
written_at: d.written_at,
|
|
66
110
|
writer: d.writer,
|
|
67
111
|
...(typeof d.claim_acquired_at === 'string' ? { claim_acquired_at: d.claim_acquired_at } : {}),
|
|
112
|
+
...(typeof d.claim_token === 'string' ? { claim_token: d.claim_token } : {}),
|
|
113
|
+
...(typeof d.session_id === 'string'
|
|
114
|
+
? { session_id: d.session_id }
|
|
115
|
+
: d.session_id === null
|
|
116
|
+
? { session_id: null }
|
|
117
|
+
: {}),
|
|
118
|
+
...(typeof d.pid === 'number' ? { pid: d.pid } : {}),
|
|
68
119
|
};
|
|
69
120
|
}
|
|
70
121
|
catch {
|
|
71
122
|
return { corrupt: true };
|
|
72
123
|
}
|
|
73
124
|
}
|
|
74
|
-
/** Запись heartbeat (REQ-03, ADR-7; 2.18.2 F-01
|
|
75
|
-
*
|
|
76
|
-
*
|
|
125
|
+
/** Запись heartbeat (REQ-03, ADR-7; 2.18.2 F-01; 2.18.3 per-token isolation; 2.18.4
|
|
126
|
+
* полная идентификация): атомарная замена — уникальный tmp (wx) + rename поверх
|
|
127
|
+
* per-token heartbeat-файла. Проверяет, что claim существует, активен и принадлежит
|
|
128
|
+
* писателю (owner обязателен; sessionId/claimToken — при передаче в identity).
|
|
129
|
+
* Привязывает heartbeat к rec.acquired_at и rec.claim_token. */
|
|
77
130
|
export function writeHeartbeat(deps, input) {
|
|
78
131
|
const cPath = claimFilePath(deps.root, input.artifact);
|
|
79
132
|
const { rec } = readClaimFile(cPath);
|
|
80
133
|
if (!existsSync(cPath) || rec === null) {
|
|
81
134
|
throw new UserFacingError(`No claim held for "${input.artifact}" — acquire it first before heartbeat (claim file: ${cPath})`);
|
|
82
135
|
}
|
|
83
|
-
if (isStale(rec,
|
|
136
|
+
if (isStale(rec, readClaimHeartbeat(deps.root, input.artifact, rec), deps)) {
|
|
84
137
|
throw new UserFacingError(`Claim for "${input.artifact}" is stale — cannot heartbeat (claim file: ${cPath})`);
|
|
85
138
|
}
|
|
86
|
-
if (
|
|
139
|
+
if (input.identity) {
|
|
140
|
+
const id = input.identity;
|
|
141
|
+
if (rec.owner !== id.owner) {
|
|
142
|
+
throw new UserFacingError(`Claim for "${input.artifact}" is owned by ${rec.owner}, not ${id.owner} (claim file: ${cPath})`);
|
|
143
|
+
}
|
|
144
|
+
// 2.18.4: сессия — строгое совпадение; оба null — переданное владение (легально)
|
|
145
|
+
if (id.sessionId !== undefined && rec.session_id !== id.sessionId) {
|
|
146
|
+
throw new UserFacingError(`Claim for "${input.artifact}" is held by ${rec.owner} (session ${rec.session_id ?? '-'}) — ` +
|
|
147
|
+
`heartbeat session '${id.sessionId ?? '-'}' does not match (claim file: ${cPath})`);
|
|
148
|
+
}
|
|
149
|
+
// 2.18.4: токен — защита от heartbeat'а прежнего владения после перезахвата
|
|
150
|
+
if (id.claimToken !== undefined && id.claimToken !== rec.claim_token) {
|
|
151
|
+
throw new UserFacingError(`Claim for "${input.artifact}" was re-acquired by ${rec.owner} — ` +
|
|
152
|
+
`claim_token does not match the current claim (claim file: ${cPath})`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
else if (rec.owner !== input.writer) {
|
|
87
156
|
throw new UserFacingError(`Claim for "${input.artifact}" is owned by ${rec.owner}, not ${input.writer} (claim file: ${cPath})`);
|
|
88
157
|
}
|
|
89
158
|
const dir = claimsDir(deps.root);
|
|
90
159
|
mkdirSync(dir, { recursive: true });
|
|
91
160
|
const now = (deps.now ?? (() => new Date()))();
|
|
161
|
+
const token = claimTokenOf(rec);
|
|
92
162
|
const record = {
|
|
93
163
|
written_at: now.toISOString(),
|
|
94
164
|
writer: input.writer,
|
|
95
165
|
claim_acquired_at: rec.acquired_at,
|
|
166
|
+
claim_token: token,
|
|
167
|
+
...(input.identity && input.identity.sessionId !== undefined ? { session_id: input.identity.sessionId } : {}),
|
|
168
|
+
...(input.identity?.pid !== undefined ? { pid: input.identity.pid } : {}),
|
|
96
169
|
};
|
|
97
170
|
const tag = `${process.hrtime.bigint().toString(36)}.${Math.random().toString(36).slice(2, 10)}`;
|
|
98
|
-
const tmp = join(dir, `${claimSlug(input.artifact)}.heartbeat.${tag}.tmp`);
|
|
171
|
+
const tmp = join(dir, `${claimSlug(input.artifact)}.${token}.heartbeat.${tag}.tmp`);
|
|
99
172
|
const fd = openSync(tmp, 'wx');
|
|
100
173
|
writeFileSync(fd, JSON.stringify(record), 'utf-8');
|
|
101
174
|
closeSync(fd);
|
|
102
175
|
try {
|
|
103
|
-
renameSync(tmp, heartbeatFilePath(deps.root, input.artifact));
|
|
176
|
+
renameSync(tmp, heartbeatFilePath(deps.root, input.artifact, token));
|
|
104
177
|
}
|
|
105
178
|
catch (e) {
|
|
106
179
|
try {
|
|
@@ -142,15 +215,16 @@ function parseClaim(raw) {
|
|
|
142
215
|
pid: typeof d.pid === 'number' ? d.pid : 0,
|
|
143
216
|
cwd: typeof d.cwd === 'string' ? d.cwd : '',
|
|
144
217
|
acquired_at: typeof d.acquired_at === 'string' ? d.acquired_at : '',
|
|
218
|
+
claim_token: typeof d.claim_token === 'string' ? d.claim_token : undefined,
|
|
145
219
|
};
|
|
146
220
|
}
|
|
147
221
|
catch {
|
|
148
222
|
return null;
|
|
149
223
|
}
|
|
150
224
|
}
|
|
151
|
-
/** Stale (design §3.3; 2.18.2 F-01): мёртвый PID ИЛИ
|
|
152
|
-
* старше окна/повреждён); нет heartbeat → правила 2.17.1 (NFR-03).
|
|
153
|
-
* Если heartbeat привязан к чужому claim_acquired_at — игнорируется. */
|
|
225
|
+
/** Stale (design §3.3; 2.18.2 F-01; 2.18.3 per-token isolation): мёртвый PID ИЛИ
|
|
226
|
+
* возраст > TTL ИЛИ (heartbeat есть и старше окна/повреждён); нет heartbeat → правила 2.17.1 (NFR-03).
|
|
227
|
+
* Если heartbeat привязан к чужому claim_acquired_at или чужому claim_token — игнорируется. */
|
|
154
228
|
export function isStale(rec, hb, deps) {
|
|
155
229
|
if (rec === null)
|
|
156
230
|
return true;
|
|
@@ -167,6 +241,10 @@ export function isStale(rec, hb, deps) {
|
|
|
167
241
|
if ('corrupt' in hb && hb.corrupt)
|
|
168
242
|
return true;
|
|
169
243
|
const hbRec = hb;
|
|
244
|
+
// 2.18.3: если heartbeat от другого claim_token — игнорируем его
|
|
245
|
+
if (hbRec.claim_token && rec.claim_token && hbRec.claim_token !== rec.claim_token) {
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
170
248
|
// F-01: если heartbeat от предыдущего владения (acquired_at не совпадает), игнорируем его
|
|
171
249
|
if (hbRec.claim_acquired_at && hbRec.claim_acquired_at !== rec.acquired_at) {
|
|
172
250
|
return false;
|
|
@@ -198,6 +276,9 @@ export function acquireClaim(deps, input) {
|
|
|
198
276
|
mkdirSync(dir, { recursive: true });
|
|
199
277
|
const path = claimFilePath(deps.root, input.artifact);
|
|
200
278
|
const now = deps.now ?? (() => new Date());
|
|
279
|
+
const epoch = now().getTime();
|
|
280
|
+
const randomTag = `${process.hrtime.bigint().toString(36)}.${Math.random().toString(36).slice(2, 10)}`;
|
|
281
|
+
const claim_token = `${epoch}.${randomTag}`;
|
|
201
282
|
const record = {
|
|
202
283
|
artifact: input.artifact,
|
|
203
284
|
owner: input.identity.owner,
|
|
@@ -205,20 +286,14 @@ export function acquireClaim(deps, input) {
|
|
|
205
286
|
pid: input.identity.pid,
|
|
206
287
|
cwd: input.cwd,
|
|
207
288
|
acquired_at: now().toISOString(),
|
|
289
|
+
claim_token,
|
|
208
290
|
};
|
|
209
291
|
for (let attempt = 0;; attempt++) {
|
|
210
292
|
try {
|
|
211
293
|
const fd = openSync(path, 'wx');
|
|
212
294
|
writeFileSync(fd, JSON.stringify(record), 'utf-8');
|
|
213
295
|
closeSync(fd);
|
|
214
|
-
|
|
215
|
-
const hbPath = heartbeatFilePath(deps.root, input.artifact);
|
|
216
|
-
if (existsSync(hbPath))
|
|
217
|
-
unlinkSync(hbPath);
|
|
218
|
-
}
|
|
219
|
-
catch {
|
|
220
|
-
/* ignore */
|
|
221
|
-
}
|
|
296
|
+
removeHeartbeatFiles(deps.root, input.artifact);
|
|
222
297
|
return record;
|
|
223
298
|
}
|
|
224
299
|
catch (e) {
|
|
@@ -236,19 +311,19 @@ export function acquireClaim(deps, input) {
|
|
|
236
311
|
(deps.wait ?? sleepMs)(10);
|
|
237
312
|
continue;
|
|
238
313
|
}
|
|
239
|
-
if (rec !== null && !isStale(rec,
|
|
314
|
+
if (rec !== null && !isStale(rec, readClaimHeartbeat(deps.root, input.artifact, rec), deps)) {
|
|
240
315
|
throw new ClaimHeldError(path, rec.owner, describeHolder(rec));
|
|
241
316
|
}
|
|
242
317
|
// stale/порченый (rec === null, сырые байты могли быть) → перехват со следом;
|
|
243
318
|
// проигранная гонка перехвата (ENOENT на link/unlink) — повтор захвата
|
|
244
319
|
try {
|
|
245
|
-
const
|
|
320
|
+
const epochMs = now().getTime();
|
|
246
321
|
// FIX-4 (MINOR-4, ревью T5): след — через linkSync (excl-семантика):
|
|
247
322
|
// exists+rename TOCTOU позволял двум перехватчикам одной мс перезаписать
|
|
248
323
|
// чужой след (потеря байтов, NFR-02); при EEXIST — bump эпохи до свободного
|
|
249
324
|
let preserved = null;
|
|
250
325
|
for (let bump = 0; bump < 50 && preserved === null; bump++) {
|
|
251
|
-
const trail = claimTrailPath(deps.root, input.artifact,
|
|
326
|
+
const trail = claimTrailPath(deps.root, input.artifact, epochMs + bump);
|
|
252
327
|
try {
|
|
253
328
|
linkSync(path, trail);
|
|
254
329
|
preserved = trail;
|
|
@@ -268,12 +343,7 @@ export function acquireClaim(deps, input) {
|
|
|
268
343
|
else if (statSync(path).ino === statSync(preserved).ino) {
|
|
269
344
|
// unlink только сохранённый inode: конкурент мог уже пересоздать claim
|
|
270
345
|
unlinkSync(path);
|
|
271
|
-
|
|
272
|
-
unlinkSync(heartbeatFilePath(deps.root, input.artifact));
|
|
273
|
-
}
|
|
274
|
-
catch {
|
|
275
|
-
/* ignore */
|
|
276
|
-
}
|
|
346
|
+
removeHeartbeatFiles(deps.root, input.artifact, rec ? claimTokenOf(rec) : undefined);
|
|
277
347
|
}
|
|
278
348
|
}
|
|
279
349
|
}
|
|
@@ -304,7 +374,7 @@ export function releaseClaim(deps, input) {
|
|
|
304
374
|
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})`);
|
|
305
375
|
}
|
|
306
376
|
const fullMatch = ownerSessionMatch(rec, input.identity) && rec.pid === input.identity.pid;
|
|
307
|
-
const pidReleasable = rec.pid <= 0 || isStale(rec,
|
|
377
|
+
const pidReleasable = rec.pid <= 0 || isStale(rec, readClaimHeartbeat(deps.root, input.artifact, rec), deps);
|
|
308
378
|
// MINOR-1b (интегральное ревью 2.17.1): зеркально requireClaim — адресат
|
|
309
379
|
// transfer (session null + owner) освобождает своей сессией, иначе передача
|
|
310
380
|
// паркует release до TTL
|
|
@@ -314,6 +384,9 @@ export function releaseClaim(deps, input) {
|
|
|
314
384
|
}
|
|
315
385
|
if (input.transferTo !== undefined) {
|
|
316
386
|
const now = (deps.now ?? (() => new Date()))();
|
|
387
|
+
const epoch = now.getTime();
|
|
388
|
+
const randomTag = `${process.hrtime.bigint().toString(36)}.${Math.random().toString(36).slice(2, 10)}`;
|
|
389
|
+
const transferredToken = `${epoch}.${randomTag}`;
|
|
317
390
|
const transferred = {
|
|
318
391
|
artifact: rec.artifact,
|
|
319
392
|
owner: input.transferTo,
|
|
@@ -322,23 +395,14 @@ export function releaseClaim(deps, input) {
|
|
|
322
395
|
pid: 0,
|
|
323
396
|
cwd: rec.cwd,
|
|
324
397
|
acquired_at: now.toISOString(),
|
|
398
|
+
claim_token: transferredToken,
|
|
325
399
|
};
|
|
326
400
|
writeFileSync(path, JSON.stringify(transferred), 'utf-8');
|
|
327
|
-
|
|
328
|
-
unlinkSync(heartbeatFilePath(deps.root, input.artifact));
|
|
329
|
-
}
|
|
330
|
-
catch {
|
|
331
|
-
/* ignore */
|
|
332
|
-
}
|
|
401
|
+
removeHeartbeatFiles(deps.root, input.artifact, claimTokenOf(rec));
|
|
333
402
|
return { action: 'transferred', owner: input.transferTo };
|
|
334
403
|
}
|
|
335
404
|
unlinkSync(path);
|
|
336
|
-
|
|
337
|
-
unlinkSync(heartbeatFilePath(deps.root, input.artifact));
|
|
338
|
-
}
|
|
339
|
-
catch {
|
|
340
|
-
/* ignore */
|
|
341
|
-
}
|
|
405
|
+
removeHeartbeatFiles(deps.root, input.artifact, claimTokenOf(rec));
|
|
342
406
|
return { action: 'released', owner: rec.owner };
|
|
343
407
|
}
|
|
344
408
|
/** Реестр для наблюдаемости (REQ-05 AC-2): кто/когда/что из файлов; следы
|
|
@@ -381,7 +445,7 @@ export function requireClaim(deps, artifact, who) {
|
|
|
381
445
|
if (rec === null) {
|
|
382
446
|
throw new UserFacingError(`Claim file for "${artifact}" is corrupt — treated as stale; re-acquire: wolf claim acquire "${artifact}" (claim file: ${path})`);
|
|
383
447
|
}
|
|
384
|
-
if (isStale(rec,
|
|
448
|
+
if (isStale(rec, readClaimHeartbeat(deps.root, artifact, rec), deps)) {
|
|
385
449
|
throw new UserFacingError(`Claim for "${artifact}" is stale (holder ${rec.owner}) — re-acquire: wolf claim acquire "${artifact}" (claim file: ${path})`);
|
|
386
450
|
}
|
|
387
451
|
// MINOR-1 (ревью T5): переданный claim (transfer: session null, pid 0)
|