create-walle 0.7.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/create-walle.js +10 -1
- package/package.json +1 -1
- package/template/README.md +123 -43
- package/template/bin/dev.sh +72 -0
- package/template/claude-task-manager/db.js +2 -2
- package/template/claude-task-manager/public/css/walle.css +23 -2
- package/template/claude-task-manager/public/index.html +236 -70
- package/template/claude-task-manager/public/js/walle.js +255 -48
- package/template/docs/ux-improvement-plan.md +84 -0
- package/template/package.json +5 -2
- package/template/wall-e/agent.js +4 -58
- package/template/wall-e/api-walle.js +131 -8
- package/template/wall-e/chat.js +23 -3
- package/template/wall-e/core-tasks.js +53 -0
- package/template/wall-e/skills/_bundled/file-ingest/SKILL.md +56 -0
- package/template/wall-e/skills/_bundled/file-ingest/run.js +142 -0
- package/template/wall-e/skills/_bundled/mcp-scan/SKILL.md +14 -0
- package/template/wall-e/skills/_bundled/mcp-scan/run.js +86 -0
- package/template/wall-e/skills/_bundled/morning-briefing/run.js +2 -2
- package/template/wall-e/skills/mcp-client.js +241 -13
- package/template/wall-e/tools/local-tools.js +93 -0
package/bin/create-walle.js
CHANGED
|
@@ -288,7 +288,7 @@ function stopQuiet(dir, port) {
|
|
|
288
288
|
try { execFileSync('launchctl', ['unload', plist], { stdio: 'ignore' }); } catch {}
|
|
289
289
|
}
|
|
290
290
|
// Kill CTM and Wall-E processes
|
|
291
|
-
const wallePort = String(parseInt(port) + 1);
|
|
291
|
+
const wallePort = dir ? readWallePort(dir) : String(parseInt(port) + 1);
|
|
292
292
|
for (const p of [port, wallePort]) {
|
|
293
293
|
try {
|
|
294
294
|
const pids = execFileSync('lsof', ['-ti', ':' + p], { encoding: 'utf8', timeout: 3000 }).trim().split('\n').filter(Boolean);
|
|
@@ -454,6 +454,15 @@ function readPort(dir) {
|
|
|
454
454
|
return '3456';
|
|
455
455
|
}
|
|
456
456
|
|
|
457
|
+
function readWallePort(dir) {
|
|
458
|
+
try {
|
|
459
|
+
const env = fs.readFileSync(path.join(dir, '.env'), 'utf8');
|
|
460
|
+
const m = env.match(/^WALL_E_PORT=(\d+)/m);
|
|
461
|
+
if (m) return m[1];
|
|
462
|
+
} catch {}
|
|
463
|
+
return String(parseInt(readPort(dir)) + 1);
|
|
464
|
+
}
|
|
465
|
+
|
|
457
466
|
function detectName() {
|
|
458
467
|
try { return execFileSync('git', ['config', 'user.name'], { encoding: 'utf8' }).trim(); } catch {}
|
|
459
468
|
try { return execFileSync('id', ['-F'], { encoding: 'utf8' }).trim(); } catch {}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-walle",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Wall-E — your personal digital twin. AI agent that learns from Slack, email & calendar. Includes dashboard, chat, and 7 bundled skills.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"create-walle": "bin/create-walle.js"
|
package/template/README.md
CHANGED
|
@@ -1,34 +1,54 @@
|
|
|
1
|
-
# Wall-E
|
|
1
|
+
# Wall-E + CTM
|
|
2
2
|
|
|
3
|
-
**
|
|
3
|
+
**Wall-E** is your personal digital twin — an AI agent that learns from your Slack, email, and calendar to build a searchable second brain, answer questions in your voice, and automate daily workflows.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**CTM** (Claude Task Manager) is an agent task manager and terminal multiplexer — a web dashboard for running Claude Code sessions, managing prompts, reviewing code, and controlling Wall-E.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Together they give you a local-first AI command center: a browser-based workspace where you manage Claude Code sessions, chat with an AI that knows your work context, and automate the repetitive parts of your day.
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
- **
|
|
13
|
-
- **
|
|
9
|
+
## What You Get
|
|
10
|
+
|
|
11
|
+
### CTM — Agent Task Manager
|
|
12
|
+
- **Terminal multiplexer** — run multiple Claude Code sessions side-by-side in browser tabs, with session history, search, and replay
|
|
13
|
+
- **Prompt library** — rich-text editor with versioning, folders, tags, and one-click send to any active session
|
|
14
|
+
- **Prompt queue** — batch multiple prompts and send them sequentially to a session with idle detection
|
|
15
|
+
- **Shadow Approver** — learns your permission patterns and auto-approves safe operations across sessions
|
|
16
|
+
- **Code review** — AI-assisted diff review across projects with inline comments
|
|
17
|
+
- **Session insights** — AI analysis of your Claude Code usage with actionable recommendations
|
|
18
|
+
- **Permission manager** — fine-grained control over what Claude Code can do automatically, with risk tiers and rule consolidation
|
|
19
|
+
|
|
20
|
+
### Wall-E — Personal AI Agent
|
|
21
|
+
- **Second brain** — ingests Slack messages, calendar events, and sent emails into a local SQLite database with full-text search
|
|
22
|
+
- **Chat** — ask questions about your work, meetings, and conversations — grounded in your actual data with citations
|
|
23
|
+
- **Scheduled skills** — morning briefings, Slack sync, calendar sync, email digest, and custom skills on configurable schedules
|
|
24
|
+
- **Background tasks** — recurring or one-shot tasks with live logs, skill execution, and checkpoint/resume
|
|
25
|
+
- **Knowledge graph** — automatically extracts facts, relationships, and patterns from your data over time
|
|
26
|
+
- **People intelligence** — tracks relationships, communication patterns, trust levels, and personas
|
|
27
|
+
- **MCP integration** — calls tools on Slack, GitHub, and custom MCP servers directly from chat
|
|
28
|
+
- **macOS native** — calendar via EventKit, email via AppleScript, Spotlight file search, desktop notifications, clipboard access
|
|
14
29
|
|
|
15
30
|
## Architecture
|
|
16
31
|
|
|
17
32
|
```
|
|
18
|
-
CTM (port 3456) Wall-E
|
|
33
|
+
CTM (port 3456) Wall-E Daemon
|
|
19
34
|
+-----------------------+ +------------------------+
|
|
20
35
|
| Web Dashboard | | Agent Daemon |
|
|
21
36
|
| - Sessions (pty) | <---> | - Ingest loop (60s) |
|
|
22
37
|
| - Prompts editor | | - Think loop (120s) |
|
|
23
|
-
| -
|
|
24
|
-
| -
|
|
25
|
-
| -
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
38
|
+
| - Prompt queue | | - Reflect loop (1hr) |
|
|
39
|
+
| - Shadow Approver | | - Skills loop (5min) |
|
|
40
|
+
| - Code review | | - Tasks loop (30s) |
|
|
41
|
+
| - Session insights | | |
|
|
42
|
+
| - Permission manager | | Chat Engine |
|
|
43
|
+
| - Wall-E chat tab | | - Tool use (local+MCP)|
|
|
44
|
+
+-----------------------+ | - Memory search |
|
|
45
|
+
| | - Skill execution |
|
|
46
|
+
v +------------------------+
|
|
47
|
+
task-manager.db |
|
|
48
|
+
(sessions, prompts, v
|
|
49
|
+
rules, reviews) wall-e-brain.db
|
|
50
|
+
(memories, knowledge,
|
|
51
|
+
people, skills, tasks)
|
|
32
52
|
```
|
|
33
53
|
|
|
34
54
|
## Quickstart
|
|
@@ -39,7 +59,7 @@ cd my-agent
|
|
|
39
59
|
node claude-task-manager/server.js
|
|
40
60
|
```
|
|
41
61
|
|
|
42
|
-
Open **http://localhost:3456** — the
|
|
62
|
+
Open **http://localhost:3456** — the setup page walks you through adding your API key and connecting integrations. Your name and timezone are auto-detected.
|
|
43
63
|
|
|
44
64
|
Or clone manually:
|
|
45
65
|
|
|
@@ -52,6 +72,66 @@ node claude-task-manager/server.js
|
|
|
52
72
|
|
|
53
73
|
The first run auto-creates `.env`, `wall-e-config.json`, and `~/.walle/data/`. Finish setup at http://localhost:3456/setup.html.
|
|
54
74
|
|
|
75
|
+
## Dashboard Features
|
|
76
|
+
|
|
77
|
+
### Sessions
|
|
78
|
+
Terminal multiplexer for Claude Code — create, monitor, and manage multiple sessions from a single browser tab. Features include:
|
|
79
|
+
- Live terminal output via WebSocket (xterm.js)
|
|
80
|
+
- Session search and AI-powered search across all session history
|
|
81
|
+
- AI auto-titling for sessions
|
|
82
|
+
- Project grouping and filtering
|
|
83
|
+
- Copy session command (with working directory)
|
|
84
|
+
- Session replay and review
|
|
85
|
+
|
|
86
|
+
### Prompts
|
|
87
|
+
Rich-text prompt editor with a full formatting toolbar. Organize prompts into folders, tag them, track usage across sessions, and send to any active Claude Code session with one click.
|
|
88
|
+
- **Composite prompts** — parent prompt with sub-prompts that compose into a single message
|
|
89
|
+
- **Prompt queue** — batch multiple prompts, send sequentially with idle detection between items
|
|
90
|
+
- **Power tools** — chains (multi-step sequences), templates, pattern detection, harvest (extract prompts from session history), and AI copilot suggestions
|
|
91
|
+
- **Usage tracking** — see which sessions used which prompts and how often
|
|
92
|
+
|
|
93
|
+
### Wall-E Chat
|
|
94
|
+
Chat directly with Wall-E from the dashboard. Wall-E has access to your full brain (memories, knowledge, people) and can:
|
|
95
|
+
- Search your Slack messages, emails, and calendar
|
|
96
|
+
- Run skills on demand (morning briefing, Slack sync, etc.)
|
|
97
|
+
- Call MCP tools (Slack, GitHub, etc.)
|
|
98
|
+
- Create and manage background tasks
|
|
99
|
+
- Execute shell commands, read files, take screenshots
|
|
100
|
+
- Answer questions grounded in your actual data
|
|
101
|
+
|
|
102
|
+
Sub-tabs: Chat, Tasks (background task manager), Skills (view and run), Brain (knowledge graph), Actions, Timeline, Questions, Status.
|
|
103
|
+
|
|
104
|
+
### Shadow Approver
|
|
105
|
+
Learns your permission patterns from Claude Code sessions and auto-approves safe operations. Features:
|
|
106
|
+
- Pattern learning from your approval history
|
|
107
|
+
- AI-driven approval decisions with confidence scoring
|
|
108
|
+
- Domain-specific trust tiers (Observe, Draft, Guarded, Autonomous)
|
|
109
|
+
- Rule consolidation (merges similar Bash rules)
|
|
110
|
+
- Decision history and audit trail
|
|
111
|
+
|
|
112
|
+
### Code Review
|
|
113
|
+
AI-assisted code review across projects:
|
|
114
|
+
- Inline diff viewer
|
|
115
|
+
- Multi-project support
|
|
116
|
+
- AI review comments with confidence levels
|
|
117
|
+
- Send review to a Claude Code session for implementation
|
|
118
|
+
|
|
119
|
+
### Session Insights
|
|
120
|
+
AI analysis of your Claude Code usage patterns:
|
|
121
|
+
- Workflow recommendations (automate repetitive tasks)
|
|
122
|
+
- Prompt effectiveness analysis
|
|
123
|
+
- Skill gap detection
|
|
124
|
+
- Cost-saving suggestions
|
|
125
|
+
- Session statistics
|
|
126
|
+
|
|
127
|
+
### Permission Manager
|
|
128
|
+
Fine-grained control over what Claude Code can do automatically:
|
|
129
|
+
- Search and filter across all rules
|
|
130
|
+
- Risk-based categorization (LOW, MEDIUM, HIGH)
|
|
131
|
+
- Per-project or global scope
|
|
132
|
+
- Rule consolidation for similar patterns
|
|
133
|
+
- Import/export with Claude Code's settings files
|
|
134
|
+
|
|
55
135
|
## Configuration
|
|
56
136
|
|
|
57
137
|
All configuration lives in `.env` (auto-generated on first run). Edit directly or use the browser setup page.
|
|
@@ -84,6 +164,7 @@ If you use `devbox ai -c claude`, Wall-E auto-reads your gateway credentials fro
|
|
|
84
164
|
| `ANTHROPIC_AUTH_TOKEN` | No | Auth token when using a gateway |
|
|
85
165
|
| `ANTHROPIC_CUSTOM_HEADERS_B64` | No | Base64-encoded custom headers (Portkey virtual keys, metadata) |
|
|
86
166
|
| `WALLE_OWNER_NAME` | Auto | Your name (auto-detected from `git config`) |
|
|
167
|
+
| `WALLE_MODEL` | Auto | Model selection (probed on setup: claude-sonnet-4-6, haiku-4-5, etc.) |
|
|
87
168
|
| `CTM_PORT` | No | Dashboard port (default: `3456`) |
|
|
88
169
|
| `WALL_E_PORT` | No | Wall-E API port (default: `CTM_PORT + 1`) |
|
|
89
170
|
| `WALL_E_DATA_DIR` | No | Data directory (default: `~/.walle/data`) |
|
|
@@ -105,8 +186,9 @@ Wall-E ships with skills that run on a schedule to keep your brain up to date:
|
|
|
105
186
|
| `slack-backfill` | manual | Full Slack history backfill (2022-present) |
|
|
106
187
|
| `email-sync` | every 30m | Syncs sent emails from macOS Mail via JXA |
|
|
107
188
|
| `email-digest` | daily 7am | Summarizes recent email activity |
|
|
108
|
-
| `morning-briefing` | daily 7am | AI-generated daily briefing
|
|
189
|
+
| `morning-briefing` | daily 7am | AI-generated daily briefing: calendar, Slack activity, tasks, questions |
|
|
109
190
|
| `memory-search` | on-demand | Full-text search across all memories |
|
|
191
|
+
| `file-ingest` | manual | Read a folder of files into the brain with glob filtering |
|
|
110
192
|
|
|
111
193
|
### Creating Custom Skills
|
|
112
194
|
|
|
@@ -128,22 +210,15 @@ tags: [sync, data]
|
|
|
128
210
|
|
|
129
211
|
Place skills in `wall-e/skills/_bundled/your-skill/SKILL.md` or load from a custom directory.
|
|
130
212
|
|
|
131
|
-
##
|
|
132
|
-
|
|
133
|
-
### Sessions Tab
|
|
134
|
-
Terminal multiplexer for Claude Code — create, monitor, and manage multiple sessions from a single browser tab.
|
|
213
|
+
## Integrations
|
|
135
214
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
Chat directly with Wall-E — ask about your schedule, search your memories, run skills, and get AI-powered answers grounded in your actual data.
|
|
144
|
-
|
|
145
|
-
### Code Review Tab
|
|
146
|
-
Review code changes across projects with inline diffs and AI-assisted review.
|
|
215
|
+
| Integration | How it works | Setup |
|
|
216
|
+
|---|---|---|
|
|
217
|
+
| **Slack** | OAuth + MCP protocol for search, read, send | Click "Connect" in setup page |
|
|
218
|
+
| **Google Calendar** | macOS EventKit (reads all calendars: Google, iCloud, Outlook) | Automatic on macOS |
|
|
219
|
+
| **Email** | macOS Mail via JXA/AppleScript | Automatic on macOS |
|
|
220
|
+
| **GitHub** | MCP server (if configured in Claude Code) | Via MCP config |
|
|
221
|
+
| **Custom MCP servers** | Any MCP-compatible server | Add to MCP config |
|
|
147
222
|
|
|
148
223
|
## API
|
|
149
224
|
|
|
@@ -152,17 +227,19 @@ CTM runs on port 3456. Key endpoints:
|
|
|
152
227
|
| Method | Path | Description |
|
|
153
228
|
|---|---|---|
|
|
154
229
|
| GET | `/api/services/status` | CTM and Wall-E process status |
|
|
230
|
+
| POST | `/api/restart/ctm` | Restart CTM server |
|
|
155
231
|
| POST | `/api/restart/walle` | Restart Wall-E daemon |
|
|
156
232
|
| POST | `/api/start/walle` | Start Wall-E daemon |
|
|
157
233
|
| POST | `/api/stop/walle` | Stop Wall-E daemon |
|
|
158
|
-
| GET | `/api/wall-e/status` |
|
|
234
|
+
| GET | `/api/wall-e/status` | Brain stats, loop health, owner info |
|
|
159
235
|
| GET | `/api/wall-e/memories` | List memories (filterable by source, since, limit) |
|
|
160
236
|
| GET | `/api/wall-e/knowledge` | List knowledge entries |
|
|
161
237
|
| GET | `/api/wall-e/people` | List known people |
|
|
162
238
|
| GET | `/api/wall-e/timeline` | Memory timeline |
|
|
163
|
-
|
|
|
239
|
+
| GET | `/api/wall-e/tasks` | List background tasks |
|
|
240
|
+
| POST | `/api/wall-e/chat` | Chat with Wall-E (supports SSE streaming) |
|
|
164
241
|
| GET | `/api/prompts` | List prompts |
|
|
165
|
-
| GET | `/api/sessions` | List
|
|
242
|
+
| GET | `/api/recent-sessions` | List recent Claude Code sessions |
|
|
166
243
|
|
|
167
244
|
## Tech Stack
|
|
168
245
|
|
|
@@ -170,24 +247,27 @@ CTM runs on port 3456. Key endpoints:
|
|
|
170
247
|
- **Database**: SQLite via better-sqlite3 (WAL mode, FTS5 full-text search)
|
|
171
248
|
- **AI**: Claude API via Anthropic SDK (supports Portkey gateway)
|
|
172
249
|
- **Frontend**: Vanilla HTML/CSS/JS (no build step, no React)
|
|
250
|
+
- **Terminal**: xterm.js (frontend) + node-pty (backend)
|
|
173
251
|
- **macOS integration**: EventKit (calendar), JXA (email/AppleScript), Spotlight (file search)
|
|
174
|
-
- **Terminal**: node-pty for session management
|
|
175
252
|
|
|
176
253
|
## Development
|
|
177
254
|
|
|
178
255
|
```bash
|
|
256
|
+
# Start dev instance (doesn't affect primary on :3456)
|
|
257
|
+
bash bin/dev.sh
|
|
258
|
+
|
|
179
259
|
# Run Wall-E tests
|
|
180
260
|
cd wall-e && npm test
|
|
181
261
|
|
|
182
|
-
# Run a single test file
|
|
183
|
-
node --test tests/brain.test.js
|
|
184
|
-
|
|
185
262
|
# Run Slack backfill manually
|
|
186
263
|
node scripts/slack-backfill.js 2024-01 # single month
|
|
187
264
|
node scripts/slack-backfill.js incremental # new messages only
|
|
188
265
|
|
|
189
266
|
# Run calendar sync manually
|
|
190
267
|
node skills/_bundled/google-calendar/run.js
|
|
268
|
+
|
|
269
|
+
# Run morning briefing manually
|
|
270
|
+
node skills/_bundled/morning-briefing/run.js
|
|
191
271
|
```
|
|
192
272
|
|
|
193
273
|
## License
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Start a dev instance of CTM + Wall-E on separate ports with a DB snapshot.
|
|
3
|
+
# Primary instance stays untouched. Ctrl+C to stop.
|
|
4
|
+
#
|
|
5
|
+
# Usage:
|
|
6
|
+
# bash bin/dev.sh # Start dev instance (snapshot DBs on first run)
|
|
7
|
+
# bash bin/dev.sh --refresh # Re-copy production DBs before starting
|
|
8
|
+
# bash bin/dev.sh --fresh # Start with empty DBs
|
|
9
|
+
|
|
10
|
+
set -e
|
|
11
|
+
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
12
|
+
DEV_DIR="${WALLE_DEV_DIR:-/tmp/walle-dev}"
|
|
13
|
+
DEV_CTM_PORT="${DEV_CTM_PORT:-4000}"
|
|
14
|
+
DEV_WALLE_PORT="${DEV_WALLE_PORT:-4001}"
|
|
15
|
+
|
|
16
|
+
# Source production .env to find DB paths
|
|
17
|
+
PROD_CTM_DIR="$HOME/.walle/data"
|
|
18
|
+
PROD_WALLE_DIR="$HOME/.walle/data"
|
|
19
|
+
if [[ -f "$ROOT/.env" ]]; then
|
|
20
|
+
eval "$(grep -E '^(CTM_DATA_DIR|WALL_E_DATA_DIR)=' "$ROOT/.env" 2>/dev/null)" || true
|
|
21
|
+
[[ -n "$CTM_DATA_DIR" ]] && PROD_CTM_DIR="$CTM_DATA_DIR"
|
|
22
|
+
[[ -n "$WALL_E_DATA_DIR" ]] && PROD_WALLE_DIR="$WALL_E_DATA_DIR"
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
mkdir -p "$DEV_DIR"
|
|
26
|
+
|
|
27
|
+
# Handle flags
|
|
28
|
+
if [[ "$1" == "--fresh" ]]; then
|
|
29
|
+
echo "[dev] Starting with fresh (empty) databases"
|
|
30
|
+
rm -f "$DEV_DIR"/*.db "$DEV_DIR"/*.db-wal "$DEV_DIR"/*.db-shm
|
|
31
|
+
elif [[ "$1" == "--refresh" || ! -f "$DEV_DIR/task-manager.db" ]]; then
|
|
32
|
+
echo "[dev] Copying production databases to $DEV_DIR ..."
|
|
33
|
+
# Copy CTM DB
|
|
34
|
+
if [[ -f "$PROD_CTM_DIR/task-manager.db" ]]; then
|
|
35
|
+
cp "$PROD_CTM_DIR/task-manager.db" "$DEV_DIR/task-manager.db"
|
|
36
|
+
echo " CTM: $PROD_CTM_DIR/task-manager.db → $DEV_DIR/"
|
|
37
|
+
fi
|
|
38
|
+
# Copy Wall-E brain
|
|
39
|
+
if [[ -f "$PROD_WALLE_DIR/wall-e-brain.db" ]]; then
|
|
40
|
+
cp "$PROD_WALLE_DIR/wall-e-brain.db" "$DEV_DIR/wall-e-brain.db"
|
|
41
|
+
echo " Brain: $PROD_WALLE_DIR/wall-e-brain.db → $DEV_DIR/"
|
|
42
|
+
fi
|
|
43
|
+
# Clean WAL files (they're specific to the source process)
|
|
44
|
+
rm -f "$DEV_DIR"/*.db-wal "$DEV_DIR"/*.db-shm
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
echo ""
|
|
48
|
+
echo " Dev CTM: http://localhost:$DEV_CTM_PORT"
|
|
49
|
+
echo " Dev Wall-E: port $DEV_WALLE_PORT"
|
|
50
|
+
echo " Dev data: $DEV_DIR"
|
|
51
|
+
echo " Source: $ROOT"
|
|
52
|
+
echo ""
|
|
53
|
+
echo " Ctrl+C to stop. Primary instance on :3456 is unaffected."
|
|
54
|
+
echo ""
|
|
55
|
+
|
|
56
|
+
# Load production .env vars (API keys, etc.) but override ports and data dirs
|
|
57
|
+
export CTM_PORT="$DEV_CTM_PORT"
|
|
58
|
+
export WALL_E_PORT="$DEV_WALLE_PORT"
|
|
59
|
+
export CTM_DATA_DIR="$DEV_DIR"
|
|
60
|
+
export WALL_E_DATA_DIR="$DEV_DIR"
|
|
61
|
+
export CTM_HOST="127.0.0.1"
|
|
62
|
+
|
|
63
|
+
# Source the rest of .env (API keys, owner name, etc.)
|
|
64
|
+
if [[ -f "$ROOT/.env" ]]; then
|
|
65
|
+
set -a
|
|
66
|
+
source <(grep -v '^#' "$ROOT/.env" | grep -vE '^(CTM_PORT|WALL_E_PORT|CTM_DATA_DIR|WALL_E_DATA_DIR|CTM_HOST)=' | grep '=')
|
|
67
|
+
set +a
|
|
68
|
+
fi
|
|
69
|
+
|
|
70
|
+
# Run in foreground so Ctrl+C stops it cleanly
|
|
71
|
+
cd "$ROOT"
|
|
72
|
+
exec node claude-task-manager/server.js
|
|
@@ -1115,9 +1115,9 @@ function listSessionConversations({ search, limit, offset, hostname, allDevices
|
|
|
1115
1115
|
params.push(hostname);
|
|
1116
1116
|
}
|
|
1117
1117
|
if (search) {
|
|
1118
|
-
sql += ' AND (title LIKE ? OR first_message LIKE ? OR project_path LIKE ?)';
|
|
1118
|
+
sql += ' AND (title LIKE ? OR first_message LIKE ? OR project_path LIKE ? OR messages LIKE ?)';
|
|
1119
1119
|
const q = `%${search}%`;
|
|
1120
|
-
params.push(q, q, q);
|
|
1120
|
+
params.push(q, q, q, q);
|
|
1121
1121
|
}
|
|
1122
1122
|
sql += ' ORDER BY imported_at DESC';
|
|
1123
1123
|
if (limit) { sql += ' LIMIT ?'; params.push(limit); }
|
|
@@ -137,7 +137,7 @@
|
|
|
137
137
|
font-size: 10px; font-weight: 800; text-transform: uppercase;
|
|
138
138
|
letter-spacing: 1px; margin-bottom: 3px;
|
|
139
139
|
}
|
|
140
|
-
.walle-chat-msg-role.user { color: #
|
|
140
|
+
.walle-chat-msg-role.user { color: #94a3b8; text-transform: none; font-weight: 700; letter-spacing: 0.3px; }
|
|
141
141
|
.walle-chat-msg-role.assistant { color: #51cf66; }
|
|
142
142
|
|
|
143
143
|
/* User text — plain, tight */
|
|
@@ -555,10 +555,31 @@
|
|
|
555
555
|
margin-bottom: 4px;
|
|
556
556
|
}
|
|
557
557
|
.we-task-card-title { font-size: 13px; font-weight: 600; color: var(--accent, #60a5fa); }
|
|
558
|
-
.we-task-card-status { font-size: 11px; font-weight: 500; text-transform: uppercase; letter-spacing: 0.5px; }
|
|
558
|
+
.we-task-card-status { font-size: 11px; font-weight: 500; text-transform: uppercase; letter-spacing: 0.5px; display: inline-flex; align-items: center; gap: 5px; }
|
|
559
559
|
.we-task-card-desc { font-size: 12px; color: #999; line-height: 1.4; margin-bottom: 4px; }
|
|
560
560
|
.we-task-card-actions { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 6px; }
|
|
561
561
|
|
|
562
|
+
/* Status dots */
|
|
563
|
+
.we-status-dot { display: inline-block; width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; }
|
|
564
|
+
.we-status-dot--running { background: #228be6; animation: we-pulse 1.5s ease-in-out infinite; }
|
|
565
|
+
.we-status-dot--pending { background: #fab005; }
|
|
566
|
+
.we-status-dot--paused { background: #888; }
|
|
567
|
+
.we-status-dot--failed { background: #e03131; }
|
|
568
|
+
.we-status-dot--completed { background: #5c940d; }
|
|
569
|
+
.we-status-dot--cancelled { background: #666; }
|
|
570
|
+
@keyframes we-pulse { 0%,100% { opacity: 1; } 50% { opacity: 0.4; } }
|
|
571
|
+
|
|
572
|
+
/* Task metadata details toggle */
|
|
573
|
+
.we-task-meta-toggle { color: #555; cursor: pointer; font-size: 10px; text-decoration: underline; text-underline-offset: 2px; user-select: none; }
|
|
574
|
+
.we-task-meta-toggle:hover { color: #888; }
|
|
575
|
+
.we-task-meta-extra { display: none; }
|
|
576
|
+
.we-task-meta.we-meta-expanded .we-task-meta-extra { display: contents; }
|
|
577
|
+
|
|
578
|
+
/* Chat date separator */
|
|
579
|
+
.we-chat-date-sep { text-align: center; color: var(--fg-dim, #666); font-size: 11px; padding: 12px 0 4px; position: relative; }
|
|
580
|
+
.we-chat-date-sep::before { content: ''; position: absolute; left: 0; right: 0; top: 50%; border-top: 1px solid rgba(255,255,255,0.06); }
|
|
581
|
+
.we-chat-date-sep span { position: relative; background: var(--bg, #1a1b26); padding: 0 12px; }
|
|
582
|
+
|
|
562
583
|
/* Task live logs */
|
|
563
584
|
.we-task-log-panel {
|
|
564
585
|
margin-top: 8px;
|