@cat-factory/app 0.285.1 → 0.286.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.
@@ -873,7 +873,16 @@ function exportJson() {
873
873
  <span :title="t('observability.call.transportVsExecution')">
874
874
  {{ formatMs(c.overheadMs) }} / {{ formatMs(c.upstreamMs) }}
875
875
  </span>
876
- <UBadge v-if="!c.ok" color="error" variant="subtle" size="sm">
876
+ <UBadge
877
+ v-if="c.spendOnly"
878
+ color="neutral"
879
+ variant="subtle"
880
+ size="sm"
881
+ :title="t('observability.call.spendOnlyTitle')"
882
+ >
883
+ {{ t('observability.call.spendOnly') }}
884
+ </UBadge>
885
+ <UBadge v-else-if="!c.ok" color="error" variant="subtle" size="sm">
877
886
  {{ c.httpStatus ?? t('observability.call.error') }}
878
887
  </UBadge>
879
888
  <UBadge
@@ -80,6 +80,21 @@ const showProvisioning = ref(false)
80
80
  // drawer above (the orchestrator-side container/env spin-up), this is the stand-up that runs
81
81
  // INSIDE the container — the highest-signal artifact when local infra fails to come up.
82
82
  const infraSetup = computed(() => testState.value?.infraSetup ?? null)
83
+
84
+ // A stand-up that never ran because the executor container had no Docker daemon is a different
85
+ // failure from a compose stack that failed to come up, and the two have opposite fixes (the image
86
+ // or the sandbox running it, versus the service's own compose file). `dockerAvailable` is
87
+ // three-valued for the same reason it is on the wire: absent means the container reached no
88
+ // verdict (an older image, or the native host transport), which is not the same as a daemon that
89
+ // was decidedly missing, so only an explicit `false` changes what this says.
90
+ const standupHeadline = computed(() => {
91
+ const infra = infraSetup.value
92
+ if (!infra) return ''
93
+ if (infra.started) return t('testing.standup.up')
94
+ return infra.dockerAvailable === false
95
+ ? t('testing.standup.noDocker')
96
+ : t('testing.standup.failed')
97
+ })
83
98
  // The captured stand-up logs are shown on demand (they can be long).
84
99
  const showInfraSetupLogs = ref(false)
85
100
 
@@ -382,7 +397,7 @@ const GROUP_STATUS_META: Record<ScenarioGroup['status'], { icon: string; text: s
382
397
  :class="infraSetup.started ? 'text-emerald-400' : 'text-rose-400'"
383
398
  />
384
399
  <span class="text-[13px] font-medium text-slate-200">
385
- {{ infraSetup.started ? t('testing.standup.up') : t('testing.standup.failed') }}
400
+ {{ standupHeadline }}
386
401
  </span>
387
402
  <span v-if="infraSetup.durationMs != null" class="ms-auto text-[11px] text-slate-500">
388
403
  {{
@@ -149,6 +149,10 @@ export const useObservabilityStore = defineStore('observability', () => {
149
149
  // the harness's job-scoped counter, which a proxied call has no equivalent of. Null is
150
150
  // what the stored row will say too, so the live row and the loaded one agree.
151
151
  turnIndex: null,
152
+ // A live event is always a PROXIED call, and the proxy has no shortfall concept: it sees one
153
+ // HTTP call at a time and files it. Only a harness CLI's step-level remainder is spend-only,
154
+ // and that arrives through the stored row, never here.
155
+ spendOnly: false,
152
156
  promptText: '',
153
157
  promptPrefixCount: 0,
154
158
  promptHash: '',
@@ -3844,7 +3844,9 @@
3844
3844
  "prompt": "Prompt",
3845
3845
  "promptPrefixOmitted": "(nur neue Nachrichten: {count} frühere ausgelassen)",
3846
3846
  "response": "Antwort",
3847
- "reasoning": "Reasoning"
3847
+ "reasoning": "Reasoning",
3848
+ "spendOnly": "kein Aufruf",
3849
+ "spendOnlyTitle": "Tokenverbrauch, den der Harness gemeldet hat, ohne ihn einer Runde zuzuordnen. Zaehlt in den Token-Summen dieses Laufs und in keiner Aufrufzahl."
3848
3850
  },
3849
3851
  "context": {
3850
3852
  "injectedFiles": "Injizierte Kontextdateien",
@@ -6626,6 +6628,7 @@
6626
6628
  "standup": {
6627
6629
  "up": "Abhängigkeiten gestartet",
6628
6630
  "failed": "Abhängigkeiten konnten nicht gestartet werden",
6631
+ "noDocker": "Kein Docker-Daemon im Executor",
6629
6632
  "took": "Dauerte {seconds}s",
6630
6633
  "showLogs": "Stand-up-Logs anzeigen",
6631
6634
  "hideLogs": "Stand-up-Logs verbergen"
@@ -1895,7 +1895,9 @@
1895
1895
  "prompt": "Prompt",
1896
1896
  "promptPrefixOmitted": "(new messages only: {count} earlier omitted)",
1897
1897
  "response": "Response",
1898
- "reasoning": "Reasoning"
1898
+ "reasoning": "Reasoning",
1899
+ "spendOnly": "not a call",
1900
+ "spendOnlyTitle": "Token spend the harness reported without attributing it to a turn. Counted in this run's token totals and in no call count."
1899
1901
  },
1900
1902
  "context": {
1901
1903
  "injectedFiles": "Injected context files",
@@ -6350,6 +6352,7 @@
6350
6352
  "standup": {
6351
6353
  "up": "Dependencies started",
6352
6354
  "failed": "Dependencies failed to start",
6355
+ "noDocker": "No Docker daemon in the executor",
6353
6356
  "took": "Took {seconds}s",
6354
6357
  "showLogs": "Show stand-up logs",
6355
6358
  "hideLogs": "Hide stand-up logs"
@@ -1791,7 +1791,9 @@
1791
1791
  "prompt": "Prompt",
1792
1792
  "promptPrefixOmitted": "(solo mensajes nuevos: {count} anteriores omitidos)",
1793
1793
  "response": "Respuesta",
1794
- "reasoning": "Razonamiento"
1794
+ "reasoning": "Razonamiento",
1795
+ "spendOnly": "no es una llamada",
1796
+ "spendOnlyTitle": "Consumo de tokens que el harness informo sin atribuirlo a ningun turno. Cuenta en los totales de tokens de esta ejecucion y en ningun recuento de llamadas."
1795
1797
  },
1796
1798
  "context": {
1797
1799
  "injectedFiles": "Archivos de contexto inyectados",
@@ -6051,6 +6053,7 @@
6051
6053
  "standup": {
6052
6054
  "up": "Dependencias iniciadas",
6053
6055
  "failed": "No se pudieron iniciar las dependencias",
6056
+ "noDocker": "No hay demonio de Docker en el ejecutor",
6054
6057
  "took": "Tardó {seconds}s",
6055
6058
  "showLogs": "Mostrar registros de arranque",
6056
6059
  "hideLogs": "Ocultar registros de arranque"
@@ -1791,7 +1791,9 @@
1791
1791
  "prompt": "Prompt",
1792
1792
  "promptPrefixOmitted": "(nouveaux messages uniquement : {count} antérieurs omis)",
1793
1793
  "response": "Réponse",
1794
- "reasoning": "Raisonnement"
1794
+ "reasoning": "Raisonnement",
1795
+ "spendOnly": "pas un appel",
1796
+ "spendOnlyTitle": "Consommation de jetons signalee par le harness sans etre attribuee a un tour. Comptee dans les totaux de jetons de cette execution et dans aucun nombre d'appels."
1795
1797
  },
1796
1798
  "context": {
1797
1799
  "injectedFiles": "Fichiers de contexte injectés",
@@ -6051,6 +6053,7 @@
6051
6053
  "standup": {
6052
6054
  "up": "Dépendances démarrées",
6053
6055
  "failed": "Échec du démarrage des dépendances",
6056
+ "noDocker": "Aucun démon Docker dans l’exécuteur",
6054
6057
  "took": "Durée : {seconds}s",
6055
6058
  "showLogs": "Afficher les journaux de démarrage",
6056
6059
  "hideLogs": "Masquer les journaux de démarrage"
@@ -1791,7 +1791,9 @@
1791
1791
  "prompt": "פרומפט",
1792
1792
  "promptPrefixOmitted": "(הודעות חדשות בלבד: {count} מוקדמות יותר הושמטו)",
1793
1793
  "response": "תגובה",
1794
- "reasoning": "חשיבה"
1794
+ "reasoning": "חשיבה",
1795
+ "spendOnly": "לא קריאה",
1796
+ "spendOnlyTitle": "צריכת טוקנים שה-harness דיווח עליה בלי לשייך אותה לתור כלשהו. נספרת בסכומי הטוקנים של ריצה זו ולא בשום ספירת קריאות."
1795
1797
  },
1796
1798
  "context": {
1797
1799
  "injectedFiles": "קבצי הקשר שהוזרקו",
@@ -6049,6 +6051,7 @@
6049
6051
  "standup": {
6050
6052
  "up": "התלויות הופעלו",
6051
6053
  "failed": "התלויות נכשלו בהפעלה",
6054
+ "noDocker": "אין דמון Docker במריץ",
6052
6055
  "took": "ארך {seconds} שניות",
6053
6056
  "showLogs": "הצג יומני הקמה",
6054
6057
  "hideLogs": "הסתר יומני הקמה"
@@ -3844,7 +3844,9 @@
3844
3844
  "prompt": "Prompt",
3845
3845
  "promptPrefixOmitted": "(solo nuovi messaggi: {count} precedenti omessi)",
3846
3846
  "response": "Risposta",
3847
- "reasoning": "Ragionamento"
3847
+ "reasoning": "Ragionamento",
3848
+ "spendOnly": "non e una chiamata",
3849
+ "spendOnlyTitle": "Consumo di token che l'harness ha riportato senza attribuirlo a un turno. Conta nei totali di token di questa esecuzione e in nessun conteggio di chiamate."
3848
3850
  },
3849
3851
  "context": {
3850
3852
  "injectedFiles": "File di contesto iniettati",
@@ -6626,6 +6628,7 @@
6626
6628
  "standup": {
6627
6629
  "up": "Dipendenze avviate",
6628
6630
  "failed": "Avvio delle dipendenze non riuscito",
6631
+ "noDocker": "Nessun demone Docker nell’executor",
6629
6632
  "took": "Ha richiesto {seconds}s",
6630
6633
  "showLogs": "Mostra i log di avvio",
6631
6634
  "hideLogs": "Nascondi i log di avvio"
@@ -1791,7 +1791,9 @@
1791
1791
  "prompt": "プロンプト",
1792
1792
  "promptPrefixOmitted": "(新規メッセージのみ: 以前の {count} 件を省略)",
1793
1793
  "response": "レスポンス",
1794
- "reasoning": "推論"
1794
+ "reasoning": "推論",
1795
+ "spendOnly": "呼び出しではありません",
1796
+ "spendOnlyTitle": "ハーネスがターンに紐付けずに報告したトークン消費です。この実行のトークン合計には含まれ、呼び出し数には含まれません。"
1795
1797
  },
1796
1798
  "context": {
1797
1799
  "injectedFiles": "注入されたコンテキストファイル",
@@ -6049,6 +6051,7 @@
6049
6051
  "standup": {
6050
6052
  "up": "依存関係を起動しました",
6051
6053
  "failed": "依存関係の起動に失敗しました",
6054
+ "noDocker": "エグゼキューターに Docker デーモンがありません",
6052
6055
  "took": "所要時間 {seconds}秒",
6053
6056
  "showLogs": "スタンドアップログを表示",
6054
6057
  "hideLogs": "スタンドアップログを非表示"
@@ -1791,7 +1791,9 @@
1791
1791
  "prompt": "Prompt",
1792
1792
  "promptPrefixOmitted": "(tylko nowe wiadomości: {count} wcześniejszych pominięto)",
1793
1793
  "response": "Odpowiedź",
1794
- "reasoning": "Rozumowanie"
1794
+ "reasoning": "Rozumowanie",
1795
+ "spendOnly": "to nie wywolanie",
1796
+ "spendOnlyTitle": "Zuzycie tokenow zgloszone przez harness bez przypisania do tury. Liczone w sumach tokenow tego przebiegu i w zadnej liczbie wywolan."
1795
1797
  },
1796
1798
  "context": {
1797
1799
  "injectedFiles": "Wstrzyknięte pliki kontekstu",
@@ -6051,6 +6053,7 @@
6051
6053
  "standup": {
6052
6054
  "up": "Zależności uruchomione",
6053
6055
  "failed": "Nie udało się uruchomić zależności",
6056
+ "noDocker": "Brak demona Dockera w wykonawcy",
6054
6057
  "took": "Czas: {seconds}s",
6055
6058
  "showLogs": "Pokaż dzienniki uruchamiania",
6056
6059
  "hideLogs": "Ukryj dzienniki uruchamiania"
@@ -1791,7 +1791,9 @@
1791
1791
  "prompt": "İstem",
1792
1792
  "promptPrefixOmitted": "(yalnızca yeni mesajlar: {count} öncekisi atlandı)",
1793
1793
  "response": "Yanıt",
1794
- "reasoning": "Akıl yürütme"
1794
+ "reasoning": "Akıl yürütme",
1795
+ "spendOnly": "cagri degil",
1796
+ "spendOnlyTitle": "Harness'in bir tura atfetmeden bildirdigi token harcamasi. Bu calismanin token toplamlarina dahildir, cagri sayisina dahil degildir."
1795
1797
  },
1796
1798
  "context": {
1797
1799
  "injectedFiles": "Eklenen bağlam dosyaları",
@@ -6049,6 +6051,7 @@
6049
6051
  "standup": {
6050
6052
  "up": "Bağımlılıklar başlatıldı",
6051
6053
  "failed": "Bağımlılıklar başlatılamadı",
6054
+ "noDocker": "Yürütücüde Docker arka plan hizmeti yok",
6052
6055
  "took": "{seconds}sn sürdü",
6053
6056
  "showLogs": "Başlatma günlüklerini göster",
6054
6057
  "hideLogs": "Başlatma günlüklerini gizle"
@@ -1791,7 +1791,9 @@
1791
1791
  "prompt": "Запит",
1792
1792
  "promptPrefixOmitted": "(лише нові повідомлення: {count} раніших пропущено)",
1793
1793
  "response": "Відповідь",
1794
- "reasoning": "Міркування"
1794
+ "reasoning": "Міркування",
1795
+ "spendOnly": "не виклик",
1796
+ "spendOnlyTitle": "Витрати токенів, які harness повідомив, не пов'язавши їх із жодним ходом. Враховуються в загальних сумах токенів цього запуску і в жодному підрахунку викликів."
1795
1797
  },
1796
1798
  "context": {
1797
1799
  "injectedFiles": "Впроваджені файли контексту",
@@ -6051,6 +6053,7 @@
6051
6053
  "standup": {
6052
6054
  "up": "Залежності запущено",
6053
6055
  "failed": "Не вдалося запустити залежності",
6056
+ "noDocker": "У виконавці немає демона Docker",
6054
6057
  "took": "Час: {seconds}s",
6055
6058
  "showLogs": "Показати журнали запуску",
6056
6059
  "hideLogs": "Сховати журнали запуску"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/app",
3
- "version": "0.285.1",
3
+ "version": "0.286.1",
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",
@@ -18,7 +18,7 @@
18
18
  "access": "public"
19
19
  },
20
20
  "dependencies": {
21
- "@cat-factory/contracts": "0.328.0",
21
+ "@cat-factory/contracts": "0.330.0",
22
22
  "@modular-frontend/core": "0.6.0",
23
23
  "@modular-vue/core": "^1.5.0",
24
24
  "@modular-vue/journeys": "^1.4.0",