feat(retrieval): 청킹/평가 하니스 + 검색 인덱스 개선

- src/retrieval/chunker.ts: 문서 청킹 로직 추가
- src/retrieval/evalHarness.ts + src/extension/evalCommands.ts: 검색 품질 평가 하니스
- brainIndex.ts / retrieval/index.ts / memoryContext.ts: 인덱싱·컨텍스트 빌더 개선
- config.ts / extension.ts / sidebarProvider.ts / package.json 갱신
- ADR-0030~0032 및 개발 기록, .astra 런타임 상태 동기화

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-08 19:27:10 +09:00
parent b94e6ad1da
commit d39eb27c90
26 changed files with 1471 additions and 208 deletions
+182 -97
View File
@@ -1,6 +1,6 @@
{
"version": 1,
"generatedAt": "2026-06-01T02:30:44.174Z",
"generatedAt": "2026-06-08T10:21:24.842Z",
"files": {
"src/agent/actions/brainOps.ts": {
"mtimeMs": 1779764602582.9768,
@@ -462,9 +462,9 @@
]
},
"src/config.ts": {
"mtimeMs": 1780039183821.263,
"size": 31114,
"lines": 557,
"mtimeMs": 1780910530256.6797,
"size": 32937,
"lines": 585,
"role": "",
"imports": []
},
@@ -647,6 +647,20 @@
"src/features/calendar"
]
},
"src/extension/evalCommands.ts": {
"mtimeMs": 1780913394558.156,
"size": 12681,
"lines": 228,
"role": "",
"imports": [
"src/config",
"src/utils",
"src/retrieval",
"src/retrieval/brainIndex",
"src/retrieval/embeddings",
"src/retrieval/evalHarness"
]
},
"src/extension/initialSetup.ts": {
"mtimeMs": 1779764602604.987,
"size": 2982,
@@ -725,13 +739,14 @@
]
},
"src/extension.ts": {
"mtimeMs": 1780280902153.7483,
"size": 17342,
"lines": 358,
"mtimeMs": 1780909035802.1045,
"size": 17590,
"lines": 362,
"role": "",
"imports": [
"src/features/teamops/handlers",
"src/features/system/handlers",
"src/features/datacollect/handlers",
"src/utils",
"src/config",
"src/agent",
@@ -757,6 +772,7 @@
"src/extension/providerCommands",
"src/extension/scaffoldCommand",
"src/extension/lessonCommands",
"src/extension/evalCommands",
"src/extension/telegramCommands",
"src/extension/settingsSetup",
"src/integrations/telegram/telegramSetup",
@@ -902,7 +918,7 @@
]
},
"src/features/calendar/oauth.ts": {
"mtimeMs": 1779869692244.0415,
"mtimeMs": 1780654426655.6082,
"size": 10986,
"lines": 236,
"role": "Google OAuth 2.0 — loopback (Desktop app) 흐름. Google 은 Desktop 앱 OAuth client 에 대해 http://127.0.0.1:<ephemeralport> redirect URI 를 허용한다. 본 모듈은: 1. ephemeral port 에 일회용 HTTP 서버 띄움 2. 사용자 브라우저로 Google 로",
@@ -964,9 +980,9 @@
]
},
"src/features/company/dispatcher.ts": {
"mtimeMs": 1779764602614.1453,
"size": 70872,
"lines": 1366,
"mtimeMs": 1780367676001.7544,
"size": 70731,
"lines": 1364,
"role": "Sequential dispatcher for 1인 기업 모드. Drives one company \"turn\": user prompt → CEO planner (JSON {brief, tasks}) → for each task in plan: dispatch one specialist (sequentially) - build specialist prompt",
"imports": [
"src/core/services",
@@ -1021,9 +1037,9 @@
]
},
"src/features/company/intentAlignment.ts": {
"mtimeMs": 1779764602615.1484,
"size": 16048,
"lines": 343,
"mtimeMs": 1780366738786.6855,
"size": 18078,
"lines": 367,
"role": "Intent Alignment — 사용자의 자연어 요청을 실행 가능한 작업 조건으로 변환. 사용자는 자기 의도와 배경지식이 에이전트에게 충분히 전달되었다고 착각하는 경향이 있다 (투명성의 착각·지식의 저주·공통 기반 부족). 그래서 에이전트가 즉시 작업에 돌입하면 사용자가 머릿속에 가진 것과 다른 결과를 만들어 낸다. 이 모듈은 그 격차를 메꾸는 한 단계 ",
"imports": [
"src/core/services",
@@ -1042,9 +1058,9 @@
]
},
"src/features/company/pipelineTemplates.ts": {
"mtimeMs": 1779065453876.108,
"size": 15403,
"lines": 278,
"mtimeMs": 1780367702872.9678,
"size": 16572,
"lines": 285,
"role": "Built-in pipeline templates for 1인 기업 모드. These are blueprints, not data — they're surfaced in the manage panel's \"템플릿에서 추가\" dropdown so a non-developer user can stamp out a working pipeline in one cl",
"imports": [
"src/features/company/types"
@@ -1149,16 +1165,42 @@
]
},
"src/features/datacollect/bridgeClient.ts": {
"mtimeMs": 1779764602617.1548,
"size": 7210,
"lines": 164,
"mtimeMs": 1780624716182.2822,
"size": 8197,
"lines": 177,
"role": "",
"imports": []
},
"src/features/datacollect/handlers.ts": {
"mtimeMs": 1780624678671.3047,
"size": 35540,
"lines": 666,
"role": "Datacollect handlers — /benchmark · /youtube · /blog · /wikify · /meet. (/research(NotebookLM)는 v2.2.205 에서 제거 — 로컬 Datacollect 앱 전용으로 분리) v2.2.201 에서 slashRouter.ts 에서 분리. Datacollect bridge (port 30",
"imports": [
"src/features/datacollect/slashRouter",
"src/features/datacollect/llm",
"src/features/datacollect/bridgeClient",
"src/features/datacollect/prompts/synthesisPrompt",
"src/features/datacollect/prompts/youtubePrompts",
"src/features/datacollect/prompts/wikifyPrompt",
"src/features/datacollect/prompts/meetPrompt",
"src/features/calendar",
"src/features/datacollect/scheduling/calendarHelpers"
]
},
"src/features/datacollect/llm.ts": {
"mtimeMs": 1780281843749.1597,
"size": 6940,
"lines": 122,
"role": "Datacollect LLM 호출 인프라 — bridge /api/lm 프록시 통해 OpenAI 호환 chat completion 단발 호출. v2.2.201 에서 slashRouter.ts 에서 분리. 옛 위치는 slashRouter.callLmSynthesis 였으나 datacollect handlers + teamops/communication 양쪽이",
"imports": [
"src/features/datacollect/bridgeClient"
]
},
"src/features/datacollect/prompts/meetPrompt.ts": {
"mtimeMs": 1779764602618.1577,
"size": 2593,
"lines": 72,
"mtimeMs": 1780626429387.7917,
"size": 7379,
"lines": 95,
"role": "회의 녹취 텍스트 → 사실 기반 구조화 회의록(Actionable Minutes) LLM 프롬프트. 사용자 정의 규칙: Fact/Discussion/Decision/Risk/Action 분류, 메타데이터 우선.",
"imports": []
},
@@ -1169,6 +1211,13 @@
"role": "/benchmark 보고서의 3 파트 분할 — 1: 4-렌즈 / 2: IA + 토큰 / 3: 재구축 명세.",
"imports": []
},
"src/features/datacollect/prompts/weeklyPrompt.ts": {
"mtimeMs": 1780554147645.3784,
"size": 4702,
"lines": 96,
"role": "/weekly 주간 보고서 LLM 프롬프트. 입력: 캘린더(Google Tasks)에서 버킷팅된 금주/차주 task 목록 + 각 task 의 제목·마감·상태·메모(= /meet·/task 가 넣은 \"작업 상세 / 맥락\"). 금주/차주 분류는 호출부(coordination.ts)에서 due/completed 날짜로 이미 끝낸 상태로 들어온다. 이 프롬프트는 ",
"imports": []
},
"src/features/datacollect/prompts/wikifyPrompt.ts": {
"mtimeMs": 1779764602619.1604,
"size": 4597,
@@ -1184,33 +1233,23 @@
"imports": []
},
"src/features/datacollect/scheduling/calendarHelpers.ts": {
"mtimeMs": 1779764602620.1636,
"size": 4222,
"lines": 89,
"mtimeMs": 1780538342100.897,
"size": 4615,
"lines": 97,
"role": "/meet 슬래시 명령의 후처리 — 회의록에서 action items 를 뽑아 캘린더 task 일정을 계산하는 stateless helpers. slashRouter 의 inline 블록을 분리. - addBusinessDays(base, n) — 토·일 제외 영업일 n 일 후 날짜 - toYmd(d) — Date → 'YYYY-MM-DD' - extrac",
"imports": []
},
"src/features/datacollect/slashRouter.ts": {
"mtimeMs": 1780280990100.2815,
"size": 67318,
"lines": 1240,
"mtimeMs": 1780281950731.9368,
"size": 10210,
"lines": 201,
"role": "",
"imports": [
"src/utils",
"src/features/datacollect/bridgeClient",
"src/features/calendar",
"src/sidebar/managers/chronicleProjectStore",
"src/memory",
"src/config",
"src/retrieval/terminologyBlock",
"src/agent/termValidator",
"src/features/teamops/handlers/_shared",
"src/features/datacollect/llm",
"src/features/setup/datacollectSetup",
"src/features/datacollect/prompts/synthesisPrompt",
"src/features/datacollect/prompts/youtubePrompts",
"src/features/datacollect/prompts/wikifyPrompt",
"src/features/datacollect/prompts/meetPrompt",
"src/features/datacollect/scheduling/calendarHelpers"
"src/features/stocks"
]
},
"src/features/devilAgent/devilPrompt.ts": {
@@ -1460,9 +1499,9 @@
]
},
"src/features/settings/settingsPanelProvider.ts": {
"mtimeMs": 1779764602623.2012,
"size": 33801,
"lines": 707,
"mtimeMs": 1780882651758.066,
"size": 35067,
"lines": 728,
"role": "",
"imports": [
"src/integrations/telegram/telegramClient",
@@ -1475,8 +1514,8 @@
]
},
"src/features/setup/datacollectSetup.ts": {
"mtimeMs": 1779764602624.204,
"size": 12689,
"mtimeMs": 1780624672053.5078,
"size": 12679,
"lines": 267,
"role": "Datacollect 의존성(Python 패키지) 자동 설치/검증 모듈. 의도: Astra extension 만 깔고 끝나면 /youtube, /research 같은 datacollect 슬래시 명령은 bridge 의 Python 의존성 (yt-dlp, youtube-transcript-api) 이 없어서 실패한다. 사용자가 그걸 매번 수동으로 깔아야 하는",
"imports": [
@@ -1664,8 +1703,8 @@
]
},
"src/features/system/handlers.ts": {
"mtimeMs": 1780280889224.8892,
"size": 20518,
"mtimeMs": 1780624661739.6692,
"size": 20556,
"lines": 394,
"role": "System handlers — /memory · /glossary · /help (인프라·관리·발견). v2.2.200 에서 slashRouter.ts 에서 분리. 4인 팀 운영 도메인 아닌 \"ASTRA 자체 인프라\" 슬래시 명령. teamops handlers 와 같은 패턴.",
"imports": [
@@ -1693,32 +1732,35 @@
"imports": []
},
"src/features/teamops/handlers/communication.ts": {
"mtimeMs": 1780280515102.4714,
"size": 13781,
"lines": 254,
"mtimeMs": 1780281864898.1965,
"size": 13821,
"lines": 255,
"role": "TeamOps Communication — /draft · /feedback (외부 출력·기록). v2.2.199 에서 slashRouter.ts 에서 분리. (원래는 v2.2.200 예정이었으나 coordination 추출 시 register 라인이 인접해 묶여 함께 진행.)",
"imports": [
"src/features/datacollect/slashRouter",
"src/features/datacollect/llm",
"src/features/feedback/feedbackStore"
]
},
"src/features/teamops/handlers/coordination.ts": {
"mtimeMs": 1780280322364.4475,
"size": 30738,
"lines": 572,
"mtimeMs": 1780554184648.2307,
"size": 35565,
"lines": 665,
"role": "TeamOps Coordination — /task · /decisions · /onesie · /blocked · /standup. v2.2.199 에서 slashRouter.ts 에서 분리. 작업·결정·1:1·블로커·스탠드업 등 \"팀 운영의 실시간 부분\" 클러스터. 공통 헬퍼는 ./shared.ts 에서. 옛 slashRouter 의 local pars",
"imports": [
"src/features/datacollect/slashRouter",
"src/features/teamops/handlers/_shared",
"src/features/calendar",
"src/sidebar/managers/chronicleProjectStore"
"src/sidebar/managers/chronicleProjectStore",
"src/features/datacollect/llm",
"src/features/datacollect/prompts/weeklyPrompt"
]
},
"src/features/teamops/handlers/dashboards.ts": {
"mtimeMs": 1780279486170.9111,
"size": 42079,
"lines": 806,
"role": "TeamOps Dashboards — /morning · /evening · /cohort · /weekly (CEO 일· 리듬). v2.2.198 에서 slashRouter.ts 에서 분리. cross-data 합성 (Tasks + customers + hire + runway + Chronicle ADR) 으로 일/주/월 단위 시야 제공. 공통 헬퍼는",
"mtimeMs": 1780554715659.2327,
"size": 26379,
"lines": 493,
"role": "TeamOps Dashboards — /morning · /evening · /cohort (CEO 일· 리듬). v2.2.198 에서 slashRouter.ts 에서 분리. cross-data 합성 (Tasks + customers + hire + runway + Chronicle ADR) 으로 일/월 단위 시야 제공. (구 /weekly CEO 리뷰 ",
"imports": [
"src/features/datacollect/slashRouter",
"src/features/teamops/handlers/_shared",
@@ -1918,9 +1960,9 @@
]
},
"src/lib/contextBuilders/memoryContext.ts": {
"mtimeMs": 1780276328602.9944,
"size": 16862,
"lines": 328,
"mtimeMs": 1780911285246.217,
"size": 17357,
"lines": 331,
"role": "",
"imports": [
"src/agent",
@@ -2185,18 +2227,18 @@
]
},
"src/memory/LongTermMemory.ts": {
"mtimeMs": 1780029930791.1965,
"size": 10507,
"lines": 281,
"mtimeMs": 1780625897996.766,
"size": 13457,
"lines": 322,
"role": "Long-Term Memory (장기 기억) 사용자의 취향, 프로젝트 목표, 반복 규칙, 과거 결정 사항을 영구적으로 저장하고 관리합니다. 저장 위치: {brainPath}/memory/longterm.json",
"imports": [
"src/memory/types"
]
},
"src/memory/MemoryExtractor.ts": {
"mtimeMs": 1778028987415.8738,
"size": 3953,
"lines": 115,
"mtimeMs": 1780625907142.6775,
"size": 4402,
"lines": 120,
"role": "Memory Extractor (기억 추출기) 대화 종료 시 히스토리를 분석하여 각 메모리 레이어에 저장할 정보를 자동으로 추출합니다. LLM 호출 없이 패턴 매칭 기반으로 동작합니다.",
"imports": [
"src/memory/LongTermMemory",
@@ -2249,16 +2291,24 @@
]
},
"src/retrieval/brainIndex.ts": {
"mtimeMs": 1778667252738.4248,
"size": 13270,
"lines": 325,
"mtimeMs": 1780911242607.242,
"size": 22019,
"lines": 536,
"role": "Brain Index — persistent, mtime-keyed tokenized cache of the Second Brain RAG 검색은 매 질의마다 브레인의 모든 .md 파일을 읽고 토크나이즈해서 TF-IDF 점수를 계산했습니다 — 파일 수가 많아지면 그게 병목입니다. 이 모듈은 <brainPath>/.astra/brain-index.json 에",
"imports": [
"src/retrieval/scoring",
"src/retrieval/lessonHelpers",
"src/retrieval/chunker",
"src/utils"
]
},
"src/retrieval/chunker.ts": {
"mtimeMs": 1780910566332.277,
"size": 6927,
"lines": 174,
"role": "Markdown Section Chunker (Phase 1-가) 긴 노트를 #~###### 헤딩 경계로 섹션 청크 로 나눈다. 파일 단위 색인은 5000자 다주제 문서를 하나의 흐릿한 단위로 만들어 검색 정밀도를 떨어뜨린다 — 섹션 단위로 쪼개면 질의가 정확히 해당 섹션에 매치된다 (제2뇌의 \"문서 청킹 전략\" 지식 그대로). 규칙: - 각 헤딩 ~ 다음",
"imports": []
},
"src/retrieval/citationTrace.ts": {
"mtimeMs": 1780032397612.986,
"size": 2348,
@@ -2279,9 +2329,9 @@
]
},
"src/retrieval/contextBudget.ts": {
"mtimeMs": 1779764602653.6396,
"size": 5276,
"lines": 140,
"mtimeMs": 1780654426656.6118,
"size": 6442,
"lines": 156,
"role": "Context Budget Manager (컨텍스트 예산 관리) 시스템 프롬프트의 토큰 예산을 관리하여 로컬 모델의 context window를 효율적으로 활용합니다.",
"imports": [
"src/retrieval/types"
@@ -2305,6 +2355,13 @@
"src/utils"
]
},
"src/retrieval/evalHarness.ts": {
"mtimeMs": 1780908975047.264,
"size": 9812,
"lines": 218,
"role": "Retrieval Evaluation Harness 골든셋(질문 → 기대 문서)으로 brain 검색 품질을 recall@k / MRR 로 결정적으로 측정한다. 청킹·re-rank·embedding alpha 등 어떤 변경이 실제로 recall 을 올렸는지 숫자로 증명하기 위한 토대 — 이게 있어야 RAG 개선이 \"감(感)\" 이 아니라 무결성 있는 엔지니어링",
"imports": []
},
"src/retrieval/hierarchicalLevel.ts": {
"mtimeMs": 1780030714979.2786,
"size": 5908,
@@ -2315,9 +2372,9 @@
]
},
"src/retrieval/index.ts": {
"mtimeMs": 1780030794352.5571,
"size": 26702,
"lines": 549,
"mtimeMs": 1780913354474.1672,
"size": 36447,
"lines": 747,
"role": "RetrievalOrchestrator — Unified RAG Pipeline Astra의 모든 검색 소스를 통합 관리하는 오케스트레이터입니다. 검색 흐름: ① Query Planning — 의도 분류 + 검색 전략 결정 ② Parallel Search — Brain + Memory + Project + Episode 동시 검색 ③ Result Fusio",
"imports": [
"src/config",
@@ -2386,7 +2443,7 @@
]
},
"src/retrieval/types.ts": {
"mtimeMs": 1779764602656.6587,
"mtimeMs": 1780654426658.6223,
"size": 2485,
"lines": 66,
"role": "Retrieval Types (검색 결과 통합 타입) 모든 검색 소스(Brain, Memory, Project, Episode)의 결과를 통합 인터페이스로 정의합니다.",
@@ -2752,9 +2809,9 @@
]
},
"src/sidebarProvider.ts": {
"mtimeMs": 1779764602678.0857,
"size": 153639,
"lines": 3186,
"mtimeMs": 1780907511341.9016,
"size": 157039,
"lines": 3180,
"role": "",
"imports": [
"src/utils",
@@ -2867,9 +2924,9 @@
"imports": []
},
"src/utils.ts": {
"mtimeMs": 1779764602679.089,
"size": 26357,
"lines": 471,
"mtimeMs": 1780626069575.9587,
"size": 27057,
"lines": 472,
"role": "",
"imports": [
"src/config",
@@ -2877,23 +2934,23 @@
]
},
"media/settings-panel.css": {
"mtimeMs": 1778549008877.4587,
"size": 4756,
"lines": 210,
"mtimeMs": 1780882667511.7163,
"size": 6041,
"lines": 254,
"role": "Stylesheet",
"imports": []
},
"media/settings-panel.html": {
"mtimeMs": 1779764602573.4797,
"size": 23829,
"lines": 406,
"mtimeMs": 1780882658555.451,
"size": 26332,
"lines": 440,
"role": "Astra Settings",
"imports": []
},
"media/settings-panel.js": {
"mtimeMs": 1779764602573.4797,
"size": 22596,
"lines": 469,
"mtimeMs": 1780881704898.5125,
"size": 24963,
"lines": 505,
"role": "",
"imports": []
},
@@ -3494,7 +3551,7 @@
"imports": []
},
"docs/records/ConnectAI/chronicle.config.json": {
"mtimeMs": 1780281037893.3647,
"mtimeMs": 1780914060109.104,
"size": 371,
"lines": 11,
"role": "JSON configuration",
@@ -3703,6 +3760,27 @@
"role": "ADR: 여전히 오타가 있어. 그러고 어색한 답변도 있네. 오타 및 문맥 수정 사항 S.M.A.T -> S.M.A.R.T: 하드디스크의 자가 진단 기능을...",
"imports": []
},
"docs/records/ConnectAI/decisions/ADR-0030-outlook에서도-이메일-내용을-가져올-수-있나.md": {
"mtimeMs": 1780655594198.4128,
"size": 1444,
"lines": 19,
"role": "ADR: outlook에서도 이메일 내용을 가져올 수 있나?",
"imports": []
},
"docs/records/ConnectAI/decisions/ADR-0031-아래-프로젝트의-로직을-분석하고-어떻게-하면-astra가-더-정확하고-정교하게-개선할-수-있는-부분이-있는지.md": {
"mtimeMs": 1780908096070.1074,
"size": 1660,
"lines": 19,
"role": "ADR: 아래 프로젝트의 로직을 분석하고 어떻게 하면 astra가 더 정확하고, 정교하게 개선할 수 있는 부분이 있는지 검토해주고 의견을 주면 좋겠어. ...",
"imports": []
},
"docs/records/ConnectAI/decisions/ADR-0032-아래-프로젝트의-로직을-분석하고-어떻게-하면-astra가-더-정확하고-정교하게-개선할-수-있는-부분이-있는지.md": {
"mtimeMs": 1780914029189.1228,
"size": 1660,
"lines": 19,
"role": "ADR: 아래 프로젝트의 로직을 분석하고 어떻게 하면 astra가 더 정확하고, 정교하게 개선할 수 있는 부분이 있는지 검토해주고 의견을 주면 좋겠어. ...",
"imports": []
},
"docs/records/ConnectAI/development/2026-05-02_answer-format-readability-tuning.md": {
"mtimeMs": 1778028987330.4185,
"size": 1564,
@@ -3948,6 +4026,13 @@
"role": "Development Log: 아스트라를 지금 보다 더 날카롭고 신뢰감이 높은 아이 그리고 나의 의도를 잘 파악하게 하기 위해서는 어떤부분을 강화하는게 좋을까?",
"imports": []
},
"docs/records/ConnectAI/development/2026-06-08_아니-지금-코드-업데이트를-했거든-다시-코드를-검토하고-의견을-줘_implementation.md": {
"mtimeMs": 1780914060075.0564,
"size": 1413,
"lines": 23,
"role": "Development Log: 아니 지금 코드 업데이트를 했거든. 다시 코드를 검토하고 의견을 줘.",
"imports": []
},
"docs/records/ConnectAI/discussions/2026-05-13_volumes-data-project-antigravity-connectai-이-프로젝트-작업-할-거야.md": {
"mtimeMs": 1778720117404.2578,
"size": 668,
@@ -4047,9 +4132,9 @@
"imports": []
},
"docs/records/ConnectAI/timeline.md": {
"mtimeMs": 1780281037885.788,
"size": 15049,
"lines": 236,
"mtimeMs": 1780914060076.0566,
"size": 15782,
"lines": 248,
"role": "Project Timeline",
"imports": []
},