@veewo/claw-core 0.2.3 → 0.2.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.
@@ -0,0 +1,586 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { findTaskDirectory } from "./context.js";
5
+ import { ClawError } from "./errors.js";
6
+ import { readJsonFile, serializeJsonFile, withSerializedAccess, withSerializedQueue, writeJsonFileAtomic, } from "./io.js";
7
+ import { ensureInsideDir, normalizePlanFile } from "./paths.js";
8
+ const MISSING_RESOURCE_HASH = createHash("sha256").update("<missing>").digest("hex");
9
+ export class ProjectFocusSessionStore {
10
+ project;
11
+ constructor(project) {
12
+ this.project = project;
13
+ }
14
+ read(sessionKeyHash) {
15
+ const recordPath = this.resourcePath(sessionKeyHash);
16
+ if (!fs.existsSync(recordPath)) {
17
+ return {
18
+ schemaVersion: 1,
19
+ sessionKeyHash,
20
+ updatedAt: new Date(0).toISOString(),
21
+ };
22
+ }
23
+ const record = readJsonFile(recordPath);
24
+ if (record.schemaVersion !== 1 || record.sessionKeyHash !== sessionKeyHash) {
25
+ throw new ClawError("PLAN_TRANSITION_CONFLICT", `Invalid focus session record: ${recordPath}`);
26
+ }
27
+ return record;
28
+ }
29
+ buildPersistedRecord(sessionKeyHash, record) {
30
+ if (record.sessionKeyHash !== sessionKeyHash) {
31
+ throw new ClawError("PLAN_TRANSITION_CONFLICT", "Focus session record key mismatch.");
32
+ }
33
+ return record;
34
+ }
35
+ writePersistedAtomic(sessionKeyHash, persistedRecord) {
36
+ const record = persistedRecord;
37
+ if (record.sessionKeyHash !== sessionKeyHash) {
38
+ throw new ClawError("PLAN_TRANSITION_CONFLICT", "Focus session record key mismatch.");
39
+ }
40
+ writeJsonFileAtomic(this.resourcePath(sessionKeyHash), record);
41
+ }
42
+ queuePath(sessionKeyHash) {
43
+ return `${this.resourcePath(sessionKeyHash)}.queue.json`;
44
+ }
45
+ resourcePath(sessionKeyHash) {
46
+ return path.join(focusTransitionsDirectory(this.project), "sessions", `${sessionKeyHash}.json`);
47
+ }
48
+ }
49
+ export function createPlanRef(project, taskName, planFile = "plan.json") {
50
+ return {
51
+ projectRoot: path.resolve(project.projectRoot),
52
+ taskName,
53
+ planFile: normalizePlanFile(planFile),
54
+ };
55
+ }
56
+ export function focusSessionKeyHash(sessionKey) {
57
+ const normalized = sessionKey.trim();
58
+ if (!normalized) {
59
+ throw new ClawError("CURRENT_PLAN_REQUIRED", "A non-empty session key is required for current-plan focus.");
60
+ }
61
+ return createHash("sha256").update(normalized).digest("hex");
62
+ }
63
+ export function focusTransitionsDirectory(project) {
64
+ return path.join(project.clawDir, "runtime", "focus-transitions");
65
+ }
66
+ export function focusQueuePath(project) {
67
+ return path.join(focusTransitionsDirectory(project), "queue.json");
68
+ }
69
+ export function focusOwnersPath(project) {
70
+ return path.join(focusTransitionsDirectory(project), "owners.json");
71
+ }
72
+ export function readFocusedPlan(project, sessionKey, sessionStore = new ProjectFocusSessionStore(project)) {
73
+ return sessionStore.read(focusSessionKeyHash(sessionKey)).currentPlan;
74
+ }
75
+ export function readPlanFocusOwner(project, ref) {
76
+ return readOwnerRegistry(project).owners[planIdentityHash(project, ref)];
77
+ }
78
+ export async function leaveCurrentPlan(input) {
79
+ const sessionStore = input.sessionStore ?? new ProjectFocusSessionStore(input.project);
80
+ const sessionKeyHash = focusSessionKeyHash(input.sessionKey);
81
+ const currentPlan = sessionStore.read(sessionKeyHash).currentPlan;
82
+ if (!currentPlan) {
83
+ throw new ClawError("CURRENT_PLAN_REQUIRED", "The session has no current plan. Resume a plan explicitly or create a new plan.");
84
+ }
85
+ return commitFocusTransition({
86
+ project: input.project,
87
+ sessionKeyHash,
88
+ kind: "leave",
89
+ sessionStore,
90
+ involvedRefs: [currentPlan],
91
+ testHooks: input.testHooks,
92
+ buildAfter: ({ plans }) => {
93
+ const current = requirePlan(plans, input.project, currentPlan);
94
+ const left = structuredClone(current);
95
+ left.status = "end.leave";
96
+ left.leaveReason = input.reason ?? "manual_leave";
97
+ delete left.completedAt;
98
+ left.updatedAt = new Date().toISOString();
99
+ return {
100
+ currentPlan: undefined,
101
+ plans: [{ ref: currentPlan, content: left }],
102
+ };
103
+ },
104
+ });
105
+ }
106
+ export async function releaseCurrentPlanFocus(input) {
107
+ const sessionStore = input.sessionStore ?? new ProjectFocusSessionStore(input.project);
108
+ const sessionKeyHash = focusSessionKeyHash(input.sessionKey);
109
+ const currentPlan = sessionStore.read(sessionKeyHash).currentPlan;
110
+ if (!currentPlan) {
111
+ return { changed: false, enteredEndPlans: [] };
112
+ }
113
+ return commitFocusTransition({
114
+ project: input.project,
115
+ sessionKeyHash,
116
+ kind: input.kind ?? "end",
117
+ sessionStore,
118
+ involvedRefs: [currentPlan],
119
+ testHooks: input.testHooks,
120
+ buildAfter: ({ plans }) => {
121
+ const current = structuredClone(requirePlan(plans, input.project, currentPlan));
122
+ if (input.expectedEnd && !current.status.startsWith("end.")) {
123
+ throw new ClawError("PLAN_TRANSITION_CONFLICT", "Current-plan focus can only be released by an end transition after the plan entered end.*.", { currentPlan, status: current.status });
124
+ }
125
+ return {
126
+ currentPlan: undefined,
127
+ plans: [{ ref: currentPlan, content: current }],
128
+ };
129
+ },
130
+ });
131
+ }
132
+ export async function activatePlan(input) {
133
+ const sessionStore = input.sessionStore ?? new ProjectFocusSessionStore(input.project);
134
+ const sessionKeyHash = focusSessionKeyHash(input.sessionKey);
135
+ const currentPlan = sessionStore.read(sessionKeyHash).currentPlan;
136
+ const target = input.target ?? currentPlan;
137
+ if (!target) {
138
+ throw new ClawError("CURRENT_PLAN_REQUIRED", "The session has no current plan. Pass a plan id to resume it explicitly.");
139
+ }
140
+ if (currentPlan && samePlanRef(input.project, currentPlan, target)) {
141
+ const current = readPlanDocument(input.project, target);
142
+ if (current.status === "process.active") {
143
+ return { changed: false, currentPlan: target, enteredEndPlans: [] };
144
+ }
145
+ }
146
+ return switchCurrentPlan({
147
+ project: input.project,
148
+ sessionKey: input.sessionKey,
149
+ target,
150
+ kind: "resume",
151
+ sessionStore,
152
+ testHooks: input.testHooks,
153
+ });
154
+ }
155
+ export async function switchCurrentPlan(input) {
156
+ const sessionStore = input.sessionStore ?? new ProjectFocusSessionStore(input.project);
157
+ const sessionKeyHash = focusSessionKeyHash(input.sessionKey);
158
+ const currentPlan = sessionStore.read(sessionKeyHash).currentPlan;
159
+ const refs = uniquePlanRefs(input.project, [
160
+ ...(currentPlan ? [currentPlan] : []),
161
+ input.target,
162
+ ...(input.additionalPlanUpdates?.map((entry) => entry.ref) ?? []),
163
+ ]);
164
+ return commitFocusTransition({
165
+ project: input.project,
166
+ sessionKeyHash,
167
+ kind: input.kind ?? "resume",
168
+ sessionStore,
169
+ involvedRefs: refs,
170
+ testHooks: input.testHooks,
171
+ buildAfter: ({ plans }) => {
172
+ const updates = new Map();
173
+ for (const update of input.additionalPlanUpdates ?? []) {
174
+ updates.set(planIdentityHash(input.project, update.ref), {
175
+ ref: update.ref,
176
+ content: structuredClone(update.content),
177
+ });
178
+ }
179
+ if (currentPlan && !samePlanRef(input.project, currentPlan, input.target)) {
180
+ const current = structuredClone(updates.get(planIdentityHash(input.project, currentPlan))?.content
181
+ ?? requirePlan(plans, input.project, currentPlan));
182
+ if (!(input.preserveCurrentEndState && current.status.startsWith("end."))) {
183
+ current.status = "end.leave";
184
+ current.leaveReason = "switch_to_new_plan";
185
+ delete current.completedAt;
186
+ }
187
+ current.updatedAt = new Date().toISOString();
188
+ updates.set(planIdentityHash(input.project, currentPlan), { ref: currentPlan, content: current });
189
+ }
190
+ const target = structuredClone(updates.get(planIdentityHash(input.project, input.target))?.content
191
+ ?? requirePlan(plans, input.project, input.target));
192
+ if (!input.preserveTargetStatus) {
193
+ assertResumable(target, input.target);
194
+ target.status = "process.active";
195
+ }
196
+ delete target.leaveReason;
197
+ target.updatedAt = new Date().toISOString();
198
+ updates.set(planIdentityHash(input.project, input.target), { ref: input.target, content: target });
199
+ return {
200
+ currentPlan: input.target,
201
+ plans: [...updates.values()],
202
+ };
203
+ },
204
+ });
205
+ }
206
+ export async function createPlanAndSwitchFocus(input) {
207
+ return switchCurrentPlan({
208
+ project: input.project,
209
+ sessionKey: input.sessionKey,
210
+ target: input.createdPlan,
211
+ kind: "create",
212
+ preserveTargetStatus: true,
213
+ sessionStore: input.sessionStore,
214
+ testHooks: input.testHooks,
215
+ });
216
+ }
217
+ export async function createSubplanAndSwitchFocus(input) {
218
+ return switchCurrentPlan({
219
+ project: input.project,
220
+ sessionKey: input.sessionKey,
221
+ target: input.childPlan,
222
+ kind: "subplan_create",
223
+ preserveTargetStatus: true,
224
+ additionalPlanUpdates: [{
225
+ ref: input.parentPlan,
226
+ content: input.parentAfterLink,
227
+ }],
228
+ sessionStore: input.sessionStore,
229
+ testHooks: input.testHooks,
230
+ });
231
+ }
232
+ export async function completeSubplanAndRestoreParent(input) {
233
+ if (!input.completedChild.status.startsWith("end.")) {
234
+ throw new ClawError("PLAN_TRANSITION_CONFLICT", "A subplan must enter an end.* state before restoring its parent.", { childPlan: input.childPlan, status: input.completedChild.status });
235
+ }
236
+ const parent = readPlanDocument(input.project, input.parentPlan);
237
+ const parentTask = parent.tasks.find((task) => task.id === input.parentTaskId);
238
+ if (!parentTask) {
239
+ throw new ClawError("PLAN_TRANSITION_CONFLICT", `Parent task ${input.parentTaskId} does not exist.`, { parentPlan: input.parentPlan, parentTaskId: input.parentTaskId });
240
+ }
241
+ parentTask.status = "done";
242
+ parent.status = "process.active";
243
+ delete parent.leaveReason;
244
+ delete parent.completedAt;
245
+ parent.updatedAt = new Date().toISOString();
246
+ return switchCurrentPlan({
247
+ project: input.project,
248
+ sessionKey: input.sessionKey,
249
+ target: input.parentPlan,
250
+ kind: "subplan_complete",
251
+ additionalPlanUpdates: [
252
+ { ref: input.childPlan, content: input.completedChild },
253
+ { ref: input.parentPlan, content: parent },
254
+ ],
255
+ preserveCurrentEndState: true,
256
+ sessionStore: input.sessionStore,
257
+ testHooks: input.testHooks,
258
+ });
259
+ }
260
+ export async function recoverProjectFocusTransitions(input) {
261
+ const sessionStore = input.sessionStore ?? new ProjectFocusSessionStore(input.project);
262
+ return withSerializedQueue(focusQueuePath(input.project), async () => recoverProjectFocusTransitionsLocked(input.project, sessionStore));
263
+ }
264
+ async function commitFocusTransition(input) {
265
+ return withSerializedQueue(focusQueuePath(input.project), async () => {
266
+ await recoverProjectFocusTransitionsLocked(input.project, input.sessionStore);
267
+ const planPaths = input.involvedRefs
268
+ .map((ref) => resolvePlanRefPath(input.project, ref))
269
+ .sort((left, right) => left.localeCompare(right));
270
+ return withPlanQueues(planPaths, () => withSerializedQueue(input.sessionStore.queuePath(input.sessionKeyHash), async () => {
271
+ const session = input.sessionStore.read(input.sessionKeyHash);
272
+ const owners = readOwnerRegistry(input.project);
273
+ validateRegistryConsistency(input.project, input.sessionKeyHash, session, owners);
274
+ const plans = new Map(input.involvedRefs.map((ref) => [
275
+ planIdentityHash(input.project, ref),
276
+ readPlanDocument(input.project, ref),
277
+ ]));
278
+ const built = input.buildAfter({ plans, session, owners });
279
+ const normalizedAfterPlans = uniqueAfterPlans(input.project, built.plans);
280
+ validateTargetOwnership(input.project, input.sessionKeyHash, built.currentPlan, owners);
281
+ const now = new Date().toISOString();
282
+ const afterOwners = buildAfterOwners(input.project, input.sessionKeyHash, built.currentPlan, owners, now);
283
+ const afterSession = {
284
+ schemaVersion: 1,
285
+ sessionKeyHash: input.sessionKeyHash,
286
+ ...(built.currentPlan ? { currentPlan: built.currentPlan } : {}),
287
+ updatedAt: now,
288
+ };
289
+ const persistedAfterSession = input.sessionStore.buildPersistedRecord(input.sessionKeyHash, afterSession);
290
+ const transitionId = randomUUID();
291
+ const journalPath = path.join(focusTransitionsDirectory(input.project), `${transitionId}.json`);
292
+ const journal = {
293
+ schemaVersion: 1,
294
+ transitionId,
295
+ kind: input.kind,
296
+ sessionKeyHash: input.sessionKeyHash,
297
+ phase: "prepared",
298
+ createdAt: now,
299
+ updatedAt: now,
300
+ before: {
301
+ sessionRecordHash: hashFile(input.sessionStore.resourcePath(input.sessionKeyHash)),
302
+ ownerRegistryHash: hashFile(focusOwnersPath(input.project)),
303
+ ...(session.currentPlan ? { sessionCurrentPlan: session.currentPlan } : {}),
304
+ plans: normalizedAfterPlans.map(({ ref }) => ({
305
+ ref,
306
+ contentHash: hashFile(resolvePlanRefPath(input.project, ref)),
307
+ })),
308
+ },
309
+ after: {
310
+ sessionRecord: persistedAfterSession,
311
+ ownerRegistry: afterOwners,
312
+ ...(built.currentPlan ? { sessionCurrentPlan: built.currentPlan } : {}),
313
+ plans: normalizedAfterPlans,
314
+ },
315
+ };
316
+ writeJsonFileAtomic(journalPath, journal);
317
+ failAt(input.testHooks, "after_prepared");
318
+ journal.phase = "applying";
319
+ journal.updatedAt = new Date().toISOString();
320
+ writeJsonFileAtomic(journalPath, journal);
321
+ failAt(input.testHooks, "after_applying");
322
+ let writtenPlanCount = 0;
323
+ for (const afterPlan of normalizedAfterPlans) {
324
+ writeJsonFileAtomic(resolvePlanRefPath(input.project, afterPlan.ref), afterPlan.content);
325
+ writtenPlanCount += 1;
326
+ if (input.testHooks?.failAt === "after_plan"
327
+ && (input.testHooks.failAfterPlanWrites === undefined
328
+ || input.testHooks.failAfterPlanWrites === writtenPlanCount)) {
329
+ failAt(input.testHooks, "after_plan");
330
+ }
331
+ }
332
+ writeJsonFileAtomic(focusOwnersPath(input.project), afterOwners);
333
+ failAt(input.testHooks, "after_owners");
334
+ input.sessionStore.writePersistedAtomic(input.sessionKeyHash, persistedAfterSession);
335
+ failAt(input.testHooks, "after_session");
336
+ journal.phase = "committed";
337
+ journal.updatedAt = new Date().toISOString();
338
+ writeJsonFileAtomic(journalPath, journal);
339
+ failAt(input.testHooks, "after_committed");
340
+ fs.unlinkSync(journalPath);
341
+ const previousCurrentPlan = session.currentPlan;
342
+ return {
343
+ changed: true,
344
+ transitionId,
345
+ ...(previousCurrentPlan ? { previousCurrentPlan } : {}),
346
+ ...(built.currentPlan ? { currentPlan: built.currentPlan } : {}),
347
+ enteredEndPlans: normalizedAfterPlans.flatMap(({ ref, content }) => {
348
+ const before = plans.get(planIdentityHash(input.project, ref));
349
+ return before && !before.status.startsWith("end.") && content.status.startsWith("end.")
350
+ ? [{ ref, plan: content, endedAt: content.completedAt ?? now }]
351
+ : [];
352
+ }),
353
+ };
354
+ }));
355
+ });
356
+ }
357
+ async function recoverProjectFocusTransitionsLocked(project, sessionStore) {
358
+ const directory = focusTransitionsDirectory(project);
359
+ if (!fs.existsSync(directory)) {
360
+ return { recovered: [], discarded: [] };
361
+ }
362
+ const journalPaths = fs.readdirSync(directory)
363
+ .filter((name) => /^[0-9a-f-]+\.json$/i.test(name))
364
+ .map((name) => path.join(directory, name))
365
+ .sort();
366
+ const recovered = [];
367
+ const discarded = [];
368
+ for (const journalPath of journalPaths) {
369
+ const journal = readJsonFile(journalPath);
370
+ validateJournal(project, journal, journalPath);
371
+ const planPaths = journal.after.plans
372
+ .map(({ ref }) => resolvePlanRefPath(project, ref))
373
+ .sort((left, right) => left.localeCompare(right));
374
+ await withPlanQueues(planPaths, () => withSerializedQueue(sessionStore.queuePath(journal.sessionKeyHash), async () => {
375
+ if (journal.phase === "prepared") {
376
+ assertResourceHash(focusOwnersPath(project), journal.before.ownerRegistryHash, undefined, journal);
377
+ assertResourceHash(sessionStore.resourcePath(journal.sessionKeyHash), journal.before.sessionRecordHash, undefined, journal);
378
+ for (const beforePlan of journal.before.plans) {
379
+ assertResourceHash(resolvePlanRefPath(project, beforePlan.ref), beforePlan.contentHash, undefined, journal);
380
+ }
381
+ fs.unlinkSync(journalPath);
382
+ discarded.push(journal.transitionId);
383
+ return;
384
+ }
385
+ const planAfter = new Map(journal.after.plans.map((entry) => [
386
+ resolvePlanRefPath(project, entry.ref),
387
+ entry.content,
388
+ ]));
389
+ if (journal.phase === "applying") {
390
+ for (const beforePlan of journal.before.plans) {
391
+ const resourcePath = resolvePlanRefPath(project, beforePlan.ref);
392
+ rollForwardResource(resourcePath, beforePlan.contentHash, planAfter.get(resourcePath), journal);
393
+ }
394
+ rollForwardResource(focusOwnersPath(project), journal.before.ownerRegistryHash, journal.after.ownerRegistry, journal);
395
+ rollForwardSession(sessionStore, journal.sessionKeyHash, journal.before.sessionRecordHash, journal.after.sessionRecord, journal);
396
+ journal.phase = "committed";
397
+ journal.updatedAt = new Date().toISOString();
398
+ writeJsonFileAtomic(journalPath, journal);
399
+ }
400
+ verifyAfterState(project, sessionStore, journal);
401
+ fs.unlinkSync(journalPath);
402
+ recovered.push(journal.transitionId);
403
+ }));
404
+ }
405
+ return { recovered, discarded };
406
+ }
407
+ function verifyAfterState(project, sessionStore, journal) {
408
+ for (const afterPlan of journal.after.plans) {
409
+ assertResourceHash(resolvePlanRefPath(project, afterPlan.ref), undefined, hashJson(afterPlan.content), journal);
410
+ }
411
+ assertResourceHash(focusOwnersPath(project), undefined, hashJson(journal.after.ownerRegistry), journal);
412
+ assertResourceHash(sessionStore.resourcePath(journal.sessionKeyHash), undefined, hashJson(journal.after.sessionRecord), journal);
413
+ }
414
+ function rollForwardResource(resourcePath, beforeHash, afterValue, journal) {
415
+ const currentHash = hashFile(resourcePath);
416
+ const afterHash = hashJson(afterValue);
417
+ if (currentHash === afterHash)
418
+ return;
419
+ if (currentHash !== beforeHash) {
420
+ throwRecoveryConflict(resourcePath, currentHash, beforeHash, afterHash, journal);
421
+ }
422
+ writeJsonFileAtomic(resourcePath, afterValue);
423
+ }
424
+ function rollForwardSession(store, sessionKeyHash, beforeHash, afterValue, journal) {
425
+ const resourcePath = store.resourcePath(sessionKeyHash);
426
+ const currentHash = hashFile(resourcePath);
427
+ const afterHash = hashJson(afterValue);
428
+ if (currentHash === afterHash)
429
+ return;
430
+ if (currentHash !== beforeHash) {
431
+ throwRecoveryConflict(resourcePath, currentHash, beforeHash, afterHash, journal);
432
+ }
433
+ store.writePersistedAtomic(sessionKeyHash, afterValue);
434
+ }
435
+ function assertResourceHash(resourcePath, beforeHash, afterHash, journal) {
436
+ const currentHash = hashFile(resourcePath);
437
+ if (currentHash === beforeHash || currentHash === afterHash)
438
+ return;
439
+ throwRecoveryConflict(resourcePath, currentHash, beforeHash, afterHash, journal);
440
+ }
441
+ function throwRecoveryConflict(resourcePath, currentHash, beforeHash, afterHash, journal) {
442
+ throw new ClawError("FOCUS_RECOVERY_CONFLICT", `Focus transition ${journal.transitionId} conflicts with an unexpected resource state.`, { resourcePath, currentHash, beforeHash, afterHash, journalPath: `${journal.transitionId}.json` });
443
+ }
444
+ function validateJournal(project, journal, journalPath) {
445
+ if (journal.schemaVersion !== 1 || !journal.transitionId || !journal.sessionKeyHash) {
446
+ throw new ClawError("FOCUS_RECOVERY_CONFLICT", `Invalid focus transition journal: ${journalPath}`);
447
+ }
448
+ for (const entry of [...journal.before.plans, ...journal.after.plans]) {
449
+ resolvePlanRefPath(project, entry.ref);
450
+ }
451
+ }
452
+ function validateRegistryConsistency(project, sessionKeyHash, session, owners) {
453
+ const owned = Object.values(owners.owners).filter((owner) => owner.sessionKeyHash === sessionKeyHash);
454
+ if (owned.length > 1) {
455
+ throw new ClawError("PLAN_TRANSITION_CONFLICT", "A session cannot own more than one current plan.");
456
+ }
457
+ if (session.currentPlan) {
458
+ const owner = owners.owners[planIdentityHash(project, session.currentPlan)];
459
+ if (!owner || owner.sessionKeyHash !== sessionKeyHash) {
460
+ throw new ClawError("PLAN_TRANSITION_CONFLICT", "The session currentPlan and plan focus owner registry disagree.");
461
+ }
462
+ }
463
+ else if (owned.length > 0) {
464
+ throw new ClawError("PLAN_TRANSITION_CONFLICT", "The owner registry contains a plan for a session without currentPlan.");
465
+ }
466
+ }
467
+ function validateTargetOwnership(project, sessionKeyHash, target, owners) {
468
+ if (!target)
469
+ return;
470
+ const owner = owners.owners[planIdentityHash(project, target)];
471
+ if (owner && owner.sessionKeyHash !== sessionKeyHash) {
472
+ throw new ClawError("PLAN_FOCUS_CONFLICT", `Plan "${target.planFile}" is current in another retained session.`, { planRef: target, ownerSessionKeyHash: owner.sessionKeyHash });
473
+ }
474
+ }
475
+ function buildAfterOwners(project, sessionKeyHash, target, current, now) {
476
+ const owners = structuredClone(current);
477
+ for (const [identity, owner] of Object.entries(owners.owners)) {
478
+ if (owner.sessionKeyHash === sessionKeyHash) {
479
+ delete owners.owners[identity];
480
+ }
481
+ }
482
+ if (target) {
483
+ const identity = planIdentityHash(project, target);
484
+ const existing = current.owners[identity];
485
+ owners.owners[identity] = {
486
+ sessionKeyHash,
487
+ planRef: target,
488
+ acquiredAt: existing?.sessionKeyHash === sessionKeyHash ? existing.acquiredAt : now,
489
+ updatedAt: now,
490
+ };
491
+ }
492
+ return owners;
493
+ }
494
+ function readOwnerRegistry(project) {
495
+ const registryPath = focusOwnersPath(project);
496
+ if (!fs.existsSync(registryPath)) {
497
+ return { schemaVersion: 1, owners: {} };
498
+ }
499
+ const registry = readJsonFile(registryPath);
500
+ if (registry.schemaVersion !== 1 || !registry.owners || typeof registry.owners !== "object") {
501
+ throw new ClawError("PLAN_TRANSITION_CONFLICT", `Invalid plan focus registry: ${registryPath}`);
502
+ }
503
+ return registry;
504
+ }
505
+ function readPlanDocument(project, ref) {
506
+ return readJsonFile(resolvePlanRefPath(project, ref));
507
+ }
508
+ function requirePlan(plans, project, ref) {
509
+ const plan = plans.get(planIdentityHash(project, ref));
510
+ if (!plan) {
511
+ throw new ClawError("PLAN_TRANSITION_CONFLICT", "Focus transition did not lock every involved plan.", {
512
+ planRef: ref,
513
+ });
514
+ }
515
+ return plan;
516
+ }
517
+ function assertResumable(plan, ref) {
518
+ if (plan.status !== "end.leave"
519
+ && plan.status !== "process.wait"
520
+ && plan.status !== "process.discussing"
521
+ && plan.status !== "process.active") {
522
+ throw new ClawError("PLAN_NOT_RESUMABLE", `Plan "${ref.planFile}" cannot resume from ${plan.status}.`, { planRef: ref, status: plan.status });
523
+ }
524
+ }
525
+ function resolvePlanRefPath(project, ref) {
526
+ if (path.resolve(ref.projectRoot) !== path.resolve(project.projectRoot)) {
527
+ throw new ClawError("PLAN_TRANSITION_CONFLICT", "PlanRef belongs to a different project.", {
528
+ planRef: ref,
529
+ projectRoot: project.projectRoot,
530
+ });
531
+ }
532
+ const taskDirectory = findTaskDirectory(project, ref.taskName);
533
+ if (!taskDirectory) {
534
+ throw new ClawError("PLAN_NOT_FOUND", `Task "${ref.taskName}" does not exist.`, { planRef: ref });
535
+ }
536
+ const normalizedPlanFile = normalizePlanFile(ref.planFile);
537
+ const planPath = ensureInsideDir(taskDirectory, normalizedPlanFile);
538
+ if (!planPath || !fs.existsSync(planPath)) {
539
+ throw new ClawError("PLAN_NOT_FOUND", `Plan "${normalizedPlanFile}" does not exist.`, { planRef: ref });
540
+ }
541
+ return planPath;
542
+ }
543
+ function planIdentityHash(project, ref) {
544
+ return createHash("sha256")
545
+ .update(`${path.resolve(project.projectRoot)}\0${ref.taskName}\0${normalizePlanFile(ref.planFile)}`)
546
+ .digest("hex");
547
+ }
548
+ function samePlanRef(project, left, right) {
549
+ return planIdentityHash(project, left) === planIdentityHash(project, right);
550
+ }
551
+ function uniquePlanRefs(project, refs) {
552
+ const unique = new Map();
553
+ for (const ref of refs)
554
+ unique.set(planIdentityHash(project, ref), ref);
555
+ return [...unique.values()];
556
+ }
557
+ function uniqueAfterPlans(project, plans) {
558
+ const unique = new Map();
559
+ for (const plan of plans) {
560
+ unique.set(planIdentityHash(project, plan.ref), {
561
+ ref: plan.ref,
562
+ content: structuredClone(plan.content),
563
+ });
564
+ }
565
+ return [...unique.values()].sort((left, right) => resolvePlanRefPath(project, left.ref).localeCompare(resolvePlanRefPath(project, right.ref)));
566
+ }
567
+ function hashFile(filePath) {
568
+ return fs.existsSync(filePath)
569
+ ? createHash("sha256").update(fs.readFileSync(filePath)).digest("hex")
570
+ : MISSING_RESOURCE_HASH;
571
+ }
572
+ function hashJson(value) {
573
+ return createHash("sha256").update(serializeJsonFile(value)).digest("hex");
574
+ }
575
+ async function withPlanQueues(planPaths, action) {
576
+ const [first, ...rest] = planPaths;
577
+ if (!first)
578
+ return action();
579
+ return withSerializedAccess(first, () => withPlanQueues(rest, action));
580
+ }
581
+ function failAt(hooks, point) {
582
+ if (hooks?.failAt === point) {
583
+ throw new Error(`Injected focus transition failure at ${point}.`);
584
+ }
585
+ }
586
+ //# sourceMappingURL=focus-transitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus-transitions.js","sourceRoot":"","sources":["../../src/focus-transitions.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,9 @@ export * from "./daily-maintenance.js";
3
3
  export * from "./effective-config.js";
4
4
  export * from "./completion-hooks.js";
5
5
  export * from "./errors.js";
6
+ export * from "./focus-transitions.js";
6
7
  export * from "./init.js";
8
+ export * from "./io.js";
7
9
  export * from "./knowledge-document.js";
8
10
  export * from "./knowledge-assignments.js";
9
11
  export * from "./knowledge-governance.js";
package/dist/src/index.js CHANGED
@@ -3,7 +3,9 @@ export * from "./daily-maintenance.js";
3
3
  export * from "./effective-config.js";
4
4
  export * from "./completion-hooks.js";
5
5
  export * from "./errors.js";
6
+ export * from "./focus-transitions.js";
6
7
  export * from "./init.js";
8
+ export * from "./io.js";
7
9
  export * from "./knowledge-document.js";
8
10
  export * from "./knowledge-assignments.js";
9
11
  export * from "./knowledge-governance.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC"}