feat: ClawTap v0.1.0 — initial release

Multi-adapter mobile UI for AI coding assistants.
Supports Claude Code, Codex CLI, and Gemini CLI through one interface.

Features:
- Real-time bidirectional sync via tmux + WebSocket
- Cross-AI review (send one AI's output to another for review)
- Multi-review tabs with minimize/expand
- Push notifications (PWA) with smart session-aware filtering
- Three-channel event system (hooks, file watcher, pane monitor)
- Voice input, image paste, draft persistence
- Terminal-native design (JetBrains Mono, dark theme, pixel art claw)
- CLI with --adapter flag on every command
- Zero-overhead fire-and-forget hooks
This commit is contained in:
kuannnn
2026-03-18 10:24:45 +08:00
commit 42861ea7fa
151 changed files with 33897 additions and 0 deletions
+67
View File
@@ -0,0 +1,67 @@
export type ServerMessageType =
| 'session-created' | 'session-state' | 'text-delta' | 'thinking'
| 'tool-start' | 'tool-done' | 'tool-updates' | 'message-complete'
| 'permission-request' | 'permission-dismissed' | 'history-load'
| 'turn-complete' | 'status-update' | 'mode-updated'
| 'compacting' | 'compact-done' | 'session-error' | 'session-ended'
| 'client-id' | 'pending-notifications' | 'error'
| 'review-started' | 'review-ended';
export interface ServerMessage {
type: ServerMessageType;
[key: string]: unknown;
}
export type ClientMessageType =
| 'query' | 'permission-response' | 'ask-response' | 'abort'
| 'reconnect' | 'set-permission-mode' | 'plan-response';
export interface ClientMessage {
type: ClientMessageType;
[key: string]: unknown;
}
export interface QueryOptions {
adapter?: string;
cwd?: string;
model?: string;
sessionId?: string;
permissionMode?: string;
effort?: string;
images?: string[];
clientId?: string;
}
export type PermissionBehavior = 'allow' | 'allow_session' | 'deny';
export type PermissionMode = 'default' | 'acceptEdits' | 'plan' | 'bypassPermissions';
export interface ChatMessage {
role: 'user' | 'assistant';
content: MessageContent[];
interrupted?: boolean;
plan?: string;
senderClientId?: string;
id?: string; // unique message ID
adapter?: string; // 'claude' | 'codex'
timestamp?: string; // ISO 8601
}
export type MessageContent =
| { type: 'text'; text: string }
| { type: 'tool_use'; id: string; name: string; input: Record<string, unknown> }
| { type: 'tool_result'; tool_use_id: string; content: string };
export interface ToolStatus {
name: string;
input?: Record<string, unknown>;
status: 'running' | 'success' | 'error' | 'interrupted';
result?: string;
error?: string;
}
export interface SessionStatus {
contextPercent: number;
model: string;
cost: number;
}