Skip to content
Merged

Test #1866

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
179 commits
Select commit Hold shift + click to select a range
dc037f0
fix(telegram): stop typing indicator when LLM fails or hangs
kiannidev Mar 12, 2026
a01af36
feat(logger): add custom console formatter for JSON and multiline str…
afjcjsbx Mar 12, 2026
56fb0dc
fix(claude_cli): surface stdout in error when CLI exits non-zero
securityguy Mar 13, 2026
78c9b86
added tests
afjcjsbx Mar 13, 2026
b9aaad9
refactor(media): centralize temp media dir path
alexhoshina Mar 14, 2026
1bc05e8
fix(tools): allow sandbox access to temp media files
alexhoshina Mar 14, 2026
345452f
refactor(tools): remove unused validatePath wrapper
alexhoshina Mar 14, 2026
bb1a414
fix(tools): harden whitelist path resolution
alexhoshina Mar 14, 2026
f71eaaf
fix(cron): default scheduled jobs to agent execution
alexhoshina Mar 14, 2026
5fb4b3b
feat(provider): add support for azure openai provider (#1422)
kunalk16 Mar 14, 2026
5a251b4
Merge pull request #1442 from afjcjsbx/feat/logger-stdout-formatting
afjcjsbx Mar 14, 2026
f7dd040
fix(provider/azure): lint err
alexhoshina Mar 15, 2026
96fd4e0
Merge pull request #1583 from alexhoshina/fix/#1422-lint-err
Zepan Mar 15, 2026
54f870c
feat/sec add github's dependabot to scan the lib sec.
sky5454 Mar 15, 2026
f2addff
Merge pull request #1590 from sky5454/main
Zepan Mar 15, 2026
5660b8f
fix(heartbeat): ignore untouched default template
yzxlr Mar 15, 2026
d5c2bc5
feat(tool): markdown format in output web_fetch tool
afjcjsbx Mar 15, 2026
de68688
fix lint
afjcjsbx Mar 15, 2026
71e2b63
fix: Use secure defaults for Pico channel setup and stop leaking the …
bittoby Mar 16, 2026
45c01f4
chore(deps): bump golang.org/x/oauth2 from 0.35.0 to 0.36.0 (#1596)
dependabot[bot] Mar 16, 2026
dd93630
chore(deps): bump github.com/mymmrac/telego from 1.6.0 to 1.7.0 (#1598)
dependabot[bot] Mar 16, 2026
e9d240d
chore(deps): bump github.com/caarlos0/env/v11 from 11.3.1 to 11.4.0 (…
dependabot[bot] Mar 16, 2026
2f40a8c
chore(deps): bump github.com/anthropics/anthropic-sdk-go (#1601)
dependabot[bot] Mar 16, 2026
43eb6fe
chore(deps): bump github.com/github/copilot-sdk/go from 0.1.23 to 0.1…
dependabot[bot] Mar 16, 2026
b8dfd0b
chore(deps): bump jotai from 2.18.0 to 2.18.1 in /web/frontend (#1605)
dependabot[bot] Mar 16, 2026
a93bd01
chore(deps-dev): bump @vitejs/plugin-react in /web/frontend (#1606)
dependabot[bot] Mar 16, 2026
3bf8a27
chore(deps): bump react-i18next from 16.5.4 to 16.5.8 in /web/fronten…
dependabot[bot] Mar 16, 2026
99304d1
chore(deps): bump dayjs from 1.11.19 to 1.11.20 in /web/frontend (#1608)
dependabot[bot] Mar 16, 2026
4178b2c
chore(deps): bump @tanstack/react-router in /web/frontend (#1609)
dependabot[bot] Mar 16, 2026
c806598
chore(web): upgrade eslint deps to resolve flatted vulnerability (#1629)
wj-xiao Mar 16, 2026
2f10b47
feat(credential): part1 add AES-GCM encryption, SecureStore, and onbo…
sky5454 Mar 16, 2026
4d4243b
chore(deps): bump docker/setup-buildx-action from 3 to 4 (#1595)
dependabot[bot] Mar 16, 2026
44ac304
chore(deps): bump actions/setup-node from 4 to 6 (#1597)
dependabot[bot] Mar 16, 2026
f247c3b
chore(deps): bump actions/setup-go from 5 to 6 (#1600)
dependabot[bot] Mar 16, 2026
b7b8d1e
chore(deps): bump docker/build-push-action from 6 to 7 (#1602)
dependabot[bot] Mar 16, 2026
0c94e6f
chore(deps): bump docker/login-action from 3 to 4 (#1604)
dependabot[bot] Mar 16, 2026
c513ad2
fix(web): refactor pico chat flow and fix proxied websocket URLs (#1639)
wj-xiao Mar 16, 2026
0459dec
Initial plan
argobell Mar 16, 2026
1ace296
fix: use fileEvent instead of event when appending fields for file lo…
argobell Mar 16, 2026
8fc36a4
fix(logger): mask bot tokens in 3rd-party logger output
dimonb Mar 13, 2026
64ceb5a
fix(logger): show first/last 4 chars of bot token for identification
dimonb Mar 13, 2026
2f61440
Merge pull request #1645 from dimonb/fix/mask-bot-tokens-in-logger
afjcjsbx Mar 16, 2026
dfafdf7
Merge pull request #1570 from alexhoshina/fix/cron-deliver-default-false
afjcjsbx Mar 16, 2026
79b0568
Merge pull request #1536 from alexhoshina/fix/allow-picoclaw-media-te…
afjcjsbx Mar 16, 2026
be4a33c
refactor gateway/helpers and add server.pid to health (#1646)
cytown Mar 17, 2026
fcb6986
feat(web): add configurable cron command execution settings (#1647)
wj-xiao Mar 17, 2026
8d97896
fix(providers): handle nil input in GLM series tool_use blocks
hyperwd Mar 17, 2026
cef0f28
fix(tools): normalize whitelist path checks for symlinked allowed roo…
wj-xiao Mar 17, 2026
e414234
add systray ui for all platform (#1649)
cytown Mar 17, 2026
b402888
feat(tools): add SpawnStatusTool for reporting subagent statuses (#1540)
SHINE-six Mar 17, 2026
0499cda
build: use WEB_GO for web targets and preserve backend dist directory…
wj-xiao Mar 17, 2026
8a8cc35
Merge pull request #1663 from hyperwd/fix/glm-nil-input
afjcjsbx Mar 17, 2026
1120718
fix: proxy WebSocket through web server port (#1665)
liuy Mar 17, 2026
8a44410
feat: add web gateway hot reload and polling state sync (#1684)
wj-xiao Mar 17, 2026
7b9fdae
feat(config): add exec controls and gate cron commands on exec settin…
wj-xiao Mar 17, 2026
afe22c5
bug fix: gateway should not start when gateway server is not running …
cytown Mar 17, 2026
da1fddc
docs(exec): document build tool guard limitation
Alix-007 Mar 17, 2026
174fbba
refactor(backend): add darwin no-cgo tray fallback (#1689)
wj-xiao Mar 17, 2026
3e33d10
fix(backend): add no-cgo tray fallback for darwin and freebsd (#1691)
wj-xiao Mar 17, 2026
12c0132
Remove redundant Darwin tray stub (#1694)
wj-xiao Mar 17, 2026
11a7ee5
Merge pull request #1690 from Alix-007/docs/issue-529-exec-guard-limi…
afjcjsbx Mar 17, 2026
5bc4fe4
docs: add project identity statement and normalize NanoBot capitaliza…
BeaconCat Mar 17, 2026
fcf406b
fix(config): start model round robin from the first match
Alix-007 Mar 17, 2026
b446831
feat(web): whitelist private fetch targets (#1688)
Alix-007 Mar 17, 2026
c639e2c
feat(agent): include current sender in dynamic context (#1696)
Alix-007 Mar 17, 2026
3791f06
Merge branch 'main' into feat/markdown-output-format-web-fetch
afjcjsbx Mar 17, 2026
f776611
feat(cron): refactor scheduler to event-driven model and add unit tes…
tong3jie Mar 17, 2026
9c31b0c
fix: Fixed the bug where the bus was closed and consumers had unfinis…
tong3jie Mar 17, 2026
8f46072
fix lint + error check
afjcjsbx Mar 17, 2026
13d4801
Merge branch 'main' into feat/markdown-output-format-web-fetch
afjcjsbx Mar 17, 2026
61a899c
fix(cron): update test to use OutboundChan instead of removed Subscri…
liuy Mar 17, 2026
7bf12c3
Merge pull request #1710 from liuy/fix/cron-test-subscribe-outbound
afjcjsbx Mar 17, 2026
9835e82
Merge branch 'main' into feat/markdown-output-format-web-fetch
afjcjsbx Mar 17, 2026
f901218
Merge pull request #1640 from argobell/main
afjcjsbx Mar 17, 2026
74f2a15
Merge pull request #1479 from securityguy/fix/claude-cli-error-surfacing
afjcjsbx Mar 17, 2026
513537d
Merge pull request #1702 from Alix-007/fix/issue-1153-model-round-rob…
afjcjsbx Mar 17, 2026
cefa140
Merge pull request #1622 from afjcjsbx/feat/markdown-output-format-we…
mengzhuo Mar 18, 2026
f12c09b
fix: retry on dimension failure for tg media upload (#1409)
zenixls2 Mar 18, 2026
f79469c
Add model-native search (prefer_native) for OpenAI/Codex (#1618)
dataCenter430 Mar 18, 2026
317c70a
Merge branch 'main' into fix/1323-telegram-endless-typing
kiannidev Mar 18, 2026
e6ebeae
feat(web): implement macOS app feature and file logger (#1723)
cytown Mar 18, 2026
363861c
docs: restructure READMEs and add i18n documentation (#1729)
BeaconCat Mar 18, 2026
a1e8ee5
fix(telegram): improve HTML chunking and preserve word boundaries (#1…
badgerbees Mar 18, 2026
b6c5f58
Update qrcode of wechat group (#1744)
lxowalle Mar 18, 2026
affd77f
fix for feat(web): implement macOS app feature and file logger (#1735)
cytown Mar 18, 2026
c07f5c9
refactor: centralize environment variable key constants (#1730)
dev-miro26 Mar 18, 2026
578f908
feat: Add Novita provider support (#1677)
Alex-wuhu Mar 18, 2026
3e9b7ce
fix(feishu): invalidate cached token on auth error to enable retry re…
Vast-Stars Mar 18, 2026
12f4029
feat: telegram use parse mode ModeMarkdownV2 instead of ModeHTML (#1018)
Alexandersfg4 Mar 18, 2026
54654d2
fix(anthropic): skip tool calls with empty names to prevent API error…
darrenzeng2025 Mar 18, 2026
f93d2b4
fix: Avoid failure of the main agent process due to tool call failure…
linhaolin1 Mar 18, 2026
eb86e10
fix(tools): propagate tool registry to subagents (#1711)
paoloanzn Mar 18, 2026
08f305d
feat: add IsLark field to FeishuConfig to switch between Feishu and L…
liuliqiang Mar 18, 2026
e73d9d9
feat(config): support multiple API keys for failover (#1707)
liuy Mar 18, 2026
3e2ce06
docs: add Italian language
afjcjsbx Mar 18, 2026
8a188cf
Merge pull request #1759 from afjcjsbx/docs/add-italian-language
mengzhuo Mar 19, 2026
e931756
feat(tool): overwrite flag in write_file (#1761)
afjcjsbx Mar 19, 2026
14a28ae
docs: note that workspace config files are hot-reloaded (#1747)
afjcjsbx Mar 19, 2026
2a6ade0
feat: add /reload to gateway api and command (#1725)
cytown Mar 19, 2026
a8ce992
refactor[gateway]: just reload the changed channels on reload occurre…
cytown Mar 19, 2026
828971d
Feat/qq local file upload (#1722)
alexhoshina Mar 19, 2026
310358d
Merge upstream/main into fix/1323-telegram-endless-typing
kiannidev Mar 19, 2026
440bc26
Merge remote branch fix/1323-telegram-endless-typing
kiannidev Mar 19, 2026
ff975ab
feat(tool): anti cloudflare challenge in web_fetch (#1762)
afjcjsbx Mar 19, 2026
a4b5a9e
feat(mcp): per server deferred mode (#1654)
afjcjsbx Mar 19, 2026
7673b62
feat(tool): debug tool usage via channels (#1332)
afjcjsbx Mar 19, 2026
41ebe1e
chore: Ignore the `docker/data` directory.
biisal Mar 19, 2026
9a25fad
Implement the latest long-connection mode for the WeCom AI Bot. (#1295)
neotty Mar 19, 2026
844a4ee
fix(agent): avoid process exit on exec init failure and add regressio…
Sakurapainting Mar 19, 2026
38e1fe4
fix(config): model_list inherits api_key/api_base from providers (#1786)
sliverp Mar 19, 2026
bb59518
docs: add Indonesian (Bahasa Indonesia) README translation (#1777)
putueddy Mar 19, 2026
05c65d2
fix(provider): skip empty anthropic tool names (#1772)
Alix-007 Mar 19, 2026
276a0cb
fix(agent): rebind provider after /switch model to (#1769)
Alix-007 Mar 19, 2026
9a3ca8e
feat(provider): add Alibaba Coding Plan and regional Qwen endpoints (…
adisusilayasa Mar 19, 2026
d715ff5
docs: expand bindings guide with recipes and troubleshooting (#1788)
alexhoshina Mar 19, 2026
e3cc5b1
Fix the limitation on the number of tables in cards caused by Feishu …
opcache Mar 19, 2026
75d8672
Feat/wecom aibot processing message config (#1785)
alexhoshina Mar 19, 2026
16a7da7
docs: describe how to disable "exec" tool (#1703)
MaksimSkorobogatov Mar 19, 2026
5ada0df
chore(deps): bump goreleaser/goreleaser-action from 6 to 7
dependabot[bot] Mar 19, 2026
876898f
chore(deps): bump docker/setup-qemu-action from 3 to 4
dependabot[bot] Mar 19, 2026
bd4317f
Merge pull request #1390 from kiannidev/fix/1323-telegram-endless-typing
afjcjsbx Mar 19, 2026
ffe0289
Merge pull request #1799 from sipeed/dependabot/github_actions/docker…
afjcjsbx Mar 19, 2026
71ce219
Merge pull request #1798 from sipeed/dependabot/github_actions/gorele…
afjcjsbx Mar 19, 2026
80d9a90
chore(deps): bump github.com/ergochat/irc-go from 0.5.0 to 0.6.0 (#1800)
dependabot[bot] Mar 20, 2026
77d0c67
chore(deps): bump @tabler/icons-react in /web/frontend (#1803)
dependabot[bot] Mar 20, 2026
c9ac19c
chore(deps): bump maunium.net/go/mautrix from 0.26.3 to 0.26.4 (#1805)
dependabot[bot] Mar 20, 2026
736baf2
chore(deps-dev): bump @types/node in /web/frontend (#1806)
dependabot[bot] Mar 20, 2026
8a488ee
chore(deps-dev): bump typescript-eslint in /web/frontend (#1807)
dependabot[bot] Mar 20, 2026
009a8d7
Feat/feishu card parsing (#1534)
yangwenjie1231 Mar 20, 2026
1fd6dd1
chore(deps): bump shadcn from 4.0.5 to 4.0.8 in /web/frontend (#1808)
dependabot[bot] Mar 20, 2026
cff85cf
chore(deps): bump tailwindcss from 4.2.1 to 4.2.2 in /web/frontend (#…
dependabot[bot] Mar 20, 2026
82d574e
fix(agent): separate empty-response and tool-limit fallbacks
Alix-007 Mar 20, 2026
bda18f5
chore(deps): upgrade eslint dependency chain to resolve flatted vulne…
wj-xiao Mar 20, 2026
68d182a
chore(deps): bump Go toolchain to 1.25.8 for stdlib security fixes (#…
wj-xiao Mar 20, 2026
fe87376
chore(deps): upgrade modelcontextprotocol go-sdk to v1.4.1 for securi…
wj-xiao Mar 20, 2026
998b456
Remove UI components and gateway management for picoclaw-launcher-tui
taorye Mar 10, 2026
5a199ec
feat: implement TUI configuration and user management for picoclaw-la…
taorye Mar 20, 2026
119cc2e
refactor: enhance TUI configuration and user management with improved…
taorye Mar 20, 2026
74a145c
style: apply cyberpunk theme to TUI components for enhanced visual ap…
taorye Mar 20, 2026
545b7af
feat: add model selection synchronization to main config in TUI
taorye Mar 20, 2026
7b4d5d4
feat: add channels management page and integrate into home menu
taorye Mar 20, 2026
02da117
feat: add gateway management page to TUI and integrate into home menu
taorye Mar 20, 2026
8c44597
feat: add chat functionality to home page for interactive AI sessions
taorye Mar 20, 2026
ed47d5f
feat: add onboarding command execution for non-existent config directory
taorye Mar 20, 2026
955d6e7
refactor: update interface types to use 'any' and improve code format…
taorye Mar 20, 2026
75cfee4
Merge pull request #1832 from taorye/main
taorye Mar 20, 2026
5449408
feat(pico): add pico_client outbound WebSocket channel (#1198)
amirmamaghani Mar 20, 2026
71134ba
feat(telegram): stream LLM responses via sendMessageDraft (#1101)
amirmamaghani Mar 20, 2026
0fe0582
fix: add fallback DNS resolver for Android with multi-DNS support (#1…
liqianjie Mar 20, 2026
403ceb3
docs: fix inaccuracies, add translations, and expand channel docs (#1…
BeaconCat Mar 20, 2026
100720b
Merge pull request #1818 from Alix-007/fix/issue-1815-empty-response-…
afjcjsbx Mar 20, 2026
3293220
Add configurable logger
kunalk16 Mar 21, 2026
8490084
Merge branch 'main' of https://github.com/sipeed/picoclaw into feat-c…
kunalk16 Mar 21, 2026
6148ccc
docs(feishu): note that Feishu channel does not support 32-bit device…
BeaconCat Mar 21, 2026
f35516c
Add default value for config
kunalk16 Mar 21, 2026
6508271
Merge branch 'main' of https://github.com/sipeed/picoclaw into feat-c…
kunalk16 Mar 21, 2026
92b7687
Add configurable logger
kunalk16 Mar 21, 2026
647071d
Add default value for config
kunalk16 Mar 21, 2026
4c8526d
Merge branch 'feat-configurable-logger' of https://github.com/kunalk1…
kunalk16 Mar 21, 2026
073ae48
Fix spelling
kunalk16 Mar 21, 2026
bc0be17
fix(identity): support negative integers in isNumeric for Telegram gr…
badgerbees Mar 21, 2026
ab93c23
docs: clean up README by removing duplicate sections
lc6464 Mar 21, 2026
e2e3e6d
docs: update WeChat QRCode for README
lc6464 Mar 21, 2026
f71a6ff
docs: update alt text of wechat.png with a more meaningful description
lc6464 Mar 21, 2026
5203916
feat: add agent-browser skill and Dockerfile.heavy with full runtime
amirmamaghani Mar 21, 2026
f901af8
feat(tools): add exec tool enhancement with background execution and …
liuy Mar 21, 2026
ebcd564
Revert "feat(tools): add exec tool enhancement with background execut…
yinwm Mar 21, 2026
3cd674e
Merge pull request #1865 from sipeed/revert-1752-feat/exec-tool-enhan…
yinwm Mar 21, 2026
5286464
Merge pull request #1861 from amirmamaghani/feat/agent-browser-skill-…
afjcjsbx Mar 21, 2026
7a47d7a
Merge pull request #1782 from biisal/chore/docker-data-in-gitignore
afjcjsbx Mar 21, 2026
e6ea9c4
Merge pull request #1855 from badgerbees/fix/telegram-group-id-valida…
afjcjsbx Mar 21, 2026
c0bb8d6
Merge pull request #1617 from yzxlr/codex/fix-1561-heartbeat-template…
afjcjsbx Mar 21, 2026
9107740
Merge pull request #1857 from lc6464/main
Zepan Mar 22, 2026
931eee9
Merge pull request #1853 from kunalk16/feat-configurable-logger
yinwm Mar 22, 2026
dd82794
Feat/weixin openclaw port (#1873)
huaaudio Mar 22, 2026
7eaadfd
fix(chat): preserve blank lines and add input hint
lc6464 Mar 22, 2026
2c31744
fix(qq): send long audio as file
alexhoshina Mar 22, 2026
809aef8
Merge pull request #1885 from alexhoshina/fix-1884-qq-long-audio-file…
yinwm Mar 22, 2026
2f6f25d
Merge pull request #1882 from lc6464/frontend-fix
afjcjsbx Mar 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
27 changes: 27 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
version: 2

updates:

# Go dependencies (entire repo)
- package-ecosystem: "gomod"
directory: "/"
schedule:
interval: "weekly"
labels:
- "dependencies"
- "go"

# Frontend dependencies
- package-ecosystem: "npm"
directory: "/web/frontend"
schedule:
interval: "weekly"
labels:
- "dependencies"
- "frontend"

# GitHub Actions
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
8 changes: 4 additions & 4 deletions .github/workflows/docker-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,19 +31,19 @@ jobs:

# ── Docker Buildx ─────────────────────────
- name: πŸ”§ Set up Docker Buildx
uses: docker/setup-buildx-action@v3
uses: docker/setup-buildx-action@v4

# ── Login to GHCR ─────────────────────────
- name: πŸ”‘ Login to GitHub Container Registry
uses: docker/login-action@v3
uses: docker/login-action@v4
with:
registry: ${{ env.GHCR_REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

# ── Login to Docker Hub ────────────────────
- name: πŸ”‘ Login to Docker Hub
uses: docker/login-action@v3
uses: docker/login-action@v4
with:
registry: ${{ env.DOCKERHUB_REGISTRY }}
username: ${{ secrets.DOCKERHUB_USERNAME }}
Expand All @@ -62,7 +62,7 @@ jobs:

# ── Build & Push ──────────────────────────
- name: πŸš€ Build and push Docker image
uses: docker/build-push-action@v6
uses: docker/build-push-action@v7
with:
context: .
push: true
Expand Down
12 changes: 6 additions & 6 deletions .github/workflows/nightly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,28 +48,28 @@ jobs:
go-version-file: go.mod

- name: Setup Node.js
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version: 22

- name: Setup pnpm
run: corepack enable && corepack prepare pnpm@latest --activate

- name: Set up QEMU
uses: docker/setup-qemu-action@v3
uses: docker/setup-qemu-action@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
uses: docker/setup-buildx-action@v4

- name: Login to GitHub Container Registry
uses: docker/login-action@v3
uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Login to Docker Hub
uses: docker/login-action@v3
uses: docker/login-action@v4
with:
registry: docker.io
username: ${{ secrets.DOCKERHUB_USERNAME }}
Expand All @@ -79,7 +79,7 @@ jobs:
run: git tag "${{ steps.version.outputs.version }}"

- name: Run GoReleaser
uses: goreleaser/goreleaser-action@v6
uses: goreleaser/goreleaser-action@v7
with:
distribution: goreleaser
version: ~> v2
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ jobs:
persist-credentials: false

- name: Setup Go
uses: actions/setup-go@v5
uses: actions/setup-go@v6
with:
go-version-file: go.mod

Expand Down
12 changes: 6 additions & 6 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -66,35 +66,35 @@ jobs:
go-version-file: go.mod

- name: Setup Node.js
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version: 22

- name: Setup pnpm
run: corepack enable && corepack prepare pnpm@latest --activate

- name: Set up QEMU
uses: docker/setup-qemu-action@v3
uses: docker/setup-qemu-action@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
uses: docker/setup-buildx-action@v4

- name: Login to GitHub Container Registry
uses: docker/login-action@v3
uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Login to Docker Hub
uses: docker/login-action@v3
uses: docker/login-action@v4
with:
registry: docker.io
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Run GoReleaser
uses: goreleaser/goreleaser-action@v6
uses: goreleaser/goreleaser-action@v7
with:
distribution: goreleaser
version: ~> v2
Expand Down
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,13 @@ dist/
# Windows Application Icon/Resource
*.syso

# Test telegram integration
cmd/telegram/

# Keep embedded backend dist directory placeholder in VCS
!web/backend/dist/
web/backend/dist/*
!web/backend/dist/.gitkeep


docker/data
73 changes: 45 additions & 28 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,11 @@ GIT_COMMIT=$(shell git rev-parse --short=8 HEAD 2>/dev/null || echo "dev")
BUILD_TIME=$(shell date +%FT%T%z)
GO_VERSION=$(shell $(GO) version | awk '{print $$3}')
CONFIG_PKG=github.com/sipeed/picoclaw/pkg/config
LDFLAGS=-ldflags "-X $(CONFIG_PKG).Version=$(VERSION) -X $(CONFIG_PKG).GitCommit=$(GIT_COMMIT) -X $(CONFIG_PKG).BuildTime=$(BUILD_TIME) -X $(CONFIG_PKG).GoVersion=$(GO_VERSION) -s -w"
LDFLAGS=-X $(CONFIG_PKG).Version=$(VERSION) -X $(CONFIG_PKG).GitCommit=$(GIT_COMMIT) -X $(CONFIG_PKG).BuildTime=$(BUILD_TIME) -X $(CONFIG_PKG).GoVersion=$(GO_VERSION) -s -w

# Go variables
GO?=CGO_ENABLED=0 go
WEB_GO?=$(GO)
GOFLAGS?=-v -tags stdjson

# Patch MIPS LE ELF e_flags (offset 36) for NaN2008-only kernels (e.g. Ingenic X2600).
Expand Down Expand Up @@ -79,6 +80,7 @@ ifeq ($(UNAME_S),Linux)
endif
else ifeq ($(UNAME_S),Darwin)
PLATFORM=darwin
WEB_GO=CGO_ENABLED=1 go
ifeq ($(UNAME_M),x86_64)
ARCH=amd64
else ifeq ($(UNAME_M),arm64)
Expand Down Expand Up @@ -107,7 +109,7 @@ generate:
build: generate
@echo "Building $(BINARY_NAME) for $(PLATFORM)/$(ARCH)..."
@mkdir -p $(BUILD_DIR)
@$(GO) build $(GOFLAGS) $(LDFLAGS) -o $(BINARY_PATH) ./$(CMD_DIR)
@$(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BINARY_PATH) ./$(CMD_DIR)
@echo "Build complete: $(BINARY_PATH)"
@ln -sf $(BINARY_NAME)-$(PLATFORM)-$(ARCH) $(BUILD_DIR)/$(BINARY_NAME)

Expand All @@ -119,7 +121,7 @@ build-launcher:
echo "Building frontend..."; \
cd web/frontend && pnpm install && pnpm build:backend; \
fi
@$(GO) build $(GOFLAGS) -o $(BUILD_DIR)/picoclaw-launcher-$(PLATFORM)-$(ARCH) ./web/backend
@$(WEB_GO) build $(GOFLAGS) -o $(BUILD_DIR)/picoclaw-launcher-$(PLATFORM)-$(ARCH) ./web/backend
@ln -sf picoclaw-launcher-$(PLATFORM)-$(ARCH) $(BUILD_DIR)/picoclaw-launcher
@echo "Build complete: $(BUILD_DIR)/picoclaw-launcher"

Expand All @@ -128,38 +130,38 @@ build-whatsapp-native: generate
## @echo "Building $(BINARY_NAME) with WhatsApp native for $(PLATFORM)/$(ARCH)..."
@echo "Building for multiple platforms..."
@mkdir -p $(BUILD_DIR)
GOOS=linux GOARCH=amd64 $(GO) build -tags whatsapp_native $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-amd64 ./$(CMD_DIR)
GOOS=linux GOARCH=arm GOARM=7 $(GO) build -tags whatsapp_native $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-arm ./$(CMD_DIR)
GOOS=linux GOARCH=arm64 $(GO) build -tags whatsapp_native $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-arm64 ./$(CMD_DIR)
GOOS=linux GOARCH=loong64 $(GO) build -tags whatsapp_native $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-loong64 ./$(CMD_DIR)
GOOS=linux GOARCH=riscv64 $(GO) build -tags whatsapp_native $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-riscv64 ./$(CMD_DIR)
GOOS=linux GOARCH=mipsle GOMIPS=softfloat $(GO) build -tags whatsapp_native $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-mipsle ./$(CMD_DIR)
GOOS=linux GOARCH=amd64 $(GO) build -tags whatsapp_native -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-linux-amd64 ./$(CMD_DIR)
GOOS=linux GOARCH=arm GOARM=7 $(GO) build -tags whatsapp_native -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-linux-arm ./$(CMD_DIR)
GOOS=linux GOARCH=arm64 $(GO) build -tags whatsapp_native -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-linux-arm64 ./$(CMD_DIR)
GOOS=linux GOARCH=loong64 $(GO) build -tags whatsapp_native -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-linux-loong64 ./$(CMD_DIR)
GOOS=linux GOARCH=riscv64 $(GO) build -tags whatsapp_native -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-linux-riscv64 ./$(CMD_DIR)
GOOS=linux GOARCH=mipsle GOMIPS=softfloat $(GO) build -tags whatsapp_native -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-linux-mipsle ./$(CMD_DIR)
$(call PATCH_MIPS_FLAGS,$(BUILD_DIR)/$(BINARY_NAME)-linux-mipsle)
GOOS=darwin GOARCH=arm64 $(GO) build -tags whatsapp_native $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-darwin-arm64 ./$(CMD_DIR)
GOOS=windows GOARCH=amd64 $(GO) build -tags whatsapp_native $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-windows-amd64.exe ./$(CMD_DIR)
## @$(GO) build $(GOFLAGS) -tags whatsapp_native $(LDFLAGS) -o $(BINARY_PATH) ./$(CMD_DIR)
GOOS=darwin GOARCH=arm64 $(GO) build -tags whatsapp_native -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-darwin-arm64 ./$(CMD_DIR)
GOOS=windows GOARCH=amd64 $(GO) build -tags whatsapp_native -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-windows-amd64.exe ./$(CMD_DIR)
## @$(GO) build $(GOFLAGS) -tags whatsapp_native -ldflags "$(LDFLAGS)" -o $(BINARY_PATH) ./$(CMD_DIR)
@echo "Build complete"
## @ln -sf $(BINARY_NAME)-$(PLATFORM)-$(ARCH) $(BUILD_DIR)/$(BINARY_NAME)

## build-linux-arm: Build for Linux ARMv7 (e.g. Raspberry Pi Zero 2 W 32-bit)
build-linux-arm: generate
@echo "Building for linux/arm (GOARM=7)..."
@mkdir -p $(BUILD_DIR)
GOOS=linux GOARCH=arm GOARM=7 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-arm ./$(CMD_DIR)
GOOS=linux GOARCH=arm GOARM=7 $(GO) build -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-linux-arm ./$(CMD_DIR)
@echo "Build complete: $(BUILD_DIR)/$(BINARY_NAME)-linux-arm"

## build-linux-arm64: Build for Linux ARM64 (e.g. Raspberry Pi Zero 2 W 64-bit)
build-linux-arm64: generate
@echo "Building for linux/arm64..."
@mkdir -p $(BUILD_DIR)
GOOS=linux GOARCH=arm64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-arm64 ./$(CMD_DIR)
GOOS=linux GOARCH=arm64 $(GO) build -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-linux-arm64 ./$(CMD_DIR)
@echo "Build complete: $(BUILD_DIR)/$(BINARY_NAME)-linux-arm64"

## build-linux-mipsle: Build for Linux MIPS32 LE
build-linux-mipsle: generate
@echo "Building for linux/mipsle (softfloat)..."
@mkdir -p $(BUILD_DIR)
GOOS=linux GOARCH=mipsle GOMIPS=softfloat $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-mipsle ./$(CMD_DIR)
GOOS=linux GOARCH=mipsle GOMIPS=softfloat $(GO) build -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-linux-mipsle ./$(CMD_DIR)
$(call PATCH_MIPS_FLAGS,$(BUILD_DIR)/$(BINARY_NAME)-linux-mipsle)
@echo "Build complete: $(BUILD_DIR)/$(BINARY_NAME)-linux-mipsle"

Expand All @@ -171,18 +173,18 @@ build-pi-zero: build-linux-arm build-linux-arm64
build-all: generate
@echo "Building for multiple platforms..."
@mkdir -p $(BUILD_DIR)
GOOS=linux GOARCH=amd64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-amd64 ./$(CMD_DIR)
GOOS=linux GOARCH=arm GOARM=7 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-arm ./$(CMD_DIR)
GOOS=linux GOARCH=arm64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-arm64 ./$(CMD_DIR)
GOOS=linux GOARCH=loong64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-loong64 ./$(CMD_DIR)
GOOS=linux GOARCH=riscv64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-riscv64 ./$(CMD_DIR)
GOOS=linux GOARCH=mipsle GOMIPS=softfloat $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-mipsle ./$(CMD_DIR)
GOOS=linux GOARCH=amd64 $(GO) build -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-linux-amd64 ./$(CMD_DIR)
GOOS=linux GOARCH=arm GOARM=7 $(GO) build -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-linux-arm ./$(CMD_DIR)
GOOS=linux GOARCH=arm64 $(GO) build -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-linux-arm64 ./$(CMD_DIR)
GOOS=linux GOARCH=loong64 $(GO) build -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-linux-loong64 ./$(CMD_DIR)
GOOS=linux GOARCH=riscv64 $(GO) build -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-linux-riscv64 ./$(CMD_DIR)
GOOS=linux GOARCH=mipsle GOMIPS=softfloat $(GO) build -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-linux-mipsle ./$(CMD_DIR)
$(call PATCH_MIPS_FLAGS,$(BUILD_DIR)/$(BINARY_NAME)-linux-mipsle)
GOOS=linux GOARCH=arm GOARM=7 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-armv7 ./$(CMD_DIR)
GOOS=darwin GOARCH=arm64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-darwin-arm64 ./$(CMD_DIR)
GOOS=windows GOARCH=amd64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-windows-amd64.exe ./$(CMD_DIR)
GOOS=netbsd GOARCH=amd64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-netbsd-amd64 ./$(CMD_DIR)
GOOS=netbsd GOARCH=arm64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-netbsd-arm64 ./$(CMD_DIR)
GOOS=linux GOARCH=arm GOARM=7 $(GO) build -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-linux-armv7 ./$(CMD_DIR)
GOOS=darwin GOARCH=arm64 $(GO) build -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-darwin-arm64 ./$(CMD_DIR)
GOOS=windows GOARCH=amd64 $(GO) build -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-windows-amd64.exe ./$(CMD_DIR)
GOOS=netbsd GOARCH=amd64 $(GO) build -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-netbsd-amd64 ./$(CMD_DIR)
GOOS=netbsd GOARCH=arm64 $(GO) build -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY_NAME)-netbsd-arm64 ./$(CMD_DIR)
@echo "All builds complete"

## install: Install picoclaw to system and copy builtin skills
Expand Down Expand Up @@ -219,11 +221,14 @@ clean:

## vet: Run go vet for static analysis
vet: generate
@$(GO) vet ./...
@packages="$$(go list ./...)" && \
$(GO) vet $$(printf '%s\n' "$$packages" | grep -v '^github.com/sipeed/picoclaw/web/')
@cd web/backend && $(WEB_GO) vet ./...

## test: Test Go code
test: generate
@$(GO) test ./...
@$(GO) test $$(go list ./... | grep -v github.com/sipeed/picoclaw/web/)
@cd web && make test

## fmt: Format Go code
fmt:
Expand Down Expand Up @@ -292,6 +297,18 @@ docker-clean:
docker compose -f docker/docker-compose.full.yml down -v
docker rmi picoclaw:latest picoclaw:full 2>/dev/null || true


## build-macos-app: Build PicoClaw macOS .app bundle (no terminal window)
build-macos-app:
@echo "Building macOS .app bundle..."
@if [ "$(UNAME_S)" != "Darwin" ]; then \
echo "Error: This target is only available on macOS"; \
exit 1; \
fi
@cd web && $(MAKE) build && cd ..
@./scripts/build-macos-app.sh $(BINARY_NAME)-$(PLATFORM)-$(ARCH)
@echo "macOS .app bundle created: $(BUILD_DIR)/PicoClaw.app"

## help: Show this help message
help:
@echo "picoclaw Makefile"
Expand Down
Loading