Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
8e10339
Dev (#1) (#2)
ApiliumDevTeam Mar 2, 2026
f9c560c
Add CLAUDE.md to gitignore
ApiliumDevTeam Mar 2, 2026
21f29ef
Rename clawnet → meshnet in refactor docs
ApiliumDevTeam Mar 2, 2026
25a578c
Update platform documentation (en + zh-CN)
ApiliumDevTeam Mar 2, 2026
8d2fb54
Update iOS app configuration and sources
ApiliumDevTeam Mar 2, 2026
0fe0daf
Update Android app with Play Store and sideload build flavors
ApiliumDevTeam Mar 2, 2026
a8a05b8
Update macOS Package.swift
ApiliumDevTeam Mar 2, 2026
e9fccdb
Update CI workflow and build scripts
ApiliumDevTeam Mar 2, 2026
b722eb5
Update extensions: zod v4, observability route API, esbuild import
ApiliumDevTeam Mar 2, 2026
cec1bbd
Update plugin SDK exports and rename legacy plist references
ApiliumDevTeam Mar 2, 2026
e0b7f1e
Fix deprecated and vulnerable transitive dependencies
ApiliumDevTeam Mar 2, 2026
6c0554b
Add Dependabot Docker update config
ApiliumDevTeam Mar 2, 2026
160d2b0
Fix README links: maryos → mayros
ApiliumDevTeam Mar 2, 2026
4ac057c
Bump version to 0.1.2
ApiliumDevTeam Mar 2, 2026
6248a99
Fix oxfmt formatting in 3 files
ApiliumDevTeam Mar 2, 2026
113620c
Fix 15 broken internal links in docs
ApiliumDevTeam Mar 2, 2026
d84ec5c
Fix Python lint: remove unused import, suppress E402
ApiliumDevTeam Mar 2, 2026
67ecf52
Track template docs and a2ui placeholder for CI
ApiliumDevTeam Mar 2, 2026
49a50f2
Fix 15 test files for vitest 4.x mock hoisting compatibility
ApiliumDevTeam Mar 2, 2026
72f44c2
Track test fixture npm-pack-hooks.tgz for CI
ApiliumDevTeam Mar 2, 2026
01ac1cd
Device ecosystem production — v0.1.2 (#3)
ApiliumDevTeam Mar 2, 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
10 changes: 10 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
version: 2
updates:
- package-ecosystem: "docker"
directory: "/"
schedule:
interval: "weekly"
groups:
docker-images:
patterns:
- "*"
6 changes: 4 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -320,9 +320,11 @@ jobs:
matrix:
include:
- task: test
command: ./gradlew --no-daemon :app:testDebugUnitTest
command: ./gradlew --no-daemon :app:testSideloadDebugUnitTest
- task: build
command: ./gradlew --no-daemon :app:assembleDebug
command: ./gradlew --no-daemon :app:assembleSideloadDebug
- task: bundle-playstore
command: ./gradlew --no-daemon :app:bundlePlaystoreRelease
steps:
- name: Checkout
uses: actions/checkout@v4
Expand Down
13 changes: 13 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ apps/android/.gradle/
apps/android/app/build/
apps/android/.cxx/

# Android signing (NEVER COMMIT)
apps/android/keystore.properties
*.jks
*.keystore

# Swift / macOS / iOS build artifacts
*.bun-build
apps/macos/.build/
Expand Down Expand Up @@ -78,6 +83,7 @@ vendor/
# Vendor build artifacts
vendor/a2ui/renderers/lit/dist/
src/canvas-host/a2ui/*.bundle.js
!src/canvas-host/a2ui/a2ui.bundle.js
src/canvas-host/a2ui/*.map
.bundle.hash

Expand All @@ -104,7 +110,10 @@ apps/ios/LocalSigning.xcconfig
docs/.local/
IDENTITY.md
USER.md
!docs/reference/templates/IDENTITY.md
!docs/reference/templates/USER.md
*.tgz
!test/fixtures/**/*.tgz
.worktrees/

# local tooling
Expand All @@ -119,3 +128,7 @@ USER.md
.agents/
.agents
.agent/

# Claude Code project instructions (local only)
CLAUDE.md
**/CLAUDE.md
8 changes: 4 additions & 4 deletions .markdownlint-cli2.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,13 @@
"picture",
"source",
"Tooltip",
"Check"
]
"Check",
],
},

