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" <