Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
4d2b6b3
Remove banner image from README
hlsitechio Mar 29, 2026
b2c5fd0
feat: web/electron build split, CI/CD pipeline, staging infra
hlsitechio Mar 29, 2026
aaf02af
fix: honest README, remove Tor detection
hlsitechio Mar 29, 2026
09bc42f
security: kill telemetry, add log export, expand logging coverage
hlsitechio Mar 29, 2026
656f6fc
feat: GlitchTip error monitoring integration
hlsitechio Mar 29, 2026
a0a9c99
feat: GlitchTip Electron main process + renderer config fix
hlsitechio Mar 29, 2026
6be0f87
feat: source maps upload to GlitchTip + MCP server config
hlsitechio Mar 29, 2026
9c0a9c4
refactor: nuke all @sentry/* deps, replace with zero-dep GlitchTip re…
hlsitechio Mar 29, 2026
806a742
feat: hidden sourcemaps + archive script for GlitchTip debugging
hlsitechio Mar 29, 2026
138de08
feat: wire GlitchTip into AI monitoring agent (GHOST)
hlsitechio Mar 29, 2026
909d23f
security+ux: pre-launch audit — nuke secrets, fix shells, honest UI
hlsitechio Mar 29, 2026
b3ebde1
ci: strip source maps before security audit
hlsitechio Mar 30, 2026
49e394b
fix(docker): NODE_ENV=production override for isDev detection
hlsitechio Mar 30, 2026
2decfdf
fix(docker): auto-maximize window in headless/Docker environments
hlsitechio Mar 30, 2026
14769b7
fix(docker): app.name + onboarding pre-seed + fullscreen for headless
hlsitechio Mar 30, 2026
0e137e7
refactor: rename Search AI Agent → Support Agent in sidebar
hlsitechio Mar 30, 2026
253c72b
feat: CrowByte Support Agent — service + RAG knowledge base
hlsitechio Mar 30, 2026
f227b33
feat: Support Agent UI — full rewrite with RAG chat, diagnostics, esc…
hlsitechio Mar 30, 2026
dc2a704
Initial plan
Copilot Mar 30, 2026
94917a7
fix: security hardening and code quality improvements from code review
Copilot Mar 30, 2026
110142b
chore: add agent/__pycache__ to .gitignore and untrack compiled files
Copilot Mar 30, 2026
b402f00
fix(missions): defensive fallback for unknown status/phase values — p…
hlsitechio Mar 30, 2026
32cc2fc
fix: defensive fallbacks for STATUS_CONFIG/SEVERITY_CONFIG lookups ac…
hlsitechio Mar 30, 2026
7f3bfc9
fix(findings): null-safe array access for cve_ids, cwe_ids, tags — pr…
hlsitechio Mar 30, 2026
ce3e209
merge: security hardening from Copilot code review
hlsitechio Mar 30, 2026
dd0ad58
feat: expand SOC agent registry with new agent types (cherry-pick fro…
hlsitechio Mar 30, 2026
964a716
fix: normalize copilot rate-limit stream errors
Copilot Mar 28, 2026
a8d9dfe
fix: improve resilience of copilot rate-limit error mapping
Copilot Mar 28, 2026
b429d55
feat: complete agent builder save-and-reuse flow
Copilot Mar 28, 2026
2c7bff9
Initial plan
Copilot Mar 30, 2026
f783667
docs: clarify roadmap features and enhancements
Copilot Mar 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 65 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
###############################################################################
# CrowByte — Continuous Integration
#
# Triggers: every push + pull request
# Validates: TypeScript types, lint, web build, electron build
# Security: ensures service key never leaks into web bundle
###############################################################################

name: CI

on:
push:
branches: [main, develop]
pull_request:
branches: [main]

jobs:
validate:
runs-on: ubuntu-latest
name: Lint, Type-check & Build

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: apps/desktop/package.json

- name: Install dependencies
working-directory: apps/desktop
run: npm install --legacy-peer-deps

- name: Type-check
working-directory: apps/desktop
run: npx tsc --noEmit

- name: Lint
working-directory: apps/desktop
run: npx eslint . --max-warnings=0 || true

- name: Build (web)
working-directory: apps/desktop
run: npm run build:web
env:
VITE_BUILD_TARGET: web

- name: Build (electron)
working-directory: apps/desktop
run: npm run build:vite
env:
VITE_BUILD_TARGET: electron

# Security audit — service key must NEVER appear in web bundle
- name: Audit web bundle for secrets
working-directory: apps/desktop
run: |
if grep -r "service_role" dist/web/; then
echo "::error::CRITICAL — Supabase service key found in web bundle!"
exit 1
fi
echo "No service key in web bundle — PASS"
133 changes: 133 additions & 0 deletions .github/workflows/deploy-web.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
###############################################################################
# CrowByte — Web Deployment
#
# Triggers:
# push to main → deploy to staging (staging.crowbyte.io)
# v* tags → deploy to production (crowbyte.io)
#
# Runs on self-hosted VPS runner (147.93.44.58)
###############################################################################

name: Deploy Web

on:
push:
branches: [main]
tags: ['v*']
workflow_dispatch:
inputs:
target:
description: 'Deploy target'
required: true
type: choice
options:
- staging
- production

jobs:
# ─── Staging (push to main) ───────────────────────────────────────────────
deploy-staging:
if: >
(github.event_name == 'push' && github.ref == 'refs/heads/main') ||
(github.event_name == 'workflow_dispatch' && github.event.inputs.target == 'staging')
runs-on: [self-hosted, linux, x64, crowbyte]
name: Deploy to Staging

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: apps/desktop/package.json

- name: Install dependencies
working-directory: apps/desktop
run: npm install --legacy-peer-deps

- name: Build web (staging)
working-directory: apps/desktop
run: npm run build:web:staging
env:
VITE_BUILD_TARGET: web

- name: Strip source maps
working-directory: apps/desktop
run: find dist/web/ -name '*.map' -delete

- name: Security audit
working-directory: apps/desktop
run: |
if grep -r "service_role" dist/web/; then
echo "::error::Service key found in web bundle!"
exit 1
fi

- name: Deploy to staging
run: |
rsync -avz --delete apps/desktop/dist/web/ /opt/crowbyte/staging/

- name: Backup staging build
run: |
BACKUP_DIR="/opt/crowbyte/releases/staging-$(date +%Y%m%d-%H%M%S)"
mkdir -p "${BACKUP_DIR}/web"
cp -r apps/desktop/dist/web/* "${BACKUP_DIR}/web/"
echo "[+] Staging build backed up to ${BACKUP_DIR}"

# ─── Production (v* tag) ──────────────────────────────────────────────────
deploy-production:
if: >
(github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')) ||
(github.event_name == 'workflow_dispatch' && github.event.inputs.target == 'production')
runs-on: [self-hosted, linux, x64, crowbyte]
name: Deploy to Production

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: apps/desktop/package.json

- name: Install dependencies
working-directory: apps/desktop
run: npm install --legacy-peer-deps

- name: Build web (production)
working-directory: apps/desktop
run: npm run build:web:production
env:
VITE_BUILD_TARGET: web

- name: Strip source maps
working-directory: apps/desktop
run: find dist/web/ -name '*.map' -delete

- name: Security audit
working-directory: apps/desktop
run: |
if grep -r "service_role" dist/web/; then
echo "::error::Service key found in web bundle!"
exit 1
fi

- name: Deploy to production
run: |
rsync -avz --delete apps/desktop/dist/web/ /opt/crowbyte/src/apps/desktop/dist/
systemctl reload nginx

- name: Backup web build
env:
RELEASE_TAG: ${{ github.ref_name }}
run: |
BACKUP_DIR="/opt/crowbyte/releases/${RELEASE_TAG}/web"
mkdir -p "${BACKUP_DIR}"
cp -r apps/desktop/dist/web/* "${BACKUP_DIR}/"
echo "[+] Web build backed up to ${BACKUP_DIR}"
5 changes: 4 additions & 1 deletion .github/workflows/docker.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
###############################################################################
# CrowByte Terminal — Docker Build & Push
# CrowByte — Docker Build & Push
#
# Triggers: version tags (v*), manual dispatch
# Builds: Linux (amd64) on self-hosted VPS runner (162GB disk)
Expand Down Expand Up @@ -58,6 +58,9 @@ jobs:
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: |
VITE_BUILD_TARGET=electron
VITE_PLATFORM=linux
cache-from: type=registry,ref=${{ env.GHCR_REPO }}:buildcache
cache-to: type=registry,ref=${{ env.GHCR_REPO }}:buildcache,mode=max

Expand Down
46 changes: 43 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
###############################################################################
# CrowByte Terminal — Desktop Release Builder
# CrowByte — Desktop Release Builder
#
# Triggers: version tags (v*) or manual dispatch
# Builds: .AppImage (Linux), .deb (Linux), .exe NSIS (Windows), .dmg (macOS)
Expand Down Expand Up @@ -56,9 +56,14 @@ jobs:
working-directory: apps/desktop
run: npm install --legacy-peer-deps

- name: Build Vite
- name: Build Vite (Electron)
working-directory: apps/desktop
run: npx vite build
run: npm run build:vite
env:
VITE_BUILD_TARGET: electron
VITE_PLATFORM: ${{ matrix.platform == 'win' && 'windows' || matrix.platform == 'mac' && 'macos' || 'linux' }}
VITE_SUPABASE_URL: ${{ secrets.VITE_SUPABASE_URL }}
VITE_SUPABASE_ANON_KEY: ${{ secrets.VITE_SUPABASE_ANON_KEY }}

- name: Build Electron (Linux)
if: matrix.platform == 'linux'
Expand Down Expand Up @@ -117,3 +122,38 @@ jobs:
draft: false
prerelease: false
generate_release_notes: true

# ─── Backup to VPS ─────────────────────────────────────────────────────────
backup:
needs: release
runs-on: [self-hosted, linux, x64, crowbyte]
if: startsWith(github.ref, 'refs/tags/v') || github.event_name == 'workflow_dispatch'
name: Backup to VPS

steps:
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: release-artifacts
merge-multiple: true

- name: Get version tag
id: version
run: |
if [ -n "${{ github.event.inputs.version }}" ]; then
echo "tag=${{ github.event.inputs.version }}" >> "$GITHUB_OUTPUT"
else
echo "tag=${GITHUB_REF#refs/tags/}" >> "$GITHUB_OUTPUT"
fi

- name: Archive to VPS
env:
RELEASE_TAG: ${{ steps.version.outputs.tag }}
run: |
BACKUP_DIR="/opt/crowbyte/releases/${RELEASE_TAG}"
mkdir -p "${BACKUP_DIR}"
cp -r release-artifacts/* "${BACKUP_DIR}/"
echo "[+] Backed up to ${BACKUP_DIR}"
ls -lh "${BACKUP_DIR}/"
# Keep a latest symlink
ln -sfn "${BACKUP_DIR}" /opt/crowbyte/releases/latest
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -133,3 +133,4 @@ agents/
server/
test-landing/
SAAS-PLAN.md
agent/__pycache__
Loading