"MD036": false,
"MD040": false,
"MD041": false,
"MD046": false
}
"MD046": false,
},
}
214 changes: 107 additions & 107 deletions README.md

Large diffs are not rendered by default.

29 changes: 28 additions & 1 deletion apps/android/app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import com.android.build.api.variant.impl.VariantOutputImpl
import java.util.Properties

plugins {
id("com.android.application")
Expand All @@ -7,6 +8,11 @@ plugins {
id("org.jetbrains.kotlin.plugin.serialization")
}

val keystoreProperties = Properties().apply {
val f = rootProject.file("keystore.properties")
if (f.exists()) load(f.inputStream())
}

android {
namespace = "ai.mayros.android"
compileSdk = 36
Expand All @@ -29,17 +35,37 @@ android {
}
}

signingConfigs {
create("release") {
storeFile = file(System.getenv("KEYSTORE_FILE") ?: keystoreProperties.getProperty("storeFile", "release.keystore"))
storePassword = System.getenv("KEYSTORE_PASSWORD") ?: keystoreProperties.getProperty("storePassword", "")
keyAlias = System.getenv("KEY_ALIAS") ?: keystoreProperties.getProperty("keyAlias", "")
keyPassword = System.getenv("KEY_PASSWORD") ?: keystoreProperties.getProperty("keyPassword", "")
}
}

buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
signingConfig = signingConfigs.getByName("release")
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
debug {
isMinifyEnabled = false
}
}

flavorDimensions += "distribution"
productFlavors {
create("playstore") {
dimension = "distribution"
}
create("sideload") {
dimension = "distribution"
}
}

