@cat-factory/app 0.173.0 → 0.174.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.
@@ -5,6 +5,7 @@ import { blockTypeMeta, STATUS_META } from '~/utils/catalog'
5
5
  import { pipelineAllowedForManualStart } from '~/utils/pipeline'
6
6
  import PipelineProgress from '~/components/pipeline/PipelineProgress.vue'
7
7
  import IconButton from '~/components/common/IconButton.vue'
8
+ import { useInitiativePlanning } from '~/composables/useInitiativePlanning'
8
9
 
9
10
  const board = useBoardStore()
10
11
  const pipelines = usePipelinesStore()
@@ -44,6 +45,20 @@ function runPipeline(id: string) {
44
45
  if (pipeline && block.value) void execution.start(block.value.id, pipeline)
45
46
  }
46
47
 
48
+ /**
49
+ * An initiative block accepts exactly ONE pipeline — its preset's planning pipeline — and the
50
+ * engine refuses every other, so it gets the same single "Run planning" control the board card and
51
+ * the inspector offer rather than a picker whose every other row would be rejected on click. Same
52
+ * composable as those two surfaces, so which pipeline it starts can't drift across the three.
53
+ */
54
+ const isInitiative = computed(() => block.value?.level === 'initiative')
55
+ const {
56
+ planningPipeline,
57
+ running: planningRunning,
58
+ starting: planningStarting,
59
+ runPlanning,
60
+ } = useInitiativePlanning(() => block.value?.id ?? '')
61
+
47
62
  function close() {
48
63
  ui.focus(null)
49
64
  }
