refactor: rename PicoClaw to ClawDroid
- Android package: io.picoclaw.android → io.clawdroid - Go module: github.com/sipeed/picoclaw → github.com/KarakuriAgent/clawdroid - Binary: picoclaw → clawdroid - Home dir: ~/.picoclaw/ → ~/.clawdroid/ - Env vars: PICOCLAW_* → CLAWDROID_* - DB: picoclaw.db → clawdroid.db - SharedPrefs: picoclaw → clawdroid - Docker services, CI/CD, assets, docs updated accordingly Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
b50b98e814
commit
83afa23b8c
167 changed files with 958 additions and 958 deletions
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
|
|
@ -10,7 +10,7 @@ assignees: ''
|
||||||
## Quick Summary
|
## Quick Summary
|
||||||
|
|
||||||
## Environment & Tools
|
## Environment & Tools
|
||||||
- **PicoClaw Version:** (e.g., v0.1.2 or commit hash)
|
- **ClawDroid Version:** (e.g., v0.1.2 or commit hash)
|
||||||
- **Go Version:** (e.g., go 1.22)
|
- **Go Version:** (e.g., go 1.22)
|
||||||
- **AI Model & Provider:** (e.g., GPT-4o via OpenAI / DeepSeek via SiliconFlow)
|
- **AI Model & Provider:** (e.g., GPT-4o via OpenAI / DeepSeek via SiliconFlow)
|
||||||
- **Operating System:** (e.g., Ubuntu 22.04 / macOS / Android Termux)
|
- **Operating System:** (e.g., Ubuntu 22.04 / macOS / Android Termux)
|
||||||
|
|
|
||||||
2
.github/workflows/android-build.yml
vendored
2
.github/workflows/android-build.yml
vendored
|
|
@ -52,5 +52,5 @@ jobs:
|
||||||
- name: Upload APK
|
- name: Upload APK
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: picoclaw-release-apk
|
name: clawdroid-release-apk
|
||||||
path: android/app/build/outputs/apk/release/*.apk
|
path: android/app/build/outputs/apk/release/*.apk
|
||||||
|
|
|
||||||
2
.github/workflows/docker-build.yml
vendored
2
.github/workflows/docker-build.yml
vendored
|
|
@ -10,7 +10,7 @@ on:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
GHCR_REGISTRY: ghcr.io
|
GHCR_REGISTRY: ghcr.io
|
||||||
GHCR_IMAGE_NAME: ${{ github.repository_owner }}/picoclaw
|
GHCR_IMAGE_NAME: ${{ github.repository_owner }}/clawdroid
|
||||||
DOCKERHUB_REGISTRY: docker.io
|
DOCKERHUB_REGISTRY: docker.io
|
||||||
DOCKERHUB_IMAGE_NAME: ${{ vars.DOCKERHUB_REPOSITORY }}
|
DOCKERHUB_IMAGE_NAME: ${{ vars.DOCKERHUB_REPOSITORY }}
|
||||||
|
|
||||||
|
|
|
||||||
4
.github/workflows/release.yml
vendored
4
.github/workflows/release.yml
vendored
|
|
@ -147,11 +147,11 @@ jobs:
|
||||||
- name: Rename APK with version
|
- name: Rename APK with version
|
||||||
run: |
|
run: |
|
||||||
mv app/build/outputs/apk/release/app-release.apk \
|
mv app/build/outputs/apk/release/app-release.apk \
|
||||||
app/build/outputs/apk/release/picoclaw-${{ inputs.tag }}.apk
|
app/build/outputs/apk/release/clawdroid-${{ inputs.tag }}.apk
|
||||||
|
|
||||||
- name: Upload APK to release
|
- name: Upload APK to release
|
||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
run: |
|
run: |
|
||||||
gh release upload "${{ inputs.tag }}" \
|
gh release upload "${{ inputs.tag }}" \
|
||||||
app/build/outputs/apk/release/picoclaw-${{ inputs.tag }}.apk
|
app/build/outputs/apk/release/clawdroid-${{ inputs.tag }}.apk
|
||||||
|
|
|
||||||
12
.gitignore
vendored
12
.gitignore
vendored
|
|
@ -8,14 +8,14 @@ build/
|
||||||
*.dylib
|
*.dylib
|
||||||
*.test
|
*.test
|
||||||
*.out
|
*.out
|
||||||
/picoclaw
|
/clawdroid
|
||||||
/picoclaw-test
|
/clawdroid-test
|
||||||
cmd/picoclaw/workspace
|
cmd/clawdroid/workspace
|
||||||
|
|
||||||
# Picoclaw specific
|
# ClawDroid specific
|
||||||
|
|
||||||
# PicoClaw
|
# ClawDroid
|
||||||
.picoclaw/
|
.clawdroid/
|
||||||
config.json
|
config.json
|
||||||
sessions/
|
sessions/
|
||||||
build/
|
build/
|
||||||
|
|
|
||||||
|
|
@ -5,10 +5,10 @@ version: 2
|
||||||
before:
|
before:
|
||||||
hooks:
|
hooks:
|
||||||
- go mod tidy
|
- go mod tidy
|
||||||
- go generate ./cmd/picoclaw
|
- go generate ./cmd/clawdroid
|
||||||
|
|
||||||
builds:
|
builds:
|
||||||
- id: picoclaw
|
- id: clawdroid
|
||||||
env:
|
env:
|
||||||
- CGO_ENABLED=0
|
- CGO_ENABLED=0
|
||||||
goos:
|
goos:
|
||||||
|
|
@ -23,18 +23,18 @@ builds:
|
||||||
- s390x
|
- s390x
|
||||||
- mips64
|
- mips64
|
||||||
- arm
|
- arm
|
||||||
main: ./cmd/picoclaw
|
main: ./cmd/clawdroid
|
||||||
ignore:
|
ignore:
|
||||||
- goos: windows
|
- goos: windows
|
||||||
goarch: arm
|
goarch: arm
|
||||||
|
|
||||||
dockers_v2:
|
dockers_v2:
|
||||||
- id: picoclaw
|
- id: clawdroid
|
||||||
dockerfile: Dockerfile.goreleaser
|
dockerfile: Dockerfile.goreleaser
|
||||||
ids:
|
ids:
|
||||||
- picoclaw
|
- clawdroid
|
||||||
images:
|
images:
|
||||||
- "ghcr.io/{{ .Env.GITHUB_REPOSITORY_OWNER }}/picoclaw"
|
- "ghcr.io/{{ .Env.GITHUB_REPOSITORY_OWNER }}/clawdroid"
|
||||||
- "docker.io/{{ .Env.DOCKERHUB_IMAGE_NAME }}"
|
- "docker.io/{{ .Env.DOCKERHUB_IMAGE_NAME }}"
|
||||||
tags:
|
tags:
|
||||||
- "{{ .Tag }}"
|
- "{{ .Tag }}"
|
||||||
|
|
|
||||||
10
Dockerfile
10
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
|
FROM golang:1.26.0-alpine AS builder
|
||||||
|
|
||||||
|
|
@ -27,10 +27,10 @@ HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
||||||
CMD wget -q --spider http://localhost:18790/health || exit 1
|
CMD wget -q --spider http://localhost:18790/health || exit 1
|
||||||
|
|
||||||
# Copy binary
|
# Copy binary
|
||||||
COPY --from=builder /src/build/picoclaw /usr/local/bin/picoclaw
|
COPY --from=builder /src/build/clawdroid /usr/local/bin/clawdroid
|
||||||
|
|
||||||
# Create picoclaw home directory
|
# Create clawdroid home directory
|
||||||
RUN /usr/local/bin/picoclaw onboard
|
RUN /usr/local/bin/clawdroid onboard
|
||||||
|
|
||||||
ENTRYPOINT ["picoclaw"]
|
ENTRYPOINT ["clawdroid"]
|
||||||
CMD ["gateway"]
|
CMD ["gateway"]
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ ARG TARGETPLATFORM
|
||||||
|
|
||||||
RUN apk add --no-cache ca-certificates tzdata
|
RUN apk add --no-cache ca-certificates tzdata
|
||||||
|
|
||||||
COPY $TARGETPLATFORM/picoclaw /usr/local/bin/picoclaw
|
COPY $TARGETPLATFORM/clawdroid /usr/local/bin/clawdroid
|
||||||
|
|
||||||
ENTRYPOINT ["picoclaw"]
|
ENTRYPOINT ["clawdroid"]
|
||||||
CMD ["gateway"]
|
CMD ["gateway"]
|
||||||
|
|
|
||||||
26
Makefile
26
Makefile
|
|
@ -1,7 +1,7 @@
|
||||||
.PHONY: all build install uninstall clean help test
|
.PHONY: all build install uninstall clean help test
|
||||||
|
|
||||||
# Build variables
|
# Build variables
|
||||||
BINARY_NAME=picoclaw
|
BINARY_NAME=clawdroid
|
||||||
BUILD_DIR=build
|
BUILD_DIR=build
|
||||||
CMD_DIR=cmd/$(BINARY_NAME)
|
CMD_DIR=cmd/$(BINARY_NAME)
|
||||||
MAIN_GO=$(CMD_DIR)/main.go
|
MAIN_GO=$(CMD_DIR)/main.go
|
||||||
|
|
@ -24,8 +24,8 @@ INSTALL_BIN_DIR=$(INSTALL_PREFIX)/bin
|
||||||
INSTALL_MAN_DIR=$(INSTALL_PREFIX)/share/man/man1
|
INSTALL_MAN_DIR=$(INSTALL_PREFIX)/share/man/man1
|
||||||
|
|
||||||
# Workspace and Skills
|
# Workspace and Skills
|
||||||
PICOCLAW_HOME?=$(HOME)/.picoclaw
|
CLAWDROID_HOME?=$(HOME)/.clawdroid
|
||||||
WORKSPACE_DIR?=$(PICOCLAW_HOME)/workspace
|
WORKSPACE_DIR?=$(CLAWDROID_HOME)/workspace
|
||||||
WORKSPACE_SKILLS_DIR=$(WORKSPACE_DIR)/skills
|
WORKSPACE_SKILLS_DIR=$(WORKSPACE_DIR)/skills
|
||||||
BUILTIN_SKILLS_DIR=$(CURDIR)/skills
|
BUILTIN_SKILLS_DIR=$(CURDIR)/skills
|
||||||
|
|
||||||
|
|
@ -71,7 +71,7 @@ generate:
|
||||||
@$(GO) generate ./...
|
@$(GO) generate ./...
|
||||||
@echo "Run generate complete"
|
@echo "Run generate complete"
|
||||||
|
|
||||||
## build: Build the picoclaw binary for current platform
|
## build: Build the clawdroid binary for current platform
|
||||||
build: generate
|
build: generate
|
||||||
@echo "Building $(BINARY_NAME) for $(PLATFORM)/$(ARCH)..."
|
@echo "Building $(BINARY_NAME) for $(PLATFORM)/$(ARCH)..."
|
||||||
@mkdir -p $(BUILD_DIR)
|
@mkdir -p $(BUILD_DIR)
|
||||||
|
|
@ -79,7 +79,7 @@ build: generate
|
||||||
@echo "Build complete: $(BINARY_PATH)"
|
@echo "Build complete: $(BINARY_PATH)"
|
||||||
@ln -sf $(BINARY_NAME)-$(PLATFORM)-$(ARCH) $(BUILD_DIR)/$(BINARY_NAME)
|
@ln -sf $(BINARY_NAME)-$(PLATFORM)-$(ARCH) $(BUILD_DIR)/$(BINARY_NAME)
|
||||||
|
|
||||||
## build-all: Build picoclaw for all platforms
|
## build-all: Build clawdroid for all platforms
|
||||||
build-all: generate
|
build-all: generate
|
||||||
@echo "Building for multiple platforms..."
|
@echo "Building for multiple platforms..."
|
||||||
@mkdir -p $(BUILD_DIR)
|
@mkdir -p $(BUILD_DIR)
|
||||||
|
|
@ -90,7 +90,7 @@ build-all: generate
|
||||||
GOOS=windows GOARCH=amd64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-windows-amd64.exe ./$(CMD_DIR)
|
GOOS=windows GOARCH=amd64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-windows-amd64.exe ./$(CMD_DIR)
|
||||||
@echo "All builds complete"
|
@echo "All builds complete"
|
||||||
|
|
||||||
## install: Install picoclaw to system and copy builtin skills
|
## install: Install clawdroid to system and copy builtin skills
|
||||||
install: build
|
install: build
|
||||||
@echo "Installing $(BINARY_NAME)..."
|
@echo "Installing $(BINARY_NAME)..."
|
||||||
@mkdir -p $(INSTALL_BIN_DIR)
|
@mkdir -p $(INSTALL_BIN_DIR)
|
||||||
|
|
@ -99,7 +99,7 @@ install: build
|
||||||
@echo "Installed binary to $(INSTALL_BIN_DIR)/$(BINARY_NAME)"
|
@echo "Installed binary to $(INSTALL_BIN_DIR)/$(BINARY_NAME)"
|
||||||
@echo "Installation complete!"
|
@echo "Installation complete!"
|
||||||
|
|
||||||
## uninstall: Remove picoclaw from system
|
## uninstall: Remove clawdroid from system
|
||||||
uninstall:
|
uninstall:
|
||||||
@echo "Uninstalling $(BINARY_NAME)..."
|
@echo "Uninstalling $(BINARY_NAME)..."
|
||||||
@rm -f $(INSTALL_BIN_DIR)/$(BINARY_NAME)
|
@rm -f $(INSTALL_BIN_DIR)/$(BINARY_NAME)
|
||||||
|
|
@ -107,11 +107,11 @@ uninstall:
|
||||||
@echo "Note: Only the executable file has been deleted."
|
@echo "Note: Only the executable file has been deleted."
|
||||||
@echo "If you need to delete all configurations (config.json, workspace, etc.), run 'make uninstall-all'"
|
@echo "If you need to delete all configurations (config.json, workspace, etc.), run 'make uninstall-all'"
|
||||||
|
|
||||||
## uninstall-all: Remove picoclaw and all data
|
## uninstall-all: Remove clawdroid and all data
|
||||||
uninstall-all:
|
uninstall-all:
|
||||||
@echo "Removing workspace and skills..."
|
@echo "Removing workspace and skills..."
|
||||||
@rm -rf $(PICOCLAW_HOME)
|
@rm -rf $(CLAWDROID_HOME)
|
||||||
@echo "Removed workspace: $(PICOCLAW_HOME)"
|
@echo "Removed workspace: $(CLAWDROID_HOME)"
|
||||||
@echo "Complete uninstallation done!"
|
@echo "Complete uninstallation done!"
|
||||||
|
|
||||||
## clean: Remove build artifacts
|
## clean: Remove build artifacts
|
||||||
|
|
@ -145,13 +145,13 @@ update-deps:
|
||||||
## check: Run vet, fmt, and verify dependencies
|
## check: Run vet, fmt, and verify dependencies
|
||||||
check: deps fmt vet test
|
check: deps fmt vet test
|
||||||
|
|
||||||
## run: Build and run picoclaw
|
## run: Build and run clawdroid
|
||||||
run: build
|
run: build
|
||||||
@$(BUILD_DIR)/$(BINARY_NAME) $(ARGS)
|
@$(BUILD_DIR)/$(BINARY_NAME) $(ARGS)
|
||||||
|
|
||||||
## help: Show this help message
|
## help: Show this help message
|
||||||
help:
|
help:
|
||||||
@echo "picoclaw Makefile"
|
@echo "clawdroid Makefile"
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo "Usage:"
|
@echo "Usage:"
|
||||||
@echo " make [target]"
|
@echo " make [target]"
|
||||||
|
|
@ -167,7 +167,7 @@ help:
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo "Environment Variables:"
|
@echo "Environment Variables:"
|
||||||
@echo " INSTALL_PREFIX # Installation prefix (default: ~/.local)"
|
@echo " INSTALL_PREFIX # Installation prefix (default: ~/.local)"
|
||||||
@echo " WORKSPACE_DIR # Workspace directory (default: ~/.picoclaw/workspace)"
|
@echo " WORKSPACE_DIR # Workspace directory (default: ~/.clawdroid/workspace)"
|
||||||
@echo " VERSION # Version string (default: git describe)"
|
@echo " VERSION # Version string (default: git describe)"
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo "Current Configuration:"
|
@echo "Current Configuration:"
|
||||||
|
|
|
||||||
104
README.ja.md
104
README.ja.md
|
|
@ -1,7 +1,7 @@
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<img src="assets/logo.jpg" alt="PicoClaw" width="512">
|
<img src="assets/logo.jpg" alt="ClawDroid" width="512">
|
||||||
|
|
||||||
<h1>PicoClaw: Go で書かれた超効率 AI アシスタント</h1>
|
<h1>ClawDroid: Go で書かれた超効率 AI アシスタント</h1>
|
||||||
|
|
||||||
<h3>$10 ハードウェア · 10MB RAM · 1秒起動 · 皮皮虾,我们走!</h3>
|
<h3>$10 ハードウェア · 10MB RAM · 1秒起動 · 皮皮虾,我们走!</h3>
|
||||||
<h3></h3>
|
<h3></h3>
|
||||||
|
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
🦐 PicoClaw は [nanobot](https://github.com/HKUDS/nanobot) にインスパイアされた超軽量パーソナル AI アシスタントです。Go でゼロからリファクタリングされ、AI エージェント自身がアーキテクチャの移行とコード最適化を推進するセルフブートストラッピングプロセスで構築されました。
|
🦐 ClawDroid は [nanobot](https://github.com/HKUDS/nanobot) にインスパイアされた超軽量パーソナル AI アシスタントです。Go でゼロからリファクタリングされ、AI エージェント自身がアーキテクチャの移行とコード最適化を推進するセルフブートストラッピングプロセスで構築されました。
|
||||||
|
|
||||||
⚡️ $10 のハードウェアで 10MB 未満の RAM で動作:OpenClaw より 99% 少ないメモリ、Mac mini より 98% 安い!
|
⚡️ $10 のハードウェアで 10MB 未満の RAM で動作:OpenClaw より 99% 少ないメモリ、Mac mini より 98% 安い!
|
||||||
|
|
||||||
|
|
@ -27,7 +27,7 @@
|
||||||
<tr align="center">
|
<tr align="center">
|
||||||
<td align="center" valign="top">
|
<td align="center" valign="top">
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="assets/picoclaw_mem.gif" width="360" height="240">
|
<img src="assets/clawdroid_mem.gif" width="360" height="240">
|
||||||
</p>
|
</p>
|
||||||
</td>
|
</td>
|
||||||
<td align="center" valign="top">
|
<td align="center" valign="top">
|
||||||
|
|
@ -39,7 +39,7 @@
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
## 📢 ニュース
|
## 📢 ニュース
|
||||||
2026-02-09 🎉 PicoClaw リリース!$10 ハードウェアで 10MB 未満の RAM で動く AI エージェントを 1 日で構築。🦐 皮皮虾,我们走!
|
2026-02-09 🎉 ClawDroid リリース!$10 ハードウェアで 10MB 未満の RAM で動く AI エージェントを 1 日で構築。🦐 皮皮虾,我们走!
|
||||||
|
|
||||||
## ✨ 特徴
|
## ✨ 特徴
|
||||||
|
|
||||||
|
|
@ -53,13 +53,13 @@
|
||||||
|
|
||||||
🤖 **AI ブートストラップ**: 自律的な Go ネイティブ実装 — コアの 95% が AI 生成、人間によるレビュー付き。
|
🤖 **AI ブートストラップ**: 自律的な Go ネイティブ実装 — コアの 95% が AI 生成、人間によるレビュー付き。
|
||||||
|
|
||||||
| | OpenClaw | NanoBot | **PicoClaw** |
|
| | OpenClaw | NanoBot | **ClawDroid** |
|
||||||
| --- | --- | --- |--- |
|
| --- | --- | --- |--- |
|
||||||
| **言語** | TypeScript | Python | **Go** |
|
| **言語** | TypeScript | Python | **Go** |
|
||||||
| **RAM** | >1GB |>100MB| **< 10MB** |
|
| **RAM** | >1GB |>100MB| **< 10MB** |
|
||||||
| **起動時間**</br>(0.8GHz コア) | >500秒 | >30秒 | **<1秒** |
|
| **起動時間**</br>(0.8GHz コア) | >500秒 | >30秒 | **<1秒** |
|
||||||
| **コスト** | Mac Mini 599$ | 大半の Linux SBC </br>~50$ |**あらゆる Linux ボード**</br>**最安 10$** |
|
| **コスト** | Mac Mini 599$ | 大半の Linux SBC </br>~50$ |**あらゆる Linux ボード**</br>**最安 10$** |
|
||||||
<img src="assets/compare.jpg" alt="PicoClaw" width="512">
|
<img src="assets/compare.jpg" alt="ClawDroid" width="512">
|
||||||
|
|
||||||
|
|
||||||
## 🦾 デモンストレーション
|
## 🦾 デモンストレーション
|
||||||
|
|
@ -71,9 +71,9 @@
|
||||||
<th><p align="center">🔎 Web 検索&学習</p></th>
|
<th><p align="center">🔎 Web 検索&学習</p></th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center"><p align="center"><img src="assets/picoclaw_code.gif" width="240" height="180"></p></td>
|
<td align="center"><p align="center"><img src="assets/clawdroid_code.gif" width="240" height="180"></p></td>
|
||||||
<td align="center"><p align="center"><img src="assets/picoclaw_memory.gif" width="240" height="180"></p></td>
|
<td align="center"><p align="center"><img src="assets/clawdroid_memory.gif" width="240" height="180"></p></td>
|
||||||
<td align="center"><p align="center"><img src="assets/picoclaw_search.gif" width="240" height="180"></p></td>
|
<td align="center"><p align="center"><img src="assets/clawdroid_search.gif" width="240" height="180"></p></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center">開発 · デプロイ · スケール</td>
|
<td align="center">開発 · デプロイ · スケール</td>
|
||||||
|
|
@ -83,7 +83,7 @@
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
### 🐜 革新的な省フットプリントデプロイ
|
### 🐜 革新的な省フットプリントデプロイ
|
||||||
PicoClaw はほぼすべての Linux デバイスにデプロイできます!
|
ClawDroid はほぼすべての Linux デバイスにデプロイできます!
|
||||||
|
|
||||||
- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) E(Ethernet) または W(WiFi6) バージョン、最小ホームアシスタントに
|
- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) E(Ethernet) または W(WiFi6) バージョン、最小ホームアシスタントに
|
||||||
- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html) または $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) サーバー自動メンテナンスに
|
- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html) または $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) サーバー自動メンテナンスに
|
||||||
|
|
@ -97,14 +97,14 @@ https://private-user-images.githubusercontent.com/83055338/547056448-e7b031ff-d6
|
||||||
|
|
||||||
### コンパイル済みバイナリでインストール
|
### コンパイル済みバイナリでインストール
|
||||||
|
|
||||||
[リリースページ](https://github.com/sipeed/picoclaw/releases) からお使いのプラットフォーム用のファームウェアをダウンロードしてください。
|
[リリースページ](https://github.com/KarakuriAgent/clawdroid/releases) からお使いのプラットフォーム用のファームウェアをダウンロードしてください。
|
||||||
|
|
||||||
### ソースからインストール(最新機能、開発向け推奨)
|
### ソースからインストール(最新機能、開発向け推奨)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/sipeed/picoclaw.git
|
git clone https://github.com/KarakuriAgent/clawdroid.git
|
||||||
|
|
||||||
cd picoclaw
|
cd clawdroid
|
||||||
make deps
|
make deps
|
||||||
|
|
||||||
# ビルド(インストール不要)
|
# ビルド(インストール不要)
|
||||||
|
|
@ -119,12 +119,12 @@ make install
|
||||||
|
|
||||||
## 🐳 Docker Compose
|
## 🐳 Docker Compose
|
||||||
|
|
||||||
Docker Compose を使えば、ローカルにインストールせずに PicoClaw を実行できます。
|
Docker Compose を使えば、ローカルにインストールせずに ClawDroid を実行できます。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 1. リポジトリをクローン
|
# 1. リポジトリをクローン
|
||||||
git clone https://github.com/sipeed/picoclaw.git
|
git clone https://github.com/KarakuriAgent/clawdroid.git
|
||||||
cd picoclaw
|
cd clawdroid
|
||||||
|
|
||||||
# 2. API キーを設定
|
# 2. API キーを設定
|
||||||
cp config/config.example.json config/config.json
|
cp config/config.example.json config/config.json
|
||||||
|
|
@ -134,7 +134,7 @@ vim config/config.json # DISCORD_BOT_TOKEN, プロバイダーの API キ
|
||||||
docker compose --profile gateway up -d
|
docker compose --profile gateway up -d
|
||||||
|
|
||||||
# 4. ログ確認
|
# 4. ログ確認
|
||||||
docker compose logs -f picoclaw-gateway
|
docker compose logs -f clawdroid-gateway
|
||||||
|
|
||||||
# 5. 停止
|
# 5. 停止
|
||||||
docker compose --profile gateway down
|
docker compose --profile gateway down
|
||||||
|
|
@ -144,10 +144,10 @@ docker compose --profile gateway down
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 質問を投げる
|
# 質問を投げる
|
||||||
docker compose run --rm picoclaw-agent -m "What is 2+2?"
|
docker compose run --rm clawdroid-agent -m "What is 2+2?"
|
||||||
|
|
||||||
# インタラクティブモード
|
# インタラクティブモード
|
||||||
docker compose run --rm picoclaw-agent
|
docker compose run --rm clawdroid-agent
|
||||||
```
|
```
|
||||||
|
|
||||||
### リビルド
|
### リビルド
|
||||||
|
|
@ -160,23 +160,23 @@ docker compose --profile gateway up -d
|
||||||
### 🚀 クイックスタート(ネイティブ)
|
### 🚀 クイックスタート(ネイティブ)
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> `~/.picoclaw/config.json` に API キーを設定してください。
|
> `~/.clawdroid/config.json` に API キーを設定してください。
|
||||||
> API キーの取得先: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)
|
> API キーの取得先: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)
|
||||||
> Web 検索は **任意** です - 無料の [Brave Search API](https://brave.com/search/api) (月 2000 クエリ無料)
|
> Web 検索は **任意** です - 無料の [Brave Search API](https://brave.com/search/api) (月 2000 クエリ無料)
|
||||||
|
|
||||||
**1. 初期化**
|
**1. 初期化**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
picoclaw onboard
|
clawdroid onboard
|
||||||
```
|
```
|
||||||
|
|
||||||
**2. 設定** (`~/.picoclaw/config.json`)
|
**2. 設定** (`~/.clawdroid/config.json`)
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"agents": {
|
"agents": {
|
||||||
"defaults": {
|
"defaults": {
|
||||||
"workspace": "~/.picoclaw/workspace",
|
"workspace": "~/.clawdroid/workspace",
|
||||||
"model": "glm-4.7",
|
"model": "glm-4.7",
|
||||||
"max_tokens": 8192,
|
"max_tokens": 8192,
|
||||||
"temperature": 0.7,
|
"temperature": 0.7,
|
||||||
|
|
@ -214,7 +214,7 @@ picoclaw onboard
|
||||||
**3. チャット**
|
**3. チャット**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
picoclaw agent -m "What is 2+2?"
|
clawdroid agent -m "What is 2+2?"
|
||||||
```
|
```
|
||||||
|
|
||||||
これだけです!2 分で AI アシスタントが動きます。
|
これだけです!2 分で AI アシスタントが動きます。
|
||||||
|
|
@ -223,7 +223,7 @@ picoclaw agent -m "What is 2+2?"
|
||||||
|
|
||||||
## 💬 チャットアプリ
|
## 💬 チャットアプリ
|
||||||
|
|
||||||
Telegram、Discord、QQ、DingTalk、LINE で PicoClaw と会話できます
|
Telegram、Discord、QQ、DingTalk、LINE で ClawDroid と会話できます
|
||||||
|
|
||||||
| チャネル | セットアップ |
|
| チャネル | セットアップ |
|
||||||
|---------|------------|
|
|---------|------------|
|
||||||
|
|
@ -261,7 +261,7 @@ Telegram、Discord、QQ、DingTalk、LINE で PicoClaw と会話できます
|
||||||
**3. 起動**
|
**3. 起動**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
picoclaw gateway
|
clawdroid gateway
|
||||||
```
|
```
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
|
@ -305,7 +305,7 @@ picoclaw gateway
|
||||||
**6. 起動**
|
**6. 起動**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
picoclaw gateway
|
clawdroid gateway
|
||||||
```
|
```
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
@ -338,7 +338,7 @@ picoclaw gateway
|
||||||
**3. 起動**
|
**3. 起動**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
picoclaw gateway
|
clawdroid gateway
|
||||||
```
|
```
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
@ -372,7 +372,7 @@ picoclaw gateway
|
||||||
**3. 起動**
|
**3. 起動**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
picoclaw gateway
|
clawdroid gateway
|
||||||
```
|
```
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
@ -418,25 +418,25 @@ LINE Developers Console で Webhook URL を `https://あなたのドメイン/we
|
||||||
**4. 起動**
|
**4. 起動**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
picoclaw gateway
|
clawdroid gateway
|
||||||
```
|
```
|
||||||
|
|
||||||
> グループチャットでは @メンション時のみ応答します。返信は元メッセージを引用する形式です。
|
> グループチャットでは @メンション時のみ応答します。返信は元メッセージを引用する形式です。
|
||||||
|
|
||||||
> **Docker Compose**: `picoclaw-gateway` サービスに `ports: ["18791:18791"]` を追加して Webhook ポートを公開してください。
|
> **Docker Compose**: `clawdroid-gateway` サービスに `ports: ["18791:18791"]` を追加して Webhook ポートを公開してください。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## ⚙️ 設定
|
## ⚙️ 設定
|
||||||
|
|
||||||
設定ファイル: `~/.picoclaw/config.json`
|
設定ファイル: `~/.clawdroid/config.json`
|
||||||
|
|
||||||
### ワークスペース構成
|
### ワークスペース構成
|
||||||
|
|
||||||
PicoClaw は設定されたワークスペース(デフォルト: `~/.picoclaw/workspace`)にデータを保存します:
|
ClawDroid は設定されたワークスペース(デフォルト: `~/.clawdroid/workspace`)にデータを保存します:
|
||||||
|
|
||||||
```
|
```
|
||||||
~/.picoclaw/workspace/
|
~/.clawdroid/workspace/
|
||||||
├── sessions/ # 会話セッションと履歴
|
├── sessions/ # 会話セッションと履歴
|
||||||
├── memory/ # 長期メモリ(MEMORY.md)
|
├── memory/ # 長期メモリ(MEMORY.md)
|
||||||
├── state/ # 永続状態(最後のチャネルなど)
|
├── state/ # 永続状態(最後のチャネルなど)
|
||||||
|
|
@ -452,7 +452,7 @@ PicoClaw は設定されたワークスペース(デフォルト: `~/.picoclaw
|
||||||
|
|
||||||
### 🔒 セキュリティサンドボックス
|
### 🔒 セキュリティサンドボックス
|
||||||
|
|
||||||
PicoClaw はデフォルトでサンドボックス環境で実行されます。エージェントは設定されたワークスペース内のファイルにのみアクセスし、コマンドを実行できます。
|
ClawDroid はデフォルトでサンドボックス環境で実行されます。エージェントは設定されたワークスペース内のファイルにのみアクセスし、コマンドを実行できます。
|
||||||
|
|
||||||
#### デフォルト設定
|
#### デフォルト設定
|
||||||
|
|
||||||
|
|
@ -460,7 +460,7 @@ PicoClaw はデフォルトでサンドボックス環境で実行されます
|
||||||
{
|
{
|
||||||
"agents": {
|
"agents": {
|
||||||
"defaults": {
|
"defaults": {
|
||||||
"workspace": "~/.picoclaw/workspace",
|
"workspace": "~/.clawdroid/workspace",
|
||||||
"restrict_to_workspace": true
|
"restrict_to_workspace": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -469,7 +469,7 @@ PicoClaw はデフォルトでサンドボックス環境で実行されます
|
||||||
|
|
||||||
| オプション | デフォルト | 説明 |
|
| オプション | デフォルト | 説明 |
|
||||||
|-----------|-----------|------|
|
|-----------|-----------|------|
|
||||||
| `workspace` | `~/.picoclaw/workspace` | エージェントの作業ディレクトリ |
|
| `workspace` | `~/.clawdroid/workspace` | エージェントの作業ディレクトリ |
|
||||||
| `restrict_to_workspace` | `true` | ファイル/コマンドアクセスをワークスペースに制限 |
|
| `restrict_to_workspace` | `true` | ファイル/コマンドアクセスをワークスペースに制限 |
|
||||||
|
|
||||||
#### 保護対象ツール
|
#### 保護対象ツール
|
||||||
|
|
@ -525,7 +525,7 @@ PicoClaw はデフォルトでサンドボックス環境で実行されます
|
||||||
|
|
||||||
**方法2: 環境変数**
|
**方法2: 環境変数**
|
||||||
```bash
|
```bash
|
||||||
export PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false
|
export CLAWDROID_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false
|
||||||
```
|
```
|
||||||
|
|
||||||
> ⚠️ **警告**: この制限を無効にすると、エージェントはシステム上の任意のパスにアクセスできるようになります。制御された環境でのみ慎重に使用してください。
|
> ⚠️ **警告**: この制限を無効にすると、エージェントはシステム上の任意のパスにアクセスできるようになります。制御された環境でのみ慎重に使用してください。
|
||||||
|
|
@ -544,7 +544,7 @@ export PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false
|
||||||
|
|
||||||
### ハートビート(定期タスク)
|
### ハートビート(定期タスク)
|
||||||
|
|
||||||
PicoClaw は自動的に定期タスクを実行できます。ワークスペースに `HEARTBEAT.md` ファイルを作成します:
|
ClawDroid は自動的に定期タスクを実行できます。ワークスペースに `HEARTBEAT.md` ファイルを作成します:
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
# 定期タスク
|
# 定期タスク
|
||||||
|
|
@ -615,8 +615,8 @@ HEARTBEAT_OK 応答 ユーザーが直接結果を受け取る
|
||||||
| `interval` | `30` | チェック間隔(分)、最小5分 |
|
| `interval` | `30` | チェック間隔(分)、最小5分 |
|
||||||
|
|
||||||
**環境変数:**
|
**環境変数:**
|
||||||
- `PICOCLAW_HEARTBEAT_ENABLED=false` で無効化
|
- `CLAWDROID_HEARTBEAT_ENABLED=false` で無効化
|
||||||
- `PICOCLAW_HEARTBEAT_INTERVAL=60` で間隔変更
|
- `CLAWDROID_HEARTBEAT_INTERVAL=60` で間隔変更
|
||||||
|
|
||||||
### 基本設定
|
### 基本設定
|
||||||
|
|
||||||
|
|
@ -647,7 +647,7 @@ HEARTBEAT_OK 応答 ユーザーが直接結果を受け取る
|
||||||
3. **実行**
|
3. **実行**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
picoclaw agent -m "Hello"
|
clawdroid agent -m "Hello"
|
||||||
```
|
```
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
|
@ -712,11 +712,11 @@ HEARTBEAT_OK 応答 ユーザーが直接結果を受け取る
|
||||||
|
|
||||||
| コマンド | 説明 |
|
| コマンド | 説明 |
|
||||||
|---------|------|
|
|---------|------|
|
||||||
| `picoclaw onboard` | 設定&ワークスペースの初期化 |
|
| `clawdroid onboard` | 設定&ワークスペースの初期化 |
|
||||||
| `picoclaw agent -m "..."` | エージェントとチャット |
|
| `clawdroid agent -m "..."` | エージェントとチャット |
|
||||||
| `picoclaw agent` | インタラクティブチャットモード |
|
| `clawdroid agent` | インタラクティブチャットモード |
|
||||||
| `picoclaw gateway` | ゲートウェイを起動 |
|
| `clawdroid gateway` | ゲートウェイを起動 |
|
||||||
| `picoclaw status` | ステータスを表示 |
|
| `clawdroid status` | ステータスを表示 |
|
||||||
|
|
||||||
## 🤝 コントリビュート&ロードマップ
|
## 🤝 コントリビュート&ロードマップ
|
||||||
|
|
||||||
|
|
@ -724,18 +724,18 @@ PR 歓迎!コードベースは意図的に小さく読みやすくしてい
|
||||||
|
|
||||||
Discord: https://discord.gg/V4sAZ9XWpN
|
Discord: https://discord.gg/V4sAZ9XWpN
|
||||||
|
|
||||||
<img src="assets/wechat.png" alt="PicoClaw" width="512">
|
<img src="assets/wechat.png" alt="ClawDroid" width="512">
|
||||||
|
|
||||||
|
|
||||||
## 🐛 トラブルシューティング
|
## 🐛 トラブルシューティング
|
||||||
|
|
||||||
### Web 検索で「API 配置问题」と表示される
|
### Web 検索で「API 配置问题」と表示される
|
||||||
|
|
||||||
検索 API キーをまだ設定していない場合、これは正常です。PicoClaw は手動検索用の便利なリンクを提供します。
|
検索 API キーをまだ設定していない場合、これは正常です。ClawDroid は手動検索用の便利なリンクを提供します。
|
||||||
|
|
||||||
Web 検索を有効にするには:
|
Web 検索を有効にするには:
|
||||||
1. [https://brave.com/search/api](https://brave.com/search/api) で無料の API キーを取得(月 2000 クエリ無料)
|
1. [https://brave.com/search/api](https://brave.com/search/api) で無料の API キーを取得(月 2000 クエリ無料)
|
||||||
2. `~/.picoclaw/config.json` に追加:
|
2. `~/.clawdroid/config.json` に追加:
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"tools": {
|
"tools": {
|
||||||
|
|
@ -755,7 +755,7 @@ Web 検索を有効にするには:
|
||||||
|
|
||||||
### Telegram Bot で「Conflict: terminated by other getUpdates」と表示される
|
### Telegram Bot で「Conflict: terminated by other getUpdates」と表示される
|
||||||
|
|
||||||
別のインスタンスが実行中の場合に発生します。`picoclaw gateway` が 1 つだけ実行されていることを確認してください。
|
別のインスタンスが実行中の場合に発生します。`clawdroid gateway` が 1 つだけ実行されていることを確認してください。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
130
README.md
130
README.md
|
|
@ -1,7 +1,7 @@
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<img src="assets/logo.jpg" alt="PicoClaw" width="512">
|
<img src="assets/logo.jpg" alt="ClawDroid" width="512">
|
||||||
|
|
||||||
<h1>PicoClaw: Ultra-Efficient AI Assistant in Go</h1>
|
<h1>ClawDroid: Ultra-Efficient AI Assistant in Go</h1>
|
||||||
|
|
||||||
<h3>$10 Hardware · 10MB RAM · 1s Boot · 皮皮虾,我们走!</h3>
|
<h3>$10 Hardware · 10MB RAM · 1s Boot · 皮皮虾,我们走!</h3>
|
||||||
|
|
||||||
|
|
@ -10,7 +10,7 @@
|
||||||
<img src="https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20RISC--V-blue" alt="Hardware">
|
<img src="https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20RISC--V-blue" alt="Hardware">
|
||||||
<img src="https://img.shields.io/badge/license-MIT-green" alt="License">
|
<img src="https://img.shields.io/badge/license-MIT-green" alt="License">
|
||||||
<br>
|
<br>
|
||||||
<a href="https://picoclaw.io"><img src="https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white" alt="Website"></a>
|
<a href="https://clawdroid.io"><img src="https://img.shields.io/badge/Website-clawdroid.io-blue?style=flat&logo=google-chrome&logoColor=white" alt="Website"></a>
|
||||||
<a href="https://x.com/SipeedIO"><img src="https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white" alt="Twitter"></a>
|
<a href="https://x.com/SipeedIO"><img src="https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white" alt="Twitter"></a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
🦐 PicoClaw is an ultra-lightweight personal AI Assistant inspired by [nanobot](https://github.com/HKUDS/nanobot), refactored from the ground up in Go through a self-bootstrapping process, where the AI agent itself drove the entire architectural migration and code optimization.
|
🦐 ClawDroid is an ultra-lightweight personal AI Assistant inspired by [nanobot](https://github.com/HKUDS/nanobot), refactored from the ground up in Go through a self-bootstrapping process, where the AI agent itself drove the entire architectural migration and code optimization.
|
||||||
|
|
||||||
⚡️ Runs on $10 hardware with <10MB RAM: That's 99% less memory than OpenClaw and 98% cheaper than a Mac mini!
|
⚡️ Runs on $10 hardware with <10MB RAM: That's 99% less memory than OpenClaw and 98% cheaper than a Mac mini!
|
||||||
|
|
||||||
|
|
@ -27,7 +27,7 @@
|
||||||
<tr align="center">
|
<tr align="center">
|
||||||
<td align="center" valign="top">
|
<td align="center" valign="top">
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="assets/picoclaw_mem.gif" width="360" height="240">
|
<img src="assets/clawdroid_mem.gif" width="360" height="240">
|
||||||
</p>
|
</p>
|
||||||
</td>
|
</td>
|
||||||
<td align="center" valign="top">
|
<td align="center" valign="top">
|
||||||
|
|
@ -41,20 +41,20 @@
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
> **🚨 SECURITY & OFFICIAL CHANNELS / 安全声明**
|
> **🚨 SECURITY & OFFICIAL CHANNELS / 安全声明**
|
||||||
>
|
>
|
||||||
> * **NO CRYPTO:** PicoClaw has **NO** official token/coin. All claims on `pump.fun` or other trading platforms are **SCAMS**.
|
> * **NO CRYPTO:** ClawDroid has **NO** official token/coin. All claims on `pump.fun` or other trading platforms are **SCAMS**.
|
||||||
> * **OFFICIAL DOMAIN:** The **ONLY** official website is **[picoclaw.io](https://picoclaw.io)**, and company website is **[sipeed.com](https://sipeed.com)**
|
> * **OFFICIAL DOMAIN:** The **ONLY** official website is **[clawdroid.io](https://clawdroid.io)**, and company website is **[sipeed.com](https://sipeed.com)**
|
||||||
> * **Warning:** Many `.ai/.org/.com/.net/...` domains are registered by third parties.
|
> * **Warning:** Many `.ai/.org/.com/.net/...` domains are registered by third parties.
|
||||||
> * **Warning:** picoclaw is in early development now and may have unresolved network security issues. Do not deploy to production environments before the v1.0 release.
|
> * **Warning:** clawdroid is in early development now and may have unresolved network security issues. Do not deploy to production environments before the v1.0 release.
|
||||||
> * **Note:** picoclaw has recently merged a lot of PRs, which may result in a larger memory footprint (10–20MB) in the latest versions. We plan to prioritize resource optimization as soon as the current feature set reaches a stable state.
|
> * **Note:** clawdroid has recently merged a lot of PRs, which may result in a larger memory footprint (10–20MB) in the latest versions. We plan to prioritize resource optimization as soon as the current feature set reaches a stable state.
|
||||||
|
|
||||||
|
|
||||||
## 📢 News
|
## 📢 News
|
||||||
2026-02-16 🎉 PicoClaw hit 12K stars in one week! Thank you all for your support! PicoClaw is growing faster than we ever imagined. Given the high volume of PRs, we urgently need community maintainers. Our volunteer roles and roadmap are officially posted [here](doc/picoclaw_community_roadmap_260216.md) —we 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.
|
🚀 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
|
## ✨ Features
|
||||||
|
|
||||||
|
|
@ -68,14 +68,14 @@
|
||||||
|
|
||||||
🤖 **AI-Bootstrapped**: Autonomous Go-native implementation — 95% Agent-generated core with human-in-the-loop refinement.
|
🤖 **AI-Bootstrapped**: Autonomous Go-native implementation — 95% Agent-generated core with human-in-the-loop refinement.
|
||||||
|
|
||||||
| | OpenClaw | NanoBot | **PicoClaw** |
|
| | OpenClaw | NanoBot | **ClawDroid** |
|
||||||
| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |
|
| ----------------------------- | ------------- | ------------------------ | ----------------------------------------- |
|
||||||
| **Language** | TypeScript | Python | **Go** |
|
| **Language** | TypeScript | Python | **Go** |
|
||||||
| **RAM** | >1GB | >100MB | **< 10MB** |
|
| **RAM** | >1GB | >100MB | **< 10MB** |
|
||||||
| **Startup**</br>(0.8GHz core) | >500s | >30s | **<1s** |
|
| **Startup**</br>(0.8GHz core) | >500s | >30s | **<1s** |
|
||||||
| **Cost** | Mac Mini 599$ | Most Linux SBC </br>~50$ | **Any Linux Board**</br>**As low as 10$** |
|
| **Cost** | Mac Mini 599$ | Most Linux SBC </br>~50$ | **Any Linux Board**</br>**As low as 10$** |
|
||||||
|
|
||||||
<img src="assets/compare.jpg" alt="PicoClaw" width="512">
|
<img src="assets/compare.jpg" alt="ClawDroid" width="512">
|
||||||
|
|
||||||
## 🦾 Demonstration
|
## 🦾 Demonstration
|
||||||
|
|
||||||
|
|
@ -88,9 +88,9 @@
|
||||||
<th><p align="center">🔎 Web Search & Learning</p></th>
|
<th><p align="center">🔎 Web Search & Learning</p></th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center"><p align="center"><img src="assets/picoclaw_code.gif" width="240" height="180"></p></td>
|
<td align="center"><p align="center"><img src="assets/clawdroid_code.gif" width="240" height="180"></p></td>
|
||||||
<td align="center"><p align="center"><img src="assets/picoclaw_memory.gif" width="240" height="180"></p></td>
|
<td align="center"><p align="center"><img src="assets/clawdroid_memory.gif" width="240" height="180"></p></td>
|
||||||
<td align="center"><p align="center"><img src="assets/picoclaw_search.gif" width="240" height="180"></p></td>
|
<td align="center"><p align="center"><img src="assets/clawdroid_search.gif" width="240" height="180"></p></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center">Develop • Deploy • Scale</td>
|
<td align="center">Develop • Deploy • Scale</td>
|
||||||
|
|
@ -101,7 +101,7 @@
|
||||||
|
|
||||||
### 🐜 Innovative Low-Footprint Deploy
|
### 🐜 Innovative Low-Footprint Deploy
|
||||||
|
|
||||||
PicoClaw can be deployed on almost any Linux device!
|
ClawDroid can be deployed on almost any Linux device!
|
||||||
|
|
||||||
- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) E(Ethernet) or W(WiFi6) version, for Minimal Home Assistant
|
- $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) E(Ethernet) or W(WiFi6) version, for Minimal Home Assistant
|
||||||
- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), or $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) for Automated Server Maintenance
|
- $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html), or $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html) for Automated Server Maintenance
|
||||||
|
|
@ -115,14 +115,14 @@ PicoClaw can be deployed on almost any Linux device!
|
||||||
|
|
||||||
### Install with precompiled binary
|
### Install with precompiled binary
|
||||||
|
|
||||||
Download the firmware for your platform from the [release](https://github.com/sipeed/picoclaw/releases) page.
|
Download the firmware for your platform from the [release](https://github.com/KarakuriAgent/clawdroid/releases) page.
|
||||||
|
|
||||||
### Install from source (latest features, recommended for development)
|
### Install from source (latest features, recommended for development)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/sipeed/picoclaw.git
|
git clone https://github.com/KarakuriAgent/clawdroid.git
|
||||||
|
|
||||||
cd picoclaw
|
cd clawdroid
|
||||||
make deps
|
make deps
|
||||||
|
|
||||||
# Build, no need to install
|
# Build, no need to install
|
||||||
|
|
@ -137,12 +137,12 @@ make install
|
||||||
|
|
||||||
## 🐳 Docker Compose
|
## 🐳 Docker Compose
|
||||||
|
|
||||||
You can also run PicoClaw using Docker Compose without installing anything locally.
|
You can also run ClawDroid using Docker Compose without installing anything locally.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 1. Clone this repo
|
# 1. Clone this repo
|
||||||
git clone https://github.com/sipeed/picoclaw.git
|
git clone https://github.com/KarakuriAgent/clawdroid.git
|
||||||
cd picoclaw
|
cd clawdroid
|
||||||
|
|
||||||
# 2. Set your API keys
|
# 2. Set your API keys
|
||||||
cp config/config.example.json config/config.json
|
cp config/config.example.json config/config.json
|
||||||
|
|
@ -152,7 +152,7 @@ vim config/config.json # Set DISCORD_BOT_TOKEN, API keys, etc.
|
||||||
docker compose --profile gateway up -d
|
docker compose --profile gateway up -d
|
||||||
|
|
||||||
# 4. Check logs
|
# 4. Check logs
|
||||||
docker compose logs -f picoclaw-gateway
|
docker compose logs -f clawdroid-gateway
|
||||||
|
|
||||||
# 5. Stop
|
# 5. Stop
|
||||||
docker compose --profile gateway down
|
docker compose --profile gateway down
|
||||||
|
|
@ -162,10 +162,10 @@ docker compose --profile gateway down
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Ask a question
|
# Ask a question
|
||||||
docker compose run --rm picoclaw-agent -m "What is 2+2?"
|
docker compose run --rm clawdroid-agent -m "What is 2+2?"
|
||||||
|
|
||||||
# Interactive mode
|
# Interactive mode
|
||||||
docker compose run --rm picoclaw-agent
|
docker compose run --rm clawdroid-agent
|
||||||
```
|
```
|
||||||
|
|
||||||
### Rebuild
|
### Rebuild
|
||||||
|
|
@ -178,23 +178,23 @@ docker compose --profile gateway up -d
|
||||||
### 🚀 Quick Start
|
### 🚀 Quick Start
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> Set your API key in `~/.picoclaw/config.json`.
|
> Set your API key in `~/.clawdroid/config.json`.
|
||||||
> Get API keys: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)
|
> Get API keys: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)
|
||||||
> Web search is **optional** - get free [Brave Search API](https://brave.com/search/api) (2000 free queries/month) or use built-in auto fallback.
|
> Web search is **optional** - get free [Brave Search API](https://brave.com/search/api) (2000 free queries/month) or use built-in auto fallback.
|
||||||
|
|
||||||
**1. Initialize**
|
**1. Initialize**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
picoclaw onboard
|
clawdroid onboard
|
||||||
```
|
```
|
||||||
|
|
||||||
**2. Configure** (`~/.picoclaw/config.json`)
|
**2. Configure** (`~/.clawdroid/config.json`)
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"agents": {
|
"agents": {
|
||||||
"defaults": {
|
"defaults": {
|
||||||
"workspace": "~/.picoclaw/workspace",
|
"workspace": "~/.clawdroid/workspace",
|
||||||
"model": "glm-4.7",
|
"model": "glm-4.7",
|
||||||
"max_tokens": 8192,
|
"max_tokens": 8192,
|
||||||
"temperature": 0.7,
|
"temperature": 0.7,
|
||||||
|
|
@ -233,7 +233,7 @@ picoclaw onboard
|
||||||
**4. Chat**
|
**4. Chat**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
picoclaw agent -m "What is 2+2?"
|
clawdroid agent -m "What is 2+2?"
|
||||||
```
|
```
|
||||||
|
|
||||||
That's it! You have a working AI assistant in 2 minutes.
|
That's it! You have a working AI assistant in 2 minutes.
|
||||||
|
|
@ -242,7 +242,7 @@ That's it! You have a working AI assistant in 2 minutes.
|
||||||
|
|
||||||
## 💬 Chat Apps
|
## 💬 Chat Apps
|
||||||
|
|
||||||
Talk to your picoclaw through Telegram, Discord, DingTalk, or LINE
|
Talk to your clawdroid through Telegram, Discord, DingTalk, or LINE
|
||||||
|
|
||||||
| Channel | Setup |
|
| Channel | Setup |
|
||||||
| ------------ | ---------------------------------- |
|
| ------------ | ---------------------------------- |
|
||||||
|
|
@ -280,7 +280,7 @@ Talk to your picoclaw through Telegram, Discord, DingTalk, or LINE
|
||||||
**3. Run**
|
**3. Run**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
picoclaw gateway
|
clawdroid gateway
|
||||||
```
|
```
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
@ -328,7 +328,7 @@ picoclaw gateway
|
||||||
**6. Run**
|
**6. Run**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
picoclaw gateway
|
clawdroid gateway
|
||||||
```
|
```
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
@ -361,7 +361,7 @@ picoclaw gateway
|
||||||
**3. Run**
|
**3. Run**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
picoclaw gateway
|
clawdroid gateway
|
||||||
```
|
```
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
@ -395,7 +395,7 @@ picoclaw gateway
|
||||||
**3. Run**
|
**3. Run**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
picoclaw gateway
|
clawdroid gateway
|
||||||
```
|
```
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
@ -441,31 +441,31 @@ Then set the Webhook URL in LINE Developers Console to `https://your-domain/webh
|
||||||
**4. Run**
|
**4. Run**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
picoclaw gateway
|
clawdroid gateway
|
||||||
```
|
```
|
||||||
|
|
||||||
> In group chats, the bot responds only when @mentioned. Replies quote the original message.
|
> In group chats, the bot responds only when @mentioned. Replies quote the original message.
|
||||||
|
|
||||||
> **Docker Compose**: Add `ports: ["18791:18791"]` to the `picoclaw-gateway` service to expose the webhook port.
|
> **Docker Compose**: Add `ports: ["18791:18791"]` to the `clawdroid-gateway` service to expose the webhook port.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## <img src="assets/clawdchat-icon.png" width="24" height="24" alt="ClawdChat"> Join the Agent Social Network
|
## <img src="assets/clawdchat-icon.png" width="24" height="24" alt="ClawdChat"> Join the Agent Social Network
|
||||||
|
|
||||||
Connect Picoclaw to the Agent Social Network simply by sending a single message via the CLI or any integrated Chat App.
|
Connect Clawdroid to the Agent Social Network simply by sending a single message via the CLI or any integrated Chat App.
|
||||||
|
|
||||||
**Read `https://clawdchat.ai/skill.md` and follow the instructions to join [ClawdChat.ai](https://clawdchat.ai)**
|
**Read `https://clawdchat.ai/skill.md` and follow the instructions to join [ClawdChat.ai](https://clawdchat.ai)**
|
||||||
|
|
||||||
## ⚙️ Configuration
|
## ⚙️ Configuration
|
||||||
|
|
||||||
Config file: `~/.picoclaw/config.json`
|
Config file: `~/.clawdroid/config.json`
|
||||||
|
|
||||||
### Workspace Layout
|
### Workspace Layout
|
||||||
|
|
||||||
PicoClaw stores data in your configured workspace (default: `~/.picoclaw/workspace`):
|
ClawDroid stores data in your configured workspace (default: `~/.clawdroid/workspace`):
|
||||||
|
|
||||||
```
|
```
|
||||||
~/.picoclaw/workspace/
|
~/.clawdroid/workspace/
|
||||||
├── sessions/ # Conversation sessions and history
|
├── sessions/ # Conversation sessions and history
|
||||||
├── memory/ # Long-term memory (MEMORY.md)
|
├── memory/ # Long-term memory (MEMORY.md)
|
||||||
├── state/ # Persistent state (last channel, etc.)
|
├── state/ # Persistent state (last channel, etc.)
|
||||||
|
|
@ -481,7 +481,7 @@ PicoClaw stores data in your configured workspace (default: `~/.picoclaw/workspa
|
||||||
|
|
||||||
### 🔒 Security Sandbox
|
### 🔒 Security Sandbox
|
||||||
|
|
||||||
PicoClaw runs in a sandboxed environment by default. The agent can only access files and execute commands within the configured workspace.
|
ClawDroid runs in a sandboxed environment by default. The agent can only access files and execute commands within the configured workspace.
|
||||||
|
|
||||||
#### Default Configuration
|
#### Default Configuration
|
||||||
|
|
||||||
|
|
@ -489,7 +489,7 @@ PicoClaw runs in a sandboxed environment by default. The agent can only access f
|
||||||
{
|
{
|
||||||
"agents": {
|
"agents": {
|
||||||
"defaults": {
|
"defaults": {
|
||||||
"workspace": "~/.picoclaw/workspace",
|
"workspace": "~/.clawdroid/workspace",
|
||||||
"restrict_to_workspace": true
|
"restrict_to_workspace": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -498,7 +498,7 @@ PicoClaw runs in a sandboxed environment by default. The agent can only access f
|
||||||
|
|
||||||
| Option | Default | Description |
|
| Option | Default | Description |
|
||||||
|--------|---------|-------------|
|
|--------|---------|-------------|
|
||||||
| `workspace` | `~/.picoclaw/workspace` | Working directory for the agent |
|
| `workspace` | `~/.clawdroid/workspace` | Working directory for the agent |
|
||||||
| `restrict_to_workspace` | `true` | Restrict file/command access to workspace |
|
| `restrict_to_workspace` | `true` | Restrict file/command access to workspace |
|
||||||
|
|
||||||
#### Protected Tools
|
#### Protected Tools
|
||||||
|
|
@ -556,7 +556,7 @@ If you need the agent to access paths outside the workspace:
|
||||||
**Method 2: Environment variable**
|
**Method 2: Environment variable**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
export PICOCLAW_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false
|
export CLAWDROID_AGENTS_DEFAULTS_RESTRICT_TO_WORKSPACE=false
|
||||||
```
|
```
|
||||||
|
|
||||||
> ⚠️ **Warning**: Disabling this restriction allows the agent to access any path on your system. Use with caution in controlled environments only.
|
> ⚠️ **Warning**: Disabling this restriction allows the agent to access any path on your system. Use with caution in controlled environments only.
|
||||||
|
|
@ -575,7 +575,7 @@ All paths share the same workspace restriction — there's no way to bypass the
|
||||||
|
|
||||||
### Heartbeat (Periodic Tasks)
|
### Heartbeat (Periodic Tasks)
|
||||||
|
|
||||||
PicoClaw can perform periodic tasks automatically. Create a `HEARTBEAT.md` file in your workspace:
|
ClawDroid can perform periodic tasks automatically. Create a `HEARTBEAT.md` file in your workspace:
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
# Periodic Tasks
|
# Periodic Tasks
|
||||||
|
|
@ -647,8 +647,8 @@ The subagent has access to tools (message, web_search, etc.) and can communicate
|
||||||
|
|
||||||
**Environment variables:**
|
**Environment variables:**
|
||||||
|
|
||||||
* `PICOCLAW_HEARTBEAT_ENABLED=false` to disable
|
* `CLAWDROID_HEARTBEAT_ENABLED=false` to disable
|
||||||
* `PICOCLAW_HEARTBEAT_INTERVAL=60` to change interval
|
* `CLAWDROID_HEARTBEAT_INTERVAL=60` to change interval
|
||||||
|
|
||||||
### Providers
|
### Providers
|
||||||
|
|
||||||
|
|
@ -678,7 +678,7 @@ The subagent has access to tools (message, web_search, etc.) and can communicate
|
||||||
{
|
{
|
||||||
"agents": {
|
"agents": {
|
||||||
"defaults": {
|
"defaults": {
|
||||||
"workspace": "~/.picoclaw/workspace",
|
"workspace": "~/.clawdroid/workspace",
|
||||||
"model": "glm-4.7",
|
"model": "glm-4.7",
|
||||||
"max_tokens": 8192,
|
"max_tokens": 8192,
|
||||||
"temperature": 0.7,
|
"temperature": 0.7,
|
||||||
|
|
@ -697,7 +697,7 @@ The subagent has access to tools (message, web_search, etc.) and can communicate
|
||||||
**3. Run**
|
**3. Run**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
picoclaw agent -m "Hello"
|
clawdroid agent -m "Hello"
|
||||||
```
|
```
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
@ -775,23 +775,23 @@ picoclaw agent -m "Hello"
|
||||||
|
|
||||||
| Command | Description |
|
| Command | Description |
|
||||||
| ------------------------- | ----------------------------- |
|
| ------------------------- | ----------------------------- |
|
||||||
| `picoclaw onboard` | Initialize config & workspace |
|
| `clawdroid onboard` | Initialize config & workspace |
|
||||||
| `picoclaw agent -m "..."` | Chat with the agent |
|
| `clawdroid agent -m "..."` | Chat with the agent |
|
||||||
| `picoclaw agent` | Interactive chat mode |
|
| `clawdroid agent` | Interactive chat mode |
|
||||||
| `picoclaw gateway` | Start the gateway |
|
| `clawdroid gateway` | Start the gateway |
|
||||||
| `picoclaw status` | Show status |
|
| `clawdroid status` | Show status |
|
||||||
| `picoclaw cron list` | List all scheduled jobs |
|
| `clawdroid cron list` | List all scheduled jobs |
|
||||||
| `picoclaw cron add ...` | Add a scheduled job |
|
| `clawdroid cron add ...` | Add a scheduled job |
|
||||||
|
|
||||||
### Scheduled Tasks / Reminders
|
### Scheduled Tasks / Reminders
|
||||||
|
|
||||||
PicoClaw supports scheduled reminders and recurring tasks through the `cron` tool:
|
ClawDroid supports scheduled reminders and recurring tasks through the `cron` tool:
|
||||||
|
|
||||||
* **One-time reminders**: "Remind me in 10 minutes" → triggers once after 10min
|
* **One-time reminders**: "Remind me in 10 minutes" → triggers once after 10min
|
||||||
* **Recurring tasks**: "Remind me every 2 hours" → triggers every 2 hours
|
* **Recurring tasks**: "Remind me every 2 hours" → triggers every 2 hours
|
||||||
* **Cron expressions**: "Remind me at 9am daily" → uses cron expression
|
* **Cron expressions**: "Remind me at 9am daily" → uses cron expression
|
||||||
|
|
||||||
Jobs are stored in `~/.picoclaw/workspace/cron/` and processed automatically.
|
Jobs are stored in `~/.clawdroid/workspace/cron/` and processed automatically.
|
||||||
|
|
||||||
## 🤝 Contribute & Roadmap
|
## 🤝 Contribute & Roadmap
|
||||||
|
|
||||||
|
|
@ -805,20 +805,20 @@ User Groups:
|
||||||
|
|
||||||
discord: <https://discord.gg/V4sAZ9XWpN>
|
discord: <https://discord.gg/V4sAZ9XWpN>
|
||||||
|
|
||||||
<img src="assets/wechat.png" alt="PicoClaw" width="512">
|
<img src="assets/wechat.png" alt="ClawDroid" width="512">
|
||||||
|
|
||||||
## 🐛 Troubleshooting
|
## 🐛 Troubleshooting
|
||||||
|
|
||||||
### Web search says "API 配置问题"
|
### Web search says "API 配置问题"
|
||||||
|
|
||||||
This is normal if you haven't configured a search API key yet. PicoClaw will provide helpful links for manual searching.
|
This is normal if you haven't configured a search API key yet. ClawDroid will provide helpful links for manual searching.
|
||||||
|
|
||||||
To enable web search:
|
To enable web search:
|
||||||
|
|
||||||
1. **Option 1 (Recommended)**: Get a free API key at [https://brave.com/search/api](https://brave.com/search/api) (2000 free queries/month) for the best results.
|
1. **Option 1 (Recommended)**: Get a free API key at [https://brave.com/search/api](https://brave.com/search/api) (2000 free queries/month) for the best results.
|
||||||
2. **Option 2 (No Credit Card)**: If you don't have a key, we automatically fall back to **DuckDuckGo** (no key required).
|
2. **Option 2 (No Credit Card)**: If you don't have a key, we automatically fall back to **DuckDuckGo** (no key required).
|
||||||
|
|
||||||
Add the key to `~/.picoclaw/config.json` if using Brave:
|
Add the key to `~/.clawdroid/config.json` if using Brave:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
|
|
@ -844,7 +844,7 @@ Some providers (like Zhipu) have content filtering. Try rephrasing your query or
|
||||||
|
|
||||||
### Telegram bot says "Conflict: terminated by other getUpdates"
|
### Telegram bot says "Conflict: terminated by other getUpdates"
|
||||||
|
|
||||||
This happens when another instance of the bot is running. Make sure only one `picoclaw gateway` is running at a time.
|
This happens when another instance of the bot is running. Make sure only one `clawdroid gateway` is running at a time.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
118
README.zh.md
118
README.zh.md
|
|
@ -1,7 +1,7 @@
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<img src="assets/logo.jpg" alt="PicoClaw" width="512">
|
<img src="assets/logo.jpg" alt="ClawDroid" width="512">
|
||||||
|
|
||||||
<h1>PicoClaw: 基于Go语言的超高效 AI 助手</h1>
|
<h1>ClawDroid: 基于Go语言的超高效 AI 助手</h1>
|
||||||
|
|
||||||
<h3>10$硬件 · 10MB内存 · 1秒启动 · 皮皮虾,我们走!</h3>
|
<h3>10$硬件 · 10MB内存 · 1秒启动 · 皮皮虾,我们走!</h3>
|
||||||
|
|
||||||
|
|
@ -10,7 +10,7 @@
|
||||||
<img src="https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20RISC--V-blue" alt="Hardware">
|
<img src="https://img.shields.io/badge/Arch-x86__64%2C%20ARM64%2C%20RISC--V-blue" alt="Hardware">
|
||||||
<img src="https://img.shields.io/badge/license-MIT-green" alt="License">
|
<img src="https://img.shields.io/badge/license-MIT-green" alt="License">
|
||||||
<br>
|
<br>
|
||||||
<a href="https://picoclaw.io"><img src="https://img.shields.io/badge/Website-picoclaw.io-blue?style=flat&logo=google-chrome&logoColor=white" alt="Website"></a>
|
<a href="https://clawdroid.io"><img src="https://img.shields.io/badge/Website-clawdroid.io-blue?style=flat&logo=google-chrome&logoColor=white" alt="Website"></a>
|
||||||
<a href="https://x.com/SipeedIO"><img src="https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white" alt="Twitter"></a>
|
<a href="https://x.com/SipeedIO"><img src="https://img.shields.io/badge/X_(Twitter)-SipeedIO-black?style=flat&logo=x&logoColor=white" alt="Twitter"></a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
🦐 **PicoClaw** 是一个受 [nanobot](https://github.com/HKUDS/nanobot) 启发的超轻量级个人 AI 助手。它采用 **Go 语言** 从零重构,经历了一个“自举”过程——即由 AI Agent 自身驱动了整个架构迁移和代码优化。
|
🦐 **ClawDroid** 是一个受 [nanobot](https://github.com/HKUDS/nanobot) 启发的超轻量级个人 AI 助手。它采用 **Go 语言** 从零重构,经历了一个“自举”过程——即由 AI Agent 自身驱动了整个架构迁移和代码优化。
|
||||||
|
|
||||||
⚡️ **极致轻量**:可在 **10 美元** 的硬件上运行,内存占用 **<10MB**。这意味着比 OpenClaw 节省 99% 的内存,比 Mac mini 便宜 98%!
|
⚡️ **极致轻量**:可在 **10 美元** 的硬件上运行,内存占用 **<10MB**。这意味着比 OpenClaw 节省 99% 的内存,比 Mac mini 便宜 98%!
|
||||||
|
|
||||||
|
|
@ -27,7 +27,7 @@
|
||||||
<tr align="center">
|
<tr align="center">
|
||||||
<td align="center" valign="top">
|
<td align="center" valign="top">
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="assets/picoclaw_mem.gif" width="360" height="240">
|
<img src="assets/clawdroid_mem.gif" width="360" height="240">
|
||||||
</p>
|
</p>
|
||||||
</td>
|
</td>
|
||||||
<td align="center" valign="top">
|
<td align="center" valign="top">
|
||||||
|
|
@ -42,20 +42,20 @@
|
||||||
|
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
> **🚨 SECURITY & OFFICIAL CHANNELS / 安全声明**
|
> **🚨 SECURITY & OFFICIAL CHANNELS / 安全声明**
|
||||||
> * **无加密货币 (NO CRYPTO):** PicoClaw **没有** 发行任何官方代币、Token 或虚拟货币。所有在 `pump.fun` 或其他交易平台上的相关声称均为 **诈骗**。
|
> * **无加密货币 (NO CRYPTO):** ClawDroid **没有** 发行任何官方代币、Token 或虚拟货币。所有在 `pump.fun` 或其他交易平台上的相关声称均为 **诈骗**。
|
||||||
> * **官方域名:** 唯一的官方网站是 **[picoclaw.io](https://picoclaw.io)**,公司官网是 **[sipeed.com](https://sipeed.com)**。
|
> * **官方域名:** 唯一的官方网站是 **[clawdroid.io](https://clawdroid.io)**,公司官网是 **[sipeed.com](https://sipeed.com)**。
|
||||||
> * **警惕:** 许多 `.ai/.org/.com/.net/...` 后缀的域名被第三方抢注,请勿轻信。
|
> * **警惕:** 许多 `.ai/.org/.com/.net/...` 后缀的域名被第三方抢注,请勿轻信。
|
||||||
> * **注意:** picoclaw正在初期的快速功能开发阶段,可能有尚未修复的网络安全问题,在1.0正式版发布前,请不要将其部署到生产环境中
|
> * **注意:** clawdroid正在初期的快速功能开发阶段,可能有尚未修复的网络安全问题,在1.0正式版发布前,请不要将其部署到生产环境中
|
||||||
> * **注意:** picoclaw最近合并了大量PRs,近期版本可能内存占用较大(10~20MB),我们将在功能较为收敛后进行资源占用优化.
|
> * **注意:** clawdroid最近合并了大量PRs,近期版本可能内存占用较大(10~20MB),我们将在功能较为收敛后进行资源占用优化.
|
||||||
|
|
||||||
|
|
||||||
## 📢 新闻 (News)
|
## 📢 新闻 (News)
|
||||||
2026-02-16 🎉 PicoClaw 在一周内突破了12K star! 感谢大家的关注!PicoClaw 的成长速度超乎我们预期. 由于PR数量的快速膨胀,我们亟需社区开发者参与维护. 我们需要的志愿者角色和roadmap已经发布到了[这里](doc/picoclaw_community_roadmap_260216.md), 期待你的参与!
|
2026-02-16 🎉 ClawDroid 在一周内突破了12K star! 感谢大家的关注!ClawDroid 的成长速度超乎我们预期. 由于PR数量的快速膨胀,我们亟需社区开发者参与维护. 我们需要的志愿者角色和roadmap已经发布到了[这里](doc/clawdroid_community_roadmap_260216.md), 期待你的参与!
|
||||||
|
|
||||||
2026-02-13 🎉 **PicoClaw 在 4 天内突破 5000 Stars!** 感谢社区的支持!由于正值中国春节假期,PR 和 Issue 涌入较多,我们正在利用这段时间敲定 **项目路线图 (Roadmap)** 并组建 **开发者群组**,以便加速 PicoClaw 的开发。
|
2026-02-13 🎉 **ClawDroid 在 4 天内突破 5000 Stars!** 感谢社区的支持!由于正值中国春节假期,PR 和 Issue 涌入较多,我们正在利用这段时间敲定 **项目路线图 (Roadmap)** 并组建 **开发者群组**,以便加速 ClawDroid 的开发。
|
||||||
🚀 **行动号召:** 请在 GitHub Discussions 中提交您的功能请求 (Feature Requests)。我们将在接下来的周会上进行审查和优先级排序。
|
🚀 **行动号召:** 请在 GitHub Discussions 中提交您的功能请求 (Feature Requests)。我们将在接下来的周会上进行审查和优先级排序。
|
||||||
|
|
||||||
2026-02-09 🎉 **PicoClaw 正式发布!** 仅用 1 天构建,旨在将 AI Agent 带入 10 美元硬件与 <10MB 内存的世界。🦐 PicoClaw(皮皮虾),我们走!
|
2026-02-09 🎉 **ClawDroid 正式发布!** 仅用 1 天构建,旨在将 AI Agent 带入 10 美元硬件与 <10MB 内存的世界。🦐 ClawDroid(皮皮虾),我们走!
|
||||||
|
|
||||||
## ✨ 特性
|
## ✨ 特性
|
||||||
|
|
||||||
|
|
@ -69,14 +69,14 @@
|
||||||
|
|
||||||
🤖 **AI 自举**: 纯 Go 语言原生实现 — 95% 的核心代码由 Agent 生成,并经由“人机回环 (Human-in-the-loop)”微调。
|
🤖 **AI 自举**: 纯 Go 语言原生实现 — 95% 的核心代码由 Agent 生成,并经由“人机回环 (Human-in-the-loop)”微调。
|
||||||
|
|
||||||
| | OpenClaw | NanoBot | **PicoClaw** |
|
| | OpenClaw | NanoBot | **ClawDroid** |
|
||||||
| --- | --- | --- | --- |
|
| --- | --- | --- | --- |
|
||||||
| **语言** | TypeScript | Python | **Go** |
|
| **语言** | TypeScript | Python | **Go** |
|
||||||
| **RAM** | >1GB | >100MB | **< 10MB** |
|
| **RAM** | >1GB | >100MB | **< 10MB** |
|
||||||
| **启动时间**</br>(0.8GHz core) | >500s | >30s | **<1s** |
|
| **启动时间**</br>(0.8GHz core) | >500s | >30s | **<1s** |
|
||||||
| **成本** | Mac Mini $599 | 大多数 Linux 开发板 ~$50 | **任意 Linux 开发板**</br>**低至 $10** |
|
| **成本** | Mac Mini $599 | 大多数 Linux 开发板 ~$50 | **任意 Linux 开发板**</br>**低至 $10** |
|
||||||
|
|
||||||
<img src="assets/compare.jpg" alt="PicoClaw" width="512">
|
<img src="assets/compare.jpg" alt="ClawDroid" width="512">
|
||||||
|
|
||||||
## 🦾 演示
|
## 🦾 演示
|
||||||
|
|
||||||
|
|
@ -89,9 +89,9 @@
|
||||||
<th><p align="center">🔎 网络搜索与学习</p></th>
|
<th><p align="center">🔎 网络搜索与学习</p></th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center"><p align="center"><img src="assets/picoclaw_code.gif" width="240" height="180"></p></td>
|
<td align="center"><p align="center"><img src="assets/clawdroid_code.gif" width="240" height="180"></p></td>
|
||||||
<td align="center"><p align="center"><img src="assets/picoclaw_memory.gif" width="240" height="180"></p></td>
|
<td align="center"><p align="center"><img src="assets/clawdroid_memory.gif" width="240" height="180"></p></td>
|
||||||
<td align="center"><p align="center"><img src="assets/picoclaw_search.gif" width="240" height="180"></p></td>
|
<td align="center"><p align="center"><img src="assets/clawdroid_search.gif" width="240" height="180"></p></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center">开发 • 部署 • 扩展</td>
|
<td align="center">开发 • 部署 • 扩展</td>
|
||||||
|
|
@ -102,7 +102,7 @@
|
||||||
|
|
||||||
### 🐜 创新的低占用部署
|
### 🐜 创新的低占用部署
|
||||||
|
|
||||||
PicoClaw 几乎可以部署在任何 Linux 设备上!
|
ClawDroid 几乎可以部署在任何 Linux 设备上!
|
||||||
|
|
||||||
* $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) E(网口) 或 W(WiFi6) 版本,用于极简家庭助手。
|
* $9.9 [LicheeRV-Nano](https://www.aliexpress.com/item/1005006519668532.html) E(网口) 或 W(WiFi6) 版本,用于极简家庭助手。
|
||||||
* $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html),或 $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html),用于自动化服务器运维。
|
* $30~50 [NanoKVM](https://www.aliexpress.com/item/1005007369816019.html),或 $100 [NanoKVM-Pro](https://www.aliexpress.com/item/1005010048471263.html),用于自动化服务器运维。
|
||||||
|
|
@ -116,14 +116,14 @@ PicoClaw 几乎可以部署在任何 Linux 设备上!
|
||||||
|
|
||||||
### 使用预编译二进制文件安装
|
### 使用预编译二进制文件安装
|
||||||
|
|
||||||
从 [Release 页面](https://github.com/sipeed/picoclaw/releases) 下载适用于您平台的固件。
|
从 [Release 页面](https://github.com/KarakuriAgent/clawdroid/releases) 下载适用于您平台的固件。
|
||||||
|
|
||||||
### 从源码安装(获取最新特性,开发推荐)
|
### 从源码安装(获取最新特性,开发推荐)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/sipeed/picoclaw.git
|
git clone https://github.com/KarakuriAgent/clawdroid.git
|
||||||
|
|
||||||
cd picoclaw
|
cd clawdroid
|
||||||
make deps
|
make deps
|
||||||
|
|
||||||
# 构建(无需安装)
|
# 构建(无需安装)
|
||||||
|
|
@ -139,12 +139,12 @@ make install
|
||||||
|
|
||||||
## 🐳 Docker Compose
|
## 🐳 Docker Compose
|
||||||
|
|
||||||
您也可以使用 Docker Compose 运行 PicoClaw,无需在本地安装任何环境。
|
您也可以使用 Docker Compose 运行 ClawDroid,无需在本地安装任何环境。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 1. 克隆仓库
|
# 1. 克隆仓库
|
||||||
git clone https://github.com/sipeed/picoclaw.git
|
git clone https://github.com/KarakuriAgent/clawdroid.git
|
||||||
cd picoclaw
|
cd clawdroid
|
||||||
|
|
||||||
# 2. 设置 API Key
|
# 2. 设置 API Key
|
||||||
cp config/config.example.json config/config.json
|
cp config/config.example.json config/config.json
|
||||||
|
|
@ -154,7 +154,7 @@ vim config/config.json # 设置 DISCORD_BOT_TOKEN, API keys 等
|
||||||
docker compose --profile gateway up -d
|
docker compose --profile gateway up -d
|
||||||
|
|
||||||
# 4. 查看日志
|
# 4. 查看日志
|
||||||
docker compose logs -f picoclaw-gateway
|
docker compose logs -f clawdroid-gateway
|
||||||
|
|
||||||
# 5. 停止
|
# 5. 停止
|
||||||
docker compose --profile gateway down
|
docker compose --profile gateway down
|
||||||
|
|
@ -165,10 +165,10 @@ docker compose --profile gateway down
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 提问
|
# 提问
|
||||||
docker compose run --rm picoclaw-agent -m "2+2 等于几?"
|
docker compose run --rm clawdroid-agent -m "2+2 等于几?"
|
||||||
|
|
||||||
# 交互模式
|
# 交互模式
|
||||||
docker compose run --rm picoclaw-agent
|
docker compose run --rm clawdroid-agent
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -183,24 +183,24 @@ docker compose --profile gateway up -d
|
||||||
### 🚀 快速开始
|
### 🚀 快速开始
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> 在 `~/.picoclaw/config.json` 中设置您的 API Key。
|
> 在 `~/.clawdroid/config.json` 中设置您的 API Key。
|
||||||
> 获取 API Key: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu (智谱)](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)
|
> 获取 API Key: [OpenRouter](https://openrouter.ai/keys) (LLM) · [Zhipu (智谱)](https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys) (LLM)
|
||||||
> 网络搜索是 **可选的** - 获取免费的 [Brave Search API](https://brave.com/search/api) (每月 2000 次免费查询)
|
> 网络搜索是 **可选的** - 获取免费的 [Brave Search API](https://brave.com/search/api) (每月 2000 次免费查询)
|
||||||
|
|
||||||
**1. 初始化 (Initialize)**
|
**1. 初始化 (Initialize)**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
picoclaw onboard
|
clawdroid onboard
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
**2. 配置 (Configure)** (`~/.picoclaw/config.json`)
|
**2. 配置 (Configure)** (`~/.clawdroid/config.json`)
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"agents": {
|
"agents": {
|
||||||
"defaults": {
|
"defaults": {
|
||||||
"workspace": "~/.picoclaw/workspace",
|
"workspace": "~/.clawdroid/workspace",
|
||||||
"model": "glm-4.7",
|
"model": "glm-4.7",
|
||||||
"max_tokens": 8192,
|
"max_tokens": 8192,
|
||||||
"temperature": 0.7,
|
"temperature": 0.7,
|
||||||
|
|
@ -235,7 +235,7 @@ picoclaw onboard
|
||||||
**4. 对话 (Chat)**
|
**4. 对话 (Chat)**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
picoclaw agent -m "2+2 等于几?"
|
clawdroid agent -m "2+2 等于几?"
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -245,7 +245,7 @@ picoclaw agent -m "2+2 等于几?"
|
||||||
|
|
||||||
## 💬 聊天应用集成 (Chat Apps)
|
## 💬 聊天应用集成 (Chat Apps)
|
||||||
|
|
||||||
通过 Telegram, Discord 或钉钉与您的 PicoClaw 对话。
|
通过 Telegram, Discord 或钉钉与您的 ClawDroid 对话。
|
||||||
|
|
||||||
| 渠道 | 设置难度 |
|
| 渠道 | 设置难度 |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
|
|
@ -283,7 +283,7 @@ picoclaw agent -m "2+2 等于几?"
|
||||||
**3. 运行**
|
**3. 运行**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
picoclaw gateway
|
clawdroid gateway
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -333,7 +333,7 @@ picoclaw gateway
|
||||||
**6. 运行**
|
**6. 运行**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
picoclaw gateway
|
clawdroid gateway
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -368,7 +368,7 @@ picoclaw gateway
|
||||||
**3. 运行**
|
**3. 运行**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
picoclaw gateway
|
clawdroid gateway
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -404,7 +404,7 @@ picoclaw gateway
|
||||||
**3. 运行**
|
**3. 运行**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
picoclaw gateway
|
clawdroid gateway
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -412,20 +412,20 @@ picoclaw gateway
|
||||||
|
|
||||||
## <img src="assets/clawdchat-icon.png" width="24" height="24" alt="ClawdChat"> 加入 Agent 社交网络
|
## <img src="assets/clawdchat-icon.png" width="24" height="24" alt="ClawdChat"> 加入 Agent 社交网络
|
||||||
|
|
||||||
只需通过 CLI 或任何集成的聊天应用发送一条消息,即可将 PicoClaw 连接到 Agent 社交网络。
|
只需通过 CLI 或任何集成的聊天应用发送一条消息,即可将 ClawDroid 连接到 Agent 社交网络。
|
||||||
|
|
||||||
**阅读 `https://clawdchat.ai/skill.md` 并按照说明加入 [ClawdChat.ai**](https://clawdchat.ai)
|
**阅读 `https://clawdchat.ai/skill.md` 并按照说明加入 [ClawdChat.ai**](https://clawdchat.ai)
|
||||||
|
|
||||||
## ⚙️ 配置详解
|
## ⚙️ 配置详解
|
||||||
|
|
||||||
配置文件路径: `~/.picoclaw/config.json`
|
配置文件路径: `~/.clawdroid/config.json`
|
||||||
|
|
||||||
### 工作区布局 (Workspace Layout)
|
### 工作区布局 (Workspace Layout)
|
||||||
|
|
||||||
PicoClaw 将数据存储在您配置的工作区中(默认:`~/.picoclaw/workspace`):
|
ClawDroid 将数据存储在您配置的工作区中(默认:`~/.clawdroid/workspace`):
|
||||||
|
|
||||||
```
|
```
|
||||||
~/.picoclaw/workspace/
|
~/.clawdroid/workspace/
|
||||||
├── sessions/ # 对话会话和历史
|
├── sessions/ # 对话会话和历史
|
||||||
├── memory/ # 长期记忆 (MEMORY.md)
|
├── memory/ # 长期记忆 (MEMORY.md)
|
||||||
├── state/ # 持久化状态 (最后一次频道等)
|
├── state/ # 持久化状态 (最后一次频道等)
|
||||||
|
|
@ -442,7 +442,7 @@ PicoClaw 将数据存储在您配置的工作区中(默认:`~/.picoclaw/work
|
||||||
|
|
||||||
### 心跳 / 周期性任务 (Heartbeat)
|
### 心跳 / 周期性任务 (Heartbeat)
|
||||||
|
|
||||||
PicoClaw 可以自动执行周期性任务。在工作区创建 `HEARTBEAT.md` 文件:
|
ClawDroid 可以自动执行周期性任务。在工作区创建 `HEARTBEAT.md` 文件:
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
# Periodic Tasks
|
# Periodic Tasks
|
||||||
|
|
@ -518,8 +518,8 @@ Agent 读取 HEARTBEAT.md
|
||||||
|
|
||||||
**环境变量:**
|
**环境变量:**
|
||||||
|
|
||||||
* `PICOCLAW_HEARTBEAT_ENABLED=false` 禁用
|
* `CLAWDROID_HEARTBEAT_ENABLED=false` 禁用
|
||||||
* `PICOCLAW_HEARTBEAT_INTERVAL=60` 更改间隔
|
* `CLAWDROID_HEARTBEAT_INTERVAL=60` 更改间隔
|
||||||
|
|
||||||
### 提供商 (Providers)
|
### 提供商 (Providers)
|
||||||
|
|
||||||
|
|
@ -549,7 +549,7 @@ Agent 读取 HEARTBEAT.md
|
||||||
{
|
{
|
||||||
"agents": {
|
"agents": {
|
||||||
"defaults": {
|
"defaults": {
|
||||||
"workspace": "~/.picoclaw/workspace",
|
"workspace": "~/.clawdroid/workspace",
|
||||||
"model": "glm-4.7",
|
"model": "glm-4.7",
|
||||||
"max_tokens": 8192,
|
"max_tokens": 8192,
|
||||||
"temperature": 0.7,
|
"temperature": 0.7,
|
||||||
|
|
@ -569,7 +569,7 @@ Agent 读取 HEARTBEAT.md
|
||||||
**3. 运行**
|
**3. 运行**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
picoclaw agent -m "你好"
|
clawdroid agent -m "你好"
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -643,23 +643,23 @@ picoclaw agent -m "你好"
|
||||||
|
|
||||||
| 命令 | 描述 |
|
| 命令 | 描述 |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| `picoclaw onboard` | 初始化配置和工作区 |
|
| `clawdroid onboard` | 初始化配置和工作区 |
|
||||||
| `picoclaw agent -m "..."` | 与 Agent 对话 |
|
| `clawdroid agent -m "..."` | 与 Agent 对话 |
|
||||||
| `picoclaw agent` | 交互式聊天模式 |
|
| `clawdroid agent` | 交互式聊天模式 |
|
||||||
| `picoclaw gateway` | 启动网关 (Gateway) |
|
| `clawdroid gateway` | 启动网关 (Gateway) |
|
||||||
| `picoclaw status` | 显示状态 |
|
| `clawdroid status` | 显示状态 |
|
||||||
| `picoclaw cron list` | 列出所有定时任务 |
|
| `clawdroid cron list` | 列出所有定时任务 |
|
||||||
| `picoclaw cron add ...` | 添加定时任务 |
|
| `clawdroid cron add ...` | 添加定时任务 |
|
||||||
|
|
||||||
### 定时任务 / 提醒 (Scheduled Tasks)
|
### 定时任务 / 提醒 (Scheduled Tasks)
|
||||||
|
|
||||||
PicoClaw 通过 `cron` 工具支持定时提醒和重复任务:
|
ClawDroid 通过 `cron` 工具支持定时提醒和重复任务:
|
||||||
|
|
||||||
* **一次性提醒**: "Remind me in 10 minutes" (10分钟后提醒我) → 10分钟后触发一次
|
* **一次性提醒**: "Remind me in 10 minutes" (10分钟后提醒我) → 10分钟后触发一次
|
||||||
* **重复任务**: "Remind me every 2 hours" (每2小时提醒我) → 每2小时触发
|
* **重复任务**: "Remind me every 2 hours" (每2小时提醒我) → 每2小时触发
|
||||||
* **Cron 表达式**: "Remind me at 9am daily" (每天上午9点提醒我) → 使用 cron 表达式
|
* **Cron 表达式**: "Remind me at 9am daily" (每天上午9点提醒我) → 使用 cron 表达式
|
||||||
|
|
||||||
任务存储在 `~/.picoclaw/workspace/cron/` 中并自动处理。
|
任务存储在 `~/.clawdroid/workspace/cron/` 中并自动处理。
|
||||||
|
|
||||||
## 🤝 贡献与路线图 (Roadmap)
|
## 🤝 贡献与路线图 (Roadmap)
|
||||||
|
|
||||||
|
|
@ -673,18 +673,18 @@ PicoClaw 通过 `cron` 工具支持定时提醒和重复任务:
|
||||||
|
|
||||||
Discord: [https://discord.gg/V4sAZ9XWpN](https://discord.gg/V4sAZ9XWpN)
|
Discord: [https://discord.gg/V4sAZ9XWpN](https://discord.gg/V4sAZ9XWpN)
|
||||||
|
|
||||||
<img src="assets/wechat.png" alt="PicoClaw" width="512">
|
<img src="assets/wechat.png" alt="ClawDroid" width="512">
|
||||||
|
|
||||||
## 🐛 疑难解答 (Troubleshooting)
|
## 🐛 疑难解答 (Troubleshooting)
|
||||||
|
|
||||||
### 网络搜索提示 "API 配置问题"
|
### 网络搜索提示 "API 配置问题"
|
||||||
|
|
||||||
如果您尚未配置搜索 API Key,这是正常的。PicoClaw 会提供手动搜索的帮助链接。
|
如果您尚未配置搜索 API Key,这是正常的。ClawDroid 会提供手动搜索的帮助链接。
|
||||||
|
|
||||||
启用网络搜索:
|
启用网络搜索:
|
||||||
|
|
||||||
1. 在 [https://brave.com/search/api](https://brave.com/search/api) 获取免费 API Key (每月 2000 次免费查询)
|
1. 在 [https://brave.com/search/api](https://brave.com/search/api) 获取免费 API Key (每月 2000 次免费查询)
|
||||||
2. 添加到 `~/.picoclaw/config.json`:
|
2. 添加到 `~/.clawdroid/config.json`:
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"tools": {
|
"tools": {
|
||||||
|
|
@ -707,7 +707,7 @@ Discord: [https://discord.gg/V4sAZ9XWpN](https://discord.gg/V4sAZ9XWpN)
|
||||||
|
|
||||||
### Telegram bot 提示 "Conflict: terminated by other getUpdates"
|
### Telegram bot 提示 "Conflict: terminated by other getUpdates"
|
||||||
|
|
||||||
这表示有另一个机器人实例正在运行。请确保同一时间只有一个 `picoclaw gateway` 进程在运行。
|
这表示有另一个机器人实例正在运行。请确保同一时间只有一个 `clawdroid gateway` 进程在运行。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
30
ROADMAP.md
30
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
|
> **Vision**: To build the ultimate lightweight, secure, and fully autonomous AI Agent infrastructure.automate the mundane, unleash your creativity
|
||||||
|
|
||||||
|
|
@ -7,9 +7,9 @@
|
||||||
|
|
||||||
## 🚀 1. Core Optimization: Extreme Lightweight
|
## 🚀 1. Core Optimization: Extreme Lightweight
|
||||||
|
|
||||||
*Our defining characteristic. We fight software bloat to ensure PicoClaw runs smoothly on the smallest embedded devices.*
|
*Our defining characteristic. We fight software bloat to ensure ClawDroid runs smoothly on the smallest embedded devices.*
|
||||||
|
|
||||||
* [**Memory Footprint Reduction**](https://github.com/sipeed/picoclaw/issues/346)
|
* [**Memory Footprint Reduction**](https://github.com/KarakuriAgent/clawdroid/issues/346)
|
||||||
* **Goal**: Run smoothly on 64MB RAM embedded boards (e.g., low-end RISC-V SBCs) with the core process consuming < 20MB.
|
* **Goal**: Run smoothly on 64MB RAM embedded boards (e.g., low-end RISC-V SBCs) with the core process consuming < 20MB.
|
||||||
* **Context**: RAM is expensive and scarce on edge devices. Memory optimization takes precedence over storage size.
|
* **Context**: RAM is expensive and scarce on edge devices. Memory optimization takes precedence over storage size.
|
||||||
* **Action**: Analyze memory growth between releases, remove redundant dependencies, and optimize data structures.
|
* **Action**: Analyze memory growth between releases, remove redundant dependencies, and optimize data structures.
|
||||||
|
|
@ -42,7 +42,7 @@
|
||||||
*Connect every model, reach every platform.*
|
*Connect every model, reach every platform.*
|
||||||
|
|
||||||
* **Provider**
|
* **Provider**
|
||||||
* [**Architecture Upgrade**](https://github.com/sipeed/picoclaw/issues/283): Refactor from "Vendor-based" to "Protocol-based" classification (e.g., OpenAI-compatible, Ollama-compatible). *(Status: In progress by @Daming, ETA 5 days)*
|
* [**Architecture Upgrade**](https://github.com/KarakuriAgent/clawdroid/issues/283): Refactor from "Vendor-based" to "Protocol-based" classification (e.g., OpenAI-compatible, Ollama-compatible). *(Status: In progress by @Daming, ETA 5 days)*
|
||||||
* **Local Models**: Deep integration with **Ollama**, **vLLM**, **LM Studio**, and **Mistral** (local inference).
|
* **Local Models**: Deep integration with **Ollama**, **vLLM**, **LM Studio**, and **Mistral** (local inference).
|
||||||
* **Online Models**: Continued support for frontier closed-source models.
|
* **Online Models**: Continued support for frontier closed-source models.
|
||||||
|
|
||||||
|
|
@ -50,11 +50,11 @@
|
||||||
* **Channel**
|
* **Channel**
|
||||||
* **IM Matrix**: QQ, WeChat (Work), DingTalk, Feishu (Lark), Telegram, Discord, WhatsApp, LINE, Slack, Email, KOOK, Signal, ...
|
* **IM Matrix**: QQ, WeChat (Work), DingTalk, Feishu (Lark), Telegram, Discord, WhatsApp, LINE, Slack, Email, KOOK, Signal, ...
|
||||||
* **Standards**: Support for the **OneBot** protocol.
|
* **Standards**: Support for the **OneBot** protocol.
|
||||||
* [**attachment**](https://github.com/sipeed/picoclaw/issues/348): Native handling of images, audio, and video attachments.
|
* [**attachment**](https://github.com/KarakuriAgent/clawdroid/issues/348): Native handling of images, audio, and video attachments.
|
||||||
|
|
||||||
|
|
||||||
* **Skill Marketplace**
|
* **Skill Marketplace**
|
||||||
* [**Discovery skills**](https://github.com/sipeed/picoclaw/issues/287): Implement `find_skill` to automatically discover and install skills from the [GitHub Skills Repo] or other registries.
|
* [**Discovery skills**](https://github.com/KarakuriAgent/clawdroid/issues/287): Implement `find_skill` to automatically discover and install skills from the [GitHub Skills Repo] or other registries.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -63,16 +63,16 @@
|
||||||
*Beyond conversation—focusing on action and collaboration.*
|
*Beyond conversation—focusing on action and collaboration.*
|
||||||
|
|
||||||
* **Operations**
|
* **Operations**
|
||||||
* [**MCP Support**](https://github.com/sipeed/picoclaw/issues/290): Native support for the **Model Context Protocol (MCP)**.
|
* [**MCP Support**](https://github.com/KarakuriAgent/clawdroid/issues/290): Native support for the **Model Context Protocol (MCP)**.
|
||||||
* [**Browser Automation**](https://github.com/sipeed/picoclaw/issues/293): Headless browser control via CDP (Chrome DevTools Protocol) or ActionBook.
|
* [**Browser Automation**](https://github.com/KarakuriAgent/clawdroid/issues/293): Headless browser control via CDP (Chrome DevTools Protocol) or ActionBook.
|
||||||
* [**Mobile Operation**](https://github.com/sipeed/picoclaw/issues/292): Android device control (similar to BotDrop).
|
* [**Mobile Operation**](https://github.com/KarakuriAgent/clawdroid/issues/292): Android device control (similar to BotDrop).
|
||||||
|
|
||||||
|
|
||||||
* **Multi-Agent Collaboration**
|
* **Multi-Agent Collaboration**
|
||||||
* [**Basic Multi-Agent**](https://github.com/sipeed/picoclaw/issues/294) implement
|
* [**Basic Multi-Agent**](https://github.com/KarakuriAgent/clawdroid/issues/294) implement
|
||||||
* [**Model Routing**](https://github.com/sipeed/picoclaw/issues/295): "Smart Routing" — dispatch simple tasks to small/local models (fast/cheap) and complex tasks to SOTA models (smart).
|
* [**Model Routing**](https://github.com/KarakuriAgent/clawdroid/issues/295): "Smart Routing" — dispatch simple tasks to small/local models (fast/cheap) and complex tasks to SOTA models (smart).
|
||||||
* [**Swarm Mode**](https://github.com/sipeed/picoclaw/issues/284): Collaboration between multiple PicoClaw instances on the same network.
|
* [**Swarm Mode**](https://github.com/KarakuriAgent/clawdroid/issues/284): Collaboration between multiple ClawDroid instances on the same network.
|
||||||
* [**AIEOS**](https://github.com/sipeed/picoclaw/issues/296): Exploring AI-Native Operating System interaction paradigms.
|
* [**AIEOS**](https://github.com/KarakuriAgent/clawdroid/issues/296): Exploring AI-Native Operating System interaction paradigms.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -80,7 +80,7 @@
|
||||||
|
|
||||||
*Lowering the barrier to entry so anyone can deploy in minutes.*
|
*Lowering the barrier to entry so anyone can deploy in minutes.*
|
||||||
|
|
||||||
* [**QuickGuide (Zero-Config Start)**](https://github.com/sipeed/picoclaw/issues/350)
|
* [**QuickGuide (Zero-Config Start)**](https://github.com/KarakuriAgent/clawdroid/issues/350)
|
||||||
* Interactive CLI Wizard: If launched without config, automatically detect the environment and guide the user through Token/Network setup step-by-step.
|
* Interactive CLI Wizard: If launched without config, automatically detect the environment and guide the user through Token/Network setup step-by-step.
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -104,7 +104,7 @@
|
||||||
|
|
||||||
## 🎨 7. Brand & Community
|
## 🎨 7. Brand & Community
|
||||||
|
|
||||||
* [**Logo Design**](https://github.com/sipeed/picoclaw/issues/297): We are looking for a **Mantis Shrimp (Stomatopoda)** logo design!
|
* [**Logo Design**](https://github.com/KarakuriAgent/clawdroid/issues/297): We are looking for a **Mantis Shrimp (Stomatopoda)** logo design!
|
||||||
* *Concept*: Needs to reflect "Small but Mighty" and "Lightning Fast Strikes."
|
* *Concept*: Needs to reflect "Small but Mighty" and "Lightning Fast Strikes."
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,11 +14,11 @@ val keystoreProperties = Properties().apply {
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
namespace = "io.picoclaw.android"
|
namespace = "io.clawdroid"
|
||||||
compileSdk = libs.versions.android.compileSdk.get().toInt()
|
compileSdk = libs.versions.android.compileSdk.get().toInt()
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId = "io.picoclaw.android"
|
applicationId = "io.clawdroid"
|
||||||
minSdk = libs.versions.android.minSdk.get().toInt()
|
minSdk = libs.versions.android.minSdk.get().toInt()
|
||||||
targetSdk = libs.versions.android.targetSdk.get().toInt()
|
targetSdk = libs.versions.android.targetSdk.get().toInt()
|
||||||
versionCode = 1
|
versionCode = 1
|
||||||
|
|
|
||||||
10
android/app/proguard-rules.pro
vendored
10
android/app/proguard-rules.pro
vendored
|
|
@ -12,24 +12,24 @@
|
||||||
*** INSTANCE;
|
*** INSTANCE;
|
||||||
kotlinx.serialization.KSerializer serializer(...);
|
kotlinx.serialization.KSerializer serializer(...);
|
||||||
}
|
}
|
||||||
-keepclasseswithmembers class io.picoclaw.android.** {
|
-keepclasseswithmembers class io.clawdroid.** {
|
||||||
kotlinx.serialization.KSerializer serializer(...);
|
kotlinx.serialization.KSerializer serializer(...);
|
||||||
}
|
}
|
||||||
|
|
||||||
# Keep generated $$serializer classes
|
# Keep generated $$serializer classes
|
||||||
-keepclassmembers class io.picoclaw.android.**$$serializer {
|
-keepclassmembers class io.clawdroid.**$$serializer {
|
||||||
*** INSTANCE;
|
*** INSTANCE;
|
||||||
*;
|
*;
|
||||||
}
|
}
|
||||||
|
|
||||||
# Keep private ImageEntry used via Json.decodeFromString in MessageMapper
|
# Keep private ImageEntry used via Json.decodeFromString in MessageMapper
|
||||||
-keep class io.picoclaw.android.core.data.mapper.ImageEntry { *; }
|
-keep class io.clawdroid.core.data.mapper.ImageEntry { *; }
|
||||||
|
|
||||||
# ========================
|
# ========================
|
||||||
# Enums stored as strings in Room DB
|
# Enums stored as strings in Room DB
|
||||||
# ========================
|
# ========================
|
||||||
-keepclassmembers enum io.picoclaw.android.core.domain.model.MessageSender { *; }
|
-keepclassmembers enum io.clawdroid.core.domain.model.MessageSender { *; }
|
||||||
-keepclassmembers enum io.picoclaw.android.core.domain.model.MessageStatus { *; }
|
-keepclassmembers enum io.clawdroid.core.domain.model.MessageStatus { *; }
|
||||||
|
|
||||||
# ========================
|
# ========================
|
||||||
# Ktor
|
# Ktor
|
||||||
|
|
|
||||||
|
|
@ -19,13 +19,13 @@
|
||||||
</queries>
|
</queries>
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:name=".PicoClawApp"
|
android:name=".ClawDroidApp"
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:networkSecurityConfig="@xml/network_security_config"
|
android:networkSecurityConfig="@xml/network_security_config"
|
||||||
android:supportsRtl="true"
|
android:supportsRtl="true"
|
||||||
android:theme="@style/Theme.PicoClaw">
|
android:theme="@style/Theme.ClawDroid">
|
||||||
<provider
|
<provider
|
||||||
android:name="androidx.core.content.FileProvider"
|
android:name="androidx.core.content.FileProvider"
|
||||||
android:authorities="${applicationId}.fileprovider"
|
android:authorities="${applicationId}.fileprovider"
|
||||||
|
|
@ -39,7 +39,7 @@
|
||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:theme="@style/Theme.PicoClaw">
|
android:theme="@style/Theme.ClawDroid">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
|
@ -50,7 +50,7 @@
|
||||||
android:name=".receiver.AgentMessageReceiver"
|
android:name=".receiver.AgentMessageReceiver"
|
||||||
android:exported="true">
|
android:exported="true">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="io.picoclaw.android.AGENT_MESSAGE" />
|
<action android:name="io.clawdroid.AGENT_MESSAGE" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</receiver>
|
</receiver>
|
||||||
|
|
||||||
|
|
@ -84,7 +84,7 @@
|
||||||
android:value="AI voice assistant overlay for real-time conversation" />
|
android:value="AI voice assistant overlay for real-time conversation" />
|
||||||
</service>
|
</service>
|
||||||
<service
|
<service
|
||||||
android:name=".assistant.PicoClawAccessibilityService"
|
android:name=".assistant.ClawDroidAccessibilityService"
|
||||||
android:exported="false"
|
android:exported="false"
|
||||||
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
|
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,16 @@
|
||||||
package io.picoclaw.android
|
package io.clawdroid
|
||||||
|
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import io.picoclaw.android.di.appModule
|
import io.clawdroid.di.appModule
|
||||||
import io.picoclaw.android.receiver.NotificationHelper
|
import io.clawdroid.receiver.NotificationHelper
|
||||||
import org.koin.android.ext.koin.androidContext
|
import org.koin.android.ext.koin.androidContext
|
||||||
import org.koin.core.context.startKoin
|
import org.koin.core.context.startKoin
|
||||||
|
|
||||||
class PicoClawApp : Application() {
|
class ClawDroidApp : Application() {
|
||||||
override fun onCreate() {
|
override fun onCreate() {
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
startKoin {
|
startKoin {
|
||||||
androidContext(this@PicoClawApp)
|
androidContext(this@ClawDroidApp)
|
||||||
modules(appModule)
|
modules(appModule)
|
||||||
}
|
}
|
||||||
NotificationHelper.createNotificationChannel(this)
|
NotificationHelper.createNotificationChannel(this)
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android
|
package io.clawdroid
|
||||||
|
|
||||||
import android.Manifest
|
import android.Manifest
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
|
|
@ -12,10 +12,10 @@ import androidx.core.content.ContextCompat
|
||||||
import androidx.navigation.compose.NavHost
|
import androidx.navigation.compose.NavHost
|
||||||
import androidx.navigation.compose.composable
|
import androidx.navigation.compose.composable
|
||||||
import androidx.navigation.compose.rememberNavController
|
import androidx.navigation.compose.rememberNavController
|
||||||
import io.picoclaw.android.core.ui.theme.PicoClawTheme
|
import io.clawdroid.core.ui.theme.ClawDroidTheme
|
||||||
import io.picoclaw.android.feature.chat.screen.ChatScreen
|
import io.clawdroid.feature.chat.screen.ChatScreen
|
||||||
import io.picoclaw.android.feature.chat.screen.SettingsScreen
|
import io.clawdroid.feature.chat.screen.SettingsScreen
|
||||||
import io.picoclaw.android.navigation.NavRoutes
|
import io.clawdroid.navigation.NavRoutes
|
||||||
|
|
||||||
class MainActivity : ComponentActivity() {
|
class MainActivity : ComponentActivity() {
|
||||||
|
|
||||||
|
|
@ -28,7 +28,7 @@ class MainActivity : ComponentActivity() {
|
||||||
requestNotificationPermissionIfNeeded()
|
requestNotificationPermissionIfNeeded()
|
||||||
enableEdgeToEdge()
|
enableEdgeToEdge()
|
||||||
setContent {
|
setContent {
|
||||||
PicoClawTheme {
|
ClawDroidTheme {
|
||||||
val navController = rememberNavController()
|
val navController = rememberNavController()
|
||||||
NavHost(navController = navController, startDestination = NavRoutes.CHAT) {
|
NavHost(navController = navController, startDestination = NavRoutes.CHAT) {
|
||||||
composable(NavRoutes.CHAT) {
|
composable(NavRoutes.CHAT) {
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android
|
package io.clawdroid
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
|
@ -49,7 +49,7 @@ class PermissionRequestActivity : ComponentActivity() {
|
||||||
companion object {
|
companion object {
|
||||||
const val EXTRA_PERMISSION = "permission"
|
const val EXTRA_PERMISSION = "permission"
|
||||||
const val EXTRA_GRANTED = "granted"
|
const val EXTRA_GRANTED = "granted"
|
||||||
const val ACTION_RESULT = "io.picoclaw.android.PERMISSION_RESULT"
|
const val ACTION_RESULT = "io.clawdroid.PERMISSION_RESULT"
|
||||||
|
|
||||||
fun intent(context: Context, permission: String): Intent =
|
fun intent(context: Context, permission: String): Intent =
|
||||||
Intent(context, PermissionRequestActivity::class.java)
|
Intent(context, PermissionRequestActivity::class.java)
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
package io.picoclaw.android.assistant
|
package io.clawdroid.assistant
|
||||||
|
|
||||||
import android.accessibilityservice.AccessibilityService
|
import android.accessibilityservice.AccessibilityService
|
||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.view.Display
|
import android.view.Display
|
||||||
import io.picoclaw.android.feature.chat.voice.ScreenshotSource
|
import io.clawdroid.feature.chat.voice.ScreenshotSource
|
||||||
import kotlinx.coroutines.suspendCancellableCoroutine
|
import kotlinx.coroutines.suspendCancellableCoroutine
|
||||||
import kotlin.coroutines.resume
|
import kotlin.coroutines.resume
|
||||||
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.assistant
|
package io.clawdroid.assistant
|
||||||
|
|
||||||
import android.Manifest
|
import android.Manifest
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.assistant
|
package io.clawdroid.assistant
|
||||||
|
|
||||||
import android.Manifest
|
import android.Manifest
|
||||||
import android.app.Notification
|
import android.app.Notification
|
||||||
|
|
@ -50,20 +50,20 @@ import androidx.savedstate.SavedStateRegistryController
|
||||||
import androidx.savedstate.SavedStateRegistryOwner
|
import androidx.savedstate.SavedStateRegistryOwner
|
||||||
import androidx.savedstate.setViewTreeSavedStateRegistryOwner
|
import androidx.savedstate.setViewTreeSavedStateRegistryOwner
|
||||||
import io.ktor.client.HttpClient
|
import io.ktor.client.HttpClient
|
||||||
import io.picoclaw.android.PermissionRequestActivity
|
import io.clawdroid.PermissionRequestActivity
|
||||||
import io.picoclaw.android.core.data.remote.WebSocketClient
|
import io.clawdroid.core.data.remote.WebSocketClient
|
||||||
import io.picoclaw.android.core.data.repository.AssistantConnectionImpl
|
import io.clawdroid.core.data.repository.AssistantConnectionImpl
|
||||||
import io.picoclaw.android.core.domain.repository.AssistantConnection
|
import io.clawdroid.core.domain.repository.AssistantConnection
|
||||||
import io.picoclaw.android.core.domain.repository.TtsSettingsRepository
|
import io.clawdroid.core.domain.repository.TtsSettingsRepository
|
||||||
import io.picoclaw.android.core.ui.theme.PicoClawTheme
|
import io.clawdroid.core.ui.theme.ClawDroidTheme
|
||||||
import io.picoclaw.android.feature.chat.assistant.AssistantManager
|
import io.clawdroid.feature.chat.assistant.AssistantManager
|
||||||
import io.picoclaw.android.feature.chat.assistant.AssistantPillBar
|
import io.clawdroid.feature.chat.assistant.AssistantPillBar
|
||||||
import io.picoclaw.android.feature.chat.voice.CameraCaptureManager
|
import io.clawdroid.feature.chat.voice.CameraCaptureManager
|
||||||
import io.picoclaw.android.feature.chat.voice.ScreenCaptureManager
|
import io.clawdroid.feature.chat.voice.ScreenCaptureManager
|
||||||
import io.picoclaw.android.feature.chat.voice.ScreenshotSource
|
import io.clawdroid.feature.chat.voice.ScreenshotSource
|
||||||
import io.picoclaw.android.feature.chat.voice.SpeechRecognizerWrapper
|
import io.clawdroid.feature.chat.voice.SpeechRecognizerWrapper
|
||||||
import io.picoclaw.android.feature.chat.voice.TextToSpeechWrapper
|
import io.clawdroid.feature.chat.voice.TextToSpeechWrapper
|
||||||
import io.picoclaw.android.receiver.NotificationHelper
|
import io.clawdroid.receiver.NotificationHelper
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.SupervisorJob
|
import kotlinx.coroutines.SupervisorJob
|
||||||
|
|
@ -297,7 +297,7 @@ class AssistantService : LifecycleService(), SavedStateRegistryOwner {
|
||||||
|
|
||||||
ComposeView(this).apply {
|
ComposeView(this).apply {
|
||||||
setContent {
|
setContent {
|
||||||
PicoClawTheme {
|
ClawDroidTheme {
|
||||||
val state by assistantManager.state.collectAsState()
|
val state by assistantManager.state.collectAsState()
|
||||||
Box(
|
Box(
|
||||||
modifier = Modifier.fillMaxSize(),
|
modifier = Modifier.fillMaxSize(),
|
||||||
|
|
@ -348,7 +348,7 @@ class AssistantService : LifecycleService(), SavedStateRegistryOwner {
|
||||||
)
|
)
|
||||||
Text(
|
Text(
|
||||||
text = "画面キャプチャを使用するには、ユーザー補助の設定で" +
|
text = "画面キャプチャを使用するには、ユーザー補助の設定で" +
|
||||||
" PicoClaw を有効にしてください。\n\n" +
|
" ClawDroid を有効にしてください。\n\n" +
|
||||||
"有効にできない場合は、アプリ情報から" +
|
"有効にできない場合は、アプリ情報から" +
|
||||||
"「制限付き設定を許可」を実行してから" +
|
"「制限付き設定を許可」を実行してから" +
|
||||||
"再度お試しください。",
|
"再度お試しください。",
|
||||||
|
|
@ -410,7 +410,7 @@ class AssistantService : LifecycleService(), SavedStateRegistryOwner {
|
||||||
private fun buildNotification(): Notification {
|
private fun buildNotification(): Notification {
|
||||||
return NotificationCompat.Builder(this, NotificationHelper.ASSISTANT_CHANNEL_ID)
|
return NotificationCompat.Builder(this, NotificationHelper.ASSISTANT_CHANNEL_ID)
|
||||||
.setSmallIcon(android.R.drawable.ic_btn_speak_now)
|
.setSmallIcon(android.R.drawable.ic_btn_speak_now)
|
||||||
.setContentTitle("PicoClaw Assistant")
|
.setContentTitle("ClawDroid Assistant")
|
||||||
.setContentText("Listening...")
|
.setContentText("Listening...")
|
||||||
.setPriority(NotificationCompat.PRIORITY_LOW)
|
.setPriority(NotificationCompat.PRIORITY_LOW)
|
||||||
.setOngoing(true)
|
.setOngoing(true)
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
package io.picoclaw.android.assistant
|
package io.clawdroid.assistant
|
||||||
|
|
||||||
import android.accessibilityservice.AccessibilityService
|
import android.accessibilityservice.AccessibilityService
|
||||||
import android.view.accessibility.AccessibilityEvent
|
import android.view.accessibility.AccessibilityEvent
|
||||||
import org.koin.android.ext.android.inject
|
import org.koin.android.ext.android.inject
|
||||||
|
|
||||||
class PicoClawAccessibilityService : AccessibilityService() {
|
class ClawDroidAccessibilityService : AccessibilityService() {
|
||||||
|
|
||||||
private val screenshotSource: AccessibilityScreenshotSource by inject()
|
private val screenshotSource: AccessibilityScreenshotSource by inject()
|
||||||
private val deviceController: DeviceController by inject()
|
private val deviceController: DeviceController by inject()
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.assistant
|
package io.clawdroid.assistant
|
||||||
|
|
||||||
import android.accessibilityservice.AccessibilityService
|
import android.accessibilityservice.AccessibilityService
|
||||||
import android.accessibilityservice.GestureDescription
|
import android.accessibilityservice.GestureDescription
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.assistant
|
package io.clawdroid.assistant
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
|
@ -11,9 +11,9 @@ import android.os.Build
|
||||||
import android.util.Base64
|
import android.util.Base64
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.view.accessibility.AccessibilityNodeInfo
|
import android.view.accessibility.AccessibilityNodeInfo
|
||||||
import io.picoclaw.android.core.data.remote.dto.ToolRequest
|
import io.clawdroid.core.data.remote.dto.ToolRequest
|
||||||
import io.picoclaw.android.core.data.remote.dto.ToolResponse
|
import io.clawdroid.core.data.remote.dto.ToolResponse
|
||||||
import io.picoclaw.android.feature.chat.voice.ScreenshotSource
|
import io.clawdroid.feature.chat.voice.ScreenshotSource
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
|
|
@ -1,35 +1,35 @@
|
||||||
package io.picoclaw.android.di
|
package io.clawdroid.di
|
||||||
|
|
||||||
import androidx.room.Room
|
import androidx.room.Room
|
||||||
import io.ktor.client.HttpClient
|
import io.ktor.client.HttpClient
|
||||||
import io.ktor.client.engine.okhttp.OkHttp
|
import io.ktor.client.engine.okhttp.OkHttp
|
||||||
import io.ktor.client.plugins.websocket.WebSockets
|
import io.ktor.client.plugins.websocket.WebSockets
|
||||||
import io.picoclaw.android.core.data.local.AppDatabase
|
import io.clawdroid.core.data.local.AppDatabase
|
||||||
import io.picoclaw.android.assistant.AccessibilityScreenshotSource
|
import io.clawdroid.assistant.AccessibilityScreenshotSource
|
||||||
import io.picoclaw.android.assistant.DeviceController
|
import io.clawdroid.assistant.DeviceController
|
||||||
import io.picoclaw.android.core.data.local.ImageFileStorage
|
import io.clawdroid.core.data.local.ImageFileStorage
|
||||||
import io.picoclaw.android.feature.chat.voice.ScreenshotSource
|
import io.clawdroid.feature.chat.voice.ScreenshotSource
|
||||||
import io.picoclaw.android.core.data.remote.WebSocketClient
|
import io.clawdroid.core.data.remote.WebSocketClient
|
||||||
import io.picoclaw.android.assistant.ToolRequestHandler
|
import io.clawdroid.assistant.ToolRequestHandler
|
||||||
import io.picoclaw.android.core.data.repository.ChatRepositoryImpl
|
import io.clawdroid.core.data.repository.ChatRepositoryImpl
|
||||||
import io.picoclaw.android.core.data.repository.TtsCatalogRepositoryImpl
|
import io.clawdroid.core.data.repository.TtsCatalogRepositoryImpl
|
||||||
import io.picoclaw.android.core.data.repository.TtsSettingsRepositoryImpl
|
import io.clawdroid.core.data.repository.TtsSettingsRepositoryImpl
|
||||||
import io.picoclaw.android.core.domain.repository.ChatRepository
|
import io.clawdroid.core.domain.repository.ChatRepository
|
||||||
import io.picoclaw.android.core.domain.repository.TtsCatalogRepository
|
import io.clawdroid.core.domain.repository.TtsCatalogRepository
|
||||||
import io.picoclaw.android.core.domain.repository.TtsSettingsRepository
|
import io.clawdroid.core.domain.repository.TtsSettingsRepository
|
||||||
import io.picoclaw.android.core.domain.usecase.ConnectChatUseCase
|
import io.clawdroid.core.domain.usecase.ConnectChatUseCase
|
||||||
import io.picoclaw.android.core.domain.usecase.DisconnectChatUseCase
|
import io.clawdroid.core.domain.usecase.DisconnectChatUseCase
|
||||||
import io.picoclaw.android.core.domain.usecase.LoadMoreMessagesUseCase
|
import io.clawdroid.core.domain.usecase.LoadMoreMessagesUseCase
|
||||||
import io.picoclaw.android.core.domain.usecase.ObserveConnectionUseCase
|
import io.clawdroid.core.domain.usecase.ObserveConnectionUseCase
|
||||||
import io.picoclaw.android.core.domain.usecase.ObserveMessagesUseCase
|
import io.clawdroid.core.domain.usecase.ObserveMessagesUseCase
|
||||||
import io.picoclaw.android.core.domain.usecase.ObserveStatusUseCase
|
import io.clawdroid.core.domain.usecase.ObserveStatusUseCase
|
||||||
import io.picoclaw.android.core.domain.usecase.SendMessageUseCase
|
import io.clawdroid.core.domain.usecase.SendMessageUseCase
|
||||||
import io.picoclaw.android.feature.chat.ChatViewModel
|
import io.clawdroid.feature.chat.ChatViewModel
|
||||||
import io.picoclaw.android.feature.chat.SettingsViewModel
|
import io.clawdroid.feature.chat.SettingsViewModel
|
||||||
import io.picoclaw.android.feature.chat.voice.SpeechRecognizerWrapper
|
import io.clawdroid.feature.chat.voice.SpeechRecognizerWrapper
|
||||||
import io.picoclaw.android.feature.chat.voice.TextToSpeechWrapper
|
import io.clawdroid.feature.chat.voice.TextToSpeechWrapper
|
||||||
import io.picoclaw.android.feature.chat.voice.CameraCaptureManager
|
import io.clawdroid.feature.chat.voice.CameraCaptureManager
|
||||||
import io.picoclaw.android.feature.chat.voice.VoiceModeManager
|
import io.clawdroid.feature.chat.voice.VoiceModeManager
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.SupervisorJob
|
import kotlinx.coroutines.SupervisorJob
|
||||||
|
|
@ -49,7 +49,7 @@ val appModule = module {
|
||||||
Room.databaseBuilder(
|
Room.databaseBuilder(
|
||||||
androidContext(),
|
androidContext(),
|
||||||
AppDatabase::class.java,
|
AppDatabase::class.java,
|
||||||
"picoclaw.db"
|
"clawdroid.db"
|
||||||
).fallbackToDestructiveMigration(dropAllTables = true).build()
|
).fallbackToDestructiveMigration(dropAllTables = true).build()
|
||||||
}
|
}
|
||||||
single { get<AppDatabase>().messageDao() }
|
single { get<AppDatabase>().messageDao() }
|
||||||
|
|
@ -68,7 +68,7 @@ val appModule = module {
|
||||||
|
|
||||||
// WebSocketClient
|
// WebSocketClient
|
||||||
single {
|
single {
|
||||||
val prefs = androidContext().getSharedPreferences("picoclaw", android.content.Context.MODE_PRIVATE)
|
val prefs = androidContext().getSharedPreferences("clawdroid", android.content.Context.MODE_PRIVATE)
|
||||||
val clientId = prefs.getString("client_id", null) ?: UUID.randomUUID().toString().also {
|
val clientId = prefs.getString("client_id", null) ?: UUID.randomUUID().toString().also {
|
||||||
prefs.edit().putString("client_id", it).apply()
|
prefs.edit().putString("client_id", it).apply()
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.navigation
|
package io.clawdroid.navigation
|
||||||
|
|
||||||
object NavRoutes {
|
object NavRoutes {
|
||||||
const val CHAT = "chat"
|
const val CHAT = "chat"
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
package io.picoclaw.android.receiver
|
package io.clawdroid.receiver
|
||||||
|
|
||||||
import android.content.BroadcastReceiver
|
import android.content.BroadcastReceiver
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import io.picoclaw.android.core.data.local.dao.MessageDao
|
import io.clawdroid.core.data.local.dao.MessageDao
|
||||||
import io.picoclaw.android.core.data.mapper.MessageMapper
|
import io.clawdroid.core.data.mapper.MessageMapper
|
||||||
import io.picoclaw.android.core.data.remote.dto.WsOutgoing
|
import io.clawdroid.core.data.remote.dto.WsOutgoing
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.serialization.json.Json
|
import kotlinx.serialization.json.Json
|
||||||
|
|
@ -57,6 +57,6 @@ class AgentMessageReceiver : BroadcastReceiver(), KoinComponent {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val TAG = "AgentMessageReceiver"
|
private const val TAG = "AgentMessageReceiver"
|
||||||
const val ACTION = "io.picoclaw.android.AGENT_MESSAGE"
|
const val ACTION = "io.clawdroid.AGENT_MESSAGE"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.receiver
|
package io.clawdroid.receiver
|
||||||
|
|
||||||
import android.app.NotificationChannel
|
import android.app.NotificationChannel
|
||||||
import android.app.NotificationManager
|
import android.app.NotificationManager
|
||||||
|
|
@ -8,11 +8,11 @@ import androidx.core.app.NotificationCompat
|
||||||
|
|
||||||
object NotificationHelper {
|
object NotificationHelper {
|
||||||
|
|
||||||
private const val CHANNEL_ID = "picoclaw_messages"
|
private const val CHANNEL_ID = "clawdroid_messages"
|
||||||
private const val CHANNEL_NAME = "Agent Messages"
|
private const val CHANNEL_NAME = "Agent Messages"
|
||||||
private const val NOTIFICATION_ID = 1001
|
private const val NOTIFICATION_ID = 1001
|
||||||
|
|
||||||
const val ASSISTANT_CHANNEL_ID = "picoclaw_assistant"
|
const val ASSISTANT_CHANNEL_ID = "clawdroid_assistant"
|
||||||
private const val ASSISTANT_CHANNEL_NAME = "Assistant"
|
private const val ASSISTANT_CHANNEL_NAME = "Assistant"
|
||||||
|
|
||||||
fun createNotificationChannel(context: Context) {
|
fun createNotificationChannel(context: Context) {
|
||||||
|
|
@ -23,7 +23,7 @@ object NotificationHelper {
|
||||||
CHANNEL_NAME,
|
CHANNEL_NAME,
|
||||||
NotificationManager.IMPORTANCE_DEFAULT
|
NotificationManager.IMPORTANCE_DEFAULT
|
||||||
).apply {
|
).apply {
|
||||||
description = "Messages from PicoClaw agent"
|
description = "Messages from ClawDroid agent"
|
||||||
}
|
}
|
||||||
manager.createNotificationChannel(messageChannel)
|
manager.createNotificationChannel(messageChannel)
|
||||||
|
|
||||||
|
|
@ -47,7 +47,7 @@ object NotificationHelper {
|
||||||
|
|
||||||
val notification = NotificationCompat.Builder(context, CHANNEL_ID)
|
val notification = NotificationCompat.Builder(context, CHANNEL_ID)
|
||||||
.setSmallIcon(android.R.drawable.ic_dialog_info)
|
.setSmallIcon(android.R.drawable.ic_dialog_info)
|
||||||
.setContentTitle("PicoClaw")
|
.setContentTitle("ClawDroid")
|
||||||
.setContentText(content.take(200))
|
.setContentText(content.take(200))
|
||||||
.setStyle(NotificationCompat.BigTextStyle().bigText(content.take(1000)))
|
.setStyle(NotificationCompat.BigTextStyle().bigText(content.take(1000)))
|
||||||
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
|
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">PicoClaw</string>
|
<string name="app_name">ClawDroid</string>
|
||||||
<string name="accessibility_service_description">Allows PicoClaw to capture screenshots during voice assistant conversations.</string>
|
<string name="accessibility_service_description">Allows ClawDroid to capture screenshots during voice assistant conversations.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<style name="Theme.PicoClaw" parent="android:Theme.Material.NoActionBar">
|
<style name="Theme.ClawDroid" parent="android:Theme.Material.NoActionBar">
|
||||||
<item name="android:windowBackground">#FF050510</item>
|
<item name="android:windowBackground">#FF050510</item>
|
||||||
</style>
|
</style>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ plugins {
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
namespace = "io.picoclaw.android.core.data"
|
namespace = "io.clawdroid.core.data"
|
||||||
compileSdk = libs.versions.android.compileSdk.get().toInt()
|
compileSdk = libs.versions.android.compileSdk.get().toInt()
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
package io.picoclaw.android.core.data.local
|
package io.clawdroid.core.data.local
|
||||||
|
|
||||||
import androidx.room.Database
|
import androidx.room.Database
|
||||||
import androidx.room.RoomDatabase
|
import androidx.room.RoomDatabase
|
||||||
import androidx.room.TypeConverters
|
import androidx.room.TypeConverters
|
||||||
import io.picoclaw.android.core.data.local.converter.Converters
|
import io.clawdroid.core.data.local.converter.Converters
|
||||||
import io.picoclaw.android.core.data.local.dao.MessageDao
|
import io.clawdroid.core.data.local.dao.MessageDao
|
||||||
import io.picoclaw.android.core.data.local.entity.MessageEntity
|
import io.clawdroid.core.data.local.entity.MessageEntity
|
||||||
|
|
||||||
@Database(entities = [MessageEntity::class], version = 1, exportSchema = false)
|
@Database(entities = [MessageEntity::class], version = 1, exportSchema = false)
|
||||||
@TypeConverters(Converters::class)
|
@TypeConverters(Converters::class)
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
package io.picoclaw.android.core.data.local
|
package io.clawdroid.core.data.local
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.graphics.BitmapFactory
|
import android.graphics.BitmapFactory
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.util.Base64
|
import android.util.Base64
|
||||||
import io.picoclaw.android.core.domain.model.ImageData
|
import io.clawdroid.core.domain.model.ImageData
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.core.data.local.converter
|
package io.clawdroid.core.data.local.converter
|
||||||
|
|
||||||
import androidx.room.TypeConverter
|
import androidx.room.TypeConverter
|
||||||
import kotlinx.serialization.encodeToString
|
import kotlinx.serialization.encodeToString
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
package io.picoclaw.android.core.data.local.dao
|
package io.clawdroid.core.data.local.dao
|
||||||
|
|
||||||
import androidx.room.Dao
|
import androidx.room.Dao
|
||||||
import androidx.room.Insert
|
import androidx.room.Insert
|
||||||
import androidx.room.OnConflictStrategy
|
import androidx.room.OnConflictStrategy
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
import androidx.room.Update
|
import androidx.room.Update
|
||||||
import io.picoclaw.android.core.data.local.entity.MessageEntity
|
import io.clawdroid.core.data.local.entity.MessageEntity
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
|
||||||
@Dao
|
@Dao
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.core.data.local.entity
|
package io.clawdroid.core.data.local.entity
|
||||||
|
|
||||||
import androidx.room.Entity
|
import androidx.room.Entity
|
||||||
import androidx.room.PrimaryKey
|
import androidx.room.PrimaryKey
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
package io.picoclaw.android.core.data.mapper
|
package io.clawdroid.core.data.mapper
|
||||||
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import io.picoclaw.android.core.data.local.entity.MessageEntity
|
import io.clawdroid.core.data.local.entity.MessageEntity
|
||||||
import io.picoclaw.android.core.data.remote.dto.WsIncoming
|
import io.clawdroid.core.data.remote.dto.WsIncoming
|
||||||
import io.picoclaw.android.core.data.remote.dto.WsOutgoing
|
import io.clawdroid.core.data.remote.dto.WsOutgoing
|
||||||
import io.picoclaw.android.core.domain.model.ChatMessage
|
import io.clawdroid.core.domain.model.ChatMessage
|
||||||
import io.picoclaw.android.core.domain.model.ImageData
|
import io.clawdroid.core.domain.model.ImageData
|
||||||
import io.picoclaw.android.core.domain.model.MessageSender
|
import io.clawdroid.core.domain.model.MessageSender
|
||||||
import io.picoclaw.android.core.domain.model.MessageStatus
|
import io.clawdroid.core.domain.model.MessageStatus
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
import kotlinx.serialization.encodeToString
|
import kotlinx.serialization.encodeToString
|
||||||
import kotlinx.serialization.json.Json
|
import kotlinx.serialization.json.Json
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.core.data.remote
|
package io.clawdroid.core.data.remote
|
||||||
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import io.ktor.client.HttpClient
|
import io.ktor.client.HttpClient
|
||||||
|
|
@ -6,9 +6,9 @@ import io.ktor.client.plugins.websocket.webSocket
|
||||||
import io.ktor.websocket.Frame
|
import io.ktor.websocket.Frame
|
||||||
import io.ktor.websocket.WebSocketSession
|
import io.ktor.websocket.WebSocketSession
|
||||||
import io.ktor.websocket.readText
|
import io.ktor.websocket.readText
|
||||||
import io.picoclaw.android.core.data.remote.dto.WsIncoming
|
import io.clawdroid.core.data.remote.dto.WsIncoming
|
||||||
import io.picoclaw.android.core.data.remote.dto.WsOutgoing
|
import io.clawdroid.core.data.remote.dto.WsOutgoing
|
||||||
import io.picoclaw.android.core.domain.model.ConnectionState
|
import io.clawdroid.core.domain.model.ConnectionState
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.core.data.remote.dto
|
package io.clawdroid.core.data.remote.dto
|
||||||
|
|
||||||
import kotlinx.serialization.SerialName
|
import kotlinx.serialization.SerialName
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.core.data.remote.dto
|
package io.clawdroid.core.data.remote.dto
|
||||||
|
|
||||||
import kotlinx.serialization.SerialName
|
import kotlinx.serialization.SerialName
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.core.data.remote.dto
|
package io.clawdroid.core.data.remote.dto
|
||||||
|
|
||||||
import kotlinx.serialization.SerialName
|
import kotlinx.serialization.SerialName
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.core.data.remote.dto
|
package io.clawdroid.core.data.remote.dto
|
||||||
|
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
package io.picoclaw.android.core.data.repository
|
package io.clawdroid.core.data.repository
|
||||||
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import io.ktor.client.HttpClient
|
import io.ktor.client.HttpClient
|
||||||
import io.picoclaw.android.core.data.remote.WebSocketClient
|
import io.clawdroid.core.data.remote.WebSocketClient
|
||||||
import io.picoclaw.android.core.data.remote.dto.ToolRequest
|
import io.clawdroid.core.data.remote.dto.ToolRequest
|
||||||
import io.picoclaw.android.core.data.remote.dto.WsIncoming
|
import io.clawdroid.core.data.remote.dto.WsIncoming
|
||||||
import io.picoclaw.android.core.domain.model.AssistantMessage
|
import io.clawdroid.core.domain.model.AssistantMessage
|
||||||
import io.picoclaw.android.core.domain.model.ConnectionState
|
import io.clawdroid.core.domain.model.ConnectionState
|
||||||
import io.picoclaw.android.core.domain.repository.AssistantConnection
|
import io.clawdroid.core.domain.repository.AssistantConnection
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.SupervisorJob
|
import kotlinx.coroutines.SupervisorJob
|
||||||
|
|
@ -1,17 +1,17 @@
|
||||||
package io.picoclaw.android.core.data.repository
|
package io.clawdroid.core.data.repository
|
||||||
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import io.picoclaw.android.core.data.local.ImageFileStorage
|
import io.clawdroid.core.data.local.ImageFileStorage
|
||||||
import io.picoclaw.android.core.data.local.dao.MessageDao
|
import io.clawdroid.core.data.local.dao.MessageDao
|
||||||
import io.picoclaw.android.core.data.mapper.MessageMapper
|
import io.clawdroid.core.data.mapper.MessageMapper
|
||||||
import io.picoclaw.android.core.data.remote.WebSocketClient
|
import io.clawdroid.core.data.remote.WebSocketClient
|
||||||
import io.picoclaw.android.core.data.remote.dto.ToolRequest
|
import io.clawdroid.core.data.remote.dto.ToolRequest
|
||||||
import io.picoclaw.android.core.data.remote.dto.WsIncoming
|
import io.clawdroid.core.data.remote.dto.WsIncoming
|
||||||
import io.picoclaw.android.core.domain.model.ChatMessage
|
import io.clawdroid.core.domain.model.ChatMessage
|
||||||
import io.picoclaw.android.core.domain.model.ConnectionState
|
import io.clawdroid.core.domain.model.ConnectionState
|
||||||
import io.picoclaw.android.core.domain.model.ImageAttachment
|
import io.clawdroid.core.domain.model.ImageAttachment
|
||||||
import io.picoclaw.android.core.domain.model.MessageStatus
|
import io.clawdroid.core.domain.model.MessageStatus
|
||||||
import io.picoclaw.android.core.domain.repository.ChatRepository
|
import io.clawdroid.core.domain.repository.ChatRepository
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlinx.coroutines.flow.SharingStarted
|
import kotlinx.coroutines.flow.SharingStarted
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
package io.picoclaw.android.core.data.repository
|
package io.clawdroid.core.data.repository
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.speech.tts.TextToSpeech
|
import android.speech.tts.TextToSpeech
|
||||||
import io.picoclaw.android.core.domain.model.TtsConfig
|
import io.clawdroid.core.domain.model.TtsConfig
|
||||||
import io.picoclaw.android.core.domain.model.TtsEngineInfo
|
import io.clawdroid.core.domain.model.TtsEngineInfo
|
||||||
import io.picoclaw.android.core.domain.model.TtsVoiceInfo
|
import io.clawdroid.core.domain.model.TtsVoiceInfo
|
||||||
import io.picoclaw.android.core.domain.repository.TtsCatalogRepository
|
import io.clawdroid.core.domain.repository.TtsCatalogRepository
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.core.data.repository
|
package io.clawdroid.core.data.repository
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import androidx.datastore.core.DataStore
|
import androidx.datastore.core.DataStore
|
||||||
|
|
@ -7,8 +7,8 @@ import androidx.datastore.preferences.core.edit
|
||||||
import androidx.datastore.preferences.core.floatPreferencesKey
|
import androidx.datastore.preferences.core.floatPreferencesKey
|
||||||
import androidx.datastore.preferences.core.stringPreferencesKey
|
import androidx.datastore.preferences.core.stringPreferencesKey
|
||||||
import androidx.datastore.preferences.preferencesDataStore
|
import androidx.datastore.preferences.preferencesDataStore
|
||||||
import io.picoclaw.android.core.domain.model.TtsConfig
|
import io.clawdroid.core.domain.model.TtsConfig
|
||||||
import io.picoclaw.android.core.domain.repository.TtsSettingsRepository
|
import io.clawdroid.core.domain.repository.TtsSettingsRepository
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.map
|
import kotlinx.coroutines.flow.map
|
||||||
|
|
||||||
|
|
@ -3,7 +3,7 @@ plugins {
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
namespace = "io.picoclaw.android.core.domain"
|
namespace = "io.clawdroid.core.domain"
|
||||||
compileSdk = libs.versions.android.compileSdk.get().toInt()
|
compileSdk = libs.versions.android.compileSdk.get().toInt()
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.core.domain.model
|
package io.clawdroid.core.domain.model
|
||||||
|
|
||||||
data class AssistantMessage(
|
data class AssistantMessage(
|
||||||
val content: String,
|
val content: String,
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.core.domain.model
|
package io.clawdroid.core.domain.model
|
||||||
|
|
||||||
data class ChatMessage(
|
data class ChatMessage(
|
||||||
val id: String,
|
val id: String,
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.core.domain.model
|
package io.clawdroid.core.domain.model
|
||||||
|
|
||||||
enum class ConnectionState {
|
enum class ConnectionState {
|
||||||
DISCONNECTED, CONNECTING, CONNECTED, RECONNECTING
|
DISCONNECTED, CONNECTING, CONNECTED, RECONNECTING
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.core.domain.model
|
package io.clawdroid.core.domain.model
|
||||||
|
|
||||||
data class ImageAttachment(
|
data class ImageAttachment(
|
||||||
val uri: String,
|
val uri: String,
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.core.domain.model
|
package io.clawdroid.core.domain.model
|
||||||
|
|
||||||
data class ImageData(
|
data class ImageData(
|
||||||
val path: String,
|
val path: String,
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.core.domain.model
|
package io.clawdroid.core.domain.model
|
||||||
|
|
||||||
data class TtsConfig(
|
data class TtsConfig(
|
||||||
val enginePackageName: String? = null,
|
val enginePackageName: String? = null,
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.core.domain.model
|
package io.clawdroid.core.domain.model
|
||||||
|
|
||||||
data class TtsEngineInfo(
|
data class TtsEngineInfo(
|
||||||
val packageName: String,
|
val packageName: String,
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.core.domain.model
|
package io.clawdroid.core.domain.model
|
||||||
|
|
||||||
data class TtsVoiceInfo(
|
data class TtsVoiceInfo(
|
||||||
val name: String,
|
val name: String,
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.core.domain.model
|
package io.clawdroid.core.domain.model
|
||||||
|
|
||||||
enum class VoicePhase {
|
enum class VoicePhase {
|
||||||
IDLE, LISTENING, SENDING, THINKING, SPEAKING, ERROR
|
IDLE, LISTENING, SENDING, THINKING, SPEAKING, ERROR
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
package io.picoclaw.android.core.domain.repository
|
package io.clawdroid.core.domain.repository
|
||||||
|
|
||||||
import io.picoclaw.android.core.domain.model.AssistantMessage
|
import io.clawdroid.core.domain.model.AssistantMessage
|
||||||
import io.picoclaw.android.core.domain.model.ConnectionState
|
import io.clawdroid.core.domain.model.ConnectionState
|
||||||
import kotlinx.coroutines.flow.SharedFlow
|
import kotlinx.coroutines.flow.SharedFlow
|
||||||
import kotlinx.coroutines.flow.StateFlow
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
package io.picoclaw.android.core.domain.repository
|
package io.clawdroid.core.domain.repository
|
||||||
|
|
||||||
import io.picoclaw.android.core.domain.model.ChatMessage
|
import io.clawdroid.core.domain.model.ChatMessage
|
||||||
import io.picoclaw.android.core.domain.model.ConnectionState
|
import io.clawdroid.core.domain.model.ConnectionState
|
||||||
import io.picoclaw.android.core.domain.model.ImageAttachment
|
import io.clawdroid.core.domain.model.ImageAttachment
|
||||||
import kotlinx.coroutines.flow.StateFlow
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
|
|
||||||
interface ChatRepository {
|
interface ChatRepository {
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
package io.picoclaw.android.core.domain.repository
|
package io.clawdroid.core.domain.repository
|
||||||
|
|
||||||
import io.picoclaw.android.core.domain.model.TtsEngineInfo
|
import io.clawdroid.core.domain.model.TtsEngineInfo
|
||||||
import io.picoclaw.android.core.domain.model.TtsVoiceInfo
|
import io.clawdroid.core.domain.model.TtsVoiceInfo
|
||||||
import kotlinx.coroutines.flow.StateFlow
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
|
|
||||||
interface TtsCatalogRepository {
|
interface TtsCatalogRepository {
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package io.picoclaw.android.core.domain.repository
|
package io.clawdroid.core.domain.repository
|
||||||
|
|
||||||
import io.picoclaw.android.core.domain.model.TtsConfig
|
import io.clawdroid.core.domain.model.TtsConfig
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
|
||||||
interface TtsSettingsRepository {
|
interface TtsSettingsRepository {
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package io.picoclaw.android.core.domain.usecase
|
package io.clawdroid.core.domain.usecase
|
||||||
|
|
||||||
import io.picoclaw.android.core.domain.repository.ChatRepository
|
import io.clawdroid.core.domain.repository.ChatRepository
|
||||||
|
|
||||||
class ConnectChatUseCase(private val repository: ChatRepository) {
|
class ConnectChatUseCase(private val repository: ChatRepository) {
|
||||||
operator fun invoke() {
|
operator fun invoke() {
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package io.picoclaw.android.core.domain.usecase
|
package io.clawdroid.core.domain.usecase
|
||||||
|
|
||||||
import io.picoclaw.android.core.domain.repository.ChatRepository
|
import io.clawdroid.core.domain.repository.ChatRepository
|
||||||
|
|
||||||
class DisconnectChatUseCase(private val repository: ChatRepository) {
|
class DisconnectChatUseCase(private val repository: ChatRepository) {
|
||||||
operator fun invoke() {
|
operator fun invoke() {
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package io.picoclaw.android.core.domain.usecase
|
package io.clawdroid.core.domain.usecase
|
||||||
|
|
||||||
import io.picoclaw.android.core.domain.repository.ChatRepository
|
import io.clawdroid.core.domain.repository.ChatRepository
|
||||||
|
|
||||||
class LoadMoreMessagesUseCase(private val repository: ChatRepository) {
|
class LoadMoreMessagesUseCase(private val repository: ChatRepository) {
|
||||||
operator fun invoke() {
|
operator fun invoke() {
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
package io.picoclaw.android.core.domain.usecase
|
package io.clawdroid.core.domain.usecase
|
||||||
|
|
||||||
import io.picoclaw.android.core.domain.model.ConnectionState
|
import io.clawdroid.core.domain.model.ConnectionState
|
||||||
import io.picoclaw.android.core.domain.repository.ChatRepository
|
import io.clawdroid.core.domain.repository.ChatRepository
|
||||||
import kotlinx.coroutines.flow.StateFlow
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
|
|
||||||
class ObserveConnectionUseCase(private val repository: ChatRepository) {
|
class ObserveConnectionUseCase(private val repository: ChatRepository) {
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
package io.picoclaw.android.core.domain.usecase
|
package io.clawdroid.core.domain.usecase
|
||||||
|
|
||||||
import io.picoclaw.android.core.domain.model.ChatMessage
|
import io.clawdroid.core.domain.model.ChatMessage
|
||||||
import io.picoclaw.android.core.domain.repository.ChatRepository
|
import io.clawdroid.core.domain.repository.ChatRepository
|
||||||
import kotlinx.coroutines.flow.StateFlow
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
|
|
||||||
class ObserveMessagesUseCase(private val repository: ChatRepository) {
|
class ObserveMessagesUseCase(private val repository: ChatRepository) {
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package io.picoclaw.android.core.domain.usecase
|
package io.clawdroid.core.domain.usecase
|
||||||
|
|
||||||
import io.picoclaw.android.core.domain.repository.ChatRepository
|
import io.clawdroid.core.domain.repository.ChatRepository
|
||||||
import kotlinx.coroutines.flow.StateFlow
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
|
|
||||||
class ObserveStatusUseCase(private val repository: ChatRepository) {
|
class ObserveStatusUseCase(private val repository: ChatRepository) {
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
package io.picoclaw.android.core.domain.usecase
|
package io.clawdroid.core.domain.usecase
|
||||||
|
|
||||||
import io.picoclaw.android.core.domain.model.ImageAttachment
|
import io.clawdroid.core.domain.model.ImageAttachment
|
||||||
import io.picoclaw.android.core.domain.repository.ChatRepository
|
import io.clawdroid.core.domain.repository.ChatRepository
|
||||||
|
|
||||||
class SendMessageUseCase(private val repository: ChatRepository) {
|
class SendMessageUseCase(private val repository: ChatRepository) {
|
||||||
suspend operator fun invoke(text: String, images: List<ImageAttachment> = emptyList(), inputMode: String? = null) {
|
suspend operator fun invoke(text: String, images: List<ImageAttachment> = emptyList(), inputMode: String? = null) {
|
||||||
|
|
@ -4,7 +4,7 @@ plugins {
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
namespace = "io.picoclaw.android.core.ui"
|
namespace = "io.clawdroid.core.ui"
|
||||||
compileSdk = libs.versions.android.compileSdk.get().toInt()
|
compileSdk = libs.versions.android.compileSdk.get().toInt()
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.core.ui.theme
|
package io.clawdroid.core.ui.theme
|
||||||
|
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.core.ui.theme
|
package io.clawdroid.core.ui.theme
|
||||||
|
|
||||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
|
@ -38,7 +38,7 @@ private val FuturisticShapes = Shapes(
|
||||||
)
|
)
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun PicoClawTheme(
|
fun ClawDroidTheme(
|
||||||
content: @Composable () -> Unit
|
content: @Composable () -> Unit
|
||||||
) {
|
) {
|
||||||
MaterialTheme(
|
MaterialTheme(
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.core.ui.theme
|
package io.clawdroid.core.ui.theme
|
||||||
|
|
||||||
import androidx.compose.material3.Typography
|
import androidx.compose.material3.Typography
|
||||||
import androidx.compose.ui.text.TextStyle
|
import androidx.compose.ui.text.TextStyle
|
||||||
|
|
@ -4,7 +4,7 @@ plugins {
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
namespace = "io.picoclaw.android.feature.chat"
|
namespace = "io.clawdroid.feature.chat"
|
||||||
compileSdk = libs.versions.android.compileSdk.get().toInt()
|
compileSdk = libs.versions.android.compileSdk.get().toInt()
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package io.picoclaw.android.feature.chat
|
package io.clawdroid.feature.chat
|
||||||
|
|
||||||
import io.picoclaw.android.core.domain.model.ImageAttachment
|
import io.clawdroid.core.domain.model.ImageAttachment
|
||||||
|
|
||||||
sealed interface ChatEvent {
|
sealed interface ChatEvent {
|
||||||
data class OnInputChanged(val text: String) : ChatEvent
|
data class OnInputChanged(val text: String) : ChatEvent
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
package io.picoclaw.android.feature.chat
|
package io.clawdroid.feature.chat
|
||||||
|
|
||||||
import io.picoclaw.android.core.domain.model.ChatMessage
|
import io.clawdroid.core.domain.model.ChatMessage
|
||||||
import io.picoclaw.android.core.domain.model.ConnectionState
|
import io.clawdroid.core.domain.model.ConnectionState
|
||||||
import io.picoclaw.android.core.domain.model.ImageAttachment
|
import io.clawdroid.core.domain.model.ImageAttachment
|
||||||
import io.picoclaw.android.feature.chat.voice.VoiceModeState
|
import io.clawdroid.feature.chat.voice.VoiceModeState
|
||||||
|
|
||||||
data class ChatUiState(
|
data class ChatUiState(
|
||||||
val messages: List<ChatMessage> = emptyList(),
|
val messages: List<ChatMessage> = emptyList(),
|
||||||
|
|
@ -1,15 +1,15 @@
|
||||||
package io.picoclaw.android.feature.chat
|
package io.clawdroid.feature.chat
|
||||||
|
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import io.picoclaw.android.core.domain.usecase.ConnectChatUseCase
|
import io.clawdroid.core.domain.usecase.ConnectChatUseCase
|
||||||
import io.picoclaw.android.core.domain.usecase.DisconnectChatUseCase
|
import io.clawdroid.core.domain.usecase.DisconnectChatUseCase
|
||||||
import io.picoclaw.android.core.domain.usecase.LoadMoreMessagesUseCase
|
import io.clawdroid.core.domain.usecase.LoadMoreMessagesUseCase
|
||||||
import io.picoclaw.android.core.domain.usecase.ObserveConnectionUseCase
|
import io.clawdroid.core.domain.usecase.ObserveConnectionUseCase
|
||||||
import io.picoclaw.android.core.domain.usecase.ObserveMessagesUseCase
|
import io.clawdroid.core.domain.usecase.ObserveMessagesUseCase
|
||||||
import io.picoclaw.android.core.domain.usecase.ObserveStatusUseCase
|
import io.clawdroid.core.domain.usecase.ObserveStatusUseCase
|
||||||
import io.picoclaw.android.core.domain.usecase.SendMessageUseCase
|
import io.clawdroid.core.domain.usecase.SendMessageUseCase
|
||||||
import io.picoclaw.android.feature.chat.voice.VoiceModeManager
|
import io.clawdroid.feature.chat.voice.VoiceModeManager
|
||||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlinx.coroutines.flow.StateFlow
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
package io.picoclaw.android.feature.chat
|
package io.clawdroid.feature.chat
|
||||||
|
|
||||||
import io.picoclaw.android.core.domain.model.TtsConfig
|
import io.clawdroid.core.domain.model.TtsConfig
|
||||||
import io.picoclaw.android.core.domain.model.TtsEngineInfo
|
import io.clawdroid.core.domain.model.TtsEngineInfo
|
||||||
import io.picoclaw.android.core.domain.model.TtsVoiceInfo
|
import io.clawdroid.core.domain.model.TtsVoiceInfo
|
||||||
|
|
||||||
data class SettingsUiState(
|
data class SettingsUiState(
|
||||||
val ttsConfig: TtsConfig = TtsConfig(),
|
val ttsConfig: TtsConfig = TtsConfig(),
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
package io.picoclaw.android.feature.chat
|
package io.clawdroid.feature.chat
|
||||||
|
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import io.picoclaw.android.core.domain.repository.TtsCatalogRepository
|
import io.clawdroid.core.domain.repository.TtsCatalogRepository
|
||||||
import io.picoclaw.android.core.domain.repository.TtsSettingsRepository
|
import io.clawdroid.core.domain.repository.TtsSettingsRepository
|
||||||
import io.picoclaw.android.feature.chat.voice.TextToSpeechWrapper
|
import io.clawdroid.feature.chat.voice.TextToSpeechWrapper
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlinx.coroutines.flow.StateFlow
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
import kotlinx.coroutines.flow.asStateFlow
|
import kotlinx.coroutines.flow.asStateFlow
|
||||||
|
|
@ -1,19 +1,19 @@
|
||||||
package io.picoclaw.android.feature.chat.assistant
|
package io.clawdroid.feature.chat.assistant
|
||||||
|
|
||||||
import android.content.ContentResolver
|
import android.content.ContentResolver
|
||||||
import android.speech.SpeechRecognizer
|
import android.speech.SpeechRecognizer
|
||||||
import android.util.Base64
|
import android.util.Base64
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import io.picoclaw.android.core.domain.model.AssistantMessage
|
import io.clawdroid.core.domain.model.AssistantMessage
|
||||||
import io.picoclaw.android.core.domain.model.VoicePhase
|
import io.clawdroid.core.domain.model.VoicePhase
|
||||||
import io.picoclaw.android.core.domain.repository.AssistantConnection
|
import io.clawdroid.core.domain.repository.AssistantConnection
|
||||||
import io.picoclaw.android.feature.chat.voice.CameraCaptureManager
|
import io.clawdroid.feature.chat.voice.CameraCaptureManager
|
||||||
import io.picoclaw.android.feature.chat.voice.ScreenCaptureManager
|
import io.clawdroid.feature.chat.voice.ScreenCaptureManager
|
||||||
import io.picoclaw.android.feature.chat.voice.SpeechRecognizerWrapper
|
import io.clawdroid.feature.chat.voice.SpeechRecognizerWrapper
|
||||||
import io.picoclaw.android.feature.chat.voice.SttResult
|
import io.clawdroid.feature.chat.voice.SttResult
|
||||||
import io.picoclaw.android.feature.chat.voice.TextToSpeechWrapper
|
import io.clawdroid.feature.chat.voice.TextToSpeechWrapper
|
||||||
import io.picoclaw.android.feature.chat.voice.ChatTurn
|
import io.clawdroid.feature.chat.voice.ChatTurn
|
||||||
import io.picoclaw.android.feature.chat.voice.VoiceModeState
|
import io.clawdroid.feature.chat.voice.VoiceModeState
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.feature.chat.assistant
|
package io.clawdroid.feature.chat.assistant
|
||||||
|
|
||||||
import androidx.camera.view.PreviewView
|
import androidx.camera.view.PreviewView
|
||||||
import androidx.camera.view.PreviewView.ImplementationMode
|
import androidx.camera.view.PreviewView.ImplementationMode
|
||||||
|
|
@ -53,13 +53,13 @@ import androidx.compose.ui.text.style.TextOverflow
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.compose.ui.viewinterop.AndroidView
|
import androidx.compose.ui.viewinterop.AndroidView
|
||||||
import androidx.lifecycle.compose.LocalLifecycleOwner
|
import androidx.lifecycle.compose.LocalLifecycleOwner
|
||||||
import io.picoclaw.android.core.domain.model.VoicePhase
|
import io.clawdroid.core.domain.model.VoicePhase
|
||||||
import io.picoclaw.android.core.ui.theme.GradientCyan
|
import io.clawdroid.core.ui.theme.GradientCyan
|
||||||
import io.picoclaw.android.core.ui.theme.TextPrimary
|
import io.clawdroid.core.ui.theme.TextPrimary
|
||||||
import io.picoclaw.android.core.ui.theme.TextSecondary
|
import io.clawdroid.core.ui.theme.TextSecondary
|
||||||
import io.picoclaw.android.feature.chat.voice.CameraCaptureManager
|
import io.clawdroid.feature.chat.voice.CameraCaptureManager
|
||||||
import io.picoclaw.android.feature.chat.voice.ChatTurn
|
import io.clawdroid.feature.chat.voice.ChatTurn
|
||||||
import io.picoclaw.android.feature.chat.voice.VoiceModeState
|
import io.clawdroid.feature.chat.voice.VoiceModeState
|
||||||
import com.composables.icons.lucide.R as LucideR
|
import com.composables.icons.lucide.R as LucideR
|
||||||
import kotlin.math.PI
|
import kotlin.math.PI
|
||||||
import kotlin.math.sin
|
import kotlin.math.sin
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.feature.chat.component
|
package io.clawdroid.feature.chat.component
|
||||||
|
|
||||||
import androidx.compose.animation.AnimatedVisibility
|
import androidx.compose.animation.AnimatedVisibility
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
|
|
@ -14,9 +14,9 @@ import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.compose.ui.unit.sp
|
import androidx.compose.ui.unit.sp
|
||||||
import io.picoclaw.android.core.domain.model.ConnectionState
|
import io.clawdroid.core.domain.model.ConnectionState
|
||||||
import io.picoclaw.android.core.ui.theme.DisconnectedRed
|
import io.clawdroid.core.ui.theme.DisconnectedRed
|
||||||
import io.picoclaw.android.core.ui.theme.ReconnectingYellow
|
import io.clawdroid.core.ui.theme.ReconnectingYellow
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun ConnectionBanner(
|
fun ConnectionBanner(
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.feature.chat.component
|
package io.clawdroid.feature.chat.component
|
||||||
|
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import androidx.compose.foundation.border
|
import androidx.compose.foundation.border
|
||||||
|
|
@ -19,9 +19,9 @@ import androidx.compose.ui.layout.ContentScale
|
||||||
import androidx.compose.ui.res.painterResource
|
import androidx.compose.ui.res.painterResource
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import coil3.compose.AsyncImage
|
import coil3.compose.AsyncImage
|
||||||
import io.picoclaw.android.core.domain.model.ImageAttachment
|
import io.clawdroid.core.domain.model.ImageAttachment
|
||||||
import io.picoclaw.android.core.ui.theme.GlassBorder
|
import io.clawdroid.core.ui.theme.GlassBorder
|
||||||
import io.picoclaw.android.core.ui.theme.TextSecondary
|
import io.clawdroid.core.ui.theme.TextSecondary
|
||||||
import com.composables.icons.lucide.R as LucideR
|
import com.composables.icons.lucide.R as LucideR
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.feature.chat.component
|
package io.clawdroid.feature.chat.component
|
||||||
|
|
||||||
import androidx.compose.foundation.BorderStroke
|
import androidx.compose.foundation.BorderStroke
|
||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.Box
|
||||||
|
|
@ -23,13 +23,13 @@ import coil3.compose.AsyncImage
|
||||||
import com.mikepenz.markdown.m3.Markdown
|
import com.mikepenz.markdown.m3.Markdown
|
||||||
import com.mikepenz.markdown.m3.markdownColor
|
import com.mikepenz.markdown.m3.markdownColor
|
||||||
import com.mikepenz.markdown.m3.markdownTypography
|
import com.mikepenz.markdown.m3.markdownTypography
|
||||||
import io.picoclaw.android.core.domain.model.ChatMessage
|
import io.clawdroid.core.domain.model.ChatMessage
|
||||||
import io.picoclaw.android.core.domain.model.MessageSender
|
import io.clawdroid.core.domain.model.MessageSender
|
||||||
import io.picoclaw.android.core.ui.theme.AgentBubble
|
import io.clawdroid.core.ui.theme.AgentBubble
|
||||||
import io.picoclaw.android.core.ui.theme.AgentBubbleBorder
|
import io.clawdroid.core.ui.theme.AgentBubbleBorder
|
||||||
import io.picoclaw.android.core.ui.theme.TextPrimary
|
import io.clawdroid.core.ui.theme.TextPrimary
|
||||||
import io.picoclaw.android.core.ui.theme.UserBubble
|
import io.clawdroid.core.ui.theme.UserBubble
|
||||||
import io.picoclaw.android.core.ui.theme.UserBubbleBorder
|
import io.clawdroid.core.ui.theme.UserBubbleBorder
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.feature.chat.component
|
package io.clawdroid.feature.chat.component
|
||||||
|
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
import androidx.compose.foundation.border
|
import androidx.compose.foundation.border
|
||||||
|
|
@ -22,13 +22,13 @@ import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.res.painterResource
|
import androidx.compose.ui.res.painterResource
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import io.picoclaw.android.core.ui.theme.DeepBlack
|
import io.clawdroid.core.ui.theme.DeepBlack
|
||||||
import io.picoclaw.android.core.ui.theme.GlassBorder
|
import io.clawdroid.core.ui.theme.GlassBorder
|
||||||
import io.picoclaw.android.core.ui.theme.GlassWhite
|
import io.clawdroid.core.ui.theme.GlassWhite
|
||||||
import io.picoclaw.android.core.ui.theme.NeonCyan
|
import io.clawdroid.core.ui.theme.NeonCyan
|
||||||
import io.picoclaw.android.core.ui.theme.TextPrimary
|
import io.clawdroid.core.ui.theme.TextPrimary
|
||||||
import io.picoclaw.android.core.ui.theme.TextSecondary
|
import io.clawdroid.core.ui.theme.TextSecondary
|
||||||
import io.picoclaw.android.core.ui.theme.TextTertiary
|
import io.clawdroid.core.ui.theme.TextTertiary
|
||||||
import com.composables.icons.lucide.R as LucideR
|
import com.composables.icons.lucide.R as LucideR
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.feature.chat.component
|
package io.clawdroid.feature.chat.component
|
||||||
|
|
||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.Box
|
||||||
import androidx.compose.foundation.layout.PaddingValues
|
import androidx.compose.foundation.layout.PaddingValues
|
||||||
|
|
@ -13,7 +13,7 @@ import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import io.picoclaw.android.core.domain.model.ChatMessage
|
import io.clawdroid.core.domain.model.ChatMessage
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun MessageList(
|
fun MessageList(
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.feature.chat.component
|
package io.clawdroid.feature.chat.component
|
||||||
|
|
||||||
import androidx.compose.animation.AnimatedVisibility
|
import androidx.compose.animation.AnimatedVisibility
|
||||||
import androidx.compose.animation.fadeIn
|
import androidx.compose.animation.fadeIn
|
||||||
|
|
@ -16,8 +16,8 @@ import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import io.picoclaw.android.core.ui.theme.NeonCyan
|
import io.clawdroid.core.ui.theme.NeonCyan
|
||||||
import io.picoclaw.android.core.ui.theme.TextSecondary
|
import io.clawdroid.core.ui.theme.TextSecondary
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun StatusIndicator(
|
fun StatusIndicator(
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.feature.chat.screen
|
package io.clawdroid.feature.chat.screen
|
||||||
|
|
||||||
import android.Manifest
|
import android.Manifest
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
|
|
@ -36,22 +36,22 @@ import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.res.painterResource
|
import androidx.compose.ui.res.painterResource
|
||||||
import androidx.core.content.FileProvider
|
import androidx.core.content.FileProvider
|
||||||
import io.picoclaw.android.core.domain.model.ImageAttachment
|
import io.clawdroid.core.domain.model.ImageAttachment
|
||||||
import io.picoclaw.android.core.ui.theme.DeepBlack
|
import io.clawdroid.core.ui.theme.DeepBlack
|
||||||
import io.picoclaw.android.core.ui.theme.GradientCyan
|
import io.clawdroid.core.ui.theme.GradientCyan
|
||||||
import io.picoclaw.android.core.ui.theme.GradientPink
|
import io.clawdroid.core.ui.theme.GradientPink
|
||||||
import io.picoclaw.android.core.ui.theme.GradientPurple
|
import io.clawdroid.core.ui.theme.GradientPurple
|
||||||
import io.picoclaw.android.core.ui.theme.TextSecondary
|
import io.clawdroid.core.ui.theme.TextSecondary
|
||||||
import io.picoclaw.android.feature.chat.ChatEvent
|
import io.clawdroid.feature.chat.ChatEvent
|
||||||
import io.picoclaw.android.feature.chat.ChatViewModel
|
import io.clawdroid.feature.chat.ChatViewModel
|
||||||
import com.composables.icons.lucide.R as LucideR
|
import com.composables.icons.lucide.R as LucideR
|
||||||
import io.picoclaw.android.feature.chat.component.ConnectionBanner
|
import io.clawdroid.feature.chat.component.ConnectionBanner
|
||||||
import io.picoclaw.android.feature.chat.component.ImagePreviewRow
|
import io.clawdroid.feature.chat.component.ImagePreviewRow
|
||||||
import io.picoclaw.android.feature.chat.component.MessageInput
|
import io.clawdroid.feature.chat.component.MessageInput
|
||||||
import io.picoclaw.android.feature.chat.component.MessageList
|
import io.clawdroid.feature.chat.component.MessageList
|
||||||
import io.picoclaw.android.feature.chat.component.StatusIndicator
|
import io.clawdroid.feature.chat.component.StatusIndicator
|
||||||
import io.picoclaw.android.feature.chat.voice.CameraCaptureManager
|
import io.clawdroid.feature.chat.voice.CameraCaptureManager
|
||||||
import io.picoclaw.android.feature.chat.voice.VoiceModeOverlay
|
import io.clawdroid.feature.chat.voice.VoiceModeOverlay
|
||||||
import org.koin.androidx.compose.koinViewModel
|
import org.koin.androidx.compose.koinViewModel
|
||||||
import org.koin.compose.koinInject
|
import org.koin.compose.koinInject
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
@ -227,7 +227,7 @@ fun ChatScreen(
|
||||||
containerColor = Color.Transparent,
|
containerColor = Color.Transparent,
|
||||||
topBar = {
|
topBar = {
|
||||||
TopAppBar(
|
TopAppBar(
|
||||||
title = { Text("PicoClaw") },
|
title = { Text("ClawDroid") },
|
||||||
colors = TopAppBarDefaults.topAppBarColors(
|
colors = TopAppBarDefaults.topAppBarColors(
|
||||||
containerColor = Color.Transparent
|
containerColor = Color.Transparent
|
||||||
),
|
),
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.feature.chat.screen
|
package io.clawdroid.feature.chat.screen
|
||||||
|
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
|
|
@ -41,18 +41,18 @@ import androidx.compose.ui.graphics.Brush
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.res.painterResource
|
import androidx.compose.ui.res.painterResource
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import io.picoclaw.android.core.domain.model.TtsEngineInfo
|
import io.clawdroid.core.domain.model.TtsEngineInfo
|
||||||
import io.picoclaw.android.core.domain.model.TtsVoiceInfo
|
import io.clawdroid.core.domain.model.TtsVoiceInfo
|
||||||
import io.picoclaw.android.core.ui.theme.DeepBlack
|
import io.clawdroid.core.ui.theme.DeepBlack
|
||||||
import io.picoclaw.android.core.ui.theme.GlassBorder
|
import io.clawdroid.core.ui.theme.GlassBorder
|
||||||
import io.picoclaw.android.core.ui.theme.GlassWhite
|
import io.clawdroid.core.ui.theme.GlassWhite
|
||||||
import io.picoclaw.android.core.ui.theme.GradientCyan
|
import io.clawdroid.core.ui.theme.GradientCyan
|
||||||
import io.picoclaw.android.core.ui.theme.GradientPurple
|
import io.clawdroid.core.ui.theme.GradientPurple
|
||||||
import io.picoclaw.android.core.ui.theme.NeonCyan
|
import io.clawdroid.core.ui.theme.NeonCyan
|
||||||
import io.picoclaw.android.core.ui.theme.TextPrimary
|
import io.clawdroid.core.ui.theme.TextPrimary
|
||||||
import io.picoclaw.android.core.ui.theme.TextSecondary
|
import io.clawdroid.core.ui.theme.TextSecondary
|
||||||
import com.composables.icons.lucide.R as LucideR
|
import com.composables.icons.lucide.R as LucideR
|
||||||
import io.picoclaw.android.feature.chat.SettingsViewModel
|
import io.clawdroid.feature.chat.SettingsViewModel
|
||||||
import org.koin.androidx.compose.koinViewModel
|
import org.koin.androidx.compose.koinViewModel
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.feature.chat.voice
|
package io.clawdroid.feature.chat.voice
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
|
|
@ -9,7 +9,7 @@ import androidx.camera.lifecycle.ProcessCameraProvider
|
||||||
import androidx.camera.view.PreviewView
|
import androidx.camera.view.PreviewView
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.lifecycle.LifecycleOwner
|
import androidx.lifecycle.LifecycleOwner
|
||||||
import io.picoclaw.android.core.domain.model.ImageAttachment
|
import io.clawdroid.core.domain.model.ImageAttachment
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
package io.picoclaw.android.feature.chat.voice
|
package io.clawdroid.feature.chat.voice
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import io.picoclaw.android.core.domain.model.ImageAttachment
|
import io.clawdroid.core.domain.model.ImageAttachment
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.feature.chat.voice
|
package io.clawdroid.feature.chat.voice
|
||||||
|
|
||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.feature.chat.voice
|
package io.clawdroid.feature.chat.voice
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
package io.picoclaw.android.feature.chat.voice
|
package io.clawdroid.feature.chat.voice
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.speech.tts.TextToSpeech
|
import android.speech.tts.TextToSpeech
|
||||||
import android.speech.tts.UtteranceProgressListener
|
import android.speech.tts.UtteranceProgressListener
|
||||||
import io.picoclaw.android.core.domain.model.TtsConfig
|
import io.clawdroid.core.domain.model.TtsConfig
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.SupervisorJob
|
import kotlinx.coroutines.SupervisorJob
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
package io.picoclaw.android.feature.chat.voice
|
package io.clawdroid.feature.chat.voice
|
||||||
|
|
||||||
import android.speech.SpeechRecognizer
|
import android.speech.SpeechRecognizer
|
||||||
import io.picoclaw.android.core.domain.model.MessageSender
|
import io.clawdroid.core.domain.model.MessageSender
|
||||||
import io.picoclaw.android.core.domain.model.MessageStatus
|
import io.clawdroid.core.domain.model.MessageStatus
|
||||||
import io.picoclaw.android.core.domain.model.VoicePhase
|
import io.clawdroid.core.domain.model.VoicePhase
|
||||||
import io.picoclaw.android.core.domain.usecase.ObserveMessagesUseCase
|
import io.clawdroid.core.domain.usecase.ObserveMessagesUseCase
|
||||||
import io.picoclaw.android.core.domain.usecase.ObserveStatusUseCase
|
import io.clawdroid.core.domain.usecase.ObserveStatusUseCase
|
||||||
import io.picoclaw.android.core.domain.usecase.SendMessageUseCase
|
import io.clawdroid.core.domain.usecase.SendMessageUseCase
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.feature.chat.voice
|
package io.clawdroid.feature.chat.voice
|
||||||
|
|
||||||
import androidx.camera.view.PreviewView
|
import androidx.camera.view.PreviewView
|
||||||
import androidx.camera.view.PreviewView.ImplementationMode
|
import androidx.camera.view.PreviewView.ImplementationMode
|
||||||
|
|
@ -39,12 +39,12 @@ import androidx.compose.ui.res.painterResource
|
||||||
import androidx.compose.ui.text.style.TextAlign
|
import androidx.compose.ui.text.style.TextAlign
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.compose.ui.viewinterop.AndroidView
|
import androidx.compose.ui.viewinterop.AndroidView
|
||||||
import io.picoclaw.android.core.domain.model.VoicePhase
|
import io.clawdroid.core.domain.model.VoicePhase
|
||||||
import io.picoclaw.android.core.ui.theme.DeepBlack
|
import io.clawdroid.core.ui.theme.DeepBlack
|
||||||
import io.picoclaw.android.core.ui.theme.GradientCyan
|
import io.clawdroid.core.ui.theme.GradientCyan
|
||||||
import io.picoclaw.android.core.ui.theme.GradientPurple
|
import io.clawdroid.core.ui.theme.GradientPurple
|
||||||
import io.picoclaw.android.core.ui.theme.TextPrimary
|
import io.clawdroid.core.ui.theme.TextPrimary
|
||||||
import io.picoclaw.android.core.ui.theme.TextSecondary
|
import io.clawdroid.core.ui.theme.TextSecondary
|
||||||
import com.composables.icons.lucide.R as LucideR
|
import com.composables.icons.lucide.R as LucideR
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package io.picoclaw.android.feature.chat.voice
|
package io.clawdroid.feature.chat.voice
|
||||||
|
|
||||||
import io.picoclaw.android.core.domain.model.VoicePhase
|
import io.clawdroid.core.domain.model.VoicePhase
|
||||||
|
|
||||||
data class ChatTurn(val role: String, val text: String)
|
data class ChatTurn(val role: String, val text: String)
|
||||||
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package io.picoclaw.android.feature.chat.voice
|
package io.clawdroid.feature.chat.voice
|
||||||
|
|
||||||
import androidx.compose.animation.core.LinearEasing
|
import androidx.compose.animation.core.LinearEasing
|
||||||
import androidx.compose.animation.core.RepeatMode
|
import androidx.compose.animation.core.RepeatMode
|
||||||
|
|
@ -17,7 +17,7 @@ import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.graphics.drawscope.DrawScope
|
import androidx.compose.ui.graphics.drawscope.DrawScope
|
||||||
import androidx.compose.ui.graphics.drawscope.Stroke
|
import androidx.compose.ui.graphics.drawscope.Stroke
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import io.picoclaw.android.core.domain.model.VoicePhase
|
import io.clawdroid.core.domain.model.VoicePhase
|
||||||
import kotlin.math.PI
|
import kotlin.math.PI
|
||||||
import kotlin.math.cos
|
import kotlin.math.cos
|
||||||
import kotlin.math.sin
|
import kotlin.math.sin
|
||||||
|
|
@ -12,7 +12,7 @@ dependencyResolutionManagement {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rootProject.name = "PicoClaw"
|
rootProject.name = "ClawDroid"
|
||||||
include(":app")
|
include(":app")
|
||||||
include(":feature:chat")
|
include(":feature:chat")
|
||||||
include(":core:domain")
|
include(":core:domain")
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 1.5 MiB After Width: | Height: | Size: 1.5 MiB |
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue