From 49f941386f212341d3cd3dfd41f8dc198ebcc432 Mon Sep 17 00:00:00 2001 From: g1nation Date: Fri, 22 May 2026 19:09:01 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20v2.2.63=20=E2=80=94=20=ED=95=9C?= =?UTF-8?q?=EA=B5=AD=EC=96=B4=20=EC=98=A4=ED=83=80=20=EC=B5=9C=EC=86=8C?= =?UTF-8?q?=ED=99=94=20(=EC=B1=84=ED=8C=85=20temperature=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20+=20anti-glitch=20=EC=83=98=ED=94=8C=EB=A7=81)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - streamer.ts: LM Studio SDK 호출에 topP/topK/minP/repeatPenalty 추가 — 저확률 오답 토큰을 잘라 한글 음절 깨짐(붕괴→붕점) 억제 - 채팅 기본 temperature 0.7 → 0.3 (분석/업무형 답변 안정화) - 신규 설정 g1nation.chatTemperature — Settings 패널 '고급' 섹션에서 조절 가능 (config.ts / settingsPanelProvider / settings-panel.html+js) chronicle 기록(ADR-0022, ADR-0023) 포함. Co-Authored-By: Claude Opus 4.7 --- .astra/project-context/architecture.md | 36 +++++------ .astra/project-context/scan-cache.json | 60 ++++++++++++------- ...d46d2ca2057b05c488be1dcf439166ac5a9a1.json | 2 +- ...9f4f39d2bc368f77456c37b5eef9a94a66b5c.json | 2 +- ...5c7a44d7661af673b24e3f49551a7a2e50280.json | 2 +- ...adc543795e4b427b64540a49c9ab27c7fe213.json | 4 +- ...son => stress_conflict_1779444327825.json} | 18 +++--- PATCHNOTES.md | 14 +++++ docs/records/ConnectAI/chronicle.config.json | 2 +- ...은-0라는-이사의-제안을-받아서-다른-회사로-가기로-했어-.md | 19 ++++++ ...련하여-아래와-같이-회신드립니다-현재-내부-검토-결과-락인.md | 19 ++++++ docs/records/ConnectAI/timeline.md | 6 ++ media/settings-panel.html | 8 +++ media/settings-panel.js | 6 ++ package-lock.json | 4 +- package.json | 9 ++- src/agent.ts | 2 +- src/config.ts | 3 + .../settings/settingsPanelProvider.ts | 5 ++ src/lmstudio/streamer.ts | 9 +++ 20 files changed, 170 insertions(+), 60 deletions(-) rename .astra/tests/stress/.astra/missions/{stress_conflict_1779431564276.json => stress_conflict_1779444327825.json} (81%) create mode 100644 docs/records/ConnectAI/decisions/ADR-0022-a팀장이-있어-팀원으로-b가-있고-c가-있어-a팀장은-0라는-이사의-제안을-받아서-다른-회사로-가기로-했어-.md create mode 100644 docs/records/ConnectAI/decisions/ADR-0023-메일-다듬어줘-안녕하세요-문의-주신-poc-진행-관련하여-아래와-같이-회신드립니다-현재-내부-검토-결과-락인.md diff --git a/.astra/project-context/architecture.md b/.astra/project-context/architecture.md index cbe0fd0..ee5233b 100644 --- a/.astra/project-context/architecture.md +++ b/.astra/project-context/architecture.md @@ -3,14 +3,14 @@ ## Snapshot -- **Workspace**: `connectai` `v2.2.62` _(absolute path varies by environment; resolved from the active VS Code workspace)_ +- **Workspace**: `connectai` `v2.2.63` _(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**: 274 source files, ~55,348 lines across 5 top-level modules. +- **Stats**: 276 source files, ~55,424 lines across 5 top-level modules. ## Last Refresh -- **Time**: 2026-05-22T07:17:34.157Z -- **Files newly analysed**: 3 +- **Time**: 2026-05-22T10:04:22.779Z +- **Files newly analysed**: 5 - **Files reused from cache**: 271 ## Directory Map @@ -42,7 +42,7 @@ flowchart LR media["media/
6 files"] tests["tests/
35 files"] core_py["core_py/
6 files"] - docs["docs/
88 files"] + docs["docs/
90 files"] tests --> src ``` @@ -65,7 +65,7 @@ flowchart LR ## Modules -### `src/` — 139 files, ~38,285 lines +### `src/` — 139 files, ~38,303 lines **Sub-directories** - `src/features/` (66) — Astra Office — public API. 다음 세션에서 추가될 OfficeSnapshot presenter / schema 도 같은 entry 로 노출 예정. 현재 노출: full webview panel H @@ -83,7 +83,7 @@ flowchart LR **Key files** - `src/utils.ts` (408 lines) -- `src/config.ts` (298 lines) +- `src/config.ts` (301 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` (164 lines) - `src/lib/paths.ts` (151 lines) @@ -93,7 +93,7 @@ flowchart LR - `src/retrieval/scoring.ts` (536 lines) — Scoring Engine — TF-IDF + Bilingual Tokenizer 단순 includes() 키워드 매칭을 넘어서, TF-IDF 가중치 기반의 문서 스코어링을 제공합니다. 한국어/영어 양국어 토크나이저를 포함합니다. - `src/skills/agentKnowledgeMap.ts` (374 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/agent.ts` (3822 lines) +- `src/agent.ts` (3823 lines) - `src/features/providers/types.ts` (63 lines) — 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 - `src/lib/engine.ts` (906 lines) - `src/retrieval/brainIndex.ts` (325 lines) — Brain Index — persistent, mtime-keyed tokenized cache of the Second Brain RAG 검색은 매 질의마다 브레인의 모든 .md 파일을 읽고 토크나이즈해서 TF-IDF 점수를 계산했습니다 — 파일 수가 많아지면 그게 병목입니다. 이 모듈은 /.astra/brain-index.json 에 @@ -108,15 +108,15 @@ flowchart LR - `src/features/projectArchitecture/scanner.ts` (644 lines) — Deep static analyser for the Project Architecture Context generator. Walks the project tree (skipping the usual nodemodules / out / dist noise), pulls the role of each interesting file from its leadin - `src/lib/contextManager.ts` (275 lines) — Context Manager (컨텍스트 한계 관리) "context length = 132k" 는 "답변을 132k 토큰까지 생성해도 된다" 가 아닙니다. 시스템 프롬프트 + 대화 기록 + 입력 문서 + 생성될 답변 + 여유분 ≤ context length 이 모듈은 요청을 보내기 전에 입력 토큰을 추정하고, - 동적으로 출력 상한(maxTokens)을 계 -### `media/` — 6 files, ~7,328 lines +### `media/` — 6 files, ~7,342 lines **Key files** - `media/sidebar.css` (2078 lines) — Stylesheet - `media/sidebar.js` (3677 lines) - `media/sidebar.html` (545 lines) — Astra -- `media/settings-panel.html` (373 lines) — Astra Settings +- `media/settings-panel.html` (381 lines) — Astra Settings - `media/settings-panel.css` (210 lines) — Stylesheet -- `media/settings-panel.js` (445 lines) +- `media/settings-panel.js` (451 lines) ### `tests/` — 35 files, ~5,969 lines *Depends on*: `src/` @@ -161,10 +161,10 @@ flowchart LR - `core_py/optimizer.py` (55 lines) - `core_py/queue_worker.py` (82 lines) -### `docs/` — 88 files, ~3,357 lines +### `docs/` — 90 files, ~3,401 lines **Sub-directories** -- `docs/records/` (75) — Bug: /Volumes/Data/project/Antigravity/ConnectAI 프로젝트 코드 리뷰 해줄 수 있어? 개선할 부분이 있는지, 그러고... +- `docs/records/` (77) — Bug: /Volumes/Data/project/Antigravity/ConnectAI 프로젝트 코드 리뷰 해줄 수 있어? 개선할 부분이 있는지, 그러고... - `docs/docs/` (5) — Bug: Viewed integrationretrieval.test.ts:1-59 integrationretrieval.test.ts를 통해 ... - `docs/Meeting/` (0) @@ -175,7 +175,7 @@ flowchart LR - `docs/EXPERIENCE_MEMORY_PLAN.md` (122 lines) — Experience Memory (Mistake / Lesson Loop) — Implementation Plan - `docs/records/ConnectAI/development/2026-05-02_connectai_project_knowledge_overview.md` (121 lines) — Astra Project Knowledge Overview - `docs/records/ConnectAI/development/2026-05-03_connectai_project_knowledge_overview.md` (121 lines) — Astra Project Knowledge Overview -- `docs/records/ConnectAI/timeline.md` (176 lines) — Project Timeline +- `docs/records/ConnectAI/timeline.md` (182 lines) — Project Timeline - `docs/Advanced_Features_Implementation_Guide.md` (40 lines) — Advanced Features Implementation Guide - `docs/docs/records/docs/bugs/BUG-0001-viewed-integration-retrieval-test-ts-1-59-integration-retrie.md` (16 lines) — Bug: Viewed integrationretrieval.test.ts:1-59 integrationretrieval.test.ts를 통해 ... - `docs/docs/records/docs/chronicle.config.json` (11 lines) — JSON configuration @@ -227,13 +227,14 @@ flowchart LR - `g1nation.calendar.refresh` — Astra: Google Calendar 새로고침 📅 - `g1nation.calendar.connectOAuth` — Astra: Google Calendar OAuth 연결 (쓰기) 🔐 - `g1nation.devilAgent.toggle` — Astra: Toggle Devil Agent 🎭 -- **Configuration** (68 settings): +- **Configuration** (69 settings): - `g1nation.multiAgentEnabled` *(boolean)* _(default: `false`)_ — Enable Multi-Agent Workflow (Planner -> Researcher -> Writer) for complex tasks. - `g1nation.datacollectBridgeUrl` *(string)* _(default: `"http://127.0.0.1:3002"`)_ — Wiki/Datacollect MCP Bridge URL. /research, /benchmark, /youtube chat slash commands route here. The Bridge must be running (`npm run bridge` in the Datacollect project). - `g1nation.datacollectSavePath` *(string)* _(default: `""`)_ - `g1nation.datacollectCrawlDepth` *(number)* _(default: `1`)_ - `g1nation.datacollectMaxPages` *(number)* _(default: `8`)_ - `g1nation.datacollectSynthesisTemperature` *(number)* _(default: `0.1`)_ + - `g1nation.chatTemperature` *(number)* _(default: `0.3`)_ - `g1nation.memoryEnabled` *(boolean)* _(default: `true`)_ — Enable layered memory injection before each model response. - `g1nation.memoryShortTermMessages` *(number)* _(default: `8`)_ — Number of recent conversation messages included as short-term memory. - `g1nation.memoryMediumTermSessions` *(number)* _(default: `5`)_ — Number of recent saved chat sessions included as medium-term memory. @@ -287,8 +288,7 @@ flowchart LR - `g1nation.google.clientSecret` *(string)* _(default: `""`)_ - `g1nation.google.calendarId` *(string)* _(default: `"primary"`)_ - `g1nation.google.defaultEventDurationMinutes` *(number)* _(default: `60`)_ — end / duration 둘 다 없는 일정의 기본 길이 (분). agent 가 회의록에서 시각만 추출하고 종료 시각은 명시 안 했을 때 적용. - - `g1nation.google.icalUrl` *(string)* _(default: `""`)_ - - _…and 8 more_ + - _…and 9 more_ ## Dependencies - **Runtime** (2): `@lmstudio/sdk`, `pdf-parse` @@ -336,7 +336,7 @@ Astra는 대표님의 명시적인 승인 하에 로컬 시스템의 강력한 **Designed for High-Performance Decision Making.** Copyright (C) **g1nation**. All rights reserved. -_Last auto-scan: 2026-05-22T07:17:34.157Z · signature `c09857de`_ +_Last auto-scan: 2026-05-22T10:04:22.779Z · signature `1c723399`_ ## Purpose diff --git a/.astra/project-context/scan-cache.json b/.astra/project-context/scan-cache.json index ddaeabb..80950fd 100644 --- a/.astra/project-context/scan-cache.json +++ b/.astra/project-context/scan-cache.json @@ -1,11 +1,11 @@ { "version": 1, - "generatedAt": "2026-05-22T07:17:34.201Z", + "generatedAt": "2026-05-22T10:04:22.814Z", "files": { "src/agent.ts": { - "mtimeMs": 1779431481976.8423, - "size": 220892, - "lines": 3822, + "mtimeMs": 1779444190560.5042, + "size": 220916, + "lines": 3823, "role": "", "imports": [ "src/utils", @@ -83,9 +83,9 @@ ] }, "src/config.ts": { - "mtimeMs": 1779268787168.0276, - "size": 14922, - "lines": 298, + "mtimeMs": 1779444175132.1973, + "size": 15153, + "lines": 301, "role": "", "imports": [] }, @@ -889,9 +889,9 @@ ] }, "src/features/settings/settingsPanelProvider.ts": { - "mtimeMs": 1779250671140.83, - "size": 32311, - "lines": 686, + "mtimeMs": 1779444222128.0447, + "size": 32643, + "lines": 691, "role": "", "imports": [ "src/integrations/telegram/telegramClient", @@ -1060,9 +1060,9 @@ ] }, "src/lmstudio/streamer.ts": { - "mtimeMs": 1778664139962.1995, - "size": 7924, - "lines": 162, + "mtimeMs": 1779444193875.363, + "size": 8477, + "lines": 171, "role": "", "imports": [ "src/lmstudio/client", @@ -1403,16 +1403,16 @@ "imports": [] }, "media/settings-panel.html": { - "mtimeMs": 1779250684699.01, - "size": 20873, - "lines": 373, + "mtimeMs": 1779444233279.6733, + "size": 21424, + "lines": 381, "role": "Astra Settings", "imports": [] }, "media/settings-panel.js": { - "mtimeMs": 1779250701675.4397, - "size": 21239, - "lines": 445, + "mtimeMs": 1779444245246.522, + "size": 21555, + "lines": 451, "role": "", "imports": [] }, @@ -1977,7 +1977,7 @@ "imports": [] }, "docs/records/ConnectAI/chronicle.config.json": { - "mtimeMs": 1779434247950.9436, + "mtimeMs": 1779442717216.4915, "size": 371, "lines": 11, "role": "JSON configuration", @@ -2130,6 +2130,20 @@ "role": "ADR: A팀장이 있어. 팀원으로 B가 있고 C가 있어. A팀장은 0라는 이사의 제안을 받아서 다른 회사로 가기로 했어. 이 소문이 퍼져서 B와 C도 알...", "imports": [] }, + "docs/records/ConnectAI/decisions/ADR-0022-a팀장이-있어-팀원으로-b가-있고-c가-있어-a팀장은-0라는-이사의-제안을-받아서-다른-회사로-가기로-했어-.md": { + "mtimeMs": 1779442646619.3445, + "size": 2353, + "lines": 19, + "role": "ADR: A팀장이 있어. 팀원으로 B가 있고 C가 있어. A팀장은 0라는 이사의 제안을 받아서 다른 회사로 가기로 했어. 이 소문이 퍼져서 B와 C도 알...", + "imports": [] + }, + "docs/records/ConnectAI/decisions/ADR-0023-메일-다듬어줘-안녕하세요-문의-주신-poc-진행-관련하여-아래와-같이-회신드립니다-현재-내부-검토-결과-락인.md": { + "mtimeMs": 1779442717209.4446, + "size": 2164, + "lines": 19, + "role": "ADR: 메일 다듬어줘. 안녕하세요. 문의 주신 POC 진행 관련하여 아래와 같이 회신드립니다. 현재 내부 검토 결과, 락인컴퍼니의 LIAPP 및 LIS...", + "imports": [] + }, "docs/records/ConnectAI/development/2026-05-02_answer-format-readability-tuning.md": { "mtimeMs": 1778028987330.4185, "size": 1564, @@ -2397,9 +2411,9 @@ "imports": [] }, "docs/records/ConnectAI/timeline.md": { - "mtimeMs": 1779434247945.7646, - "size": 11407, - "lines": 176, + "mtimeMs": 1779442717211.4546, + "size": 11829, + "lines": 182, "role": "Project Timeline", "imports": [] }, diff --git a/.astra/tests/stress/.astra/cache/259a37934ead3910a8722b82054d46d2ca2057b05c488be1dcf439166ac5a9a1.json b/.astra/tests/stress/.astra/cache/259a37934ead3910a8722b82054d46d2ca2057b05c488be1dcf439166ac5a9a1.json index 6a05b4c..2914e96 100644 --- a/.astra/tests/stress/.astra/cache/259a37934ead3910a8722b82054d46d2ca2057b05c488be1dcf439166ac5a9a1.json +++ b/.astra/tests/stress/.astra/cache/259a37934ead3910a8722b82054d46d2ca2057b05c488be1dcf439166ac5a9a1.json @@ -1,5 +1,5 @@ { "result": "Final report with inconsistencies. This should be long enough to pass validation.", - "createdAt": 1779431564297, + "createdAt": 1779444327842, "modelVersion": "unknown" } \ No newline at end of file diff --git a/.astra/tests/stress/.astra/cache/65775be352df43297b63c7af59c9f4f39d2bc368f77456c37b5eef9a94a66b5c.json b/.astra/tests/stress/.astra/cache/65775be352df43297b63c7af59c9f4f39d2bc368f77456c37b5eef9a94a66b5c.json index 7b44809..02f6601 100644 --- a/.astra/tests/stress/.astra/cache/65775be352df43297b63c7af59c9f4f39d2bc368f77456c37b5eef9a94a66b5c.json +++ b/.astra/tests/stress/.astra/cache/65775be352df43297b63c7af59c9f4f39d2bc368f77456c37b5eef9a94a66b5c.json @@ -1,5 +1,5 @@ { "result": "[CONFLICT WARNING] 성능이 200% 증가했습니다. vs 그러나 동시에 50% 감소했습니다. 최적화와 성능 저하가 동시에 발견됨.", - "createdAt": 1779431564294, + "createdAt": 1779444327840, "modelVersion": "unknown" } \ No newline at end of file diff --git a/.astra/tests/stress/.astra/cache/6894d26c5b0a55d25d756a473225c7a44d7661af673b24e3f49551a7a2e50280.json b/.astra/tests/stress/.astra/cache/6894d26c5b0a55d25d756a473225c7a44d7661af673b24e3f49551a7a2e50280.json index c57d462..b7886f0 100644 --- a/.astra/tests/stress/.astra/cache/6894d26c5b0a55d25d756a473225c7a44d7661af673b24e3f49551a7a2e50280.json +++ b/.astra/tests/stress/.astra/cache/6894d26c5b0a55d25d756a473225c7a44d7661af673b24e3f49551a7a2e50280.json @@ -1,5 +1,5 @@ { "result": "Detailed Execution Plan: 1. Research 2. Analyze 3. Write report with high quality.", - "createdAt": 1779431564292, + "createdAt": 1779444327837, "modelVersion": "unknown" } \ No newline at end of file diff --git a/.astra/tests/stress/.astra/cache/88cb61499f88ed38165b64bd3e8adc543795e4b427b64540a49c9ab27c7fe213.json b/.astra/tests/stress/.astra/cache/88cb61499f88ed38165b64bd3e8adc543795e4b427b64540a49c9ab27c7fe213.json index 71ab2ad..0f89d62 100644 --- a/.astra/tests/stress/.astra/cache/88cb61499f88ed38165b64bd3e8adc543795e4b427b64540a49c9ab27c7fe213.json +++ b/.astra/tests/stress/.astra/cache/88cb61499f88ed38165b64bd3e8adc543795e4b427b64540a49c9ab27c7fe213.json @@ -1,5 +1,5 @@ { - "result": "---\nid: stress_conflict_1779431564276\ndate: 2026-05-22T06:32:44.299Z\ntype: knowledge_artifact\nstandard: P-Reinforce v3.0\ntags: [automated, connect_ai, brain_sync]\n---\n\n## 📌 Brief Summary\nFinal report with inconsistencies. This should be long enough to pass validation.\n\nFinal report with inconsistencies. This should be long enough to pass validation.\n\n---\n## 💡 Astra의 선제적 제안 (Proactive Next Actions)\nFinal report with inconsistencies. This should be long enough to pass validation.\n---\n## 🛡️ Reliability & Audit Summary\n> [!NOTE]\n> 이 문서는 ConnectAI의 **Intelligent Resilience** 엔진에 의해 검증 및 정제되었습니다.\n\n| Metric | Value | Status |\n| :--- | :--- | :--- |\n| **Conflict Risk** | `60/100` | ⚠️ Medium |\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- **[PLANNER]** 전략 수립 중... (14ms)\n- **[RESEARCHER]** 핵심 정보 수집 및 분석 중... (3ms)\n- **[WRITER]** 최종 리포트 작성 및 편집 중... (3ms)\n", - "createdAt": 1779431564299, + "result": "---\nid: stress_conflict_1779444327825\ndate: 2026-05-22T10:05:27.844Z\ntype: knowledge_artifact\nstandard: P-Reinforce v3.0\ntags: [automated, connect_ai, brain_sync]\n---\n\n## 📌 Brief Summary\nFinal report with inconsistencies. This should be long enough to pass validation.\n\nFinal report with inconsistencies. This should be long enough to pass validation.\n\n---\n## 💡 Astra의 선제적 제안 (Proactive Next Actions)\nFinal report with inconsistencies. This should be long enough to pass validation.\n---\n## 🛡️ Reliability & Audit Summary\n> [!NOTE]\n> 이 문서는 ConnectAI의 **Intelligent Resilience** 엔진에 의해 검증 및 정제되었습니다.\n\n| Metric | Value | Status |\n| :--- | :--- | :--- |\n| **Conflict Risk** | `60/100` | ⚠️ Medium |\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- **[PLANNER]** 전략 수립 중... (11ms)\n- **[RESEARCHER]** 핵심 정보 수집 및 분석 중... (2ms)\n- **[WRITER]** 최종 리포트 작성 및 편집 중... (3ms)\n", + "createdAt": 1779444327844, "modelVersion": "unknown" } \ No newline at end of file diff --git a/.astra/tests/stress/.astra/missions/stress_conflict_1779431564276.json b/.astra/tests/stress/.astra/missions/stress_conflict_1779444327825.json similarity index 81% rename from .astra/tests/stress/.astra/missions/stress_conflict_1779431564276.json rename to .astra/tests/stress/.astra/missions/stress_conflict_1779444327825.json index 6766c2b..fbc8897 100644 --- a/.astra/tests/stress/.astra/missions/stress_conflict_1779431564276.json +++ b/.astra/tests/stress/.astra/missions/stress_conflict_1779444327825.json @@ -1,8 +1,8 @@ { - "missionId": "stress_conflict_1779431564276", + "missionId": "stress_conflict_1779444327825", "status": "completed", - "startTime": "2026-05-22T06:32:44.276Z", - "totalElapsedMs": 24, + "startTime": "2026-05-22T10:05:27.825Z", + "totalElapsedMs": 20, "results": { "planner": "Detailed Execution Plan: 1. Research 2. Analyze 3. Write report with high quality.", "researcher": "[CONFLICT WARNING] 성능이 200% 증가했습니다. vs 그러나 동시에 50% 감소했습니다. 최적화와 성능 저하가 동시에 발견됨.", @@ -16,30 +16,30 @@ { "from": "idle", "to": "planner", - "durationMs": 14, + "durationMs": 11, "message": "전략 수립 중...", - "ts": "2026-05-22T06:32:44.290Z" + "ts": "2026-05-22T10:05:27.836Z" }, { "from": "planner", "to": "researcher", - "durationMs": 3, + "durationMs": 2, "message": "핵심 정보 수집 및 분석 중...", - "ts": "2026-05-22T06:32:44.293Z" + "ts": "2026-05-22T10:05:27.838Z" }, { "from": "researcher", "to": "writer", "durationMs": 3, "message": "최종 리포트 작성 및 편집 중...", - "ts": "2026-05-22T06:32:44.296Z" + "ts": "2026-05-22T10:05:27.841Z" }, { "from": "writer", "to": "completed", "durationMs": 4, "message": "미션 완료", - "ts": "2026-05-22T06:32:44.300Z" + "ts": "2026-05-22T10:05:27.845Z" } ], "resilienceMetrics": { diff --git a/PATCHNOTES.md b/PATCHNOTES.md index b7ffb4c..7227da9 100644 --- a/PATCHNOTES.md +++ b/PATCHNOTES.md @@ -1,5 +1,19 @@ # Astra Patch Notes +## v2.2.63 (2026-05-22) +### 🎚️ 한국어 오타 최소화 — 채팅 Temperature 설정 + anti-glitch 샘플링 +- **문제:** 채팅 분석 답변에 한국어 오타(`붕괴`→`붕점`, `핵심`→`핵점`, `텍스트`→`텍록`)가 잦음. 토큰 단위 샘플링 glitch. +- **원인:** 메인 채팅 경로가 `temperature 0.7`(창작용)에 `top_p`·`top_k`·`min_p`·`repeat_penalty`를 **하나도 안 보냄**. 2.2.54의 anti-glitch 샘플링은 슬래시 명령에만 적용돼 있었음. +- **수정 1 — 채팅 샘플링 강화.** LM Studio SDK 호출에 `topP 0.9`·`topK 20`·`minP 0.05`·`repeatPenalty 1.1` 추가. 저확률 오답 토큰을 잘라내 한 글자 오류·더듬음(`것입니다서입니다`)을 억제. +- **수정 2 — 채팅 기본 temperature 0.7 → 0.3.** 분석·업무형 답변에서 오답 토큰 채택을 크게 줄임. +- **신규 설정 `g1nation.chatTemperature`** (기본 0.3, 0~2). **Astra Settings 패널 '고급' 섹션**에서 조절 가능 — 낮출수록 오타·환각이 줄고 안정적, 높일수록 표현이 다양. +- **한계:** `붕점`처럼 멀쩡한 한글 두 글자로 보이는 깨짐은 사후 교정이 불가 — 근본 해결은 양자화 등급 상향(Q4→Q6/Q8) 또는 한국어가 강한 모델 사용. +- **신규 패키징:** `astra-2.2.63.vsix`. + +--- + + + ## v2.2.62 (2026-05-22) ### 🧹 모델 출력 붕괴(degeneration) 방어 — 가독성 보호 - **문제:** 긴 세션의 분석 답변에서 ①같은 분석이 통째로 두 번 생성됨 ②밑줄 `___` 수백 개 등 문자 벽 ③`(Note: I am acting as ...)` 메타 노트 반복 ④내부 지시문 `Candidate records for this discussion...` 누출 ⑤`[핵심 확인 질문]`·`(질문 의도: …)` 누출. 마크다운/테이블이 깨져 렌더링 불가. diff --git a/docs/records/ConnectAI/chronicle.config.json b/docs/records/ConnectAI/chronicle.config.json index a535903..c7265a7 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-05-22T07:17:27.949Z" + "updatedAt": "2026-05-22T10:07:21.651Z" } diff --git a/docs/records/ConnectAI/decisions/ADR-0022-a팀장이-있어-팀원으로-b가-있고-c가-있어-a팀장은-0라는-이사의-제안을-받아서-다른-회사로-가기로-했어-.md b/docs/records/ConnectAI/decisions/ADR-0022-a팀장이-있어-팀원으로-b가-있고-c가-있어-a팀장은-0라는-이사의-제안을-받아서-다른-회사로-가기로-했어-.md new file mode 100644 index 0000000..d6e4d7a --- /dev/null +++ b/docs/records/ConnectAI/decisions/ADR-0022-a팀장이-있어-팀원으로-b가-있고-c가-있어-a팀장은-0라는-이사의-제안을-받아서-다른-회사로-가기로-했어-.md @@ -0,0 +1,19 @@ +# ADR: A팀장이 있어. 팀원으로 B가 있고 C가 있어. A팀장은 0라는 이사의 제안을 받아서 다른 회사로 가기로 했어. 이 소문이 퍼져서 B와 C도 알... + +## Status +accepted + +## Context +A팀장이 있어. 팀원으로 B가 있고 C가 있어. A팀장은 0라는 이사의 제안을 받아서 다른 회사로 가기로 했어. 이 소문이 퍼져서 B와 C도 알게 되었지. 그러고 2일 뒤 B와 C가 A를 불러서 회의를 함. 그러고 질문을 하고. 갑자기 그럼 나 이일 (지금 작업하고 있는) 하고 싶지 않다 부담된다. 그러고 다음날 풀렸어. 그러곤 4일째되는날 A가 B에게 업무 지시, 피드백을 하는데 B가, 왜 하나 하나 다 참견이냐,, 하면서 화를 냄. 그래서 A가 선은 넘지 말아달라 하니까. B가 화가 나서. 막말을 하기 시작함. 시바, 좇도 실력 없는게 팀장이면 다냐 하고 멱살 잡고 밀쳐 냈다네. 이거 분석해줘. + +## Decision +## 핵심 요약 - **사건의 성격**: 리더십 공백기(A의 이직)에 발생한 조직 내 신뢰 붕탕과 물리적 폭력 사건입니다. - **핵심 문제**: '리더 권위 상실 → 팀원의 심리적 저항(업무 거부) → 감정 폭발 및 인격 모독/폭행'으로 이어지는 단계적 파멸 구조를 보입니다. - **결론**: 단순한 갈등을 넘어, 조직의 규율이 완전히 붕동된 '조직 해체' 수준의 위기 상황입니다. ## 상세 설명 이 사건은 전형적인 **'리더십 공백기에 발생하는 조직의 자멸 과정'**을 보여줍니다. 각 단계별로 어떤 심리적, 구조적 문제가 있는지 분석하겠습니다. ### 1. 리더십의 부재와 정보의 불확실성 (A의 이직 결정 및 소문) A팀장이 떠난다는 사실이 알려진 순간, 팀의 '안정성'은 파괴되었습니다. - **신뢰의 위기**: 리더가 조직을 떠난다는 것은 구성원들에게 "이 조직은 곧 끝난다" 혹은 "변화할 것이다"라는 불안감을 심어줍니다. - **정보의 전이**: 소문이 퍼졌다는 것은 공식적인... + +## Reason +Captured automatically because the conversation contained decision-oriented language. + +## Alternatives +Not captured yet. + +## Consequences +- Future prompts should treat this as project context unless the user changes direction. diff --git a/docs/records/ConnectAI/decisions/ADR-0023-메일-다듬어줘-안녕하세요-문의-주신-poc-진행-관련하여-아래와-같이-회신드립니다-현재-내부-검토-결과-락인.md b/docs/records/ConnectAI/decisions/ADR-0023-메일-다듬어줘-안녕하세요-문의-주신-poc-진행-관련하여-아래와-같이-회신드립니다-현재-내부-검토-결과-락인.md new file mode 100644 index 0000000..27a3103 --- /dev/null +++ b/docs/records/ConnectAI/decisions/ADR-0023-메일-다듬어줘-안녕하세요-문의-주신-poc-진행-관련하여-아래와-같이-회신드립니다-현재-내부-검토-결과-락인.md @@ -0,0 +1,19 @@ +# ADR: 메일 다듬어줘. 안녕하세요. 문의 주신 POC 진행 관련하여 아래와 같이 회신드립니다. 현재 내부 검토 결과, 락인컴퍼니의 LIAPP 및 LIS... + +## Status +accepted + +## Context +메일 다듬어줘. 안녕하세요. 문의 주신 POC 진행 관련하여 아래와 같이 회신드립니다. 현재 내부 검토 결과, 락인컴퍼니의 LIAPP 및 LISS 도입을 진행하기로 결정하였습니다. 또한, 롯데이노베이트 계정으로 3Dism 앱을 신규 출시할 예정입니다. 이에 따라 LIAPP, LISS의 연 단위 구매 견적을 롯데이노베이트 기준으로 산정 가능하신지 검토 부탁드립니다. 추가로 필요한 정보가 있으시면 말씀 주시면 전달드리겠습니다. 감사합니다. + +## Decision +메일의 목적(비즈니스 협상/문의)과 수신자가 누구인지에 따라 세 가지 버전으로 다듬어 보았습니다. 상황에 가장 적합한 것을 선택해 사용하세요. --- ## 1. 표준형 (가장 추천: 정중하고 깔끔한 스타일) 가장 일반적인 비즈니스 매너를 갖춘 형태입니다. 문장을 명확하게 끊어 전달력을 높였습니다. **제목: [락인컴퍼니] PoC 진행 결과 공유 및 신규 앱 출시 관련 견적 요청의 건** 안녕하세요, [상대 성함/직함]님. 문의 주신 PoC 진행 관련하여 아래와 같이 회신드립니다. 현재 당사 내부 검토 결과, 락인컴퍼니의 LIAPP 및 LISS 도입을 최종 결정하였습니다. 이와 관련하여 한 가지 추가 요청 사항이 있습니다. 향후 롯데이노베이트 계정을 통해 '3Dism' 앱을 신규 출시할 예정입니다. 이에 따라 LIAPP과 LISS의 연 단위 구매 견적을 롯데이노법테 기준(또는 해당 기준)으로 산정해 주실 수 있는지 검토 부탁드립니다. 관련하여 확인 후 답변 주시면 감사하겠습니다. 추가... + +## Reason +Captured automatically because the conversation contained decision-oriented language. + +## Alternatives +Not captured yet. + +## Consequences +- Future prompts should treat this as project context unless the user changes direction. diff --git a/docs/records/ConnectAI/timeline.md b/docs/records/ConnectAI/timeline.md index 6a0ae63..f1d6cfe 100644 --- a/docs/records/ConnectAI/timeline.md +++ b/docs/records/ConnectAI/timeline.md @@ -174,3 +174,9 @@ ## 2026-05-22 - Auto decision record created: decisions\ADR-0021-a팀장이-있어-팀원으로-b가-있고-c가-있어-a팀장은-0라는-이사의-제안을-받아서-다른-회사로-가기로-했어-.md + +## 2026-05-22 +- Auto decision record created: decisions\ADR-0022-a팀장이-있어-팀원으로-b가-있고-c가-있어-a팀장은-0라는-이사의-제안을-받아서-다른-회사로-가기로-했어-.md + +## 2026-05-22 +- Auto decision record created: decisions\ADR-0023-메일-다듬어줘-안녕하세요-문의-주신-poc-진행-관련하여-아래와-같이-회신드립니다-현재-내부-검토-결과-락인.md diff --git a/media/settings-panel.html b/media/settings-panel.html index ce3caba..f937c36 100644 --- a/media/settings-panel.html +++ b/media/settings-panel.html @@ -365,6 +365,14 @@ +
+ +
+ + +
+ 채팅 응답 생성의 temperature. 낮을수록(0.2~0.3) 한국어 오타·깨진 토큰이 줄고 안정적입니다. 기본 0.3 권장. +
diff --git a/media/settings-panel.js b/media/settings-panel.js index dbe0f25..ff689f5 100644 --- a/media/settings-panel.js +++ b/media/settings-panel.js @@ -47,6 +47,7 @@ const advMulti = $('advMulti'); const advAutoSteps = $('advAutoSteps'); const advCtxSize = $('advCtxSize'); + const advChatTemp = $('advChatTemp'); // ---- Google (Calendar + Sheets) ---- const gClientId = $('gClientId'); @@ -236,6 +237,10 @@ vscode.postMessage({ type: 'advanced.update', maxContextSize: Number(advCtxSize.value) }) ); + document.querySelector('[data-save="advanced.chatTemperature"]').addEventListener('click', () => + vscode.postMessage({ type: 'advanced.update', chatTemperature: Number(advChatTemp.value) }) + ); + // ---- Header ---- $('openVscodeSettings').addEventListener('click', () => vscode.postMessage({ type: 'openVscodeSettings' }) @@ -391,6 +396,7 @@ advMulti.checked = !!adv.multiAgentEnabled; setIfNotFocused(advAutoSteps, adv.maxAutoSteps); setIfNotFocused(advCtxSize, adv.maxContextSize); + setIfNotFocused(advChatTemp, adv.chatTemperature); // ---- Google (Calendar + Sheets) ---- const g = state.google; diff --git a/package-lock.json b/package-lock.json index adec849..0e1dad0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "astra", - "version": "2.2.62", + "version": "2.2.63", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "astra", - "version": "2.2.62", + "version": "2.2.63", "license": "MIT", "dependencies": { "@lmstudio/sdk": "^1.5.0", diff --git a/package.json b/package.json index 54b0159..24abafc 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "astra", "displayName": "Astra", "description": "The personal intelligence layer for Antigravity and VS Code. A private cognitive partner for deep project context, memory, and proactive strategic decision-making.", - "version": "2.2.62", + "version": "2.2.63", "publisher": "g1nation", "license": "MIT", "icon": "assets/icon.png", @@ -230,6 +230,13 @@ "maximum": 2, "markdownDescription": "`/benchmark` LLM 4-렌즈 합성의 temperature. 낮을수록(0.1) 환각·깨진 문자가 줄고 결과가 결정적이며, 높을수록 표현이 다양해집니다. 기본 0.1 권장." }, + "g1nation.chatTemperature": { + "type": "number", + "default": 0.3, + "minimum": 0, + "maximum": 2, + "markdownDescription": "채팅 응답 생성의 temperature. 낮을수록(0.2~0.3) 한국어 오타·깨진 토큰·환각이 줄고 결과가 안정적이며, 높을수록 표현이 다양해집니다. 분석·업무용은 0.3 권장." + }, "g1nation.memoryEnabled": { "type": "boolean", "default": true, diff --git a/src/agent.ts b/src/agent.ts index 322495f..1609be1 100644 --- a/src/agent.ts +++ b/src/agent.ts @@ -437,7 +437,7 @@ export class AgentExecutor { brainEnabled = false, loopDepth = 0, visionContent, - temperature = 0.7, + temperature = getConfig().chatTemperature, systemPrompt = getSystemPrompt() } = options; const { ollamaUrl, defaultModel: configDefaultModel, timeout, multiAgentEnabled } = getConfig(); diff --git a/src/config.ts b/src/config.ts index a9a2f3a..f039b47 100644 --- a/src/config.ts +++ b/src/config.ts @@ -24,6 +24,8 @@ export interface IAgentConfig { activeBrainId: string; maxContextSize: number; maxAutoSteps: number; + /** 채팅 응답 생성 temperature. 낮을수록 한국어 오타·깨진 토큰이 줄어든다. */ + chatTemperature: number; dryRun: boolean; multiAgentEnabled: boolean; memoryEnabled: boolean; @@ -204,6 +206,7 @@ export function getConfig(): IAgentConfig { activeBrainId: activeBrain.id, maxContextSize: cfg.get('maxContextSize', 12000), maxAutoSteps: cfg.get('maxAutoSteps', 50), + chatTemperature: Math.min(2, Math.max(0, cfg.get('chatTemperature', 0.3))), dryRun: cfg.get('dryRun', false), multiAgentEnabled: cfg.get('multiAgentEnabled', false), memoryEnabled: cfg.get('memoryEnabled', true), diff --git a/src/features/settings/settingsPanelProvider.ts b/src/features/settings/settingsPanelProvider.ts index a94447c..142dd00 100644 --- a/src/features/settings/settingsPanelProvider.ts +++ b/src/features/settings/settingsPanelProvider.ts @@ -82,6 +82,7 @@ interface SettingsState { multiAgentEnabled: boolean; maxAutoSteps: number; maxContextSize: number; + chatTemperature: number; }; datacollect: { bridgeUrl: string; @@ -581,6 +582,9 @@ export class SettingsPanelProvider implements vscode.WebviewViewProvider { if (typeof msg.maxContextSize === 'number' && Number.isFinite(msg.maxContextSize)) { await this._safeConfigUpdate('maxContextSize', Math.max(1000, Math.floor(msg.maxContextSize))); } + if (typeof msg.chatTemperature === 'number' && Number.isFinite(msg.chatTemperature)) { + await this._safeConfigUpdate('chatTemperature', Math.max(0, Math.min(2, msg.chatTemperature))); + } } // ────────────── Datacollect (slash 명령) ────────────── @@ -652,6 +656,7 @@ export class SettingsPanelProvider implements vscode.WebviewViewProvider { multiAgentEnabled: cfg.get('multiAgentEnabled', false), maxAutoSteps: cfg.get('maxAutoSteps', 50) ?? 50, maxContextSize: cfg.get('maxContextSize', 32000) ?? 32000, + chatTemperature: cfg.get('chatTemperature', 0.3) ?? 0.3, }, datacollect: { bridgeUrl: cfg.get('datacollectBridgeUrl', '') || '', diff --git a/src/lmstudio/streamer.ts b/src/lmstudio/streamer.ts index 3352292..7923f66 100644 --- a/src/lmstudio/streamer.ts +++ b/src/lmstudio/streamer.ts @@ -75,6 +75,15 @@ export class LMStudioStreamer implements IChatStreamer { const prediction = (model as any).respond(req.messages, { temperature: req.temperature, maxTokens: req.maxTokens ?? 4096, + // Glitch suppression: a small / quantized model samples wrong + // neighbour tokens (Korean syllable corruption like 붕괴→붕점, + // 핵심→핵점) when the distribution is left wide. A tight nucleus + // + top-k and a min-p floor cut the low-probability tail; + // repeatPenalty curbs stutter (것입니다서입니다). + topPSampling: 0.9, + topKSampling: 20, + minPSampling: 0.05, + repeatPenalty: 1.1, // Safety net: if our own token budgeting still underestimated and the prompt // exceeds the model's context window, decide whether the SDK should fail // loudly (stopAtLimit — default) or silently drop content.