diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index 4be385b22..7cc3b0ea6 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -10,7 +10,7 @@ assignees: ''
## Quick Summary
## 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)
- **AI Model & Provider:** (e.g., GPT-4o via OpenAI / DeepSeek via SiliconFlow)
- **Operating System:** (e.g., Ubuntu 22.04 / macOS / Android Termux)
diff --git a/.github/workflows/android-build.yml b/.github/workflows/android-build.yml
index 2b7783b16..c58d271c2 100644
--- a/.github/workflows/android-build.yml
+++ b/.github/workflows/android-build.yml
@@ -52,5 +52,5 @@ jobs:
- name: Upload APK
uses: actions/upload-artifact@v4
with:
- name: picoclaw-release-apk
+ name: clawdroid-release-apk
path: android/app/build/outputs/apk/release/*.apk
diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml
index 2d1aa9ffc..daea2654b 100644
--- a/.github/workflows/docker-build.yml
+++ b/.github/workflows/docker-build.yml
@@ -10,7 +10,7 @@ on:
env:
GHCR_REGISTRY: ghcr.io
- GHCR_IMAGE_NAME: ${{ github.repository_owner }}/picoclaw
+ GHCR_IMAGE_NAME: ${{ github.repository_owner }}/clawdroid
DOCKERHUB_REGISTRY: docker.io
DOCKERHUB_IMAGE_NAME: ${{ vars.DOCKERHUB_REPOSITORY }}
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 6443af01d..8d68ae416 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -147,11 +147,11 @@ jobs:
- name: Rename APK with version
run: |
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
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh release upload "${{ inputs.tag }}" \
- app/build/outputs/apk/release/picoclaw-${{ inputs.tag }}.apk
+ app/build/outputs/apk/release/clawdroid-${{ inputs.tag }}.apk
diff --git a/.gitignore b/.gitignore
index 08783ba40..35c0fd75f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,14 +8,14 @@ build/
*.dylib
*.test
*.out
-/picoclaw
-/picoclaw-test
-cmd/picoclaw/workspace
+/clawdroid
+/clawdroid-test
+cmd/clawdroid/workspace
-# Picoclaw specific
+# ClawDroid specific
-# PicoClaw
-.picoclaw/
+# ClawDroid
+.clawdroid/
config.json
sessions/
build/
diff --git a/.goreleaser.yaml b/.goreleaser.yaml
index 368a0f06b..8d8812204 100644
--- a/.goreleaser.yaml
+++ b/.goreleaser.yaml
@@ -5,10 +5,10 @@ version: 2
before:
hooks:
- go mod tidy
- - go generate ./cmd/picoclaw
+ - go generate ./cmd/clawdroid
builds:
- - id: picoclaw
+ - id: clawdroid
env:
- CGO_ENABLED=0
goos:
@@ -23,18 +23,18 @@ builds:
- s390x
- mips64
- arm
- main: ./cmd/picoclaw
+ main: ./cmd/clawdroid
ignore:
- goos: windows
goarch: arm
dockers_v2:
- - id: picoclaw
+ - id: clawdroid
dockerfile: Dockerfile.goreleaser
ids:
- - picoclaw
+ - clawdroid
images:
- - "ghcr.io/{{ .Env.GITHUB_REPOSITORY_OWNER }}/picoclaw"
+ - "ghcr.io/{{ .Env.GITHUB_REPOSITORY_OWNER }}/clawdroid"
- "docker.io/{{ .Env.DOCKERHUB_IMAGE_NAME }}"
tags:
- "{{ .Tag }}"
diff --git a/Dockerfile b/Dockerfile
index dd98ec0bd..bb1f55454 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,5 +1,5 @@
# ============================================================
-# Stage 1: Build the picoclaw binary
+# Stage 1: Build the clawdroid binary
# ============================================================
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
# 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
-RUN /usr/local/bin/picoclaw onboard
+# Create clawdroid home directory
+RUN /usr/local/bin/clawdroid onboard
-ENTRYPOINT ["picoclaw"]
+ENTRYPOINT ["clawdroid"]
CMD ["gateway"]
diff --git a/Dockerfile.goreleaser b/Dockerfile.goreleaser
index 0cdc8c6bd..bcc1c4e82 100644
--- a/Dockerfile.goreleaser
+++ b/Dockerfile.goreleaser
@@ -4,7 +4,7 @@ ARG TARGETPLATFORM
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"]
diff --git a/Makefile b/Makefile
index ebc252ae6..09e0823d4 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
.PHONY: all build install uninstall clean help test
# Build variables
-BINARY_NAME=picoclaw
+BINARY_NAME=clawdroid
BUILD_DIR=build
CMD_DIR=cmd/$(BINARY_NAME)
MAIN_GO=$(CMD_DIR)/main.go
@@ -24,8 +24,8 @@ INSTALL_BIN_DIR=$(INSTALL_PREFIX)/bin
INSTALL_MAN_DIR=$(INSTALL_PREFIX)/share/man/man1
# Workspace and Skills
-PICOCLAW_HOME?=$(HOME)/.picoclaw
-WORKSPACE_DIR?=$(PICOCLAW_HOME)/workspace
+CLAWDROID_HOME?=$(HOME)/.clawdroid
+WORKSPACE_DIR?=$(CLAWDROID_HOME)/workspace
WORKSPACE_SKILLS_DIR=$(WORKSPACE_DIR)/skills
BUILTIN_SKILLS_DIR=$(CURDIR)/skills
@@ -71,7 +71,7 @@ generate:
@$(GO) generate ./...
@echo "Run generate complete"
-## build: Build the picoclaw binary for current platform
+## build: Build the clawdroid binary for current platform
build: generate
@echo "Building $(BINARY_NAME) for $(PLATFORM)/$(ARCH)..."
@mkdir -p $(BUILD_DIR)
@@ -79,7 +79,7 @@ build: generate
@echo "Build complete: $(BINARY_PATH)"
@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
@echo "Building for multiple platforms..."
@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)
@echo "All builds complete"
-## install: Install picoclaw to system and copy builtin skills
+## install: Install clawdroid to system and copy builtin skills
install: build
@echo "Installing $(BINARY_NAME)..."
@mkdir -p $(INSTALL_BIN_DIR)
@@ -99,7 +99,7 @@ install: build
@echo "Installed binary to $(INSTALL_BIN_DIR)/$(BINARY_NAME)"
@echo "Installation complete!"
-## uninstall: Remove picoclaw from system
+## uninstall: Remove clawdroid from system
uninstall:
@echo "Uninstalling $(BINARY_NAME)..."
@rm -f $(INSTALL_BIN_DIR)/$(BINARY_NAME)
@@ -107,11 +107,11 @@ uninstall:
@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'"
-## uninstall-all: Remove picoclaw and all data
+## uninstall-all: Remove clawdroid and all data
uninstall-all:
@echo "Removing workspace and skills..."
- @rm -rf $(PICOCLAW_HOME)
- @echo "Removed workspace: $(PICOCLAW_HOME)"
+ @rm -rf $(CLAWDROID_HOME)
+ @echo "Removed workspace: $(CLAWDROID_HOME)"
@echo "Complete uninstallation done!"
## clean: Remove build artifacts
@@ -145,13 +145,13 @@ update-deps:
## check: Run vet, fmt, and verify dependencies
check: deps fmt vet test
-## run: Build and run picoclaw
+## run: Build and run clawdroid
run: build
@$(BUILD_DIR)/$(BINARY_NAME) $(ARGS)
## help: Show this help message
help:
- @echo "picoclaw Makefile"
+ @echo "clawdroid Makefile"
@echo ""
@echo "Usage:"
@echo " make [target]"
@@ -167,7 +167,7 @@ help:
@echo ""
@echo "Environment Variables:"
@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 ""
@echo "Current Configuration:"
diff --git a/README.ja.md b/README.ja.md
index e33b312f9..e4245cf96 100644
--- a/README.ja.md
+++ b/README.ja.md
@@ -1,7 +1,7 @@
-

+

-
PicoClaw: Go で書かれた超効率 AI アシスタント
+
ClawDroid: Go で書かれた超効率 AI アシスタント
$10 ハードウェア · 10MB RAM · 1秒起動 · 皮皮虾,我们走!
@@ -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% 安い!
@@ -27,7 +27,7 @@
|
-
+
|
@@ -39,7 +39,7 @@
## 📢 ニュース
-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 生成、人間によるレビュー付き。
-| | OpenClaw | NanoBot | **PicoClaw** |
+| | OpenClaw | NanoBot | **ClawDroid** |
| --- | --- | --- |--- |
| **言語** | TypeScript | Python | **Go** |
| **RAM** | >1GB |>100MB| **< 10MB** |
| **起動時間**(0.8GHz コア) | >500秒 | >30秒 | **<1秒** |
| **コスト** | Mac Mini 599$ | 大半の Linux SBC ~50$ |**あらゆる Linux ボード****最安 10$** |
-
+
## 🦾 デモンストレーション
@@ -71,9 +71,9 @@
| 🔎 Web 検索&学習 |
- 
|
- 
|
- 
|
+ 
|
+ 
|
+ 
|
| 開発 · デプロイ · スケール |
@@ -83,7 +83,7 @@
### 🐜 革新的な省フットプリントデプロイ
-PicoClaw はほぼすべての Linux デバイスにデプロイできます!
+ClawDroid はほぼすべての Linux デバイスにデプロイできます!
- $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) サーバー自動メンテナンスに
@@ -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
-git clone https://github.com/sipeed/picoclaw.git
+git clone https://github.com/KarakuriAgent/clawdroid.git
-cd picoclaw
+cd clawdroid
make deps
# ビルド(インストール不要)
@@ -119,12 +119,12 @@ make install
## 🐳 Docker Compose
-Docker Compose を使えば、ローカルにインストールせずに PicoClaw を実行できます。
+Docker Compose を使えば、ローカルにインストールせずに ClawDroid を実行できます。
```bash
# 1. リポジトリをクローン
-git clone https://github.com/sipeed/picoclaw.git
-cd picoclaw
+git clone https://github.com/KarakuriAgent/clawdroid.git
+cd clawdroid
# 2. API キーを設定
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
# 4. ログ確認
-docker compose logs -f picoclaw-gateway
+docker compose logs -f clawdroid-gateway
# 5. 停止
docker compose --profile gateway down
@@ -144,10 +144,10 @@ docker compose --profile gateway down
```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]
-> `~/.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)
> Web 検索は **任意** です - 無料の [Brave Search API](https://brave.com/search/api) (月 2000 クエリ無料)
**1. 初期化**
```bash
-picoclaw onboard
+clawdroid onboard
```
-**2. 設定** (`~/.picoclaw/config.json`)
+**2. 設定** (`~/.clawdroid/config.json`)
```json
{
"agents": {
"defaults": {
- "workspace": "~/.picoclaw/workspace",
+ "workspace": "~/.clawdroid/workspace",
"model": "glm-4.7",
"max_tokens": 8192,
"temperature": 0.7,
@@ -214,7 +214,7 @@ picoclaw onboard
**3. チャット**
```bash
-picoclaw agent -m "What is 2+2?"
+clawdroid agent -m "What is 2+2?"
```
これだけです!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. 起動**
```bash
-picoclaw gateway
+clawdroid gateway
```
@@ -305,7 +305,7 @@ picoclaw gateway
**6. 起動**
```bash
-picoclaw gateway
+clawdroid gateway
```
@@ -338,7 +338,7 @@ picoclaw gateway
**3. 起動**
```bash
-picoclaw gateway
+clawdroid gateway
```
@@ -372,7 +372,7 @@ picoclaw gateway
**3. 起動**
```bash
-picoclaw gateway
+clawdroid gateway
```
@@ -418,25 +418,25 @@ LINE Developers Console で Webhook URL を `https://あなたのドメイン/we
**4. 起動**
```bash
-picoclaw gateway
+clawdroid gateway
```
> グループチャットでは @メンション時のみ応答します。返信は元メッセージを引用する形式です。
-> **Docker Compose**: `picoclaw-gateway` サービスに `ports: ["18791:18791"]` を追加して Webhook ポートを公開してください。
+> **Docker Compose**: `clawdroid-gateway` サービスに `ports: ["18791:18791"]` を追加して Webhook ポートを公開してください。
## ⚙️ 設定
-設定ファイル: `~/.picoclaw/config.json`
+設定ファイル: `~/.clawdroid/config.json`
### ワークスペース構成
-PicoClaw は設定されたワークスペース(デフォルト: `~/.picoclaw/workspace`)にデータを保存します:
+ClawDroid は設定されたワークスペース(デフォルト: `~/.clawdroid/workspace`)にデータを保存します:
```
-~/.picoclaw/workspace/
+~/.clawdroid/workspace/
├── sessions/ # 会話セッションと履歴
├── memory/ # 長期メモリ(MEMORY.md)
├── state/ # 永続状態(最後のチャネルなど)
@@ -452,7 +452,7 @@ PicoClaw は設定されたワークスペース(デフォルト: `~/.picoclaw
### 🔒 セキュリティサンドボックス
-PicoClaw はデフォルトでサンドボックス環境で実行されます。エージェントは設定されたワークスペース内のファイルにのみアクセスし、コマンドを実行できます。
+ClawDroid はデフォルトでサンドボックス環境で実行されます。エージェントは設定されたワークスペース内のファイルにのみアクセスし、コマンドを実行できます。
#### デフォルト設定
@@ -460,7 +460,7 @@ PicoClaw はデフォルトでサンドボックス環境で実行されます
{
"agents": {
"defaults": {
- "workspace": "~/.picoclaw/workspace",
+ "workspace": "~/.clawdroid/workspace",
"restrict_to_workspace": true
}
}
@@ -469,7 +469,7 @@ PicoClaw はデフォルトでサンドボックス環境で実行されます
| オプション | デフォルト | 説明 |
|-----------|-----------|------|
-| `workspace` | `~/.picoclaw/workspace` | エージェントの作業ディレクトリ |
+| `workspace` | `~/.clawdroid/workspace` | エージェントの作業ディレクトリ |
| `restrict_to_workspace` | `true` | ファイル/コマンドアクセスをワークスペースに制限 |
#### 保護対象ツール
@@ -525,7 +525,7 @@ PicoClaw はデフォルトでサンドボックス環境で実行されます
**方法2: 環境変数**
```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
# 定期タスク
@@ -615,8 +615,8 @@ HEARTBEAT_OK 応答 ユーザーが直接結果を受け取る
| `interval` | `30` | チェック間隔(分)、最小5分 |
**環境変数:**
-- `PICOCLAW_HEARTBEAT_ENABLED=false` で無効化
-- `PICOCLAW_HEARTBEAT_INTERVAL=60` で間隔変更
+- `CLAWDROID_HEARTBEAT_ENABLED=false` で無効化
+- `CLAWDROID_HEARTBEAT_INTERVAL=60` で間隔変更
### 基本設定
@@ -647,7 +647,7 @@ HEARTBEAT_OK 応答 ユーザーが直接結果を受け取る
3. **実行**
```bash
- picoclaw agent -m "Hello"
+ clawdroid agent -m "Hello"
```
@@ -712,11 +712,11 @@ HEARTBEAT_OK 応答 ユーザーが直接結果を受け取る
| コマンド | 説明 |
|---------|------|
-| `picoclaw onboard` | 設定&ワークスペースの初期化 |
-| `picoclaw agent -m "..."` | エージェントとチャット |
-| `picoclaw agent` | インタラクティブチャットモード |
-| `picoclaw gateway` | ゲートウェイを起動 |
-| `picoclaw status` | ステータスを表示 |
+| `clawdroid onboard` | 設定&ワークスペースの初期化 |
+| `clawdroid agent -m "..."` | エージェントとチャット |
+| `clawdroid agent` | インタラクティブチャットモード |
+| `clawdroid gateway` | ゲートウェイを起動 |
+| `clawdroid status` | ステータスを表示 |
## 🤝 コントリビュート&ロードマップ
@@ -724,18 +724,18 @@ PR 歓迎!コードベースは意図的に小さく読みやすくしてい
Discord: https://discord.gg/V4sAZ9XWpN
-
+
## 🐛 トラブルシューティング
### Web 検索で「API 配置问题」と表示される
-検索 API キーをまだ設定していない場合、これは正常です。PicoClaw は手動検索用の便利なリンクを提供します。
+検索 API キーをまだ設定していない場合、これは正常です。ClawDroid は手動検索用の便利なリンクを提供します。
Web 検索を有効にするには:
1. [https://brave.com/search/api](https://brave.com/search/api) で無料の API キーを取得(月 2000 クエリ無料)
-2. `~/.picoclaw/config.json` に追加:
+2. `~/.clawdroid/config.json` に追加:
```json
{
"tools": {
@@ -755,7 +755,7 @@ Web 検索を有効にするには:
### Telegram Bot で「Conflict: terminated by other getUpdates」と表示される
-別のインスタンスが実行中の場合に発生します。`picoclaw gateway` が 1 つだけ実行されていることを確認してください。
+別のインスタンスが実行中の場合に発生します。`clawdroid gateway` が 1 つだけ実行されていることを確認してください。
---
diff --git a/README.md b/README.md
index 0a9dacce6..897cc8f79 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
-

+

-
PicoClaw: Ultra-Efficient AI Assistant in Go
+
ClawDroid: Ultra-Efficient AI Assistant in Go
$10 Hardware · 10MB RAM · 1s Boot · 皮皮虾,我们走!
@@ -10,7 +10,7 @@
-

+
-SipeedIO-black?style=flat&logo=x&logoColor=white)
@@ -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!
@@ -27,7 +27,7 @@
|
-
+
|
@@ -41,20 +41,20 @@
> [!CAUTION]
> **🚨 SECURITY & OFFICIAL CHANNELS / 安全声明**
>
-> * **NO CRYPTO:** PicoClaw 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)**
+> * **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 **[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:** picoclaw 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 (10–20MB) in the latest versions. We plan to prioritize resource optimization as soon as the current feature set reaches a stable state.
+> * **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:** clawdroid has recently merged a lot of PRs, which may result in a larger memory footprint (10–20MB) in the latest versions. We plan to prioritize resource optimization as soon as the current feature set reaches a stable state.
## 📢 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 can’t 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 can’t 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.
-2026-02-09 🎉 PicoClaw Launched! Built in 1 day to bring AI Agents to $10 hardware with <10MB RAM. 🦐 PicoClaw,Let's Go!
+2026-02-09 🎉 ClawDroid Launched! Built in 1 day to bring AI Agents to $10 hardware with <10MB RAM. 🦐 ClawDroid,Let's Go!
## ✨ Features
@@ -68,14 +68,14 @@
🤖 **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** |
| **RAM** | >1GB | >100MB | **< 10MB** |
| **Startup**(0.8GHz core) | >500s | >30s | **<1s** |
| **Cost** | Mac Mini 599$ | Most Linux SBC ~50$ | **Any Linux Board****As low as 10$** |
-
+
## 🦾 Demonstration
@@ -88,9 +88,9 @@
| 🔎 Web Search & Learning |
- 
|
- 
|
- 
|
+ 
|
+ 
|
+ 
|
| Develop • Deploy • Scale |
@@ -101,7 +101,7 @@
### 🐜 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
- $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
-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)
```bash
-git clone https://github.com/sipeed/picoclaw.git
+git clone https://github.com/KarakuriAgent/clawdroid.git
-cd picoclaw
+cd clawdroid
make deps
# Build, no need to install
@@ -137,12 +137,12 @@ make install
## 🐳 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
# 1. Clone this repo
-git clone https://github.com/sipeed/picoclaw.git
-cd picoclaw
+git clone https://github.com/KarakuriAgent/clawdroid.git
+cd clawdroid
# 2. Set your API keys
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
# 4. Check logs
-docker compose logs -f picoclaw-gateway
+docker compose logs -f clawdroid-gateway
# 5. Stop
docker compose --profile gateway down
@@ -162,10 +162,10 @@ docker compose --profile gateway down
```bash
# 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
-docker compose run --rm picoclaw-agent
+docker compose run --rm clawdroid-agent
```
### Rebuild
@@ -178,23 +178,23 @@ docker compose --profile gateway up -d
### 🚀 Quick Start
> [!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)
> 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**
```bash
-picoclaw onboard
+clawdroid onboard
```
-**2. Configure** (`~/.picoclaw/config.json`)
+**2. Configure** (`~/.clawdroid/config.json`)
```json
{
"agents": {
"defaults": {
- "workspace": "~/.picoclaw/workspace",
+ "workspace": "~/.clawdroid/workspace",
"model": "glm-4.7",
"max_tokens": 8192,
"temperature": 0.7,
@@ -233,7 +233,7 @@ picoclaw onboard
**4. Chat**
```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.
@@ -242,7 +242,7 @@ That's it! You have a working AI assistant in 2 minutes.
## 💬 Chat Apps
-Talk to your picoclaw through Telegram, Discord, DingTalk, or LINE
+Talk to your clawdroid through Telegram, Discord, DingTalk, or LINE
| Channel | Setup |
| ------------ | ---------------------------------- |
@@ -280,7 +280,7 @@ Talk to your picoclaw through Telegram, Discord, DingTalk, or LINE
**3. Run**
```bash
-picoclaw gateway
+clawdroid gateway
```
@@ -328,7 +328,7 @@ picoclaw gateway
**6. Run**
```bash
-picoclaw gateway
+clawdroid gateway
```
@@ -361,7 +361,7 @@ picoclaw gateway
**3. Run**
```bash
-picoclaw gateway
+clawdroid gateway
```
@@ -395,7 +395,7 @@ picoclaw gateway
**3. Run**
```bash
-picoclaw gateway
+clawdroid gateway
```
@@ -441,31 +441,31 @@ Then set the Webhook URL in LINE Developers Console to `https://your-domain/webh
**4. Run**
```bash
-picoclaw gateway
+clawdroid gateway
```
> 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.
##
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)**
## ⚙️ Configuration
-Config file: `~/.picoclaw/config.json`
+Config file: `~/.clawdroid/config.json`
### 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
├── memory/ # Long-term memory (MEMORY.md)
├── state/ # Persistent state (last channel, etc.)
@@ -481,7 +481,7 @@ PicoClaw stores data in your configured workspace (default: `~/.picoclaw/workspa
### 🔒 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
@@ -489,7 +489,7 @@ PicoClaw runs in a sandboxed environment by default. The agent can only access f
{
"agents": {
"defaults": {
- "workspace": "~/.picoclaw/workspace",
+ "workspace": "~/.clawdroid/workspace",
"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 |
|--------|---------|-------------|
-| `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 |
#### Protected Tools
@@ -556,7 +556,7 @@ If you need the agent to access paths outside the workspace:
**Method 2: Environment variable**
```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.
@@ -575,7 +575,7 @@ All paths share the same workspace restriction — there's no way to bypass the
### 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
# Periodic Tasks
@@ -647,8 +647,8 @@ The subagent has access to tools (message, web_search, etc.) and can communicate
**Environment variables:**
-* `PICOCLAW_HEARTBEAT_ENABLED=false` to disable
-* `PICOCLAW_HEARTBEAT_INTERVAL=60` to change interval
+* `CLAWDROID_HEARTBEAT_ENABLED=false` to disable
+* `CLAWDROID_HEARTBEAT_INTERVAL=60` to change interval
### Providers
@@ -678,7 +678,7 @@ The subagent has access to tools (message, web_search, etc.) and can communicate
{
"agents": {
"defaults": {
- "workspace": "~/.picoclaw/workspace",
+ "workspace": "~/.clawdroid/workspace",
"model": "glm-4.7",
"max_tokens": 8192,
"temperature": 0.7,
@@ -697,7 +697,7 @@ The subagent has access to tools (message, web_search, etc.) and can communicate
**3. Run**
```bash
-picoclaw agent -m "Hello"
+clawdroid agent -m "Hello"
```
@@ -775,23 +775,23 @@ picoclaw agent -m "Hello"
| Command | Description |
| ------------------------- | ----------------------------- |
-| `picoclaw onboard` | Initialize config & workspace |
-| `picoclaw agent -m "..."` | Chat with the agent |
-| `picoclaw agent` | Interactive chat mode |
-| `picoclaw gateway` | Start the gateway |
-| `picoclaw status` | Show status |
-| `picoclaw cron list` | List all scheduled jobs |
-| `picoclaw cron add ...` | Add a scheduled job |
+| `clawdroid onboard` | Initialize config & workspace |
+| `clawdroid agent -m "..."` | Chat with the agent |
+| `clawdroid agent` | Interactive chat mode |
+| `clawdroid gateway` | Start the gateway |
+| `clawdroid status` | Show status |
+| `clawdroid cron list` | List all scheduled jobs |
+| `clawdroid cron add ...` | Add a scheduled job |
### 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
* **Recurring tasks**: "Remind me every 2 hours" → triggers every 2 hours
* **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
@@ -805,20 +805,20 @@ User Groups:
discord:
-
+
## 🐛 Troubleshooting
### 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:
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).
-Add the key to `~/.picoclaw/config.json` if using Brave:
+Add the key to `~/.clawdroid/config.json` if using Brave:
```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"
-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.
---
diff --git a/README.zh.md b/README.zh.md
index 2ca2987bb..62e27d417 100644
--- a/README.zh.md
+++ b/README.zh.md
@@ -1,7 +1,7 @@
-

+

-
PicoClaw: 基于Go语言的超高效 AI 助手
+
ClawDroid: 基于Go语言的超高效 AI 助手
10$硬件 · 10MB内存 · 1秒启动 · 皮皮虾,我们走!
@@ -10,7 +10,7 @@
-

+
-SipeedIO-black?style=flat&logo=x&logoColor=white)
@@ -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%!
@@ -27,7 +27,7 @@
|
-
+
|
@@ -42,20 +42,20 @@
> [!CAUTION]
> **🚨 SECURITY & OFFICIAL CHANNELS / 安全声明**
-> * **无加密货币 (NO CRYPTO):** PicoClaw **没有** 发行任何官方代币、Token 或虚拟货币。所有在 `pump.fun` 或其他交易平台上的相关声称均为 **诈骗**。
-> * **官方域名:** 唯一的官方网站是 **[picoclaw.io](https://picoclaw.io)**,公司官网是 **[sipeed.com](https://sipeed.com)**。
+> * **无加密货币 (NO CRYPTO):** ClawDroid **没有** 发行任何官方代币、Token 或虚拟货币。所有在 `pump.fun` 或其他交易平台上的相关声称均为 **诈骗**。
+> * **官方域名:** 唯一的官方网站是 **[clawdroid.io](https://clawdroid.io)**,公司官网是 **[sipeed.com](https://sipeed.com)**。
> * **警惕:** 许多 `.ai/.org/.com/.net/...` 后缀的域名被第三方抢注,请勿轻信。
-> * **注意:** picoclaw正在初期的快速功能开发阶段,可能有尚未修复的网络安全问题,在1.0正式版发布前,请不要将其部署到生产环境中
-> * **注意:** picoclaw最近合并了大量PRs,近期版本可能内存占用较大(10~20MB),我们将在功能较为收敛后进行资源占用优化.
+> * **注意:** clawdroid正在初期的快速功能开发阶段,可能有尚未修复的网络安全问题,在1.0正式版发布前,请不要将其部署到生产环境中
+> * **注意:** clawdroid最近合并了大量PRs,近期版本可能内存占用较大(10~20MB),我们将在功能较为收敛后进行资源占用优化.
## 📢 新闻 (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)。我们将在接下来的周会上进行审查和优先级排序。
-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)”微调。
-| | OpenClaw | NanoBot | **PicoClaw** |
+| | OpenClaw | NanoBot | **ClawDroid** |
| --- | --- | --- | --- |
| **语言** | TypeScript | Python | **Go** |
| **RAM** | >1GB | >100MB | **< 10MB** |
| **启动时间**(0.8GHz core) | >500s | >30s | **<1s** |
| **成本** | Mac Mini $599 | 大多数 Linux 开发板 ~$50 | **任意 Linux 开发板****低至 $10** |
-
+
## 🦾 演示
@@ -89,9 +89,9 @@
| 🔎 网络搜索与学习 |
-
|
-
|
-
|
+
|
+
|
+
|
| 开发 • 部署 • 扩展 |
@@ -102,7 +102,7 @@
### 🐜 创新的低占用部署
-PicoClaw 几乎可以部署在任何 Linux 设备上!
+ClawDroid 几乎可以部署在任何 Linux 设备上!
* $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),用于自动化服务器运维。
@@ -116,14 +116,14 @@ PicoClaw 几乎可以部署在任何 Linux 设备上!
### 使用预编译二进制文件安装
-从 [Release 页面](https://github.com/sipeed/picoclaw/releases) 下载适用于您平台的固件。
+从 [Release 页面](https://github.com/KarakuriAgent/clawdroid/releases) 下载适用于您平台的固件。
### 从源码安装(获取最新特性,开发推荐)
```bash
-git clone https://github.com/sipeed/picoclaw.git
+git clone https://github.com/KarakuriAgent/clawdroid.git
-cd picoclaw
+cd clawdroid
make deps
# 构建(无需安装)
@@ -139,12 +139,12 @@ make install
## 🐳 Docker Compose
-您也可以使用 Docker Compose 运行 PicoClaw,无需在本地安装任何环境。
+您也可以使用 Docker Compose 运行 ClawDroid,无需在本地安装任何环境。
```bash
# 1. 克隆仓库
-git clone https://github.com/sipeed/picoclaw.git
-cd picoclaw
+git clone https://github.com/KarakuriAgent/clawdroid.git
+cd clawdroid
# 2. 设置 API Key
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
# 4. 查看日志
-docker compose logs -f picoclaw-gateway
+docker compose logs -f clawdroid-gateway
# 5. 停止
docker compose --profile gateway down
@@ -165,10 +165,10 @@ docker compose --profile gateway down
```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]
-> 在 `~/.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)
> 网络搜索是 **可选的** - 获取免费的 [Brave Search API](https://brave.com/search/api) (每月 2000 次免费查询)
**1. 初始化 (Initialize)**
```bash
-picoclaw onboard
+clawdroid onboard
```
-**2. 配置 (Configure)** (`~/.picoclaw/config.json`)
+**2. 配置 (Configure)** (`~/.clawdroid/config.json`)
```json
{
"agents": {
"defaults": {
- "workspace": "~/.picoclaw/workspace",
+ "workspace": "~/.clawdroid/workspace",
"model": "glm-4.7",
"max_tokens": 8192,
"temperature": 0.7,
@@ -235,7 +235,7 @@ picoclaw onboard
**4. 对话 (Chat)**
```bash
-picoclaw agent -m "2+2 等于几?"
+clawdroid agent -m "2+2 等于几?"
```
@@ -245,7 +245,7 @@ picoclaw agent -m "2+2 等于几?"
## 💬 聊天应用集成 (Chat Apps)
-通过 Telegram, Discord 或钉钉与您的 PicoClaw 对话。
+通过 Telegram, Discord 或钉钉与您的 ClawDroid 对话。
| 渠道 | 设置难度 |
| --- | --- |
@@ -283,7 +283,7 @@ picoclaw agent -m "2+2 等于几?"
**3. 运行**
```bash
-picoclaw gateway
+clawdroid gateway
```
@@ -333,7 +333,7 @@ picoclaw gateway
**6. 运行**
```bash
-picoclaw gateway
+clawdroid gateway
```
@@ -368,7 +368,7 @@ picoclaw gateway
**3. 运行**
```bash
-picoclaw gateway
+clawdroid gateway
```
@@ -404,7 +404,7 @@ picoclaw gateway
**3. 运行**
```bash
-picoclaw gateway
+clawdroid gateway
```
@@ -412,20 +412,20 @@ picoclaw gateway
##
加入 Agent 社交网络
-只需通过 CLI 或任何集成的聊天应用发送一条消息,即可将 PicoClaw 连接到 Agent 社交网络。
+只需通过 CLI 或任何集成的聊天应用发送一条消息,即可将 ClawDroid 连接到 Agent 社交网络。
**阅读 `https://clawdchat.ai/skill.md` 并按照说明加入 [ClawdChat.ai**](https://clawdchat.ai)
## ⚙️ 配置详解
-配置文件路径: `~/.picoclaw/config.json`
+配置文件路径: `~/.clawdroid/config.json`
### 工作区布局 (Workspace Layout)
-PicoClaw 将数据存储在您配置的工作区中(默认:`~/.picoclaw/workspace`):
+ClawDroid 将数据存储在您配置的工作区中(默认:`~/.clawdroid/workspace`):
```
-~/.picoclaw/workspace/
+~/.clawdroid/workspace/
├── sessions/ # 对话会话和历史
├── memory/ # 长期记忆 (MEMORY.md)
├── state/ # 持久化状态 (最后一次频道等)
@@ -442,7 +442,7 @@ PicoClaw 将数据存储在您配置的工作区中(默认:`~/.picoclaw/work
### 心跳 / 周期性任务 (Heartbeat)
-PicoClaw 可以自动执行周期性任务。在工作区创建 `HEARTBEAT.md` 文件:
+ClawDroid 可以自动执行周期性任务。在工作区创建 `HEARTBEAT.md` 文件:
```markdown
# Periodic Tasks
@@ -518,8 +518,8 @@ Agent 读取 HEARTBEAT.md
**环境变量:**
-* `PICOCLAW_HEARTBEAT_ENABLED=false` 禁用
-* `PICOCLAW_HEARTBEAT_INTERVAL=60` 更改间隔
+* `CLAWDROID_HEARTBEAT_ENABLED=false` 禁用
+* `CLAWDROID_HEARTBEAT_INTERVAL=60` 更改间隔
### 提供商 (Providers)
@@ -549,7 +549,7 @@ Agent 读取 HEARTBEAT.md
{
"agents": {
"defaults": {
- "workspace": "~/.picoclaw/workspace",
+ "workspace": "~/.clawdroid/workspace",
"model": "glm-4.7",
"max_tokens": 8192,
"temperature": 0.7,
@@ -569,7 +569,7 @@ Agent 读取 HEARTBEAT.md
**3. 运行**
```bash
-picoclaw agent -m "你好"
+clawdroid agent -m "你好"
```
@@ -643,23 +643,23 @@ picoclaw agent -m "你好"
| 命令 | 描述 |
| --- | --- |
-| `picoclaw onboard` | 初始化配置和工作区 |
-| `picoclaw agent -m "..."` | 与 Agent 对话 |
-| `picoclaw agent` | 交互式聊天模式 |
-| `picoclaw gateway` | 启动网关 (Gateway) |
-| `picoclaw status` | 显示状态 |
-| `picoclaw cron list` | 列出所有定时任务 |
-| `picoclaw cron add ...` | 添加定时任务 |
+| `clawdroid onboard` | 初始化配置和工作区 |
+| `clawdroid agent -m "..."` | 与 Agent 对话 |
+| `clawdroid agent` | 交互式聊天模式 |
+| `clawdroid gateway` | 启动网关 (Gateway) |
+| `clawdroid status` | 显示状态 |
+| `clawdroid cron list` | 列出所有定时任务 |
+| `clawdroid cron add ...` | 添加定时任务 |
### 定时任务 / 提醒 (Scheduled Tasks)
-PicoClaw 通过 `cron` 工具支持定时提醒和重复任务:
+ClawDroid 通过 `cron` 工具支持定时提醒和重复任务:
* **一次性提醒**: "Remind me in 10 minutes" (10分钟后提醒我) → 10分钟后触发一次
* **重复任务**: "Remind me every 2 hours" (每2小时提醒我) → 每2小时触发
* **Cron 表达式**: "Remind me at 9am daily" (每天上午9点提醒我) → 使用 cron 表达式
-任务存储在 `~/.picoclaw/workspace/cron/` 中并自动处理。
+任务存储在 `~/.clawdroid/workspace/cron/` 中并自动处理。
## 🤝 贡献与路线图 (Roadmap)
@@ -673,18 +673,18 @@ PicoClaw 通过 `cron` 工具支持定时提醒和重复任务:
Discord: [https://discord.gg/V4sAZ9XWpN](https://discord.gg/V4sAZ9XWpN)
-
+
## 🐛 疑难解答 (Troubleshooting)
### 网络搜索提示 "API 配置问题"
-如果您尚未配置搜索 API Key,这是正常的。PicoClaw 会提供手动搜索的帮助链接。
+如果您尚未配置搜索 API Key,这是正常的。ClawDroid 会提供手动搜索的帮助链接。
启用网络搜索:
1. 在 [https://brave.com/search/api](https://brave.com/search/api) 获取免费 API Key (每月 2000 次免费查询)
-2. 添加到 `~/.picoclaw/config.json`:
+2. 添加到 `~/.clawdroid/config.json`:
```json
{
"tools": {
@@ -707,7 +707,7 @@ Discord: [https://discord.gg/V4sAZ9XWpN](https://discord.gg/V4sAZ9XWpN)
### Telegram bot 提示 "Conflict: terminated by other getUpdates"
-这表示有另一个机器人实例正在运行。请确保同一时间只有一个 `picoclaw gateway` 进程在运行。
+这表示有另一个机器人实例正在运行。请确保同一时间只有一个 `clawdroid gateway` 进程在运行。
---
diff --git a/ROADMAP.md b/ROADMAP.md
index 8c5c0e252..4765374c9 100644
--- a/ROADMAP.md
+++ b/ROADMAP.md
@@ -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
@@ -7,9 +7,9 @@
## 🚀 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.
* **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.
@@ -42,7 +42,7 @@
*Connect every model, reach every platform.*
* **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).
* **Online Models**: Continued support for frontier closed-source models.
@@ -50,11 +50,11 @@
* **Channel**
* **IM Matrix**: QQ, WeChat (Work), DingTalk, Feishu (Lark), Telegram, Discord, WhatsApp, LINE, Slack, Email, KOOK, Signal, ...
* **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**
- * [**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.*
* **Operations**
- * [**MCP Support**](https://github.com/sipeed/picoclaw/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.
- * [**Mobile Operation**](https://github.com/sipeed/picoclaw/issues/292): Android device control (similar to BotDrop).
+ * [**MCP Support**](https://github.com/KarakuriAgent/clawdroid/issues/290): Native support for the **Model Context Protocol (MCP)**.
+ * [**Browser Automation**](https://github.com/KarakuriAgent/clawdroid/issues/293): Headless browser control via CDP (Chrome DevTools Protocol) or ActionBook.
+ * [**Mobile Operation**](https://github.com/KarakuriAgent/clawdroid/issues/292): Android device control (similar to BotDrop).
* **Multi-Agent Collaboration**
- * [**Basic Multi-Agent**](https://github.com/sipeed/picoclaw/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).
- * [**Swarm Mode**](https://github.com/sipeed/picoclaw/issues/284): Collaboration between multiple PicoClaw instances on the same network.
- * [**AIEOS**](https://github.com/sipeed/picoclaw/issues/296): Exploring AI-Native Operating System interaction paradigms.
+ * [**Basic Multi-Agent**](https://github.com/KarakuriAgent/clawdroid/issues/294) implement
+ * [**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/KarakuriAgent/clawdroid/issues/284): Collaboration between multiple ClawDroid instances on the same network.
+ * [**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.*
-* [**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.
@@ -104,7 +104,7 @@
## 🎨 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."
diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts
index e1c79c035..ff754fdc5 100644
--- a/android/app/build.gradle.kts
+++ b/android/app/build.gradle.kts
@@ -14,11 +14,11 @@ val keystoreProperties = Properties().apply {
}
android {
- namespace = "io.picoclaw.android"
+ namespace = "io.clawdroid"
compileSdk = libs.versions.android.compileSdk.get().toInt()
defaultConfig {
- applicationId = "io.picoclaw.android"
+ applicationId = "io.clawdroid"
minSdk = libs.versions.android.minSdk.get().toInt()
targetSdk = libs.versions.android.targetSdk.get().toInt()
versionCode = 1
diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro
index 715b8ab86..6f6485a31 100644
--- a/android/app/proguard-rules.pro
+++ b/android/app/proguard-rules.pro
@@ -12,24 +12,24 @@
*** INSTANCE;
kotlinx.serialization.KSerializer serializer(...);
}
--keepclasseswithmembers class io.picoclaw.android.** {
+-keepclasseswithmembers class io.clawdroid.** {
kotlinx.serialization.KSerializer serializer(...);
}
# Keep generated $$serializer classes
--keepclassmembers class io.picoclaw.android.**$$serializer {
+-keepclassmembers class io.clawdroid.**$$serializer {
*** INSTANCE;
*;
}
# 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
# ========================
--keepclassmembers enum io.picoclaw.android.core.domain.model.MessageSender { *; }
--keepclassmembers enum io.picoclaw.android.core.domain.model.MessageStatus { *; }
+-keepclassmembers enum io.clawdroid.core.domain.model.MessageSender { *; }
+-keepclassmembers enum io.clawdroid.core.domain.model.MessageStatus { *; }
# ========================
# Ktor
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index a08d0287f..532f88694 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -19,13 +19,13 @@
+ android:theme="@style/Theme.ClawDroid">
+ android:theme="@style/Theme.ClawDroid">
@@ -50,7 +50,7 @@
android:name=".receiver.AgentMessageReceiver"
android:exported="true">
-
+
@@ -84,7 +84,7 @@
android:value="AI voice assistant overlay for real-time conversation" />
diff --git a/android/app/src/main/java/io/picoclaw/android/PicoClawApp.kt b/android/app/src/main/java/io/clawdroid/ClawDroidApp.kt
similarity index 59%
rename from android/app/src/main/java/io/picoclaw/android/PicoClawApp.kt
rename to android/app/src/main/java/io/clawdroid/ClawDroidApp.kt
index 410f02d2c..2f4a8c157 100644
--- a/android/app/src/main/java/io/picoclaw/android/PicoClawApp.kt
+++ b/android/app/src/main/java/io/clawdroid/ClawDroidApp.kt
@@ -1,16 +1,16 @@
-package io.picoclaw.android
+package io.clawdroid
import android.app.Application
-import io.picoclaw.android.di.appModule
-import io.picoclaw.android.receiver.NotificationHelper
+import io.clawdroid.di.appModule
+import io.clawdroid.receiver.NotificationHelper
import org.koin.android.ext.koin.androidContext
import org.koin.core.context.startKoin
-class PicoClawApp : Application() {
+class ClawDroidApp : Application() {
override fun onCreate() {
super.onCreate()
startKoin {
- androidContext(this@PicoClawApp)
+ androidContext(this@ClawDroidApp)
modules(appModule)
}
NotificationHelper.createNotificationChannel(this)
diff --git a/android/app/src/main/java/io/picoclaw/android/MainActivity.kt b/android/app/src/main/java/io/clawdroid/MainActivity.kt
similarity index 87%
rename from android/app/src/main/java/io/picoclaw/android/MainActivity.kt
rename to android/app/src/main/java/io/clawdroid/MainActivity.kt
index babec4acd..26a7519dc 100644
--- a/android/app/src/main/java/io/picoclaw/android/MainActivity.kt
+++ b/android/app/src/main/java/io/clawdroid/MainActivity.kt
@@ -1,4 +1,4 @@
-package io.picoclaw.android
+package io.clawdroid
import android.Manifest
import android.content.pm.PackageManager
@@ -12,10 +12,10 @@ import androidx.core.content.ContextCompat
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
-import io.picoclaw.android.core.ui.theme.PicoClawTheme
-import io.picoclaw.android.feature.chat.screen.ChatScreen
-import io.picoclaw.android.feature.chat.screen.SettingsScreen
-import io.picoclaw.android.navigation.NavRoutes
+import io.clawdroid.core.ui.theme.ClawDroidTheme
+import io.clawdroid.feature.chat.screen.ChatScreen
+import io.clawdroid.feature.chat.screen.SettingsScreen
+import io.clawdroid.navigation.NavRoutes
class MainActivity : ComponentActivity() {
@@ -28,7 +28,7 @@ class MainActivity : ComponentActivity() {
requestNotificationPermissionIfNeeded()
enableEdgeToEdge()
setContent {
- PicoClawTheme {
+ ClawDroidTheme {
val navController = rememberNavController()
NavHost(navController = navController, startDestination = NavRoutes.CHAT) {
composable(NavRoutes.CHAT) {
diff --git a/android/app/src/main/java/io/picoclaw/android/PermissionRequestActivity.kt b/android/app/src/main/java/io/clawdroid/PermissionRequestActivity.kt
similarity index 94%
rename from android/app/src/main/java/io/picoclaw/android/PermissionRequestActivity.kt
rename to android/app/src/main/java/io/clawdroid/PermissionRequestActivity.kt
index ad73ff02f..2dea9dcd1 100644
--- a/android/app/src/main/java/io/picoclaw/android/PermissionRequestActivity.kt
+++ b/android/app/src/main/java/io/clawdroid/PermissionRequestActivity.kt
@@ -1,4 +1,4 @@
-package io.picoclaw.android
+package io.clawdroid
import android.content.Context
import android.content.Intent
@@ -49,7 +49,7 @@ class PermissionRequestActivity : ComponentActivity() {
companion object {
const val EXTRA_PERMISSION = "permission"
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 =
Intent(context, PermissionRequestActivity::class.java)
diff --git a/android/app/src/main/java/io/picoclaw/android/assistant/AccessibilityScreenshotSource.kt b/android/app/src/main/java/io/clawdroid/assistant/AccessibilityScreenshotSource.kt
similarity index 94%
rename from android/app/src/main/java/io/picoclaw/android/assistant/AccessibilityScreenshotSource.kt
rename to android/app/src/main/java/io/clawdroid/assistant/AccessibilityScreenshotSource.kt
index 5beb9d329..7e6d095f7 100644
--- a/android/app/src/main/java/io/picoclaw/android/assistant/AccessibilityScreenshotSource.kt
+++ b/android/app/src/main/java/io/clawdroid/assistant/AccessibilityScreenshotSource.kt
@@ -1,10 +1,10 @@
-package io.picoclaw.android.assistant
+package io.clawdroid.assistant
import android.accessibilityservice.AccessibilityService
import android.graphics.Bitmap
import android.util.Log
import android.view.Display
-import io.picoclaw.android.feature.chat.voice.ScreenshotSource
+import io.clawdroid.feature.chat.voice.ScreenshotSource
import kotlinx.coroutines.suspendCancellableCoroutine
import kotlin.coroutines.resume
diff --git a/android/app/src/main/java/io/picoclaw/android/assistant/AssistantActivity.kt b/android/app/src/main/java/io/clawdroid/assistant/AssistantActivity.kt
similarity index 97%
rename from android/app/src/main/java/io/picoclaw/android/assistant/AssistantActivity.kt
rename to android/app/src/main/java/io/clawdroid/assistant/AssistantActivity.kt
index 5d7cbd2d6..8900b4615 100644
--- a/android/app/src/main/java/io/picoclaw/android/assistant/AssistantActivity.kt
+++ b/android/app/src/main/java/io/clawdroid/assistant/AssistantActivity.kt
@@ -1,4 +1,4 @@
-package io.picoclaw.android.assistant
+package io.clawdroid.assistant
import android.Manifest
import android.content.Intent
diff --git a/android/app/src/main/java/io/picoclaw/android/assistant/AssistantService.kt b/android/app/src/main/java/io/clawdroid/assistant/AssistantService.kt
similarity index 93%
rename from android/app/src/main/java/io/picoclaw/android/assistant/AssistantService.kt
rename to android/app/src/main/java/io/clawdroid/assistant/AssistantService.kt
index 645e8b255..38da4db18 100644
--- a/android/app/src/main/java/io/picoclaw/android/assistant/AssistantService.kt
+++ b/android/app/src/main/java/io/clawdroid/assistant/AssistantService.kt
@@ -1,4 +1,4 @@
-package io.picoclaw.android.assistant
+package io.clawdroid.assistant
import android.Manifest
import android.app.Notification
@@ -50,20 +50,20 @@ import androidx.savedstate.SavedStateRegistryController
import androidx.savedstate.SavedStateRegistryOwner
import androidx.savedstate.setViewTreeSavedStateRegistryOwner
import io.ktor.client.HttpClient
-import io.picoclaw.android.PermissionRequestActivity
-import io.picoclaw.android.core.data.remote.WebSocketClient
-import io.picoclaw.android.core.data.repository.AssistantConnectionImpl
-import io.picoclaw.android.core.domain.repository.AssistantConnection
-import io.picoclaw.android.core.domain.repository.TtsSettingsRepository
-import io.picoclaw.android.core.ui.theme.PicoClawTheme
-import io.picoclaw.android.feature.chat.assistant.AssistantManager
-import io.picoclaw.android.feature.chat.assistant.AssistantPillBar
-import io.picoclaw.android.feature.chat.voice.CameraCaptureManager
-import io.picoclaw.android.feature.chat.voice.ScreenCaptureManager
-import io.picoclaw.android.feature.chat.voice.ScreenshotSource
-import io.picoclaw.android.feature.chat.voice.SpeechRecognizerWrapper
-import io.picoclaw.android.feature.chat.voice.TextToSpeechWrapper
-import io.picoclaw.android.receiver.NotificationHelper
+import io.clawdroid.PermissionRequestActivity
+import io.clawdroid.core.data.remote.WebSocketClient
+import io.clawdroid.core.data.repository.AssistantConnectionImpl
+import io.clawdroid.core.domain.repository.AssistantConnection
+import io.clawdroid.core.domain.repository.TtsSettingsRepository
+import io.clawdroid.core.ui.theme.ClawDroidTheme
+import io.clawdroid.feature.chat.assistant.AssistantManager
+import io.clawdroid.feature.chat.assistant.AssistantPillBar
+import io.clawdroid.feature.chat.voice.CameraCaptureManager
+import io.clawdroid.feature.chat.voice.ScreenCaptureManager
+import io.clawdroid.feature.chat.voice.ScreenshotSource
+import io.clawdroid.feature.chat.voice.SpeechRecognizerWrapper
+import io.clawdroid.feature.chat.voice.TextToSpeechWrapper
+import io.clawdroid.receiver.NotificationHelper
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
@@ -297,7 +297,7 @@ class AssistantService : LifecycleService(), SavedStateRegistryOwner {
ComposeView(this).apply {
setContent {
- PicoClawTheme {
+ ClawDroidTheme {
val state by assistantManager.state.collectAsState()
Box(
modifier = Modifier.fillMaxSize(),
@@ -348,7 +348,7 @@ class AssistantService : LifecycleService(), SavedStateRegistryOwner {
)
Text(
text = "画面キャプチャを使用するには、ユーザー補助の設定で" +
- " PicoClaw を有効にしてください。\n\n" +
+ " ClawDroid を有効にしてください。\n\n" +
"有効にできない場合は、アプリ情報から" +
"「制限付き設定を許可」を実行してから" +
"再度お試しください。",
@@ -410,7 +410,7 @@ class AssistantService : LifecycleService(), SavedStateRegistryOwner {
private fun buildNotification(): Notification {
return NotificationCompat.Builder(this, NotificationHelper.ASSISTANT_CHANNEL_ID)
.setSmallIcon(android.R.drawable.ic_btn_speak_now)
- .setContentTitle("PicoClaw Assistant")
+ .setContentTitle("ClawDroid Assistant")
.setContentText("Listening...")
.setPriority(NotificationCompat.PRIORITY_LOW)
.setOngoing(true)
diff --git a/android/app/src/main/java/io/picoclaw/android/assistant/PicoClawAccessibilityService.kt b/android/app/src/main/java/io/clawdroid/assistant/ClawDroidAccessibilityService.kt
similarity index 88%
rename from android/app/src/main/java/io/picoclaw/android/assistant/PicoClawAccessibilityService.kt
rename to android/app/src/main/java/io/clawdroid/assistant/ClawDroidAccessibilityService.kt
index 1e8149d5b..98ee40e92 100644
--- a/android/app/src/main/java/io/picoclaw/android/assistant/PicoClawAccessibilityService.kt
+++ b/android/app/src/main/java/io/clawdroid/assistant/ClawDroidAccessibilityService.kt
@@ -1,10 +1,10 @@
-package io.picoclaw.android.assistant
+package io.clawdroid.assistant
import android.accessibilityservice.AccessibilityService
import android.view.accessibility.AccessibilityEvent
import org.koin.android.ext.android.inject
-class PicoClawAccessibilityService : AccessibilityService() {
+class ClawDroidAccessibilityService : AccessibilityService() {
private val screenshotSource: AccessibilityScreenshotSource by inject()
private val deviceController: DeviceController by inject()
diff --git a/android/app/src/main/java/io/picoclaw/android/assistant/DeviceController.kt b/android/app/src/main/java/io/clawdroid/assistant/DeviceController.kt
similarity index 98%
rename from android/app/src/main/java/io/picoclaw/android/assistant/DeviceController.kt
rename to android/app/src/main/java/io/clawdroid/assistant/DeviceController.kt
index 23efe872b..d9b31a585 100644
--- a/android/app/src/main/java/io/picoclaw/android/assistant/DeviceController.kt
+++ b/android/app/src/main/java/io/clawdroid/assistant/DeviceController.kt
@@ -1,4 +1,4 @@
-package io.picoclaw.android.assistant
+package io.clawdroid.assistant
import android.accessibilityservice.AccessibilityService
import android.accessibilityservice.GestureDescription
diff --git a/android/app/src/main/java/io/picoclaw/android/assistant/ToolRequestHandler.kt b/android/app/src/main/java/io/clawdroid/assistant/ToolRequestHandler.kt
similarity index 98%
rename from android/app/src/main/java/io/picoclaw/android/assistant/ToolRequestHandler.kt
rename to android/app/src/main/java/io/clawdroid/assistant/ToolRequestHandler.kt
index a9a578842..558a77d7b 100644
--- a/android/app/src/main/java/io/picoclaw/android/assistant/ToolRequestHandler.kt
+++ b/android/app/src/main/java/io/clawdroid/assistant/ToolRequestHandler.kt
@@ -1,4 +1,4 @@
-package io.picoclaw.android.assistant
+package io.clawdroid.assistant
import android.content.Context
import android.content.Intent
@@ -11,9 +11,9 @@ import android.os.Build
import android.util.Base64
import android.util.Log
import android.view.accessibility.AccessibilityNodeInfo
-import io.picoclaw.android.core.data.remote.dto.ToolRequest
-import io.picoclaw.android.core.data.remote.dto.ToolResponse
-import io.picoclaw.android.feature.chat.voice.ScreenshotSource
+import io.clawdroid.core.data.remote.dto.ToolRequest
+import io.clawdroid.core.data.remote.dto.ToolResponse
+import io.clawdroid.feature.chat.voice.ScreenshotSource
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.withContext
diff --git a/android/app/src/main/java/io/picoclaw/android/di/AppModule.kt b/android/app/src/main/java/io/clawdroid/di/AppModule.kt
similarity index 63%
rename from android/app/src/main/java/io/picoclaw/android/di/AppModule.kt
rename to android/app/src/main/java/io/clawdroid/di/AppModule.kt
index 8ee267e2d..b3562cc21 100644
--- a/android/app/src/main/java/io/picoclaw/android/di/AppModule.kt
+++ b/android/app/src/main/java/io/clawdroid/di/AppModule.kt
@@ -1,35 +1,35 @@
-package io.picoclaw.android.di
+package io.clawdroid.di
import androidx.room.Room
import io.ktor.client.HttpClient
import io.ktor.client.engine.okhttp.OkHttp
import io.ktor.client.plugins.websocket.WebSockets
-import io.picoclaw.android.core.data.local.AppDatabase
-import io.picoclaw.android.assistant.AccessibilityScreenshotSource
-import io.picoclaw.android.assistant.DeviceController
-import io.picoclaw.android.core.data.local.ImageFileStorage
-import io.picoclaw.android.feature.chat.voice.ScreenshotSource
-import io.picoclaw.android.core.data.remote.WebSocketClient
-import io.picoclaw.android.assistant.ToolRequestHandler
-import io.picoclaw.android.core.data.repository.ChatRepositoryImpl
-import io.picoclaw.android.core.data.repository.TtsCatalogRepositoryImpl
-import io.picoclaw.android.core.data.repository.TtsSettingsRepositoryImpl
-import io.picoclaw.android.core.domain.repository.ChatRepository
-import io.picoclaw.android.core.domain.repository.TtsCatalogRepository
-import io.picoclaw.android.core.domain.repository.TtsSettingsRepository
-import io.picoclaw.android.core.domain.usecase.ConnectChatUseCase
-import io.picoclaw.android.core.domain.usecase.DisconnectChatUseCase
-import io.picoclaw.android.core.domain.usecase.LoadMoreMessagesUseCase
-import io.picoclaw.android.core.domain.usecase.ObserveConnectionUseCase
-import io.picoclaw.android.core.domain.usecase.ObserveMessagesUseCase
-import io.picoclaw.android.core.domain.usecase.ObserveStatusUseCase
-import io.picoclaw.android.core.domain.usecase.SendMessageUseCase
-import io.picoclaw.android.feature.chat.ChatViewModel
-import io.picoclaw.android.feature.chat.SettingsViewModel
-import io.picoclaw.android.feature.chat.voice.SpeechRecognizerWrapper
-import io.picoclaw.android.feature.chat.voice.TextToSpeechWrapper
-import io.picoclaw.android.feature.chat.voice.CameraCaptureManager
-import io.picoclaw.android.feature.chat.voice.VoiceModeManager
+import io.clawdroid.core.data.local.AppDatabase
+import io.clawdroid.assistant.AccessibilityScreenshotSource
+import io.clawdroid.assistant.DeviceController
+import io.clawdroid.core.data.local.ImageFileStorage
+import io.clawdroid.feature.chat.voice.ScreenshotSource
+import io.clawdroid.core.data.remote.WebSocketClient
+import io.clawdroid.assistant.ToolRequestHandler
+import io.clawdroid.core.data.repository.ChatRepositoryImpl
+import io.clawdroid.core.data.repository.TtsCatalogRepositoryImpl
+import io.clawdroid.core.data.repository.TtsSettingsRepositoryImpl
+import io.clawdroid.core.domain.repository.ChatRepository
+import io.clawdroid.core.domain.repository.TtsCatalogRepository
+import io.clawdroid.core.domain.repository.TtsSettingsRepository
+import io.clawdroid.core.domain.usecase.ConnectChatUseCase
+import io.clawdroid.core.domain.usecase.DisconnectChatUseCase
+import io.clawdroid.core.domain.usecase.LoadMoreMessagesUseCase
+import io.clawdroid.core.domain.usecase.ObserveConnectionUseCase
+import io.clawdroid.core.domain.usecase.ObserveMessagesUseCase
+import io.clawdroid.core.domain.usecase.ObserveStatusUseCase
+import io.clawdroid.core.domain.usecase.SendMessageUseCase
+import io.clawdroid.feature.chat.ChatViewModel
+import io.clawdroid.feature.chat.SettingsViewModel
+import io.clawdroid.feature.chat.voice.SpeechRecognizerWrapper
+import io.clawdroid.feature.chat.voice.TextToSpeechWrapper
+import io.clawdroid.feature.chat.voice.CameraCaptureManager
+import io.clawdroid.feature.chat.voice.VoiceModeManager
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
@@ -49,7 +49,7 @@ val appModule = module {
Room.databaseBuilder(
androidContext(),
AppDatabase::class.java,
- "picoclaw.db"
+ "clawdroid.db"
).fallbackToDestructiveMigration(dropAllTables = true).build()
}
single { get().messageDao() }
@@ -68,7 +68,7 @@ val appModule = module {
// WebSocketClient
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 {
prefs.edit().putString("client_id", it).apply()
}
diff --git a/android/app/src/main/java/io/picoclaw/android/navigation/NavRoutes.kt b/android/app/src/main/java/io/clawdroid/navigation/NavRoutes.kt
similarity index 68%
rename from android/app/src/main/java/io/picoclaw/android/navigation/NavRoutes.kt
rename to android/app/src/main/java/io/clawdroid/navigation/NavRoutes.kt
index 734ce76dc..bcc48c266 100644
--- a/android/app/src/main/java/io/picoclaw/android/navigation/NavRoutes.kt
+++ b/android/app/src/main/java/io/clawdroid/navigation/NavRoutes.kt
@@ -1,4 +1,4 @@
-package io.picoclaw.android.navigation
+package io.clawdroid.navigation
object NavRoutes {
const val CHAT = "chat"
diff --git a/android/app/src/main/java/io/picoclaw/android/receiver/AgentMessageReceiver.kt b/android/app/src/main/java/io/clawdroid/receiver/AgentMessageReceiver.kt
similarity index 87%
rename from android/app/src/main/java/io/picoclaw/android/receiver/AgentMessageReceiver.kt
rename to android/app/src/main/java/io/clawdroid/receiver/AgentMessageReceiver.kt
index 9da27fc50..2b8abe211 100644
--- a/android/app/src/main/java/io/picoclaw/android/receiver/AgentMessageReceiver.kt
+++ b/android/app/src/main/java/io/clawdroid/receiver/AgentMessageReceiver.kt
@@ -1,12 +1,12 @@
-package io.picoclaw.android.receiver
+package io.clawdroid.receiver
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.util.Log
-import io.picoclaw.android.core.data.local.dao.MessageDao
-import io.picoclaw.android.core.data.mapper.MessageMapper
-import io.picoclaw.android.core.data.remote.dto.WsOutgoing
+import io.clawdroid.core.data.local.dao.MessageDao
+import io.clawdroid.core.data.mapper.MessageMapper
+import io.clawdroid.core.data.remote.dto.WsOutgoing
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import kotlinx.serialization.json.Json
@@ -57,6 +57,6 @@ class AgentMessageReceiver : BroadcastReceiver(), KoinComponent {
companion object {
private const val TAG = "AgentMessageReceiver"
- const val ACTION = "io.picoclaw.android.AGENT_MESSAGE"
+ const val ACTION = "io.clawdroid.AGENT_MESSAGE"
}
}
diff --git a/android/app/src/main/java/io/picoclaw/android/receiver/NotificationHelper.kt b/android/app/src/main/java/io/clawdroid/receiver/NotificationHelper.kt
similarity index 89%
rename from android/app/src/main/java/io/picoclaw/android/receiver/NotificationHelper.kt
rename to android/app/src/main/java/io/clawdroid/receiver/NotificationHelper.kt
index 8a3952455..6d610528f 100644
--- a/android/app/src/main/java/io/picoclaw/android/receiver/NotificationHelper.kt
+++ b/android/app/src/main/java/io/clawdroid/receiver/NotificationHelper.kt
@@ -1,4 +1,4 @@
-package io.picoclaw.android.receiver
+package io.clawdroid.receiver
import android.app.NotificationChannel
import android.app.NotificationManager
@@ -8,11 +8,11 @@ import androidx.core.app.NotificationCompat
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 NOTIFICATION_ID = 1001
- const val ASSISTANT_CHANNEL_ID = "picoclaw_assistant"
+ const val ASSISTANT_CHANNEL_ID = "clawdroid_assistant"
private const val ASSISTANT_CHANNEL_NAME = "Assistant"
fun createNotificationChannel(context: Context) {
@@ -23,7 +23,7 @@ object NotificationHelper {
CHANNEL_NAME,
NotificationManager.IMPORTANCE_DEFAULT
).apply {
- description = "Messages from PicoClaw agent"
+ description = "Messages from ClawDroid agent"
}
manager.createNotificationChannel(messageChannel)
@@ -47,7 +47,7 @@ object NotificationHelper {
val notification = NotificationCompat.Builder(context, CHANNEL_ID)
.setSmallIcon(android.R.drawable.ic_dialog_info)
- .setContentTitle("PicoClaw")
+ .setContentTitle("ClawDroid")
.setContentText(content.take(200))
.setStyle(NotificationCompat.BigTextStyle().bigText(content.take(1000)))
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml
index ea06a70b3..a99e76581 100644
--- a/android/app/src/main/res/values/strings.xml
+++ b/android/app/src/main/res/values/strings.xml
@@ -1,4 +1,4 @@
- PicoClaw
- Allows PicoClaw to capture screenshots during voice assistant conversations.
+ ClawDroid
+ Allows ClawDroid to capture screenshots during voice assistant conversations.
diff --git a/android/app/src/main/res/values/themes.xml b/android/app/src/main/res/values/themes.xml
index e390a99af..ef3c69d5e 100644
--- a/android/app/src/main/res/values/themes.xml
+++ b/android/app/src/main/res/values/themes.xml
@@ -1,6 +1,6 @@
-
diff --git a/android/core/data/build.gradle.kts b/android/core/data/build.gradle.kts
index 9cceec66f..6b05b5410 100644
--- a/android/core/data/build.gradle.kts
+++ b/android/core/data/build.gradle.kts
@@ -5,7 +5,7 @@ plugins {
}
android {
- namespace = "io.picoclaw.android.core.data"
+ namespace = "io.clawdroid.core.data"
compileSdk = libs.versions.android.compileSdk.get().toInt()
defaultConfig {
diff --git a/android/core/data/src/main/java/io/picoclaw/android/core/data/local/AppDatabase.kt b/android/core/data/src/main/java/io/clawdroid/core/data/local/AppDatabase.kt
similarity index 57%
rename from android/core/data/src/main/java/io/picoclaw/android/core/data/local/AppDatabase.kt
rename to android/core/data/src/main/java/io/clawdroid/core/data/local/AppDatabase.kt
index 2883e1064..042916e28 100644
--- a/android/core/data/src/main/java/io/picoclaw/android/core/data/local/AppDatabase.kt
+++ b/android/core/data/src/main/java/io/clawdroid/core/data/local/AppDatabase.kt
@@ -1,11 +1,11 @@
-package io.picoclaw.android.core.data.local
+package io.clawdroid.core.data.local
import androidx.room.Database
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
-import io.picoclaw.android.core.data.local.converter.Converters
-import io.picoclaw.android.core.data.local.dao.MessageDao
-import io.picoclaw.android.core.data.local.entity.MessageEntity
+import io.clawdroid.core.data.local.converter.Converters
+import io.clawdroid.core.data.local.dao.MessageDao
+import io.clawdroid.core.data.local.entity.MessageEntity
@Database(entities = [MessageEntity::class], version = 1, exportSchema = false)
@TypeConverters(Converters::class)
diff --git a/android/core/data/src/main/java/io/picoclaw/android/core/data/local/ImageFileStorage.kt b/android/core/data/src/main/java/io/clawdroid/core/data/local/ImageFileStorage.kt
similarity index 92%
rename from android/core/data/src/main/java/io/picoclaw/android/core/data/local/ImageFileStorage.kt
rename to android/core/data/src/main/java/io/clawdroid/core/data/local/ImageFileStorage.kt
index 504718efe..49d4ba33e 100644
--- a/android/core/data/src/main/java/io/picoclaw/android/core/data/local/ImageFileStorage.kt
+++ b/android/core/data/src/main/java/io/clawdroid/core/data/local/ImageFileStorage.kt
@@ -1,10 +1,10 @@
-package io.picoclaw.android.core.data.local
+package io.clawdroid.core.data.local
import android.content.Context
import android.graphics.BitmapFactory
import android.net.Uri
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.withContext
import java.io.File
diff --git a/android/core/data/src/main/java/io/picoclaw/android/core/data/local/converter/Converters.kt b/android/core/data/src/main/java/io/clawdroid/core/data/local/converter/Converters.kt
similarity index 88%
rename from android/core/data/src/main/java/io/picoclaw/android/core/data/local/converter/Converters.kt
rename to android/core/data/src/main/java/io/clawdroid/core/data/local/converter/Converters.kt
index 39d0cda01..5f9275a37 100644
--- a/android/core/data/src/main/java/io/picoclaw/android/core/data/local/converter/Converters.kt
+++ b/android/core/data/src/main/java/io/clawdroid/core/data/local/converter/Converters.kt
@@ -1,4 +1,4 @@
-package io.picoclaw.android.core.data.local.converter
+package io.clawdroid.core.data.local.converter
import androidx.room.TypeConverter
import kotlinx.serialization.encodeToString
diff --git a/android/core/data/src/main/java/io/picoclaw/android/core/data/local/dao/MessageDao.kt b/android/core/data/src/main/java/io/clawdroid/core/data/local/dao/MessageDao.kt
similarity index 86%
rename from android/core/data/src/main/java/io/picoclaw/android/core/data/local/dao/MessageDao.kt
rename to android/core/data/src/main/java/io/clawdroid/core/data/local/dao/MessageDao.kt
index 3dd10288f..ed8ea2043 100644
--- a/android/core/data/src/main/java/io/picoclaw/android/core/data/local/dao/MessageDao.kt
+++ b/android/core/data/src/main/java/io/clawdroid/core/data/local/dao/MessageDao.kt
@@ -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.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
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
@Dao
diff --git a/android/core/data/src/main/java/io/picoclaw/android/core/data/local/entity/MessageEntity.kt b/android/core/data/src/main/java/io/clawdroid/core/data/local/entity/MessageEntity.kt
similarity index 86%
rename from android/core/data/src/main/java/io/picoclaw/android/core/data/local/entity/MessageEntity.kt
rename to android/core/data/src/main/java/io/clawdroid/core/data/local/entity/MessageEntity.kt
index 61ba48928..a21a94be5 100644
--- a/android/core/data/src/main/java/io/picoclaw/android/core/data/local/entity/MessageEntity.kt
+++ b/android/core/data/src/main/java/io/clawdroid/core/data/local/entity/MessageEntity.kt
@@ -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.PrimaryKey
diff --git a/android/core/data/src/main/java/io/picoclaw/android/core/data/mapper/MessageMapper.kt b/android/core/data/src/main/java/io/clawdroid/core/data/mapper/MessageMapper.kt
similarity index 83%
rename from android/core/data/src/main/java/io/picoclaw/android/core/data/mapper/MessageMapper.kt
rename to android/core/data/src/main/java/io/clawdroid/core/data/mapper/MessageMapper.kt
index 2954b8422..ee9ff24af 100644
--- a/android/core/data/src/main/java/io/picoclaw/android/core/data/mapper/MessageMapper.kt
+++ b/android/core/data/src/main/java/io/clawdroid/core/data/mapper/MessageMapper.kt
@@ -1,13 +1,13 @@
-package io.picoclaw.android.core.data.mapper
+package io.clawdroid.core.data.mapper
import android.util.Log
-import io.picoclaw.android.core.data.local.entity.MessageEntity
-import io.picoclaw.android.core.data.remote.dto.WsIncoming
-import io.picoclaw.android.core.data.remote.dto.WsOutgoing
-import io.picoclaw.android.core.domain.model.ChatMessage
-import io.picoclaw.android.core.domain.model.ImageData
-import io.picoclaw.android.core.domain.model.MessageSender
-import io.picoclaw.android.core.domain.model.MessageStatus
+import io.clawdroid.core.data.local.entity.MessageEntity
+import io.clawdroid.core.data.remote.dto.WsIncoming
+import io.clawdroid.core.data.remote.dto.WsOutgoing
+import io.clawdroid.core.domain.model.ChatMessage
+import io.clawdroid.core.domain.model.ImageData
+import io.clawdroid.core.domain.model.MessageSender
+import io.clawdroid.core.domain.model.MessageStatus
import kotlinx.serialization.Serializable
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
diff --git a/android/core/data/src/main/java/io/picoclaw/android/core/data/remote/WebSocketClient.kt b/android/core/data/src/main/java/io/clawdroid/core/data/remote/WebSocketClient.kt
similarity index 94%
rename from android/core/data/src/main/java/io/picoclaw/android/core/data/remote/WebSocketClient.kt
rename to android/core/data/src/main/java/io/clawdroid/core/data/remote/WebSocketClient.kt
index 693d428b2..d35b7d9c5 100644
--- a/android/core/data/src/main/java/io/picoclaw/android/core/data/remote/WebSocketClient.kt
+++ b/android/core/data/src/main/java/io/clawdroid/core/data/remote/WebSocketClient.kt
@@ -1,4 +1,4 @@
-package io.picoclaw.android.core.data.remote
+package io.clawdroid.core.data.remote
import android.util.Log
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.WebSocketSession
import io.ktor.websocket.readText
-import io.picoclaw.android.core.data.remote.dto.WsIncoming
-import io.picoclaw.android.core.data.remote.dto.WsOutgoing
-import io.picoclaw.android.core.domain.model.ConnectionState
+import io.clawdroid.core.data.remote.dto.WsIncoming
+import io.clawdroid.core.data.remote.dto.WsOutgoing
+import io.clawdroid.core.domain.model.ConnectionState
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
diff --git a/android/core/data/src/main/java/io/picoclaw/android/core/data/remote/dto/ToolRequest.kt b/android/core/data/src/main/java/io/clawdroid/core/data/remote/dto/ToolRequest.kt
similarity index 85%
rename from android/core/data/src/main/java/io/picoclaw/android/core/data/remote/dto/ToolRequest.kt
rename to android/core/data/src/main/java/io/clawdroid/core/data/remote/dto/ToolRequest.kt
index 779bc1887..fb21248ac 100644
--- a/android/core/data/src/main/java/io/picoclaw/android/core/data/remote/dto/ToolRequest.kt
+++ b/android/core/data/src/main/java/io/clawdroid/core/data/remote/dto/ToolRequest.kt
@@ -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.Serializable
diff --git a/android/core/data/src/main/java/io/picoclaw/android/core/data/remote/dto/ToolResponse.kt b/android/core/data/src/main/java/io/clawdroid/core/data/remote/dto/ToolResponse.kt
similarity index 84%
rename from android/core/data/src/main/java/io/picoclaw/android/core/data/remote/dto/ToolResponse.kt
rename to android/core/data/src/main/java/io/clawdroid/core/data/remote/dto/ToolResponse.kt
index e335a145d..ca3878861 100644
--- a/android/core/data/src/main/java/io/picoclaw/android/core/data/remote/dto/ToolResponse.kt
+++ b/android/core/data/src/main/java/io/clawdroid/core/data/remote/dto/ToolResponse.kt
@@ -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.Serializable
diff --git a/android/core/data/src/main/java/io/picoclaw/android/core/data/remote/dto/WsIncoming.kt b/android/core/data/src/main/java/io/clawdroid/core/data/remote/dto/WsIncoming.kt
similarity index 88%
rename from android/core/data/src/main/java/io/picoclaw/android/core/data/remote/dto/WsIncoming.kt
rename to android/core/data/src/main/java/io/clawdroid/core/data/remote/dto/WsIncoming.kt
index 4995da5e3..0f84d3263 100644
--- a/android/core/data/src/main/java/io/picoclaw/android/core/data/remote/dto/WsIncoming.kt
+++ b/android/core/data/src/main/java/io/clawdroid/core/data/remote/dto/WsIncoming.kt
@@ -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.Serializable
diff --git a/android/core/data/src/main/java/io/picoclaw/android/core/data/remote/dto/WsOutgoing.kt b/android/core/data/src/main/java/io/clawdroid/core/data/remote/dto/WsOutgoing.kt
similarity index 73%
rename from android/core/data/src/main/java/io/picoclaw/android/core/data/remote/dto/WsOutgoing.kt
rename to android/core/data/src/main/java/io/clawdroid/core/data/remote/dto/WsOutgoing.kt
index f2c873ca6..06d3db225 100644
--- a/android/core/data/src/main/java/io/picoclaw/android/core/data/remote/dto/WsOutgoing.kt
+++ b/android/core/data/src/main/java/io/clawdroid/core/data/remote/dto/WsOutgoing.kt
@@ -1,4 +1,4 @@
-package io.picoclaw.android.core.data.remote.dto
+package io.clawdroid.core.data.remote.dto
import kotlinx.serialization.Serializable
diff --git a/android/core/data/src/main/java/io/picoclaw/android/core/data/repository/AssistantConnectionImpl.kt b/android/core/data/src/main/java/io/clawdroid/core/data/repository/AssistantConnectionImpl.kt
similarity index 89%
rename from android/core/data/src/main/java/io/picoclaw/android/core/data/repository/AssistantConnectionImpl.kt
rename to android/core/data/src/main/java/io/clawdroid/core/data/repository/AssistantConnectionImpl.kt
index c3322550e..cae5e0c7c 100644
--- a/android/core/data/src/main/java/io/picoclaw/android/core/data/repository/AssistantConnectionImpl.kt
+++ b/android/core/data/src/main/java/io/clawdroid/core/data/repository/AssistantConnectionImpl.kt
@@ -1,13 +1,13 @@
-package io.picoclaw.android.core.data.repository
+package io.clawdroid.core.data.repository
import android.util.Log
import io.ktor.client.HttpClient
-import io.picoclaw.android.core.data.remote.WebSocketClient
-import io.picoclaw.android.core.data.remote.dto.ToolRequest
-import io.picoclaw.android.core.data.remote.dto.WsIncoming
-import io.picoclaw.android.core.domain.model.AssistantMessage
-import io.picoclaw.android.core.domain.model.ConnectionState
-import io.picoclaw.android.core.domain.repository.AssistantConnection
+import io.clawdroid.core.data.remote.WebSocketClient
+import io.clawdroid.core.data.remote.dto.ToolRequest
+import io.clawdroid.core.data.remote.dto.WsIncoming
+import io.clawdroid.core.domain.model.AssistantMessage
+import io.clawdroid.core.domain.model.ConnectionState
+import io.clawdroid.core.domain.repository.AssistantConnection
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
diff --git a/android/core/data/src/main/java/io/picoclaw/android/core/data/repository/ChatRepositoryImpl.kt b/android/core/data/src/main/java/io/clawdroid/core/data/repository/ChatRepositoryImpl.kt
similarity index 84%
rename from android/core/data/src/main/java/io/picoclaw/android/core/data/repository/ChatRepositoryImpl.kt
rename to android/core/data/src/main/java/io/clawdroid/core/data/repository/ChatRepositoryImpl.kt
index 1c26f6db2..a39c992cc 100644
--- a/android/core/data/src/main/java/io/picoclaw/android/core/data/repository/ChatRepositoryImpl.kt
+++ b/android/core/data/src/main/java/io/clawdroid/core/data/repository/ChatRepositoryImpl.kt
@@ -1,17 +1,17 @@
-package io.picoclaw.android.core.data.repository
+package io.clawdroid.core.data.repository
import android.util.Log
-import io.picoclaw.android.core.data.local.ImageFileStorage
-import io.picoclaw.android.core.data.local.dao.MessageDao
-import io.picoclaw.android.core.data.mapper.MessageMapper
-import io.picoclaw.android.core.data.remote.WebSocketClient
-import io.picoclaw.android.core.data.remote.dto.ToolRequest
-import io.picoclaw.android.core.data.remote.dto.WsIncoming
-import io.picoclaw.android.core.domain.model.ChatMessage
-import io.picoclaw.android.core.domain.model.ConnectionState
-import io.picoclaw.android.core.domain.model.ImageAttachment
-import io.picoclaw.android.core.domain.model.MessageStatus
-import io.picoclaw.android.core.domain.repository.ChatRepository
+import io.clawdroid.core.data.local.ImageFileStorage
+import io.clawdroid.core.data.local.dao.MessageDao
+import io.clawdroid.core.data.mapper.MessageMapper
+import io.clawdroid.core.data.remote.WebSocketClient
+import io.clawdroid.core.data.remote.dto.ToolRequest
+import io.clawdroid.core.data.remote.dto.WsIncoming
+import io.clawdroid.core.domain.model.ChatMessage
+import io.clawdroid.core.domain.model.ConnectionState
+import io.clawdroid.core.domain.model.ImageAttachment
+import io.clawdroid.core.domain.model.MessageStatus
+import io.clawdroid.core.domain.repository.ChatRepository
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
diff --git a/android/core/data/src/main/java/io/picoclaw/android/core/data/repository/TtsCatalogRepositoryImpl.kt b/android/core/data/src/main/java/io/clawdroid/core/data/repository/TtsCatalogRepositoryImpl.kt
similarity index 91%
rename from android/core/data/src/main/java/io/picoclaw/android/core/data/repository/TtsCatalogRepositoryImpl.kt
rename to android/core/data/src/main/java/io/clawdroid/core/data/repository/TtsCatalogRepositoryImpl.kt
index 7968d9460..0ad7f826c 100644
--- a/android/core/data/src/main/java/io/picoclaw/android/core/data/repository/TtsCatalogRepositoryImpl.kt
+++ b/android/core/data/src/main/java/io/clawdroid/core/data/repository/TtsCatalogRepositoryImpl.kt
@@ -1,11 +1,11 @@
-package io.picoclaw.android.core.data.repository
+package io.clawdroid.core.data.repository
import android.content.Context
import android.speech.tts.TextToSpeech
-import io.picoclaw.android.core.domain.model.TtsConfig
-import io.picoclaw.android.core.domain.model.TtsEngineInfo
-import io.picoclaw.android.core.domain.model.TtsVoiceInfo
-import io.picoclaw.android.core.domain.repository.TtsCatalogRepository
+import io.clawdroid.core.domain.model.TtsConfig
+import io.clawdroid.core.domain.model.TtsEngineInfo
+import io.clawdroid.core.domain.model.TtsVoiceInfo
+import io.clawdroid.core.domain.repository.TtsCatalogRepository
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
diff --git a/android/core/data/src/main/java/io/picoclaw/android/core/data/repository/TtsSettingsRepositoryImpl.kt b/android/core/data/src/main/java/io/clawdroid/core/data/repository/TtsSettingsRepositoryImpl.kt
similarity index 92%
rename from android/core/data/src/main/java/io/picoclaw/android/core/data/repository/TtsSettingsRepositoryImpl.kt
rename to android/core/data/src/main/java/io/clawdroid/core/data/repository/TtsSettingsRepositoryImpl.kt
index 787643b67..b5cc3d137 100644
--- a/android/core/data/src/main/java/io/picoclaw/android/core/data/repository/TtsSettingsRepositoryImpl.kt
+++ b/android/core/data/src/main/java/io/clawdroid/core/data/repository/TtsSettingsRepositoryImpl.kt
@@ -1,4 +1,4 @@
-package io.picoclaw.android.core.data.repository
+package io.clawdroid.core.data.repository
import android.content.Context
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.stringPreferencesKey
import androidx.datastore.preferences.preferencesDataStore
-import io.picoclaw.android.core.domain.model.TtsConfig
-import io.picoclaw.android.core.domain.repository.TtsSettingsRepository
+import io.clawdroid.core.domain.model.TtsConfig
+import io.clawdroid.core.domain.repository.TtsSettingsRepository
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
diff --git a/android/core/domain/build.gradle.kts b/android/core/domain/build.gradle.kts
index 9a3157ee1..fd90ce135 100644
--- a/android/core/domain/build.gradle.kts
+++ b/android/core/domain/build.gradle.kts
@@ -3,7 +3,7 @@ plugins {
}
android {
- namespace = "io.picoclaw.android.core.domain"
+ namespace = "io.clawdroid.core.domain"
compileSdk = libs.versions.android.compileSdk.get().toInt()
defaultConfig {
diff --git a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/model/AssistantMessage.kt b/android/core/domain/src/main/java/io/clawdroid/core/domain/model/AssistantMessage.kt
similarity index 65%
rename from android/core/domain/src/main/java/io/picoclaw/android/core/domain/model/AssistantMessage.kt
rename to android/core/domain/src/main/java/io/clawdroid/core/domain/model/AssistantMessage.kt
index df1a8c473..463364432 100644
--- a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/model/AssistantMessage.kt
+++ b/android/core/domain/src/main/java/io/clawdroid/core/domain/model/AssistantMessage.kt
@@ -1,4 +1,4 @@
-package io.picoclaw.android.core.domain.model
+package io.clawdroid.core.domain.model
data class AssistantMessage(
val content: String,
diff --git a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/model/ChatMessage.kt b/android/core/domain/src/main/java/io/clawdroid/core/domain/model/ChatMessage.kt
similarity index 88%
rename from android/core/domain/src/main/java/io/picoclaw/android/core/domain/model/ChatMessage.kt
rename to android/core/domain/src/main/java/io/clawdroid/core/domain/model/ChatMessage.kt
index 59716f7d3..855bd3d5b 100644
--- a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/model/ChatMessage.kt
+++ b/android/core/domain/src/main/java/io/clawdroid/core/domain/model/ChatMessage.kt
@@ -1,4 +1,4 @@
-package io.picoclaw.android.core.domain.model
+package io.clawdroid.core.domain.model
data class ChatMessage(
val id: String,
diff --git a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/model/ConnectionState.kt b/android/core/domain/src/main/java/io/clawdroid/core/domain/model/ConnectionState.kt
similarity index 65%
rename from android/core/domain/src/main/java/io/picoclaw/android/core/domain/model/ConnectionState.kt
rename to android/core/domain/src/main/java/io/clawdroid/core/domain/model/ConnectionState.kt
index eecc14cac..bd365a1ab 100644
--- a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/model/ConnectionState.kt
+++ b/android/core/domain/src/main/java/io/clawdroid/core/domain/model/ConnectionState.kt
@@ -1,4 +1,4 @@
-package io.picoclaw.android.core.domain.model
+package io.clawdroid.core.domain.model
enum class ConnectionState {
DISCONNECTED, CONNECTING, CONNECTED, RECONNECTING
diff --git a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/model/ImageAttachment.kt b/android/core/domain/src/main/java/io/clawdroid/core/domain/model/ImageAttachment.kt
similarity index 66%
rename from android/core/domain/src/main/java/io/picoclaw/android/core/domain/model/ImageAttachment.kt
rename to android/core/domain/src/main/java/io/clawdroid/core/domain/model/ImageAttachment.kt
index 39b577f5c..d4b5a79bc 100644
--- a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/model/ImageAttachment.kt
+++ b/android/core/domain/src/main/java/io/clawdroid/core/domain/model/ImageAttachment.kt
@@ -1,4 +1,4 @@
-package io.picoclaw.android.core.domain.model
+package io.clawdroid.core.domain.model
data class ImageAttachment(
val uri: String,
diff --git a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/model/ImageData.kt b/android/core/domain/src/main/java/io/clawdroid/core/domain/model/ImageData.kt
similarity index 65%
rename from android/core/domain/src/main/java/io/picoclaw/android/core/domain/model/ImageData.kt
rename to android/core/domain/src/main/java/io/clawdroid/core/domain/model/ImageData.kt
index ab7abe70d..ca70789cf 100644
--- a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/model/ImageData.kt
+++ b/android/core/domain/src/main/java/io/clawdroid/core/domain/model/ImageData.kt
@@ -1,4 +1,4 @@
-package io.picoclaw.android.core.domain.model
+package io.clawdroid.core.domain.model
data class ImageData(
val path: String,
diff --git a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/model/TtsConfig.kt b/android/core/domain/src/main/java/io/clawdroid/core/domain/model/TtsConfig.kt
similarity index 78%
rename from android/core/domain/src/main/java/io/picoclaw/android/core/domain/model/TtsConfig.kt
rename to android/core/domain/src/main/java/io/clawdroid/core/domain/model/TtsConfig.kt
index 498b11abd..34084e0fd 100644
--- a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/model/TtsConfig.kt
+++ b/android/core/domain/src/main/java/io/clawdroid/core/domain/model/TtsConfig.kt
@@ -1,4 +1,4 @@
-package io.picoclaw.android.core.domain.model
+package io.clawdroid.core.domain.model
data class TtsConfig(
val enginePackageName: String? = null,
diff --git a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/model/TtsEngineInfo.kt b/android/core/domain/src/main/java/io/clawdroid/core/domain/model/TtsEngineInfo.kt
similarity index 63%
rename from android/core/domain/src/main/java/io/picoclaw/android/core/domain/model/TtsEngineInfo.kt
rename to android/core/domain/src/main/java/io/clawdroid/core/domain/model/TtsEngineInfo.kt
index 60d6ae66d..a0e25d73f 100644
--- a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/model/TtsEngineInfo.kt
+++ b/android/core/domain/src/main/java/io/clawdroid/core/domain/model/TtsEngineInfo.kt
@@ -1,4 +1,4 @@
-package io.picoclaw.android.core.domain.model
+package io.clawdroid.core.domain.model
data class TtsEngineInfo(
val packageName: String,
diff --git a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/model/TtsVoiceInfo.kt b/android/core/domain/src/main/java/io/clawdroid/core/domain/model/TtsVoiceInfo.kt
similarity index 69%
rename from android/core/domain/src/main/java/io/picoclaw/android/core/domain/model/TtsVoiceInfo.kt
rename to android/core/domain/src/main/java/io/clawdroid/core/domain/model/TtsVoiceInfo.kt
index 916ffd9a5..d197a081a 100644
--- a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/model/TtsVoiceInfo.kt
+++ b/android/core/domain/src/main/java/io/clawdroid/core/domain/model/TtsVoiceInfo.kt
@@ -1,4 +1,4 @@
-package io.picoclaw.android.core.domain.model
+package io.clawdroid.core.domain.model
data class TtsVoiceInfo(
val name: String,
diff --git a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/model/VoicePhase.kt b/android/core/domain/src/main/java/io/clawdroid/core/domain/model/VoicePhase.kt
similarity index 64%
rename from android/core/domain/src/main/java/io/picoclaw/android/core/domain/model/VoicePhase.kt
rename to android/core/domain/src/main/java/io/clawdroid/core/domain/model/VoicePhase.kt
index 787993396..8ee8dc2f3 100644
--- a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/model/VoicePhase.kt
+++ b/android/core/domain/src/main/java/io/clawdroid/core/domain/model/VoicePhase.kt
@@ -1,4 +1,4 @@
-package io.picoclaw.android.core.domain.model
+package io.clawdroid.core.domain.model
enum class VoicePhase {
IDLE, LISTENING, SENDING, THINKING, SPEAKING, ERROR
diff --git a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/repository/AssistantConnection.kt b/android/core/domain/src/main/java/io/clawdroid/core/domain/repository/AssistantConnection.kt
similarity index 70%
rename from android/core/domain/src/main/java/io/picoclaw/android/core/domain/repository/AssistantConnection.kt
rename to android/core/domain/src/main/java/io/clawdroid/core/domain/repository/AssistantConnection.kt
index db84d3164..dedcb304d 100644
--- a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/repository/AssistantConnection.kt
+++ b/android/core/domain/src/main/java/io/clawdroid/core/domain/repository/AssistantConnection.kt
@@ -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.picoclaw.android.core.domain.model.ConnectionState
+import io.clawdroid.core.domain.model.AssistantMessage
+import io.clawdroid.core.domain.model.ConnectionState
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.StateFlow
diff --git a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/repository/ChatRepository.kt b/android/core/domain/src/main/java/io/clawdroid/core/domain/repository/ChatRepository.kt
similarity index 62%
rename from android/core/domain/src/main/java/io/picoclaw/android/core/domain/repository/ChatRepository.kt
rename to android/core/domain/src/main/java/io/clawdroid/core/domain/repository/ChatRepository.kt
index ddcc02b8f..90d43e247 100644
--- a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/repository/ChatRepository.kt
+++ b/android/core/domain/src/main/java/io/clawdroid/core/domain/repository/ChatRepository.kt
@@ -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.picoclaw.android.core.domain.model.ConnectionState
-import io.picoclaw.android.core.domain.model.ImageAttachment
+import io.clawdroid.core.domain.model.ChatMessage
+import io.clawdroid.core.domain.model.ConnectionState
+import io.clawdroid.core.domain.model.ImageAttachment
import kotlinx.coroutines.flow.StateFlow
interface ChatRepository {
diff --git a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/repository/TtsCatalogRepository.kt b/android/core/domain/src/main/java/io/clawdroid/core/domain/repository/TtsCatalogRepository.kt
similarity index 53%
rename from android/core/domain/src/main/java/io/picoclaw/android/core/domain/repository/TtsCatalogRepository.kt
rename to android/core/domain/src/main/java/io/clawdroid/core/domain/repository/TtsCatalogRepository.kt
index fe7c67f9d..f2cc56085 100644
--- a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/repository/TtsCatalogRepository.kt
+++ b/android/core/domain/src/main/java/io/clawdroid/core/domain/repository/TtsCatalogRepository.kt
@@ -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.picoclaw.android.core.domain.model.TtsVoiceInfo
+import io.clawdroid.core.domain.model.TtsEngineInfo
+import io.clawdroid.core.domain.model.TtsVoiceInfo
import kotlinx.coroutines.flow.StateFlow
interface TtsCatalogRepository {
diff --git a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/repository/TtsSettingsRepository.kt b/android/core/domain/src/main/java/io/clawdroid/core/domain/repository/TtsSettingsRepository.kt
similarity index 73%
rename from android/core/domain/src/main/java/io/picoclaw/android/core/domain/repository/TtsSettingsRepository.kt
rename to android/core/domain/src/main/java/io/clawdroid/core/domain/repository/TtsSettingsRepository.kt
index 7f86b97eb..83860a21e 100644
--- a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/repository/TtsSettingsRepository.kt
+++ b/android/core/domain/src/main/java/io/clawdroid/core/domain/repository/TtsSettingsRepository.kt
@@ -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
interface TtsSettingsRepository {
diff --git a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/usecase/ConnectChatUseCase.kt b/android/core/domain/src/main/java/io/clawdroid/core/domain/usecase/ConnectChatUseCase.kt
similarity index 54%
rename from android/core/domain/src/main/java/io/picoclaw/android/core/domain/usecase/ConnectChatUseCase.kt
rename to android/core/domain/src/main/java/io/clawdroid/core/domain/usecase/ConnectChatUseCase.kt
index 3ee56693d..0d1165b6b 100644
--- a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/usecase/ConnectChatUseCase.kt
+++ b/android/core/domain/src/main/java/io/clawdroid/core/domain/usecase/ConnectChatUseCase.kt
@@ -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) {
operator fun invoke() {
diff --git a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/usecase/DisconnectChatUseCase.kt b/android/core/domain/src/main/java/io/clawdroid/core/domain/usecase/DisconnectChatUseCase.kt
similarity index 55%
rename from android/core/domain/src/main/java/io/picoclaw/android/core/domain/usecase/DisconnectChatUseCase.kt
rename to android/core/domain/src/main/java/io/clawdroid/core/domain/usecase/DisconnectChatUseCase.kt
index 91488bf7c..4be2b1930 100644
--- a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/usecase/DisconnectChatUseCase.kt
+++ b/android/core/domain/src/main/java/io/clawdroid/core/domain/usecase/DisconnectChatUseCase.kt
@@ -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) {
operator fun invoke() {
diff --git a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/usecase/LoadMoreMessagesUseCase.kt b/android/core/domain/src/main/java/io/clawdroid/core/domain/usecase/LoadMoreMessagesUseCase.kt
similarity index 55%
rename from android/core/domain/src/main/java/io/picoclaw/android/core/domain/usecase/LoadMoreMessagesUseCase.kt
rename to android/core/domain/src/main/java/io/clawdroid/core/domain/usecase/LoadMoreMessagesUseCase.kt
index 4f9caa4f7..b5770a250 100644
--- a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/usecase/LoadMoreMessagesUseCase.kt
+++ b/android/core/domain/src/main/java/io/clawdroid/core/domain/usecase/LoadMoreMessagesUseCase.kt
@@ -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) {
operator fun invoke() {
diff --git a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/usecase/ObserveConnectionUseCase.kt b/android/core/domain/src/main/java/io/clawdroid/core/domain/usecase/ObserveConnectionUseCase.kt
similarity index 53%
rename from android/core/domain/src/main/java/io/picoclaw/android/core/domain/usecase/ObserveConnectionUseCase.kt
rename to android/core/domain/src/main/java/io/clawdroid/core/domain/usecase/ObserveConnectionUseCase.kt
index 45d18d21d..b52895e0e 100644
--- a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/usecase/ObserveConnectionUseCase.kt
+++ b/android/core/domain/src/main/java/io/clawdroid/core/domain/usecase/ObserveConnectionUseCase.kt
@@ -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.picoclaw.android.core.domain.repository.ChatRepository
+import io.clawdroid.core.domain.model.ConnectionState
+import io.clawdroid.core.domain.repository.ChatRepository
import kotlinx.coroutines.flow.StateFlow
class ObserveConnectionUseCase(private val repository: ChatRepository) {
diff --git a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/usecase/ObserveMessagesUseCase.kt b/android/core/domain/src/main/java/io/clawdroid/core/domain/usecase/ObserveMessagesUseCase.kt
similarity index 53%
rename from android/core/domain/src/main/java/io/picoclaw/android/core/domain/usecase/ObserveMessagesUseCase.kt
rename to android/core/domain/src/main/java/io/clawdroid/core/domain/usecase/ObserveMessagesUseCase.kt
index aba4e27e0..0ece67c03 100644
--- a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/usecase/ObserveMessagesUseCase.kt
+++ b/android/core/domain/src/main/java/io/clawdroid/core/domain/usecase/ObserveMessagesUseCase.kt
@@ -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.picoclaw.android.core.domain.repository.ChatRepository
+import io.clawdroid.core.domain.model.ChatMessage
+import io.clawdroid.core.domain.repository.ChatRepository
import kotlinx.coroutines.flow.StateFlow
class ObserveMessagesUseCase(private val repository: ChatRepository) {
diff --git a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/usecase/ObserveStatusUseCase.kt b/android/core/domain/src/main/java/io/clawdroid/core/domain/usecase/ObserveStatusUseCase.kt
similarity index 62%
rename from android/core/domain/src/main/java/io/picoclaw/android/core/domain/usecase/ObserveStatusUseCase.kt
rename to android/core/domain/src/main/java/io/clawdroid/core/domain/usecase/ObserveStatusUseCase.kt
index a4fd0ae19..1ed2d3888 100644
--- a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/usecase/ObserveStatusUseCase.kt
+++ b/android/core/domain/src/main/java/io/clawdroid/core/domain/usecase/ObserveStatusUseCase.kt
@@ -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
class ObserveStatusUseCase(private val repository: ChatRepository) {
diff --git a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/usecase/SendMessageUseCase.kt b/android/core/domain/src/main/java/io/clawdroid/core/domain/usecase/SendMessageUseCase.kt
similarity index 59%
rename from android/core/domain/src/main/java/io/picoclaw/android/core/domain/usecase/SendMessageUseCase.kt
rename to android/core/domain/src/main/java/io/clawdroid/core/domain/usecase/SendMessageUseCase.kt
index ea81a56e2..351d6c328 100644
--- a/android/core/domain/src/main/java/io/picoclaw/android/core/domain/usecase/SendMessageUseCase.kt
+++ b/android/core/domain/src/main/java/io/clawdroid/core/domain/usecase/SendMessageUseCase.kt
@@ -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.picoclaw.android.core.domain.repository.ChatRepository
+import io.clawdroid.core.domain.model.ImageAttachment
+import io.clawdroid.core.domain.repository.ChatRepository
class SendMessageUseCase(private val repository: ChatRepository) {
suspend operator fun invoke(text: String, images: List = emptyList(), inputMode: String? = null) {
diff --git a/android/core/ui/build.gradle.kts b/android/core/ui/build.gradle.kts
index cd432d6f8..a3f0c1fbe 100644
--- a/android/core/ui/build.gradle.kts
+++ b/android/core/ui/build.gradle.kts
@@ -4,7 +4,7 @@ plugins {
}
android {
- namespace = "io.picoclaw.android.core.ui"
+ namespace = "io.clawdroid.core.ui"
compileSdk = libs.versions.android.compileSdk.get().toInt()
defaultConfig {
diff --git a/android/core/ui/src/main/java/io/picoclaw/android/core/ui/theme/Color.kt b/android/core/ui/src/main/java/io/clawdroid/core/ui/theme/Color.kt
similarity index 97%
rename from android/core/ui/src/main/java/io/picoclaw/android/core/ui/theme/Color.kt
rename to android/core/ui/src/main/java/io/clawdroid/core/ui/theme/Color.kt
index c542acdc7..4e08a410b 100644
--- a/android/core/ui/src/main/java/io/picoclaw/android/core/ui/theme/Color.kt
+++ b/android/core/ui/src/main/java/io/clawdroid/core/ui/theme/Color.kt
@@ -1,4 +1,4 @@
-package io.picoclaw.android.core.ui.theme
+package io.clawdroid.core.ui.theme
import androidx.compose.ui.graphics.Color
diff --git a/android/core/ui/src/main/java/io/picoclaw/android/core/ui/theme/Theme.kt b/android/core/ui/src/main/java/io/clawdroid/core/ui/theme/Theme.kt
similarity index 95%
rename from android/core/ui/src/main/java/io/picoclaw/android/core/ui/theme/Theme.kt
rename to android/core/ui/src/main/java/io/clawdroid/core/ui/theme/Theme.kt
index e0fb58320..d9733770e 100644
--- a/android/core/ui/src/main/java/io/picoclaw/android/core/ui/theme/Theme.kt
+++ b/android/core/ui/src/main/java/io/clawdroid/core/ui/theme/Theme.kt
@@ -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.material3.MaterialTheme
@@ -38,7 +38,7 @@ private val FuturisticShapes = Shapes(
)
@Composable
-fun PicoClawTheme(
+fun ClawDroidTheme(
content: @Composable () -> Unit
) {
MaterialTheme(
diff --git a/android/core/ui/src/main/java/io/picoclaw/android/core/ui/theme/Type.kt b/android/core/ui/src/main/java/io/clawdroid/core/ui/theme/Type.kt
similarity index 97%
rename from android/core/ui/src/main/java/io/picoclaw/android/core/ui/theme/Type.kt
rename to android/core/ui/src/main/java/io/clawdroid/core/ui/theme/Type.kt
index c926c4620..69b8adb85 100644
--- a/android/core/ui/src/main/java/io/picoclaw/android/core/ui/theme/Type.kt
+++ b/android/core/ui/src/main/java/io/clawdroid/core/ui/theme/Type.kt
@@ -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.ui.text.TextStyle
diff --git a/android/feature/chat/build.gradle.kts b/android/feature/chat/build.gradle.kts
index 6d6bb5c65..d9b5b4f44 100644
--- a/android/feature/chat/build.gradle.kts
+++ b/android/feature/chat/build.gradle.kts
@@ -4,7 +4,7 @@ plugins {
}
android {
- namespace = "io.picoclaw.android.feature.chat"
+ namespace = "io.clawdroid.feature.chat"
compileSdk = libs.versions.android.compileSdk.get().toInt()
defaultConfig {
diff --git a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/ChatEvent.kt b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/ChatEvent.kt
similarity index 85%
rename from android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/ChatEvent.kt
rename to android/feature/chat/src/main/java/io/clawdroid/feature/chat/ChatEvent.kt
index 897f71c24..564135d75 100644
--- a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/ChatEvent.kt
+++ b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/ChatEvent.kt
@@ -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 {
data class OnInputChanged(val text: String) : ChatEvent
diff --git a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/ChatUiState.kt b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/ChatUiState.kt
similarity index 61%
rename from android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/ChatUiState.kt
rename to android/feature/chat/src/main/java/io/clawdroid/feature/chat/ChatUiState.kt
index 1ff4b957e..87a08e5f9 100644
--- a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/ChatUiState.kt
+++ b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/ChatUiState.kt
@@ -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.picoclaw.android.core.domain.model.ConnectionState
-import io.picoclaw.android.core.domain.model.ImageAttachment
-import io.picoclaw.android.feature.chat.voice.VoiceModeState
+import io.clawdroid.core.domain.model.ChatMessage
+import io.clawdroid.core.domain.model.ConnectionState
+import io.clawdroid.core.domain.model.ImageAttachment
+import io.clawdroid.feature.chat.voice.VoiceModeState
data class ChatUiState(
val messages: List = emptyList(),
diff --git a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/ChatViewModel.kt b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/ChatViewModel.kt
similarity index 87%
rename from android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/ChatViewModel.kt
rename to android/feature/chat/src/main/java/io/clawdroid/feature/chat/ChatViewModel.kt
index 13d85c83f..fc35fd274 100644
--- a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/ChatViewModel.kt
+++ b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/ChatViewModel.kt
@@ -1,15 +1,15 @@
-package io.picoclaw.android.feature.chat
+package io.clawdroid.feature.chat
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
-import io.picoclaw.android.core.domain.usecase.ConnectChatUseCase
-import io.picoclaw.android.core.domain.usecase.DisconnectChatUseCase
-import io.picoclaw.android.core.domain.usecase.LoadMoreMessagesUseCase
-import io.picoclaw.android.core.domain.usecase.ObserveConnectionUseCase
-import io.picoclaw.android.core.domain.usecase.ObserveMessagesUseCase
-import io.picoclaw.android.core.domain.usecase.ObserveStatusUseCase
-import io.picoclaw.android.core.domain.usecase.SendMessageUseCase
-import io.picoclaw.android.feature.chat.voice.VoiceModeManager
+import io.clawdroid.core.domain.usecase.ConnectChatUseCase
+import io.clawdroid.core.domain.usecase.DisconnectChatUseCase
+import io.clawdroid.core.domain.usecase.LoadMoreMessagesUseCase
+import io.clawdroid.core.domain.usecase.ObserveConnectionUseCase
+import io.clawdroid.core.domain.usecase.ObserveMessagesUseCase
+import io.clawdroid.core.domain.usecase.ObserveStatusUseCase
+import io.clawdroid.core.domain.usecase.SendMessageUseCase
+import io.clawdroid.feature.chat.voice.VoiceModeManager
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
diff --git a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/SettingsUiState.kt b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/SettingsUiState.kt
similarity index 52%
rename from android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/SettingsUiState.kt
rename to android/feature/chat/src/main/java/io/clawdroid/feature/chat/SettingsUiState.kt
index a5f20700f..0f61da159 100644
--- a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/SettingsUiState.kt
+++ b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/SettingsUiState.kt
@@ -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.picoclaw.android.core.domain.model.TtsEngineInfo
-import io.picoclaw.android.core.domain.model.TtsVoiceInfo
+import io.clawdroid.core.domain.model.TtsConfig
+import io.clawdroid.core.domain.model.TtsEngineInfo
+import io.clawdroid.core.domain.model.TtsVoiceInfo
data class SettingsUiState(
val ttsConfig: TtsConfig = TtsConfig(),
diff --git a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/SettingsViewModel.kt b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/SettingsViewModel.kt
similarity index 88%
rename from android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/SettingsViewModel.kt
rename to android/feature/chat/src/main/java/io/clawdroid/feature/chat/SettingsViewModel.kt
index 02ade5cab..2cb94cec4 100644
--- a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/SettingsViewModel.kt
+++ b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/SettingsViewModel.kt
@@ -1,10 +1,10 @@
-package io.picoclaw.android.feature.chat
+package io.clawdroid.feature.chat
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
-import io.picoclaw.android.core.domain.repository.TtsCatalogRepository
-import io.picoclaw.android.core.domain.repository.TtsSettingsRepository
-import io.picoclaw.android.feature.chat.voice.TextToSpeechWrapper
+import io.clawdroid.core.domain.repository.TtsCatalogRepository
+import io.clawdroid.core.domain.repository.TtsSettingsRepository
+import io.clawdroid.feature.chat.voice.TextToSpeechWrapper
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
diff --git a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/assistant/AssistantManager.kt b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/assistant/AssistantManager.kt
similarity index 94%
rename from android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/assistant/AssistantManager.kt
rename to android/feature/chat/src/main/java/io/clawdroid/feature/chat/assistant/AssistantManager.kt
index 26921e7fe..eca9bc63c 100644
--- a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/assistant/AssistantManager.kt
+++ b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/assistant/AssistantManager.kt
@@ -1,19 +1,19 @@
-package io.picoclaw.android.feature.chat.assistant
+package io.clawdroid.feature.chat.assistant
import android.content.ContentResolver
import android.speech.SpeechRecognizer
import android.util.Base64
import android.util.Log
-import io.picoclaw.android.core.domain.model.AssistantMessage
-import io.picoclaw.android.core.domain.model.VoicePhase
-import io.picoclaw.android.core.domain.repository.AssistantConnection
-import io.picoclaw.android.feature.chat.voice.CameraCaptureManager
-import io.picoclaw.android.feature.chat.voice.ScreenCaptureManager
-import io.picoclaw.android.feature.chat.voice.SpeechRecognizerWrapper
-import io.picoclaw.android.feature.chat.voice.SttResult
-import io.picoclaw.android.feature.chat.voice.TextToSpeechWrapper
-import io.picoclaw.android.feature.chat.voice.ChatTurn
-import io.picoclaw.android.feature.chat.voice.VoiceModeState
+import io.clawdroid.core.domain.model.AssistantMessage
+import io.clawdroid.core.domain.model.VoicePhase
+import io.clawdroid.core.domain.repository.AssistantConnection
+import io.clawdroid.feature.chat.voice.CameraCaptureManager
+import io.clawdroid.feature.chat.voice.ScreenCaptureManager
+import io.clawdroid.feature.chat.voice.SpeechRecognizerWrapper
+import io.clawdroid.feature.chat.voice.SttResult
+import io.clawdroid.feature.chat.voice.TextToSpeechWrapper
+import io.clawdroid.feature.chat.voice.ChatTurn
+import io.clawdroid.feature.chat.voice.VoiceModeState
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.Job
diff --git a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/assistant/AssistantPillBar.kt b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/assistant/AssistantPillBar.kt
similarity index 97%
rename from android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/assistant/AssistantPillBar.kt
rename to android/feature/chat/src/main/java/io/clawdroid/feature/chat/assistant/AssistantPillBar.kt
index c5ba990df..2a6f2d510 100644
--- a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/assistant/AssistantPillBar.kt
+++ b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/assistant/AssistantPillBar.kt
@@ -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.ImplementationMode
@@ -53,13 +53,13 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
import androidx.lifecycle.compose.LocalLifecycleOwner
-import io.picoclaw.android.core.domain.model.VoicePhase
-import io.picoclaw.android.core.ui.theme.GradientCyan
-import io.picoclaw.android.core.ui.theme.TextPrimary
-import io.picoclaw.android.core.ui.theme.TextSecondary
-import io.picoclaw.android.feature.chat.voice.CameraCaptureManager
-import io.picoclaw.android.feature.chat.voice.ChatTurn
-import io.picoclaw.android.feature.chat.voice.VoiceModeState
+import io.clawdroid.core.domain.model.VoicePhase
+import io.clawdroid.core.ui.theme.GradientCyan
+import io.clawdroid.core.ui.theme.TextPrimary
+import io.clawdroid.core.ui.theme.TextSecondary
+import io.clawdroid.feature.chat.voice.CameraCaptureManager
+import io.clawdroid.feature.chat.voice.ChatTurn
+import io.clawdroid.feature.chat.voice.VoiceModeState
import com.composables.icons.lucide.R as LucideR
import kotlin.math.PI
import kotlin.math.sin
diff --git a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/component/ConnectionBanner.kt b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/component/ConnectionBanner.kt
similarity index 89%
rename from android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/component/ConnectionBanner.kt
rename to android/feature/chat/src/main/java/io/clawdroid/feature/chat/component/ConnectionBanner.kt
index bf5a8bb91..a41505132 100644
--- a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/component/ConnectionBanner.kt
+++ b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/component/ConnectionBanner.kt
@@ -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.foundation.background
@@ -14,9 +14,9 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
-import io.picoclaw.android.core.domain.model.ConnectionState
-import io.picoclaw.android.core.ui.theme.DisconnectedRed
-import io.picoclaw.android.core.ui.theme.ReconnectingYellow
+import io.clawdroid.core.domain.model.ConnectionState
+import io.clawdroid.core.ui.theme.DisconnectedRed
+import io.clawdroid.core.ui.theme.ReconnectingYellow
@Composable
fun ConnectionBanner(
diff --git a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/component/ImagePreview.kt b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/component/ImagePreview.kt
similarity index 91%
rename from android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/component/ImagePreview.kt
rename to android/feature/chat/src/main/java/io/clawdroid/feature/chat/component/ImagePreview.kt
index dd3c13ec0..6fca18815 100644
--- a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/component/ImagePreview.kt
+++ b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/component/ImagePreview.kt
@@ -1,4 +1,4 @@
-package io.picoclaw.android.feature.chat.component
+package io.clawdroid.feature.chat.component
import android.net.Uri
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.unit.dp
import coil3.compose.AsyncImage
-import io.picoclaw.android.core.domain.model.ImageAttachment
-import io.picoclaw.android.core.ui.theme.GlassBorder
-import io.picoclaw.android.core.ui.theme.TextSecondary
+import io.clawdroid.core.domain.model.ImageAttachment
+import io.clawdroid.core.ui.theme.GlassBorder
+import io.clawdroid.core.ui.theme.TextSecondary
import com.composables.icons.lucide.R as LucideR
@Composable
diff --git a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/component/MessageBubble.kt b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/component/MessageBubble.kt
similarity index 90%
rename from android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/component/MessageBubble.kt
rename to android/feature/chat/src/main/java/io/clawdroid/feature/chat/component/MessageBubble.kt
index 6169ad542..58a0a1558 100644
--- a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/component/MessageBubble.kt
+++ b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/component/MessageBubble.kt
@@ -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.layout.Box
@@ -23,13 +23,13 @@ import coil3.compose.AsyncImage
import com.mikepenz.markdown.m3.Markdown
import com.mikepenz.markdown.m3.markdownColor
import com.mikepenz.markdown.m3.markdownTypography
-import io.picoclaw.android.core.domain.model.ChatMessage
-import io.picoclaw.android.core.domain.model.MessageSender
-import io.picoclaw.android.core.ui.theme.AgentBubble
-import io.picoclaw.android.core.ui.theme.AgentBubbleBorder
-import io.picoclaw.android.core.ui.theme.TextPrimary
-import io.picoclaw.android.core.ui.theme.UserBubble
-import io.picoclaw.android.core.ui.theme.UserBubbleBorder
+import io.clawdroid.core.domain.model.ChatMessage
+import io.clawdroid.core.domain.model.MessageSender
+import io.clawdroid.core.ui.theme.AgentBubble
+import io.clawdroid.core.ui.theme.AgentBubbleBorder
+import io.clawdroid.core.ui.theme.TextPrimary
+import io.clawdroid.core.ui.theme.UserBubble
+import io.clawdroid.core.ui.theme.UserBubbleBorder
import java.io.File
@Composable
diff --git a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/component/MessageInput.kt b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/component/MessageInput.kt
similarity index 90%
rename from android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/component/MessageInput.kt
rename to android/feature/chat/src/main/java/io/clawdroid/feature/chat/component/MessageInput.kt
index c4f2fa35b..a5eead431 100644
--- a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/component/MessageInput.kt
+++ b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/component/MessageInput.kt
@@ -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.border
@@ -22,13 +22,13 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
-import io.picoclaw.android.core.ui.theme.DeepBlack
-import io.picoclaw.android.core.ui.theme.GlassBorder
-import io.picoclaw.android.core.ui.theme.GlassWhite
-import io.picoclaw.android.core.ui.theme.NeonCyan
-import io.picoclaw.android.core.ui.theme.TextPrimary
-import io.picoclaw.android.core.ui.theme.TextSecondary
-import io.picoclaw.android.core.ui.theme.TextTertiary
+import io.clawdroid.core.ui.theme.DeepBlack
+import io.clawdroid.core.ui.theme.GlassBorder
+import io.clawdroid.core.ui.theme.GlassWhite
+import io.clawdroid.core.ui.theme.NeonCyan
+import io.clawdroid.core.ui.theme.TextPrimary
+import io.clawdroid.core.ui.theme.TextSecondary
+import io.clawdroid.core.ui.theme.TextTertiary
import com.composables.icons.lucide.R as LucideR
@Composable
diff --git a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/component/MessageList.kt b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/component/MessageList.kt
similarity index 93%
rename from android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/component/MessageList.kt
rename to android/feature/chat/src/main/java/io/clawdroid/feature/chat/component/MessageList.kt
index 4ecbd7baa..8bdaa0340 100644
--- a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/component/MessageList.kt
+++ b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/component/MessageList.kt
@@ -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.PaddingValues
@@ -13,7 +13,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
-import io.picoclaw.android.core.domain.model.ChatMessage
+import io.clawdroid.core.domain.model.ChatMessage
@Composable
fun MessageList(
diff --git a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/component/StatusIndicator.kt b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/component/StatusIndicator.kt
similarity index 90%
rename from android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/component/StatusIndicator.kt
rename to android/feature/chat/src/main/java/io/clawdroid/feature/chat/component/StatusIndicator.kt
index 016eabfb4..b515e2a10 100644
--- a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/component/StatusIndicator.kt
+++ b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/component/StatusIndicator.kt
@@ -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.fadeIn
@@ -16,8 +16,8 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
-import io.picoclaw.android.core.ui.theme.NeonCyan
-import io.picoclaw.android.core.ui.theme.TextSecondary
+import io.clawdroid.core.ui.theme.NeonCyan
+import io.clawdroid.core.ui.theme.TextSecondary
@Composable
fun StatusIndicator(
diff --git a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/screen/ChatScreen.kt b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/screen/ChatScreen.kt
similarity index 91%
rename from android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/screen/ChatScreen.kt
rename to android/feature/chat/src/main/java/io/clawdroid/feature/chat/screen/ChatScreen.kt
index 48cf7b156..41dffd6dd 100644
--- a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/screen/ChatScreen.kt
+++ b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/screen/ChatScreen.kt
@@ -1,4 +1,4 @@
-package io.picoclaw.android.feature.chat.screen
+package io.clawdroid.feature.chat.screen
import android.Manifest
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.res.painterResource
import androidx.core.content.FileProvider
-import io.picoclaw.android.core.domain.model.ImageAttachment
-import io.picoclaw.android.core.ui.theme.DeepBlack
-import io.picoclaw.android.core.ui.theme.GradientCyan
-import io.picoclaw.android.core.ui.theme.GradientPink
-import io.picoclaw.android.core.ui.theme.GradientPurple
-import io.picoclaw.android.core.ui.theme.TextSecondary
-import io.picoclaw.android.feature.chat.ChatEvent
-import io.picoclaw.android.feature.chat.ChatViewModel
+import io.clawdroid.core.domain.model.ImageAttachment
+import io.clawdroid.core.ui.theme.DeepBlack
+import io.clawdroid.core.ui.theme.GradientCyan
+import io.clawdroid.core.ui.theme.GradientPink
+import io.clawdroid.core.ui.theme.GradientPurple
+import io.clawdroid.core.ui.theme.TextSecondary
+import io.clawdroid.feature.chat.ChatEvent
+import io.clawdroid.feature.chat.ChatViewModel
import com.composables.icons.lucide.R as LucideR
-import io.picoclaw.android.feature.chat.component.ConnectionBanner
-import io.picoclaw.android.feature.chat.component.ImagePreviewRow
-import io.picoclaw.android.feature.chat.component.MessageInput
-import io.picoclaw.android.feature.chat.component.MessageList
-import io.picoclaw.android.feature.chat.component.StatusIndicator
-import io.picoclaw.android.feature.chat.voice.CameraCaptureManager
-import io.picoclaw.android.feature.chat.voice.VoiceModeOverlay
+import io.clawdroid.feature.chat.component.ConnectionBanner
+import io.clawdroid.feature.chat.component.ImagePreviewRow
+import io.clawdroid.feature.chat.component.MessageInput
+import io.clawdroid.feature.chat.component.MessageList
+import io.clawdroid.feature.chat.component.StatusIndicator
+import io.clawdroid.feature.chat.voice.CameraCaptureManager
+import io.clawdroid.feature.chat.voice.VoiceModeOverlay
import org.koin.androidx.compose.koinViewModel
import org.koin.compose.koinInject
import java.io.File
@@ -227,7 +227,7 @@ fun ChatScreen(
containerColor = Color.Transparent,
topBar = {
TopAppBar(
- title = { Text("PicoClaw") },
+ title = { Text("ClawDroid") },
colors = TopAppBarDefaults.topAppBarColors(
containerColor = Color.Transparent
),
diff --git a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/screen/SettingsScreen.kt b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/screen/SettingsScreen.kt
similarity index 94%
rename from android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/screen/SettingsScreen.kt
rename to android/feature/chat/src/main/java/io/clawdroid/feature/chat/screen/SettingsScreen.kt
index 98474d537..c5b5afeeb 100644
--- a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/screen/SettingsScreen.kt
+++ b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/screen/SettingsScreen.kt
@@ -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.layout.Arrangement
@@ -41,18 +41,18 @@ import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
-import io.picoclaw.android.core.domain.model.TtsEngineInfo
-import io.picoclaw.android.core.domain.model.TtsVoiceInfo
-import io.picoclaw.android.core.ui.theme.DeepBlack
-import io.picoclaw.android.core.ui.theme.GlassBorder
-import io.picoclaw.android.core.ui.theme.GlassWhite
-import io.picoclaw.android.core.ui.theme.GradientCyan
-import io.picoclaw.android.core.ui.theme.GradientPurple
-import io.picoclaw.android.core.ui.theme.NeonCyan
-import io.picoclaw.android.core.ui.theme.TextPrimary
-import io.picoclaw.android.core.ui.theme.TextSecondary
+import io.clawdroid.core.domain.model.TtsEngineInfo
+import io.clawdroid.core.domain.model.TtsVoiceInfo
+import io.clawdroid.core.ui.theme.DeepBlack
+import io.clawdroid.core.ui.theme.GlassBorder
+import io.clawdroid.core.ui.theme.GlassWhite
+import io.clawdroid.core.ui.theme.GradientCyan
+import io.clawdroid.core.ui.theme.GradientPurple
+import io.clawdroid.core.ui.theme.NeonCyan
+import io.clawdroid.core.ui.theme.TextPrimary
+import io.clawdroid.core.ui.theme.TextSecondary
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
@OptIn(ExperimentalMaterial3Api::class)
diff --git a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/voice/CameraCaptureManager.kt b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/voice/CameraCaptureManager.kt
similarity index 96%
rename from android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/voice/CameraCaptureManager.kt
rename to android/feature/chat/src/main/java/io/clawdroid/feature/chat/voice/CameraCaptureManager.kt
index 861fca74b..c061a5d1f 100644
--- a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/voice/CameraCaptureManager.kt
+++ b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/voice/CameraCaptureManager.kt
@@ -1,4 +1,4 @@
-package io.picoclaw.android.feature.chat.voice
+package io.clawdroid.feature.chat.voice
import android.content.Context
import android.graphics.Bitmap
@@ -9,7 +9,7 @@ import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.camera.view.PreviewView
import androidx.core.content.ContextCompat
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.withContext
import java.io.File
diff --git a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/voice/ScreenCaptureManager.kt b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/voice/ScreenCaptureManager.kt
similarity index 94%
rename from android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/voice/ScreenCaptureManager.kt
rename to android/feature/chat/src/main/java/io/clawdroid/feature/chat/voice/ScreenCaptureManager.kt
index 895b33b3d..ea3bef69d 100644
--- a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/voice/ScreenCaptureManager.kt
+++ b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/voice/ScreenCaptureManager.kt
@@ -1,9 +1,9 @@
-package io.picoclaw.android.feature.chat.voice
+package io.clawdroid.feature.chat.voice
import android.content.Context
import android.graphics.Bitmap
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.delay
import kotlinx.coroutines.withContext
diff --git a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/voice/ScreenshotSource.kt b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/voice/ScreenshotSource.kt
similarity index 74%
rename from android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/voice/ScreenshotSource.kt
rename to android/feature/chat/src/main/java/io/clawdroid/feature/chat/voice/ScreenshotSource.kt
index 668f729ea..64795e18a 100644
--- a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/voice/ScreenshotSource.kt
+++ b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/voice/ScreenshotSource.kt
@@ -1,4 +1,4 @@
-package io.picoclaw.android.feature.chat.voice
+package io.clawdroid.feature.chat.voice
import android.graphics.Bitmap
diff --git a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/voice/SpeechRecognizerWrapper.kt b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/voice/SpeechRecognizerWrapper.kt
similarity index 98%
rename from android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/voice/SpeechRecognizerWrapper.kt
rename to android/feature/chat/src/main/java/io/clawdroid/feature/chat/voice/SpeechRecognizerWrapper.kt
index 8bf3e6d78..386ac1c59 100644
--- a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/voice/SpeechRecognizerWrapper.kt
+++ b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/voice/SpeechRecognizerWrapper.kt
@@ -1,4 +1,4 @@
-package io.picoclaw.android.feature.chat.voice
+package io.clawdroid.feature.chat.voice
import android.content.Context
import android.content.Intent
diff --git a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/voice/TextToSpeechWrapper.kt b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/voice/TextToSpeechWrapper.kt
similarity index 97%
rename from android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/voice/TextToSpeechWrapper.kt
rename to android/feature/chat/src/main/java/io/clawdroid/feature/chat/voice/TextToSpeechWrapper.kt
index cf22b5fa1..9baeadb79 100644
--- a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/voice/TextToSpeechWrapper.kt
+++ b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/voice/TextToSpeechWrapper.kt
@@ -1,9 +1,9 @@
-package io.picoclaw.android.feature.chat.voice
+package io.clawdroid.feature.chat.voice
import android.content.Context
import android.speech.tts.TextToSpeech
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.Dispatchers
import kotlinx.coroutines.SupervisorJob
diff --git a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/voice/VoiceModeManager.kt b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/voice/VoiceModeManager.kt
similarity index 95%
rename from android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/voice/VoiceModeManager.kt
rename to android/feature/chat/src/main/java/io/clawdroid/feature/chat/voice/VoiceModeManager.kt
index b0ccf6674..a0f87c547 100644
--- a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/voice/VoiceModeManager.kt
+++ b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/voice/VoiceModeManager.kt
@@ -1,12 +1,12 @@
-package io.picoclaw.android.feature.chat.voice
+package io.clawdroid.feature.chat.voice
import android.speech.SpeechRecognizer
-import io.picoclaw.android.core.domain.model.MessageSender
-import io.picoclaw.android.core.domain.model.MessageStatus
-import io.picoclaw.android.core.domain.model.VoicePhase
-import io.picoclaw.android.core.domain.usecase.ObserveMessagesUseCase
-import io.picoclaw.android.core.domain.usecase.ObserveStatusUseCase
-import io.picoclaw.android.core.domain.usecase.SendMessageUseCase
+import io.clawdroid.core.domain.model.MessageSender
+import io.clawdroid.core.domain.model.MessageStatus
+import io.clawdroid.core.domain.model.VoicePhase
+import io.clawdroid.core.domain.usecase.ObserveMessagesUseCase
+import io.clawdroid.core.domain.usecase.ObserveStatusUseCase
+import io.clawdroid.core.domain.usecase.SendMessageUseCase
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.Job
diff --git a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/voice/VoiceModeOverlay.kt b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/voice/VoiceModeOverlay.kt
similarity index 95%
rename from android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/voice/VoiceModeOverlay.kt
rename to android/feature/chat/src/main/java/io/clawdroid/feature/chat/voice/VoiceModeOverlay.kt
index 0a8a35bda..e9078d0e3 100644
--- a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/voice/VoiceModeOverlay.kt
+++ b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/voice/VoiceModeOverlay.kt
@@ -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.ImplementationMode
@@ -39,12 +39,12 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
-import io.picoclaw.android.core.domain.model.VoicePhase
-import io.picoclaw.android.core.ui.theme.DeepBlack
-import io.picoclaw.android.core.ui.theme.GradientCyan
-import io.picoclaw.android.core.ui.theme.GradientPurple
-import io.picoclaw.android.core.ui.theme.TextPrimary
-import io.picoclaw.android.core.ui.theme.TextSecondary
+import io.clawdroid.core.domain.model.VoicePhase
+import io.clawdroid.core.ui.theme.DeepBlack
+import io.clawdroid.core.ui.theme.GradientCyan
+import io.clawdroid.core.ui.theme.GradientPurple
+import io.clawdroid.core.ui.theme.TextPrimary
+import io.clawdroid.core.ui.theme.TextSecondary
import com.composables.icons.lucide.R as LucideR
@Composable
diff --git a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/voice/VoiceModeState.kt b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/voice/VoiceModeState.kt
similarity index 82%
rename from android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/voice/VoiceModeState.kt
rename to android/feature/chat/src/main/java/io/clawdroid/feature/chat/voice/VoiceModeState.kt
index d633ce746..39a5f7609 100644
--- a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/voice/VoiceModeState.kt
+++ b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/voice/VoiceModeState.kt
@@ -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)
diff --git a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/voice/VoiceOrb.kt b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/voice/VoiceOrb.kt
similarity index 98%
rename from android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/voice/VoiceOrb.kt
rename to android/feature/chat/src/main/java/io/clawdroid/feature/chat/voice/VoiceOrb.kt
index f2b9877f8..4ae5acab7 100644
--- a/android/feature/chat/src/main/java/io/picoclaw/android/feature/chat/voice/VoiceOrb.kt
+++ b/android/feature/chat/src/main/java/io/clawdroid/feature/chat/voice/VoiceOrb.kt
@@ -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.RepeatMode
@@ -17,7 +17,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.drawscope.DrawScope
import androidx.compose.ui.graphics.drawscope.Stroke
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.cos
import kotlin.math.sin
diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts
index 7a8097661..533b4eb99 100644
--- a/android/settings.gradle.kts
+++ b/android/settings.gradle.kts
@@ -12,7 +12,7 @@ dependencyResolutionManagement {
mavenCentral()
}
}
-rootProject.name = "PicoClaw"
+rootProject.name = "ClawDroid"
include(":app")
include(":feature:chat")
include(":core:domain")
diff --git a/assets/picoclaw_code.gif b/assets/clawdroid_code.gif
similarity index 100%
rename from assets/picoclaw_code.gif
rename to assets/clawdroid_code.gif
diff --git a/assets/picoclaw_detect_person.mp4 b/assets/clawdroid_detect_person.mp4
similarity index 100%
rename from assets/picoclaw_detect_person.mp4
rename to assets/clawdroid_detect_person.mp4
diff --git a/assets/picoclaw_mem.gif b/assets/clawdroid_mem.gif
similarity index 100%
rename from assets/picoclaw_mem.gif
rename to assets/clawdroid_mem.gif
diff --git a/assets/picoclaw_memory.gif b/assets/clawdroid_memory.gif
similarity index 100%
rename from assets/picoclaw_memory.gif
rename to assets/clawdroid_memory.gif
diff --git a/assets/picoclaw_scedule.gif b/assets/clawdroid_scedule.gif
similarity index 100%
rename from assets/picoclaw_scedule.gif
rename to assets/clawdroid_scedule.gif
diff --git a/assets/picoclaw_search.gif b/assets/clawdroid_search.gif
similarity index 100%
rename from assets/picoclaw_search.gif
rename to assets/clawdroid_search.gif
diff --git a/cmd/picoclaw/main.go b/cmd/clawdroid/main.go
similarity index 91%
rename from cmd/picoclaw/main.go
rename to cmd/clawdroid/main.go
index a48cdc49d..8947b79e4 100644
--- a/cmd/picoclaw/main.go
+++ b/cmd/clawdroid/main.go
@@ -1,8 +1,8 @@
-// PicoClaw - Ultra-lightweight personal AI agent
+// ClawDroid - Ultra-lightweight personal AI agent
// Inspired by and based on nanobot: https://github.com/HKUDS/nanobot
// License: MIT
//
-// Copyright (c) 2026 PicoClaw contributors
+// Copyright (c) 2026 ClawDroid contributors
package main
@@ -22,22 +22,22 @@ import (
"time"
"github.com/chzyer/readline"
- "github.com/sipeed/picoclaw/pkg/agent"
- "github.com/sipeed/picoclaw/pkg/auth"
- "github.com/sipeed/picoclaw/pkg/bus"
- "github.com/sipeed/picoclaw/pkg/channels"
- "github.com/sipeed/picoclaw/pkg/config"
- "github.com/sipeed/picoclaw/pkg/cron"
- "github.com/sipeed/picoclaw/pkg/devices"
- "github.com/sipeed/picoclaw/pkg/health"
- "github.com/sipeed/picoclaw/pkg/heartbeat"
- "github.com/sipeed/picoclaw/pkg/logger"
- "github.com/sipeed/picoclaw/pkg/migrate"
- "github.com/sipeed/picoclaw/pkg/providers"
- "github.com/sipeed/picoclaw/pkg/skills"
- "github.com/sipeed/picoclaw/pkg/state"
- "github.com/sipeed/picoclaw/pkg/tools"
- "github.com/sipeed/picoclaw/pkg/voice"
+ "github.com/KarakuriAgent/clawdroid/pkg/agent"
+ "github.com/KarakuriAgent/clawdroid/pkg/auth"
+ "github.com/KarakuriAgent/clawdroid/pkg/bus"
+ "github.com/KarakuriAgent/clawdroid/pkg/channels"
+ "github.com/KarakuriAgent/clawdroid/pkg/config"
+ "github.com/KarakuriAgent/clawdroid/pkg/cron"
+ "github.com/KarakuriAgent/clawdroid/pkg/devices"
+ "github.com/KarakuriAgent/clawdroid/pkg/health"
+ "github.com/KarakuriAgent/clawdroid/pkg/heartbeat"
+ "github.com/KarakuriAgent/clawdroid/pkg/logger"
+ "github.com/KarakuriAgent/clawdroid/pkg/migrate"
+ "github.com/KarakuriAgent/clawdroid/pkg/providers"
+ "github.com/KarakuriAgent/clawdroid/pkg/skills"
+ "github.com/KarakuriAgent/clawdroid/pkg/state"
+ "github.com/KarakuriAgent/clawdroid/pkg/tools"
+ "github.com/KarakuriAgent/clawdroid/pkg/voice"
)
//go:generate cp -r ../../workspace .
@@ -75,7 +75,7 @@ func formatBuildInfo() (build string, goVer string) {
}
func printVersion() {
- fmt.Printf("%s picoclaw %s\n", logo, formatVersion())
+ fmt.Printf("%s clawdroid %s\n", logo, formatVersion())
build, goVer := formatBuildInfo()
if build != "" {
fmt.Printf(" Build: %s\n", build)
@@ -160,7 +160,7 @@ func main() {
// 获取全局配置目录和内置 skills 目录
globalDir := filepath.Dir(getConfigPath())
globalSkillsDir := filepath.Join(globalDir, "skills")
- builtinSkillsDir := filepath.Join(globalDir, "picoclaw", "skills")
+ builtinSkillsDir := filepath.Join(globalDir, "clawdroid", "skills")
skillsLoader := skills.NewSkillsLoader(dataDir, globalSkillsDir, builtinSkillsDir)
switch subcommand {
@@ -168,7 +168,7 @@ func main() {
skillsListCmd(skillsLoader)
case "remove", "uninstall":
if len(os.Args) < 4 {
- fmt.Println("Usage: picoclaw skills remove ")
+ fmt.Println("Usage: clawdroid skills remove ")
return
}
skillsRemoveCmd(dataDir, os.Args[3])
@@ -178,7 +178,7 @@ func main() {
skillsListBuiltinCmd()
case "show":
if len(os.Args) < 4 {
- fmt.Println("Usage: picoclaw skills show ")
+ fmt.Println("Usage: clawdroid skills show ")
return
}
skillsShowCmd(skillsLoader, os.Args[3])
@@ -196,17 +196,17 @@ func main() {
}
func printHelp() {
- fmt.Printf("%s picoclaw - Personal AI Assistant v%s\n\n", logo, version)
- fmt.Println("Usage: picoclaw ")
+ fmt.Printf("%s clawdroid - Personal AI Assistant v%s\n\n", logo, version)
+ fmt.Println("Usage: clawdroid ")
fmt.Println()
fmt.Println("Commands:")
- fmt.Println(" onboard Initialize picoclaw configuration and workspace")
+ fmt.Println(" onboard Initialize clawdroid configuration and workspace")
fmt.Println(" agent Interact with the agent directly")
fmt.Println(" auth Manage authentication (login, logout, status)")
- fmt.Println(" gateway Start picoclaw gateway")
- fmt.Println(" status Show picoclaw status")
+ fmt.Println(" gateway Start clawdroid gateway")
+ fmt.Println(" status Show clawdroid status")
fmt.Println(" cron Manage scheduled tasks")
- fmt.Println(" migrate Migrate from OpenClaw to PicoClaw")
+ fmt.Println(" migrate Migrate from OpenClaw to ClawDroid")
fmt.Println(" skills Manage skills (install, list, remove)")
fmt.Println(" version Show version information")
}
@@ -236,11 +236,11 @@ func onboard() {
os.MkdirAll(workspace, 0755)
createWorkspaceTemplates(dataDir)
- fmt.Printf("%s picoclaw is ready!\n", logo)
+ fmt.Printf("%s clawdroid is ready!\n", logo)
fmt.Println("\nNext steps:")
fmt.Println(" 1. Add your API key to", configPath)
fmt.Println(" Get one at: https://openrouter.ai/keys")
- fmt.Println(" 2. Chat: picoclaw agent -m \"Hello!\"")
+ fmt.Println(" 2. Chat: clawdroid agent -m \"Hello!\"")
}
func copyEmbeddedToTarget(targetDir string) error {
@@ -323,9 +323,9 @@ func migrateCmd() {
opts.OpenClawHome = args[i+1]
i++
}
- case "--picoclaw-home":
+ case "--clawdroid-home":
if i+1 < len(args) {
- opts.PicoClawHome = args[i+1]
+ opts.ClawDroidHome = args[i+1]
i++
}
default:
@@ -347,9 +347,9 @@ func migrateCmd() {
}
func migrateHelp() {
- fmt.Println("\nMigrate from OpenClaw to PicoClaw")
+ fmt.Println("\nMigrate from OpenClaw to ClawDroid")
fmt.Println()
- fmt.Println("Usage: picoclaw migrate [options]")
+ fmt.Println("Usage: clawdroid migrate [options]")
fmt.Println()
fmt.Println("Options:")
fmt.Println(" --dry-run Show what would be migrated without making changes")
@@ -358,13 +358,13 @@ func migrateHelp() {
fmt.Println(" --workspace-only Only migrate workspace files, skip config")
fmt.Println(" --force Skip confirmation prompts")
fmt.Println(" --openclaw-home Override OpenClaw home directory (default: ~/.openclaw)")
- fmt.Println(" --picoclaw-home Override PicoClaw home directory (default: ~/.picoclaw)")
+ fmt.Println(" --clawdroid-home Override ClawDroid home directory (default: ~/.clawdroid)")
fmt.Println()
fmt.Println("Examples:")
- fmt.Println(" picoclaw migrate Detect and migrate from OpenClaw")
- fmt.Println(" picoclaw migrate --dry-run Show what would be migrated")
- fmt.Println(" picoclaw migrate --refresh Re-sync workspace files")
- fmt.Println(" picoclaw migrate --force Migrate without confirmation")
+ fmt.Println(" clawdroid migrate Detect and migrate from OpenClaw")
+ fmt.Println(" clawdroid migrate --dry-run Show what would be migrated")
+ fmt.Println(" clawdroid migrate --refresh Re-sync workspace files")
+ fmt.Println(" clawdroid migrate --force Migrate without confirmation")
}
func agentCmd() {
@@ -433,7 +433,7 @@ func interactiveMode(agentLoop *agent.AgentLoop, sessionKey string) {
rl, err := readline.NewEx(&readline.Config{
Prompt: prompt,
- HistoryFile: filepath.Join(os.TempDir(), ".picoclaw_history"),
+ HistoryFile: filepath.Join(os.TempDir(), ".clawdroid_history"),
HistoryLimit: 100,
InterruptPrompt: "^C",
EOFPrompt: "exit",
@@ -696,7 +696,7 @@ func statusCmd() {
configPath := getConfigPath()
- fmt.Printf("%s picoclaw Status\n", logo)
+ fmt.Printf("%s clawdroid Status\n", logo)
fmt.Printf("Version: %s\n", formatVersion())
build, _ := formatBuildInfo()
if build != "" {
@@ -792,11 +792,11 @@ func authHelp() {
fmt.Println(" --device-code Use device code flow (for headless environments)")
fmt.Println()
fmt.Println("Examples:")
- fmt.Println(" picoclaw auth login --provider openai")
- fmt.Println(" picoclaw auth login --provider openai --device-code")
- fmt.Println(" picoclaw auth login --provider anthropic")
- fmt.Println(" picoclaw auth logout --provider openai")
- fmt.Println(" picoclaw auth status")
+ fmt.Println(" clawdroid auth login --provider openai")
+ fmt.Println(" clawdroid auth login --provider openai --device-code")
+ fmt.Println(" clawdroid auth login --provider anthropic")
+ fmt.Println(" clawdroid auth logout --provider openai")
+ fmt.Println(" clawdroid auth status")
}
func authLoginCmd() {
@@ -955,7 +955,7 @@ func authStatusCmd() {
if len(store.Credentials) == 0 {
fmt.Println("No authenticated providers.")
- fmt.Println("Run: picoclaw auth login --provider ")
+ fmt.Println("Run: clawdroid auth login --provider ")
return
}
@@ -983,7 +983,7 @@ func authStatusCmd() {
func getConfigPath() string {
home, _ := os.UserHomeDir()
- return filepath.Join(home, ".picoclaw", "config.json")
+ return filepath.Join(home, ".clawdroid", "config.json")
}
func setupCronTool(agentLoop *agent.AgentLoop, msgBus *bus.MessageBus, workspace string, dataDir string, restrict bool, execEnabled bool) *cron.CronService {
@@ -1033,7 +1033,7 @@ func cronCmd() {
cronAddCmd(cronStorePath)
case "remove":
if len(os.Args) < 4 {
- fmt.Println("Usage: picoclaw cron remove ")
+ fmt.Println("Usage: clawdroid cron remove ")
return
}
cronRemoveCmd(cronStorePath, os.Args[3])
@@ -1203,7 +1203,7 @@ func cronRemoveCmd(storePath, jobID string) {
func cronEnableCmd(storePath string, disable bool) {
if len(os.Args) < 4 {
- fmt.Println("Usage: picoclaw cron enable/disable ")
+ fmt.Println("Usage: clawdroid cron enable/disable ")
return
}
@@ -1232,13 +1232,13 @@ func skillsHelp() {
fmt.Println(" show Show skill details")
fmt.Println()
fmt.Println("To install custom skills, place SKILL.md files manually in:")
- fmt.Println(" ~/.picoclaw/data/skills//SKILL.md")
+ fmt.Println(" ~/.clawdroid/data/skills//SKILL.md")
fmt.Println()
fmt.Println("Examples:")
- fmt.Println(" picoclaw skills list")
- fmt.Println(" picoclaw skills install-builtin")
- fmt.Println(" picoclaw skills list-builtin")
- fmt.Println(" picoclaw skills remove weather")
+ fmt.Println(" clawdroid skills list")
+ fmt.Println(" clawdroid skills install-builtin")
+ fmt.Println(" clawdroid skills list-builtin")
+ fmt.Println(" clawdroid skills remove weather")
}
func skillsListCmd(loader *skills.SkillsLoader) {
@@ -1277,7 +1277,7 @@ func skillsRemoveCmd(dataDir string, skillName string) {
}
func skillsInstallBuiltinCmd(dataDir string) {
- builtinSkillsDir := "./picoclaw/skills"
+ builtinSkillsDir := "./clawdroid/skills"
skillsDir := filepath.Join(dataDir, "skills")
fmt.Printf("Copying builtin skills to workspace...\n")
@@ -1318,7 +1318,7 @@ func skillsListBuiltinCmd() {
fmt.Printf("Error loading config: %v\n", err)
return
}
- builtinSkillsDir := filepath.Join(filepath.Dir(cfg.WorkspacePath()), "picoclaw", "skills")
+ builtinSkillsDir := filepath.Join(filepath.Dir(cfg.WorkspacePath()), "clawdroid", "skills")
fmt.Println("\nAvailable Builtin Skills:")
fmt.Println("-----------------------")
diff --git a/config/config.example.json b/config/config.example.json
index 3f2e3811c..f938a138f 100644
--- a/config/config.example.json
+++ b/config/config.example.json
@@ -1,8 +1,8 @@
{
"agents": {
"defaults": {
- "workspace": "~/.picoclaw/workspace",
- "data_dir": "~/.picoclaw/data",
+ "workspace": "~/.clawdroid/workspace",
+ "data_dir": "~/.clawdroid/data",
"restrict_to_workspace": true,
"model": "glm-4.7",
"max_tokens": 8192,
diff --git a/doc/android-apk-plan.md b/doc/android-apk-plan.md
index d4ae6c778..8fe34597a 100644
--- a/doc/android-apk-plan.md
+++ b/doc/android-apk-plan.md
@@ -1,8 +1,8 @@
-# PicoClaw Android APK - チャットUI設計プラン
+# ClawDroid Android APK - チャットUI設計プラン
## Context
-PicoClawはTermux上で動作するGo製AIエージェント。WebSocketサーバーチャネル(`pkg/channels/websocket.go`)を通じて外部クライアントと通信可能。このWSサーバーに接続するAndroid APKを作成する。初期リリースはテキスト+画像チャットUI、将来的にボイスUI(Googleアシスタント風)を追加予定。
+ClawDroidはTermux上で動作するGo製AIエージェント。WebSocketサーバーチャネル(`pkg/channels/websocket.go`)を通じて外部クライアントと通信可能。このWSサーバーに接続するAndroid APKを作成する。初期リリースはテキスト+画像チャットUI、将来的にボイスUI(Googleアシスタント風)を追加予定。
## WSプロトコル(確認済み)
@@ -81,8 +81,8 @@ android/
│ │ ├── values/strings.xml
│ │ ├── values/colors.xml
│ │ └── values/themes.xml
-│ └── java/io/picoclaw/android/
-│ ├── PicoClawApp.kt # Application(Koin初期化)
+│ └── java/io/clawdroid/android/
+│ ├── ClawDroidApp.kt # Application(Koin初期化)
│ ├── MainActivity.kt # Single Activity + Navigation
│ └── di/
│ └── AppModule.kt # Koin全体module定義
@@ -90,7 +90,7 @@ android/
├── feature/
│ └── chat/ # === :feature:chat モジュール ===
│ ├── build.gradle.kts
-│ └── src/main/java/io/picoclaw/android/feature/chat/
+│ └── src/main/java/io/clawdroid/android/feature/chat/
│ ├── ChatViewModel.kt
│ ├── ChatUiState.kt
│ ├── ChatEvent.kt
@@ -106,7 +106,7 @@ android/
├── core/
│ ├── domain/ # === :core:domain モジュール ===
│ │ ├── build.gradle.kts
-│ │ └── src/main/java/io/picoclaw/android/core/domain/
+│ │ └── src/main/java/io/clawdroid/android/core/domain/
│ │ ├── model/
│ │ │ ├── ChatMessage.kt
│ │ │ ├── ConnectionState.kt
@@ -121,7 +121,7 @@ android/
│ │
│ ├── data/ # === :core:data モジュール ===
│ │ ├── build.gradle.kts
-│ │ └── src/main/java/io/picoclaw/android/core/data/
+│ │ └── src/main/java/io/clawdroid/android/core/data/
│ │ ├── remote/
│ │ │ ├── WebSocketClient.kt # Ktor WS + auto-reconnect
│ │ │ └── dto/
@@ -142,7 +142,7 @@ android/
│ │
│ └── ui/ # === :core:ui モジュール ===
│ ├── build.gradle.kts
-│ └── src/main/java/io/picoclaw/android/core/ui/
+│ └── src/main/java/io/clawdroid/android/core/ui/
│ └── theme/
│ ├── Theme.kt
│ ├── Color.kt
@@ -368,7 +368,7 @@ LaunchedEffect(shouldLoadMore) {
val appModule = module {
// Room
single {
- Room.databaseBuilder(androidContext(), AppDatabase::class.java, "picoclaw.db").build()
+ Room.databaseBuilder(androidContext(), AppDatabase::class.java, "clawdroid.db").build()
}
single { get().messageDao() }
@@ -414,7 +414,7 @@ dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories { google(); mavenCentral() }
}
-rootProject.name = "PicoClaw"
+rootProject.name = "ClawDroid"
include(":app")
include(":feature:chat")
include(":core:domain")
@@ -541,14 +541,14 @@ KSPは`:core:data`モジュールのみで使用(Room compiler)。
### Phase 7: :app
22. `AppModule.kt`(Koin全体module)
-23. `PicoClawApp.kt`
+23. `ClawDroidApp.kt`
24. `MainActivity.kt`
---
## 検証方法
-1. Termuxでpicoclaw起動(WSサーバーが`127.0.0.1:18793`でリスン)
+1. Termuxでclawdroid起動(WSサーバーが`127.0.0.1:18793`でリスン)
2. APKをビルド・インストール(`./gradlew assembleDebug`)
3. アプリ起動 → ConnectionBannerが「Connected」表示を確認
4. テキスト送信 → エージェントからの応答がチャットに表示されることを確認
diff --git a/doc/picoclaw_community_roadmap_260216.md b/doc/picoclaw_community_roadmap_260216.md
index cfcc30f17..53f4034d8 100644
--- a/doc/picoclaw_community_roadmap_260216.md
+++ b/doc/picoclaw_community_roadmap_260216.md
@@ -1,10 +1,10 @@
-## 🚀 Join the PicoClaw Journey: Call for Community Volunteers & Roadmap Reveal
+## 🚀 Join the ClawDroid Journey: Call for Community Volunteers & Roadmap Reveal
-**Hello, PicoClaw Community!**
+**Hello, ClawDroid Community!**
-First, a massive thank you to everyone for your enthusiasm and PR contributions. It is because of you that PicoClaw continues to iterate and evolve so rapidly. Thanks to the simplicity and accessibility of the **Go language**, we’ve seen a non-stop stream of high-quality PRs!
+First, a massive thank you to everyone for your enthusiasm and PR contributions. It is because of you that ClawDroid continues to iterate and evolve so rapidly. Thanks to the simplicity and accessibility of the **Go language**, we’ve seen a non-stop stream of high-quality PRs!
-PicoClaw is growing much faster than we anticipated. As we are currently in the midst of the **Chinese New Year holiday**, we are looking to recruit community volunteers to help us maintain this incredible momentum.
+ClawDroid is growing much faster than we anticipated. As we are currently in the midst of the **Chinese New Year holiday**, we are looking to recruit community volunteers to help us maintain this incredible momentum.
This document outlines the specific volunteer roles we need right now and provides a look at our upcoming **Roadmap**.
@@ -17,9 +17,9 @@ To show our appreciation, developers who officially join our community operation
### 🎥 Calling All Content Creators!
-Not a developer? You can still help! We welcome users to post **PicoClaw reviews or tutorials**.
+Not a developer? You can still help! We welcome users to post **ClawDroid reviews or tutorials**.
-* **Twitter:** Use the tag **#picoclaw** and mention **@SipeedIO**.
+* **Twitter:** Use the tag **#clawdroid** and mention **@SipeedIO**.
* **Bilibili:** Mention **@Sipeed矽速科技** or send us a DM.
We will be rewarding high-quality content creators with the same perks as our community developers!
@@ -35,7 +35,7 @@ We are looking for experts in the following areas:
2. **Resource Optimization Experts**
-* **The Mission:** Rapid growth has introduced dependencies that are making PicoClaw a bit "heavy." We want to keep it lean.
+* **The Mission:** Rapid growth has introduced dependencies that are making ClawDroid a bit "heavy." We want to keep it lean.
* **Focus:** Analyzing resource growth between releases and trimming redundancy.
* **Priority:** **RAM usage optimization** > Binary size reduction.
@@ -51,10 +51,10 @@ We are looking for experts in the following areas:
5. **AI-Powered CI/CD Optimization**
-* **The Mission:** PicoClaw started as a "vibe coding" experiment; now we want to use AI to manage it.
+* **The Mission:** ClawDroid started as a "vibe coding" experiment; now we want to use AI to manage it.
* **Focus:** Automating builds with AI and exploring AI-driven issue resolution.
-**How to Apply:** > If you are interested in any of the roles above, please send an email to support@sipeed.com with the subject line: [Apply: PicoClaw Expert Volunteer] + Your Desired Role.
+**How to Apply:** > If you are interested in any of the roles above, please send an email to support@sipeed.com with the subject line: [Apply: ClawDroid Expert Volunteer] + Your Desired Role.
Please include a brief introduction and any relevant experience or portfolio links. We will review all applications and grant project permissions to selected contributors!
---
@@ -98,15 +98,15 @@ If you would like to claim a task, please feel free to start a conversation by c
**Everything is open to your creativity!** If you have a wild idea, just PR it.
-1. **The Fast Track:** Once you have at least **one merged PR**, you are eligible to join our **Developer Discord** to help plan the future of PicoClaw.
+1. **The Fast Track:** Once you have at least **one merged PR**, you are eligible to join our **Developer Discord** to help plan the future of ClawDroid.
2. **The Application Track:** If you haven’t submitted a PR yet but want to dive in, email **support@sipeed.com** with the subject:
-> `[Apply Join PicoClaw Dev Group] + Your GitHub Account`
+> `[Apply Join ClawDroid Dev Group] + Your GitHub Account`
> Include the role you're interested in and any evidence of your development experience.
### Looking Ahead
-Powered by PicoClaw, we are crafting a Swarm AI Assistant to transform your environment into a seamless network of personal stewards. By automating the friction of daily life, we empower you to transcend the ordinary and freely explore your creative potential.
+Powered by ClawDroid, we are crafting a Swarm AI Assistant to transform your environment into a seamless network of personal stewards. By automating the friction of daily life, we empower you to transcend the ordinary and freely explore your creative potential.
-**Finally, Happy Chinese New Year to everyone!** May PicoClaw gallop forward in this **Year of the Horse!** 🐎
+**Finally, Happy Chinese New Year to everyone!** May ClawDroid gallop forward in this **Year of the Horse!** 🐎
diff --git a/docker-compose.yml b/docker-compose.yml
index 48769627c..68df56e7e 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,40 +1,40 @@
services:
# ─────────────────────────────────────────────
- # PicoClaw Agent (one-shot query)
- # docker compose run --rm picoclaw-agent -m "Hello"
+ # ClawDroid Agent (one-shot query)
+ # docker compose run --rm clawdroid-agent -m "Hello"
# ─────────────────────────────────────────────
- picoclaw-agent:
+ clawdroid-agent:
build:
context: .
dockerfile: Dockerfile
- container_name: picoclaw-agent
+ container_name: clawdroid-agent
profiles:
- agent
volumes:
- - ./config/config.json:/root/.picoclaw/config.json:ro
- - picoclaw-workspace:/root/.picoclaw/workspace
- entrypoint: ["picoclaw", "agent"]
+ - ./config/config.json:/root/.clawdroid/config.json:ro
+ - clawdroid-workspace:/root/.clawdroid/workspace
+ entrypoint: ["clawdroid", "agent"]
stdin_open: true
tty: true
# ─────────────────────────────────────────────
- # PicoClaw Gateway (Long-running Bot)
- # docker compose up picoclaw-gateway
+ # ClawDroid Gateway (Long-running Bot)
+ # docker compose up clawdroid-gateway
# ─────────────────────────────────────────────
- picoclaw-gateway:
+ clawdroid-gateway:
build:
context: .
dockerfile: Dockerfile
- container_name: picoclaw-gateway
+ container_name: clawdroid-gateway
restart: unless-stopped
profiles:
- gateway
volumes:
# Configuration file
- - ./config/config.json:/root/.picoclaw/config.json:ro
+ - ./config/config.json:/root/.clawdroid/config.json:ro
# Persistent workspace (sessions, memory, logs)
- - picoclaw-workspace:/root/.picoclaw/workspace
+ - clawdroid-workspace:/root/.clawdroid/workspace
command: ["gateway"]
volumes:
- picoclaw-workspace:
+ clawdroid-workspace:
diff --git a/go.mod b/go.mod
index d0a92b628..bc2e8a240 100644
--- a/go.mod
+++ b/go.mod
@@ -1,4 +1,4 @@
-module github.com/sipeed/picoclaw
+module github.com/KarakuriAgent/clawdroid
go 1.25.6
diff --git a/pkg/agent/context.go b/pkg/agent/context.go
index d37cc224c..69acd5426 100644
--- a/pkg/agent/context.go
+++ b/pkg/agent/context.go
@@ -7,11 +7,11 @@ import (
"strings"
"time"
- "github.com/sipeed/picoclaw/pkg/logger"
- "github.com/sipeed/picoclaw/pkg/mcp"
- "github.com/sipeed/picoclaw/pkg/providers"
- "github.com/sipeed/picoclaw/pkg/skills"
- "github.com/sipeed/picoclaw/pkg/tools"
+ "github.com/KarakuriAgent/clawdroid/pkg/logger"
+ "github.com/KarakuriAgent/clawdroid/pkg/mcp"
+ "github.com/KarakuriAgent/clawdroid/pkg/providers"
+ "github.com/KarakuriAgent/clawdroid/pkg/skills"
+ "github.com/KarakuriAgent/clawdroid/pkg/tools"
)
// SilentReplyToken is the token the LLM emits when it has nothing to say.
@@ -34,7 +34,7 @@ func getGlobalConfigDir() string {
if err != nil {
return ""
}
- return filepath.Join(home, ".picoclaw")
+ return filepath.Join(home, ".clawdroid")
}
func NewContextBuilder(workspace string, dataDir string) *ContextBuilder {
diff --git a/pkg/agent/loop.go b/pkg/agent/loop.go
index 1d27f019d..42c10228d 100644
--- a/pkg/agent/loop.go
+++ b/pkg/agent/loop.go
@@ -1,8 +1,8 @@
-// PicoClaw - Ultra-lightweight personal AI agent
+// ClawDroid - Ultra-lightweight personal AI agent
// Inspired by and based on nanobot: https://github.com/HKUDS/nanobot
// License: MIT
//
-// Copyright (c) 2026 PicoClaw contributors
+// Copyright (c) 2026 ClawDroid contributors
package agent
@@ -18,17 +18,17 @@ import (
"time"
"unicode/utf8"
- "github.com/sipeed/picoclaw/pkg/bus"
- "github.com/sipeed/picoclaw/pkg/channels"
- "github.com/sipeed/picoclaw/pkg/config"
- "github.com/sipeed/picoclaw/pkg/constants"
- "github.com/sipeed/picoclaw/pkg/logger"
- "github.com/sipeed/picoclaw/pkg/mcp"
- "github.com/sipeed/picoclaw/pkg/providers"
- "github.com/sipeed/picoclaw/pkg/session"
- "github.com/sipeed/picoclaw/pkg/state"
- "github.com/sipeed/picoclaw/pkg/tools"
- "github.com/sipeed/picoclaw/pkg/utils"
+ "github.com/KarakuriAgent/clawdroid/pkg/bus"
+ "github.com/KarakuriAgent/clawdroid/pkg/channels"
+ "github.com/KarakuriAgent/clawdroid/pkg/config"
+ "github.com/KarakuriAgent/clawdroid/pkg/constants"
+ "github.com/KarakuriAgent/clawdroid/pkg/logger"
+ "github.com/KarakuriAgent/clawdroid/pkg/mcp"
+ "github.com/KarakuriAgent/clawdroid/pkg/providers"
+ "github.com/KarakuriAgent/clawdroid/pkg/session"
+ "github.com/KarakuriAgent/clawdroid/pkg/state"
+ "github.com/KarakuriAgent/clawdroid/pkg/tools"
+ "github.com/KarakuriAgent/clawdroid/pkg/utils"
)
type AgentLoop struct {
diff --git a/pkg/agent/loop_test.go b/pkg/agent/loop_test.go
index dedbc313d..2c1947a7c 100644
--- a/pkg/agent/loop_test.go
+++ b/pkg/agent/loop_test.go
@@ -9,10 +9,10 @@ import (
"testing"
"time"
- "github.com/sipeed/picoclaw/pkg/bus"
- "github.com/sipeed/picoclaw/pkg/config"
- "github.com/sipeed/picoclaw/pkg/providers"
- "github.com/sipeed/picoclaw/pkg/tools"
+ "github.com/KarakuriAgent/clawdroid/pkg/bus"
+ "github.com/KarakuriAgent/clawdroid/pkg/config"
+ "github.com/KarakuriAgent/clawdroid/pkg/providers"
+ "github.com/KarakuriAgent/clawdroid/pkg/tools"
)
// mockProvider is a simple mock LLM provider for testing
diff --git a/pkg/agent/media.go b/pkg/agent/media.go
index 763a75c33..b5487e501 100644
--- a/pkg/agent/media.go
+++ b/pkg/agent/media.go
@@ -9,8 +9,8 @@ import (
"strings"
"time"
- "github.com/sipeed/picoclaw/pkg/logger"
- "github.com/sipeed/picoclaw/pkg/providers"
+ "github.com/KarakuriAgent/clawdroid/pkg/logger"
+ "github.com/KarakuriAgent/clawdroid/pkg/providers"
)
// PersistMedia saves base64 data URL images to the mediaDir as files.
diff --git a/pkg/agent/memory.go b/pkg/agent/memory.go
index ea3650d11..e06d598c8 100644
--- a/pkg/agent/memory.go
+++ b/pkg/agent/memory.go
@@ -1,8 +1,8 @@
-// PicoClaw - Ultra-lightweight personal AI agent
+// ClawDroid - Ultra-lightweight personal AI agent
// Inspired by and based on nanobot: https://github.com/HKUDS/nanobot
// License: MIT
//
-// Copyright (c) 2026 PicoClaw contributors
+// Copyright (c) 2026 ClawDroid contributors
package agent
diff --git a/pkg/auth/oauth.go b/pkg/auth/oauth.go
index dcd91bebd..f43032b3a 100644
--- a/pkg/auth/oauth.go
+++ b/pkg/auth/oauth.go
@@ -101,7 +101,7 @@ func LoginBrowser(cfg OAuthProviderConfig) (*AuthCredential, error) {
fmt.Printf("Could not open browser automatically.\nPlease open this URL manually:\n\n%s\n\n", authURL)
}
- fmt.Println("If you're running in a headless environment, use: picoclaw auth login --provider openai --device-code")
+ fmt.Println("If you're running in a headless environment, use: clawdroid auth login --provider openai --device-code")
fmt.Println("Waiting for authentication in browser...")
select {
@@ -311,7 +311,7 @@ func buildAuthorizeURL(cfg OAuthProviderConfig, pkce PKCECodes, state, redirectU
"state": {state},
}
if strings.Contains(strings.ToLower(cfg.Issuer), "auth.openai.com") {
- params.Set("originator", "picoclaw")
+ params.Set("originator", "clawdroid")
}
if cfg.Originator != "" {
params.Set("originator", cfg.Originator)
diff --git a/pkg/auth/store.go b/pkg/auth/store.go
index 20724929a..64fe92f5b 100644
--- a/pkg/auth/store.go
+++ b/pkg/auth/store.go
@@ -36,7 +36,7 @@ func (c *AuthCredential) NeedsRefresh() bool {
func authFilePath() string {
home, _ := os.UserHomeDir()
- return filepath.Join(home, ".picoclaw", "auth.json")
+ return filepath.Join(home, ".clawdroid", "auth.json")
}
func LoadStore() (*AuthStore, error) {
diff --git a/pkg/auth/store_test.go b/pkg/auth/store_test.go
index d96b460a1..e2f935907 100644
--- a/pkg/auth/store_test.go
+++ b/pkg/auth/store_test.go
@@ -102,7 +102,7 @@ func TestStoreFilePermissions(t *testing.T) {
t.Fatalf("SetCredential() error: %v", err)
}
- path := filepath.Join(tmpDir, ".picoclaw", "auth.json")
+ path := filepath.Join(tmpDir, ".clawdroid", "auth.json")
info, err := os.Stat(path)
if err != nil {
t.Fatalf("Stat() error: %v", err)
diff --git a/pkg/broadcast/broadcast.go b/pkg/broadcast/broadcast.go
index fdcee1634..79ed8847f 100644
--- a/pkg/broadcast/broadcast.go
+++ b/pkg/broadcast/broadcast.go
@@ -5,14 +5,14 @@ import (
"fmt"
"os/exec"
- "github.com/sipeed/picoclaw/pkg/logger"
+ "github.com/KarakuriAgent/clawdroid/pkg/logger"
)
const (
// Action is the intent action the Android app listens for.
- Action = "io.picoclaw.android.AGENT_MESSAGE"
+ Action = "io.clawdroid.AGENT_MESSAGE"
// Package is the Android app package name.
- Package = "io.picoclaw.android"
+ Package = "io.clawdroid"
)
// Message represents a message to send via Android broadcast.
diff --git a/pkg/channels/base.go b/pkg/channels/base.go
index 8d2d9a65b..c25e36222 100644
--- a/pkg/channels/base.go
+++ b/pkg/channels/base.go
@@ -5,7 +5,7 @@ import (
"fmt"
"strings"
- "github.com/sipeed/picoclaw/pkg/bus"
+ "github.com/KarakuriAgent/clawdroid/pkg/bus"
)
type Channel interface {
diff --git a/pkg/channels/dingtalk.go b/pkg/channels/dingtalk.go
index 263785c0c..4c7c0fa62 100644
--- a/pkg/channels/dingtalk.go
+++ b/pkg/channels/dingtalk.go
@@ -1,4 +1,4 @@
-// PicoClaw - Ultra-lightweight personal AI agent
+// ClawDroid - Ultra-lightweight personal AI agent
// DingTalk channel implementation using Stream Mode
package channels
@@ -10,10 +10,10 @@ import (
"github.com/open-dingtalk/dingtalk-stream-sdk-go/chatbot"
"github.com/open-dingtalk/dingtalk-stream-sdk-go/client"
- "github.com/sipeed/picoclaw/pkg/bus"
- "github.com/sipeed/picoclaw/pkg/config"
- "github.com/sipeed/picoclaw/pkg/logger"
- "github.com/sipeed/picoclaw/pkg/utils"
+ "github.com/KarakuriAgent/clawdroid/pkg/bus"
+ "github.com/KarakuriAgent/clawdroid/pkg/config"
+ "github.com/KarakuriAgent/clawdroid/pkg/logger"
+ "github.com/KarakuriAgent/clawdroid/pkg/utils"
)
// DingTalkChannel implements the Channel interface for DingTalk (钉钉)
@@ -175,7 +175,7 @@ func (c *DingTalkChannel) SendDirectReply(ctx context.Context, sessionWebhook, c
// Convert string content to []byte for the API
contentBytes := []byte(content)
- titleBytes := []byte("PicoClaw")
+ titleBytes := []byte("ClawDroid")
// Send markdown formatted reply
err := replier.SimpleReplyMarkdown(
diff --git a/pkg/channels/discord.go b/pkg/channels/discord.go
index 3a97f9c33..348fb7275 100644
--- a/pkg/channels/discord.go
+++ b/pkg/channels/discord.go
@@ -8,11 +8,11 @@ import (
"time"
"github.com/bwmarrin/discordgo"
- "github.com/sipeed/picoclaw/pkg/bus"
- "github.com/sipeed/picoclaw/pkg/config"
- "github.com/sipeed/picoclaw/pkg/logger"
- "github.com/sipeed/picoclaw/pkg/utils"
- "github.com/sipeed/picoclaw/pkg/voice"
+ "github.com/KarakuriAgent/clawdroid/pkg/bus"
+ "github.com/KarakuriAgent/clawdroid/pkg/config"
+ "github.com/KarakuriAgent/clawdroid/pkg/logger"
+ "github.com/KarakuriAgent/clawdroid/pkg/utils"
+ "github.com/KarakuriAgent/clawdroid/pkg/voice"
)
const (
diff --git a/pkg/channels/feishu_32.go b/pkg/channels/feishu_32.go
index 4e60fbc11..e90b65269 100644
--- a/pkg/channels/feishu_32.go
+++ b/pkg/channels/feishu_32.go
@@ -6,8 +6,8 @@ import (
"context"
"errors"
- "github.com/sipeed/picoclaw/pkg/bus"
- "github.com/sipeed/picoclaw/pkg/config"
+ "github.com/KarakuriAgent/clawdroid/pkg/bus"
+ "github.com/KarakuriAgent/clawdroid/pkg/config"
)
// FeishuChannel is a stub implementation for 32-bit architectures
diff --git a/pkg/channels/feishu_64.go b/pkg/channels/feishu_64.go
index 39dc40ac1..f9cb43fe6 100644
--- a/pkg/channels/feishu_64.go
+++ b/pkg/channels/feishu_64.go
@@ -14,10 +14,10 @@ import (
larkim "github.com/larksuite/oapi-sdk-go/v3/service/im/v1"
larkws "github.com/larksuite/oapi-sdk-go/v3/ws"
- "github.com/sipeed/picoclaw/pkg/bus"
- "github.com/sipeed/picoclaw/pkg/config"
- "github.com/sipeed/picoclaw/pkg/logger"
- "github.com/sipeed/picoclaw/pkg/utils"
+ "github.com/KarakuriAgent/clawdroid/pkg/bus"
+ "github.com/KarakuriAgent/clawdroid/pkg/config"
+ "github.com/KarakuriAgent/clawdroid/pkg/logger"
+ "github.com/KarakuriAgent/clawdroid/pkg/utils"
)
type FeishuChannel struct {
@@ -108,7 +108,7 @@ func (c *FeishuChannel) Send(ctx context.Context, msg bus.OutboundMessage) error
ReceiveId(msg.ChatID).
MsgType(larkim.MsgTypeText).
Content(string(payload)).
- Uuid(fmt.Sprintf("picoclaw-%d", time.Now().UnixNano())).
+ Uuid(fmt.Sprintf("clawdroid-%d", time.Now().UnixNano())).
Build()).
Build()
diff --git a/pkg/channels/line.go b/pkg/channels/line.go
index c708ded7c..40cdbee65 100644
--- a/pkg/channels/line.go
+++ b/pkg/channels/line.go
@@ -15,10 +15,10 @@ import (
"sync"
"time"
- "github.com/sipeed/picoclaw/pkg/bus"
- "github.com/sipeed/picoclaw/pkg/config"
- "github.com/sipeed/picoclaw/pkg/logger"
- "github.com/sipeed/picoclaw/pkg/utils"
+ "github.com/KarakuriAgent/clawdroid/pkg/bus"
+ "github.com/KarakuriAgent/clawdroid/pkg/config"
+ "github.com/KarakuriAgent/clawdroid/pkg/logger"
+ "github.com/KarakuriAgent/clawdroid/pkg/utils"
)
const (
diff --git a/pkg/channels/maixcam.go b/pkg/channels/maixcam.go
index 5fc19adbe..bf8a17e9d 100644
--- a/pkg/channels/maixcam.go
+++ b/pkg/channels/maixcam.go
@@ -7,9 +7,9 @@ import (
"net"
"sync"
- "github.com/sipeed/picoclaw/pkg/bus"
- "github.com/sipeed/picoclaw/pkg/config"
- "github.com/sipeed/picoclaw/pkg/logger"
+ "github.com/KarakuriAgent/clawdroid/pkg/bus"
+ "github.com/KarakuriAgent/clawdroid/pkg/config"
+ "github.com/KarakuriAgent/clawdroid/pkg/logger"
)
type MaixCamChannel struct {
diff --git a/pkg/channels/manager.go b/pkg/channels/manager.go
index 32791caf2..57e45f4d4 100644
--- a/pkg/channels/manager.go
+++ b/pkg/channels/manager.go
@@ -1,8 +1,8 @@
-// PicoClaw - Ultra-lightweight personal AI agent
+// ClawDroid - Ultra-lightweight personal AI agent
// Inspired by and based on nanobot: https://github.com/HKUDS/nanobot
// License: MIT
//
-// Copyright (c) 2026 PicoClaw contributors
+// Copyright (c) 2026 ClawDroid contributors
package channels
@@ -11,10 +11,10 @@ import (
"fmt"
"sync"
- "github.com/sipeed/picoclaw/pkg/bus"
- "github.com/sipeed/picoclaw/pkg/config"
- "github.com/sipeed/picoclaw/pkg/constants"
- "github.com/sipeed/picoclaw/pkg/logger"
+ "github.com/KarakuriAgent/clawdroid/pkg/bus"
+ "github.com/KarakuriAgent/clawdroid/pkg/config"
+ "github.com/KarakuriAgent/clawdroid/pkg/constants"
+ "github.com/KarakuriAgent/clawdroid/pkg/logger"
)
type Manager struct {
diff --git a/pkg/channels/onebot.go b/pkg/channels/onebot.go
index 5d97fab9c..5699a4f63 100644
--- a/pkg/channels/onebot.go
+++ b/pkg/channels/onebot.go
@@ -11,9 +11,9 @@ import (
"github.com/gorilla/websocket"
- "github.com/sipeed/picoclaw/pkg/bus"
- "github.com/sipeed/picoclaw/pkg/config"
- "github.com/sipeed/picoclaw/pkg/logger"
+ "github.com/KarakuriAgent/clawdroid/pkg/bus"
+ "github.com/KarakuriAgent/clawdroid/pkg/config"
+ "github.com/KarakuriAgent/clawdroid/pkg/logger"
)
type OneBotChannel struct {
diff --git a/pkg/channels/qq.go b/pkg/channels/qq.go
index 18b4ca0e0..062b0a773 100644
--- a/pkg/channels/qq.go
+++ b/pkg/channels/qq.go
@@ -13,9 +13,9 @@ import (
"github.com/tencent-connect/botgo/token"
"golang.org/x/oauth2"
- "github.com/sipeed/picoclaw/pkg/bus"
- "github.com/sipeed/picoclaw/pkg/config"
- "github.com/sipeed/picoclaw/pkg/logger"
+ "github.com/KarakuriAgent/clawdroid/pkg/bus"
+ "github.com/KarakuriAgent/clawdroid/pkg/config"
+ "github.com/KarakuriAgent/clawdroid/pkg/logger"
)
type QQChannel struct {
diff --git a/pkg/channels/slack.go b/pkg/channels/slack.go
index 1bf367bc4..6f45bf2e8 100644
--- a/pkg/channels/slack.go
+++ b/pkg/channels/slack.go
@@ -12,11 +12,11 @@ import (
"github.com/slack-go/slack/slackevents"
"github.com/slack-go/slack/socketmode"
- "github.com/sipeed/picoclaw/pkg/bus"
- "github.com/sipeed/picoclaw/pkg/config"
- "github.com/sipeed/picoclaw/pkg/logger"
- "github.com/sipeed/picoclaw/pkg/utils"
- "github.com/sipeed/picoclaw/pkg/voice"
+ "github.com/KarakuriAgent/clawdroid/pkg/bus"
+ "github.com/KarakuriAgent/clawdroid/pkg/config"
+ "github.com/KarakuriAgent/clawdroid/pkg/logger"
+ "github.com/KarakuriAgent/clawdroid/pkg/utils"
+ "github.com/KarakuriAgent/clawdroid/pkg/voice"
)
type SlackChannel struct {
diff --git a/pkg/channels/slack_test.go b/pkg/channels/slack_test.go
index 3707c2703..4fa27f0ea 100644
--- a/pkg/channels/slack_test.go
+++ b/pkg/channels/slack_test.go
@@ -3,8 +3,8 @@ package channels
import (
"testing"
- "github.com/sipeed/picoclaw/pkg/bus"
- "github.com/sipeed/picoclaw/pkg/config"
+ "github.com/KarakuriAgent/clawdroid/pkg/bus"
+ "github.com/KarakuriAgent/clawdroid/pkg/config"
)
func TestParseSlackChatID(t *testing.T) {
diff --git a/pkg/channels/telegram.go b/pkg/channels/telegram.go
index 7b43c5df2..24ec2e0b7 100644
--- a/pkg/channels/telegram.go
+++ b/pkg/channels/telegram.go
@@ -17,11 +17,11 @@ import (
"github.com/mymmrac/telego/telegohandler"
tu "github.com/mymmrac/telego/telegoutil"
- "github.com/sipeed/picoclaw/pkg/bus"
- "github.com/sipeed/picoclaw/pkg/config"
- "github.com/sipeed/picoclaw/pkg/logger"
- "github.com/sipeed/picoclaw/pkg/utils"
- "github.com/sipeed/picoclaw/pkg/voice"
+ "github.com/KarakuriAgent/clawdroid/pkg/bus"
+ "github.com/KarakuriAgent/clawdroid/pkg/config"
+ "github.com/KarakuriAgent/clawdroid/pkg/logger"
+ "github.com/KarakuriAgent/clawdroid/pkg/utils"
+ "github.com/KarakuriAgent/clawdroid/pkg/voice"
)
type TelegramChannel struct {
diff --git a/pkg/channels/telegram_commands.go b/pkg/channels/telegram_commands.go
index df245e156..0acc2cdd3 100644
--- a/pkg/channels/telegram_commands.go
+++ b/pkg/channels/telegram_commands.go
@@ -6,7 +6,7 @@ import (
"strings"
"github.com/mymmrac/telego"
- "github.com/sipeed/picoclaw/pkg/config"
+ "github.com/KarakuriAgent/clawdroid/pkg/config"
)
type TelegramCommander interface {
@@ -54,7 +54,7 @@ func (c *cmd) Help(ctx context.Context, message telego.Message) error {
func (c *cmd) Start(ctx context.Context, message telego.Message) error {
_, err := c.bot.SendMessage(ctx, &telego.SendMessageParams{
ChatID: telego.ChatID{ID: message.Chat.ID},
- Text: "Hello! I am PicoClaw 🦞",
+ Text: "Hello! I am ClawDroid 🦞",
ReplyParameters: &telego.ReplyParameters{
MessageID: message.MessageID,
},
diff --git a/pkg/channels/websocket.go b/pkg/channels/websocket.go
index 0dc4bad6b..288aa6cac 100644
--- a/pkg/channels/websocket.go
+++ b/pkg/channels/websocket.go
@@ -9,14 +9,14 @@ import (
"github.com/google/uuid"
"github.com/gorilla/websocket"
- "github.com/sipeed/picoclaw/pkg/broadcast"
- "github.com/sipeed/picoclaw/pkg/bus"
- "github.com/sipeed/picoclaw/pkg/config"
- "github.com/sipeed/picoclaw/pkg/logger"
- "github.com/sipeed/picoclaw/pkg/tools"
+ "github.com/KarakuriAgent/clawdroid/pkg/broadcast"
+ "github.com/KarakuriAgent/clawdroid/pkg/bus"
+ "github.com/KarakuriAgent/clawdroid/pkg/config"
+ "github.com/KarakuriAgent/clawdroid/pkg/logger"
+ "github.com/KarakuriAgent/clawdroid/pkg/tools"
)
-// wsIncoming is the JSON message sent from APK to picoclaw.
+// wsIncoming is the JSON message sent from APK to clawdroid.
type wsIncoming struct {
Content string `json:"content"`
SenderID string `json:"sender_id,omitempty"`
@@ -26,7 +26,7 @@ type wsIncoming struct {
RequestID string `json:"request_id,omitempty"` // correlates with tool_request
}
-// wsOutgoing is the JSON message sent from picoclaw to APK.
+// wsOutgoing is the JSON message sent from clawdroid to APK.
type wsOutgoing struct {
Content string `json:"content"`
Type string `json:"type,omitempty"`
diff --git a/pkg/channels/whatsapp.go b/pkg/channels/whatsapp.go
index c95e59578..c5179828a 100644
--- a/pkg/channels/whatsapp.go
+++ b/pkg/channels/whatsapp.go
@@ -10,9 +10,9 @@ import (
"github.com/gorilla/websocket"
- "github.com/sipeed/picoclaw/pkg/bus"
- "github.com/sipeed/picoclaw/pkg/config"
- "github.com/sipeed/picoclaw/pkg/utils"
+ "github.com/KarakuriAgent/clawdroid/pkg/bus"
+ "github.com/KarakuriAgent/clawdroid/pkg/config"
+ "github.com/KarakuriAgent/clawdroid/pkg/utils"
)
type WhatsAppChannel struct {
diff --git a/pkg/config/config.go b/pkg/config/config.go
index e396a9982..f95f8a225 100644
--- a/pkg/config/config.go
+++ b/pkg/config/config.go
@@ -60,15 +60,15 @@ type AgentsConfig struct {
}
type AgentDefaults struct {
- Workspace string `json:"workspace" env:"PICOCLAW_AGENTS_DEFAULTS_WORKSPACE"`
- DataDir string `json:"data_dir" env:"PICOCLAW_AGENTS_DEFAULTS_DATA_DIR"`
- RestrictToWorkspace bool `json:"restrict_to_workspace" env:"PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE"`
- Provider string `json:"provider" env:"PICOCLAW_AGENTS_DEFAULTS_PROVIDER"`
- Model string `json:"model" env:"PICOCLAW_AGENTS_DEFAULTS_MODEL"`
- MaxTokens int `json:"max_tokens" env:"PICOCLAW_AGENTS_DEFAULTS_MAX_TOKENS"`
- ContextWindow int `json:"context_window" env:"PICOCLAW_AGENTS_DEFAULTS_CONTEXT_WINDOW"`
- Temperature float64 `json:"temperature" env:"PICOCLAW_AGENTS_DEFAULTS_TEMPERATURE"`
- MaxToolIterations int `json:"max_tool_iterations" env:"PICOCLAW_AGENTS_DEFAULTS_MAX_TOOL_ITERATIONS"`
+ Workspace string `json:"workspace" env:"CLAWDROID_AGENTS_DEFAULTS_WORKSPACE"`
+ DataDir string `json:"data_dir" env:"CLAWDROID_AGENTS_DEFAULTS_DATA_DIR"`
+ RestrictToWorkspace bool `json:"restrict_to_workspace" env:"CLAWDROID_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE"`
+ Provider string `json:"provider" env:"CLAWDROID_AGENTS_DEFAULTS_PROVIDER"`
+ Model string `json:"model" env:"CLAWDROID_AGENTS_DEFAULTS_MODEL"`
+ MaxTokens int `json:"max_tokens" env:"CLAWDROID_AGENTS_DEFAULTS_MAX_TOKENS"`
+ ContextWindow int `json:"context_window" env:"CLAWDROID_AGENTS_DEFAULTS_CONTEXT_WINDOW"`
+ Temperature float64 `json:"temperature" env:"CLAWDROID_AGENTS_DEFAULTS_TEMPERATURE"`
+ MaxToolIterations int `json:"max_tool_iterations" env:"CLAWDROID_AGENTS_DEFAULTS_MAX_TOOL_ITERATIONS"`
}
type ChannelsConfig struct {
@@ -86,101 +86,101 @@ type ChannelsConfig struct {
}
type WhatsAppConfig struct {
- Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_WHATSAPP_ENABLED"`
- BridgeURL string `json:"bridge_url" env:"PICOCLAW_CHANNELS_WHATSAPP_BRIDGE_URL"`
- AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_WHATSAPP_ALLOW_FROM"`
+ Enabled bool `json:"enabled" env:"CLAWDROID_CHANNELS_WHATSAPP_ENABLED"`
+ BridgeURL string `json:"bridge_url" env:"CLAWDROID_CHANNELS_WHATSAPP_BRIDGE_URL"`
+ AllowFrom FlexibleStringSlice `json:"allow_from" env:"CLAWDROID_CHANNELS_WHATSAPP_ALLOW_FROM"`
}
type TelegramConfig struct {
- Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_TELEGRAM_ENABLED"`
- Token string `json:"token" env:"PICOCLAW_CHANNELS_TELEGRAM_TOKEN"`
- Proxy string `json:"proxy" env:"PICOCLAW_CHANNELS_TELEGRAM_PROXY"`
- AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_TELEGRAM_ALLOW_FROM"`
+ Enabled bool `json:"enabled" env:"CLAWDROID_CHANNELS_TELEGRAM_ENABLED"`
+ Token string `json:"token" env:"CLAWDROID_CHANNELS_TELEGRAM_TOKEN"`
+ Proxy string `json:"proxy" env:"CLAWDROID_CHANNELS_TELEGRAM_PROXY"`
+ AllowFrom FlexibleStringSlice `json:"allow_from" env:"CLAWDROID_CHANNELS_TELEGRAM_ALLOW_FROM"`
}
type FeishuConfig struct {
- Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_FEISHU_ENABLED"`
- AppID string `json:"app_id" env:"PICOCLAW_CHANNELS_FEISHU_APP_ID"`
- AppSecret string `json:"app_secret" env:"PICOCLAW_CHANNELS_FEISHU_APP_SECRET"`
- EncryptKey string `json:"encrypt_key" env:"PICOCLAW_CHANNELS_FEISHU_ENCRYPT_KEY"`
- VerificationToken string `json:"verification_token" env:"PICOCLAW_CHANNELS_FEISHU_VERIFICATION_TOKEN"`
- AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_FEISHU_ALLOW_FROM"`
+ Enabled bool `json:"enabled" env:"CLAWDROID_CHANNELS_FEISHU_ENABLED"`
+ AppID string `json:"app_id" env:"CLAWDROID_CHANNELS_FEISHU_APP_ID"`
+ AppSecret string `json:"app_secret" env:"CLAWDROID_CHANNELS_FEISHU_APP_SECRET"`
+ EncryptKey string `json:"encrypt_key" env:"CLAWDROID_CHANNELS_FEISHU_ENCRYPT_KEY"`
+ VerificationToken string `json:"verification_token" env:"CLAWDROID_CHANNELS_FEISHU_VERIFICATION_TOKEN"`
+ AllowFrom FlexibleStringSlice `json:"allow_from" env:"CLAWDROID_CHANNELS_FEISHU_ALLOW_FROM"`
}
type DiscordConfig struct {
- Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_DISCORD_ENABLED"`
- Token string `json:"token" env:"PICOCLAW_CHANNELS_DISCORD_TOKEN"`
- AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_DISCORD_ALLOW_FROM"`
+ Enabled bool `json:"enabled" env:"CLAWDROID_CHANNELS_DISCORD_ENABLED"`
+ Token string `json:"token" env:"CLAWDROID_CHANNELS_DISCORD_TOKEN"`
+ AllowFrom FlexibleStringSlice `json:"allow_from" env:"CLAWDROID_CHANNELS_DISCORD_ALLOW_FROM"`
}
type MaixCamConfig struct {
- Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_MAIXCAM_ENABLED"`
- Host string `json:"host" env:"PICOCLAW_CHANNELS_MAIXCAM_HOST"`
- Port int `json:"port" env:"PICOCLAW_CHANNELS_MAIXCAM_PORT"`
- AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_MAIXCAM_ALLOW_FROM"`
+ Enabled bool `json:"enabled" env:"CLAWDROID_CHANNELS_MAIXCAM_ENABLED"`
+ Host string `json:"host" env:"CLAWDROID_CHANNELS_MAIXCAM_HOST"`
+ Port int `json:"port" env:"CLAWDROID_CHANNELS_MAIXCAM_PORT"`
+ AllowFrom FlexibleStringSlice `json:"allow_from" env:"CLAWDROID_CHANNELS_MAIXCAM_ALLOW_FROM"`
}
type QQConfig struct {
- Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_QQ_ENABLED"`
- AppID string `json:"app_id" env:"PICOCLAW_CHANNELS_QQ_APP_ID"`
- AppSecret string `json:"app_secret" env:"PICOCLAW_CHANNELS_QQ_APP_SECRET"`
- AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_QQ_ALLOW_FROM"`
+ Enabled bool `json:"enabled" env:"CLAWDROID_CHANNELS_QQ_ENABLED"`
+ AppID string `json:"app_id" env:"CLAWDROID_CHANNELS_QQ_APP_ID"`
+ AppSecret string `json:"app_secret" env:"CLAWDROID_CHANNELS_QQ_APP_SECRET"`
+ AllowFrom FlexibleStringSlice `json:"allow_from" env:"CLAWDROID_CHANNELS_QQ_ALLOW_FROM"`
}
type DingTalkConfig struct {
- Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_DINGTALK_ENABLED"`
- ClientID string `json:"client_id" env:"PICOCLAW_CHANNELS_DINGTALK_CLIENT_ID"`
- ClientSecret string `json:"client_secret" env:"PICOCLAW_CHANNELS_DINGTALK_CLIENT_SECRET"`
- AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_DINGTALK_ALLOW_FROM"`
+ Enabled bool `json:"enabled" env:"CLAWDROID_CHANNELS_DINGTALK_ENABLED"`
+ ClientID string `json:"client_id" env:"CLAWDROID_CHANNELS_DINGTALK_CLIENT_ID"`
+ ClientSecret string `json:"client_secret" env:"CLAWDROID_CHANNELS_DINGTALK_CLIENT_SECRET"`
+ AllowFrom FlexibleStringSlice `json:"allow_from" env:"CLAWDROID_CHANNELS_DINGTALK_ALLOW_FROM"`
}
type SlackConfig struct {
- Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_SLACK_ENABLED"`
- BotToken string `json:"bot_token" env:"PICOCLAW_CHANNELS_SLACK_BOT_TOKEN"`
- AppToken string `json:"app_token" env:"PICOCLAW_CHANNELS_SLACK_APP_TOKEN"`
- AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_SLACK_ALLOW_FROM"`
+ Enabled bool `json:"enabled" env:"CLAWDROID_CHANNELS_SLACK_ENABLED"`
+ BotToken string `json:"bot_token" env:"CLAWDROID_CHANNELS_SLACK_BOT_TOKEN"`
+ AppToken string `json:"app_token" env:"CLAWDROID_CHANNELS_SLACK_APP_TOKEN"`
+ AllowFrom FlexibleStringSlice `json:"allow_from" env:"CLAWDROID_CHANNELS_SLACK_ALLOW_FROM"`
}
type LINEConfig struct {
- Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_LINE_ENABLED"`
- ChannelSecret string `json:"channel_secret" env:"PICOCLAW_CHANNELS_LINE_CHANNEL_SECRET"`
- ChannelAccessToken string `json:"channel_access_token" env:"PICOCLAW_CHANNELS_LINE_CHANNEL_ACCESS_TOKEN"`
- WebhookHost string `json:"webhook_host" env:"PICOCLAW_CHANNELS_LINE_WEBHOOK_HOST"`
- WebhookPort int `json:"webhook_port" env:"PICOCLAW_CHANNELS_LINE_WEBHOOK_PORT"`
- WebhookPath string `json:"webhook_path" env:"PICOCLAW_CHANNELS_LINE_WEBHOOK_PATH"`
- AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_LINE_ALLOW_FROM"`
+ Enabled bool `json:"enabled" env:"CLAWDROID_CHANNELS_LINE_ENABLED"`
+ ChannelSecret string `json:"channel_secret" env:"CLAWDROID_CHANNELS_LINE_CHANNEL_SECRET"`
+ ChannelAccessToken string `json:"channel_access_token" env:"CLAWDROID_CHANNELS_LINE_CHANNEL_ACCESS_TOKEN"`
+ WebhookHost string `json:"webhook_host" env:"CLAWDROID_CHANNELS_LINE_WEBHOOK_HOST"`
+ WebhookPort int `json:"webhook_port" env:"CLAWDROID_CHANNELS_LINE_WEBHOOK_PORT"`
+ WebhookPath string `json:"webhook_path" env:"CLAWDROID_CHANNELS_LINE_WEBHOOK_PATH"`
+ AllowFrom FlexibleStringSlice `json:"allow_from" env:"CLAWDROID_CHANNELS_LINE_ALLOW_FROM"`
}
type OneBotConfig struct {
- Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_ONEBOT_ENABLED"`
- WSUrl string `json:"ws_url" env:"PICOCLAW_CHANNELS_ONEBOT_WS_URL"`
- AccessToken string `json:"access_token" env:"PICOCLAW_CHANNELS_ONEBOT_ACCESS_TOKEN"`
- ReconnectInterval int `json:"reconnect_interval" env:"PICOCLAW_CHANNELS_ONEBOT_RECONNECT_INTERVAL"`
- GroupTriggerPrefix []string `json:"group_trigger_prefix" env:"PICOCLAW_CHANNELS_ONEBOT_GROUP_TRIGGER_PREFIX"`
- AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_ONEBOT_ALLOW_FROM"`
+ Enabled bool `json:"enabled" env:"CLAWDROID_CHANNELS_ONEBOT_ENABLED"`
+ WSUrl string `json:"ws_url" env:"CLAWDROID_CHANNELS_ONEBOT_WS_URL"`
+ AccessToken string `json:"access_token" env:"CLAWDROID_CHANNELS_ONEBOT_ACCESS_TOKEN"`
+ ReconnectInterval int `json:"reconnect_interval" env:"CLAWDROID_CHANNELS_ONEBOT_RECONNECT_INTERVAL"`
+ GroupTriggerPrefix []string `json:"group_trigger_prefix" env:"CLAWDROID_CHANNELS_ONEBOT_GROUP_TRIGGER_PREFIX"`
+ AllowFrom FlexibleStringSlice `json:"allow_from" env:"CLAWDROID_CHANNELS_ONEBOT_ALLOW_FROM"`
}
type WebSocketConfig struct {
- Enabled bool `json:"enabled" env:"PICOCLAW_CHANNELS_WEBSOCKET_ENABLED"`
- Host string `json:"host" env:"PICOCLAW_CHANNELS_WEBSOCKET_HOST"`
- Port int `json:"port" env:"PICOCLAW_CHANNELS_WEBSOCKET_PORT"`
- Path string `json:"path" env:"PICOCLAW_CHANNELS_WEBSOCKET_PATH"`
- AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_WEBSOCKET_ALLOW_FROM"`
+ Enabled bool `json:"enabled" env:"CLAWDROID_CHANNELS_WEBSOCKET_ENABLED"`
+ Host string `json:"host" env:"CLAWDROID_CHANNELS_WEBSOCKET_HOST"`
+ Port int `json:"port" env:"CLAWDROID_CHANNELS_WEBSOCKET_PORT"`
+ Path string `json:"path" env:"CLAWDROID_CHANNELS_WEBSOCKET_PATH"`
+ AllowFrom FlexibleStringSlice `json:"allow_from" env:"CLAWDROID_CHANNELS_WEBSOCKET_ALLOW_FROM"`
}
type HeartbeatConfig struct {
- Enabled bool `json:"enabled" env:"PICOCLAW_HEARTBEAT_ENABLED"`
- Interval int `json:"interval" env:"PICOCLAW_HEARTBEAT_INTERVAL"` // minutes, min 5
+ Enabled bool `json:"enabled" env:"CLAWDROID_HEARTBEAT_ENABLED"`
+ Interval int `json:"interval" env:"CLAWDROID_HEARTBEAT_INTERVAL"` // minutes, min 5
}
type DevicesConfig struct {
- Enabled bool `json:"enabled" env:"PICOCLAW_DEVICES_ENABLED"`
- MonitorUSB bool `json:"monitor_usb" env:"PICOCLAW_DEVICES_MONITOR_USB"`
+ Enabled bool `json:"enabled" env:"CLAWDROID_DEVICES_ENABLED"`
+ MonitorUSB bool `json:"monitor_usb" env:"CLAWDROID_DEVICES_MONITOR_USB"`
}
type RateLimitsConfig struct {
- MaxToolCallsPerMinute int `json:"max_tool_calls_per_minute" env:"PICOCLAW_RATE_LIMITS_MAX_TOOL_CALLS_PER_MINUTE"` // 0 = unlimited
- MaxRequestsPerMinute int `json:"max_requests_per_minute" env:"PICOCLAW_RATE_LIMITS_MAX_REQUESTS_PER_MINUTE"` // 0 = unlimited
+ MaxToolCallsPerMinute int `json:"max_tool_calls_per_minute" env:"CLAWDROID_RATE_LIMITS_MAX_TOOL_CALLS_PER_MINUTE"` // 0 = unlimited
+ MaxRequestsPerMinute int `json:"max_requests_per_minute" env:"CLAWDROID_RATE_LIMITS_MAX_REQUESTS_PER_MINUTE"` // 0 = unlimited
}
type ProvidersConfig struct {
@@ -200,27 +200,27 @@ type ProvidersConfig struct {
}
type ProviderConfig struct {
- APIKey string `json:"api_key" env:"PICOCLAW_PROVIDERS_{{.Name}}_API_KEY"`
- APIBase string `json:"api_base" env:"PICOCLAW_PROVIDERS_{{.Name}}_API_BASE"`
- Proxy string `json:"proxy,omitempty" env:"PICOCLAW_PROVIDERS_{{.Name}}_PROXY"`
- AuthMethod string `json:"auth_method,omitempty" env:"PICOCLAW_PROVIDERS_{{.Name}}_AUTH_METHOD"`
- ConnectMode string `json:"connect_mode,omitempty" env:"PICOCLAW_PROVIDERS_{{.Name}}_CONNECT_MODE"` //only for Github Copilot, `stdio` or `grpc`
+ APIKey string `json:"api_key" env:"CLAWDROID_PROVIDERS_{{.Name}}_API_KEY"`
+ APIBase string `json:"api_base" env:"CLAWDROID_PROVIDERS_{{.Name}}_API_BASE"`
+ Proxy string `json:"proxy,omitempty" env:"CLAWDROID_PROVIDERS_{{.Name}}_PROXY"`
+ AuthMethod string `json:"auth_method,omitempty" env:"CLAWDROID_PROVIDERS_{{.Name}}_AUTH_METHOD"`
+ ConnectMode string `json:"connect_mode,omitempty" env:"CLAWDROID_PROVIDERS_{{.Name}}_CONNECT_MODE"` //only for Github Copilot, `stdio` or `grpc`
}
type GatewayConfig struct {
- Host string `json:"host" env:"PICOCLAW_GATEWAY_HOST"`
- Port int `json:"port" env:"PICOCLAW_GATEWAY_PORT"`
+ Host string `json:"host" env:"CLAWDROID_GATEWAY_HOST"`
+ Port int `json:"port" env:"CLAWDROID_GATEWAY_PORT"`
}
type BraveConfig struct {
- Enabled bool `json:"enabled" env:"PICOCLAW_TOOLS_WEB_BRAVE_ENABLED"`
- APIKey string `json:"api_key" env:"PICOCLAW_TOOLS_WEB_BRAVE_API_KEY"`
- MaxResults int `json:"max_results" env:"PICOCLAW_TOOLS_WEB_BRAVE_MAX_RESULTS"`
+ Enabled bool `json:"enabled" env:"CLAWDROID_TOOLS_WEB_BRAVE_ENABLED"`
+ APIKey string `json:"api_key" env:"CLAWDROID_TOOLS_WEB_BRAVE_API_KEY"`
+ MaxResults int `json:"max_results" env:"CLAWDROID_TOOLS_WEB_BRAVE_MAX_RESULTS"`
}
type DuckDuckGoConfig struct {
- Enabled bool `json:"enabled" env:"PICOCLAW_TOOLS_WEB_DUCKDUCKGO_ENABLED"`
- MaxResults int `json:"max_results" env:"PICOCLAW_TOOLS_WEB_DUCKDUCKGO_MAX_RESULTS"`
+ Enabled bool `json:"enabled" env:"CLAWDROID_TOOLS_WEB_DUCKDUCKGO_ENABLED"`
+ MaxResults int `json:"max_results" env:"CLAWDROID_TOOLS_WEB_DUCKDUCKGO_MAX_RESULTS"`
}
type WebToolsConfig struct {
@@ -229,15 +229,15 @@ type WebToolsConfig struct {
}
type ExecToolsConfig struct {
- Enabled bool `json:"enabled" env:"PICOCLAW_TOOLS_EXEC_ENABLED"`
+ Enabled bool `json:"enabled" env:"CLAWDROID_TOOLS_EXEC_ENABLED"`
}
type I2CToolsConfig struct {
- Enabled bool `json:"enabled" env:"PICOCLAW_TOOLS_I2C_ENABLED"`
+ Enabled bool `json:"enabled" env:"CLAWDROID_TOOLS_I2C_ENABLED"`
}
type SPIToolsConfig struct {
- Enabled bool `json:"enabled" env:"PICOCLAW_TOOLS_SPI_ENABLED"`
+ Enabled bool `json:"enabled" env:"CLAWDROID_TOOLS_SPI_ENABLED"`
}
type MCPServerConfig struct {
@@ -255,11 +255,11 @@ type MCPServerConfig struct {
}
type AndroidToolsConfig struct {
- Enabled bool `json:"enabled" env:"PICOCLAW_TOOLS_ANDROID_ENABLED"`
+ Enabled bool `json:"enabled" env:"CLAWDROID_TOOLS_ANDROID_ENABLED"`
}
type MemoryToolsConfig struct {
- Enabled bool `json:"enabled" env:"PICOCLAW_TOOLS_MEMORY_ENABLED"`
+ Enabled bool `json:"enabled" env:"CLAWDROID_TOOLS_MEMORY_ENABLED"`
}
type ToolsConfig struct {
@@ -276,8 +276,8 @@ func DefaultConfig() *Config {
return &Config{
Agents: AgentsConfig{
Defaults: AgentDefaults{
- Workspace: "~/.picoclaw/workspace",
- DataDir: "~/.picoclaw/data",
+ Workspace: "~/.clawdroid/workspace",
+ DataDir: "~/.clawdroid/data",
RestrictToWorkspace: true,
Provider: "",
Model: "glm-4.7",
diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go
index dd8b0a310..264bcc5ba 100644
--- a/pkg/config/config_test.go
+++ b/pkg/config/config_test.go
@@ -205,8 +205,8 @@ func TestDefaultConfig_DataDir(t *testing.T) {
if cfg.Agents.Defaults.DataDir == "" {
t.Error("DataDir should not be empty")
}
- if cfg.Agents.Defaults.DataDir != "~/.picoclaw/data" {
- t.Errorf("DataDir should be '~/.picoclaw/data', got '%s'", cfg.Agents.Defaults.DataDir)
+ if cfg.Agents.Defaults.DataDir != "~/.clawdroid/data" {
+ t.Errorf("DataDir should be '~/.clawdroid/data', got '%s'", cfg.Agents.Defaults.DataDir)
}
}
@@ -218,7 +218,7 @@ func TestConfig_DataPath(t *testing.T) {
if path == "" {
t.Error("DataPath should not be empty")
}
- if path == "~/.picoclaw/data" {
+ if path == "~/.clawdroid/data" {
t.Error("DataPath should expand ~ to home directory")
}
if path[0] == '~' {
diff --git a/pkg/devices/service.go b/pkg/devices/service.go
index 05a254729..34553f49c 100644
--- a/pkg/devices/service.go
+++ b/pkg/devices/service.go
@@ -5,12 +5,12 @@ import (
"strings"
"sync"
- "github.com/sipeed/picoclaw/pkg/bus"
- "github.com/sipeed/picoclaw/pkg/constants"
- "github.com/sipeed/picoclaw/pkg/devices/events"
- "github.com/sipeed/picoclaw/pkg/devices/sources"
- "github.com/sipeed/picoclaw/pkg/logger"
- "github.com/sipeed/picoclaw/pkg/state"
+ "github.com/KarakuriAgent/clawdroid/pkg/bus"
+ "github.com/KarakuriAgent/clawdroid/pkg/constants"
+ "github.com/KarakuriAgent/clawdroid/pkg/devices/events"
+ "github.com/KarakuriAgent/clawdroid/pkg/devices/sources"
+ "github.com/KarakuriAgent/clawdroid/pkg/logger"
+ "github.com/KarakuriAgent/clawdroid/pkg/state"
)
type Service struct {
diff --git a/pkg/devices/source.go b/pkg/devices/source.go
index cbf0a7d88..a09986c92 100644
--- a/pkg/devices/source.go
+++ b/pkg/devices/source.go
@@ -1,5 +1,5 @@
package devices
-import "github.com/sipeed/picoclaw/pkg/devices/events"
+import "github.com/KarakuriAgent/clawdroid/pkg/devices/events"
type EventSource = events.EventSource
diff --git a/pkg/devices/sources/usb_linux.go b/pkg/devices/sources/usb_linux.go
index 1f6c068b3..c80b9fa07 100644
--- a/pkg/devices/sources/usb_linux.go
+++ b/pkg/devices/sources/usb_linux.go
@@ -10,8 +10,8 @@ import (
"strings"
"sync"
- "github.com/sipeed/picoclaw/pkg/devices/events"
- "github.com/sipeed/picoclaw/pkg/logger"
+ "github.com/KarakuriAgent/clawdroid/pkg/devices/events"
+ "github.com/KarakuriAgent/clawdroid/pkg/logger"
)
var usbClassToCapability = map[string]string{
diff --git a/pkg/devices/sources/usb_stub.go b/pkg/devices/sources/usb_stub.go
index f08c2d406..31e4464a0 100644
--- a/pkg/devices/sources/usb_stub.go
+++ b/pkg/devices/sources/usb_stub.go
@@ -5,7 +5,7 @@ package sources
import (
"context"
- "github.com/sipeed/picoclaw/pkg/devices/events"
+ "github.com/KarakuriAgent/clawdroid/pkg/devices/events"
)
type USBMonitor struct{}
diff --git a/pkg/heartbeat/service.go b/pkg/heartbeat/service.go
index 9eb671e1e..65a10c5d2 100644
--- a/pkg/heartbeat/service.go
+++ b/pkg/heartbeat/service.go
@@ -1,8 +1,8 @@
-// PicoClaw - Ultra-lightweight personal AI agent
+// ClawDroid - Ultra-lightweight personal AI agent
// Inspired by and based on nanobot: https://github.com/HKUDS/nanobot
// License: MIT
//
-// Copyright (c) 2026 PicoClaw contributors
+// Copyright (c) 2026 ClawDroid contributors
package heartbeat
@@ -14,11 +14,11 @@ import (
"sync"
"time"
- "github.com/sipeed/picoclaw/pkg/bus"
- "github.com/sipeed/picoclaw/pkg/constants"
- "github.com/sipeed/picoclaw/pkg/logger"
- "github.com/sipeed/picoclaw/pkg/state"
- "github.com/sipeed/picoclaw/pkg/tools"
+ "github.com/KarakuriAgent/clawdroid/pkg/bus"
+ "github.com/KarakuriAgent/clawdroid/pkg/constants"
+ "github.com/KarakuriAgent/clawdroid/pkg/logger"
+ "github.com/KarakuriAgent/clawdroid/pkg/state"
+ "github.com/KarakuriAgent/clawdroid/pkg/tools"
)
const (
diff --git a/pkg/heartbeat/service_test.go b/pkg/heartbeat/service_test.go
index 41fc68f59..7b3a4d435 100644
--- a/pkg/heartbeat/service_test.go
+++ b/pkg/heartbeat/service_test.go
@@ -6,7 +6,7 @@ import (
"testing"
"time"
- "github.com/sipeed/picoclaw/pkg/tools"
+ "github.com/KarakuriAgent/clawdroid/pkg/tools"
)
func TestExecuteHeartbeat_Async(t *testing.T) {
diff --git a/pkg/mcp/manager.go b/pkg/mcp/manager.go
index 937398506..198490a81 100644
--- a/pkg/mcp/manager.go
+++ b/pkg/mcp/manager.go
@@ -12,8 +12,8 @@ import (
"time"
sdkmcp "github.com/modelcontextprotocol/go-sdk/mcp"
- "github.com/sipeed/picoclaw/pkg/config"
- "github.com/sipeed/picoclaw/pkg/logger"
+ "github.com/KarakuriAgent/clawdroid/pkg/config"
+ "github.com/KarakuriAgent/clawdroid/pkg/logger"
)
// ServerInstance manages a connected MCP server session.
@@ -300,7 +300,7 @@ func (m *Manager) ensureRunning(ctx context.Context, serverName string) (*Server
// Create SDK client
client := sdkmcp.NewClient(
- &sdkmcp.Implementation{Name: "picoclaw", Version: "1.0.0"},
+ &sdkmcp.Implementation{Name: "clawdroid", Version: "1.0.0"},
nil,
)
diff --git a/pkg/migrate/config.go b/pkg/migrate/config.go
index 9c1e36359..0dbcdd8f4 100644
--- a/pkg/migrate/config.go
+++ b/pkg/migrate/config.go
@@ -8,7 +8,7 @@ import (
"strings"
"unicode"
- "github.com/sipeed/picoclaw/pkg/config"
+ "github.com/KarakuriAgent/clawdroid/pkg/config"
)
var supportedProviders = map[string]bool{
@@ -98,7 +98,7 @@ func ConvertConfig(data map[string]interface{}) (*config.Config, []string, error
if !supportedProviders[name] {
if apiKey != "" || apiBase != "" {
- warnings = append(warnings, fmt.Sprintf("Provider '%s' not supported in PicoClaw, skipping", name))
+ warnings = append(warnings, fmt.Sprintf("Provider '%s' not supported in ClawDroid, skipping", name))
}
continue
}
@@ -130,7 +130,7 @@ func ConvertConfig(data map[string]interface{}) (*config.Config, []string, error
continue
}
if !supportedChannels[name] {
- warnings = append(warnings, fmt.Sprintf("Channel '%s' not supported in PicoClaw, skipping", name))
+ warnings = append(warnings, fmt.Sprintf("Channel '%s' not supported in ClawDroid, skipping", name))
continue
}
enabled, _ := getBool(cMap, "enabled")
@@ -323,7 +323,7 @@ func convertKeysToSnake(data interface{}) interface{} {
}
func rewriteWorkspacePath(path string) string {
- path = strings.Replace(path, ".openclaw", ".picoclaw", 1)
+ path = strings.Replace(path, ".openclaw", ".clawdroid", 1)
return path
}
diff --git a/pkg/migrate/migrate.go b/pkg/migrate/migrate.go
index 921f821cb..34ca5ba7d 100644
--- a/pkg/migrate/migrate.go
+++ b/pkg/migrate/migrate.go
@@ -7,7 +7,7 @@ import (
"path/filepath"
"strings"
- "github.com/sipeed/picoclaw/pkg/config"
+ "github.com/KarakuriAgent/clawdroid/pkg/config"
)
type ActionType int
@@ -28,7 +28,7 @@ type Options struct {
Force bool
Refresh bool
OpenClawHome string
- PicoClawHome string
+ ClawDroidHome string
}
type Action struct {
@@ -62,7 +62,7 @@ func Run(opts Options) (*Result, error) {
return nil, err
}
- picoClawHome, err := resolvePicoClawHome(opts.PicoClawHome)
+ clawDroidHome, err := resolveClawDroidHome(opts.ClawDroidHome)
if err != nil {
return nil, err
}
@@ -71,14 +71,14 @@ func Run(opts Options) (*Result, error) {
return nil, fmt.Errorf("OpenClaw installation not found at %s", openclawHome)
}
- actions, warnings, err := Plan(opts, openclawHome, picoClawHome)
+ actions, warnings, err := Plan(opts, openclawHome, clawDroidHome)
if err != nil {
return nil, err
}
- fmt.Println("Migrating from OpenClaw to PicoClaw")
+ fmt.Println("Migrating from OpenClaw to ClawDroid")
fmt.Printf(" Source: %s\n", openclawHome)
- fmt.Printf(" Destination: %s\n", picoClawHome)
+ fmt.Printf(" Destination: %s\n", clawDroidHome)
fmt.Println()
if opts.DryRun {
@@ -95,12 +95,12 @@ func Run(opts Options) (*Result, error) {
fmt.Println()
}
- result := Execute(actions, openclawHome, picoClawHome)
+ result := Execute(actions, openclawHome, clawDroidHome)
result.Warnings = warnings
return result, nil
}
-func Plan(opts Options, openclawHome, picoClawHome string) ([]Action, []string, error) {
+func Plan(opts Options, openclawHome, clawDroidHome string) ([]Action, []string, error) {
var actions []Action
var warnings []string
@@ -117,8 +117,8 @@ func Plan(opts Options, openclawHome, picoClawHome string) ([]Action, []string,
actions = append(actions, Action{
Type: ActionConvertConfig,
Source: configPath,
- Destination: filepath.Join(picoClawHome, "config.json"),
- Description: "convert OpenClaw config to PicoClaw format",
+ Destination: filepath.Join(clawDroidHome, "config.json"),
+ Description: "convert OpenClaw config to ClawDroid format",
})
data, err := LoadOpenClawConfig(configPath)
@@ -131,7 +131,7 @@ func Plan(opts Options, openclawHome, picoClawHome string) ([]Action, []string,
if !opts.ConfigOnly {
srcWorkspace := resolveWorkspace(openclawHome)
- dstWorkspace := resolveWorkspace(picoClawHome)
+ dstWorkspace := resolveWorkspace(clawDroidHome)
if _, err := os.Stat(srcWorkspace); err == nil {
wsActions, err := PlanWorkspaceMigration(srcWorkspace, dstWorkspace, force)
@@ -147,13 +147,13 @@ func Plan(opts Options, openclawHome, picoClawHome string) ([]Action, []string,
return actions, warnings, nil
}
-func Execute(actions []Action, openclawHome, picoClawHome string) *Result {
+func Execute(actions []Action, openclawHome, clawDroidHome string) *Result {
result := &Result{}
for _, action := range actions {
switch action.Type {
case ActionConvertConfig:
- if err := executeConfigMigration(action.Source, action.Destination, picoClawHome); err != nil {
+ if err := executeConfigMigration(action.Source, action.Destination, clawDroidHome); err != nil {
result.Errors = append(result.Errors, fmt.Errorf("config migration: %w", err))
fmt.Printf(" ✗ Config migration failed: %v\n", err)
} else {
@@ -207,7 +207,7 @@ func Execute(actions []Action, openclawHome, picoClawHome string) *Result {
return result
}
-func executeConfigMigration(srcConfigPath, dstConfigPath, picoClawHome string) error {
+func executeConfigMigration(srcConfigPath, dstConfigPath, clawDroidHome string) error {
data, err := LoadOpenClawConfig(srcConfigPath)
if err != nil {
return err
@@ -221,7 +221,7 @@ func executeConfigMigration(srcConfigPath, dstConfigPath, picoClawHome string) e
if _, err := os.Stat(dstConfigPath); err == nil {
existing, err := config.LoadConfig(dstConfigPath)
if err != nil {
- return fmt.Errorf("loading existing PicoClaw config: %w", err)
+ return fmt.Errorf("loading existing ClawDroid config: %w", err)
}
incoming = MergeConfig(existing, incoming)
}
@@ -326,18 +326,18 @@ func resolveOpenClawHome(override string) (string, error) {
return filepath.Join(home, ".openclaw"), nil
}
-func resolvePicoClawHome(override string) (string, error) {
+func resolveClawDroidHome(override string) (string, error) {
if override != "" {
return expandHome(override), nil
}
- if envHome := os.Getenv("PICOCLAW_HOME"); envHome != "" {
+ if envHome := os.Getenv("CLAWDROID_HOME"); envHome != "" {
return expandHome(envHome), nil
}
home, err := os.UserHomeDir()
if err != nil {
return "", fmt.Errorf("resolving home directory: %w", err)
}
- return filepath.Join(home, ".picoclaw"), nil
+ return filepath.Join(home, ".clawdroid"), nil
}
func resolveWorkspace(homeDir string) string {
diff --git a/pkg/migrate/migrate_test.go b/pkg/migrate/migrate_test.go
index be2360aac..bbb7d47fc 100644
--- a/pkg/migrate/migrate_test.go
+++ b/pkg/migrate/migrate_test.go
@@ -6,7 +6,7 @@ import (
"path/filepath"
"testing"
- "github.com/sipeed/picoclaw/pkg/config"
+ "github.com/KarakuriAgent/clawdroid/pkg/config"
)
func TestCamelToSnake(t *testing.T) {
@@ -193,7 +193,7 @@ func TestConvertConfig(t *testing.T) {
if len(warnings) != 1 {
t.Fatalf("expected 1 warning, got %d", len(warnings))
}
- if warnings[0] != "Provider 'deepseek' not supported in PicoClaw, skipping" {
+ if warnings[0] != "Provider 'deepseek' not supported in ClawDroid, skipping" {
t.Errorf("unexpected warning: %s", warnings[0])
}
})
@@ -247,7 +247,7 @@ func TestConvertConfig(t *testing.T) {
if len(warnings) != 1 {
t.Fatalf("expected 1 warning, got %d", len(warnings))
}
- if warnings[0] != "Channel 'email' not supported in PicoClaw, skipping" {
+ if warnings[0] != "Channel 'email' not supported in ClawDroid, skipping" {
t.Errorf("unexpected warning: %s", warnings[0])
}
})
@@ -278,8 +278,8 @@ func TestConvertConfig(t *testing.T) {
if cfg.Agents.Defaults.Temperature != 0.5 {
t.Errorf("Temperature = %f, want %f", cfg.Agents.Defaults.Temperature, 0.5)
}
- if cfg.Agents.Defaults.Workspace != "~/.picoclaw/workspace" {
- t.Errorf("Workspace = %q, want %q", cfg.Agents.Defaults.Workspace, "~/.picoclaw/workspace")
+ if cfg.Agents.Defaults.Workspace != "~/.clawdroid/workspace" {
+ t.Errorf("Workspace = %q, want %q", cfg.Agents.Defaults.Workspace, "~/.clawdroid/workspace")
}
})
@@ -553,7 +553,7 @@ func TestRewriteWorkspacePath(t *testing.T) {
input string
want string
}{
- {"default path", "~/.openclaw/workspace", "~/.picoclaw/workspace"},
+ {"default path", "~/.openclaw/workspace", "~/.clawdroid/workspace"},
{"custom path", "/custom/path", "/custom/path"},
{"empty", "", ""},
}
@@ -569,7 +569,7 @@ func TestRewriteWorkspacePath(t *testing.T) {
func TestRunDryRun(t *testing.T) {
openclawHome := t.TempDir()
- picoClawHome := t.TempDir()
+ clawDroidHome := t.TempDir()
wsDir := filepath.Join(openclawHome, "workspace")
os.MkdirAll(wsDir, 0755)
@@ -589,7 +589,7 @@ func TestRunDryRun(t *testing.T) {
opts := Options{
DryRun: true,
OpenClawHome: openclawHome,
- PicoClawHome: picoClawHome,
+ ClawDroidHome: clawDroidHome,
}
result, err := Run(opts)
@@ -597,11 +597,11 @@ func TestRunDryRun(t *testing.T) {
t.Fatalf("Run: %v", err)
}
- picoWs := filepath.Join(picoClawHome, "workspace")
- if _, err := os.Stat(filepath.Join(picoWs, "SOUL.md")); !os.IsNotExist(err) {
+ clawWs := filepath.Join(clawDroidHome, "workspace")
+ if _, err := os.Stat(filepath.Join(clawWs, "SOUL.md")); !os.IsNotExist(err) {
t.Error("dry run should not create files")
}
- if _, err := os.Stat(filepath.Join(picoClawHome, "config.json")); !os.IsNotExist(err) {
+ if _, err := os.Stat(filepath.Join(clawDroidHome, "config.json")); !os.IsNotExist(err) {
t.Error("dry run should not create config")
}
@@ -610,7 +610,7 @@ func TestRunDryRun(t *testing.T) {
func TestRunFullMigration(t *testing.T) {
openclawHome := t.TempDir()
- picoClawHome := t.TempDir()
+ clawDroidHome := t.TempDir()
wsDir := filepath.Join(openclawHome, "workspace")
os.MkdirAll(wsDir, 0755)
@@ -644,7 +644,7 @@ func TestRunFullMigration(t *testing.T) {
opts := Options{
Force: true,
OpenClawHome: openclawHome,
- PicoClawHome: picoClawHome,
+ ClawDroidHome: clawDroidHome,
}
result, err := Run(opts)
@@ -652,9 +652,9 @@ func TestRunFullMigration(t *testing.T) {
t.Fatalf("Run: %v", err)
}
- picoWs := filepath.Join(picoClawHome, "workspace")
+ clawWs := filepath.Join(clawDroidHome, "workspace")
- soulData, err := os.ReadFile(filepath.Join(picoWs, "SOUL.md"))
+ soulData, err := os.ReadFile(filepath.Join(clawWs, "SOUL.md"))
if err != nil {
t.Fatalf("reading SOUL.md: %v", err)
}
@@ -662,7 +662,7 @@ func TestRunFullMigration(t *testing.T) {
t.Errorf("SOUL.md content = %q, want %q", string(soulData), "# Soul from OpenClaw")
}
- agentsData, err := os.ReadFile(filepath.Join(picoWs, "AGENTS.md"))
+ agentsData, err := os.ReadFile(filepath.Join(clawWs, "AGENTS.md"))
if err != nil {
t.Fatalf("reading AGENTS.md: %v", err)
}
@@ -670,7 +670,7 @@ func TestRunFullMigration(t *testing.T) {
t.Errorf("AGENTS.md content = %q", string(agentsData))
}
- memData, err := os.ReadFile(filepath.Join(picoWs, "memory", "MEMORY.md"))
+ memData, err := os.ReadFile(filepath.Join(clawWs, "memory", "MEMORY.md"))
if err != nil {
t.Fatalf("reading memory/MEMORY.md: %v", err)
}
@@ -678,21 +678,21 @@ func TestRunFullMigration(t *testing.T) {
t.Errorf("MEMORY.md content = %q", string(memData))
}
- picoConfig, err := config.LoadConfig(filepath.Join(picoClawHome, "config.json"))
+ clawConfig, err := config.LoadConfig(filepath.Join(clawDroidHome, "config.json"))
if err != nil {
- t.Fatalf("loading PicoClaw config: %v", err)
+ t.Fatalf("loading ClawDroid config: %v", err)
}
- if picoConfig.Providers.Anthropic.APIKey != "sk-ant-migrate-test" {
- t.Errorf("Anthropic.APIKey = %q, want %q", picoConfig.Providers.Anthropic.APIKey, "sk-ant-migrate-test")
+ if clawConfig.Providers.Anthropic.APIKey != "sk-ant-migrate-test" {
+ t.Errorf("Anthropic.APIKey = %q, want %q", clawConfig.Providers.Anthropic.APIKey, "sk-ant-migrate-test")
}
- if picoConfig.Providers.OpenRouter.APIKey != "sk-or-migrate-test" {
- t.Errorf("OpenRouter.APIKey = %q, want %q", picoConfig.Providers.OpenRouter.APIKey, "sk-or-migrate-test")
+ if clawConfig.Providers.OpenRouter.APIKey != "sk-or-migrate-test" {
+ t.Errorf("OpenRouter.APIKey = %q, want %q", clawConfig.Providers.OpenRouter.APIKey, "sk-or-migrate-test")
}
- if !picoConfig.Channels.Telegram.Enabled {
+ if !clawConfig.Channels.Telegram.Enabled {
t.Error("Telegram should be enabled")
}
- if picoConfig.Channels.Telegram.Token != "tg-migrate-test" {
- t.Errorf("Telegram.Token = %q, want %q", picoConfig.Channels.Telegram.Token, "tg-migrate-test")
+ if clawConfig.Channels.Telegram.Token != "tg-migrate-test" {
+ t.Errorf("Telegram.Token = %q, want %q", clawConfig.Channels.Telegram.Token, "tg-migrate-test")
}
if result.FilesCopied < 3 {
@@ -709,7 +709,7 @@ func TestRunFullMigration(t *testing.T) {
func TestRunOpenClawNotFound(t *testing.T) {
opts := Options{
OpenClawHome: "/nonexistent/path/to/openclaw",
- PicoClawHome: t.TempDir(),
+ ClawDroidHome: t.TempDir(),
}
_, err := Run(opts)
@@ -771,7 +771,7 @@ func TestCopyFile(t *testing.T) {
func TestRunConfigOnly(t *testing.T) {
openclawHome := t.TempDir()
- picoClawHome := t.TempDir()
+ clawDroidHome := t.TempDir()
wsDir := filepath.Join(openclawHome, "workspace")
os.MkdirAll(wsDir, 0755)
@@ -791,7 +791,7 @@ func TestRunConfigOnly(t *testing.T) {
Force: true,
ConfigOnly: true,
OpenClawHome: openclawHome,
- PicoClawHome: picoClawHome,
+ ClawDroidHome: clawDroidHome,
}
result, err := Run(opts)
@@ -803,15 +803,15 @@ func TestRunConfigOnly(t *testing.T) {
t.Error("config should have been migrated")
}
- picoWs := filepath.Join(picoClawHome, "workspace")
- if _, err := os.Stat(filepath.Join(picoWs, "SOUL.md")); !os.IsNotExist(err) {
+ clawWs := filepath.Join(clawDroidHome, "workspace")
+ if _, err := os.Stat(filepath.Join(clawWs, "SOUL.md")); !os.IsNotExist(err) {
t.Error("config-only should not copy workspace files")
}
}
func TestRunWorkspaceOnly(t *testing.T) {
openclawHome := t.TempDir()
- picoClawHome := t.TempDir()
+ clawDroidHome := t.TempDir()
wsDir := filepath.Join(openclawHome, "workspace")
os.MkdirAll(wsDir, 0755)
@@ -831,7 +831,7 @@ func TestRunWorkspaceOnly(t *testing.T) {
Force: true,
WorkspaceOnly: true,
OpenClawHome: openclawHome,
- PicoClawHome: picoClawHome,
+ ClawDroidHome: clawDroidHome,
}
result, err := Run(opts)
@@ -843,8 +843,8 @@ func TestRunWorkspaceOnly(t *testing.T) {
t.Error("workspace-only should not migrate config")
}
- picoWs := filepath.Join(picoClawHome, "workspace")
- soulData, err := os.ReadFile(filepath.Join(picoWs, "SOUL.md"))
+ clawWs := filepath.Join(clawDroidHome, "workspace")
+ soulData, err := os.ReadFile(filepath.Join(clawWs, "SOUL.md"))
if err != nil {
t.Fatalf("reading SOUL.md: %v", err)
}
diff --git a/pkg/providers/claude_cli_provider_test.go b/pkg/providers/claude_cli_provider_test.go
index 063530deb..33c05f38c 100644
--- a/pkg/providers/claude_cli_provider_test.go
+++ b/pkg/providers/claude_cli_provider_test.go
@@ -10,7 +10,7 @@ import (
"testing"
"time"
- "github.com/sipeed/picoclaw/pkg/config"
+ "github.com/KarakuriAgent/clawdroid/pkg/config"
)
// --- Compile-time interface check ---
diff --git a/pkg/providers/claude_provider.go b/pkg/providers/claude_provider.go
index ae6aca96d..c435e7b4b 100644
--- a/pkg/providers/claude_provider.go
+++ b/pkg/providers/claude_provider.go
@@ -7,7 +7,7 @@ import (
"github.com/anthropics/anthropic-sdk-go"
"github.com/anthropics/anthropic-sdk-go/option"
- "github.com/sipeed/picoclaw/pkg/auth"
+ "github.com/KarakuriAgent/clawdroid/pkg/auth"
)
type ClaudeProvider struct {
@@ -200,7 +200,7 @@ func createClaudeTokenSource() func() (string, error) {
return "", fmt.Errorf("loading auth credentials: %w", err)
}
if cred == nil {
- return "", fmt.Errorf("no credentials for anthropic. Run: picoclaw auth login --provider anthropic")
+ return "", fmt.Errorf("no credentials for anthropic. Run: clawdroid auth login --provider anthropic")
}
return cred.AccessToken, nil
}
diff --git a/pkg/providers/codex_cli_provider_test.go b/pkg/providers/codex_cli_provider_test.go
index 7e4e1bc15..567597cd8 100644
--- a/pkg/providers/codex_cli_provider_test.go
+++ b/pkg/providers/codex_cli_provider_test.go
@@ -554,8 +554,8 @@ func TestCodexCliProvider_EmptyCommand(t *testing.T) {
// --- Integration Test (requires real codex CLI with valid auth) ---
func TestCodexCliProvider_Integration(t *testing.T) {
- if os.Getenv("PICOCLAW_INTEGRATION_TESTS") == "" {
- t.Skip("skipping integration test (set PICOCLAW_INTEGRATION_TESTS=1 to enable)")
+ if os.Getenv("CLAWDROID_INTEGRATION_TESTS") == "" {
+ t.Skip("skipping integration test (set CLAWDROID_INTEGRATION_TESTS=1 to enable)")
}
// Verify codex is available
diff --git a/pkg/providers/codex_provider.go b/pkg/providers/codex_provider.go
index 6dff3a52e..c5e11e180 100644
--- a/pkg/providers/codex_provider.go
+++ b/pkg/providers/codex_provider.go
@@ -10,8 +10,8 @@ import (
"github.com/openai/openai-go/v3"
"github.com/openai/openai-go/v3/option"
"github.com/openai/openai-go/v3/responses"
- "github.com/sipeed/picoclaw/pkg/auth"
- "github.com/sipeed/picoclaw/pkg/logger"
+ "github.com/KarakuriAgent/clawdroid/pkg/auth"
+ "github.com/KarakuriAgent/clawdroid/pkg/logger"
)
const codexDefaultModel = "gpt-5.2"
@@ -344,7 +344,7 @@ func createCodexTokenSource() func() (string, string, error) {
return "", "", fmt.Errorf("loading auth credentials: %w", err)
}
if cred == nil {
- return "", "", fmt.Errorf("no credentials for openai. Run: picoclaw auth login --provider openai")
+ return "", "", fmt.Errorf("no credentials for openai. Run: clawdroid auth login --provider openai")
}
if cred.AuthMethod == "oauth" && cred.NeedsRefresh() && cred.RefreshToken != "" {
diff --git a/pkg/providers/http_provider.go b/pkg/providers/http_provider.go
index d7c9c8b45..acca15538 100644
--- a/pkg/providers/http_provider.go
+++ b/pkg/providers/http_provider.go
@@ -1,8 +1,8 @@
-// PicoClaw - Ultra-lightweight personal AI agent
+// ClawDroid - Ultra-lightweight personal AI agent
// Inspired by and based on nanobot: https://github.com/HKUDS/nanobot
// License: MIT
//
-// Copyright (c) 2026 PicoClaw contributors
+// Copyright (c) 2026 ClawDroid contributors
package providers
@@ -17,8 +17,8 @@ import (
"strings"
"time"
- "github.com/sipeed/picoclaw/pkg/auth"
- "github.com/sipeed/picoclaw/pkg/config"
+ "github.com/KarakuriAgent/clawdroid/pkg/auth"
+ "github.com/KarakuriAgent/clawdroid/pkg/config"
)
type HTTPProvider struct {
@@ -249,7 +249,7 @@ func createClaudeAuthProvider() (LLMProvider, error) {
return nil, fmt.Errorf("loading auth credentials: %w", err)
}
if cred == nil {
- return nil, fmt.Errorf("no credentials for anthropic. Run: picoclaw auth login --provider anthropic")
+ return nil, fmt.Errorf("no credentials for anthropic. Run: clawdroid auth login --provider anthropic")
}
return NewClaudeProviderWithTokenSource(cred.AccessToken, createClaudeTokenSource()), nil
}
@@ -260,7 +260,7 @@ func createCodexAuthProvider() (LLMProvider, error) {
return nil, fmt.Errorf("loading auth credentials: %w", err)
}
if cred == nil {
- return nil, fmt.Errorf("no credentials for openai. Run: picoclaw auth login --provider openai")
+ return nil, fmt.Errorf("no credentials for openai. Run: clawdroid auth login --provider openai")
}
return NewCodexProviderWithTokenSource(cred.AccessToken, cred.AccountID, createCodexTokenSource()), nil
}
diff --git a/pkg/session/manager.go b/pkg/session/manager.go
index 12bf33df0..af1cc46d1 100644
--- a/pkg/session/manager.go
+++ b/pkg/session/manager.go
@@ -8,7 +8,7 @@ import (
"sync"
"time"
- "github.com/sipeed/picoclaw/pkg/providers"
+ "github.com/KarakuriAgent/clawdroid/pkg/providers"
)
type Session struct {
diff --git a/pkg/skills/loader.go b/pkg/skills/loader.go
index 6615e93c4..066bc159e 100644
--- a/pkg/skills/loader.go
+++ b/pkg/skills/loader.go
@@ -54,7 +54,7 @@ func (info SkillInfo) validate() error {
type SkillsLoader struct {
dataDir string
dataSkills string // data dir skills
- globalSkills string // global skills (~/.picoclaw/skills)
+ globalSkills string // global skills (~/.clawdroid/skills)
builtinSkills string // builtin skills
}
@@ -62,7 +62,7 @@ func NewSkillsLoader(dataDir string, globalSkills string, builtinSkills string)
return &SkillsLoader{
dataDir: dataDir,
dataSkills: filepath.Join(dataDir, "skills"),
- globalSkills: globalSkills, // ~/.picoclaw/skills
+ globalSkills: globalSkills, // ~/.clawdroid/skills
builtinSkills: builtinSkills,
}
}
@@ -97,7 +97,7 @@ func (sl *SkillsLoader) ListSkills() []SkillInfo {
}
}
- // 全局 skills (~/.picoclaw/skills) - 被 workspace skills 覆盖
+ // 全局 skills (~/.clawdroid/skills) - 被 workspace skills 覆盖
if sl.globalSkills != "" {
if dirs, err := os.ReadDir(sl.globalSkills); err == nil {
for _, dir := range dirs {
@@ -188,7 +188,7 @@ func (sl *SkillsLoader) LoadSkill(name string) (string, bool) {
}
}
- // 2. 其次从全局 skills 加载 (~/.picoclaw/skills)
+ // 2. 其次从全局 skills 加载 (~/.clawdroid/skills)
if sl.globalSkills != "" {
skillFile := filepath.Join(sl.globalSkills, name, "SKILL.md")
if content, err := os.ReadFile(skillFile); err == nil {
diff --git a/pkg/tools/cron.go b/pkg/tools/cron.go
index 8af18455d..72e2e0fbb 100644
--- a/pkg/tools/cron.go
+++ b/pkg/tools/cron.go
@@ -6,9 +6,9 @@ import (
"sync"
"time"
- "github.com/sipeed/picoclaw/pkg/bus"
- "github.com/sipeed/picoclaw/pkg/cron"
- "github.com/sipeed/picoclaw/pkg/utils"
+ "github.com/KarakuriAgent/clawdroid/pkg/bus"
+ "github.com/KarakuriAgent/clawdroid/pkg/cron"
+ "github.com/KarakuriAgent/clawdroid/pkg/utils"
)
// JobExecutor is the interface for executing cron jobs through the agent
diff --git a/pkg/tools/mcp.go b/pkg/tools/mcp.go
index 079eb73d2..2e6137ccf 100644
--- a/pkg/tools/mcp.go
+++ b/pkg/tools/mcp.go
@@ -6,7 +6,7 @@ import (
"fmt"
"strings"
- "github.com/sipeed/picoclaw/pkg/mcp"
+ "github.com/KarakuriAgent/clawdroid/pkg/mcp"
)
// MCPBridgeTool exposes MCP servers to the LLM as a single tool with actions.
diff --git a/pkg/tools/registry.go b/pkg/tools/registry.go
index 2d5717256..667413b4b 100644
--- a/pkg/tools/registry.go
+++ b/pkg/tools/registry.go
@@ -6,8 +6,8 @@ import (
"sync"
"time"
- "github.com/sipeed/picoclaw/pkg/logger"
- "github.com/sipeed/picoclaw/pkg/providers"
+ "github.com/KarakuriAgent/clawdroid/pkg/logger"
+ "github.com/KarakuriAgent/clawdroid/pkg/providers"
)
type ToolRegistry struct {
diff --git a/pkg/tools/skills.go b/pkg/tools/skills.go
index 3d797c862..f6bf15b6f 100644
--- a/pkg/tools/skills.go
+++ b/pkg/tools/skills.go
@@ -5,7 +5,7 @@ import (
"fmt"
"strings"
- "github.com/sipeed/picoclaw/pkg/skills"
+ "github.com/KarakuriAgent/clawdroid/pkg/skills"
)
type SkillTool struct {
diff --git a/pkg/tools/skills_test.go b/pkg/tools/skills_test.go
index 506b4b003..c4e15c373 100644
--- a/pkg/tools/skills_test.go
+++ b/pkg/tools/skills_test.go
@@ -6,7 +6,7 @@ import (
"path/filepath"
"testing"
- "github.com/sipeed/picoclaw/pkg/skills"
+ "github.com/KarakuriAgent/clawdroid/pkg/skills"
)
func setupSkillFixture(t *testing.T) (string, *skills.SkillsLoader) {
diff --git a/pkg/tools/subagent.go b/pkg/tools/subagent.go
index efa1d33aa..effa87a34 100644
--- a/pkg/tools/subagent.go
+++ b/pkg/tools/subagent.go
@@ -6,8 +6,8 @@ import (
"sync"
"time"
- "github.com/sipeed/picoclaw/pkg/bus"
- "github.com/sipeed/picoclaw/pkg/providers"
+ "github.com/KarakuriAgent/clawdroid/pkg/bus"
+ "github.com/KarakuriAgent/clawdroid/pkg/providers"
)
type SubagentTask struct {
diff --git a/pkg/tools/subagent_tool_test.go b/pkg/tools/subagent_tool_test.go
index 8a7d22f24..45bcd44b4 100644
--- a/pkg/tools/subagent_tool_test.go
+++ b/pkg/tools/subagent_tool_test.go
@@ -5,8 +5,8 @@ import (
"strings"
"testing"
- "github.com/sipeed/picoclaw/pkg/bus"
- "github.com/sipeed/picoclaw/pkg/providers"
+ "github.com/KarakuriAgent/clawdroid/pkg/bus"
+ "github.com/KarakuriAgent/clawdroid/pkg/providers"
)
// MockLLMProvider is a test implementation of LLMProvider
diff --git a/pkg/tools/toolloop.go b/pkg/tools/toolloop.go
index 1302079b4..2f3838e67 100644
--- a/pkg/tools/toolloop.go
+++ b/pkg/tools/toolloop.go
@@ -1,8 +1,8 @@
-// PicoClaw - Ultra-lightweight personal AI agent
+// ClawDroid - Ultra-lightweight personal AI agent
// Inspired by and based on nanobot: https://github.com/HKUDS/nanobot
// License: MIT
//
-// Copyright (c) 2026 PicoClaw contributors
+// Copyright (c) 2026 ClawDroid contributors
package tools
@@ -11,9 +11,9 @@ import (
"encoding/json"
"fmt"
- "github.com/sipeed/picoclaw/pkg/logger"
- "github.com/sipeed/picoclaw/pkg/providers"
- "github.com/sipeed/picoclaw/pkg/utils"
+ "github.com/KarakuriAgent/clawdroid/pkg/logger"
+ "github.com/KarakuriAgent/clawdroid/pkg/providers"
+ "github.com/KarakuriAgent/clawdroid/pkg/utils"
)
// ToolLoopConfig configures the tool execution loop.
diff --git a/pkg/utils/media.go b/pkg/utils/media.go
index 0c77594b0..194ded38d 100644
--- a/pkg/utils/media.go
+++ b/pkg/utils/media.go
@@ -10,7 +10,7 @@ import (
"time"
"github.com/google/uuid"
- "github.com/sipeed/picoclaw/pkg/logger"
+ "github.com/KarakuriAgent/clawdroid/pkg/logger"
)
const maxImageFileSize = 50 * 1024 * 1024 // 50MB
@@ -120,7 +120,7 @@ func DownloadFile(url, filename string, opts DownloadOptions) string {
opts.LoggerPrefix = "utils"
}
- mediaDir := filepath.Join(os.TempDir(), "picoclaw_media")
+ mediaDir := filepath.Join(os.TempDir(), "clawdroid_media")
if err := os.MkdirAll(mediaDir, 0700); err != nil {
logger.ErrorCF(opts.LoggerPrefix, "Failed to create media directory", map[string]interface{}{
"error": err.Error(),
diff --git a/pkg/voice/transcriber.go b/pkg/voice/transcriber.go
index 9af2ea6bb..f69a0000f 100644
--- a/pkg/voice/transcriber.go
+++ b/pkg/voice/transcriber.go
@@ -12,8 +12,8 @@ import (
"path/filepath"
"time"
- "github.com/sipeed/picoclaw/pkg/logger"
- "github.com/sipeed/picoclaw/pkg/utils"
+ "github.com/KarakuriAgent/clawdroid/pkg/logger"
+ "github.com/KarakuriAgent/clawdroid/pkg/utils"
)
type GroqTranscriber struct {
diff --git a/workspace/IDENTITY.md b/workspace/IDENTITY.md
index d7a7550bc..dc875dd66 100644
--- a/workspace/IDENTITY.md
+++ b/workspace/IDENTITY.md
@@ -1,7 +1,7 @@
# Identity
## Name
-PicoClaw
+ClawDroid
## Description
Ultra-lightweight personal AI assistant written in Go, inspired by nanobot.
@@ -44,13 +44,13 @@ Ultra-lightweight personal AI assistant written in Go, inspired by nanobot.
MIT License - Free and open source
## Repository
-https://github.com/sipeed/picoclaw
+https://github.com/KarakuriAgent/clawdroid
## Contact
-Issues: https://github.com/sipeed/picoclaw/issues
-Discussions: https://github.com/sipeed/picoclaw/discussions
+Issues: https://github.com/KarakuriAgent/clawdroid/issues
+Discussions: https://github.com/KarakuriAgent/clawdroid/discussions
---
"Every bit helps, every bit matters."
-- Picoclaw
\ No newline at end of file
+- Clawdroid
\ No newline at end of file
diff --git a/workspace/SOUL.md b/workspace/SOUL.md
index 0be8834f5..f16826d51 100644
--- a/workspace/SOUL.md
+++ b/workspace/SOUL.md
@@ -1,6 +1,6 @@
# Soul
-I am picoclaw, a lightweight AI assistant powered by AI.
+I am clawdroid, a lightweight AI assistant powered by AI.
## Personality
diff --git a/workspace/skills/hardware/references/board-pinout.md b/workspace/skills/hardware/references/board-pinout.md
index 827dd0613..4ef688e56 100644
--- a/workspace/skills/hardware/references/board-pinout.md
+++ b/workspace/skills/hardware/references/board-pinout.md
@@ -126,6 +126,6 @@ I2C adapter numbers can change between boots depending on driver load order. Alw
### Permissions
`/dev/i2c-*` and `/dev/spidev*` typically require root access. Options:
-- Run picoclaw as root
+- Run clawdroid as root
- Add user to `i2c` and `spi` groups
- Create udev rules: `SUBSYSTEM=="i2c-dev", MODE="0666"`