Release v2.1.8: Company Agent roster overhaul and UI polish

This commit is contained in:
g1nation
2026-05-14 22:25:48 +09:00
parent ac0085ab53
commit 6b10d002fa
21 changed files with 674 additions and 331 deletions
+74 -74
View File
@@ -12,9 +12,9 @@
<div class="header-top">
<div class="brand"><div class="logo"></div> Astra</div>
<div class="header-actions">
<button class="icon-btn" id="newChatBtn" data-tooltip="New Chat">New</button>
<button class="icon-btn toggle-chip active" id="brainTraceBtn" data-tooltip="Second Brain Trace Mode">Trace</button>
<button class="icon-btn toggle-chip" id="internetBtn" data-tooltip="Internet Access">Web</button>
<button class="icon-btn" id="newChatBtn" data-tooltip="새 대화 시작 (현재 대화는 기록에 저장)">새 대화</button>
<button class="icon-btn toggle-chip active" id="brainTraceBtn" data-tooltip="답변에 사용된 두뇌(지식) 근거를 함께 표시">근거 추적</button>
<button class="icon-btn toggle-chip" id="internetBtn" data-tooltip="필요할 때 웹에서 정보를 가져옵니다">웹 검색</button>
<!--
Corp toggle — replaces the old pill-shaped chip that lived
in the records-line. Same rounded-rectangle style as the
@@ -22,19 +22,19 @@
the adjacent ▾ opens the manage overlay (agents · models ·
prompt edits · Knowledge Mix sliders).
-->
<button class="icon-btn toggle-chip" id="companyChip" data-tooltip="1인 기업 모드 토글">Corp</button>
<button class="icon-btn" id="companyManageBtn" data-tooltip="회사 관리 (에이전트·모델·prompt·Knowledge Mix)"></button>
<button class="icon-btn toggle-chip" id="companyChip" data-tooltip="1인 기업 모드 — CEO가 요청을 분석해 전문 에이전트에게 분배">기업 모드</button>
<button class="icon-btn" id="companyManageBtn" data-tooltip="기업 모드 관리 (에이전트 · 모델 · 프롬프트 · 지식 비중)"></button>
<div class="hdr-dropdown" data-dd>
<button class="icon-btn" id="toolsMenuBtn" data-dd-trigger data-tooltip="Tools">Tools</button>
<button class="icon-btn" id="toolsMenuBtn" data-dd-trigger data-tooltip="개발자 도구 모음">도구</button>
<div class="hdr-menu" id="toolsMenu" data-dd-menu>
<div class="hdr-menu-label">Tools</div>
<button class="hdr-menu-item toggle-item" id="brainTraceDebugBtn" data-tooltip="Second Brain Debug JSON">Debug Trace JSON</button>
<button class="hdr-menu-item" id="saveWikiRawBtn" data-tooltip="Save Wiki Raw">Save Wiki Raw</button>
<button class="hdr-menu-item" id="brainBtn" data-tooltip="Sync Knowledge (commit + push)">Sync Knowledge</button>
<div class="hdr-menu-label">도구</div>
<button class="hdr-menu-item toggle-item" id="brainTraceDebugBtn" data-tooltip="근거 추적의 원본 JSON 표시 (개발자용)">근거 추적 JSON 보기</button>
<button class="hdr-menu-item" id="saveWikiRawBtn" data-tooltip="현재 답변의 원본 마크다운을 두뇌(지식)에 저장">원본 답변을 두뇌에 저장</button>
<button class="hdr-menu-item" id="brainBtn" data-tooltip="두뇌(지식) 폴더 변경사항을 git commit + push">두뇌 동기화</button>
</div>
</div>
<button class="icon-btn" id="historyBtn" data-tooltip="View History">History</button>
<button class="icon-btn" id="settingsBtn" data-tooltip="Settings">Set</button>
<button class="icon-btn" id="historyBtn" data-tooltip="이전 대화 기록 보기">기록</button>
<button class="icon-btn" id="settingsBtn" data-tooltip="설정 패널 열기">설정</button>
</div>
</div>
</div>
@@ -47,62 +47,62 @@
<div class="context-bar">
<div class="context-summary" id="contextSummary">
<span class="cb-seg"><span class="cb-key">Brain</span> <span id="ctxBrainName" class="cb-val"></span></span>
<span class="cb-seg"><span class="cb-key">두뇌</span> <span id="ctxBrainName" class="cb-val"></span></span>
<span class="cb-sep">·</span>
<span class="cb-seg"><span class="cb-key">Agent</span> <span id="ctxAgentName" class="cb-val"></span></span>
<span class="cb-seg"><span class="cb-key">에이전트</span> <span id="ctxAgentName" class="cb-val"></span></span>
<span class="cb-sep">·</span>
<span class="cb-seg"><span class="cb-key">Project</span> <span id="ctxProjectName" class="cb-val"></span></span>
<span class="cb-seg"><span class="cb-key">프로젝트</span> <span id="ctxProjectName" class="cb-val"></span></span>
</div>
<div class="hdr-dropdown context-edit-dd" data-dd>
<button class="icon-btn" id="contextEditBtn" data-dd-trigger data-tooltip="Model / Brain / Agent / Knowledge Map / Project">Edit</button>
<button class="icon-btn" id="contextEditBtn" data-dd-trigger data-tooltip="모델 · 두뇌 · 에이전트 · 프로젝트 변경">변경</button>
<div class="hdr-menu hdr-menu-wide" id="contextEditMenu" data-dd-menu>
<div class="hdr-menu-label">Model</div>
<div class="select-wrap"><select id="modelSel" title="Select Model"></select></div>
<div class="hdr-menu-label">모델</div>
<div class="select-wrap"><select id="modelSel" title="이 대화에 사용할 모델"></select></div>
<div class="hdr-menu-label">
Knowledge Mix
<span class="hdr-menu-hint" id="knowledgeMixHint">Model 50% · Brain 50%</span>
지식 비중
<span class="hdr-menu-hint" id="knowledgeMixHint">모델 50% · 두뇌 50%</span>
</div>
<div class="knowledge-mix-control" title="Slide left for more model knowledge, right for more Second Brain reliance">
<span class="km-end-label">Model</span>
<div class="knowledge-mix-control" title="왼쪽으로 갈수록 모델 자체 지식, 오른쪽으로 갈수록 내 두뇌(저장된 지식)에 의존합니다">
<span class="km-end-label">모델</span>
<input type="range" id="knowledgeMixSlider" min="0" max="100" step="5" value="50" class="km-slider">
<span class="km-end-label">Brain</span>
<span class="km-end-label">두뇌</span>
</div>
<div class="hdr-menu-label">Brain</div>
<div class="hdr-menu-label">두뇌 (지식 폴더)</div>
<div class="control-row">
<div class="select-wrap"><select id="brainSel" title="Select Brain"></select></div>
<div class="tool-group" aria-label="Brain actions">
<button class="icon-btn" id="addBrainBtn" data-tooltip="Add Brain">Add</button>
<button class="icon-btn" id="editBrainBtn" data-tooltip="Edit Brain">Edit</button>
<button class="icon-btn" id="deleteBrainBtn" data-tooltip="Delete Brain">Del</button>
<div class="select-wrap"><select id="brainSel" title="사용할 두뇌(지식 폴더) 선택"></select></div>
<div class="tool-group" aria-label="두뇌 관리">
<button class="icon-btn" id="addBrainBtn" data-tooltip="새 두뇌 추가">추가</button>
<button class="icon-btn" id="editBrainBtn" data-tooltip="선택한 두뇌 수정">수정</button>
<button class="icon-btn" id="deleteBrainBtn" data-tooltip="선택한 두뇌 삭제">삭제</button>
</div>
</div>
<div class="hdr-menu-label">Agent</div>
<div class="hdr-menu-label">에이전트</div>
<div class="control-row">
<div class="select-wrap"><select id="agentSel" title="Select Agentic Skill"></select></div>
<div class="tool-group" aria-label="Agent actions">
<button class="icon-btn" id="addAgentBtn" data-tooltip="Create Agent">Add</button>
<button class="icon-btn" id="editAgentBtn" data-tooltip="Edit Agent Skill">Edit</button>
<button class="icon-btn" id="deleteAgentBtn" data-tooltip="Delete Agent Skill">Del</button>
<div class="select-wrap"><select id="agentSel" title="대화에 적용할 에이전트(역할) 선택"></select></div>
<div class="tool-group" aria-label="에이전트 관리">
<button class="icon-btn" id="addAgentBtn" data-tooltip="새 에이전트 만들기">추가</button>
<button class="icon-btn" id="editAgentBtn" data-tooltip="선택한 에이전트 수정">수정</button>
<button class="icon-btn" id="deleteAgentBtn" data-tooltip="선택한 에이전트 삭제">삭제</button>
</div>
</div>
<div class="hdr-menu-label">Agent ↔ Knowledge</div>
<div class="hdr-menu-label">에이전트 ↔ 지식 연결</div>
<div class="control-row">
<div class="select-wrap"><select id="knowledgeScopeSel" title="Knowledge folders mapped to this agent"></select></div>
<div class="tool-group" aria-label="Knowledge map actions">
<button class="icon-btn" id="editKnowledgeMapBtn" data-tooltip="Edit Agent ↔ Knowledge Map">Map</button>
<button class="icon-btn" id="reloadKnowledgeMapBtn" data-tooltip="Reload Knowledge Map">Rld</button>
<div class="select-wrap"><select id="knowledgeScopeSel" title="이 에이전트가 참고할 지식 폴더 범위"></select></div>
<div class="tool-group" aria-label="지식 연결 관리">
<button class="icon-btn" id="editKnowledgeMapBtn" data-tooltip="에이전트별 지식 폴더 연결 편집">연결 편집</button>
<button class="icon-btn" id="reloadKnowledgeMapBtn" data-tooltip="연결 정보를 디스크에서 다시 읽기">새로고침</button>
</div>
</div>
<div class="hdr-menu-label">Project (Chronicle)</div>
<div class="hdr-menu-label">프로젝트 (작업 기록)</div>
<div class="control-row">
<div class="select-wrap"><select id="designerSel" title="Select Designer Project"></select></div>
<div class="tool-group" aria-label="Designer actions">
<button class="icon-btn" id="addDesignerBtn" data-tooltip="Create Designer Project">Add</button>
<div class="select-wrap"><select id="designerSel" title="작업 기록을 남길 프로젝트 선택"></select></div>
<div class="tool-group" aria-label="프로젝트 관리">
<button class="icon-btn" id="addDesignerBtn" data-tooltip="새 프로젝트 만들기">추가</button>
</div>
</div>
</div>
@@ -112,19 +112,19 @@
<div class="records-line">
<div class="rl-summary">
<span class="status-dot ready"></span>
<span id="chronicleAutoStatus" title="Project records are saved automatically after meaningful project turns.">Auto Records</span>
<span id="chronicleAutoStatus" title="의미 있는 대화 후 프로젝트 기록이 자동으로 저장됩니다.">자동 기록</span>
<span class="rl-latest" id="recordsLatest"></span>
</div>
<!-- (Removed) Corp chip moved to the header toolbar above —
see #companyChip / #companyManageBtn alongside New/Trace/Web. -->
<div class="hdr-dropdown" data-dd>
<button class="icon-btn" id="recordsMenuBtn" data-dd-trigger data-tooltip="Chronicle records">Records</button>
<button class="icon-btn" id="recordsMenuBtn" data-dd-trigger data-tooltip="저장된 작업 기록 열기">기록</button>
<div class="hdr-menu hdr-menu-wide" id="recordsMenu" data-dd-menu>
<div class="hdr-menu-label">Chronicle Records</div>
<div class="select-wrap"><select id="chronicleRecordSel" title="Select Chronicle Record"></select></div>
<button class="hdr-menu-item" id="openChronicleRecordBtn" data-tooltip="Open Selected Record">Open Selected Record</button>
<button class="hdr-menu-item" id="refreshChronicleRecordsBtn" data-tooltip="Refresh Records">Refresh Records</button>
<button class="hdr-menu-item" id="openDesignerBtn" data-tooltip="Open Record Folder">Open Record Folder</button>
<div class="hdr-menu-label">작업 기록</div>
<div class="select-wrap"><select id="chronicleRecordSel" title="열어볼 작업 기록 선택"></select></div>
<button class="hdr-menu-item" id="openChronicleRecordBtn" data-tooltip="선택한 기록 열기">선택한 기록 열기</button>
<button class="hdr-menu-item" id="refreshChronicleRecordsBtn" data-tooltip="기록 목록 다시 불러오기">기록 새로고침</button>
<button class="hdr-menu-item" id="openDesignerBtn" data-tooltip="기록이 저장된 폴더 열기">기록 폴더 열기</button>
</div>
</div>
</div>
@@ -166,7 +166,7 @@
<div class="map-section-hint">CEO는 항상 활성. 각 에이전트별로 모델을 따로 지정할 수 있습니다 — 다른 모델을 쓸 때만 LM Studio가 swap합니다.</div>
</div>
<div class="map-btn-group">
<button class="secondary-btn" id="addCompanyAgentBtn" title="새 사용자 에이전트 추가">+ Agent</button>
<button class="secondary-btn" id="addCompanyAgentBtn" title="새 사용자 에이전트 추가">+ 에이전트 추가</button>
</div>
</div>
<ul id="companyAgentList" class="map-list company-agent-list"></ul>
@@ -228,7 +228,7 @@
style="padding:3px 6px; font-size:10px; background:var(--surface); color:var(--text-primary); border:1px solid var(--border); border-radius:5px;">
<option value="">📋 템플릿에서…</option>
</select>
<button class="secondary-btn" id="addCompanyPipelineBtn" title="빈 파이프라인부터 시작">+ 빈 Pipeline</button>
<button class="secondary-btn" id="addCompanyPipelineBtn" title="빈 파이프라인부터 시작">+ 빈 파이프라인</button>
</div>
</div>
<div class="control-row" style="margin-top:8px; gap:8px; align-items:center;">
@@ -255,7 +255,7 @@
</div>
<div style="display:flex; justify-content:space-between; align-items:center; margin-top:12px; margin-bottom:6px;">
<div style="font-size:11px; font-weight:700; color:var(--text-bright);">단계 (Stages)</div>
<button class="secondary-btn" id="addStageBtn" style="font-size:10px; padding:3px 8px;">+ Stage 추가</button>
<button class="secondary-btn" id="addStageBtn" style="font-size:10px; padding:3px 8px;">+ 단계 추가</button>
</div>
<ul id="pipelineStageList" class="pipeline-stage-list"></ul>
<div class="editor-actions" style="margin-top:10px;">
@@ -354,7 +354,7 @@
</div>
<div class="map-footer">
<button class="secondary-btn" id="editAgentMapJsonBtn" title="고급 사용자용: JSON으로 직접 편집">JSON 편집</button>
<button class="secondary-btn" id="editAgentMapJsonBtn" title="고급 사용자용: JSON으로 직접 편집">고급 (JSON)</button>
<div style="flex:1"></div>
<button class="secondary-btn" id="cancelAgentMapBtn">취소</button>
<button class="send-btn" id="saveAgentMapBtn">저장</button>
@@ -377,8 +377,8 @@
<div class="chat" id="chat">
<div class="welcome">
<div class="welcome-logo"></div>
<div class="welcome-title">Welcome to Astra</div>
<p>Your premium local AI assistant.<br>Ready to analyze projects and build reports.</p>
<div class="welcome-title">Astra에 오신 것을 환영합니다</div>
<p>로컬에서 동작하는 개인 AI 비서입니다.<br>아래 입력창에 무엇을 도와줄지 적어보세요.</p>
</div>
</div>
@@ -406,39 +406,39 @@
</div>
<div class="arch-chip-actions" id="archChipActions">
<!-- active state buttons -->
<button class="arch-chip-btn arch-chip-active-only" id="archOpenBtn" title="Architecture 문서 열기">Open</button>
<button class="arch-chip-btn arch-chip-active-only" id="archRefreshBtn" title="지금 다시 스캔">Refresh</button>
<button class="arch-chip-btn arch-chip-active-only" id="archDetachBtn" title="자동 첨부 끄기">Detach</button>
<button class="arch-chip-btn arch-chip-active-only" id="archOpenBtn" title="프로젝트 구조 문서 열기">열기</button>
<button class="arch-chip-btn arch-chip-active-only" id="archRefreshBtn" title="프로젝트를 지금 다시 스캔">새로고침</button>
<button class="arch-chip-btn arch-chip-active-only" id="archDetachBtn" title="이 프로젝트 컨텍스트 자동 첨부 끄기">분리</button>
<!-- inactive state button -->
<button class="arch-chip-btn arch-chip-inactive-only" id="archAttachBtn" title="이 프로젝트에 architecture 자동 첨부 켜기">Attach</button>
<button class="arch-chip-btn arch-chip-inactive-only" id="archAttachBtn" title="이 프로젝트 컨텍스트를 대화에 자동 첨부">첨부</button>
</div>
</div>
<div id="agentConfigPanel" class="panel">
<div class="field-label">Agent Persona/Instructions</div>
<textarea id="agentPrompt" rows="5" placeholder="Agent Persona & Instructions..."></textarea>
<div class="field-label">에이전트 페르소나 / 지시사항</div>
<textarea id="agentPrompt" rows="5" placeholder="이 에이전트가 어떤 역할로, 어떤 톤으로 답해야 하는지 적으세요..."></textarea>
<div class="field-label">Negative Prompt (Strict Rules)</div>
<textarea id="negativePrompt" rows="2" placeholder="What NOT to do..."></textarea>
<div class="field-label">금지 사항 (반드시 지킬 규칙)</div>
<textarea id="negativePrompt" rows="2" placeholder="이 에이전트가 절대 하지 말아야 할 것..."></textarea>
<button id="updateAgentBtn" class="secondary-btn">Update Agent Skill</button>
<button id="updateAgentBtn" class="secondary-btn">에이전트 저장</button>
</div>
<div class="input-box">
<div id="attachPreview" class="attachment-preview"></div>
<textarea id="input" rows="1" placeholder="Ask Astra..."></textarea>
<textarea id="input" rows="1" placeholder="Astra에게 무엇이든 물어보세요..."></textarea>
<div class="input-footer">
<div class="footer-left">
<button class="icon-btn" id="attachBtn" title="Attach Files">📎</button>
<span class="model-pill" title="Switch model for this conversation">
<span class="model-prefix">Model:</span>
<select id="modelInlineSel" class="model-inline-sel" title="Switch model"></select>
<button class="icon-btn" id="attachBtn" title="파일 첨부 (이미지 · 문서 · 코드)">📎</button>
<span class="model-pill" title="이 대화에 사용할 모델 변경">
<span class="model-prefix">모델:</span>
<select id="modelInlineSel" class="model-inline-sel" title="모델 변경"></select>
</span>
<span id="statusLabel" class="status-label"></span>
<span id="ctxBadge" class="ctx-badge" title="직전 요청에 실제로 들어간 컨텍스트 추정치"></span>
</div>
<div class="footer-right">
<button id="cancelBtn" class="cancel-btn" title="Clear draft" style="display:none;">Clear</button>
<button id="stopBtn" class="stop-btn" title="Stop generation" style="display:none;">Stop</button>
<button id="sendBtn" class="send-btn">Send</button>
<button id="cancelBtn" class="cancel-btn" title="입력 비우기" style="display:none;">비우기</button>
<button id="stopBtn" class="stop-btn" title="생성 중단" style="display:none;">중단</button>
<button id="sendBtn" class="send-btn">보내기</button>
</div>
</div>
<div id="toastNotif" class="toast-notif"></div>