@cat-factory/app 0.221.2 → 0.222.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 +5 -0
- package/app/components/panels/ReportsPanel.vue +28 -0
- package/app/components/slack/SlackPanel.vue +1 -0
- package/i18n/locales/de.json +3 -0
- package/i18n/locales/en.json +3 -0
- package/i18n/locales/es.json +3 -0
- package/i18n/locales/fr.json +3 -0
- package/i18n/locales/he.json +3 -0
- package/i18n/locales/it.json +3 -0
- package/i18n/locales/ja.json +3 -0
- package/i18n/locales/pl.json +3 -0
- package/i18n/locales/tr.json +3 -0
- package/i18n/locales/uk.json +3 -0
- package/package.json +2 -2
|
@@ -84,6 +84,10 @@ const META: Record<Notification['type'], { icon: string; color: Accent }> = {
|
|
|
84
84
|
// Runs were paused by the spend safeguard. Workspace-scoped (no block to reveal); "act" just
|
|
85
85
|
// marks it read (the human raises the budget then resumes from the spend panel).
|
|
86
86
|
budget_paused: { icon: 'i-lucide-wallet', color: 'warning' },
|
|
87
|
+
// Spend crossed an alert threshold, or is projected to overrun the budget before the period
|
|
88
|
+
// ends. The PROACTIVE sibling of `budget_paused`, so it is amber rather than red: nothing has
|
|
89
|
+
// stopped yet, which is the entire point of it arriving. "act" just marks it read.
|
|
90
|
+
budget_threshold: { icon: 'i-lucide-trending-up', color: 'warning' },
|
|
87
91
|
// Stored credentials could not be decrypted (the ENCRYPTION_KEY changed since they were
|
|
88
92
|
// sealed). Not block-scoped; "act" drops the listed stale ciphertexts so they can be re-entered
|
|
89
93
|
// (or restore the previous key to recover them instead).
|
|
@@ -117,6 +121,7 @@ const ACTION_KEYS: Record<Notification['type'], string> = {
|
|
|
117
121
|
initiative: 'layout.notifications.action.initiative',
|
|
118
122
|
platform_health: 'layout.notifications.action.platform_health',
|
|
119
123
|
budget_paused: 'layout.notifications.action.budget_paused',
|
|
124
|
+
budget_threshold: 'layout.notifications.action.budget_threshold',
|
|
120
125
|
key_drift: 'layout.notifications.action.key_drift',
|
|
121
126
|
infra_unreachable: 'layout.notifications.action.infra_unreachable',
|
|
122
127
|
}
|
|
@@ -352,6 +352,34 @@ watch(
|
|
|
352
352
|
</section>
|
|
353
353
|
</div>
|
|
354
354
|
|
|
355
|
+
<!-- The TCO axes: what a repository and a ticket actually cost. Spend-only, like the
|
|
356
|
+
pair above, because a run's activity is already sliced by the service that owns
|
|
357
|
+
the repo and there is no second population to pair a ticket with. -->
|
|
358
|
+
<div class="grid gap-6 md:grid-cols-2">
|
|
359
|
+
<section>
|
|
360
|
+
<h2 class="mb-2 text-xs font-semibold uppercase tracking-wide text-slate-500">
|
|
361
|
+
{{ t('reports.spend.byRepo') }}
|
|
362
|
+
</h2>
|
|
363
|
+
<ReportsSpendBreakdown
|
|
364
|
+
:rows="view.spend.byRepo"
|
|
365
|
+
:currency="currency"
|
|
366
|
+
test-id="reports-spend-repo"
|
|
367
|
+
:label-of="sliceLabel"
|
|
368
|
+
/>
|
|
369
|
+
</section>
|
|
370
|
+
<section>
|
|
371
|
+
<h2 class="mb-2 text-xs font-semibold uppercase tracking-wide text-slate-500">
|
|
372
|
+
{{ t('reports.spend.byTicket') }}
|
|
373
|
+
</h2>
|
|
374
|
+
<ReportsSpendBreakdown
|
|
375
|
+
:rows="view.spend.byTicket"
|
|
376
|
+
:currency="currency"
|
|
377
|
+
test-id="reports-spend-ticket"
|
|
378
|
+
:label-of="sliceLabel"
|
|
379
|
+
/>
|
|
380
|
+
</section>
|
|
381
|
+
</div>
|
|
382
|
+
|
|
355
383
|
<!-- The shared axis: spend AND activity for the same grouping, side by side. -->
|
|
356
384
|
<section class="flex flex-col gap-3">
|
|
357
385
|
<div class="flex flex-wrap items-center gap-2">
|
|
@@ -74,6 +74,7 @@ const routes = reactive<Record<NotificationType, SlackRoute>>({
|
|
|
74
74
|
initiative: { enabled: false, channel: '' },
|
|
75
75
|
platform_health: { enabled: false, channel: '' },
|
|
76
76
|
budget_paused: { enabled: false, channel: '' },
|
|
77
|
+
budget_threshold: { enabled: false, channel: '' },
|
|
77
78
|
// In-app only (not in ROUTABLE), but the map is exhaustive over the type.
|
|
78
79
|
key_drift: { enabled: false, channel: '' },
|
|
79
80
|
infra_unreachable: { enabled: false, channel: '' },
|
package/i18n/locales/de.json
CHANGED
|
@@ -2216,6 +2216,7 @@
|
|
|
2216
2216
|
"judge_review": "Als gelesen markieren",
|
|
2217
2217
|
"pr_review_ready": "Als gelesen markieren",
|
|
2218
2218
|
"budget_paused": "Als gelesen markieren",
|
|
2219
|
+
"budget_threshold": "Als gelesen markieren",
|
|
2219
2220
|
"key_drift": "Veraltete Zugangsdaten entfernen",
|
|
2220
2221
|
"merge_tag_request": "Aufwand erfassen"
|
|
2221
2222
|
},
|
|
@@ -3525,6 +3526,8 @@
|
|
|
3525
3526
|
"spend": {
|
|
3526
3527
|
"byModel": "Kosten nach Modell",
|
|
3527
3528
|
"byAgentKind": "Kosten nach Agententyp",
|
|
3529
|
+
"byRepo": "Kosten nach Repository",
|
|
3530
|
+
"byTicket": "Kosten nach Ticket",
|
|
3528
3531
|
"heading": "Kosten",
|
|
3529
3532
|
"empty": "In diesem Zeitraum wurde keine Nutzung erfasst.",
|
|
3530
3533
|
"calls": "{count} Aufruf | {count} Aufrufe",
|
package/i18n/locales/en.json
CHANGED
|
@@ -1834,6 +1834,8 @@
|
|
|
1834
1834
|
"spend": {
|
|
1835
1835
|
"byModel": "Spend by model",
|
|
1836
1836
|
"byAgentKind": "Spend by agent kind",
|
|
1837
|
+
"byRepo": "Spend by repository",
|
|
1838
|
+
"byTicket": "Spend by ticket",
|
|
1837
1839
|
"heading": "Spend",
|
|
1838
1840
|
"empty": "No recorded usage in this window.",
|
|
1839
1841
|
"calls": "{count} call | {count} calls",
|
|
@@ -2137,6 +2139,7 @@
|
|
|
2137
2139
|
"judge_review": "Mark read",
|
|
2138
2140
|
"pr_review_ready": "Mark read",
|
|
2139
2141
|
"budget_paused": "Mark read",
|
|
2142
|
+
"budget_threshold": "Mark read",
|
|
2140
2143
|
"key_drift": "Drop stale credentials",
|
|
2141
2144
|
"merge_tag_request": "Record effort"
|
|
2142
2145
|
},
|
package/i18n/locales/es.json
CHANGED
|
@@ -1742,6 +1742,8 @@
|
|
|
1742
1742
|
"spend": {
|
|
1743
1743
|
"byModel": "Gasto por modelo",
|
|
1744
1744
|
"byAgentKind": "Gasto por tipo de agente",
|
|
1745
|
+
"byRepo": "Gasto por repositorio",
|
|
1746
|
+
"byTicket": "Gasto por tique",
|
|
1745
1747
|
"heading": "Gasto",
|
|
1746
1748
|
"empty": "No se registró uso en este periodo.",
|
|
1747
1749
|
"calls": "{count} llamada | {count} llamadas",
|
|
@@ -2036,6 +2038,7 @@
|
|
|
2036
2038
|
"judge_review": "Marcar como leído",
|
|
2037
2039
|
"pr_review_ready": "Marcar como leída",
|
|
2038
2040
|
"budget_paused": "Marcar como leída",
|
|
2041
|
+
"budget_threshold": "Marcar como leída",
|
|
2039
2042
|
"key_drift": "Descartar credenciales obsoletas",
|
|
2040
2043
|
"merge_tag_request": "Registrar esfuerzo"
|
|
2041
2044
|
},
|
package/i18n/locales/fr.json
CHANGED
|
@@ -1742,6 +1742,8 @@
|
|
|
1742
1742
|
"spend": {
|
|
1743
1743
|
"byModel": "Dépense par modèle",
|
|
1744
1744
|
"byAgentKind": "Dépense par type d’agent",
|
|
1745
|
+
"byRepo": "Dépense par dépôt",
|
|
1746
|
+
"byTicket": "Dépense par ticket",
|
|
1745
1747
|
"heading": "Dépense",
|
|
1746
1748
|
"empty": "Aucune utilisation enregistrée sur cette période.",
|
|
1747
1749
|
"calls": "{count} appel | {count} appels",
|
|
@@ -2036,6 +2038,7 @@
|
|
|
2036
2038
|
"judge_review": "Marquer comme lu",
|
|
2037
2039
|
"pr_review_ready": "Marquer comme lu",
|
|
2038
2040
|
"budget_paused": "Marquer comme lu",
|
|
2041
|
+
"budget_threshold": "Marquer comme lu",
|
|
2039
2042
|
"key_drift": "Supprimer les identifiants obsolètes",
|
|
2040
2043
|
"merge_tag_request": "Enregistrer l’effort"
|
|
2041
2044
|
},
|
package/i18n/locales/he.json
CHANGED
|
@@ -1742,6 +1742,8 @@
|
|
|
1742
1742
|
"spend": {
|
|
1743
1743
|
"byModel": "עלות לפי מודל",
|
|
1744
1744
|
"byAgentKind": "עלות לפי סוג סוכן",
|
|
1745
|
+
"byRepo": "עלות לפי מאגר",
|
|
1746
|
+
"byTicket": "עלות לפי כרטיס",
|
|
1745
1747
|
"heading": "עלות",
|
|
1746
1748
|
"empty": "לא נרשם שימוש בטווח הזה.",
|
|
1747
1749
|
"calls": "קריאה אחת | שתי קריאות | {count} קריאות",
|
|
@@ -2036,6 +2038,7 @@
|
|
|
2036
2038
|
"judge_review": "סמן כנקרא",
|
|
2037
2039
|
"pr_review_ready": "סמן כנקרא",
|
|
2038
2040
|
"budget_paused": "סמן כנקרא",
|
|
2041
|
+
"budget_threshold": "סמן כנקרא",
|
|
2039
2042
|
"key_drift": "מחק אישורים מיושנים",
|
|
2040
2043
|
"merge_tag_request": "לתעד את המאמץ"
|
|
2041
2044
|
},
|
package/i18n/locales/it.json
CHANGED
|
@@ -2216,6 +2216,7 @@
|
|
|
2216
2216
|
"judge_review": "Segna come letto",
|
|
2217
2217
|
"pr_review_ready": "Segna come letto",
|
|
2218
2218
|
"budget_paused": "Segna come letto",
|
|
2219
|
+
"budget_threshold": "Segna come letto",
|
|
2219
2220
|
"key_drift": "Elimina credenziali obsolete",
|
|
2220
2221
|
"merge_tag_request": "Registra l’impegno"
|
|
2221
2222
|
},
|
|
@@ -3525,6 +3526,8 @@
|
|
|
3525
3526
|
"spend": {
|
|
3526
3527
|
"byModel": "Spesa per modello",
|
|
3527
3528
|
"byAgentKind": "Spesa per tipo di agente",
|
|
3529
|
+
"byRepo": "Spesa per repository",
|
|
3530
|
+
"byTicket": "Spesa per ticket",
|
|
3528
3531
|
"heading": "Spesa",
|
|
3529
3532
|
"empty": "Nessun utilizzo registrato in questo periodo.",
|
|
3530
3533
|
"calls": "{count} chiamata | {count} chiamate",
|
package/i18n/locales/ja.json
CHANGED
|
@@ -1742,6 +1742,8 @@
|
|
|
1742
1742
|
"spend": {
|
|
1743
1743
|
"byModel": "モデル別の費用",
|
|
1744
1744
|
"byAgentKind": "エージェント種別の費用",
|
|
1745
|
+
"byRepo": "リポジトリ別の費用",
|
|
1746
|
+
"byTicket": "チケット別の費用",
|
|
1745
1747
|
"heading": "費用",
|
|
1746
1748
|
"empty": "この期間に記録された利用はありません。",
|
|
1747
1749
|
"calls": "{count} 件の呼び出し | {count} 件の呼び出し",
|
|
@@ -2036,6 +2038,7 @@
|
|
|
2036
2038
|
"judge_review": "既読にする",
|
|
2037
2039
|
"pr_review_ready": "既読にする",
|
|
2038
2040
|
"budget_paused": "既読にする",
|
|
2041
|
+
"budget_threshold": "既読にする",
|
|
2039
2042
|
"key_drift": "古い認証情報を削除",
|
|
2040
2043
|
"merge_tag_request": "工数を記録"
|
|
2041
2044
|
},
|
package/i18n/locales/pl.json
CHANGED
|
@@ -1742,6 +1742,8 @@
|
|
|
1742
1742
|
"spend": {
|
|
1743
1743
|
"byModel": "Koszty według modelu",
|
|
1744
1744
|
"byAgentKind": "Koszty według typu agenta",
|
|
1745
|
+
"byRepo": "Koszty według repozytorium",
|
|
1746
|
+
"byTicket": "Koszty według zgłoszenia",
|
|
1745
1747
|
"heading": "Koszty",
|
|
1746
1748
|
"empty": "W tym okresie nie zarejestrowano użycia.",
|
|
1747
1749
|
"calls": "{count} wywołanie | {count} wywołania | {count} wywołań",
|
|
@@ -2036,6 +2038,7 @@
|
|
|
2036
2038
|
"judge_review": "Oznacz jako przeczytane",
|
|
2037
2039
|
"pr_review_ready": "Oznacz jako przeczytane",
|
|
2038
2040
|
"budget_paused": "Oznacz jako przeczytane",
|
|
2041
|
+
"budget_threshold": "Oznacz jako przeczytane",
|
|
2039
2042
|
"key_drift": "Usuń nieaktualne poświadczenia",
|
|
2040
2043
|
"merge_tag_request": "Zapisz nakład"
|
|
2041
2044
|
},
|
package/i18n/locales/tr.json
CHANGED
|
@@ -1742,6 +1742,8 @@
|
|
|
1742
1742
|
"spend": {
|
|
1743
1743
|
"byModel": "Modele göre harcama",
|
|
1744
1744
|
"byAgentKind": "Ajan türüne göre harcama",
|
|
1745
|
+
"byRepo": "Depoya göre harcama",
|
|
1746
|
+
"byTicket": "Bilete göre harcama",
|
|
1745
1747
|
"heading": "Harcama",
|
|
1746
1748
|
"empty": "Bu dönemde kayıtlı kullanım yok.",
|
|
1747
1749
|
"calls": "{count} çağrı | {count} çağrı",
|
|
@@ -2036,6 +2038,7 @@
|
|
|
2036
2038
|
"judge_review": "Okundu olarak işaretle",
|
|
2037
2039
|
"pr_review_ready": "Okundu işaretle",
|
|
2038
2040
|
"budget_paused": "Okundu işaretle",
|
|
2041
|
+
"budget_threshold": "Okundu işaretle",
|
|
2039
2042
|
"key_drift": "Eski kimlik bilgilerini kaldır",
|
|
2040
2043
|
"merge_tag_request": "Eforu kaydet"
|
|
2041
2044
|
},
|
package/i18n/locales/uk.json
CHANGED
|
@@ -1742,6 +1742,8 @@
|
|
|
1742
1742
|
"spend": {
|
|
1743
1743
|
"byModel": "Витрати за моделлю",
|
|
1744
1744
|
"byAgentKind": "Витрати за типом агента",
|
|
1745
|
+
"byRepo": "Витрати за репозиторієм",
|
|
1746
|
+
"byTicket": "Витрати за тікетом",
|
|
1745
1747
|
"heading": "Витрати",
|
|
1746
1748
|
"empty": "За цей період використання не зафіксовано.",
|
|
1747
1749
|
"calls": "{count} виклик | {count} виклики | {count} викликів",
|
|
@@ -2036,6 +2038,7 @@
|
|
|
2036
2038
|
"judge_review": "Позначити прочитаним",
|
|
2037
2039
|
"pr_review_ready": "Позначити прочитаним",
|
|
2038
2040
|
"budget_paused": "Позначити прочитаним",
|
|
2041
|
+
"budget_threshold": "Позначити прочитаним",
|
|
2039
2042
|
"key_drift": "Видалити застарілі облікові дані",
|
|
2040
2043
|
"merge_tag_request": "Записати обсяг"
|
|
2041
2044
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cat-factory/app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.222.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",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"valibot": "^1.4.2",
|
|
41
41
|
"vue": "3.5.40",
|
|
42
42
|
"wretch": "^3.0.9",
|
|
43
|
-
"@cat-factory/contracts": "0.
|
|
43
|
+
"@cat-factory/contracts": "0.238.0"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@toad-contracts/testing": "0.3.2",
|