@cat-factory/app 0.126.2 → 0.128.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/app/components/layout/NotificationsInbox.vue +11 -0
- package/app/components/slack/SlackPanel.vue +3 -0
- package/i18n/locales/de.json +4 -1
- package/i18n/locales/en.json +4 -1
- package/i18n/locales/es.json +4 -1
- package/i18n/locales/fr.json +4 -1
- package/i18n/locales/he.json +4 -1
- package/i18n/locales/it.json +4 -1
- package/i18n/locales/ja.json +4 -1
- package/i18n/locales/pl.json +4 -1
- package/i18n/locales/tr.json +4 -1
- package/i18n/locales/uk.json +4 -1
- package/package.json +2 -2
|
@@ -70,6 +70,12 @@ const META: Record<Notification['type'], { icon: string; color: Accent }> = {
|
|
|
70
70
|
// The initiative loop needs attention (a blocked task, or completion). Clicking the title
|
|
71
71
|
// opens the initiative tracker window; "act" just marks it read.
|
|
72
72
|
initiative: { icon: 'i-lucide-milestone', color: 'primary' },
|
|
73
|
+
// The deployment's OWN run health crossed an operator threshold. Not block-scoped: clicking
|
|
74
|
+
// the title opens the operator dashboard (where the live numbers are); "act" marks it read.
|
|
75
|
+
platform_health: { icon: 'i-lucide-server-cog', color: 'warning' },
|
|
76
|
+
// Runs were paused by the spend safeguard. Workspace-scoped (no block to reveal); "act" just
|
|
77
|
+
// marks it read (the human raises the budget then resumes from the spend panel).
|
|
78
|
+
budget_paused: { icon: 'i-lucide-wallet', color: 'warning' },
|
|
73
79
|
}
|
|
74
80
|
|
|
75
81
|
// Per-type primary-action label. An exhaustive Record keyed off the notification
|
|
@@ -91,6 +97,8 @@ const ACTION_KEYS: Record<Notification['type'], string> = {
|
|
|
91
97
|
fork_decision_pending: 'layout.notifications.action.fork_decision_pending',
|
|
92
98
|
pr_review_ready: 'layout.notifications.action.pr_review_ready',
|
|
93
99
|
initiative: 'layout.notifications.action.initiative',
|
|
100
|
+
platform_health: 'layout.notifications.action.platform_health',
|
|
101
|
+
budget_paused: 'layout.notifications.action.budget_paused',
|
|
94
102
|
}
|
|
95
103
|
|
|
96
104
|
/** The localized primary-action label for a notification (te()-guarded against a
|
|
@@ -152,6 +160,9 @@ async function dismiss(n: Notification) {
|
|
|
152
160
|
* type just focuses the related block on the board.
|
|
153
161
|
*/
|
|
154
162
|
function reveal(n: Notification) {
|
|
163
|
+
// A `platform_health` card is deployment-scoped (no block) — send the operator to the
|
|
164
|
+
// dashboard where the live aggregate numbers behind the alert live.
|
|
165
|
+
if (n.type === 'platform_health') return ui.openOperatorDashboard()
|
|
155
166
|
if (!n.blockId) return
|
|
156
167
|
if (n.type === 'requirement_review') ui.openRequirementReview(n.blockId)
|
|
157
168
|
else if (n.type === 'clarity_review') ui.openClarityReview(n.blockId)
|
|
@@ -41,6 +41,7 @@ const ROUTABLE = computed<{ type: NotificationType; label: string }[]>(() => [
|
|
|
41
41
|
{ type: 'visual_confirmation_ready', label: t('slack.routable.visual_confirmation_ready') },
|
|
42
42
|
{ type: 'pr_review_ready', label: t('slack.routable.pr_review_ready') },
|
|
43
43
|
{ type: 'initiative', label: t('slack.routable.initiative') },
|
|
44
|
+
{ type: 'platform_health', label: t('slack.routable.platform_health') },
|
|
44
45
|
])
|
|
45
46
|
|
|
46
47
|
/** Notification-role options for a mapped member (drives who gets @-mentioned). */
|
|
@@ -67,6 +68,8 @@ const routes = reactive<Record<NotificationType, SlackRoute>>({
|
|
|
67
68
|
fork_decision_pending: { enabled: false, channel: '' },
|
|
68
69
|
pr_review_ready: { enabled: false, channel: '' },
|
|
69
70
|
initiative: { enabled: false, channel: '' },
|
|
71
|
+
platform_health: { enabled: false, channel: '' },
|
|
72
|
+
budget_paused: { enabled: false, channel: '' },
|
|
70
73
|
})
|
|
71
74
|
const mentionsEnabled = ref(false)
|
|
72
75
|
// Editable member rows carry a client-only stable `uid` (see `slackMemberMapping`) so
|
package/i18n/locales/de.json
CHANGED
|
@@ -1729,6 +1729,7 @@
|
|
|
1729
1729
|
"requirement_review": "Als gelesen markieren",
|
|
1730
1730
|
"clarity_review": "Als gelesen markieren",
|
|
1731
1731
|
"release_regression": "Bestätigen",
|
|
1732
|
+
"platform_health": "Bestätigen",
|
|
1732
1733
|
"decision_required": "Als gelesen markieren",
|
|
1733
1734
|
"human_test_ready": "Als gelesen markieren",
|
|
1734
1735
|
"visual_confirmation_ready": "Als gelesen markieren",
|
|
@@ -1737,7 +1738,8 @@
|
|
|
1737
1738
|
"initiative": "Als gelesen markieren",
|
|
1738
1739
|
"markRead": "Als gelesen markieren",
|
|
1739
1740
|
"fork_decision_pending": "Als gelesen markieren",
|
|
1740
|
-
"pr_review_ready": "Als gelesen markieren"
|
|
1741
|
+
"pr_review_ready": "Als gelesen markieren",
|
|
1742
|
+
"budget_paused": "Als gelesen markieren"
|
|
1741
1743
|
}
|
|
1742
1744
|
},
|
|
1743
1745
|
"aiProvidersBanner": {
|
|
@@ -4042,6 +4044,7 @@
|
|
|
4042
4044
|
"incompleteBody": "Gib vor dem Speichern sowohl die Benutzer-ID als auch die Slack-Mitglieds-ID ein oder entferne die Zeile."
|
|
4043
4045
|
},
|
|
4044
4046
|
"routable": {
|
|
4047
|
+
"platform_health": "Plattformzustand",
|
|
4045
4048
|
"merge_review": "Merge-Review",
|
|
4046
4049
|
"pipeline_complete": "Pipeline abgeschlossen",
|
|
4047
4050
|
"ci_failed": "CI fehlgeschlagen",
|
package/i18n/locales/en.json
CHANGED
|
@@ -1696,6 +1696,7 @@
|
|
|
1696
1696
|
"requirement_review": "Mark read",
|
|
1697
1697
|
"clarity_review": "Mark read",
|
|
1698
1698
|
"release_regression": "Acknowledge",
|
|
1699
|
+
"platform_health": "Acknowledge",
|
|
1699
1700
|
"decision_required": "Mark read",
|
|
1700
1701
|
"human_test_ready": "Mark read",
|
|
1701
1702
|
"visual_confirmation_ready": "Mark read",
|
|
@@ -1704,7 +1705,8 @@
|
|
|
1704
1705
|
"initiative": "Mark read",
|
|
1705
1706
|
"markRead": "Mark read",
|
|
1706
1707
|
"fork_decision_pending": "Mark read",
|
|
1707
|
-
"pr_review_ready": "Mark read"
|
|
1708
|
+
"pr_review_ready": "Mark read",
|
|
1709
|
+
"budget_paused": "Mark read"
|
|
1708
1710
|
}
|
|
1709
1711
|
},
|
|
1710
1712
|
"aiProvidersBanner": {
|
|
@@ -3187,6 +3189,7 @@
|
|
|
3187
3189
|
"incompleteBody": "Fill in both the user id and the Slack member id, or remove the row, before saving."
|
|
3188
3190
|
},
|
|
3189
3191
|
"routable": {
|
|
3192
|
+
"platform_health": "Platform health",
|
|
3190
3193
|
"merge_review": "Merge review",
|
|
3191
3194
|
"pipeline_complete": "Pipeline complete",
|
|
3192
3195
|
"ci_failed": "CI failed",
|
package/i18n/locales/es.json
CHANGED
|
@@ -1630,6 +1630,7 @@
|
|
|
1630
1630
|
"requirement_review": "Marcar como leída",
|
|
1631
1631
|
"clarity_review": "Marcar como leída",
|
|
1632
1632
|
"release_regression": "Confirmar recepción",
|
|
1633
|
+
"platform_health": "Confirmar recepción",
|
|
1633
1634
|
"decision_required": "Marcar como leída",
|
|
1634
1635
|
"human_test_ready": "Marcar como leída",
|
|
1635
1636
|
"visual_confirmation_ready": "Marcar como leída",
|
|
@@ -1638,7 +1639,8 @@
|
|
|
1638
1639
|
"initiative": "Marcar como leída",
|
|
1639
1640
|
"markRead": "Marcar como leída",
|
|
1640
1641
|
"fork_decision_pending": "Marcar como leído",
|
|
1641
|
-
"pr_review_ready": "Marcar como leída"
|
|
1642
|
+
"pr_review_ready": "Marcar como leída",
|
|
1643
|
+
"budget_paused": "Marcar como leída"
|
|
1642
1644
|
},
|
|
1643
1645
|
"toast": {
|
|
1644
1646
|
"acted": "Marcado como resuelto",
|
|
@@ -3094,6 +3096,7 @@
|
|
|
3094
3096
|
"incompleteBody": "Antes de guardar, completa tanto el id de usuario como el id de miembro de Slack, o elimina la fila."
|
|
3095
3097
|
},
|
|
3096
3098
|
"routable": {
|
|
3099
|
+
"platform_health": "Estado de la plataforma",
|
|
3097
3100
|
"merge_review": "Revision de fusion",
|
|
3098
3101
|
"pipeline_complete": "Pipeline completado",
|
|
3099
3102
|
"ci_failed": "CI fallido",
|
package/i18n/locales/fr.json
CHANGED
|
@@ -1630,6 +1630,7 @@
|
|
|
1630
1630
|
"requirement_review": "Marquer comme lu",
|
|
1631
1631
|
"clarity_review": "Marquer comme lu",
|
|
1632
1632
|
"release_regression": "Accuser réception",
|
|
1633
|
+
"platform_health": "Accuser réception",
|
|
1633
1634
|
"decision_required": "Marquer comme lu",
|
|
1634
1635
|
"human_test_ready": "Marquer comme lu",
|
|
1635
1636
|
"visual_confirmation_ready": "Marquer comme lu",
|
|
@@ -1638,7 +1639,8 @@
|
|
|
1638
1639
|
"initiative": "Marquer comme lu",
|
|
1639
1640
|
"markRead": "Marquer comme lu",
|
|
1640
1641
|
"fork_decision_pending": "Marquer comme lu",
|
|
1641
|
-
"pr_review_ready": "Marquer comme lu"
|
|
1642
|
+
"pr_review_ready": "Marquer comme lu",
|
|
1643
|
+
"budget_paused": "Marquer comme lu"
|
|
1642
1644
|
},
|
|
1643
1645
|
"toast": {
|
|
1644
1646
|
"acted": "Marqué comme traité",
|
|
@@ -3094,6 +3096,7 @@
|
|
|
3094
3096
|
"incompleteBody": "Avant d’enregistrer, renseignez l’id utilisateur et l’id de membre Slack, ou supprimez la ligne."
|
|
3095
3097
|
},
|
|
3096
3098
|
"routable": {
|
|
3099
|
+
"platform_health": "Santé de la plateforme",
|
|
3097
3100
|
"merge_review": "Revue de fusion",
|
|
3098
3101
|
"pipeline_complete": "Pipeline termine",
|
|
3099
3102
|
"ci_failed": "Echec de CI",
|
package/i18n/locales/he.json
CHANGED
|
@@ -1630,6 +1630,7 @@
|
|
|
1630
1630
|
"requirement_review": "סמן כנקרא",
|
|
1631
1631
|
"clarity_review": "סמן כנקרא",
|
|
1632
1632
|
"release_regression": "אשר",
|
|
1633
|
+
"platform_health": "אשר",
|
|
1633
1634
|
"decision_required": "סמן כנקרא",
|
|
1634
1635
|
"human_test_ready": "סמן כנקרא",
|
|
1635
1636
|
"visual_confirmation_ready": "סמן כנקרא",
|
|
@@ -1638,7 +1639,8 @@
|
|
|
1638
1639
|
"initiative": "סמן כנקרא",
|
|
1639
1640
|
"markRead": "סמן כנקרא",
|
|
1640
1641
|
"fork_decision_pending": "סמן כנקרא",
|
|
1641
|
-
"pr_review_ready": "סמן כנקרא"
|
|
1642
|
+
"pr_review_ready": "סמן כנקרא",
|
|
1643
|
+
"budget_paused": "סמן כנקרא"
|
|
1642
1644
|
},
|
|
1643
1645
|
"toast": {
|
|
1644
1646
|
"acted": "סומן כטופל",
|
|
@@ -3105,6 +3107,7 @@
|
|
|
3105
3107
|
"incompleteBody": "לפני השמירה מלא גם את מזהה המשתמש וגם את מזהה החבר ב-Slack, או הסר את השורה."
|
|
3106
3108
|
},
|
|
3107
3109
|
"routable": {
|
|
3110
|
+
"platform_health": "תקינות הפלטפורמה",
|
|
3108
3111
|
"merge_review": "סקירת מיזוג",
|
|
3109
3112
|
"pipeline_complete": "הצינור הושלם",
|
|
3110
3113
|
"ci_failed": "CI נכשל",
|
package/i18n/locales/it.json
CHANGED
|
@@ -1729,6 +1729,7 @@
|
|
|
1729
1729
|
"requirement_review": "Segna come letto",
|
|
1730
1730
|
"clarity_review": "Segna come letto",
|
|
1731
1731
|
"release_regression": "Conferma presa visione",
|
|
1732
|
+
"platform_health": "Conferma presa visione",
|
|
1732
1733
|
"decision_required": "Segna come letto",
|
|
1733
1734
|
"human_test_ready": "Segna come letto",
|
|
1734
1735
|
"visual_confirmation_ready": "Segna come letto",
|
|
@@ -1737,7 +1738,8 @@
|
|
|
1737
1738
|
"initiative": "Segna come letto",
|
|
1738
1739
|
"markRead": "Segna come letto",
|
|
1739
1740
|
"fork_decision_pending": "Segna come letto",
|
|
1740
|
-
"pr_review_ready": "Segna come letto"
|
|
1741
|
+
"pr_review_ready": "Segna come letto",
|
|
1742
|
+
"budget_paused": "Segna come letto"
|
|
1741
1743
|
}
|
|
1742
1744
|
},
|
|
1743
1745
|
"aiProvidersBanner": {
|
|
@@ -4042,6 +4044,7 @@
|
|
|
4042
4044
|
"incompleteBody": "Prima di salvare, compila sia l’id utente sia l’id membro Slack, oppure rimuovi la riga."
|
|
4043
4045
|
},
|
|
4044
4046
|
"routable": {
|
|
4047
|
+
"platform_health": "Salute della piattaforma",
|
|
4045
4048
|
"merge_review": "Revisione del merge",
|
|
4046
4049
|
"pipeline_complete": "Pipeline completata",
|
|
4047
4050
|
"ci_failed": "CI non riuscita",
|
package/i18n/locales/ja.json
CHANGED
|
@@ -1630,6 +1630,7 @@
|
|
|
1630
1630
|
"requirement_review": "既読にする",
|
|
1631
1631
|
"clarity_review": "既読にする",
|
|
1632
1632
|
"release_regression": "確認",
|
|
1633
|
+
"platform_health": "確認",
|
|
1633
1634
|
"decision_required": "既読にする",
|
|
1634
1635
|
"human_test_ready": "既読にする",
|
|
1635
1636
|
"visual_confirmation_ready": "既読にする",
|
|
@@ -1638,7 +1639,8 @@
|
|
|
1638
1639
|
"initiative": "既読にする",
|
|
1639
1640
|
"markRead": "既読にする",
|
|
1640
1641
|
"fork_decision_pending": "既読にする",
|
|
1641
|
-
"pr_review_ready": "既読にする"
|
|
1642
|
+
"pr_review_ready": "既読にする",
|
|
1643
|
+
"budget_paused": "既読にする"
|
|
1642
1644
|
},
|
|
1643
1645
|
"toast": {
|
|
1644
1646
|
"acted": "対応済みにしました",
|
|
@@ -3106,6 +3108,7 @@
|
|
|
3106
3108
|
"incompleteBody": "保存する前に、ユーザー ID と Slack メンバー ID の両方を入力するか、行を削除してください。"
|
|
3107
3109
|
},
|
|
3108
3110
|
"routable": {
|
|
3111
|
+
"platform_health": "プラットフォームの健全性",
|
|
3109
3112
|
"merge_review": "マージレビュー",
|
|
3110
3113
|
"pipeline_complete": "パイプライン完了",
|
|
3111
3114
|
"ci_failed": "CI失敗",
|
package/i18n/locales/pl.json
CHANGED
|
@@ -1630,6 +1630,7 @@
|
|
|
1630
1630
|
"requirement_review": "Oznacz jako przeczytane",
|
|
1631
1631
|
"clarity_review": "Oznacz jako przeczytane",
|
|
1632
1632
|
"release_regression": "Potwierdź",
|
|
1633
|
+
"platform_health": "Potwierdź",
|
|
1633
1634
|
"decision_required": "Oznacz jako przeczytane",
|
|
1634
1635
|
"human_test_ready": "Oznacz jako przeczytane",
|
|
1635
1636
|
"visual_confirmation_ready": "Oznacz jako przeczytane",
|
|
@@ -1638,7 +1639,8 @@
|
|
|
1638
1639
|
"initiative": "Oznacz jako przeczytane",
|
|
1639
1640
|
"markRead": "Oznacz jako przeczytane",
|
|
1640
1641
|
"fork_decision_pending": "Oznacz jako przeczytane",
|
|
1641
|
-
"pr_review_ready": "Oznacz jako przeczytane"
|
|
1642
|
+
"pr_review_ready": "Oznacz jako przeczytane",
|
|
1643
|
+
"budget_paused": "Oznacz jako przeczytane"
|
|
1642
1644
|
},
|
|
1643
1645
|
"toast": {
|
|
1644
1646
|
"acted": "Oznaczono jako obsłużone",
|
|
@@ -3094,6 +3096,7 @@
|
|
|
3094
3096
|
"incompleteBody": "Przed zapisaniem uzupełnij zarówno identyfikator użytkownika, jak i identyfikator członka Slack, albo usuń wiersz."
|
|
3095
3097
|
},
|
|
3096
3098
|
"routable": {
|
|
3099
|
+
"platform_health": "Kondycja platformy",
|
|
3097
3100
|
"merge_review": "Przeglad scalenia",
|
|
3098
3101
|
"pipeline_complete": "Pipeline ukonczony",
|
|
3099
3102
|
"ci_failed": "Niepowodzenie CI",
|
package/i18n/locales/tr.json
CHANGED
|
@@ -1630,6 +1630,7 @@
|
|
|
1630
1630
|
"requirement_review": "Okundu olarak işaretle",
|
|
1631
1631
|
"clarity_review": "Okundu olarak işaretle",
|
|
1632
1632
|
"release_regression": "Onayla",
|
|
1633
|
+
"platform_health": "Onayla",
|
|
1633
1634
|
"decision_required": "Okundu işaretle",
|
|
1634
1635
|
"human_test_ready": "Okundu işaretle",
|
|
1635
1636
|
"visual_confirmation_ready": "Okundu işaretle",
|
|
@@ -1638,7 +1639,8 @@
|
|
|
1638
1639
|
"initiative": "Okundu işaretle",
|
|
1639
1640
|
"markRead": "Okundu işaretle",
|
|
1640
1641
|
"fork_decision_pending": "Okundu olarak işaretle",
|
|
1641
|
-
"pr_review_ready": "Okundu işaretle"
|
|
1642
|
+
"pr_review_ready": "Okundu işaretle",
|
|
1643
|
+
"budget_paused": "Okundu işaretle"
|
|
1642
1644
|
},
|
|
1643
1645
|
"toast": {
|
|
1644
1646
|
"acted": "İşlendi olarak işaretlendi",
|
|
@@ -3106,6 +3108,7 @@
|
|
|
3106
3108
|
"incompleteBody": "Kaydetmeden önce hem kullanıcı kimliğini hem de Slack üye kimliğini girin ya da satırı kaldırın."
|
|
3107
3109
|
},
|
|
3108
3110
|
"routable": {
|
|
3111
|
+
"platform_health": "Platform sağlığı",
|
|
3109
3112
|
"merge_review": "Birleştirme incelemesi",
|
|
3110
3113
|
"pipeline_complete": "Pipeline tamamlandı",
|
|
3111
3114
|
"ci_failed": "CI başarısız",
|
package/i18n/locales/uk.json
CHANGED
|
@@ -1630,6 +1630,7 @@
|
|
|
1630
1630
|
"requirement_review": "Позначити прочитаним",
|
|
1631
1631
|
"clarity_review": "Позначити прочитаним",
|
|
1632
1632
|
"release_regression": "Підтвердити отримання",
|
|
1633
|
+
"platform_health": "Підтвердити отримання",
|
|
1633
1634
|
"decision_required": "Позначити прочитаним",
|
|
1634
1635
|
"human_test_ready": "Позначити прочитаним",
|
|
1635
1636
|
"visual_confirmation_ready": "Позначити прочитаним",
|
|
@@ -1638,7 +1639,8 @@
|
|
|
1638
1639
|
"initiative": "Позначити прочитаним",
|
|
1639
1640
|
"markRead": "Позначити прочитаним",
|
|
1640
1641
|
"fork_decision_pending": "Позначити прочитаним",
|
|
1641
|
-
"pr_review_ready": "Позначити прочитаним"
|
|
1642
|
+
"pr_review_ready": "Позначити прочитаним",
|
|
1643
|
+
"budget_paused": "Позначити прочитаним"
|
|
1642
1644
|
},
|
|
1643
1645
|
"toast": {
|
|
1644
1646
|
"acted": "Позначено як опрацьоване",
|
|
@@ -3094,6 +3096,7 @@
|
|
|
3094
3096
|
"incompleteBody": "Перед збереженням заповніть і ідентифікатор користувача, і ідентифікатор учасника Slack, або видаліть рядок."
|
|
3095
3097
|
},
|
|
3096
3098
|
"routable": {
|
|
3099
|
+
"platform_health": "Стан платформи",
|
|
3097
3100
|
"merge_review": "Перевірка злиття",
|
|
3098
3101
|
"pipeline_complete": "Конвеєр завершено",
|
|
3099
3102
|
"ci_failed": "Збій CI",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cat-factory/app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.128.0",
|
|
4
4
|
"description": "Reusable Nuxt layer for the Agent Architecture Board SPA (components, stores, composables, pages). Consume it from a thin deployment app via `extends: ['@cat-factory/app']` and point it at your backend with NUXT_PUBLIC_API_BASE. See deploy/frontend for an example.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"valibot": "^1.4.2",
|
|
35
35
|
"vue": "3.5.39",
|
|
36
36
|
"wretch": "^3.0.9",
|
|
37
|
-
"@cat-factory/contracts": "0.
|
|
37
|
+
"@cat-factory/contracts": "0.147.0"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@toad-contracts/testing": "0.3.2",
|