From f688229c951bc6de65ed70448f46d4dfeb82de71 Mon Sep 17 00:00:00 2001 From: gahusb Date: Fri, 10 Jul 2026 11:02:16 +0900 Subject: [PATCH] =?UTF-8?q?feat(infra):=20naver-fetch=20=EC=9B=8C=EC=BB=A4?= =?UTF-8?q?=202D=20=ED=91=9C=EC=8B=9C=20=E2=80=94=20fetcher=20=EB=9D=BC?= =?UTF-8?q?=EB=B2=A8=C2=B7=EC=88=98=EC=A7=91=20=EC=83=81=ED=83=9C=C2=B7Nav?= =?UTF-8?q?er=20Fetch=20=ED=83=80=EC=9D=B4=ED=8B=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BE가 /api/agent-office/nodes에 등재한 naver-fetch(kind=fetcher) 워커 카드가 데이터 구동 2D 패널에 자동 표시되도록 statusVisual 매핑 보강. - kindLabel('fetcher') → '수집 워커' - workerStateLabel state:'fetching' → '수집 중' - WORKER_TITLES 'naver-fetch' → 'Naver Fetch' TDD: statusVisual.test.js 3케이스 추가(RED→GREEN). Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_01UHXzpsZQxKG9hQmNRfZjRS --- src/pages/infra/statusVisual.js | 4 ++++ src/pages/infra/statusVisual.test.js | 15 ++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/pages/infra/statusVisual.js b/src/pages/infra/statusVisual.js index 324281b..bd44c53 100644 --- a/src/pages/infra/statusVisual.js +++ b/src/pages/infra/statusVisual.js @@ -29,6 +29,8 @@ export function workerStateLabel(w) { return '장중'; case 'market_closed': return '휴장'; + case 'fetching': + return '수집 중'; default: return '온라인'; } @@ -54,6 +56,7 @@ export const WORKER_TITLES = { 'insta-render': 'Insta Render', 'task-watcher': 'Task Watcher', ai_trade: 'AI Trade', + 'naver-fetch': 'Naver Fetch', }; export function workerTitle(name) { @@ -65,5 +68,6 @@ export function kindLabel(kind) { if (kind === 'render') return '렌더 워커'; if (kind === 'watcher') return '작업 감시'; if (kind === 'trader') return '트레이딩'; + if (kind === 'fetcher') return '수집 워커'; return kind || ''; } diff --git a/src/pages/infra/statusVisual.test.js b/src/pages/infra/statusVisual.test.js index 33ea250..a833d1e 100644 --- a/src/pages/infra/statusVisual.test.js +++ b/src/pages/infra/statusVisual.test.js @@ -1,5 +1,5 @@ import { describe, it, expect } from 'vitest'; -import { linkColor, workerStateLabel, workerStatus, workerColor, workerTitle } from './statusVisual'; +import { linkColor, workerStateLabel, workerStatus, workerColor, workerTitle, kindLabel } from './statusVisual'; describe('statusVisual', () => { it('maps link status to theme colors', () => { @@ -22,6 +22,18 @@ describe('statusVisual', () => { expect(workerStateLabel({ alive: true, state: 'market_open' })).toBe('장중'); }); + it('labels a fetching worker as collecting', () => { + expect(workerStateLabel({ alive: true, state: 'fetching' })).toBe('수집 중'); + }); + + it('maps kind to a one-line role label', () => { + expect(kindLabel('render')).toBe('렌더 워커'); + expect(kindLabel('watcher')).toBe('작업 감시'); + expect(kindLabel('trader')).toBe('트레이딩'); + expect(kindLabel('fetcher')).toBe('수집 워커'); + expect(kindLabel('unknown')).toBe('unknown'); + }); + it('derives worker status with dead-letter and paused precedence', () => { expect(workerStatus({ alive: false })).toBe('down'); expect(workerStatus({ alive: true, state: 'paused' })).toBe('paused'); @@ -37,6 +49,7 @@ describe('statusVisual', () => { it('humanizes worker names', () => { expect(workerTitle('insta-render')).toBe('Insta Render'); expect(workerTitle('ai_trade')).toBe('AI Trade'); + expect(workerTitle('naver-fetch')).toBe('Naver Fetch'); expect(workerTitle('unknown-x')).toBe('unknown-x'); }); });