diff --git a/.github/workflows/hadolint.yml b/.github/workflows/hadolint.yml
index dc73566..a264df3 100644
--- a/.github/workflows/hadolint.yml
+++ b/.github/workflows/hadolint.yml
@@ -2,7 +2,7 @@
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
-# hadoint is a Dockerfile linter written in Haskell
+# hadolint is a Dockerfile linter written in Haskell
# that helps you build best practice Docker images.
# More details at https://github.com/hadolint/hadolint
diff --git a/.github/workflows/mayhem-for-api.yml b/.github/workflows/mayhem-for-api.yml
new file mode 100644
index 0000000..bd4405a
--- /dev/null
+++ b/.github/workflows/mayhem-for-api.yml
@@ -0,0 +1,64 @@
+# This workflow uses actions that are not certified by GitHub.
+# They are provided by a third-party and are governed by
+# separate terms of service, privacy policy, and support
+# documentation.
+#
+# This workflow starts your API and fuzzes it with ForAllSecure Mayhem for API
+# to find reliability, performance and security issues before they reach
+# production.
+#
+# To use this workflow, you will need to:
+#
+# 1. Create a Mayhem account at https://app.mayhem.security
+#
+# 2. Create an API token at https://app.mayhem.security/-/settings/user/api-tokens
+#
+# 3. Add the API token as a secret in GitHub called "MAYHEM_TOKEN"
+#
+# 4. Update the "Start your API" step to run your API in the background before
+# starting the Mayhem for API scan, and update the `api-url` & `api-spec`
+# field.
+#
+# If you have any questions, please contact us at mayhem4api@forallsecure.com
+
+name: "Mayhem for API"
+
+on:
+ push:
+ branches: [ "main" ]
+ pull_request:
+ # The branches below must be a subset of the branches above
+ branches: [ "main" ]
+
+jobs:
+ mayhem-for-api:
+ name: Mayhem for API
+ # Mayhem for API runs on linux, mac and windows
+ runs-on: ubuntu-latest
+ permissions:
+ actions: read
+ contents: read
+ security-events: write
+ steps:
+ - uses: actions/checkout@v4
+
+ # Run your API in the background. Ideally, the API would run in debug
+ # mode & send stacktraces back on "500 Internal Server Error" responses
+ # (don't do this in production though!)
+ - name: Start your API
+ run: ./run_your_api.sh & # <- ✏️ update this
+
+ - name: Mayhem for API
+ uses: ForAllSecure/mapi-action@v1
+ continue-on-error: true
+ with:
+ mayhem-token: ${{ secrets.MAYHEM_TOKEN }}
+ api-url: http://localhost:8080 # <- ✏️ update this
+ api-spec: http://localhost:8080/openapi.json # <- ✏️ update this
+ duration: 60
+ sarif-report: mapi.sarif
+
+ - name: Upload SARIF file
+ uses: github/codeql-action/upload-sarif@v3
+ with:
+ sarif_file: mapi.sarif
diff --git a/.github/workflows/puppet-lint.yml b/.github/workflows/puppet-lint.yml
new file mode 100644
index 0000000..53e5cf3
--- /dev/null
+++ b/.github/workflows/puppet-lint.yml
@@ -0,0 +1,55 @@
+# This workflow uses actions that are not certified by GitHub.
+# They are provided by a third-party and are governed by
+# separate terms of service, privacy policy, and support
+# documentation.
+# Puppet Lint tests Puppet code against the recommended Puppet language style guide.
+# https://puppet.com/docs/puppet/7/style_guide.html
+# Puppet Lint validates only code style; it does not validate syntax.
+# To test syntax, use Puppet's puppet parser validate command.
+# More details at https://github.com/puppetlabs/puppet-lint/
+
+name: puppet-lint
+
+on:
+ push:
+ branches: [ "main" ]
+ pull_request:
+ # The branches below must be a subset of the branches above
+ branches: [ "main" ]
+ schedule:
+ - cron: '35 17 * * 0'
+
+permissions:
+ contents: read
+
+jobs:
+ puppet-lint:
+ name: Run puppet-lint scanning
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read # for checkout to fetch code
+ security-events: write # for github/codeql-action/upload-sarif to upload SARIF results
+ actions: read # only required for a private repository by github/codeql-action/upload-sarif to get the Action run status
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Setup Ruby
+ uses: ruby/setup-ruby@55283cc23133118229fd3f97f9336ee23a179fcf # v1.146.0
+ with:
+ ruby-version: 2.7
+ bundler-cache: true
+
+ - name: Install puppet-lint
+ run: gem install puppet-lint
+
+ - name: Run puppet-lint
+ run: puppet-lint . --sarif > puppet-lint-results.sarif
+ continue-on-error: true
+
+ - name: Upload analysis results to GitHub
+ uses: github/codeql-action/upload-sarif@v3
+ with:
+ sarif_file: puppet-lint-results.sarif
+ wait-for-processing: true
diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml
index 09631a2..8e55f57 100644
--- a/.github/workflows/static.yml
+++ b/.github/workflows/static.yml
@@ -22,6 +22,9 @@ jobs:
- name: Checkout
uses: actions/checkout@v4
+ - name: Smoke test static app
+ run: node scripts/smoke-test-static.mjs
+
- name: Prepare static site
shell: bash
run: |
diff --git a/.github/workflows/trivy.yml b/.github/workflows/trivy.yml
new file mode 100644
index 0000000..0a7cd67
--- /dev/null
+++ b/.github/workflows/trivy.yml
@@ -0,0 +1,48 @@
+# This workflow uses actions that are not certified by GitHub.
+# They are provided by a third-party and are governed by
+# separate terms of service, privacy policy, and support
+# documentation.
+
+name: trivy
+
+on:
+ push:
+ branches: [ "main" ]
+ pull_request:
+ # The branches below must be a subset of the branches above
+ branches: [ "main" ]
+ schedule:
+ - cron: '20 0 * * 4'
+
+permissions:
+ contents: read
+
+jobs:
+ build:
+ permissions:
+ contents: read # for actions/checkout to fetch code
+ security-events: write # for github/codeql-action/upload-sarif to upload SARIF results
+ actions: read # only required for a private repository by github/codeql-action/upload-sarif to get the Action run status
+ name: Build
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Build an image from Dockerfile
+ run: |
+ docker build -t docker.io/my-organization/my-app:${{ github.sha }} .
+
+ - name: Run Trivy vulnerability scanner
+ uses: aquasecurity/trivy-action@7b7aa264d83dc58691451798b4d117d53d21edfe
+ with:
+ image-ref: 'docker.io/my-organization/my-app:${{ github.sha }}'
+ format: 'template'
+ template: '@/contrib/sarif.tpl'
+ output: 'trivy-results.sarif'
+ severity: 'CRITICAL,HIGH'
+
+ - name: Upload Trivy scan results to GitHub Security tab
+ uses: github/codeql-action/upload-sarif@v3
+ with:
+ sarif_file: 'trivy-results.sarif'
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..2d1f044
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,29 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+# Environment variables
+.env
+.env.local
+.env.*.local
diff --git a/CNAME b/CNAME
deleted file mode 100644
index 2037010..0000000
--- a/CNAME
+++ /dev/null
@@ -1 +0,0 @@
-app.github.rkix
\ No newline at end of file
diff --git a/MIT b/MIT
new file mode 100644
index 0000000..73494fa
--- /dev/null
+++ b/MIT
@@ -0,0 +1,21 @@
+Giấy phép MIT
+
+Bản quyền (c) [2026] [huỳnh Thương]
+
+Bất kỳ ai có được bản sao này đều được phép sao chép miễn phí.
+của phần mềm này và các tập tin tài liệu liên quan (gọi là "Phần mềm"), để xử lý
+trong Phần mềm mà không bị hạn chế, bao gồm nhưng không giới hạn các quyền
+sử dụng, sao chép, sửa đổi, hợp nhất, xuất bản, phân phối, cấp phép lại và/hoặc bán.
+các bản sao của Phần mềm, và cho phép những người được phép sử dụng Phần mềm
+được cung cấp để làm như vậy, với điều kiện sau:
+
+Thông báo bản quyền và thông báo cho phép nêu trên phải được bao gồm trong tất cả các ấn phẩm.
+các bản sao hoặc các phần quan trọng của Phần mềm.
+
+PHẦN MỀM ĐƯỢC CUNG CẤP "NGUYÊN TRẠNG", KHÔNG CÓ BẢO HÀNH DƯỚI BẤT KỲ HÌNH THỨC NÀO, RÕ RÀNG HAY NGẦM HIỂU.
+BAO GỒM NHƯNG KHÔNG GIỚI HẠN Ở CÁC BẢO ĐẢM VỀ KHẢ NĂNG THƯƠNG MẠI,
+PHÙ HỢP VỚI MỤC ĐÍCH CỤ THỂ VÀ KHÔNG VI PHẠM BẢN QUYỀN. TRONG MỌI TRƯỜNG HỢP, KHÔNG ĐƯỢC PHÉP
+TÁC GIẢ HOẶC CHỦ SỞ HỮU BẢN QUYỀN SẼ KHÔNG CHỊU TRÁCH NHIỆM ĐỐI VỚI BẤT KỲ KHIẾU NGHĨ, THIỆT HẠI HOẶC CÁC VẤN ĐỀ KHÁC.
+TRÁCH NHIỆM PHÁP LÝ, CHO DÙ LÀ TRONG HÀNH ĐỘNG HỢP ĐỒNG, HÀNH VI GÂY THIỆT HẠI HAY BẤT KỲ HÌNH THỨC NÀO KHÁC, PHÁT SINH TỪ,
+LIÊN QUAN ĐẾN PHẦN MỀM HOẶC VIỆC SỬ DỤNG HOẶC CÁC GIAO DỊCH KHÁC TRONG
+PHẦN MỀM.
diff --git a/README.md b/README.md
index 91f1766..03cd83d 100644
--- a/README.md
+++ b/README.md
@@ -1,27 +1,168 @@
-
RKIX3 AI Studio
-
Nền tảng AI hỗ trợ lập trình, build dự án, tự động hoá CLI/mobile-first và triển khai web app tốc độ cao.
+
RKIX3 AI Workspace
+
Modern React + TypeScript application for AI-powered development workspace with Vite.
+## 🚀 Getting Started
+
+### Prerequisites
+- Node.js 16+
+- npm or yarn
+
+### Installation
+
+```bash
+npm install
+```
+
+### Development Server
+
+```bash
+npm run dev
+```
+
+The app will start at `http://localhost:5173` with HMR (Hot Module Replacement).
+
+### Build for Production
+
+```bash
+npm run build
+```
+
+Creates optimized build in `dist/` directory.
+
+### Preview Build
+
+```bash
+npm run preview
+```
+
+## 📁 Project Structure
+
+```
+src/
+├── components/
+│ ├── Sidebar.tsx # Main navigation sidebar
+│ ├── Header.tsx # Top header with controls
+│ ├── MainContent.tsx # Central content with prompt input
+│ ├── MiniRkxButton.tsx # Floating navigation button
+│ ├── MiniRkxMenu.tsx # Honeycomb menu (tổ ong)
+│ └── ApiSettingsModal.tsx # API configuration modal
+├── App.tsx # Root component with state management
+└── main.tsx # React entry point
+```
+
+## ✨ Features
+
+- 🎨 **Modern Dark Theme** - Gradient effects with cyan/blue colors
+- 🤖 **AI Workspace** - Prompt input with voice recording simulation
+- 🎯 **MiniRkx Navigation** - Floating button with honeycomb menu
+- 📱 **Fully Responsive** - Mobile-first design for all screen sizes
+- ⌨️ **Type Safe** - Full TypeScript support
+- ⚡ **Fast Development** - Vite with HMR
+- 🎭 **Rich Animations** - Smooth transitions and transforms
+
+## 🧩 Components
+
+| Component | Purpose |
+|-----------|---------|
+| **Sidebar** | Navigation menu with search, projects, and features |
+| **Header** | Top bar with menu toggle, API settings, and login |
+| **MainContent** | Logo, prompt input, and feature cards |
+| **MiniRkxButton** | Floating button with tech-themed logo |
+| **MiniRkxMenu** | Honeycomb menu with 6 navigation items |
+| **ApiSettingsModal** | Configure API keys and settings |
+
+## 🛠️ Technologies
+
+- **React 18** - UI library
+- **TypeScript 5** - Type safety
+- **Vite 5** - Build tool and dev server
+- **Tailwind CSS 3** - Utility-first CSS framework
+- **Lucide React** - Icon library
+
+## 🚀 Deployment
+
+### Build
+
+```bash
+npm run build
+```
+
+The `dist/` folder is production-ready and can be deployed to:
+- Vercel
+- GitHub Pages
+- Netlify
+- Any static hosting
+
+### GitHub Pages
+
+1. Add to `package.json`:
+```json
+"homepage": "https://yourusername.github.io/AGENTS.RKIX3"
+```
+
+2. Build and deploy:
+```bash
+npm run build
+git add dist -f
+git commit -m "Deploy"
+git push origin main
+```
+
+## 📦 Scripts
+
+```bash
+npm run dev # Start development server
+npm run build # Build for production
+npm run preview # Preview production build locally
+npm run lint # Run ESLint (optional)
+```
+
+## 🎯 State Management
+
+The app uses React's built-in `useState` hook for state management. Key states:
+- `sidebarOpen` - Mobile sidebar visibility
+- `menuOpen` - MiniRkx menu state
+- `showApiModal` - API settings modal visibility
+- `prompt` - User input text
+- `isRecording` - Voice recording state
+
+## 🤝 Contributing
+
+Contributions are welcome! Please:
+1. Fork the repository
+2. Create a feature branch
+3. Make your changes
+4. Submit a pull request
+
+## 📄 License
+
+MIT
+
+
+ Built with 💙 for RKIX3 — Modern, Fast, and Type-Safe
+
+
---
@@ -55,6 +196,7 @@
RKIX3/
├─ index.html # Single-file AI Studio UI
├─ README.md # Trang giới thiệu chuyên nghiệp trên GitHub
+├─ scripts/smoke-test-static.mjs # Smoke test HTML/JS trước khi deploy
├─ 1780136894650-Photoroom.png # Logo chính
└─ .github/workflows/static.yml # Build _site + deploy GitHub Pages
```
@@ -66,17 +208,26 @@ python3 -m http.server 4173
# mở http://127.0.0.1:4173
```
+## 🧪 Kiểm thử
+
+```bash
+node scripts/smoke-test-static.mjs
+```
+
+Smoke test sẽ kiểm tra cấu trúc route chính, sự tồn tại của chat input/send button, cú pháp JavaScript inline và guard chống render raw user message vào `innerHTML`.
+
## 🚀 Deploy GitHub Pages
-Workflow `.github/workflows/static.yml` sẽ:
+Workflow chính `.github/workflows/static.yml` sẽ:
1. Checkout source.
-2. Setup GitHub Pages.
-3. Tạo `_site` chứa `index.html`, ảnh và file đánh dấu static site.
-4. Upload artifact Pages.
-5. Deploy bằng `actions/deploy-pages`.
+2. Chạy smoke test static app bằng `node scripts/smoke-test-static.mjs`.
+3. Setup GitHub Pages.
+4. Tạo `_site` chứa `index.html`, ảnh và file đánh dấu static site.
+5. Upload artifact Pages.
+6. Deploy bằng `actions/deploy-pages`.
-> Nếu GitHub vẫn báo lỗi deploy, hãy vào **Settings → Pages → Build and deployment** và chọn **Source: GitHub Actions** cho repository.
+> Nếu GitHub vẫn báo lỗi deploy, hãy vào **Settings → Pages → Build and deployment** và chọn **Source: GitHub Actions** cho repository. Các workflow mẫu khác trong `.github/workflows/` chỉ nên được bật khi dự án thật sự dùng stack tương ứng.
## 🏅 Huy hiệu dự án
@@ -121,7 +272,7 @@ Workflow `.github/workflows/static.yml` sẽ:
## ✅ Ba xung đột đã được chốt
-- **Workflow Pages**: chỉ giữ một pipeline static ở `.github/workflows/static.yml`, dùng `_site` làm artifact triển khai.
+- **Workflow Pages**: `.github/workflows/static.yml` là pipeline deploy chính, chạy smoke test rồi dùng `_site` làm artifact triển khai.
- **Tài liệu GitHub**: README là trang giới thiệu chính thức của RKIX3, không còn nội dung cũ trùng lặp.
- **Web app RKIX3**: `index.html` tiếp tục là nguồn giao diện single-file được workflow copy trực tiếp khi deploy.
diff --git a/build-output.txt b/build-output.txt
new file mode 100644
index 0000000..27f543a
--- /dev/null
+++ b/build-output.txt
@@ -0,0 +1,5 @@
+
+> rkix3-workspace@1.0.0 build
+> tsc -b && vite build
+
+src/App.tsx(17,10): error TS6133: 'currentPage' is declared but its value is never read.
diff --git a/index.html b/index.html
index 12bb580..be9d2c7 100644
--- a/index.html
+++ b/index.html
@@ -1,119 +1,251 @@
-
-
-
-
- RKIX3 — Developer Workspace Platform
-
-
-
-
-