@delt/claude-alarm 0.6.0 → 0.6.1

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.
@@ -1368,36 +1368,40 @@
1368
1368
  // --- Permission relay ---
1369
1369
  function formatPermPreview(toolName, raw) {
1370
1370
  if (!raw) return '';
1371
- // Try JSON parse
1372
- try {
1373
- const p = JSON.parse(raw);
1374
- switch (toolName) {
1375
- case 'Bash':
1376
- return p.command ? '$ ' + p.command : raw;
1377
- case 'Write':
1378
- case 'Edit':
1379
- if (p.file_path) {
1380
- let s = p.file_path;
1381
- if (p.new_string) s += '\n+ ' + p.new_string.slice(0, 200);
1382
- else if (p.content) s += '\n' + p.content.slice(0, 200);
1383
- return s;
1384
- }
1385
- return raw;
1386
- case 'Read':
1387
- return p.file_path || raw;
1388
- case 'Glob':
1389
- return p.pattern || raw;
1390
- case 'Grep':
1391
- return (p.pattern || '') + (p.path ? ' in ' + p.path : '');
1392
- default:
1393
- // Generic: show key=value pairs
1394
- const entries = Object.entries(p);
1395
- if (entries.length <= 3) return entries.map(([k, v]) => k + ': ' + String(v).slice(0, 100)).join('\n');
1396
- return JSON.stringify(p, null, 1).slice(0, 200);
1397
- }
1398
- } catch {
1399
- // Not valid JSON - show raw but clean up
1400
- return raw.slice(0, 200);
1371
+ // Try JSON parse first, then fallback to regex extraction for truncated JSON
1372
+ let p = null;
1373
+ try { p = JSON.parse(raw); } catch {
1374
+ // Truncated JSON - try to extract known fields with regex
1375
+ const cmdMatch = raw.match(/"command"\s*:\s*"((?:[^"\\]|\\.)*)"/);
1376
+ const fileMatch = raw.match(/"file_path"\s*:\s*"((?:[^"\\]|\\.)*)"/);
1377
+ const patternMatch = raw.match(/"pattern"\s*:\s*"((?:[^"\\]|\\.)*)"/);
1378
+ if (cmdMatch) return '$ ' + cmdMatch[1];
1379
+ if (fileMatch) return fileMatch[1];
1380
+ if (patternMatch) return patternMatch[1];
1381
+ return raw.slice(0, 300);
1382
+ }
1383
+ switch (toolName) {
1384
+ case 'Bash':
1385
+ return p.command ? '$ ' + p.command : raw;
1386
+ case 'Write':
1387
+ case 'Edit':
1388
+ if (p.file_path) {
1389
+ let s = p.file_path;
1390
+ if (p.new_string) s += '\n+ ' + p.new_string.slice(0, 200);
1391
+ else if (p.content) s += '\n' + p.content.slice(0, 200);
1392
+ return s;
1393
+ }
1394
+ return raw;
1395
+ case 'Read':
1396
+ return p.file_path || raw;
1397
+ case 'Glob':
1398
+ return p.pattern || raw;
1399
+ case 'Grep':
1400
+ return (p.pattern || '') + (p.path ? ' in ' + p.path : '');
1401
+ default:
1402
+ const entries = Object.entries(p);
1403
+ if (entries.length <= 3) return entries.map(([k, v]) => k + ': ' + String(v).slice(0, 100)).join('\n');
1404
+ return JSON.stringify(p, null, 1).slice(0, 200);
1401
1405
  }
1402
1406
  }
1403
1407
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@delt/claude-alarm",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "Monitor and get notifications from multiple Claude Code sessions via MCP Channels",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1368,36 +1368,40 @@
1368
1368
  // --- Permission relay ---
1369
1369
  function formatPermPreview(toolName, raw) {
1370
1370
  if (!raw) return '';
1371
- // Try JSON parse
1372
- try {
1373
- const p = JSON.parse(raw);
1374
- switch (toolName) {
1375
- case 'Bash':
1376
- return p.command ? '$ ' + p.command : raw;
1377
- case 'Write':
1378
- case 'Edit':
1379
- if (p.file_path) {
1380
- let s = p.file_path;
1381
- if (p.new_string) s += '\n+ ' + p.new_string.slice(0, 200);
1382
- else if (p.content) s += '\n' + p.content.slice(0, 200);
1383
- return s;
1384
- }
1385
- return raw;
1386
- case 'Read':
1387
- return p.file_path || raw;
1388
- case 'Glob':
1389
- return p.pattern || raw;
1390
- case 'Grep':
1391
- return (p.pattern || '') + (p.path ? ' in ' + p.path : '');
1392
- default:
1393
- // Generic: show key=value pairs
1394
- const entries = Object.entries(p);
1395
- if (entries.length <= 3) return entries.map(([k, v]) => k + ': ' + String(v).slice(0, 100)).join('\n');
1396
- return JSON.stringify(p, null, 1).slice(0, 200);
1397
- }
1398
- } catch {
1399
- // Not valid JSON - show raw but clean up
1400
- return raw.slice(0, 200);
1371
+ // Try JSON parse first, then fallback to regex extraction for truncated JSON
1372
+ let p = null;
1373
+ try { p = JSON.parse(raw); } catch {
1374
+ // Truncated JSON - try to extract known fields with regex
1375
+ const cmdMatch = raw.match(/"command"\s*:\s*"((?:[^"\\]|\\.)*)"/);
1376
+ const fileMatch = raw.match(/"file_path"\s*:\s*"((?:[^"\\]|\\.)*)"/);
1377
+ const patternMatch = raw.match(/"pattern"\s*:\s*"((?:[^"\\]|\\.)*)"/);
1378
+ if (cmdMatch) return '$ ' + cmdMatch[1];
1379
+ if (fileMatch) return fileMatch[1];
1380
+ if (patternMatch) return patternMatch[1];
1381
+ return raw.slice(0, 300);
1382
+ }
1383
+ switch (toolName) {
1384
+ case 'Bash':
1385
+ return p.command ? '$ ' + p.command : raw;
1386
+ case 'Write':
1387
+ case 'Edit':
1388
+ if (p.file_path) {
1389
+ let s = p.file_path;
1390
+ if (p.new_string) s += '\n+ ' + p.new_string.slice(0, 200);
1391
+ else if (p.content) s += '\n' + p.content.slice(0, 200);
1392
+ return s;
1393
+ }
1394
+ return raw;
1395
+ case 'Read':
1396
+ return p.file_path || raw;
1397
+ case 'Glob':
1398
+ return p.pattern || raw;
1399
+ case 'Grep':
1400
+ return (p.pattern || '') + (p.path ? ' in ' + p.path : '');
1401
+ default:
1402
+ const entries = Object.entries(p);
1403
+ if (entries.length <= 3) return entries.map(([k, v]) => k + ': ' + String(v).slice(0, 100)).join('\n');
1404
+ return JSON.stringify(p, null, 1).slice(0, 200);
1401
1405
  }
1402
1406
  }
1403
1407