diff --git a/README.md b/README.md index 17888614..8cb72bfa 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ AI 대화에는 실행 중인 식탁보의 버전, 공식 홈페이지, Windows 일반 설정 창의 `AI 스킬` 탭에서 전용 Codex 스킬을 조회하고 추가, 활성화, 비활성화, 제거할 수 있습니다. AI 대화 창에도 활성 스킬 수를 표시하고 스킬 관리 기능을 제공합니다. TableCloth는 전용 프로필 밖에서 Codex가 찾은 사용자 및 프로젝트 스킬을 대화 실행 전에 끕니다. 스킬 파일과 사용 설정은 Codex 런타임 릴리스 폴더와 분리하므로 런타임 업데이트나 재설치 후에도 유지합니다. -내장 `tablecloth-certificate-expiry` 스킬은 공동인증서 만료일 질문을 처리합니다. 사용자가 조회에 동의하면 호스트의 `TableClothCli.exe`가 기본 NPKI 폴더에서 공개 인증서의 만료 여부를 확인합니다. AI에는 만료된 인증서 수, 향후 30일 안에 만료되는 인증서 수와 조회 완료 여부만 전달합니다. 인증서 이름, 발급자, 일련번호, 파일 경로, 공개 인증서의 내용, 개인키와 Catalog 정보는 전달하지 않습니다. 식탁보 AI는 개별 인증서의 세부 정보나 스크린샷을 직접 확인할 수 없습니다. +[tablecloth-certificate-expiry](https://github.com/yourtablecloth/tablecloth-certificate-expiry) 스킬은 공동인증서 만료일 질문을 처리하며 스킬 마켓플레이스에서 선택해 설치합니다. 새 전용 프로필에는 스킬을 자동 설치하지 않습니다. 사용자가 조회에 동의하면 호스트의 `TableClothCli.exe`가 기본 NPKI 폴더에서 공개 인증서의 만료 여부를 확인합니다. AI에는 만료된 인증서 수, 향후 30일 안에 만료되는 인증서 수와 조회 완료 여부만 전달합니다. 인증서 이름, 발급자, 일련번호, 파일 경로, 공개 인증서의 내용, 개인키와 Catalog 정보는 전달하지 않습니다. 식탁보 AI는 개별 인증서의 세부 정보나 스크린샷을 직접 확인할 수 없습니다. AI 창은 민감 개인정보, 공동인증서 파일과 스크린샷을 입력하거나 링크로 공유하지 말라는 안내를 새 대화의 시작 화면에만 표시합니다. 텍스트 입력에서는 일부 국내 전화번호, 주민등록번호와 주소 형식을 자동으로 가립니다. 정규표현식 기반 필터가 모든 개인정보를 찾아내지는 못합니다. 인식 가능한 인증서 세부 정보와 인증서 스크린샷 링크는 전송 전에 거부합니다. AI 창에는 파일 첨부 기능이 없습니다. 자세한 사용 범위는 [홈페이지의 식탁보 AI 안내](https://yourtablecloth.app/docs/managed-ai)와 [개인정보 처리방침](https://yourtablecloth.app/docs/privacy)에서 확인할 수 있습니다. @@ -107,6 +107,8 @@ WinGet 등록소 반영에는 GitHub Release 게시 이후 시간이 더 걸릴 - [업데이트 채널 문제 해결](docs/TROUBLESHOOTING_UPDATE_CHANNEL.md) - [Avalonia와 Native AOT 전환 기록](docs/AVALONIA_AOT_MIGRATION.md) - [식탁보 AI Preview 구현 및 검증](docs/poc/managed-ai-runtime.md) +- [스킬 마켓플레이스와 원격 카탈로그](docs/SKILL_MARKETPLACE.ko.md), [English](docs/SKILL_MARKETPLACE.md) +- [AppContainer 스킬 스크립트 실행 PoC와 평가 결과](tools/appcontainer-skill-poc/README.ko.md), [English](tools/appcontainer-skill-poc/README.md) - [Windows Sandbox 내부 Codex CLI와 Computer Use 탐색 기록](docs/poc/codex-sandbox-computer-use.ko.md), [English](docs/poc/codex-sandbox-computer-use.md) - [Windows Sandbox RDP 호스팅 실험과 검증 기록](docs/poc/rdp-sandbox.ko.md), [English](docs/poc/rdp-sandbox.md) diff --git a/docs/RELEASING.md b/docs/RELEASING.md index 16f8aa2e..a06aafca 100644 --- a/docs/RELEASING.md +++ b/docs/RELEASING.md @@ -175,7 +175,7 @@ if ($mismatch) { throw ($mismatch -join [Environment]::NewLine) } 최종 검증에서는 Draft의 모든 `.exe` 자산을 다시 내려받아 Authenticode 상태가 `Valid`인지 확인합니다. Portable ZIP 내부의 `TableCloth.exe`, `TableClothCli.exe`, `Spork.exe`도 풀어서 같은 검사를 수행합니다. x64와 arm64 자산과 Velopack 채널 메타데이터를 확인하고 Retail에서는 SBOM도 확인합니다. -NativeAOT 설치본에서는 한국어 Windows의 기본 화면과 AI 대화창이 한국어인지 확인합니다. 영어 UI 환경에서는 AI 대화창, 링크 선택창, 스킬 설정창을 영어로 표시하는지 살펴봅니다. 기존 Codex 전용 프로필을 유지한 채 두 내장 스킬을 다시 불러오고 `BlockedByPolicy`가 발생하지 않는지도 확인합니다. +NativeAOT 설치본에서는 한국어 Windows의 기본 화면과 AI 대화창이 한국어인지 확인합니다. 영어 UI 환경에서는 AI 대화창, 링크 선택창, 스킬 설정창을 영어로 표시하는지 살펴봅니다. 새 전용 프로필에는 스킬을 자동 설치하지 않으며 첫 화면에는 기본 카드 세 개와 스킬 카탈로그 안내 링크를 표시하는지 확인합니다. 마켓플레이스에서 `tablecloth-certificate-expiry`와 `tablecloth-windows-sandbox`를 선택해 설치한 뒤 활성화와 제거를 확인하고 `BlockedByPolicy`가 발생하지 않는지도 확인합니다. 기존 프로필의 사용자 설치 파일과 활성 설정은 유지합니다. 서명 검증이나 자산 대조가 하나라도 실패하면 Draft를 유지합니다. CI 미서명 자산을 남겨 둔 채 일부 파일만 게시하지 않습니다. diff --git a/docs/SKILL_MARKETPLACE.ko.md b/docs/SKILL_MARKETPLACE.ko.md new file mode 100644 index 00000000..4587ddf2 --- /dev/null +++ b/docs/SKILL_MARKETPLACE.ko.md @@ -0,0 +1,71 @@ +# 스킬 마켓플레이스와 원격 카탈로그 + +2026년 10월 25일 기준으로 이번 구현은 식탁보 `develop` 계열을 대상으로 합니다. 마켓플레이스는 TableClothCatalog의 별도 XML 스킬 카탈로그를 읽고 식탁보 AI 전용 Codex 프로필에 설치한 스킬을 관리합니다. 현재 공개한 Preview 릴리스에는 이번 변경을 포함하지 않습니다. + +`develop` 통합에는 평가 도구로 독립 [AppContainer 실행 PoC](../tools/appcontainer-skill-poc/README.ko.md)를 포함합니다. 공개 카탈로그는 실제 테스트를 위한 고정 스크립트 후보 3개를 포함해 총 6개를 제공합니다. PoC의 중계기와 런타임은 제품 채팅 창에 연결하지 않으므로 설치만으로 대화에서 해당 스크립트를 실행할 수는 없습니다. + +마켓플레이스에서 스킬 검색, 출처와 라이선스 열람, 설치와 업데이트, 로컬 스킬 관리를 제공합니다. 카탈로그에는 공개 상태나 검토 상태를 두지 않습니다. 주석 밖에 있는 스킬 항목을 설치 대상으로 표시합니다. + +이 문서에서는 창의 사용 경로부터 카탈로그 계약, 설치와 업데이트, 로컬 저장 범위, 검증 범위 순서로 살펴보겠습니다. [English](SKILL_MARKETPLACE.md) + +## AI 설정에서 여는 마켓플레이스 + +마켓플레이스의 진입 경로를 정리하겠습니다. **옵션 > AI 스킬 > 스킬 마켓플레이스 열기**를 선택하면 별도 창을 엽니다. 창에서 **카탈로그 탐색**과 **설치된 스킬** 두 탭을 제공합니다. 검색으로 스킬 목록을 좁히고 카탈로그의 분야 필터로 스킬을 선택할 수 있습니다. 스킬을 선택하면 출처, 저자, 라이선스, 원본 버전과 사용 조건을 표시합니다. + +옵션 탭에는 짧은 사용 안내와 마켓플레이스 열기 버튼만 표시합니다. AI 창의 **OpenAI 계정 / 설정 > 전용 스킬 > 설치된 AI 스킬 관리**를 선택하면 설치된 스킬 탭을 바로 엽니다. 대화 상자를 닫으면 AI 창이 활성 스킬 수와 스킬 사용 상태를 다시 조회합니다. + +첫 메시지 화면에는 서비스 찾기, 공공서비스 찾기와 세금 신고 사이트 찾기 카드 세 개를 표시합니다. 더 많은 기능을 안내하는 링크는 마켓플레이스의 카탈로그 탭을 열어 새 스킬을 선택하고 설치할 수 있도록 연결합니다. 기본 구성에는 스킬을 포함하지 않으며 기존 설치본은 계속 관리할 수 있습니다. + +이어서 카탈로그 조회와 로컬 작업의 관계를 짚어보겠습니다. 두 작업은 진행 상태를 각각 관리합니다. 카탈로그 요청에 실패해도 설치된 스킬을 관리할 수 있습니다. [창](../src/TableCloth.App/Dialogs/SkillMarketplaceWindow.axaml)과 [뷰 모델](../src/TableCloth.App/ViewModels/SkillMarketplaceWindowViewModel.cs)이 이 동작을 구현합니다. + +## 버전을 지정하는 별도 XML 카탈로그 + +카탈로그는 `https://catalog.yourtablecloth.app/SkillCatalog.xml`에서 제공합니다. 원본은 [TableClothCatalog의 docs 디렉터리](https://github.com/yourtablecloth/TableClothCatalog/tree/main/docs)에 두며 `SkillCatalog.xsd`와 기여 안내를 함께 관리합니다. 기존 Pages 워크플로가 `main`에 반영한 파일을 게시합니다. + +`SkillCatalog Version="1"` 아래에 고정 ID를 가진 `Skill` 항목을 기록합니다. 각 항목은 GitHub 저장소, 경로, `Source.Ref`에 고정한 원본 커밋을 지정합니다. 설명, 저자, SPDX 식별자, 라이선스 근거, 런타임과 네트워크 요구 사항, 설치 방식, 사용 조건도 기록합니다. `Skill` 블록을 주석 처리하거나 삭제하면 원격 목록에서 제외합니다. 기존 설치본은 계속 관리할 수 있습니다. [공용 모델](../src/TableCloth.ManagedAi.Core/SkillCatalog.cs)에 애플리케이션이 읽는 필드를 정의했습니다. + +활성 카탈로그에는 스킬 6개를 표시합니다. 그중 `official-report-skillset`, [tablecloth-certificate-expiry](https://github.com/yourtablecloth/tablecloth-certificate-expiry), [tablecloth-windows-sandbox](https://github.com/yourtablecloth/tablecloth-windows-sandbox)는 지침이나 기존 호스트 브리지를 사용합니다. 보고서 스킬은 초안 작성을 위한 지침과 참고 문서를 제공합니다. 나머지 두 스킬은 설치와 활성화 후 API 키 없이 식탁보의 호스트 브리지가 제공한 로컬 보고서를 해석합니다. 새 프로필에 이 스킬들을 자동으로 설치하지는 않습니다. + +`bok-ecos-stats`, `kosis-stats`, `tablecloth-calculators`는 고정 원본의 AppContainer 평가 후보로만 활성화합니다. 제품 대화는 이 스킬들이 요구하는 스크립트 실행을 지원하지 않습니다. `korean-jangbu-for`와 `korean-law-mcp`는 MCP 연결과 추가 설정을 요구하므로 주석으로 보류합니다. 이전에 보류한 다른 후보도 주석으로 보존하며 설치 대상으로 제공하지 않습니다. [스킬 제공 기준](https://github.com/yourtablecloth/TableClothCatalog/blob/main/docs/SKILL_ELIGIBILITY.ko.md)과 [AppContainer 평가 보고서](https://github.com/yourtablecloth/TableClothCatalog/blob/main/docs/APP_CONTAINER_POC.ko.md)에서 정확한 원본 버전과 평가 예외를 설명합니다. API 키 설정과 DPAPI 자격 증명 관리는 [다음 버전 이슈 #321](https://github.com/yourtablecloth/TableCloth/issues/321)에서 계속 추적합니다. + +## 카탈로그 버전에 맞춘 설치와 업데이트 + +원격 설치와 버전 교체 동작을 확인하겠습니다. 미설치 스킬을 선택하면 검토 승인 없이 설치 버튼을 사용할 수 있습니다. 설치 시 클라이언트가 스킬 ID로 현재 카탈로그를 다시 조회합니다. 원본은 고정한 커밋의 upstream 스킬을 가리키며 라이선스 근거는 같은 저장소와 커밋의 파일을 가리킵니다. 클라이언트는 잘못된 메타데이터나 파일을 검증 단계에서 거절합니다. 이전 카탈로그의 상태 속성은 전환 기간에 읽을 수 있지만 설치를 제한하는 데 사용하지 않습니다. + +클라이언트는 Git 체크아웃 없이 GitHub REST API로 선택한 파일을 조회합니다. 경로와 저장소 항목을 검사하고 요청 및 다운로드 크기를 제한합니다. 링크와 서브모듈을 거절하며 임시 디렉터리에 파일을 받은 뒤 설치를 확정합니다. 고정한 라이선스 파일도 `LICENSE.upstream`으로 보존합니다. XML 파서는 외부 엔터티와 DTD를 허용하지 않습니다. [OpenAI 백엔드](../src/TableCloth.ManagedAi.OpenAi/Skills)가 이 검사를 수행합니다. + +마켓플레이스는 설치 시 카탈로그 ID, 저장소, 경로와 원본 커밋을 보관합니다. 같은 출처의 `Source.Ref`가 달라지면 카탈로그와 설치된 스킬 화면에서 해당 버전으로 업데이트할 수 있습니다. 커밋 해시는 버전을 구분하며 시간상 선후 관계를 뜻하지 않습니다. 업데이트는 교체 파일을 임시 폴더에서 검증한 뒤 설치본에 반영합니다. 검증에 실패하거나 작업을 취소하면 기존 파일, 버전 정보와 사용 설정을 보존합니다. 같은 ID의 로컬 스킬 가져오기 항목은 마켓플레이스 업데이트로 덮어쓰지 않습니다. + +다만 후보에 따라 API 키, OAuth 자격 증명, MCP 연결, 추가 패키지 또는 스크립트 실행을 요구합니다. 카탈로그의 사용 조건에 이러한 의존성을 기록합니다. 스킬 파일을 설치해도 서비스 자격 증명을 제공하거나 MCP 서버를 구성하거나 명령 실행을 허용하지 않습니다. [스킬 제공 기준](https://github.com/yourtablecloth/TableClothCatalog/blob/main/docs/SKILL_ELIGIBILITY.ko.md)은 평가용 고정 스크립트 3개를 제외하고 필수 실행 경로를 제공하지 못하는 후보를 주석으로 보관합니다. 평가 예외로 제품 호환성을 입증하지는 않습니다. + +## 설치본의 로컬 관리 범위 + +설치된 스킬 화면에서 폴더 가져오기, 카탈로그 버전으로 업데이트, 활성화와 비활성화, 확인 후 제거, 새로 고침, 스킬 폴더 열기를 제공합니다. 마켓플레이스에서 설치한 항목에는 설치 당시의 원본 버전을 표시합니다. 사용 설정은 이후 AI 작업에 적용합니다. 제거 시 해당 전용 폴더와 출처 정보를 함께 삭제합니다. 카탈로그에서 내린 스킬이나 원격 조회에 실패한 경우에도 제거할 수 있습니다. + +잘못된 `SKILL.md`도 오류 상태로 목록에 표시합니다. 해당 항목을 비활성화하거나 폴더를 열어 확인하고 개별 제거할 수 있습니다. 다른 스킬의 관리도 계속할 수 있습니다. 오류 항목의 활성화는 차단합니다. AI 실행은 잘못된 관리 대상 manifest를 복구하거나 제거할 때까지 오류로 중단합니다. + +스킬은 `%LOCALAPPDATA%\TableCloth\ManagedAi\profiles\openai-codex\codex-home\skills`에 보관합니다. 기존 가져오기 기능과 작업 잠금이 변경 작업을 제어합니다. 마켓플레이스는 이 프로필을 관리합니다. 사용자 전역 Codex 프로필과 스킬은 관리 범위에 포함하지 않습니다. [스킬 관리자](../src/TableCloth.ManagedAi.OpenAi/Skills/OpenAiCodexSkillManager.cs)와 [관리 경로](../src/TableCloth.ManagedAi.Core/ManagedAiPaths.cs)에서 저장 범위를 확인할 수 있습니다. + +## 네이티브 Codex와 호스트 브리지 및 AppContainer 평가 + +AI 사용 준비 과정에서는 대화와 검색에 사용하는 네이티브 Codex CLI를 설치합니다. Node.js와 Python은 설치하지 않습니다. 마켓플레이스에도 언어 런타임 설치, 버전 표시와 진단 기능을 제공하지 않습니다. [Codex 설치기](../src/TableCloth.ManagedAi.OpenAi/Distribution/OpenAiCodexPackageInstaller.cs)는 스킬 파일 설치기와 별도로 유지합니다. + +[전용 프로필](../src/TableCloth.ManagedAi.Windows/WindowsManagedAiProfile.cs)은 `shell_tool=false`와 `unified_exec=false`를 유지합니다. [호출 구성](../src/TableCloth.ManagedAi.OpenAi/Execution/OpenAiCodexInvocationBuilder.cs)은 `read-only` 샌드박스와 `never` 승인 정책을 사용합니다. [대화 지침](../src/TableCloth.ManagedAi.OpenAi/Execution/OpenAiChatPromptFactory.cs)도 명령 실행을 금지합니다. 스킬을 설치해도 이 설정을 변경하지 않습니다. 읽기 전용 실행으로 모든 읽기 접근을 격리하거나 네트워크 접근을 차단한다고 보장하지는 않습니다. + +인증서 만료와 Windows Sandbox 연동에서는 앱이 소유한 호스트 브리지를 사용합니다. [AI 창](../src/TableCloth.App/ManagedAi/ManagedAiWindow.cs)이 지원하는 사용자 요청을 인식하면 모델에 보고서를 보내기 전에 브리지를 실행합니다. 인증서 브리지는 사용자 동의를 받고 만료 건수만 전달합니다. Sandbox 브리지는 `list`, `start`, `stop`, `connect`, `ip`를 지원하며 종료 전에 사용자에게 확인합니다. 모델은 전달받은 보고서를 설명합니다. 두 연동은 Node.js나 Python에 의존하지 않습니다. `Network="none"`은 스킬 자체의 데이터 접근 조건을 나타내며 Codex 대화는 온라인 연결을 사용합니다. + +독립 [AppContainer PoC](../tools/appcontainer-skill-poc/README.ko.md)는 별도 평가 런타임을 준비하고 고정 Python과 Node 스크립트를 테스트 중계기로 제공합니다. 제품 설치기나 채팅 프로필과 연결하지 않고 별도로 실행합니다. [평가 결과](../tools/appcontainer-skill-poc/RESULTS.ko.md)는 격리 실행과 고정 응답을 사용한 Codex 및 MCP 연결을 실제 모델의 도구 선택과 구분합니다. 평가 도구를 `develop`에 병합해도 제품 채팅에 중계기를 등록하거나 마켓플레이스에 언어 런타임 설치 기능을 복원하지는 않습니다. + +## 자동 검증과 게시 경로의 구분 + +자동 검증의 범위를 검토하겠습니다. 테스트는 검토 조건 없는 카탈로그 파싱, 다운로드 검증, 버전 추적, 교체 실패 시 복구, 제거와 뷰 모델 명령을 다룹니다. 백엔드 테스트는 합성 응답으로 실패와 복구 경로를 검사합니다. Avalonia 헤드리스 테스트는 언어, 테마와 창 크기를 달리해 마켓플레이스의 두 탭을 검사합니다. [스킬 테스트](../src/TableCloth.ManagedAi.Test/SkillMarketplaceTests.cs)와 [UI 테스트](../src/TableCloth.Test/SkillMarketplaceTests.cs)에 검증 항목을 기록했습니다. + +테스트용 응답, 실제 저장소 다운로드와 네이티브 Codex 스킬 조회는 서로 다른 범위를 검증합니다. 테스트용 응답은 구현한 계약을 검사합니다. 실제 다운로드와 스킬 조회로는 설치 파일, 메타데이터와 활성 상태를 확인할 수 있습니다. 어느 결과도 모델의 스크립트 호출이나 외부 서비스, API 자격 증명, MCP 연결의 정상 동작을 입증하지 않습니다. 별도 [PoC 결과](../tools/appcontainer-skill-poc/RESULTS.ko.md)는 실측한 x64 호스트의 격리 실행, 고정 공개 서비스 표본 2개와 로컬 응답 모의 서버를 사용한 CLI 및 MCP 연결을 기록합니다. 실제 모델의 도구 선택, 제품 대화의 자동 스크립트 실행, Windows 10 22H2와 ARM64는 미검증으로 남깁니다. 호스트 브리지도 로컬 CLI와 Windows 기능에 의존하므로 스킬 목록에 표시된 사실만으로 실제 호스트 작업의 성공을 판단하지 않습니다. + +카탈로그와 애플리케이션은 서로 다른 경로로 배포합니다. TableClothCatalog가 XML을 게시하면 원격 후보를 조회할 수 있습니다. 사용자는 이후 식탁보 빌드에서 마켓플레이스 창을 사용할 수 있습니다. 카탈로그 게시를 기다리는 동안에도 애플리케이션에서 설치된 스킬을 관리할 수 있습니다. + +## 카탈로그 변경과 기존 설치본 관리 + +여기까지 정리하면 카탈로그는 활성 `Skill` 블록으로 설치 대상을 제공합니다. 관리자가 원본 커밋과 해당 라이선스 경로를 갱신하면 마켓플레이스가 그 버전을 업데이트 대상으로 표시합니다. 블록을 주석 처리하면 원격 목록에서 내립니다. [카탈로그 기여 안내](https://github.com/yourtablecloth/TableClothCatalog/blob/main/docs/SkillCatalog.README.ko.md)에서 작성 규칙을 다룹니다. + +원격 목록에서 내려도 사용자가 기존 설치본을 계속 관리합니다. 다른 카탈로그 버전이 있으면 업데이트하고 더 이상 사용하지 않을 때는 제거할 수 있습니다. 설치본을 보관해도 부족한 실행 권한, 서비스 자격 증명과 MCP 구성을 제공하지는 않습니다. diff --git a/docs/SKILL_MARKETPLACE.md b/docs/SKILL_MARKETPLACE.md new file mode 100644 index 00000000..13995da7 --- /dev/null +++ b/docs/SKILL_MARKETPLACE.md @@ -0,0 +1,71 @@ +# Skill marketplace and remote catalog + +As of October 25, 2026, the marketplace implementation targets the TableCloth `develop` line. It reads a separate XML skill catalog from TableClothCatalog and manages the skills in TableCloth AI's dedicated Codex profile. This work does not change the published Preview release. + +The `develop` integration includes a standalone [AppContainer execution PoC](../tools/appcontainer-skill-poc/README.md) as evaluation tooling. The public catalog offers six entries, including three pinned script candidates for hands-on evaluation. The PoC does not connect its broker or runtimes to the product chat window, so installation alone does not enable those scripts in a conversation. + +The marketplace combines skill discovery, source and license information, installation, updates, and local skill management. Catalog entries have no listing or review states. An uncommented entry is offered for installation. + +This guide explains the window, catalog contract, installation and updates, local storage, and verification boundaries in that order. [한국어](SKILL_MARKETPLACE.ko.md) + +## Marketplace access from AI settings + +Open **Options > AI skills > Open skill marketplace**. The marketplace provides two tabs: **Browse catalog** and **Installed skills**. Search narrows the skill lists, and the catalog also supports a category filter. Selecting a skill shows its source, author, license, source revision, and usage requirements. + +The Options tab contains a short guide and the marketplace entry. In the AI window, **OpenAI account / settings > Dedicated skills > Manage installed AI skills** opens the installed-skill view directly. Closing that dialog refreshes the AI window's enabled-skill count and skill availability. + +The first-message view shows three cards: finding a service, finding a public service, and finding a tax filing site. A link for more features opens the marketplace's Catalog tab to discover and install skills. New profiles start without preinstalled skills; existing installations remain manageable. + +Catalog loading and local management use separate operation states. A failed catalog request leaves installed-skill management available. The [window](../src/TableCloth.App/Dialogs/SkillMarketplaceWindow.axaml) and [view model](../src/TableCloth.App/ViewModels/SkillMarketplaceWindowViewModel.cs) own this behavior. + +## A separate versioned XML catalog + +The application reads `https://catalog.yourtablecloth.app/SkillCatalog.xml`. The source lives in [TableClothCatalog's catalog directory](https://github.com/yourtablecloth/TableClothCatalog/tree/main/docs), alongside `SkillCatalog.xsd` and its contributor guide. The catalog's existing Pages workflow publishes the files after a change reaches `main`. + +`SkillCatalog Version="1"` contains `Skill` entries with stable IDs. Each entry identifies a GitHub repository, a path, and an immutable source commit in `Source.Ref`. Descriptions, authors, SPDX identifiers, license evidence, runtime and network requirements, install mode, and usage notes describe each skill. Commenting out or removing a `Skill` block withdraws it from the remote list. Installed copies remain manageable. See the [shared model](../src/TableCloth.ManagedAi.Core/SkillCatalog.cs). + +The active catalog lists six skills. Three use instructions or existing host bridges: `official-report-skillset`, [tablecloth-certificate-expiry](https://github.com/yourtablecloth/tablecloth-certificate-expiry), and [tablecloth-windows-sandbox](https://github.com/yourtablecloth/tablecloth-windows-sandbox). The report skill supplies drafting instructions and references. The other two interpret local reports supplied by TableCloth's host bridge after installation and activation without API keys. New profiles do not install these skills automatically. + +`bok-ecos-stats`, `kosis-stats`, and `tablecloth-calculators` are active only as pinned AppContainer evaluation candidates. Their required scripts remain unsupported in product chat. `korean-jangbu-for` and `korean-law-mcp` remain commented out because they require an MCP connection and further setup. Other previously deferred candidates also remain in comments and are not offered for installation. The [skill eligibility policy](https://github.com/yourtablecloth/TableClothCatalog/blob/main/docs/SKILL_ELIGIBILITY.md) and [AppContainer evaluation report](https://github.com/yourtablecloth/TableClothCatalog/blob/main/docs/APP_CONTAINER_POC.md) document the exact source revisions and evaluation exception. API-key settings and DPAPI credential management remain deferred to the next version in [issue #321](https://github.com/yourtablecloth/TableCloth/issues/321). + +## Installation and changes to the catalog revision + +Selecting an uninstalled skill enables installation without review approval. Installation rechecks the current catalog by skill ID. The source must identify an installable upstream skill at a fixed commit, and its license source must point to a file in the same repository at that commit. Technical validation still rejects invalid metadata or contents. Legacy review attributes from the earlier catalog are accepted for transition and do not grant or deny installation. + +The client fetches selected files through GitHub REST APIs without a Git checkout. It validates paths and repository entries, bounds requests and downloaded data, rejects links and submodules, and stages files before committing an installation. It preserves the pinned license file as `LICENSE.upstream`. XML parsing disables external entities and DTDs. The [OpenAI backend](../src/TableCloth.ManagedAi.OpenAi/Skills) implements these checks. + +Marketplace installations retain their catalog ID, repository, path, and source commit. When the same source has a different `Source.Ref`, both views offer an update to that catalog revision. Commit hashes identify revisions but do not establish chronological order. Updating stages and validates the replacement before changing the installed copy. Failed or cancelled validation preserves the existing files, recorded revision, and enabled setting. A local import with the same ID is not replaced by a marketplace update. + +Some candidates need API keys, OAuth credentials, an MCP connection, additional packages, or script execution. Catalog notes describe those dependencies. Installing skill files does not supply credentials, configure an MCP server, or enable command execution. The [skill eligibility policy](https://github.com/yourtablecloth/TableClothCatalog/blob/main/docs/SKILL_ELIGIBILITY.md) keeps unsupported candidates commented out except for the three exact script revisions offered for evaluation. That exception does not establish product compatibility. + +## Local control of installed skills + +The installed view supports folder import, updates to the catalog revision, enable and disable actions, removal with confirmation, refresh, and opening skill folders. It displays the installed source revision for marketplace installations. Enabled-state changes apply to subsequent AI operations. Removing a skill removes its dedicated folder and source metadata. Removal is available even when the catalog no longer contains the skill or cannot be reached. + +A malformed `SKILL.md` remains visible with an invalid-manifest state. It can be disabled, inspected, or removed while other skills remain manageable. Enabling that entry is blocked. AI execution still rejects invalid managed manifests until they are repaired or removed. + +Skills remain under `%LOCALAPPDATA%\TableCloth\ManagedAi\profiles\openai-codex\codex-home\skills`. TableCloth's existing importer and operation lock continue to control mutations. The marketplace manages this profile; the user's global Codex profile and skills remain outside its scope. See [the skill manager](../src/TableCloth.ManagedAi.OpenAi/Skills/OpenAiCodexSkillManager.cs) and [managed paths](../src/TableCloth.ManagedAi.Core/ManagedAiPaths.cs). + +## Native Codex, host bridges and AppContainer evaluation + +AI setup installs the native Codex CLI used for chat and search. It does not install Node.js or Python. The marketplace has no language-runtime installation, version, or diagnostic controls. The [Codex installer](../src/TableCloth.ManagedAi.OpenAi/Distribution/OpenAiCodexPackageInstaller.cs) remains separate from the skill-file installer. + +The [managed profile](../src/TableCloth.ManagedAi.Windows/WindowsManagedAiProfile.cs) keeps `shell_tool=false` and `unified_exec=false`. The [invocation builder](../src/TableCloth.ManagedAi.OpenAi/Execution/OpenAiCodexInvocationBuilder.cs) uses a `read-only` sandbox and `never` approval policy. The [chat instructions](../src/TableCloth.ManagedAi.OpenAi/Execution/OpenAiChatPromptFactory.cs) prohibit command execution. Skill installation does not change these settings. Read-only execution does not establish complete read isolation or network confinement. + +The certificate-expiry and Windows Sandbox integrations use application-owned host bridges. The [AI window](../src/TableCloth.App/ManagedAi/ManagedAiWindow.cs) recognizes a supported user request and runs the bridge before sending its report to the model. The certificate bridge asks for consent and sends expiry counts only. The Sandbox bridge supports `list`, `start`, `stop`, `connect`, and `ip`; stopping a session requires confirmation. The model explains the supplied report instead of invoking a shell. Neither integration requires Node.js or Python. `Network="none"` describes the skill's own data-access requirements; Codex chat still uses an online connection. + +The standalone [AppContainer PoC](../tools/appcontainer-skill-poc/README.md) prepares separate evaluation runtimes and exposes fixed Python and Node scripts through its test broker. It runs independently of the product installer and chat profile. Its [results](../tools/appcontainer-skill-poc/RESULTS.md) distinguish contained execution and deterministic Codex/MCP routing from real model selection. Merging these tools into `develop` does not register that broker in product chat or restore language-runtime installation in the marketplace. + +## Verification and publication boundaries + +Automated checks cover catalog parsing without review gates, download validation, revision tracking, replacement rollback, removal, and view-model actions. Backend fixtures use synthetic responses to exercise failure and recovery paths. Headless Avalonia checks exercise the two marketplace tabs across languages, themes, and window sizes. See [skill tests](../src/TableCloth.ManagedAi.Test/SkillMarketplaceTests.cs) and [UI tests](../src/TableCloth.Test/SkillMarketplaceTests.cs). + +Fixture results, downloads from real repositories, and native Codex skill discovery establish different properties. Fixtures check the implemented contracts. Real downloads and discovery can confirm installed files, metadata, and enabled state. Neither establishes that the model invoked a script or that an external service, API credential, or MCP connection works. The separate [PoC results](../tools/appcontainer-skill-poc/RESULTS.md) record contained execution, two fixed public-service samples and CLI/MCP routing using a deterministic local response stub on the measured x64 host. Real model selection, automatic script execution in product chat, Windows 10 22H2 and ARM64 remain unverified. The host bridges also depend on the local CLI and Windows capabilities; a skill listing alone does not establish successful host execution. + +The catalog and application have separate release paths. The catalog becomes available after TableClothCatalog publishes it. Users receive the window through a subsequent TableCloth build. An application build can manage installed skills while catalog publication is still pending. + +## Catalog maintenance and installed revisions + +Catalog maintainers publish an installable source by keeping its `Skill` block active. Changing the pinned source commit and matching license source offers that revision as an update. Commenting out the block withdraws the remote listing. See the [catalog contributor guide](https://github.com/yourtablecloth/TableClothCatalog/blob/main/docs/SkillCatalog.README.md). + +Installed files remain under local control after withdrawal. Users can update when a different catalog revision is available or remove the skill independently of the catalog. Keeping an installed copy does not supply missing execution permissions, credentials, or MCP configuration. diff --git a/docs/poc/managed-ai-runtime.md b/docs/poc/managed-ai-runtime.md index 143de94c..8ec38b24 100644 --- a/docs/poc/managed-ai-runtime.md +++ b/docs/poc/managed-ai-runtime.md @@ -30,9 +30,9 @@ The official metadata client selected version `0.156.1`, target `x86_64-pc-windo The [static input sanitizer](../../src/TableCloth.ManagedAi.Core/SensitiveDataSanitizer.cs) replaces recognizable Korean resident registration numbers, telephone numbers, and road-name or lot-number addresses with category markers in the chat composer. The chat session stores and sends the masked text, and prompt construction applies the same filter to direct requests, user history, and the local Sandbox report. The certificate-material guard runs before final send-time and prompt masking. The pinned warning explains that automatic matching may miss personal data. Address matching follows the [official road-name address structure](https://juso.go.kr/) and also covers common lot-number forms; regular expressions cannot identify every personal detail or establish legal anonymization. The filter does not inspect images or linked content, so the warning against supplying sensitive material remains in force. -The built-in [certificate-expiry skill](../../src/TableCloth.ManagedAi.OpenAi/Skills/Bundled/tablecloth-certificate-expiry/SKILL.md) is seeded into the dedicated profile on the first skill synchronization. A marker preserves deliberate removal across later refreshes and runtime reinstallations. An unmodified older bundled skill is upgraded to the count-only instructions; customized copies are preserved. When the skill is enabled and a user asks about certificate expiry, the chat UI asks before invoking the fixed host-side `TableClothCli.exe certificates expiring --within-days 30` command. The host bridge validates the local CLI result and sends only the expired count, the count expiring within 30 days, the scan-completeness flag, and the fixed window to OpenAI. Codex retains no shell access. The scanner reads bounded `signCert.der` public certificate files, checks for `signPri.key` without reading it, and omits names and paths by default. The local-only `--details` option exposes those fields to the CLI user. TableCloth AI cannot inspect individual certificate details or screenshots. A caution banner stays visible above the text-only chat composer and advises against entering or linking sensitive personal information, certificate files, or screenshots. Recognized pasted certificate details and certificate image links are rejected before a model request. The Catalog schema cannot associate a particular certificate with a service. A separate `catalog services` CLI command lists cached service URLs and installation-item counts. The TableCloth publish target bundles the Native AOT CLI sidecar. +The optional [certificate-expiry skill](https://github.com/yourtablecloth/tablecloth-certificate-expiry) is distributed separately and installed through the skill marketplace. New profiles do not seed skills automatically; existing installed copies and user choices remain manageable. When the skill is enabled and a user asks about certificate expiry, the chat UI asks before invoking the fixed host-side `TableClothCli.exe certificates expiring --within-days 30` command. The host bridge validates the local CLI result and sends only the expired count, the count expiring within 30 days, the scan-completeness flag, and the fixed window to OpenAI. Codex retains no shell access. The scanner reads bounded `signCert.der` public certificate files, checks for `signPri.key` without reading it, and omits names and paths by default. The local-only `--details` option exposes those fields to the CLI user. TableCloth AI cannot inspect individual certificate details or screenshots. The first-message view displays a caution notice and advises against entering or linking sensitive personal information, certificate files, or screenshots. Recognized pasted certificate details and certificate image links are rejected before a model request. The Catalog schema cannot associate a particular certificate with a service. A separate `catalog services` CLI command lists cached service URLs and installation-item counts. The TableCloth publish target bundles the Native AOT CLI sidecar. -The bundled [Windows Sandbox skill](../../src/TableCloth.ManagedAi.OpenAi/Skills/Bundled/tablecloth-windows-sandbox/SKILL.md) uses a host bridge to invoke the installed `wsb.exe` alias with fixed arguments. The bridge supports `list`, default `start`, `stop`, `connect`, and `ip`; it resolves an omitted ID only when exactly one running session is reported. The chat asks before `stop` because closing a sandbox discards its state. `exec`, `share`, and arbitrary configuration are not exposed to Codex. The existing TableCloth website-launch path still opens its generated `.wsb` configuration directly. On the development host, `wsb --version` returned `0.8.107.0` and `wsb list --raw` returned an empty `WindowsSandboxEnvironments` array on 2026-09-25. The [Microsoft CLI reference](https://learn.microsoft.com/en-us/windows/security/application-security/application-isolation/windows-sandbox/windows-sandbox-cli) describes the available commands; availability on other hosts depends on the installed Windows Sandbox version. +The optional [Windows Sandbox skill](https://github.com/yourtablecloth/tablecloth-windows-sandbox) uses a host bridge to invoke the installed `wsb.exe` alias with fixed arguments. The bridge supports `list`, default `start`, `stop`, `connect`, and `ip`; it resolves an omitted ID only when exactly one running session is reported. The chat asks before `stop` because closing a sandbox discards its state. `exec`, `share`, and arbitrary configuration are not exposed to Codex. The existing TableCloth website-launch path still opens its generated `.wsb` configuration directly. On the development host, `wsb --version` returned `0.8.107.0` and `wsb list --raw` returned an empty `WindowsSandboxEnvironments` array on 2026-09-25. The [Microsoft CLI reference](https://learn.microsoft.com/en-us/windows/security/application-security/application-isolation/windows-sandbox/windows-sandbox-cli) describes the available commands; availability on other hosts depends on the installed Windows Sandbox version. OpenAI documents a skill as a `SKILL.md` folder with optional references, scripts and assets. Codex first receives its name and description, then loads the full instructions when the request matches. TableCloth stores imported user skills under `%LOCALAPPDATA%\TableCloth\ManagedAi\profiles\openai-codex\codex-home\skills`; per-skill choices live in the sibling `tablecloth-skills.json`. Runtime releases remain under `runtimes\openai-codex`, so installing, updating or deleting that runtime tree does not delete user skills or their enabled state. See the [official skill description](https://developers.openai.com/plugins/concepts/skills) and [Codex skill configuration reference](https://learn.chatgpt.com/docs/config-file/config-reference). diff --git a/external/TableClothCatalog b/external/TableClothCatalog index 2c6d248f..30a8ad90 160000 --- a/external/TableClothCatalog +++ b/external/TableClothCatalog @@ -1 +1 @@ -Subproject commit 2c6d248fc1cfc9baba9ff9cdad5612787fcb94a9 +Subproject commit 30a8ad90c3557db849ba866c9d3905e5645d286b diff --git a/src/TableCloth.App/Dialogs/OptionsWindow.axaml b/src/TableCloth.App/Dialogs/OptionsWindow.axaml index 0aeb4df6..4a08489c 100644 --- a/src/TableCloth.App/Dialogs/OptionsWindow.axaml +++ b/src/TableCloth.App/Dialogs/OptionsWindow.axaml @@ -163,44 +163,17 @@ - - - - - - - - - - - - - - - - - - -