@cat-factory/app 0.127.0 → 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.
@@ -70,6 +70,9 @@ 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' },
73
76
  // Runs were paused by the spend safeguard. Workspace-scoped (no block to reveal); "act" just
74
77
  // marks it read (the human raises the budget then resumes from the spend panel).
75
78
  budget_paused: { icon: 'i-lucide-wallet', color: 'warning' },
@@ -94,6 +97,7 @@ const ACTION_KEYS: Record<Notification['type'], string> = {
94
97
  fork_decision_pending: 'layout.notifications.action.fork_decision_pending',
95
98
  pr_review_ready: 'layout.notifications.action.pr_review_ready',
96
99
  initiative: 'layout.notifications.action.initiative',
100
+ platform_health: 'layout.notifications.action.platform_health',
97
101
  budget_paused: 'layout.notifications.action.budget_paused',
98
102
  }
99
103
 
@@ -156,6 +160,9 @@ async function dismiss(n: Notification) {
156
160
  * type just focuses the related block on the board.
157
161
  */
158
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()
159
166
  if (!n.blockId) return
160
167
  if (n.type === 'requirement_review') ui.openRequirementReview(n.blockId)
161
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,7 @@ 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: '' },
70
72
  budget_paused: { enabled: false, channel: '' },
71
73
  })
72
74
  const mentionsEnabled = ref(false)
@@ -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",
@@ -4043,6 +4044,7 @@
4043
4044
  "incompleteBody": "Gib vor dem Speichern sowohl die Benutzer-ID als auch die Slack-Mitglieds-ID ein oder entferne die Zeile."
4044
4045
  },
4045
4046
  "routable": {
4047
+ "platform_health": "Plattformzustand",
4046
4048
  "merge_review": "Merge-Review",
4047
4049
  "pipeline_complete": "Pipeline abgeschlossen",
4048
4050
  "ci_failed": "CI fehlgeschlagen",
@@ -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",
@@ -3188,6 +3189,7 @@
3188
3189
  "incompleteBody": "Fill in both the user id and the Slack member id, or remove the row, before saving."
3189
3190
  },
3190
3191
  "routable": {
3192
+ "platform_health": "Platform health",
3191
3193
  "merge_review": "Merge review",
3192
3194
  "pipeline_complete": "Pipeline complete",
3193
3195
  "ci_failed": "CI failed",
@@ -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",
@@ -3095,6 +3096,7 @@
3095
3096
  "incompleteBody": "Antes de guardar, completa tanto el id de usuario como el id de miembro de Slack, o elimina la fila."
3096
3097
  },
3097
3098
  "routable": {
3099
+ "platform_health": "Estado de la plataforma",
3098
3100
  "merge_review": "Revision de fusion",
3099
3101
  "pipeline_complete": "Pipeline completado",
3100
3102
  "ci_failed": "CI fallido",
@@ -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",
@@ -3095,6 +3096,7 @@
3095
3096
  "incompleteBody": "Avant d’enregistrer, renseignez l’id utilisateur et l’id de membre Slack, ou supprimez la ligne."
3096
3097
  },
3097
3098
  "routable": {
3099
+ "platform_health": "Santé de la plateforme",
3098
3100
  "merge_review": "Revue de fusion",
3099
3101
  "pipeline_complete": "Pipeline termine",
3100
3102
  "ci_failed": "Echec de CI",
@@ -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": "סמן כנקרא",
@@ -3106,6 +3107,7 @@
3106
3107
  "incompleteBody": "לפני השמירה מלא גם את מזהה המשתמש וגם את מזהה החבר ב-Slack, או הסר את השורה."
3107
3108
  },
3108
3109
  "routable": {
3110
+ "platform_health": "תקינות הפלטפורמה",
3109
3111
  "merge_review": "סקירת מיזוג",
3110
3112
  "pipeline_complete": "הצינור הושלם",
3111
3113
  "ci_failed": "CI נכשל",
@@ -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",
@@ -4043,6 +4044,7 @@
4043
4044
  "incompleteBody": "Prima di salvare, compila sia l’id utente sia l’id membro Slack, oppure rimuovi la riga."
4044
4045
  },
4045
4046
  "routable": {
4047
+ "platform_health": "Salute della piattaforma",
4046
4048
  "merge_review": "Revisione del merge",
4047
4049
  "pipeline_complete": "Pipeline completata",
4048
4050
  "ci_failed": "CI non riuscita",
@@ -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": "既読にする",
@@ -3107,6 +3108,7 @@
3107
3108
  "incompleteBody": "保存する前に、ユーザー ID と Slack メンバー ID の両方を入力するか、行を削除してください。"
3108
3109
  },
3109
3110
  "routable": {
3111
+ "platform_health": "プラットフォームの健全性",
3110
3112
  "merge_review": "マージレビュー",
3111
3113
  "pipeline_complete": "パイプライン完了",
3112
3114
  "ci_failed": "CI失敗",
@@ -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",
@@ -3095,6 +3096,7 @@
3095
3096
  "incompleteBody": "Przed zapisaniem uzupełnij zarówno identyfikator użytkownika, jak i identyfikator członka Slack, albo usuń wiersz."
3096
3097
  },
3097
3098
  "routable": {
3099
+ "platform_health": "Kondycja platformy",
3098
3100
  "merge_review": "Przeglad scalenia",
3099
3101
  "pipeline_complete": "Pipeline ukonczony",
3100
3102
  "ci_failed": "Niepowodzenie CI",
@@ -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",
@@ -3107,6 +3108,7 @@
3107
3108
  "incompleteBody": "Kaydetmeden önce hem kullanıcı kimliğini hem de Slack üye kimliğini girin ya da satırı kaldırın."
3108
3109
  },
3109
3110
  "routable": {
3111
+ "platform_health": "Platform sağlığı",
3110
3112
  "merge_review": "Birleştirme incelemesi",
3111
3113
  "pipeline_complete": "Pipeline tamamlandı",
3112
3114
  "ci_failed": "CI başarısız",
@@ -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": "Позначити прочитаним",
@@ -3095,6 +3096,7 @@
3095
3096
  "incompleteBody": "Перед збереженням заповніть і ідентифікатор користувача, і ідентифікатор учасника Slack, або видаліть рядок."
3096
3097
  },
3097
3098
  "routable": {
3099
+ "platform_health": "Стан платформи",
3098
3100
  "merge_review": "Перевірка злиття",
3099
3101
  "pipeline_complete": "Конвеєр завершено",
3100
3102
  "ci_failed": "Збій CI",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/app",
3
- "version": "0.127.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.146.0"
37
+ "@cat-factory/contracts": "0.147.0"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@toad-contracts/testing": "0.3.2",