refactor: rename PicoClaw to ClawDroid

- Android package: io.picoclaw.android → io.clawdroid
- Go module: github.com/sipeed/picoclaw → github.com/KarakuriAgent/clawdroid
- Binary: picoclaw → clawdroid
- Home dir: ~/.picoclaw/ → ~/.clawdroid/
- Env vars: PICOCLAW_* → CLAWDROID_*
- DB: picoclaw.db → clawdroid.db
- SharedPrefs: picoclaw → clawdroid
- Docker services, CI/CD, assets, docs updated accordingly

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
KoheiYamashita 2026-02-24 00:50:37 +09:00
parent b50b98e814
commit 83afa23b8c
167 changed files with 958 additions and 958 deletions

View file

@ -10,7 +10,7 @@ assignees: ''
## Quick Summary ## Quick Summary
## Environment & Tools ## Environment & Tools
- **PicoClaw Version:** (e.g., v0.1.2 or commit hash) - **ClawDroid Version:** (e.g., v0.1.2 or commit hash)
- **Go Version:** (e.g., go 1.22) - **Go Version:** (e.g., go 1.22)
- **AI Model & Provider:** (e.g., GPT-4o via OpenAI / DeepSeek via SiliconFlow) - **AI Model & Provider:** (e.g., GPT-4o via OpenAI / DeepSeek via SiliconFlow)
- **Operating System:** (e.g., Ubuntu 22.04 / macOS / Android Termux) - **Operating System:** (e.g., Ubuntu 22.04 / macOS / Android Termux)

View file

