diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..05b1027
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,7 @@
+.PHONY: help rebuild-mac
+
+help:
+ @echo "make rebuild-mac # build swift-app, repackage share/cxai-mac/ (VERSION=1.2.0)"
+
+rebuild-mac:
+ $(MAKE) -C swift-app rebuild-mac $(if $(VERSION),VERSION=$(VERSION),)
diff --git a/share/cxai-mac/CxAI ADE 2.app/Contents/Info.plist b/share/cxai-mac/CxAI ADE 2.app/Contents/Info.plist
deleted file mode 100644
index 4b124ca..0000000
--- a/share/cxai-mac/CxAI ADE 2.app/Contents/Info.plist
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
- CFBundleDevelopmentRegion
- English
- CFBundleDisplayName
- CxAI ADE
- CFBundleExecutable
- cx-ai
- CFBundleIdentifier
- com.cxai.cxai
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- CxAI ADE
- CFBundlePackageType
- APPL
- CFBundleShortVersionString
- 0.6.1
- CFBundleVersion
- 0.6.1
- CSResourcesFileMapped
-
- LSApplicationCategoryType
- public.app-category.developer-tools
- LSMinimumSystemVersion
- 10.15
- CFBundleIconFile
- icon.icns
- LSRequiresCarbon
-
- NSHighResolutionCapable
-
- NSMicrophoneUsageDescription
- CxAI ADE uses your microphone for AI voice input.
-
-
\ No newline at end of file
diff --git a/share/cxai-mac/CxAI ADE 2.app/Contents/MacOS/cx-ai b/share/cxai-mac/CxAI ADE 2.app/Contents/MacOS/cx-ai
deleted file mode 100755
index ecadf52..0000000
Binary files a/share/cxai-mac/CxAI ADE 2.app/Contents/MacOS/cx-ai and /dev/null differ
diff --git a/share/cxai-mac/CxAI ADE 2.app/Contents/Resources/icon.icns b/share/cxai-mac/CxAI ADE 2.app/Contents/Resources/icon.icns
deleted file mode 100644
index c91afe2..0000000
Binary files a/share/cxai-mac/CxAI ADE 2.app/Contents/Resources/icon.icns and /dev/null differ
diff --git a/share/cxai-mac/CxAI ADE.app/Contents/Info.plist b/share/cxai-mac/CxAI ADE.app/Contents/Info.plist
index 4b124ca..6479a0a 100644
--- a/share/cxai-mac/CxAI ADE.app/Contents/Info.plist
+++ b/share/cxai-mac/CxAI ADE.app/Contents/Info.plist
@@ -1,38 +1,16 @@
-
-
- CFBundleDevelopmentRegion
- English
- CFBundleDisplayName
- CxAI ADE
- CFBundleExecutable
- cx-ai
- CFBundleIdentifier
- com.cxai.cxai
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- CxAI ADE
- CFBundlePackageType
- APPL
- CFBundleShortVersionString
- 0.6.1
- CFBundleVersion
- 0.6.1
- CSResourcesFileMapped
-
- LSApplicationCategoryType
- public.app-category.developer-tools
- LSMinimumSystemVersion
- 10.15
- CFBundleIconFile
- icon.icns
- LSRequiresCarbon
-
- NSHighResolutionCapable
-
- NSMicrophoneUsageDescription
- CxAI ADE uses your microphone for AI voice input.
-
-
\ No newline at end of file
+
+ CFBundleIdentifier studio.cxai.ade
+ CFBundleName CxAI ADE
+ CFBundleDisplayName CxAI ADE
+ CFBundleExecutable CxWebAppMac
+ CFBundlePackageType APPL
+ CFBundleShortVersionString 1.2.0
+ CFBundleVersion 1.2.0
+ LSMinimumSystemVersion 13.0
+ NSHighResolutionCapable
+ NSAppTransportSecurity
+ NSAllowsLocalNetworking
+ LSApplicationCategoryType public.app-category.developer-tools
+
diff --git a/share/cxai-mac/CxAI ADE.app/Contents/MacOS/CxWebAppMac b/share/cxai-mac/CxAI ADE.app/Contents/MacOS/CxWebAppMac
new file mode 100755
index 0000000..23c23eb
Binary files /dev/null and b/share/cxai-mac/CxAI ADE.app/Contents/MacOS/CxWebAppMac differ
diff --git a/share/cxai-mac/CxAI ADE.app/Contents/MacOS/cx-ai b/share/cxai-mac/CxAI ADE.app/Contents/MacOS/cx-ai
deleted file mode 100755
index ecadf52..0000000
Binary files a/share/cxai-mac/CxAI ADE.app/Contents/MacOS/cx-ai and /dev/null differ
diff --git a/share/cxai-mac/CxAI ADE.app/Contents/Resources/icon.icns b/share/cxai-mac/CxAI ADE.app/Contents/Resources/icon.icns
deleted file mode 100644
index c91afe2..0000000
Binary files a/share/cxai-mac/CxAI ADE.app/Contents/Resources/icon.icns and /dev/null differ
diff --git a/share/cxai-mac/CxAI-ADE-0.6.1-aarch64.app.tar.gz b/share/cxai-mac/CxAI-ADE-0.6.1-aarch64.app.tar.gz
deleted file mode 100644
index b2b060e..0000000
Binary files a/share/cxai-mac/CxAI-ADE-0.6.1-aarch64.app.tar.gz and /dev/null differ
diff --git a/share/cxai-mac/CxAI-ADE-0.6.1-aarch64.dmg b/share/cxai-mac/CxAI-ADE-0.6.1-aarch64.dmg
deleted file mode 100644
index ef9b5c8..0000000
Binary files a/share/cxai-mac/CxAI-ADE-0.6.1-aarch64.dmg and /dev/null differ
diff --git a/share/cxai-mac/CxAI-ADE-1.2.0-aarch64.app.tar.gz b/share/cxai-mac/CxAI-ADE-1.2.0-aarch64.app.tar.gz
new file mode 100644
index 0000000..d807711
Binary files /dev/null and b/share/cxai-mac/CxAI-ADE-1.2.0-aarch64.app.tar.gz differ
diff --git a/share/cxai-mac/CxAI-ADE-1.2.0-aarch64.dmg b/share/cxai-mac/CxAI-ADE-1.2.0-aarch64.dmg
new file mode 100644
index 0000000..70959f5
Binary files /dev/null and b/share/cxai-mac/CxAI-ADE-1.2.0-aarch64.dmg differ
diff --git a/share/cxai-mac/build-info.json b/share/cxai-mac/build-info.json
index 4167f76..c106fc2 100644
--- a/share/cxai-mac/build-info.json
+++ b/share/cxai-mac/build-info.json
@@ -1,17 +1,24 @@
{
"name": "CxAI ADE",
- "version": "0.6.1",
- "identifier": "com.cxai.cxai",
+ "version": "1.2.0",
+ "identifier": "studio.cxai.ade",
"channel": "stable",
- "sha": "104717b92c07",
- "built_at": "2026-05-16T18:26:57Z",
- "description": "Tauri 2 desktop shell for CxAI Studio. Built from CxAI Base/cargo.",
+ "sha": "f5b6c3203f4c",
+ "built_at": "2026-05-17T21:23:28Z",
+ "description": "Native AppKit/SwiftUI shell for CxAI Studio. Built from CxWebApp/swift-app (CxLLM-SDK + CxLLM-Drive).",
+ "platform": "macOS 13+ aarch64",
+ "modules": [
+ "CxCode", "CxAWS", "CxGit", "CxAgent", "CxMCP",
+ "CxModels", "CxChat", "CxSPARenderer", "CxInstrument",
+ "CxLangBridge", "CxARA", "CxDrive"
+ ],
"artifacts": {
- "app_tar_gz": "CxAI-ADE-0.6.1-aarch64.app.tar.gz",
- "app_tar_gz_sha256": "b991db236a83328464bc3c0f5b0560d44f888a401faa153db975f4652a2ee160",
- "dmg": "CxAI-ADE-0.6.1-aarch64.dmg",
- "dmg_size_bytes": 4539552,
- "dmg_sha256": "1a1d2e7cc85a24179e89447790c1c47df194c34945fb672be8ff57902bdd966e"
+ "app_tar_gz": "CxAI-ADE-1.2.0-aarch64.app.tar.gz",
+ "app_tar_gz_sha256": "6ada3b2a1156666e7ae2d517a6579c241a37434b84daa71ad0e5e827cfb6c85d",
+ "app_tar_gz_size": 121127,
+ "dmg": "CxAI-ADE-1.2.0-aarch64.dmg",
+ "dmg_sha256": "5d7c9428148c505580d91aeeef731ed51146b1f162c54d1e4eb39ff9037a7131",
+ "dmg_size_bytes": 153833
},
- "download_url": "/static/cxai-mac/CxAI-ADE-0.6.1-aarch64.dmg"
+ "download_url": "/static/cxai-mac/CxAI-ADE-1.2.0-aarch64.dmg"
}
diff --git a/swift-app/Makefile b/swift-app/Makefile
index 7bdc0e4..2526991 100644
--- a/swift-app/Makefile
+++ b/swift-app/Makefile
@@ -1,12 +1,14 @@
-.PHONY: help build run test app clean
+.PHONY: help build run test app rebuild-mac clean
-CONFIG ?= release
+CONFIG ?= release
+VERSION ?= 1.2.0
help:
- @echo "make build # swift build -c $(CONFIG)"
- @echo "make run # swift run -c $(CONFIG) CxWebAppMac"
- @echo "make test # swift test"
- @echo "make app # bundle into build/CxWebAppMac.app"
+ @echo "make build # swift build -c $(CONFIG)"
+ @echo "make run # swift run -c $(CONFIG) CxWebAppMac"
+ @echo "make test # swift test"
+ @echo "make app # bundle into build/CxWebAppMac.app"
+ @echo "make rebuild-mac # build + .app + .tar.gz + .dmg + share/cxai-mac/build-info.json (VERSION=$(VERSION))"
@echo "make clean"
build:
@@ -21,5 +23,8 @@ test:
app:
bash scripts/build-app.sh
+rebuild-mac:
+ VERSION=$(VERSION) bash scripts/build-mac-bundle.sh
+
clean:
rm -rf .build build
diff --git a/swift-app/Package.swift b/swift-app/Package.swift
index b2cd056..cd7939b 100644
--- a/swift-app/Package.swift
+++ b/swift-app/Package.swift
@@ -16,7 +16,8 @@ let package = Package(
.executable(name: "CxWebAppMac", targets: ["CxWebAppMac"]),
],
dependencies: [
- .package(url: "https://cxai-studio.com/git/CxAI-Project/CxLLM-SDK.git", branch: "main"),
+ .package(url: "https://cxai-studio.com/git/CxAI-Project/CxLLM-SDK.git", branch: "main"),
+ .package(url: "https://cxai-studio.com/git/CxAI-Project/CxLLM-Drive.git", branch: "main"),
],
targets: [
.executableTarget(
@@ -32,6 +33,8 @@ let package = Package(
.product(name: "CxSPARenderer", package: "CxLLM-SDK"),
.product(name: "CxInstrument", package: "CxLLM-SDK"),
.product(name: "CxLangBridge", package: "CxLLM-SDK"),
+ .product(name: "CxARA", package: "CxLLM-SDK"),
+ .product(name: "CxDrive", package: "CxLLM-Drive"),
],
path: "Sources/CxWebAppMac",
linkerSettings: [
diff --git a/swift-app/Sources/CxWebAppMac/CxLLMSidebar.swift b/swift-app/Sources/CxWebAppMac/CxLLMSidebar.swift
index cd2ebe2..fdd06bf 100644
--- a/swift-app/Sources/CxWebAppMac/CxLLMSidebar.swift
+++ b/swift-app/Sources/CxWebAppMac/CxLLMSidebar.swift
@@ -12,6 +12,8 @@ import CxModels
import CxChat
import CxInstrument
import CxLangBridge
+import CxARA
+import CxDrive
enum SidebarItem: String, Identifiable, CaseIterable, Hashable {
case web = "Web"
@@ -21,8 +23,10 @@ enum SidebarItem: String, Identifiable, CaseIterable, Hashable {
case models = "Models"
case code = "Code"
case aws = "AWS"
+ case drive = "Drive"
case git = "Git"
case bridge = "LangBridge"
+ case repair = "Repair"
case telemetry = "Telemetry"
var id: String { rawValue }
@@ -36,8 +40,10 @@ enum SidebarItem: String, Identifiable, CaseIterable, Hashable {
case .models: return "cube.transparent"
case .code: return "chevron.left.forwardslash.chevron.right"
case .aws: return "cloud"
+ case .drive: return "externaldrive"
case .git: return "arrow.triangle.branch"
case .bridge: return "link"
+ case .repair: return "wrench.and.screwdriver"
case .telemetry: return "waveform.path.ecg"
}
}
@@ -58,8 +64,10 @@ struct CxLLMSectionView: View {
case .models: moduleCard(name: "CxModels", version: "seed")
case .code: moduleCard(name: "CxCode", version: "seed")
case .aws: moduleCard(name: "CxAWS", version: "seed")
+ case .drive: moduleCard(name: "CxDrive", version: "seed")
case .git: moduleCard(name: "CxGit", version: "seed")
case .bridge: moduleCard(name: "CxLangBridge", version: "seed")
+ case .repair: moduleCard(name: "CxARA", version: "seed")
case .telemetry: moduleCard(name: "CxInstrument", version: "seed")
case .web: EmptyView()
}
diff --git a/swift-app/scripts/build-mac-bundle.sh b/swift-app/scripts/build-mac-bundle.sh
new file mode 100755
index 0000000..f5834ce
--- /dev/null
+++ b/swift-app/scripts/build-mac-bundle.sh
@@ -0,0 +1,117 @@
+#!/usr/bin/env bash
+# Build, bundle, and publish CxAI ADE (CxWebAppMac) into ../share/cxai-mac/.
+#
+# Produces:
+# share/cxai-mac/CxAI ADE.app
+# share/cxai-mac/CxAI-ADE--aarch64.app.tar.gz
+# share/cxai-mac/CxAI-ADE--aarch64.dmg
+# share/cxai-mac/build-info.json
+set -euo pipefail
+
+cd "$(dirname "$0")/.."
+SWIFT_APP_ROOT="$PWD"
+REPO_ROOT="$(cd ../.. && pwd)"
+SHARE_DIR="$REPO_ROOT/CxWebApp/share/cxai-mac"
+
+VERSION="${VERSION:-1.2.0}"
+ARCH="${ARCH:-aarch64}"
+PRODUCT_NAME="CxAI ADE"
+BUNDLE_ID="${BUNDLE_ID:-studio.cxai.ade}"
+CHANNEL="${CHANNEL:-stable}"
+
+STAGE="$SWIFT_APP_ROOT/build/stage"
+APP_PATH="$STAGE/${PRODUCT_NAME}.app"
+TGZ_NAME="CxAI-ADE-${VERSION}-${ARCH}.app.tar.gz"
+DMG_NAME="CxAI-ADE-${VERSION}-${ARCH}.dmg"
+
+echo "[1/6] swift build -c release"
+swift build -c release
+
+BIN="$(swift build -c release --show-bin-path)/CxWebAppMac"
+[[ -x "$BIN" ]] || { echo "FATAL: $BIN not found" >&2; exit 1; }
+
+echo "[2/6] assemble bundle $APP_PATH"
+rm -rf "$STAGE"
+mkdir -p "$APP_PATH/Contents/MacOS" "$APP_PATH/Contents/Resources"
+cp "$BIN" "$APP_PATH/Contents/MacOS/CxWebAppMac"
+cat > "$APP_PATH/Contents/Info.plist" <
+
+
+ CFBundleIdentifier ${BUNDLE_ID}
+ CFBundleName ${PRODUCT_NAME}
+ CFBundleDisplayName ${PRODUCT_NAME}
+ CFBundleExecutable CxWebAppMac
+ CFBundlePackageType APPL
+ CFBundleShortVersionString ${VERSION}
+ CFBundleVersion ${VERSION}
+ LSMinimumSystemVersion 13.0
+ NSHighResolutionCapable
+ NSAppTransportSecurity
+ NSAllowsLocalNetworking
+ LSApplicationCategoryType public.app-category.developer-tools
+
+PLIST
+
+echo "[3/6] codesign (ad-hoc)"
+codesign --force --deep --sign - "$APP_PATH" >/dev/null 2>&1 || true
+
+echo "[4/6] tar.gz"
+( cd "$STAGE" && tar -czf "$TGZ_NAME" "${PRODUCT_NAME}.app" )
+
+echo "[5/6] dmg"
+DMG_TMP="$STAGE/$DMG_NAME"
+rm -f "$DMG_TMP"
+hdiutil create -volname "${PRODUCT_NAME} ${VERSION}" \
+ -srcfolder "$APP_PATH" -ov -format UDZO -quiet \
+ "$DMG_TMP"
+
+echo "[6/6] publish -> $SHARE_DIR"
+mkdir -p "$SHARE_DIR"
+# Wipe any prior CxAI-ADE-* / CxAI ADE*.app set; keep folder, replace contents.
+find "$SHARE_DIR" -maxdepth 1 \( -name "CxAI-ADE-*" -o -name "CxAI ADE*.app" -o -name "build-info.json" \) -exec rm -rf {} +
+# Re-stage fresh artifacts.
+ditto "$APP_PATH" "$SHARE_DIR/${PRODUCT_NAME}.app"
+cp "$STAGE/$TGZ_NAME" "$SHARE_DIR/$TGZ_NAME"
+cp "$DMG_TMP" "$SHARE_DIR/$DMG_NAME"
+
+# Compute hashes & sizes.
+sha_tgz=$(shasum -a 256 "$SHARE_DIR/$TGZ_NAME" | awk '{print $1}')
+sha_dmg=$(shasum -a 256 "$SHARE_DIR/$DMG_NAME" | awk '{print $1}')
+size_dmg=$(stat -f%z "$SHARE_DIR/$DMG_NAME")
+size_tgz=$(stat -f%z "$SHARE_DIR/$TGZ_NAME")
+built_at=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
+
+# Best-effort git sha (outer iCloud repo).
+git_sha=$( ( cd "$REPO_ROOT" && git rev-parse --short=12 HEAD 2>/dev/null ) || echo "unknown" )
+
+cat > "$SHARE_DIR/build-info.json" <