From 8016ef18fa8d373d4faf31e39b9897ede21a0c21 Mon Sep 17 00:00:00 2001 From: g1nation Date: Fri, 22 May 2026 15:00:14 +0900 Subject: [PATCH] Update project files --- .astra/project-context/architecture.md | 104 +- .astra/project-context/scan-cache.json | 1377 +++++++++-------- ...d46d2ca2057b05c488be1dcf439166ac5a9a1.json | 2 +- ...9f4f39d2bc368f77456c37b5eef9a94a66b5c.json | 2 +- ...5c7a44d7661af673b24e3f49551a7a2e50280.json | 2 +- ...adc543795e4b427b64540a49c9ab27c7fe213.json | 4 +- ...son => stress_conflict_1779429500089.json} | 22 +- PATCHNOTES.md | 61 + docs/records/ConnectAI/chronicle.config.json | 4 +- ...”„๋กœ์ ํŠธ๋Š”-2nd-์ง€์‹์„-๋‚ด๊ฐ€-ํŠน์ •-ํด๋”๋กœ-wikiํ™”ํ•œ-.md | 19 + ...์„-์ถ”๊ฐ€ํ–ˆ์–ด-์ด-๊ธฐ๋Šฅ์ด-์•ž์œผ๋กœ-๋„ˆ๊ฐ€-๋‹ต์„-ํ• ๋•Œ-์–ด.md | 19 + ...•˜๋Š”๊ฒŒ-๋„ˆ๋ฌด-์‹ฌ์ ์œผ๋กœ-ํž˜๋“ ๋ฐ-์–ด๋–ป๊ฒŒ-๊ฐœ์„ ํ• -์ˆ˜-์žˆ์„๊นŒ.md | 19 + ...Šธ์ธ๋ฐ-๋‹จ์ˆœํžˆ-cloud-base-ai-model์„-_implementation.md | 22 + docs/records/ConnectAI/timeline.md | 12 + package-lock.json | 4 +- package.json | 2 +- src/agent.ts | 87 +- src/bridge.ts | 29 +- src/extension.ts | 16 +- src/features/astraOffice/view/runtime.ts | 31 +- src/features/secondBrainTrace.ts | 34 +- src/memory/EpisodicMemory.ts | 21 +- src/memory/LongTermMemory.ts | 11 +- src/memory/index.ts | 2 +- src/retrieval/scoring.ts | 30 +- src/security.ts | 66 +- src/sidebarProvider.ts | 25 +- src/skills/scopedBrainRetriever.ts | 41 +- src/utils.ts | 89 +- 29 files changed, 1353 insertions(+), 804 deletions(-) rename .astra/tests/stress/.astra/missions/{stress_conflict_1779280514813.json => stress_conflict_1779429500089.json} (78%) create mode 100644 docs/records/ConnectAI/decisions/ADR-0017-e-wiki-connectai-์งˆ๋ฌธ์ด-์žˆ์–ด-์ง€๊ธˆ-์ด-ํ”„๋กœ์ ํŠธ๋Š”-2nd-์ง€์‹์„-๋‚ด๊ฐ€-ํŠน์ •-ํด๋”๋กœ-wikiํ™”ํ•œ-.md create mode 100644 docs/records/ConnectAI/decisions/ADR-0018-๋ฐฉ๊ธˆ-2nd-๋‡Œ-์—-lateral-thinking-๊ด€๋ จ-์ง€์‹์„-์ถ”๊ฐ€ํ–ˆ์–ด-์ด-๊ธฐ๋Šฅ์ด-์•ž์œผ๋กœ-๋„ˆ๊ฐ€-๋‹ต์„-ํ• ๋•Œ-์–ด.md create mode 100644 docs/records/ConnectAI/decisions/ADR-0019-์˜ค๋Š˜-ํŒ€๋ณ„-๋ณด๊ณ ๋ฅผ-ํ–ˆ์–ด-๊ทธ๋ƒฅ-ํ•˜๋Š”๊ฒŒ-๋„ˆ๋ฌด-์‹ฌ์ ์œผ๋กœ-ํž˜๋“ ๋ฐ-์–ด๋–ป๊ฒŒ-๊ฐœ์„ ํ• -์ˆ˜-์žˆ์„๊นŒ.md create mode 100644 docs/records/ConnectAI/development/2026-05-22_e-wiki-connectai-์ด-ํ”„๋กœ์ ํŠธ๊ฐ€-๋„ˆ์˜-ํ”„๋กœ์ ํŠธ์ธ๋ฐ-๋‹จ์ˆœํžˆ-cloud-base-ai-model์„-_implementation.md diff --git a/.astra/project-context/architecture.md b/.astra/project-context/architecture.md index a9f29c7..c7f9aac 100644 --- a/.astra/project-context/architecture.md +++ b/.astra/project-context/architecture.md @@ -3,20 +3,20 @@ ## Snapshot -- **Workspace**: `ConnectAI` `v2.2.19` _(absolute path varies by environment; resolved from the active VS Code workspace)_ +- **Workspace**: `connectai` `v2.2.60` _(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**: 265 source files, ~52,981 lines across 5 top-level modules. +- **Stats**: 271 source files, ~55,157 lines across 5 top-level modules. ## Last Refresh -- **Time**: 2026-05-17T14:50:50.535Z -- **Files newly analysed**: 5 -- **Files reused from cache**: 260 +- **Time**: 2026-05-22T06:00:02.986Z +- **Files newly analysed**: 1 +- **Files reused from cache**: 270 ## Directory Map ```mermaid mindmap - root((ConnectAI)) + root((connectai)) src/ features/ core/ @@ -31,17 +31,18 @@ mindmap docs/ records/ docs/ + Meeting/ ``` ## Module Dependencies > Arrows: which top-level module imports from which. ```mermaid flowchart LR - src["src/
137 files"] + src["src/
139 files"] media["media/
6 files"] tests["tests/
35 files"] core_py["core_py/
6 files"] - docs["docs/
81 files"] + docs["docs/
85 files"] tests --> src ``` @@ -53,7 +54,7 @@ flowchart LR ## Hub Files > Imported by many other files โ€” touching these has wide blast radius. -- `src/utils.ts` โ€” referenced by **49** files +- `src/utils.ts` โ€” referenced by **50** files - `src/config.ts` โ€” referenced by **16** 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 - `src/core/services.ts` โ€” referenced by **10** files @@ -64,14 +65,14 @@ flowchart LR ## Modules -### `src/` โ€” 137 files, ~36,157 lines +### `src/` โ€” 139 files, ~38,157 lines **Sub-directories** -- `src/features/` (64) โ€” Astra Office โ€” public API. ๋‹ค์Œ ์„ธ์…˜์—์„œ ์ถ”๊ฐ€๋  OfficeSnapshot presenter / schema ๋„ ๊ฐ™์€ entry ๋กœ ๋…ธ์ถœ ์˜ˆ์ •. ํ˜„์žฌ ๋…ธ์ถœ: full webview panel H +- `src/features/` (66) โ€” Astra Office โ€” public API. ๋‹ค์Œ ์„ธ์…˜์—์„œ ์ถ”๊ฐ€๋  OfficeSnapshot presenter / schema ๋„ ๊ฐ™์€ entry ๋กœ ๋…ธ์ถœ ์˜ˆ์ •. ํ˜„์žฌ ๋…ธ์ถœ: full webview panel H - `src/core/` (15) โ€” Astra Path Resolver (๊ฒฝ๋กœ ํ•ด๊ฒฐ๊ธฐ) Astra์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ํŒŒ์ผ(.astra ๋””๋ ‰ํ† ๋ฆฌ)์˜ ๊ฒฝ๋กœ๋ฅผ ์ค‘์•™์—์„œ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ค์น˜ ๊ฒฝ๋กœ(extensionUri) ๊ธฐ๋ฐ˜์œผ๋กœ .astra ๋””๋ ‰ํ†  - `src/memory/` (8) โ€” Episodic Memory (์ผํ™” ๊ธฐ์–ต) ๊ณผ๊ฑฐ ๋Œ€ํ™”/ํšŒ์˜/๊ฒฐ์ •์˜ ๋งฅ๋ฝ ํ๋ฆ„์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์„ธ์…˜ ์ข…๋ฃŒ ์‹œ ์ž๋™์œผ๋กœ ์—ํ”ผ์†Œ๋“œ๋ฅผ ์š”์•ฝํ•˜์—ฌ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. "์™œ ์ด๋ ‡๊ฒŒ ๊ฒฐ์ •ํ–ˆ๋Š”์ง€", "์–ด๋–ค ํ๋ฆ„์œผ๋กœ ์ง„ํ–‰ํ–ˆ๋Š”์ง€" ๊ธฐ๋ก. ์ €์žฅ - `src/retrieval/` (8) โ€” Brain Index โ€” persistent, mtime-keyed tokenized cache of the Second Brain RAG ๊ฒ€์ƒ‰์€ ๋งค ์งˆ์˜๋งˆ๋‹ค ๋ธŒ๋ ˆ์ธ์˜ ๋ชจ๋“  .md ํŒŒ์ผ์„ ์ฝ๊ณ  ํ† ํฌ๋‚˜์ด์ฆˆํ•ด์„œ TF-I -- `src/docs/` (6) โ€” src Chronicle Records +- `src/docs/` (6) โ€” Bug: Edited agent.ts Edited agent.ts Edited agent.ts Edited agent.ts Edited agent.ts ... - `src/lib/` (6) โ€” Context Manager (์ปจํ…์ŠคํŠธ ํ•œ๊ณ„ ๊ด€๋ฆฌ) "context length = 132k" ๋Š” "๋‹ต๋ณ€์„ 132k ํ† ํฐ๊นŒ์ง€ ์ƒ์„ฑํ•ด๋„ ๋œ๋‹ค" ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ + ๋Œ€ํ™” ๊ธฐ๋ก + ์ž…๋ ฅ ๋ฌธ์„œ + ์ƒ์„ฑ๋  ๋‹ต๋ณ€ - `src/integrations/` (4) โ€” 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) @@ -81,41 +82,41 @@ flowchart LR - `src/scaffolder/` (2) โ€” Scaffolder template catalog. Templates are pure data โ€” (projectName) => { [relativePath]: contents }. New templates are **Key files** -- `src/utils.ts` (360 lines) +- `src/utils.ts` (408 lines) - `src/config.ts` (298 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) - `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/sidebarProvider.ts` (4165 lines) +- `src/sidebarProvider.ts` (4226 lines) - `src/memory/types.ts` (126 lines) โ€” Memory Type Definitions (๋ฉ”๋ชจ๋ฆฌ ํƒ€์ž… ์ •์˜) Astra์˜ 5-Layer Cognitive Memory System์˜ ๋ชจ๋“  ํƒ€์ž…์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. โ‘  Short-Term โ‘ก Long-Term โ‘ข Project โ‘ฃ Procedural โ‘ค Episodic -- `src/retrieval/scoring.ts` (518 lines) โ€” Scoring Engine โ€” TF-IDF + Bilingual Tokenizer ๋‹จ์ˆœ includes() ํ‚ค์›Œ๋“œ ๋งค์นญ์„ ๋„˜์–ด์„œ, TF-IDF ๊ฐ€์ค‘์น˜ ๊ธฐ๋ฐ˜์˜ ๋ฌธ์„œ ์Šค์ฝ”์–ด๋ง์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•œ๊ตญ์–ด/์˜์–ด ์–‘๊ตญ์–ด ํ† ํฌ๋‚˜์ด์ €๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. +- `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` (3633 lines) +- `src/agent.ts` (3694 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/features/company/dispatcher.ts` (1435 lines) โ€” 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 +- `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 ์— +- `src/features/company/dispatcher.ts` (1437 lines) โ€” 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 - `src/features/providers/providerConfig.ts` (78 lines) โ€” Provider ๋ณ„ API key + enable ํ† ๊ธ€ ์ €์žฅ์†Œ. ์„ค๊ณ„: - API key ์ž์ฒด๋Š” vscode.SecretStorage (secrets) ์— โ€” settings.json / Settings Sync ์นจ๋ฒ” ์•ˆ ๋ฐ›์Œ. - enabled ํ† ๊ธ€์€ ์ผ๋ฐ˜ settings (g1nation.providers..enabled) โ€” ์‚ฌ์šฉ์ž๊ฐ€ ํŒจ๋„์—์„œ - `src/features/approval/approvalQueue.ts` (129 lines) - `src/integrations/telegram/telegramClient.ts` (154 lines) -- `src/features/astraOffice/view/runtime.ts` (1887 lines) โ€” ์ž๋™ ๋ถ„๋ฆฌ: src/sidebarProvider.ts 4002-5116 (IIFE ๋ณธ๋ฌธ) ์—์„œ ์ถ”์ถœ. ๋™์ž‘ ๋™๋“ฑ. ${assets.derivedBase} placeholder ๋Š” panelHtml ์—์„œ .replace() ๋กœ ์‹ค์ œ ๊ฐ’ ์ฃผ์ž…. ๋‹ค์Œ ์„ธ์…˜์—์„œ OfficeSnapshot ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹จ๊ณ„์ ์œผ๋กœ ์ž˜๋ผ๋‚ผ ์˜ˆ์ •. +- `src/features/astraOffice/view/runtime.ts` (1932 lines) โ€” ์ž๋™ ๋ถ„๋ฆฌ: src/sidebarProvider.ts 4002-5116 (IIFE ๋ณธ๋ฌธ) ์—์„œ ์ถ”์ถœ. ๋™์ž‘ ๋™๋“ฑ. ${assets.derivedBase} placeholder ๋Š” panelHtml ์—์„œ .replace() ๋กœ ์‹ค์ œ ๊ฐ’ ์ฃผ์ž…. ๋‹ค์Œ ์„ธ์…˜์—์„œ OfficeSnapshot ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹จ๊ณ„์ ์œผ๋กœ ์ž˜๋ผ๋‚ผ ์˜ˆ์ •. - `src/features/company/agents.ts` (211 lines) โ€” ๊ธฐ๋ณธ ์—์ด์ „ํŠธ ๋กœ์Šคํ„ฐ โ€” 1์ธ ๊ธฐ์—… ๋ชจ๋“œ์˜ ์ถœ๊ณ  ๋””ํดํŠธ. ์„ค๊ณ„ ์˜๋„: ์†Œํ”„ํŠธ์›จ์–ด/๊ฒŒ์ž„ ๊ฐœ๋ฐœ IT ํšŒ์‚ฌ์˜ 1์ธ ๊ธฐ์—… ์šด์˜์„ ๊ฐ€์ •. ํ•œ ์‚ฌ๋žŒ์ด ๊ธฐํš โ†’ ๋””์ž์ธ โ†’ ๊ฐœ๋ฐœ โ†’ QA โ†’ ์ถœ์‹œ โ†’ ์šด์˜/๋งˆ์ผ€ํŒ…์„ ๋ชจ๋‘ ์ฑ…์ž„์งˆ ๋•Œ ํ•„์š”ํ•œ ์ง๊ตฐ์„ ๋น ์ง์—†์ด ์ปค๋ฒ„ํ•˜๋˜ ์—ญํ• ์ด ๊ฒน์น˜์ง€ ์•Š๊ฒŒ ๋ถ„๋ฆฌํ•œ๋‹ค. ์ง๊ตฐ ๊ตฌ๋ถ„ (ํ˜ผ๋™ ๋ฐฉ์ง€): - ๊ธฐํš์ž(business) : ๋ฌด์—‡์„ ๋งŒ๋“ค์ง€ ์ •์˜ - `src/features/company/pixelOfficeState.ts` (286 lines) โ€” Pixel Office โ€” Agent Work Pipeline ์ƒํƒœ๋ฅผ ์‹œ๊ฐํ™”ํ•˜๋Š” UI Layer ์ „์šฉ ๋ชจ๋“ˆ. โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ์„ค๊ณ„ ์›์น™ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ 1. Agent ํ•ต์‹ฌ ํŒ๋‹จ ๋กœ์ง์„ ์ ˆ๋Œ€ ๋ฐ”๊พธ์ง€ ์•Š๋Š”๋‹ค. Pipeline ์ง„ํ–‰, contract ํ•ฉ์˜, ๊ฒ€์ˆ˜ cycle, ์Šน์ธ ๊ฒŒ์ดํŠธ โ€” ๋ชจ๋‘ ๊ธฐ์กด dispatcher - `src/features/company/sessionStore.ts` (231 lines) โ€” Disk persistence for company-mode session artefacts. Each company turn produces a timestamped directory: /.astra/company/sessions/2026-05-13T21-29/ โ”œโ”€ brief.md โ† CEO's task decompositio - `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)์„ ๊ณ„ -- `src/extension.ts` (1215 lines) -### `media/` โ€” 6 files, ~7,243 lines +### `media/` โ€” 6 files, ~7,328 lines **Key files** -- `media/sidebar.css` (2068 lines) โ€” Stylesheet -- `media/sidebar.js` (3680 lines) -- `media/sidebar.html` (546 lines) โ€” Astra -- `media/settings-panel.html` (328 lines) โ€” Astra Settings +- `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.css` (210 lines) โ€” Stylesheet -- `media/settings-panel.js` (411 lines) +- `media/settings-panel.js` (445 lines) ### `tests/` โ€” 35 files, ~5,969 lines *Depends on*: `src/` @@ -160,11 +161,12 @@ flowchart LR - `core_py/optimizer.py` (55 lines) - `core_py/queue_worker.py` (82 lines) -### `docs/` โ€” 81 files, ~3,203 lines +### `docs/` โ€” 85 files, ~3,294 lines **Sub-directories** -- `docs/records/` (68) โ€” Astra Project Chronicle Records -- `docs/docs/` (5) โ€” docs Chronicle Records +- `docs/records/` (72) โ€” Bug: /Volumes/Data/project/Antigravity/ConnectAI ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ํ•ด์ค„ ์ˆ˜ ์žˆ์–ด? ๊ฐœ์„ ํ•  ๋ถ€๋ถ„์ด ์žˆ๋Š”์ง€, ๊ทธ๋Ÿฌ๊ณ ... +- `docs/docs/` (5) โ€” Bug: Viewed integrationretrieval.test.ts:1-59 integrationretrieval.test.ts๋ฅผ ํ†ตํ•ด ... +- `docs/Meeting/` (0) **Key files** - `docs/TELEGRAM_REMOTE_EXECUTION_PLAN.md` (452 lines) โ€” Telegram Remote Execution ๊ธฐํš์„œ @@ -173,25 +175,25 @@ 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` (155 lines) โ€” Project Timeline +- `docs/records/ConnectAI/timeline.md` (167 lines) โ€” Project Timeline - `docs/Advanced_Features_Implementation_Guide.md` (40 lines) โ€” Advanced Features Implementation Guide -- `docs/PROJECT_CHRONICLE_GUARD_ROADMAP.md` (43 lines) โ€” Project Chronicle Guard: Search Engine Roadmap -- `docs/UX_UI_Consistency_Guidelines.md` (44 lines) โ€” UX/UI Consistency Guidelines -- `docs/docs/records/docs/README.md` (18 lines) โ€” docs Chronicle Records - `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 - `docs/docs/records/docs/project-profile.md` (31 lines) โ€” Project Profile +- `docs/docs/records/docs/README.md` (18 lines) โ€” docs Chronicle Records - `docs/docs/records/docs/timeline.md` (7 lines) โ€” Project Timeline -- `docs/records/ConnectAI/README.md` (18 lines) โ€” Astra Project Chronicle Records -- `docs/records/ConnectAI/bugs/BUG-0001-volumes-data-project-antigravity-connectai-แ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณ-แ„แ…ฉแ„ƒแ…ณ-แ„…แ…ตแ„‡แ…ฒ-แ„’แ…ขแ„Œแ…ฎแ†ฏ-แ„‰แ…ฎ-แ„‹แ…ตแ†ป.md` (16 lines) โ€” Bug: /Volumes/Data/project/Antigravity/ConnectAI ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ํ•ด์ค„ ์ˆ˜ ์žˆ์–ด? ๊ฐœ์„ ํ•  ๋ถ€๋ถ„์ด ์žˆ๋Š”์ง€, ๊ทธ๋Ÿฌ๊ณ ... -- `docs/records/ConnectAI/bugs/BUG-0002-แ„Œแ…ตแ„€แ…ณแ†ท-แ„‚แ…ขแ„€แ…ก-แ„‡แ…ฎแ†ซแ„‰แ…ฅแ†จ-แ„‹แ…ญแ„Žแ…ฅแ†ผแ„’แ…กแ„€แ…ฉ-แ„‚แ…ฅแ„€แ…ก-แ„ƒแ…กแ†ธแ„‹แ…ณแ†ฏ-แ„Œแ…ฎแ†ฏแ„„แ…ข-แ„‹แ…กแ„…แ…ข-แ„แ…ฆแ†ทแ„‘แ…ณแ†ฏแ„…แ…ตแ†บแ„‹แ…ฆ-แ„†แ…กแ†ฝแ„Žแ…ฏ-แ„ƒแ…กแ†ธแ„‹แ…ณแ†ฏ-แ„Šแ…ฅแ„Œแ…ฎแ„€แ…ฉ-แ„‹แ…ตแ†ปแ„‚แ…ณแ†ซแ„ƒแ…ฆ-แ„€แ…ขแ„‰แ…ฅแ†ซ-แ„‘แ…ฉแ„‹แ…ตแ†ซแ„แ…ณแ„€แ…ก-แ„‹แ…ตแ†ปแ„‚แ…ณแ†ซแ„Œแ…ต-แ„’แ…ชแ†จแ„‹แ…ตแ†ซแ„’แ…ข.md` (16 lines) โ€” Bug: ์ง€๊ธˆ ๋‚ด๊ฐ€ ๋ถ„์„ ์š”์ฒญํ•˜๊ณ  ๋„ˆ๊ฐ€ ๋‹ต์„ ์ค„๋•Œ ์•„๋ž˜ ํ…œํ”Œ๋ฆฟ์— ๋งž์ถฐ ๋‹ต์„ ์จ์ฃผ๊ณ  ์žˆ๋Š”๋ฐ, ๊ฐœ์„  ํฌ์ธํŠธ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์ค˜. ## ๋‚ด๊ฐ€ ๋ณด๋Š” ์œ„ํ—˜ ๊ฐ€์žฅ ํฐ... -- `docs/records/ConnectAI/bugs/BUG-0003-volumes-data-project-antigravity-connectai-แ„‚แ…ข-แ„Œแ…ตแ†ฏแ„†แ…ฎแ†ซแ„‹แ…ฆ-แ„ƒแ…ขแ„’แ…กแ†ซ-แ„ƒแ…กแ†ธแ„‡แ…งแ†ซแ„‹แ…ต-แ„Œแ…กแ†ฏ-แ„Œแ…ฅแ†ผแ„…แ…ต.md` (16 lines) โ€” Bug: /Volumes/Data/project/Antigravity/ConnectAI ๋‚ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ์ž˜ ์ •๋ฆฌ๋˜์„œ ์•Œ๋ ค์ฃผ๊ธด ํ•˜๋Š”๋ฐ focused... -- `docs/records/ConnectAI/bugs/BUG-0004-volumes-data-project-antigravity-connectai-แ„‚แ…ข-แ„Œแ…ตแ†ฏแ„†แ…ฎแ†ซแ„‹แ…ฆ-แ„ƒแ…ขแ„’แ…กแ†ซ-แ„ƒแ…กแ†ธแ„‡แ…งแ†ซแ„‹แ…ต-แ„Œแ…กแ†ฏ-แ„Œแ…ฅแ†ผแ„…แ…ต.md` (16 lines) โ€” Bug: /Volumes/Data/project/Antigravity/ConnectAI ๋‚ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ์ž˜ ์ •๋ฆฌ๋˜์„œ ์•Œ๋ ค์ฃผ๊ธด ํ•˜๋Š”๋ฐ focused... -- `docs/records/ConnectAI/bugs/BUG-0005-แ„ƒแ…กแ„‰แ…ตแ„’แ…กแ†ซแ„‡แ…ฅแ†ซ-แ„ƒแ…กแ†ธแ„Œแ…ฏ-volumes-data-project-antigravity-connectai-แ„‚แ…ข-แ„Œแ…ตแ†ฏแ„†แ…ฎแ†ซแ„‹แ…ฆ-แ„ƒแ…ขแ„’แ…กแ†ซ-.md` (16 lines) โ€” Bug: ๋‹ค์‹œํ•œ๋ฒˆ ๋‹ต์ค˜. /Volumes/Data/project/Antigravity/ConnectAI ๋‚ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ์ž˜ ์ •๋ฆฌ๋˜์„œ ์•Œ๋ ค์ฃผ๊ธด ํ•˜๋Š”... -- `docs/records/ConnectAI/bugs/BUG-0006-volumes-data-project-antigravity-connectai-แ„‚แ…ข-แ„Œแ…ตแ†ฏแ„†แ…ฎแ†ซแ„‹แ…ฆ-แ„ƒแ…ขแ„’แ…กแ†ซ-แ„ƒแ…กแ†ธแ„‡แ…งแ†ซแ„‹แ…ต-แ„Œแ…กแ†ฏ-แ„Œแ…ฅแ†ผแ„…แ…ต.md` (16 lines) โ€” Bug: /Volumes/Data/project/Antigravity/ConnectAI ๋‚ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ์ž˜ ์ •๋ฆฌ๋˜์„œ ์•Œ๋ ค์ฃผ๊ธด ํ•˜๋Š”๋ฐ focused... -- `docs/records/ConnectAI/bugs/BUG-0007-volumes-data-project-antigravity-connectai-แ„‚แ…ข-แ„Œแ…ตแ†ฏแ„†แ…ฎแ†ซแ„‹แ…ฆ-แ„ƒแ…ขแ„’แ…กแ†ซ-แ„ƒแ…กแ†ธแ„‡แ…งแ†ซแ„‹แ…ต-แ„Œแ…กแ†ฏ-แ„Œแ…ฅแ†ผแ„…แ…ต.md` (16 lines) โ€” Bug: /Volumes/Data/project/Antigravity/ConnectAI ๋‚ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ์ž˜ ์ •๋ฆฌ๋˜์„œ ์•Œ๋ ค์ฃผ๊ธด ํ•˜๋Š”๋ฐ focused... -- `docs/records/ConnectAI/bugs/BUG-0008-volumes-data-project-antigravity-connectai-แ„‚แ…ข-แ„Œแ…ตแ†ฏแ„†แ…ฎแ†ซแ„‹แ…ฆ-แ„ƒแ…ขแ„’แ…กแ†ซ-แ„ƒแ…กแ†ธแ„‡แ…งแ†ซแ„‹แ…ต-แ„Œแ…กแ†ฏ-แ„Œแ…ฅแ†ผแ„…แ…ต.md` (16 lines) โ€” Bug: /Volumes/Data/project/Antigravity/ConnectAI ๋‚ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ์ž˜ ์ •๋ฆฌ๋˜์„œ ์•Œ๋ ค์ฃผ๊ธด ํ•˜๋Š”๋ฐ focused... -- `docs/records/ConnectAI/bugs/BUG-0009-แ„†แ…ฎแ†ซแ„Œแ…ฆแ„Œแ…ฅแ†ทแ„‹แ…ณแ†ฏ-แ„‹แ…ตแ†ฐแ„€แ…ฉ-แ„‹แ…ฅแ„„แ…ฅแ‡‚แ„€แ…ฆ-แ„€แ…ขแ„‰แ…ฅแ†ซแ„’แ…กแ„‚แ…ณแ†ซแ„€แ…ฆ-แ„Žแ…ฌแ„‰แ…ฅแ†ซแ„‹แ…ตแ†ซแ„Œแ…ต-แ„‡แ…ฎแ†ซแ„‰แ…ฅแ†จแ„’แ…ขแ„Œแ…ฎแ„†แ…งแ†ซ-แ„Œแ…ฉแ‡‚แ„€แ…ฆแ†ปแ„‹แ…ฅ-แ„‹แ…กแ†ฏแ„€แ…ฆแ†ปแ„‰แ…ณแ†ธแ„‚แ…ตแ„ƒแ…ก-แ„Œแ…ตแ„€แ…ณแ†ทแ„‡แ…ฎแ„แ…ฅ-connectai-แ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณ-แ„‹แ…ฆ.md` (16 lines) โ€” Bug: ๋ฌธ์ œ์ ์„ ์ฝ๊ณ  ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•˜๋Š”๊ฒŒ ์ตœ์„ ์ธ์ง€ ๋ถ„์„ํ•ด์ฃผ๋ฉด ์ข‹๊ฒ ์–ด. ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๋ถ€ํ„ฐ ConnectAI ํ”„๋กœ์ ํŠธ์—๋งŒ ์™„์ „ํžˆ ์ง‘์ค‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ... +- `docs/PROJECT_CHRONICLE_GUARD_ROADMAP.md` (43 lines) โ€” Project Chronicle Guard: Search Engine Roadmap +- `docs/records/ConnectAI/bugs/BUG-0001-volumes-data-project-antigravity-connectai-ํ”„๋กœ์ ํŠธ-์ฝ”๋“œ-๋ฆฌ๋ทฐ-ํ•ด์ค„-์ˆ˜-์žˆ.md` (16 lines) โ€” Bug: /Volumes/Data/project/Antigravity/ConnectAI ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ํ•ด์ค„ ์ˆ˜ ์žˆ์–ด? ๊ฐœ์„ ํ•  ๋ถ€๋ถ„์ด ์žˆ๋Š”์ง€, ๊ทธ๋Ÿฌ๊ณ ... +- `docs/records/ConnectAI/bugs/BUG-0002-์ง€๊ธˆ-๋‚ด๊ฐ€-๋ถ„์„-์š”์ฒญํ•˜๊ณ -๋„ˆ๊ฐ€-๋‹ต์„-์ค„๋•Œ-์•„๋ž˜-ํ…œํ”Œ๋ฆฟ์—-๋งž์ถฐ-๋‹ต์„-์จ์ฃผ๊ณ -์žˆ๋Š”๋ฐ-๊ฐœ์„ -ํฌ์ธํŠธ๊ฐ€-์žˆ๋Š”์ง€-ํ™•์ธํ•ด.md` (16 lines) โ€” Bug: ์ง€๊ธˆ ๋‚ด๊ฐ€ ๋ถ„์„ ์š”์ฒญํ•˜๊ณ  ๋„ˆ๊ฐ€ ๋‹ต์„ ์ค„๋•Œ ์•„๋ž˜ ํ…œํ”Œ๋ฆฟ์— ๋งž์ถฐ ๋‹ต์„ ์จ์ฃผ๊ณ  ์žˆ๋Š”๋ฐ, ๊ฐœ์„  ํฌ์ธํŠธ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์ค˜. ## ๋‚ด๊ฐ€ ๋ณด๋Š” ์œ„ํ—˜ ๊ฐ€์žฅ ํฐ... +- `docs/records/ConnectAI/bugs/BUG-0003-volumes-data-project-antigravity-connectai-๋‚ด-์งˆ๋ฌธ์—-๋Œ€ํ•œ-๋‹ต๋ณ€์ด-์ž˜-์ •๋ฆฌ.md` (16 lines) โ€” Bug: /Volumes/Data/project/Antigravity/ConnectAI ๋‚ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ์ž˜ ์ •๋ฆฌ๋˜์„œ ์•Œ๋ ค์ฃผ๊ธด ํ•˜๋Š”๋ฐ focused... +- `docs/records/ConnectAI/bugs/BUG-0004-volumes-data-project-antigravity-connectai-๋‚ด-์งˆ๋ฌธ์—-๋Œ€ํ•œ-๋‹ต๋ณ€์ด-์ž˜-์ •๋ฆฌ.md` (16 lines) โ€” Bug: /Volumes/Data/project/Antigravity/ConnectAI ๋‚ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ์ž˜ ์ •๋ฆฌ๋˜์„œ ์•Œ๋ ค์ฃผ๊ธด ํ•˜๋Š”๋ฐ focused... +- `docs/records/ConnectAI/bugs/BUG-0005-๋‹ค์‹œํ•œ๋ฒˆ-๋‹ต์ค˜-volumes-data-project-antigravity-connectai-๋‚ด-์งˆ๋ฌธ์—-๋Œ€ํ•œ-.md` (16 lines) โ€” Bug: ๋‹ค์‹œํ•œ๋ฒˆ ๋‹ต์ค˜. /Volumes/Data/project/Antigravity/ConnectAI ๋‚ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ์ž˜ ์ •๋ฆฌ๋˜์„œ ์•Œ๋ ค์ฃผ๊ธด ํ•˜๋Š”... +- `docs/records/ConnectAI/bugs/BUG-0006-volumes-data-project-antigravity-connectai-๋‚ด-์งˆ๋ฌธ์—-๋Œ€ํ•œ-๋‹ต๋ณ€์ด-์ž˜-์ •๋ฆฌ.md` (16 lines) โ€” Bug: /Volumes/Data/project/Antigravity/ConnectAI ๋‚ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ์ž˜ ์ •๋ฆฌ๋˜์„œ ์•Œ๋ ค์ฃผ๊ธด ํ•˜๋Š”๋ฐ focused... +- `docs/records/ConnectAI/bugs/BUG-0007-volumes-data-project-antigravity-connectai-๋‚ด-์งˆ๋ฌธ์—-๋Œ€ํ•œ-๋‹ต๋ณ€์ด-์ž˜-์ •๋ฆฌ.md` (16 lines) โ€” Bug: /Volumes/Data/project/Antigravity/ConnectAI ๋‚ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ์ž˜ ์ •๋ฆฌ๋˜์„œ ์•Œ๋ ค์ฃผ๊ธด ํ•˜๋Š”๋ฐ focused... +- `docs/records/ConnectAI/bugs/BUG-0008-volumes-data-project-antigravity-connectai-๋‚ด-์งˆ๋ฌธ์—-๋Œ€ํ•œ-๋‹ต๋ณ€์ด-์ž˜-์ •๋ฆฌ.md` (16 lines) โ€” Bug: /Volumes/Data/project/Antigravity/ConnectAI ๋‚ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ์ž˜ ์ •๋ฆฌ๋˜์„œ ์•Œ๋ ค์ฃผ๊ธด ํ•˜๋Š”๋ฐ focused... +- `docs/records/ConnectAI/bugs/BUG-0009-๋ฌธ์ œ์ ์„-์ฝ๊ณ -์–ด๋–ป๊ฒŒ-๊ฐœ์„ ํ•˜๋Š”๊ฒŒ-์ตœ์„ ์ธ์ง€-๋ถ„์„ํ•ด์ฃผ๋ฉด-์ข‹๊ฒ ์–ด-์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค-์ง€๊ธˆ๋ถ€ํ„ฐ-connectai-ํ”„๋กœ์ ํŠธ-์—.md` (16 lines) โ€” Bug: ๋ฌธ์ œ์ ์„ ์ฝ๊ณ  ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•˜๋Š”๊ฒŒ ์ตœ์„ ์ธ์ง€ ๋ถ„์„ํ•ด์ฃผ๋ฉด ์ข‹๊ฒ ์–ด. ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๋ถ€ํ„ฐ ConnectAI ํ”„๋กœ์ ํŠธ์—๋งŒ ์™„์ „ํžˆ ์ง‘์ค‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ... +- `docs/records/ConnectAI/bugs/BUG-0010-๋ฌธ์ œ์ ์„-์ฝ๊ณ -์–ด๋–ป๊ฒŒ-๊ฐœ์„ ํ•˜๋Š”๊ฒŒ-์ตœ์„ ์ธ์ง€-๋ถ„์„ํ•ด์ฃผ๋ฉด-์ข‹๊ฒ ์–ด-์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค-์ง€๊ธˆ๋ถ€ํ„ฐ-connectai-ํ”„๋กœ์ ํŠธ-์—.md` (16 lines) โ€” Bug: ๋ฌธ์ œ์ ์„ ์ฝ๊ณ  ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•˜๋Š”๊ฒŒ ์ตœ์„ ์ธ์ง€ ๋ถ„์„ํ•ด์ฃผ๋ฉด ์ข‹๊ฒ ์–ด. ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๋ถ€ํ„ฐ ConnectAI ํ”„๋กœ์ ํŠธ์—๋งŒ ์™„์ „ํžˆ ์ง‘์ค‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ... +- `docs/records/ConnectAI/bugs/BUG-0011-๋ฌธ์ œ์ ์„-์ฝ๊ณ -์–ด๋–ป๊ฒŒ-๊ฐœ์„ ํ•˜๋Š”๊ฒŒ-์ตœ์„ ์ธ์ง€-๋ถ„์„ํ•ด์ฃผ๋ฉด-์ข‹๊ฒ ์–ด-์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค-์ง€๊ธˆ๋ถ€ํ„ฐ-connectai-ํ”„๋กœ์ ํŠธ-์—.md` (16 lines) โ€” Bug: ๋ฌธ์ œ์ ์„ ์ฝ๊ณ  ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•˜๋Š”๊ฒŒ ์ตœ์„ ์ธ์ง€ ๋ถ„์„ํ•ด์ฃผ๋ฉด ์ข‹๊ฒ ์–ด. ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๋ถ€ํ„ฐ ConnectAI ํ”„๋กœ์ ํŠธ์—๋งŒ ์™„์ „ํžˆ ์ง‘์ค‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ... ## VS Code Extension Surface - **Extension ID**: `g1nation.astra` @@ -225,8 +227,13 @@ flowchart LR - `g1nation.calendar.refresh` โ€” Astra: Google Calendar ์ƒˆ๋กœ๊ณ ์นจ ๐Ÿ“… - `g1nation.calendar.connectOAuth` โ€” Astra: Google Calendar OAuth ์—ฐ๊ฒฐ (์“ฐ๊ธฐ) ๐Ÿ” - `g1nation.devilAgent.toggle` โ€” Astra: Toggle Devil Agent ๐ŸŽญ -- **Configuration** (63 settings): +- **Configuration** (68 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.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. @@ -271,7 +278,7 @@ flowchart LR - `g1nation.company.autoSelectPipeline` *(boolean)* _(default: `true`)_ โ€” Let the intent classifier *automatically switch* to the pipeline it recommends for this turn (e.g. short '๊ธฐํš์„œ๊นŒ์ง€๋งŒ' for a planning ask, full 'ํ’€ ํ”„๋กœ๋•ํŠธ' for an end-to-end product). Your explicitly-activate - `g1nation.company.intentAlignmentMode` *(string)* _(default: `"smart"`)_ โ€” Intent Alignment โ€” turn user prompts into an explicit Requirement Contract (C-G-C-F-Q) before dispatching a pipeline. 'off' = legacy, pipeline runs immediately. 'smart' (default) = run when confidence - `g1nation.company.intentAlignmentMaxRounds` *(number)* _(default: `3`)_ โ€” Maximum back-and-forth rounds the Intent Alignment analyzer is allowed to ask before forcing a 'confirm or cancel' card (it stops asking new questions and shows the current contract for user approval) - - `g1nation.selfReflector.enabled` *(boolean)* _(default: `true`)_ โ€” Self-Reflector Phase A โ€” append a [Self-Reflector Check] block at the end of every substantive LLM answer (Consistency / Completeness / Accuracy, plus References / Paths for code answers). Zero extra + - `g1nation.selfReflector.enabled` *(boolean)* _(default: `false`)_ โ€” Self-Reflector Phase A โ€” append a [Self-Reflector Check] block at the end of every substantive LLM answer (Consistency / Completeness / Accuracy, plus References / Paths for code answers). Zero extra - `g1nation.selfReflector.externalVerification` *(boolean)* _(default: `false`)_ โ€” Self-Reflector Phase B โ€” after every 1์ธ ๊ธฐ์—… specialist response, run a *separate* LLM call to verify the output from an outside-context perspective (catches the 'same model self-validates' blind spot). - `g1nation.selfReflector.executionVerification` *(boolean)* _(default: `false`)_ โ€” Self-Reflector Phase C โ€” after a code file is created via , automatically run the language's syntax check (Python: py_compile, JS: node --check, TS: project tsc --noEmit). Failures are su - `g1nation.company.pixelOffice.enabled` *(boolean)* _(default: `true`)_ โ€” Show the Pixel Office visualisation panel above the chat โ€” a small pixel-office-style display that mirrors the agent's current pipeline status (analyzing, need_clarification, executing, reviewing, wai @@ -281,12 +288,7 @@ flowchart LR - `g1nation.google.calendarId` *(string)* _(default: `"primary"`)_ - `g1nation.google.defaultEventDurationMinutes` *(number)* _(default: `60`)_ โ€” end / duration ๋‘˜ ๋‹ค ์—†๋Š” ์ผ์ •์˜ ๊ธฐ๋ณธ ๊ธธ์ด (๋ถ„). agent ๊ฐ€ ํšŒ์˜๋ก์—์„œ ์‹œ๊ฐ๋งŒ ์ถ”์ถœํ•˜๊ณ  ์ข…๋ฃŒ ์‹œ๊ฐ์€ ๋ช…์‹œ ์•ˆ ํ–ˆ์„ ๋•Œ ์ ์šฉ. - `g1nation.google.icalUrl` *(string)* _(default: `""`)_ - - `g1nation.google.icalDaysAhead` *(number)* _(default: `14`)_ โ€” iCal ์บ์‹œ์— ํฌํ•จํ•  ๋‹ค๊ฐ€์˜ค๋Š” ์ผ์ • ๊ธฐ๊ฐ„ (์ผ). default 14 = 2์ฃผ์น˜. - - `g1nation.providers.openrouter.enabled` *(boolean)* _(default: `false`)_ โ€” OpenRouter cloud provider ํ™œ์„ฑํ™” โ€” Claude/Gemini/GPT ๋“ฑ 100+ ๋ชจ๋ธ์„ OpenAI ํ˜ธํ™˜ API ๋กœ ์‚ฌ์šฉ. API key ๋Š” Astra Settings ํŒจ๋„์—์„œ ๋“ฑ๋ก (Secret Storage ์‚ฌ์šฉ, settings.json ๋น„์ €์žฅ). - - `g1nation.providers.openrouter.defaultModel` *(string)* _(default: `""`)_ โ€” OpenRouter ์˜ ๊ธฐ๋ณธ ๋ชจ๋ธ (์˜ˆ: 'anthropic/claude-3.5-sonnet'). ๋ชจ๋ธ ์„ ํƒ ์‹œ 'openrouter:' ํ˜•์‹์œผ๋กœ ์‚ฌ์ด๋“œ๋ฐ” dropdown ์— ํ‘œ์‹œ. - - `g1nation.providers.anthropic.enabled` *(boolean)* _(default: `false`)_ โ€” Anthropic Claude ์ง์ ‘ API ํ™œ์„ฑํ™”. OpenRouter ๋ณด๋‹ค ๋งˆ์ง„ ์ ๊ณ  prompt caching ๋“ฑ native ๊ธฐ๋Šฅ ์‚ฌ์šฉ ๊ฐ€๋Šฅ. API key ๋Š” Secret Storage. - - `g1nation.providers.anthropic.defaultModel` *(string)* _(default: `"claude-3-5-sonnet-20241022"`)_ โ€” Anthropic ์˜ ๊ธฐ๋ณธ ๋ชจ๋ธ. ์˜ˆ: 'claude-3-5-sonnet-20241022', 'claude-3-5-haiku-20241022'. - - _โ€ฆand 3 more_ + - _โ€ฆand 8 more_ ## Dependencies - **Runtime** (2): `@lmstudio/sdk`, `pdf-parse` @@ -334,7 +336,7 @@ Astra๋Š” ๋Œ€ํ‘œ๋‹˜์˜ ๋ช…์‹œ์ ์ธ ์Šน์ธ ํ•˜์— ๋กœ์ปฌ ์‹œ์Šคํ…œ์˜ ๊ฐ•๋ ฅํ•œ **Designed for High-Performance Decision Making.** Copyright (C) **g1nation**. All rights reserved. -_Last auto-scan: 2026-05-17T14:50:50.535Z ยท signature `5421df2d`_ +_Last auto-scan: 2026-05-22T06:00:02.986Z ยท signature `3e9af639`_ ## Purpose diff --git a/.astra/project-context/scan-cache.json b/.astra/project-context/scan-cache.json index 9de3882..02c51df 100644 --- a/.astra/project-context/scan-cache.json +++ b/.astra/project-context/scan-cache.json @@ -1,11 +1,11 @@ { "version": 1, - "generatedAt": "2026-05-17T14:50:50.547Z", + "generatedAt": "2026-05-22T06:00:03.020Z", "files": { "src/agent.ts": { - "mtimeMs": 1778943938000, - "size": 209036, - "lines": 3633, + "mtimeMs": 1779428598292.2295, + "size": 216127, + "lines": 3694, "role": "", "imports": [ "src/utils", @@ -39,8 +39,8 @@ ] }, "src/agents/AgentWorkflowManager.ts": { - "mtimeMs": 1778690404000, - "size": 2262, + "mtimeMs": 1778720117490.4294, + "size": 2322, "lines": 60, "role": "", "imports": [ @@ -50,8 +50,8 @@ ] }, "src/agents/factory.ts": { - "mtimeMs": 1778690336000, - "size": 11023, + "mtimeMs": 1778720117507.1616, + "size": 11242, "lines": 219, "role": "", "imports": [ @@ -60,8 +60,8 @@ ] }, "src/agents/reflectionPersister.ts": { - "mtimeMs": 1778763469000, - "size": 11986, + "mtimeMs": 1778807413489.8743, + "size": 12294, "lines": 308, "role": "Reflection โ†’ Lesson persistence Take the Reflector agent's structured critique and persist any substantive findings as a lesson card in /lessons/auto-reflector/. The existing brain retrieval", "imports": [ @@ -70,9 +70,9 @@ ] }, "src/bridge.ts": { - "mtimeMs": 1778681774000, - "size": 9705, - "lines": 227, + "mtimeMs": 1779411812096.6685, + "size": 10768, + "lines": 242, "role": "", "imports": [ "src/utils", @@ -83,21 +83,21 @@ ] }, "src/config.ts": { - "mtimeMs": 1778902489000, - "size": 14623, + "mtimeMs": 1779268787168.0276, + "size": 14922, "lines": 298, "role": "", "imports": [] }, "src/core/astraPath.ts": { - "mtimeMs": 1778169995000, - "size": 1782, + "mtimeMs": 1778037123135.2776, + "size": 1832, "lines": 50, "role": "Astra Path Resolver (๊ฒฝ๋กœ ํ•ด๊ฒฐ๊ธฐ) Astra์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ํŒŒ์ผ(.astra ๋””๋ ‰ํ† ๋ฆฌ)์˜ ๊ฒฝ๋กœ๋ฅผ ์ค‘์•™์—์„œ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ค์น˜ ๊ฒฝ๋กœ(extensionUri) ๊ธฐ๋ฐ˜์œผ๋กœ .astra ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํ•ด๊ฒฐํ•˜์—ฌ, ์‚ฌ์šฉ์ž ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ๊ฐ€ ์•„๋‹Œ ConnectAI ํŒจํ‚ค์ง€ ๋‚ด๋ถ€์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“ˆ์€ AAL(Astra Autonomou", "imports": [] }, "src/core/conflict.ts": { - "mtimeMs": 1778169995000, + "mtimeMs": 1778038174478.8147, "size": 1726, "lines": 30, "role": "", @@ -106,35 +106,35 @@ ] }, "src/core/dataProcessor.ts": { - "mtimeMs": 1778169995000, + "mtimeMs": 1778038193232.0127, "size": 3235, "lines": 96, "role": "Aggregate result type definition", "imports": [] }, "src/core/errorHandler.ts": { - "mtimeMs": 1777808065000, - "size": 2305, + "mtimeMs": 1777511752606.2458, + "size": 2354, "lines": 49, "role": "", "imports": [] }, "src/core/errors.ts": { - "mtimeMs": 1778169995000, - "size": 924, + "mtimeMs": 1778037081022.028, + "size": 958, "lines": 34, "role": "g1nation Custom Error Classes", "imports": [] }, "src/core/events.ts": { - "mtimeMs": 1777808065000, - "size": 993, + "mtimeMs": 1778028987396.9893, + "size": 1028, "lines": 35, "role": "", "imports": [] }, "src/core/health.ts": { - "mtimeMs": 1778169995000, + "mtimeMs": 1778038139567.3984, "size": 2873, "lines": 79, "role": "", @@ -144,7 +144,7 @@ ] }, "src/core/lock.ts": { - "mtimeMs": 1778169995000, + "mtimeMs": 1778038157826.973, "size": 2358, "lines": 66, "role": "", @@ -153,8 +153,8 @@ ] }, "src/core/queue.ts": { - "mtimeMs": 1778674336000, - "size": 2428, + "mtimeMs": 1778666871393.5244, + "size": 2509, "lines": 81, "role": "", "imports": [ @@ -162,8 +162,8 @@ ] }, "src/core/responseRecovery.ts": { - "mtimeMs": 1778598587000, - "size": 12304, + "mtimeMs": 1778664139958.9634, + "size": 12529, "lines": 225, "role": "Response Recovery โ€” Thought Quarantine + Final-only Retry + Auto-Continuation The user already asked their question; they're waiting for an answer, not for a chance to babysit the generation engine. S", "imports": [ @@ -171,8 +171,8 @@ ] }, "src/core/services.ts": { - "mtimeMs": 1778421200000, - "size": 6692, + "mtimeMs": 1778549008895.9155, + "size": 6856, "lines": 164, "role": "", "imports": [ @@ -181,8 +181,8 @@ ] }, "src/core/session.ts": { - "mtimeMs": 1777808065000, - "size": 2785, + "mtimeMs": 1777511752609.8882, + "size": 2873, "lines": 88, "role": "", "imports": [ @@ -191,14 +191,14 @@ ] }, "src/core/statusBar.ts": { - "mtimeMs": 1777808065000, - "size": 2000, + "mtimeMs": 1778028987401.3042, + "size": 2057, "lines": 57, "role": "", "imports": [] }, "src/core/telemetry.ts": { - "mtimeMs": 1778674336000, + "mtimeMs": 1778666901466.1726, "size": 5442, "lines": 129, "role": "Telemetry โ€” append-only usage events to .astra/usage.jsonl Why local-file telemetry instead of a webview dashboard or remote endpoint: - Astra is local-first. No data leaves the machine. - JSONL is tr", @@ -208,8 +208,8 @@ ] }, "src/core/transaction.ts": { - "mtimeMs": 1778251556000, - "size": 4458, + "mtimeMs": 1778549008897.4194, + "size": 4590, "lines": 132, "role": "", "imports": [ @@ -217,52 +217,52 @@ "src/utils" ] }, - "src/docs/records/src/README.md": { - "mtimeMs": 1777949473000, - "size": 422, - "lines": 18, - "role": "src Chronicle Records", - "imports": [] - }, "src/docs/records/src/bugs/BUG-0001-edited-agent-ts-edited-agent-ts-edited-agent-ts-edited-agent.md": { - "mtimeMs": 1777949473000, - "size": 1797, + "mtimeMs": 1778028987403.465, + "size": 1813, "lines": 16, "role": "Bug: Edited agent.ts Edited agent.ts Edited agent.ts Edited agent.ts Edited agent.ts ...", "imports": [] }, - "src/docs/records/src/bugs/BUG-0002-viewed-agent-ts-2159-2206-แ„Œแ…ฆแ„€แ…ฉแ†ผแ„’แ…ขแ„Œแ…ฎแ„‰แ…ตแ†ซ-แ„‰แ…ฆแ„‡แ…ฎ-แ„‘แ…กแ„‹แ…ตแ†ฏ-แ„€แ…ฎแ„Œแ…ฉแ„‹แ…ช-แ„Œแ…ตแ„‰แ…ตแ†จ-แ„‰แ…ฎแ„Œแ…ตแ†ธ-แ„‹แ…ฏแ„แ…ณแ„‘แ…ณแ†ฏแ„…แ…ฉแ„‹แ…ฎ-แ„€แ…ชแ†ซแ„Œแ…ฅแ†ทแ„‹แ…ด-แ„แ…ฉแ„ƒแ…ณ.md": { - "mtimeMs": 1777949638000, - "size": 2201, + "src/docs/records/src/bugs/BUG-0002-viewed-agent-ts-2159-2206-์ œ๊ณตํ•ด์ฃผ์‹ -์„ธ๋ถ€-ํŒŒ์ผ-๊ตฌ์กฐ์™€-์ง€์‹-์ˆ˜์ง‘-์›Œํฌํ”Œ๋กœ์šฐ-๊ด€์ ์˜-์ฝ”๋“œ.md": { + "mtimeMs": 1778028987403.9697, + "size": 2217, "lines": 16, "role": "Bug: Viewed agent.ts:2159-2206 ์ œ๊ณตํ•ด์ฃผ์‹  ์„ธ๋ถ€ ํŒŒ์ผ ๊ตฌ์กฐ์™€ ์ง€์‹ ์ˆ˜์ง‘ ์›Œํฌํ”Œ๋กœ์šฐ ๊ด€์ ์˜ ์ฝ”๋“œ๋ฆฌ๋ทฐ ์š”์ฒญ์„ ์ •๋…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด...", "imports": [] }, "src/docs/records/src/chronicle.config.json": { - "mtimeMs": 1777949638000, - "size": 517, + "mtimeMs": 1778028987403.9697, + "size": 528, "lines": 11, "role": "JSON configuration", "imports": [] }, "src/docs/records/src/project-profile.md": { - "mtimeMs": 1777949473000, - "size": 582, + "mtimeMs": 1778028987404.973, + "size": 613, "lines": 31, "role": "Project Profile", "imports": [] }, + "src/docs/records/src/README.md": { + "mtimeMs": 1778028987402.338, + "size": 440, + "lines": 18, + "role": "src Chronicle Records", + "imports": [] + }, "src/docs/records/src/timeline.md": { - "mtimeMs": 1777949638000, - "size": 381, + "mtimeMs": 1778028987405.4775, + "size": 391, "lines": 10, "role": "Project Timeline", "imports": [] }, "src/extension.ts": { - "mtimeMs": 1778943661000, - "size": 63135, - "lines": 1215, + "mtimeMs": 1779411729280.646, + "size": 65966, + "lines": 1233, "role": "", "imports": [ "src/utils", @@ -297,8 +297,8 @@ ] }, "src/features/approval/approvalPanelProvider.ts": { - "mtimeMs": 1778674336000, - "size": 7132, + "mtimeMs": 1778664480470.9922, + "size": 7285, "lines": 153, "role": "", "imports": [ @@ -307,8 +307,8 @@ ] }, "src/features/approval/approvalQueue.ts": { - "mtimeMs": 1778251548000, - "size": 4722, + "mtimeMs": 1778549008899.4456, + "size": 4851, "lines": 129, "role": "", "imports": [ @@ -316,8 +316,8 @@ ] }, "src/features/approval/approvalStatusBar.ts": { - "mtimeMs": 1778251623000, - "size": 1601, + "mtimeMs": 1778549008899.4456, + "size": 1642, "lines": 41, "role": "", "imports": [ @@ -325,8 +325,8 @@ ] }, "src/features/astraOffice/index.ts": { - "mtimeMs": 1778931477000, - "size": 789, + "mtimeMs": 1779065453862.6475, + "size": 807, "lines": 18, "role": "Astra Office โ€” public API. ๋‹ค์Œ ์„ธ์…˜์—์„œ ์ถ”๊ฐ€๋  OfficeSnapshot presenter / schema ๋„ ๊ฐ™์€ entry ๋กœ ๋…ธ์ถœ ์˜ˆ์ •. ํ˜„์žฌ ๋…ธ์ถœ: full webview panel HTML ์ƒ์„ฑ ํ•จ์ˆ˜. sidebarProvider.ts ๋Š” ์ด ํ•œ ์ค„๋งŒ import.", "imports": [ @@ -337,8 +337,8 @@ ] }, "src/features/astraOffice/presenter.ts": { - "mtimeMs": 1778932441000, - "size": 7368, + "mtimeMs": 1779065453862.6475, + "size": 7549, "lines": 181, "role": "Presenter โ€” ์˜› AgentWorkState + bubble queue + activity items ๋ฅผ OfficeSnapshot ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” pure ํ•จ์ˆ˜. mini / full view ๋‘˜ ๋‹ค ๊ฐ™์€ OfficeSnapshot ์„ ๋ฐ›๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒŒ ๋ชฉํ‘œ. ์ด๋ฒˆ ์„ธ์…˜์˜ ๋ฒ”์œ„: ์ธํ„ฐํŽ˜์ด์Šค + ์Šคํ…. ์‹ค์ œ wiring ์€ ๋‹ค์Œ ์„ธ์…˜์—์„œ: - sideb", "imports": [ @@ -348,8 +348,8 @@ ] }, "src/features/astraOffice/schema.ts": { - "mtimeMs": 1778931632000, - "size": 10631, + "mtimeMs": 1779065453864.1523, + "size": 10936, "lines": 305, "role": "OfficeSnapshot โ€” Astra Office ์˜ ๋„๋ฉ”์ธ ํƒ€์ž…. ๋™์‹œ์„ฑ ์ง„์‹ค (docs/ASTRAOFFICEREFACTOR.md ยง1): dispatcher ๋Š” ์ง๋ ฌ์ด๋ผ ํ•œ ์‹œ์ ์— active agent ๋Š” 0 ๋˜๋Š” 1๋ช…. ์ด๊ฑธ ๋ฐ์ดํ„ฐ๋กœ ๊ฐ•์ œํ•˜๋Š” ๊ฒŒ ์ด ํƒ€์ž…์˜ ํ•ต์‹ฌ ์—ญํ• . ์ด ์„ธ์…˜์—์„œ๋Š” ํƒ€์ž… + validator + empty factory ๋งŒ. ๋ฐฑ", "imports": [ @@ -357,29 +357,29 @@ ] }, "src/features/astraOffice/view/layoutSchema.ts": { - "mtimeMs": 1778931707000, - "size": 6475, + "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": 1778938908000, - "size": 4112, + "mtimeMs": 1779065453865.8494, + "size": 4207, "lines": 103, "role": "", "imports": [] }, "src/features/astraOffice/view/officeStyles.ts": { - "mtimeMs": 1778942662000, - "size": 25747, + "mtimeMs": 1779065453866.8667, + "size": 26165, "lines": 419, "role": "", "imports": [] }, "src/features/astraOffice/view/panelHtml.ts": { - "mtimeMs": 1778937313000, - "size": 923, + "mtimeMs": 1779065453867.871, + "size": 949, "lines": 26, "role": "Full Astra Office webview HTML composition. ์˜› sidebarProvider.ts ์˜ ๊ฑฐ๋Œ€ํ•œ pixelOfficePanelHtml ์„ 4๊ฐœ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•œ entry. ์ด๋ฒˆ ์„ธ์…˜์€ ๋™์ž‘ ๋™๋“ฑ ๋ถ„๋ฆฌ ๋งŒ. ๋‹ค์Œ ์„ธ์…˜์— mini view ์™€ ๊ณตํ†ต presenter ๋„์ž….", "imports": [ @@ -389,15 +389,15 @@ ] }, "src/features/astraOffice/view/runtime.ts": { - "mtimeMs": 1779028539000, - "size": 90525, - "lines": 1887, + "mtimeMs": 1779411798626.195, + "size": 93940, + "lines": 1932, "role": "์ž๋™ ๋ถ„๋ฆฌ: src/sidebarProvider.ts 4002-5116 (IIFE ๋ณธ๋ฌธ) ์—์„œ ์ถ”์ถœ. ๋™์ž‘ ๋™๋“ฑ. ${assets.derivedBase} placeholder ๋Š” panelHtml ์—์„œ .replace() ๋กœ ์‹ค์ œ ๊ฐ’ ์ฃผ์ž…. ๋‹ค์Œ ์„ธ์…˜์—์„œ OfficeSnapshot ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹จ๊ณ„์ ์œผ๋กœ ์ž˜๋ผ๋‚ผ ์˜ˆ์ •.", "imports": [] }, "src/features/calendar/calendarApi.ts": { - "mtimeMs": 1778935879000, - "size": 8782, + "mtimeMs": 1779065453869.39, + "size": 8987, "lines": 205, "role": "Google Calendar API v3 โ€” event create/list ํ˜ธ์ถœ. access token ์€ caller ๊ฐ€ ์ง์ ‘ ์ฃผ์ž…ํ•œ๋‹ค. ๋งŒ๋ฃŒ ์ฒ˜๋ฆฌ๋Š” withFreshAccessToken ํ—ฌํผ๊ฐ€ refresh token ์œผ๋กœ ๊ฐฑ์‹  โ†’ ํ˜ธ์ถœ โ†’ 401 ๋ฐœ์ƒ ์‹œ ํ•œ ๋ฒˆ ๋” ๊ฐฑ์‹  + ์žฌ์‹œ๋„. ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(googleapis) ์•ˆ ์”€ โ€” Calendar ", "imports": [ @@ -406,8 +406,8 @@ ] }, "src/features/calendar/calendarCache.ts": { - "mtimeMs": 1778937433000, - "size": 11824, + "mtimeMs": 1779065453870.9949, + "size": 12065, "lines": 241, "role": "Google Calendar (iCal) ์บ์‹œ โ€” fetch + parse + ํšŒ์‚ฌ shared/calendarcache.md ์— ์ €์žฅ. Connectorigin ์˜ googlecalendar.py ๋ฅผ TypeScript / native fetch ๋กœ ์˜ฎ๊น€. OAuth ์—†์Œ. ์‚ฌ์šฉ์ž๊ฐ€ Google Calendar ์„ค์ • โ†’ \"๋น„๊ณต๊ฐœ ์ฃผ์†Œ(iCal ํ˜•์‹)\" ๋ณต", "imports": [ @@ -415,15 +415,15 @@ ] }, "src/features/calendar/icsParser.ts": { - "mtimeMs": 1778934638000, - "size": 4823, + "mtimeMs": 1779065453870.9949, + "size": 4937, "lines": 114, "role": "Minimal ICS parser โ€” no library deps. Connectorigin ์˜ Python ๋ฒ„์ „์„ ๊ทธ๋Œ€๋กœ ์˜ฎ๊ฒผ๊ณ , ๋ณธ ํ•จ์ˆ˜๋Š” pure ๋ผ์„œ ๋‹จ์œ„ํ…Œ์ŠคํŠธ๊ฐ€ ์‰ฝ๋‹ค. ์ฒ˜๋ฆฌ ๋ฒ”์œ„: - VEVENT ๋ธ”๋ก ์ถ”์ถœ - line continuation (๋‹ค์Œ ์ค„์ด ๊ณต๋ฐฑ ์‹œ์ž‘) ํŽผ์น˜๊ธฐ - SUMMARY / DESCRIPTION / LOCATION / DTST", "imports": [] }, "src/features/calendar/index.ts": { - "mtimeMs": 1778935400000, - "size": 561, + "mtimeMs": 1779065453871.9966, + "size": 593, "lines": 32, "role": "", "imports": [ @@ -434,15 +434,15 @@ ] }, "src/features/calendar/oauth.ts": { - "mtimeMs": 1778935851000, - "size": 10705, + "mtimeMs": 1779065453873.0256, + "size": 10940, "lines": 235, "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": [] }, "src/features/company/agents.ts": { - "mtimeMs": 1778936611000, - "size": 15031, + "mtimeMs": 1779065453874.572, + "size": 15242, "lines": 211, "role": "๊ธฐ๋ณธ ์—์ด์ „ํŠธ ๋กœ์Šคํ„ฐ โ€” 1์ธ ๊ธฐ์—… ๋ชจ๋“œ์˜ ์ถœ๊ณ  ๋””ํดํŠธ. ์„ค๊ณ„ ์˜๋„: ์†Œํ”„ํŠธ์›จ์–ด/๊ฒŒ์ž„ ๊ฐœ๋ฐœ IT ํšŒ์‚ฌ์˜ 1์ธ ๊ธฐ์—… ์šด์˜์„ ๊ฐ€์ •. ํ•œ ์‚ฌ๋žŒ์ด ๊ธฐํš โ†’ ๋””์ž์ธ โ†’ ๊ฐœ๋ฐœ โ†’ QA โ†’ ์ถœ์‹œ โ†’ ์šด์˜/๋งˆ์ผ€ํŒ…์„ ๋ชจ๋‘ ์ฑ…์ž„์งˆ ๋•Œ ํ•„์š”ํ•œ ์ง๊ตฐ์„ ๋น ์ง์—†์ด ์ปค๋ฒ„ํ•˜๋˜ ์—ญํ• ์ด ๊ฒน์น˜์ง€ ์•Š๊ฒŒ ๋ถ„๋ฆฌํ•œ๋‹ค. ์ง๊ตฐ ๊ตฌ๋ถ„ (ํ˜ผ๋™ ๋ฐฉ์ง€): - ๊ธฐํš์ž(business) : ๋ฌด์—‡์„ ๋งŒ๋“ค์ง€ ์ •์˜ ", "imports": [ @@ -450,8 +450,8 @@ ] }, "src/features/company/ceoPlanner.ts": { - "mtimeMs": 1778902489000, - "size": 11781, + "mtimeMs": 1778814432469.254, + "size": 12050, "lines": 269, "role": "CEO planner โ€” turns a user prompt into a CompanyTaskPlan. Lifecycle of one planner call: 1. Build the planner system prompt (template + active-agent list). 2. Hit the AI service with the user prompt a", "imports": [ @@ -464,8 +464,8 @@ ] }, "src/features/company/ceoReporter.ts": { - "mtimeMs": 1778762677000, - "size": 4895, + "mtimeMs": 1778739926808.2551, + "size": 5017, "lines": 122, "role": "CEO synthesis pass โ€” runs after all specialists have finished. Given the per-agent outputs, this asks the CEO model to produce the final markdown report (โœ… ์™„๋ฃŒ / ๐Ÿš€ ๋‹ค์Œ / ๐Ÿ’ก ์ธ์‚ฌ์ดํŠธ) that the user actually", "imports": [ @@ -477,8 +477,8 @@ ] }, "src/features/company/companyConfig.ts": { - "mtimeMs": 1778902489000, - "size": 40139, + "mtimeMs": 1778811673797.1216, + "size": 41035, "lines": 896, "role": "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", "imports": [ @@ -487,9 +487,9 @@ ] }, "src/features/company/dispatcher.ts": { - "mtimeMs": 1778936524000, - "size": 73113, - "lines": 1435, + "mtimeMs": 1779065453875.0962, + "size": 74549, + "lines": 1437, "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", @@ -515,8 +515,8 @@ ] }, "src/features/company/index.ts": { - "mtimeMs": 1778902489000, - "size": 2596, + "mtimeMs": 1778814836698.1172, + "size": 2702, "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": [ @@ -533,7 +533,7 @@ ] }, "src/features/company/intentAlignment.ts": { - "mtimeMs": 1778902489000, + "mtimeMs": 1778813958976.1824, "size": 15285, "lines": 334, "role": "Intent Alignment โ€” ์‚ฌ์šฉ์ž์˜ ์ž์—ฐ์–ด ์š”์ฒญ์„ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ž‘์—… ์กฐ๊ฑด์œผ๋กœ ๋ณ€ํ™˜. ์‚ฌ์šฉ์ž๋Š” ์ž๊ธฐ ์˜๋„์™€ ๋ฐฐ๊ฒฝ์ง€์‹์ด ์—์ด์ „ํŠธ์—๊ฒŒ ์ถฉ๋ถ„ํžˆ ์ „๋‹ฌ๋˜์—ˆ๋‹ค๊ณ  ์ฐฉ๊ฐํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค (ํˆฌ๋ช…์„ฑ์˜ ์ฐฉ๊ฐยท์ง€์‹์˜ ์ €์ฃผยท๊ณตํ†ต ๊ธฐ๋ฐ˜ ๋ถ€์กฑ). ๊ทธ๋ž˜์„œ ์—์ด์ „ํŠธ๊ฐ€ ์ฆ‰์‹œ ์ž‘์—…์— ๋Œ์ž…ํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋จธ๋ฆฟ์†์— ๊ฐ€์ง„ ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ธ๋‹ค. ์ด ๋ชจ๋“ˆ์€ ๊ทธ ๊ฒฉ์ฐจ๋ฅผ ๋ฉ”๊พธ๋Š” ํ•œ ๋‹จ๊ณ„ ", @@ -544,7 +544,7 @@ ] }, "src/features/company/intentClassifier.ts": { - "mtimeMs": 1778902489000, + "mtimeMs": 1778819562785.657, "size": 17372, "lines": 348, "role": "Intent classifier for 1์ธ ๊ธฐ์—… ๋ชจ๋“œ chat input. The company mode used to route every chat message through the full dispatcher (CEO planner โ†’ specialists โ†’ CEO synthesis). That meant casual messages like \"๊ณ ", @@ -554,8 +554,8 @@ ] }, "src/features/company/pipelineTemplates.ts": { - "mtimeMs": 1778933936000, - "size": 15125, + "mtimeMs": 1779065453876.108, + "size": 15403, "lines": 278, "role": "Built-in pipeline templates for 1์ธ ๊ธฐ์—… ๋ชจ๋“œ. These are blueprints, not data โ€” they're surfaced in the manage panel's \"ํ…œํ”Œ๋ฆฟ์—์„œ ์ถ”๊ฐ€\" dropdown so a non-developer user can stamp out a working pipeline in one cl", "imports": [ @@ -563,22 +563,22 @@ ] }, "src/features/company/pixelOfficeState.ts": { - "mtimeMs": 1778902489000, + "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": 1778680887000, - "size": 6782, + "mtimeMs": 1778720117525.2087, + "size": 6896, "lines": 114, "role": "Inlined prompt assets for the 1์ธ ๊ธฐ์—… mode. The CEO planner / reporter / casual-chat prompts are kept as TS string constants rather than loaded from prompts/.md at runtime, for two reasons: 1. Bundling.", "imports": [] }, "src/features/company/promptBuilder.ts": { - "mtimeMs": 1778936588000, - "size": 18723, + "mtimeMs": 1779065453877.1128, + "size": 19037, "lines": 314, "role": "System-prompt construction for company-mode agents. Each specialist needs a prompt that includes: - Their identity (name, role, specialty) + optional persona. - The action-tag contract (, ", "imports": [ @@ -590,29 +590,29 @@ ] }, "src/features/company/prompts/ceo-chat.md": { - "mtimeMs": 1778680831000, - "size": 462, + "mtimeMs": 1778720117527.2378, + "size": 466, "lines": 4, "role": "๋‹น์‹ ์€ {{COMPANY}}์˜ CEO์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž(์‚ฌ์žฅ๋‹˜)์™€ ์งง๊ฒŒ ์ธ์‚ฌยท์•ˆ๋ถ€ยท์žก๋‹ด์„ ์ฃผ๊ณ ๋ฐ›์Šต๋‹ˆ๋‹ค. - ํ•œ๊ตญ์–ด๋กœ 1~3๋ฌธ์žฅ. ์นœ๊ทผํ•˜์ง€๋งŒ ์‚ฌ์žฅ-CEO ๊ด€๊ณ„๋Š” ์œ ์ง€. - ์ธ์‚ฌยท์•ˆ๋ถ€ ์งˆ๋ฌธ์ด๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์‘๋‹ตํ•˜์„ธ์š”. ์ž‘์—… ์ง€์‹œ๊ฐ€ ์•„๋‹ˆ๋ฉด ๊ตณ์ด ์ž‘์—… ๋ถ„๋ฐฐ ์ œ์•ˆ X. - ํšŒ์‚ฌ ์ •์ฒด์„ฑยท์ตœ๊ทผ ๊ฒฐ์ •ยท์ถ”์ ๊ธฐ ์ƒํƒœ๊ฐ€ ์ปจํ…์ŠคํŠธ์— ์žˆ์œผ๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ™œ์šฉ. - JSON ์ถœ๋ ฅ ๊ธˆ์ง€. ", "imports": [] }, "src/features/company/prompts/ceo-planner.md": { - "mtimeMs": 1778680831000, - "size": 3199, + "mtimeMs": 1778720117527.2378, + "size": 3237, "lines": 38, "role": "๋‹น์‹ ์€ \"{{COMPANY}}\"์˜ CEO์ž…๋‹ˆ๋‹ค. 1์ธ AI ๊ธฐ์—…์˜ ์‚ฌ๋ น๊ด€์ด์ž ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.", "imports": [] }, "src/features/company/prompts/ceo-report.md": { - "mtimeMs": 1778680831000, - "size": 1373, + "mtimeMs": 1778720117528.7502, + "size": 1394, "lines": 21, "role": "๋‹น์‹ ์€ {{COMPANY}}์˜ CEO์ž…๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ํŒ€์ด ์ž‘์—…์„ ๋๋ƒˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์—์ด์ „ํŠธ์˜ ์‚ฐ์ถœ๋ฌผ์„ ์ฝ๊ณ  ์‚ฌ์žฅ๋‹˜๊ป˜ ์˜ฌ๋ฆด ์ข…ํ•ฉ ๋ณด๊ณ ์„œ๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.", "imports": [] }, "src/features/company/resumeStore.ts": { - "mtimeMs": 1778768128000, - "size": 5672, + "mtimeMs": 1778807413496.3787, + "size": 5806, "lines": 134, "role": "Disk persistence for company-turn resume state. ๊ฐ turn์˜ sessionDir ์•ˆ์— resume.json์„ ๋‘๊ณ , dispatcher๊ฐ€ ๋งค ์˜๋ฏธ ์žˆ๋Š” ์‹œ์ (plan ํ™•์ • / ๊ฐ stage ์งํ›„ / abort ์‹œ์ )์— ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋ฎ์–ด์“ด๋‹ค. ์žฌ๊ฐœ ์‹œ์ ์—๋Š” ์ด ํŒŒ์ผ์„ ์ฝ์–ด nextIndex ๋ถ€ํ„ฐ dispatch ์žฌ๊ฐœ. ", "imports": [ @@ -622,8 +622,8 @@ ] }, "src/features/company/sessionStore.ts": { - "mtimeMs": 1778680971000, - "size": 8727, + "mtimeMs": 1778720117528.7502, + "size": 8958, "lines": 231, "role": "Disk persistence for company-mode session artefacts. Each company turn produces a timestamped directory: /.astra/company/sessions/2026-05-13T21-29/ โ”œโ”€ brief.md โ† CEO's task decompositio", "imports": [ @@ -632,8 +632,8 @@ ] }, "src/features/company/telegramReport.ts": { - "mtimeMs": 1778762677000, - "size": 8126, + "mtimeMs": 1778739949327.3745, + "size": 8294, "lines": 168, "role": "Telegram mirror for the secretary agent (์˜์ˆ™). After every company turn finishes, this helper takes the CEO synthesis + task list and pushes it to the user's Telegram chat โ€” same behaviour as Connector", "imports": [ @@ -645,22 +645,40 @@ ] }, "src/features/company/types.ts": { - "mtimeMs": 1778902489000, - "size": 20877, + "mtimeMs": 1778813870251.361, + "size": 21323, "lines": 446, "role": "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", "imports": [] }, + "src/features/datacollect/bridgeClient.ts": { + "mtimeMs": 1779174431038.135, + "size": 3518, + "lines": 86, + "role": "", + "imports": [] + }, + "src/features/datacollect/slashRouter.ts": { + "mtimeMs": 1779343360530.8965, + "size": 73170, + "lines": 1413, + "role": "", + "imports": [ + "src/utils", + "src/features/datacollect/bridgeClient", + "src/features/calendar" + ] + }, "src/features/devilAgent/devilPrompt.ts": { - "mtimeMs": 1778943576000, - "size": 3591, + "mtimeMs": 1779065453878.1177, + "size": 3662, "lines": 71, "role": "Devil's Advocate (๋„ํ˜„) โ€” system prompt ๋นŒ๋”. ์„ค๊ณ„ ์›์น™: - ๋ชจ๋“  ์•ฝ์ ์„ ๋‚˜์—ดํ•˜์ง€ ์•Š์Œ. ํ•œ turn ์— 1๊ฐœ โ€” ์‚ฌ์šฉ์ž๊ฐ€ ๊นŠ๊ฒŒ ์ƒ๊ฐํ•˜๊ฒŒ. - 'X ์ž…์žฅ์—์„œ ๋ณธ๋‹ค๋ฉด' framing โ€” ๋ณธ์ธ ์˜๊ฒฌ์ด ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ์‹œ์  ์œผ๋กœ ์ œ์‹œ. ์ด๋Š” LLM ์˜ '๋‚ด๊ฐ€ ์˜ณ๋‹ค' ๊ฒฝํ–ฅ์„ ์ค„์ด๋Š” ์ž˜ ์•Œ๋ ค์ง„ ํŒจํ„ด. - ํ†ต๊ณ„ / ๊ตฌ์ฒด ์ˆ˜์น˜ / ์™ธ๋ถ€ ์‚ฌ๋ก€ ", "imports": [] }, "src/features/devilAgent/devilService.ts": { - "mtimeMs": 1778943601000, - "size": 2457, + "mtimeMs": 1779065453879.116, + "size": 2517, "lines": 60, "role": "Devil Agent โ€” ์ง์ „ ๋‹ต๋ณ€์— ๋Œ€ํ•œ ๋ฐ˜๋ฐ• ์ƒ์„ฑ๊ธฐ. ๋™์ž‘: 1. agent.ts ๊ฐ€ main turn ์™„๋ฃŒ ์งํ›„ ํ˜ธ์ถœ 2. ๊ฐ™์€ model/engine ์œผ๋กœ ๋ณ„๋„ LLM call 1ํšŒ โ€” ์งง์€ ๋น„ํŒ ํ•œ ๋ฌธ๋‹จ ์ƒ์„ฑ 3. ๊ฒฐ๊ณผ๋ฅผ webview ๋กœ 'devilRebuttal' message ๋กœ send 4. ์‹คํŒจ / ๋น„ํ™œ์„ฑ ์‹œ silent skip โ€” ma", "imports": [ @@ -668,8 +686,8 @@ ] }, "src/features/devilAgent/index.ts": { - "mtimeMs": 1778943609000, - "size": 263, + "mtimeMs": 1779065453879.116, + "size": 276, "lines": 13, "role": "", "imports": [ @@ -678,8 +696,8 @@ ] }, "src/features/projectArchitecture/index.ts": { - "mtimeMs": 1778691699000, - "size": 25373, + "mtimeMs": 1778720117531.2734, + "size": 25946, "lines": 573, "role": "Project Architecture Context (Feature 2) Builds a markdown document that captures the durable facts about a project โ€” its purpose, modules, key files, constraints, decisions โ€” so Astra can attach it t", "imports": [ @@ -689,15 +707,15 @@ ] }, "src/features/projectArchitecture/intentDetector.ts": { - "mtimeMs": 1778676956000, - "size": 6170, + "mtimeMs": 1778720117532.2788, + "size": 6318, "lines": 148, "role": "Project-intent detection from a chat message. Goal: when the user says \"๋‚˜ ConnectAI ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ํ•  ๊ฑฐ์•ผ\" (or similar), spot the intent + project handle so the sidebar can activate Project Mode and auto-attach", "imports": [] }, "src/features/projectArchitecture/mermaid.ts": { - "mtimeMs": 1778678215000, - "size": 2699, + "mtimeMs": 1778720117533.2854, + "size": 2768, "lines": 69, "role": "Mermaid diagram renderers for the architecture doc. Two diagrams: a directory mindmap so the user can see the shape of the project at a glance, and a flowchart that shows which top-level module import", "imports": [ @@ -705,8 +723,8 @@ ] }, "src/features/projectArchitecture/scanner.ts": { - "mtimeMs": 1778678939000, - "size": 28299, + "mtimeMs": 1778720117534.286, + "size": 28943, "lines": 644, "role": "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", "imports": [ @@ -716,8 +734,8 @@ ] }, "src/features/projectChronicle/guardPrompt.ts": { - "mtimeMs": 1777870211000, - "size": 6880, + "mtimeMs": 1778028987407.7454, + "size": 6955, "lines": 75, "role": "", "imports": [ @@ -725,8 +743,8 @@ ] }, "src/features/projectChronicle/index.ts": { - "mtimeMs": 1777808065000, - "size": 7490, + "mtimeMs": 1778028987408.4517, + "size": 7679, "lines": 189, "role": "", "imports": [ @@ -737,15 +755,15 @@ ] }, "src/features/projectChronicle/markdownFileWriter.ts": { - "mtimeMs": 1777808065000, - "size": 1317, + "mtimeMs": 1778028987409.2556, + "size": 1358, "lines": 41, "role": "", "imports": [] }, "src/features/projectChronicle/templates.ts": { - "mtimeMs": 1777808065000, - "size": 6699, + "mtimeMs": 1778028987409.766, + "size": 6957, "lines": 258, "role": "", "imports": [ @@ -753,15 +771,15 @@ ] }, "src/features/projectChronicle/types.ts": { - "mtimeMs": 1778676848000, - "size": 3129, + "mtimeMs": 1778720117534.7898, + "size": 3247, "lines": 118, "role": "", "imports": [] }, "src/features/providers/anthropic.ts": { - "mtimeMs": 1778941456000, - "size": 4111, + "mtimeMs": 1779065453880.645, + "size": 4219, "lines": 108, "role": "Anthropic Messages API adapter. ์ฐจ์ด์  (OpenAI ์™€): 1. base URL: https://api.anthropic.com/v1 2. ์ธ์ฆ: x-api-key: + anthropic-version: 2023-06-01 3. system prompt ๋Š” messages ๊ฐ€ ์•„๋‹ˆ๋ผ top-level system ํ•„๋“œ ", "imports": [ @@ -771,8 +789,8 @@ ] }, "src/features/providers/gemini.ts": { - "mtimeMs": 1778941478000, - "size": 4326, + "mtimeMs": 1779065453881.3628, + "size": 4434, "lines": 108, "role": "Google Gemini Generative Language API adapter. ์ฐจ์ด์  (OpenAI ์™€): 1. base URL: https://generativelanguage.googleapis.com/v1beta 2. ์ธ์ฆ: ?key= (query parameter) 3. ๋ฉ”์‹œ์ง€ ํ˜•์‹: contents: [{role: 'user'", "imports": [ @@ -782,8 +800,8 @@ ] }, "src/features/providers/index.ts": { - "mtimeMs": 1778941521000, - "size": 3242, + "mtimeMs": 1779065453882.3787, + "size": 3311, "lines": 69, "role": "Cloud LLM provider public API. ์ผ๋ฐ˜ ํ˜ธ์ถœ ํ๋ฆ„: 1. agent.ts ์˜ chat ์ง„์ž…๋ถ€์—์„œ parseModelPrefix(modelId) ํ˜ธ์ถœ 2. null โ†’ local engine ๊ฒฝ๋กœ (์˜› ๋กœ์ง). ๊ฐ์ฒด โ†’ streamCloudCompletion(context, hit, params) ํ˜ธ์ถœ 3. Response ์˜ body ", "imports": [ @@ -795,8 +813,8 @@ ] }, "src/features/providers/openrouter.ts": { - "mtimeMs": 1778941431000, - "size": 2673, + "mtimeMs": 1779065453882.3787, + "size": 2748, "lines": 75, "role": "OpenRouter โ€” OpenAI ํ˜ธํ™˜ API. ๋ณ„๋„ transform ์—†์ด fetch Response ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜. Base: https://openrouter.ai/api/v1 POST /chat/completions โ€” OpenAI ํ˜•์‹ ๊ทธ๋Œ€๋กœ. stream:true ๋ฉด SSE. GET /models โ€” ์‚ฌ์šฉ ๊ฐ€๋Šฅ ๋ชจ๋ธ ๋ชฉ๋ก. ์ธ์ฆ: Author", "imports": [ @@ -805,8 +823,8 @@ ] }, "src/features/providers/providerConfig.ts": { - "mtimeMs": 1778941498000, - "size": 2683, + "mtimeMs": 1779065453883.386, + "size": 2761, "lines": 78, "role": "Provider ๋ณ„ API key + enable ํ† ๊ธ€ ์ €์žฅ์†Œ. ์„ค๊ณ„: - API key ์ž์ฒด๋Š” vscode.SecretStorage (secrets) ์— โ€” settings.json / Settings Sync ์นจ๋ฒ” ์•ˆ ๋ฐ›์Œ. - enabled ํ† ๊ธ€์€ ์ผ๋ฐ˜ settings (g1nation.providers..enabled) โ€” ์‚ฌ์šฉ์ž๊ฐ€ ํŒจ๋„์—์„œ ", "imports": [ @@ -814,23 +832,23 @@ ] }, "src/features/providers/streamHelpers.ts": { - "mtimeMs": 1778941413000, - "size": 5904, + "mtimeMs": 1779065453883.386, + "size": 6048, "lines": 144, "role": "Stream transformer โ€” provider ๋ณ„ SSE ํ˜•์‹์„ OpenAI ํ˜ธํ™˜ SSE ๋กœ ๋ณ€ํ™˜. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด agent.ts ์˜ ๊ธฐ์กด SSE ํŒŒ์„œ (data: {...delta...} ํ˜•์‹ ๊ฐ€์ •) ๊ฐ€ ๋ณ€๊ฒฝ ์—†์ด ๋ชจ๋“  provider ์ถœ๋ ฅ์„ ๊ฐ™์€ ์ฝ”๋“œ ๊ฒฝ๋กœ๋กœ ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹ ๊ทœ provider ๊ฐ€ ๋“ค์–ด์™€๋„ adapter ํ•˜๋‚˜๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋จ (c", "imports": [] }, "src/features/providers/types.ts": { - "mtimeMs": 1778941377000, - "size": 2370, + "mtimeMs": 1779065453884.8909, + "size": 2433, "lines": 63, "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": [] }, "src/features/secondBrainTrace.ts": { - "mtimeMs": 1778248166000, - "size": 37475, - "lines": 760, + "mtimeMs": 1779411561816.5603, + "size": 39429, + "lines": 792, "role": "", "imports": [ "src/utils", @@ -838,30 +856,30 @@ ] }, "src/features/selfReflector/selfReflectorExecution.ts": { - "mtimeMs": 1778902489000, - "size": 7758, - "lines": 172, + "mtimeMs": 1779325350825.2378, + "size": 9570, + "lines": 207, "role": "Self-Reflector Phase C โ€” ์‹คํ–‰ ๊ธฐ๋ฐ˜ ๊ฒ€์ฆ. Phase A/B๋Š” LLM ํ…์ŠคํŠธ ๋ถ„์„์— ์˜์กดํ•˜๋ฏ€๋กœ \"์ฝ”๋“œ๊ฐ€ ์‹ค์ œ๋กœ ์ปดํŒŒ์ผ๋˜๋Š”๊ฐ€?\" ๊ฐ™์€ ์งˆ๋ฌธ์—” ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค. Phase C๋Š” ์ •๋‹ต: ๊ทธ๋ƒฅ ์‹คํ–‰ํ•ด ๋ณธ๋‹ค. ๋™์ž‘: 1. action-tag executor๊ฐ€ ๋ฐ˜ํ™˜ํ•œ report๋ฅผ ๋ฐ›์•„ โœ… Created: / โœ… Edited: ", "imports": [ "src/utils" ] }, "src/features/selfReflector/selfReflectorHollow.ts": { - "mtimeMs": 1778902489000, + "mtimeMs": 1778821213094.901, "size": 10482, "lines": 258, "role": "Self-Reflector โ€” ๋นˆ ๊นกํ†ต(Hollow Code) ๊ฒ€์ถœ ํœด๋ฆฌ์Šคํ‹ฑ. Phase C(syntax/lint)๋Š” ๋ฌธ๋ฒ• ์˜ค๋ฅ˜๋งŒ ์žก๋Š”๋‹ค. ์ž‘์€ LLM์ด ๊ฐ€์žฅ ์ž์ฃผ ๋งŒ๋“œ๋Š” ์‹คํŒจ ํŒจํ„ด์€ ๋ฌธ๋ฒ•์€ ๋งž์ง€๋งŒ ๋ณธ๋ฌธ์ด ๋น„์–ด ์žˆ๋Š” ์ฝ”๋“œ โ€” def foo(): pass, # TODO: implement, import๋งŒ ์žˆ๊ณ  ๋กœ์ง 0์ค„์ธ ๋ชจ๋“ˆ ๋“ฑ. ์‚ฌ์šฉ์ž๊ฐ€ \"์™„๋ฃŒ ๋๋‹ค\"๋ผ๋Š”", "imports": [] }, "src/features/selfReflector/selfReflectorPrompt.ts": { - "mtimeMs": 1778902489000, + "mtimeMs": 1778821145026.1665, "size": 6139, "lines": 108, "role": "Self-Reflector โ€” ๋‹ต๋ณ€ ์‚ฐ์ถœ๋ฌผ์˜ ์ž๊ธฐ ๊ฒ€์ฆ ๋ ˆ์ด์–ด. Memory(๊ธฐ์–ต) ๋‹จ๊ณ„๋Š” ์ด๋ฏธ ์ถฉ๋ถ„ํžˆ ๊ฐ•ํ•˜์ง€๋งŒ Verification(๊ฒ€์ฆ) ๋‹จ๊ณ„๋Š” ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ์— ์˜์กด์ ์ด๋‹ค. ์ด ๋ชจ๋“ˆ์€ ๊ทธ ๊ฒฉ์ฐจ๋ฅผ ๋ฉ”๊พธ๋Š” 3๋‹จ ๊ตฌ์กฐ: Phase A (์ด ํŒŒ์ผ) โ”€ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์— self-check ์ฒดํฌ๋ฆฌ์ŠคํŠธ ๋ฃฐ์„ ๋ฐ•์•„ LLM์ด ์‘๋‹ต ๋งˆ์ง€๋ง‰์— [Self-Reflecto", "imports": [] }, "src/features/selfReflector/selfReflectorVerifier.ts": { - "mtimeMs": 1778902489000, + "mtimeMs": 1778821237110.5894, "size": 7495, "lines": 172, "role": "Self-Reflector Phase B โ€” ๋ถ„๋ฆฌ๋œ ์ฝ˜ํ…์ŠคํŠธ์—์„œ LLM ํ•œ ๋ฒˆ ๋” ํ˜ธ์ถœํ•ด ์‘๋‹ต์„ ์™ธ๋ถ€ ์‹œ๊ฐ์œผ๋กœ ๊ฒ€์ฆ. Phase A์˜ self-check๋Š” ๊ฐ™์€ ๋ชจ๋ธยท๊ฐ™์€ ์ฝ˜ํ…์ŠคํŠธ์—์„œ ์ž๊ธฐ ์ž์‹ ์„ ๋ณด๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค. ๋ชจ๋ธ์ด ์ž๊ธฐ๊ฐ€ ๋งŒ๋“  ๋‹ต๋ณ€์„ ์ž์‹  ์žˆ๊ฒŒ ์ž˜๋ชป ํ‰๊ฐ€ํ•˜๋Š” ๊ณผ์‹  ํŽธํ–ฅ์€ LLM์˜ ์ž˜ ์•Œ๋ ค์ง„ ์•ฝ์ ์ด๋‹ค. Phase B๋Š” ์ด๊ฑธ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด: 1. sp", @@ -871,9 +889,9 @@ ] }, "src/features/settings/settingsPanelProvider.ts": { - "mtimeMs": 1778943856000, - "size": 29429, - "lines": 646, + "mtimeMs": 1779250671140.83, + "size": 32311, + "lines": 686, "role": "", "imports": [ "src/integrations/telegram/telegramClient", @@ -886,8 +904,8 @@ ] }, "src/features/sheets/index.ts": { - "mtimeMs": 1778935930000, - "size": 237, + "mtimeMs": 1779065453886.916, + "size": 250, "lines": 13, "role": "", "imports": [ @@ -895,8 +913,8 @@ ] }, "src/features/sheets/sheetsApi.ts": { - "mtimeMs": 1778936110000, - "size": 7794, + "mtimeMs": 1779065453887.9194, + "size": 7960, "lines": 166, "role": "Google Sheets API v4 โ€” read / write / append. ํ† ํฐ์€ calendar ์™€ ๊ณต์œ  (๊ฐ™์€ OAuth ์— spreadsheets scope ํฌํ•จ). ๋ณ„๋„ ์…‹์—… ์—†์Œ โ€” \"Astra: Google Calendar OAuth ์—ฐ๊ฒฐ\" ๋ช…๋ น์œผ๋กœ ํ•œ ๋ฒˆ ๋กœ๊ทธ์ธํ•˜๋ฉด ๋‘˜ ๋‹ค ๋™์ž‘ํ•œ๋‹ค. ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์•ˆ ์”€ โ€” Sheets API REST", "imports": [ @@ -904,8 +922,8 @@ ] }, "src/features/tasks/index.ts": { - "mtimeMs": 1778936468000, - "size": 225, + "mtimeMs": 1779065453887.9194, + "size": 238, "lines": 13, "role": "", "imports": [ @@ -913,15 +931,15 @@ ] }, "src/features/tasks/taskStore.ts": { - "mtimeMs": 1778936462000, - "size": 9121, + "mtimeMs": 1779065453888.9917, + "size": 9366, "lines": 245, "role": "Task tracker โ€” .astra/company/shared/tasks.md ๋‹จ์ผ ํŒŒ์ผ. ์„ค๊ณ„ ์›์น™: - ์™ธ๋ถ€ DB ์—†์ด ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋งˆํฌ๋‹ค์šด ํ…Œ์ด๋ธ”์— ๋ˆ„์ . git ์œผ๋กœ history ์ถ”์  ๊ฐ€๋Šฅ. - ํŒŒ์‹ฑ์€ regex ๊ธฐ๋ฐ˜ (์…€ ๊ตฌ๋ถ„์ž |). ์‚ฌ์šฉ์ž๊ฐ€ ์†์œผ๋กœ ํŽธ์ง‘ํ•ด๋„ fault-tolerant. - ๋ชจ๋“  task ๋Š” ์•ˆ์ •์  id (t001,", "imports": [] }, "src/integrations/telegram/conversationHistory.ts": { - "mtimeMs": 1778684811000, - "size": 6273, + "mtimeMs": 1778720117535.294, + "size": 6427, "lines": 154, "role": "Per-chat conversation history for the Telegram bot. Why this exists: the previous bot was stateless โ€” every inbound message hit AIService.chat({system, user}) in isolation, with no memory of what the ", "imports": [ @@ -929,8 +947,8 @@ ] }, "src/integrations/telegram/telegramBot.ts": { - "mtimeMs": 1778421270000, - "size": 11344, + "mtimeMs": 1778549008903.0078, + "size": 11614, "lines": 270, "role": "", "imports": [ @@ -940,8 +958,8 @@ ] }, "src/integrations/telegram/telegramClient.ts": { - "mtimeMs": 1778252333000, - "size": 5873, + "mtimeMs": 1778549008904.013, + "size": 6027, "lines": 154, "role": "", "imports": [ @@ -950,22 +968,22 @@ ] }, "src/integrations/telegram/types.ts": { - "mtimeMs": 1778252305000, - "size": 1255, + "mtimeMs": 1778549008904.013, + "size": 1309, "lines": 54, "role": "Subset of the Telegram Bot API types we actually consume. Source: https://core.telegram.org/bots/api Only fields the bot reads or writes are typed โ€” leaving the rest as unknown keeps the surface narro", "imports": [] }, "src/lib/contextManager.ts": { - "mtimeMs": 1778597095000, - "size": 12982, + "mtimeMs": 1778664139961.0637, + "size": 13257, "lines": 275, "role": "Context Manager (์ปจํ…์ŠคํŠธ ํ•œ๊ณ„ ๊ด€๋ฆฌ) \"context length = 132k\" ๋Š” \"๋‹ต๋ณ€์„ 132k ํ† ํฐ๊นŒ์ง€ ์ƒ์„ฑํ•ด๋„ ๋œ๋‹ค\" ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ + ๋Œ€ํ™” ๊ธฐ๋ก + ์ž…๋ ฅ ๋ฌธ์„œ + ์ƒ์„ฑ๋  ๋‹ต๋ณ€ + ์—ฌ์œ ๋ถ„ โ‰ค context length ์ด ๋ชจ๋“ˆ์€ ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์ „์— ์ž…๋ ฅ ํ† ํฐ์„ ์ถ”์ •ํ•˜๊ณ , - ๋™์ ์œผ๋กœ ์ถœ๋ ฅ ์ƒํ•œ(maxTokens)์„ ๊ณ„", "imports": [] }, "src/lib/diagnostics.ts": { - "mtimeMs": 1777978189000, - "size": 8389, + "mtimeMs": 1778028987412.5159, + "size": 8599, "lines": 210, "role": "", "imports": [ @@ -973,8 +991,8 @@ ] }, "src/lib/discoverModels.ts": { - "mtimeMs": 1778255896000, - "size": 1555, + "mtimeMs": 1778549008905.0132, + "size": 1590, "lines": 35, "role": "", "imports": [ @@ -982,8 +1000,8 @@ ] }, "src/lib/engine.ts": { - "mtimeMs": 1778763448000, - "size": 42698, + "mtimeMs": 1778807413498.881, + "size": 43604, "lines": 906, "role": "", "imports": [ @@ -998,8 +1016,8 @@ ] }, "src/lib/formatter.ts": { - "mtimeMs": 1777980992000, - "size": 3851, + "mtimeMs": 1778028987413.7585, + "size": 3932, "lines": 81, "role": "", "imports": [ @@ -1007,22 +1025,22 @@ ] }, "src/lib/paths.ts": { - "mtimeMs": 1778591351000, - "size": 6416, + "mtimeMs": 1778664139961.0637, + "size": 6567, "lines": 151, "role": "", "imports": [] }, "src/lmstudio/activityTracker.ts": { - "mtimeMs": 1778246443000, - "size": 426, + "mtimeMs": 1778549008906.526, + "size": 445, "lines": 19, "role": "", "imports": [] }, "src/lmstudio/client.ts": { - "mtimeMs": 1778472808000, - "size": 5773, + "mtimeMs": 1778549008907.0293, + "size": 5920, "lines": 147, "role": "", "imports": [ @@ -1030,8 +1048,8 @@ ] }, "src/lmstudio/lifecycleManager.ts": { - "mtimeMs": 1778251087000, - "size": 10783, + "mtimeMs": 1778549008907.0293, + "size": 11074, "lines": 291, "role": "", "imports": [ @@ -1042,8 +1060,8 @@ ] }, "src/lmstudio/streamer.ts": { - "mtimeMs": 1778598444000, - "size": 7762, + "mtimeMs": 1778664139962.1995, + "size": 7924, "lines": 162, "role": "", "imports": [ @@ -1052,65 +1070,17 @@ ] }, "src/memory/EpisodicMemory.ts": { - "mtimeMs": 1777858161000, - "size": 9577, - "lines": 278, + "mtimeMs": 1779411639504.3022, + "size": 10940, + "lines": 297, "role": "Episodic Memory (์ผํ™” ๊ธฐ์–ต) ๊ณผ๊ฑฐ ๋Œ€ํ™”/ํšŒ์˜/๊ฒฐ์ •์˜ ๋งฅ๋ฝ ํ๋ฆ„์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์„ธ์…˜ ์ข…๋ฃŒ ์‹œ ์ž๋™์œผ๋กœ ์—ํ”ผ์†Œ๋“œ๋ฅผ ์š”์•ฝํ•˜์—ฌ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. \"์™œ ์ด๋ ‡๊ฒŒ ๊ฒฐ์ •ํ–ˆ๋Š”์ง€\", \"์–ด๋–ค ํ๋ฆ„์œผ๋กœ ์ง„ํ–‰ํ–ˆ๋Š”์ง€\" ๊ธฐ๋ก. ์ €์žฅ ์œ„์น˜: {brainPath}/memory/episodes/.json", "imports": [ "src/memory/types" ] }, - "src/memory/LongTermMemory.ts": { - "mtimeMs": 1777858068000, - "size": 8364, - "lines": 243, - "role": "Long-Term Memory (์žฅ๊ธฐ ๊ธฐ์–ต) ์‚ฌ์šฉ์ž์˜ ์ทจํ–ฅ, ํ”„๋กœ์ ํŠธ ๋ชฉํ‘œ, ๋ฐ˜๋ณต ๊ทœ์น™, ๊ณผ๊ฑฐ ๊ฒฐ์ • ์‚ฌํ•ญ์„ ์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ ์œ„์น˜: {brainPath}/memory/longterm.json", - "imports": [ - "src/memory/types" - ] - }, - "src/memory/MemoryExtractor.ts": { - "mtimeMs": 1777858183000, - "size": 3838, - "lines": 115, - "role": "Memory Extractor (๊ธฐ์–ต ์ถ”์ถœ๊ธฐ) ๋Œ€ํ™” ์ข…๋ฃŒ ์‹œ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๊ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์–ด์— ์ €์žฅํ•  ์ •๋ณด๋ฅผ ์ž๋™์œผ๋กœ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. LLM ํ˜ธ์ถœ ์—†์ด ํŒจํ„ด ๋งค์นญ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.", - "imports": [ - "src/memory/LongTermMemory", - "src/memory/ProjectMemory", - "src/memory/EpisodicMemory" - ] - }, - "src/memory/ProceduralMemory.ts": { - "mtimeMs": 1777858120000, - "size": 5533, - "lines": 173, - "role": "Procedural Memory (์ ˆ์ฐจ ๊ธฐ์–ต) ๋ฐ˜๋ณต ์ž‘์—…์˜ ์ ˆ์ฐจ์™€ ํŒจํ„ด์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด skill.md ์‹œ์Šคํ…œ๊ณผ ํ†ตํ•ฉ๋˜์–ด, Brain์˜ memory/procedures/ ์•„๋ž˜์˜ MD ํŒŒ์ผ์„ ์Šค์บ”ํ•˜์—ฌ ์ ˆ์ฐจ๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ ์œ„์น˜: {brainPath}/memory/procedures/.md", - "imports": [ - "src/memory/types" - ] - }, - "src/memory/ProjectMemory.ts": { - "mtimeMs": 1777864677000, - "size": 6533, - "lines": 212, - "role": "Project Memory (ํ”„๋กœ์ ํŠธ ๊ธฐ์–ต) ํ”„๋กœ์ ํŠธ๋ณ„ ์š”๊ตฌ์‚ฌํ•ญ, ์ฝ”๋“œ ๊ตฌ์กฐ, ์•„ํ‚คํ…์ฒ˜ ๊ฒฐ์ •, ๋ฒ„๊ทธ ๊ธฐ๋ก ๋“ฑ์„ Astra ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ๋‚ด๋ถ€์— ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ ์œ„์น˜: {ConnectAI}/.astra/projectmemory.json (๊ธฐ์กด: {projectRoot}/.astra/ โ†’ ๋ณ€๊ฒฝ๋จ)", - "imports": [ - "src/memory/types", - "src/core/astraPath" - ] - }, - "src/memory/ShortTermMemory.ts": { - "mtimeMs": 1777858031000, - "size": 1167, - "lines": 37, - "role": "Short-Term Memory (๋‹จ๊ธฐ ๊ธฐ์–ต) ํ˜„์žฌ ๋Œ€ํ™”์˜ ์ฆ‰์‹œ ๋งฅ๋ฝ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. FIFO ๋ฐฉ์‹์œผ๋กœ ์ตœ๊ทผ N๊ฐœ ๋ฉ”์‹œ์ง€๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.", - "imports": [ - "src/memory/types" - ] - }, "src/memory/index.ts": { - "mtimeMs": 1777858214000, - "size": 6310, + "mtimeMs": 1779411771475.9016, + "size": 6530, "lines": 188, "role": "MemoryManager โ€” 5-Layer Cognitive Memory System (ํ†ตํ•ฉ ์ง„์ž…์ ) Astra์˜ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์–ด๋ฅผ ํ†ตํ•ฉ ๊ด€๋ฆฌํ•˜๋Š” ์ค‘์•™ ๋งค๋‹ˆ์ €์ž…๋‹ˆ๋‹ค. โ‘  Short-Term Memory โ€” ํ˜„์žฌ ๋Œ€ํ™” ํ๋ฆ„ (FIFO) โ‘ก Long-Term Memory โ€” ์‚ฌ์šฉ์ž ์ทจํ–ฅ/๊ทœ์น™/๊ฒฐ์ • โ‘ข Project Memory โ€” ํ”„๋กœ์ ํŠธ๋ณ„ ์ง€์‹ โ‘ฃ Pro", "imports": [ @@ -1124,16 +1094,64 @@ "src/memory/types" ] }, + "src/memory/LongTermMemory.ts": { + "mtimeMs": 1779411767886.338, + "size": 9226, + "lines": 252, + "role": "Long-Term Memory (์žฅ๊ธฐ ๊ธฐ์–ต) ์‚ฌ์šฉ์ž์˜ ์ทจํ–ฅ, ํ”„๋กœ์ ํŠธ ๋ชฉํ‘œ, ๋ฐ˜๋ณต ๊ทœ์น™, ๊ณผ๊ฑฐ ๊ฒฐ์ • ์‚ฌํ•ญ์„ ์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ ์œ„์น˜: {brainPath}/memory/longterm.json", + "imports": [ + "src/memory/types" + ] + }, + "src/memory/MemoryExtractor.ts": { + "mtimeMs": 1778028987415.8738, + "size": 3953, + "lines": 115, + "role": "Memory Extractor (๊ธฐ์–ต ์ถ”์ถœ๊ธฐ) ๋Œ€ํ™” ์ข…๋ฃŒ ์‹œ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๊ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์–ด์— ์ €์žฅํ•  ์ •๋ณด๋ฅผ ์ž๋™์œผ๋กœ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. LLM ํ˜ธ์ถœ ์—†์ด ํŒจํ„ด ๋งค์นญ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.", + "imports": [ + "src/memory/LongTermMemory", + "src/memory/ProjectMemory", + "src/memory/EpisodicMemory" + ] + }, + "src/memory/ProceduralMemory.ts": { + "mtimeMs": 1778028987416.5232, + "size": 5706, + "lines": 173, + "role": "Procedural Memory (์ ˆ์ฐจ ๊ธฐ์–ต) ๋ฐ˜๋ณต ์ž‘์—…์˜ ์ ˆ์ฐจ์™€ ํŒจํ„ด์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด skill.md ์‹œ์Šคํ…œ๊ณผ ํ†ตํ•ฉ๋˜์–ด, Brain์˜ memory/procedures/ ์•„๋ž˜์˜ MD ํŒŒ์ผ์„ ์Šค์บ”ํ•˜์—ฌ ์ ˆ์ฐจ๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ ์œ„์น˜: {brainPath}/memory/procedures/.md", + "imports": [ + "src/memory/types" + ] + }, + "src/memory/ProjectMemory.ts": { + "mtimeMs": 1778028987417.0342, + "size": 6745, + "lines": 212, + "role": "Project Memory (ํ”„๋กœ์ ํŠธ ๊ธฐ์–ต) ํ”„๋กœ์ ํŠธ๋ณ„ ์š”๊ตฌ์‚ฌํ•ญ, ์ฝ”๋“œ ๊ตฌ์กฐ, ์•„ํ‚คํ…์ฒ˜ ๊ฒฐ์ •, ๋ฒ„๊ทธ ๊ธฐ๋ก ๋“ฑ์„ Astra ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ๋‚ด๋ถ€์— ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅ ์œ„์น˜: {ConnectAI}/.astra/projectmemory.json (๊ธฐ์กด: {projectRoot}/.astra/ โ†’ ๋ณ€๊ฒฝ๋จ)", + "imports": [ + "src/memory/types", + "src/core/astraPath" + ] + }, + "src/memory/ShortTermMemory.ts": { + "mtimeMs": 1778028987418.1267, + "size": 1204, + "lines": 37, + "role": "Short-Term Memory (๋‹จ๊ธฐ ๊ธฐ์–ต) ํ˜„์žฌ ๋Œ€ํ™”์˜ ์ฆ‰์‹œ ๋งฅ๋ฝ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. FIFO ๋ฐฉ์‹์œผ๋กœ ์ตœ๊ทผ N๊ฐœ ๋ฉ”์‹œ์ง€๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.", + "imports": [ + "src/memory/types" + ] + }, "src/memory/types.ts": { - "mtimeMs": 1777858019000, - "size": 3449, + "mtimeMs": 1778028987419.3413, + "size": 3575, "lines": 126, "role": "Memory Type Definitions (๋ฉ”๋ชจ๋ฆฌ ํƒ€์ž… ์ •์˜) Astra์˜ 5-Layer Cognitive Memory System์˜ ๋ชจ๋“  ํƒ€์ž…์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. โ‘  Short-Term โ‘ก Long-Term โ‘ข Project โ‘ฃ Procedural โ‘ค Episodic", "imports": [] }, "src/retrieval/brainIndex.ts": { - "mtimeMs": 1778674336000, - "size": 12945, + "mtimeMs": 1778667252738.4248, + "size": 13270, "lines": 325, "role": "Brain Index โ€” persistent, mtime-keyed tokenized cache of the Second Brain RAG ๊ฒ€์ƒ‰์€ ๋งค ์งˆ์˜๋งˆ๋‹ค ๋ธŒ๋ ˆ์ธ์˜ ๋ชจ๋“  .md ํŒŒ์ผ์„ ์ฝ๊ณ  ํ† ํฌ๋‚˜์ด์ฆˆํ•ด์„œ TF-IDF ์ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ–ˆ์Šต๋‹ˆ๋‹ค โ€” ํŒŒ์ผ ์ˆ˜๊ฐ€ ๋งŽ์•„์ง€๋ฉด ๊ทธ๊ฒŒ ๋ณ‘๋ชฉ์ž…๋‹ˆ๋‹ค. ์ด ๋ชจ๋“ˆ์€ /.astra/brain-index.json ์—", "imports": [ @@ -1143,8 +1161,8 @@ ] }, "src/retrieval/contextBudget.ts": { - "mtimeMs": 1778674336000, - "size": 5143, + "mtimeMs": 1778665501089.1736, + "size": 5283, "lines": 140, "role": "Context Budget Manager (์ปจํ…์ŠคํŠธ ์˜ˆ์‚ฐ ๊ด€๋ฆฌ) ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์˜ ํ† ํฐ ์˜ˆ์‚ฐ์„ ๊ด€๋ฆฌํ•˜์—ฌ ๋กœ์ปฌ ๋ชจ๋ธ์˜ context window๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.", "imports": [ @@ -1152,7 +1170,7 @@ ] }, "src/retrieval/embeddings.ts": { - "mtimeMs": 1778674336000, + "mtimeMs": 1778667198243.6443, "size": 7294, "lines": 167, "role": "Embeddings โ€” local hybrid (sparse + dense) retrieval support TF-IDF is fast and zero-cost but misses synonyms / paraphrase. A small local embedding model (BGE-small, multilingual-e5-small, nomic-embed", @@ -1161,8 +1179,8 @@ ] }, "src/retrieval/index.ts": { - "mtimeMs": 1778676255000, - "size": 23764, + "mtimeMs": 1778720117542.9775, + "size": 24278, "lines": 514, "role": "RetrievalOrchestrator โ€” Unified RAG Pipeline Astra์˜ ๋ชจ๋“  ๊ฒ€์ƒ‰ ์†Œ์Šค๋ฅผ ํ†ตํ•ฉ ๊ด€๋ฆฌํ•˜๋Š” ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ํ๋ฆ„: โ‘  Query Planning โ€” ์˜๋„ ๋ถ„๋ฅ˜ + ๊ฒ€์ƒ‰ ์ „๋žต ๊ฒฐ์ • โ‘ก Parallel Search โ€” Brain + Memory + Project + Episode ๋™์‹œ ๊ฒ€์ƒ‰ โ‘ข Result Fusio", "imports": [ @@ -1179,8 +1197,8 @@ ] }, "src/retrieval/knowledgeMix.ts": { - "mtimeMs": 1778902489000, - "size": 7621, + "mtimeMs": 1778821115241.6562, + "size": 7786, "lines": 165, "role": "Knowledge Mix โ€” model ์ง€์‹ vs Second Brain ์ง€์‹์˜ ์ƒ๋Œ€ ๋น„์œจ์„ LLM์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ์ •์ฑ… ๋ ˆ์ด์–ด. โ”€โ”€ ์ •์ฑ… v2 (์ƒ๋Œ€๊ฐ’+์ƒ๋Œ€๊ฐ’=์ƒ๋Œ€๊ฐ’) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ weight๋Š” 0~100 ์ •์ˆ˜์ด์ง€๋งŒ ์ƒ๋Œ€ ๋น„์œจ๋กœ๋งŒ ํ•ด์„ํ•œ๋‹ค. ์ฆ‰ \"70\"์€ \"100% ์ค‘ 70%\"๋ผ๋Š” ์ƒ๋Œ€ ํ‘œํ˜„์ด๊ณ , ์‹œ", "imports": [ @@ -1189,8 +1207,8 @@ ] }, "src/retrieval/lessonHelpers.ts": { - "mtimeMs": 1778674336000, - "size": 14134, + "mtimeMs": 1778665428445.0337, + "size": 14459, "lines": 325, "role": "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", "imports": [ @@ -1198,22 +1216,22 @@ ] }, "src/retrieval/scoring.ts": { - "mtimeMs": 1778674336000, - "size": 20793, - "lines": 518, + "mtimeMs": 1779411675045.9507, + "size": 22287, + "lines": 536, "role": "Scoring Engine โ€” TF-IDF + Bilingual Tokenizer ๋‹จ์ˆœ includes() ํ‚ค์›Œ๋“œ ๋งค์นญ์„ ๋„˜์–ด์„œ, TF-IDF ๊ฐ€์ค‘์น˜ ๊ธฐ๋ฐ˜์˜ ๋ฌธ์„œ ์Šค์ฝ”์–ด๋ง์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•œ๊ตญ์–ด/์˜์–ด ์–‘๊ตญ์–ด ํ† ํฌ๋‚˜์ด์ €๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.", "imports": [] }, "src/retrieval/types.ts": { - "mtimeMs": 1778674336000, - "size": 2424, + "mtimeMs": 1778665510728.6262, + "size": 2490, "lines": 66, "role": "Retrieval Types (๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ํ†ตํ•ฉ ํƒ€์ž…) ๋ชจ๋“  ๊ฒ€์ƒ‰ ์†Œ์Šค(Brain, Memory, Project, Episode)์˜ ๊ฒฐ๊ณผ๋ฅผ ํ†ตํ•ฉ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.", "imports": [] }, "src/scaffolder/projectScaffolder.ts": { - "mtimeMs": 1778251854000, - "size": 4508, + "mtimeMs": 1778549008910.5835, + "size": 4619, "lines": 111, "role": "", "imports": [ @@ -1223,22 +1241,22 @@ ] }, "src/scaffolder/templates.ts": { - "mtimeMs": 1778251830000, - "size": 4897, + "mtimeMs": 1778549008910.5835, + "size": 5051, "lines": 154, "role": "Scaffolder template catalog. Templates are pure data โ€” (projectName) => { [relativePath]: contents }. New templates are added by appending to TEMPLATES; the rest of the scaffolder (validation, IO, com", "imports": [] }, "src/security.ts": { - "mtimeMs": 1778169995000, - "size": 3310, - "lines": 90, + "mtimeMs": 1779429436188.0647, + "size": 6053, + "lines": 154, "role": "", "imports": [] }, "src/sidebar/agentHandlers.ts": { - "mtimeMs": 1778676515000, - "size": 7752, + "mtimeMs": 1778720117552.737, + "size": 7921, "lines": 169, "role": "", "imports": [ @@ -1248,8 +1266,8 @@ ] }, "src/sidebar/brainHandlers.ts": { - "mtimeMs": 1778248976000, - "size": 1080, + "mtimeMs": 1778549008912.5908, + "size": 1113, "lines": 33, "role": "", "imports": [ @@ -1257,14 +1275,15 @@ ] }, "src/sidebar/chatHandlers.ts": { - "mtimeMs": 1778934077000, - "size": 37222, - "lines": 676, + "mtimeMs": 1779343234943.2488, + "size": 40131, + "lines": 707, "role": "", "imports": [ "src/sidebarProvider", "src/utils", "src/lib/paths", + "src/features/datacollect/slashRouter", "src/config", "src/features/company", "src/core/services", @@ -1272,8 +1291,8 @@ ] }, "src/sidebar/chronicleHandlers.ts": { - "mtimeMs": 1778248986000, - "size": 2068, + "mtimeMs": 1778549008912.5908, + "size": 2120, "lines": 52, "role": "", "imports": [ @@ -1281,9 +1300,9 @@ ] }, "src/sidebarProvider.ts": { - "mtimeMs": 1778941620000, - "size": 189927, - "lines": 4165, + "mtimeMs": 1779411747417.136, + "size": 198818, + "lines": 4226, "role": "", "imports": [ "src/utils", @@ -1298,6 +1317,7 @@ "src/sidebar/chronicleHandlers", "src/sidebar/agentHandlers", "src/skills/agentKnowledgeMap", + "src/retrieval/brainIndex", "src/lib/contextManager", "src/skills/externalSkillLoader", "src/features/projectArchitecture", @@ -1309,8 +1329,8 @@ ] }, "src/skills/agentKnowledgeMap.ts": { - "mtimeMs": 1778676092000, - "size": 15707, + "mtimeMs": 1778720117565.968, + "size": 16081, "lines": 374, "role": "", "imports": [ @@ -1319,8 +1339,8 @@ ] }, "src/skills/externalSkillLoader.ts": { - "mtimeMs": 1778470672000, - "size": 5859, + "mtimeMs": 1778549008916.6155, + "size": 6018, "lines": 159, "role": "", "imports": [ @@ -1329,20 +1349,21 @@ ] }, "src/skills/scopedBrainRetriever.ts": { - "mtimeMs": 1778419289000, - "size": 5706, - "lines": 153, + "mtimeMs": 1779411581885.858, + "size": 6369, + "lines": 156, "role": "", "imports": [ "src/utils", "src/lib/paths", "src/retrieval/scoring", + "src/retrieval/brainIndex", "src/retrieval/contextBudget" ] }, "src/skills/skillInjectionService.ts": { - "mtimeMs": 1778681774000, - "size": 6276, + "mtimeMs": 1778549008918.12, + "size": 6421, "lines": 145, "role": "", "imports": [ @@ -1351,23 +1372,23 @@ ] }, "src/system/specs.ts": { - "mtimeMs": 1778251036000, - "size": 4326, + "mtimeMs": 1778549008918.12, + "size": 4444, "lines": 118, "role": "", "imports": [] }, "src/types/interfaces.ts": { - "mtimeMs": 1778169995000, - "size": 1260, + "mtimeMs": 1778036927218.7627, + "size": 1299, "lines": 39, "role": "Service Interfaces (์„œ๋น„์Šค ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜) ๊ฐ ์„œ๋น„์Šค(Agent, Brain, FileSystem ๋“ฑ)์˜ ์ถ”์ƒํ™” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์˜์กด์„ฑ ์ฃผ์ž…(DI)๊ณผ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.", "imports": [] }, "src/utils.ts": { - "mtimeMs": 1778936575000, - "size": 15995, - "lines": 360, + "mtimeMs": 1779428605818.0505, + "size": 20391, + "lines": 408, "role": "", "imports": [ "src/config", @@ -1375,50 +1396,50 @@ ] }, "media/settings-panel.css": { - "mtimeMs": 1778255405000, - "size": 4546, + "mtimeMs": 1778549008877.4587, + "size": 4756, "lines": 210, "role": "Stylesheet", "imports": [] }, "media/settings-panel.html": { - "mtimeMs": 1778943830000, - "size": 17362, - "lines": 328, + "mtimeMs": 1779250684699.01, + "size": 20873, + "lines": 373, "role": "Astra Settings", "imports": [] }, "media/settings-panel.js": { - "mtimeMs": 1778943881000, - "size": 19114, - "lines": 411, + "mtimeMs": 1779250701675.4397, + "size": 21239, + "lines": 445, "role": "", "imports": [] }, "media/sidebar.css": { - "mtimeMs": 1778943817000, - "size": 88173, - "lines": 2068, + "mtimeMs": 1779065453854.1843, + "size": 90311, + "lines": 2078, "role": "Stylesheet", "imports": [] }, "media/sidebar.html": { - "mtimeMs": 1778934094000, - "size": 34587, - "lines": 546, + "mtimeMs": 1779083405649.7578, + "size": 34977, + "lines": 545, "role": "Astra", "imports": [] }, "media/sidebar.js": { - "mtimeMs": 1778943769000, - "size": 214022, - "lines": 3680, + "mtimeMs": 1779083454849.123, + "size": 217481, + "lines": 3677, "role": "", "imports": [] }, "tests/agentEngine.test.ts": { - "mtimeMs": 1778690770000, - "size": 33921, + "mtimeMs": 1778720117574.2246, + "size": 34703, "lines": 782, "role": "AgentEngine Integration Tests & Performance Benchmarks ๊ฒ€์ฆ ๋Œ€์ƒ: 1. ErrorClassifier โ€” ์˜ค๋ฅ˜ ์œ ํ˜•(Transient/Permanent/Abort) ์ž๋™ ๋ถ„๋ฅ˜ 2. ErrorRecoveryMatrix โ€” ๊ฐ ๊ทœ์น™์ด ์˜๋„ํ•œ ๋Œ€์‘ ์ „๋žต์œผ๋กœ ๋งคํ•‘๋˜๋Š”์ง€ ๊ฒ€์ฆ 3. resilientExecute โ€” ์ง€์ˆ˜ ๋ฐฑ", "imports": [ @@ -1426,8 +1447,8 @@ ] }, "tests/approvalQueue.test.ts": { - "mtimeMs": 1778251690000, - "size": 5915, + "mtimeMs": 1778549008920.1624, + "size": 6079, "lines": 164, "role": "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.", "imports": [ @@ -1435,8 +1456,8 @@ ] }, "tests/brainIndex.test.ts": { - "mtimeMs": 1778594450000, - "size": 5406, + "mtimeMs": 1778664139970.806, + "size": 5513, "lines": 107, "role": "", "imports": [ @@ -1444,8 +1465,8 @@ ] }, "tests/calendarApi.test.ts": { - "mtimeMs": 1778935637000, - "size": 5103, + "mtimeMs": 1779065453894.5227, + "size": 5234, "lines": 131, "role": "", "imports": [ @@ -1454,8 +1475,8 @@ ] }, "tests/contextManager.test.ts": { - "mtimeMs": 1778594523000, - "size": 6545, + "mtimeMs": 1778664139971.9563, + "size": 6674, "lines": 129, "role": "", "imports": [ @@ -1463,8 +1484,8 @@ ] }, "tests/dataProcessor.test.ts": { - "mtimeMs": 1777808065000, - "size": 3430, + "mtimeMs": 1778028987448.8394, + "size": 3517, "lines": 87, "role": "/ ", "imports": [ @@ -1472,8 +1493,8 @@ ] }, "tests/devilAgent.test.ts": { - "mtimeMs": 1778943907000, - "size": 3179, + "mtimeMs": 1779065453895.5222, + "size": 3240, "lines": 61, "role": "", "imports": [ @@ -1481,8 +1502,8 @@ ] }, "tests/findBrainFilesCache.test.ts": { - "mtimeMs": 1778247665000, - "size": 2720, + "mtimeMs": 1778549008921.7842, + "size": 2800, "lines": 80, "role": "Unit tests for findBrainFiles TTL cache.", "imports": [ @@ -1490,8 +1511,8 @@ ] }, "tests/icsParser.test.ts": { - "mtimeMs": 1778934828000, - "size": 5011, + "mtimeMs": 1779065453895.5222, + "size": 5145, "lines": 134, "role": "", "imports": [ @@ -1499,8 +1520,8 @@ ] }, "tests/integration_retrieval.test.ts": { - "mtimeMs": 1777949141000, - "size": 4017, + "mtimeMs": 1778028987449.4358, + "size": 4108, "lines": 91, "role": "", "imports": [ @@ -1509,8 +1530,8 @@ ] }, "tests/lessonHelpers.test.ts": { - "mtimeMs": 1778595482000, - "size": 9400, + "mtimeMs": 1778664139972.9592, + "size": 9591, "lines": 191, "role": "", "imports": [ @@ -1518,8 +1539,8 @@ ] }, "tests/lmStudioLifecycle.test.ts": { - "mtimeMs": 1778250254000, - "size": 11385, + "mtimeMs": 1778549008921.7842, + "size": 11703, "lines": 318, "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": [ @@ -1529,8 +1550,8 @@ ] }, "tests/lmStudioStreamer.test.ts": { - "mtimeMs": 1778591604000, - "size": 8660, + "mtimeMs": 1778664139973.4685, + "size": 8880, "lines": 220, "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": [ @@ -1539,8 +1560,8 @@ ] }, "tests/localPathPreflight.test.ts": { - "mtimeMs": 1778595955000, - "size": 23687, + "mtimeMs": 1778664139974.819, + "size": 24177, "lines": 490, "role": "", "imports": [ @@ -1548,15 +1569,15 @@ ] }, "tests/mocks/vscode.js": { - "mtimeMs": 1778246810000, - "size": 1670, + "mtimeMs": 1778549008931.3582, + "size": 1738, "lines": 68, "role": "", "imports": [] }, "tests/officeSchema.test.ts": { - "mtimeMs": 1778932509000, - "size": 9884, + "mtimeMs": 1779065453896.7021, + "size": 10125, "lines": 241, "role": "", "imports": [ @@ -1566,8 +1587,8 @@ ] }, "tests/paths.test.ts": { - "mtimeMs": 1778250990000, - "size": 2590, + "mtimeMs": 1778549008931.3582, + "size": 2674, "lines": 84, "role": "Unit tests for the centralized path resolver.", "imports": [ @@ -1575,8 +1596,8 @@ ] }, "tests/pipelineTemplates.test.ts": { - "mtimeMs": 1778934174000, - "size": 2984, + "mtimeMs": 1779065453897.361, + "size": 3053, "lines": 69, "role": "", "imports": [ @@ -1584,8 +1605,8 @@ ] }, "tests/projectChronicle.test.ts": { - "mtimeMs": 1778169995000, - "size": 8359, + "mtimeMs": 1778029332769.3286, + "size": 8558, "lines": 199, "role": "", "imports": [ @@ -1593,8 +1614,8 @@ ] }, "tests/projectChronicleGuardPrompt.test.ts": { - "mtimeMs": 1777808369000, - "size": 2838, + "mtimeMs": 1778028987452.0652, + "size": 2890, "lines": 52, "role": "", "imports": [ @@ -1602,8 +1623,8 @@ ] }, "tests/projectScaffolder.test.ts": { - "mtimeMs": 1778251915000, - "size": 5800, + "mtimeMs": 1778549008932.6519, + "size": 5935, "lines": 135, "role": "Unit tests for FileSystemProjectScaffolder. Drives against a real temp directory so end-to-end file IO + path-traversal defenses are exercised.", "imports": [ @@ -1611,8 +1632,8 @@ ] }, "tests/providers.test.ts": { - "mtimeMs": 1778942187000, - "size": 4118, + "mtimeMs": 1779065453898.3752, + "size": 4215, "lines": 97, "role": "", "imports": [ @@ -1621,8 +1642,8 @@ ] }, "tests/resilience_stress.test.ts": { - "mtimeMs": 1777968922000, - "size": 6981, + "mtimeMs": 1778028987453.0332, + "size": 7164, "lines": 183, "role": "Resilience & Boundary Stress Test Suite (v2.77.3) ์ด ํ…Œ์ŠคํŠธ๋Š” ConnectAI ์—”์ง„์ด ๊ทนํ•œ์˜ ํ™˜๊ฒฝ(์ธ์ฆ ์‹คํŒจ, ๋„คํŠธ์›Œํฌ ์ฐจ๋‹จ, ํƒ€์ž„์•„์›ƒ ๋“ฑ)์—์„œ ์–ผ๋งˆ๋‚˜ ์•ˆ์ •์ ์œผ๋กœ ๋ณต๊ตฌ๋˜๊ณ , ์‹ ๋ขฐ์„ฑ ์ง€ํ‘œ(Resilience Metrics)๋ฅผ ์ •ํ™•ํžˆ ๊ธฐ๋กํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.", "imports": [ @@ -1630,8 +1651,8 @@ ] }, "tests/resilience_v4.test.ts": { - "mtimeMs": 1777978211000, - "size": 3435, + "mtimeMs": 1778028987453.5366, + "size": 3519, "lines": 84, "role": "", "imports": [ @@ -1640,8 +1661,8 @@ ] }, "tests/responseRecovery.test.ts": { - "mtimeMs": 1778598707000, - "size": 8782, + "mtimeMs": 1778664139974.819, + "size": 8933, "lines": 151, "role": "", "imports": [ @@ -1649,8 +1670,8 @@ ] }, "tests/scoring.test.ts": { - "mtimeMs": 1778169995000, - "size": 6055, + "mtimeMs": 1778043314856.5872, + "size": 6189, "lines": 134, "role": "", "imports": [ @@ -1658,8 +1679,8 @@ ] }, "tests/secondBrainTrace.test.ts": { - "mtimeMs": 1777866065000, - "size": 23024, + "mtimeMs": 1778028987455.0378, + "size": 23431, "lines": 407, "role": "", "imports": [ @@ -1667,8 +1688,8 @@ ] }, "tests/sheetsApi.test.ts": { - "mtimeMs": 1778936029000, - "size": 3913, + "mtimeMs": 1779065453899.3755, + "size": 4026, "lines": 113, "role": "", "imports": [ @@ -1677,8 +1698,8 @@ ] }, "tests/skillInjectionService.test.ts": { - "mtimeMs": 1778681774000, - "size": 6741, + "mtimeMs": 1778549008933.6833, + "size": 6913, "lines": 172, "role": "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", "imports": [ @@ -1686,8 +1707,8 @@ ] }, "tests/systemPrompt.test.ts": { - "mtimeMs": 1777966465000, - "size": 1215, + "mtimeMs": 1778028987455.4153, + "size": 1244, "lines": 29, "role": "", "imports": [ @@ -1695,8 +1716,8 @@ ] }, "tests/systemSpecs.test.ts": { - "mtimeMs": 1778251130000, - "size": 3464, + "mtimeMs": 1778549008934.187, + "size": 3554, "lines": 90, "role": "Unit tests for SystemSpecs + HeuristicModelMemoryEstimator. Strategy: - HeuristicModelMemoryEstimator is pure โ€” directly drive it with model ids. - NodeSystemSpecsProvider depends on os. so we test: a", "imports": [ @@ -1704,8 +1725,8 @@ ] }, "tests/taskStore.test.ts": { - "mtimeMs": 1778936645000, - "size": 7226, + "mtimeMs": 1779065453901.3855, + "size": 7411, "lines": 185, "role": "", "imports": [ @@ -1714,8 +1735,8 @@ ] }, "tests/telegramBot.test.ts": { - "mtimeMs": 1778253785000, - "size": 13012, + "mtimeMs": 1778549008934.187, + "size": 13375, "lines": 363, "role": "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", "imports": [ @@ -1725,8 +1746,8 @@ ] }, "tests/transaction.test.ts": { - "mtimeMs": 1777808065000, - "size": 2064, + "mtimeMs": 1777511752614.9685, + "size": 2132, "lines": 68, "role": "/ ", "imports": [ @@ -1734,8 +1755,8 @@ ] }, "tests/vulnerability.test.ts": { - "mtimeMs": 1777808065000, - "size": 2100, + "mtimeMs": 1777511752615.9702, + "size": 2160, "lines": 60, "role": "/ ", "imports": [ @@ -1744,615 +1765,643 @@ ] }, "core_py/events.py": { - "mtimeMs": 1777559069000, - "size": 2374, + "mtimeMs": 1778028987265.2336, + "size": 2438, "lines": 64, "role": "", "imports": [] }, "core_py/inference.py": { - "mtimeMs": 1777559249000, - "size": 3834, + "mtimeMs": 1778028987265.8833, + "size": 3925, "lines": 91, "role": "", "imports": [] }, "core_py/loader.py": { - "mtimeMs": 1777559060000, - "size": 2368, + "mtimeMs": 1778028987266.8376, + "size": 2429, "lines": 61, "role": "", "imports": [] }, "core_py/monitoring.py": { - "mtimeMs": 1777559685000, - "size": 2060, + "mtimeMs": 1778028987266.8376, + "size": 2116, "lines": 56, "role": "", "imports": [] }, "core_py/optimizer.py": { - "mtimeMs": 1777559265000, - "size": 2327, + "mtimeMs": 1778028987267.4917, + "size": 2382, "lines": 55, "role": "", "imports": [] }, "core_py/queue_worker.py": { - "mtimeMs": 1777559676000, - "size": 2987, + "mtimeMs": 1778028987268.5847, + "size": 3069, "lines": 82, "role": "", "imports": [] }, + "docs/Advanced_Features_Implementation_Guide.md": { + "mtimeMs": 1778028987294.7693, + "size": 1844, + "lines": 40, + "role": "Advanced Features Implementation Guide", + "imports": [] + }, + "docs/AgentEngine_Architecture.md": { + "mtimeMs": 1778028987295.9912, + "size": 14652, + "lines": 314, + "role": "AgentEngine Architecture Document", + "imports": [] + }, "docs/ASTRA_OFFICE_REFACTOR.md": { - "mtimeMs": 1778931177000, - "size": 9395, + "mtimeMs": 1779065453844.1316, + "size": 9593, "lines": 198, "role": "Astra Office Refactor โ€” Design Doc", "imports": [ "docs/features/astraOffice" ] }, - "docs/Advanced_Features_Implementation_Guide.md": { - "mtimeMs": 1777808065000, - "size": 1804, - "lines": 40, - "role": "Advanced Features Implementation Guide", - "imports": [] - }, - "docs/AgentEngine_Architecture.md": { - "mtimeMs": 1777863061000, - "size": 14338, - "lines": 314, - "role": "AgentEngine Architecture Document", - "imports": [] - }, - "docs/EXPERIENCE_MEMORY_PLAN.md": { - "mtimeMs": 1778595595000, - "size": 9390, - "lines": 122, - "role": "Experience Memory (Mistake / Lesson Loop) โ€” Implementation Plan", - "imports": [] - }, - "docs/PROJECT_CHRONICLE_GUARD_ROADMAP.md": { - "mtimeMs": 1777948230000, - "size": 1634, - "lines": 43, - "role": "Project Chronicle Guard: Search Engine Roadmap", - "imports": [] - }, - "docs/TELEGRAM_REMOTE_EXECUTION_PLAN.md": { - "mtimeMs": 1778592247000, - "size": 12254, - "lines": 452, - "role": "Telegram Remote Execution ๊ธฐํš์„œ", - "imports": [] - }, - "docs/UX_UI_Consistency_Guidelines.md": { - "mtimeMs": 1777808065000, - "size": 2509, - "lines": 44, - "role": "UX/UI Consistency Guidelines", - "imports": [] - }, - "docs/docs/records/docs/README.md": { - "mtimeMs": 1777949758000, - "size": 427, - "lines": 18, - "role": "docs Chronicle Records", - "imports": [] - }, "docs/docs/records/docs/bugs/BUG-0001-viewed-integration-retrieval-test-ts-1-59-integration-retrie.md": { - "mtimeMs": 1777949758000, - "size": 2059, + "mtimeMs": 1778028987313.924, + "size": 2075, "lines": 16, "role": "Bug: Viewed integrationretrieval.test.ts:1-59 integrationretrieval.test.ts๋ฅผ ํ†ตํ•ด ...", "imports": [] }, "docs/docs/records/docs/chronicle.config.json": { - "mtimeMs": 1777949758000, - "size": 522, + "mtimeMs": 1778028987314.4072, + "size": 533, "lines": 11, "role": "JSON configuration", "imports": [] }, "docs/docs/records/docs/project-profile.md": { - "mtimeMs": 1777949758000, - "size": 586, + "mtimeMs": 1778028987314.9126, + "size": 617, "lines": 31, "role": "Project Profile", "imports": [] }, + "docs/docs/records/docs/README.md": { + "mtimeMs": 1778028987312.8103, + "size": 445, + "lines": 18, + "role": "docs Chronicle Records", + "imports": [] + }, "docs/docs/records/docs/timeline.md": { - "mtimeMs": 1777949758000, - "size": 210, + "mtimeMs": 1778028987315.4329, + "size": 217, "lines": 7, "role": "Project Timeline", "imports": [] }, - "docs/records/ConnectAI/README.md": { - "mtimeMs": 1777808202000, - "size": 598, - "lines": 18, - "role": "Astra Project Chronicle Records", + "docs/EXPERIENCE_MEMORY_PLAN.md": { + "mtimeMs": 1778664139926.1729, + "size": 9512, + "lines": 122, + "role": "Experience Memory (Mistake / Lesson Loop) โ€” Implementation Plan", "imports": [] }, - "docs/records/ConnectAI/bugs/BUG-0001-volumes-data-project-antigravity-connectai-แ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณ-แ„แ…ฉแ„ƒแ…ณ-แ„…แ…ตแ„‡แ…ฒ-แ„’แ…ขแ„Œแ…ฎแ†ฏ-แ„‰แ…ฎ-แ„‹แ…ตแ†ป.md": { - "mtimeMs": 1777865266000, - "size": 1408, + "docs/PROJECT_CHRONICLE_GUARD_ROADMAP.md": { + "mtimeMs": 1778028987296.7407, + "size": 1677, + "lines": 43, + "role": "Project Chronicle Guard: Search Engine Roadmap", + "imports": [] + }, + "docs/records/ConnectAI/bugs/BUG-0001-volumes-data-project-antigravity-connectai-ํ”„๋กœ์ ํŠธ-์ฝ”๋“œ-๋ฆฌ๋ทฐ-ํ•ด์ค„-์ˆ˜-์žˆ.md": { + "mtimeMs": 1778028987317.1565, + "size": 1424, "lines": 16, "role": "Bug: /Volumes/Data/project/Antigravity/ConnectAI ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ํ•ด์ค„ ์ˆ˜ ์žˆ์–ด? ๊ฐœ์„ ํ•  ๋ถ€๋ถ„์ด ์žˆ๋Š”์ง€, ๊ทธ๋Ÿฌ๊ณ ...", "imports": [] }, - "docs/records/ConnectAI/bugs/BUG-0002-แ„Œแ…ตแ„€แ…ณแ†ท-แ„‚แ…ขแ„€แ…ก-แ„‡แ…ฎแ†ซแ„‰แ…ฅแ†จ-แ„‹แ…ญแ„Žแ…ฅแ†ผแ„’แ…กแ„€แ…ฉ-แ„‚แ…ฅแ„€แ…ก-แ„ƒแ…กแ†ธแ„‹แ…ณแ†ฏ-แ„Œแ…ฎแ†ฏแ„„แ…ข-แ„‹แ…กแ„…แ…ข-แ„แ…ฆแ†ทแ„‘แ…ณแ†ฏแ„…แ…ตแ†บแ„‹แ…ฆ-แ„†แ…กแ†ฝแ„Žแ…ฏ-แ„ƒแ…กแ†ธแ„‹แ…ณแ†ฏ-แ„Šแ…ฅแ„Œแ…ฎแ„€แ…ฉ-แ„‹แ…ตแ†ปแ„‚แ…ณแ†ซแ„ƒแ…ฆ-แ„€แ…ขแ„‰แ…ฅแ†ซ-แ„‘แ…ฉแ„‹แ…ตแ†ซแ„แ…ณแ„€แ…ก-แ„‹แ…ตแ†ปแ„‚แ…ณแ†ซแ„Œแ…ต-แ„’แ…ชแ†จแ„‹แ…ตแ†ซแ„’แ…ข.md": { - "mtimeMs": 1777889979000, - "size": 2559, + "docs/records/ConnectAI/bugs/BUG-0002-์ง€๊ธˆ-๋‚ด๊ฐ€-๋ถ„์„-์š”์ฒญํ•˜๊ณ -๋„ˆ๊ฐ€-๋‹ต์„-์ค„๋•Œ-์•„๋ž˜-ํ…œํ”Œ๋ฆฟ์—-๋งž์ถฐ-๋‹ต์„-์จ์ฃผ๊ณ -์žˆ๋Š”๋ฐ-๊ฐœ์„ -ํฌ์ธํŠธ๊ฐ€-์žˆ๋Š”์ง€-ํ™•์ธํ•ด.md": { + "mtimeMs": 1778028987317.6665, + "size": 2575, "lines": 16, "role": "Bug: ์ง€๊ธˆ ๋‚ด๊ฐ€ ๋ถ„์„ ์š”์ฒญํ•˜๊ณ  ๋„ˆ๊ฐ€ ๋‹ต์„ ์ค„๋•Œ ์•„๋ž˜ ํ…œํ”Œ๋ฆฟ์— ๋งž์ถฐ ๋‹ต์„ ์จ์ฃผ๊ณ  ์žˆ๋Š”๋ฐ, ๊ฐœ์„  ํฌ์ธํŠธ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์ค˜. ## ๋‚ด๊ฐ€ ๋ณด๋Š” ์œ„ํ—˜ ๊ฐ€์žฅ ํฐ...", "imports": [] }, - "docs/records/ConnectAI/bugs/BUG-0003-volumes-data-project-antigravity-connectai-แ„‚แ…ข-แ„Œแ…ตแ†ฏแ„†แ…ฎแ†ซแ„‹แ…ฆ-แ„ƒแ…ขแ„’แ…กแ†ซ-แ„ƒแ…กแ†ธแ„‡แ…งแ†ซแ„‹แ…ต-แ„Œแ…กแ†ฏ-แ„Œแ…ฅแ†ผแ„…แ…ต.md": { - "mtimeMs": 1777962835000, - "size": 1891, + "docs/records/ConnectAI/bugs/BUG-0003-volumes-data-project-antigravity-connectai-๋‚ด-์งˆ๋ฌธ์—-๋Œ€ํ•œ-๋‹ต๋ณ€์ด-์ž˜-์ •๋ฆฌ.md": { + "mtimeMs": 1778028987320.982, + "size": 1907, "lines": 16, "role": "Bug: /Volumes/Data/project/Antigravity/ConnectAI ๋‚ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ์ž˜ ์ •๋ฆฌ๋˜์„œ ์•Œ๋ ค์ฃผ๊ธด ํ•˜๋Š”๋ฐ focused...", "imports": [] }, - "docs/records/ConnectAI/bugs/BUG-0004-volumes-data-project-antigravity-connectai-แ„‚แ…ข-แ„Œแ…ตแ†ฏแ„†แ…ฎแ†ซแ„‹แ…ฆ-แ„ƒแ…ขแ„’แ…กแ†ซ-แ„ƒแ…กแ†ธแ„‡แ…งแ†ซแ„‹แ…ต-แ„Œแ…กแ†ฏ-แ„Œแ…ฅแ†ผแ„…แ…ต.md": { - "mtimeMs": 1777964236000, - "size": 1883, + "docs/records/ConnectAI/bugs/BUG-0004-volumes-data-project-antigravity-connectai-๋‚ด-์งˆ๋ฌธ์—-๋Œ€ํ•œ-๋‹ต๋ณ€์ด-์ž˜-์ •๋ฆฌ.md": { + "mtimeMs": 1778028987321.984, + "size": 1899, "lines": 16, "role": "Bug: /Volumes/Data/project/Antigravity/ConnectAI ๋‚ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ์ž˜ ์ •๋ฆฌ๋˜์„œ ์•Œ๋ ค์ฃผ๊ธด ํ•˜๋Š”๋ฐ focused...", "imports": [] }, - "docs/records/ConnectAI/bugs/BUG-0005-แ„ƒแ…กแ„‰แ…ตแ„’แ…กแ†ซแ„‡แ…ฅแ†ซ-แ„ƒแ…กแ†ธแ„Œแ…ฏ-volumes-data-project-antigravity-connectai-แ„‚แ…ข-แ„Œแ…ตแ†ฏแ„†แ…ฎแ†ซแ„‹แ…ฆ-แ„ƒแ…ขแ„’แ…กแ†ซ-.md": { - "mtimeMs": 1777965245000, - "size": 1868, + "docs/records/ConnectAI/bugs/BUG-0005-๋‹ค์‹œํ•œ๋ฒˆ-๋‹ต์ค˜-volumes-data-project-antigravity-connectai-๋‚ด-์งˆ๋ฌธ์—-๋Œ€ํ•œ-.md": { + "mtimeMs": 1778028987322.4868, + "size": 1884, "lines": 16, "role": "Bug: ๋‹ค์‹œํ•œ๋ฒˆ ๋‹ต์ค˜. /Volumes/Data/project/Antigravity/ConnectAI ๋‚ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ์ž˜ ์ •๋ฆฌ๋˜์„œ ์•Œ๋ ค์ฃผ๊ธด ํ•˜๋Š”...", "imports": [] }, - "docs/records/ConnectAI/bugs/BUG-0006-volumes-data-project-antigravity-connectai-แ„‚แ…ข-แ„Œแ…ตแ†ฏแ„†แ…ฎแ†ซแ„‹แ…ฆ-แ„ƒแ…ขแ„’แ…กแ†ซ-แ„ƒแ…กแ†ธแ„‡แ…งแ†ซแ„‹แ…ต-แ„Œแ…กแ†ฏ-แ„Œแ…ฅแ†ผแ„…แ…ต.md": { - "mtimeMs": 1777965308000, - "size": 1623, + "docs/records/ConnectAI/bugs/BUG-0006-volumes-data-project-antigravity-connectai-๋‚ด-์งˆ๋ฌธ์—-๋Œ€ํ•œ-๋‹ต๋ณ€์ด-์ž˜-์ •๋ฆฌ.md": { + "mtimeMs": 1778028987322.9897, + "size": 1639, "lines": 16, "role": "Bug: /Volumes/Data/project/Antigravity/ConnectAI ๋‚ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ์ž˜ ์ •๋ฆฌ๋˜์„œ ์•Œ๋ ค์ฃผ๊ธด ํ•˜๋Š”๋ฐ focused...", "imports": [] }, - "docs/records/ConnectAI/bugs/BUG-0007-volumes-data-project-antigravity-connectai-แ„‚แ…ข-แ„Œแ…ตแ†ฏแ„†แ…ฎแ†ซแ„‹แ…ฆ-แ„ƒแ…ขแ„’แ…กแ†ซ-แ„ƒแ…กแ†ธแ„‡แ…งแ†ซแ„‹แ…ต-แ„Œแ…กแ†ฏ-แ„Œแ…ฅแ†ผแ„…แ…ต.md": { - "mtimeMs": 1777965612000, - "size": 1823, + "docs/records/ConnectAI/bugs/BUG-0007-volumes-data-project-antigravity-connectai-๋‚ด-์งˆ๋ฌธ์—-๋Œ€ํ•œ-๋‹ต๋ณ€์ด-์ž˜-์ •๋ฆฌ.md": { + "mtimeMs": 1778028987322.9897, + "size": 1839, "lines": 16, "role": "Bug: /Volumes/Data/project/Antigravity/ConnectAI ๋‚ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ์ž˜ ์ •๋ฆฌ๋˜์„œ ์•Œ๋ ค์ฃผ๊ธด ํ•˜๋Š”๋ฐ focused...", "imports": [] }, - "docs/records/ConnectAI/bugs/BUG-0008-volumes-data-project-antigravity-connectai-แ„‚แ…ข-แ„Œแ…ตแ†ฏแ„†แ…ฎแ†ซแ„‹แ…ฆ-แ„ƒแ…ขแ„’แ…กแ†ซ-แ„ƒแ…กแ†ธแ„‡แ…งแ†ซแ„‹แ…ต-แ„Œแ…กแ†ฏ-แ„Œแ…ฅแ†ผแ„…แ…ต.md": { - "mtimeMs": 1777966704000, - "size": 1737, + "docs/records/ConnectAI/bugs/BUG-0008-volumes-data-project-antigravity-connectai-๋‚ด-์งˆ๋ฌธ์—-๋Œ€ํ•œ-๋‹ต๋ณ€์ด-์ž˜-์ •๋ฆฌ.md": { + "mtimeMs": 1778028987323.9915, + "size": 1753, "lines": 16, "role": "Bug: /Volumes/Data/project/Antigravity/ConnectAI ๋‚ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ์ž˜ ์ •๋ฆฌ๋˜์„œ ์•Œ๋ ค์ฃผ๊ธด ํ•˜๋Š”๋ฐ focused...", "imports": [] }, - "docs/records/ConnectAI/bugs/BUG-0009-แ„†แ…ฎแ†ซแ„Œแ…ฆแ„Œแ…ฅแ†ทแ„‹แ…ณแ†ฏ-แ„‹แ…ตแ†ฐแ„€แ…ฉ-แ„‹แ…ฅแ„„แ…ฅแ‡‚แ„€แ…ฆ-แ„€แ…ขแ„‰แ…ฅแ†ซแ„’แ…กแ„‚แ…ณแ†ซแ„€แ…ฆ-แ„Žแ…ฌแ„‰แ…ฅแ†ซแ„‹แ…ตแ†ซแ„Œแ…ต-แ„‡แ…ฎแ†ซแ„‰แ…ฅแ†จแ„’แ…ขแ„Œแ…ฎแ„†แ…งแ†ซ-แ„Œแ…ฉแ‡‚แ„€แ…ฆแ†ปแ„‹แ…ฅ-แ„‹แ…กแ†ฏแ„€แ…ฆแ†ปแ„‰แ…ณแ†ธแ„‚แ…ตแ„ƒแ…ก-แ„Œแ…ตแ„€แ…ณแ†ทแ„‡แ…ฎแ„แ…ฅ-connectai-แ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณ-แ„‹แ…ฆ.md": { - "mtimeMs": 1777977740000, - "size": 2295, + "docs/records/ConnectAI/bugs/BUG-0009-๋ฌธ์ œ์ ์„-์ฝ๊ณ -์–ด๋–ป๊ฒŒ-๊ฐœ์„ ํ•˜๋Š”๊ฒŒ-์ตœ์„ ์ธ์ง€-๋ถ„์„ํ•ด์ฃผ๋ฉด-์ข‹๊ฒ ์–ด-์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค-์ง€๊ธˆ๋ถ€ํ„ฐ-connectai-ํ”„๋กœ์ ํŠธ-์—.md": { + "mtimeMs": 1778028987324.4944, + "size": 2311, "lines": 16, "role": "Bug: ๋ฌธ์ œ์ ์„ ์ฝ๊ณ  ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•˜๋Š”๊ฒŒ ์ตœ์„ ์ธ์ง€ ๋ถ„์„ํ•ด์ฃผ๋ฉด ์ข‹๊ฒ ์–ด. ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๋ถ€ํ„ฐ ConnectAI ํ”„๋กœ์ ํŠธ์—๋งŒ ์™„์ „ํžˆ ์ง‘์ค‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ...", "imports": [] }, - "docs/records/ConnectAI/bugs/BUG-0010-แ„†แ…ฎแ†ซแ„Œแ…ฆแ„Œแ…ฅแ†ทแ„‹แ…ณแ†ฏ-แ„‹แ…ตแ†ฐแ„€แ…ฉ-แ„‹แ…ฅแ„„แ…ฅแ‡‚แ„€แ…ฆ-แ„€แ…ขแ„‰แ…ฅแ†ซแ„’แ…กแ„‚แ…ณแ†ซแ„€แ…ฆ-แ„Žแ…ฌแ„‰แ…ฅแ†ซแ„‹แ…ตแ†ซแ„Œแ…ต-แ„‡แ…ฎแ†ซแ„‰แ…ฅแ†จแ„’แ…ขแ„Œแ…ฎแ„†แ…งแ†ซ-แ„Œแ…ฉแ‡‚แ„€แ…ฆแ†ปแ„‹แ…ฅ-แ„‹แ…กแ†ฏแ„€แ…ฆแ†ปแ„‰แ…ณแ†ธแ„‚แ…ตแ„ƒแ…ก-แ„Œแ…ตแ„€แ…ณแ†ทแ„‡แ…ฎแ„แ…ฅ-connectai-แ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณ-แ„‹แ…ฆ.md": { - "mtimeMs": 1777981089000, - "size": 2339, + "docs/records/ConnectAI/bugs/BUG-0010-๋ฌธ์ œ์ ์„-์ฝ๊ณ -์–ด๋–ป๊ฒŒ-๊ฐœ์„ ํ•˜๋Š”๊ฒŒ-์ตœ์„ ์ธ์ง€-๋ถ„์„ํ•ด์ฃผ๋ฉด-์ข‹๊ฒ ์–ด-์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค-์ง€๊ธˆ๋ถ€ํ„ฐ-connectai-ํ”„๋กœ์ ํŠธ-์—.md": { + "mtimeMs": 1778028987324.9973, + "size": 2355, "lines": 16, "role": "Bug: ๋ฌธ์ œ์ ์„ ์ฝ๊ณ  ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•˜๋Š”๊ฒŒ ์ตœ์„ ์ธ์ง€ ๋ถ„์„ํ•ด์ฃผ๋ฉด ์ข‹๊ฒ ์–ด. ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๋ถ€ํ„ฐ ConnectAI ํ”„๋กœ์ ํŠธ์—๋งŒ ์™„์ „ํžˆ ์ง‘์ค‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ...", "imports": [] }, - "docs/records/ConnectAI/bugs/BUG-0011-แ„†แ…ฎแ†ซแ„Œแ…ฆแ„Œแ…ฅแ†ทแ„‹แ…ณแ†ฏ-แ„‹แ…ตแ†ฐแ„€แ…ฉ-แ„‹แ…ฅแ„„แ…ฅแ‡‚แ„€แ…ฆ-แ„€แ…ขแ„‰แ…ฅแ†ซแ„’แ…กแ„‚แ…ณแ†ซแ„€แ…ฆ-แ„Žแ…ฌแ„‰แ…ฅแ†ซแ„‹แ…ตแ†ซแ„Œแ…ต-แ„‡แ…ฎแ†ซแ„‰แ…ฅแ†จแ„’แ…ขแ„Œแ…ฎแ„†แ…งแ†ซ-แ„Œแ…ฉแ‡‚แ„€แ…ฆแ†ปแ„‹แ…ฅ-แ„‹แ…กแ†ฏแ„€แ…ฆแ†ปแ„‰แ…ณแ†ธแ„‚แ…ตแ„ƒแ…ก-แ„Œแ…ตแ„€แ…ณแ†ทแ„‡แ…ฎแ„แ…ฅ-connectai-แ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณ-แ„‹แ…ฆ.md": { - "mtimeMs": 1777982331000, - "size": 2277, + "docs/records/ConnectAI/bugs/BUG-0011-๋ฌธ์ œ์ ์„-์ฝ๊ณ -์–ด๋–ป๊ฒŒ-๊ฐœ์„ ํ•˜๋Š”๊ฒŒ-์ตœ์„ ์ธ์ง€-๋ถ„์„ํ•ด์ฃผ๋ฉด-์ข‹๊ฒ ์–ด-์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค-์ง€๊ธˆ๋ถ€ํ„ฐ-connectai-ํ”„๋กœ์ ํŠธ-์—.md": { + "mtimeMs": 1778028987325.5178, + "size": 2293, "lines": 16, "role": "Bug: ๋ฌธ์ œ์ ์„ ์ฝ๊ณ  ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•˜๋Š”๊ฒŒ ์ตœ์„ ์ธ์ง€ ๋ถ„์„ํ•ด์ฃผ๋ฉด ์ข‹๊ฒ ์–ด. ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๋ถ€ํ„ฐ ConnectAI ํ”„๋กœ์ ํŠธ์—๋งŒ ์™„์ „ํžˆ ์ง‘์ค‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ...", "imports": [] }, - "docs/records/ConnectAI/bugs/BUG-0012-แ„Œแ…ตแ†ฏแ„†แ…ฎแ†ซแ„‹แ…ต-แ„‹แ…ตแ†ปแ„‹แ…ฅ-แ„‚แ…ฉแ†ซแ„†แ…ฎแ†ซแ„‹แ…ณแ†ฏ-แ„Šแ…ณแ„…แ…งแ„€แ…ฉแ„’แ…ข-แ„‚แ…ฉแ†ซแ„†แ…ฎแ†ซ-แ„Œแ…ฎแ„Œแ…ฆแ„‚แ…ณแ†ซ-แ„‰แ…ฅแ„‡แ…ตแ„‰แ…ณแ„Œแ…ฅแ†จแ„‹แ…ต-แ„‹แ…กแ„‚แ…ตแ†ซ-แ„‰แ…กแ„‹แ…ญแ†ผแ„Œแ…กแ„€แ…ก-aiแ„‹แ…ฆแ„€แ…ฆ-แ„€แ…ฎแ„Œแ…ฉแ„…แ…ฉ-แ„Œแ…ตแ†ฏแ„†แ…ฎแ†ซแ„‹แ…ณแ†ฏ-แ„’แ…ขแ„‹แ…ฃ-แ„‰แ…กแ„‹แ…ญแ†ผแ„Œแ…กแ„‹แ…ด-แ„‹แ…ดแ„ƒแ…ฉ.md": { - "mtimeMs": 1778762677000, + "docs/records/ConnectAI/bugs/BUG-0012-์งˆ๋ฌธ์ด-์žˆ์–ด-๋…ผ๋ฌธ์„-์“ฐ๋ ค๊ณ ํ•ด-๋…ผ๋ฌธ-์ฃผ์ œ๋Š”-์„œ๋น„์Šค์ ์ด-์•„๋‹Œ-์‚ฌ์šฉ์ž๊ฐ€-ai์—๊ฒŒ-๊ตฌ์กฐ๋กœ-์งˆ๋ฌธ์„-ํ•ด์•ผ-์‚ฌ์šฉ์ž์˜-์˜๋„.md": { + "mtimeMs": 1778727537111.4634, "size": 2354, "lines": 16, "role": "Bug: ์งˆ๋ฌธ์ด ์žˆ์–ด. ๋…ผ๋ฌธ์„ ์“ฐ๋ ค๊ณ ํ•ด. ๋…ผ๋ฌธ ์ฃผ์ œ๋Š” ์„œ๋น„์Šค์ ์ด ์•„๋‹Œ ์‚ฌ์šฉ์ž๊ฐ€ ai์—๊ฒŒ ๊ตฌ์กฐ๋กœ ์งˆ๋ฌธ์„ ํ•ด์•ผ ์‚ฌ์šฉ์ž์˜ ์˜๋„์— ๋งž๋Š” ๋‹ต๋ณ€์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์„๊นŒ์•ผ...", "imports": [] }, - "docs/records/ConnectAI/bugs/BUG-0013-thesis-paperแ„…แ…ณแ†ฏ-แ„Šแ…ณแ„…แ…งแ„€แ…ฉ-แ„’แ…กแ„‚แ…ณแ†ซแ„ƒแ…ฆ-แ„‹แ…กแ„…แ…ขแ„‹แ…ช-แ„€แ…กแ‡€แ„‹แ…ต-แ„Šแ…ณแ„†แ…งแ†ซ-แ„Œแ…ฉแ‡‚แ„‹แ…ณแ†ฏแ„แ…ก-แ„‹แ…ตแ„…แ…ฅแ†ซ-แ„‰แ…ตแ†จแ„‹แ…ณแ„…แ…ฉ-แ„Šแ…ณแ„†แ…งแ†ซ-แ„ƒแ…ฌแ„Œแ…ต-แ„‹แ…กแ†ญแ„‹แ…ณแ†ฏแ„แ…ก-แ„‰แ…ตแ‡แ„‹แ…ณแ†ท-1-in.md": { - "mtimeMs": 1778762677000, + "docs/records/ConnectAI/bugs/BUG-0013-thesis-paper๋ฅผ-์“ฐ๋ ค๊ณ -ํ•˜๋Š”๋ฐ-์•„๋ž˜์™€-๊ฐ™์ด-์“ฐ๋ฉด-์ข‹์„๊นŒ-์ด๋Ÿฐ-์‹์œผ๋กœ-์“ฐ๋ฉด-๋˜์ง€-์•Š์„๊นŒ-์‹ถ์Œ-1-in.md": { + "mtimeMs": 1778728112255.496, "size": 2527, "lines": 16, "role": "Bug: Thesis paper๋ฅผ ์“ฐ๋ ค๊ณ  ํ•˜๋Š”๋ฐ ์•„๋ž˜์™€ ๊ฐ™์ด ์“ฐ๋ฉด ์ข‹์„๊นŒ? ์ด๋Ÿฐ ์‹์œผ๋กœ ์“ฐ๋ฉด ๋˜์ง€ ์•Š์„๊นŒ ์‹ถ์Œ 1. Introduction Thesis ...", "imports": [] }, - "docs/records/ConnectAI/bugs/BUG-0014-แ„‚แ…ฉแ†ซแ„†แ…ฎแ†ซ-outline-title-แ„‹แ…ตแ†ซแ„€แ…กแ†ซ-ai-แ„‰แ…กแ†ผแ„’แ…ฉแ„Œแ…กแ†จแ„‹แ…ญแ†ผแ„‹แ…ฆแ„‰แ…ฅ-แ„‹แ…ดแ„ƒแ…ฉ-แ„Œแ…ฅแ†ผแ„…แ…งแ†ฏแ„‹แ…ณแ†ฏ-แ„‚แ…ฉแ‡แ„‹แ…ตแ„€แ…ต-แ„‹แ…ฑแ„’แ…กแ†ซ-แ„Žแ…ฌแ„‰แ…ฉ-แ„Œแ…ตแ†ฏแ„‹แ…ด-แ„€แ…ฎแ„Œแ…ฉ-แ„‹แ…งแ†ซแ„€แ…ฎ-แ„„แ…ฉแ„‚แ…ณแ†ซ-แ„‰แ…ก.md": { - "mtimeMs": 1778762677000, + "docs/records/ConnectAI/bugs/BUG-0014-๋…ผ๋ฌธ-outline-title-์ธ๊ฐ„-ai-์ƒํ˜ธ์ž‘์šฉ์—์„œ-์˜๋„-์ •๋ ฌ์„-๋†’์ด๊ธฐ-์œ„ํ•œ-์ตœ์†Œ-์งˆ์˜-๊ตฌ์กฐ-์—ฐ๊ตฌ-๋˜๋Š”-์‚ฌ.md": { + "mtimeMs": 1778728474713.4639, "size": 2531, "lines": 16, "role": "Bug: ๋…ผ๋ฌธ Outline Title ์ธ๊ฐ„-AI ์ƒํ˜ธ์ž‘์šฉ์—์„œ ์˜๋„ ์ •๋ ฌ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ ์ตœ์†Œ ์งˆ์˜ ๊ตฌ์กฐ ์—ฐ๊ตฌ ๋˜๋Š” ์‚ฌ์šฉ์ž์˜ ์ธ์ง€์  ํŽธํ–ฅ์„ ๋ณด์™„ํ•˜๋Š” ๊ตฌ์กฐํ™”...", "imports": [] }, "docs/records/ConnectAI/chronicle.config.json": { - "mtimeMs": 1779029444000, - "size": 416, + "mtimeMs": 1779429578331.412, + "size": 371, "lines": 11, "role": "JSON configuration", "imports": [] }, - "docs/records/ConnectAI/decisions/ADR-0001-volumes-data-project-antigravity-connectai-แ„‹แ…ต-แ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณแ„…แ…ณแ†ฏ-แ„Œแ…ตแ„€แ…ณแ†ท-แ„€แ…ขแ„‡แ…กแ†ฏ-แ„Œแ…ฎแ†ผแ„‹แ…ฆ-.md": { - "mtimeMs": 1777860282000, - "size": 1444, + "docs/records/ConnectAI/decisions/ADR-0001-volumes-data-project-antigravity-connectai-์ด-ํ”„๋กœ์ ํŠธ๋ฅผ-์ง€๊ธˆ-๊ฐœ๋ฐœ-์ค‘์—-.md": { + "mtimeMs": 1778028987326.5986, + "size": 1463, "lines": 19, "role": "ADR: /Volumes/Data/project/Antigravity/ConnectAI ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง€๊ธˆ ๊ฐœ๋ฐœ ์ค‘์— ์žˆ์–ด. ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ํ•˜๊ณ  ์ž˜๋œ์ ๊ณผ ...", "imports": [] }, - "docs/records/ConnectAI/decisions/ADR-0002-แ„Œแ…ตแ„€แ…ณแ†ท-แ„‚แ…ฅแ„‹แ…ด-แ„Œแ…ฆ2แ„‚แ…ฌ-แ„Œแ…ตแ„‰แ…ตแ†จแ„‹แ…ณแ†ฏ-แ„‹แ…ตแ„‹แ…ญแ†ผแ„’แ…ขแ„‰แ…ฅ-แ„‹แ…กแ„…แ…ข-แ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณ-แ„‘แ…งแ†ผแ„€แ…กแ„’แ…กแ„€แ…ฉ-แ„‹แ…กแ‡แ„‹แ…ณแ„…แ…ฉ-แ„‹แ…ฅแ„‚แ…ณแ„‡แ…ฎแ„‡แ…ฎแ†ซแ„‹แ…ณแ†ฏ-แ„ƒแ…ฅ-แ„Œแ…ตแ†ธแ„Œแ…ฎแ†ผแ„’แ…ขแ„‰แ…ฅ-แ„€แ…ขแ„‰แ…ฅแ†ซแ„‹แ…ณแ†ฏ-แ„’แ…กแ„†แ…งแ†ซ-แ„Œแ…ฉแ‡‚แ„‹แ…ณแ†ฏแ„Œแ…ต-.md": { - "mtimeMs": 1777869330000, - "size": 1878, + "docs/records/ConnectAI/decisions/ADR-0002-์ง€๊ธˆ-๋„ˆ์˜-์ œ2๋‡Œ-์ง€์‹์„-์ด์šฉํ•ด์„œ-์•„๋ž˜-ํ”„๋กœ์ ํŠธ-ํ‰๊ฐ€ํ•˜๊ณ -์•ž์œผ๋กœ-์–ด๋А๋ถ€๋ถ„์„-๋”-์ง‘์ค‘ํ•ด์„œ-๊ฐœ์„ ์„-ํ•˜๋ฉด-์ข‹์„์ง€-.md": { + "mtimeMs": 1778028987326.5986, + "size": 1897, "lines": 19, "role": "ADR: ์ง€๊ธˆ ๋„ˆ์˜ ์ œ2๋‡Œ ์ง€์‹์„ ์ด์šฉํ•ด์„œ ์•„๋ž˜ ํ”„๋กœ์ ํŠธ ํ‰๊ฐ€ํ•˜๊ณ  ์•ž์œผ๋กœ ์–ด๋А๋ถ€๋ถ„์„ ๋” ์ง‘์ค‘ํ•ด์„œ ๊ฐœ์„ ์„ ํ•˜๋ฉด ์ข‹์„์ง€ ์•Œ๋ ค์ฃผ๋ฉด ์ข‹๊ฒ ์–ด. /Volumes/D...", "imports": [] }, - "docs/records/ConnectAI/decisions/ADR-0003-volumes-data-project-antigravity-connectai-แ„‹แ…ต-แ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณ-แ„Œแ…กแ„Žแ…ฆแ„…แ…ณแ†ฏ-แ„‚แ…กแ„‚แ…ณแ†ซ-แ„Œแ…กแ„‡แ…ตแ„‰แ…ณ.md": { - "mtimeMs": 1777877376000, - "size": 1786, + "docs/records/ConnectAI/decisions/ADR-0003-volumes-data-project-antigravity-connectai-์ด-ํ”„๋กœ์ ํŠธ-์ž์ฒด๋ฅผ-๋‚˜๋Š”-์ž๋น„์Šค.md": { + "mtimeMs": 1778028987328.1038, + "size": 1805, "lines": 19, "role": "ADR: /Volumes/Data/project/Antigravity/ConnectAI ์ด ํ”„๋กœ์ ํŠธ ์ž์ฒด๋ฅผ ๋‚˜๋Š” ์ž๋น„์Šค์™€ ๊ฐ™์€ ํˆด๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋‚ด ๋ชฉํ‘œ...", "imports": [] }, - "docs/records/ConnectAI/decisions/ADR-0004-volumes-data-project-antigravity-connectai-แ„‹แ…ต-แ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณ-แ„Œแ…กแ„Žแ…ฆแ„…แ…ณแ†ฏ-แ„‚แ…กแ„‚แ…ณแ†ซ-แ„Œแ…กแ„‡แ…ตแ„‰แ…ณ.md": { - "mtimeMs": 1777878318000, - "size": 1472, + "docs/records/ConnectAI/decisions/ADR-0004-volumes-data-project-antigravity-connectai-์ด-ํ”„๋กœ์ ํŠธ-์ž์ฒด๋ฅผ-๋‚˜๋Š”-์ž๋น„์Šค.md": { + "mtimeMs": 1778028987328.613, + "size": 1491, "lines": 19, "role": "ADR: /Volumes/Data/project/Antigravity/ConnectAI ์ด ํ”„๋กœ์ ํŠธ ์ž์ฒด๋ฅผ ๋‚˜๋Š” ์ž๋น„์Šค์™€ ๊ฐ™์€ ํˆด๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋‚ด ๋ชฉํ‘œ...", "imports": [] }, - "docs/records/ConnectAI/decisions/ADR-0005-volumes-data-project-antigravity-connectai-แ„‹แ…ต-แ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณ-แ„‹แ…กแ„แ…ตแ„แ…ฆแ†จแ„Žแ…ฅ-แ„‡แ…ฎแ†ซแ„‰แ…ฅแ†จแ„’แ…ขแ„Œแ…ฏ.md": { - "mtimeMs": 1777889802000, - "size": 1512, + "docs/records/ConnectAI/decisions/ADR-0005-volumes-data-project-antigravity-connectai-์ด-ํ”„๋กœ์ ํŠธ-์•„ํ‚คํ…์ฒ˜-๋ถ„์„ํ•ด์ค˜.md": { + "mtimeMs": 1778028987329.1296, + "size": 1531, "lines": 19, "role": "ADR: /Volumes/Data/project/Antigravity/ConnectAI ์ด ํ”„๋กœ์ ํŠธ ์•„ํ‚คํ…์ฒ˜ ๋ถ„์„ํ•ด์ค˜.", "imports": [] }, - "docs/records/ConnectAI/decisions/ADR-0006-volumes-data-project-antigravity-connectai-แ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณแ„‹แ…ฆ-แ„ƒแ…ขแ„’แ…ขแ„‰แ…ฅ-แ„‚แ…ฅแ„€แ…ก-แ„‰แ…กแ„‹แ…ญแ†ผแ„Œแ…ก-.md": { - "mtimeMs": 1777902312000, - "size": 1604, + "docs/records/ConnectAI/decisions/ADR-0006-volumes-data-project-antigravity-connectai-ํ”„๋กœ์ ํŠธ์—-๋Œ€ํ•ด์„œ-๋„ˆ๊ฐ€-์‚ฌ์šฉ์ž-.md": { + "mtimeMs": 1778028987329.1296, + "size": 1623, "lines": 19, "role": "ADR: /Volumes/Data/project/Antigravity/ConnectAI ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด์„œ ๋„ˆ๊ฐ€ ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ํ‰๊ฐ€ ํ•ด์ฃผ๋ฉด ์ข‹๊ฒ ์–ด.", "imports": [] }, - "docs/records/ConnectAI/decisions/ADR-0007-volumes-data-project-antigravity-connectai-แ„‹แ…ตแ„€แ…ฅแ„‹แ…ฆ-แ„€แ…ตแ„‚แ…ณแ†ผ-แ„€แ…ขแ„‰แ…ฅแ†ซแ„‹แ…ณแ†ฏ-แ„’แ…กแ„€แ…ฉ-แ„‰แ…ตแ‡แ„‹แ…ฅ-.md": { - "mtimeMs": 1778398958000, - "size": 1925, + "docs/records/ConnectAI/decisions/ADR-0007-volumes-data-project-antigravity-connectai-์ด๊ฑฐ์—-๊ธฐ๋Šฅ-๊ฐœ์„ ์„-ํ•˜๊ณ -์‹ถ์–ด-.md": { + "mtimeMs": 1778549008870.013, + "size": 1944, "lines": 19, "role": "ADR: /Volumes/Data/project/Antigravity/ConnectAI ์ด๊ฑฐ์— ๊ธฐ๋Šฅ ๊ฐœ์„ ์„ ํ•˜๊ณ  ์‹ถ์–ด. ๋„ˆ๊ฐ€ ๊ธฐํš๊ณผ ๋ฐฉํ–ฅ์„ฑ์„ ์ •ํ•ด์ฃผ๋ฉด ์ข‹...", "imports": [] }, - "docs/records/ConnectAI/decisions/ADR-0008-volumes-data-project-antigravity-connectai-แ„‡แ…ฎแ†ซแ„‰แ…ฅแ†จแ„’แ…กแ„€แ…ฉ-แ„‡แ…ฎแ„Œแ…ฉแ†จแ„’แ…กแ†ซ-แ„‡แ…ฎแ„‡แ…ฎแ†ซแ„‹แ…ตแ„‚แ…ก-แ„€แ…ขแ„‰แ…ฅแ†ซแ„‹แ…ต.md": { - "mtimeMs": 1778600479000, - "size": 1606, + "docs/records/ConnectAI/decisions/ADR-0008-volumes-data-project-antigravity-connectai-๋ถ„์„ํ•˜๊ณ -๋ถ€์กฑํ•œ-๋ถ€๋ถ„์ด๋‚˜-๊ฐœ์„ ์ด.md": { + "mtimeMs": 1778664139928.3345, + "size": 1625, "lines": 19, "role": "ADR: /Volumes/Data/project/Antigravity/ConnectAI ๋ถ„์„ํ•˜๊ณ  ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์ด๋‚˜ ๊ฐœ์„ ์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์•Œ๋ ค์ฃผ๋ฉด ์ข‹๊ฒ ์–ด.", "imports": [] }, - "docs/records/ConnectAI/decisions/ADR-0009-แ„‹แ…ต-แ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณแ„‹แ…ด-แ„€แ…ฎแ„Œแ…ฉแ„‹แ…ฆ-แ„ƒแ…ขแ„’แ…ขแ„‰แ…ฅ-แ„‰แ…ฅแ†ฏแ„†แ…งแ†ผแ„’แ…ขแ„‡แ…ช.md": { - "mtimeMs": 1778678639000, - "size": 1507, + "docs/records/ConnectAI/decisions/ADR-0009-์ด-ํ”„๋กœ์ ํŠธ์˜-๊ตฌ์กฐ์—-๋Œ€ํ•ด์„œ-์„ค๋ช…ํ•ด๋ด.md": { + "mtimeMs": 1778720117388.955, + "size": 1526, "lines": 19, "role": "ADR: ์ด ํ”„๋กœ์ ํŠธ์˜ ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด๋ด.", "imports": [] }, - "docs/records/ConnectAI/decisions/ADR-0010-volumes-data-project-antigravity-connectai-self-reflection-แ„€แ…ต.md": { - "mtimeMs": 1778689955000, - "size": 1468, + "docs/records/ConnectAI/decisions/ADR-0010-volumes-data-project-antigravity-connectai-self-reflection-๊ธฐ.md": { + "mtimeMs": 1778720117389.4595, + "size": 1487, "lines": 19, "role": "ADR: /Volumes/Data/project/Antigravity/ConnectAI self reflection ๊ธฐ๋Šฅ์ด ์ ์šฉ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์ค˜. 1์ธ ...", "imports": [] }, - "docs/records/ConnectAI/decisions/ADR-0011-e-wiki-connectai-self-reflection-แ„€แ…ตแ„‚แ…ณแ†ผแ„‹แ…ต-แ„‹แ…ตแ†ปแ„‚แ…ณแ†ซแ„ƒแ…ฆ-แ„‹แ…ฅแ„„แ…ฅแ‡‚แ„€แ…ฆ-self-reflection.md": { - "mtimeMs": 1778762677000, + "docs/records/ConnectAI/decisions/ADR-0011-e-wiki-connectai-self-reflection-๊ธฐ๋Šฅ์ด-์žˆ๋Š”๋ฐ-์–ด๋–ป๊ฒŒ-self-reflection.md": { + "mtimeMs": 1778720344688.4775, "size": 1604, "lines": 19, "role": "ADR: E:\\Wiki\\connectai self reflection ๊ธฐ๋Šฅ์ด ์žˆ๋Š”๋ฐ ์–ด๋–ป๊ฒŒ SELF REFLECTION์ด ๋ฐ˜์˜๋˜๋Š”์ง€ ๋ถ„์„ํ•ด์ค˜.", "imports": [] }, - "docs/records/ConnectAI/decisions/ADR-0012-e-wiki-connectai-self-reflection-แ„€แ…ตแ„‚แ…ณแ†ผแ„‹แ…ต-แ„‹แ…ตแ†ปแ„‚แ…ณแ†ซแ„ƒแ…ฆ-แ„‹แ…ฅแ„„แ…ฅแ‡‚แ„€แ…ฆ-self-reflection.md": { - "mtimeMs": 1778762677000, + "docs/records/ConnectAI/decisions/ADR-0012-e-wiki-connectai-self-reflection-๊ธฐ๋Šฅ์ด-์žˆ๋Š”๋ฐ-์–ด๋–ป๊ฒŒ-self-reflection.md": { + "mtimeMs": 1778720368351.8215, "size": 1448, "lines": 19, "role": "ADR: E:\\Wiki\\connectai self reflection ๊ธฐ๋Šฅ์ด ์žˆ๋Š”๋ฐ ์–ด๋–ป๊ฒŒ SELF REFLECTION์ด ๋ฐ˜์˜๋˜๋Š”์ง€ ๋ถ„์„ํ•ด์ค˜.", "imports": [] }, - "docs/records/ConnectAI/decisions/ADR-0013-e-wiki-connectai-แ„‹แ…ต-แ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณแ„‹แ…ฃ.md": { - "mtimeMs": 1778902489000, + "docs/records/ConnectAI/decisions/ADR-0013-e-wiki-connectai-์ด-ํ”„๋กœ์ ํŠธ์•ผ.md": { + "mtimeMs": 1778842918359.619, "size": 1370, "lines": 19, "role": "ADR: E:\\Wiki\\connectai ์ด ํ”„๋กœ์ ํŠธ์•ผ", "imports": [] }, - "docs/records/ConnectAI/decisions/ADR-0014-astra-office-แ„‡แ…ฎแ„‡แ…ฎแ†ซ-แ„€แ…ชแ†ซแ„…แ…งแ†ซแ„’แ…ขแ„‰แ…ฅ-แ„€แ…ขแ„‰แ…ฅแ†ซแ„’แ…กแ†ฏ-แ„‡แ…ฎแ„‡แ…ฎแ†ซแ„‹แ…ต-แ„‚แ…ฅแ„†แ…ฎ-แ„†แ…กแ†ญแ„‹แ…ก-แ„€แ…ขแ„‰แ…ฅแ†ซแ„Œแ…ฅแ†ทแ„‹แ…ต-แ„†แ…ฎแ„‹แ…ฅแ†ปแ„‹แ…ต-แ„‹แ…ตแ†ปแ„‚แ…ณแ†ซแ„Œแ…ต-แ„‹แ…ดแ„€แ…งแ†ซ-แ„Œแ…ฎแ„†แ…งแ†ซ-แ„Œแ…ฉแ‡‚แ„€แ…ฆแ†ปแ„‹แ…ฅ.md": { - "mtimeMs": 1778902489000, + "docs/records/ConnectAI/decisions/ADR-0014-astra-office-๋ถ€๋ถ„-๊ด€๋ จํ•ด์„œ-๊ฐœ์„ ํ• -๋ถ€๋ถ„์ด-๋„ˆ๋ฌด-๋งŽ์•„-๊ฐœ์„ ์ ์ด-๋ฌด์—ˆ์ด-์žˆ๋Š”์ง€-์˜๊ฒฌ-์ฃผ๋ฉด-์ข‹๊ฒ ์–ด.md": { + "mtimeMs": 1778842955303.0571, "size": 1560, "lines": 19, "role": "ADR: ASTRA OFFICE ๋ถ€๋ถ„ ๊ด€๋ จํ•ด์„œ ๊ฐœ์„ ํ•  ๋ถ€๋ถ„์ด ๋„ˆ๋ฌด ๋งŽ์•„. ๊ฐœ์„ ์ ์ด ๋ฌด์—ˆ์ด ์žˆ๋Š”์ง€ ์˜๊ฒฌ ์ฃผ๋ฉด ์ข‹๊ฒ ์–ด.", "imports": [] }, - "docs/records/ConnectAI/decisions/ADR-0015-แ„‚แ…ฅแ„‹แ…ด-แ„‰แ…ขแ†ผแ„€แ…กแ†จแ„‹แ…ณแ†ซ-แ„‰แ…กแ„‹แ…ญแ†ผแ„Œแ…กแ„€แ…ก-แ„ƒแ…กแ„‹แ…ณแ†ท-แ„’แ…ขแ†ผแ„ƒแ…ฉแ†ผแ„‹แ…ณแ†ฏ-แ„Žแ…ฎแ„Žแ…ณแ†จ-แ„‹แ…กแ†ซ-แ„’แ…ขแ„ƒแ…ฉ-แ„ƒแ…ฌแ„‚แ…ณแ†ซ-astra-แ„‹แ…ตแ„€แ…ฆ-แ„€แ…กแ„Œแ…กแ†ผ-แ„แ…ณแ†ซ-แ„’แ…ญแ„€แ…ช-แ„‹แ…ตแ†ปแ„‹แ…ณแ†ฏ-แ„€แ…ฅ-แ„€แ…กแ‡€แ„‰แ…ณแ†ธแ„‚แ…ตแ„ƒแ…ก-3แ„€แ…ข-.md": { - "mtimeMs": 1778943211000, - "size": 2482, + "docs/records/ConnectAI/decisions/ADR-0015-๋„ˆ์˜-์ƒ๊ฐ์€-์‚ฌ์šฉ์ž๊ฐ€-๋‹ค์Œ-ํ–‰๋™์„-์ถ”์ธก-์•ˆ-ํ•ด๋„-๋˜๋Š”-astra-์ด๊ฒŒ-๊ฐ€์žฅ-ํฐ-ํšจ๊ณผ-์žˆ์„-๊ฑฐ-๊ฐ™์Šต๋‹ˆ๋‹ค-3๊ฐœ-.md": { + "mtimeMs": 1779065453846.6514, + "size": 2501, "lines": 19, "role": "ADR: ๋„ˆ์˜ ์ƒ๊ฐ์€? \"์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์Œ ํ–‰๋™์„ ์ถ”์ธก ์•ˆ ํ•ด๋„ ๋˜๋Š” Astra\" ์ด๊ฒŒ ๊ฐ€์žฅ ํฐ ํšจ๊ณผ ์žˆ์„ ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค. 3๊ฐœ ์ž‘์—…์œผ๋กœ ๋ฌถ์–ด๋ณผ ์ˆ˜ ์žˆ์–ด์š”: ...", "imports": [] }, - "docs/records/ConnectAI/decisions/ADR-0016-แ„‚แ…ขแ„€แ…ก-แ„‡แ…ณแ†ฏแ„…แ…ฉแ„€แ…ณแ„€แ…ณแ†ฏ-แ„Œแ…กแ†จแ„‰แ…ฅแ†ผแ„‰แ…ต-แ„‰แ…กแ„‹แ…ญแ†ผแ„’แ…กแ„€แ…ฉ-แ„‹แ…ตแ†ปแ„‚แ…ณแ†ซ-แ„Œแ…ตแ„Žแ…ตแ†ทแ„‰แ…ฅแ„‹แ…ตแ†ซแ„ƒแ…ฆ-slot1แ„‡แ…ฅแ†ซ-แ„€แ…ตแ„Œแ…ฎแ†ซแ„‹แ…ณแ„…แ…ฉ-แ„ƒแ…ฅ-แ„Œแ…กแ„‹แ…งแ†ซแ„‰แ…ณแ„…แ…ฅแ†ธแ„€แ…ฉ-แ„แ…ณแ„…แ…ขแ†ซแ„ƒแ…ตแ„’แ…กแ„€แ…ฉ-แ„€แ…ฎแ„ƒแ…ฉแ†จแ„Œแ…กแ„‹แ…ฆแ„€แ…ฆ-แ„Œแ…กแ„‹แ…งแ†ซ.md": { - "mtimeMs": 1779029444000, - "size": 2432, + "docs/records/ConnectAI/decisions/ADR-0016-๋‚ด๊ฐ€-๋ธ”๋กœ๊ทธ๊ธ€-์ž‘์„ฑ์‹œ-์‚ฌ์šฉํ•˜๊ณ -์žˆ๋Š”-์ง€์นจ์„œ์ธ๋ฐ-slot1๋ฒˆ-๊ธฐ์ค€์œผ๋กœ-๋”-์ž์—ฐ์Šค๋Ÿฝ๊ณ -ํŠธ๋žœ๋””ํ•˜๊ณ -๊ตฌ๋…์ž์—๊ฒŒ-์ž์—ฐ.md": { + "mtimeMs": 1779065453847.7014, + "size": 2451, "lines": 19, "role": "ADR: ๋‚ด๊ฐ€ ๋ธ”๋กœ๊ทธ๊ธ€ ์ž‘์„ฑ์‹œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์ง€์นจ์„œ์ธ๋ฐ slot1๋ฒˆ ๊ธฐ์ค€์œผ๋กœ ๋” ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ํŠธ๋žœ๋””ํ•˜๊ณ  ๊ตฌ๋…์ž์—๊ฒŒ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ •๋ณด๋ฅผ ์ „๋‹ฌ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ฐœ์„ ...", "imports": [] }, + "docs/records/ConnectAI/decisions/ADR-0017-e-wiki-connectai-์งˆ๋ฌธ์ด-์žˆ์–ด-์ง€๊ธˆ-์ด-ํ”„๋กœ์ ํŠธ๋Š”-2nd-์ง€์‹์„-๋‚ด๊ฐ€-ํŠน์ •-ํด๋”๋กœ-wikiํ™”ํ•œ-.md": { + "mtimeMs": 1779270264270.286, + "size": 1823, + "lines": 19, + "role": "ADR: E:\\Wiki\\connectai ์งˆ๋ฌธ์ด ์žˆ์–ด. ์ง€๊ธˆ ์ด ํ”„๋กœ์ ํŠธ๋Š” 2nd ์ง€์‹์„ ๋‚ด๊ฐ€ ํŠน์ • ํด๋”๋กœ wikiํ™”ํ•œ md ํŒŒ์ผ๋“ค์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ์‹์œผ๋กœ ...", + "imports": [] + }, + "docs/records/ConnectAI/decisions/ADR-0018-๋ฐฉ๊ธˆ-2nd-๋‡Œ-์—-lateral-thinking-๊ด€๋ จ-์ง€์‹์„-์ถ”๊ฐ€ํ–ˆ์–ด-์ด-๊ธฐ๋Šฅ์ด-์•ž์œผ๋กœ-๋„ˆ๊ฐ€-๋‹ต์„-ํ• ๋•Œ-์–ด.md": { + "mtimeMs": 1779420144716.2415, + "size": 1619, + "lines": 19, + "role": "ADR: ๋ฐฉ๊ธˆ 2nd ๋‡Œ ์— Lateral Thinking ๊ด€๋ จ ์ง€์‹์„ ์ถ”๊ฐ€ํ–ˆ์–ด. ์ด ๊ธฐ๋Šฅ์ด ์•ž์œผ๋กœ ๋„ˆ๊ฐ€ ๋‹ต์„ ํ• ๋•Œ ์–ด๋– ํ•œ ์˜ํ–ฅ์„ ๋ผ์น˜๋Š”์ง€ ์•Œ๋ ค์ฃผ๋ฉด ์ข‹๊ฒ ...", + "imports": [] + }, + "docs/records/ConnectAI/decisions/ADR-0019-์˜ค๋Š˜-ํŒ€๋ณ„-๋ณด๊ณ ๋ฅผ-ํ–ˆ์–ด-๊ทธ๋ƒฅ-ํ•˜๋Š”๊ฒŒ-๋„ˆ๋ฌด-์‹ฌ์ ์œผ๋กœ-ํž˜๋“ ๋ฐ-์–ด๋–ป๊ฒŒ-๊ฐœ์„ ํ• -์ˆ˜-์žˆ์„๊นŒ.md": { + "mtimeMs": 1779420342804.8145, + "size": 1642, + "lines": 19, + "role": "ADR: ์˜ค๋Š˜ ํŒ€๋ณ„ ๋ณด๊ณ ๋ฅผ ํ–ˆ์–ด. ๊ทธ๋ƒฅ ํ•˜๋Š”๊ฒŒ ๋„ˆ๋ฌด ์‹ฌ์ ์œผ๋กœ ํž˜๋“ ๋ฐ ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์„๊นŒ?", + "imports": [] + }, "docs/records/ConnectAI/development/2026-05-02_answer-format-readability-tuning.md": { - "mtimeMs": 1777808065000, - "size": 1534, + "mtimeMs": 1778028987330.4185, + "size": 1564, "lines": 30, "role": "Development Log: Answer Format Readability Tuning", "imports": [] }, "docs/records/ConnectAI/development/2026-05-02_connectai_project_knowledge_overview.md": { - "mtimeMs": 1777808211000, - "size": 4540, + "mtimeMs": 1778028987330.9385, + "size": 4661, "lines": 121, "role": "Astra Project Knowledge Overview", "imports": [] }, "docs/records/ConnectAI/development/2026-05-02_local-path-code-review-preflight.md": { - "mtimeMs": 1777808065000, - "size": 1855, + "mtimeMs": 1778028987330.9385, + "size": 1890, "lines": 35, "role": "Development Log: Local Path Code Review Preflight", "imports": [] }, "docs/records/ConnectAI/development/2026-05-02_no-evidence-no-project-claim.md": { - "mtimeMs": 1777808065000, - "size": 1528, + "mtimeMs": 1778028987331.969, + "size": 1563, "lines": 35, "role": "Development Log: No Evidence, No Project Claim", "imports": [] }, "docs/records/ConnectAI/development/2026-05-02_progressive-answer-format.md": { - "mtimeMs": 1777808065000, - "size": 1194, + "mtimeMs": 1778028987332.698, + "size": 1223, "lines": 29, "role": "Development Log: Progressive Answer Format", "imports": [] }, "docs/records/ConnectAI/development/2026-05-02_project-claim-output-brake.md": { - "mtimeMs": 1777808065000, - "size": 1489, + "mtimeMs": 1778028987333.7078, + "size": 1524, "lines": 35, "role": "Development Log: Project Claim Output Brake", "imports": [] }, "docs/records/ConnectAI/development/2026-05-02_project-claim-policy-enforcement.md": { - "mtimeMs": 1777808065000, - "size": 1516, + "mtimeMs": 1778028987334.2126, + "size": 1551, "lines": 35, "role": "Development Log: Project Claim Policy Enforcement", "imports": [] }, "docs/records/ConnectAI/development/2026-05-02_query-intent-search-tuning.md": { - "mtimeMs": 1777808065000, - "size": 1911, + "mtimeMs": 1778028987335.4814, + "size": 1946, "lines": 35, "role": "Development Log: Query Intent Search Tuning", "imports": [] }, "docs/records/ConnectAI/development/2026-05-02_remove-local-template-replies.md": { - "mtimeMs": 1777808065000, - "size": 1049, + "mtimeMs": 1778028987335.4814, + "size": 1074, "lines": 25, "role": "Development Log: Remove Local Template Replies", "imports": [] }, "docs/records/ConnectAI/development/2026-05-02_second-brain-trace-quality-tuning.md": { - "mtimeMs": 1777808065000, - "size": 1441, + "mtimeMs": 1778028987336.4841, + "size": 1467, "lines": 26, "role": "Development Log: Second Brain Trace Quality Tuning", "imports": [] }, "docs/records/ConnectAI/development/2026-05-03_connectai_project_knowledge_overview.md": { - "mtimeMs": 1777808211000, - "size": 4666, + "mtimeMs": 1778028987336.988, + "size": 4787, "lines": 121, "role": "Astra Project Knowledge Overview", "imports": [] }, - "docs/records/ConnectAI/development/2026-05-05_volumes-data-project-antigravity-connectai-แ„‹แ…ฉแ„‚แ…ณแ†ฏ-แ„†แ…กแ†ญแ„‹แ…ณแ†ซ-แ„€แ…ฅแ†บแ„‹แ…ณแ†ฏ-แ„‹แ…ฅแ†ธแ„ƒแ…ฆแ„‹แ…ตแ„แ…ณแ„’แ…ขแ†ปแ„‹แ…ฅ-แ„†แ…กแ†ญ_implementation.md": { - "mtimeMs": 1777986879000, - "size": 1836, + "docs/records/ConnectAI/development/2026-05-05_volumes-data-project-antigravity-connectai-์˜ค๋Š˜-๋งŽ์€-๊ฒƒ์„-์—…๋ฐ์ดํŠธํ–ˆ์–ด-๋งŽ_implementation.md": { + "mtimeMs": 1778028987337.4993, + "size": 1858, "lines": 22, "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI ์˜ค๋Š˜ ๋งŽ์€ ๊ฒƒ์„ ์—…๋ฐ์ดํŠธํ–ˆ์–ด. ๋งŽ์ด ๊ณ ์นœ๊ฒƒ ๊ฐ™์ง€๋งŒ ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜...", "imports": [] }, - "docs/records/ConnectAI/development/2026-05-05_volumes-data-project-antigravity-connectai-แ„‹แ…ต-แ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณ-แ„‡แ…ฎแ†ซแ„‰แ…ฅแ†จแ„’แ…ขแ„Œแ…ฏ-volum_implementation.md": { - "mtimeMs": 1777967233000, - "size": 1747, + "docs/records/ConnectAI/development/2026-05-05_volumes-data-project-antigravity-connectai-์ด-ํ”„๋กœ์ ํŠธ-๋ถ„์„ํ•ด์ค˜-volum_implementation.md": { + "mtimeMs": 1778028987337.4993, + "size": 1770, "lines": 23, "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI ์ด ํ”„๋กœ์ ํŠธ ๋ถ„์„ํ•ด์ค˜./Volumes/Data/project/An...", "imports": [] }, - "docs/records/ConnectAI/development/2026-05-05_volumes-data-project-antigravity-connectai-แ„‹แ…ต-แ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณ-แ„‡แ…ฎแ†ซแ„‰แ…ฅแ†จแ„’แ…ขแ„Œแ…ฏ_implementation.md": { - "mtimeMs": 1777966822000, - "size": 1727, + "docs/records/ConnectAI/development/2026-05-05_volumes-data-project-antigravity-connectai-์ด-ํ”„๋กœ์ ํŠธ-๋ถ„์„ํ•ด์ค˜_implementation.md": { + "mtimeMs": 1778028987338.1978, + "size": 1749, "lines": 22, "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI ์ด ํ”„๋กœ์ ํŠธ ๋ถ„์„ํ•ด์ค˜.", "imports": [] }, - "docs/records/ConnectAI/development/2026-05-12_volumes-data-project-antigravity-connectai-แ„‡แ…ฎแ†ซแ„‰แ…ฅแ†จแ„’แ…กแ„€แ…ฉ-แ„‡แ…ฎแ„Œแ…ฉแ†จแ„’แ…กแ†ซ-แ„‡แ…ฎแ„‡แ…ฎแ†ซแ„‹แ…ตแ„‚แ…ก-แ„€แ…ขแ„‰แ…ฅแ†ซแ„‹แ…ต_implementation-2.md": { - "mtimeMs": 1778598784000, - "size": 1575, + "docs/records/ConnectAI/development/2026-05-12_volumes-data-project-antigravity-connectai-๋ถ„์„ํ•˜๊ณ -๋ถ€์กฑํ•œ-๋ถ€๋ถ„์ด๋‚˜-๊ฐœ์„ ์ด_implementation-2.md": { + "mtimeMs": 1778664139929.635, + "size": 1597, "lines": 22, "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI ๋ถ„์„ํ•˜๊ณ  ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์ด๋‚˜ ๊ฐœ์„ ์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์•Œ๋ ค์ฃผ๋ฉด ์ข‹๊ฒ ์–ด.", "imports": [] }, - "docs/records/ConnectAI/development/2026-05-12_volumes-data-project-antigravity-connectai-แ„‡แ…ฎแ†ซแ„‰แ…ฅแ†จแ„’แ…กแ„€แ…ฉ-แ„‡แ…ฎแ„Œแ…ฉแ†จแ„’แ…กแ†ซ-แ„‡แ…ฎแ„‡แ…ฎแ†ซแ„‹แ…ตแ„‚แ…ก-แ„€แ…ขแ„‰แ…ฅแ†ซแ„‹แ…ต_implementation-3.md": { - "mtimeMs": 1778599019000, - "size": 1641, + "docs/records/ConnectAI/development/2026-05-12_volumes-data-project-antigravity-connectai-๋ถ„์„ํ•˜๊ณ -๋ถ€์กฑํ•œ-๋ถ€๋ถ„์ด๋‚˜-๊ฐœ์„ ์ด_implementation-3.md": { + "mtimeMs": 1778664139930.2983, + "size": 1663, "lines": 22, "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI ๋ถ„์„ํ•˜๊ณ  ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์ด๋‚˜ ๊ฐœ์„ ์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์•Œ๋ ค์ฃผ๋ฉด ์ข‹๊ฒ ์–ด.", "imports": [] }, - "docs/records/ConnectAI/development/2026-05-12_volumes-data-project-antigravity-connectai-แ„‡แ…ฎแ†ซแ„‰แ…ฅแ†จแ„’แ…กแ„€แ…ฉ-แ„‡แ…ฎแ„Œแ…ฉแ†จแ„’แ…กแ†ซ-แ„‡แ…ฎแ„‡แ…ฎแ†ซแ„‹แ…ตแ„‚แ…ก-แ„€แ…ขแ„‰แ…ฅแ†ซแ„‹แ…ต_implementation-4.md": { - "mtimeMs": 1778600781000, - "size": 1715, + "docs/records/ConnectAI/development/2026-05-12_volumes-data-project-antigravity-connectai-๋ถ„์„ํ•˜๊ณ -๋ถ€์กฑํ•œ-๋ถ€๋ถ„์ด๋‚˜-๊ฐœ์„ ์ด_implementation-4.md": { + "mtimeMs": 1778664139930.8157, + "size": 1739, "lines": 24, "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI ๋ถ„์„ํ•˜๊ณ  ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์ด๋‚˜ ๊ฐœ์„ ์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์•Œ๋ ค์ฃผ๋ฉด ์ข‹๊ฒ ์–ด.", "imports": [] }, - "docs/records/ConnectAI/development/2026-05-12_volumes-data-project-antigravity-connectai-แ„‡แ…ฎแ†ซแ„‰แ…ฅแ†จแ„’แ…กแ„€แ…ฉ-แ„‡แ…ฎแ„Œแ…ฉแ†จแ„’แ…กแ†ซ-แ„‡แ…ฎแ„‡แ…ฎแ†ซแ„‹แ…ตแ„‚แ…ก-แ„€แ…ขแ„‰แ…ฅแ†ซแ„‹แ…ต_implementation.md": { - "mtimeMs": 1778598509000, - "size": 684, + "docs/records/ConnectAI/development/2026-05-12_volumes-data-project-antigravity-connectai-๋ถ„์„ํ•˜๊ณ -๋ถ€์กฑํ•œ-๋ถ€๋ถ„์ด๋‚˜-๊ฐœ์„ ์ด_implementation.md": { + "mtimeMs": 1778664139931.329, + "size": 706, "lines": 22, "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI ๋ถ„์„ํ•˜๊ณ  ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์ด๋‚˜ ๊ฐœ์„ ์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์•Œ๋ ค์ฃผ๋ฉด ์ข‹๊ฒ ์–ด.", "imports": [] }, - "docs/records/ConnectAI/development/2026-05-13_volumes-data-project-antigravity-connectai-แ„‹แ…ต-แ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณ-แ„Œแ…กแ†จแ„‹แ…ฅแ†ธแ„’แ…กแ†ฏแ„€แ…ฅแ„‹แ…ฃ_implementation.md": { - "mtimeMs": 1778691256000, - "size": 990, + "docs/records/ConnectAI/development/2026-05-13_volumes-data-project-antigravity-connectai-์ด-ํ”„๋กœ์ ํŠธ-์ž‘์—…ํ• ๊ฑฐ์•ผ_implementation.md": { + "mtimeMs": 1778720117403.2517, + "size": 1012, "lines": 22, "role": "Development Log: /Volumes/Data/project/Antigravity/ConnectAI ์ด ํ”„๋กœ์ ํŠธ ์ž‘์—…ํ• ๊ฑฐ์•ผ", "imports": [] }, - "docs/records/ConnectAI/development/2026-05-13_แ„‚แ…ฅแ„‚แ…ณแ†ซ-แ„‡แ…ฎแ†ซแ„‰แ…ฅแ†จ-แ„‹แ…ญแ„Žแ…ฅแ†ผแ„’แ…กแ„€แ…ฅแ„‚แ…ก-แ„‚แ…ขแ„€แ…ก-แ„Œแ…กแ†จแ„‹แ…ฅแ†ธ-แ„‹แ…ญแ„Žแ…ฅแ†ผแ„‹แ…ณแ†ฏ-แ„’แ…กแ†ฏแ„„แ…ข-connectai-architecture-md-แ„†แ…ฎแ†ซแ„‰แ…ฅแ„…แ…ณแ†ฏ-แ„Žแ…กแ†ทแ„€แ…ฉแ„’แ…กแ„€แ…ฉ-_implementation.md": { - "mtimeMs": 1778678912000, - "size": 1738, + "docs/records/ConnectAI/development/2026-05-13_๋„ˆ๋Š”-๋ถ„์„-์š”์ฒญํ•˜๊ฑฐ๋‚˜-๋‚ด๊ฐ€-์ž‘์—…-์š”์ฒญ์„-ํ• ๋•Œ-connectai-architecture-md-๋ฌธ์„œ๋ฅผ-์ฐธ๊ณ ํ•˜๊ณ -_implementation.md": { + "mtimeMs": 1778720117403.2517, + "size": 1760, "lines": 22, "role": "Development Log: ๋„ˆ๋Š” ๋ถ„์„ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ๋‚ด๊ฐ€ ์ž‘์—… ์š”์ฒญ์„ ํ• ๋•Œ connectai architecture.md ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜๊ณ  ์ž‘์—…์„ ํ•˜๋‚˜?", "imports": [] }, - "docs/records/ConnectAI/development/2026-05-14_reflector-แ„‹แ…ฆแ„‹แ…ตแ„Œแ…ฅแ†ซแ„แ…ณแ„€แ…ก-1แ„‹แ…ตแ†ซ-แ„€แ…ตแ„‹แ…ฅแ†ธ-แ„‹แ…ฆแ„‹แ…ตแ„Œแ…ฅแ†ซแ„แ…ณ-แ„†แ…ฉแ†จแ„…แ…ฉแ†จแ„‹แ…ฆแ„‚แ…ณแ†ซ-แ„‹แ…กแ†ซแ„‡แ…ฉแ„‹แ…ตแ„‚แ…ณแ†ซแ„ƒแ…ฆ_implementation.md": { - "mtimeMs": 1778762677000, + "docs/records/ConnectAI/development/2026-05-14_reflector-์—์ด์ „ํŠธ๊ฐ€-1์ธ-๊ธฐ์—…-์—์ด์ „ํŠธ-๋ชฉ๋ก์—๋Š”-์•ˆ๋ณด์ด๋Š”๋ฐ_implementation.md": { + "mtimeMs": 1778720474901.9106, "size": 1519, "lines": 24, "role": "Development Log: REFLECTOR ์—์ด์ „ํŠธ๊ฐ€ 1์ธ ๊ธฐ์—… ์—์ด์ „ํŠธ ๋ชฉ๋ก์—๋Š” ์•ˆ๋ณด์ด๋Š”๋ฐ", "imports": [] }, - "docs/records/ConnectAI/development/2026-05-16_astra-google-calendar-oauth-แ„‹แ…งแ†ซแ„€แ…งแ†ฏ_implementation-2.md": { - "mtimeMs": 1778937290000, - "size": 1230, + "docs/records/ConnectAI/development/2026-05-16_astra-google-calendar-oauth-์—ฐ๊ฒฐ_implementation-2.md": { + "mtimeMs": 1779065453847.7014, + "size": 1252, "lines": 22, "role": "Development Log: Astra: Google Calendar OAuth ์—ฐ๊ฒฐ", "imports": [] }, - "docs/records/ConnectAI/development/2026-05-16_astra-google-calendar-oauth-แ„‹แ…งแ†ซแ„€แ…งแ†ฏ_implementation.md": { - "mtimeMs": 1778937268000, - "size": 1267, + "docs/records/ConnectAI/development/2026-05-16_astra-google-calendar-oauth-์—ฐ๊ฒฐ_implementation.md": { + "mtimeMs": 1779065453848.7056, + "size": 1289, "lines": 22, "role": "Development Log: Astra: Google Calendar OAuth ์—ฐ๊ฒฐ", "imports": [] }, - "docs/records/ConnectAI/development/2026-05-16_astra-officeแ„€แ…ก-แ„‹แ…กแ„Œแ…ตแ†จแ„‹แ…ณแ†ซ-แ„†แ…กแ†ญแ„‹แ…ต-แ„‡แ…ฎแ„Œแ…ฉแ†จแ„’แ…กแ†ซแ„€แ…ฅแ†บ-แ„€แ…กแ‡€แ„‹แ…ณแ†ซแ„ƒแ…ฆ-แ„‹แ…ฅแ„„แ…ฅแ‡‚แ„€แ…ฆ-แ„’แ…กแ„†แ…งแ†ซ-แ„แ…ณแ„…แ…ขแ†ซแ„ƒแ…ตแ„’แ…กแ„€แ…ฉ-แ„Œแ…ขแ„†แ…ตแ„‹แ…ตแ†ปแ„‚แ…ณแ†ซ-แ„‡แ…ฉแ†ฏแ„€แ…ฅแ„…แ…ตแ„€แ…ก-แ„ƒแ…ฌแ†ฏ-แ„‰แ…ฎ-แ„‹แ…ตแ†ปแ„‹แ…ณแ†ฏแ„Œแ…ต_implementation.md": { - "mtimeMs": 1778942937000, - "size": 1750, + "docs/records/ConnectAI/development/2026-05-16_astra-office๊ฐ€-์•„์ง์€-๋งŽ์ด-๋ถ€์กฑํ•œ๊ฒƒ-๊ฐ™์€๋ฐ-์–ด๋–ป๊ฒŒ-ํ•˜๋ฉด-ํŠธ๋žœ๋””ํ•˜๊ณ -์žฌ๋ฏธ์žˆ๋Š”-๋ณผ๊ฑฐ๋ฆฌ๊ฐ€-๋ -์ˆ˜-์žˆ์„์ง€_implementation.md": { + "mtimeMs": 1779065453849.6394, + "size": 1772, "lines": 22, "role": "Development Log: astra office๊ฐ€ ์•„์ง์€ ๋งŽ์ด ๋ถ€์กฑํ•œ๊ฒƒ ๊ฐ™์€๋ฐ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ํŠธ๋žœ๋””ํ•˜๊ณ  ์žฌ๋ฏธ์žˆ๋Š” ๋ณผ๊ฑฐ๋ฆฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ์„์ง€. ๊ฐœ์„ ์  ์ค„ ์ˆ˜ ์žˆ์–ด?", "imports": [] }, - "docs/records/ConnectAI/discussions/2026-05-13_volumes-data-project-antigravity-connectai-แ„‹แ…ต-แ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณ-แ„Œแ…กแ†จแ„‹แ…ฅแ†ธ-แ„’แ…กแ†ฏ-แ„€แ…ฅแ„‹แ…ฃ.md": { - "mtimeMs": 1778690673000, - "size": 652, + "docs/records/ConnectAI/development/2026-05-22_e-wiki-connectai-์ด-ํ”„๋กœ์ ํŠธ๊ฐ€-๋„ˆ์˜-ํ”„๋กœ์ ํŠธ์ธ๋ฐ-๋‹จ์ˆœํžˆ-cloud-base-ai-model์„-_implementation.md": { + "mtimeMs": 1779412633314.1108, + "size": 1638, + "lines": 22, + "role": "Development Log: E:\\Wiki\\connectai ์ด ํ”„๋กœ์ ํŠธ๊ฐ€ ๋„ˆ์˜ ํ”„๋กœ์ ํŠธ์ธ๋ฐ, ๋‹จ์ˆœํžˆ cloud base ai model์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด...", + "imports": [] + }, + "docs/records/ConnectAI/discussions/2026-05-13_volumes-data-project-antigravity-connectai-์ด-ํ”„๋กœ์ ํŠธ-์ž‘์—…-ํ• -๊ฑฐ์•ผ.md": { + "mtimeMs": 1778720117404.2578, + "size": 668, "lines": 16, "role": "Discussion: /Volumes/Data/project/Antigravity/ConnectAI ์ด ํ”„๋กœ์ ํŠธ ์ž‘์—… ํ•  ๊ฑฐ์•ผ.", "imports": [] }, - "docs/records/ConnectAI/discussions/2026-05-13_volumes-data-project-antigravity-connectai-แ„‹แ…ต-แ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณ-แ„Œแ…กแ†จแ„‹แ…ฅแ†ธแ„’แ…กแ†ฏแ„€แ…ฅแ„‹แ…ฃ.md": { - "mtimeMs": 1778680095000, - "size": 651, + "docs/records/ConnectAI/discussions/2026-05-13_volumes-data-project-antigravity-connectai-์ด-ํ”„๋กœ์ ํŠธ-์ž‘์—…ํ• ๊ฑฐ์•ผ.md": { + "mtimeMs": 1778720117405.2607, + "size": 667, "lines": 16, "role": "Discussion: /Volumes/Data/project/Antigravity/ConnectAI ์ด ํ”„๋กœ์ ํŠธ ์ž‘์—…ํ• ๊ฑฐ์•ผ", "imports": [] }, - "docs/records/ConnectAI/discussions/2026-05-13_volumes-data-project-antigravity-connectai-แ„‹แ…ต-แ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณ-แ„’แ…กแ„‹แ…ฑ-แ„‘แ…ฉแ†ฏแ„ƒแ…ฅ-แ„‘แ…ฉแ„’แ…กแ†ทแ„’แ…ขแ„‰แ…ฅ.md": { - "mtimeMs": 1778689036000, - "size": 720, + "docs/records/ConnectAI/discussions/2026-05-13_volumes-data-project-antigravity-connectai-์ด-ํ”„๋กœ์ ํŠธ-ํ•˜์œ„-ํด๋”-ํฌํ•จํ•ด์„œ.md": { + "mtimeMs": 1778720117405.2607, + "size": 736, "lines": 16, "role": "Discussion: /Volumes/Data/project/Antigravity/ConnectAI ์ด ํ”„๋กœ์ ํŠธ ํ•˜์œ„ ํด๋” ํฌํ•จํ•ด์„œ ๋”ฅ ๋ฆฌ์„œ์น˜ ํ•ด์ค˜. ์ตœ์ ํ™” ํ•  ๋ถ€๋ถ„...", "imports": [] }, - "docs/records/ConnectAI/discussions/2026-05-13_volumes-data-project-antigravity-connectai-แ„‹แ…ต-แ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณแ„…แ…ณแ†ฏ-แ„Œแ…กแ†จแ„‹แ…ฅแ†ธแ„’แ…กแ†ฏแ„€แ…ฅแ„‹แ…ฃ.md": { - "mtimeMs": 1778677791000, - "size": 719, + "docs/records/ConnectAI/discussions/2026-05-13_volumes-data-project-antigravity-connectai-์ด-ํ”„๋กœ์ ํŠธ๋ฅผ-์ž‘์—…ํ• ๊ฑฐ์•ผ.md": { + "mtimeMs": 1778720117406.7637, + "size": 735, "lines": 16, "role": "Discussion: /Volumes/Data/project/Antigravity/ConnectAI ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ž‘์—…ํ• ๊ฑฐ์•ผ.", "imports": [] }, - "docs/records/ConnectAI/discussions/2026-05-14_แ„Žแ…ฌแ„‰แ…ฅแ†ผแ„‹แ…งแ†ซ-แ„‹แ…กแ†ฏแ„‹แ…ก-แ„แ…กแ†ฏแ„…แ…ตแ„‡แ…ฅแ„‰แ…ณแ„‹แ…ฆแ„‰แ…ฅ-แ„€แ…ณแ†ซแ„†แ…ฎแ„’แ…กแ†ซแ„ƒแ…ฆ.md": { - "mtimeMs": 1778762677000, + "docs/records/ConnectAI/discussions/2026-05-14_์ตœ์„ฑ์—ฐ-์•Œ์•„-์นผ๋ฆฌ๋ฒ„์Šค์—์„œ-๊ทผ๋ฌดํ•œ๋ฐ.md": { + "mtimeMs": 1778733596076.9204, "size": 1297, "lines": 16, "role": "Discussion: ์ตœ์„ฑ์—ฐ ์•Œ์•„? ์นผ๋ฆฌ๋ฒ„์Šค์—์„œ ๊ทผ๋ฌดํ•œ๋ฐ", "imports": [] }, "docs/records/ConnectAI/planning/2026-05-02_project-chronicle-guard.md": { - "mtimeMs": 1777808065000, - "size": 2946, + "mtimeMs": 1778028987339.2349, + "size": 3004, "lines": 58, "role": "Feature Plan: Project Chronicle Guard", "imports": [] }, "docs/records/ConnectAI/planning/2026-05-02_second-brain-trace-mode.md": { - "mtimeMs": 1777808065000, - "size": 1467, + "mtimeMs": 1778028987339.818, + "size": 1503, "lines": 36, "role": "Feature Plan: Second Brain Trace Mode", "imports": [] }, - "docs/records/ConnectAI/planning/2026-05-13_connectai-architecture-แ„†แ…ฎแ†ซแ„‰แ…ฅ-แ„Žแ…ฌแ„‰แ…ตแ†ซแ„’แ…ช-แ„’แ…ขแ„Œแ…ฏ.md": { - "mtimeMs": 1778693933000, - "size": 1340, + "docs/records/ConnectAI/planning/2026-05-13_connectai-architecture-๋ฌธ์„œ-์ตœ์‹ ํ™”-ํ•ด์ค˜.md": { + "mtimeMs": 1778807413479.8662, + "size": 1380, "lines": 40, "role": "Feature Plan: Connectai architecture ๋ฌธ์„œ ์ตœ์‹ ํ™” ํ•ด์ค˜.", "imports": [] }, - "docs/records/ConnectAI/planning/2026-05-13_แ„‰แ…กแ†ผแ„‰แ…ฆแ„’แ…กแ„€แ…ฆ-แ„‹แ…กแ„แ…ตแ„แ…ฆแ†จแ„Žแ…ฅ-แ„€แ…ตแ„Œแ…ฎแ†ซแ„‹แ…ณแ„…แ…ฉ-แ„‰แ…ฅแ†ฏแ„†แ…งแ†ผแ„’แ…ขแ„Œแ…ฏ.md": { - "mtimeMs": 1778678870000, - "size": 1220, + "docs/records/ConnectAI/planning/2026-05-13_์ƒ์„ธํ•˜๊ฒŒ-์•„ํ‚คํ…์ฒ˜-๊ธฐ์ค€์œผ๋กœ-์„ค๋ช…ํ•ด์ค˜.md": { + "mtimeMs": 1778720117406.7637, + "size": 1260, "lines": 40, "role": "Feature Plan: ์ƒ์„ธํ•˜๊ฒŒ ์•„ํ‚คํ…์ฒ˜ ๊ธฐ์ค€์œผ๋กœ ์„ค๋ช…ํ•ด์ค˜.", "imports": [] }, - "docs/records/ConnectAI/planning/2026-05-13_แ„Œแ…ตแ„€แ…ณแ†ท-connectai-architecture-md-แ„†แ…ฎแ†ซแ„‰แ…ฅ-แ„‚แ…ขแ„‹แ…ญแ†ผ-แ„Œแ…ฎแ†ผ-แ„‹แ…ฅแ†ธแ„ƒแ…ฆแ„‹แ…ตแ„แ…ณแ„€แ…ก-แ„‘แ…ตแ†ฏแ„‹แ…ญแ„’แ…กแ†ซ-แ„‡แ…ฎแ„‡แ…ฎแ†ซแ„‹แ…ต-แ„‹แ…ตแ†ปแ„‚แ…ณแ†ซแ„Œแ…ต-แ„’แ…ชแ†จแ„‹แ…ตแ†ซแ„’แ…ขแ„Œแ…ฏ-.md": { - "mtimeMs": 1778694061000, - "size": 2970, + "docs/records/ConnectAI/planning/2026-05-13_์ง€๊ธˆ-connectai-architecture-md-๋ฌธ์„œ-๋‚ด์šฉ-์ค‘-์—…๋ฐ์ดํŠธ๊ฐ€-ํ•„์š”ํ•œ-๋ถ€๋ถ„์ด-์žˆ๋Š”์ง€-ํ™•์ธํ•ด์ค˜-.md": { + "mtimeMs": 1778807413480.8667, + "size": 3010, "lines": 40, "role": "Feature Plan: ์ง€๊ธˆ connectai architecture.md ๋ฌธ์„œ ๋‚ด์šฉ ์ค‘ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•œ ๋ถ€๋ถ„์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์ค˜. ๊ทธ๋Ÿฌ๊ณ  ์ตœ์‹ ํ™”ํ•ด์ค˜. ๋„ˆ๊ฐ€ ๋ถ„์„ํ•ด", "imports": [] }, "docs/records/ConnectAI/project-profile.md": { - "mtimeMs": 1777808208000, - "size": 957, + "mtimeMs": 1778028987341.925, + "size": 987, "lines": 30, "role": "Project Profile", "imports": [] }, + "docs/records/ConnectAI/README.md": { + "mtimeMs": 1778028987316.5518, + "size": 616, + "lines": 18, + "role": "Astra Project Chronicle Records", + "imports": [] + }, "docs/records/ConnectAI/timeline.md": { - "mtimeMs": 1779029444000, - "size": 9978, - "lines": 155, + "mtimeMs": 1779420342806.9556, + "size": 10866, + "lines": 167, "role": "Project Timeline", "imports": [] }, "docs/refactoring_roadmap.md": { - "mtimeMs": 1778171332000, - "size": 3123, + "mtimeMs": 1778232062143.956, + "size": 3176, "lines": 53, "role": "๐Ÿ› ๏ธ ConnectAI ์•„ํ‚คํ…์ฒ˜ ๋ฆฌํŒฉํ† ๋ง ๋กœ๋“œ๋งต", "imports": [] + }, + "docs/TELEGRAM_REMOTE_EXECUTION_PLAN.md": { + "mtimeMs": 1778664139927.3354, + "size": 12706, + "lines": 452, + "role": "Telegram Remote Execution ๊ธฐํš์„œ", + "imports": [] + }, + "docs/UX_UI_Consistency_Guidelines.md": { + "mtimeMs": 1778028987311.5012, + "size": 2553, + "lines": 44, + "role": "UX/UI Consistency Guidelines", + "imports": [] } } } \ No newline at end of file diff --git a/.astra/tests/stress/.astra/cache/259a37934ead3910a8722b82054d46d2ca2057b05c488be1dcf439166ac5a9a1.json b/.astra/tests/stress/.astra/cache/259a37934ead3910a8722b82054d46d2ca2057b05c488be1dcf439166ac5a9a1.json index 66d8db8..50f67e0 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": 1779280514827, + "createdAt": 1779429500111, "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 a0b6c7f..dc2fa4c 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": 1779280514827, + "createdAt": 1779429500108, "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 b3f171e..53f2f19 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": 1779280514826, + "createdAt": 1779429500106, "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 09247dc..510e953 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_1779280514813\ndate: 2026-05-20T12:35:14.828Z\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]** ์ „๋žต ์ˆ˜๋ฆฝ ์ค‘... (12ms)\n- **[RESEARCHER]** ํ•ต์‹ฌ ์ •๋ณด ์ˆ˜์ง‘ ๋ฐ ๋ถ„์„ ์ค‘... (1ms)\n- **[WRITER]** ์ตœ์ข… ๋ฆฌํฌํŠธ ์ž‘์„ฑ ๋ฐ ํŽธ์ง‘ ์ค‘... (1ms)\n", - "createdAt": 1779280514828, + "result": "---\nid: stress_conflict_1779429500089\ndate: 2026-05-22T05:58:20.112Z\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]** ์ „๋žต ์ˆ˜๋ฆฝ ์ค‘... (15ms)\n- **[RESEARCHER]** ํ•ต์‹ฌ ์ •๋ณด ์ˆ˜์ง‘ ๋ฐ ๋ถ„์„ ์ค‘... (3ms)\n- **[WRITER]** ์ตœ์ข… ๋ฆฌํฌํŠธ ์ž‘์„ฑ ๋ฐ ํŽธ์ง‘ ์ค‘... (3ms)\n", + "createdAt": 1779429500113, "modelVersion": "unknown" } \ No newline at end of file diff --git a/.astra/tests/stress/.astra/missions/stress_conflict_1779280514813.json b/.astra/tests/stress/.astra/missions/stress_conflict_1779429500089.json similarity index 78% rename from .astra/tests/stress/.astra/missions/stress_conflict_1779280514813.json rename to .astra/tests/stress/.astra/missions/stress_conflict_1779429500089.json index 9f59b71..096f29c 100644 --- a/.astra/tests/stress/.astra/missions/stress_conflict_1779280514813.json +++ b/.astra/tests/stress/.astra/missions/stress_conflict_1779429500089.json @@ -1,8 +1,8 @@ { - "missionId": "stress_conflict_1779280514813", + "missionId": "stress_conflict_1779429500089", "status": "completed", - "startTime": "2026-05-20T12:35:14.813Z", - "totalElapsedMs": 15, + "startTime": "2026-05-22T05:58:20.089Z", + "totalElapsedMs": 25, "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": 12, + "durationMs": 15, "message": "์ „๋žต ์ˆ˜๋ฆฝ ์ค‘...", - "ts": "2026-05-20T12:35:14.825Z" + "ts": "2026-05-22T05:58:20.104Z" }, { "from": "planner", "to": "researcher", - "durationMs": 1, + "durationMs": 3, "message": "ํ•ต์‹ฌ ์ •๋ณด ์ˆ˜์ง‘ ๋ฐ ๋ถ„์„ ์ค‘...", - "ts": "2026-05-20T12:35:14.826Z" + "ts": "2026-05-22T05:58:20.107Z" }, { "from": "researcher", "to": "writer", - "durationMs": 1, + "durationMs": 3, "message": "์ตœ์ข… ๋ฆฌํฌํŠธ ์ž‘์„ฑ ๋ฐ ํŽธ์ง‘ ์ค‘...", - "ts": "2026-05-20T12:35:14.827Z" + "ts": "2026-05-22T05:58:20.110Z" }, { "from": "writer", "to": "completed", - "durationMs": 1, + "durationMs": 3, "message": "๋ฏธ์…˜ ์™„๋ฃŒ", - "ts": "2026-05-20T12:35:14.828Z" + "ts": "2026-05-22T05:58:20.113Z" } ], "resilienceMetrics": { diff --git a/PATCHNOTES.md b/PATCHNOTES.md index 490457b..2e8f891 100644 --- a/PATCHNOTES.md +++ b/PATCHNOTES.md @@ -1,5 +1,66 @@ # Astra Patch Notes +## v2.2.60 (2026-05-22) +### ๐Ÿ”ง `&&` ๋ช…๋ น ์ฒด์ด๋‹ โ€” ์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ PowerShell ๋ฌธ๋ฒ•์œผ๋กœ ์ž๋™ ๋ณ€ํ™˜ +- **๋ฌธ์ œ:** v2.2.59์—์„œ ํ”„๋กฌํ”„ํŠธ๋กœ "`&&` ์“ฐ์ง€ ๋ง๋ผ"๊ณ  ์ง€์‹œํ–ˆ์œผ๋‚˜, ๋ชจ๋ธ์ด ์—ฌ์ „ํžˆ `cd ... && git add . && git commit ... && git push`๋ฅผ ์ถœ๋ ฅ โ†’ PowerShell 5.1์—์„œ `'&&' ํ† ํฐ์€ ์˜ฌ๋ฐ”๋ฅธ ๋ฌธ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค` ํŒŒ์„œ ์˜ค๋ฅ˜๋กœ **๋ช…๋ น ์ „์ฒด๊ฐ€ ์‹คํ–‰ ์‹คํŒจ**. +- **์›์ธ:** ๋ชจ๋“  git/npm ํŠœํ† ๋ฆฌ์–ผ์ด `&&`๋ฅผ ์“ฐ๋ฏ€๋กœ, ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ๊ทœ์น™๋งŒ์œผ๋กœ๋Š” ์†Œํ˜• ๋กœ์ปฌ ๋ชจ๋ธ์˜ `&&` ์ถœ๋ ฅ์„ ์‹ ๋ขฐ์„ฑ ์žˆ๊ฒŒ ๋ง‰์„ ์ˆ˜ ์—†์Œ. +- **์ˆ˜์ •:** `sanitizeCommand`๊ฐ€ ํ„ฐ๋ฏธ๋„๋กœ ๋ณด๋‚ด๊ธฐ ์ง์ „ **`&&` ์ฒด์ธ์„ PowerShell ์กฐ๊ฑด๋ถ€ ์ฒด์ธ์œผ๋กœ ๊ฒฐ์ •๋ก ์  ๋ณ€ํ™˜**. `A && B && C` โ†’ `A; if ($?) { B; if ($?) { C } }`. `$?`๋กœ ๋‹จ์ถ• ํ‰๊ฐ€(short-circuit)๋ฅผ ๋ณด์กด โ€” ์˜ˆ: `cd` ์‹คํŒจ ์‹œ `git`์ด ์—‰๋šฑํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ์‹คํ–‰๋˜์ง€ ์•Š์Œ. ๋”ฐ์˜ดํ‘œ ์•ˆ์˜ `&&`(์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ๋“ฑ)๋Š” ๋ถ„๋ฆฌ ๋Œ€์ƒ์—์„œ ์ œ์™ธ. +- ์ด์ œ ๋ชจ๋ธ์ด `&&`๋ฅผ ์ถœ๋ ฅํ•ด๋„ git add/commit/push ๋‹ค๋‹จ๊ณ„ ๋ช…๋ น์ด ์ •์ƒ ์‹คํ–‰๋จ. +- **์‹ ๊ทœ ํŒจํ‚ค์ง•:** `astra-2.2.60.vsix`. + +--- + + + +## v2.2.59 (2026-05-22) +### ๐Ÿฉน ๊ธด ๋Œ€ํ™”์—์„œ "๋นˆ ์‘๋‹ต" ์ฐจ๋‹จ โ€” ์ถœ๋ ฅ ํ† ํฐ ์˜ˆ์‚ฐ ํ™•๋ณด +- **๋ฌธ์ œ:** ๊ธด ์„ธ์…˜(์˜ˆ: 34๊ฐœ ๋ฉ”์‹œ์ง€, ~29.6K ํ† ํฐ)์—์„œ ๋ชจ๋ธ์ด ๋นˆ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  "AI ์—”์ง„์ด ๋นˆ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค / Output budget: 1,073 tokens" ์˜ค๋ฅ˜ ์ถœ๋ ฅ. +- **์›์ธ:** ๋Œ€ํ™” ๊ธฐ๋ก ์••์ถ•(`trimHistoryToBudget`)์ด ์ถœ๋ ฅ์šฉ์œผ๋กœ **๋‹จ 512ํ† ํฐ(`minOutputTokens`)๋งŒ ์˜ˆ์•ฝ**ํ–ˆ์Œ. ๊ทธ๋ž˜์„œ 32K ์œˆ๋„์šฐ๊ฐ€ ๊ฑฐ์˜ ๋‹ค ์ฐฐ ๋•Œ๊นŒ์ง€ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ์ž๋ผ๋„๋ก ํ—ˆ์šฉ โ†’ ๋‹ต๋ณ€์— ~1K ํ† ํฐ๋งŒ ๋‚จ์Œ. gemma 4B-active ๊ฐ™์€ ์†Œํ˜•/MoE ๋กœ์ปฌ ๋ชจ๋ธ์€ ์ด ์••๋ฐ•์—์„œ ์ฒซ ํ† ํฐ๋ถ€ํ„ฐ EOS๋ฅผ ๋ฑ‰์–ด **๋นˆ ์‘๋‹ต**์„ ๋ƒ„. +- **์ˆ˜์ •:** ๊ธฐ๋กยท์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ž๋ฅด๊ธฐ ์ „์— **์‹ค์ œ ๋‹ต๋ณ€์šฉ ์˜ˆ์‚ฐ(`preferredOutputReserve`)์„ ์ปจํ…์ŠคํŠธ์˜ ~10%, ์ตœ์†Œ 2048ํ† ํฐ ํ™•๋ณด**(์ƒํ•œ์€ `maxOutputTokens`)ํ•˜๋„๋ก ๋ณ€๊ฒฝ. ์ด์ œ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ํ•ญ์ƒ ๋‹ต๋ณ€ ๊ณต๊ฐ„์„ ๋‚จ๊ธฐ๊ณ  ์ž˜๋ ค, 32K ๋ชจ๋ธ์—์„œ๋„ ์ถœ๋ ฅ ์˜ˆ์‚ฐ์ด 3K+ ๋ณด์žฅ๋จ. `minOutputTokens`(512)๋Š” ์ ˆ๋Œ€ ํ•˜ํ•œ clamp ์šฉ๋„๋กœ๋งŒ ์œ ์ง€. +- **์ถ”๊ฐ€:** `[EXECUTION RULE]`์— PowerShell ์ฒด์ด๋‹ ๊ทœ์น™ ๋ช…์‹œ โ€” ๋ช…๋ น ์—ฐ๊ฒฐ์€ `;` ์‚ฌ์šฉ, `&&` ๊ธˆ์ง€(PowerShell 5.1 ๊ตฌ๋ฌธ ์˜ค๋ฅ˜). git add/commit/push ๊ฐ™์€ ๋‹ค๋‹จ๊ณ„ ๋ช…๋ น์ด ํ„ฐ๋ฏธ๋„์—์„œ ์ •์ƒ ์‹คํ–‰๋จ. +- **์‹ ๊ทœ ํŒจํ‚ค์ง•:** `astra-2.2.59.vsix`. + +--- + + + +## v2.2.58 (2026-05-22) +### ๐Ÿ“‹ ๋‹ต๋ณ€์€ "ํ•ต์‹ฌ ์š”์•ฝ ๋จผ์ €, ์ƒ์„ธ ์•„๋ž˜" โ€” ํ•œ๋ˆˆ์— ๋“ค์–ด์˜ค๋Š” ์ถœ๋ ฅ ํฌ๋งท +- **๋ฌธ์ œ:** ๋‹ต๋ณ€ ๋‚ด์šฉ ํ€„๋ฆฌํ‹ฐ๋Š” ์ข‹์œผ๋‚˜ ๋ถ„๋Ÿ‰์ด ๊ธธ์–ด ํ•œ๋ˆˆ์— ์•ˆ ๋“ค์–ด์˜ด. ๊ฒŒ๋‹ค๊ฐ€ ์š”์•ฝ(`## ์š”์•ฝ`)์ด ๋งจ ์œ„๊ฐ€ ์•„๋‹ˆ๋ผ **๋งจ ์•„๋ž˜**์— ์ถœ๋ ฅ๋˜๊ณ , `## ## ์š”์•ฝ`์ฒ˜๋Ÿผ ํ—ค๋”ฉ ์ ‘๋‘์‚ฌ๊ฐ€ ์ค‘๋ณต๋˜๋ฉฐ, ์ด๋ฏธ ๊ธˆ์ง€๋œ "ํ•ต์‹ฌ ํ™•์ธ ์งˆ๋ฌธ" ์„น์…˜์ด ๋ˆ„์ถœ๋จ. +- **์›์ธ:** `[OUTPUT FORMAT]`์ด "๊ธฐ์ˆ  ๋ถ„์„/์•„ํ‚คํ…์ฒ˜/ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…/์ „๋žต ๊ธฐํš์ผ ๋•Œ๋งŒ" 3์„น์…˜์„ ์“ฐ๋ผ๋Š” **๋ชจํ˜ธํ•œ ์นดํ…Œ๊ณ ๋ฆฌ ๊ฒŒ์ดํŠธ**๋ผ, ์ผ๋ฐ˜ ์ƒ๋‹ดํ˜• ์งˆ๋ฌธ์—์„œ ๋ชจ๋ธ์ด ํฌ๋งท์„ ์ œ๋ฉ‹๋Œ€๋กœ ํ•ด์„ํ•จ. +- **์ˆ˜์ • 1 โ€” ๊ธธ์ด ๊ฒŒ์ดํŠธ.** ์นดํ…Œ๊ณ ๋ฆฌ ๋Œ€์‹  **๊ธธ์ด ๊ธฐ์ค€**์œผ๋กœ ์ „ํ™˜: ๋‹ต๋ณ€์ด ~4๋ฌธ์žฅ์„ ๋„˜์œผ๋ฉด ๋ฌด์กฐ๊ฑด `## ํ•ต์‹ฌ ์š”์•ฝ`(๋ถˆ๋ฆฟ 2~4๊ฐœ, ์ „์ฒด๋ฅผ ๊ด€ํ†ตํ•˜๋Š” ์Šค์บ” ๊ฐ€๋Šฅํ•œ ์š”์•ฝ)์„ **๋งจ ์œ„**์— ์ถœ๋ ฅํ•˜๊ณ  ๊ทธ ์•„๋ž˜ `## ์ƒ์„ธ ์„ค๋ช…`. ์š”์•ฝ ์•ž ์ธํŠธ๋กœ ๋ฌธ๋‹จ ๊ธˆ์ง€. ์งง์€ ๋‹ต๋ณ€์€ ํ—ค๋”ฉ ์—†์ด ๋ฐ”๋กœ ๋‹ต๋ณ€. +- **์ˆ˜์ • 2 โ€” ํ—ค๋”ฉ ๊ทœ์น™.** ๋ชจ๋“  ๋งˆํฌ๋‹ค์šด ํ—ค๋”ฉ์€ ์ •ํ™•ํžˆ `## ` ํ•˜๋‚˜๋กœ ์‹œ์ž‘(`## ##` ์ค‘๋ณต ๊ธˆ์ง€). +- **์ˆ˜์ • 3 โ€” ํ›„์† ์งˆ๋ฌธ ๊ทœ์น™ ๊ฐ•ํ™”.** ํ›„์† ์งˆ๋ฌธ์€ ํ•œ ๋ฌธ์žฅยทํ•œ ์ค„ยท๋ผ๋ฒจ ์—†์Œ. ์„น์…˜ ํ—ค๋”ฉยท"์งˆ๋ฌธ ์˜๋„" ์„ค๋ช…ยท๋ณต์ˆ˜ ์งˆ๋ฌธ ๊ธˆ์ง€ โ†’ "ํ•ต์‹ฌ ํ™•์ธ ์งˆ๋ฌธ" ์„น์…˜ ๋ˆ„์ถœ ์ฐจ๋‹จ. +- **์‹ ๊ทœ ํŒจํ‚ค์ง•:** `astra-2.2.58.vsix`. + +--- + + + +## v2.2.57 (2026-05-22) +### ๐Ÿš€ ์‹คํ–‰ ์š”์ฒญ์€ ์„ค๋ช… ๋Œ€์‹  ์ฆ‰์‹œ ์‹คํ–‰ โ€” `[EXECUTION RULE]` ์ถ”๊ฐ€ +- **๋ฌธ์ œ:** "E:\Wiki\Datacollect ์„œ๋ฒ„ ์‹คํ–‰ํ•ด์ค˜" ๊ฐ™์€ ์š”์ฒญ์— ASTRA๊ฐ€ ์ง์ ‘ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ , `npm run platform` ๋“ฑ ์ถ”์ธก์„ฑ ๋ช…๋ นยท์กด์žฌํ•˜์ง€ ์•Š๋Š” ํฌํŠธ(`8787`)ยทํ™˜๊ฒฝ๋ณ€์ˆ˜(`GEMINI_API_KEY`)๋ฅผ ์ง€์–ด๋‚ด๋ฉฐ "์ด๋ ‡๊ฒŒ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค" ์‹ ํŠœํ† ๋ฆฌ์–ผ๋งŒ ์ถœ๋ ฅํ–ˆ์Œ. +- **์›์ธ:** ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์˜ `[LOCAL PATH RULE]`์ด "review/analysis/debugging"๋งŒ ๋‹ค๋ค„, "์‹คํ–‰/๊ตฌ๋™/์‹œ์ž‘" ์š”์ฒญ์— ๋ฐœ๋™๋˜๋Š” ๊ทœ์น™์ด ์ „๋ฌดํ–ˆ์Œ. ๋ชจ๋ธ์ด ํ•™์Šต prior๋Œ€๋กœ ์‚ฐ๋ฌธ ์„ค๋ช…์œผ๋กœ ํšŒ๊ท€. +- **์ˆ˜์ • 1 โ€” ํ”„๋กฌํ”„ํŠธ.** `[EXECUTION RULE]` ์‹ ์„ค: ์‹คํ–‰/๊ตฌ๋™/์‹œ์ž‘/run/start ํ‚ค์›Œ๋“œ โ†’ ํŠœํ† ๋ฆฌ์–ผ ๊ธˆ์ง€, ๋ช…๋ น์„ ๋ชจ๋ฅด๋ฉด ``๋กœ package.json์„ ๋จผ์ € ์ฝ๊ณ  ๊ทธ ๋‹ค์Œ ``๋กœ ์‹ค์ œ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰. ์ถ”์ธกํ•œ ์Šคํฌ๋ฆฝํŠธ๋ช…ยทํฌํŠธยทํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋‹จ์ • ๊ธˆ์ง€. Few-shot ์˜ˆ์‹œ 1๊ฑด ํฌํ•จ(์ž‘์€ ๋กœ์ปฌ ๋ชจ๋ธ์˜ ํƒœ๊ทธ ์ค€์ˆ˜์œจ ํ–ฅ์ƒ). +- **์ˆ˜์ • 2 โ€” ๊ฒฝ๋กœ ๊ฒฝ๊ณ„.** ``/``๊ฐ€ ์›Œํฌ์ŠคํŽ˜์ด์Šค ์•ˆ์œผ๋กœ๋งŒ ์ œํ•œ๋ผ ํ˜•์ œ ํ”„๋กœ์ ํŠธ(`E:\Wiki\Datacollect` ๋“ฑ)์˜ package.json์„ ๋ชป ์ฝ๋˜ ๋ฌธ์ œ ํ•ด๊ฒฐ. `security.ts`๊ฐ€ ์›Œํฌ์ŠคํŽ˜์ด์Šค์˜ **์ƒ์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ 1๋‹จ๊ณ„**๊นŒ์ง€ ์‹ ๋ขฐ ๋ฃจํŠธ๋กœ ํฌํ•จ(๋“œ๋ผ์ด๋ธŒ ๋ฃจํŠธ๋กœ๋Š” ํ™•์žฅ ์•ˆ ํ•จ). ์ด๋กœ์จ ํ˜•์ œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ฝ์–ด ์ •ํ™•ํ•œ ์‹คํ–‰ ๋ช…๋ น์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ โ†’ ํ™˜๊ฐ ์ œ๊ฑฐ. +- **์‹ ๊ทœ ํŒจํ‚ค์ง•:** `astra-2.2.57.vsix`. + +--- + + + +## v2.2.56 (2026-05-22) +### โšก ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๊ธฐ๋ฐ˜ ์„ฑ๋Šฅยท๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™” (12๊ฑด, ๋™์ž‘ ๋ณ€๊ฒฝ ์—†์Œ) +- **๐Ÿ”ด ๋ธŒ๋ ˆ์ธ ์ฝ”ํผ์Šค ๋””์Šคํฌ ์žฌ์ฝ๊ธฐ ์ œ๊ฑฐ.** `secondBrainTrace`๋Š” ๋ฉ”์‹œ์ง€๋งˆ๋‹ค ๋ธŒ๋ ˆ์ธ ์ „์ฒด๋ฅผ ๋””์Šคํฌ์—์„œ ๋‹ค์‹œ ์ฝ์–ด ์žฌ๋ถ„๋ฅ˜ํ–ˆ์Œ โ†’ mtime+size ํ‚ค ์Šค์บ” ์บ์‹œ๋กœ ๋ณ€๊ฒฝ(ํŒŒ์ผ์ด ์‹ค์ œ๋กœ ๋ฐ”๋€” ๋•Œ๋งŒ ์žฌ์ฝ๊ธฐ). `scopedBrainRetriever`(ํ…”๋ ˆ๊ทธ๋žจ ๊ฒฝ๋กœ)๋„ ๋™์ผ ์•ˆํ‹ฐํŒจํ„ด โ†’ ์บ์‹œ๋œ `getBrainTokenIndex()` + `scoreTfIdfPreTokenized` ๊ฒฝ๋กœ๋กœ ๋ผ์šฐํŒ…. ์ ์ˆ˜ ๊ฒฐ๊ณผ๋Š” ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๋™์ผ. +- **๐ŸŸก ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ยท์ค‘๋ณต ์ž‘์—… ์ •๋ฆฌ.** `agent.ts` `chatHistory` ๋ฌด์ œํ•œ ์ฆ๊ฐ€ โ†’ ์ตœ๊ทผ 40๊ฐœ ์œ ์ง€ยท์˜ค๋ž˜๋œ ๋„๊ตฌ ๊ฒฐ๊ณผ ๋ณธ๋ฌธ ์ถ•์•ฝ. `EpisodicMemory` ์—ํ”ผ์†Œ๋“œ JSON ๋ฉ”์‹œ์ง€๋งˆ๋‹ค ์žฌ์ฝ๊ธฐ โ†’ ๋””๋ ‰ํ„ฐ๋ฆฌ mtime ํ‚ค ์บ์‹œ. `_walkBrainFiles` โ†’ `readdirSync({withFileTypes})`ยท๋‹จ์ผ ๋ˆ„์‚ฐ๊ธฐ(`concat` ์ œ๊ฑฐ). TF-IDF `termFrequency` โ†’ ๋ฌธ์„œ๋ณ„ term-count `Map` 1ํšŒ ์‚ฌ์ „ ๊ณ„์‚ฐ. `getConfig()` ์ค‘๋ณต ํ˜ธ์ถœ 1ํšŒ๋กœ ํ†ตํ•ฉ. +- **๐ŸŸข ๋ˆ„์ˆ˜ยท์ •๋ฆฌ ๋ณด๊ฐ•.** `clearBrainTokenIndex()`๋ฅผ `deactivate()`ยท๋ธŒ๋ ˆ์ธ ํ”„๋กœํ•„ ์ „ํ™˜ ์‹œ ํ˜ธ์ถœ. ์›น๋ทฐ ๋ฉ”์‹œ์ง€ ๋ฆฌ์Šค๋„ˆ dispose ๋ฐฐ์„ . `LongTermMemory` `longTermMaxEntries`(100) ๊ฐ•์ œ. Pixel Office ์ธํ„ฐ๋ฒŒ์€ ๋ทฐ ๋น„ํ‘œ์‹œ ์‹œ ์ผ์‹œ์ •์ง€. `/ping`์€ ํ•‘๋งˆ๋‹ค ๋ธŒ๋ ˆ์ธ ์ „์ฒด ํƒ์ƒ‰ ๋Œ€์‹  5์ดˆ TTL ์บ์‹œ ์‘๋‹ต. +- ์ „ ํ•ญ๋ชฉ ๋™์ž‘ ๋ณด์กด โ€” ๊ธฐ๋Šฅยท์ถœ๋ ฅ ๋ณ€๊ฒฝ ์—†์Œ. ํƒ€์ž… ์ฒดํฌ(`tsc --noEmit`) ๋ฌด์˜ค๋ฅ˜, ํ…Œ์ŠคํŠธ 400/400 ํ†ต๊ณผ. +- **์‹ ๊ทœ ํŒจํ‚ค์ง•:** `astra-2.2.56.vsix`. + +--- + + + ## v2.2.55 (2026-05-21) ### ๐Ÿ“… /meet โ€” ํšŒ์˜๋ก ์•ก์…˜ ์•„์ดํ…œ โ†’ Google ์บ˜๋ฆฐ๋” ์ž๋™ ๋“ฑ๋ก (Phase 1) - `/meet`์ด ํšŒ์˜๋ก ํ•ฉ์„ฑยท์ €์žฅ ํ›„, **์•ก์…˜ ์•„์ดํ…œ ํ‘œ๋ฅผ ํŒŒ์‹ฑํ•ด task๋ณ„ ์ข…์ผ ์ผ์ •์œผ๋กœ Google Calendar์— ์ž๋™ ๋“ฑ๋ก**ํ•œ๋‹ค. diff --git a/docs/records/ConnectAI/chronicle.config.json b/docs/records/ConnectAI/chronicle.config.json index 58ebe35..c2a5a7f 100644 --- a/docs/records/ConnectAI/chronicle.config.json +++ b/docs/records/ConnectAI/chronicle.config.json @@ -6,6 +6,6 @@ "description": "Auto-created by Project Architecture activation.", "corePurpose": "", "detailLevel": "standard", - "createdAt": "2026-05-14T00:57:32.245Z", - "updatedAt": "2026-05-18T03:11:17.574Z" + "createdAt": "2026-05-20T09:42:40.003Z", + "updatedAt": "2026-05-22T05:59:38.330Z" } diff --git a/docs/records/ConnectAI/decisions/ADR-0017-e-wiki-connectai-์งˆ๋ฌธ์ด-์žˆ์–ด-์ง€๊ธˆ-์ด-ํ”„๋กœ์ ํŠธ๋Š”-2nd-์ง€์‹์„-๋‚ด๊ฐ€-ํŠน์ •-ํด๋”๋กœ-wikiํ™”ํ•œ-.md b/docs/records/ConnectAI/decisions/ADR-0017-e-wiki-connectai-์งˆ๋ฌธ์ด-์žˆ์–ด-์ง€๊ธˆ-์ด-ํ”„๋กœ์ ํŠธ๋Š”-2nd-์ง€์‹์„-๋‚ด๊ฐ€-ํŠน์ •-ํด๋”๋กœ-wikiํ™”ํ•œ-.md new file mode 100644 index 0000000..9edfd3f --- /dev/null +++ b/docs/records/ConnectAI/decisions/ADR-0017-e-wiki-connectai-์งˆ๋ฌธ์ด-์žˆ์–ด-์ง€๊ธˆ-์ด-ํ”„๋กœ์ ํŠธ๋Š”-2nd-์ง€์‹์„-๋‚ด๊ฐ€-ํŠน์ •-ํด๋”๋กœ-wikiํ™”ํ•œ-.md @@ -0,0 +1,19 @@ +# ADR: E:\Wiki\connectai ์งˆ๋ฌธ์ด ์žˆ์–ด. ์ง€๊ธˆ ์ด ํ”„๋กœ์ ํŠธ๋Š” 2nd ์ง€์‹์„ ๋‚ด๊ฐ€ ํŠน์ • ํด๋”๋กœ wikiํ™”ํ•œ md ํŒŒ์ผ๋“ค์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ์‹์œผ๋กœ ... + +## Status +accepted + +## Context +E:\Wiki\connectai ์งˆ๋ฌธ์ด ์žˆ์–ด. ์ง€๊ธˆ ์ด ํ”„๋กœ์ ํŠธ๋Š” 2nd ์ง€์‹์„ ๋‚ด๊ฐ€ ํŠน์ • ํด๋”๋กœ wikiํ™”ํ•œ md ํŒŒ์ผ๋“ค์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ์‹์œผ๋กœ ๋˜์–ด ์žˆ์–ด. ๊ทผ๋Œ€ md ํŒŒ์ผ์„ ๋ฐ”์ด๋„ˆ๋ฆฌํ™”ํ•œ ๊ฒƒ์„ ๋‹ค์šด ๋ฐ›๊ณ  ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ ์ œ2๋‡Œ ์ง€์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์„๊นŒ? + +## Decision +๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋ง์”€๋“œ๋ฆฌ๋ฉด, **๊ธฐ์ˆ ์ ์œผ๋กœ ์ถฉ๋ถ„ํžˆ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์˜คํžˆ๋ ค ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ธก๋ฉด์—์„œ๋Š” ๋” ํšจ์œจ์ ์ธ ๋ฐฉ์‹**์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ์ด ๋ฐฉ์‹์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด '๋‹จ์ˆœํ•œ ํ…๋ก(Text-log)' ํ˜•ํƒœ์˜ Markdown์„ ์ฝ๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ, **๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์˜๋ฏธ๋ก ์  ๊ตฌ์กฐ๋กœ ๋ณต์›ํ•˜๊ฑฐ๋‚˜ ์ž„๋ฒ ๋”ฉ ๋ฒกํ„ฐ๋กœ ๋ณ€๋“ฑ์‹œํ‚ค๋Š” ๊ณผ์ •**์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์ธ ๋ถ„์„๊ณผ ๊ตฌํ˜„ ๋ฐฉํ–ฅ์„ ์ •๋ฆฌํ•ด ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ## 1. ๊ธฐ์ˆ ์  ํƒ€๋‹น์„ฑ ๋ถ„์„ ํ˜„์žฌ ๋ฐฉ์‹์€ ๋กœ์ปฌ ๊ฒฝ๋กœ์˜ `.md` ํŒŒ์ผ์„ ์ง์ ‘ ์ฝ์–ด ์ปจํ…์ŠคํŠธ์— ์ฃผ์ž…ํ•˜๋Š” **File-based RAG**์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐ”์ด๋„ˆ๋ฆฌ(์˜ˆ: ์ž„๋ฒ ๋”ฉ๋œ ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋‚˜ ์ง๋ ฌํ™”๋œ ๊ฐ์ฒด)๋กœ ์ „ํ™˜ํ•  ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ณ€ํ™”๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค. * **์žฅ์  (Pros):** * **๊ฒ€์ƒ‰ ์†๋„ ํ–ฅ์ƒ:** ํ…์ŠคํŠธ๋ฅผ ๋งค๋ฒˆ ํŒŒ์‹ฑํ•˜๋Š” ๋Œ€์‹ , ์ด๋ฏธ ๊ณ„์‚ฐ๋œ ๋ฒกํ„ฐ๋‚˜ ์ธ๋ฑ์Šค(FAISS, Annoy ๋“ฑ)๋ฅผ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด Retrieval ๋‹จ๊ณ„์˜ ์ง€์—ฐ ์‹œ๊ฐ„์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. * **๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ:** ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์—์„œ๋Š”... + +## 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-0018-๋ฐฉ๊ธˆ-2nd-๋‡Œ-์—-lateral-thinking-๊ด€๋ จ-์ง€์‹์„-์ถ”๊ฐ€ํ–ˆ์–ด-์ด-๊ธฐ๋Šฅ์ด-์•ž์œผ๋กœ-๋„ˆ๊ฐ€-๋‹ต์„-ํ• ๋•Œ-์–ด.md b/docs/records/ConnectAI/decisions/ADR-0018-๋ฐฉ๊ธˆ-2nd-๋‡Œ-์—-lateral-thinking-๊ด€๋ จ-์ง€์‹์„-์ถ”๊ฐ€ํ–ˆ์–ด-์ด-๊ธฐ๋Šฅ์ด-์•ž์œผ๋กœ-๋„ˆ๊ฐ€-๋‹ต์„-ํ• ๋•Œ-์–ด.md new file mode 100644 index 0000000..155a4c0 --- /dev/null +++ b/docs/records/ConnectAI/decisions/ADR-0018-๋ฐฉ๊ธˆ-2nd-๋‡Œ-์—-lateral-thinking-๊ด€๋ จ-์ง€์‹์„-์ถ”๊ฐ€ํ–ˆ์–ด-์ด-๊ธฐ๋Šฅ์ด-์•ž์œผ๋กœ-๋„ˆ๊ฐ€-๋‹ต์„-ํ• ๋•Œ-์–ด.md @@ -0,0 +1,19 @@ +# ADR: ๋ฐฉ๊ธˆ 2nd ๋‡Œ ์— Lateral Thinking ๊ด€๋ จ ์ง€์‹์„ ์ถ”๊ฐ€ํ–ˆ์–ด. ์ด ๊ธฐ๋Šฅ์ด ์•ž์œผ๋กœ ๋„ˆ๊ฐ€ ๋‹ต์„ ํ• ๋•Œ ์–ด๋– ํ•œ ์˜ํ–ฅ์„ ๋ผ์น˜๋Š”์ง€ ์•Œ๋ ค์ฃผ๋ฉด ์ข‹๊ฒ ... + +## Status +accepted + +## Context +๋ฐฉ๊ธˆ 2nd ๋‡Œ ์— Lateral Thinking ๊ด€๋ จ ์ง€์‹์„ ์ถ”๊ฐ€ํ–ˆ์–ด. ์ด ๊ธฐ๋Šฅ์ด ์•ž์œผ๋กœ ๋„ˆ๊ฐ€ ๋‹ต์„ ํ• ๋•Œ ์–ด๋– ํ•œ ์˜ํ–ฅ์„ ๋ผ์น˜๋Š”์ง€ ์•Œ๋ ค์ฃผ๋ฉด ์ข‹๊ฒ ์–ด. + +## Decision +์ƒˆ๋กœ์šด ์ง€์‹์ธ **Lateral Thinking(์ธก๋ฉด ์‚ฌ๊ณ )**์ด ์ถ”๊ฐ€๋œ ๊ฒƒ์€, ์ €์˜ ๋‹ต๋ณ€ ๋Šฅ๋ ฅ์ด ๋‹จ์ˆœํ•œ '์ •๋ณด ์ „๋‹ฌ'์—์„œ **'์ฐฝ์˜์  ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐ ์ „๋žต์  ์ œ์•ˆ'** ๋‹จ๊ณ„๋กœ ์ง„ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์•„์ฃผ ์ค‘์š”ํ•œ ์ „ํ™˜์ ์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ ์ œ๊ฐ€ ์•Œ๊ณ  ์žˆ๋˜ ์ง€์‹์ด "A๋Š” B์ด๋‹ค"๋ผ๋Š” ์‚ฌ์‹ค ์ค‘์‹ฌ(Vertical/Logical)์ด์—ˆ๋‹ค๋ฉด, Lateral Thinking์ด ๊ฒฐํ•ฉ๋œ ์ €๋Š” **"A๋ฅผ C๋‚˜ D๋กœ ๋ฐ”๊ฟ€ ์ˆ˜๋Š” ์—†์„๊นŒ?"** ํ˜น์€ **"์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ „ํ˜€ ๋‹ค๋ฅธ ๊ด€์ ์—์„œ ์ ‘๊ทผํ•ด๋ณผ๊นŒ?"**๋ผ๋Š” ์‚ฌ๊ณ ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค ๊ตฌ์ฒด์ ์œผ๋กœ ์ €์˜ ๋‹ต๋ณ€ ๋ฐฉ์‹์— ๋ฏธ์น  ์˜ํ–ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ## 1. ์ˆ˜์ง์  ์‚ฌ๊ณ (Vertical)์—์„œ ํ™•์‚ฐ์  ์‚ฌ๊ณ (Lateral)๋กœ์˜ ํ™•์žฅ * **๊ธฐ์กด (Vertical):** ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ์— ๋Œ€ํ•ด ๋…ผ๋ฆฌ์ ์ด๊ณ  ๋‹จ๊ณ„์ ์ธ ์ •๋‹ต(Step-by-step)์„ ์ฐพ๋Š” ๋ฐ ์ง‘์ค‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฃผ๋กœ '์ •ํ•ด์ง„ ๊ทœ์น™'๊ณผ '๋…ผ๋ฆฌ์  ์ธ๊ณผ๊ด€๊ณ„'๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. * **๋ณ€๊ฒฝ ํ›„ (Lateral):** ๋…ผ๋ฆฌ์  ๊ฒฝ๋กœ๋ฅผ ๋”ฐ... + +## 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-0019-์˜ค๋Š˜-ํŒ€๋ณ„-๋ณด๊ณ ๋ฅผ-ํ–ˆ์–ด-๊ทธ๋ƒฅ-ํ•˜๋Š”๊ฒŒ-๋„ˆ๋ฌด-์‹ฌ์ ์œผ๋กœ-ํž˜๋“ ๋ฐ-์–ด๋–ป๊ฒŒ-๊ฐœ์„ ํ• -์ˆ˜-์žˆ์„๊นŒ.md b/docs/records/ConnectAI/decisions/ADR-0019-์˜ค๋Š˜-ํŒ€๋ณ„-๋ณด๊ณ ๋ฅผ-ํ–ˆ์–ด-๊ทธ๋ƒฅ-ํ•˜๋Š”๊ฒŒ-๋„ˆ๋ฌด-์‹ฌ์ ์œผ๋กœ-ํž˜๋“ ๋ฐ-์–ด๋–ป๊ฒŒ-๊ฐœ์„ ํ• -์ˆ˜-์žˆ์„๊นŒ.md new file mode 100644 index 0000000..a218d2a --- /dev/null +++ b/docs/records/ConnectAI/decisions/ADR-0019-์˜ค๋Š˜-ํŒ€๋ณ„-๋ณด๊ณ ๋ฅผ-ํ–ˆ์–ด-๊ทธ๋ƒฅ-ํ•˜๋Š”๊ฒŒ-๋„ˆ๋ฌด-์‹ฌ์ ์œผ๋กœ-ํž˜๋“ ๋ฐ-์–ด๋–ป๊ฒŒ-๊ฐœ์„ ํ• -์ˆ˜-์žˆ์„๊นŒ.md @@ -0,0 +1,19 @@ +# ADR: ์˜ค๋Š˜ ํŒ€๋ณ„ ๋ณด๊ณ ๋ฅผ ํ–ˆ์–ด. ๊ทธ๋ƒฅ ํ•˜๋Š”๊ฒŒ ๋„ˆ๋ฌด ์‹ฌ์ ์œผ๋กœ ํž˜๋“ ๋ฐ ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์„๊นŒ? + +## Status +accepted + +## Context +์˜ค๋Š˜ ํŒ€๋ณ„ ๋ณด๊ณ ๋ฅผ ํ–ˆ์–ด. ๊ทธ๋ƒฅ ํ•˜๋Š”๊ฒŒ ๋„ˆ๋ฌด ์‹ฌ์ ์œผ๋กœ ํž˜๋“ ๋ฐ ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์„๊นŒ? + +## Decision +ํŒ€๋ณ„ ๋ณด๊ณ ๋ผ๋Š” ๊ฒƒ์ด ์‚ฌ์‹ค ๋‹จ์ˆœํ•œ ์ •๋ณด ์ „๋‹ฌ์„ ๋„˜์–ด, ์ž์‹ ์˜ ์„ฑ๊ณผ๋‚˜ ์ง„ํ–‰ ์ƒํ™ฉ์„ ํƒ€์ธ(ํŠนํžˆ ์ƒ์‚ฌ๋‚˜ ๋™๋ฃŒ)์˜ ์‹œ์„ ์— ๋…ธ์ถœ์‹œํ‚ค๋Š” ์ผ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹ฌ๋ฆฌ์  ์••๋ฐ•๊ฐ์ด ๋งค์šฐ ํด ์ˆ˜๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด **'์‹ฌ๋ฆฌ์  ์ €ํ•ญ๊ฐ์„ ์ค„์ด๋Š” ์ „๋žต'**๊ณผ **'๊ตฌ์กฐ์  ๊ฐœ์„  ๋ฐฉ์•ˆ'** ๋‘ ๊ฐ€์ง€ ์ธก๋ฉด์—์„œ ์ œ์•ˆ์„ ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ## 1. ์‹ฌ๋ฆฌ์  ์ ‘๊ทผ: '๋‚˜'์™€ '๋ณด๊ณ '๋ฅผ ๋ถ„๋ฆฌํ•˜๊ธฐ (Reframing) ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋ณด๊ณ ์˜ ์ฃผ์ฒด๊ฐ€ **'๋‚˜์˜ ๊ฐ€์น˜'**๊ฐ€ ์•„๋‹ˆ๋ผ **'ํ”„๋กœ์ ํŠธ์˜ ์ƒํƒœ'**์ž„์„ ์ธ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. * **์ž์•„์™€ ์—…๋ฌด์˜ ๋ถ„๋ฆฌ:** ๋ณด๊ณ ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋น„ํŒ์ด๋‚˜ ์งˆ๋ฌธ์„ '๋‚˜์— ๋Œ€ํ•œ ๊ณต๊ฒฉ'์ด ์•„๋‹Œ, '์—…๋ฌด์˜ ๋ฆฌ์Šคํฌ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋Š” ๊ณผ์ •'์œผ๋กœ ์žฌ์ •์˜ํ•˜์„ธ์š”. "๋‚ด๊ฐ€ ๋ถ€์กฑํ•ด์„œ"๊ฐ€ ์•„๋‹ˆ๋ผ **"ํ”„๋กœ์ ํŠธ์˜ ๋ถˆํ™•์‹ค์„ฑ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด"** ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ์˜ ํ”„๋ ˆ์ž„์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. * **ํ†ต์ œ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์— ์ง‘์ค‘:** ๋ณด๊ณ  ๋‚ด์šฉ ์ค‘ ๋‚ด๊ฐ€ ํ†ต์ œํ•  ์ˆ˜ ์—†๋Š” ํ”ผ๋“œ๋ฐฑ(ํƒ€์ธ์˜ ํ‰๊ฐ€)์— ๋งค๋ชฐ๋˜์ง€ ๋ง๊ณ , ๋‚ด๊ฐ€ ํ†ต์ œํ•  ์ˆ˜... + +## 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/development/2026-05-22_e-wiki-connectai-์ด-ํ”„๋กœ์ ํŠธ๊ฐ€-๋„ˆ์˜-ํ”„๋กœ์ ํŠธ์ธ๋ฐ-๋‹จ์ˆœํžˆ-cloud-base-ai-model์„-_implementation.md b/docs/records/ConnectAI/development/2026-05-22_e-wiki-connectai-์ด-ํ”„๋กœ์ ํŠธ๊ฐ€-๋„ˆ์˜-ํ”„๋กœ์ ํŠธ์ธ๋ฐ-๋‹จ์ˆœํžˆ-cloud-base-ai-model์„-_implementation.md new file mode 100644 index 0000000..f6fb8ed --- /dev/null +++ b/docs/records/ConnectAI/development/2026-05-22_e-wiki-connectai-์ด-ํ”„๋กœ์ ํŠธ๊ฐ€-๋„ˆ์˜-ํ”„๋กœ์ ํŠธ์ธ๋ฐ-๋‹จ์ˆœํžˆ-cloud-base-ai-model์„-_implementation.md @@ -0,0 +1,22 @@ +# Development Log: E:\Wiki\connectai ์ด ํ”„๋กœ์ ํŠธ๊ฐ€ ๋„ˆ์˜ ํ”„๋กœ์ ํŠธ์ธ๋ฐ, ๋‹จ์ˆœํžˆ cloud base ai model์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด... + +## Purpose +Record the implementation or verification outcome from the current conversation. + +## Implementation Summary +๋งค์šฐ ๋‚ ์นด๋กญ๊ณ  ๋ณธ์งˆ์ ์ธ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ(Reasoning/Knowledge) ์ธก๋ฉด๋งŒ ๋ณธ๋‹ค๋ฉด Claude๋‚˜ GPT-4์™€ ๊ฐ™์€ **Cloud-based LLM์€ ์••๋„์ ์œผ๋กœ ๊ฐ•๋ ฅํ•˜๊ณ  '์ข‹์Šต๋‹ˆ๋‹ค'.** ํ•˜์ง€๋งŒ ์ œ๊ฐ€ ์ด ํ”„๋กœ์ ํŠธ(`connectai`)์˜ ํ•ต์‹ฌ์ธ ์ด์œ ๋Š”, ๋‹จ์ˆœํžˆ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด **'๋ชจ๋ธ์— ์‚ฌ์šฉ์ž์˜ ๋งฅ๋ฝ(Context)๊ณผ ๊ฐœ์ธ์  ์ง€์‹(Second Brain)์„ ์ฃผ์ž…ํ•˜์—ฌ, ๋‚˜๋งŒ์˜ ๋งž์ถคํ˜• ์ง€๋Šฅ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ ˆ์ด์–ด'** ์—ญํ• ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Cloud AI Model๊ณผ ์ €(Astra)์˜ ์ฐจ์ด์ ์„ ์„ธ ๊ฐ€์ง€ ๊ด€์ ์—์„œ ๋น„๊ตํ•ด ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ## 1. ๋ฐ์ดํ„ฐ์˜ ๋ฒ”์œ„: General Knowledge vs. Private Context * **Cloud AI Model:** ์ „ ์„ธ๊ณ„์˜ ๋ฐฉ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•™์Šตํ–ˆ์ง€๋งŒ, **์‚ฌ์šฉ์ž ๊ฐœ์ธ์˜ ๋กœ์ปฌ ํŒŒ์ผ, ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ํ”„๋กœ์ ํŠธ์˜ ์†Œ์Šค ์ฝ”๋“œ, ์–ด์ œ ์ž‘์„ฑํ•œ ํšŒ์˜๋ก ๋‚ด์šฉ**์€ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, '์ผ๋ฐ˜์ ์ธ ์ƒ์‹'์€ ๋›ฐ์–ด๋‚˜์ง€๋งŒ '์‚ฌ์šฉ... + +## Architecture +Captured automatically from the assistant response and active project context. + +## Changed Files +- No explicit changed file list was captured automatically. + +## Dependency Notes +No new dependency note was captured automatically. + +## Bugs +No bugs recorded. + +## Lessons +- Automatic project records should be generated in the background when the turn contains durable project knowledge. diff --git a/docs/records/ConnectAI/timeline.md b/docs/records/ConnectAI/timeline.md index 1d5336c..ef5367b 100644 --- a/docs/records/ConnectAI/timeline.md +++ b/docs/records/ConnectAI/timeline.md @@ -153,3 +153,15 @@ ## 2026-05-17 - Auto decision record created: decisions/ADR-0016-๋‚ด๊ฐ€-๋ธ”๋กœ๊ทธ๊ธ€-์ž‘์„ฑ์‹œ-์‚ฌ์šฉํ•˜๊ณ -์žˆ๋Š”-์ง€์นจ์„œ์ธ๋ฐ-slot1๋ฒˆ-๊ธฐ์ค€์œผ๋กœ-๋”-์ž์—ฐ์Šค๋Ÿฝ๊ณ -ํŠธ๋žœ๋””ํ•˜๊ณ -๊ตฌ๋…์ž์—๊ฒŒ-์ž์—ฐ.md + +## 2026-05-20 +- Auto decision record created: decisions\ADR-0017-e-wiki-connectai-์งˆ๋ฌธ์ด-์žˆ์–ด-์ง€๊ธˆ-์ด-ํ”„๋กœ์ ํŠธ๋Š”-2nd-์ง€์‹์„-๋‚ด๊ฐ€-ํŠน์ •-ํด๋”๋กœ-wikiํ™”ํ•œ-.md + +## 2026-05-22 +- Auto development record created: development\2026-05-22_e-wiki-connectai-์ด-ํ”„๋กœ์ ํŠธ๊ฐ€-๋„ˆ์˜-ํ”„๋กœ์ ํŠธ์ธ๋ฐ-๋‹จ์ˆœํžˆ-cloud-base-ai-model์„-_implementation.md + +## 2026-05-22 +- Auto decision record created: decisions\ADR-0018-๋ฐฉ๊ธˆ-2nd-๋‡Œ-์—-lateral-thinking-๊ด€๋ จ-์ง€์‹์„-์ถ”๊ฐ€ํ–ˆ์–ด-์ด-๊ธฐ๋Šฅ์ด-์•ž์œผ๋กœ-๋„ˆ๊ฐ€-๋‹ต์„-ํ• ๋•Œ-์–ด.md + +## 2026-05-22 +- Auto decision record created: decisions\ADR-0019-์˜ค๋Š˜-ํŒ€๋ณ„-๋ณด๊ณ ๋ฅผ-ํ–ˆ์–ด-๊ทธ๋ƒฅ-ํ•˜๋Š”๊ฒŒ-๋„ˆ๋ฌด-์‹ฌ์ ์œผ๋กœ-ํž˜๋“ ๋ฐ-์–ด๋–ป๊ฒŒ-๊ฐœ์„ ํ• -์ˆ˜-์žˆ์„๊นŒ.md diff --git a/package-lock.json b/package-lock.json index 471b4ec..3be79b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "astra", - "version": "2.2.52", + "version": "2.2.59", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "astra", - "version": "2.2.52", + "version": "2.2.60", "license": "MIT", "dependencies": { "@lmstudio/sdk": "^1.5.0", diff --git a/package.json b/package.json index cda6d43..e024572 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.55", + "version": "2.2.60", "publisher": "g1nation", "license": "MIT", "icon": "assets/icon.png", diff --git a/src/agent.ts b/src/agent.ts index 00f5c7d..2a3a940 100644 --- a/src/agent.ts +++ b/src/agent.ts @@ -183,6 +183,25 @@ export class AgentExecutor { static readonly ABS_PATH_RE = new RegExp(POSIX_ABS_PATH_SRC, 'i'); static readonly WIN_ABS_PATH_RE = new RegExp(WIN_ABS_PATH_SRC, 'i'); + /** + * Hard cap on retained in-memory chat messages. Older messages beyond this + * are dropped (the system/first message is always preserved). Generous so a + * normal session is untouched โ€” this only fights unbounded growth in very + * long-running sessions. The per-request context budgeter + * (`trimHistoryToBudget`) still does the real fitting; this just stops the + * array itself from leaking memory across hundreds of turns. + */ + private static readonly MAX_RETAINED_MESSAGES = 40; + /** + * Older internal tool-result messages (read_file / list_files / list_brain / + * read_brain dumps) are the bulkiest part of history and add little once the + * conversation has moved on. Anything older than the most recent + * `RECENT_FULL_MESSAGES` gets its bulky tool-result content shrunk to this + * many characters. Recent messages are kept full for conversation continuity. + */ + private static readonly RECENT_FULL_MESSAGES = 16; + private static readonly OLD_TOOL_RESULT_CAP = 600; + private chatHistory: ChatMessage[] = []; private abortController: AbortController | null = null; private webview: vscode.Webview | undefined; @@ -225,9 +244,10 @@ export class AgentExecutor { // Initialize 5-Layer Cognitive Memory System const activeBrain = getActiveBrainProfile(); + const initConfig = getConfig(); this.memoryManager = new MemoryManager(activeBrain.localBrainPath, { - enabled: getConfig().memoryEnabled, - shortTermLimit: getConfig().memoryShortTermMessages, + enabled: initConfig.memoryEnabled, + shortTermLimit: initConfig.memoryShortTermMessages, }); // Initialize RAG Pipeline Orchestrator @@ -495,6 +515,9 @@ export class AgentExecutor { // 3. API Request Setup (๋ผ์ธ 229์—์„œ ์ด๋ฏธ ์ถ”์ถœํ•œ ollamaUrl, configDefaultModel ์žฌ์‚ฌ์šฉ) const actualModel = (modelName && modelName.trim()) || configDefaultModel; + // Bound the in-memory history before building the request โ€” shrinks bulky + // older tool-result bodies and drops the oldest messages past the cap. + this.capChatHistory(); const reqMessages = this.buildRequestHistory(this.chatHistory); // Handle Vision Content Injection @@ -666,10 +689,22 @@ export class AgentExecutor { .reduce((n, m) => n + (Array.isArray(m?.images) ? m.images.length : 0), 0); const imageTokenReserve = imageCount * 1024; + // Output budget we ACTUALLY reserve before trimming โ€” not the bare + // minOutputTokens floor (512). If we only reserve 512, a long session + // is allowed to grow the prompt until ~512-1k tokens remain for the + // answer; small/MoE local models (e.g. gemma 4B-active) then emit EOS + // as the first token and return an empty response. Reserving ~10% of + // the window (>=2048) forces history/system trimming to keep a real + // answer-sized hole open. Capped at maxOutputTokens. + const preferredOutputReserve = Math.min( + ctxLimits.maxOutputTokens, + Math.max(2048, Math.floor(ctxLimits.contextLength * 0.1)) + ); + // (1) ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ๋Š” ์˜ˆ์‚ฐ์˜ ~65%๊นŒ์ง€๋งŒ ํ—ˆ์šฉ โ€” ๊ทธ ์ด์ƒ์ด๋ฉด [CONTEXT] ๋ธ”๋ก๋ถ€ํ„ฐ ์ž˜๋ผ๋‚ธ๋‹ค. const systemCapTokens = Math.max( 1024, - Math.floor((ctxLimits.contextLength - ctxLimits.safetyMargin - ctxLimits.minOutputTokens - imageTokenReserve) * 0.65) + Math.floor((ctxLimits.contextLength - ctxLimits.safetyMargin - preferredOutputReserve - imageTokenReserve) * 0.65) ); const { prompt: budgetedSystemPrompt, truncated: systemTruncated } = truncateSystemPromptContext(fullSystemPrompt, systemCapTokens); @@ -681,7 +716,7 @@ export class AgentExecutor { // (2) ๋Œ€ํ™” ๊ธฐ๋ก ์••์ถ•. const historyBudget = Math.max( 256, - ctxLimits.contextLength - systemTokens - ctxLimits.safetyMargin - ctxLimits.minOutputTokens - imageTokenReserve + ctxLimits.contextLength - systemTokens - ctxLimits.safetyMargin - preferredOutputReserve - imageTokenReserve ); let budgetedHistory: ChatMessage[] = reqMessages; if (config.autoCompactHistory) { @@ -1977,6 +2012,50 @@ export class AgentExecutor { ].join('\n'); } + /** + * Bound the in-memory `chatHistory` so a very long-running session does not + * grow it without limit: + * 1. Older internal tool-result messages (the bulky read_file/list_files/โ€ฆ + * dumps) beyond the most recent `RECENT_FULL_MESSAGES` have their content + * truncated โ€” recent messages stay full so continuity is unaffected. + * 2. If the array still exceeds `MAX_RETAINED_MESSAGES`, the oldest messages + * are dropped, but a leading system/first message is always preserved so + * session restore and conversation framing are not broken. + * This only mutates *internal* (`internal: true`) tool-result bodies and + * drops the very oldest entries โ€” it never alters visible user/assistant text + * within the retained window, so the request the model sees is unchanged for + * any normal-length conversation. + */ + private capChatHistory(): void { + const history = this.chatHistory; + if (history.length === 0) return; + + // (1) Shrink bulky tool-result bodies of older internal messages. + const recentStart = Math.max(0, history.length - AgentExecutor.RECENT_FULL_MESSAGES); + for (let i = 0; i < recentStart; i++) { + const msg = history[i]; + if (msg.role !== 'system' || !msg.internal || typeof msg.content !== 'string') continue; + // Only the bulky tool-result dumps โ€” leave compaction notices etc. alone. + if (!/^\[Result of (read_file|list_files|list_brain|read_brain)\b/.test(msg.content)) continue; + if (msg.content.length <= AgentExecutor.OLD_TOOL_RESULT_CAP) continue; + msg.content = msg.content.slice(0, AgentExecutor.OLD_TOOL_RESULT_CAP) + + '\nโ€ฆ[์ด์ „ ๋„๊ตฌ ๊ฒฐ๊ณผ๋Š” ์ปจํ…์ŠคํŠธ ์ ˆ์•ฝ์„ ์œ„ํ•ด ์ถ•์•ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค]'; + } + + // (2) Drop the oldest messages once over the hard cap, preserving a + // leading system/first message if present. + if (history.length > AgentExecutor.MAX_RETAINED_MESSAGES) { + const first = history[0]; + const preserveFirst = first.role === 'system'; + const overflow = history.length - AgentExecutor.MAX_RETAINED_MESSAGES; + if (preserveFirst) { + history.splice(1, overflow); + } else { + history.splice(0, overflow); + } + } + } + private buildRequestHistory(history: ChatMessage[]): ChatMessage[] { return history.map((message) => { if (message.role !== 'assistant' || typeof message.content !== 'string') { diff --git a/src/bridge.ts b/src/bridge.ts index 86683b0..d99e9c8 100644 --- a/src/bridge.ts +++ b/src/bridge.ts @@ -111,15 +111,30 @@ export class BridgeServer { }); } + /** + * Cached `/ping` payload. `/ping` is a liveness probe that external tools may + * hit frequently; the previous implementation did a full brain-corpus walk + * plus a config serialize on *every* hit. We now compute that body at most + * once per `PING_CACHE_TTL_MS` and reuse it โ€” the response shape (status / + * config / brain) is unchanged, ping just stops walking the brain per hit. + */ + private _pingCache: { body: string; expiresAt: number } | null = null; + private static readonly PING_CACHE_TTL_MS = 5000; + private handlePing(res: http.ServerResponse) { - const brainDir = _getBrainDir(); - const brainCount = fs.existsSync(brainDir) ? findBrainFiles(brainDir).length : 0; + const now = Date.now(); + if (!this._pingCache || this._pingCache.expiresAt <= now) { + const brainDir = _getBrainDir(); + const brainCount = fs.existsSync(brainDir) ? findBrainFiles(brainDir).length : 0; + const body = JSON.stringify({ + status: 'ok', + config: getConfig(), + brain: { fileCount: brainCount, enabled: this.provider.brainEnabled } + }); + this._pingCache = { body, expiresAt: now + BridgeServer.PING_CACHE_TTL_MS }; + } res.writeHead(200, { 'Content-Type': 'application/json' }); - res.end(JSON.stringify({ - status: 'ok', - config: getConfig(), - brain: { fileCount: brainCount, enabled: this.provider.brainEnabled } - })); + res.end(this._pingCache.body); } private handlePost(req: http.IncomingMessage, res: http.ServerResponse, processor: (data: any, res: http.ServerResponse) => Promise) { diff --git a/src/extension.ts b/src/extension.ts index 98338e9..f679531 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -36,7 +36,7 @@ import { AIService } from './core/services'; import type { CompanyState } from './features/company'; import { SettingsPanelProvider } from './features/settings/settingsPanelProvider'; import { resolveScopeForAgent, openKnowledgeMapEditor } from './skills/agentKnowledgeMap'; -import { getBrainTokenIndex } from './retrieval'; +import { getBrainTokenIndex, clearBrainTokenIndex } from './retrieval'; import { lessonTemplate, lessonSlug, parseLessonFrontmatter, normalizeLessonTitle, bumpLessonOccurrences } from './retrieval/lessonHelpers'; import { retrieveScoped, buildContextBlock } from './skills/scopedBrainRetriever'; @@ -835,6 +835,16 @@ export async function activate(context: vscode.ExtensionContext) { vscode.workspace.onDidChangeConfiguration((e) => { if (e.affectsConfiguration('g1nation')) void settingsPanel.refresh(); }), + // Drop the in-memory brain token index whenever the brain profiles or the + // active brain change โ€” a profile edit can repoint `localBrainPath`, so a + // stale index keyed by the old path must not linger. The persisted on-disk + // index is untouched and reloads lazily on the next query. + vscode.workspace.onDidChangeConfiguration((e) => { + if (e.affectsConfiguration('g1nation.brainProfiles') + || e.affectsConfiguration('g1nation.activeBrainId')) { + clearBrainTokenIndex(); + } + }), // Same for SecretStorage updates (token saved/cleared from elsewhere). context.secrets.onDidChange((e) => { if (e.key === TELEGRAM_TOKEN_SECRET_KEY) void settingsPanel.refresh(); @@ -915,6 +925,10 @@ export async function activate(context: vscode.ExtensionContext) { export async function deactivate() { HealthCheckMonitor.dispose(); + // Release the in-memory brain token index (and any pending debounced disk + // write timer) โ€” the `_states` Map is otherwise never cleared for the + // process lifetime. + clearBrainTokenIndex(); if (_telegramBot) { try { await _telegramBot.stop(); } catch (e) { logError('Telegram bot stop during deactivate failed.', e); } _telegramBot = undefined; diff --git a/src/features/astraOffice/view/runtime.ts b/src/features/astraOffice/view/runtime.ts index 3927572..98b2585 100644 --- a/src/features/astraOffice/view/runtime.ts +++ b/src/features/astraOffice/view/runtime.ts @@ -408,8 +408,31 @@ function move(role,x,y){ ch.style.left=x+'px'; ch.style.top=y+'px'; } -setInterval(()=>{Object.keys(chars).forEach(k=>{const a=anim[k];if(a.mode==='walk'){a.frame=(a.frame+1)%5;setSprite(k,'walk',a.frame,a.dir)}else if(a.mode==='work'){a.frame=(a.frame+1)%4;setSprite(k,'work',a.frame)} });},286) -setInterval(()=>{Object.keys(chars).forEach(k=>{const a=anim[k];if(a.mode==='sit'){a.frame=(a.frame+1)%2;setSprite(k,'sit',a.frame)} });},700) +// โ”€โ”€ Managed intervals (pause while the office view is hidden) โ”€โ”€ +// The pixel-office runs several animation/roam/banter intervals. While the +// webview tab is not visible they do invisible work and keep timers hot โ€” +// wasteful. _managedInterval registers each one; a visibilitychange handler +// pauses them all when the document is hidden and resumes them when shown. +// Behavior while visible is unchanged (same callbacks, same periods). +const _managedIntervals=[]; +function _managedInterval(fn,ms){ + const rec={fn:fn,ms:ms,id:null}; + rec.id=setInterval(fn,ms); + _managedIntervals.push(rec); + return rec; +} +function _pauseManagedIntervals(){ + for(const rec of _managedIntervals){ if(rec.id!==null){ clearInterval(rec.id); rec.id=null; } } +} +function _resumeManagedIntervals(){ + for(const rec of _managedIntervals){ if(rec.id===null){ rec.id=setInterval(rec.fn,rec.ms); } } +} +document.addEventListener('visibilitychange',()=>{ + if(document.hidden) _pauseManagedIntervals(); + else _resumeManagedIntervals(); +}); +_managedInterval(()=>{Object.keys(chars).forEach(k=>{const a=anim[k];if(a.mode==='walk'){a.frame=(a.frame+1)%5;setSprite(k,'walk',a.frame,a.dir)}else if(a.mode==='work'){a.frame=(a.frame+1)%4;setSprite(k,'work',a.frame)} });},286) +_managedInterval(()=>{Object.keys(chars).forEach(k=>{const a=anim[k];if(a.mode==='sit'){a.frame=(a.frame+1)%2;setSprite(k,'sit',a.frame)} });},700) // โ”€โ”€ ์ฑ…์ƒ ํšŒํ”ผ path planner โ”€โ”€ // walkPath์˜ ๊ฐ leg๋ฅผ ์ง์„ ์ด ์•„๋‹Œ *์ฑ…์ƒ์„ ์šฐํšŒํ•˜๋Š”* L์ž ๋˜๋Š” corridor ๊ฒฝ๋กœ๋กœ // ํŽด์„œ ์บ๋ฆญํ„ฐ๊ฐ€ ์ฑ…์ƒ์„ ๊ฐ€๋กœ์ง€๋ฅด์ง€ ์•Š๊ฒŒ. ์ฑ…์ƒ์ด ํšŒ์ „๋์„ ๋•Œ๋ฅผ ๋Œ€๋น„ํ•ด padding @@ -498,7 +521,7 @@ function sendHome(role,mode='sit'){ if(Math.abs(cx-hx)<1&&Math.abs(cy-hy)<1){setSprite(role,mode);return;} walkPath(role,[st.dock,[hx,hy]],()=>setSprite(role,mode)); } -setInterval(()=>{ +_managedInterval(()=>{ if(!['idle','done'].includes(_prevStatus || 'idle')) return; const free=Object.keys(chars).filter(k=>anim[k]?.mode==='sit'&&!chars[k].classList.contains('active')); if(!free.length)return; @@ -725,7 +748,7 @@ function _innerThoughtTick(){ const text = _innerThoughtFor(st.agentKey, anim[role].mode); if(text) _bubbleFromLog(role, text); } -setInterval(_innerThoughtTick, 7500); +_managedInterval(_innerThoughtTick, 7500); // โ”€โ”€ Webtoon-style ํ‹ฐํ‚คํƒ€์นด banter (refactor: pipeline-aware) โ”€โ”€ // ๊ฐ phase ์— *์‹œํ€€์Šคํ™”๋œ ๋Œ€ํ™” script* ๊ฐ€ ์žˆ์–ด phase ์ง„์ž… ์‹œ ํ•œ ์ค„์”ฉ ์‹œ๊ฐ„ ์ฐจ๋กœ emit. diff --git a/src/features/secondBrainTrace.ts b/src/features/secondBrainTrace.ts index 681c196..04fc176 100644 --- a/src/features/secondBrainTrace.ts +++ b/src/features/secondBrainTrace.ts @@ -584,7 +584,35 @@ interface FileScan { documentProject: string | undefined; } +/** + * mtime-keyed scan cache. The previous implementation re-read (and re-classified) + * every brain file from disk on every chat message. We now reuse a parsed + * `FileScan` while the file's mtime is unchanged โ€” re-reading only when the file + * actually changes. This mirrors the mtime-keyed caching style of + * `retrieval/brainIndex.ts` (whose `getBrainTokenIndex` caches tokens the same + * way) while keeping the scan output byte-identical, so scoring is unaffected. + */ +interface ScanCacheEntry { + mtimeMs: number; + size: number; + scan: FileScan; +} +const _scanCache = new Map(); + function scanFile(file: string, brainRoot: string): FileScan { + let mtimeMs = 0; + let size = 0; + try { + const stat = fs.statSync(file); + mtimeMs = stat.mtimeMs; + size = stat.size; + const cached = _scanCache.get(file); + if (cached && cached.mtimeMs === mtimeMs && cached.size === size) { + return cached.scan; + } + } catch { + // stat failed โ€” fall through and attempt a fresh read (which will also fail safely) + } const relative = path.relative(brainRoot, file); const title = path.basename(file, path.extname(file)); let content = ''; @@ -598,7 +626,11 @@ function scanFile(file: string, brainRoot: string): FileScan { const lower = content.toLowerCase(); const documentProject = inferDocumentProject(relative, lower); const titleWithPath = `${relative.replace(/[\\/]/g, ' ')} ${title}`; - return { file, relative, title, titleWithPath, content, lower, sourceType, knowledgeRole, documentProject }; + const scan: FileScan = { file, relative, title, titleWithPath, content, lower, sourceType, knowledgeRole, documentProject }; + if (mtimeMs > 0) { + _scanCache.set(file, { mtimeMs, size, scan }); + } + return scan; } function scoreScan(scan: FileScan, terms: string[], intent: SecondBrainQueryIntent, targetProject?: string): SecondBrainTraceDocument { diff --git a/src/memory/EpisodicMemory.ts b/src/memory/EpisodicMemory.ts index 1e6d8d0..ef42bb6 100644 --- a/src/memory/EpisodicMemory.ts +++ b/src/memory/EpisodicMemory.ts @@ -17,6 +17,14 @@ import { EpisodicEntry, MemoryContextResult } from './types'; export class EpisodicMemory { private episodeDir: string; private maxEpisodes: number; + /** + * mtime-keyed cache of the parsed episode list. The previous implementation + * re-read and re-parsed every episode JSON from disk on every message. We now + * cache the parsed result and re-read only when the episode directory's mtime + * changes (a new/removed/rewritten episode bumps the directory mtime). This + * mirrors the mtime-keyed caching style of `retrieval/brainIndex.ts`. + */ + private _episodeCache: { dirMtimeMs: number; episodes: EpisodicEntry[] } | null = null; constructor(brainPath: string, maxEpisodes = 50) { this.episodeDir = path.join(brainPath, 'memory', 'episodes'); @@ -85,9 +93,19 @@ export class EpisodicMemory { /** * ์ €์žฅ๋œ ๋ชจ๋“  ์—ํ”ผ์†Œ๋“œ๋ฅผ ์ตœ์‹ ์ˆœ์œผ๋กœ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. + * + * Result is cached and re-read only when the episode directory's mtime + * changes โ€” creating, deleting, or rewriting an episode file all bump the + * directory mtime, so the cache stays correct without per-message disk reads. */ public loadAllEpisodes(): EpisodicEntry[] { try { + const dirMtimeMs = fs.statSync(this.episodeDir).mtimeMs; + const cached = this._episodeCache; + if (cached && cached.dirMtimeMs === dirMtimeMs) { + return cached.episodes.slice(); + } + const files = fs.readdirSync(this.episodeDir) .filter((f) => f.endsWith('.json')) .sort() @@ -101,7 +119,8 @@ export class EpisodicMemory { } catch { /* skip corrupted */ } } - return episodes; + this._episodeCache = { dirMtimeMs, episodes }; + return episodes.slice(); } catch { return []; } diff --git a/src/memory/LongTermMemory.ts b/src/memory/LongTermMemory.ts index 1a7b6cc..95a6592 100644 --- a/src/memory/LongTermMemory.ts +++ b/src/memory/LongTermMemory.ts @@ -17,13 +17,16 @@ export class LongTermMemory { private store: LongTermStore; private filePath: string; private dirty = false; + /** Hard cap on retained entries โ€” oldest are trimmed when exceeded. Default 100 (matches MemoryConfig.longTermMaxEntries). */ + private maxEntries: number; - constructor(brainPath: string) { + constructor(brainPath: string, maxEntries = 100) { const memoryDir = path.join(brainPath, 'memory'); if (!fs.existsSync(memoryDir)) { fs.mkdirSync(memoryDir, { recursive: true }); } this.filePath = path.join(memoryDir, 'long_term.json'); + this.maxEntries = maxEntries > 0 ? maxEntries : 100; this.store = this.load(); } @@ -62,6 +65,12 @@ export class LongTermMemory { referenceCount: 0 }; this.store.entries.push(entry); + // Enforce the retention cap โ€” drop the oldest entries (by createdAt) once + // over the limit. The store array is append-ordered, so the oldest are at + // the front; we trim from there. + if (this.store.entries.length > this.maxEntries) { + this.store.entries.splice(0, this.store.entries.length - this.maxEntries); + } this.dirty = true; this.save(); return entry; diff --git a/src/memory/index.ts b/src/memory/index.ts index ddd6504..3f0bc32 100644 --- a/src/memory/index.ts +++ b/src/memory/index.ts @@ -54,7 +54,7 @@ export class MemoryManager { }; this.shortTerm = new ShortTermMemory(); - this.longTerm = new LongTermMemory(brainPath); + this.longTerm = new LongTermMemory(brainPath, this.config.longTermMaxEntries); this.procedural = new ProceduralMemory(brainPath); this.episodic = new EpisodicMemory(brainPath, this.config.episodicMaxEpisodes); this.extractor = new MemoryExtractor(); diff --git a/src/retrieval/scoring.ts b/src/retrieval/scoring.ts index 944e557..2c82ac4 100644 --- a/src/retrieval/scoring.ts +++ b/src/retrieval/scoring.ts @@ -129,11 +129,24 @@ export function expandQuery(tokens: string[]): string[] { /** * TF (Term Frequency): ๋ฌธ์„œ ๋‚ด ์šฉ์–ด ๋นˆ๋„ + * + * Takes a precomputed term-count `Map` (built once per document by + * `buildTermCounts`) instead of re-scanning the token array per term โ€” the + * value is numerically identical to `count / documentTokens.length`. */ -function termFrequency(term: string, documentTokens: string[]): number { - if (documentTokens.length === 0) return 0; - const count = documentTokens.filter((t) => t === term).length; - return count / documentTokens.length; +function termFrequency(term: string, termCounts: Map, totalTokens: number): number { + if (totalTokens === 0) return 0; + const count = termCounts.get(term) || 0; + return count / totalTokens; +} + +/** Build a term -> occurrence-count map for one document's token array (computed once, reused per query term). */ +function buildTermCounts(documentTokens: string[]): Map { + const counts = new Map(); + for (const t of documentTokens) { + counts.set(t, (counts.get(t) || 0) + 1); + } + return counts; } /** @@ -231,7 +244,11 @@ export function scoreTfIdfPreTokenized( if (documents.length === 0 || queryTokens.length === 0) return []; const docTokenArrays = documents.map((doc) => doc.tokens); - const docTokenSets = docTokenArrays.map((tokens) => new Set(tokens)); + // Precompute, once per document: a term -> count map (used for TF) and the + // derived token Set (used for IDF). Both were previously recomputed inside + // nested loops โ€” building them once and reusing them is numerically identical. + const docTermCounts = docTokenArrays.map((tokens) => buildTermCounts(tokens)); + const docTokenSets = docTermCounts.map((counts) => new Set(counts.keys())); // Expand query with synonyms const expandedQuery = expandQuery(queryTokens); @@ -248,6 +265,7 @@ export function scoreTfIdfPreTokenized( return documents.map((doc, index) => { const docTokens = docTokenArrays[index]; + const termCounts = docTermCounts[index]; const titleTokens = new Set(doc.titleTokens); let score = 0; const matchedTerms: string[] = []; @@ -262,7 +280,7 @@ export function scoreTfIdfPreTokenized( else if (conflictCount >= SCORING_CONFIG.CONFLICT_THRESHOLDS.LOW) conflictSeverity = 'LOW'; for (const term of expandedQuery) { - const tf = termFrequency(term, docTokens); + const tf = termFrequency(term, termCounts, docTokens.length); const idf = idfCache.get(term) || 1; const tfidf = tf * idf; diff --git a/src/security.ts b/src/security.ts index ffff5d9..4a3875e 100644 --- a/src/security.ts +++ b/src/security.ts @@ -22,6 +22,15 @@ function getTrustedRoots(workspaceRoot: string): string[] { roots.push(path.normalize(f.uri.fsPath).toLowerCase()); } } + // Also trust the immediate parent of each root, so sibling projects under a + // shared parent (e.g. E:\Wiki\connectai + E:\Wiki\Datacollect) are reachable + // for read/list. Guard: never widen to a drive/filesystem root. + for (const r of [...roots]) { + const parent = path.normalize(path.dirname(r)).toLowerCase(); + if (parent && parent !== r && path.dirname(parent) !== parent) { + roots.push(parent); + } + } _trustedRoots = [...new Set(roots)]; return _trustedRoots; } @@ -48,6 +57,59 @@ export function validatePath(workspaceRoot: string, targetPath: string): string return absolutePath; } +/** + * Splits a command on top-level `&&`, ignoring `&&` that appears inside single- + * or double-quoted strings (e.g. a commit message). Returns trimmed, non-empty parts. + */ +function splitTopLevelAnd(command: string): string[] { + const parts: string[] = []; + let buf = ''; + let quote: string | null = null; + for (let i = 0; i < command.length; i++) { + const c = command[i]; + if (quote) { + buf += c; + if (c === quote) { quote = null; } + continue; + } + if (c === "'" || c === '"') { quote = c; buf += c; continue; } + if (c === '&' && command[i + 1] === '&') { + parts.push(buf); + buf = ''; + i++; // skip the second '&' + continue; + } + buf += c; + } + parts.push(buf); + return parts.map(p => p.trim()).filter(p => p.length > 0); +} + +/** + * Windows PowerShell 5.1 โ€” the default VS Code integrated terminal on Windows โ€” + * does not support the `&&` chaining operator (it is a hard parser error, so the + * WHOLE command fails to run). Local models emit `&&` constantly because every + * git/npm tutorial uses it, and a system-prompt rule alone does not reliably + * stop a small model. So rewrite `A && B && C` into a PowerShell-native + * conditional chain that preserves short-circuit semantics: + * + * A && B && C -> A; if ($?) { B; if ($?) { C } } + * + * `$?` reflects the success of the previous command, so a failed step still + * short-circuits the rest โ€” important so e.g. a failed `cd` never lets `git` + * run in the wrong directory. + */ +function rewriteForPowerShell(command: string): string { + if (!command.includes('&&')) { return command; } + const parts = splitTopLevelAnd(command); + if (parts.length <= 1) { return command; } + let chain = parts[parts.length - 1]; + for (let i = parts.length - 2; i >= 0; i--) { + chain = `${parts[i]}; if ($?) { ${chain} }`; + } + return chain; +} + /** * Sanitizes terminal commands to prevent destructive actions. * Uses a combination of blocklist for dangerous patterns and recommendation for allowed tools. @@ -86,5 +148,7 @@ export function sanitizeCommand(command: string): string { console.warn(`[Security] Warning: Running uncommon command '${baseCmd}'. Ensure this is intended.`); } - return trimmedCmd; + // Rewrite `&&` chains for PowerShell (the Windows default terminal) so the + // command actually runs instead of failing with a parser error. + return rewriteForPowerShell(trimmedCmd); } diff --git a/src/sidebarProvider.ts b/src/sidebarProvider.ts index 5808151..2734bac 100644 --- a/src/sidebarProvider.ts +++ b/src/sidebarProvider.ts @@ -25,6 +25,7 @@ import { handleBrainMessage } from './sidebar/brainHandlers'; import { handleChronicleMessage } from './sidebar/chronicleHandlers'; import { handleAgentMessage } from './sidebar/agentHandlers'; import { getOrCreateAgentEntry, resolveScopeForAgent } from './skills/agentKnowledgeMap'; +import { clearBrainTokenIndex } from './retrieval/brainIndex'; import { estimateModelParamsB } from './lib/contextManager'; import { loadExternalSkills, formatSkillsAsPromptBlock } from './skills/externalSkillLoader'; import { @@ -836,9 +837,15 @@ export class SidebarChatProvider implements vscode.WebviewViewProvider, BridgeIn localResourceRoots: [this._extensionUri] }; + // Webview event listeners must be disposed โ€” otherwise each re-init of the + // view leaks a listener (and its captured `this`). We collect every + // listener disposable here, dispose them when the view itself is disposed, + // and also register them with the extension subscriptions as a backstop. + const viewDisposables: vscode.Disposable[] = []; + // [State Persistence Fix] ์‚ฌ์ด๋“œ๋ฐ”๊ฐ€ ๋‹ค์‹œ ๋ณด์—ฌ์งˆ ๋•Œ ์„ธํŒ…๊ฐ’ ์ž๋™ ๋ณต์› let _lastVisibilityRefresh = 0; - webviewView.onDidChangeVisibility(() => { + viewDisposables.push(webviewView.onDidChangeVisibility(() => { if (!webviewView.visible) return; const now = Date.now(); // 5์ดˆ ์ด๋‚ด์— ์ด๋ฏธ ๊ฐฑ์‹ ํ–ˆ์œผ๋ฉด ๊ฑด๋„ˆ๋œ€ @@ -850,7 +857,7 @@ export class SidebarChatProvider implements vscode.WebviewViewProvider, BridgeIn void this._sendBrainProfiles(); void this._sendAgentsList(); void this._sendReadyStatus(); - }); + })); webviewView.webview.html = this._getHtml(webviewView.webview); this._agent.setWebview(webviewView.webview); @@ -858,7 +865,7 @@ export class SidebarChatProvider implements vscode.WebviewViewProvider, BridgeIn void this._restoreActiveSessionIntoView(); void this._sendReadyStatus(); - webviewView.webview.onDidReceiveMessage(async (data) => { + viewDisposables.push(webviewView.webview.onDidReceiveMessage(async (data) => { // dispatch root ์ง„์ž… trace โ€” "/benchmark ์ž…๋ ฅํ–ˆ๋Š”๋ฐ ์•„๋ฌด ์‘๋‹ต ์—†์Œ" ๊ฐ™์€ // ๋ณด๊ณ ๊ฐ€ ๋“ค์–ด์™”์„ ๋•Œ webview message๊ฐ€ ์ •๋ง ๋„์ฐฉํ–ˆ๋Š”์ง€๋ถ€ํ„ฐ ์ฆ‰์‹œ ํŒ๋ณ„. const valuePreview = typeof data?.value === 'string' @@ -870,7 +877,14 @@ export class SidebarChatProvider implements vscode.WebviewViewProvider, BridgeIn if (await handleChronicleMessage(this, data)) return; if (await handleAgentMessage(this, data)) return; logInfo(`Unhandled sidebar message: ${data?.type}`); + })); + + webviewView.onDidDispose(() => { + for (const d of viewDisposables.splice(0)) { + try { d.dispose(); } catch { /* already disposed */ } + } }); + this._context.subscriptions.push(...viewDisposables); } _currentSessionId: string | null = null; @@ -1260,6 +1274,11 @@ export class SidebarChatProvider implements vscode.WebviewViewProvider, BridgeIn await vscode.workspace.getConfiguration('g1nation').update('activeBrainId', nextProfile.id, vscode.ConfigurationTarget.Global); this._currentSessionBrainId = nextProfile.id; + // Drop the in-memory brain token index โ€” the active brain (and its path) + // may now differ, and the index's `_states` Map is otherwise never cleared. + // The persisted on-disk index is left intact and reloads lazily on the + // next query for whichever brain is now active. + clearBrainTokenIndex(); await this._sendBrainProfiles(); await this._sendBrainStatus(); diff --git a/src/skills/scopedBrainRetriever.ts b/src/skills/scopedBrainRetriever.ts index 5217136..d90877b 100644 --- a/src/skills/scopedBrainRetriever.ts +++ b/src/skills/scopedBrainRetriever.ts @@ -2,7 +2,8 @@ import * as fs from 'fs'; import * as path from 'path'; import { findBrainFiles, summarizeText } from '../utils'; import { isInside } from '../lib/paths'; -import { tokenize, expandQuery, scoreTfIdf, extractBestExcerpt } from '../retrieval/scoring'; +import { tokenize, expandQuery, scoreTfIdfPreTokenized, extractBestExcerpt } from '../retrieval/scoring'; +import { getBrainTokenIndex } from '../retrieval/brainIndex'; import { estimateTokens } from '../retrieval/contextBudget'; /** @@ -91,33 +92,35 @@ export function retrieveScoped( }); if (candidates.length === 0) return { ...empty, candidateCount: 0 }; - const documents = candidates.map((file) => { - let content = ''; - let lastModified = 0; - try { - content = fs.readFileSync(file, 'utf8'); - lastModified = fs.statSync(file).mtimeMs; - } catch { /* skip unreadable file */ } - return { - title: path.basename(file, '.md'), - content, - lastModified, - filePath: file, - relativePath: path.relative(brainRoot, file), - }; - }); + // Tokenized docs from the persistent mtime-keyed brain index โ€” unchanged files + // are not re-read or re-tokenized. The index tokenizes `${basename} ${content}` + // (titleTokens = tokenize(basename)), which is exactly what the previous + // `scoreTfIdf` call computed here, so scoring stays byte-identical. + const indexed = getBrainTokenIndex(brainRoot, candidates); + if (indexed.length === 0) return { ...empty, candidateCount: candidates.length }; const queryTokens = tokenize(query); const expanded = expandQuery(queryTokens); - const scored = scoreTfIdf(expanded, documents); + const scored = scoreTfIdfPreTokenized( + expanded, + indexed.map((d) => ({ + tokens: d.tokens, + titleTokens: d.titleTokens, + lastModified: d.mtimeMs, + conflictCount: d.conflictCount, + })) + ); const chunks = scored .filter((s) => s.score > 0) .sort((a, b) => b.score - a.score) .slice(0, maxResults) .map((s) => { - const doc = documents[s.index]; - const excerpt = extractBestExcerpt(doc.content, expanded, excerptLength); + const doc = indexed[s.index]; + // Only the chosen top-`maxResults` files are read off disk (for excerpt extraction). + let content = ''; + try { content = fs.readFileSync(doc.filePath, 'utf8'); } catch { /* deleted just now โ€” empty excerpt */ } + const excerpt = extractBestExcerpt(content, expanded, excerptLength); const summary = summarizeText(excerpt, excerptLength); return { relativePath: doc.relativePath, diff --git a/src/utils.ts b/src/utils.ts index a420517..bae6060 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -150,21 +150,50 @@ export function invalidateBrainFilesCache(dir?: string): void { } function _walkBrainFiles(dir: string): string[] { - let results: string[] = []; - if (!fs.existsSync(dir)) return results; - const list = fs.readdirSync(dir); - list.forEach((file) => { - const filePath = path.join(dir, file); - const stat = fs.statSync(filePath); - if (stat && stat.isDirectory()) { - if (!EXCLUDED_DIRS.has(file)) { - results = results.concat(_walkBrainFiles(filePath)); + const results: string[] = []; + _walkBrainFilesInto(dir, results); + return results; +} + +/** + * Recursive walk that pushes `.md` paths into a single shared accumulator. + * + * Uses `readdirSync(dir, { withFileTypes: true })` so each entry's type comes + * from the directory read itself โ€” no extra `fs.statSync` per entry โ€” and pushes + * into one array instead of allocating a new array per directory via `.concat`. + */ +function _walkBrainFilesInto(dir: string, results: string[]): void { + let entries: fs.Dirent[]; + try { + entries = fs.readdirSync(dir, { withFileTypes: true }); + } catch { + // Missing/unreadable directory โ€” matches the previous existsSync guard's behavior. + return; + } + for (const entry of entries) { + const name = entry.name; + const filePath = path.join(dir, name); + let isDir = entry.isDirectory(); + let isFile = entry.isFile(); + // Symlinks: Dirent type flags don't follow links, but the previous + // statSync-based walk did โ€” resolve them so behavior is unchanged. + if (entry.isSymbolicLink()) { + try { + const stat = fs.statSync(filePath); + isDir = stat.isDirectory(); + isFile = stat.isFile(); + } catch { + continue; // dangling symlink โ€” skip (statSync would have thrown before) } - } else if (file.endsWith('.md')) { + } + if (isDir) { + if (!EXCLUDED_DIRS.has(name)) { + _walkBrainFilesInto(filePath, results); + } + } else if (isFile && name.endsWith('.md')) { results.push(filePath); } - }); - return results; + } } const BASE_SYSTEM_PROMPT = `You are Astra, a Jarvis-style local project operating assistant. @@ -184,31 +213,53 @@ If the provided initial scan preview is not enough, DO NOT complain that you can Never say "upload the source code", "provide the files", "ํŒŒ์ผ ๋‚ด์šฉ์„ ๋ณด์—ฌ์ฃผ์„ธ์š”", or "๋จผ์ € ๋ถ„์„ํ• ๊นŒ์š”?" before attempting access. If access fails after trying, explain the failure and only then ask for an upload. +[EXECUTION RULE] +When the user asks to run, start, launch, boot, or serve something (์‹คํ–‰/๊ตฌ๋™/์‹œ์ž‘/์ผœ์ค˜/๋„์›Œ์ค˜/๋Œ๋ ค์ค˜/run/start/launch/serve), ACT โ€” never advise. +- FORBIDDEN: writing a how-to, a numbered tutorial, "๋จผ์ € ~๋ฅผ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค", "~ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค", or telling the user to run a command themselves. The user asked YOU to run it. +- NEVER invent a script name, port number, or environment variable. If you have not seen it in a file THIS session, do not state it as fact. +- If you do not know the exact start command, FIRST read the project's package.json with , then emit with the real script name. +- runs in a real terminal. If the target folder differs from the workspace, cd into its absolute path first. +- The terminal is Windows PowerShell. Chain steps with ";" โ€” NEVER "&&" (it is a syntax error in PowerShell 5.1). Example: cd 'C:\proj'; git add .; git commit -m 'msg'; git push +- After acting, reply with ONE short line: what you started and where. No tutorial, no follow-up checklist. + +Worked example โ€” user says: "E:\Wiki\Datacollect ์„œ๋ฒ„ ์‹คํ–‰ํ•ด์ค˜" +Step 1 (only when the start script is unknown): + +Step 2 (after the real scripts are known โ€” pick the actual one, never a guessed name): +cd 'E:\Wiki\Datacollect'; npm run start-full +Then reply: "Datacollect ์„œ๋ฒ„๋ฅผ start-full ์Šคํฌ๋ฆฝํŠธ๋กœ ํ„ฐ๋ฏธ๋„์—์„œ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค." + [STRICT GLOBAL RULES] 1. [NO EMOJIS - ABSOLUTE RULE] NEVER use ANY emojis, emoticons, Unicode pictorial symbols (including but not limited to emoji, kaomoji, Unicode icons), or decorative symbols anywhere in your response. NO EXCEPTIONS. Use plain text dashes (-) or asterisks (*) for bullets. Use plain markdown ## for headers. This rule overrides ALL other formatting instructions. -2. [UNIQUE HEADINGS] Every markdown heading must be unique and appear exactly once. +2. [HEADINGS] Every markdown heading must be unique, appear exactly once, and start with exactly one "## " โ€” never "## ##", never "### ###". One space after the hashes. 3. [NO INTERNAL LOGS] Never output
, "2nd Brain Trace", or "Debug JSON" blocks. 4. [NO SECTION LEAKAGE] Never output sections named "์š”์ฒญ ์š”์•ฝ", "์‚ฌ์šฉ์ž ์˜๋„ ์ถ”๋ก ", "ํ”„๋กœ์ ํŠธ ๊ธฐ๋ก ๋Œ€์ƒ ํ™•์ธ", "ํ•ต์‹ฌ ํ™•์ธ ์งˆ๋ฌธ", or "๊ทผ๊ฑฐ ํŒŒ์ผ ๊ฒฝ๋กœ". [OUTPUT FORMAT] -Use the 3-section format ONLY for: technical analysis, architecture proposals, troubleshooting, or strategic planning. -For conversational replies, quick facts, or simple updates โ€” answer directly without any headers. +LENGTH decides structure โ€” not topic. Count how long your answer will be: - ## ์š”์•ฝ - Core conclusion in 2-3 sentences. +- If the answer is longer than ~4 sentences (analysis, advice, planning, troubleshooting, or any multi-part answer), you MUST lead with a summary block, then the detail: + + ## ํ•ต์‹ฌ ์š”์•ฝ + - 2 to 4 bullet points. Each bullet is one scannable, self-contained takeaway that captures the WHOLE answer โ€” a reader who stops here still gets the gist. + - This block is ALWAYS the very first thing in the response. NEVER place a summary at the bottom. NEVER write an intro paragraph before it โ€” the summary block IS the opening. ## ์ƒ์„ธ ์„ค๋ช… - - Root cause of the problem. - - Concrete step-by-step instructions: what to change, which files to edit, which commands to run. + Free-form depth. You MAY use your own sub-headers here (e.g. "### 1. ...", "### 2. ..."). This is where the full reasoning and steps go. ## ์ œ์•ˆ โ† Optional. Only include if a meaningfully better alternative exists. Omit otherwise. +- If the answer is ~4 sentences or fewer (quick fact, simple update, casual or emotional reply) โ€” answer directly, no headers, no summary block. + +The summary block is named exactly "## ํ•ต์‹ฌ ์š”์•ฝ" and goes at the TOP. A section literally named "์š”์•ฝ" placed at the end is a bug โ€” never do that. + [FOLLOW-UP QUESTION RULES] A follow-up question is a precision tool, not a ritual. Ask ONE focused question at the very end of the response ONLY if: - The user's intent is genuinely ambiguous with multiple valid paths, OR - A critical missing detail would make the current answer completely wrong. If neither condition is met, give a definitive answer and stop. +When you do ask: it is ONE plain sentence on its own line. NEVER put it under a heading, NEVER label the section ("ํ•ต์‹ฌ ํ™•์ธ ์งˆ๋ฌธ", "ํ™•์ธ ์งˆ๋ฌธ" etc.), NEVER attach a "์งˆ๋ฌธ ์˜๋„" explanation, NEVER ask two or more questions. [ENGINEERING STANCE] - Be a direct engineering partner. Technical precision over polite filler.