@ -52,5 +52,5 @@ jobs:
- name: Upload APK - name: Upload APK
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: picoclaw-release-apk name: clawdroid-release-apk
path: android/app/build/outputs/apk/release/*.apk path: android/app/build/outputs/apk/release/*.apk

View file

@ -10,7 +10,7 @@ on:
env: env:
GHCR_REGISTRY: ghcr.io GHCR_REGISTRY: ghcr.io
GHCR_IMAGE_NAME: ${{ github.repository_owner }}/picoclaw GHCR_IMAGE_NAME: ${{ github.repository_owner }}/clawdroid
DOCKERHUB_REGISTRY: docker.io DOCKERHUB_REGISTRY: docker.io
DOCKERHUB_IMAGE_NAME: ${{ vars.DOCKERHUB_REPOSITORY }} DOCKERHUB_IMAGE_NAME: ${{ vars.DOCKERHUB_REPOSITORY }}

View file

@ -147,11 +147,11 @@ jobs:
- name: Rename APK with version - name: Rename APK with version
run: | run: |
mv app/build/outputs/apk/release/app-release.apk \ mv app/build/outputs/apk/release/app-release.apk \
app/build/outputs/apk/release/picoclaw-${{ inputs.tag }}.apk app/build/outputs/apk/release/clawdroid-${{ inputs.tag }}.apk
- name: Upload APK to release - name: Upload APK to release
env: env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: | run: |
gh release upload "${{ inputs.tag }}" \ gh release upload "${{ inputs.tag }}" \
app/build/outputs/apk/release/picoclaw-${{ inputs.tag }}.apk app/build/outputs/apk/release/clawdroid-${{ inputs.tag }}.apk

12
.gitignore vendored
View file

@ -8,14 +8,14 @@ build/
*.dylib *.dylib
*.test *.test
*.out *.out
/picoclaw /clawdroid
/picoclaw-test /clawdroid-test
cmd/picoclaw/workspace cmd/clawdroid/workspace
# Picoclaw specific # ClawDroid specific
# PicoClaw # ClawDroid
.picoclaw/ .clawdroid/
config.json config.json
sessions/ sessions/
build/ build/

View file

@ -5,10 +5,10 @@ version: 2
before: before:
hooks: hooks:
- go mod tidy - go mod tidy
- go generate ./cmd/picoclaw - go generate ./cmd/clawdroid
builds: builds:
- id: picoclaw - id: clawdroid
env: env:
- CGO_ENABLED=0 - CGO_ENABLED=0
goos: goos:
@ -23,18 +23,18 @@ builds:
- s390x - s390x
- mips64 - mips64
- arm - arm
main: ./cmd/picoclaw main: ./cmd/clawdroid
ignore: ignore:
- goos: windows - goos: windows
goarch: arm goarch: arm
dockers_v2: dockers_v2:
- id: picoclaw - id: clawdroid
dockerfile: Dockerfile.goreleaser dockerfile: Dockerfile.goreleaser
ids: ids:
- picoclaw - clawdroid
images: images:
- "ghcr.io/{{ .Env.GITHUB_REPOSITORY_OWNER }}/picoclaw" - "ghcr.io/{{ .Env.GITHUB_REPOSITORY_OWNER }}/clawdroid"
- "docker.io/{{ .Env.DOCKERHUB_IMAGE_NAME }}" - "docker.io/{{ .Env.DOCKERHUB_IMAGE_NAME }}"
tags: tags:
- "{{ .Tag }}" - "{{ .Tag }}"

View file

@ -1,5 +1,5 @@
# ============================================================ # ============================================================
# Stage 1: Build the picoclaw binary # Stage 1: Build the clawdroid binary
# ============================================================ # ============================================================
FROM golang:1.26.0-alpine AS builder FROM golang:1.26.0-alpine AS builder
@ -27,10 +27,10 @@ HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD wget -q --spider http://localhost:18790/health || exit 1 CMD wget -q --spider http://localhost:18790/health || exit 1
# Copy binary # Copy binary
COPY --from=builder /src/build/picoclaw /usr/local/bin/picoclaw COPY --from=builder /src/build/clawdroid /usr/local/bin/clawdroid
# Create picoclaw home directory # Create clawdroid home directory
RUN /usr/local/bin/picoclaw onboard RUN /usr/local/bin/clawdroid onboard
ENTRYPOINT ["picoclaw"] ENTRYPOINT ["clawdroid"]
CMD ["gateway"] CMD ["gateway"]

View file

@ -4,7 +4,7 @@ ARG TARGETPLATFORM
RUN apk add --no-cache ca-certificates tzdata RUN apk add --no-cache ca-certificates tzdata
COPY $TARGETPLATFORM/picoclaw /usr/local/bin/picoclaw COPY $TARGETPLATFORM/clawdroid /usr/local/bin/clawdroid
ENTRYPOINT ["picoclaw"] ENTRYPOINT ["clawdroid"]
CMD ["gateway"] CMD ["gateway"]

View file

@ -1,7 +1,7 @@
.PHONY: all build install uninstall clean help test .PHONY: all build install uninstall clean help test
# Build variables # Build variables
BINARY_NAME=picoclaw BINARY_NAME=clawdroid
BUILD_DIR=build BUILD_DIR=build
CMD_DIR=cmd/$(BINARY_NAME) CMD_DIR=cmd/$(BINARY_NAME)
MAIN_GO=$(CMD_DIR)/main.go MAIN_GO=$(CMD_DIR)/main.go
@ -24,8 +24,8 @@ INSTALL_BIN_DIR=$(INSTALL_PREFIX)/bin
INSTALL_MAN_DIR=$(INSTALL_PREFIX)/share/man/man1 INSTALL_MAN_DIR=$(INSTALL_PREFIX)/share/man/man1
# Workspace and Skills # Workspace and Skills
PICOCLAW_HOME?=$(HOME)/.picoclaw CLAWDROID_HOME?=$(HOME)/.clawdroid
WORKSPACE_DIR?=$(PICOCLAW_HOME)/workspace WORKSPACE_DIR?=$(CLAWDROID_HOME)/workspace
WORKSPACE_SKILLS_DIR=$(WORKSPACE_DIR)/skills WORKSPACE_SKILLS_DIR=$(WORKSPACE_DIR)/skills
BUILTIN_SKILLS_DIR=$(CURDIR)/skills BUILTIN_SKILLS_DIR=$(CURDIR)/skills
@ -71,7 +71,7 @@ generate:
@$(GO) generate ./... @$(GO) generate ./...
@echo "Run generate complete" @echo "Run generate complete"
## build: Build the picoclaw binary for current platform ## build: Build the clawdroid binary for current platform
build: generate build: generate
@echo "Building $(BINARY_NAME) for $(PLATFORM)/$(ARCH)..." @echo "Building $(BINARY_NAME) for $(PLATFORM)/$(ARCH)..."
@mkdir -p $(BUILD_DIR) @mkdir -p $(BUILD_DIR)
@ -79,7 +79,7 @@ build: generate
@echo "Build complete: $(BINARY_PATH)" @echo "Build complete: $(BINARY_PATH)"
@ln -sf $(BINARY_NAME)-$(PLATFORM)-$(ARCH) $(BUILD_DIR)/$(BINARY_NAME) @ln -sf $(BINARY_NAME)-$(PLATFORM)-$(ARCH) $(BUILD_DIR)/$(BINARY_NAME)
## build-all: Build picoclaw for all platforms ## build-all: Build clawdroid for all platforms
build-all: generate build-all: generate
@echo "Building for multiple platforms..." @echo "Building for multiple platforms..."
@mkdir -p $(BUILD_DIR) @mkdir -p $(BUILD_DIR)
@ -90,7 +90,7 @@ build-all: generate
GOOS=windows GOARCH=amd64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-windows-amd64.exe ./$(CMD_DIR) GOOS=windows GOARCH=amd64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-windows-amd64.exe ./$(CMD_DIR)
@echo "All builds complete" @echo "All builds complete"
## install: Install picoclaw to system and copy builtin skills ## install: Install clawdroid to system and copy builtin skills
install: build install: build
@echo "Installing $(BINARY_NAME)..." @echo "Installing $(BINARY_NAME)..."
@mkdir -p $(INSTALL_BIN_DIR) @mkdir -p $(INSTALL_BIN_DIR)
@ -99,7 +99,7 @@ install: build
@echo "Installed binary to $(INSTALL_BIN_DIR)/$(BINARY_NAME)" @echo "Installed binary to $(INSTALL_BIN_DIR)/$(BINARY_NAME)"
@echo "Installation complete!" @echo "Installation complete!"
## uninstall: Remove picoclaw from system ## uninstall: Remove clawdroid from system
uninstall: uninstall:
@echo "Uninstalling $(BINARY_NAME)..." @echo "Uninstalling $(BINARY_NAME)..."
@rm -f $(INSTALL_BIN_DIR)/$(BINARY_NAME) @rm -f $(INSTALL_BIN_DIR)/$(BINARY_NAME)
@ -107,11 +107,11 @@ uninstall:
@echo "Note: Only the executable file has been deleted." @echo "Note: Only the executable file has been deleted."
@echo "If you need to delete all configurations (config.json, workspace, etc.), run 'make uninstall-all'" @echo "If you need to delete all configurations (config.json, workspace, etc.), run 'make uninstall-all'"
## uninstall-all: Remove picoclaw and all data ## uninstall-all: Remove clawdroid and all data
uninstall-all: uninstall-all:
@echo "Removing workspace and skills..." @echo "Removing workspace and skills..."
@rm -rf $(PICOCLAW_HOME) @rm -rf $(CLAWDROID_HOME)
@echo "Removed workspace: $(PICOCLAW_HOME)" @echo "Removed workspace: $(CLAWDROID_HOME)"
@echo "Complete uninstallation done!" @echo "Complete uninstallation done!"
## clean: Remove build artifacts ## clean: Remove build artifacts
@ -145,13 +145,13 @@ update-deps:
## check: Run vet, fmt, and verify dependencies ## check: Run vet, fmt, and verify dependencies
check: deps fmt vet test check: deps fmt vet test
## run: Build and run picoclaw ## run: Build and run clawdroid
run: build run: build
@$(BUILD_DIR)/$(BINARY_NAME) $(ARGS) @$(BUILD_DIR)/$(BINARY_NAME) $(ARGS)
## help: Show this help message ## help: Show this help message
help: help:
@echo "picoclaw Makefile" @echo "clawdroid Makefile"
@echo "" @echo ""
@echo "Usage:" @echo "Usage:"
@echo " make [target]" @echo " make [target]"
@ -167,7 +167,7 @@ help:
@echo "" @echo ""
@echo "Environment Variables:" @echo "Environment Variables:"
@echo " INSTALL_PREFIX # Installation prefix (default: ~/.local)" @echo " INSTALL_PREFIX # Installation prefix (default: ~/.local)"
@echo " WORKSPACE_DIR # Workspace directory (default: ~/.picoclaw/workspace)" @echo " WORKSPACE_DIR # Workspace directory (default: ~/.clawdroid/workspace)"
@echo " VERSION # Version string (default: git describe)" @echo " VERSION # Version string (default: git describe)"
@echo "" @echo ""
@echo "Current Configuration:" @echo "Current Configuration:"

View file

@ -1,7 +1,7 @@
<div align="center"> <div align="center">
<img src="assets/logo.jpg" alt="PicoClaw" width="512"> <img src="assets/logo.jpg" alt="ClawDroid" width="512">
<h1>PicoClaw: Go で書かれた超効率 AI アシスタント</h1> <h1>ClawDroid: Go で書かれた超効率 AI アシスタント</h1>
<h3>$10 ハードウェア · 10MB RAM · 1秒起動 · 皮皮虾,我们走!</h3> <h3>$10 ハードウェア · 10MB RAM · 1秒起動 · 皮皮虾,我们走!</h3>
<h3></h3> <h3></h3>
@ -19,7 +19,7 @@
--- ---
🦐 PicoClaw は [nanobot](https://github.com/HKUDS/nanobot) にインスパイアされた超軽量パーソナル AI アシスタントです。Go でゼロからリファクタリングされ、AI エージェント自身がアーキテクチャの移行とコード最適化を推進するセルフブートストラッピングプロセスで構築されました。 🦐 ClawDroid は [nanobot](https://github.com/HKUDS/nanobot) にインスパイアされた超軽量パーソナル AI アシスタントです。Go でゼロからリファクタリングされ、AI エージェント自身がアーキテクチャの移行とコード最適化を推進するセルフブートストラッピングプロセスで構築されました。
⚡️ $10 のハードウェアで 10MB 未満の RAM で動作OpenClaw より 99% 少ないメモリ、Mac mini より 98% 安い! ⚡️ $10 のハードウェアで 10MB 未満の RAM で動作OpenClaw より 99% 少ないメモリ、Mac mini より 98% 安い!
@ -27,7 +27,7 @@
<tr align="center"> <tr align="center">
<td align="center" valign="top"> <td align="center" valign="top">
<p align="center"> <p align="center">
<img src="assets/picoclaw_mem.gif" width="360" height="240"> <img src="assets/clawdroid_mem.gif" width="360" height="240">
</p> </p>
</td> </td>
<td align="center" valign="top"> <td align="center" valign="top">
@ -39,7 +39,7 @@
</table> </table>
## 📢 ニュース ## 📢 ニュース
2026-02-09 🎉 PicoClaw リリース!$10 ハードウェアで 10MB 未満の RAM で動く AI エージェントを 1 日で構築。🦐 皮皮虾,我们走! 2026-02-09 🎉 ClawDroid リリース!$10 ハードウェアで 10MB 未満の RAM で動く AI エージェントを 1 日で構築。🦐 皮皮虾,我们走!
## ✨ 特徴 ## ✨ 特徴
@ -53,13 +53,13 @@
🤖 **AI ブートストラップ**: 自律的な Go ネイティブ実装 — コアの 95% が AI 生成、人間によるレビュー付き。 🤖 **AI ブートストラップ**: 自律的な Go ネイティブ実装 — コアの 95% が AI 生成、人間によるレビュー付き。
| | OpenClaw | NanoBot | **PicoClaw** | | | OpenClaw | NanoBot | **ClawDroid** |
| --- | --- | --- |--- | | --- | --- | --- |--- |
| **言語** | TypeScript | Python | **Go** | | **言語** | TypeScript | Python | **Go** |
| **RAM** | >1GB |>100MB| **< 10MB** | | **RAM** | >1GB |>100MB| **< 10MB** |
| **起動時間**</br>(0.8GHz コア) | >500秒 | >30秒 | **<1秒** | | **起動時間**</br>(0.8GHz コア) | >500秒 | >30秒 | **<1秒** |
| **コスト** | Mac Mini 599$ | 大半の Linux SBC </br>~50$ |**あらゆる Linux ボード**</br>**最安 10$** | | **コスト** | Mac Mini 599$ | 大半の Linux SBC </br>~50$ |**あらゆる Linux ボード**</br>**最安 10$** |
<img src="assets/compare.jpg" alt="PicoClaw" width="512"> <img src="assets/compare.jpg" alt="ClawDroid" width="512">
## 🦾 デモンストレーション ## 🦾 デモンストレーション
@ -71,9 +71,9 @@
<th><p align="center">🔎 Web 検索&学習</p></th> <th><p align="center">🔎 Web 検索&学習</p></th>
</tr> </tr>
<tr> <tr>
<td align="center"><p align="center"><img src="assets/picoclaw_code.gif" width="240" height="180"></p></td> <td align="center"><p align="center"><img src="assets/clawdroid_code.gif" width="240" height="180"></p></td>
<td align="center"><p align="center"><img src="assets/picoclaw_memory.gif" width="240" height="180"></p></td> <td align="center"><p align="center"><img src="assets/clawdroid_memory.gif" width="240" height="180"></p></td>
<td align="center"><p align="center"><img src="assets/picoclaw_search.gif" width="240" height="180"></p></td> <td align="center"><p align="center"><img src="assets/clawdroid_search.gif" width="240" height="180"></p></td>
</tr> </tr>
<tr> <tr>
<td align="center">開発 · デプロイ · スケール</td> <td align="center">開発 · デプロイ · スケール</td>
@ -83,7 +83,7 @@
</table> </table>
### 🐜 革新的な省フットプリントデプロイ ### 🐜 革新的な省フットプリントデプロイ
PicoClaw はほぼすべての Linux デバイスにデプロイできます! ClawDroid はほぼすべての Linux デバイスにデプロイできます!
- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) E(Ethernet) または W(WiFi6) バージョン、最小ホームアシスタントに - $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) E(Ethernet) または W(WiFi6) バージョン、最小ホームアシスタントに
- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html) または $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) サーバー自動メンテナンスに - $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html) または $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) サーバー自動メンテナンスに
@ -97,14 +97,14 @@ https://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6
### コンパイル済みバイナリでインストール ### コンパイル済みバイナリでインストール
[リリースページ](https://github.com/sipeed/picoclaw/releases) からお使いのプラットフォーム用のファームウェアをダウンロードしてください。 [リリースページ](https://github.com/KarakuriAgent/clawdroid/releases) からお使いのプラットフォーム用のファームウェアをダウンロードしてください。
### ソースからインストール(最新機能、開発向け推奨) ### ソースからインストール(最新機能、開発向け推奨)
```bash ```bash
git clone https://github.com/sipeed/picoclaw.git git clone https://github.com/KarakuriAgent/clawdroid.git
cd picoclaw cd clawdroid
make deps make deps
# ビルド(インストール不要) # ビルド(インストール不要)
@ -119,12 +119,12 @@ make install
## 🐳 Docker Compose ## 🐳 Docker Compose
Docker Compose を使えば、ローカルにインストールせずに PicoClaw を実行できます。 Docker Compose を使えば、ローカルにインストールせずに ClawDroid を実行できます。
```bash ```bash
# 1. リポジトリをクローン # 1. リポジトリをクローン
git clone https://github.com/sipeed/picoclaw.git git clone https://github.com/KarakuriAgent/clawdroid.git
cd picoclaw cd clawdroid
# 2. API キーを設定 # 2. API キーを設定
cp config/config.example.json config/config.json cp config/config.example.json config/config.json
@ -134,7 +134,7 @@ vim config/config.json # DISCORD_BOT_TOKEN, プロバイダーの API キ
docker compose --profile gateway up -d docker compose --profile gateway up -d
# 4. ログ確認 # 4. ログ確認
docker compose logs -f picoclaw-gateway docker compose logs -f clawdroid-gateway
# 5. 停止 # 5. 停止
docker compose --profile gateway down docker compose --profile gateway down
@ -144,10 +144,10 @@ docker compose --profile gateway down
```bash ```bash
# 質問を投げる # 質問を投げる
docker compose run --rm picoclaw-agent -m "What is 2+2?" docker compose run --rm clawdroid-agent -m "What is 2+2?"
# インタラクティブモード # インタラクティブモード
docker compose run --rm picoclaw-agent docker compose run --rm clawdroid-agent
``` ```
### リビルド ### リビルド
@ -160,23 +160,23 @@ docker compose --profile gateway up -d
### 🚀 クイックスタート(ネイティブ) ### 🚀 クイックスタート(ネイティブ)
> [!TIP] > [!TIP]
> `~/.picoclaw/config.json` に API キーを設定してください。 > `~/.clawdroid/config.json` に API キーを設定してください。
> API キーの取得先: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM) > API キーの取得先: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)
> Web 検索は **任意** です - 無料の [Brave Search API](https://brave.com/search/api) (月 2000 クエリ無料) > Web 検索は **任意** です - 無料の [Brave Search API](https://brave.com/search/api) (月 2000 クエリ無料)
**1. 初期化** **1. 初期化**
```bash ```bash
picoclaw onboard clawdroid onboard
``` ```
**2. 設定** (`~/.picoclaw/config.json`) **2. 設定** (`~/.clawdroid/config.json`)
```json ```json
{ {
"agents": { "agents": {
"defaults": { "defaults": {
"workspace": "~/.picoclaw/workspace", "workspace": "~/.clawdroid/workspace",
"model": "glm-4.7", "model": "glm-4.7",
"max_tokens": 8192, "max_tokens": 8192,
"temperature": 0.7, "temperature": 0.7,
@ -214,7 +214,7 @@ picoclaw onboard
**3. チャット** **3. チャット**
```bash ```bash
picoclaw agent -m "What is 2+2?" clawdroid agent -m "What is 2+2?"
``` ```
これだけです2 分で AI アシスタントが動きます。 これだけです2 分で AI アシスタントが動きます。
@ -223,7 +223,7 @@ picoclaw agent -m "What is 2+2?"
## 💬 チャットアプリ ## 💬 チャットアプリ
Telegram、Discord、QQ、DingTalk、LINE で PicoClaw と会話できます Telegram、Discord、QQ、DingTalk、LINE で ClawDroid と会話できます
| チャネル | セットアップ | | チャネル | セットアップ |
|---------|------------| |---------|------------|
@ -261,7 +261,7 @@ Telegram、Discord、QQ、DingTalk、LINE で PicoClaw と会話できます
**3. 起動** **3. 起動**
```bash ```bash
picoclaw gateway clawdroid gateway
``` ```
</details> </details>
@ -305,7 +305,7 @@ picoclaw gateway
**6. 起動** **6. 起動**
```bash ```bash
picoclaw gateway clawdroid gateway
``` ```
</details> </details>
@ -338,7 +338,7 @@ picoclaw gateway
**3. 起動** **3. 起動**
```bash ```bash
picoclaw gateway clawdroid gateway
``` ```
</details> </details>
@ -372,7 +372,7 @@ picoclaw gateway
**3. 起動** **3. 起動**
```bash ```bash
picoclaw gateway clawdroid gateway
``` ```
</details> </details>
@ -418,25 +418,25 @@ LINE Developers Console で Webhook URL を `https://あなたのドメイン/we
**4. 起動** **4. 起動**
```bash ```bash
picoclaw gateway clawdroid gateway
``` ```
> グループチャットでは @メンション時のみ応答します。返信は元メッセージを引用する形式です。 > グループチャットでは @メンション時のみ応答します。返信は元メッセージを引用する形式です。
> **Docker Compose**: `picoclaw-gateway` サービスに `ports: ["18791:18791"]` を追加して Webhook ポートを公開してください。 > **Docker Compose**: `clawdroid-gateway` サービスに `ports: ["18791:18791"]` を追加して Webhook ポートを公開してください。
</details> </details>
## ⚙️ 設定 ## ⚙️ 設定
設定ファイル: `~/.picoclaw/config.json` 設定ファイル: `~/.clawdroid/config.json`
### ワークスペース構成 ### ワークスペース構成
PicoClaw は設定されたワークスペース(デフォルト: `~/.picoclaw/workspace`)にデータを保存します: ClawDroid は設定されたワークスペース(デフォルト: `~/.clawdroid/workspace`)にデータを保存します:
``` ```
~/.picoclaw/workspace/ ~/.clawdroid/workspace/
├── sessions/ # 会話セッションと履歴 ├── sessions/ # 会話セッションと履歴
├── memory/ # 長期メモリMEMORY.md ├── memory/ # 長期メモリMEMORY.md
├── state/ # 永続状態(最後のチャネルなど) ├── state/ # 永続状態(最後のチャネルなど)
@ -452,7 +452,7 @@ PicoClaw は設定されたワークスペース(デフォルト: `~/.picoclaw
### 🔒 セキュリティサンドボックス ### 🔒 セキュリティサンドボックス
PicoClaw はデフォルトでサンドボックス環境で実行されます。エージェントは設定されたワークスペース内のファイルにのみアクセスし、コマンドを実行できます。 ClawDroid はデフォルトでサンドボックス環境で実行されます。エージェントは設定されたワークスペース内のファイルにのみアクセスし、コマンドを実行できます。
#### デフォルト設定 #### デフォルト設定
@ -460,7 +460,7 @@ PicoClaw はデフォルトでサンドボックス環境で実行されます
{ {
"agents": { "agents": {
"defaults": { "defaults": {
"workspace": "~/.picoclaw/workspace", "workspace": "~/.clawdroid/workspace",
"restrict_to_workspace": true "restrict_to_workspace": true
} }
} }
@ -469,7 +469,7 @@ PicoClaw はデフォルトでサンドボックス環境で実行されます
| オプション | デフォルト | 説明 | | オプション | デフォルト | 説明 |
|-----------|-----------|------| |-----------|-----------|------|
| `workspace` | `~/.picoclaw/workspace` | エージェントの作業ディレクトリ | | `workspace` | `~/.clawdroid/workspace` | エージェントの作業ディレクトリ |
| `restrict_to_workspace` | `true` | ファイル/コマンドアクセスをワークスペースに制限 | | `restrict_to_workspace` | `true` | ファイル/コマンドアクセスをワークスペースに制限 |
#### 保護対象ツール #### 保護対象ツール
@ -525,7 +525,7 @@ PicoClaw はデフォルトでサンドボックス環境で実行されます
**方法2: 環境変数** **方法2: 環境変数**
```bash ```bash
export PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false export CLAWDROID_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false
``` ```
> ⚠️ **警告**: この制限を無効にすると、エージェントはシステム上の任意のパスにアクセスできるようになります。制御された環境でのみ慎重に使用してください。 > ⚠️ **警告**: この制限を無効にすると、エージェントはシステム上の任意のパスにアクセスできるようになります。制御された環境でのみ慎重に使用してください。
@ -544,7 +544,7 @@ export PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false
### ハートビート(定期タスク) ### ハートビート(定期タスク)
PicoClaw は自動的に定期タスクを実行できます。ワークスペースに `HEARTBEAT.md` ファイルを作成します: ClawDroid は自動的に定期タスクを実行できます。ワークスペースに `HEARTBEAT.md` ファイルを作成します:
```markdown ```markdown
# 定期タスク # 定期タスク
@ -615,8 +615,8 @@ HEARTBEAT_OK 応答 ユーザーが直接結果を受け取る
| `interval` | `30` | チェック間隔、最小5分 | | `interval` | `30` | チェック間隔、最小5分 |
**環境変数:** **環境変数:**
- `PICOCLAW_HEARTBEAT_ENABLED=false` で無効化 - `CLAWDROID_HEARTBEAT_ENABLED=false` で無効化
- `PICOCLAW_HEARTBEAT_INTERVAL=60` で間隔変更 - `CLAWDROID_HEARTBEAT_INTERVAL=60` で間隔変更
### 基本設定 ### 基本設定
@ -647,7 +647,7 @@ HEARTBEAT_OK 応答 ユーザーが直接結果を受け取る
3. **実行** 3. **実行**
```bash ```bash
picoclaw agent -m "Hello" clawdroid agent -m "Hello"
``` ```
</details> </details>
@ -712,11 +712,11 @@ HEARTBEAT_OK 応答 ユーザーが直接結果を受け取る
| コマンド | 説明 | | コマンド | 説明 |
|---------|------| |---------|------|
| `picoclaw onboard` | 設定&ワークスペースの初期化 | | `clawdroid onboard` | 設定&ワークスペースの初期化 |
| `picoclaw agent -m "..."` | エージェントとチャット | | `clawdroid agent -m "..."` | エージェントとチャット |
| `picoclaw agent` | インタラクティブチャットモード | | `clawdroid agent` | インタラクティブチャットモード |
| `picoclaw gateway` | ゲートウェイを起動 | | `clawdroid gateway` | ゲートウェイを起動 |
| `picoclaw status` | ステータスを表示 | | `clawdroid status` | ステータスを表示 |
## 🤝 コントリビュート&ロードマップ ## 🤝 コントリビュート&ロードマップ
@ -724,18 +724,18 @@ PR 歓迎!コードベースは意図的に小さく読みやすくしてい
Discord: https://discord.gg/V4sAZ9XWpN Discord: https://discord.gg/V4sAZ9XWpN
<img src="assets/wechat.png" alt="PicoClaw" width="512"> <img src="assets/wechat.png" alt="ClawDroid" width="512">
## 🐛 トラブルシューティング ## 🐛 トラブルシューティング
### Web 検索で「API 配置问题」と表示される ### Web 検索で「API 配置问题」と表示される
検索 API キーをまだ設定していない場合、これは正常です。PicoClaw は手動検索用の便利なリンクを提供します。 検索 API キーをまだ設定していない場合、これは正常です。ClawDroid は手動検索用の便利なリンクを提供します。
Web 検索を有効にするには: Web 検索を有効にするには:
1. [https://brave.com/search/api](https://brave.com/search/api) で無料の API キーを取得(月 2000 クエリ無料) 1. [https://brave.com/search/api](https://brave.com/search/api) で無料の API キーを取得(月 2000 クエリ無料)
2. `~/.picoclaw/config.json` に追加: 2. `~/.clawdroid/config.json` に追加:
```json ```json
{ {
"tools": { "tools": {
@ -755,7 +755,7 @@ Web 検索を有効にするには:
### Telegram Bot で「Conflict: terminated by other getUpdates」と表示される ### Telegram Bot で「Conflict: terminated by other getUpdates」と表示される
別のインスタンスが実行中の場合に発生します。`picoclaw gateway` が 1 つだけ実行されていることを確認してください。 別のインスタンスが実行中の場合に発生します。`clawdroid gateway` が 1 つだけ実行されていることを確認してください。
--- ---

130
README.md
View file

@ -1,7 +1,7 @@
<div align="center"> <div align="center">
<img src="assets/logo.jpg" alt="PicoClaw" width="512"> <img src="assets/logo.jpg" alt="ClawDroid" width="512">
<h1>PicoClaw: Ultra-Efficient AI Assistant in Go</h1> <h1>ClawDroid: Ultra-Efficient AI Assistant in Go</h1>
<h3>$10 Hardware · 10MB RAM · 1s Boot · 皮皮虾,我们走!</h3> <h3>$10 Hardware · 10MB RAM · 1s Boot · 皮皮虾,我们走!</h3>
@ -10,7 +10,7 @@
<img src="https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20RISC--V-blue" alt="Hardware"> <img src="https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20RISC--V-blue" alt="Hardware">
<img src="https://img.shields.io/badge/license-MIT-green" alt="License"> <img src="https://img.shields.io/badge/license-MIT-green" alt="License">
<br> <br>
<a href="https://picoclaw.io"><img src="https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white" alt="Website"></a> <a href="https://clawdroid.io"><img src="https://img.shields.io/badge/Website-clawdroid.io-blue?style=flat&logo=google-chrome&logoColor=white" alt="Website"></a>
<a href="https://x.com/SipeedIO"><img src="https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white" alt="Twitter"></a> <a href="https://x.com/SipeedIO"><img src="https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white" alt="Twitter"></a>
</p> </p>
@ -19,7 +19,7 @@
--- ---
🦐 PicoClaw is an ultra-lightweight personal AI Assistant inspired by [nanobot](https://github.com/HKUDS/nanobot), refactored from the ground up in Go through a self-bootstrapping process, where the AI agent itself drove the entire architectural migration and code optimization. 🦐 ClawDroid is an ultra-lightweight personal AI Assistant inspired by [nanobot](https://github.com/HKUDS/nanobot), refactored from the ground up in Go through a self-bootstrapping process, where the AI agent itself drove the entire architectural migration and code optimization.
⚡️ Runs on $10 hardware with <10MB RAM: That's 99% less memory than OpenClaw and 98% cheaper than a Mac mini! ⚡️ Runs on $10 hardware with <10MB RAM: That's 99% less memory than OpenClaw and 98% cheaper than a Mac mini!
@ -27,7 +27,7 @@
<tr align="center"> <tr align="center">
<td align="center" valign="top"> <td align="center" valign="top">
<p align="center"> <p align="center">
<img src="assets/picoclaw_mem.gif" width="360" height="240"> <img src="assets/clawdroid_mem.gif" width="360" height="240">
</p> </p>
</td> </td>
<td align="center" valign="top"> <td align="center" valign="top">
@ -41,20 +41,20 @@
> [!CAUTION] > [!CAUTION]
> **🚨 SECURITY & OFFICIAL CHANNELS / 安全声明** > **🚨 SECURITY & OFFICIAL CHANNELS / 安全声明**
> >
> * **NO CRYPTO:** PicoClaw has **NO** official token/coin. All claims on `pump.fun` or other trading platforms are **SCAMS**. > * **NO CRYPTO:** ClawDroid has **NO** official token/coin. All claims on `pump.fun` or other trading platforms are **SCAMS**.
> * **OFFICIAL DOMAIN:** The **ONLY** official website is **[picoclaw.io](https://picoclaw.io)**, and company website is **[sipeed.com](https://sipeed.com)** > * **OFFICIAL DOMAIN:** The **ONLY** official website is **[clawdroid.io](https://clawdroid.io)**, and company website is **[sipeed.com](https://sipeed.com)**
> * **Warning:** Many `.ai/.org/.com/.net/...` domains are registered by third parties. > * **Warning:** Many `.ai/.org/.com/.net/...` domains are registered by third parties.
> * **Warning:** picoclaw is in early development now and may have unresolved network security issues. Do not deploy to production environments before the v1.0 release. > * **Warning:** clawdroid is in early development now and may have unresolved network security issues. Do not deploy to production environments before the v1.0 release.
> * **Note:** picoclaw has recently merged a lot of PRs, which may result in a larger memory footprint (1020MB) in the latest versions. We plan to prioritize resource optimization as soon as the current feature set reaches a stable state. > * **Note:** clawdroid has recently merged a lot of PRs, which may result in a larger memory footprint (1020MB) in the latest versions. We plan to prioritize resource optimization as soon as the current feature set reaches a stable state.
## 📢 News ## 📢 News
2026-02-16 🎉 PicoClaw hit 12K stars in one week! Thank you all for your support! PicoClaw is growing faster than we ever imagined. Given the high volume of PRs, we urgently need community maintainers. Our volunteer roles and roadmap are officially posted [here](doc/picoclaw_community_roadmap_260216.md) —we cant wait to have you on board! 2026-02-16 🎉 ClawDroid hit 12K stars in one week! Thank you all for your support! ClawDroid is growing faster than we ever imagined. Given the high volume of PRs, we urgently need community maintainers. Our volunteer roles and roadmap are officially posted [here](doc/clawdroid_community_roadmap_260216.md) —we cant wait to have you on board!
2026-02-13 🎉 PicoClaw hit 5000 stars in 4days! Thank you for the community! There are so many PRs&issues come in (during Chinese New Year holidays), we are finalizing the Project Roadmap and setting up the Developer Group to accelerate PicoClaw's development. 2026-02-13 🎉 ClawDroid hit 5000 stars in 4days! Thank you for the community! There are so many PRs&issues come in (during Chinese New Year holidays), we are finalizing the Project Roadmap and setting up the Developer Group to accelerate ClawDroid's development.
🚀 Call to Action: Please submit your feature requests in GitHub Discussions. We will review and prioritize them during our upcoming weekly meeting. 🚀 Call to Action: Please submit your feature requests in GitHub Discussions. We will review and prioritize them during our upcoming weekly meeting.
2026-02-09 🎉 PicoClaw Launched! Built in 1 day to bring AI Agents to $10 hardware with <10MB RAM. 🦐 PicoClawLet's Go 2026-02-09 🎉 ClawDroid Launched! Built in 1 day to bring AI Agents to $10 hardware with <10MB RAM. 🦐 ClawDroidLet's Go
## ✨ Features ## ✨ Features
@ -68,14 +68,14 @@
🤖 **AI-Bootstrapped**: Autonomous Go-native implementation — 95% Agent-generated core with human-in-the-loop refinement. 🤖 **AI-Bootstrapped**: Autonomous Go-native implementation — 95% Agent-generated core with human-in-the-loop refinement.
| | OpenClaw | NanoBot | **PicoClaw** | | | OpenClaw | NanoBot | **ClawDroid** |
| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- | | ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |
| **Language** | TypeScript | Python | **Go** | | **Language** | TypeScript | Python | **Go** |
| **RAM** | >1GB | >100MB | **< 10MB** | | **RAM** | >1GB | >100MB | **< 10MB** |
| **Startup**</br>(0.8GHz core) | >500s | >30s | **<1s** | | **Startup**</br>(0.8GHz core) | >500s | >30s | **<1s** |
| **Cost** | Mac Mini 599$ | Most Linux SBC </br>~50$ | **Any Linux Board**</br>**As low as 10$** | | **Cost** | Mac Mini 599$ | Most Linux SBC </br>~50$ | **Any Linux Board**</br>**As low as 10$** |
<img src="assets/compare.jpg" alt="PicoClaw" width="512"> <img src="assets/compare.jpg" alt="ClawDroid" width="512">
## 🦾 Demonstration ## 🦾 Demonstration
@ -88,9 +88,9 @@
<th><p align="center">🔎 Web Search & Learning</p></th> <th><p align="center">🔎 Web Search & Learning</p></th>
</tr> </tr>
<tr> <tr>
<td align="center"><p align="center"><img src="assets/picoclaw_code.gif" width="240" height="180"></p></td> <td align="center"><p align="center"><img src="assets/clawdroid_code.gif" width="240" height="180"></p></td>
<td align="center"><p align="center"><img src="assets/picoclaw_memory.gif" width="240" height="180"></p></td> <td align="center"><p align="center"><img src="assets/clawdroid_memory.gif" width="240" height="180"></p></td>
<td align="center"><p align="center"><img src="assets/picoclaw_search.gif" width="240" height="180"></p></td> <td align="center"><p align="center"><img src="assets/clawdroid_search.gif" width="240" height="180"></p></td>
</tr> </tr>
<tr> <tr>
<td align="center">Develop • Deploy • Scale</td> <td align="center">Develop • Deploy • Scale</td>
@ -101,7 +101,7 @@
### 🐜 Innovative Low-Footprint Deploy ### 🐜 Innovative Low-Footprint Deploy
PicoClaw can be deployed on almost any Linux device! ClawDroid can be deployed on almost any Linux device!
- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) E(Ethernet) or W(WiFi6) version, for Minimal Home Assistant - $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) E(Ethernet) or W(WiFi6) version, for Minimal Home Assistant
- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), or $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) for Automated Server Maintenance - $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), or $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) for Automated Server Maintenance
@ -115,14 +115,14 @@ PicoClaw can be deployed on almost any Linux device!
### Install with precompiled binary ### Install with precompiled binary
Download the firmware for your platform from the [release](https://github.com/sipeed/picoclaw/releases) page. Download the firmware for your platform from the [release](https://github.com/KarakuriAgent/clawdroid/releases) page.
### Install from source (latest features, recommended for development) ### Install from source (latest features, recommended for development)
```bash ```bash
git clone https://github.com/sipeed/picoclaw.git git clone https://github.com/KarakuriAgent/clawdroid.git
cd picoclaw cd clawdroid
make deps make deps
# Build, no need to install # Build, no need to install
@ -137,12 +137,12 @@ make install
## 🐳 Docker Compose ## 🐳 Docker Compose
You can also run PicoClaw using Docker Compose without installing anything locally. You can also run ClawDroid using Docker Compose without installing anything locally.
```bash ```bash
# 1. Clone this repo # 1. Clone this repo
git clone https://github.com/sipeed/picoclaw.git git clone https://github.com/KarakuriAgent/clawdroid.git
cd picoclaw cd clawdroid
# 2. Set your API keys # 2. Set your API keys
cp config/config.example.json config/config.json cp config/config.example.json config/config.json
@ -152,7 +152,7 @@ vim config/config.json # Set DISCORD_BOT_TOKEN, API keys, etc.
docker compose --profile gateway up -d docker compose --profile gateway up -d
# 4. Check logs # 4. Check logs
docker compose logs -f picoclaw-gateway docker compose logs -f clawdroid-gateway
# 5. Stop # 5. Stop
docker compose --profile gateway down docker compose --profile gateway down
@ -162,10 +162,10 @@ docker compose --profile gateway down
```bash ```bash
# Ask a question # Ask a question
docker compose run --rm picoclaw-agent -m "What is 2+2?" docker compose run --rm clawdroid-agent -m "What is 2+2?"
# Interactive mode # Interactive mode
docker compose run --rm picoclaw-agent docker compose run --rm clawdroid-agent
``` ```
### Rebuild ### Rebuild
@ -178,23 +178,23 @@ docker compose --profile gateway up -d
### 🚀 Quick Start ### 🚀 Quick Start
> [!TIP] > [!TIP]
> Set your API key in `~/.picoclaw/config.json`. > Set your API key in `~/.clawdroid/config.json`.
> Get API keys: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM) > Get API keys: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)
> Web search is **optional** - get free [Brave Search API](https://brave.com/search/api) (2000 free queries/month) or use built-in auto fallback. > Web search is **optional** - get free [Brave Search API](https://brave.com/search/api) (2000 free queries/month) or use built-in auto fallback.
**1. Initialize** **1. Initialize**
```bash ```bash
picoclaw onboard clawdroid onboard
``` ```
**2. Configure** (`~/.picoclaw/config.json`) **2. Configure** (`~/.clawdroid/config.json`)
```json ```json
{ {
"agents": { "agents": {
"defaults": { "defaults": {
"workspace": "~/.picoclaw/workspace", "workspace": "~/.clawdroid/workspace",
"model": "glm-4.7", "model": "glm-4.7",
"max_tokens": 8192, "max_tokens": 8192,
"temperature": 0.7, "temperature": 0.7,
@ -233,7 +233,7 @@ picoclaw onboard
**4. Chat** **4. Chat**
```bash ```bash
picoclaw agent -m "What is 2+2?" clawdroid agent -m "What is 2+2?"
``` ```
That's it! You have a working AI assistant in 2 minutes. That's it! You have a working AI assistant in 2 minutes.
@ -242,7 +242,7 @@ That's it! You have a working AI assistant in 2 minutes.
## 💬 Chat Apps ## 💬 Chat Apps
Talk to your picoclaw through Telegram, Discord, DingTalk, or LINE Talk to your clawdroid through Telegram, Discord, DingTalk, or LINE
| Channel | Setup | | Channel | Setup |
| ------------ | ---------------------------------- | | ------------ | ---------------------------------- |
@ -280,7 +280,7 @@ Talk to your picoclaw through Telegram, Discord, DingTalk, or LINE
**3. Run** **3. Run**
```bash ```bash
picoclaw gateway clawdroid gateway
``` ```
</details> </details>
@ -328,7 +328,7 @@ picoclaw gateway
**6. Run** **6. Run**
```bash ```bash
picoclaw gateway clawdroid gateway
``` ```
</details> </details>
@ -361,7 +361,7 @@ picoclaw gateway
**3. Run** **3. Run**
```bash ```bash
picoclaw gateway clawdroid gateway
``` ```
</details> </details>
@ -395,7 +395,7 @@ picoclaw gateway
**3. Run** **3. Run**
```bash ```bash
picoclaw gateway clawdroid gateway
``` ```
</details> </details>
@ -441,31 +441,31 @@ Then set the Webhook URL in LINE Developers Console to `https://your-domain/webh
**4. Run** **4. Run**
```bash ```bash
picoclaw gateway clawdroid gateway
``` ```
> In group chats, the bot responds only when @mentioned. Replies quote the original message. > In group chats, the bot responds only when @mentioned. Replies quote the original message.
> **Docker Compose**: Add `ports: ["18791:18791"]` to the `picoclaw-gateway` service to expose the webhook port. > **Docker Compose**: Add `ports: ["18791:18791"]` to the `clawdroid-gateway` service to expose the webhook port.
</details> </details>
## <img src="assets/clawdchat-icon.png" width="24" height="24" alt="ClawdChat"> Join the Agent Social Network ## <img src="assets/clawdchat-icon.png" width="24" height="24" alt="ClawdChat"> Join the Agent Social Network
Connect Picoclaw to the Agent Social Network simply by sending a single message via the CLI or any integrated Chat App. Connect Clawdroid to the Agent Social Network simply by sending a single message via the CLI or any integrated Chat App.
**Read `https://clawdchat.ai/skill.md` and follow the instructions to join [ClawdChat.ai](https://clawdchat.ai)** **Read `https://clawdchat.ai/skill.md` and follow the instructions to join [ClawdChat.ai](https://clawdchat.ai)**
## ⚙️ Configuration ## ⚙️ Configuration
Config file: `~/.picoclaw/config.json` Config file: `~/.clawdroid/config.json`
### Workspace Layout ### Workspace Layout
PicoClaw stores data in your configured workspace (default: `~/.picoclaw/workspace`): ClawDroid stores data in your configured workspace (default: `~/.clawdroid/workspace`):
``` ```
~/.picoclaw/workspace/ ~/.clawdroid/workspace/
├── sessions/ # Conversation sessions and history ├── sessions/ # Conversation sessions and history
├── memory/ # Long-term memory (MEMORY.md) ├── memory/ # Long-term memory (MEMORY.md)
├── state/ # Persistent state (last channel, etc.) ├── state/ # Persistent state (last channel, etc.)
@ -481,7 +481,7 @@ PicoClaw stores data in your configured workspace (default: `~/.picoclaw/workspa
### 🔒 Security Sandbox ### 🔒 Security Sandbox
PicoClaw runs in a sandboxed environment by default. The agent can only access files and execute commands within the configured workspace. ClawDroid runs in a sandboxed environment by default. The agent can only access files and execute commands within the configured workspace.
#### Default Configuration #### Default Configuration
@ -489,7 +489,7 @@ PicoClaw runs in a sandboxed environment by default. The agent can only access f
{ {
"agents": { "agents": {
"defaults": { "defaults": {
"workspace": "~/.picoclaw/workspace", "workspace": "~/.clawdroid/workspace",
"restrict_to_workspace": true "restrict_to_workspace": true
} }
} }
@ -498,7 +498,7 @@ PicoClaw runs in a sandboxed environment by default. The agent can only access f
| Option | Default | Description | | Option | Default | Description |
|--------|---------|-------------| |--------|---------|-------------|
| `workspace` | `~/.picoclaw/workspace` | Working directory for the agent | | `workspace` | `~/.clawdroid/workspace` | Working directory for the agent |
| `restrict_to_workspace` | `true` | Restrict file/command access to workspace | | `restrict_to_workspace` | `true` | Restrict file/command access to workspace |
#### Protected Tools #### Protected Tools
@ -556,7 +556,7 @@ If you need the agent to access paths outside the workspace:
**Method 2: Environment variable** **Method 2: Environment variable**
```bash ```bash
export PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false export CLAWDROID_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false
``` ```
> ⚠️ **Warning**: Disabling this restriction allows the agent to access any path on your system. Use with caution in controlled environments only. > ⚠️ **Warning**: Disabling this restriction allows the agent to access any path on your system. Use with caution in controlled environments only.
@ -575,7 +575,7 @@ All paths share the same workspace restriction — there's no way to bypass the
### Heartbeat (Periodic Tasks) ### Heartbeat (Periodic Tasks)
PicoClaw can perform periodic tasks automatically. Create a `HEARTBEAT.md` file in your workspace: ClawDroid can perform periodic tasks automatically. Create a `HEARTBEAT.md` file in your workspace:
```markdown ```markdown
# Periodic Tasks # Periodic Tasks
@ -647,8 +647,8 @@ The subagent has access to tools (message, web_search, etc.) and can communicate
**Environment variables:** **Environment variables:**
* `PICOCLAW_HEARTBEAT_ENABLED=false` to disable * `CLAWDROID_HEARTBEAT_ENABLED=false` to disable
* `PICOCLAW_HEARTBEAT_INTERVAL=60` to change interval * `CLAWDROID_HEARTBEAT_INTERVAL=60` to change interval
### Providers ### Providers
@ -678,7 +678,7 @@ The subagent has access to tools (message, web_search, etc.) and can communicate
{ {
"agents": { "agents": {
"defaults": { "defaults": {
"workspace": "~/.picoclaw/workspace", "workspace": "~/.clawdroid/workspace",
"model": "glm-4.7", "model": "glm-4.7",
"max_tokens": 8192, "max_tokens": 8192,
"temperature": 0.7, "temperature": 0.7,
@ -697,7 +697,7 @@ The subagent has access to tools (message, web_search, etc.) and can communicate
**3. Run** **3. Run**
```bash ```bash
picoclaw agent -m "Hello" clawdroid agent -m "Hello"
``` ```
</details> </details>
@ -775,23 +775,23 @@ picoclaw agent -m "Hello"
| Command | Description | | Command | Description |
| ------------------------- | ----------------------------- | | ------------------------- | ----------------------------- |
| `picoclaw onboard` | Initialize config & workspace | | `clawdroid onboard` | Initialize config & workspace |
| `picoclaw agent -m "..."` | Chat with the agent | | `clawdroid agent -m "..."` | Chat with the agent |
| `picoclaw agent` | Interactive chat mode | | `clawdroid agent` | Interactive chat mode |
| `picoclaw gateway` | Start the gateway | | `clawdroid gateway` | Start the gateway |
| `picoclaw status` | Show status | | `clawdroid status` | Show status |
| `picoclaw cron list` | List all scheduled jobs | | `clawdroid cron list` | List all scheduled jobs |
| `picoclaw cron add ...` | Add a scheduled job | | `clawdroid cron add ...` | Add a scheduled job |
### Scheduled Tasks / Reminders ### Scheduled Tasks / Reminders
PicoClaw supports scheduled reminders and recurring tasks through the `cron` tool: ClawDroid supports scheduled reminders and recurring tasks through the `cron` tool:
* **One-time reminders**: "Remind me in 10 minutes" → triggers once after 10min * **One-time reminders**: "Remind me in 10 minutes" → triggers once after 10min
* **Recurring tasks**: "Remind me every 2 hours" → triggers every 2 hours * **Recurring tasks**: "Remind me every 2 hours" → triggers every 2 hours
* **Cron expressions**: "Remind me at 9am daily" → uses cron expression * **Cron expressions**: "Remind me at 9am daily" → uses cron expression
Jobs are stored in `~/.picoclaw/workspace/cron/` and processed automatically. Jobs are stored in `~/.clawdroid/workspace/cron/` and processed automatically.
## 🤝 Contribute & Roadmap ## 🤝 Contribute & Roadmap
@ -805,20 +805,20 @@ User Groups:
discord: <https://discord.gg/V4sAZ9XWpN> discord: <https://discord.gg/V4sAZ9XWpN>
<img src="assets/wechat.png" alt="PicoClaw" width="512"> <img src="assets/wechat.png" alt="ClawDroid" width="512">
## 🐛 Troubleshooting ## 🐛 Troubleshooting
### Web search says "API 配置问题" ### Web search says "API 配置问题"
This is normal if you haven't configured a search API key yet. PicoClaw will provide helpful links for manual searching. This is normal if you haven't configured a search API key yet. ClawDroid will provide helpful links for manual searching.
To enable web search: To enable web search:
1. **Option 1 (Recommended)**: Get a free API key at [https://brave.com/search/api](https://brave.com/search/api) (2000 free queries/month) for the best results. 1. **Option 1 (Recommended)**: Get a free API key at [https://brave.com/search/api](https://brave.com/search/api) (2000 free queries/month) for the best results.
2. **Option 2 (No Credit Card)**: If you don't have a key, we automatically fall back to **DuckDuckGo** (no key required). 2. **Option 2 (No Credit Card)**: If you don't have a key, we automatically fall back to **DuckDuckGo** (no key required).
Add the key to `~/.picoclaw/config.json` if using Brave: Add the key to `~/.clawdroid/config.json` if using Brave:
```json ```json
{ {
@ -844,7 +844,7 @@ Some providers (like Zhipu) have content filtering. Try rephrasing your query or
### Telegram bot says "Conflict: terminated by other getUpdates" ### Telegram bot says "Conflict: terminated by other getUpdates"
This happens when another instance of the bot is running. Make sure only one `picoclaw gateway` is running at a time. This happens when another instance of the bot is running. Make sure only one `clawdroid gateway` is running at a time.
--- ---

View file

@ -1,7 +1,7 @@
<div align="center"> <div align="center">
<img src="assets/logo.jpg" alt="PicoClaw" width="512"> <img src="assets/logo.jpg" alt="ClawDroid" width="512">
<h1>PicoClaw: 基于Go语言的超高效 AI 助手</h1> <h1>ClawDroid: 基于Go语言的超高效 AI 助手</h1>
<h3>10$硬件 · 10MB内存 · 1秒启动 · 皮皮虾,我们走!</h3> <h3>10$硬件 · 10MB内存 · 1秒启动 · 皮皮虾,我们走!</h3>
@ -10,7 +10,7 @@
<img src="https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20RISC--V-blue" alt="Hardware"> <img src="https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20RISC--V-blue" alt="Hardware">
<img src="https://img.shields.io/badge/license-MIT-green" alt="License"> <img src="https://img.shields.io/badge/license-MIT-green" alt="License">
<br> <br>
<a href="https://picoclaw.io"><img src="https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white" alt="Website"></a> <a href="https://clawdroid.io"><img src="https://img.shields.io/badge/Website-clawdroid.io-blue?style=flat&logo=google-chrome&logoColor=white" alt="Website"></a>
<a href="https://x.com/SipeedIO"><img src="https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white" alt="Twitter"></a> <a href="https://x.com/SipeedIO"><img src="https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white" alt="Twitter"></a>
</p> </p>
@ -19,7 +19,7 @@
--- ---
🦐 **PicoClaw** 是一个受 [nanobot](https://github.com/HKUDS/nanobot) 启发的超轻量级个人 AI 助手。它采用 **Go 语言** 从零重构,经历了一个“自举”过程——即由 AI Agent 自身驱动了整个架构迁移和代码优化。 🦐 **ClawDroid** 是一个受 [nanobot](https://github.com/HKUDS/nanobot) 启发的超轻量级个人 AI 助手。它采用 **Go 语言** 从零重构,经历了一个“自举”过程——即由 AI Agent 自身驱动了整个架构迁移和代码优化。
⚡️ **极致轻量**:可在 **10 美元** 的硬件上运行,内存占用 **<10MB**。这意味着比 OpenClaw 节省 99% 的内存 Mac mini 便宜 98% ⚡️ **极致轻量**:可在 **10 美元** 的硬件上运行,内存占用 **<10MB**。这意味着比 OpenClaw 节省 99% 的内存 Mac mini 便宜 98%
@ -27,7 +27,7 @@
<tr align="center"> <tr align="center">
<td align="center" valign="top"> <td align="center" valign="top">
<p align="center"> <p align="center">
<img src="assets/picoclaw_mem.gif" width="360" height="240"> <img src="assets/clawdroid_mem.gif" width="360" height="240">
</p> </p>
</td> </td>
<td align="center" valign="top"> <td align="center" valign="top">
@ -42,20 +42,20 @@
> [!CAUTION] > [!CAUTION]
> **🚨 SECURITY & OFFICIAL CHANNELS / 安全声明** > **🚨 SECURITY & OFFICIAL CHANNELS / 安全声明**
> * **无加密货币 (NO CRYPTO):** PicoClaw **没有** 发行任何官方代币、Token 或虚拟货币。所有在 `pump.fun` 或其他交易平台上的相关声称均为 **诈骗** > * **无加密货币 (NO CRYPTO):** ClawDroid **没有** 发行任何官方代币、Token 或虚拟货币。所有在 `pump.fun` 或其他交易平台上的相关声称均为 **诈骗**
> * **官方域名:** 唯一的官方网站是 **[picoclaw.io](https://picoclaw.io)**,公司官网是 **[sipeed.com](https://sipeed.com)**。 > * **官方域名:** 唯一的官方网站是 **[clawdroid.io](https://clawdroid.io)**,公司官网是 **[sipeed.com](https://sipeed.com)**。
> * **警惕:** 许多 `.ai/.org/.com/.net/...` 后缀的域名被第三方抢注,请勿轻信。 > * **警惕:** 许多 `.ai/.org/.com/.net/...` 后缀的域名被第三方抢注,请勿轻信。
> * **注意:** picoclaw正在初期的快速功能开发阶段可能有尚未修复的网络安全问题在1.0正式版发布前,请不要将其部署到生产环境中 > * **注意:** clawdroid正在初期的快速功能开发阶段可能有尚未修复的网络安全问题在1.0正式版发布前,请不要将其部署到生产环境中
> * **注意:** picoclaw最近合并了大量PRs近期版本可能内存占用较大(10~20MB),我们将在功能较为收敛后进行资源占用优化. > * **注意:** clawdroid最近合并了大量PRs近期版本可能内存占用较大(10~20MB),我们将在功能较为收敛后进行资源占用优化.
## 📢 新闻 (News) ## 📢 新闻 (News)
2026-02-16 🎉 PicoClaw 在一周内突破了12K star! 感谢大家的关注!PicoClaw 的成长速度超乎我们预期. 由于PR数量的快速膨胀我们亟需社区开发者参与维护. 我们需要的志愿者角色和roadmap已经发布到了[这里](doc/picoclaw_community_roadmap_260216.md), 期待你的参与! 2026-02-16 🎉 ClawDroid 在一周内突破了12K star! 感谢大家的关注ClawDroid 的成长速度超乎我们预期. 由于PR数量的快速膨胀我们亟需社区开发者参与维护. 我们需要的志愿者角色和roadmap已经发布到了[这里](doc/clawdroid_community_roadmap_260216.md), 期待你的参与!
2026-02-13 🎉 **PicoClaw 在 4 天内突破 5000 Stars** 感谢社区的支持由于正值中国春节假期PR 和 Issue 涌入较多,我们正在利用这段时间敲定 **项目路线图 (Roadmap)** 并组建 **开发者群组**,以便加速 PicoClaw 的开发。 2026-02-13 🎉 **ClawDroid 在 4 天内突破 5000 Stars** 感谢社区的支持由于正值中国春节假期PR 和 Issue 涌入较多,我们正在利用这段时间敲定 **项目路线图 (Roadmap)** 并组建 **开发者群组**,以便加速 ClawDroid 的开发。
🚀 **行动号召:** 请在 GitHub Discussions 中提交您的功能请求 (Feature Requests)。我们将在接下来的周会上进行审查和优先级排序。 🚀 **行动号召:** 请在 GitHub Discussions 中提交您的功能请求 (Feature Requests)。我们将在接下来的周会上进行审查和优先级排序。
2026-02-09 🎉 **PicoClaw 正式发布!** 仅用 1 天构建,旨在将 AI Agent 带入 10 美元硬件与 <10MB 内存的世界。🦐 PicoClaw皮皮虾我们走 2026-02-09 🎉 **ClawDroid 正式发布!** 仅用 1 天构建,旨在将 AI Agent 带入 10 美元硬件与 <10MB 内存的世界。🦐 ClawDroid皮皮虾我们走
## ✨ 特性 ## ✨ 特性
@ -69,14 +69,14 @@
🤖 **AI 自举**: 纯 Go 语言原生实现 — 95% 的核心代码由 Agent 生成,并经由“人机回环 (Human-in-the-loop)”微调。 🤖 **AI 自举**: 纯 Go 语言原生实现 — 95% 的核心代码由 Agent 生成,并经由“人机回环 (Human-in-the-loop)”微调。
| | OpenClaw | NanoBot | **PicoClaw** | | | OpenClaw | NanoBot | **ClawDroid** |
| --- | --- | --- | --- | | --- | --- | --- | --- |
| **语言** | TypeScript | Python | **Go** | | **语言** | TypeScript | Python | **Go** |
| **RAM** | >1GB | >100MB | **< 10MB** | | **RAM** | >1GB | >100MB | **< 10MB** |
| **启动时间**</br>(0.8GHz core) | >500s | >30s | **<1s** | | **启动时间**</br>(0.8GHz core) | >500s | >30s | **<1s** |
| **成本** | Mac Mini $599 | 大多数 Linux 开发板 ~$50 | **任意 Linux 开发板**</br>**低至 $10** | | **成本** | Mac Mini $599 | 大多数 Linux 开发板 ~$50 | **任意 Linux 开发板**</br>**低至 $10** |
<img src="assets/compare.jpg" alt="PicoClaw" width="512"> <img src="assets/compare.jpg" alt="ClawDroid" width="512">
## 🦾 演示 ## 🦾 演示
@ -89,9 +89,9 @@
<th><p align="center">🔎 网络搜索与学习</p></th> <th><p align="center">🔎 网络搜索与学习</p></th>
</tr> </tr>
<tr> <tr>
<td align="center"><p align="center"><img src="assets/picoclaw_code.gif" width="240" height="180"></p></td> <td align="center"><p align="center"><img src="assets/clawdroid_code.gif" width="240" height="180"></p></td>
<td align="center"><p align="center"><img src="assets/picoclaw_memory.gif" width="240" height="180"></p></td> <td align="center"><p align="center"><img src="assets/clawdroid_memory.gif" width="240" height="180"></p></td>
<td align="center"><p align="center"><img src="assets/picoclaw_search.gif" width="240" height="180"></p></td> <td align="center"><p align="center"><img src="assets/clawdroid_search.gif" width="240" height="180"></p></td>
</tr> </tr>
<tr> <tr>
<td align="center">开发 • 部署 • 扩展</td> <td align="center">开发 • 部署 • 扩展</td>
@ -102,7 +102,7 @@
### 🐜 创新的低占用部署 ### 🐜 创新的低占用部署
PicoClaw 几乎可以部署在任何 Linux 设备上! ClawDroid 几乎可以部署在任何 Linux 设备上!
* $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) E(网口) 或 W(WiFi6) 版本,用于极简家庭助手。 * $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) E(网口) 或 W(WiFi6) 版本,用于极简家庭助手。
* $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html),或 $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html),用于自动化服务器运维。 * $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html),或 $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html),用于自动化服务器运维。
@ -116,14 +116,14 @@ PicoClaw 几乎可以部署在任何 Linux 设备上!
### 使用预编译二进制文件安装 ### 使用预编译二进制文件安装
从 [Release 页面](https://github.com/sipeed/picoclaw/releases) 下载适用于您平台的固件。 从 [Release 页面](https://github.com/KarakuriAgent/clawdroid/releases) 下载适用于您平台的固件。
### 从源码安装(获取最新特性,开发推荐) ### 从源码安装(获取最新特性,开发推荐)
```bash ```bash
git clone https://github.com/sipeed/picoclaw.git git clone https://github.com/KarakuriAgent/clawdroid.git
cd picoclaw cd clawdroid
make deps make deps
# 构建(无需安装) # 构建(无需安装)
@ -139,12 +139,12 @@ make install
## 🐳 Docker Compose ## 🐳 Docker Compose
您也可以使用 Docker Compose 运行 PicoClaw无需在本地安装任何环境。 您也可以使用 Docker Compose 运行 ClawDroid,无需在本地安装任何环境。
```bash ```bash
# 1. 克隆仓库 # 1. 克隆仓库
git clone https://github.com/sipeed/picoclaw.git git clone https://github.com/KarakuriAgent/clawdroid.git
cd picoclaw cd clawdroid
# 2. 设置 API Key # 2. 设置 API Key
cp config/config.example.json config/config.json cp config/config.example.json config/config.json
@ -154,7 +154,7 @@ vim config/config.json # 设置 DISCORD_BOT_TOKEN, API keys 等
docker compose --profile gateway up -d docker compose --profile gateway up -d
# 4. 查看日志 # 4. 查看日志
docker compose logs -f picoclaw-gateway docker compose logs -f clawdroid-gateway
# 5. 停止 # 5. 停止
docker compose --profile gateway down docker compose --profile gateway down
@ -165,10 +165,10 @@ docker compose --profile gateway down
```bash ```bash
# 提问 # 提问
docker compose run --rm picoclaw-agent -m "2+2 等于几?" docker compose run --rm clawdroid-agent -m "2+2 等于几?"
# 交互模式 # 交互模式
docker compose run --rm picoclaw-agent docker compose run --rm clawdroid-agent
``` ```
@ -183,24 +183,24 @@ docker compose --profile gateway up -d
### 🚀 快速开始 ### 🚀 快速开始
> [!TIP] > [!TIP]
> 在 `~/.picoclaw/config.json` 中设置您的 API Key。 > 在 `~/.clawdroid/config.json` 中设置您的 API Key。
> 获取 API Key: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu (智谱)](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM) > 获取 API Key: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu (智谱)](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)
> 网络搜索是 **可选的** - 获取免费的 [Brave Search API](https://brave.com/search/api) (每月 2000 次免费查询) > 网络搜索是 **可选的** - 获取免费的 [Brave Search API](https://brave.com/search/api) (每月 2000 次免费查询)
**1. 初始化 (Initialize)** **1. 初始化 (Initialize)**
```bash ```bash
picoclaw onboard clawdroid onboard
``` ```
**2. 配置 (Configure)** (`~/.picoclaw/config.json`) **2. 配置 (Configure)** (`~/.clawdroid/config.json`)
```json ```json
{ {
"agents": { "agents": {
"defaults": { "defaults": {
"workspace": "~/.picoclaw/workspace", "workspace": "~/.clawdroid/workspace",
"model": "glm-4.7", "model": "glm-4.7",
"max_tokens": 8192, "max_tokens": 8192,
"temperature": 0.7, "temperature": 0.7,
@ -235,7 +235,7 @@ picoclaw onboard
**4. 对话 (Chat)** **4. 对话 (Chat)**
```bash ```bash
picoclaw agent -m "2+2 等于几?" clawdroid agent -m "2+2 等于几?"
``` ```
@ -245,7 +245,7 @@ picoclaw agent -m "2+2 等于几?"
## 💬 聊天应用集成 (Chat Apps) ## 💬 聊天应用集成 (Chat Apps)
通过 Telegram, Discord 或钉钉与您的 PicoClaw 对话。 通过 Telegram, Discord 或钉钉与您的 ClawDroid 对话。
| 渠道 | 设置难度 | | 渠道 | 设置难度 |
| --- | --- | | --- | --- |
@ -283,7 +283,7 @@ picoclaw agent -m "2+2 等于几?"
**3. 运行** **3. 运行**
```bash ```bash
picoclaw gateway clawdroid gateway
``` ```
@ -333,7 +333,7 @@ picoclaw gateway
**6. 运行** **6. 运行**
```bash ```bash
picoclaw gateway clawdroid gateway
``` ```
@ -368,7 +368,7 @@ picoclaw gateway
**3. 运行** **3. 运行**
```bash ```bash
picoclaw gateway clawdroid gateway
``` ```
@ -404,7 +404,7 @@ picoclaw gateway
**3. 运行** **3. 运行**
```bash ```bash
picoclaw gateway clawdroid gateway
``` ```
@ -412,20 +412,20 @@ picoclaw gateway
## <img src="assets/clawdchat-icon.png" width="24" height="24" alt="ClawdChat"> 加入 Agent 社交网络 ## <img src="assets/clawdchat-icon.png" width="24" height="24" alt="ClawdChat"> 加入 Agent 社交网络
只需通过 CLI 或任何集成的聊天应用发送一条消息,即可将 PicoClaw 连接到 Agent 社交网络。 只需通过 CLI 或任何集成的聊天应用发送一条消息,即可将 ClawDroid 连接到 Agent 社交网络。
**阅读 `https://clawdchat.ai/skill.md` 并按照说明加入 [ClawdChat.ai**](https://clawdchat.ai) **阅读 `https://clawdchat.ai/skill.md` 并按照说明加入 [ClawdChat.ai**](https://clawdchat.ai)
## ⚙️ 配置详解 ## ⚙️ 配置详解
配置文件路径: `~/.picoclaw/config.json` 配置文件路径: `~/.clawdroid/config.json`
### 工作区布局 (Workspace Layout) ### 工作区布局 (Workspace Layout)
PicoClaw 将数据存储在您配置的工作区中(默认:`~/.picoclaw/workspace` ClawDroid 将数据存储在您配置的工作区中(默认:`~/.clawdroid/workspace`
``` ```
~/.picoclaw/workspace/ ~/.clawdroid/workspace/
├── sessions/ # 对话会话和历史 ├── sessions/ # 对话会话和历史
├── memory/ # 长期记忆 (MEMORY.md) ├── memory/ # 长期记忆 (MEMORY.md)
├── state/ # 持久化状态 (最后一次频道等) ├── state/ # 持久化状态 (最后一次频道等)
@ -442,7 +442,7 @@ PicoClaw 将数据存储在您配置的工作区中(默认:`~/.picoclaw/work
### 心跳 / 周期性任务 (Heartbeat) ### 心跳 / 周期性任务 (Heartbeat)
PicoClaw 可以自动执行周期性任务。在工作区创建 `HEARTBEAT.md` 文件: ClawDroid 可以自动执行周期性任务。在工作区创建 `HEARTBEAT.md` 文件:
```markdown ```markdown
# Periodic Tasks # Periodic Tasks
@ -518,8 +518,8 @@ Agent 读取 HEARTBEAT.md
**环境变量:** **环境变量:**
* `PICOCLAW_HEARTBEAT_ENABLED=false` 禁用 * `CLAWDROID_HEARTBEAT_ENABLED=false` 禁用
* `PICOCLAW_HEARTBEAT_INTERVAL=60` 更改间隔 * `CLAWDROID_HEARTBEAT_INTERVAL=60` 更改间隔
### 提供商 (Providers) ### 提供商 (Providers)
@ -549,7 +549,7 @@ Agent 读取 HEARTBEAT.md
{ {
"agents": { "agents": {
"defaults": { "defaults": {
"workspace": "~/.picoclaw/workspace", "workspace": "~/.clawdroid/workspace",
"model": "glm-4.7", "model": "glm-4.7",
"max_tokens": 8192, "max_tokens": 8192,
"temperature": 0.7, "temperature": 0.7,
@ -569,7 +569,7 @@ Agent 读取 HEARTBEAT.md
**3. 运行** **3. 运行**
```bash ```bash
picoclaw agent -m "你好" clawdroid agent -m "你好"
``` ```
@ -643,23 +643,23 @@ picoclaw agent -m "你好"
| 命令 | 描述 | | 命令 | 描述 |
| --- | --- | | --- | --- |
| `picoclaw onboard` | 初始化配置和工作区 | | `clawdroid onboard` | 初始化配置和工作区 |
| `picoclaw agent -m "..."` | 与 Agent 对话 | | `clawdroid agent -m "..."` | 与 Agent 对话 |
| `picoclaw agent` | 交互式聊天模式 | | `clawdroid agent` | 交互式聊天模式 |
| `picoclaw gateway` | 启动网关 (Gateway) | | `clawdroid gateway` | 启动网关 (Gateway) |
| `picoclaw status` | 显示状态 | | `clawdroid status` | 显示状态 |
| `picoclaw cron list` | 列出所有定时任务 | | `clawdroid cron list` | 列出所有定时任务 |
| `picoclaw cron add ...` | 添加定时任务 | | `clawdroid cron add ...` | 添加定时任务 |
### 定时任务 / 提醒 (Scheduled Tasks) ### 定时任务 / 提醒 (Scheduled Tasks)
PicoClaw 通过 `cron` 工具支持定时提醒和重复任务: ClawDroid 通过 `cron` 工具支持定时提醒和重复任务:
* **一次性提醒**: "Remind me in 10 minutes" (10分钟后提醒我) → 10分钟后触发一次 * **一次性提醒**: "Remind me in 10 minutes" (10分钟后提醒我) → 10分钟后触发一次
* **重复任务**: "Remind me every 2 hours" (每2小时提醒我) → 每2小时触发 * **重复任务**: "Remind me every 2 hours" (每2小时提醒我) → 每2小时触发
* **Cron 表达式**: "Remind me at 9am daily" (每天上午9点提醒我) → 使用 cron 表达式 * **Cron 表达式**: "Remind me at 9am daily" (每天上午9点提醒我) → 使用 cron 表达式
任务存储在 `~/.picoclaw/workspace/cron/` 中并自动处理。 任务存储在 `~/.clawdroid/workspace/cron/` 中并自动处理。
## 🤝 贡献与路线图 (Roadmap) ## 🤝 贡献与路线图 (Roadmap)
@ -673,18 +673,18 @@ PicoClaw 通过 `cron` 工具支持定时提醒和重复任务:
Discord: [https://discord.gg/V4sAZ9XWpN](https://discord.gg/V4sAZ9XWpN) Discord: [https://discord.gg/V4sAZ9XWpN](https://discord.gg/V4sAZ9XWpN)
<img src="assets/wechat.png" alt="PicoClaw" width="512"> <img src="assets/wechat.png" alt="ClawDroid" width="512">
## 🐛 疑难解答 (Troubleshooting) ## 🐛 疑难解答 (Troubleshooting)
### 网络搜索提示 "API 配置问题" ### 网络搜索提示 "API 配置问题"
如果您尚未配置搜索 API Key这是正常的。PicoClaw 会提供手动搜索的帮助链接。 如果您尚未配置搜索 API Key这是正常的。ClawDroid 会提供手动搜索的帮助链接。
启用网络搜索: 启用网络搜索:
1. 在 [https://brave.com/search/api](https://brave.com/search/api) 获取免费 API Key (每月 2000 次免费查询) 1. 在 [https://brave.com/search/api](https://brave.com/search/api) 获取免费 API Key (每月 2000 次免费查询)
2. 添加到 `~/.picoclaw/config.json`: 2. 添加到 `~/.clawdroid/config.json`:
```json ```json
{ {
"tools": { "tools": {
@ -707,7 +707,7 @@ Discord: [https://discord.gg/V4sAZ9XWpN](https://discord.gg/V4sAZ9XWpN)
### Telegram bot 提示 "Conflict: terminated by other getUpdates" ### Telegram bot 提示 "Conflict: terminated by other getUpdates"
这表示有另一个机器人实例正在运行。请确保同一时间只有一个 `picoclaw gateway` 进程在运行。 这表示有另一个机器人实例正在运行。请确保同一时间只有一个 `clawdroid gateway` 进程在运行。
--- ---

View file

@ -1,5 +1,5 @@
# 🦐 PicoClaw Roadmap # 🦐 ClawDroid Roadmap
> **Vision**: To build the ultimate lightweight, secure, and fully autonomous AI Agent infrastructure.automate the mundane, unleash your creativity > **Vision**: To build the ultimate lightweight, secure, and fully autonomous AI Agent infrastructure.automate the mundane, unleash your creativity
@ -7,9 +7,9 @@
## 🚀 1. Core Optimization: Extreme Lightweight ## 🚀 1. Core Optimization: Extreme Lightweight
*Our defining characteristic. We fight software bloat to ensure PicoClaw runs smoothly on the smallest embedded devices.* *Our defining characteristic. We fight software bloat to ensure ClawDroid runs smoothly on the smallest embedded devices.*
* [**Memory Footprint Reduction**](https://github.com/sipeed/picoclaw/issues/346) * [**Memory Footprint Reduction**](https://github.com/KarakuriAgent/clawdroid/issues/346)
* **Goal**: Run smoothly on 64MB RAM embedded boards (e.g., low-end RISC-V SBCs) with the core process consuming < 20MB. * **Goal**: Run smoothly on 64MB RAM embedded boards (e.g., low-end RISC-V SBCs) with the core process consuming < 20MB.
* **Context**: RAM is expensive and scarce on edge devices. Memory optimization takes precedence over storage size. * **Context**: RAM is expensive and scarce on edge devices. Memory optimization takes precedence over storage size.
* **Action**: Analyze memory growth between releases, remove redundant dependencies, and optimize data structures. * **Action**: Analyze memory growth between releases, remove redundant dependencies, and optimize data structures.
@ -42,7 +42,7 @@
*Connect every model, reach every platform.* *Connect every model, reach every platform.*
* **Provider** * **Provider**
* [**Architecture Upgrade**](https://github.com/sipeed/picoclaw/issues/283): Refactor from "Vendor-based" to "Protocol-based" classification (e.g., OpenAI-compatible, Ollama-compatible). *(Status: In progress by @Daming, ETA 5 days)* * [**Architecture Upgrade**](https://github.com/KarakuriAgent/clawdroid/issues/283): Refactor from "Vendor-based" to "Protocol-based" classification (e.g., OpenAI-compatible, Ollama-compatible). *(Status: In progress by @Daming, ETA 5 days)*
* **Local Models**: Deep integration with **Ollama**, **vLLM**, **LM Studio**, and **Mistral** (local inference). * **Local Models**: Deep integration with **Ollama**, **vLLM**, **LM Studio**, and **Mistral** (local inference).
* **Online Models**: Continued support for frontier closed-source models. * **Online Models**: Continued support for frontier closed-source models.
@ -50,11 +50,11 @@
* **Channel** * **Channel**
* **IM Matrix**: QQ, WeChat (Work), DingTalk, Feishu (Lark), Telegram, Discord, WhatsApp, LINE, Slack, Email, KOOK, Signal, ... * **IM Matrix**: QQ, WeChat (Work), DingTalk, Feishu (Lark), Telegram, Discord, WhatsApp, LINE, Slack, Email, KOOK, Signal, ...
* **Standards**: Support for the **OneBot** protocol. * **Standards**: Support for the **OneBot** protocol.
* [**attachment**](https://github.com/sipeed/picoclaw/issues/348): Native handling of images, audio, and video attachments. * [**attachment**](https://github.com/KarakuriAgent/clawdroid/issues/348): Native handling of images, audio, and video attachments.
* **Skill Marketplace** * **Skill Marketplace**
* [**Discovery skills**](https://github.com/sipeed/picoclaw/issues/287): Implement `find_skill` to automatically discover and install skills from the [GitHub Skills Repo] or other registries. * [**Discovery skills**](https://github.com/KarakuriAgent/clawdroid/issues/287): Implement `find_skill` to automatically discover and install skills from the [GitHub Skills Repo] or other registries.
@ -63,16 +63,16 @@
*Beyond conversation—focusing on action and collaboration.* *Beyond conversation—focusing on action and collaboration.*
* **Operations** * **Operations**
* [**MCP Support**](https://github.com/sipeed/picoclaw/issues/290): Native support for the **Model Context Protocol (MCP)**. * [**MCP Support**](https://github.com/KarakuriAgent/clawdroid/issues/290): Native support for the **Model Context Protocol (MCP)**.
* [**Browser Automation**](https://github.com/sipeed/picoclaw/issues/293): Headless browser control via CDP (Chrome DevTools Protocol) or ActionBook. * [**Browser Automation**](https://github.com/KarakuriAgent/clawdroid/issues/293): Headless browser control via CDP (Chrome DevTools Protocol) or ActionBook.
* [**Mobile Operation**](https://github.com/sipeed/picoclaw/issues/292): Android device control (similar to BotDrop). * [**Mobile Operation**](https://github.com/KarakuriAgent/clawdroid/issues/292): Android device control (similar to BotDrop).
* **Multi-Agent Collaboration** * **Multi-Agent Collaboration**
* [**Basic Multi-Agent**](https://github.com/sipeed/picoclaw/issues/294) implement * [**Basic Multi-Agent**](https://github.com/KarakuriAgent/clawdroid/issues/294) implement
* [**Model Routing**](https://github.com/sipeed/picoclaw/issues/295): "Smart Routing" — dispatch simple tasks to small/local models (fast/cheap) and complex tasks to SOTA models (smart). * [**Model Routing**](https://github.com/KarakuriAgent/clawdroid/issues/295): "Smart Routing" — dispatch simple tasks to small/local models (fast/cheap) and complex tasks to SOTA models (smart).
* [**Swarm Mode**](https://github.com/sipeed/picoclaw/issues/284): Collaboration between multiple PicoClaw instances on the same network. * [**Swarm Mode**](https://github.com/KarakuriAgent/clawdroid/issues/284): Collaboration between multiple ClawDroid instances on the same network.
* [**AIEOS**](https://github.com/sipeed/picoclaw/issues/296): Exploring AI-Native Operating System interaction paradigms. * [**AIEOS**](https://github.com/KarakuriAgent/clawdroid/issues/296): Exploring AI-Native Operating System interaction paradigms.
@ -80,7 +80,7 @@
*Lowering the barrier to entry so anyone can deploy in minutes.* *Lowering the barrier to entry so anyone can deploy in minutes.*
* [**QuickGuide (Zero-Config Start)**](https://github.com/sipeed/picoclaw/issues/350) * [**QuickGuide (Zero-Config Start)**](https://github.com/KarakuriAgent/clawdroid/issues/350)
* Interactive CLI Wizard: If launched without config, automatically detect the environment and guide the user through Token/Network setup step-by-step. * Interactive CLI Wizard: If launched without config, automatically detect the environment and guide the user through Token/Network setup step-by-step.
@ -104,7 +104,7 @@
## 🎨 7. Brand & Community ## 🎨 7. Brand & Community
* [**Logo Design**](https://github.com/sipeed/picoclaw/issues/297): We are looking for a **Mantis Shrimp (Stomatopoda)** logo design! * [**Logo Design**](https://github.com/KarakuriAgent/clawdroid/issues/297): We are looking for a **Mantis Shrimp (Stomatopoda)** logo design!
* *Concept*: Needs to reflect "Small but Mighty" and "Lightning Fast Strikes." * *Concept*: Needs to reflect "Small but Mighty" and "Lightning Fast Strikes."

View file

@ -14,11 +14,11 @@ val keystoreProperties = Properties().apply {
} }
android { android {
namespace = "io.picoclaw.android" namespace = "io.clawdroid"
compileSdk = libs.versions.android.compileSdk.get().toInt() compileSdk = libs.versions.android.compileSdk.get().toInt()
defaultConfig { defaultConfig {
applicationId = "io.picoclaw.android" applicationId = "io.clawdroid"
minSdk = libs.versions.android.minSdk.get().toInt() minSdk = libs.versions.android.minSdk.get().toInt()
targetSdk = libs.versions.android.targetSdk.get().toInt() targetSdk = libs.versions.android.targetSdk.get().toInt()
versionCode = 1 versionCode = 1

View file

@ -12,24 +12,24 @@
*** INSTANCE; *** INSTANCE;
kotlinx.serialization.KSerializer serializer(...); kotlinx.serialization.KSerializer serializer(...);
} }
-keepclasseswithmembers class io.picoclaw.android.** { -keepclasseswithmembers class io.clawdroid.** {
kotlinx.serialization.KSerializer serializer(...); kotlinx.serialization.KSerializer serializer(...);
} }
# Keep generated $$serializer classes # Keep generated $$serializer classes
-keepclassmembers class io.picoclaw.android.**$$serializer { -keepclassmembers class io.clawdroid.**$$serializer {
*** INSTANCE; *** INSTANCE;
*; *;
} }
# Keep private ImageEntry used via Json.decodeFromString in MessageMapper # Keep private ImageEntry used via Json.decodeFromString in MessageMapper
-keep class io.picoclaw.android.core.data.mapper.ImageEntry { *; } -keep class io.clawdroid.core.data.mapper.ImageEntry { *; }
# ======================== # ========================
# Enums stored as strings in Room DB # Enums stored as strings in Room DB
# ======================== # ========================
-keepclassmembers enum io.picoclaw.android.core.domain.model.MessageSender { *; } -keepclassmembers enum io.clawdroid.core.domain.model.MessageSender { *; }
-keepclassmembers enum io.picoclaw.android.core.domain.model.MessageStatus { *; } -keepclassmembers enum io.clawdroid.core.domain.model.MessageStatus { *; }
# ======================== # ========================
# Ktor # Ktor

View file

@ -19,13 +19,13 @@
</queries> </queries>
<application <application
android:name=".PicoClawApp" android:name=".ClawDroidApp"
android:allowBackup="true" android:allowBackup="true"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config" android:networkSecurityConfig="@xml/network_security_config"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.PicoClaw"> android:theme="@style/Theme.ClawDroid">
<provider <provider
android:name="androidx.core.content.FileProvider" android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider" android:authorities="${applicationId}.fileprovider"
@ -39,7 +39,7 @@
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:exported="true" android:exported="true"
android:theme="@style/Theme.PicoClaw"> android:theme="@style/Theme.ClawDroid">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
@ -50,7 +50,7 @@
android:name=".receiver.AgentMessageReceiver" android:name=".receiver.AgentMessageReceiver"
android:exported="true"> android:exported="true">
<intent-filter> <intent-filter>
<action android:name="io.picoclaw.android.AGENT_MESSAGE" /> <action android:name="io.clawdroid.AGENT_MESSAGE" />
</intent-filter> </intent-filter>
</receiver> </receiver>
@ -84,7 +84,7 @@
android:value="AI voice assistant overlay for real-time conversation" /> android:value="AI voice assistant overlay for real-time conversation" />
</service> </service>
<service <service
android:name=".assistant.PicoClawAccessibilityService" android:name=".assistant.ClawDroidAccessibilityService"
android:exported="false" android:exported="false"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter> <intent-filter>

View file

@ -1,16 +1,16 @@
package io.picoclaw.android package io.clawdroid
import android.app.Application import android.app.Application
import io.picoclaw.android.di.appModule import io.clawdroid.di.appModule
import io.picoclaw.android.receiver.NotificationHelper import io.clawdroid.receiver.NotificationHelper
import org.koin.android.ext.koin.androidContext import org.koin.android.ext.koin.androidContext
import org.koin.core.context.startKoin import org.koin.core.context.startKoin
class PicoClawApp : Application() { class ClawDroidApp : Application() {
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
startKoin { startKoin {
androidContext(this@PicoClawApp) androidContext(this@ClawDroidApp)
modules(appModule) modules(appModule)
} }
NotificationHelper.createNotificationChannel(this) NotificationHelper.createNotificationChannel(this)

View file

@ -1,4 +1,4 @@
package io.picoclaw.android package io.clawdroid
import android.Manifest import android.Manifest
import android.content.pm.PackageManager import android.content.pm.PackageManager
@ -12,10 +12,10 @@ import androidx.core.content.ContextCompat
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import io.picoclaw.android.core.ui.theme.PicoClawTheme import io.clawdroid.core.ui.theme.ClawDroidTheme
import io.picoclaw.android.feature.chat.screen.ChatScreen import io.clawdroid.feature.chat.screen.ChatScreen
import io.picoclaw.android.feature.chat.screen.SettingsScreen import io.clawdroid.feature.chat.screen.SettingsScreen
import io.picoclaw.android.navigation.NavRoutes import io.clawdroid.navigation.NavRoutes
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
@ -28,7 +28,7 @@ class MainActivity : ComponentActivity() {
requestNotificationPermissionIfNeeded() requestNotificationPermissionIfNeeded()
enableEdgeToEdge() enableEdgeToEdge()
setContent { setContent {
PicoClawTheme { ClawDroidTheme {
val navController = rememberNavController() val navController = rememberNavController()
NavHost(navController = navController, startDestination = NavRoutes.CHAT) { NavHost(navController = navController, startDestination = NavRoutes.CHAT) {
composable(NavRoutes.CHAT) { composable(NavRoutes.CHAT) {

View file

@ -1,4 +1,4 @@
package io.picoclaw.android package io.clawdroid
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
@ -49,7 +49,7 @@ class PermissionRequestActivity : ComponentActivity() {
companion object { companion object {
const val EXTRA_PERMISSION = "permission" const val EXTRA_PERMISSION = "permission"
const val EXTRA_GRANTED = "granted" const val EXTRA_GRANTED = "granted"
const val ACTION_RESULT = "io.picoclaw.android.PERMISSION_RESULT" const val ACTION_RESULT = "io.clawdroid.PERMISSION_RESULT"
fun intent(context: Context, permission: String): Intent = fun intent(context: Context, permission: String): Intent =
Intent(context, PermissionRequestActivity::class.java) Intent(context, PermissionRequestActivity::class.java)

View file

@ -1,10 +1,10 @@
package io.picoclaw.android.assistant package io.clawdroid.assistant
import android.accessibilityservice.AccessibilityService import android.accessibilityservice.AccessibilityService
import android.graphics.Bitmap import android.graphics.Bitmap
import android.util.Log import android.util.Log
import android.view.Display import android.view.Display
import io.picoclaw.android.feature.chat.voice.ScreenshotSource import io.clawdroid.feature.chat.voice.ScreenshotSource
import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.suspendCancellableCoroutine
import kotlin.coroutines.resume import kotlin.coroutines.resume

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.assistant package io.clawdroid.assistant
import android.Manifest import android.Manifest
import android.content.Intent import android.content.Intent

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.assistant package io.clawdroid.assistant
import android.Manifest import android.Manifest
import android.app.Notification import android.app.Notification
@ -50,20 +50,20 @@ import androidx.savedstate.SavedStateRegistryController
import androidx.savedstate.SavedStateRegistryOwner import androidx.savedstate.SavedStateRegistryOwner
import androidx.savedstate.setViewTreeSavedStateRegistryOwner import androidx.savedstate.setViewTreeSavedStateRegistryOwner
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.picoclaw.android.PermissionRequestActivity import io.clawdroid.PermissionRequestActivity
import io.picoclaw.android.core.data.remote.WebSocketClient import io.clawdroid.core.data.remote.WebSocketClient
import io.picoclaw.android.core.data.repository.AssistantConnectionImpl import io.clawdroid.core.data.repository.AssistantConnectionImpl
import io.picoclaw.android.core.domain.repository.AssistantConnection import io.clawdroid.core.domain.repository.AssistantConnection
import io.picoclaw.android.core.domain.repository.TtsSettingsRepository import io.clawdroid.core.domain.repository.TtsSettingsRepository
import io.picoclaw.android.core.ui.theme.PicoClawTheme import io.clawdroid.core.ui.theme.ClawDroidTheme
import io.picoclaw.android.feature.chat.assistant.AssistantManager import io.clawdroid.feature.chat.assistant.AssistantManager
import io.picoclaw.android.feature.chat.assistant.AssistantPillBar import io.clawdroid.feature.chat.assistant.AssistantPillBar
import io.picoclaw.android.feature.chat.voice.CameraCaptureManager import io.clawdroid.feature.chat.voice.CameraCaptureManager
import io.picoclaw.android.feature.chat.voice.ScreenCaptureManager import io.clawdroid.feature.chat.voice.ScreenCaptureManager
import io.picoclaw.android.feature.chat.voice.ScreenshotSource import io.clawdroid.feature.chat.voice.ScreenshotSource
import io.picoclaw.android.feature.chat.voice.SpeechRecognizerWrapper import io.clawdroid.feature.chat.voice.SpeechRecognizerWrapper
import io.picoclaw.android.feature.chat.voice.TextToSpeechWrapper import io.clawdroid.feature.chat.voice.TextToSpeechWrapper
import io.picoclaw.android.receiver.NotificationHelper import io.clawdroid.receiver.NotificationHelper
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.SupervisorJob
@ -297,7 +297,7 @@ class AssistantService : LifecycleService(), SavedStateRegistryOwner {
ComposeView(this).apply { ComposeView(this).apply {
setContent { setContent {
PicoClawTheme { ClawDroidTheme {
val state by assistantManager.state.collectAsState() val state by assistantManager.state.collectAsState()
Box( Box(
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
@ -348,7 +348,7 @@ class AssistantService : LifecycleService(), SavedStateRegistryOwner {
) )
Text( Text(
text = "画面キャプチャを使用するには、ユーザー補助の設定で" + text = "画面キャプチャを使用するには、ユーザー補助の設定で" +
" PicoClaw を有効にしてください。\n\n" + " ClawDroid を有効にしてください。\n\n" +
"有効にできない場合は、アプリ情報から" + "有効にできない場合は、アプリ情報から" +
"「制限付き設定を許可」を実行してから" + "「制限付き設定を許可」を実行してから" +
"再度お試しください。", "再度お試しください。",
@ -410,7 +410,7 @@ class AssistantService : LifecycleService(), SavedStateRegistryOwner {
private fun buildNotification(): Notification { private fun buildNotification(): Notification {
return NotificationCompat.Builder(this, NotificationHelper.ASSISTANT_CHANNEL_ID) return NotificationCompat.Builder(this, NotificationHelper.ASSISTANT_CHANNEL_ID)
.setSmallIcon(android.R.drawable.ic_btn_speak_now) .setSmallIcon(android.R.drawable.ic_btn_speak_now)
.setContentTitle("PicoClaw Assistant") .setContentTitle("ClawDroid Assistant")
.setContentText("Listening...") .setContentText("Listening...")
.setPriority(NotificationCompat.PRIORITY_LOW) .setPriority(NotificationCompat.PRIORITY_LOW)
.setOngoing(true) .setOngoing(true)

View file

@ -1,10 +1,10 @@
package io.picoclaw.android.assistant package io.clawdroid.assistant
import android.accessibilityservice.AccessibilityService import android.accessibilityservice.AccessibilityService
import android.view.accessibility.AccessibilityEvent import android.view.accessibility.AccessibilityEvent
import org.koin.android.ext.android.inject import org.koin.android.ext.android.inject
class PicoClawAccessibilityService : AccessibilityService() { class ClawDroidAccessibilityService : AccessibilityService() {
private val screenshotSource: AccessibilityScreenshotSource by inject() private val screenshotSource: AccessibilityScreenshotSource by inject()
private val deviceController: DeviceController by inject() private val deviceController: DeviceController by inject()

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.assistant package io.clawdroid.assistant
import android.accessibilityservice.AccessibilityService import android.accessibilityservice.AccessibilityService
import android.accessibilityservice.GestureDescription import android.accessibilityservice.GestureDescription

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.assistant package io.clawdroid.assistant
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
@ -11,9 +11,9 @@ import android.os.Build
import android.util.Base64 import android.util.Base64
import android.util.Log import android.util.Log
import android.view.accessibility.AccessibilityNodeInfo import android.view.accessibility.AccessibilityNodeInfo
import io.picoclaw.android.core.data.remote.dto.ToolRequest import io.clawdroid.core.data.remote.dto.ToolRequest
import io.picoclaw.android.core.data.remote.dto.ToolResponse import io.clawdroid.core.data.remote.dto.ToolResponse
import io.picoclaw.android.feature.chat.voice.ScreenshotSource import io.clawdroid.feature.chat.voice.ScreenshotSource
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext

View file

@ -1,35 +1,35 @@
package io.picoclaw.android.di package io.clawdroid.di
import androidx.room.Room import androidx.room.Room
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.engine.okhttp.OkHttp import io.ktor.client.engine.okhttp.OkHttp
import io.ktor.client.plugins.websocket.WebSockets import io.ktor.client.plugins.websocket.WebSockets
import io.picoclaw.android.core.data.local.AppDatabase import io.clawdroid.core.data.local.AppDatabase
import io.picoclaw.android.assistant.AccessibilityScreenshotSource import io.clawdroid.assistant.AccessibilityScreenshotSource
import io.picoclaw.android.assistant.DeviceController import io.clawdroid.assistant.DeviceController
import io.picoclaw.android.core.data.local.ImageFileStorage import io.clawdroid.core.data.local.ImageFileStorage
import io.picoclaw.android.feature.chat.voice.ScreenshotSource import io.clawdroid.feature.chat.voice.ScreenshotSource
import io.picoclaw.android.core.data.remote.WebSocketClient import io.clawdroid.core.data.remote.WebSocketClient
import io.picoclaw.android.assistant.ToolRequestHandler import io.clawdroid.assistant.ToolRequestHandler
import io.picoclaw.android.core.data.repository.ChatRepositoryImpl import io.clawdroid.core.data.repository.ChatRepositoryImpl
import io.picoclaw.android.core.data.repository.TtsCatalogRepositoryImpl import io.clawdroid.core.data.repository.TtsCatalogRepositoryImpl
import io.picoclaw.android.core.data.repository.TtsSettingsRepositoryImpl import io.clawdroid.core.data.repository.TtsSettingsRepositoryImpl
import io.picoclaw.android.core.domain.repository.ChatRepository import io.clawdroid.core.domain.repository.ChatRepository
import io.picoclaw.android.core.domain.repository.TtsCatalogRepository import io.clawdroid.core.domain.repository.TtsCatalogRepository
import io.picoclaw.android.core.domain.repository.TtsSettingsRepository import io.clawdroid.core.domain.repository.TtsSettingsRepository
import io.picoclaw.android.core.domain.usecase.ConnectChatUseCase import io.clawdroid.core.domain.usecase.ConnectChatUseCase
import io.picoclaw.android.core.domain.usecase.DisconnectChatUseCase import io.clawdroid.core.domain.usecase.DisconnectChatUseCase
import io.picoclaw.android.core.domain.usecase.LoadMoreMessagesUseCase import io.clawdroid.core.domain.usecase.LoadMoreMessagesUseCase
import io.picoclaw.android.core.domain.usecase.ObserveConnectionUseCase import io.clawdroid.core.domain.usecase.ObserveConnectionUseCase
import io.picoclaw.android.core.domain.usecase.ObserveMessagesUseCase import io.clawdroid.core.domain.usecase.ObserveMessagesUseCase
import io.picoclaw.android.core.domain.usecase.ObserveStatusUseCase import io.clawdroid.core.domain.usecase.ObserveStatusUseCase
import io.picoclaw.android.core.domain.usecase.SendMessageUseCase import io.clawdroid.core.domain.usecase.SendMessageUseCase
import io.picoclaw.android.feature.chat.ChatViewModel import io.clawdroid.feature.chat.ChatViewModel
import io.picoclaw.android.feature.chat.SettingsViewModel import io.clawdroid.feature.chat.SettingsViewModel
import io.picoclaw.android.feature.chat.voice.SpeechRecognizerWrapper import io.clawdroid.feature.chat.voice.SpeechRecognizerWrapper
import io.picoclaw.android.feature.chat.voice.TextToSpeechWrapper import io.clawdroid.feature.chat.voice.TextToSpeechWrapper
import io.picoclaw.android.feature.chat.voice.CameraCaptureManager import io.clawdroid.feature.chat.voice.CameraCaptureManager
import io.picoclaw.android.feature.chat.voice.VoiceModeManager import io.clawdroid.feature.chat.voice.VoiceModeManager
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.SupervisorJob
@ -49,7 +49,7 @@ val appModule = module {
Room.databaseBuilder( Room.databaseBuilder(
androidContext(), androidContext(),
AppDatabase::class.java, AppDatabase::class.java,
"picoclaw.db" "clawdroid.db"
).fallbackToDestructiveMigration(dropAllTables = true).build() ).fallbackToDestructiveMigration(dropAllTables = true).build()
} }
single { get<AppDatabase>().messageDao() } single { get<AppDatabase>().messageDao() }
@ -68,7 +68,7 @@ val appModule = module {
// WebSocketClient // WebSocketClient
single { single {
val prefs = androidContext().getSharedPreferences("picoclaw", android.content.Context.MODE_PRIVATE) val prefs = androidContext().getSharedPreferences("clawdroid", android.content.Context.MODE_PRIVATE)
val clientId = prefs.getString("client_id", null) ?: UUID.randomUUID().toString().also { val clientId = prefs.getString("client_id", null) ?: UUID.randomUUID().toString().also {
prefs.edit().putString("client_id", it).apply() prefs.edit().putString("client_id", it).apply()
} }

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.navigation package io.clawdroid.navigation
object NavRoutes { object NavRoutes {
const val CHAT = "chat" const val CHAT = "chat"

View file

@ -1,12 +1,12 @@
package io.picoclaw.android.receiver package io.clawdroid.receiver
import android.content.BroadcastReceiver import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.util.Log import android.util.Log
import io.picoclaw.android.core.data.local.dao.MessageDao import io.clawdroid.core.data.local.dao.MessageDao
import io.picoclaw.android.core.data.mapper.MessageMapper import io.clawdroid.core.data.mapper.MessageMapper
import io.picoclaw.android.core.data.remote.dto.WsOutgoing import io.clawdroid.core.data.remote.dto.WsOutgoing
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
@ -57,6 +57,6 @@ class AgentMessageReceiver : BroadcastReceiver(), KoinComponent {
companion object { companion object {
private const val TAG = "AgentMessageReceiver" private const val TAG = "AgentMessageReceiver"
const val ACTION = "io.picoclaw.android.AGENT_MESSAGE" const val ACTION = "io.clawdroid.AGENT_MESSAGE"
} }
} }

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.receiver package io.clawdroid.receiver
import android.app.NotificationChannel import android.app.NotificationChannel
import android.app.NotificationManager import android.app.NotificationManager
@ -8,11 +8,11 @@ import androidx.core.app.NotificationCompat
object NotificationHelper { object NotificationHelper {
private const val CHANNEL_ID = "picoclaw_messages" private const val CHANNEL_ID = "clawdroid_messages"
private const val CHANNEL_NAME = "Agent Messages" private const val CHANNEL_NAME = "Agent Messages"
private const val NOTIFICATION_ID = 1001 private const val NOTIFICATION_ID = 1001
const val ASSISTANT_CHANNEL_ID = "picoclaw_assistant" const val ASSISTANT_CHANNEL_ID = "clawdroid_assistant"
private const val ASSISTANT_CHANNEL_NAME = "Assistant" private const val ASSISTANT_CHANNEL_NAME = "Assistant"
fun createNotificationChannel(context: Context) { fun createNotificationChannel(context: Context) {
@ -23,7 +23,7 @@ object NotificationHelper {
CHANNEL_NAME, CHANNEL_NAME,
NotificationManager.IMPORTANCE_DEFAULT NotificationManager.IMPORTANCE_DEFAULT
).apply { ).apply {
description = "Messages from PicoClaw agent" description = "Messages from ClawDroid agent"
} }
manager.createNotificationChannel(messageChannel) manager.createNotificationChannel(messageChannel)
@ -47,7 +47,7 @@ object NotificationHelper {
val notification = NotificationCompat.Builder(context, CHANNEL_ID) val notification = NotificationCompat.Builder(context, CHANNEL_ID)
.setSmallIcon(android.R.drawable.ic_dialog_info) .setSmallIcon(android.R.drawable.ic_dialog_info)
.setContentTitle("PicoClaw") .setContentTitle("ClawDroid")
.setContentText(content.take(200)) .setContentText(content.take(200))
.setStyle(NotificationCompat.BigTextStyle().bigText(content.take(1000))) .setStyle(NotificationCompat.BigTextStyle().bigText(content.take(1000)))
.setPriority(NotificationCompat.PRIORITY_DEFAULT) .setPriority(NotificationCompat.PRIORITY_DEFAULT)

View file

@ -1,4 +1,4 @@
<resources> <resources>
<string name="app_name">PicoClaw</string> <string name="app_name">ClawDroid</string>
<string name="accessibility_service_description">Allows PicoClaw to capture screenshots during voice assistant conversations.</string> <string name="accessibility_service_description">Allows ClawDroid to capture screenshots during voice assistant conversations.</string>
</resources> </resources>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<style name="Theme.PicoClaw" parent="android:Theme.Material.NoActionBar"> <style name="Theme.ClawDroid" parent="android:Theme.Material.NoActionBar">
<item name="android:windowBackground">#FF050510</item> <item name="android:windowBackground">#FF050510</item>
</style> </style>
</resources> </resources>

View file

@ -5,7 +5,7 @@ plugins {
} }
android { android {
namespace = "io.picoclaw.android.core.data" namespace = "io.clawdroid.core.data"
compileSdk = libs.versions.android.compileSdk.get().toInt() compileSdk = libs.versions.android.compileSdk.get().toInt()
defaultConfig { defaultConfig {

View file

@ -1,11 +1,11 @@
package io.picoclaw.android.core.data.local package io.clawdroid.core.data.local
import androidx.room.Database import androidx.room.Database
import androidx.room.RoomDatabase import androidx.room.RoomDatabase
import androidx.room.TypeConverters import androidx.room.TypeConverters
import io.picoclaw.android.core.data.local.converter.Converters import io.clawdroid.core.data.local.converter.Converters
import io.picoclaw.android.core.data.local.dao.MessageDao import io.clawdroid.core.data.local.dao.MessageDao
import io.picoclaw.android.core.data.local.entity.MessageEntity import io.clawdroid.core.data.local.entity.MessageEntity
@Database(entities = [MessageEntity::class], version = 1, exportSchema = false) @Database(entities = [MessageEntity::class], version = 1, exportSchema = false)
@TypeConverters(Converters::class) @TypeConverters(Converters::class)

View file

@ -1,10 +1,10 @@
package io.picoclaw.android.core.data.local package io.clawdroid.core.data.local
import android.content.Context import android.content.Context
import android.graphics.BitmapFactory import android.graphics.BitmapFactory
import android.net.Uri import android.net.Uri
import android.util.Base64 import android.util.Base64
import io.picoclaw.android.core.domain.model.ImageData import io.clawdroid.core.domain.model.ImageData
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import java.io.File import java.io.File

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.core.data.local.converter package io.clawdroid.core.data.local.converter
import androidx.room.TypeConverter import androidx.room.TypeConverter
import kotlinx.serialization.encodeToString import kotlinx.serialization.encodeToString

View file

@ -1,11 +1,11 @@
package io.picoclaw.android.core.data.local.dao package io.clawdroid.core.data.local.dao
import androidx.room.Dao import androidx.room.Dao
import androidx.room.Insert import androidx.room.Insert
import androidx.room.OnConflictStrategy import androidx.room.OnConflictStrategy
import androidx.room.Query import androidx.room.Query
import androidx.room.Update import androidx.room.Update
import io.picoclaw.android.core.data.local.entity.MessageEntity import io.clawdroid.core.data.local.entity.MessageEntity
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
@Dao @Dao

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.core.data.local.entity package io.clawdroid.core.data.local.entity
import androidx.room.Entity import androidx.room.Entity
import androidx.room.PrimaryKey import androidx.room.PrimaryKey

View file

@ -1,13 +1,13 @@
package io.picoclaw.android.core.data.mapper package io.clawdroid.core.data.mapper
import android.util.Log import android.util.Log
import io.picoclaw.android.core.data.local.entity.MessageEntity import io.clawdroid.core.data.local.entity.MessageEntity
import io.picoclaw.android.core.data.remote.dto.WsIncoming import io.clawdroid.core.data.remote.dto.WsIncoming
import io.picoclaw.android.core.data.remote.dto.WsOutgoing import io.clawdroid.core.data.remote.dto.WsOutgoing
import io.picoclaw.android.core.domain.model.ChatMessage import io.clawdroid.core.domain.model.ChatMessage
import io.picoclaw.android.core.domain.model.ImageData import io.clawdroid.core.domain.model.ImageData
import io.picoclaw.android.core.domain.model.MessageSender import io.clawdroid.core.domain.model.MessageSender
import io.picoclaw.android.core.domain.model.MessageStatus import io.clawdroid.core.domain.model.MessageStatus
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import kotlinx.serialization.encodeToString import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.core.data.remote package io.clawdroid.core.data.remote
import android.util.Log import android.util.Log
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
@ -6,9 +6,9 @@ import io.ktor.client.plugins.websocket.webSocket
import io.ktor.websocket.Frame import io.ktor.websocket.Frame
import io.ktor.websocket.WebSocketSession import io.ktor.websocket.WebSocketSession
import io.ktor.websocket.readText import io.ktor.websocket.readText
import io.picoclaw.android.core.data.remote.dto.WsIncoming import io.clawdroid.core.data.remote.dto.WsIncoming
import io.picoclaw.android.core.data.remote.dto.WsOutgoing import io.clawdroid.core.data.remote.dto.WsOutgoing
import io.picoclaw.android.core.domain.model.ConnectionState import io.clawdroid.core.domain.model.ConnectionState
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.delay import kotlinx.coroutines.delay

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.core.data.remote.dto package io.clawdroid.core.data.remote.dto
import kotlinx.serialization.SerialName import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.core.data.remote.dto package io.clawdroid.core.data.remote.dto
import kotlinx.serialization.SerialName import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.core.data.remote.dto package io.clawdroid.core.data.remote.dto
import kotlinx.serialization.SerialName import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.core.data.remote.dto package io.clawdroid.core.data.remote.dto
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable

View file

@ -1,13 +1,13 @@
package io.picoclaw.android.core.data.repository package io.clawdroid.core.data.repository
import android.util.Log import android.util.Log
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.picoclaw.android.core.data.remote.WebSocketClient import io.clawdroid.core.data.remote.WebSocketClient
import io.picoclaw.android.core.data.remote.dto.ToolRequest import io.clawdroid.core.data.remote.dto.ToolRequest
import io.picoclaw.android.core.data.remote.dto.WsIncoming import io.clawdroid.core.data.remote.dto.WsIncoming
import io.picoclaw.android.core.domain.model.AssistantMessage import io.clawdroid.core.domain.model.AssistantMessage
import io.picoclaw.android.core.domain.model.ConnectionState import io.clawdroid.core.domain.model.ConnectionState
import io.picoclaw.android.core.domain.repository.AssistantConnection import io.clawdroid.core.domain.repository.AssistantConnection
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.SupervisorJob

View file

@ -1,17 +1,17 @@
package io.picoclaw.android.core.data.repository package io.clawdroid.core.data.repository
import android.util.Log import android.util.Log
import io.picoclaw.android.core.data.local.ImageFileStorage import io.clawdroid.core.data.local.ImageFileStorage
import io.picoclaw.android.core.data.local.dao.MessageDao import io.clawdroid.core.data.local.dao.MessageDao
import io.picoclaw.android.core.data.mapper.MessageMapper import io.clawdroid.core.data.mapper.MessageMapper
import io.picoclaw.android.core.data.remote.WebSocketClient import io.clawdroid.core.data.remote.WebSocketClient
import io.picoclaw.android.core.data.remote.dto.ToolRequest import io.clawdroid.core.data.remote.dto.ToolRequest
import io.picoclaw.android.core.data.remote.dto.WsIncoming import io.clawdroid.core.data.remote.dto.WsIncoming
import io.picoclaw.android.core.domain.model.ChatMessage import io.clawdroid.core.domain.model.ChatMessage
import io.picoclaw.android.core.domain.model.ConnectionState import io.clawdroid.core.domain.model.ConnectionState
import io.picoclaw.android.core.domain.model.ImageAttachment import io.clawdroid.core.domain.model.ImageAttachment
import io.picoclaw.android.core.domain.model.MessageStatus import io.clawdroid.core.domain.model.MessageStatus
import io.picoclaw.android.core.domain.repository.ChatRepository import io.clawdroid.core.domain.repository.ChatRepository
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.SharingStarted

View file

@ -1,11 +1,11 @@
package io.picoclaw.android.core.data.repository package io.clawdroid.core.data.repository
import android.content.Context import android.content.Context
import android.speech.tts.TextToSpeech import android.speech.tts.TextToSpeech
import io.picoclaw.android.core.domain.model.TtsConfig import io.clawdroid.core.domain.model.TtsConfig
import io.picoclaw.android.core.domain.model.TtsEngineInfo import io.clawdroid.core.domain.model.TtsEngineInfo
import io.picoclaw.android.core.domain.model.TtsVoiceInfo import io.clawdroid.core.domain.model.TtsVoiceInfo
import io.picoclaw.android.core.domain.repository.TtsCatalogRepository import io.clawdroid.core.domain.repository.TtsCatalogRepository
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.core.data.repository package io.clawdroid.core.data.repository
import android.content.Context import android.content.Context
import androidx.datastore.core.DataStore import androidx.datastore.core.DataStore
@ -7,8 +7,8 @@ import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.floatPreferencesKey import androidx.datastore.preferences.core.floatPreferencesKey
import androidx.datastore.preferences.core.stringPreferencesKey import androidx.datastore.preferences.core.stringPreferencesKey
import androidx.datastore.preferences.preferencesDataStore import androidx.datastore.preferences.preferencesDataStore
import io.picoclaw.android.core.domain.model.TtsConfig import io.clawdroid.core.domain.model.TtsConfig
import io.picoclaw.android.core.domain.repository.TtsSettingsRepository import io.clawdroid.core.domain.repository.TtsSettingsRepository
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map

View file

@ -3,7 +3,7 @@ plugins {
} }
android { android {
namespace = "io.picoclaw.android.core.domain" namespace = "io.clawdroid.core.domain"
compileSdk = libs.versions.android.compileSdk.get().toInt() compileSdk = libs.versions.android.compileSdk.get().toInt()
defaultConfig { defaultConfig {

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.core.domain.model package io.clawdroid.core.domain.model
data class AssistantMessage( data class AssistantMessage(
val content: String, val content: String,

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.core.domain.model package io.clawdroid.core.domain.model
data class ChatMessage( data class ChatMessage(
val id: String, val id: String,

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.core.domain.model package io.clawdroid.core.domain.model
enum class ConnectionState { enum class ConnectionState {
DISCONNECTED, CONNECTING, CONNECTED, RECONNECTING DISCONNECTED, CONNECTING, CONNECTED, RECONNECTING

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.core.domain.model package io.clawdroid.core.domain.model
data class ImageAttachment( data class ImageAttachment(
val uri: String, val uri: String,

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.core.domain.model package io.clawdroid.core.domain.model
data class ImageData( data class ImageData(
val path: String, val path: String,

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.core.domain.model package io.clawdroid.core.domain.model
data class TtsConfig( data class TtsConfig(
val enginePackageName: String? = null, val enginePackageName: String? = null,

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.core.domain.model package io.clawdroid.core.domain.model
data class TtsEngineInfo( data class TtsEngineInfo(
val packageName: String, val packageName: String,

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.core.domain.model package io.clawdroid.core.domain.model
data class TtsVoiceInfo( data class TtsVoiceInfo(
val name: String, val name: String,

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.core.domain.model package io.clawdroid.core.domain.model
enum class VoicePhase { enum class VoicePhase {
IDLE, LISTENING, SENDING, THINKING, SPEAKING, ERROR IDLE, LISTENING, SENDING, THINKING, SPEAKING, ERROR

View file

@ -1,7 +1,7 @@
package io.picoclaw.android.core.domain.repository package io.clawdroid.core.domain.repository
import io.picoclaw.android.core.domain.model.AssistantMessage import io.clawdroid.core.domain.model.AssistantMessage
import io.picoclaw.android.core.domain.model.ConnectionState import io.clawdroid.core.domain.model.ConnectionState
import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow

View file

@ -1,8 +1,8 @@
package io.picoclaw.android.core.domain.repository package io.clawdroid.core.domain.repository
import io.picoclaw.android.core.domain.model.ChatMessage import io.clawdroid.core.domain.model.ChatMessage
import io.picoclaw.android.core.domain.model.ConnectionState import io.clawdroid.core.domain.model.ConnectionState
import io.picoclaw.android.core.domain.model.ImageAttachment import io.clawdroid.core.domain.model.ImageAttachment
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
interface ChatRepository { interface ChatRepository {

View file

@ -1,7 +1,7 @@
package io.picoclaw.android.core.domain.repository package io.clawdroid.core.domain.repository
import io.picoclaw.android.core.domain.model.TtsEngineInfo import io.clawdroid.core.domain.model.TtsEngineInfo
import io.picoclaw.android.core.domain.model.TtsVoiceInfo import io.clawdroid.core.domain.model.TtsVoiceInfo
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
interface TtsCatalogRepository { interface TtsCatalogRepository {

View file

@ -1,6 +1,6 @@
package io.picoclaw.android.core.domain.repository package io.clawdroid.core.domain.repository
import io.picoclaw.android.core.domain.model.TtsConfig import io.clawdroid.core.domain.model.TtsConfig
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
interface TtsSettingsRepository { interface TtsSettingsRepository {

View file

@ -1,6 +1,6 @@
package io.picoclaw.android.core.domain.usecase package io.clawdroid.core.domain.usecase
import io.picoclaw.android.core.domain.repository.ChatRepository import io.clawdroid.core.domain.repository.ChatRepository
class ConnectChatUseCase(private val repository: ChatRepository) { class ConnectChatUseCase(private val repository: ChatRepository) {
operator fun invoke() { operator fun invoke() {

View file

@ -1,6 +1,6 @@
package io.picoclaw.android.core.domain.usecase package io.clawdroid.core.domain.usecase
import io.picoclaw.android.core.domain.repository.ChatRepository import io.clawdroid.core.domain.repository.ChatRepository
class DisconnectChatUseCase(private val repository: ChatRepository) { class DisconnectChatUseCase(private val repository: ChatRepository) {
operator fun invoke() { operator fun invoke() {

View file

@ -1,6 +1,6 @@
package io.picoclaw.android.core.domain.usecase package io.clawdroid.core.domain.usecase
import io.picoclaw.android.core.domain.repository.ChatRepository import io.clawdroid.core.domain.repository.ChatRepository
class LoadMoreMessagesUseCase(private val repository: ChatRepository) { class LoadMoreMessagesUseCase(private val repository: ChatRepository) {
operator fun invoke() { operator fun invoke() {

View file

@ -1,7 +1,7 @@
package io.picoclaw.android.core.domain.usecase package io.clawdroid.core.domain.usecase
import io.picoclaw.android.core.domain.model.ConnectionState import io.clawdroid.core.domain.model.ConnectionState
import io.picoclaw.android.core.domain.repository.ChatRepository import io.clawdroid.core.domain.repository.ChatRepository
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
class ObserveConnectionUseCase(private val repository: ChatRepository) { class ObserveConnectionUseCase(private val repository: ChatRepository) {

View file

@ -1,7 +1,7 @@
package io.picoclaw.android.core.domain.usecase package io.clawdroid.core.domain.usecase
import io.picoclaw.android.core.domain.model.ChatMessage import io.clawdroid.core.domain.model.ChatMessage
import io.picoclaw.android.core.domain.repository.ChatRepository import io.clawdroid.core.domain.repository.ChatRepository
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
class ObserveMessagesUseCase(private val repository: ChatRepository) { class ObserveMessagesUseCase(private val repository: ChatRepository) {

View file

@ -1,6 +1,6 @@
package io.picoclaw.android.core.domain.usecase package io.clawdroid.core.domain.usecase
import io.picoclaw.android.core.domain.repository.ChatRepository import io.clawdroid.core.domain.repository.ChatRepository
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
class ObserveStatusUseCase(private val repository: ChatRepository) { class ObserveStatusUseCase(private val repository: ChatRepository) {

View file

@ -1,7 +1,7 @@
package io.picoclaw.android.core.domain.usecase package io.clawdroid.core.domain.usecase
import io.picoclaw.android.core.domain.model.ImageAttachment import io.clawdroid.core.domain.model.ImageAttachment
import io.picoclaw.android.core.domain.repository.ChatRepository import io.clawdroid.core.domain.repository.ChatRepository
class SendMessageUseCase(private val repository: ChatRepository) { class SendMessageUseCase(private val repository: ChatRepository) {
suspend operator fun invoke(text: String, images: List<ImageAttachment> = emptyList(), inputMode: String? = null) { suspend operator fun invoke(text: String, images: List<ImageAttachment> = emptyList(), inputMode: String? = null) {

View file

@ -4,7 +4,7 @@ plugins {
} }
android { android {
namespace = "io.picoclaw.android.core.ui" namespace = "io.clawdroid.core.ui"
compileSdk = libs.versions.android.compileSdk.get().toInt() compileSdk = libs.versions.android.compileSdk.get().toInt()
defaultConfig { defaultConfig {

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.core.ui.theme package io.clawdroid.core.ui.theme
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.core.ui.theme package io.clawdroid.core.ui.theme
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
@ -38,7 +38,7 @@ private val FuturisticShapes = Shapes(
) )
@Composable @Composable
fun PicoClawTheme( fun ClawDroidTheme(
content: @Composable () -> Unit content: @Composable () -> Unit
) { ) {
MaterialTheme( MaterialTheme(

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.core.ui.theme package io.clawdroid.core.ui.theme
import androidx.compose.material3.Typography import androidx.compose.material3.Typography
import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.TextStyle

View file

@ -4,7 +4,7 @@ plugins {
} }
android { android {
namespace = "io.picoclaw.android.feature.chat" namespace = "io.clawdroid.feature.chat"
compileSdk = libs.versions.android.compileSdk.get().toInt() compileSdk = libs.versions.android.compileSdk.get().toInt()
defaultConfig { defaultConfig {

View file

@ -1,6 +1,6 @@
package io.picoclaw.android.feature.chat package io.clawdroid.feature.chat
import io.picoclaw.android.core.domain.model.ImageAttachment import io.clawdroid.core.domain.model.ImageAttachment
sealed interface ChatEvent { sealed interface ChatEvent {
data class OnInputChanged(val text: String) : ChatEvent data class OnInputChanged(val text: String) : ChatEvent

View file

@ -1,9 +1,9 @@
package io.picoclaw.android.feature.chat package io.clawdroid.feature.chat
import io.picoclaw.android.core.domain.model.ChatMessage import io.clawdroid.core.domain.model.ChatMessage
import io.picoclaw.android.core.domain.model.ConnectionState import io.clawdroid.core.domain.model.ConnectionState
import io.picoclaw.android.core.domain.model.ImageAttachment import io.clawdroid.core.domain.model.ImageAttachment
import io.picoclaw.android.feature.chat.voice.VoiceModeState import io.clawdroid.feature.chat.voice.VoiceModeState
data class ChatUiState( data class ChatUiState(
val messages: List<ChatMessage> = emptyList(), val messages: List<ChatMessage> = emptyList(),

View file

@ -1,15 +1,15 @@
package io.picoclaw.android.feature.chat package io.clawdroid.feature.chat
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import io.picoclaw.android.core.domain.usecase.ConnectChatUseCase import io.clawdroid.core.domain.usecase.ConnectChatUseCase
import io.picoclaw.android.core.domain.usecase.DisconnectChatUseCase import io.clawdroid.core.domain.usecase.DisconnectChatUseCase
import io.picoclaw.android.core.domain.usecase.LoadMoreMessagesUseCase import io.clawdroid.core.domain.usecase.LoadMoreMessagesUseCase
import io.picoclaw.android.core.domain.usecase.ObserveConnectionUseCase import io.clawdroid.core.domain.usecase.ObserveConnectionUseCase
import io.picoclaw.android.core.domain.usecase.ObserveMessagesUseCase import io.clawdroid.core.domain.usecase.ObserveMessagesUseCase
import io.picoclaw.android.core.domain.usecase.ObserveStatusUseCase import io.clawdroid.core.domain.usecase.ObserveStatusUseCase
import io.picoclaw.android.core.domain.usecase.SendMessageUseCase import io.clawdroid.core.domain.usecase.SendMessageUseCase
import io.picoclaw.android.feature.chat.voice.VoiceModeManager import io.clawdroid.feature.chat.voice.VoiceModeManager
import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow

View file

@ -1,8 +1,8 @@
package io.picoclaw.android.feature.chat package io.clawdroid.feature.chat
import io.picoclaw.android.core.domain.model.TtsConfig import io.clawdroid.core.domain.model.TtsConfig
import io.picoclaw.android.core.domain.model.TtsEngineInfo import io.clawdroid.core.domain.model.TtsEngineInfo
import io.picoclaw.android.core.domain.model.TtsVoiceInfo import io.clawdroid.core.domain.model.TtsVoiceInfo
data class SettingsUiState( data class SettingsUiState(
val ttsConfig: TtsConfig = TtsConfig(), val ttsConfig: TtsConfig = TtsConfig(),

View file

@ -1,10 +1,10 @@
package io.picoclaw.android.feature.chat package io.clawdroid.feature.chat
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import io.picoclaw.android.core.domain.repository.TtsCatalogRepository import io.clawdroid.core.domain.repository.TtsCatalogRepository
import io.picoclaw.android.core.domain.repository.TtsSettingsRepository import io.clawdroid.core.domain.repository.TtsSettingsRepository
import io.picoclaw.android.feature.chat.voice.TextToSpeechWrapper import io.clawdroid.feature.chat.voice.TextToSpeechWrapper
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow

View file

@ -1,19 +1,19 @@
package io.picoclaw.android.feature.chat.assistant package io.clawdroid.feature.chat.assistant
import android.content.ContentResolver import android.content.ContentResolver
import android.speech.SpeechRecognizer import android.speech.SpeechRecognizer
import android.util.Base64 import android.util.Base64
import android.util.Log import android.util.Log
import io.picoclaw.android.core.domain.model.AssistantMessage import io.clawdroid.core.domain.model.AssistantMessage
import io.picoclaw.android.core.domain.model.VoicePhase import io.clawdroid.core.domain.model.VoicePhase
import io.picoclaw.android.core.domain.repository.AssistantConnection import io.clawdroid.core.domain.repository.AssistantConnection
import io.picoclaw.android.feature.chat.voice.CameraCaptureManager import io.clawdroid.feature.chat.voice.CameraCaptureManager
import io.picoclaw.android.feature.chat.voice.ScreenCaptureManager import io.clawdroid.feature.chat.voice.ScreenCaptureManager
import io.picoclaw.android.feature.chat.voice.SpeechRecognizerWrapper import io.clawdroid.feature.chat.voice.SpeechRecognizerWrapper
import io.picoclaw.android.feature.chat.voice.SttResult import io.clawdroid.feature.chat.voice.SttResult
import io.picoclaw.android.feature.chat.voice.TextToSpeechWrapper import io.clawdroid.feature.chat.voice.TextToSpeechWrapper
import io.picoclaw.android.feature.chat.voice.ChatTurn import io.clawdroid.feature.chat.voice.ChatTurn
import io.picoclaw.android.feature.chat.voice.VoiceModeState import io.clawdroid.feature.chat.voice.VoiceModeState
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.Job import kotlinx.coroutines.Job

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.feature.chat.assistant package io.clawdroid.feature.chat.assistant
import androidx.camera.view.PreviewView import androidx.camera.view.PreviewView
import androidx.camera.view.PreviewView.ImplementationMode import androidx.camera.view.PreviewView.ImplementationMode
@ -53,13 +53,13 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView import androidx.compose.ui.viewinterop.AndroidView
import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.compose.LocalLifecycleOwner
import io.picoclaw.android.core.domain.model.VoicePhase import io.clawdroid.core.domain.model.VoicePhase
import io.picoclaw.android.core.ui.theme.GradientCyan import io.clawdroid.core.ui.theme.GradientCyan
import io.picoclaw.android.core.ui.theme.TextPrimary import io.clawdroid.core.ui.theme.TextPrimary
import io.picoclaw.android.core.ui.theme.TextSecondary import io.clawdroid.core.ui.theme.TextSecondary
import io.picoclaw.android.feature.chat.voice.CameraCaptureManager import io.clawdroid.feature.chat.voice.CameraCaptureManager
import io.picoclaw.android.feature.chat.voice.ChatTurn import io.clawdroid.feature.chat.voice.ChatTurn
import io.picoclaw.android.feature.chat.voice.VoiceModeState import io.clawdroid.feature.chat.voice.VoiceModeState
import com.composables.icons.lucide.R as LucideR import com.composables.icons.lucide.R as LucideR
import kotlin.math.PI import kotlin.math.PI
import kotlin.math.sin import kotlin.math.sin

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.feature.chat.component package io.clawdroid.feature.chat.component
import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.background import androidx.compose.foundation.background
@ -14,9 +14,9 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import io.picoclaw.android.core.domain.model.ConnectionState import io.clawdroid.core.domain.model.ConnectionState
import io.picoclaw.android.core.ui.theme.DisconnectedRed import io.clawdroid.core.ui.theme.DisconnectedRed
import io.picoclaw.android.core.ui.theme.ReconnectingYellow import io.clawdroid.core.ui.theme.ReconnectingYellow
@Composable @Composable
fun ConnectionBanner( fun ConnectionBanner(

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.feature.chat.component package io.clawdroid.feature.chat.component
import android.net.Uri import android.net.Uri
import androidx.compose.foundation.border import androidx.compose.foundation.border
@ -19,9 +19,9 @@ import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import coil3.compose.AsyncImage import coil3.compose.AsyncImage
import io.picoclaw.android.core.domain.model.ImageAttachment import io.clawdroid.core.domain.model.ImageAttachment
import io.picoclaw.android.core.ui.theme.GlassBorder import io.clawdroid.core.ui.theme.GlassBorder
import io.picoclaw.android.core.ui.theme.TextSecondary import io.clawdroid.core.ui.theme.TextSecondary
import com.composables.icons.lucide.R as LucideR import com.composables.icons.lucide.R as LucideR
@Composable @Composable

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.feature.chat.component package io.clawdroid.feature.chat.component
import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
@ -23,13 +23,13 @@ import coil3.compose.AsyncImage
import com.mikepenz.markdown.m3.Markdown import com.mikepenz.markdown.m3.Markdown
import com.mikepenz.markdown.m3.markdownColor import com.mikepenz.markdown.m3.markdownColor
import com.mikepenz.markdown.m3.markdownTypography import com.mikepenz.markdown.m3.markdownTypography
import io.picoclaw.android.core.domain.model.ChatMessage import io.clawdroid.core.domain.model.ChatMessage
import io.picoclaw.android.core.domain.model.MessageSender import io.clawdroid.core.domain.model.MessageSender
import io.picoclaw.android.core.ui.theme.AgentBubble import io.clawdroid.core.ui.theme.AgentBubble
import io.picoclaw.android.core.ui.theme.AgentBubbleBorder import io.clawdroid.core.ui.theme.AgentBubbleBorder
import io.picoclaw.android.core.ui.theme.TextPrimary import io.clawdroid.core.ui.theme.TextPrimary
import io.picoclaw.android.core.ui.theme.UserBubble import io.clawdroid.core.ui.theme.UserBubble
import io.picoclaw.android.core.ui.theme.UserBubbleBorder import io.clawdroid.core.ui.theme.UserBubbleBorder
import java.io.File import java.io.File
@Composable @Composable

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.feature.chat.component package io.clawdroid.feature.chat.component
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.border import androidx.compose.foundation.border
@ -22,13 +22,13 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import io.picoclaw.android.core.ui.theme.DeepBlack import io.clawdroid.core.ui.theme.DeepBlack
import io.picoclaw.android.core.ui.theme.GlassBorder import io.clawdroid.core.ui.theme.GlassBorder
import io.picoclaw.android.core.ui.theme.GlassWhite import io.clawdroid.core.ui.theme.GlassWhite
import io.picoclaw.android.core.ui.theme.NeonCyan import io.clawdroid.core.ui.theme.NeonCyan
import io.picoclaw.android.core.ui.theme.TextPrimary import io.clawdroid.core.ui.theme.TextPrimary
import io.picoclaw.android.core.ui.theme.TextSecondary import io.clawdroid.core.ui.theme.TextSecondary
import io.picoclaw.android.core.ui.theme.TextTertiary import io.clawdroid.core.ui.theme.TextTertiary
import com.composables.icons.lucide.R as LucideR import com.composables.icons.lucide.R as LucideR
@Composable @Composable

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.feature.chat.component package io.clawdroid.feature.chat.component
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.PaddingValues
@ -13,7 +13,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import io.picoclaw.android.core.domain.model.ChatMessage import io.clawdroid.core.domain.model.ChatMessage
@Composable @Composable
fun MessageList( fun MessageList(

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.feature.chat.component package io.clawdroid.feature.chat.component
import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeIn
@ -16,8 +16,8 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import io.picoclaw.android.core.ui.theme.NeonCyan import io.clawdroid.core.ui.theme.NeonCyan
import io.picoclaw.android.core.ui.theme.TextSecondary import io.clawdroid.core.ui.theme.TextSecondary
@Composable @Composable
fun StatusIndicator( fun StatusIndicator(

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.feature.chat.screen package io.clawdroid.feature.chat.screen
import android.Manifest import android.Manifest
import android.content.pm.PackageManager import android.content.pm.PackageManager
@ -36,22 +36,22 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.core.content.FileProvider import androidx.core.content.FileProvider
import io.picoclaw.android.core.domain.model.ImageAttachment import io.clawdroid.core.domain.model.ImageAttachment
import io.picoclaw.android.core.ui.theme.DeepBlack import io.clawdroid.core.ui.theme.DeepBlack
import io.picoclaw.android.core.ui.theme.GradientCyan import io.clawdroid.core.ui.theme.GradientCyan
import io.picoclaw.android.core.ui.theme.GradientPink import io.clawdroid.core.ui.theme.GradientPink
import io.picoclaw.android.core.ui.theme.GradientPurple import io.clawdroid.core.ui.theme.GradientPurple
import io.picoclaw.android.core.ui.theme.TextSecondary import io.clawdroid.core.ui.theme.TextSecondary
import io.picoclaw.android.feature.chat.ChatEvent import io.clawdroid.feature.chat.ChatEvent
import io.picoclaw.android.feature.chat.ChatViewModel import io.clawdroid.feature.chat.ChatViewModel
import com.composables.icons.lucide.R as LucideR import com.composables.icons.lucide.R as LucideR
import io.picoclaw.android.feature.chat.component.ConnectionBanner import io.clawdroid.feature.chat.component.ConnectionBanner
import io.picoclaw.android.feature.chat.component.ImagePreviewRow import io.clawdroid.feature.chat.component.ImagePreviewRow
import io.picoclaw.android.feature.chat.component.MessageInput import io.clawdroid.feature.chat.component.MessageInput
import io.picoclaw.android.feature.chat.component.MessageList import io.clawdroid.feature.chat.component.MessageList
import io.picoclaw.android.feature.chat.component.StatusIndicator import io.clawdroid.feature.chat.component.StatusIndicator
import io.picoclaw.android.feature.chat.voice.CameraCaptureManager import io.clawdroid.feature.chat.voice.CameraCaptureManager
import io.picoclaw.android.feature.chat.voice.VoiceModeOverlay import io.clawdroid.feature.chat.voice.VoiceModeOverlay
import org.koin.androidx.compose.koinViewModel import org.koin.androidx.compose.koinViewModel
import org.koin.compose.koinInject import org.koin.compose.koinInject
import java.io.File import java.io.File
@ -227,7 +227,7 @@ fun ChatScreen(
containerColor = Color.Transparent, containerColor = Color.Transparent,
topBar = { topBar = {
TopAppBar( TopAppBar(
title = { Text("PicoClaw") }, title = { Text("ClawDroid") },
colors = TopAppBarDefaults.topAppBarColors( colors = TopAppBarDefaults.topAppBarColors(
containerColor = Color.Transparent containerColor = Color.Transparent
), ),

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.feature.chat.screen package io.clawdroid.feature.chat.screen
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
@ -41,18 +41,18 @@ import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import io.picoclaw.android.core.domain.model.TtsEngineInfo import io.clawdroid.core.domain.model.TtsEngineInfo
import io.picoclaw.android.core.domain.model.TtsVoiceInfo import io.clawdroid.core.domain.model.TtsVoiceInfo
import io.picoclaw.android.core.ui.theme.DeepBlack import io.clawdroid.core.ui.theme.DeepBlack
import io.picoclaw.android.core.ui.theme.GlassBorder import io.clawdroid.core.ui.theme.GlassBorder
import io.picoclaw.android.core.ui.theme.GlassWhite import io.clawdroid.core.ui.theme.GlassWhite
import io.picoclaw.android.core.ui.theme.GradientCyan import io.clawdroid.core.ui.theme.GradientCyan
import io.picoclaw.android.core.ui.theme.GradientPurple import io.clawdroid.core.ui.theme.GradientPurple
import io.picoclaw.android.core.ui.theme.NeonCyan import io.clawdroid.core.ui.theme.NeonCyan
import io.picoclaw.android.core.ui.theme.TextPrimary import io.clawdroid.core.ui.theme.TextPrimary
import io.picoclaw.android.core.ui.theme.TextSecondary import io.clawdroid.core.ui.theme.TextSecondary
import com.composables.icons.lucide.R as LucideR import com.composables.icons.lucide.R as LucideR
import io.picoclaw.android.feature.chat.SettingsViewModel import io.clawdroid.feature.chat.SettingsViewModel
import org.koin.androidx.compose.koinViewModel import org.koin.androidx.compose.koinViewModel
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.feature.chat.voice package io.clawdroid.feature.chat.voice
import android.content.Context import android.content.Context
import android.graphics.Bitmap import android.graphics.Bitmap
@ -9,7 +9,7 @@ import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.camera.view.PreviewView import androidx.camera.view.PreviewView
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleOwner
import io.picoclaw.android.core.domain.model.ImageAttachment import io.clawdroid.core.domain.model.ImageAttachment
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import java.io.File import java.io.File

View file

@ -1,9 +1,9 @@
package io.picoclaw.android.feature.chat.voice package io.clawdroid.feature.chat.voice
import android.content.Context import android.content.Context
import android.graphics.Bitmap import android.graphics.Bitmap
import android.util.Log import android.util.Log
import io.picoclaw.android.core.domain.model.ImageAttachment import io.clawdroid.core.domain.model.ImageAttachment
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.feature.chat.voice package io.clawdroid.feature.chat.voice
import android.graphics.Bitmap import android.graphics.Bitmap

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.feature.chat.voice package io.clawdroid.feature.chat.voice
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent

View file

@ -1,9 +1,9 @@
package io.picoclaw.android.feature.chat.voice package io.clawdroid.feature.chat.voice
import android.content.Context import android.content.Context
import android.speech.tts.TextToSpeech import android.speech.tts.TextToSpeech
import android.speech.tts.UtteranceProgressListener import android.speech.tts.UtteranceProgressListener
import io.picoclaw.android.core.domain.model.TtsConfig import io.clawdroid.core.domain.model.TtsConfig
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.SupervisorJob

View file

@ -1,12 +1,12 @@
package io.picoclaw.android.feature.chat.voice package io.clawdroid.feature.chat.voice
import android.speech.SpeechRecognizer import android.speech.SpeechRecognizer
import io.picoclaw.android.core.domain.model.MessageSender import io.clawdroid.core.domain.model.MessageSender
import io.picoclaw.android.core.domain.model.MessageStatus import io.clawdroid.core.domain.model.MessageStatus
import io.picoclaw.android.core.domain.model.VoicePhase import io.clawdroid.core.domain.model.VoicePhase
import io.picoclaw.android.core.domain.usecase.ObserveMessagesUseCase import io.clawdroid.core.domain.usecase.ObserveMessagesUseCase
import io.picoclaw.android.core.domain.usecase.ObserveStatusUseCase import io.clawdroid.core.domain.usecase.ObserveStatusUseCase
import io.picoclaw.android.core.domain.usecase.SendMessageUseCase import io.clawdroid.core.domain.usecase.SendMessageUseCase
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.Job import kotlinx.coroutines.Job

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.feature.chat.voice package io.clawdroid.feature.chat.voice
import androidx.camera.view.PreviewView import androidx.camera.view.PreviewView
import androidx.camera.view.PreviewView.ImplementationMode import androidx.camera.view.PreviewView.ImplementationMode
@ -39,12 +39,12 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView import androidx.compose.ui.viewinterop.AndroidView
import io.picoclaw.android.core.domain.model.VoicePhase import io.clawdroid.core.domain.model.VoicePhase
import io.picoclaw.android.core.ui.theme.DeepBlack import io.clawdroid.core.ui.theme.DeepBlack
import io.picoclaw.android.core.ui.theme.GradientCyan import io.clawdroid.core.ui.theme.GradientCyan
import io.picoclaw.android.core.ui.theme.GradientPurple import io.clawdroid.core.ui.theme.GradientPurple
import io.picoclaw.android.core.ui.theme.TextPrimary import io.clawdroid.core.ui.theme.TextPrimary
import io.picoclaw.android.core.ui.theme.TextSecondary import io.clawdroid.core.ui.theme.TextSecondary
import com.composables.icons.lucide.R as LucideR import com.composables.icons.lucide.R as LucideR
@Composable @Composable

View file

@ -1,6 +1,6 @@
package io.picoclaw.android.feature.chat.voice package io.clawdroid.feature.chat.voice
import io.picoclaw.android.core.domain.model.VoicePhase import io.clawdroid.core.domain.model.VoicePhase
data class ChatTurn(val role: String, val text: String) data class ChatTurn(val role: String, val text: String)

View file

@ -1,4 +1,4 @@
package io.picoclaw.android.feature.chat.voice package io.clawdroid.feature.chat.voice
import androidx.compose.animation.core.LinearEasing import androidx.compose.animation.core.LinearEasing
import androidx.compose.animation.core.RepeatMode import androidx.compose.animation.core.RepeatMode
@ -17,7 +17,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.drawscope.DrawScope import androidx.compose.ui.graphics.drawscope.DrawScope
import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.graphics.drawscope.Stroke
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import io.picoclaw.android.core.domain.model.VoicePhase import io.clawdroid.core.domain.model.VoicePhase
import kotlin.math.PI import kotlin.math.PI
import kotlin.math.cos import kotlin.math.cos
import kotlin.math.sin import kotlin.math.sin

View file

@ -12,7 +12,7 @@ dependencyResolutionManagement {
mavenCentral() mavenCentral()
} }
} }
rootProject.name = "PicoClaw" rootProject.name = "ClawDroid"
include(":app") include(":app")
include(":feature:chat") include(":feature:chat")
include(":core:domain") include(":core:domain")

View file

Before

Width:  |  Height:  |  Size: 1.5 MiB

After

Width:  |  Height:  |  Size: 1.5 MiB

Some files were not shown because too many files have changed in this diff Show more