v2.2.313~319: 보고 품질·조사 신뢰성 수술 + 네이버 쇼핑인사이트/검색어트렌드 연동

- 파트별 완성, 웹 실접속 증빙, 턴 의도 브리핑, 본문 불일치 검증, 하위 질문
  체크리스트, 사이트 심층 수집 (PATCHNOTES.md v2.2.313~318 참조)
- /naver-shopping, /naver-trend: 네이버 데이터랩 API 연동. compare/discover
  자동 판별, API 배치 상한 캡슐화, 카테고리 트리 fuzzy 매칭, 자격증명은
  Astra 설정 패널 SecretStorage 로 관리
This commit is contained in:
2026-08-05 18:20:32 +09:00
parent 7d6b8b509f
commit c79eda1862
51 changed files with 37435 additions and 89 deletions
+164 -30
View File
@@ -1,6 +1,6 @@
{
"version": 1,
"generatedAt": "2026-07-20T04:20:03.483Z",
"generatedAt": "2026-07-21T04:22:55.502Z",
"files": {
"src/agent/actions/brainOps.ts": {
"mtimeMs": 1779764602582.9768,
@@ -254,9 +254,9 @@
]
},
"src/agent/handlePrompt/processFinalAnswer.ts": {
"mtimeMs": 1779764602591.863,
"size": 6606,
"lines": 147,
"mtimeMs": 1784522477358.286,
"size": 7268,
"lines": 158,
"role": "",
"imports": [
"src/utils",
@@ -273,6 +273,16 @@
"src/lib/contextManager"
]
},
"src/agent/handlePrompt/sectionedCompletion.ts": {
"mtimeMs": 1784521634407.0134,
"size": 6304,
"lines": 116,
"role": "[v2.2.313] 파트별 완성 (Sectioned Completion) — 사용자 제안 구현. 문제: 보고서형 답변이 출력 토큰 한계에 닿으면 자동 이어쓰기(같은 호출의 연장)를 최대 N회 시도하고, 그래도 못 채우면 \"더 좁은 주제로 나눠 질문하세요\" 안내로 끝났다. 나눠서 다시 묻는 부담을 사용자에게 떠넘긴 것. 해결: 한계에 닿은 초안을 받으면 백엔",
"imports": [
"src/utils",
"src/agent"
]
},
"src/agent/hangulHygiene.ts": {
"mtimeMs": 1781239601929.7876,
"size": 3244,
@@ -436,9 +446,9 @@
]
},
"src/agent.ts": {
"mtimeMs": 1784517985649.1714,
"size": 113583,
"lines": 1979,
"mtimeMs": 1784602363613.244,
"size": 130400,
"lines": 2229,
"role": "",
"imports": [
"src/utils",
@@ -455,6 +465,9 @@
"src/features/web/webFetch",
"src/intelligence/correctionLoop",
"src/intelligence/investigationPipeline",
"src/intelligence/requirementGraph",
"src/intelligence/turnIntentBrief",
"src/intelligence/subQuestions",
"src/lib/contextBuilders/multiAgentRouting",
"src/lib/contextBuilders/thinkingPartnerContract",
"src/lib/contextBuilders/droppedHistorySummary",
@@ -527,6 +540,7 @@
"src/agent/handlePrompt/applyAutoContinuation",
"src/features/approval/approvalQueue",
"src/intelligence/confidenceEngine",
"src/core/services",
"src/features/providers"
]
},
@@ -577,9 +591,9 @@
]
},
"src/config.ts": {
"mtimeMs": 1784510604793.408,
"size": 42409,
"lines": 727,
"mtimeMs": 1784602367128.109,
"size": 43582,
"lines": 745,
"role": "",
"imports": []
},
@@ -2410,9 +2424,9 @@
]
},
"src/intelligence/investigationPipeline.ts": {
"mtimeMs": 1784517973427.466,
"size": 13722,
"lines": 256,
"mtimeMs": 1784521742026.5295,
"size": 15022,
"lines": 282,
"role": "Investigation Pipeline — \"파일명만 보고 상상하는 조사\" 를 구조적으로 차단. (v2.2.309) 문제: 소형 로컬 모델은 <listfiles> 로 파일명 목록을 받으면 <readfile> 을 부르지 않고 이름에서 내용을 상상해 조사 결과를 지어낸다 (lazy tool-use 할루시네이션). 해법 3중: ① 증거 게이트 — 조사형 요청 ",
"imports": [
"src/config"
@@ -2508,6 +2522,13 @@
"src/intelligence/reflectionStore"
]
},
"src/intelligence/subQuestions.ts": {
"mtimeMs": 1784605847771.3826,
"size": 4647,
"lines": 85,
"role": "[v2.2.318] 하위 질문 체크리스트 — \"질문 3개에 하나도 직접 답하지 않는\" 실사례 대응. 사용자가 한 메시지에 물음을 여러 개 명시하면(\"어떤 주제인지, 퀄리티는 어떤지, 도움이 될지\") 각 물음이 답변에서 다뤄지는지를 결정론으로 관리한다: 1) 프롬프트에서 물음 절(clause)을 규칙 기반 추출 (LLM 없음) 2) 답변 전: \"각 물음에 별",
"imports": []
},
"src/intelligence/taskEvalHarness.ts": {
"mtimeMs": 1781144360998.8086,
"size": 7942,
@@ -2517,6 +2538,15 @@
"src/intelligence/requirementGraph"
]
},
"src/intelligence/turnIntentBrief.ts": {
"mtimeMs": 1784524229904.1582,
"size": 7105,
"lines": 121,
"role": "[v2.2.316] 턴 의도 브리핑 — \"질문 의도를 판단하지 못한다\" 문제의 구조적 해결. 진단: 의도 브리핑(왜 묻는지·진짜 궁금증·답의 용도 추출→주입)은 멀티에이전트 보고서 경로(v2.2.301)에만 있었고, 일반 채팅 턴은 \"[답변 전 이해 원칙]\" 4줄짜리 추상 지시뿐이었다. 소형 로컬 모델은 추상 지시(\"의도를 파악하라\")를 실행하지 못한다 —",
"imports": [
"src/utils"
]
},
"src/lib/contextBuilders/astraModeArchitecture.ts": {
"mtimeMs": 1779764602634.5583,
"size": 3982,
@@ -2650,22 +2680,23 @@
"imports": []
},
"src/lib/contextBuilders/multiAgentRouting.ts": {
"mtimeMs": 1783907905794.681,
"size": 5728,
"lines": 103,
"mtimeMs": 1784523758683.9956,
"size": 6310,
"lines": 111,
"role": "",
"imports": [
"src/config",
"src/lib/contextManager",
"src/lib/contextBuilders/promptDetection",
"src/lib/contextBuilders/astraModeArchitecture",
"src/lib/contextBuilders/localProjectIntent"
"src/lib/contextBuilders/localProjectIntent",
"src/features/web/webFetch"
]
},
"src/lib/contextBuilders/outputSanitization.ts": {
"mtimeMs": 1784019840678.9001,
"size": 5958,
"lines": 108,
"mtimeMs": 1784522459809.4607,
"size": 9673,
"lines": 175,
"role": "모델 출력 후처리 (post-stream sanitization). 모두 stateless pure transform. 1) sanitizeAssistantContent — 모델이 답변에 흘려보낸 내부 마커 (rationale, reasoning channels, Harmony/GPT-OSS 채널 마커, [PROBLEM]/[GOAL]/[REASONING] ",
"imports": []
},
@@ -2781,9 +2812,9 @@
"imports": []
},
"src/lib/contextBuilders/urlContext.ts": {
"mtimeMs": 1781491584068.7393,
"size": 5546,
"lines": 108,
"mtimeMs": 1784602315425.4807,
"size": 12372,
"lines": 234,
"role": "URL 컨텍스트 빌더 — 채팅 프롬프트에 URL 이 있으면 본문을 추출해 실데이터로 주입. 문제: /wikify 는 URL 에 접근하지만(브리지 /api/web-extract), 일반 채팅에 URL 을 주면 추출 경로가 없어 모델이 \"접근할 수 없습니다\"라고 답하거나 내용을 추측했다. v2: Bridge 100% 의존이 두 번째 공백이었다 — Bridge ",
"imports": [
"src/utils",
@@ -3994,9 +4025,9 @@
]
},
"tests/investigationPipeline.test.ts": {
"mtimeMs": 1784518245844.1465,
"size": 9847,
"lines": 193,
"mtimeMs": 1784521853054.2844,
"size": 11267,
"lines": 217,
"role": "Investigation Pipeline — 파일명만 보고 상상하는 헛조사 차단 3중 방어. (v2.2.309) ① 조사형 요청 감지 + 증거 게이트 ② 강제 정독 Map + 해시 캐시 ③ Hollow 감지",
"imports": [
"src/intelligence/investigationPipeline"
@@ -4104,6 +4135,15 @@
"src/lib/contextBuilders/multiAgentRouting"
]
},
"tests/lsepClosersAndLeaks.test.ts": {
"mtimeMs": 1784523140472.9927,
"size": 3378,
"lines": 63,
"role": "[v2.2.314] 두 실사례 가드: 1) LSEP 마커 뒤 \"마무리 인사\"만 남고 본문이 추론 구간에 갇혀 증발한 답변. 2) \"요청 요약/사용자 의도 추론/핵심 확인 질문\" 내부 스캐폴딩 섹션 유출.",
"imports": [
"src/lib/contextBuilders/outputSanitization"
]
},
"tests/meetPrompt.test.ts": {
"mtimeMs": 1782114707092.5818,
"size": 3643,
@@ -4338,6 +4378,16 @@
"src/features/secondBrainTrace"
]
},
"tests/sectionedCompletion.test.ts": {
"mtimeMs": 1784521835807.1162,
"size": 4361,
"lines": 97,
"role": "[v2.2.313] 파트별 완성 — 길이 한계에 닿은 보고서를 남은 섹션 단위로 나눠 생성해 한 문서로 통합. \"더 좁은 주제로 나눠 질문하세요\" 떠넘기기의 대체.",
"imports": [
"src/agent/handlePrompt/sectionedCompletion",
"src/agent"
]
},
"tests/selfAssessContext.test.ts": {
"mtimeMs": 1781232946761.048,
"size": 3413,
@@ -4435,6 +4485,15 @@
"src/agent/actions/stripForDisplay"
]
},
"tests/subQuestions.test.ts": {
"mtimeMs": 1784605807159.133,
"size": 2750,
"lines": 57,
"role": "[v2.2.318] 하위 질문 체크리스트 — \"물음 3개에 하나도 직접 답하지 않는\" 실사례 가드.",
"imports": [
"src/intelligence/subQuestions"
]
},
"tests/systemPrompt.test.ts": {
"mtimeMs": 1779764602687.5603,
"size": 1487,
@@ -4493,6 +4552,15 @@
"src/core/transaction"
]
},
"tests/turnIntentBrief.test.ts": {
"mtimeMs": 1784533325652.0085,
"size": 3596,
"lines": 73,
"role": "[v2.2.316] 턴 의도 브리핑 — \"질문 의도를 판단하지 못한다\" 문제의 구조적 해결. 게이팅(잡담 제외) / JSON 파싱 내성 / 주입 블록의 근거-경로 강제를 검증.",
"imports": [
"src/intelligence/turnIntentBrief"
]
},
"tests/urlContext.test.ts": {
"mtimeMs": 1781239218670.592,
"size": 2655,
@@ -4522,6 +4590,16 @@
"src/features/web/webFetch"
]
},
"tests/webFetchNotice.test.ts": {
"mtimeMs": 1784601240938.898,
"size": 4616,
"lines": 77,
"role": "[v2.2.315] 웹 실접속 결정론 표시 — \"사이트 분석 요청에 실접속 없이 일반론 답변\" (koritips.com 실사례) 재발 방지. 접속 실패는 답변 상단 경고, 성공은 하단 출처.",
"imports": [
"src/lib/contextBuilders/urlContext",
"src/lib/contextBuilders/multiAgentRouting"
]
},
"tests/wikiFormat.test.ts": {
"mtimeMs": 1783044027299.6238,
"size": 3405,
@@ -4845,7 +4923,7 @@
"imports": []
},
"docs/records/ConnectAI/chronicle.config.json": {
"mtimeMs": 1784521189700.969,
"mtimeMs": 1784607768925.8318,
"size": 371,
"lines": 11,
"role": "JSON configuration",
@@ -5243,6 +5321,34 @@
"role": "ADR: 일단 조건을 하나 더 추가할께. 계열사는 하고 싶어 하지 않아. 우리한테 업무를 주는게 추가 업무로 이어진다고 생각해. 해서 이걸 뒤집을 정도로...",
"imports": []
},
"docs/records/ConnectAI/decisions/ADR-0057-e-wiki-connectai-프로젝트-분석해줘.md": {
"mtimeMs": 1784521304979.044,
"size": 1396,
"lines": 19,
"role": "ADR: E:\\Wiki\\connectai 프로젝트 분석해줘.",
"imports": []
},
"docs/records/ConnectAI/decisions/ADR-0058-e-wiki-connectai-프로젝트-분석해-그리고-내용을-출력해줘.md": {
"mtimeMs": 1784522265657.1863,
"size": 1384,
"lines": 19,
"role": "ADR: E:\\Wiki\\connectai 프로젝트 분석해 그리고 내용을 출력해줘.",
"imports": []
},
"docs/records/ConnectAI/decisions/ADR-0059-https-koritips-com-사이트에-대한-분석-및-평가해줘-예상되는-주요-구독자는-누구일-것인지-글의.md": {
"mtimeMs": 1784533698646.8413,
"size": 1628,
"lines": 19,
"role": "ADR: HTTPS://KORITIPS.COM 사이트에 대한 분석 및 평가해줘. 예상되는 주요 구독자는 누구일 것인지, 글의 퀄리티는 어떠한지,",
"imports": []
},
"docs/records/ConnectAI/decisions/ADR-0060-https-www-koritips-com-분석해줘-어떠한-주제로-블로그가-운영되고-있는지-글의-퀄리티는-어떠.md": {
"mtimeMs": 1784534124012.3115,
"size": 1686,
"lines": 19,
"role": "ADR: https://www.koritips.com 분석해줘. 어떠한 주제로 블로그가 운영되고 있는지, 글의 퀄리티는 어떠한지, 검색해서 들어온 사람이...",
"imports": []
},
"docs/records/ConnectAI/development/2026-05-02_answer-format-readability-tuning.md": {
"mtimeMs": 1778028987330.4185,
"size": 1564,
@@ -5621,6 +5727,27 @@
"role": "Development Log: 지금까지 너는 나에게 아이디어, 핵심 내용, 기대 효과 내용으로 써줬는데. 법정 의무 교육은 다른 포멧으로 줬어 기대 효과를 써줘. 법정 의무 ...",
"imports": []
},
"docs/records/ConnectAI/development/2026-07-21_https-caliverse-io-사이트에-대한-분석해줘_implementation.md": {
"mtimeMs": 1784602271893.2676,
"size": 1708,
"lines": 22,
"role": "Development Log: https://caliverse.io 사이트에 대한 분석해줘.",
"imports": []
},
"docs/records/ConnectAI/development/2026-07-21_https-koritips-com-사이트에-대한-분석하고-어떠한-주제로-구성되어-있는지-사이트의-목표는-무엇_implementation.md": {
"mtimeMs": 1784607768898.34,
"size": 1725,
"lines": 22,
"role": "Development Log: https://koritips.com 사이트에 대한 분석하고 어떠한 주제로 구성되어 있는지, 사이트의 목표는 무엇인지.",
"imports": []
},
"docs/records/ConnectAI/development/2026-07-21_https-www-koritips-com-분석해줘-어떠한-주제로-블로그가-운영되고-있는지-글의-퀄리티는-어떠_implementation.md": {
"mtimeMs": 1784601796252.6404,
"size": 1572,
"lines": 22,
"role": "Development Log: https://www.koritips.com 분석해줘. 어떠한 주제로 블로그가 운영되고 있는지, 글의 퀄리티는 어떠한지, 검색해서 들어온 사람이...",
"imports": []
},
"docs/records/ConnectAI/discussions/2026-05-13_volumes-data-project-antigravity-connectai-이-프로젝트-작업-할-거야.md": {
"mtimeMs": 1778720117404.2578,
"size": 668,
@@ -5698,6 +5825,13 @@
"role": "Discussion: 우리 개발실은 가우시안 스필리터, 그리고 월마트에서 이머시브 스토어, 그리고 ai로 영상, 사운드 제작팀이 있어. 인원은 30명정도야. 여기에는...",
"imports": []
},
"docs/records/ConnectAI/discussions/2026-07-20_e-wiki-connectai-프로젝트-분석해줘.md": {
"mtimeMs": 1784522127183.7183,
"size": 577,
"lines": 16,
"role": "Discussion: E:\\Wiki\\connectai 프로젝트 분석해줘.",
"imports": []
},
"docs/records/ConnectAI/discussions/2026-07-20_e-wiki-connectai-프로젝트를-분석하고-구조에-대해서-설명해줘-2.md": {
"mtimeMs": 1784509596722.4983,
"size": 514,
@@ -5783,9 +5917,9 @@
"imports": []
},
"docs/records/ConnectAI/timeline.md": {
"mtimeMs": 1784517524755.3872,
"size": 26819,
"lines": 431,
"mtimeMs": 1784607768902.889,
"size": 28140,
"lines": 455,
"role": "Project Timeline",
"imports": []
},