buildFeatures {
compose = true
buildConfig = true
Expand Down Expand Up @@ -84,7 +110,8 @@ androidComponents {
val versionName = output.versionName.orNull ?: "0"
val buildType = variant.buildType

val outputFileName = "mayros-${versionName}-${buildType}.apk"
val flavor = variant.flavorName ?: ""
val outputFileName = "mayros-${versionName}-${flavor}-${buildType}.apk"
output.outputFileName = outputFileName
}
}
Expand Down
8 changes: 5 additions & 3 deletions apps/android/app/src/main/res/xml/network_security_config.xml
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config xmlns:tools="http://schemas.android.com/tools">
<!-- This app is primarily used on a trusted tailnet; allow cleartext for IP-based endpoints too. -->
<base-config cleartextTrafficPermitted="true" tools:ignore="InsecureBaseConfiguration" />
<network-security-config>
<base-config cleartextTrafficPermitted="false" />
<!-- Allow HTTP for tailnet/local dev endpoints (e.g. canvas/background web). -->
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">mayros.local</domain>
</domain-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">ts.net</domain>
</domain-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="false">localhost</domain>
</domain-config>
</network-security-config>
8 changes: 8 additions & 0 deletions apps/android/app/src/playstore/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<!-- Play Store policy: remove permissions not allowed on the store. -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" tools:node="remove" />
<uses-permission android:name="android.permission.SEND_SMS" tools:node="remove" />
</manifest>
4 changes: 4 additions & 0 deletions apps/android/app/src/sideload/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Sideload flavor: all main manifest permissions are retained. -->
</manifest>
6 changes: 6 additions & 0 deletions apps/android/keystore.properties.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Copy this file to keystore.properties and fill in your values.
# Do NOT commit keystore.properties — it is gitignored.
storeFile=release.keystore
storePassword=
keyAlias=
keyPassword=
2 changes: 1 addition & 1 deletion apps/ios/Sources/Device/NetworkStatusService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ final class NetworkStatusService: @unchecked Sendable {
func currentStatus(timeoutMs: Int = 1500) async -> MayrosNetworkStatusPayload {
await withCheckedContinuation { cont in
let monitor = NWPathMonitor()
let queue = DispatchQueue(label: "bot.molt.ios.network-status")
let queue = DispatchQueue(label: "ai.mayros.ios.network-status")
let state = NetworkStatusState()

monitor.pathUpdateHandler = { path in
Expand Down
2 changes: 1 addition & 1 deletion apps/ios/Sources/Gateway/GatewayDiscoveryModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ final class GatewayDiscoveryModel {
}

self.browsers[domain] = browser
browser.start(queue: DispatchQueue(label: "bot.molt.ios.gateway-discovery.\(domain)"))
browser.start(queue: DispatchQueue(label: "ai.mayros.ios.gateway-discovery.\(domain)"))
}
}

Expand Down
2 changes: 1 addition & 1 deletion apps/ios/Sources/Mayros.entitlements
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<plist version="1.0">
<dict>
<key>aps-environment</key>
<string>development</string>
<string>production</string>
</dict>
</plist>

76 changes: 76 additions & 0 deletions apps/ios/Sources/PrivacyInfo.xcprivacy
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyCollectedDataTypes</key>
<array>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypePreciseLocation</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<false/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
</array>
</dict>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeContacts</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<false/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
</array>
</dict>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypePhotosorVideos</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<false/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
</array>
</dict>
</array>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>C617.1</string>
</array>
</dict>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryDiskSpace</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>E174.1</string>
</array>
</dict>
</array>
</dict>
</plist>
2 changes: 1 addition & 1 deletion apps/ios/Sources/Screen/ScreenRecordService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ final class ScreenRecordService: @unchecked Sendable {
outPath: outPath)

let state = CaptureState()
let recordQueue = DispatchQueue(label: "bot.molt.screenrecord")
let recordQueue = DispatchQueue(label: "ai.mayros.ios.screenrecord")

try await self.startCapture(state: state, config: config, recordQueue: recordQueue)
try await Task.sleep(nanoseconds: UInt64(config.durationMs) * 1_000_000)
Expand Down
2 changes: 1 addition & 1 deletion apps/ios/Sources/Voice/TalkModeManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ final class TalkModeManager: NSObject {
private var incrementalSpeechContext: IncrementalSpeechContext?
private var incrementalSpeechDirective: TalkDirective?

private let logger = Logger(subsystem: "bot.molt", category: "TalkMode")
private let logger = Logger(subsystem: "ai.mayros", category: "TalkMode")

init(allowSimulatorCapture: Bool = false) {
self.allowSimulatorCapture = allowSimulatorCapture
Expand Down
2 changes: 1 addition & 1 deletion apps/ios/Tests/KeychainStoreTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import Testing

@Suite struct KeychainStoreTests {
@Test func saveLoadUpdateDeleteRoundTrip() {
let service = "bot.molt.tests.\(UUID().uuidString)"
let service = "ai.mayros.tests.\(UUID().uuidString)"
let account = "value"

#expect(KeychainStore.delete(service: service, account: account))
Expand Down
2 changes: 1 addition & 1 deletion apps/ios/fastlane/Appfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
app_identifier("bot.molt.ios")
app_identifier("ai.mayros.ios")

# Auth is expected via App Store Connect API key.
# Provide either:
Expand Down
7 changes: 7 additions & 0 deletions apps/ios/project.yml
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ targets:
UIApplicationSupportsMultipleScenes: false
UIBackgroundModes:
- audio
- location
- remote-notification
BGTaskSchedulerPermittedIdentifiers:
- ai.mayros.ios.bgrefresh
Expand All @@ -112,6 +113,12 @@ targets:
NSLocationAlwaysAndWhenInUseUsageDescription: Mayros can share your location in the background when you enable Always.
NSMicrophoneUsageDescription: Mayros needs microphone access for voice wake.
NSSpeechRecognitionUsageDescription: Mayros uses on-device speech recognition for voice wake.
NSContactsUsageDescription: Mayros accesses your contacts to share them with the gateway when you allow it.
NSPhotoLibraryUsageDescription: Mayros accesses your photo library to share images with the gateway.
NSPhotoLibraryAddUsageDescription: Mayros saves photos and videos to your library when requested.
NSCalendarsUsageDescription: Mayros accesses your calendar to read and create events when you allow it.
NSRemindersUsageDescription: Mayros accesses your reminders to read and create items when you allow it.
NSMotionUsageDescription: Mayros uses motion data to detect device activity and orientation.
UISupportedInterfaceOrientations:
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
Expand Down
2 changes: 1 addition & 1 deletion apps/macos/Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ let package = Package(
.package(url: "https://github.com/swiftlang/swift-subprocess.git", from: "0.1.0"),
.package(url: "https://github.com/apple/swift-log.git", from: "1.8.0"),
.package(url: "https://github.com/sparkle-project/Sparkle", from: "2.8.1"),
.package(url: "https://github.com/steipete/Peekaboo.git", branch: "main"),
.package(url: "https://github.com/steipete/Peekaboo.git", revision: "bace59f90bb276f1c6fb613acfda3935ec4a7a90"),
.package(path: "../shared/MayrosKit"),
.package(path: "../../Swabble"),
],
Expand Down
Loading
Loading