@lumenflow/cli 5.3.2 → 5.4.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/README.md +20 -18
- package/dist/agent-session.js +21 -0
- package/dist/agent-session.js.map +1 -1
- package/dist/commands/integrate.js +25 -1
- package/dist/commands/integrate.js.map +1 -1
- package/dist/hooks/enforcement-generator.js +14 -8
- package/dist/hooks/enforcement-generator.js.map +1 -1
- package/dist/hooks/enforcement-sync.js +2 -1
- package/dist/hooks/enforcement-sync.js.map +1 -1
- package/dist/hooks/generators/index.js +1 -0
- package/dist/hooks/generators/index.js.map +1 -1
- package/dist/hooks/generators/signal-received.js +4 -0
- package/dist/hooks/generators/signal-received.js.map +1 -0
- package/dist/mem-converged.js +101 -0
- package/dist/mem-converged.js.map +1 -0
- package/dist/mem-inbox.js +85 -22
- package/dist/mem-inbox.js.map +1 -1
- package/dist/mem-roster.js +11 -1
- package/dist/mem-roster.js.map +1 -1
- package/dist/mem-signal.js +162 -16
- package/dist/mem-signal.js.map +1 -1
- package/dist/mem-watch.js +207 -0
- package/dist/mem-watch.js.map +1 -0
- package/dist/public-manifest.js +14 -0
- package/dist/public-manifest.js.map +1 -1
- package/dist/session-cross-link.js +14 -2
- package/dist/session-cross-link.js.map +1 -1
- package/dist/sidecar-manager.js +25 -0
- package/dist/sidecar-manager.js.map +1 -1
- package/dist/signal-hook.js +351 -0
- package/dist/signal-hook.js.map +1 -0
- package/dist/wu-prep.js +94 -1
- package/dist/wu-prep.js.map +1 -1
- package/dist/wu-spawn-prompt-builders.js.map +1 -1
- package/dist/wu-spawn-strategy-resolver.js +46 -4
- package/dist/wu-spawn-strategy-resolver.js.map +1 -1
- package/package.json +13 -11
- package/packs/agent-runtime/auto-session-integration.ts +14 -0
- package/packs/agent-runtime/package.json +1 -1
- package/packs/agent-runtime/session-schema.ts +44 -0
- package/packs/sidekick/package.json +1 -1
- package/packs/software-delivery/manifest.ts +3 -0
- package/packs/software-delivery/manifest.yaml +7 -0
- package/packs/software-delivery/package.json +1 -1
- package/packs/software-delivery/tool-impl/memory-tools.ts +56 -1
- package/packs/software-delivery/tool-impl/runtime-cli-adapter.ts +1 -0
- package/templates/core/AGENTS.md.template +19 -1
- package/templates/core/LUMENFLOW.md.template +17 -0
- package/templates/core/ai/onboarding/agent-safety-card.md.template +16 -0
- package/templates/core/ai/onboarding/vendor-support.md.template +9 -9
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Copyright (c) 2026 Hellmai Ltd
|
|
3
|
+
// SPDX-License-Identifier: LicenseRef-LumenFlow-Proprietary
|
|
4
|
+
import fs from 'node:fs/promises';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { A2ASignalV1Schema } from '@lumenflow/control-plane-sdk/a2a';
|
|
7
|
+
import { CLAUDE_HOOKS, ENV_VARS, LUMENFLOW_PATHS } from '@lumenflow/core/wu-constants';
|
|
8
|
+
import { runCLI } from './cli-entry-point.js';
|
|
9
|
+
import { collectActiveSessionRecords } from './session-cross-link.js';
|
|
10
|
+
export const SIGNAL_HOOK_EVENT_NAME = 'signal:received';
|
|
11
|
+
export const SIGNAL_HOOK_QUEUE_DIR = path.join(LUMENFLOW_PATHS.STATE_DIR, 'signal-hooks');
|
|
12
|
+
export const SIGNAL_RECEIVED_HOOK_SCRIPT = CLAUDE_HOOKS.SCRIPTS.SIGNAL_RECEIVED;
|
|
13
|
+
const SESSION_CURRENT_FILE = LUMENFLOW_PATHS.SESSION_CURRENT;
|
|
14
|
+
const INTERRUPT_RANK = {
|
|
15
|
+
urgent: 3,
|
|
16
|
+
immediate: 3,
|
|
17
|
+
priority: 2,
|
|
18
|
+
soon: 2,
|
|
19
|
+
advisory: 1,
|
|
20
|
+
};
|
|
21
|
+
function sanitizeQueueName(sessionId) {
|
|
22
|
+
return sessionId.replace(/[^A-Za-z0-9_.:-]/g, '_');
|
|
23
|
+
}
|
|
24
|
+
function nonEmptyString(value) {
|
|
25
|
+
return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;
|
|
26
|
+
}
|
|
27
|
+
function sessionIdentities(session) {
|
|
28
|
+
return [session.session_id, session.agent_identity, session.display_name].filter((value) => typeof value === 'string' && value.length > 0);
|
|
29
|
+
}
|
|
30
|
+
function identityForReceipt(session) {
|
|
31
|
+
return session.agent_identity ?? session.session_id ?? session.wu_id;
|
|
32
|
+
}
|
|
33
|
+
function normalizeOrigin(origin) {
|
|
34
|
+
return origin === 'remote' ? 'remote' : 'local';
|
|
35
|
+
}
|
|
36
|
+
function normalizeRecipients(signal) {
|
|
37
|
+
if (signal.recipients && signal.recipients.length > 0) {
|
|
38
|
+
return Array.from(new Set(signal.recipients.map((recipient) => recipient.trim()).filter(Boolean)));
|
|
39
|
+
}
|
|
40
|
+
return signal.target_agent ? [signal.target_agent] : [];
|
|
41
|
+
}
|
|
42
|
+
function matchesRecipient(session, recipients) {
|
|
43
|
+
const identitySet = new Set(sessionIdentities(session));
|
|
44
|
+
return recipients.some((recipient) => identitySet.has(recipient));
|
|
45
|
+
}
|
|
46
|
+
function eventSortRank(event) {
|
|
47
|
+
return INTERRUPT_RANK[event.signal.interrupt_class ?? 'advisory'] ?? 0;
|
|
48
|
+
}
|
|
49
|
+
function parseEvent(line) {
|
|
50
|
+
try {
|
|
51
|
+
const parsed = JSON.parse(line);
|
|
52
|
+
if (parsed.event !== SIGNAL_HOOK_EVENT_NAME ||
|
|
53
|
+
parsed.schema_version !== 'A2A.V1' ||
|
|
54
|
+
typeof parsed.signal_id !== 'string' ||
|
|
55
|
+
typeof parsed.recipient_session_id !== 'string' ||
|
|
56
|
+
typeof parsed.recipient_identity !== 'string' ||
|
|
57
|
+
typeof parsed.dedupe_key !== 'string') {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
A2ASignalV1Schema.parse(parsed.signal);
|
|
61
|
+
return parsed;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function buildDedupeKey(signal, session) {
|
|
68
|
+
const sessionId = session.session_id ?? identityForReceipt(session);
|
|
69
|
+
return `${sessionId}:${signal.idempotency_key ?? signal.signal_id}`;
|
|
70
|
+
}
|
|
71
|
+
function buildDeliveryId(dedupeKey) {
|
|
72
|
+
return `sigdel-${Buffer.from(dedupeKey).toString('base64url').slice(0, 16)}`;
|
|
73
|
+
}
|
|
74
|
+
function buildNextAction(signal) {
|
|
75
|
+
if (signal.requires_ack !== true) {
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
const scope = signal.wu_id ? ` --wu ${signal.wu_id}` : '';
|
|
79
|
+
return {
|
|
80
|
+
requires_ack: true,
|
|
81
|
+
reply_to: signal.signal_id,
|
|
82
|
+
ack_command: `pnpm mem:signal 'Agreed'${scope} --reply-to ${signal.signal_id} --intent AGREE`,
|
|
83
|
+
reject_command: `pnpm mem:signal 'Rejected: <reason>'${scope} --reply-to ${signal.signal_id} --intent REJECT`,
|
|
84
|
+
prep_gate: 'wu:prep blocks until this signal is answered with AGREE or REJECT.',
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function buildEvent(signal, session, deliveredAt) {
|
|
88
|
+
const sessionId = session.session_id;
|
|
89
|
+
if (!sessionId) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
const dedupeKey = buildDedupeKey(signal, session);
|
|
93
|
+
const nextAction = buildNextAction(signal);
|
|
94
|
+
return {
|
|
95
|
+
event: SIGNAL_HOOK_EVENT_NAME,
|
|
96
|
+
schema_version: 'A2A.V1',
|
|
97
|
+
signal,
|
|
98
|
+
signal_id: signal.signal_id,
|
|
99
|
+
recipient_session_id: sessionId,
|
|
100
|
+
recipient_identity: identityForReceipt(session),
|
|
101
|
+
...(session.display_name ? { recipient_display_name: session.display_name } : {}),
|
|
102
|
+
delivered_at: deliveredAt,
|
|
103
|
+
delivery_id: buildDeliveryId(dedupeKey),
|
|
104
|
+
dedupe_key: dedupeKey,
|
|
105
|
+
...(nextAction ? { next_action: nextAction } : {}),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
export function getSignalHookQueuePath(baseDir, sessionId) {
|
|
109
|
+
return path.join(baseDir, SIGNAL_HOOK_QUEUE_DIR, `${sanitizeQueueName(sessionId)}.jsonl`);
|
|
110
|
+
}
|
|
111
|
+
export function buildA2ASignalForHook(signal) {
|
|
112
|
+
const payload = {
|
|
113
|
+
schema_version: 'A2A.V1',
|
|
114
|
+
signal_id: signal.signal_id ?? signal.id,
|
|
115
|
+
sender_identity: signal.sender_identity ?? signal.sender ?? 'system',
|
|
116
|
+
recipients: normalizeRecipients(signal),
|
|
117
|
+
message: signal.message,
|
|
118
|
+
created_at: signal.created_at,
|
|
119
|
+
origin: normalizeOrigin(signal.origin),
|
|
120
|
+
};
|
|
121
|
+
if (signal.workspace_id)
|
|
122
|
+
payload.workspace_id = signal.workspace_id;
|
|
123
|
+
if (signal.thread_id)
|
|
124
|
+
payload.thread_id = signal.thread_id;
|
|
125
|
+
if (signal.reply_to)
|
|
126
|
+
payload.reply_to = signal.reply_to;
|
|
127
|
+
if (signal.intent)
|
|
128
|
+
payload.intent = signal.intent;
|
|
129
|
+
if (signal.interrupt_class)
|
|
130
|
+
payload.interrupt_class = signal.interrupt_class;
|
|
131
|
+
if (signal.requires_ack !== undefined)
|
|
132
|
+
payload.requires_ack = signal.requires_ack;
|
|
133
|
+
if (signal.idempotency_key)
|
|
134
|
+
payload.idempotency_key = signal.idempotency_key;
|
|
135
|
+
if (signal.wu_id)
|
|
136
|
+
payload.wu_id = signal.wu_id;
|
|
137
|
+
if (signal.initiative)
|
|
138
|
+
payload.initiative = signal.initiative;
|
|
139
|
+
if (signal.lane)
|
|
140
|
+
payload.lane = signal.lane;
|
|
141
|
+
if (signal.role)
|
|
142
|
+
payload.role = signal.role;
|
|
143
|
+
if (signal.target_role)
|
|
144
|
+
payload.target_role = signal.target_role;
|
|
145
|
+
if (signal.delegation_id)
|
|
146
|
+
payload.delegation_id = signal.delegation_id;
|
|
147
|
+
if (signal.target_agent)
|
|
148
|
+
payload.target_agent = signal.target_agent;
|
|
149
|
+
return A2ASignalV1Schema.parse(payload);
|
|
150
|
+
}
|
|
151
|
+
export async function readPendingSignalReceivedEvents(baseDir, sessionId) {
|
|
152
|
+
const queuePath = getSignalHookQueuePath(baseDir, sessionId);
|
|
153
|
+
try {
|
|
154
|
+
const content = await fs.readFile(queuePath, 'utf-8');
|
|
155
|
+
return content
|
|
156
|
+
.split('\n')
|
|
157
|
+
.map((line) => line.trim())
|
|
158
|
+
.filter((line) => line.length > 0)
|
|
159
|
+
.map(parseEvent)
|
|
160
|
+
.filter((event) => event !== null)
|
|
161
|
+
.sort((left, right) => {
|
|
162
|
+
const rankDelta = eventSortRank(right) - eventSortRank(left);
|
|
163
|
+
if (rankDelta !== 0)
|
|
164
|
+
return rankDelta;
|
|
165
|
+
return left.delivered_at.localeCompare(right.delivered_at);
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
if (error.code === 'ENOENT') {
|
|
170
|
+
return [];
|
|
171
|
+
}
|
|
172
|
+
throw error;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
async function appendEventIfMissing(baseDir, event) {
|
|
176
|
+
const queuePath = getSignalHookQueuePath(baseDir, event.recipient_session_id);
|
|
177
|
+
const existing = await readPendingSignalReceivedEvents(baseDir, event.recipient_session_id);
|
|
178
|
+
if (existing.some((candidate) => candidate.dedupe_key === event.dedupe_key)) {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
await fs.mkdir(path.dirname(queuePath), { recursive: true });
|
|
182
|
+
await fs.appendFile(queuePath, `${JSON.stringify(event)}\n`, 'utf-8');
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
export async function dispatchSignalReceivedEvents(baseDir, options) {
|
|
186
|
+
const parsedSignal = A2ASignalV1Schema.parse(options.signal);
|
|
187
|
+
const recipients = parsedSignal.recipients ?? [];
|
|
188
|
+
if (recipients.length === 0) {
|
|
189
|
+
return { emittedCount: 0, skippedDuplicateCount: 0, inactiveRecipientCount: 0 };
|
|
190
|
+
}
|
|
191
|
+
const deliveredAt = options.deliveredAt ?? new Date().toISOString();
|
|
192
|
+
const activeSessions = collectActiveSessionRecords(baseDir);
|
|
193
|
+
const allRecipientMatches = activeSessions.filter((session) => matchesRecipient(session, recipients));
|
|
194
|
+
const recipientMatches = options.recipientSessionId
|
|
195
|
+
? allRecipientMatches.filter((session) => sessionIdentities(session).includes(options.recipientSessionId ?? ''))
|
|
196
|
+
: allRecipientMatches;
|
|
197
|
+
let emittedCount = 0;
|
|
198
|
+
let skippedDuplicateCount = 0;
|
|
199
|
+
for (const session of recipientMatches) {
|
|
200
|
+
const event = buildEvent(parsedSignal, session, deliveredAt);
|
|
201
|
+
if (!event) {
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
if (await appendEventIfMissing(baseDir, event)) {
|
|
205
|
+
emittedCount += 1;
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
skippedDuplicateCount += 1;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const activeRecipientIds = new Set(allRecipientMatches.flatMap((session) => sessionIdentities(session)));
|
|
212
|
+
const inactiveRecipientCount = recipients.filter((recipient) => !activeRecipientIds.has(recipient)).length;
|
|
213
|
+
return { emittedCount, skippedDuplicateCount, inactiveRecipientCount };
|
|
214
|
+
}
|
|
215
|
+
async function resolveCurrentSessionId(baseDir) {
|
|
216
|
+
const envSessionId = nonEmptyString(process.env[ENV_VARS.AGENT_SESSION]);
|
|
217
|
+
if (envSessionId) {
|
|
218
|
+
return envSessionId;
|
|
219
|
+
}
|
|
220
|
+
try {
|
|
221
|
+
const content = await fs.readFile(path.join(baseDir, SESSION_CURRENT_FILE), 'utf-8');
|
|
222
|
+
const parsed = JSON.parse(content);
|
|
223
|
+
return nonEmptyString(parsed.session_id);
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
return undefined;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
export async function drainSignalReceivedEvents(baseDir, sessionId) {
|
|
230
|
+
const resolvedSessionId = sessionId ?? (await resolveCurrentSessionId(baseDir));
|
|
231
|
+
if (!resolvedSessionId) {
|
|
232
|
+
return [];
|
|
233
|
+
}
|
|
234
|
+
const events = await readPendingSignalReceivedEvents(baseDir, resolvedSessionId);
|
|
235
|
+
if (events.length > 0) {
|
|
236
|
+
await fs.rm(getSignalHookQueuePath(baseDir, resolvedSessionId), { force: true });
|
|
237
|
+
}
|
|
238
|
+
return events;
|
|
239
|
+
}
|
|
240
|
+
export function formatClaudeSignalReceivedPrompt(events) {
|
|
241
|
+
if (events.length === 0) {
|
|
242
|
+
return '';
|
|
243
|
+
}
|
|
244
|
+
const lines = [
|
|
245
|
+
'<lumenflow-signal-events>',
|
|
246
|
+
'Unread A2A signal:received events arrived for this session. Treat each directed signal as a decision point before continuing.',
|
|
247
|
+
];
|
|
248
|
+
for (const event of events) {
|
|
249
|
+
const signal = event.signal;
|
|
250
|
+
lines.push('');
|
|
251
|
+
lines.push(`- signal_id: ${signal.signal_id}`);
|
|
252
|
+
lines.push(` sender: ${signal.sender_identity}`);
|
|
253
|
+
lines.push(` intent: ${signal.intent ?? 'INFO'}`);
|
|
254
|
+
lines.push(` interrupt_class: ${signal.interrupt_class ?? 'advisory'}`);
|
|
255
|
+
lines.push(` requires_ack: ${signal.requires_ack === true ? 'true' : 'false'}`);
|
|
256
|
+
if (signal.wu_id)
|
|
257
|
+
lines.push(` wu: ${signal.wu_id}`);
|
|
258
|
+
if (signal.thread_id)
|
|
259
|
+
lines.push(` thread: ${signal.thread_id}`);
|
|
260
|
+
lines.push(` message: ${signal.message}`);
|
|
261
|
+
if (event.next_action) {
|
|
262
|
+
lines.push(' next_action:');
|
|
263
|
+
lines.push(` ack: ${event.next_action.ack_command}`);
|
|
264
|
+
lines.push(` reject: ${event.next_action.reject_command}`);
|
|
265
|
+
lines.push(` gate: ${event.next_action.prep_gate}`);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
lines.push('</lumenflow-signal-events>');
|
|
269
|
+
return lines.join('\n');
|
|
270
|
+
}
|
|
271
|
+
export function generateSignalReceivedHookScript() {
|
|
272
|
+
const agentSessionEnvVar = ENV_VARS.AGENT_SESSION;
|
|
273
|
+
/* eslint-disable no-useless-escape */
|
|
274
|
+
return `#!/bin/bash
|
|
275
|
+
#
|
|
276
|
+
# signal-received.sh (WU-2921)
|
|
277
|
+
#
|
|
278
|
+
# Claude Code PostToolUse hook for A2A signal:received delivery.
|
|
279
|
+
# Drains pending events for the current session and prints a structured
|
|
280
|
+
# prompt prefix for Claude at the next safe tool boundary.
|
|
281
|
+
#
|
|
282
|
+
# Exit codes:
|
|
283
|
+
# 0 = Always (signal delivery is fail-open)
|
|
284
|
+
#
|
|
285
|
+
|
|
286
|
+
set +e
|
|
287
|
+
|
|
288
|
+
HOOK_EVENT="\${hook_event_name:-PostToolUse}"
|
|
289
|
+
if [[ "$HOOK_EVENT" != "PostToolUse" ]]; then
|
|
290
|
+
exit 0
|
|
291
|
+
fi
|
|
292
|
+
|
|
293
|
+
if [[ -z "\${CLAUDE_PROJECT_DIR:-}" ]]; then
|
|
294
|
+
exit 0
|
|
295
|
+
fi
|
|
296
|
+
|
|
297
|
+
REPO_PATH="$CLAUDE_PROJECT_DIR"
|
|
298
|
+
HOOK_ENTRY="$REPO_PATH/node_modules/@lumenflow/cli/dist/signal-hook.js"
|
|
299
|
+
|
|
300
|
+
if [[ ! -f "$HOOK_ENTRY" && -f "$REPO_PATH/packages/@lumenflow/cli/dist/signal-hook.js" ]]; then
|
|
301
|
+
HOOK_ENTRY="$REPO_PATH/packages/@lumenflow/cli/dist/signal-hook.js"
|
|
302
|
+
fi
|
|
303
|
+
|
|
304
|
+
if [[ ! -f "$HOOK_ENTRY" ]]; then
|
|
305
|
+
exit 0
|
|
306
|
+
fi
|
|
307
|
+
|
|
308
|
+
SESSION_ARGS=()
|
|
309
|
+
if [[ -n "\${${agentSessionEnvVar}:-}" ]]; then
|
|
310
|
+
SESSION_ARGS=(--session "$${agentSessionEnvVar}")
|
|
311
|
+
fi
|
|
312
|
+
|
|
313
|
+
node "$HOOK_ENTRY" drain --project "$REPO_PATH" "\${SESSION_ARGS[@]}" 2>/dev/null || true
|
|
314
|
+
exit 0
|
|
315
|
+
`;
|
|
316
|
+
/* eslint-enable no-useless-escape */
|
|
317
|
+
}
|
|
318
|
+
function parseDrainArgs(argv) {
|
|
319
|
+
const [, , command, ...rest] = argv;
|
|
320
|
+
const result = {
|
|
321
|
+
command,
|
|
322
|
+
project: process.cwd(),
|
|
323
|
+
};
|
|
324
|
+
for (let index = 0; index < rest.length; index += 1) {
|
|
325
|
+
const arg = rest[index];
|
|
326
|
+
if (arg === '--project' && rest[index + 1]) {
|
|
327
|
+
result.project = rest[index + 1];
|
|
328
|
+
index += 1;
|
|
329
|
+
}
|
|
330
|
+
else if (arg === '--session' && rest[index + 1]) {
|
|
331
|
+
result.session = rest[index + 1];
|
|
332
|
+
index += 1;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
return result;
|
|
336
|
+
}
|
|
337
|
+
export async function main() {
|
|
338
|
+
const args = parseDrainArgs(process.argv);
|
|
339
|
+
if (args.command !== 'drain') {
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
const events = await drainSignalReceivedEvents(args.project, args.session);
|
|
343
|
+
const prompt = formatClaudeSignalReceivedPrompt(events);
|
|
344
|
+
if (prompt) {
|
|
345
|
+
console.log(prompt);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
if (import.meta.main) {
|
|
349
|
+
void runCLI(main, { commandName: 'signal-hook' });
|
|
350
|
+
}
|
|
351
|
+
//# sourceMappingURL=signal-hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-hook.js","sourceRoot":"","sources":["../src/signal-hook.ts"],"names":[],"mappings":"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"}
|
package/dist/wu-prep.js
CHANGED
|
@@ -46,10 +46,12 @@ import { createGitForPath } from '@lumenflow/core/git-adapter';
|
|
|
46
46
|
import { TEST_FILE_PATTERNS } from '@lumenflow/core';
|
|
47
47
|
import { resolveChangedFiles, isCodePathCoveredByChangedFiles, resolveBaseRef, } from '@lumenflow/core/wu-rules-engine';
|
|
48
48
|
import { validatePreflight, formatPreflightResult, formatPreflightWarnings, } from '@lumenflow/core/wu-preflight-validators';
|
|
49
|
-
import { CONTEXT_VALIDATION, PATTERNS, EXIT_CODES, WU_STATUS, EMOJI, CLAIMED_MODES, } from '@lumenflow/core/wu-constants';
|
|
49
|
+
import { CONTEXT_VALIDATION, PATTERNS, EXIT_CODES, WU_STATUS, EMOJI, CLAIMED_MODES, LUMENFLOW_PATHS, } from '@lumenflow/core/wu-constants';
|
|
50
|
+
import { WUStateStore } from '@lumenflow/core/wu-state-store';
|
|
50
51
|
import { defaultBranchFrom } from '@lumenflow/core/wu-done-paths';
|
|
51
52
|
import { getCurrentBranch } from '@lumenflow/core/wu-helpers';
|
|
52
53
|
import { createPreGatesCheckpoint } from '@lumenflow/core/wu-checkpoint';
|
|
54
|
+
import { isSignalAddressedToAny, loadSignals, resolveReaderIdentities, } from '@lumenflow/memory/signal';
|
|
53
55
|
import { resolveTddDiffEvidencePolicy, resolveTddOrderingPolicy, resolveScopedUnitTestExecutionPlan, formatScopedUnitTestFallbackMessage, } from '@lumenflow/packs-software-delivery/policy/gates-config';
|
|
54
56
|
import { runGates } from './gates.js';
|
|
55
57
|
import { evaluateMainDirtyMutationGuard } from './hooks/dirty-guard.js';
|
|
@@ -95,6 +97,11 @@ const PREP_OPTIONS = {
|
|
|
95
97
|
},
|
|
96
98
|
force: WU_OPTIONS.force,
|
|
97
99
|
reason: WU_OPTIONS.reason,
|
|
100
|
+
allowUnreadSignals: {
|
|
101
|
+
name: 'allowUnreadSignals',
|
|
102
|
+
flags: '--allow-unread-signals',
|
|
103
|
+
description: 'Allow prep to continue with unread directed mem:signal entries; requires --reason',
|
|
104
|
+
},
|
|
98
105
|
};
|
|
99
106
|
export const resolveScopedUnitTestsForPrep = resolveScopedUnitTestsForLifecycle;
|
|
100
107
|
export function buildRunGatesOptionsForPrep(options) {
|
|
@@ -868,6 +875,65 @@ export function evaluatePrepMainMutationGuard(options) {
|
|
|
868
875
|
isBranchPrMode: options.isBranchPr,
|
|
869
876
|
});
|
|
870
877
|
}
|
|
878
|
+
function dedupeSignals(signals) {
|
|
879
|
+
const seen = new Set();
|
|
880
|
+
const deduped = [];
|
|
881
|
+
for (const signal of signals) {
|
|
882
|
+
if (seen.has(signal.id)) {
|
|
883
|
+
continue;
|
|
884
|
+
}
|
|
885
|
+
seen.add(signal.id);
|
|
886
|
+
deduped.push(signal);
|
|
887
|
+
}
|
|
888
|
+
return deduped;
|
|
889
|
+
}
|
|
890
|
+
export async function findUnreadDirectedSignalsForPrep(options) {
|
|
891
|
+
const readerIds = await resolveReaderIdentities(options.baseDir);
|
|
892
|
+
const readerId = readerIds[0] ?? 'local-session';
|
|
893
|
+
const wuSignals = await loadSignals(options.baseDir, {
|
|
894
|
+
wuId: options.wuId,
|
|
895
|
+
unreadOnly: true,
|
|
896
|
+
readerId,
|
|
897
|
+
compatibilityMode: 'skip-legacy',
|
|
898
|
+
});
|
|
899
|
+
const initiativeSignals = options.initiative
|
|
900
|
+
? await loadSignals(options.baseDir, {
|
|
901
|
+
initiative: options.initiative,
|
|
902
|
+
unreadOnly: true,
|
|
903
|
+
readerId,
|
|
904
|
+
compatibilityMode: 'skip-legacy',
|
|
905
|
+
})
|
|
906
|
+
: [];
|
|
907
|
+
const signals = dedupeSignals([...wuSignals, ...initiativeSignals]).filter((signal) => isSignalAddressedToAny(signal, readerIds));
|
|
908
|
+
return { readerId, readerIds, signals };
|
|
909
|
+
}
|
|
910
|
+
export function formatUnreadDirectedSignalsFailure(options) {
|
|
911
|
+
const lines = options.signals
|
|
912
|
+
.map((signal) => {
|
|
913
|
+
const sender = signal.sender_identity ?? signal.sender ?? 'unknown';
|
|
914
|
+
const metadata = [
|
|
915
|
+
signal.intent ? `intent=${signal.intent}` : null,
|
|
916
|
+
signal.requires_ack !== undefined ? `requires_ack=${signal.requires_ack}` : null,
|
|
917
|
+
].filter(Boolean);
|
|
918
|
+
const metadataText = metadata.length > 0 ? ` (${metadata.join(', ')})` : '';
|
|
919
|
+
return ` - ${signal.id} from ${sender}${metadataText}: ${signal.message}`;
|
|
920
|
+
})
|
|
921
|
+
.join('\n');
|
|
922
|
+
return (`${EMOJI.FAILURE} Unread directed signals block wu:prep for ${options.wuId}.\n\n` +
|
|
923
|
+
`Current reader identity: ${options.readerId}\n\n` +
|
|
924
|
+
`Read, ACK, or explicitly dismiss these signals before continuing:\n` +
|
|
925
|
+
`${lines}\n\n` +
|
|
926
|
+
`Override only when the handoff was handled elsewhere:\n` +
|
|
927
|
+
` pnpm wu:prep --id ${options.wuId} --allow-unread-signals --reason '<audit reason>'`);
|
|
928
|
+
}
|
|
929
|
+
export async function recordUnreadSignalOverrideForPrep(options) {
|
|
930
|
+
const stateDir = path.join(options.baseDir, LUMENFLOW_PATHS.STATE_DIR);
|
|
931
|
+
const store = new WUStateStore(stateDir);
|
|
932
|
+
await store.checkpoint(options.wuId, '[wu:prep] unread directed signals override', {
|
|
933
|
+
progress: `reader=${options.readerId};signals=${options.signalIds.join(',')}`,
|
|
934
|
+
nextSteps: `reason=${options.reason}`,
|
|
935
|
+
});
|
|
936
|
+
}
|
|
871
937
|
/**
|
|
872
938
|
* Print success message with copy-paste instruction.
|
|
873
939
|
*/
|
|
@@ -912,6 +978,7 @@ export async function main() {
|
|
|
912
978
|
PREP_OPTIONS.fullTests,
|
|
913
979
|
PREP_OPTIONS.force,
|
|
914
980
|
PREP_OPTIONS.reason,
|
|
981
|
+
PREP_OPTIONS.allowUnreadSignals,
|
|
915
982
|
],
|
|
916
983
|
required: ['id'],
|
|
917
984
|
allowPositionalId: true,
|
|
@@ -999,6 +1066,32 @@ export async function main() {
|
|
|
999
1066
|
die(mainMutationGuard.message ?? `${EMOJI.FAILURE} wu:prep blocked by dirty-main guard.`);
|
|
1000
1067
|
}
|
|
1001
1068
|
}
|
|
1069
|
+
const unreadDirectedSignals = await findUnreadDirectedSignalsForPrep({
|
|
1070
|
+
baseDir: location.cwd,
|
|
1071
|
+
wuId: id,
|
|
1072
|
+
initiative: typeof doc.initiative === 'string' ? doc.initiative : undefined,
|
|
1073
|
+
});
|
|
1074
|
+
if (unreadDirectedSignals.signals.length > 0) {
|
|
1075
|
+
const overrideReason = typeof args.reason === 'string' ? args.reason.trim() : '';
|
|
1076
|
+
if (!args.allowUnreadSignals) {
|
|
1077
|
+
die(formatUnreadDirectedSignalsFailure({
|
|
1078
|
+
wuId: id,
|
|
1079
|
+
readerId: unreadDirectedSignals.readerId,
|
|
1080
|
+
signals: unreadDirectedSignals.signals,
|
|
1081
|
+
}));
|
|
1082
|
+
}
|
|
1083
|
+
if (!overrideReason) {
|
|
1084
|
+
die(`${EMOJI.FAILURE} --allow-unread-signals requires --reason '<audit reason>' for ${id}.`);
|
|
1085
|
+
}
|
|
1086
|
+
await recordUnreadSignalOverrideForPrep({
|
|
1087
|
+
baseDir: location.cwd,
|
|
1088
|
+
wuId: id,
|
|
1089
|
+
readerId: unreadDirectedSignals.readerId,
|
|
1090
|
+
signalIds: unreadDirectedSignals.signals.map((signal) => signal.id),
|
|
1091
|
+
reason: overrideReason,
|
|
1092
|
+
});
|
|
1093
|
+
console.log(`${PREP_PREFIX} ${EMOJI.WARNING} Continuing after unread directed signal override: ${overrideReason}`);
|
|
1094
|
+
}
|
|
1002
1095
|
console.log(`${PREP_PREFIX} Preparing ${id} for completion...`);
|
|
1003
1096
|
console.log(`${PREP_PREFIX} Location: ${location.cwd}`);
|
|
1004
1097
|
console.log(`${PREP_PREFIX} Main checkout: ${location.mainCheckout}`);
|