@lumenflow/core 2.18.3 → 2.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/terminal-renderer.adapter.d.ts.map +1 -1
- package/dist/adapters/terminal-renderer.adapter.js +6 -4
- package/dist/adapters/terminal-renderer.adapter.js.map +1 -1
- package/dist/atomic-merge.d.ts +21 -0
- package/dist/atomic-merge.d.ts.map +1 -0
- package/dist/atomic-merge.js +83 -0
- package/dist/atomic-merge.js.map +1 -0
- package/dist/delegation-escalation.d.ts +91 -0
- package/dist/delegation-escalation.d.ts.map +1 -0
- package/dist/delegation-escalation.js +258 -0
- package/dist/delegation-escalation.js.map +1 -0
- package/dist/delegation-monitor.d.ts +230 -0
- package/dist/delegation-monitor.d.ts.map +1 -0
- package/dist/delegation-monitor.js +675 -0
- package/dist/delegation-monitor.js.map +1 -0
- package/dist/delegation-recovery.d.ts +83 -0
- package/dist/delegation-recovery.d.ts.map +1 -0
- package/dist/delegation-recovery.js +299 -0
- package/dist/delegation-recovery.js.map +1 -0
- package/dist/delegation-registry-schema.d.ts +80 -0
- package/dist/delegation-registry-schema.d.ts.map +1 -0
- package/dist/delegation-registry-schema.js +91 -0
- package/dist/delegation-registry-schema.js.map +1 -0
- package/dist/delegation-registry-store.d.ts +159 -0
- package/dist/delegation-registry-store.d.ts.map +1 -0
- package/dist/delegation-registry-store.js +299 -0
- package/dist/delegation-registry-store.js.map +1 -0
- package/dist/delegation-tree.d.ts +57 -0
- package/dist/delegation-tree.d.ts.map +1 -0
- package/dist/delegation-tree.js +203 -0
- package/dist/delegation-tree.js.map +1 -0
- package/dist/gates-agent-mode.d.ts +25 -0
- package/dist/gates-agent-mode.d.ts.map +1 -1
- package/dist/gates-agent-mode.js +41 -0
- package/dist/gates-agent-mode.js.map +1 -1
- package/dist/index.d.ts +10 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -9
- package/dist/index.js.map +1 -1
- package/dist/lumenflow-config-schema.d.ts +9 -3
- package/dist/lumenflow-config-schema.d.ts.map +1 -1
- package/dist/lumenflow-config-schema.js +18 -3
- package/dist/lumenflow-config-schema.js.map +1 -1
- package/dist/lumenflow-config.d.ts +2 -0
- package/dist/lumenflow-config.d.ts.map +1 -1
- package/dist/lumenflow-config.js +1 -0
- package/dist/lumenflow-config.js.map +1 -1
- package/dist/micro-worktree.d.ts.map +1 -1
- package/dist/micro-worktree.js +15 -9
- package/dist/micro-worktree.js.map +1 -1
- package/dist/rollback-utils.d.ts +52 -0
- package/dist/rollback-utils.d.ts.map +1 -1
- package/dist/rollback-utils.js +111 -0
- package/dist/rollback-utils.js.map +1 -1
- package/dist/schemas/index.d.ts +3 -3
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +6 -6
- package/dist/schemas/index.js.map +1 -1
- package/dist/schemas/initiative-arg-validators.d.ts +1 -0
- package/dist/schemas/initiative-arg-validators.d.ts.map +1 -1
- package/dist/schemas/initiative-schemas.d.ts +3 -1
- package/dist/schemas/initiative-schemas.d.ts.map +1 -1
- package/dist/schemas/initiative-schemas.js +2 -1
- package/dist/schemas/initiative-schemas.js.map +1 -1
- package/dist/schemas/setup-arg-validators.d.ts +4 -4
- package/dist/schemas/setup-arg-validators.d.ts.map +1 -1
- package/dist/schemas/setup-arg-validators.js +6 -6
- package/dist/schemas/setup-arg-validators.js.map +1 -1
- package/dist/schemas/setup-schemas.d.ts +7 -7
- package/dist/schemas/setup-schemas.d.ts.map +1 -1
- package/dist/schemas/setup-schemas.js +10 -10
- package/dist/schemas/setup-schemas.js.map +1 -1
- package/dist/schemas/wu-lifecycle-arg-validators.d.ts +2 -1
- package/dist/schemas/wu-lifecycle-arg-validators.d.ts.map +1 -1
- package/dist/schemas/wu-lifecycle-schemas.d.ts +5 -3
- package/dist/schemas/wu-lifecycle-schemas.d.ts.map +1 -1
- package/dist/schemas/wu-lifecycle-schemas.js +5 -1
- package/dist/schemas/wu-lifecycle-schemas.js.map +1 -1
- package/dist/template-loader.d.ts +7 -3
- package/dist/template-loader.d.ts.map +1 -1
- package/dist/template-loader.js +22 -6
- package/dist/template-loader.js.map +1 -1
- package/dist/wu-consistency-checker.d.ts +1 -0
- package/dist/wu-consistency-checker.d.ts.map +1 -1
- package/dist/wu-consistency-checker.js +31 -2
- package/dist/wu-consistency-checker.js.map +1 -1
- package/dist/wu-context-constants.d.ts +0 -2
- package/dist/wu-context-constants.d.ts.map +1 -1
- package/dist/wu-context-constants.js +0 -2
- package/dist/wu-context-constants.js.map +1 -1
- package/dist/wu-done-branch-only.d.ts +2 -11
- package/dist/wu-done-branch-only.d.ts.map +1 -1
- package/dist/wu-done-branch-only.js +81 -45
- package/dist/wu-done-branch-only.js.map +1 -1
- package/dist/wu-done-cleanup.js +33 -1
- package/dist/wu-done-cleanup.js.map +1 -1
- package/dist/wu-done-initiative-sync.d.ts.map +1 -1
- package/dist/wu-done-initiative-sync.js +20 -5
- package/dist/wu-done-initiative-sync.js.map +1 -1
- package/dist/wu-done-machine.d.ts +175 -0
- package/dist/wu-done-machine.d.ts.map +1 -0
- package/dist/wu-done-machine.js +225 -0
- package/dist/wu-done-machine.js.map +1 -0
- package/dist/wu-done-metadata.d.ts.map +1 -1
- package/dist/wu-done-metadata.js +3 -1
- package/dist/wu-done-metadata.js.map +1 -1
- package/dist/wu-done-validation.d.ts +0 -37
- package/dist/wu-done-validation.d.ts.map +1 -1
- package/dist/wu-done-validation.js +1 -155
- package/dist/wu-done-validation.js.map +1 -1
- package/dist/wu-done-validators.d.ts +1 -2
- package/dist/wu-done-validators.d.ts.map +1 -1
- package/dist/wu-done-validators.js +1 -3
- package/dist/wu-done-validators.js.map +1 -1
- package/dist/wu-done-worktree-services.d.ts +191 -0
- package/dist/wu-done-worktree-services.d.ts.map +1 -0
- package/dist/wu-done-worktree-services.js +273 -0
- package/dist/wu-done-worktree-services.js.map +1 -0
- package/dist/wu-done-worktree.d.ts +0 -19
- package/dist/wu-done-worktree.d.ts.map +1 -1
- package/dist/wu-done-worktree.js +165 -118
- package/dist/wu-done-worktree.js.map +1 -1
- package/dist/wu-git-constants.d.ts +4 -0
- package/dist/wu-git-constants.d.ts.map +1 -1
- package/dist/wu-git-constants.js +4 -0
- package/dist/wu-git-constants.js.map +1 -1
- package/dist/wu-helpers.d.ts +5 -1
- package/dist/wu-helpers.d.ts.map +1 -1
- package/dist/wu-helpers.js +5 -1
- package/dist/wu-helpers.js.map +1 -1
- package/dist/wu-lint.d.ts +24 -0
- package/dist/wu-lint.d.ts.map +1 -1
- package/dist/wu-lint.js +48 -1
- package/dist/wu-lint.js.map +1 -1
- package/dist/wu-paths-constants.d.ts +3 -3
- package/dist/wu-paths-constants.d.ts.map +1 -1
- package/dist/wu-paths-constants.js +3 -3
- package/dist/wu-paths-constants.js.map +1 -1
- package/dist/wu-recovery.d.ts +89 -0
- package/dist/wu-recovery.d.ts.map +1 -1
- package/dist/wu-recovery.js +118 -0
- package/dist/wu-recovery.js.map +1 -1
- package/dist/wu-schema.d.ts +6 -6
- package/dist/wu-spawn-context.d.ts +1 -1
- package/dist/wu-spawn-context.d.ts.map +1 -1
- package/dist/wu-spawn-context.js +8 -2
- package/dist/wu-spawn-context.js.map +1 -1
- package/dist/wu-spawn-helpers.js +2 -2
- package/dist/wu-spawn-helpers.js.map +1 -1
- package/dist/wu-state-schema.d.ts +12 -12
- package/dist/wu-state-schema.d.ts.map +1 -1
- package/dist/wu-state-schema.js +10 -10
- package/dist/wu-state-schema.js.map +1 -1
- package/dist/wu-state-store.d.ts +10 -4
- package/dist/wu-state-store.d.ts.map +1 -1
- package/dist/wu-state-store.js +309 -11
- package/dist/wu-state-store.js.map +1 -1
- package/dist/wu-transaction.d.ts +21 -0
- package/dist/wu-transaction.d.ts.map +1 -1
- package/dist/wu-transaction.js +17 -0
- package/dist/wu-transaction.js.map +1 -1
- package/package.json +11 -9
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delegation Registry Store (WU-1944)
|
|
3
|
+
*
|
|
4
|
+
* Event-sourced state store for tracking sub-agent delegations.
|
|
5
|
+
* Stores events in .lumenflow/state/delegation-registry.jsonl (append-only, git-friendly).
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Event sourcing with replay for current state
|
|
9
|
+
* - Atomic append operations
|
|
10
|
+
* - O(1) queries by parent WU, target WU, and status
|
|
11
|
+
*
|
|
12
|
+
* @see {@link packages/@lumenflow/cli/src/lib/__tests__/delegation-registry-store.test.ts} - Tests
|
|
13
|
+
* @see {@link packages/@lumenflow/cli/src/lib/delegation-registry-schema.ts} - Schema definitions
|
|
14
|
+
*/
|
|
15
|
+
import { type DelegationEvent, type DelegationIntentValue } from './delegation-registry-schema.js';
|
|
16
|
+
/** Delegation registry file name constant */
|
|
17
|
+
export declare const DELEGATION_REGISTRY_FILE_NAME = "delegation-registry.jsonl";
|
|
18
|
+
/**
|
|
19
|
+
* Delegation Registry Store class
|
|
20
|
+
*
|
|
21
|
+
* Manages delegation registry state via event sourcing pattern.
|
|
22
|
+
* Events are appended to JSONL file, state is rebuilt by replaying events.
|
|
23
|
+
*/
|
|
24
|
+
export declare class DelegationRegistryStore {
|
|
25
|
+
private readonly baseDir;
|
|
26
|
+
private readonly registryFilePath;
|
|
27
|
+
private readonly delegations;
|
|
28
|
+
private readonly byParent;
|
|
29
|
+
private readonly byTarget;
|
|
30
|
+
/**
|
|
31
|
+
* @param {string} baseDir - Directory containing .lumenflow/state/
|
|
32
|
+
*/
|
|
33
|
+
constructor(baseDir: string);
|
|
34
|
+
/**
|
|
35
|
+
* Loads and replays events from JSONL file into current state.
|
|
36
|
+
*
|
|
37
|
+
* Handles:
|
|
38
|
+
* - Missing file: returns empty state
|
|
39
|
+
* - Empty file: returns empty state
|
|
40
|
+
* - Empty lines: skipped gracefully
|
|
41
|
+
* - Malformed JSON: throws error with line info
|
|
42
|
+
* - Invalid events: throws validation error
|
|
43
|
+
*
|
|
44
|
+
* @returns {Promise<void>}
|
|
45
|
+
* @throws {Error} If file contains malformed JSON or invalid events
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* const store = new DelegationRegistryStore('/path/to/project');
|
|
49
|
+
* await store.load();
|
|
50
|
+
* const pending = store.getPendingDelegations();
|
|
51
|
+
*/
|
|
52
|
+
load(): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Applies an event to the in-memory state.
|
|
55
|
+
* If event for same delegation ID exists, updates it (latest wins).
|
|
56
|
+
*
|
|
57
|
+
* @private
|
|
58
|
+
*/
|
|
59
|
+
private _applyEvent;
|
|
60
|
+
/**
|
|
61
|
+
* Appends an event to the registry file.
|
|
62
|
+
*
|
|
63
|
+
* Uses append mode to avoid full file rewrite.
|
|
64
|
+
* Creates file and parent directories if they don't exist.
|
|
65
|
+
* Validates event before appending.
|
|
66
|
+
*
|
|
67
|
+
* @private
|
|
68
|
+
* @throws {Error} If event fails validation
|
|
69
|
+
*/
|
|
70
|
+
private _appendEvent;
|
|
71
|
+
/**
|
|
72
|
+
* Records a new delegation event with pending status.
|
|
73
|
+
*
|
|
74
|
+
* @param {string} parentWuId - Parent WU ID (orchestrator)
|
|
75
|
+
* @param {string} targetWuId - Target WU ID (delegated work)
|
|
76
|
+
* @param {string} lane - Lane for the delegated work
|
|
77
|
+
* @param {DelegationIntentValue} [intent] - Optional intent source (e.g., delegation)
|
|
78
|
+
* @returns {Promise<string>} The generated delegation ID
|
|
79
|
+
* @throws {Error} If validation fails
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* const delegationId = await store.record('WU-1000', 'WU-1001', 'Operations: Tooling');
|
|
83
|
+
*/
|
|
84
|
+
record(parentWuId: string, targetWuId: string, lane: string, intent?: DelegationIntentValue): Promise<string>;
|
|
85
|
+
/**
|
|
86
|
+
* Updates the status of a delegation.
|
|
87
|
+
*
|
|
88
|
+
* @param {string} delegationId - Delegation ID to update
|
|
89
|
+
* @param {string} status - New status
|
|
90
|
+
* @returns {Promise<void>}
|
|
91
|
+
* @throws {Error} If delegation ID not found
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* await store.updateStatus('dlg-a1b2', 'completed');
|
|
95
|
+
*/
|
|
96
|
+
updateStatus(delegationId: string, status: string): Promise<void>;
|
|
97
|
+
/**
|
|
98
|
+
* Records claim-time pickup evidence for a delegation entry.
|
|
99
|
+
*
|
|
100
|
+
* WU-1605: This distinguishes intent-only delegation records from
|
|
101
|
+
* delegated work that was actually picked up via wu:claim.
|
|
102
|
+
*
|
|
103
|
+
* @param {string} delegationId - Delegation ID to update
|
|
104
|
+
* @param {string} pickedUpBy - Agent identity that claimed the target WU
|
|
105
|
+
* @param {string} [pickedUpAt] - Optional ISO timestamp (defaults to now)
|
|
106
|
+
* @returns {Promise<void>}
|
|
107
|
+
* @throws {Error} If delegation ID not found
|
|
108
|
+
*/
|
|
109
|
+
recordPickup(delegationId: string, pickedUpBy: string, pickedUpAt?: string): Promise<void>;
|
|
110
|
+
/**
|
|
111
|
+
* Gets all delegations for a parent WU.
|
|
112
|
+
*
|
|
113
|
+
* @param {string} parentWuId - Parent WU ID
|
|
114
|
+
* @returns {DelegationEvent[]} Array of delegation events
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* const delegations = store.getByParent('WU-1000');
|
|
118
|
+
*/
|
|
119
|
+
getByParent(parentWuId: string): DelegationEvent[];
|
|
120
|
+
/**
|
|
121
|
+
* Gets delegation for a target WU.
|
|
122
|
+
*
|
|
123
|
+
* @param {string} targetWuId - Target WU ID
|
|
124
|
+
* @returns {DelegationEvent | null} Delegation event or null
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* const delegation = store.getByTarget('WU-1001');
|
|
128
|
+
*/
|
|
129
|
+
getByTarget(targetWuId: string): DelegationEvent | null;
|
|
130
|
+
/**
|
|
131
|
+
* Gets all pending delegations.
|
|
132
|
+
*
|
|
133
|
+
* @returns {DelegationEvent[]} Array of pending delegation events
|
|
134
|
+
*
|
|
135
|
+
* @example
|
|
136
|
+
* const pending = store.getPendingDelegations();
|
|
137
|
+
*/
|
|
138
|
+
getPendingDelegations(): DelegationEvent[];
|
|
139
|
+
/**
|
|
140
|
+
* Gets all delegations as an array.
|
|
141
|
+
*
|
|
142
|
+
* @returns {DelegationEvent[]} Array of all delegation events
|
|
143
|
+
*
|
|
144
|
+
* @example
|
|
145
|
+
* const allDelegations = store.getAllDelegations();
|
|
146
|
+
*/
|
|
147
|
+
getAllDelegations(): DelegationEvent[];
|
|
148
|
+
/**
|
|
149
|
+
* Gets delegation by ID.
|
|
150
|
+
*
|
|
151
|
+
* @param {string} delegationId - Delegation ID
|
|
152
|
+
* @returns {DelegationEvent | null} Delegation event or null
|
|
153
|
+
*
|
|
154
|
+
* @example
|
|
155
|
+
* const delegation = store.getById('dlg-a1b2');
|
|
156
|
+
*/
|
|
157
|
+
getById(delegationId: string): DelegationEvent | null;
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=delegation-registry-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegation-registry-store.d.ts","sourceRoot":"","sources":["../src/delegation-registry-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,EAIL,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC3B,MAAM,iCAAiC,CAAC;AAEzC,6CAA6C;AAC7C,eAAO,MAAM,6BAA6B,8BAA8B,CAAC;AAEzE;;;;;GAKG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA+B;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAE/C;;OAEG;gBACS,OAAO,EAAE,MAAM;IAc3B;;;;;;;;;;;;;;;;;OAiBG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoD3B;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAmBnB;;;;;;;;;OASG;YACW,YAAY;IAmB1B;;;;;;;;;;;;OAYG;IACG,MAAM,CACV,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,MAAM,CAAC;IAoBlB;;;;;;;;;;OAUG;IACG,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBvE;;;;;;;;;;;OAWG;IACG,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBhG;;;;;;;;OAQG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,EAAE;IAOlD;;;;;;;;OAQG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAQvD;;;;;;;OAOG;IACH,qBAAqB,IAAI,eAAe,EAAE;IAM1C;;;;;;;OAOG;IACH,iBAAiB,IAAI,eAAe,EAAE;IAItC;;;;;;;;OAQG;IACH,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;CAGtD"}
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delegation Registry Store (WU-1944)
|
|
3
|
+
*
|
|
4
|
+
* Event-sourced state store for tracking sub-agent delegations.
|
|
5
|
+
* Stores events in .lumenflow/state/delegation-registry.jsonl (append-only, git-friendly).
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Event sourcing with replay for current state
|
|
9
|
+
* - Atomic append operations
|
|
10
|
+
* - O(1) queries by parent WU, target WU, and status
|
|
11
|
+
*
|
|
12
|
+
* @see {@link packages/@lumenflow/cli/src/lib/__tests__/delegation-registry-store.test.ts} - Tests
|
|
13
|
+
* @see {@link packages/@lumenflow/cli/src/lib/delegation-registry-schema.ts} - Schema definitions
|
|
14
|
+
*/
|
|
15
|
+
import fs from 'node:fs/promises';
|
|
16
|
+
import path from 'node:path';
|
|
17
|
+
import { validateDelegationEvent, generateDelegationId, DelegationStatus, } from './delegation-registry-schema.js';
|
|
18
|
+
/** Delegation registry file name constant */
|
|
19
|
+
export const DELEGATION_REGISTRY_FILE_NAME = 'delegation-registry.jsonl';
|
|
20
|
+
/**
|
|
21
|
+
* Delegation Registry Store class
|
|
22
|
+
*
|
|
23
|
+
* Manages delegation registry state via event sourcing pattern.
|
|
24
|
+
* Events are appended to JSONL file, state is rebuilt by replaying events.
|
|
25
|
+
*/
|
|
26
|
+
export class DelegationRegistryStore {
|
|
27
|
+
baseDir;
|
|
28
|
+
registryFilePath;
|
|
29
|
+
delegations;
|
|
30
|
+
byParent;
|
|
31
|
+
byTarget;
|
|
32
|
+
/**
|
|
33
|
+
* @param {string} baseDir - Directory containing .lumenflow/state/
|
|
34
|
+
*/
|
|
35
|
+
constructor(baseDir) {
|
|
36
|
+
this.baseDir = baseDir;
|
|
37
|
+
this.registryFilePath = path.join(baseDir, DELEGATION_REGISTRY_FILE_NAME);
|
|
38
|
+
// In-memory state (rebuilt from events)
|
|
39
|
+
this.delegations = new Map();
|
|
40
|
+
// Index: parentWuId -> delegationIds[]
|
|
41
|
+
this.byParent = new Map();
|
|
42
|
+
// Index: targetWuId -> delegationId
|
|
43
|
+
this.byTarget = new Map();
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Loads and replays events from JSONL file into current state.
|
|
47
|
+
*
|
|
48
|
+
* Handles:
|
|
49
|
+
* - Missing file: returns empty state
|
|
50
|
+
* - Empty file: returns empty state
|
|
51
|
+
* - Empty lines: skipped gracefully
|
|
52
|
+
* - Malformed JSON: throws error with line info
|
|
53
|
+
* - Invalid events: throws validation error
|
|
54
|
+
*
|
|
55
|
+
* @returns {Promise<void>}
|
|
56
|
+
* @throws {Error} If file contains malformed JSON or invalid events
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* const store = new DelegationRegistryStore('/path/to/project');
|
|
60
|
+
* await store.load();
|
|
61
|
+
* const pending = store.getPendingDelegations();
|
|
62
|
+
*/
|
|
63
|
+
async load() {
|
|
64
|
+
// Reset state
|
|
65
|
+
this.delegations.clear();
|
|
66
|
+
this.byParent.clear();
|
|
67
|
+
this.byTarget.clear();
|
|
68
|
+
// Check if file exists
|
|
69
|
+
let content;
|
|
70
|
+
try {
|
|
71
|
+
content = await fs.readFile(this.registryFilePath, 'utf-8');
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
if (error.code === 'ENOENT') {
|
|
75
|
+
// File doesn't exist - return empty state
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
// Parse JSONL content
|
|
81
|
+
const lines = content.split('\n');
|
|
82
|
+
for (let i = 0; i < lines.length; i++) {
|
|
83
|
+
const line = lines[i].trim();
|
|
84
|
+
// Skip empty lines
|
|
85
|
+
if (!line) {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
// Parse JSON line
|
|
89
|
+
let parsed;
|
|
90
|
+
try {
|
|
91
|
+
parsed = JSON.parse(line);
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
throw new Error(`Malformed JSON on line ${i + 1}: ${error.message}`);
|
|
95
|
+
}
|
|
96
|
+
// Validate against schema
|
|
97
|
+
const validation = validateDelegationEvent(parsed);
|
|
98
|
+
if (!validation.success) {
|
|
99
|
+
const issues = validation.error.issues
|
|
100
|
+
.map((issue) => `${issue.path.join('.')}: ${issue.message}`)
|
|
101
|
+
.join(', ');
|
|
102
|
+
throw new Error(`Validation error on line ${i + 1}: ${issues}`);
|
|
103
|
+
}
|
|
104
|
+
const event = validation.data;
|
|
105
|
+
// Apply event to state (latest event for same ID wins)
|
|
106
|
+
this._applyEvent(event);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Applies an event to the in-memory state.
|
|
111
|
+
* If event for same delegation ID exists, updates it (latest wins).
|
|
112
|
+
*
|
|
113
|
+
* @private
|
|
114
|
+
*/
|
|
115
|
+
_applyEvent(event) {
|
|
116
|
+
const { id, parentWuId, targetWuId } = event;
|
|
117
|
+
// Update main state map
|
|
118
|
+
this.delegations.set(id, event);
|
|
119
|
+
// Update parent index
|
|
120
|
+
if (!this.byParent.has(parentWuId)) {
|
|
121
|
+
this.byParent.set(parentWuId, []);
|
|
122
|
+
}
|
|
123
|
+
const parentDelegations = this.byParent.get(parentWuId);
|
|
124
|
+
if (!parentDelegations.includes(id)) {
|
|
125
|
+
parentDelegations.push(id);
|
|
126
|
+
}
|
|
127
|
+
// Update target index
|
|
128
|
+
this.byTarget.set(targetWuId, id);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Appends an event to the registry file.
|
|
132
|
+
*
|
|
133
|
+
* Uses append mode to avoid full file rewrite.
|
|
134
|
+
* Creates file and parent directories if they don't exist.
|
|
135
|
+
* Validates event before appending.
|
|
136
|
+
*
|
|
137
|
+
* @private
|
|
138
|
+
* @throws {Error} If event fails validation
|
|
139
|
+
*/
|
|
140
|
+
async _appendEvent(event) {
|
|
141
|
+
// Validate event before appending
|
|
142
|
+
const validation = validateDelegationEvent(event);
|
|
143
|
+
if (!validation.success) {
|
|
144
|
+
const issues = validation.error.issues
|
|
145
|
+
.map((issue) => `${issue.path.join('.')}: ${issue.message}`)
|
|
146
|
+
.join(', ');
|
|
147
|
+
throw new Error(`Validation error: ${issues}`);
|
|
148
|
+
}
|
|
149
|
+
const line = JSON.stringify(event) + '\n';
|
|
150
|
+
// Ensure parent directory exists before appending
|
|
151
|
+
await fs.mkdir(this.baseDir, { recursive: true });
|
|
152
|
+
// Use append flag to avoid rewriting the file
|
|
153
|
+
await fs.appendFile(this.registryFilePath, line, 'utf-8');
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Records a new delegation event with pending status.
|
|
157
|
+
*
|
|
158
|
+
* @param {string} parentWuId - Parent WU ID (orchestrator)
|
|
159
|
+
* @param {string} targetWuId - Target WU ID (delegated work)
|
|
160
|
+
* @param {string} lane - Lane for the delegated work
|
|
161
|
+
* @param {DelegationIntentValue} [intent] - Optional intent source (e.g., delegation)
|
|
162
|
+
* @returns {Promise<string>} The generated delegation ID
|
|
163
|
+
* @throws {Error} If validation fails
|
|
164
|
+
*
|
|
165
|
+
* @example
|
|
166
|
+
* const delegationId = await store.record('WU-1000', 'WU-1001', 'Operations: Tooling');
|
|
167
|
+
*/
|
|
168
|
+
async record(parentWuId, targetWuId, lane, intent) {
|
|
169
|
+
const id = generateDelegationId(parentWuId, targetWuId);
|
|
170
|
+
const event = {
|
|
171
|
+
id,
|
|
172
|
+
parentWuId,
|
|
173
|
+
targetWuId,
|
|
174
|
+
lane,
|
|
175
|
+
...(intent ? { intent } : {}),
|
|
176
|
+
delegatedAt: new Date().toISOString(),
|
|
177
|
+
status: DelegationStatus.PENDING,
|
|
178
|
+
completedAt: null,
|
|
179
|
+
};
|
|
180
|
+
await this._appendEvent(event);
|
|
181
|
+
this._applyEvent(event);
|
|
182
|
+
return id;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Updates the status of a delegation.
|
|
186
|
+
*
|
|
187
|
+
* @param {string} delegationId - Delegation ID to update
|
|
188
|
+
* @param {string} status - New status
|
|
189
|
+
* @returns {Promise<void>}
|
|
190
|
+
* @throws {Error} If delegation ID not found
|
|
191
|
+
*
|
|
192
|
+
* @example
|
|
193
|
+
* await store.updateStatus('dlg-a1b2', 'completed');
|
|
194
|
+
*/
|
|
195
|
+
async updateStatus(delegationId, status) {
|
|
196
|
+
const existing = this.delegations.get(delegationId);
|
|
197
|
+
if (!existing) {
|
|
198
|
+
throw new Error(`Delegation ID ${delegationId} not found`);
|
|
199
|
+
}
|
|
200
|
+
const event = {
|
|
201
|
+
...existing,
|
|
202
|
+
status: status,
|
|
203
|
+
completedAt: new Date().toISOString(),
|
|
204
|
+
};
|
|
205
|
+
await this._appendEvent(event);
|
|
206
|
+
this._applyEvent(event);
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Records claim-time pickup evidence for a delegation entry.
|
|
210
|
+
*
|
|
211
|
+
* WU-1605: This distinguishes intent-only delegation records from
|
|
212
|
+
* delegated work that was actually picked up via wu:claim.
|
|
213
|
+
*
|
|
214
|
+
* @param {string} delegationId - Delegation ID to update
|
|
215
|
+
* @param {string} pickedUpBy - Agent identity that claimed the target WU
|
|
216
|
+
* @param {string} [pickedUpAt] - Optional ISO timestamp (defaults to now)
|
|
217
|
+
* @returns {Promise<void>}
|
|
218
|
+
* @throws {Error} If delegation ID not found
|
|
219
|
+
*/
|
|
220
|
+
async recordPickup(delegationId, pickedUpBy, pickedUpAt) {
|
|
221
|
+
const existing = this.delegations.get(delegationId);
|
|
222
|
+
if (!existing) {
|
|
223
|
+
throw new Error(`Delegation ID ${delegationId} not found`);
|
|
224
|
+
}
|
|
225
|
+
const event = {
|
|
226
|
+
...existing,
|
|
227
|
+
pickedUpBy,
|
|
228
|
+
pickedUpAt: pickedUpAt ?? new Date().toISOString(),
|
|
229
|
+
};
|
|
230
|
+
await this._appendEvent(event);
|
|
231
|
+
this._applyEvent(event);
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Gets all delegations for a parent WU.
|
|
235
|
+
*
|
|
236
|
+
* @param {string} parentWuId - Parent WU ID
|
|
237
|
+
* @returns {DelegationEvent[]} Array of delegation events
|
|
238
|
+
*
|
|
239
|
+
* @example
|
|
240
|
+
* const delegations = store.getByParent('WU-1000');
|
|
241
|
+
*/
|
|
242
|
+
getByParent(parentWuId) {
|
|
243
|
+
const delegationIds = this.byParent.get(parentWuId) ?? [];
|
|
244
|
+
return delegationIds
|
|
245
|
+
.map((id) => this.delegations.get(id))
|
|
246
|
+
.filter((event) => event !== undefined);
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Gets delegation for a target WU.
|
|
250
|
+
*
|
|
251
|
+
* @param {string} targetWuId - Target WU ID
|
|
252
|
+
* @returns {DelegationEvent | null} Delegation event or null
|
|
253
|
+
*
|
|
254
|
+
* @example
|
|
255
|
+
* const delegation = store.getByTarget('WU-1001');
|
|
256
|
+
*/
|
|
257
|
+
getByTarget(targetWuId) {
|
|
258
|
+
const delegationId = this.byTarget.get(targetWuId);
|
|
259
|
+
if (!delegationId) {
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
262
|
+
return this.delegations.get(delegationId) ?? null;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Gets all pending delegations.
|
|
266
|
+
*
|
|
267
|
+
* @returns {DelegationEvent[]} Array of pending delegation events
|
|
268
|
+
*
|
|
269
|
+
* @example
|
|
270
|
+
* const pending = store.getPendingDelegations();
|
|
271
|
+
*/
|
|
272
|
+
getPendingDelegations() {
|
|
273
|
+
return Array.from(this.delegations.values()).filter((delegation) => delegation.status === DelegationStatus.PENDING);
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Gets all delegations as an array.
|
|
277
|
+
*
|
|
278
|
+
* @returns {DelegationEvent[]} Array of all delegation events
|
|
279
|
+
*
|
|
280
|
+
* @example
|
|
281
|
+
* const allDelegations = store.getAllDelegations();
|
|
282
|
+
*/
|
|
283
|
+
getAllDelegations() {
|
|
284
|
+
return Array.from(this.delegations.values());
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Gets delegation by ID.
|
|
288
|
+
*
|
|
289
|
+
* @param {string} delegationId - Delegation ID
|
|
290
|
+
* @returns {DelegationEvent | null} Delegation event or null
|
|
291
|
+
*
|
|
292
|
+
* @example
|
|
293
|
+
* const delegation = store.getById('dlg-a1b2');
|
|
294
|
+
*/
|
|
295
|
+
getById(delegationId) {
|
|
296
|
+
return this.delegations.get(delegationId) ?? null;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=delegation-registry-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegation-registry-store.js","sourceRoot":"","sources":["../src/delegation-registry-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delegation Tree Builder (WU-1674)
|
|
3
|
+
*
|
|
4
|
+
* Builds and formats delegation trees for visualization.
|
|
5
|
+
*/
|
|
6
|
+
import { DelegationStatus } from './delegation-registry-schema.js';
|
|
7
|
+
interface DelegationRecord {
|
|
8
|
+
id: string;
|
|
9
|
+
parentWuId: string;
|
|
10
|
+
targetWuId: string;
|
|
11
|
+
lane: string;
|
|
12
|
+
status: string;
|
|
13
|
+
delegatedAt: string;
|
|
14
|
+
completedAt: string | null;
|
|
15
|
+
pickedUpAt?: string;
|
|
16
|
+
pickedUpBy?: string;
|
|
17
|
+
}
|
|
18
|
+
interface DelegationTreeNode {
|
|
19
|
+
wuId: string;
|
|
20
|
+
delegationId: string | null;
|
|
21
|
+
status: string | null;
|
|
22
|
+
lane: string | null;
|
|
23
|
+
delegatedAt: string | null;
|
|
24
|
+
children: DelegationTreeNode[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Status indicators for terminal output.
|
|
28
|
+
*/
|
|
29
|
+
export declare const STATUS_INDICATORS: Readonly<{
|
|
30
|
+
[DelegationStatus.COMPLETED]: "✓";
|
|
31
|
+
pending: "○";
|
|
32
|
+
timeout: "⏱";
|
|
33
|
+
crashed: "✗";
|
|
34
|
+
escalated: "!";
|
|
35
|
+
}>;
|
|
36
|
+
/**
|
|
37
|
+
* Builds a delegation tree from flat delegation events.
|
|
38
|
+
*/
|
|
39
|
+
export declare function buildDelegationTree(delegations: DelegationRecord[], rootWuId: string): DelegationTreeNode;
|
|
40
|
+
/**
|
|
41
|
+
* Formats a delegation tree for terminal display.
|
|
42
|
+
*/
|
|
43
|
+
export declare function formatDelegationTree(tree: DelegationTreeNode): string;
|
|
44
|
+
/**
|
|
45
|
+
* Gets all delegations for a WU (direct + descendants).
|
|
46
|
+
*/
|
|
47
|
+
export declare function getDelegationsByWU(wuId: string, baseDir: string): Promise<DelegationRecord[]>;
|
|
48
|
+
/**
|
|
49
|
+
* Gets all delegations for an initiative.
|
|
50
|
+
*/
|
|
51
|
+
export declare function getDelegationsByInitiative(initiativeId: string, registryDir: string, wuDir: string): Promise<DelegationRecord[]>;
|
|
52
|
+
/**
|
|
53
|
+
* Converts a delegation tree to JSON.
|
|
54
|
+
*/
|
|
55
|
+
export declare function treeToJSON(tree: DelegationTreeNode): any;
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=delegation-tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegation-tree.d.ts","sourceRoot":"","sources":["../src/delegation-tree.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAcnE,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,kBAAkB,EAAE,CAAC;CAChC;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB;IAE5B,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAU;;;;;EAItC,CAAC;AAuBH;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,gBAAgB,EAAE,EAC/B,QAAQ,EAAE,MAAM,GACf,kBAAkB,CAmCpB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CA4BrE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAwC7B;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAmB7B;AA+BD;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,kBAAkB,OASlD"}
|