@memnexus-ai/mx-agent-cli 0.1.12 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,17 @@
1
+ /**
2
+ * mx-agent pager
3
+ *
4
+ * Watches team leader-state and cross-team-escalations for status changes
5
+ * that require operator attention. Posts notifications to Slack via
6
+ * incoming webhook. MemNexus remains the system of record — Slack
7
+ * messages are summaries with memory references.
8
+ *
9
+ * Part of platform iteration v1.6 — async control plane.
10
+ */
11
+ export interface PagerOptions {
12
+ webhook?: string;
13
+ interval: string;
14
+ once: boolean;
15
+ }
16
+ export declare function runPager(options: PagerOptions): Promise<void>;
17
+ //# sourceMappingURL=pager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pager.d.ts","sourceRoot":"","sources":["../../src/commands/pager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAYH,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;CACf;AAqWD,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAoEnE"}
@@ -0,0 +1,379 @@
1
+ /**
2
+ * mx-agent pager
3
+ *
4
+ * Watches team leader-state and cross-team-escalations for status changes
5
+ * that require operator attention. Posts notifications to Slack via
6
+ * incoming webhook. MemNexus remains the system of record — Slack
7
+ * messages are summaries with memory references.
8
+ *
9
+ * Part of platform iteration v1.6 — async control plane.
10
+ */
11
+ import { execSync } from 'child_process';
12
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
13
+ import { join } from 'path';
14
+ import { homedir } from 'os';
15
+ import https from 'https';
16
+ import http from 'http';
17
+ import chalk from 'chalk';
18
+ import { findProjectRoot } from '../lib/worktree.js';
19
+ import { listTeams } from '../lib/catalog.js';
20
+ // ── State persistence ────────────────────────────────────────────────────────
21
+ function getStateDir() {
22
+ const dir = join(homedir(), '.mx-agent');
23
+ if (!existsSync(dir))
24
+ mkdirSync(dir, { recursive: true });
25
+ return dir;
26
+ }
27
+ function getStatePath() {
28
+ return join(getStateDir(), 'pager-state.json');
29
+ }
30
+ function loadState() {
31
+ const path = getStatePath();
32
+ if (!existsSync(path)) {
33
+ return { teamStatuses: {}, escalationStatuses: {}, lastPoll: '' };
34
+ }
35
+ try {
36
+ return JSON.parse(readFileSync(path, 'utf-8'));
37
+ }
38
+ catch {
39
+ return { teamStatuses: {}, escalationStatuses: {}, lastPoll: '' };
40
+ }
41
+ }
42
+ function saveState(state) {
43
+ writeFileSync(getStatePath(), JSON.stringify(state, null, 2));
44
+ }
45
+ // ── Memory reading ──────────────────────────────────────────────────────────
46
+ function readNamedMemory(name) {
47
+ try {
48
+ const stdout = execSync(`mx memories get --name "${name}"`, {
49
+ encoding: 'utf-8',
50
+ timeout: 15000,
51
+ stdio: ['pipe', 'pipe', 'pipe'],
52
+ });
53
+ // mx memories get returns JSON followed by Facts/Relationships text.
54
+ // Extract the JSON object by finding the matching closing brace.
55
+ const jsonEnd = findJsonEnd(stdout);
56
+ const jsonStr = jsonEnd > 0 ? stdout.substring(0, jsonEnd) : stdout;
57
+ const parsed = JSON.parse(jsonStr);
58
+ return parsed.content?.trim() || null;
59
+ }
60
+ catch {
61
+ return null;
62
+ }
63
+ }
64
+ /** Find the position after the top-level closing brace in a JSON string. */
65
+ function findJsonEnd(str) {
66
+ let depth = 0;
67
+ let inString = false;
68
+ let escape = false;
69
+ for (let i = 0; i < str.length; i++) {
70
+ const ch = str[i];
71
+ if (escape) {
72
+ escape = false;
73
+ continue;
74
+ }
75
+ if (ch === '\\' && inString) {
76
+ escape = true;
77
+ continue;
78
+ }
79
+ if (ch === '"') {
80
+ inString = !inString;
81
+ continue;
82
+ }
83
+ if (inString)
84
+ continue;
85
+ if (ch === '{')
86
+ depth++;
87
+ else if (ch === '}') {
88
+ depth--;
89
+ if (depth === 0)
90
+ return i + 1;
91
+ }
92
+ }
93
+ return 0;
94
+ }
95
+ // ── Parsing ─────────────────────────────────────────────────────────────────
96
+ function parseTeamStatus(slug, content) {
97
+ const defaults = {
98
+ slug,
99
+ asyncStatus: 'unknown',
100
+ decisionNeeded: '',
101
+ loopStep: '',
102
+ iteration: '',
103
+ rawContent: content || '',
104
+ };
105
+ if (!content)
106
+ return defaults;
107
+ // Parse Async status: ok|needs-human|blocked
108
+ // If the field is absent but content exists, the team is running normally → 'ok'
109
+ const asyncMatch = content.match(/Async status:\s*(ok|needs-human|blocked)/i);
110
+ defaults.asyncStatus = asyncMatch ? asyncMatch[1].toLowerCase() : 'ok';
111
+ // Parse Decision needed:
112
+ const decisionMatch = content.match(/Decision needed:\s*(.+)/i);
113
+ if (decisionMatch)
114
+ defaults.decisionNeeded = decisionMatch[1].trim();
115
+ // Parse Loop step:
116
+ const stepMatch = content.match(/Loop step:\s*(.+)/i);
117
+ if (stepMatch)
118
+ defaults.loopStep = stepMatch[1].trim();
119
+ // Parse Iteration:
120
+ const iterMatch = content.match(/Iteration:\s*(.+)/i);
121
+ if (iterMatch)
122
+ defaults.iteration = iterMatch[1].trim();
123
+ return defaults;
124
+ }
125
+ function parseEscalations(content) {
126
+ if (!content)
127
+ return [];
128
+ const entries = [];
129
+ // Match numbered entries like: 1) 2026-02-22 | pipeline | P1 | blocker | ...
130
+ const entryPattern = /^(\d+)\)\s*\d{4}-\d{2}-\d{2}\s*\|\s*(\S+)\s*\|\s*(P[123])\s*\|\s*(\S+)\s*\|\s*([^|]+)\|[^|]*\|[^|]*\|\s*(open|in_progress|resolved)/gm;
131
+ let match;
132
+ while ((match = entryPattern.exec(content)) !== null) {
133
+ entries.push({
134
+ id: match[1],
135
+ team: match[2],
136
+ priority: match[3],
137
+ type: match[4].trim(),
138
+ summary: match[5].trim(),
139
+ status: match[6],
140
+ });
141
+ }
142
+ return entries;
143
+ }
144
+ function postToSlack(webhookUrl, blocks, text) {
145
+ return new Promise((resolve, reject) => {
146
+ const payload = JSON.stringify({ text, blocks });
147
+ const url = new URL(webhookUrl);
148
+ const options = {
149
+ hostname: url.hostname,
150
+ port: url.port || (url.protocol === 'https:' ? 443 : 80),
151
+ path: url.pathname,
152
+ method: 'POST',
153
+ headers: {
154
+ 'Content-Type': 'application/json',
155
+ 'Content-Length': Buffer.byteLength(payload),
156
+ },
157
+ };
158
+ const transport = url.protocol === 'https:' ? https : http;
159
+ const req = transport.request(options, (res) => {
160
+ let body = '';
161
+ res.on('data', (chunk) => { body += chunk; });
162
+ res.on('end', () => {
163
+ if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {
164
+ resolve();
165
+ }
166
+ else {
167
+ reject(new Error(`Slack webhook returned ${res.statusCode}: ${body}`));
168
+ }
169
+ });
170
+ });
171
+ req.on('error', reject);
172
+ req.write(payload);
173
+ req.end();
174
+ });
175
+ }
176
+ function buildTeamAlertBlocks(status) {
177
+ const emoji = status.asyncStatus === 'blocked' ? ':red_circle:' : ':large_orange_circle:';
178
+ const label = status.asyncStatus === 'blocked' ? 'BLOCKED' : 'Needs Human';
179
+ const text = `${emoji} ${label}: ${status.slug}`;
180
+ const blocks = [
181
+ {
182
+ type: 'header',
183
+ text: { type: 'plain_text', text: `${status.asyncStatus === 'blocked' ? '🔴' : '🟠'} ${label}: ${status.slug}`, emoji: true },
184
+ },
185
+ {
186
+ type: 'section',
187
+ fields: [
188
+ { type: 'mrkdwn', text: `*Team:*\n${status.slug}` },
189
+ { type: 'mrkdwn', text: `*Status:*\n${status.asyncStatus}` },
190
+ { type: 'mrkdwn', text: `*Loop Step:*\n${status.loopStep || '—'}` },
191
+ { type: 'mrkdwn', text: `*Iteration:*\n${status.iteration || '—'}` },
192
+ ],
193
+ },
194
+ ];
195
+ if (status.decisionNeeded) {
196
+ blocks.push({
197
+ type: 'section',
198
+ text: { type: 'mrkdwn', text: `*Decision needed:*\n${status.decisionNeeded}` },
199
+ });
200
+ }
201
+ blocks.push({
202
+ type: 'context',
203
+ elements: [
204
+ { type: 'mrkdwn', text: `Memory: \`${status.slug}-leader-state\` | ${new Date().toISOString()}` },
205
+ ],
206
+ });
207
+ return { blocks, text };
208
+ }
209
+ function buildEscalationAlertBlocks(entry) {
210
+ const emoji = entry.priority === 'P1' ? ':red_circle:' : ':large_orange_circle:';
211
+ const text = `${emoji} ${entry.priority} Escalation #${entry.id}: ${entry.summary}`;
212
+ const blocks = [
213
+ {
214
+ type: 'header',
215
+ text: { type: 'plain_text', text: `${entry.priority === 'P1' ? '🔴' : '🟠'} ${entry.priority} Escalation #${entry.id}`, emoji: true },
216
+ },
217
+ {
218
+ type: 'section',
219
+ fields: [
220
+ { type: 'mrkdwn', text: `*Team:*\n${entry.team}` },
221
+ { type: 'mrkdwn', text: `*Priority:*\n${entry.priority}` },
222
+ { type: 'mrkdwn', text: `*Type:*\n${entry.type}` },
223
+ { type: 'mrkdwn', text: `*Status:*\n${entry.status}` },
224
+ ],
225
+ },
226
+ {
227
+ type: 'section',
228
+ text: { type: 'mrkdwn', text: `*Summary:*\n${entry.summary}` },
229
+ },
230
+ {
231
+ type: 'context',
232
+ elements: [
233
+ { type: 'mrkdwn', text: `Memory: \`cross-team-escalations\` | ${new Date().toISOString()}` },
234
+ ],
235
+ },
236
+ ];
237
+ return { blocks, text };
238
+ }
239
+ function buildResolvedBlocks(slug, prevStatus) {
240
+ const text = `✅ Resolved: ${slug} (was: ${prevStatus})`;
241
+ const blocks = [
242
+ {
243
+ type: 'section',
244
+ text: { type: 'mrkdwn', text: `✅ *${slug}* status changed: \`${prevStatus}\` → \`ok\`` },
245
+ },
246
+ {
247
+ type: 'context',
248
+ elements: [
249
+ { type: 'mrkdwn', text: `Memory: \`${slug}-leader-state\` | ${new Date().toISOString()}` },
250
+ ],
251
+ },
252
+ ];
253
+ return { blocks, text };
254
+ }
255
+ // ── Main loop ───────────────────────────────────────────────────────────────
256
+ async function pollOnce(teamSlugs, webhookUrl, state) {
257
+ const notifications = [];
258
+ // ── Check team leader-states ──
259
+ for (const slug of teamSlugs) {
260
+ const content = readNamedMemory(`${slug}-leader-state`);
261
+ const status = parseTeamStatus(slug, content);
262
+ const prevStatus = state.teamStatuses[slug] || 'unknown';
263
+ if (status.asyncStatus !== prevStatus) {
264
+ if (status.asyncStatus === 'needs-human' || status.asyncStatus === 'blocked') {
265
+ // New alert
266
+ console.log(chalk.red(` ⚡ ${slug}: ${prevStatus} → ${status.asyncStatus}`));
267
+ if (status.decisionNeeded) {
268
+ console.log(chalk.yellow(` Decision: ${status.decisionNeeded}`));
269
+ }
270
+ notifications.push(buildTeamAlertBlocks(status));
271
+ }
272
+ else if ((prevStatus === 'needs-human' || prevStatus === 'blocked') &&
273
+ status.asyncStatus === 'ok') {
274
+ // Resolved
275
+ console.log(chalk.green(` ✓ ${slug}: ${prevStatus} → ok`));
276
+ notifications.push(buildResolvedBlocks(slug, prevStatus));
277
+ }
278
+ else {
279
+ console.log(chalk.dim(` ${slug}: ${prevStatus} → ${status.asyncStatus}`));
280
+ }
281
+ }
282
+ state.teamStatuses[slug] = status.asyncStatus;
283
+ }
284
+ // ── Check cross-team-escalations ──
285
+ const escalationContent = readNamedMemory('cross-team-escalations');
286
+ const entries = parseEscalations(escalationContent);
287
+ for (const entry of entries) {
288
+ const prevStatus = state.escalationStatuses[entry.id] || '';
289
+ if (entry.status === 'open' && prevStatus !== 'open') {
290
+ if (entry.priority === 'P1' || entry.priority === 'P2') {
291
+ console.log(chalk.red(` ⚡ Escalation #${entry.id} (${entry.priority}): ${entry.summary}`));
292
+ notifications.push(buildEscalationAlertBlocks(entry));
293
+ }
294
+ }
295
+ else if (entry.status === 'resolved' && prevStatus === 'open') {
296
+ console.log(chalk.green(` ✓ Escalation #${entry.id} resolved`));
297
+ }
298
+ state.escalationStatuses[entry.id] = entry.status;
299
+ }
300
+ // ── Post to Slack ──
301
+ if (webhookUrl && notifications.length > 0) {
302
+ for (const { blocks, text } of notifications) {
303
+ try {
304
+ await postToSlack(webhookUrl, blocks, text);
305
+ console.log(chalk.dim(' → Slack notification sent'));
306
+ }
307
+ catch (err) {
308
+ console.error(chalk.red(` → Slack error: ${err instanceof Error ? err.message : String(err)}`));
309
+ }
310
+ }
311
+ }
312
+ else if (!webhookUrl && notifications.length > 0) {
313
+ console.log(chalk.dim(' (no webhook configured — console only)'));
314
+ }
315
+ state.lastPoll = new Date().toISOString();
316
+ return state;
317
+ }
318
+ // ── Entry point ─────────────────────────────────────────────────────────────
319
+ export async function runPager(options) {
320
+ const webhookUrl = options.webhook || process.env.SLACK_WEBHOOK_URL;
321
+ const intervalSec = parseInt(options.interval, 10) || 300;
322
+ let projectRoot;
323
+ try {
324
+ projectRoot = findProjectRoot();
325
+ }
326
+ catch (err) {
327
+ console.error(chalk.red(`Error: ${err instanceof Error ? err.message : String(err)}`));
328
+ process.exit(1);
329
+ }
330
+ const allTeams = listTeams(projectRoot);
331
+ const teamSlugs = allTeams.map((t) => t.slug);
332
+ console.log();
333
+ console.log(chalk.cyan.bold('mx-agent Pager'));
334
+ console.log(chalk.dim('─'.repeat(50)));
335
+ console.log(` ${chalk.bold('Teams:')} ${teamSlugs.join(', ')}`);
336
+ console.log(` ${chalk.bold('Interval:')} ${intervalSec}s`);
337
+ console.log(` ${chalk.bold('Webhook:')} ${webhookUrl ? 'configured' : chalk.yellow('not set (console only)')}`);
338
+ if (!webhookUrl) {
339
+ console.log(chalk.dim(' Set SLACK_WEBHOOK_URL or use --webhook to enable Slack notifications'));
340
+ }
341
+ console.log();
342
+ let state = loadState();
343
+ if (options.once) {
344
+ // Single poll for testing
345
+ console.log(chalk.dim(` Polling at ${new Date().toISOString()}...`));
346
+ state = await pollOnce(teamSlugs, webhookUrl, state);
347
+ saveState(state);
348
+ console.log(chalk.dim(' Done.'));
349
+ console.log();
350
+ return;
351
+ }
352
+ // Continuous loop
353
+ console.log(chalk.dim(' Press Ctrl+C to stop.'));
354
+ console.log();
355
+ const poll = async () => {
356
+ console.log(chalk.dim(` [${new Date().toISOString()}] Polling...`));
357
+ state = await pollOnce(teamSlugs, webhookUrl, state);
358
+ saveState(state);
359
+ };
360
+ // Initial poll
361
+ await poll();
362
+ // Schedule subsequent polls
363
+ const timer = setInterval(() => {
364
+ poll().catch((err) => {
365
+ console.error(chalk.red(` Poll error: ${err instanceof Error ? err.message : String(err)}`));
366
+ });
367
+ }, intervalSec * 1000);
368
+ // Graceful shutdown
369
+ const shutdown = () => {
370
+ clearInterval(timer);
371
+ saveState(state);
372
+ console.log();
373
+ console.log(chalk.dim(' Pager stopped.'));
374
+ process.exit(0);
375
+ };
376
+ process.on('SIGINT', shutdown);
377
+ process.on('SIGTERM', shutdown);
378
+ }
379
+ //# sourceMappingURL=pager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pager.js","sourceRoot":"","sources":["../../src/commands/pager.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -8,6 +8,7 @@
8
8
  * mx-agent list
