50 Commits
Author SHA1 Message Date
sid10042003-design c57c4b556b feat: Add Korean language support (values-ko) (#735)
* feat: Add Korean language support (values-ko)

* Update build-release.yml
2026-07-29 10:49:17 +09:00
Yu-ga 0f8c221431 Add Jules automation workflows (#320)
* Add Jules automation workflows

* Remove Jules bug fixer workflow
2026-03-15 09:53:31 -07:00
Yu-ga 38fc2c7bf4 chore: improve OSS docs and CI (#317) 2026-03-15 08:57:53 -07:00
Yu-ga 0bd176d0cf chore: add script to set repository topics 2026-03-10 01:03:55 +09:00
Yu-gaClaude Sonnet 4.6google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
f8eb868e17 Add missing Android node command families (#189)
* Add missing Android node command families (parity gap)

- Implement Notifications, System, Photos, Contacts, Calendar, and Motion command families.
- Add OpenClawNotificationListenerService and NotificationManager for notification support.
- Implement robust runtime permission checks and structured error handling in all handlers.
- Wire new handlers into NodeRuntime, InvokeDispatcher, and ConnectionManager.
- Conditionally advertise capabilities to the gateway based on granted permissions.
- Add unit tests for command routing and handler logic.
- Update AndroidManifest.xml with necessary permissions and service declarations.

Co-authored-by: yuga-hashimoto <74749461+yuga-hashimoto@users.noreply.github.com>

* Refine Android node command families based on PR feedback

- Implement actual Notification actions (dismiss, open) using NotificationListenerService.
- Correct permission gating for Notifications (use Listener Service check instead of POST_NOTIFICATIONS).
- Add runtime permission check for system.notify on Android 13+.
- Improve Calendar event insertion by querying for a writable calendar instead of hardcoding ID 1.
- Update capability advertisement in ConnectionManager to reflect true availability.
- Enhance PhotosHandler and MotionHandler with more complete implementations.
- Update unit tests to match refined permission and action logic.

Co-authored-by: yuga-hashimoto <74749461+yuga-hashimoto@users.noreply.github.com>

* Finalize Android node command families with refined notification support

- Implement dismiss/open notification actions using NotificationListenerService.
- Return NOT_IMPLEMENTED for reply notification action as requested.
- Fix permission gating for notifications (use listener service status).
- Add runtime permission check for system notifications on Android 13+.
- Improve calendar event creation with dynamic writable calendar selection.
- Refine capability advertising in ConnectionManager.
- Clean up unused imports and duplicated logic.
- Update unit tests to match refined behavior.

Co-authored-by: yuga-hashimoto <74749461+yuga-hashimoto@users.noreply.github.com>

* fix: address review issues in node command families PR

- MotionHandler: add close() to unregister SensorEventListener on disconnect
- NodeRuntime: call motionHandler.close() in disconnect() for proper cleanup
- OpenClawNotificationListenerService: add @Volatile to companion manager field
- SystemHandlerTest: replace unconditional SDK_INT branch with asserting tests

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat: add on-demand permission requests to new node command handlers

Contacts, Calendar, Photos, and Motion handlers now use PermissionRequester
to show the system permission dialog when a command is first invoked,
matching the existing SMS/Camera handler pattern.

- ContactsHandler, CalendarHandler, PhotosHandler, MotionHandler:
  add attachPermissionRequester() + ensureXPermission() suspend helpers,
  convert handle methods to suspend fun
- PermissionRequester: add human-readable labels for new permissions
- NodeRuntime: expose attachPermissionRequester() delegating to all handlers
- MainActivity: wire permissionRequester to new handlers on startup
- InvokeDispatcherTest: update every -> coEvery for suspend handler mocks

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat: guide user to notification listener settings via dialog

When notifications.list or notifications.actions is invoked without
notification access, show an AlertDialog explaining the requirement
and open ACTION_NOTIFICATION_LISTENER_SETTINGS on confirmation.

- PermissionRequester: add requestNotificationAccess() suspend fun
- NotificationsHandler: add PermissionRequester wiring, make handle
  methods suspend, call requestNotificationAccess() before error return
- NodeRuntime.attachPermissionRequester: include notificationsHandler

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* add funding

---------

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-01 00:28:27 -08:00
4275892263 feat: Gateway voice session, self-signed cert support, and voice connection selector (#179)
* fix(voice): support Gateway connection in voice session (#165)

- Update SettingsRepository.isConfigured() to return true when
  connectionType is GATEWAY, so voice session no longer shows
  "Please configure HTTP connection" for Gateway-only users
- Add sendViaGateway() to OpenClawSession that routes through
  NodeRuntime.sendChat() and waits for the assistant response
  via pendingRunCount + chatMessages flow
- Route sendToOpenClaw() based on connectionType (Gateway vs HTTP)
- Add error_gateway_not_connected string resource (EN/JA)
- Update error_config_required to be connection-type agnostic

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* feat(http): support self-signed HTTPS certificates (#166)

- Add httpIgnoreSslErrors setting to SettingsRepository
- Configure OpenClawClient to accept an ignoreSslErrors parameter;
  when true, uses a trust-all X509TrustManager and hostname verifier
  to allow self-signed/invalid HTTPS certificates
- Add "Ignore SSL Certificate Errors" toggle in HTTP settings UI,
  shown in the HTTP tab of the connection settings section
- Persist the setting at save time and when test connection succeeds
- Apply ignoreSslErrors in ChatViewModel and OpenClawSession so
  all HTTP chat traffic respects the setting
- Add string resources for the new toggle (EN/JA)

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* fix(voice): address review feedback on Gateway session (#165)

- Add fail-fast Gateway health check in onShow() so users see
  error_gateway_not_connected immediately at session open, consistent
  with HTTP mode behavior
- Replace combine(pendingRunCount, chatMessages) with chatMessages.first{}
  to detect the completed assistant response; chatMessages only receives
  committed messages (not streaming partials), eliminating the
  premature pendingRunCount==0 firing between tool calls and the
  TOCTOU race with assistantCountBefore
- Remove unused combine import

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* feat(voice): add wakeword connection type selector and strengthen SSL warning

- Add `wakewordConnectionType` setting (Gateway/HTTP) in SettingsRepository
- Voice session (long-press Home) now uses `wakewordConnectionType` instead of
  the global `connectionType`, allowing independent configuration
- Add voice session connection type selector (FilterChip) in Wake Word settings
- Show prominent error card with MITM risk details when SSL verification is disabled

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* fix(ci): use shared debug keystore to prevent conflicting app signature

Without a fixed keystore each runner generates a fresh debug.keystore,
so APKs from different PRs have different signatures and cannot be
installed over each other.

Solution: decode a shared keystore from `DEBUG_KEYSTORE_B64` secret into
~/.android/debug.keystore (the default path Android Gradle Plugin uses
for debug signing). Fork PRs fall back to a freshly generated keystore.

Setup (one-time, see PR description):
  keytool -genkey ... -keystore debug.keystore
  base64 debug.keystore → store as GitHub secret DEBUG_KEYSTORE_B64

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* fix(voice): skip local DB in Gateway wakeword session

Gateway mode voice sessions were incorrectly creating local DB chat
sessions and saving messages, causing duplicate entries to appear in
the chat list as HTTP sessions.

- onShow(): in Gateway mode, skip chatRepository session create/resume.
  Instead switch to a new gateway session when resumeLatestSession=false,
  or keep the current active gateway session when resumeLatestSession=true.
- sendToOpenClaw(): only write user message to local DB in HTTP mode.
- handleResponseReceived(): only write assistant reply to local DB in HTTP mode.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* perf(ci): parallelize lint and build jobs to cut wall-clock time

Before: lint (all variants) → build standard → build full ≈ 7 min sequential
After:  lint (lintStandardDebug) ║ build (--parallel) ≈ ~3 min

Changes:
- Split into two parallel jobs: `lint` and `build`
- Lint runs only `lintStandardDebug` instead of `lint` (all variants)
  which avoids re-running the same checks on every flavor × build-type
- Build uses `--parallel` so Standard and Full flavors compile concurrently
- Lint job uses fetch-depth: 1 (no git history needed for static analysis)

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* fix(voice): name new gateway session with label instead of raw UUID

New gateway sessions created by the wakeword voice session now get a
human-readable label matching the existing HTTP session format:
  "Voice Session HH:mm" / "音声セッション HH:mm"

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Happy <yesreply@happy.engineering>
2026-02-28 21:28:03 +09:00
Yu-ga 08f33fc841 fix(ci): handle AGP bundle output paths for flavored release builds (#176) 2026-02-27 17:56:03 +09:00
Yu-gaandClaude Sonnet 4.6 eff8784bd6 feat(tts): add multi-provider TTS support (OpenAI, ElevenLabs, VOICEVOX) (#164)
* feat: add multi-provider TTS support and build flavor split

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(tts): code review fixes - i18n, bugs, copyright compliance

- Move all hardcoded Japanese UI strings to strings.xml (~35 entries)
  for proper i18n across TTS providers, CreditsScreen, SettingsActivity,
  and VoiceVoxModelManager
- Fix TTSManager.reinitialize(): add missing BuildConfig.FLAVOR guard
  so VoiceVoxProvider is only instantiated in 'full' flavor builds
- Fix VoiceVoxProvider: remove duplicate VVM_FILE_MAPPING; delegate to
  VoiceVoxCharacterData as single source of truth
- Fix VoiceVoxCharacterData: align style IDs with SettingsActivity
  CHARACTERS (official VOICEVOX style IDs) and add missing characters
  (玄野武宏, 白上虎太郎, 青山龍星) for correct copyright display
- Fix VoiceVoxProvider.speak(): call synthesizer.metas() as method
- Fix OpenAIProvider: use prepareAsync() instead of blocking prepare()
- Fix ElevenLabsProvider, OpenAIProvider: delete temp files in speak()
  (speakWithProgress already did cleanup; speak() did not)
- Fix CreditsScreen: wrap all startActivity() calls in
  ActivityNotFoundException handler; add character credit fallback
  when styleId is unregistered (copyright compliance)
- Add ProGuard rules for new TTS provider interface and classes

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(tts): address code review findings

- VoiceVoxProvider: remove debug metas() enumeration loop that ran on
  every speak() call (overhead + unnecessary logging in production)
- ElevenLabsProvider, OpenAIProvider: replace hardcoded English fallback
  string "Not configured" in speakWithProgress() with string resource
- .gitignore: add *.vvm to prevent accidental commit of large model
  files (50-75 MB each, downloaded at runtime from GitHub releases)
- Remove erroneously committed placeholder app/src/full/assets/0.vvm
  (contained "Invalid username or password." — not a real VVM model)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(voicevox): implement actual VVM download and add setup code to settings

- Fix VoiceVoxSetupDialog: replace fake progress simulation with real
  downloads via VoiceVoxModelManager.copyDictionaryFromAssets() and
  downloadVvmModel(). Dialog now moves inside VoiceVoxSettingsCard so
  refreshStatus() is called immediately on completion.
- Fix VoiceVoxModelManager stub (standard flavor): align sealed class
  API (CopyProgress/DownloadProgress) with full flavor so SettingsActivity
  compiles against the same interface on both flavors.
- Add setup code input to Gateway tab in SettingsActivity: paste a code
  from `openclaw qr --setup-code-only` and tap Apply to auto-fill host,
  port, TLS, and token — matching the SetupGuideScreen behaviour.
- Remove spurious debug metas() logging from VoiceVoxProvider.speak().

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(voicevox): correct official style IDs and VVM file mappings

- VoiceVoxCharacterData: rewrite all style IDs to match official VOICEVOX
  Core API (voicevox_vvm 0.16.x) per README
- SettingsActivity.VoiceVoxCharacters: sync CHARACTERS list and
  VVM_FILE_MAPPING with corrected IDs
- VoiceVoxModelManager: drop unused 1.vvm/2.vvm, add 9.vvm/10.vvm/15.vvm
  for 白上虎太郎, 玄野武宏 extra styles, 青山龍星

Key corrections (old → new):
  ずんだもん ヒソヒソ: ID 11/0.vvm → 38/5.vvm
  ずんだもん ノーマル: ID 7       → 3
  白上虎太郎 ふつう:  ID 20/3.vvm → 12/9.vvm
  青山龍星 ノーマル:  ID 27/4.vvm → 13/15.vvm
  玄野武宏 ノーマル:  ID 16/2.vvm → 11/4.vvm

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(credits): add Credits navigation from Settings TopAppBar

- SettingsActivity: toggle between SettingsScreen and CreditsScreen
  using showCredits state
- SettingsScreen: add onCredits callback parameter
- TopAppBar: add Info icon button that opens CreditsScreen

CreditsScreen already shows VOICEVOX credit notation
(e.g. "VOICEVOX:白上虎太郎") but had no entry point in the UI.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* TTS再生タイミング修正、ウェイクワード後の連続会話改善、VOICEVOX設定画面にクレジット追加

* CI: standardは元の名前を維持、fullのビルド名に-in-VOICEVOXを付加

* fix

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-27 00:20:15 -08:00
Yu-ga 03e5c8278a fix(workflow): use jq to build json payload safely and fix yaml syntax (#162) 2026-02-25 18:59:41 -08:00
Yu-gaandClaude Sonnet 4.6 83ed295db0 fix: fix debug APK crash and add fork PR support in CI (#155)
* fix: disable minification for debug builds

* fix: fix debug APK crash and add fork PR support in CI

- Rename workflow from "CI" to "Build & Check PR"
- Use DEBUG_GOOGLE_SERVICES_JSON secret for own-repo PRs (real Firebase)
- Set FIREBASE_ENABLED=false for fork PRs (no secret available)
- Disable FirebaseInitProvider auto-init in debug builds via manifest merge
- Initialize Firebase manually in OpenClawApplication based on FIREBASE_ENABLED
- Add FIREBASE_ENABLED BuildConfig flag to debug/release build types

Fixes crash: FirebaseInitProvider threw IllegalArgumentException on mock-api-key

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: use printf to write google-services.json to avoid echo escape issues

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: use python3 to write google-services.json to avoid shell escape issues

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: use python heredoc to safely write google-services.json with JSON validation

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: decode base64-encoded DEBUG_GOOGLE_SERVICES_JSON secret

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* ci: run lint before build for earlier feedback

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-24 20:50:46 -08:00
Yu-gaandKimi Claw b0796bcd8f fix: add event_name check to jules workflow to prevent push trigger failures (#139)
The workflow was failing when triggered by push events (e.g., when
GitHub validates workflow files). Added explicit github.event_name
check to ensure the job only runs for issues events.

Co-authored-by: Kimi Claw <kimi@openclaw.ai>
2026-02-24 14:24:28 +09:00
Yu-gaandYuga Hashimoto 404b18a9fa fix: use debug build for PR CI to avoid signing issues (#131)
PR builds from forks cannot access repository secrets like RELEASE_KEYSTORE_BASE64.
This change switches the AAB build from release to debug variant,
which uses the default Android debug keystore instead of requiring
a release keystore.

Changes:
- Build PR Test AAB: assembleRelease → bundleDebug
- Upload path: bundle/release → bundle/debug

This allows PRs from external contributors to pass CI without
needing access to signing secrets.

Co-authored-by: Yuga Hashimoto <yuga.hashimoto@example.com>
2026-02-24 13:41:44 +09:00
Yu-gaandClaude Sonnet 4.6 51930e49af fix: use wildcard path for release APK/AAB artifacts
Output filename is customized in build.gradle.kts (openclaw-<version>-release.apk),
so fixed hardcoded app-release.apk/aab references to use wildcards.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-23 22:39:13 +09:00
Yu-gaandClaude Sonnet 4.6 1b5715eea1 fix: use wildcard path for APK/AAB artifact upload in CI
Output filename is customized in build.gradle.kts, so fixed path
pattern from hardcoded app-debug.apk to *.apk / *.aab.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-23 22:37:15 +09:00
Yu-ga 859ae94f8c fix(ci): generate both APK (assembleDebug) and AAB (assembleRelease) artifacts 2026-02-23 13:27:52 +09:00
Yu-ga 4949ef3f5f fix: correct YAML syntax with proper indentation 2026-02-23 00:58:09 +09:00
Yu-ga 5276e0e637 fix: correct YAML syntax with proper indentation 2026-02-23 00:57:25 +09:00
Yu-ga 59a50d2cac Fix YAML syntax error on line 70 and 78 2026-02-22 20:59:37 +09:00
Yu-ga 6349037e30 Fix syntax error in jules-from-issue-label.yml 2026-02-22 20:24:10 +09:00
Yu-ga 036ff498ae fix: simplify and correct Jules workflow 2026-02-22 16:25:33 +09:00
Yu-ga 1256b4e72b fix: correct YAML syntax for jules workflow 2026-02-21 22:16:15 +09:00
Yu-ga 02d0efd0f8 fix: proper YAML workflow for Jules 2026-02-21 19:44:02 +09:00
Yu-ga 877478dfd6 fix: correct YAML indentation for jules workflow 2026-02-21 19:35:57 +09:00
Yu-ga ae6af9df0e fix: proper YAML workflow for Jules 2026-02-21 18:56:56 +09:00
Yu-ga 31e3452abd fix: correct YAML indentation in jules workflow 2026-02-21 18:52:43 +09:00
Yu-gaandClaude Opus 4.6 300cdfd25a Build: separate PR test APK from release (fixed version, distinct app identity) (#101)
* ci: use PR test APK variant with stable version and distinct app identity

* ci: generate dummy google-services for pr variant package

* ci: include release/debug/test package clients in dummy google-services

* ui(pr): rename app to Debug-OpenClawAssistant and use red launcher color

* build(pr): base test variant on debug for launch reliability

* build: switch PR artifact to debug variant to prevent startup crash

* fix(android): use fully-qualified component names to avoid variant package resolution crash

* feat(debug): use purple icon for debug builds and clean up pr source set

- Add debug-specific adaptive icon overrides using ic_launcher_purple_foreground
- Add purple launcher icon assets (PNG + adaptive icon XMLs)
- Move app_name override from resValue to debug strings.xml for reliability
- Remove unused pr/ source set (leftover from earlier approach)
- Fix CI comment to reflect debug variant and remove stale .test client

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* revert(ci): restore release build and google-services decode

Revert CI to build assembleRelease with real google-services.json
from secrets. Debug build type with purple icon is for local dev only.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* ci: build debug APK with real Firebase config for PR testing

Switch CI back to assembleDebug for PR test builds. The
GOOGLE_SERVICES_JSON secret should include both release and debug
client entries so Firebase initializes correctly.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* ci: build both debug and release APKs

Build and upload both variants so PR testing gets the debug APK
(with .debug suffix and purple icon) while also verifying the
release build succeeds.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* ci: keep only debug build in PR workflow

Release builds are handled by build-release.yml, so ci.yml only
needs to build the debug APK for PR testing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* ci: use separate DEBUG_GOOGLE_SERVICES_JSON secret for debug builds

Keep GOOGLE_SERVICES_JSON for release (build-release.yml) and use
a dedicated DEBUG_GOOGLE_SERVICES_JSON secret for debug builds.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 23:53:42 -08:00
Yu-ga ada5d48496 ci: remove issue body truncation for Jules prompt 2026-02-21 00:19:37 +09:00
Yu-ga 40a6f2f2f6 ci: fix Jules issue-label workflow syntax 2026-02-21 00:14:01 +09:00
Yu-ga a479a83e46 ci: add manual dispatch for Jules label workflow 2026-02-21 00:11:57 +09:00
Yu-ga ef1787bee1 ci: trigger Jules from issues labeled jules 2026-02-21 00:03:38 +09:00
Yu-gaandClaude Opus 4.6 acfdd790c3 fix: correct gateway connect params and reduce Crashlytics noise (#52)
* fix: correct gateway connect params and reduce Crashlytics noise

- Fix invalid connect params (closes #48): change client.id to
  "openclaw-android" and client.mode to "cli" to match the gateway
  server's schema (GATEWAY_CLIENT_IDS/GATEWAY_CLIENT_MODES)
- Stop reporting transient network errors (SocketTimeout, SocketException,
  ConnectException, ProtocolException, ErrnoException, etc.) to
  Crashlytics in both GatewayClient and OpenClawClient
- Handle Vosk UnsatisfiedLinkError gracefully (related to #38): persist a
  "vosk_unsupported" flag so incompatible devices skip Vosk init on
  subsequent launches instead of repeatedly crashing and reporting

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(tts): increase timeout and optimize chunk size for long Japanese text

* feat(build): enable automated versioning based on git tags and commit count

* ci: upload debug APK as artifact for pull requests

* ci: fetch full git history for correct versioning

* ci: sign PR builds with release key for update compatibility

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 10:23:06 -08:00
Yu-ga 232651ccdf Revert "feat: Automate app versioning based on git tags (#50)" (#51)
This reverts commit 7d62913577.
2026-02-16 08:02:31 -08:00
Yu-gaandAbhishek 7d62913577 feat: Automate app versioning based on git tags (#50)
* feat: Add Telnyx phone calling integration

- Add TelnyxClient.kt for Telnyx Call Control API
  - Make outbound phone calls
  - Hangup, transfer, and DTMF support
  - Text-to-speech synthesis via Telnyx AI API

- Add PhoneCallService.kt for call management
  - Call state management
  - Notification support for active calls
  - Integration with OpenClaw session

- Update SettingsRepository with Telnyx credentials
  - telnyx_api_key
  - telnyx_connection_id
  - telnyx_caller_id

- Add phone/call icons for notifications

- Update README with phone calling documentation

This enables the OpenClaw Assistant to make real phone calls
via Telnyx, integrating with ClawdTalk for AI conversations.

Environment variables (not stored in code):
- TELNYX_API_KEY: API key for authentication
- TELNYX_CONNECTION_ID: Call Control connection ID
- TELNYX_CALLER_ID: Default caller ID for outbound calls

* feat: Automate app versioning based on git tags

---------

Co-authored-by: Abhishek <abhishek@telnyx.com>
2026-02-16 23:45:53 +09:00
c4f602c563 fix: enable chat text selection and fix TTS on long responses (#47)
* fix: enable chat text selection and fix TTS stopping on long responses

- Wrap chat message bubbles in SelectionContainer for text selection/copy
- Split long TTS text into chunks (max 3900 chars) to avoid Android's
  4000 char limit which caused speech to silently stop mid-response
- Add try-catch around TTS speak flow to ensure wake word detection
  always resumes even when TTS fails unexpectedly
- Scale TTS timeout dynamically based on text length instead of fixed 90s

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* fix(ci): fix heredoc indentation in google-services.json fallback

The EOT delimiter was indented, causing bash to fail with
"unexpected end of file". Move delimiter to baseline indent level.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* fix: address Copilot review feedback

- Fix TTSManager pendingSpeak to queue all chunks (not just first)
  when TTS initialization is still in progress
- Clarify timeout calculation comments (15ms per char ~15s per 1000)

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Happy <yesreply@happy.engineering>
2026-02-16 21:19:40 +09:00
Yu-ga 2be2c00cbb Fix CI for forked PRs: Generate dummy google-services.json if missing 2026-02-16 19:04:13 +09:00
Yu-ga 0aaee3723b fix(ci): add google-services.json decoding step to release workflow 2026-02-15 23:12:57 +09:00
8a89f07938 fix: address Copilot review for Firebase Crashlytics integration
- Rethrow CancellationException in OpenClawClient, GatewayClient, and
  HotwordService to prevent swallowing coroutine cancellation and
  polluting Crashlytics with expected cancellations
- Add guard for missing GOOGLE_SERVICES_JSON secret in CI workflow
  and use printf instead of echo for robustness

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-02-15 16:59:26 +09:00
Yu-gaandClaude Opus 4.6 8c5aea8fc8 ci: decode google-services.json from GitHub Secret
The google-services.json file is excluded from version control via
.gitignore. Decode it from the GOOGLE_SERVICES_JSON secret in CI
so the build can succeed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 14:33:11 +09:00
Yu-ga dcab4e3f8a chore: allow admins to bypass branch protection 2026-02-15 02:47:16 +09:00
Yu-ga 1442c14608 chore: add community standards and CI workflow 2026-02-15 02:42:09 +09:00
Yu-gaandClaude Opus 4.6 46ee30511a Improve mic permission handling, fix SpeechRecognizer service selection, and publish releases directly
- Use ActivityResultContracts for mic permission in ChatActivity (replacing deprecated requestPermissions)
- Show settings dialog when mic permission is permanently denied
- Fix hotword toggle to properly await permission result before starting service
- Explicitly select a real speech recognition service, skipping the app's own stub RecognitionService
- Change release workflow from draft to published

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 01:48:53 +09:00
Yu-ga fe27dd0281 docs: add ko-fi funding link 2026-02-12 01:08:08 +09:00
Yu-ga c60bda2d13 chore: enable github sponsors 2026-02-10 21:29:07 +09:00
Yu-ga c45d0728a2 Fix voice input issues and add contribution docs 2026-02-06 16:48:21 +09:00
Yu-ga e2931b219f Enable automatic release note generation 2026-02-06 01:27:52 +09:00
Yu-ga 629273a36a Fix workflow syntax: Add missing on key 2026-02-06 01:17:47 +09:00
Yu-ga dfa5fd9100 Fix workflow trigger to include tags 2026-02-06 01:15:32 +09:00
Yu-ga d034681b8f Update workflow to include version tag in artifact filenames 2026-02-06 01:10:35 +09:00
Yu-ga e1d0af7c08 Prepare formal release v1.0.0 (Configuration updates & cleanup) 2026-02-06 01:03:19 +09:00
yuga-hashimotoandClaude Opus 4.5 e389841d35 feat: Add GitHub Actions workflow for APK build and release
Automatically builds debug APK and creates GitHub release on push to main.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 18:06:21 +09:00