diff --git a/hookshot/tinker-tickets.js b/hookshot/tinker-tickets.js
index 7767be1..47d29bc 100644
--- a/hookshot/tinker-tickets.js
+++ b/hookshot/tinker-tickets.js
@@ -1,31 +1,80 @@
-var id = data.ticket_id || '?';
-var title = data.title || 'Untitled';
-var priority = parseInt(data.priority) || 4;
-var category = data.category || 'General';
-var type = data.type || 'Issue';
-var source = data.source || '';
-var url = data.url || '';
-var trigger = data.trigger || 'manual';
+// Tinker Tickets hookshot transform — handles all event types emitted by NotificationHelper
+// result must be assigned without var/let/const (QuickJS sandbox)
+
+var event = data.event || 'ticket_created';
+var id = data.ticket_id || '?';
+var title = data.title || 'Untitled';
+var url = data.url || '';
var notifyUsers = data.notify_users || [];
-var priorityEmojis = ['', '🔴', '🟠', '🔵', '🟢', '⚫'];
+
+var priorityEmojis = ['', '\ud83d\udd34', '\ud83d\udfe0', '\ud83d\udd35', '\ud83d\udfe2', '\u26ab'];
var priorityLabels = ['', 'P1 Critical', 'P2 High', 'P3 Medium', 'P4 Low', 'P5 Info'];
-var emoji = (priority >= 1 && priority <= 5) ? priorityEmojis[priority] : '⚫';
-var pLabel = (priority >= 1 && priority <= 5) ? priorityLabels[priority] : 'P' + priority;
-var tLabel = trigger === 'automated' ? 'Automated' : 'Manual';
-var meta = pLabel + ' \u00b7 ' + category + ' \u00b7 ' + type + (source ? ' \u00b7 ' + source : '') + ' [' + tLabel + ']';
+
+// Build mention strings
var mentionPlain = '';
-var mentionHtml = '';
+var mentionHtml = '';
if (notifyUsers.length > 0) {
var pParts = [], hParts = [];
for (var i = 0; i < notifyUsers.length; i++) {
- var uid = notifyUsers[i];
+ var uid = notifyUsers[i];
var disp = uid.replace(/^@/, '').split(':')[0];
pParts.push(uid);
hParts.push('' + disp + '');
}
mentionPlain = '\n' + pParts.join(' ');
- mentionHtml = '
' + hParts.join(' ');
+ mentionHtml = '
' + hParts.join(' ');
}
-var plain = emoji + ' New Ticket #' + id + ': ' + title + '\n' + meta + (url ? '\n' + url : '') + mentionPlain;
-var html = '' + emoji + ' #' + id + ': ' + title + '
' + meta + mentionHtml;
-result = { version: 'v2', plain: plain, html: html, msgtype: 'm.text' };
\ No newline at end of file
+
+var ticketLink = url ? ('#' + id + '') : ('#' + id);
+
+var plain, html;
+
+if (event === 'ticket_created') {
+ var priority = parseInt(data.priority) || 4;
+ var category = data.category || 'General';
+ var type = data.type || 'Issue';
+ var source = data.source || '';
+ var trigger = data.trigger || 'manual';
+ var emoji = (priority >= 1 && priority <= 5) ? priorityEmojis[priority] : '\u26ab';
+ var pLabel = (priority >= 1 && priority <= 5) ? priorityLabels[priority] : 'P' + priority;
+ var tLabel = trigger === 'automated' ? 'Automated' : 'Manual';
+ var meta = pLabel + ' \u00b7 ' + category + ' \u00b7 ' + type + (source ? ' \u00b7 ' + source : '') + ' [' + tLabel + ']';
+
+ plain = emoji + ' New Ticket #' + id + ': ' + title + '\n' + meta + (url ? '\n' + url : '') + mentionPlain;
+ html = '' + emoji + ' ' + ticketLink + ': ' + title + '
' + meta + mentionHtml;
+
+} else if (event === 'status_changed') {
+ var oldStatus = data.old_status || '?';
+ var newStatus = data.new_status || '?';
+ var changedBy = data.changed_by ? (' by ' + data.changed_by) : '';
+
+ plain = '\ud83d\udd04 Status changed' + changedBy + ': ' + oldStatus + ' \u2192 ' + newStatus + '\n#' + id + ': ' + title + (url ? '\n' + url : '') + mentionPlain;
+ html = '\ud83d\udd04 Status changed' + changedBy + ': ' + oldStatus + ' \u2192 ' + newStatus + '
' + ticketLink + ': ' + title + mentionHtml;
+
+} else if (event === 'comment_added') {
+ var author = data.author || 'Someone';
+ var preview = data.preview || '';
+
+ plain = '\ud83d\udcac ' + author + ' commented on #' + id + ': ' + title + (preview ? '\n"' + preview + '"' : '') + (url ? '\n' + url : '') + mentionPlain;
+ html = '\ud83d\udcac ' + author + ' commented on ' + ticketLink + ': ' + title + (preview ? '
"' + preview + '"' : '') + mentionHtml;
+
+} else if (event === 'mention') {
+ var author = data.author || 'Someone';
+ var preview = data.preview || '';
+
+ plain = '\ud83d\udce3 ' + author + ' mentioned you in #' + id + ': ' + title + (preview ? '\n"' + preview + '"' : '') + (url ? '\n' + url : '') + mentionPlain;
+ html = '\ud83d\udce3 ' + author + ' mentioned you in ' + ticketLink + ': ' + title + (preview ? '
"' + preview + '"' : '') + mentionHtml;
+
+} else if (event === 'assigned') {
+ var assignee = data.assignee || 'someone';
+ var changedBy = data.changed_by ? (' by ' + data.changed_by) : '';
+
+ plain = '\ud83d\udc64 Ticket #' + id + ' assigned to ' + assignee + changedBy + ': ' + title + (url ? '\n' + url : '') + mentionPlain;
+ html = '\ud83d\udc64 ' + ticketLink + ' assigned to ' + assignee + '' + changedBy + ': ' + title + mentionHtml;
+
+} else {
+ plain = '[tinker-tickets] event: ' + event + ' ticket #' + id;
+ html = '[tinker-tickets] event: ' + event + ' ticket #' + id;
+}
+
+result = { version: 'v2', plain: plain, html: html, msgtype: 'm.text' };