fix(workboard): scope card stop aborts

This commit is contained in:
Peter Steinberger
2026-05-22 19:18:47 +01:00
parent eb3dc18b13
commit e1f64a0dd0
8 changed files with 171 additions and 0 deletions

View File

@@ -487,6 +487,15 @@ export const de: TranslationMap = {
disabledHelpEnd: ", und laden Sie dann diesen Tab neu.",
noLinkedSession: "Keine verknüpfte Sitzung",
stopSession: "Sitzung stoppen",
editCard: "Karte bearbeiten",
fieldTitle: "Titel",
fieldNotes: "Notizen",
fieldStatus: "Status",
fieldPriority: "Priorität",
fieldAgent: "Agent",
fieldSession: "Sitzung",
fieldLabels: "Labels",
labelsPlaceholder: "ui, docs",
lifecycleUnlinked: "Keine Sitzung",
lifecycleUnlinkedDetail: "Sitzung starten oder verknüpfen",
lifecycleMissing: "Sitzung fehlt",
@@ -499,6 +508,25 @@ export const de: TranslationMap = {
lifecycleDoneDetail: "Zur Überprüfung verschoben",
lifecycleNeedsReview: "Überprüfung erforderlich",
lifecycleNeedsReviewDetail: "Lauf gestoppt oder fehlgeschlagen",
gameButton: "Minispiel",
gameTitle: "Card Chase",
gameStart: "Erreiche das Startfeld.",
gameBoundary: "Grenze erreicht.",
gameBlocked: "Blockiert.",
gameContinue: "Weiter so.",
gameWin: "Start abgeschlossen.",
gameMoves: "Züge {count}",
gameWins: "Siege {count}",
gameBoard: "Card Chase-Spielfeld",
gameControls: "Card Chase-Steuerung",
gameAgent: "Agent",
gameLaunch: "Start",
gameBlockedCell: "Blockiert",
gameOpenCell: "Offen",
gameMoveUp: "Nach oben bewegen",
gameMoveLeft: "Nach links bewegen",
gameMoveDown: "Nach unten bewegen",
gameMoveRight: "Nach rechts bewegen",
},
overview: {
access: {

View File

@@ -484,6 +484,15 @@ export const es: TranslationMap = {
disabledHelpEnd: ", luego vuelve a cargar esta pestaña.",
noLinkedSession: "Sin sesión vinculada",
stopSession: "Detener sesión",
editCard: "Editar tarjeta",
fieldTitle: "Título",
fieldNotes: "Notas",
fieldStatus: "Estado",
fieldPriority: "Prioridad",
fieldAgent: "Agente",
fieldSession: "Sesión",
fieldLabels: "Etiquetas",
labelsPlaceholder: "ui, docs",
lifecycleUnlinked: "Sin sesión",
lifecycleUnlinkedDetail: "Inicia o vincula una sesión",
lifecycleMissing: "Falta la sesión",
@@ -496,6 +505,25 @@ export const es: TranslationMap = {
lifecycleDoneDetail: "Movido a revisión",
lifecycleNeedsReview: "Necesita revisión",
lifecycleNeedsReviewDetail: "La ejecución se detuvo o falló",
gameButton: "Minijuego",
gameTitle: "Card Chase",
gameStart: "Alcanza la casilla de lanzamiento.",
gameBoundary: "Límite alcanzado.",
gameBlocked: "Bloqueado.",
gameContinue: "Sigue adelante.",
gameWin: "Lanzamiento completado.",
gameMoves: "Movimientos {count}",
gameWins: "Victorias {count}",
gameBoard: "Tablero de Card Chase",
gameControls: "Controles de Card Chase",
gameAgent: "Agente",
gameLaunch: "Lanzamiento",
gameBlockedCell: "Bloqueado",
gameOpenCell: "Abierto",
gameMoveUp: "Mover arriba",
gameMoveLeft: "Mover a la izquierda",
gameMoveDown: "Mover abajo",
gameMoveRight: "Mover a la derecha",
},
overview: {
access: {

View File

@@ -487,6 +487,15 @@ export const ja_JP: TranslationMap = {
disabledHelpEnd: "を設定してから、このタブを再読み込みしてください。",
noLinkedSession: "リンクされたセッションがありません",
stopSession: "セッションを停止",
editCard: "カードを編集",
fieldTitle: "タイトル",
fieldNotes: "メモ",
fieldStatus: "ステータス",
fieldPriority: "優先度",
fieldAgent: "エージェント",
fieldSession: "セッション",
fieldLabels: "ラベル",
labelsPlaceholder: "ui, docs",
lifecycleUnlinked: "セッションなし",
lifecycleUnlinkedDetail: "セッションを開始またはリンク",
lifecycleMissing: "セッションが見つかりません",
@@ -499,6 +508,25 @@ export const ja_JP: TranslationMap = {
lifecycleDoneDetail: "レビューに移動しました",
lifecycleNeedsReview: "レビューが必要",
lifecycleNeedsReviewDetail: "実行が停止または失敗しました",
gameButton: "ミニゲーム",
gameTitle: "Card Chase",
gameStart: "ローンチタイルに到達してください。",
gameBoundary: "境界に到達しました。",
gameBlocked: "ブロックされています。",
gameContinue: "続けてください。",
gameWin: "ローンチをクリアしました。",
gameMoves: "移動 {count}",
gameWins: "勝利 {count}",
gameBoard: "Card Chase ボード",
gameControls: "Card Chase コントロール",
gameAgent: "エージェント",
gameLaunch: "ローンチ",
gameBlockedCell: "ブロック済み",
gameOpenCell: "オープン",
gameMoveUp: "上に移動",
gameMoveLeft: "左に移動",
gameMoveDown: "下に移動",
gameMoveRight: "右に移動",
},
overview: {
access: {

View File

@@ -484,6 +484,15 @@ export const pt_BR: TranslationMap = {
disabledHelpEnd: ", depois recarregue esta aba.",
noLinkedSession: "Nenhuma sessão vinculada",
stopSession: "Parar sessão",
editCard: "Editar cartão",
fieldTitle: "Título",
fieldNotes: "Notas",
fieldStatus: "Status",
fieldPriority: "Prioridade",
fieldAgent: "Agente",
fieldSession: "Sessão",
fieldLabels: "Etiquetas",
labelsPlaceholder: "ui, docs",
lifecycleUnlinked: "Nenhuma sessão",
lifecycleUnlinkedDetail: "Inicie ou vincule uma sessão",
lifecycleMissing: "Sessão ausente",
@@ -496,6 +505,25 @@ export const pt_BR: TranslationMap = {
lifecycleDoneDetail: "Movido para revisão",
lifecycleNeedsReview: "Precisa de revisão",
lifecycleNeedsReviewDetail: "A execução foi interrompida ou falhou",
gameButton: "Mini game",
gameTitle: "Card Chase",
gameStart: "Alcance o bloco de lançamento.",
gameBoundary: "Limite alcançado.",
gameBlocked: "Bloqueado.",
gameContinue: "Continue.",
gameWin: "Lançamento concluído.",
gameMoves: "Movimentos {count}",
gameWins: "Vitórias {count}",
gameBoard: "Tabuleiro do Card Chase",
gameControls: "Controles do Card Chase",
gameAgent: "Agente",
gameLaunch: "Lançamento",
gameBlockedCell: "Bloqueado",
gameOpenCell: "Aberto",
gameMoveUp: "Mover para cima",
gameMoveLeft: "Mover para a esquerda",
gameMoveDown: "Mover para baixo",
gameMoveRight: "Mover para a direita",
},
overview: {
access: {

View File

@@ -481,6 +481,15 @@ export const zh_CN: TranslationMap = {
disabledHelpEnd: ",然后重新加载此标签页。",
noLinkedSession: "没有已关联的会话",
stopSession: "停止会话",
editCard: "编辑卡片",
fieldTitle: "标题",
fieldNotes: "备注",
fieldStatus: "状态",
fieldPriority: "优先级",
fieldAgent: "代理",
fieldSession: "会话",
fieldLabels: "标签",
labelsPlaceholder: "ui, docs",
lifecycleUnlinked: "无会话",
lifecycleUnlinkedDetail: "启动或关联会话",
lifecycleMissing: "会话缺失",
@@ -493,6 +502,25 @@ export const zh_CN: TranslationMap = {
lifecycleDoneDetail: "已移至审核",
lifecycleNeedsReview: "需要审核",
lifecycleNeedsReviewDetail: "运行已停止或失败",
gameButton: "迷你游戏",
gameTitle: "卡片追逐",
gameStart: "到达发布图块。",
gameBoundary: "已到达边界。",
gameBlocked: "已阻挡。",
gameContinue: "继续前进。",
gameWin: "发布已完成。",
gameMoves: "移动 {count}",
gameWins: "获胜 {count}",
gameBoard: "卡片追逐棋盘",
gameControls: "卡片追逐控制",
gameAgent: "代理",
gameLaunch: "发布",
gameBlockedCell: "已阻挡",
gameOpenCell: "开放",
gameMoveUp: "向上移动",
gameMoveLeft: "向左移动",
gameMoveDown: "向下移动",
gameMoveRight: "向右移动",
},
overview: {
access: {

View File

@@ -481,6 +481,15 @@ export const zh_TW: TranslationMap = {
disabledHelpEnd: ",然後重新載入此分頁。",
noLinkedSession: "沒有已連結的工作階段",
stopSession: "停止工作階段",
editCard: "編輯卡片",
fieldTitle: "標題",
fieldNotes: "備註",
fieldStatus: "狀態",
fieldPriority: "優先順序",
fieldAgent: "代理",
fieldSession: "工作階段",
fieldLabels: "標籤",
labelsPlaceholder: "ui, docs",
lifecycleUnlinked: "沒有工作階段",
lifecycleUnlinkedDetail: "開始或連結工作階段",
lifecycleMissing: "找不到工作階段",
@@ -493,6 +502,25 @@ export const zh_TW: TranslationMap = {
lifecycleDoneDetail: "已移至審查",
lifecycleNeedsReview: "需要審查",
lifecycleNeedsReviewDetail: "執行已停止或失敗",
gameButton: "小遊戲",
gameTitle: "卡片追逐",
gameStart: "到達啟動方格。",
gameBoundary: "已到達邊界。",
gameBlocked: "已封鎖。",
gameContinue: "繼續前進。",
gameWin: "啟動已完成。",
gameMoves: "移動 {count}",
gameWins: "獲勝 {count}",
gameBoard: "卡片追逐棋盤",
gameControls: "卡片追逐控制項",
gameAgent: "代理",
gameLaunch: "啟動",
gameBlockedCell: "已封鎖",
gameOpenCell: "開放",
gameMoveUp: "向上移動",
gameMoveLeft: "向左移動",
gameMoveDown: "向下移動",
gameMoveRight: "向右移動",
},
overview: {
access: {

View File

@@ -543,6 +543,7 @@ describe("workboard controller", () => {
expect(client.request).toHaveBeenNthCalledWith(1, "chat.abort", {
sessionKey: sampleSession.key,
runId: "run-1",
});
expect(client.request).toHaveBeenNthCalledWith(2, "workboard.cards.update", {
id: "card-1",
@@ -565,6 +566,7 @@ describe("workboard controller", () => {
expect(client.request).toHaveBeenCalledOnce();
expect(client.request).toHaveBeenCalledWith("chat.abort", {
sessionKey: sampleSession.key,
runId: "stale-run",
});
expect(state.cards).toEqual([linked]);
});

View File

@@ -784,6 +784,7 @@ export async function stopWorkboardCard(params: {
try {
const abortResult = await params.client.request("chat.abort", {
sessionKey: params.card.sessionKey,
...(params.card.runId ? { runId: params.card.runId } : {}),
});
const aborted =
isRecord(abortResult) &&