mirror of
https://github.com/qwibitai/nanoclaw.git
synced 2026-06-12 18:11:51 +08:00
131fc99700
First default channel that ships with main. Unix-socket adapter + thin
client; plugs into the running daemon rather than spawning its own host.
## src/channels/cli.ts
- ChannelAdapter with channelType='cli', platformId='local'.
- setup() unlinks any stale socket, listens on $DATA_DIR/cli.sock (mode 0600
so only the local user can connect).
- On client connect: reads newline-delimited JSON ({"text": "..."}) and
calls config.onInbound('local', null, {id, kind:'chat', content, ts}).
- deliver() writes {"text": <body>} back to the connected socket; silently
no-ops when no client is attached (outbound row still persists).
- Single-client policy: a second connection supersedes the first with a
[superseded] notice.
- teardown() closes the client, closes the server, removes the socket file.
## scripts/chat.ts + pnpm run chat
One-shot client:
- pnpm run chat <message...>
- Connects to the socket, writes one JSON line with the message.
- Reads replies; exits 2s after the first reply lands (hard timeout 120s).
- ENOENT/ECONNREFUSED prints a hint to start the daemon.
## scripts/init-first-agent.ts
- Fix stale imports after earlier module extractions (permissions +
agent-to-agent moved their DB helpers into modules/).
- After wiring the DM channel, also create cli/local messaging_group
(unknown_sender_policy='public' — local socket perms handle auth) and
wire it to the same agent. User can `pnpm run chat` immediately.
## package.json
- Add "chat": "tsx scripts/chat.ts" script.
## Validation
- pnpm run build clean.
- pnpm test — 137 host tests pass.
- bun test in container/agent-runner — 17 pass.
- Service boot logs: "CLI channel listening" + "Channel adapter started
channel=cli type=cli". Clean SIGTERM shutdown; socket file removed.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
49 lines
1.3 KiB
JSON
49 lines
1.3 KiB
JSON
{
|
|
"name": "nanoclaw",
|
|
"version": "1.2.52",
|
|
"description": "Personal Claude assistant. Lightweight, secure, customizable.",
|
|
"type": "module",
|
|
"packageManager": "pnpm@10.33.0",
|
|
"main": "dist/index.js",
|
|
"scripts": {
|
|
"build": "tsc",
|
|
"start": "node dist/index.js",
|
|
"dev": "tsx src/index.ts",
|
|
"typecheck": "tsc --noEmit",
|
|
"format": "prettier --write \"src/**/*.ts\"",
|
|
"format:fix": "prettier --write \"src/**/*.ts\"",
|
|
"format:check": "prettier --check \"src/**/*.ts\"",
|
|
"prepare": "husky",
|
|
"setup": "tsx setup/index.ts",
|
|
"chat": "tsx scripts/chat.ts",
|
|
"auth": "tsx src/whatsapp-auth.ts",
|
|
"lint": "eslint src/",
|
|
"lint:fix": "eslint src/ --fix",
|
|
"test": "vitest run",
|
|
"test:watch": "vitest"
|
|
},
|
|
"dependencies": {
|
|
"@onecli-sh/sdk": "^0.3.1",
|
|
"better-sqlite3": "11.10.0",
|
|
"chat": "^4.24.0",
|
|
"cron-parser": "5.5.0"
|
|
},
|
|
"devDependencies": {
|
|
"@eslint/js": "^9.35.0",
|
|
"@types/better-sqlite3": "^7.6.12",
|
|
"@types/node": "^22.10.0",
|
|
"eslint": "^9.35.0",
|
|
"eslint-plugin-no-catch-all": "^1.1.0",
|
|
"globals": "^15.12.0",
|
|
"husky": "^9.1.7",
|
|
"prettier": "^3.8.1",
|
|
"tsx": "^4.19.0",
|
|
"typescript": "^5.7.0",
|
|
"typescript-eslint": "^8.35.0",
|
|
"vitest": "^4.0.18"
|
|
},
|
|
"engines": {
|
|
"node": ">=20"
|
|
}
|
|
}
|