v2.2.15: Astra Office Refactor & Multi-Service Integration

This commit is contained in:
g1nation
2026-05-16 22:07:06 +09:00
parent 9dcc98ad33
commit 9ca95ab997
46 changed files with 5648 additions and 1299 deletions
+261 -39
View File
@@ -1,11 +1,11 @@
{
"version": 1,
"generatedAt": "2026-05-16T04:18:55.389Z",
"generatedAt": "2026-05-16T13:04:11.635Z",
"files": {
"src/agent.ts": {
"mtimeMs": 1778902489000,
"size": 187410,
"lines": 3260,
"mtimeMs": 1778936503000,
"size": 201748,
"lines": 3509,
"role": "",
"imports": [
"src/utils",
@@ -259,9 +259,9 @@
"imports": []
},
"src/extension.ts": {
"mtimeMs": 1778902489000,
"size": 50938,
"lines": 972,
"mtimeMs": 1778935438000,
"size": 61216,
"lines": 1179,
"role": "",
"imports": [
"src/utils",
@@ -290,7 +290,8 @@
"src/retrieval",
"src/retrieval/lessonHelpers",
"src/skills/scopedBrainRetriever",
"src/integrations/telegram/conversationHistory"
"src/integrations/telegram/conversationHistory",
"src/features/calendar"
]
},
"src/features/approval/approvalPanelProvider.ts": {
@@ -321,10 +322,126 @@
"src/features/approval/approvalQueue"
]
},
"src/features/astraOffice/index.ts": {
"mtimeMs": 1778931477000,
"size": 789,
"lines": 18,
"role": "Astra Office — public API. 다음 세션에서 추가될 OfficeSnapshot presenter / schema 도 같은 entry 로 노출 예정. 현재 노출: full webview panel HTML 생성 함수. sidebarProvider.ts 는 이 한 줄만 import.",
"imports": [
"src/features/astraOffice/view/panelHtml",
"src/features/astraOffice/schema",
"src/features/astraOffice/presenter",
"src/features/astraOffice/view/layoutSchema"
]
},
"src/features/astraOffice/presenter.ts": {
"mtimeMs": 1778932441000,
"size": 7368,
"lines": 181,
"role": "Presenter — 옛 AgentWorkState + bubble queue + activity items 를 OfficeSnapshot 으로 변환하는 pure 함수. mini / full view 둘 다 같은 OfficeSnapshot 을 받게 만드는 게 목표. 이번 세션의 범위: 인터페이스 + 스텁. 실제 wiring 은 다음 세션에서: - sideb",
"imports": [
"src/features/company/pixelOfficeState",
"src/features/company/types",
"src/features/astraOffice/schema"
]
},
"src/features/astraOffice/schema.ts": {
"mtimeMs": 1778931632000,
"size": 10631,
"lines": 305,
"role": "OfficeSnapshot — Astra Office 의 도메인 타입. 동시성 진실 (docs/ASTRAOFFICEREFACTOR.md §1): dispatcher 는 직렬이라 한 시점에 active agent 는 0 또는 1명. 이걸 데이터로 강제하는 게 이 타입의 핵심 역할. 이 세션에서는 타입 + validator + empty factory 만. 백",
"imports": [
"src/features/company/pixelOfficeState"
]
},
"src/features/astraOffice/view/layoutSchema.ts": {
"mtimeMs": 1778931707000,
"size": 6475,
"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": 1778931340000,
"size": 1804,
"lines": 21,
"role": "자동 분리: src/sidebarProvider.ts 3984-4001 에서 추출. 동작 동등.",
"imports": []
},
"src/features/astraOffice/view/officeStyles.ts": {
"mtimeMs": 1778931340000,
"size": 14309,
"lines": 121,
"role": "자동 분리: src/sidebarProvider.ts 3866-3982 에서 추출. 동작 동등. design doc: docs/ASTRAOFFICEREFACTOR.md",
"imports": []
},
"src/features/astraOffice/view/panelHtml.ts": {
"mtimeMs": 1778931468000,
"size": 923,
"lines": 26,
"role": "Full Astra Office webview HTML composition. 옛 sidebarProvider.ts 의 거대한 pixelOfficePanelHtml 을 4개 파일로 분리한 entry. 이번 세션은 동작 동등 분리 만. 다음 세션에 mini view 와 공통 presenter 도입.",
"imports": [
"src/features/astraOffice/view/officeStyles",
"src/features/astraOffice/view/officeBody",
"src/features/astraOffice/view/runtime"
]
},
"src/features/astraOffice/view/runtime.ts": {
"mtimeMs": 1778933617000,
"size": 58118,
"lines": 1254,
"role": "자동 분리: src/sidebarProvider.ts 4002-5116 (IIFE 본문) 에서 추출. 동작 동등. ${assets.derivedBase} placeholder 는 panelHtml 에서 .replace() 로 실제 값 주입. 다음 세션에서 OfficeSnapshot 기반으로 단계적으로 잘라낼 예정.",
"imports": []
},
"src/features/calendar/calendarApi.ts": {
"mtimeMs": 1778935879000,
"size": 8782,
"lines": 205,
"role": "Google Calendar API v3 — event create/list 호출. access token 은 caller 가 직접 주입한다. 만료 처리는 withFreshAccessToken 헬퍼가 refresh token 으로 갱신 → 호출 → 401 발생 시 한 번 더 갱신 + 재시도. 외부 라이브러리(googleapis) 안 씀 — Calendar ",
"imports": [
"src/features/calendar/oauth",
"src/features/calendar/calendarCache"
]
},
"src/features/calendar/calendarCache.ts": {
"mtimeMs": 1778935391000,
"size": 8115,
"lines": 170,
"role": "Google Calendar (iCal) 캐시 — fetch + parse + 회사 shared/calendarcache.md 에 저장. Connectorigin 의 googlecalendar.py 를 TypeScript / native fetch 로 옮김. OAuth 없음. 사용자가 Google Calendar 설정 → \"비공개 주소(iCal 형식)\" 복",
"imports": [
"src/features/calendar/icsParser"
]
},
"src/features/calendar/icsParser.ts": {
"mtimeMs": 1778934638000,
"size": 4823,
"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,
"lines": 32,
"role": "",
"imports": [
"src/features/calendar/icsParser",
"src/features/calendar/calendarCache",
"src/features/calendar/oauth",
"src/features/calendar/calendarApi"
]
},
"src/features/calendar/oauth.ts": {
"mtimeMs": 1778935851000,
"size": 10705,
"lines": 235,
"role": "Google OAuth 2.0 — loopback (Desktop app) 흐름. Google 은 Desktop 앱 OAuth client 에 대해 http://127.0.0.1:<ephemeralport> redirect URI 를 허용한다. 본 모듈은: 1. ephemeral port 에 일회용 HTTP 서버 띄움 2. 사용자 브라우저로 Google 로",
"imports": []
},
"src/features/company/agents.ts": {
"mtimeMs": 1778765657000,
"size": 13783,
"lines": 196,
"mtimeMs": 1778936611000,
"size": 15031,
"lines": 211,
"role": "기본 에이전트 로스터 — 1인 기업 모드의 출고 디폴트. 설계 의도: 소프트웨어/게임 개발 IT 회사의 1인 기업 운영을 가정. 한 사람이 기획 → 디자인 → 개발 → QA → 출시 → 운영/마케팅을 모두 책임질 때 필요한 직군을 빠짐없이 커버하되 역할이 겹치지 않게 분리한다. 직군 구분 (혼동 방지): - 기획자(business) : 무엇을 만들지 정의 ",
"imports": [
"src/features/company/types"
@@ -368,9 +485,9 @@
]
},
"src/features/company/dispatcher.ts": {
"mtimeMs": 1778902489000,
"size": 72121,
"lines": 1419,
"mtimeMs": 1778936524000,
"size": 73113,
"lines": 1435,
"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",
@@ -387,6 +504,8 @@
"src/features/company/telegramReport",
"src/features/company/types",
"src/features/company/intentAlignment",
"src/features/calendar",
"src/features/tasks",
"src/config",
"src/features/selfReflector/selfReflectorVerifier",
"src/features/selfReflector/selfReflectorExecution",
@@ -433,9 +552,9 @@
]
},
"src/features/company/pipelineTemplates.ts": {
"mtimeMs": 1778902489000,
"size": 13681,
"lines": 250,
"mtimeMs": 1778933936000,
"size": 15125,
"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": [
"src/features/company/types"
@@ -456,9 +575,9 @@
"imports": []
},
"src/features/company/promptBuilder.ts": {
"mtimeMs": 1778902489000,
"size": 14499,
"lines": 260,
"mtimeMs": 1778936588000,
"size": 18723,
"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 (<createfile>, ",
"imports": [
"src/features/company/agents",
@@ -668,6 +787,40 @@
"src/lib/paths"
]
},
"src/features/sheets/index.ts": {
"mtimeMs": 1778935930000,
"size": 237,
"lines": 13,
"role": "",
"imports": [
"src/features/sheets/sheetsApi"
]
},
"src/features/sheets/sheetsApi.ts": {
"mtimeMs": 1778936110000,
"size": 7794,
"lines": 166,
"role": "Google Sheets API v4 — read / write / append. 토큰은 calendar 와 공유 (같은 OAuth 에 spreadsheets scope 포함). 별도 셋업 없음 — \"Astra: Google Calendar OAuth 연결\" 명령으로 한 번 로그인하면 둘 다 동작한다. 외부 라이브러리 안 씀 — Sheets API REST",
"imports": [
"src/features/calendar/calendarApi"
]
},
"src/features/tasks/index.ts": {
"mtimeMs": 1778936468000,
"size": 225,
"lines": 13,
"role": "",
"imports": [
"src/features/tasks/taskStore"
]
},
"src/features/tasks/taskStore.ts": {
"mtimeMs": 1778936462000,
"size": 9121,
"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,
@@ -1006,9 +1159,9 @@
]
},
"src/sidebar/chatHandlers.ts": {
"mtimeMs": 1778902489000,
"size": 34805,
"lines": 630,
"mtimeMs": 1778934077000,
"size": 37222,
"lines": 676,
"role": "",
"imports": [
"src/sidebarProvider",
@@ -1030,9 +1183,9 @@
]
},
"src/sidebarProvider.ts": {
"mtimeMs": 1778904191000,
"size": 245949,
"lines": 5505,
"mtimeMs": 1778933999000,
"size": 188454,
"lines": 4141,
"role": "",
"imports": [
"src/utils",
@@ -1053,6 +1206,7 @@
"src/features/projectArchitecture/intentDetector",
"src/features/company",
"src/core/services",
"src/features/astraOffice",
"src/features/company/dispatcher"
]
},
@@ -1113,9 +1267,9 @@
"imports": []
},
"src/utils.ts": {
"mtimeMs": 1778902489000,
"size": 12155,
"lines": 279,
"mtimeMs": 1778936575000,
"size": 15995,
"lines": 360,
"role": "",
"imports": [
"src/config",
@@ -1144,23 +1298,23 @@
"imports": []
},
"media/sidebar.css": {
"mtimeMs": 1778902489000,
"size": 85387,
"lines": 1986,
"mtimeMs": 1778934126000,
"size": 86702,
"lines": 2016,
"role": "Stylesheet",
"imports": []
},
"media/sidebar.html": {
"mtimeMs": 1778902489000,
"size": 33230,
"lines": 531,
"mtimeMs": 1778934094000,
"size": 34587,
"lines": 546,
"role": "Astra",
"imports": []
},
"media/sidebar.js": {
"mtimeMs": 1778902489000,
"size": 206892,
"lines": 3605,
"mtimeMs": 1778934151000,
"size": 211710,
"lines": 3657,
"role": "",
"imports": []
},
@@ -1191,6 +1345,16 @@
"src/retrieval/brainIndex"
]
},
"tests/calendarApi.test.ts": {
"mtimeMs": 1778935637000,
"size": 5103,
"lines": 131,
"role": "",
"imports": [
"src/features/calendar/calendarApi",
"src/agent"
]
},
"tests/contextManager.test.ts": {
"mtimeMs": 1778594523000,
"size": 6545,
@@ -1218,6 +1382,15 @@
"src/utils"
]
},
"tests/icsParser.test.ts": {
"mtimeMs": 1778934828000,
"size": 5011,
"lines": 134,
"role": "",
"imports": [
"src/features/calendar/icsParser"
]
},
"tests/integration_retrieval.test.ts": {
"mtimeMs": 1777949141000,
"size": 4017,
@@ -1274,6 +1447,17 @@
"role": "",
"imports": []
},
"tests/officeSchema.test.ts": {
"mtimeMs": 1778932509000,
"size": 9884,
"lines": 241,
"role": "",
"imports": [
"src/features/astraOffice/schema",
"src/features/astraOffice/view/layoutSchema",
"src/features/astraOffice/presenter"
]
},
"tests/paths.test.ts": {
"mtimeMs": 1778250990000,
"size": 2590,
@@ -1283,6 +1467,15 @@
"src/lib/paths"
]
},
"tests/pipelineTemplates.test.ts": {
"mtimeMs": 1778934174000,
"size": 2984,
"lines": 69,
"role": "",
"imports": [
"src/features/company/pipelineTemplates"
]
},
"tests/projectChronicle.test.ts": {
"mtimeMs": 1778169995000,
"size": 8359,
@@ -1356,6 +1549,16 @@
"src/features/secondBrainTrace"
]
},
"tests/sheetsApi.test.ts": {
"mtimeMs": 1778936029000,
"size": 3913,
"lines": 113,
"role": "",
"imports": [
"src/features/sheets/sheetsApi",
"src/agent"
]
},
"tests/skillInjectionService.test.ts": {
"mtimeMs": 1778681774000,
"size": 6741,
@@ -1383,6 +1586,16 @@
"src/system/specs"
]
},
"tests/taskStore.test.ts": {
"mtimeMs": 1778936645000,
"size": 7226,
"lines": 185,
"role": "",
"imports": [
"src/features/tasks/taskStore",
"src/agent"
]
},
"tests/telegramBot.test.ts": {
"mtimeMs": 1778253785000,
"size": 13012,
@@ -1455,6 +1668,15 @@
"role": "",
"imports": []
},
"docs/ASTRA_OFFICE_REFACTOR.md": {
"mtimeMs": 1778931177000,
"size": 9395,
"lines": 198,
"role": "Astra Office Refactor — Design Doc",
"imports": [
"docs/features/astraOffice"
]
},
"docs/Advanced_Features_Implementation_Guide.md": {
"mtimeMs": 1777808065000,
"size": 1804,
@@ -1638,7 +1860,7 @@
"imports": []
},
"docs/records/ConnectAI/chronicle.config.json": {
"mtimeMs": 1778902789000,
"mtimeMs": 1778932145000,
"size": 416,
"lines": 11,
"role": "JSON configuration",