9
9
  * mx-agent status <name>
10
10
  * mx-agent usage [name] [--recent <period>]
11
+ * mx-agent pager [--webhook <url>] [--interval <secs>] [--once]
11
12
  * mx-agent update
12
13
  */
13
14
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG"}
package/dist/index.js CHANGED
@@ -8,6 +8,7 @@
8
8
  * mx-agent list
9
9
  * mx-agent status <name>
10
10
  * mx-agent usage [name] [--recent <period>]
11
+ * mx-agent pager [--webhook <url>] [--interval <secs>] [--once]
11
12
  * mx-agent update
12
13
  */
13
14
  import { createRequire } from 'module';
@@ -20,6 +21,7 @@ import { runList } from './commands/list.js';
20
21
  import { runStatus } from './commands/status.js';
21
22
  import { runUsage } from './commands/usage.js';
22
23
  import { runUpdate } from './commands/update.js';
24
+ import { runPager } from './commands/pager.js';
23
25
  const __dirname = dirname(fileURLToPath(import.meta.url));
24
26
  const require = createRequire(import.meta.url);
25
27
  const pkg = require(join(__dirname, '../package.json'));
@@ -84,6 +86,19 @@ program
84
86
  process.exit(1);
85
87
  });
86
88
  });
89
+ // ── pager ──────────────────────────────────────────────────────────────
90
+ program
91
+ .command('pager')
92
+ .description('Watch team states and post Slack alerts when operator attention is needed')
93
+ .option('--webhook <url>', 'Slack incoming webhook URL (or set SLACK_WEBHOOK_URL env var)')
94
+ .option('--interval <seconds>', 'Poll interval in seconds', '300')
95
+ .option('--once', 'Run a single poll and exit (for testing)', false)
96
+ .action((opts) => {
97
+ runPager(opts).catch((err) => {
98
+ console.error(err instanceof Error ? err.message : String(err));
99
+ process.exit(1);
100
+ });
101
+ });
87
102
  // ── update ─────────────────────────────────────────────────────────────
88
103
  program
89
104
  .command('update')
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memnexus-ai/mx-agent-cli",
3
- "version": "0.1.12",
3
+ "version": "0.1.13",
4
4
  "description": "CLI for creating and managing AI agent teams",
5
5
  "type": "module",
6
6
  "bin": {