diff --git a/.astra/project-context/architecture.md b/.astra/project-context/architecture.md
index 722a377..45481bf 100644
--- a/.astra/project-context/architecture.md
+++ b/.astra/project-context/architecture.md
@@ -3,15 +3,15 @@
## Snapshot
-- **Workspace**: `connectai` `v2.2.248` _(absolute path varies by environment; resolved from the active VS Code workspace)_
+- **Workspace**: `connectai` `v2.2.312` _(absolute path varies by environment; resolved from the active VS Code workspace)_
- **Description**: The personal intelligence layer for Antigravity and VS Code. A private cognitive partner for deep project context, memory, and proactive strategic decision-making.
- **Stack**: TypeScript, Node.js, VS Code Extension, LM Studio SDK, Test runner
-- **Stats**: 560 source files, ~83,596 lines across 5 top-level modules.
+- **Stats**: 617 source files, ~90,403 lines across 5 top-level modules.
## Last Refresh
-- **Time**: 2026-06-15T02:56:35.947Z
+- **Time**: 2026-07-20T04:20:03.384Z
- **Files newly analysed**: 1
-- **Files reused from cache**: 559
+- **Files reused from cache**: 616
## Directory Map
```mermaid
@@ -19,11 +19,11 @@ mindmap
root((connectai))
src/
features/
- sidebar/
lib/
agent/
- intelligence/
+ sidebar/
retrieval/
+ intelligence/
media/
tests/
helpers/
@@ -41,11 +41,11 @@ mindmap
> Arrows: which top-level module imports from which.
```mermaid
flowchart LR
- src["src/
317 files"]
+ src["src/
342 files"]
media["media/
6 files"]
- tests["tests/
58 files"]
+ tests["tests/
86 files"]
core_py["core_py/
6 files"]
- docs["docs/
173 files"]
+ docs["docs/
177 files"]
tests --> src
```
@@ -57,71 +57,71 @@ flowchart LR
## Hub Files
> Imported by many other files — touching these has wide blast radius.
-- `src/utils.ts` — referenced by **102** files
-- `src/config.ts` — referenced by **38** files
-- `src/agent.ts` — referenced by **34** files
-- `src/core/services.ts` — referenced by **17** files
-- `src/features/company/index.ts` — referenced by **14** files · Public API for 1인 기업 모드. Consumers (sidebarProvider, chatHandlers, command handlers) import from this barrel so internal layout can move around without touching every call site.
-- `src/features/company/types.ts` — referenced by **14** files · Type definitions for the 1인 기업 (One-Person Company) mode. The mode turns the user into a virtual CEO that dispatches work to a roster of specialist agents. Each turn produces a session directory conta
-- `src/retrieval/brainIndex.ts` — referenced by **12** files · Brain Index — persistent, mtime-keyed tokenized cache of the Second Brain RAG 검색은 매 질의마다 브레인의 모든 .md 파일을 읽고 토크나이즈해서 TF-IDF 점수를 계산했습니다 — 파일 수가 많아지면 그게 병목입니다. 이 모듈은 /.astra/brain-index.json 에
-- `src/integrations/telegram/telegramClient.ts` — referenced by **12** files
+- `src/utils.ts` — referenced by **116** files
+- `src/config.ts` — referenced by **44** files
+- `src/agent.ts` — referenced by **37** files
+- `src/core/services.ts` — referenced by **23** files
+- `src/retrieval/brainIndex.ts` — referenced by **14** files · Brain Index — persistent, mtime-keyed tokenized cache of the Second Brain RAG 검색은 매 질의마다 브레인의 모든 .md 파일을 읽고 토크나이즈해서 TF-IDF 점수를 계산했습니다 — 파일 수가 많아지면 그게 병목입니다. 이 모듈은 /.astra/brain-index.json 에
+- `src/agent/actions/types.ts` — referenced by **13** files
+- `src/integrations/telegram/telegramClient.ts` — referenced by **13** files
+- `src/features/company/types.ts` — referenced by **13** files · Type definitions for the 1인 기업 (One-Person Company) mode. The mode turns the user into a virtual CEO that dispatches work to a roster of specialist agents. Each turn produces a session directory conta
## Modules
-### `src/` — 317 files, ~61,246 lines
+### `src/` — 342 files, ~65,381 lines
**Sub-directories**
-- `src/features/` (112) — Astra Office — public API. 다음 세션에서 추가될 OfficeSnapshot presenter / schema 도 같은 entry 로 노출 예정. 현재 노출: full webview panel H
-- `src/sidebar/` (35) — Brain profile lifecycle 의 pure helpers — sidebarProvider 의 add/edit/delete 흐름에서 modal UI 와 config 쓰기를 제외한 데이터 변환 만 격리. 현
-- `src/lib/` (33) — Astra Mode Architecture Context Builder. 의도: 사용자가 Astra 자체의 mode 디자인 (Guard vs Multi-Agent 가 별도 모드여야 하는지) 을 묻는 메타 질문에 답할
-- `src/agent/` (31) — 한·영 깨진 토큰 감지·수리 — 소형 로컬 모델의 토큰 붕괴 보정. 증상: 한국어 단어 중간에 영문 토큰이 섞임 — "덩어리"→"덩ey", "결과적으로"→"결ently". 프롬프트 규칙([출력 위생])으로는 못 막는
-- `src/intelligence/` (18) — Confidence Engine — 답변 확신도 0~100 결정론적 산출. Self-Evolving OS 마스터 플랜 Phase 2 / Track 1-1. 신뢰 조건 T4 "확신이 없으면 사람에게 묻는다" 의 측정
-- `src/retrieval/` (18) — Actionability Scoring — 검색 결과를 "현재 작업 상태" 신호로 재가중. 기존 TF-IDF (단어 매칭) + recency (시간) 만으로는 "지금 이 사용자가 하고 있는 작업과 직접 연결 된 문서
+- `src/features/` (126) — 데일리 브리핑 워처 — 평일(월~금) KST 09:30 에 "오늘의 할 일"을 텔레그램으로 발송. 소스: 1. Google Calendar — iCal 캐시 새로고침 후 오늘 일정 (readCalendarEvents
+- `src/lib/` (37) — Astra Mode Architecture Context Builder. 의도: 사용자가 Astra 자체의 mode 디자인 (Guard vs Multi-Agent 가 별도 모드여야 하는지) 을 묻는 메타 질문에 답할
+- `src/agent/` (36) — — 폴더(또는 단일 파일) 강제 정독 조사. listfiles 가 "이름 목록"을 주는 것과 달리, 이 액션은 대상 파일들을 코드가 직접
+- `src/sidebar/` (32) — Brain profile lifecycle 의 pure helpers — sidebarProvider 의 add/edit/delete 흐름에서 modal UI 와 config 쓰기를 제외한 데이터 변환 만 격리. 현
+- `src/retrieval/` (20) — Actionability Scoring — 검색 결과를 "현재 작업 상태" 신호로 재가중. 기존 TF-IDF (단어 매칭) + recency (시간) 만으로는 "지금 이 사용자가 하고 있는 작업과 직접 연결 된 문서
+- `src/intelligence/` (19) — Confidence Engine — 답변 확신도 0~100 결정론적 산출. Self-Evolving OS 마스터 플랜 Phase 2 / Track 1-1. 신뢰 조건 T4 "확신이 없으면 사람에게 묻는다" 의 측정
- `src/core/` (15) — Astra Path Resolver (경로 해결기) Astra의 모든 데이터 파일(.astra 디렉토리)의 경로를 중앙에서 관리합니다. 확장 프로그램의 설치 경로(extensionUri) 기반으로 .astra 디렉토
- `src/extension/` (13) — 두뇌(Second Brain) 기본 위치 부트스트랩 — 첫 실행 온보딩. 문제: 두뇌 미설정 시 config 가 ~/.g1nation-brain(숨김 점폴더)로 조용히 폴백했다. - 폴더가 실제로 생성되지 않고, 설
- `src/memory/` (9) — Distillation Loop — stale Episodic Memory → Long-Term "episode-digest" 승급. 배경: Episodic Memory 가 무한히 누적되면 검색 노이즈. 30일+ 지
+- `src/integrations/` (7) — Per-chat conversation history for the Telegram bot. Why this exists: the previous bot was stateless — every inbound mess
- `src/docs/` (6) — Bug: Edited agent.ts Edited agent.ts Edited agent.ts Edited agent.ts Edited agent.ts ...
-- `src/integrations/` (6) — Per-chat conversation history for the Telegram bot. Why this exists: the previous bot was stateless — every inbound mess
-- `src/lmstudio/` (4) — 4 files (.ts)
+- `src/lmstudio/` (4) — [메모리·기동 개선] SDK 를 타입 전용으로만 import — 값 import 는 번들 로드(=확장 활성화) 시점에 SDK 모듈 초기화를 실행시킨다. 실제 모듈 로드는 getSdk() 첫 호출 때 require 로
**Key files**
-- `src/utils.ts` (485 lines)
-- `src/config.ts` (661 lines)
-- `src/agent.ts` (1677 lines)
+- `src/utils.ts` (538 lines)
+- `src/config.ts` (727 lines)
+- `src/agent.ts` (1979 lines)
+- `src/core/services.ts` (218 lines)
- `src/features/company/types.ts` (446 lines) — Type definitions for the 1인 기업 (One-Person Company) mode. The mode turns the user into a virtual CEO that dispatches work to a roster of specialist agents. Each turn produces a session directory conta
-- `src/core/services.ts` (176 lines)
-- `src/sidebarProvider.ts` (3468 lines)
-- `src/integrations/telegram/telegramClient.ts` (154 lines)
+- `src/sidebarProvider.ts` (2992 lines)
- `src/agent/actions/types.ts` (41 lines)
-- `src/lib/contextManager.ts` (278 lines) — Context Manager (컨텍스트 한계 관리) "context length = 132k" 는 "답변을 132k 토큰까지 생성해도 된다" 가 아닙니다. 시스템 프롬프트 + 대화 기록 + 입력 문서 + 생성될 답변 + 여유분 ≤ context length 이 모듈은 요청을 보내기 전에 입력 토큰을 추정하고, - 동적으로 출력 상한(maxTokens)을 계
-- `src/retrieval/brainIndex.ts` (566 lines) — Brain Index — persistent, mtime-keyed tokenized cache of the Second Brain RAG 검색은 매 질의마다 브레인의 모든 .md 파일을 읽고 토크나이즈해서 TF-IDF 점수를 계산했습니다 — 파일 수가 많아지면 그게 병목입니다. 이 모듈은 /.astra/brain-index.json 에
+- `src/integrations/telegram/telegramClient.ts` (154 lines)
+- `src/lib/contextManager.ts` (296 lines) — Context Manager (컨텍스트 한계 관리) "context length = 132k" 는 "답변을 132k 토큰까지 생성해도 된다" 가 아닙니다. 시스템 프롬프트 + 대화 기록 + 입력 문서 + 생성될 답변 + 여유분 ≤ context length 이 모듈은 요청을 보내기 전에 입력 토큰을 추정하고, - 동적으로 출력 상한(maxTokens)을 계
+- `src/retrieval/brainIndex.ts` (645 lines) — Brain Index — persistent, mtime-keyed tokenized cache of the Second Brain RAG 검색은 매 질의마다 브레인의 모든 .md 파일을 읽고 토크나이즈해서 TF-IDF 점수를 계산했습니다 — 파일 수가 많아지면 그게 병목입니다. 이 모듈은 /.astra/brain-index.json 에
+- `src/features/datacollect/slashRouter.ts` (211 lines)
- `src/retrieval/scoring.ts` (541 lines) — Scoring Engine — TF-IDF + Bilingual Tokenizer 단순 includes() 키워드 매칭을 넘어서, TF-IDF 가중치 기반의 문서 스코어링을 제공합니다. 한국어/영어 양국어 토크나이저를 포함합니다.
- `src/features/company/companyConfig.ts` (896 lines) — State + config plumbing for 1인 기업 모드. Two surfaces: - CompanyState (runtime data: enabled flag, company name, which agents are active, per-agent model overrides). Persisted in VS Code's globalState so
+- `src/features/stocks/types.ts` (61 lines) — Stocks 모듈 공유 타입. investresults/targetstocks.json 스키마를 그대로 받아서, ConnectAI 의 /.astra/stocks.json 으로 옮긴 뒤 같은 필드명을 유지. 한글 필드명은 사용자의 도메인 데이터라 변경하지 않는다 — 마이그레이션 충돌 회피 + 사용자가 직접 JSON 편집할 때 frictio
- `src/lib/paths.ts` (151 lines)
- `src/skills/agentKnowledgeMap.ts` (374 lines)
-- `src/features/datacollect/slashRouter.ts` (201 lines)
- `src/retrieval/types.ts` (66 lines) — Retrieval Types (검색 결과 통합 타입) 모든 검색 소스(Brain, Memory, Project, Episode)의 결과를 통합 인터페이스로 정의합니다.
-- `src/intelligence/requirementGraph.ts` (273 lines) — Requirement Graph — 업무 유형별 필수 요소 정의 + 감지 + 커버리지 검사. Self-Evolving Digital Employee OS 마스터 플랜(docs/SELFEVOLVINGOSMASTERPLAN.md) Phase 1 / Track 2-1. 신뢰 조건 T3 "품질이 일관적이다 — 필수 요소 누락 없음" 담당. 동작 2단계: 1. In
+- `src/intelligence/requirementGraph.ts` (312 lines) — Requirement Graph — 업무 유형별 필수 요소 정의 + 감지 + 커버리지 검사. Self-Evolving Digital Employee OS 마스터 플랜(docs/SELFEVOLVINGOSMASTERPLAN.md) Phase 1 / Track 2-1. 신뢰 조건 T3 "품질이 일관적이다 — 필수 요소 누락 없음" 담당. 동작 2단계: 1. In
+- `src/security.ts` (159 lines)
- `src/lib/contextBuilders/promptDetection.ts` (107 lines) — 사용자 prompt 의 의도 분류 류 detection helpers. 모두 stateless 정규식 매칭. 옛 코드는 agent.ts 의 private 메서드로 박혀 있었는데, system prompt 빌더 (buildJarvisProjectBriefContext 등) 가 이걸 의존하면서 god-file 안에서 서로 얽힘. 헬퍼만 먼저 떼면 의존 그래프가
- `src/memory/types.ts` (151 lines) — Memory Type Definitions (메모리 타입 정의) Astra의 5-Layer Cognitive Memory System의 모든 타입을 정의합니다. ① Short-Term ② Long-Term ③ Project ④ Procedural ⑤ Episodic
-- `src/features/stocks/types.ts` (53 lines) — Stocks 모듈 공유 타입. investresults/targetstocks.json 스키마를 그대로 받아서, ConnectAI 의 /.astra/stocks.json 으로 옮긴 뒤 같은 필드명을 유지. 한글 필드명은 사용자의 도메인 데이터라 변경하지 않는다 — 마이그레이션 충돌 회피 + 사용자가 직접 JSON 편집할 때 frictio
-- `src/retrieval/lessonHelpers.ts` (325 lines) — Lesson / Experience Memory — pure helpers (no vscode dependency) "Lesson" = a markdown file in the active brain that captures a past mistake/risk and how to avoid repeating it. Identified by a lessons
-- `src/intelligence/confidenceEngine.ts` (165 lines) — Confidence Engine — 답변 확신도 0~100 결정론적 산출. Self-Evolving OS 마스터 플랜 Phase 2 / Track 1-1. 신뢰 조건 T4 "확신이 없으면 사람에게 묻는다" 의 측정 기반 — Escalation Engine 의 입력. 설계 원칙 (termValidator 와 동일): LLM 호출 없음. 검색 그라운딩 신호(턴
-- `src/intelligence/reflectionStore.ts` (162 lines) — Reflection Store — 업무 turn 회고 기록 + Failure Pattern 집계. Self-Evolving OS 마스터 플랜 Phase 1 / Track 2-4 (Reflection Engine v1) + Phase 3 / Track 3-6 (Failure Pattern DB v1 시드). 신뢰 조건 T5 "같은 실수를 반복하지 않는다" 의
- `src/extension/telegramCommands.ts` (103 lines)
-- `src/security.ts` (159 lines)
+- `src/lib/execUtil.ts` (104 lines)
+- `src/retrieval/lessonHelpers.ts` (325 lines) — Lesson / Experience Memory — pure helpers (no vscode dependency) "Lesson" = a markdown file in the active brain that captures a past mistake/risk and how to avoid repeating it. Identified by a lessons
+- `src/features/calendar/calendarCache.ts` (271 lines) — Google Calendar (iCal) 캐시 — fetch + parse + 회사 shared/calendarcache.md 에 저장. Connectorigin 의 googlecalendar.py 를 TypeScript / native fetch 로 옮김. OAuth 없음. 사용자가 Google Calendar 설정 → "비공개 주소(iCal 형식)" 복
-### `media/` — 6 files, ~7,836 lines
+### `media/` — 6 files, ~7,582 lines
**Key files**
-- `media/sidebar.css` (2132 lines) — Stylesheet
-- `media/sidebar.js` (3966 lines)
-- `media/sidebar.html` (539 lines) — Astra
-- `media/settings-panel.html` (440 lines) — Astra Settings
-- `media/settings-panel.js` (505 lines)
+- `media/sidebar.css` (1957 lines) — Stylesheet
+- `media/sidebar.js` (3767 lines)
+- `media/settings-panel.html` (541 lines) — Astra Settings
+- `media/sidebar.html` (486 lines) — Astra
+- `media/settings-panel.js` (577 lines)
- `media/settings-panel.css` (254 lines) — Stylesheet
-### `tests/` — 58 files, ~8,276 lines
+### `tests/` — 86 files, ~11,085 lines
*Depends on*: `src/`
**Sub-directories**
@@ -132,29 +132,29 @@ flowchart LR
**Key files**
- `tests/helpers/mockLLMClient.ts` (112 lines) — MockLLMClient — IAIService 의 Mock 구현체. 의도: 회사 모드 dispatcher / ChunkedWriter / ceoPlanner 등 LLM 을 호출하는 코드 경로를 CI 환경에서도 테스트 가능하게. 실제 Ollama / LM Studio 없이도 응답을 미리 정의하거나 동적으로 생성 가능. 사용 예: const ai = new
- `tests/agentEngine.test.ts` (413 lines) — AgentEngine Tests — Chunked Writer Architecture 예전 buildup(planner → researcher → reflector → writer → synthesizer)을 단일 ChunkedWriter 의 outline → section[N] → polish 로 교체한 뒤의 회귀 테스트. 다루는 범위: 1. ErrorC
-- `tests/lmStudioLifecycle.test.ts` (330 lines) — Unit tests for ModelLifecycleManager. Strategy: inject mock ILMStudioClient and a simple in-memory IActivityTracker. No real LM Studio or SDK is touched — the manager file does not import the SDK dire
+- `tests/lmStudioLifecycle.test.ts` (334 lines) — Unit tests for ModelLifecycleManager. Strategy: inject mock ILMStudioClient and a simple in-memory IActivityTracker. No real LM Studio or SDK is touched — the manager file does not import the SDK dire
- `tests/localPathPreflight.test.ts` (520 lines)
- `tests/telegramBot.test.ts` (363 lines) — Unit tests for TelegramBot + truncateForTelegram. Strategy: - TelegramBot is driven by an injected ITelegramClient stub. We script getUpdates to return queued batches and assert that: - the offset cur
- `tests/criticReflectionEval.test.ts` (200 lines) — Critic Agent / Reflection Store / Task Eval Harness (Self-Evolving OS P1 잔여 + P3) 테스트.
-- `tests/lmStudioStreamer.test.ts` (222 lines) — Unit tests for LMStudioStreamer. Strategy: inject a fake ILMStudioClient that returns a fake model handle whose respond() yields a controllable async iterable. No real SDK or WebSocket touched.
+- `tests/emailCommand.test.ts` (282 lines) — v2.2.269 — /email (Gmail + Outlook) 순수 로직 테스트. COM/네트워크는 통합 영역이라 제외 — 참조 파싱·프롬프트·트랜스크립트 컷만 고정.
+- `tests/lmStudioStreamer.test.ts` (295 lines) — Unit tests for LMStudioStreamer. Strategy: inject a fake ILMStudioClient that returns a fake model handle whose respond() yields a controllable async iterable. No real SDK or WebSocket touched.
+- `tests/meetRegistration.test.ts` (232 lines) — /meet 확신 게이트 — 분류·confirm 파싱·날짜 정규화 테스트. 정책: 확정+기한만 자동, 진행미정/기한미정/조건부는 보류, 반복은 첫 1회, 과거 날짜는 등록하되 완료확인 표기, 기한 해석 불가 확정건은 보류(추측 등록 금지).
- `tests/secondBrainTrace.test.ts` (407 lines)
- `tests/approvalQueue.test.ts` (164 lines) — Unit tests for ApprovalQueue. Strategy: drive enqueue → approve / reject / clear / pre-empt directly, confirm the onChange event fires at the right moments and callbacks fire exactly once.
+- `tests/compositeScore.test.ts` (131 lines) — 멀티팩터 합성점수 (v2.2.266) — 백분위 랭크·축 합성·value trap 가드·결측 처리.
+- `tests/computeBudgetedRequest.test.ts` (147 lines) — Phase 1 — context-window alignment. The budgeter must clamp to the model's ACTUALLY-loaded window when it's smaller than the user's contextLength setting, so a model loaded with a smaller window than
- `tests/confidenceEngine.test.ts` (175 lines) — Confidence Engine + Escalation Engine (Self-Evolving OS Phase 2) 단위 테스트. 순수 함수만 검증 — vscode 의존 없음.
- `tests/correctionLoop.test.ts` (158 lines) — Correction Loop 단위 테스트 — 순수 로직 (감지·프로필·레슨·큐 등록·영속화). LLM 의존 부분(classifyCorrection)은 엔드포인트 실패 → 휴리스틱 fallback 경로만 검증.
+- `tests/emailState.test.ts` (121 lines) — v2.2.271 — 이메일 영속 상태 머신 (syncThreads / detectOverdue / setThreadState). "명령 안 쳐도 f/u 되는" 핵심 로직: 창 밖 미회신 보존, done 자동 재개, 알림 중복 차단.
+- `tests/investigationPipeline.test.ts` (193 lines) — Investigation Pipeline — 파일명만 보고 상상하는 헛조사 차단 3중 방어. (v2.2.309) ① 조사형 요청 감지 + 증거 게이트 ② 강제 정독 Map + 해시 캐시 ③ Hollow 감지
- `tests/knowledgeOps.test.ts` (174 lines) — Knowledge Validation / Belief Revision / Decay / Debt (Self-Evolving OS Phase 4 — 지식 운영) 테스트.
-- `tests/meetRegistration.test.ts` (110 lines) — /meet 확신 게이트 — 분류·confirm 파싱·날짜 정규화 테스트. 정책: 확정+기한만 자동, 진행미정/기한미정/조건부는 보류, 반복은 첫 1회, 과거 날짜는 등록하되 완료확인 표기, 기한 해석 불가 확정건은 보류(추측 등록 금지).
+- `tests/largeInputMapReduce.test.ts` (159 lines) — Phase 2 — large-input map-reduce core. Pure orchestration with an injected callLLM, so no network / SDK is touched.
- `tests/needEngineQueue.test.ts` (159 lines) — Gap Detector / Need Engine / Knowledge Inventory / Learning Queue (Self-Evolving OS Phase 3 — 성장 루프 코어) 테스트.
- `tests/projectScaffolder.test.ts` (135 lines) — Unit tests for FileSystemProjectScaffolder. Drives against a real temp directory so end-to-end file IO + path-traversal defenses are exercised.
-- `tests/requirementGraph.test.ts` (126 lines) — Requirement Graph (Self-Evolving OS Phase 1 / Track 2-1) 단위 테스트. 순수 함수만 검증 — vscode 의존 없음.
+- `tests/requirementGraph.test.ts` (146 lines) — Requirement Graph (Self-Evolving OS Phase 1 / Track 2-1) 단위 테스트. 순수 함수만 검증 — vscode 의존 없음.
- `tests/researchSkill.test.ts` (122 lines) — Research Agent / Skill Score / Success Pattern DB (Self-Evolving OS Phase 6) 테스트.
- `tests/resilience_stress.test.ts` (197 lines) — Resilience & Boundary Stress Test Suite (v2.77.3) 이 테스트는 ConnectAI 엔진이 극한의 환경(인증 실패, 네트워크 차단, 타임아웃 등)에서 얼마나 안정적으로 복구되고, 신뢰성 지표(Resilience Metrics)를 정확히 기록하는지 검증합니다.
- `tests/retrievalEvalEmbedding.test.ts` (106 lines) — 하이브리드(sparse+dense) 검색 측정 — 청크 TF-IDF vs 청크+임베딩 (alpha sweep). 평소 테스트 런에서는 skip (실제 두뇌 + 로컬 임베딩 서버 필요). 수동 실행: ASTRAEVALBRAIN="E:/Wiki/2nd/10Wiki/Topics" \ ASTRAEVALEMBEDMODEL="text-embedding-nomic-em
-- `tests/skillInjectionService.test.ts` (172 lines) — Unit tests for FileSystemSkillInjectionService. Strategy: drive the service against a real temp directory so path-traversal defenses and writeFileSync paths are exercised end-to-end. The service accep
-- `tests/sleepDigest.test.ts` (101 lines) — Sleep-time 사전 소화 — 순수 로직 테스트 (대상 선정·노후화 판정·노트 형식). LLM 호출(runSleepDigestOnce)은 제외 — 통합 검증은 수동 명령으로.
-- `tests/stocksCriteria.test.ts` (129 lines) — criteriaEval — /stocks judge 결정론 평가기 테스트. 픽스처는 옛 LLM 프롬프트에 명시돼 있던 사용자의 실제 분류 예시 3종 (마녀공장/기가비스/엔켐) — 코드 판정이 사용자 패턴과 일치해야 한다.
-- `tests/alignmentResearch.test.ts` (208 lines)
-- `tests/conflictCheck.test.ts` (65 lines) — Schedule Conflict Check (Self-Evolving OS Track 6-2/6-3) 테스트.
-- `tests/dataProcessor.test.ts` (87 lines) — /
### `core_py/` — 6 files, ~409 lines
@@ -166,16 +166,16 @@ flowchart LR
- `core_py/optimizer.py` (55 lines)
- `core_py/queue_worker.py` (82 lines)
-### `docs/` — 173 files, ~5,829 lines
+### `docs/` — 177 files, ~5,946 lines
**Sub-directories**
-- `docs/records/` (157) — Bug: /Volumes/Data/project/Antigravity/ConnectAI 프로젝트 코드 리뷰 해줄 수 있어? 개선할 부분이 있는지, 그러고...
+- `docs/records/` (160) — Bug: /Volumes/Data/project/Antigravity/ConnectAI 프로젝트 코드 리뷰 해줄 수 있어? 개선할 부분이 있는지, 그러고...
- `docs/docs/` (5) — Bug: Viewed integrationretrieval.test.ts:1-59 integrationretrieval.test.ts를 통해 ...
- `docs/plans/` (2) — Alignment Self-Learning 개선 계획 (v2 — 적대적 리뷰 반영)
- `docs/Meeting/` (0)
**Key files**
-- `docs/records/ConnectAI/timeline.md` (422 lines) — Project Timeline
+- `docs/records/ConnectAI/timeline.md` (431 lines) — Project Timeline
- `docs/TELEGRAM_REMOTE_EXECUTION_PLAN.md` (452 lines) — Telegram Remote Execution 기획서
- `docs/AgentEngine_Architecture.md` (314 lines) — AgentEngine Architecture Document
- `docs/SELF_EVOLVING_OS_MASTER_PLAN.md` (275 lines) — ASTRA Self-Evolving Digital Employee OS — 마스터 개발 계획 v1.1
@@ -209,6 +209,7 @@ flowchart LR
- `g1nation.eval.retrieval` — Astra: 검색 평가 실행 (recall@k / MRR)
- `g1nation.eval.tasks` — Astra: 업무 평가 실행 (회의록 골든셋)
- `g1nation.growth.report` — Astra: 성장 리포트 (Reflection 추이)
+ - `g1nation.growth.standingRules` — Astra: 상시 행동 규칙 (Standing Rules)
- `g1nation.growth.learningQueue` — Astra: 학습 큐 갱신 (Need Engine)
- `g1nation.knowledge.decayAudit` — Astra: 지식 노후 점검 (Knowledge Decay)
- `g1nation.research.runQueue` — Astra: 학습 실행 (Research Agent — 승인된 큐 항목)
@@ -239,17 +240,21 @@ flowchart LR
- `g1nation.company.toggle` — Astra: Toggle 1인 기업 Mode
- `g1nation.company.manage` — Astra: Manage 1인 기업 Agents
- `g1nation.company.openSessions` — Astra: Open 1인 기업 Sessions Folder
- - `g1nation.company.pixelOffice.open` — Astra: Open Pixel Office (Full Screen)
- `g1nation.calendar.connect` — Astra: Google Calendar (iCal) 연결 📅
- `g1nation.calendar.refresh` — Astra: Google Calendar 새로고침 📅
- `g1nation.calendar.connectOAuth` — Astra: Google Calendar OAuth 연결 (쓰기) 🔐
- `g1nation.devilAgent.toggle` — Astra: Toggle Devil Agent 🎭
-- **Configuration** (149 settings):
+- **Configuration** (183 settings):
- `g1nation.multiAgentEnabled` *(boolean)* _(default: `false`)_ — Enable Multi-Agent Workflow (Planner -> Researcher -> Writer) for complex tasks.
- - `g1nation.datacollectBridgeTarget` *(string)* _(default: `"local"`)_
- - `g1nation.datacollectBridgeUrl` *(string)* _(default: `"http://127.0.0.1:3002"`)_ — [local 타깃] Wiki/Datacollect MCP Bridge URL. /benchmark, /youtube, /wikify chat slash commands route here. The Bridge must be running (`npm run bridge` in the Datacollect project).
- - `g1nation.datacollectBridgeNasUrl` *(string)* _(default: `""`)_
+ - `g1nation.datacollectBridgeTarget` *(string)* _(default: `"nas"`)_
+ - `g1nation.datacollectBridgeUrl` *(string)* _(default: `"http://127.0.0.1:3002"`)_ — [local 타깃] Wiki/Datacollect MCP Bridge URL. /benchmark, /youtube, /wikify chat slash commands route here. The Bridge must be running (`npm run bridge` in the Datacollect project). 백엔드를 NAS로 옮긴 경우 보통 사
+ - `g1nation.datacollectBridgeNasUrl` *(string)* _(default: `"https://dc.koritips.com"`)_
- `g1nation.datacollectBridgeNasToken` *(string)* _(default: `""`)_
+ - `g1nation.domainKnowledge.generalFolder` *(string)* _(default: `""`)_
+ - `g1nation.domainKnowledge.mathFolder` *(string)* _(default: `""`)_
+ - `g1nation.domainKnowledge.codingFolder` *(string)* _(default: `""`)_
+ - `g1nation.domainKnowledge.factsFolder` *(string)* _(default: `""`)_
+ - `g1nation.datacollectLocalProjectPath` *(string)* _(default: `""`)_
- `g1nation.datacollectSavePath` *(string)* _(default: `""`)_
- `g1nation.datacollectCrawlDepth` *(number)* _(default: `1`)_
- `g1nation.datacollectMaxPages` *(number)* _(default: `8`)_
@@ -257,7 +262,24 @@ flowchart LR
- `g1nation.chatTemperature` *(number)* _(default: `0.3`)_
- `g1nation.meetUsesTasks` *(boolean)* _(default: `true`)_
- `g1nation.meetUsesCalendar` *(boolean)* _(default: `false`)_
- - `g1nation.meetVerifyPass` *(boolean)* _(default: `false`)_
+ - `g1nation.meetVerifyPass` *(boolean)* _(default: `true`)_
+ - `g1nation.meetVerifyMaxRounds` *(number)* _(default: `2`)_
+ - `g1nation.meetEditorPass` *(boolean)* _(default: `true`)_
+ - `g1nation.meetTaskDateFallback` *(string)* _(default: `"today"`)_
+ - `g1nation.meetTaskDetailExpand` *(boolean)* _(default: `true`)_
+ - `g1nation.meetTeamRoster` *(string)* _(default: `""`)_
+ - `g1nation.meetMaxOutputTokens` *(number)* _(default: `8000`)_
+ - `g1nation.email.watcherEnabled` *(boolean)* _(default: `true`)_
+ - `g1nation.email.watchIntervalMinutes` *(number)* _(default: `60`)_
+ - `g1nation.email.overdueAlertHours` *(number)* _(default: `0`)_
+ - `g1nation.email.outlookEnabled` *(boolean)* _(default: `true`)_
+ - `g1nation.email.gmailEnabled` *(boolean)* _(default: `true`)_
+ - `g1nation.email.includeSubfolders` *(boolean)* _(default: `true`)_
+ - `g1nation.email.wikifySavePath` *(string)* _(default: `""`)_
+ - `g1nation.email.syncDays` *(number)* _(default: `7`)_
+ - `g1nation.messenger.stocksReportTimes` *(string)* _(default: `"09:00,15:00"`)_
+ - `g1nation.messenger.buySignalAlert` *(boolean)* _(default: `true`)_
+ - `g1nation.messenger.discoverTopFive` *(boolean)* _(default: `true`)_
- `g1nation.dailyBriefing.enabled` *(boolean)* _(default: `true`)_
- `g1nation.dailyBriefing.time` *(string)* _(default: `"09:30"`)_
- `g1nation.sleepDigest.enabled` *(boolean)* _(default: `true`)_
@@ -280,32 +302,10 @@ flowchart LR
- `g1nation.contextOverflowPolicy` *(string)* _(default: `"stopAtLimit"`)_ — Fallback behavior (LM Studio) if the prompt still exceeds the context window after Astra's own budgeting. 'stopAtLimit' fails clearly so you notice; 'truncateMiddle'/'rollingWindow' drop content silen
- `g1nation.autoCompactHistory` *(boolean)* _(default: `true`)_ — Automatically drop the oldest conversation messages from the request when the prompt would exceed the context budget (the on-screen chat history is unaffected). Default: true
- `g1nation.smallModelContextCap` *(number)* _(default: `0`)_ — Optional safety knob, OFF by default (0). Some very small models (≤3B) emit an empty/EOS response when given a prompt near their context window even though it nominally fits. If you observe that with
- - `g1nation.autoContinueOnOutputLimit` *(boolean)* _(default: `true`)_ — When a reply is cut off because it hit the output-token limit, Astra continues it internally (compressed request — original question + the answer so far, not the whole context again) and shows one mer
- - `g1nation.maxAutoContinuations` *(number)* _(default: `4`)_ — Maximum number of automatic continuation rounds per reply (prevents runaway loops). Raise it (e.g. 5–6) for long-form answers on slow local models; set 0 to disable auto-continuation. Default: 4
- - `g1nation.finalOnlyRetryOnThoughtLeak` *(boolean)* _(default: `true`)_ — If the model emits only hidden reasoning (, <|channel|>thought, "Thinking Process:" …) and no user-visible answer, Astra silently re-asks it for the final answer only. Hidden reasoning is never
- - `g1nation.lmStudio.idleTimeoutMs` *(number)* _(default: `300000`)_ — Auto-eject the loaded LM Studio model after this many milliseconds of inactivity. Set to 0 to disable. Default: 300000 (5 minutes).
- - `g1nation.lmStudio.autoLoadOnSelect` *(boolean)* _(default: `true`)_ — Automatically load LM Studio models into memory when selected from the Astra sidebar.
- - `g1nation.lmStudio.sampling.topP` *(number)* _(default: `0.9`)_ — Nucleus sampling cutoff. Small / quantized models often spew wrong-neighbour tokens (한글 깨짐: 붕괴→붕점) when the tail is wide. Lower (0.8–0.9) tightens; 1.0 disables. Applied to both SDK and REST paths.
- - `g1nation.lmStudio.sampling.topK` *(number)* _(default: `20`)_ — Top-K sampling cutoff. 0 disables. Default 20 — tighter for small models, raise to 40–80 for large models that already sample well.
- - `g1nation.lmStudio.sampling.minP` *(number)* _(default: `0.05`)_ — Min-P floor — discards tokens with probability below this fraction of the top token. Good defence against rare-token glitches. 0 disables.
- - `g1nation.lmStudio.sampling.repeatPenalty` *(number)* _(default: `1.1`)_ — Repeat / frequency penalty to curb stutter (것입니다서입니다…). 1.0 disables. Values 1.05–1.2 are typical.
- - `g1nation.lmStudio.statsInBudget` *(boolean)* _(default: `true`)_ — Show token/s and time-to-first-token from LM Studio prediction stats in the context-budget badge after each turn (SDK path only).
- - `g1nation.lmStudio.draftModel` *(string)* _(default: `""`)_ — [Speculative decoding] LM Studio model key of a small draft model (e.g. 'gemma-2b-it') used to accelerate the main model. Empty disables. 1.5–3x throughput on large models. The draft must be downloade
- - `g1nation.lmStudio.load.flashAttention` *(boolean)* _(default: `true`)_ — [Load option] Enable Flash Attention when loading models. Faster generation + lower memory on compatible hardware, especially helpful for long contexts. Default: true.
- - `g1nation.lmStudio.load.gpuOffloadRatio` *(string)* _(default: `"max"`)_ — [Load option] How much of the model to offload to GPU. 'max' = all (default), 'off' = CPU only, or a number 0–1 (e.g. '0.5' = half). Numeric strings are parsed.
- - `g1nation.lmStudio.load.offloadKVCacheToGpu` *(boolean)* _(default: `true`)_ — [Load option] Keep KV cache on GPU memory. Faster but requires VRAM headroom. Default: true.
- - `g1nation.lmStudio.load.keepModelInMemory` *(boolean)* _(default: `true`)_ — [Load option] Prevent the model from being swapped out of system memory. Improves interactive responsiveness; raises RAM use. Default: true.
- - `g1nation.lmStudio.load.useFp16ForKVCache` *(boolean)* _(default: `false`)_ — [Load option] Store KV cache in FP16 (halves cache memory). Tiny quality impact for most models — try if you run out of VRAM at long contexts. Default: false.
- - `g1nation.lmStudio.load.evalBatchSize` *(number)* _(default: `0`)_ — [Load option] Token batch size during evaluation. 0 = engine default. Higher (512–1024) improves prefill speed on GPU at the cost of memory.
- - `g1nation.localBrainPath` *(string)* _(default: `""`)_ — Folder path for your local Second Brain knowledge base. Leave empty to use the default folder.
- - `g1nation.brainProfiles` *(array)* _(default: `[]`)_ — Multiple brain profiles. Each item supports id, name, localBrainPath, secondBrainRepo, and description.
- - `g1nation.activeBrainId` *(string)* _(default: `""`)_ — Active brain profile id used for the current chat context.
- - `g1nation.secondBrainRepo` *(string)* _(default: `""`)_ — Optional GitHub repository URL used for Second Brain sync.
- - `g1nation.autoPushBrain` *(boolean)* _(default: `false`)_ — Automatically commit and push Second Brain changes after updates.
- - `g1nation.maxContextSize` *(number)* _(default: `32000`)_ — Maximum character count for active file context. Default: 32000
- - `g1nation.maxAutoSteps` *(number)* _(default: `50`)_ — Maximum autonomous steps the agent can take per request. Default: 50
- - `g1nation.dryRun` *(boolean)* _(default: `false`)_ — If enabled, the agent will ask for approval before committing any file changes.
- - _…and 89 more_
+ - `g1nation.largeInputMapReduce` *(boolean)* _(default: `true`)_ — When a single message is too large to fit the model's context window, split it into chunks, extract only the request-relevant facts from each (no hallucination/summary), integrate them, and answer fro
+ - `g1nation.mapReduceTriggerRatio` *(number)* _(default: `0.6`)_ — Map-reduce kicks in when a single message exceeds (effective context window × this ratio). Lower = engages sooner (safer for big inputs, more LLM calls). Default: 0.6
+ - `g1nation.mapReduceConcurrency` *(number)* _(default: `2`)_ — How many chunk extractions run in parallel. Keep low on a single local GPU (one model serves them sequentially anyway). Default: 2
+ - _…and 123 more_
## Dependencies
- **Runtime** (2): `@lmstudio/sdk`, `pdf-parse`
@@ -353,7 +353,7 @@ Astra는 대표님의 명시적인 승인 하에 로컬 시스템의 강력한
**Designed for High-Performance Decision Making.**
Copyright (C) **g1nation**. All rights reserved.
-_Last auto-scan: 2026-06-15T02:56:35.947Z · signature `c66695ef`_
+_Last auto-scan: 2026-07-20T04:20:03.384Z · signature `ff87bb88`_
## Purpose
diff --git a/.astra/project-context/scan-cache.json b/.astra/project-context/scan-cache.json
index 49bcb99..fd7eb54 100644
--- a/.astra/project-context/scan-cache.json
+++ b/.astra/project-context/scan-cache.json
@@ -1,6 +1,6 @@
{
"version": 1,
- "generatedAt": "2026-06-15T02:56:36.042Z",
+ "generatedAt": "2026-07-20T04:20:03.483Z",
"files": {
"src/agent/actions/brainOps.ts": {
"mtimeMs": 1779764602582.9768,
@@ -13,6 +13,16 @@
"src/config"
]
},
+ "src/agent/actions/calculate.ts": {
+ "mtimeMs": 1783907905554.433,
+ "size": 5266,
+ "lines": 91,
+ "role": "",
+ "imports": [
+ "src/lib/execUtil",
+ "src/agent/actions/types"
+ ]
+ },
"src/agent/actions/calendar.ts": {
"mtimeMs": 1781152132419.819,
"size": 3755,
@@ -47,6 +57,20 @@
"src/agent/actions/types"
]
},
+ "src/agent/actions/investigateFiles.ts": {
+ "mtimeMs": 1784004638469.9524,
+ "size": 3131,
+ "lines": 53,
+ "role": " — 폴더(또는 단일 파일) 강제 정독 조사. listfiles 가 \"이름 목록\"을 주는 것과 달리, 이 액션은 대상 파일들을 코드가 직접 읽어 파일별 추출 노트(Map)를 만들고 병합 노트를 컨텍스트에 주입한다 — 모델이 파일명만 보고 내용을 상상하는 헛조사(할루시네이션)를 구조적",
+ "imports": [
+ "src/agent/actions/types",
+ "src/security",
+ "src/config",
+ "src/intelligence/llmCall",
+ "src/intelligence/investigationPipeline",
+ "src/utils"
+ ]
+ },
"src/agent/actions/listFiles.ts": {
"mtimeMs": 1779764602584.9866,
"size": 1501,
@@ -58,6 +82,17 @@
"src/config"
]
},
+ "src/agent/actions/runCode.ts": {
+ "mtimeMs": 1783907905562.3325,
+ "size": 5771,
+ "lines": 105,
+ "role": "",
+ "imports": [
+ "src/security",
+ "src/lib/execUtil",
+ "src/agent/actions/types"
+ ]
+ },
"src/agent/actions/runCommand.ts": {
"mtimeMs": 1779764602585.998,
"size": 945,
@@ -79,6 +114,13 @@
"src/features/sheets"
]
},
+ "src/agent/actions/stripForDisplay.ts": {
+ "mtimeMs": 1784517921694.1846,
+ "size": 1434,
+ "lines": 31,
+ "role": "[v2.2.312] 화면 표시용 액션 태그 제거. 액션 루프의 중간 라운드(액션과 함께 본문 섹션을 쓴 라운드)를 사용자 버블에 표시할 때, 같은 실행 태그 원문이 그대로 노출되지 않도록 걷어낸다. 실행 자체는 이 함수와 무관 — executeActions 는 원문(cleanedVisible)을 그대로 받는다. 여기는 표시 전용 경로다",
+ "imports": []
+ },
"src/agent/actions/tasks.ts": {
"mtimeMs": 1779764602586.8142,
"size": 3658,
@@ -147,11 +189,12 @@
]
},
"src/agent/handlePrompt/buildAstraModeSystemPrompt.ts": {
- "mtimeMs": 1781491584053.9885,
- "size": 7145,
- "lines": 108,
+ "mtimeMs": 1783907905571.8806,
+ "size": 7249,
+ "lines": 109,
"role": "",
"imports": [
+ "src/lib/contextBuilders/toneGuard",
"src/lib/contextBuilders/localProjectIntent",
"src/lib/contextBuilders/promptDetection",
"src/lib/contextBuilders/selfIdentity",
@@ -189,9 +232,9 @@
]
},
"src/agent/handlePrompt/computeBudgetedRequest.ts": {
- "mtimeMs": 1779764602591.863,
- "size": 8252,
- "lines": 161,
+ "mtimeMs": 1784510427342.1648,
+ "size": 12515,
+ "lines": 234,
"role": "",
"imports": [
"src/utils",
@@ -200,6 +243,16 @@
"src/lib/contextBuilders/droppedHistorySummary"
]
},
+ "src/agent/handlePrompt/largeInputMapReduce.ts": {
+ "mtimeMs": 1781858803423.0098,
+ "size": 11829,
+ "lines": 265,
+ "role": "Large-Input Map-Reduce (큰 입력 청킹 + 통합) 한 번에 컨텍스트 창에 안 들어가는 단일 사용자 입력(긴 회의록·리서치 덤프 등)을 1) 청크로 분할(Map 대상) 2) 각 청크에서 \"요청과 관련된 사실만\" 발췌 (질의 인지형 추출 — 일반 요약 X) 3) 발췌들을 통합(Reduce). 합본이 또 창을 넘으면 계층적으로 재통합. 한 뒤,",
+ "imports": [
+ "src/agent",
+ "src/retrieval/chunker"
+ ]
+ },
"src/agent/handlePrompt/processFinalAnswer.ts": {
"mtimeMs": 1779764602591.863,
"size": 6606,
@@ -268,11 +321,12 @@
]
},
"src/agent/llm/streamChatOnce.ts": {
- "mtimeMs": 1779764602594.8728,
- "size": 5970,
- "lines": 136,
+ "mtimeMs": 1784019786242.6387,
+ "size": 6720,
+ "lines": 146,
"role": "",
"imports": [
+ "src/lib/contextBuilders/liveReasoningFilter",
"src/utils",
"src/lib/contextBuilders/lmStudioSampling",
"src/agent"
@@ -304,9 +358,9 @@
]
},
"src/agent/multiAgent/workflow.ts": {
- "mtimeMs": 1779764602595.8782,
- "size": 5650,
- "lines": 117,
+ "mtimeMs": 1783907905586.464,
+ "size": 8395,
+ "lines": 154,
"role": "",
"imports": [
"src/utils",
@@ -315,13 +369,14 @@
"src/core/errorHandler",
"src/core/statusBar",
"src/core/responseRecovery",
+ "src/agents/reportQa",
"src/agent"
]
},
"src/agent/postAnswerHooks/index.ts": {
- "mtimeMs": 1781491584054.991,
- "size": 13909,
- "lines": 276,
+ "mtimeMs": 1784018763039.2166,
+ "size": 15166,
+ "lines": 295,
"role": "Post-answer hook registry — 답변 완료 후 실행되는 부가 작업 모음. 새 hook 추가 = 1 객체 push. agent.ts 는 이 배열을 iterate 만 함. 현재 등록 순서 (v2.2.197): 1. devilRebuttal — Devil Agent 반박 카드 (비활성 시 silent skip) 2. postHocSelfChec",
"imports": [
"src/agent/postAnswerHooks/types",
@@ -337,24 +392,28 @@
"src/intelligence/skillScore",
"src/config",
"src/extension/featureConceptMap",
- "src/lib/contextBuilders/selfAssessContext"
+ "src/lib/contextBuilders/selfAssessContext",
+ "src/intelligence/investigationPipeline",
+ "src/utils"
]
},
"src/agent/postAnswerHooks/types.ts": {
- "mtimeMs": 1781144501440.8574,
- "size": 2345,
- "lines": 52,
+ "mtimeMs": 1784018668837.2432,
+ "size": 2528,
+ "lines": 54,
"role": "Post-Answer Hook 인터페이스 — 답변 streaming 완료 후 실행되는 부가 작업. 옛 구조: agent.ts 의 maybeEmitDevilRebuttal, maybePostHocSelfCheck, maybeRunTermValidator 3개 private method. 새 hook 추가 시 (1) method 정의 (2) import (3)",
"imports": [
"src/intelligence/confidenceEngine"
]
},
"src/agent/postHocSelfCheck.ts": {
- "mtimeMs": 1780033021215.5054,
- "size": 8943,
- "lines": 230,
+ "mtimeMs": 1783907905606.2039,
+ "size": 8120,
+ "lines": 203,
"role": "Post-hoc Self-Check — 답변 완료 후 LLM 한 번 호출로 3가지 평가. 사용자 제안: \"[Self-Check] 단계 — 이 답변이 사용자 질문에 직접 답하는가 / 규칙 준수 / 논리 모순 없는가\". 기존 CoVe (v2.2.184) 와 차이: - CoVe = 답변 작성 전 모델에게 self-verify 지시 (instructional, 1",
- "imports": []
+ "imports": [
+ "src/core/services"
+ ]
},
"src/agent/sessions/compressSummary.ts": {
"mtimeMs": 1779764602596.8809,
@@ -377,9 +436,9 @@
]
},
"src/agent.ts": {
- "mtimeMs": 1781491584034.31,
- "size": 93139,
- "lines": 1677,
+ "mtimeMs": 1784517985649.1714,
+ "size": 113583,
+ "lines": 1979,
"role": "",
"imports": [
"src/utils",
@@ -395,6 +454,7 @@
"src/lib/contextBuilders/urlContext",
"src/features/web/webFetch",
"src/intelligence/correctionLoop",
+ "src/intelligence/investigationPipeline",
"src/lib/contextBuilders/multiAgentRouting",
"src/lib/contextBuilders/thinkingPartnerContract",
"src/lib/contextBuilders/droppedHistorySummary",
@@ -404,6 +464,7 @@
"src/lib/contextBuilders/promptDetection",
"src/lib/contextBuilders/systemPromptShaping",
"src/lib/contextBuilders/outputSanitization",
+ "src/lib/contextBuilders/liveReasoningFilter",
"src/lib/contextBuilders/engineMessages",
"src/lib/contextBuilders/memoryContext",
"src/lib/contextBuilders/projectEvidence",
@@ -424,6 +485,7 @@
"src/features/secondBrainTrace",
"src/memory",
"src/retrieval",
+ "src/retrieval/embeddings",
"src/retrieval/lessonHelpers",
"src/retrieval/knowledgeMix",
"src/core/responseRecovery",
@@ -433,6 +495,7 @@
"src/agent",
"src/agent/attrParsers",
"src/agent/llm/callNonStreaming",
+ "src/agent/handlePrompt/largeInputMapReduce",
"src/agent/llm/createStreamingRequest",
"src/agent/llm/streamChatOnce",
"src/agent/llm/devilRebuttal",
@@ -444,7 +507,10 @@
"src/agent/actions/fileCreateEdit",
"src/agent/actions/fileDeleteRead",
"src/agent/actions/runCommand",
+ "src/agent/actions/calculate",
+ "src/agent/actions/runCode",
"src/agent/actions/listFiles",
+ "src/agent/actions/investigateFiles",
"src/agent/actions/webFetch",
"src/agent/actions/brainOps",
"src/agent/actions/calendar",
@@ -461,8 +527,7 @@
"src/agent/handlePrompt/applyAutoContinuation",
"src/features/approval/approvalQueue",
"src/intelligence/confidenceEngine",
- "src/features/providers",
- "src/agent/hangulHygiene"
+ "src/features/providers"
]
},
"src/agents/AgentWorkflowManager.ts": {
@@ -477,15 +542,27 @@
]
},
"src/agents/factory.ts": {
- "mtimeMs": 1779764602598.9656,
- "size": 19832,
- "lines": 328,
+ "mtimeMs": 1783907905614.2983,
+ "size": 17455,
+ "lines": 271,
"role": "",
"imports": [
"src/config",
+ "src/core/services",
"src/lib/engine"
]
},
+ "src/agents/reportQa.ts": {
+ "mtimeMs": 1783907905615.301,
+ "size": 15821,
+ "lines": 259,
+ "role": "",
+ "imports": [
+ "src/core/services",
+ "src/config",
+ "src/utils"
+ ]
+ },
"src/bridge.ts": {
"mtimeMs": 1779411812096.6685,
"size": 10768,
@@ -500,9 +577,9 @@
]
},
"src/config.ts": {
- "mtimeMs": 1781491584056.0022,
- "size": 37540,
- "lines": 661,
+ "mtimeMs": 1784510604793.408,
+ "size": 42409,
+ "lines": 727,
"role": "",
"imports": []
},
@@ -551,12 +628,13 @@
"imports": []
},
"src/core/health.ts": {
- "mtimeMs": 1781491584057.009,
- "size": 8465,
- "lines": 167,
+ "mtimeMs": 1783907905635.8955,
+ "size": 10493,
+ "lines": 192,
"role": "",
"imports": [
"src/config",
+ "src/lib/execUtil",
"src/utils",
"src/features/datacollect/bridgeClient"
]
@@ -589,13 +667,14 @@
]
},
"src/core/services.ts": {
- "mtimeMs": 1779764602601.9775,
- "size": 7622,
- "lines": 176,
+ "mtimeMs": 1783907905645.613,
+ "size": 9993,
+ "lines": 218,
"role": "",
"imports": [
"src/config",
- "src/utils"
+ "src/utils",
+ "src/features/providers/claudeCode"
]
},
"src/core/session.ts": {
@@ -705,9 +784,9 @@
]
},
"src/extension/evalCommands.ts": {
- "mtimeMs": 1781147900732.2805,
- "size": 29561,
- "lines": 521,
+ "mtimeMs": 1783993665585.4663,
+ "size": 32539,
+ "lines": 574,
"role": "",
"imports": [
"src/config",
@@ -726,7 +805,8 @@
"src/intelligence/skillScore",
"src/intelligence/researchAgent",
"src/intelligence/knowledgeValidation",
- "src/intelligence/learningQueue"
+ "src/intelligence/learningQueue",
+ "src/intelligence/correctionLoop"
]
},
"src/extension/featureConceptMap.ts": {
@@ -780,9 +860,9 @@
]
},
"src/extension/providerCommands.ts": {
- "mtimeMs": 1779764602605.9907,
- "size": 7701,
- "lines": 136,
+ "mtimeMs": 1783303469971.2595,
+ "size": 7366,
+ "lines": 131,
"role": "",
"imports": [
"src/sidebarProvider",
@@ -826,14 +906,16 @@
]
},
"src/extension.ts": {
- "mtimeMs": 1781232046994.3347,
- "size": 21727,
- "lines": 418,
+ "mtimeMs": 1784510865982.1218,
+ "size": 23190,
+ "lines": 435,
"role": "",
"imports": [
"src/features/teamops/handlers",
"src/features/system/handlers",
+ "src/features/claude/claudeLauncher",
"src/features/datacollect/handlers",
+ "src/features/email/handlers",
"src/utils",
"src/config",
"src/agent",
@@ -857,6 +939,7 @@
"src/extension/initialSetup",
"src/features/stocks",
"src/features/briefing/dailyBriefing",
+ "src/features/email/emailWatcher",
"src/extension/brainBootstrap",
"src/extension/embeddingBootstrap",
"src/extension/featureInventory",
@@ -869,14 +952,16 @@
"src/extension/telegramCommands",
"src/extension/settingsSetup",
"src/integrations/telegram/telegramSetup",
+ "src/retrieval/brainWatch",
+ "src/retrieval/brainIndex",
"src/features/setup/datacollectSetup",
"src/features/growth/conflictScan"
]
},
"src/features/approval/approvalPanelProvider.ts": {
- "mtimeMs": 1778664480470.9922,
- "size": 7285,
- "lines": 153,
+ "mtimeMs": 1783303469980.4175,
+ "size": 7509,
+ "lines": 155,
"role": "",
"imports": [
"src/features/approval/approvalQueue",
@@ -901,89 +986,21 @@
"src/features/approval/approvalQueue"
]
},
- "src/features/astraOffice/index.ts": {
- "mtimeMs": 1779065453862.6475,
- "size": 807,
- "lines": 18,
- "role": "Astra Office — public API. 다음 세션에서 추가될 OfficeSnapshot presenter / schema 도 같은 entry 로 노출 예정. 현재 노출: full webview panel HTML 생성 함수. sidebarProvider.ts 는 이 한 줄만 import.",
- "imports": [
- "src/features/astraOffice/view/panelHtml",
- "src/features/astraOffice/schema",
- "src/features/astraOffice/presenter",
- "src/features/astraOffice/view/layoutSchema"
- ]
- },
- "src/features/astraOffice/presenter.ts": {
- "mtimeMs": 1779065453862.6475,
- "size": 7549,
- "lines": 181,
- "role": "Presenter — 옛 AgentWorkState + bubble queue + activity items 를 OfficeSnapshot 으로 변환하는 pure 함수. mini / full view 둘 다 같은 OfficeSnapshot 을 받게 만드는 게 목표. 이번 세션의 범위: 인터페이스 + 스텁. 실제 wiring 은 다음 세션에서: - sideb",
- "imports": [
- "src/features/company/pixelOfficeState",
- "src/features/company/types",
- "src/features/astraOffice/schema"
- ]
- },
- "src/features/astraOffice/schema.ts": {
- "mtimeMs": 1779065453864.1523,
- "size": 10936,
- "lines": 305,
- "role": "OfficeSnapshot — Astra Office 의 도메인 타입. 동시성 진실 (docs/ASTRAOFFICEREFACTOR.md §1): dispatcher 는 직렬이라 한 시점에 active agent 는 0 또는 1명. 이걸 데이터로 강제하는 게 이 타입의 핵심 역할. 이 세션에서는 타입 + validator + empty factory 만. 백",
- "imports": [
- "src/features/company/pixelOfficeState"
- ]
- },
- "src/features/astraOffice/view/layoutSchema.ts": {
- "mtimeMs": 1779065453864.8176,
- "size": 6655,
- "lines": 180,
- "role": "Pixel Office layout 저장 스키마 — workspaceState 의 g1nation.pixelOfficeLayout 키 에 저장되는 객체의 런타임 validator + v1 → v2 migration. 옛 runtime.ts 의 isV2Snap() heuristic 을 정식 schema 로 격상. webview 에서 받는 즉시 한 번 통과시키",
- "imports": []
- },
- "src/features/astraOffice/view/officeBody.ts": {
- "mtimeMs": 1779065453865.8494,
- "size": 4207,
- "lines": 103,
- "role": "",
- "imports": []
- },
- "src/features/astraOffice/view/officeStyles.ts": {
- "mtimeMs": 1779065453866.8667,
- "size": 26165,
- "lines": 419,
- "role": "",
- "imports": []
- },
- "src/features/astraOffice/view/panelHtml.ts": {
- "mtimeMs": 1779065453867.871,
- "size": 949,
- "lines": 26,
- "role": "Full Astra Office webview HTML composition. 옛 sidebarProvider.ts 의 거대한 pixelOfficePanelHtml 을 4개 파일로 분리한 entry. 이번 세션은 동작 동등 분리 만. 다음 세션에 mini view 와 공통 presenter 도입.",
- "imports": [
- "src/features/astraOffice/view/officeStyles",
- "src/features/astraOffice/view/officeBody",
- "src/features/astraOffice/view/runtime"
- ]
- },
- "src/features/astraOffice/view/runtime.ts": {
- "mtimeMs": 1779764602610.0264,
- "size": 95995,
- "lines": 1953,
- "role": "자동 분리: src/sidebarProvider.ts 4002-5116 (IIFE 본문) 에서 추출. 동작 동등. ${assets.derivedBase} placeholder 는 panelHtml 에서 .replace() 로 실제 값 주입. 다음 세션에서 OfficeSnapshot 기반으로 단계적으로 잘라낼 예정.",
- "imports": []
- },
"src/features/briefing/dailyBriefing.ts": {
- "mtimeMs": 1781170096875.4578,
- "size": 9101,
- "lines": 184,
+ "mtimeMs": 1783907905665.2756,
+ "size": 10419,
+ "lines": 196,
"role": "데일리 브리핑 워처 — 평일(월~금) KST 09:30 에 \"오늘의 할 일\"을 텔레그램으로 발송. 소스: 1. Google Calendar — iCal 캐시 새로고침 후 오늘 일정 (readCalendarEventsCache) 2. Google Tasks — 오늘 마감 + 기한 지난 미완료 + 날짜 없는 [조건부] task (listTasks) 발송 조건 ",
"imports": [
+ "src/lib/kstSchedule",
"src/utils",
"src/integrations/telegram/telegramClient",
"src/extension/telegramCommands",
"src/features/calendar/calendarCache",
"src/features/calendar/tasksApi",
- "src/features/datacollect/scheduling/meetRegistration"
+ "src/features/datacollect/scheduling/meetRegistration",
+ "src/features/email/emailState",
+ "src/features/email/emailBrief"
]
},
"src/features/calendar/calendarApi.ts": {
@@ -1034,9 +1051,9 @@
]
},
"src/features/calendar/oauth.ts": {
- "mtimeMs": 1780654426655.6082,
- "size": 10986,
- "lines": 236,
+ "mtimeMs": 1782992302355.1787,
+ "size": 11225,
+ "lines": 239,
"role": "Google OAuth 2.0 — loopback (Desktop app) 흐름. Google 은 Desktop 앱 OAuth client 에 대해 http://127.0.0.1: redirect URI 를 허용한다. 본 모듈은: 1. ephemeral port 에 일회용 HTTP 서버 띄움 2. 사용자 브라우저로 Google 로",
"imports": []
},
@@ -1049,6 +1066,15 @@
"src/features/calendar/calendarApi"
]
},
+ "src/features/claude/claudeLauncher.ts": {
+ "mtimeMs": 1783907905666.2817,
+ "size": 3566,
+ "lines": 60,
+ "role": "",
+ "imports": [
+ "src/features/datacollect/slashRouter"
+ ]
+ },
"src/features/company/agents.ts": {
"mtimeMs": 1779764602611.032,
"size": 38122,
@@ -1108,9 +1134,9 @@
]
},
"src/features/company/dispatcher.ts": {
- "mtimeMs": 1781491584061.5083,
- "size": 72574,
- "lines": 1400,
+ "mtimeMs": 1783907905679.0752,
+ "size": 73464,
+ "lines": 1417,
"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",
@@ -1147,9 +1173,9 @@
]
},
"src/features/company/index.ts": {
- "mtimeMs": 1781491584062.5142,
- "size": 2932,
- "lines": 113,
+ "mtimeMs": 1783303469988.6506,
+ "size": 2677,
+ "lines": 106,
"role": "Public API for 1인 기업 모드. Consumers (sidebarProvider, chatHandlers, command handlers) import from this barrel so internal layout can move around without touching every call site.",
"imports": [
"src/features/company/agents",
@@ -1161,8 +1187,7 @@
"src/features/company/sessionStore",
"src/features/company/intentClassifier",
"src/features/company/intentAlignment",
- "src/features/company/alignmentResearch",
- "src/features/company/pixelOfficeState"
+ "src/features/company/alignmentResearch"
]
},
"src/features/company/intentAlignment.ts": {
@@ -1195,13 +1220,6 @@
"src/features/company/types"
]
},
- "src/features/company/pixelOfficeState.ts": {
- "mtimeMs": 1778843402595.067,
- "size": 10025,
- "lines": 286,
- "role": "Pixel Office — Agent Work Pipeline 상태를 시각화하는 UI Layer 전용 모듈. ─────────────────── 설계 원칙 ─────────────────── 1. Agent 핵심 판단 로직을 절대 바꾸지 않는다. Pipeline 진행, contract 합의, 검수 cycle, 승인 게이트 — 모두 기존 dispatcher ",
- "imports": []
- },
"src/features/company/promptAssets.ts": {
"mtimeMs": 1778720117525.2087,
"size": 6896,
@@ -1300,46 +1318,83 @@
"role": "",
"imports": []
},
+ "src/features/datacollect/bridgeLauncher.ts": {
+ "mtimeMs": 1783907905685.1292,
+ "size": 7884,
+ "lines": 156,
+ "role": "",
+ "imports": [
+ "src/lib/execUtil"
+ ]
+ },
"src/features/datacollect/handlers.ts": {
- "mtimeMs": 1781239638273.816,
- "size": 46089,
- "lines": 821,
+ "mtimeMs": 1783907905694.8408,
+ "size": 74417,
+ "lines": 1226,
"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/config",
+ "src/utils",
+ "src/agents/reportQa",
"src/features/datacollect/bridgeClient",
+ "src/features/datacollect/reviewFiles",
+ "src/features/datacollect/prompts/reviewPrompt",
"src/features/datacollect/prompts/synthesisPrompt",
+ "src/features/datacollect/prompts/handoffDoc",
+ "src/features/datacollect/prompts/layoutSkeleton",
"src/features/datacollect/prompts/youtubePrompts",
"src/features/datacollect/prompts/wikifyPrompt",
"src/features/datacollect/prompts/meetPrompt",
+ "src/features/datacollect/wikiSave",
"src/features/calendar",
"src/features/datacollect/scheduling/meetRegistration",
"src/features/datacollect/scheduling/calendarHelpers",
+ "src/features/datacollect/wikiFormat",
"src/agent/hangulHygiene"
]
},
"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"
- ]
+ "mtimeMs": 1783907905701.5244,
+ "size": 15023,
+ "lines": 242,
+ "role": "Datacollect LLM 호출 인프라 — OpenAI 호환 chat completion 단발 호출. v2.2.201 에서 slashRouter.ts 에서 분리. 옛 위치는 slashRouter.callLmSynthesis 였으나 datacollect handlers + teamops/communication 양쪽이 import 하므로 별도 인프라 모듈로",
+ "imports": []
+ },
+ "src/features/datacollect/prompts/handoffDoc.ts": {
+ "mtimeMs": 1783907905702.5261,
+ "size": 7474,
+ "lines": 147,
+ "role": "/benchmark handoff — 클라우드 모델(Claude Code·Antigravity 등) 개발 인수인계 문서. 설계 원칙 (v2.2.303): 로컬 소형 모델의 작문을 통과시키지 않는다. 4b 모델이 큰 모델에게 줄 지시문을 요약하게 하면 스캔이 정확히 측정한 값 (rgb·px·카피 원문)이 \"적절한 색상\" 같은 모호어로 퇴화한다. 클라우드 모델",
+ "imports": []
+ },
+ "src/features/datacollect/prompts/layoutSkeleton.ts": {
+ "mtimeMs": 1783907905702.5261,
+ "size": 5430,
+ "lines": 97,
+ "role": "레이아웃 골격 리포트 — 스캔 데이터에서 결정론으로 페이지별 위→아래 구성을 그린다. 배경 (v2.2.307): /benchmark 결과가 \"색·폰트\" 수준에 머물고, LLM 합성이 죽으면 레이아웃 정보가 아예 사라졌다 (실사례: koritips 스캔 — 파트 2 타임아웃 → 원시 요약만 남음). 골격(어떤 섹션이 어떤 순서로, 배너/캐러셀/폼 위젯이 어디",
+ "imports": []
},
"src/features/datacollect/prompts/meetPrompt.ts": {
- "mtimeMs": 1781160824134.4404,
- "size": 13297,
- "lines": 201,
- "role": "회의 녹취 텍스트 → 사실 기반 구조화 회의록(Actionable Minutes) LLM 프롬프트. 사용자 정의 규칙: Fact/Discussion/Decision/Risk/Action 분류, 메타데이터 우선.",
+ "mtimeMs": 1782980927145.5679,
+ "size": 32983,
+ "lines": 375,
+ "role": "회의 녹취 텍스트 → 사실 기반 구조화 회의록(Actionable Minutes) LLM 프롬프트. 사용자 정의 규칙: Fact/Discussion/Decision/Risk/Action 분류, 메타데이터 우선. v2.2.259 개선(사용자 피드백 반영 — 회의록 \"방향성\" 개선, 외부 모범사례 근거): - 문체: 서술형 일기체('~논의하였다/완료하였다') ",
+ "imports": []
+ },
+ "src/features/datacollect/prompts/reviewPrompt.ts": {
+ "mtimeMs": 1781771808523.1663,
+ "size": 5087,
+ "lines": 93,
+ "role": "코드 리뷰 map-reduce 프롬프트. 일반 에이전트 채팅은 코드 리뷰처럼 입력이 큰 작업을 단일 호출로 처리하다 약한 로컬 모델에서 빈 응답(첫 토큰 EOS)으로 무너진다. /review 는 /meet 와 같은 map-reduce 로 이를 우회한다: - Map : 파일 하나씩 독립 리뷰 → 파일별 발견사항(근거 인용) - Reduce: 파일별 노트를 통",
"imports": []
},
"src/features/datacollect/prompts/synthesisPrompt.ts": {
- "mtimeMs": 1779764602618.1577,
- "size": 14095,
- "lines": 257,
- "role": "/benchmark 보고서의 3 파트 분할 — 1: 4-렌즈 / 2: IA + 토큰 / 3: 재구축 명세.",
+ "mtimeMs": 1783907905711.6887,
+ "size": 21429,
+ "lines": 326,
+ "role": "/benchmark 보고서의 파트 분할. 1: 4-렌즈 디자인 분석 / 2: IA + 디자인 토큰 / 3: 원본 재구축 명세 (재해석 금지) 4: 비즈니스 벤치마킹 렌즈 (v2.2.302 — 포지셔닝·가격·수익구조·운영 방향성. 피터 레벨스 류 1인 AI 기업 분석 프레임 이식. 여기서만 사용자 컨텍스트로 변형 제안 허용) 5: 단계별 빌드 프롬프트 (v2",
"imports": []
},
"src/features/datacollect/prompts/weeklyPrompt.ts": {
@@ -1350,11 +1405,13 @@
"imports": []
},
"src/features/datacollect/prompts/wikifyPrompt.ts": {
- "mtimeMs": 1781239076699.4426,
- "size": 8441,
- "lines": 158,
+ "mtimeMs": 1783046744019.2449,
+ "size": 9696,
+ "lines": 180,
"role": "추출된 웹사이트 본문 → P-Reinforce 위키 문서 프롬프트. 포맷 정본은 Datacollect 브리지의 wikiformat.mjs — 핸들러가 GET /api/wiki/template 로 받아 canonical 로 주입한다 (양쪽 포맷 통일). 브리지가 구버전(엔드포인트 없음)일 때만 아래 내장 사본(fallback)을 쓴다. 내장 사본은 정본을 따",
- "imports": []
+ "imports": [
+ "src/features/datacollect/wikiFormat"
+ ]
},
"src/features/datacollect/prompts/youtubePrompts.ts": {
"mtimeMs": 1779852277877.3347,
@@ -1363,17 +1420,24 @@
"role": "/youtube slash command 의 LLM 입력 빌더 + 자막 변환 헬퍼. - formatHms / fullScriptFromSegments / bucketSegments — segment list 가공 - YoutubeAnalysisMode — info/benchmark/both 라우팅 enum (slashRouter 가 사용) - buildIn",
"imports": []
},
+ "src/features/datacollect/reviewFiles.ts": {
+ "mtimeMs": 1781771833526.37,
+ "size": 4126,
+ "lines": 102,
+ "role": "/review 대상 소스 파일 수집기. 디렉터리를 재귀 순회하며 \"리뷰할 가치가 있는 소스 파일\"만 골라낸다. 의존성·빌드 산출물·바이너리·생성물은 제외한다. 순수 판정 로직(shouldReviewFile)은 fs 와 분리해 테스트 가능하게 둔다.",
+ "imports": []
+ },
"src/features/datacollect/scheduling/calendarHelpers.ts": {
- "mtimeMs": 1781160936476.3435,
- "size": 4854,
- "lines": 99,
+ "mtimeMs": 1782113831088.3467,
+ "size": 8150,
+ "lines": 160,
"role": "/meet 슬래시 명령의 후처리 — 회의록에서 action items 를 뽑아 캘린더 task 일정을 계산하는 stateless helpers. slashRouter 의 inline 블록을 분리. - addBusinessDays(base, n) — 토·일 제외 영업일 n 일 후 날짜 - toYmd(d) — Date → 'YYYY-MM-DD' - extrac",
"imports": []
},
"src/features/datacollect/scheduling/meetRegistration.ts": {
- "mtimeMs": 1781170008519.57,
- "size": 20511,
- "lines": 392,
+ "mtimeMs": 1782980407235.4438,
+ "size": 23502,
+ "lines": 440,
"role": "/meet 액션 아이템의 \"확신 게이트\" 등록 시스템. 정책 (사용자 정의): - 확정(합의+기한) → 자동 등록. - 진행미정 / 기한미정 / 조건부 → 등록 보류 + 사용자에게 질문, /meet confirm 답변으로 등록 완결. - 반복(예: 매주 목요일) → 반복 등록하지 않고 첫 1회만 등록 (까먹음 방지). - 과거 날짜(옛 녹취) → 과거 날짜",
"imports": [
"src/features/calendar/calendarApi",
@@ -1384,9 +1448,9 @@
]
},
"src/features/datacollect/slashRouter.ts": {
- "mtimeMs": 1780281950731.9368,
- "size": 10210,
- "lines": 201,
+ "mtimeMs": 1783044290270.0188,
+ "size": 10708,
+ "lines": 211,
"role": "",
"imports": [
"src/utils",
@@ -1396,6 +1460,28 @@
"src/features/stocks"
]
},
+ "src/features/datacollect/wikiFormat.ts": {
+ "mtimeMs": 1783043650649.7346,
+ "size": 9209,
+ "lines": 176,
+ "role": "위키 문서 포맷 — 단일 정본 모듈 (v2.2.278) 배경: 위키 문서를 만드는 기능이 늘 때마다(/wikify → /meet → /email → …) 포맷이 하나씩 새로 생기는 파편화가 진행됐다. 이 모듈이 그 흐름을 끊는다 — 앞으로 위키 문서를 만드는 모든 기능은 여기만 쓴다. 2층 구조: ① 봉투(frontmatter) 통일 — ensureFron",
+ "imports": [
+ "src/features/datacollect/bridgeClient",
+ "src/features/datacollect/prompts/wikifyPrompt"
+ ]
+ },
+ "src/features/datacollect/wikiSave.ts": {
+ "mtimeMs": 1783907905721.3022,
+ "size": 8109,
+ "lines": 161,
+ "role": "지식 문서 로컬 저장 (v2.2.273) 배경: /wikify·/meet·/benchmark·/youtube·/review·/email wikify 결과물은 지금까지 Bridge 의 /api/wiki/save 로 저장했는데, Bridge 가 NAS 컨테이너로 이전된 뒤로는 파일이 NAS 볼륨(outwiki) 에 생겨 사용자 PC 에선 보이지 않았다 (\"어디",
+ "imports": [
+ "src/config",
+ "src/features/datacollect/bridgeClient",
+ "src/utils",
+ "src/features/datacollect/wikiFormat"
+ ]
+ },
"src/features/devilAgent/devilPrompt.ts": {
"mtimeMs": 1779065453878.1177,
"size": 3662,
@@ -1422,6 +1508,94 @@
"src/features/devilAgent/devilService"
]
},
+ "src/features/email/emailBrief.ts": {
+ "mtimeMs": 1783070235607.413,
+ "size": 8213,
+ "lines": 166,
+ "role": "/email 브리핑 — 받은편지함을 '주제(스레드)' 단위로 정리 (v2.2.270) 원시 메일 나열 대신 사람이 상황을 파악할 수 있는 형태로: ① RE:/FW: 를 벗겨 같은 주제 메일을 하나의 스레드로 묶고 ② 보낸편지함과 대조해 \"마지막 발화가 누구인가\"로 답변 여부 판정 (마지막이 상대방 → 🔴 회신 대기 / 마지막이 나 → ✅ 공 넘김) ③ 뉴",
+ "imports": []
+ },
+ "src/features/email/emailCollect.ts": {
+ "mtimeMs": 1783070235609.415,
+ "size": 4539,
+ "lines": 100,
+ "role": "최근 메일 수집 공통 모듈 (v2.2.271) — /email 브리핑과 이메일 워처가 공유. Outlook(받은+보낸) + Gmail(연결 시)을 MailLite 로 정규화한다. 참조번호(O1../G1..)는 여기서 부여 — 호출자(핸들러)가 목록 캐시에 그대로 사용.",
+ "imports": [
+ "src/features/email/gmailApi",
+ "src/features/email/outlookApi",
+ "src/features/email/emailBrief"
+ ]
+ },
+ "src/features/email/emailPrompts.ts": {
+ "mtimeMs": 1783070235611.8782,
+ "size": 11633,
+ "lines": 195,
+ "role": "/email 프롬프트 — 위키화(지식 문서 합성) + 회신 초안. (v2.2.269) Datacollect bridge 의 email wikify 프롬프트와 같은 P-Reinforce 섹션 구조를 따라 brain(제2뇌) 문서 포맷 일관성을 유지한다. 환각 방지 규칙 동일.",
+ "imports": []
+ },
+ "src/features/email/emailState.ts": {
+ "mtimeMs": 1783070235610.874,
+ "size": 12850,
+ "lines": 294,
+ "role": "이메일 스레드 영속 상태 — .astra/emailstate.json (v2.2.271) /email 이 \"조회 도구\"에서 \"관리 도구\"가 되기 위한 핵심: 워처가 주기적으로 관측한 스레드를 여기 누적하므로, 수집 창(최근 N일) 밖으로 벗어난 미회신 건도 사라지지 않고 계속 추적된다 (GTD Waiting-For 리스트의 코드화). 상태 머신: waiti",
+ "imports": [
+ "src/utils",
+ "src/features/email/emailBrief"
+ ]
+ },
+ "src/features/email/emailWatcher.ts": {
+ "mtimeMs": 1783070235612.8818,
+ "size": 6716,
+ "lines": 135,
+ "role": "이메일 워처 (v2.2.271) — /email 을 안 쳐도 알아서 축적·추적·알림. 주기(기본 60분)마다: 1. Outlook(+Gmail 연결 시) 최근 메일 증분 수집 2. 주제별 스레드 묶음 → .astra/emailstate.json 에 병합 (수집 창 밖 미회신도 계속 보존 — GTD Waiting-For) 3. 임계(기본 24h) 초과 미회신",
+ "imports": [
+ "src/utils",
+ "src/integrations/telegram/telegramClient",
+ "src/extension/telegramCommands",
+ "src/features/email/emailCollect",
+ "src/features/email/emailBrief",
+ "src/features/email/emailState",
+ "src/integrations/telegram/messageFormat"
+ ]
+ },
+ "src/features/email/gmailApi.ts": {
+ "mtimeMs": 1782992322821.3113,
+ "size": 7951,
+ "lines": 187,
+ "role": "Gmail API v1 — 읽기 전용(read-only) 메시지 수집 (Project Astra, Phase 1) Calendar/Tasks/Sheets 와 같은 Google OAuth 토큰을 공유한다 (getFreshAccessToken). scope 에 gmail.readonly 가 포함돼야 함(oauth.ts). 삭제/답장/전달 등 쓰기 기능은 일절 ",
+ "imports": [
+ "src/features/calendar/calendarApi"
+ ]
+ },
+ "src/features/email/handlers.ts": {
+ "mtimeMs": 1783071322137.2522,
+ "size": 38561,
+ "lines": 630,
+ "role": "/email — Gmail + 클래식 Outlook 통합 이메일 명령 (v2.2.269) /email — 도움말 + 연결 상태 /email list [gmail|outlook] [일수] — 최근 메일 목록 (기본 둘 다, 7일) /email read G3 | O2 — 목록 번호로 내용 읽기 /email wikify G3 | O2 — 지식 문서로 위키화 → ",
+ "imports": [
+ "src/features/email/features/email/handlers",
+ "src/features/datacollect/slashRouter",
+ "src/features/datacollect/wikiSave",
+ "src/features/datacollect/llm",
+ "src/features/email/gmailApi",
+ "src/features/email/outlookApi",
+ "src/features/email/emailPrompts",
+ "src/features/datacollect/prompts/wikifyPrompt",
+ "src/features/datacollect/wikiFormat",
+ "src/features/email/emailBrief",
+ "src/features/email/emailCollect",
+ "src/features/email/emailState",
+ "src/features/email/emailWatcher",
+ "src/features/calendar/calendarCache"
+ ]
+ },
+ "src/features/email/outlookApi.ts": {
+ "mtimeMs": 1783070186274.4316,
+ "size": 11590,
+ "lines": 276,
+ "role": "Outlook (클래식 데스크톱) — COM 자동화 via PowerShell (v2.2.269) 사용자 PC에 설치된 클래식 Outlook 을 COM 으로 직접 읽는다 — 별도 인증 없음 (Outlook 이 이미 로그인돼 있으면 그대로 동작). Graph API 미사용 (Azure 앱 등록·관리자 동의가 필요해 개인/사내 환경에서 부담). 안전 원칙: -",
+ "imports": []
+ },
"src/features/feedback/feedbackStore.ts": {
"mtimeMs": 1780275889230.5403,
"size": 1851,
@@ -1446,11 +1620,12 @@
]
},
"src/features/growth/growthCycleWatcher.ts": {
- "mtimeMs": 1781231979220.9685,
- "size": 19659,
- "lines": 318,
+ "mtimeMs": 1783907905729.0396,
+ "size": 19324,
+ "lines": 307,
"role": "주간 성장 사이클 워처 — Self-Evolving OS 의 폐루프 자동화. 기존엔 평가·학습큐·노후점검·학습실행이 전부 수동 명령이었다. 이 워처가 매주 (기본 일요일 20:00 KST) 자동으로: 1. 검색 평가 — 골든셋 recall@k/MRR (주간 추이 데이터, TF-IDF 경로) 2. 학습 큐 갱신 — Reflection → Need Engine",
"imports": [
+ "src/lib/kstSchedule",
"src/config",
"src/utils",
"src/retrieval",
@@ -1470,11 +1645,12 @@
]
},
"src/features/growth/sleepDigest.ts": {
- "mtimeMs": 1781232042506.8752,
- "size": 13185,
- "lines": 271,
+ "mtimeMs": 1783907905738.3445,
+ "size": 12833,
+ "lines": 261,
"role": "Sleep-time 지식 사전 소화 (Sleep-time Compute, arXiv 2504.13171 의 ASTRA 이식). 아이디어: 로컬 LLM 의 최대 약점(느린 추론)을 응답 시점에서 유휴 시간으로 옮긴다. 유휴 시간에 두뇌의 \"raw context\"(위키 원문 더미)를 \"learned context\"(예상 질의별 압축 소화 노트)로 변환해 두면,",
"imports": [
+ "src/lib/kstSchedule",
"src/config",
"src/utils",
"src/intelligence/llmCall",
@@ -1583,6 +1759,17 @@
"src/features/providers/streamHelpers"
]
},
+ "src/features/providers/claudeCode.ts": {
+ "mtimeMs": 1783907905739.5852,
+ "size": 10309,
+ "lines": 205,
+ "role": "Claude Code CLI adapter — 구독(Pro/Max) 인증으로 Claude 를 Astra 엔진으로. 배경 (v2.2.305): Anthropic 구독은 API 키가 아니라 Claude Code 로그인 방식이라 anthropic: 프로바이더(API 키·종량제)로는 쓸 수 없다. 이 어댑터는 사용자가 이미 로그인해 둔 로컬 claude CLI 를",
+ "imports": [
+ "src/features/providers/types",
+ "src/lib/execUtil",
+ "src/utils"
+ ]
+ },
"src/features/providers/gemini.ts": {
"mtimeMs": 1779065453881.3628,
"size": 4434,
@@ -1595,15 +1782,16 @@
]
},
"src/features/providers/index.ts": {
- "mtimeMs": 1779065453882.3787,
- "size": 3311,
- "lines": 69,
+ "mtimeMs": 1783907905743.8855,
+ "size": 3897,
+ "lines": 78,
"role": "Cloud LLM provider public API. 일반 호출 흐름: 1. agent.ts 의 chat 진입부에서 parseModelPrefix(modelId) 호출 2. null → local engine 경로 (옛 로직). 객체 → streamCloudCompletion(context, hit, params) 호출 3. Response 의 body ",
"imports": [
"src/features/providers/types",
"src/features/providers/openrouter",
"src/features/providers/anthropic",
"src/features/providers/gemini",
+ "src/features/providers/claudeCode",
"src/features/providers/providerConfig"
]
},
@@ -1634,9 +1822,9 @@
"imports": []
},
"src/features/providers/types.ts": {
- "mtimeMs": 1779065453884.8909,
- "size": 2433,
- "lines": 63,
+ "mtimeMs": 1783907905749.0212,
+ "size": 2918,
+ "lines": 69,
"role": "Cloud LLM provider routing — model id prefix → provider id 매핑. Prefix 규칙: openrouter:anthropic/claude-3.5-sonnet → { provider: 'openrouter', model: 'anthropic/claude-3.5-sonnet' } anthropic:claude-3-5",
"imports": []
},
@@ -1660,11 +1848,12 @@
]
},
"src/features/selfReflector/selfReflectorExecution.ts": {
- "mtimeMs": 1779325350825.2378,
- "size": 9570,
+ "mtimeMs": 1783907905750.1067,
+ "size": 10059,
"lines": 207,
"role": "Self-Reflector Phase C — 실행 기반 검증. Phase A/B는 LLM 텍스트 분석에 의존하므로 \"코드가 실제로 컴파일되는가?\" 같은 질문엔 한계가 있다. Phase C는 정답: 그냥 실행해 본다. 동작: 1. action-tag executor가 반환한 report를 받아 ✅ Created: / ✅ Edited: ",
"imports": [
+ "src/lib/execUtil",
"src/utils"
]
},
@@ -1693,9 +1882,9 @@
]
},
"src/features/settings/settingsPanelProvider.ts": {
- "mtimeMs": 1780968616137.0164,
- "size": 35518,
- "lines": 734,
+ "mtimeMs": 1783303470006.2417,
+ "size": 40143,
+ "lines": 820,
"role": "",
"imports": [
"src/integrations/telegram/telegramClient",
@@ -1708,68 +1897,104 @@
]
},
"src/features/setup/datacollectSetup.ts": {
- "mtimeMs": 1780624672053.5078,
- "size": 12679,
- "lines": 267,
+ "mtimeMs": 1783907905764.34,
+ "size": 12849,
+ "lines": 268,
"role": "Datacollect 의존성(Python 패키지) 자동 설치/검증 모듈. 의도: Astra extension 만 깔고 끝나면 /youtube, /research 같은 datacollect 슬래시 명령은 bridge 의 Python 의존성 (yt-dlp, youtube-transcript-api) 이 없어서 실패한다. 사용자가 그걸 매번 수동으로 깔아야 하는",
"imports": [
+ "src/lib/execUtil",
"src/utils"
]
},
"src/features/sheets/index.ts": {
- "mtimeMs": 1779065453886.916,
- "size": 250,
- "lines": 13,
+ "mtimeMs": 1783303470008.2588,
+ "size": 293,
+ "lines": 15,
"role": "",
"imports": [
"src/features/sheets/sheetsApi"
]
},
"src/features/sheets/sheetsApi.ts": {
- "mtimeMs": 1779065453887.9194,
- "size": 7960,
- "lines": 166,
+ "mtimeMs": 1783303470009.2974,
+ "size": 11292,
+ "lines": 235,
"role": "Google Sheets API v4 — read / write / append. 토큰은 calendar 와 공유 (같은 OAuth 에 spreadsheets scope 포함). 별도 셋업 없음 — \"Astra: Google Calendar OAuth 연결\" 명령으로 한 번 로그인하면 둘 다 동작한다. 외부 라이브러리 안 씀 — Sheets API REST",
"imports": [
"src/features/calendar/calendarApi"
]
},
+ "src/features/stocks/backupSync.ts": {
+ "mtimeMs": 1783303470009.2974,
+ "size": 6473,
+ "lines": 133,
+ "role": "",
+ "imports": [
+ "src/features/sheets",
+ "src/utils",
+ "src/features/stocks/stocksStore",
+ "src/features/stocks/types"
+ ]
+ },
+ "src/features/stocks/compositeScore.ts": {
+ "mtimeMs": 1782985069125.8005,
+ "size": 9854,
+ "lines": 204,
+ "role": "",
+ "imports": [
+ "src/features/stocks/types"
+ ]
+ },
"src/features/stocks/criteriaEval.ts": {
- "mtimeMs": 1781086243443.0957,
- "size": 12293,
- "lines": 209,
+ "mtimeMs": 1782807721058.0144,
+ "size": 13996,
+ "lines": 234,
"role": "/stocks judge 의 결정론적 기준 평가기. 기존에는 \"유보율: 5,800%\" 같은 문자열 파싱과 임계값 비교(ROE ≥ 10% 등)까지 전부 LLM 에게 맡겼는데, 로컬 소형 모델은 콤마 숫자 파싱·다중 기준 동시 비교에서 자주 틀린다. 수치 기준은 코드로 100% 정확하게 계산하고, LLM 은 ① '기술력' 도메인 정성 판단(키워드 매칭이 모호할",
"imports": [
"src/features/stocks/types",
- "src/features/stocks/naverFundamentals"
+ "src/features/stocks/naverFundamentals",
+ "src/features/stocks/marketUtils"
]
},
"src/features/stocks/discoveryAnalyzer.ts": {
- "mtimeMs": 1779764602625.2075,
- "size": 10526,
- "lines": 237,
+ "mtimeMs": 1783047644329.3994,
+ "size": 12366,
+ "lines": 256,
"role": "",
"imports": [
"src/core/services",
"src/utils",
"src/extension/telegramCommands",
"src/integrations/telegram/telegramClient",
- "src/features/stocks/stockDiscovery"
+ "src/features/stocks/stockDiscovery",
+ "src/integrations/telegram/messageFormat"
+ ]
+ },
+ "src/features/stocks/fundamentalsRouter.ts": {
+ "mtimeMs": 1782807657868.5742,
+ "size": 790,
+ "lines": 15,
+ "role": "",
+ "imports": [
+ "src/features/stocks/marketUtils",
+ "src/features/stocks/naverFundamentals",
+ "src/features/stocks/yahooFundamentals"
]
},
"src/features/stocks/index.ts": {
- "mtimeMs": 1779764602625.2075,
- "size": 121,
- "lines": 2,
+ "mtimeMs": 1783303470010.3047,
+ "size": 179,
+ "lines": 3,
"role": "",
"imports": [
"src/features/stocks/stocksWatcher",
- "src/features/stocks/slashStocks"
+ "src/features/stocks/slashStocks",
+ "src/features/stocks/backupSync"
]
},
"src/features/stocks/llmJudge.ts": {
- "mtimeMs": 1781084049810.22,
- "size": 6072,
+ "mtimeMs": 1782808012183.4006,
+ "size": 6080,
"lines": 125,
"role": "",
"imports": [
@@ -1780,19 +2005,27 @@
"src/features/stocks/naverFundamentals"
]
},
+ "src/features/stocks/marketUtils.ts": {
+ "mtimeMs": 1782807510714.5957,
+ "size": 2810,
+ "lines": 61,
+ "role": "시장(한국/미국) 판별 + 통화·금액 포매팅 유틸. stocks 모듈 전체가 원래 한국 전용(6자리 코드, 원, 억)이었다. 미국 종목을 함께 다루려면 \"이 심볼이 어느 시장인가\"를 한 곳에서 결정해야 한다 — 심볼 모양으로 자동 판별하되, Stock.market 이 명시돼 있으면 그걸 우선한다. - KR: 6자리 숫자 코드 (예: 005930). 통화 원",
+ "imports": []
+ },
"src/features/stocks/naverFundamentals.ts": {
- "mtimeMs": 1781086142605.6724,
- "size": 8323,
- "lines": 178,
+ "mtimeMs": 1782807569417.1467,
+ "size": 9418,
+ "lines": 192,
"role": "",
"imports": [
- "src/utils"
+ "src/utils",
+ "src/features/stocks/stockSectors"
]
},
"src/features/stocks/naverScreener.ts": {
- "mtimeMs": 1779764602627.2136,
- "size": 6593,
- "lines": 151,
+ "mtimeMs": 1781498592643.6018,
+ "size": 10428,
+ "lines": 235,
"role": "",
"imports": [
"src/utils"
@@ -1812,52 +2045,65 @@
]
},
"src/features/stocks/signalClassifier.ts": {
- "mtimeMs": 1779764602628.3208,
- "size": 2818,
- "lines": 69,
+ "mtimeMs": 1782991641886.1975,
+ "size": 4017,
+ "lines": 91,
"role": "",
"imports": [
"src/features/stocks/types"
]
},
"src/features/stocks/slashStocks.ts": {
- "mtimeMs": 1781084110909.264,
- "size": 34650,
- "lines": 629,
+ "mtimeMs": 1783303470011.3147,
+ "size": 42856,
+ "lines": 737,
"role": "",
"imports": [
"src/utils",
"src/features/stocks/stocksStore",
"src/features/stocks/yahooClient",
"src/features/stocks/naverFundamentals",
+ "src/features/stocks/fundamentalsRouter",
+ "src/features/stocks/marketUtils",
"src/core/services",
"src/features/stocks/signalClassifier",
"src/features/stocks/sheetsSync",
+ "src/features/stocks/backupSync",
"src/features/stocks/llmJudge",
"src/features/stocks/telegramReport",
"src/features/stocks/stocksWatcher",
"src/features/stocks/stockDiscovery",
+ "src/features/stocks/stockSectors",
"src/features/stocks/discoveryAnalyzer",
"src/features/stocks/types"
]
},
"src/features/stocks/stockDiscovery.ts": {
- "mtimeMs": 1779769708419.8738,
- "size": 9622,
- "lines": 196,
+ "mtimeMs": 1782991459695.8474,
+ "size": 15048,
+ "lines": 270,
"role": "",
"imports": [
"src/utils",
"src/features/stocks/naverScreener",
"src/features/stocks/naverFundamentals",
"src/features/stocks/yahooClient",
+ "src/features/stocks/compositeScore",
+ "src/features/stocks/stockSectors",
"src/features/stocks/types"
]
},
+ "src/features/stocks/stockSectors.ts": {
+ "mtimeMs": 1781498544407.646,
+ "size": 6402,
+ "lines": 85,
+ "role": "섹터 분류 — /stocks discover sector <섹터> 의 그룹 정의. v2 (근본 수정): 기존엔 전 종목을 시총으로 크롤한 뒤 Fundamentals.sectorHint 로 필터했는데, 네이버 통합 API 에 우리가 찾던 industryInfo.name 필드가 없어 sectorHint 가 항상 비어 결과 0개가 나왔다. 실제로는 ① 통합 응답",
+ "imports": []
+ },
"src/features/stocks/stocksStore.ts": {
- "mtimeMs": 1779764602630.329,
- "size": 4123,
- "lines": 96,
+ "mtimeMs": 1783303470016.6572,
+ "size": 5283,
+ "lines": 123,
"role": "",
"imports": [
"src/utils",
@@ -1865,22 +2111,25 @@
]
},
"src/features/stocks/stocksWatcher.ts": {
- "mtimeMs": 1779764602630.329,
- "size": 6530,
- "lines": 163,
+ "mtimeMs": 1783907905775.5173,
+ "size": 7863,
+ "lines": 174,
"role": "",
"imports": [
+ "src/lib/kstSchedule",
"src/utils",
"src/features/stocks/stocksStore",
"src/features/stocks/yahooClient",
"src/features/stocks/telegramReport",
- "src/features/stocks/sheetsSync"
+ "src/features/stocks/signalClassifier",
+ "src/features/stocks/sheetsSync",
+ "src/integrations/telegram/messageFormat"
]
},
"src/features/stocks/telegramReport.ts": {
- "mtimeMs": 1779764602631.3562,
- "size": 5335,
- "lines": 117,
+ "mtimeMs": 1783047621187.9973,
+ "size": 8733,
+ "lines": 174,
"role": "",
"imports": [
"src/integrations/telegram/telegramClient",
@@ -1888,23 +2137,35 @@
"src/utils",
"src/features/stocks/stocksStore",
"src/features/stocks/signalClassifier",
- "src/features/stocks/types"
+ "src/features/stocks/types",
+ "src/integrations/telegram/messageFormat"
]
},
"src/features/stocks/types.ts": {
- "mtimeMs": 1779764602631.3562,
- "size": 2188,
- "lines": 53,
+ "mtimeMs": 1782991376283.1997,
+ "size": 2679,
+ "lines": 61,
"role": "Stocks 모듈 공유 타입. investresults/targetstocks.json 스키마를 그대로 받아서, ConnectAI 의 /.astra/stocks.json 으로 옮긴 뒤 같은 필드명을 유지. 한글 필드명은 사용자의 도메인 데이터라 변경하지 않는다 — 마이그레이션 충돌 회피 + 사용자가 직접 JSON 편집할 때 frictio",
"imports": []
},
"src/features/stocks/yahooClient.ts": {
- "mtimeMs": 1779856972057.0444,
- "size": 16112,
- "lines": 353,
+ "mtimeMs": 1782807552994.1555,
+ "size": 16393,
+ "lines": 358,
"role": "",
"imports": [
- "src/utils"
+ "src/utils",
+ "src/features/stocks/marketUtils"
+ ]
+ },
+ "src/features/stocks/yahooFundamentals.ts": {
+ "mtimeMs": 1782808266103.863,
+ "size": 8215,
+ "lines": 175,
+ "role": "",
+ "imports": [
+ "src/utils",
+ "src/features/stocks/naverFundamentals"
]
},
"src/features/system/handlers.ts": {
@@ -2031,6 +2292,13 @@
"src/utils"
]
},
+ "src/integrations/telegram/messageFormat.ts": {
+ "mtimeMs": 1783047550770.6475,
+ "size": 5282,
+ "lines": 121,
+ "role": "텔레그램 메시지 — 단일 포맷 모듈 (v2.2.284) 배경: 기능마다 텔레그램 메시지 포맷이 제각각(주식 보고서·매수시그널·발굴 Top5· 데일리 브리핑·이메일 알림)이라 모바일 시인성이 낮고 유지보수가 파편화됐다. wikiFormat 이 위키 문서 포맷을 통일한 것처럼, 앞으로 텔레그램으로 나가는 모든 정기/알림 메시지는 이 모듈의 renderTeleg",
+ "imports": []
+ },
"src/integrations/telegram/promptBuilders.ts": {
"mtimeMs": 1779764602632.363,
"size": 7663,
@@ -2095,9 +2363,9 @@
"imports": []
},
"src/intelligence/correctionLoop.ts": {
- "mtimeMs": 1781234941518.895,
- "size": 17684,
- "lines": 382,
+ "mtimeMs": 1783993526126.0222,
+ "size": 26580,
+ "lines": 557,
"role": "Correction Loop — 사용자 정정 1회가 시스템을 세 군데서 성장시키는 단일 파이프라인. 사용자 정정 (\"아니야, 그거 6월이야\") ① 감지(looksLikeCorrection) + LLM 오류 분류(classifyCorrection) ├→ 태깅된 레슨 저장 (lessons/ — error-tag frontmatter) └→ 회귀 케이스 적립 (",
"imports": [
"src/intelligence/llmCall",
@@ -2141,6 +2409,15 @@
"src/intelligence/confidenceEngine"
]
},
+ "src/intelligence/investigationPipeline.ts": {
+ "mtimeMs": 1784517973427.466,
+ "size": 13722,
+ "lines": 256,
+ "role": "Investigation Pipeline — \"파일명만 보고 상상하는 조사\" 를 구조적으로 차단. (v2.2.309) 문제: 소형 로컬 모델은 로 파일명 목록을 받으면 을 부르지 않고 이름에서 내용을 상상해 조사 결과를 지어낸다 (lazy tool-use 할루시네이션). 해법 3중: ① 증거 게이트 — 조사형 요청 ",
+ "imports": [
+ "src/config"
+ ]
+ },
"src/intelligence/knowledgeDecay.ts": {
"mtimeMs": 1781147140600.4475,
"size": 5151,
@@ -2174,11 +2451,13 @@
]
},
"src/intelligence/llmCall.ts": {
- "mtimeMs": 1781144318025.0918,
- "size": 2099,
- "lines": 52,
- "role": "단순 non-streaming LLM 호출 — Ollama / LM Studio(OpenAI 호환) 듀얼 엔드포인트. postHocSelfCheck 의 호출 패턴을 재사용 가능한 헬퍼로 분리. 평가 하니스·Critic 등 AgentExecutor 밖에서 LLM 1회 호출이 필요한 곳이 사용한다 (확장 명령 등). agent turn 내부에서는 agent.t",
- "imports": []
+ "mtimeMs": 1783907905783.671,
+ "size": 1378,
+ "lines": 35,
+ "role": "",
+ "imports": [
+ "src/core/services"
+ ]
},
"src/intelligence/needEngine.ts": {
"mtimeMs": 1781147322252.6475,
@@ -2204,9 +2483,9 @@
"imports": []
},
"src/intelligence/requirementGraph.ts": {
- "mtimeMs": 1781144397584.8677,
- "size": 12495,
- "lines": 273,
+ "mtimeMs": 1784518036891.6404,
+ "size": 15359,
+ "lines": 312,
"role": "Requirement Graph — 업무 유형별 필수 요소 정의 + 감지 + 커버리지 검사. Self-Evolving Digital Employee OS 마스터 플랜(docs/SELFEVOLVINGOSMASTERPLAN.md) Phase 1 / Track 2-1. 신뢰 조건 T3 \"품질이 일관적이다 — 필수 요소 누락 없음\" 담당. 동작 2단계: 1. In",
"imports": []
},
@@ -2292,6 +2571,13 @@
"src/agent"
]
},
+ "src/lib/contextBuilders/liveReasoningFilter.ts": {
+ "mtimeMs": 1784020045098.4705,
+ "size": 12755,
+ "lines": 245,
+ "role": "LiveReasoningFilter — 스트리밍 도중 모델의 내부 추론을 화면에서 차단하는 상태 기계 (per-generation 1 인스턴스, stateful). 배경: liveStreamTokens=true(기본) 라이브 스트리밍에서 <|channel|>thought … / … 같은 추론 구간이 생성 내내 그대로 노출됐다가 완",
+ "imports": []
+ },
"src/lib/contextBuilders/lmStudioSampling.ts": {
"mtimeMs": 1779764602637.9385,
"size": 1297,
@@ -2303,18 +2589,18 @@
]
},
"src/lib/contextBuilders/localProjectIntent.ts": {
- "mtimeMs": 1781240137750.4143,
- "size": 14163,
- "lines": 233,
+ "mtimeMs": 1784021179773.8223,
+ "size": 14642,
+ "lines": 234,
"role": "",
"imports": [
"src/lib/contextBuilders/promptDetection"
]
},
"src/lib/contextBuilders/localProjectPath.ts": {
- "mtimeMs": 1779764602638.9414,
- "size": 17046,
- "lines": 328,
+ "mtimeMs": 1784021166513.443,
+ "size": 17726,
+ "lines": 332,
"role": "",
"imports": [
"src/utils",
@@ -2324,9 +2610,9 @@
]
},
"src/lib/contextBuilders/memoryContext.ts": {
- "mtimeMs": 1781491584066.6763,
- "size": 25616,
- "lines": 449,
+ "mtimeMs": 1784510642205.134,
+ "size": 29407,
+ "lines": 486,
"role": "",
"imports": [
"src/agent",
@@ -2337,7 +2623,9 @@
"src/retrieval/embeddings",
"src/retrieval/brainIndex",
"src/intelligence/correctionLoop",
+ "src/intelligence/investigationPipeline",
"src/skills/agentKnowledgeMap",
+ "src/retrieval/domainRouter",
"src/retrieval/knowledgeMix",
"src/retrieval/conflictBlock",
"src/retrieval/coveBlock",
@@ -2362,9 +2650,9 @@
"imports": []
},
"src/lib/contextBuilders/multiAgentRouting.ts": {
- "mtimeMs": 1779764602639.947,
- "size": 5257,
- "lines": 96,
+ "mtimeMs": 1783907905794.681,
+ "size": 5728,
+ "lines": 103,
"role": "",
"imports": [
"src/config",
@@ -2375,9 +2663,9 @@
]
},
"src/lib/contextBuilders/outputSanitization.ts": {
- "mtimeMs": 1779764602640.9502,
- "size": 5338,
- "lines": 99,
+ "mtimeMs": 1784019840678.9001,
+ "size": 5958,
+ "lines": 108,
"role": "모델 출력 후처리 (post-stream sanitization). 모두 stateless pure transform. 1) sanitizeAssistantContent — 모델이 답변에 흘려보낸 내부 마커 (rationale, reasoning channels, Harmony/GPT-OSS 채널 마커, [PROBLEM]/[GOAL]/[REASONING] ",
"imports": []
},
@@ -2485,6 +2773,13 @@
"role": "Thinking partner response contract — system prompt 에 항상 prepend 되는 6항목 응답 규약. 100% stateless 한 정적 문자열이라 god-file agent.ts 에 박혀 있을 이유 없음. 단위 테스트 / 다른 모드에서 재사용 / contract 수정 시 변경 범위 최소화를 위해 별도 모듈로 격리. 6",
"imports": []
},
+ "src/lib/contextBuilders/toneGuard.ts": {
+ "mtimeMs": 1783907905795.6836,
+ "size": 2971,
+ "lines": 41,
+ "role": "Tone Guard — AI 상투어(클리셰) 금지 레지스트리 (v2.2.306). 배경: 잡담 턴에서 \"힘든 감정을 느끼고 계시군요. 괜찮으시다면 … 저는 언제든 여기에 있습니다.\" 같은 상담사 화법이 그대로 나왔다 (실사례). 작업 턴에는 문체 규칙(persona R1~R7)이 있지만 casual 모드는 무방비였다. 설계: 블로그v3 QA 레지스트리와 같",
+ "imports": []
+ },
"src/lib/contextBuilders/urlContext.ts": {
"mtimeMs": 1781491584068.7393,
"size": 5546,
@@ -2497,9 +2792,9 @@
]
},
"src/lib/contextManager.ts": {
- "mtimeMs": 1779764602646.58,
- "size": 13536,
- "lines": 278,
+ "mtimeMs": 1781749676103.8655,
+ "size": 14499,
+ "lines": 296,
"role": "Context Manager (컨텍스트 한계 관리) \"context length = 132k\" 는 \"답변을 132k 토큰까지 생성해도 된다\" 가 아닙니다. 시스템 프롬프트 + 대화 기록 + 입력 문서 + 생성될 답변 + 여유분 ≤ context length 이 모듈은 요청을 보내기 전에 입력 토큰을 추정하고, - 동적으로 출력 상한(maxTokens)을 계",
"imports": []
},
@@ -2536,6 +2831,13 @@
"src/config"
]
},
+ "src/lib/execUtil.ts": {
+ "mtimeMs": 1783907905795.6836,
+ "size": 4428,
+ "lines": 104,
+ "role": "",
+ "imports": []
+ },
"src/lib/formatter.ts": {
"mtimeMs": 1779764602649.5906,
"size": 4772,
@@ -2545,6 +2847,13 @@
"src/lib/engine"
]
},
+ "src/lib/kstSchedule.ts": {
+ "mtimeMs": 1783907905795.6836,
+ "size": 1955,
+ "lines": 40,
+ "role": "[코어 수렴] KST(Asia/Seoul) 스케줄 공용 유틸. 배경(2026-07-11 아키텍처 감사): stocksWatcher·dailyBriefing·sleepDigest· growthCycleWatcher 네 워처가 각각 nowInKst()/HH:MM 파싱을 복제하고 있었다. \"다음 발사까지 ms\" 계산은 정책이 제각각(복수 시각/평일만/매일/주간)",
+ "imports": []
+ },
"src/lib/mtimeFileCache.ts": {
"mtimeMs": 1780278539124.1875,
"size": 2553,
@@ -2567,10 +2876,10 @@
"imports": []
},
"src/lmstudio/client.ts": {
- "mtimeMs": 1779764602650.5938,
- "size": 11423,
- "lines": 255,
- "role": "",
+ "mtimeMs": 1783303470040.1814,
+ "size": 14371,
+ "lines": 305,
+ "role": "[메모리·기동 개선] SDK 를 타입 전용으로만 import — 값 import 는 번들 로드(=확장 활성화) 시점에 SDK 모듈 초기화를 실행시킨다. 실제 모듈 로드는 getSdk() 첫 호출 때 require 로 지연한다 (LM Studio 를 안 쓰는 세션에서는 SDK 가 아예 초기화되지 않음).",
"imports": [
"src/utils"
]
@@ -2588,9 +2897,9 @@
]
},
"src/lmstudio/streamer.ts": {
- "mtimeMs": 1779764602652.6316,
- "size": 13416,
- "lines": 252,
+ "mtimeMs": 1781849993869.691,
+ "size": 16193,
+ "lines": 301,
"role": "",
"imports": [
"src/lmstudio/client",
@@ -2699,14 +3008,24 @@
]
},
"src/retrieval/brainIndex.ts": {
- "mtimeMs": 1781171738808.4268,
- "size": 23847,
- "lines": 566,
+ "mtimeMs": 1784514647788.2046,
+ "size": 28354,
+ "lines": 645,
"role": "Brain Index — persistent, mtime-keyed tokenized cache of the Second Brain RAG 검색은 매 질의마다 브레인의 모든 .md 파일을 읽고 토크나이즈해서 TF-IDF 점수를 계산했습니다 — 파일 수가 많아지면 그게 병목입니다. 이 모듈은 /.astra/brain-index.json 에",
"imports": [
"src/retrieval/scoring",
"src/retrieval/lessonHelpers",
"src/retrieval/chunker",
+ "src/utils",
+ "src/retrieval/brainWatch"
+ ]
+ },
+ "src/retrieval/brainWatch.ts": {
+ "mtimeMs": 1784510698674.246,
+ "size": 6572,
+ "lines": 140,
+ "role": "Brain Watch — 제2뇌 파일시스템 워처 + 상주 파일 목록 캐시 (v2.2.311) 문제: 검색은 이미 mtime 키 토큰 인덱스(brain-index.json)로 파일 내용 재파싱을 피하지만, 매 질의마다 (a) 전체 디렉터리 재귀 워크(수천 파일)와 (b) 파일별 fs.statSync 수천 회를 다시 수행했다 — 인덱스가 신선한지 확인할 방법이",
+ "imports": [
"src/utils"
]
},
@@ -2737,12 +3056,13 @@
]
},
"src/retrieval/contextBudget.ts": {
- "mtimeMs": 1780654426656.6118,
- "size": 6442,
- "lines": 156,
+ "mtimeMs": 1783907905805.3337,
+ "size": 6162,
+ "lines": 146,
"role": "Context Budget Manager (컨텍스트 예산 관리) 시스템 프롬프트의 토큰 예산을 관리하여 로컬 모델의 context window를 효율적으로 활용합니다.",
"imports": [
- "src/retrieval/types"
+ "src/retrieval/types",
+ "src/lib/contextManager"
]
},
"src/retrieval/coveBlock.ts": {
@@ -2754,6 +3074,16 @@
"src/retrieval/types"
]
},
+ "src/retrieval/domainRouter.ts": {
+ "mtimeMs": 1783907905806.3352,
+ "size": 9761,
+ "lines": 163,
+ "role": "",
+ "imports": [
+ "src/config",
+ "src/utils"
+ ]
+ },
"src/retrieval/embeddings.ts": {
"mtimeMs": 1781171386826.0757,
"size": 8182,
@@ -2780,13 +3110,14 @@
]
},
"src/retrieval/index.ts": {
- "mtimeMs": 1781171760925.9387,
- "size": 37706,
- "lines": 765,
+ "mtimeMs": 1784510840914.2502,
+ "size": 39296,
+ "lines": 803,
"role": "RetrievalOrchestrator — Unified RAG Pipeline Astra의 모든 검색 소스를 통합 관리하는 오케스트레이터입니다. 검색 흐름: ① Query Planning — 의도 분류 + 검색 전략 결정 ② Parallel Search — Brain + Memory + Project + Episode 동시 검색 ③ Result Fusio",
"imports": [
"src/config",
"src/utils",
+ "src/retrieval/brainWatch",
"src/lib/paths",
"src/memory",
"src/retrieval/types",
@@ -2833,12 +3164,13 @@
"imports": []
},
"src/retrieval/semanticRerank.ts": {
- "mtimeMs": 1780030762153.9978,
- "size": 8205,
- "lines": 213,
+ "mtimeMs": 1783907905828.9187,
+ "size": 7217,
+ "lines": 183,
"role": "LLM Semantic Re-ranking — TF-IDF / 임베딩이 놓치는 의도 매치를 작은 LLM 호출 한 번으로 잡는다. 동작: 1. 1차 검색(TF-IDF + embedding + 부스트들) 결과의 상위 K (기본 15) 후보를 추출 2. 가벼운 프롬프트로 LLM 에게 \"이 중 query 의도에 가장 부합하는 순서로 ID 나열\" 요청 3. LLM ",
"imports": [
- "src/retrieval/types"
+ "src/retrieval/types",
+ "src/core/services"
]
},
"src/retrieval/terminologyBlock.ts": {
@@ -2985,18 +3317,18 @@
]
},
"src/sidebar/builders/companyTurnEmitter.ts": {
- "mtimeMs": 1779764602662.786,
- "size": 2539,
- "lines": 54,
+ "mtimeMs": 1783303470056.3555,
+ "size": 2250,
+ "lines": 50,
"role": "",
"imports": [
"src/features/company"
]
},
"src/sidebar/builders/dispatcherDepsBuilder.ts": {
- "mtimeMs": 1781491584069.7515,
- "size": 3895,
- "lines": 74,
+ "mtimeMs": 1783907905837.3777,
+ "size": 4181,
+ "lines": 77,
"role": "",
"imports": [
"src/features/company",
@@ -3068,9 +3400,9 @@
]
},
"src/sidebar/chatHandlers.ts": {
- "mtimeMs": 1779764602667.872,
- "size": 26431,
- "lines": 451,
+ "mtimeMs": 1783303470067.838,
+ "size": 25820,
+ "lines": 443,
"role": "",
"imports": [
"src/sidebarProvider",
@@ -3093,9 +3425,9 @@
]
},
"src/sidebar/companyHandlers.ts": {
- "mtimeMs": 1779764602669.881,
- "size": 18453,
- "lines": 347,
+ "mtimeMs": 1783303470077.1797,
+ "size": 17946,
+ "lines": 338,
"role": "",
"imports": [
"src/sidebarProvider",
@@ -3169,35 +3501,6 @@
"src/sidebarProvider"
]
},
- "src/sidebar/managers/pixelOfficeHelpers.ts": {
- "mtimeMs": 1779764602675.0503,
- "size": 6355,
- "lines": 156,
- "role": "",
- "imports": [
- "src/features/company",
- "src/features/astraOffice"
- ]
- },
- "src/sidebar/managers/pixelOfficeLayoutStore.ts": {
- "mtimeMs": 1779764602675.0503,
- "size": 1709,
- "lines": 37,
- "role": "",
- "imports": [
- "src/features/astraOffice"
- ]
- },
- "src/sidebar/managers/pixelOfficeState.ts": {
- "mtimeMs": 1779764602676.0718,
- "size": 3571,
- "lines": 77,
- "role": "",
- "imports": [
- "src/features/company",
- "src/features/astraOffice"
- ]
- },
"src/sidebar/managers/sessionStateStore.ts": {
"mtimeMs": 1779764602676.0718,
"size": 2914,
@@ -3217,9 +3520,9 @@
]
},
"src/sidebarProvider.ts": {
- "mtimeMs": 1781491584072.7815,
- "size": 171258,
- "lines": 3468,
+ "mtimeMs": 1783907905839.3892,
+ "size": 144400,
+ "lines": 2992,
"role": "",
"imports": [
"src/utils",
@@ -3234,15 +3537,13 @@
"src/sidebar/brainHandlers",
"src/sidebar/chronicleHandlers",
"src/sidebar/agentHandlers",
+ "src/features/datacollect/bridgeLauncher",
"src/sidebar/registry",
"src/sidebar/managers/approvalGates",
"src/sidebar/managers/architectureWatch",
"src/sidebar/managers/companyTurn",
- "src/sidebar/managers/pixelOfficeState",
- "src/sidebar/managers/pixelOfficeHelpers",
"src/sidebar/managers/chatSessionStore",
"src/sidebar/managers/modelDiscovery",
- "src/sidebar/managers/pixelOfficeLayoutStore",
"src/sidebar/builders/statusPayloads",
"src/sidebar/builders/companyPayloads",
"src/sidebar/builders/textHelpers",
@@ -3273,8 +3574,7 @@
"src/features/projectArchitecture/intentDetector",
"src/features/company",
"src/core/services",
- "src/core/health",
- "src/features/astraOffice"
+ "src/core/health"
]
},
"src/skills/agentKnowledgeMap.ts": {
@@ -3335,11 +3635,12 @@
"imports": []
},
"src/utils.ts": {
- "mtimeMs": 1781491584073.7837,
- "size": 28645,
- "lines": 485,
+ "mtimeMs": 1784510387021.152,
+ "size": 31846,
+ "lines": 538,
"role": "",
"imports": [
+ "src/lib/contextBuilders/toneGuard",
"src/config",
"src/features/selfReflector/selfReflectorPrompt"
]
@@ -3352,37 +3653,37 @@
"imports": []
},
"media/settings-panel.html": {
- "mtimeMs": 1780882658555.451,
- "size": 26332,
- "lines": 440,
+ "mtimeMs": 1783907905531.913,
+ "size": 33805,
+ "lines": 541,
"role": "Astra Settings",
"imports": []
},
"media/settings-panel.js": {
- "mtimeMs": 1780881704898.5125,
- "size": 24963,
- "lines": 505,
+ "mtimeMs": 1783303469916.4678,
+ "size": 29080,
+ "lines": 577,
"role": "",
"imports": []
},
"media/sidebar.css": {
- "mtimeMs": 1781491584030.2747,
- "size": 92327,
- "lines": 2132,
+ "mtimeMs": 1782990524722.6748,
+ "size": 80014,
+ "lines": 1957,
"role": "Stylesheet",
"imports": []
},
"media/sidebar.html": {
- "mtimeMs": 1779764602576.522,
- "size": 35100,
- "lines": 539,
+ "mtimeMs": 1783303469917.4712,
+ "size": 31988,
+ "lines": 486,
"role": "Astra",
"imports": []
},
"media/sidebar.js": {
- "mtimeMs": 1781491584032.3035,
- "size": 235630,
- "lines": 3966,
+ "mtimeMs": 1783303469919.522,
+ "size": 225448,
+ "lines": 3767,
"role": "",
"imports": []
},
@@ -3417,6 +3718,25 @@
"src/features/approval/approvalQueue"
]
},
+ "tests/benchmarkModes.test.ts": {
+ "mtimeMs": 1783907905841.424,
+ "size": 4386,
+ "lines": 77,
+ "role": "",
+ "imports": [
+ "src/features/datacollect/prompts/synthesisPrompt",
+ "src/features/datacollect/handlers"
+ ]
+ },
+ "tests/brainCache.test.ts": {
+ "mtimeMs": 1784514661036.7358,
+ "size": 4442,
+ "lines": 98,
+ "role": "[v2.2.311] 제2뇌 상주 캐시 계층 — 워처 세대 기반 stat 생략 + 파일 목록 캐시. 핵심 계약: 1. 워처 세대가 그대로면 getBrainTokenIndex 는 파일별 statSync 를 생략한다. 2. 세대가 바뀌면(파일시스템 변경) 다시 stat 을 거쳐 변경분을 재색인한다. 3. 부분(스코프) 목록으로 검증된 상태에서 전체 목록 질의가 ",
+ "imports": [
+ "src/retrieval/brainIndex"
+ ]
+ },
"tests/brainIndex.test.ts": {
"mtimeMs": 1778664139970.806,
"size": 5513,
@@ -3426,6 +3746,35 @@
"src/retrieval/brainIndex"
]
},
+ "tests/bridgeLauncher.test.ts": {
+ "mtimeMs": 1783303470100.9182,
+ "size": 2711,
+ "lines": 59,
+ "role": "bridgeLauncher — NotebookLM 로컬 백엔드 원클릭 실행/종료의 순수 로직 검증. (터미널 생성·프로세스 kill 같은 부수효과는 VS Code/OS 의존이라 여기선 순수 함수만.)",
+ "imports": [
+ "src/features/datacollect/bridgeLauncher"
+ ]
+ },
+ "tests/buySignalWatch.test.ts": {
+ "mtimeMs": 1782991594594.8955,
+ "size": 3799,
+ "lines": 80,
+ "role": "v2.2.268 — 발굴 자동 편입 + 매수 시그널 진입 알림. - computeRecommendedBuy: 224일선 기반 매수권장가 자동 산출 규칙 - detectBuyZoneEntries: 관망/고평가 → 매수사정권 전이 감지 + 중복 알림 방지",
+ "imports": [
+ "src/features/stocks/stockDiscovery",
+ "src/features/stocks/signalClassifier",
+ "src/features/stocks/types"
+ ]
+ },
+ "tests/calculateAction.test.ts": {
+ "mtimeMs": 1783303470100.9182,
+ "size": 3760,
+ "lines": 77,
+ "role": " 액션 — 수학·수치 계산의 Python 위임 검증. 소형 모델 추론 강화 전략의 1축: \"모델은 코드로 변환만, 계산은 도구가\". 실행 결과/에러가 chatHistory 에 internal system 메시지로 재주입되어 agent 의 자동 후속 턴(자가수정 루프)을 트리거하는 계약을 검증한다.",
+ "imports": [
+ "src/agent/actions/calculate"
+ ]
+ },
"tests/calendarApi.test.ts": {
"mtimeMs": 1779065453894.5227,
"size": 5234,
@@ -3436,6 +3785,35 @@
"src/agent"
]
},
+ "tests/claudeCodeProvider.test.ts": {
+ "mtimeMs": 1783907905841.424,
+ "size": 3847,
+ "lines": 73,
+ "role": "",
+ "imports": [
+ "src/features/providers/claudeCode",
+ "src/features/providers/types"
+ ]
+ },
+ "tests/compositeScore.test.ts": {
+ "mtimeMs": 1782985309397.3916,
+ "size": 6070,
+ "lines": 131,
+ "role": "멀티팩터 합성점수 (v2.2.266) — 백분위 랭크·축 합성·value trap 가드·결측 처리.",
+ "imports": [
+ "src/features/stocks/compositeScore"
+ ]
+ },
+ "tests/computeBudgetedRequest.test.ts": {
+ "mtimeMs": 1784512466208.8608,
+ "size": 7291,
+ "lines": 147,
+ "role": "Phase 1 — context-window alignment. The budgeter must clamp to the model's ACTUALLY-loaded window when it's smaller than the user's contextLength setting, so a model loaded with a smaller window than ",
+ "imports": [
+ "src/agent/handlePrompt/computeBudgetedRequest",
+ "src/agent"
+ ]
+ },
"tests/confidenceEngine.test.ts": {
"mtimeMs": 1781142599349.454,
"size": 7643,
@@ -3460,9 +3838,9 @@
]
},
"tests/contextManager.test.ts": {
- "mtimeMs": 1779764602681.109,
- "size": 7904,
- "lines": 149,
+ "mtimeMs": 1781750094293.5898,
+ "size": 8739,
+ "lines": 166,
"role": "",
"imports": [
"src/lib/contextManager"
@@ -3508,6 +3886,37 @@
"src/features/devilAgent/devilPrompt"
]
},
+ "tests/domainRouter.test.ts": {
+ "mtimeMs": 1783907905842.4282,
+ "size": 4261,
+ "lines": 81,
+ "role": "단계별 지식 스코프 라우터 — 도메인 분류(휴리스틱)와 폴더 조합 규칙 검증. 소형 모델 정밀 검색의 핵심 계약: 확신 없으면 'general'(전체 두뇌)로 보수적 폴백.",
+ "imports": [
+ "src/retrieval/domainRouter"
+ ]
+ },
+ "tests/emailCommand.test.ts": {
+ "mtimeMs": 1783070268777.1526,
+ "size": 14593,
+ "lines": 282,
+ "role": "v2.2.269 — /email (Gmail + Outlook) 순수 로직 테스트. COM/네트워크는 통합 영역이라 제외 — 참조 파싱·프롬프트·트랜스크립트 컷만 고정.",
+ "imports": [
+ "src/features/email/handlers",
+ "src/features/email/emailPrompts",
+ "src/features/email/emailBrief",
+ "src/features/datacollect/prompts/wikifyPrompt"
+ ]
+ },
+ "tests/emailState.test.ts": {
+ "mtimeMs": 1783070250484.7273,
+ "size": 6032,
+ "lines": 121,
+ "role": "v2.2.271 — 이메일 영속 상태 머신 (syncThreads / detectOverdue / setThreadState). \"명령 안 쳐도 f/u 되는\" 핵심 로직: 창 밖 미회신 보존, done 자동 재개, 알림 중복 차단.",
+ "imports": [
+ "src/features/email/emailState",
+ "src/features/email/emailBrief"
+ ]
+ },
"tests/featureInventory.test.ts": {
"mtimeMs": 1781232120081.0696,
"size": 2613,
@@ -3527,6 +3936,17 @@
"src/utils"
]
},
+ "tests/handoffDoc.test.ts": {
+ "mtimeMs": 1783907905842.4282,
+ "size": 4471,
+ "lines": 85,
+ "role": "",
+ "imports": [
+ "src/features/datacollect/prompts/handoffDoc",
+ "src/features/claude/claudeLauncher",
+ "src/features/datacollect/handlers"
+ ]
+ },
"tests/hangulHygiene.test.ts": {
"mtimeMs": 1781239721715.7893,
"size": 2573,
@@ -3573,6 +3993,15 @@
"src/utils"
]
},
+ "tests/investigationPipeline.test.ts": {
+ "mtimeMs": 1784518245844.1465,
+ "size": 9847,
+ "lines": 193,
+ "role": "Investigation Pipeline — 파일명만 보고 상상하는 헛조사 차단 3중 방어. (v2.2.309) ① 조사형 요청 감지 + 증거 게이트 ② 강제 정독 Map + 해시 캐시 ③ Hollow 감지",
+ "imports": [
+ "src/intelligence/investigationPipeline"
+ ]
+ },
"tests/knowledgeOps.test.ts": {
"mtimeMs": 1781147477013.794,
"size": 8035,
@@ -3586,6 +4015,25 @@
"src/intelligence/orgMemoryBlock"
]
},
+ "tests/largeInputMapReduce.test.ts": {
+ "mtimeMs": 1781859199266.967,
+ "size": 5692,
+ "lines": 159,
+ "role": "Phase 2 — large-input map-reduce core. Pure orchestration with an injected callLLM, so no network / SDK is touched.",
+ "imports": [
+ "src/agent/handlePrompt/largeInputMapReduce",
+ "src/agent"
+ ]
+ },
+ "tests/layoutSkeleton.test.ts": {
+ "mtimeMs": 1783907905843.555,
+ "size": 3698,
+ "lines": 82,
+ "role": "",
+ "imports": [
+ "src/features/datacollect/prompts/layoutSkeleton"
+ ]
+ },
"tests/lessonHelpers.test.ts": {
"mtimeMs": 1778664139972.9592,
"size": 9591,
@@ -3606,10 +4054,20 @@
"src/retrieval/scoring"
]
},
+ "tests/liveReasoningFilter.test.ts": {
+ "mtimeMs": 1784020067983.2505,
+ "size": 6485,
+ "lines": 136,
+ "role": "",
+ "imports": [
+ "src/lib/contextBuilders/liveReasoningFilter",
+ "src/lib/contextBuilders/outputSanitization"
+ ]
+ },
"tests/lmStudioLifecycle.test.ts": {
- "mtimeMs": 1780971798141.8428,
- "size": 12218,
- "lines": 330,
+ "mtimeMs": 1781850184023.6704,
+ "size": 12337,
+ "lines": 334,
"role": "Unit tests for ModelLifecycleManager. Strategy: inject mock ILMStudioClient and a simple in-memory IActivityTracker. No real LM Studio or SDK is touched — the manager file does not import the SDK dire",
"imports": [
"src/lmstudio/lifecycleManager",
@@ -3618,9 +4076,9 @@
]
},
"tests/lmStudioStreamer.test.ts": {
- "mtimeMs": 1779764602685.173,
- "size": 9010,
- "lines": 222,
+ "mtimeMs": 1781857400907.7202,
+ "size": 12802,
+ "lines": 295,
"role": "Unit tests for LMStudioStreamer. Strategy: inject a fake ILMStudioClient that returns a fake model handle whose respond() yields a controllable async iterable. No real SDK or WebSocket touched.",
"imports": [
"src/lmstudio/streamer",
@@ -3646,13 +4104,33 @@
"src/lib/contextBuilders/multiAgentRouting"
]
},
+ "tests/meetPrompt.test.ts": {
+ "mtimeMs": 1782114707092.5818,
+ "size": 3643,
+ "lines": 75,
+ "role": "Regression guard for the /meet prompt policy (v2.2.258). After a real meeting record review, the policy shifted to: 1) STT speaker numbers (\"참석자 N\") must NEVER appear in output — speakers are normaliz",
+ "imports": [
+ "src/features/datacollect/prompts/meetPrompt"
+ ]
+ },
"tests/meetRegistration.test.ts": {
- "mtimeMs": 1781162418444.7136,
- "size": 5116,
- "lines": 110,
+ "mtimeMs": 1782980521369.3323,
+ "size": 11673,
+ "lines": 232,
"role": "/meet 확신 게이트 — 분류·confirm 파싱·날짜 정규화 테스트. 정책: 확정+기한만 자동, 진행미정/기한미정/조건부는 보류, 반복은 첫 1회, 과거 날짜는 등록하되 완료확인 표기, 기한 해석 불가 확정건은 보류(추측 등록 금지).",
"imports": [
- "src/features/datacollect/scheduling/meetRegistration"
+ "src/features/datacollect/scheduling/meetRegistration",
+ "src/features/datacollect/scheduling/calendarHelpers",
+ "src/features/datacollect/llm"
+ ]
+ },
+ "tests/messageFormat.test.ts": {
+ "mtimeMs": 1783047877232.4934,
+ "size": 2488,
+ "lines": 56,
+ "role": "v2.2.284 — 텔레그램 중앙 포맷 (renderTelegram / parseTimesCsv). 위키 포맷처럼 메시지 포맷도 단일 모듈 — 모든 발신 빌더가 이 규약을 공유한다.",
+ "imports": [
+ "src/integrations/telegram/messageFormat"
]
},
"tests/mocks/vscode.js": {
@@ -3674,17 +4152,6 @@
"src/intelligence/reflectionStore"
]
},
- "tests/officeSchema.test.ts": {
- "mtimeMs": 1779065453896.7021,
- "size": 10125,
- "lines": 241,
- "role": "",
- "imports": [
- "src/features/astraOffice/schema",
- "src/features/astraOffice/view/layoutSchema",
- "src/features/astraOffice/presenter"
- ]
- },
"tests/paths.test.ts": {
"mtimeMs": 1778549008931.3582,
"size": 2674,
@@ -3730,6 +4197,16 @@
"src/scaffolder/projectScaffolder"
]
},
+ "tests/promptSplit.test.ts": {
+ "mtimeMs": 1784512099524.3313,
+ "size": 2832,
+ "lines": 60,
+ "role": "[v2.2.311] KV 캐시 친화 프롬프트 분리 — 정적/동적 경계 계약. 정적 프롬프트(getStaticSystemPrompt)에 분 단위 시각 같은 가변 요소가 섞이는 순간 llama.cpp prompt cache 는 요청 첫 토큰부터 무효화된다 (실측: 13k 토큰 전체 재프리필 ≈ 90초/턴). 이 테스트는 그 회귀를 막는 가드레일이다.",
+ "imports": [
+ "src/utils",
+ "src/agent/handlePrompt/buildAstraModeSystemPrompt"
+ ]
+ },
"tests/providers.test.ts": {
"mtimeMs": 1779065453898.3752,
"size": 4215,
@@ -3740,10 +4217,20 @@
"src/features/providers/streamHelpers"
]
},
+ "tests/reportQa.test.ts": {
+ "mtimeMs": 1783907905844.559,
+ "size": 6419,
+ "lines": 115,
+ "role": "",
+ "imports": [
+ "src/agents/reportQa",
+ "src/core/services"
+ ]
+ },
"tests/requirementGraph.test.ts": {
- "mtimeMs": 1781140474254.644,
- "size": 5535,
- "lines": 126,
+ "mtimeMs": 1784518137093.2422,
+ "size": 6828,
+ "lines": 146,
"role": "Requirement Graph (Self-Evolving OS Phase 1 / Track 2-1) 단위 테스트. 순수 함수만 검증 — vscode 의존 없음.",
"imports": [
"src/intelligence/requirementGraph"
@@ -3814,6 +4301,25 @@
"src/retrieval/embeddings"
]
},
+ "tests/reviewFiles.test.ts": {
+ "mtimeMs": 1781772012554.227,
+ "size": 1784,
+ "lines": 39,
+ "role": "/review 소스 파일 수집 판정(shouldReviewFile) 테스트 — 디렉터리 스킵·확장자 필터·생성물 제외의 결정적 동작을 고정한다.",
+ "imports": [
+ "src/features/datacollect/reviewFiles"
+ ]
+ },
+ "tests/runCodeAction.test.ts": {
+ "mtimeMs": 1783303470102.9253,
+ "size": 4323,
+ "lines": 87,
+ "role": " 액션 — 코딩 피드백 루프(\"생성→실행→에러 확인→수정\")의 실행 축 검증. stdout/stderr/종료코드가 internal system 메시지로 재주입되어 자동 후속 턴을 트리거하는 계약 + 샌드박스(워크스페이스 밖 차단)·확장자 화이트리스트 검증.",
+ "imports": [
+ "src/agent/actions/runCode",
+ "src/features/selfReflector/selfReflectorExecution"
+ ]
+ },
"tests/scoring.test.ts": {
"mtimeMs": 1778043314856.5872,
"size": 6189,
@@ -3883,16 +4389,52 @@
"src/features/growth/sleepDigest"
]
},
+ "tests/standingRules.test.ts": {
+ "mtimeMs": 1783998325550.8562,
+ "size": 7566,
+ "lines": 151,
+ "role": "Standing Rules (Correction Loop ④) — 행동/스타일 교정의 세션 영속화. (v2.2.308) 배경: self-reflection 이 컨텍스트 창(단기 기억)에 갇혀 새 세션에서 증발하는 문제. 행동 지적 → 명령형 규칙 파일 영속화 → 매 턴 주입으로 구조적으로 해결한다.",
+ "imports": [
+ "src/intelligence/correctionLoop"
+ ]
+ },
"tests/stocksCriteria.test.ts": {
- "mtimeMs": 1781086406001.8665,
- "size": 7191,
- "lines": 129,
+ "mtimeMs": 1782808065196.9604,
+ "size": 9540,
+ "lines": 169,
"role": "criteriaEval — /stocks judge 결정론 평가기 테스트. 픽스처는 옛 LLM 프롬프트에 명시돼 있던 사용자의 실제 분류 예시 3종 (마녀공장/기가비스/엔켐) — 코드 판정이 사용자 패턴과 일치해야 한다.",
"imports": [
"src/features/stocks/criteriaEval",
"src/features/stocks/types"
]
},
+ "tests/stockSectors.test.ts": {
+ "mtimeMs": 1781498750479.192,
+ "size": 2439,
+ "lines": 51,
+ "role": "섹터 분류·해석 (네이버 업종 코드 기반) — 순수 로직 테스트.",
+ "imports": [
+ "src/features/stocks/stockSectors"
+ ]
+ },
+ "tests/stocksMarket.test.ts": {
+ "mtimeMs": 1782808086891.9287,
+ "size": 1928,
+ "lines": 47,
+ "role": "marketUtils — 시장 판별 + 통화/금액 포매팅 테스트.",
+ "imports": [
+ "src/features/stocks/marketUtils"
+ ]
+ },
+ "tests/stripForDisplay.test.ts": {
+ "mtimeMs": 1784518266786.891,
+ "size": 1749,
+ "lines": 35,
+ "role": "[v2.2.312] 중간 라운드 표시용 액션 태그 제거 — \"## 4.부터 시작하는 보고서\" 버그의 표시 경로 헬퍼. 태그는 걷어내되 본문 섹션은 보존해야 한다.",
+ "imports": [
+ "src/agent/actions/stripForDisplay"
+ ]
+ },
"tests/systemPrompt.test.ts": {
"mtimeMs": 1779764602687.5603,
"size": 1487,
@@ -3932,6 +4474,16 @@
"src/integrations/telegram/types"
]
},
+ "tests/toneGuard.test.ts": {
+ "mtimeMs": 1783907905844.559,
+ "size": 1251,
+ "lines": 27,
+ "role": "",
+ "imports": [
+ "src/lib/contextBuilders/toneGuard",
+ "src/utils"
+ ]
+ },
"tests/transaction.test.ts": {
"mtimeMs": 1777511752614.9685,
"size": 2132,
@@ -3970,6 +4522,25 @@
"src/features/web/webFetch"
]
},
+ "tests/wikiFormat.test.ts": {
+ "mtimeMs": 1783044027299.6238,
+ "size": 3405,
+ "lines": 64,
+ "role": "v2.2.278 — 위키 문서 포맷 통일 (봉투 + 공용 빌더).",
+ "imports": [
+ "src/features/datacollect/wikiFormat",
+ "src/features/datacollect/prompts/wikifyPrompt"
+ ]
+ },
+ "tests/wikiSave.test.ts": {
+ "mtimeMs": 1783909149425.9817,
+ "size": 3823,
+ "lines": 86,
+ "role": "v2.2.273 — 지식 문서 로컬 저장 (순수 로직: 파일명 안전화 + 저장 폴더 우선순위).",
+ "imports": [
+ "src/features/datacollect/wikiSave"
+ ]
+ },
"core_py/events.py": {
"mtimeMs": 1778028987265.2336,
"size": 2438,
@@ -4274,8 +4845,8 @@
"imports": []
},
"docs/records/ConnectAI/chronicle.config.json": {
- "mtimeMs": 1781491609540.5498,
- "size": 427,
+ "mtimeMs": 1784521189700.969,
+ "size": 371,
"lines": 11,
"role": "JSON configuration",
"imports": []
@@ -5127,6 +5698,27 @@
"role": "Discussion: 우리 개발실은 가우시안 스필리터, 그리고 월마트에서 이머시브 스토어, 그리고 ai로 영상, 사운드 제작팀이 있어. 인원은 30명정도야. 여기에는...",
"imports": []
},
+ "docs/records/ConnectAI/discussions/2026-07-20_e-wiki-connectai-프로젝트를-분석하고-구조에-대해서-설명해줘-2.md": {
+ "mtimeMs": 1784509596722.4983,
+ "size": 514,
+ "lines": 16,
+ "role": "Discussion: E:\\Wiki\\connectai 프로젝트를 분석하고 구조에 대해서 설명해줘",
+ "imports": []
+ },
+ "docs/records/ConnectAI/discussions/2026-07-20_e-wiki-connectai-프로젝트를-분석하고-구조에-대해서-설명해줘.md": {
+ "mtimeMs": 1784509560559.7527,
+ "size": 478,
+ "lines": 16,
+ "role": "Discussion: E:\\Wiki\\connectai 프로젝트를 분석하고 구조에 대해서 설명해줘",
+ "imports": []
+ },
+ "docs/records/ConnectAI/discussions/2026-07-20_e-wiki-connectai-프로젝트를-분석하고-어떻게-되어-있는지-보고해줘.md": {
+ "mtimeMs": 1784517524749.3547,
+ "size": 1455,
+ "lines": 16,
+ "role": "Discussion: E:\\Wiki\\connectai 프로젝트를 분석하고 어떻게 되어 있는지 보고해줘.",
+ "imports": []
+ },
"docs/records/ConnectAI/planning/2026-05-02_project-chronicle-guard.md": {
"mtimeMs": 1778028987339.2349,
"size": 3004,
@@ -5191,9 +5783,9 @@
"imports": []
},
"docs/records/ConnectAI/timeline.md": {
- "mtimeMs": 1781249962707.1494,
- "size": 26348,
- "lines": 422,
+ "mtimeMs": 1784517524755.3872,
+ "size": 26819,
+ "lines": 431,
"role": "Project Timeline",
"imports": []
},
@@ -5224,6 +5816,16 @@
"lines": 44,
"role": "UX/UI Consistency Guidelines",
"imports": []
+ },
+ "docs/WIKI_DOC_PIPELINE.md": {
+ "mtimeMs": 1783044003020.7932,
+ "size": 3324,
+ "lines": 60,
+ "role": "위키 문서 파이프라인 — 포맷 통일 규약 (v2.2.278)",
+ "imports": [
+ "datacollect/wikiFormat",
+ "datacollect/wikiSave"
+ ]
}
}
}
\ No newline at end of file
diff --git a/.astra/tests/engine/.astra/cache/7fa9e2c0ed212d5dbde1172e996cde86955f34dda22a6e02b95c9adc0a456927.json b/.astra/tests/engine/.astra/cache/7fa9e2c0ed212d5dbde1172e996cde86955f34dda22a6e02b95c9adc0a456927.json
index d44548b..56a59ef 100644
--- a/.astra/tests/engine/.astra/cache/7fa9e2c0ed212d5dbde1172e996cde86955f34dda22a6e02b95c9adc0a456927.json
+++ b/.astra/tests/engine/.astra/cache/7fa9e2c0ed212d5dbde1172e996cde86955f34dda22a6e02b95c9adc0a456927.json
@@ -1,5 +1,5 @@
{
"result": "직답 결과 — single-pass mock 응답입니다.",
- "createdAt": 1784020111869,
+ "createdAt": 1784521057661,
"modelVersion": "unknown"
}
\ No newline at end of file
diff --git a/.astra/tests/engine/.astra/cache/8c208151bed9108b665cd93e98fc10d377a9fef641dd359504b8d53aecd0a4c3.json b/.astra/tests/engine/.astra/cache/8c208151bed9108b665cd93e98fc10d377a9fef641dd359504b8d53aecd0a4c3.json
index fbc0c9c..00b8d6e 100644
--- a/.astra/tests/engine/.astra/cache/8c208151bed9108b665cd93e98fc10d377a9fef641dd359504b8d53aecd0a4c3.json
+++ b/.astra/tests/engine/.astra/cache/8c208151bed9108b665cd93e98fc10d377a9fef641dd359504b8d53aecd0a4c3.json
@@ -1,5 +1,5 @@
{
- "result": "---\nid: wiki_on\ndate: 2026-07-14T09:08:31.873Z\ntype: knowledge_artifact\nstandard: P-Reinforce v3.0\ntags: [automated, connect_ai, brain_sync]\n---\n\n## 📌 Brief Summary\n직답 결과 — single-pass mock 응답입니다.\n\n직답 결과 — single-pass mock 응답입니다.\n---\n## 🛡️ Reliability & Audit Summary\n> [!NOTE]\n> 이 문서는 ConnectAI의 **Intelligent Resilience** 엔진에 의해 검증 및 정제되었습니다.\n\n| Metric | Value | Status |\n| :--- | :--- | :--- |\n| **Conflict Risk** | `0/100` | ✅ Low |\n| **Fallbacks Used** | `0` | ✅ None |\n| **Auto Retries** | `0` | ✅ Stable |\n| **Deduplication** | `0` | Standard |\n| **Processing Time** | `0.0s` | ✅ Fast |\n\n### 🔍 Decision Audit Trail\n- **[DIRECT]** 답변 작성 중... (단일 호출 fast-path) (18ms)\n",
- "createdAt": 1784020111873,
+ "result": "---\nid: wiki_on\ndate: 2026-07-20T04:17:37.663Z\ntype: knowledge_artifact\nstandard: P-Reinforce v3.0\ntags: [automated, connect_ai, brain_sync]\n---\n\n## 📌 Brief Summary\n직답 결과 — single-pass mock 응답입니다.\n\n직답 결과 — single-pass mock 응답입니다.\n---\n## 🛡️ Reliability & Audit Summary\n> [!NOTE]\n> 이 문서는 ConnectAI의 **Intelligent Resilience** 엔진에 의해 검증 및 정제되었습니다.\n\n| Metric | Value | Status |\n| :--- | :--- | :--- |\n| **Conflict Risk** | `0/100` | ✅ Low |\n| **Fallbacks Used** | `0` | ✅ None |\n| **Auto Retries** | `0` | ✅ Stable |\n| **Deduplication** | `0` | Standard |\n| **Processing Time** | `0.0s` | ✅ Fast |\n\n### 🔍 Decision Audit Trail\n- **[DIRECT]** 답변 작성 중... (단일 호출 fast-path) (18ms)\n",
+ "createdAt": 1784521057663,
"modelVersion": "unknown"
}
\ No newline at end of file
diff --git a/.astra/tests/engine/.astra/missions/wiki_on.json b/.astra/tests/engine/.astra/missions/wiki_on.json
index b50d13d..a0c1b15 100644
--- a/.astra/tests/engine/.astra/missions/wiki_on.json
+++ b/.astra/tests/engine/.astra/missions/wiki_on.json
@@ -1,8 +1,8 @@
{
"missionId": "wiki_on",
"status": "completed",
- "startTime": "2026-07-14T09:08:31.847Z",
- "totalElapsedMs": 27,
+ "startTime": "2026-07-20T04:17:37.641Z",
+ "totalElapsedMs": 24,
"results": {
"direct": "직답 결과 — single-pass mock 응답입니다."
},
@@ -14,14 +14,14 @@
"to": "direct",
"durationMs": 18,
"message": "답변 작성 중... (단일 호출 fast-path)",
- "ts": "2026-07-14T09:08:31.865Z"
+ "ts": "2026-07-20T04:17:37.659Z"
},
{
"from": "direct",
"to": "completed",
- "durationMs": 9,
+ "durationMs": 5,
"message": "미션 완료",
- "ts": "2026-07-14T09:08:31.874Z"
+ "ts": "2026-07-20T04:17:37.664Z"
}
],
"resilienceMetrics": {
diff --git a/.astra/tests/stress/.astra/cache/21818066876cbf8515758bc351bb3d9d44f32b0e4cd024b2e055db3a0d34417e.json b/.astra/tests/stress/.astra/cache/21818066876cbf8515758bc351bb3d9d44f32b0e4cd024b2e055db3a0d34417e.json
index 2285c53..6f27ec7 100644
--- a/.astra/tests/stress/.astra/cache/21818066876cbf8515758bc351bb3d9d44f32b0e4cd024b2e055db3a0d34417e.json
+++ b/.astra/tests/stress/.astra/cache/21818066876cbf8515758bc351bb3d9d44f32b0e4cd024b2e055db3a0d34417e.json
@@ -1,5 +1,5 @@
{
"result": "Final report with inconsistencies. This should be long enough to pass validation.",
- "createdAt": 1784020117514,
+ "createdAt": 1784521065426,
"modelVersion": "unknown"
}
\ No newline at end of file
diff --git a/.astra/tests/stress/.astra/cache/4fc755e372f1dd80d6bffc7b2ef973124fb64ba505f767c53a783833bbc3fa6a.json b/.astra/tests/stress/.astra/cache/4fc755e372f1dd80d6bffc7b2ef973124fb64ba505f767c53a783833bbc3fa6a.json
index 0b84f83..694f01f 100644
--- a/.astra/tests/stress/.astra/cache/4fc755e372f1dd80d6bffc7b2ef973124fb64ba505f767c53a783833bbc3fa6a.json
+++ b/.astra/tests/stress/.astra/cache/4fc755e372f1dd80d6bffc7b2ef973124fb64ba505f767c53a783833bbc3fa6a.json
@@ -1,5 +1,5 @@
{
"result": "Final report with inconsistencies. This should be long enough to pass validation.",
- "createdAt": 1784020117513,
+ "createdAt": 1784521065425,
"modelVersion": "unknown"
}
\ No newline at end of file
diff --git a/.astra/tests/stress/.astra/cache/6e559207c4542d959700ff14f360e6575e54853929e991e579e318f2f5a19030.json b/.astra/tests/stress/.astra/cache/6e559207c4542d959700ff14f360e6575e54853929e991e579e318f2f5a19030.json
index 24683a5..ed33d27 100644
--- a/.astra/tests/stress/.astra/cache/6e559207c4542d959700ff14f360e6575e54853929e991e579e318f2f5a19030.json
+++ b/.astra/tests/stress/.astra/cache/6e559207c4542d959700ff14f360e6575e54853929e991e579e318f2f5a19030.json
@@ -1,5 +1,5 @@
{
"result": "[{\"heading\":\"본문\",\"scope\":\"전체 답변\"}]",
- "createdAt": 1784020117508,
+ "createdAt": 1784521065420,
"modelVersion": "unknown"
}
\ No newline at end of file
diff --git a/.astra/tests/stress/.astra/cache/f65136cebc95448a7e93a45745cb73b3a5a01af5d82391ec29a25bd72b8239a5.json b/.astra/tests/stress/.astra/cache/f65136cebc95448a7e93a45745cb73b3a5a01af5d82391ec29a25bd72b8239a5.json
index e0c921c..d901206 100644
--- a/.astra/tests/stress/.astra/cache/f65136cebc95448a7e93a45745cb73b3a5a01af5d82391ec29a25bd72b8239a5.json
+++ b/.astra/tests/stress/.astra/cache/f65136cebc95448a7e93a45745cb73b3a5a01af5d82391ec29a25bd72b8239a5.json
@@ -1,5 +1,5 @@
{
"result": "[CONFLICT WARNING] 성능이 200% 증가했습니다. vs 그러나 동시에 50% 감소했습니다. 최적화와 성능 저하가 동시에 발견됨.",
- "createdAt": 1784020117511,
+ "createdAt": 1784521065423,
"modelVersion": "unknown"
}
\ No newline at end of file
diff --git a/.astra/tests/stress/.astra/missions/stress_conflict_1784020117492.json b/.astra/tests/stress/.astra/missions/stress_conflict_1784521065403.json
similarity index 78%
rename from .astra/tests/stress/.astra/missions/stress_conflict_1784020117492.json
rename to .astra/tests/stress/.astra/missions/stress_conflict_1784521065403.json
index 8db9565..c7390a8 100644
--- a/.astra/tests/stress/.astra/missions/stress_conflict_1784020117492.json
+++ b/.astra/tests/stress/.astra/missions/stress_conflict_1784521065403.json
@@ -1,8 +1,8 @@
{
- "missionId": "stress_conflict_1784020117492",
+ "missionId": "stress_conflict_1784521065403",
"status": "completed",
- "startTime": "2026-07-14T09:08:37.493Z",
- "totalElapsedMs": 22,
+ "startTime": "2026-07-20T04:17:45.404Z",
+ "totalElapsedMs": 23,
"results": {
"outline": "[{\"heading\":\"본문\",\"scope\":\"전체 답변\"}]",
"section_0": "[CONFLICT WARNING] 성능이 200% 증가했습니다. vs 그러나 동시에 50% 감소했습니다. 최적화와 성능 저하가 동시에 발견됨.",
@@ -14,30 +14,30 @@
{
"from": "idle",
"to": "outline",
- "durationMs": 14,
+ "durationMs": 15,
"message": "답변 구조 잡는 중...",
- "ts": "2026-07-14T09:08:37.507Z"
+ "ts": "2026-07-20T04:17:45.419Z"
},
{
"from": "outline",
"to": "section",
"durationMs": 3,
"message": "본문 작성 중...",
- "ts": "2026-07-14T09:08:37.510Z"
+ "ts": "2026-07-20T04:17:45.422Z"
},
{
"from": "section",
"to": "polish",
"durationMs": 2,
"message": "최종 다듬기 중...",
- "ts": "2026-07-14T09:08:37.512Z"
+ "ts": "2026-07-20T04:17:45.424Z"
},
{
"from": "polish",
"to": "completed",
"durationMs": 3,
"message": "미션 완료",
- "ts": "2026-07-14T09:08:37.515Z"
+ "ts": "2026-07-20T04:17:45.427Z"
}
],
"resilienceMetrics": {
diff --git a/docs/records/ConnectAI/chronicle.config.json b/docs/records/ConnectAI/chronicle.config.json
index dc88ffb..65fdab3 100644
--- a/docs/records/ConnectAI/chronicle.config.json
+++ b/docs/records/ConnectAI/chronicle.config.json
@@ -7,5 +7,5 @@
"corePurpose": "",
"detailLevel": "standard",
"createdAt": "2026-05-20T09:42:40.003Z",
- "updatedAt": "2026-06-15T03:00:02.383Z"
+ "updatedAt": "2026-07-20T04:19:49.700Z"
}
diff --git a/docs/records/ConnectAI/discussions/2026-07-20_e-wiki-connectai-프로젝트를-분석하고-구조에-대해서-설명해줘-2.md b/docs/records/ConnectAI/discussions/2026-07-20_e-wiki-connectai-프로젝트를-분석하고-구조에-대해서-설명해줘-2.md
new file mode 100644
index 0000000..ba80a81
--- /dev/null
+++ b/docs/records/ConnectAI/discussions/2026-07-20_e-wiki-connectai-프로젝트를-분석하고-구조에-대해서-설명해줘-2.md
@@ -0,0 +1,16 @@
+# Discussion: E:\Wiki\connectai 프로젝트를 분석하고 구조에 대해서 설명해줘
+
+## User Request Summary
+E:\Wiki\connectai 프로젝트를 분석하고 구조에 대해서 설명해줘
+
+## Interpreted Intent
+Capture a meaningful project discussion automatically instead of requiring manual record selection.
+
+## Questions
+No explicit question was captured.
+
+## Main Discussion
+- E:\Wiki\connectai 프로젝트를 분석하고 구조에 대해서 설명해줘
+
+## Decisions
+No decisions captured yet.
diff --git a/docs/records/ConnectAI/discussions/2026-07-20_e-wiki-connectai-프로젝트를-분석하고-구조에-대해서-설명해줘.md b/docs/records/ConnectAI/discussions/2026-07-20_e-wiki-connectai-프로젝트를-분석하고-구조에-대해서-설명해줘.md
new file mode 100644
index 0000000..76636c4
--- /dev/null
+++ b/docs/records/ConnectAI/discussions/2026-07-20_e-wiki-connectai-프로젝트를-분석하고-구조에-대해서-설명해줘.md
@@ -0,0 +1,16 @@
+# Discussion: E:\Wiki\connectai 프로젝트를 분석하고 구조에 대해서 설명해줘
+
+## User Request Summary
+E:\Wiki\connectai 프로젝트를 분석하고 구조에 대해서 설명해줘
+
+## Interpreted Intent
+Capture a meaningful project discussion automatically instead of requiring manual record selection.
+
+## Questions
+No explicit question was captured.
+
+## Main Discussion
+- 반가워요. 어떻게 도와드릴까요?
+
+## Decisions
+No decisions captured yet.
diff --git a/docs/records/ConnectAI/discussions/2026-07-20_e-wiki-connectai-프로젝트를-분석하고-어떻게-되어-있는지-보고해줘.md b/docs/records/ConnectAI/discussions/2026-07-20_e-wiki-connectai-프로젝트를-분석하고-어떻게-되어-있는지-보고해줘.md
new file mode 100644
index 0000000..dca0a38
--- /dev/null
+++ b/docs/records/ConnectAI/discussions/2026-07-20_e-wiki-connectai-프로젝트를-분석하고-어떻게-되어-있는지-보고해줘.md
@@ -0,0 +1,16 @@
+# Discussion: E:\Wiki\connectai 프로젝트를 분석하고 어떻게 되어 있는지 보고해줘.
+
+## User Request Summary
+E:\Wiki\connectai 프로젝트를 분석하고 어떻게 되어 있는지 보고해줘.
+
+## Interpreted Intent
+Capture a meaningful project discussion automatically instead of requiring manual record selection.
+
+## Questions
+No explicit question was captured.
+
+## Main Discussion
+- ## 4. 종합 분석 결과 현재 ConnectAI 프로젝트는 로컬 LLM과 RAG 기술을 VS Code라는 개발 환경에 밀접하게 결합하려는 시도가 매우 인상적입니다. 구조적으로 에이전트 기반의 워크플로우와 계층적 메모리 시스템이 설계되어 있어, 단순한 챗봇 이상의 '지능형 코딩 어시스턴트'로 발전할 가능성이 높습니다. **핵심 요약:** - **강점**: 로컬 LLM 사용을 통한 보안성 및 비용 효율성 확보, RAG를 활용한 개인화된 지식 검색 기능의 구조적 완성도. - **기회**: 에이전트 구조(Planner, Researcher, Writer)를 통한 복잡한 개발 태스크 자동화 가능성. - **과제**: 대규모 코드베이스 인덱싱 시의 성능 최적화 및 사용자 경험(UX)의 직관성 강화. 결론적으로, 이 프로젝트는 단순한 도구 모음을 넘어 사용자의 코딩 맥락을 이해하는 '지능형 레이어'를 구축하는 데 초점이 맞춰져 있습니다.
+
+## Decisions
+No decisions captured yet.
diff --git a/docs/records/ConnectAI/timeline.md b/docs/records/ConnectAI/timeline.md
index c8f403a..3cde22b 100644
--- a/docs/records/ConnectAI/timeline.md
+++ b/docs/records/ConnectAI/timeline.md
@@ -420,3 +420,12 @@
## 2026-06-12
- Auto development record created: development\2026-06-12_지금까지-너는-나에게-아이디어-핵심-내용-기대-효과-내용으로-써줬는데-법정-의무-교육은-다른-포멧으로-줬어-_implementation.md
+
+## 2026-07-20
+- Auto discussion record created: discussions\2026-07-20_e-wiki-connectai-프로젝트를-분석하고-구조에-대해서-설명해줘.md
+
+## 2026-07-20
+- Auto discussion record created: discussions\2026-07-20_e-wiki-connectai-프로젝트를-분석하고-구조에-대해서-설명해줘-2.md
+
+## 2026-07-20
+- Auto discussion record created: discussions\2026-07-20_e-wiki-connectai-프로젝트를-분석하고-어떻게-되어-있는지-보고해줘.md