@cat-factory/app 0.95.1 → 0.96.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.
@@ -35,6 +35,11 @@ export const useExecutionStore = defineStore('execution', () => {
35
35
  return e.rev ?? 0
36
36
  }
37
37
 
38
+ /** A finished run — nothing further will execute or emit. Matches `runLive`/`runFailed`. */
39
+ function isTerminal(status: ExecutionInstance['status']): boolean {
40
+ return status === 'done' || status === 'failed'
41
+ }
42
+
38
43
  /**
39
44
  * Reconcile the cached executions with a server snapshot for `workspaceId`. A snapshot
40
45
  * is authoritative EXCEPT where a live `execution` event already advanced (or ADDED) a
@@ -45,7 +50,24 @@ export const useExecutionStore = defineStore('execution', () => {
45
50
  * can't revert a just-terminal run to `running`. A terminal run emits nothing
46
51
  * further, so a regression here would strand the UI until an unrelated refresh.
47
52
  * - DROP: a run a live event just ADDED that the (older) snapshot never saw — keep it
48
- * rather than silently dropping it.
53
+ * rather than silently dropping it, but ONLY when it is not the terminal predecessor a
54
+ * retry replaced (see below).
55
+ *
56
+ * The DROP caveat matters because a retry/restart REPLACES a block's run with a fresh one
57
+ * under a NEW id (the old run is deleted server-side), so the two attempts can't be
58
+ * reconciled by id or `rev`. Since there is exactly one run per block, a cached-only run
59
+ * whose block the snapshot already covers is that superseded predecessor — drop it.
60
+ * Preserving it would leave the dead `failed` run shadowing the running one in the by-block
61
+ * projection (`agentRuns.byBlock`, last-write-wins), keeping the failure banner up and its
62
+ * empty trail hiding the retry's carried-forward failure history.
63
+ *
64
+ * The drop is gated on the cached run being TERMINAL (`done`/`failed`): only a finished
65
+ * predecessor is ever superseded. A cached run still `running`/`blocked`/`paused` is a
66
+ * genuinely live-added run, so it must survive even when a stale reconnect snapshot (fetched
67
+ * before a retry, resolving late under load — see `useWorkspaceStream`) still lists its
68
+ * block's now-deleted predecessor. Dropping a live run there would strand the UI showing the
69
+ * dead attempt — the inverse of the bug this guard fixes — and `rev` can't catch it (the
70
+ * ids differ).
49
71
  */
50
72
  function hydrate(next: ExecutionInstance[], workspaceId: string) {
51
73
  const sameWorkspace = hydratedWorkspaceId === workspaceId
@@ -55,12 +77,19 @@ export const useExecutionStore = defineStore('execution', () => {
55
77
  return
56
78
  }
57
79
  const incomingIds = new Set(next.map((e) => e.id))
80
+ const incomingBlocks = new Set(next.map((e) => e.blockId))
58
81
  const held = new Map(instances.value.map((e) => [e.id, e]))
59
82
  const reconciled = next.map((incoming) => {
60
83
  const current = held.get(incoming.id)
61
84
  return current && revOf(current) > revOf(incoming) ? current : incoming
62
85
  })
63
- const preserved = [...held.values()].filter((e) => !incomingIds.has(e.id))
86
+ // Preserve a cached-only run UNLESS it is the terminal predecessor a retry replaced: a
87
+ // finished (`done`/`failed`) run whose block the snapshot now covers under a fresh id.
88
+ // Gating on the CACHED run being terminal keeps a live `running`/`blocked`/`paused` run
89
+ // that a stale snapshot happens to omit.
90
+ const preserved = [...held.values()].filter(
91
+ (e) => !incomingIds.has(e.id) && !(isTerminal(e.status) && incomingBlocks.has(e.blockId)),
92
+ )
64
93
  instances.value = [...reconciled, ...preserved]
65
94
  }
66
95
 
@@ -87,7 +116,13 @@ export const useExecutionStore = defineStore('execution', () => {
87
116
  }
88
117
 
89
118
  function getByBlock(blockId: string) {
90
- return instances.value.find((e) => e.blockId === blockId)
119
+ const runs = instances.value.filter((e) => e.blockId === blockId)
120
+ if (runs.length <= 1) return runs[0]
121
+ // A block only holds several runs transiently: a stale reconnect snapshot re-listing a
122
+ // retry's now-deleted terminal predecessor alongside the live successor. Prefer the live
123
+ // one so this projection agrees with `agentRuns.byBlock` (whose last-write-wins already
124
+ // resolves to it) — the failed predecessor is dead and about to fall out on the next read.
125
+ return runs.find((e) => !isTerminal(e.status)) ?? runs.at(-1)
91
126
  }
92
127
 
93
128
  /** How many decisions anywhere are awaiting a human. */
@@ -1,6 +1,11 @@
1
1
  import { defineStore } from 'pinia'
2
2
  import { ref } from 'vue'
3
- import type { AgentContextSnapshot, LlmCallActivity, LlmCallMetric } from '~/types/execution'
3
+ import type {
4
+ AgentContextSnapshot,
5
+ AgentSearchQuery,
6
+ LlmCallActivity,
7
+ LlmCallMetric,
8
+ } from '~/types/execution'
4
9
  import { useWorkspaceStore } from '~/stores/workspace'
5
10
 
6
11
  /**
@@ -23,6 +28,16 @@ export const useObservabilityStore = defineStore('observability', () => {
23
28
  const contextByExecution = ref<Record<string, AgentContextSnapshot[]>>({})
24
29
  /** Execution ids whose context is currently loading. */
25
30
  const contextLoading = ref<Set<string>>(new Set())
31
+ /**
32
+ * Last context-load error message per execution id, or null. Distinguishes a genuine fetch
33
+ * failure from a run with no captured context: without this, a swallowed error rendered as
34
+ * the "no context stored" empty state — indistinguishable from success-with-nothing.
35
+ */
36
+ const contextErrors = ref<Record<string, string | null>>({})
37
+ /** Per-execution-id performed-search-query list (newest first). */
38
+ const searchQueriesByExecution = ref<Record<string, AgentSearchQuery[]>>({})
39
+ /** Execution ids whose search queries are currently loading. */
40
+ const searchQueriesLoading = ref<Set<string>>(new Set())
26
41
  /** Execution ids currently loading. */
27
42
  const loading = ref<Set<string>>(new Set())
28
43
  /** Execution ids currently exporting. */
@@ -124,13 +139,43 @@ export const useObservabilityStore = defineStore('observability', () => {
124
139
  async function loadContext(executionId: string) {
125
140
  if (!workspace.workspaceId) return
126
141
  withFlag(contextLoading, executionId, true)
142
+ contextErrors.value = { ...contextErrors.value, [executionId]: null }
127
143
  try {
128
144
  const { snapshots } = await api.getAgentContext(workspace.requireId(), executionId)
129
145
  contextByExecution.value = { ...contextByExecution.value, [executionId]: snapshots }
146
+ } catch (err) {
147
+ // Record the error so the panel can offer a retry instead of masquerading the failure as
148
+ // the "no context stored" empty state.
149
+ contextErrors.value = {
150
+ ...contextErrors.value,
151
+ [executionId]: err instanceof Error ? err.message : 'Failed to load context',
152
+ }
153
+ } finally {
154
+ withFlag(contextLoading, executionId, false)
155
+ }
156
+ }
157
+
158
+ function searchQueriesFor(executionId: string): AgentSearchQuery[] {
159
+ return searchQueriesByExecution.value[executionId] ?? []
160
+ }
161
+ function isSearchQueriesLoading(executionId: string): boolean {
162
+ return searchQueriesLoading.value.has(executionId)
163
+ }
164
+
165
+ /** Load (or refresh) the performed web-search queries for a run. */
166
+ async function loadSearchQueries(executionId: string) {
167
+ if (!workspace.workspaceId) return
168
+ withFlag(searchQueriesLoading, executionId, true)
169
+ try {
170
+ const { searchQueries } = await api.getSearchQueries(workspace.requireId(), executionId)
171
+ searchQueriesByExecution.value = {
172
+ ...searchQueriesByExecution.value,
173
+ [executionId]: searchQueries,
174
+ }
130
175
  } catch {
131
176
  // Best-effort: the panel shows an empty state; nothing is persisted client-side.
132
177
  } finally {
133
- withFlag(contextLoading, executionId, false)
178
+ withFlag(searchQueriesLoading, executionId, false)
134
179
  }
135
180
  }
136
181
 
@@ -166,8 +211,13 @@ export const useObservabilityStore = defineStore('observability', () => {
166
211
  appendCall,
167
212
  downloadExport,
168
213
  contextByExecution,
214
+ contextErrors,
169
215
  contextFor,
170
216
  isContextLoading,
171
217
  loadContext,
218
+ searchQueriesByExecution,
219
+ searchQueriesFor,
220
+ isSearchQueriesLoading,
221
+ loadSearchQueries,
172
222
  }
173
223
  })
@@ -23,7 +23,11 @@ export const usePreviewStore = defineStore('preview', () => {
23
23
 
24
24
  // Active poll timers while a preview is `starting`, so a settled/left preview stops polling.
25
25
  const timers = new Map<string, ReturnType<typeof setTimeout>>()
26
+ // Consecutive poll-tick failures per frame while `starting`, so a transient blip keeps polling
27
+ // (self-heals) but a persistent failure eventually surfaces instead of spinning forever.
28
+ const pollErrors = new Map<string, number>()
26
29
  const POLL_INTERVAL_MS = 2_500
30
+ const POLL_MAX_ERRORS = 5
27
31
 
28
32
  function stopPolling(frameId: string) {
29
33
  const timer = timers.get(frameId)
@@ -31,6 +35,7 @@ export const usePreviewStore = defineStore('preview', () => {
31
35
  clearTimeout(timer)
32
36
  timers.delete(frameId)
33
37
  }
38
+ pollErrors.delete(frameId)
34
39
  }
35
40
 
36
41
  function apply(frameId: string, state: PreviewState) {
@@ -50,9 +55,36 @@ export const usePreviewStore = defineStore('preview', () => {
50
55
  async function refresh(frameId: string): Promise<void> {
51
56
  const ws = useWorkspaceStore()
52
57
  try {
53
- apply(frameId, await api.getPreview(ws.requireId(), frameId))
54
- } catch {
55
- // A transient error leaves the last known state; stop polling so we don't spin.
58
+ const state = await api.getPreview(ws.requireId(), frameId)
59
+ pollErrors.delete(frameId)
60
+ // Clear any stale error from an earlier failed request/poll so a now-successful fetch
61
+ // doesn't render a working preview under a leftover error banner.
62
+ requestError.value[frameId] = undefined
63
+ apply(frameId, state)
64
+ } catch (err) {
65
+ // If we were polling a `starting` preview, a transient error must NOT silently wedge the
66
+ // amber "Starting…" forever with no recovery: keep polling (it self-heals when the runtime
67
+ // recovers) up to POLL_MAX_ERRORS, then give up.
68
+ const prev = byFrame.value[frameId]
69
+ if (prev?.status === 'starting') {
70
+ const n = (pollErrors.get(frameId) ?? 0) + 1
71
+ if (n <= POLL_MAX_ERRORS) {
72
+ pollErrors.set(frameId, n)
73
+ timers.set(
74
+ frameId,
75
+ setTimeout(() => void refresh(frameId), POLL_INTERVAL_MS),
76
+ )
77
+ return
78
+ }
79
+ // Gave up: the preview never became reachable through the blips. Flip it out of the amber
80
+ // "Starting…" into a `failed` state carrying the error (with a Start to retry), rather than
81
+ // leaving the status claiming "Starting…" while polling has silently stopped.
82
+ byFrame.value[frameId] = {
83
+ ...prev,
84
+ status: 'failed',
85
+ error: err instanceof Error ? err.message : String(err),
86
+ }
87
+ }
56
88
  stopPolling(frameId)
57
89
  }
58
90
  }
@@ -24,6 +24,9 @@ export type {
24
24
  LlmCallActivity,
25
25
  LlmExportInsight,
26
26
  LlmMetricsExport,
27
+ AgentSearchQuery,
28
+ WebSearchAvailability,
29
+ WebSearchProvider,
27
30
  PipelineStep,
28
31
  FollowUpItemKind,
29
32
  FollowUpItemStatus,
@@ -3,7 +3,8 @@
3
3
  "loading": "Loading…",
4
4
  "loadingBoard": "Loading board…",
5
5
  "backendUnreachable": "Can't reach the backend",
6
- "reconnecting": "Reconnecting…"
6
+ "reconnecting": "Reconnecting…",
7
+ "offline": "Not receiving live updates"
7
8
  },
8
9
  "language": {
9
10
  "switcher": "Language",
@@ -96,6 +97,7 @@
96
97
  "moveFailed": "Could not move",
97
98
  "deleteFailed": "Could not delete",
98
99
  "linkFailed": "Could not link tasks",
100
+ "unlinkFailed": "Could not remove dependency",
99
101
  "recurringDeleteFailed": "Could not delete recurring pipeline",
100
102
  "deleted": "Deleted \"{name}\"",
101
103
  "moved": "Moved \"{name}\""
@@ -1006,6 +1008,8 @@
1006
1008
  "companionCapDetail": "Do one more automatic rework round, proceed to the next step accepting the current output, or stop and reset the task so you can edit the inputs and resubmit.",
1007
1009
  "infraAttempts": "Infrastructure attempts",
1008
1010
  "hideInfraAttempts": "Hide infrastructure attempts",
1011
+ "executionHistory": "Execution history",
1012
+ "hideExecutionHistory": "Hide execution history",
1009
1013
  "editingConclusions": "Editing the conclusions",
1010
1014
  "editConclusionsPlaceholder": "Edit the agent's conclusions; your edits are saved when you approve…",
1011
1015
  "noProseOutput": "This agent produced no prose output.",
@@ -1093,6 +1097,7 @@
1093
1097
  "loadingContext": "Loading provided context…",
1094
1098
  "noCalls": "No model calls recorded for this run.",
1095
1099
  "noContext": "No agent context stored for this run. It is captured per dispatch when the workspace has 'Store full agent context' enabled.",
1100
+ "contextError": "Could not load the provided context.",
1096
1101
  "summary": {
1097
1102
  "calls": "Calls",
1098
1103
  "tokensInOut": "Tokens (in / out)",
@@ -1139,6 +1144,16 @@
1139
1144
  "systemPrompt": "System prompt",
1140
1145
  "userPrompt": "User prompt",
1141
1146
  "details": "Details"
1147
+ },
1148
+ "webSearch": "Web search",
1149
+ "loadingSearch": "Loading web searches…",
1150
+ "noSearch": "No web searches recorded for this run. Queries are captured when web search runs and the workspace has 'Store full agent context' enabled.",
1151
+ "search": {
1152
+ "available": "Available",
1153
+ "unavailable": "Unavailable",
1154
+ "provider": "Provider",
1155
+ "resultsCount": "{count} result | {count} results",
1156
+ "queriesTitle": "Performed searches"
1142
1157
  }
1143
1158
  },
1144
1159
  "auth": {
@@ -3325,8 +3340,6 @@
3325
3340
  "description": "Noun label heading the recorded reply to a finding (the answer that was given), not the verb."
3326
3341
  },
3327
3342
  "answerPlaceholder": "Answer this finding…",
3328
- "refineAnswerPlaceholder": "Refine your answer…",
3329
- "saveAnswer": "Save answer",
3330
3343
  "dismissIrrelevant": "Dismiss as irrelevant",
3331
3344
  "reopen": "Reopen",
3332
3345
  "docHeading": "Clarified bug report",
@@ -3,7 +3,8 @@
3
3
  "loading": "Cargando…",
4
4
  "loadingBoard": "Cargando tablero…",
5
5
  "backendUnreachable": "No se puede conectar con el backend",
6
- "reconnecting": "Reconectando…"
6
+ "reconnecting": "Reconectando…",
7
+ "offline": "No se reciben actualizaciones en vivo"
7
8
  },
8
9
  "language": {
9
10
  "switcher": "Idioma",
@@ -81,6 +82,7 @@
81
82
  "moveFailed": "No se pudo mover",
82
83
  "deleteFailed": "No se pudo eliminar",
83
84
  "linkFailed": "No se pudieron vincular las tareas",
85
+ "unlinkFailed": "No se pudo eliminar la dependencia",
84
86
  "recurringDeleteFailed": "No se pudo eliminar el pipeline recurrente",
85
87
  "deleted": "\"{name}\" eliminado",
86
88
  "moved": "\"{name}\" movido"
@@ -963,6 +965,8 @@
963
965
  "companionCapDetail": "Haz una ronda más de reelaboración automática, avanza al siguiente paso aceptando la salida actual, o detén y restablece la tarea para que puedas editar las entradas y reenviarla.",
964
966
  "infraAttempts": "Intentos de infraestructura",
965
967
  "hideInfraAttempts": "Ocultar intentos de infraestructura",
968
+ "executionHistory": "Historial de ejecución",
969
+ "hideExecutionHistory": "Ocultar historial de ejecución",
966
970
  "editingConclusions": "Editando las conclusiones",
967
971
  "editConclusionsPlaceholder": "Edita las conclusiones del agente; tus cambios se guardan cuando apruebas…",
968
972
  "noProseOutput": "Este agente no produjo salida en prosa.",
@@ -1050,6 +1054,7 @@
1050
1054
  "loadingContext": "Cargando contexto proporcionado…",
1051
1055
  "noCalls": "No se registraron llamadas al modelo en esta ejecución.",
1052
1056
  "noContext": "No se almacenó contexto del agente para esta ejecución. Se captura por despacho cuando el espacio de trabajo tiene activado 'Almacenar contexto completo del agente'.",
1057
+ "contextError": "No se pudo cargar el contexto proporcionado.",
1053
1058
  "summary": {
1054
1059
  "calls": "Llamadas",
1055
1060
  "tokensInOut": "Tokens (entrada / salida)",
@@ -1096,6 +1101,16 @@
1096
1101
  "systemPrompt": "Prompt del sistema",
1097
1102
  "userPrompt": "Prompt del usuario",
1098
1103
  "details": "Detalles"
1104
+ },
1105
+ "webSearch": "Búsqueda web",
1106
+ "loadingSearch": "Cargando búsquedas web…",
1107
+ "noSearch": "No se registraron búsquedas web para esta ejecución. Las consultas se capturan cuando se ejecuta la búsqueda web y el espacio de trabajo tiene activado 'Almacenar contexto completo del agente'.",
1108
+ "search": {
1109
+ "available": "Disponible",
1110
+ "unavailable": "No disponible",
1111
+ "provider": "Proveedor",
1112
+ "resultsCount": "{count} resultado | {count} resultados",
1113
+ "queriesTitle": "Búsquedas realizadas"
1099
1114
  }
1100
1115
  },
1101
1116
  "auth": {
@@ -3218,8 +3233,6 @@
3218
3233
  "reReviewingStage": "Volviendo a revisar el informe de error actualizado… Puedes cerrar esto, te avisaremos solo si se necesita más información.",
3219
3234
  "answerLabel": "Respuesta",
3220
3235
  "answerPlaceholder": "Responde a este hallazgo…",
3221
- "refineAnswerPlaceholder": "Refina tu respuesta…",
3222
- "saveAnswer": "Guardar respuesta",
3223
3236
  "dismissIrrelevant": "Descartar por irrelevante",
3224
3237
  "reopen": "Reabrir",
3225
3238
  "docHeading": "Informe de error aclarado",
@@ -3,7 +3,8 @@
3
3
  "loading": "Chargement…",
4
4
  "loadingBoard": "Chargement du tableau…",
5
5
  "backendUnreachable": "Impossible de joindre le backend",
6
- "reconnecting": "Reconnexion…"
6
+ "reconnecting": "Reconnexion…",
7
+ "offline": "Mises à jour en direct non reçues"
7
8
  },
8
9
  "language": {
9
10
  "switcher": "Langue",
@@ -81,6 +82,7 @@
81
82
  "moveFailed": "Impossible de déplacer",
82
83
  "deleteFailed": "Impossible de supprimer",
83
84
  "linkFailed": "Impossible de lier les tâches",
85
+ "unlinkFailed": "Impossible de supprimer la dépendance",
84
86
  "recurringDeleteFailed": "Impossible de supprimer le pipeline récurrent",
85
87
  "deleted": "\"{name}\" supprimé",
86
88
  "moved": "\"{name}\" déplacé"
@@ -963,6 +965,8 @@
963
965
  "companionCapDetail": "Effectuer un tour de retravail automatique supplémentaire, passer à l'étape suivante en acceptant la sortie actuelle, ou arrêter et réinitialiser la tâche pour modifier les entrées et la resoumettre.",
964
966
  "infraAttempts": "Tentatives d'infrastructure",
965
967
  "hideInfraAttempts": "Masquer les tentatives d'infrastructure",
968
+ "executionHistory": "Historique d'exécution",
969
+ "hideExecutionHistory": "Masquer l'historique d'exécution",
966
970
  "editingConclusions": "Modification des conclusions",
967
971
  "editConclusionsPlaceholder": "Modifiez les conclusions de l'agent ; vos modifications sont enregistrées lorsque vous approuvez…",
968
972
  "noProseOutput": "Cet agent n'a produit aucune sortie en texte libre.",
@@ -1050,6 +1054,7 @@
1050
1054
  "loadingContext": "Chargement du contexte fourni…",
1051
1055
  "noCalls": "Aucun appel de modèle enregistré pour cette exécution.",
1052
1056
  "noContext": "Aucun contexte d'agent stocké pour cette exécution. Il est capturé à chaque dispatch lorsque l'espace de travail a activé 'Stocker le contexte complet de l'agent'.",
1057
+ "contextError": "Impossible de charger le contexte fourni.",
1053
1058
  "summary": {
1054
1059
  "calls": "Appels",
1055
1060
  "tokensInOut": "Tokens (entrée / sortie)",
@@ -1096,6 +1101,16 @@
1096
1101
  "systemPrompt": "Prompt système",
1097
1102
  "userPrompt": "Prompt utilisateur",
1098
1103
  "details": "Détails"
1104
+ },
1105
+ "webSearch": "Recherche web",
1106
+ "loadingSearch": "Chargement des recherches web…",
1107
+ "noSearch": "Aucune recherche web enregistrée pour cette exécution. Les requêtes sont capturées lorsque la recherche web s'exécute et que l'espace de travail a activé « Stocker le contexte complet de l'agent ».",
1108
+ "search": {
1109
+ "available": "Disponible",
1110
+ "unavailable": "Indisponible",
1111
+ "provider": "Fournisseur",
1112
+ "resultsCount": "{count} résultat | {count} résultats",
1113
+ "queriesTitle": "Recherches effectuées"
1099
1114
  }
1100
1115
  },
1101
1116
  "auth": {
@@ -3218,8 +3233,6 @@
3218
3233
  "reReviewingStage": "Nouvelle relecture du rapport de bogue mis à jour… Vous pouvez fermer ceci, nous vous avertirons seulement si plus d'informations sont nécessaires.",
3219
3234
  "answerLabel": "Réponse",
3220
3235
  "answerPlaceholder": "Répondez à ce constat…",
3221
- "refineAnswerPlaceholder": "Affinez votre réponse…",
3222
- "saveAnswer": "Enregistrer la réponse",
3223
3236
  "dismissIrrelevant": "Écarter comme non pertinent",
3224
3237
  "reopen": "Rouvrir",
3225
3238
  "docHeading": "Rapport de bogue clarifié",
@@ -3,7 +3,8 @@
3
3
  "loading": "טוען…",
4
4
  "loadingBoard": "טוען לוח…",
5
5
  "backendUnreachable": "לא ניתן להתחבר לבקאנד",
6
- "reconnecting": "מתחבר מחדש…"
6
+ "reconnecting": "מתחבר מחדש…",
7
+ "offline": "לא מתקבלים עדכונים חיים"
7
8
  },
8
9
  "language": {
9
10
  "switcher": "שפה",
@@ -81,6 +82,7 @@
81
82
  "moveFailed": "לא ניתן היה להעביר",
82
83
  "deleteFailed": "לא ניתן היה למחוק",
83
84
  "linkFailed": "לא ניתן היה לקשר משימות",
85
+ "unlinkFailed": "לא ניתן להסיר את התלות",
84
86
  "recurringDeleteFailed": "לא ניתן היה למחוק את הצינור החוזר",
85
87
  "deleted": "\"{name}\" נמחק",
86
88
  "moved": "\"{name}\" הועבר"
@@ -963,6 +965,8 @@
963
965
  "companionCapDetail": "בצע סבב עיבוד אוטומטי נוסף, המשך לשלב הבא תוך קבלת הפלט הנוכחי, או עצור ואפס את המשימה כדי לערוך את הקלטים ולשלוח מחדש.",
964
966
  "infraAttempts": "ניסיונות תשתית",
965
967
  "hideInfraAttempts": "הסתר ניסיונות תשתית",
968
+ "executionHistory": "היסטוריית הרצה",
969
+ "hideExecutionHistory": "הסתר היסטוריית הרצה",
966
970
  "editingConclusions": "עריכת המסקנות",
967
971
  "editConclusionsPlaceholder": "ערוך את מסקנות הסוכן; העריכות שלך נשמרות כשתאשר…",
968
972
  "noProseOutput": "סוכן זה לא הפיק פלט טקסטואלי.",
@@ -1050,6 +1054,7 @@
1050
1054
  "loadingContext": "טוען את ההקשר שסופק…",
1051
1055
  "noCalls": "לא נרשמו קריאות מודל עבור ריצה זו.",
1052
1056
  "noContext": "לא אוחסן הקשר סוכן עבור ריצה זו. הוא נלכד בכל שיגור כשבסביבת העבודה מופעל 'אחסן הקשר סוכן מלא'.",
1057
+ "contextError": "לא ניתן לטעון את ההקשר שסופק.",
1053
1058
  "summary": {
1054
1059
  "calls": "קריאות",
1055
1060
  "tokensInOut": "טוקנים (נכנס / יוצא)",
@@ -1096,6 +1101,16 @@
1096
1101
  "systemPrompt": "פרומפט מערכת",
1097
1102
  "userPrompt": "פרומפט משתמש",
1098
1103
  "details": "פרטים"
1104
+ },
1105
+ "webSearch": "חיפוש באינטרנט",
1106
+ "loadingSearch": "טוען חיפושי אינטרנט…",
1107
+ "noSearch": "לא נרשמו חיפושי אינטרנט עבור הרצה זו. שאילתות נלכדות כאשר חיפוש האינטרנט פועל וכאשר במרחב העבודה מופעל 'אחסון הקשר סוכן מלא'.",
1108
+ "search": {
1109
+ "available": "זמין",
1110
+ "unavailable": "לא זמין",
1111
+ "provider": "ספק",
1112
+ "resultsCount": "תוצאה {count} | {count} תוצאות",
1113
+ "queriesTitle": "חיפושים שבוצעו"
1099
1114
  }
1100
1115
  },
1101
1116
  "auth": {
@@ -3229,8 +3244,6 @@
3229
3244
  "reReviewingStage": "בודק מחדש את דוח הבאג המעודכן… תוכל לסגור את זה, נודיע לך רק אם נדרש קלט נוסף.",
3230
3245
  "answerLabel": "תשובה",
3231
3246
  "answerPlaceholder": "ענה על ממצא זה…",
3232
- "refineAnswerPlaceholder": "חדד את התשובה שלך…",
3233
- "saveAnswer": "שמור תשובה",
3234
3247
  "dismissIrrelevant": "דחה כלא רלוונטי",
3235
3248
  "reopen": "פתח מחדש",
3236
3249
  "docHeading": "דוח באג מובהר",
@@ -3,7 +3,8 @@
3
3
  "loading": "読み込み中…",
4
4
  "loadingBoard": "ボードを読み込み中…",
5
5
  "backendUnreachable": "バックエンドに接続できません",
6
- "reconnecting": "再接続中…"
6
+ "reconnecting": "再接続中…",
7
+ "offline": "ライブ更新を受信していません"
7
8
  },
8
9
  "language": {
9
10
  "switcher": "言語",
@@ -81,6 +82,7 @@
81
82
  "moveFailed": "移動できませんでした",
82
83
  "deleteFailed": "削除できませんでした",
83
84
  "linkFailed": "タスクをリンクできませんでした",
85
+ "unlinkFailed": "依存関係を削除できませんでした",
84
86
  "recurringDeleteFailed": "定期パイプラインを削除できませんでした",
85
87
  "deleted": "\"{name}\" を削除しました",
86
88
  "moved": "\"{name}\" を移動しました"
@@ -963,6 +965,8 @@
963
965
  "companionCapDetail": "自動の再作業をもう1回実行するか、現在の出力を受け入れて次のステップに進むか、タスクを停止してリセットし、入力を編集して再送信してください。",
964
966
  "infraAttempts": "インフラの試行",
965
967
  "hideInfraAttempts": "インフラの試行を非表示",
968
+ "executionHistory": "実行履歴",
969
+ "hideExecutionHistory": "実行履歴を非表示",
966
970
  "editingConclusions": "結論を編集中",
967
971
  "editConclusionsPlaceholder": "エージェントの結論を編集してください。編集内容は承認時に保存されます…",
968
972
  "noProseOutput": "このエージェントは文章出力を生成しませんでした。",
@@ -1050,6 +1054,7 @@
1050
1054
  "loadingContext": "提供されたコンテキストを読み込み中…",
1051
1055
  "noCalls": "この実行で記録されたモデル呼び出しはありません。",
1052
1056
  "noContext": "この実行で保存されたエージェントコンテキストはありません。ワークスペースで「エージェントコンテキストを完全保存」が有効な場合、ディスパッチごとに記録されます。",
1057
+ "contextError": "提供されたコンテキストを読み込めませんでした。",
1053
1058
  "summary": {
1054
1059
  "calls": "呼び出し",
1055
1060
  "tokensInOut": "トークン (入力 / 出力)",
@@ -1096,6 +1101,16 @@
1096
1101
  "systemPrompt": "システムプロンプト",
1097
1102
  "userPrompt": "ユーザープロンプト",
1098
1103
  "details": "詳細"
1104
+ },
1105
+ "webSearch": "ウェブ検索",
1106
+ "loadingSearch": "ウェブ検索を読み込み中…",
1107
+ "noSearch": "この実行のウェブ検索は記録されていません。クエリはウェブ検索の実行時、かつワークスペースで「エージェントコンテキスト全体を保存」が有効な場合に記録されます。",
1108
+ "search": {
1109
+ "available": "利用可能",
1110
+ "unavailable": "利用不可",
1111
+ "provider": "プロバイダー",
1112
+ "resultsCount": "{count} 件の結果 | {count} 件の結果",
1113
+ "queriesTitle": "実行した検索"
1099
1114
  }
1100
1115
  },
1101
1116
  "auth": {
@@ -3230,8 +3245,6 @@
3230
3245
  "reReviewingStage": "更新されたバグ報告を再レビュー中… これを閉じてもかまいません。追加の入力が必要な場合のみ通知します。",
3231
3246
  "answerLabel": "回答",
3232
3247
  "answerPlaceholder": "この指摘に回答…",
3233
- "refineAnswerPlaceholder": "回答を改善…",
3234
- "saveAnswer": "回答を保存",
3235
3248
  "dismissIrrelevant": "無関係として却下",
3236
3249
  "reopen": "再オープン",
3237
3250
  "docHeading": "明確化されたバグ報告",
@@ -3,7 +3,8 @@
3
3
  "loading": "Ładowanie…",
4
4
  "loadingBoard": "Ładowanie tablicy…",
5
5
  "backendUnreachable": "Nie można połączyć się z backendem",
6
- "reconnecting": "Ponowne łączenie…"
6
+ "reconnecting": "Ponowne łączenie…",
7
+ "offline": "Brak aktualizacji na żywo"
7
8
  },
8
9
  "language": {
9
10
  "switcher": "Język",
@@ -81,6 +82,7 @@
81
82
  "moveFailed": "Nie udało się przenieść",
82
83
  "deleteFailed": "Nie udało się usunąć",
83
84
  "linkFailed": "Nie udało się powiązać zadań",
85
+ "unlinkFailed": "Nie udało się usunąć zależności",
84
86
  "recurringDeleteFailed": "Nie udało się usunąć cyklicznego pipeline'u",
85
87
  "deleted": "Usunięto \"{name}\"",
86
88
  "moved": "Przeniesiono \"{name}\""
@@ -963,6 +965,8 @@
963
965
  "companionCapDetail": "Wykonaj jeszcze jedną automatyczną rundę przeróbki, przejdź do następnego kroku akceptując bieżący wynik, albo zatrzymaj i zresetuj zadanie, aby edytować dane wejściowe i przesłać ponownie.",
964
966
  "infraAttempts": "Próby infrastrukturalne",
965
967
  "hideInfraAttempts": "Ukryj próby infrastrukturalne",
968
+ "executionHistory": "Historia wykonania",
969
+ "hideExecutionHistory": "Ukryj historię wykonania",
966
970
  "editingConclusions": "Edytowanie wniosków",
967
971
  "editConclusionsPlaceholder": "Edytuj wnioski agenta; Twoje zmiany zostaną zapisane po zatwierdzeniu…",
968
972
  "noProseOutput": "Ten agent nie wytworzył wyniku tekstowego.",
@@ -1050,6 +1054,7 @@
1050
1054
  "loadingContext": "Ładowanie dostarczonego kontekstu…",
1051
1055
  "noCalls": "Brak zarejestrowanych wywołań modelu dla tego uruchomienia.",
1052
1056
  "noContext": "Brak zapisanego kontekstu agenta dla tego uruchomienia. Jest on przechwytywany przy każdym wysłaniu, gdy w obszarze roboczym włączono opcję 'Przechowuj pełny kontekst agenta'.",
1057
+ "contextError": "Nie udało się załadować dostarczonego kontekstu.",
1053
1058
  "summary": {
1054
1059
  "calls": "Wywołania",
1055
1060
  "tokensInOut": "Tokeny (we / wy)",
@@ -1096,6 +1101,16 @@
1096
1101
  "systemPrompt": "Prompt systemowy",
1097
1102
  "userPrompt": "Prompt użytkownika",
1098
1103
  "details": "Szczegóły"
1104
+ },
1105
+ "webSearch": "Wyszukiwanie w sieci",
1106
+ "loadingSearch": "Ładowanie wyszukań w sieci…",
1107
+ "noSearch": "Nie zarejestrowano wyszukań w sieci dla tego uruchomienia. Zapytania są rejestrowane, gdy wyszukiwanie w sieci jest uruchomione, a przestrzeń robocza ma włączone „Przechowuj pełny kontekst agenta”.",
1108
+ "search": {
1109
+ "available": "Dostępne",
1110
+ "unavailable": "Niedostępne",
1111
+ "provider": "Dostawca",
1112
+ "resultsCount": "{count} wynik | {count} wyniki | {count} wyników",
1113
+ "queriesTitle": "Wykonane wyszukiwania"
1099
1114
  }
1100
1115
  },
1101
1116
  "auth": {
@@ -3218,8 +3233,6 @@
3218
3233
  "reReviewingStage": "Ponowna recenzja zaktualizowanego zgłoszenia błędu… Możesz to zamknąć, powiadomimy Cię tylko, jeśli potrzebne będą dodatkowe informacje.",
3219
3234
  "answerLabel": "Odpowiedź",
3220
3235
  "answerPlaceholder": "Odpowiedz na tę uwagę…",
3221
- "refineAnswerPlaceholder": "Dopracuj swoją odpowiedź…",
3222
- "saveAnswer": "Zapisz odpowiedź",
3223
3236
  "dismissIrrelevant": "Odrzuć jako nieistotne",
3224
3237
  "reopen": "Otwórz ponownie",
3225
3238
  "docHeading": "Doprecyzowane zgłoszenie błędu",