@lumenflow/core 2.18.3 → 2.20.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/arg-parser.js +2 -2
- package/dist/arg-parser.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/context/wu-state-reader.d.ts +2 -0
- package/dist/context/wu-state-reader.d.ts.map +1 -1
- package/dist/context/wu-state-reader.js +3 -0
- package/dist/context/wu-state-reader.js.map +1 -1
- 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 +16 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -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 +19 -4
- 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/sandbox-allowlist.d.ts +16 -0
- package/dist/sandbox-allowlist.d.ts.map +1 -0
- package/dist/sandbox-allowlist.js +75 -0
- package/dist/sandbox-allowlist.js.map +1 -0
- package/dist/sandbox-backend-linux.d.ts +6 -0
- package/dist/sandbox-backend-linux.d.ts.map +1 -0
- package/dist/sandbox-backend-linux.js +65 -0
- package/dist/sandbox-backend-linux.js.map +1 -0
- package/dist/sandbox-backend-macos.d.ts +6 -0
- package/dist/sandbox-backend-macos.d.ts.map +1 -0
- package/dist/sandbox-backend-macos.js +64 -0
- package/dist/sandbox-backend-macos.js.map +1 -0
- package/dist/sandbox-backend-windows.d.ts +6 -0
- package/dist/sandbox-backend-windows.d.ts.map +1 -0
- package/dist/sandbox-backend-windows.js +28 -0
- package/dist/sandbox-backend-windows.js.map +1 -0
- package/dist/sandbox-profile.d.ts +53 -0
- package/dist/sandbox-profile.d.ts.map +1 -0
- package/dist/sandbox-profile.js +62 -0
- package/dist/sandbox-profile.js.map +1 -0
- 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 +11 -11
- 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 +6 -2
- package/dist/schemas/wu-lifecycle-schemas.js.map +1 -1
- package/dist/spawn-strategy.d.ts +1 -1
- package/dist/spawn-strategy.js +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/validation/types.d.ts +2 -0
- package/dist/validation/types.d.ts.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 +4 -2
- package/dist/wu-context-constants.d.ts.map +1 -1
- package/dist/wu-context-constants.js +4 -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-preflight.d.ts +8 -0
- package/dist/wu-done-preflight.d.ts.map +1 -1
- package/dist/wu-done-preflight.js +17 -1
- package/dist/wu-done-preflight.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 +53 -37
- package/dist/wu-lint.d.ts.map +1 -1
- package/dist/wu-lint.js +95 -105
- 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-preflight-validators.d.ts +28 -77
- package/dist/wu-preflight-validators.d.ts.map +1 -1
- package/dist/wu-preflight-validators.js +86 -130
- package/dist/wu-preflight-validators.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-rules-core.d.ts +95 -0
- package/dist/wu-rules-core.d.ts.map +1 -0
- package/dist/wu-rules-core.js +399 -0
- package/dist/wu-rules-core.js.map +1 -0
- package/dist/wu-rules-engine.d.ts +29 -0
- package/dist/wu-rules-engine.d.ts.map +1 -0
- package/dist/wu-rules-engine.js +59 -0
- package/dist/wu-rules-engine.js.map +1 -0
- package/dist/wu-rules-resolvers.d.ts +19 -0
- package/dist/wu-rules-resolvers.d.ts.map +1 -0
- package/dist/wu-rules-resolvers.js +208 -0
- package/dist/wu-rules-resolvers.js.map +1 -0
- package/dist/wu-schema.d.ts +24 -9
- package/dist/wu-schema.d.ts.map +1 -1
- package/dist/wu-schema.js +14 -1
- package/dist/wu-schema.js.map +1 -1
- 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 +14 -11
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delegation Escalation Module (WU-1952, WU-1967)
|
|
3
|
+
*
|
|
4
|
+
* WU-1967: Replaced Bug WU creation with memory bus signalling.
|
|
5
|
+
* Signals orchestrator inbox instead of creating human-in-loop Bug WUs.
|
|
6
|
+
*
|
|
7
|
+
* Escalation Flow:
|
|
8
|
+
* 1. recoverStuckDelegation() returns { recovered: false, action: ESCALATED_STUCK }
|
|
9
|
+
* 2. escalateStuckDelegation() signals orchestrator via memory bus
|
|
10
|
+
* 3. Delegation status updated to ESCALATED (prevents duplicate signals)
|
|
11
|
+
* 4. Orchestrator decides: retry (1st), block (2nd), human escalate (3rd+)
|
|
12
|
+
*
|
|
13
|
+
* Library-First Note: This is project-specific delegation escalation code for
|
|
14
|
+
* PatientPath's custom delegation-registry.jsonl and memory bus patterns.
|
|
15
|
+
* No external library exists for this domain-specific agent lifecycle management.
|
|
16
|
+
*
|
|
17
|
+
* @see {@link packages/@lumenflow/cli/src/lib/__tests__/delegation-escalation.test.ts} - Tests
|
|
18
|
+
* @see {@link packages/@lumenflow/cli/src/lib/delegation-recovery.ts} - Recovery logic
|
|
19
|
+
* @see {@link packages/@lumenflow/cli/src/lib/mem-signal-core.ts} - Signal creation
|
|
20
|
+
*/
|
|
21
|
+
import fs from 'node:fs/promises';
|
|
22
|
+
import path from 'node:path';
|
|
23
|
+
import { DelegationRegistryStore } from './delegation-registry-store.js';
|
|
24
|
+
import { DelegationStatus } from './delegation-registry-schema.js';
|
|
25
|
+
import { RECOVERY_DIR_NAME } from './delegation-recovery.js';
|
|
26
|
+
import { LUMENFLOW_PATHS } from './wu-constants.js';
|
|
27
|
+
let createSignal = null;
|
|
28
|
+
try {
|
|
29
|
+
const mod = await import('@lumenflow/memory/signal');
|
|
30
|
+
createSignal = mod.createSignal;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// @lumenflow/memory not available - signal features disabled
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Log prefix for delegation-escalation messages
|
|
37
|
+
*/
|
|
38
|
+
const LOG_PREFIX = '[delegation-escalation]';
|
|
39
|
+
/**
|
|
40
|
+
* Signal type for delegation failures.
|
|
41
|
+
*/
|
|
42
|
+
export const DELEGATION_FAILURE_SIGNAL_TYPE = 'delegation_failure';
|
|
43
|
+
/**
|
|
44
|
+
* Severity levels for delegation failure signals
|
|
45
|
+
*/
|
|
46
|
+
export const SignalSeverity = Object.freeze({
|
|
47
|
+
WARNING: 'warning',
|
|
48
|
+
ERROR: 'error',
|
|
49
|
+
CRITICAL: 'critical',
|
|
50
|
+
});
|
|
51
|
+
/**
|
|
52
|
+
* Suggested actions for delegation failure signals
|
|
53
|
+
*/
|
|
54
|
+
export const SuggestedAction = Object.freeze({
|
|
55
|
+
RETRY: 'retry',
|
|
56
|
+
BLOCK: 'block',
|
|
57
|
+
HUMAN_ESCALATE: 'human_escalate',
|
|
58
|
+
});
|
|
59
|
+
/**
|
|
60
|
+
* @typedef {Object} DelegationFailureSignal
|
|
61
|
+
* @property {string} type - Always 'delegation_failure'
|
|
62
|
+
* @property {string} severity - 'warning' | 'error' | 'critical'
|
|
63
|
+
* @property {string} delegation_id - Delegation ID
|
|
64
|
+
* @property {string} target_wu_id - Target WU ID
|
|
65
|
+
* @property {string} parent_wu_id - Parent WU ID (orchestrator)
|
|
66
|
+
* @property {string} lane - Lane name
|
|
67
|
+
* @property {string} recovery_action - Recovery action that triggered escalation
|
|
68
|
+
* @property {number} recovery_attempts - Number of recovery attempts
|
|
69
|
+
* @property {string|null} last_checkpoint - Last checkpoint timestamp
|
|
70
|
+
* @property {string} suggested_action - 'retry' | 'block' | 'human_escalate'
|
|
71
|
+
* @property {string} message - Human-readable message
|
|
72
|
+
*/
|
|
73
|
+
/**
|
|
74
|
+
* @typedef {Object} EscalationResult
|
|
75
|
+
* @property {string} signalId - Signal ID (e.g., 'sig-abc12345')
|
|
76
|
+
* @property {DelegationFailureSignal} signal - The signal payload
|
|
77
|
+
* @property {string} delegationStatus - Updated delegation status (ESCALATED)
|
|
78
|
+
*/
|
|
79
|
+
/**
|
|
80
|
+
* @typedef {Object} AuditLogEntry
|
|
81
|
+
* @property {string} timestamp - ISO timestamp of recovery action
|
|
82
|
+
* @property {string} delegationId - ID of the delegation being recovered
|
|
83
|
+
* @property {string} action - Recovery action taken
|
|
84
|
+
* @property {string} reason - Explanation of why action was taken
|
|
85
|
+
* @property {Object} context - Additional context
|
|
86
|
+
*/
|
|
87
|
+
/**
|
|
88
|
+
* Counts existing escalation attempts for a delegation by reading audit logs.
|
|
89
|
+
*
|
|
90
|
+
* @param {string} baseDir - Base directory
|
|
91
|
+
* @param {string} delegationId - Delegation ID to count attempts for
|
|
92
|
+
* @returns {Promise<number>} Number of previous escalation attempts
|
|
93
|
+
*/
|
|
94
|
+
async function countEscalationAttempts(baseDir, delegationId) {
|
|
95
|
+
// WU-1421: Use LUMENFLOW_PATHS.BASE for consistency
|
|
96
|
+
const recoveryDir = path.join(baseDir, LUMENFLOW_PATHS.BASE, RECOVERY_DIR_NAME);
|
|
97
|
+
try {
|
|
98
|
+
const files = await fs.readdir(recoveryDir);
|
|
99
|
+
const delegationFiles = files.filter((f) => f.startsWith(`${delegationId}-`) && f.endsWith('.json'));
|
|
100
|
+
return delegationFiles.length;
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
if (error.code === 'ENOENT') {
|
|
104
|
+
return 0;
|
|
105
|
+
}
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Determines severity and suggested action based on recovery attempts.
|
|
111
|
+
*
|
|
112
|
+
* @param {number} attempts - Number of recovery attempts
|
|
113
|
+
* @returns {{ severity: string, suggestedAction: string }}
|
|
114
|
+
*/
|
|
115
|
+
function determineEscalationLevel(attempts) {
|
|
116
|
+
if (attempts <= 1) {
|
|
117
|
+
return {
|
|
118
|
+
severity: SignalSeverity.WARNING,
|
|
119
|
+
suggestedAction: SuggestedAction.RETRY,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
else if (attempts === 2) {
|
|
123
|
+
return {
|
|
124
|
+
severity: SignalSeverity.ERROR,
|
|
125
|
+
suggestedAction: SuggestedAction.BLOCK,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
return {
|
|
130
|
+
severity: SignalSeverity.CRITICAL,
|
|
131
|
+
suggestedAction: SuggestedAction.HUMAN_ESCALATE,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Find the most recent escalation audit log for a delegation.
|
|
137
|
+
*
|
|
138
|
+
* @param {string} baseDir - Base directory
|
|
139
|
+
* @param {string} delegationId - Delegation ID to find audit log for
|
|
140
|
+
* @returns {Promise<AuditLogEntry|null>} Audit log entry or null if not found
|
|
141
|
+
*/
|
|
142
|
+
async function findEscalationAuditLog(baseDir, delegationId) {
|
|
143
|
+
// WU-1421: Use LUMENFLOW_PATHS.BASE for consistency
|
|
144
|
+
const recoveryDir = path.join(baseDir, LUMENFLOW_PATHS.BASE, RECOVERY_DIR_NAME);
|
|
145
|
+
try {
|
|
146
|
+
const files = await fs.readdir(recoveryDir);
|
|
147
|
+
// Filter files for this delegation ID, sorted by name (timestamp-based)
|
|
148
|
+
const delegationFiles = files
|
|
149
|
+
.filter((f) => f.startsWith(`${delegationId}-`) && f.endsWith('.json'))
|
|
150
|
+
.sort()
|
|
151
|
+
.reverse(); // Most recent first
|
|
152
|
+
if (delegationFiles.length === 0) {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
// Read the most recent audit log
|
|
156
|
+
const auditPath = path.join(recoveryDir, delegationFiles[0]);
|
|
157
|
+
const content = await fs.readFile(auditPath, 'utf-8');
|
|
158
|
+
return JSON.parse(content);
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
if (error.code === 'ENOENT') {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
throw error;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Builds a delegation failure signal payload.
|
|
169
|
+
*
|
|
170
|
+
* @param {Object} delegation - Delegation event data
|
|
171
|
+
* @param {AuditLogEntry} auditLog - Escalation audit log
|
|
172
|
+
* @param {number} attempts - Number of recovery attempts
|
|
173
|
+
* @returns {DelegationFailureSignal} Signal payload
|
|
174
|
+
*/
|
|
175
|
+
function buildDelegationFailureSignal(delegation, auditLog, attempts) {
|
|
176
|
+
const { severity, suggestedAction } = determineEscalationLevel(attempts);
|
|
177
|
+
const lastCheckpoint = auditLog.context.lastCheckpoint || null;
|
|
178
|
+
return {
|
|
179
|
+
type: DELEGATION_FAILURE_SIGNAL_TYPE,
|
|
180
|
+
severity,
|
|
181
|
+
delegation_id: delegation.id,
|
|
182
|
+
target_wu_id: delegation.targetWuId,
|
|
183
|
+
parent_wu_id: delegation.parentWuId,
|
|
184
|
+
lane: delegation.lane,
|
|
185
|
+
recovery_action: auditLog.action,
|
|
186
|
+
recovery_attempts: attempts,
|
|
187
|
+
last_checkpoint: lastCheckpoint,
|
|
188
|
+
suggested_action: suggestedAction,
|
|
189
|
+
message: `Delegation ${delegation.id} for ${delegation.targetWuId} stuck: ${auditLog.reason}`,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
export async function escalateStuckDelegation(delegationId, options = {}) {
|
|
193
|
+
const { baseDir = process.cwd(), dryRun = false } = options;
|
|
194
|
+
// WU-1421: Use LUMENFLOW_PATHS.STATE_DIR for consistency
|
|
195
|
+
const registryDir = path.join(baseDir, LUMENFLOW_PATHS.STATE_DIR);
|
|
196
|
+
// Load delegation registry
|
|
197
|
+
const store = new DelegationRegistryStore(registryDir);
|
|
198
|
+
try {
|
|
199
|
+
await store.load();
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
throw new Error(`Delegation ${delegationId} not found: registry unavailable`);
|
|
203
|
+
}
|
|
204
|
+
// Find the delegation
|
|
205
|
+
const delegation = store.getById(delegationId);
|
|
206
|
+
if (!delegation) {
|
|
207
|
+
throw new Error(`Delegation ${delegationId} not found in registry`);
|
|
208
|
+
}
|
|
209
|
+
// Check if signal module is available
|
|
210
|
+
if (!createSignal) {
|
|
211
|
+
throw new Error('Signal module (@lumenflow/memory) not available - cannot escalate');
|
|
212
|
+
}
|
|
213
|
+
// WU-1967: Check if already escalated (prevents duplicate signals)
|
|
214
|
+
if (delegation.status === DelegationStatus.ESCALATED) {
|
|
215
|
+
throw new Error(`Delegation ${delegationId} already escalated`);
|
|
216
|
+
}
|
|
217
|
+
// Find escalation audit log
|
|
218
|
+
const auditLog = await findEscalationAuditLog(baseDir, delegationId);
|
|
219
|
+
if (!auditLog) {
|
|
220
|
+
throw new Error(`No escalation audit log found for delegation ${delegationId}`);
|
|
221
|
+
}
|
|
222
|
+
// Count previous escalation attempts
|
|
223
|
+
const attempts = await countEscalationAttempts(baseDir, delegationId);
|
|
224
|
+
// Build signal payload
|
|
225
|
+
const signalPayload = buildDelegationFailureSignal(delegation, auditLog, attempts);
|
|
226
|
+
if (dryRun) {
|
|
227
|
+
console.log(`${LOG_PREFIX} [dry-run] Would signal orchestrator`);
|
|
228
|
+
console.log(`${LOG_PREFIX} [dry-run] Severity: ${signalPayload.severity}`);
|
|
229
|
+
console.log(`${LOG_PREFIX} [dry-run] Suggested action: ${signalPayload.suggested_action}`);
|
|
230
|
+
console.log(`${LOG_PREFIX} [dry-run] Message: ${signalPayload.message}`);
|
|
231
|
+
return {
|
|
232
|
+
signalId: 'sig-dry-run',
|
|
233
|
+
signal: signalPayload,
|
|
234
|
+
delegationStatus: DelegationStatus.ESCALATED,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
// WU-1967: Send signal to orchestrator inbox
|
|
238
|
+
console.log(`${LOG_PREFIX} Signalling orchestrator for delegation ${delegationId}`);
|
|
239
|
+
console.log(`${LOG_PREFIX} Target WU: ${delegation.targetWuId}`);
|
|
240
|
+
console.log(`${LOG_PREFIX} Severity: ${signalPayload.severity}`);
|
|
241
|
+
console.log(`${LOG_PREFIX} Suggested action: ${signalPayload.suggested_action}`);
|
|
242
|
+
// Create signal with structured message (JSON payload in message field)
|
|
243
|
+
const signalResult = await createSignal(baseDir, {
|
|
244
|
+
message: JSON.stringify(signalPayload),
|
|
245
|
+
wuId: delegation.parentWuId, // Signal targets the orchestrator (parent WU)
|
|
246
|
+
lane: delegation.lane,
|
|
247
|
+
});
|
|
248
|
+
// Update delegation status to ESCALATED (prevents duplicate signals)
|
|
249
|
+
await store.updateStatus(delegationId, DelegationStatus.ESCALATED);
|
|
250
|
+
console.log(`${LOG_PREFIX} Signal sent: ${signalResult.signal.id}`);
|
|
251
|
+
console.log(`${LOG_PREFIX} Delegation ${delegationId} status updated to ESCALATED`);
|
|
252
|
+
return {
|
|
253
|
+
signalId: signalResult.signal.id,
|
|
254
|
+
signal: signalPayload,
|
|
255
|
+
delegationStatus: DelegationStatus.ESCALATED,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=delegation-escalation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegation-escalation.js","sourceRoot":"","sources":["../src/delegation-escalation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delegation Monitor Library (WU-1948, WU-1968)
|
|
3
|
+
*
|
|
4
|
+
* Core monitoring logic for detecting stuck delegations and zombie locks.
|
|
5
|
+
* Used by orchestrate:monitor CLI command.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Analyzes delegation registry for status counts
|
|
9
|
+
* - Detects pending delegations older than threshold (stuck)
|
|
10
|
+
* - Checks lane locks for zombie PIDs
|
|
11
|
+
* - Generates recovery suggestions
|
|
12
|
+
* - WU-1968: Processes delegation_failure signals from memory bus
|
|
13
|
+
*
|
|
14
|
+
* Library-First Note: This is project-specific monitoring code for
|
|
15
|
+
* PatientPath's delegation-registry.jsonl and lane-lock files. No external
|
|
16
|
+
* library exists for this custom format.
|
|
17
|
+
*
|
|
18
|
+
* @see {@link packages/@lumenflow/cli/src/__tests__/orchestrate-monitor.test.ts} - Tests
|
|
19
|
+
* @see {@link packages/@lumenflow/cli/src/lib/__tests__/delegation-monitor.test.ts} - Signal handler tests
|
|
20
|
+
* @see {@link packages/@lumenflow/cli/src/orchestrate-monitor.ts} - CLI entry point
|
|
21
|
+
* @see {@link packages/@lumenflow/cli/src/lib/delegation-registry-store.ts} - Registry storage
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* Default threshold for stuck delegation detection (in minutes)
|
|
25
|
+
*/
|
|
26
|
+
export declare const DEFAULT_THRESHOLD_MINUTES = 30;
|
|
27
|
+
/**
|
|
28
|
+
* Log prefix for delegation-monitor messages
|
|
29
|
+
*/
|
|
30
|
+
export declare const LOG_PREFIX = "[delegation-monitor]";
|
|
31
|
+
/**
|
|
32
|
+
* @typedef {Object} SpawnAnalysis
|
|
33
|
+
* @property {number} pending - Count of pending delegations
|
|
34
|
+
* @property {number} completed - Count of completed delegations
|
|
35
|
+
* @property {number} timeout - Count of timed out delegations
|
|
36
|
+
* @property {number} crashed - Count of crashed delegations
|
|
37
|
+
* @property {number} total - Total delegation count
|
|
38
|
+
*/
|
|
39
|
+
/**
|
|
40
|
+
* @typedef {Object} StuckSpawnInfo
|
|
41
|
+
* @property {import('./delegation-registry-schema.js').DelegationEvent} delegation - The stuck delegation event
|
|
42
|
+
* @property {number} ageMinutes - Age of delegation in minutes
|
|
43
|
+
* @property {string|null} lastCheckpoint - Last checkpoint timestamp (if available from memory layer)
|
|
44
|
+
*/
|
|
45
|
+
/**
|
|
46
|
+
* @typedef {Object} ZombieLockInfo
|
|
47
|
+
* @property {string} wuId - WU ID that holds the zombie lock
|
|
48
|
+
* @property {string} lane - Lane name
|
|
49
|
+
* @property {number} pid - Process ID (no longer running)
|
|
50
|
+
* @property {string} timestamp - When lock was acquired
|
|
51
|
+
*/
|
|
52
|
+
/**
|
|
53
|
+
* @typedef {Object} Suggestion
|
|
54
|
+
* @property {string} command - Suggested command to run
|
|
55
|
+
* @property {string} reason - Explanation of why this is suggested
|
|
56
|
+
*/
|
|
57
|
+
/**
|
|
58
|
+
* @typedef {Object} MonitorResult
|
|
59
|
+
* @property {SpawnAnalysis} analysis - Delegation status counts
|
|
60
|
+
* @property {StuckSpawnInfo[]} stuckDelegations - List of stuck delegations
|
|
61
|
+
* @property {ZombieLockInfo[]} zombieLocks - List of zombie locks
|
|
62
|
+
* @property {Suggestion[]} suggestions - Recovery suggestions
|
|
63
|
+
*/
|
|
64
|
+
/**
|
|
65
|
+
* @typedef {Object} RecoveryResultInfo
|
|
66
|
+
* @property {string} delegationId - ID of the delegation that was processed
|
|
67
|
+
* @property {string} targetWuId - Target WU ID for the delegation
|
|
68
|
+
* @property {string} action - Recovery action taken (from RecoveryAction)
|
|
69
|
+
* @property {boolean} recovered - Whether auto-recovery was successful
|
|
70
|
+
* @property {string} reason - Human-readable explanation
|
|
71
|
+
* @property {Object} [escalation] - Escalation info if action is ESCALATED_STUCK
|
|
72
|
+
* @property {string} [escalation.bugWuId] - Bug WU ID created for escalation
|
|
73
|
+
* @property {string} [escalation.title] - Bug WU title
|
|
74
|
+
*/
|
|
75
|
+
/**
|
|
76
|
+
* Analyzes delegation events and returns status counts.
|
|
77
|
+
*
|
|
78
|
+
* @param {import('./delegation-registry-schema.js').DelegationEvent[]} delegations - Array of delegation events
|
|
79
|
+
* @returns {SpawnAnalysis} Status counts
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* const analysis = analyzeDelegations(delegations);
|
|
83
|
+
* console.log(`Pending: ${analysis.pending}, Completed: ${analysis.completed}`);
|
|
84
|
+
*/
|
|
85
|
+
export declare function analyzeDelegations(delegations: any): {
|
|
86
|
+
pending: number;
|
|
87
|
+
completed: number;
|
|
88
|
+
timeout: number;
|
|
89
|
+
crashed: number;
|
|
90
|
+
total: any;
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Detects pending delegations that have been running longer than the threshold.
|
|
94
|
+
*
|
|
95
|
+
* @param {import('./delegation-registry-schema.js').DelegationEvent[]} delegations - Array of delegation events
|
|
96
|
+
* @param {number} [thresholdMinutes=DEFAULT_THRESHOLD_MINUTES] - Threshold in minutes
|
|
97
|
+
* @returns {StuckSpawnInfo[]} Array of stuck delegation info
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* const stuck = detectStuckDelegations(delegations, 30);
|
|
101
|
+
* for (const info of stuck) {
|
|
102
|
+
* console.log(`${info.delegation.targetWuId} stuck for ${info.ageMinutes} minutes`);
|
|
103
|
+
* }
|
|
104
|
+
*/
|
|
105
|
+
export declare function detectStuckDelegations(delegations: any, thresholdMinutes?: number): any[];
|
|
106
|
+
/**
|
|
107
|
+
* Checks lane lock files for zombie locks (dead PIDs).
|
|
108
|
+
*
|
|
109
|
+
* @param {SpawnMonitorBaseDirOptions} [options] - Options
|
|
110
|
+
* @returns {Promise<ZombieLockInfo[]>} Array of zombie lock info
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* const zombies = await checkZombieLocks();
|
|
114
|
+
* for (const lock of zombies) {
|
|
115
|
+
* console.log(`Zombie lock: ${lock.lane} (PID ${lock.pid})`);
|
|
116
|
+
* }
|
|
117
|
+
*/
|
|
118
|
+
interface SpawnMonitorBaseDirOptions {
|
|
119
|
+
/** Base directory (defaults to process.cwd()) */
|
|
120
|
+
baseDir?: string;
|
|
121
|
+
}
|
|
122
|
+
export declare function checkZombieLocks(options?: SpawnMonitorBaseDirOptions): Promise<any[]>;
|
|
123
|
+
/**
|
|
124
|
+
* Generates recovery suggestions for stuck delegations and zombie locks.
|
|
125
|
+
*
|
|
126
|
+
* @param {StuckSpawnInfo[]} stuckDelegations - Array of stuck delegation info
|
|
127
|
+
* @param {ZombieLockInfo[]} zombieLocks - Array of zombie lock info
|
|
128
|
+
* @returns {Suggestion[]} Array of suggestions
|
|
129
|
+
*
|
|
130
|
+
* @example
|
|
131
|
+
* const suggestions = generateSuggestions(stuckDelegations, zombieLocks);
|
|
132
|
+
* for (const s of suggestions) {
|
|
133
|
+
* console.log(`${s.reason}\n ${s.command}`);
|
|
134
|
+
* }
|
|
135
|
+
*/
|
|
136
|
+
export declare function generateSuggestions(stuckDelegations: any, zombieLocks: any): any[];
|
|
137
|
+
/**
|
|
138
|
+
* Formats monitor output for display.
|
|
139
|
+
*
|
|
140
|
+
* @param {MonitorResult} result - Monitor result to format
|
|
141
|
+
* @returns {string} Formatted output string
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* const output = formatMonitorOutput(result);
|
|
145
|
+
* console.log(output);
|
|
146
|
+
*/
|
|
147
|
+
export declare function formatMonitorOutput(result: any): string;
|
|
148
|
+
/**
|
|
149
|
+
* Runs recovery for stuck delegations by calling recoverStuckDelegation for each.
|
|
150
|
+
* When a delegation is escalated (action=ESCALATED_STUCK), chains to escalateStuckDelegation.
|
|
151
|
+
*
|
|
152
|
+
* @param {StuckSpawnInfo[]} stuckDelegations - Array of stuck delegation info
|
|
153
|
+
* @param {RunRecoveryOptions} [options] - Options
|
|
154
|
+
* @returns {Promise<RecoveryResultInfo[]>} Array of recovery results
|
|
155
|
+
*
|
|
156
|
+
* @example
|
|
157
|
+
* const results = await runRecovery(stuckDelegations, { baseDir: '/path/to/project' });
|
|
158
|
+
* for (const result of results) {
|
|
159
|
+
* console.log(`${result.delegationId}: ${result.action}`);
|
|
160
|
+
* }
|
|
161
|
+
*/
|
|
162
|
+
interface RunRecoveryOptions extends SpawnMonitorBaseDirOptions {
|
|
163
|
+
/** If true, escalations return spec only */
|
|
164
|
+
dryRun?: boolean;
|
|
165
|
+
}
|
|
166
|
+
export declare function runRecovery(stuckDelegations: any, options?: RunRecoveryOptions): Promise<any[]>;
|
|
167
|
+
/**
|
|
168
|
+
* Formats recovery results for display.
|
|
169
|
+
*
|
|
170
|
+
* @param {RecoveryResultInfo[]} results - Array of recovery results
|
|
171
|
+
* @returns {string} Formatted output string
|
|
172
|
+
*
|
|
173
|
+
* @example
|
|
174
|
+
* const output = formatRecoveryResults(results);
|
|
175
|
+
* console.log(output);
|
|
176
|
+
*/
|
|
177
|
+
export declare function formatRecoveryResults(results: any): string;
|
|
178
|
+
/**
|
|
179
|
+
* Log prefix for signal handler messages
|
|
180
|
+
*/
|
|
181
|
+
export declare const SIGNAL_HANDLER_LOG_PREFIX = "[delegation-signal-handler]";
|
|
182
|
+
/**
|
|
183
|
+
* Response actions for delegation failure signals
|
|
184
|
+
*/
|
|
185
|
+
export declare const SignalResponseAction: Readonly<{
|
|
186
|
+
RETRY: "retry";
|
|
187
|
+
BLOCK: "block";
|
|
188
|
+
BUG_WU: "bug_wu";
|
|
189
|
+
NONE: "none";
|
|
190
|
+
}>;
|
|
191
|
+
/**
|
|
192
|
+
* Processes delegation_failure signals from the memory bus.
|
|
193
|
+
*
|
|
194
|
+
* WU-1968: Orchestrator signal handler for delegation_failure signals.
|
|
195
|
+
*
|
|
196
|
+
* Response logic:
|
|
197
|
+
* - First failure (suggested_action=retry): logs warning, suggests retry
|
|
198
|
+
* - Second failure (suggested_action=block): marks WU blocked with reason
|
|
199
|
+
* - Third+ failure (suggested_action=human_escalate): creates Bug WU
|
|
200
|
+
*
|
|
201
|
+
* @param {RunRecoveryOptions} options - Options
|
|
202
|
+
* @returns {Promise<SignalProcessingResult>} Processing result
|
|
203
|
+
*
|
|
204
|
+
* @example
|
|
205
|
+
* const result = await processDelegationFailureSignals({ baseDir: '/path/to/project' });
|
|
206
|
+
* console.log(`Processed ${result.signalCount} signals`);
|
|
207
|
+
* for (const response of result.processed) {
|
|
208
|
+
* console.log(`${response.targetWuId}: ${response.action}`);
|
|
209
|
+
* }
|
|
210
|
+
*/
|
|
211
|
+
export declare function processDelegationFailureSignals(options?: RunRecoveryOptions): Promise<{
|
|
212
|
+
processed: any[];
|
|
213
|
+
signalCount: number;
|
|
214
|
+
retryCount: number;
|
|
215
|
+
blockCount: number;
|
|
216
|
+
bugWuCount: number;
|
|
217
|
+
}>;
|
|
218
|
+
/**
|
|
219
|
+
* Formats signal handler output for display.
|
|
220
|
+
*
|
|
221
|
+
* @param {SignalProcessingResult} result - Processing result
|
|
222
|
+
* @returns {string} Formatted output string
|
|
223
|
+
*
|
|
224
|
+
* @example
|
|
225
|
+
* const output = formatSignalHandlerOutput(result);
|
|
226
|
+
* console.log(output);
|
|
227
|
+
*/
|
|
228
|
+
export declare function formatSignalHandlerOutput(result: any): string;
|
|
229
|
+
export {};
|
|
230
|
+
//# sourceMappingURL=delegation-monitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegation-monitor.d.ts","sourceRoot":"","sources":["../src/delegation-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AA4BH;;GAEG;AACH,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C;;GAEG;AACH,eAAO,MAAM,UAAU,yBAAyB,CAAC;AAEjD;;;;;;;GAOG;AAEH;;;;;GAKG;AAEH;;;;;;GAMG;AAEH;;;;GAIG;AAEH;;;;;;GAMG;AAEH;;;;;;;;;;GAUG;AAEH;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,KAAA;;;;;;EA2B7C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,KAAA,EAAE,gBAAgB,SAA4B,SA4B/F;AAED;;;;;;;;;;;GAWG;AACH,UAAU,0BAA0B;IAClC,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,gBAAgB,CAAC,OAAO,GAAE,0BAA+B,kBAuC9E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,gBAAgB,KAAA,EAAE,WAAW,KAAA,SAuBhE;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,KAAA,UAkEzC;AAED;;;;;;;;;;;;;GAaG;AACH,UAAU,kBAAmB,SAAQ,0BAA0B;IAC7D,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,WAAW,CAAC,gBAAgB,KAAA,EAAE,OAAO,GAAE,kBAAuB,kBA2CnF;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,KAAA,UAkD5C;AAMD;;GAEG;AACH,eAAO,MAAM,yBAAyB,gCAAgC,CAAC;AAEvE;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;EAK/B,CAAC;AAuIH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,+BAA+B,CAAC,OAAO,GAAE,kBAAuB;;;;;;GAwHrF;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,KAAA,UAmC/C"}
|