diff --git a/.astra-office-preview.html b/.astra-office-preview.html deleted file mode 100644 index 8ec47ad..0000000 --- a/.astra-office-preview.html +++ /dev/null @@ -1,1846 +0,0 @@ - - - - - - - - -
-
-
-
ASTRA OFFICE
-
Operations Floor
-
-
-
대기 중
-
현재 담당Astra
-
-
- -
-
- - - -
- - -
-
-
-
Current Mission
-
새 요청을 기다리고 있습니다.
-
-
- 현재 단계 - 대기 중 -
-
- -
-
-
-
-
-
-
-
-
-
- - -
- - -
- - - diff --git a/.astra/tests/engine/.astra/cache/7fa9e2c0ed212d5dbde1172e996cde86955f34dda22a6e02b95c9adc0a456927.json b/.astra/tests/engine/.astra/cache/7fa9e2c0ed212d5dbde1172e996cde86955f34dda22a6e02b95c9adc0a456927.json index 7ca348d..fd99f7f 100644 --- a/.astra/tests/engine/.astra/cache/7fa9e2c0ed212d5dbde1172e996cde86955f34dda22a6e02b95c9adc0a456927.json +++ b/.astra/tests/engine/.astra/cache/7fa9e2c0ed212d5dbde1172e996cde86955f34dda22a6e02b95c9adc0a456927.json @@ -1,5 +1,5 @@ { "result": "직답 결과 — single-pass mock 응답입니다.", - "createdAt": 1783071368763, + "createdAt": 1783232170764, "modelVersion": "unknown" } \ No newline at end of file diff --git a/.astra/tests/engine/.astra/cache/8c208151bed9108b665cd93e98fc10d377a9fef641dd359504b8d53aecd0a4c3.json b/.astra/tests/engine/.astra/cache/8c208151bed9108b665cd93e98fc10d377a9fef641dd359504b8d53aecd0a4c3.json index 55eb95e..568d091 100644 --- a/.astra/tests/engine/.astra/cache/8c208151bed9108b665cd93e98fc10d377a9fef641dd359504b8d53aecd0a4c3.json +++ b/.astra/tests/engine/.astra/cache/8c208151bed9108b665cd93e98fc10d377a9fef641dd359504b8d53aecd0a4c3.json @@ -1,5 +1,5 @@ { - "result": "---\nid: wiki_on\ndate: 2026-07-03T09:36:08.766Z\ntype: knowledge_artifact\nstandard: P-Reinforce v3.0\ntags: [automated, connect_ai, brain_sync]\n---\n\n## 📌 Brief Summary\n직답 결과 — single-pass mock 응답입니다.\n\n직답 결과 — single-pass mock 응답입니다.\n---\n## 🛡️ Reliability & Audit Summary\n> [!NOTE]\n> 이 문서는 ConnectAI의 **Intelligent Resilience** 엔진에 의해 검증 및 정제되었습니다.\n\n| Metric | Value | Status |\n| :--- | :--- | :--- |\n| **Conflict Risk** | `0/100` | ✅ Low |\n| **Fallbacks Used** | `0` | ✅ None |\n| **Auto Retries** | `0` | ✅ Stable |\n| **Deduplication** | `0` | Standard |\n| **Processing Time** | `0.0s` | ✅ Fast |\n\n### 🔍 Decision Audit Trail\n- **[DIRECT]** 답변 작성 중... (단일 호출 fast-path) (13ms)\n", - "createdAt": 1783071368766, + "result": "---\nid: wiki_on\ndate: 2026-07-05T06:16:10.765Z\ntype: knowledge_artifact\nstandard: P-Reinforce v3.0\ntags: [automated, connect_ai, brain_sync]\n---\n\n## 📌 Brief Summary\n직답 결과 — single-pass mock 응답입니다.\n\n직답 결과 — single-pass mock 응답입니다.\n---\n## 🛡️ Reliability & Audit Summary\n> [!NOTE]\n> 이 문서는 ConnectAI의 **Intelligent Resilience** 엔진에 의해 검증 및 정제되었습니다.\n\n| Metric | Value | Status |\n| :--- | :--- | :--- |\n| **Conflict Risk** | `0/100` | ✅ Low |\n| **Fallbacks Used** | `0` | ✅ None |\n| **Auto Retries** | `0` | ✅ Stable |\n| **Deduplication** | `0` | Standard |\n| **Processing Time** | `0.0s` | ✅ Fast |\n\n### 🔍 Decision Audit Trail\n- **[DIRECT]** 답변 작성 중... (단일 호출 fast-path) (11ms)\n", + "createdAt": 1783232170765, "modelVersion": "unknown" } \ No newline at end of file diff --git a/.astra/tests/engine/.astra/missions/wiki_on.json b/.astra/tests/engine/.astra/missions/wiki_on.json index bdd7c44..1d454fc 100644 --- a/.astra/tests/engine/.astra/missions/wiki_on.json +++ b/.astra/tests/engine/.astra/missions/wiki_on.json @@ -1,8 +1,8 @@ { "missionId": "wiki_on", "status": "completed", - "startTime": "2026-07-03T09:36:08.748Z", - "totalElapsedMs": 20, + "startTime": "2026-07-05T06:16:10.751Z", + "totalElapsedMs": 16, "results": { "direct": "직답 결과 — single-pass mock 응답입니다." }, @@ -12,16 +12,16 @@ { "from": "idle", "to": "direct", - "durationMs": 13, + "durationMs": 11, "message": "답변 작성 중... (단일 호출 fast-path)", - "ts": "2026-07-03T09:36:08.761Z" + "ts": "2026-07-05T06:16:10.762Z" }, { "from": "direct", "to": "completed", - "durationMs": 6, + "durationMs": 5, "message": "미션 완료", - "ts": "2026-07-03T09:36:08.767Z" + "ts": "2026-07-05T06:16:10.767Z" } ], "resilienceMetrics": { diff --git a/.astra/tests/stress/.astra/cache/21818066876cbf8515758bc351bb3d9d44f32b0e4cd024b2e055db3a0d34417e.json b/.astra/tests/stress/.astra/cache/21818066876cbf8515758bc351bb3d9d44f32b0e4cd024b2e055db3a0d34417e.json index 9c85dd6..0678b7a 100644 --- a/.astra/tests/stress/.astra/cache/21818066876cbf8515758bc351bb3d9d44f32b0e4cd024b2e055db3a0d34417e.json +++ b/.astra/tests/stress/.astra/cache/21818066876cbf8515758bc351bb3d9d44f32b0e4cd024b2e055db3a0d34417e.json @@ -1,5 +1,5 @@ { "result": "Final report with inconsistencies. This should be long enough to pass validation.", - "createdAt": 1783071374928, + "createdAt": 1783232177877, "modelVersion": "unknown" } \ No newline at end of file diff --git a/.astra/tests/stress/.astra/cache/4fc755e372f1dd80d6bffc7b2ef973124fb64ba505f767c53a783833bbc3fa6a.json b/.astra/tests/stress/.astra/cache/4fc755e372f1dd80d6bffc7b2ef973124fb64ba505f767c53a783833bbc3fa6a.json index 672d892..0678b7a 100644 --- a/.astra/tests/stress/.astra/cache/4fc755e372f1dd80d6bffc7b2ef973124fb64ba505f767c53a783833bbc3fa6a.json +++ b/.astra/tests/stress/.astra/cache/4fc755e372f1dd80d6bffc7b2ef973124fb64ba505f767c53a783833bbc3fa6a.json @@ -1,5 +1,5 @@ { "result": "Final report with inconsistencies. This should be long enough to pass validation.", - "createdAt": 1783071374927, + "createdAt": 1783232177877, "modelVersion": "unknown" } \ No newline at end of file diff --git a/.astra/tests/stress/.astra/cache/6e559207c4542d959700ff14f360e6575e54853929e991e579e318f2f5a19030.json b/.astra/tests/stress/.astra/cache/6e559207c4542d959700ff14f360e6575e54853929e991e579e318f2f5a19030.json index ce207b0..bb562c9 100644 --- a/.astra/tests/stress/.astra/cache/6e559207c4542d959700ff14f360e6575e54853929e991e579e318f2f5a19030.json +++ b/.astra/tests/stress/.astra/cache/6e559207c4542d959700ff14f360e6575e54853929e991e579e318f2f5a19030.json @@ -1,5 +1,5 @@ { "result": "[{\"heading\":\"본문\",\"scope\":\"전체 답변\"}]", - "createdAt": 1783071374923, + "createdAt": 1783232177866, "modelVersion": "unknown" } \ No newline at end of file diff --git a/.astra/tests/stress/.astra/cache/f65136cebc95448a7e93a45745cb73b3a5a01af5d82391ec29a25bd72b8239a5.json b/.astra/tests/stress/.astra/cache/f65136cebc95448a7e93a45745cb73b3a5a01af5d82391ec29a25bd72b8239a5.json index b172610..295b982 100644 --- a/.astra/tests/stress/.astra/cache/f65136cebc95448a7e93a45745cb73b3a5a01af5d82391ec29a25bd72b8239a5.json +++ b/.astra/tests/stress/.astra/cache/f65136cebc95448a7e93a45745cb73b3a5a01af5d82391ec29a25bd72b8239a5.json @@ -1,5 +1,5 @@ { "result": "[CONFLICT WARNING] 성능이 200% 증가했습니다. vs 그러나 동시에 50% 감소했습니다. 최적화와 성능 저하가 동시에 발견됨.", - "createdAt": 1783071374925, + "createdAt": 1783232177871, "modelVersion": "unknown" } \ No newline at end of file diff --git a/.astra/tests/stress/.astra/missions/stress_conflict_1783071374907.json b/.astra/tests/stress/.astra/missions/stress_conflict_1783232177848.json similarity index 73% rename from .astra/tests/stress/.astra/missions/stress_conflict_1783071374907.json rename to .astra/tests/stress/.astra/missions/stress_conflict_1783232177848.json index 6a956bc..073fbcb 100644 --- a/.astra/tests/stress/.astra/missions/stress_conflict_1783071374907.json +++ b/.astra/tests/stress/.astra/missions/stress_conflict_1783232177848.json @@ -1,8 +1,8 @@ { - "missionId": "stress_conflict_1783071374907", + "missionId": "stress_conflict_1783232177848", "status": "completed", - "startTime": "2026-07-03T09:36:14.907Z", - "totalElapsedMs": 22, + "startTime": "2026-07-05T06:16:17.848Z", + "totalElapsedMs": 29, "results": { "outline": "[{\"heading\":\"본문\",\"scope\":\"전체 답변\"}]", "section_0": "[CONFLICT WARNING] 성능이 200% 증가했습니다. vs 그러나 동시에 50% 감소했습니다. 최적화와 성능 저하가 동시에 발견됨.", @@ -14,30 +14,30 @@ { "from": "idle", "to": "outline", - "durationMs": 15, + "durationMs": 12, "message": "답변 구조 잡는 중...", - "ts": "2026-07-03T09:36:14.922Z" + "ts": "2026-07-05T06:16:17.860Z" }, { "from": "outline", "to": "section", - "durationMs": 2, + "durationMs": 6, "message": "본문 작성 중...", - "ts": "2026-07-03T09:36:14.924Z" + "ts": "2026-07-05T06:16:17.866Z" }, { "from": "section", "to": "polish", - "durationMs": 2, + "durationMs": 6, "message": "최종 다듬기 중...", - "ts": "2026-07-03T09:36:14.926Z" + "ts": "2026-07-05T06:16:17.872Z" }, { "from": "polish", "to": "completed", - "durationMs": 3, + "durationMs": 5, "message": "미션 완료", - "ts": "2026-07-03T09:36:14.929Z" + "ts": "2026-07-05T06:16:17.877Z" } ], "resilienceMetrics": { diff --git a/PATCHNOTES.md b/PATCHNOTES.md index 2ae6e0e..0796d7d 100644 --- a/PATCHNOTES.md +++ b/PATCHNOTES.md @@ -1,5 +1,54 @@ # Astra Patch Notes +## v2.2.296 (2026-07-05) +### 🧠 소형 모델 추론 강화 2탄 — 코딩 실행 루프 + 도구 라우팅 + 근거 재검색 +로드맵 2·3·4번 완결. 1탄(calculate·지식 스코프)과 합쳐 "모델은 판단만, 계산·실행·기억은 바깥에서" 아키텍처가 완성됐다. +- **[ACTION 17] `` 실행 확인**: 워크스페이스 안의 .py/.js/.mjs/.cjs 파일을 인터프리터로 직접 실행하고 stdout/stderr/종료코드를 대화 컨텍스트로 재주입. run_command 와 달리 출력이 회수되므로 "생성→실행→에러 확인→수정" 루프가 모델 주도로 성립. 샌드박스(validatePath)·15초 타임아웃·회당 2회·출력 4천자 상한. +- **문법 오류 자가수정 루프**: Self-Reflector Phase C(실행 검증)의 문법 오류를 보고로 끝내지 않고 internal system 메시지로 재주입 → 자동 후속 턴에서 모델이 로 즉시 수정 → 다음 라운드 재검증 (maxAutoSteps 한도로 무한 루프 차단). ※ `selfReflector.executionVerification` 설정이 켜져 있어야 동작. +- **도구 라우팅 힌트**: 도메인 분류(1탄의 휴리스틱) 결과가 그 턴의 행동을 직접 지시 — 수학→ 위임, 코딩→ 실행 확인, 팩트→근거 없으면 '확인 불가'/. dynamicBlocks 보호 구역에 주입되어 컨텍스트 truncation 에서도 살아남는다. 분류 1회로 지식 스코프+도구 유도 동시 결정. +- **근거 재검색 확장**: 기존 Grounding rescue(근거 약함 → 전체 두뇌 재검색)가 에이전트 스코프에만 적용되던 것을 도메인 지식 스코프에도 확장 — Specialty 폴더가 정답 문서를 가리는 경우 같은 방식으로 구제. +검증: tsc 무오류 + jest 818 통과(신규 runCode 7개 + 라우팅 힌트 4개) + esbuild 정상. + +## v2.2.295 (2026-07-05) +### 🧠 소형 모델 추론 강화 1탄 — 계산 위임 + 단계별 지식 스코프 +"작은 모델은 판단만, 계산·기억은 바깥에서" 전략의 첫 구현. 모델은 그대로 두고 외부 레이어만 강화한다. +- **[ACTION 16] `` 계산 위임**: 수치·수학 계산을 모델이 암산하지 않고 Python(`-I` isolated, 10초 타임아웃)에 위임. stdout/stderr 이 internal system 메시지로 재주입되어 자동 후속 턴에서 모델이 결과를 해석하고, 에러 시 코드를 고쳐 재시도하는 자가수정 루프가 성립(read_file 과 동일한 재주입 메커니즘). 시스템 프롬프트에 '암산 금지' 규칙 추가. 회당 4회·출력 4천자 상한. +- **단계별 지식 스코프 (General + Specialty)**: 질문을 수학/코딩/팩트로 분류(LLM 호출 없는 결정적 휴리스틱 — 지연·비용 0)해, 해당 도메인의 Specialty 폴더 + 공통 General 폴더로 RAG 검색 범위를 축소. 4b 모델 컨텍스트에서 무관 청크를 배제하는 정밀도 최적화. + - 설정 패널 '지식·기억' 탭에 단계별 폴더 4개(General/수학/코딩/팩트) UI 추가 (`g1nation.domainKnowledge.*`, 두뇌 상대 경로). + - 안전 규칙: 분류 실패·Specialty 미설정 시 기존 전체 두뇌 검색으로 폴백(opt-in), 에이전트별 지식 매핑(agentKnowledgeMap)이 있으면 그쪽 우선(기존 제한을 느슨하게 만들지 않음), 두뇌 밖 경로(../) 차단. + - 기존 scopedBrainRetriever/searchBrainFiles 의 scopeFolders 메커니즘 재사용 — 검색 엔진 무변경. +검증: tsc 무오류 + jest 809 통과(신규 calculate 6개 + domainRouter 12개) + esbuild 정상. + +## v2.2.294 (2026-07-05) +### 🔘 도구 메뉴에 'NotebookLM 백엔드 실행/종료' 버튼 (터미널 불필요) +Datacollector 의 Research(NotebookLM) 기능은 NAS 브리지로 처리 불가(로그인된 로컬 Chrome + PC 의 LM Studio 프록시 필요)라 로컬에서 `npm run bridge` 를 띄워야 했는데, 터미널 없이 사이드바 버튼으로 켜고 끌 수 있게 했다. +- **도구 ▾ 메뉴**: 'NotebookLM 백엔드 실행' / 'NotebookLM 백엔드 종료' 버튼 추가. +- **실행**: VS Code 통합 터미널("NotebookLM Bridge")에서 `npm run bridge` — 맥/윈도우 셸 차이를 VS Code 가 흡수하고, 브리지 로그(인증 만료 등)를 사용자가 그대로 볼 수 있다. 이미 실행 중이면(포트 3002 응답) 중복 실행 안 함. +- **프로젝트 자동 탐색**: 설정(`g1nation.datacollectLocalProjectPath`) → 워크스페이스 → 부모의 Datacollector_MAC/Datacollector/Datacollect 순. 못 찾으면 폴더 선택 창 → 선택 즉시 설정에 저장(다음부턴 버튼만). +- **종료**: 터미널 정리 + 포트 3002 점유 프로세스를 OS 자동 감지로 정리(윈도우 PowerShell Stop-Process / 맥·리눅스 lsof+kill) — 예전에 수동으로 띄워 남아 있던 프로세스까지 잡는다. +- NAS 브리지·Astra 슬래시 명령에는 영향 없음(별개 경로). 새 핸들러는 registerSidebarHandler 체인에 독립 모듈로 합류. +검증: tsc 무오류 + jest 791 통과(신규 bridgeLauncher 테스트 7개 포함) + esbuild 정상. + +## v2.2.293 (2026-07-05) +### 🗑️ Pixel Office 완전 제거 (시각화 폐기 — 기업 모드 로직은 무변경) +v2.2.267 에서 채팅 배너를 제거한 데 이어, 시각화 기능 전체를 폐기하기로 결정(재도입 계획 없음). +- **삭제**: `src/features/astraOffice/**`, 사이드바 매니저 3종(pixelOfficeState/Helpers/LayoutStore), `features/company/pixelOfficeState.ts`(UI 전용 변환층), `assets/pixelOffice/**`(스프라이트 17MB), `.astra-office-preview.html`, officeSchema 테스트. +- **정리**: sidebarProvider 의 'Pixel Office collector' 섹션 통삭제(설계 주석의 "통째로 지워도 회사 모드 동일 동작" 불변식 그대로 활용), companyTurnEmitter 의 onPixelOffice 훅, chat/company 핸들러 케이스, `g1nation.company.pixelOffice.open` 커맨드, `company.pixelOffice.*` 설정 2종, webview 의 무시-케이스. +- **기업 모드(1인 기업) 판단 로직은 어떤 것도 변경되지 않음** — 제거된 것은 전부 read-only UI 레이어. +- 효과: 패키지 약 10MB 감량(12.2MB → 약 2MB대), 미사용 코드 ~1,000줄 제거. +검증: tsc 무오류 + jest 784 통과(2 skip, 삭제된 기능 테스트 17개 제외) + esbuild 번들 정상. + +## v2.2.292 (2026-07-05) +### 🌡️ 메모리·발열 최적화 5종 (기능 변경 없음) +유휴·장시간 사용 시의 CPU 깨우기와 메모리 상주를 줄이는 최적화. 동작·기능은 동일. +- **헬스체크 워처 연쇄 제거**: 디스크 권한 검사를 워크스페이스 파일 쓰기/삭제 → `fs.access(W_OK)`로 교체. 10분마다 VS Code 본체·전체 확장의 파일 워처를 깨우던 연쇄가 사라짐. +- **헬스체크 느린 검사 분리**: `git push --dry-run`(원격 네트워크)을 execSync(최대 5초 확장 호스트 블로킹) → 비동기 exec 로 전환하고, Antigravity 레지스트리 검사와 함께 30분 주기(3틱마다)로 완화. 결과는 캐시되어 경고 표시는 깜빡이지 않음. +- **웹뷰 retainContextWhenHidden 정리**: 설정·승인·Pixel Office 패널에서 제거(숨김 시 렌더러 상주 해제, 각 수십 MB). 셋 다 재표시 시 상태 재구성 경로가 이미 있음(설정: 'ready'+getState, 승인: 백엔드 html 푸시). 채팅 패널만 대화 DOM 보존을 위해 유지. +- **브레인 인덱스 유휴 해제**: 한 번 로드되면 세션 내내 상주하던 토큰·임베딩 인덱스를 마지막 사용 30분 후 dirty flush 하고 메모리에서 내림(mtime 디스크 캐시가 있어 재로드 저렴). 상시 타이머 없이 접근 시 재예약되는 one-shot unref 타이머. +- **채팅 DOM 상한**: 사이드바 채팅 메시지 노드를 최근 200개로 제한(초과분은 오래된 것부터 제거 + 안내 문구). retain 웹뷰의 단조 메모리 증가 차단. +- **@lmstudio/sdk 지연 로드**: 최상위 값 import → 타입 전용 import + `getSdk()` 첫 호출 시 require. LM Studio 미사용 세션에서는 SDK 모듈이 초기화되지 않음. +검증: jest 801 통과(2 skip) + esbuild 번들 정상. + ## v2.2.258 (2026-06-22) ### 📝 `/meet` 회의록 — 화자 팀/역할 정규화 + 슬림 포맷 + 타임스탬프 근거 실제 회의록 산출물(자이언츠 이머시브 커머스 데모 리뷰)을 녹취 원문과 대조한 피드백을 반영. *그 회의록 한 건을 고치는 게 아니라*, 앞으로 생성될 모든 회의록의 생성 파이프라인(프롬프트+코드+검증패스)을 개선. diff --git a/assets/pixelOffice/derived/astra-bookshelf-slim.png b/assets/pixelOffice/derived/astra-bookshelf-slim.png deleted file mode 100644 index f620a3e..0000000 Binary files a/assets/pixelOffice/derived/astra-bookshelf-slim.png and /dev/null differ diff --git a/assets/pixelOffice/derived/astra-chair-task.png b/assets/pixelOffice/derived/astra-chair-task.png deleted file mode 100644 index 36e0223..0000000 Binary files a/assets/pixelOffice/derived/astra-chair-task.png and /dev/null differ diff --git a/assets/pixelOffice/derived/astra-cooler-slim.png b/assets/pixelOffice/derived/astra-cooler-slim.png deleted file mode 100644 index 0682ba0..0000000 Binary files a/assets/pixelOffice/derived/astra-cooler-slim.png and /dev/null differ diff --git a/assets/pixelOffice/derived/astra-desk-dark.png b/assets/pixelOffice/derived/astra-desk-dark.png deleted file mode 100644 index a0a24a2..0000000 Binary files a/assets/pixelOffice/derived/astra-desk-dark.png and /dev/null differ diff --git a/assets/pixelOffice/derived/astra-desk-exec.png b/assets/pixelOffice/derived/astra-desk-exec.png deleted file mode 100644 index 61f0b17..0000000 Binary files a/assets/pixelOffice/derived/astra-desk-exec.png and /dev/null differ diff --git a/assets/pixelOffice/derived/astra-desk-work.png b/assets/pixelOffice/derived/astra-desk-work.png deleted file mode 100644 index 4842524..0000000 Binary files a/assets/pixelOffice/derived/astra-desk-work.png and /dev/null differ diff --git a/assets/pixelOffice/derived/astra-plant-corner.png b/assets/pixelOffice/derived/astra-plant-corner.png deleted file mode 100644 index c1a91d0..0000000 Binary files a/assets/pixelOffice/derived/astra-plant-corner.png and /dev/null differ diff --git a/assets/pixelOffice/derived/astra-printer-compact.png b/assets/pixelOffice/derived/astra-printer-compact.png deleted file mode 100644 index aeabdba..0000000 Binary files a/assets/pixelOffice/derived/astra-printer-compact.png and /dev/null differ diff --git a/assets/pixelOffice/derived/astra-storage-low.png b/assets/pixelOffice/derived/astra-storage-low.png deleted file mode 100644 index 528dd2a..0000000 Binary files a/assets/pixelOffice/derived/astra-storage-low.png and /dev/null differ diff --git a/assets/pixelOffice/derived/board.png b/assets/pixelOffice/derived/board.png deleted file mode 100644 index bbddb53..0000000 Binary files a/assets/pixelOffice/derived/board.png and /dev/null differ diff --git a/assets/pixelOffice/derived/bookshelf.png b/assets/pixelOffice/derived/bookshelf.png deleted file mode 100644 index 7958152..0000000 Binary files a/assets/pixelOffice/derived/bookshelf.png and /dev/null differ diff --git a/assets/pixelOffice/derived/chair-blue.png b/assets/pixelOffice/derived/chair-blue.png deleted file mode 100644 index 9fb4a21..0000000 Binary files a/assets/pixelOffice/derived/chair-blue.png and /dev/null differ diff --git a/assets/pixelOffice/derived/cooler.png b/assets/pixelOffice/derived/cooler.png deleted file mode 100644 index 193a0dc..0000000 Binary files a/assets/pixelOffice/derived/cooler.png and /dev/null differ diff --git a/assets/pixelOffice/derived/couch.png b/assets/pixelOffice/derived/couch.png deleted file mode 100644 index 8c0b0a8..0000000 Binary files a/assets/pixelOffice/derived/couch.png and /dev/null differ diff --git a/assets/pixelOffice/derived/crt.png b/assets/pixelOffice/derived/crt.png deleted file mode 100644 index 86bcf00..0000000 Binary files a/assets/pixelOffice/derived/crt.png and /dev/null differ diff --git a/assets/pixelOffice/derived/desk-boss-front.png b/assets/pixelOffice/derived/desk-boss-front.png deleted file mode 100644 index b2e91ce..0000000 Binary files a/assets/pixelOffice/derived/desk-boss-front.png and /dev/null differ diff --git a/assets/pixelOffice/derived/desk-boss-mirror.png b/assets/pixelOffice/derived/desk-boss-mirror.png deleted file mode 100644 index bcc4536..0000000 Binary files a/assets/pixelOffice/derived/desk-boss-mirror.png and /dev/null differ diff --git a/assets/pixelOffice/derived/desk-boss-offset-test.png b/assets/pixelOffice/derived/desk-boss-offset-test.png deleted file mode 100644 index 019db51..0000000 Binary files a/assets/pixelOffice/derived/desk-boss-offset-test.png and /dev/null differ diff --git a/assets/pixelOffice/derived/desk-boss.png b/assets/pixelOffice/derived/desk-boss.png deleted file mode 100644 index 0413a04..0000000 Binary files a/assets/pixelOffice/derived/desk-boss.png and /dev/null differ diff --git a/assets/pixelOffice/derived/desk-dark-front.png b/assets/pixelOffice/derived/desk-dark-front.png deleted file mode 100644 index 00f6668..0000000 Binary files a/assets/pixelOffice/derived/desk-dark-front.png and /dev/null differ diff --git a/assets/pixelOffice/derived/desk-dark-mirror-seat-test.png b/assets/pixelOffice/derived/desk-dark-mirror-seat-test.png deleted file mode 100644 index 07cdc29..0000000 Binary files a/assets/pixelOffice/derived/desk-dark-mirror-seat-test.png and /dev/null differ diff --git a/assets/pixelOffice/derived/desk-dark-mirror.png b/assets/pixelOffice/derived/desk-dark-mirror.png deleted file mode 100644 index a248e24..0000000 Binary files a/assets/pixelOffice/derived/desk-dark-mirror.png and /dev/null differ diff --git a/assets/pixelOffice/derived/desk-dark-offset-test.png b/assets/pixelOffice/derived/desk-dark-offset-test.png deleted file mode 100644 index 435cee8..0000000 Binary files a/assets/pixelOffice/derived/desk-dark-offset-test.png and /dev/null differ diff --git a/assets/pixelOffice/derived/desk-dark.png b/assets/pixelOffice/derived/desk-dark.png deleted file mode 100644 index f6065e7..0000000 Binary files a/assets/pixelOffice/derived/desk-dark.png and /dev/null differ diff --git a/assets/pixelOffice/derived/desk-main-front.png b/assets/pixelOffice/derived/desk-main-front.png deleted file mode 100644 index e78dfa4..0000000 Binary files a/assets/pixelOffice/derived/desk-main-front.png and /dev/null differ diff --git a/assets/pixelOffice/derived/desk-main-mirror-seat-test.png b/assets/pixelOffice/derived/desk-main-mirror-seat-test.png deleted file mode 100644 index 79b0445..0000000 Binary files a/assets/pixelOffice/derived/desk-main-mirror-seat-test.png and /dev/null differ diff --git a/assets/pixelOffice/derived/desk-main-mirror.png b/assets/pixelOffice/derived/desk-main-mirror.png deleted file mode 100644 index 36b2032..0000000 Binary files a/assets/pixelOffice/derived/desk-main-mirror.png and /dev/null differ diff --git a/assets/pixelOffice/derived/desk-main.png b/assets/pixelOffice/derived/desk-main.png deleted file mode 100644 index 83adb9e..0000000 Binary files a/assets/pixelOffice/derived/desk-main.png and /dev/null differ diff --git a/assets/pixelOffice/derived/desk-partition.png b/assets/pixelOffice/derived/desk-partition.png deleted file mode 100644 index 9a18481..0000000 Binary files a/assets/pixelOffice/derived/desk-partition.png and /dev/null differ diff --git a/assets/pixelOffice/derived/filing.png b/assets/pixelOffice/derived/filing.png deleted file mode 100644 index ccc6318..0000000 Binary files a/assets/pixelOffice/derived/filing.png and /dev/null differ diff --git a/assets/pixelOffice/derived/idle-r0-f0.png b/assets/pixelOffice/derived/idle-r0-f0.png deleted file mode 100644 index 85045bf..0000000 Binary files a/assets/pixelOffice/derived/idle-r0-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/idle-r0-f1.png b/assets/pixelOffice/derived/idle-r0-f1.png deleted file mode 100644 index b52a3da..0000000 Binary files a/assets/pixelOffice/derived/idle-r0-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/idle-r0.png b/assets/pixelOffice/derived/idle-r0.png deleted file mode 100644 index 88de8b6..0000000 Binary files a/assets/pixelOffice/derived/idle-r0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/idle-r1-f0.png b/assets/pixelOffice/derived/idle-r1-f0.png deleted file mode 100644 index 51ee48a..0000000 Binary files a/assets/pixelOffice/derived/idle-r1-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/idle-r1-f1.png b/assets/pixelOffice/derived/idle-r1-f1.png deleted file mode 100644 index 0f30805..0000000 Binary files a/assets/pixelOffice/derived/idle-r1-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/idle-r1.png b/assets/pixelOffice/derived/idle-r1.png deleted file mode 100644 index 0bfc114..0000000 Binary files a/assets/pixelOffice/derived/idle-r1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/idle-r2-f0.png b/assets/pixelOffice/derived/idle-r2-f0.png deleted file mode 100644 index 7a098bd..0000000 Binary files a/assets/pixelOffice/derived/idle-r2-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/idle-r2-f1.png b/assets/pixelOffice/derived/idle-r2-f1.png deleted file mode 100644 index bc3269f..0000000 Binary files a/assets/pixelOffice/derived/idle-r2-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/idle-r2.png b/assets/pixelOffice/derived/idle-r2.png deleted file mode 100644 index a1f7b62..0000000 Binary files a/assets/pixelOffice/derived/idle-r2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/idle-r3-f0.png b/assets/pixelOffice/derived/idle-r3-f0.png deleted file mode 100644 index ec220ee..0000000 Binary files a/assets/pixelOffice/derived/idle-r3-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/idle-r3-f1.png b/assets/pixelOffice/derived/idle-r3-f1.png deleted file mode 100644 index 2efdcca..0000000 Binary files a/assets/pixelOffice/derived/idle-r3-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/idle-r3.png b/assets/pixelOffice/derived/idle-r3.png deleted file mode 100644 index d56ff7e..0000000 Binary files a/assets/pixelOffice/derived/idle-r3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/idle-r4-f0.png b/assets/pixelOffice/derived/idle-r4-f0.png deleted file mode 100644 index c1842e3..0000000 Binary files a/assets/pixelOffice/derived/idle-r4-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/idle-r4-f1.png b/assets/pixelOffice/derived/idle-r4-f1.png deleted file mode 100644 index 3a1412d..0000000 Binary files a/assets/pixelOffice/derived/idle-r4-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/idle-r4.png b/assets/pixelOffice/derived/idle-r4.png deleted file mode 100644 index a472f02..0000000 Binary files a/assets/pixelOffice/derived/idle-r4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/idle-r5-f0.png b/assets/pixelOffice/derived/idle-r5-f0.png deleted file mode 100644 index 106d231..0000000 Binary files a/assets/pixelOffice/derived/idle-r5-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/idle-r5-f1.png b/assets/pixelOffice/derived/idle-r5-f1.png deleted file mode 100644 index 6dca642..0000000 Binary files a/assets/pixelOffice/derived/idle-r5-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/idle-r5.png b/assets/pixelOffice/derived/idle-r5.png deleted file mode 100644 index 205e7f5..0000000 Binary files a/assets/pixelOffice/derived/idle-r5.png and /dev/null differ diff --git a/assets/pixelOffice/derived/idle-r6-f0.png b/assets/pixelOffice/derived/idle-r6-f0.png deleted file mode 100644 index ee56e1d..0000000 Binary files a/assets/pixelOffice/derived/idle-r6-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/idle-r6-f1.png b/assets/pixelOffice/derived/idle-r6-f1.png deleted file mode 100644 index 294ee72..0000000 Binary files a/assets/pixelOffice/derived/idle-r6-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/idle-r6.png b/assets/pixelOffice/derived/idle-r6.png deleted file mode 100644 index cdee04f..0000000 Binary files a/assets/pixelOffice/derived/idle-r6.png and /dev/null differ diff --git a/assets/pixelOffice/derived/idle-r7-f0.png b/assets/pixelOffice/derived/idle-r7-f0.png deleted file mode 100644 index cb0e632..0000000 Binary files a/assets/pixelOffice/derived/idle-r7-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/idle-r7-f1.png b/assets/pixelOffice/derived/idle-r7-f1.png deleted file mode 100644 index f94b686..0000000 Binary files a/assets/pixelOffice/derived/idle-r7-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/idle-r7.png b/assets/pixelOffice/derived/idle-r7.png deleted file mode 100644 index 753d6a5..0000000 Binary files a/assets/pixelOffice/derived/idle-r7.png and /dev/null differ diff --git a/assets/pixelOffice/derived/mirror-test.png b/assets/pixelOffice/derived/mirror-test.png deleted file mode 100644 index 618d343..0000000 Binary files a/assets/pixelOffice/derived/mirror-test.png and /dev/null differ diff --git a/assets/pixelOffice/derived/monitor-black.png b/assets/pixelOffice/derived/monitor-black.png deleted file mode 100644 index e3b35b4..0000000 Binary files a/assets/pixelOffice/derived/monitor-black.png and /dev/null differ diff --git a/assets/pixelOffice/derived/monitor-blue.png b/assets/pixelOffice/derived/monitor-blue.png deleted file mode 100644 index d2d2531..0000000 Binary files a/assets/pixelOffice/derived/monitor-blue.png and /dev/null differ diff --git a/assets/pixelOffice/derived/office-backdrop-astra-v2.png b/assets/pixelOffice/derived/office-backdrop-astra-v2.png deleted file mode 100644 index c190dbc..0000000 Binary files a/assets/pixelOffice/derived/office-backdrop-astra-v2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/office-backdrop-astra-v3.png b/assets/pixelOffice/derived/office-backdrop-astra-v3.png deleted file mode 100644 index 108ac82..0000000 Binary files a/assets/pixelOffice/derived/office-backdrop-astra-v3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/partition.png b/assets/pixelOffice/derived/partition.png deleted file mode 100644 index 6461562..0000000 Binary files a/assets/pixelOffice/derived/partition.png and /dev/null differ diff --git a/assets/pixelOffice/derived/plant-bushy.png b/assets/pixelOffice/derived/plant-bushy.png deleted file mode 100644 index 3408a75..0000000 Binary files a/assets/pixelOffice/derived/plant-bushy.png and /dev/null differ diff --git a/assets/pixelOffice/derived/plant-tall.png b/assets/pixelOffice/derived/plant-tall.png deleted file mode 100644 index d5100fc..0000000 Binary files a/assets/pixelOffice/derived/plant-tall.png and /dev/null differ diff --git a/assets/pixelOffice/derived/printer.png b/assets/pixelOffice/derived/printer.png deleted file mode 100644 index e99e2c3..0000000 Binary files a/assets/pixelOffice/derived/printer.png and /dev/null differ diff --git a/assets/pixelOffice/derived/rug.png b/assets/pixelOffice/derived/rug.png deleted file mode 100644 index 9bb5daa..0000000 Binary files a/assets/pixelOffice/derived/rug.png and /dev/null differ diff --git a/assets/pixelOffice/derived/seat-front-orientation-test.png b/assets/pixelOffice/derived/seat-front-orientation-test.png deleted file mode 100644 index b6ee3d0..0000000 Binary files a/assets/pixelOffice/derived/seat-front-orientation-test.png and /dev/null differ diff --git a/assets/pixelOffice/derived/shelf.png b/assets/pixelOffice/derived/shelf.png deleted file mode 100644 index ba91b39..0000000 Binary files a/assets/pixelOffice/derived/shelf.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-d0-f0.png b/assets/pixelOffice/derived/walk-r0-d0-f0.png deleted file mode 100644 index 764d056..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-d0-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-d0-f1.png b/assets/pixelOffice/derived/walk-r0-d0-f1.png deleted file mode 100644 index 52461b9..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-d0-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-d0-f2.png b/assets/pixelOffice/derived/walk-r0-d0-f2.png deleted file mode 100644 index 49ccd7d..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-d0-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-d0-f3.png b/assets/pixelOffice/derived/walk-r0-d0-f3.png deleted file mode 100644 index 3f48845..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-d0-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-d0-f4.png b/assets/pixelOffice/derived/walk-r0-d0-f4.png deleted file mode 100644 index 2355c73..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-d0-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-d1-f0.png b/assets/pixelOffice/derived/walk-r0-d1-f0.png deleted file mode 100644 index 77bc399..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-d1-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-d1-f1.png b/assets/pixelOffice/derived/walk-r0-d1-f1.png deleted file mode 100644 index dd4a394..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-d1-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-d1-f2.png b/assets/pixelOffice/derived/walk-r0-d1-f2.png deleted file mode 100644 index a32713e..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-d1-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-d1-f3.png b/assets/pixelOffice/derived/walk-r0-d1-f3.png deleted file mode 100644 index 9ceee14..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-d1-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-d1-f4.png b/assets/pixelOffice/derived/walk-r0-d1-f4.png deleted file mode 100644 index 70d97c7..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-d1-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-d2-f0.png b/assets/pixelOffice/derived/walk-r0-d2-f0.png deleted file mode 100644 index cc7f522..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-d2-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-d2-f1.png b/assets/pixelOffice/derived/walk-r0-d2-f1.png deleted file mode 100644 index ffd4de3..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-d2-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-d2-f2.png b/assets/pixelOffice/derived/walk-r0-d2-f2.png deleted file mode 100644 index 40bbd0a..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-d2-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-d2-f3.png b/assets/pixelOffice/derived/walk-r0-d2-f3.png deleted file mode 100644 index 80d5cb5..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-d2-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-d2-f4.png b/assets/pixelOffice/derived/walk-r0-d2-f4.png deleted file mode 100644 index 8876938..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-d2-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-d3-f0.png b/assets/pixelOffice/derived/walk-r0-d3-f0.png deleted file mode 100644 index 5576a51..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-d3-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-d3-f1.png b/assets/pixelOffice/derived/walk-r0-d3-f1.png deleted file mode 100644 index 0b58021..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-d3-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-d3-f2.png b/assets/pixelOffice/derived/walk-r0-d3-f2.png deleted file mode 100644 index f65556a..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-d3-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-d3-f3.png b/assets/pixelOffice/derived/walk-r0-d3-f3.png deleted file mode 100644 index 73cbf3b..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-d3-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-d3-f4.png b/assets/pixelOffice/derived/walk-r0-d3-f4.png deleted file mode 100644 index 81d3ac4..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-d3-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-f0.png b/assets/pixelOffice/derived/walk-r0-f0.png deleted file mode 100644 index 764d056..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-f1.png b/assets/pixelOffice/derived/walk-r0-f1.png deleted file mode 100644 index 52461b9..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-f10.png b/assets/pixelOffice/derived/walk-r0-f10.png deleted file mode 100644 index cc7f522..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-f10.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-f11.png b/assets/pixelOffice/derived/walk-r0-f11.png deleted file mode 100644 index ffd4de3..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-f11.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-f12.png b/assets/pixelOffice/derived/walk-r0-f12.png deleted file mode 100644 index 40bbd0a..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-f12.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-f13.png b/assets/pixelOffice/derived/walk-r0-f13.png deleted file mode 100644 index 80d5cb5..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-f13.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-f14.png b/assets/pixelOffice/derived/walk-r0-f14.png deleted file mode 100644 index 8876938..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-f14.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-f15.png b/assets/pixelOffice/derived/walk-r0-f15.png deleted file mode 100644 index 5576a51..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-f15.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-f2.png b/assets/pixelOffice/derived/walk-r0-f2.png deleted file mode 100644 index 49ccd7d..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-f3.png b/assets/pixelOffice/derived/walk-r0-f3.png deleted file mode 100644 index 3f48845..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-f4.png b/assets/pixelOffice/derived/walk-r0-f4.png deleted file mode 100644 index 2355c73..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-f5.png b/assets/pixelOffice/derived/walk-r0-f5.png deleted file mode 100644 index 77bc399..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-f5.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-f6.png b/assets/pixelOffice/derived/walk-r0-f6.png deleted file mode 100644 index dd4a394..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-f6.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-f7.png b/assets/pixelOffice/derived/walk-r0-f7.png deleted file mode 100644 index a32713e..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-f7.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-f8.png b/assets/pixelOffice/derived/walk-r0-f8.png deleted file mode 100644 index 9ceee14..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-f8.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r0-f9.png b/assets/pixelOffice/derived/walk-r0-f9.png deleted file mode 100644 index 70d97c7..0000000 Binary files a/assets/pixelOffice/derived/walk-r0-f9.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-d0-f0.png b/assets/pixelOffice/derived/walk-r1-d0-f0.png deleted file mode 100644 index 77840de..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-d0-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-d0-f1.png b/assets/pixelOffice/derived/walk-r1-d0-f1.png deleted file mode 100644 index edbf849..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-d0-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-d0-f2.png b/assets/pixelOffice/derived/walk-r1-d0-f2.png deleted file mode 100644 index c6745f5..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-d0-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-d0-f3.png b/assets/pixelOffice/derived/walk-r1-d0-f3.png deleted file mode 100644 index 5932338..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-d0-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-d0-f4.png b/assets/pixelOffice/derived/walk-r1-d0-f4.png deleted file mode 100644 index 0f0c482..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-d0-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-d1-f0.png b/assets/pixelOffice/derived/walk-r1-d1-f0.png deleted file mode 100644 index 3fc5de7..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-d1-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-d1-f1.png b/assets/pixelOffice/derived/walk-r1-d1-f1.png deleted file mode 100644 index cf7795e..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-d1-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-d1-f2.png b/assets/pixelOffice/derived/walk-r1-d1-f2.png deleted file mode 100644 index 5b4c3a8..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-d1-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-d1-f3.png b/assets/pixelOffice/derived/walk-r1-d1-f3.png deleted file mode 100644 index 47d0fdc..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-d1-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-d1-f4.png b/assets/pixelOffice/derived/walk-r1-d1-f4.png deleted file mode 100644 index ee1825f..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-d1-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-d2-f0.png b/assets/pixelOffice/derived/walk-r1-d2-f0.png deleted file mode 100644 index e0bd3bc..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-d2-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-d2-f1.png b/assets/pixelOffice/derived/walk-r1-d2-f1.png deleted file mode 100644 index 1d90c90..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-d2-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-d2-f2.png b/assets/pixelOffice/derived/walk-r1-d2-f2.png deleted file mode 100644 index 0a4e5b0..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-d2-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-d2-f3.png b/assets/pixelOffice/derived/walk-r1-d2-f3.png deleted file mode 100644 index bf4a476..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-d2-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-d2-f4.png b/assets/pixelOffice/derived/walk-r1-d2-f4.png deleted file mode 100644 index b2b58f9..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-d2-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-d3-f0.png b/assets/pixelOffice/derived/walk-r1-d3-f0.png deleted file mode 100644 index f028441..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-d3-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-d3-f1.png b/assets/pixelOffice/derived/walk-r1-d3-f1.png deleted file mode 100644 index aca5031..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-d3-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-d3-f2.png b/assets/pixelOffice/derived/walk-r1-d3-f2.png deleted file mode 100644 index 64db294..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-d3-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-d3-f3.png b/assets/pixelOffice/derived/walk-r1-d3-f3.png deleted file mode 100644 index 32a3068..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-d3-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-d3-f4.png b/assets/pixelOffice/derived/walk-r1-d3-f4.png deleted file mode 100644 index e7f4150..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-d3-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-f0.png b/assets/pixelOffice/derived/walk-r1-f0.png deleted file mode 100644 index 77840de..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-f1.png b/assets/pixelOffice/derived/walk-r1-f1.png deleted file mode 100644 index edbf849..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-f10.png b/assets/pixelOffice/derived/walk-r1-f10.png deleted file mode 100644 index e0bd3bc..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-f10.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-f11.png b/assets/pixelOffice/derived/walk-r1-f11.png deleted file mode 100644 index 1d90c90..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-f11.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-f12.png b/assets/pixelOffice/derived/walk-r1-f12.png deleted file mode 100644 index 0a4e5b0..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-f12.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-f13.png b/assets/pixelOffice/derived/walk-r1-f13.png deleted file mode 100644 index bf4a476..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-f13.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-f14.png b/assets/pixelOffice/derived/walk-r1-f14.png deleted file mode 100644 index b2b58f9..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-f14.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-f15.png b/assets/pixelOffice/derived/walk-r1-f15.png deleted file mode 100644 index f028441..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-f15.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-f2.png b/assets/pixelOffice/derived/walk-r1-f2.png deleted file mode 100644 index c6745f5..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-f3.png b/assets/pixelOffice/derived/walk-r1-f3.png deleted file mode 100644 index 5932338..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-f4.png b/assets/pixelOffice/derived/walk-r1-f4.png deleted file mode 100644 index 0f0c482..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-f5.png b/assets/pixelOffice/derived/walk-r1-f5.png deleted file mode 100644 index 3fc5de7..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-f5.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-f6.png b/assets/pixelOffice/derived/walk-r1-f6.png deleted file mode 100644 index cf7795e..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-f6.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-f7.png b/assets/pixelOffice/derived/walk-r1-f7.png deleted file mode 100644 index 5b4c3a8..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-f7.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-f8.png b/assets/pixelOffice/derived/walk-r1-f8.png deleted file mode 100644 index 47d0fdc..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-f8.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r1-f9.png b/assets/pixelOffice/derived/walk-r1-f9.png deleted file mode 100644 index ee1825f..0000000 Binary files a/assets/pixelOffice/derived/walk-r1-f9.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-d0-f0.png b/assets/pixelOffice/derived/walk-r2-d0-f0.png deleted file mode 100644 index 86a55a9..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-d0-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-d0-f1.png b/assets/pixelOffice/derived/walk-r2-d0-f1.png deleted file mode 100644 index 3534900..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-d0-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-d0-f2.png b/assets/pixelOffice/derived/walk-r2-d0-f2.png deleted file mode 100644 index 54d639b..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-d0-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-d0-f3.png b/assets/pixelOffice/derived/walk-r2-d0-f3.png deleted file mode 100644 index ba0c46b..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-d0-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-d0-f4.png b/assets/pixelOffice/derived/walk-r2-d0-f4.png deleted file mode 100644 index 50e4d24..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-d0-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-d1-f0.png b/assets/pixelOffice/derived/walk-r2-d1-f0.png deleted file mode 100644 index 0f24453..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-d1-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-d1-f1.png b/assets/pixelOffice/derived/walk-r2-d1-f1.png deleted file mode 100644 index 3b0910c..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-d1-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-d1-f2.png b/assets/pixelOffice/derived/walk-r2-d1-f2.png deleted file mode 100644 index bd02a1a..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-d1-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-d1-f3.png b/assets/pixelOffice/derived/walk-r2-d1-f3.png deleted file mode 100644 index b7a7e1e..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-d1-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-d1-f4.png b/assets/pixelOffice/derived/walk-r2-d1-f4.png deleted file mode 100644 index ec24bc9..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-d1-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-d2-f0.png b/assets/pixelOffice/derived/walk-r2-d2-f0.png deleted file mode 100644 index bdde9fc..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-d2-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-d2-f1.png b/assets/pixelOffice/derived/walk-r2-d2-f1.png deleted file mode 100644 index 4d5d1c6..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-d2-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-d2-f2.png b/assets/pixelOffice/derived/walk-r2-d2-f2.png deleted file mode 100644 index 2bde84b..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-d2-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-d2-f3.png b/assets/pixelOffice/derived/walk-r2-d2-f3.png deleted file mode 100644 index e10c78d..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-d2-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-d2-f4.png b/assets/pixelOffice/derived/walk-r2-d2-f4.png deleted file mode 100644 index fe270a4..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-d2-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-d3-f0.png b/assets/pixelOffice/derived/walk-r2-d3-f0.png deleted file mode 100644 index 66a6453..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-d3-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-d3-f1.png b/assets/pixelOffice/derived/walk-r2-d3-f1.png deleted file mode 100644 index 5759ea0..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-d3-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-d3-f2.png b/assets/pixelOffice/derived/walk-r2-d3-f2.png deleted file mode 100644 index ffa9b9b..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-d3-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-d3-f3.png b/assets/pixelOffice/derived/walk-r2-d3-f3.png deleted file mode 100644 index 81fe925..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-d3-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-d3-f4.png b/assets/pixelOffice/derived/walk-r2-d3-f4.png deleted file mode 100644 index df3f04a..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-d3-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-f0.png b/assets/pixelOffice/derived/walk-r2-f0.png deleted file mode 100644 index 86a55a9..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-f1.png b/assets/pixelOffice/derived/walk-r2-f1.png deleted file mode 100644 index 3534900..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-f10.png b/assets/pixelOffice/derived/walk-r2-f10.png deleted file mode 100644 index bdde9fc..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-f10.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-f11.png b/assets/pixelOffice/derived/walk-r2-f11.png deleted file mode 100644 index 4d5d1c6..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-f11.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-f12.png b/assets/pixelOffice/derived/walk-r2-f12.png deleted file mode 100644 index 2bde84b..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-f12.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-f13.png b/assets/pixelOffice/derived/walk-r2-f13.png deleted file mode 100644 index e10c78d..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-f13.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-f14.png b/assets/pixelOffice/derived/walk-r2-f14.png deleted file mode 100644 index fe270a4..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-f14.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-f15.png b/assets/pixelOffice/derived/walk-r2-f15.png deleted file mode 100644 index 66a6453..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-f15.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-f2.png b/assets/pixelOffice/derived/walk-r2-f2.png deleted file mode 100644 index 54d639b..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-f3.png b/assets/pixelOffice/derived/walk-r2-f3.png deleted file mode 100644 index ba0c46b..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-f4.png b/assets/pixelOffice/derived/walk-r2-f4.png deleted file mode 100644 index 50e4d24..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-f5.png b/assets/pixelOffice/derived/walk-r2-f5.png deleted file mode 100644 index 0f24453..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-f5.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-f6.png b/assets/pixelOffice/derived/walk-r2-f6.png deleted file mode 100644 index 3b0910c..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-f6.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-f7.png b/assets/pixelOffice/derived/walk-r2-f7.png deleted file mode 100644 index bd02a1a..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-f7.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-f8.png b/assets/pixelOffice/derived/walk-r2-f8.png deleted file mode 100644 index b7a7e1e..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-f8.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r2-f9.png b/assets/pixelOffice/derived/walk-r2-f9.png deleted file mode 100644 index ec24bc9..0000000 Binary files a/assets/pixelOffice/derived/walk-r2-f9.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-d0-f0.png b/assets/pixelOffice/derived/walk-r3-d0-f0.png deleted file mode 100644 index f44ce8c..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-d0-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-d0-f1.png b/assets/pixelOffice/derived/walk-r3-d0-f1.png deleted file mode 100644 index 526b382..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-d0-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-d0-f2.png b/assets/pixelOffice/derived/walk-r3-d0-f2.png deleted file mode 100644 index f508399..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-d0-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-d0-f3.png b/assets/pixelOffice/derived/walk-r3-d0-f3.png deleted file mode 100644 index 2c9daaa..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-d0-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-d0-f4.png b/assets/pixelOffice/derived/walk-r3-d0-f4.png deleted file mode 100644 index eb86f4c..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-d0-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-d1-f0.png b/assets/pixelOffice/derived/walk-r3-d1-f0.png deleted file mode 100644 index 59213c5..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-d1-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-d1-f1.png b/assets/pixelOffice/derived/walk-r3-d1-f1.png deleted file mode 100644 index 659b463..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-d1-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-d1-f2.png b/assets/pixelOffice/derived/walk-r3-d1-f2.png deleted file mode 100644 index c301566..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-d1-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-d1-f3.png b/assets/pixelOffice/derived/walk-r3-d1-f3.png deleted file mode 100644 index 5dfc7fa..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-d1-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-d1-f4.png b/assets/pixelOffice/derived/walk-r3-d1-f4.png deleted file mode 100644 index b5f3d4a..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-d1-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-d2-f0.png b/assets/pixelOffice/derived/walk-r3-d2-f0.png deleted file mode 100644 index 79e2526..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-d2-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-d2-f1.png b/assets/pixelOffice/derived/walk-r3-d2-f1.png deleted file mode 100644 index b464384..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-d2-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-d2-f2.png b/assets/pixelOffice/derived/walk-r3-d2-f2.png deleted file mode 100644 index 4d115ea..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-d2-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-d2-f3.png b/assets/pixelOffice/derived/walk-r3-d2-f3.png deleted file mode 100644 index 72c7040..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-d2-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-d2-f4.png b/assets/pixelOffice/derived/walk-r3-d2-f4.png deleted file mode 100644 index 0aecede..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-d2-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-d3-f0.png b/assets/pixelOffice/derived/walk-r3-d3-f0.png deleted file mode 100644 index a326d16..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-d3-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-d3-f1.png b/assets/pixelOffice/derived/walk-r3-d3-f1.png deleted file mode 100644 index ca053c8..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-d3-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-d3-f2.png b/assets/pixelOffice/derived/walk-r3-d3-f2.png deleted file mode 100644 index 50fe79c..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-d3-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-d3-f3.png b/assets/pixelOffice/derived/walk-r3-d3-f3.png deleted file mode 100644 index f3780a9..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-d3-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-d3-f4.png b/assets/pixelOffice/derived/walk-r3-d3-f4.png deleted file mode 100644 index 70403a2..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-d3-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-f0.png b/assets/pixelOffice/derived/walk-r3-f0.png deleted file mode 100644 index f44ce8c..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-f1.png b/assets/pixelOffice/derived/walk-r3-f1.png deleted file mode 100644 index 526b382..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-f10.png b/assets/pixelOffice/derived/walk-r3-f10.png deleted file mode 100644 index 79e2526..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-f10.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-f11.png b/assets/pixelOffice/derived/walk-r3-f11.png deleted file mode 100644 index b464384..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-f11.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-f12.png b/assets/pixelOffice/derived/walk-r3-f12.png deleted file mode 100644 index 4d115ea..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-f12.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-f13.png b/assets/pixelOffice/derived/walk-r3-f13.png deleted file mode 100644 index 72c7040..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-f13.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-f14.png b/assets/pixelOffice/derived/walk-r3-f14.png deleted file mode 100644 index 0aecede..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-f14.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-f15.png b/assets/pixelOffice/derived/walk-r3-f15.png deleted file mode 100644 index a326d16..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-f15.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-f2.png b/assets/pixelOffice/derived/walk-r3-f2.png deleted file mode 100644 index f508399..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-f3.png b/assets/pixelOffice/derived/walk-r3-f3.png deleted file mode 100644 index 2c9daaa..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-f4.png b/assets/pixelOffice/derived/walk-r3-f4.png deleted file mode 100644 index eb86f4c..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-f5.png b/assets/pixelOffice/derived/walk-r3-f5.png deleted file mode 100644 index 59213c5..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-f5.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-f6.png b/assets/pixelOffice/derived/walk-r3-f6.png deleted file mode 100644 index 659b463..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-f6.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-f7.png b/assets/pixelOffice/derived/walk-r3-f7.png deleted file mode 100644 index c301566..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-f7.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-f8.png b/assets/pixelOffice/derived/walk-r3-f8.png deleted file mode 100644 index 5dfc7fa..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-f8.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r3-f9.png b/assets/pixelOffice/derived/walk-r3-f9.png deleted file mode 100644 index b5f3d4a..0000000 Binary files a/assets/pixelOffice/derived/walk-r3-f9.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-d0-f0.png b/assets/pixelOffice/derived/walk-r4-d0-f0.png deleted file mode 100644 index ed773d6..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-d0-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-d0-f1.png b/assets/pixelOffice/derived/walk-r4-d0-f1.png deleted file mode 100644 index 5c9723a..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-d0-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-d0-f2.png b/assets/pixelOffice/derived/walk-r4-d0-f2.png deleted file mode 100644 index bf5488b..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-d0-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-d0-f3.png b/assets/pixelOffice/derived/walk-r4-d0-f3.png deleted file mode 100644 index e369a85..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-d0-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-d0-f4.png b/assets/pixelOffice/derived/walk-r4-d0-f4.png deleted file mode 100644 index 6ac4186..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-d0-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-d1-f0.png b/assets/pixelOffice/derived/walk-r4-d1-f0.png deleted file mode 100644 index b9eb1e4..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-d1-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-d1-f1.png b/assets/pixelOffice/derived/walk-r4-d1-f1.png deleted file mode 100644 index df36374..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-d1-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-d1-f2.png b/assets/pixelOffice/derived/walk-r4-d1-f2.png deleted file mode 100644 index 127a082..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-d1-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-d1-f3.png b/assets/pixelOffice/derived/walk-r4-d1-f3.png deleted file mode 100644 index 2dcbf7b..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-d1-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-d1-f4.png b/assets/pixelOffice/derived/walk-r4-d1-f4.png deleted file mode 100644 index c03de6d..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-d1-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-d2-f0.png b/assets/pixelOffice/derived/walk-r4-d2-f0.png deleted file mode 100644 index b001b42..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-d2-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-d2-f1.png b/assets/pixelOffice/derived/walk-r4-d2-f1.png deleted file mode 100644 index d167b5b..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-d2-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-d2-f2.png b/assets/pixelOffice/derived/walk-r4-d2-f2.png deleted file mode 100644 index 947e791..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-d2-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-d2-f3.png b/assets/pixelOffice/derived/walk-r4-d2-f3.png deleted file mode 100644 index 9585be3..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-d2-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-d2-f4.png b/assets/pixelOffice/derived/walk-r4-d2-f4.png deleted file mode 100644 index 3ccec21..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-d2-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-d3-f0.png b/assets/pixelOffice/derived/walk-r4-d3-f0.png deleted file mode 100644 index 4bbce0f..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-d3-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-d3-f1.png b/assets/pixelOffice/derived/walk-r4-d3-f1.png deleted file mode 100644 index d5ad520..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-d3-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-d3-f2.png b/assets/pixelOffice/derived/walk-r4-d3-f2.png deleted file mode 100644 index 81083f2..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-d3-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-d3-f3.png b/assets/pixelOffice/derived/walk-r4-d3-f3.png deleted file mode 100644 index d5462e0..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-d3-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-d3-f4.png b/assets/pixelOffice/derived/walk-r4-d3-f4.png deleted file mode 100644 index a38ddd3..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-d3-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-f0.png b/assets/pixelOffice/derived/walk-r4-f0.png deleted file mode 100644 index ed773d6..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-f1.png b/assets/pixelOffice/derived/walk-r4-f1.png deleted file mode 100644 index 5c9723a..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-f10.png b/assets/pixelOffice/derived/walk-r4-f10.png deleted file mode 100644 index b001b42..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-f10.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-f11.png b/assets/pixelOffice/derived/walk-r4-f11.png deleted file mode 100644 index d167b5b..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-f11.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-f12.png b/assets/pixelOffice/derived/walk-r4-f12.png deleted file mode 100644 index 947e791..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-f12.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-f13.png b/assets/pixelOffice/derived/walk-r4-f13.png deleted file mode 100644 index 9585be3..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-f13.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-f14.png b/assets/pixelOffice/derived/walk-r4-f14.png deleted file mode 100644 index 3ccec21..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-f14.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-f15.png b/assets/pixelOffice/derived/walk-r4-f15.png deleted file mode 100644 index 4bbce0f..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-f15.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-f2.png b/assets/pixelOffice/derived/walk-r4-f2.png deleted file mode 100644 index bf5488b..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-f3.png b/assets/pixelOffice/derived/walk-r4-f3.png deleted file mode 100644 index e369a85..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-f4.png b/assets/pixelOffice/derived/walk-r4-f4.png deleted file mode 100644 index 6ac4186..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-f5.png b/assets/pixelOffice/derived/walk-r4-f5.png deleted file mode 100644 index b9eb1e4..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-f5.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-f6.png b/assets/pixelOffice/derived/walk-r4-f6.png deleted file mode 100644 index df36374..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-f6.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-f7.png b/assets/pixelOffice/derived/walk-r4-f7.png deleted file mode 100644 index 127a082..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-f7.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-f8.png b/assets/pixelOffice/derived/walk-r4-f8.png deleted file mode 100644 index 2dcbf7b..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-f8.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r4-f9.png b/assets/pixelOffice/derived/walk-r4-f9.png deleted file mode 100644 index c03de6d..0000000 Binary files a/assets/pixelOffice/derived/walk-r4-f9.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-d0-f0.png b/assets/pixelOffice/derived/walk-r5-d0-f0.png deleted file mode 100644 index f9ed0d1..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-d0-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-d0-f1.png b/assets/pixelOffice/derived/walk-r5-d0-f1.png deleted file mode 100644 index dc79f96..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-d0-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-d0-f2.png b/assets/pixelOffice/derived/walk-r5-d0-f2.png deleted file mode 100644 index 8ffd6a3..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-d0-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-d0-f3.png b/assets/pixelOffice/derived/walk-r5-d0-f3.png deleted file mode 100644 index 6791d15..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-d0-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-d0-f4.png b/assets/pixelOffice/derived/walk-r5-d0-f4.png deleted file mode 100644 index 62bdb6e..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-d0-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-d1-f0.png b/assets/pixelOffice/derived/walk-r5-d1-f0.png deleted file mode 100644 index 51762b7..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-d1-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-d1-f1.png b/assets/pixelOffice/derived/walk-r5-d1-f1.png deleted file mode 100644 index 00902d8..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-d1-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-d1-f2.png b/assets/pixelOffice/derived/walk-r5-d1-f2.png deleted file mode 100644 index 4a9fbc4..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-d1-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-d1-f3.png b/assets/pixelOffice/derived/walk-r5-d1-f3.png deleted file mode 100644 index 6a92e32..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-d1-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-d1-f4.png b/assets/pixelOffice/derived/walk-r5-d1-f4.png deleted file mode 100644 index fc1270d..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-d1-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-d2-f0.png b/assets/pixelOffice/derived/walk-r5-d2-f0.png deleted file mode 100644 index 0c939cc..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-d2-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-d2-f1.png b/assets/pixelOffice/derived/walk-r5-d2-f1.png deleted file mode 100644 index f2afda3..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-d2-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-d2-f2.png b/assets/pixelOffice/derived/walk-r5-d2-f2.png deleted file mode 100644 index 18dbf79..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-d2-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-d2-f3.png b/assets/pixelOffice/derived/walk-r5-d2-f3.png deleted file mode 100644 index 81da368..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-d2-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-d2-f4.png b/assets/pixelOffice/derived/walk-r5-d2-f4.png deleted file mode 100644 index 1ee98b6..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-d2-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-d3-f0.png b/assets/pixelOffice/derived/walk-r5-d3-f0.png deleted file mode 100644 index 0a2bcbf..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-d3-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-d3-f1.png b/assets/pixelOffice/derived/walk-r5-d3-f1.png deleted file mode 100644 index 83cea80..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-d3-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-d3-f2.png b/assets/pixelOffice/derived/walk-r5-d3-f2.png deleted file mode 100644 index 445901c..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-d3-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-d3-f3.png b/assets/pixelOffice/derived/walk-r5-d3-f3.png deleted file mode 100644 index 40e8f46..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-d3-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-d3-f4.png b/assets/pixelOffice/derived/walk-r5-d3-f4.png deleted file mode 100644 index 547d4fc..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-d3-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-f0.png b/assets/pixelOffice/derived/walk-r5-f0.png deleted file mode 100644 index f9ed0d1..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-f1.png b/assets/pixelOffice/derived/walk-r5-f1.png deleted file mode 100644 index dc79f96..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-f10.png b/assets/pixelOffice/derived/walk-r5-f10.png deleted file mode 100644 index 0c939cc..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-f10.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-f11.png b/assets/pixelOffice/derived/walk-r5-f11.png deleted file mode 100644 index f2afda3..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-f11.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-f12.png b/assets/pixelOffice/derived/walk-r5-f12.png deleted file mode 100644 index 18dbf79..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-f12.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-f13.png b/assets/pixelOffice/derived/walk-r5-f13.png deleted file mode 100644 index 81da368..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-f13.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-f14.png b/assets/pixelOffice/derived/walk-r5-f14.png deleted file mode 100644 index 1ee98b6..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-f14.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-f15.png b/assets/pixelOffice/derived/walk-r5-f15.png deleted file mode 100644 index 0a2bcbf..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-f15.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-f2.png b/assets/pixelOffice/derived/walk-r5-f2.png deleted file mode 100644 index 8ffd6a3..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-f3.png b/assets/pixelOffice/derived/walk-r5-f3.png deleted file mode 100644 index 6791d15..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-f4.png b/assets/pixelOffice/derived/walk-r5-f4.png deleted file mode 100644 index 62bdb6e..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-f5.png b/assets/pixelOffice/derived/walk-r5-f5.png deleted file mode 100644 index 51762b7..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-f5.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-f6.png b/assets/pixelOffice/derived/walk-r5-f6.png deleted file mode 100644 index 00902d8..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-f6.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-f7.png b/assets/pixelOffice/derived/walk-r5-f7.png deleted file mode 100644 index 4a9fbc4..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-f7.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-f8.png b/assets/pixelOffice/derived/walk-r5-f8.png deleted file mode 100644 index 6a92e32..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-f8.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r5-f9.png b/assets/pixelOffice/derived/walk-r5-f9.png deleted file mode 100644 index fc1270d..0000000 Binary files a/assets/pixelOffice/derived/walk-r5-f9.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-d0-f0.png b/assets/pixelOffice/derived/walk-r6-d0-f0.png deleted file mode 100644 index c5119d9..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-d0-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-d0-f1.png b/assets/pixelOffice/derived/walk-r6-d0-f1.png deleted file mode 100644 index 6c28e4f..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-d0-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-d0-f2.png b/assets/pixelOffice/derived/walk-r6-d0-f2.png deleted file mode 100644 index bcdf9e9..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-d0-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-d0-f3.png b/assets/pixelOffice/derived/walk-r6-d0-f3.png deleted file mode 100644 index af2a4f7..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-d0-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-d0-f4.png b/assets/pixelOffice/derived/walk-r6-d0-f4.png deleted file mode 100644 index 120fb53..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-d0-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-d1-f0.png b/assets/pixelOffice/derived/walk-r6-d1-f0.png deleted file mode 100644 index cf1f6b5..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-d1-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-d1-f1.png b/assets/pixelOffice/derived/walk-r6-d1-f1.png deleted file mode 100644 index aa226e0..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-d1-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-d1-f2.png b/assets/pixelOffice/derived/walk-r6-d1-f2.png deleted file mode 100644 index 3c86f52..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-d1-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-d1-f3.png b/assets/pixelOffice/derived/walk-r6-d1-f3.png deleted file mode 100644 index d97f40e..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-d1-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-d1-f4.png b/assets/pixelOffice/derived/walk-r6-d1-f4.png deleted file mode 100644 index aa52b56..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-d1-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-d2-f0.png b/assets/pixelOffice/derived/walk-r6-d2-f0.png deleted file mode 100644 index 7758685..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-d2-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-d2-f1.png b/assets/pixelOffice/derived/walk-r6-d2-f1.png deleted file mode 100644 index a3542e7..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-d2-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-d2-f2.png b/assets/pixelOffice/derived/walk-r6-d2-f2.png deleted file mode 100644 index e8c5dd0..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-d2-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-d2-f3.png b/assets/pixelOffice/derived/walk-r6-d2-f3.png deleted file mode 100644 index d52fcbf..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-d2-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-d2-f4.png b/assets/pixelOffice/derived/walk-r6-d2-f4.png deleted file mode 100644 index b1149ed..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-d2-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-d3-f0.png b/assets/pixelOffice/derived/walk-r6-d3-f0.png deleted file mode 100644 index 05fbbdf..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-d3-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-d3-f1.png b/assets/pixelOffice/derived/walk-r6-d3-f1.png deleted file mode 100644 index df1e53d..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-d3-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-d3-f2.png b/assets/pixelOffice/derived/walk-r6-d3-f2.png deleted file mode 100644 index 388c4ba..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-d3-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-d3-f3.png b/assets/pixelOffice/derived/walk-r6-d3-f3.png deleted file mode 100644 index e7c7cb9..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-d3-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-d3-f4.png b/assets/pixelOffice/derived/walk-r6-d3-f4.png deleted file mode 100644 index 375b866..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-d3-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-f0.png b/assets/pixelOffice/derived/walk-r6-f0.png deleted file mode 100644 index c5119d9..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-f1.png b/assets/pixelOffice/derived/walk-r6-f1.png deleted file mode 100644 index 6c28e4f..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-f10.png b/assets/pixelOffice/derived/walk-r6-f10.png deleted file mode 100644 index 7758685..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-f10.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-f11.png b/assets/pixelOffice/derived/walk-r6-f11.png deleted file mode 100644 index a3542e7..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-f11.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-f12.png b/assets/pixelOffice/derived/walk-r6-f12.png deleted file mode 100644 index e8c5dd0..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-f12.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-f13.png b/assets/pixelOffice/derived/walk-r6-f13.png deleted file mode 100644 index d52fcbf..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-f13.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-f14.png b/assets/pixelOffice/derived/walk-r6-f14.png deleted file mode 100644 index b1149ed..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-f14.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-f15.png b/assets/pixelOffice/derived/walk-r6-f15.png deleted file mode 100644 index 05fbbdf..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-f15.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-f2.png b/assets/pixelOffice/derived/walk-r6-f2.png deleted file mode 100644 index bcdf9e9..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-f3.png b/assets/pixelOffice/derived/walk-r6-f3.png deleted file mode 100644 index af2a4f7..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-f4.png b/assets/pixelOffice/derived/walk-r6-f4.png deleted file mode 100644 index 120fb53..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-f5.png b/assets/pixelOffice/derived/walk-r6-f5.png deleted file mode 100644 index cf1f6b5..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-f5.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-f6.png b/assets/pixelOffice/derived/walk-r6-f6.png deleted file mode 100644 index aa226e0..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-f6.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-f7.png b/assets/pixelOffice/derived/walk-r6-f7.png deleted file mode 100644 index 3c86f52..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-f7.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-f8.png b/assets/pixelOffice/derived/walk-r6-f8.png deleted file mode 100644 index d97f40e..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-f8.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r6-f9.png b/assets/pixelOffice/derived/walk-r6-f9.png deleted file mode 100644 index aa52b56..0000000 Binary files a/assets/pixelOffice/derived/walk-r6-f9.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-d0-f0.png b/assets/pixelOffice/derived/walk-r7-d0-f0.png deleted file mode 100644 index 460ec3e..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-d0-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-d0-f1.png b/assets/pixelOffice/derived/walk-r7-d0-f1.png deleted file mode 100644 index 8e52371..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-d0-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-d0-f2.png b/assets/pixelOffice/derived/walk-r7-d0-f2.png deleted file mode 100644 index b201d23..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-d0-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-d0-f3.png b/assets/pixelOffice/derived/walk-r7-d0-f3.png deleted file mode 100644 index 8945c9b..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-d0-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-d0-f4.png b/assets/pixelOffice/derived/walk-r7-d0-f4.png deleted file mode 100644 index 1634ebc..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-d0-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-d1-f0.png b/assets/pixelOffice/derived/walk-r7-d1-f0.png deleted file mode 100644 index f66c491..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-d1-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-d1-f1.png b/assets/pixelOffice/derived/walk-r7-d1-f1.png deleted file mode 100644 index 2cb30a7..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-d1-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-d1-f2.png b/assets/pixelOffice/derived/walk-r7-d1-f2.png deleted file mode 100644 index 2706481..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-d1-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-d1-f3.png b/assets/pixelOffice/derived/walk-r7-d1-f3.png deleted file mode 100644 index eac0def..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-d1-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-d1-f4.png b/assets/pixelOffice/derived/walk-r7-d1-f4.png deleted file mode 100644 index 6fbb9bc..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-d1-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-d2-f0.png b/assets/pixelOffice/derived/walk-r7-d2-f0.png deleted file mode 100644 index 7260b0b..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-d2-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-d2-f1.png b/assets/pixelOffice/derived/walk-r7-d2-f1.png deleted file mode 100644 index 4d763b2..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-d2-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-d2-f2.png b/assets/pixelOffice/derived/walk-r7-d2-f2.png deleted file mode 100644 index 07a214f..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-d2-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-d2-f3.png b/assets/pixelOffice/derived/walk-r7-d2-f3.png deleted file mode 100644 index 36c6c26..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-d2-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-d2-f4.png b/assets/pixelOffice/derived/walk-r7-d2-f4.png deleted file mode 100644 index 555f370..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-d2-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-d3-f0.png b/assets/pixelOffice/derived/walk-r7-d3-f0.png deleted file mode 100644 index 19587c8..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-d3-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-d3-f1.png b/assets/pixelOffice/derived/walk-r7-d3-f1.png deleted file mode 100644 index 8fca445..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-d3-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-d3-f2.png b/assets/pixelOffice/derived/walk-r7-d3-f2.png deleted file mode 100644 index f586cd4..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-d3-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-d3-f3.png b/assets/pixelOffice/derived/walk-r7-d3-f3.png deleted file mode 100644 index 5cbba3c..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-d3-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-d3-f4.png b/assets/pixelOffice/derived/walk-r7-d3-f4.png deleted file mode 100644 index a68d970..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-d3-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-f0.png b/assets/pixelOffice/derived/walk-r7-f0.png deleted file mode 100644 index 460ec3e..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-f1.png b/assets/pixelOffice/derived/walk-r7-f1.png deleted file mode 100644 index 8e52371..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-f10.png b/assets/pixelOffice/derived/walk-r7-f10.png deleted file mode 100644 index 7260b0b..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-f10.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-f11.png b/assets/pixelOffice/derived/walk-r7-f11.png deleted file mode 100644 index 4d763b2..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-f11.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-f12.png b/assets/pixelOffice/derived/walk-r7-f12.png deleted file mode 100644 index 07a214f..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-f12.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-f13.png b/assets/pixelOffice/derived/walk-r7-f13.png deleted file mode 100644 index 36c6c26..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-f13.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-f14.png b/assets/pixelOffice/derived/walk-r7-f14.png deleted file mode 100644 index 555f370..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-f14.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-f15.png b/assets/pixelOffice/derived/walk-r7-f15.png deleted file mode 100644 index 19587c8..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-f15.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-f2.png b/assets/pixelOffice/derived/walk-r7-f2.png deleted file mode 100644 index b201d23..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-f3.png b/assets/pixelOffice/derived/walk-r7-f3.png deleted file mode 100644 index 8945c9b..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-f4.png b/assets/pixelOffice/derived/walk-r7-f4.png deleted file mode 100644 index 1634ebc..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-f4.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-f5.png b/assets/pixelOffice/derived/walk-r7-f5.png deleted file mode 100644 index f66c491..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-f5.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-f6.png b/assets/pixelOffice/derived/walk-r7-f6.png deleted file mode 100644 index 2cb30a7..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-f6.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-f7.png b/assets/pixelOffice/derived/walk-r7-f7.png deleted file mode 100644 index 2706481..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-f7.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-f8.png b/assets/pixelOffice/derived/walk-r7-f8.png deleted file mode 100644 index eac0def..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-f8.png and /dev/null differ diff --git a/assets/pixelOffice/derived/walk-r7-f9.png b/assets/pixelOffice/derived/walk-r7-f9.png deleted file mode 100644 index 6fbb9bc..0000000 Binary files a/assets/pixelOffice/derived/walk-r7-f9.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r0-f0.png b/assets/pixelOffice/derived/work-r0-f0.png deleted file mode 100644 index 5f0a9f3..0000000 Binary files a/assets/pixelOffice/derived/work-r0-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r0-f1.png b/assets/pixelOffice/derived/work-r0-f1.png deleted file mode 100644 index 24ab106..0000000 Binary files a/assets/pixelOffice/derived/work-r0-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r0-f2.png b/assets/pixelOffice/derived/work-r0-f2.png deleted file mode 100644 index 016b635..0000000 Binary files a/assets/pixelOffice/derived/work-r0-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r0-f3.png b/assets/pixelOffice/derived/work-r0-f3.png deleted file mode 100644 index 79807bb..0000000 Binary files a/assets/pixelOffice/derived/work-r0-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r1-f0.png b/assets/pixelOffice/derived/work-r1-f0.png deleted file mode 100644 index 979d521..0000000 Binary files a/assets/pixelOffice/derived/work-r1-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r1-f1.png b/assets/pixelOffice/derived/work-r1-f1.png deleted file mode 100644 index e87f71e..0000000 Binary files a/assets/pixelOffice/derived/work-r1-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r1-f2.png b/assets/pixelOffice/derived/work-r1-f2.png deleted file mode 100644 index db9880b..0000000 Binary files a/assets/pixelOffice/derived/work-r1-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r1-f3.png b/assets/pixelOffice/derived/work-r1-f3.png deleted file mode 100644 index 936e079..0000000 Binary files a/assets/pixelOffice/derived/work-r1-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r2-f0.png b/assets/pixelOffice/derived/work-r2-f0.png deleted file mode 100644 index a0e7ccd..0000000 Binary files a/assets/pixelOffice/derived/work-r2-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r2-f1.png b/assets/pixelOffice/derived/work-r2-f1.png deleted file mode 100644 index 39b1232..0000000 Binary files a/assets/pixelOffice/derived/work-r2-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r2-f2.png b/assets/pixelOffice/derived/work-r2-f2.png deleted file mode 100644 index 426a377..0000000 Binary files a/assets/pixelOffice/derived/work-r2-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r2-f3.png b/assets/pixelOffice/derived/work-r2-f3.png deleted file mode 100644 index 2ba0754..0000000 Binary files a/assets/pixelOffice/derived/work-r2-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r3-f0.png b/assets/pixelOffice/derived/work-r3-f0.png deleted file mode 100644 index 365eddf..0000000 Binary files a/assets/pixelOffice/derived/work-r3-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r3-f1.png b/assets/pixelOffice/derived/work-r3-f1.png deleted file mode 100644 index 09cf190..0000000 Binary files a/assets/pixelOffice/derived/work-r3-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r3-f2.png b/assets/pixelOffice/derived/work-r3-f2.png deleted file mode 100644 index 0352c39..0000000 Binary files a/assets/pixelOffice/derived/work-r3-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r3-f3.png b/assets/pixelOffice/derived/work-r3-f3.png deleted file mode 100644 index 992cb94..0000000 Binary files a/assets/pixelOffice/derived/work-r3-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r4-f0.png b/assets/pixelOffice/derived/work-r4-f0.png deleted file mode 100644 index 760edbd..0000000 Binary files a/assets/pixelOffice/derived/work-r4-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r4-f1.png b/assets/pixelOffice/derived/work-r4-f1.png deleted file mode 100644 index 288bcfa..0000000 Binary files a/assets/pixelOffice/derived/work-r4-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r4-f2.png b/assets/pixelOffice/derived/work-r4-f2.png deleted file mode 100644 index e1e1733..0000000 Binary files a/assets/pixelOffice/derived/work-r4-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r4-f3.png b/assets/pixelOffice/derived/work-r4-f3.png deleted file mode 100644 index f0a0303..0000000 Binary files a/assets/pixelOffice/derived/work-r4-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r5-f0.png b/assets/pixelOffice/derived/work-r5-f0.png deleted file mode 100644 index 23ddb44..0000000 Binary files a/assets/pixelOffice/derived/work-r5-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r5-f1.png b/assets/pixelOffice/derived/work-r5-f1.png deleted file mode 100644 index df388af..0000000 Binary files a/assets/pixelOffice/derived/work-r5-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r5-f2.png b/assets/pixelOffice/derived/work-r5-f2.png deleted file mode 100644 index 22eab75..0000000 Binary files a/assets/pixelOffice/derived/work-r5-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r5-f3.png b/assets/pixelOffice/derived/work-r5-f3.png deleted file mode 100644 index c19c905..0000000 Binary files a/assets/pixelOffice/derived/work-r5-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r6-f0.png b/assets/pixelOffice/derived/work-r6-f0.png deleted file mode 100644 index b1b048d..0000000 Binary files a/assets/pixelOffice/derived/work-r6-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r6-f1.png b/assets/pixelOffice/derived/work-r6-f1.png deleted file mode 100644 index 5b90079..0000000 Binary files a/assets/pixelOffice/derived/work-r6-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r6-f2.png b/assets/pixelOffice/derived/work-r6-f2.png deleted file mode 100644 index b8c7837..0000000 Binary files a/assets/pixelOffice/derived/work-r6-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r6-f3.png b/assets/pixelOffice/derived/work-r6-f3.png deleted file mode 100644 index 58eaa05..0000000 Binary files a/assets/pixelOffice/derived/work-r6-f3.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r7-f0.png b/assets/pixelOffice/derived/work-r7-f0.png deleted file mode 100644 index a280610..0000000 Binary files a/assets/pixelOffice/derived/work-r7-f0.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r7-f1.png b/assets/pixelOffice/derived/work-r7-f1.png deleted file mode 100644 index 0f14dd7..0000000 Binary files a/assets/pixelOffice/derived/work-r7-f1.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r7-f2.png b/assets/pixelOffice/derived/work-r7-f2.png deleted file mode 100644 index 6990f86..0000000 Binary files a/assets/pixelOffice/derived/work-r7-f2.png and /dev/null differ diff --git a/assets/pixelOffice/derived/work-r7-f3.png b/assets/pixelOffice/derived/work-r7-f3.png deleted file mode 100644 index 01f0677..0000000 Binary files a/assets/pixelOffice/derived/work-r7-f3.png and /dev/null differ diff --git a/assets/pixelOffice/layout-preview-busy-v1.png b/assets/pixelOffice/layout-preview-busy-v1.png deleted file mode 100644 index c379ef0..0000000 Binary files a/assets/pixelOffice/layout-preview-busy-v1.png and /dev/null differ diff --git a/assets/pixelOffice/layout-preview-mixed-facing-busy-v2.png b/assets/pixelOffice/layout-preview-mixed-facing-busy-v2.png deleted file mode 100644 index 33a4df2..0000000 Binary files a/assets/pixelOffice/layout-preview-mixed-facing-busy-v2.png and /dev/null differ diff --git a/assets/pixelOffice/layout-preview-mixed-facing-v1.png b/assets/pixelOffice/layout-preview-mixed-facing-v1.png deleted file mode 100644 index 7f2b3e6..0000000 Binary files a/assets/pixelOffice/layout-preview-mixed-facing-v1.png and /dev/null differ diff --git a/assets/pixelOffice/layout-preview-mixed-facing-v2.png b/assets/pixelOffice/layout-preview-mixed-facing-v2.png deleted file mode 100644 index 7f2b3e6..0000000 Binary files a/assets/pixelOffice/layout-preview-mixed-facing-v2.png and /dev/null differ diff --git a/assets/pixelOffice/layout-preview-natural-busy-v2.png b/assets/pixelOffice/layout-preview-natural-busy-v2.png deleted file mode 100644 index 96cda74..0000000 Binary files a/assets/pixelOffice/layout-preview-natural-busy-v2.png and /dev/null differ diff --git a/assets/pixelOffice/layout-preview-natural-busy-v3-seat-anchored.png b/assets/pixelOffice/layout-preview-natural-busy-v3-seat-anchored.png deleted file mode 100644 index a39d6b7..0000000 Binary files a/assets/pixelOffice/layout-preview-natural-busy-v3-seat-anchored.png and /dev/null differ diff --git a/assets/pixelOffice/layout-preview-natural-v1.png b/assets/pixelOffice/layout-preview-natural-v1.png deleted file mode 100644 index 0706b35..0000000 Binary files a/assets/pixelOffice/layout-preview-natural-v1.png and /dev/null differ diff --git a/assets/pixelOffice/layout-preview-natural-v2.png b/assets/pixelOffice/layout-preview-natural-v2.png deleted file mode 100644 index 52d150c..0000000 Binary files a/assets/pixelOffice/layout-preview-natural-v2.png and /dev/null differ diff --git a/assets/pixelOffice/layout-preview-natural-v3-seat-anchored.png b/assets/pixelOffice/layout-preview-natural-v3-seat-anchored.png deleted file mode 100644 index 74dde20..0000000 Binary files a/assets/pixelOffice/layout-preview-natural-v3-seat-anchored.png and /dev/null differ diff --git a/assets/pixelOffice/layout-preview-seat-front-busy-v2.png b/assets/pixelOffice/layout-preview-seat-front-busy-v2.png deleted file mode 100644 index 9cbcab1..0000000 Binary files a/assets/pixelOffice/layout-preview-seat-front-busy-v2.png and /dev/null differ diff --git a/assets/pixelOffice/layout-preview-seat-front-v1.png b/assets/pixelOffice/layout-preview-seat-front-v1.png deleted file mode 100644 index 40aa0dc..0000000 Binary files a/assets/pixelOffice/layout-preview-seat-front-v1.png and /dev/null differ diff --git a/assets/pixelOffice/layout-preview-seat-front-v2.png b/assets/pixelOffice/layout-preview-seat-front-v2.png deleted file mode 100644 index 40aa0dc..0000000 Binary files a/assets/pixelOffice/layout-preview-seat-front-v2.png and /dev/null differ diff --git a/assets/pixelOffice/layout-preview-v2.png b/assets/pixelOffice/layout-preview-v2.png deleted file mode 100644 index d5b9162..0000000 Binary files a/assets/pixelOffice/layout-preview-v2.png and /dev/null differ diff --git a/assets/pixelOffice/layout-preview-v3.png b/assets/pixelOffice/layout-preview-v3.png deleted file mode 100644 index 73d49b0..0000000 Binary files a/assets/pixelOffice/layout-preview-v3.png and /dev/null differ diff --git a/assets/pixelOffice/layout-preview-v4.png b/assets/pixelOffice/layout-preview-v4.png deleted file mode 100644 index 4cf1f11..0000000 Binary files a/assets/pixelOffice/layout-preview-v4.png and /dev/null differ diff --git a/assets/pixelOffice/layout-preview-v5.png b/assets/pixelOffice/layout-preview-v5.png deleted file mode 100644 index c7ba131..0000000 Binary files a/assets/pixelOffice/layout-preview-v5.png and /dev/null differ diff --git a/assets/pixelOffice/layout-preview-v6.png b/assets/pixelOffice/layout-preview-v6.png deleted file mode 100644 index 5352e4a..0000000 Binary files a/assets/pixelOffice/layout-preview-v6.png and /dev/null differ diff --git a/assets/pixelOffice/layout-preview-v7.png b/assets/pixelOffice/layout-preview-v7.png deleted file mode 100644 index 5352e4a..0000000 Binary files a/assets/pixelOffice/layout-preview-v7.png and /dev/null differ diff --git a/assets/pixelOffice/layout-preview-v8.png b/assets/pixelOffice/layout-preview-v8.png deleted file mode 100644 index 150453a..0000000 Binary files a/assets/pixelOffice/layout-preview-v8.png and /dev/null differ diff --git a/assets/pixelOffice/layout-preview-v9.png b/assets/pixelOffice/layout-preview-v9.png deleted file mode 100644 index 02ec697..0000000 Binary files a/assets/pixelOffice/layout-preview-v9.png and /dev/null differ diff --git a/assets/pixelOffice/layout-preview.png b/assets/pixelOffice/layout-preview.png deleted file mode 100644 index 2ffa61d..0000000 Binary files a/assets/pixelOffice/layout-preview.png and /dev/null differ diff --git a/assets/pixelOffice/office-props.png b/assets/pixelOffice/office-props.png deleted file mode 100644 index f16e658..0000000 Binary files a/assets/pixelOffice/office-props.png and /dev/null differ diff --git a/assets/pixelOffice/seat-anchor-grid-v1.png b/assets/pixelOffice/seat-anchor-grid-v1.png deleted file mode 100644 index 5316afa..0000000 Binary files a/assets/pixelOffice/seat-anchor-grid-v1.png and /dev/null differ diff --git a/assets/pixelOffice/seat-anchor-grid-v2-dark.png b/assets/pixelOffice/seat-anchor-grid-v2-dark.png deleted file mode 100644 index bcf9fc2..0000000 Binary files a/assets/pixelOffice/seat-anchor-grid-v2-dark.png and /dev/null differ diff --git a/assets/pixelOffice/seat-offset-test.png b/assets/pixelOffice/seat-offset-test.png deleted file mode 100644 index 1fb7898..0000000 Binary files a/assets/pixelOffice/seat-offset-test.png and /dev/null differ diff --git a/assets/pixelOffice/seated-idle.png b/assets/pixelOffice/seated-idle.png deleted file mode 100644 index 1cb24a6..0000000 Binary files a/assets/pixelOffice/seated-idle.png and /dev/null differ diff --git a/assets/pixelOffice/seated-work.png b/assets/pixelOffice/seated-work.png deleted file mode 100644 index 333ddc4..0000000 Binary files a/assets/pixelOffice/seated-work.png and /dev/null differ diff --git a/assets/pixelOffice/walk-directions.png b/assets/pixelOffice/walk-directions.png deleted file mode 100644 index 37ca053..0000000 Binary files a/assets/pixelOffice/walk-directions.png and /dev/null differ diff --git a/media/settings-panel.html b/media/settings-panel.html index ef18110..5945849 100644 --- a/media/settings-panel.html +++ b/media/settings-panel.html @@ -180,6 +180,39 @@ +
+

단계별 지식 폴더 (소형 모델 정밀 검색)

+

질문이 수학·논리 / 코딩·디버깅 / 일반 상식으로 분류되면 전체 두뇌 대신 General + 해당 Specialty 폴더만 검색해 무관한 문서를 배제합니다. 경로는 활성 두뇌 기준 상대 경로이며, Specialty 가 비어 있는 단계는 기존처럼 전체 두뇌를 검색합니다.

+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+

발송 스케줄

diff --git a/media/settings-panel.js b/media/settings-panel.js index baf3126..28709a2 100644 --- a/media/settings-panel.js +++ b/media/settings-panel.js @@ -30,6 +30,10 @@ const dcBridgeNasUrl = $('dcBridgeNasUrl'); const dcBridgeNasToken = $('dcBridgeNasToken'); const dcSavePath = $('dcSavePath'); + const dkGeneral = $('dkGeneral'); + const dkMath = $('dkMath'); + const dkCoding = $('dkCoding'); + const dkFacts = $('dkFacts'); const emailWikiSavePath = $('emailWikiSavePath'); const emailOutlookEnabled = $('emailOutlookEnabled'); const emailGmailEnabled = $('emailGmailEnabled'); @@ -152,6 +156,18 @@ document.querySelector('[data-save="datacollect.savePath"]').addEventListener('click', () => vscode.postMessage({ type: 'datacollect.update', savePath: dcSavePath.value }) ); + document.querySelector('[data-save="domainKnowledge.general"]').addEventListener('click', () => + vscode.postMessage({ type: 'domainKnowledge.update', general: dkGeneral.value }) + ); + document.querySelector('[data-save="domainKnowledge.math"]').addEventListener('click', () => + vscode.postMessage({ type: 'domainKnowledge.update', math: dkMath.value }) + ); + document.querySelector('[data-save="domainKnowledge.coding"]').addEventListener('click', () => + vscode.postMessage({ type: 'domainKnowledge.update', coding: dkCoding.value }) + ); + document.querySelector('[data-save="domainKnowledge.facts"]').addEventListener('click', () => + vscode.postMessage({ type: 'domainKnowledge.update', facts: dkFacts.value }) + ); document.querySelector('[data-save="email.wikifySavePath"]').addEventListener('click', () => vscode.postMessage({ type: 'datacollect.update', emailWikifySavePath: emailWikiSavePath.value }) ); @@ -431,6 +447,13 @@ : `사이드바에서 선택한 모델이 여기에도 동기화됩니다. (${list.length}개 발견)`; // ---- Datacollect ---- + const dk = state.domainKnowledge; + if (dk) { + setIfNotFocused(dkGeneral, dk.general); + setIfNotFocused(dkMath, dk.math); + setIfNotFocused(dkCoding, dk.coding); + setIfNotFocused(dkFacts, dk.facts); + } const dc = state.datacollect; if (dc) { if (dcBridgeTarget && document.activeElement !== dcBridgeTarget && (dc.bridgeTarget === 'local' || dc.bridgeTarget === 'nas')) { diff --git a/media/sidebar.html b/media/sidebar.html index d486511..04145b7 100644 --- a/media/sidebar.html +++ b/media/sidebar.html @@ -54,6 +54,8 @@ + + @@ -404,7 +406,7 @@
diff --git a/media/sidebar.js b/media/sidebar.js index 4a5ac00..7c485ec 100644 --- a/media/sidebar.js +++ b/media/sidebar.js @@ -812,9 +812,28 @@ msgEl.appendChild(head); msgEl.appendChild(body); msgEl.appendChild(actions); chat.appendChild(msgEl); chat.scrollTop = chat.scrollHeight; + trimChatDom(); return { body, msgEl }; } + // [메모리 개선] 채팅 DOM 상한 — 이 웹뷰는 retainContextWhenHidden 이라 하루 종일 켜두면 + // 메시지 노드가 무한히 쌓여 메모리가 단조 증가한다. 최근 MAX_CHAT_DOM_MESSAGES 개만 + // DOM 에 유지하고 오래된 것부터 제거한다 (내용이 필요한 메시지는 Copy/Export 로 보존). + const MAX_CHAT_DOM_MESSAGES = 200; + let _trimNotice = null; + function trimChatDom() { + const msgs = chat.querySelectorAll(':scope > .msg'); + const excess = msgs.length - MAX_CHAT_DOM_MESSAGES; + if (excess <= 0) return; + for (let i = 0; i < excess; i++) msgs[i].remove(); + if (!_trimNotice || !_trimNotice.isConnected) { + _trimNotice = document.createElement('div'); + _trimNotice.style.cssText = 'text-align:center;opacity:.55;font-size:11px;padding:6px 0;'; + _trimNotice.textContent = '⏳ 오래된 메시지는 메모리 절약을 위해 화면에서 정리되었습니다'; + } + chat.insertBefore(_trimNotice, chat.firstChild); + } + window.addEventListener('message', e => { const msg = e.data; switch(msg.type) { @@ -1119,12 +1138,6 @@ chatEl.scrollTop = chatEl.scrollHeight; break; } - case 'pixelOfficeUpdate': - case 'officeSnapshot': { - // Pixel Office 채팅 배너는 v2.2.267 에서 제거 — 백엔드가 여전히 보내는 - // 상태 메시지는 조용히 무시 (풀스크린 Astra Office 패널은 별도 webview 로 수신). - break; - } case 'devilRebuttal': { // Devil Agent (도현) 카드. main assistant 답변 직후 chat 하단에 한 장 추가. // 사용자가 '재반박' 누르면 그 텍스트가 다음 user prompt 로 가서 main turn 한 번 더 돌고, @@ -1928,6 +1941,11 @@ const syncBrain = () => { Sound.play(550, 'sine', 0.1); vscode.postMessage({ type: 'syncBrain' }); }; document.getElementById('brainBtn').onclick = syncBrain; saveWikiRawBtn.onclick = () => vscode.postMessage({ type: 'saveWikiRaw' }); + // NotebookLM 로컬 백엔드 (Datacollector Research 용) 실행/종료 — 터미널 없이 버튼으로. + const nlmBridgeStartBtn = document.getElementById('nlmBridgeStartBtn'); + if (nlmBridgeStartBtn) nlmBridgeStartBtn.onclick = () => vscode.postMessage({ type: 'startNotebookLmBridge' }); + const nlmBridgeStopBtn = document.getElementById('nlmBridgeStopBtn'); + if (nlmBridgeStopBtn) nlmBridgeStopBtn.onclick = () => vscode.postMessage({ type: 'stopNotebookLmBridge' }); addBrainBtn.onclick = () => vscode.postMessage({ type: 'addBrain' }); // v2.2.67 — 만약 dropdown 이 'new' 상태로 굳어있어도 수정/삭제는 직전 유효 선택(또는 첫 실제 옵션) // 을 기준으로 동작하도록 폴백. 이전엔 'new' 인 순간 그냥 early-return 해서 "수정 안 됨" 버그 발생. diff --git a/package.json b/package.json index 8ada0c8..72a98be 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.291", + "version": "2.2.296", "publisher": "g1nation", "license": "MIT", "icon": "assets/icon.png", @@ -176,10 +176,6 @@ "command": "g1nation.company.openSessions", "title": "Astra: Open 1인 기업 Sessions Folder" }, - { - "command": "g1nation.company.pixelOffice.open", - "title": "Astra: Open Pixel Office (Full Screen)" - }, { "command": "g1nation.calendar.connect", "title": "Astra: Google Calendar (iCal) 연결 📅" @@ -268,6 +264,31 @@ "default": "", "markdownDescription": "[nas 타깃] NAS Bridge가 요구하는 `x-bridge-token` 값(Bridge의 `BRIDGE_AUTH_TOKEN`과 일치). `nas` 타깃일 때만 요청 헤더에 실립니다. 로컬 타깃에는 영향 없음." }, + "g1nation.domainKnowledge.generalFolder": { + "type": "string", + "default": "", + "markdownDescription": "[단계별 지식] 모든 단계가 공통으로 참조하는 General Knowledge 폴더 (활성 두뇌 기준 상대 경로, 예: `General`). 질문이 수학/코딩/팩트로 분류될 때 해당 Specialty 폴더와 함께 검색됩니다." + }, + "g1nation.domainKnowledge.mathFolder": { + "type": "string", + "default": "", + "markdownDescription": "[단계별 지식] 수학·논리 질문 전용 Specialty 폴더 (두뇌 상대 경로, 예: `Specialty_Math`). 비워두면 수학 질문도 전체 두뇌를 검색합니다." + }, + "g1nation.domainKnowledge.codingFolder": { + "type": "string", + "default": "", + "markdownDescription": "[단계별 지식] 코딩·디버깅 질문 전용 Specialty 폴더 (두뇌 상대 경로, 예: `10_Wiki/Topic_Programming`). 비워두면 코딩 질문도 전체 두뇌를 검색합니다." + }, + "g1nation.domainKnowledge.factsFolder": { + "type": "string", + "default": "", + "markdownDescription": "[단계별 지식] 일반 상식·팩트 질문 전용 Specialty 폴더 (두뇌 상대 경로, 예: `Specialty_Facts`). 비워두면 팩트 질문도 전체 두뇌를 검색합니다." + }, + "g1nation.datacollectLocalProjectPath": { + "type": "string", + "default": "", + "markdownDescription": "로컬 Datacollector 프로젝트 폴더 경로 (도구 메뉴의 'NotebookLM 백엔드 실행' 버튼이 여기서 `npm run bridge` 를 실행). 비워두면 워크스페이스 주변에서 자동 탐색하고, 못 찾으면 버튼 클릭 시 폴더 선택 창이 떠서 자동 저장됩니다." + }, "g1nation.datacollectSavePath": { "type": "string", "default": "", @@ -1130,16 +1151,6 @@ "default": false, "description": "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 surfaced in the action report so the user (and the agent on a follow-up) can see exactly what broke. Requires the language toolchain installed on the user's machine. Off by default." }, - "g1nation.company.pixelOffice.enabled": { - "type": "boolean", - "default": true, - "description": "Enable Pixel Office agent-status tracking (feeds the full-screen Astra Office panel opened via 'Astra: Open Pixel Office (Full Screen)'). The in-chat banner was removed in v2.2.267 to free screen space. UI layer only; turning it off does not change any agent behaviour." - }, - "g1nation.company.pixelOffice.bubbles": { - "type": "boolean", - "default": true, - "description": "Show short comic-style speech bubbles above Pixel Office characters on status changes / key events (full-screen Astra Office panel only — the in-chat banner was removed in v2.2.267). Bubbles are purely narrative — they never influence the agent's decisions. Disable for a quieter UI." - }, "g1nation.google.clientId": { "type": "string", "default": "", diff --git a/src/agent.ts b/src/agent.ts index 6165dc2..850c0df 100644 --- a/src/agent.ts +++ b/src/agent.ts @@ -158,6 +158,8 @@ import type { HandlerContext } from './agent/actions/types'; import { applyFileCreateEditActions } from './agent/actions/fileCreateEdit'; import { applyFileDeleteReadActions } from './agent/actions/fileDeleteRead'; import { applyRunCommandActions } from './agent/actions/runCommand'; +import { applyCalculateActions } from './agent/actions/calculate'; +import { applyRunCodeActions } from './agent/actions/runCode'; import { applyListFilesActions } from './agent/actions/listFiles'; import { applyWebFetchActions } from './agent/actions/webFetch'; import { applyBrainOpsActions } from './agent/actions/brainOps'; @@ -1275,15 +1277,22 @@ export class AgentExecutor { // warrant a follow-up LLM call. const historyLenBeforeActions = this.chatHistory.length; const report = await this.executeActions(cleanedVisible, rootPath, activeBrain); - const actionsInjectedContext = this.chatHistory.length > historyLenBeforeActions; + let actionsInjectedContext = this.chatHistory.length > historyLenBeforeActions; // Self-Reflector Phase C — 일반 채팅 경로에서도 코드 파일 생성 직후 // syntax 체크 실행. 옵션 OFF면 통째로 skip. try { const cfgC = getConfig(); if (cfgC.selfReflectorExecutionEnabled && report.length > 0) { - const { verifyCreatedFiles } = await import('./features/selfReflector/selfReflectorExecution'); + const { verifyCreatedFiles, buildSyntaxFixInstruction } = await import('./features/selfReflector/selfReflectorExecution'); const extra = await verifyCreatedFiles(report, rootPath); if (extra.length > 0) report.push(...extra); + // [실행 루프] 문법 오류를 보고로 끝내지 않고 대화 컨텍스트로 재주입 — + // 아래 actionsInjectedContext 재계산을 거쳐 자동 후속 턴이 돌고, 모델이 + // 로 즉시 수정 → 다음 라운드 재검증되는 자가수정 루프. + const fails = extra.filter((l) => l.startsWith('❌')); + if (fails.length > 0) { + this.chatHistory.push({ role: 'system', internal: true, content: buildSyntaxFixInstruction(fails) }); + } } } catch (e: any) { logError('selfReflector.C (chat): hook failed; continuing.', { error: e?.message ?? String(e) }); @@ -1301,6 +1310,8 @@ export class AgentExecutor { } catch (e: any) { logError('selfReflector.hollow (chat): hook failed; continuing.', { error: e?.message ?? String(e) }); } + // 검증 훅이 재주입한 컨텍스트(문법 오류 수정 지시)도 후속 턴 트리거에 반영. + actionsInjectedContext = this.chatHistory.length > historyLenBeforeActions; if (!assistantContent.trim() && report.length === 0) { const promptCharCount = messagesForRequest.reduce((sum, m) => sum + (m.content?.length ?? 0), 0); logError('Model returned an empty response without actions.', { @@ -1706,6 +1717,8 @@ export class AgentExecutor { await applyFileCreateEditActions(ctx); await applyFileDeleteReadActions(ctx); await applyRunCommandActions(ctx); + await applyCalculateActions(ctx); + await applyRunCodeActions(ctx); await applyListFilesActions(ctx); await applyWebFetchActions(ctx); await applyBrainOpsActions(ctx); diff --git a/src/agent/actions/calculate.ts b/src/agent/actions/calculate.ts new file mode 100644 index 0000000..334996d --- /dev/null +++ b/src/agent/actions/calculate.ts @@ -0,0 +1,115 @@ +import { execFile } from 'child_process'; +import type { HandlerContext } from './types'; + +/** + * — 수학·논리·수치 계산을 Python 에 위임하는 액션 (ACTION 16). + * + * 배경: 로컬 소형 모델(4b급)의 대표 약점은 다단계 계산 중의 산술 실수다. + * "모델이 직접 계산"을 "모델은 코드로 변환만 → 실행은 Python → 모델은 결과 해석" + * 으로 바꾸면 계산 오류의 원천 자체가 사라진다 (모델은 판단만, 계산은 도구가). + * + * 흐름: 모델이 print(...) 를 emit → 여기서 `python -I -c` 로 + * 실행(10초 타임아웃) → stdout/stderr 를 chatHistory 에 internal system 메시지로 + * 주입 → agent 루프가 '컨텍스트 주입됨'을 감지해 자동 후속 턴을 돌리고 모델이 + * 결과를 해석한다. 에러도 그대로 주입되므로 모델이 코드를 고쳐 다시 emit 하는 + * 자가수정 루프가 자연히 성립한다 (read_file 과 동일한 재주입 메커니즘). + * + * 신뢰 모델: run_command(실제 터미널 실행)와 동일한 로컬 신뢰 수준. 다만 + * `-I`(isolated) 플래그로 사용자 site-packages/환경변수 영향을 차단하고, + * 타임아웃·출력 상한·회당 실행 횟수 상한을 둔다. + */ + +const CALC_TIMEOUT_MS = 10_000; +const MAX_CALC_PER_TURN = 4; // 한 턴에 과도한 실행 방지 +const MAX_CODE_CHARS = 4_000; +const MAX_OUTPUT_CHARS = 4_000; // 모델 컨텍스트 보호 + +/** 감지된 Python 실행 파일 캐시 (프로세스 생존 동안 유지, null = 미탐지/없음). */ +let _pythonCmd: string | null | undefined; + +function execFileP(cmd: string, args: string[], timeout: number): Promise<{ stdout: string; stderr: string }> { + return new Promise((resolve, reject) => { + execFile(cmd, args, { timeout, maxBuffer: 512 * 1024 }, (err, stdout, stderr) => { + if (err) reject(Object.assign(err, { stdout: String(stdout || ''), stderr: String(stderr || '') })); + else resolve({ stdout: String(stdout || ''), stderr: String(stderr || '') }); + }); + }); +} + +/** python3 → python → py 순으로 실행 가능한 인터프리터 탐지 (OS 자동 대응, run_code 도 공유). */ +export async function detectPython(): Promise { + if (_pythonCmd !== undefined) return _pythonCmd; + for (const cmd of ['python3', 'python', 'py']) { + try { + await execFileP(cmd, ['--version'], 3_000); + _pythonCmd = cmd; + return cmd; + } catch { /* 다음 후보 */ } + } + _pythonCmd = null; + return null; +} + +/** 테스트용 — 캐시 초기화. */ +export function _resetPythonCache(): void { _pythonCmd = undefined; } + +export async function applyCalculateActions(ctx: HandlerContext): Promise { + const { aiMessage, report } = ctx; + const calcRegex = /([\s\S]*?)<\/calculate>/gi; + let match: RegExpExecArray | null; + let ran = 0; + + while ((match = calcRegex.exec(aiMessage)) !== null) { + if (ran >= MAX_CALC_PER_TURN) { + report.push(`⚠️ Calculate skipped: 한 턴 실행 한도(${MAX_CALC_PER_TURN}회) 초과`); + break; + } + const code = match[1].trim(); + if (!code) continue; + if (code.length > MAX_CODE_CHARS) { + report.push(`❌ Calculate blocked: 코드가 너무 깁니다 (${code.length}자 > ${MAX_CODE_CHARS})`); + continue; + } + ran++; + + const python = await detectPython(); + if (!python) { + report.push('❌ Calculate unavailable: Python 미설치'); + ctx.chatHistory.push({ + role: 'system', internal: true, + content: '[Result of calculate — UNAVAILABLE]\nPython 이 이 컴퓨터에 설치되어 있지 않아 를 실행할 수 없습니다. 계산을 직접 수행하되, 산술 결과는 신중히 검산해서 답하십시오.', + }); + return; // 인터프리터가 없으면 나머지 calculate 도 전부 불가 + } + + const label = code.replace(/\s+/g, ' ').slice(0, 60); + try { + const { stdout } = await execFileP(python, ['-I', '-c', code], CALC_TIMEOUT_MS); + const out = stdout.trim(); + if (!out) { + // print 누락 — 모델이 스스로 고치도록 힌트를 재주입한다. + report.push(`⚠️ Calculated (no output): ${label}`); + ctx.chatHistory.push({ + role: 'system', internal: true, + content: '[Result of calculate — EMPTY OUTPUT]\n코드는 실행됐지만 출력이 없습니다. 결과는 반드시 print(...) 로 출력해야 합니다. print 를 추가해 를 다시 emit 하십시오.', + }); + } else { + const capped = out.length > MAX_OUTPUT_CHARS ? out.slice(0, MAX_OUTPUT_CHARS) + '\n… (truncated)' : out; + report.push(`🧮 Calculated: ${label}`); + ctx.chatHistory.push({ + role: 'system', internal: true, + content: `[Result of calculate]\n\`\`\`\n${capped}\n\`\`\`\n이 실행 결과를 신뢰하고 그대로 사용해 답하십시오 (임의로 다시 암산하지 말 것).`, + }); + } + } catch (err: any) { + // 에러도 재주입 — 모델이 코드를 고쳐 재시도하는 자가수정 루프. + const tail = String(err?.stderr || err?.message || err).trim().split('\n').slice(-8).join('\n').slice(0, 1200); + const timedOut = err?.killed || /ETIMEDOUT|timed? ?out/i.test(String(err?.message || '')); + report.push(`❌ Calculate failed: ${label}`); + ctx.chatHistory.push({ + role: 'system', internal: true, + content: `[Result of calculate — ERROR]\n${timedOut ? `실행이 ${CALC_TIMEOUT_MS / 1000}초 안에 끝나지 않아 중단되었습니다. 더 효율적인 방법으로 다시 시도하십시오.` : `\`\`\`\n${tail}\n\`\`\`\n에러를 참고해 코드를 고친 뒤 를 다시 emit 하십시오. (표준 라이브러리만 사용 가능)`}`, + }); + } + } +} diff --git a/src/agent/actions/runCode.ts b/src/agent/actions/runCode.ts new file mode 100644 index 0000000..5dbbed1 --- /dev/null +++ b/src/agent/actions/runCode.ts @@ -0,0 +1,119 @@ +import { execFile } from 'child_process'; +import * as fs from 'fs'; +import * as path from 'path'; +import { validatePath } from '../../security'; +import { detectPython } from './calculate'; +import type { HandlerContext } from './types'; + +/** + * — 작성한 코드를 실제 실행해 결과를 확인하는 액션 (ACTION 17). + * + * 배경: 소형 모델 추론 강화 2축 "코딩 피드백 루프". run_command 는 터미널로만 + * 보내고 stdout 을 회수하지 못해 모델이 실행 결과를 볼 수 없었다. 이 액션은 + * 워크스페이스 안의 파일을 인터프리터로 직접 실행하고 stdout/stderr/종료코드를 + * 대화 컨텍스트로 재주입한다 → "생성 → 실행 → 에러 확인 → 수정" 루프가 + * 모델 주도로 성립한다 (calculate 와 동일한 재주입 메커니즘). + * + * 안전장치: validatePath 로 워크스페이스 밖 실행 차단, 15초 타임아웃, + * 회당 2회 상한, 출력 4천자 상한, 지원 확장자 화이트리스트(.py/.js/.mjs/.cjs). + */ + +const RUN_TIMEOUT_MS = 15_000; +const MAX_RUNS_PER_TURN = 2; +const MAX_OUTPUT_CHARS = 4_000; + +function execFileP(cmd: string, args: string[], cwd: string): Promise<{ code: number; stdout: string; stderr: string; timedOut: boolean }> { + return new Promise((resolve) => { + execFile(cmd, args, { cwd, timeout: RUN_TIMEOUT_MS, maxBuffer: 1024 * 1024 }, (err: any, stdout, stderr) => { + resolve({ + code: err ? (typeof err.code === 'number' ? err.code : 1) : 0, + stdout: String(stdout || ''), + stderr: String(stderr || ''), + timedOut: !!err?.killed, + }); + }); + }); +} + +const cap = (s: string) => (s.length > MAX_OUTPUT_CHARS ? s.slice(0, MAX_OUTPUT_CHARS) + '\n… (truncated)' : s); + +export async function applyRunCodeActions(ctx: HandlerContext): Promise { + const { aiMessage, rootPath, report } = ctx; + const runRegex = /\s]+)['"]?\s*\/?>(?:<\/run_code>)?/gi; + let match: RegExpExecArray | null; + let ran = 0; + + while ((match = runRegex.exec(aiMessage)) !== null) { + if (ran >= MAX_RUNS_PER_TURN) { + report.push(`⚠️ run_code skipped: 한 턴 실행 한도(${MAX_RUNS_PER_TURN}회) 초과`); + break; + } + const relPath = match[1].trim(); + ran++; + try { + const absPath = validatePath(rootPath, relPath); + if (!fs.existsSync(absPath)) { + report.push(`❌ run_code: 파일 없음 — ${relPath}`); + ctx.chatHistory.push({ + role: 'system', internal: true, + content: `[Result of run_code — ERROR]\n파일이 존재하지 않습니다: ${relPath}. 경로를 확인하거나 로 실제 파일명을 확인하십시오.`, + }); + continue; + } + + const ext = path.extname(absPath).toLowerCase(); + let cmd: string; + let args: string[]; + if (ext === '.py') { + const py = await detectPython(); + if (!py) { + report.push('❌ run_code: Python 미설치'); + ctx.chatHistory.push({ + role: 'system', internal: true, + content: '[Result of run_code — UNAVAILABLE]\nPython 이 설치되어 있지 않아 .py 파일을 실행할 수 없습니다. 실행 없이 코드 리뷰로만 검증하십시오.', + }); + continue; + } + cmd = py; args = [absPath]; + } else if (ext === '.js' || ext === '.mjs' || ext === '.cjs') { + cmd = 'node'; args = [absPath]; + } else { + report.push(`⚠️ run_code: 지원하지 않는 확장자(${ext || '없음'}) — ${relPath}`); + ctx.chatHistory.push({ + role: 'system', internal: true, + content: `[Result of run_code — UNSUPPORTED]\n 는 .py/.js/.mjs/.cjs 만 실행합니다. ${relPath} 는 로 터미널에서 실행하십시오 (단, 그 경우 출력은 회수되지 않습니다).`, + }); + continue; + } + + const rel = path.relative(rootPath, absPath) || relPath; + const res = await execFileP(cmd, args, rootPath); + const outBlock = [ + res.stdout.trim() ? `--- stdout ---\n${cap(res.stdout.trim())}` : '(stdout 없음)', + res.stderr.trim() ? `--- stderr ---\n${cap(res.stderr.trim())}` : '', + ].filter(Boolean).join('\n'); + + if (res.timedOut) { + report.push(`❌ run_code timeout: ${rel}`); + ctx.chatHistory.push({ + role: 'system', internal: true, + content: `[Result of run_code — TIMEOUT]\n${rel} 실행이 ${RUN_TIMEOUT_MS / 1000}초 안에 끝나지 않아 중단되었습니다.\n${outBlock}\n무한 루프·대기 입력 여부를 점검해 로 수정한 뒤 다시 실행하십시오.`, + }); + } else if (res.code === 0) { + report.push(`▶️ run_code OK: ${rel}`); + ctx.chatHistory.push({ + role: 'system', internal: true, + content: `[Result of run_code] ${rel} — exit 0\n${outBlock}\n실행 결과가 의도와 일치하는지 확인하고, 이 실제 출력을 근거로 답하십시오 (추측 금지).`, + }); + } else { + report.push(`❌ run_code FAIL(exit ${res.code}): ${rel}`); + ctx.chatHistory.push({ + role: 'system', internal: true, + content: `[Result of run_code — ERROR] ${rel} — exit ${res.code}\n${outBlock}\n에러를 분석해 로 코드를 수정한 뒤, 다시 로 실행해 확인하십시오 (수정→실행→확인 루프).`, + }); + } + } catch (err: any) { + report.push(`❌ run_code blocked: ${err.message}`); + } + } +} diff --git a/src/config.ts b/src/config.ts index 6ad7cd3..ada53b9 100644 --- a/src/config.ts +++ b/src/config.ts @@ -286,6 +286,15 @@ export interface IAgentConfig { * Bridge 추출 우선, 실패 시 직접 fetch 폴백. */ webAutoFetchEnabled: boolean; + /** + * [단계별 지식 스코프] 질문이 수학/코딩/팩트로 분류되면 전체 두뇌 대신 + * General + 해당 Specialty 폴더만 RAG 검색한다 (소형 모델 정밀도 최적화). + * 값은 활성 두뇌 루트 기준 상대 경로. 비어 있으면 해당 도메인 스코프 미적용. + */ + domainKnowledgeGeneralFolder: string; + domainKnowledgeMathFolder: string; + domainKnowledgeCodingFolder: string; + domainKnowledgeFactsFolder: string; /** * Alignment 자가 조사 — openQuestions 를 사용자에게 보여주기 전에 두뇌를 * 검색해 스스로 답할 수 있는 질문을 걸러낸다. 끄면 기존 동작 (질문 즉시 노출). @@ -338,12 +347,6 @@ export interface IAgentConfig { * 깔려 있어야 의미가 있다. */ selfReflectorExecutionEnabled: boolean; - companyPixelOfficeEnabled: boolean; - /** - * Pixel Office의 캐릭터 말풍선 연출을 켤지. enabled가 true이고 이 값도 - * true일 때만 말풍선이 생성된다. 시끄럽게 느껴지면 사용자가 끌 수 있게. - */ - companyPixelOfficeBubbles: boolean; /** * Multi-Agent 발동 모드: * - 'auto' (기본): 작은 모델(≤4B) 감지 OR prompt가 컨텍스트의 큰 비중을 차지할 때만 자동 발동. @@ -572,6 +575,10 @@ export function getConfig(): IAgentConfig { // 둘이 어긋나면 안 되므로 변경 시 양쪽 같이 갱신. companyIntentAlignmentMaxRounds: Math.max(1, Math.min(5, cfg.get('company.intentAlignmentMaxRounds', 3))), webAutoFetchEnabled: cfg.get('web.autoFetchUrls', true), + domainKnowledgeGeneralFolder: cfg.get('domainKnowledge.generalFolder', '') || '', + domainKnowledgeMathFolder: cfg.get('domainKnowledge.mathFolder', '') || '', + domainKnowledgeCodingFolder: cfg.get('domainKnowledge.codingFolder', '') || '', + domainKnowledgeFactsFolder: cfg.get('domainKnowledge.factsFolder', '') || '', companyAlignmentSelfResearch: cfg.get('company.alignmentSelfResearch', true), companyAlignmentKnowledgeSave: cfg.get('company.alignmentKnowledgeSave', true), selfReflectorEnabled: cfg.get('selfReflector.enabled', false), @@ -579,8 +586,6 @@ export function getConfig(): IAgentConfig { hollowCheckAutoRetry: cfg.get('hollowCheck.autoRetry', true), selfReflectorExternalEnabled: cfg.get('selfReflector.externalVerification', false), selfReflectorExecutionEnabled: cfg.get('selfReflector.executionVerification', false), - companyPixelOfficeEnabled: cfg.get('company.pixelOffice.enabled', true), - companyPixelOfficeBubbles: cfg.get('company.pixelOffice.bubbles', true), workflowMultiAgentMode: ((): 'auto' | 'always' | 'off' => { const v = (cfg.get('workflow.multiAgentMode', 'auto') || 'auto').trim().toLowerCase(); return v === 'always' || v === 'off' ? v : 'auto'; diff --git a/src/core/health.ts b/src/core/health.ts index 741c5fc..ec10fe7 100644 --- a/src/core/health.ts +++ b/src/core/health.ts @@ -2,8 +2,11 @@ import * as vscode from 'vscode'; import * as fs from 'fs'; import * as os from 'os'; import * as path from 'path'; -import { execSync } from 'child_process'; +import { exec } from 'child_process'; +import { promisify } from 'util'; import { getConfig } from '../config'; + +const execAsync = promisify(exec); import { logInfo, logWarn, logError, getActiveBrainProfile } from '../utils'; import { getBridgeBaseUrl } from '../features/datacollect/bridgeClient'; @@ -24,12 +27,21 @@ export class HealthCheckMonitor { private static _lastReports: string[] = []; /** 직전 토스트 내용 — 같은 경고를 10분마다 반복 토스트하지 않기 위한 dedupe. */ private static _lastToastKey = ''; + /** 인터벌 틱 카운터 — 느린 검사(git push·레지스트리)를 매 틱이 아니라 N틱마다 돌리기 위함. */ + private static _tick = 0; + /** 느린 검사(git 자격증명·Antigravity 버전)의 최근 결과 캐시 — 빠른 틱에도 경고 표시가 유지되게. */ + private static _slowReports: string[] = []; public static get lastReports(): string[] { return this._lastReports.slice(); } - public static async runAllChecks(): Promise<{ ok: boolean; reports: string[] }> { + /** + * @param includeSlowChecks git push --dry-run(원격 네트워크)·Antigravity 레지스트리 읽기 같은 + * 비싼 검사 포함 여부. 활성화 시·수동 호출은 true(기본), 주기 인터벌은 3틱(30분)마다만 true. + * false 틱에서는 직전 느린 검사 결과(_slowReports)를 그대로 합쳐 경고 표시가 깜빡이지 않게 한다. + */ + public static async runAllChecks(includeSlowChecks: boolean = true): Promise<{ ok: boolean; reports: string[] }> { const reports: string[] = []; const config = getConfig(); @@ -52,11 +64,12 @@ export class HealthCheckMonitor { } // 3. Simple Disk/Permissions Check + // [발열 개선] 예전엔 워크스페이스에 파일을 실제로 쓰고 지웠는데, 워크스페이스 파일 변경은 + // VS Code 본체와 모든 확장의 파일 워처를 주기마다 연쇄로 깨운다. fs.access(W_OK)는 + // 파일을 만들지 않고 같은 질문("여기 쓸 수 있나")에 답하므로 워처 연쇄가 없다. try { - const testFile = workspaceFolders ? vscode.Uri.joinPath(workspaceFolders[0].uri, '.g1-health-check') : null; - if (testFile) { - await vscode.workspace.fs.writeFile(testFile, Buffer.from('ok')); - await vscode.workspace.fs.delete(testFile); + if (workspaceFolders && workspaceFolders[0].uri.scheme === 'file') { + await fs.promises.access(workspaceFolders[0].uri.fsPath, fs.constants.W_OK); logInfo('Health Check: Write permissions OK.'); } } catch { @@ -87,43 +100,52 @@ export class HealthCheckMonitor { } } catch { /* profile 읽기 실패 — skip */ } - // 6. git push 자격증명 — 원격 동기화를 *설정한* 두뇌만 검사 (secondBrainRepo - // 비어 있으면 두뇌 동기화가 로컬 새로고침 모드라 자격증명 불필요). - try { - if (brain?.secondBrainRepo?.trim() && brain.localBrainPath && fs.existsSync(brain.localBrainPath)) { - try { - execSync('git push --dry-run', { - cwd: brain.localBrainPath, - env: { ...process.env, GIT_TERMINAL_PROMPT: '0' }, - timeout: 5000, - stdio: ['ignore', 'pipe', 'pipe'], - }); - } catch (e: any) { - const msg = String(e?.stderr || e?.message || ''); - if (/could not read Username|Authentication failed|terminal prompts disabled/i.test(msg)) { - reports.push(`두뇌 원격 push 자격증명이 없습니다 — 터미널에서 "cd ${brain.localBrainPath} && git push" 1회 실행으로 키체인에 저장하세요.`); - } - // 그 외(오프라인·upstream 없음 등)는 소음 방지 — 보고하지 않음. - } - } - } catch { /* skip */ } + // ── 느린 검사 (6·7): 원격 네트워크·프로세스 생성·레지스트리 파싱 — 매 틱 돌리기엔 비싸다. + // includeSlowChecks 틱에서만 실행하고, 그 외 틱은 직전 결과를 그대로 합친다. + if (includeSlowChecks) { + const slowReports: string[] = []; - // 7. Antigravity 확장 버전 정합 — VS Code 와 Antigravity 양쪽에 설치된 - // 경우 버전이 갈리면 "고쳤는데 안 고쳐짐" 혼란의 단골 원인 (실사례: - // 2.2.19 vs 2.2.232 공존). Antigravity 미사용 머신에서는 자동 skip. - try { - const agExtRegistry = path.join(os.homedir(), '.antigravity', 'extensions', 'extensions.json'); - if (fs.existsSync(agExtRegistry)) { - const arr = JSON.parse(fs.readFileSync(agExtRegistry, 'utf8')); - const mine = Array.isArray(arr) - ? arr.find((e: any) => e?.identifier?.id === 'g1nation.astra') - : null; - const myVersion = vscode.extensions.getExtension('g1nation.astra')?.packageJSON?.version; - if (mine?.version && myVersion && mine.version !== myVersion) { - reports.push(`Antigravity 에 다른 버전의 Astra(${mine.version})가 설치되어 있습니다 — 현재 실행 중 ${myVersion}. Antigravity 쪽은 수동 업데이트가 필요합니다.`); + // 6. git push 자격증명 — 원격 동기화를 *설정한* 두뇌만 검사 (secondBrainRepo + // 비어 있으면 두뇌 동기화가 로컬 새로고침 모드라 자격증명 불필요). + // [발열 개선] execSync(최대 5초 확장 호스트 블로킹) → 비동기 exec. + try { + if (brain?.secondBrainRepo?.trim() && brain.localBrainPath && fs.existsSync(brain.localBrainPath)) { + try { + await execAsync('git push --dry-run', { + cwd: brain.localBrainPath, + env: { ...process.env, GIT_TERMINAL_PROMPT: '0' }, + timeout: 5000, + }); + } catch (e: any) { + const msg = String(e?.stderr || e?.message || ''); + if (/could not read Username|Authentication failed|terminal prompts disabled/i.test(msg)) { + slowReports.push(`두뇌 원격 push 자격증명이 없습니다 — 터미널에서 "cd ${brain.localBrainPath} && git push" 1회 실행으로 키체인에 저장하세요.`); + } + // 그 외(오프라인·upstream 없음 등)는 소음 방지 — 보고하지 않음. + } } - } - } catch { /* registry 파싱 실패 — skip */ } + } catch { /* skip */ } + + // 7. Antigravity 확장 버전 정합 — VS Code 와 Antigravity 양쪽에 설치된 + // 경우 버전이 갈리면 "고쳤는데 안 고쳐짐" 혼란의 단골 원인 (실사례: + // 2.2.19 vs 2.2.232 공존). Antigravity 미사용 머신에서는 자동 skip. + try { + const agExtRegistry = path.join(os.homedir(), '.antigravity', 'extensions', 'extensions.json'); + if (fs.existsSync(agExtRegistry)) { + const arr = JSON.parse(fs.readFileSync(agExtRegistry, 'utf8')); + const mine = Array.isArray(arr) + ? arr.find((e: any) => e?.identifier?.id === 'g1nation.astra') + : null; + const myVersion = vscode.extensions.getExtension('g1nation.astra')?.packageJSON?.version; + if (mine?.version && myVersion && mine.version !== myVersion) { + slowReports.push(`Antigravity 에 다른 버전의 Astra(${mine.version})가 설치되어 있습니다 — 현재 실행 중 ${myVersion}. Antigravity 쪽은 수동 업데이트가 필요합니다.`); + } + } + } catch { /* registry 파싱 실패 — skip */ } + + this._slowReports = slowReports; + } + reports.push(...this._slowReports); this._lastReports = reports; @@ -150,7 +172,13 @@ export class HealthCheckMonitor { if (this.intervalHandle !== null) { clearInterval(this.intervalHandle); } - this.intervalHandle = setInterval(() => this.runAllChecks(), ms); + // 빠른 검사(서버·권한·브리지·두뇌 경로)는 매 틱, 느린 검사(git 원격·레지스트리)는 3틱마다. + // (기본 10분 인터벌 기준: 빠른 검사 10분, 느린 검사 30분 주기) + this._tick = 0; + this.intervalHandle = setInterval(() => { + this._tick++; + this.runAllChecks(this._tick % 3 === 0); + }, ms); } /** diff --git a/src/extension/providerCommands.ts b/src/extension/providerCommands.ts index b51a9d7..61cd2c0 100644 --- a/src/extension/providerCommands.ts +++ b/src/extension/providerCommands.ts @@ -96,11 +96,6 @@ export function registerProviderCommands( vscode.window.showErrorMessage(`Sessions 폴더 열기 실패: ${e?.message ?? e}`); } }), - vscode.commands.registerCommand('g1nation.company.pixelOffice.open', () => { - // 사이드바 mini 패널과 별도로 editor area 에 전체 사무실 뷰. 같은 - // pixelOfficeUpdate 스트림 공유 → 백엔드 변경 최소. - deps.getProvider()?.openPixelOfficePanel(); - }), // ── Google Calendar (iCal 읽기 / OAuth 쓰기) ──────────────────────── vscode.commands.registerCommand('g1nation.calendar.connect', async () => { diff --git a/src/features/approval/approvalPanelProvider.ts b/src/features/approval/approvalPanelProvider.ts index e549893..94efe6f 100644 --- a/src/features/approval/approvalPanelProvider.ts +++ b/src/features/approval/approvalPanelProvider.ts @@ -37,7 +37,9 @@ export class ApprovalPanelProvider implements vscode.WebviewViewProvider { ApprovalPanelProvider.viewType, 'Pending Approvals', column, - { enableScripts: true, localResourceRoots: [this._extensionUri], retainContextWhenHidden: true } + // [메모리 개선] retainContextWhenHidden 제거 — 이 패널은 클라이언트 상태가 없고 + // 큐 변경 시 백엔드가 html 을 다시 밀어넣으므로, 숨김 동안 렌더러를 상주시킬 이유가 없다. + { enableScripts: true, localResourceRoots: [this._extensionUri] } ); this._panel = panel; const adapter = wrapPanelAsView(panel); diff --git a/src/features/astraOffice/index.ts b/src/features/astraOffice/index.ts deleted file mode 100644 index e194d70..0000000 --- a/src/features/astraOffice/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -// Astra Office — public API. 다음 세션에서 추가될 OfficeSnapshot presenter / schema -// 도 같은 entry 로 노출 예정. -// -// 현재 노출: full webview panel HTML 생성 함수. sidebarProvider.ts 는 이 한 줄만 import. - -export { renderAstraOfficePanelHtml } from './view/panelHtml'; -export type { AstraOfficePanelAssets } from './view/panelHtml'; -export type { - OfficeSnapshot, - OfficeAgentSnapshot, - OfficePhase, - OfficeActivityItem, - OfficeBubbleSeed, -} from './schema'; -export { validateOfficeSnapshot, makeEmptyOfficeSnapshot } from './schema'; -export { presentOfficeSnapshot } from './presenter'; -export type { LayoutV2, OfficeDeskCell, OfficeProp } from './view/layoutSchema'; -export { validateLayout, migrateLayout } from './view/layoutSchema'; diff --git a/src/features/astraOffice/presenter.ts b/src/features/astraOffice/presenter.ts deleted file mode 100644 index 46bbdb2..0000000 --- a/src/features/astraOffice/presenter.ts +++ /dev/null @@ -1,181 +0,0 @@ -/** - * Presenter — 옛 AgentWorkState + bubble queue + activity items 를 OfficeSnapshot 으로 - * 변환하는 *pure* 함수. mini / full view 둘 다 같은 OfficeSnapshot 을 받게 만드는 게 목표. - * - * 이번 세션의 범위: 인터페이스 + 스텁. 실제 wiring 은 다음 세션에서: - * - sidebarProvider 의 `_pixelOfficeBroadcast` 가 옛 message 대신 OfficeSnapshot 송신 - * - mini view (media/sidebar.js) 와 full view (features/astraOffice/view/runtime.ts) - * 둘 다 `officeSnapshot` message 를 받아 자기 식대로 렌더 - * - * 이번 세션에 옛 message 와 OfficeSnapshot 을 *동시에* 보낼 수도 있게 — 호환 모드. 다음 - * 세션에서 옛 message 제거. - */ - -import type { AgentWorkState, AgentBubble } from '../company/pixelOfficeState'; -import type { CompanyState } from '../company/types'; -import { - type OfficeSnapshot, - type OfficeAgentSnapshot, - type OfficePhase, - type OfficeActivityItem, - type OfficeBubbleSeed, - makeEmptyOfficeSnapshot, -} from './schema'; - -/** mini/full view 가 받는 message envelope. */ -export interface OfficeSnapshotMessage { - type: 'officeSnapshot'; - value: OfficeSnapshot; -} - -/** 옛 AgentWorkState.status → OfficePhase 매핑. */ -const STATUS_TO_PHASE: Record = { - idle: 'idle', - intake: 'intake', - analyzing: 'planning', - need_clarification: 'awaiting-approval', - contract_ready: 'planning', - planning: 'planning', - executing: 'executing', - reviewing: 'reviewing', - waiting_approval: 'awaiting-approval', - error: 'error', - done: 'done', -}; - -/** agentId 가 alias 면 정식 id 로 정규화. dispatcher / agents.ts 와 같은 규칙. */ -const AGENT_ALIASES: Record = { - writer: 'writer', - editor: 'designer', - secretary: 'support', - business: 'inspector', -}; - -export function normalizeAgentId(rawAgentId: string | undefined): string | null { - if (!rawAgentId) return null; - const lower = rawAgentId.toLowerCase(); - return AGENT_ALIASES[lower] ?? lower; -} - -/** - * 옛 입력들을 합쳐 새 OfficeSnapshot 을 만든다. 입력 중 일부가 undefined 라도 안전. - * - * 이번 세션 stub: 옛 AgentWorkState 의 *단일 슬롯* 정보로 roster 1개 짜리 snapshot 만 - * 생성. 다음 세션에서 CompanyState 의 active roster 전체로 확장. - */ -export function presentOfficeSnapshot(input: { - activeState?: AgentWorkState; - recentBubbles?: AgentBubble[]; - recentActivity?: OfficeActivityItem[]; - company?: CompanyState; - /** - * 이 turn 의 active agent roster — `listActiveAgentsByCategory` 결과를 평탄화해서 전달. - * 빈 배열/undefined 면 옛 동작 (active agent 1명만) 으로 fallback. - */ - roster?: Array<{ agentId: string; agentName: string; roleCategory: OfficeAgentSnapshot['roleCategory'] }>; -}): OfficeSnapshot { - const snap = makeEmptyOfficeSnapshot(); - const { activeState, recentBubbles, recentActivity, roster: rosterInput } = input; - - if (activeState) { - const phase = STATUS_TO_PHASE[activeState.status] ?? 'idle'; - snap.phase = phase; - snap.activeAgentId = normalizeAgentId(activeState.agentId); - const activeId = snap.activeAgentId; - // Roster: - // - rosterInput 이 주어지면 (#G) 회사 전체 active agent 사용. active agent 만 - // activeState 의 상태로 표시하고 나머지는 idle. - // - 없으면 (옛 caller) 활성 agent 1명만 fallback. - if (rosterInput && rosterInput.length > 0) { - const now = Date.now(); - snap.roster = rosterInput.map((r) => { - const isActive = activeId !== null && r.agentId === activeId; - return { - agentId: r.agentId, - agentName: r.agentName, - roleCategory: r.roleCategory, - status: isActive ? activeState.status : 'idle', - currentStep: isActive ? activeState.currentStep : undefined, - lastLog: isActive ? (activeState.recentLogs ?? []).slice(-1)[0] : undefined, - lastActivityAt: isActive ? (activeState.updatedAt ?? now) : 0, - }; - }); - } else { - const role = _inferRoleCategory(activeState.agentId); - const agent: OfficeAgentSnapshot = { - agentId: snap.activeAgentId ?? activeState.agentId, - agentName: activeState.agentName ?? activeState.agentId, - roleCategory: role, - status: activeState.status, - currentStep: activeState.currentStep, - lastLog: (activeState.recentLogs ?? []).slice(-1)[0], - lastActivityAt: activeState.updatedAt ?? Date.now(), - }; - snap.roster = [agent]; - } - if (activeState.currentTask) { - snap.task = { - goal: activeState.currentTask, - criteria: activeState.requirementContract?.criteria, - openQuestions: activeState.requirementContract?.openQuestions, - format: activeState.requirementContract?.format, - context: activeState.requirementContract?.context, - }; - } - if (activeState.pipelineStages) { - snap.pipeline = { - stages: activeState.pipelineStages.map((s) => ({ - label: s.label, - agentId: s.agent, - status: s.status, - })), - index: activeState.pipelineStages.findIndex((s) => s.status === 'active'), - }; - } - if (activeState.needUserInput?.length || activeState.awaitingApproval) { - snap.awaiting = { - kind: activeState.awaitingApproval ? 'approval' : 'clarification', - questions: activeState.awaitingApproval - ? [activeState.awaitingApproval] - : (activeState.needUserInput ?? []), - }; - } - } - - if (recentActivity?.length) snap.activity = recentActivity.slice(-32); - - if (recentBubbles?.length) { - snap.newBubbles = recentBubbles - .map((b) => _toBubbleSeed(b)) - .filter((b): b is OfficeBubbleSeed => b !== null); - } - - snap.updatedAt = Date.now(); - return snap; -} - -// ── helpers ── - -function _inferRoleCategory(rawAgentId: string | undefined): OfficeAgentSnapshot['roleCategory'] { - if (!rawAgentId) return 'support'; - const id = rawAgentId.toLowerCase(); - if (id.includes('ceo')) return 'ceo'; - if (id.includes('plan')) return 'planner'; - if (id.includes('research')) return 'researcher'; - if (id.includes('design')) return 'designer'; - if (id.includes('writer')) return 'writer'; - if (id.includes('editor')) return 'designer'; - if (id.includes('developer') || id.includes('dev')) return 'developer'; - if (id.includes('qa')) return 'qa'; - if (id.includes('inspect') || id.includes('business')) return 'inspector'; - return 'support'; -} - -function _toBubbleSeed(b: AgentBubble): OfficeBubbleSeed | null { - if (!b || !b.text) return null; - return { - agentId: normalizeAgentId(b.agentId) ?? b.agentId, - text: b.text, - type: (b.type as OfficeBubbleSeed['type']) ?? 'status', - }; -} diff --git a/src/features/astraOffice/schema.ts b/src/features/astraOffice/schema.ts deleted file mode 100644 index dc20ce8..0000000 --- a/src/features/astraOffice/schema.ts +++ /dev/null @@ -1,305 +0,0 @@ -/** - * OfficeSnapshot — Astra Office 의 도메인 타입. - * - * 동시성 진실 (docs/ASTRA_OFFICE_REFACTOR.md §1): dispatcher 는 직렬이라 한 시점에 - * active agent 는 0 또는 1명. 이걸 데이터로 강제하는 게 이 타입의 핵심 역할. - * - * 이 세션에서는 *타입 + validator + empty factory* 만. 백엔드 emit 측 wiring 은 - * 다음 세션에서 단계적으로 옮긴다. 현재는 옛 AgentWorkState/CompanyTurnEvent 가 - * presenter 입력으로 살아있고, 출력만 OfficeSnapshot. - */ - -import type { AgentStatus } from '../company/pixelOfficeState'; - -export type OfficePhase = - | 'idle' - | 'intake' - | 'planning' - | 'executing' - | 'reviewing' - | 'awaiting-approval' - | 'reporting' - | 'done' - | 'error'; - -/** 한 명의 agent 가 한 시점에 가진 상태. */ -export interface OfficeAgentSnapshot { - /** company roster 의 정식 id (built-in 또는 custom). */ - agentId: string; - /** 표시 이름. */ - agentName: string; - /** 책상 색깔 / 매핑에 쓰이는 role category. */ - roleCategory: - | 'ceo' - | 'planner' - | 'researcher' - | 'designer' - | 'developer' - | 'qa' - | 'inspector' - | 'support' - | 'writer'; - status: AgentStatus; - /** "검수 라운드 2/3", "타입 누락" 같은 짧은 부가 정보. */ - currentStep?: string; - /** 머리 위 말풍선 source. presenter 가 비워서 보내면 webview 는 풍선 안 띄움. */ - lastLog?: string; - /** 정렬 / 신선도 판정. */ - lastActivityAt: number; -} - -export interface OfficeActivityItem { - /** epoch ms. */ - ts: number; - agentId: string; - text: string; - kind?: 'ok' | 'warn' | 'err' | 'info'; -} - -/** webview 가 풍선을 띄울 때 참고할 hint. presenter 가 매 update 마다 새 풍선 후보를 만들어 보냄. */ -export interface OfficeBubbleSeed { - agentId: string; - text: string; - /** 색깔/스타일. presenter 가 status/event/warning/error/success 중 분류. */ - type: 'status' | 'event' | 'warning' | 'error' | 'success'; -} - -export interface OfficeSnapshot { - /** 회사 전체 phase. activeAgent 가 어떤 단계에 있는지와 분리해서 추적. */ - phase: OfficePhase; - /** 활성 agent id — 직렬 dispatch 가정. null 이면 idle. */ - activeAgentId: string | null; - /** 이 turn 에 참여 가능한 모든 agent. webview 의 책상 그리드 source. */ - roster: OfficeAgentSnapshot[]; - /** 현재 요구사항 / 계약 요약. */ - task?: { - goal: string; - context?: string; - format?: string; - criteria?: string[]; - openQuestions?: string[]; - }; - /** 파이프라인 모드의 stage 진행도. */ - pipeline?: { - stages: Array<{ - label: string; - agentId?: string; - status: 'done' | 'active' | 'pending'; - }>; - index: number; - }; - /** 승인 / 추가 정보 대기. */ - awaiting?: { - kind: 'approval' | 'clarification'; - questions: string[]; - }; - /** 누적 활동 ring buffer — webview ticker 의 source. */ - activity: OfficeActivityItem[]; - /** 이 update 사이클에서 새로 생긴 풍선 후보. presenter 가 매 emit 마다 갱신. */ - newBubbles: OfficeBubbleSeed[]; - /** 디버깅/정렬용. */ - updatedAt: number; -} - -const VALID_PHASES: ReadonlySet = new Set([ - 'idle', - 'intake', - 'planning', - 'executing', - 'reviewing', - 'awaiting-approval', - 'reporting', - 'done', - 'error', -]); - -const VALID_ROLES: ReadonlySet = new Set([ - 'ceo', - 'planner', - 'researcher', - 'designer', - 'developer', - 'qa', - 'inspector', - 'support', - 'writer', -]); - -const VALID_STATUSES: ReadonlySet = new Set([ - 'idle', - 'intake', - 'analyzing', - 'need_clarification', - 'contract_ready', - 'planning', - 'executing', - 'reviewing', - 'waiting_approval', - 'error', - 'done', -]); - -const VALID_BUBBLE_TYPES = new Set([ - 'status', - 'event', - 'warning', - 'error', - 'success', -]); - -const VALID_KINDS = new Set>([ - 'ok', - 'warn', - 'err', - 'info', -]); - -/** - * 런타임 schema validation. 임의의 unknown 입력을 받아 *완전한 OfficeSnapshot* 또는 - * null 을 반환한다. 누락된 필드는 안전한 기본값으로 채운다. 잘못된 enum 값은 'idle'/ - * 기본 role 로 fall through. 호출자는 null 이면 default snapshot 으로 폴백 권장. - */ -export function validateOfficeSnapshot(raw: unknown): OfficeSnapshot | null { - if (!raw || typeof raw !== 'object') return null; - const r = raw as Record; - - const phaseRaw = String(r.phase ?? 'idle'); - const phase: OfficePhase = (VALID_PHASES as ReadonlySet).has(phaseRaw) - ? (phaseRaw as OfficePhase) - : 'idle'; - - const activeAgentId = - typeof r.activeAgentId === 'string' && r.activeAgentId.length > 0 - ? r.activeAgentId - : null; - - const rosterRaw = Array.isArray(r.roster) ? r.roster : []; - const roster: OfficeAgentSnapshot[] = rosterRaw - .map((a) => _validateAgent(a)) - .filter((a): a is OfficeAgentSnapshot => a !== null); - - const taskRaw = r.task as Record | undefined; - const task = taskRaw && typeof taskRaw === 'object' && typeof taskRaw.goal === 'string' - ? { - goal: taskRaw.goal, - context: _optStr(taskRaw.context), - format: _optStr(taskRaw.format), - criteria: Array.isArray(taskRaw.criteria) - ? taskRaw.criteria.filter((x): x is string => typeof x === 'string') - : undefined, - openQuestions: Array.isArray(taskRaw.openQuestions) - ? taskRaw.openQuestions.filter((x): x is string => typeof x === 'string') - : undefined, - } - : undefined; - - const pipelineRaw = r.pipeline as Record | undefined; - const pipeline = pipelineRaw && Array.isArray(pipelineRaw.stages) - ? { - stages: pipelineRaw.stages - .map((s) => _validateStage(s)) - .filter((s): s is { label: string; agentId?: string; status: 'done' | 'active' | 'pending' } => s !== null), - index: typeof pipelineRaw.index === 'number' ? pipelineRaw.index : 0, - } - : undefined; - - const awaitingRaw = r.awaiting as Record | undefined; - const awaiting = awaitingRaw && (awaitingRaw.kind === 'approval' || awaitingRaw.kind === 'clarification') - ? { - kind: awaitingRaw.kind as 'approval' | 'clarification', - questions: Array.isArray(awaitingRaw.questions) - ? awaitingRaw.questions.filter((x): x is string => typeof x === 'string') - : [], - } - : undefined; - - const activity: OfficeActivityItem[] = Array.isArray(r.activity) - ? r.activity - .map((it) => _validateActivity(it)) - .filter((it): it is OfficeActivityItem => it !== null) - : []; - - const newBubbles: OfficeBubbleSeed[] = Array.isArray(r.newBubbles) - ? r.newBubbles - .map((b) => _validateBubble(b)) - .filter((b): b is OfficeBubbleSeed => b !== null) - : []; - - const updatedAt = typeof r.updatedAt === 'number' ? r.updatedAt : Date.now(); - - return { phase, activeAgentId, roster, task, pipeline, awaiting, activity, newBubbles, updatedAt }; -} - -export function makeEmptyOfficeSnapshot(): OfficeSnapshot { - return { - phase: 'idle', - activeAgentId: null, - roster: [], - activity: [], - newBubbles: [], - updatedAt: Date.now(), - }; -} - -// ─────────── helpers ─────────── - -function _optStr(v: unknown): string | undefined { - return typeof v === 'string' ? v : undefined; -} - -function _validateAgent(raw: unknown): OfficeAgentSnapshot | null { - if (!raw || typeof raw !== 'object') return null; - const a = raw as Record; - if (typeof a.agentId !== 'string' || !a.agentId) return null; - - const role = typeof a.roleCategory === 'string' && (VALID_ROLES as ReadonlySet).has(a.roleCategory) - ? (a.roleCategory as OfficeAgentSnapshot['roleCategory']) - : 'support'; - const status: AgentStatus = typeof a.status === 'string' && (VALID_STATUSES as ReadonlySet).has(a.status) - ? (a.status as AgentStatus) - : 'idle'; - - return { - agentId: a.agentId, - agentName: typeof a.agentName === 'string' ? a.agentName : a.agentId, - roleCategory: role, - status, - currentStep: _optStr(a.currentStep), - lastLog: _optStr(a.lastLog), - lastActivityAt: typeof a.lastActivityAt === 'number' ? a.lastActivityAt : 0, - }; -} - -function _validateStage(raw: unknown): { label: string; agentId?: string; status: 'done' | 'active' | 'pending' } | null { - if (!raw || typeof raw !== 'object') return null; - const s = raw as Record; - if (typeof s.label !== 'string') return null; - const statusRaw = String(s.status ?? 'pending'); - const status = (statusRaw === 'done' || statusRaw === 'active' || statusRaw === 'pending') ? statusRaw : 'pending'; - return { label: s.label, agentId: _optStr(s.agentId), status }; -} - -function _validateActivity(raw: unknown): OfficeActivityItem | null { - if (!raw || typeof raw !== 'object') return null; - const a = raw as Record; - if (typeof a.text !== 'string' || typeof a.agentId !== 'string') return null; - const kind = typeof a.kind === 'string' && (VALID_KINDS as ReadonlySet).has(a.kind) - ? (a.kind as OfficeActivityItem['kind']) - : undefined; - return { - ts: typeof a.ts === 'number' ? a.ts : Date.now(), - agentId: a.agentId, - text: a.text, - kind, - }; -} - -function _validateBubble(raw: unknown): OfficeBubbleSeed | null { - if (!raw || typeof raw !== 'object') return null; - const b = raw as Record; - if (typeof b.agentId !== 'string' || typeof b.text !== 'string') return null; - const type = typeof b.type === 'string' && (VALID_BUBBLE_TYPES as ReadonlySet).has(b.type) - ? (b.type as OfficeBubbleSeed['type']) - : 'status'; - return { agentId: b.agentId, text: b.text, type }; -} diff --git a/src/features/astraOffice/view/layoutSchema.ts b/src/features/astraOffice/view/layoutSchema.ts deleted file mode 100644 index 491a2db..0000000 --- a/src/features/astraOffice/view/layoutSchema.ts +++ /dev/null @@ -1,180 +0,0 @@ -/** - * Pixel Office layout 저장 스키마 — workspaceState 의 `g1nation.pixelOfficeLayout` 키 - * 에 저장되는 객체의 런타임 validator + v1 → v2 migration. - * - * 옛 runtime.ts 의 `_isV2Snap()` heuristic 을 정식 schema 로 격상. webview 에서 받는 - * 즉시 한 번 통과시키면 깨진 데이터 / 옛 데이터 모두 안전하게 처리된다. - * - * 백엔드는 unknown 그대로 저장하지만, *로드 직후* 이 validator 를 적용해 정규화한다. - */ - -export interface OfficeDeskCell { - /** 안정적 식별자 — DOM dataset.role 로도 쓰임. */ - roleKey: string; - /** 매핑된 agent id. 비어있으면 unmapped. */ - agentKey: string; - label: string; - charRow: number; // 0~7 - deskSprite: string; - /** 앉은 face. */ - face: 'L' | 'R' | 'U' | 'D'; - boss: boolean; - /** seat 에서 잠시 일어났다 가는 dock 좌표. */ - dock?: [number, number]; - /** 랜덤 roam 후보 좌표들. */ - roam?: Array<[number, number]>; - deskX: number; - deskY: number; - deskW: number; - deskRot: number; - deskZ: number; - seatX: number; - seatY: number; - charRot: number; - charZ: number; - /** 캐릭터를 지운 빈 책상. */ - noChar: boolean; -} - -export interface OfficeProp { - id: string; - name: string; - x: number; - y: number; - w?: number; - rot: number; - z: number; -} - -export interface LayoutV2 { - schema: 2; - cells: OfficeDeskCell[]; - objs: OfficeProp[]; -} - -const VALID_FACES = new Set(['L', 'R', 'U', 'D']); - -/** - * raw 가 valid v2 layout 이면 정규화된 LayoutV2 를, 아니면 null. - * v1 (옛 좌표만 있는 포맷) 은 별도 `migrateLayout()` 사용. - */ -export function validateLayout(raw: unknown): LayoutV2 | null { - if (!raw || typeof raw !== 'object') return null; - const r = raw as Record; - if (!Array.isArray(r.cells)) return null; - - const isV2 = r.schema === 2 || r.cells.some( - (c) => - c && typeof c === 'object' && - (typeof (c as Record).deskSprite === 'string' - || typeof (c as Record).agentKey === 'string' - || typeof (c as Record).charRow === 'number'), - ); - if (!isV2) return null; - - const cells = r.cells.map((c) => _normalizeCell(c)).filter((c): c is OfficeDeskCell => c !== null); - const objsRaw = Array.isArray(r.objs) ? r.objs : []; - const objs = objsRaw.map((o) => _normalizeProp(o)).filter((o): o is OfficeProp => o !== null); - - return { schema: 2, cells, objs }; -} - -/** - * v1 (옛 좌표 패치 포맷) → v2 (전체 station 정의) 마이그레이션. v1 은 좌표만 갖고 있어 - * default station 의 나머지 필드(charRow, deskSprite 등)를 채워줘야 한다. webview 의 - * default station 매핑이 함께 주어져야 정확. 없으면 best-effort. - * - * 이번 세션 stub: v1 입력이 들어오면 v2 shape 으로 일단 변환 (default 필드는 0/빈 값). - * 다음 세션에서 default station 룩업과 결합. - */ -export function migrateLayout(raw: unknown): LayoutV2 | null { - const asV2 = validateLayout(raw); - if (asV2) return asV2; - if (!raw || typeof raw !== 'object') return null; - const r = raw as Record; - if (!Array.isArray(r.cells)) return null; - - const cells: OfficeDeskCell[] = r.cells - .map((cRaw) => { - if (!cRaw || typeof cRaw !== 'object') return null; - const c = cRaw as Record; - if (typeof c.roleKey !== 'string') return null; - return _normalizeCell({ - ...c, - // v1 은 charRow / deskSprite 등이 없으니 안전한 기본값. - charRow: 0, - deskSprite: 'desk-main', - face: 'R', - boss: false, - agentKey: c.roleKey, // 옛 키가 곧 agent 였음. - label: c.roleKey, - noChar: false, - }); - }) - .filter((c): c is OfficeDeskCell => c !== null); - - const objs = Array.isArray(r.objs) - ? r.objs.map((o) => _normalizeProp(o)).filter((o): o is OfficeProp => o !== null) - : []; - - return { schema: 2, cells, objs }; -} - -function _normalizeCell(raw: unknown): OfficeDeskCell | null { - if (!raw || typeof raw !== 'object') return null; - const c = raw as Record; - if (typeof c.roleKey !== 'string' || !c.roleKey) return null; - const face = typeof c.face === 'string' && (VALID_FACES as ReadonlySet).has(c.face) - ? (c.face as OfficeDeskCell['face']) - : 'R'; - return { - roleKey: c.roleKey, - agentKey: typeof c.agentKey === 'string' ? c.agentKey : '', - label: typeof c.label === 'string' ? c.label : c.roleKey, - charRow: _num(c.charRow, 0), - deskSprite: typeof c.deskSprite === 'string' ? c.deskSprite : 'desk-main', - face, - boss: !!c.boss, - dock: _pair(c.dock), - roam: Array.isArray(c.roam) - ? (c.roam.map(_pair).filter(Boolean) as Array<[number, number]>) - : undefined, - deskX: _num(c.deskX, 0), - deskY: _num(c.deskY, 0), - deskW: _num(c.deskW, 112), - deskRot: _num(c.deskRot, 0), - deskZ: _num(c.deskZ, 0), - seatX: _num(c.seatX, 0), - seatY: _num(c.seatY, 0), - charRot: _num(c.charRot, 0), - charZ: _num(c.charZ, 0), - noChar: !!c.noChar, - }; -} - -function _normalizeProp(raw: unknown): OfficeProp | null { - if (!raw || typeof raw !== 'object') return null; - const o = raw as Record; - if (typeof o.name !== 'string') return null; - return { - id: typeof o.id === 'string' ? o.id : `obj_${Math.random().toString(36).slice(2, 8)}`, - name: o.name, - x: _num(o.x, 0), - y: _num(o.y, 0), - w: typeof o.w === 'number' ? o.w : undefined, - rot: _num(o.rot, 0), - z: _num(o.z, 0), - }; -} - -function _num(v: unknown, fallback: number): number { - return typeof v === 'number' && Number.isFinite(v) ? v : fallback; -} - -function _pair(v: unknown): [number, number] | undefined { - if (!Array.isArray(v) || v.length !== 2) return undefined; - const a = typeof v[0] === 'number' ? v[0] : NaN; - const b = typeof v[1] === 'number' ? v[1] : NaN; - if (!Number.isFinite(a) || !Number.isFinite(b)) return undefined; - return [a, b]; -} diff --git a/src/features/astraOffice/view/officeBody.ts b/src/features/astraOffice/view/officeBody.ts deleted file mode 100644 index 51186c1..0000000 --- a/src/features/astraOffice/view/officeBody.ts +++ /dev/null @@ -1,103 +0,0 @@ -export const OFFICE_BODY = ` -
-
-
-
ASTRA OFFICE
-
Operations Floor
-
-
-
대기 중
-
현재 담당Astra
-
-
- -
-
- - - -
- - -
-
-
-
Current Mission
-
새 요청을 기다리고 있습니다.
-
-
- 현재 단계 - 대기 중 -
-
- -
-
-
- -
-
-
-
-
-
-
- - -
- -
-
-
-
Activity
- 최근 실행 -
-
아직 기록된 활동이 없습니다.
-
- -
-
-`; diff --git a/src/features/astraOffice/view/officeStyles.ts b/src/features/astraOffice/view/officeStyles.ts deleted file mode 100644 index ef5aea1..0000000 --- a/src/features/astraOffice/view/officeStyles.ts +++ /dev/null @@ -1,419 +0,0 @@ -export const OFFICE_CSS = ` -:root{ - --bg:#070A12; - --bg-soft:#0D1220; - --surface:rgba(15,21,36,.78); - --surface-strong:rgba(18,25,43,.94); - --surface-faint:rgba(255,255,255,.045); - --line:rgba(255,255,255,.09); - --line-strong:rgba(255,255,255,.16); - --text:#F5F7FC; - --muted:#9BA6BF; - --accent:#8A7CFF; - --accent-2:#46D8FF; - --success:#35D7A4; - --warning:#F5C45A; - --danger:#FF6B7A; - --shadow:0 18px 60px rgba(0,0,0,.42); - --radius-xl:24px; - --radius-lg:18px; - --radius-md:14px; - --radius-sm:10px; -} -*{box-sizing:border-box} -html,body{height:100%} -body{ - margin:0; - background: - radial-gradient(circle at 12% 0%,rgba(138,124,255,.18),transparent 28%), - radial-gradient(circle at 90% 10%,rgba(70,216,255,.12),transparent 24%), - radial-gradient(circle at 50% 100%,rgba(53,215,164,.08),transparent 32%), - linear-gradient(180deg,#070A12 0%,#0A0F1A 100%); - color:var(--text); - font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif; - overflow:hidden; -} -button,input,select{font:inherit} -.office-app{height:100vh;display:grid;grid-template-rows:auto auto minmax(0,1fr) auto;gap:14px;padding:18px} -.topbar{ - min-height:70px; - display:flex; - align-items:center; - justify-content:space-between; - gap:18px; - padding:14px 16px 14px 18px; - border:1px solid var(--line); - border-radius:var(--radius-xl); - background:linear-gradient(180deg,rgba(255,255,255,.08),rgba(255,255,255,.035)); - backdrop-filter:blur(18px); - box-shadow:var(--shadow); -} -.brand-block{display:flex;flex-direction:column;gap:3px;min-width:180px} -.eyebrow,.panel-kicker{font-size:10px;line-height:1;letter-spacing:.16em;text-transform:uppercase;color:var(--muted)} -.h-title{font-size:22px;line-height:1.1;font-weight:750;letter-spacing:-.03em} -.topbar-center{display:flex;align-items:center;justify-content:center;gap:10px;flex:1;min-width:0} -.phase-pill,.agent-pill{ - min-height:38px; - display:flex; - align-items:center; - gap:9px; - padding:0 14px; - border:1px solid var(--line); - border-radius:999px; - background:rgba(255,255,255,.05); - white-space:nowrap; -} -.phase-pill{font-weight:650} -.phase-pill .phase-dot{width:8px;height:8px;border-radius:50%;background:var(--accent);box-shadow:0 0 16px rgba(138,124,255,.8)} -.phase-pill[data-tone="success"] .phase-dot{background:var(--success);box-shadow:0 0 16px rgba(53,215,164,.8)} -.phase-pill[data-tone="warning"] .phase-dot{background:var(--warning);box-shadow:0 0 16px rgba(245,196,90,.8)} -.phase-pill[data-tone="danger"] .phase-dot{background:var(--danger);box-shadow:0 0 16px rgba(255,107,122,.8)} -.agent-pill{color:var(--muted)} -.agent-pill strong{color:var(--text);font-size:13px} -.agent-label{font-size:11px} -.topbar-actions{display:flex;align-items:center;justify-content:flex-end;min-width:180px} -.edit-btn{ - height:38px; - border-radius:999px; - padding:0 15px; - border:1px solid rgba(138,124,255,.35); - color:var(--text); - background:linear-gradient(180deg,rgba(138,124,255,.22),rgba(138,124,255,.12)); - cursor:pointer; - transition:transform .16s ease,border-color .16s ease,background .16s ease; -} -.edit-btn:hover{transform:translateY(-1px);border-color:rgba(138,124,255,.62);background:linear-gradient(180deg,rgba(138,124,255,.3),rgba(138,124,255,.16))} -.edit-toolbar{ - display:flex; - align-items:center; - gap:8px; - flex-wrap:wrap; - padding:10px 12px; - border:1px solid rgba(138,124,255,.28); - border-radius:var(--radius-lg); - background:rgba(138,124,255,.12); - backdrop-filter:blur(16px); -} -.edit-toolbar .et-hint{flex:1;min-width:220px;color:#DCE2F2;font-size:12px} -.edit-toolbar button{ - min-height:32px; - padding:0 11px; - border-radius:999px; - border:1px solid var(--line-strong); - color:var(--text); - background:rgba(255,255,255,.07); - cursor:pointer; -} -.edit-toolbar button:hover{background:rgba(255,255,255,.12)} -.edit-toolbar button.add{border-color:rgba(53,215,164,.4);background:rgba(53,215,164,.12)} -.edit-toolbar button.del{border-color:rgba(255,107,122,.42);background:rgba(255,107,122,.12)} -.edit-toolbar button[disabled]{opacity:.42;cursor:not-allowed} -.workspace{ - min-height:0; - display:grid; - grid-template-columns:260px minmax(620px,1fr) 280px; - gap:14px; -} -.side-panel,.office-shell,.activity-dock{ - border:1px solid var(--line); - border-radius:var(--radius-xl); - background:var(--surface); - backdrop-filter:blur(20px); - box-shadow:var(--shadow); -} -.side-panel{padding:16px;min-height:0;overflow:hidden} -.panel-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:14px} -.panel-head.compact{margin-bottom:16px} -.panel-head h2{font-size:16px;line-height:1.2;letter-spacing:-.02em;margin:6px 0 0} -.count-badge{ - min-width:28px; - height:28px; - display:grid; - place-items:center; - border-radius:999px; - border:1px solid rgba(70,216,255,.25); - background:rgba(70,216,255,.12); - color:#BDEFFF; - font-size:12px; - font-weight:700; -} -.roster-list{display:flex;flex-direction:column;gap:9px;overflow:auto;padding-right:2px;max-height:calc(100vh - 220px)} -.roster-item{ - display:grid; - grid-template-columns:auto minmax(0,1fr); - gap:11px; - align-items:center; - padding:11px; - border-radius:var(--radius-md); - border:1px solid transparent; - background:rgba(255,255,255,.035); - transition:border-color .16s ease,background .16s ease,transform .16s ease; -} -.roster-item[data-agent]{cursor:pointer} -.roster-item.active{border-color:rgba(138,124,255,.48);background:linear-gradient(180deg,rgba(138,124,255,.16),rgba(138,124,255,.08));transform:translateX(2px)} -.roster-item.preview{border-color:rgba(255,255,255,.2);background:rgba(255,255,255,.07)} -.roster-avatar{ - width:33px;height:33px;border-radius:12px; - display:grid;place-items:center; - background:rgba(255,255,255,.08); - border:1px solid var(--line); - color:var(--role-color,var(--accent)); - font-size:11px;font-weight:700; -} -.roster-copy{min-width:0;display:flex;flex-direction:column;gap:3px} -.roster-copy strong{font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} -.roster-meta{display:flex;align-items:center;gap:6px;color:var(--muted);font-size:11px} -.roster-status{width:6px;height:6px;border-radius:50%;background:rgba(255,255,255,.28)} -.roster-item.active .roster-status{background:var(--role-color,var(--accent));box-shadow:0 0 12px var(--role-color,var(--accent))} -.office-shell{min-width:0;display:grid;grid-template-rows:auto auto minmax(0,1fr);overflow:hidden} -.office-shell[data-roster-empty="true"] .office{filter:saturate(.72) brightness(.9)} -.office-shell[data-roster-empty="true"] .stage{opacity:.86} -.office-shell[data-status="executing"] .office{box-shadow:inset 0 0 0 1px rgba(138,124,255,.12),0 0 0 1px rgba(138,124,255,.08)} -.office-shell[data-status="reviewing"] .office{box-shadow:inset 0 0 0 1px rgba(70,216,255,.14),0 0 0 1px rgba(70,216,255,.08)} -.office-shell[data-status="waiting_approval"] .office{box-shadow:inset 0 0 0 1px rgba(245,196,90,.16),0 0 0 1px rgba(245,196,90,.08)} -.office-shell[data-status="error"] .office{box-shadow:inset 0 0 0 1px rgba(255,107,122,.18),0 0 0 1px rgba(255,107,122,.08)} -.mission-strip{ - min-height:72px; - display:flex; - justify-content:space-between; - align-items:center; - gap:18px; - padding:15px 18px; - border-bottom:1px solid var(--line); -} -.mission-title{margin-top:6px;font-size:16px;font-weight:650;letter-spacing:-.02em;max-width:min(560px,52vw);white-space:nowrap;overflow:hidden;text-overflow:ellipsis} -.mission-step-wrap{display:flex;flex-direction:column;align-items:flex-end;gap:5px;min-width:160px} -.mission-step-wrap span{font-size:11px;color:var(--muted)} -.mission-step-wrap strong{font-size:13px;font-weight:650;text-align:right;max-width:220px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} -.mini-map{display:flex;align-items:center;gap:6px;min-height:42px;padding:0 18px;border-bottom:1px solid var(--line);overflow-x:auto;scrollbar-width:none} -.mini-map::-webkit-scrollbar{display:none} -.mini-map .mm-dot{position:relative;width:10px;height:10px;border-radius:50%;background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.18);flex-shrink:0;transition:all .2s ease} -.mini-map .mm-dot[data-status="done"]{background:var(--success);border-color:var(--success);box-shadow:0 0 12px rgba(53,215,164,.35)} -.mini-map .mm-dot[data-status="active"]{width:14px;height:14px;background:var(--accent);border-color:var(--accent);box-shadow:0 0 0 4px rgba(138,124,255,.16)} -.mini-map .mm-bar{flex:1;height:1px;min-width:22px;background:linear-gradient(90deg,rgba(255,255,255,.08),rgba(255,255,255,.18))} -.mini-map .mm-label{position:absolute;left:50%;top:-29px;transform:translateX(-50%);padding:4px 7px;border-radius:999px;background:rgba(6,9,16,.95);border:1px solid var(--line);font-size:10px;white-space:nowrap;color:var(--text);opacity:0;pointer-events:none;transition:opacity .14s ease;z-index:40} -.mini-map .mm-dot:hover .mm-label{opacity:1} -.mini-map .mm-counter{margin-left:6px;color:var(--muted);font-size:11px;white-space:nowrap} -.office-stage-wrap{min-height:0;padding:14px;display:flex} -.office{ - position:relative; - flex:1; - min-height:420px; - overflow:hidden; - display:flex; - align-items:center; - justify-content:center; - border-radius:20px; - border:1px solid rgba(255,255,255,.08); - background: - linear-gradient(180deg,rgba(18,28,48,.98) 0 16%,transparent 16%), - radial-gradient(circle at 50% -10%,rgba(138,124,255,.24),transparent 32%), - radial-gradient(circle at 18% 100%,rgba(70,216,255,.12),transparent 28%), - linear-gradient(135deg,#31283A,#201A29 72%); -} -.office.has-art{ - background: - linear-gradient(180deg,rgba(6,10,18,.06),rgba(6,10,18,.12)), - var(--office-backdrop) center center / cover no-repeat; -} -.office:before{content:'';position:absolute;inset:0;background-image:linear-gradient(rgba(255,255,255,.018) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.018) 1px,transparent 1px);background-size:48px 48px;opacity:.28} -.office.has-art:before{background:linear-gradient(180deg,rgba(4,7,14,.06),transparent 28%,rgba(4,7,14,.1));opacity:1} -.office:after{content:'';position:absolute;inset:0;background:radial-gradient(circle at 50% 50%,transparent 0 42%,rgba(0,0,0,.2) 100%);pointer-events:none} -.stage{position:relative;width:720px;height:585px;margin:0;z-index:2} -.flow-layer{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;overflow:visible;z-index:3} -.flow-route{ - fill:none; - stroke:rgba(138,124,255,.34); - stroke-width:2; - stroke-linecap:round; - stroke-linejoin:round; - stroke-dasharray:5 8; - filter:drop-shadow(0 0 6px rgba(138,124,255,.25)); -} -.flow-node{ - fill:rgba(138,124,255,.18); - stroke:rgba(255,255,255,.34); - stroke-width:1.2; -} -.flow-node[data-status="done"]{fill:rgba(53,215,164,.34);stroke:rgba(53,215,164,.8)} -.flow-node[data-status="active"]{fill:rgba(138,124,255,.6);stroke:#D8D2FF;filter:drop-shadow(0 0 8px rgba(138,124,255,.72))} -.flow-node[data-status="pending"]{fill:rgba(255,255,255,.08);stroke:rgba(255,255,255,.22)} -.wall-window{position:absolute;top:16px;width:86px;height:42px;border:2px solid rgba(215,228,255,.35);border-radius:8px;background:linear-gradient(180deg,rgba(160,208,255,.34),rgba(110,150,210,.08));box-shadow:inset 0 0 0 1px rgba(15,20,31,.55)} -.wall-window.w1{left:84px}.wall-window.w2{left:550px} -.office.has-art .wall-window{display:none} -.obj,.desk,.char{position:absolute;image-rendering:pixelated} -.obj{filter:drop-shadow(3px 5px 0 rgba(0,0,0,.28));z-index:4} -.desk{width:112px;z-index:5;filter:drop-shadow(4px 7px 0 rgba(0,0,0,.28))} -.desk.boss{width:136px} -.label{position:absolute;left:50%;bottom:-15px;transform:translateX(-50%);font-size:10px;color:rgba(245,247,252,.8);white-space:nowrap;text-shadow:0 1px 4px rgba(0,0,0,.8)} -.char{width:56px;height:72px;z-index:7;transition:left .9s cubic-bezier(.2,.7,.2,1),top .9s cubic-bezier(.2,.7,.2,1)} -.char.walking{z-index:14} -.char img{position:absolute;left:0;bottom:0;max-width:100%;max-height:100%;image-rendering:pixelated;filter:drop-shadow(2px 3px 0 rgba(0,0,0,.42));transform-origin:center bottom} -.char.active:before{content:'';position:absolute;left:19px;top:-14px;width:18px;height:18px;border-radius:50%;background:radial-gradient(circle,var(--role-color,var(--accent)) 0 28%,rgba(255,255,255,.18) 30%,transparent 72%);filter:blur(.2px);animation:focusPulse 1.8s ease-in-out infinite} -.char.active::after{content:'';position:absolute;left:-4px;right:-4px;bottom:-7px;height:8px;border-radius:999px;background:radial-gradient(circle,var(--role-color,var(--accent)),transparent 70%);opacity:.82;filter:blur(1px)} -.char.working img{animation:workLean 1.6s ease-in-out infinite} -@keyframes focusPulse{0%,100%{transform:scale(.95);opacity:.88}50%{transform:scale(1.12);opacity:1}} -@keyframes workLean{0%,100%{transform:translateY(0)}50%{transform:translateY(-2px)}} -.char[data-agent="ceo"],.desk[data-agent="ceo"],.roster-item[data-agent="ceo"]{--role-color:#A78BFA} -.char[data-agent="planner"],.desk[data-agent="planner"],.roster-item[data-agent="planner"]{--role-color:#60A5FA} -.char[data-agent="researcher"],.desk[data-agent="researcher"],.roster-item[data-agent="researcher"]{--role-color:#35D7A4} -.char[data-agent="designer"],.desk[data-agent="designer"],.roster-item[data-agent="designer"]{--role-color:#F472B6} -.char[data-agent="developer"],.desk[data-agent="developer"],.roster-item[data-agent="developer"]{--role-color:#F5C45A} -.char[data-agent="qa"],.desk[data-agent="qa"],.roster-item[data-agent="qa"]{--role-color:#46D8FF} -.char[data-agent="inspector"],.desk[data-agent="inspector"],.roster-item[data-agent="inspector"]{--role-color:#FB923C} -.char[data-agent="support"],.desk[data-agent="support"],.roster-item[data-agent="support"]{--role-color:#94A3B8} -.char[data-agent="writer"],.desk[data-agent="writer"],.roster-item[data-agent="writer"]{--role-color:#FBBF24} -.desk::after{content:'';position:absolute;inset:-4px;border-radius:10px;border:1px solid transparent;pointer-events:none;transition:border-color .2s ease,box-shadow .2s ease} -.desk.pipeline-desk::after{border-color:rgba(255,255,255,.12)} -.desk[data-flow="done"]::after{border-color:rgba(53,215,164,.26)} -.desk[data-flow="active"]::after{border-color:rgba(138,124,255,.72);box-shadow:0 0 0 1px rgba(255,255,255,.06),0 0 20px rgba(138,124,255,.34)} -.desk[data-flow="pending"]::after{border-color:rgba(255,255,255,.16)} -.flow-badge{ - position:absolute; - right:-7px; - top:-12px; - min-width:28px; - height:22px; - display:grid; - place-items:center; - padding:0 7px; - border-radius:999px; - border:1px solid rgba(255,255,255,.18); - background:rgba(8,12,22,.88); - color:#E7E2FF; - font-size:10px; - font-weight:750; - letter-spacing:.01em; - box-shadow:0 10px 22px rgba(0,0,0,.24); -} -.desk[data-flow="done"] .flow-badge{color:#B7FFE7;border-color:rgba(53,215,164,.28)} -.desk[data-flow="active"] .flow-badge{color:#F2EFFF;border-color:rgba(138,124,255,.5);background:rgba(31,24,66,.92)} -.desk.preview::after{border-color:rgba(255,255,255,.28);box-shadow:0 0 0 1px rgba(255,255,255,.04),0 0 18px rgba(255,255,255,.16)} -.char.preview::before{content:'';position:absolute;left:18px;top:-14px;width:20px;height:20px;border-radius:50%;border:1px solid rgba(255,255,255,.42);box-shadow:0 0 18px rgba(255,255,255,.18)} -.stage:has(.char.active[data-agent="ceo"]) .desk[data-agent="ceo"]::after, -.stage:has(.char.active[data-agent="planner"]) .desk[data-agent="planner"]::after, -.stage:has(.char.active[data-agent="researcher"]) .desk[data-agent="researcher"]::after, -.stage:has(.char.active[data-agent="designer"]) .desk[data-agent="designer"]::after, -.stage:has(.char.active[data-agent="developer"]) .desk[data-agent="developer"]::after, -.stage:has(.char.active[data-agent="qa"]) .desk[data-agent="qa"]::after, -.stage:has(.char.active[data-agent="inspector"]) .desk[data-agent="inspector"]::after, -.stage:has(.char.active[data-agent="support"]) .desk[data-agent="support"]::after, -.stage:has(.char.active[data-agent="writer"]) .desk[data-agent="writer"]::after{border-color:var(--role-color);box-shadow:0 0 0 1px rgba(255,255,255,.06),0 0 18px color-mix(in srgb,var(--role-color) 35%,transparent)} -.shadow{position:absolute;left:12px;bottom:0;width:28px;height:7px;background:radial-gradient(ellipse,rgba(0,0,0,.55),transparent 70%)} -.bubble{position:absolute;z-index:20;transform:translate(-50%,-100%);max-width:180px;padding:7px 10px;border-radius:14px;border:1px solid rgba(255,255,255,.14);background:rgba(10,14,24,.92);color:var(--text);font-size:11px;line-height:1.35;box-shadow:0 10px 24px rgba(0,0,0,.28);white-space:normal;animation:bubble-pop .22s cubic-bezier(.2,1.4,.6,1)} -@keyframes bubble-pop{from{transform:translate(-50%,-88%) scale(.6);opacity:0}to{transform:translate(-50%,-100%) scale(1);opacity:1}} -/* 감정 태그별 변형 — 희노애락. webtoon 느낌으로 background / 색 / 이모지 prefix. */ -.bubble-joy {background:rgba(254,243,199,.97);color:#7c5d11;border-color:rgba(252,211,77,.6)} -.bubble-joy::before {content:'😊 ';opacity:.85} -.bubble-anger {background:rgba(254,226,226,.97);color:#7f1d1d;border-color:#ef4444;animation:bubble-pop .22s cubic-bezier(.2,1.4,.6,1),bubble-shake .4s ease-in-out 1} -.bubble-anger::before {content:'😠 ';opacity:.85} -.bubble-sorrow {background:rgba(219,234,254,.97);color:#1e3a8a;border-color:rgba(96,165,250,.5)} -.bubble-sorrow::before {content:'😔 ';opacity:.85} -.bubble-panic {background:rgba(254,226,226,.97);color:#9a1c1c;border-color:rgba(248,113,113,.55);animation:bubble-pop .22s cubic-bezier(.2,1.4,.6,1),bubble-shake .5s ease-in-out 1} -.bubble-panic::before {content:'😱 ';opacity:.85} -.bubble-curious {background:rgba(243,232,255,.97);color:#5b21b6;border-color:rgba(167,139,250,.45)} -.bubble-curious::before {content:'🤔 ';opacity:.85} -.bubble-firm {background:rgba(255,255,255,.98);color:#111;border-color:rgba(0,0,0,.18);font-weight:700} -.bubble-firm::before {content:'✋ ';opacity:.85} -.bubble-gratitude{background:rgba(220,252,231,.97);color:#14532d;border-color:rgba(74,222,128,.5)} -.bubble-gratitude::before{content:'🙏 ';opacity:.85} -.bubble-thought {/* default 그대로 */} -@keyframes bubble-shake{0%,100%{transform:translate(-50%,-100%) rotate(0)}25%{transform:translate(-52%,-100%) rotate(-2deg)}75%{transform:translate(-48%,-100%) rotate(2deg)}} -.brief-grid{display:flex;flex-direction:column;gap:10px} -.brief-card{ - padding:14px; - border-radius:var(--radius-md); - border:1px solid var(--line); - background:rgba(255,255,255,.035); -} -.brief-card.hero{background:linear-gradient(180deg,rgba(138,124,255,.16),rgba(255,255,255,.03));border-color:rgba(138,124,255,.28)} -.brief-card span{display:block;font-size:11px;color:var(--muted);margin-bottom:6px} -.brief-card strong{display:block;font-size:17px;line-height:1.2;letter-spacing:-.02em} -.brief-card p{margin:8px 0 0;color:#D6DDF0;font-size:12px;line-height:1.5} -#attentionCard[data-tone="warning"]{border-color:rgba(245,196,90,.32);background:rgba(245,196,90,.08)} -#attentionCard[data-tone="danger"]{border-color:rgba(255,107,122,.34);background:rgba(255,107,122,.08)} -.progress{height:8px;margin-top:12px;border-radius:999px;background:rgba(255,255,255,.08);overflow:hidden} -.bar{height:100%;width:0;border-radius:inherit;background:linear-gradient(90deg,var(--accent),var(--accent-2));transition:width .22s ease} -.activity-dock{padding:14px 16px 15px;display:flex;flex-direction:column;gap:10px} -.activity-head{display:flex;align-items:flex-end;justify-content:space-between;gap:16px} -.activity-head strong{display:block;font-size:14px;margin-top:5px} -.last-log{max-width:65%;font-size:12px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis} -.ticker{position:relative;overflow:hidden} -.tk-track{display:flex;gap:8px;overflow-x:auto;scrollbar-width:none;padding-bottom:1px} -.tk-track::-webkit-scrollbar{display:none} -.tk-item{ - flex-shrink:0; - display:inline-flex; - align-items:center; - gap:7px; - min-height:30px; - padding:0 11px; - border-radius:999px; - border:1px solid var(--line); - background:rgba(255,255,255,.045); - color:#DCE3F3; - font-size:11px; -} -.tk-item.tk-ok{border-color:rgba(53,215,164,.26)} -.tk-item.tk-warn{border-color:rgba(245,196,90,.28)} -.tk-item.tk-err{border-color:rgba(255,107,122,.3)} -.tk-item .tk-agent{color:#C6BEFF;font-weight:650} -.ctx-menu{position:fixed;z-index:1000;background:rgba(10,14,24,.96);border:1px solid var(--line-strong);border-radius:14px;box-shadow:0 18px 48px rgba(0,0,0,.5);padding:6px;min-width:180px;font-size:12px;color:var(--text)} -.ctx-menu-head{padding:7px 10px 8px;font-size:10px;color:var(--muted);border-bottom:1px solid var(--line);margin-bottom:4px} -.ctx-menu-head .cmh-role{color:var(--role-color,#A78BFA);font-weight:700;text-transform:uppercase} -.ctx-menu-item{display:flex;align-items:center;gap:8px;padding:8px 10px;cursor:pointer;border-radius:10px;transition:background .12s ease} -.ctx-menu-item:hover{background:rgba(138,124,255,.16)} -.ctx-menu-item.danger:hover{background:rgba(255,107,122,.14);color:#FFC3CC} -.ctx-menu-divider{height:1px;background:var(--line);margin:4px} -body[data-edit-mode="true"] .ctx-menu{display:none!important} -body:not([data-edit-mode="true"]) .char{cursor:pointer} -.ctx-detail{position:fixed;z-index:1001;background:rgba(10,14,24,.96);border:1px solid var(--line-strong);border-radius:18px;box-shadow:0 20px 56px rgba(0,0,0,.56);padding:18px;color:var(--text);min-width:320px;max-width:520px;max-height:60vh;overflow-y:auto;font-size:12px;line-height:1.5} -.ctx-detail h3{margin:0 0 10px;font-size:14px;color:var(--role-color,#A78BFA);letter-spacing:.02em} -.ctx-detail .cd-close{position:absolute;top:10px;right:12px;background:transparent;border:none;color:var(--muted);font-size:16px;cursor:pointer} -.ctx-detail dl{margin:0;display:grid;grid-template-columns:auto 1fr;gap:4px 14px} -.ctx-detail dt{color:var(--muted);font-weight:600;white-space:nowrap} -.ctx-detail dd{margin:0;color:var(--text);overflow-wrap:anywhere} -.ctx-detail .cd-logs{margin-top:10px;padding:8px 10px;background:rgba(255,255,255,.045);border-radius:12px;font-family:ui-monospace,monospace;font-size:10.5px;max-height:120px;overflow-y:auto} -.prop-panel{position:absolute;right:14px;top:14px;width:250px;background:rgba(10,14,24,.96);border:1px solid var(--line-strong);border-radius:18px;box-shadow:0 18px 48px rgba(0,0,0,.5);padding:14px;font-size:11px;color:var(--text);z-index:25;display:none} -.prop-panel.show{display:block} -.prop-panel h4{margin:0 0 10px;font-size:12px;color:#C6BEFF;letter-spacing:.04em} -.prop-panel .pp-row{margin-bottom:9px} -.prop-panel label{display:block;font-size:10px;color:var(--muted);margin-bottom:4px} -.prop-panel select,.prop-panel input{width:100%;background:rgba(255,255,255,.04);color:var(--text);border:1px solid var(--line);border-radius:10px;padding:6px 8px;font-size:11px} -.prop-panel .pp-thumbs{display:grid;grid-template-columns:repeat(4,1fr);gap:5px;margin-top:5px} -.prop-panel .pp-thumb{width:100%;aspect-ratio:1/1;background:rgba(255,255,255,.04);border:1px solid var(--line);border-radius:10px;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:3px} -.prop-panel .pp-thumb img{max-width:100%;max-height:100%;image-rendering:pixelated} -.prop-panel .pp-thumb.active{border-color:rgba(138,124,255,.7);box-shadow:0 0 0 2px rgba(138,124,255,.18)} -.prop-picker{position:fixed;inset:0;background:rgba(3,5,10,.68);z-index:1100;display:flex;align-items:center;justify-content:center} -.prop-picker-box{background:rgba(10,14,24,.98);border:1px solid var(--line-strong);border-radius:20px;padding:16px;max-width:380px;max-height:80vh;overflow-y:auto;color:var(--text)} -.prop-picker-box h3{margin:0 0 12px;font-size:13px;color:#C6BEFF} -.prop-picker-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px} -.prop-pick{background:rgba(255,255,255,.04);border:1px solid var(--line);border-radius:14px;padding:7px;cursor:pointer;text-align:center} -.prop-pick:hover{border-color:rgba(138,124,255,.6)} -.prop-pick img{max-width:60px;max-height:60px;image-rendering:pixelated} -.prop-pick .pp-name{font-size:10px;color:var(--muted);margin-top:5px;word-break:keep-all} -body[data-edit-mode="true"] .stage{background-image:linear-gradient(rgba(138,124,255,.18) 1px,transparent 1px),linear-gradient(90deg,rgba(138,124,255,.18) 1px,transparent 1px);background-size:32px 32px} -body[data-edit-mode="true"] .desk,body[data-edit-mode="true"] .char,body[data-edit-mode="true"] .obj{cursor:grab;outline:1px dashed rgba(138,124,255,.45)} -body[data-edit-mode="true"] .desk:hover,body[data-edit-mode="true"] .char:hover,body[data-edit-mode="true"] .obj:hover{outline:2px solid rgba(138,124,255,.8);z-index:30} -body[data-edit-mode="true"] .dragging{cursor:grabbing!important;opacity:.72;outline:2px solid var(--warning)!important;z-index:40} -body[data-edit-mode="true"] .selected{outline:2px solid #F472B6!important;box-shadow:0 0 0 4px rgba(244,114,182,.22);z-index:35} -body[data-edit-mode="true"] .char .shadow{display:none} -@media (max-width:1180px){ - .workspace{grid-template-columns:220px minmax(560px,1fr)} - .mission-panel{display:none} -} -@media (max-width:900px){ - body{overflow:auto} - .office-app{height:auto;min-height:100vh;grid-template-rows:auto auto auto auto;padding:14px} - .topbar{flex-wrap:wrap} - .topbar-center{order:3;width:100%;justify-content:flex-start} - .workspace{grid-template-columns:1fr} - .team-panel{display:none} - .mission-panel{display:block} - .office-shell{min-height:620px} - .mission-title{max-width:calc(100vw - 140px)} -} -@media (prefers-reduced-motion: reduce){ - *,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important} -} -`; diff --git a/src/features/astraOffice/view/panelHtml.ts b/src/features/astraOffice/view/panelHtml.ts deleted file mode 100644 index 252dda9..0000000 --- a/src/features/astraOffice/view/panelHtml.ts +++ /dev/null @@ -1,26 +0,0 @@ -// Full Astra Office webview HTML composition. -// 옛 sidebarProvider.ts 의 거대한 _pixelOfficePanelHtml 을 4개 파일로 분리한 entry. -// 이번 세션은 *동작 동등 분리* 만. 다음 세션에 mini view 와 공통 presenter 도입. - -import { OFFICE_CSS } from './officeStyles'; -import { OFFICE_BODY } from './officeBody'; -import { officeRuntimeJs } from './runtime'; - -export interface AstraOfficePanelAssets { - cspSource: string; - derivedBase: string; -} - -export function renderAstraOfficePanelHtml(assets: AstraOfficePanelAssets): string { - return ` - - - - - - -${OFFICE_BODY} -${officeRuntimeJs(assets.derivedBase)}`; -} diff --git a/src/features/astraOffice/view/runtime.ts b/src/features/astraOffice/view/runtime.ts deleted file mode 100644 index 919668d..0000000 --- a/src/features/astraOffice/view/runtime.ts +++ /dev/null @@ -1,2041 +0,0 @@ -// 자동 분리: src/sidebarProvider.ts 4002-5116 (IIFE 본문) 에서 추출. 동작 동등. -// `${assets.derivedBase}` placeholder 는 panelHtml 에서 .replace() 로 실제 값 주입. -// 다음 세션에서 OfficeSnapshot 기반으로 단계적으로 잘라낼 예정. - -const OFFICE_RUNTIME_JS_TEMPLATE = ` -