@@ -99,9 +114,28 @@ function openApprovalFor(approvalId: string) {
99
114
  {{ statusMeta.label }}
100
115
  </UBadge>
101
116
  <div class="ms-auto flex items-center gap-2">
117
+ <!-- An initiative has one legal pipeline, so it gets the button, not the picker. -->
118
+ <UButton
119
+ v-if="isInitiative"
120
+ color="primary"
121
+ variant="soft"
122
+ size="sm"
123
+ icon="i-lucide-play"
124
+ :loading="planningStarting || planningRunning"
125
+ :disabled="!planningPipeline || planningRunning || planningStarting"
126
+ data-testid="focus-run-planning"
127
+ @click="runPlanning"
128
+ >
129
+ {{ t('initiative.inspector.runPlanning') }}
130
+ </UButton>
102
131
  <!-- The rich picker rather than a list of names: the run starts the moment a row is
103
132
  clicked, so the preview is the only chance to see which agents it will run. -->
104
- <PipelinePicker model-value="" :options="runOptions" @update:model-value="runPipeline">
133
+ <PipelinePicker
134
+ v-else
135
+ model-value=""
136
+ :options="runOptions"
137
+ @update:model-value="runPipeline"
138
+ >
105
139
  <template #trigger>
106
140
  <UButton
107
141
  color="primary"
@@ -127,6 +127,25 @@ async function flushThen(action: (id: string) => Promise<unknown>) {
127
127
 
128
128
  const onContinue = () => flushThen((id) => initiatives.continuePlanning(id))
129
129
  const onProceed = () => flushThen((id) => initiatives.proceedPlanning(id))
130
+
131
+ /**
132
+ * The escape hatch for a planning run that stalled. It belongs HERE, not only in the inspector's
133
+ * execution panel behind this window: submit and plan-now are the two things that wedge, so the
134
+ * human who needs a way out is looking at exactly this footer. Offered whenever a run still owns
135
+ * the block — including mid-pass and after a failed pass, which is where a wedge actually shows up
136
+ * and where neither of the other two buttons is even rendered.
137
+ *
138
+ * Discarding returns the block to `planned`, which re-enables "Run planning"; the interviewer gate
139
+ * drops the previous run's round bookkeeping on that fresh start, so the re-run genuinely
140
+ * re-interviews instead of force-converging on its first pass. Close on success — leaving the
141
+ * window open on the now-empty idle state would read as another dead end.
142
+ */
143
+ const { resetting, resetRun } = useRunReset()
144
+ const canDiscard = computed(() => !!block.value?.executionId)
145
+ async function onDiscard() {
146
+ if (!blockId.value) return
147
+ if (await resetRun(blockId.value)) close()
148
+ }
130
149
  </script>
131
150
 
132
151
  <template>
@@ -221,28 +240,51 @@ const onProceed = () => flushThen((id) => initiatives.proceedPlanning(id))
221
240
  </template>
222
241
  </div>
223
242
 
224
- <!-- Action rail. Only while the run is actually parked on the human: mid-pass these would
225
- re-submit a question set already in flight, and the resume is a no-op once it isn't. -->
243
+ <!-- Action rail. The submit/plan-now pair shows only while the run is actually parked on the
244
+ human: mid-pass they would re-submit a question set already in flight, and the resume is a
245
+ no-op once it isn't. Discard is the opposite — it is offered for as long as a run owns the
246
+ block, because the phases where those two are hidden (working, failed) are exactly the ones
247
+ a wedged run sits in. -->
226
248
  <footer
227
- v-if="initiative && phase === 'awaiting' && questions.length > 0"
249
+ v-if="initiative && (canDiscard || (phase === 'awaiting' && questions.length > 0))"
228
250
  class="flex items-center justify-between gap-3 border-t border-slate-800 px-5 py-3"
229
251
  >
230
- <p class="text-[11px] text-slate-500">
231
- <span
232
- v-if="unanswered > 0"
233
- class="text-amber-400/90"
234
- data-testid="initiative-planning-unanswered"
235
- >
236
- {{ t('initiative.planning.unanswered', { count: unanswered }) }}
237
- </span>
238
- <span v-else>{{ t('initiative.planning.hint') }}</span>
239
- </p>
240
- <div class="flex items-center gap-2">
252
+ <UButton
253
+ v-if="canDiscard"
254
+ color="error"
255
+ variant="ghost"
256
+ size="sm"
257
+ icon="i-lucide-trash-2"
258
+ :loading="resetting"
259
+ :disabled="resuming"
260
+ :title="t('initiative.planning.discardTitle')"
261
+ data-testid="initiative-planning-discard"
262
+ @click="onDiscard"
263
+ >
264
+ {{ t('initiative.planning.discard') }}
265
+ </UButton>
266
+ <!-- `ms-auto` rather than relying on `justify-between`: discard is conditional, and without
267
+ it this group left-aligns on the (transient) render where it is the only child. -->
268
+ <div
269
+ v-if="phase === 'awaiting' && questions.length > 0"
270
+ class="ms-auto flex items-center gap-2"
271
+ >
272
+ <p class="text-[11px] text-slate-500">
273
+ <span
274
+ v-if="unanswered > 0"
275
+ class="text-amber-400/90"
276
+ data-testid="initiative-planning-unanswered"
277
+ >
278
+ {{ t('initiative.planning.unanswered', { count: unanswered }) }}
279
+ </span>
280
+ <span v-else>{{ t('initiative.planning.hint') }}</span>
281
+ </p>
241
282
  <UButton
242
283
  color="neutral"
243
284
  variant="ghost"
244
285
  size="sm"
245
286
  :loading="resuming"
287
+ :disabled="resetting"
246
288
  :title="t('initiative.planning.proceedTitle')"
247
289
  data-testid="initiative-planning-proceed"
248
290
  @click="onProceed"
@@ -253,7 +295,7 @@ const onProceed = () => flushThen((id) => initiatives.proceedPlanning(id))
253
295
  color="primary"
254
296
  size="sm"
255
297
  :loading="resuming"
256
- :disabled="unanswered > 0"
298
+ :disabled="unanswered > 0 || resetting"
257
299
  :title="
258
300
  unanswered > 0
259
301
  ? t('initiative.planning.unanswered', { count: unanswered })
@@ -60,6 +60,14 @@ watch(
60
60
  )
61
61
  const isContainer = computed(() => level.value === 'frame' || level.value === 'module')
62
62
  const isTask = computed(() => level.value === 'task')
63
+ const isInitiative = computed(() => level.value === 'initiative')
64
+ /**
65
+ * Blocks whose inspector carries a pipeline RUN — a task, and an initiative (whose planning
66
+ * pipeline is an ordinary run of ordinary agent steps). Both get the execution panel and the
67
+ * Focus view; what differs is only how the run is STARTED (a task picks any pipeline, an
68
+ * initiative may only run its planning one, so it keeps its own "Run planning" control).
69
+ */
70
+ const hasRuns = computed(() => isTask.value || isInitiative.value)
63
71
 
64
72
  const instance = computed(() => execution.getInstance(block.value?.executionId))
65
73
  const typeMeta = computed(() => (block.value ? blockTypeMeta(block.value.type) : null))
@@ -104,7 +112,10 @@ const runBlockedReason = computed(() => {
104
112
  const canRun = computed(() => runnable.value && access.canExecuteRuns.value)
105
113
 
106
114
  // The delete control names what it removes, so selecting a task and deleting it
107
- // reads as "Delete task" rather than ambiguously removing the whole service.
115
+ // reads as "Delete task" rather than ambiguously removing the whole service. An
116
+ // initiative is its own level (it hangs off a frame like a module does), so it must
117
+ // name ITSELF — offering to "delete service" there describes the wrong blast radius
118
+ // entirely: the frame and every other thing under it survive.
108
119
  const deleteLabel = computed(() =>
109
120
  schedule.value
110
121
  ? t('panels.inspector.deleteRecurringPipeline')
@@ -112,7 +123,9 @@ const deleteLabel = computed(() =>
112
123
  ? t('panels.inspector.deleteTask')
113
124
  : level.value === 'module'
114
125
  ? t('panels.inspector.deleteModule')
115
- : t('panels.inspector.deleteService'),
126
+ : isInitiative.value
127
+ ? t('panels.inspector.deleteInitiative')
128
+ : t('panels.inspector.deleteService'),
116
129
  )
117
130
 
118
131
  // A task is "started" once a pipeline has been launched on it (it has an
@@ -543,11 +556,12 @@ const showOriginalDescription = ref(false)
543
556
  </UButton>
544
557
  </UDropdownMenu>
545
558
  <UButton
546
- v-if="isTask"
559
+ v-if="hasRuns"
547
560
  color="neutral"
548
561
  variant="soft"
549
562
  size="sm"
550
563
  icon="i-lucide-maximize-2"
564
+ data-testid="inspector-focus"
551
565
  @click="ui.focus(block.id)"
552
566
  >
553
567
  {{ t('panels.inspector.focus') }}
@@ -192,26 +192,11 @@ async function stopRun() {
192
192
  stopping.value = false
193
193
  }
194
194
  }
195
- const resetting = ref(false)
196
- async function resetRun() {
197
- if (resetting.value) return
198
- // Destructive: discards the run and returns the task to planned — gate it behind a confirm,
199
- // matching the confirm-then-mutate contract the board delete path uses.
200
- const ok = await confirm({
201
- title: t('inspector.execution.resetConfirm.title'),
202
- description: t('inspector.execution.resetConfirm.body'),
203
- variant: 'destructive',
204
- confirmLabel: t('inspector.execution.resetConfirm.confirm'),
205
- icon: 'i-lucide-trash-2',
206
- })
207
- if (!ok) return
208
- resetting.value = true
209
- try {
210
- await execution.cancel(props.block.id)
211
- } finally {
212
- resetting.value = false
213
- }
214
- }
195
+ // Destructive: discards the run and returns the block to planned, behind a confirm. Shared with
196
+ // the initiative planning window (which offers the same escape hatch in place) so the two can't
197
+ // drift on the prompt or on what "discard" means.
198
+ const { resetting, resetRun: discardRun } = useRunReset()
199
+ const resetRun = () => discardRun(props.block.id)
215
200
 
216
201
  /**
217
202
  * The reviewer-effort tag for this merge, preselected from evidence rather than starting blank: if
@@ -76,7 +76,14 @@ export function useBlockDeletion() {
76
76
  ? 'task'
77
77
  : block.level === 'module'
78
78
  ? 'module'
79
- : 'service'
79
+ : // An initiative names itself rather than falling through to the service copy, which
80
+ // would describe a blast radius orders of magnitude larger than the real one. Its
81
+ // cascade is also genuinely different from a container's: the plan goes with it, but
82
+ // the tasks its loop already spawned are NOT descendants — the backend only detaches
83
+ // their membership link — so the count branch below deliberately doesn't apply.
84
+ block.level === 'initiative'
85
+ ? 'initiative'
86
+ : 'service'
80
87
  const title = t(`panels.inspector.confirmDelete.${kind}.title`)
81
88
  // For a container (service/module) state the exact cascade size so the blast radius is
82
89
  // explicit — "and everything inside it" hides how many tasks/modules go with it.
@@ -0,0 +1,48 @@
1
+ /**
2
+ * The confirm-gated "discard this run" action, shared by every surface that offers it so they
3
+ * can't drift on what it does or how loudly it asks first.
4
+ *
5
+ * Destructive and distinct from a STOP: stop halts a run but keeps it readable and retryable,
6
+ * while this deletes it outright and returns the block to `planned`. That is what makes it the
7
+ * escape hatch for a WEDGED run — a run whose driver will never settle can't be waited out, and
8
+ * until the block's `executionId` clears nothing else may start on it.
9
+ *
10
+ * Two callers today: the inspector's execution panel (tasks and initiatives alike) and the
11
+ * initiative planning window, which needs it in-place because a human whose interview stalled is
12
+ * looking at that window, not at the inspector behind it.
13
+ */
14
+ export function useRunReset() {
15
+ const execution = useExecutionStore()
16
+ const access = useWorkspaceAccess()
17
+ const { confirm } = useConfirm()
18
+ const { t } = useI18n()
19
+
20
+ /** True while a discard is in flight (drives the button spinner). */
21
+ const resetting = ref(false)
22
+
23
+ /**
24
+ * Confirm, then discard the block's run. Resolves `true` only when the run was actually
25
+ * discarded, so a caller can act on it (the planning window closes itself). A read-only viewer
26
+ * no-ops — every button binding this is disabled for them, and this guards the rest.
27
+ */
28
+ async function resetRun(blockId: string): Promise<boolean> {
29
+ if (resetting.value || !access.canExecuteRuns.value) return false
30
+ const ok = await confirm({
31
+ title: t('inspector.execution.resetConfirm.title'),
32
+ description: t('inspector.execution.resetConfirm.body'),
33
+ variant: 'destructive',
34
+ confirmLabel: t('inspector.execution.resetConfirm.confirm'),
35
+ icon: 'i-lucide-trash-2',
36
+ })
37
+ if (!ok) return false
38
+ resetting.value = true
39
+ try {
40
+ await execution.cancel(blockId)
41
+ return true
42
+ } finally {
43
+ resetting.value = false
44
+ }
45
+ }
46
+
47
+ return { resetting, resetRun }
48
+ }
@@ -94,9 +94,15 @@ describe('inspector panel group', () => {
94
94
  ])
95
95
  })
96
96
 
97
- it('epic and initiative each show their single inspector', () => {
97
+ it('an epic shows only its children panel', () => {
98
98
  expect(visibleIds(block('epic'))).toEqual(['epic-children'])
99
- expect(visibleIds(block('initiative'))).toEqual(['initiative-inspector'])
99
+ })
100
+
101
+ // An initiative's planning pipeline is an ordinary run, so it shares the task body's execution
102
+ // panel — its own inspector leading, the run detail under it. Pinned because the panel is the
103
+ // only surface carrying the Stop / Discard-run controls that unwedge a stalled planning run.
104
+ it('an initiative shows its inspector, then the shared execution panel', () => {
105
+ expect(visibleIds(block('initiative'))).toEqual(['initiative-inspector', 'task-execution'])
100
106
  })
101
107
 
102
108
  it('no subject selected resolves to no panels', () => {
@@ -74,6 +74,14 @@ export interface InspectorPanelSpec {
74
74
 
75
75
  const isTask = (b: Block) => b.level === 'task'
76
76
  const isFrame = (b: Block) => b.level === 'frame'
77
+ /**
78
+ * A block whose inspector carries a pipeline RUN. An initiative's planning pipeline is an
79
+ * ordinary run of ordinary agent steps (interviewer → analyst → planner → committer), so it
80
+ * gets the same execution panel a task does — step list, live phases, step-detail drill-down,
81
+ * and the Stop / Discard-run controls that are the only way to unwedge a stalled planning run.
82
+ * Before this it had no run surface at all, which is why a stuck plan was a dead end.
83
+ */
84
+ const hasRuns = (b: Block) => isTask(b) || b.level === 'initiative'
77
85
  /** frame OR module — the "container" panels. */
78
86
  const isContainer = (b: Block) => b.level === 'frame' || b.level === 'module'
79
87
  /**
@@ -106,7 +114,8 @@ export const INSPECTOR_PANEL_SPECS: readonly InspectorPanelSpec[] = [
106
114
  { id: 'task-context-docs', order: 10, when: isTask },
107
115
  { id: 'task-context-issues', order: 20, when: isTask },
108
116
  { id: 'recurring-schedule', order: 30, when: isTask },
109
- { id: 'task-execution', order: 40, when: isTask },
117
+ // Shared with the initiative body — the panel renders a RUN, and an initiative has one.
118
+ { id: 'task-execution', order: 40, when: hasRuns },
110
119
  { id: 'task-estimate', order: 50, when: isTask },
111
120
  { id: 'task-dependencies', order: 60, when: isTask },
112
121
  { id: 'task-run-settings', order: 70, when: isTask },
@@ -124,5 +133,8 @@ export const INSPECTOR_PANEL_SPECS: readonly InspectorPanelSpec[] = [
124
133
  // test-infra and release-health panels above it.
125
134
  { id: 'service-validation-checks', order: 180, when: isDeployableFrame },
126
135
  { id: 'epic-children', order: 200, when: (b) => b.level === 'epic' },
127
- { id: 'initiative-inspector', order: 210, when: (b) => b.level === 'initiative' },
136
+ // Ordered BEFORE the shared execution panel (40) so an initiative reads the way a task does:
137
+ // its own identity + controls first, the run detail under them. Levels never overlap, so this
138
+ // number only ever competes with the task ids the initiative body doesn't render.
139
+ { id: 'initiative-inspector', order: 35, when: (b) => b.level === 'initiative' },
128
140
  ]
@@ -119,6 +119,10 @@ export const useObservabilityStore = defineStore('observability', () => {
119
119
  if (existing.some((c) => c.id === activity.id)) return
120
120
  const row: LlmCallMetric = {
121
121
  ...activity,
122
+ // The live event carries the phase (the proxy knows it) but no turn ordinal — that is
123
+ // the harness's job-scoped counter, which a proxied call has no equivalent of. Null is
124
+ // what the stored row will say too, so the live row and the loaded one agree.
125
+ turnIndex: null,
122
126
  promptText: '',
123
127
  promptPrefixCount: 0,
124
128
  promptHash: '',
@@ -1259,7 +1259,7 @@
1259
1259
  },
1260
1260
  "execution": {
1261
1261
  "title": "Ausführung",
1262
- "hint": "Der Live-Lauf der Pipeline dieser Aufgabe: jeder Agent-Schritt, sein Fortschritt und der resultierende Pull Request.",
1262
+ "hint": "Der Live-Lauf der Pipeline: jeder Agent-Schritt, sein Fortschritt und der resultierende Pull Request.",
1263
1263
  "stage": {
1264
1264
  "incorporating": "Wird eingearbeitet…",
1265
1265
  "reviewing": "Wird erneut geprüft…",
@@ -1284,10 +1284,10 @@
1284
1284
  "stop": "Stoppen",
1285
1285
  "stopTooltip": "Den Lauf stoppen, aber behalten (lesbar und wiederholbar)",
1286
1286
  "reset": "Zurücksetzen",
1287
- "resetTooltip": "Diesen Lauf verwerfen und die Aufgabe auf geplant zurücksetzen",
1287
+ "resetTooltip": "Diesen Lauf verwerfen und den Status auf geplant zurücksetzen",
1288
1288
  "resetConfirm": {
1289
1289
  "title": "Diesen Lauf verwerfen?",
1290
- "body": "Dies löscht den Lauf und setzt die Aufgabe auf geplant zurück. Dies kann nicht rückgängig gemacht werden.",
1290
+ "body": "Dies löscht den Lauf und setzt den Status auf geplant zurück. Dies kann nicht rückgängig gemacht werden.",
1291
1291
  "confirm": "Lauf verwerfen"
1292
1292
  },
1293
1293
  "mergeConfirm": {
@@ -1622,6 +1622,7 @@
1622
1622
  "deleteRecurringPipeline": "Wiederkehrende Pipeline löschen",
1623
1623
  "deleteTask": "Aufgabe löschen",
1624
1624
  "deleteModule": "Modul löschen",
1625
+ "deleteInitiative": "Initiative löschen",
1625
1626
  "deleteService": "Service löschen",
1626
1627
  "confirmDelete": {
1627
1628
  "task": {
@@ -1632,6 +1633,10 @@
1632
1633
  "title": "Dieses Modul löschen?",
1633
1634
  "body": "\"{name}\" und alles darin wird entfernt. Dies kann nicht rückgängig gemacht werden."
1634
1635
  },
1636
+ "initiative": {
1637
+ "title": "Diese Initiative löschen?",
1638
+ "body": "\"{name}\" und ihr Plan werden entfernt. Bereits erstellte Aufgaben bleiben auf dem Board. Dies kann nicht rückgängig gemacht werden."
1639
+ },
1635
1640
  "service": {
1636
1641
  "title": "Diesen Service löschen?",
1637
1642
  "body": "\"{name}\" und alles darin wird entfernt. Dies kann nicht rückgängig gemacht werden."
@@ -4208,6 +4213,8 @@
4208
4213
  "unanswered": "Unbeantwortete Fragen: {count}",
4209
4214
  "proceed": "Jetzt planen",
4210
4215
  "proceedTitle": "Die restlichen Fragen überspringen und den Plan jetzt entwerfen",
4216
+ "discard": "Lauf verwerfen",
4217
+ "discardTitle": "Den blockierten Planungslauf verwerfen, um die Planung neu zu starten",
4211
4218
  "continue": "Antworten senden",
4212
4219
  "continueTitle": "Ihre Antworten senden; der Planer stellt möglicherweise Rückfragen"
4213
4220
  },
@@ -1005,7 +1005,7 @@
1005
1005
  },
1006
1006
  "execution": {
1007
1007
  "title": "Execution",
1008
- "hint": "The live run of this task's pipeline: each agent step, its progress, and the resulting pull request.",
1008
+ "hint": "The live pipeline run: each agent step, its progress, and the resulting pull request.",
1009
1009
  "stage": {
1010
1010
  "incorporating": "Incorporating…",
1011
1011
  "reviewing": "Re-reviewing…",
@@ -1030,10 +1030,10 @@
1030
1030
  "stop": "Stop",
1031
1031
  "stopTooltip": "Stop the run but keep it (readable and retryable)",
1032
1032
  "reset": "Reset",
1033
- "resetTooltip": "Discard this run and reset the task to planned",
1033
+ "resetTooltip": "Discard this run and reset the status to planned",
1034
1034
  "resetConfirm": {
1035
1035
  "title": "Discard this run?",
1036
- "body": "This deletes the run and returns the task to planned. This can't be undone.",
1036
+ "body": "This deletes the run and resets the status to planned. This can't be undone.",
1037
1037
  "confirm": "Discard run"
1038
1038
  },
1039
1039
  "mergeConfirm": {
@@ -1368,6 +1368,7 @@
1368
1368
  "deleteRecurringPipeline": "Delete recurring pipeline",
1369
1369
  "deleteTask": "Delete task",
1370
1370
  "deleteModule": "Delete module",
1371
+ "deleteInitiative": "Delete initiative",
1371
1372
  "deleteService": "Delete service",
1372
1373
  "confirmDelete": {
1373
1374
  "task": {
@@ -1378,6 +1379,10 @@
1378
1379
  "title": "Delete this module?",
1379
1380
  "body": "\"{name}\" and everything inside it will be removed. This can't be undone."
1380
1381
  },
1382
+ "initiative": {
1383
+ "title": "Delete this initiative?",
1384
+ "body": "\"{name}\" and its plan will be removed. Tasks it already created stay on the board. This can't be undone."
1385
+ },
1381
1386
  "service": {
1382
1387
  "title": "Delete this service?",
1383
1388
  "body": "\"{name}\" and everything inside it will be removed. This can't be undone."
@@ -5382,6 +5387,8 @@
5382
5387
  "unanswered": "Unanswered questions: {count}",
5383
5388
  "proceed": "Plan now",
5384
5389
  "proceedTitle": "Skip the remaining questions and draft the plan now",
5390
+ "discard": "Discard run",
5391
+ "discardTitle": "Discard the stalled planning run so you can start planning again",
5385
5392
  "continue": "Submit answers",
5386
5393
  "continueTitle": "Send your answers; the planner may ask follow-up questions"
5387
5394
  },
@@ -942,7 +942,7 @@
942
942
  },
943
943
  "execution": {
944
944
  "title": "Ejecución",
945
- "hint": "La ejecución en vivo del pipeline de esta tarea: cada paso de agente, su progreso y el pull request resultante.",
945
+ "hint": "La ejecución en vivo del pipeline: cada paso de agente, su progreso y el pull request resultante.",
946
946
  "stage": {
947
947
  "incorporating": "Incorporando…",
948
948
  "reviewing": "Revisando de nuevo…",
@@ -963,10 +963,10 @@
963
963
  "stop": "Detener",
964
964
  "stopTooltip": "Detener la ejecución pero conservarla (legible y reintentable)",
965
965
  "reset": "Restablecer",
966
- "resetTooltip": "Descartar esta ejecución y restablecer la tarea a planificada",
966
+ "resetTooltip": "Descartar esta ejecución y restablecer el estado a planificada",
967
967
  "resetConfirm": {
968
968
  "title": "¿Descartar esta ejecución?",
969
- "body": "Esto elimina la ejecución y devuelve la tarea a planificada. Esto no se puede deshacer.",
969
+ "body": "Esto elimina la ejecución y restablece el estado a planificada. Esto no se puede deshacer.",
970
970
  "confirm": "Descartar ejecución"
971
971
  },
972
972
  "mergeConfirm": {
@@ -1305,6 +1305,7 @@
1305
1305
  "deleteRecurringPipeline": "Eliminar pipeline recurrente",
1306
1306
  "deleteTask": "Eliminar tarea",
1307
1307
  "deleteModule": "Eliminar módulo",
1308
+ "deleteInitiative": "Eliminar iniciativa",
1308
1309
  "deleteService": "Eliminar servicio",
1309
1310
  "titlePlaceholder": "Título…",
1310
1311
  "reworkedRequirements": "Requisitos reelaborados",
@@ -1333,6 +1334,10 @@
1333
1334
  "title": "¿Eliminar este módulo?",
1334
1335
  "body": "Se eliminará \"{name}\" y todo su contenido. Esta acción no se puede deshacer."
1335
1336
  },
1337
+ "initiative": {
1338
+ "title": "¿Eliminar esta iniciativa?",
1339
+ "body": "Se eliminarán \"{name}\" y su plan. Las tareas que ya creó permanecen en el tablero. Esta acción no se puede deshacer."
1340
+ },
1336
1341
  "service": {
1337
1342
  "title": "¿Eliminar este servicio?",
1338
1343
  "body": "Se eliminará \"{name}\" y todo su contenido. Esta acción no se puede deshacer."
@@ -5217,6 +5222,8 @@
5217
5222
  "unanswered": "Preguntas sin responder: {count}",
5218
5223
  "proceed": "Planificar ahora",
5219
5224
  "proceedTitle": "Omitir las preguntas restantes y redactar el plan ahora",
5225
+ "discard": "Descartar ejecución",
5226
+ "discardTitle": "Descartar la ejecución de planificación bloqueada para volver a empezar",
5220
5227
  "continue": "Enviar respuestas",
5221
5228
  "continueTitle": "Envia tus respuestas; el planificador puede hacer preguntas de seguimiento"
5222
5229
  },
@@ -942,7 +942,7 @@
942
942
  },
943
943
  "execution": {
944
944
  "title": "Exécution",
945
- "hint": "L'exécution en direct du pipeline de cette tâche : chaque étape d'agent, sa progression et la pull request obtenue.",
945
+ "hint": "L'exécution en direct du pipeline : chaque étape d'agent, sa progression et la pull request obtenue.",
946
946
  "stage": {
947
947
  "incorporating": "Intégration en cours…",
948
948
  "reviewing": "Nouvelle revue en cours…",
@@ -963,10 +963,10 @@
963
963
  "stop": "Arrêter",
964
964
  "stopTooltip": "Arrêter l'exécution mais la conserver (lisible et relançable)",
965
965
  "reset": "Réinitialiser",
966
- "resetTooltip": "Abandonner cette exécution et réinitialiser la tâche à planifiée",
966
+ "resetTooltip": "Abandonner cette exécution et réinitialiser le statut à planifiée",
967
967
  "resetConfirm": {
968
968
  "title": "Abandonner cette exécution ?",
969
- "body": "Cela supprime l'exécution et ramène la tâche à planifiée. Cette action est irréversible.",
969
+ "body": "Cela supprime l'exécution et réinitialise le statut à planifiée. Cette action est irréversible.",
970
970
  "confirm": "Abandonner l'exécution"
971
971
  },
972
972
  "mergeConfirm": {
@@ -1305,6 +1305,7 @@
1305
1305
  "deleteRecurringPipeline": "Supprimer le pipeline récurrent",
1306
1306
  "deleteTask": "Supprimer la tâche",
1307
1307
  "deleteModule": "Supprimer le module",
1308
+ "deleteInitiative": "Supprimer l'initiative",
1308
1309
  "deleteService": "Supprimer le service",
1309
1310
  "titlePlaceholder": "Titre…",
1310
1311
  "reworkedRequirements": "Exigences retravaillées",
@@ -1333,6 +1334,10 @@
1333
1334
  "title": "Supprimer ce module ?",
1334
1335
  "body": "\"{name}\" et tout son contenu seront supprimés. Cette action est irréversible."
1335
1336
  },
1337
+ "initiative": {
1338
+ "title": "Supprimer cette initiative ?",
1339
+ "body": "\"{name}\" et son plan seront supprimés. Les tâches déjà créées restent sur le tableau. Cette action est irréversible."
1340
+ },
1336
1341
  "service": {
1337
1342
  "title": "Supprimer ce service ?",
1338
1343
  "body": "\"{name}\" et tout son contenu seront supprimés. Cette action est irréversible."
@@ -5217,6 +5222,8 @@
5217
5222
  "unanswered": "Questions sans reponse : {count}",
5218
5223
  "proceed": "Planifier maintenant",
5219
5224
  "proceedTitle": "Ignorer les questions restantes et rediger le plan maintenant",
5225
+ "discard": "Abandonner l'exécution",
5226
+ "discardTitle": "Abandonner l'exécution de planification bloquée pour recommencer",
5220
5227
  "continue": "Envoyer les reponses",
5221
5228
  "continueTitle": "Envoyez vos reponses ; le planificateur peut poser des questions complementaires"
5222
5229
  },
@@ -942,7 +942,7 @@
942
942
  },
943
943
  "execution": {
944
944
  "title": "הרצה",
945
- "hint": "ההרצה החיה של הפייפליין של משימה זו: כל שלב סוכן, ההתקדמות שלו ובקשת המשיכה שנוצרת.",
945
+ "hint": "ההרצה החיה של הפייפליין: כל שלב סוכן, ההתקדמות שלו ובקשת המשיכה שנוצרת.",
946
946
  "stage": {
947
947
  "incorporating": "משלב…",
948
948
  "reviewing": "סוקר מחדש…",
@@ -963,10 +963,10 @@
963
963
  "stop": "עצור",
964
964
  "stopTooltip": "עצור את ההרצה אך שמור אותה (ניתנת לקריאה ולחזרה)",
965
965
  "reset": "אפס",
966
- "resetTooltip": "השלך הרצה זו ואפס את המשימה למתוכננת",
966
+ "resetTooltip": "השלך הרצה זו ואפס את הסטטוס למתוכנן",
967
967
  "resetConfirm": {
968
968
  "title": "להשליך הרצה זו?",
969
- "body": "פעולה זו מוחקת את ההרצה ומחזירה את המשימה למתוכננת. לא ניתן לבטל פעולה זו.",
969
+ "body": "פעולה זו מוחקת את ההרצה ומאפסת את הסטטוס למתוכנן. לא ניתן לבטל פעולה זו.",
970
970
  "confirm": "השלך הרצה"
971
971
  },
972
972
  "mergeConfirm": {
@@ -1305,6 +1305,7 @@
1305
1305
  "deleteRecurringPipeline": "מחק צינור חוזר",
1306
1306
  "deleteTask": "מחק משימה",
1307
1307
  "deleteModule": "מחק מודול",
1308
+ "deleteInitiative": "מחק יוזמה",
1308
1309
  "deleteService": "מחק שירות",
1309
1310
  "titlePlaceholder": "כותרת…",
1310
1311
  "reworkedRequirements": "דרישות מעובדות מחדש",
@@ -1333,6 +1334,10 @@
1333
1334
  "title": "למחוק את המודול הזה?",
1334
1335
  "body": "\"{name}\" וכל התוכן שבו יימחקו. לא ניתן לבטל פעולה זו."
1335
1336
  },
1337
+ "initiative": {
1338
+ "title": "למחוק את היוזמה הזו?",
1339
+ "body": "\"{name}\" והתוכנית שלה יימחקו. משימות שכבר נוצרו יישארו בלוח. לא ניתן לבטל פעולה זו."
1340
+ },
1336
1341
  "service": {
1337
1342
  "title": "למחוק את השירות הזה?",
1338
1343
  "body": "\"{name}\" וכל התוכן שבו יימחקו. לא ניתן לבטל פעולה זו."
@@ -5228,6 +5233,8 @@
5228
5233
  "unanswered": "שאלות ללא מענה: {count}",
5229
5234
  "proceed": "תכנן עכשיו",
5230
5235
  "proceedTitle": "לדלג על שאר השאלות ולנסח את התוכנית עכשיו",
5236
+ "discard": "השלך הרצה",
5237
+ "discardTitle": "השלכת הרצת התכנון התקועה כדי להתחיל את התכנון מחדש",
5231
5238
  "continue": "שלח תשובות",
5232
5239
  "continueTitle": "שלח את התשובות שלך; המתכנן עשוי לשאול שאלות המשך"
5233
5240
  },
@@ -1259,7 +1259,7 @@
1259
1259
  },
1260
1260
  "execution": {
1261
1261
  "title": "Esecuzione",
1262
- "hint": "L'esecuzione dal vivo della pipeline di questa attivita': ogni passaggio dell'agente, il suo avanzamento e la pull request risultante.",
1262
+ "hint": "L'esecuzione dal vivo della pipeline: ogni passaggio dell'agente, il suo avanzamento e la pull request risultante.",
1263
1263
  "stage": {
1264
1264
  "incorporating": "Incorporazione…",
1265
1265
  "reviewing": "Nuova revisione…",
@@ -1284,10 +1284,10 @@
1284
1284
  "stop": "Arresta",
1285
1285
  "stopTooltip": "Arresta l'esecuzione ma conservala (leggibile e ripetibile)",
1286
1286
  "reset": "Reimposta",
1287
- "resetTooltip": "Scarta questa esecuzione e reimposta l'attivita' a pianificata",
1287
+ "resetTooltip": "Scarta questa esecuzione e reimposta lo stato a pianificata",
1288
1288
  "resetConfirm": {
1289
1289
  "title": "Scartare questa esecuzione?",
1290
- "body": "Questo elimina l'esecuzione e riporta l'attivita' a pianificata. L'operazione non puo' essere annullata.",
1290
+ "body": "Questo elimina l'esecuzione e reimposta lo stato a pianificata. L'operazione non puo' essere annullata.",
1291
1291
  "confirm": "Scarta esecuzione"
1292
1292
  },
1293
1293
  "mergeConfirm": {
@@ -1622,6 +1622,7 @@
1622
1622
  "deleteRecurringPipeline": "Elimina la pipeline ricorrente",
1623
1623
  "deleteTask": "Elimina attivita'",
1624
1624
  "deleteModule": "Elimina modulo",
1625
+ "deleteInitiative": "Elimina iniziativa",
1625
1626
  "deleteService": "Elimina servizio",
1626
1627
  "confirmDelete": {
1627
1628
  "task": {
@@ -1632,6 +1633,10 @@
1632
1633
  "title": "Eliminare questo modulo?",
1633
1634
  "body": "\"{name}\" e tutto cio' che contiene verranno rimossi. L'operazione non puo' essere annullata."
1634
1635
  },
1636
+ "initiative": {
1637
+ "title": "Eliminare questa iniziativa?",
1638
+ "body": "\"{name}\" e il suo piano verranno rimossi. Le attivita' gia' create restano sulla board. L'operazione non puo' essere annullata."
1639
+ },
1635
1640
  "service": {
1636
1641
  "title": "Eliminare questo servizio?",
1637
1642
  "body": "\"{name}\" e tutto cio' che contiene verranno rimossi. L'operazione non puo' essere annullata."
@@ -4208,6 +4213,8 @@
4208
4213
  "unanswered": "Domande senza risposta: {count}",
4209
4214
  "proceed": "Pianifica ora",
4210
4215
  "proceedTitle": "Salta le domande rimanenti e redigi subito il piano",
4216
+ "discard": "Scarta esecuzione",
4217
+ "discardTitle": "Scarta l'esecuzione di pianificazione bloccata per ricominciare",
4211
4218
  "continue": "Invia risposte",
4212
4219
  "continueTitle": "Invia le tue risposte; il pianificatore potrebbe porre domande di follow-up"
4213
4220
  },
@@ -942,7 +942,7 @@
942
942
  },
943
943
  "execution": {
944
944
  "title": "実行",
945
- "hint": "このタスクのパイプラインのライブ実行: 各エージェントステップ、その進捗、生成されたプルリクエスト。",
945
+ "hint": "パイプラインのライブ実行: 各エージェントステップ、その進捗、生成されたプルリクエスト。",
946
946
  "stage": {
947
947
  "incorporating": "取り込み中…",
948
948
  "reviewing": "再レビュー中…",
@@ -963,10 +963,10 @@
963
963
  "stop": "停止",
964
964
  "stopTooltip": "実行を停止しますが保持します (閲覧および再実行が可能)",
965
965
  "reset": "リセット",
966
- "resetTooltip": "この実行を破棄し、タスクを計画済みにリセットします",
966
+ "resetTooltip": "この実行を破棄し、ステータスを計画済みにリセットします",
967
967
  "resetConfirm": {
968
968
  "title": "この実行を破棄しますか?",
969
- "body": "実行を削除し、タスクを計画済みに戻します。この操作は取り消せません。",
969
+ "body": "実行を削除し、ステータスを計画済みに戻します。この操作は取り消せません。",
970
970
  "confirm": "実行を破棄"
971
971
  },
972
972
  "mergeConfirm": {
@@ -1305,6 +1305,7 @@
1305
1305
  "deleteRecurringPipeline": "繰り返しパイプラインを削除",
1306
1306
  "deleteTask": "タスクを削除",
1307
1307
  "deleteModule": "モジュールを削除",
1308
+ "deleteInitiative": "イニシアチブを削除",
1308
1309
  "deleteService": "サービスを削除",
1309
1310
  "titlePlaceholder": "タイトル…",
1310
1311
  "reworkedRequirements": "再整理された要件",
@@ -1333,6 +1334,10 @@
1333
1334
  "title": "このモジュールを削除しますか?",
1334
1335
  "body": "「{name}」とその中のすべてが削除されます。この操作は取り消せません。"
1335
1336
  },
1337
+ "initiative": {
1338
+ "title": "このイニシアチブを削除しますか?",
1339
+ "body": "「{name}」とその計画が削除されます。すでに作成されたタスクはボードに残ります。この操作は取り消せません。"
1340
+ },
1336
1341
  "service": {
1337
1342
  "title": "このサービスを削除しますか?",
1338
1343
  "body": "「{name}」とその中のすべてが削除されます。この操作は取り消せません。"
@@ -5229,6 +5234,8 @@
5229
5234
  "unanswered": "未回答の質問: {count}",
5230
5235
  "proceed": "今すぐ計画",
5231
5236
  "proceedTitle": "残りの質問をスキップして今すぐ計画を作成します",
5237
+ "discard": "実行を破棄",
5238
+ "discardTitle": "停止した計画実行を破棄して、計画をやり直せるようにします",
5232
5239
  "continue": "回答を送信",
5233
5240
  "continueTitle": "回答を送信します。プランナーが追加の質問をする場合があります"
5234
5241
  },
@@ -942,7 +942,7 @@
942
942
  },
943
943
  "execution": {
944
944
  "title": "Wykonanie",
945
- "hint": "Trwające wykonanie potoku tego zadania: każdy krok agenta, jego postęp i powstały pull request.",
945
+ "hint": "Trwające wykonanie potoku: każdy krok agenta, jego postęp i powstały pull request.",
946
946
  "stage": {
947
947
  "incorporating": "Włączanie…",
948
948
  "reviewing": "Ponowna recenzja…",
@@ -963,10 +963,10 @@
963
963
  "stop": "Zatrzymaj",
964
964
  "stopTooltip": "Zatrzymaj uruchomienie, ale zachowaj je (do odczytu i ponownego uruchomienia)",
965
965
  "reset": "Resetuj",
966
- "resetTooltip": "Odrzuć to uruchomienie i przywróć zadanie do stanu zaplanowanego",
966
+ "resetTooltip": "Odrzuć to uruchomienie i przywróć stan zaplanowany",
967
967
  "resetConfirm": {
968
968
  "title": "Odrzucić to uruchomienie?",
969
- "body": "Spowoduje to usunięcie uruchomienia i przywrócenie zadania do stanu zaplanowanego. Tej operacji nie można cofnąć.",
969
+ "body": "Spowoduje to usunięcie uruchomienia i przywrócenie stanu zaplanowanego. Tej operacji nie można cofnąć.",
970
970
  "confirm": "Odrzuć uruchomienie"
971
971
  },
972
972
  "mergeConfirm": {
@@ -1305,6 +1305,7 @@
1305
1305
  "deleteRecurringPipeline": "Usuń cykliczny potok",
1306
1306
  "deleteTask": "Usuń zadanie",
1307
1307
  "deleteModule": "Usuń moduł",
1308
+ "deleteInitiative": "Usuń inicjatywę",
1308
1309
  "deleteService": "Usuń usługę",
1309
1310
  "titlePlaceholder": "Tytuł…",
1310
1311
  "reworkedRequirements": "Przerobione wymagania",
@@ -1333,6 +1334,10 @@
1333
1334
  "title": "Usunąć ten moduł?",
1334
1335
  "body": "\"{name}\" i cała jego zawartość zostaną usunięte. Tej operacji nie można cofnąć."
1335
1336
  },
1337
+ "initiative": {
1338
+ "title": "Usunąć tę inicjatywę?",
1339
+ "body": "\"{name}\" i jej plan zostaną usunięte. Utworzone już zadania pozostaną na tablicy. Tej operacji nie można cofnąć."
1340
+ },
1336
1341
  "service": {
1337
1342
  "title": "Usunąć tę usługę?",
1338
1343
  "body": "\"{name}\" i cała jego zawartość zostaną usunięte. Tej operacji nie można cofnąć."
@@ -5217,6 +5222,8 @@
5217
5222
  "unanswered": "Pytania bez odpowiedzi: {count}",
5218
5223
  "proceed": "Zaplanuj teraz",
5219
5224
  "proceedTitle": "Pomin pozostale pytania i utworz plan teraz",
5225
+ "discard": "Odrzuć uruchomienie",
5226
+ "discardTitle": "Odrzuć zablokowane uruchomienie planowania, aby zacząć planowanie od nowa",
5220
5227
  "continue": "Wyslij odpowiedzi",
5221
5228
  "continueTitle": "Wyslij swoje odpowiedzi; planista moze zadac dodatkowe pytania"
5222
5229
  },
@@ -942,7 +942,7 @@
942
942
  },
943
943
  "execution": {
944
944
  "title": "Yürütme",
945
- "hint": "Bu görevin pipeline'ının canlı yürütmesi: her ajan adımı, ilerlemesi ve ortaya çıkan pull request.",
945
+ "hint": "Pipeline'ın canlı yürütmesi: her ajan adımı, ilerlemesi ve ortaya çıkan pull request.",
946
946
  "stage": {
947
947
  "incorporating": "Dahil ediliyor…",
948
948
  "reviewing": "Yeniden inceleniyor…",
@@ -963,10 +963,10 @@
963
963
  "stop": "Durdur",
964
964
  "stopTooltip": "Çalıştırmayı durdur ancak sakla (okunabilir ve yeniden denenebilir)",
965
965
  "reset": "Sıfırla",
966
- "resetTooltip": "Bu çalıştırmayı sil ve görevi planlandı durumuna sıfırla",
966
+ "resetTooltip": "Bu çalıştırmayı sil ve durumu planlandı olarak sıfırla",
967
967
  "resetConfirm": {
968
968
  "title": "Bu çalıştırma silinsin mi?",
969
- "body": "Bu, çalıştırmayı siler ve görevi planlandı durumuna döndürür. Bu geri alınamaz.",
969
+ "body": "Bu, çalıştırmayı siler ve durumu planlandı olarak sıfırlar. Bu geri alınamaz.",
970
970
  "confirm": "Çalıştırmayı sil"
971
971
  },
972
972
  "mergeConfirm": {
@@ -1305,6 +1305,7 @@
1305
1305
  "deleteRecurringPipeline": "Yinelenen ardışık düzeni sil",
1306
1306
  "deleteTask": "Görevi sil",
1307
1307
  "deleteModule": "Modülü sil",
1308
+ "deleteInitiative": "Girişimi sil",
1308
1309
  "deleteService": "Hizmeti sil",
1309
1310
  "titlePlaceholder": "Başlık…",
1310
1311
  "reworkedRequirements": "Yeniden işlenmiş gereksinimler",
@@ -1333,6 +1334,10 @@
1333
1334
  "title": "Bu modül silinsin mi?",
1334
1335
  "body": "\"{name}\" ve içindeki her şey kaldırılacak. Bu işlem geri alınamaz."
1335
1336
  },
1337
+ "initiative": {
1338
+ "title": "Bu girişim silinsin mi?",
1339
+ "body": "\"{name}\" ve planı kaldırılacak. Daha önce oluşturduğu görevler panoda kalır. Bu işlem geri alınamaz."
1340
+ },
1336
1341
  "service": {
1337
1342
  "title": "Bu servis silinsin mi?",
1338
1343
  "body": "\"{name}\" ve içindeki her şey kaldırılacak. Bu işlem geri alınamaz."
@@ -5229,6 +5234,8 @@
5229
5234
  "unanswered": "Yanitlanmamis sorular: {count}",
5230
5235
  "proceed": "Simdi planla",
5231
5236
  "proceedTitle": "Kalan sorulari atlayin ve plani simdi hazirlayin",
5237
+ "discard": "Çalıştırmayı sil",
5238
+ "discardTitle": "Takılan planlama çalıştırmasını silin ve planlamaya yeniden başlayın",
5232
5239
  "continue": "Yanitlari gonder",
5233
5240
  "continueTitle": "Yanitlarinizi gonderin; planlayici ek sorular sorabilir"
5234
5241
  },
@@ -942,7 +942,7 @@
942
942
  },
943
943
  "execution": {
944
944
  "title": "Виконання",
945
- "hint": "Живе виконання конвеєра цього завдання: кожен крок агента, його поступ і отриманий pull request.",
945
+ "hint": "Живе виконання конвеєра: кожен крок агента, його поступ і отриманий pull request.",
946
946
  "stage": {
947
947
  "incorporating": "Внесення…",
948
948
  "reviewing": "Повторний огляд…",
@@ -963,10 +963,10 @@
963
963
  "stop": "Зупинити",
964
964
  "stopTooltip": "Зупинити запуск, але зберегти його (доступний для читання та повтору)",
965
965
  "reset": "Скинути",
966
- "resetTooltip": "Відкинути цей запуск і повернути завдання до запланованого",
966
+ "resetTooltip": "Відкинути цей запуск і повернути статус до запланованого",
967
967
  "resetConfirm": {
968
968
  "title": "Відкинути цей запуск?",
969
- "body": "Це видалить запуск і поверне завдання до запланованого. Цю дію не можна скасувати.",
969
+ "body": "Це видалить запуск і поверне статус до запланованого. Цю дію не можна скасувати.",
970
970
  "confirm": "Відкинути запуск"
971
971
  },
972
972
  "mergeConfirm": {
@@ -1305,6 +1305,7 @@
1305
1305
  "deleteRecurringPipeline": "Видалити періодичний конвеєр",
1306
1306
  "deleteTask": "Видалити завдання",
1307
1307
  "deleteModule": "Видалити модуль",
1308
+ "deleteInitiative": "Видалити ініціативу",
1308
1309
  "deleteService": "Видалити сервіс",
1309
1310
  "titlePlaceholder": "Назва…",
1310
1311
  "reworkedRequirements": "Перероблені вимоги",
@@ -1333,6 +1334,10 @@
1333
1334
  "title": "Видалити цей модуль?",
1334
1335
  "body": "\"{name}\" і весь його вміст буде видалено. Цю дію не можна скасувати."
1335
1336
  },
1337
+ "initiative": {
1338
+ "title": "Видалити цю ініціативу?",
1339
+ "body": "\"{name}\" та її план буде видалено. Уже створені завдання залишаться на дошці. Цю дію не можна скасувати."
1340
+ },
1336
1341
  "service": {
1337
1342
  "title": "Видалити цей сервіс?",
1338
1343
  "body": "\"{name}\" і весь його вміст буде видалено. Цю дію не можна скасувати."
@@ -5217,6 +5222,8 @@
5217
5222
  "unanswered": "Питання без відповіді: {count}",
5218
5223
  "proceed": "Спланувати зараз",
5219
5224
  "proceedTitle": "Пропустити решту питань і підготувати план зараз",
5225
+ "discard": "Відкинути запуск",
5226
+ "discardTitle": "Відкинути застряглий запуск планування, щоб почати планування заново",
5220
5227
  "continue": "Надіслати відповіді",
5221
5228
  "continueTitle": "Надішліть свої відповіді; планувальник може поставити додаткові питання"
5222
5229
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/app",
3
- "version": "0.173.0",
3
+ "version": "0.174.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.185.0"
43
+ "@cat-factory/contracts": "0.186.0"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@toad-contracts/testing": "0.3.2",